OmniAICreator/Qiita-1.07M huggingface dataset:
C言語の基礎 (構造体-2) NO.12 備忘録

構造体のデータを他の関数でやり取りをする場合に、構造体のポインタを使用することがある。

#データを設定して構造体を関数に渡す。
```c++:test.cpp

// 構造体データの宣言
typedef struct {
  
  int iId;
  
  char *szName;
  
  int iAge;
  
} STNameAge;

// 関数のプロトタイプ宣言
void logStruct(STNameAge stNameAge);

int main()
{
  // 構造体変数の宣言  
  STNameAge stNameAge1;
  
  stNameAge1.iId = 1;
  stNameAge1.iAge = 10;
  stNameAge1.szName = (char*)"takurou";

  //　構造体を直接渡す
  this->logStruct(stNameAge1);
}

void initScene::logStruct(STNameAge stNameAge)
{
  CCLOG("%d",stNameAge.iId);
  CCLOG("%d",stNameAge.iAge);
  CCLOG("%s",stNameAge.szName);
}
```
実行結果
cocos2d: 1
cocos2d: 10
cocos2d: takurou

この時関数に渡されるのは、***元の構造体全体をコピーしたデータ***が渡される。


#データを設定して構造体を関数に渡す。(ポインタ使用)
```c++:test.cpp

// 構造体データの宣言
typedef struct {
  
  int iId;
  
  char *szName;
  
  int iAge;
  
} STNameAge;

// 関数のプロトタイプ宣言
void logStruct(STNameAge *stNameAge);

void initScene::logStruct(STNameAge stNameAge)
{
  // 構造体変数の宣言
  STNameAge stNameAge1;
  
  stNameAge1.iId = 1;
  stNameAge1.iAge = 10;
  stNameAge1.szName = (char*)"takurou";

  //　構造体のポインタを渡す
  this->logStruct(&stNameAge1);
}

void initScene::logStruct(STNameAge *stNameAge)
{
  CCLOG("%d",stNameAge->iId);
  CCLOG("%d",stNameAge->iAge);
  CCLOG("%s",stNameAge->szName);
}
```
実行結果
cocos2d: 1
cocos2d: 10
cocos2d: takurou

構造体自体のデータを渡すのではなく、***構造体のポインタのアドレスデータ***を渡している。

***・構造体のポインタから各項目の変数を作るには、構造体のポインタ変数名と各項目名をアロー演算子で連結する必要がある。***

#構造体の配列を関数に渡す

```c++:test.cpp

// 構造体データの宣言
typedef struct {
  
  int iId;
  
  char *szName;
  
  int iAge;
  
} STNameAge;

// 関数のプロトタイプ宣言
void logStruct(STNameAge *stNameAge , int iSize);

void initScene::logStruct(STNameAge *stNameAge)
{
  // 構造体変数の宣言
  STNameAge stNameAge[2];
  
  
  stNameAge[0].iId = 1;
  stNameAge[0].iAge = 10;
  stNameAge[0].szName = (char*)"takurou";
  
  
  stNameAge[1].iId = 2;
  stNameAge[1].iAge = 20;
  stNameAge[1].szName = (char*)"kanako";

  // 構造体のポインタと配列のサイズを渡す
  logStruct(stNameAge, sizeof(stNameAge) / sizeof(STNameAge));
}

void initScene::logStruct(STNameAge *stNameAge , int iSize)
{
  for ( int i = 0;i <iSize; i++ )
  {
    CCLOG("%d",(stNameAge + i)->iId);
    CCLOG("%d",(stNameAge + i)->iAge);
    CCLOG("%s",(stNameAge + i)->szName);
  }
}
```
実行結果
cocos2d: 1
cocos2d: 10
cocos2d: takurou
cocos2d: 2
cocos2d: 20
cocos2d: kanako

構造体のポインタに対しては、アロー演算子という特別な演算子を使用する。
Nagoya.R #13に参加してきた


LTから参加してきました。前回に引き続き２回めです。

# 1. rlistパッケージのススメ

Tamura(@tam07pb915)さん


## rlist パッケージとは
* リスト形式のデータで作業する際に便利なパッケージ。
* 作業範囲は抽出・欠損値処理・整形・並び替えが対象。

## リスト形式とは何か
* リスト形式 : 再帰的なデータ構造を持つもの
* Jsonフォーマット、YAMLフォーマットはこれ
* rlist+Json+YAMLでJSONフォーマットのデータが扱える

## 補足
* 依存パッケージはlibrary("rlist")で導入可能
* rlist tutorialを見ると結構詳細に書かれている

## pipeR
* pipeRを使うとパイプライン演算子(`%>>%`)が利用できる


# 2. applyを使おう

## applyはなにか
* map関数的な動作をする
* `apply(data, 2, mean)` とするとdataの列で平均をとった配列が表示される


## データ形式の指定
* 第二引数の値を変えると、第三引数に受け渡すデータの形式を指定できる
- 1 : 行
- 2 : 列
- 1:2 : 行列要素
- 3 : 3次元配列

## 実行速度
* 適当に書いたforループよりは早くなる
* 最適化をかけてコンパイルまでするとforループに利点が出てくる


# 3. メタ分析の工程を自動化するRスクリプトの作成

## メタ分析とは
* 略

## モデルの種類
* 固定効果モデル : 母集団における真の効果料は固定された値と仮定(あまり使われない)
* 変量効果モデル(ランダム効果モデル) : もともと真の効果料もばらつきがあると仮定
* 混合効果モデル : 固定された値になるもの、ならないものがあると仮定


## 好評バイアスの検定
* trim-and-fill method

## 自動化
* 独立変数、調整変数を変更するたびにスクリプトを書くのは辛い
* 外部ファイルにパラメーターを追い出して自動化
	- この作業地味に辛い、ファイルへの入出力を定義しなきゃいけないし

## tips
* 画像を生成するスクリプトを作成する場合、devoffをループの最後に書いておくと良い
  - ファイルがRにより開かれたままになってしまい、消せなくなってしまうため

# 4. 分類器とその応用

## タイタニック号の乗客の生死判定問題
* 出典 : kaggle
* 名前、等級、性別、年齢、生死から判定

## 分類器
* 学習用データを用意し、様々な手法(ロジスティック回帰、SVM、ニューラルネットワークなど)で二値分類
* 結果、ロジスティック回帰が健闘する結果に
* 学習時のチューニングで結果は改善できる可能性あり

## 疑問
* ニューラルネットワークの「結果」が一定しないということだったけれど、中間層はともかく結果はあんまりブレなかった印象がある


# 今後取り組みたいこと

* Pythonで統計やりたい
* Rっていうよりも、どんな問題に取り組んだのかっていう統計っぽい話をもっと聞きたいなあ
RでAPIデータを扱うときはrlistを使うとストレスフリー

