OmniAICreator/Qiita-1.07M huggingface dataset:
Browserify + Reactify + watchify + gulpでReactの開発をする


### 目的
Scalaのweb frameworkであるxitrumでReactを使いたい。Reactで利用できるライブラリはnpmのmoduleが殆んどなので、moduleをNode.jsを使わずに使いたい(`var foo = require('foo');`を使いたい)。

### Browserifyの導入

Browserifyのmoduleを使うことでNode.jsを使わすに`require`が使える。
Browserifyは`require`しているnpm moduleを1つのjsファイルにまとめてくれる。つまり、`require`がmoduleのjsに置き換わる。

BrowserifyだけだとJSXを変換できないので、Reactify moduleを使用する。Reactifyは`browserify`コマンドの`-t`オプションで *reactify* を指定することでJSXの変換とreact moduleの追加をやってくれる。これで *JSXTransformer.js* と *react.js* を`script`タグで読み込む必要がなくなる。

BrowserifyとReactifyだけだと毎回`browserify`コマンドを叩いで手動でjsファイルを変換する必要があるので、ファイルの変更を監視して差分を自動で変換してもらうことにする。

そこで *watchify* と *gulp* moduleを使用する。

[こちら](https://github.com/gulpjs/gulp/blob/master/docs/recipes/fast-browserify-builds-with-watchify.md)を参考にgulpfile.jsを作成した。

これで`gulp js`とするだけで対象のjsファイルを監視して、自動で変換してくれる。

```javascript:gulpfile.js
'use strict';

var watchify = require('watchify');
var browserify = require('browserify');
var gulp = require('gulp');
var source = require('vinyl-source-stream');
var buffer = require('vinyl-buffer');
var gutil = require('gulp-util');
var sourcemaps = require('gulp-sourcemaps');
var assign = require('lodash.assign');
var reactify = require('reactify');

// add custom browserify options here
var customOpts = {
	entries: ['./src/main.js'],
	transform: [reactify],
	debug: true
};
var opts = assign({}, watchify.args, customOpts);
var b = watchify(browserify(opts));

gulp.task('js', bundle); // so you can run `gulp js` to build the file
b.on('update', bundle); // on any dep update, runs the bundler
b.on('log', gutil.log); // output build logs to terminal

function bundle() {
	return b.bundle()
		// log errors if they happen
		.on('error', gutil.log.bind(gutil, 'Browserify Error'))
		.pipe(source('app.js'))
		// optional, remove if you don't need to buffer file contents
		.pipe(buffer())
		// optional, remove if you dont want sourcemaps
		.pipe(sourcemaps.init({loadMaps: true})) // loads map from browserify file
		// Add transformation tasks to the pipeline here.
		.pipe(sourcemaps.write('./')) // writes .map file
		.pipe(gulp.dest('../../../../public/js'));
}
```

全体の導入は、こちらを[参考](http://qiita.com/masato/items/35b0900e3a7282b33bf8)にしました。

### xitrumでReactを利用する

xitrumへの導入は[ここ](https://github.com/georgeOsdDev/xitrum-react-example
)を参考にしました。

上記のexampleを参考にすれば、全体の構成はわかるかと思います。

npm moduleは *src/resource/react* で管理する。

npm moduleは *package.json* を作って。moduleのインストール時に、`--save-dev`オプションを付けることでインストールしたmoduleを管理する。これで *git clone* した時も、必要なmoduleが管理できて便利。

JSXファイルは *src/resource/react/src* に置く。

変換され一つにまとめられたjsファイルは *public/js* の下に出力する。
【国内】IoTソリューション(事業者)

## Iot Paas ONE (Bunnyhop Inc.)

![スクリーンショット 2015-04-27 11.03.06.png](https://qiita-image-store.s3.amazonaws.com/0/74972/32136a92-0f66-24cb-7348-1e52bbae6583.png)

https://iot.bunnyhop.jp/

- IoTデバイスソリューション

- 事業はIotにおけるコンサルティング、ソリューション、設計、開発、運用を行っている。

- ![スクリーンショット 2015-04-27 11.15.33.png](https://qiita-image-store.s3.amazonaws.com/0/74972/cf39042c-32e9-aca9-b1e1-21983bee2bcd.png)

- IoT PaaS ONE はRaspberry Piを利用している。

## IoTセンサー解析ベースシステムの販売(フォワードネットワーク社)

![スクリーンショット 2015-04-12 9.46.46.png](https://qiita-image-store.s3.amazonaws.com/0/74972/30b5fe07-e13f-c282-67dc-764389f98910.png)

http://itpro.nikkeibp.co.jp/atcl/news/15/040901248/?n_cid=nbpitp_itptw_top

- 事業管理者向けIOTソリューション

- センサーデータを収集してHadoopなどで分析するシステム基盤製品。仕組みは市販センサー、Android端末、Hadoopを組み合わせて実現する。

- 機能(データ収集の仕組み、Hadoop環境、データ分析)のパッケージ化によって開発コストの削減が可能。Android端末は格安SIMを利用できるので、運用費用も抑えることができる。

- オンプレミスでの提供が可能。Zigbee専用のセンサーを作成して提供も可能。


- 以下は実際に製品を使用した場合の様子

![スクリーンショット 2015-04-12 10.00.58.png](https://qiita-image-store.s3.amazonaws.com/0/74972/4bb7875d-43fc-eb91-9c3f-61f37e437c35.png)

- 土壌センサーからた外気温、土壌湿度、光度データについて、リアルタイム値、集計データ、検索結果を参照可能。
- 収穫時期を適切に判断できるようになり、収穫量や品質の維持が可能になる。

- メモ:このシステムのパッケージ化によって、あらゆる大型施設系(工場、農業等)が利用するのが当たり前の時代になってくる。


## センサー情報の管理を効率化(インフォコーパス社)

![スクリーンショット 2015-04-12 10.17.33.png](https://qiita-image-store.s3.amazonaws.com/0/74972/3fb62fa6-24b1-d10c-558c-fcbe07b5406e.png)

http://www.infocorpus.co.jp/blog/news/1604.html

- IOTサービスプラットフォーム更新情報

- センサーデータの測定単位や測定可能範囲の自動認識が可能になった。
- 管理者は製品名と製品リストから選択することのみでデータを集められる。集めたデータの可視化についてはグラフの単位、測定範囲、粒度をクラウドが自動判定することでメーターやグラフを推奨したり、絞りこんだりすることが容易にできる。
- センサーの組み合わせがレコメンド式にできるようになった。

- メモ:クラウドからデータを集める上でより簡略化できるようになった。

## Dust-gateway（東京エレクトロンデバイス社）

![スクリーンショット 2015-04-17 12.10.17.png](https://qiita-image-store.s3.amazonaws.com/0/74972/9fa94948-8648-59b3-54e6-4a557830a4cc.png)

http://internetcom.jp/busnews/20150309/ted-launches-iot-gateway-with-dust-networks-feature.html

http://www.excite.co.jp/News/column_g/20150304/Cobs_141488.html

- 無線メッシュネットワークを活用することで、外部電源に頼らず機器の内部バッテリのみで長期期間稼働できるため、省電力化が実現できる。
- Armadillo-IoT に対応可能なため、センサと簡便、柔軟に接続し、インターネットを通じて各種のクラウドサービスにそれらのデータを送信可能である。

## インテルの独自IoTプラットフォーム Intel IoT Platform発表。センサからクラウドまで一括提供

![スクリーンショット 2015-05-01 8.51.57.png](https://qiita-image-store.s3.amazonaws.com/0/74972/eaaea411-a132-b090-02eb-fb30352cae59.png)

- 超小型IAプロセッサ Quarkを載せたGalileo や Edisonなど末端のデバイスやセンサーからクラウドまでを統一してプラットフォームを提供する。コネククティビティ、gateway、アナリティクス、セキュリティソリューションも含む。
- 各社のニーズに合わせた「何でもインターネット」ソリューションを顧客に販売する。
ShinobiLayer: SoftLayerのロゴはなぜ三本線なのか？（小ネタ）

単なる子ネタです。SoftLayerのロゴは三本線ですが、これは残念ながらTripe Network Architectureを表しているのではないようです。

http://blog.softlayer.com/2007/the-osi-model-reworked

> A funny little known factoid is that when we started this company a couple years ago, the OSI model actually came up when designing our logo. When brainstorming and jotting down ideas one of our founders (guess who?) used the 7 Layer theme to design our current logo. Shows you how influential the OSI model has been in today's Internet driven world. 

上記のブログから判断すると、OSI 7層モデルにインスパイアされてロゴを作ったみたいですね。どちらにしても、創業者達はNetworkに思い入れがあったということ自体は確かなのでしょう。
userAgentからAndroidのタブレットとスマートフォンを判別する


iOS端末であれば、userAgentを見て「iPad」が書いてあるか否かによって、タブレットかスマートフォンかを判別することができた。

Androidで同じことをやろうとしたとき、画面幅を見る方法もあるが、
もっと簡単な方法としてuserAgentに「Mobile」が書かれているかどうかを見る方法がある。

Mobileと書かれていた場合、Androidのスマートフォンであり、
書かれていない場合はAndroidのタブレットとなる。
プロトコルスライドショー（「プロトコル」という言葉を覚え始めた方、使いたがる方へ）

プログラミングを勉強しているひとがイマイチピンと来ない「プロトコル」について説明するためにスライドショーをつくってみました。

[プロトコルって？3ページで概要を説明してみた](https://docs.google.com/presentation/d/10QzWrpNzrCGYZevL7U7jG4vWYb-LDv_1FA2whJIAolA/pub?start=true&loop=false&delayms=60000)

IT技術者育成に従事されている方にもご活用頂けたらと思います。
ちなみに内容は初歩の初歩のとっかかりです。あまり過度な期待はしないでね。m(u.u)mﾍﾟｺ
管理者権限で実行しているか

		/// <summary>
		/// 管理者として実行しているか
		/// </summary>
		/// <returns></returns>
		private static bool IsRunAsAdmin()
		{
			var Principle = new WindowsPrincipal( WindowsIdentity.GetCurrent() );
			return Principle.IsInRole( WindowsBuiltInRole.Administrator );
		}
マークアップにおけるSEOルール - 2015/04



# マークアップにおけるSEOルール - 2015/04


## 2015年のSEO基本方針

* ページ構成に沿った素直なテキストワーディングとレイアウトを心がける
* ユーザーが見ている状態と同様のテキスト、代替テキストを配置する
* メガフッタのようなリンク過多な実装は控える
* マイナスインデントやdisplay、font-sizeなどによる代替テキストを隠す行為は禁止とする


## head

### meta description

* 120字以内にまとめる
* 特に冒頭50文字に概要をまとめる
* 可能であれば冒頭50文字で文章を一旦切る
* 画面毎に、画面を説明する固有の説明文をライティングする
* 全画面に共通の文章はサイト名以外不要
* トップページではサイトを説明する文章を設定する
* 記事タイトルや日時情報、価格情報など、ごく固有な情報を積極的に含むのが好ましい


### meta keywords

* SEO上の効果はない
* SEO以外の役割がある場合もありこれまでどおり最低限の実装を行う


### meta ogp + fb （※ この部分はhtmlガイドラインに移動するかも）

以下を設置する

```
<meta property="og:title" content="[ページタイトル]">
<meta property="og:type" content="[ページtype]">
<meta property="og:description" content="[記事の説明]">
<meta property="og:url" content="[ページURL]">
<meta property="og:image" content="[画像URL]">
<meta property="og:site_name" content="[サイトのタイトル]">
<meta property="fb:app_id" content="[facebookアプリID]">
```

各項目の詳細は以下のとおり


#### og:title

多くの場合、`<title>`要素と同じ値を設定する

#### og:type

特に指定がない場合「website」を設定する

```
<meta property="og:type" content="website">
```

#### og:description

meta descriptionと同じ値を設定する

#### og:url

多くの場合、link canonicalと同じ値を設定する

#### og:image

facebookが推奨するサイズ、1200px✕630px（以上）の画像のパスを設定する

#### fb:app_id

facebookページを作成すると提供される「FacebookページID」の値を設定する


### link canonical

* head要素内に以下を記述する
* ドメインやサービスごとに取り決めた統一ルールを"正しいURL"としてhref値に設定する
* 決定するルールは例えば「www.」の有無や「index.html」の有無など

```
<link rel="canonical" href="［正規化URL］">
```


### link alternate

PCとSP・FPで異なるURI構造をもつサイトにおいて以下の実装を行う

#### PC側記述

```
<link rel="alternate" media="only screen and (max-width: 640px)" href="［SP・FP URI］">
```

#### SP・FP側記述

```
<link rel="canonical" href="［PC URI］">
```



## 要素

### title要素

* 32文字以下にまとめる
* 特に冒頭20文字にページの内容をまとめる
* ページの内容とサイトの内容を表現する
* タイトル要素の構造としては以下が好ましい

```
<title>ページ名 サブカテゴリ名 カテゴリ名:サイト名</title>
```


### hx要素

* `<h1>`〜`<h6>`見出し要素にキーワードを適切に設定する
* 画面全体において適切な数になるように、また適切な見出し階層（アウトライン）構造で設置する
* テキストを含むCSS背景画像を持つ`<hx>`要素には、そのテキストをtitle属性値に設定する
* html5で一部推奨されているmultiple `<h1>`実装は行わなず、`<h1>`はページに１つ設置する


### a要素

* ページ内に同一ページへのリンクが複数ある場合、最初のリンクだけが評価される可能性がある
* ページ内に同一ページへのリンクが複数ある場合、最初のリンクのテキストワーディングに特に注意する


### 要素構成

* `<body>`内の重要なテーマやキーワードがコード上の上部に出現するようブロックを構成する
* ただし、ページの表示上の順序に反するソースコード順にしてはならない


## 属性

### alt属性

* `<img>`要素にalt属性を設定する
* `<img>`要素にテキストを含む場合にそのテキストをalt属性値に設定する
* テキストが長い場合は1文、または20文字程度の適切な長さに要約する
* １つの要素やテキスト内容に対してalt属性とtitle属性の併用は行わない


### title属性

* テキストを含むCSS背景画像を持つブロック要素にそのテキストをtitle属性値に設定する
* a要素にtitle属性を設定し、ハイパーリンク先の情報を設定することも有用
* テキストが長い場合は1文、または20文字程度の適切な長さに要約する
* １つの要素やテキスト内容に対してtitle属性とalt属性の併用は行わない


## robots.txtとsitemap.xml

* 各ドメインの本番Webサーバ上でrobots.txtとsitemap.xmlの有無を確認する
* robots.txtとsitemap.xmlが正しく機能したり設定されているかを確認し把握しておく


## viewport

スマートフォンなどデバイス毎のviewportを設定する


## パフォーマンス

パフォーマンス性が高いほどよい


## Microdataの利用

* コンテンツの内容によってMicrodataマークアップが有用と判断できるプロジェクトにおいて対応する
* 対応方針はプロジェクトごとに別途定める
* itemtypeは schema.org の仕様に準ずる （ http://schema.org/docs/full.html ）


## 本ルールの更新

以上の方針はGoogleなどの検索サービスの動向にしたがって頻繁かつ速やかに更新する
Macのターミナルから指定したディレクトリでFinderを開く方法

```bash
open .
```

これでカレントディレクトリを開いた状態のFinderが立ち上がる

`.` のところにPATHを入れるといい感じに立ち上がってくれる。ターミナルではやりにくいこともこれでなんとか。
git-svnで途中から繋ぎ直す

git-svnを順調に使っていたけれど

* 間違って手元のレポジトリ消しちゃった！
* 別のマシンからもgit-svnしたい！

というような「remoteのgitレポジトリとsvnレポジトリは残っているが、手元のgitレポジトリとsvnレポジトリが紐付いてない」という状況がたまに発生します。

その場合、試行錯誤の上、以下の条件の場合には復帰できました。

* remoteのgitレポジトリは残っている
* --no-metadataせず、gitのコミットログにgit-svn-idが登録されている（必須ではないかも？）

方法は

0. とりあえず、まず``git clone [remoteレポジトリ]``で普通にremoteを取ってきます（originとします）。
0. originに最後に残っているsvnのコミットリビジョンをgit-svn-idから確認します（r1234とします）。このgitコミットのSHA-1ハッシュはabcdefとします。
0. .git/configを適当なテキストエディタで直接編集して、svnを追加します（※1）。
0. とりあえず適当なリビジョンをsvn fetchします。```git svn fetch -r1234:1234```
0. remotes/git-svnがブランチに追加されていますが、このままだとツリー上は既存のもの(master)とは別と解釈されてしまいます。そこで、.git/refs/remotes/svnを直接編集して、無理やり2で確認したmasterの最終コミット(abcdef)に変更します。
0. .git/svnを無理やり消してしまって、先のgit svn fetchをなかったことにします。
0. 今度はHEADまで再度```git svn fetch -r1235:HEAD```すると、r1234の次のr1235からHEADまでのsvnコミットが、masterの後ろにフェッチできます。
0. ```git reset --hard git-svn```すれば、あとは普通にgit-svn出来る環境になります。

※1は例えばこんな感じです

```txt
[svn-remote "svn"]
	url = https://example.com/svn/trunk
	fetch = :refs/remotes/git-svn
```
// [余談] ↑みたいな複数行は脚注にもできないんですね・・・なんとかならないもんでしょうか（パーサーの問題だと思うけど）

また相変わらず無理矢理感ありますが、他にいい方法ご存知のかた教えて下さい。
google driveでの権限(ios)


https://github.com/googledrive/dredit

とかのサンプルだと、作ったファイルやフォルダは見られるけど、
既にあるファイルやフォルダにアクセスできなかった。

Google Developers Consoleとかを覗いたけど、そんな設定はない。。。

##解決
**GTMOAuth2ViewControllerTouchを作るときの、scopeがそれだった。**
    
つまり
kGTLAuthScopeDriveFile
を
kGTLAuthScopeDrive
にして解決。


obj-cだとこう。

```objectivec
      [[GTMOAuth2ViewControllerTouch alloc] initWithScope:kGTLAuthScopeDrive
                                                 clientID:kClientId
                                             clientSecret:kClientSecret
                                         keychainItemName:kKeychainItemName
                                                 delegate:self
                                         finishedSelector:finishedSelector];
```

swiftだとこう。

```swift
GTMOAuth2ViewControllerTouch(scope: kGTLAuthScopeDrive,
            clientID: kClientID,
            clientSecret: kClientSecret,
            keychainItemName: kKeychainItemName,
            delegate: self,
            finishedSelector: Selector("viewController:finishedWithAuth:error:"))
```


なお、scopeの選択肢には

- kGTLAuthScopeDrive
- kGTLAuthScopeDriveFile
- kGTLAuthScopeDriveMetadataReadonly
- kGTLAuthScopeDriveReadonly

があるそうだ。
Riot Bootstrap


[WIP] Riot.js向けのBootstrapっぽいコンポーネント。今のところ、ボタンとドロップダウンくらいですが、ちょこちょこ拡充していこうかと。(この記事は、[Riot Bootstrap](https://github.com/cognitom/riot-bootstrap)のREADMEの日本語版です)

- **読める**: 長すぎるクラス名を書く必要なし!
- **スタンドアローン**: Bootstrapライブラリは不要
- **モジュールごとに**: 1ファイル、1コンポーネント
- **パッケージ**: HTML/CSS/JavaScriptが1ファイルに

[![Bootstrap-like Components for Riot.js.png](https://qiita-image-store.s3.amazonaws.com/0/1858/9bcd131f-fede-75ce-2240-daf4249ba2a2.png "Bootstrap-like Components for Riot.js.png")](http://cognitom.github.io/riot-bootstrap)

## デモ

- [cognitom.github.io/riot-bootstrap](http://cognitom.github.io/riot-bootstrap)

## 使ってみる

基本的には、HTMLタグと同じように使えばOKです。 `<btn>`, `<btn-group>`, `<menu>`...ほか.

```html
<btn>Your Button</btn>
```

### 1) HTMLファイルの中で直接使う

- [riot.js](https://muut.com/riotjs/)を読み込む
- [normalize.css](http://necolas.github.io/normalize.css/)を読み込む
- riot-bootstrap (これ) を読み込む
- その後、`riot.mount('*')`

```html
<!DOCTYPE html>
<html>
  <head>
    <title>riot-bootstrap</title>
    <link rel="stylesheet" href="//cdn.jsdelivr.net/normalize/3.0.3/normalize.css">
  </head>
  <body>
    <section>
      <btn>Default</btn>
      <btn option="primary">Primary</btn>
      <btn option="success">Success</btn>
    </section>
    <script src="//cdn.jsdelivr.net/riot/2.0/riot.js"></script>
    <script src="dist/riot-bootstrap.js"></script>
    <script>riot.mount('*')</script>
  </body>
</html>
```

### 2) タグファイル内で使う (推奨)

- [riot.js](https://muut.com/riotjs/)を読み込む
- [normalize.css](http://necolas.github.io/normalize.css/)を読み込む
- riot-bootstrap (これ) を読み込む
- load your tag file
- その後、`riot.mount('app')`

```html
<!DOCTYPE html>
<html>
  <head>
    <title>riot-bootstrap</title>
    <link rel="stylesheet" href="//cdn.jsdelivr.net/normalize/3.0.3/normalize.css">
  </head>
  <body>
    <app></app>
    <script src="//cdn.jsdelivr.net/riot/2.0/riot.js"></script>
    <script src="dist/riot-bootstrap.js"></script>
    <script src="app.tag"></script>
    <script>riot.mount('app')</script>
  </body>
</html>
```

```html
// app.tag
<app>
  <section>
    <btn onclick={ click }>Say 'Hi!'</btn>
  </section>
  <script>
    click (e) {
      alert('Hi!')
    }
  </script>
</app>
```

## コンポーネント

[デモページ](http://cognitom.github.io/riot-bootstrap)参照。
【Java】htmlunitでajaxページの要素を取得してみる

#前書き
JavaでWebページを定期的に取得→分析→DB保存→WEB表示して、ちょっとネタ集めを自動化してみよう！
ということを簡易プログラムを作った時に「Ajaxで読み込まれるページ、どうすっぺ？」となったのでメモしておきます。

#今回紹介すること
htmlunitを使ってWebページの要素を解析してみる！という内容です。

#前準備
gradleとか使ってhtmlunitを使えるようにしておきましょう。

#htmlunit使ってみましょう
早速ですがこんな感じです。

```java:sample.java

private String getAjaxPage(String url) throws FailingHttpStatusCodeException, MalformedURLException, IOException{
		WebClient webClient = new WebClient( BrowserVersion.FIREFOX_24);
		webClient.getOptions().setJavaScriptEnabled(true);
		webClient.setAjaxController(new NicelyResynchronizingAjaxController());
		webClient.waitForBackgroundJavaScript(10000);
		webClient.getOptions().setRedirectEnabled(true);
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.getOptions().setCssEnabled(false);
        webClient.getOptions().setUseInsecureSSL(true);
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
        webClient.getCookieManager().setCookiesEnabled(true);
		HtmlPage page = webClient.getPage(url);
		// 後はごにょごにょしても良いけど、getメソッドって書いたのでpage.asXml()で終わってみる
		return page.asXml();
}
```

`getOptions()`系のすべてのメソッドは呼んで字のとおりです。

Selenium的に書くなら、要素が出現するまで、でタイムアウト設定という感じでしょうか。
Web crawlerのコードなのにテストコードみたいになりそうです。

#取得した後に出来ること
実は、
`HtmlPage page = webClient.getPage(url);`
の後、JavaScriptみたいに
`page.getElementById(elementId)`とか、
`page.getElementsByName(name)`とかできます。

さらに、「煩雑でもいい！俺はJsoupで書きたい！」という方は、
`page.asXml()`を
`Jsoup.parse(String)`
でDocumentに変更することで操作することもできます。

ちなみに作った簡易Web crawerではJsoupに戻して処理する方を採用しました。
構成は気持ち悪いですが、DB保存する前の分析とかを使いまわせるのが良かったです。

#全然関係ないあとがき
Vert.Xがもう少し流行って情報増えたら使いたいなと思っています。
誰か書いて頂ければ嬉しいです！
Hello Worldとかチャットは作ってみたのですが、
まだ使いこなせない。。勉強していつか書きます。

まだ全然jsに慣れていないので、
近いうちにサーバーサイドJavaにreact組み込んでserver side renderingしてみようと思います。
Nashornとか使えばできるのでしょうか？
Aurelia docs update: 4/27


Aureliaのドキュメントの更新について記載します。navigator appのyeoman generator追加、docs.md の細かい修正がありました。

## get-started.md: Yeoman generatorの追加

navigator appをダウンロードして展開する方法の他に、yeoman を使ってスケルトンプロジェクトを生成する方法が増えました。

```bash
> mkdir skeleton-navigation ; cd skeleton-navigation
> npm install -g yo generator-aurelia  
> yo aurelia 
```

**注:** get-started.md の例とは少し異なります。yo aureliaは実行したディレクトリに関係ファイルを展開するので、最初にディレクトリを作る手順を追加しています。

この時にnpmのinstallとjpsmのinstallも実行してくれます。

## docs.md: IE9対応

IE9に必要なpolifillがMutationObserverだけになりました。（多分、元々core-jsは依存ライブラリにあったためだと思います）

それに伴いAurelia起動時の処理が変わっています。

なお、IE9対応の navigator-skeletonは、[こちら](http://ashleygrant.github.io/aurelia-skeleton-ie9/) で試すことができます。

## docs.md: templateがうまく動かないケース

Aureliaはtemplateが使えないブラウザに対してはpolyfillをするようにしているとのことですが、`select` タグや `table` タグの中などでうまく動作しないケースがあるとのことです。

その場合は、`tr`など既存のエレメントに対して`repeat`のようなカスタム属性をつけるというワークアラウンドが紹介されていました。

どのブラウザで動かないのかっていう情報はなかったです。。。
[java8] 6回目：インタフェースのデフォルト実装

[前回：ラムダ式とStreamAPI]
(http://qiita.com/yuusuke_s/items/87245794da0ac3271dc7)

今回はインタフェースのデフォルト実装です。
Java7までは、インタフェースを定義した場合、実装クラス側で全てのメソッドを実装する必要がありました。

Java8からは、**default**キーワードを付与することで、インタフェースに実装を持たせることが可能です。
もちろん、実装クラス側でオーバーライドすることも可能です。

いくつかのサンプルを見てみましょう。

## デフォルト実装をそのまま使う
``` java
public interface HelloJava {
	default void helloJava() {
		System.out.println("Hello Java! default.");
	}
}

// 実装クラス。
class Hello implements HelloJava {
	// オーバーライドしない
}

public class SamppleDefaultIf {
	public static void main(String[] args) {
		Hello hello = new Hello();
		hello.helloJava();
	}
}
```

結果
> Hello Java! default.

インタフェース側でデフォルト実装した内容が出力されています。


## 実装クラス側でオーバーライドする
``` java
// 実装クラス。
class Hello implements HelloJava {
	@Override
	public void helloJava() {
		System.out.println("Hello Java! override.");
	}
}

public class SamppleDefaultIf {
	public static void main(String[] args) {
		Hello hello = new Hello();
		hello.helloJava();
	}
}
```

結果
>Hello Java! override.


## 複数のインタフェース（多重継承風）
``` java
public interface HelloPython {
	default void helloPython() {
		System.out.println("Hello Python! default.");
	}
}

// 実装クラス。
class Hello implements HelloJava, HelloPython {

}

public class SamppleDefaultIf {
	public static void main(String[] args) {
		Hello hello = new Hello();
		hello.helloJava();
		hello.helloPython();
	}
}
```

結果
>Hello Java! default.
Hello Python! default.

インタフェースなので、複数定義することも可能です。


## 最後に

今まではabstractクラスでデフォルト実装をして、それを自クラスで継承して使っていたと思いますが、
インタフェース側に持たせることで、設計方法も変わるのかなと思ったりしています。

次回は、もう少し踏み込んだ内容に挑戦したいと思います。
Heroku で Postgres のデータベースをアップグレードする


# Heroku の Postgres アドオンプラン

Heroku で Postgres を使いたい時はアドオンとしてデータベースを追加します。

https://addons.heroku.com/heroku-postgresql

無料プラン(Hobby Dev) では 10,000 レコードまで保存できます。

サービスの内容によってはリリース後のユーザー増によっては 10,000 レコードでは足りなくなってきます。
そんな時はアップグレードしましょう。一番安いプランは Hobby Basic で $9/月 です。
  
# アップグレード手順

Heroku での DB のアップグレード手順は、
1. 新しいプラン(ここでは Hobby Basic)のデータベースを追加
2. 新しいデータベースに既存のデータベースの内容をコピー
3. アプリケーションサーバの参照先に設定
になります。

# 1.新しいプラン(ここでは Hobby Basic)のデータベースを追加

コマンドでも追加できますがアドオンのページからも追加できます。
https://addons.heroku.com/heroku-postgresql

作成すると新規のデータベースを表す環境変数(HEROKU_POSTGRESQL_PINK_URL や HEROKU_POSTGRESQL_GREEN_URL などの色の名前がついた変数)が定義されます。

# 2. 新しいデータベースに既存のデータベースの内容をコピー

データベースをコピーする前にメンテナンスモードを on にして既存データベースをロックします。

```
heroku maintenance:on
heroku ps:scale worker=0
```

pg:copy を使って新しいデータベースにコピーをします。

```
heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_COLOR_URL --app APP_NAME
```

# 3. アプリケーションサーバの参照先に設定

データベースのコピーが終わったら新しいデータベースをアプリサーバの参照先に設定します。

```
heroku pg:promote HEROKU_POSTGRESQL_COLOR_URL
```

その後メンテナンスモードを off にして作業終了です。

```
heroku ps:scale worker=1
heroku maintenance:off
```

# 実行後

heroku pg:info でデータベースの状況が確認できます。

```
takecian$ heroku pg:info
=== HEROKU_POSTGRESQL_AMBER_URL
Plan:        Hobby-dev
Status:      Available
Connections: 0/20
PG Version:  9.3.6
Created:     2014-08-29 06:49 UTC
Data Size:   10.7 MB
Tables:      8
Rows:        8440/10000 (In compliance, close to row limit)
Fork/Follow: Unsupported
Rollback:    Unsupported

=== HEROKU_POSTGRESQL_GREEN_URL (DATABASE_URL)
Plan:        Hobby-basic
Status:      Available
Connections: 1/20
PG Version:  9.4.1
Created:     2015-04-25 00:21 UTC
Data Size:   9.1 MB
Tables:      8
Rows:        8852/10000000 (In compliance)
Fork/Follow: Unsupported
Rollback:    Unsupported
```

# 参考

https://devcenter.heroku.com/articles/upgrading-heroku-postgres-databases
【AngularJS】単数形・複数形をいい感じに扱う

# WHAT
たとえば，下記のようなメッセージの出し分けがしたい．

* 0いいねのとき → `0 Likes`
* 1いいねのとき → `1 Like`
* 2いいねのとき → `2 Likes`

`ng-pluralize`を利用する．

# Example
細かい仕様は[公式doc][doc-ngpluralize]を参照されたい．

## Template

```html:test.html
<button ng-click="ctrl.increment()">
  <ng-pluralize count="ctrl.count" when="ctrl.messages">
</button>
```

* `ctrl.count`: クリック数が格納されている．
* `ctrl.messages`: `count`属性で指定した変数の値ごとにどんなメッセージを出すかが，オブジェクトで定義されている（template内に直接書くのもOK，書籍や公式docはそうしてる）．


## Directive
本稿ではDirectiveとして定義してある（深い意味は無い）．

### in CoffeeScript
```coffeescript:test.coffee
class TestController
  messages:
    '0': 'Not yet clicked'
    '1': '1 click!'
    'other': '{} clicks!'
  count: 0
  increment: =>
    @count++

class TestDirective
  restrict: 'E'
  controller: TestController
  controllerAs: 'ctrl'
  templateUrl: 'test.html'

angular.module('testApp', [])
  .directive('test', -> new TestDirective())
```

### in JavaScript
CoffeeScript読めない人向け．

```javascript:test.js
angular.module('testApp', [])
  .directive('test', function() {
    return {
      restrict: 'E',
      controller: function () {
        this.messages = {
          '0': 'Not yet clicked',
          '1': '1 click!',
          'other': '{} clicks!'
        };
        this.count = 0;
        this.increment = (function (_this) {
          return function () {
            _this.count++;
          }
        }(this));
      },
      controllerAs: 'ctrl',
      templateUrl: 'test.html'
    };
  });
```

JavaScript版書くのすごい消耗した．

# Reference

* [AngularJS: API: ngPluralize][doc-ngpluralize]
* [AngularJSリファレンス](href="http://www.amazon.co.jp/gp/product/4844336681/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4844336681&linkCode=as2&tag=masayuki5210-22)

[doc-ngpluralize]: https://docs.angularjs.org/api/ng/directive/ngPluralize
OpenGrokの導入

# OpenGrok
http://opengrok.github.io/OpenGrok/
ソースコード内検索/閲覧に超便利. 関数や変数をリンクで辿れるし.
Webサーバ(tomcatのWebApp)として動作する.
そこそこの規模でソフトウェア開発する場合は導入しておいた方がいいと思う.

ただ本家README見てもインストール手順がいまいちわかりづらいのでメモ.
(英語が苦手なだけかもしれないが)

以下 Ubunt14.04 に導入する手順.
http://bytesthink.com/blog/?p=184 が参考になった.

## OpenGrokに必要なパッケージのインストール 
```
$> sudo apt-get install libtomcat7-java
	# tomcat6以前を入れている場合、これを先にインストール.
	# しないとtomcat7-commonとの依存関係でtomcat7をインストールできない.
	# これをインストールすると同時にtomcat6はアンインストールされるので注意.

$> sudo apt-get install openjdk-7-jdk ant jflex ctags tomcat7
```
## OpenGrokバイナリ版ダウンロード.	
```
$> wget http://java.net/projects/opengrok/downloads/download/opengrok-0.12.1.tar.gz
$> tar -xvzf opengrok-0.12.1.tar.gz
```
以下、解凍ディレクトリパス opengok-0.12.1/ を [OPENGROK_DIR] と表記する。

## lib/以下にJFlex.jarのsymlinkを配置.
```
$> cd [OPENGROK_DIR]/lib/
$> ln -snf /usr/share/java/JFlex.jar JFlex.jar
```

## OpenGrokのデプロイ
```
$> cd [OPENGROK_DIR]/bin/
$> sudo ./OpenGrok deploy
$> sudo ./etc/init.d/tomcat7 restart
```

## 一旦ブラウザで表示確認
```
http://localhost:8080/source/
```
で表示されればOK. 

この時点でコードも検索インデックスも作成されていないので、
検索を実行すると、以下のようなエラーメッセージがでる.

dataRoot parameter is not set in configuration.xml!


## OpenGrokに必要なディレクトリの作成.
ソースコードや検索インデックス保管場所等を作ってあげなければならない.
$> sudo mkdir -m 777 -p /var/opengrok/src/  << ソースコード置き場.
$> sudo mkdir -m 777 -p /var/opengrok/etc/  << 設定ファイル置き場.
$> sudo mkdir -m 777 -p /var/opengrok/data/ << 検索インデックス等の置き場.

閲覧対象のソースコードは/var/opengrok/src以下に置く.
ソースコードディレクトリのシンボリックリンクでもOK.

## OpenGrokのインデックス作成
```
$> cd [OPENGROK_DIR]/bin/
$> sudo ./OpenGrok index

/var/opengrok/etc, /var/opengrok/data以下にファイルが生成される.

※ 新しくソースコード追加するたびにこの操作が必要.


## もう一回ブラウザで表示確認
```
http://localhost:8080/source/
```
検索を実行して、該当するコード行一覧が表示されれば設定OK.
完了.



## 参考
http://opengrok.github.io/OpenGrok/
http://askubuntu.com/questions/556954/solvedtomcat7-installation-failed-via-apt-get-on-ubuntu-14-04
これぞアプリのストア評価の秘密！【後編：対策】評価を下げない施策

※FlexFirmでは現在、アプリの運用に関するアンケートを実施しています。
ご協力いただけましたら幸いです。
　[アンケート（Googleフォームに遷移します）](http://bit.ly/1Lh0zfV)
#__アプリのストア評価を下げない施策__
（※今回はAndroidのPlayストアに対して調査を行いましたが、同じことがiOSのApp Storeに対しても言えると思います。）

ストアの評価でよくこういう感じのコメントを見かけます。
＝＝＝
　★☆☆☆☆「こんなアプリもういらない！」
＝＝＝
![arere_blog1.png](https://qiita-image-store.s3.amazonaws.com/0/32732/2bed636d-bbb0-91fb-06db-9934ee73e331.png)




こんにちはー！
クラウドソーシングテスト[「あれれサーチ」](http://arere.applihelp.com/lp/first005/?qi2)を運営しています。
「何を提供したら皆さんにつかってもらえるサービスになるのか」
日々悶々と考えています。
考えるだけでなくヒアリングもよく行いますが、課題解決を形にするのはなかなか難しいものですね。

さて[【前編】評価が下がる原因まとめ](http://qiita.com/flexfirm/items/9c80d9de6e0bef922aaf)　の続き。
【後編】評価を下げない施策です！

##ストアで高い評価を出すための方法
ストアで高い評価を出すためには、2つのアプローチがあると思います。
１つ目は
　・★４、★５を増やす＝__高評価を増やすアプローチ__
2つ目は
　・★１、★２、★３を出さない＝__低評価を増やさないアプローチ__
です。

__●高評価を増やす__
　これは優れたユーザ体験を提供する必要があります。
　なお、ベストなタイミングでレビューのためにストアへ誘導できれば、より高い評価をもらいやすくなります。
　これについては、アプリの本質を高めていくアプローチなのでこれ以上は言及しません。

__●低評価を増やさない__
　この話が今回の本題です。それでは詳しく見ていきましょう！

##ストアの評価を下げない施策

結論としては１つ
__低評価につながりやすい問題を持ったままアプリをリリースしないこと__です。

→そのためには
__低評価につながりやすい問題を__
__・「知る」こと__
__・「見つける」こと__

さらに効率的に進めるには
__低評価につながらない問題__(レアな問題)__を__
__・「知る」こと__
__・「時間を割かない」こと__
が重要です。
リソースが足りない環境においては、
特に低評価につながらない問題を知り「時間を割かない」ことが重要ではないでしょうか。



##低評価につながりやすい問題を「知る」


__無料TOPアプリの低評価とコメントの関係__
（※情報は一部。全情報は[『ダウンロードページ』](http://arere.applihelp.com/lp/whitepapers/?qi2)に置いてます。ご自由にどうぞ）
![無料TOPコメント2.PNG](https://qiita-image-store.s3.amazonaws.com/0/32732/b2f9e9d3-85da-dae2-99e0-0f5dada8e44d.png)

※なお、「もっとこういうデータがほしい！」などの意見があればください（↓googleフォームに遷移）
http://goo.gl/forms/ObzIQf74K1
参考にして、資料をブラッシュアップします。

__緊急度：__
　問題解決の緊急度です。
　★１～３の評価の割合が高い問題は、低評価をもらう可能性が高いため急いで治すべきでしょう。★１の割合が最も高ければ、修正の緊急度が最も高いといえます。
　（ただし、評価される頻度が低ければ、評価をもらう可能性は当然低くなります）


__評価される頻度：__
　問題に対してのユーザが評価（コメント）した頻度です。
　★１～４のうち、★を減らした理由が具体的に書かれたコメントのみを抜き出して集計しています。なのでこれはネガティブな関心度合いになります。
　とはいえ、この値が高いからと言って緊急性があるとは言えません。
　★３や★４の割合が高い場合、低い評価になる可能性は低いからです。
低評価につながりやすい問題は__緊急度が高く、評価される頻度も高いもの__になります。




##低評価につながりやすい問題を「見つける」

まだ多くのユーザを獲得してないフェーズ、もしくははじめてリリースするアプリの多くは
あまりお金をかけられないフェーズです。
この場合、チーム内でテストする場合が多いでしょうが、
__クラウドソーシングテスト__を利用したり、__ユーザビリティテスト__を検討してみるのも
いいと思います。
この記事の最後に「クラウドソーシングを活用したアプリ向けリモートテストサービスまとめ」を載せておきますのでご参考まで。

なお、今回の調査をもとに私たちが提供している[「あれれサーチ」](http://arere.applihelp.com/lp/first005/?qi2)は低評価につながる問題を見つけられるサービスにブラッシュアップしています。


##レアな不満には「時間を割かない」


低評価につながりにくい問題＝__緊急度が低く、評価される頻度も低い問題__です。
この問題はレアな問題です。
レアな問題にはできる限り__「時間を割かない」__でください。
治さないでいい問題に時間をかけるは__時間とお金の無駄__です。
リソースが限られている環境では、このことは特に重要なことです。

今回の調査で、低評価につながらない「レアな不満」の傾向も知ることができると思います。
先ほど載せた情報は一部でしたが、[『ダウンロードページ』](http://arere.applihelp.com/lp/whitepapers/?qi2)に全情報を置いてます。
活用してみてください。


##アプリ向けテストサービスまとめ
[あれれサーチ](http://arere.applihelp.com/lp/first005/?qi4)
[ポストコ](http://postco.jp/)
[TESTERA](https://www.testera.jp/)
[みんてす](https://www.mintest.jp/)
[UIscope](https://client.uiscope.com/)

以上です。
いかがでしたでしょうか。
皆さんの開発の助けになる情報になっていれば幸いです。

（よければ[【前編】](http://qiita.com/flexfirm/items/9c80d9de6e0bef922aaf)もどうぞ(o^∇^o)ﾉ）

---

※FlexFirmでは現在、アプリの運用に関するアンケートを実施しています。
ご協力いただけましたら幸いです。
　[アンケート（Googleフォームに遷移します）](http://bit.ly/1Lh0zfV)
secureCoding > gets()の置き換え > getline()

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら
> 動的メモリ割り当て関数 ISO/IEC TR 24731では、POSIX規格由来のgetline()関数を規定している。getline()関数の挙動は、fgets()の挙動と類似しているのに加え、...

getline()というのもあるとのこと。

fgets()、gets_s()、getline()の比較については本に詳しい。
secureCoding > C11附属書K > gets_s() > 改行文字の処理に注意

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら
> 格納先の配列に含まれる改行文字の有無に注意を払う必要がある。gets_s()を長過ぎる入力に対して使用する場合、実行時制約ハンドラを上書きする必要がある（そして用が済んだら元の値に戻す必要がある）。このような場合には、gets_s()ではなくfgets()を使用し、適切に改行文字を処理することを検討すべきである。

具体的な動きについてはまだ理解できていないが、改行文字が含まれる時に注意が必要とのこと。
secureCoding > C11附属書K > gets_s() > gets()の置き換え

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> gets_s()関数は、stdinが指すストリームからしか読み込みを行わず、改行文字も残さないので、fgets()よりもさらにgets()に近い代替関数である。

<hr>
[cppreference](http://en.cppreference.com/w/c/io/gets)
> char *gets_s( char *str, rsize_t n ); (since C11)
Heroku運用のRedmine3.0系にScrumツールを導入する

引き続きRedmineネタ。第1弾はこちら。
=> [Redmine3.0系をHerokuで動かせるようにする](http://qiita.com/KazuyaHara/items/27818ad3e7285cfefde1)

本当は[redmine_backlogs](http://www.redminebacklogs.net/)を導入したかったけど、3.0系には対応しておらず、開発も終了してるっぽいので別のプラグインを探したところ、[Agile](http://www.redminecrm.com/projects/agile/pages/1)というプラグインが良さそうなので使ってみている。

## 前提

- Heroku上で動いているRedmineがあること
- Redmineのバージョンは3.0.1
- Rubyは2.2.1
- Railsは4.2.1

## .gitignoreを編集する

```
/plugins/*
```

を削除する。

## ファイルを追加する
[Agileのサイト](http://www.redminecrm.com/projects/agile/pages/1)からLight Versionをダウンロードしてきて、```redmine/plugins/```に追加する。
追加したらredmineのrootでbundle installする。

## HerokuにPushする
```
$ git add .
$ git commit -m "add agile"
$ git push heroku master
```

でPushし、

```
$ heroku run rake redmine:plugins NAME=redmine_agile RAILS_ENV=production
$ heroku restart
```

でプラグインを適用してリスタートする。
あとはRedmineの管理画面のプラグインのところにAgileが現れているはずなので、ガシガシ使う。
有償版は$299（2015/4/27時点）だけど、無償版のLight Versionでも十分使えてる。

## お世話になったページ

- [Agile plugin](http://www.redminecrm.com/projects/agile/pages/1)
Hubotで定期的にはてブITカテゴリのホットエントリを呟かせてみる

会社でLet's Chat＆Hubotを試しに運用し始めたので、開発チームの話題提供用に定期的にはてブITカテゴリのホットエントリを呟かせるスクリプト書いてみた。

```coffeescript:hubot_hatebu_it.coffee
cronJob = require('cron').CronJob
to_json = require('xmljson').to_json
request = require 'request'
module.exports = (robot) ->
  new cronJob '00 30 09,12,15,18 * * 1-5', () =>
    url = "http://b.hatena.ne.jp/hotentry/it.rss"
    options =
      url: url
      timeout: 2000
      headers: {'user-agent': 'node title fetcher'}
    request options, (error, response, body) ->
      to_json body, (err, data) =>
        article = "はてブITカテゴリ ホットエントリ¥n"
        for id, item of data["rdf:RDF"].item
          title = item.title
          link  = item.link
          article += "#{title} #{link}¥n"
        robot.send {room:"ROOM_ID"}, article
  , null, true, "Asia/Tokyo"
```

<br>

↓の記事を参考にRSSを取得して、パースしてタイトルとURL要素から文章を生成して呟かせる。

[はてブAPIでwebサービスを作りたい全ての人に向けて書きました](http://syncer.jp/hatebu-api-matome)

<br>

1. package.jsonにcron・xmljson・requestを追記
2. 今回のスクリプトを適当にscriptディレクトリに放り込む

で準備完了。

指定した時間になったらつぶやいてくれる。

30件は流石にウザったいので個数減らそうかと検討中。
型変換によるコードの低速化

以下コードを実行する

```rb

require 'benchmark'

def f1(n)
  b = [true] * n
  (3...Math.sqrt(n).to_i.to_f).step(2).each do |i|
    if b[i]
      (i + i..n).step(i).each { |j| b[j] = false }
    end
  end
end


def f2(n)
  b = [true] * n
  (3...(Math.sqrt(n).to_i)).step(2).each do |i|
    if b[i]
      (i + i..n).step(i).each { |j| b[j] = false }
    end
  end
end



N = 10_000_000
Benchmark.bm(12) do |x|
  x.report('f1') { f1(N) }
  x.report('f2') { f2(N) }
end
```

次に、結果の一例を示す

```
                   user     system      total        real
f1             3.170000   0.010000   3.180000 (  3.199013)
f2             1.320000   0.030000   1.350000 (  1.347719)
```

二倍以上`f1`が遅いことがわかる。

# 原因

おそらく型変換。~~どちらのコードも`each`で回す毎に現在の値と終端値が比較されるが、その比較は`f1`では`int`と`float`の比較、`f2`では`int`と`int`の比較になる。~~

~~`int`と`float`の比較では、`int`が`float`に変換されてから比較されるため、その分時間がかかる。~~

f1の場合は`i`がfloatになるとのことです。
なので、`b[i.to_i]`のようになり、配列にアクセスする際に型変換が発生してしまいます。
@scivola さん、ご指摘ありがとうございます。

# まとめ

塵も積もれば山となる。少し気をつけるだけで、実行速度が数倍になるというのはよくあること。
Swiftを使ってJSONを解析する

JSONをパースして情報を取得するときのお話。

# パースには`NSJSONSerialization`を使う
JSONのパースには、下記のようにFoundationFrameworkの`NSJSONSerialization`を使用します。

```swift
NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments, error: nil)
```

[Appleのドキュメント](https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSJSONSerialization_Class/index.html)には下記のようなことが書いてあります。

 + 最上位の型は`NSArray`（配列）または`NSDictionary`（辞書）
 + 各プロパティの型は、`NSString`(`NSMutableString`)、`NSNumber`、`NSArray`、`NSDictionary`、`NSNull`のどれか
 + `NSDictionary`のキーは`NSString`
 + 数値は`NaN`と無限大は指定されない

これを踏まえたうえで、整理しました。

ちなみに、Streamから扱うこともあろうかと思いますが、ここではStreamは扱いません。
（できそうなことが書いてあるのですが、そこまでやれていないので、対象外とします。）

# パースの方法
## 最上位が配列になっている場合

下記のようなJSONを想定しています。

```json
[
    { "title": "Sample Title1", "data": "Sample Data1" },
    { "title": "Sample Title2", "data": "Sample Data2" }
]    
```

パースするときはこんな感じ。

```swift
let list:NSArray = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSArray
```

配列なので、受ける側`list`も配列(`NSArray`)で受ける。

## 最上位が辞書(Key-Valueの形）になっている場合

下記のようなJSONを想定しています。

```json
{
    "title": "Sample Title", 
    "data": "Sample Data"
}    
```

パースするときはこんな感じ。

```swift
let list:NSDictionary = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
```

受ける側`list`も辞書(`NSDictionary`)で受ける。

# `NSJSONReadingOptions`の指定
パースするときのオプションとして`NSJSONReadingOptions`を指定しますが、指定できるのは下記の３つ。
用途の応じて設定する必要があります。

 + `NSJSONReadingOptions.MutableContainers` : 返ってくる全てのObjectがMutable
 + `NSJSONReadingOptions.MutableLeaves` : 返ってくるObjectのうち、String属性のものがMutableな`NSMutableString`となる
 + `NSJSONReadingOptions.AllowFragments` : 返ってくる全てのObjectがImutable

特に変更とかしなければ`NSJSONReadingOptions.AllowFragments`でいいと思うんですが、どうなんでしょうね。
（ドキュメントを読んだ程度なので間違っているかも。。。）

# おまけ：HTTP経由でのJSONを取得方法

付属のファイルを読ませる、固定で書いてしまうなどいろいろ想定できますが、
ここではREST APIからHTTP経由でデータを取得した形を書きました。

私は、取得は下記の形でやりました。

```swift
let URL = "http://example.com" as NSString
let req = NSURLRequest(URL: URL)
let connection: NSURLConnection = NSURLConnection(request: req, delegate: self, startImmediately: false) as NSURLConnection!
        
var res: NSURLResponse? = nil;
var error: NSError? = nil;

var data: NSData? = NSURLConnection.sendSynchronousRequest(req, returningResponse:&res, error:&error);
```
golangのインストール

久しぶりにインストールからやったら変にはまったのでメモ

# 超初歩なので有益じゃないです
golangの最新バージョンはパッケージマネージャからだと入らないので直接wgetしてくる必要あり。
[ここからダウンロード出来ます](https://golang.org/dl/)
ホームディレクトリに移動してから、
まあこんな感じで。
`$ wget https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz`

次にダウンロードしたやつを展開する

`$ tar xvf go1.4.2.linux-amd64.tar.gz`

環境変数を書きましょう

```:.bashrc
export GOROOT=$HOME/go
export GOOS=linux
export GOARCH=amd64
export GOBIN=/bin
export PATH=$PATH:$GOROOT/bin
export GOPATH=$PATH
```
まあでもホームディレクトリが荒れると嫌な人は多いと思われるので(というか僕がそうなので)、一個上のディレクトリに展開するか、隠しディレクトリを作成してそこに展開しましょう。
jQueryの多重読み込みは、原則として　ダメ　ゼッタイ

ちょっとした、「望ましくないこと」が重なると、ややこしくなるお話。

<h3>jQuery-Validation-Engineが動かない？！</h3>

簡単にブラウザ上の入力フォームのチェックを実装できる
jQuery-Validation-Engineですが　なぜか動きません。

エラーログを見てみると
<pre>
Uncaught TypeError: jQuery(...).validationEngine is not a function(anonymous function) 
</pre>

発生箇所は

<pre>

//jQuery-Validation-Engine を呼び出している場所

jQuery(document).ready(function(){
	// binds form submission and fields to the validation engine
	jQuery("#formID").validationEngine('attach', {promptPosition : "bottomLeft"});
		});

//ひも付けている箇所
<form id="formID" action="catch.php" method="post"　>

</pre>

なので、ありがちな「紐付けがうまくいっていない」わけではありません。
（検索してみると、jQueryのIDがずれているケースが多数）

<h3>犯人はjQueryの多重読み込みだった</h3>

よく見てみると、jQueryが多重読み込みされていました。

まず、headの上のほうで
<pre>
language="javascript" type="text/javascript" src="/js/jquery.js"
</pre>

そして、新しく組み込んだ郵便番号を住所に変換するスクリプトで

<pre>
type="text/javascript"　src="http://jpostal.googlecode.com/svn/trunk/jquery.jpostal.js　
</pre>

※一部タグ外してます。

jQueryを利用する場合、jQueryそのものを起動するためのjsファイルを
読み込み必要が有りますが、二重に読み込んだりすると

<b>「所によりときどき問題が発生する」</b>
ことがあるようです。

原則として、複数のjQueryを読み込まないほうがよさそうです。

<h4>追記</h4>
複数のjQueryを共存させるケースもあります。

http://qiita.com/mijabi/items/c68d27bc2ea5642675af
【perl】レンタルサーバでCGI(perl)移行したときのメモ

cgi(perl)のレンタルサーバの移行を手伝ったときのメモ。perlの修正も込み。

500が出て原因不明だった。
原因切り分けのため以下を書いた。

```pl
#!/usr/local/bin/perl
print "Content-Type: text/html\n\n";
print "Your_IP=$ENV{'REMOTE_ADDR'}\n";
```

ちなみに、Content-Type: text/html\n\nを書かないと、print "hello world"だけだとエラーになった。なんでだろ。

参考：[エラー500で、Internal Server Errorとなる。](http://www.aconus.com/~oyaji/faq/apache_cgi3.htm)

まずは、CGIが実行されていなかったので①と②を対応した。

①ファイルとディレクトリのユーザが実行ユーザだとして、CGIのファイルは700以上（ファイルの実行権限が必要）、配置するディレクトリのパーミッションは600以上(ディレクトリのリード権限が必要)

②.htaccessをCGIを置くディレクトリに作って以下を書く。

```
AddType application/x-httpd-cgi .cgi
```

参考：[CGIの設置方法](http://www.tohoho-web.com/wwwcgi2.htm)


次にperlのエラーについて。デフォだとエラーが画面に出ないため、perlに以下を書いてエラーを画面に出して原因をつきとめる。もちろん、修正後はコメントアウト。

```pl
use CGI::Carp qw(fatalsToBrowser);
```
SublimeText 3のVintageでコマンドモードの時にIMEをOffにするWin&Mac

## はじめに
仕事場はWindows,自宅はMacという環境で、できるだけSublimeTextの使用感を近づけておきたいと思った時、コマンドモードになった時のIMEをOffにする機能について、次の記事を元にまとめてみました。

*  [Windows版Sublime Text3のVintage Modeでnormal modeに戻ったらIMEを無効にする](http://qiita.com/torshinor/items/1de44b428412a5e517c3)

* [MacでVintageモードから抜けてIMEをOffにする](http://qiita.com/konnyakmannan/items/53e43cb7c9a92e611864)

## プラグイン

こんな感じクラスの名称は[torshinor](http://qiita.com/torshinor)さんの名称を利用させていただきました。

```py3
import sublime, sublime_plugin
import ctypes
import platform
import os

class DisabledImeCommand(sublime_plugin.EventListener):
    def on_text_command(self, view, command_name, args):
        name = command_name.lower()

        if (name == '_enter_normal_mode'):
            if platform.system()=="Windows":
                # Ctrl+[ などで Esc のキーマップをしている場合、
                # Ctrl(キーコード17)を強制的にキー解除していないと、
                # 無変換キーが有効にならない
                ctypes.windll.user32.keybd_event(17, 0, 0x2, 0)
                # キーコード29は「無変換」キー
                # IMEの設定で無変換キーをIME Offに設定しておく必要がある
                ctypes.windll.user32.keybd_event(29, 0, 0, 0)
            else:
                # OSXならキーコード102(英数)キーを押す
                # US配列の場合は検証してません
                cmd = """
                osascript -e 'tell application "System Events" to key code {102}'
                """
                os.system(cmd)

```
CDNってどういう存在？ざっくりまとめてみた

どうしてHTMLでもかけるのにRailsタグを使う必要があるのかを聞いたのでメモメモ。
1. タグの種類
Railsのタグはたくさんあります。
- link_to
- image_tag
- javascript_include_tag
- form_tag
- stylesheet_link_tag
などなど。知っているだけ便利なものが多いようなので知識としてたくさん蓄えたいところです。
[Railsドキュメント-View](http://railsdoc.com/view)
[Railsドキュメント-HTMLタグ逆引き](http://railsdoc.com/htmls/)
2. CDNとは？
CDNとは、Content Derivery Networkの略で、[ファイルサイズの大きいデジタルコンテンツをネットワーク経由で配信するために最適化されたネットワークのこと](http://e-
words.jp/w/CDN.html)。簡単にいうと、プログラムではない比較的大きいファイル(画像とか)の専門サーバーみたいな理解。
3. 仕組み  
![cnd.jpg](https://qiita-image-store.s3.amazonaws.com/0/74581/02b89c3f-c3f5-03f4-2ebf-80f2640b9108.jpeg)

①でリクエストすると②でHTMLを受け渡す。
①の中に画像などのリクエストがあれば③からCDNにアクセスし、④で返す。
CDNはキャッシュみたな構造なので、古いファイルはだんだん消えていく。消えてしまっている(もしくは新しい)ものをリクエストがきた場合は、⑤と⑥からアクセスして取得する。
4. 負荷分散+効率化
上のような仕組みを使うことのメリットというのは、もうお分かりかもしれませんが、レスポンスのスピードが早くなります。HTMLを返すサーバーと画像などを返すサーバーを分けることができるためです。負荷が分散されることによって、Webサイトが重い・・・みたいなのを軽減するわけです。  
そして、効率化と言うのは、CDNのサーバーがたまに落ちたりすることもあるわけです。そんな時は、Webサービス用のサーバーからHTML以外のファイルも返してあげないといけません。そこでRailsのHTMLタグを使っておくと、すぐにWebサービス用サーバーから取ってくるか、CDNサーバーから取ってくるかの切り替えができるわけです。  
例えば、CDNサーバーが落ちたとすると、
`<img src="http://CDN=SERVER-NAME/image/FILE=NAME">`
↓
`<img src="http://SERVICE-DOMAIN/image/FILE-NAME">`
みたいな感じで、全てのURLを変更しないいけなくなります。
Railsを使っている場合だと
`<%= image_tag("FILE-NAME")%>`
と書いてあるだけなので、image_tagのアクセス先だけをプログラムで変えてやるだけで、すむわけです。効率化になってる！
5. まとめ
* Railsにはたくさんのタグやヘルパーがあって、知っているほど有利
* CDNという大きいファイルを受け渡すことに特化したサーバーがある
* 一般的なサーバーとCDNを組み合わせることによって、負荷分散と効率化ができる
ってな感じで理解しました。
ネタバレ無しでProjectEulerの進捗状況を書く（1~15問目）

先週火曜日からProjectEulerに参加し始めた。
[Project Euler(公式)](https://projecteuler.net/)
[Project Euler問題和訳Wiki](http://odz.sakura.ne.jp/projecteuler/)
ちなみに使用言語はSchemeで、現在の解答数はこんな感じ。
![回答状況](https://projecteuler.net/profile/aki426.png)

どの問題も、パワープレイで解けないことはないが、数学を活用すればスマートに解ける、この快感がたまらない。そんなわけで寝ても覚めても最適なアルゴリズムを考えている始末。

そんな状況なので、ProjectEulerの問題について何がしか書きたいと思ってしまうのが人間のサガというものだが、解法やそれに類することを書くのはProject Eulerの趣旨に反する。
（ネットで「ProjectEuler」ってけんさくすると、ソースコードをこうかいしてるひとがいるよ？　それってよくないよね！　ぷんぷん！　みんなもそういうサイトはみちゃだめだよ！）

そんなわけで、自分の回答状況、採った戦略などを、ネタバレ無しで、なんとなく、ぼかして、書いておくことにする。それでもヒントになってしまうかもしれないので、見る人は自己責任で。

それから、もしこれを読んで興味を持ったら、ぜひProjectEulerのサイトで問題を確認して、ついでに参加してみてほしい。プロコンと似てるかもしれないけど、数学に重点を置いているので、まずは紙と鉛筆で問題に取り組むことになるし、それはつまりいつでもどこでも気が向いたときに問題を解き始めることができる、ってことなのでとっても気楽なのだ（逆にいつでも問題に頭を悩ます、ということにもなるのだが……）。

（以下スクロールアウトのための余白。ヒントめいたものは一切読みたくない人向け。）

＊

＊

＊


***
では回答状況と基本戦略を。

Problem.1 ... solved.
手計算で解ける。
Problem.2 ... solved.
単純にフィボナッチ数列を計算するならパワープレイ。でも法則性を見つけるとスマート。
Problem.3
素数表作って総当たりで割っていけばパワープレイで解けるか？　他にもっとスマートな方法が無いか考え中……いや、素数が関わる問題だからパワープレイが正解かもしれない。
Problem.4
パワープレイするなら、計算した数を文字列に変換して、さらにreverseかけたものとマッチするかどうか、を総当たりか……。でもそれだとあんまりなので、ちょっと工夫した算数で調整してやったらスマートにいけるかなぁ、と考え中。
Problem.5 ... solved.
手計算で瞬殺。コードに落とすのもめんどくさい。
Problem.6 ... solved.
手計算でいけなくもない。高校レベルの数学。
Problem.7
素数表作ってパワープレイすれば解けるんだろうけど、何かうまい手は無いかとまだ考え中。
Problem.8 ... solved.
よく見れば瞬殺。
Problem.9 ... solved.
これも大学入試レベル。というか昔これ解いたことがある……。というわけで、解法はものの本で読んだから解けたんだけど、それを導出する論理を導き出せていない……。解けたけど情けないことにまだ考え中。
Problem.10
素数表総当たり一択なのかもしれないけど、それもスマートじゃないよなぁ、と考え中。まあでも素数の関わる問題なのでパワープレイに見えてもそれが正解かもしれない。
Problem.11
行列の操作になると思うので、Listを基本とするSchemeだとめんどくさい。ひょっとしたGaucheのライブラリに便利な手続きかデータ構造があるかもしれない。（普通の手続き型言語で）配列使えば瞬殺だと思う。
Problem.12 ... solved.
最初なかなか解けなくて苦労した。素数表作って総当たりで割っていけばパワープレイなんだけど、素数の性質を利用するとだいぶスマートに解ける。やっぱ素数の研究って大事なんだね、ということがよくわかった。
Problem.13 ... solved.
まともに全部足すとあきらかに効率が悪い。ちょっと考えればわりとスマートにいける。
Problem.14 ... solved.
コラッツの数列というのを初めて知ったけど、これ法則性があるようで無いね。
逆関数を作って逆からたどった数列作ってみたり、だいぶあれこれ試行錯誤したけど、そんなこと考えずに普通にパワープレイするのが正解だったかもしれない。
一応試行錯誤した成果はあって、ばさっと計算対象を減らすことはできたものの、さてどこまで計算量減らせたものやら……。
Problem.15 ... solved.
問題14で時間くった割には15はすぐに解けた。数学の問題は基本的にまず試行してみるのが定石だけど、これもスマートな方法がすぐ見つかる。
でも中学で習うような内容の数学が、必要な時に出てこないのってかなり悲しい……。


とりあえず現在のところこんな感じ。まずは、目指せレベル１！　とことで。
Appleワイヤレスキーボード on Macbook


- [Macで外付けJISキーボードをいい感じに使いたい - Qiita](http://qiita.com/sadoru/items/fac003c2f1f61119ac9e)

「PC/Mac両方でRealforce（JIS）１つで済むようにしたい」ということで、
Macbook + [Realforce](http://www.amazon.co.jp/東プレ-NG01B0-REALFORCE91UBK/dp/B000EQHU6M)
の組み合わせで１ヶ月弱作業してみましたが、どうにもしっくり来ないので再検討。


外付けキーボードを使うことでトラックパッドが遠くなったのでMagic mouseを併用してみた。
が、キーボードとマウスの持ち替えがやはり億劫に感じる。

”思ったところをポイントする・ドラッグする”といった操作の精度がトラックパッドでの操作に比べて落ちる。
慣れだったり、マウスの滑りの良し悪しもあったりするのでしょうが、個人的には指でダイレクトできたほうが効率がよいと感じる

また、キーボード↔マウス間を持ち帰る際の移動距離も若干のストレス。
Realforceはテンキーレスなので一応コンパクトなほうだが、それでもHome/End, PegeUp/Downとかがある分、そこをまたいで持ち替えが必要。ここも省いてしまいたい。

ということで、アップルのワイヤレスキーボード（US）を中古で購入。
- [Apple Wireless Keyboard (US)](http://store.apple.com/jp/product/MC184LL/B/apple-wireless-keyboard-us) (MC184LL/B)


職場へ持っていく前のシミュレーションをしてみた。
- https://instagram.com/p/18IDHTtZxb/ (キーボード on macbookの図）

- ちょうどピッタリ収まる
- キーボード裏についてる滑り止めゴムのおかげで打ってる間にズレることもほぼ無し
- キーボードに角度がつくので、その分は慣れが必要そう

Newキーボードの試運転がてらのメモでした。
Vagrant 共有設定 のメモ

vagrantのバージョン: 1.7.2

なんか毎回調べてる気がしてたからメモとして残しておく。

ホストマシン環境
OS: MacOSX10.10.3
VirtualBox: 4.3.26

Vagrant環境
OS: CentOS6.5

こんな感じのVagrantfile

```ruby:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "centos65"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder "./source", "/var/www/html", create: true, disabled: false, owner: "nginx", group:"nginx", mount_options: ["dmode=775", "fmode=775"]
end
```
これを元に解説していきます。

## できることリスト

1. ホスト上の共有ディレクトリを作成

	```ruby:example
	create: true
	```

	ホスト上にsourceというディレクトリが存在しなかった場合は作成する。デフォルトはfalse
	
	```bash:ホストマシン
 	$ tree
	.
	└── Vagrantfile
	
	$ vagrant up
	$ tree
	.
	├── Vagrantfile
	└── source
	```
	 作成された。
	 
1. 共有したくない場合

	```ruby:example
	disabled: true
	```
	単純に共有したくないときに設定します。
	共有を停止するだけですので、ファイルはホスト側に残っており、消えることはないかと思われます。デフォルトはfalse
	
1. 	ディレクトリの所有者と所有グループを変更

	```ruby:example
	owner: "nginx", group:"nginx"
	```
	上記の例ですと、nginxに所有者と所有グループを割り当てています。
	
1. 所有権限を変更
	
	```ruby:example
	mount_options: ["dmode=775", "fmode=775"]
	```
	先ほど変更した所有者と所有グループのディレクトリとファイルにRead & Write権限を付与しています。
	
1. 共有タイプを指定する

	```ruby:example
	type: "nfs"
	```	
	または
	
	```ruby:example
	type: "rsync"
	```	
	ファイル共有にnfsやrsyncを使いたい場合はtypeで指定します。しかし、Vagrantのドキュメントによればデフォルトで最適な共有環境を選んでくれる…らしい。

	
## 最後に
この記事ではnfsやrsyncについては触れていません。nfsは強制的にownerとかがホストの状態になる仕様があったから使わかなかったような気がする。共有のパフォーマンスに不満はないしデフォルトでいいかもって思ってるけど、rsyncは使ってみたい。rsync使ったらまたメモ残します。ありがとうございました。

### 参考
[VagrantDocsのsynced-folders](http://docs.vagrantup.com/v2/synced-folders/basic_usage.html)
MVVMについて考察


MVVMについて調査してみて、得られた理解をまとめてみます。
走り書きですが、書いてみます。
突っ込みどころがたくさんあるかと思いますが、指摘していただけるとありがたいです。
考えがしっかりでき次第、記事を新たに書き直したいと思います。

## MVVM

各クラスが公開インスタンス変数を管理することによって、画面状態の管理を安全に行うアーキテクチャです。

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/12413/18b86dd0-aa64-858d-4b61-bc14220c04f1.png "Untitled.png")


### View

ViewModelに設定された公開インスタンス変数に合わせて見た目を構成する責任を持つクラス群です。

[できること]

* ViewModelに自身をObserverとして登録できる
* ViewModelからパラメータ変更の通知を受け取ることができる
* ViewModelのパラメータを参照することができる
* 画面の見た目を公開インスタンス引数として持つ
* ユーザからのアクションを受け取ることができる
* ViewModelに動作を依頼することができる(基本的には横流し)

### ViewModel

ユーザに見せる情報を公開インスタンス変数として持ち、管理する責任を持つクラス群です。

[できること]

* Modelに自身をObserverとして登録できる
* Modelからパラメータ変更の通知を受け取ることができる
* Modelのパラメータを参照することができる
* 自クラスのパラメータを更新し、Viewに変更を通知する
* Viewからの動作依頼をメソッド呼び出しの形で受け取ることができる
* 各Modelに動作を依頼することができる

### Model

APIアクセス・主要なメモリ・CoreDataの管理責任を持つ

[できること]

* 動作依頼に対し、APIアクセス・主要なメモリ・CoreDataにアクセスできる
* 自クラスのパラメータを更新し、ViewModelに変更を通知する
* ViewModelからの動作依頼をメソッド呼び出しの形で受け取ることができる


### メリットとデメリット
* メリット
	* 各クラスは自クラスの公開パラメータの管理のみに集中できる(他のクラスの挙動を意識する必要がない)
	* クラス内で役割が閉じているためテストがしやすい(多分)
	* ビジネスロジックの実行と画面制御を混同することがなくなる
* デメリット
	* オブザーバ同期から外れた画面構成を入れられなくなる
	* 動作の流れが見えづらくなる

### その他
* Model -> ViewModel -> Viewへの情報の流れがリアクティブプログラミングに重なる
* この構成で実装するとvoidを出力とするメソッドが大半になる
* 参考文献
	* [MVVMのModelにまつわる誤解](http://ugaya40.hateblo.jp/entry/model-mistake)
Vim で 「E518: 未知のオプションです」と出た時の対処法

Vim で

```coffeescript
x = {
  vi: true
}
```

みたいなファイルを開くと
`Vim(buffer):E518: 未知のオプションです: true`
とか
`modelines の処理中にエラーが検出されました:`
みたいなエラーが出たりする

どうやら、modeline君(ファイルごとにオプション設定するやつ)が自分が呼ばれてると思ってるので切る

```vim:.vimrc
set nomodeline
```

見るのはコメントの中だけにして欲しいと思った(小学生並みの感想)
Linux/arm64のブートプロセスについてのメモ

[Linuxのブートプロセスを追うときに見るべきファイル(x86_64編)](http://qiita.com/peo3@github/items/263d167eceedf89a9d67)のarm64版のようなもの。

# ブートストラップ

[linux/Documentation/arm64/booting.txt](http://lxr.linux.no/linux/Documentation/arm64/booting.txt) によると、現在のarm64用カーネルは、x86_64用カーネルが持つようなブートストラップの機能が存在しない。実際、arch/arm64/boot/以下にはx86_64のようなソースコード(head_64.S等)が存在しない。ブートローダがハードウェアの最低限の初期化をして、解凍された生のカーネルイメージ(ELFではない)を配置、エントリポイントにジャンプしてやらないといけない。カーネルに実行を移すときの要件も、[booting.txt](http://lxr.linux.no/linux/Documentation/arm64/booting.txt)に書かれている。

ブートローダとしては、ubootやUEFIが使えると思われる。([Boot Wrapper](https://wiki.linaro.org/HowTo/BuildArm64Kernel)というのも使えるみたいだが、今も使えるかは分からない。)

# ブートプロセス

* arch/arm64/kernel/head.S
    * エントリポイントは_text
    * _textは.head.textセクションの先頭にある
        * .head.textセクションはファイル先頭の__HEAD
    * すぐにstextへジャンプ
    * いろいろ初期化
        * ブート引数を待避
        * EL2(ハイパーバイザ用の実行モード)からEL1へ落ちる
            * eret命令
        * __boot_cpu_modeにブートしたときのCPUモードを設定する
        * ページテーブルを設定
    * 最終的に__cpu_setupへジャンプする
        * 戻ってくるアドレスを__enable_mmuにしておく
        * 後で使うために、x27に__mmap_switchedのアドレスを入れておく
* arch/arm64/mm/proc.S
    * __cpu_setupがある
    * MMUをonにするためのCPUの初期化
        * SCTLRとかTCRとかTTBRの値を用意する
    * 最後にretすると__enable_mmuに飛ぶ
* arch/arm64/kernel/head.S
    * __enable_mmuでTTBR0とTTBR1を設定
    * SCTLRを設定する
    * x27レジスタを使って__mmap_switchedに飛ぶ
    * start_kernelに飛ぶ
* init/main.c
    * start_kernelがある

# Imageのファイル形式

ところで、CONFIG_EFIがyesの場合、自分でビルドしたカーネル(Image)をfileコマンドで見てみると、"MS-DOS executable, MZ for MS-DOS"と判定される。これは、(U)EFIが[PE形式(MS-DOS MZ)](http://wiki.osdev.org/MZ)を必要としているためらしい。そのため、MZヘッダのふりをするために(ファイル先頭が0x5A4Dになるように)、命令の先頭は"add x13, x18, #0x16"という意味のない命令になっている。あと_textの直後(stextの手前)にPEヘッダが用意されている。

そういえばx86_64の方でもarch/x86/boot/header.Sの先頭にそれらしきものがあった気がする。

# 参考文献
* [linux/Documentation/arm64/booting.txt](http://lxr.linux.no/linux/Documentation/arm64/booting.txt)
* [MZ - OSDev Wiki](http://wiki.osdev.org/MZ)
* [ARM Linux Boot Sequence](http://jsevy.com/linux/ARM_Linux_boot_sequence.html)