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

Jack of all trades

master of none. 多芸は無芸を地で行く、自作自演何でも屋。

MemotchUWPをリリースしました

Windows Phone 8.xのアプリとしてリリースしたMemotchをUWPに移植しました。一応若干の機能追加もあります。

www.microsoft.com

Windows Phone 8.x版のMemotchについては以下のエントリーで幾分か説明しています。
Windows Phoneアプリ作りました - Jack of all trades
memotchをアップデートしました - Jack of all trades

基本的にはWindows 10 Mobileでの利用を想定していますが、タブレットやデスクトップでも利用可能です(ウィンドウ幅は狭めの方が使いやすいかもしれません)

以下、Windows Phone 8.xアプリのMemotchから追加になった要素をご紹介します。

1. アクションタイルを追加

選択できるアクションの種類を増やしました(多少)
とりあえずこの辺↓

f:id:sadynitro:20161129215426p:plain

2. メモの完了済みステータス

タスクとしては完了しているけど、削除せず残しておきたいメモについて「完了済み」にして残すことができます。
完了済みにすると、表示順としては一番下になり、後述のライブタイルには表示されなくなります。
(一度完了済みにしたメモを未完了に戻すこともできます)

f:id:sadynitro:20161129215436p:plain

3. ライブタイル対応

期限が今日以降、かつ完了済みでないメモをスタート画面のライブタイルに表示します。
(期限が近いものから最大5件)

f:id:sadynitro:20161129215540p:plain

大体こんな感じです。どうぞよろしく。

Transact-SQLのISNULL内では型比較が必ず発動するらしい

仕事の備忘録。

ISNULL (Transact-SQL)

check_expression
NULL かどうかを調べる式です。 check_expression は任意のデータ型です。
replacement_value
check_expression が NULL の場合に返される式です。 replacement_value は、暗黙的に check_expresssion の型に変換できる型である必要があります。

MSDNに記載されている通り、判定の結果がNULLだった場合に置き換える値は、判定される値と同じ型、もしくは暗黙的に変換できる型でなければ型変換エラーとなります。

型を比較する処理は実際にNULLが入ってきた場合にのみ発動するかと思いきや、NULLでない値が入っている場合でも発動する模様。

DECLARE @d AS DATE = GETDATE()
SELECT ISNULL(@d, 1)

これを実行すると型変換エラーが発生します。

メッセージ 206、レベル 16、状態 2、行 2
オペランド型の不整合: int は date と互換性がありません

ちなみにDATETIME型の場合はINT型から暗黙の型変換が可能なためエラーにはなりません。

DECLARE @dt AS DATETIME = GETDATE()
SELECT ISNULL(@dt, 1)

まぁNULLでない値で型変換エラーになるということはNULLが入ってきても同じくエラーになるので、どちらにしても型をきちんと合わせるのが正解なんですが、たまたまこのエラー原因に行き着くのが難しいケースにぶち当たったのでメモ。初歩的なことで理解してないことが結構あります。

Bash on WindowsでRVMインストールからRuby on Rails環境構築まで

※検証環境はWindows 10 Pro Insider PreviewのOSビルド14352.1002です。

Bash on Windows(正確にはBash on Ubuntu on Windowsですね)の環境を作って壊してまた作る日々です。
ようやくrvmのインストールからRuby on Rails環境構築までが上手いこといくようになったので、備忘録的に書き起こしておきます。
まぁ正直、最初のバージョンからちゃんと動いてるっぽい*1ことも考慮するとrbenv使った方がいいんじゃないかな(以下Qiitaの記事参照)

qiita.com

rvmのインストール

まずはgitをインストール。

sudo apt-get install

curlはインストールされているようなので、そのままrvmのインストール。公開鍵の設定をしてからインストール実行。

curl -sSL https://rvm.io/mpapis.asc | gpg --import - 
curl -L https://get.rvm.io | bash -s stable

~/.bashrcの末行に以下を追加。

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"

.bashrcを再読み込み。

source ~/.bashrc

一応rvmのバージョン確認を実行して正常にインストールされていることを確認。

rvm -v
rvm 1.27.0 (latest) by Wayne E. Seguin <wayneeseguin@gmail.com>, Michal Papis <mpapis@gmail.com> [https://rvm.io/]

Rubyのインストール

rvm経由でRubyのインストール。とりあえずバージョンは2.3.0を選択。

rvm install ruby-2.3.0

インストールが完了したら一応バージョン確認。

ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]

Ruby on Railsのインストール

