読者です 読者をやめる 読者になる 読者になる

窓を作っては壊していた人のブログ

提督の窓や成績の窓を作ってました.今では適当に好き勝手に開発をしてます.

久しぶりに Windows 使って開発する時に .NET Core 周りで困ったこと

はじめに

最近(1ヶ月前ぐらい)Windowsマシンを導入しました. 今使っているMac Book ProにもVMで入れてはいたのですが,ストレージが足りずに起動が出来なくなってしまって, ある意味いい機会だということで,どうせ重い作業をするのであればリモートで繋げばいいじゃんという風に考えたのがきっかけです.

数年前まではずっとWindowsを使っていたのですが,最近の開発環境の導入とかってどうなってるの?という浦島太郎状態です. そこで自分がやったことを備忘録として挙げておきます.(インストールしたOSはWindows10)

本題の.NET Coreはまた後ほど.

最低限の開発環境導入

絶対入れるもの

必要そうなもの

とりあえずこれだけで人権が担保されました. あとは適当に何か必要になったら入れることにします.

本題の .NET Core のこと

Windows で開発したい理由はもう一つあって,自分がちょっと使ってみた GitHub - reactjs/React.NET: .NET library for JSX compilation and server-side rendering of React components

っていうライブラリがどうも macOSLinuxWindows でパスの扱いの挙動が違うという問題を解決したかったということです.

Windows というか,Visual Studio で開発することのメリットとして,Windows 環境で動いているプロセスに対してデバッグが出来て,また Docker コンテナにデプロイしてからそいつに対しても デバッグが出来るという点があります. これをすれば Windows と他の OS での挙動の違いが探れると思い実際にやってみました.

が,まずこのライブラリを動作させることに苦労するという意味の分からない展開になりました. これがタイトルに挙げた .NET Core 周りで困ったことです.

このライブラリで使用されている .NET Core の SDK のバージョンは 1.0.0-preview2-003121 です. 現在 dotnet core とかで検索して見つかるページで配布されているものは 1.0.0-preview2-003131 で,バージョンが合わず,このままだと動いてくれませんでした. で,以外と検索すると見つかりづらいといいますか,ちょっとファイル名を予想して検索したりというようなことだったり,リリース時のブログ記事から URL を探したりみたいなことをする羽目に.

また OS を再インストールした時に迷わないようなメモを残そうということで,この記事を書いたわけです.

結論:

github.com

これを見る.

やったー見つかったーこれで開発できるーーーーーー

というわけでもないんですよね. インストールしてみようとするとバージョン云々で弾かれる. どうもこの問題はリリース時に色々問題として挙がっていたようです.

対策としては DotNetCore.1.0.0-VS2015Tools.Preview2.exe SKIP_VSU_CHECK=1 みたいにフラグをつけてインストールする.

最後に

