OmniAICreator/Qiita-1.07M huggingface dataset:
getimagesize/finfoのMIMEタイプ判定はザルい

http://qiita.com/sakana_kirai/items/6e512f7aea2898a6e8f2
http://qiita.com/mpyw/items/939964377766a54d4682

アップロードされたファイルについて、getimagesize()やfinfo::file()でMIMEタイプを判定しています。

```php
<?php
	// hoge.pngを判定
	$imagesize = getimagesize('path/to/hoge.png');
	$finfo = new finfo(FILEINFO_MIME_TYPE);
	$finfofile = $finfo->file('path/to/hoge.png');
	var_dump($imagesize, $finfofile);
```
	
ここでhoge.pngの中身を以下のように書き換えてみます。

```
	GIF8<script>alert("xss");</script>
```

結果。

```php
array(6) {
  [0]=>
  int(29283)
  [1]=>
  int(28777)
  [2]=>
  int(1)
  [3]=>
  string(28) "width="29283" height="28777""
  ["channels"]=>
  int(3)
  ["mime"]=>
  string(9) "image/gif"
}
string(9) "image/gif"
```

なんと頭に「GIF8」と書いておくだけで[MIMEタイプの判定](https://github.com/php/php-src/blob/master/ext/fileinfo/tests/magic)をすり抜けてしまいました。

まあMIMEタイプがimage/gifだとわかったので、ファイルは見えないところに隠しておいて、出力時にきちんとContent-Typeヘッダを出してあげれば問題ありません。

```php
<?php
	header('Content-type: image/gif');
	readfile('path/to/hoge.png');
```

これで完璧！

![finfo.png](https://qiita-image-store.s3.amazonaws.com/0/26088/455f987b-3693-5032-f481-de35547c1854.png)

お、おう。

これはIEでのみ発生する可能性のあるXSSです。
IEは設定されたContent-Typeをあまり気にせず、[ファイルの中身を見て適切な形式で出力してくれる](http://www.atmarkit.co.jp/ait/articles/0903/30/news118.html)という素敵極まりない機能が付いています。
で、IEは「GIF8」をgifとはみなさず、後続のHTMLを見てHTMLと判断してくれやがるようです。
「GIF87」にすると画像と判断されます。

X-Content-Type-OptionsというHTTPヘッダによって、この余計で傍迷惑な機能を止めることができます。
http://d.hatena.ne.jp/hasegawayosuke/20110106/p1
http://blog.everqueue.com/chiba/2011/01/06/484/

```php
<?php
	header('Content-type: image/gif');
	header('X-Content-Type-Options: nosniff');
	readfile('path/to/hoge.png');
```

これでIEでもXSSが発生しないようになります。
結論としては、とりあえずあらゆる出力にX-Content-Type-Optionsを書いとけ、というところでしょうか。

ちなみに
http://d.hatena.ne.jp/hasegawayosuke/20110106/p1
> X-Content-Type-Options: nosniff つかわないやつは死ねばいいのに!

とか書いてるこのページにはX-Content-Type-Optionsが設定されていません。
wordpress設置ディレクトリとアクセスされるディレクトリを別々にする方法


# やりたかったこと

タイトルだけでは何の事かわからないかもしれないので図示する。

```
www/
|-column
|
|-wp
|
```

こんなフォルダ構成で、見かけ（URL）上は /column/ にアクセスさせたい。ただし、wordpress ファイル一式の設置場所は /wp/ 以下にしたかった。

# 解決方法

/wp/ には既にインストール済みとします。

## 1. 管理画面で設定

設定＞一般　で、次のように設定し、保存します。

wordpressアドレス（URL）：http://example.com/wp
サイトアドレス（URL）：http://example.com/column

## 2. /column/に index.php と.htaccess をコピー

/wp/ にある index.php と.htaccess を/column/ にコピーします。

## 3. index.php を書き換え

/column/index.php の17行目を次のように書き換えます。

```index.php

require( $_SERVER['DOCUMENT_ROOT'] . '/contents/wp/wp-blog-header.php' );

```


# 注意点
Wordpress Codex 日本語版
[WordPress を専用ディレクトリに配置する](
http://wpdocs.sourceforge.jp/Giving_WordPress_Its_Own_Directory)

基本的にこちらの方法に従いました。
変えたのは、

```
require('./wp/wp-blog-header.php');
```
の書き方を

```
require( $_SERVER['DOCUMENT_ROOT'] . '/wp/wp-blog-header.php' );
```
としたところくらいでしょうか。

うまくいかなかったら、フォルダのパーミッション設定を確認するといいかも。
RubyGem(qiita_matome)でQiitaのまとめ記事を自動生成してみた

# RubyGem(qiita_matome)でQiitaのまとめ記事を自動生成する

## RubyGem「qiita_matome」をインストールする。

```
$ gem install qiita_matome
```

## 初期化を行う

```
$ qiitam init
```

設定ファイル「Qiitamatomefile」が生成されます。

## 設定ファイルを編集する

Qiitamatomefileを編集します。（コメントは除いてあります）


```rb
# encoding: utf-8

user "ryosy383" #ユーザー名

tag "Ubuntu" #タグ名

title "Ubuntu まとめ タイトル昇順" #まとめ記事タイトル

output_file "./matome_title_asc.md" #まとめ記事出力ファイル名

sort_type "title_asc" #ソートの種類

display_columns [:no, :title, :created_at, :stock_count] #出力するカラム指定

excludes [] #除外したい記事が有る場合は、URLのハッシュを指定します。
```

## まとめ記事ファイルを生成

```
$ qiitam matome
```

output_fileで指定した「matome_title_asc.md」が生成され、
markdown形式でまとめ記事が自動生成されます。


## 出力サンプル：

「matome_title_asc.md」の内容をQiita投稿markdownに貼り付けると以下のようになります。

# Ubuntu まとめ タイトル昇順

更新日: 2014/07/04 20:55:48

|No.|タイトル|作成日|ストック数|
|--:|:--|:--:|--:|
|1|[Scala開発環境構築(ScalaIDE, Ubuntu版)](http://qiita.com/ryosy383/items/b3ad13c66d75311dc839)|2014/07/01 21:40:02|4|
|2|[Ubuntu 14.04 LTS (Trusty Tahr)でハイバーネートを有効にする方法](http://qiita.com/ryosy383/items/4f72a11e54977c208cf7)|2014/04/28 00:12:01|6|
|3|[Ubuntu ServerでOpenSSLのバージョンを1.0.1hにする](http://qiita.com/ryosy383/items/48bad1aeed2c4be23b45)|2014/06/21 09:10:42|2|
|4|[UbuntuにJenkinsをインストールする](http://qiita.com/ryosy383/items/004ec499ada413d07b35)|2014/06/22 01:43:52|5|
|5|[UbuntuのUIフォントを変更する方法](http://qiita.com/ryosy383/items/1ca8d93b41788a7048cc)|2014/03/07 03:24:06|8|

## 参考

・RubyGem「qiita_matome」のGitHub
https://github.com/tbpgr/qiita_matome
・Rubygems.org
https://rubygems.org/gems/qiita_matome
Weblogicのデプロイに関する資料

Weblogicのデプロイを自動化するときの参考用資料まとめ。バージョンとか適当。

## WebLogic Serverデプロイメント・エッセンシャルズ
http://www.slideshare.net/OracleMiddleJP/20130620-wlstudy-deployhandsout
デプロイの概要がわかりやすくまとまってる。

## WebLogic Server アプリケーションのデプロイメント
http://otndnld.oracle.co.jp/document/products/wls/docs103/deployment/index.html


## 開発ドメインへのアプリケーションの自動デプロイ
http://otndnld.oracle.co.jp/document/products/wls/docs92/deployment/autodeploy.html

## Ant タスクを使用した WebLogic Server ドメインのコンフィグレーションと使用
http://otndnld.oracle.co.jp/document/products/wls/docs90/programming/ant_tasks.html
Antでサーバー管理するときのコマンドの参考になるぽい。


## wldeploy Antタスクのリファレンス
http://docs.oracle.com/cd/E28389_01/web.1111/b60990/wldeploy.htm
Ant使って自動化するときにどういうコマンドあるか参考になるぽい。

## 起動・停止を極める
http://www.slideshare.net/OracleMiddleJP/ss-16168237
weblogicの起動・停止を基礎から解説してる。weblogicに限らずスクリプトを作るときなんかに有用なスライドだ。
dismissViewControllerの後にpresentViewControllerでエラー

# dismissViewControllerの後にpresentViewControllerでエラー
下記のエラーメッセージが。

```
Warning: Attempt to present <ViewController: 0xc44c7e0> on <UITabBarController: 0xc482980> while a presentation is in progress
```
コードは下記のように、imagePickerControllerで画像が選択された際に、modalで表示している画面を閉じた後に、編集用のmodalを開くという動作。

```objectivec
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    // 画像が選択されたら一旦画面を閉じる
    [_tabBarController dismissViewControllerAnimated:YES completion:nil];
    
    // 投稿画面を開く
    hogeViewController = [[hogeViewController alloc] initWithImage:[info objectForKey:UIImagePickerControllerOriginalImage]];
    [_tabBarController presentViewController:hogeViewController animated:YES completion:nil];
}

```

### 原因
- dissmissのanimationがYESになっていたこと。
- animationが実行中にpresentメソッドが実行されたために、処理がバッティングしてしまったみたい
promise.fail()の登録が行われなかった場合用の処理

jQuery.ajax()でエラーだったら画面で通知したいけど、一部の通信については正常系で失敗するパターンがある（ログイン情報が401で未ログインと判断とか）ので、そのときは普通のエラー処理したくない。そんなとき。

```js
// 初期の失敗時コールバックを登録
var handled = false;
p.fail(function() {
    // 失敗時制御済みでなければコールバック実行
    if (!handled) {
        return onfail.apply(this, arguments);
    }
});

// 失敗時コールバック登録処理を上書き、
// 一度でも呼び出しがあれば制御フラグをonにする
var _org_fail = p.fail;
p.fail = function(callback) {
    handled = true;
    // 処理を戻し、正規の登録処理も行う
    p.fail = _org_fail;
    return p.fail(callback);
};
```

デモ:

* http://jsfiddle.net/ginpei/Lj6Bz/

うーんなんかこんなやり方になる設計がダサい気もしないでもない。
cocos2d-xで画像をシーンの背景にリピート表示

タイトルのままです。背景をタイルのようにrepeatで敷き詰めたい時に。
(注) 背景にしたい画像は2の階乗のサイズである必要があります。

```cpp:Scene.cpp
bool Scene::init()
{
    //////////////////////////////
    
    if ( !Layer::init() )
    {
        return false;
    }
    
    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();
 
    // Set an image to a texture, set the param "repeat"
    Texture2D *bgTexture = Director::getInstance()->getTextureCache()->addImage("bg.jpg");
    const Texture2D::TexParams tp = {GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT};
    
    // use the texture as Sprite
    Sprite *background = Sprite::createWithTexture(bgTexture, Rect(0, 0, visibleSize.width, visibleSize.height));
    background->getTexture()->setTexParameters(tp);
    background->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));
    this->addChild(background, 1);
    
    :
    :
減速せずに回転し続けるアニメーション


以下のアニメーションでも回転し続けるが
1回のアニメーション終了前に、減速してからのリピートになるので
綺麗に同じスピードで回転し続けない

```xml:rotate_repleat.xml
<?xml version="1.0" encoding="utf-8"?>

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="360"
    android:fromDegrees="0"
    android:repeatCount="-1"
    >
</rotate>
```

ということで
上記のアニメーションのInterpolatorにLinearInterpolatorをセットすることで
減速のアニメーションを消しました

```java
RotateAnimation animation = (RotateAnimation) AnimationUtils.loadAnimation(this,R.anim.rotate_repeat);
animation.setInterpolator(new LinearInterpolator());
findViewById(R.id.hoge).startAnimation(animation);
```

アニメーションxmlのinterpolatorにlinearを入れても同じ結果になりますが
この書き方だとAPIレベル10以下には対応していません

```xml:rotate_repleat.xml
<?xml version="1.0" encoding="utf-8"?>

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:interpolator/linear"
    android:duration="1000"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="360"
    android:fromDegrees="0"
    android:repeatCount="-1"
    >
</rotate>
```

どうしてもxmlで対応する場合は
別のanimation.xmlにlinearInterpolatorを定義して

```xml:interpolator.xml
<?xml version="1.0" encoding="utf-8"?>
<linearInterpolator xmlns:android="http://schemas.android.com/apk/res/android"/>
```

それを参照するとうまく行きます

```xml:rotate_repleat.xml
<?xml version="1.0" encoding="utf-8"?>

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@anim/interpolator"
    android:duration="1000"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="360"
    android:fromDegrees="0"
    android:repeatCount="-1"
    >
</rotate>
```
サーバー上でSVGが表示されない時


SVGを利用したサイトをエックスサーバーやロリポップにアップしたらそのままでは表示されなかった。

下記を追加したら問題解決しました。

```.htaccess
AddType image/svg+xml .svg
AddType image/svg+xml .svgz
```

via [ベクター形式でWebページ上に表示できるSVGでロゴを描いてみた | SUSH-i LOG](http://blog.sus-happy.net/201203/svg-logo/)
Docker入門: 2日目

# Debianにごにょごにょ

## コンテナを起動、接続

コンテナ一覧を確認。
(1日目のコンテナは削除し、別のコンテナを作っているので、前記事とコンテナIDが違ってます...すみません)

```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
a4d504a59714        debian:latest       /bin/bash           3 minutes ago       Exited (127) 1 seconds ago                       sleepy_fermi

$
```

コンテナa4d504a59714を起動後、実行中のコンテナ一覧を確認。

```
$ docker start a4d
a4d

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a4d504a59714        debian:latest       /bin/bash           5 hours ago         Up 16 seconds                           elegant_archimedes 

$
```

コンテナa4d504a59714に接続。

```
$ docker attach a4d

root@a4d504a59714:/# 
```

## いろいろインストール

```
$ docker run -it debian /bin/bash
root@a4d504a59714:/# apt-get update
...
Reading package lists... Done

root@a4d504a59714:/# apt-get upgrade
...
upgraded.

root@a4d504a59714:/# apt-get -y aptitude
...
root@a4d504a59714:/# apt-get -y ssh
...
...
...
root@a4d504a59714:/# 
```

# イメージを作る

## コンテナからイメージを作る

基本的なソフトウェアを入れたので、コンテナa4d504a59714をイメージにしておきます。
今後の課題でやらかしても帰ってこれるように...。

```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
a4d504a59714        debian:latest       /bin/bash           7 hours ago         Exited (0) 8 minutes ago                       elegant_archimedes  

$ docker commit a4d intern/base
18d571447ec6d2951054872f04d9192e84b4081d0c9172efa51f2defe6787fad

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
intern/base         latest              18d571447ec6        40 seconds ago      408.9 MB
debian              latest              63f650c4db34        2 days ago          85.18 MB
```

## イメージintern/baseからコンテナを作る

ポートフォワーディングしてみたり。

```
$ docker run -p 22 -it intern/base /bin/bash
root@1428cee52ef3:/# 
```

IMAGE項目が変わってる。

```
$ docker ps -a
CONTAINER ID        IMAGE                COMMAND             CREATED              STATUS                      PORTS               NAMES
1428cee52ef3        intern/base:latest   /bin/bash           About a minute ago   Exited (0) 50 seconds ago                       high_lumiere         
a4d504a59714        debian:latest        /bin/bash           8 hours ago          Exited (0) 16 minutes ago                       elegant_archimedes   

$
```

## 続く

ひとまず基本的なところは終わり。

[Docker入門: 3日目](http://qiita.com/akaneyuki/items/2d15606fd1540f7f91d7)

# 参考
* [いまさら聞けないDocker入門（2）](http://www.atmarkit.co.jp/ait/articles/1406/10/news031.html)
WebデザイナーがCoda2にクリップしているCompassのmixinとかをまとめてみました

作業メモです。
追々、追記していきます。

# Compassをインポート
まずは、Compassをインポートします。
`@import "compass";
@import "compass/reset";
@import "compass/layout";`
※resetはリセットCSSのモジュール。必要に応じてインポートする
※layoutはレイアウト系のモジュール。こちらも必要に応じて

# [mixin]clearfix
floatの回り込みを解除するときに使います。
`@include clearfix;`
## コンパイル結果
`overflow: hidden;
*zoom: 1;`

#[mixin]角丸(CSS3)
`@include border-radius(角丸の半径);`
## コンパイル結果
`-webkit-border-radius: 角丸の半径;
-moz-border-radius: 角丸の半径;
-ms-border-radius: 角丸の半径;
-o-border-radius: 角丸の半径;
border-radius: 角丸の半径;`

#[mixin]inline-block
コンテンツを横並びにします。
`@include inline-block;`
## コンパイル結果
`display: -moz-inline-stack;
display: inline-block;
vertical-align: middle;
*vertical-align: auto;
zoom: 1;
*display: inline;`

#[mixin]不透明度(0.0〜1.0)
`@include opacity(プレースホルダー：挿入ポイント￼);`

## コンパイル結果 （以下は0.6を入れた場合の結果）
`filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=60);
opacity: 0.6;`

#[mixin]文字の省略符号
`@include ellipsis;`
## コンパイル結果
``

#[Helpers]画像サイズ取得　Image Dimension Helpers
`width: image-width("プレースホルダー：挿入ポイント￼");
height: image-height("プレースホルダー：挿入ポイント￼");`
※プレースホルダー：挿入ポイントには、画像のファイル名を入れます。
## コンパイル結果
``

#[Helpers]画像パス補完　URL Helpers
`background: image-url("プレースホルダー：挿入ポイント￼") top left no-repeat;`
※プレースホルダー：挿入ポイントには、画像のファイル名を入れます。
## コンパイル結果
``
Swiftで面倒なJSONの取り扱いを10倍便利にするSwiftyJSON


SwiftyJSON
https://github.com/lingoer/SwiftyJSON

上記を読んでしまえば一瞬なんですが、一応使い方をこちらにもそのまま書いておきます。

#JSONの取り扱いって面倒ですよね？

~~~json
[
  {
    ......
    "text": "just another test",
    ......
    "user": {
      "name": "OAuth Dancer",
      "favourites_count": 7,
      "entities": {
        "url": {
          "urls": [
            {
              "expanded_url": null,
              "url": "http://bit.ly/oauth-dancer",
              "indices": [
                0,
                26
              ],
              "display_url": null
            }
          ]
        }
      ......
    },
    "in_reply_to_screen_name": null,
  },
  ......]
~~~

こんなデータがあったとします。

データの取り出しはこんな感じ

~~~swift
let jsonObject : AnyObject! = NSJSONSerialization.JSONObjectWithData(dataFromTwitter, options: NSJSONReadingOptions.MutableContainers, error: nil)
if let statusesArray = jsonObject as? NSArray{
    if let aStatus = statusesArray[0] as? NSDictionary{
        if let user = aStatus["user"] as? NSDictionary{
            if let userName = user["name"] as? NSDictionary{
                //やっと取り出せました。

            }
        }
    }
}
~~~

面倒ですよね。。
下記のような方法でも汚い。

~~~swift
let jsonObject : AnyObject! = NSJSONSerialization.JSONObjectWithData(dataFromTwitter, options: NSJSONReadingOptions.MutableContainers, error: nil)
if let userName = (((jsonObject as? NSArray)?[0] as? NSDictionary)?["user"] as? NSDictionary)?["name"]{
  //What A disaster above
}
~~~

#そこでSwiftyJSONの登場

##セットアップ
https://github.com/lingoer/SwiftyJSON
~~まだswiftはpodに対応していないらしいので上記からzipをダウンロード＆解答してSwiftyJSON.swiftをダウンロードしてプロジェクトに投げ込んで設定完了~~

この辺から見てください
[cocoapodsセットアップからSwiftyJSON動作確認まで](http://qiita.com/daikuro/items/1e3758f58783e12e8a52)

##使い方

~~~swift
var url = "http://maps.googleapis.com/maps/api/directions/json?origin=Boston,MA&destination=Concord,MA&sensor=false"
var reqest = NSURLRequest(URL: NSURL(string: url))

NSURLConnection.sendAsynchronousRequest(reqest,queue: NSOperationQueue.mainQueue(),completionHandler:{
    (res: NSURLResponse!, data: NSData!, error: NSError!) in
        let json = JSONValue(data)
        if let distance = json["routes"][0]["legs"][0]["distance"]["text"].string{
            println(distance)
        }
})
~~~

簡単ですね。
Markdownの中にMarkdownを書きたい

一体何を言っているのか？というと

<pre>
#これがh1です
```
ここにこーどを書きます
```
</pre>
とかってチュートリアル自体をMarkdownで書きたいということです．

結論は，Markdownをpreタグで囲むだけです．
```
<pre>ここにマークダウン</pre>
```
としましょう．preタグの効力のほうが強いみたいですね．とりあえずqiitaとgithubでは使えました．
[C++]HMACをC＋＋で書いてみた

C++でHMAC(メッセージ認証のための鍵付ハッシング)の実装を書いてみました。
Githubにコードを置いたので、実際のコードはここを見てください。
https://github.com/chromabox/hashcodes

ライセンスは一応MITライセンスになってます。
一応テストはしましたが、未保証です。

##事の経緯

HMACの実装自体も、ライブラリも巷にあふれているんですが、HMACの仕様書を見てちょっと真面目に書き直したくなったので、せっかくだからテンプレートなどを使って書き直してみたかったという感じです。

周りに読める人が少ないということで、あまりテンプレートは使ってこなかったのですが、たまに使わないと忘れてしまうので、今回は良い題材になりました。

##使い方

今のところg++にのみ対応しています。STLも必須です。
コンパイルオプション等はMakefileを見てください。

使い方はテストコードを見れば大体分かるのですが、HMAC-SHA1を算出する場合は次のようにします。

```cpp
#include "hmac.hpp"

void test()
{
	using namespace std;
	string digest;
	string key("keykey");
	string data("abcdefg");
	hmac_sha1::create_digest(data.c_str(),data.size(),key.c_str(),key.size(),digest);
	cout << digest << endl;
}

```

ダイジェストはstring以外にもstd::uint8_t型を渡すことも出来ますが、hmac_sha1の場合はsha1::DIGEST_LENGTHのサイズ以上でないといけません。
また、同様にMD5用の実装であるhmac_md5もあります。


おまけとして、sha1、md5の値算出も出来ます。
sha1値を求める場合は以下のようにします。

```cpp
#include "sha1.hpp"

void test()
{
	using namespace std;
	sha1 hasher;
	string digest;
	string data("abcdefg");

	hasher.update(data.c_str(),data.size());
	hasher.final(digest);
	cout << digest << endl;
}

```

##TODO

* SHA2xx系ハッシュ関数の追加
* 他の言語に対する実装（手始めにpureなCかな）
* MSVCでコンパイルできるようにする



##参考文献など

RFC 2104　HMAC：メッセージ認証のための鍵付ハッシング (日本語訳)
https://www.ipa.go.jp/security/rfc/RFC2104JA.html

RFC 1321　MD5 メッセージダイジェストアルゴリズム (日本語訳)
https://www.ipa.go.jp/security/rfc/RFC1321JA.html

RFC 3174　US Secure Hash Algorithm 1 (SHA1) (日本語訳)
https://www.ipa.go.jp/security/rfc/RFC3174JA.html

RFC 2202　HMAC-MD5 と HMAC-SHA-1 のためのテストケース (日本語訳)
https://www.ipa.go.jp/security/rfc/RFC2202JA.html

boostのSHA1の実装
boost/uuid/sha1.hpp

linuxのSHA1の実装
linux/crypto/sha1_generic.c
vimのインストール


## 内容
- Mac
	- homebrewを使ったインストール
- CentOS
	- ソースからコンパイルしてインストール

## ドキュメント

ここ読み込んだら幸せになれそう
http://vim-jp.org/vimdoc-ja/


## Macにhomebrewでインストール


```sh
brew install vim --with-features=huge --enable-multibyte --enable-pythoninterp=dynamic --enable-cscope --enable-fontset --disable-gui --without-x --enable-gpm --with-python --with-lua --with-ruby
```

`client-server`とか[面白そう](http://blog.bonar.jp/entry/20090308/1236527086)だけど、弄るのしんどそうだった
`X11`と連携させてもいいのかもしれないけど異常に重いので`disable-gui`と`--without-x`付けてる

`enable-cscope`で入る`cscope`は`ctags`の[上位互換っぽい](http://vim-jp.org/vimdoc-ja/if_cscop.html)し入れてるけど使ってない。`ctags`で満足してる。
最近`lua`とか`python`インターフェースついてないと動かないプラグイン多いので入れてる
`--enable-pythoninterp=dynamic`と`--with-python`両方あるけど、両方入れたらうまくいったので書いてる
よくわからないけど`ruby`は入れて`perl`は入れてないのに理由はない


## CentOSにソースからインストール

Mercurial使って最新版を落とす
参考：http://yuheikagaya.hatenablog.jp/entry/2013/04/23/211530

```sh
hg clone https://vim.googlecode.com/hg/ vim
# 更新する場合は
hg pull
hg update
```

コンパイルしてインストールする

```sh
./configure --prefix=$HOME/local --with-features=huge --enable-multibyte --enable-pythoninterp=yes --enable-cscope --enable-fontset --enable-gnome-check --without-x --enable-gpm --disable-darwin --disable-netbeans --disable-selinux --disable-gui --without-x --enable-rubyinterp=yes --enable-luainterp=yes
make && make install
```

vim落としてきてパッチ当ててコンパイルしてインストールしてる
`sudo`権限無かったので`--prefix`で自分の手の届く範囲にインストールしている
`pyenv`つかってpythonのバージョン管理してるから`--with-python-config-dir`指定しないとだめかとおもいきや良い感じにしてくれてた
環境依存っぽいし、その都度対応することになりそう
オプションは適当。
`./configure --help`したら付けられるオプション見れるので便利


-- 

Mecurialでの方法を知った以上、もう必要ないが、自分で落としてきてパッチ当てるには以下のようにする

```sh
mkdir ~/tmp
cd ~/tmp
wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2
tar -jxvf vim-7.4.tar.bz2
cd vim74
mkdir patches
cd patchs
seq -f http://ftp.vim.org/pub/vim/patches/7.4/7.4.%03g 355 | xargs wget
cd ..
cat patches/7.4.* | patch -p0
```




## 感想

2014年だけどvim使ってます
pythonオプションの`dynamic`と`yes`の違い分かってないけど`jedi-vim`とかどっちでも動いてるし問題なさそう
ちなみに、2014/07/04の時点では、homebrewで入るvimはパッチ335まで適用済みのものだった
オプションとか、ほんの少しvimの起動遅くなるの気にしなければどんどん入れればいいと思ってる
間違いとかあればぜひ教えて下さい
iOSアプリからRailsへPOSTする際のCSRF対策用トークンについて

 iOSアプリからRailsのサイトへログインを行う際、iOS側で入力したユーザー名とパスワードをRailsへPOSTとすると、CSRFトークンがリクエストパラメータ中に無いため接続が拒否される。

良いのか分からないけど、事前にCSRFトークンを取得できるようにして回避しようかと検討中。

```rb

# ログイン認証とかするコントローラ
class SessionController
 def get_csrf_token
    render text: form_authenticity_token
 end
end
```

他により良い案があれば、ご教授お願いします。
csrfトークンをむやみに返してよいものか。。。
ubuntuで（できるだけ）全部のlocaleを追加する

# ubuntuでlocaleを追加する

普通にinstallして使う分には問題ないのですが、vagrantやdockerのofficial imageを使うとC localeしかない場合があります。（C localeしかないと言ってもC/C.utf8/POSIXが見えますが。C localeじゃなくてPOSIX localeって言う方がいいのかな……？）

これで問題ない時もありますが、変なところで引っかかることもあります。私はmultibyte characterが含まれたgemspecファイルで引っかかりました。

なので、utf-8のlocaleを追加してみます。

# 日本語のlocaleを追加する

## aptでlanguage-packを追加する

language-pack-jaをインストールしてもいいです。

```shell-session
root@localhost # apt-get install language-pack-ja
```

ちなみにインストール可能なlanugage-packはapt-cacheで見れます。

```shell-session
root@localhost # apt-cache search language-pack
```


## locale-genする

でもlocaleだけ追加したいことってありますよね。表示しなくていい、みたいな。そういう時はlocale-genとupdate-localeを使います。

```shell-session
root@localhost # locale-gen ja_JP.UTF-8
root@localhost # update-locale LANG=ja_JP.UTF-8
```


## サポートしているlocaleを全部入れる

さて、ここまではなんてことないことで、検索するとすぐ出てきます。でも、Ubuntuがサポートしているlocaleを全部入れたいことってありますよね？（あるのか？）

まず、サポートしているlocaleのリストが /usr/share/i18n/SUPPORTED にあります。

```shell-session
root@localhost # head /usr/share/i18n/SUPPORTED
# This file names the currently supported and somewhat tested locales.
# If you have any additions please file a glibc bug report.
aa_DJ.UTF-8 UTF-8
aa_DJ ISO-8859-1
aa_ER UTF-8
aa_ER@saaho UTF-8
aa_ET UTF-8
af_ZA.UTF-8 UTF-8
af_ZA ISO-8859-1
am_ET UTF-8
```

念のためtailもしてみます。

```shell-session
root@localhost $ tail /usr/share/i18n/SUPPORTED 
zh_HK.UTF-8 UTF-8
zh_HK BIG5-HKSCS
zh_SG.UTF-8 UTF-8
zh_SG.GBK GBK
zh_SG GB2312
zh_TW.EUC-TW EUC-TW
zh_TW.UTF-8 UTF-8
zh_TW BIG5
zu_ZA.UTF-8 UTF-8
zu_ZA ISO-8859-1
```

ふうむ…今回は.UTF-8が付いているやつだけ入れましょう。

```shell-session
root@localhost $ grep '\.UTF-8' /usr/share/i18n/SUPPORTED | awk '{ print $1 }'
```

とかで一覧が出ますので、

```shell-session
root@localhsot $ locale-gen $(grep '\.UTF-8' /usr/share/i18n/SUPPORTED | awk '{ print $1 }')
```

します。

（ここでたまにエラー出たりしますが、要望があれば調査してみるので、コメントを下さい。とりあえず私はいらないのでやっていません。）

この後にC以外でupdate-localeするのを忘れないようにしましょう。


# 終わりに

ものすごい手抜きですが、こんな手順で簡単にlocaleがだいたい全部入ります。もしドキュメントやフォント等が入れたかったら、apt-get install 'language-pack-*'すればいいです。手元では782MB、1184のnew packageで済みました。

まあ、勝負はここからなわけですので、がんばりましょう！
CakePHPで生成されたパスワードをRailsで認証する。

CakePHPで生成された暗号化されたパスワードをRailsで認証する方法。

1: CakePHPのプロジェクトファイルのapp/config/core.phpからSecurity.saltの文字列をコピーする。

```php
Configure::write('Security.salt', 'ここのランダム文字列');
```

2: Railsのモデルの例

```rb
class Customer < ActiveRecord::Base
  # has_secure_password これは使わない。
  def authenticate_php(plain_text)
    # password_encryptedはCakePHPで暗号化されたパスワード
    password_php(plain_text) == self.password_encrypted
  end

  def password_php(plain_text)
    cake_salt="Security.saltのランダム文字列"
    # SHA1の場合
    Digest::SHA1.hexdigest("#{cake_salt}#{plain_text}")

    #SHA256の場合
    #Digest::SHA256.hexdigest("#{cake_salt}#{plain_text}")
    #MD5の場合
    #Digest::MD5.hexdigest("#{cake_salt}#{plain_text}")
end
```
特定のPathまでのディレクトリ、ファイルの権限を一度に表示する

**特定のPathまでの権限を確認** したいことがある。 **HTTPサーバで権限エラー** , **SSH キーの権限** を確認したりするときに使えます。
一括で該当ディレクトリまでの権限を確認する方法を紹介します。


`$namei -l [path]`

結果は以下のように表示されます。

```
root@host ~# namei -l ~/.ssh/id_rsa
f: /root/.ssh/id_rsa
drwxr-xr-x root root /
drwx------ root root root
drwx------ root root .ssh
-rw------- root root id_rsa
```
AWSの異リージョンへの通信を調べてみた

調査したのですが分かりにくかったので、実際に実験してみました。

#条件
◆通信元
　リージョン：Asia(TOKYO)
　AZ　　　　：ap-northeast-1c

◆通信先
（１）日本
　リージョン：Asia(TOKYO)
　AZ　　　　：ap-northeast-1a 及び ap-northeast-1c 

（２）EU
　リージョン：EU(Ireland)

（３）US
　リージョン：US(N.Virginia)

◆確認方法
（１）ping による確認
　　ping送信先EC2の所属するセキュリティグループにて以下を許可
　・通信元のPublicIPを許可した場合
　・通信元のPrivateIPを許可した場合
　・通信元のセキュリティグループを許可した場合

（２）Zabbixの確認
　　全部PublicIPを許可したパターンでやりました。
　・コマンドでの確認
　　`zabbix_get -s publicIP -k agent.version`
　・自動登録できているかの確認（Zabbixコンソール）
　・Zabbix-Agetで監視できるかの確認（シンプル監視、Agent監視）

#疎通確認

（１）日本
　◆同リージョン（ap-northeast-1a）
　　①pingによる確認
　　　（ア）publicIPを許可した場合
　　　　　　　publicIPへのping　：OK
　　　　　　　privateIPへのping ：NG

　　　（イ）privateIPを許可した場合
　　　　　　　publicIPへのping　：NG
　　　　　　　privateIPへのping ：OK

　　　（ウ）セキュリティグループで許可した場合
　　　　　　　publicIPへのping　：NG
　　　　　　　privateIPへのping ：OK

　　②zabbixによる確認
　　　コマンド：OK
　　　自動登録：OK
　　　監視　　：OK

　◆異リージョン（ap-northeast-1c）
　　①pingによる確認
　　　（ア）publicIPを許可した場合
　　　　　　　publicIPへのping　：OK
　　　　　　　privateIPへのping ：NG

　　　（イ）privateIPを許可した場合
　　　　　　　publicIPへのping　：NG
　　　　　　　privateIPへのping ：OK

　　　（ウ）セキュリティグループで許可した場合
　　　　　　　publicIPへのping　：NG
　　　　　　　privateIPへのping ：OK

　　②zabbixによる確認
　　　コマンド：OK
　　　自動登録：OK
　　　監視　　：OK

（２）EU
　　①pingによる確認
　　　（ア）publicIPを許可した場合
　　　　　　　publicIPへのping　：OK
　　　　　　　privateIPへのping ：NG

　　　（イ）privateIPを許可した場合
　　　　　　　publicIPへのping　：NG
　　　　　　　privateIPへのping ：NG

　　　（ウ）セキュリティグループで許可した場合
　　　　　　　日本リージョンのセキュリティグループを参照できない

　　②zabbixによる確認
　　　コマンド：OK
　　　自動登録：OK
　　　監視　　：OK

（３）US
　　①pingによる確認
　　　（ア）publicIPを許可した場合
　　　　　　　publicIPへのping　：OK
　　　　　　　privateIPへのping ：NG

　　　（イ）privateIPを許可した場合
　　　　　　　publicIPへのping　：NG
　　　　　　　privateIPへのping ：NG

　　　（ウ）セキュリティグループで許可した場合
　　　　　　　日本リージョンのセキュリティグループを参照できない


　　②zabbixによる確認
　　　コマンド：OK
　　　自動登録：OK
　　　監視　　：OK

#まとめ

◆リージョンが異なるとできないこと
・privateIPへの通信
・key pairの利用（実験用にEC2建てたら気付いた）
・セキュリティグループでのセキュリティ許可

◆リージョンが異なってもできること
・publicIPでの通信（当たり前）
・zabbix自動登録（意外に早かった）
・zabbixAgent監視

◆他にわかった事
・セキュリティグループでの許可を行った場合は、privateIPへの通信が許可される。
・同一リージョンであれば、privateIPへの通信が許可される。
Chromeのtextareaに大量の文字が入ると重くなる点の対策

# Chromeのtextareaに大量の文字が入ると重くなる点の対策

ページ読み込み時、textareaに大量の文字(5,000行程)が入ってると、Chromeでだけ重くなるので、アレコレ試してみた。
(※ Chrome バージョン 35.0.1916.153)

## 症状

textareaの中に、プレーンなCSSが5,000行程入った状態。
重くなるのは、テキストエリアのスクロールを最下部へ一気にスクロールした場合。
かなり反応が悪くなり、たまにブラウザがクラッシュすることも。
AndroidのChromeだと、アプリが落ちた。。
テキストエリアを下までスクロールしない場合は、何も問題なし。

## 謎

なぜかChromeだけで、他のブラウザは全て大丈夫。
ローカルに保存したHTMLの場合には発生せず、サーバから読み込んだHTMLの場合にだけ発生しているようす。
CSSやJavaScriptも全てカットして、textareaだけになっても回避できず。

## 回避策

色々試した結果、フォーカスを当てた後に文字を全てカットし、再度貼り付けた場合には重くならなかったので、JavaScriptで同様の処理を当てると、やっと重くならなくなった。

```html
<textarea id="hoge" name="hoge" rows=50 cols="70">ここに5,000行程の文字</textarea>
<script>
(function () {
    var elem = document.getElementById('hoge');
    var str = elem.value;
    elem.focus();
    elem.value = '';
    elem.value = str;
    elem.blur();
})();
</script>
```

一旦フォーカスを当てるところがポイントで、フォーカスが当たった状態で切り貼りしないと、この重くなる症状は回避できないようす。
どうもChromeのバグっぽいから、そのうち直りそうな気もするけど、現状の回避方法ということで。
CentOS7QA のdockerイメージをRepositoryを登録と、日本仕様にした。

# CentOS7リリースに伴い、紛らわしいのでイメージを削除しました。

[Dockerhub](https://hub.docker.com/)を使ってみたかった。

## 特徴

* repositoryの登録
* timezoneをAsia/Tokyoに変更
* export LANG=ja_JP.UTF-8

# 使い方

```bash:
docker pull tukiyo3/centos7qa-ja
docker run -i -t tukiyo3/centos7qa-ja /bin/bash
```

```bash:動作確認
bash-4.2# date
2014年  7月  4日 金曜日 14:32:06 JST
bash-4.2# yum search gcc
=========================================================================== N/S matched: gcc ============================================================================
gcc-c++.x86_64 : C++ support for GCC
gcc-gnat.x86_64 : Ada 95 support for GCC
...
```


# 作成した手順

```bash:イメージのダウンロード
export URL="https://www.dropbox.com/s/k643ql96eirowj7/CentOS-7-20140625-x86_64-docker_01.img.tar.xz"
curl -L $URL | docker import - centos7:init
docker run -i -t centos7:init /bin/bash
```

## Repository設定

```bash:/etc/yum.repos.d/CentOS-Base.repo
[CentOSQA]
name=CentOSQA
baseurl=http://buildlogs.centos.org/centos/7/os/x86_64-latest/
gpgcheck=0
enabled=1
```

## 日本語化

```bash:timezone設定
unlink /etc/localtime
ln -s /usr/share/zoneinfo/Japan /etc/localtime
```

```bash:言語設定
localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
echo "export LANG=ja_JP.UTF-8" > /.bashrc
```

## Dockerhubにpush

```bash:コミット
docker commit -a "tukiyo3 <tukiyo3@gmail.com>" -m "add:repository, update:timezone, set:LANG=ja_JP.UTF-8" 785d656bdd42 tukiyo3/centos7qa-ja 

```

```bash:push
docker push tukiyo3/centos7qa-ja
```
jbuilder has_manyオブジェクトの属性の展開を制限する

jbuilderを利用して、has_manyをもつオブジェクトをjson化にする際に、単純にextractを行うと、全ての属性が展開されます。以下のようにすると、指定した属性のみを展開できます。

```rb
json.(@customer, :id, name)
json.scores(@customer.scores, :game_id, :score) 
```

上記は下記のようなjsonを生成します。json.scoresのメソッド名を
変更するとjsonの属性名も変わります。

```json
{
  "id":2,
  "name":"１２３４５６７８９０１２",
  "scores":
  [
    {
      "game_id":1,
      "score":256
    },
    {
      "game_id":2,
      "score":0
    }
  ]
}
```

```rb
class Customer < ActiveRecord::Base
  has_many :scores
end

class Score < ActiveRecord::Base
 belong_to :customer
end
```

----

こちらに色々なJbuilderでのJSON生成例をまとめてみました。http://qiita.com/hmu29/items/c4e365cc0a9d465731f8
php composer.phar update でエラーが出て実行できない

FuelPHPでローカルで開発していたものを本番に設置したら、

```
Composer is not installed. Please run "php composer.phar update" in the root to install Composer
```

と出たので、言われた通りに実行したけど、なんかエラーが出る

```
hoge@server:~$ php composer.phar update
????hoge@server~$ 
```

????ってなんぞ。。
`export LANG=en_US`とかもしてみたけど変化なく????。
はまったので公式を見た。

Composer - Troubleshooting
https://getcomposer.org/doc/articles/troubleshooting.md

ここに`curl -sS https://getcomposer.org/installer | php -- --check`というコマンドで動作環境のチェックができるようなので実行した。

```bash
hoge@server:~$ curl -sS https://getcomposer.org/installer | php -- --check
#!/usr/bin/env php
Some settings on your machine make Composer unable to work properly.
Make sure that you fix the issues listed below and run this script again:

The detect_unicode setting must be disabled.
Add the following to the end of your `php.ini`:
    detect_unicode = Off

The php.ini used by your command-line PHP is: /path/to/php.ini
If you can not modify the ini file, you can also run `php -d option=value` to modify ini values on the fly. You can use -d multiple times.
```

`detect_unicode = Off`の設定にしてないといけないみたい。
php.iniに`detect_unicode = Off`を追加する事でうまく動くようになりました。

PHP5.5の開発環境だと特に設定した事ないからPHP5.3だとやらないといけないのかな。

php.iniを触らなくてもこんな感じでも大丈夫でした

```
php -d detect_unicode=Off composer.phar self-update
php -d detect_unicode=Off composer.phar update
```

ところで`detect_unicode = Off`って何だろう。
公式にはこんな感じで書かれてた。将来廃止予定とか。

```
detect_unicode boolean
BOM (Byte Order Mark) を調べ、 ファイルが有効なマルチバイト文字を含むかどうかを確認します。 この検出は、 __halt_compiler() の処理より前に行われます。 Zend Multibyte モードでのみ利用可能です。

名前 : detect_unicode
デフォルト : "1"
変更可能 : PHP_INI_ALL
変更履歴 : PHP 5.1.0 以降で利用可能。この非推奨の機能は、きっと 将来 削除 されるでしょう。
```
boot2docker基本操作


# 準備

```bash:インストール
$ brew install boot2docker
```

```bash:更新
$ brew upgrade boot2docker
```

```bash:設定
$ boot2docker config > ~/.boot2docker/profile
$ vim ~/.boot2docker/profile
```

```bash:isoダウンロード
$ boot2docker init
```

# 接続

```bash:起動
$ boot2docker up
```

```bash:
$ boot2docker ssh
```

## dockerコマンド

```bash:メモ
$ docker ps -a
# 一番上が一番新しい
$ docker rm 0195287e3e89
# 不要なイメージは削除
$ docker start 7b35b32b8978
$ docker attach 7b35b32b8978
# Enterキー押すこと。
```

```bash:コンテナのコミット
$ docker commit 7b35b32b8978 centos7:01addrepo
$ docker images
```

# イメージ操作

```bash:imageをファイル化
$ docker save 146cfe916685 > centos-7-20140625-x86_64.tar
$ xz -z centos-7-20140625-x86_64.tar
```

# 削除

```bash:停止
$ boot2docker stop
```

```bash:削除
$ boot2docker delete
$ rm -rf ~/.boot2docker
```
Vagrant + VirtualBoxで仮想環境側のポートをあける

# 環境
ホストマシーン：mac 
ゲストOS：Linux

# やりたいこと
ホストマシーンから
ゲストOSのポート3000で動いているNode.jsアプリに
http://localhost:3000 でアクセスしたい。

# やること
## 1. Vagrantfileにネットワーク設定追記

`config.vm.network :private_network`でhostonlyネットワーク設定。
`config.vm.network :forwarded_port, host: 3000, guest: 3000`でホストマシーンの3000番ポートをゲストOSの3000番ポートへフォワードする

```
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "milk"
  config.vm.provider "virtualbox" do |vb|
    vb.customize [
      "modifyvm", :id,
      "--name", "milky_box",
      "--memory", "1024"
    ]
  end

  config.vm.hostname = "milky-vagrant"
  config.vm.network :private_network, ip: "192.168.33.10"
  config.vm.network :forwarded_port, host: 3000, guest: 3000
  config.vm.provision "shell", path: "setup.sh"
end

```

## 2. ゲストOSのポート解放設定
`sudo vi /etc/sysconfig/iptables`に
`-A INPUT -p tcp -m tcp --dport 3000 -j ACCEPT`追記

追記後`iptables`ファイルの中身

```
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3000 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
```

## 3. 確認
/etc/hostsファイルに `127.0.0.1 localhost` があるか確認し、
なければ追記。

ホストマシーンからhttp://localhost:3000 アクセス。
vimで連番の作成

# 追記
7.4.754で、`g<C-A>`が追加されたので簡単に連番が作成できます。

http://vim-jp.org/blog/2015/06/30/visual-ctrl-a-ctrl-x.html

# 概要
連続した数字を入れる方法です。

## 期待値
```
1
2
3
4
5
:                      
```

# 手順1
マクロを使用する方法です。

1. `i1<esc>` 数字を一つ入れて、
2. `qqyyp<c-a>q` マクロを開始
3. マクロ実行 ( コマンド `100@q`) 

# 手順2
スクリプトを使う方法です。
`:call setline(1,range(1,100))`

# 手順3
行が存在する場合は、置換で番号を挿入できます。
`:%s/^/\=line(".")`



# おまけ
前の数字を加算するスクリプトを作っておけば便利です。

```vim
function! g:set_num() "{{{
" ********************************************************************************
" 連番の作成
" カーソル以降の数字を、前の数字にひとつ加算したものにする ( マイナスは、考慮しない ) 
" ********************************************************************************
"
	" カーソル位置の取得
	let pos = getpos(".")
	let lnum = pos[1]
	let col  = pos[2] - 1

	"=====================
	" 前の行
	"=====================
	let lstr = getline(lnum-1)

	" 数字の取得
	let nums = split(lstr, '\D\+') + [1]

	"=====================
	" 現在の行
	"=====================
	let lstr  = getline(lnum)

	"================================================================================
	" 数字の末尾で分割
	"--------------------------------------------------------------------------------
	" 1 : aaa12(3)4aaaa  : () カーソル位置
	" 2 : aaa1234 , aaaa : カーソルより後ろの数字の末尾で分割
	" 3 : aaa     , aaa  : 数字の削除
	"================================================================================
	let col = match(lstr, '\d\D\|\d$', col) + 1

	" カーソル後に数字がある場合は処理する
	if col > 0
		" 数字の前の文字の取得
		let head = strpart(lstr, 0, col)

		" 数字の数を抽出
		let head_ncnt = len(split(head, '\D\+')) - 1

		" 文の取得
		" 変更する部分の数字は削除する
		let str = [
					\ substitute(head, '\d\+$','',''),
					\ get(nums, head_ncnt, 0) + 1,
					\ strpart(lstr, col ),
					\ ]

		" 書き込み
		call setline(lnum, join(str,''))

		" カーソル移動
		call cursor(lnum, len(str[0].str[1]))
	endif

endfunction
command! -narg=0 SetNum call g:set_num() 
nnoremap <C-s> 	 :<C-u>SetNum<CR>|"
"}}}
```
CakePHP でリストを HtmlHelper のみで作成する

微妙。

```php
echo $this->Html->nestedList ( 
  array (
    1 => array (
      1 => array (
        1 => array (
          1 => array (
            1 => array ( 1, 2  ),
            2 
          ),
          2 
        ),
        2 
      ),
      2 => array (
        2 => array (
          2 => array ( 2, 4 ),
          4 
        ),
        4 
      ) 
    ) 
  ) 
);

```

### 実行イメージ

```html
<ul>
  <li>1
    <ul>
      <li>1
        <ul>
          <li>1
            <ul>
              <li>1
                <ul>
                  <li>1</li>
                  <li>2</li>
                </ul>
              </li>
              <li>2</li>
            </ul>
          </li>
          <li>2</li>
        </ul>
      </li>
      <li>2<li>
    </ul>
  </li>
  <li>2
    <ul>
      <li>2
        <ul>
          <li>2</li>
          <li>4<li>
        </ul>
      </li>
      <li>4<li>
    </ul>
  <li>
</ul>
```
Java学習ノート_140705（Windows/Eclipse環境設定）

## インストール関連

* Eclipseでインストールしたプラグインなど
    * 日本語化はPleiadesの日本語パック（特にめんどくさいことなし）
    * vrapperでVim風のキーバインドができるように
        * $HOMEの場所がわからなかった（Win7はUser直下）
    * Eclipse Color Themeで暗めのテーマに
    * [Code Recommenders](http://download.eclipse.org/recommenders/updates/stable/)で補完機能を使用頻度順に

プラグインのインストールは「メニュー」→「ヘルプ」→「新規ソフトウェアのインストール」からプラグインをダウンロードするURLを入力する。

* Windowsの環境構築
    * Google IME
        * 全角スペースを半角スペースに
        * IMEのプロパティから、「一般」→「キー設定」→Eisuの項目のコマンドを「英数入力切替」に変更（これにしないと全角入力と半角入力（変換が必要）になり、プログラミングには不向きな感じ、Windowsなれないけどみんなこうやって変更してるんだろうか）

## 今後のTODO
* ADKのインストールをやっていなかったのでやる
* 学習日報のEXCELを自動化する

## 参考
http://matome.naver.jp/odai/2135281431483912301
http://qiita.com/yusukaaay/items/4ddc003d172497acba8b#
RailsとかJavaScriptとかのことをダラダラ書いただけ

一昨日の晩に、今絶賛勉強中のエンジニアの卵に聞かれたんですよ。
「なんかqiita見てるとRailsがどうのJSがうんたらってのがバズってるんですけど、どう思います？」
「あーその件ねー。僕はね…（以下酔ったおじさん特有の長い話）」
という事があった。

その時の話が残った状態で今朝qiita見てたら
http://qiita.com/hirokidaichi/items/5758609196291d1edd17
がすごくいい記事だなーと思って。

なんかそのへんの自分なりの見解とアプローチ。

# 目的が違う。

あくまで個人的な見解なのでカッカしちゃだめよ。

* （かつて）Railsが実現しようとしていたのは「それまで無かった程はやいプロトタイピングと顧客への価値提供」だと思う
* 今フロントエンドのJavaScriptで実現しようとしているのは「これまで以上に快適な操作性や高いUX」だと思う

つまり目的が違うのですよ。少し前はRailsで作るだけのUXがUXのMax到達点に近かったからそれで完了した。今は到達点が上がってしまったんです。その理由は下記のようなことが背景だと僕は認識しています。

* モバイル環境でネイティブアプリと張り合いたい為のSinglePageApplicationやそれっぽいUIが必要になった
* 通信環境が酷いモバイルでも快適に動くようにするために通信を極力絞る事が必要になった

PC環境だけ考えるのであれば好きなモノ使えば良いと思います。快適な通信環境とマシンパワーがあって、ユーザーもポチポチ画面遷移することに慣れているから十分ですよね。

# モバイルに最適な形はなんだろうか（模索中）

僕は昨年はほぼ毎日（今でも週の半分くらいは）node.jsを触りまくっていて本音は「JSONでのRestful中心でモノを組み立てるのが最高！」って思っています。モバイルWEBのフルスクラッチだったら通信は最初からJSONで組み立てるのが将来を考えても正しいのではないかと思っています（趣味か事業かでも変わるのですがこの文章読む人はそこにはきっと興味がないでしょう）。

そういう環境だと、Railsはやっぱりやりにくかったんですよ。欲しいのは

 * JSONを中心にしたデータのやり取り
 * ClientのMVCと相性の良い仕組み
 * URLを意識しないRPCっぽいデータ通信（SOAPみたいな？知っている人は知ってる）

そいでこんなのを作ってました。node.js側に作った~~コントローラクラス~~routesをパースして公開用のJSファイルを作ってくれるものです。Backbone.jsとの相性が良い（syncをオーバーライドしなくても動く）URLとJSONでの通信規約。あ、自分はpromise派なのでnode-promise入れています。
https://github.com/ms2sato/Restrant.js
（mongooseまで一本化してたみたい。最近触ってないので忘れたｗ。わけあって公開しませんでしたが、これを使って結構大きめな動くアプリを一本作っています。）

フロントエンド用にはネームスペースとかMVCに足らないオブザーバも下記で作っていたり（MVCはBackboneに浮気したので最終的には作りこんでいませぬが）
https://github.com/ms2sato/Limo.js

足りないものは作ったら良いと思います。RailsでそれっぽくやりたいならRubyでも作ればいいのではないかと（本当は言語を越えてライブラリを使いまわしたいけどね）。オレオレは無駄？うーん。そうかもしれないけど、今実現したいことに必要ならやったらいいんじゃないかなぁ。自己満足で無駄なコード量産するのは困るけど（困るのはそれが仕事という時間の中でやるからで、自分の時間でやるなら自己満足しまくれ派です）。

ちなみに僕はここまで作っておきながら、今年はRails4やっています（あれ？ｗ）。
「node.jsでやってると技術者の仲間がよう集まらん。」と思ったからなんですけどね。なんか今頃少しいい感じになってきているのかも？でも、Railsの開発もgemがこなれているので楽だし良いよなぁ。

# おしまいに

今不満があったら、あっさり諦めないで解消するアプローチを取ってもいいんじゃないかな。GoogleとかTwitterのWEBアプリも今はそんなに落ちない印象。個人的には結構快適に使えていた気がするんだけど、単純に僕の使い込みが甘いからなのかもしれない。無限スクロール的なのが大変というのはあるかもしれないけれどね。

最近セミナー講師の人に話を聞いたらJSの需要って高い感じになってきたらしい。若い人も「JS学びたいっす！」って人が多くなってきているみたいでちょっと嬉しい。JSは好きな言語でもあるのでもっと活躍して欲しいな。
git commit し忘れてない?

ファイルを書き替えたのにgit commitしてなくて`ｱｯｰ!`ってならないように。

```ps1
function git_status {
   git status 2> $null | ForEach-Object {
      if ( $_ -eq "# Changes not staged for commit:" ) {
         Write-Host "Please run 'git commit'" -ForegroundColor "Red"
      }
   }
}
```

プロファイルスクリプトの`prompt`ファンクション内で`git_status`を呼び出せばOk。

もう少しマイルドに警告してほしい場合は下記の様にしてもいいかも。
ウィンドウタイトルにアスタリスクを付けるだけの警告です。

```ps1
function git_status {
   git status 2> $null | ForEach-Object {
      if ( $_ -eq "# Changes not staged for commit:" ) {
         Write-Output "* "
      }
   }
}
```

`prompt`ファンクション内で

```ps1
$gitstatus = git_status
$windowtitle = (Get-Host).UI.RawUI.WindowTitle
(Get-Host).UI.RawUI.WindowTitle = $gitstatus + $windowtitle
```

通常のアプリケーションで内容を変更したときなんかと同じ風な警告ですね。
JSON 文字列を JUnit / hamcrest でアサーションしたいときは hamcrest-json を使うと捗る

ジャバで JUnit 使っていて、JSON 文字列の検証をしなきゃならなくなったときは [hamcrest-json](https://github.com/hertzsprung/hamcrest-json) を使うと捗るよ、という話。

## JUnit での JSON 文字列のアサーション

JSON はその定義上、オブジェクトのメンバの定義順序にあまり意味を持たせることはなくて、本来なら

```json
{
  "foo": "bar",
  "hoge": "fuga"
}
```

と

```json
{
  "hoge": "fuga",
  "foo": "bar"
}
```

は同一視してあげたいところなんだけど、以下のように JUnit / hamcrest で単純に文字列の比較をしてしまうと当然アサーションに失敗してしまうわけでして、これを解消するのがちょっと悩ましい。

```java
    @Test
    public void これではアサーションに失敗してしまう() {
        String expected = "{\"foo\": \"bar\", \"hoge\": \"piyo\"}";
        String actual = "{\"hoge\": \"piyo\", \"foo\": \"bar\"}";

        assertThat(
                actual,
                is(expected));
    }
```

「そんなの、Jackson とか使って JSON 文字列をいったん Map / List などの Java のオブジェクトにデシリアライズすりゃ片付くことでしょ？」ということをいう人もいるかもしれない。確かにそれもそうなのだが、ちょっと複雑な構造の JSON においてアサーションに失敗した場合、「いったいどこが間違っているのか？」を確認するのが面倒だったりする。

でもそんなときは、hamcrest-json を使えばだいたいすべて解決します☆


## hamcrest-json の使い方 (サンプルコード)

使い方を一つ一つ説明するのもアレなので、サンプルコードをご覧 or 実行してみてください。

```java
package biz.k11i.demo;

import org.junit.Test;

import static org.junit.Assert.assertThat;
import static uk.co.datumedge.hamcrest.json.SameJSONAs.sameJSONAs;

/**
 * hamcrest-json の利用デモ。
 * <p>Gradle をお使いの方なら、以下のように記述すれば OK</p>
 * <pre>
 * dependencies {
 *     testCompile group: 'junit', name: 'junit', version: '4.11'
 *     testCompile group: 'uk.co.datumedge', name: 'hamcrest-json', version: '0.2'
 * }
 * </pre>
 *
 * @author KOMIYA Atsushi
 */
public class HamcrestJsonDemo {
    @Test
    public void オブジェクト内のメンバの順序が異なっていても大丈夫() {
        String expected = "{\"foo\": \"bar\", \"hoge\": \"piyo\"}";
        String actual = "{\"hoge\": \"piyo\", \"foo\": \"bar\"}";

        assertThat(
                actual,
                sameJSONAs(expected));
    }

    @Test
    public void アサーションに失敗した場合はどこが異なるのかを明確にしてくれます() {
        String expected = "{\"fuga\": \"fugafuga\"}";
        String actual = "{\"hoge\": \"piyo\", \"foo\": \"bar\"}";

        assertThat(
                actual,
                sameJSONAs(expected));

        /*
         * 以下の出力が得られます。
         *
         * Expected: "{\"fuga\": \"fugafuga\"}"
         * but:
         * Expected: fuga
         *      but none found
         *  ;
         * Unexpected: foo
         *  ;
         * Unexpected: hoge
         */
    }

    @Test
    public void 余計なメンバが存在してもそれを許容する包容力も持ち合わせています() {
        String expected = "{\"hoge\": \"piyo\"}";
        String actual = "{\"hoge\": \"piyo\", \"foo\": \"bar\"}";

        // SameJSONAs#allowingExtraUnexpectedFields() を呼び出すと、余計なメンバを許容してくれます
        assertThat(
                actual,
                sameJSONAs(expected)
                        .allowingExtraUnexpectedFields());
    }

    @Test
    public void 配列の順序を無視して比較することもできます() {
        String expected = "[1, 1, 2, 3, 5, 8]";
        String actual = "[8, 5, 3, 2, 1, 1]";

        // SameJSONAs#allowingAnyArrayOrdering() を呼び出すと、配列の順序を無視してくれます
        assertThat(
                actual,
                sameJSONAs(expected)
                        .allowingAnyArrayOrdering());
    }
}
```

hamcrest-json、デキる子ですね！
#mozaicfm ep9 Socket.IO

## 追記

Guillermo の都合によりリスケになりました。
収録日は 7/21 です。

## Socket.IO at #mozaicfm

次回の [#mozaic.fm](http://mozaic.fm) では、待望の [Socket.IO@1.0](http://socket.io/blog/introducing-socket-io-1-0/) を無事リリースし、 7/4 に日本で実施した [Socket.IO MeetUp](http://connpass.com/event/6911/) のために来日した Socket.IO 作者 @rauchg こと Guillermo Rauch をゲストに迎え、 Socket.IO の歴史や、 1.0 の新機能、 Socket.IO の今後について議論できることになりました。

今回もここで Guille への質問を募集してみます。

## 質問募集

今回はフルで英語の予定なので、そもそも俺に質問を読んだりする余裕があるのか全く自信がありませんが、 Guillermo への質問を募集します。

- 質問は 1tweet でおさめてください。
- 締め切りは 7/6(日) 17:00 までです。
- 質問は日本語でも構いません
- 採用されるかは運次第というか、ベストエフォートです。

質問は、この Qiita のコメントにお願いします。

## Rough Note

- What is Socket.IO
    - motivation
    - when to start develop
    - why node.js
- Waht is Socket.IO@1.0
    - what is difference from ~0.9
    - what is new feature
        - engine.io
        - socket.io-emitter
        - Scalability with redis
        - binary support
        - CDN
- Where is Socket.IO going
    - socket.io@2.0 ?
    - with spdy/http2 ?
    - with webrtc ?
    - or any other plan
- Future of realtime web
    - :)
    - x(
- etc

## Links

- [Socket.IO](http://socket.io)
- [Introducing Socket.IO 1.0](http://socket.io/blog/introducing-socket-io-1-0/)
- [Farewell Node.js](https://medium.com/code-adventures/farewell-node-js-4ba9e7f3e52b) (TJ が Node.js をやめて Go にいく宣言をした記事)
- [東京Node学園祭2012](http://nodefest.jp/2012/) (Guille の最初の来日)
- [Socket.IO Meetup](http://connpass.com/event/6911/) (Socket.IO\@1.0 を記念して Guille 二回目の来日)
- [socket.io-emitter](https://github.com/automattic/socket.io-emitter) (socket.io のメッセージングに外から redis 経由でメッセージを送るインタフェース)
- [MQTT](mqtt.org) (最近話題の軽量プロトコル、 socket.io-emitter に良いのではという話)
- [東京Node学園祭2014](http://nodefest.jp/2014/)(今年の東京Node学園祭にも再来日予定です)
tenshiでログ監視

## インストール

```bash:
apt install tenshi

# sshのログを監視してみる
cd /etc/tenshi/includes-active/
ls ../includes-available/
ln -s  ../includes-available/ssh .

/etc/init.d/tenshi restart
```


## 書き方

1. 監視したいログ
2. filter名と、時刻、宛先を設定。即時送ってもらいたい場合は[now]と記述。
3. ログ中の監視したい文字列を記述。

```diff:/etc/tenshi/tenshi.conf
+ set logfile /var/log/mail.log
+ set logfile /var/log/monit.log

+ set queue custom   tenshi@localhost root@localhost [55 * * * *]
+ custom ^(?:sudo|su|sshd):
+ custom .*
```

```bash:動作テスト
$ sudo -u tenshi /usr/sbin/tenshi -f -d 2 -c /etc/tenshi/tenshi.conf
```

## テキスト監視だけしたいtenshi.conf

```bash:tenshi.conf
set uid tenshi
set gid tenshi

set pidfile /var/lib/tenshi/tenshi.pid
set logfile /var/log/kininaru.log

set tail_multiple off

set sleep 5
set limit 800
set pager_limit 2
set mask ___
set mailserver localhost
set subject tenshi report
set hidepid on

set queue misc from@localhost to@localhost [*/10 * * * *]

misc .*
```

* /var/log/kininaru.log を10分おきに監視し、追記されたら to@localhost にメール送信してくれる

----

## 特定のメールが送られた場合の監視

```bash:
critical ^postfix/smtp:.*spam
critical ^postfix/smtp:.*user1@localhost.localdomain
```


----

## RPMパッケージの作成

* 参考: [いまさら聞けないrpmbuildことはじめ - hack in 3 minutes](https://blog.tnmt.info/2011/04/29/rpmbuild-for-beginner/)

```
yum groupinstall "Development Tools" rpm-build
```

```
cd
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
curl --insecure -O https://dev.inversepath.com/download/tenshi/tenshi-0.15.tar.gz
tar xzf tenshi-0.15.tar.gz 
mv tenshi-0.15.tar.gz /usr/src/redhat/SOURCES/
cd tenshi-0.15
rpmbuild -bb tenshi.redhat-spec
```

* /usr/src/redhat/RPMS/i386/tenshi-0.15-1.i386.rpm
* /usr/src/redhat/RPMS/x86_64/tenshi-0.15-1.x86_64.rpm が生成される

### もしくは

* [Sig-I/O Automatisering](https://sig-io.nl/)で配布してくれているのでありがたく使わせていただく。
    * http://centos6.sigio.nl/x86_64/


## systemd

```ruby:/usr/lib/systemd/system/tenshi.service
[Unit]
Description=real-time log monitor

[Service]
ExecStart=/opt/tenshi/usr/sbin/tenshi -c /etc/tenshi/tenshi.conf -f
ExecReload=/usr/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target
```
CakePHP でテーブルを HtmlHelper のみで作成する　(ページングつき）

```php
$tableBody = "";

$headers = array (
		$this->Paginator->sort ( 'id' ),
		$this->Paginator->sort ( 'account' ),
		$this->Paginator->sort ( 'mail' ),
		"Pass",
		$this->Paginator->sort ( 'created' ),
		$this->Paginator->sort ( 'modified' ) 
);

$tableBody .= $this->HTML->tableHeaders ( $headers );

$bodys = array ();
foreach ( $users as $user ) :
	$anchor = array (
			'action' => 'view',
			$user ['User'] ["id"] 
	);
	$body = array (
			$user ['User'] ["id"],
			$this->Html->link ( $user ['User'] ["account"], $anchor ),
			$user ['User'] ["mail"],
			$user ['User'] ["pass"],
			$user ['User'] ["created"],
			$user ['User'] ["modified"] 
	);
	array_push ( $bodys, $body );
endforeach
;
$tableBody .= $this->HTML->tableCells ( $bodys );
unset ( $users );

echo $this->HTML->tag ( "table", $tableBody );
echo $this->Paginator->numbers ( array (
		'first' => 10,
		'last' => 10 
) );
```

## テーブル系画面だと同一の処理を書かないといけないから  Helper化

```php:TableHelper.php
<?php
class TableHelper extends AppHelper {
	var $helpers = array (
			'Html',
			"Paginator" 
	);
	public function createTable($names = array(), $dates = array(), $key = null, $anchors = array(), $sort = array()) {
		$tmpHeader = array ();
		foreach ( $names as $name ) :
			if (isset ( $sort [$name] ) && $sort [$name] == true) {
				array_push ( $tmpHeader, $this->Paginator->sort ( $name ) );
			} else {
				array_push ( $tmpHeader, $name );
			}
		endforeach
		;
		
		$header = $this->Html->tableHeaders ( $tmpHeader );
		$bodys = "";
		foreach ( $dates as $date ) :
			$row = array ();
			foreach ( $names as $name ) :
				if (isset ( $anchors [$name] )) {
					if (isset ( $anchors [$name] ['action'] ) && $anchors [$name] ['value'] == 'id') {
						array_push ( $row, $this->Html->link ( $date [$key] [$name], array (
								"action" => $anchors [$name] ['action'],
								$date [$key] ["id"] 
						) ) );
					} else {
						array_push ( $row, $date [$key] [$name] );
					}
				} else {
					array_push ( $row, $date [$key] [$name] );
				}
			endforeach
			;
			$bodys .= $this->Html->tableCells ( $row );
		endforeach
		;
		return $this->Html->tag ( "table", $header . $bodys );
	}
}
```

```php:view
echo $this->Table->createTable ( array (
		"id",
		"account",
		"mail",
		"pass",
		"created",
		"modified" 
), $users, "User", array (
		account => array (
				"action" => "view",
				"value" => "id" 
		) 
), array (
		"id" => true,
		"account" => true,
		"mail" => true,
		"pass" => false,
		"created" => true,
		"modified" => true 
) );