OmniAICreator/Qiita-1.07M huggingface dataset:
始めての技術分野のトレンドの調べ方

新しいプロジェクトを始めるにあたり、採用する「プログラム言語」や「フレームワーク」や「開発環境」と言ったレイヤーに複数の選択肢が考えられることがあります。特にその分野の知識が無くて、とりあえず各選択肢の世間的なトレンドが知りたい場合の調査方法の紹介です。

##Google検索で調べる
紹介するまでもない方法ですが、[Google](https://www.google.co.jp/)でキーワード検索すると、キーワードにヒットしたページの件数が見れます。この件数の多さの比較で、各選択肢の世間的な認知度の比較ができます。
テクノロジー系のプロダクトは、RubyやMustache等、一般定期な単語をそのまま使用している事も多いので、検索キーワードには気をつけましょう。
また、検索結果から公式サイトへ飛んでドキュメントを確認することにより、開発体制の多さとか、今現在も活発に開発されているかの感触を確かめる事もできます。

##Googleトレンドで調べる
Googleのキーワード検索では、時系列の情報を見るのは難しいですが、[Google trends](https://www.google.co.jp/trends/)だと、過去からの人気度が時系列で確認できます。

Java,Ruby,Pythonの比較例
<img width="853" alt="スクリーンショット 2016-03-26 22.54.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/88743/30af2d54-e207-850d-e172-3a0cbe12a286.png">

##Githubで調べる
いまどきのオープンソースプロジェクトの多くは、[Github](https://github.com)で管理されています。このため、Githubで運用されているプロジェクトどうしなら、リポジトリでStar数で人気度の比較が出来ます。また、貢献者(Contributions)の人数や更新頻度での比較も出来るでしょう。

Mithrilの例(Star数は5747,Contributionsは118)
<img width="1024" alt="スクリーンショット 2016-03-27 15.40.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/88743/6e536bed-653a-30a0-207f-f546762010aa.png">



##Amazonで調べる
[Amazon](http://www.amazon.co.jp/)でその分野に関する書籍が何種類発行されているかで比較することができます。ある程度以上のプロジェクトになら無いと比較できませんが、1年以内に複数の日本語書籍が発行されている場合は、今注目の技術と言えるでしょう。

##各言語のライブラリ管理システムで調べる
今現在広く使われているプログラミン言語なら、膨大に作成されたライブラリの依存関係を管理するエコシステムを持っているものです。このライブラリを管理するシステムのサイトで各ライブラリの人気度がわかることがあります。

iOSだと、[CocoaPods](https://cocoapods.org)で各ライブラリのダウンロード数が見れます。

Rubyだと、[RubyGems](https://rubygems.org/)で各ライブラリのダウンロード数が見れます。

Javaだと、[mvnrepository](http://mvnrepository.com/)でMavenに登録されているライブラリを検索できます。検索結果からはダウンロード数はわかりませんが、他のライブラリで使用されている件数が「usages」として表示されているので、間接的に人気度を知ることができます。



##ThoughtWorksで調べる

メジャーなトピックだと、ThoughtWorks社の[Technology Rader](https://www.thoughtworks.com/radar/languages-and-frameworks)で、評価を見れることがあります。「ADOPT」(採用)とされているものが、ThoughtWorks社が高くの評価しているテクノロジーです。導入を検討するのに、悪く無い選択肢と判断してよいでしょう。[アルファベット順](https://www.thoughtworks.com/radar/a-z)の一覧もあります。


##Qiitaで調べる
選択肢にしているテクノロジーがタグ付けされているなら、投稿数で人気の比較ができます。
Spring Boot解説第3回(開発環境編：eclipseの設定)

こんにちは！
株式会社情創 技術開発局の@YAKINIKUです！

今回はeclipseの設定について解説します。

※今後しばらくは開発環境編です。

# Git設定
第1回で解説した通り、ソース管理にGitbucket3.9を使用します。Gitを使用するためにeclipseの設定を行う必要があります。

eclipseを起動し、ウィンドウ⇒設定⇒チーム⇒Git⇒構成からユーザー設定を行います。画面右側のエントリーの追加より、ユーザー名とEメールアドレスをそれぞれ追加します。
デフォルトでuserのnameおよびemailが存在したら除去します。
![image](https://qiita-image-store.s3.amazonaws.com/0/116032/aa2a4744-dad8-7aca-2ff0-693a75467872.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/116032/7a0fa6a1-2854-2809-c6f5-ced3f8842d06.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/116032/83a3823a-d697-78e4-e352-d1ad682b0c61.png)

ユーザー設定の画面に追加した情報が表示されていればOKです。

# リソースの除外解除
ビューから除外する対象にリソースが含まれている場合、それを解除します。
パッケージ・エクスプローラーの逆三角マークをクリックしてフィルターを選択します。

![image](https://qiita-image-store.s3.amazonaws.com/0/116032/826369b8-daa9-0819-462c-1f427bca87ad.png)

.*リソースのチェックを解除したら完了です。
![image](https://qiita-image-store.s3.amazonaws.com/0/116032/d4b6bd0b-e44a-2424-ef40-316a8f3bbf54.png)

# Gradleタスクの表示
Gradleのタスクを表示するには、ウィンドウ⇒ビューの表示⇒その他を選択します。
その後Gradle⇒Gradle タスクを選択し、OKを押します。このとき選択するのはアイコンが濃い緑色のものであることに注意してください。
![image](https://qiita-image-store.s3.amazonaws.com/0/116032/3afce1b4-1707-7330-2adb-5e69f2945233.png)


# MyBatis Declarationの表示
MyBatis Declarationの表示もGradleタスクと同様です。
ウィンドウ⇒ビューの表示⇒その他から、MyBatis⇒MyBatis Declarationを選択してOKを押します。
![image](https://qiita-image-store.s3.amazonaws.com/0/116032/03c50291-bce2-b8f0-1e0b-784935463be3.png)


今回はここまでです。
開発環境編はこんな感じで続いていきます。

それでは、また次回以降にお会いしましょう！
[Apache Spark入門メモ]その１ - 開発環境構築

最近、Sparkを始めたので備忘録がてら入門向け記事を書いていきます。
まずは開発環境から。

なお、特に依存するところは無いと思いますが、
Windows 10が私の開発機なので、自動的にWindows10対応版のSpark開発環境構築手順となります。

はじめに
=================

今回はSparkの開発環境はWindows上で作ります。
~~いくつか「インストール」系の記事を探した感じだと環境変数やHadoop/Sparkのインストールをしていますが、~~
~~単純に開発するだけなら、現在は不要な気がします。クラスタ組むためには必要な気がしますが、それはまた別な話。~~
ファイル操作をするためにはwinutils.exeだけは入れる必要があるみたい。

また、開発言語はScalaのイメージが強いですが、Javaでの開発も可能です。※ 他にもPythonとかRも選べます。
Java8のラムダ式の導入により、ずいぶんと書きやすくなったのでJavaでの開発も結構アリかと思います。

ただ、Javaのラムダ式に対応していないAPI、Scalaのimlicit def等を前提としたDSLライクなAPIも結構もあります。
なにより、多くのドキュメントはScalaやPythonをベースに書かれてる事が多いので、情報収集を含めると少し開発は面倒かもしれません。
その反面、開発言語を変えなくても良いので、ある程度人数の多い開発チームならJavaは有力な選択肢となります。

Scalaの開発環境
==================

まずは定番中の定番、Scalaでの開発環境。
IntelliJ IDEA + sbt + Lightbend Activatorを使います。
Activatorはビルドプロジェクトのテンプレートで、よく使う構成がサクッと作れます。
これで「どんなsbt書けば良いんだ？」って毎回悩まなくていいので素敵ですね！

まずはIntelliJのインストールをします。
まだ、インストールしてない方は、[こちら](https://www.jetbrains.com/idea/)から、ダウンロードしてインストールしてください。

続いて、IntelliJのScalaプラグインを入れます。

```
1. IntelliJ 起動
2. File -> Settings -> Plugins
3. 「Scala」プラグインをインストール
```

次にプロジェクト作成です。
ActivatorをScalaプラグインがサポートしているので、そちらで作ります。
このタイミングでScalaやSaprk関連のモジュールが自動でインストールされるので、結構時間がかかります。

```
1. File -> New -> Project -> Scala -> Activator
2. Project Nameを設定 ※ 「-」とかは使えないのでキャメルケースで。
3. 「Spark Tutorial provides a quick introduction to using Spark」を選択
4. Finish
```

Javaの開発環境
================

いくつかの理由によりSparkをScalaではJavaで開発したいときもあるでしょう。
安心してください。SparkはJavaもサポートしてます。
IntelliJでの開発も可能ですが、個人的な趣味でJavaではNetBeans + Mavenでの開発環境を構築します。

まずはNetBeansをインストールします。
まだ、インストールしてない方は。[こちら](https://netbeans.org/downloads/)から、ダウンロードしてインストールしてください。

次にプロジェクトの作成です。
Mavenで作成することになります。

```
1. File -> New Project -> Maven -> Java Application
2. 「Project Name」を設定
3. 「Project」の「Dependencies」を右クリックして「Add Dependencies」をクリック
4. 「org.apache.spark % spark-core_2.11 % 1.6.1」と「org.apache.spark % spark-sql_2.11 % 1.6.1」を依存に追加
5. Finish
```

winutils.exeのインストール
========================

最低限の機能だけなら、IDEだけで動作するのですが、例えばHDFSを使おうとするとそれだけではエラーになります。
Windowsであればwinutils.exeを入れることで回避できるので、その方法を記載します。

まずは下記からダウンロードしてください。
http://public-repo-1.hortonworks.com/hdp-win-alpha/winutils.exe

続いて下記ディレクトリを作成。分かりやすくCドライブ直下にしましたが、場所はどこでも大丈夫です。

```
C:\hadoop\bin
```

ここに先ほどダウンロードしたwinutils.exeを配置します。

配置後、環境変数を登録します。


```
HADOOP_HOME=C:\hadoop
```

これで、ファイル操作も実施可能になります。

まとめ
==============

これで、開発環境が出来たので次回は簡単なHello Worldプログラムを書いていきます。
それでは、Happy Hacking!
Reduce関数活用例：複利計算シミュレーション


関数型言語でよく使われるReduce処理の活用事例です。これまでどんな時に使うとスマートなのかわからなかったのですが、複利計算なんかでばっちり使え、イメージがつかめたので紹介します。
基本的な使い方なので、いまいち使いどころがつかめない人向けです。

※以下はＲ言語の例ですがいろいろな言語で使われる考え方です。

# Reduceとは

Reduce関数とは…

> 隣り合う 2 つの要素に対して（左から右へ）同時に関数を適用し、単一の値にします。

なるほど、わからん。

例えば、以下のような配列（ベクトル）があった場合

```r:ベクトル
> data<-c(1,2,5,7)
> data
[1] 1 2 5 7
```
要素を左から順に取り出して処理、を繰り返して、最終的に１つの値にするみたいです。
例えばこう書いた場合

```r:sumの例
> Reduce(function(a,b){a+b},data)
```

1. data[1]とdata[2]が関数の引数a,bに入ります
1. a+b ("1"+"2")が実行されます
1. ↑の結果の"3"とdata[3]が関数の引数a,bに入ります
1. a+b("3"+"5")が実行されます
1. ↑の結果の"8"とdata[4]が関数の引数a,bに入ります
1. a+b("8"+"7")が実行され、15が答えとして出てきます

なお、Ｒ言語の場合は引数に`accumulate=TRUE`を入れると途中経過が見れます。

```r:accumulate
> Reduce(function(a,b){a+b},data,accumulate = T)
[1]  1  3  8 15
```

# 半分だけ理解できる例

なかなか使いどころがわからず、いろいろ調べているとこんな例がありました。

Reduceで最小値を見つける！

```r:最小値
> Reduce(function(a,b){ifelse(a<b,a,b)},data)
[1] 1
>#こっちでいい
> min(data)
[1] 1
```
Reduceを使うと、小さい方を選ぶだけで最小値が見つかるよ！という例です。
いや、min()でいいじゃんとツッコミましたが、１つずつ値を比較していくという動きはわかります。ただ、順番に結果を受け渡していくメリットがイメージしにくいです。
と、もやもやしているとちょうどいい例を発見しました。

# 複利計算してみよう

複利とは、預金などで元本に対して利息が発生した場合、元本+利息を次の元本に組み入れるものです。

100万円預けて、年5%（値は適当です）の利息が付く場合。
100 → 105 → 110.25 → 1115.76 → 121.55
と年々増え方が徐々に大きくなっていきます。

では20年後にどうなっているか、を計算してみます。

```r:複利計算
> 利息<-c(1.05,1.05,1.05,1.05,1.05,1.05,1.05,1.05,1.05,1.05,
>        1.05,1.05,1.05,1.05,1.05,1.05,1.05,1.05,1.05,1.05)
> Reduce(function(a,b){a * b},init=100,利息,accumulate = T)
> 
 [1] 100.0000 105.0000 110.2500 115.7625 121.5506 127.6282 134.0096
 [8] 140.7100 147.7455 155.1328 162.8895 171.0339 179.5856 188.5649
[15] 197.9932 207.8928 218.2875 229.2018 240.6619 252.6950 265.3298

#途中で利息が変わっても大丈夫
> 利息<-c(1.05,1.05,1.05,1.05,1.05,1.05,1.05,1.04,1.04,1.04,
>        1.03,1.03,1.02,1.02,1.01,1.01,1.01,1.01,1.01,1.01)
> Reduce(function(a,b){a * b},init=100,利息)
[1] 185.4506
```

年利配列を作り、初期値に100を設定。順に年利をかけていくと推移が計算できます。

# おまけ：シミュレーションがしたかった

上の例では単に利息を計算するだけですが、年利がガンガン変わっていくような投資をした場合、数年後に得られる収益のシミュレーションというのを考えていました。

個別に名前は出しませんが、ぱっと目についた投資信託商品で

- 平均年利が4.07%
- 年利のばらつき（標準偏差）が13%
- 年ごとの手数料が1.3%

というものがありました。

年利は定期預金なんかに比べるとかなり高いです、しかし年により当然ばらつきがあるので損するときもあるはずです。
この商品を２０年運用した場合、果たしてどのぐらいお金が増えるのか、シミュレーションしてみましょう。

初期資金100万円、さらに毎年20万追加するような場合を考えてみます。
年利は標準偏差13%をベースにランダムに変えます。
それを10000回試してみて、収益がどうなるでしょうか。

```r:投資信託シミュレーション
年利<-1.04075
標準偏差<-0.1318
初期資金<-100
信託報酬<-0.0135
追加<-20
年数<-20

#試行回数
sample<-10000

#計算用ベクトル
data<-c(初期資金,seq(1,1,length=年数)*追加)
#結果保持用
ret<-data.frame(rep(0,times=sample))

#複利計算をsample回繰り返して保持する
ret<-apply(ret,1,function(v){
  Reduce(function(a,b){
    return((a*(年利+rnorm(1)*標準偏差)+b)*(1-信託報酬))
  },data)
})

#損益に換算
ret2 <- ret - sum(data)
#ヒストグラム
h<-hist(ret2,breaks = 100)

#黒字率
sum(ret2>0)*(100/sample)
#[1] 73

#合計投資額
sum(data)
#[1] 500

summary(ret2)
#   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#-343.70  -12.06  128.50  183.00  316.50 2055.00 
```

![image](https://qiita-image-store.s3.amazonaws.com/0/83530/f6b302a7-3089-2a6e-c633-c2e87c3da685.png)

中央値は+128.5万なので期待できそうです。
しかし、年利4%でもばらつきが多いため、20年後に黒字になる確率は73%程度になってしまうようです。

もちろん、本当に投資シミュレーションしようと思うともっと考慮する要素はあると思いますが、大雑把にでもさくっと計算できるのはプログラマーの特権（？）ですね。

あと、計算～グラフ化・集計までささっとできるＲ言語は結構便利です。
AD2 > Link > reference manual > 9.2. Analog Outputs (Arbitrary Waveform Generator) > Slew rate (10V step): 400V per μs

@ [reference manual](https://reference.digilentinc.com/analog_discovery_2:refmanual#analog_outputs_arbitrary_waveform_generator) 9. Features and Performances > 9.2. Analog Outputs (Arbitrary Waveform Generator)

> Slew rate (10V step): 400V/μs

http://www.tij.co.jp/lsds/ti_ja/analog/glossary/slew_rate.page
> オペアンプの出力が、単位時間内に上昇、もしくは下降できる最大の電圧変化量のことである。
AD2 > Link > reference manual > 9.1 Analog Inputs (Scope) > Sampling modes: average, decimate, … > downsampling | aliasing distortion

@ [reference manual](https://reference.digilentinc.com/analog_discovery_2:refmanual#features_and_performances) 9. Features and Performances > 9.1 Analog Inputs (Scope)

> Sampling modes: average, decimate, min/max 18)

decimateというのは初めて見た。

https://en.wikipedia.org/wiki/Decimation_(signal_processing)
> In digital signal processing, decimation is the process of reducing the sampling rate of a signal.[1][2][3] Complementary to interpolation, which increases sampling rate, it is a specific case of sample rate conversion in a multi-rate digital signal processing system. Decimation utilises filtering to mitigate aliasing distortion, which can occur when simply downsampling a signal

downsampling の問題(aliasing distortion)を克服する方法のようだ。
技術英語 > [six out of the seven] major players are foreign-owned companies / in nine cases out of ten


@ LOE > February 7, 2003

http://loe.org/shows/shows.html?programID=03-P13-00006

> For example, in the United States, <font color=red>six out of the seven</font> major players are foreign-owned companies 

sevenの前にtheが付いている。
文脈からsevenのものが特定できるからなのだろう。

<hr>
関連して思い出すのは

http://eow.alc.co.jp/search?q=nine+cases+out+of+ten
> in nine cases out of ten
> 十中八九（は）

http://qiita.com/7of9/items/773ef623696acb9380ab

こちらはtenの前にtheは付いていない。
Java Swing 勉強メモ - フレーム作成

Javaのプログラミングを学ぶ中で、GUIのアプリケーションを作成したいと思い
JavaSwingの勉強を始めた。

とりあえず、できるようになったことをメモ

#フレームの作成

まず、アプリケーション画面のフレームを作るためには
JFrameクラスを使用する。

```java
import javax.swing.JFrame;
```
でインポート。
コンストラクタを使ってJFrameオブジェクトを作る。
引数として文字列を渡すとそれがタイトルになる。

```java
JFrame frame = new JFrame("タイトル");
```

このままでは表示できないので、表示させるためにsetVisibleメソッドを使用する。
使い方は

```java
frame.setVisible(true);
```
と、trueを渡すことで表示することができる。
これで実行すると
<img width="139" alt="スクリーンショット 2016-03-28 2.52.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/116320/31a02988-053c-df07-a1e5-49c3c3f7b341.png">
という感じになる。現時点ではフレームのサイズを設定していないため最小限のサイズで表示される。

ここまでのソース

```java

import javax.swing.JFrame;
public class MySwing {
    public static void main(String[] args) {
       JFrame frame = new JFrame("タイトル");
       frame.setVisible(true);
    }
}

```
#サイズ・位置指定

フレームのサイズの設定は setSizeメソッドを使用することで可能

```java
frame.setSize(300,300);
```

また、サイズと同時に、PC画面上のどの位置に表示させるかを指定するsetBoundsメソッドもある

```java
frame.setBounds(100,100,300,300);
```

第１、２引数で場所の指定(x,y)、３、４引数でフレームのサイズ(x,y)の指定となっている

これでフレームの形ができる

<img width="372" alt="スクリーンショット 2016-03-29 2.20.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/116320/6ecf44dc-a143-0fce-7e9c-1fcd894d3cba.png">

また、どのPCでもアプリケーションウィンドウを画面中央に置きたい場合は
setLocationRelativeTo()メソッドを使用。nullを渡すと常に中央にくる。

```java
frame.setLocationRelativeTo(null);
```

とりあえずフレームは完成したが、このままでは左上のXを押した時、ウィンドウは消えるけど
アプリケーションは終了できていない状態になる。

そこで、Xを押した時アプリケーションも終了させるには
setDefaultCloseOperation()メソッドで終了オプションを設定する必要がある

```java
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
```

引数として渡している　EXIT_ON_CLOSE　が「Xを押した時にアプリも終了する設定」となっている。
デフォルトは　HIDE_ON_CLOSE (フレームを非表示にする）

#全ソース

```java
import javax.swing.JFrame;

public class MySwing {
    public static void main(String[] args) {
       JFrame frame = new JFrame("タイトル");
       frame.setVisible(true);
       frame.setSize(300,300);
       frame.setLocationRelativeTo(null);
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
```

とりあえずここまで
conemuでpowershellを使っている時に、duplicate rootをする方法

up 2016/04/14 コメント欄でやり方を教えてもらいました。ありがとうございます

-----

出来ない。環境はConEmu 160301 [32]＋windows 7 64bit
タブの右クリック→duplicate root では、rootが必ずデスクトップになってしまう。
しょうがないから、自分でコマンド定義してそのコマンドでconemu.exe "$pwd" 的な事をしようと思ったら例によって日本語の扱いが微妙。

まず、powerShellのプロファイルスクリプトで以下の関数を定義。関数名はもちろんなんでもいい

```ps:Microsoft.PowerShell_profile.ps1
function fclone{
	ConEmu.exe /Single -cmd "powershell.exe -new_console:a -NoLogo -NoExit " cd "${pwd}"
}
```

そしてカレントディレクトリを移動。日本語＋unicode＋スペースのフルセット
`C:\Users\Temp\tmp_20160328Mon023752\❤\日 本 語\`
そして`ConEmu.exe /Single -cmd "powershell.exe -new_console:a -NoLogo -NoExit " cd "${pwd}"`を叩くと以下のエラーが出る。promptは書き換えてあるけどカレントディレクトリを表示するようにしてある。

```
Set-Location : 引数 '本' を受け入れる位置指定パラメーターが見つかりません。
発生場所 行:1 文字:2
+  cd C:\Users\Temp\tmp_20160328Mon023752\❤\日 本 語
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Set-Location]、ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.SetLocationCommand

2016/03/28 02:41:57 \❤\日 本 語 >
```
エラーが出てはいるけどカレントディレクトリの移動は成功してるけどエラーが出てる。

`ConEmu.exe /Single -cmd "powershell.exe -new_console:a -NoLogo -NoExit " cd "${pwd}"`を色々書き換えてみたけどどうにも分からなかった。
`ConEmu.exe /Single -cmd ""powershell.exe -new_console:a -NoLogo -NoExit " cd "${pwd}""`とか、powershellはバッククオートがエスケープだからそれを入れてみたりとか。markdownだとバッククオートが書けない。

エラーが出るけどとりあえず使えるからまあよしとするか。
これでcmd.exeはお役御免。これからpowerShellをメインに使っていきたい

## その他、conemuでpowerShellを使う時のメモ

`ConEmu.exe /Single -cmd "powershell.exe -new_console:a -NoLogo -NoExit " cd "${pwd}"`
このコマンドだけど、せっかくconemuを使うんだからpowershell.exeじゃなくてタスク名で指定したいけど、それも出来なかった。conemuはコマンドラインやらなんやらが多機能すぎて理解出来ないのがつらい。日本語の情報も少ないし。



conemuのduplicate rootコマンド、ルートディレクトリがデスクトップになって意味が無いのは前述の通りだけど、環境変数が引き継がれているバグ？もある。cmd.exeではそういうの無いはず。
プロファイルスクリプトに

```
if($env:fLoop){
	$env:fLoop=$env:fLoop+"x";
}else{
	$env:fLoop="x";
}
```
と書いて、duplicate rootすると変数が"xxx"と増えていく。
だから、プロファイルスクリプトで環境変数を追加してduplicate rootをしていると、環境変数に同じディレクトリがいくつも登録されてしまう。

とりあえず俺はこんな感じで回避。というかduplicate rootはもう使わないから不要になったんだけどね。

```
function addEnvPath($path){
	$v=($env:Path).Split(";")
	$has = $false
	foreach ($i in $v) {
		if( $i -eq $path ){
			$has=$true
			break
		}
	}
	if($has){
		return
	}
	$Env:Path+=";${path}"
}
addEnvPath("C:\")
```

そんじゃーね
RaspberryPi3でシリアル通信を行う

## はじめに
過去RasPi2をシリアル通信で弄っていたので、RasPi3でも同様に・・・と思ったのですがうまくいきませんでした。

「RaspberryPi3 Serial」で検索したところ、こちらのページにいきつきました。
[Raspberry Pi 3 UART Overlay Workaround](http://www.briandorey.com/post/Raspberry-Pi-3-UART-Overlay-Workaround)

どうやらシリアルコンソール向けに利用されていたUARTがRasPi3から搭載されたBluetoothにデフォルトを取られてしまったようで、シリアル通信を行う場合はいくつか設定を弄らなければならないようです。

## 解決策
こちらのページの通り設定したところシリアル通信が可能になりました。
[Raspberry Pi 3 UART Boot Overlay Part Two](http://www.briandorey.com/post/Raspberry-Pi-3-UART-Boot-Overlay-Part-Two)

OSイメージが2016-03-18以前にリリースされたRaspbian-Jessieか、以降にリリースされたRaspbian-Jessieかで手順が異なるようです。
RasPi3が本格的に出回ったのが3/25,26からのようなので、多くの方は2016-03-18以降のOSイメージを使うのではないかと思います。なので、ここでは以降版の手順を紹介します。私も以降版の手順しか検証していません。

### 1. /boot/config.txtを編集する
```bash
sudo vi /boot/config.txt
```

```text:/boot/config.txt
（ここより上は省略）

# 末尾にこの行を追記
dtoverlay=pi3-miniuart-bt
```

### 2. /boot/cmdline.txtを編集する
```bash
sudo vi /boot/cmdline.txt
```

```text:/boot/cmdline.txt
dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
```
※config.txtは末尾に追記でしたが、こちらは完全に置き換えてください。

### 3. 再起動する
```bash
sudo reboot
```

## 補足
今回編集するファイルはどちらもFATのbootパーティション以下のファイルなので、ディスプレイやキーボードが用意できない場合は、SDカードの内容を直接PCから編集することでも対応可能です。
私はMacで試みて無事シリアル通信できました、Windowsでも文字コードや改行コードなどに気をつければ問題ないかと思います。

シリアル通信にあたってはFTDI社のシリアル変換アダプターを利用しました。それを使うためのドライバーのインストールなどはこちらを参考にしてください
[【myThingsハンズオン】RaspberryPiをセットアップしよう](http://qiita.com/yamamotomanabu/items/30a8fdb2031affd449a5)

解決策にも書いたように2016-03-18以前のOSイメージか、2016-03-18以降のOSイメージかで手順が異なります。今後、OSイメージが更新されれば手順が変わる可能性もあるので注意しましょう！
スクリプトで画面サイズとかメインディスプレイの変更

展示でTriple HeadとかコンピュータのHDMI直刺しとか色々混在した状態で４面マッピングとかやるじゃないですか我々。

そしたら再起動した時にディスプレイの認識タイミングによって、メインディスプレイが取られたりディスプレイサイズが変わったりしてクライアント様からマッピングズレてんだけど何なのと電話かかってきて辛みが増して休日が減る。

なので、cscreenってやつを使います。
こいつをシェルとかで叩いたら良い。

http://www.pyehouse.com/cscreen/

こいつを実行するとディスプレイのIDが取れるので

```
DisplayID  Index     Depth     Width     Height  Refresh
 4280882       1        32      2048       1280     0
24e9c245       2        32      1920       1080    60
use -h to display all usage options
```

メインディスプレイにしたい人を-pオプションつけて指定します。

```
./cscreen -i 4280882 -p
```

で、メインディスプレイにした後にディスプレイサイズも指定してやると調子良い。
mid2015 and late2013のretina + Triple Head dp + HDMI直挿しで動作確認。

```
./cscreen -i 4280882 -x 1680 -y 1050 
```

ただ、並び替えまではやってくれないので、oF使いの人だったらofxDisplayLayoutとかと組み合わせてください。
https://github.com/motoishmz/ofxDisplayLayout
dockerでシステムコールを制御する

#dockerで使うシステムコールを選びたい
今僕はSlackで使えるPerl製evalbotを作っています。
Perlには危険な関数が多くて、エスケープ処理しようとしても厳しいし...
そこでDockerコンテナ内で使えるシステムコールを制御することにしました🍣
#やり方
[ここ](https://github.com/docker/docker/blob/master/docs/security/seccomp.md)に完璧なやり方が載ってる。
まずカーネルがseccompに対応しているか調べる。

```
$ cat /boot/config-`uname -r` | grep CONFIG_SECCOMP=
```
`CONFIG_SECCOMP=y`と表示されれば対応してるということになります。次に、
>Note: seccomp profiles require seccomp 2.2.1 and are only available starting with Debian 9 "Stretch", Ubuntu 15.10 "Wily", and Fedora 22. To use this feature on Ubuntu 14.04, Debian Wheezy, or Debian Jessie, you must download the [latest static Docker Linux binary](https://github.com/docker/docker/blob/master/docs/installation/binaries.md). This feature is currently not available on other distributions.  

「seccomp 2.2.1 が必要で、Debian 9 "Stretch"、Ubuntu 15.10 "Wily"、そして Fedora 22で使えるようになるけど、[最新のDockerのバイナリ](https://github.com/docker/docker/blob/master/docs/installation/binaries.md)をダウンロードしたらUbuntu 14.04, Debian Wheezy, Debian Jessieでも使えるよん」とのことなので、リンク先から自分に合ったものをダウンロードしてくる。
```uname -a```くらいで確認。

```
Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt20-1+deb8u4 (2016-02-29) x86_64 GNU/Linux
```
なので僕の場合だと、https://get.docker.com/builds/Linux/x86_64/docker-latest からダウンロードした。
##静的バイナリのdockerを起動する。
ダウンロードしたdockerに`chmod +x docker`をして、`docker daemon &`でデーモンを起動。
##呼び出したいシステムコールに合わせてjsonを作成
例えばこんな感じ

```json:example.json
{
    "defaultAction": "SCMP_ACT_ALLOW",
    "architectures": [
        "SCMP_ARCH_X86_64",
        "SCMP_ARCH_X86",
        "SCMP_ARCH_X32"
    ],
    "syscalls": [
        {
            "name": "chown",
            "action": "SCMP_ACT_ERRNO",
        }
    ]
}
```
この場合だと基本許可するけど、chownだけは呼べないよ！ということになる。
SCMP_ACT_ALLOWで許可、SCMP_ACT_ERRNOで拒否。
{},
{},
や
[],
[],
といったように最後のブラケットにコンマがついてるとエラーになるので注意しましょう。
##実行
あとは
```--security-opt seccomp=/path/to/example.json```といったようにdocker runのオプションとして実行すれば可能です！！

テストしてみたい場合はこのように実行。

```
$ docker run --rm -it --security-opt seccomp=/path/to/example.json debian:jessie
```
##参考
- [Seccomp security profiles for Docker](https://github.com/docker/docker/blob/master/docs/security/seccomp.md)
- [Docker Engine 1.10 Security Improvements]
(https://blog.docker.com/2016/02/docker-engine-1-10-security/) <- ここで実際に動かしてる動画を見ることができます✨
polyglot-mavenを使ってyamlでpomを記述する方法


最近、何かのドキュメント中にpom.xmlが出てくると一気に視界がぼやけることに気づきました
人間に優しいpomを書きましょう

ということでyamlでpomを書きたいと思います
使うのは [poly-maven](https://github.com/takari/polyglot-maven) というmaven-pluginです
要 maven 3.3.1です
このプラグインはYAML以外にruby, clojure, groovyなどのDSLでもpomを記述できるようです


## pom.yml化して運用する方法

### 1 お好みのmvnプロジェクトを用意する
既に存在するプロジェクトをpom.ymlで管理したいならそれを使えばいいですが、
なにもなければ

```bash
$ mvn archetype:generate
```

なり、なんなりで好きなmvnプロジェクトを用意しましょう

### 2 .mvn/extensions.xml を用意して以下の内容を記述する

プロジェクトのルートディレクトリに `.mvn/extensions.xml` を用意し、  
次の内容を記述してください。  

```xml
<?xml version="1.0" encoding="UTF-8"?>
<extensions>
    <extension>
        <groupId>io.takari.polyglot</groupId>
        <artifactId>polyglot-yaml</artifactId>
        <version>0.1.13</version>
    </extension>
</extensions>
```

今回はyamlでしたが `artifactId` の値を polyglot-ruby とかにすると
pom.rb でpomを記述することになります
詳しくは次のリポジトリの例が参考になると思います
[polyglot-maven-examples](https://github.com/takari/polyglot-maven-examples)


### 3 pom.xml -> pom.yml

ここまでですでに `mvn install` とか `mvn test` はpom.ymlを参照するようになりました。
pom.xmlはgitignoreに追加して良いと思います
しかしpom.ymlを手で用意するのは面倒なので
既存のpom.xmlからpom.ymlを用意しましょう


```pom.xmlからpom.ymlを生成するコマンド
$ mvn io.takari.polyglot:polyglot-translate-plugin:translate -Dinput=pom.xml -Doutput=pom.yml
```
これでOK!  Happy Maven Life!

ちなみにyamlはこんな感じになります
やっぱり無駄な記述がない方がpomの設定内容を把握しやすいと個人的に感じます

```yaml
modelVersion: 4.0.0
groupId: toprock
artifactId: toprock
version: 1.0-SNAPSHOT
packaging: jar
properties: {project.build.sourceEncoding: UTF-8}
dependencies:
- {artifactId: lombok, groupId: org.projectlombok, scope: provided, version: 1.16.4}
- {artifactId: junit, groupId: junit, scope: test, version: 4.11}
build:
  plugins:
  - groupId: org.apache.maven.plugins
    artifactId: maven-compiler-plugin
    version: 3.5
    configuration: {source: 1.8, target: 1.8}
  - groupId: org.apache.maven.plugins
    artifactId: maven-surefire-plugin
    version: 2.16
    configuration: {enableAssertions: true}
modelEncoding: UTF-8
```

## 後日談というか今回のオチ

mvnコマンド実行時はpom.ymlが読まれるので問題ありませんが
IntelliJ IDEA以外のIDE等にpom情報を認識させるためには、
pom.yml更新後にpom.xmlを更新しなければなりません。　

>追記1
>IntelliJ IDEA 2016.1 においてpom.yamlのみ(pom.xml無し)でプロジェクトのインポートに成功しました
>追記2 
>プロジェクトimportはできたものの、import予めmvnコマンドで落としてきた依存パッケージが読み込めただけで、pomの更新後の追加パッケージの認識やIDE上でのmavenの操作はできませんでした。


といってもpom.yml更新後に手でxmlをいじる必要はありません。  
さきほどの `pom.xmlからpom.ymlを生成するコマンド` のファイル指定を適切に行えば
YAMLからXMLのpomを生成できるので
pom.yml更新後は以下のコマンドを実行しましょう

```
$ mvn io.takari.polyglot:polyglot-translate-plugin:translate -Dinput=pom.yml -Doutput=pom.xml
```

長いのでお使いのシェルの設定ファイルに

```
alias pom-yml-to-xml='mvn io.takari.polyglot:polyglot-translate-plugin:translate -Dinput=pom.yml -Doutput=pom.xml'
```

するか

```
#!/bin/sh
mvn io.takari.polyglot:polyglot-translate-plugin:translate -Dinput=pom.yml -Doutput=pom.xml
```

という実行可能なシェルスクリプトををプロジェクトのわかりやすいディレクトリに置いておけばよいと思います
shell+Rubyで簡易レスポンス監視

Webアプリ稼働確認のため、監視を設定します。しかし、まだ利用者が少なく、本格的な監視は不要のような時、簡単なレスポンス監視で十分事足ります（インストールとか面倒だし、できればOS+言語の基本APIで実現したいと思います）。

#監視要件
・cron（１分毎）でシェルを動かす
・URLにcurlでアクセスし、ステータスコードによって正異常を判断する
・curlでインターネットに出て、自身のWebサーバに帰ってくる
・レスポンスコード200は正常、それ以外はNGとする
・タイムアウト時間を設定して、超過した場合はNGとする
・NGの場合は、ログ出力と設定したメールアドレスにメール送信
・1度NGになった場合は、次回正常終了するまでメールは送信しない
　（監視は１分毎に継続実施）
　（メールを止める理由は、何度も飛ぶと他のメールが埋もれるので）

#ソースコード
**cron（監視スクリプトの呼び出し）**

```sh
[Betelgeuse@user]$ crontab -e
* * * * * /home/user/tools/check.sh >/dev/null 2>&1
```

**shell（監視スクリプト）**

```sh:/home/user/tools/check.sh
#!/bin/sh

#ログ出力用の日付型
TIME=`date +"%Y/%m/%d %k:%M:%S"`

#curlコマンドで通信開始、レスポンスコード３桁を変数に入れる
#「--max-time 1」の指定で、通信開始後1秒以上経過したらレスポンスコード000を返す
RESPONSE=`curl -L https://example.co.jp/ -o /dev/null -w '%{http_code}' --max-time 1 -s`

#監視正常時の処理
if [ ${RESPONSE} -eq 200 ] then
  if [ -e /home/user/tools/STOP_check ] then
    rm -f /home/user/tools/STOP_check
  fi
  echo ${TIME}　[${RESPONSE}] >> /home/user/tools/check.log
　　　　exit 0

#監視NG時（すでにメール送信している場合）の処理
elif [ -e /home/user/tools/STOP_check ] then
  echo ${TIME}　[${RESPONSE}]　 Mail SKIP >> /home/user/tools/check.log
  exit 1

#監視NG時（メール送信していない場合）の処理
else
  touch /home/user/tools/STOP_check
    echo ${TIME}　[${RESPONSE}] >> /home/user/tools/check.log
    ruby /home/user/tools/mail.rb "${TIME}" "user"
　　　　  exit 1
fi
```

**Ruby（メール送信）**

```rb:/home/user/tools/mail.rb
#!/usr/local/rbenv/shims/ruby
require "mail"
mail         = Mail.new
mail.from    = "from@mail"
mail.to      = "user@mail"
mail.subject = "[" + ARGV[1].to_s + "]Webアプリの監視連絡（タイムアウト）"
mail.body    = "トップページが設定時間以内に応答しませんでした。[" +  ARGV[0].to_s + "]"
mail.deliver
```

監視アプリを導入するにはサーバリソースが足りない、または、コストの観点から監視が入れられないといった場合に使える（？）簡易監視設定方法です。Java、Pythonでもメール送信部分をつくってみましたが、自身の見た限りRubyが一番すっきりしていたのでこの方法にしました。もちろんサーバにはMTAが必要ですが。。。
Ubuntu 14.04.4 LTS のPHP5.6をPHP7にした話

![3oemvvQT.png](https://qiita-image-store.s3.amazonaws.com/0/43608/b1275bf3-6485-9916-0086-b8c1e8106c6e.png)

どうも、虚弱サーバーを必死にサーバー管理してます。
今日はサーバーのPHPをせっかくなのでPHP7にするまでのお話。

#０．導入環境

- Ubuntu 14.04
 

#１．リポジトリ追加
まずは[【Ubuntu】PHP 5.6 を PHP 7 へアップグレード ](http://sukohi.blogspot.jp/2016/01/ubuntuphp-56-php-7.html)
を参考にリポジトリを追加します。
せっかく公開されてるのでありがたく使います。


>
$ sudo add-apt-repository ppa:ondrej/php
$ apt-get update

updateも忘れずに。
<font color="red">尚、追加するリポジトリは非公式で個人やチームでも
公開できるものであるため、環境によっては
システムが非常に不安定な状態や、
パッケージマネージャーが動作しなくなるといった
状態を招く恐れもあるため、
ご理解の上で利用してください。
又、この記事を参考に導入した際に
生じたいかなる損害についても責任を負いかねます。 </font>

#２．PHP7をインストール※
実はここが問題で、最初PHP7.0だけ入れればいけるかなって
思って
$ sudo apt-get install PHP7.0
だけしちゃったんですが、
PHP5のコンフィグファイルがそのまま残ってしまってて
apache2上ではPHP5のままになってしまうんです。
そしてapache2のModuleを入れてなかったため、
若干ハマることになってしまいましたが、
[Upgrading PHP 5.X to PHP 7 on Ubuntu 14.04 / Apache – MarkHodder.com](http://markhodder.com/upgrading-php-5-x-to-php-7-on-ubuntu-14-04-apache/)
この記事を見つけまして、
>
$ sudo apt-get update 
$ sudo apt-get purge php5-fpm 
$ sudo apt-get --purge autoremove 
$ sudo apt-get install php7.0-fpm php7.0-mysql php7.0 libapache2-mod-php7.0

というコマンドを実行しまして、(もしかしたらいらないのもあるかも)
apacheを再起動します
>
$ sudo service apache2 restart


phpinfo()で確認したところ無事PHP7.0になりました！

#FIN おつかれさまでした。＆余談
今回せっかくPHP7.0にしたんですが、
サーバーでたいしたことしてなかったので
せっかくの速さを体感できなかったことが悔やまれます。
でも少しずつPHPも勉強してバージョン上げたことを
活用していきたいと思います。
HapiでWebhookを受ける側のカンタンなサーバーをたてる


Webhookサーバーって言い方があってるのか分からないんですけど、SlackとかIFTTTとかGithubとかBibbutkcetとかのWebサービスからのWebhookを受け付けるサーバーです。

[BitbucketやGithubにPUSHしたらサーバー側で自動PULLするNode.jsでのミニマム構成](http://qiita.com/n0bisuke/items/2698688927499a82587f)とかでやってるやつですね。このときの実装はとりあえずサーバーにリクエストがあったら処理をするって流れでしたが、送られてきたデータによってハンドリングは出来てませんでした。

## 環境と準備

* node.js 5.9.1
* hapi 13.2.2

```bash
$ npm i hapi
```

## POSTのWebhookサーバー

こんな感じのコードで実現できます。 `request.payload`を表示させるようにします。

```app.js
'use strict'

const Hapi = require('hapi');
const server = new Hapi.Server();

server.connection({port: 8124});
server.route({
  method: 'POST',
  path:'/',
  handler: (request, reply) => {
    reply().code(204);
    console.log(request.payload);
    console.log('-------\n');
  }
});

server.start(() => {
  console.log('Server running at:', server.info.uri);
});
```

* 実行する

```bash@サーバー側
$ node app.js
Server running at: http://localhost:8124
```

localhost:8124でwebhookサーバーが立ち上がるので、この待ち受け状態で別ターミナルでcurlでPOSTリクエストを送って試してみます。

```bash@クライアント側
$ curl --data "response=true" http://localhost:8124/
```

送信すると以下のように`{ response: 'true' }`のオブジェクトが表示されます。

```bash@サーバー側
$ node app.js
Server running at: http://localhost:8124
{ response: 'true' }
-------
```

あとはデータをうまく加工して使ってみましょう。

## GETのWebhookサーバー

基本はPOST版と一緒です。 `method`の値は`GET`で、`request.query`で値が取得できます。

```app.js
#省略

server.route({
  method: 'GET',
  path:'/',
  handler: (request, reply) => {
    reply().code(204);
    console.log(request.query);
    console.log('-------\n');
  }
});

#省略
```

* 実行する

基本はPOSTと同じです。 curl側は以下のように送ります。

```bash
$ curl http://localhost:8124?response=true
```

##まとめ
割と簡単に実現できました。
あとはGithubだったりIFTTTだったりとつなげてあげましょう。

色々なサービスからWebhookでJSONデータが送られてくるのですが、Node.jsで受け口を作って情報を加工したいなと思った時にexpressで試している人は多かったのですがHapiでやってる例は少なさそうな印象でした。

最近Hapiが好きなのでHapi使う人増えるといいなぁ。
Amazon AuroraをterraformでLaunchするアレ

俺です。

terraform v0.6.11で書いたやつです。
subnetは自分で作ってねという。
任意のwriter nodeとparameter groupを指定できないのが痛い。
ただwriter nodeのfailoverは40秒ぐらいで終わるので作った後ターゲットのAZでなければ手動failしてしまえばよいかなと。

```
resource "aws_rds_cluster_instance" "aurorasaikou" {
  cluster_identifier = "${aws_rds_cluster.aurorasaikou.id}"
  identifier         = "${aws_rds_cluster.aurorasaikou.cluster_identifier}-${count.index}"
  instance_class     = "db.r3.large"
  db_subnet_group_name = "${aws_db_subnet_group.backend.name}"
  publicly_accessible = false
  count = 3
  depends_on = ["aws_db_subnet_group.backend"]
}

resource "aws_rds_cluster" "aurorasaikou" {
  cluster_identifier = "aurorasaikou"
  availability_zones = ["ap-northeast-1a", "ap-northeast-1c"]
  database_name = "aurorasaikou"
  master_username = "aurorasaikouuser"
  master_password = "Aurorasa1ko%"
  final_snapshot_identifier = true
  port = 3306
  apply_immediately = true
  vpc_security_group_ids = [""${aws_security_group.default.id}"]
  db_subnet_group_name = "backend"
}
```

完
underscoreコードリーディング（mixin）


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



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


##mixinとは


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

こんな説明。
>####_.mixin(object) 
>Allows you to extend Underscore with your own utility functions. 
>Pass a hash of {name: function} definitions to have your functions added to the Underscore object, as well as the OOP wrapper.


```javascript
_.mixin({
  capitalize: function(string) {
    return string.charAt(0).toUpperCase() + string.substring(1).toLowerCase();
  }
});
_("fabio").capitalize();
=> "Fabio"
```

------------- 
Underscoreに貴方自身が使いたい関数を追加することを許可します。
OOPのラッパーと同様に、{name:function}の形で定義されたハッシュを渡すことで、あなたの追加したい関数をUnderscoreのobjectに追加できます。


###[underscore.mixin](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1490)
コード的にはこのあたり。

```javascript

  // Add your own custom functions to the Underscore object.
  _.mixin = function(obj) {
    _.each(_.functions(obj), function(name) {
      var func = _[name] = obj[name];
      _.prototype[name] = function() {
        var args = [this._wrapped];
        push.apply(args, arguments);
        return result(this, func.apply(_, args));
      };
    });
  };

```

_.eachを利用する。
第一引数は_.functionsにobjを渡したもの、第二引数にnameを引数とした関数。
この関数の中身は以下
funcに_[name](obj[name])を代入する。
_のprototype[name]に以下の関数を代入する。
argsに[this._wrapped]を代入する。
argsにargumentsをpushする。
resultにthis,funcを渡した結果を返す。

[resultは以下](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1484)

```javascript
  // Helper function to continue chaining intermediate results.
  var result = function(instance, obj) {
    return instance._chain ? _(obj).chain() : obj;
  };
```

instance._chainの結果がtrueだった場合_(obj).chainの実行結果を、falseの場合はobjを返す。

_chainは[_.chain](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1472)で定義されている
Twitterでズンドコキヨシ

お前タイムラインどうでもいいツイートで埋めんなってそれ一番言われてるから

```php
<?php

// https://github.com/mpyw/TwistOAuth
require 'TwistOAuth.phar';

$to = new TwistOAuth(
    'XXXXXXXX',
    'XXXXXXXX',
    'XXXXXXXX',
    'XXXXXXXX'
);
$prefix = '@tos ';
$id = null;
$sum_zun = $is_zun = 0;
$choices = ['ドコ', 'ズン'];

do {
    $sum_zun = $is_zun ? $sum_zun + 1 : 0;
    $is_zun = mt_rand(0, 1);
    $id = $to->post('statuses/update', [
        'status' => "{$prefix}{$choices[$is_zun]}",
        'in_reply_to_status_id' => $id,
    ])->id_str;
} while ($sum_zun < 4 || $is_zun);
$to->post('statuses/update', [
    'status' => "{$prefix}キ・ヨ・シ！",
    'in_reply_to_status_id' => $id,
]);
```

参考: [ツイッターで同じ本文のツイートをし続ける
](http://qiita.com/lm0x/items/f0de9620a59418780d00)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/TOS">@tos</a> キ・ヨ・シ！</p>&mdash; 紗路㌠ (@mpyw) <a href="https://twitter.com/mpyw/status/714116516610854912">2016年3月27日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

![スクリーンショット 2016-03-28 1.03.31.png](https://qiita-image-store.s3.amazonaws.com/0/25060/c40bb6d4-1469-612e-f0d0-1526cab9a683.png)
JSQMessagesViewControllerに画像を表示する


PictRuby 0.6 に向けてやりたいことを整理。

- チャット画面で画像を表示できるように
- 正規表現
- irbでローカル変数を使えるようにしたい

どれも実現可能か分からないのでまずは調査から。今日は画像の表示。ググったら`JSQPhotoMediaItem`を使えば良さげ。

- [CocoaDocs.org - JSQPhotoMediaItem Class Reference](http://cocoadocs.org/docsets/JSQMessagesViewController/6.0-beta6/Classes/JSQPhotoMediaItem.html#//api/name/initWithImage:)


```objc
UIImage* image = [UIImage imageNamed:@"sample.jpg"];
JSQPhotoMediaItem* photo = [[JSQPhotoMediaItem alloc] initWithImage:image];

return [JSQMessage messageWithSenderId:@"ruby"
                           displayName:@"Ruby"
                                 media:photo];
```

あっさり表示できた、素晴らしい。

が、残念ながら画像のコピーができない。クリック時の拡大もない。Issueを見ると画像のコピーはできそうな雰囲気なのだが・・。ここまでやってみて画像を快適に扱えるようにするには幾つかの機能整備が必要なことに気づく。時間がかかりそうだ。

今回は見送りするのが良いかもな。次は正規表現を組み込めるか調査する。
SwiftでRealmを使う


Swift2でRealmを使えるようにするところまで。

### Realmとは

SQLiteやCoreDataより簡単にデータ管理ができるプラグインらしい。
SwiftではSQLiteやCoreDataを触ったことがないから、イマイチ楽ちんさがわからないけど、
ぐぐると便利という話が沢山出てくるので使うことにしてみた。

https://realm.io

### 環境
|環境|バージョン|
|---|---|
|Xcode|7.3|
|Swfit|2.2|
|Realm|0.98.6|
|CocoaPod|0.39.0|

※　Swift2.2は正式にはまだ対応してないみたいだけど、一応動いた。

### 使えるようにするまでの手順
__1. CocoaPodのインストール__

```sh
$ sudo gem install cocoapods
```

__2. Xcodeのプロジェクトを作成する__

これはただ作るだけ。

__3. Podfielの作成__

```sh
mv ${xcode project path}
vi Podfile
```

Podfileに以下の記述を追加

```
use_frameworks!

pod 'RealmSwift'
```

__4. RealmSwiftのインストール__

```sh
pod install
```

__5. Realmがプロジェクトに追加されたことの確認__
${project name}.xcworkspaceが作成されるので、
Xcodeで`.xcodeproj`ではなく`.xcworkspace`のファイルを開く。

__6. Realmを使うための最後の準備__

Runする。

一度Runしないと、RealmSwiftをインポートできないっぽい。

### Realmを使う
`import RealmSwift`したうえであとはホームページなどのサンプルを参照。


### 補足
Realmで作成されたデータは`Realm Browser`なるアプリで参照が可能。

[Realm Browser](https://itunes.apple.com/app/realm-browser/id1007457278)

Realm Browserでデータを参照する場合、データファイルを指定する必要があるが
データファイルのパスを調べる方法はここを参照。

[パスを調べる方法](http://stackoverflow.com/questions/28465706/how-to-find-my-realm-file/28465803#28465803)

iOS Simulatorの場合、

```swift
let realm = try! Realm()
print(realm.path)
```

とかで確認できる。
型レベルズンドコキヨシ with Scala

**コンパイル時にズンドコする。それが型レベルズンドコキヨシ。**

型だけでランダムにする方法があるらしいですがよく分からないのであきらめてマクロ使ってしまいました。~~だれかお願いします。~~ [書いてくれました。](http://qiita.com/ocadaruma/items/866c83f9c697a910da44)

## コード

まずランダムにズンかドコを決めるため、2つの型をとってどっちか返すみたいなマクロを用意。

```scala
import scala.language.experimental.macros
import scala.reflect.macros.whitebox.Context

trait Which[A, B] {
  type Out
}
object Which {
  type Aux[A, B, C] = Which[A, B] {type Out = C}
  def randImpl[A: c.WeakTypeTag, B: c.WeakTypeTag](c: Context): c.Tree = {
    import c.universe._
    val tpeA = weakTypeOf[A]
    val tpeB = weakTypeOf[B]
    val tpeC = if (scala.util.Random.nextBoolean) tpeA else tpeB
    q"new Which[$tpeA, $tpeB] { type Out = $tpeC }: Which.Aux[$tpeA, $tpeB, $tpeC]"
  }
  implicit def which[A, B, C]: Which.Aux[A, B, C] = macro randImpl[A, B]
}
```

ズンかドコをWhichで取得して、その結果をHListにためていきます。例の文言になったらキヨシを付けて返すだけです。

```scala
import shapeless._
import shapeless.ops.hlist.Reverse

object Main extends App {
  trait ズン
  trait ドコ
  trait `キ・ヨ・シ！`
  implicit case object ズン extends ズン
  implicit case object ドコ extends ドコ
  case object `キ・ヨ・シ！` extends `キ・ヨ・シ！`

  trait Kiyoshi[A <: HList] {
    type Out <: HList
    def apply(a: A): Out
  }
  object Kiyoshi extends LowPriority {
    implicit def k0[L <: HList](implicit r: Reverse[`キ・ヨ・シ！` :: ドコ :: ズン :: ズン :: ズン :: ズン :: L]) = new Kiyoshi[ドコ :: ズン :: ズン :: ズン :: ズン :: L] {
      type Out = r.Out
      def apply(l: ドコ :: ズン :: ズン :: ズン :: ズン :: L) = r(`キ・ヨ・シ！` :: l)
    }
  }
  trait LowPriority {
    implicit def k1[A, L <: HList](implicit w: Which.Aux[ズン, ドコ, A], a: A, k: Lazy[Kiyoshi[A :: L]]) = {
      new Kiyoshi[L] {
        type Out = k.value.Out
        def apply(l: L) = k.value(a :: l)
      }
    }
  }

  println(the[Kiyoshi[HNil]].apply(HNil: HNil))
}
```

## 実行

```
> run
[info] Compiling 1 Scala source to /Volumes/USB1/Documents/my/macro-sample/core/target/scala-2.11/classes...
[info] Running Main
ズン :: ドコ :: ズン :: ドコ :: ズン :: ズン :: ドコ :: ズン :: ドコ :: ズン :: ズン :: ドコ :: ズン :: ズン :: ズン :: ズン :: ドコ :: キ・ヨ・シ！ :: HNil
[success] Total time: 4 s, completed 2016/03/28 21:14:53
```

再コンパイルしない限り同じものを出力。

```
> run
[info] Running Main
ズン :: ドコ :: ズン :: ドコ :: ズン :: ズン :: ドコ :: ズン :: ドコ :: ズン :: ズン :: ドコ :: ズン :: ズン :: ズン :: ズン :: ドコ :: キ・ヨ・シ！ :: HNil
[success] Total time: 0 s, completed 2016/03/28 21:15:51
```

再度コンパイルすると結果が変わります。


```
> run
[info] Compiling 1 Scala source to /Volumes/USB1/Documents/my/macro-sample/core/target/scala-2.11/classes...
[info] Running Main
ドコ :: ズン :: ズン :: ズン :: ドコ :: ドコ :: ドコ :: ドコ :: ドコ :: ドコ :: ズン :: ドコ :: ズン :: ドコ :: ズン :: ズン :: ズン :: ドコ :: ドコ :: ズン :: ドコ :: ズン :: ズン :: ズン :: ドコ :: ドコ :: ドコ :: ズン :: ドコ :: ズン :: ズン :: ズン :: ドコ :: ズン :: ズン :: ズン :: ドコ :: ドコ :: ズン :: ズン :: ズン :: ズン :: ドコ :: キ・ヨ・シ！ :: HNil
[success] Total time: 3 s, completed 2016/03/28 21:16:54
```
Bundlerの使い方


## gemとは？
- 決まったフォーマットで提供されるRuby言語用のライブラリを「gem」と呼びます。
- 「gem」には例えば以下のようなものがある。
    - Rails(Webフレームワーク)
    - Sinatra(Webフレームワーク)
    - omniauth(認証機能)
    - unicorn(アプリケーションサーバ）
    - Rspec(テストフレームワーク）
...etc
- PerlでいうCPAN、phpでいうpear等にあたる

## Rubygemsとは
- yumやaptと似た、gem専用のパッケージ管理システム。
- 以下サイトにてgemの情報公開、提供を行っている。
https://rubygems.org/

## Bundlerとはなんぞや
- gemは以下のように個別に手動インストールする事が可能です。
    - `gem install "sinatra"`
    - `gem install "unicorn"`
    - `gem install "omniauth"`
- しかし、様々なgem(ライブラリ)を組み合わせて使っていると「gemAのver1とgemBのVer2はうまく動くけど、最新バージョン同士だとうまく動かない。」という互換性の問題が出てくる場合があります。
- また、複数人、複数環境で開発を行う場合は、各環境で使うライブラリの名前、バージョンを合わせる必要があります。
- こういった場合に、gem同士の互換性を保ちながら各gemの導入、管理を行ってくれるのがBundlerです。
- Gemfileというファイルにインストールしたいgemを記述し、それを元にbundlerを使ってインストールを行います。
- bundler本体以外のgemは基本的にbundler経由でインストールを行うのがおすすめです。

## Bundlerのインストールの仕方
- Bundlerのインストール
    - Bundlerもgemの1つです。手動ダウンロードしましょう
        - `gem install bundler`
    - 導入後はバージョンが表示される事を確認してください。
        - `bundler -v`

## Bundlerの使い方
1. Gemfileの作成
    - `bundle init`
    - 上記実行するとGemfileという雛形ファイルが作成されます
2. 使用したいgemをGemfileに記述する
    - Gemfileを編集する
        - `vi Gemfile`
    - Gemfileの先頭に、インストール元はrubygemsですよ、と宣言を行います。
        - `source "rubygems"`
    - 続けてインストールしたいgemを記述します
        - `gem "sinatra"`
        - `gem "unicorn"`
        - `gem "omniauth"`
    - gemの指定の際に、バージョンの指定も可能です
        - `gem 'rails', "~> 4.2.4"`
3. Gemfileにリスト化したgemを一括インストール
    - 一括インストール
        - `bundle install --path vendor/bundle`
    - `--path`でインストール先を指定可能。一度でも`--path`指定でインストールしたら、次回以降はpath指定無しで`bundle install`を行っても同じpathが選択されます。
    - この時、インストールしたgemの名前とバージョンを記載した「gemfile.lock」というファイルが作成されます。
4. インストールしたgemをプログラムソース上でロード
    - まずソース上でrubygemsをrequireします。
        - `require "rubygems"`
    - 以下のように記述するとインストールした内容からrequireを行うように(指定無しだとシステム最新のgemを使ってしまいます)
        - `require "bundler/setup"`
5. プログラムを実行する際は、最初にbundle execを実行します。(指定無しだと互換性を考慮せずにシステム最新のgemを使ってしまう)
    - `bundle exec ruby foo.rb`

## 参考
- Rubygemsのススメ | Rubyに慣れていない初心者さんへ  
http://qiita.com/sumyapp/items/5ec58bf3567e557c24d7
- Bundler概要  
http://qiita.com/hisonl/items/162f70e612e8e96dba50
- Bundlerとは  
http://shokai.org/blog/archives/7262
（はじめの一歩）Vagrantで、ShellScriptをつかったプロビジョニングをしてみた

# Vagrant道に則ったやりかた

開発元が考えているVagrantの使い方は、ほぼ素の仮想OSのboxをベースに、インストールするソフトウェアや各種設定などの設定を読み込んで環境を作るといった流れになる。

そして、このboxと設定を記述したファイル（ShellScriptだったりChefだったり）を「配布」して開発チームなどで共有するといった流れになる。

*開発環境の生成プロセスの一部として、自動的にソフトウェアをインストールする方法です。後者を行うのが、プロビジョニングです。（実践Vagrant道　P47）*

## 環境

- Vagrant 1.8.0
- ホストOSはmac OS X
- 仮想環境を動かす環境としてVirtualBox5.x系を使用
- 使用するOSはAtlasのbento (CentoOS-6.7）2.2.3

# ShellScriptで設定類を読み込む

公式のVagrantのドキュメントでは、プロビジョニングChefにあまり詳しくなければまずはShellScriptで記述するところが入ったほうが良い。ある程度詳しければVagrantはChefを学ぶ格好の場です。といった趣旨のことがかいてある。

https://www.vagrantup.com/docs/provisioning/chef_zero.html

確かに、個人レベルで開発、検証用にVagrantを使う程度の話では大げさすぎるかも。
実は、先にchef-DKを使った環境構築を試したものの

```
Bringing machine 'default' up with 'virtualbox' provider...
There are errors in the configuration of this machine. Please fix
the following errors and try again:

chef zero provisioner:
* Missing required value for `chef.nodes_path'.
```

みたいに出で、何が何だかよくわからん。
nodes_path ディレクトリなんて生成されないし。

## ごく単純化したVagrantfileとシェルスクリプトの例

すでにディレクトリとVagrantfileは存在しているとする。
Vagrantfileの作成は、`vagrant init -m` のようにコメント抜きでやってもいいかも。

```bash:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "bento/centos-6.7"

  # 設定をよみこみ
  config.vm.provision :shell, :path => "provision/hello.sh"
end
```

boxの指定と読み込むShellScriptの指定だけの、ごく単純な設定記述です。

```bash:hello.sh
#!/bin/sh

echo 'hello world!!'
```

ShellScriptファイルなので、`#!/bin/sh` などの、シェル指定を忘れずに。

## プロビジョニングをしてみる

やってることは　コメント表示だけですが・・・。
注：対象のVagramt仮想環境が動いている、もしくは`vagrant up --provision`（仮想環境を用意しなさい。プロビジョンもしなさい）としてやる必要があり。

vagrant 環境がupしていない状態で`vagrant provision`としてもエラーが出ます。

```bash:ミステイクの例
$ vagrant provision
==> default: VM is not currently running. Please, first bring it up with `vagrant up` then run this command.
```

今回は、仮想環境がupしていない環境からupと同時にプロビジョンを行うケースを試します。

```bash:vagrantをアップしながらプロビジョニング
$ vagrant up --provision
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'bento/centos-6.7' is up to date...
(中略）
==> default: Mounting shared folders...
    default: /vagrant => /Users/rojiuratech/Documents/vagrant/shell-provision
==> default: Running provisioner: shell...
    default: Running: /var/folders/nq/yngpxc915nscw3tt7qlp9rp40000gn/T/vagrant-shell20160327-7456-1t4awpw.sh
==> default: hello world!!
```

Vagrantfileで指定したプロビジョン用のShellScriptに記載した内容が処理されています。

すでに`vagrant up`した（仮想サーバが生成されている）状態のものを`vagrant halt` （仮想サーバがシャットダウンされた）状態にし、
ただ単に`vagrant up` とした場合

```bash:プロビジョンをしないでupすると
$ vagrant up
default: Mounting shared folders...
    default: /vagrant => /Users/rojiuratech/Documents/vagrant/shell-provision
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.
```
ApacheとPHPをソースからインストールする

## この記事の内容
ApacheとPHPのコンパイル手順など書いてます。
最近WordPress用のサーバを構築したときの手順を思い出しながら書きました。多分こんな感じだった。
ソースからインストールするのは結構手間な作業なんですが、confiugreオプションを調べながらあーだこーだするのも楽しいし、makeに必要なライブラリが足りないとかで悩んだりするのも色々発見があると思います。

## 手順
### Apacheのインストール
```
# 必要なパッケージを入れる
yum -y install gcc zlib-devel ncurses-devel pcre-devel libcurl-devel libxml2-devel

# 必要なソースコードのダウンロード
wget http://ftp.riken.jp/net/apache/httpd/httpd-2.4.18.tar.gz -O /usr/local/src/httpd-2.4.18.tar.gz
wget http://ftp.riken.jp/net/apache/apr/apr-1.5.2.tar.gz -O /usr/local/src/apr-1.5.2.tar.gz
wget http://ftp.riken.jp/net/apache/apr/apr-util-1.5.4.tar.gz -O /usr/local/src/apr-util-1.5.4.tar.gz

# アーカイブの展開＆コンパイルオプションの設定
cd /usr/local/src
tar -xvzf httpd-2.4.18.tar.gz
tar -xvzf apr-1.5.2.tar.gz && mv apr-1.5.2 httpd-2.4.18/srclib/apr
tar -xvzf apr-util-1.5.4.tar.gz && mv apr-util-1.5.4 httpd-2.4.18/srclib/apr-util
cd httpd-2.4.18
./configure --prefix=/usr/local/httpd-2.4.18 --enable-mods-shared=all --with-mpm=prefork

# コンパイル＆インストール
make clean && make -j2 && make install

# 利用しやすいようにシンボリックリンクを貼る
ln -s /usr/local/httpd-2.4.18 /usr/local/apache2
```
### PHPのインストール
```
# 必要なパッケージを入れる
yum -y install mysql56-devel

# 必要なソースコードのダウンロード
wget http://jp2.php.net/get/php-5.6.19.tar.gz/from/this/mirror -O /usr/local/src/php-5.6.19.tar.gz

# アーカイブの展開＆コンパイルオプションの設定
tar -xvzf php-5.6.19.tar.gz
cd php-5.6.19
./configure --prefix=/usr/local/php-5.6.19 --with-apxs2=/usr/local/apache2/bin/apxs \
              --enable-zip --enable-mbstring --with-mysqli --with-zlib --with-curl

# コンパイル＆インストール
make clean && make -j2
make test
make intall

# 利用しやすいようにシンボリックリンクを貼る
ln -s /usr/local/php-5.6.19 /usr/local/php5
```
Boostnoteを複数端末で共有する方法


Boostnoteを使いはじめるのでMacBookAirとiMac両方でデータを同期するように設定する。

[Boostnote](https://b00st.io/jp/index.html)

Boostnoteのアプリディレクトリ`~/Library/Application\ Support/boost `の中身を覗いてみると
どうやら共有する場合に必要そうなファイルは次の２つっぽい。

|ファイル|説明|
|---|---|
|config.json|フォントとか設定のファイル|
|local.json|ノートデータ|

ということなのでDropbox上へ実体を移してシンボリックリンクにしてしまおう。

```sh
# パスの設定（hogehogeは適当に設定）
BOOST_PATH="$HOME/Library/Application Support/boost"
DROPBOX_PATH="$HOME/Dropbox/hogehoge"

# Dropbox上にBoostnoteの各種ファイルを配置するディレクトリを作成
# 共有先の端末ではディレクトリの作成はいらない、Dropboxで自然と同期される
mkdir -p $DROPBOX_PATH/Boostnote
SYNC_PATH="$DROPBOX_PATH/Boostnote"

# ファイルを移動
# 共有先の端末では削除かどっかに退避しておく
mv "$BOOST_PATH/config.json" "$SYNC_PATH"
mv "$BOOST_PATH/local.json" "$SYNC_PATH"

# シンボリックリンクの作成
ln -s "$SYNC_PATH/config.json" "$BOOST_PATH/config.json"
ln -s "$SYNC_PATH/local.json" "$BOOST_PATH/local.json"

```

SublimeTextだとこんな感じ複数端末編集してたりしても
そんなに競合とかで困ったことないけど、
競合とかどうなるかわからないのでやる人は自己責任で。
田村ゆかりで学ぶメソッドのオーバーライド

# メソッドのオーバーライドとは

メソッドのオーバーライドとは、親クラスで定義されたメソッドと同じ名前かつ同じシグネチャ(引数の数と型)のメソッドを子クラスで定義することで、子クラスのインスタンスに対するメソッドの呼び出しで用いられる親クラスのメソッドの実装を上書きすることです。

オーバーロード(同じ名前で違うシグネチャのメソッドを同じクラスに定義し、引数によって使い分けさせること)と混同しないように注意が必要です。

# 実例

## 人間クラス

ここでは簡単のため、人間の情報は名前と誕生年だけであるとします。
普通の人間の年齢は、現在の年と誕生年の差で求まります。
(正確には誕生日の前後で違いますが、ここでは省略します)

```java:Human.java
public class Human {
    private String name;
    private int birthYear;

    /**
     * 名前と誕生年をもとに人間のインスタンスを作成する。
     * @param name 名前
     * @param birthYear 誕生年
     */
    public Human(String name, int birthYear) {
        this.name = name;
        this.birthYear = birthYear;
    }

    /**
     * 名前を取得する。
     * @return 名前
     */
    public String getName() {
        return name;
    }

    /**
     * 年齢を取得する。
     * @param currentYear 年齢を計算する年
     * @return 年齢
     */
    public int getAge(int currentYear) {
        return currentYear - birthYear;
    }

    /**
     * 自己紹介する。
     * @param currentYear 年齢を計算する年
     */
    public void introduce(int currentYear) {
        System.out.println(getAge(currentYear) + "歳の" + getName() + "です。");
    }
}
```

## 田村ゆかりクラス

田村ゆかりは人間なので、人間クラスを継承します。
田村ゆかりは17歳なので、人間クラスの年齢の計算方法を上書きします。

ちなみに、`{@inheritDoc}`というおまじないを用いると、自分でコピペしなくても親クラスのオーバーライドされたメソッドの説明を`javadoc`側でコピペしてくれます。

```java:TamuraYukari.java
public class TamuraYukari extends Human {
    /**
     * 田村ゆかりのインスタンスを作成する。
     */
    public TamuraYukari() {
        super("田村ゆかり", 1976);
    }

    /** {@inheritDoc} */
    public int getAge(int currentYear) {
        return 17;
    }
}
```

## テスト実行

適当なインスタンスを作成し、自己紹介させます。
クラス名が適当なのは気にしないでください。

```java:Bekkii.java
public class Bekkii {
    public static void main(String[] args) {
        Human hanazawaKana = new Human("花澤香菜", 1989);
        Human tamuraYukari = new TamuraYukari();

        int year = 2016;
        hanazawaKana.introduce(year);
        tamuraYukari.introduce(year);
    }
}
```

このプログラムを実行すると、以下の結果が得られました。

```text
27歳の花澤香菜です。
17歳の田村ゆかりです。
```

同じ`Human`型の変数に代入され、`Human`クラスで定義されたメソッドを呼び出しても、その中で呼び出しているメソッドの実装が田村ゆかりのインスタンスでは上書きされていることがわかります。
Excelの選択範囲をUnicodeで書出すAppleScript

[FileMakerもくもく会#14](https://atnd.org/events/75502)の成果のAppleScript
（FileMaker？）

標準の保存ではUTF-16で保存はできるものの、Scriptには対応してなかったのでちょっと考えてみました。
データの範囲選択等色々考えたのですが、闇が広がってきたので書出す範囲をあらかじめ選択しておいてもらう方法にしました。

クリップボード汚染します（苦笑

それと、なぜか連続で実行するとエラーになります。（なんで？？）

Excelと同階層にタブ区切りテキストを書き出します。

```applescript

tell application "Microsoft Excel"
	activate
	copy range of selection
	set TabText to get the clipboard
	
	set DocPath to full name of active workbook

	my SaveTabText(DocPath, TabText)
	
end tell


on SaveTabText(DocPath, TabText)
	
	tell application "Finder" to set aExt to name extension of (info for (DocPath as alias))
	
	set SaveTabText to my Delimiters(DocPath as Unicode text, aExt, "txt")
	set SaveTabText to quoted form of POSIX path of SaveTabText
	
	set shcmd to "echo " & TabText & " > " & SaveTabText
	do shell script shcmd
end SaveTabText

on Delimiters(theText, serchStr, replaceStr)
	set OriginalDelimiters to AppleScript's text item delimiters
	set AppleScript's text item delimiters to serchStr
	set theText to text items of theText
	set AppleScript's text item delimiters to replaceStr
	set theText to theText as string
	set AppleScript's text item delimiters to OriginalDelimiters
	return theText
end Delimiters

```