OmniAICreator/Qiita-1.07M huggingface dataset:
Githubに.emacs.dを置く

# はじめに

私は自分の.emacs.dを[https://github.com/h12o/.emacs.d](https://github.com/h12o/.emacs.d)に置いています。こうすることで、gitさえあればホームディレクトリで

    git clone git@github.com:h12o/.emacs.d.git

または

    git clone https://github.com/h12o/.emacs.d.git

と打つだけで、自分の環境を復元できるので便利です。

言いたいことはこれだけです。

# レポジトリ名は「dotemacs.d」とかではなくて「.emacs.d」

私の場合、`git clone`したあとでリネームなどを一切しなくて済むように、よくある「dotemacs.d」などのディレクトリ名を使わず、「.emacs.d」というレポジトリを[https://github.com/h12o](https://github.com/h12o)の下に作っています。**Githubから怒られたことはない**ので、問題ありません。

# .gitignoreファイル

[~/.emacs.d/.gitignore](https://github.com/h12o/.emacs.d/blob/master/.gitignore)を見れば分かりますが、[http://gitignore.io](http://gitignore.io)をもとに作っています…と、この記事を書きながら久しぶりにアクセスしたところ、しばらく見ないうちにサイトが生成する.gitignoreの中身が増えていますね。**.dir-locals.elなんて初めて見ました**ので、誰か[アドベントカレンダー](http://qiita.com/advent-calendar/2016/dot-emacs)記事で書いてください…

(追記: .dir-locals.elは[ディレクトリーごとのローカル変数](https://ayatakesi.github.io/emacs/24.5/Directory-Variables.html)であるとの指摘がありました)

# ~/.emacs.d/user-start.d/*.elの自動走査

Githubにファイルを置いたから、というわけではないのですが、私の.emacs.dは、Emacs起動時に、~/.emacs.d/user-start.d/*.elの自動走査をするように書かれています。

具体的には、[~/.emacs.d/init.el](https://github.com/h12o/.emacs.d/blob/master/init.el)に、[~/.emacs.d/user-start.d](https://github.com/h12o/.emacs.d/tree/master/user-start.d)配下の*.elファイルを自動走査するコードを入れています。

```el:~/.emacs.d/init.el
(setq my-user-start-dir (expand-file-name "~/.emacs.d/user-start.d"))

(let* ((dir my-user-start-dir)
       (el-suffix "\\.el\\'")
       (files (mapcar
           (lambda (path) (replace-regexp-in-string el-suffix "" path))
           (directory-files dir t el-suffix))))
  (while files (load (car files) 'noerror) (setq files (cdr files))))
```

コードの本体は`(files `と`(while files`で、`files`には`my-user-start-dir`(=~/.emacs.d/user-start.d)の中の.elファイルがリストとして入ることを狙っています。`files`にリストが入ってしまえば、あとは`(while files`で`(load (car files) 'noerror)`したら`(setq files (cdr files))`していって`files`の中身が尽きるまでロードするだけです。

なお、[~/.emacs.d/user-start.d](https://github.com/h12o/.emacs.d/tree/master/user-start.d)のファイルは、ロードしたいライブラリごとにファイルを分けて、標準ライブラリをロードするファイルは数字2桁+ライブラリ名+「.el」と命名しています。

最初の数字2桁は、その機能が追加された・そのライブラリが取り込まれたEmacsのメジャーバージョンとしています。たとえば[18x-win.el](https://github.com/h12o/.emacs.d/blob/master/user-start.d/18x-win.el)はEmacs 18でX関係の機能が追加されたので「18」ではじまります。私の場合([https://github.com/h12o/.emacs.d/tree/master/user-start.d](https://github.com/h12o/.emacs.d/tree/master/user-start.d)参照)、最初に読まれるのは15simple.elで最後に読み込まれるのは24mac-win.elということになります。古いライブラリほど依存関係という名のしがらみが少ないはずなので、多少はトラブルを減らすことができるだろうと考えています。といっても普通はライブラリを書く側がきちんと書けばいい話なので、この慣習は半分以上、気休めです。また、Emacsに標準でない機能を呼び出すファイルは単にライブラリ名+.elとしています。これらは比較的あとになって呼ばれるようにと意図しています。

# 秘密情報の排除

Emacsのライブラリの中には、設定ファイルに認証情報をベタ書きすることを意図した設計のものもありますが、そのようなファイルをGithubに置くのははばかられます。

幸いにして、Emacsの標準ライブラリに「netrc」というものがあり、~/.authinfo(~/.netrc)を扱うことができます。すなわち、**Emacs標準ライブラリnetrcを使って、レポジトリ外のファイルに認証情報を追い出す**のがおすすめです。詳しくは『[simplenote.elの設定でsimplenote-emailとsimplenote-passwordをべた書きせずに済むようにする](http://qiita.com/h12o/items/49c85133f3ef0f018a7e)』をご覧ください。

ひょっとしたらEmacsからmacOSのキーチェーンを呼ぶことができる人というのが世の中にはいるのかもしれませんが、私は寡聞にしてその方法を知りません。

# おわりに

以上、オレオレ.emacsじまんでした。
LaTeXで回転寿司

新型MacBook ProのTouch Barが（:sushi:的な意味で）話題になっているようです。

  * [MacのTouch Barが回転寿司に！　エディターでも続々カイテン] ― 窓の杜：やじうまの杜

[MacのTouch Barが回転寿司に！　エディターでも続々カイテン]: http://forest.watch.impress.co.jp/docs/serial/yajiuma/1032311.html

どうやら、人々はこぞって、自分のお気に入りのガジェットの“バー”に:sushi:を流し始めたようです。

  * [Touch Barで回転寿司](https://twitter.com/mzp/status/799856396778905600?ref_src=twsrc%5Etfw) （[ソース](https://github.com/mzp/sushibar)）
  * [Vimで回転寿司](https://twitter.com/p_ck_/status/799997811689275394) （[ソース](https://github.com/pocke/sushibar.vim)）
  * [Emacsで回転寿司](https://twitter.com/gongoZ/status/801431366227214337?ref_src=twsrc%5Etfw) （[解説](http://gongo.hatenablog.com/entry/2016/11/23/232450)）
  * [Visual Studioで回転寿司](https://marketplace.visualstudio.com/items?itemName=kekyo.SushiRotator)
  * [Visual Studio Codeで回転寿司](https://marketplace.visualstudio.com/items?itemName=espresso3389.sushi-vscode)
  * [PowerShellで回転寿司](https://twitter.com/stknohg/status/800659910673321984?ref_src=twsrc%5Etfw) （[解説](http://stknohg.hatenablog.jp/entry/2016/12/03/001019)）
  * [three.jsで回転寿司](http://qiita.com/sgnm/items/31cb8740da13d359ada4)
  * [Onsen UIで回転寿司](http://qiita.com/rururu3/items/8478ec2cd9a2042bd97b)

## LaTeXで寿司を流す

というわけで……、作ってみました。

  * [tcsushiheadパッケージ](https://github.com/zr-tex8r/tcsushihead) （GitHub/zr-tex8r）

使い方はとても簡単[^install-1]で、好きなLaTeX文書（エンジン不問[^driver-1]）のプレアンブルに `\usepackage{tcsushihead}` を書くだけです[^jsclasses-1]。

※ただしdvipdfmxを使う場合はドライバオプションの指定が必要です。

[^install-1]: ただしインストールは少し面倒で、[bxcoloremojiパッケージ](https://github.com/zr-tex8r/BXcoloremoji)に含まれる:sushi:の画像を利用するためこれを前もってインストールする必要があります。（[参照](https://github.com/zr-tex8r/tcsushihead/blob/master/README-ja.md)）
[^driver-1]: ただしDVI出力の場合、対応しているDVIウェアはdvipdfmxのみです。（EPS画像を利用すればdvipsでも動くと思うが……。）
[^jsclasses-1]: pLaTeXの新ドキュメントクラス（jsarticle等）を使っていて「`\ifdraft`が定義済」というエラーが出る場合は、新ドキュメントクラス（[jsclassesパッケージ](https://www.ctan.org/pkg/jsclasses)）をアップデートしてください。

```latex:example.tex
\documentclass[dvipdfmx,a5paper]{jsarticle}% ←'dvipdfmx'を入れる
\usepackage{tcsushihead}% 寿司を流したい
\begin{document}
吾輩は猫である。名前はまだ無い。

どこで生れたかとんと見当がつかぬ。
何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
吾輩はここで始めて人間というものを見た。
しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。
この書生というのは時々我々を捕えて煮て食うという話である。
%...(略)...
\end{document}
```

これをコンパイルすると、出力のPDF文書のヘッダ部分に:sushi:が流れます。

**※Adobe Reader（などのAdobe製品）でPDFを閲覧する必要があります**[^viewer-1]。

[^viewer-1]: フリーのPDFビューアでアニメーションの表示に対応したものもあるらしいが、詳細不明。

![wag-1p.gif](https://qiita-image-store.s3.amazonaws.com/0/14550/efb47004-2513-c162-c505-73c8debfac7f.gif)

ちなみに、フッタは空に設定されます。それだと現在のページ番号が判らなくなってしまう？ いえ、ご心配なく。例えば5ページ目であれば、ヘッダは次のようになっています。

![wag-5p.gif](https://qiita-image-store.s3.amazonaws.com/0/14550/d3059440-d88b-e24a-2f19-ed04a219d848.gif)

つまり、流れてくる:sushi:の数を数えればページ番号が判ります。これは便利！

## 補足

  * :sushi:が流れるヘッダは“sushihead”ページスタイルとして登録される。
  * tcsushiheadパッケージをオプション `default=false` 付きで読み込んだ場合既定ではページスタイルは変更されなくなるる。この場合、`\pagestyle{sushihead}`でページスタイルを切り替えられる。
  * :sushi:が流れるバーを出力する部分は `\ShowSushiBar{<横幅>}` という命令に切り出されていて、これを本文中で用いることができる。
  * `\sushiheadsetup`命令で:sushi:の流れる速さなどの各種パラメタを設定できる。詳しくはREADME（[日本語でおｋ]）を参照。

[日本語でおｋ]: https://github.com/zr-tex8r/tcsushihead/blob/master/README-ja.md

## まとめ

:sushi:はいいぞ。
カノジョは突然舞い降りた

この投稿は [カノジョできないエンジニア Advent Calendar 2016](http://qiita.com/advent-calendar/2016/no-girlfriend) の 6日目の記事です。
※ ピンチヒッターで投稿させて頂きました。

# 質問
突然ですが皆さん、このようなサイトをご覧になられたことはないでしょうか。

![pc.png](https://qiita-image-store.s3.amazonaws.com/0/18763/145c34cf-f342-07d9-2285-02f946814b5e.png)

![sp.png](https://qiita-image-store.s3.amazonaws.com/0/18763/8ae63c27-3b71-45cc-b989-fd0658abee61.png)

そうです。技術系ブログの [Developers.IO](http://dev.classmethod.jp/) です。
技術的な質問を Google先生にぶつけるとこちらに案内される事も多く、普段からとてもお世話になっております。

こちらは [クラスメソッド株式会社](https://classmethod.jp/) 様が運用されているブログなのですが
ある時・・このブログに女神が舞い降りました。そう、**めそ子さん**です。

# めそ子さん

![mesoko_01.png](https://qiita-image-store.s3.amazonaws.com/0/18763/7cfc23b2-c334-b81d-86b8-544297994e0c.png)

~~あぁ女神・・~~
お馴染みのジョインしました記事や専用コーナーがあるので詳しくは書きませんが、簡単にご紹介を。

- 2016年7月7日にブログに舞い降りる
- 趣味はメガネ収集
- 好きな寿司ネタはサーモン

詳しくは -> [クラスメソッドにJOINしました『めそ子』です。](http://dev.classmethod.jp/etc/mesoko-joined-classmethod/)

# 毎月の楽しみ

とても嬉しい事に、毎月１度違っためそ子さんにお会いすることができます。

[クラスメソッド2次元社員めそ子のコーナー](http://dev.classmethod.jp/etc/mesoko-helloworld/)
![wall.png](https://qiita-image-store.s3.amazonaws.com/0/18763/1066b88b-eae8-6b6e-4d5c-90f1bdf30e55.png)

少しでもファンが増えますように。
皆さん、めそ子さんと良いクリスマスを！
linuxでゴミ箱へファイルを送るコマンド、を実装する

#### コマンドの自作001
---

##### 前置き
linuxのCGIではrmコマンドを使用して、ファイルを削除すると、原則ファイルは復元できない。
うっかりで、肝を冷やすこともあるので
`~/trash`
に配置したごみ箱フォルダへファイルを動かすコマンドを自作してみたので備忘録に記録。

---

##### 本編
ものは単純
~/.bashrcに以下を記載

```
function tr(){
sudo mv --backup --suffix=.$(date +%Y%m%d_%H%M%S) -f $1 $HOME/trash/ ;
}
```

実行時は
`tr hoge.foo`
で、ごみ箱フォルダに指定ファイルがsudo権限で移動される。

ゴミ箱に同一ファイルが有った場合、前のファイルは、ファイル名の後ろにタイムスタンプが押されて、強制的に上書きされる。
つまりタイムスタンプがないものが最新のものとなる。

これからはtrでファイルを消そう!

ブログ始めました、よかったら遊びに来てください
https://red-full-moon.com/
munin: nginx_request_timeプラグインでキャッシュ応答等を除外（proxy_pass時のみ集計）

## diff

1行足すだけじゃ！

```
$ diff -u /usr/share/munin/plugins/nginx_request_time /usr/share/munin/plugins/nginx_request_time_withoutcache
--- /usr/share/munin/plugins/nginx_request_time 2016-11-29 01:20:15.063783808 +0900
+++ /usr/share/munin/plugins/nginx_request_time_withoutcache    2016-12-07 23:27:05.093202230 +0900
@@ -123,6 +123,7 @@
         my $hash = $p->parse_line($log_line);
         my $time_s = $hash->{reqtime};
         if (!defined($time_s)) { next; }
+        if ($hash->{apptime} eq "-") { next; }
         push @request_time_array, $time_s * 1000;
     } else {
         last;
```

### 補足: nginxのログ設定

```
log_format  ltsv  "time:$time_local"
                  "\thost:$remote_addr"
                  "\tforwardedfor:$http_x_forwarded_for"
                  "\treq:$request"
                  "\tstatus:$status"
                  "\tsize:$body_bytes_sent"
                  "\treferer:$http_referer"
                  "\tua:$http_user_agent"
                  "\treqtime:$request_time"
                  "\tapptime:$upstream_response_time"
                  "\tvhost:$host";
```

## $upstream_response_timeの値

公式資料が見当たらないのですが、少なくとも下記の場合に $upstream_response_time の値は - となります。

* nginxのみでレスポンスを返却したとき
* proxy_cacheでキャッシュ応答したとき

そこを引っ掛けて除外させることで、proxy_passでリバースプロキシした時の応答時間だけを集計できます。

## アプリの本来の処理時間はいかほど…

趣味で作っているサービスのAPIサーバを例に。
キャッシュ応答も含めて集計すると、最混雑時には90パーセンタイル値も0msになります。正しいといえば正しいのですが。

![nginx_response_time](https://qiita-image-store.s3.amazonaws.com/0/152552/3040063f-fc99-8fcf-bdfd-018bdb2481c9.png)

キャッシュ応答を除外させると…　中央値300ms強。99パーセンタイル値に不安がありますが、まあまあかな。

![nginx_response_time_without_cache](https://qiita-image-store.s3.amazonaws.com/0/152552/00362105-75e2-8b62-bf3e-f0f88670f852.png)
さいたまげーむすハンズオン_サンプルゲーム紹介(音ゲー風ゲーム)

この記事はさいたまげーむす[Advent Calendar 2016](http://qiita.com/advent-calendar/2016/saitamagames)の8日目です。

どうも、[ちゃんおぎ](https://twitter.com/muripo_life)です。

今回は、さいたまげーむすで、月に一度やっているハンズオン勉強会のサンプルプロジェクトの一つを紹介をします。

# AnimeSound
![animeSound.PNG](https://qiita-image-store.s3.amazonaws.com/0/102634/97cf4752-2195-07be-5193-0996a6a5e251.png)
## どんなゲームなの?
音ゲー風ゲームです。
## 何故音ゲー風かというと?
音ゲー風のバックミュージックをつけるまでの余裕がなかったからなのですが…
## 資料はこちら
[AnimeSound](https://github.com/SaitamaGamesMem/AnimeSound)
## 注釈
C#のスクリプトは、すべて組んでいて、勉強会では、UnityEditor で組み立てからスプリントをいじっていきます。

# [作り方](https://github.com/SaitamaGamesMem/AnimeSound/blob/master/%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%9F%B3%E3%82%B2%E3%83%BC%E3%81%A3%E3%81%BD%E3%81%84%E3%81%AE.pdf)
1. 音ゲームのUI(ユーザーインターフェース)の作成
2. キーアイコン生成システム
3. キャラクターの配置　アニメーションなど

# このプロジェクトのPoint
`Animator Controller` の勉強ができます！

# ここで、Animator Controllerの最速入門
[アニメーターコントローラー公式リフェレンス](https://docs.unity3d.com/ja/current/Manual/Animator.html)
## `Animator Controller` とは?
* Unityで、Animation同士を繋ぐツール
* ノード型のツールである。

![animatorController.PNG](https://qiita-image-store.s3.amazonaws.com/0/102634/84524f41-84c5-c137-84cb-8018ecfdcee9.png)

## 作成方法
Projectビューの Create メニューから作成

![ani.png](https://qiita-image-store.s3.amazonaws.com/0/102634/cb41400b-1c89-af2d-769c-b86ff3afeb75.png)

## Assetへのアタッチ方法
対象のAssetのInspetorビューで、`Animetor` を追加して、`Controller` にドラッグ＆ドロップ！

![attach.PNG](https://qiita-image-store.s3.amazonaws.com/0/102634/cdf108f0-3b74-c1a7-d1da-be4b58585403.png)

## 使用方法
ノード型のものは、`animetion state machine` という

### Mecanim ステートマシン
アニメーターコントローラー のステートを選択すると、インスペクター上で、そのステートに対応するプロパティーが表示される

|property|詳細|
|:-----------------|:---------------|
|Speed|アニメーションのデフォルトの速度|
|Motion|ステートに割り当てられているアニメーションクリップ|
|Foot IK|ステートで足の IK を有効にするかどうか ヒューマノイド アニメーションで適用できます|
|Write Defaults|AnimatorStates を書くかどうかにかかわらず、その Motion によってアニメーション化されてないプロパティーによってデフォルト値に戻します。|
|Mirror|ステートをミラーリングするかどうか これはヒューマノイドのアニメーションのみ有効です|
|Transitions|ステートの遷移先ステート一覧|

#最後に
AnimeSoundの勉強会に来たら、AnimationControllerの使い方をみっちりやります～

皆さんも、Unityでこのプロジェクト参考にAnimationControllerの使い方を覚えよう～
Fuseの環境構築

[公式サイト](https://www.fusetools.com/docs/basics/installation)を見ればわかるとは思いますが、一応環境構築から、最初のプレビューまでをまとめます。

###開発サポート環境
- OS X 10.9以降。推奨は10.10。
- windows7以降

###アプリの書き出しサポートOS
- Android 4.1以降
- iOS 8.0以降

###Fuseをインストールする

インストーラーをダウンロードする前に、アカウントの作成が必要になります。[ここ](https://www.fusetools.com/downloads)で先にアカウントを作成しておきましょう。

#####OS X [(リンク)](https://www.fusetools.com/docs/basics/installation/setup-install-osx)

基本的にはダウンロードページからファイル落としてインストールするだけです。以降はターミナルで`fuse`と入力すれば起動できます。

#####windows [(リンク)](https://www.fusetools.com/docs/basics/installation/setup-install-win)

OS X同様、ダウンロードページからファイル落としてインストールするだけです。以降はコマンドラインで`fuse`と入力すれば起動できます。

###エディタ
Sublime Text3とAtomに関しては公式にプラグインが提供されているようです。非公式ではありますが、[Visual Studio Codeのプラグイン](https://github.com/Hazealign/vscode-fuse)も公開されています。

Fuseが推奨しているのはSublime Text3のようで、初回起動時に、Sublime Text3のセットアップ（任意）も行ってくれます。

###プロジェクトを作る

下記でプロジェクトを生成します。サブディレクトリは任意です。

`fuse create app プロジェクトの名前 サブディレクトリ`

プロジェクトには必ずひとつの.uxファイルが含まれます。(デフォルトではMainView.uxというファイルと、.unoprojというふたつのファイル作られます)

.uxファイルはUXマークアップをしていく、アプリ本体となるファイルです。
.unoprojファイルは、書き出しの設定やアプリの署名情報などを記載するファイルとなっています。

※コマンドラインの他に、fuseのダッシュボードから"New Project"でつくることもできます。

###プロジェクトを実行する

実行するには二つのやり方があります。

アプリストアに提出したりするために、ファイル（.ipaや.apk）としてとして書き出す場合は、下記を実行します。

```fuse build```

実行しながらリアルタイムデバッグをしたい場合は下記を実行します。開発中は主にこちらで実行することになります。

```fuse preview```

できたてのプロジェクトをプレビューしてみると、

![01.png](https://qiita-image-store.s3.amazonaws.com/0/100937/b6af430b-8f0c-5c10-5e72-4907f13b6ad6.png)

こんな感じです。.uxファイルにまだなにも記述がないので、枠だけできている感じです。

※プレビューに関しては、fuseのダッシュボードから"start app preview"で実行することもできます。

USB接続をして、同じwi-fiに接続すれば、実機でもリアルタイムプレビューが可能です。

下記のコマンドを実行するとiOSでプレビューするためのXcodeプロジェクトが自動に生成されます。

```fuse preview -tios```

Android向けには下記です。

```fuse preview -tandroid```

USB接続が必要なのは最初のビルドとインストールの時だけです。一度インストールした後はUSB接続する必要はありません。アプリがローカルのIPアドレスを記憶して、wi-fi経由で更新をキャッチします。つまり、各端末で一度プレビューを実行しておけば、同じネットワークに接続すれば、複数の端末で同時にプレビューを行うことが可能になります。

※もし、ネイティブコードを直接変更したり、PCのIPアドレスを変更したりする場合はUSB接続をしてプレビューを再実行する必要があります。

###Fuseをアンインストールする
[こちら](https://gist.github.com/Tapped/daa78c08882f33b0c7c3)のコードを実行する
モバイルとPC用のサイトを両方テストする時のTIPs

# はじめに

これは [Geb Advent Calendar 2016](http://qiita.com/advent-calendar/2016/geb)の8日目の記事です。
前日は[「Gebでモバイルブラウザのテストをする」](http://qiita.com/PoohSunny/items/43d1094d1addb093dc98)でした。

今日は昨日のエントリーの続きで、モバイルとPC用のサイトを両方テストする時の方法書きます。

# TIPs
## モバイルとPCのサイトを両方テストできるようにしておきたい！

そんな時は、環境変数によって切り替えられるようにしておきましょう。
例えば下記のような感じ。詳しい説明は昨日のエントリーへ。

```groovy:GebConfig.groovy
// geb.envにchromeを設定すればPCで実行
chrome { new ChromeDriver() }

// geb.envにchromeMobileを設定すればモバイル版で実行
chromeMobile {
        def mobileEmulation = [:]
        mobileEmulation.put("deviceName", "Google Nexus 5")

        def chromeOptions = [:]
        chromeOptions.put("mobileEmulation", mobileEmulation)
        def capabilities = DesiredCapabilities.chrome();
        capabilities.setCapability(ChromeOptions.CAPABILITY, chromeOptions);
        WebDriver driver = new ChromeDriver(capabilities);
}
```

Gradleとか使っている場合は、こんな感じでそれ用のタスクを切っておくと良いかと思います。

## モバイルだけ実行するテストがある！

そんな時はSpockの@IgnoreIfという機能を使いましょう。
これは特定の条件に応じて、テストの実行をスキップできる機能です。

- https://spock-framework-reference-documentation-ja.readthedocs.io/ja/spock-0.7-groovy-2.0_ja/extensions.html#ignoreif

例えばこんな風に使ったりできます。

```groovy
@IgnoreIf({ System.getProperty("geb.env") && System.getProperty("geb.env").equalsIgnoreCase("chrome")})
def "PC版のchromeの時は無視するテスト"() {
// 略
```

# まとめ
モバイルとPC版のテスト、両方できるよー！
phina.jsでアクセサリを使ってみよう＆作ってみよう！

この記事は、[phina.js Advent Calendar 2016](http://qiita.com/advent-calendar/2016/phinajs) １２月８日の記事です。
昨日→[phina.jsでアイコンフォントを使ってみよう](http://qiita.com/pentamania/items/ee36ae00139078fa8479) by [pentamania](http://qiita.com/pentamania)さん
明日→[phina.jsのゲーム制作にあたって工夫したところと、JavaScript入門者が陥ったつまづきポイントについて。](http://qiita.com/rrf_hh/items/4d0b853cd8e5367661f9) by [rrf_hh](http://qiita.com/rrf_hh)さん

#アクセサリって？
**phina.js**におけるアクセサリとは、`Sprite`や`Shape` 、`displayElement`等にアタッチして機能を付加する事が出来るクラスです。
phina標準のアクセサリには、`Tweener`や`Draggable`等があります。
これらを利用すると、そのクラスに応じた機能を簡単に利用する事ができ、また再利用が可能となります。

#使い方
Draggableアクセサリを例にとって使い方を説明します。

以下のサンプルでは、★をドラッグして移動する事が出来ます。
http://runstant.com/minimo/projects/AccessorySample1

実際に動かしているのは以下のコードの部分です。

``` JavaScript
var shape = phina.display.StarShape();
//～中略～

//Shapeをドラッグで動かす
shape.setInteractive(true);
shape.on('pointmove', function(e) {
  this.x += e.pointer.dx;
  this.y += e.pointer.dy;
});
```
`Shape`の`interactive`フラグを`true`にして、`pointmove`イベントでポインタの移動量を捉え、Shapeの移動を行っています。

アクセサリを使用して、同じ機能を実現したのが以下のサンプルです。
http://runstant.com/minimo/projects/AccessorySample2

Shapeに`Dragger`アクセサリをアタッチしています。
実際に使っているのはこの部分です。

``` JavaScript
var shape = phina.display.StarShape();
//～中略～

var drg = phina.accessory.Draggable();
drg.attachTo(shape);
```

`Draggable`から`Shape`へ`AttachTo`して、`Shape`に機能を付加しています。

複数のShapeにDraggableをアタッチしたい場合は、それぞれ新規に定義して、`AttachTo`を行います。

色んなオブジェクトへDraggableをアタッチするサンプル
http://runstant.com/minimo/projects/AccessorySample3
Shape、Spriteどちらも同様にアタッチして機能を付加する事が出来ます。

１つのアクセサリを、複数のオブジェクトにアタッチするのは、問題無く動作する場合もあるのですが、解除時に問題が出る場合があるので止めておいた方が無難です。
それぞれ、新規にアクセサリを定義してアタッチを行ってください。

#作ってみよう
この様に便利なアクセサリですが、自分で欲しい機能を作成する事も出来ます。
Draggableの応用で、タップしたらエフェクトが発生するアクセサリを作ってみましょう。

http://runstant.com/minimo/projects/AccessorySample4

``` JavaScript:TapEffect
phina.define('phina.accessory.TapEffect', {
  superClass: 'phina.accessory.Accessory',
  init: function() {
    this.superInit();

    var self = this;
    this.on('attached', function() {
      this.target.setInteractive(true);
      this.target.on('pointend', function(e) {
        //１０個星を出す
        for (var i = 0; i < 10; i++) {
          var s = phina.display.StarShape()
            .addChildTo(this)
            .setScale(0.5);
          var x = s.x+Math.randint(-50, 50);
          var y = s.y+Math.randint(-50, 50);
          s.tweener.clear()
            .to({x: x, y: y, alpha: 0}, 500,"easeOutSine")
            .call(function() {
              this.remove();
            }.bind(s));
        }
      });
    });
  },
});
```

targetがタップされたらエフェクトとして、１０個星を出してランダムな方向にTweenerで移動させています。

###コードの説明
```
this.on('attached', function() {
  this.target.setInteractive(true);
  this.target.on('pointend', function(e) {
    //１０個星を出す
    for (var i = 0; i < 10; i++) {
        //～中略～
    }
});
```

やっている事は単純です。
アクセサリがオブジェクトにアタッチされると`attached`というイベントがアクセサリを対象に発火しますので、イベント内で設定された`target`に`pointend`イベント内で星を出す処理を追加しています。
再利用を考えるなら、`detached`イベント内でオブジェクトからアクセサリを除去する処理を入れた方が良いでしょう。

#おしまい
この様に、アクセサリを利用する事によって、オブジェクトの種類に関わらず、簡単に機能を追加する事が出来ます。
是非活用してみてください。
Djangoで一つのフォームで複数のモデルを保存する

アドベントカレンダーに空白があるので・・・

- Django 1.10.4
- Python 3.5.2

# この記事の内容
DjangoではForm関係のAPIは割と手厚いのですが、一つのフォームの中で複数のモデルを編集しようとすると、急に面倒度が上がります。

なので、モジュールを使いながら手早くその辺のことができるようにします。

前の記事の続きのようなものです。

# インストールするモジュール

[django-extra-views](https://django-extra-views.readthedocs.io/en/latest/index.html)

``` bash
pip install django-extra-views
```

# 使い方

django extra viewsはフォームクラスを使わなくても行けるので、そうします。

## CreateView
### モデル

``` py3:models.py
from django.db import models


class Person(models.Model):

    name = models.CharField(max_length=255)
    age = models.IntegerField(default=25) # 25歳に戻りたい


class Car(models.Model):

    owner = models.ForeignKey(Person)
    color = models.CharField(max_length=10)

```

### views.py
``` py3:views.py
from extra_views import CreateWithInlinesView, InlineFormSet


class CarInlineFormSet(InlineFormSet):
    model = Car
    fields = ("color", )
    can_delete = False  # create view では削除不要


class PersonCarCreateFormsetView(CreateWithInlinesView):
    model = Person
    fields = ("name", "age")  # self.model の fields
    inlines = [CarInlineFormSet, ]
    template_name = "person_formset.html"
    success_url = "/"
```

### テンプレート

``` jinja:person_formset.html
{% extends "base.html" %}

{% block content %}

    <form method="post">
        {% csrf_token %}
        <table>
            {{ form.as_table }}
        </table>

　　　　　　　　　　　　　　　 {# インラインはinlinesという変数にリストで入っている #}
        <p>Car Color</p>
        <table>
            {% for form in inlines %}
                {{ form.as_table }}
            {% endfor %}
        </table>
        <button type="submit">save</button>
    </form>

{% endblock %}
```

## UpdateView
### モデル
同じ

### views.py
```py3:views.py
from extra_views import InlineFormSet, UpdateWithInlinesView

class CarInlineFormSetCanDelete(InlineFormSet):
    model = Car
    fields = ("color", )
    can_delete = True

class PersonCarUpdateFormsetView(UpdateWithInlinesView):
    model = Person
    fields = ("name", "age")
    inlines = [CarInlineFormSetCanDelete, ]
    template_name = "person_formset.html"
    success_url = "/"
```

### テンプレート
同じ

# まとめ

なかなか便利。

---
# 追記 2017-09-27

## as_table以外での表示の仕方

普通に書いていると、インラインの方を `table.name` のように書きたくなる。

ちょっとはまったが、

```jinja:template.html

{% for inline in inlines %}
  {% for line in inline %}
     {{ line.name }}
  {% endfor %}
{% endfor %}
```

のように、二重ループすればよい。
`inlines`には複数のインラインモデルが設定されているためだと思われる。
 

追記ここまで

---
CakePHP3向け楽観的ロックプラグインを作った

kaihiroといいます。
普段は主にCakePHP3を使ったWebアプリケーションの開発を行っています。

今日は温めていた自作プラグインについてご紹介したいと思います。


業務システムを開発していて、楽観的ロックが必要になりました。
編集画面で保存ボタンを押したときに、他の人が同じデータを先に更新していたらユーザーに通知するアレです。

CakePHP3向けの楽観的ロックプラグインがなさそうだったので作ってみることにしました。

[kaihiro/optimistic-lock](https://github.com/kaihiro/optimistic-lock)

## 楽観的ロック

前職でJavaを使っていたのでその時のフレームワークの処理を思い出しながら実装してみました。

仕組みとしては、排他制御を行いたいテーブルにversion(INT型)のカラムを定義し、画面を表示したタイミングと、保存するタイミングでその値が変わったかどうかを検証することで他ユーザーによる更新を検知します。
versionの値は、保存のたびに、1, 2, 3,...とインクリメントされていきます。

処理の流れは以下の通りです。

1. 排他制御を行いたいテーブルに楽観的ロック制御用のversion番号を定義しておき、編集画面を表示する際にversionをformのhiddenに埋め込む。（Plugin側）
2. 更新ボタンでPOSTされたversionと、最新のDBのversionを比較し、同じであればversionをインクリメントして、保存処理を完了する。もし、versionが違っていればOptimisticLockExceptionをthrowする。（Plugin側）
3. throwされたExceptionをControllerでcatchしてエラーハンドリングを行う。（各自で実装）

## 準備

排他制御をかけたいテーブルに対して、INT型でversionカラムを定義します。
デフォルト値は特に必要ありません。

## 使い方
[kaihiro/optimistic-lock](https://github.com/kaihiro/optimistic-lock)
こちらのREADMEを参照してください。

## 工夫した点

1. OptimisticLockFormTraitをFormHelperに読み込むことで、createメソッドを拡張して、編集対象のEntityにversionカラムがある場合のみ、formにhiddenを自動で埋め込むようにしています。

2. 排他エラーが発生した場合のエラーハンドリングについては、色々な要件があると思うので、`OptimisticLockException`をthrowするようにして、組み込み側が自由にハンドリングするようにしました。


## やり残したこと

本当は任意のカラム名を指定できるようにしたかったけど、きれいなOptimisticLockFormTraitとの連携方法が思いつかず、実装していません。
任意の名前にしたいシーンもあまりないと思うので、versionという名前にするという規約として、組み込む側の実装がシンプルになるほうがいいかなと思っています。

## まとめ

今回は昔、使ったJavaの記憶をたよりに実装してみました。
他の言語のフレームワークやプラグインを色々見てみると、CakePHP3にも活用できそうなものがたくさんありそうですね。

バグや改善あれば、プルリクお待ちしています！
Wercker CLI

`Wercker`はCIツールのひとつで、`BitBucket`や`GitHub`のリポジトリをターゲットにビルドや自動テスト/デプロイを実行することが出来るツールです。特にβ期間だからというのもあるのでしょうが、`Github` のプライベートリポジトリをターゲットにしても無料で利用できるというのは大きな魅力で人気があります。

このポストでは、Werckerをローカルで実行するためのツール、`Wercker CLI`について解説したいと思います。

# OverView

`Wercker`はCIのホスティングサービスです。あらかじめ`Wercker`のサイト上で`GitHub`のレポジトリを登録しておき、そのレポジトリ上にstep(一つ一つのビルド上の手続き)やpipeline(stepや後処理の集合)を定義した`wercker.yml`というYAMLファイルに配備します。そしてその対象のリポジトリ上で`GitHub`の`Pull Request`が発行されると、それを自動検知して`Wercker`のサイト上でビルドが走るという仕組みになっています。
`WerckerCLI`を使うとWercker上で実行されるビルドをlocal環境で実行することができます。

# インストール

`Wercker` は基本的には `Docker`ベースのCIツールなので、WerckerCLIをインストールするためにはローカルにDockerをインストールする必要があります。

https://www.docker.com/

`Docker`をインストールした後、ローカルでDockerを実行する環境を仮想環境上に登録する必要があるので、以下のコマンドを実行します。

```bash
> docker-machine create --driver virtualbox dev
```

更に、以下のコマンドを実行します。

```bash
> eval "$(docker-machine env dev)"
```

こちらのコマンドはターミナルを起動する毎に実行する必要があるので、起動時に必ず実行されるなにがしか的なファイルに記述しておくことをお勧めします。

`Wercker CLI`自体は、brewで簡単にインストールすることが出来ます。

```bash
> brew tap wercker/wercker
> brew install wercker-cli
```

# wercker dev

```bash
> wercker dev
```

`wercker dev`コマンドは`wercker.yml`の中のdevという名前のpipelineを実行します。基本的にローカルで開発をしているときに利用するコマンドです。

## internal/watch

`internal/watch` stepはいわゆる変更監視をしてくれるstepです。
プロジェクト内のファイルに変更があったときにcodeの内容を実行してくれます。

例えばこのように設定しておくと、

```yaml:wercker.yml
box: ruby:2.3.1

dev:
  steps:
    - bundle-install
    - internal/watch:
      code: |
        bin/rake spec
      reload: true
```

ファイルに更新があったタイミングで bin/rake spec を実行してくれます。(`reload: true`を付ける必要があります)
Railsを使っている場合には、Guardなどを使って自動的にRspecを実行している人も多いでしょうが、こちらをつかうとビルドツールと同じ環境でRSpecを常時実行することができます。

## internal/shell

`internal/shell` stepは pipeline の実行中にコンテナの中のシェルに入って、任意のコマンドを実行することができます。

```yaml:wercker.yml
box: ruby:2.3.1

dev:
  steps:
    - bundle-install
    - internal/shell:
      cmd: /bin/bash
```

これで、`wercker dev`を実行するとビルドプロセス(例えば、bundle-install)が流れた後に、コンテナ内のシェルプロンプトが表示されます。`wercker.yml`の設定などで問題が起きた場合やデプロイがうまく通らない場合のトラブルシューティングに便利です。

# wercker build

`wercker build`コマンドは`wercker.yml`の中の`build pipeline`を実行します。こちらのコマンドは、 dev コマンドよりもより`Wercker`上で実行している環境に近い環境で実行してくれるのでbuildプロセスや デプロイプロセスの確認に利用することができます。

# wercker pull

```bash
> wercker pull springkuma/test_repository
```

`wercker pull`コマンドを使うとwerckerに登録しているリポジトリの最新のビルドをローカルにpullしてくることができます。[^1]
`wercker pull`コマンドを利用するためには`build pipeline`などで`internal/store-container`というstepを実行しておく必要があります。(これによって、pullしてくる用のビルドイメージが保存されるようです)

```yaml:wercker.yml
box: ruby:2.3.1

build:
  after-steps:
    - internal/store-container
```

また、`Wercker`にユーザ登録するときに`GitHub`の認証を利用して認証した場合には以下の手順を実行してローカル環境にトークンを保存する必要があります。

1. `Settings > Personal tokens`で`wercker-cli`という名前でトークンを生成
2. ローカル環境の`~/.wercker/token`というファイル名で、`1.`のトークンを保存

認証に関しては以下の記事を参考にさせていただきました。ありがとうございます。

https://skatsuta.github.io/2015/07/21/wercker-github-login/

[^1]: 実はこちらの手順でどうしても上手くいかなかったので、werckerにissueを投げる予定です…
僕もget sparksしたかったよ

この記事は<a href="http://qiita.com/advent-calendar/2016/code_igniter" target="_blank">CodeIgniter Advent Calendar 2016</a>の8日目の__ネタ記事__です。

CodeIgniterのためのパッケージマネージャー&リポジトリとしてSparksという物がある、という話を先日の[CodeIgniter Night](https://codeigniter-talk.doorkeeper.jp/events/52872)の際にNEKOGETさんがポロッとこぼしたので、その場で公式サイトを見てみました。

[CodeIgniter Sparks | The Package Manager and Repository](http://getsparks.org/)

![スクリーンショット 2016-12-05 21.21.32.png](https://qiita-image-store.s3.amazonaws.com/0/25524/6cb31652-5faf-37e1-276f-7e0274b9d690.png)

......僕も元気なSparksのサイトを見てみたかったよ！ get sparksしたかったよ！


一応過去の解説記事を探し、ターミナルを叩けばインストール自体は出来たのですが、
<img width="569" alt="スクリーンショット 2016-12-05 22.40.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/25524/e88633cc-aa8f-eade-5171-602194fed6b7.png">
getsparks.orgのDBが死んでいる為に
<img width="450" alt="スクリーンショット 2016-12-05 22.41.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/25524/d93f37a0-a596-124b-bb7c-483e0cae0b17.png">
全く使えませんでした。
今年の10月頃には以下のような記事もあったので、最近になって天に召されたのかもしれません。
[【CodeIgniter】サードパーティのライブラリ(ion_auth)をインストールする方法](https://manablog.org/ion_auth/)

---

報告は以上です。
明日以降も<a href="http://qiita.com/advent-calendar/2016/code_igniter" title="CodeIgniter Advent Calendar 2016 - Qiita">CodeIgniter Advent Calendar 2016</a>をよろしくお願いします！
第１回 Web API を利用するには？～概要編～

#概要
今日から５回に分けて、Web API についてお話します。

1. 概要
2. ノンコーディング編：IFTTT
3. ノンコーディング編：Microsoft Flow, Azure Logic Apps
4. EAI ツール編：DataSpider, ASTERIA
5. コーディング編：CData API Drivers

[それぞれの URL]
- IFTTT： https://ifttt.com/
- Microsoft Flow： https://flow.microsoft.com/
- Azure Logic Apps： https://docs.microsoft.com/ja-jp/azure/app-service-logic/app-service-logic-what-are-logic-apps
- DataSpider： https://www.appresso.com/servista/
- ASTERIA： https://www.infoteria.com/jp/asteria
- CData API Drivers： https://www.cdata.com/jp/apidriver/default.aspx

#目的
Japan Web API Community の代表をさせていただいております清水です。
今回は CData Software User Group Advent Calendar 2016 に参加させていただきます。
(ちなみにコミュニティの第 1 回 12 月 21 日開催予定です。⇒ https://jwacom.connpass.com/event/45812/ ）

本投稿の目的は以下となります。

クラウド時代と呼ばれる昨今、いろんなサービスが乱立する中、Web API はほぼすべての SaaS, PaaS が備えています。
だがしかし！誰しも一度は「お！API あるじゃん。繋げてみよう」と試みて、挫折したことがありますよね？

であれば、「へー、このサービス、API あるんだ。よっしゃ、コーディング、コーディング…」となるより前に、一度立ち止まって、本当にコーディングが必要なのか、そもそもコーディングは手段であって、目的ではない！ということを今一度、考えてみませんか？という問いかけです。

そう、Web API につなぐことの目的は、
**繋いで何らかのデータを連携して、ユーザーに対して、あるいはサービスに対して新たな価値を生む**
ことのはずです。

私が主催する Japan Web API Community も同様ですが、ここを皆様と一緒に考えていくことができれば、と思っております。

#予定
というわけで、この投稿を第１回として、今後、第５回まで上記の予定で投稿していこうと思います。
なお、内容は詳細な使い方に触れるのではなく、

- それぞれのサービスの簡単な紹介
- それぞれの方法がどういう場合に向いているのか

この２点に絞ってご紹介していこうと思います。

それでは次回 (12月10日) はまず ノンコーディング編：IFTTT です。
Mathematicaでノートブックを作るTips

# はじめに

細々としたことばかりで恐縮ですが、
ホビーとしてMathematicaを利用する際、ノートブックを作ったりコードを実行したりするときのTipsを書き連ねようと思います。

# Tips

## ノートブック情報を残す

僕のMathematicaフォルダには大量のノートブックがあるので、
なるべく関連性がわかるような管理を心がけています。

そこで僕は、各ノートブックファイルの冒頭に

- ファイル名
- ノートブックの元となったプログラムのファイル名（マージしている場合複数）
- ノートブックの作成日

を明記することにしています。

例:

```text
(* qiita-tips--2.nb *)
(* from qiita-tips.nb *)
(* from notebook-tips.nb *)
(* created at 2016-12-06 *)
```

ファイルを新規作成して上記のファイル情報を書き、
そこに書いたファイル名で名前を付けて保存します。
このとき、セルの形式がInputだと、ハイフン等にスペースが紛れ込むので、
Textにしておくのがよさげです。

## Webからの引用はHyperlinkで

```fibonacci-word.nb
(* from https://oeis.org/A003849 *)
Flatten[Nest[Join[{#}, {#[[1]]}] &, {0, 1}, 9]]
```

このように引用元を含めたセルの場合、Inputスタイルになるため先ほどと同じくコピペ時にスペースが紛れ込んでしまいます。
こんな感じ: `https : // oeis.org/A003849`

なので、

```
(* Hyperlink["https://oeis.org/A003849"] *)
Flatten[
 Nest[Join[{#}, {#[[1]]}] &, {0, 1}, 9]]
```

というようにしておくといいでしょう。
別にHyperlinkをコメントアウトせず評価しちゃってもいいんですが。


## すでに保存してあるファイルは新規ノートブックにコピーして編集する

バージョン1のファイルを作ってバージョン2を作るとき、
バージョン1のファイルを直接いじることはしません。

人によってはあまり意味をなさないかもしれませんが、保存状態が気になってしまうので念を入れてこうやってます。
バージョン1のコードを全選択してバージョン2にペーストしてから新しいコードを書き加えていくのがおすすめです。

## 本当に不要になるまでコードを消さない

「1回うまくいったので清書で書き直そう」、みたいなときに、
「前に試行錯誤してたのはもういらないや」、と思うことがありますが、
「やっぱりさっきの検証結果を見直してちゃんと書かないと」みたいになることがあるので、
不要なコードだと思うものも邪魔にならない程度に残しておくといいと思います。
Mathematicaのアンドゥは挙動が微妙なので…。

## カーネルを終了してからノートブック評価

Mathematicaはノートブック間で変数や関数などが共通になっています。
なので、例えばファイルAで定義した関数をファイルBで使い、ファイルBを保存していたとすると、
後日ファイルBを開いた時にファイルAの関数がない状態なので、「はてどう定義したんだっけか」、と
なってしまう恐れがあります。
また、同じファイルでも、実は消したコードで関数を定義してた、なんてこともあり得ます。
ノートブックはファイルを開いて実行した時に正常に動くべきなので、
相当実行時間の長いコードを含んでない限りは、保存前に[評価]→[カーネルを終了]をして
[評価]→[ノートブックを評価]した状態にすれば安心です。

あと、例えば

```
a = 5
```

とした後

記号として

```
{{a, b, c}, {d, e, f}}
```

を扱ったら

```
{{5, b, c}, {d, e, f}}
```

となり記号が別の式に変換されていた、という気付かない事象もあります。
それに気づかず関数が壊れたような動作をする恐れもあるので、
特に `x` とか `f` とか、一文字の記号は要注意です。


## Exportはコメントアウトして保存

先ほどのTipsのようにノートブックを評価しちゃいたいところですが、
Exportがあると既存のファイルを壊したり問題がある可能性があります。
Exportのコードはコメントアウトしておくとよいでしょう。


# まとめ

ノートブック管理は人によって結構さまざまでしょうね。
Mathematicaのクセを見抜いて、もっと快適に使えるようになりたいものです。
Keynoteの素晴らしさと自分の作品を紹介する5つのステップ

#はじめに
どうも、かっくんです！East Companyの中の人をやってます。
iOS App制作はしていますか？最近はSwift 3になって大変です。
それは置いといて、Appなどを作るにあたって重要なことをお話しましょう。
いつかは自分の作品をプレゼンで紹介するときが来るかもしれません。
PowerPoint、Sway、ソフトは色々ありますね。
自分はMac対応のAppleの純正App、**「Keynote」**を使っています！
これが結構優秀なんです。
今回はそんなKeynoteをかんたんに紹介します！
##ファイルの作成方法
![スクリーンショット 2016-12-07 19.39.49.png](https://qiita-image-store.s3.amazonaws.com/0/93171/70aae875-44dd-ceae-e735-68bd2acb9683.png)
まずこんなアイコンを探して開きます。

![スクリーンショット 2016-12-07 16.55.21.png](https://qiita-image-store.s3.amazonaws.com/0/93171/836b12b0-7fc8-8a2a-8aa0-44039bb997a5.png)

そしたらファイル選択画面が出てくるはずです。
これの"新規書類"を選択します。

![スクリーンショット 2016-12-07 16.55.29.png](https://qiita-image-store.s3.amazonaws.com/0/93171/257c5109-2707-eb16-7aed-626db3d5fec1.png)

そしたらこんな画面が出て来るはずです。
ここではプレゼンのデザインが選択できます。(あとでちゃんとカスタマイズできます)
"ワイド"は、通常よりより広いスペースでのプレゼン作成が可能です。

![スクリーンショット 2016-12-07 16.55.43.png](https://qiita-image-store.s3.amazonaws.com/0/93171/30fe5d9d-36c4-2335-4605-722113e09ea7.png)

これで準備完了です。
#Keynoteのスゴイところ3つ
さて、ここからはKeynoteの実用的な特徴を紹介します！
Keynoteのスゴイところを自分の独断と偏見で3つ選びました！
それを紹介します！
###1:プレゼンを他の画面で共有できる！
なんとKeynoteは他のPCなどで画面を共有できます！
URLを開いたらすぐです！
Keynote Liveという機能です！
![スクリーンショット 2016-12-07 16.57.12.png](https://qiita-image-store.s3.amazonaws.com/0/93171/6f843e9b-358a-7c1f-bc64-558561ef3bb9.png)
###2:共同制作できる！
他の人達と共同発表する時って、ありますよね？
そんな時役立つのがKeynoteの共同制作機能です！捗ると思いますよ？
![スクリーンショット 2016-12-07 16.57.32.png](https://qiita-image-store.s3.amazonaws.com/0/93171/3aa98200-2649-5dea-ce5b-87c58496c769.png)
###3.iOS端末をコントローラとして使える！
これは大きいと思います。KeynoteのiOS版が入っていれば誰でも使えます！
もうコントローラーを買う必要はありません！
![スクリーンショット 2016-12-07 16.57.50.png](https://qiita-image-store.s3.amazonaws.com/0/93171/e29f264f-f8e9-2b38-9587-71085cabbb4b.png)#

他にもアニメーションの豊富さ、Apple製Appとの連携、背景の自由さなど素晴らしいところは
かなりありますが、今回はプレゼン時の便利さに絞って紹介しました！
#自分の作品を紹介する
さて、ここまで実用的な面だけを語ってきましたが技術としての使い方を紹介しようと思います！
自分のiOS App"自己紹介のカンペ"のを紹介したときの例を使って紹介します！
###1:まずタイトル
![スクリーンショット 2016-12-07 20.46.13.png](https://qiita-image-store.s3.amazonaws.com/0/93171/4a4ef6af-812a-bf92-bebd-0f41dd74d14b.png)
まず自分はAppアイコンとタイトルを全面に出します！
大体どこでもここから始まります。
###2:ざっくり
![スクリーンショット 2016-12-07 20.52.29.png](https://qiita-image-store.s3.amazonaws.com/0/93171/c79e7364-bb2d-1b45-bb9b-253bfbdd0b0f.png)
そこからAppにざっくりしたテーマを掲げます。
そこでAppの大体のイメージを固めさせるのです。
###3:細かい機能
![スクリーンショット 2016-12-07 20.52.44.png](https://qiita-image-store.s3.amazonaws.com/0/93171/97e87b93-6490-c28f-dc9f-cee4a6b4a2c3.png)
そこから細かい機能を紹介していきます。
###4:実際に見せる
![スクリーンショット 2016-12-07 20.52.53.png](https://qiita-image-store.s3.amazonaws.com/0/93171/117d07b5-64c9-21f8-fa35-7a9a63c8c468.png)
実際に使うところを見せて行きます！
これで閲覧者が実際使うとどんな感じか具体的に知ることができます。
###5:メリットなどをまとめる
![スクリーンショット 2016-12-07 20.53.04.png](https://qiita-image-store.s3.amazonaws.com/0/93171/8e831db4-808c-5289-45ad-533771e8c1d3.png)
Appの良さをここであえて出します。
「これいいな」と思ってもらえるかもしれません！

あとは必要に応じて配信時期をタイトルと一緒に出すといいと思います！
#さいごに
かなりの駄文となってしまいましたが、いかがでしたか？
自分の作品を紹介するのは、プログラミングと並んで**重要**なことです。
Wで出来れば、一番の開発者ですね！

さて、次回9日目は@santa_sukitokuさんこと、さんたさんが提供する
**"Sonic PiでSoundProgramming!"**です。
自分はSonic Piというのは初耳です。サウンドプログラミングとは一体...!?
とにかく期待です！

重要1:この記事ではKeynote バージョン7.0.5を使用しています。
重要2:**この記事の写真を無断で使用することを固く禁止します！**
Jupyter で音声データを埋め込む

(2016/12/21 追記)
IPython の標準モジュールにこれをやる関数があったので大幅編集。[参考 URL](http://stackoverflow.com/questions/33048353/more-than-one-audio-object-in-a-jupyter-ipython-notebook-cell)

# 問題
Jupyter では、 `%matplotlib  inline` を書いたりすれば画像を埋め込むことができる。
しかし、音声ファイルを埋め込んで再生できるようにすることはできなかった。

これを解決するために、以前、以下の記事で Jupyter で音声ファイルを埋め込む記事を書いた。
http://qiita.com/mzmttks/items/f4493efaa8b8c0a58a82
しかし、複数のファイルを読み込めなかったり、音のデータを直接渡すことができない問題が残っていた。

本記事はこの問題を解決する IPython の標準モジュールとその使い方をを示す。
* 1つ、または複数音声ファイルを同時に埋め込むことができる。
* 音声データ (ファイルではない) を埋め込むことができる。
* Python 2 & 3 の両方に対応する。

# 解決方法

* ``IPython.display.Audio`` を使うと、パスを指定すればそれを読み、データを指定すればそれを埋め込んでくれる。
* 複数音声を一緒に埋め込みたいときは ``IPython.display.display`` でwrap すればよい。

# コード
* ファイル "sample.wav" を埋め込むとき

```python
import IPython.display
IPython.display.Audio("sample.wav")
```

* ファイル群 "sample1.wav" "sample2.wav" を埋め込むとき

```python
import IPython.display
IPython.display.display(IPython.display.Audio("sample1.wav"))
IPython.display.display(IPython.display.Audio("sample2.wav"))
```

* 音声データを埋め込むとき (1ch)

```python
import numpy
import IPython.display

# 440Hz
duration = 3
sin_1ch = numpy.sin(440 * 2 * numpy.pi * numpy.linspace(0, duration, duration * 16000))
IPython.display.Audio(sin_1ch, rate=16000)
```

* 音声データを埋め込むとき (2ch)

```python
import numpy
import IPython.display

# 440Hz, 220Hz
duration = 3
sin_2ch = [numpy.sin(440 * 2 * numpy.pi * numpy.linspace(0, duration, duration * 16000)),
           numpy.sin(220 * 2 * numpy.pi * numpy.linspace(0, duration, duration * 16000))]
IPython.display.Audio(sin_2ch, rate=16000)
```
Railsのice_cubeを触ってみる

ice_cubeを利用した時の内容を記述します。


インスタンスを作成する。
```
schedule = IceCube::Schedule.new(Time.local(2010, 7, 1))
```

### ベーシックな方法

```
room = Room.new()
room.schedule = IceCube::Schedule.new(Date.today, duration: 1.day)
room.schedule.add_recurrence_rule IceCube::Rule.weekly.day(:friday,:saturday,:sunday)
room.save!
```
もっともベーシックな記述方法です。
指定した期間内で、対象としたい曜日を追加します。


### checkin/out

チェックイン/アウトする日付を指定します。

```
check_in_ok = Date.today.next_week + 4.days
check_out_ok = check_in_ok + 2.days

u = User.find(1)
u.book! room, time_start: check_in_ok, time_end: check_out_ok

r = Room.new()
r.schedule = IceCube::Schedule.new(Time.now, duration: 10.hours)
r.schedule.add_recurrence_rule IceCube::Rule.weekly.day(:monday).hour_of_day(8)
r.save!
```

### 予約成功と失敗事例

booking成功時間と失敗時間を試します。

```
from_ok = Date.today.next_week + 9.hours
to_ok = from_ok + 2.hours
from_wrong = Date.today.next_week + 1.day + 9.hours
to_wrong = from_wrong + 2.hours

u = User.find(2)
u.book! r, time_start: from_ok, time_end: to_ok
u.book! r, time_start: from_wrong, time_end: to_wrong

room = Room.new()
room.schedule = IceCube::Schedule.new(Time.now, duration: 10.hours)
room.schedule.add_recurrence_rule IceCube::Rule.weekly.day(:monday).hour_of_day(8)
room.save!
```
夢やぶれて・・・ VSCodeでファイルの自動エンコーディングを実現したかった話

## はじめに
これは [Visual Studio Code Advent Calendar 2016](http://qiita.com/advent-calendar/2016/vscode) の8日目の記事です。

みなさん、VSCodeつかってますか?
僕はといえば、昔Atomを愛用していたことをすっかり忘れて日々VSCodeライフを満喫しております。
そんなVSCodeですが、日本(語)で働く我々にとって避けては通れぬつらみがありますよね。
そう、デフォルトのファイルエンコードがUTF-8のときに、ほかのエンコードのファイルを開くと文字化けしちゃう、あれです。

これは、VSCodeの非UTF-8エンコーディング問題に立ち向かった一人の男の物語である…!

## Preferenceで設定できますよ?
そうなのです。ファイルが全て非UTF-8であれば `files.encoding` を変更すれば解決です。
※ 常に非UTF-8ならユーザ設定、そのプロジェクトのみの設定ならワークスペース設定を編集しましょう
でもこの現象に出くわすのって、たいてい誰かからもらったファイル(環境設定メモとか)をちょっと開きたいだけなときなんです。
いつもはUTF-8がいいんです。

## エンコード設定の手数が多い
じゃあ標準の方法で都度エンコーディング変えろという話になるのですが、
用意されている手順は

1. 下にあるステータスバーのエンコードをクリック or コマンドパレットで `Change file encoding` を選択
2. `Reopen with encoding` を選択 (借り物だったり共有のファイルだったりするのでエンコード変更はしないことが多い)
3. ファイルエンコーディングを選択 (たいていShit-JIS ですよね!)

毎回なんてやってられないですよね。

## Atomでは?
拡張機能がありまして。
[auto-encoding](https://atom.io/packages/auto-encoding)
これを入れればファイルオープン時に自動で判定したエンコーディングを設定してくれるのです。
たぶん日本Atomユーザのかなりの方が入れているのではないかと。

## じゃあVSCodeでも!
そしたらVSCode版の拡張機能を作ればいいじゃない、となるのは当然の摂理ですね。
しかも当時は1.0なりたてだったので、あわよくば人気拡張機能の作成者になれるかもしれない、という下心もありました。
意気揚々としばらく実装(CoffeeScript→TypeScriptの移植)を進めていたのですが、AtomのTextEditor.setEncodingに準ずるAPIがVSCodeにはないことが判明。
コマンドを呼び出せばいけるかもと思ったのですが、`workbench.action.editor.changeEncoding` は、[`Reopen with encoding`, `Save with encodig`]のPickerを表示するだけのコマンドで撃沈。
AtomみたいにドキュメントにないAPIとか呼べるかも、と探しましたが、そんなことはありませんでした。
さすがMicrosoft、ドキュメントがしっかりしていらっしゃる…。

## ならば本体に手を入れるしかないようだな
ということでPRしました。
OSSにソースがマージされたらそれこそ夢のようです。(しかもMicrosoftのプロダクト)
https://github.com/Microsoft/vscode/pull/10013
内容はAtomの拡張機能に倣って、[jschardet](https://www.npmjs.com/package/jschardet)でエンコーディングを自動判別!って感じです。
するとどうでしょう。「ユーザが設定でUTF-8を設定しているのに勝手にエンコード変えちゃうのはおかしくね?」みたいなもっともな意見をもらいました。
ぐぬぬ…としているうちに時間が経ちIssueはCloseされたのでした。

## ならば本体に手を入れるしかないようだな その2
今度は、「違うエンコードだよ!変えちゃう?」みたいなメッセージを出してエンコーディングの変更をユーザが選べるようにしました。
https://github.com/Microsoft/vscode/pull/13142
するとなんと。「ファイル開くたびにエンコード判定するのはUX的にどうなのよ?」みたいな、これまたもっともな意見でCloseされました。
また、Close、されました…。

## 思ったことと分かったこと
こうして、僕の下心と夢は儚く散ったわけですが、この経験で感じたことを書いておきます。

+ 拙い英語でもPRとかIssueは何となく理解してもらえる
  - わけわかんねー奴がわけわかんねーこと言ってる、とはならない
  - たぶん英語ネイティブでないPRとかもいっぱいあるので慣れているのでしょう
+ とはいえ英語大事
  - 自分の思いがすべて伝わらない
  - コードレビュー外の部分でレビュー者になるべく負担をかけたくない
+ 自動エンコーディングに需要はある
  - PRに誰かしら +1 してくれていた
  - でも、たぶん英語ネイティブの人たちはあまり困ってない
+ Extension開発は意外と簡単
  - TypeScriptで作ればIntellisenseがかなり便利
  - ドキュメントがしっかりしている!

あと、PRとかIssueとか出すと急激にプロダクトがかわいくなります!


## さいごに
関係する[Issue](https://github.com/Microsoft/vscode/issues/5388)はいまだOpenですので、我こそはと思う方はぜひVSCodeのために、ひと肌脱いでいただければと思います。
僕も何か妙案が浮かんだら、懲りずに再チャレンジするつもりでいます。
この件に限らず、VSCodeへのコントリビュートは、手の届く範囲に不便のある今がねらい目だと思いますが、いかがでしょうか。

ReleaseNote の Thank you に載ってる人かっこいいなー…

## 追記
コメントで教えてもらいましたが、ついに自動判別機能が実装されたようです!(僕の手柄ではありません)
https://code.visualstudio.com/updates/v1_11#_auto-guess-encoding-of-files
`files.autoGuessEncoding` を `true` にすると有効化されるみたいです。レッツ！
【FileMaker】意外と敷居が高いらしい - スクリプトトリガ - OnObjectModify

はい、今日は、[AdventCalendar 2016 FileMaker Tips](https://qiita.com/advent-calendar/2016/filemaker-tips/) 12/08の記事です。

今回は、スクリプトトリガの[OnObjectModify](https://www.filemaker.com/help/14/fmp/ja/html/script_trigg.36.4.html#432385)です。
主に、マウスが当たっているフィールドに変更が起きた場合に動きます。

まずは、動作確認です。
https://youtu.be/KLjIwvi2BAE
会員年数によって、ランクフィールドを更新しています。
ついでに、変更された値によって、条件付き書式で色をつけてみました。

今回は別フィールドの値を変更するという単純な動きですが、OnObjectModifyはフィールドの内容変更に伴うトリガなので、例えば、

・顧客のメールアドレスが変更されたら、担当者にポップアップを出す、とか、
・会議の資料を追加したら、参加者に添付メールを出す、とか、
・部屋に入室したら、電気のスイッチを入れる、とか（これは多分センサーやスイッチとの外部連携が必要だけど）

など、状態が変わったら、これをする、というのが明確な場合に利用できます。

フィールドの定義を計算フィールドにすればいいじゃないか、というのもありますが、テーブルのフィールド定義として必要であれば、計算フィールドでいいと思います。
「このレイアウトでは、Aフィールドが変更されたらBフィールドを変更して欲しい」
「でも、全体的な変更ではない」
という場合は、スクリプトトリガでその場の対応をすれば済むことですね。

スクリプトトリガの設定は、↓です。
![20161208_1_FileMakerTipsAdventCalendar2016.png](https://qiita-image-store.s3.amazonaws.com/0/60538/9b27b4b8-2852-7115-ad8f-7edd4a70f50e.png)

開発でよく使うトリガですが、仕様書として状態遷移図を作っておくと、スクリプトトリガで実装するのか、それともフィールドの定義で実装するのかの判断ができると思います。
状態遷移図は、[UML](http://objectclub.jp/technicaldoc/uml/umlintro)という設計手法の一つです（リンク先は、「[オブラブ](http://objectclub.jp/) - UML超入門」）。
他の言語設計では良く使う手法ですが、FileMaker界隈では仕様書自体を見かけないことが多いので知らない方もいらっしゃるかもしれません。
単純にパワポの画面遷移図に頼らず、UMLで奥深くまで設計できていると、実装の迅速化とバグの少ない実装ができると思いますので、紹介します。
↓が易しく書いてありますので、ぜひ参考にしてみてください。
[Change Vision - ステートマシン図 & 状態遷移表チュートリアル](http://www.changevision.co/tutorial-statemachine-japanese.html)

では！
Vim 8.0 Advent Calendar 8 日目 defaults.vim

この記事は [Vim 8.0 Advent Calendar](http://qiita.com/advent-calendar/2016/vim8) の 8 日目の記事です。

今回は新しく Vim に追加された defaults.vim という機構について解説します。

## 背景

Vim には今でも多くの新機能が追加され便利になっていっていますが、一方で互換性も重視しています。
中には、シンタックスハイライトなど明らかに便利であるにも関わらず、デフォルトでは有効になっていない機能があります。
新しく Vim を使い始めるユーザーにとって、互換性が理由で便利な機能がすぐに使えないことはあまり嬉しくはないでしょう。
そこで追加されたのが defaults.vim です。あくまで Vim 自体のデフォルト値は変えずに、ユーザーに便利な設定を提供します。

## defaults.vim の読み込み

ユーザーの `vimrc` ファイルが存在しない場合、`$VIMRUNTIME/defaults.vim` ファイルは自動で読み込まれます。
読み込みたくない場合は、vimrc を読み込まない場合と同様に `vim -u NONE` や `vim -u NORC` などを指定して Vim を起動します。
また、システム管理者が `defaults.vim` を読み込ませたくない場合、システムワイドの vimrc にて `let g:skip_defaults_vim = 1` を行うことで `defaults.vim` の設定は適用されなくなります。

なお、この `defaults.vim` の追加によって、Vim は通常の起動でコンパチブルモードで起動することがなくなりました。このことは非互換の変更として help にも記載されています。

## defaults.vim の内容

例えば以下のような設定があります。

- Vi 互換モードをオフにする (`set nocompatible`)
- filetype の検出やプラグインなどを有効にする
- シンタックスハイライトを有効にする
- `'nrformats'` オプションの値から `octal` を取り除く
- 間違えて `<C-u>` したときに undo できるようにする
- `:DiffOrig` Ex コマンドの定義 (`:help :DiffOrig`)

詳細は実際にファイルの中身を見てみてください。`:e $VIMRUNTIME/defaults.vim` で開けます。

## defaults.vim から始める vimrc

`defaults.vim` は最初に使い始める vimrc の叩き台としても機能します。
新しく自分用の vimrc を書き始めたいと思ったとき、`defaults.vim` の内容を継承したい場合は、`defaults.vim` ファイルを `vimrc` ファイルにコピーするか、もしくは `vimrc` の先頭に以下のように書きます。

```vim
source $VIMRUNTIME/defaults.vim
```

ここから、自分の気に入らない部分をちょっとずつ手を加えていくとよいでしょう。


逆に言うと、これらを行わずにユーザーの `vimrc` ファイルを作成すると、`defaults.vim` が読み込まれなくなることから、挙動が変わってしまうことに注意してください。
シェルスクリプトの罠を避ける三つの tips

シェルスクリプトは、Unix 系環境で仕事をするエンジニアなら誰もが一度は書くであろうにもかかわらず、書き方や特性を熟知している人が少ない言語です。この記事は、シェルスクリプトを書くときに罠を踏まないようにするために最低限あなたが気を付けるべき tips 集です。「たかがシェルスクリプト」とは思わないでください。生半可に書かれたシェルスクリプトはあなたの (チームの) 生産性をかえって低下させます。

# Shebang に bash を明示しろ

Bash でしか使えない機能のことを俗に Bashism と言います。Bashism はもちろん Bash 以外のシェルでは動きません。これに関するありがちな罠は、以下のように発生します。

1. Bash が `/bin/sh` として使われている環境でシェルスクリプトを書く。うっかり Bashism がシェルスクリプトに含まれていても、 `/bin/sh` は何も文句を言わないので、Bashism に気付かない。
1. `/bin/sh` が Bash でない環境[^bin_sh]でそのシェルスクリプトを実行すると動かない。

[^bin_sh]: 最近では主に Debian と Ubuntu が該当

これに対する回避策は、どの環境でも必ず Bash でシェルスクリプトが実行されるようにすることです。そのために、シェルスクリプトの先頭行には `#!/bin/sh` ではなく `#!/bin/bash` と書きましょう。

愚直な回避策として「Bashism を使わないように気を付ける」という方向性もアリですがそのためにはより多くの労力が必要となるので、最低限気を付けるべきことというレベルではおすすめしません。

# Shellcheck でチェックしろ

[Shellcheck](https://www.shellcheck.net/) という lint ツールがあります。シェルスクリプトを書くときに犯しがちな様々なミスを指摘してくれます。Haskell で書かれているので環境によっては若干インストールが面倒ですが、非常に有用なのでシェルスクリプトを書いたときは毎回これを使ってチェックしましょう。

# `set -Ceu` しろ

シェルにはいくつかオプションが設定できるようになっていて、それによって実行時の挙動が変わります。ここでは、デフォルトでは有効になっていないがデバッグに役立つオプションを三つ紹介します。

## `-C`

`grep foo bar.log > filtered.log` のようにリダイレクトを使うと、デフォルトでは出力先のファイルは問答無用で上書きされてしまいます。リダイレクト先のファイル名を打ち間違えるなどして意図せずファイルを上書きしてしまってもすぐには気付けません。`-C` オプションを有効にしておけば、リダイレクト先のファイルが既に存在している場合はエラーになるので、不用意な上書きを防げます。

なお、ファイルを本当に上書きしたいときは `>` の代わりに `>|` と書くと上書きされます。

## `-e`

シェルスクリプトの途中でエラーが発生したときはそのシェルスクリプトの実行を中断すべき場合が多いでしょう。例えば、プログラムをビルドしてそれを特定のディレクトリーにインストールするというシェルスクリプトがあったとしたら、ビルドがもし失敗した場合にインストールを試みるのは無駄です。大概のコマンドは、失敗したときに 0 以外の終了ステータスを返すようになっているので、それを自動的に検知してシェルスクリプト自体も終了させる `-e` オプションを有効にしましょう。

なお、コマンドが失敗してもシェルスクリプトを終了させたくないときは、コマンドに `&& true` を付けるとシェルスクリプトは終了しません。[^cancel_e]

```sh
# make build が失敗したら make install 以降は実行しない
# make install が失敗したら make clean 以降は実行しない
# しかし make clean が失敗した場合でも中断せずに echo Done! を実行する
set -e
make build
make install
make clean && true
echo Done!
...
```

[^cancel_e]: `&& true` ではなく `|| true` を付けるべきだと思いましたか? 実際のところ、`-e` オプションを局所的に無効化するだけならどちらでも構いません。ただし、`|| true` を使うと失敗したコマンドの終了ステータスを `$?` 変数で取ることができなくなります。

## `-u`

デフォルトでは、存在しない変数は空文字列に展開されます。これはしばしば悲惨な結果を招きます。例えば下のスクリプトでは変数の名前を打ち間違えているので ~/foo.tmp ではなく ~ が丸ごと削除されてしまいます。

```sh
tmpdirname=foo.tmp
rm -fr ~/"$tempdirname"
```

`-u` オプションを有効にしておけば、存在しない変数はエラーになってスクリプトが終了するので安心です。

## オプションの指定方法

上記三つのオプションを有効にするには、スクリプトの冒頭 (`#!/bin/bash` の次の行) に `set -Ceu` と書きましょう。冒頭に書くことで、確実にオプションを有効にできます。

スクリプトを実行するときに `bash -Ceu my_script.sh` のようにコマンドライン上でオプションを指定することもできますが、指定し忘れると意味がないのでスクリプトの中でオプションを有効にする方が確実です。

# まとめ

以上、シェルスクリプトを書くときに気を付けるべき三つのことを紹介しました。

ここに書いたのはスクリプトを書き慣れていない人がまともなスクリプトを書くためにまず最低限知るべきことにとどまっており、決してこれさえ気を付ければスクリプトが完璧になるというものではありません。「Bash 以外のシェルでもスクリプトを実行させなければならなくなったら?」「Shellcheck でも指摘されないミスにはどんなものがある?」「if 文の中では `-e` オプションはどのように働く?」などと考え出すと、気を付けなければならないことはいくらでも出てきます。

シェルスクリプトは一見誰でも簡単に書ける手軽なプログラミング言語ですが、実際は注意深く書かなければすぐ「動かないスクリプト」が出来上がってしまう厄介な言語です。この記事をシェルスクリプトの厄介さを認識するための第一歩として捉えてもらえれば幸いです。

----

ACCESS Advent Calendar 2016 では、[ACCESS](https://jp.access-company.com/) のエンジニアが毎日思い思いの記事を公開しています。明日は @bols_blue さんです。
CHIRIMENのGPIOピンの話

[前回記事「CHIRIMENを起動しよう！」](http://qiita.com/tadfmac/items/8645fb683bbd125ccff8)では、CHIRIMENの起動方法とファームウエアのUpdate方法について書きました。

今回は、CHIRIMENについているGPIOピンで現状できることについて書きます。

# CHIRIMENのGPIOでできること

>CHIRIMENはコミュニティベースで日々開発が進められています。ですので、ここに書くことは、現時点でのスナップショットです。

CHIRIMENの現在の最新版ファームウエア、「[CMN2015-1_B2GOS-20170301](https://github.com/chirimen-oh/release/releases)」で実装されているGPIOPINの機能は下記のとおりです。

![chirimen-pin-mapping-CMN2015-1_B2GOS-20170301-2.png](https://qiita-image-store.s3.amazonaws.com/0/31758/a0b93da1-998e-8e76-e884-4559b7a0f8c7.png)

上記ピンの各機能のWebアプリからの利用方法は以下の通りです。

## 1. GPIO (水色の番号)

CHIRIMENのGPIOピンへのアクセスは、[Web GPIO API](https://rawgit.com/browserobo/WebGPIO/master/index.html)を経由して行います。
現在のCHIRIMENの実装に対応した[@MSakamakiさんによるpolyfill](https://github.com/club-wot/WebGPIO)が公開されており、こちらを利用することでアクセスが可能になります。

Web GPIO APIを利用したサンプル等は、[Lチカサンプル](https://github.com/chirimen-oh/examples/tree/master/LEDblink)を参照ください。

GPIOピンでは、デジタル入出力が行えます。Arduinoでいうところの`digitalRead()`と`digitalWrite()`同様の機能が提供されています。

## 2. I2C (図中のSCL/SDA)

CHIRIMENではI2C通信も利用できます。（CHIRIMEN側がI2C Masterとなり、I2C Slaveデバイスと通信することができる）
I2Cへのアクセスは、[Web I2C API](https://rawgit.com/browserobo/WebI2C/master/index.html)を経由して行います。
こちらも、現在のCHIRIMENの実装に対応した[@MSakamakiさんによるpolyfill](https://github.com/club-wot/WebGPIO)を利用することでアクセスできます。

> Web I2C APIを用いたアプリケーションサンプルについては、次回簡単に紹介する予定です。

## 3. L/R OUT　（オレンジ色）

CHIRIMENのオーディオ出力です。
Web Audio APIやHTML5のaudioタグ等での音声出力で利用可能です。
ただし、このPINを利用しなくても、HDMI出力でもオーディオ出力が可能です。

## 4. ADC0 IN , L/R IN

現在のCHIRIMENでは機能未実装のPINです。たぶん。。。（違ってたら誰かつっこんで。。）

# 最新情報はコミュニティで！

CHIRIMENの実装や今後の方針については、[CHIRIMEN Open Hardware コミュニティ](https://chirimen.org/)で議論が進められ、[github](https://github.com/chirimen-oh)を中心に活発に情報の更新が行われています。

CHIRIMEN Open Hardwareコミュニティはオープンソースで誰でも参加できます！
ぜひ参加して、CHIRIMENをもっと面白くしましょう！よろしくお願いします。

# 次回は?

次回は、WebI2Cの利用方法について書く予定です。

# 2017.03.12 追記

I2CポートのGPIOはアクセスできないため図から削除しました。
またCH2-10については現状初期状態でPWMが有効化されているため、利用には注意が必要です。あまり使わない方が良いでしょう。というわけで図の字を灰色に変更

# 2017.03.16 修正

- CH1-4 pulldown → pullup
- CH1-5 pullup → pulldown
PHP 7 で FileMaker API for PHP や FX.php を使う

# PHP 7
主要なディストリビューションやパッケージマネージャが PHP 7 を標準でインストールするようになりました。もはや PHP 7 への移行は避けられないような気がしています。

# PHP 7 で FileMaker API for PHP や FX.php を使う
さて、それでは PHP 7 で FileMaker API for PHP や FX.php は動作するのでしょうか。

結論から言えば、**問題なく動作します**。

# インストールしておくパッケージ
Ubuntu 16.04 LTS での例ですが、以下のものをインストールしておけば問題ありません。そしてここらへんが入っていないと syntax error などが出ます。

```bash
# apt-get install -y php php-xml php-curl
```

PHP のバージョンは以下のとおりです。

```bash
# php -v
PHP 7.0.8-0ubuntu0.16.04.3 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.8-0ubuntu0.16.04.3, Copyright (c) 1999-2016, by Zend Technologies
```