ひだまりソケットは壊れない

ソフトウェア開発に関する話を書きます。 最近は主に Android アプリ、Windows アプリ (UWP アプリ)、Java 関係です。

まじめなことを書くつもりでやっています。 適当なことは 「一角獣は夜に啼く」 に書いています。

Windows 10 で Git 環境を整える

自分用メモ。 昔は GitHub Desktop をインストールすれば Git Shell も使えるようになって PowerShell で快適 Git 生活が送れていたのだけど、最近 GitHub Desktop をインストールしてみたところ、どうやら Git Shell は同梱されないようになってしまったっぽい。

今ならこうすると良さそう、というメモ。

Git 環境を整える

GitHub Desktop インストール

人によっては全然いらないと思うけど、あったらあったで便利なので。 (追記 : 2019 年 5 月現在、個人的にこれはなくていいかなーと思いつつある。 特に使わないので。)

GitHub Desktop | Simple collaboration from your desktop

起動したら GitHub にログイン。 それで Git の設定でユーザー名やメールアドレスが自動的に設定されるので便利。

Git for Windows をインストール

GitHub Desktop にも git コマンドは同梱されているけど、GitHub Desktop とは独立してバージョンアップなどをできるように Git for Windows をインストールしておく。

Git - Downloading Package (Git 本家サイトの Git for Windows のダウンロードページ)
Git for Windows (こっちは Git for Windows のサイト)

インストール途中の選択肢で、push 時や pull 時の改行コードの変換をどうするか聞いてくれる。 が、as-is を選んでも改行コードが変換されないようにならなかったことがある。 (後でやったときはちゃんと設定された。) また、GitHub Desktop をインストールしない場合にはユーザー名やメールアドレスを設定する必要がある。

# 設定が必要なら
user.name=....
user.email=....

# core.autocrlf の設定がなされていないならば
git config --global core.autocrlf false

posh-git をインストール

PowerShell で Git が便利になる。 タブでサブコマンドやブランチ名の補完をしてくれたり、プロンプトに現在のブランチを表示してくれたりする。 (昔の GitHub Desktop に同梱されていた Git Shell で PowerShell を使う場合には自動で有効になってた。)

posh-git by dahlbyk
Git - PowershellでGitを使う

書かれてる通りにインストール。

必要な設定

文字化け (?) 対応

初期状態だと git log などで日本語の表示がおかしくなる。 文字化けというか、バイト値が 16 進数表記で連なる感じ。

git config --global core.pager "LESSCHARSET=utf-8 less"

という感じで、config の core.pager を 「LESSCHARSET=utf-8 less」 に設定すれば良さそう。

~\Documents\test [master]> git log --graph --decorate
* commit a5e5b4d21432f3fcba4ffbf1dd0d4bc598c4b051 (HEAD -> master)
  Author: Nobuoka Yu <nobuoka@vividcode.info>
  Date:   Wed Aug 8 23:33:26 2018 +0900

      <E3><81><93><E3><82><93><E3><81><AB><E3><81><A1><E3><81><AF>

~\Documents\test [master]> git config --global core.pager "LESSCHARSET=utf-8 less"

~\Documents\test [master]> git log --graph --decorate
* commit a5e5b4d21432f3fcba4ffbf1dd0d4bc598c4b051 (HEAD -> master)
  Author: Nobuoka Yu <nobuoka@vividcode.info>
  Date:   Wed Aug 8 23:33:26 2018 +0900

      こんにちは
テキストエディタの設定を 「メモ帳」 にする

デフォルトだと Vim が起動するが、日本語の表示がうまくされないのでメモ帳を使うようにする。

git config --global core.editor "notepad"

Hyper-V 上の Debian VM の vNIC の IP アドレスを管理 OS 側から取得できるように LIS を有効にする

表題通り。 Hyper-V 上の Debian 8.7.1 で Linux 統合サービス (Linux Integration Services; LIS) を有効にした方法のメモ。

私が試したのは、Windows 10 Pro (Insider Preview Build 14986) の Hyper-V 上の VMDebian 8.7.1 Jessie をインストールする Packer のビルドを実行しようとした、というもの。

前提

直面した状況

Packer でビルドして Hyper-V VMDebian 8.7.1 Jessie をインストールしようとしたところ、Packer がゲストマシンに SSH 接続しようとしてずっと待ち続けるという状況になった。 (下記表示のまま進まない。)

==> hyperv-iso: Waiting for SSH to become available...

Packer のログ ($env:PACKER_LOG=1 でログ出力されるようにした) を確認したところ、以下のようなメッセージが表示されていた。

2017/02/18 19:48:48 packer.exe: 2017/02/18 19:48:48 [DEBUG] Error getting SSH address: No ip address.

すなわち、管理 OS 側から仮想ネットワークアダプタの IP アドレスを取得できなかったぽい。

管理 OS 側から仮想ネットワークアダプタの IP アドレスを取得できなかった原因