まずはnodejsのインストール。

sudo apt-get install nodejs

一応Rails環境用のgemsetを作っておく。globalが散らかってもいいという方はご自由に。

rvm gemset create rails
rvm gemset use rails

環境作成用のディレクトリを作成して移動。

mkdir /mnt/c/BashOnWindows/src/rails/
cd /mnt/c/BashOnWindows/src/rails/

Railsのインストール。割とすんなりいけるはず。

gem install rails

おもむろにrails newする。プロジェクト名は任意で(ここではtrial01とした)

rails new trial01

作成されたディレクトリに移動してbundle installを実行。

cd trial01/
bundle install

で、エラー発生。

Unfortunately, an unexpected error occurred, and Bundler cannot continue.

First, try this link to see if there are any existing issue reports for this error:
https://github.com/bundler/bundler/search?q=parent+directory+is+world+writable+but+not+sticky&type=Issues

If there aren't any reports for this error yet, please create copy and paste the report template above into a new issue. Don't forget to anonymize any private data! The new issue form is located at:
https://github.com/bundler/bundler/issues/new

どうやらbashにおける新規ファイル作成時の付与権限がデフォルトのままだと「~/.bundle」ディレクトリに対する操作がうまく動かないらしい。 Bash on Windowsのissues専用GitHubで解決策を書いてくれています。ありがたい。

github.com

ということで、コメントに従って以下を実行。

umask 007
rm -rf ~/.bundle
bundle install

正常に実行完了!お待ちかねのrails sを実行。

rails s

ブラウザを開いて「http://localhost:3000」にアクセス。無事に動いてます。
f:id:sadynitro:20160605133818p:plain

ちなみに/mnt/c/配下の領域に環境作成用ディレクトリを作成しているので、Windows側のVSCode等で編集できます。
f:id:sadynitro:20160605134243p:plain

これでRailsアプリケーションの開発環境が構築できました。本番環境へのデプロイ等々が心配な感じですが、そのあたりは順番に実験していきます。

疲れた。

*1:Bash on Windowsの1回目のUpdateでは壊れてましたけどね

HoloLensおさわり会 with OITECに参加しました

タイトルそのまま。未来に触れてきました。

hololens.connpass.com

みつばたん( @mitsuba_tan )こと、 slikyfeel の泉本CEOが個人所有のHololensを使って各地で体験会を開催してくださっています。 此度は OITEC との共催という形で岡山で開催していただけました。

会場はご存じKLab株式会社様の岡山事業所をご提供いたきました。これに限らず、岡山のコミュニティイベントでしばしば会場提供していただいており大変ありがたい限りです。

百聞は一見に如かずとよく言われますが、Hololensに関しては本当に被ってみないとわからないですね。
なので、あまり細かいことは抜きにして単純に当日のレポートと個人的な感想を少々。

当日のレポート

Hololens本体。重さ579g(タブレットぐらいの感じ)
このサイズ、重量でCPU、GPU、メモリ、バッテリー、各種センサー等々がオールインワン。配線も一切出ていない。謎の技術としか言いようがない。 f:id:sadynitro:20160522214255p:plain

Hololens自体がサーバーになって、そこにアクセスすることで管理画面を開くことができます。
この画面上でHololens装着者が見ている画を共有したり、リソースモニターを確認したりできます。
これのおかげで、実際に装着して体験できるのが一人ずつでも、みんなでワイワイしながら会が進行していたので非常に良かったです。
f:id:sadynitro:20160522214259p:plain

取得した部屋のメッシュが表示された画面。
Hololensを被って部屋をグルグルすることによって 部屋の形状をスキャンしてメッシュを作成してくれているのが確認できます。
f:id:sadynitro:20160522214302p:plain

Hololensを被りなおしても配置されたオブジェクトはそのままなので、後半はかなり散らかった状態に。
お片付けできない子供部屋の様相。
f:id:sadynitro:20160522214306p:plain

画面共有を見ないで被ってる本人だけ見るととっても不審者な図、その1。
f:id:sadynitro:20160522214310p:plain

その2。
f:id:sadynitro:20160522214314p:plain

その3。スーツだと怪しさ倍増ですね。
f:id:sadynitro:20160522214318p:plain

個人的な感想

