OmniAICreator/Qiita-1.07M huggingface dataset:
複数の配列を比較し重複する値を取る

ユーザーIDの＆検索を作ろうとして悩んだのでまとめてみます。

# 複数の配列から重複を抽出する方法

前提として以下のような配列があったとします。

```ruby:
a = [1,2,3]
b = [1,2,3,4,5]
c = [1,3,5]
```

## 1: & で比較する
配列がいくつあるかがわかっていれば、やることは簡単で以下のようにすれば重複する値を取ることができます。


```ruby:
a & b & c
=> [1,3]
```
参考：[２つの配列から重複を省いたり、重複を得たり](http://d.hatena.ne.jp/stog/20120225/1330167302)

しかし、配列の数がわからなかったり ~~空の配列が含まれている~~ と上記の方法は使えません。
→空配列はOKでした。誤解でした。

## 2: 複数の配列を一つにまとめて重複する値を抽出する

そこで試したのが複数の配列を一つにまとめて抽出するという方法です、Arrayクラスにメソッドを追加してみました。

```ruby:
class Array
	def duplicate_values(*arrays)
		self.flatten!	# 多重配列を単純にする
    	self.sort!		# 並べ替える
    	self.select.with_index{|e,i| e == self[i+1] } # 次の値と比較して同じなら抽出
	end
end

> [a,b,c].duplicate_values
=> [1,3]
```

このやり方について詳しくは参考サイトの方をご覧になってください。
参考：
[Ruby の配列で重複する値のみを取り出す](http://easyramble.com/extract-overlaps-from-ruby-array.html)
[Rubyで配列から重複したモノ（要素）を抜き出す（Uniqの逆）](http://takuya-1st.hatenablog.jp/entry/20100103/1262486833)

この方法では以下の問題点があり、今回の私の目的には使えませんでした。

- 配列が３つ以上あった場合にすべての配列に共通する値を抽出できない
- 配列同士の比較は行っていないので、一つの配列内に同じ値が複数あるなどの場合も抽出されてしまう

## 3: 配列の個数分だけ比較する
結局配列同士を比較しないとダメだよねということに気づいてやったのが次の方法です。

```ruby:
def duplicate_values
	max = self.size
    self.reverse_each.with_index do |e,i|
      break if i == max-1 # N-1回比較
      @dup_values = @dup_values ?  @dup_values & self[i] : self[i] & e
    end
    @dup_values
end

> [a,b,c].duplicate_values
=> [1,3]
```
すべての配列で共通する値はこでれ取ることができました。

今回はとりあえず目的達成できましたが、なんだかもっといい感じに書けそうな気もします。
良いアイディアがあったらぜひ教えて下さい！
 __=> コメントでGOODアイディア頂きました!コメント欄の方もご覧ください。__
zabbix agentのログファイルについて

# Zabbix Agent のログ

## 動機

なにかあたらしい設定をしたときや、何かの動作がおかしいのだがなんだかわからないときに、Zabbix Agentのログを確認したいが、ログファイルがみつからない時がある。
これを解消したい

## この文書に書いてあること

zabbix_angetd.confに***LogFile***の記述がないと、zabbix_agentdのログが記録されないようなので、記録できるようにする

## 方法

次のファイル(設定ファイルなので、各自の環境で読みかえる)に
```
/etc/zabbix/zabbix_agentd.conf
```
以下の内容を書き込む

```
#
LogFile=/var/log/zabbix/zabbix_agentd.log
DebugLevel=3
```

***DebugLevel***で書き出すログの内容を変更することができます。
{rmarkdown}でchildはどうする？

# {Rmarkdown}
このパッケージは、{knitr}と異なり、".R"からmarkdownを生成できる。

マークダウン形式のテキストを挿入したい場合には、行頭に「#' 」を入れる。
chankは「#+ 」を入れる。ので、通常のRスクリプトの邪魔にならない(コメントアウトされる)。

つまり、スクリプトは、全文、Rスクリプトとして実行できる。

echo, include, warning, fig.width, fig.heightなどはそのまま使える。
　#+ include=FALSE
などとする。

従って、**.Rmdを作る必要が無い**。

レポーティングのためだけに.Rmdを作るのって、正直、邪魔だし、面倒。
と思っていた、そこのアナタに最適。

# {r child="hoge.Rmd"}
これは.Rmdを書く時に必須と言っても過言では無い(ドヤ顔)。

長ったらしくなりがちなマークダウンを整理して、計算部分は他の.Rmdに書いておいて、文書メインのマークダウンの中に埋め込む。

# {rmarkdown}では

plot()を含む命令をhoge.Rに保存しておいて、rmarkdownで呼び出せたら、これは便利じゃないか。


さて、

　#+ child="hoge.**R**", echo=FALSE


......。

hoge.Rの本文がダラダラ引用されて終わり。

絵が欲しいんだよ、**絵**が。

色々試しましたが、

　#+ child="hoge.**Rmd**"

にしないとダメ。

**結局、Rmd作ってんじゃんかorz**
Ruby 技術者認定試験 Silver 受験について

2015-10-19 に Ruby Silver ver2.1 を受験して合格しましたので、参考までに道筋を書いておきます。

##受験者について
私は以前から Perl を触っており、その経験が Ruby 学習に役立ったため、完全に１からの学習ではありませんでした。
その点を考慮してみていただければと思います。

##参考書籍と勉強の仕方
1. [パーフェクトRuby](http://www.amazon.co.jp/gp/product/B00P0UR1CA)
2. [Ruby技術者認定試験合格教本 Silver/Gold対応　Ruby公式資格教科書](http://www.amazon.co.jp/gp/product/4774175676)

1 を 2015-09-13 に購入し、ひととおり読みました。この書籍は他の言語を触ったことがある人向けです。
その分面白い内容になっていると思いますので、試験を受けない人が読んでも良いものだと思います。私は電子書籍で買いましたが、電子書籍版は検索等できないただの画像でしたので、本のほうが読みやすいかもしれません。

1 の書籍が面白かったので、試験をうけるまえにと Sinatra でアプリ（[こんなの](http://kokoromati.orz.hm/mstodo/help/index.html)）を開発してみました。この実際の開発経験もほんの少しは役に立っていると思います。

次に 2 を 2015-10-05 に購入。つい最近更新された教科書です。これの教科書部分を一通り読んで、模擬試験をほぼ１００％解答できるようにして試験に臨みました。
この本の以前のバージョンのレビューを読んでいると、悪所についてはあんまり変わっていないようです。（silverとgoldの出題範囲の区別がつきにくい。誤字や誤答などが目立つ。など）

##試験について
上記 2 の書籍に出ていた模擬試験問題のうち、体感的に 10 問くらいがそのまま出題された感じです。
試験問題は 50 問ですが、その中で 13 問くらいが苦戦する（解答に自信がもてない）ものだったので、それらが全部はずれると合格ラインの 75 点にとどかない計算になるので焦りました。

array や hash の各メソッドについてその細かい挙動を問うてくるので、余裕のあるかたはそのあたりを重点的に押さえたほうがいいかもしれません。
下記の出力結果がわかるでしょうか。私はわからないまま受験していまいました。。。

```rb
a = [1,2,3,4,5,1,2,3,4,5]
a.delete(3)
p a
```

あとはこういうのとか。結構あやふやになっていないでしょうか。私はあやふやでした。。。

```rb
s1 = "Ruby"
s2 = s1
s1.concat("Silver")
p s1
p s2
```


結果、90 点で 75 点をそれなりに超えて合格となりました。

##所感
試験勉強の期間は実質一か月もかかっていませんが、上記の教科書の模擬試験だけでは合格まで楽勝だとは思えませんでした。ちょっとだけ危うい感があります。
確実に合格したい方は（存在するかどうかは知りませんが）他の模擬試験も検討してもいいかもしれません。お金かけたくない場合は教科書の内容等をかなり細かいところまで頭にいれるしかなさそうです。

以上、少しでも参考になれば幸いです。
iOS9でiPadのキーボードに表示されるUndo/Redo/Pasteボタンの処理


* Xcode6.4

## 概要

自前でテキストエディタのようなものを実装したアプリがありまして、iOS9で動作させるとキーボードの上の方に何やらボタン（ショートカットバー？）が増えていて、これを一体どうやったらアプリで押せるようになるのかを調べたので適当に残しておきます。

![Screen Shot 2015-10-19 at 14.44.58.png](https://qiita-image-store.s3.amazonaws.com/0/31347/11ea1b98-77d6-262c-b645-2ce271499cbf.png "Screen Shot 2015-10-19 at 14.44.58.png")

## Paste

`canPerformAction`で固定のアクションに対する問い合わせが来るので、それに応答すれば良さそう。

```swift:
    override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
        if action == "paste:" {
            return true
        }
        return false
    }
    
    override func paste(sender: AnyObject?) {
        println("paste called!!")
    }
```

※どこかで`paste:`って文字定義されてないですかね...

同様に、`cut:`, `copy:`, `toggleBoldface:`, `toggleItalics:`, `toggleUnderline:` という問い合わせも来るので、切り取りやコピーなどもここで実装すれば良さそうです。
（選択範囲が有ると切り取りなどのボタンが出るため）

## Undo/Redo

で、`canPerformAction`系ではUndo/Redoの問い合わせが来ません...

こちらは

```swift:
override var undoManager: NSUndoManager? { return hogehoge }
```

というように、`NSUndoManager`のインスタンスの要求に応えてあげれば良さそうです。
私はアンドゥ/リドゥ処理に`NSUndoManager`を使っていないので、アダプター的な感じで`NSUndoManager`をオーバーライドしようと考えています。

```swift:適当なコード
class TestUndoManager : NSUndoManager {
    override var canUndo: Bool { return true }
    override var canRedo: Bool { return true }
    override func undo() {
        println("undo called!!")
    }
    override func redo() {
        println("redo called!!")
    }
}
```

## 終わりに

とりあえず調べただけで、まだ実装はしていないので、何かお釣りが出るような事があったらすみません。

暫定的なiOS9対応はこんなところかな...
OpenWrt tips

##set MCS Index
- dev \<devname> set bitrates [legacy-\<2.4|5> \<legacy rate in Mbps>*] [ht-mcs-\<2.4|5> \<MCS index>*] [vht-mcs-\<2.4|5> \<NSS:MCSx,MCSy... | NSS:MCSx-MCSy>*]

- Ex. iw wlan0 set bitrates ht-mcs-2.4 7


##get wlan status
iw dev \<devname> station dump
iw dev \<devname> assoclist

```lang:get_wlan_status.sh
#!/bin/ash
CMDNAME=`basename $0`

if [ $# == '2' -a $1 == '-s' ]; then
  VALUE_S=$2
elif [ $# == '1' -a $1 != '-s' ]; then
  VALUE_S=$1
else
  echo "Usage: $CMDNAME [-s string]" 1>&2
  exit 1 ;
fi

while true;
	do date;
	iw dev $VALUE_S station dump ;
	iwinfo $VALUE_S assoclist;
	sleep 1;
	clear;
done;
```
- Ex. ./get_wlan_status.sh -s \<devname>
git commit --fixup で fixup する対象を peco/fzf で選べるスクリプト書いた

![fixup-interactive.gif](https://qiita-image-store.s3.amazonaws.com/0/735/36b6ca16-9b71-5a21-4bf8-f8bb9aad3d86.gif)

`git commit --fixup` が何かについては[git commit --fixup とは何か - 詩と創作・思索のひろば](http://motemen.hatenablog.com/entry/2015/10/git-commit-fixup)を読んでもらうとして、 fixup を適用したいコミットをいちいち `git log` で調べるのが面倒なのでインタラクティブに選べるようにした。

以下のスクリプトをパスの通ったディレクトリに置くと `git fixup` が使えるようになる。適当な変更を `git add` して `git fixup` を実行すると、その変更を fixup として適用したいコミットを peco や fzf で選べる。

```bash:git-fixup
#!/bin/bash

FILTER=${FILTER:-peco}
MAX_LOG_COUNT=${MAX_LOG_COUNT:-30}

if git diff --cached --quiet; then
    commits="No staged changes. Use git add -p to add them."
    ret=1
else
    commits=$(git log --oneline -n "$MAX_LOG_COUNT")
    ret=$?
fi

if [[ "$ret" != 0 ]]; then
    headline=$(head -n1 <<< "$commits")
    if [[ "$headline" = "No staged changes. Use git add -p to add them." ]]; then
        echo "$headline" >&2
    fi
    exit "$ret"
fi

line=$("$FILTER" <<< "$commits")
[[ "$?" = 0 && "$line" != "" ]] || exit "$?"

git commit --fixup "$(awk '{print $1}' <<< "$line")" "$@"
```
FizzBuzzで遊ぼう


#おもろーqiita
http://qiita.com/esehara@github/items/a4fbdc64896663add2ab

FizzBuzzを判定するメソッドをを生成する。
メソッドに戻り値として、必ずnumを返す
ようは、numが15ならFizzBuzz返すし、5ならBuzzを返してそれ以外は1から100の数値を返す；

```rb
def fizzbuzz(num)
  return :FizzBuzz if num % 15 == 0
  return :Buzz if num % 5 == 0
  return :Fizz if num % 3 == 0

  return num
end
```

#################################################
array##<<メソッドを理解する。
今あるオブジェクトにあるオブジェクトを追加できるメソッドと理解する

fizzbuzz_resultにfizzbuzz(num)を末尾に追加する
そうすることで、15の値の時ならFizzBuzzを返すようにしている

```rb
fizzbuzz_result = []
(1..100).each do |num|
  fizzbuzz_result << fizzbuzz(num)
end
```

#################################################

判定後の配列オブジェクトを画面に出力する

```rb
fizzbuzz_result.each do |num|
  puts num
end
```


参照URL
http://ore-public.github.io/2013/11/02/fizzbuzzruby/
---

以下お勉強

判定メソッドをを使い、判定語の値を持つArray=配列オブジェクトを生成
Array#<<メソッド
指定されたオブジェクトを自身の末尾に破壊的(オブジェクト自身が変更されるメソッド)に追加します。
Array#<<メソッドの使い方

```rb
ary = [1]
ary << 2 << 4 << 4
p ary
```

Rubyの破壊的メソッドの他の例に関して
chopメソッド(文字列の末尾を削るメソッド)から見る破壊的メソッド(オブジェクト自身変更されるメソッド)
破壊的メソッドを使用するべきではない。なぜなら、オブジェクトそれ自身の挙動を変更するから
またはそのオブジェクトに付随するすべてのオブジェクトに影響するから

```rb
a = "tom"
p a.chop #=> "to"
p a      #=> "tom"

p a.chop! #=> "ba"
p a       #=> "ba"
```
[jThree]透過オブジェクトがおかしく表示される問題について

FBのグループにあるjThreeユーザー助け合い所に透過オブジェクトに関する問題が投稿されました。
自分はjThreev3の開発者なのですが、jThreev2で発生している問題、場合によってはv3でも同様の問題が起きるケースはよくあると思うのでこの原因について整理しようと思います。

**この記事はこの問題の原因について記述されています。具体的な対処法についてはあまり言及していません。**

# 問題提起

比較的大きなステージの中で透過オブジェクトを設置した場合に、カメラの位置によっては透過が無効になってしまう場合がある問題。以下のように特定のカメラの位置によっては上手く透過されない。

![12107160_998862786832426_6163357426998031515_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/41402/edf2c1eb-1781-5846-0f50-520d1457e383.jpeg)
![12115555_998862790165759_8053941726419359382_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/41402/07c2b39d-dfa0-5ac1-093c-222c3f6e723a.jpeg)

# 原因

そもそも、レンダリングはどのように起きているかについて知る必要があります。

jThreev2では(three.jsでは)、これらのレンダリングはオブジェクトごとに行われています。オブジェクトごととは、例えばMMDのモデル、ビルボード、キューブジオメトリー等、レンダリング可能なポリゴンの集合体であるとここでは定義します。

例えば、上記のシーンではレンダリングが必要なオブジェクトは2つ存在すると考えられます。

* ステージのMMDモデル
* 正面のテクスチャが貼られているビルボード

これらがレンダリングされる順番は、２通り考えられます。

* ステージ→テクスチャ
* テクスチャ→ステージ

先に問題について言及するとすれば、この場合、**テクスチャ→ステージの順番で描画された時のみこの問題は発生します。**

## 描画順序と透過の問題

### バックバッファ上の線形合成

3DCGの描画では、バックバッファと言われるメモリ上のスケッチブックに記述されます。
レンダリングされる順番に応じて、このバックバッファに色が乗っていくと考えてください。ただし、3DCGでは透過情報を処理するためにアルファ値という名前の透過成分が保存されています。

バックバッファにあるオブジェクトが書き込まれる際に、バックバッファ上のある点Pにおける新たに書き込まれる色がC=(Cr,Cg,Cb,Ca)として表されるとします。(それぞれ、赤色、緑色、青色、アルファ値のベクトルだと解釈してください。)
また、元々のPのバックバッファの色がS=(Sr,Sg,Sb,Sa)だったとします。つまり、これはもともとSの色をした上にCの色を塗り重ねるケースを想定しています。

この際、グラフィックボード上では通常の透過合成で行われる線形合成という数式に則ってバックバッファ上のP点の結果の色D=(Dr,Dg,Db,Da)を確定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/41402/bd116dca-fa58-0393-42ac-f1b0b55e2f81.png)

### 深度テスト

ところで、これは新しく描かれるオブジェクトが前のオブジェクトよりもカメラに対して手前に存在する場合のみです。
これは毎回描画時に画面上のすべての点についてカメラからの距離を保存し、それ以上奥にある場合は描画しないようにしているのです。こうすることにより、奥の物体が手前に描かれてしまうことはありません。この機能を深度テストと言います。

通常、この機能は何も深いことを考えなくとも、オブジェクトが不透過な物体であれば問題なく動くのですが、透過な場合には話が変わってきます。

つまり、不透過な場合、ランダムな順序で描こうとも問題なく描画されますが、透過オブジェクトの場合は奥から描かないとすべての透過した結果映るオブジェクトがうまく合成されず不透過なように見えてしまうのです。

さて、この問題に対処するため一般的なゲームエンジンの場合は以下のような対処をすることで解決をします。

1. 不透過オブジェクトを片っ端から描画する
2. 透過オブジェクトをカメラから遠い順に描画する

こうすることにより、うまい感じに透過オブジェクトが映ることになります。これはjThreeでも例外ではありません。

## jThreeにおけるこの問題について

さて、MMDモデルの場合、透過オブジェクトか透過じゃないオブジェクトなのかを自動的に判別するのは至難の技なのです。
PMXファイルフォーマットにはそのモデルが不透過なオブジェクトなのか透過なオブジェクトなのかを判別するようなフラグはないため、テクスチャに１ピクセルでも透過するピクセルが含まれるならば、本来は透明オブジェクトとして描画するべきです。

しかし、テクスチャの全ピクセルにアルファ値が1以外が存在するかどうかを検証し続けていたとしたら、ロードが重くて重くて仕方ありません。
そこで、jThreev2では、**すべてのMMDオブジェクトは透過オブジェクトである**として扱われています。

結論から言えばこれが問題なのです。

というのも、「透過オブジェクトをカメラから遠い順に描画していく」と述べましたが、このカメラから遠いの基準は、オブジェクトの中心座標なのです。オブジェクトごとの描画順序の話をしているので、特定のピクセルにおける描画順序だけを変えることができないので、どちらのオブジェクトを描くかはオブジェクトの情報から決定しなければならないからです。

これは、２つのオブジェクトのサイズが著しく異なる場合に問題が出ます。
例えば、透過が上手くいかないこの例では、テクスチャの中心座標がステージの中心座標よりカメラから見た時遠いという場合に起きていると考えることができます。ステージの中心座標の方が近いため、先ほどのルールで言えば、透過オブジェクトをカメラから遠い順に描画する、すなわちテクスチャ→ステージの順番で描画されます。

しかしながら、テクスチャオブジェクトの後方に関してのみ言えば、当然ながらステージの方が遠いため合成してみる際に、深度テストでステージが描画されなくなります。こうして問題が起きているのです。

# 対策

## 対策案その1(PMXモデルをいじる方法)
ステージのPMXモデルの中心座標をずらすことにより対応できます。
ステージのPMXモデルの中心座標を非常に奥にして、頂点だけ手前にくるようにモデルを細工することにより中心座標をどんな位置でもステージの方が奥にあると認識することができます。

## 対策案その2(three.jsインターフェースを用いる方法)
three.jsインターフェースを用いてステージの材質をtransparentフラグをfalseにすることによりどんなオブジェクトよりもステージが先に描画されるように対策することができます。
three.jsは僕は全くいじったことないんで、これの詳細については独自で調べていただけると。
sidekiq の ログの日付を日本標準時に変更する

sidekiq のログフォーマットのカスタマイズ方法が [github](https://github.com/mperham/sidekiq/wiki/Logging#customize-logger-format) に記載されている。
完全に独自のフォーマットで出力したい場合には適当に `MyFormatter` を作ればよいが、日付の部分だけ変更したい場合には次のようにすれば良さそう。

```rb:config/initializers/sidekiq.rb
class MySidekiqFormatter < Sidekiq::Logging::WithoutTimestamp
  def call(severity, time, program_name, message)
    "#{time.localtime.iso8601(3)} #{super}"
  end
end

Sidekiq.configure_server do |config|
  Sidekiq::Logging.logger.formatter = MySidekiqFormatter.new
  config.redis = { url: 'redis://localhost:6379/0', namespace: "sidekiq_#{Rails.env}" }
end

Sidekiq.configure_client do |config|
  Sidekiq::Logging.logger.formatter = MySidekiqFormatter.new
  config.redis = { url: 'redis://localhost:6379/0', namespace: "sidekiq_#{Rails.env}" }
end
```

`Sidekiq::Logging::WithoutTimestamp` は sidekiq の [lib/sidekiq/logging.rb]( https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/logging.rb) を参照。
ActiveAdmin の AuthorizationAdapter#authorized? の rspec の書き方

`AuthorizationAdapter` を継承して独自の `authorized?` を作成した時のテストの書き方です。
`controller spec` を利用する手もあると思いますが、`controller spec` を 使わずに `authorized?` だけに焦点を当ててテストを作ることも可能なようです。

## テスト対象コード

ActiveAdmin Documentation の [Authorization Adapter](http://activeadmin.info/docs/13-authorization-adapter.html) に記載されている以下の `authorized?` に対する spec の書き方を記載します。

```rb:app/models/only_authors_authorization.rb
class OnlyAuthorsAuthorization < ActiveAdmin::AuthorizationAdapter

  def authorized?(action, subject = nil)
    case subject
    when normalized(Post)
      # 投稿者以外は更新や削除は出来ない
      if action == :update || action == :destroy
        subject.author == user
      else
        true
      end
    else
      true
    end
  end
end
```

## spec の書き方

```rb:spec/models/only_authors_authorization_spec.rb
require 'rails_helper'

RSpec.describe OnlyAuthorsAuthorization do
  let!(:application) { ActiveAdmin.application }
  let!(:namespace) { application.namespaces.first }
  let!(:resources) { namespace.resources }
  let(:resource) { resources[klass] }
  let(:auth) { MyAuthorization.new resource, current_user }

  # ログイン中のユーザ
  let(:current_user) { FactoryGirl.build(:user) }

  describe 'Post' do
    let(:klass) { Post }
    let(:subject) { post || klass }

    describe '投稿者がログイン中' do
      let(:post) { FactoryGirl.build(:post, author: current_user) }

      it 'index' do
        post = nil
        expected(auth.authorized?(:read, subject)).to be true
      end

      it 'show' do
        expected(auth.authorized?(:read, subject)).to be true
      end

      it 'edit' do
        expected(auth.authorized?(:update, subject)).to be true
      end

      it 'destroy' do
        expected(auth.authorized?(:destroy, subject)).to be true
      end
    end

    describe '別のユーザがログイン中' do
      let(:ohter_user) { FactoryGirl.build(:user) }
      let(:post) { FactoryGirl.build(:post, author: ohter_user) }

      it 'index' do
        post = nil
        expected(auth.authorized?(:read, subject)).to be true
      end

      it 'show' do
        expected(auth.authorized?(:read, subject)).to be true
      end

      it 'edit' do
        expected(auth.authorized?(:update, subject)).to be false
      end

      it 'destroy' do
        expected(auth.authorized?(:destroy, subject)).to be false
      end
    end
  end
end
```

## 参考URL

* http://activeadmin.info/docs/13-authorization-adapter.html
* https://github.com/activeadmin/activeadmin/blob/master/lib/active_admin/authorization_adapter.rb
telnetコマンドのないWindowsでのTCPポート確認

telnetコマンドが入っていないWindowsサーバでポートが開いてるか確認したいときの確認方法です。
最近のunixならpythonやperlが標準で使えることが多いですが、Windowsの選択肢としてはVBSかPowerShellなのでここではPowerShellでやってみます。
やってる内容はPowerShellでTCPのソケットを生成してその結果を確認しているだけなので、unix上のLLでも同様のやり方で出来るかと思います。



#手順
##前準備
PowerShell起動

```
C:\>powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.
```

TCPクライアントオブジェクト生成(socket生成)

```
PS C:\> $tc = New-Object System.Net.Sockets.tcpClient
```



##ポートが空いているとき

ターゲットへ接続（IP/ホスト、ポート番号）

```
PS C:\> $tc.connect("192.168.0.1", 80)
```

状態確認（接続可能ならTrueが返る）

```
PS C:\> $tc.connected
True
```

オブジェクトの解放

```
PS C:\> $tc.close()
```


##ポートが空いてないとき

```
PS C:\> $tc = New-Object System.Net.Sockets.tcpClient
PS C:\> $tc.connect("192.168.0.1", 81)
"2" 個の引数を指定して "Connect" を呼び出し中に例外が発生しました: "対象のコン
ピューターによって拒否されたため、接続できませんでした。 192.168.0.1:81"
発生場所 行:1 文字:12
+ $tc.connect <<<< ("192.168.0.1", 81)
    + CategoryInfo          : NotSpecified: (:) []、MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException
```

コネクション状態がFalse

```
PS C:\> $tc.connected
False
```


#要するに

```
$tc = New-Object System.Net.Sockets.tcpClient
$tc.connect(ターゲット, ポート)
$tc.connected
```

の３行です。
Trueならポートが開いている、Falseなら開いていないことが確認できます。


顧客サーバなど他のアプリケーションやスクリプトを導入出来ない環境でアドホックに確認するときに使えるかと思います。
Rstudio: 図を別窓で。


# ・long long ago
Windowsユーザだった時代は、RGuiの使いにくさに辟易し、
> [notepad++](https://notepad-plus-plus.org/)
![スクリーンショット 2015-10-19 13.59.16.png](https://qiita-image-store.s3.amazonaws.com/0/92401/6393e667-729d-f201-bb72-d33bdccdd6fd.png)

と、
> [NppToR](http://sourceforge.net/projects/npptor/)

を連帯させてエディタにしていた。
なんたって、カメレオンの絵が可愛い。

# ・Apple教に入信。
[Apple教](http://ja.uncyclopedia.info/wiki/%E3%82%A2%E3%83%83%E3%83%97%E3%83%AB_%E3%82%A4%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%9D%E3%83%AC%E3%82%A4%E3%83%86%E3%83%83%E3%83%89)に入信。

あれ？カメレオン使えねーじゃんか。てなる。
でもWindowsと違ってRGuiがかなりマシなので、ま、これでいいか。

# ・羽鳥教に入信。
最近、[羽鳥教](http://qiita.com/uri/items/a66b682507181baa0d50)に入信。
Downloadして、少しいじっただけで使ってなかったRStudioを最新版に更新。

んんんー、やっぱり使いにくい。
図がちっちゃい！！
サブディスプレイに図を映したい！！

あ〜〜〜〜、やっぱRGuiに戻ろうか…。

と思っていたら、

![スクリーンショット 2015-10-19 13.54.22.png](https://qiita-image-store.s3.amazonaws.com/0/92401/63f7c252-b7d6-af62-1b39-71502b00e482.png)


おお！
Unity(mac版)のconsoleログをターミナルで確認する


リアルタイムで見る。（ちょっと処理が遅くなるかも）
```
tail -f ~/Library/Logs/Unity/Editor.log
```

適当なテキストファイルに出力する
```
cat ~/Library/Logs/Unity/Editor.log > /tmp/test.txt
```

フィルタする
```
cat ~/Library/Logs/Unity/Editor.log | grep 'hoge'
```
※hogeが含まれる行だけ表示
Mac PC で Dock がサブディスプレイに移動してしまった時の対処法

メインディスプレイの方で、カーソルを画面の一番下に押し下げれば良い。
Dock が復活する。

---

- バージョン OS X Yosemite 10.10.4



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Coursera Machine Learningの課題をPythonで: ex1（線形回帰）

# 方針

オンライン学習プラットフォームCourseraで一番人気の講座、Stanford大学のMachine Learning。講師はAndrew Ng先生。授業はレクチャーとプログラミング課題からなるが、プログラミング課題に使用する言語はOctaveまたはMatlabが指定されている。

このプログラミング課題をPythonを使って粛々と実装していく。ただし、

* オリジナルの課題はアルゴリズムの理解を助けることを目的としているため、一部の処理は機械学習のライブラリを使用せずに自らコードを書くように設計されている。これをそのままPythonで再現するのではなく、できる限りPythonにある機械学習ライブラリを使って効率よく実装したい。

という方針。

## さっそくex1

最初の課題となるex1では線形回帰(Linear Regression)をやります。レストランチェーン経営において、過去に出店した街の人口とレストランの利益額が対になったデータセットをもとに、新たに出店する場合の利益額を予想するというものです。

さっそくコードはこちら。

``` python:ex1.py
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model

#データ読み込み
data = pd.read_csv("ex1data1.txt", header=None)

plt.scatter(data[0], data[1], marker='x', c='r')
plt.xlabel("Population of city in 10,000s")
plt.ylabel("Profit in $10,000s")

X = np.array([data[0]]).T
y = np.array(data[1])

model = linear_model.LinearRegression()
model.fit(X, y)

px = np.arange(X.min(),X.max(),.01)[:,np.newaxis]
py = model.predict(px)

plt.plot(px, py, color="blue", linewidth=3)
plt.show()
```

結果のプロットはこのように出力されます。
![ex1.png](https://qiita-image-store.s3.amazonaws.com/0/96897/1c2e9d9c-880a-ca4b-2e8b-efa00d906ca6.png)

## 今回のポイント
線形回帰モデルは、scikit-learn の`sklearn.linear_model.LinearRegression()`クラスを使用する。まずインスタンスを作成し、`model.fit(X,y)`で学習を実施。学習結果である切片と傾きはそれぞれ`model.intercept_`と`model.coef_`のように取り出せる。モデルを使って新しい`X`の値に対して予測をするには`model.predict(X)`とする。

## numpyの1次元ベクトルについて
Matlab/Octaveと違い、Pythonでは1次元の縦ベクトルと横ベクトルが区別されない。明示的に縦ベクトルを作成するには、
`np.array([[1,2,3,4,5]]).T`
とするか、
`np.array([1,2,3,4,5])[:,np.newaxis)]`
とする。--> [参考記事](http://www.kamishima.net/mlmpyja/nbayes2/shape.html)
～dataで終わるモデルの作り方

Railsでは、モデル名は単数形、ビューやコントローラは複数形になる。
**SampleData**のように、単数形と複数形を一致させたい場合は以下のようにする。

```text:modelの場合
$ rails g model SampleData
      invoke  active_record
      create    db/migrate/20151019042805_create_sample_data.rb
      create    app/models/sample_data.rb
```

```text:controllerの場合
$ rails g controller SampleData
      create  app/controllers/sample_data_controller.rb
      invoke  erb
      create    app/views/sample_data
      invoke  helper
      create    app/helpers/sample_data_helper.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/sample_data.coffee
      invoke    scss
```

scaffoldの場合は、オプションを指定しないとモデルファイル名が**sample_datum.rb**となってしまう。

```text:scaffoldの場合
$ rails g scaffold SampleData --force-plural
      invoke  active_record
      create    db/migrate/20151019043550_create_sample_data.rb
      create    app/models/sample_data.rb
      invoke  resource_route
       route    resources :sample_data
      invoke  responders_controller
      create    app/controllers/sample_data_controller.rb
      invoke    erb
      create      app/views/sample_data
      create      app/views/sample_data/index.html.erb
      create      app/views/sample_data/edit.html.erb
      create      app/views/sample_data/show.html.erb
      create      app/views/sample_data/new.html.erb
      create      app/views/sample_data/_form.html.erb
      invoke    helper
      create      app/helpers/sample_data_helper.rb
      invoke    jbuilder
      create      app/views/sample_data/index.json.jbuilder
      create      app/views/sample_data/show.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/sample_data.coffee
      invoke    scss
```
AWS Lambda つかって WakaTime Summary を Tweet する

各エディタにプラグインをつっこむことでコーディング時間を計測してくれるサービス [WakaTime](https://wakatime.com/) この一ヶ月ぐらいつかってみてるんだけど統計でてくるのおもしろい。で、API もあるのでてきとうにまとめて tweet してみるテスト。あと、[AWS Lambda](http://aws.amazon.com/jp/lambda/) が cron 的なことができるようになったとかなので、ついでにそれもテスト。

Python コードはこんなん。

```py:lambda_function.py
# -*- coding: utf-8 -*-

import requests
import twitter

import config


def get_stats():
    headers = {'Authorization': 'Bearer ' + config.wakatime['access_token']}
    return requests.get('https://wakatime.com/api/v1/users/current/stats/last_7_days', headers=headers)


def tweet(status):
    api = twitter.Api(consumer_key=config.twitter['consumer_key'],
                      consumer_secret=config.twitter['consumer_secret'],
                      access_token_key=config.twitter['access_token_key'],
                      access_token_secret=config.twitter['access_token_secret'])
    # print api.VerifyCredentials()
    api.PostUpdate(status)


def make_summary(data):
    total = data['human_readable_total'].replace('hours', 'h').replace('minutes', 'm')
    lang_stats =  map(lambda l: '{} {}%'.format(l['name'], int(round(l['percent']))), data['languages'][0:4])
    return 'Last week\'s coding stats: Total {} ({}) (via @WakaTime https://wakatime.com/@Saqoosha)'.format(total, ' / '.join(lang_stats))


def lambda_handler(event, context):
    result = get_stats()
    print result.text
    summary = make_summary(result.json()['data'])
    tweet(summary)
    return summary


if __name__ == '__main__':
    # import json
    # with open('_exp/data.json') as f:
    #     data = json.load(f)
    #     summary = make_summary(data['data'])
    #     print summary
    lambda_handler(None, None)
```

AWS Lambda つかうといの注意点は 3rd party module を `pip install python-twitter -t .` とかって↑のコードとおなじとこにいれてまとめて ZIP でアップロードしないといけないてのと、cron のフォーマットがいつものやつとちょっと違うってぐらい。かんたん。サーバーレスでできるのらくちん。
Vimで中括弧で改行したらインデント

vimrcで以下のように閉じ括弧の補完を設定している.

```vim
inoremap { {}<LEFT>
inoremap [ []<LEFT>
inoremap ( ()<LEFT>
inoremap < <><LEFT>
inoremap " ""<LEFT>
inoremap ' ''<LEFT>
```
この設定をしているときに限り,中括弧で改行すると

```c

{
  <カーソル>
}
```
のように,インデントしてすぐに書ける位置にカーソルが移動するスクリプトを書いた.

```vim:.vimrc
inoremap { {}<LEFT>

" 隣接した{}で改行したらインデント
function! IndentBraces()
	let nowletter = getline(".")[col(".")-1]	" 今いるカーソルの文字
	let beforeletter = getline(".")[col(".")-2]	" 1つ前の文字

	" カーソルの位置の括弧が隣接している場合
	if nowletter == "}" && beforeletter == "{"
		return "\n\t\n\<UP>\<RIGHT>"
	else
		return "\n"
	endif
endfunction
" Enterに割り当て
inoremap <silent> <expr> <CR> IndentBraces()
```

参考にしたサイト
[Vimで隣接した括弧の開き記号を消すと同時に閉じ記号も削除するスクリプト](http://qiita.com/m_mysht/items/56e5d5a17d07a64d8b65)
[Vimで括弧の補完→改行してインデント]
(http://qiita.com/kuwana/items/d9778a9ec42a53b3aa10)
ADX2LEで楽器音2（トラックMonoフラグで音を止める）

#ADX2LEで楽器音2

![複数鳴る？.png](https://qiita-image-store.s3.amazonaws.com/0/96808/82f30041-ee0e-5be4-261d-06879ab52eb8.png)

前回の[ADX2LEで楽器音](http://qiita.com/tatmos/items/bf2a1af800abdf39bdf7)を使っていて、
一番上のトラックが複数回なってしまうことがあって、なんだろうと思ったので調べてみた。

##波形の存在時間とオートメーション

どうやら、波形の長さがある部分にボリュームのオートメーションがかかってなってしまっている様子。
図解するとこんな感じ。
![ループでオートメーションがかかってる.png](https://qiita-image-store.s3.amazonaws.com/0/96808/4940ff3d-9f92-278b-1578-9f50c6f262ca.png)

##音を止める

じゃぁ、最初のトラックの音を止めてみようということで、
トラックMonoフラグ有効にし、0.1秒の無音波形を置いてみたら止めることができた。

![無音で音を止める.png](https://qiita-image-store.s3.amazonaws.com/0/96808/59d81a28-304b-7101-871d-e733e83b32b7.png)
curlコマンドでGET/POSTをサクっと確認


# やりたいこと
ターミナルからGET/POSTを簡単に送信したい。
あとファイルも送信したい。

# （その１）GET
送り側

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

# 受け側のURL
url="http://example.com/cgi-bin/recv.php?get1=get1_val&get2=get2_val"

# 実行
curl $url
```

受け側（$_GET）　※HTTPサーバを立てるのが面倒な場合は、一番下の「備考」を参照

```sh:recv.php
<?php
var_dump($_GET);      
```

実行

```sh
$ ./send.sh
array(2) {
  'get1' =>
  string(8) "get1_val"
  'get2' =>
  string(8) "get2_val" 
}
```

# （その２）POST
送り側

```sh:send.sh
#!/bin/bash
url="http://example.com/cgi-bin/recv.php"
curl -F 'post1=post1_val'  -F 'post2=post2_val' $url 
```

受け側（$_POST）

```sh:recv.php
<?php
var_dump($_POST);      
```

実行

```sh
$ send.sh
array(2) {
  'post1' =>
  string(9) "post1_val"
  'post2' =>
  string(9) "post2_val"  
}
```

# （その３）POST(ファイル送信)
送り側（@を付ける)

```sh:send.sh
#!/bin/bash
url="http://example.com/cgi-bin/recv.php"
curl -F 'post=@/tmp/a.jpg' $url
```

受け側（$_POST）

```sh:recv.php
<?php
var_dump($_FILES);   
```

実行

```sh
$ ./send.sh
array(1) {
  'post' =>
  array(5) {
    'name' =>
    string(5) "a.jpg"
    'type' =>
    string(10) "image/jpeg"
    'tmp_name' =>
    string(14) "/tmp/phpvNLvGY"
    'error' =>
    int(0)
    'size' =>
    int(18136)
  }
}
```

## curlでproxyを設定する場合は以下を参照
https://qiita.com/tanaka-kj/items/c6dad4efc0dff4fecd93

## サーバを立てるのが面倒な場合はpythonで確認できます
https://qiita.com/tkj/items/210a66213667bc038110
makepkg 署名エラー対処法メモ


archlinux absでpackage rebuildするときに次のようにエラーがでることがある。

```bash
==> Verifying source file signature with gpg...
   ...snip... FAILED (unknown public key XXXXXXXXXXX)
```

今の環境は hkp(port 11371) が閉じられているので、gpg の鍵取得ができないのが原因ぽい。`~/.gnupg/gpg.conf` の keyserver で次のように指定する（[参考](http://jotham-city.com/blog/2015/02/14/verifying-gpg-signatures-for-makepkg/)）。

```bash
keyserver http://http-keys.gnupg.net
```

そして鍵を取得する。

```bash
gpg --recv-keys XXXXXXXXXXX
```

鍵が無事取得できたら再度`makepkg`を実行する。
動的にクラス名やテーブル名を取得・生成する際に便利なメソッド

# String#pluralize

単数形から複数形に変換

```
irb(main):014:0> ['phone', 'wolf', 'fish', 'class'].map(&:pluralize)
=> ["phones", "wolves", "fish", "classes"]
```

# String#singularize

複数形から単数形に変換

```
irb(main):015:0> ["phones", "wolves", "fish", "classes"].map(&:singularize)
=> ["phone", "wolf", "fish", "class"]
```

# String#underscore

クラス名からファイル名に変換

```
irb(main):016:0> "ActiveRecord::Base".underscore
=> "active_record/base"
```

# String#camelize

ファイル名からクラス名に変換

```
irb(main):017:0> "active_record/base".camelize
=> "ActiveRecord::Base"
```

# String#classify

テーブル名からクラス名に変換

```
irb(main):006:0> ['people', 'wolves'].map(&:classify)
=> ["Person", "Wolf"]
```

# String#tableize

クラス名からテーブル名に変換

```
irb(main):007:0> ["Person", "Wolf"].map(&:tableize)
=> ["people", "wolves"]
```
Homebrewのupdateが上手くいかない時にしたこと

出社後に `brew update && brew upgrade` てする習慣があるので今朝してみたら

```:bash
> brew update && brew upgrade
Error: The /usr/local directory is not writable.
Even if this directory was writable when you installed Homebrew, other
software may change permissions on this directory. Some versions of the
"InstantOn" component of Airfoil are known to do this.

You should probably change the ownership and permissions of /usr/local
back to your user account.
  sudo chown -R $(whoami):admin /usr/local
```

なんて言われてしまった。
Homebrewのディレクトリのパーミッションが書き換わってしまっている様なので
書いてある通りにやってみると

```:bash
> sudo chown -R  $(whiami):admin /usr/local
Password: 
> brew update && brew upgrade
Stashing .....
M dir
.
.
.
Error: Failure while executing: git stash pop --quiet
```

怒られた…
Stashしろってことはファイルの中身まで書き換わってるのかな？
特に変更したことないんだけどなぁ…

ともあれ

```:bash
> cd /usr/local && git stash pop --quiet
Library/Formula/.....rb already exists, no checkout
.
.
.
.
Could not restore untracked file from stash
> brew update && brew upgrade
updated .....
```

こんな感じで更新出来たのでまぁ良しとしよう。
[備忘録] 低速CPUでwindows10環境構築 

# 目的
 以前、そこそこのスペックを持ったPCにクリーンインストールする形で、[Windows 10(64bit版)での開発環境構築](http://qiita.com/kmry2045/items/545cb4399617eac538a7)を行った。

 今回は、子供のDVD閲覧用となっている古いWindows7機(64bit版)があまりに遅かったので、夜間にwindows10にアップデート。アップデート直後、やはり遅かった。。タスクマネージャーを頼りに、いくつかの対策を行い、なんとかなったところを備忘録に記す(おそらくは、普通のwindows PCで重い作業を行う際にも役立つものと考え)。

#　前提
- 機器名 : Lenovo G575 #量販店で安く買ったもの。
- CPU : AMD E-450
    - 2011年当時のレビュー記事[「遅くてストレスを感じるが、我慢すればなんとか使える」](http://trendy.nikkeibp.co.jp/article/column/20111104/1038523/?P=5&rt=nocnt)
- Memory : 6GB (GPU共有)
    - インストール直後、ブラウザ閲覧程度で3GB弱のメモリ使用量。新OSにするにはRAM 4GBがミニマムか。

# 講じた対策 
## [1] windows10固有:"windows 10 遅い"でググり対策を探る。
Chromeが重い中、なんとか検索を行い、いくつかの記事をななめ読みし、順次対策を講じる。
### 1) [windows10で遅い場合の対処法](http://productionig.sakura.ne.jp/blog/2015/08/23/windows10%E3%81%A7%E9%81%85%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/) (検索トップ記事)
[２つの原因]
1.windows update => P2Pでの他者PCのアップデート支援が重さの原因。
2.windows search によるindexの再定義 => インストール直後の(少なくとも)数時間は、インデックス作成で重い。

とりあえず、上対処法に従う。...が、まだ重い。
###2) テーマを変える
デスクトップで右クリックして、シンプルなテーマ(例、ハイコントラスト)。フォントその他の対策もまだまだあるのだろうが、旧来と同じく、テーマ選択でやはり軽くなる。

## [2] タスクマネージャーを見ての対策
cf.タスクマネージャーのショートカットキー:「Ctrl」＋「Shift」＋「Esc」)
### 1) Antimalware Service Executableプロセス停止
ここから先は、個別環境ごとの話となるだろうが、このPC
では、Antimalware Service ExecutableプロセスがCPUパワーの1/3以上を占めていた。
[先人の本プロセス対策](http://d.hatena.ne.jp/vecter/20150812/1439378207)に従い、本プロセスを停止し、再起動。動作がだいぶ軽くなる(windows7の時より若干ましなレベル)。

### 2) ブラウザをVivaldiに切り替え(脱chrome)
上のAntimalwareプロセスを一部停止した後、最も重いプロセスはChrome。低スペックPCでは厳しいらしい。代替策として、半年前くらいに報じられた後、開発が順調に進んでいるらしい軽量ブラウザVivaldiを導入をすることとする(cf.[Vivaldiの日本人COO記事](http://ascii.jp/elem/000/001/014/1014286/index-2.html))。[ホームページ](https://vivaldi.com)から、"Vivaldi 1.0.219.50 (Developer Build) （32 ビット）"をインストール。ホームページの記述にあるように、"おまいらのための新しいブラウザ"といった感じで、開発版はちょっと不安定だがやはりChromeより軽い。

- (付記)　[Altenateページ](https://vivaldi.com/download/#alternate)から、Vivaldi64
ビット版をインストールすることが可能。こちらの方が軽く動く、らしい。64ビット版の上書きインストールは簡単。

#結果

## windows7の時より快適
タスクマネージャーを見ると、Antimalware Service ExecutableプロセスやSystemプロセスなどが動いたりしている時のCPUは、概ね70~90%程度近くの使用率。IntelliJを入れたところ、エディタは普通に動く(Kotlinのコンパイルは遅い、、必要に迫られたなら要対策)。
## Vivaldiでのブラウジングは実用的
何かの際に使おうとしても、ブラウザすらまともに動かない状態は脱せられたので、代替機としては、ひとまず満足。テーマを軽くした後の、ブラウザ起動時のメモリ使用量は2GB以下。DVD再生しながら、qiitaに投稿する時のCPU使用率は、40~70%程度。
Serverspecのインストール要件まとめ

#Serverspecのインストール要件について(required specifications)

##はじめに

Serverspecは低スペックのマシンに導入可能ですが、設計しないといけないので調べた内容をまとめておきます。しかし、公式サイト・GitHubに**これ！**という情報が見当たらなかったので完璧な情報ではありません。

必要なスペックは、以下に分けて書いていきます

* サーバ
* クライアント


##サーバ側

* ruby
* gem
* SSH


##クライアント側

* SSH
* AIX,Arch Linux,Darwin(Mac OS X),Debian,Fedora/Red Hat/CentOS,FreeBSD,Gentoo Linux,NixOS,OpenBSD,openSUSE,Plamo Linux,SmartOS,Solaris,SUSE,Ubuntu,Windowsのいずれか

##ハードウェアスペックについて

**特に公式に記載がありませんが**、OSが動作する最低スペックとserverspec及びspecファイル群を保存できる容量があれば良さそうです。
SORACOM AirのSIM開封からSMS受信までを5分でこなすために

去る10/16(金)に行われた[SORACOM Developers Conference #0](http://ascii.jp/elem/000/001/066/1066736/)のLT枠で[SIMの開封からSMS受信までを5分でやりきる！](http://www.slideshare.net/ma2shita/developers-conference-0-lt-simsms)の発表を行いました

これだけだと、本当に肉体芸人となってしまいそうなので、ちゃんとテクニカルなことも書き記しておきます

準備
---

APIを操作するために[SORACOMユーザコンソール](https://console.soracom.io)の[アカウント作成](http://dev.classmethod.jp/cloud/soracom1/)と、SMS送信を行うために[Twilio](https://www.twilio.com)の[アカウントを作成](http://blog.twilio.kddi-web.com/2014/06/25/%E6%96%B0%E8%A6%8F%E7%99%BB%E9%8C%B2%E3%81%A7%E3%81%99%E3%81%90%E4%BD%BF%E3%81%88%E3%82%8B-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E9%9B%BB%E8%A9%B1-sms-api-twilio%E3%81%AE%E6%96%B0%E8%A6%8F%E7%99%BB%E9%8C%B2/)します

また、それぞれAPIを操作するために下記の情報を控えた上で `~/.bashrc` に環境変数として読み込ませます

```bash:~/.bashrc
export SORACOM_EMAIL=ma2sXXXXXXX@XXXXXXXXXjp
export SORACOM_PASSWORD=pXXXXXXXXXXd

export TWILIO_ACCOUNT_SID=AC18XXXXXXXXXXXXXXXXXXXXXXXXXXXe08
export TWILIO_AUTH_TOKEN=e5bXXXXXXXXXXXXXXXXXXXXXXXXX026f
export TWILIO_MY_NUMBER=3000000092
```

SORACOM AirのAPIをCLIから操作できるよう、SDKもインストールしておきます

```console
$ gem install soracom --no-rdoc --no-ri
```

SIMの登録からSMS送信まで
---------------------

```console
$ MY_IMSI=44XXXXXXXXXXX02

$ soracom sim register --imsi=$MY_IMSI --registration-secret=00000
$ soracom sim activate --imsi=$MY_IMSI
$ MY_MSISDN=$(soracom sim list --filter key:imsi value:$MY_IMSI | jq -r .[].msisdn)
$ curl -X POST https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Messages.json --data-urlencode "From=+1$TWILIO_MY_NUMBER" --data-urlencode "Body=SORACOM Air is Verrrry GOOOOOOD!" -u $TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN --data-urlencode "To=+$MY_MSISDN"
```

LT中で実際にやっていたのは `MY_IMSI` の入力程度でした

LTの途中でTwilioのAPIのinvokeに失敗していました
これは `MY_MSISDN` を取得するコマンドを忘れたため、SMS送信先の電話番号が `To=+` と無効な電話番号になっていたためです
(ココらへんで感じた現場の一体感は、私だけではなかったハズ！)

あとがき
----

考えてみれば `register` や `activate` を発行してから即時利用可能になるということは、技術的に難易度が高いはずです
しかし、それを微塵も感じさせること無く動作するというところに、ソラコムの技術力の高さがあるのだと感じております

今度はちゃんとIoTハードウェア枠として参戦します m(__)m
（呼んでもらえるのか？
Ansibleのインストール要件まとめ

#Ansibleのインストール要件について(required specifications)

##はじめに

Ansibleは低スペックのマシンに導入可能ですが、設計しないといけないので公式に書かれている内容をまとめておきます。

[公式サイト：Ansibleインストール要件](http://docs.ansible.com/ansible/intro_installation.html)

※公式にバージョンの記載がないため原則全て同じと考えていますが、とりあえずStable版の1.9とします


必要なスペックは、以下に分けて書いていきます

* サーバ
* クライアント


##サーバ側（Ansibleインストール側）

* Python 2.6 or 2.7
* Red Hat, Debian, CentOS, OS X, BSDs系など（Windowsはサポート外）

```text:Note
OS XにおいてAnsible2.0でfile handlesを15以上forkさせたければ上限を増やして下さい。

コマンド：sudo launchctl limit maxfiles 1024 2048

そうでない場合は、"Too many open files" errorが発生します
```

##クライアント側

* 普通のSSH（デフォルト設定はsftp、ansible.cfgでscpに変更可能）
* Python 2.4 or それ以上（ただしPython 2.5未満の場合はpython-simplejsonが必要）

```text:Note
SELinuxをenableにしたい場合は、copy/file/templateモジュールに関連した機能を使う前にlibselinux-pythonを導入して下さい。このモジュールはyumモジュールで導入可能です
```


【追記】
ControlPersistを使用したい場合はOpenSSH5.6以降が必要となるため、サーバ・クライアントとともに確認が必要です。

※redhat6.6だと5.3だった

##ハードウェアスペックについて

**特に公式に記載がありませんが**、OSが動作する最低スペックとAnsible及びPlaybook群を保存できる容量があれば良さそうです。
AWS:TAGで指定したサーバのEBS Snapshotを取得

# LambdaでPythonがサポートされたので使ってみる

Python初心者なので、勉強がてらLambda Pythonを使ってみました。
Rootボリュームしか取っていないので、手が空いたら配列処理するよう改良します。

```ebs_backup.py
import os, time
import json
import boto3
from datetime import datetime

#=== setting - Change here!!!
tag_name1 = "myServer1"

#=== execute take snapshot
def execute_snapshot(ebs_id):
    ec2 = boto3.resource('ec2')
    ebs = ec2.Volume(ebs_id)
    try:
        now = datetime.now()
        desc = "%s_%s" % (tag_name1, now.strftime("%Y%m%d"))
        snap = ebs.create_snapshot(Description=desc)
        snap.create_tags(
            Tags=[
                {
                'Key': 'Name',
                'Value': tag_name1
                },
                {
                'Key': 'Date',
                'Value': now.strftime("%Y%m%d")
                },
            ]
        )
    except:
        return "NG"
    return "OK"

#=== get EC2 Info
def get_ec2_info(tag_name):
    client = boto3.client('ec2')
    info_ec2 = client.describe_instances(
        Filters=[
            {
                'Name': 'tag-value',
                'Values': [
                    tag_name,
                ]
            },
        ]
    )
    try:
        ec2_ebs = info_ec2['Reservations'][0]['Instances'][0]['BlockDeviceMappings'][0]['Ebs']['VolumeId']
    except:
        print "NG"
    return ec2_ebs

#=== main process
def lambda_handler(event, context):
    print '========= Make Snapshot(%s): %s =========' % (tag_name1, datetime.now())
    ebs_id = get_ec2_info(tag_name1)
    result = execute_snapshot(ebs_id)
    print '========= Process is %s. End time(Volid=%s): %s =========' % (result, ebs_id, datetime.now())
    return "OK"
```

LambdaのCron使うとめちゃ便利！
iOSのライブラリ管理(Carthage)

# iOSのライブラリ管理

## 検証環境
- Mac OS X El Capitan 10.11
- XCode 7.0.1
- Carthage 0.8.0

iOSのライブラリ管理で有名なものとして以下の２つのツールがあります。

- CocoaPods
- Carthage（カルタゴ/カッセージ）

## Carthage

### 適用できる環境
- iOS 8以降

carthageはdynamic frameworkのみをサポートしているため、iOS8以上が条件になっています。

### インストール方法

brewコマンドでインストール可能です。

```
brew update
brew install carthage
```

## ライブラリの追加方法

今回は`Swift`の通信ライブラリである`Alamofire`を追加してみることにします。

### 1.Cartfileの作成

プロジェクトディレクトリにCartfileを作成し、インストールするライブラリのリポジトリを指定します

```Cartfile
github "Alamofire/Alamofire"
```

以下のようにライブラリのバージョン指定も可能です。

```Cartfile
github "Alamofire/Alamofire" == 3.0.0
```

| 記号       | 説明                   |
|------------|------------------------|
|  == 0.1      | バージョン0.1のみ      |
| >= 0.1 | バージョン0.1以降の最新バージョン |
| ~> 0.1.2 |  0.1.xの最新バージョン |

### 2.インストールの実行

以下のコマンドを入力すると、Cartfileの内容に基づいてソースコードの取得、ビルドが実行されます。

```
carthage update
```

`update`コマンドの実行が完了すると、以下のファイルが生成されます。

Carthageは上記のビルドファイル以外にもいくつかのファイルを生成します。
Carthageが生成するファイルは以下のとおりです。

- Cartfile.resolved
  - 依存関係を含めたバージョンを管理するファイルです。マニュアルで変更してはいけません。
- Carthage/Build
  - ビルドされたファイルが格納されます。
- Carthage/Checkouts
  - チェックアウトされたソースコードが格納されます。

ビルドディレクトリには、`iOS`、`OSX`、`WatchOS`の各プラットフォーム用のビルドファイルが生成されます。
もし特定のプラットフォームのファイルのみ生成したい場合は、以下のように`--platform`オプションをつけて`update`コマンドを実行します。

```
carthage update --platform iOS
```

### 3.生成されたフレームワークの追加

プロジェクトの`General`タブの`Embedded Binaries`に、`Alamofire`をDrag & Dropします。

#### 対象ファイル
Carthage/Build/iOS/Alamofire.framework

### 4.importする

あとは下記のようにImportして使えるようになります。

```
import Alamofire
```

### 5.Build Phasesへのスクリプト追加

プロジェクト設定の`Build Phases`のタブで`＋`をクリックして`New Run Script Phase`を選択し、`Shell`のところに以下の内容を設定します。

```
/usr/local/bin/carthage copy-frameworks
```

この設定をしないとStore申請で問題がでるようです。
Gitで空フォルダを管理する


空のままコミットしたいフォルダに ```.gitignore```ファイルを作成。中身は下記

```
*
!.gitignore
```

あとでファイルを追加したいフォルダなら```empty```フォルダを追加しておく。

# 参考
- [Gitで空フォルダを管理したいときemptyを使うか.gitignoreを使うか - なんたらノート第三期ベータ](http://tanakahisateru.hatenablog.jp/entry/20120120/1327044729)
[swift]配列の中に辞書を組み込む


Jsonファイルをパースして、その内容をリストに表示させたいので、配列の中に辞書を入れ込んでみました。
まずはJSONの読み込み部分。
普通にJSONを読み込もうとすると、けっこう大変そうなので、SwiftyJsonというものを使用します。
次からダウンロードできます。
https://github.com/SwiftyJSON/SwiftyJSON

ダウンロードしたファイルをxcode上のフォルダに右クリックで「Add File to 〜」で読み込みます。
そのJSONの内容を配列と辞書を組み合わせて読み込みます。

````swift:Jsonの読み込み
let path = NSBundle.mainBundle().pathForResource("titleList", ofType: "json")
let jsondata = NSData(contentsOfFile: path!)
var json = JSON(data:jsondata!)
````

JSONの中身を追加していきます。
まず、「あ行」などの行を配列に格納して、それぞれの作者の情報を辞書で各行に入れ込みます。
下記のページで配列に辞書を組み込む方法が記述されています。
http://hamasyou.com/blog/2014/09/12/swift-mysterious-multi-dimensional-array/

この方法だと、最初に配列と辞書の初期化を行います。

````swift:初期化
    typealias furigana = Dictionary<String, AnyObject>
    var myItems:[[furigana]]=[[]]
````
「furigana」という辞書の値を初期化。StringとAnyObjectでなんでも入るようにします。
そのあと、多次元配列にfuriganaを入れ込みます。

````swift:行配列と作者の設定
for var y=0; y<json["list"].count; y++ {

self.mySections.append(json["list"][y]["listName"].string!)
self.myItems.append([])

	for var i=0; i<json["list"][y]["listInfo"].count; i++ {
    	self.myItems[y].append([
       
       "name":json["list"][y]["listInfo"][i]["aouther"].string!,
       "kana":json["list"][y]["listInfo"][i]["kana"].string!
       
       ])
       self.myItems[y][i]["title"] = json["list"][y]["listInfo"][i]["title"].count
       }
}
````
先ほどのページはなかったのですが、最初の初期化部分では、辞書の要素を追加することができませんでした。
つまり、２つ目の配列を追加することができなかったので、「self.myItems.append([])」を加えることで、新しい配列を追加することができるようになりました。

さらに、別の型を追加する場合、"name"や"kana"と同じようにintを追加しようと思ったのですが、
うまくいかなったので、別の行にして追加しました。

最後に、読み込んだJSONの内容です。

````JSON: titleList. json
{"list":[
	{"listName" : "あ行", "listInfo":[
		{"aouther":"作者名あああああ", "kana":"aaaaa", "title":[
			{"titleName":"作品名あ001", "url":"URL11111"},
			{"titleName":"作品名あ002", "url":"URL22222"},
			{"titleName":"作品名あ003", "url":"URL33333"}
		]},
		{"aouther":"作者名いいいいい", "kana":"iiiiii", "title":[
			{"titleName":"作品名い001", "url":"URL11111"},
			{"titleName":"作品名い002", "url":"URL22222"},
			{"titleName":"作品名い003", "url":"URL33333"},
			{"titleName":"作品名い004", "url":"URL44444"},
			{"titleName":"作品名い005", "url":"URL55555"}
		]},
		{"aouther":"作者名ううううう", "kana":"uuuuuu", "title":[
			{"titleName":"作品名い001", "url":"URL11111"}
		]}
	]},
	{"listName" : "か行", "listInfo":[
		{"aouther":"作者名かかかかか", "kana":"aaaaa", "title":[
			{"titleName":"作品名か001", "url":"URL11111"},
			{"titleName":"作品名か002", "url":"URL22222"},
			{"titleName":"作品名か003", "url":"URL33333"}
		]},
		{"aouther":"作者名きききききき", "kana":"aaaaa", "title":[
			{"titleName":"作品名き001", "url":"URL11111"},
			{"titleName":"作品名き002", "url":"URL22222"},
			{"titleName":"作品名き003", "url":"URL33333"},
			{"titleName":"作品名き004", "url":"URL44444"},
			{"titleName":"作品名き005", "url":"URL55555"}
		]},
		{"aouther":"作者名くくくくくく", "kana":"aaaaa", "title":[
			{"titleName":"作品名く001", "url":"URL11111"}
		]}
	]},
]}
````
Rubyでクローラー

Rubyによるクローラー開発技法のまとめ

----

## クローラーとは
クローラー(Crawler)とは、Web上の文章や画像を自動的に収集してくれるプログラムのこと
もともとは、検索エンジン用にWebサイトをインデックス化するために作られた。Googleのボットが有名。
クローラー(Crawler)以外にもスパイダー(spider)やロボット(robot)等呼ばれる

## クローラーの目的
Webサイトを巡回して取得した情報をデータベース化すること

## クローラーの構成要素
クローラーは以下3つに分類される

    1. コンテンツの取得（クローリング）
    2. データの解析（スクレイピング）
    3. データの保存

#### 1.コンテンツの取得(クローリング)
HTMLをダウンロードして、そのHTMLに含まれるリンクを更に辿る。
リンク先としてはaタグやImgタグを辿る

#### 2. データの解析（スクレイピング)
ダウンロードしたページの解析をして、
欲しい情報を抜き取る
以下の方法がある

* 正規表現を使う
* HTMLを構文解析する
	* 取得したHTMLを構文解析(パーサー)するXPathを使って情報を抜き取る
	* 正規表現表現で情報を取得することに比べて解析処理コストはかかる。が、簡潔にプログラムを記述できる
	 

#### 3. データの保存
取得した情報をファイルまたはデータベースに保存する
クローラを定期的に利用する場合はデータの保存は必須になる

## Rubyの便利なライブラリ
Rubyにはクローラーを実行する上で便利なライブラリがある。
標準のライブラリもあればGemで公開されているものも

#### ダウンロード用のライブラリ
* open-uri (標準ライブラリ)
* httpclient 

#### HTML構文解析用のライブラリ
* Nokogiri

#### クローラ用のフレームワーク
* anemone

##### nokogiriを使ったサンプル

```nokogiriのサンプルスクリプト
#!/usr/bin/ruby

# About nokogiri

require 'open-uri'
require 'nokogiri'

#doc = Nokogiri.HTML(open("http://nokogiri.org/"))
doc = Nokogiri.HTML(open("http://www.homes.co.jp/"))

# ページに含まれるリンクを出力する
doc.css('a').each do |element|
  puts element[:href]
end
# =>
# http://www.homes.co.jp/
# http://www.homes.co.jp/contents/no1/
# http://www.homes.co.jp/contents/abouthomes/
# http://www.homes.co.jp/contents/sitemap/
# http://www.homes.co.jp/callcenter/
# ...


# h2のテキストを出力する
doc2 = Nokogiri.HTML(open("http://www.homes.co.jp/"))
doc.xpath('//h2').each do |e|
  puts e.text 
end
# =>
# 住まいを探す
# 不動産のカテゴリ一覧
# 住まい探しをはじめる前に
# 住まいが決まったら
# 住まいをキレイに、快適に
# 今と未来のオーナーの方へ
# 不動産会社の方へ
# 住宅研究、データベース
# HOME'Sとつながろう
# Pick up!
```

anemoneを使った例
以下の数行で、指定したページから1階層下までのh2のテキストを取得してきてくれる。超便利。

```anemoneの例
#!/usr/bin/ruby

# About anemone

require 'anemone'

Anemone.crawl("http://www.homes.co.jp/", :delay => 3,:depth_limit => 1) do |anemone|
  anemone.on_every_page do |page|
    page.doc.xpath("//h2").each do |title|
      puts title.text
    end
  end
end

```

#### クローラのお作法
大規模なサイトの場合1リクエスト３~５秒は間隔空けといた方が良いらしい。
中規模や小さめのサイトならもっと余裕を持たせる。
また、クローラの可否をrobots.txtで指示をしているので、
robots.txtを見て、クローラをするかどうかを判定するようにした方がよい

##### robots.txtについて
    robots.txtとは、サイトの所有者がクローラに対して指示をするためのファイル。
    検索エンジンに対して、クローラを禁止を指示できたりする。
    ただし、強制力はない。ので、クローラをかける側はできるだけrobots.txtの内容に沿ってクローラをかけること
    クローラの判定の可否にrobotexというライブラリが便利
    
```robotexを使ったクローラの可否判定
#!/usr/bin/ruby

# About robotex

require 'robotex'

robotex = Robotex.new "Crawler"
p robotex.allowed?("http://www.yahoo.co.jp/") # => true
p robotex.allowed?("http://www.facebook.com/") # => true
p robotex.allowed?("http://www.homes.co.jp/") # => true
```
Atom Editor + Typescript な環境構築時に参考にしたサイトメモ

実際のインストール手順を参考にしたもの
[TypeScriptってどんなもの？ プロ生ちゃんと始めてみよう！](http://www.buildinsider.net/web/pronamatypescript/01)
[Windowsに頼らずに、お金をかけずにTypeScriptを始めてみる](http://flabo.io/code/20150430/01-start-typescript-independently-of-windows/)

その他Atom、Typecriptについて参考にしたもの
[AtomでTypeScriptの環境を構築する](http://qiita.com/Sugima/items/113eb16f14ca1e9a6d0f)
[TypeScriptを使ってECMAScript 2015時代のJavaScriptを先取りしよう！](https://html5experts.jp/vvakame/16241/)
[はてなブックマーク > テクノロジー > atom-typescript](http://b.hatena.ne.jp/entry/s/atom.io/packages/atom-typescript)
[Atom TypeScript](https://atom.io/packages/atom-typescript)
[はじめよう TypeScript - 入門から実践まで - 素の JavaScript とはさようなら! ](http://www.slideshare.net/jsakamoto/type-script-49408371)
無料ではじめられそうな無料枠のある日本製バックエンドのサービス(BaaS、mBaaS)

2015年10月19日調べ

**ニフティクラウドmobile backend**　
[ニフティクラウドmobile backend](http://mb.cloud.nifty.com/)
[価格](http://mb.cloud.nifty.com/price.htm)

**appiaries**
[appiaries](http://www.appiaries.com/jp/)
[価格](http://www.appiaries.com/jp/pricing/)

**Kii**
[Kii](http://jp-cloud.kii.com/)
[価格](http://jp.kii.com/service_price/)

**Milkcocoa**
[Milkcocoa](https://mlkcca.com/)
[価格](https://mlkcca.com/price.html)

**GMO mBaaS**
[GMO mBaaS](http://www.gmo-mbaas.com/)
[価格](http://www.gmo-mbaas.com/spec/)

**App42 cloud API**
[App42 cloud API](http://api.shephertz.com/jp/)
[価格](http://api.shephertz.com/jp/pricing.php)
日本語化された海外サービス？

**Baasday** 
[Baasday](https://baasday.com/)

**app cloud** 
[app cloud](https://app-c.net/)

<br>
以下を参考にさせていただきました
[mBaaSまとめてみた](http://qiita.com/osamu1203/items/d7d2206cc079092d07c4)
[BaaSはまだ戦国時代だったのか、まとめ。(執筆中)](http://qiita.com/cognitom/items/ead2837115bc900a0acc)
[BaaSのリストアップ](http://qiita.com/alingogo/items/dffcd9dc3cf1045ee6c6)
[バックエンドのサービスをまとめる](http://qiita.com/syuhei/items/f463a9a8cc347b6e7e09)
[モバイルBaaSの概観と最新動向(2014版) ](http://www.slideshare.net/shinichitomita/mobile-baaslatest2014)
技術英語 > [on the count of three] we'll lift and we want to walk together, okay? Ready? One, two, three.

@ LOE > 10 Feb 2012
http://loe.org/shows/shows.html?programID=12-P13-00006

> Alright, <font color=red>on the count of three</font> we'll lift and we want to walk in together, okay? Ready? One, two, three.

よく「１，２の３で」で共同作業をする時に使われそうなフレーズ。LOEで耳に残った。
JSONとは何奴,,に関して

#JSONとは何奴,,に関して

```
要約 => JSONとはオブジェクトや、配列を組み合わせて構造化されたデータを表現する"データ記述言語"である。
簡単に言えば、人間が理解しやすいデータの記述が可能な言語である。
```


```
JSONとは、JavaScript ObjectNotationの略称で、「データを表現するためテキストフォーマットの一種」です。

「JSON データは、name/value のペアで記述します。」

Name/名前に関して

・"foobar": "hoge" => name: 値という関係性のデータ形式になると見やすいよねという事

Value/値に関して

・文字列値/string "abc"のようにダブルクオートで囲んだ値


```

JSONFormatで記述していない場合のデータ

```

 "resultCount":1,
 "results": [
{"wrapperType":"track", "kind":"song", "artistId":271593168, "collectionId":81901964, "trackId":81901909, "artistName":"RYUICHI SAKAMOTO", "collectionName":"/ 04", "trackName":"Merry Christmas Mr. Lawrence", "collectionCensoredName":"/ 04", "trackCensoredName":"Merry Christmas Mr. Lawrence", "collectionArtistName":"坂本龍一", 
```

JSON Formatで記述し、再形成した場合のデータ


```js
{
    "resultCount": 1,
    "results": [
        {
            "wrapperType": "track",
            "kind": "song",
            "artistId": 271593168,
            "collectionId": 81901964,
            "trackId": 81901909,
            "artistName": "RYUICHI SAKAMOTO",
            "collectionName": "/ 04",
            "trackName": "Merry Christmas Mr. Lawrence",
            "collectionCensoredName": "/ 04",
            "trackCensoredName": "Merry Christmas Mr. Lawrence",
            "collectionArtistName": "坂本龍一"
        }
    ]
}
```

```
追記 Formatに関して

Formatにはおもに3つの意味があります。

1 初期化 OSにファイルを読み書き作業ができる基本状態(初期状態)にする事

2 書式設定 文書の元となる体裁を設定する事

3 ファイル形式 ファイルの元となる種類の事

フォーマットはラテン語の「形作る」という意味の言葉です。

参考URL

http://imimatome.com/katakanagonoimi/katakana67.html
http://ai-future.hatenablog.jp/entry/GEEKJOB%E3%82%AD%E3%83%A3%E3%83%B3%E3%83%97%E7%84%A1%E6%96%99%E4%BD%93%E9%A8%93%E8%AA%AC%E6%98%8E%E4%BC%9A%E8%A9%95%E5%88%A4%E6%84%9F%E6%83%B3
```