OmniAICreator/Qiita-1.07M huggingface dataset:
GLBoostでメタセコイアモデルの表示

この記事は、[GLBoost Advent Calendar 2016](http://qiita.com/advent-calendar/2016/GLBoost) 12月10日の記事です。

#はじめに
3Dモデルも色々なフォーマットがありますが、最近はglTFというフォーマットが流行の様ですね。
しかし、そんな世の中の潮流に逆行する様に、メタセコイアのモデルをGLBoostで表示出来る様にしてみましたのでその紹介です。

#サンプル
https://minimo.github.io/GLBoost_advent_2016_1/
とりあえず、サンプルです。
プリンセスクラウンのリメイクしてくれませんかね。

#使い方
元々は、phiさんが作成した、gl.enchant.js向けのMQOローダを、抽象化してGLBoost向けにしております。自分がphina.js使いなので、そっち特化です。

```JavaScript:LoadingScene呼び出し
var scene = phina.game.LoadingScene({
  assets:
      mqo: {
          "gradriel":     "assets/gradriel_pose.mqo",
          "ground":       "assets/ground.mqo",
      },
   }
});
app.replaceScene(scene);
```
LoadingSceneでアセットとして読み込みを行って

```JavaScript:LoadingScene呼び出し
var mqo = phina.asset.AssetManager.get("mqo", "gradriel");
var meshes = mqo.buildMeshGLBoost(glBoostContext);
var m = meshes[0];
scene.addChild(m);
```
上記の様に呼び出すと、mqoファイル内のメッシュを配列に入れて返します。
それをシーンに追加すればOKです。

まあなんてお手軽。

![スクリーンショット 2016-12-10 14.08.35.png](https://qiita-image-store.s3.amazonaws.com/0/31052/f9fcf6d5-973b-45d9-7949-a9adbee000ef.png)
アルファテクスチャの合成をしてないので、クラウンと前髪が想定通り抜けてませんが、ここはそのうち。

#おしまい
甚だ簡単ではありますが、MQOを表示してみたよ。という感じの記事でした。
MQOも資産は数多くありますので、アマチュアレベルでの利用に関してはまだ需要があると思うのですが、どうなんでしょうか。
３Ｄフォーマットも乱立して、あっちは読めてもこちらは駄目という状況が多々あるので、glTFでなんとかならないかなーと思ったり思わなかったり。

ソースはこちら
https://github.com/minimo/GLBoost_advent_2016_1
【Java】interfaceについて

Javaを学んでいて、つまずきやすいポイントの一つ(?)interfaceについて、まとめてみたいと思います。

Android でのinterfaceの例は別の記事にまとめました。

- [【Android】interfaceの例](http://qiita.com/rild/items/33111059acc4b3547051)

Androidアプリプログラミングで、interfaceについて理解を深めるなら、独自リスナーを作ってみるのがいい気がします。

- [Androidのカウントダウン](http://qiita.com/rild/items/76725d941bce63114bf0)

# interface について
interface の書き方。

`java.lang`のRunnableがインターフェースの例です。


```Runnable.java
package java.lang;


/**
 * Represents a command that can be executed. Often used to run code in a
 * different {@link Thread}.
 */
public interface Runnable {

    /**
     * Starts executing the active part of the class' code. This method is
     * called when a thread is started that has been created with a class which
     * implements {@code Runnable}.
     */
    public void run();
}
```

簡単にすると

```Runnable.java
public interface Runnable {
    public void run();
}
```

こうなります。

スッキリわかるJava入門 第２版では、「抽象クラスの中の抽象クラス」という表現で説明されていたりします。

## インターフェースと扱われる２つの条件
1. すべてのメソッドが抽象メソッド
2. 基本的にフィールドを一つも持たない

### 抽象メソッド
処理の中身 ( `{ /*...処理...*/ }` がない) メソッドのこと。

```Runnable.java
public void run();
```

の部分。

### インターフェースのフィールドについて
インターフェースでフィールドを宣言すると、 `public static final` で、定数を宣言したものと扱われます。

### インスタンスの生成
抽象メソッドは **必ずオーバーライドされる** 必要があるので、`interface`のインスタンスを生成するときには、

```java:
Runnable runnable = new Runnable() {
    @Override
    public void run() {

    }
};
```
このように `run()` メソッドをオーバーライドしながらインスタンスを生成することになります。

## 参考
- スッキリわかるJava入門 第２版
- [インタフェース Runnable](https://docs.oracle.com/javase/jp/6/api/java/lang/Runnable.html)
- [Oracle: Java: Documentation: interface](https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html)
就職活動を早くやってよかったこと（Web系）

[HAL Advent Calendar 2016](http://qiita.com/advent-calendar/2016/hal)
HAL生によるアドベントカレンダーで投稿した記事です。

# 目的
エンジニア学生が早めに就活してみて実際どうだったのかというのを今後の就活生向けにシェアをして、何かの役に立てばということで記事にしました。
特に直接の後輩となるHAL生向けとなるものです。

技術寄りに話なら以下の記事のが役に立つかもしれません。
[就職活動までにやっておいた方がいいこと（Web系）](http://qiita.com/Jumpei_Chikamo/items/8cf764c43db20ccb4fc1)

# 結論
早く動いたらメリットしかなかった。

## 私のステータス
まず、こんな人がこういう風に準備してたというのが分かるように、私の自己紹介を軽くしたいと思います。

- 専門学校HAL　4年制3年生（18卒）
- 学校入るまで全くのプログラム未経験
- 数学が苦手科目
- 地方学生
- エンジニア志望

## 3年生の最初から動きまくる（5月〜7月）
私が実際に就活で動き出したのは、4年制3年の5月あたりです。なので、周りはまだ「就活とかまだじゃね？」ムードが漂ってます。しかし、合わせる必要はありません。
具体的に動きまくるというのは、[サポーターズ](https://supporterz.jp/)や[逆求人ナビ](https://www.studenthunting.com/)などの面談イベントに参加するなどです。

### メリット
早々と動いていると、既に締め切りで行けなかった！！っていうインターンが減るので、後から後悔などのパターンがなくなります。
また、この時期から動いておくことで、夏までにどのくらいの準備が必要なのかの目処も立てれますし、インターン先に会社さんもそれを見込んで合格を出してくれることも・・・あるかもしれない。
しかし、この時期から動くには既に色々な準備を2年の時点で済ませている必要があるので、最低限ポートフォリオや成果物を作っておくといいかもです。

## インターン行きまくる（8月〜10月）
出来ればインターンは行きまくりましょう。私は学校の休みを最大限に使って色々な会社にインターンに参加させて頂きました。

### メリット
インターンに行くメリットは勉強が出来るのは勿論ですが、自分的にすごくメリットと感じたのは、自分が全国でどのくらいのレベルのエンジニアなのかというのがなんとなく測れることです。
自分はインターンでけちょんけちょんにされたので、お陰で今では勉強するモチベーションも高く保てていますし、学生なりに色んな視点でモノを見れるようにもなりました。
また、その代の優秀な学生とたくさん知り合えるので、刺激になりますし、もしかしたら、一生モノの仲間と出会えるかもしれません！
注意点としては知っている技術領域の中でインターンを探さないほうがいいです。私も最初はレベルが高すぎてビビりまくっていて、会社さんから「そんなんじゃだめだよー」と言われることもありました。実際その通りで、まずはやってみるという精神で挑戦した方がいいです。そのためのインターンなので、たくさん失敗しましょう。

## 得た技術をアウトプットする（11月）
インターンが終わったら、次はそれをアウトプットして、自分のものにしましょう。

### メリット
インターンなどに行くと学生生活では絶対考えないようなことまで考える機会が増えます。なので、アウトプットするものもそういった経験をしている学生とそうじゃない学生では全く変わってきます。せっかくなので、それを形にして自分のモノにしておくとインターンに参加したメリットを最大限活かせると思います。渡しの場合はインターン前に作っていたプロダクトを1から作り直しました。（インターン終わってから見るとゴミコードだったので・・・）

## 本選考を受ける（12月〜）
頑張りましょう。

### メリット
就活が始まってから自己分析をするのではなく、本選考のときには様々な経験から自分が何者かをハッキリと理解出来ている上に、やりたいことやどういう働き方をしたいといったことを実経験を元に話せるので、面接で深みのある話が出来ると思います。人によってはこの時点で出会うべき会社さんと出会えて、最高の状態の自分で面接に臨んでいたり。

## 最終的に得られるメリット
”最後の学生生活の時間を有意義”に時間を使えます。これはやるしかない。
Proxmox VE 4.3 で 手で/etc/書き換えてWebUIに古いホスト名が残った場合

## 現象

DL360G6 => DL320G6 に以下ファイルを手で書き換えOS再起動した

* /etc/hosts
* /etc/hostname
* /etc/mailcap
* /etc/postfix/main.cf
* /etc/aliases (の後newaliases)

OS再起動後、WebUIを見たら古いホスト名が残っている

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/25728/49a86ae6-b6ee-987d-ee72-fd6771ee4139.png)


## 確認

```bash:ノード一覧見れない
# pvecm nodes
Corosync config '/etc/pve/corosync.conf' does not exist - is this node part of a cluster?
Cannot initialize CMAP service
```

```bash:消せない
# pvecm delnode dl360g6
Node/IP: dl360g6 is not a known host of the cluster.
```

## 対処

```
rm -r /etc/pve/nodes/dl360g6/
```

再度WebUIにログインしたら綺麗に消えていた。(OS再起動不要)
LaTeXで10進数と4桁2進数（2の補数）の変換

10進数と2進数の変換表をtexで作りたい．

- 2進数は4桁
- 符号付きは2の補数表現


```latex:test.tex

\documentclass[a4paper]{jsarticle}

\usepackage{pgf}    % pgfmath
\usepackage{pgffor} % foreach

\usepackage{multicol}


\begin{document}

\newcommand{\DtoB}[2][4]{% decimal to binary, unsigned
  \pgfmathsetbasenumberlength{#1}% 4-digit default 
  \pgfmathbin{#2}\pgfmathresult%
}

\newcommand{\BtoD}[1]{% binary to decimal, unsigned
  \pgfmathsetbasenumberlength{1}%
  \pgfmathparse{0b#1}\pgfmathresult%
}

\newcommand{\DtoCB}[1]{% signed decimal to 4-digit binary 
\ifnum #1 = 0%
  \pgfmathsetbasenumberlength{4}%
  \pgfmathbin{#1}\pgfmathresult%
\else%
  \ifnum #1 > 0%
    \pgfmathsetbasenumberlength{4}%
    \pgfmathbin{#1}\pgfmathresult%
  \else% #1 < 0
    \pgfmathsetbasenumberlength{3}%
    \pgfmathbin{8 + #1}1\pgfmathresult%
  \fi%
\fi%
}

\newcommand{\CBtoD}[1]{% 4-digit binary to sgiend decimal -8, -7, ..., 6, 7
  \pgfmathsetbasenumberlength{1}%
  \pgfmathparse{0b#1}%
  \ifnum \pgfmathresult > 7%
    \pgfmathparse{-8 - (8 - 0b#1)}%
    \pgfkeys{/pgf/number format/.cd,int trunc}%
    \pgfmathprintnumber{\pgfmathresult}% convert -1.0 --> -1
  \else%
    \pgfmathparse{0b#1}\pgfmathresult%
  \fi%
}



\def\DtoBloop#1{%
  \foreach \x in {#1}{$(\x)_{10} = (\DtoB{\x})_2$\\}%
}

\def\DtoCBloop#1{%
  \foreach \x in {#1}{$(\x)_{10} = (\DtoCB{\x})_2$\\}%
}

\def\BtoDloop#1{%
  \foreach \x in {#1}{$(\BtoD{\x})_{10} = (\x)_2$\\}%
}

\def\CBtoDloop#1{%
  \foreach \x in {#1}{$(\CBtoD{\x})_{10} = (\x)_2$\\}%
}

\begin{multicols*}{4}

\noindent
\DtoBloop{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
\columnbreak

\noindent
\DtoCBloop{-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7}
\columnbreak

\noindent
\CBtoDloop{0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111}
\columnbreak

\noindent
\BtoDloop{0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111}

\end{multicols*}

\end{document}

```

こうなります．

![スクリーンショット 2016-12-11 13.37.58.png](https://qiita-image-store.s3.amazonaws.com/0/44835/bcd50f7f-822c-0eb3-5c51-70732a819499.png)
Amazon Lightsailの注意点

[ディップ Advent Calendar](http://qiita.com/advent-calendar/2016/dip-dev)の11日目です。
先日、「AWS re:Invent 2016」が開催され、様々な新サービスや機能がローンチされ、魅力的でワクワクしてきます！
個人的には「Lightsail」のロボットがキュートで憎めない感じなので
このサービスについて、使う前に意識した方がいいなぁって感じたことをまとめてみました。
![WS000248.JPG](https://qiita-image-store.s3.amazonaws.com/0/52353/6126f3a1-6a95-e305-09a5-1e276096baec.jpeg)

## Amazon Lightsailとは
AWSのVPSサービスです。
細かいインスタンスの設定やネットワークをあまり意識せず、簡単にサーバやサービスをローンチできます。
サービスはこんなのが選べます。OS環境だけであれば、AmazonLinux、Ubuntuを起動できます。
![WS000249.JPG](https://qiita-image-store.s3.amazonaws.com/0/52353/91aa3dc9-a9cd-d918-22e8-9de84cf8a186.jpeg)



サービス概要は[AWS公式](https://aws.amazon.com/jp/blogs/news/amazon-lightsail-the-power-of-aws-the-simplicity-of-a-vps/)があるのでそちらで。

とにかく素早く簡単に起動できます。
「Create instance」で、「Base OS」を「Amazon Linux」、$5プランで
1分以内にインスタンスの起動が終わりました。
ちょっとサーバがほしくなったときにVPCや、EC2の設定を考えずにあげれるのは楽です。
手軽さの代わりに制限事項がありますので、割り切って使えるかどうか。
教育環境、開発環境、検証環境、スケールの必要がないケースがいいと思いました。
少し触ってみて、感じた制限をお伝えします。

## Lightsailの利用上で気を付けること

### ネットワークセキュリティの制限
Portに対して、ソースIPの制御ができないです。
0.0.0.0/0で許可されます。当然、SSH22番も。
Port rangeやProtocol（TCP/UDP）は設定できます。
※細かくやりたいときはOS上で設定とか他で補う必要がありますね。。。

![WS000250.JPG](https://qiita-image-store.s3.amazonaws.com/0/52353/a4f8ba6b-dab9-8338-e301-b4eb46294b91.jpeg)


### instanceのプラン変更（スケールアップ）は~~できない~~APIでできる。
スナップショットの機能にてバックアップを取ることはできますが
バックアップからの復元時、コンソールからプランを変えることはできません。
「Create an instance from a snapshot?」でYes、Noしか聞かれないです。
![WS000245.JPG](https://qiita-image-store.s3.amazonaws.com/0/52353/d81e94d1-6017-87eb-0032-0c7b9971ff9b.jpeg)

https://amazonlightsail.com/docs/
プラン変更できないと思ったら、APIでlarge size instanceに変更できるとの記述がありました。失礼しました。
>Can I upgrade my plan?
>>Yes. You can take a snapshot of your instance, and use the API to launch a new, larger size instance. Note that you currently have to use the API, as launching a larger instance than the original is not currently available in the Lightsail console.

### 他のAWSサービスとの連携はVPC peering経由
VPC PeeringをEnableにすれば、他のVPCのAWSサービスと連携ができます。
でも、そこまで複雑にするとlightsailのメリットであるシンプルさがなくなる気がします。
CloudWatchやCloudtrailとの連携もできないので運用も独立します。
※操作履歴はHistoryでみれます。

### スナップショットからの復元でPublic IPが変わる
Lightsailはinstance毎にPublic IPを持ちます。
スナップショットからの復元時、新しいinstanceで復元されるので
スナップショット元とは異なるPublic IPを保持します。
外部向けにPublic IPを固定したい場合は、StaticIPの機能を利用するか
DNS zone（何れもLightsailで作れます）を利用しましょう。
![WS000251.JPG](https://qiita-image-store.s3.amazonaws.com/0/52353/096376aa-b9f2-0573-6cd5-fd479b6a83a4.jpeg)


===

他にも制限事項や、注意点はあるかと思いますが
AWSサービスは、サービスの特性、特徴を生かして、使えるポイントに当てはまった時
とても価値が発揮できるものだと思っています。
発表された新しいサービスをインプットしておいて、引き出しを増やしていきたいと思います。
エクセル関数を使いこなそう②

下請けCOBOLERとして生きていた頃のノウハウ Advent Calendar 2016の７日目の記事です。

###レガシーな現場ではエクセルを制する者がすべてを制す

COBOLの下請け現場ではエクセルを使いこなす力が重要になります。

今回は関数についてです。

正直なところ、関数なんて適当にググればわかるのですが、残念ながら下請けCOBOL現場ではインターネットに繋がらない環境人も多いと思います。

また、プロキシで監視されていて実質使えないみたいなところもあると思います。

知っておくべき関数はとりあえずこのくらいじゃないでしょうか

・SUM
・VLOOKUP
・IF
・ROW(行数を１~縦に引っ張るのもいいのですが、間に行が追加されたとき振りなおすのは面倒ですよね)

とにかくVLOOKUPはとても強い味方になります。


自分は一度、異常なデータの正常なデータへのupdateの必要があった際、異常なデータを抽出するsqlの結果を張り付けて、そこから関数を仕込みまくってupdateのsqlを導き出すという軽いプログラムレベルのエクセルブックを作ったこともあります。

大規模な現場では事故防止のため本番作業はどこまでも機械的にできることが要求されます。
本当はVBAでもよかったと思います、あまり難しいことをやると、上の人が理解しきれないので、
なるべく簡単な技術を用いて上の人が理解しきれる範囲の技術を用いてなにかを作りましょう！

※余談ですが、似たようなことをする別の機会があった時(誤ったなデータを吐き続けるdatファイルの中身を修正する作業)はdatファイルを汎用機に読み込ませて、ホストで使われていたユーティリティを組み合わせたJCL(シェルスクリプトみたいなもの)を作ったということもあります。
しかもそれが日時バッチの途中のdatファイルだったので、を数か月分全部そのJCLを通して修正し、後続を流しなおすという作業もしたことがあります。


なんで誤ったPGMを直さないかというと。本番リリースのためにはお客様への説明と、修正してリリースしてよいという判断のための材料集め（つまりはエクセルと大量のスクリーンショット）が必要なので、ここが間違ってるとわかってもリリースには最速でも一週間かかります。普通は一か月かかるので、その間に生み出され続ける異常データはこうやって手作業で直し続けるのです。
IoT的な処理でプロセス間通信をするときRedisが超絶便利な件


　複数箇所の気温を測定して収集するというようなことを，センサー & ラズパイ & サーバ とかでやる場合に，Redis を使うと処理が簡単になる　というお話です．

# 想定する環境

　機器構成として

* データをシリアル出力できるセンサー
* 複数のセンサーからのデータを受けるラズパイ（とか）
* 複数のラズパイ（とか）からのデータを集約するサーバ

を考えます．
　ラズパイは，Raspbian が走っているものとして，この上で Perl とか Python とか Ruby （とか C言語 ）で処理プログラムを開発するものとします．

# 「IoT的な処理」

　このような環境では，センサーからの定期的なデータの受信と，他のサーバに渡すというような処置が必要になります．
　ただ，他のサーバに渡す処理が REST である場合には，データ送信に割と時間がかかってしまう場合があります（セッションの確立とか）．

![fig01.png](https://qiita-image-store.s3.amazonaws.com/0/43248/b83fc3ad-ab5f-63b1-847c-09f180a34ba1.png "fig01.png")

　そこで，このような場合には，受信処理や送信処理を別々にして，プロセス間通信でデータのやりとりをするのが一般的です．
　このプロセス間通信に Redis を使うと便利というのが，本稿のお話です．
　
![que.png](https://qiita-image-store.s3.amazonaws.com/0/43248/701e9c17-af42-5d35-9cbd-d657ab40aa21.png "que.png")

# メッセージキューでやってほしいこと

　IoT的な処理では，

* 異常値観測 -> 警報発報 のような常時監視
* 一定時間毎に，過去数点のデータの平均を求めるようなサマリ情報収集
* 簡単な解析

を，上記の構成におけるラズパイの部分でやらせると，システム全体の構成が簡単になります（よね）．

　このうち，「一定時間毎に，過去数点のデータを処理」というのは，ちょっと面倒です．受信したデータを，常に，一定数記憶しておく必要があります．ですが，メッセージキューが，長さの指定ができる FIFO であれば話は簡単になります．
　FIFO(First In First Out) は，メッセージキュー (Queue) の処理方法の１つで，先に入れたものが先にでてきます．また，長さを指定があれば，その長さ以上のデータを受け付けません．
　今回の FIFO では，新しいデータがキューに入るたびに，一番古いデータが捨てられるものとします．
　
　このようにすることで，FIFO の長さを 10 にしておけば，過去10点のデータを定期的に読み出すという処理を簡単に実現することができます．
　また，目的のプロセス毎に長さの違うキューを用意することもできます．
　
　![fifo.png](https://qiita-image-store.s3.amazonaws.com/0/43248/5cb23d64-1f79-f41b-6b39-634c60833818.png "fifo.png")

# Redis を使うとうれしいこと
　本稿は，長さ指定のできる FIFO のメッセージキューとして Redis を使うと便利だよ　というのが趣旨です．

## うれしいこと　その１　実装が簡単

 送信側 : rpush & ltrim
 受信側 : lpop
を使うことで，長さ指定のある FIFO が，とっても簡単に実装できます．
　以下は，送信側の実装例です．

```perl
use Redis;
use Redis::List;

my $redis = Redis->new(server => 'localhost:6379');

my $data = "Recieved Data";

$redis->rpush('hoge', $data);
$redis->ltrim('hoge', -10, -1);  # 最新10回分
```

## うれしいこと　その２　データ形式が自由

　うれしいことの大半は， Redis の機能によるものなので，あまり列挙する意味もないのですが，文字列の引き渡しが簡単というのは，かなり重要なメリットです．
　センサーからのデータは，文字列として渡されてくるので，この文字列をそのまま渡すことができるのは，うれしいですね．

## うれしいこと　その３　多言語対応

　この多言語は，プログラミング言語のことです．
　自分の得意，あるいはその処理が得意が言語を選択できるのは，うれしいことですよね．
　Redis が間にはいることで，送信側と受信側を別の言語で開発することが，かなり楽になります． Redis インターフェースを使えばよいですからね．

# まとめ

　IoT的な処理でプロセス間通信をするときに，Redis が便利という話でした．「超絶」は，ちょっと釣りです．
　実際に，ラズパイを使った案件で Redis を使ったのですが，複数人による並行開発が円滑に進みました．
　最近のラズパイが高性能というのもあるのですが，Webサービス技術で IoT 処理がかなり簡単にできますね．
技術でできることの壁（いいねとはなんなのか）

# ちょっとした要望

## 下書きの数を 25 にしてほしい

Advent Carendar がありますから、最低 25 にして欲しいと意見をたまに見かけますし、私もそう思います。実際に 25 も書き溜められる人がどれだけいるのかというのはまた別として、対応はしていただきたいところ。

## Twitter 公式アカウントでの告知がおかしい？

Twitter の Qiita 公式アカウントでは、アカウントの 500Contribution 毎と記事の 100 いいね毎に告知がされるようです。
私は現時点で 639Contribution と 100 UP の記事を 2 つ書いているんですが、そのうちの記事 1 つしか告知されなかったような気がします・・・。
別に数字を稼ぐのが目的で記事を書くわけでもないですが、モチベーションの一つになることは間違いないのでちゃんとしていただきたいところです。

## 編集リクエストへのお礼が直接できない？

編集リクエストを頂いた時に、取り込む（か取り込まないか）しかできなくて、一言お礼がしたいのにいかんともしがたく、正直困惑します・・・。
編集リクエストの内容について議論したくなることもあるだろうし、編集リクエストに対してのコメント機能があればいいんじゃないかなと思います。

# 「いいね」ついて

で、話題の「いいね」についてなのですが、この Advent Carendar でもすでに[「いいね」が使えないのはどう考えてもQiitaが悪い](http://qiita.com/bezeklik/items/e28ab36e1071e761a277) というよくまとまっているいる記事がありますね。私も概ね同意です。
以下、特に私が訴えたいことだけ書いてみます。

## ストックの扱いがひどすぎる

記事を書く人にも読む人にも、変更後のストックが上手く機能するようにはどう考えても思えないですよね。

- 「いいね」してもストックはされない
- ストックだけされても Contribution は増えない

などなど。
リリース時のブログの記事によれば、どうも「後で読む」的な意味で使われる可能性を考慮されているみたいですけど、それなら単に「後で読む」機能を追加すればよかっただけなのでは？

## 技術でできることとできないこと

私たちプログラマは、技術によって色んな物を生み出したしたり色んな物を改善します。職業としてやるのならなおさらのことです。
しかし、ストックが「いいね」に変わることで何が改善されるのでしょうか？
「いいね」ボタンひとつで人の感情がより良く伝わるとでもいうのでしょうか？
あえて口さがない言い方をすれば、技術で何でもできるんだっていう傲慢さが垣間見えた気がします。
個人的には、はてなスター騒動の時のはてなを思い出してしまいました。あのときのはてなは、[技術に酔って物事の本質を取り違えたかのような発言](http://d.hatena.ne.jp/keyword/%A5%D6%A5%ED%A5%B0%A4%CE%A5%A8%A5%F3%A5%C8%A5%EA%A1%BC%A4%CF%BC%A1%A1%B9%A4%CB%CE%AE%A4%EC%A4%C6%A4%A4%A4%AD%A4%DE%A4%B9%A4%B7)を社長自らされるような状況でしたが、Qiita もそんなふうになってしまうのかなと思わずにはいられません。
【LT没資料】 From Haskell to Perl

[YAPC::Hokkaido SAPPORO](http://yapcjapan.org/2016hokkaido/) のLTに応募しましたが、採択されませんでしたので没になった資料をそのまま公開します。

----

# まだ型チェックの厳しい言語で消耗してるの？

----

# 動的型付け言語を使おう！

----

## quickcheck

* 単体テストライブラリ
* 満たすべき性質を記述する
* テストケースを自動生成
* ランダムに生成する (VS smallcheck)
* テストケースの確率分布はプログラマが制御する

----

## Test::RandomCheck

[Test::RandomCheck](http://search.cpan.org/~hiratara/Test-RandomCheck/)。

* quickcheckをPerlへ移植したもの

----

## 使用例

例えば新人が挑戦的な `length` 関数を書いてきた時。

```perl
use List::Util qw(sum);

sub my_length {
  (my $x = splice @_, 0, 1) =~ s/./2/g;
  sum (split //, $x || 0) >> 1;
}
```

----

## lengthの性質

* `length("") == 0`
* `length($char) == 1`
* `length($s1 . $s2) == length($s1) + length($s2)`

----

## 空文字列のチェック

```perl
is my_length(""), 0;
```

----

## 単位のチェック

性質を式に書く。

```perl
my_length($char) == 1;
```

----

## 単位のチェック

`Test::RandomCheck` を使う。

```perl
use Test::RandomCheck;
use Test::RandomCheck::Generator;

random_ok {
    my $char = shift;
    my_length($char) == 1;
} char;
```

----

## 演算の保存のチェック

性質を式に書く。

```perl
my_length($s1) + my_length($s2) == my_length($s1 . $s2);
```

----

## 演算の保存のチェック

性質の記述に必要な型を、`Test::RandomCheck::Generator` で定義。

```perl
my $type_of_arguments = concat(string, string);
```

----

## 演算の保存のチェック

`Test::RandomCheck` を使う。

```perl
my $type_of_arguments = concat(string, string);
random_ok {
    my ($s1, $s2) = @_;
    my_length($s1) + my_length($s2) == my_length($s1 . $s2);
} $type_of_arguments;
```

----

## 自然性をチェックしてみる

性質を式に書く。

```perl
my @chars = split //, $str;
my $mapped = join '', map { $f->($_) } @chars;
my_length($str) == my_length($mapped);
```

----

## 自然性をチェックしてみる

性質の記述に必要な型を、`Test::RandomCheck::Generator` で定義。

```perl
my $type_of_arguments = concat(string, function(char, char));
```

----

## 自然性をチェックしてみる

こんな感じ。

```
my $type_of_arguments = concat(string, function(char, char));
random_ok {
    my ($str, $f) = @_;
    my @chars = split //, $str;
    my $mapped = join '', map { $f->($_) } @chars;
    my_length($str) == my_length($mapped);
} $type_of_arguments;
```

----

## まとめ

* 性質を検査できるのは便利
* 生成される変数の質が悪いから手直しいるかな・・・
Opalのgemをつくる

この記事は[Opal Advent Calendar 2016](http://qiita.com/advent-calendar/2016/opal)の10日目の投稿として書いています。

またまた遅れてしまいました…

当初、「JavaScriptのライブラリをOpalから利用できるようなラッパーをつくってみましょう。」という予告をしておいたのですが、そのまえにOpalからつかえるgemをつくるほうが先な気がしたので、今日は「Opalのgemをつくる」ということをします。

まずは、通常のgemをつくるように、

    $ bundle gem opal-audio

これか作るgemはOpalからWeb Audioを使うgemなので、opal-audioという名前にします。

http://opalrb.org/docs/guides/v0.10.3/configuring_gems.html
このへんを参考にgemを作成していきます。

Opalのgemでは、

1. 通常のOpalのコンパイルの対象となる`.rb`ファイル
2. サーバーサイドでgemとして扱われるブートストラップコード

を用意する必要があります。
Opalの多くのgemでは、この2種類のファイル群を`opal`ディレクトリと`lib`ディレクトリに分ける方法と、`lib`ディレクトリに入れて、Opalの中で呼ばれているコードかそうでないか(サーバーサイド)で分岐する方法とがあるようです。
チュートリアルにはディレクトリを分けずに、`RUBY_VERSION`で分岐するようになっているのでそちらの例でやります。

ブートストラップ
====
ブートストラップというか、サーバーからOpalのコードが読めるように、`append_path`するコードを置きます。

*lib/opal/audio.rb*

```ruby
require "opal/audio/version"
require "opal"

Opal.append_path File.expand_path('..', __FILE__)
```

Opalのコードを書く
====
Opal側では`require_relative`でロードするファイルを指定します。
今回はExampleというファイルをロードすることにしましょう。

```ruby
require_relative "audio/example"
```

先ほどのブートストラップのコードと`RUBY_ENGINE`という定数を見て分岐させます。

*lib/opal/audio.rb*

```ruby
if RUBY_ENGINE == 'opal'
  require_relative 'audio/example'
else
  require "opal/audio/version"
  require "opal"

  Opal.append_path File.expand_path('..', __FILE__)
end
```

サンプルコードは以下のようなものを使います。

*lib/opal/audio/example.rb*

```ruby
require 'native'

module Opal
  module Audio
    class Example
      def alert
        $$.alert('Hello Opal-audio')
      end
    end
  end
end
```

gemを使うサンプル
====

このgemを使うサンプルをつくましょう。`examples`ディレクトリを作って、[8日目のサンプル](http://qiita.com/youchan@github/items/735ffad1a5c406ebb30c)に倣って以下のようなファイルを作りましょう。

*Gemfile*

```ruby
gem 'rack'
gem 'opal-sprockets'
gem 'opal-audio', path: '..'
```

*config.ru*

```ruby
require 'opal-sprockets'

Opal.use_gem 'opal-audio'

run Opal::Server.new { |server|
  server.main = 'application'
  server.append_path 'app'
}
```

*app/application.rb*

```ruby
require 'opal'
require 'opal/audio'

Opal::Audio::Example.new.alert
```

    $ bundle install
    $ bundle exex rackup

`http://localhost:9292`を開くとアラートは表示されましたでしょうか?

次回は満を持して、Web Audioラッパーのgemを作りましょう。
Magento2独自モジュール/テーマの初期化カンペ

[Magento Advent Calendar 2016](http://www.adventar.org/calendars/1372)の9日目担当[@kzkiq2nd](https://twitter.com/kzkiq2nd)です。

<= 8日目 [Magento2をCapistranoでデプロイする](https://principle-works.jp/blog/how-to-deploy-magento2-with-capistrano)
=> 9日目 [Magento2 Data Migration Toolを使ってみた。その１](http://qiita.com/tsuchiyawantan/items/ee9f74f76cd6be2bf140)

# 新規作成の構造、忘れがち。
Magento2のカスタマイズは独自モジュールと独自テーマ作成の繰り返しです。その他の開発一般と同様、何度もつくればその新規作成の作法も覚えてしまうとは思いますが、必須ファイルや構造などよく忘れてしまいその都度公式ドキュメントを読みにゆくのも効率がよくありません。

また、Magento2は作法としてとにかくコードが長くなりがち、かつモジュール・テーマの作成と初期化には同時にいくつかの設定ファイルや構造が必要なため、HTMLページである公式ドキュメントにおいても必須ファイルや構造の表示が直感的とは言えません。

そこで初期化に必要なファイルと設定を一目で理解できる試みとして、Githubのコミット差分表示を利用しました。内容は公式ドキュメント(Ver.2.1)を基本としています。

## 独自モジュールの初期化
- 独自モジュールは`/app/code/ベンダー名/モジュール名/`に配置
- `/composer.json`,`/registration.php`,`/etc/module.xml`の3点が必須となる。

[初期構造見本(github)](https://github.com/kzkick2nd/magento2-demo/commit/f055534de9626dd06a10c4e8938dcc4234716aa3)

### モジュールの有効化コマンド
```
magento module:status
magento module:enable ベンダー名_モジュール名
magento setup:upgrade
```

[公式ドキュメント該当ページ](http://devdocs.magento.com/guides/v2.0/extension-dev-guide/build/build.html)


## 独自テーマの初期化
- 独自テーマは`/app/design/frontend/ベンダー/テーマ/`に配置
- 必須ファイルは継承元の有無などで変化するが、継承なしはあまり現実的ではないのでサンプルは`Magento/blank`を継承した場合の初期構造です。

[初期構造見本(github)](https://github.com/kzkick2nd/magento2-demo/commit/51cd570750d1338446c19dc88f24d6473a96d297?diff=unified)

[公式ドキュメント該当ページ](http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/themes/theme-create.html#layout_theme_how-to_dirs)


以上がからっぽのモジュールとテーマの初期構造です。来週の"Magento Advent Calendar"担当日では、以上の構造をベースにテーマの改造（もしくは、決済画面のカスタマイズ）を行います。

[Magento Advent Calendar 2016](http://www.adventar.org/calendars/1372)
技術英語 > [Consolidate] fragments that are duplicated within different parts of a conditional.

@ Code Complete (No. 18400 / 36077)

> **<font color=red>Consolidate</font>** fragments that are duplicated within different parts of a conditional.

https://www.merriam-webster.com/dictionary/consolidate
> `1: to join together into one whole 
...
 `3: to form into a compact mass

if then elseの書き方で、else節に同じコードが来た時に「まとめましょう」という記載が続いている (読み違えてなければ)。

<hr>
one whole
関連して思い出したのは

But this doesn't really [tell the whole story]. 
http://qiita.com/7of9/items/26745cad96ef246a82e2
Courseraやってみたよ


Courseraのコースをやってみた。そのレポートをこれから書く。

##モチベーション
個人的に、専門学校とか大学とか、何百万とお金を取る上に、あんまり仕事に役に立つ知識を提供していないなという思いがある。
人によっては奨学金とか借りてひどいことになっている人もいるし。
大学をDisっているわけではない。研究機関としての大学はあってもいいと思う。でも、なんかちょっとおかしい感じがする。

##取ったコース

game design and developmentをやってみた。

https://www.coursera.org/specializations/game-development

Unityによるゲーム開発のコースで、Capstone Projectで集大成となるゲームを作ることになる。
額は月５０００円だ。
ちなみにコンテンツの質は高い。Unityプログラミングだったけど、一度も「実行できない！！」という状況に陥ったことはない。
動画の通りに実行したら全て実行できた。コンテンツが古いということもない。
質の高いコンテンツがあり、小テストもあり、課題を出して課題を採点してもらえて、メンターにサポートしてもらえてこの値段は安いと思う。
ちなみに、週２〜５時間と書いてあるけど、

###絶対に５時間で終わりません！！

絶対に１０時間はかかります！
ところで、ここで「課題の採点」と書いたけど、別に教授や雇われたメンターが採点をするわけではない。
ここで

###ピアレビュー

というやり方が効いてくるのである。
ピアレビューとは、生徒がお互いのレポートを採点するというものである。かなり丁寧に採点してもらえる。自分も採点をするプロセスで勉強することができる。
この仕組みのお陰で、学費を相当に安く抑えることができる。

ちなみに、全部英語だ。キャプションはついているのでわかりやすいけど、英語はITを学ぶ上で必須なんだなと思わされる。

##結論
学問的なことやプログラミング、フレームワークの使い方を覚える上では、Couseraはいいプラットフォームだと思う。
ただ、問題点も浮かび上がってくる。
僕はサイバー大学を卒業しているのだが、サイバー大学はシステムが古い、コンテンツが古いなどの問題はあるけど、コミュニティがある程度発達している。
Courseraは所属できるコミュニティがほとんど存在しないのである。少なくとも、現時点で日本にはない。
そういう環境が辛い人はこれで勉強は辛いのかなと思う。
あと、大学がやっているものだけど、学位をもらえるわけじゃない。学位とか単位とか、そういうものがないと勉強できない人は辛いかもしれない。
あと、Courseraはしょっぱなからレベルが結構高いので、プログラミングの初心者は「初心者向け」コースを取る必要があるかもしれない。

ちなみに僕はUniversity of the peopleにも入学してみた。MicrosoftとHPが協賛しているアメリカとイスラエルの大学で、学費が４年間で３０万だ。（日本人の場合）
講義は全部英語、僕はプログラミングを教える学科に入ってみた。
これもレポートしていこうかと思う。
Mithrilのプロパティ

必要最低限がウリのMithrilにおいて「これいらなくね？」と言われる筆頭が``m.prop()``のプロパティです。もちろん、これがある方がコードがシンプルになるのであえてMithrilはこれを残しています。1.0からは高機能化された上で別パッケージに別れる模様です。

# ポインタのメタファ

プロパティは以下のような機能を提供するシンプルな変数です。

```js
var a = m.prop(1);
a();  // 1を返す
a(2); // 2を格納する
a();  // 格納された2を返す
```

C/C++を使ったことがあるのであれば、ポインタと言い換えると伝わりやすいかと思います。この変数aを持ち回れば、別々の場所から同じところにデータを書き込んだり読むことができます。次のような単純なオブジェクトだと、「変数」と「名前」の両方を渡さないと書き込みができません。

```js
var todo = {
    description: '説明'
}
```

プロパティを使えば値単体での読み書きができるようになるため、イベントハンドラで双方向バインディングを書くのが楽になります。プロパティ単体だけ渡せばよく、結合を疎にできます。

```js
function createInput(description) {
    return m('input', m.withAttr('value', description), description());
}
```

# プロパティをいつ使うのか？

いろいろなところから読み書きしないのであればプロパティにする必要はありません。オブジェクトに直に変数を代入してしまえば十分です。必要最低限をねらうなら、上記のようなビューから直接変更するような要素にしぼってプロパティにしておきます。変更が発生するかわからない or まだ細かいところまで定まっていないのであれば、とりあえず、エンティティクラスの末端のプロパティは全部プロパティにしておく、という方針でも良いでしょう。

それ以外だと、サーバからのレスポンスを格納する場所ですね。こんな感じにしておくと、ビューから参照されるときにデータがなくてもエラーになりません。

```js
this.data = m.prop([]);
m.request(サーバリクエストの引数).then(this.data);
```

# ビューとモデルの変換レイヤーを追加する

プロパティのインタフェースは単なる関数呼び出しです。最初は単に``m.prop``にしておいて、その後にバリデーションやサニタイズを足すことができます。例えば、日付の入力は``<input type="date">``を使うとします。この入力フォームは「年-月-日」という形式の文字列を読み書きします。モデル内では``Date``型にしておきたいですよね。最初は``this.dueDate = m.prop()``としておいて、きちんと実装したくなったら同じインタフェースを維持したまま、次のように書き換えます。

```js
class Todo {
    constructor(data) {
        this._dueDate = m.prop(data.dueDate);
    }

    dueDate(value) {
        if (value) {
            this._dueDate(new Date(value));
        } else {
            const d = this._dueDate();
            return `${d.getFullYear()}-${(d.getMonth() + 1)}-${d.getDate()}`;
        }
    }
}
```

まあ、本来ビューのためにモデルがデータ加工するのはどうなの的なこともあるかもしれませんが、サーバMVCではなくて、JSレイヤーのモデルなんてのは、サーバからしたらビューのための変換レイヤーでしかないので、個人的には別に悪くないかな、と思います。もちろん、モデルが太ってきたらビューモデル側に持っていってもいいと思います。

# プロパティが設計上優れているポイント

Mithrilに限らない話ですが、アプリケーションの設計って規模によってどんどん変わっていくんですよね。最初から「レイヤー化アーキテクチャだ」「ここはドメイン層だ」「ドメインロジックは分離せよ！」みたいな設計方針でコードを書いていくのもいいかもしれないけど、それだと動くものができるまで時間がかかる。

最低限の機能を動かすだけであれば設計というタスクすら必要ないかもしれません。最小機能のセットからイテレーティブに開発していく手法は大分広まっていますが、どこまで最初から発展の方向性を見据えて手を動かす必要があるか、というのはまだ諸説あると思います。

そういう意味では、イテレーティブに開発する時の設計手法というのは、Aという機能を持ったコードに、A'という機能を足したら、そのままではごちゃごちゃになっちゃうから、こういう指針で分けましょう」というような差分をマネジメントする手法を取るものだと思います。つまりパターン・ランゲージやリファクタリングこそが設計手法。アーキテクチャは結果的にそうなるものであって、最初から目指してはいけないものなんじゃないかと最近思っています。

リファクタリング本はA→BとB→Aの両方をパターン化していてすごく良い本です。といっても、基本的には機能が増えて分割する方向で発展する方向が多いでしょう。プロパティは小さく初めて、同じインタフェースを持ったままロジックを後から追加することが容易になります。複雑化した後に徐々にレイヤーわけをしたりも簡単にできます。
socketでhttpサーバっぽいものを作ってみたかった

#はじめに
HTTPサーバの仕組みを理解するために,HTTP用のサーバアプリやライブラリを使わずにTCPレベルのSocketを使ってHTTPサーバもどきを作ってみた
勉強用なので簡単な機能しかとりあえずつけてません
※以下のソースコードは脆弱性満載なので使用の際のトラブル等は全て自己責任でお願いします

#ソースコード
```httpserver.rb
require "socket"

plane_ext = ["html","htm","txt"]
binary_ext = ["ico","jpg","png","gif"]
permited_ext = plane_ext + binary_ext

s = TCPServer.open(8080)

while true
  puts "Server Ready..."
  client = s.accept

  puts "Accept HTTP Message"

  msg=[]
  msg_hash=Hash.new

  request_msg = client.gets
  request_msg = request_msg.chomp.split(" ") if request_msg!=nil
  redo if request_msg==nil

  while str=client.gets
    if str!=nil
      break if (str.chomp) == "" 
      str.chomp!
      msg << str
      buf=str.split(": ")
      msg_hash[buf[0]] = buf[1]
    end
  end

  puts "======== message ========="
  puts request_msg.join(" ") if request_msg != nil
  puts "======== message ========="
  puts msg if msg != nil
  puts "=========================="

  sleep(1)

  begin
    filename= request_msg[1]
    filename+="index.html" if filename[-1]=="/"         # add "index.html"
    while filename.sub!(/(\/\w*)(\/\.\.)/,"") do end    # remove .. from filename
    filename[0]=""                                      # remove "/" on the first word
    ext = filename.match(/\.([\w\.]*)/)[1]              # get extemsion name from the filename
    puts "filename = #{filename}"
    puts "extension = [#{ext}]"
    
    if filename[0,2] != ".." && permited_ext.include?(ext)
      if plane_ext.include?(ext)
        html = IO.read(filename)
      elsif binary_ext.include?(ext)
        html = IO.binread(filename)
      end
      client.puts "HTTP/1.1 200 OK"
      client.puts ""
      client.puts html
    else
      client.puts "HTTP/1.1 403 Forbidden"
      client.puts ""
    end
  rescue Errno::ENOENT => e
    client.puts "HTTP/1.1 404 Not Found"
    client.puts ""
  end

  client.close
end
```
##ソースコード解説
- ソケットが繋がったらrequest_msgに最初の[リクエスト,パス,バージョン]が入ります
- その他のヘッダ部分はmsgとmsg_hashに入れます
- 改行のみのデータが来たら読み込みを停止します
- request_msgのパスを"/"で終われば"index.html"を付加して,最初の"/"を消して相対パスにします
- 対応するデータを探し,開けなければ「404」,開ければ「200」と「改行」,「データ」を送ります
NanoPi NEO に nodejs v6 をインストールする


デフォルトの状態でapt-getではいるnodejsのバージョンが古すぎて話にならないので、v6を入れてみます。

この手順でふつうに入りました。
https://nodejs.org/ja/download/package-manager/#debian-and-ubuntu-based-linux-distributions-debian-ubuntu-linux

```
root@FriendlyARM:~# apt-get install curl
root@FriendlyARM:~# curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
root@FriendlyARM:~# apt-get install nodejs
root@FriendlyARM:~# node --version
v6.3.1
```

ちなみに、ARMv6は対応していないようで、RaspberryPi Model B+ だとこの方法ではできませんでした。
スマフォアプリのモバイルバックエンドの開発の必要はあるのか？


## はじめに

こんにちは、こんばんは。スマートテック・ベンチャーズ 11日目担当の @nnsnodnb です。2日連続私ですが読んでくだされば嬉しいです:muscle:

今日は私が個人開発したモバイルバックエンドとFirebaseなどのmBaaSを比較しながらモバイルバックエンドの開発は必要なのか **個人開発アプリ** , **企業開発アプリ** の観点で私自身が感じたことをポエムっぽく書いていきます。
これからの開発で少しでも参考になることがあれば幸いです。

## モバイルバックエンドについて

今回のモバイルバックエンドについては、mBaaSのようなプッシュ通知ができたりするもののことを前提として話していきます。

## mBaaS一例

- [Firebase](https://console.firebase.google.com)
- [Nifty Cloud Mobile Backend](http://mb.cloud.nifty.com/)
- [GrowthPush](https://growthpush.com/)
- [AppBank Fello](https://appbank.fello.net/)
- [Amazon SNS](https://aws.amazon.com/jp/sns/)

などなど。
他にもたくさんあるかと思いますが、私がパッと思いつくのはこのぐらいです。何かいい感じのサービスがあればコメント等で教えてくださると幸いです！

## 自作モバイルバックエンド

https://apps.nnsnodnb.moe

機能的にはまだまだ未完成(?)ですが、プッシュ通知及びユーザ管理ができています。HTTPS対応しているのでATSは万全です！
たまにSSL証明書の更新を忘れて **うわあああああ！！！** ってなるときがあるんですが基本的に大丈夫です...(震え

![スクリーンショット 2016-12-11 1.47.12.png](https://qiita-image-store.s3.amazonaws.com/0/97280/e1846b50-da51-0803-bb5c-66b1799be291.png "スクリーンショット 2016-12-11 1.47.12.png")

ちなみにSSL判定は上記画像！

https://github.com/nnsnodnb/django-mbaas

「 **何か機能追加してくれ！** 」っていうのがもしあればIssue等立てていただければと思います:sushi:

ちなみに **Python2 + Django + Nginx(gunicorn) + MySQL** での運用になっています。

## 既存モバイルバックエンド

### メリット

- SDKなどがすでに用意されているものがたくさんあるので導入等のコストがとても低い
- 大手サービスなのでドキュメントが豊富
- アプリ開発に重点を置いて開発ができる→コアな部分に集中できる

他にもあるでしょうか。ちょっと思いつかないです。ポエムなのでこのぐらいで

### デメリット

- 拡張ができない
- 課金やAPI制限などがありサービスを誰でもフルで使えるわけではない

## 自作モバイルバックエンド

### メリット

- 自分で自在に拡張して機能を追加できる
- アプリ特有の機能をサービスを提供できる

### デメリット

- 導入に時間がかかる
- サーバ開発班とアプリ開発班との連携が重要
- インフラ整備(負荷対策等)

まぁあんまり書くと「 **なんで自分開発したんだろう...** 」ってなっちゃうのでこの程度にとどめておきます。

## 結局どうなのか

### 個人開発アプリ

ゴリッゴリのAPIサーバ等と連携したモバイルバックエンドサービスが必要でない限り既存のモバイルバックエンドサービスを使うのがベター可と思います。

### 企業開発アプリ

- API開発等が必要になる
- エンドさんが操作することが条件(コンテンツの出し分け等)

私が感じたのは上記条件に当たる場合はモバイルバックエンドの開発はするといいのかな？と思いました。あくまでも個人的な見解です。

もう一度いいます。「 **あくまでも個人的な見解です** 」

## インフラのお話

既存のモバイルバックエンドだと心配する必要はないですが、自作モバイルバックエンドだとちょっと考慮する必要がでますよね。
AWSを例にして言うと、 

- ELB <-> EC2インスタンスを複数立ち上げて高負荷に対応
- S3 <-> EC2の通信速度の考慮
- RDS <-> EC2 の通信速度・RDSの計算速度考慮
- 踏み台サーバを用意してセキュリティ強化

等いろいろ見積もらなくてはいけないですね。

言っていくとキリがないので次で最後ですが、Androidのことはちょっとわからないのですが、iOSだとATS対策をしっかりとしないといけないというのが個人開発等には一番のネックなのかな？と思いました。

本職がインフラエンジニアではないし、AWSスペシャリストではないので(Route53とかいろんなもの使うんでしょう)、上記が正しいのかわかりませんが、参考程度です。

## さいごに

個人的には工数はかさむんですが、個人開発のときもモバイルバックエンドを作ることで無制限利用や自分の使いたい機能だけをつぎ込んだサービスを自分だけで使えるっていうのが結構嬉しいところなので、どんどん開発していいきたい派です。ただコアな部分のみに重点を置くアプリならどんどん既存のものを採用していくべきだと思いました。

モバイルバックエンドを自作するならFirebaseの機能を使いつつ、Nifty Cloud Mobile Backendの機能も使うみたいな
「  **A x B -> C** 」であるならばが 「 **C - (A + B) > 0** 」 になるようにすると更にいいのかなと思いました。
サービスなんて基本的に真似して良くしていくっていうじゃないですか？

はい。ということで本記事のポエムは終了です。
最後まで読んでくださりありがとうございました！

明日は、 @hirofumi_05 さんです！とてもありがたい記事になっていると思います！お楽しみに:muscle::muscle:
もちもちエクスペリエンスを向上させる


この記事は [J2complexed Advent Calendar 2016](http://qiita.com/advent-calendar/2016/j2complexed) の11日目の記事です。

突然ですが、もち。もちもち。もっちり。文字としても、声に出しても、浮かび上がる触感、すばらしいですね。

スマホではhoverを切る、よく飛び交う会話です。
もちもちさせるチャンスなのでもったいないですね。
ボタンも簡易的にもっちりさせます。


**DOM**

```html
<a href="mochi/" class="mochi"></a>
```
  
**js**

```javascript
var href;

$('.mochi')
	.on('touchstart',function(e){
		e.preventDefault();
  		$(this).addClass('is-touch').removeClass('is-off');
		href = $(this).attr('href');
  	})
  	.on('touchend',function(e){
  		$(this).removeClass('is-touch').addClass('is-off');
		setTimeout(function(){
			window.location.href = href;
  		},400);
	});
});

```

**Sass**

```scss
.mochi {
  width: 100px;
  height: 100px;
  border-radius: 50%;
  background-color: #8cb;
  display: block;
  position: relative;
  transition-duration: 0.7s;
  transition-timing-function: cubic-bezier(.16,.72,.36,.94);
  &.is-touch {
    transform: scale(1.17,1.1);
  }
  &.is-off {
    transform: scale(0.9);
  }
```

やっていることはとてもシンプルなので、説明するまでも、という感じですが、
`touchstart` / `touchend` で、触れた時、離した時用にclassを振って、もちっとさせるのはcssのtransitionに任せます。
easingを入れてそれっぽくします。
（cssのeasingを設定するには、みなさまご存知の[cubic-bezier](http://cubic-bezier.com/)がべんり）

ボタンに触れたときの通常の遷移を`e.preventDefault();`でキャンセルして、`touchend`してから、改めて遷移させます。
指を離したときの縮み具合をちょっと見せたいので、ちょっとだけ遷移を遅らせると、もちもちを漏れなくお届けできますね。もちもちの押し売り。

---

実際もちもちさせたのはこちら。
ねむいのでPCのことフォローしてないので、スマホでみないと動きません！もちもち。

http://codepen.io/mzzzk/pen/YpjjPv

（codepenのEmbed貼ろうとしたら貼れないんですねqiita）
Growthbeat を Titanium で使う！

みなさんこんにちは、@isseium です。この記事は [Titanium Advent Calendar 2016](http://qiita.com/advent-calendar/2016/titanium) の11日目の記事です。

最近 Swift をはじめたんですが、高速だったり細かいこと出来るのはいんですが、コード量も多かったり、Alloy のようなWebライクな MVC がなかったり、<del>意外と Titanium も捨てたもんじゃないな</del> やっぱTitaniumだよな！と思っているところです。

今年は @shinout さんの、faster-titanium にはお世話になりました。コード保存したらビルドレスで確認できるの最高ですね。ただ、リアクトなんとかに浮気してらっしゃるようなのが少し心配です。

さて、今年のTitanium開発でなにかオリジナリティ溢れることしたかなーと探しまして、「github に push したら bitrise で Titanium ビルドして、DeployGate で配布する」という一連のインテグレーション環境を整備した話をしたいと思います！

と思っていたのですが、アドベントカレンダーを確認したところ13日目に似たような話がありそう！！！先に宣言していらっしゃった @imoans さんのネタをとるわけにはいかないということで違うネタでいきます！


## Growthbeat を Titanium で使う！


みなさんは Titanium アプリの Push 配信はなにを使っていますか？
Arrow の Notification でしょうか？Titanium と親和性が高くて使い勝手いいですよね〜。Firebase も Push に限らずいいですねぇ。 PubNub なんかは公式 Titanium サポートあっていいですよね。

ただいろいろ考えたすえに、Growthbeat (旧GrowthPush） を使うことにしました。（日本の企業がんばれ！）

が、当然のごとく Growthbeat には公式 Titanium モジュールなど用意されているわけがなく、今回モジュールをつくりましたので紹介します。

## インストール

ここでソースコードを管理しています。

https://github.com/MontoWorks/TiGrowthbeat

[net.ikmz.tigrowthbeat-iphone-1.0.1.zip](https://github.com/MontoWorks/TiGrowthbeat/releases) が最新のモジュールなのでこれを他のモジュールを使うのと同様の手順で zip をプロジェクトホームにおいて、tiapp.xml にモジュールを追記してインストールしてください。

## コード例

alloy.js あたりに書きましょう。

```
Alloy.Globals.Growthbeat = require('net.ikmz.tigrowthbeat');
Alloy.Globals.Growthbeat.init({
    applicationId: "<applicationId>",
    credentialId: "<credentialId>"
});
```

これで使う準備はできました！


あとは適切な場所でトークンを登録すると Growthbeat から Push を受けることができます。


```
Ti.Network.registerForPushNotifications({
  success: function(e){
    Alloy.Globals.Growthbeat.setDeviceToken({deviceToken: e.deviceToken});
  },
});
```



## おわりに

このモジュールは、1年以上前からプライベートで使っていて、準備が整ったらオープンソース化しようと思っていましたが、どうもこのペースだといつまでたっても公開することなさそうなので、このアドベントカレンダーを機に公開することにしました。

本家 Growthbeat SDK をラップしただけですが、最低限のメソッドしかラップしてません。
使い勝手がわるい部分やバグがあると思いますので、 Issue & PR のほどお願いします。日本語でおｋです。
作業ログはscriptコマンドで

いつも作業ログを `history > filename` と出力していたところ、
実行結果も記録される script コマンドを使えばと勧められたので備忘録。

# scriptで作業を記録する

**開始**：

```bash
$ script
スクリプトを開始しました。ファイルは typescript です
```
ファイル名を指定していないと、カレントディレクトリに typescript 作成される。

**ファイル名を指定**：

```bash
$ script filename.txt
スクリプトを開始しました。ファイルは filename.txt です
```


**終了**：

```
$ exit
exit
スクリプトを終了しました。ファイルは typescript です
```
または、`Ctrl + D`


#よく使いそうなコマンド
- `-a`：　同じファイルがあれば追記
【初心者向け】MAMPを使ってa-blog cmsをローカル環境で動作させる

# はじめに
a-blog cmsを扱いはじめて日の浅い私ですが，今回は初心者向けということでMAMPを使ってa-blog cmsをローカル環境で動作させる手順について備忘録かつこれからa-blog cmsを勉強したいという人に向けて紹介したいと思います．

# 1.MAMPのインストール
[MAMP公式](https://www.mamp.info/en/downloads/)からOSを選択してダウンロード＆インストール

# 2.MAMPの設定
/Application/MAMP
からMAMPを起動
「Preference」をクリックし，「Ports」のタブから「Set Web & MySQL ports to 80 & 3306」をクリックして「OK」
<img width="536" alt="スクリーンショット 2016-12-05 14.11.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/88369/8f549349-ad4c-8cb2-08ed-0508def15d9f.png">

<img width="536" alt="スクリーンショット 2016-12-05 14.11.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/88369/bf5583cc-3473-1155-0e52-661db1db6933.png">

同じく「PHP」のタブからPHPのバージョンを5.6.xへ
これはa-blog cms では，ionCube Loader の関係で 5.6.x までしか現状は利用できないため
<img width="536" alt="スクリーンショット 2016-12-05 14.11.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/88369/57666104-205b-fec9-78fb-0b837da4e59c.png">

事前にapacheやmysqlを起動させている場合
```sudo apachectl stop
mysql.server stop```
などで停止させる
「サーバーを起動する」を押すと
http://localhost/ でアクセスできるようになる
<img width="162" alt="スクリーンショット 2016-12-05 15.56.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/88369/be99bc01-fcb8-78dc-39d3-847843f70a13.png">

# 3.a-blog cmsのダウンロード
[a-blog cms公式](https://developer.a-blogcms.jp/download/)からzipをダウンロードする
この際，使用しているPHPのバージョンのものをダウンロードする
今回はa-blog cms（通常版 php5.6.x）の新規インストール版をダウンロード

# 4.a-blog cmsを準備する
ダウンロードしたファイルを解凍し ablogcmsフォルダのファイルやディレクトリすべてを 
/Applications/MAMP/htdocs に移動させる
<img width="413" alt="スクリーンショット 2016-12-05 15.07.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/88369/b194c933-0961-8917-ea9a-6048ec5790fb.png">

# 5.htaccessを用意する
以下のhtaccess.txtを.htaccessにリネームする
/Applications/MAMP/htdocs/htaccess.txt
/Applications/MAMP/htdocs/archives/htaccess.txt
/Applications/MAMP/htdocs/archives_rev/htaccess.txt
/Applications/MAMP/htdocs/media/htaccess.txt
/Applications/MAMP/htdocs/private/htaccess.txt
/Applications/MAMP/htdocs/themes/htaccess.txt

ターミナルで
```mv /Applications/MAMP/○○○/htaccess.txt /Applications/MAMP/○○○/.htaccess```
などの方法でリネームできる

# 6.ionCubeローダーをインストールする
[こちら](http://www.asial.co.jp/ioncube/encoder/download_loaders.php)から環境に適したファイルをダウンロードし，/MAMP/htdocs/ に「ioncube」ディレクトリごとコピーする
今回はOS X (64 bits)をダウンロード

# 7. php.ini の設定
ionCubeローダーを動作させるために，php.ini を修正する
ファイルの場所は/MAMP/bin/php/php5.6.27/conf/php.ini
ファイルの場所は使用しているPHPのバージョンに合わせる
今回はPHP5.6.27を使用しているのでこのパス

任意のテキストエディタで最後の行に以下の記述を追加
```zend_extension="/Applications/MAMP/htdocs/ioncube/ioncube_loader_dar_5.6.so"```
5.6の部分は使用しているPHPに合わせる
<img width="950" alt="スクリーンショット 2016-12-05 15.10.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/88369/f1c6629c-3348-8a08-d45d-a70044c34ec9.png">

# 8.MAMPを再起動し，a-blog cmsをインストール
MAMP を再起動し，http://localhost/　
にアクセスするとa-blog cms のインストール画面が表示される
あとは，画面の指示にしたがって必要事項を入力することでインストール完了
MAMPの標準設定のままであれば，3ステップ目のデータベース設定は以下のようになる
>データベースサーバー名	localhost
>データベース名	DBablogcms
>データベースユーザー名	root
>データベースパスワード	root
>テーブル先頭文字列	acms_
>データベース文字コード	UTF8

htdocs内のsetupディレクトリは不要になったので削除したら完了

![a blog cms インストールウィザード8-min.png](https://qiita-image-store.s3.amazonaws.com/0/88369/84d03653-7555-596b-eab0-aa841cd16c78.png)
js 多次元配列 一番大きい数を取り出す

#JavaScript　多次元配列の各配列の一番大きい数字の取り出し方

```script.js

function largestOfFour(arr) {
//write your code.
  return newArray;
}

largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]); //欲しい答え [27,5,39,1001] 
```

例 

```script.js
([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]])  //欲しい答え [27,5,39,1001] 

([[4, 9, 1, 3], [13, 35, 18, 26], [32, 35, 97, 39], [1000000, 1001, 857, 1]]) //欲しい答え [9, 35, 97, 1000000]
```

##一番最初に試したコード

```script.js

function largestOfFour(arr) {
  var newArray = [];
  var max = 0;
  for(var i = 0; i < arr.length; i++){
      for(var j = 0 ; j < arr.length; j++){
        if(max < arr[i][j]){
          max = arr[i][j];
        }
        if( j === arr.length-1){
        newArray.push(max);
          max = 0;
        }
      }
  }
  return newArray;
}

largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
```

##考え方
多次元配列の要素の配列をarr[i],その数字をarr[i][j]で表す。
arr[i][j]をfor文で比較して一番大きいものをmaxに入れる。
要素の配列で比較が終わったら、newArrayにmaxを格納、maxを初期化して次の要素の配列の比較へ。
すべての処理が終わったら　newArrayを返す。

##教えていただいたコード

```script.js
function largestOfFour(arr) {
  return arr.map(function(subArr){
    return subArr.reduce(function(x,y){
      return Math.max(x,y);
    })
  }).join(',');
}
largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
```

```js
function largestOfFour(arr) {
  return arr.map(Function.apply.bind(Math.max, null));
}
largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
```
他にも良い方法がございましたら教えていただけると幸いです。
JUMAN++を使って苦労したこと

Fujitsu Advent Calenderの記事です。
実は出遅れてしまったのですが、何か書きたいと思い、誰もいない過ぎてしまった日にこっそり投稿させて頂きました。

- [1枚目](http://qiita.com/advent-calendar/2016/fujitsu)
- [2枚目](http://qiita.com/advent-calendar/2016/fujitsu_ext)←こっちの2日目です

---

# はじめに

形態素解析、といえばMecabを思い浮かべる方が多いと思います。もちろん私もそうでしたが、先日(といっても1ヶ月くらい前ですが)知人に、 __RNNを使ったJUMAN++なる新しい形態素解析器が出て、なんと"外国人参政権(※)"を正しく分かち書きできるらしい__ ということを聞き、興味をもったので挑戦してみました。

今回は環境構築と実際に実行するまでに詰まったところを共有したいと思います。

環境構築手順に関しては[こちら](http://qiita.com/riverwell/items/438e88427363511e9f28)を参考にさせて頂きました。

※MecabやJUMAN++の前のJUMANだと「外国 / 人参 / 政権」となってしまいます


# 環境構築
私の開発環境はUbuntu14.04なのですが、JUMAN++のインストールの際に必要な「Boost C++ Libraries」をなぜかインストールすることができませんでした。
そこでDockerを使い、公式で推奨されているCentOS上で環境構築しました(Cent OS 6.7 で動作を確認、とあったので今回はCentOS7にしました)

## Boost C++ Librariesのインストール

JUMAN++の導入に関する記事は先ほど紹介したものの他にもたくさんあったのですが、Boost C++ Librariesの導入に関して、見つけられなかったので載せておきます

~~~bash
$ wget https://sourceforge.net/projects/boost/files/boost/1.62.0/boost_1_62_0.tar.gz
$ tar xvzf boost_1_62_0.tar.gz
$ cd boost_1_62_0 && sh bootstrap.sh && ./b2 install -j2
~~~

## pythonから使う際の文字コード

[こちら](http://qiita.com/riverwell/items/7a85ebf95647eaf18a6c)を参考にPythonからJUMANN++を使おうとしていたのですが、文字コードで怒られてしまいました。
どうやらPYTHONIOENCODINGという環境変数に文字コードを設定する必要があったみたいです。

~~~bash
$ export PYTHONIOENCODING=utf-8
~~~

# 実行時

Python3.4からのJUMAN++を呼び出して、[livedoorニュースコーパス](http://www.rondhuit.com/download.html#ldcc)を形態素解析する際に引っかかったところを書きます。
下記2点とも知人の環境では起こらなかったらしいので、何か私がインストールするものが足りてないのかもしれませんが、ご参考までに。

## 半角スペース

形態素解析に半角スペースが入っていると、エラーは起こらないのですが、実行後固まってしまうという現象が起こりました。
解析の際は半角スペースを消したのですが、英語の分かち書きがうまくできなかったので全角スペースに置換すればよかったかもですね。

## 文頭の#, @

文章中に含まれている文には問題ないのですが、分かち書きするためにJUMAN++に投げる文章の1文字目が@か#だと、こちらも固まってしまうという現象が起こりました。
こちらも文頭の@や#は削除するという方法で対処しました。

# 所感

最後にJUMAN++を使ってみた感想ですが、私のPCが弱いということもあると思うのですが、処理が遅いということが気になりました。
livedoorニュースコーパスの分かち書きの際、Mecabは10秒ほどで終わったのに対し、JUMAN++は __10時間以上__ かかってしまい、ほぼ半日動かし続けることになってしまいました。
処理速度は圧倒的にMecabに軍配があがるので、完全にMecabの上位互換というわけでもなさそうです。
とは言っても、やはりJUMAN++の能力は魅力的なのでうまいこと使えるようになりたいですね。
AmazonDashButtonとLineNotifyで気持ちを伝える

このエントリは[NIJIBOX Advent Calendar 2016](http://qiita.com/advent-calendar/2016/nijibox)の11日目です。

#### はじめに
AmazonDashButtonを使用して、LineNotifyにメッセージを投稿してみようと思います。
しかし、AmazonDashButtonひとつでは気持ちを伝えることは難しいです。
そこで、モールス信号を使うことを思いつきました:zap:
モールス信号ならば、ドット、ダッシュ、スペースの3種類で50音が表現可能です。

#### 用意するもの
* AmazonDashButton×3 :innocent:

#### セットアップ
[リポジトリ](https://github.com/re-fort/amazon-dash-ton-tsu)を参照してください。

#### デモ
`npm start`でlistenした後、3つのAmazonDashButtonを駆使して、メッセージを作成していきます。
![Screen Shot 2016-12-11 at 00.44.19.png](https://qiita-image-store.s3.amazonaws.com/0/98379/ec2deeb2-fb2b-7e73-6672-18411a559425.png)

作成したメッセージがLine Notifyに通知されます。
![Screenshot_2016-12-11-00-42-37~01.png](https://qiita-image-store.s3.amazonaws.com/0/98379/bada74a1-9a04-3bb8-db17-b818270fb6fb.png)


#### 余談
このままではボタンを押すたびに通知が来てしまうので、設定から通知を切ることをオススメします。
![Screenshot_2016-12-10-15-35-33_01.png](https://qiita-image-store.s3.amazonaws.com/0/98379/34327000-41be-174f-59c2-34ff7bf2c490.png)
AIR製ゲームの紹介 サモロスト3

こちらはFLASHerのAdventカレンダー2016(その2)の11日目の記事となります。
http://qiita.com/advent-calendar/2016/flasher2

#なんだこのゲームは！？:astonished:
 
スマホとSteamに衝撃的なビジュアルのゲームが登場し、大変好評となっております。そして、この作者の作品は毎度AIR製なんですね〜。

<img width="799" alt="sm3.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/63935d58-6fc3-734a-ea6c-3dd33c3c141f.png">

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">Samorost3 公式動画<a href="https://t.co/LWEfeoih70">https://t.co/LWEfeoih70</a></p>&mdash; side of the belly (@harayoki) <a href="https://twitter.com/harayoki/status/807613808667553792">December 10, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

絵本タッチアクションみたいなやつですね。どこかをタッチすると物語が進行する。子供向けにもこのジャンルもっと定着してもいいと思うんですが。AIR製ではありますがStage3D(StarlingみたいなGPU利用フレームワーク)は使ってないと予測します。（雰囲気から判断しているだけですが。。）つまりAnimateCCのタイムラインでできているのではないかと。

こういうのこそAIRアプリで推していきたいですねえ。

# リンクなど:point_up:

公式
http://samorost3.net/

iOS (App Store Best of 2016!)
https://itunes.apple.com/app/samorost-3/id1121782467

Android
https://play.google.com/store/apps/details?id=amanita_design.samorost3.GP

Steam
http://store.steampowered.com/app/421120/?l=japanese

13年ほど前、FWAのサイトオブDAYか何かか忘れましたが、取り上げられたあの衝撃的なサイトの続編ですね。
懐かしいサイトはこちら。1も２も無料プレイ可能。要Flash Playerなのでスマホでは遊べませぬ。
http://amanita-design.net/samorost-1/
http://amanita-design.net/samorost-2/

以上です！
jQuery 子要素を含まない text() が欲しい時

#子要素を含んでしまうタイプのHTML
こういうの昔から悩んでいました。

```html:
<div class='oya'>
親のテキスト
<span class='ko'>子のテキスト</span>
</div>
```

```javascript:
$(".oya").text(); //親のテキスト子のテキスト
```

ちがーーーうう！！！
親のテキストだけがほしいんじゃー！！


抗ってみる

```javascript:
$($(".oya")[0].outerHTML).children().empty().parent().text();
//親のテキスト
```

お、いけそうじゃん？

じゃあ、いっそ関数化してみよう

#jQueryで関数化

```javascript:
function getFirstText(selector){
    return $(selector[0].outerHTML).children().empty().parent().text();
}
```

・・・子要素が無いと空っぽの戻り値が返ってくる＼(^o^)／ﾅﾝﾃｺｯﾀ

``children()``の戻り値が``length == 0``の場合、それ以降にセレクタが機能しないので
``parent()``が意味を成さないようだ。

1ラインステートメントはやめて真面目に書けばよかったのだ。

```javascript:
function getSurfaceText(selector){
    var elem = $(selector[0].outerHTML);
    elem.children().empty();
    return elem.text();
}
```

```javascript:
getSurfaceText($(".oya"));
//親のテキスト
```

いけたー！

でも、どうせ関数化するならと、ちゃんとバニラなJavascriptで書き直してみた。

#Javascriptのみで関数化

```javascript:
///一番上のノードにあるテキストを全部集めて返す。
function getSurfaceText(element){
	var text = "";
	for (var i = 0; i < element.childNodes.length; i++) {
		if (element.childNodes[i].toString() == '[object Text]'){
			text += 
                element.childNodes[i].data;
		}
	}
	return text;
}

///一番上のノードで最初に見つかったテキストを返す。
function getFirstText(element){
	for (var i = 0; i < element.childNodes.length; i++) {
		if (element.childNodes[i].toString() == '[object Text]'){
			
            return element.childNodes[i].data;
		}
	}
	return "";
}
```

**jQueryからの使い方**

```javascript:
getSurfaceText($("#ahya")[0]);
```

こんな感じで、セレクタではなく、エレメントを渡してあげて下さい。


いつもjQueryばっかり使っていると忘れてたけど、ノードを直接さわるとか超懐かしい。そうそう、こんなだったよ。

バニラなjavascriptのほうが、こういうのは得意だったんだ。
テスターのメンタル・ライフ

## はじめに

この記事は、[ソフトウェアテスト Advent Calendar 2016](http://qiita.com/advent-calendar/2016/softwaretesting) 10日目の記事です。

## ここで書くこと

前職の同僚から教えてもらったテストに対する考え方を紹介します。
[システムの品質とUTについて | アライドアーキテクツ エンジニアブログ](http://tech.aainc.co.jp/archives/10151)


## テスターのメンタル・ライフ
出展: [Software Testing Techniques, 2nd Edition](https://www.amazon.com/Software-Testing-Techniques-Boris-Beizer/dp/1850328803)


| Phase | Mental |
|:----:|:--------|
|Phase 0|There’s no difference between testing and debugging. Other than in support of debugging, testing has no purpose.|
|Phase 1|The purpose of testing is to show that the software works.|
|Phase 2|The purpose of testing is to show that the software doesn’t work.|
|Phase 3|The purpose of testing is not to prove anything, but to reduce the perceived risk of the software not working to an acceptable value.|
|Phase 4|Testing is not an act. It is a mental discipline that results in low-risk software without much testing effort.|

### Phase 0
> There’s no difference between testing and debugging. Other than in support of debugging, testing has no purpose.

『テストとデバッグには何の差もない。デバッグ以外にはテストに目的はない。』

### Phase 1
> The purpose of testing is to show that the software works.

『テストの目的は、ソフトウェアが動くということを示すことである。』

### Phase 2
> The purpose of testing is to show that the software doesn’t work.

『テストの目的は、ソフトウェアが動かないということを示すことである。』

### Phase 3
> The purpose of testing is not to prove anything, but to reduce the perceived risk of the software not working to an acceptable value.

『テストの目的は、何かを証明することではなく、ソフトウェアが動かないことによって発生するリスクをある許容範囲にまで減らすことである。』

### Phase 4
> Testing is not an act. It is a mental discipline that results in low-risk software without much testing effort.

『テストは活動ではない。そもそもテスト以前に品質の高いソフトウェアを作るための精神的な訓練である。』

## おわりに

テストの目的は「バグがないことを証明するため」と考えている人が多いのではないでしょうか？
これはメンタル・ライフでいうと、Phase 1の『テストの目的は、ソフトウェアが動くということを示すことである。』の段階にとどまっています。

そもそも「バグがない」と言える状況にまで持ってくるのは、めちゃくちゃ大変です。
正常系の処理は問題なくても、以下のような要因に左右されてバグは発生してしまいます。

+ アクセス負荷の状況
+ ブラウザ・OSの種類
+ ネットワークの状態
+ 連携外部サービスの状態

また、このAdvent Calendar 7日目の[プログラマーも手動テストしようぜ 〜 忍者式テストのすすめ 〜](http://qiita.com/ledsun/items/b6c22afe321ac3052182)では以下のように述べられてます。

+ プログラマーはあらかじめ知っている不具合しか見つけられない
+ 自分のプログラムに不具合があるとは思いたくない

この指摘はとても刺さりました。自分もメンタル・ライフでいうとまだまだPhase 1の段階なので、バグは存在するという現実に向き合って、メンタル・ライフのPhase 2 ~ Phase 4に成長できるように頑張りたいところです。