OmniAICreator/Qiita-1.07M huggingface dataset:
EC2 環境構築


AWSのアカウントを取得していることを前提とする。

1.EC2のインスタンスを作成する。
　ダウンロードした秘密鍵は今後使うのでなくさないように大切に保存する。

2.作成したEC2インスタンスで使用しているセキュリティグループのインバウンドグループを編集。

以下の設定を追加。

| タイプ | プロトコル | ポート範囲 | ソース |
|:-:|:-:|:-:|:-:|
| HTTP  | TCP  |  80 | 任意CIDR※  |
| SSH  | TCP  |  22 |  任意CIDR※ |
| カスタムTCP |  TCP | 8080  | 任意CIDR※  |

※テストを行う場合の設定値はMYIPか0.0.0.0/0を設定するとよい。

3.EC2に接続し、必要なパッケージをインストール。
　3.1 SSH接続
   　　MACの場合
　 　　・秘密鍵ファイルに読み取り権限を付与する。
　　　　　　例）```chmod 400 MyFirstInstance.pem```
　　 　・ターミナルを開き、ssh接続のコマンドを打つ。
　　 　　```ssh -i "鍵ファイル" ユーザー名@パブリックDNS```
　　 　　　例）```ssh -i "MyFirstInstance.pem" ec2-user@ec2-52-199-204-156.ap-northeast-1.compute.amazonaws.com```

　　　Windowsの場合
　　　　・Tera Termをインストールする。
　　　　・ホストにパブリックDNS or パブリックIPを設定し、ユーザー名(ec2-user)と秘密鍵を選択する。


　3.2 パッケージインストール
　　　　
　　　sudo権限保持コマンド
　　　```sudo su -```

　　　yumアップデート
　　　```sudo yum -y update```

　　　Apacheインストール
　　　```sudo yum  install -y  httpd```

　　　Apache動かす
　　　```sudo service httpd start```

　　　httpd(Apache)の状態確認
　　　```sudo chkconfig --list httpd```

　　　httpd(Apache)の自動起動設定ON
　　　```sudo chkconfig httpd on```

　　　javaのバージョン確認
　　　```java -version```

　　　javaのインストール
　　　```sudo yum install -y java-1.8.0-openjdk-devel```

　　　使用するjava選択
　　　```sudo alternatives --config java```
　　　使用したい番号を選択

　　　Tomcatのインストール
　　　```sudo yum install -y tomcat8```

　　　Tomcatを動かす
　　　```sudo service tomcat start```

　　　JDBC(MySqlドライバ)インストール
　　　```sudo yum install -y mysql-connector-java```
　　　```sudo cp /usr/share/java/mysql-connector-java.jar /usr/share/tomcat/lib/```
　　　
　3.3ファイル送信
　　MACの場合
　　　```scp -i 秘密鍵のパス アップロード対象ファイルパス ec2-user@host:~/```
　　　
　　Windowsの場合
　　　踏み台を用意してMACと同様の操作を行うか「WinSCP」を用いる。
rubocop 0.51のStyle/SafeNavigation (&.)の重大バグ

`rubocop -a`でRailsアプリのソースコードのスタイルを自動修正したところ、重大なバグに遭遇しました。
Style/SafeNavigation (&.)に関するものですが、rubocop 0.51のバグであって、0.52でFIXされました。

# 元ファイル

```ruby:before.rb
if user && user.group.admin?
  puts 'userが管理者です'
else
  puts 'userがnilか、管理者ではないです'
end

if user && !user.group.admin?
  puts 'userが普通ユーザです'
else
  puts 'userがnilか、管理者です'
end
```

# Rubocop v0.51の適用結果

```ruby:after_rubo51.rb
# rubocop v0.51 の変換結果、正しい
if user&.group&.admin?
  puts 'userが管理者です'
else
  puts 'userがnilか、管理者ではないです'
end

# rubocop v0.51は以下の様に間違って変換
if !user&.group&.admin?
  puts 'userが普通ユーザです'
else
  puts 'userがnilか、管理者です'
end
```

# Rubocop v0.52の適用結果

```ruby:after_rubo52.rb
# rubocop v0.52 の変換結果、v0.51同様で正しい
if user&.group&.admin?
  puts 'userが管理者です'
else
  puts 'userがnilか、管理者ではないです'
end

# rubocop v0.52 は以下を変更しなかった（正しい判断）
if user && !user.group.admin?
  puts 'userが普通ユーザです'
else
  puts 'userがnilか、管理者です'
end
```

# 参考

