WindowsのJenkinsSlaveから git fetch ができない

前提

  • Jenkinsサーバー・Slave共にWindows
  • gitサーバーもWindowsSSHではなくフォルダ共有でセットアップ。
  • gitリポジトリがある共有フォルダにアクセスするためのユーザー・パスワードが設定されている

Slaveを単純に追加すると認証エラー

下記ページあたりを参考にSlaveを追加する。 https://blog.engineer-memo.com/2015/06/08/windows-に-jenkins-をインストールして-windows-スレーブを追加/

git リポジトリ からソースを取得してビルドするようなジョブを追加すると、

fatal: Could not read from remote repository.

Please make sure you have the correct access rights and the repository exists. とエラーが発生する。

サービスのログオンユーザーを変更するとOK

[管理ツール]-[サービス]からJenkinsSlaveのサービスを探す。 右クリック-[プロパティ]を選択。 「ログオン」タブをクリックして、”ローカル システム アカウント”を”アカウント”に変更。 適当なユーザーを選択してパスワードを入力する。 ここで選択するユーザーは、共有フォルダへのアクセス権が必要。 ドメイン管理していなければ Windows資格情報マネージャー で設定しておく。

Visual Studio 2017 で Xamarin する(4)イベント処理

Aboutボタンの処理を書く

Activityの定義は完全にテンプレートのままで問題なかった。 AndoridプロジェクトのMainActivity → 共通のApp.xaml → 共通のMainPage.xaml のように呼び出しているようだ。 次は、イベント処理を書いてみる。

<Button
    Text="{x:Static properties:Resources.About}" 
    Clicked="About_Clicked"/>

Clicked= でイベントハンドラを追加する。適当に名前を付けて、F12キー(定義へ移動)で空の関数が作成されてナイス。

ダイアログの表示は、DisplayAlertメソッドを使うのだがこれはPageオブジェクトのメソッドだ。 FragmentMainはPageではないので、無理やり実装するとこんな感じか。

  • FragmentMain.xaml.cs
private void About_Clicked(object sender, EventArgs e)
{
    ((Page)this.Parent.Parent).DisplayAlert("About Ultimate Tic Tac Toe", "This game is...", "OK");
}

さすがにひどい。 MainPage側でコントロールのイベントをハンドルしてやればよさそう。

まず、ボタンを識別するために名前を設定する。

<Button
    x:Name="About_Button"
    Text="{x:Static properties:Resources.About}" />

親から子を識別できるように FragmentMain にも名前を設定する。

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:TicTacToe"
             x:Class="TicTacToe.MainPage">

    <Frame VerticalOptions="Center"
           HorizontalOptions="Center">
        <local:FragmentMain
            x:Name="fragment_main"/>
    </Frame>
</ContentPage>

MainPageでハンドルする

public MainPage()
{
    InitializeComponent();
    this.fragment_main.About_Button.Clicked += AboutButton_Clicked;
}

しかし、About_Buttonが見えない。「アクセスできない保護レベルになっています」と怒られる。

名前のほかに何かないかと探すと、FieldModifier といういかにもな属性がある。

<Button
    x:Name="About_Button"
    x:FieldModifier="internal"
    Text="{x:Static properties:Resources.About}" />

のように書き換えてみたが、やはりAbout_Buttonが見えない。この属性は無効っぽいのでプロパティでボタンを公開してやる

  • FragmentMain.xaml.cs
internal Button AboutButton { get { return About_Button; } }
public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        fragment_main.AboutButton.Clicked += AboutButton_Clicked;
    }

    private void AboutButton_Clicked(object sender, EventArgs e)
    {
        DisplayAlert("About Ultimate Tic Tac Toe", "This game is...", "OK");
    }
}

実行してみる

Android

f:id:foohogehoge:20170408233036p:plain:h600

UWP

f:id:foohogehoge:20170408233200p:plain:w600

タイトルが二重に表示されるのがちょっとダサい。

なんとかモノになりそうな気がしてきましたよ。

参考

Xamarin.Formsでダイアログボックス(とBusyインジケーター)を表示するには? - Build Insider

[Xamarin.Forms] x:FieldModifier が使えない? | rksoftware

x:FieldModifier — Xamarin Forums

Visual Studio 2017 で Xamarin する(3)文字列リソース

リソースファイルを作成する

初めてのAndroid 第4版を一通り読んだ後なので、先にリソースファイルを整備しておいた方が楽なのを知っている。 VisualStudioでリソースファイルを追加するのは慣れたもの。 TicTacToe(移植可能)プロジェクトのプロパティページを開いて、リソースファイルを追加する。 f:id:foohogehoge:20170408200754p:plain:w600

f:id:foohogehoge:20170408201115p:plain:w600

こんな感じになるのだが、多言語対応のために Resources.ja-JP.resx も追加しておく。 Resources.resx と Resources.ja-JP.resx の中身は以下のようにした。