被った瞬間は「話に聞いてた通り、ちょっと視野角が狭い?」と思いましたが、操作してるうちにほとんど気にならなくなりました。視界の真ん中に見えるポインタをマウスポインタ的に使って操作することもあり、正面の対象に集中しているうちに気にならなくなります。使うアプリケーションの性質にもよるとは思いますが、その辺りの議論はまだ先の話になりそうです。
とにかくオブジェクトの物体感がすごい!普通のウィンドウ表示ですら物体感がある。遠近感もそうですが、ウインドウ表示している板状(?)のオブジェクトを思わず掴みたくなりました。
サンプルゲーム的なもの(ジャンルとしてはアドベンチャーゲームかな)も体験させてもらったのですが、NPCが本当にその場にいるかのように見えました。NPCの立っている位置で声のする方向も変わるので、本当に隣に立って会話しているような感じ。あぁどんなに頑張っても文章では言い表せない…。

まとめ

Hololensは未来でした。何にしても実際に被らないとわからないと断言できるので、どうにかして入手していただく…のは難しいとして、今後他所で開催されるHololensおさわり会に参加されることをお勧めします。差し当たり、松山、名古屋、博多での開催が予定されているようです。

hololens.connpass.com

とは言え競争率が高いので抽選に当たることを祈る感じにはなりそうですね。

ちなみに、HololensのSDKエミュレーター、Unityによる開発環境等々、Hololens用のアプリケーション開発も少しずつ見えてきているので、先んじてキャッチアップしたいですね。

とにかく単純に楽しかった!地方の開発者やコミュニティがモチベーション高く、最新のテクノロジーに立ち向かえるのはこういった会を企画・開催・協力してくださる有志の方々のおかげです。silkyfeel泉本様、KLab岡山事業所の皆様、OITECの皆様に最大級の感謝を。

Visual Studio Team Servicesでアラートを設定する

前回のエントリというか、ComCamp2016のセッションについて @kkamegawaさんからフォローアップしていただきましたので、早速実験してみました。

Team Foundation Server(TFS)を自前で運用しているときはお世話になっていたアラートの機能について、すっかり失念しておりました…。ということでVSTSについてもアラートの機能を使ってみることにします。

各プロジェクトページの右上にあるユーザーメニューから「My alerts」を選択します。
f:id:sadynitro:20160222233013p:plain

Alertsの管理ページが開きます。
「Send my alerts to (Edit…)」でデフォルトの通知メール送信先を設定します。
下段のBASIC ALERTSでは、あらかじめ用意されたイベントトリガーから使用したいものにチェックを付けることでそのイベント発生時にメール通知が飛ぶように設定できます。
f:id:sadynitro:20160222233020p:plain

一方CUSTOM ALERTSでは、あらかじめ用意されたイベントトリガーのクエリテンプレートを選択して、自分の好きなようにクエリを編集することで通知イベントをカスタマイズすることができます。
f:id:sadynitro:20160222233049p:plain

「A Pull request I have participated in is created or updated」を選択すると、以下のような画面が表示されます。
f:id:sadynitro:20160222233100p:plain

テンプレートでセットされているクエリ(条件式)を変更して、用途に合わせた通知イベントを作成します。 f:id:sadynitro:20160222233107p:plain

一番上に作成した通知イベントが表示されていることを確認できます。
f:id:sadynitro:20160222233113p:plain

より細かいカスタマイズについては、アラートの管理画面中段のリンク、もしくはプロジェクトページの右上にあるメニューアイコンから歯車のアイコンを選択して「Alerts」のページを開きます。
f:id:sadynitro:20160222233121p:plain
f:id:sadynitro:20160222233126p:plain

Alertsページではより詳細にクエリを設定することが可能ですので、通知イベントにかなり細かい条件を付けたい方はこちらから通知を作成することをおすすめします。
※2016/02/23追記:「My alerts」から入る設定では、基本的に自分宛にメール通知をする設定でしたが、Alertsページでは該当のメンバー全員にメールを送る通知イベントなんてものも作成することができます。
f:id:sadynitro:20160222233130p:plain

設定後、実際にプルリクエストを作成してみると… f:id:sadynitro:20160222233138p:plain

無事にメール通知を受け取ることができました。 f:id:sadynitro:20160222233144p:plain

以前から、外部サービスと連携してイベント通知を飛ばす方法についてはご紹介していましたが、アラート機能を使ったメール通知についても、結構細かい条件を設定できるので、非常に便利だと改めて感じました。職場では外部サービスが使えない、外部サービスの登録からService Hooksの設定までやらないといけないのが面倒など、場合によってはアラート機能の方がマッチするケースも結構あるのではないかと思います。

ということで、皆様必要に応じて通知機能をチョイスしていただければと思います。