「Error getting SSH address: No ip address.」 の原因を探したところ、以下の issue が引っかかった。 ここでゲスト OS 側が管理 OS に IP アドレスを伝える必要があるということを知った。

で、Linux ゲストの場合は、Linux 統合サービスが必要とのこと。

Debian 8.7.1 Jessie で LIS を有効にする

Debian 8 系では、LIS がディストリビューションに含まれている。

有効にするための手順がどこに書かれているのかわからなかったので困ったのだけれど、やってみたところ Debian 8.7.1 では、APT の hyperv-daemons パッケージをインストールして再起動するだけで LIS が有効になるっぽかった。 (実際に試して、管理 OS 側から IP アドレスを取得できることを確認した。)

apt-get install hyperv-daemons

今回の場合、Packer でビルドするために Preseed を使っていたので、preseed.cfg のパッケージ選択に hyperv-daemons を含めるようにした。

d-i pkgsel/include string openssh-server build-essential hyperv-daemons
    # これは一例です。 hyperv-daemons パッケージ以外のパッケージは必ずしも必要ではありません。

参考

  • Debian Jessie Hyper-V : Debian 8 で LIS を有効にする方法。 KVP、VSS、FCOPY 統合のために hyperv-daemons と 4.2 カーネルが必要とのこと。 KVP やら VSS やら FCOPY まで追いかけられていないが、参考にした。
  • Install Hyper-V (LIS) On Debian 8 : Debian 8 で LIS を有効にする方法。 こちらも参考にはしたが、ここに書かれている方法を全て実行する必要はなさそうだった。

PowerShell (Windows) で Docker コンテナにホストディレクトリをデータボリュームとしてマウントする際に pwd 相当のことをしたい

試した環境

  • Windows 10 Home (Anniversary Update; 64-bit 版)
  • Docker Toolbox 1.12.0

前提知識

絶対パスで記述するためにどうするかが問題

Linux では以下のように pwd コマンドを使うのが一般的かと思います。

docker run -v $(pwd)/path/to/target:/container/path ...

じゃあ Windows (PowerShell) でどうするのか、というのが問題です。 PowerShell にも pwd コマンド相当の Get-Location コマンドレット があるのですが、これをそのまま使うとパスの形式が通常の Windows のパス表記の形式になるので、docker コマンドの -v オプションに渡せません。

Write-Output "$(Get-Location)/path/to/target"
# => C:\Users\userName\Documents\project/path/to/target
# 本当は /c/Users/userName/Cocuments/project/path/to/target という形式で欲しい

# 実際にやってみると以下のようなエラーが出る。
docker run -v "$(Get-Location)/path/to/target:/container/path" ...
C:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: Invalid bind mount spec "C:\\Users\\userName\\Documents\\project/path/to/target:/container/path": invalid mode: /container/path.
See 'C:\Program Files\Docker Toolbox\docker.exe run --help'.

雑に対応する

そんなわけで、以下のように Windows の通常のパスの表記を Linux ぽい感じに変換する関数を定義して使っています。

function pwd_as_linux {
  "/$((pwd).Drive.Name.ToLowerInvariant())/$((pwd).Path.Replace('\', '/').Substring(3))"
}

# 実際使う場合は以下のような感じ。
docker run -v "$(pwd_as_linux)/path/to/target:/container/path" ...

関数を定義するまでもなく変数に格納して使いたいって感じなら以下のようにもできます。

# Linux 風のパス形式。
$pwd_as_linux = "/$((pwd).Drive.Name.ToLowerInvariant())/$((pwd).Path.Replace('\', '/').Substring(3))"

# 使う。
docker run -v ${pwd_as_linux}/path/to/target:/container/path ...

Docker Engine 側で通常の Windows のパス形式を受け付けてくれたらいいのですが、コロンが区切りに使われてるから難しいんだろうなぁと思ったり。

参考ページ

UWP アプリ 「みお×ぽん」 をリリースしました

2016 年 1 月 19 日に、Universal Windows Platform (UWP) アプリ 「みお×ぽん」 をリリースしました。 下記ページからダウンロードできます。

www.microsoft.com

どんなアプリ?

株式会社インターネットイニシアティブが提供するインターネット通信サービス 「IIJmio 高速モバイル / D サービス」 の利用状況の確認と、高速通信のためのクーポンの有効・無効の切り替えを行うことができます。 Windows 10 を搭載した PC や、Windows 10 mobile 端末などで利用できます。

IIJ 公式アプリ 「みおぽん」 (Android 用 / iOS 用) の機能を Windows プラットフォームで提供するために開発しました。

内部的には、IIJ の提供する 「みおぽん API」 を使用しています。

既知の問題点

  • Windows 10 mobile で IIJmio アカウントに接続しようとしても、ログイン画面が崩れた状態で表示され、ログインできない問題があります。 (後述のとおり、バージョン 1.0.1 で解決しました。)
    • アカウント情報は Windows 10 プラットフォームと mobile プラットフォームで同期されますので、mobile で使用したい場合は先に PC 側でアカウントに接続することでこの問題を回避できます。
    • 早めに解消できるように頑張ります……!