f:id:foohogehoge:20170408214235p:plain:w600

f:id:foohogehoge:20170408214243p:plain:w600

アクセス修飾子をPublicにするのを忘れずに。

Xamlから使うときはこんな感じ。

<?xml version="1.0" encoding="UTF-8"?>
<StackLayout 
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:properties="clr-namespace:TicTacToe.Properties"
    x:Class="TicTacToe.FragmentMain">
    <Label
       Text="{x:Static properties:Resources.Title}"
       VerticalOptions="Start"
       HorizontalOptions="Center" />
    <Button
        Text="{x:Static properties:Resources.Continue}" />
    <Button
        Text="{x:Static properties:Resources.NewGame}" />
    <Button
        Text="{x:Static properties:Resources.About}"/>
</StackLayout>

5行目の

xmlns:properties="clr-namespace:TicTacToe.Properties"

がポイント。

実行してみる

Android

f:id:foohogehoge:20170408221552p:plain:h600

良さそうだが、エミュレーターロケールをja-JPに指定する必要があった。 エミュレーターで日本語表示する際のロケールは単に ja であるが、 ja ではアプリの日本語表示ができなかった。 Resouces.ja.resxを作成しても解決できない。 面倒くさい予感がするので後回しにする。とりあえず色や座標がリソースから指定できていればローカライズは後から何とかなる。

UWP

f:id:foohogehoge:20170408221611p:plain:w600

こちらは何の問題もない。

Visual Studio 2017 で Xamarin する(2)簡単なレイアウト

プロジェクトを作成する

Visual Studio を起動して、メニューから ファイル>新規作成>プロジェクト を選択する。 左側のツリーから、 VisualC#>Cross-Platform>クロスプラットフォームアプリを選択。

f:id:foohogehoge:20170408130328p:plain:w600

プロジェクト名はサンプルに倣って「TicTacToe」とする。

テンプレートなどの選択

自動で作成されても扱いきれないので、テンプレートは空のアプリを選択。 UIテクノロジは当然Xamarin.Forms。 コード共有方法はPCLにしてみた。理由はない。ググった結果を眺めて勘で決めた。

f:id:foohogehoge:20170408141336p:plain:w600

UWPはターゲットプラットフォームの選択ダイアログが出る。デフォルトでいく。

f:id:foohogehoge:20170408141436p:plain:w600

ほかにも「Macが見つからない」的なメッセージが出るがMacはないので無視。

自動生成後

ソリューションエクスプローラーはこんな感じ。

f:id:foohogehoge:20170408141810p:plain:h600

1つ気になったのが、UWPプロジェクトの下にあるMainPage.xaml

f:id:foohogehoge:20170408142043p:plain:w600

編集しても画面に反映されないので????な感じ。 呟いてみたら助けていただいた。ありがとうございます。

メイン画面をつくる

(移植可能)の下にあるMainPage.xamlを編集してメイン画面をつくる。デザイナーはないが、慣れればマウスでプルプルしながら配置するより楽かもしれない。 自動生成されたソースは下のようになっている。

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:TicTacToe"
             x:Class="TicTacToe.MainPage">

    <Label Text="Welcome to Xamarin Forms!" 
           VerticalOptions="Center" 
           HorizontalOptions="Center" />

</ContentPage>

Controls Reference - Xamarinで調べると、Xamarin.Formsでは一番外側の要素はPageになるらしい。 初めてのAndroid 第4版 のサンプルでは、activity_main.xmlの内側にfragent_main.xmlを配置をしている。 Xamarin.Formsにはフラグメントの概念がなさそうだが、とりあえず見た目だけ真似してみる。

fragent_main.xmlの代わりを作る

メイン画面の子要素として使うビューを作成する。

TicTacTue(移植可能)プロジェクトの下に新規Xamlファイルを作成する。 テンプレートがいろいろあるが、先ほどの調査結果からPage的なものは除外して考える。 今回は「Forms ContentView Xaml」を選択した。ファイル名は FragmentMain.xaml とする。作成直後はこんな感じになる。

<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="TicTacToe.FragmentMain">
  <ContentView.Content>
  </ContentView.Content>
</ContentView>

さて、初めてのAndroid 第4版ではLinerLayoutで定義されているが、Xamarin.Formsではどうなるのか調べてみる。 Controls Reference - Xamarinを眺めると、StackLayoutが良さそう。 下のように書き換えてみる。

<?xml version="1.0" encoding="UTF-8"?>
<StackLayout 
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="TicTacToe.FragmentMain">
</StackLayout>

と、ここでエラーが発生。

‘FragmentMain’ の partial 宣言では、異なる基底クラスを指定してはいけません。

FragmentMain.xaml.cs の基底クラスも変更しなければならないようだ。基底クラスを ContentView から StackLayout へ変更する。

namespace TicTacToe
{
    public partial class FragmentMain : StackLayout
    {
        public FragmentMain()
        {
            InitializeComponent();
        }
    }
}

