WindowsのJenkinsSlaveから git fetch ができない
前提
- Jenkinsサーバー・Slave共にWindows
- gitサーバーもWindows。SSHではなくフォルダ共有でセットアップ。
- 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 のように呼び出しているようだ。 次は、イベント処理を書いてみる。
- FragmentMain.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側でコントロールのイベントをハンドルしてやればよさそう。
まず、ボタンを識別するために名前を設定する。
- FragmentMain.xaml
<Button x:Name="About_Button" Text="{x:Static properties:Resources.About}" />
親から子を識別できるように FragmentMain にも名前を設定する。
- 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"> <Frame VerticalOptions="Center" HorizontalOptions="Center"> <local:FragmentMain x:Name="fragment_main"/> </Frame> </ContentPage>
MainPageでハンドルする
- MainPage.xaml.cs
public MainPage() { InitializeComponent(); this.fragment_main.About_Button.Clicked += AboutButton_Clicked; }
しかし、About_Buttonが見えない。「アクセスできない保護レベルになっています」と怒られる。
名前のほかに何かないかと探すと、FieldModifier といういかにもな属性がある。
- FragmentMain.xaml
<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; } }
- MainPage.xaml.cs
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
UWP
タイトルが二重に表示されるのがちょっとダサい。
なんとかモノになりそうな気がしてきましたよ。
参考
Xamarin.Formsでダイアログボックス(とBusyインジケーター)を表示するには? - Build Insider
Visual Studio 2017 で Xamarin する(3)文字列リソース
リソースファイルを作成する
初めてのAndroid 第4版を一通り読んだ後なので、先にリソースファイルを整備しておいた方が楽なのを知っている。 VisualStudioでリソースファイルを追加するのは慣れたもの。 TicTacToe(移植可能)プロジェクトのプロパティページを開いて、リソースファイルを追加する。
こんな感じになるのだが、多言語対応のために Resources.ja-JP.resx も追加しておく。 Resources.resx と Resources.ja-JP.resx の中身は以下のようにした。
アクセス修飾子を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
良さそうだが、エミュレーターのロケールをja-JPに指定する必要があった。 エミュレーターで日本語表示する際のロケールは単に ja であるが、 ja ではアプリの日本語表示ができなかった。 Resouces.ja.resxを作成しても解決できない。 面倒くさい予感がするので後回しにする。とりあえず色や座標がリソースから指定できていればローカライズは後から何とかなる。
UWP
こちらは何の問題もない。
Visual Studio 2017 で Xamarin する(2)簡単なレイアウト
プロジェクトを作成する
Visual Studio を起動して、メニューから ファイル>新規作成>プロジェクト を選択する。 左側のツリーから、 VisualC#>Cross-Platform>クロスプラットフォームアプリを選択。
プロジェクト名はサンプルに倣って「TicTacToe」とする。
テンプレートなどの選択
自動で作成されても扱いきれないので、テンプレートは空のアプリを選択。 UIテクノロジは当然Xamarin.Forms。 コード共有方法はPCLにしてみた。理由はない。ググった結果を眺めて勘で決めた。
UWPはターゲットプラットフォームの選択ダイアログが出る。デフォルトでいく。
ほかにも「Macが見つからない」的なメッセージが出るがMacはないので無視。
自動生成後
ソリューションエクスプローラーはこんな感じ。
1つ気になったのが、UWPプロジェクトの下にあるMainPage.xaml。
編集しても画面に反映されないので????な感じ。 呟いてみたら助けていただいた。ありがとうございます。
@foohogehoge UWP側のはUWPのお作法の為にあるものなので、基本は共通側に手を入れていけば問題ないです
— nuits.jp (@nuits_jp) 2017年4月8日
メイン画面をつくる
(移植可能)の下にある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 がなければ、ツール>Android>Androidエミュレーターマネージャーから作成する。
たまに実行できない場合があるが、ビルドをキャンセルしてリビルドしたりすればOK。
UWP
UWPは既定の構成ではAnyCPUでビルドされないのでx64を選んで実行する。
実行するとこんな感じになる。
見た目がよろしくないが、とりあえずレイアウトは確認できた。
参考
Xamarin.Formsを使った感想と困ったことなど(Android中心) - Qiita
Visual Studio 2017 で Xamarin する(1)前段
前段
仕事は相変わらずWindowsFormメイン*1。 しかし、Windows10を触っているとUWPみたいなレスポンシブな感じに乗り遅れている気がしてならないので、Android開発でもしてみようと考えた。 ↓の本を買って写経してみたが、理解度がイマイチ。
- 作者: Ed Burnette,あんざいゆき,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/02/26
- メディア: 大型本
- この商品を含むブログを見る
理解度を深める+新しい技術に触る ために、この本の内容をXamarinで実装してみることにした。
開発準備
まず、大前提として写経のためにAndroidSDKToolsは導入済み。 XamarinのためにVisual Studio 2017 Community をインストールする。 適当にそれっぽいオプションを選べば大丈夫だが、下記を参考にすればベターな感じ。
HelloWorld
さすがにいきなりコンバートするのも勇気がいるので肩慣らし……と思ったら去年やってた。
Visual Studio Community 2015 でAndroidアプリを作成する(Xamarin) - foohogehoge's blog
多分大丈夫なのでいきなり始めてみる。
遅まきながらLINQ関連を勉強してみた
実際、仕事でもちょくちょくLINQを使ってはいるのだが
真面目に触っていないのでちょっとおさらいして自分の理解をまとめてみた。
LINQってなに?
IEnumerable
引数に動作を決めるデリゲートをとるため柔軟な操作が可能。
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芸」になりそうな予感。