2016-01-23 追記

  • Windows 10 mobile で IIJmio アカウントに接続できない問題は、2016 年 1 月 23 日にリリースしたバージョン 1.0.1 で解消しました。

TypeScript + Less + HTML で UWP アプリを開発するプロジェクトのテンプレート

この記事は、「Windows & Microsoft技術 基礎 Advent Calendar 2015」 の 22 日目の記事です。 昨日は wgag さんによる 「rise4fun の検証ツールで遊ぼう」 でした。

さてさて、今年 7 月末に Windows 10 がリリースされて、先月末には Windows 10 mobile 端末が日本でも発売され始めましたね! めでたい! というわけで Windows 10 や Windows 10 mobile で動く UWP アプリ (Universal Windows Platform アプリ) の開発の話をしようと思います。

TypeScript + Less + HTML の UWP アプリ用プロジェクトテンプレート

UWP アプリの開発には C# + XAML を用いたり C++ + XAML を用いたりする方法もありますが、HTML + JS + CSS という web 技術もサポートされています。 私が UWP アプリを書くときは HTML + JS + CSS で開発しています。

HTML + JS + CSS で開発する場合、実際には JS の代わりに TypeScript を使用したり CSS の代わりに Less を使用したりしたいところです。 また、JS のライブラリの管理や TypeScript の型定義ファイルの管理なども npm のモジュールを使って行いたいですね。 新しくプロジェクトを開始するときに、そういった開発環境の整備を毎回する必要があるのが結構面倒なので、いい感じのプロジェクトテンプレートがあると便利なはずです。 先ほど最初のバージョンであるバージョン 0.1.0 をアップロードして GitHub 上に置きましたのでご利用ください!

使い方

ZIP ファイル (WindowsUniversalTemplateApp-0.1.0.zip) をダウンロードし、Visual Studio 2015 の作業ディレクトリ中の Templates\ProjectTemplates\JavaScript というディレクトリ内に置いてください。 Visual Studio 2015 を起動して、新しいプロジェクトを作成しようとすると 「インストール済み」 「テンプレート」 「JavaScript」 の中に 「TemplateApp」 という項目があるはずなので、それを選択してプロジェクトを作成するだけです。

f:id:nobuoka:20151222232828p:plain

後は、ビルドすれば Node.js や npm のセットアップなどが自動的に行われますし、「デバックを開始」 すればアプリが起動するはずです。 なお、初回ビルド時はセットアップのために結構時間がかかります。 ちなみに、ソリューションプラットフォームを 「Any CPU」 にしていると以下のようなエラーが表示されてしまいますのでご注意ください。 (デバック対象プラットフォームに適したものを指定する必要があります。)

Your project.json doesn't list 'win10' as a targeted runtime. You should add '"win10": { }' inside your "runtimes" section in your project.json, and then re-run NuGet restore. (C:\Program Files (x86)\MSBuild\Microsoft\NuGet\Microsoft.NuGet.targets, line 211)

プロジェクトの内容

プロジェクトで使用しているライブラリ等の紹介をします。

Less

Less のコンパイルには、Web Compiler を使用しています。

新しい Less ファイルを追加した際には compilerconfig.json に追記する必要があります。 Visual Studio に Web Compiler 拡張をインストールしている場合は GUI 操作でそこら辺の操作が可能です。

LESS のコンパイル結果の CSS ファイルをアプリに含めるためには MSBuild の ItemGroup の中に項目として CSS ファイルを含める必要がありますが、それは下記のあたりでやっています。

TypeScript

TypeScript のコンパイルには Visual Studio に組み込まれている TypeScript の処理系を使用しています。 Visual Studio 組み込みの機能を使うと Visual Studio との連携が便利ですが、他の npm モジュールによるツールと連携させようと思うと npm で tsc をインストールして使用した方が便利な気もするので、将来的には npm の tsc を使うようにした方がいいかなぁと思っています。

JS のライブラリ管理や TypeScript の型定義ファイルの管理など

JS のライブラリ管理や TypeScript の型定義ファイルの管理には npm モジュールを使用しています。

npm を使用するためには Node.MSBuild.Npm NuGet パッケージ を使用しています。 昔は Npm パッケージを使用していたのですが、バージョンが古いという問題があったり、プロジェクトのディレクトリ階層が深いとそもそもインストール時に失敗するという問題があったりして移行 *1 しました。

JS のライブラリ管理には Bower を使用して、TypeScript の型定義ファイルの管理には dtsm を使用しています。 これらのツールを使用するのは、MSBuild の Target として定義しているので、ビルド処理の中で実行されるようになっています。

初期状態では、WinJS のインストールや、WinJS や WinRT の型定義ファイルのインストールが実行されるようになっています。

将来的には

将来的には React を導入したり、TypeScript をモジュール化して管理しやすいようにしたいなーと思ってます。

おわり

明日は aetos さんによる PE ファイルについての話のようです! 楽しみですね!!

*1:というか自作