OmniAICreator/Qiita-1.07M huggingface dataset:
[Swift]たった40行のUIScrollViewを使ったシンプルなチュートリアル画面サンプル

![tuto.gif](https://qiita-image-store.s3.amazonaws.com/0/24308/2cb75446-aedb-4b80-bc60-867837b5789f.gif)

アプリの初回起動時などで横にスワイプさせるウォークスルー型のチュートリアル画面の作り方についてです。
UIPageViewControllerでも出来ますが、UIScrollViewの方がシンプルに作れたのでかんたんなものであれば十分かと思います。
ライブラリも色々ありますが、作ってしまったほうが楽な場合もあると思います。


下記コードで全部です。40行ほどで出来ました。

```swift
import UIKit

class ViewController: UIViewController, UIScrollViewDelegate {

    var scrollView: UIScrollView!
    var pageControll: UIPageControl!
    let pageNum = 4
    let pageColors:[Int:UIColor] = [1:UIColor.redColor(),2:UIColor.yellowColor(),3:UIColor.blueColor(),4:UIColor.greenColor()]

    override func viewDidLoad() {
        super.viewDidLoad()

        self.scrollView = UIScrollView(frame: self.view.bounds)
        self.scrollView.contentSize = CGSizeMake(self.view.bounds.width * CGFloat(pageNum), self.view.bounds.height)
        self.scrollView.pagingEnabled = true
        self.scrollView.showsHorizontalScrollIndicator = false
        self.scrollView.delegate = self;
        self.view.addSubview(self.scrollView)
        
        self.pageControll = UIPageControl(frame: CGRectMake(0, self.view.bounds.height-50, self.view.bounds.width, 50))
        self.pageControll.numberOfPages = pageNum
        self.pageControll.currentPage = 0
        self.view.addSubview(self.pageControll)
        
        for p in 1...pageNum {
            var v = UIView(frame: CGRectMake(self.view.bounds.width * CGFloat(p-1), 0, self.view.bounds.width, self.view.bounds.height))
            v.backgroundColor = self.pageColors[p]
            self.scrollView.addSubview(v)
        }
    }

    func scrollViewDidScroll(scrollView: UIScrollView) {
        var pageProgress = Double(scrollView.contentOffset.x / scrollView.bounds.width)
        self.pageControll.currentPage = Int(round(pageProgress))

    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
```
git hooks ～独自シェルを動かす～

```
メモレベルです。きちんと学習されたいという方は下部の参考サイト様の閲覧をお勧めします。
参考にしていただければ幸いですが、参考にして不具合等が起きた場合、保障はできませんのであしからず。
間違い等あればご教授いただけると助かります。
```

## git hooks
　・gitの処理中に独自のシェルスクリプトを動かすことが出来る。
　・処理のタイミングは複数用意されており、ほぼほぼ `.git/hooks` の中にサンプルが用意されている。
　　処理タイミングについて詳しく説明されている [mima_ita様の記事](http://qiita.com/mima_ita/items/dcaa3789022d2a9ab929#2-1)

### やってみたこと
　Vagrantで作成した仮想環境内(Ubuntu)で、Gitプロジェクトを２か所に置き、開発用PRJとする片方でコミットorプッシュが行われたタイミングで
　もう片方の非開発用PRJで自動デプロイする。

### 処理

* ファイルを作成
`vi ror_sample/.git/hooks/post-commit`
　もともと `.git/hooks` 内にサンプルファイルが `post-commit.sample` といった名前で保存されている場合もあるので
　そちらをリネームして使いまわしてもOK.


* 処理を記述

 ```lang:ror_sample/.git/hooks/post-commit(開発用)
#!/bin/sh
logger "********************************************"
# ディレクトリへの移動(非開発用)
cd /home/hoge/ror_sample | logger "cd"
# 申し訳程度のフェッチ
git --git-dir=.git fetch| logger "fetch"
# プル
git --git-dir=.git pull origin master:master| logger "pull"
# 現在ローカル側での最新コミット情報
logger `git --git-dir=.git log --oneline -n 1 `
```

* 実行権限がなければ付与
`chmod +x post-receive`

* ログ監視
` tail -f /var/log/syslog`


　結果、エラーは出ませんが非開発用のプロジェクトでプルされていませんでした。
　細かく `pwd` をログに吐き出すと、移動していない!!そういうものなの？
　LinuxもGitも初心者なので原因特定には至っていませんが、
　開発用PRJの位置でシェル内のコマンドは実行されていたようでした。
　同じようなコードを非開発用のプロジェクトのpost-receiveに書いたりもしてみましたが、そもそも動かず。
　業務で困ったわけではないので構わないのですが、ひとまずシェルを動かすことは成功したというところで(妥協)

　まぁ、非開発用PRJをgitで管理せずに、post-commitを使用して開発用PRJでコミットする度に
　「git archiveとgit diffを使って差分ファイルを圧縮。非開発用PRJへ移動し解凍」
　とかでもできることはできるか。

　使い方は無限大ですね。（失敗しましたが…

### 参考サイト様
* [【Git】pushすると自動でpullするようにする](http://nullnote.com/web/git/git-auto-pull/)
* [mima_ita様の記事](http://qiita.com/mima_ita/items/dcaa3789022d2a9ab929#2-1)
Hyper-V の仮想マシンで通信速度を上げる

Hyer-Vの仮想マシンでOracleからデータを転送するととても遅く時間がかかっていた。
「Hyper-V の仮想マシンでネットワーク通信速度が遅い」を見つけ対策をしたところ、「対策3:ネットワークカードのVMQ を無効にする」で劇的に早くなった。
ホストもゲストも、Windows Server 2012 R2 Standard。
サーバーは、Dell。
旧バージョンのSkitchをダウンロードする方法

Skitch ver.1.0.12

旧バージョンのSkitchでは、画像のようなハイライト機能など、現行のSkitchには無い機能が搭載されています。(つらい...)
私はIT教育家として活動していますが、旧バージョンのSkitchにはとてもお世話になっています。
記事を書く際に使ってみてはいかがでしょうか？

【リンク】
http://www.oldversion.jp/mac/skitch/ 

![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/46672/5e9ebb05-cdec-a0db-7e9c-e1ca5f1b5367.png)
GHOST脆弱性をチェックするワンライナー

脆弱性の対応はもうお済みでしょうか？

```shell
cd /tmp; curl -sko ghost.c https://raw.githubusercontent.com/mholzinger/CVE-2015-0235_GHOST/master/ghost.c; make ghost; ./ghost
```

## makeの小技

意外と知られていないのですが、c言語の1枚ペラのソースコードをコンパイルしたいときは

```shell
gcc ghost.c -o ghost
```

と書く代わりに

```shell
make ghost
```

でいけます。
 :smiley:
OmniauthでFacebookの値を日本語表記で取得する


一部のデータが、英語表記になる問題があったので、
下記記事を参考にパラメーターを渡したら、希望の値がかえってきました。




```config/initializers/omniauth.rb
provider :facebook, Settings.facebook.consumer_key, Settings.facebook.consumer_secret,{scope: locale: "ja_JP"}
```

### 参考
[Facebookの氏名を日本語表記で取得する](http://qiita.com/ar_tama/items/2c5a3f1cb1ad4c236bc3)
vbaの基礎

##メモる

###プロシージャ単位で実行できるので適切なプロシージャに分割する。

```sheet1.vba

Private sub main()
  Call f1
  Call f2
End Sub

Private sub f1()
  ...
End Sub

Private sub f2()
  ...
End Sub

```

f1, f2 が独立して実行できる上に、main()に統合できる。

###モジュール（翻訳単位）で有効なオブジェクトは初期化する。


```vbnet

Private x as New Collection

Private sub main()
  Call init()
  Call f1()
  Call f2()
End Sub

Privete Sub init()
  Set x = Nothing
End Sub

Private sub f1()
  Dim data
  x.add data
End Sub

Private Sub f2()
  x.Count
End Sub

```

この場合、オブジェクト'x'はプロシージャ呼び出しをまたがって生存するので毎回、初期値の設定をしないと、オブジェクト'x'に追加（Append）される。

###標準モジュールには読み取り専用でプロジェクトに局所化されるもの以外置かいない。

```Module1.vba
  Option Private Module
  Public Const MIN=0, MAX=255
```

大域的な通用範囲は汚さず、変更せず。

###クラスモジュールにする場合、共有部分は標準モジュールに置く。

```Module1.vba
  Option Private Module
  Public Const READ_ONLY = 1, CREATE_NEW = 2, APPEND = 8
```

```class1.vba
Private m_mode As Integer

Property Let mode(set_mode As Integer)

On Error GoTo ERR_MSG
  
  If set_mode <> READ_ONLY And _
     set_mode <> CREATE_NEW And _
     set_mode <> APPEND Then
     
  Err.Clear
  Err.Raise Number:=-1, Description:="invalid mode"
  
  Exit Property
     
  Else
    m_mode = set_mode
    Exit Property
  End If
  
ERR_MSG:
  MsgBox Err.Number & vbCrLf & Err.Description
  Exit Property
  
End Property

  
```

###無闇にクラス（モジュール）化やエラー・ハンドリングに頼らない。

論理エラーはコワイ。
Typesafe Activator (sbt/PlayFramework) をWindows環境で利用する際のヒストリーの文字化けを解消する方法

## こまったこと

Typesafe Activator(以下activator)やsbtをWindows環境で利用する際、カーソルの上ボタンで利用できるはずのHistoryが文字化けしてしまう。

## 直し方

#### activatorconfig.txt を作成する

`~/.activator/activatorconfig.txt` （Activatorコマンド実行ユーザのホームディレクトリ内の.activatorディレクトリ内）というファイルを作成。

#### ファイル内に以下のように記述する
```
-Dinput.encoding=Cp1252
```

#### Activatorを再起動

`activator.bat`コマンドなどでactivatorを再度起動する。

→ カーソルの上ボタンでHistoryが文字化けせずに利用できるようになっているはず！！


## sbtな人は・・・

ファイル名を`sbtconfig.txt`とかにすればよかったはず、、、たぶん。
MySQLで、INSERT後に、更新したデータのIDを取得する簡単な方法。PDOを利用して、last insert id 取得

更新した後に、データのIDを取得したいとき、

My SQLで
mysql> SELECT LAST_INSERT_ID();

とやれば取得できます。

が、PDOを利用していれば、PDOの関数を使って、SQLを発行せずにlast insert idを取得することができます。

　$dbh = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

　$stmt = $dbh->prepare("INSERT INTO test (name, email) VALUES(?,?)");
 
   try {
       $dbh->beginTransaction();
       $tmt->execute( array('user', 'user@example.com'));
       print $dbh->lastInsertId(); 
       $dbh->commit();
　}

　commitの後に$dbh->lastInsertId();　とやると、0しか返ってきません。
　トランザクションの間に、コミット前に、$dbh->lastInsertId();　の実行をして、取得します！簡単！

　実施する場所に要注意です。
JSON作成時に特定の機種のみでハマったこと


## 概要
あるソースを特定の機種で動かしたら、JSONArrayの部分がイメージしていたのと異なる結果が出た。
下記以外にも機種、OSを色々と変更して試すと、いくつか _SH-04E (4.1.2)_と同じ結果がでた。

```:こんなかんじの結果

SH-04E (4.1.2)の場合
{"hoge":["111111111","2222222222","3333333333"]}
{"foo":"[111111111, 2222222222, 3333333333]"}

Nexus5 (4.4.4)の場合
{"hoge":["111111111","2222222222","3333333333"]}
{"foo":["111111111", "2222222222", "3333333333"]}

```

なにこれ？？？
**{"foo":"[111111111, 2222222222, 3333333333]"}**
おもってたんと違う

（追記）
コメントでtnjさんに下記を教えて頂きましたー。
>へー、と思って調べてみたら、 2013年5月に報告されてた バグで、その後 7月に修正されて、 android-4.4.1_r1 でリリースされてました。特定の機種ではなくてバージョンの違いで発生する問題ですね。

たしかに報告を受けた5端末のうち、成功しているのはv4.4.4ｄったので。

### 検証時に書いたサンプルはこれ

```Java:MainActivity
 ArrayList<String> arrayList = new ArrayList<String>();
        arrayList.add("111111111");
        arrayList.add("2222222222");
        arrayList.add("3333333333");
 
        JSONArray jsonArray = new JSONArray(arrayList);
 
        // JSONArrayに変換してからつっこむ
        HashMap<String, Object> map = new HashMap<String, Object>(1);
        map.put("hoge", jsonArray);
        Log.d("MainActivity", new JSONObject(map).toString());
 
        // ArrayListに変換してからつっこむ
        HashMap<String, Object> map2 = new HashMap<String, Object>(1);
        map2.put("foo", arrayList);
        Log.d("MainActivity", new JSONObject(map2).toString());	
```

ArrayListをJSONArrayに変換せずにJSONObjectにしたら、
こんな結果も有りかなーとおもったけど、いくつかの機種で発生したののはナゼ？？？

## あるある？

~~今までこの事例の存在を知らなかったんだけど、これってあるあるなの？？？~~
前述のとおり、どうやらバージョン依存でした。s

## おまけ

[コードサンプルをgistに置いた](https://gist.github.com/toguri/00a66bc5d085583dd9eb)
IntelliJ IDEA 14にgo-lang-idea-pluginをインストールして、go 1.4系を快適に使う方法 ※6月20更新

``` text:6月20日追記
プラグインのインストール方法が変更になりました。
https://github.com/go-lang-plugin-org/go-lang-idea-pluginのREADME.mdに記載があります。
[Plugins]-[Browse repositories...]-[Manage repositories...]にレポジトリのURLを貼り付けてください。
```
``` text:2月17日追記
現在公開されている最新のalpha版は安定して動作します。
今後はそちらを利用することを推奨します。
https://github.com/go-lang-plugin-org/go-lang-idea-plugin/releases
（インストールする時にはzipファイル毎インストールすること。）
```

## 背景
会社のAPIサーバがGo言語使ってるので、ソースコード読もうと思い立ち、
せっかくだから最新版のIntelliJ使おうとしたらハマったので共有。
公式プラグインが早く更新されることを願う。

※このTIPSは2015年1月28日現在のものです。

## 環境
* OSX 10.9.5
* IntelliJ IDEA 14.0.2
* Go 1.4.1

## 事前準備
* IntelliJ IDEA 14が適切にインストールされていること
* Goが適切にインストールされていること（homebrewなど）
* GOROOTおよびGOPATHが適切に設定されていること
* /etc/launchd.confが設定されていること

## インストール手順
### 1) 最新アルファ版をインストールする
1. プラグイン[Githubのダウンロードページ](https://github.com/go-lang-plugin-org/go-lang-idea-plugin)から最新のalpha版をダウンロードする。(執筆時点：0.9.16-alpha.9)
2. IntelliJ IDEA 14を起動する 
3. メニューの「IntelliJ IDEA」から「Preferences」を選択し、「Plugins」の「Install plugin from disk...」ボタンを押下する
4. 1でダウンロードしたプラグインのjarファイルを選択し、インストールを行う
5. ここで再起動

### 2) GO SDKの設定を行う
6. メニューの「File」から「Project Structure」を選択し、「Project Settings」の「Project」を開く
7. 「Project SDK」の「New...」を押下し、「GO SDK」を選択する
8. GOROOTに設定したパスを指定し、「OK」を押下する
9. 再びメニューの「File」から「Project Structure」を選択し、「Platform Settings」の「SDKs」を開く
10. 3で追加した「Go SDK go1.4.1」を選択し、「Classpath」タブを開く
11. 「+」ボタンを押下し、「$GOPATH/src」となるフォルダを選択し、「OK」を押下する

### 3) 安定版を再インストールする
12. メニューの「Preferences」から「Plugins」を選択し、「Go language support plugin」をアンインストールする
13. ここで再起動
14. 再びメニューの「Preferences」から「Plugins」を選択し、「Go language support plugin」をインストールする

## 参考
http://qiita.com/kaiinui/items/433eb86c022ffcad0bea
[Ubuntu] CVE-2015-0235(GHOST) の脆弱性対応

もし違ってたらコメントお願いします。

# CVE-2015-0235 

`libc` のGNUバージョンである `glibc` の脆弱性が今になって発見されたあれです。
脆弱性の中身は参考ページをご覧になってください。

↓↓↓参考↓↓↓
http://www.walbrix.com/jp/blog/2015-01-ghost.html


# 確認方法

```bash
$ wget https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c
$ gcc GHOST.c -o GHOST
$ ./GHOST
vulnerable # 残念！
```


# 対応方法

Ubuntu による推奨方法は以下です。

```
$ sudo apt-get update
$ sudo apt-get dist-upgrade
```

cf.
http://www.ubuntu.com/usn/usn-2485-1/
https://wiki.ubuntu.com/Security/Upgrades

`dist-upgrade` が怖くてできない人は以下でもいけると思います。

```
$ sudo apt-get update
$ sudo apt-get install libc6
```

パッケージを更新した所で、確認してみる

```bash
$ ./GHOST
not vulnerable # YEAH!!
```

# 再起動は？

上記の参考ページによると
> ネットワークで何らかの通信を行うアプリケーションは必ずこの関数を使用します。

とありますので、脆弱性のあるサーバは **システム再起動** をしたほうが安全です。

システム再起動をしたくない方は、該当プロセスの再起動が必要かと思います。
`libc` を使っているプロセスの確認方法は、以下となります。

```
$ sudo lsof | grep libc-
init          1    root  mem   REG   202,1   1811128  393379 /lib/x86_64-linux-gnu/libc-2.15.so
su        13475  deploy  mem   REG   202,1   1811128  393379 /lib/x86_64-linux-gnu/libc-2.15.so
bash      13476  deploy  mem   REG   202,1   1811128  393379 /lib/x86_64-linux-gnu/libc-2.15.so
ruby      13765  deploy  mem   REG   202,1   1811128  393379 /lib/x86_64-linux-gnu/libc-2.15.so
ruby      13771  deploy  mem   REG   202,1   1811128  393379 /lib/x86_64-linux-gnu/libc-2.15.so 
... (以下略）...
```

`init` が入ってる時点で詰んでる気も・・・。
AWSにおけるCVE-2015-0235 (Ghost) 対策

## CVE-2015-0235とは
他のサイトでいろいろまとめられているので、そちらを参照

* [glibc の脆弱性 CVE-2015-0235（通称：GHOST）についてまとめてみた](http://d.hatena.ne.jp/Kango/20150128/1422409960)
* [glibcのgethostbyname関数に存在するCVE-2015-0235(GHOST)脆弱性について](http://www.walbrix.com/jp/blog/2015-01-ghost.html)

## 確認方法
脆弱性対策をする場合にはかならず検証方法が必要です。作業前と作業後にかならず検証を行ってください。

gccが必要ですが、検証用のプログラムがあります。
[アプリケーションエンジニアだけどGHOST（CVE-2015-0235）対応してみた](http://qiita.com/itosho/items/6b287a6f8929563a3d77)

## Elastic Beanstalk以外のAWSへの影響
[CVE-2015-0235 Advisory (Ghost)](http://aws.amazon.com/jp/security/security-bulletins/cve-2015-0235-advisory--ghost-/)

AWS Elastic Beanstalk以外は影響を受けないとのことです。

実際に僕が管理するElastic Beanstalk以外のインスタンスについては、上記検証手順で脆弱性がないことを確認できました。もちろん、各自チェックが必要です。

## Elastic Beanstalkへの影響
[Announcement: CVE-2015-0235 (Ghost) Update](https://forums.aws.amazon.com/ann.jspa?annID=2855)
要約すると、対策版のcontainerに入れ替えるため新しいenvを作ってswapする必要があるとのことです。現状のcontainerバージョンはAWS ConsoleのDashboardから確認できます。対策版は **v1.1.0** です。

## さいごに
Poinは3つのアプリ、5つの環境でデプロイしているので、今日は1日この作業で終わりそうです。さらに、うちはRoute53で直接ELBを指定しているのでSwap Envが使えません。頑張ろう。。。
doxygen for Fortran program


## Install
自分のマシンがMacのため，Macにdoxygenとgraphvizをインストールする例を．

```
$ brew install doxygen graphviz
$ which doxygen
$ which dot
```

## doxygenをFortranソースディレクトリで実行
```
$ cd fortran-program-srcdir/
$ doxygen -g
$ emacs Doxyfile
```

Doxyfileの設定

```
# 解析したいプロジェクトの名前
PROJECT_NAME = "Your Project Name"
# 再帰的にソースコードのファイルを探索する
RECURSIVE = YES
# LaTeX で出力しない
GENERATE_LATEX = NO
# Graphviz で出力するための DOT ファイルを作る
HAVE_DOT = YES
# DOT ファイルの生成をマルチスレッドで行う
DOT_NUM_THREADS = 4
# コールグラフ (呼び出す側) を作る
CALL_GRAPH = YES
# コールグラフ (呼び出される側) を作る
CALLER_GRAPH = YES
# 
EXTRACT_ALL = YES
```
他にも，extensionだとかpatternだとかをFortranの解析したいソースファイル用に変更する必要があると思う．

```
# 拡張子とソースファイル形式の対応を記述
EXTENSION_MAPPING = F=Fortran F90=Fortran h=Fortran
# 読み込むべきソースファイルの拡張子を記述
FILE_PATTERNS = *.F90 *.F *.h
```
あとは

```
$ doxygen
```
とすると，htmlというディレクトリが生成される．この中のindex.htmlをブラウザで表示すればよし．



# 参考サイト
* http://stackoverflow.com/questions/3161564/how-can-i-visualize-fortran-90-or-later-source-code-e-g-using-graphviz
Githubでpushしようとするとerrorが出る場合


マシンを変更してGithubにpushしようとするとエラーが出た．

まずはsshの設定をする必要があり，Githubに登録されている公開鍵に対応する秘密鍵をそのマシンにも入れておく必要がある．

それでも下記のようなエラーが出る場合，

```bash
$ git push origin master
fatal: remote error:
You can't push to git://github.com/ryokbys/nap.git
Use https://github.com/ryokbys/nap.git
```

下記のようになっていると思われるから，

```bash
$ git remote -v
origin git://github.com/ryokbys/nap.git (fetch)
origin git://github.com/ryokbys/nap.git (push)
```

設定変更する．

```bash
$ git remote set-url origin git@github.com:ryokbys/nap.git
```
すると，次ようになるはずで，pushできるようになるらしい．

```bash
$ git remote -v
origin git@github.com:ryokbys/nap.git (fetch)
origin git@github.com:ryokbys/nap.git (push)
```
AngularJSで「もっと見る」ボタンによる無限スクロール

流行りを逃した感はありますが、Qiitaのトップページのリストなどで使われている「もっと見る」ボタンによる無限スクロールを実装してみます。

これ単体でHTMLファイルとして動きます。

```html
<!doctype html>
<html ng-app="app" ng-controller="Ctrl">
<meta charset="utf-8">
<title>もっと見るボタン</title>
<table border="1">
  <tr ng-repeat="row in rows"><td>{{row.col1}}</td><td>{{row.col2}}</td></tr>
</table>
<button ng-click="more()">もっと見る</button>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.11/angular.min.js"></script>
<script>
angular.module('app', []).controller('Ctrl', function($scope) {
  $scope.rows = [];
  var offset = 1;
  $scope.more = function() {
    for (var i = offset; i < offset + 10; i++) {
      $scope.rows.push({col1: i, col2: 'テステステステス'});
    }
    offset += 10;
  };
  $scope.more();
});
</script>
</html>
```

実際にはDBからoffsetとlimitを指定して取得などする必要がありますが、全体的なロジックはこんな感じでいけると思います。
manページ > 前に検索したキーワードは次のmanでもそのまま検索できるようだ

動作確認

    CentOS 6.5

複数のmanページを見る時、同じキーワードで検索をする場合、毎回キーワードを入力していたが、いちいち毎回入力しなくても次検索(`n`)できるようだった。

例として

    man 3p sigwaitinfo
してから`/timedwait`と入力して検索を始める。`n`で次検索して探していた情報がなかったので`q`でmanを抜ける。

次のファイル

    man 3p pthread_cond_signal
してから、`n`(次検索)を押すと`/timedwait`が入力済みのものとして検索ができる。
ShinobiLayer: Hardware Firewallのアクセスログを取得するスクリプト

#はじめに
SoftLayerでは、Standard Hardware FirewallやDedicated Hardware Firewallなどを購入することで、ユーザーのPublic VLANにパケットが届く前に、不正なアクセスをブロックすることができます。以下のような操作でFirewallのアクセスログを確認することができるのですが、、、これを１つ１つのIPに対して手動で実施していくのは大変です。。。。
![firewall1.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/6a3103d6-0bf7-aa3f-80ae-ea1f0deb05b5.jpeg)
![firewall2.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/9d4fdda7-daba-2539-9f8c-73d0a5c934ea.jpeg)


ということで、IPアドレスを指定すれば、それに紐づいているアクセスログを出力するサンプルスクリプトを作ってみましたのでご紹介したいと思います。

#サンプルコード
```py:getSyslogsByIP.py
import SoftLayer
import sys
import pprint
from prettytable import PrettyTable
pp = pprint.PrettyPrinter(indent=4)

argv=sys.argv
if ( len(argv) != 2 ):
    print("Usage: python %s <Your IP>." % argv[0])
    exit(10)

targetip = argv[1]
LIMITSIZE=500


client = SoftLayer.create_client_from_env()
myip = client['Network_Subnet_IpAddress'].getByIpAddress(targetip)
if (myip is None) or (myip == "") :
    print("You don't have  %s in your account." % (targetip))
    exit(20)

_offset=0
alllists=[]
while True:
    lists = client['Network_Subnet_IpAddress'].getSyslogEventsSevenDays(id=myip['id'], limit=LIMITSIZE, offset=_offset)
    alllists = alllists + lists
    _offset = _offset + LIMITSIZE
    if len(lists) < LIMITSIZE :
        break

if (alllists ==[]):
    print("No records for this IP")
    exit(0)

alllists = sorted(alllists, key= lambda x: x['createDate'], reverse=False)
table = PrettyTable(['createDate',
                     'sourceIpAddress',
                     'sourcePort',
                     'destinationIpAddress',
                     'destinationPort',
                     'protocol',
                     'eventType'])

for list in alllists:
    table.add_row([
                     list['createDate'],
                     list['sourceIpAddress'],
                     list['sourcePort'],
                     list['destinationIpAddress'],
                     list['destinationPort'],
                     list['protocol'],
                     list['eventType']
    ])

print(table)

```

#使い方と出力結果

`# python getSyslogsByIP.py <IP Address>`
のように使ってください。このスクリプトだと、`getSyslogEventsSevenDays`を使っているので、7日分のアクセスログが出力されます。もし1日分だけでよいのであれば、`getSyslogEventsOneDay`を使えば良いでしょう。
http://sldn.softlayer.com/reference/services/SoftLayer_Network_Subnet_IpAddress

![getSyslogsResult.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/21e4453f-097d-83fe-26a1-4dc140bb10fb.jpeg)
C#で Bulk Insert のサンプル

C# で大量のデータをDatasetでインサートしようとすると遅くて使えないと思いSSISで処理を書いていた。
今更だがSqlBulkCopyを知ることができた。
下記コードはOracleからSQLServerへデータをインポートするサンプルであらかじめSQL Server Management Studioのインポート機能を使いOracleからテーブル情報のみ取得してSQL Serverにテーブルを作成してある。

```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Threading.Tasks;
using Oracle.DataAccess.Client;
using SampleBulkCopy.Properties;

namespace SampleBulkCopy
{
    class Program
    {
        static void ExecuteCopy(string tableName)
        {
            using (var connSrc = new
OracleConnection(Settings.Default.OracleConnectionString))
            using (var connDest = new
SqlConnection(Settings.Default.SqlConnectionString))
            {
                connSrc.Open();
                connDest.Open();

                var sql = string.Format("SELECT * FROM {0} ", tableName);
                var cmd = new OracleCommand(sql, connSrc);
                using (var rd = cmd.ExecuteReader())
                {

                    using (var bulk = new SqlBulkCopy(connDest))
                    {
                        bulk.BulkCopyTimeout = 10000;
                        bulk.DestinationTableName =
string.Format("dbo.{0}", tableName);
                        bulk.WriteToServer(rd);
                    }

                }

            }
        }

        static void Main(string[] args)
        {
            ExecuteCopy("TABLE");
        }
    }
}

```
DataRaderを渡すだけでInsert 出来るのは良い。
Oracleからテーブル情報を取得するさい、Date型がそのままDate型になるので、テーブル定義するさいDateをDateTimeに変換すると良い。
Pepper のカメラ映像をライブ配信する実験


## はじめに

* タイトルの通り、Pepper のカメラ映像をライブ配信(リアルタイムでストリーミング)を行いたいと思っているのですが、まだ実現できていません。これは **失敗** の記録です。
* まずは API で実現できないか、ざっくり各 API を確認してみたのですが、一番あやしいと感じた ALVideoDevice あたりでも、実現できそうな機能はないように思いました。
* ではカメラデバイスから直接に映像データを取得し、適当な形式に変換するイメージで何とかならないだろうか、と考えています。

## 案1 HTTP Live Streaming (HLS) を使用

* [HTTPライブストリーミングの概要](https://developer.apple.com/jp/documentation/StreamingMediaGuide.pdf) (Apple公式ドキュメント)

### 案1-1 Pepper 内に FFmpeg がインストールされているならば、それを使用してインデックスファイル(.m3u8)とセグメントファイル(.ts)を生成できるのではないか

それをどこかの Web サーバに転送すれば、一番手っ取り早く実現できそうな気がしました。Pepper にログインして、ffmpeg を確認します。

```bash
$ which ffmpeg
/usr/bin/ffmpeg	
```

インストールされているようです。バージョンはいくつかな？

```bash
$ ffmpeg -version
ffmpeg version 0.7.8, Copyright (c) 2000-2011 the FFmpeg developers
```

何やら古そうです。セグメンタ機能が実装されているのか不安です。とりあえず適当に動画を書き出してみます。

```bash
$ ffmpeg -i /dev/video0 video.mpg
ffmpeg version 0.7.8, Copyright (c) 2000-2011 the FFmpeg developers
  built on Jun 13 2014 18:10:07 with gcc 4.5.3
  configuration: --prefix=/usr --libdir=/usr/lib --shlibdir=/usr/lib --mandir=/usr/share/man --enable-shared --cc=i686-pc-linux-gnu-gcc --disable-static --enable-gpl --enable-postproc --enable-avfilter --disable-stripping --disable-debug --disable-doc --disable-network --disable-vaapi --disable-ffplay --disable-vdpau --disable-indev=v4l --disable-indev=oss --disable-indev=jack --disable-outdev=oss --disable-altivec --disable-avx --cpu=atom --enable-hardcoded-tables
  libavutil    50. 43. 0 / 50. 43. 0
  libavcodec   52.123. 0 / 52.123. 0
  libavformat  52.111. 0 / 52.111. 0
  libavdevice  52.  5. 0 / 52.  5. 0
  libavfilter   1. 80. 0 /  1. 80. 0
  libswscale    0. 14. 1 /  0. 14. 1
  libpostproc  51.  2. 0 / 51.  2. 0
/dev/video0: Operation not permitted
```

予想外のエラーです。/dev/video0 のパーミッションを確認します。

```bash
$ ls -la /dev/video0
crw-rw----  1 root video  81,   0 Jan 28 16:36 /dev/video0
```

ちなみにローカルマシンの Ubuntu では同じコマンドが動いているのですが、同様に /dev/video0 のパーミッションはこんな感じです。最後の「+」ってなんでしたっけ？

```bash
$ ls -la /dev/video0
crw-rw----+ 1 root video 81, 0 Jan 28 19:10 /dev/video0
```

何にしても、パーミッションは触れないので、なかなか難しいそうな感じがします。

次回へ続く(?)。

## 感想

* 01/31(土)のアトリエ秋葉原の開発タッチ&トライに登録しているので、それまでに次案を考えます。
* Choregraphe とか Monitor とかはどうやってるのでしょうかね？
PYCURL 6のエラーでyumが使えない場合の対処法メモ

PYCURL ERROR 6 - "Couldn't resolve hostの表示がでてyum updateなどができない場合の対応方法のメモです。

IPv6 が有効なホストでメジャーで正しい対応方法
==========
IPv4での名前解決及び到達性があるのに、エラーが出る場合には
IPv6を無効にできる場合には、無効にすると解決することが多いようです。
IPv4のみを使う指定ができるディストリビューション/バージョンを使っている人は
yum.confにip_resolve=4 もしくは ip_resolve=ipv4 
の記載をすることで、解決できるようです。（最近のFedoraなど）

そのほかの方法（私が試した方法）
===
IPv6をそのタイミングで無効にできない場合や、普通に名前解決ができない場合には、
一般的には接続先のホスト名を dig、nslookupなどで、名前解決したIPv4のIPを
hostsに書くとhostsがDNSに優先する設定であれば問題が解決しました。


※試していませんがnsswich.confでhostsを優先する設定＝（規定値）になっていたから解決
　したのだと考えています。

hostsに書く場合の手順など
===============
fastmirrorプラグイン導入時などは大量のホスト名が解決できないエラーがでます。
今回私は、エラー出力を編集して一つ一つ名前解決しましたが、
centosの場合
http://mirrorlist.centos.org/?release=リリース&arch=アーキテクチャ&repo=os
例えば
http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os
等にアクセスします。

すると記載するべきホスト名が得られるので、それを元に記載すると良いかと思われます。
["hoge"][0]のクラス

``` ruby 
[1] pry(main)> ["hello"][0].class
=> String
[2] pry(main)> ["hello"][1].class
=> NilClass
[3] pry(main)> ["hello"].class
=> Array
[4] pry(main)> ["hello", "world"][0].class
=> String
```
今日初めて知った。
自分が見た例文では文字列表示の条件分岐で使ってた。
他に何に使えるかわからないけど、知識としてストック。
Embulk - ソースコードリーディング No.2

バッチ処理データ連携ツールのEmbulkのソースコードリーディングを続けます

# 今日のリーディング範囲

今日からはQuick Startの2コマンド目のguessを読み進めたいと思います
量が多いので数日に分かれます

```ruby:
 java -jar embulk.jar guess ./try1/example.yml -o config.yml
```

# リーディング内容

### embulk_run.rb

前回も出現した箇所ですが、ここでオプションを取得しています
オプション（-o）のみを残してguessオプションを取得していますね

```ruby:embulk_run.rb#17
i = argv.find_index {|arg| arg !~ /^\-/ }
usage nil unless i
subcmd = argv.slice!(i)
```

そして取得してguessオプションを使いcaseで分岐させています
case内では-oオプションで指定されたアウトプットパスと、-Iで指定された追加jar or Rubyスクリプトパスの値を取得しています

この-iはreadmeには見当たらないですね
読んでいけばどう使うかわかるのでしょう

```ruby:embulk_run.rb#34
case subcmd.to_sym
(中略)
when :guess
  op.banner = "Usage: guess <partial-config.yml>"
  op.on('-o', '--output PATH', 'Path to a file to write the guessed configuration') do |path|
    options[:nextConfigOutputPath] = path
  end
  op.on('-I', '--load-path PATH', 'Add ruby script directory path or jar file path') do |load_path|
    load_paths << load_path
  end
  args = 1..1
```

そしてcaseを抜けた後にはOptionParser#parseメソッドによりオプション解析を実施してます

```ruby:embulk_run.rb#94
begin
  op.parse!(argv)
  unless args.include?(argv.length)
    usage nil
  end
rescue => e
  usage e.to_s
end
```

最後にJavaをCallしてRuby部は終了です
ここでは

①org.embulk.command.Runnerをロード（見つからない場合はフォルダ指定）
②setup_load_paths関数で-Iで追加されたjarをrequire
③org.embulk.command.Runner#mainの呼び出し
　※コンストラクタにはオプション情報(-oで渡した値)をJSON化して渡す
　※mainメソッドにはサブコマンド(guess)とオプション(-o,-I)を渡して実行

ということを行っています

```ruby:embulk_run.rb#180
require 'json'

begin
  java.lang.Class.forName('org.embulk.command.Runner')
rescue java.lang.ClassNotFoundException
  # load classpath
  classpath_dir = Embulk.home('classpath')
  jars = Dir.entries(classpath_dir).select {|f| f =~ /\.jar$/ }.sort
  jars.each do |jar|
    require File.join(classpath_dir, jar)
  end
end

setup_load_paths(load_paths)

org.embulk.command.Runner.new(options.to_json).main(subcmd, argv.to_java(:string))
```

今日はここまで
続きは次回にて
エンジニアのための英語上達法


大層なタイトルをつけてるけど、自分がつい最近やってて効果的なような気がすることを適当にメモしているだけであり、
結果も何もありゃしないので、あまり真に受けないでください。

#前置き

想定読者とか。

##対象になると思われるひと

* 英語のドキュメントを読めなくはないんだけど、結構時間かかる。ねむい。
* 読めるのは読めるけど、リスニングがだめ。
* 日本語でググって出てくるドキュメントがクソでイライラする。

##対象ではなさそうな気がするひと

* 英語、ダメ、絶対。日本語最高。
* ワタシ英語はペラペーラでーす。

#準備

##必須だと思われるもの

* [Select and speak](https://chrome.google.com/webstore/detail/select-and-speak/gfjopfpjmkcfgjpogepmdjmcnihfpokn) - 文章を読み上げてくれる Chrome Extention
* 英語で書かれた公式のチュートリアル ex.[AngularJS Tutorial](https://docs.angularjs.org/tutorial/)

##あると便利かもしれないもの

* デュアルディスプレイ - まあべつに画面広ければいらない
* [Google Dictionary](https://chrome.google.com/webstore/detail/google-dictionary-by-goog/mgijmajocgfcbeboacabfgobmjgjcoja) - 選択範囲の単語で辞書を引いてくれる

ま、これはただの便利ツールですね。私は普段から英日ではなく英英辞書として使ってます。っていうか英日に出来るのかな。知らん。

#やりかた

1. 用意したチュートリアルを開く
2. Select and speak で読み上げさせる
3. 頑張って読んだり聞いたりしながらチュートリアルをすすめる

完。
ただし、たまにSelect and speakが読んでくれないところがあったりするので、そういうのは自分で読みましょう。

#その他

##アドバイスてきなもの（えらそう）

* あんまり全部の英単語を理解しようとしない。雰囲気でわかればオッケーって感じのノリで。
* 雰囲気すらわからなかったら聞き直す。
* チュートリアルのコマンドはちゃんと叩く。コピペしない。っていうか打った方が速いくらいにした方がいいとおもう。
* 出来の良いチュートリアルとかドキュメントを用意する。AngularJSの公式は素晴らしいですね。っていうか普段あんまりまじめにこういうのを手順通り読み進めないので、どこもこんなもんなのかもしれないけど。
* 英語が頭に入ってこなくなったらやめる。疲れたらねる。頭が起きてるときにやるべし。

##感想とか

* 英語の勉強と技術の勉強が一緒に出来てお得感満載。
* 丁寧にチュートリアルを進めざるを得ないので、ヘンにすっ飛ばしてあとでつまずいたりしない。気がする。
* ドキュメントが日本語に訳されるのを待ってたらもうあかんのでは。エンジニアの公用語は英語である。

#おわりに

ところでこういう変な記事をQiitaに上げるたびにタグに迷うんですけど、ここはお前の日記帳じゃねえんだよ！ って怒られてる気分になれる。でも実際Qiitaって日記帳だよね。
AngularJSのng-modelで日本語入力の確定に悩まないDirective

# はじめに
AngularJSの1.2.1移行のバージョンになると、IMEの入力確定までng-modelが更新されない仕様になって、日本語の環境だと非常に使いづらくなってしまった。  
回避策としては

* 自分でng-model相当のDirectiveを作る
* DOMに更新イベントが起きなくなっているタイミングを回避させるイベントを挿入する

自分でng-model相当の機能を実装すると、今後のアップデートとかに対応したりするのがかなり高コストそうなので、なんとかDirectiveを使って回避してみようとしてみた。

# 回避方法
以下の方法を参考にして、Directive化してみる。  
http://pirosikick.hateblo.jp/entry/2014/10/16/232409  
わざわざrunのタイミングではなくDirectiveにしたのは主に以下の理由

* runだと全てのコードに適用されてしまう
* Directive化してpriorityを設定する事で、イベントの影響範囲を狭くできる
* 今動いてるコードのバージョンアップするのにいちいちコードの書き換えを色々したくなかったので、Directive化して必要なとこだけに突っ込みたかった

使い方は以下のjp-inputというDirectiveを必要なinput要素に突っ込むだけ  

```html:input.html
<input type="text" ng-model="hoge" jp-input>
```

```js:directive.js
// directive
.directive('jpInput', ['$parse', function($parse) {
      return {
        priority: 2,
        restrict: 'A',
        compile: function(element) {
          element.on('compositionstart', function(e) {
            e.stopImmediatePropagation();
          });
        },
      };
    }]);
```

# サンプルコード全体
https://github.com/koh110/jpinput_test/blob/master/jpinput.html

# まとめ
AngularJSのバージョンアップ対応する時のネックになっていた箇所が割りと簡単に回避できるようになったので、日本語環境では重宝しそうな気がしてます。
.podspec を .podspec.json にコンバートしよう


最近在寫使用 CocoaPods 用的 library 時，要把 podspec 轉成 .podspec.json 格式，就上網找了找該怎麼轉。

<!-- more -->

# pod ipc spec

找了找發現 pod 有這個功能可以用 &gt; `ipc` , inter-process communication ，加上 `spec` 之後，就可以轉換成 JSON 格式。其下還有其他的指令可以用，不過還是先專注在如何轉換到 JSON 格式即可。

以下的指令可以把 podspec 轉換成 JSON 格式後印出來：

``` sh	
$ pod ipc spec LibraryName.podspec
```

接著可以用 double greater than operator 來把印出來的 JSON 內容存成想要的檔案即可：

``` sh	
$ pod ipc spec LibraryName.podspec >> LibraryName.podspec.json
```

# 參考資料

- [How to convert podspec to podspec.json? (from console) - @azu_re](https://twitter.com/azu_re/status/474051332920209408)

## 同步發佈

- [把 .podspec 轉換成 .podspec.json - 熊屋](http://blog.kumaya.co/2015/01/28/convert-podspec-to-json/)
GHOST脆弱性を検証してみた

検証してみたと言うほどではないですが・・・。

検証コードにprintfを追加して動作を追って見ました。

```GHOST.c
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define CANARY "in_the_coal_mine"

struct {
  char buffer[1024];
  char canary[sizeof(CANARY)];
} temp = { "buffer", CANARY };

int main(void) {
  struct hostent resbuf;
  struct hostent *result;
  int herrno;
  int retval;

  /*** strlen (name) = size_needed - sizeof (*host_addr) - sizeof (*h_addr_ptrs) - 1; ***/
  size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1;
  printf("sizeof(unsigned char) = %d\n", (int)sizeof(unsigned char));
  printf("sizeof(char *) = %d\n", (int)sizeof(char *));
  printf("sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1 = %d\n", (int)len);

  char name[sizeof(temp.buffer)];
  memset(name, '0', len);
  name[len] = '\0';

  printf("before temp.canary = %s\n", temp.canary);

  retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno);

  printf("after temp.canary = %s\n", temp.canary);

  if (strcmp(temp.canary, CANARY) != 0) {
    puts("vulnerable");
    exit(EXIT_SUCCESS);
  }
  if (retval == ERANGE) {
    puts("not vulnerable");
    exit(EXIT_SUCCESS);
  }
  puts("should not happen");
  exit(EXIT_FAILURE);
}
```

実行結果
![スクリーンショット 2015-01-29 1.26.12.png](https://qiita-image-store.s3.amazonaws.com/0/35451/1024113e-026b-a144-0143-e26a105e008b.png)

引数で渡されたtemp構造体のcanaryがgethostbyname_rの実行後に0000000で書き換えられている。
つまりここに悪意あるコードが埋め込まれた場合に悪い事が行われてしまうようです。

ただ任意のコードを埋め込み方がいまいちわからなかったので、詳しい方いらっしゃいましたら解説をどうかお願いいたします・・・。

この脆弱性をつくには条件があるようです。
その条件というのがgethostbyname_rの第一引数で渡されるnameには数値のみが入力された状態でなければならないということ。
memsetで0でchar nameを埋めている箇所を文字で埋めるとgethostbyname_r実行後temp.canaryの値は変わる事はなかった。

### 調べる上で役に立ったサイト
[日本語解説記事1](URL "http://www.walbrix.com/jp/blog/2015-01-ghost.html")
[日本語解説記事2](URL "http://hachibeechan.hateblo.jp/entry/2015/01/28/_GHOST%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%AE%E5%95%8F%E9%A1%8C%E3%82%92%E7%B7%A9%E5%92%8C%E3%81%99%E3%82%8B%E8%A6%81%E7%B4%A0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6")
[gethostbyname_r](URL "http://www.basetwo.ru/library/cmd/blcmdl3_gethostbyname_r.htm?-gethostbyname_r---Linux%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89--Unix%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89")
Ruby でファイルから複数の JSON をストリーミングして読み込む

[Go でファイルから複数の JSON をストリーミングして読み込む](http://qiita.com/yuya_takeyama/items/48693af0b4d647baa76f) という記事を書いてますが、それの Ruby 版です。

Go についてはツールを実装するにあたっての下調べの意味も込めて書いてますが、Ruby に関しては既に以下のツールで利用しているテクニックです。

* [yuya-takeyama/jr](https://github.com/yuya-takeyama/jr)
* [fukayatsu/json2yaml](https://github.com/fukayatsu/json2yaml)

# JSON ファイルを用意する

[Go の記事](http://qiita.com/yuya_takeyama/items/48693af0b4d647baa76f) と同じものを使います

# Write in Ruby

`yajl-ruby` を使うことでできます。
今回は標準入力から JSON を読み込んで `Kernel.#p` で inspect するだけのものです。

```ruby:Gemfile
source 'https://rubygems.org/'
gem 'yajl-ruby'
```

```ruby:json2p.rb
require 'yajl'

Yajl::Parser.new.parse(STDIN) {|d| p d }
```

実行結果は以下の通り。

```
$ cat test.json | bundle exec ruby json2p.rb
{"foo"=>"bar", "qux"=>"quux"}
{"more"=>{"nested"=>["structure"]}}
"hoge"
42
false
nil
```
Kinoma Create: リンク集

随時充実させていきます。


* [本家](http://kinoma.com)
	* [ブログ](http://blog.kinoma.com)
	* [facebook](https://www.facebook.com/kinoma)
* 購入
	* [SwitchScience](https://www.switch-science.com/catalog/2000/)
		* [Kinoma関連記事](http://mag.switch-science.com/?s=Kinoma)
		* 2015/01/22 [Kinoma Createの新機能「Pin Explorer」がリリースされました](http://mag.switch-science.com/2015/01/22/kinoma_create_pin_explorer/)

* チュートリアル
	* http://pact.eecs.berkeley.edu/andy/KinomaTutorial/
* ユーザブログ
	* [macsbug](https://macsbug.wordpress.com/category/kinoma-create/) オススメです

* なんか作った記事
	* 2015/01/31 [Kinoma Create で エアコンを自動化](https://macsbug.wordpress.com/2015/01/31/kinoma-create-で-エアコンを自動化/)
	* 2014/12/02 [Kinoma Createでコンロの消し忘れを通知するReassuring Boxを作った話](http://hatone.hateblo.jp/entry/2014/12/02/122521)
	* [キッチンのガスレンジの監視モニターを作る：計画編](http://www.basuke.com/2013/04/07/gas-range-watcher-1/) Kinoma Create の日本人開発者 バスケ先生の記事(Kinoma Createは使っていませんでした orz)
* 紹介記事
	* 2015/01/09 [さあ、今年は電子工作に励んでみよう。我が家の家庭内IoT元年かな](http://pc.nikkeibp.co.jp/atcl/NPC/15/262622/010700004/)
	* 2014/11/26 [「Kinoma Create ミートアップ」に参加してきました](http://yamaryu0508.hatenablog.com/entry/2014/11/26/093912)
	* 2014/03/23 [kinoma create Meetup　photo by K3+PENTAX 55 SDM f1.4](http://blogzine.kwmr.me/kanji/2014/03/kinoma_create_m.html)
	* 2014/03/19 [新しいデジタル機器の開発スタイルに、Webアプリ開発者を取り込みたい:米Marvell Technology Group Kinoma Vice President　ピーター・ハディ氏](http://itpro.nikkeibp.co.jp/article/Interview/20140319/544664/)
PHPとしても実行できるRubyの書きかた

## はじめに

まずはこちらのFizzBuzzをご覧ください。

```php.rb
p <<PHP_VERSION
<?php
PHP_VERSION
;print "\033[1F\033[1M";
//.tap{ define_method :range, -> s,e { s.upto e } }
//.tap{ define_method :array_map, -> f,seq { seq.map{ |x| f.(x) } } }
//.tap{ define_method :function, -> x,&b { -> x { $x=x;b.call } } }
array_map(function($x){
  print $x % 15 == 0 ? 'FizzBuzz' : ($x % 3 == 0 ? 'Fizz' : ($x % 5 == 0 ? 'Buzz' : $x));
  print "\n";
}, range(1,100));
```

`ruby php.rb`もしくは`php php.rb`で動作します。

「PHPとしてもRubyとしても実行できるアプリケーションを作ってください！」という案件が入ってくることはよくあります[^1]ので、この様にPHPとしてもvalidなRubyの書き方を身につける事でそういった案件にも対応していけるようになりましょう。


## `<?php`をどうするか

phpでは、コードを書く前にまず`<?php`という何かを書かなくてはいけません。ですがrubyにおいて`<?php`という記述はシンタックスエラーになります。

そこで、まずはrubyとしてvalidな形式で`<?php`を記述する方法が必要となります。

```rb:Ruby
p <<PHP_VERSION
<?php
PHP_VERSION
;print "\033[1F\033[1M";
```

まず、rubyとしてこのコードを解釈すると、ヒアドキュメントにて`<?php`という文字列を標準出力に書きだした後、「一行前に戻り、行全体を削除する」という内容のansicodeをprintメソッドに渡しています。

```php:PHP
p <<PHP_VERSION
<?php
PHP_VERSION
;print "\033[1F\033[1M";
```

次にphpとしてこのコードを解釈してみます。まず1行目については通常のテキストとして標準出力に書きだされます。2行目はそのまま、`<?php`なのでphpの処理開始を意味します。3行目は`PHP_VERSION`という定数を評価する（単に評価して捨てるだけ）処理、4行目はrubyの時と同じく「一行前に戻り、行全体を削除する」という内容のansicodeをprintメソッドに渡し、1行目で出力された「p <<PHP_VERSION」という文字列を削除しています。

ポイントは、4行目最初の`;`です。PHPでは文と文の間に`;`を書く必要がありますが、必ずしも行末に書く必要はありません。そして、rubyのヒアドキュメントは、識別子の後に`;`を書くとシンタックスエラーになってしまいます。この2言語間の差異を吸収するために、`;`を4行目の最初に置いています。

## 標準出力の方法

```rb
print "\033[1F\033[1M";
```

`print`を使いましょう。

## コメントアウトの利用

```rb
//.tap{ define_method :range, -> s,e { s.upto e } }
//.tap{ define_method :array_map, -> f,seq { seq.map{ |x| f.(x) } } }
//.tap{ define_method :function, -> x,&b { -> x { $x=x;b.call } } }
```

phpにおいて、行内の`//`以降はコメントとして解釈されます。一方rubyでは`//`は単に正規表現リテラルです。これを利用することでrubyでのみ実行される処理を記述することができます。

上記コードは

```rb
//.tap{ ... }
```

でなく

```rb
//; ...
```

と書くこともできます。

## 変数の利用

```rb
array_map(function($x){
  print $x % 15 == 0 ? 'FizzBuzz' : ($x % 3 == 0 ? 'Fizz' : ($x % 5 == 0 ? 'Buzz' : $x));
  print "\n";
}, range(1,100));
```

phpにおいて変数名には`$`プレフィクスが必要です。rubyにおいて`$`プレフィクス付きの変数はグローバル変数として扱われます。つまり、基本的にphpとしても実行可能なrubyのコードを書く際、変数は全てグローバル変数を使用します。グローバル変数の名前領域がガンガン汚染されていきますので本当に最高ですね。破綻しないように気合いでなんとかしてください。

## まとめ

PHPもRubyもだいすき！


### 2015/1/29追記

[コメント](http://qiita.com/supermomonga/items/79d599b4ed8b385870b0#comment-bd5f393f674017edcb98)を頂きました。


>```rb
>p <<'PHP_VERSION;'
>```

なるほど、[この様にすることで`;`を含めて識別子として認識させることができます](http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fliteral.html#here)ね。

```rb
p <<'PHP_VERSION;'
<?php
PHP_VERSION;
print "\033[1F\033[1M";
```

良い。


[^1]: ない
アプリの名前を変えたくなったときのコマンド

アプリやライブラリの開発をしていると、ふとしたときにプロダクトの名前を変えたくなるときがあると思います。

そんなときは以下のコマンドでさくっと名前を変えてしまいましょう。

`LC_CTYPE=C && LANG=C && git ls-files -z | xargs -0 sed -i .bak -e 's/OldName/NewName/g'`

ちなみにファイルのリネームはしてないので別途しないといけないっす。
UIColorは == で比較できる

色を作成するロジックのテスト中に、比較できることに気づいたのでメモ。
RGBaすべてが等しいと同一とみなしてくれるみたい。

```Swift
// 適当な色を作って
let c1 = UIColor(red: 1.0, green: 0.8, blue: 0.4, alpha: 0.2)
// 同じ
let c2 = UIColor(red: 1.0, green: 0.8, blue: 0.4, alpha: 0.2)
// red違い
let c3 = UIColor(red: 0.9, green: 0.8, blue: 0.4, alpha: 0.2)
// green違い
let c4 = UIColor(red: 1.0, green: 0.9, blue: 0.4, alpha: 0.2)
// blue違い
let c5 = UIColor(red: 1.0, green: 0.8, blue: 0.3, alpha: 0.2)
// alpha違い
let c6 = UIColor(red: 1.0, green: 0.8, blue: 0.4, alpha: 0.1)

c1 == c2 // true
c1 == c3 // false
c1 == c4 // false
c1 == c5 // false
c1 == c6 // false

// 規定で取得できる色も可能
let red = UIColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
red == UIColor.redColor() // true
```
Opacity込のTransitionでWebkit（safari）で文字が滲む対処方法

久々にサイトのコーディングしてハマったのでメモになります。
CSS3のTransitionを使ったOpacityマウスオーバ処理で、フォントが滲むという問題が発生しました。
色々とOpacityの遭遇していましたが、Webkitでは初めてみる症状だった。

コーディングってやらないと本当に忘れる・・・

## 解決策のソース

```css
html {
    -webkit-font-smoothing: antialiased;
}
```

## 参考サイト

 * [http://stackoverflow.com/questions/11402698/webkit-opacity-transition-issues-with-text](http://stackoverflow.com/questions/11402698/webkit-opacity-transition-issues-with-text)
【勉強会資料ログ】恋に落ちるエディタ♡SublimeText ~わたしがSubを愛する14の理由~


ダウンロード
http://www.sublimetext.com/3

## 第1章 Basic ~ひとめぼれの瞬間(とき)~

### 1.便利コマンド
複数選択
 - Command + d
エリアで選択
 - Ait + マウスドラッグ
コメントアウト
 - Command + P
行ごと動かす
 - Command + Ctrl + ↑ or ↓

```
<?php
$Tamy_id = '0';
$Tamy_name = 'Yukiko';
$Tamy_age = 18;
$Tamy_gender = '?';

if ($Tamy_age == 18) {
    echo "Correct!";
}
?>
```

### 2.からむ
 - Alt + Command + 数字

### 3.アプリを閉じても自動保存 ~いつでも閉じて、いつでも呼んで♡~
 - Command + Q

### 4.インデント ~整理整頓も得意なの♡~
 - (上部メニュー)Edit -> Line -> Reindent

```
<?php
if ($sublime == "girlfriend") {
if ($sublimeSay == "I feel happy") {
echo "I can fly!";
}
} else {
echo "I cannot live";
}
?>
```

### 5.高度検索機能 ~I can search all of you♡~
 - Shift + Command + F
サイドバーにプロジェクトが入っていれば、プロジェクトの中を横断して調べられる(置換も可)

正規表現とか興味あれば
http://www.mnet.ne.jp/~nakama/


### 6.設定ファイル
 - (上部メニュー)SublimeText -> Preferences -> Settings-User

```
{
    "color_scheme": "Packages/Neon Color Scheme/Neon.tmTheme",
    "draw_white_space": "all", //★半角スペースに点々が入る
    "font_size": 15,
    "highlight_line": true,
    "ignored_packages":
    [
        "Vintage"
    ],
    "line_padding_top": 4,
    "tab_size": 4,
    "theme": "Flatland Dark.sublime-theme",
    "translate_tabs_to_spaces": true, //★タブが---じゃなくてspaceになる
    "word_wrap": true, //★文字がはじっこまでいったら折り返す
    "open_files_in_new_window": false //★新しいファイルをタブで開いてくれる
}
```

## 第2章 Package ~もう君以外愛せない~

### 7.便利パッケージを使うために
PackageControllの導入
http://goo.gl/PbvFBF

準備ができたら、
Shift + Command + P でパッケージコントロールを呼び出す ~すべてはここから~
 - 新しいパッケージを入れるときは「install」で検索して、選択したのちにパッケージ名で検索


### 8.Abacus ~美しいコードは(ボディー)ラインがキマっている~
 - Shift + Command + P で Abacus

```
<?php
$Tammy_id = '0';
$Tammy_name = 'Yukiko';
$Tammy_age = 18;
$Tammy_gender = '?';
?>
```


### 9.BracketHighlighter ~パートナーはどこにいてもすぐに見つかる~
{}
()


### 10.Emmet ~魔法の言葉で呼び出しちゃうぞ♡~
 - (文字列の最後で)Ctrl + e

```
link

nav>ul>li*5

!
```

※HTML&CSSが対応
http://leko.jp/archives/442


### 11.SFTP オートリモートアップ ~ローカルもサーバも一心同体♡~
保存した瞬間に、サーバにアップロード
http://ja.wikipedia.org/wiki/SSH_File_Transfer_Protocol

fswatch, rsyncで自動同期も(gitのcheckoutやbranchを切り替えにも対応!!)
http://qiita.com/MakoTano@github/items/e865e12ff26e2bc1519a


### 12.Git & GitGutter ~もう黒い画面は見ないで~
gitとの差分がリアルタイムでわかる!!


### 13.SublimeLinter ~I always check your Grammar~
※インストール失敗したので情報だけ！

▼PHPなら
SublimeLinter-phplint

Macの人はコマンドラインで
`brew tap josegonzalez/homebrew-php`
`brew install phplint`

http://liginc.co.jp/web/js/73704


### 14.OmniMarkupPreviewer Sublimeをmarkdownエディタに!
 - Command + alt + O →　ブラウザでプレビュー
 - View -> Syntax ->　Markdown　→ 色を変えたいとき

http://webmem.hatenablog.com/entry/sublime-text-markdown


## 参考サイト
http://qiita.com/MakoTano@github/items/8853caa206283df5e1f9
http://goo.gl/TE1YPL
mix compile中に任意のコンパイル処理をする

## 結論

- `mix compile`は複数の`compile.*`タスクから成る。
- 自前の`compile.hogehoge`タスクも`compile`タスクに組み込むことができる。
- コンパイルのタイミングは`mix.exs`で指定する。

```ex
Code.require_file "lib/mix/tasks/compile.hogehoge.ex"

defmodule MyAwesomeApp.Mixfile do
  use Mix.Project

  def project do
    [app: :my_awesome_app,
     version: "0.0.1",
     elixir: "~> 1.0",
     compilers: [:hogehoge, :elixir, :app],
     deps: deps]
  end
  
  # 略
end
```

## 説明

### 何したい

例えばNIFなど、Cで書いた関数を使うElixirモジュールを作りたいとする。そのElixirモジュールはCの関数に依存するわけなので、Elixirモジュールのコンパイルの前にはCのコンパイルが済んでいてほしい。自分でやるなら勝手にどうぞって感じだけど、他人にライブラリとして提供する場合はそうもいかない。`mix deps.compile`のタイミングで、Cのソースもコンパイルしたい。

### どうする

#### `mix deps.compile`

`mix deps.compile`は、依存するライブラリを全てコンパイルする。どうやってコンパイルするかは、[そのライブラリが持つファイルによって決まる](https://github.com/elixir-lang/elixir/blob/47308bc75feea26d45adf54c33bc9f1a21340a9f/lib/mix/lib/mix/tasks/deps.compile.ex#L15-L18)。

|ファイル|コマンド|優先度|
|-------|-------|-----|
|mix.exs|`mix compile`|高|
|rebar.config|`rebar compile`|↑|
|Makefile.win|`nmake /F Makefile.win`|↓|
|Makefile|`make`|低|

Makefileを置いて`make`をさせたいけれど、Mixプロジェクトは`mix compile`されてしまう。

#### `mix compile`

`mix compile`は[複数のタスクを実行する](https://github.com/elixir-lang/elixir/blob/47308bc75feea26d45adf54c33bc9f1a21340a9f/lib/mix/lib/mix/tasks/compile.ex#L59-L61)。ここにCをコンパイルするタスクを忍ばせる。タスクは`compile.hogehoge`のように、`compile`名前空間になければならない。どのタイミングで実行するかは`mix.exs`の`project/0`で指定する。デフォルトの`compilers`は`Mix.compilers`で取得できるので、それらの前に付ける方法がGithubではよく見られる（特にPhoenixプロジェクト）。

```ex
defmodule Mix.Tasks.Compile.Hogehoge do
  use Mix.Task

  def run(_), do: Mix.shell.cmd "make"
end

def MyAwesomeApp.Mixfile do
  def project do
    [app: :my_awesome_app,
     version: "0.0.1",
     elixir: "~> 1.0",
     compilers: [:hogehoge] ++ Mix.compilers,
     deps: deps]
  end
end
```

これで`mix compile`時に`make`が走る。ライブラリとして提供した際にも`mix deps.compile`のときに`make`が走ってNIFが使えるようになる。`compile`名前空間内なのでコンパイル以外の処理をするのはどうかなー感があるが、Cのコンパイルに限らず任意の処理が可能。
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」チュートリアル（１４）モバイル対応

ここでは、「**game01**」というディレクトリ内で作業しているという前提で説明しています。

# スマートフォンのタッチスクリーン
現在主流のスマートフォンにはキーボードが無いものが多いです。
なので、ユーザーが操作するための仕組みを作ってみます。
まずは、「**gameControl.coffee**」を開き、下記のコードを「**when 1**」の最後にある「**@nextjob()**」の直前に追記してください。

```coffeescript
                touchObj = addObject
                    image: 'ground'
                    motionObj: touchScreen
                    width: SCREEN_WIDTH
                    height: SCREEN_HEIGHT / 2 
                    x: SCREEN_WIDTH / 2 
                    y: SCREEN_HEIGHT - (SCREEN_HEIGHT / 4)
                    animlist: [
                        [100, [0]]
                    ]   
                    scene: TOPSCENE
```
これは、画面のタッチイベントを処理するオブジェクトを生成しています。
「**image**」には地面を作成した時に使った「**ground**」をそのまま使っています。
画像ファイルは「**media/picture/controlpanel.png**」になります。
この画像は透明のpng画像です。
動きは無いのですが、タッチイベントを処理するクラスとして「**touchScreen**」を指定しています。
サイズの横幅は画面と同じですが、高さは画面の半分にしています。
位置は、x座標は画面中央ですが、y座標は画像が画面の下半分になるようにしています。
アニメーションは特にさせないので、「*0*」を繰り返し表示させます。
そして、オブジェクトを追加するシーンを「**TOPSCENE**」にします。
これで、どのオブジェクトよりも上に配置されます。

次に、「**touchScreen**」クラスファイルを生成します。
ゲームのディレクトリトップ（**game01**直下）で、下記コマンドを実行します。

$ **enforce derive touchScreen**

コマンドが正常終了した後、「**src/touchScreen.coffee**」が生成されているか確認してください。
生成を確認しましたら、「**touchScreen.coffee**」を開き「**constructor**」に下記コードを追記してください。

```coffeescript
        @bearchara = GLOBAL['bearchara']
```
「**GLOBAL**」に保存してある自機キャラのオブジェクトを取り出します。
そして、次がスマートフォン対応のカギになる、クラスに標準で生成されるメソッド4つになります。

1. touchesBegan
1. touchesMoved
1. touchesEnded
1. touchesCanceled

この4つのメソッドは標準で生成されていますが、初期状態ではコメントアウトされています。
上から順に説明していきます。

---
1. touchesBegan<br>
これは、スプライトがクリック（タッチ）イベントを受け取った時に呼ばれます。<br>
引数として、「**pos**」というオブジェクトが渡されます。<br>
この「**pos**」は「**x**」と「**y**」というメンバーを持っており、これがタッチされた画面上の座標になります。<br>
例）pos.x
1. touchesMoved<Br>
これは、クリック（タッチ）したまま、マウスや指を動かした場合に連続して呼ばれます。<br>
このメソッドも呼ばれるたびに引数として「**pos**」が渡されます。<br>
内容は「**touchesBegan**」と同じです。
1. touchesEnded<br>
これは、クリック（タッチ）操作が終了した場合に呼ばれます。<br>
引数として、指を離した画面上の座標「**pos**」が渡されます。<br>
これも内容は「**touchesBegan**」と同じです。
1. touchesCanceled<br>
これは、なにかしらの原因でアプリケーションがバックグラウンドに移ったりして処理が続行出来なくなった場合に呼ばれます。<br>
これも引数として、「**touchesBegan**」と同じ内容の「**pos**」が渡されます。

---

それでは、「**touchesBegan**」と、次の行の「**super(pos)**」のコメントを外してください。
そして、下記のコードを追記してください。

```coffeescript
        @bearchara.ys = -12
```
「**gameControl.coffee**」と、「**touchScreen.coffee**」の修正が終わりましたら保存してコンパイルし、ブラウザをリロードしてください。
画面下半分をクリックすると自機キャラのクマがジャンプすれば成功です。


[チュートリアル（１３）](http://qiita.com/digitarhythm/items/60b6df311fcb34d6752e) <--- ⬛︎ ---> [チュートリアル（１５）](http://qiita.com/digitarhythm/items/42b78d4e8ddbf919fc0d)

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
コンテナ内から見えるホスト側のリソース


### メモリ編
以下の情報はコンテナ内から見ても、ホスト側から見ても同じらしい
- /proc/meminfo
- /proc/vmstat

これはfree, topがコンテナ内であってもホスト上でもメモリに関して同じ情報が取れる事を意味するらしい。

### CPU編
- /proc/loadavg

top, w, uptimeあたりで見れるロードアベレージの値がやはりホストのものが取れる.

### ディスク編

[あるのかな？後日更新する]

### 応用編

上記を利用して、nagiosの監視エージェントをコンテナ内に作って、ホスト側を監視するみたいなことをやってる人達もいるようだ。

[Monitor your CoreOS servers with nrpe](http://tech.themecloud.io/monitor-your-coreos-servers-with-and-nrpe/)

## 参考URL
[Memory inside Linux containers](http://fabiokung.com/2014/03/13/memory-inside-linux-containers/)
[Is an LXC guest load average the same as the host's load average?](http://unix.stackexchange.com/questions/132021/is-an-lxc-guest-load-average-the-same-as-the-hosts-load-average)
[Monitor your CoreOS servers with nrpe](http://tech.themecloud.io/monitor-your-coreos-servers-with-and-nrpe/)
固有値・固有ベクトルを求める

以前、pythonを使って固有値・固有ベクトルを求めることをテストとして記述したのだが忘れてしまったので復習のため記述しなおしてみた。

```py:EigenValue.py
#encoding:UTF-8

import numpy
import scipy.linalg


def EigenValue():
    
    #固有値をいくつ求めるかを設定する
    hi = 2
    lo = 0

    #適当な行列を作る　
    A = numpy.matrix([[1,2,3],[4,5,6],[7,8,9]])

    #固有値、固有ベクトルを計算
    eigen_value,eigen_vector = scipy.linalg.eigh(A,eigvals=(lo,hi))

    #固有値の大きい順番で並べ替える
    eigen_id = numpy.argsort(eigen_value)[::-1]
    eigen_value = eigen_value[:,eigen_id]
    eigen_vector = eigen_vector[:,eigen_id]
    
    print eigen_value
    print eigen_vector

if __name__=="__main__":
    EigenValue()
```

パラメータ
>http://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.eigh.html
[WIP]UIPageViewController



RootViewController
ModelController


#RootViewController


```swift
self.pageViewController = UIPageViewController(transitionStyle: .Scroll, navigationOrientation: .Horizontal, options: nil)
```


UIPageViewControllerDelegate プロトコルを実装する
transitionStyle:スライド式か、ページめくり方式か設定できる

.PageCurl : ページめくり方式
.Scroll : スライド式

navigationOrientation:

.Horizontal :よこめくり
.Vertical : たてめくり


```swift
self.pageViewController!.delegate = self
```

pageViewControllerのデリゲートになる

```swift
let startingViewController: DataViewController = self.modelController.viewControllerAtIndex(0, storyboard: self.storyboard!)!

```


startingViewControllerを定数で定義する。
viewControllerAtIndex(0, storyboard: self.storyboard!)!は、modelControllerのメソッドで、
第一引数の数字(index)に該当するDataViewControllerを生成して、返すメソッド。ここでは0番目（初期値）で生成をしている。
storyboardを渡してあげ,メソッド内でストーリーボードのinstantiateViewControllerWithIdentifierを呼び出すことで、ストーリーボードにDataViewControlellerを追加することができる。


```swift
var modelController: ModelController {
        // Return the model controller object, creating it if necessary.
        // In more complex implementations, the model controller may be passed to the view controller.
        if _modelController == nil {
            _modelController = ModelController()
        }
        return _modelController!
    }

    var _modelController: ModelController? = nil

```

modelControllerは,
・インスタンス化されていればその参照を返す
・されていなければ、インスタンス化し参照を返す
関数で下記に定義されている


```swift

let viewControllers: NSArray = [startingViewController]

```
初期値画面のstartingViewControllerが入った配列（定数）を定義

```
self.pageViewController!.setViewControllers(viewControllers, direction: .Forward, animated: false, completion: {done in })
```
配列を、pageViewControllerのViewControllersに設定する。

```swift

self.pageViewController!.dataSource = self.modelController

        self.addChildViewController(self.pageViewController!)
        self.view.addSubview(self.pageViewController!.view)

```

データソースはmodelControlerにする
自信の子ViewControllerに、pageViewControllerを追加
自信のViewに、pageViewControllerのViewを追加

```swift
var pageViewRect = self.view.bounds
self.pageViewController!.view.frame = pageViewRect
 self.pageViewController!.didMoveToParentViewController(self)

```

めくっているとき、後ろにもとのViewが見えるようにする

```swift
self.view.gestureRecognizers = self.pageViewController!.gestureRecognizers


```
自信のジェスチャーレコグナイザに、pageViewControllerのジェスチャを追加