あとは、テキストラベルとボタンを配置すればよい。

<?xml version="1.0" encoding="UTF-8"?>
<StackLayout 
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="TicTacToe.FragmentMain">
    <Label
       Text="Tic Tac Toe"
       VerticalOptions="Start"
       HorizontalOptions="Center" />
    <Button
        Text="CONTINUE" />
    <Button
        Text="NEW GAME" />
    <Button
        Text="ABOUT"/>
</StackLayout>

文字列部分はリソースファイルを使う予定だが、とりあえずレイアウトを確認したいので後回しにする。 見た目に関する細かいプロパティもとりあえず置いておく。

メイン画面へ組み込んでみる

いきなりでアレだが、こんな感じになる。

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:TicTacToe"
             x:Class="TicTacToe.MainPage">

    <Frame VerticalOptions="Center"
           HorizontalOptions="Center">
        <local:FragmentMain />
    </Frame>
</ContentPage>

入れ子にする方法を調べたわけではないが、補完が効いたのでたぶんあってる。

結果確認

Android

とりあえずここまでをAndroidで確認してみる。写経の時点で作成済みの Android Emulator を選択して実行する。 Android Emurator がなければ、ツール>AndroidAndroidエミュレーターマネージャーから作成する。

f:id:foohogehoge:20170408155943p:plain:w600

たまに実行できない場合があるが、ビルドをキャンセルしてリビルドしたりすればOK。

f:id:foohogehoge:20170408160543p:plain:h600

UWP

UWPは既定の構成ではAnyCPUでビルドされないのでx64を選んで実行する。

f:id:foohogehoge:20170408160800p:plain:w600

実行するとこんな感じになる。

f:id:foohogehoge:20170408160858p:plain:w600

見た目がよろしくないが、とりあえずレイアウトは確認できた。

参考

Xamarin.Formsを使った感想と困ったことなど(Android中心) - Qiita

Xamarin.Forms XAML の基本 | Xamarin : XLsoft エクセルソフト

User Interface - Xamarin

Visual Studio 2017 で Xamarin する(1)前段

前段

仕事は相変わらずWindowsFormメイン*1。 しかし、Windows10を触っているとUWPみたいなレスポンシブな感じに乗り遅れている気がしてならないので、Android開発でもしてみようと考えた。 ↓の本を買って写経してみたが、理解度がイマイチ。

初めてのAndroid 第4版

初めてのAndroid 第4版

理解度を深める+新しい技術に触る ために、この本の内容をXamarinで実装してみることにした。

開発準備

まず、大前提として写経のためにAndroidSDKToolsは導入済み。 XamarinのためにVisual Studio 2017 Community をインストールする。 適当にそれっぽいオプションを選べば大丈夫だが、下記を参考にすればベターな感じ。

ytabuchi.hatenablog.com

HelloWorld

さすがにいきなりコンバートするのも勇気がいるので肩慣らし……と思ったら去年やってた。

Visual Studio Community 2015 でAndroidアプリを作成する(Xamarin) - foohogehoge's blog

多分大丈夫なのでいきなり始めてみる。

*1:Gitを導入したのでシェルスクリプトは書くようになった

遅まきながらLINQ関連を勉強してみた

実際、仕事でもちょくちょくLINQを使ってはいるのだが
真面目に触っていないのでちょっとおさらいして自分の理解をまとめてみた。

LINQってなに?

IEnumerableに対する操作を行うExtentionメソッド。
引数に動作を決めるデリゲートをとるため柔軟な操作が可能。
IEnumerableから抽出する要素をフィルタするWhere、
抽出順序を決めるOrderBy、
抽出する要素そのものを決定するSelect などがある。
var query = from x in array select x;
のように書く「クエリ構文」と
var query = array.Select((x) => x);
のように書く「メソッド構文」がある。
メソッド構文の方が理解しやすかった。

業務基幹系は今日もVBであるのでVBで書くと
Dim query As IEnumerable(Of Something) = From x In array Select x が「クエリ構文」
Dim query As IEnumerable(Of Something) = array.Select(Function(x) x) が「メソッド構文」

雑感

要するに、シェルスクリプトのパイプ処理のように
「forを書かずに配列を処理する」
のに便利。
ループ処理が思考を妨げて本来の問題へフォーカスしにくくなるのを防ぐ効果はあると思う。
やりすぎると「シェル芸」ならぬ「LINQ芸」になりそうな予感。

MSYS2(zsh)+Git for Windowsを快適に使う

どうも補完が遅い気がしていたが、これで解決。
1.ホームディレクトリに.zshディレクトリを作成
2.Gitのインストールディレクトリ以下 mingw32\share\git\completion から git-completion.bash を .zsh へコピー
3.Gitのインストールディレクトリ以下 mingw32\share\git\completion から git-completion.zsh を _git にリネームして .zsh へコピー
4..zshrcに 以下を追記
  fpath=(~/.zsh $fpath)