こんな話があって、[Yahoo提供の電力使用状況APIで遊ぶ - Qiita](http://qiita.com/Gen6/items/1d17d0af1cf7dfb3abbd)、[こんな記事](http://rpubs.com/uri-sy/yahoo_latest_power_usage_api)を書いた。のだけども、リストの操作に慣れていないせいもあってかなんか汚い。

というわけでR上でのリストオブジェクトの扱いをよしなにしてくれる[`rlist`](http://cran.r-project.org/web/packages/rlist/index.html)パッケージに触れてみた。

**結論: `rlist`べんり・しゅごい。**
  
`rlist`、いろいろ関数あって複雑だけど、基本的なところだけでも抑えておけば神に近づける気がする
  
というわけで上記のrpubs記事と同じことを`rlist`を使ってやってみる。

```r
# 使用するパッケージ
library("rlist")
library("dplyr")
```

```r
api.key <- APIキー
area <- c("hokkaido", "tohoku", "tokyo", "chubu", "kansai", "kyushu")

url <- paste("http://setsuden.yahooapis.jp/v1/Setsuden/latestPowerUsage?appid=", api.key, "&area=%s&output=json", sep = "") %>%
  sprintf(area) %>% 
  list.load("json") %>% 
  list.ungroup() # このへんがみそ
```

```r
str(url) # ↓値は省略する
# List of 6
# $ ElectricPowerUsage:List of 5
# ..$ Area    : chr "hokkaido"
# ...
# $ ElectricPowerUsage:List of 5
# ..$ Area    : chr "tohoku"
# ... 以下略
```

`rlist`にある関数ではAPIにあるパラメータ名を直接扱えるのでストレスが軽減する。パラメータ名を知りたいときは

```r
list.names(url$ElectricPowerUsage)
# [1] "Area"     "Usage"    "Capacity" "Date"     "Hour"    
```

要素を確認

```r
list.table(url, Area)
# Area
# chubu hokkaido   kansai   kyushu   tohoku    tokyo 
# 1        1        1        1        1        1
```

各電力会社のデータはurl[[i]]に格納されており、次はこのリストから`list.mapv`関数を使って値を取り出す。~~例によって、数値が文字列になっているので`transform`関数で型変換~~。data.frame関数で結合し、使用量 / 供給量の割合の`usage.pct`という列を新たに追加して、`res`というデータフレームを作成。

```r
data.frame(area,
      usage    = list.mapv(url, Usage$`$`, use.names = FALSE), 
      capacity = list.mapv(url, Capacity$`$`, use.names = FALSE)) %>% 
  dplyr::mutate(usage.pct = usage / capacity * 100) -> res
```

可視化はrpubsと同じなので省略。水準を入れ替えたいときは`res$area <- area %>% factor(area)`を忘れずに。

## 参考

* [Introduction | rlist Tutorial](http://renkun.me/rlist-tutorial/)
* [r - How to convert a data frame column to numeric type? - Stack Overflow](http://stackoverflow.com/questions/2288485/how-to-convert-a-data-frame-column-to-numeric-type)
ラムダ式考察

#ラムダ式とは
C++のラムダ式は、最小の関数オブジェクトを作るシンタックスシュガーです。

#キャプチャ
キャプチャとは、ラムダ式の外の変数などをラムダ式の中で使えるようにすることです。
具体的には、メンバ変数として持たせることになります。
以下はコピーキャプチャの例ですが、参照キャプチャも大差はありません。
ただし、コピーキャプチャは内部にコピーを持つので、大きな構造体なんかをコピーキャプチャで持つとsizeof( lambda )が膨れ上がります。当然ですが、キャプチャする際にコピーが行われますので、コピーが重たいオブジェクトをコピーキャプチャするのはおすすめできません。
注意するところは、ラムダ式のoperator()はconst修飾されていますので、コピーキャプチャの場合const修飾されていないメンバ関数を呼び出すことができません。
ラムダ式のconst修飾を外すには、mutableを使います。`[]() mutable ->void {};`

```cpp
[s]{ s.memfun(); };

class _Lambda
{
public:
  _Lambda( const something& s ) : s( s ) {}
  void operator()() const { s.memfun(); }
private:
  something s;
};
_Lambda lambda( s );
```

##ムーブキャプチャ
C++14から、キャプチャに初期化子と別名を与えることができるようになりました。

```cpp

[ vvlln = very_very_long_long_name ]{ vvlln.dosomething(); };
[ N_plus_1 = n + 1 ] { std::cout << N_plus_1 << std::endl; };
```

これにより、C++11ではできなかったムーブキャプチャができるようになりました。
`[ something = std::move( something ) ] { something.dosomething(); };`

#ラムダ式の型
ラムダ式の型はコンパイラが独自に生成する一意の型というかたちになっています。
ラムダ式の型はdecltypeなどで取得することはできないので、テンプレートクラスにラムダ式の型を与えたい場合などは、テンプレート関数で推論してあげるのみとなります。しかし、テンプレートメタプログラミングにラムダ式の型を使うことはできません。
また、ラムダ式はコピー、ムーブ以外のコンストラクタが基本的にdeleteされている(operator= はコピー/ムーブも含めて削除されている)ので、継承してもインスタンス化することはできません。

```cpp

template < class _Base >
struct test0 : public _Base
{
};

template < class Ty >
test0 < Ty > test1( const Ty & )
{
  return test0 < Ty >();  // test0() is implicitly deleted!
}

int main( int arg, char** argv )
{
  auto _Test = test1( [] { std::cout << "abc" << std::endl; } );
  _Test();
}
```

#ジェネリックラムダ
// 以降、5/9に追記と修正を加えました。

C++14から、ラムダ式は引数にautoを受けることができるようになりました。
`auto lambda0 = []( auto a, auto b ) { return a + b; };`

このジェネリックラムダはメンバ関数テンプレートによって実現されます。
上のラムダ式では、コンパイラは以下のようなクラスを生成するでしょう。

```cpp

class _Lambda0
{
public:
  template< class Ty1, class Ty2 >
  auto operator()( Ty1 a, Ty2 b ) const { return a + b; }
};
_Lambda0 lambda0;
```

戻り値は`auto`です。`decltype(auto)`とは異なることに注意してください。

```cpp

auto lambda1 = []( auto& a ) { return a; }
auto lambda2 = []( auto& a ) -> decltype( auto ) { return ( a ); }
lambda1( value ) = 12; // oops, lvalue required
lambda2( value ) = 13; // OK, the return type is int&
```

また、ジェネリックラムダはテンプレートによって実現されるので、当然可変長テンプレート引数を受けることもできます。とても便利ですね。

```cpp

auto lambda3 =
  []( auto func, auto&&... args ) -> decltype( auto )
  {
    return func( std::forward < decltype( args ) >( args )... );
  };
```

真面目に書くと大変です。なお、mutableはsth.dosomethingがconst修飾されていなくても呼べるようにつけています。

予定していたよりもだらだらと追記をしてしまいました。
ジェネリックラムダの詳細をかき足した形になります。

# ラムダ式の戻り値の型
// 以降は10/25に追記した内容です。
ラムダ式の戻り値は明示しない限りautoになります（通常の関数にautoを指定できないC++11でも同様です）。

間違いなど気づいた点がございましたらコメントをください。
C言語の基礎 (構造体) NO.11 備忘録


構造体はいろいろなデータ型を1つにまとめる。

構造体はstructというキーワードを使って宣言する。


```c++:test.cpp
  struct nameAge {
    
    int id;
    char *szName;
    int iAge;
    
  };
```
この構造体を利用するには、
` struct nameAge stNameAge;`
という用に変数定義を行う。

struct nameAge : データ型
stNameAge      : 構造体の変数

構造体の変数に値を設定してみる。

```c++:test.cpp
  struct nameAge stNameAge;
  
  stNameAge.id = 1;
  
  stNameAge.szName = (char*)"ishiguro";
  
  stNameAge.iAge = 45;
```

構造体の定義と初期化を同時に行うには以下
`struct nameAge stNameAge = {1, (char*)"ichiguro", 45};`

#構造体の宣言の実用的な書き方

構造体の名前は、「struct 構造体名」という2つの単語が必要
↓
**typdef**というキーワードを使い、既存のデータ型に新たに名前を名前をつける。

```c++:test.cpp
 typedef struct nameAge STNameAge;
 STNameAge stNameAge = {1, (char*)"i¥takuro", 10};
```

さらに、構造体を宣言してからtypedefで名前をつけるという手順を1度に書く書き方もできる。

```c++:test.cpp
typedef struct
{
  int id;
  char *name;
  int age;
}STNameAge;

 STNameAge name = {1,(char*)"ert", 10};

```

#構造体の代入

```c++:test.cpp

// 構造体データの宣言
typedef struct {
  
  int iId;
  
  char *szName;
  
  int iAge;
  
} STNameAge;


  // 構造体変数の宣言
  STNameAge stNameAge1;
  STNameAge stNameAge2;
  
  stNameAge1.iId = 1;
  stNameAge1.iAge = 10;
  stNameAge1.szName = (char*)"takurou";
  
  
  stNameAge2.iId = 2;
  stNameAge2.iAge = 20;
  stNameAge2.szName = (char*)"kanako";
  
  CCLOG("%d",stNameAge2.iId);
  CCLOG("%d",stNameAge2.iAge);
  CCLOG("%s",stNameAge2.szName);
  
  stNameAge2 = stNameAge1;
  
  CCLOG("%d",stNameAge2.iId);
  CCLOG("%d",stNameAge2.iAge);
  CCLOG("%s",stNameAge2.szName);

```
実行結果
cocos2d: 2
cocos2d: 20
cocos2d: kanako
cocos2d: 1
cocos2d: 10
cocos2d: takurou


構造体どうしの演算処理はできないが、代入はできる。
CentOS 7.1.1503ではnmcliでIPアドレスを固定する方法が変更された

CentOS 7.0.1406 (NetworkManager 0.9.9.1)ではnmcliを使ってNICに固定IPアドレスを設定するには次のようなコマンドを実行した。

```
# nmcli connection modify enp0s8 ipv4.method manual ipv4.addresses "10.0.2.250/24 10.0.2.1" ipv4.dns 8.8.8.8
```

この後、「systemctl restart network.service」などで反映される。

しかし、CentOS 7.1.1503 (NetworkManager 1.0.0)では同じnmcliコマンドを実行するとエラーになる。

```
# nmcli connection modify enp0s8 ipv4.method manual ipv4.addresses "10.0.2.250/24 10.0.2.1" ipv4.dns 8.8.8.8

Error: failed to modify ipv4.addresses: invalid prefix '24 10.0.2.1'; <1-32> allowed.
```

結局のところ、従来なかった「ipv4.gateway」プロパティが増えているので以下のようにすればよい。

```
# nmcli connection modify enp0s8 ipv4.method manual ipv4.addresses 10.0.2.250/24 ipv4.gateway 10.0.2.1 ipv4.dns 8.8.8.8
```

まあ、この指定の仕方のほうがすっきりしてると思うけどね。
RealmのマイグレーションはUIthreadで実行しないといけないらしい

Realmのマイグレーションを以下のように別スレッドで実行したところエラーが出てクラッシュした。

```java:StartActivity.java
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);

    //-- 中略 --

    //DBのupdate
    new Thread(mCheckAndUpdate).start();
}

Runnable mCheckAndUpdate = new Runnable() {
    @Override
    public void run() {
        //初回起動時の色々update処理
        //...

        //Migration check
        //filecheck
        File filesDir = getFilesDir();
        for(String file : filesDir.list()){
            if(file.equals(REALM_DBNAME)){
                //RealmのDBが会った場合はMigrationを実行
                Realm.migrateRealmAtPath(getFilesDir() + "/"+ REALM_DBNAME,new MigrationManager());
                    
                });

            }
        }

        //終わったらハンドラーでメッセージを送り画面遷移
        mCheckHandler.sendMessage(mCheckHandler.obtainMessage(0, StartActivity.this));
    }
};

```

メッセージ
> IllegalStateException: cannot set auto-refresh in a thread without a looper

で、ソースコードを追っていったところ、メッセージにもあるようにlooperがないスレッドではmigrateRealmAtPathから呼んでいるsetAutoRefresh()というメソッドがexceptionをthrowするらしい。
なので、looperがあるUIthreadで処理を実行したら、うまく動いた。

```java:StartActivity.java
Runnable mCheckAndUpdate = new Runnable() {
    @Override
    public void run() {
        //初回起動時の色々update処理
        //...

        //Migration check
        //filecheck
        File filesDir = getFilesDir();
        for(String file : filesDir.list()){
            if(file.equals(REALM_DBNAME)){
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Realm.migrateRealmAtPath(getFilesDir() + "/"+ REALM_DBNAME,new MigrationManager());
                    }
                });

            }
        }

        //終わったらハンドラーでメッセージを送り画面遷移
        mCheckHandler.sendMessage(mCheckHandler.obtainMessage(0, StartActivity.this));
    }
};
```

ただ、このやり方だとUIスレッドをめっちゃブロックするので、大きく構成変えるとかする場合は何か他の方法考えないと行けない気がする。
HomeBrewとAtomの設定をサポートするItamaeのプラグインをリリースしました


## RubyGems
- https://rubygems.org/gems/itamae-plugin-recipe-homebrew
- https://rubygems.org/gems/itamae-plugin-recipe-atom



## プラグインの概要
### itamae-plugin-recipe-homebrew
##### 以下のbrewコマンドをサポートします
- `brew update`
- `brew upgrade`
- `brew tap XXXXX`
- `brew install XXXXX`
- `brew cask install XXXXX`

### itamae-plugin-recipe-atom
##### 以下のapmコマンドをサポートします
- `apm install XXXXX`

##### また以下の設定ファイルの差し替えをサポートします
- `~/.atom/config.cson`
- `~/.atom/keymap.cson`
- `~/.atom/snippets.cson`
- `~/.atom/styles.less`

それぞれのオリジナルのファイルは`.bk`という接尾辞付きでバックアップされます。



## 使い方
GitHubのREADMEをご参照ください

- https://github.com/fukuiretu/itamae-plugin-recipe-homebrew/blob/master/README.md
- https://github.com/fukuiretu/itamae-plugin-recipe-atom/blob/master/README.md	



## その他
- 私個人で利用しているItamaeの設定が[コチラ](https://github.com/fukuiretu/setup)になります。ご参考までに。
- 何かご意見・ご要望がございましたら`issue` or `PR`をお願いします:bow:
playbook制作用(Ansible)

AnsibleのPlaybookを書くときコピペ用（自分用）
使うたび変更

```yml:書き出しの部分
---
- hosts: 
  vars:
    - hoge: ""
```

>varsの値を拾うときは{{hoge}}

```yum:yumアップデート
tasks：
  - name: yum update
    yum : name=* state=latest 
```

```yum:yumインストール
 tasks:
    - name: install mysql packages
      yum: name={{item}} state=latest
      with_items:
          -
```

```yum:Service-start
 - name: service running and enabled
      service: name={{item}} state=running enabled=yes
      with_items:
          -
```

serviceモジュールのstateが取る値
>started
>stopped
>restarted
>reloaded



```copy:ローカルのファイルをリモートにコピー
- name: Copy
  copy: src=<local> dest=/ mode=<permission>
  sudo: yes
```

```copy:リモートマシンからローカルへコピー
- name: Copy
  fetch: src=/ dest=<local> mode=<permission>
  sudo: yes
```

```get:urlからDL
- name: download
　get_url: url= dest=./
```

```shell:通常コマンドの実行
- name: use　***
  shell: <command>  
```

---

```sample:yumでインストールしてファイルを落とし解凍

---

- hosts: ec2
  sudo: yes
  vars:
    - hoge: "http****"
    - fuga: "****.tar"

  tasks:
   - name: yum_update
     yum: name=* state=latest
   - name: install_mysql_packages
     yum: name={{item}} state=latest
     with_items:
        - mysql-server
        - sqlite
        - http
   - name: get_s3
     get_url: url={{hoge}} dest=./
   - name: untar
     shell: tar -xf {{fuga}}
```


---

http://qiita.com/moriteru@github/items/45d69a5744d658ce5c6e
http://www.kyoshida.jp/ansibledoc-ja/modules_by_category.html
Git で変更を patch ファイルにする / patch コマンドで適用する

Git で表示される差分を、patch ファイルにすることができる。
これを使うと、patch ファイルとして後で適用したり、他 PC で差分だけ適用したりできるので便利。

# patch ファイルの作り方

以下、コミット前の修正をパッチファイル化したい時の例。

```shell-session
$ git diff > diff.patch
```

そうすると、以下の様なファイルが作成される。

```shell-session
$ cat diff.patch                                                                                                                                                                         (git)-[master] -
diff --git a/test.txt b/test.txt
index d00491f..1191247 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1,2 @@
 1
+2
```

ちなみに、以下のような差分指定もできる。

```shell-session
$ git diff HEAD~1 > head_diff.patch
```

## `--no-prefix` オプションについて
`git diff` の `--no-prefix` は不要である点、コメントで教えて頂きました。
ご指摘ありがとうございます。
http://qiita.com/sea_mountain/items/7d9c812e68a26bd1a292#comment-c0515c9335128da21656

# patch ファイルの使い方
上記で作成した patch ファイルは以下のコマンドで適用できる。

```shell-session
$ patch -p1 < diff.patch
```
上記の例は patch を作成した時の階層と同じ階層で適用する場合。

## ```-p``` オプションとは
```-p``` オプションは、パッチを適用するディレクトリのことを示している。
```git diff``` コマンドで作成した patch ファイルだと、diff で表示される、変更ファイルのパスが、リポジトリ直下になる。
そのため、同じ階層にいる状態で patch を適用するときは ```-p0``` オプションを使えば良い。

### ```-p``` オプション使用例
```man patch``` に書かれている ```-p``` の使用例が大変わかり易いので、以下翻訳しつつ引用する。

```
-p数字  または  --strip=数字 オプションで使用する
別ディレクトリに存在するファイルにパッチを当てたいときに有効である。

以下の様なファイルの場合

/u/howard/src/blurfl/blurfl.c

-p0 パス指定を変更しない
/u/howard/src/blurfl/blurfl.c

-p1 スラッシュが1つなくなった状態になる
u/howard/src/blurfl/blurfl.c

-p4 パス名 + スラッシュのセットが4つ分無くなる。("/" + "u/" + "howard/" + "src/" この4セット)
blurfl/blurfl.c

-p オプションを指定しない場合の挙動は、blurfl.c となる。
```

# 参考サイト
[普通のpatchコマンドで取り込めるdiffファイルをgitで作成する](http://d.hatena.ne.jp/kanonji/20110222/1298341934)
[patch -p0 コマンドで適用できるパッチを作成する](http://transitive.info/article/git/command/diff/)
[IBM Knowledge Center コマンド・リファレンス 第 4 巻 patch コマンド](http://www-01.ibm.com/support/knowledgecenter/ssw_aix_53/com.ibm.aix.cmds/doc/aixcmds4/patch.htm?cp=ssw_aix_53%2F1-2-0-15-10&lang=ja)
Google Map APIで読み込んだ地図のボタンの表示がおかしくなる


## 発生するケース

画像をFluid Image（レスポンシブ）にするために

```css
img{
	max-width: 100%;
	height: auto;
}
```

を指定してると発生。

![スクリーンショット 2015-04-04 14.52.54.png](https://qiita-image-store.s3.amazonaws.com/0/37716/a7c67640-25ed-cf57-ebf5-d6ee144dc489.png "スクリーンショット 2015-04-04 14.52.54.png")



## 解決法

Google Map内の画像はFluid Imageにしない。

```css
#googleMap img{
	max-width: none;
}
```

※`#googleMap`はGoogle Mapを表示させているID


![スクリーンショット 2015-04-04 14.56.25.png](https://qiita-image-store.s3.amazonaws.com/0/37716/0e16b8b7-ccc5-5bef-2374-fbefda8d2174.png "スクリーンショット 2015-04-04 14.56.25.png")
PHPでBOMを削除

GooglePlayのランキングを取得できるこのAPI。

```php
http://doroidpanic.com/ws/googleplay-ranking-api/ranking/0
```

取得してみると、

```php
$feed = file_get_contents('http://doroidpanic.com/ws/googleplay-ranking-api/ranking/0');
$appList = json_decode($feed, true);
var_dump($appList); // null
```

ん！？null！？実際にブラウザで確認してみるときちんと取得できている。

これが発端で色々調べたのですが、どうやらリターンされるjsonがUTF-8の"BOMあり"で書かれており、うまくデコードできなかったようです。
んでこのBOMなのですが、`Byte Order Mark`という正式名称らしく、要するにデータの先頭にくっつくマーク。バイナリデータでみてみると「EF BB BF」という文字が先頭についています。

これは「これはUTF-8だよ！」ということを表しているみたいです。つまりUTF-8にも、「UTF-8（BOMなし）」「UTF-8（BOMあり）」の2パターンがあるみたいですね。略記としてBOMなしのほうは「UTF-8N」と書かれるみたいです。Nothing、ですかね。

さて、ということでこのBOMを取り除いてやれば一件落着です。

```php
$feed = file_get_contents('http://doroidpanic.com/ws/googleplay-ranking-api/ranking/0');
$appList = json_decode(preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $feed),true);
var_dump($app_List); 

// 結果
[
{
position: "1",
title: "1. 【史上最強放置ゲー】バトルダイアリー～新感覚楽ちんRPG～",
icon: "https://lh3.googleusercontent.com/R3TkcFlztdUfX6dEWD7QfF6wFAxaDvyqhBCMIy5LK57yzpQmC583hrGAb9q3c1ZxIZ8=w170",
developer: "",
category: "ロールプレイング",
price: "0"
},
…
```

以上です。
Unityの新GUIでマウスオーバー判定サンプル

# Unity uGUIでマウスオーバー
スマートフォン上でも動作します。

## サンプルコード
```
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

[RequireComponent( typeof( Image ) )]
public class TapOverComponent : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
	public Image image { get { return GetComponent<Image>(); } }

	// オブジェクトの範囲内にマウスポインタが入った際に呼び出されます。
	// this method called by mouse-pointer enter the object.
	public void OnPointerEnter( PointerEventData eventData )
	{
		image.color = Color.red;
	}

	// オブジェクトの範囲内からマウスポインタが出た際に呼び出されます。
	// 
	public void OnPointerExit( PointerEventData eventData )
	{
		image.color = Color.white;
	}
}
```

## 主な要素
|要素|概要|
|:-----------|:------------|
|[IPointerEnterHandler](https://docs.unity3d.com/jp/current/ScriptReference/EventSystems.IPointerEnterHandler.html)|OnPointerEnterが定義されている|
|[OnPointerEnter](https://docs.unity3d.com/jp/current/ScriptReference/EventSystems.IPointerEnterHandler.OnPointerEnter.html)|uGUIオブジェクトの範囲内にマウスポインタが入った際に呼び出される|
|[IPointerExitHandler](https://docs.unity3d.com/jp/current/ScriptReference/EventSystems.IPointerExitHandler.html)|OnPointerExitが定義されている|
|[OnPointerExit](https://docs.unity3d.com/jp/current/ScriptReference/EventSystems.IPointerExitHandler.OnPointerExit.html)|uGUIオブジェクトの範囲内からマウスポインタが出た際に呼び出される|
【Agileっぽい感じで何かつくる】みんなとどうやって進めていくか

**開発環境**
(http://goo.gl/C9NPlh)

* トレロとgithubでのアクションは、slackに通知させる
* gitは、初めての人でも敷居が高くないようシンプルなフローにする

**トレロでのサブタスク管理**
サブタスクという概念がないので、
一旦は、親タスクにラベルをつけてその下にサブタスクを
つくっていく感じでやてみよう。

[トレロ画面イメージ](https://qiita-image-store.s3.amazonaws.com/0/74393/b99e9083-b504-272e-ef1d-3f05733e97d3.png)

カードは、細かくきっていこう。数時間で完了できるくらいで。
モチベーションをあげていくためどす。

**Gitフロー**
git flowやGithubフローがありますが、
今回は、シンプルなGithubフローにしたいと思います。

まとめてくれている人がいますね！
これで
(http://b.pyar.bz/blog/2014/01/22/github-flow/)

で、一回やってみてまた次やるときとかに
git flowは修正していけばいいかなと。
何事も経験ということで。

あ！
ブランチの切り方ですが、ここが他の人はどうやってるのかなーと
思ったんですが、
feature/XXXX としたいと思います。
でXXXXのとこは、トレロのIDにしやしょう。カード単位で持っているので。
タスクの右下のShare and more のとこにIDがあります！
Vyatta の Virtual Tunnel Interface (VTI) について

ちょっと調べたのでメモ。

## Virtual Tunnel Interfacesとは

- VyattaでIPsecの終端として明示的に定義できる、仮想的なルーティング可能なインタフェース
- これを使うと、IPsecの定義が簡単になる
- 通常のインタフェースと同じように、インタフェースを指定してルーティングが設定できる
- VTIにルートされた時にパケットが暗号化され、VTIインタフェースから出てくる時に復号化される。

```
Virtual Tunnel Interfaces
A virtual tunnel interface provides a termination point for a site-to-site IPsec VPN tunnel and allows it to behave like other routable interfaces. In addition to simplifying the IPsec configuration, it enables many common capabilities to be used because the endpoint is associated with an actual interface.
Traffic being routed to a virtual tunnel interface is encrypted prior to being sent through the tunnel. Traffic arriving from a virtual tunnel interface is decrypted prior to its exposure to the routing system.
Vyatta’s virtual tunnel interface is compatible with third party VTI/route-based VPN connections and is sometimes required for connectivity with pubic cloud offerings.
```

- [Virtual Tunnel Interfaces](http://www.brocade.com/downloads/documents/html_product_manuals/vyatta/vyatta_5600_manual/VPN_Site-to-Site%20IPsec%20VPN/wwhelp/wwhimpl/common/html/wwhelp.htm#context=VPN_Site-to-Site_IPsec_VPN&file=Virtual%20Tunnel%20Interface%20Overview.07.2.html)


## 良い点、特長

- インターフェースを明示的に指定してルーティングができて設定が簡単
- IPsecの定義で、local/remote subnetを指定しなくていよい
- VTIのサブネットはdirectly connectedになる
- なんか色々楽っぽい

## 参考

- [Basic Site-to-Site Connection Using a Virtual Tunnel Interface](http://www.brocade.com/downloads/documents/html_product_manuals/vyatta/vyatta_5600_manual/VPN_Site-to-Site%20IPsec%20VPN/wwhelp/wwhimpl/common/html/wwhelp.htm#context=VPN_Site-to-Site_IPsec_VPN&file=Virtual%20Tunnel%20Interface%20Commands.09.01.html#1772926)
- [Virtual Tunnel Interface Overview](http://www.brocade.com/downloads/documents/html_product_manuals/vyatta/vyatta_5600_manual/VPN_Site-to-Site%20IPsec%20VPN/wwhelp/wwhimpl/common/html/wwhelp.htm#context=VPN_Site-to-Site_IPsec_VPN&file=Virtual%20Tunnel%20Interface%20Overview.07.1.html)
- [VyattaでVPC接続するなら6.5がオススメ！ - mikedaの日記](http://mikeda.hatenablog.com/entry/20121223/1356280436)
- [VTI の中身](http://www.slideshare.net/m-asama/vti-18507230)
- [ipsec.conf(5): IPsec config/connections - Linux man page](http://linux.die.net/man/5/ipsec.conf)
[VBScript] 管理者権限として実行（レジストリ変更）

コードには以下のトピックスが含まれています
* 管理者権限として実行するVBScript （UACの確認ウィンドウが出てきます）
* VBScriptでダイアログを出してユーザーに判断をゆだねる
* VBScriptでレジストリを書き込む
* SeleniumにてIE11を利用する際のレジストリ編集 (https://code.google.com/p/selenium/wiki/InternetExplorerDriver)
* （ほかにもSeleniumのIEdriverを利用する際はズームレベル100%とか拡張保護モード無効にするとかいろいろ事前設定が必要なのに注意）

```vbnet:test.vbs
Option Explicit

Dim WMI, OS, Value, Shell, wssh, fs, sh, ans
Dim path1, path2

do while WScript.Arguments.Count = 0 and WScript.Version >= 5.7
    '##### WScript5.7 または Vista 以上かをチェック
    Set WMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
    Set OS = WMI.ExecQuery("SELECT *FROM Win32_OperatingSystem")
    For Each Value in OS
    if left(Value.Version, 3) < 6.0 then exit do
    Next

    '##### 管理者権限で実行
    Set Shell = CreateObject("Shell.Application")
    Shell.ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ uac", "", "runas"

    WScript.Quit
loop

' --------------------- レジストリ登録
ans = Msgbox("レジストリを登録します。よろしいですか？", vbYesNo, "Modify Registry")
If ans = vbYes Then
    ' selenium IE11 32bit
    ' wssh.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE\iexplore.exe", 0, "REG_DWORD"
    ' selenium IE11 64bit
    wssh.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE\iexplore.exe", 0, "REG_DWORD"
    On Error Resume Next
    MsgBox("登録しました。")
End If
```
Ruby 2.2 系＆Rails 4.2 系最新版確認及びインストールについて

#**環境構築に苦戦してちょっとまとめてみた**

環境:Mac os X yosemite 

**rbenv で Ruby on Rails 環境を構築することに**

**rbenv ってなんだろう?**
→rbenvはRubyのバージョンを管理します。。（簡単に言い過ぎた感）

**そもそもRubyのバージョンってなんで管理すんの**
→Rubyだけではありませんが、基本的にプログラム言語は日々進化していきます。
仕様が変わったり、新バージョンと旧バージョンで書き方が変わって動かなくなったりするため、どのバージョンでアプリを作っていくか？どのバージョンのRubyで動かせば正しく動くのか？などと考えていくことが重要になってきます…

**rbenvで出来ることとは？**
→"rbenvの中身"に複数のRubyバージョンをインストールしておくことが可能です。どのバージョンのRubyを使用していくかを場面によって直ぐ切り替えることが出来るようにできます。それぞれ違うバージョンのRubyに依存していたとしても、rbenvがあれば適切にコントロールしていくことが可能です。

##早速インストールしてみるぜ　（rbenvのインストール）

**①MacPortsをアンインストール**
→MacPortsが入っているよ！という人はアンインストールしてください。
解説サイト（http://macperson.net/macports-uninstall/）

**②Xcode Command line tools をインストール**

Homebrewの利用には、AppStoreでXcodeをインストールし、コマンドラインツールをインストールする必要があります。
コマンドラインツールインストールコマンド
【xcode-select --install】
※Xcodeをインストールしてから行ってください。

**③Homebrewをインストール**
インストールコマンド
>ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"


Homebrew公式サイト
（http://brew.sh/index_ja.html）
※コマンドは変更される可能性があるので、公式サイトのURLを推奨します。


**④rbenvのインストール**
【brew update】
【brew install rbenv ruby-build】
【echo 'eval "$(rbenv init -)"' >> ~/.bash_profile】

**⑤rbenvを使ってRubyをインストール**
インストール可能なRubyバージョンの一覧取得コマンド
【rbenv install -l】2.2系のrubyの最新版は2.2.1（2015年4月4日現在）なので
【rbenv install 2.2.1】と指定してインストール
【rbenv rehash】これはインストールしたRubyやその拡張機能の追加をrbenvに反映させるためのコマンドです。省略するプラグインなども有りますが基本毎回おまじないのように書いていきます。

**いつも使用するrubyのバージョン指定**
【rbenv global 2.2.1】
rubyバージョンの確認コマンド
【ruby -v】実行して2.2.1と表示されていれば完了！おつかれ！


**⑥Railsのインストール**
今インストール可能なRailsのバージョンを調べるコマンド（リスト表示）
【gem search -r rails】
インストールコマンド
【gem install rails --version 4.2.1】
Railsバージョンの確認コマンド
【rails -v】
bundle installに対応するためのコマンド
【gem install bundler】


**【重要】最新版の確認の為にrbenvとruby-buildをbrewアップデートが必要**
リストを表示するだけでは最新のrubyやRailsのバージョンを拾ってこれないので
brewをアップデートしていく必要があります。
以下コマンド例
【brew update】
【brew upgrade --HEAD ruby-build】

#何か指摘事項ありましたらコメントにてお願い致します。m(__)m
vagrant provisionの脆さについて、または私は如何にして心配するのを止めてrsoloを使うようになったか

vagrantのprovision(chef_solo)機能を使っていてたびたび不可解な挙動に悩まされたので、何が根本的な原因なのか掘り下げてみました。

ちなみにprovision(chef_solo)機能というのは、こういうやつです。
使っている人は今でも多いんじゃないかと思います。

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.provision "chef_solo" do |chef|
    chef.add_recipe "apache"
  end
end
```

# 結論

vagrant provision(chef_solo)はvboxsf/VirtualBox GuestAdditionという壊れやすい仕組みに依存しているので使わないほうがよい。

# 経緯

vagrant provisionしたときに、「roleが見つからない」というエラーが出た。
↓
roleはちゃんとあるし、run_listの記述やクックブックにも間違いはない。
↓
よく見てみたら、仮想マシン側にChefRepoのファイル群(cookbooksとかrolesとか)が存在していなかった
↓
仮想マシンへのChefRepoの配置は、vagrantにおいてはvboxsfというVirtualBoxのフォルダ共有の仕組みを使って実現されている。
↓
vboxsfのマウントが失敗していた
↓
VirtualBoxのGuestAdditionが壊れていたのが原因だった。
↓
仮想マシンで`yum update`したときにkernelがアップデートされたときに壊れたらしい

# 考察

端的に言うと「yum updateしたらvagrant provisonが壊れた」ということになります。

なぜこんなにも簡単にvagrant provisionがこけるのかというと、
* VirtualBoxのGuestAdditionは非常にトラブリやすい
* vagrant provisionがそのトラブリやすいツールに依存している

「Vagrantは世の中で広く使われてるので枯れてるだろう」という思い込みがあったのですが、その下にあるソフトウェアが壊れたら壊れるのです。

# どうすればよいのか？
プロビジョンするときにvagrantコマンドを使わないのがよいです。

具体的には、[knife-solo](http://matschaffer.github.io/knife-solo/)を使う、もしくはそれが面倒なら[rsolo](https://github.com/DQNEO/rsolo)を使うのがよいでしょう。

# 参考
[Chef-Soloを100倍楽しく使うためのrsoloというツールを作りました。](http://dqn.sakusakutto.jp/2014/09/rsolo_chef-solo_knife-solo.html)

自分のツールの宣伝みたいになってしまいましたが、vagrant provisionが壊れた時もrsoloはちゃんと動いたので、作っといてよかったという話でした。
[C#] シリアルポート列挙

基本的には、以下のサイト
http://truthfullscore.hatenablog.com/entry/2014/01/10/180608
とほぼ同じ。ただし、Win32_PnPEntityを利用するとうまくCOMポートが取れない場合があったので、Win32_SerilPortを利用した。

以下のコードは、コンソールに情報を列挙するだけだが、得られた情報を正規表現等で検索すればCOM番号を取得できる。

```csharp
using System;
using System.Management;    // add to reference settings

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("show COM port");

            ManagementClass device = new ManagementClass("Win32_SerialPort");
            //ManagementClass device = new ManagementClass("Win32_PnPEntity");

            foreach (ManagementObject port in device.GetInstances())
            {
                Console.WriteLine("[device ] {0}", (string)port.GetPropertyValue("DeviceID"));
                Console.WriteLine("[caption] {0}", (string)port.GetPropertyValue("Caption"));
            }

            Console.WriteLine("\n\n--- hit enter key to end program");
            Console.ReadLine();
        }
    }
}
```
TypescriptのクラスをGulpを使ってAngularJSに自動登録する

[前回の「Typescriptで書いたAngularJSのControllerをgulpで自動登録する」](http://qiita.com/takeshi@github/items/31f6dfdb2bcbf236bc6e)を汎用化 & gulpのプラグイン化しました。Controller だけでなく、Service や Provider, Directive も TypeScript のクラスとして作成すると、AngularJSのモジュールに自動登録することができます。

## npm パッケージ
[gulp-typescript-angular](https://www.npmjs.com/package/gulp-typescript-angular)

## 使い方
npm で gulp-typescript-angularをインストールします。

```bash:インストール
npm install gulp-typescript-angular --save-dev
```
gulp-typescript-angularをgulpのスクリプトに仕込みます。

```js:gulpfile.js
var gulp = require('gulp');

var typescript = require('gulp-typescript');
var typescriptAngular = require('gulp-typescript-angular');


gulp.task('scripts', function () {
  return gulp.src('./**/*.ts')
    .pipe(typescript())
    .pipe(typescriptAngular({
      moduleName:'sample'
    }))
    .pipe(gulp.dest('./dist'));
});
```

## サンプル
GitHubの[gulp-typescript-angular](https://github.com/takeshi/gulp-typescript-angular/blob/master/doc/ja/README.md) を参照してください。
fscanfではまった話 > 書式指定子の間違い (%eと%le)

久しぶりにCのファイル読み込みを実装していてハマった話。

動作環境

     CentOS 6.5
     gcc v4.4.7


```c
static void readFile(void)
{
    double dx, dy;
    FILE *fp;

    fp = fopen("simp.tbl", "r");
    fscanf(fp, "%e %e", &dx, &dy);
    fclose(fp);
}
```

上記の場合、dxとdyはともに0.0になってしまう。
何故か。

書式指定子%eというのはfloat型を読み込む時の指定。
double型のdx, dyの場合は%leにしないといけなかった。

これがわかるまでに10分くらいハマった。
RFC6238 Time-based One-time Password Algorithm (TOTP)の仕組みのメモ


* RFCはこれ。Javaでの実装例もアリ: [RFC 6238 - TOTP: Time-Based One-Time Password Algorithm](https://tools.ietf.org/html/rfc6238)
* RFCも十分短いけど、Wikipediaのほうはさらに簡潔: [Time-based One-time Password Algorithm - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm)
* 日本語での参照情報: [Googleの2段階認証で使われているOTPの仕様が気になった - r-weblife](http://d.hatena.ne.jp/ritou/20111225/1324822654)

RFCに書いてある実装使うとかでサクッとワンタイムパスワードを生成できるので、もっと普及するといいですね。その場合はシークレットの扱いは適切にお願いします。

認証の概要
=======================

サーバーと共有しているシークレットキーと現在時刻からハッシュを生成してそれが合ってるかをみる、というのが大筋の流れ。

ワンタイムパスワードの生成
=======================

Wikipediaに書いてある通りだけど、少し補足説明。

```
TimeCounter = (unixtime(now) - unixtime(T0)) / TimeStep  # T0はエポック開始時点なので実質0, TimeStepはサーバーと共有する。30秒が推奨されてる。

HOTP(K,C) = Truncate(HMAC(K,C)) & 0x7FFFFFFF  # HMACはRFC2104で、TruncateのマナーはRFC4226でそれぞれ定義されている

TOTP = HOTP(SecretKey, TimeCounter)  # SecretKeyは事前にサーバーから提供されたもの
TOTP-Value = TOTP mod 10^ditits_number  # 剰余オペレーターを通して、指定桁数になるよう整形
```


* TruncateについてはHOTP[^hotp]で定義されている
* 有効期間は30秒を推奨とRFCに書いてある
* ハッシュ関数の推奨はRFCにはない。実質、SHA-1がデファクト。RFC上では、HMAC-SHA-1ではなく、HMAC-SHA-256 or HMAC-SHA-512が使われることも、実装によってはありうるとある。けど、TOTPのベースになっているHOTPのRFCではSHA-1が使われることが想定されているので、それに則っているのかな
* 当然、Secretキーをサーバー側と共有しないといけなくて、シークレットの受け渡しは以下の2つがよく使われる
 * QRコード
 * ユーザーに表示して手入力してもらう

[^hotp]: [RFC 4226 - HOTP: An HMAC-Based One-Time Password Algorithm](https://tools.ietf.org/html/rfc4226)




実際の運用でのシークレットの渡し方
==================================

例えば以下はFacebookで2段階認証を有効にした場合に表示されるQRコードをデコードしたもの。

```
otpauth://totp/Facebook:johndoe?secret=16DIGITS_SECRET&digits=6&issuer=Facebook
```

Qiitaの場合は以下。

```
otpauth://totp/johndoe?secret=16DIGITS_SECRET&issuer=Qiita
```

Qiitaのほうは`digits`も省略してるけど、6桁がよく使われるからだろうね。


アプリケーションでのワンタイムパスワードの生成
========================================

という感じで実装側はとくに難しいところはないので、アプリケーションを差別化するのは難しそう。
IIJ SmartkeyやAuthyや、そもそもGoogle Authenticatorも汎用TOTPコードジェネレーターとして動くので、どれでも好きなの使えばよい、が、そのTOTPコードジェネレーターが秘密鍵を適切に管理してるかは気にしたほうがいい。平文で適切なパーミッションなしで保存などされていたら台無し。Authyだとデバイスが代わっても大丈夫！復元可能！と言ってるけど、それってつまりシークレットを外部のサーバーに保存してるということなので、それが許容されるひとは使えばいいと思う。

セキュリティトークンとの比較
===========================

| 比較 | TOTP/HOTP | セキュリティトークン |
|:-----------|:------------|:-------------|
| 開始するコスト       | 安い | 高い |
| 耐タンパー性 |低い（rootedなデバイスで第三者のアプリケーションからSecretKeyを覗き見されたらどうする？） | 高い（独立したセキュリティトークンはたいてい耐タンパー性が高くなるように設計されている、はず） |
Windows のコマンドプロンプトから Makefile で複数フォルダを作るときのメモ

# 趣旨

　Windows のコマンドプロンプトから Makefile を使ってフォルダを作ろうとして盛大に嵌ってしまったので，忘れないうちに結果をメモ。

# 課題

```mk:問題のMakefile
DIRS = foo foo/bar foo/bar/baz foo/baz
```

　↑ のように，Makefile 上の変数 $(DIRS) にディレクトリのリスト (スペース区切り) が格納されているとします。 このうちのいくつかのディレクトリは，既に実体が生成されています。 このとき，Windows 上でこれらのディレクトリを生成するための Makefile を書きなさい。

# 回答

```mk:Makefile
DIRS = foo foo/bar foo/bar/baz foo/baz

$(DIRS):
    @[ -d $@ ] || mkdir $(subst /,\,$@)
```

　これで行けるはず。

# 嵌ったところ

## 1. ディレクトリ区切り文字
　UNIX 系 OS ではディレクトリ区切り文字に / が使われるのに対して，Windows では \ が使われます。 ディレクトリを作成する際，ディレクトリ名に UNIX 式のディレクトリ区切り / が入っていると，Windows の `mkdir` はそれをオプションを示すプレフィックスだと勘違いして，思ったように動いてくれません。 一方，最初に `$(DIRS)` の中の `/` を `\` で一括置換したところ，make のターゲットとしての `$(DIRS)` が正しく認識されませんでした。 なので，**ディレクトリ区切り文字にはぎりぎりまで `/` を使い，ディレクトリを作成するタイミングで `\` に置換する**必要があります。

## 2. mkdir の挙動の違い
　bash などでは `mkdir` に `-p` オプションを付けることで，作成しようとしたディレクトリが既に存在していた場合でもエラーにならずに処理を継続することができました。 しかしながら，Windows の `mkdir` には `-p` オプションが存在せず，ディレクトリが既に存在していた場合にはエラーとなり，それ以降の処理を継続できなくなってしまいます。 したがって，**`mkdir` を走らせる前にディレクトリの存在をチェックする**ことが必要になります。
symfony1.4開発の為の参考資料

#はじめに

来週から始まるsymfony1.4の改修プロジェクト用に下調べ。
資料は出来る限り日本語を探して記載している。
※mighty5さんからsymfony1.n系の先頭1文字は小文字だと教えてもらったの変更します。Qiitaのタグはこれしかないようなのでこのままいきます。

##【動作環境】
Webサーバ：Web サーバー（Apache）
PHP：5.2.4以降
DB：MySQL、PostgreSQL、SQLite
　　　もしくは PDOと互換性のある任意のデータベースエンジン

##【ソースコード】
###symfony1系ダウンロード
http://symfony.com/legacy

##【プラグイン】
###symfony1系 Plugins
http://www.symfony-project.org/plugins/
###よく使われているプラグイン
http://www.symfony-project.org/plugins/popular/

##【日本語訳資料】
###A Gentle Introduction to symfony
symfonyの概要から各機能やアーキテクチャの説明
http://symfony.com/legacy/doc/gentle-introduction/1_4/ja
###symfony1　チュートリアル
####Propel版のsymfony1.4系チュートリアル
http://symfony.com/legacy/doc/jobeet/1_4/ja/01?orm=Propel
####Doctrine版のsymfony1.4系チュートリアル
http://symfony.com/legacy/doc/jobeet/1_4/ja/01?orm=Doctrine
###The Reference Book
app.yml、generator.yml等設定について
http://symfony.com/legacy/doc/reference/1_4/ja
###Symfony YAML Configuration Reference
yamlファイルのフルオプションが知りたい場合は、このURLを参照する。
知らない機能を見つけるのが非常に楽。
http://www.doc13.ru/doku.php?id=php:symfony:1x:yml:reference
###More with symfony
もっと知りたい人向け詳細解説
http://symfony.com/legacy/doc/more-with-symfony/1_4/ja
###Doctrine 1.2系
Doctrineのドキュメント
http://doctrine.readthedocs.org/en/latest/ja/index.html
###Forms
symfonyFormのドキュメント
http://symfony.com/legacy/doc/forms/1_4/ja/01-form-creation

##【旧バージョンとの比較】
###symfony 1.2では何が新しくなったの？
http://symfony.com/legacy/doc/tutorial/1_2/ja/whats-new
###symfony 1.3/1.4 の新しい機能
http://symfony.com/legacy/doc/tutorial/1_4/ja/whats-new

##【Symfony API検索】
###symfony API
標準関数について調べる際に使う。
http://www.symfony-project.org/api/

##【参考になるプログラム】
symfony1.4の設計で困ったら参考にする。

###OpenPNE3
手島屋が開発しているMixiのようなコミュニティサイト構築システム。
日本人が開発しているので情報が豊富です。
####OpenPNE3
https://redmine.openpne.jp/projects/op3
####OpenPNE3 Plugins
http://redmine.openpne.jp/projects/op3-plugins
####ソースコード
https://github.com/openpne/OpenPNE3
####OpenPNE3プラグインの作り方#1
http://www.openpne.jp/archives/683/
###Jobeet
開発元のSensio Labs.がデモ用に作成した
求人サイトプログラム
####JOBEET
http://jobeet.org/
####JOBEET　SVNリポジトリ
http://svn.jobeet.org/

##【参考になる情報】
###Symfony wiki
FAQ and Howtosが参考になるときがあります。
http://trac.symfony-project.org/wiki
###Cheat Sheets Index
印刷して手元に置いておくと良い。
http://trac.symfony-project.org/wiki/CheatSheets
###Code snippets
この関数使ったサンプルないかなと思ったときに見ると良い。
http://snippets.symfony-project.org/tag
###Check if your symfony application is ready for deployment
リリース前に気を付ける事一覧
http://symfony-check.org/

##【コミュニティ】
###ユーザーフォーラム
標準ライブラリなどのバグ等を調べる際には検索エンジンと一緒に使う。
https://groups.google.com/forum/#!forum/symfony1
###Developperフォーラム
標準ライブラリなどのバグ等を調べる際には検索エンジンと一緒に使う。
https://groups.google.com/forum/#!forum/symfony-devs

##【開発環境】
###Skipper(旧ORM Desinger)
Propel、Dortrineの設定ファイルをGUIで書き出せる。
http://www.skipper18.com/
FreeBSDのapacheの設定ファイルの変化

pkg audit で subversionのバージョンを上げたら、mod_dav_svnがapacheに読み込まれなくなって、apacheが起動しなくなったので、原因と対策について。

# 環境

* FreeBSD 9(10でも同じはず)
* apache22 2.2.29_2
* subversion 1.8.13

# 現象
apacheを起動しようとすると、以下のエラーが出る。

```shell-session
Performing sanity check on apache22 configuration:
Syntax error on line 309 of /usr/local/etc/apache22/ssl.conf:
Unknown DAV provider: svn
```
mod_dav_svnがloadされないせいだと思われるので、httpd.confにLoadModuleを追加したところ、以下のエラーに変化。

```shell-session
Performing sanity check on apache22 configuration:
Syntax error on line 312 of /usr/local/etc/apache22/ssl.conf:
Invalid command 'AuthzSVNAccessFile', perhaps misspelled or defined by a module not included in the server configuration
```

# 原因
/usr/local/etc/apache22/modules.d と言うディレクトリに、220_subversion.conf と 220_subversion.conf.sample と言うファイルができていた。
中身を見てみると、mod_dav_svn関連のLoadModuleと設定のサンプルが書いてある(が、全てコメントアウト)
しかし、httpd.confからはこのファイルを読み込んでいない。
別のホストでapache22ではなくapache24をインストールしているものがあったので、そこのhttpd.confを確認してみたところ、LoadModuleの並んだ後に以下の行を発見。

```httpd.conf
# Third party modules
IncludeOptional etc/apache24/modules.d/[0-9][0-9][0-9]_*.conf
```

どうも、今までは/usr/local/etc/apacheXX/Includes にあるファイルを読むようにしていたのを、/usr/local/etc/apacheXX/modules.d も読むようにしたようだ。

この辺の話は、/usr/ports/UPDATINGに書かれるべきだと思うんだけど、関連しそうなのは以下くらいしか見つけられなかった。

```UPDATING
20140713:
  AFFECTS: users of www/apache22
  AUTHOR: ohauer@FreeBSD.org

  The default version was changed from www/apache22 to www/apache24,
  pre-build apache modules and web applications will also reflect this!

  In case ports are build by yourself and apache22 is required
  use the following command to keep apache22 as default.

  # echo "DEFAULT_VERSIONS+=apache=2.2" >> /etc/make.conf
```

make.conf修正してないけど、それが原因？

# 対策
先ほどのapache24の設定をapache22のhttpd.confに追加すると、以下のエラーが出る。

```shell-session
Performing sanity check on apache22 configuration:
Syntax error on line 302 of /usr/local/etc/apache22/httpd.conf:
Invalid command 'IncludeOptional', perhaps misspelled or defined by a module not included in the server configuration
```

調べてみると、[IncludeOptional](http://httpd.apache.org/docs/current/en/mod/core.html#includeoptional)は apache 2.3.6 以降らしいので、Includeに修正する。

```httpd.conf
# Third party modules
Include etc/apache22/modules.d/[0-9][0-9][0-9]_*.conf
```
ちなみに、IncludeとIncludeOptionalの違いは、ワイルドカードにマッチするファイルが一つも存在しなかった場合に、IncludeOptionalの方はエラーにしないそうだ。今回はファイルが存在していることがわかっているので、Includeで問題ない。

後は、modules.dのファイルのコメントを外して、LoadModuleを有効にする。

```220_subversion.conf
LoadModule dav_svn_module     libexec/apache22/mod_dav_svn.so
LoadModule authz_svn_module   libexec/apache22/mod_authz_svn.so
LoadModule dontdothat_module  libexec/apache22/mod_dontdothat.so
```

いい加減apache24に上げないとなあ・・・。
iOSアプリ開発する上で辛い思いをしないための指針


iOSアプリの開発の話題は、ライブラリやツール、APIの使い方に始終しがちなので、ちょっと違った方向から書いてみる試み。
意図的に発散させてみようと思ったら、思った以上にまとまりがないのですが、まあそれはそれで。
私見です。


# iOS SDKをよく知る
標準のAPIを呼べば一発のところを、自力でなんとかしようとして死亡みたいなことがありがちです。
API Diffを読む。ドキュメントを読む。ヘッダファイルを読む。

ライブラリも使うだけでなくて、コードを読むと勉強になります

# 状態の数とスコープを抑える
GUIのアプリケーションは増え続ける状態との戦いです

- 前提を作らない。B画面はA画面から呼び出されているはず、など
- 例えば、Promise系のライブラリやReactiveCocoaを使う
  - 成功/失敗/未解決を一つのオブジェクトで表現できる
- UIコンポーネントはアニメーションを意識しなくても雑に使えるようにする
- そんなに頭がよくないので、一度にたくさんのことを考えられません

もっとうまく説明できる人がいるはず


# データの流れは一方向に
Viewの状態に依存してViewを更新するなどすると、ある日突然想定外の不具合に遭遇する羽目になります
データの流れが常に一方向であれば、アプリケーションの挙動を変えるとき、変更するべき箇所が明確になる

多少、記述量が多くなっても、データの流れを保ったほうが最終的には楽

# コンテキストに依存する処理は呼び出し側に
A画面からC画面を呼んだ場合と、B画面からC画面を呼んだ場合の挙動が異なる時、
C画面にフラグを持たせるのではなくて、delegateで振り分けよう、とかそんな感じのこと

あるいは、タスクが完了した後の処理をカスタマイズするのに、フラグを渡すのではなくてPromiseのチェーンに後の処理を付け加えよう、とかそんな感じ

あれ、すごく当たり前のことを書いていますね

---

後半はUIの話を書きます

# UIコンポーネントを作り込む
例えば、自前のUIコンポーネントなんかは、作り込んでおくと何かと便利です
IBDesignable対応は必須

開発が長くなると、昔作ったコンポーネントの存在を忘れがちなので、UIカタログ的なものを作ると大変便利です


# 壊しやすく、作り直しやすく
UIコンポーネントを作り込む一方、画面のレイアウトはよく変わる部分なので、
StoryBoard & AutoLayoutでカジュアルに実装する

大きな変更があったら、また作り直すくらいでちょうど良いです
画面を作り直すのが苦にならないくらいに、UIコンポーネントを作り込んでおく

# 意味のあるViewControllerの階層を保つ

ViewControllerの階層が論理的に破綻していると、実装とデバッグが辛い感じになりがち

ありがちな例。
例えば、ログインが必要なA画面があるとします

```
A画面を開こうとする
状態1:A画面(データなし)
ログインしていなかったので、ログイン画面を開く
状態2:A画面 > ログイン画面
ログインできたのでログイン画面を閉じてA画面を表示する
状態3:A画面
```
ログイン画面はA画面の下層というわけではないので、状態2が論理的に破綻していて、
状態3でA画面を正しく表示するのに苦労するというパターンをよく見ます

アプリケーションの状態によって、時にはViewControllerの階層を根元から差し替えることもあります

# スタイルガイドとユーティリティー
色とか文字のスタイルなんかは、適当に始めると収拾がつかなくなって大変なので、
プロジェクトが始まるタイミングで、デザイナーを巻き込んでスタイルガイドと、それに対応したユーティリティーを実装しておく

人は易きに流れるので、便利なユーティリティーを作ると、全体として統一感が出るということになります
WebGL Report 実行結果（WebGL2編）

WebGL の情報をグラフィカルに表示するサイト http://webglreport.com/ が WebGL 2 に対応しているようなので試してみました。

> ■ WebGL Report
> http://webglreport.com/

##テストに使用したブラウザ一覧

テストに使用した OS ならびにブラウザは以下の環境になります。

|テストに使用したブラウザ|バージョン|WebGL2サポート|設定方法等|
|:------------|:--------:|:--------:|:--------:|
|Windows 8.1 + [Chrome Canary 43](https://www.google.co.jp/chrome/browser/canary.html)|43.0.2356.0 canary (64-bit)|あり|[起動オプションに「--enable-unsafe-es3-apis」を追加](https://twitter.com/Tojiro/status/583686243046723586)|
|Windows 8.1 + [Firefox Developer Edition](https://www.mozilla.org/ja/firefox/developer/)|38.0a2 (2015-03-30)|あり|[about:configにて「webgl.enable-prototype-webgl2」ならびに「webgl.disable-angle」を「true」に設定](https://wiki.mozilla.org/Platform/GFX/WebGL2)|
|Windows 10 TP + [IE11 Release Preview](https://devchannel.modern.ie/)|11.0.10010.0|[なし](https://status.modern.ie/webgl2canvas3d)|2015/4/4 時点では[検討中のステータス](https://status.modern.ie/webgl2canvas3d)|
|Windows 10 TP + [Spartan Preview](http://blogs.msdn.com/b/ie/archive/2015/03/30/quot-project-spartan-quot-in-the-windows-technical-preview-build-10049.aspx)|0.10.10049.0|[なし](https://status.modern.ie/webgl2canvas3d)|2015/4/4 時点では[検討中のステータス](https://status.modern.ie/webgl2canvas3d)|
なお各ブラウザは開発中であり、今後、設定方法等が変わる可能性があります。またブラウザがサポートしていたとしても、OS やビデオカードの組み合わせ等により結果が大きく異なる可能性がありますのでご注意ください。

##Chrome Canary 43
![chrome_20150404_001.png](https://qiita-image-store.s3.amazonaws.com/0/26094/40f2bbe3-d74c-8d27-08b4-a17520290eb5.png)

まだ多くの項目がn/aとなっているようです。

##Firefox Developer Edition 38.0a2
![firefox_20150404_002.png](https://qiita-image-store.s3.amazonaws.com/0/26094/d26cc317-b490-8585-19ec-3c224c656199.png)

[ANGLE については ES3 のフルサポートするまで設定を無効化しておく必要があるようです。](https://wiki.mozilla.org/Platform/GFX/WebGL2)

##IE11 Release Preview 11.0.10010.0
![ie11_20150404_001.png](https://qiita-image-store.s3.amazonaws.com/0/26094/976887d1-9be4-fad3-1b04-46dd74241ea5.png)

2015/4/4 時点では[検討中のステータス](https://status.modern.ie/webgl2canvas3d)のようです。

##Spartan Preview 0.10.10049.0
![spartan_20150404_001.png](https://qiita-image-store.s3.amazonaws.com/0/26094/c8cb01b0-95bd-c773-8bda-4a9a160644b0.png)

2015/4/4 時点では[検討中のステータス](https://status.modern.ie/webgl2canvas3d)のようです。
[MQTT] mqttcliをインストールしてsangoにつないでみる

mqttcliをインストールしてsangoにつないでみます。

- mqttcli: https://github.com/shirou/mqttcli
- sango: https://sango.shiguredo.jp/ (ここではライトプランを利用します)

参考: http://tdoc.info/blog/2014/09/10/micorservice.html


前提条件
===============

sango
-------

sangoのアカウントを持っていて、トピックを利用できること。


1. ダウンロード
===============

https://drone.io/github.com/shirou/mqttcli/files からバイナリをダウンロードします。

* OSXの場合はDarwin用をダウンロードします。


2. インストール
===============

2.1. インストール 
-------------------

ここでは、~/binに配備します。

```bash:コマンド(例):
mv ~/Downloads/mqttcli ~/bin/
chmod +x ~/bin/mqttcli
```

2.2. バージョン確認
-------------------

インストールしたらバージョンを確認しましょう。

```bash:コマンド:
~/bin/mqttcli -v
```

```text:結果(例):
mqttcli version 0.0.1
```


3. 設定ファイルの作成
=====================

3.1. 接続情報の確認
-------------------

ダッシュボードの「MQTT接続情報」を基に以下を設定します。

例:
:接続先: tcp://lite.mqtt.shiguredo.jp:1883
:ユーザー名: example@github
:パスワード: your_secret

```bash:コマンド(例):
SANGO_URL='lite.mqtt.shiguredo.jp'
SANGO_ID='<ユーザ名>'
SANGO_PW='<パスワード>'
FILE_SANGO_CONF="${HOME}/.mqttcli.cfg"
```

3.2. 設定ファイルの作成
-----------------------

設定ファイル ~/.mqttcliを作成します。

```bash:コマンド:
cat << EOF > ${FILE_SANGO_CONF}
{
    "host": "${SANGO_URL}",
    "username": "${SANGO_ID}",
    "password": "${SANGO_PW}"
}
EOF

cat ${FILE_SANGO_CONF}
```


4. 接続テスト
=====================

インストールと設定ファイルの作成が完了したので、sangoに接続してみましょう。

```bash:コマンド(例):
~/bin/mqttcli sub -t "${SANGO_ID}/#" -d
```

```text:結果:
      INFO[0000] Broker URI: tcp://lite.mqtt.shiguredo.jp:1883
      INFO[0000] Topic: example@github/#
      INFO[0000] connecting...
      INFO[0000] client connected
```

上記が確認できたら、Ctrl+Cで接続を切断します。


完了
======

インストールが完了したら、MicroServiceっぽいことをやってみましょう。

[MQTT] mqttcliとsangoでMicroServiceっぽいことをやってみる: http://qiita.com/tcsh/items/76213e58ad557a57e057
Wikipedia項目から四字熟語の抽出

## 概要
改行区切りの単語テキストから、正規表現で表される特定の単語を抽出する方法を試行錯誤しました。
今回は、漢字が4文字で構成される単語（四字熟語）を抽出します。

## 前処理

### Wikipediaタイトルのダウンロード
今回は、データベースとしてWikipedia日本語版のタイトル一覧のテキストファイルを用いました。

[Wikipediaのダウンロードできるデータファイル一覧 | mwSoft](http://www.mwsoft.jp/programming/munou/wikipedia_data_list.html)

こちらに一覧があり、その中で
jawiki-latest-all-titles-in-ns0.gz
が全ページのタイトルを記述したテキストファイルとなります。

[Index of /jawiki/latest/](http://dumps.wikimedia.org/jawiki/latest/)

こちらのアーカイブから、最新のタイトル一覧をダウンロードします。

http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz

### 漢字から始まる単語の抽出
Sublime Text 2で単語を抽出していきます。
正規表現の候補を減らす前処理として、ひらがな等を含む単語が不要となるため、
漢字から始まる行だけを抜き出しておきます。

Macの場合、漢字で始まる最初の行で
fn + Shift + 左キー
を押せば、そこから先頭までが選択されるので、それで選択された項目を削除します。

同様に、漢字で始まる最後の行で
fn + Shift + 右キー
を押して、末尾側の単語を削除します。

このようにして、以下のようなテキストが抽出されます。

```text
一
一_(緑茶飲料)
一_茶花
一〇〇式
一〇〇式三十七粍戦車砲

...

龜山鄉
龜田鵬齋
龜部
龝吉敏子
龠部
```

1531190行から766756行に削減されました。

## 四字熟語の抽出

Sublime Textの正規表現で、テキストを直接「抽出」することができないため、
置換をうまく使って不要な単語を削除していきます。

四字熟語に該当する行に"\_\_"とフラグを付けて、フラグが立っていない行を削除します。

まずは普通の検索でテキストファイル内に"\_\_"を検索して存在しないことを確認します。
（"\_\_"があった場合は"\_\_\_"とアンダースコアを増やしていって対応）

1.
漢字のエリアは[一-龥]となっております。そのエリアの文字が4つ並んでいる行の先頭に"\_\_"を付与します。

Find: `^([一-龥]{4})$`
Replace: `__$1`

```text
金沢地方裁判所
金沢地方裁判所七尾支部
金沢地方裁判所小松支部
金沢地方裁判所輪島支部
__金沢地裁
金沢地裁七尾支部
金沢地裁小松支部
金沢地裁輪島支部
金沢城
金沢城公園
金沢外環状道路
金沢大
__金沢大学
金沢大学の人物一覧
金沢大学アカンサス・スカラシップ制度
```

のように4文字の漢字文字列の先頭に"__"が付きます。

2.
__から始まらない行の文字列と改行コードを削除します。

Find: `^(?!__).*$\n`
Replace: (空白)

```text
__金沢地裁
__金沢大学
__金沢大将
__金沢孝史
__金沢実政
__金沢実時
__金沢実泰
__金沢家裁
__金沢寛明
__金沢寿一
```

のようなテキストになります。

3.
先頭のフラグを除去します。
Find: `^__`
Replace: (空白)

177435単語が抽出されました。

なお、11文字以上のときは1.のステップで繰り返し数を以下のように指定します。

Find: `^([一-龥]{11,})$`
Replace: `__$1`

## 分析
2015-03-13のデータで軽く分析しました。

### 単語数の表

| 文字数（n文字熟語） | 単語数 |
|:-----------:|------------:|
| 2文字 | 45135単語 |
| 3文字 | 109674単語 |
| 4文字 | 177435単語 |
| 5文字 | 64235単語 |
| 6文字 | 31302単語 |
| 7文字 | 18288単語 |
| 8文字 | 13842単語 |
| 9文字 | 14129単語 |
| 10文字 | 10165単語 |
| 11文字以上 | 13121単語 |

### 長い単語ランキング
#### 1位
四條畷都市計画事業田原特定土地区画整理土地区画整理促進区域事業 （31文字）
#### 2位
高知県宿毛市愛媛県南宇和郡愛南町篠山小中学校組合立篠山中学校 （30文字）
高知県宿毛市愛媛県南宇和郡愛南町篠山小中学校組合立篠山小学校 （30文字）
#### 4位
社会福祉士介護福祉士学校職業能力開発校等養成施設指定規則 （27文字）
#### 5位
八分字村藤富村並建村飽託中央中学校組合立飽託中央中学校 （28文字）

「四條畷都市計画事業田原特定土地区画整理土地区画整理促進区域事業」が漢字だけの一番長いWikipedia項目でした。これはトリビアですね！でも到底憶えられませんね！（関係者はみんな言えるのでしょうか…？）

### その他気づき
+ 2字はまともな熟語が多い
+ 3字は人名・地名が多い
+ 4字はとにかく人名が多い
+ 8文字以上は学校・施設の名前が多い（○○小学校など）