- [Fix a false positive in SafeNavigation when the right hand side is negated #5182](https://github.com/bbatsov/rubocop/pull/5182)
- [
Rubyの&.method vs Railsのtry(:method)](https://github.com/vochicong/ruby-tips/blob/master/notebooks/ruby_&_vs_rails_try.ipynb)
unity2017以降で新規作成したコードのMonobehaviourが認識しなくて困っている人達へ

# 追記
コメントでいただきましたが、C#4.6以降にしていることで起こる不具合のようです…
こちらの記事がよくまとまっているのでこちらで解決していただければと思います
https://qiita.com/tak/items/c2454c8db3c65f715642

# この記事の動作環境
Windows10 Pro
unity2017.2.0f3(64bit)
Visual Studio2017

# 想定している状態
- unityEditor から CreateしたC#コードのMonobehaviourが機能せず、せっかく2017で強化されたコード補完などが機能しない
- 上記の状態に陥ったとき、Visual Studioを再起動することで機能が戻る

# はじめに
[こちらの記事](http://tsubakit1.hateblo.jp/entry/2016/11/20/233000)はご覧になったでしょうか。
Visual Studio2017からは公式でunityとの連携がされるようになったので、ひと手間設定が必要のようです。

# それでも問題が解決しない場合
そう、私も上記の設定だけでは解決しませんでした。
新規コードを作るとだいたいこんな感じで、Monobehaviourが白く表示されており、認識されておりません。

![29d70608f301b1c95cbe8ec2cffe4fdd.png](https://qiita-image-store.s3.amazonaws.com/0/157326/b80edae9-cdef-bb9f-63ba-dfd622e1ac52.png)

いろいろ見てみたところ、どうやら原因はVisualStudio側が、そのプロジェクトのファイルと認識していないことが原因のようです。

![赤ハイライト.png](https://qiita-image-store.s3.amazonaws.com/0/157326/7751b907-9fd9-f9e9-e59f-37494a2350af.png)

![ディレクトリ赤ハイライト.png](https://qiita-image-store.s3.amazonaws.com/0/157326/e4a141b5-f07a-78b6-1600-3116ce714be2.png)

ご覧の画像のように、ディレクトリには配置されていますが、どのプロジェクトに属しているファイルなのかが不明になっています。

# 対処法
さて、対処法ですが、一応はあります。
それは、Visual Studioをいったん落とすこと…ではなく、ソリューションを更新してやればいいのです。

![kousin.png](https://qiita-image-store.s3.amazonaws.com/0/157326/1c9c7f7a-9f43-825b-672b-26dcecf8830d.png)

このアイコンを押すとソリューションの更新が行われます。これで無事認識されますね。

# それでも解決しない場合の対処法
さて、それでも解決できない場合もあります。あります…。
そういう時は、直接所属先のプロジェクトを指定してやればいいのです。

ファイル ＞ "スクリプト名"の移動先 ＞ "自分のプロジェクト名"
を選択します。

![purojekut.png](https://qiita-image-store.s3.amazonaws.com/0/157326/dc4ca9b7-152d-3175-201d-b0a068e2452c.png)

**認識されました！**

![dfb909b846c2de9ff36b51817c7c2a05.png](https://qiita-image-store.s3.amazonaws.com/0/157326/b0e96a68-7226-6bf6-91ec-878af6776bed.png)

# おわりに
残念ながら対症療法的なものしかわからず、根本的な解決には至っておりません。
時間を置いたらいつの間にか解決していたり、まだわかっていない部分も多いです。
ソリューションの更新などはVisual Studioの設定である程度改善はできるのですが、それでも完全には解決できませんでした。

![e0666394d094701c780d4721501ad3fa.png](https://qiita-image-store.s3.amazonaws.com/0/157326/e5388443-4550-de44-955b-017c08442990.png)

とはいえ、同じ悩みの人は結構いそうだなということで記事にしてみました。
他に何か有力な情報がありましたら教えていただければと思います。
ご拝読ありがとうございました。
Nexus7をマクドナルドWi-FiでQiitaにつなごうとした。

編集リクエストありがとうございました。
小文字大文字も直しました。

# 2023-10-14
今は、マクドナルドで、d Wi-Fiでしょうか。
セキュリティの実感は、ありませんけど。
マクドナルドのWi-Fiも、あります。

Nexus7の電源が入らなくなって、
5年前から、HUAWEI MediaPad T3を
無事に使っています。

# 旧 2017-12-24

接続の安全性を確認できません

qiita.com に安全に接続するように求められましたが、接続の安全性が確認できませんでした。
どうすればよいのか？

これまでこのサイトに問題なく接続できていた場合、このエラーが表示されるのは誰かがこのサイトになりすましている可能性があるということであり、接続すべきではありません。
技術的詳細を表示
ふつうのフロントエンドエンジニアが何も考えずにElmウェブアプリケーション開発を始める方法

ふつうのフロントエンドエンジニアが何も考えずにElmウェブアプリケーション開発を始める方法について書きます。ポイントはこれを書いている私自身、Elmについてほとんど何も理解できていないというところです。

# 対象読者
elmという名前は聞いたことがあるけど何も始めていない人

# コマンドラインツールをインストールする
create-elm-app というコマンドラインツールがあるので、それをインストールします。

```sh
npm install -g create-elm-app
```

# アプリの雛形を生成する
create-elm-app コマンドを使って、 `my-app` という名前でアプリの雛形を生成します。

```
elm-app create my-app
```

# サーバーを立ち上げる
```
elm-app start
```

# ブラウザを見る
![スクリーンショット 2017-12-24 15.24.59.png](https://qiita-image-store.s3.amazonaws.com/0/11316/4f4c335b-a1f5-1cb8-12c5-4cc85e1e3db5.png)

elmアプリが動いてる！やりましたね！

# ソースを見る
`src/Main.elm` を見るとソースがあります。

# ソースを修正してみる
![](https://i.gyazo.com/597781471775a88a4e9b71fce1ad9a09.gif)

さっきの `elm-app start` した状態でこれを書き換えてみると、それが反映されます。いわゆる Hot Module Replacement という機能ですね。雛形に最初からこの設定入ってるの嬉しいですね。

# 次のステップ
何も考えずに始めるためにはこれ以上書くことはないと思うのですが、当然これだけでは開発にならないので次のステップについても自分の体験をもとにちょっとずつ別記事にして書き足していきたいと思ってます。正直自分は最初にElmアプリのソースを見てわからないことばかりで面食らってつらかったので、順序が大事な気がしています。

- 周辺ツールについて知る
- Elmアーキテクチャについてざっくり学ぶ
- Elm言語について学ぶ
    - HTMLの記法について知る
    - ドキュメントの読み方を知る
    - 言語仕様についてじっくり学ぶ

HTMLの記法に対する疑問（なんで `[]` で囲ってるの、みたいな疑問）とかドキュメントの関数シグネチャどうやって読んだらいいの、みたいなところを足掛けにしてElm言語に入門するみたいな形がよさそう

# まとめ
- なんかこれだけで記事公開するのもあれかなと思うけど、elm界隈の人みんな頭良さそうなので逆にこれくらい頭の悪い記事もあっていいのでは
- 私自身はelmで趣味アプリを作ってるところなので、まだまだこれからという感じです
- 何かあとから書き足すかもしれない
Kerasで分岐を書いてみる

# Kerasで分岐を書いてみる
Kerasのバックエンドには便利な機能がいろいろありますが、その中にswitchというものがあります。
https://keras.io/ja/backend/#switch
これは以下のような使い方をして、分岐を書くものになっています。

```python
switch(condition, then_expression, else_expression)

```

switchはfunction APIと組み合わせてモデル定義にも組み込むことができるようです。
ためしにやってみました。
https://github.com/shibuiwilliam/kerasswitch

```python
import keras
from keras.models import Model
from keras.layers import Dense, Input, Lambda
from keras.optimizers import Adam
import keras.backend as K
from keras.utils.vis_utils import model_to_dot
from keras.utils import plot_model

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sn
import pydot
from IPython.display import SVG

# and data and or data
X = np.array([[0,0,0],[0,1,0],[1,0,0],[1,1,0],
              [0,0,1],[0,1,1],[1,0,1],[1,1,1]])
Y = np.array([0,0,0,1,0,1,1,1])
Y = keras.utils.to_categorical(Y, 2)

# input layer
inputs = Input(shape=X.shape[1:],name="input")

# and layers and or layers
def andGate(inputs):
    andDense = Dense(16, activation="relu", name="and1")(inputs)
    andDense = Dense(32, activation="relu", name="and2")(andDense) 
    return andDense
def orGate(inputs):
    orDense = Dense(32, activation="sigmoid", name="or1")(inputs)     
    return orDense

# switch cases for and and or
x_switch = Lambda(lambda x: K.switch(x[:,2]<1,
                                     andGate(x[:,:2]),
                                     orGate(x[:,:2])),
                  output_shape=(32,))(inputs)

# output layer
outputs = Dense(2, activation="softmax", name="softmax")(x_switch)

model = Model(inputs, outputs)

model.compile(loss='categorical_crossentropy',
              optimizer=Adam(),
              metrics=['accuracy'])
model.fit(X, Y,
          batch_size=4,
          epochs=20000,
          shuffle=True)
```

AndゲートとOrゲートを同居させたモデルで、switchでAndとOrを判定しています。
入力の形式は(8,3)です。
入力値の第3項は、Andの場合は0、Orの場合は1に設定し、switchはこの第3項を見て、第1,2項のみを次のレイヤの入力にします。
switchを使って分岐する部分はLambdaレイヤで囲みます。
LazyAction

最近Singleton生成以外にもLazy使う事が増えた(使い方を覚えた)のだけど、FuncじゃなくてActionなLazy欲しいなぁって事が結構あって、Lazyってどういう実装なんだろうっていう事を調べるついでにLazyActionクラスを作ってみた。
Genericを伸ばすためにparams objectにキャストしているのがいけてない感じなのだけど他に楽に書く方法を思いつかなかった。

もっとこういう風に実装した方が良いよとか、いやそれすでに.NET Frameworkにあるから、とかあったら教えててください。

```csharp

public class LazyAction
{
    private class ExceptionHolder
    {
        private readonly ExceptionDispatchInfo dispatchInfo;

        public ExceptionHolder(Exception exception)
        {
            dispatchInfo = ExceptionDispatchInfo.Capture(exception);
        }

        public ExceptionDispatchInfo DispatchInfo => dispatchInfo;
    }


    private static readonly object ALREADY_INVOKED_SENTINEL = new object();
    private Action<object[]> _lazyAction;
    private object _threaSafeObjet;
    private object _box = null;
    public bool Invoked => _box != null;

    private LazyAction()
    {
        _threaSafeObjet = new object();
    }

    public LazyAction(Action lazyAction) : this()
    {
        _lazyAction = x=> lazyAction();
    }

    public LazyAction(Action<object[]> lazyAction) : this()
    {
        _lazyAction = lazyAction;
    }

    public void Invoke()
    {
        Invoke(null);
    }
    internal void Invoke(params object[] args)
    {
        if (_box is ExceptionHolder)
        {
            var holder = _box as ExceptionHolder;
            holder.DispatchInfo.Throw();
        }
        else if (_box == (object)ALREADY_INVOKED_SENTINEL)
        {
            return;
        }

        object threadSafeObj = Volatile.Read(ref _threaSafeObjet);
        var lockToken = false;
        try
        {
            if(threadSafeObj != (object)ALREADY_INVOKED_SENTINEL)
                Monitor.Enter(threadSafeObj, ref lockToken);

            if (!Invoked)
            {
                var action = _lazyAction;
                _lazyAction = null;
                try
                {
                    action?.Invoke(args);
                    Volatile.Write(ref _box, ALREADY_INVOKED_SENTINEL);
                }
                catch (Exception e)
                {
                    _box = new ExceptionHolder(e);
                    throw;
                }
                Volatile.Write(ref _threaSafeObjet, ALREADY_INVOKED_SENTINEL);
            }
        }
        finally
        {
            if(lockToken)
                Monitor.Exit(threadSafeObj);
        }

    }
}

public class LazyAction<T> : LazyAction
{
    public LazyAction(Action<T> lazyAction) : base(x => lazyAction.Invoke((T)x[0])){ }

    public void Invoke(T param)
    {
        base.Invoke(param);
    }
}

public class LazyAction<T1, T2> : LazyAction
{
    public LazyAction(Action<T1, T2> lazyAction) : base(x => lazyAction.Invoke((T1)x[0], (T2)x[1])) { }

    public void Invoke(T1 p1, T2 p2)
    {
        base.Invoke(p1, p2);
    }
}

public class LazyAction<T1, T2, T3> : LazyAction
{
    public LazyAction(Action<T1, T2, T3> lazyAction) : base(x => lazyAction.Invoke((T1)x[0], (T2)x[1], (T3)x[2])) { }

    public void Invoke(T1 p1, T2 p2, T3 p3)
    {
        base.Invoke(p1, p2, p3);
    }
}

```

Generic　分は途中で書くの飽きた。
Vue.js+SVGで贈るクリスマスカード

# Merry Christmas!

クリスマスイブということで、Vue.js+SVGでクリスマスカードっぽいものを作ってみました。
アイテムをドラッグで動かせるので、お好みで飾り付けしてみてください。
それでは楽しいクリスマスを！

[![](https://i.gyazo.com/e4968b88d4acf468974664b2187879df.jpg)](http://nobuhito.ibaraki.jp/vue-christmas/)

# サンプル
http://nobuhito.ibaraki.jp/vue-christmas/

# コード
https://github.com/niba1122/christmas-2017
Rails5のform_withのデータの行き先

## 背景
`rails`の`scaffold`自動生成ばっか使ってると、フォームのデータの行き先はあまり気にしないことが多い。
そんな感じなので、`フォームのデータの行き先はどこ？`みたいな質問をよく受けます。

`あー、そんなん余裕やろ`と思ってると、`rails5`になって`form_for`が`form_with`に代わってて焦った。

ソッコーでググってなんとかなったが、そのググった内容をまとめておくこととした。

## scaffold生成のform_with

`scaffold`で生成すると`form_with`ってこんな感じです。


```html:_form.html.erb
<%= form_with(model: blog, local: true) do |form| %>
  いろんなフォーム
<% end %>
```

これは以下のいづれかから呼び出されている。

```html:new.html.erb
<%= render 'form', blog: @blog %>
```

```html:edit.html.erb
<%= render 'form', blog: @blog %>
```

つまり、
`form_with(model: blog, local: true) do |form|`は、
`form_with(model: @blog, local: true) do |form|`と同じ意味。

## 本来のform_withの形

本来`form_with`は以下のようなたくさんのオプションを持つ。
`form_with(model: 〇〇, scope: 〇〇, url: 〇〇, format: 〇〇, ・・・)`

この`url: 〇〇`がデータの遷移先なのです。

## modelオプションはurlを推測してくれる

では`scaffold`自動生成の下記はどこにデータが行くのか？

```html:_form.html.erb
<%= form_with(model: blog, local: true) do |form| %>
  いろんなフォーム
<% end %>
```

実は`model: blog`が行き先を推測してくれているようです。

先ほど説明したよう、`blog`は`@blog`と同値なのですが、

- `blog(@blog)`が空(`@blog = Blogs.new`な状態)の場合は、`url: blogs_path, method: post`を自動推測、つまり`BlogsController`の`create`アクションにデータを送る
- `blog(@blog)`が空でない(`@blog = Blogs.find(〇)`な状態)場合は、`url: edit_blog_path`を自動推測、つまり`BlogsController`の`edit`アクションにデータを送る

となっているのですね。
このデータの流れに関してははほとんど`form_for`と同じで安心しました。
【Dynamic Batchingルール】The object has odd negative scaling

# transform.scaleの値に負の値が入っているとDynamic Batchingされないみたいです。

全く同じパラメタのマテリアルの丸影を出しているのに、どういうわけかバッチングされない。
描画順も連続している
なんで？？

FrameDebuggerみると、
”The object has odd negative scaling.”
って怒られてました。

で、調べると、
> Odd Negative Scaling — the object has odd negative scaling (e.g. (1, -1, 1)).

試しにscaleを正の値になるように調整したらバッチングされました。
どうやら、transform.scaleの値に負の値が入っているとDynamicBatchingされないみたいです。（詳しい方いたら教えてください）

localScaleはプラスでもscaleが負になっていたらだめでした。

丸影×14でSetPass 14 => 1 になりましたｗ
気を付けてください。


# 参考
良さげなやつみっけたので、こちらどうぞ。
DrawCallのバッチングルールの記載があります。
https://blogs.unity3d.com/jp/2017/04/03/how-to-see-why-your-draw-calls-are-not-batched-in-5-6/
nem-swiftを作っている

NEMの魅力はAPIで **比較的気軽に**NEMのブロックチェーンにアクセスできることで、参照系のAPIであればブラウザでアクセスすることも可能です。

例) アカウントの情報を取得する
http://alice2.nem.ninja:7890/account/get/forwarded?address=NC2ZQKEFQIL3JZEOB2OZPWXWPOR6LKYHIROCR7PK

しかし、トランザクションを発生させるAPIは秘密鍵を扱うため、ローカル内で叩くか、トランザクションのデータをバイト配列にして署名して送信する必要があります。
また、アカウントの生成するAPIもありますが、こちらも秘密鍵が平文で渡ってきてしまうAPIのためローカルで叩く以外は推奨されておらず、基本的にローカルで計算して生成する必要があります。

これらは、セキュリティを確保する上で重要なことではありますが、実装にはある程度の知識と手間がかかるため、アカウントの生成やトランザクションの発生させるAPIを実行するのは参照系に比べると敷居が高くなってしまします。

そのハードルを軽減するために、公式で[NEM library](https://nemlibrary.com/)を出したり、有志で各言語のラッパーを作っています。

nem-swiftも、主にiOSアプリ開発者が気軽にNEMのブロックチェーンに気軽にアクセスすることを目指して作っています。
本当は、リリースして紹介したかったのですが、色々忙しくなってまだリリースできていないのですが、アカウントの生成や送金トランザクションの生成はできるようになっているので、その紹介をしたいと思います。

## アカウントを生成する

```swift
// アカウントの生成を行う. 引数のnetworkはメインネットかテストネットを入れる
let account = Account.generteAccount(network: .mainnet)
// 生成したアカウントのアドレス
account.address.value
// 生成したアカウントの秘密鍵
account.keyPair.privateKeyHexString()
// 生成したアカウントの公開鍵
account.keyPair.publicKeyHexString()

// 既存の秘密鍵から取り込む 引数として秘密鍵とネットワークの種別を取る
 Account.repairAccount(account.keyPair.importKey(), network: .testnet)
```

## モザイク送信トランザクションを発生させる

```swift
// 送信するモザイクを定義する
let mosaic = TransferMosaic(namespace: "daoka", mosaic: "daokasweep", quantity: 1)
let mosaics = [mosaic]
 
// リクエストアナウンスリクセスとを生成する
let announce = TransferTransactionHelper.

// 引数
// publicKey: 送信元の公開鍵
// network: アドレスが属しているネットワーク上のアドレス
// recepientAddress: 受取先アドレス
// mosics: 送信するモザイクの定義
// messageType: メッセージが暗号化されいるか確認するツール
generateMosaicTransferRequestAnnounce(publicKey: account.keyPair.publicKey,
             network: .testnet,
    recepientAddress: account.address.value,
             mosaics: mosaics,
         messageType: .Plain,
             message: "mosaic transfer test")

// モザイク送金トランザクションを実行するための準備を行う        
let requestAnnounce = RequestAnnounce.generateRequestAnnounce(requestAnnounce: announce,
     keyPair: account.keyPair)

 // モザイク送金トランザクションを実行する
Session.send(NISAPI.TransactionAnnounce(data: requestAnnounce.data, signature: requestAnnounce.signature)) { result in
    switch result {
    case .success(let response):
         print(response)
    case .failure(let error):
                
    switch error {
        case .responseError(let e as NISError):
             print(e)
        default:
             print(error)
         }
    }
}
```

肝となる部分はある程度実装できたのですが、テスト、検証、ドキュメントの生成が追いついていない状況です。

上記の機能が使えるソースコードは、https://github.com/daoka/nem-swift/tree/develop からクローンすることが可能です。、気になった点などあればフィードバックください。

なるべく早く公開できるようがんばります。。
Rubyで年と月を入力してその月が何日あるのか判定するプログラム

単純なプログラムですがメゾット、配列、引数、条件分岐、返り値、式展開、あといろいろ学べます。

```ruby:days.rb
def get_days(year,month)
days_list = [31,28,31,30,31,30,31,31,30,31,30,31]
    if month == 2 && (year % 400 == 0 || year%4 == 0 && year % 100 != 0 )
       return 29
     else
       return days_list[month -1]
    end
end
puts "西暦を入力してね"
input_year = gets.to_i
puts "月を入力してね"
input_month = gets.to_i
days =get_days(input_year,input_month)
puts "#{input_year}年#{input_month}月は#{days}日間あります"
```

#うるう年の条件
（1）西暦年号が4で割り切れる年をうるう年とする。

（2）（1）の例外として、西暦年号が100で割り切れて400で割り切れない年は平年とする。

まず１月から１２月までの各月の日の数を配列に入れます。このときの２月は平年（２８日）です。配列のインデックス番号はゼロから始まるので注意。
次のif文は２月でうるう年の時に２９を返しています

#構文解説
def get_days(year,month)のyearとmonthは変数です。仮引数ともいいます。
days_list = [31,28,31,30,31,30,31,31,30,31,30,31]は配列です。１２個の要素を持っています。days_list[0]は31の要素です。

#参考
https://www.nao.ac.jp/faq/a0306.html
TypeScriptでReduxミドルウェアを作る

TypeScriptを使っていてミドルウェアを使う必要があったので、ミドルウェアをどう定義するのかを書いておく。

他にもいろいろとやり方はあるのだろうけど、とりあえず以下をテンプレっぽくしておけばよさそう。

```ts:ミドルウェアのテンプレート
import { Middleware, MiddlewareAPI, Dispatch } from 'redux';

const myMiddleware: Middleware =
  <S>({ getState }: MiddlewareAPI<S>) =>
    (next: Dispatch<S>) => (action: any): Dispatch<{}> => {

      //
      // ここで好きな実装をする
      //

      return next(action);
    };
```

これを応用して、たとえばページ遷移時[^1]にAPIにアクセスしたりなどの複雑な処理も、流れてくるActionを補足し、ミドルウェアとして一枚噛むことができる

[^1]: この例では`react-router-redux`に限定

```ts:LOCATION_CHANGEDを補足するミドルウェアの例
import { Middleware, MiddlewareAPI, Dispatch } from 'redux';
import { LOCATION_CHANGE } from 'react-router-redux';

const myMiddleware: Middleware =
  <S>({ getState }: MiddlewareAPI<S>) =>
    (next: Dispatch<S>) => (action: any): Dispatch<{}> => {

      // ページ遷移のアクションかどうかをチェック
      if (action.type === LOCATION_CHANGE) {
        //
        // ここでAPIを叩いたり etc...
        //
      }

      return next(action);
    };
```
オフライン環境へのnginx導入手順

## 構築手順
1.インターネット環境がある端末で、nginx公式HPより最新版のtar.gzファイルをダウンロードする。(http://nginx.org/en/download.html)
2.インストール時にPCREとzlibのライブラリがないと怒られるはずなので、あらかじめダウンロードしておく

```
yum install --downloadonly --downloaddir=~/hogehoge pcre-devel
yum install --downloadonly --downloaddir=~/hogehoge zlib-devel
```

3.オフライン環境に上記資材を持ってくる
4.下記コマンドでnginxを導入する

```bash
yum localinstall pcre-devel.rpm
yum localinstall zlib-devel.rpm
tar zxvf nginx-1.13.7.tar.gz
cd nginx-1.13.7
./configure
make
make install
```

bash_profileにnginxのパスを通す。

```bash:bash_profile
vi ~/.bash_profile
export PATH=$PATH:/usr/local/nginx/sbin
source ~/.bash_profile
```

5.`nginx -V`でバージョン確認
6.下記URLよりRedHat用のinitスクリプトを取得し、/ete/init.d/nginxファイルとして保存する(実行権限を付与すること)
https://www.nginx.com/resources/wiki/start/topics/examples/initscripts/
7.起動・終了

```bash
# 起動
nginx
ps -ef | grep [n]ginx # プロセスの確認

# 終了
nginx -s stop

# 再起動
nginx -s reload
```
webブラウザでlocalhostにアクセスし、Welcome to nginx! の確認用ページが表示されれば成功。

## 備忘
デフォルトのルートディレクトリは下記
`/usr/local/nginx/html`

デフォルトルート配下のファイルインデックスを表示させる設定

```bash:/usr/local/nginx/conf/nginx.conf

# conf内の下記記述部分のautoindex on; を追記すればよい

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
            autoindex on; # この記述を追加する
        }
```
Scala + Akka + Raspiでで入退室管理をつくった話。

すいません、ScalaJSについて書こうと思ったが、案外情報がまだまとまってないので、以前やった仕事のことについて書きます。これは、Scala関西でも話した内容と重複します。

# 入退室管理アプリケーションについて

仕事で、生徒への入退室管理アプリケーションをつくりました。機能としては、ざっくり

* QRコードをかざして入退室
* 入退室確認したら、保護者等にメール配信
* 入退室ログ管理
* 簡易的な会員管理
* Slack通知
* 遅刻などの「まだ来てないです」通知
* QRコード発行

# 構成

ざっくり構成を。

<img width="839" alt="スクリーンショット 2017-12-24 12.14.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/31381/94dcb54c-dcc3-c628-5887-be4201371b27.png">

ボタンは起動やらを知らせるやつですね、超音波センサーを近づけて、カメラを起動させます、んで、QRを認識して、それと時間を見て、やります。スピーカーは、案内ですね。

# Raspberry PiでAkka動かす話

ぶっちゃけ、これ、とりあえず、Raspberry PiでAkkaを動かす試みをまずしていました。たまたまなんか動いたんで、入退室管理をつくったって感じすね。ほぼ、遊び感覚でつくりました。

僕一人関わったのが僕ひとりで、開発期間的にはのんびりやって、1ヶ月ぐらい。まーちゃっちゃと実装してみました。

Raspberry Piを動かすといっても、そのままRaspberry PiにScalaの環境を入れるわけではなく、開発マシンでscalaを書いてコンパイルしてjarにして、そのjavaを入れたRaspberry Piにjarを入れて動かしました。

また、Raspberry Piは複数台動かしてます。全部おなじプログラムを入れてます。SDカードに同じものを入れてます。

## 通信の仕組み

### ネットワークについて

Raspi同士は通信してます。なのでAkka Remoteを入れました。ローカルネットワークでつなぐので、NAT越える必要がないです。なんで、IoTではないですね(笑)。LoTです。

まぁ、こんど、遊びでNatを越えるようにしても良いですが、面倒なんでやってないです。

あと、Akka Remoteですが、Stableなバージョンじゃなくて、Remoting (codename Artery)の方をつかいました。(https://doc.akka.io/docs/akka/current/remoting-artery.html)

###  メッセージの設計について

さて、今回はwebカメラでQRの判定をしていますが、実は、監視カメラっぽい機能もつけたかった為、Webカメラの画像もメッセージとして投げることにしました。

メッセージのサイズがそれなりに大きくなりますので、そのように適当な設定にしました。

```
akka {
  actor {
    provider = remote
  }
  remote {
    large-message-destinations = ["/user/techin/codeReader/camera"]
    advanced {
      maximum-large-frame-size = 4MiB
    }
 }
}
```

こんな感じの設定しました。

そして、実際にカメラ画像もRaspberry Piの方で圧縮して送受信しています。

## メールについて

そういえば、メールはGmailのAPIをぶったたいて送信しています。

それ以外特筆することがないですね。もし希望があれば、別に記事をかこうかな。

## データ永続化(Akka Persistence)

Akkaにはデータ永続化の仕組みがありまして、Akka Persitenceというのがあります。Actorの状態を保存できるやつです。(https://doc.akka.io/docs/akka/current/persistence.html) 

ドキュメントを読んでいただけたら、だいたい分かると思いますが、簡単に言えば、メッセージのログを記録し続けて、再起動時に、メッセージのログを辿って、元の状態に復元する機能です。

### Akka PersitenceのPluginをつくる

Akka Persitenceは仕組みとしてLevel DBを利用しますが、インストールできないらしいので、別のDBを利用して、Pluginを別に実装しました。

その辺は、記事にしようと思いましたが他の方がなんかやっているので、リンクを乗せておきます。

https://gist.github.com/okumin/b591d2bd54470a067349

わりと簡単につくれます。

## GUIとAkkaの連携

さて、もろもろ設定したり管理するんで、ScalaFXを利用して、GUIをつくって、Akkaと連携をしています。

この辺がちょっと案外大変だったかなと。というのも、どうやってAkkaのアクターと、メインのGUIのスレッドを通信しようかって問題があました。まぁー、akkaのaskをつかいまくった感じです。

この辺は、Akkaのメッセージではなくて、別の方法で、UIと通信するべきかなぁとか考えました。うーむ。

## 複数台協調するための考えたこと

そういえば、うーむ、一番やっててたのしかったのが、複数台分散して動いてるので、そのへんの仕組みをかんがえることですね。

どうやって、生徒間の情報を共有するとかそのへんを考えてました。ぶっこわれたときどうするかとか。これだけで大分記事が書けます。

## 監視

そういえば、複数台管理するので、Raspberry Pi自体も監視する必要があったのですが、テキトーにやりました。(おぼえてない。)

## やってみて感想

Erlangでもアクターをつかったことがあるんですが、アクターで実装すると、まず感じるのは、雑に実装しても動くってのがいいなぁって感じるんですよね。

みなさんもたのしいので、ぜひやってみてくださればいいかなと。

あと稼動して、半年ぐらい立つのですが、結構壊れないものですね。すぐ壊れるかと思いましたが。

おわり。
Google Cloud Launcherを使ってGCP上に2～3分でJenkinsを構築する

### Google Cloud Launcherとは
事前登録されている150以上ものソフトウェアパッケージを数回のクリック操作でGCE上に構築できます。そのため、Compute Engine、Cloud Storage等のサービスに慣れていない場合でも、なじみのあるソフトウェアパッケージを簡単に使い始めることが可能となります。本記事ではJenkinsを例に挙げますが、その他にも事前登録されている代表的なソフトウェアパッケージには以下のようなものがあります。

* [Nginx](https://console.cloud.google.com/launcher/details/bitnami-launchpad/nginxstack?filter=category:developer-tools&q=NGINX&project=crafty-granite-185009&hl=ja)
* [Redmine](https://console.cloud.google.com/launcher/details/bitnami-launchpad/redmine?filter=category:developer-tools&q=Redmine&project=crafty-granite-185009&hl=ja)
* [GitLab Community Edition](https://console.cloud.google.com/launcher/details/gitlab-public/gitlab-community-edition?filter=category:developer-tools&project=crafty-granite-185009&hl=ja)
* [New Relic](https://console.cloud.google.com/launcher/details/newrelic-saas/new-relic?q=New&id=5b9a56fe-5e2f-431e-84a6-051f673a2cda&project=crafty-granite-185009&hl=ja)
* [Solr](https://console.cloud.google.com/launcher/details/click-to-deploy-images/solr?filter=category:developer-tools&project=crafty-granite-185009&hl=ja)

全てのソフトウェアパッケージは以下から探すことができます。
[Google Cloud Launcher](https://console.cloud.google.com/launcher?project=crafty-granite-185009&hl=ja)

### Jenkinsを構築する

[Google Cloud Launcher](https://console.cloud.google.com/launcher?project=crafty-granite-185009&hl=ja)からJenkinsを検索します。ここでは、「Jenkins Certified by Bitnami」を選択します。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/23101/a9146e8f-2d93-25a3-076e-378721a639fc.png)

「COMPUTE ENGINE上で起動」をクリックします。
![キsャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/23101/d40fd404-843f-f3c2-ef2c-2496b6141915.png)

もろもろ設定して、下の方にある「デプロイ」ボタンをクリックします。
![キャプaaaチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/23101/25176b88-7083-599d-c8ad-ed358eb80758.png)

しばらく待つと、デプロイが完了します。URLやログインID、PWを確認してログインしてみます。
![キャプチャss.PNG](https://qiita-image-store.s3.amazonaws.com/0/23101/511f2862-b368-eb30-5919-de702bb38f9a.png)

無事ログインできましたね。
![キャasasaプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/23101/ed6966d6-f2f5-b8c3-0519-ee7dd76bf3af.png)

ここまでで、ものの2～3分だったかと思います。

他にも、Kubernetes Engineを利用したJenkinsの構築方法もありますが、ここでは割愛します。詳細は以下です。
[Kubernetes EngineでのJenkins](https://cloud.google.com/solutions/jenkins-on-container-engine?hl=ja)

### 構築したソフトウェアの管理
本記事ではJenkinsを構築しましたが、構築したソフトウェアは「Deployment Manager」にて管理することができます。
![キャプチャsssss.PNG](https://qiita-image-store.s3.amazonaws.com/0/23101/c58f056b-83ed-b0e6-af9f-bd18566502eb.png)


以上です。

### 参考
[Google Cloud Launcher](https://cloud.google.com/launcher/?hl=ja)
VS Code ユーザー設定 （自分向け備忘録）

#何がしたいか
VS Codeの便利なユーザー設定について自分向けのメモとして
拡張機能についても記録しておきたい

WSLをインストールしたので、TerminalにはWSLのほうを指定

#ユーザー設定内容（適宜追記）
```js
{
  "window.zoomLevel": -1,
  "terminal.integrated.shell.windows": "C:\\WINDOWS\\System32\\bash.exe",
  "editor.tabSize": 2,
  "files.eol": "\n",
  "files.trimTrailingWhitespace": true,
  "html.format.enable": true,
  "emmet.includeLanguages": {
    "javascript": "javascriptreact"
  },
  "emmet.syntaxProfiles": {
    "html": {
      "attr_quotes": "single"
    }
  },
  "prettier.trailingComma": "es5"
}
```

#ユーザー設定について補足
**js ファイルでも jsx のように emmet できる**

```js
  "emmet.includeLanguages": {
    "javascript": "javascriptreact"
  },
```

**html ファイルで、`<input type="text">` みたいなのが `<input type='text'>`になる**

```js
  "emmet.syntaxProfiles": {
    "html": {
      "attr_quotes": "single"
    }
  }
```

#拡張機能
自宅用PCにはいまのところ以下のものを入れている（試しているものも含めて）

- Debbuger for Chrome
- ESLint
- Prettier - Code formatter


#参考URLなど
日本語に翻訳してくれています。助かります。。。
https://vscode-doc-jp.github.io/docs/userguide/emmet.html

https://prettier.io/docs/en/options.html
Hello Worldでプログラマをダウジング(見極める)

Hello Worldだけでプログラマの適正、実力を見極めたいズボラな人のためのダウジング方法です。

(ネタ半分、本音半分です)

# 確認方法

相手に対して「正しくHello Worldと出力するプログラムを書いて実行してください」とお願いしてプログラムを書いてもらってください。おそらく以下のような結果になります。

1. :neutral_face: 普通に書く人
1. :joy: 書けない人 
1. :smiley:「正しく」という定義を確認してから書く人
1. :sunglasses: 関数、デザインパターン、テストケース、ログ出力などを駆使する人
1. :heart_eyes: "Hello, world!" と書く人

基本的にパターンNo.1が大半ですが、No.2以降の結果となった場合は有益な情報となります。

# 結果パターン

## 1. 普通に書く人

残念ながら何も確認できません。

## 2. 書けない人

ほぼ間違いなく駄目プログラマです。

3年以上の開発経験者としてプロジェクトに参加しているにも関わらず、これに該当する人がたまにいます。

## 3. 「正しく」という定義を確認してから書く人

何を作るべきかを意識し、考えながら仕事をこなす人である可能性が高いです。
プログラマだけではなくシステムエンジニアにも向いてそうです。

聞かなくても「正しいとは～という定義です」みたいにコメントで定義を明確にしている人もこのカテゴリに入る可能性が高いです。(もちろん直ちに聞く方がいいですが)

## 4. 関数、デザインパターン、テストケース、ログ出力などを駆使する人

技術好き、色々チャレンジしたがる可能性が高いです。
勝手に余計な処理を書いてる時点で諸刃の剣的な人材ですが、ちゃんと導くことができれば超有能な人材に化ける可能性が高いです。
 
## 5. "Hello, world!" と書く人

英語力に長けており、正確かつ厳密に仕事をこなしてくれる可能性が高いです。個人的にこれが一番好きですが、今まで実際に会ったことはありません。

ポイントはHelloの後ろにカンマが入っているかどうかです。

```python
# 正しい (最後はピリオドでもOK)
print("Hello, world!")

# 誤っている
print("hello world!")
```

ただし、何故そのように書いたかを説明できない場合は、何も考えずにカンマをつけた可能性が高くこのカテゴリには当てはまりません

- カンマがなければ、Helloが間投詞ではなく動詞になってしまう。
  - 例えば `"Let's eat, grandma!"` だと「(ごはんを)食べようよ、おばあちゃん!」になりますが、`"Let's eat grandma!"` だと「おばあちゃんを食べよう!」になります。


# コーディング中のチェックポイント

Hello Worldという短いコーディング、プログラム実行する中でもチェックできることは色々とあります。短いコーディングだからこそ真剣に観察してみましょう。以下のようなGOOD/BADポイントを見つけることができます。(ものすごい主観が入ってます)

GOOD

- タイピングがとても高速、あるいはとても滑らか
- コマンド、IDEの扱いに慣れている
- キーボードのショートカットを使いこなす

BAD

- ブラインドタッチができない、またはタイピングがぎこちない
- 最後のEnterだけやたら大げさに打つ、Enterを連射する
- マウスばかり使う
- 作業中に色々なウィンドウを動かして、デスクトップ上のアイコンを探す
- 英単語のスペルでひっかかる

特に経験者、即戦力プログラマとして期待されるような派遣社員で、BADポイントが目立つ場合は要注意です。たくさんのコーディング経験を積んできてBADポイントを改善できないのは、よほど他の能力に長けているか、これまで何も学んでいない駄目プログラマであるかのどちらかです。(そして後者である可能性が高い)
効率的なモデリングをマネージメントする その３ - 開発標準を素直に実施しない -

## はじめに
まじめにやっているのにうまくいかない。標準なんだからその通りにやればいいじゃないか。そう思われるかも知れません。

しかし開発標準で守らないといけないことには幅があり、それなりの自由度があります。きちんと理解した上で適切にモデリングすれば、効率的なモデリングが可能になります。

## 開発標準

開発標準は成功したプロジェクトを参考に、良いプロセスの実施が容易な様に、実施すべき各作業とその確認方法を定めたものです。開発者を支援して、一定のレベルへの底上げや組織的な改善を可能にします（その反面、さまざまな罠もあります。[標準は諸刃の剣](http://sakaba.cocolog-nifty.com/sakaba/2017/10/post-1fd9.html)）。

モデリングをする際にも、ある時はガイドやノウハウ集として使えますが、時には収集したデータの正常範囲を定めるなど、モデリングや実装の作業を制限します。

## 開発標準を良く読む

大切なのは開発標準を良く読むことです。開発標準には以下のようなことが書かれていると思います。

- 全体の構成と考え方（ガイド）
- 守らないといけないルール（制約）
- 一般的な方法（ガイド）

ガイドに当たる部分はうまくいったプロジェクトで行われた一般的な開発の方法や作業が書かれています。制約に当たる部分は守らないといけないルールで、作業だけでなく何らかのメトリクス（尺度）が定められているでしょう。作業のエビデンス（照査）となるデータの収集が必要です。レビューやテストの項目数や時間など一定の量が必要になり、作業が制約を受けるでしょう。

開発標準には多くの役立つことや勉強になることが書かれていますが、必要なことが全て書かれている訳ではありません。書かれていることに従って、それだけをコツコツ実施しても、必ずしもうまくいくとは限りません。

リスクが工数に見合うだけ低減するなら、下記のようなモデリング作業の変更が必要になります（同程度でも実施します）。
<dl>
  <dt>増やす</dt>
  <dd>
      必要なモデリングを追加します。多くの場合、設計作業の追加はあまり禁止されていません。
  </dd>
  <dt>前倒し</dt>
  <dd>
     よりリスクが低減するなら後工程の作業を前倒しします。一部詳細化したり、プロトタイピングの実施など、本格的な実装でなければ許容されるでしょう。
  </dd>
  <dt>分解</dt>
  <dd>
       モデリング作業を分解し、調査、整理、考えるといった作業を前倒しします。会議内で（モブ）モデリングしても良いでしょう。
  </dd>
</dl>
大切なのは、予め計画してステークホルダーと合意を得ておくことです。また、開発中であっても必要が生じたら、面倒がらずに計画を変更することも重要です。
前回の「[効率的なモデリングをマネージメントする その２ - モデリングの戦略 -]
(https://qiita.com/sakaba37/items/8af070de9b6d8505ce7d)」を参考にしてください。

## 逆らっても徒労に終わることが多い
若気の至りで開発標準に抗議したこともありますが、逆らっても徒労に終わることが多いです。開発標準は必要な作業の抜けを防ぐ目的で組織として決めたものです。個別のプロジェクトに対してテーラリング以外の変更を要求しても、許容する権限が担当者にありません。

逆に制約だけを守れば、意外と自由度があるものです。ガイドを読んでしっかり活用することで得られることも多いでしょう。

とはいえ、どのような標準も使っていれば時代遅れになるもので、改善案は提案してください。パイロットプロジェクトで確認することも必要ですので、改訂には複数年かかるでしょう。

## 開発標準のフィールドで走り回れ
多くの競技にはコートのような活動領域が決められていて、競技者はその範囲を有効に使いながら、敵を攻略します。

開発標準は縦にだけ動けるサッカーゲームの様に、典型的ないわば「型」を示したものです。定められたフィールドからはみ出さない程度に、右に左にゴールに向けて戦略的に攻撃ください。

## おわりに
効率的なモデリングをマネージメントする方法を3回に分けて説明しました。以前はうまく開発できていた人が、プロジェクトが変わると急にトラブルに巻き込まれる。そんな姿を見たくありません。

開発標準と改善活動はフィットするプロジェクトにはとても効果的です。しかし、それぞれの作業がなぜ必要なのかをきちんと理解しなければ、典型的なプロジェクト以外に応用がききません。

何が制約であり、なぜそのようにするかを理解すれば、開発標準を味方につけられます。そして、自由なフィールドを手に入れて様々な実施方法ととることができます。

釣りは「ぼーっ」としていては釣果が出ないそうです。常に「ああかな」「こうかな」と状況を見極めて必要な行動が必要だそうです。ソフトウェア開発でもいつもリスクを見極めてダイナミックに適切な対応をとることが、リスクと戦う効率的な方法だと思います。

---
「だから、あなたがたは気をつけていなさい。」マルコによる福音書/ 13章 23節（日本聖書協会 新共同訳）
自然非言語処理第１６日目： 非言語処理による「心の理論」の一部実装（応用編）

![ABB6F898-FFEC-4C0E-B2A9-F2B8B344FE34.jpeg](https://qiita-image-store.s3.amazonaws.com/0/78052/28a52dbe-21aa-2077-7ac9-b95c17ccaf22.jpeg)

**本ページの内容は、次の記事に置き換えられました**
["これ"はなんですか、コンピュータさん？ -「心を読むシステム」の実装-](https://qiita.com/alfredplpl/items/81d6e56a48323dadec6d)

# 「心の理論」によるコミュニケーション

家族とご飯を食べていると、醤油が手に届かなくて困ることがよくありますよね。そういう場合は大体醤油の方を見て、「それとって」と家族にお願いするという場面は誰にでも出くわしたことがあります。

よくよく考えてみれば、これは不思議なことです。もし、「それとって」を自然言語処理させたら、それってなんだよという答えが返ってくるでしょう。

人は視線や指さしを使ったりして自分の意図を他人に伝えることがあります。この意図を汲み取る能力を「心の理論」と言います。そのメカニズムは**現代の科学では未だによくわかっていません**。ですが、部分的にわかって来ていることもあります。

今回は「心の理論」のメカニズムと、「それとって」を機械に実装してみましょう。

# 「心の理論」のメカニズム
心の理論とは、他人が持つ目的や意図、信念、振舞、選好などを予想する人間や類人猿が持つ機能のことです。前回話した発達障害者の人はこの心の理論が弱まっているか、そもそも物理的にないとされています。
心の理論を説明するモデルの一つにサイモン・バロン＝コーエンが提案する「心を読むシステム」があります。このモデルでは他者の心を理解するために、意図検出器、視線検出器、注意共有の機構、心の理論の機構の4つから構成されるシステムが脳内にあるとしています。この「心を読むシステム」を見える化したものが図1になります。
「心を読むシステム」についてもう少し深掘りしていきましょう。システム内にある意図検出器とは、自身で動けるものがこちらに向かってくることを判別する機能のことです。意図があってこっちに近づいているかということでしょうね。視線検出器は視線をこちらへ向いているか調べるための機能です。つまり、こちらに注意を向けていないか確認しているわけですね。注意共有の機構とは、自分の注意と相手の注意を共有し、相手に自分の注意している第三者のものに向けさせる、あるいは向く機能のことです。多くの場合では共同注意と言います。アイコンタクトと目配りで実現することが多いです。他にも指さし(ポインティング)で注意を向けさせることもあります。最後の心の理論の機構ですが、目的や意図などを理解する機構と、**もう俺にはわからん。あとは任せた**と言わんばかりの機構です。
とにかくコーエンが言いたかったのは、意図検出器、視線検出器、共同注意が心の理論のキーパーツになるんだよってことでしょう。

<img width="416" alt="D7D0E6C3-073A-40FB-8B1F-220D6B7C73E6.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/78052/76b56c01-73ce-2935-1005-2b7c16ad2baa.jpeg">
図1 「心を読むシステム」の図。IDは意図検出器、EDDは視線検出器、SAMは注意共有の機構、ToMMは心の理論の機構。([2]より引用)

# 「心を読むシステム」を参考にして作る心の理論のアルゴリズム
それではもっと実装寄りの話に行きましょう。
バロン・コーエンさんは意図検出器、視線検出器、共同注意が大切だよと言いました。
もし、これを最初の醤油を取ってもらうシーンで当てはめてみるとどうなるでしょう。
まず、意図検出器としては、人間が動くかどうかが重要となってきます。別に動かなければ、特に用もないですしね。次に視線検出器として、機械側を向いているかが鍵になります。これは視線計測器を使えば簡単に実装できるでしょう。次に共同注意ですが、人間の視線に合わせて機械の視線を動かす必要があります。最後に心の理論として、視線が止まっている状態で「それ」などの代名詞がでたら、相手は視線の先の物体をそれと言っていると判断する必要があるでしょう。

以上をまとめると醤油を取るための心の理論は数理モデルにすると以下の通りとなります。

```math
(時間があったらね！)
```

基本的には検出器をカスケード接続します。機械学習に詳しい人は顔検出時のAdaboostみたいな構造になります。
また、機械の例としては、視線が表示できるバーチャルエージェントが好ましいでしょう。

# 実装： 共同注意を通じた代名詞による機械への行動命令
それではユニティちゃんに醤油を取って来てもらいましょう。


## 材料
開発用PC(Win) 1
視線計測器THEEYETRIVE 1
醤油を受け取るためのLeap 1
Visual Studio Community 1
Unity 1

## ソースコード
**時間の都合により後回し**

## 実験結果

## 感想

# まとめ
今回は発達障害からの心の理論の実装について説明しました。
もし、発達障害が薬学で解決できないならば、心の理論を実装した機械に手伝ってもらうことで解決するという手もありだと思います。
次回はそもそも人間と機械を統一できる見方とはないのだろうかと模索していきます。

#参考文献
[1] Premack, D. G., Woodruff, G. (1978). Does the chimpanzee have a theory of mind?. Behavioral and Brain Sciences 1 (4): 515–526.
[2] <心の理論>研究の展望 https://www.jstage.jst.go.jp/article/jjpsy1926/68/1/68_1_51/_pdf
Redmine のプロジェクトを GitLab Issues へ移行する (GitLab Advent Calendar)

Qiita のひとつの記事を複数の Advent Calendar に登録できないのですねー。
事前にドキュメントは調べてみたのですが、そういう記述が見つからず、やむなく当日 (を遅刻して遥か過ぎた今日) やってみたら
`指定された記事は既に他のカレンダーに紐付けられています。`
って叱られてしまいました。
今更もうひとつ記事を作ることもできず、もしかしたら御法度かもしれませんが、今年はこれで許してください、Qiita さま。来年はふたつ書きますー。

[Redmine のプロジェクトを GitLab Issues へ移行する](https://qiita.com/jeffi7/items/75834ca22b9ddf473ed1)
Rubyの環境には2種類の状態しかない。

# **壊れているか、これから壊れるかだ。**

というわけでいつの間にか、gemを実行すると以下のエラーが出るようになってしまった。

```bash
hichon-no-MacBook-Pro:~ hichon$ gem list
/usr/local/Cellar/ruby/2.4.3_1/lib/ruby/2.4.0/yaml.rb:5:in `<top (required)>':
It seems your ruby installation is missing psych (for YAML output).
To eliminate this warning, please install libyaml and reinstall your ruby.
/usr/local/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require': dlopen(/usr/local/lib/ruby/gems/2.4.0/gems/psych-2.2.4/lib/psych.bundle, 9): Library not loaded: /usr/local/opt/ruby/lib/libruby.2.4.1.dylib (LoadError)
  Referenced from: /usr/local/lib/ruby/gems/2.4.0/gems/psych-2.2.4/lib/psych.bundle
  Reason: image not found - /usr/local/lib/ruby/gems/2.4.0/gems/psych-2.2.4/lib/psych.bundle
    from /usr/local/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /usr/local/lib/ruby/gems/2.4.0/gems/psych-2.2.4/lib/psych.rb:8:in `<top (required)>'
    from /usr/local/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /usr/local/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /usr/local/Cellar/ruby/2.4.3_1/lib/ruby/2.4.0/yaml.rb:6:in `<top (required)>'
    from /usr/local/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /usr/local/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /usr/local/lib/ruby/site_ruby/2.4.0/rubygems.rb:701:in `load_yaml'
    from /usr/local/lib/ruby/site_ruby/2.4.0/rubygems/config_file.rb:340:in `load_file'
    from /usr/local/lib/ruby/site_ruby/2.4.0/rubygems/config_file.rb:202:in `initialize'
    from /usr/local/lib/ruby/site_ruby/2.4.0/rubygems/gem_runner.rb:75:in `new'
    from /usr/local/lib/ruby/site_ruby/2.4.0/rubygems/gem_runner.rb:75:in `do_configuration'
    from /usr/local/lib/ruby/site_ruby/2.4.0/rubygems/gem_runner.rb:40:in `run'
    from /usr/local/bin/gem:21:in `<main>'
```

# 復旧方法

問題のファイルを手動で削除して、該当のパッケージを再インストールして復旧した。

```bash
$ rm /usr/local/lib/ruby/gems/2.4.0/gems/psych-2.2.4/lib/psych.bundle
$ gem uninstall psych
$ gem install psych
```
[Rails]STIから脱却してCTIでポリモーフィックを実現する

[Ruby on Rails Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ruby_on_rails)の24日目の記事です。

SQLアンチパターンやPofEAAで「オブジェクト指向設計で抽出されたスーパークラス・サブクラスから成る継承階層をリレーショナルデータベースのテーブルとして実装するためのパターン」として具象テーブル継承、クラステーブル継承、単一テーブル継承(STI)の3つが紹介されています。
[みんなRailsのSTIを誤解してないか!?](https://qiita.com/yebihara/items/9ecb838893ad99be0561)

その中でRailsはSTIはサポートされてますが、その他2つは自分で頑張ってポリモーフィックを実現しないといけないです。

STIを使わない理由としては

* NULLを許容したくない
* UpdateではなくInsertでデータ保存のフローを作りたい
* has_manyなデータはSTIだとjson型などスキーマレスになる

あたりでしょうか。
今回はクラステーブル継承を実現する方法を書きます。データベースはMySQLを使うので、クラステーブル継承をデータベースがサポートしてない前提です。

## migration
```ruby:migrate/create_customers.rb
class CreateCustomers < ActiveRecord::Migration[5.1]
  def change
    create_table :customers do |t|
      t.integer :type, null: false
      t.string :code, null: false
      t.string :name, null: false

      t.timestamps
    end
  end
end
```

```ruby:migrate/create_persons.rb
class CreatePersons < ActiveRecord::Migration[5.1]
  def change
    create_table :persons do |t|
      t.belongs_to :customer, foreign_key: true, null: false
      t.string :real_name, null: false

      t.timestamps
    end
    add_index :persons, :customer_id, unique: true
  end
end
```

```ruby:migrate/create_corporations.rb
class CreateCorporations < ActiveRecord::Migration[5.1]
  def change
    create_table :corporations do |t|
      t.belongs_to :customer, foreign_key: true, null: false
      t.integer :corporate_number, null: false

      t.timestamps
    end
    add_index :corporations, :customer_id, unique: true
  end
end
```

MySQLはクラステーブル継承をサポートしてないので、customerにtypeをサブクラスのテーブルにcusotmerへのリレーションを貼ります。

## モデル

```ruby:models/customer.rb
class Customer < ApplicationRecord
  has_one :person
  has_one :corporation

  enum type: %i[person corporation]

  def do_somthing
    raise "must be override"
  end

  def cast
    self.becomes("#{self.class.to_s.pluralize}::#{type.camelcase}".constantize)
  end
end
```

```ruby:models/person.rb
class Person < ApplicationRecord
  belongs_to :customer
end
```

```ruby:models/corporation.rb
class Corporation < ApplicationRecord
  belongs_to :customer
end
```

```ruby:models/customers/person.rb
module Customers
  class Person < Customer
    def do_somthing
      # do anything
    end
  end
end
```

```ruby:models/customers/corporation.rb
module Customers
  class Corporation < Customer
    def do_somthing
      # do anything
    end
  end
end
```

castでmodels/customers/**.rbに変えています。

```
Customer.find(id).cast.do_somthing
```

でポリモーフィックを実現してます。

## その他

* 委譲するのもあり。その場合はファクトリクラスとmessages/\*\*.rbをactive recordではない別のクラスとして定義すれば良い。messages/\*\*.rbもmodelsにおく必要はないかも。
* createする時はCustomer.create_all!などを作って、まずcusotmerを作成、その後にcastしてcreate_sub!みたいな形で作ってますが、もうちょいいいネーミングで作りたい。。
StackStorm Pack 開発・運用に関する Q&A

　先月 28 日から今月 1 日まで開催された [Internet Week 2017](https://www.nic.ad.jp/iw2017/) で「[運用自動化ハンズオン ～StackStormで実践するインフラ運用革命～](https://www.nic.ad.jp/iw2017/program/h3/)」セッションをやらせていただき、おかげさまで大変好評をいただきました。

　こちらのセッションを企画してくださいましたプログラム委員の方々、登壇を引き受けてくださった講師陣の皆さん、準備段階から当日までお手伝いくださった TA の皆さん、そして当日ご来場くださいました皆様に改めて感謝申し上げます。

　この記事では当日のセッションで StackStorm の [Pack](https://docs.stackstorm.com/packs.html) 開発についていただいた質問について、改めて回答させていただきます。

---

**Q. 作成したルールや、自作のアクション、ワークフローなど、テスト環境の準備は何か工夫していますか？**

**A.**
　基本的に、自分が作成した [アクション](https://docs.stackstorm.com/actions.html)、及び [センサ](https://docs.stackstorm.com/sensors.html#sensors) については機能テストを書くようにしています。
　StackStorm のパッケージ管理システム [StackStorm Exchange](https://exchange.stackstorm.org/) に登録されている Pack の多くでも単体機能テストが備わっています。
　StackStorm はこれらの [テストフレームワーク](https://docs.stackstorm.com/development/pack_testing.html) を提供していますので、開発者はアクション、及びセンサの機能テストをラクに記述できます。

---

**Q. テストの自動化はどうしていますか？**
**A.**
　これも StackStorm が提供してくれている CI のフレームワークを利用しています。

　StackStorm の自動テストの実行環境を自前で用意しようとすると、テストの実行環境を構築するための CI スクリプトでやらなければならないことが多々 (テスト実行用の StackStorm の構築、Pack の実行環境の構築、テストの実行などなど) ありとても面倒ですが、StackStorm は自動テストについても上記の面倒な作業を [パッケージ化](https://github.com/StackStorm-Exchange/ci) してくれています。
　ユーザはこちらの [circle.yml のサンプル](https://github.com/StackStorm-Exchange/ci/blob/master/.circle/circle.yml.sample) をリポジトリにコピー＆リネームするだけで、[Circle CI](https://circleci.com/) が StackStorm Pack の自動テストを正しく行ってくれます。

---

**Q. 個別packはどういう単位で作成すると運用しやすい等のノウハウはありますか？**

**A.**
　[StackStorm 公式マニュアル](https://docs.stackstorm.com/packs.html) では、Pack を以下の 2 種類に分類しています。

| 種類 | 管理目的 |
|:----:|:---:|
| Integration Pack | システム毎に管理される Pack |
| Automation Pack | 運用用途毎に管理される Pack |

　`Integration Pack` は [AWS](https://github.com/StackStorm-Exchange/stackstorm-aws) や [RabbitMQ](https://github.com/StackStorm-Exchange/stackstorm-rabbitmq), [Zabbix](https://github.com/StackStorm-Exchange/stackstorm-zabbix) など、StackStorm が外部システムに対する操作・イベントハンドリングを行うための Pack で、通常システム毎に別々の Pack として管理されます。[StackStorm Exchange](https://exchange.stackstorm.org/) で管理されている Pack は全てこの `Integration Pack` になります。

　対して `Automation Pack` は、特定の運用目的 (e.g. Zabbix からのアラートに起因するサーバホスト障害の一次対応) 毎に [ワークフロー](https://docs.stackstorm.com/workflows.html) や [ルール](https://docs.stackstorm.com/rules.html) などがまとめられます。`Integration Pack` と違い、ワークフローやルールには複数のシステムに跨るアクション、[トリガ](https://docs.stackstorm.com/sensors.html#triggers) が記述される場合もあります。

　これら 2 つのどちらに分類されるかを意識して、Pack の管理単位を決められると良いと思います。また StackStorm Exchange に登録されていない `IntegrationPack` を開発された場合は、ぜひ [StackStorm Exchange Incubator](https://github.com/StackStorm-Exchange/exchange-incubator) にご報告ください (レビューをパスすれば StackStorm Exchange に登録されます)。

---
　いかがでしたでしょうか。上記内容が少しでも開発のお役に立てたならば幸いです。
　もしこの他に質問したいことや言いたいこと、ドヤりたいことなどがありましたら [StackStorm 公式 Slack WorkSpace](https://stackstorm.com/community-signup) に、日本語チャンネル #community-japan が開設されましたので、ぜひご参加ください。

　最後に、[前日のアドベントカレンダー記事](https://qiita.com/shusugmt/items/18b5f4e44c720aae47ae) の著者 [杉本さん](https://qiita.com/shusugmt) と私が StackStorm Community Leader として [紹介されました](https://stackstorm.com/case-study-dmm/) (・`ω・)ﾄﾞﾔｧ
MainframerでAndroidアプリのビルドを爆速化する

Androidアプリのビルド、遅くて重くて、辛いですよね？
ビルド中に、ブラウジングなり、Twitterなりをすれば良いんですが、マシンが重くてまともに見れないときもあります。ラップトップのバッテリー消費も激しいですよね。

長い間、Androidアプリのビルド高速化については議論されており、様々な解決法がありますが、今回は高性能なリモートマシンを用いる方法でこれらの問題を解決します。
一見、リモートビルドは面倒な印象があると思いますが、今回はMainframerというツールとそのプラグインを用いることでサクッと仕組みを構築していきたいと思います。

[Mainframer](https://github.com/gojuno/mainframer)とは、リモートマシンビルドをサポートするツールのことです。ファイルの同期、ビルドコマンドの実行、生成物の転送を自動で行ってくれます。このツールがGradleに対応していて、Androidのビルドに使うことができるので、今回はこれを用います。

Mainframe、皮肉なことに時代は繰り返していくのでしょうか。

## リモートマシンの準備
まず、ローカルマシンよりも高性能なリモートマシンを用意します。
自宅、学校、会社のマシンか、EC2やGCEを用いても良いでしょう。

マシンの用意ができたら、Androidアプリのビルドができるよう下準備を行いましょう。
基本的に必要なのはJDK8のインストール、Android SDKの設定(インストール、ライセンス承諾、環境変数`ANDROID_HOME`の設定)です。
ここでは説明を省きますが、Androidアプリのビルド用Dockerfile作成の記事などを参考にすると良いと思います。
[DockerでAndroidアプリをビルドする](https://qiita.com/sekitaka_1214/items/edee7d12f1fd630992b3)

少し引っかかってしまったのですが、環境変数`ANDROID_HOME`をSSH経由の接続でも利用できるようにしておいてください。
[[FREEBSD][LINUX] SSH経由でコマンド実行すると環境変数を読まないでござる](http://april.fool.jp/blogs/2013/07/freebsdlinux-ssh%E7%B5%8C%E7%94%B1%E3%81%A7%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%A8%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%AA%AD%E3%81%BE%E3%81%AA/)

そして、SSH経由で公開鍵認証を用いてリモートマシンにアクセスできるように`~/.ssh/config`を設定してください。
また、configに以下の記述を加えることで、連続的な接続を高速化します。
```
ControlMaster auto
ControlPath ~/.ssh/mux-%r@%h:%p
ControlPersist 1h
```

## ローカルマシンの設定
リモートマシンの準備ができたので、次はローカルマシンの設定を行いましょう。

Mainframerの作者が利用を推奨している[Mainframer Integration](https://github.com/elpassion/mainframer-intellij-plugin)というプラグインを、Android Studioに導入します。
導入が完了したら`Ctrl+Shift+A`で表示されたダイアログで`Confugure Mainframer in Project`を選択します。

![Screenshot from 2017-12-24 12-10-43.png](https://qiita-image-store.s3.amazonaws.com/0/61075/113692c5-712e-091d-3e46-7ada2939b88e.png)

`Remote machine name`は先程`~/.ssh/config`で設定したリモートマシンのホスト名を入力します。
`Default build command`はリモートマシンで実行したいビルドコマンドを入力します。
基本的には`./gradlew assembleDebug`になると思いますが、`Build Variants`を切り替えたい場合は、タスク名を適宜置き換えてください。

![Screenshot from 2017-12-24 12-17-19.png](https://qiita-image-store.s3.amazonaws.com/0/61075/f0857c3d-693a-64b6-57f1-90fdc198701d.png)

入力が終われば、OKをクリックします。

再度、`Ctrl+Shift+A`でダイアログを表示させ、`Inject or restore Configuration`を選択します。

![Screenshot from 2017-12-24 12-24-59.png](https://qiita-image-store.s3.amazonaws.com/0/61075/13e821a9-d086-4771-147d-12224eb14982.png)

このダイアログにて、既存のConfigurationを変更します。
基本的に画像の通りにチェックすればいいでしょう。
![Screenshot from 2017-12-24 12-25-28.png](https://qiita-image-store.s3.amazonaws.com/0/61075/67e3643c-01a4-a986-bff0-2295183a43cc.png)

OKをクリックします。

## ビルド
さて、各種設定が終わったのでいつものようにビルドしてみましょう。
初回はSDKのダウンロード等があるので結構時間がかかります。
また、ツールバーに追加された`Turn Mainframer on/off`ボタンでリモートビルドするかローカルビルドするかスイッチすることができます。

## 結論
どうでしょうか。どれくらいビルドが高速化されましたか？
高速化というだけではなく、端末が重くならないというのも良いところですよね。
個人で使う分には贅沢ですが、GCEでそこそこのコア数のマシンを用いると、ビルド時間が圧倒的に短くなりますね！
みなさんも快適なビルド生活を送りましょう！
CloudWatchLogsAPIとfluent-plugin-s3を使ったLambdaログの保管と分析、可視化について

# はじめに

これは、[Sansan Advent Calendar 2017](https://adventar.org/calendars/2530)の24日目の記事です。

- CloudWatchLogsはログを時系列で絞込検索がしにくいとか、見にくいし使いにくいツールである
- 本番でLambdaの関数がxx 個以上動いており、障害発生時の調査にはCloudWatchLogsを頑張って使うしかない
- apexでログを見る方法もないわけではないが、ずっとtailするのは難しい
- CloudWatchLogsにずっと置いとくのもアレ
- CloudWatchLogs早くいい感じになって欲しい

ということですでにfluentdなどで収集しているアプリケーションログやアクセスログと同様にS3に保管し、Elasticsearchに乗せてKibanaで検索、分析できるようにしたかったのです。CloudWatchLogsAPIとfluent-plugin-s3を使ってLambdaログの保管と分析、可視化をできるようにしました。

## あきらめた案

fluent-plugin-cloudwatch-logsで収集しようともしていました。しかし、新たに生み出されるLogStreamの収集ができず、理由もよくわからず断念した。fluentdをpryで止めて結構デバッグしたものの、fluentd力もっとほしい…！となりました。
Lambdaのログは、CloudWatchLogsのLogGroup以下にLogStreamとしてつくられていくが、LogStreamに[$LATEST]というLambdaのバージョンプレフィックス的なやつが入るため、fluentdのbuffer_path設定と相性が悪かったです。(この仕様マジでやめてほしい。括弧とかドル記号とか入らないでほしい。)
また、50個以上のLogStreamsがある際に、このpluginではログを扱うArrayが予期せぬ入れ子構造になってしまっていたため修正しました。
どちらもマージされてはいるが、力不足によりこのプラグインでは収集を完遂できませんでした。

https://github.com/ryotarai/fluent-plugin-cloudwatch-logs/pull/80
https://github.com/ryotarai/fluent-plugin-cloudwatch-logs/pull/84


# 詳細な説明

## ピタゴラ装置

### Lambda

まずは、CloudWatchLogsのAPIを叩くためのLambdaをつくりました。Python3.6で実装しました。
このLambdaは、CloudWatchLogs.Client.create_export_taskを叩いています。
http://boto3.readthedocs.io/en/latest/reference/services/logs.html#CloudWatchLogs.Client.create_export_task

しかし、エクスポート対象にする期間の指定はコード上に置いておきたくありませんでした。(create_export_taskのfrom, toの指定)
そのため、前回実行時のタイムスタンプをS3上に置くようにし、これが無ければ現在からn時間分エクスポートし、あればfromにセットするという実装にしました。こうすることで、実行タイミングはCloudWatch EventsのRuleのみで与えられるようになります。

### Lambdaの周辺

fluent-plugin-s3では、S3からログを取り込むことができます。S3イベント通知でSQSに流しています。あとはわりと普通です。

## 図

![cloudwatchlogs-import-after.png](https://qiita-image-store.s3.amazonaws.com/0/10013/60ab7462-5963-c805-d1b7-87411443cda4.png)


# ちなみに
アレがこれであーなので、実はあと一歩のところで本番投入できていません。年内にはやっておきたいです。
現在の職場での特異的な話が絡むfluent-s3-plugin関連の設定についてなので、根底から覆るような話ではありません。もし同じような構成を考えている人がいたら安心してほしいです。

# 最後に

CloudWatchLogsが使いやすくなることや、Lambdaのログが自動的にS3へエクスポートし続ける設定がほしいです。LambdaのためにLambdaを作ることが減るといいなぁと思いますので、サンタさん(AWS)何卒よろしくお願いします。
コンピュータの動作原理（後書き）

後書き
====
改めて、なぜ二進数なのか…　考えるまでも無いでしょう。コンピュータは10進数に慣れてるわけでも、桁が多いと混乱するわけでもないので、数値を表すのに最もシンプルな二進数に落ち着くのは自然な結末です。
　※史上初のコンピュータといわれるENIACは十組の真空管のうちどれが1かで十進数を表す二値～十進コンピュータです。
　　コンピュータは最初から二値をあつかっていたわけです。ただし、二進数に発展するのはその後のEDSACになります。

プロセッサはGATEの組み合わせで色々な機能を実現しています。符号付き加算の結果オーバーフローフラグが立つ条件は、「加算する2つの数の符号が同じで、加算される数と結果の符号が違っていた時」です。i8086は256個のテーブルから1つ引いてくるXLATという命令がありました。イマドキのプロセッサコアは1サイクルあたり64ビット浮動少数演算を16個処理できます。
これらは「ナニカCPUの出来るコト」を組み合わせているのではなく、単純な論理GATEの組み合わせて出来ています。GATEの数は膨大ですが、基本的な作りは8ビットのAND演算と違っているわけではありません。

真理値表を回路に変換する方法には Look Up Table というのがあります。これはあり得る入力と出力の組み合わせの全てのパターンについて、1つの決まった方法を提供します。
「1の場合に注目」するやり方はPLDやCPLD、Look Up Tableを使ったやり方はFPGAと呼ばれるデバイスが採用しています。

参考文献は[i8080 Datasheet](http://qv80.cocolog-nifty.com/blog/files/1481550148_8080.pdf)、[MC6809 Datasheet](http://qv80.cocolog-nifty.com/blog/files/6809.zip)、[6502BlockDiagram](http://qv80.cocolog-nifty.com/blog/files/6502_block_diagram.jpg)を挙げておきます。
私は参考文献として「これ読んどけば大丈夫、全部書いてあるから」と言えるものにまだ出会っていません。NAND2Tetrisはトランジスタの組み合わせで回路を作る方法について書いてありません。回路設計とアーキテクチャやCPUの作り方系の本は実装になるとVHDLに行っちゃうか、74181使うかになるんですよね。

このシリーズは読んでもぴんと来ない所が多いでしょう。でもいつか、動作原理を調べる上で「あ、あそこに書いてあった」と思い出す場面があったらなと思います。そして最後に。

　コンピュータはスイッチのON/OFFの連鎖だけです。