OmniAICreator/Qiita-1.07M huggingface dataset:
【FileMaker】TODOリストを作って改良していこう(6)ーもっと使いやすく（改善点の検討）


さて、[前回](http://qiita.com/tyuma/items/cb720fa5245d8ff483e0)は、実際にiPhoneで使ってみました。
そのとき、気になったところが以下です。

・「あと何日！」が微妙に目立たない
・「レコードの削除」をしたくない

# 「あと何日！」が微妙に目立たない
目立たせましょう！
目立たせたいので、文字色を変えたいのですが、できれば未完了のときには赤、完了済みの場合は別の文字列で青とかいうのに判別したいですよね。
それと、未完了のときは「期限過ぎ」と「期限内」があるので、状況に合わせて文字列を表示したいですね。

「あと＜＜あと何日＞＞！」としていたところを、「＜＜あと何日＞＞」だけにします。
![スクリーンショット 2015-12-17 0.51.21.png](https://qiita-image-store.s3.amazonaws.com/0/60538/0ecf9521-440f-bbae-c7eb-e4fe4008bca9.png)
そして、デフォルトの色を完了済みの青に設定。

未完了のときに色が変わるように、条件付き書式を設定します。
![スクリーンショット 2015-12-17 1.01.59.png](https://qiita-image-store.s3.amazonaws.com/0/60538/f293d89f-e611-8e34-8bf0-9bebe4d1de79.png)

「＜＜あと何日＞＞」の計算式も変えましょう。
![スクリーンショット 2015-12-17 1.03.21.png](https://qiita-image-store.s3.amazonaws.com/0/60538/e309ccce-0c21-2061-251f-21ab980393ba.png)

さて、どうなったでしょうか？

まずは、完了済みのTODOです。
![スクリーンショット 2015-12-17 1.04.52.png](https://qiita-image-store.s3.amazonaws.com/0/60538/dae423c3-674d-d4c5-ceba-bb7fffa9a052.png)
ちゃんと青ででてますね！

期限内のも赤であと何日かが表示できています。
![スクリーンショット 2015-12-17 1.05.03.png](https://qiita-image-store.s3.amazonaws.com/0/60538/405a776b-103f-9c9a-87cd-0ded1bd5aa1b.png)

期限が過ぎている時の文字列も、赤で表示できてます。
![スクリーンショット 2015-12-17 1.05.09.png](https://qiita-image-store.s3.amazonaws.com/0/60538/b011d764-e782-12e4-e579-85a0bf603d72.png)

この部分については、これでよさそうですね。

# 「レコードの削除」をしたくない
さて、「レコードの削除」をしたくないの対応です。
いちいち削除する際にメッセージをだすのも手ですが、メニュー自体から削除を抜いてしまいましょう。

ファイル＞管理＞カスタムメニューでメニューのカスタマイズができます。
![スクリーンショット 2015-12-17 1.07.27.png](https://qiita-image-store.s3.amazonaws.com/0/60538/e23c16e5-3ee1-cd8c-a572-a3339f4038be.png)

カスタムメニューの内容を作成します。
新規レコードの作成と複製だけに絞りました。
![スクリーンショット 2015-12-17 1.06.21.png](https://qiita-image-store.s3.amazonaws.com/0/60538/e335fda7-07cd-7e8e-4db0-be3d58095ccd.png)

この作ったカスタムメニューをファイルのデフォルトメニューにします。
![スクリーンショット 2015-12-17 1.07.46.png](https://qiita-image-store.s3.amazonaws.com/0/60538/a67b0d91-094d-d14a-3dec-94bf51349eb7.png)

# テスト
では、iPhoneで試してみましょう。

メニューがきちんと必要なものだけになってますね！
![写真 2015-12-13 10 48 23.png](https://qiita-image-store.s3.amazonaws.com/0/60538/2e7e0f9b-94ef-8919-2ef9-0ee8aeb2fac5.png)

改良としては、まずまずではないでしょうか？
引き続き、使ってみてさらなる改良点を見つけてみましょう。

いよいよ次回でこのシリーズが最後になります。
ノンプログラマーでも、実際の開発ができるようになる勉強法！(iOS編）

# はじめに

はじめまして、株式会社スマートデバイス・テクノロジー(以下SDTと呼びます)で新人研修の担当をしています。
SDTでは、新入社員に3ヶ月間研修を実施しています。

未経験者でも9割くらいの方が、1ヶ月で基本的な実装ができるようになり、
3ヶ月後にはバリバリと開発ができるようになります。
SDTでは、もはや定番の勉強法ですね。

# なぜ、ITスクールに通ったのに、テキストを読み進めたのに、開発現場で通用しないのか？

その答えは、開発現場を知らない人や現役でない人が
カリキュラムを作成しているからです。

また、市販のテキストは初心者に楽しんでもらうためのテキストが多い気がします。
その結果、趣味プログラマーの領域を超えられない。
（一部、そうではないテキストもあります。）

# なぜ、SDTの研修を受講した人は、なぜ現場で通用するのか？

SDTでは、エントリーとして、IT1,2年生が現場で任されるタスクにフォーカスを当て、
最低限必要な技術に絞って研修をしています。

また、研修内容は常に更新され、可能な限り現場に直結することを心がけています。

# 研修内容の一部をご紹介 

主な研修の流れは、下記のとおりです。

1. 1ヶ月目
 基本文法 + 基本SDKの使い方を演習問題を通して実装する。(計80問)
 成果物はコーディング規約に沿ってレビューし、一定の品質になるまで繰り返す。

2. 2ヶ月目
 一人で簡単なアプリを実装する。(5画面程度)
 いずれのアプリも、サーバー間連携、DB管理、＋　α
 ソースコードは、Gitで管理する。

3. 3ヶ月目
 複数人で簡単なアプリを実装する。
 スケジュール管理、進捗会議、チーム内レビューを行う。

まー、ここだけみると、
特別なことしてないじゃんと思うかもしれませんが、
最初の1ヶ月目の学習する順番と学習内容がミソです。
(詳細は、企業秘密です。)

# 学習方針

## 一世代前の研修生が先生役

　レビューは私が実施していますが、疑問点等の対応はすべて、
　一世代前の研修生が対応しています。
　理由は、当社の企業理念である、「自他共育」の精神からくるものです。
　これにより学ぶ喜びや教える喜びを感じ、習得度がぐっと上がります。

　ちなみに、
　超ベテランエンジニアから「こんなのもわかんないのかよ」って
　言われる会社ありますよね。
　お前も昔は、素人同然だったじゃないかー。。。

　一番レベルの近い人から助言をもらうのが一番わかり易い。

## 答えは教えない、ヒントだけ
　気合と根性でなんとかしろーという時代は終わりました。
　ヒント（キーワード）を出します。
　そこから答えを導けるように、調査やトライアルを繰り返し、
　自己解決できる能力を身につけてもらいます。

　ずばり、「魚を与えるのではなく釣り方を教えよ」です。

## 使用頻度の低い内容は、研修ではやらない。
　はい、あれもこれも必要です。

　でも本当にそれ、**今** 必要ですか？？？
「時には捨てる勇気を！」

　研修で学習すべき内容は、幹の部分ではないでしょうか。
　今、枝葉の部分は、必要ですか？

　はい、捨てましょう。
　それは、研修後にやりましょう。　

　まさに、「完璧を目指すよりまず終わらせろ」ですね。

# SDTで採用している人
　ずばり、「Action」を起こしている人です。

+ やりたい  ☓ 
* やっている  ◎

**これは、大きな違いです。**

ただし、あれもこれもちょっとづつ、手を出して中途半端な人は
まずひとつのことをやり遂げましょう！

SDTでは、習慣化をテーマに社内一丸となって取り組んでいる最中です。

**ちなみに、IT業務経験は不問です。**
**コミニュケーション能力、不問です。**

# さいごに
こんな仲間を募集しています。

+ 単純にスマートフォンアプリを作りたい
+ 開発リーダーやりたい
+ 業務系開発や組み込み開発やっているけど、本当はコンシューマー向けの開発したい
+ テストや検証作業に飽きた、開発やりたい
+ フリーになったけど、やっぱり仲間と一緒に開発したい

**開発パートナー様も随時募集しています**

続きの話を聞きたい方は、こちらへどうぞ。
・[求人募集](https://www.wantedly.com/companies/smartdt)
・[求人サイト](http://recruit.smartdt.jp/)
【vte.cx応用】18.ユーザ管理について

今日はユーザ管理について説明します。

### サービス管理者

vte.cxの管理画面から登録したユーザは**サービス管理者**になります。
そのユーザは管理画面で複数のサービスを作成することができます。

サービス管理者はサービスのデータをリセットして消したり、サービスそのものを削除したりすることができます。ただし、サービス内のデータについてはサービス管理者のACLが付与されていなければ参照も更新もできません。（デフォルトでは削除のACLしか付いていません）

### サービスで登録するユーザについて

各サービスでユーザを登録することができます。
vtecxblankにある以下のユーザ登録画面からアカウント登録ができます。
`https://{サービス名}.1.vte.cx/registration.html`

ここで登録したものが同時に他のサービスのユーザになることはありません。
他のサービスのユーザになるには、あらためてそのサービスで登録する必要があります。

ユーザ登録画面は開発者によって自由にカスタマイズすることができます。

ユーザ登録画面で登録するとそのアカウント宛に本登録用のリンクを含むメールが送信されます。
リンクをクリックすることでアカウントの本人確認が完了し本登録となります。

弊社のシステム管理者が参照できるのはサービス管理者のアカウントのみで、各サービスにて登録されたアカウントは参照できません。また、各サービスに登録されたデータも参照できません。

### パスワード変更について

パスワード変更は基本的に本人が行います。
まず、以下の画面からパスワード変更メールを送信します。
`https://{サービス名}.1.vte.cx/forgot_password.html`

メールに含まれているリンクをクリックすることでパスワード変更フォームを表示できます。後は画面の指示に従ってパスワードを変更してください。

注意：この画面で**サービス管理者のパスワードを変更**した場合は必ずサービス管理画面でもパスワード変更を行ってください。また、同じパスワードを指定するようにしてください。

サービス管理画面のパスワード変更は以下の画面から行えます。
`https://admin.1.vte.cx/forgot_password.html`

### サービス管理者によるユーザ登録

自由にユーザ登録をさせたくない場合（管理者だけがユーザ登録を行えるようにしたい）というケースもあるでしょう。

ユーザ管理権限(/_group/$useradmin)を持つアカウントであれば、?_adduserByAdminパラメータを付けてPOSTまたはPUTすることで新規ユーザを登録できます。

詳しくは、[管理者によるユーザ登録](http://reflexworks.jp/documentation.html#taggingservice.html#A19)を参照してください。

また、新規ユーザ登録を管理者だけができるものとし、自由にユーザ登録させたくない場合には、前述のアカウント登録フォームを外してください。
`https://{サービス名}.1.vte.cx/registration.html`

### ユーザステータスの管理

ユーザには以下の４つのステータスがあります。

登録なし: Nothing
仮登録：Interim
本登録：Activated
無効：Revoked

ユーザステータスは/@サービス名/{uid} エントリーの `<summary>`タグで管理しており、PUT ?_revokeuser= で無効(Revoked)、PUT ?_activateuser= で本登録(Activated)に変更できます。

詳しくは、[ユーザステータスの管理](http://reflexworks.jp/documentation.html#taggingservice.html#A11)を参照してください。

### 署名について

[10.グループを作成し共有フォルダを作成する](http://qiita.com/takeyama/items/3f031fd0aba7d633ea82)でも説明しましたが、ユーザは署名を付与することができます。つまり、Entryに署名をつけることで承認した人の記録を残すことができます。署名はその人しか付与することができません。

この機能を利用して、請求書の承認やりん議の書類にハンコを押すようなワークフローアプリを作ることができます。

詳しくは、[署名](http://reflexworks.jp/documentation.html#taggingservice.html#S)を参照してください。

ということで今日はこれでおしまいです。
明日は、設定情報(properties)とエラーページの設定です。
それでは。
Cakephp3のORMでfindが変わった。

これまではcakephp2.xしか使ったことがない私は、最近cakephp3を使ってみました。ORMがかなり改善されたそうです。その中のいくつかを見てみます。

#新しいfind
## find('first')がfirst( )に

```php:findfirst.php
// 2.x, 1.x
$article = $this->Article->find('first');

// 3.x
$article = $this->Articles->find()->first();
```

## get($pk)に
findById(\$id)のようなget(\$pk)、primarykeyでクエリーします。

```php:getByPk.php
// 3.x
$article = $this->Articles->get(10);
```

#findのreturn
cakephp2.xでは、findから返してきたのは配列の結果です。

```php:cakephp2x
$this->loadModel('Article');
$article = $this->Article->find('first');

pr($article);
/*
Array
(
    [Article] => Array
        (
            [id] => 1
            [title] => 'My Article Title'
            ...
        )
)
*/
```
cakephp3では、findがクゥエリーオブジェクトを返します。
データをそのクエリーオブジェクトから求めます。

```php:cakephp3
$articles = TableRegistry::get('Articles');
$query = $articles->find();

echo $query;
//SELECT Articles.id AS `Articles__id`, Articles.title AS `Articles__title`, ... FROM articles Articles

echo $query->first();
//{ "id": 1, "title": "My Article Title", ... }
```
*Model名は複数英単語になりました。*

**クゥエリーオブジェクトを返すことで色々なことが便利になりました。**

#条件をfind後でも修正可能

```php:alterqueries.php
$articles = TableRegistry::get('Articles');
$query = $articles->find();
$query->where(['author_id' => 1])->order(['title' => 'DESC']);
```

#subquery
サブクエリーが簡単になりました。

```php:subquery.php
$articles = TableRegistry::get('Articles');
$query = $articles->find();

$trends = TableRegistry::get('Trends');
//subquery
$trendQuery = $trends->find('all')->select(['category_name'])->where(['click >' => 100]);
        
$query->where(['category IN'=>$trendQuery]);
```

```php:subquery2.php
$query = $articles->find('approved'); //カスタムfunction findApprovedをArticlesTable.phpで設定した前提。
$favoritesQuery = $article->find('favorites', ['for' => $user]);
$query->where(['id' => $favoritesQuery->select(['id'])]);
```

#contain
cakephp3前のバージョンは、containを使う時`recursive`=`-1`にしてContainableBehaviorやModelの組み合わせなどを設定します。cakephp3ではそれをなくし`contain()`だけで実現できます。

```php:contain.php
$query = $this->Articles->find('all')->contain(['Authors']);
```

今日はここまでにします。
GStreamer でええ声を再生する(小ネタ)


GStreamer は [festival](http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-plugins/html/gst-plugins-bad-plugins-festival.html)という Element で「ええ声」が再生できます

festival: http://www.festvox.org/festival/index.html

私は Windows 上で動作確認していませんが、[ソースコード](http://cgit.freedesktop.org/gstreamer/gst-plugins-bad/tree/gst/festival/gstfestival.c)を見る限り動きそうです :)

```shell-session
$ echo 'Hello AdventCalender!' | gst-launch fdsrc fd=0 ! festival ! wavparse ! audioconvert ! autoaudiosink
```

Description にも書いていますが `festival` のインストールし、サーバーモード?で起動しておく必要があるようです。

#### ◆ festival のインストール

Debian は apt でインストールできました(その他のディストリビューションは見てません...)

```
# apt-get install festival
```

#### ◆ festival サーバーを起動


```shell-session
$ festival --server
```

#### ◆ セリフを用意する

echo をパイプしてもいいですが、もちろん filesrc を使っても大丈夫です。

```text:say
Hello AdventCalender!
```

#### ◆ ええ声を聞く

```shell-session
$ gst-launch-1.0 filesrc location=say ! festival ! wavparse ! audioconvert ! autoaudiosink
```

#### ◆ 小さな Plugin としての festival

festival のコードは非常に小さいです。

http://cgit.freedesktop.org/gstreamer/gst-plugins-bad/tree/gst/festival

ソースコードはコメント含めて、たった 0.5k なので、plugin writers guide をななめ読みしたあとに眺めてみるとすんなり読めそうです。

また、「外部のプログラムを叩いて、結果をパイプラインに流す」処理を書いているので、このような Plugin を作ろうと考えている人にはとても参考になりそうですね。
仮想環境でSpinモデル検査

#この記事は<a href=http://www.adventar.org/calendars/965>高知工科大 Advent Calendar 2015</a>の18日の記事です。

# いきさつ
なぜだかモデル検査することになったので、とりあえず研究室のWindowsに入れることに。

<strong>Cygwinが入らねえ・・・。</strong>

色々調べてみるのもいいんだけど、ダウンロードが馬鹿みたいに長いのでもうしたくない。

Linuxなら楽そう。

# なので
仮想環境でやることにしました。

環境など
- VirtualBox(15/12/18で最新のやつ)
- vagrant(15/12/18で最新のやつ)
- Ubuntu14.04(研究室にあるのと一緒にしたかった)
- spin(15/12/18で最新のやつ)

# インストール

1. `$ sudo apt-get install -y bison`でyaccをインストール
2. `$ sudo apt-get install flex`でlexをインストール
3. `$ curl -O http://spinroot.com/spin/Src/spin644.tar.gz`でソースコードをダウンロード 
※適宜 <a href=http://spinroot.com/spin/Src/index.html>公式</a>で最新版確認してね
4. 下記の手順でインストール

```
$ gunzip spin644.tar.gz
$ tar -xf spin644.tar
$ cd Spin/Src6.4.4/
$ make
$ sudo mv spin /usr/local/bin/spin
```
なんの問題もなく突破。
もう開発でWindowsはやめよう。

# 試しにちょっと
<a href=http://www.amazon.co.jp/SPIN%E3%83%A2%E3%83%87%E3%83%AB%E6%A4%9C%E6%9F%BB%E2%80%95%E6%A4%9C%E8%A8%BC%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E6%8A%80%E6%B3%95-%E4%B8%AD%E5%B3%B6-%E9%9C%87/dp/4764903539>この本</a>を参考にちょっと動かしてみる。
ちなみに言語はPromela。

```
mtype = { F, S };
mtype turn = F;

active proctype Producer()
{
do
  :: (turn == F) -> printf("Producer\n"); turn = S;
od
}

active proctype Consumer()
{
do
  :: (turn == S) -> printf("Consumer\n"); turn = F;
od
}
```

上のチュートリアル的なコードをやってみる。
パッと見で変わったところを説明すると。
`do...od`が無限ループ。
`::`からがif文。

`turn`の中に、どっちのターンなのか入ってて、どっちかのプロセスが動くと、もう片方のターンになるっぽい。

下記で実行。
```
$ spin -u100 alt1.p
```
ファイル名や拡張子は何でもいいけど、`-u`はシミュレーションの深さを指定してて、付けないと無限ループにはまる。
何度か忘れてはまった...。

実行結果

```
      Producer
          Consumer
      Producer
          Consumer
      Producer
          Consumer
      Producer
          Consumer
      Producer
          Consumer
      Producer
          Consumer
      Producer
          Consumer
      Producer
          Consumer
      Producer
          Consumer
      Producer
          Consumer
      Producer
          Consumer
      Producer
          Consumer
      Producer
-------------
depth-limit (-u100 steps) reached
#processes: 2
                turn = S
100:    proc  1 (Consumer:1) alt1.p:14 (state 2)
100:    proc  0 (Producer:1) alt1.p:9 (state 5)
2 processes created
```
しっかり順番に実行してますね。
問題なし。

#まとめ的なナニカ
本当はChromeの拡張機能でもつくろうか思ってたんだけど、12月23日までにモデル作れって言われたのでこんなことになりました......orz

とりあえず、

- Windowsで開発は正気の沙汰じゃない
- モデルによっては`-u`つけないとはまる
- SpinとPromelaの資料少なくて泣きそう
- クリスマスに死んでる可能性が微レ存
- 雑な記事でごめんなさい

明日はgyanemanのターンです！
よろしく！！
AppCompat と tintを使ってリソースを減らす

このまえでた Potatotips #24で @kaelaela さんが[リソースの整理整頓](https://speakerdeck.com/kaelaela/risosufalsezheng-li-zheng-dun) という発表をされてました。

それで対抗して自分もやってみようと調べたら、結局 AppCompatの [DrawableCompat](http://developer.android.com/intl/ja/reference/android/support/v4/graphics/drawable/DrawableCompat.html) を使うのでいいじゃん、という Googleの手中に落ちたネタです。

## やりたかったこと
@kaelaela さんの発表では、HSBのカラーフィルタをつかってました。自分はそういう色空間を使った変換じゃなくて、指定された状態で指定された色になるようにできないかなあ、できればコードを書かないでできないかなあ、と。

ちなみにできたのは以下の様なものです。`pressed`で赤くなり、`disabled` で灰色になるというものです。

![tintDrawables.gif](https://qiita-image-store.s3.amazonaws.com/0/28133/5cd80e64-0624-e1ae-1147-5bacc336933a.gif)

(マウスの周りの黒い丸は [MonoSnap](https://monosnap.com/)がクリックした時につけてくれます、念のため)

[github/dagezi/AndroidTintTest](https://github.com/dagezi/AndroidTintTest)

## Lollipop以降ではできる。はずだけど
ちょっと調べたら Lollipop以降では `tint`属性を使ってできることがわかりました。

以下のように `nine-patch`とか `bitmap` という要素を使えば、Drawableの stateごとに色を指定できるのでした:

```
<nine-patch
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/balloon"
    android:tint="@color/button_colors" /> 
```

本当は、`View` の [`backgroundTint`](http://developer.android.com/intl/ja/reference/android/view/View.html#attr_android:backgroundTint) を使うほうが簡単だけど、これだと `ImageButton` とかには適用できない、って違いがあります。

まあでもこれには落とし穴があって [`Button`と組み合わせるとうごかねーぞ](http://stackoverflow.com/questions/27735890/lollipops-backgroundtint-has-no-effect-on-a-button) って bugがあるようです。

## Lollipop以前でもできる
ということで `DrawableCompat`を使ったほうが安定してるし、古いのでも使えるしいいよね、ってことらしいです。

普通のボタンの場合、`AppCompatButton`で置き換えると `app:backgroundTint` 属性が使えるようです。しかも、`AppCompatActivity`では、layoutに `Button`と書くだけで `AppCompatButton` になります。すげえ。ここで属性の名前空間は `android:`にはならないことに注意:

```        
   <Button
        app:backgroundTint="@color/button_colors"
        android:background="@drawable/balloon" ... />
 ```
`ImageButton` のばあい、`AppCompatImageButton`がありますが、background drawableの tintしか指定できません。表の画像の色を変えるには面倒くさいけど、codeで書くしかなさそう。ここまで頑張って欲しかった:

```
        Drawable roundRects = DrawableCompat.wrap(getResources().getDrawable(R.drawable.round_rect));
        DrawableCompat.setTintList(roundRects, getResources().getColorStateList(R.color.button_colors));
        iButton.setImageDrawable(roundRects);
```

## コード書かなきゃいけないの無念
ということで、`AppCompat-v7`のおかげでほぼ目標は達成できたのだけど、リソースだけで解決できなかったのは無念。まあ、ImageDrawabeなんて昨今使わないからいいのかしらん。

個人的には、Androidの resourceの拡張性、とくに Drawableに関する拡張性が低いのがいかんのではないか。layoutにはユーザが作った Viewを指定できるのに、ユーザ定義の Drawableは指定できない。そこができれば、DrawableWrapperとかをリソースに指定してできるのになあ。

まあそもそも Materialな時代になって、こういう UI自体が淘汰されるのかもなあ、というきにもなりました。
アドブロックをしてるユーザーにページを見させない最もシンプルな方法

ユーザー的にはウェブページが軽くシンプルに見れて嬉しいのですが、サイト運営してる人からすれば広告無しにページを見られちゃうと困るって人は多いと思います。
https://github.com/sitexw/FuckAdBlock みたいなadblock対策のライブラリまで登場していますが、もっとシンプルなAdBlock対策を思いついたので、書いてみました。

対策方法
=========

広告っぽい名前のClassを見せたくない部分全体に付けてあげれば良いのです。


```html
<body class="ad adsense adv advertise advertising ads-az img_ad ad_image adsbygoogle">
<!--ここに本文を書く-->
</body>
```

上記のようにbody全体に適用すれば、CrystalやAdblock Plusなどのアドブロックを入れてるユーザーはページが白紙になりますが、他のユーザーは普通に見ることが出来ます。


利用例
=====

雑ですが・・・

```html
<body>
<div class="ad adsense adv advertise advertising ads-az img_ad ad_image adsbygoogle">
	本文
</div>
<div style="z-index:0;position: fixed;">
	<div class="ad adsense adv advertise advertising ads-az img_ad ad_image adsbygoogle" style="height: 10000000000px;"></div>
	コンテンツブロッカーを解除してください
</div>
</body>
```
これで対策出来ます。
 
最後に(2015/12/20追記)
=========
そもそもなんでアドブロックを使うユーザーが増えたかってことはサイト制作者も考えたほうがいいかもしれません。また、コンテンツを見させないことは、読者を減らす原因になり、返って広告収入を減らすことになるかもしれません。コンテンツの製作者と読者どちらにも嬉しい仕組み作りが求められるところです。
本題とは外れるのでここではこれ以上述べないでおきます。
「何のために」するのか？〜目的ははっきりと

半年ぐらいまえの話ですが、[エンジニアで稼ぐために大切な１３のコト](http://qiita.com/kazukichi/items/7379b75fba2f90d3cf45?utm_content=bufferf36e5&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer)というような記事がQiitaに上がってきました。

読んでみての自分の感想は、「納得はするけど、個人的に同意はしない」というところでした。

# 何を目指すのか
冒頭に掲げた記事の場合、タイトルからして「エンジニアで稼ぐために」となっています。そういう視点で見れば、この記事が挙げる内容は、実に合目的的な指摘となっています。会社員の枠から考えていてはおぼつかない、それも間違いないことです。

ただ、自分の場合、前提となる「エンジニアで稼ぐ」というところを目的としていないのです。というのも、大学時代に精神的なもので潰れかけた経験をしてしまって、それ以降は自分自身にかけられる精神的負荷の限度が下がった状態となっています。たとえ現在の数倍稼げる環境だとしても、精神的負荷が限度を越えてしまうようなら何の意味もありません。

なにはともあれ、「今の環境で働く理由」もしくは「こんな環境になら移動したいという基準」は考えておく必要があります。そして、今の環境に不満があるなら、

0. 環境を変える努力をしてみる
1. 今の環境の納得できる点を探す
2. 別な環境に移っていく

などの選択肢を取る必要があります。「何も考えず、ただ日銭のためだけに働く」のではそれがただ続くだけです。

# 日々の仕事でも
プログラマーとして日々の仕事をしていく中でも、この実装、この書類作成は「何のために」行うのか、考えてするのと考えずにただこなすのでは結果が違ってきます。プログラム関係でも、「20%の実装で80%の効果を得られる」ような場合が多々あって、本当に100%まで持っていくことにどれほどの意味があるのか考えておかないと、結局は本質的でないところに労力を注入してしまうことになってしまいます。


# おわりに
> なにが君のしあわせ なにをしてよろこぶ
わからないままおわる そんなのはいやだ！


（やなせたかし「アンパンマンのマーチ」より）
underscoreコードリーディング（sortBy）



underscoreに詳しくないので、勉強半分でソースコードを読む。


##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##sortByとは


###[underscorejs.orgのsoryBy](http://underscorejs.org/#sortBy)

こんな説明。
>####_.sortBy(list, iteratee, [context]) 
Returns a (stably) sorted copy of list, ranked in ascending order by the results of running each value through iteratee.
>iteratee may also be the string name of the property to sort by (eg. length).


```javascript
_.sortBy([1, 2, 3, 4, 5, 6], function(num){ return Math.sin(num); });
=> [5, 4, 6, 3, 1, 2]

var stooges = [{name: 'moe', age: 40}, {name: 'larry', age: 50}, {name: 'curly', age: 60}];
_.sortBy(stooges, 'name');
=> [{name: 'curly', age: 60}, {name: 'larry', age: 50}, {name: 'moe', age: 40}];
```

------------- 

ソート済みのlistをコピーを返す関数。ソートのランク付けには、各valueに対してiterateeを回したものを照準に並べ替えたものをresultとする。
iterateeはlengthのように、sortのプロパティ名でも問題無いです。

###[underscore.sortBy](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L374)

コード的にはこのあたり。

```javascript
 // Sort the object's values by a criterion produced by an iteratee.
  _.sortBy = function(obj, iteratee, context) {
    iteratee = cb(iteratee, context);
    return _.pluck(_.map(obj, function(value, index, list) {
      return {
        value: value,
        index: index,
        criteria: iteratee(value, index, list)
      };
    }).sort(function(left, right) {
      var a = left.criteria;
      var b = right.criteria;
      if (a !== b) {
        if (a > b || a === void 0) return 1;
        if (a < b || b === void 0) return -1;
      }
      return left.index - right.index;
    }), 'value');
  };
```

_.pluckをもちいた値を返却する。
_.pluckに渡す引数は_.mapを用いてobjを{ value:value, index:index, criteria: iteratee}の形にしたもの。
_.mapの結果は配列で返ってくるので、[ {}, {}, {}...]となっており、その配列に対して[Array.prototype.sort](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)を用いてsortする。
sortしたものは[value,value,value...]の形になっているので、これに対して、_.pluckを用いる。sortする値はvalueなので、結果valueの順にsortされたArrayが返ってくる。
SysVInit, upstart, systemd の関係の備忘録

Ubuntu での init スクリプトについて調べた際に出てきた単語の備忘録。

* SysVInit が、伝統的に使われてきた init システム
  * /etc/init.d とか
  * シェルスクリプトを記述する。
* upstart が、 init システムをもうちょっと改良しようとしたもの。 Ubuntu の canonical チームが開発
    * /etc/init とか
    * conf ファイルを記述する
* systemd が、 ubuntu 15(.04?) から使われだした、(いろいろ言われている)init 系のシステム。
    * Ubuntu が、ベースにしている Debian で採用された(されてしまった) init システム
BigQuery の新機能リリースの気配を感じる方法

# 概要

https://www.googleapis.com/discovery/v1/apis/bigquery/v2/rest っていう API がありまして、これをいつも見てれば、差分で新機能の気配がわかりますよ。という話です。

# API の中身

- URL を叩くと、ゴリっと BigQuery API の Spec を表す JSON が返ってきます
- JSON だと読みにくいので、下のようなワンライナーで YAML に変えて読んでます

```sh
curl https://www.googleapis.com/discovery/v1/apis/bigquery/v2/rest | ruby -r json -r yaml -e 'puts JSON.parse(STDIN.read).to_yaml'
```

- 現在返ってくる内容は[こんなかんじ](https://gist.github.com/yancya/c23fa3013aa61eff2b6d)です
- [こっち](https://esa-pages.io/p/sharing/819/posts/71/95878cf51c0512532ee8.html)に引っ越しました

# 気配を察知した例

## User define function

### 気配

- [revision: '20150720'](https://gist.github.com/yancya/c23fa3013aa61eff2b6d/revisions) で、'userDefinedFunctionResources' という項目が追加されました

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://t.co/KQYIf8ln2R">https://t.co/KQYIf8ln2R</a>&#10;7/20 付けで BigQuery の API に変更が来てるな。userDefinedFunctionResources だ！うおおお！？</p>&mdash; yancya (@yancya) <a href="https://twitter.com/yancya/status/624043307639836672">2015, 7月 23</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

### リリース

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">BigQuery の UDF がリリースされた！ <a href="http://t.co/vASe1W6p8C">http://t.co/vASe1W6p8C</a></p>&mdash; Kazuyuki Honda (@hakobera) <a href="https://twitter.com/hakobera/status/636212121743683586">2015, 8月 25</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## Explanation

### 気配

- [revision: '20151116'](https://gist.github.com/yancya/c23fa3013aa61eff2b6d/revisions) で、'ExplainQueryStage' という項目が追加されました

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">BigQuery の API に ExplainQueryStage などというものが追加されてるな。なんだろうこれは</p>&mdash; yancya (@yancya) <a href="https://twitter.com/yancya/status/669442543013257216">2015, 11月 25</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

### リリース

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">BigQueryのコスト上限設定が可能に。蕎麦屋の出前のようで恐縮です。それとQuery Explain機能も。 <a href="https://t.co/v8nLIP2eoe">https://t.co/v8nLIP2eoe</a> <a href="https://t.co/UQflcQVAOA">pic.twitter.com/UQflcQVAOA</a></p>&mdash; Kazunori Sato (@kazunori_279) <a href="https://twitter.com/kazunori_279/status/676930210462306304">2015, 12月 16</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# まとめ

BigQuery の新機能をリリースよりもちょっと（１ヶ月くらい）早く予感したければ、https://www.googleapis.com/discovery/v1/apis/bigquery/v2/rest の差分を監視すると面白いですよ。というお話でした

# 12 月 18 日

今日はわしの誕生日なんですが、毎年「[ウィッシュリスト](http://yancya.jp/hoshi_wish)に入れてるからには読めよ」などと言いながら難しい本を送りつけて下さる方が続出しております。ほんと勘弁して欲しいですね
第12回 MOSA Tech Meeting

<p>MOSA Tech Meetingに参加してきたので、その内容をざっと紹介する。</p>

<p>今回のテーマは『iPad Pro祭』。発表はtvOS向け開発について、iPad Pro向け開発について、iPad Proのプレゼンでの活用方法、iBeaconやEddystoneについて、iPad Proで楽しめるアプリ紹介の5本だ。</p>

<p>Bluetooth LE関連については、自分も注目している分野なので、後で、詳しく説明してみる予定。</p>

関連情報
<a href="http://qiita.com/advent-calendar/2015/cocoa/">Cocoa Advent Calendar 2015</a><br />
<a href="http://www.mosa.gr.jp/?p=31528">【夜間】第12回 MOSA Tech Meeting 開催！</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
ファイルディスクリプタの上限を設定する

[Cloudera Manager Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cm)の18日目です。

HadoopやHBase、Sparkクラスタは各プロセス大量のファイルをオープンするので、Linuxデフォルトのファイルディスクリプタ上限に容易に達してしまいます。上限に達するとまともにクラスタが機能しませんので、基本的には上限を引き上げる必要があります。
たとえば、HBaseであれば`32768`に設定することが推奨されています。

参考1: 4. Basic Prerequisites - Limits on Number of Files and Processes (ulimit)
http://hbase.apache.org/book.html#basic.prerequisites

参考2: Configuration Settings for HBase - Setting User Limits for HBase
http://www.cloudera.com/content/www/en-us/documentation/enterprise/latest/topics/cdh_ig_hbase_config.html

Cloudera Manager（以下CM）からプロセスのファイルディスクリプタ上限を引き上げる際は、各サービスの設定ページで「プロセスファイル記述子の最大数」プロパティの値を変更します。`ulimit`で検索すると簡単にたどり着けるでしょう。

![alt](https://lh3.googleusercontent.com/mXyiVxwFsnum0VkNEacz9mjYGvz-thX-RInocROehpZTbccLgDAW0dsdj5dkiy9xvKQMy-2Q0oYnLnsZHPrLIUyLLrWI8CuyyDgGwR_GMjlYTw_9AjIKFJRw69h48NncFiZjKaRkRwEG7xiM9GokJIGvPOaMZTpkAIorQ2z75SDuoDWnBGtZ8ygD56csxGijrKYlNZN1JRstdfXh1DQkhu3zAjtQG_170U3POemTelOdXLZhglbA4aiA2NuhPrb2KWli-LyOOT9icTtjKZVl5bEkyyjCak7psDXzOQg-7hPWyruJ1FGPpHyOi6ymSZ61L_ehH00W22xAAgWQgQWPtcjRCBoid3bX-90sdwK8MtCCp_Tx2eqeUH8dH0yl8lYQqWO6MRC2LlxD-bKu6xEfDy1OKYP51JHhiDATgEQM_4btIbPvhSi7XPN_uJQF6C5d-hzNvupBeSJSg3pRRgvkveEua2U-cb7n2jGZ8kqTrf3BzMf1c8qE_OBM5rJJ-J3-rpbXd8QMTcdbMwqrYtynm68LFcJoxxb-kRDAng1OEH6yPBq3GK-x9BsmunxqAItG=w642-h532-no)

ここではすべて`32768`に設定しましょう。プロセスを再起動すると反映されます。`/proc/<PID>/limits`から反映を確認できますね。

```
[root@c5 ~]# ps aux | grep -i proc_regionserver
hbase    57495 10.0  2.3 795664 193012 ?       Sl   22:04   0:17 /usr/java/jdk1.7.0_67-cloudera/bin/java -Dproc_regionserver ...
[root@c5 ~]# cat /proc/57495/limits | grep "open files"
Max open files            32768                32768                files
```

以上、小ネタでした。

参考: Configuring Maximum File Descriptors
http://www.cloudera.com/content/www/en-us/documentation/enterprise/latest/topics/cm_mc_max_fd.html
日本語まじりのprintf


結局 printf 以外の所でゴリゴリ文字長計算しないとならんのか？

```
use strict ;
use warnings ;
use utf8 ;
use Encode ;

binmode STDOUT, ":utf8" ;

sub cnt       { my $c ;  $c += /[^\x01-\x7f]/ + 1 for split //, shift ; $c  }
# めんどいから制御文字込み
sub set_space { $_[0] . +( q{ } x ( 25 - cnt $_[0]))} ;

while( <DATA>){
    chomp ;
    my @dat =  split /,/, $_ ;
    $dat[1] = set_space $dat[1] ;
    printf "%-25s%s%s\n", @dat ;
}

__DATA__
zip_code,郵便番号,blah
zip,住所,blah
name,氏名,blah
tel,電話番号,blah
fax,FAX番号,blah
mail,E-mail,blah
```


出力[^1]

[^1]: ターミナル上ではズレてません。

```
zip_code                 郵便番号                 blah
zip                      住所                     blah
name                     氏名                     blah
tel                      電話番号                 blah
fax                      FAX番号                  blah
mail                     E-mail                   blah
```

実際には、ラテン文字とかが入ったら崩壊するコード[^2]。
[^2]: `du Pré` とか `Saint-Saëns` とか。
esaにちょっとメモするためのchrome拡張を作っています→公開しました

よしはら（@yshr04hrk）です。
この記事は[esa Advent Calendar](http://qiita.com/advent-calendar/2015/esa) の18日目です。

## esaを使っていて

esaは主に個人で（1人チームで）使っていて、作りたいもののメモなど色々入れています。
しかし次第に、「esaにメモりたい！」と思った時に毎回ブラウザで開いて「NEW POST」を押すのが面倒になってきてしまいました。もっと言うと、大体仕事してる時とか他のことをしてる時にふっと思いつくことが多いので、とりあえずesaに書いて保存して元の作業に戻る、というのをもっと短いステップでできないかなーと思いました。

## ﾂｲﾊﾞﾐというchrome拡張機能を作りました

というわけでchrome拡張で「ﾂｲﾊﾞﾐ」というのを作っていますԅ( ⁰⊖⁰ԅ)大体出来上がってるのですが、もう少しやりたいことがあるので（後述）ストアに公開までは至ってません。今のところリポジトリでビルドして読み込んでます。

https://github.com/yoshihara/tsuibami

## 使い方

まずオプションページ（アイコン右クリックからいけます）でトークンチーム名を入力しておきます。
その後、アイコンをクリックするかショートカットキー（デフォルトだとCmd+i）を押します。

すると次のようにポップアップでエディタぽいものが出るので、適当に入力して「Save as WIP」を押します。（なおShip Itがないのは、基本的にメモ書きだけなのでShip It!したくなることはﾅｻｿｳ、というが理由です）

<img width="537" alt="スクリーンショット_2015-12-18_21_45_06.png" src="https://qiita-image-store.s3.amazonaws.com/0/18011/ce5c63fa-26df-f1e2-8b15-6e538624a0ab.png">

するとesaに保存されます。

<img width="596" alt="スクリーンショット 2015-12-18 21.45.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/18011/27e19e49-2a3b-dd4c-5a8f-8b54d62b1dd9.png">


保存しなくても、キーを打って0.5秒ほど待つとブラウザにデータを保存するので、esaに毎回保存しなくても大丈夫なようになっています。また、大体書いたから後はesaで(\\( ⁰⊖⁰)/) みたいなときはポップアップからesaに飛べます。ちなみに保存前にはカテゴリとタイトルが同じ記事があるかを先に検索して調べていて、あった場合は上書き、ない場合は新規となるようになってます。

## 今後

ほぼほぼ出来上がってるのですが、esareaをhttps://github.com/nakajmg/jquery.esarea で入れようかなーとかアイコンをチームのアイコンを表示するか独自に作ったものを使うようにしようかなーと思っています（今は公式のアイコンをお借りしております（READMEにCreditを記載しています。大丈夫と思ってるのですが書き方間違ってたらどうしよう。。。）あとキーボードショートカットをできたら入れたい...いまは保存するためにボタンを押す必要があるので、キーボードで完結できたらいいなと思ってます。
~~他にも色々直したいところがあるので、その辺り終わったらストアに公開したいな(\\( ⁰⊖⁰)/)~~ キーボードショートカットは入れてないけど公開しました！よろしくお願いいたします！
https://chrome.google.com/webstore/detail/tsuibami/fdlmhgjffhgfdgcihijjlfgglhkkbghn
UIImageにTapGestureを指定したのに、反応してくれなくて困ったとき

# 本家のチュートリアル

[Start Developing iOS Apps (Swift): Work with View Controllers](https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson4.html#//apple_ref/doc/uid/TP40015214-CH6-SW1)

## UIImageをタップしたら、写真選択

よくあるやつ。

- UIImageを配置
- UITapGestureRecognizerをドラッグドロップ

![image](https://qiita-image-store.s3.amazonaws.com/0/5691/9e87cb99-5db9-3a83-6a95-608e1a7825bd.png)

## TapGestureが追加される

![image](https://qiita-image-store.s3.amazonaws.com/0/5691/d94c5e79-4635-4883-56c5-604939d06d38.png)

## ここからViewControllerに action を関連づける

![image](https://qiita-image-store.s3.amazonaws.com/0/5691/2bd10fa6-ecf8-45ff-a062-e5cfe3988425.png)

### これだけじゃ反応しない！

UIImageやUILabelなんかはGestureを紐付けるだけでは、ジェスチャーに反応してくれない。

## User Interaction Enabled YES

![image](https://qiita-image-store.s3.amazonaws.com/0/5691/299cbac6-d91e-3c2e-4606-8def030ed68f.png)

参考URL : [UILabelやUIImageViewが応答しない場合の対処法 | iPhoneアプリ練習帳](http://php6.jp/iphone/2011/11/11/uilabel%E3%82%84uiimageview%E3%81%8C%E5%BF%9C%E7%AD%94%E3%81%97%E3%81%AA%E3%81%84/)


時差で2回ハマって無駄な時間を過ごしたので、メモることに。
さすがに3回目はない・・
JavaでProperty-Based testing その２ [junit-quickcheck] 


テストツールAdventCalendar 2015 18日目の記事です。

#導入#
先日、ランダムデータを作ってテストしたいケースがあり、ランダムデータ生成やProperty-based testingのライブラリを探しました。
jPopulatorに続き、junit-quickcheckを試してみることにしました。
[readme](https://github.com/pholser/junit-quickcheck)を読みながら試してみます

#使い方#
まず、もっともシンプルな使い方です。

```
    import com.pholser.junit.quickcheck.JUnitQuickcheck;
    import com.pholser.junit.quickcheck.Property;
    import org.junit.runner.RunWith;

    import static org.junit.Assert.*;

    @RunWith(JUnitQuickcheck.class)
    public class StringProperties {
        @Property public void concatenationLength(String s1, String s2) {
            assertEquals(s1.length() + s2.length(), (s1 + s2).length());
        }
    }
```
これでconcatenationLengthのテストが0~200文字のランダムな文字列で100回呼ばれます。

### Generatorを指定して実行
@FromアノテーションでGeneratorのクラスを指定することでいろいろな値を生成することができます。

```
@RunWith(JUnitQuickcheck.class)
    public class IdentificationProperties {
        @Property public void shouldHold(@From(Version5.class) UUID u) {
            // ...
        }
    }
```
カスタムGeneratorはcom.pholser.junit.quickcheck.generator.Generatorkurasu を実装するだけで作成できます。実装が必要なabstract methodはgenerate()メソッド一つなので簡単です。  

```
import com.pholser.junit.quickcheck.generator.GenerationStatus;
import com.pholser.junit.quickcheck.generator.Generator;
import com.pholser.junit.quickcheck.random.SourceOfRandomness;

public class HogeGenerator extends Generator<String> {
    public HogeGenerator() {
        super(String.class);
    }

    @Override
    public String generate(SourceOfRandomness random, GenerationStatus status) {
        return "hoge";
    }

}
```


### @InRangeを使った生成データの範囲指定
```
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.hamcrest.Matchers.lessThanOrEqualTo;
import static org.junit.Assume.assumeThat;

import java.util.List;

import org.junit.runner.RunWith;

import com.pholser.junit.quickcheck.Property;
import com.pholser.junit.quickcheck.generator.InRange;
import com.pholser.junit.quickcheck.runner.JUnitQuickcheck;

@RunWith(JUnitQuickcheck.class)
public class SingleDigitProperties {
    @Property
    public void hold(@InRange(min = "0", max = "9") int digit) {
        // hope we get enough single digits
        assumeThat(digit, greaterThanOrEqualTo(0));
        assumeThat(digit, lessThanOrEqualTo(9));
        System.out.println(digit);
        // ...
    }

    @Property
    public void hold(List<@InRange(min = "0", max = "9") Integer> digits) {
        System.out.println(digits);
        // ...
    }
}
```


### assumeThat
今回試したときにはバグがあって正しく動作しなかった。


### @When OGNL記法
`@When(satisfies = "#_ >= 0 && #_ <= 9")`
この記法は動作しなかった

## その他

### シンプルに回数指定
` @Property(trials = 250) public void northernHemisphere(`
Propertyにtrialsの値を渡すと指定した回数実施される。

### Seed と Shrink
今回は時間がなくて試すことができなかった。

### Readmeのサンプルコードで使っているHamcrest
HamcrestのMatherは2.0を使っている様子



## まとめ
alphaバージョンだけあって、ドキュメント通りにやってみて動かない機能や、そもそも動かない機能があった。スマートに書けるので今後に期待したい。

今日は以上です。

次はFunctional-JavaのQuickcheckに挑戦する予定。
EXCELの「配列数式」が、かなり便利

[日経PC21 / エクセル（Excel）「配列数式」講座](http://pc.nikkeibp.co.jp/pc21/special/hr/)でEXCELの配列数式について紹介されており、配列数式を試しに使ってみたところ、かなり便利だったのでメモ。

## 概要
・通常の数式で単一のセルを選択する箇所で、複数のセルを選択する
・数式入力後、Ctrl + Shift + Enterを押下することで、「配列数式」となり（数式が{}で囲まれる）、複数のセルの各セルでの計算結果が集計される
・配列数式を利用することで、通常の数式だけではどうしても必要になっていた、作業用のセルを使わなくて済む

## 使用例

A列とB列の各行がすべて同じか判定する

```
{=AND(A:A=B:B)}
```

A列とB列の各行のいずれかが同じか判定する

```
{=OR(A:A=B:B)}
```

A列の各セルのバイト数の最大値を求める

```
{=MAX(LENB(A:A))}
```

A列の各セルのバイト数の合計値を求める

```
{=SUM(LENB(A:A))}
```

A列のうち、10以上の値をもつセルの個数を数える

```
{=SUM(IF(A:A>=10,1,0))}
```

他にも色々と応用が効きそうです。

## まとめ

日常のちょっとした作業の効率化に使えそうですが、知らない人が配列数式を見たら「何コレ怖い」ってなりそうです（笑
ちなみに私は最近まで配列数式というものの存在すら知らなかったのですが、世の中ではどのくらい配列数式が知られているのか、少し気になります。
ACME


ACMEとは、Automatic Certificate Management Environment の略で、[Let's Encrypt](https://letsencrypt.org/)の中で使われているプロトコルです。HTTPS + JSONが使用されます。

Let's Encryptでは、2015/12/3にPublic Betaがアナウンスされたことで、今現在すでに[15万以上](https://letsencrypt.org/stats/)のDV証明書（ドメインの所有証明）が発行されています。

IETFの[draft段階](https://tools.ietf.org/html/draft-ietf-acme-acme-01)であり、github上にも[Working Area](https://github.com/ietf-wg-acme/acme/)があるようです。
→2019/3にRFC8555となっているようです。

ここのblogが非常に詳しくて勉強になります。
[SOTA: Go言語でLet's EncryptのACMEを理解する](http://deeeet.com/writing/2015/12/01/go-letsencrypt-acme/)
なるほどなるほど、このSOTA blogによると

- 各操作を行うためのURIを知る
- クライアントの登録を行う
- 認証（ドメイン所有の確認）を行う
- 証明書（Certification）を発行する

の4つのステップがあるようです。
通信するJSONには署名が必要で、そこにJWKやJWSを使うとのこと。
JWxに関しては同blogでも紹介されている[“GoでOAuth2/OpenIDとJOSE (JWA/JWT/JWK/JWS/JWE)”](http://hde-advent-2015.hatenadiary.jp/entry/2015/12/02/095643)がためになります。

JWT(JSON Web Token)なるキーワードはこれまで小耳に挟んだことはありましたが、そうか、こういうところで使うものなのか。なるほど。



## 参考

+ [SOTA: Go言語でLet's EncryptのACMEを理解する](http://deeeet.com/writing/2015/12/01/go-letsencrypt-acme/)
+ [“GoでOAuth2/OpenIDとJOSE (JWA/JWT/JWK/JWS/JWE)”](http://hde-advent-2015.hatenadiary.jp/entry/2015/12/02/095643)
+ [Let's Encrypt を支える ACME プロトコル](http://jxck.hatenablog.com/entry/letsencrypt-acme)

+ [ACMEプロトコル](https://github.com/letsencrypt/acme-spec) ([As HTML](https://letsencrypt.github.io/acme-spec/))

+ [Automated Certificate Management](https://ripe71.ripe.net/presentations/32-Automated-Certificate-Management.pdf)
+ [Let's Encrypt で手軽に HTTPS サーバを設定する](http://qiita.com/ww24/items/9fa19594b4e3a8eb9b6f)

+ [ACME WGの動向](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=10&ved=0ahUKEwjsxKWxo-XJAhUn5KYKHQ7fC8wQFghXMAk&url=https%3A%2F%2Fwww.isoc.jp%2Fwiki.cgi%3Fpage%3DPreIETF94%26file%3Dietf94study_04-B_topic_shimaoka.pdf%26action%3DATTACH&usg=AFQjCNEQ4n8v_PngHdfaTcL3Xt_bHh28Ng&sig2=BgpIWikAXgLn_nvHu7yD-w&bvm=bv.110151844,d.dGY&cad=rja)



おわり。
CLIで電話番号を買ったりする

電話APIを提供している [Twilio](http://twilio.kddi-web.com/) では、Webの [管理画面](https://jp.twilio.com/user/account/phone-numbers/getting-started) から電話番号を買ったり、それに紐づく `API` の設定をすることができます。今回は、`Ruby` を用いて `CLI` でそれらの操作をしてみます。

[twilio-ruby](https://github.com/twilio/twilio-ruby) の gem を利用します。

##クライアント

```rb
#!/usr/bin/env ruby
require 'twilio-ruby'

# put your own credentials here
account_sid = 'XXXXXXXXXXXX'
auth_token = 'XXXXXXXXXXXXX'

# set up a client to talk to the Twilio REST API
@client = Twilio::REST::Client.new account_sid, auth_token
```

## 契約している電話番号を調べる

```rb
numbers = @client.incoming_phone_numbers.list
numbers.each{|n| puts n.phone_number}
```

## 購入する電話番号を検索する
ここでは、`JP` の指定だけしかしていませんが、電話番号が `SMS` を受信できるかどうかなど、パターンにあった電話を検索することができます。

```rb
numbers = @client.available_phone_numbers.get('JP').local.list
numbers.each_with_index do |n, i|
  puts "#{i + 1} : #{n.phone_number}"
end
```

## 電話番号を購入する

`050` ではじまる番号なら `108円/月` とかで購入できます。

```rb
@client.account.incoming_phone_numbers.create(phone_number: number)
```

## 電話番号の設定をする

購入した電話番号の `RequestURL` の設定をします。ひとまずこれだけ設定できればアプリケーション作れます。
なぜか、`RequestURL` は `voice_url` というkey で設定するので注意が必要です。

```rb
number.update(voice_url: "http://demo.twilio.com/docs/voice.xml")
```

## 購入した電話番号を解除する

```rb
number = @client.account.incoming_phone_numbers.get(sid)
number.delete
```

## まとめ
`CLI` でいろいろ操作できて便利ですね。　　


## REF

- https://github.com/twilio/twilio-ruby/tree/c4ffe31cbd73f15a961d70d134a09adc3cee88b8/docs/usage
- https://jp.twilio.com/docs/api/rest/incoming-phone-numbers
- http://stackoverflow.com/questions/24924557/twilio-update-the-voice-or-message-url-via-api
1分で出来る、SwiftにBridging Headerを追加しProjectに反映

SwiftからCrypto系のライブラリを呼ぶのに色々と手を焼いてしまい
忘れないようメモメモ。

## 1.Objective-CのFileを新規に作成

![1.png](https://qiita-image-store.s3.amazonaws.com/0/105345/84403115-f982-1ba6-02bf-d9cb645caa7a.png)


## 2.Bridging Headerを生成。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/105345/fef2e8f6-e8f8-d4cc-6e9a-175fab94b0f2.png)

## 3.新規に作成したObjective-CのFileは削除。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/105345/7c2b68dd-7e05-9642-2185-9fb3c306ca12.png)

## 4.完了

![4.png](https://qiita-image-store.s3.amazonaws.com/0/105345/aa9e5bb8-fda5-ecc7-4368-7ca1e5edc064.png)


ProjectのBuild Settingsには、↑で追加したBridging Headerが既に登録されているので
特に設定を変えずに使えます。
Rails + erb、slimを使ってdiv要素を3つずつrowで囲む

Bootstrapでお馴染みのこちらの構文。

```html
<div class="row">
  <div class="col-md-4">
    <div class="item">item1</div>
  </div>
  <div class="col-md-4">
    <div class="item">item2</div>
  </div>
  <div class="col-md-4">
    <div class="item">item3</div>
  </div>
</div>
```

HTML直書きなら簡単ですが、Railsで`@items = Item.all`みたいのをこの書式で表示しようとしたときにちょっと躓きました。

結論、これでいけます。

```erb:erb
<% @items.each_slice(3) do |group| %>
  <div class="row">
    <% group.each do |item| %>
      <div class="col-md-4">
        <%= item %>
      </div>
    <% end %>
  </div>
<% end %>
```

```slim:slim
- @items.each_slice(3) do |group|
  .row
    - group.each do |item|
      .col-md-4
        = item
```
Crystalでこんな感じにWebアプリを書けたらきっと幸せだろうなという妄想

この記事は[Crystal Advent Calendar](http://www.adventar.org/calendars/800)の18日目の記事です。

CrystalのWeb Application Frameworkをあさっていて、好きなフレームワークが見つからなかったので、
こういうのが欲しいな。書きたいな。あるいはだれか書いてほしいなって感じのやつです。
名前はとりあえずWavesとしていますが変えるかも。

```rb
require 'waves'

class MyApp::Middleware::Sample
  include Waves::Middleware

  on_req do |c|
    # you can hook on request (e.g. authorization
  end

  on_res do |c|
    # you can hook on request
  end
end

class MyApp::Context
  include Waves::Context

  BASE_DIR = "./template"

  view(:json) do |c|
    Waves::View::JSON.new
  end

  view(:html) do |c|
    Waves::View::ECR.new(c, BASE_DIR)
  end
end

class MyApp::Controller::Root
  include Waves::Controller

  def index(c) # c is context object
    foo = c.req.parameters["foo"] # => Str|Array(Str)
    c.view(:html).render("path/to/index.ecr", { :foo => foo }) do |res|
      res.cookies.set("foo", "bar", { :secure => true }) # optional
      res.headers["X-MyApp-Header"] = "Hoge" # optional
    end
  end
end

class MyApp::Router
  include Waves::Router

  get "/", MyApp::Controller::Root, :index
end

class MyApp::Server
  include Waves::Server

  context MyApp::Context
  router MyApp::Router

  middlewares do
    enable MyApp::Middleware::Sample
  end
end

MyApp::Server.new(8080).run()
```

疎結合なパーツを作って関連付けることで大きなものを作るという感じが好きなのです。

## View

レスポンスとして返すデータを整形するやつです。
デフォルトでよくあるやつは定義されますが独自のものを使うこともできます。

## Middleware

リクエストやレスポンスにフックする君です。

## Cotnext

ユーザーからのリクエストごとに生成されるコンテキストです。
コンテキストがRequest/Responseなど、リクエストのコンテキストを表現するオブジェクトを持ちます。
また、コンテキストに依存する各機能への移譲も行います。
PerlのAmon2が分かる人向けに言えばAmon2::Webに近いといえます。

## Controller

エンドポイントで行われる処理を定義します。
Contextオブジェクトが渡されます。
こんな具合でContextとおなじインターフェースを作ればmockできるようにしてテストしやすくしたいです。

## Router

ルーティングを定義します。
`get` とかをmacroとして提供してコンパイル時にルーティングテーブルが構築されて楽しい感じにしたいです。

## Server

アプリケーションを構成する要素を結合してWebサーバーをコンパイル時に実装します。
コンパイル時に実装できると楽しい。

# 課題

マクロ芸の能力がまだたりない

# まとめ

こんな感じの疎結合でテストしやすいWAFができて、かつMySQLがCrystalから使えるようになって、かつPerl5のDBIみたいなやつが提供されると、個人的にはCrystalでWebアプリ書くのだいぶ良い選択肢になるので、
そういう世界にしたいし、ぼくはそこを目指したいなという気持ちでいっぱいです。
まだまだyak shavingがたくさんひつようそうで道のりが長そうですが、のんびり頑張っていきたい。
mocha：before 内で API を好きなだけ直列できるスニペット

# デグレった

うわー！ってなって、やっぱテスト書こうよーって音頭取ってやってみたのでメモ。いわゆる一つのカッとしてやった系です。

# 道具立て

社内 proxy 経由で API 叩ければいいので、普通です。あと coffee ではなくピュアな js です。

- mocha
- should
- request

# 問題

テストする前に、DB をきれいにしておきたい。でも、直接 DB には触れないので、テストする API とは別に DB が用意してくれてる API を叩きたい（いわゆるひとつの ArangoDB）。

でも、そうすると非同期だから完全に待つようにしないとだよね。まあ、before で done を取れるからそこは問題ない・・・はずが、before でいろいろ初期化したい　→　たくさん Arango 叩きたい　→　コールバック地獄（今更感）・・・という展開に。

# どうする？

このご時世、非同期ライブラリなんざたくさんあるし好きなの使えばいいじゃんついでに最新トレンド学ぶいい機会だし一挙両得winwin～と思ったけど、ふと、[Nightmare を拡張した時](http://qiita.com/t-suwa/items/a886da112b136c908755)のことを思い出して、継続取るだけだし単機能だから簡単に自作できるんじゃない？っていつものように独りごちたら「You、やっちゃいな Yoda！」って声が聞こえた（どうかしてる）ので書いてみたら 10 分もかかってしまった（そんな目で見ないで！）のはフォースが足りないのです、明らかに。

```js
var cascade = function (finish) {
  var queue = [];
  var next = function (err) {
    if (err) throw err;

    if (queue.length) {
      queue.shift().call(this, next);
    } else {
      finish();
    }
  };
  return {
    run: function () {
      queue = [].slice.call(arguments);
      next();
    }
  };
};
```

# 使い方

処理の最後に引数 done を呼び出す関数の参照を好きなだけ好きな順序で渡せば良い。同期に非同期は混ぜられない。そんな複雑なことはできないしフォースが足りない。

```js
var async = function (done) {
  setTimeout(function () {
    console.log("async");
    done();
  }, 1000);
};

var finish = function () {
  console.log("finish!");
};

cascade(finish).run(
  async,
  async,
  async
);

console.log("start");
```

って書けば

```
start
async
async
async
finish!
```

となる。途中で失敗するような、

```js
var fail = function (done) {
  done(123);
};

cascade(finish).run(
  async,
  fail,
  async
);
```

みたいなパターンも

```
start
async
ここで例外発生
```

となってちゃんとコケる。良い。かわいい。

# まとめ

- ちゃんとした非同期ライブラリ使おう
- スターウォーズ観よう（棒読m）
Railsで利用するフロントエンドのライブラリをnpmからインストールする

Railsからnpmを使ってフロントエンドのライブラリをインストールして使うまで。

asset pipelineフレンドリーで使うための方法で、browserifyとかwebpackとか言いたい人は別途検討したほうがいいかもしれない（そうでないかもしれない）。

# package.jsonを作る

railsプロジェクト以下に`package.json`を作りましょう。

```json:package.json
{
  "name": "project name",
  "version": "1.0.0",
  "private": true
}
```

ポイントは`"private":true`を書いておくことです。
これを書かないと、ライセンスやオーナーを書けと怒られます。

オープンソースのプロジェクトでもない限り、ライセンスもオーナーも書く必要なんてないですよね？

# ライブラリのインストール

コマンドラインから通常、npmを使う感覚でインストールしてあげればいい。

```
npm install --save [library]
```

`--save`とオプションをつけておくと、インストール後に`package.json`を自動で更新してくれる。

インストールパッケージは`package.json`に書いておいて、`npm install`するだけでもいい。

# Railsの設定

Bowerを使う時とおなじ感覚で`config/initializers/assets.rb`を編集してあげれば良い。

```rb:config/initializers/assets.rb
Rails.application.config.assets.paths << Rails.root.join('node_modules')
```

# assetの書き方

`node_modules`以下のパスを見ながら`require`してあげる。

例えば、jqueryをインストールしたなら、`node_modules`以下は下記のようになっている（はず）。

```
node_modules/
  jquery/
    dist/
      jquery.js
      jquery.min.js
      jquery.min.map.js
    src/
     .
     .
     .
```

使いたいのは`jquery/dist/jquery.js`なので、このパスを`app/assets/javascripts`の中のjsファイルでrequireする。

```js:app/assets/javascripts/example.js
//= require jquery/dist/jquery
```

# デプロイ

デプロイにcapistranoを利用していない場合は、自前でrakeタスクとか書きましょう。

capistranoを利用している場合は、[capistrano-npm](https://github.com/capistrano/npm/)というgemがあるので利用するといいかも。

細かい設定などを考えないならgemをインストールして`Capfile`で`require`してあげるだけで、
デプロイ時にnpm installしてくれるようになる。

```diff:Gemfile
  group :development # 環境は適宜変えるんだよ
+   gem 'capistrano-npm'
  end
```

```diff:Capfile
+ require 'capistrano-npm'
```

> ただし、そのまま使うと、releaseディレクトリ直下にnpm installされるんで本格的に使うには色々いじってあげないといけません。

---

npmに登録されるライブラリは新しいなんて、噂に聞くけどフロントエンドのものに限定すれば、そんなこともないように見える。

bowerかnpmか？というところの判断は、スポンサーの存在で決めるのが良いのかなぁと考えています。

スポンサーという点においては、bowerが個人の寄付で成立しているのに大して、npmはnpm.incという企業がスポンサーになっているのでnpmのほうが有利であるように感じる。
SlackのHandyReactions

Slackの誰かの発言のところにマウスを持って行くと出てくる顔を選ぶと顔文字メニューを使う。

![slack.png](https://qiita-image-store.s3.amazonaws.com/0/59141/67560c7b-b590-9faf-87a2-a363ae76323e.png)

その中にある Handy Reactions から何か選ぶと選んだ人の分だけ数値が出る。
チェック付いたやつを選ぶとこんな感じでチェックマークと数字が出てくる。

![check.png](https://qiita-image-store.s3.amazonaws.com/0/59141/806fbd04-8bc8-1763-a4f2-bd313d5ebb97.png)

みたいなことか。
【WIP】EC-CUBE3.0はデザインテンプレートでプラグインも変えられる

[EC-CUBE3.0 プラグインアワード](http://www.ec-cube.net/events/plugin_award_30/) の〆切は12月21日（月）までですが、プラグインが続々とよせられてきております。

プラグインでページが増えたり、ブロックが増えたりしますが、そのデザインの当然サイト毎に合わせて整えたいものです。

[EC-CUBE3系の開発ドキュメント](http://ec-cube.github.io/)をみると、EC-CUBE3.0では、[デザインテンプレートの探査順序](http://ec-cube.github.io/template.html)があり、以下のようになっています。

  1. app/template/[template_code]
  2. src/Eccube/Resource/template/default
  3. app/Plugin/[plugin_code]/Resource/template/[template_code]

これを言い換えると

1. カスタマイズしたテンプレート
2. EC-CUBEに同梱されているデフォルトテンプレート
3. プラグインに同梱されているテンプレート

という順番に、期待されるテンプレートを探しにいって、該当のものがあればそれが読み込まれるという仕様です。

「プラグインに同梱されているテンプレートファイルが一番最後に読まれる」
ということは、プラグインが探しているファイルと同じものがあれば、プラグインに修正を行わずとも、自分がカスタマイズしたテンプレートを適用する事ができます。

理屈としては、そうなのですが、実際にやってみないとわからないと思いますので、オーナーズストアのプラグインを使って試してみましょう。

と、ここでちょっと手を離さないといけないので、
実際にやってみた結果を後ほど追記します。

明日は、 @Geany です。
[Unity] Xcodeで"_SecTrustEvaluate", referenced from: エラーが出る


Unity 5.2.3f にバージョンアップしたところXcodeで"_SecTrustEvaluate", referenced from:... エラーが出たのでその対処法を記載します。

>
Undefined symbols for architecture armv7:
  "_SecTrustEvaluate", referenced from:
      l154 in libvrunity.a(GTMSessionFetcher.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

![スクリーンショット 2015-12-18 19.20.49.png](https://qiita-image-store.s3.amazonaws.com/0/58251/17299611-e89b-e1a6-d460-ec3148e2ea67.png "スクリーンショット 2015-12-18 19.20.49.png")




## 原因と対処方法

リンクするフレームワークに Security.framework が足りないためこのエラーが出ています。追加しましょう。


- プロジェクトの設定 General を開く
- Linked Frameworks and Libraries の**+**をクリック

![スクリーンショット 2015-12-18 19.21.15.png](https://qiita-image-store.s3.amazonaws.com/0/58251/3e40a072-6795-fbf3-0554-c1989e4a8630.png "スクリーンショット 2015-12-18 19.21.15.png")

Security.frameworkを追加

![スクリーンショット 2015-12-18 19.22.04.png](https://qiita-image-store.s3.amazonaws.com/0/58251/84bd6938-d679-a533-f80a-7633266114b2.png "スクリーンショット 2015-12-18 19.22.04.png")

![スクリーンショット 2015-12-18 19.22.13.png](https://qiita-image-store.s3.amazonaws.com/0/58251/a6eeff6f-fd09-9f76-c56c-fe8a6ecec05e.png "スクリーンショット 2015-12-18 19.22.13.png")



## 情報元

[Xcode 7 error. Missing required architechture when building](http://stackoverflow.com/questions/32992470/xcode-7-error-missing-required-architechture-when-building)

>
Add the Security.framework to your target in Link Binary with Libraries and build
ホームディレクトリに tmux と mosh を入れる

# 概要
踏み台サーバー入ったら tmux も mosh も入ってねえ！
でも、グローバルにインストールしたくない…（できない場合含む）。
そんなときには、こうすればホームディレクトリにインストールできるぞい！という記録。

# tmux
## preparing for build
```bash
cd $HOME
echo 'export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$HOME/local/lib' >> .zshrc
echo 'export PATH=${PATH}:$HOME/local/bin' >> .zshrc
mkdir build_dir
```

## install libevent
```bash
cd $HOME/build_dir/
wget --no-check-certificate -O- https://sourceforge.net/projects/levent/files/libevent/libevent-2.0/libevent-2.0.22-stable.tar.gz |tar xz
cd libevent-2.0.22-stable/
./configure --prefix=$HOME/local
make
make install
```

## install ncurses
```bash
cd $HOME/build_dir/
wget -O- http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz | tar xz
cd ncurses-5.9/
./configure --prefix=$HOME/local --with-shared
make
make install
```

## install tmux
```bash
cd $HOME/build_dir/
wget -O- https://github.com/tmux/tmux/releases/download/2.1/tmux-2.1.tar.gz |tar xz
cd tmux-2.1/
./configure --prefix=${HOME}/local LDFLAGS="-L${HOME}/local/lib" CFLAGS="-I${HOME}/local/include -I${HOME}/local/include/ncurses"
make
make install
```

# mosh
## install protocol buffer
```bash
cd $HOME/build_dir/
wget -O- https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz |tar xz
cd protobuf-2.6.1/
./configure --prefix=$HOME/local
make
make install
```

## install zlib
```bash
cd $HOME/build_dir/
wget -O- http://zlib.net/zlib-1.2.8.tar.gz|tar xz
cd zlib-1.2.8/
./configure --prefix=$HOME/local
make
make install
```

## install pkg-config
```bash
cd $HOME/build_dir/
wget -O- http://pkgconfig.freedesktop.org/releases/pkg-config-0.29.tar.gz |tar xz
cd pkg-config-0.29/
./configure --prefix=$HOME/local --with-internal-glib
make
make install
```

## install openssl
```bash
cd $HOME/build_dir/
wget -O- http://www.openssl.org/source/openssl-1.0.2e.tar.gz |tar xz
cd openssl-1.0.2e/
./config --prefix=$HOME/local --shared -fPIC
make
make install
```

## install mosh
```bash
cd $HOME/build_dir/
wget -O- --no-check-certificate https://mosh.mit.edu/mosh-1.2.5.tar.gz |tar xz
cd mosh-1.2.5/
PROTOC=$HOME/local/bin/protoc CXXFLAGS="-I$HOME/local/include" LDFLAGS="-L$HOME/local/lib" CFLAGS="-I$HOME/local/include" PKG_CONFIG_PATH="$HOME/local/lib/pkgconfig" PKG_CONFIG="$HOME/local/bin/pkg-config" ./configure --prefix="$HOME/local"
make
make install
```

## use mosh
クライアント側（手元の Mac とか）で。
shell script とかにまとめたほうが良い。

```bash
mosh --server="LC_ALL=ja_JP.UTF-8 LD_LIBRARY_PATH=./local/lib ./local/bin/mosh-server" (user_name)@(hostname or ip)
```
UNIX/Linux互換OSをゼロから作った話

こんにちはredcap97です。

私は、UNIX互換OSをゼロから作っています。
ある程度動くようになったので紹介したいと思います。

## デモ

![Screen Capture](https://cloud.githubusercontent.com/assets/928237/11782406/3c520650-a2b4-11e5-917e-372b7f7cb689.gif)

https://github.com/redcap97/cyanurus

現在、QEMUの上で動作するようになっています。CPUはx86ではなくARMを対象に作っています。シェルと基本的なコマンドが動作するようになっていて、リダイレクトやパイプも利用できます。

Dockerを使うと簡単にOSを動かすことができます。

```
docker run -it --rm redcap97/cyanurus
```

## 概要

* 33のシステムコールを実装している
* システムコールはLinuxと互換性がある
* シェルは[Dash](https://ja.wikipedia.org/wiki/Debian_Almquist_shell)が利用できる
* [Coreutils](https://ja.wikipedia.org/wiki/Coreutils)のコマンドが使える
* libcは[musl libc](https://ja.wikipedia.org/wiki/Musl)を使用している
* ファイルシステムは[Minix File System](https://en.wikipedia.org/wiki/MINIX_file_system)を実装している

以上です。

私は実装がとても遅いので、ここまで作るのに2年ぐらいかかっています。
Linusの偉大さを肌で感じなら、これからもノロノロと作っていきたいと思っています。