ライブラリのパス問題の PR もマージされたので良かったです. なんというか,すごくその場しのぎ感ある対策ですが,とりあえず動くのでいいでしょう(

本当の最後に,

Windows 難しい.

VSCodeでの.NETアプリ開発の知見(随時追加

VSCode ネタ

問題 - ローカル環境変数設定 - エディタ周り

状況

プログラム内で環境変数が欲しい時があって,そのプロジェクトのデバッグの時とか使う時のみで設定したい. VSCode内のTaskでsourceとかしてもデバッガ起動する時の設定のlaunch.jsonを実行するshellは別物だから環境変数が引き継がれないという問題に直面.

解決策

${workspaceRoot}/.vscode以下にsettings.jsonを追加する.そこに目的の環境変数を入れ込む.

{
 "WEB.TOKEN": "hoge",
 "WEB.KEY": "fuga"
}

launch.jsonからは

...
"env": {
 "TOKEN": "${config.WEB.TOKEN}",
 "KEY": "${config.WEB.KEY}"
},
...

問題 - tasks.jsonで色々コマンド使いたい - エディタ周り

状況

.NET のプロジェクトを読み込んで自動的に作られたtasks.jsonでbuild以外のコマンドをしたくて,buildのargs内に ; で区切ってシェルコマンドを入れたけどダメだった.

解決策

そもそもトップにあるコマンドが "command": "dotnet"だからってこと.ここをMac/Linuxユーザは"sh"とかに変えておけばいい感じだった. そしてコマンドを実行するために,その下にあるargsを "args": [ "-c" ]に変更. これで万事解決かと思いきやそうではなく,tasksの要素にsuppressTaskNameが含まれていないもしくはfalseになっている場合task名が第一引数として渡される.

 "command": "dotnet",
 "args", [],
 "tasks" : [
 {
  "taskName": "build",
  "args": [
   "${workspaceRoot}/project.json"
  ]
}

みたいになっていると,dotnet build ${workspaceRoot}/project.jsonとして実行されるということ. コマンド名と関係ないtask名をつけるのであれば,"suppressTaskName": trueとして設定するといい.

結局こんな形になった(上の環境変数を設定しようとしてダメだったやつが含まれてる)

{
    "version": "0.1.0",
    "command": "sh",
    "isShellCommand": true,
    "showOutput": "always",
    "args": [ "-c" ],
    "tasks": [
        {
            "taskName": "build",
            "suppressTaskName": true,
            "args": [
                "dotnet build ${workspaceRoot}/project.json"
            ],
            "isBuildCommand": true,
            "problemMatcher": "$msCompile"
        },
        {
            "taskName": "set-env",
            "suppressTaskName": true,
            "args": [
                "source ${workspaceRoot}/.token_env"
            ]
        }
    ]
}

問題 - yo aspnetで作られたDockerfileを使ってみたけどrestoreでこける - 開発周り

状況

2016/12/3現在yo aspnetで作られるDockerfileは以下のとおり

FROM microsoft/dotnet:latest

COPY . /app

WORKDIR /app

RUN ["dotnet", "restore"]

RUN ["dotnet", "build"]

EXPOSE 5000/tcp

CMD ["dotnet", "run", "--server.urls", "http://*:5000"]

テンプレートで吐き出されるのはバージョンが1.0.1のものだけれども,今のlatestは1.1.0なのでそのあたりでも怒られる.

解決策(正しいかは別

諦めた

FROM microsoft/aspnetcore:1.0.1

COPY ./out/ /app

WORKDIR /app

EXPOSE 80

ENTRYPOINT ["dotnet", "アプリ名.dll"]

で,このDockerfileでイメージをbuildする前にdotnet publish -c Release -o outって感じで${ProjectRoot}/out 以下に吐き出す. これでデプロイできた. Dockerとかコピペでcompose叩いてたからコマンドほとんど分からなくて疲れた

なにか詰まったら随時追加していきます.

WebSharpを触ってみた(導入編

Xamarinの強い人たちのツイートを眺めていたらこんな記述がありました.(会話の内容は省略)

なにこの見るからに面白そうなもの…ということで実際にサンプルだけでも触ってみることにしました.

そこそこ詳しくこっちに書いたのでこちらも併せてごらんください. qiita.com

追記に追記(2017年2月20日) 追記(2017年1月27日)

さて,現在開発をmacで行っているのですが,dotnet core のバージョンが 1.0.0-rc4-004616 こんな感じといいますか, project.jsonでプロジェクトを管理するのではなくcsprojで管理し始めたものになると,binding.gypとかを書き換える必要が出てきます. ちょっとdiffを用意し忘れましたが,見ればすぐわかります(雑

ちなみにそれでビルドは全部通ったのですが,スタックオーバーフロー起こしてElectronで起動できませんでした,現在原因調べてます.

予想はついてはいましたが,1.0.0-preview2-1-003177とかに戻すと動きますね…dotnet coreの最新のrc4のものをリネームしてpreview2を指すようにするという対処法で行っていますが, あまり良い方法ではないですね…

edge.jsのプロジェクトにglobal.jsonを加えてビルドするようにしたら問題ないですね.自分のフォークしたリポジトリに入れたのでそれを見ていただければと…

導入

GitHub - xamarin/WebSharp: Support for running C# on the web browser.

からリポジトリをクローンしてきて,その中のExampleをとりあえず眺めてみることに.

Pre-requisitesとして挙げられているものを確認してみると

  • Node.js
  • Native Abstractions for Node.js
  • PepperPlugin

の3つ.Electron触ったことある人ならNode.jsは入ってるだろうし問題無し.

nanはネイティブライブラリをラップしたりしてたことのある人ならば入っているだろうけど,入っていなかったらnpm i nanでインストール

最後のPepperPluginだけれども,この名前を聞くとChromeのあれかな…と勘違いしてしまう.あ,流行ってる(?)PPAPでもないです.ということで,このPepperPluginのインストールについて触れてみることにする.

リンク先に飛んでみると,

If you have never setup WebSharp before, use the make setup makefile target, this will download the dependencies for the build: Pepper SDK and NuGet:

make setup

と言われてるので大人しくmake setupを叩いてみると make: *** No rule to make target `setup'. Stop.

おいREADME!!!!!!!となるのですが,文章を見て察しろということなんでしょうね,WebSharpを一度もsetupしたことがないのであれば,と言っているので,リポジトリのルートディレクトリに行ってmake buildを叩くと無事に関連物がポンポンダウンロードされます.あとは言われた通りにmake buildを叩けば準備完了…と行きたいところですが, 私が以前に書いた Visual Studio for Macをインストールしてmono4.8+が無いと怒られた時の対処法 - Qiita を実践し,monoが4.8.0になっていた場合, mono/utils/mono-dl.hがないとか言われて怒られます.

なのでその時は

sudo ln -nfs /Library/Frameworks/Mono.framework/Versions/4.6.2 /Library/Frameworks/Mono.framework/Versions/Current

みたいにして以前のバージョンに戻してください.(この辺り.zshrcとかに関数用意しておこうかなあ…)

追記(2017年2月20日)

上記のリンクに載せたQiitaの記事に色々と対策やら考察やら書きました. とりあえずPKG_CONFIG_PATHを設定すればln -sとかをしなくて良さそうです.あとはmono 4.8.0 のバージョンを新しめの物にかえれば問題なく動作しそうですね.

あとは言われた通りに写経すれば動くはずです.動かないなーっていう人は,使われてるElectronが自分でglobalに入れたものでバージョンがあっていないとかその辺の問題だと思いますので,node_modules/.bin/electronあたりのものを使って起動しましょう.

とPepperPlugin必要なのかーという感じではありますが,機能を限れば不要でした.

というのもDotNetSamplesのサンプルを試した時はPepperPluginのインストールをしない状態で始めた時に動作していたからです. 詳しい理由とかは調べるのが めんどう たいへんなので,誰か詳しい方お願いします.

触ってみた感想としてはcsxみたいなものかーという感想です. 私はjs書くのが非常に苦手だったので,C# で書けるのはだいぶ負担が減って良いと思います(jsじゃなくてtsという選択肢もあってそっちも使ってたけど,やっぱりC# の方がいい).

すぐ試したいことはネイティブライブラリをラップしたやつでも容易に呼び出すことができるか,またReactの中に埋め込んでごにょごにょ出来るかって感じですかね.

ViewをReactで書いてモデル部をC# で書くとかごった煮感あってすごい楽しみ…Electronで使えるから,GUIアプリケーションもある意味C# で書ける環境が作られつつあるって考えてもいいんですよねやったーーー

mixi git challengeに参加してきました

経緯

今年の夏休みにもメールでgit challengeのことは知っていたけれども,クックパッドインターンに参加していて,後半まで残れるかわからなかったため参加を見送りしていたイベントでした. しかし今の時期に開催されるもので,友人から一緒に出ないと誘われ参加を決意しエントリーシートを提出したところ通ったので無事参加に至る. 通常のgitの運用だったり,OSSへのPRベースの運用でひどい運用のリポジトリを触ったことがなかったので,ぬるま湯につかった私が生き残れる現場なのかこれは...という不安でいっぱいでした.

当日

朝の新幹線に乗っていて大宮で乗り換えたら誘ってくれた友人(k君)と遭遇し,一緒に会場まで向かった. けどこういう日に限ってトラブルは起きるもので,濃霧のため電車が遅延,田舎っぺなので乗り換えの電車がわからないなどなど重なり, 結局集合時間には間に合わず,渋谷駅から会場に行くまでにも迷い,オリエンテーション開始時間ぴったりに到着しました,本当にmixiさん,参加者のみなさんごめんなさい....

会場に着いてからの感想は,ここ本当にオフィスか???というものでした,本当に綺麗(社員の人に聞いたらお客さん向け&人事とかそういう人が基本的に使う空間だったらしい). そこで簡易的なオリエンテーションを受け,なぜバージョン管理システムを利用するか,またmixiでの利用の方法についての解説を受けました.

私たちもチーム開発(SmartCampusや東北大学祭公式アプリ)でgitを活用してソース管理をしていたが,チームがでかくなったりチームの方針ではデザイナでもバージョン管理システムを使うんだなぁということを知った. まぁこの非エンジニアであるデザイナだったりがバージョン管理システムを使うというのが後々の悲劇を生むということは競技のうちに知るのであった.

お昼ごはん

最初のオリエンテーションで今からお昼ごはん,🍣🍣🍣っていうものが見えたので🍣きたあああああと思ったんですよ,思ったんですけどね... どうも今日はイチローマリナーズだかで何かしらしたやつの日らしく,それにちなんでイチローの好物である🍛でした. いや,🍛好きだからいいんだけど紛らわしいわ!!

食に命をかける系エンジニアなので結構早めに並んだのですが,ビーフ人気で私の眼の前で売り切れました,一緒にきたk君,ビーフは美味かったかい...? 私はポークを選択しましたが,結構美味かった,甘めのルゥだったなぁという印象(ビーフ,ポーク,チキン,野菜だと甘めが公約数なのかしら). 他にも野菜なりデザートなりジャガバターがあってよかった. f:id:yamachu_co:20161120121401j:plain:w400

本日メンターになった人は同じ東北大学出身で,しかも馴染みのある研究室の方でした(S研). 研究室の話で盛り上がったり,Subversionからgitになってよかったみたいな感じの話だったり,だいぶ楽しいお昼ごはんでした.

競技に関して

同じ大学から参加のk君と一緒のIチームで競技を行いました. 同じチームで開発していた(リポジトリは違うもので開発をしていたけれども)ので信頼のおける相方でした. 即興で組むとさすがにどれくらいの力量があるのか測れないので本当に相方ガチャっぽくなってしまうので,本当にチームには恵まれていたと思います.

チームの攻略方針としては,とりあえずk君は奇数番目の問題を,私は偶数番目の問題をということで問題を解き始めました. 結果的にいい選択だったんじゃないかなとは思っています(問題の出題傾向的な意味で<-検閲対象

ずっと語録を発していたりで一番 うるさい 和やかで賑やかなチームだったのではないかとう感じで,マイペースで競技を行えました. そのこともあり,問題のことについてはあまり話せないですが,頑張りました,健闘しましたとしか言えませんが,1位タイが3チームあって,結局5位でした. スコア的には3ポイント差で,私が最後の問題を通していれば表彰でした,ほんとごめん... 競技終了10秒前ぐらいにk君がpushして無事CI通った時はマジで燃えました,あいつもってるわ,マジ.

解答解説

知るかこんなコマンド. (と思ったけどクックパッドインターンでやってたことを思い出して頭を抱えた)

まず感じたのは,低級コマンド触ることがないように,ちゃんとしたgitの運用を心がけたいですね,ということ. あとforce pushで投げくんなという印象しか持たなかった. けど実際非エンジニアの入るリポジトリでは今回競技に出たクソリポジトリみたいなことが起こるらしい(最初のオリエンテーションで言ってたやつ),

けどforce pushされた時でもすーぱーえんじにあなら,はいはいこういうことねってことで直せるあたりかっこいい,ああなりたいって思いました.

今日得られた教訓としては, * git の運用に関してのルールを正しくもうけよう * これがいいらしいということではなく,正しく理解できた上で変更をかけよう * 誰かのやらかしがわかるようにCIだったりテストをできる環境を作って,常に通知させるようにしたほうがよさそう

ということでした.ローカルバックアップ強い.

懇親会

酒飲んでソシャゲのチート対策だったりテープメディアがまだ存在しているという話で盛り上がったことぐらいしか覚えてない. 琥珀エビス美味かった.f:id:yamachu_co:20161120175129j:plain:w400

帰宅

帰れてよかった,本当によかった...

実は私帰りの新幹線適当に窓口行ったら取れるだろうと思っていまして,油断していたのですが,はい,とれませんでした(自分では). JRさんDOS攻撃まがいのリロード作業してごめん,本当に指定席とりたかったんだ...となっていたのですが, 本日の相方のk君がチケットをなんとかしてモバイルページでとってくれて無事帰ることができました,20分以上連打作業に付き合ってくれて本当にありがとう,本当にありがとう. ということでこれは今k君がとってくれた新幹線の中で書いています.

おわりに

実際mixi git challengeに参加してよかったかと言われればよかったです,非常に満足のいく内容のイベントでした. 実際あんなやばいリポジトリに触れるかは別として...

あと何がよかったって,こんなにいっぱいoctcatとかのシールもらえました!!!!!!神!!!!!!!(大学から借りてるMacじゃなかったら貼ってた).

f:id:yamachu_co:20161121001433j:plain:w400

他にも強い同年代のエンジニアとの交流もあるし,こんなgitの運用があるんだ,こんなgitのコマンド,業(ワザとも読んだりゴウと読んだりもする)があるんだってことで非常に勉強になりました. 自分のこれからのgitの運用に(あんなひどいリポジトリはないと信じたいが)活かしていけるかなと思いました.

エンジニア職を目指すのであればVCSは手足のように使えて当たり前の世界ですし,是非ともこれからエンジニア職を目指して就職活動だったり, 自分のgit力を上げたいという方は是非とも参加してみてください,非常に優しい面白いメンターの方が待っています.

本当に内容が無いような感じの記事ですけど,お酒が入っているからしょうがないの,許して♡(あとやったこと書くと検閲対象になりそうだから書けない)

検閲対象に入らなければいいな

要チェックgitコマンド * git reflog * git log --pretty=formatほにゃらら

gitコマンドじゃ無いけど,簡単なshell芸出来ないのはちょっとどうかと思います(

けど優勝チームとかSourceTreeばりばり使っても普通に上位行けたので,やっぱりちゃんと使い方とどうなるかと理解すべきかなと思います,あとグラフ見て何がどうなっているのかを察して.

本当の最後に

oppai さいこー!!!!!!!!!!!

Xamarin StudioのAddinを作っていたらハマってしまってteratailで質問したら解決した話

毎回タイトルにセンスがないのは仕様

ということでタイトルのまんまのことでして,Xamarin StudioのAddin作りをしてみました.

成果物はこちら

GitHub - yamachu/VariableConsoleWriter

選択した変数をSystem.Diagnostics.Debug.WriteLineで囲って,実行されたメソッド名と一緒に出力するコードを挿入するアドイン. f:id:yamachu_co:20161107230248g:plain

デバッガ使えとかいうツッコミはなしで

やったこととか色々

右クリックをすると表示されるコンテキストメニューにコマンドを追加したかったのですが,なかなかうまくいかずに苦戦してました.

公式ドキュメントを読んでみると

Creating contextual menus
TODO

...ha?TODOじゃないんじゃ,書いてくれ,な?

という感じでどうしようかなぁ〜と考えた時あることに気がつきました.
「エディタ自体もAddinみたいので拡張されてるんだし,それパクればいけるじゃん」

そう,これとか

ということで中身の確認をしてみたのですが,基本的にはやっていることは同じ,なのにこちらでは出てこない.

困り果てたのでteratailに相談だ!ということで質問を投下

teratail.com

回答がかなり早いタイミングで来たんですけど,回答者,すごい回答者が来てしまった...という感じでした.本当にありがたかったです.

要点をまとめると * Addin実行してる時のApplication Output見よう * アセンブリの参照が足りない

ということでした.完全にビンゴでして,f:id:yamachu_co:20161107225847p:plain

このMonoDevelop.SourceEditor2を参照に加えたら動きました. ちゃんとコンソールにERRORで出ていたのですが,完全に見逃していました.これからエディタ上でのContextMenuに何か加えたいという人はこの辺りにご注意を...

まとめ

  • Addin実行してる時のApplication Output見よう
  • アセンブリの参照の確認をしよう
  • 公式リポジトリを見て実装のベースとなるところを確認しよう
  • ちゃんと途中経過とか色々書けば回答してくださる人もあらわれてくれる

XamarinでFirebase使う記事を投稿しました

まだiOS版のみ(Androidの方が楽なのに)

qiita.com

画像もなんもなくてツラい記事だけど,サンプルコードをアップしたから,許してね!

Xamarin.AndroidでJavaバインディングしてみたらちょっとツラかった話

Xamarin

TL;DR

remove-node使っとけ


またXamarin関係ネタ

先週の土曜日と日曜日でJPHACKSというイベントの東北予選に参加していました.

2016.jphacks.com

そこで提供されるAPIとかをぼーっと眺めていたらWebRTCの技術を使ったサービスのAndroidiOS向けのSDKがあるということを知りました.

あーそういえば前提督の窓にVNC埋め込むかWebRTC使ってリモート機能入れて,モバイル端末からでも使えるようにしたいなあとか思って勉強していたことを思い出しまして,WebRTCのサービス一回使ってみたいなあと思ったわけです.

そのサービスというのがNTTコミュニケーションズさんのSkyWayなわけで.

nttcom.github.io

まぁ最近はJavaAndroidアプリ書くことも減って,Xamarin.FormsでiOSのも作ってしまおうという流れで開発しています.そうした時既存のライブラリはどうしようという悩みが出てくるわけです.nuget探れば結構ラップされたものが出てくるのですが,今回に限っては見つからず,けど使いたい...ということになりました.

そのため今回目をつけたのがXamarin.AndroidJavaバインディングというか相互運用というか,そのあたりです.

Binding a Java Library - Xamarin

軽く読んでみると,なんだ,ほとんどこっちで書くことないし楽じゃん(歓喜)となっていたわけですが,ちょっと間違えるとツラくなるということがあったので書き残しておきます.

関係無いですけど,バインディングライブラリ作る程度にはこのサービス使ってるので企業賞ください(懇願)

以下箇条書きで適当に(表現含み,あまり正しくない表現が含まれてます,自分が見てわかる程度のメモ)

  • inner classだったり,特に識別子がないclassはvisibleが空白になり,継承とか実装したいときにリファレンスがないとか言われる
  • override 指定子がついてるのにないって怒られる
  • visible を public に変える -> 別のエラーが出たり,namespaceが汚れるけど一応継承できる
  • <attr path="/api/package[@name='hoge.fuga']/class[@name='piyo']" name="visibility">public</attr>みたいな感じ

  • 使わないAPIだったり,内部API,別の namespace(Javaのpackage) は remove-node で消し去って良い <- めっちゃ重要

    • 適宜 attr で追加
  • public だとかはどうやって調べる?

    • Debugビルドとかした時の,obj/Debug/api.xml を見る <- めっちゃ便利
  • Hoge.Fuga.Piyo.Value class の Value パラメータはだめ(コンストラクタと同じ名前だから?)

    • attr name で変更する
  • partial class になっているから自分で書き加えて良い

  • ヘルパーとなるメソッドとか生やした方が使い易い

  • 先人に学べ <- これで今回成功した

先人に学べというのは

[JXUG#4] 2015-04-11 Binding Java Library // Speaker Deck

こういうものを見ることです,だいたい対策が載ってました.

追記)
id:ytabuchi さんからこんな参考スライド情報もいただきました.実際に試してツラさの溢れる内容でこれも面白いです.

Xamarin.AndroidでJavaバインディング云々

追記終わり

これを見る前はビルド時200個エラーが出て数時間かけてそのエラーを潰したらその後に200個以上のエラーが出てきて本当にこの業界から消え去りたいと思ったレベルでした.何度も言うけど

めんどくさいなら remove-node で消してみろ

ですね.

今回作ってみたラッパーライブラリはこちら

GitHub - yamachu/SkyWay-Android-SDK-forXamarin.Android

ほんと,情報量0の記事だこれ.