OmniAICreator/Qiita-1.07M huggingface dataset:
SublimeText好きがiOSアプリ開発で最初に入れたXcodeプラグイン3つ

弊社サービスのTECH::CAMPではRailsとiOSのコースをやっています。自分はRailsを主に書いているエンジニアなのですが、iOSできるに越したことはないので最近はコソコソと勉強しています。

突然ですが、SublimeTextのPackage、便利ですよね。もっぱらweb系の開発ではSublimeTextを使っているので、Xcodeでもしっかりカスタマイズしていきたいなと思い、Xcode Pluginを見つけたので、僕が入れたプラグインを3つ紹介します。

Xcode pluginの導入方法に関してはパッケージマネージャーである「Alcatraz」を入れるのが便利だと思います。

Alcatrazの導入に関してはこちらの記事などを参照ください
[Xcodeプラグイン「Alcatraz」の導入](http://qiita.com/masuhara/items/95185be077d3fc29a00f)


## FuzzyAutocompletePlugin

Xcodeの補完機能をSublime TextのGoto Anythingのようなfuzzy matchに切り替えます。このみが別れるところではあると思いますが。僕はこっちに慣れてしまっているので重宝してます。

[chendo/FuzzyAutocompletePlugin](https://github.com/chendo/FuzzyAutocompletePlugin)

## GitDiff 

SublimeText Packageで言う所の[Git Gutter](https://github.com/jisaacks/GitGutter)のようなプラグインです。Gitで管理しているプロジェクト内のファイルであれば変更、削除などをした時に行数の横にハイライトがつきます。必須プラグインですね。

[johnno1962/GitDiff](https://github.com/johnno1962/GitDiff)

![https://camo.githubusercontent.com/c28d1cf0d3b079c807f79cb6deb5785aff28e9be/687474703a2f2f696e6a656374696f6e666f7278636f64652e6a6f686e686f6c6473776f7274682e636f6d2f67697464696666322e706e67](https://camo.githubusercontent.com/c28d1cf0d3b079c807f79cb6deb5785aff28e9be/687474703a2f2f696e6a656374696f6e666f7278636f64652e6a6f686e686f6c6473776f7274682e636f6d2f67697464696666322e706e67)

> *引用元: https://github.com/johnno1962/GitDiff*


## SCXcodeMiniMap

xcodeにsublimetextチックなminimapを表示するプラグインです。好き嫌いあると思いますが、あると便利なケースもあるのではないでしょうか。

[stefanceriu/SCXcodeMiniMap](https://github.com/stefanceriu/SCXcodeMiniMap)

![http://31.media.tumblr.com/d90a99be122abe26123e60a4c729699e/tumblr_inline_n41d2umdXz1qh9cw7.png](http://31.media.tumblr.com/d90a99be122abe26123e60a4c729699e/tumblr_inline_n41d2umdXz1qh9cw7.png)

> *引用元: http://iosdevtips.co/post/82232620790/best-xcode-plugins*


## 終わりに

実は今はこれだけしか入れてません。ただxcode自体が高機能な開発環境なので、それほどカスタマイズしなくてもxcode自体の使い方になれる方が先かもしれない、と思いました。
Cocoaの命名規則に慣れて、予測変換をスムーズに行うのが最初の壁ですね。頑張りたいと思います。


余談ですが、xcodeは`shift + cmd + o` でsublimetextで言うところのgoto anything的なことができます。これ知った時の感動は計り知れなかったですね。
意外と気づかないiOSデフォルトアプリのディープリンク

iOS9 からステータスバーに表示される「Back to XXXX」 によって， アプリ間の遷移がしやすくなりました．[Universal Links](https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/AppSearch/UniversalLinks.html), [App Indexing](https://developers.google.com/app-indexing/?hl=en) などプラットフォーマーの動き方からも App to App，Web to App のディープリンクは注目されてきています．

![image](https://qiita-image-store.s3.amazonaws.com/0/31862/90335024-705d-6663-5c05-599019ad0f8d.png)

App to App のディープリンクに関して，iPhone のデフォルトマップアプリ「Maps」から、他の経路制御系アプリのディープリンクへ遷移できることを知りました．

普段は [GoogleMap](https://itunes.apple.com/en/app/google-maps/id585027354?mt=8) を使っているので，気が付かなかったです(； ･`д･´)

# 動作環境
+ iPhone6 Plus
+ iOS9.1

※ OSやデバイス，公開されているアプリケーションのバージョンアップに伴って，挙動が変わる可能性があります．

# Demo
実際の挙動をみてみましょう．
Maps で経路検索をして、その経路結果を用いて経路制御アプリに遷移できます．

Maps → Y!乗換案内 の挙動です．

![iphone-default-map-to-other-app.gif](https://dl.dropboxusercontent.com/s/pq2458046yl5gy7/iphone-default-map-to-other-app-225x400.gif)

1. 目的地を入力し、Pin を立てる
2. 「>」をタップし、「Direction」をタップ
3. Start を入力して「Route」をタップすると，経路が表示される
4. セグメントコントロールの「Transition」をタップ
5. フッターの「Routing Apps」をタップすると，関連するアプリ一覧が表示される
6. Installed Apps の「Y!乗換案内」の「Route」をタップ
7. Maps の経路検索情報を元に，Y!乗換案内で経路結果が表示される

# Routing Apps
Routing Apps の一覧には「Installed Apps」と「From the App Store」が表示されます．

前者は iPhone 内にすでにインストールされているアプリで，後者は未インストールの経路アプリの一覧です．未インストールのアプリをタップすると Store に遷移します．そこからインストールしてアプリを起動しても Maps アプリの経路検索結果は引き継げないようです．
(全てのアプリで試してないのでわかりませんが，対応すれば引き継いだりできるのでしょうか)

![image](https://qiita-image-store.s3.amazonaws.com/0/31862/0b8c4bdc-04ca-c23c-3d7c-2168687984c3.png)
Maps から他経路アプリを選択できる機能は，iOS8 時点でも使うことができていたようで，当時は「Apps」という名称で，iOS9 から「Transit」と記載がかわったみたいです．

# 制御系アプリ開発者側の対応方法

Routing Apps に表示させるための対応方法は，Apple 公式の [Location and Maps Programming Guide](https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/ProvidingDirections/ProvidingDirections.html#//apple_ref/doc/uid/TP40009497-CH8-SW7) に記載されています．

> An app that is able to display point-to-point directions can register as a routing app and make those directions available to the Maps app and to all other apps on a user’s device.

経路制御アプリケーションとして登録することによって，表示する道順を「マップ(Maps)」アプリケーション，および拡張機能によりユーザのデバイスの他のすべてのアプリケーションから利用できるようになります．
サポートする対応地域は，GeoJSON という対応地域カバーレージファイルによって宣言できるようです．アプリが提供する経路情報が日本だけの場合，このファイルによって海外の道順の要求は受信されなくなります．なお GeoJSON はアプリケーションに組み込むのではなく iTunes Connect にアップロードする仕様なので，アプリを再申請することなく更新が可能です．その他詳細は，公式ドキュメントを参照してください．

# まとめ

かれこれ5年ほど iPhone を使っていますが，デフォルトの Maps アプリをほとんど使っていませんでした．この機能がいつから使えるようになっているのかもわかりません．
電車を使うか，車を使うか，徒歩で行くのが速いのか，マップで検索してから電車のほうがよさそうだから，再び乗換案内で同じ検索をする，みたいなことがなくなりそうです．

> Registering as a routing app improves the user experience by giving other apps a means to access routing information from your app, thus avoiding the need for every app to provide its own routing directions. It’s also a great way to get your app in front of the user because Maps displays appropriate suggestions from the App Store as options for displaying directions.

公式で言及されているように ASO の観点からも効果的なようなので，未対応の経路制御アプリケーションはひとまず登録対応してみるといいのではないでしょうか．
鳥取県オープンデータカタログをスクレイピングするツールの紹介の巻

# はじめに

鳥取県では、[鳥取県オープンデータカタログ](http://db.pref.tottori.jp/opendataResearch.nsf)というオープンデータのカタログサイトを公開しています。

分類や部局ごとに整理されており、これはこれで使いやすいのですが、もう少し一覧性の良い形式で見たいことがあります。

鳥取県では[オープンデータカタログ一覧](http://db.pref.tottori.jp/opendataResearch.nsf/list1_forweb/08E699ED3190C88B49257DB0000BE942?OpenDocument)がCSV形式で公開されており、

- No
- 担当課（部・局）
- 担当課（室）
- データ名
- データ形式
- URL

の項目がリストアップされていますが、

- 分類
- 再配布可否
- 商用利用可否
- データ年次
- データの更新間隔

等もせっかく公開されているのですからこれも表にまとめて見たいところです。

というわけで、鳥取県オープンデータカタログをスクレイピングして、オープンデータの一覧をCSV形式やJSON形式へ簡単に変換できるツール「`tottori-opendata-catalog`」を作りました。

このツールはRuby言語用のライブラリ（RubyGems）として[公開](https://rubygems.org/gems/tottori-opendata-catalog)しています。また、ソースコードもGitHubで[公開](https://github.com/mh61503891/tottori-opendata-catalog)しています。

# 使い方

Rubyを普段お使いの方はGitHubのリポジトリ https://github.com/mh61503891/tottori-opendata-catalog を見たほうが早いです:wink:

Ruby（rubyコマンド）やRubyGems（gemコマンド）の使い方の解説は他のサイトを参考にしてもらうとして、簡単な使い方をば…。

`tottori-opendata-catalog`をインストールするには以下のコマンドを実行します。

```sh
gem install tottori-opendata-catalog
```

インストールすると、ライブラリに加えてコマンドラインツールもインストールされます。

```sh
tottori-opendata-catalog csv > catalog.csv
```

のようにすればCSV形式のファイルが保存されます。

出力サンプルは https://github.com/mh61503891/tottori-opendata-catalog/blob/master/example/example.csv に公開しています。

また、JSON形式でも出力できます。コマンドラインオプションの`csv`の部分を`json`に変更するだけです。

```sh
tottori-opendata-catalog json > catalog.json
```

このコマンドラインツールはデータをキャッシュします。1度実行するとしばらくはカタログサイトから再取得しません。もしキャッシュを破棄して再度取得し直したい場合は、`--no-cache`オプションを使います。

```sh
tottori-opendata-catalog csv --no-cache > catalog.csv
```

とすれば最新のデータが取得できます。

ちなみに、出力されるデータ形式は、UTF-8ですので、Excelで開くには少し工夫が必要かもしれません。。。LibreOfficeのCalcなどでも開けます。

普通にライブラリとして使いたい場合は https://github.com/mh61503891/tottori-opendata-catalog を参考にしてください。

# 今後の展望

鳥取県のカタログサイトから他のカタログサイトへ（[UrbanDataChallenge Dat Potal](http://udct-data.aigid.jp/)や[LinkData.org](http://linkdata.org/home)）の自動同期とかできないかなぁと思っています:wink:
週に1回だけどこかに勤務している人が月に1回の社内報告用に使うためのRubyスクリプト

週に1回だけどこかに勤務している人が月に1回の社内報告用に使うためのRubyスクリプトを作りました。
誰得？みたいな部分もありますが、類似ケースの参考になるかもしれないので晒します。

## <i class="fa fa-check-circle" style="font-size:1em;"></i> 前提
* 週に1回だけ別の会社のお手伝いをする
* 毎週金曜日のみ
* 勤務時間は決まっている
* 翌月頭にメールで勤怠を報告する必要がある

コンテキストの共有に限りがあると思うので、なんか納得いかない部分も
あるかもしれませんがスルー推奨です。

## <i class="fa fa-code" style="font-size:1em;"></i> プログラム
```
require 'date'
require 'erb'
require 'fileutils'

class MonthlyMail
  TEMPLATE =<<-EOS
<%=target_year%>年<%=target_month%>月 ほにゃらら勤務報告

TOさん

お疲れ様です。FROMです。
<%=target_year%>年<%=target_month%>月のほにゃらら勤務情報です。

<%=days%>

以上です。
ご確認よろしくお願いいたします。
  EOS

  def self.report
    target_date = Date.today << 1
    target_year = target_date.year
    target_month = target_date.month
    start_d = Date.new(target_year,target_month,1)
    end_d = Date.new(target_year,target_month,-1)
    days = (start_d..end_d).select{ |e|e.wday == 5}.map{ |e|e.strftime("%Y/%m/%d（金） 10:00-19:00")}.join("\n")
    contents = ERB.new(TEMPLATE).result(binding)

    FileUtils.mkdir_p("monthly_report/#{target_year}")
    File.open("monthly_report/#{target_year}/#{target_month}.md", "w") { |e| e.puts contents}
  end
end

MonthlyMail::report
```

## <i class="fa fa-file-text" style="font-size:1em;"></i> 出力
`./monthly_report/先月の年/先月.md` に以下の内容が出力されます。
一気にメール部分まで自動化しないのは、送る前に確認したいのと
月によっては休んだりイレギュラーがあるためです。
その場合は出力結果を手で編集します。

勤怠システムとの連携？世の中コントロール出来ない要素があるものです。

```
2015年11月 ほにゃらら勤務報告

TOさん

お疲れ様です。FROMです。
2015年11月のほにゃらら勤務情報です。

2015/11/06（金） 10:00-19:00
2015/11/13（金） 10:00-19:00
2015/11/20（金） 10:00-19:00
2015/11/27（金） 10:00-19:00

以上です。
ご確認よろしくお願いいたします。
```
エポックミリ秒取得ワンライナー


使うことが多かったので

## ミリ秒取得


```node.js
node -e 'var hoge = new Date().getTime();console.log(hoge)'
```

```ruby
ruby -e "t=Time.now.instance_eval { '%d%03d' % [to_i, (usec / 1000.0).round] };p t"
```

```shell
date +%s%3N
```

shellのはMacだと動かなかった

## ミリ秒から時間へ

```shell
echo 1448431010344 | awk '{print strftime("%c", substr($1,0,10))}'
```

ミリ秒切っちゃってます
Gunosyのバックログの話

Gunosyアドベントカレンダー第一日目ということで、他の会社のバックログの書き方も知りたいというきっかけの元、Gunosyのバックログのtips話をしようと思います。

## 施策バックログとチームバックログ
Gunosyでは現在、「グノシー」という一つのプロダクト運用にあたり、およそ11の小さな開発チームに加え、営業チームや企画チームが連携しながら施策を回しています。
各チームはスクラム、正確には厳密でないスクラム的運用でプロジェクトを回しており、それぞれがチームバックログを持っています。
これらのチームバックログは全て会社全体の施策バックログをベースに作成しており、いわゆる親子関係に近いものがあります。
正確には各チームの独自のバックログ（リファクタリングやバグフィックス系など）と、施策バックログをチームのバックログにブレイクダウンしたバックログの組み合わせです。

この施策バックログは、現在は戦略担当やデータ分析部を始めとした様々な人から起案されたものに対して、毎週の定例で優先度を整理し各チームの状況を鑑みながら1~数カ月分の開発の流れを決めるような流れになっています。（といってもこの運用になったのはごく最近ですが。）

## 施策バックログには何が書いてあるか
全体の施策バックログにおいては、数値中心で施策を議論できることを主眼に置き、下記の項目を常に記載するルールになっています。

| 項目 | 内容 |
|:--|:--|
| 施策名 | 施策の名前。端的に分かりやすいものが望ましい。 |
| 起案者（Owner) | 施策ごとにオーナーが決まっており、その人を中心に施策を議論・取りまとめ・分析を回していきます |
| 概要 | 施策の概要、時には簡単な絵も使いつつ動作としてイメージしやすいものを記載。ただし、 |
| コスト | 実装にあたりどの程度のコストがかかるか、相対見積もりではなく実時間・期間で記載。 |
| 効果見積もり | どういった数値に影響を与え、KPIにどれだけ寄与するか仮説と検証ポイントを書く。 |
| 撤退条件 | どういった条件でその機能を削除するのかの基準。大抵はKPIに対する悪影響基準。 |
| 関係者 | どのチームがどの役割を担当するのか、困ったときに誰に聞くかわかりやすく。 |

特に大事なのは`効果の見積もり`と`撤退条件`で、この二者を用意することで優先度付けを誰にでもわかりやすくすること、施策実施後、それが成功だったか失敗だったのかを理解しやすくすること、不必要な複雑性を維持し続けないような運用を心がけています。
また、それぞれのバックログには議論しやすいように、どの軸で効果を上げる施策なのか（例えば`売上`など）、進行中か、リリース後の計測中なのか付箋を貼り付けています。

これらはA4サイズの紙に所定のフォーマットを用意して書き、スタンドアップミーティングの場所の横に置いた大きなホワイトボードに全て貼り付け、誰でもすぐに確認できるようにしています。

## 最後に
バックログだけでなく、組織の運営自体、日々反省し模索する日々なので、他の会社の皆さんがどのような運用をしているのか気になっています。ぜひプロダクトバックログの運用の実際を聞いてみたいです。
新しいプログラミング言語の勉強方法

オライリーの本「リファクタリング・ウェットウェア」にある、初心者の効果的な学習方法に以下のような事項がある。

* 明確に定義されたタスクがある
* タスクには適度な難度（やりがい）が必要だが、実行可能でなければならない
* 復習のための繰り返しの機会が与えられ、またエラーを修正する機会も提供されるべきである

上記の学習方法に沿ったいい勉強方法はないかと考えたところ、テストフレームワークによる学習テストが最適なことに気付いた。

* 最小単位の粒度でタスク（テスト）を定義できる
* テスト単位で即時実行できる
* 成功／失敗がわかり、失敗したらすぐに修正することが可能
* 繰り返し実行に優れている

上の効果的な学習方法の事項を全て網羅している。

ということで例としてEffective JavaScriptを読んで気になった、型の異なった比較演算子の挙動のところをテストに書いて学んでみる。

まずテストフレームワークのインストール。
ここではmochaを使ってみる。

```bash
npm install -g mocha
```

次に、実際に動作を確認してみたいことを書いていく。

```javascript

var assert = require('assert');

describe("型が異なるときの==の挙動", function() {
	it("null == undefinedはtrueである", function() {
		assert.equal(null, undefined);
	});

	it("null == (null|undefined)以外はfalseである", function() {
		assert.notEqual(null, 1);
		assert.notEqual(null, "1");
		assert.notEqual(null, true);
		assert.notEqual(null, false);
		assert.notEqual(null, {});
		assert.notEqual(null, []);

		assert.notEqual(undefined, 1);
		assert.notEqual(undefined, "1");
		assert.notEqual(undefined, true);
		assert.notEqual(undefined, false);
		assert.notEqual(undefined, {});
		assert.notEqual(undefined, []);
	});

	it("プリミティブ型 == DateオブジェクトはtoStringを試し、次にvalueOfを試す", function() {
		var birthday = new Date("1980/7/21")
			,origin_to_string = birthday.toString;

		assert.notEqual("1980/7/21", birthday);

		var origin_to_string = birthday.toString;
		birthday.toString = function() {
			return "" + this.getFullYear()
				+ "/" + (this.getMonth() + 1)
				+ "/" + this.getDate();
		};
		assert.equal("1980/7/21", birthday);

		birthday.toString = origin_to_string;
		assert.notEqual(332953200000, birthday);

		birthday.toString = undefined;
		assert.equal(332953200000, birthday);
	});

	it("プリミティブ型 == Date以外のオブジェクトはvalueOfと試し、次にtoStringを試す", function() {
		var sut = {}
			,origin_value_of = sut.valueOf;

		assert.notEqual("hello", sut);

		sut.valueOf = function() {
			return "hello";
		}
		assert.equal("hello", sut);

		sut.valueOf = origin_value_of;
		assert.notEqual("hello", sut);

		sut.toString = function() {
			return "hello";
		};

		assert.equal("hello", sut);
	});

});
```

上記コードは全てパスするが途中でErrorになるのを何回か繰り返して最終的なコードになっている。

その修正確認もコマンドを叩くと即時結果がわかる。
まさに「復習のための繰り返しの機会が与えられ、またエラーを修正する機会も提供されるべきである」を提供している。

本には一覧表でまとめられていることを、コードとして確認してみると読むだけより理解が深まる。
実際、valueOfとtoStringの順序がDateオブジェクトとその他のオブジェクトでは比較順序が違うということは知らなかったし、==の挙動についてこのテストにより理解が深まった。

コードに書いてあるので復習として何回でも見れるし、コードを書いて結果がすぐに確認できるのは楽しい。

学習テスト、最初の一歩にとてもお勧めの学習方法である。
翻訳ツールのご紹介

### -神様、仏様、そして辞書様-

この記事はhttp://qiita.com/advent-calendar/2015/english_translation
の3日目の記事です。
(前日はコチラ http://qiita.com/Uemmra3/items/911f5bcb9cbef80ac27e)
(翌日はコチラ http://qiita.com/Uemmra3/items/06c0eeda5fafd44bef36)

# 翻訳ツールのご紹介
翻訳していくと、よっぽど語学堪能な人でない限り、わからない単語が出てくると思います。そんな時に役立つのは、やはり辞書をはじめとする翻訳ツールではないでしょうか。
まずは私がふだん使っているツールを紹介します。

## 辞書・用語集サイト
### ALCの英辞郎検索
http://eow.alc.co.jp/search?q=advent
私の使っている辞書サイトです。
Firefoxの**ピン留め**機能を使って、常に表示させています。

### Firefox OS 用語集
https://github.com/mozilla-japan/translation/wiki/Firefox-OS-Glossary
Firefox OSに関する定番の用語集です。他にMozilla用語集もあります。
同じくピン留めしています。

# その他のみなさまの使用ツール紹介
[MDNをみんなで翻訳Advent Calendar 2014](http://www.adventar.org/calendars/551)
にて、そんなエントリがいくつか書かれています。
[6日目](http://www.lifewood.net/2014/12/06/%E7%BF%BB%E8%A8%B3%E3%82%92%E5%A7%8B%E3%82%81%E3%81%A6%E3%81%BF%E3%81%A6%E3%80%82%E3%80%80-fxos/)
[8日目](http://www.gcg.bz/labo_blog/?p=964)
[10日目](http://chimantaea.blog8.fc2.com/blog-entry-148.html)
[13日目](http://uenoshin.hatenablog.com/entry/2014/12/13/225316)
そこで紹介されているツールを紹介してみます。
試した程度で使いこなしておらず、評価とかはできないのですが、みなさんの興味のあるものを試してみてください。

## アドオン
英辞郎 on the WEB https://addons.mozilla.org/ja/firefox/addon/eijiro-on-the-web/
英辞郎のアドオン

MozTran 
https://addons.mozilla.org/ja/firefox/addon/moztran/
Mozilla 製品で実際に使われている用語をリポジトリから検索する、Transvision(下の方に記載)のアドオン

## スマホアプリ
ウィズダム英和・和英辞典
https://play.google.com/store/apps/details?id=jp.ne.biglobe.wisdomdict.gp2&hl=ja
スマホアプリの辞書。紙版よりも安い

## 翻訳サイト
エキサイト翻訳
http://www.excite.co.jp/world/english/
自動翻訳のサイト。過信は禁物だけど、参考にはなると思います

Weblio辞書
http://ejje.weblio.jp/
ググった時によく上位に出てくる辞書サイト。内容はALC(=英辞郎)の方が充実してる気はします

IT用語辞典 e-Words
http://e-words.jp/
IT用語の確認に

## Mozilla関連
Transvision 
https://transvision.mozfr.org/
Mozilla 製品で実際に使われている用語をリポジトリから検索するサイト

ja.filters
https://code.google.com/p/mozja/source/browse/ja.filters
Windows/Linux と Macの用語を分けるスクリプト用のファイルらしいです

# まとめ
自分にあった翻訳ツールを取り入れてみましょう！
2015年Android冬モデル雑感



# はじめに

タイミングとしては非常に遅いですが、やっぱりやらなきゃなって思ったので、簡単なまとめと雑感を書きます。

情報はいつものように、[GPad](http://gpad.tv/)さん頼りです。


# 各キャリアの新製品一覧と雑感

## Docomo
[ドコモ、2015-2016 冬春モデル 新サービス・新商品発表会を9月30日12時より開催、新型 Android スマートフォン登場予定 | GPad](http://gpad.tv/topic/docomo-2015-winter-2016-spring-model-android/)

|端末名|メーカー|解像度|インチ|OS|チップセット|発売時期|
|:----|:------|:----|:----|:--|:--|:--|
|arrows Fit(F-01H)|富士通|720x1280 |5.0インチ|5.1|MSM8916|発売中|
|arrows NX(F-02H)|富士通|1440x2560|5.4インチ|5.1|MSM8992|11月下旬|
|Xperia Z5(SO-01H)|ソニー|1080x1920|5.2インチ|5.1|MSM8994|発売中|
|Xperia Z5 Compact(SO-02H)|ソニー| 720x1280|4.6インチ|5.1|MSM8994|発売中|
|Xperia Z5 Premium(SO-03H)|ソニー|2160x3840|5.5インチ|5.1|MSM8994|発売中|
|AQUOS ZETA(SH-01H)|シャープ|1080x1920|5.3インチ|5.1|MSM8992|発売中|
|AQUOS Compact(SH-02H)|シャープ|1080x1920|4.7インチ|5.1|MSM8992|12月上旬|
|Galaxy Active neo(SC-01H)|サムスン|480x800|4.5インチ|5.1|MSM8916|発売中|
|DiseyMobile (DM-01H)|シャープ|1080x1920|4.7インチ|5.1|MSM8992|1月下旬|
|Nexus 5X |LG|1080x1920|5.2インチ|6.0|MSM8992|発売中|


今回のDisneyMobileはAQUOS Compactがベースのようです。また、この他にdtabの新モデルd-01H、ガラケーのP-01Hが発表されています。

- [P-01H | 製品 | NTTドコモ](https://www.nttdocomo.co.jp/product/feature_phone/p01h/)
- [dtab d-01H | 製品 | NTTドコモ](https://www.nttdocomo.co.jp/product/tablet/d01h/index.html)

[前回の夏モデル](http://qiita.com/yamacraft/items/c8a7d62becf2ba2c0b32)ではAQUOS EVERの低スペックぶりに驚きましたが、今回Galaxyからは（堅牢モデルとはいえ）3年ぐらい前の解像度モデルが発表されてしまいました。しかもサムスンの機種はこれだけ。すごい。

また、Xperiaからはついに4Kディスプレイ解像度のモデルが出ていますが、[別の記事で書いたように](http://qiita.com/yamacraft/items/0da00eee47f3abaefe10)、実際には専用のアプリで動画や画像を見る際に4K表示となり、他は2K解像度として（アップコンバートして？）表示するようです。ディスプレイは出来てしまったけれど、AndroidOSがまだxxxxhdpiに対応していない、ということなのかもしれませんね。

他に注目すべき点としては、今回で足並みそろってAndroid 5.1以上の端末が発売されることになりました。他にもNexus 5Xが出たことにより、多少なり国内での6.0シェアが伸びる可能性がありますが、以前のGalaxy Nexusの悲劇（売れ行きとか、OSアップデート打ち切りとか）を考えると、言うほど重要度は低く感じています。

## au

auは今回の秋冬モデル発表会は行わず、実際に Xperia Z5(SOV32)のみが発売されています。（Docomoと同様なので表記省略）。

- [Xperia(TM) Z5（エクスペリア ゼット ファイブ） SOV32 | スマートフォン（Android スマホ） | au](http://www.au.kddi.com/mobile/product/smartphone/sov32/)
- [【再追記あり】KDDIが2015年au秋冬モデル発表会の見直しを検討中 | BUZZAP！（バザップ！）](http://buzzap.jp/news/20150929-au-2015-winter-no-event/)

いちおう噂レベルでGalaxy A8が近々出るのではないかと言われていますが、噂レベルですので省略します。

## softbank

|端末名|メーカー|解像度|インチ|OS|チップセット|発売時期|
|:----|:------|:----|:----|:--|:--|:--|
|Xperia Z5|ソニー|1080x1920 |5.2インチ|5.1|MSM8994|発売中|
|AQUOS Xx2|シャープ|1080x1920 |5.3インチ|5.1|MSM8992|発売中|
|AQUOS Xx2 mini|シャープ|1080x1920 |4.7インチ|5.1|MSM8992|1月中旬|
|Nexus 6P|フューウェイ|1440x2560 |5.7インチ|6.0|MSM8994|発売中|

夏モデルの時もそうでしたが、今回のAQUOS Xx2も、ドコモのZETA、Compactの名称違い版という感じがしますね。他にはドコモは5Xでしたが、ソフトバンクでは6Pが発売されます。こちらはXperiaシリーズのことを考えるとフラッグシップモデルとはいえ、5Xよりもユーザー数は少ないのではないかと見ています。

また、ソフトバンクはこの他にガラホ機種を3種、タブレットを1機種発表しています。

- [2015-16年冬春商戦向け新商品について | ソフトバンク株式会社 | グループ企業 | 企業・IR | ソフトバンクグループ](http://www.softbank.jp/corp/group/sbm/news/press/2015/20151008_09/)
- [Lenovo TAB2 | タブレット | 製品情報 | モバイル | ソフトバンク](http://www.softbank.jp/mobile/products/tablet/lenovo-tab2/)

# まとめ

- 思った以上に2K解像度端末は出ませんでした。タブレットも高解像度端末はありません。
  - もしかしたらFHD解像度時代はもう少し続くのかもしれません。
- 今回はキレイに5.1と6.0端末だけになりました。国内の（出荷時点での）最新OSへの対応の早さが少しずつ改善されているように感じます。
  - あとはOSアップデートをキチンとしてくれれば……
- Galaxy Nexusがキャリア販売されていた事実を忘れてはいけません。安易にNexusのシェアを夢見てはいけません。

現場からは、以上です。
issue を雑に作らないために

TL;DR: issue はテンプレート化すると良いです

---

皆さんちゃんと issue 作っていますか？

僕はそう言われるとちょっと気まずいです。

## 雑な issue 

まずは弊社のリポジトリの中から雑な issue の例を上げてみたいと思います(勝手に拝借しちゃってごめん...)。

<img width="524" alt="スクリーンショット_2015-12-01_19_29_54.png" src="https://qiita-image-store.s3.amazonaws.com/0/17704/5b40ea0c-dea6-729a-ef66-ffe7aa934b0c.png">


一目見ただけで沢山突っ込みどころありますよね！

- どの画面での遷移アニメーションだよ！
- そもそも遷移アニメーションってなんだよ！
- 再現手順は？
- どのバージョンで発生するの？
- バグならバグってラベル付けて！
- 誰かにアサインしようよ！
- 誰もこれ見て状況を把握できねぇよ！！！

という感じで大量に突っ込めます。

issue って便利なのでちょっと思いついたアイディアをタイトルだけメモみたいな感じで書いて作ってしまったりすることがあります。

それを後で見返すと、「この時何考えてたんだっけ..？」となったりします。もちろん他人が見ると完全に意味不明です。

また、普段はちゃんと issue を書いていても、忙しいときなど後でちゃんと書こうと思ったつもりで作ったけどそのまま放置されてしまうパターンも有ると思います。

## どうしよう

完璧な解決方法は無いですが改善する方法はあります。

その1つが issue のテンプレート化です。

[GitHub Issueはテンプレート化で、綺麗に書かせる！](http://qiita.com/yoshimikeisui/items/3e1873e3bf1bbafe8733) で紹介されているように GitHub の issue を開くときの URL にパラメータを渡すとそれが最初から入力された状態でページが開くので簡単に issue のテンプレートを作ることが可能です。

issue を作る度にいちいちテンプレートをメモってあるページを開いてそれをコピペして... とか面倒くさいですがこの方法なら、リンクをブックマークしておくだけで何時でも簡単に issue を作ることができます。

弊社ではこのようにリポジトリの中に CONTRIBUTING.md を配置してここから簡単にブックマークできるようにしています。

<img width="293" alt="スクリーンショット 2015-12-01 19.45.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/17704/25f3060a-a158-ecb7-a024-75117624461b.png">

これだけだと、先ほど挙げた記事の紹介だけで終わってしまうので、実際弊社でどのようにテンプレートを作っているのかについて書きたいと思います。

### より良いテンプレート

例えば弊社で使っている不具合報告のテンプレートはこんな感じです。

```
### 概要

- 不具合の内容
- iOS のバージョン
- 端末の種類
- 再現性ある or たまにしか起きない
- 報告ツイートなどあれば貼り付ける

### 再現方法

- 一定の手順が必要な場合は書こう

---

人にアサインしよう
```

このテンプレートは「最小限のことしかテンプレートに書いてないと、恐らく最小限のことしか書かなくなってしまう。」という考えから作られています。

必要そうなものがあったらモリモリ書いていこうという感じです。

こうすることで、 issue を作った時に「あれも書いておこう」、「これも書いておこう」とスムーズに項目を書くことができます。

これらの項目が無いと「何を書けばいいんだっけ？」と項目を思い出すところから始まってしまい非効率です。

先ほどのテンプレートを見ると一番最後の行に `人にアサインしよう` と書いてあります。

これは issue を誰にもアサインしないと責任者が不在の issue ができていつになっても消化されなかったり、挙げ句の果てには同じ内容の issue が作られて大変悲しいことになるのを防ぐためのルールです。

この事についてテンプレート化以外のアプローチとして紹介したいと思います。

### テンプレートだけじゃなくてガイドラインも作ろう

弊社にはテンプレートよりも偉い文章(憲法と刑法みたいな関係)として[開発ガイドライン](https://gist.github.com/mironal/c5866e098793bb17a390)という物があります(gist で公開しています)。 

[開発ガイドライン](https://gist.github.com/mironal/c5866e098793bb17a390)の issue の項目を見ると `人にアサインしよう` と太字で書いてあります。

これが issue を立てるときに一番大事にしているルールです。

しかし、常に人にアサインできるわけではありません。

そのような状況を[開発ガイドライン](https://gist.github.com/mironal/c5866e098793bb17a390)では `非開発者が issue を立てるとき` という項目で説明しています。

弊社ではユーザーサポートの担当がいて、ユーザーからのバグ報告によりバグの issue を作る場合が良くあります。

しかし、開発者ではないのでそのバグを誰が直すのが一番早いのかなど適任者はすぐに分かりません。

さらに、 issue を立てる度に開発者に聞いて回って誰にアサインすれば良いのかを決めるのも非効率です。

そこで

```
その場合はとりあえず自分にアサインした後にどこかで開発者側と時間を取って アサインを行いましょう。

Issue を作るごとに開発者側と話し合うと時間を無駄に消費してしまうので 複数個作ることが想定される場合はまとめて話し合いを行えるようにしましょう。
```

というルールを設けています。

### まとめ

- テンプレートを作ろう
- できればガイドラインも作ろう

これらの文章を作る上で気をつけてほしいことがあります。

弊社ではこれらの文章はみんなで話し合って、必要性を共有したうえで作っています。

もしこれが、誰かの思いつきで一方的に作って、一方的にみんなにやらせるというようなものならなんの意味もないものになってしまいます。

是非、メンバーで話し合ってみんなで作ってみてください。

何故みんなで作ったほうがいいのか？というふわふわした内容に関してはこちらの記事を呼んでみてください。

> [コミュニケーションって何をすることなの？](http://qiita.com/mironal/items/e48e403ec579f5228844)
Kivyの設定画面について

#あらまし
ネット上ではたびたび触れられていますが、書籍等では情報が少ないのでメモ。

#Kivyの設定画面
Kivyはデフォルトで設定画面を持っています。
Kivyのアプリケーションを実行中にF1キーを押すことによって開くことができます。
![kivy-settings.PNG](https://qiita-image-store.s3.amazonaws.com/0/98851/cf31aacb-b15d-c7f5-7a98-5fc9981a3dee.png)

これによりKivyの設定を変更することができるので簡単なデバッグに使用したりできます。
この設定画面はカスタマイズ可能でアプリケーション向けの設定を作ることができます。

##カスタマイズした設定画面の作り方
先ず設定用ファイルを用意します。

```ini:myconf.ini
[section1]
key1 = value1
key2 = 40
```

次に設定用のパネルを追加するためにJSONを用意します。

``` json:settings_custom.json
[
    {
        "type": "title",
        "title": "Windows"
    },
    {
        "type": "options",
        "title": "Test",
        "desc": "test settings",
        "section": "section1",
        "key": "key1",
        "options": ["value1", "value2", "value3"]
    },
    {
        "type": "numeric",
        "title": "Test",
        "desc": "test settings2",
        "section": "section1",
        "key": "key2"
    }
    
]
```

最後に以下のように記述すればOKです。

``` py:main.py
# -*- coding: utf-8 -*-
import kivy
kivy.require('1.9.0')

#設定用
from kivy.config import ConfigParser

from kivy.uix.button import Button
from kivy.app import App

class sampleApp(App):

    def build_config(self, config):
        #設定用のファイルを使用(myconf.ini)
        config.read('myconf.ini')

    def build_settings(self, settings):
        #設定用のパネルを追加(settings_custom.json')
        settings.add_json_panel('Setting Panel', self.config, filename='settings_custom.json')

    def build(self):

        return Button(text='hello world')

if __name__ == '__main__':
    sampleApp().run()        
```

アプリケーションを実行してF1を押してみると
![settings.PNG](https://qiita-image-store.s3.amazonaws.com/0/98851/b5325443-9d26-95e4-b142-56a05cbd86bc.png)

カスタムした設定画面が表示されます。

以上。設定画面の説明でした。
「間違ってるよ」などがありましたらお気軽に教えてください。

###最後に
例のごとく、Kivy勉強会もよろしくお願いします。
http://pyky.connpass.com/
最近の(フロントエンド)のチーム開発状況


こんにちは、hondam です。
ファーストサーバではフロントエンドの開発を担当しています。

今日は"ファーストサーバのなかのひと"としてAdvent Calendarの２日目用に投稿します。

さて、ファーストサーバでは今年の2月にホスティングサービスを刷新、「[Zenlogic](https://zenlogic.jp/)」というサービスをリリースしましたが、その際に所謂コントロールパネル(メールやFTPアカウントの作成、データベースの設定等を画面から行う専用のWEBアプリケーション)もリニューアルされました。

主なアーキテクチャやツールのリニューアル前後の比較です。

|　| Before | After |
|---|:---|:---|
| 言語 | Perl/PHP | Ruby |
| フレームワーク | 特になし | Ruby on Rails |
| フロント用フレームワーク | 特になし | React/Redux |
| バージョン管理 | Subversion | Git(GitHub) |
| ブランチモデル | なし | GitHub Flow |
| かんばん | なし | ZenHub |
| CIサーバ | なし | Jenkins |
| テストサーバ | なし | Docker |
| 開発手法 | ウォーターフォール | スクラム |
| コミュニケーション | IRC/メール | Slack |
| ノウハウ共有 | Wiki | Qiita:Team |
| 開発OS | Windows | Mac |
| 端末 | PC | MacBook Air |

Beforeの状況はちょっと大げさですが、リアルにこんな状況でした。
Afterを見てもらうと、割とモダンな構成になっているのがわかると思います。

IssueをZenHubで管理しつつ、最短1週間スプリントでどんどんコントロールパネルの改善を行っていきます。
振り返りは2週間に1度ですね。プランニングポーカーは定着しなかったです。

ZenHubを採用したのは、GitHubのデフォルトのIssueが状況を把握しづらかったためです。アナログなかんばんにしなかったのは、社内の座席が離れているためかんばん前に集まるのが面倒だったり、以前にも何度かトライしつつも定着しなかったのが理由です。

ちなみにZenHubのパイプラインは次のように分けています。

| パイプライン名 | 概要 |
|---|---|
| Backlog | Issue作成直後 |
| In Milestone | Issueのマイルストーンが決まった場合 |
| In Progress | 実装中 |
| In Review | Pull Requestのレビュー中 |
| Sandbox | Sandbox環境にデプロイした |
| Sandbox OK | Sandbox環境でのテストが完了した |
| Backstage | Backstage環境にデプロイした |
| Backstage OK | Backstage環境でのテストが完了した |
| Done | Staging環境へのデプロイ準備が完了 |

かんばんアプリの場合はこういったパイプライン分けも手軽に行えるのが魅力です。
他候補としてはWaffleやHuBoard、Trello等ありましたが、GitHubのIssueとの連携が強力だったのでZenHubを採用しました。(デメリットはChromeの拡張機能なのでChromeを使わないといけないことですね)


ブランチモデルはGitHub Flowを採用しているので、基本的にPull Requestベースの開発となります。デプロイはDocker環境(テストビルド)、Sandox, Backstage, Staging, Productionの順になります。Productionまでに各環境でテストが行われます。

コミュニケーションは基本的にSlack上で行い、GitHubやJenkins等様々なサービスと連携しています。Slackは2年近く使ってます。最初は開発チームのコミュニケーション改善を目的に導入しましたが、今ではほぼ全社的にSlackでコミュニケーションをとっています。特に運用のルールは設けていません。チャネルは個人単位(分報用)からプロジェクト、機能、アプリケーション、部など様々な単位で設けられています。

とまぁこんな感じで最近のファーストサーバのフロントエンドは開発されています。
以前に比べ、格段にリリース頻度が増え、品質への取り組みも充実しています。

今後も継続的にZenlogicのコントロールパネルは改善されていきますので、注目してみてください。
Chainer1.5.0をWindowsにインストールする

Chainerは、1.5.0からCython、h5pyへ依存するようになりました(経緯、および詳細は以下をご参照ください)。

[pfnet/chainer v1.5.0](https://github.com/pfnet/chainer/releases/tag/v1.5.0)
[Chainer 1.5のインストールがうまくいかない人への非公式なTips](http://qiita.com/unnonouno/items/c491b6df59352159cbf0)

このため、今まで`pip install chainer`でさくっと入っていたものがちょっと手間になりました。特にWindows環境ではダメージが大きいので、Windowsへのインストールについて解説します。
なお、インストール時のPythonのバージョンは3.5です(Chainerはすでに[Python3.5に対応しています](https://github.com/pfnet/chainer/issues/526)!)。

## Visual Studioのインストール

Cythonは、C/C++の型などPythonにいくつかの記法を加えたものから、実際のC/C++コードを生成し、利用するための仕組みです。これによりPythonの簡易な記法とC/C++の実行速度の両方を手にすることができます。

[NumPyが物足りない人へのCython入門](http://www.slideshare.net/lucidfrontier45/cython-intro)

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/8eefa796-2e76-d758-a743-b6525001de7e.png)


ただ、C/C++のコードを実行する都合上これらのコンパイルが必要になるため、インストールに当たって導入しておく必要があります(具体的にはChainerの中のCythonで書かれた部分から生成されるC/C++コードをコンパイルするために必要)。

WindowsにおけるC/C++コンパイラはVisual Studioに付属するため、これをインストールします。Python3.5の場合、Visual Studio 2015になります(CommunityでOK。ただし、インストール時にVC++にチェックを入れる必要あり)。

[Visual Studio Download](https://www.visualstudio.com/downloads/download-visual-studio-vs)

なお、コンパイラにはバージョンがあり、これとVisual Studioのバージョンは基本的には合わせる必要があります。

[Using Microsoft Visual C with Python](https://matthew-brett.github.io/pydagogue/python_msvc.html)

基本的には、PythonのMSC_VERから6を引いたものがVisual C++のバージョンになります。Python 3.5の場合、以下のようにMSCのバージョンは19になるので、Visual C++のバージョンは13・・・がないので14、つまりVisual Studioは2015になります(恐らく、以後一つずれるので今後は6でなく5を引くことになると思われます)。

```pycon
>>> import sys
>>> sys.version
'3.5.0 |Continuum Analytics, Inc.| (default, Nov  7 2015, 13:25:22) [MSC v.1900
32 bit (Intel)]'
```

[Microsoft Visual C++/製品バージョンと内部バージョン](https://ja.wikipedia.org/w/index.php?title=Microsoft_Visual_C%2B%2B&section=10#.E8.A3.BD.E5.93.81.E3.83.90.E3.83.BC.E3.82.B8.E3.83.A7.E3.83.B3.E3.81.A8.E5.86.85.E9.83.A8.E3.83.90.E3.83.BC.E3.82.B8.E3.83.A7.E3.83.B3)

とはいえ、せっかくインストールするのに古いVisual Studioを入れるのも嫌だと思うので(Python2系はずっと前ですし・・・)、レジストリの編集によって最新版の設定を利用することが可能です。
コンパイルに使われる`vcvarsall`は`distutils.msvc9compiler.find_vcvarsall`の中で取得されるので、ここで参照される以下のレジストリの値を書き換えてしまいます。

* 64bit: HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VisualStudio\(VC++のバージョン)\Setup\VC
* 32bit: HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\(VC++のバージョン)\Setup\VC

この中にある、`ProductDir`の値を見ています(例: (例: C:\Program Files\Microsoft Visual Studio 14.0\VC\))。
上記のキー、値がない場合は新しいキー/値を追加し、実際インストールしたVisual StudioのVC++フォルダを設定しておきます。
※なお、上記の参照されるレジストリの値はPython3.5から変わります。`distutils._msvccompiler.py`に記載がありますが、`HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\SxS\VC7`の中の、キー名: Visual C++バージョン番号(例: 14.0)、値: Visual C++のフォルダになります。


## Numpy, h5pyのインストール

お疲れ様でした。あとはもう簡単です。
依存するNumpy, h5pyを以下から落としてきて仮想環境(virtualenv)にインストールします。`conda`を使っている場合、conda経由でも構いません。

[Unofficial Windows Binaries for Python Extension Packages](http://www.lfd.uci.edu/~gohlke/pythonlibs/)

## Chainerのインストール

メインの依存ライブラリは導入済みなので、後は以下でインストールできるはずです。

```
pip install chainer
```

※64bitの場合これで入らない？ようなので、その場合は`git clone`でソースを落としてきてからそのフォルダに移動し、`python setup.py build`から`python setup.py install`をやってみてください。

お疲れ様でした！
【FileMaker】SQLはフィールド設定でも書ける

FileMakerでSQLを書けるのは[以前の記事](http://qiita.com/tyuma/items/b15136a53c34e06f77de)でも書きましたが、「ここでも書ける」というのを紹介します。

**SQLはフィールド設定でも書けます。**

これを使えば、リレーションシップ設定がなくてもデータを引っ張ってこれます。
（リレーションすればいいのでは？というのは今回無し、ということで）

以下、サンプルです。

○テーブル

|テーブル名|概要|
|:--------:|:--------:|
|FMTest|トランザクションデータ|
|SystemMaster|システムデータの入ったマスタテーブル|

SystemMasterにあるとあるシステム値をFMTestテーブルにグローバルに持って活用したい、という事例です。

![スクリーンショット 2015-12-01 11.28.44.png](https://qiita-image-store.s3.amazonaws.com/0/60538/8fd9048e-4c78-7695-59dc-986b96271157.png)

システム情報として、上記のようなマスタテーブル構成で、以下のようなデータを保持しているとします。

![スクリーンショット 2015-12-01 11.28.58.png](https://qiita-image-store.s3.amazonaws.com/0/60538/cad5ea84-09d7-0c47-c3cf-9bc365a91c32.png)

適当な値が入っていますが、システム値ということで、例えば「出力ディレクトリフルパス値」「消費税率」のようなシステム固有で持っている共通情報という感じです。

これを、FMTestテーブルで活用したいということで、FMTestのsystem1フィールドに保持できるようにSQLを計算値に書いておきます。

![スクリーンショット 2015-12-01 11.28.25.png](https://qiita-image-store.s3.amazonaws.com/0/60538/0afad05c-296a-53aa-56e9-ebc72129f01a.png)

ここではwhere条件を引数なしでベタで書いていますが、引数も書けますので、詳しくは[こちら](https://www.filemaker.com/help/14/fmp/ja/html/func_ref1.32.185.html)の解説をどうぞ。

FMTestテーブルのsystem1はグローバルフィールドに設定してあるので、FMTestでsystem1が取得されていることを確認してみましょう。

![スクリーンショット 2015-12-01 11.29.10.png](https://qiita-image-store.s3.amazonaws.com/0/60538/1a08f0a7-a5d4-991f-e00a-ce0f9bc11259.png)

はい！
FMTestのsystem1に、SyStemMasterに保存されているid=1のname内容が取得できています。

いちいちリレーションするのめんどくさい（邪道！？）ときには、ExecuteSQLで持ってくるという小技もあること、ちょっと覚えていてもいいかもです。

ちなみに、SQLと聞くと、共有設定で接続しないととか考えるかもしれませんが、同一FMファイル内でしたら当たり前ですがそんな設定無しでSQLを書けます。
SQLに慣れ親しんでFMワールドに来た方、ぜひともSQLもFMで活用してください。
（私だー）
ダイクストラ探索(1956)

ダイクストラ探索は、エッジのコストが非負のグラフ探索用のアルゴリズムです。均一コスト探索とかいう別名もありますが、ダイクストラというわかりやすい固有名詞で呼ばれることのほうが多いと思います。
(負のコストを含むグラフについてはベルマン・フォード法を使います。
このアドベントでは非負のグラフを中心に紹介をしていきますが、
ベルマンフォードを書いてくれる人がいれば嬉しいです。)

この手法は1956年、奇しくも? ダートマス会議と同じ年に考えられた手法です。
オランダのエドガー・ダイクストラさんに発見されて、本人の名前がついています。
この先生、他にも死ぬほどアルゴリズムを発見されているみたいですね。あんまり知らない。

グラフ探索でダイクストラを使う一番の理由は、先ほどの幅優先探索では最適コスト探索を行えないことです。例えば下の図。幅優先では、上のノード $v$ を展開した後、下の辺を通って $v_g$ を展開してしまいます。この時に発見される経路はコスト5です。一方、正しい最適解は、上のノード $v$ を通るコスト2の経路です。

![dijkstra-inadmissible.png](https://qiita-image-store.s3.amazonaws.com/0/6090/850ca63c-79c8-8ace-d1f0-d4a972ab6cf4.png)

# Dijkstra's Algorithm

じゃあ、どーするの? ダイクストラのアルゴリズムは、基本は幅優先探索がベースです。必要な変更点は2つ。

1. キューを **優先度付きキュー** にすること。
    2. ノード $n$ の優先度は、スタートからノード$n$までの **現在の** 最小コスト。
2. より短い経路が見つかった時に、ノードの最小コストを更新し、キューに再度追加する機能。

これらの変更により、ダイクストラは常に最適解を返すことができます。

最小コストの更新機能が加わったことにより、探索ノードは「まだ調べていないノード」と、「最小コストであることがわかっているノード」に分ける必要があります。この前者を OPEN , 後者を CLOSE と言う集合に保存します。OPENは優先度付きキューですが、CLOSEはただの集合で構いません。実装によっては、CLOSEは明示的なデータ構造が必要ない場合もあります。ダイクストラ始め主要なアルゴリズムの高速な実装を行うための詳細は、Burns et. al. を参照してください。

Burns, Ethan Andrew, et al. "Implementing Fast Heuristic Search Code." Proc. Symposium on Combinatorial Search. 2012.

Algorithm: $Dijkstra(V,E,v_0,v_g)$:

1. Let $OPEN$: a priority queue.
2. Initialize: $push(v_0,cost(v_0),Q)$ 　 /* note: $cost(v_0)=0$ */
3. Until $empty(OPEN)$
    * Let $v \leftarrow popmin(OPEN)$ 　　/* (注1) */
    * $push(v, CLOSE)$ 　　　　　　/* or mark CLOSE */
    * When $v = v_g$ then return $reverse(unfold(parent, v_g))$
    * Else, for each $v' \in children(v)$ do
        * Case $v' \in CLOSE$
            * If $cost(v) + cost(v,v') < cost (v')$
                * $update(v',v)$
                * $remove(v', CLOSE)$
                * $push(v',cost(v'),OPEN)$　　/* reopen node */
        * Case $v' \in OPEN$
            * If $cost(v) + cost(v,v') < cost (v')$
                * $update(v',v)$
                * $remove(v', OPEN)$
                * $push(v',cost(v'),OPEN)$　　/* reinsert node */
        * Otherwise, always
            * $update(v',v)$
            * $push(v',cost(v'),OPEN)$　　/* open node */
* return nil

ただし、 $update(v',v)$ は

* $cost(v')\leftarrow cost(v) + cost(v,v')$
* $parent(v') \leftarrow v$

です。

ノードの新しい最小経路が見つかった場合には、親とコストを更新して再度OPENリストに追加する、というのがアルゴリズムの核です。この場合、下のグラフでは

![dijkstra-inadmissible.png](https://qiita-image-store.s3.amazonaws.com/0/6090/850ca63c-79c8-8ace-d1f0-d4a972ab6cf4.png)

1. $v_0$を展開(OPENの中の最小コスト0)
2. $v,v_g$ をOPENに追加
2. $v$ を展開(OPENの中の最小コスト1)
3. $v_g$ をReinsert (コスト2)
4. $v_g$ を展開

と動作することで、最適解が求まります。

# Dijkstra's Algorithm : Variations

このアルゴリズムにはまだ自由度があります。その1つは、2つ以上のノードが同じ優先度の場合のTiebreaking手法です(注1)。今日は置いときます。

もうひとつの自由度は、OPENの実装にあります。もし辺のコストが整数で、考えられるコストの種類が十分に密なら、 $O(1)$ の配列ベースの実装を用いるのが速いです(配列のインデックスがコスト)。辺のコストが実数値で、沢山のコストが考えられる場合には、ヒープや赤黒木を用いた $O(\log n)$ 挿入 の優先度つきキューが必要です。

以上。
フリーランスの始め方

フリーランスの始めるとき。
何から始めたのか、とりあえず自分の経験談で書いておきます。

# きっかけ

　自分がフリーランスをはじめたきっかけは、
　「やりたいビジネスがある」
　「自分でコンテンツやサービスが出来た」
　なんて、ポジティブな理由では無いです。

　当時勤務していた会社の社長と大喧嘩して、無職になって途方に暮れていたとき、たまたまその会社との取引先から声をかけて頂いて、仕事をしたのが初めてのフリーランスの仕事です。

　とりあえず、仕事をしちゃったので、これからどうするか。てな感じで、準備は後付けです。

　フリーランスをやるなら、自分の真似はオススメしません。

# 準備

　ネットにいろいろ先人達の知恵が載っているけど、準備として行ったのは、下記のモノを仕事道具として揃えたこと。

　１．パソコン
　　　ノートパソコンが良いです。まあ、開発用途なら最近はMacもWindowsもそんなに
　　　大差無いのでご自由に。
　　　ただ、お客さんからの仕様書や資料、見積書、請求書などの閲覧と作成にオフィス
　　　ソフトが必要なので、そこの必要性は考えた方が良いです。

　２．名刺
　　　名前とメールアドレス、携帯などの電話での連絡先を書いてある名刺があると便利です。

　３．仕事用の携帯電話
　　　私用と仕事用の携帯電話は分けた方が、いろいろと楽です。（いろんな意味で）
　　　ちょっと前は、ドコモが番号を２つ持てるサービスがあったんだけど、無くなっ
　　　ちゃいましたね。

　４．屋号
　　　あると何かと便利です。いろいろとねｗ
　　　屋号って会社名と似ていますが、個人でも作ることが出来ます。

　５．仕事用の銀行口座
　　　法人ではないので個人口座ですが、新たに別の銀行や支店で作っておくと、後々
　　　便利ですよ。

　６．独自ドメインのホームページやメールアドレス
　　　屋号がまだ決まっていなかったりしたら、後でも構いませんが、仕事をする上で、
　　　メールの仕分けとかが楽だったりします。
　
　準備は、こんな感じです。

　厳密には、個人事業主なら税務署に届け出出さないといけないし、国民健康保険や
　国民年金の手続きもあるので、役所通いが大変でした。

# 始めたこと

　フリーランスになって、始めたことがいくつかあります。

　１．勉強会に参加する
　　　意外に参加するとメリットがある勉強会が多いです。
　　　中には、残念な勉強会もありますが、場数の経験で頑張りましょう。

　２．クラウドソーシングのサービスに登録する
　　　仕事のトレンドを見るだけや募集内容を見るだけでも、参考にはなります。
　　　仕事の報酬額が安すぎるので、その金額で見積すると、自分のクビを締めることに
　　　なるから気をつけて！
　　　安く仕事を請けてしまうと、業界全体の単価が下がるということも意識しようね。

　３．大手企業主催の技術者向けカンファレンスに参加する
　　　Ａ社さんのイベントは、無料なのに結構豪華だったり、Ｏ社さんのイベントは、
　　　セッションの最初に免責事項が必ず出て来て苦笑したり。
　　　有料のイベントや、名刺がないと入れないイベント、法人のみのイベントなんか
　　　様々ですが、情報を仕入れる先としては良いです。

　４．ユーザグループのイベントに参加する
　　　コミュ障殺しのユーザグループや歴史があって新参者は参加しづらいイベントも
　　　ありますが、普通に参加するだけなら被害や危害は無いので大丈夫ｗ
　　　新しい仕事のきっかけにもなるので、頑張りどころかも。
　　　
　５．コワーキングスペース巡りをする
　　　会社で仕事をしなくちゃいけない束縛から解放されるので、自宅で引き籠もるよりは
　　　コワーキングスペースのドロップイン巡りや、電源と無線ＬＡＮが使えるカフェで
　　　ドヤ顔でＭａｃを開くということも出来るぜ。
　　　コワーキングスペースは、会員専用なところがあったり、ドロップイン（一時利用）も
　　　料金が５００円〜４０００円と様々なので、事前に調べた方が吉。
　　　基本、一時利用の人に干渉してくることは無いので、うるさく感じたら立ち去ればＯＫ。
　　　常宿ではないけど、常コワーキングスペースをいくつか持っておくと、仕事で使えるかも。


# その後

　フリーランスを始めると、サラリーマンと異なり、全てを自分でやらなくちゃいけないので、ハッキリ言って大変です。
　
　・商談
　・提案資料作成（プレゼンとかコンペとか）
　・見積り、見積書作成
　・契約書の確認と締結
　・進捗連絡や報告、問い合わせ対応
　・納品
　・請求書作成
　・入金確認（これ重要！！！）

上記の作業が通常作業。
あと、年に１回の確定申告や納税なんかもつきまとう。

事務処理してくれる彼女（彼氏）がいたら、大変助かるんだけどねぇ。。。。。。
Bluemix仮想マシンでお絵かきアプリを10分で公開する

Advent Calendar用に投稿するのでクリスマスツリーを皆んなで飾れると楽しいと思い、reichatをBluemix仮想マシン上のDockerに10分で公開する事にしました♪ :smile: 
reichatとはコチラです。https://r2.ag/reichat-preview/

Bluemixの仮想アプリは以前触った時から比べて随分と使いやすく（簡単に作れるように）なってますね♪

#仮想マシンの作成
まずBluemixのダッシュボードから「仮想マシンの実行」をクリック。
![image](https://qiita-image-store.s3.amazonaws.com/0/99329/8fed7d4d-10a7-c089-7ad5-bafe5c8c1675.png)

##情報の入力
仮想マシンの作成画面でCentOSを選んで、パブリックIPを割り当てて、鍵の追加を押します。
![image](https://qiita-image-store.s3.amazonaws.com/0/99329/40e90fd3-1227-376d-1445-6975e1fc122e.png)

##鍵の作成
鍵の追加ポップアップが出るので適当な名前を記入してOK
![image](https://qiita-image-store.s3.amazonaws.com/0/99329/807af5e3-fc59-e381-3623-402cf5de835f.png)

鍵が出来ました。
![image](https://qiita-image-store.s3.amazonaws.com/0/99329/6bed590a-2286-4dbd-76db-9fcfd6077325.png)
自動的にダウンロードもされます。
![image](https://qiita-image-store.s3.amazonaws.com/0/99329/e6efd8e5-64f0-ff46-3239-64df7519b295.png)

昔触った頃は鍵の作成は無くて、事前に作った鍵を登録する方式でした。この手の作業で作る鍵ってどれが何の鍵だったか分からなくなって、昔使った作業用のフォルダも削除しがたく次々と増えていく。。。なんて事があるので、このようにその場でそれ専用の鍵を作ってくれるのは個人的にかなり嬉しい改善点です :smile: 

ポップアップを閉じると作った鍵の名前が設定されています。
![image](https://qiita-image-store.s3.amazonaws.com/0/99329/e873d92c-15d1-e5aa-9cd3-ba9d0c1aa093.png)

##作成完了
作成して少し待つと完成♪ IPとIDが明記されて分かりやすいですね。昔は誰でログインすりゃ良いのか分からなくてハマったもんですw
![image](https://qiita-image-store.s3.amazonaws.com/0/99329/b29fef7c-8ade-6c52-021b-00ba5ac8e3de.png)
（残念ながらこの作成＆プロビジョニング作業はエラーになったり、応答が返ってこなかったり、完成度がイマイチですね。画面上エラーになっても再描画すると正常に出来ていたり結果もマチマチです。上手く作れてないようなら削除してもう一回作ってみるってのが一番悩まずに済む気がします :sweat_smile: ）

#接続
早速TeraTermから繋いでみます。先ほど作成した鍵を使ってログインするのでセキュリティも万全です。
![image](https://qiita-image-store.s3.amazonaws.com/0/99329/8bccbdee-d36f-7f75-32e4-78bb8a26aa5c.png)

繋がりました♪
```[ibmcloud@host-192-168-0-17 ~]$```

#Dockerのインストール～reichatの実行
以下コマンドだけ抜粋。
```$sudo yum -y install docker```
```$sudo service docker start```
```$sudo docker pull uzyexe/reichat```
```$sudo docker run -p 10133:10133 uzyexe/reichat```
使ったDockerイメージはコチラです。 
https://hub.docker.com/r/uzyexe/reichat/

#reichatを使ってみる
http://129.41.136.254:10133/reichat.html
![image](https://qiita-image-store.s3.amazonaws.com/0/99329/a823fc3c-c39f-96a6-6e42-610fa436c4c6.png)

実質10分もかかってないですね。いやはや凄い時代ですね～！ 
とりあえず12/25まではこのまま起動しておくので、是非この記事を読んだ方はクリスマスツリーに飾り付けを追加してみて下さい :smile: 
12/25に綺麗なツリーになってるとイイな♪
無変換キーを左エンターキーに

## 無変換キーを左エンターキーに

Dvorak Advent Calendar 2日目．

JIS配列キーボードを使っていて，無変換キーを使っていないのであれば間違いなくオススメの設定．
右手親指でエンターキーが打てるので右手小指で従来の左エンターキーを押下する必要がありません．
早くタイピングできます．
Dvorakに関係なくオススメ．
windows10 の powershell やコマンドプロンプトはコピペがやりやすくなった

## windows 10 より前の問題点
+ Ctrl + C や Ctrl + V が使えない
+ コマンドの結果をコピペしようとすると短形選択になる

## windows 10 では
+ Ctrl + C や Ctrl + V が使えるようになった
+ コマンドの結果をコピペしようとしたときに、短形選択ではなく通常のテキストエディタのように行選択できるようになった

### 設定方法
+ PowerShellのプロパティを開き、下記の設定ふたつを有効にする
  + Ctrlキーショートカットを有効にする(自分の環境だとデフォルトチェック済み。というかチェックを外してもCtrl+Cが普通につかえた。。。なぜ？)
  + 行の折り返し選択を有効にする

![powershell_property.PNG](https://qiita-image-store.s3.amazonaws.com/0/18789/30f8de04-688c-505b-8ce3-5aa51b376ac9.png)

## まとめ
+ 今までコピペが面倒でPowerShellを立ち上げなかったような作業も、気軽にPowerShellで作業できるようになりました！
  + `(ls).name` や `(ls).fullname` でファイル名一覧を出してコピペとか
  + `(iwr http://example.com).headers` でヘッダーだしてコピペとか
取り組みたいクロスプラットフォームアプリの領域 : ドローン/自動運転車/観光、そして、知的教育。

一人(+α)のアドベントカレンダー2日目。
Kotlin+RoboVMで挑むクロスプラットフォーム開発試行錯誤。
当初の数日は、クロスプラットフォーム開発に挑む理由について書く。

自分は、クロスプラットフォーム開発というものが、今後どんどん一般化していくと思っている。今日はその根拠と考えている、音声インターフェイスの広がり予想について。

#開発ターゲット①　知能アシストアプリ。
昨日、[4) 自分がクロスプラットフォーム開発に取り組みたい理由 : 音声インターフェイスの今後の進化](http://j.mp/kmry001)として、こう書いた:
> ...このあたり、コールセンターの人工知能化のトレンドと併せて捉えるべきだ。
今後さらに高機能大容量化していくスマートフォンでは、その気になれば、高度な音声アシストインターフェイスを持ったアプリを実行できる。エンドユーザーからの特定の問い合わせに素早く応えたいユースケースにおいては、サーバー側ではなくスマートフォン側でコールセンター的な人工知能を走らせることが考えられる。自分は、コールセンター的な人工知能というロジックを、iOS環境とAndroid環境と、そして、サーバー側とで共有することにクロスプラットフォーム開発のメリットを見出している。快適な音声インターフェイスのロジックは肥大する、と自分は考えている。

音声インターフェイスのロジックを実装するスマフォアプリの想定は、例えば以下のようなもの:

## a) さまざまなモノへの(多言語での)音声指示/問い合わせ

例えば、ホビー向けのドローンを屋外で、スマフォで操作、といった際のUXは音声の方が快適だろう。

例えば、森林で:
>ドローンから得られるプレビュー動画を眺めながら、離陸、もっと上昇、右の方に行って、そこのタヌキで写真をぱしゃり。

(この手のコマンド系の音声インターフェイスは、多言語に対応してほしいところ。)

ホビー向けの実装に興味が無い人は、以下を読んだ上で、近未来のドローンに業務上(あるいは軍事上?)の指示を出す場面を想定してもらっても良い。

[30分以内の配達を実現するAmazonの配達ドローンが劇的進化、着陸方法など最新版ムービー公開](http://gigazine.net/news/20151130-amazon-prime-air-in-30-min/)

また、災害対策分野での意欲的な取り組みも構想されている*(ぜひとも応援を!)*:
[ドローンで災害地を救え！世界初の救援隊「DRONE BIRD」始動](https://readyfor.jp/projects/dronebird)

もちろん、UberやGoogleやAppleやToyotaなどが今後デットヒートを繰り広げていく自動運転車の世界においても、音声インターフェイスは広く用いられていくだろう。行き先を告げる、道路状況を聞く、などなど...自動運転車には当然Bluetoothその他のインターフェイスが実装されるだろうから、特定のメーカーにロックインされたくない人は音声インターフェイスを、自分のスマフォ経由に設定するのではないかと予想する。

## b)インバウンド観光ガイド
私事だが、今回のアドベントカレンダーは、5つの国に滞在しながら書く。そのうち台湾とオマーンは初訪問。
そのうち、台湾はストップオーバーを利用しての一人観光。短い時間で、中国語ができないままに、ちょっと楽しみたいと思っている。こうした際に、目的地に道案内してくれて、小銭代わりになって、ちょっとした通訳機能を持っていて...といったアプリがあると心強い。海外でのパケット代はまだまだ高い。なるべく、オフライン+スポット毎のWifi接続で乗り切りたい。こんなニーズに応えるアプリでは音声インターフェイスが積極活用されるべきだろう。

*#このあたり、Fintech(決済、送金...)とも絡むところだと思うのだが、そちらはまたの機会に。*

#開発ターゲット②　教育(ゲーミフィケーション)

クロスプラットフォーム開発が既に一般化しているゲーム業界。ゲーム業界では、古くから知能ロジックが活用されてきた(例、20世紀末頃のシューティングゲームでの、賢い、キャラの立った敵機etc)。

近時は、人工知能研究者が「人狼知能大会」なるゲーム大会を開催している:[参考記事](http://ascii.jp/elem/000/001/043/1043020/)。

記事の方から引用する:　　*#そもそも人狼って何という人 => [wikipedia](http://j.mp/AreYouWerewolf)。*

>人狼は「不完全情報ゲーム」。情報に限りがあり、プレイヤー同士で情報量に偏りがある中で真実を見抜く必要がある。さらに「人狼」側になったときは、事実にもとづいた推理で誤った結論に相手を導かなければならない。
　他者を理解し、不完全な情報をもとに正しく推理する。あえて味方を「追放」したり、自分たちを最終的に有利な方向に導くため、あらゆる行動を考える。

ゲーム理論などを知っている人には興味深い記述だろう([日経記事](http://www.nikkei.com/article/DGXMZO91486770Y5A900C1000000/)もある)。ここでは、このレベルの知能ロジックが音声インターフェイスと結びつく近未来を想像して欲しい。

例えば、グーグル配下となったボストン・ダイナミクス社のロボット犬:
http://www.bostondynamics.com/

[グーグルの軍用犬型ロボットが米海兵隊によりついに実地テストへ](http://karapaia.livedoor.biz/archives/52201408.html)というニュースも報じられている。犬型の軍事ロボットは、おそらくは、飼い主というか主の兵士と音声コマンドでインターフェイスを取りながら、"敵性の存在"と「不完全情報ゲーム」を繰り広げることを想定して開発されることになるだろう("敵性の存在"は軍事ドローンかもしれない...)。

敵味方に分かれて競い合う人狼ゲームからきな臭い方向に話が向いたが、「不完全情報ゲーム」そのものは、社会に諸現象をモデル化したもの。この系統の人工知能は、さまざまな教育用途に活用できるだろう(もちろん、軍事教育も典型ユースケースの一つ)。こうした教育の現場では、音声インターフェイスの活用は望ましい。


# 本日の結論
モノのインターネットとか、Internet4.0といったバズワードで語られている今後の世界において、音声インターフェイスは、広く用いられるものと予測。

明日は、音声インターフェイスのように大きめの共通ロジックを含むアプリを、クロスプラットフォームで開発するための基本構成Tipsを書く。
180円でArduino にバッテリー機能付き RTC を追加して時計を作れるようにする

時計機能を追加したい場合、Arduino は RTC 内蔵で無いため

- RTC (Real Time Clock) を追加
- 電源が切れても時刻を更新し続けるバッテリー(電池)を追加

する必要があります。ちゃんとしたのを買うと高いんですが、ebay で安い、かつ一般的な i2c の RTC モジュール DS1307 を積んでいる　Tiny RTC というのが一個 0.99$ で売ってたので試しに5個ほど買ってみました。なお1個でも国際送料無料です。

- http://www.ebay.com/itm/130726938768

こいつに一般的なリチウムボタン電池の CR2032 (100円ショップで2個で100円) をつければ 180 円で RTC 追加して使えます。ﾔｯﾀﾈ!

![20151129-DSC04662.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/6f6fd922-baba-1a72-9c08-949f98e09b8a.jpeg "20151129-DSC04662.jpg")

## 配線

配線は P2 (DS1307側) のピンヘッダを実装し繋ぐだけでOKです。右側の P1 のほうは、EEPROM の 24C32 と繋ぐ用みたいです(試してない)。

また電池の向きですが、+ が表になるように入れると動作しました。以下は参考写真です。

![20151129-DSC04660.jpg](https://qiita-image-store.s3.amazonaws.com/0/5330/d52d359f-6912-4ede-6f1d-8103c3f4464b.jpeg "20151129-DSC04660.jpg")

なお回路図は下のエントリーにあります。自分で書き起こしたっぽいですね。

- http://www.instructables.com/id/Arduino-Shower-Monitor-2/


## ライブラリ

ライブラリは

- https://github.com/PaulStoffregen/DS1307RTC

を使いました。このライブラリは [Arduino の Time ライブラリ](https://github.com/PaulStoffregen/Time)と RTC をよしなにマッピングしてくれるので使い勝手が良いです。Arduino の Time ライブラリの方の使い勝手が良いかは微妙ですが…。

さらに上のレポジトリツリーに 

- https://github.com/PaulStoffregen/DS1307RTC/blob/master/examples/SetTime/SetTime.ino

というサンプルが置かれてるんですが、これを書き込むと PC の時刻と Arduino の RTC 時刻を大体同期してくれます。これはコンパイル時にその時の日時文字列として展開される C のマクロの ```__TIME__``` と ```__DATE__``` をパースし、Time ライブラリの ```tmElements_t``` 構造体によしなに突っ込んでくれるという物です。なるほど。

ちなみに私の環境では PC でコンパイルしてから Arduino 上で実行されるまで約15秒のタイムラグがあったため、上記コードの

```cpp
tm.Second = Sec;
```

を

```cpp
tm.Second = Sec + 15;
```

とすることで、さらに近い時間になるようにしています。なおソースコードを読む限りは Second の値が60以上で代入されても意図した動作をします。

その後

- https://github.com/PaulStoffregen/DS1307RTC/blob/master/examples/ReadTest/ReadTest.ino

のスケッチを書き込み、Arduino の電源をオンオフしても正常に時刻が維持されていればちゃんとバッテリーで動作しているはずです。

まだ使い始めて間もないので正確さ(乗っているクロックに影響される)は解らないのですが、安価に時計機能を追加できる & 無料な国際便は届くまでだいぶ時間がかかるので、買っておいても損は無いんじゃないかなーと思います。
mruby の Fiber の backtrace にFiber.resume の呼び出し元のバックトレースが含まれるようにする mrbgems

mruby の例外の backtrace は Fiber.resume より呼び出し元に近い関数は含まれない。
この動作は CRuby も同じではあるが
時々不便に感じていたので Fiber.resume の呼び出し元のバックトレースが含まれるようにする mrbgems を作ってみた。

https://github.com/dycoon/mruby-better-fiber-backtrace

sample.rb

```ruby
begin
  fb = Fiber.new do
    Fiber.yield
    raise "ttt"
  end
  fb.resume
  fb.resume
rescue => e
  puts "e.backtrace"
  puts "#{e.backtrace.map{|v| "  " + v}.join("\n")}"
end
```

mruby-better-fiber-backtrace を使ってない場合だと以下の様な出力である。

```
e.backtrace
  ./sample.rb:10
```

出力が backtrace を読んだ位置になっているので以下の mrbgems を割り当てると
https://github.com/dycoon/mruby-ruby-like-backtrace
（関係する記事はこちら
[mruby で例外が起こった場所の backtrace を rescue 節など他の場所でも取得できるようにする](http://qiita.com/dycoon/items/46760e81937ae7385d2c)）
以下のようになる。

```
e.backtrace
  /work/small_repos/mruby-ruby-like-backtrace/mrblib/ruby_like_backtrace.rb:19:in Exception.initialize
  sample2.rb:4
```

raise された位置は出てくるが Fiber.resume より呼び出し元に近い関数は出力されない。

mruby-better-fiber-backtrace を使うと以下のように出力される。

```
e.backtrace
  /work/small_repos/mruby-better-fiber-backtrace/tmp/mruby/build/mrbgems/mruby-ruby-like-backtrace/mrblib/ruby_like_backtrace.rb:19:in Exception.initialize
  ./sample.rb:4
  /work/small_repos/mruby-better-fiber-backtrace/tmp/mruby/build/mrbgems/mruby-ruby-like-backtrace/mrblib/ruby_like_backtrace.rb:19:in Exception.initialize
  /work/small_repos/mruby-better-fiber-backtrace/mrblib/better_fiber_backtrace.rb:16:in Fiber.resume
  ./sample.rb:7
```

Fiber.resume がどこから呼びだされているかわかりやすい。
GaucheでVerilogの16進表記を作る

Gaucheを使ってVerilogソースを作る時の小ネタです。


```scheme
(define dec->verilolg-hex-str
  (lambda (d bit)
    (let* ([dispwidth (* (exact (ceiling (/ bit 8))) 2)]
           [val-str (number->string (logand (- (power 2 bit) 1) d) 16)]
           )      
      (format #f (string-append "~A'h~" (x->string dispwidth) ",,,'0@A") bit val-str))))
```

(dec->verilolg-hex-str 10進の数値 bit幅)で呼び出してください。

```scm
(dec->verilolg-hex-str 10 15)
gosh> "15'h000a"

(dec->verilolg-hex-str -10 15)
gosh> "15'h7ff6"
```
xv6のデバッグ環境をつくる

## はじめに

xv6は、MITのOperating System Engineeringのクラスで使われている教材で、UNIX V6 をx86ベースに作りなおされたシンプルなOSです。

xv6自体の解説書籍はありませんが、UNIX V6なら[Lions本](http://www.amazon.co.jp/dp/4756118445/)や[はじめてのOSコードリーディング](http://www.amazon.co.jp/dp/4774154644/)が有名なので、
多少の差異があるものの、書籍片手にソースリーディングができます。

ただ、読むだけでは実際にどう動くかのイメージがなかなか掴めないので、ステップ実行できる環境を作ってみます。

以下の環境を前提に記述します。

* Ubuntu 14.04
* GCC 4.8.4
* GNU gdb 7.7.1
* QEMU 2.0.0


## xv6のソース入手

Gitでリポジトリをクローンします。
<pre>
git clone git://github.com/mit-pdos/xv6-public.git
</pre>

## コンパイル
make 一発でOK
Makefileを読むと、CFLAGS にGDBでデバッグ情報を付加するオプション(-g)、
コンパイルの最適化を行わないオプション(-O0)が最初からついているので、デバッグ用の追加設定は不要です。
<pre>
cd xv6-public
make
</pre>
kernelという実行ファイルが生成されていればOKです。

## QEMUで実行
<pre>
make qemu-nox-gdb 
*** Now run 'gdb'.
qemu-system-i386 -nographic -hdb fs.img xv6.img -smp 2 -m 512  -S -gdb tcp::26000
</pre>

qemu-gdb だとQEMUのコンソールが出現しますが、qemu-nox-gdb だと現在のコンソールでQEMUが起動します。
-Sオプションが付いているので起動直後に停止中となり、デバッガの接続待ちとなります。
別のコンソールを立ち上げ、GDBでTCPの26000番ポートに繋ぎに行きます。

<pre>
cd xv6-public
gdb kernel

(gdb) target remote localhost:26000
Remote debugging using localhost:26000
0x0000fff0 in ?? ()
</pre>
ソースコードをアタッチします。カレントディレクトリがソースのルートなので、パスは .(ドット)でOKです。
<pre>
(gdb) source .
.: 成功です.
</pre>

（単純に"gdb"で起動した場合は、ここでシンボルファイルの指定を行います）
<pre>
(gdb) symbol-file kernel
</pre>

main関数にブレークポイントを設定します。
<pre>
(gdb) b main
Breakpoint 1 at 0x801036ff: file main.c, line 19.
</pre>

表示を切り替えて、ブレークポイントまで進めます。
<pre>
(gdb) la src
(gdb) c
Continuing.
</pre>

設定したブレークポイントで止まった状態になりました。

![gdb.png](https://qiita-image-store.s3.amazonaws.com/0/66470/2cfb32a4-d3b8-9880-fc25-59f4dc696f92.png)


ここで nコマンドを入力すると次の1行に移ります。
F5キーで直前のコマンドを繰り返すので、F5を押すたびカーソルが移っていきます。

これでソースリーディングが段違いにはかどりますね。

## 注意点

ターゲットのアーキテクチャが異なると、正しくデバッグ出来ないことがあります。
今回xv6はi386で動作することを前提にビルド・起動しているので、GDBでもこれに合わせた設定が必要です。
手元の環境では次のようになっていました。
<pre>
(gdb) show arch
The target architecture is set automatically (currently i386)
</pre>
もし異なるアーキテクチャが示されていたら、次のようなファイルを作れば初期設定ができます。

```sh:~/.gdbinit
set arch i386
```

もしくは、同じ内容をGDB起動後に手入力してもOKです。