OmniAICreator/Qiita-1.07M huggingface dataset:
InterestingParty

TopCoder problem "InterestingParty" used in Member SRM 494 (Division II Level One)
http://topcoder.bgcoder.com/print.php?id=2802

> Mr. White is a very versatile person - absolutely everything is interesting to him. Perhaps this is why he has many friends. Quite unfortunately, however, none of his friends are versatile at all. Each of them is interested only in two topics and refuses to talk about anything else. Therefore, each time Mr. White organizes a party, it's a big problem for him to decide whom to invite so that the party is interesting to everybody. Now that Mr. White has a lot of experience in organizing parties, he knows for sure that a party will be interesting if and only if there's a topic interesting to each of the invited friends. 
> You will be given String[]s first and second. The i-th friend of Mr. White is interested in topics first[i] and second[i]. Return the largest number of friends that Mr. White can invite to his party so that the party will be interesting.

パーティーに人を招待したいのだが、その人達はそれぞれ2つの話題にしか興味がない。共通の話題について話せる最大の人数を求めよ。

という問題を考えてみる。

1. 話題の辞書を用意する
2. ヒットした場合カウントアップする
3. 辞書内の最大の値を返す

で解けそうである。よって、コードは

```js:InterestingParty.js
var Solver = { 
    solve: function(first, second) {
        return this.countUp(first.concat(second));
    },
    countUp: function(values)
    {
        var dict = {};
        var max = 0;
        for(var i = 0; i < values.length; ++i)
        {
            var value = values[i];
            dict[value] = 1 + (value in dict ? dict[value] : 0);
            max = max > dict[value] ? max : dict[value];
        }
        return max;
    }
};
```
単体テストコードは

```js:InterestingPartyTest.js
TestCase("InterestingPartyTest", {
    setUp: function() {
        this.solver = Object.create(Solver);
    },
    "test Example0 should return 4": function() {
        assertEquals(4, this.solver.solve(['fishing', 'gardening', 'swimming', 'fishing'], ['hunting', 'fishing', 'fishing', 'biting']));
    },  
    "test Example1 should return 1": function() {
        assertEquals(1, this.solver.solve(['variety', 'diversity', 'loquacity', 'courtesy'], ['talking', 'speaking', 'discussion', 'meeting']));
    },  
    "test Example2 should return 3": function() {
        assertEquals(3, this.solver.solve(['snakes', 'programming', 'cobra', 'monty'], ['python', 'python', 'anaconda', 'python']));
    },  
    "test Example3 should return 6": function() {
        assertEquals(6, this.solver.solve(['t', 'o', 'p', 'c', 'o', 'd', 'e', 'r', 's', 'i', 'n', 'g', 'l', 'e', 'r', 'o', 'u', 'n', 'd', 'm', 'a', 't', 'c', 'h', 'f', 'o', 'u', 'r', 'n', 'i'], ['n', 'e', 'f', 'o', 'u', 'r', 'j', 'a', 'n', 'u', 'a', 'r', 'y', 't', 'w', 'e', 'n', 't', 'y', 't', 'w', 'o', 's', 'a', 't', 'u', 'r', 'd', 'a', 'y']));
    }
 });
```

一応githubにソースコードは保存しています。
https://github.com/bloodysnowx/ProgramContest/tree/master/js/InterestingParty
BasecampのTodo項目を自動で大量に登録する

なにかの都合で、Todo ListにTodo項目をたくさん作りたいことがある。アップロード機能がない気がするので、ブラウザのコンソールを開いてJSを実行する。

```js
var array = ["項目1", "項目2", ..., "項目300"];

array.forEach(function(val, index) {
  setTimeout(function() {
    $("ul.new li a").expand();
    setTimeout(function() {
      $("textarea#todo_content").val(val);
      $("input[name=commit]").click()
    }, 300);
  }, 2000*index);
});
```

タイムアウトの時間を調整すると、もっと速くできると思う。
KiwiJuiceEasy

TopCoder problem "KiwiJuiceEasy" used in Member SRM 478 (Division II Level One)
http://topcoder.bgcoder.com/print.php?id=2714

> Taro has prepared delicious kiwi fruit juice. He poured it into N bottles numbered from 0 to N-1. The capacity of the i-th bottle is capacities[i] liters, and he poured bottles[i] liters of kiwi juice into this bottle. 
> Now he wants to redistribute juice in the bottles. In order to do this, he will perform M operations numbered from 0 to M-1 in the order in which he will perform them. For the i-th operation, he will pour kiwi juice from bottle fromId[i] to bottle toId[i]. He will stop pouring when bottle fromId[i] becomes empty or bottle toId[i] becomes full, whichever happens earlier. 
> Return an int[] that contains exactly N elements and whose i-th element is the amount of kiwi juice in the i-th bottle after all pouring operations are finished.

最初にN本のボトルが用意され、容量がcapcities[i]、実際に入っているジュースの量がbottles[i]とする。それに対して、fromIdのボトルからtoIdのボトルに注ぐ(注げなくなるまで(fromIdのボトルが空になるか、toIdのボトルがいっぱいになるまで))という操作の指示が与えられる。操作が終わった後の各ボトルに入っているジュースの量を求めよ。

という問題を考えてみる。

1. fromIdとtoIdで指定されたボトルを取得する
2. 空になる、または、満杯になるまで注ぐ
3. 1-2を順番に繰り返す

で解けそうである。よって、コードは

```js:PourJuice.js
var Solver = { 
    solve: function(capacities, bottles, fromId, toId) {
        for(var i = 0; i < fromId.length; ++i)
        {
            var result = this.pour(bottles[fromId[i]], bottles[toId[i]], capacities[toId[i]]);
            bottles[fromId[i]] = result[0];
            bottles[toId[i]] = result[1];
        }
        return bottles;
    }, 
    pour: function(fromAmount, toAmount, toCapacity) {
        return fromAmount + toAmount <= toCapacity ? [0, fromAmount + toAmount] : [fromAmount + toAmount - toCapacity, toCapacity];
    }
};
```
単体テストコードは

```js:PourJuiceTest.js
TestCase("PourJuiceTest", {
    setUp: function() {
        this.solver = Object.create(Solver);
    },

    "test ([20, 20], [5, 8], [0], [1]) should return [0, 13]": function() {
        assertEquals([0, 13], this.solver.solve([20, 20], [5, 8], [0], [1]));
    },  
    "test ([10, 10], [5, 8], [0], [1]) should return [3, 10]": function() {
        assertEquals([3, 10], this.solver.solve([10, 10], [5, 8], [0], [1]));
    },  
    "test ([14, 35, 86, 58, 25, 62], [6, 34, 27, 38, 9, 60], [1, 2, 4, 5, 3, 3, 1, 0], [0, 1, 2, 4, 2, 5, 3, 1]) should return [0, 14, 65, 35, 25, 35]": function() {
        assertEquals([0, 14, 65, 35, 25, 35], this.solver.solve([14, 35, 86, 58, 25, 62], [6, 34, 27, 38, 9, 60], [1, 2, 4, 5, 3, 3, 1, 0], [0, 1, 2, 4, 2, 5, 3, 1]));
    },  
    "test ([700000, 800000, 900000, 1000000], [478478, 478478, 478478, 478478], [2, 3, 2, 0, 1], [0, 1, 1, 3, 2]) should return [0, 156956, 900000, 856956]": function() {
        assertEquals([0, 156956, 900000, 856956], this.solver.solve([700000, 800000, 900000, 1000000], [478478, 478478, 478478, 478478], [2, 3, 2, 0, 1], [0, 1, 1, 3, 2]));
    }
 });
```

一応githubにソースコードは保存しています。
https://github.com/bloodysnowx/ProgramContest/tree/master/js/PourJuice
【MySQL】照合順序とは？

照合順序（collations ）が違うためSQLのjoinで失敗。
これを機会に照合順序について調べてみる。

```sql
SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '='
```

##照合順序とは？
MySQLは文字コードとソート順を持っていて、ソート順の部分がCollationとよばれている。(文字コードの部分はCharacter Set)

比較するときには文字コードだけでなくてCollationが一致するかどうかを比較する(順序が合わないと比較できない)。 
ので、JOINしようとするとエラーになる。

DB単位、テーブル単位、カラム単位で設定可能。

##照合順序の意味
例えば cp932_japanese_ci のようなCollationの場合。 

* 文字コード: cp932 
utf8とかcp932とかのcharacter setの事。


* 言語名: japanese 
japaneseやthaiやgeneral、unicodeなどが入ります。 
generalやunicodeはマルチリンガルの事(utf8にjapaneseはない)。


* 比較法: ci 
_ci、_cs、_bin のいずれか(で終わる)
_ci: 大文字と小文字が区別されない 
_cs: 大文字と小文字が区別される 
_bin: バイナリ

##utf8_general_ciとutf8_unicode_ciの違い
whereでのフィルタや、joinの際に違いが出てくる。
**utf8_unicode_ciの方があいまい検索またはあいまいな一致するが**、少し遅いとのことらしい。
ちなみに、mysqlのデフォルトはutf8_general_ciとなる。

### utf8_general_ci
アルファベットの大文字小文字は区別しない。**他は全て区別。**

### utf8_unicode_ci
大文字小文字/全角半角を**区別しない。**

「AAA」で検索すると、半角アルファベット「AAA」、全角アルファベット「ＡＡＡ」、半角アルファベット小文字「aaa」、全角アルファベット小文字「ａａａ」がマッチする。

「あああ」で検索すると、全角ひらがな「あああ」全角カタカナ「ァァァ」半角カタカナ「ｱｱｱ」全角ひらがな小文字「ぁぁぁ」全角カタカナ小文字「ァァァ」がマッチする。

「2」で検索すると、半角数字「2」、全角数字「２」がマッチする。

##utf8_general_ciのカラムでutf8_unicode_ciのあいまい検索を使う方法

```mysql
select * from member where namae collate utf8_unicode_ci like '%サトウ%';
```

参考：[【MySQL】大文字小文字、全角半角区別しないでマッチする検索をしたい](https://www.softel.co.jp/blogs/tech/archives/1877)

##照合順序が違うカラムでjoinする方法
utf8_general_ciとutf8_unicode_ciはCollationが違いますが、そもそも文字コードは同じutf8ですので、Collationを指定してやることでjoinできるようになります。

```sql
--Collation を指定して JOIN する (collate句を使います)
select * from table_a a
  inner join table_b b
  on a.code = b.code collate utf8_general_ci  -- ココで collate してる
```

##utf8_general_ciとutf8_unicode_ciをどう使うか
どちらを使用するかについて自分の考え
他の方の意見についてコメントで寄せて頂ければありがたい

以下の理由のため、特段理由がない場合、utf8_general_ciを使いたい
・デフォ設定のため手間が少ない
・パフォーマンス的が良いため

また、あいまい検索を行うカラムについは、SQLで対応する


参考
[MySQLのCollationを理解するためにまとめてみた。](http://blog.6vox.com/2014/05/mysqlcollatoin.html)
[MySQLの照合順序](http://qiita.com/Vit-Symty/items/159c27d7d62c78ee9ce7)
R の data.frame を作る C の関数


C言語でRの書く拡張の中で data.frame を新しく作る例です。ソースコードは[github/junkoda/Rext-examples](https://github.com/junkoda/Rext-examples/tree/master/data_frame)。


この例では x,y,z という３つのベクトルをもつ data.frame を返す。Rでいうところの：

```R
> x <- c(0,0,0,0); y <- c(0,0,0,0); z <- c(0,0,0,0)
> data.frame(x,y,z)
  x y z
1 0 0 0
2 0 0 0
3 0 0 0
4 0 0 0
```

以下、C側での関数 return_data_frame の説明が続きます。

```C
#include <R.h>
#include <Rinternals.h>

SEXP return_data_frame(void)
{
```
 
 
まずはベクトル `x, y, z` を作っておく。

```C
const int nrow= 4;
SEXP x;

PROTECT(x = allocVector(REALSXP, nrow));
double* rx= REAL(x);
 
for(int i=0; i<nrow; i++)
  rx[i]= 0.0;
```

y,z も同様。

**data.frame** とは `class="data.frame"` 属性をもつリストで、printで表示するためには行番号も必要。リストも内部的にはベクトル。


```C
const int ncol= 3; // Column are x,y,z  
SEXP list;
PROTECT(list = allocVector(VECSXP, ncol));

setAttrib(list, R_ClassSymbol, ScalarString(mkChar("data.frame")));
```

列の名前 x y z:

```C
SEXP col_names;
PROTECT(col_names = allocVector(STRSXP, ncol));
SET_STRING_ELT(col_names, 0, mkChar("x"));
SET_STRING_ELT(col_names, 1, mkChar("y"));
SET_STRING_ELT(col_names, 2, mkChar("z"));
setAttrib(list, R_NamesSymbol, col_names);
```

同様に列番号 1 2 3 4 をセット:

```C
SEXP row_names;
PROTECT(row_names = allocVector(STRSXP, nrow));

char rname[10];
for(int i=0; i<nrow; i++) {
  sprintf(rname, "%d", i+1);
  SET_STRING_ELT(row_names, i, mkChar(rname));
}
setAttrib(list, R_RowNamesSymbol, row_names);
```    

ベクトルを data.frame にセット: 

```C
SET_VECTOR_ELT(list, 0, x);
SET_VECTOR_ELT(list, 1, y);
SET_VECTOR_ELT(list, 2, z);
```

最後に `PROTECT`した回数だけ `UNPROTECT`:

```C
UNPROTECT(6);
```

ここでは x,y,z,list,row_names, col_names の6回なので 6。

こうして作った list が `SEXP return_data_frame(void)` の戻り値:

```
return list;
}
```

## R から使う。
コンパイル

```bash
R CMD SHLIB dataframe.c
```

```R
dyn.load("dataframe.so")

return.data.frame <- function() {
  .Call("return_data_frame")
}

d <- return.data.frame()

print(d)
#  x y z
# 1 0 0 0
# 2 0 0 0
# 3 0 0 0
# 4 0 0 0

print(is.data.frame(d)) #=> TRUE
```

## 参考

data.frame() のソースをみると

```
attr(value, "row.names") <- row.names
attr(value, "class") <- "data.frame"
```
と書いてある。"class" を設定しないと data.frame とは認識されない。"row.names" がないと `print()` で表示してくれない。

Cからリストをつくる方法は R のソース builtin.c do_makelist() 関数をみるとよい。
テーブルの複製


既存テーブルの中身ごと複製したい時、各DBでコマンドが異なるのでまとめ。
SELECTの内容を変更すれば、項目を抜き出して作成したり、とある条件下のデータのみ抽出して別テーブルで作成することも可能。

```sql:SQLite
CREATE TABLE "新テーブル" AS SELECT * FROM "既存テーブル"
```
**※SQLiteの場合、PRIMARY KEYは設定されないので、複製後に個別に設定が必要**


```sql:MySQL
CREATE TABLE "新テーブル" (SELECT * FROM "既存テーブル")
```

```sql:PostgreSQL
CREATE TABLE "新テーブル" AS SELECT * FROM "既存テーブル";
```

```sql:Oracle
CREATE TABLE "新テーブル" AS SELECT * FROM "既存テーブル"
```

```sql:SQLServer
SELECT * INTO "新テーブル" FROM "既存テーブル"
```

***



###SQLiteで項目抜き出し
```sql
CREATE TABLE "新テーブル" AS SELECT "列A", "列B" FROM "既存テーブル"
```

上記は、列Aと列Bだけのテーブルが作成される。
データの中身は、既存テーブルからコピーされる。


###SQLiteで条件抜き出し
```sql
CREATE TABLE "新テーブル" AS SELECT * FROM "既存テーブル" WHERE "列A" < 100
```

上記は、既存テーブルと同じ構造のテーブルが作成され、データの中身は列Aが100より小さいデータがあればINSERTされる。
該当のデータがなくてもテーブル自体は作成されている。
[初心者]Gitを調べてメモ書き


俺の名はケンヤ。難事件をいくつも迷宮入りさせたニート。しかし ある時謎の組織に入社し薬を飲まされ身体が縮んで **Braian** になっちゃった。

##[用語]
リポジトリ: 保存されてあるおおもとのデータ
clone: 入手
pull: 更新
add: 追加
commit: 保存
push: 送信


##[主なワークフロー]
0. リポジトリを作成する : git init 
1. リポジトリをクローン : git clone
2. 他の変更を取得 : git pull
3. ファイルを変更/追加 : git add
4. 変更をコミット : git commit
5. コミットを送信 : git push
6. 2へ戻る

##[コミットメッセージ]
1行目: コミットでの変更内容の要約
2行目: 空行
3行目: 変更した理由

##[コマンド]
####〜リポジトリの作成とメンテナンスに利用〜
git init  : リポジトリを作成
git clone  : 既存のリポジトリの複製を作る
git fsck  : リポジトリの正当性チェックを行う
git gc  : リポジトリ内の不要なオブジェクト削除し、最適化を行う

####〜作業ツリーやブランチを操作：管理するコマンド〜
git status  : 変更が加えられたファイルを表示する
git diff  : ファイルに加えられた変更点をdiff形式で表示する
git add  : コミットするファイルを指定する
git commit  : 変更点をコミットする
git log  : コミットログを閲覧する
git reset  : 直前のコミットを取り消す
git revert  : 作業ツリーを指定したコミット時点の状態にまで戻す
git branch  : ブランチ情報の表示およびブランチの作成
git checkout  : ブランチの切り替え
git show-branch  : ブランチの作成・変更・マージ履歴を表示
git merge  : ローカルブランチのマージを行う
git tag  : コミットにタグをつける
git stash  : 現在の作業ツリーの状態を一時的に保管する
git rebase  : ブランチの派生元(上流)を変更する

####〜他のリポジトリとの連携を行うコマンド〜
git pull  : ほかのリポジトリの変更点をローカルリポジトリにマージする
git push  : 公開リポジトリに自分のリポジトリの内容を送信する

git log —stat  : 変更履歴の確認ができる
git checkout  : ブランチを切り替える/作成する

##[参考文献]
①http://morizyun.github.io/blog/git-biginner-web-develop/
②http://sourceforge.jp/magazine/09/03/16/0831212
③https://github.com/hatena/Git-for-Designers/blob/master/README.md#%E6%9C%80%E4%BD%8E%E9%99%90%E3%81%AE%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC

おすすめ: http://morizyun.github.io/blog/git-biginner-web-develop/
Macな人は pbcopy が便利

Macには ```pbcopy``` というコマンドがあって、ターミナルの出力をクリップボードにコピーしてくれるようです。

シェルで

```
$ pbcopy
aaa
bbb
```

ってやるとクリップボードにそのままコピーされてる。（入力の終了はCtrl + Dで。）

パイプで渡せばそのままクリップボードにコピーできて、

```
cat ~/.ssh/id_rsa.pub | pbcopy
```

こんな感じで公開鍵なんかをコピーする時に便利。

Bitbucketに教えてもらった。

![pbcopy.png](https://qiita-image-store.s3.amazonaws.com/0/35647/1ed3cc33-45cd-a521-ae74-fe307a70c2c5.png)
ButterKnifeを使ったときのproguardの記述

~~[サイト](http://jakewharton.github.io/butterknife/)にあるproguardの記述を使うと、すべてのclassがrename対象でなくなってしまう。~~

~~[issue](https://github.com/JakeWharton/butterknife/issues/104)にも上がっているのでご注意を。(なお[PR](https://github.com/JakeWharton/butterknife/pull/117)もある模様)~~


```:proguard-rules.pro
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewInjector { *; }
-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}

-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}
```
Rubyで140文字カレンダー

[paiza_run(@paiza_run)さん | Twitter](https://twitter.com/paiza_run)

↑コードをつぶやくと実行結果をリプライしてくれるbotがあることを知り、

試しにこのまえ作ったこれをできる限り短くしました。
[プロ生ちゃんのカレンダーのあれ (Ruby) - Qiita](http://qiita.com/zakuroishikuro/items/6a1cdc48609875b8e131)

```rb:calendar.rb
require'date';n=Time.now;l=Date.new(n.year,n.month,-1);
puts ([*[?\t]*(l+1<<1).wday]+(1..l.day).map{|d|"\t%2d"%d}).each_slice(7).map(&:join)
```

```出力
					 1	 2	 3
	 4	 5	 6	 7	 8	 9	10
	11	12	13	14	15	16	17
	18	19	20	21	22	23	24
	25	26	27	28	29	30	31
```

一応140文字にはなったけど、@を飛ばすための文字数が足りなくて断念しました。
というか、140文字のはずなのになぜかTwitterで呟けません。

もっと短くならないでしょうか...。
(月と年を表示するのは諦めました)
apr/apr-utilをソースコードビルドする


# 概要
## これはなに？
- Apacheのポータブルライブラリ
- httpdのコンパイルで必要
- https://apr.apache.org/

## 目標
- apr-1.5.1 の共有オブジェクトがシステムに読み込まれる
- apr-util-1.5.4 の共有オブジェクトがシステムに読み込まれる

## 実行環境
- CentOS-7.0
- [ソースコードビルドするための環境](http://qiita.com/boscoworks/items/0d442d446436f7d72183)

## 依存パッケージ
- なし
- apr-util は、ここでビルドする apr に依存する

# 導入手順 (apr)
## tar.gz をダウンロードする
```
wget http://www.us.apache.org/dist/apr/apr-1.5.1.tar.gz -P /usr/local/share/downloaded/
```

## tar.gz を解凍する
```
tar -zxvf /usr/local/share/downloaded/apr-1.5.1.tar.gz -C /usr/local/src/
```


## configure を実行する
```
cd /usr/local/src/apr-1.5.1/

./configure --prefix=/usr/local/lib/apr-1.5.1
```

## make を実行する
```
make
```

## make install する
```
sudo make install
```

## ディレクトリのシンボリックリンクを作成する
```
sudo ln -s /usr/local/lib/apr-1.5.1 /usr/local/apr
```


## 共有オブジェクトのパスを登録する
```
echo "/usr/local/lib/apr-1.5.1/lib" > /usr/local/etc/ld.so.conf.d/apr-1.5.1.conf

sudo ln -s /usr/local/etc/ld.so.conf.d/apr-1.5.1.conf /etc/ld.so.conf.d/apr-1.5.1.conf

sudo ldconfig
```

# 導入手順 (apr-util)
## tar.gz をダウンロードする
```
wget http://www.us.apache.org/dist/apr/apr-util-1.5.4.tar.gz -P /usr/local/share/downloaded/
```

## tar.gz を解凍する
```
tar -zxvf /usr/local/share/downloaded/apr-util-1.5.4.tar.gz -C /usr/local/src/
```


## configure を実行する
```
cd /usr/local/src/apr-util-1.5.4/

./configure --prefix=/usr/local/lib/apr-util-1.5.4 --with-apr=/usr/local/lib/apr-1.5.1
```

## make を実行する
```
make
```

## make install する
```
sudo make install
```

## ディレクトリのシンボリックリンクを作成する
```
sudo ln -s /usr/local/lib/apr-util-1.5.4/ /usr/local/apr-util
```


## 共有オブジェクトのパスを登録する
```
echo "/usr/local/lib/apr-util-1.5.4/lib" > /usr/local/etc/ld.so.conf.d/apr-util-1.5.4.conf

sudo ln -s /usr/local/etc/ld.so.conf.d/apr-util-1.5.4.conf /etc/ld.so.conf.d/apr-util-1.5.4.conf

sudo ldconfig
```


# 削除手順 (apr)
## 導入時に生成したファイルを削除する
```
sudo rm -r /usr/local/share/downloaded/apr-1.5.1.tar.gz
sudo rm -r /usr/local/src/apr-1.5.1/
sudo rm -r usr/local/lib/apr-1.5.1/
sudo rm -r /usr/local/apr
sudo rm -r /usr/local/etc/ld.so.conf.d/apr-1.5.1.conf
sudo rm -r /etc/ld.so.conf.d/apr-1.5.1.conf
```

## 共有オブジェクトのパスを更新する
```
sudo ldconfig
```

# 削除手順 (apr-util)
## 導入時に生成したファイルを削除する
```
sudo rm -r /usr/local/share/downloaded/apr-util-1.5.4.tar.gz
sudo rm -r /usr/local/src/apr-util-1.5.4/
sudo rm -r usr/local/lib/apr-util-1.5.4/
sudo rm -r /usr/local/apr-util
sudo rm -r /usr/local/etc/ld.so.conf.d/apr-util-1.5.4.conf
sudo rm -r /etc/ld.so.conf.d/apr-util-1.5.4.conf
```

## 共有オブジェクトのパスを更新する
```
sudo ldconfig
```
linux > 前の作業ディレクトリに戻る > cd -

`cd -`にて前の作業ディレクトリに戻れる。

例えば

    cd HOGEHOGE
    cd FUGAFUGA
    cd -
とするとHOGEHOGEに戻る。

pushd, popdの組合せでもできるが、一コマンドで戻れるので一時的に別のディレクトリで作業してから前ディレクトリに戻る時に便利。
未だにたまにやるミス

```js:誤り
if ($(hoge).hasClass('.foobar')) {

}
if ($(hoge).is('foobar')) {

}
```

```js:正しい
if ($(hoge).hasClass('foobar')) {

}
if ($(hoge).is('.foobar')) {

}
```

冷静に考えれば当たり前の話ですが、普段セレクタ書いてること多いと `$(hoge).hasClass('.foobar')` は特にやりがち。
linux (bash?) > !$の使い方 (ついでに !^ と !:2 も)

CentOS6.5にてbashシェルにて確認。

`!$`というのは前に使ったコマンドの最後の文字列を表す。

    $ touch a b c d e
    $ echo !$
とすると`e`が表示される。

    $ mkdir SAMPLE_DIRECTORY_HOGEHOGE
    $ cd !$
とすると`SAMPLE_DIRECTORY_HOGEHOGE`に移動できる。タブ補間入力よりも早い時もある。

<hr>
(追記)

`!$`は直前のコマンドの「最後の文字列」のようですが、同じように`!^`は直前のコマンドの「最初の文字列」となるようです。

また、`!:2`のようにすると2つ目の文字列というように位置の指定もできるようです。

例として

      $ echo a b c d e
      $ echo !^ !:2 !:3 !$
とすると

      a b c e
という結果となります。
pythonのzip

C++のpairを使って、x軸の配列とy軸の配列をセットにして処理してる先輩を見ると、あー、カッコイイなー、なんて思ってたんですけど、pythonにもzipという関数がありました。
知らなかっ

```python:zip
x = [1, 2, 3]
y = [4, 5, 6]
z = zip(x, y)
```

これで、zには[(1, 4), (2, 5), (3, 6)]が代入されているはず！

```python:z
<zip object at 0x104d232c8>
```

あれ？
ぐぐったら、zipの返却値が、python2ではlistだったものが、python3ではイテレータに変更になったらしいです（[2to3を使ってコードをPython 3に移植する](http://diveintopython3-ja.rdy.jp/porting-code-to-python-3-with-2to3.html)）。

```python:zip2list
list(z) # [(1, 4), (2, 5), (3, 6)]
```

できた！

~~PHPにも同じものがないか探してみたんですけど、Zipに圧縮する関数とかしか出てこなかったので、なさ気です。~~
コメントで、array_map()を使うとできるということを教えていただきました。knoguchiさん、ありがとうございます！

というわけで、書いてみました（コメントと同じコードですけど）。

```php:array_map
$x = [1,2,3];
$y = [4,5,6];
$set = array_map(NULL, $x, $y);
var_dump($set);
/*
array(3) {
  [0]=>
  array(2) {
    [0]=>
    int(1)
    [1]=>
    int(4)
  }
  [1]=>
  array(2) {
    [0]=>
    int(2)
    [1]=>
    int(5)
  }
  [2]=>
  array(2) {
    [0]=>
    int(3)
    [1]=>
    int(6)
  }
}
*/
```

まだまだPHP使いこなせてないなぁ・・。
GMOの株主優待を利用して無料でvpsをゲットする方法

# GMOインターネットの株主優待制度
http://ir.gmo.jp/stock/st-newstockholders/
> 半年毎にGMOインターネット及びGMOインターネットグループで提供しているサービスの対象期間中の利用料5,000円分（上限）を割引します。

# お名前.com VPSの利用料
http://www.onamae-server.com/vps/?btn_id=ln_vps_1
> メモリ1GBプランを年間で契約すると9,523円/年(793円/月, 4,762/半年)

# GMOクラウド VPSの利用料
http://vps.gmocloud.com/
> マイクロプランを年間で契約すると934円/月(5,604/半年)

# GMOクラウドの株主優待制度
http://ir.gmocloud.com/ir/stockbenefit/
> 優待内容：5,000円を上限に申請期間中に利用している基本料金をキャッシュバック
> ※ご利用中2サービスまで対象、ドメインおよびオプション料金等は対象外

# 結論
よって、上記株主優待による割引を利用してお名前.com vpsを0円で使えます。
GMOクラウド vpsならメモリ2GBを半年で604円にて使えますね。GMOインターネットの優待はGMOクラウドにも使えるので、
GMOインターネットの優待とGMOクラウドの優待を併用できれば完全に無料にできそうですが、試してはいません。

開発者であればちょっとサーバーで試したいことってあるので、1つぐらいvpsを借りておくと便利ですよー♪

# 補足
なお、社員ではありません。が、GMOの株は買っているので、みんながvps狙いで買うことによって値上がりしてくれたら嬉しいなとは思ってますw
Vagrant Memo


box作ったりしてるけど、その都度、どうやるか忘れるからメモ

後から追加していく。


## VagrantBox の作り方

基本ここに全部書いてはるのでそれを http://qiita.com/t_oginogin/items/e9d2efff211b4ae064df

個人的には、セクション単位？でVirtualBoxでスナップショットを取りまくる方法でやっている。
かなり便利で、ごついソフトインストールして要らなくなって消しても、インストールした状態まで戻せる。

### パッケージ生成

```shell
> vagrant package --base Centos56 --output centos56.box
```

1. --base の引数 `Centos56` はVirtualboxのイメージパスを指すけど、何故かvbox拡張子まで入れるとうまくいかないみたいなので、拡張子外した形で指定


### パッケージの追加方法

```shell
> vagrant box add centos56 centos56.box
```

## Chef を書き換えたので、再度動かす

```shell
> vagrant reload
> vagrant provition
```

## Vagrant Error

なんかハマる例なのを。

### mount に失敗して、Chefなどが動いていない


```
Failed to mount folders in Linux guest. This is usually beacuse
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group apache | cut -d: -f3`,dmode=777,fmode=777 /vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g apache`,dmode=777,fmode=777 /vagrant /vagrant
```

参考: [vagrantでmountエラーの解決方法](http://qiita.com/osamu1203/items/10e19c74c912d303ca0b)

#### 解決法

```shell
> vagrant ssh
[vagrant@localhost ~]$ sudo /etc/init.d/vboxadd setup
```

## CentOS の調節

参考: [RedHat系のOSで、不要になったパッケージを削除](http://scribble.washo3.com/linux/redhat-yum-remove-package-cleanup.html)

大体は標準で入っているが念のためなコマンド

```shell
# yum install yum-utils
```


### 不要なソフトウェアの検索と削除

```shell
# package-cleanup --leaves
Setting up yum
libyaml-0.1.4-1.el5.rf.i386
# yum remove libyaml-0.1.4-1.el5.rf.i386
```
bash > スクリプトの実行内容を表示しながら実行する > bash -x

以下のようなスクリプトがtest.shという名前であるとする。

    #!/bin/env bash
    touch afile
    cp afile bfile

`bash test.sh`を実行した時は処理内容が何も表示されない。

`bash -x test.sh`とすると、以下のように処理内容が表示されるようになる。

    + touch afile
    + cp afile bfile
    
<hr>
-xオプションはデバッグモードにするオプションとのこと。以下のようなスクリプトがあった時に、どこで終了したかわかりデバッグに役立つ。

    #!/bin/env bash
    inp=1
    if [ $inp -eq 2 ] ; then
      exit
    fi 
    if [ $inp -eq 1 ] ; then
      exit
    fi 
    echo "TEST"

上記の実行結果は以下の通りとなり、-eq 1のif文で終了しているのがわかる。

    + inp=1
    + '[' 1 -eq 2 ']'
    + '[' 1 -eq 1 ']'
    + exit
expectでsshのパスフレーズ付き鍵認証を自動化


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

host=xxx.xxx.xxx.xxx
login_name=hoge
key=/xxxx/xxxx/xxxx/id_rsa
passphrase=xxxxxxxx

if [ -z `ssh-add -l | grep $key | awk '{print $3}'` ]; then
    expect -c "
    set timeout -1
    spawn ssh-add $key
    expect \"Enter passphrase for $key:\"
    send \"$passphrase\n\"
    interact
    "
fi

ssh -l $login_name -i $key $host
```
Nginx and VirtualBox shared folders strange bug

# The appearance

Web content is in host folders, and served by Nignx in the client os (CentOS in a VirtualBox VM), through shared folder which are all controlled by Vagrant.

The appearance is that static files(.js, .css, updated after once served by the web server) will got corrupted, with some strange chars(question mark in blank diamond) appended at the end of file. Like this:

![question mark in blank diamond](http://smotko.si/assets/pics/nginxwtf.png)

*Picture from http://smotko.si/nginx-static-file-problem/*

Or like this:
![](https://gist.github.com/snakevil/a28e75f115cd5eb7c881/raw/bc2535a91e2a5b421902a6659c5cc43be8d6f36a/~through-nginx.png)

*Picture from https://gist.github.com/snakevil/a28e75f115cd5eb7c881*


# How to resolve

Refer to these pages:

https://github.com/mitchellh/vagrant/issues/351#issuecomment-1339640

https://docs.vagrantup.com/v2/synced-folders/virtualbox.html

http://nginx.org/en/docs/http/ngx_http_core_module.html#sendfile

It's easy to resolve this issue by change the Nignx config:

```
sendfile off;

```

Also Apache has the same problem and the resolve method.


# What's `sendfile`

> sendfile() copies data between one file descriptor and another. Because this copying is done within the kernel, sendfile() is more efficient than the combination of read(2) and write(2), which would require transferring data to and from user space.

*From: http://wiki.nginx.org/HttpCoreModule#sendfile*

> Unfortunately, sendfile(2) requires a file descriptor that supports mmap(2) and friends, which excludes UNIX sockets, for example as a way to send data to a local Rails backend without all the network latency.

*From: https://t37.net/nginx-optimization-understanding-sendfile-tcp_nodelay-and-tcp_nopush.html*

# The deep

I can find these issues of VirtualBox: 
* https://www.virtualbox.org/ticket/12597 
* https://www.virtualbox.org/ticket/9069
And finally:
* https://www.virtualbox.org/ticket/819

I'm not Linux Kernel expert and can't dig it any more, but it seems that `mmap` is the root cause and at least has lasting for 7 years.
systemdでのタイムゾーン設定


# timedatectl

systemdパッケージにtimedatectlというツールが含まれているのでコレが使える。

```bash
$ rpm -ql systemd-208-11.el7_0.5.x86_64 | grep timedatectl
/usr/bin/timedatectl
/usr/share/bash-completion/completions/timedatectl
/usr/share/man/man1/timedatectl.1.gz
/usr/share/zsh/site-functions/_timedatectl
```

# 現在の設定を表示

```bash
$ timedatectl status
      Local time: 金 2015-01-09 13:23:25 JST
  Universal time: 金 2015-01-09 04:23:25 UTC
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
```

# 設定可能なタイムゾーンのリスト

```bash
$ timedatectl list-timezones | head
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
Africa/Bangui
Africa/Banjul
Africa/Bissau
Africa/Blantyre
```

`head` しなければもっとずらずら出てきます。

# タイムゾーンをバンコクに設定

```bash
$ sudo timedatectl set-timezone Asia/Bangkok
$ timedatectl status
      Local time: 金 2015-01-09 11:27:59 ICT
  Universal time: 金 2015-01-09 04:27:59 UTC
        Timezone: Asia/Bangkok (ICT, +0700)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
```

日本向けには `Asia/Tokyo` を設定すればOKだと思います。
Mozart2 - Ozでシステム関数のインポート/関数の遅延評価/パターンマッチしてみる


[Mozart2 - Oz言語 を利用する (OSX,非emacs,CUI)](http://qiita.com/ma2saka/items/571dc440002d75cdd0f6)の続き。
ozcを利用し、コマンドラインでやろうといろいろしてます。

構文に慣れず試行錯誤だけど、要領は分かってきたのでメモ。

```
$ cat fact2.oz
functor _
require
  % 複数の関数をインポートする際は空白区切りみたい
  System(show:Show showInfo:ShowInfo)
  Application(exit:Exit)
prepare
  % なんでも lazy にしてみる
  fun lazy {Add X Y}
    X + Y
  end

  % case はパターンマッチを行う
  % リストは連結リストなので、パターンマッチで最初の要素と後続の要素に分けられる。最後はnil。
  fun lazy {Sum L}
    case L of H|T then
      {Add H {Sum T}}
    else 0 end
  end

  % いつもの再帰も lazy に
  fun lazy {Fact N}
    if N == 0 then 1
    else N * {Fact N -1 }
    end
  end

  % 遅延評価関数の実行結果は普通に変数に束縛できる
  F = {Fact {Sum [1 2 3 4]}}

  {Show '遅延評価関数の評価前'}
  {Show F}
  {Show '遅延評価関数の評価後'}
  {ShowInfo F}

  {Exit 1}
end
```

実行してみる。

```
$ ozc fact2.oz
'遅延評価関数の評価前'
_
'遅延評価関数の評価後'
3628800

$ echo $?
1
```

- require のところではモジュールの関数をそれぞれ任意の名前でインポートできる。
- System#show は評価を行わない（lazy指定された関数の評価実行を引き起こさない）。それに対し、System#showInfo は評価を実行する。
- System#show とか Systen#print はリストの構造をそのまま出力してくれる。System#showInfoは文字列類似のものしか処理できない。


## おまけ

System モジュールの関数などを確認したい場合、github の mozart2 プロジェクトの中に一通りあります。

```
$ git clone https://github.com/mozart/mozart2
$ cd mozart2
$ cat lib/main/sys/System.oz

... 略 ...
export
   Print
   Show
   PrintName
   PrintInfo
   ShowInfo
   PrintError
   ShowError
   gcDo: GCDo
   Postmortem
   Eq
   % NbSusps
   OnToplevel

define

   proc {Print Value}
      {Boot_System.printRepr Value false false}
   end

... 略 ...
```
Windowsの日本語名ユーザーにてvagrantを起動する方法

Windowsを日本語名ユーザーにて使用している場合にvagrantを起動しようとすると、
Warn the user when in a path that contains special characters #4966
https://github.com/mitchellh/vagrant/issues/4966
に記載されているように
VAGRANT_HOME special characters don't work #2113
https://github.com/mitchellh/vagrant/issues/2113

```
process_builder.rb:63:in `join': incompatible character encodings: CP850 and ASCII-8BIT (Encoding::CompatibilityError)
```
や

```
runtime.rb:222:in `split': invalid byte sequence in UTF-8 (ArgumentError)
```
を引き起こす。

よって、回避するには C:¥vagrant_home などの適当な英語パスのフォルダを生成し、
環境変数 VAGRANT_HOME を先ほど作成した C:¥vagrant_home と設定すれば、解決！
古いversionのRed hatのyumupdateを有効にする方法

yum updateできなくなった古いRedhatでyumコマンドを復活させる方法

yum updateを実行した所下記のエラーが発生

yum update
Loaded plugins: security
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
 Eg. 5Server is not a valid release or hasnt been released yet/
removing mirrorlist with no valid mirrors: /var/cache/yum/local/mirrorlist.txt
Error: Cannot retrieve repository metadata (repomd.xml) for repository: local. Please verify its path and try again

サポートが終了した古いバージョンはミラーから取り除かれてしまうため、yum updateを実行しても
エラーが発生してしまう模様。

下記にて古いリポジトリを参照できるとのこと。
http://vault.centos.org/4.9/

なので/etc/yum.repos.d/以下のファイルを次のように変更すればok。


```ruby:local.repo
name=RHEL $releasever - local repo`
#baseurl=http://10.235.26.47/rhel-x86_64-server-5/getPackage`
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
baseurl=http://vault.centos.org/5.7/os/$basearch/
enabled=1
gpgcheck=0 
```

これで、
yum updateで更新出来ました。

参考：http://d.hatena.ne.jp/tmatsuu/20120324/1332578375
unite-outlineのコメント表示について

# 概要
`unite-outline`のコメント定義で自分が分かったことをまとめます。

# 内容
手探りで、調べてみました。

## ヘルプ
`:h *unite-outline-info-heading-1`

## `-`,`=`,`*`を10文字以上並べたら反応する。

`unite`

```
> 
// title1
// title2
// title3
```

`main.js`

```js
// ----------
// title1
// ==========
// title2
// **********
// title3
```


## 一行目から連続したコメントでは、反応しない。
使用かどうかは不明

`unite`

```
> 
main()
// 表示される
```

`main.js`

```js
// ----------
// 表示されない
//
// ----------
// 表示されない
function main(){}
// ----------
// 表示される
```

## `==========`で階層を一つ下げれる

多構造はできないみたいです。

`unite`

```
> 
// parent
  // child
// parent
  // child
```

`main.js`

```js
// ==========
// parent

// ----------
// child

// ==========
// parent
//
// ----------
// child

```


## 一行あけれる

開けた行には、`-=*`が記述できるみたいです。

`unite`

```
>
// space
```

`main.js`

```js
// ----------
// -=*
// space
```

## インデントに対応している

`unite`

```
> 
// indent
  // indent
    // indent
```

`main.js`

```js
// ----------
// indent

    // ----------
    // indent
 
        // ----------
        // indent
```
tinymceエディタを拡張する。line-heightのボタンを追加


メモ。

#環境

cakephpで作成中の入力画面

#コード

```javascript
tinymce.init({
            selector: "textarea",
            element_format: "xhtml",
            schema: "html5",
            plugins: ["link"],
            //force_br_newlines : true,
            force_p_newlines : true,
            //forced_root_block : '',
            toolbar1: "undo redo | bold italic | link | outdent bullist indent",
            toolbar2: "fontsizeselect | alignleft aligncenter alignright alignjustify | ad_lineheight | align-justify reset-justify",
            setup: function(editor) {
                editor.addButton('ad_lineheight', {
                    type: 'listbox',
                    text: 'line-height',
                    icon: false,
                    values: [
                        {text: '1', value: '1'},
                        {text: '1.5', value: '1.5'},
                        {text: '2', value: '2'},
                        {text: '2.5', value: '2.5'},
                        {text: '3', value: '3'}
                    ],
                    onselect: function(e) {
                        var selected    =   tinyMCE.activeEditor.selection.getContent();
                        var content     =   '<p style="line-height: '+this.value()+';">' + (selected != '' ? selected : '') + '</p>';
                        editor.insertContent(content);
                    }
                });
            }
        });
```

tinymce.initの中のsetup内にeditor.addButtonを記述していきます。
第一引数が、キーで、toolbarに記述することで呼び出されます。
第二引数で設定していきます。
type: 'listbox'は![画像](http://gyazo.com/a6b7d8ddf989cec9b0efaba2352b67bf.png)のリストタイプ
何も指定しなければ![画像](http://gyazo.com/769735168ec50d1b740fc96ff1829171.png)このボタンタイプになります。
listboxのタイプはvaluesに配列でtextとvalueを記述してアイテム登録します。
onselectで変化させます。
ボタンタイプはonclickとなります。
基本的にgetContentして、文字を入力取得->pなり、spanなりで囲んでvaluesのvalueの値でstyleセットして、editor.insertContentする流れです。
ソースコードが縦長になった時にサッと行き来する小技

コメントアウトを利用した小技です。
けっこうやってますが、みなさんもやってますかね？
しょうもないかな？ｗ

###1 . 適当な名前でコメントアウトを作る 
例「//imakoko」

###2 . command＋F（ctlr + F）

###3 . 検索をかけて行き来する
例「imakokoで検索」


```js:「imakoko」で行き来した例
//imakoko
var hoge = 1;

... 中略 ..

//imakoko
for(i=1;i<foo.length;i++){

....

}

```
Raspberry Pi emulator for WindowsでRaspbian最新版を動作させる手順

自宅実験用にRaspberry Piの購入を検討した時、そもそもRaspberry Piとはどんなものかを確認するためにエミュレータを使用しました。少し古いRaspbianでも良いのであれば、「Raspberry Pi emulation for Windows」でダウンロードしたqemuをただ実行すれば良いのですが、最新版のRaspbianを動作させるには作業が必要でした。ここに、その作業ログを記述します。

# 作業環境

* OS…Windows 7 (32bit)

# 作業手順

* Raspberry Pi emulation for Windows(以降、qemu)、および最新版のRaspbianをダウンロードします。
  * [Raspberry Pi emulation for Windows | SourceForge.net](http://sourceforge.net/projects/rpiqemuwindows/)
  * [Downloads | Raspberry Pi](http://www.raspberrypi.org/downloads/)
* qemuを”C:\”に展開します。
  * “C:\qemu\”に展開されます。
* Raspbianを”C:\qemu\qemu\”に展開します。
  * “C:\qemu\qemu\\*.img”に展開されます。
* “C:\qemu\qemu\run.bat”を以下のように修正します。
  * Raspbianファイル名(例: 2012-07-15-wheezy-raspbian.img)が書いてあるので、展開したファイル名に修正します。
  * -appendを”root=/dev/sda2 panic=1 rootfstype=ext4 rw init=/bin/bash”に変更します。
* “C:\qemu\qemu\run.bat”を実行します。
  * “root@(none):/#”というプロンプトが起動します。
  * キーボード配列が英語配列になっているので、日本語キーボードの刻印と違う文字が入力されることがあります。特に記号。
* “/etc/ld.so.preload”を修正します。
  * 1行目をコメントアウトします。
* “/etc/udev/rules.d/90-qemu.rules”を作成します。

```shell-session:/etc/udev/rules.d/90-qemu.rules
KERNEL=="sda", SYMLINK+="mmcblk0"
KERNEL=="sda?", SYMLINK+="mmcblk0p%n"
KERNEL=="sda2", SYMLINK+="root"
```

* ウィンドウの[x]をクリックして、qemuを終了します。
* “C:\qemu\qemu\run.bat”を修正します。
  * -appendから”init=/bin/bash”を除去します。
  * 開放したいポートについて、-redirを追加します(例: -redir tcp:10022::22)。開放したいポートが無ければ、この作業は不要です。
* 完了です。“C:\qemu\qemu\run.bat”を実行して、Raspbianが起動すること、(22番ポートを開放している場合)ssh接続できることを確認します。

# 備考

* 当手順はWindowsでの作業手順ですが、qemuとカーネルイメージの入手手順を読み替えれば、MacやLinuxでも同様にできるはずです。
ファイルやディレクトリのパーミッションを一括で置換したい

**追記** *2015/01/09 13:00*：

[コメント](#comments)で、さらにスマートな書き方をお教えいただきました。ありがとうございます！

**追記** *2015/01/10 02:20*：

更に[コメント](#comments)で、そもそも`find`を使わず`chmod`だけで実現する方法をお教えいただきました！qiita、すごいです。

*****

例えば、`/path/to/dir`以下のディレクトリのパーミッションを変更したいとき、

```bash
chmod -R 755 /path/to/dir
```

などとやると、`/path/to/dir`以下にあるディレクトリはもちろん、ファイルのパーミッションまで`755`になってしまいます。`644`にすると、ディレクトリも`644`になってしまって困ります。手動でディレクトリのパーミッションだけ直すのも何だかスマートではありません。

ディレクトリは`755`、ファイルは`644`に一発で置換したい、というときはこんなのがよい、と[こちらの記事のコメント](http://qiita.com/suin/items/2100dc48ec93df58ebf9)で紹介されておりました。

```bash
find /path/to/dir -type d -exec chmod 755 {} +
find /path/to/dir -type f -exec chmod 644 {} +
```

なるほど。あと、よく使うのであれば、`~/.bashrc`に関数を登録しておくのも便利かもしれません。

```bash:.bashrc
function chmod-r(){
  find $1 -type $2 -exec chmod $3 {} +
}
```

`chmod-r`の部分は他のコマンドとかぶらなければお好みで構わないのですが、`chmod-r /path/to/dir d 755`などと入力すると、`find /path/to/dir -type d -exec chmod 755 {} +`が実行されるようになります。
Powershellスクリプトをプログラマーじゃない人のPCで動かすときに設定とか面倒くさいので何とかする

* Powershellをお使いの貴兄は、set-executionpolicy RemoteSigned していると思います。
* 諸事情あって非プログラマーなどPowershellを知らぬい人々のPC上でPowershellスクリプトを動かしたい時に、わざわざそのPCで set-exectuionpolicy RemoteSigned とか打ち込んでEnterキー連打するのはちょっと煩わしいなぁ、という時にどうするのかを考えた結果、「**バッチファイルで呼び出せばいいんじゃね？**」となりました。

``` sample.bat
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -executionpolicy remotesigned -File ./XXXXXXXX.ps1
```
* バッチファイルにこういう風に書くだけでOK。ファイルは一つ増えてしまいますが、細かい設定をする必要も無く、後始末も簡単です。ファイル消すだけですしね。
---
### 引数の罠
* 呼び出し先のスクリプトに引数として良くあるオプションを渡す場合、--version などのような -- や - を接頭に置いたものを処理しようとすると、引数として正常に動作しないことに7年経った2022年に気付きました。
``` test.ps1
param( $arg1 )

write-host $arg1
```
このような単純に引数を表示するスクリプトを用意します。

``` powershell.exe
./test.ps1 --version

--version
```
powershell.exeで直接呼び出して上げれば、正しく動作します。
しかし、バッチファイル内で引数も記述して……
``` test.bat
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -executionpolicy remotesigned -File ./test.ps1 %1
```
cmd.exeでそのバッチファイルを実行すると引数が無かったことに。
``` cmd.exe
.\test.bat --version

# 何も表示されない
```
* -- だろうが - だろうが、powershell側に渡された時点で失われてしまうため、もしこのような運用をするのであれば、MS-DOS時代には良くあった / を使えば何とかなります。
``` cmd.exe
.\test.bat /version

/version
# 引数を表示してくれた
```
* 付けてはいけない記号については、- のみ調査済です。/ と \ は付けても問題ありませんでした。
* 現場からは以上です。
Fence Repair

もっとエンジニア力つけたい！というわけで、ペーペーなプログラマを脱するべく、毎週Qiitaに投稿しようと思います。

で、今、社内でアルゴリズムの勉強会してるので、まずはそのコードを晒していこうと思います。
今回のお題は[FenceRepair](http://poj.org/problem?id=3253)。
フェンスの修理を最小コストで行なえというやつです。

修理のために板を分割するのですけど、分割すると、分割前の板の長さのコストがかかります。
３０の板を、５、５、２０の長さに分割するとします。
まず、５、２５で分割すると、３０のコスト。
２５をさらに５と２０で分割すると、２５のコスト、合わせて５５のコストが必要となります。

インプットは、分割後の板の長さです（上記の例だと、５、５、２０）。
元の板の長さは、分割後の合計の長さと一致します。
この時のコストを最小にするアルゴリズムを考えよ！というわけです。

で、できたのがコチラ。

```php:FenceRepair.php
class FenceRepair
{
    public static function calc($boardsLength)
    {
        $cost = 0;
        asort($boardsLength);
        while (count($boardsLength) > 1) {
            $firstBoard = array_shift($boardsLength);
            $secondBoard = array_shift($boardsLength);
            $cost += $newBoard = $firstBoard + $secondBoard;
            $boardsLength = FenceRepair::insertNumToArrayThroughAsort($newBoard, $boardsLength);
        }
        return $cost;
    }

    private static function insertNumToArrayThroughAsort($num, $array)
    {
        foreach ($array as $key => $value) {
            if ($value >= $num) {
                array_splice($array, $key, 0, $num);
                return $array;
            }
        }
        array_push($array, $num);
        return $array;
    }
}
```

切るたびに切る前の板の長さのコストがかかるので、切るときは、切った後の板の長さが、最も小さいものを選ぶ、ということを、逆算したような処理になってます。
insertNumToArrayThroughAsort()で毎回ソートしてるので、ちょっと無駄な処理をしてます。
heapSortを使えば、もうちょっとカッコよくなるらしいです。
Pythonでいうと、[ヒープキューアルゴリズム](http://docs.python.jp/3.4/library/heapq.html)とかでしょうか。

次は、もっとカッコよく・・・！
シェルスクリプト内で/dev/stderrにリダイレクトしてはいけない

リダイレクトの検証などで標準エラー出力が欲しくなったとき、`/dev/stderr`へのリダイレクトを行うシェルスクリプトを良く書いていましたが、問題があることが分かったのでまとめておきます。

ダメな例
------------
```bash:output.sh
#!/bin/sh

echo 'stdout1' > /dev/stdout
echo 'stdout2' > /dev/stdout
echo 'stderr1' > /dev/stderr
echo 'stderr2' > /dev/stderr
```

### テストすると正常に動いているように見える
```bash
$ ./output.sh
stdout1
stdout2
stderr1
stderr2
$ ./output.sh > /dev/null # 標準出力を抑制
stderr1
stderr2
$ ./output.sh 2> /dev/null # 標準エラー出力を抑制
stdout1
stdout2
```

### しかし、ファイルにリダイレクトすると問題が起こる
```bash
$ ./output.sh > output.log
stderr1
stderr2
$ cat output.log
stdout2 # stdout1が消えてしまっている
```
```bash
$ ./output.sh >> output.log # 追記してみるが
stderr1
stderr2
$ cat output.log
stdout2 # やはり最後の出力しか残らない
```

良い例
-----------------
```bash:output.sh
#!/bin/sh

echo 'stdout1'
echo 'stdout2' >&1 # 意味はないが表記を揃えたければ書いてもOK
echo 'stderr1' >&2
echo 'stderr2' >&2
```

### 問題なく動作する
```bash
$ ./output.sh > output.log
stderr1
stderr2
$ cat output.log
stdout1
stdout2
```
```bash
$ ./output.sh 2> output.log
stdout1
stdout2
$ cat output.log
stderr1
stderr2
```

原因
--------
色々考えてみたらある程度は説明がついたが、正確な所は良くわからなかった。
以下のように書き換えると正常に動作するので、`echo hoge > /dev/stdXXX`の度にoutput.logがクリアされているようだ。もちろん、こんな書き方をするよりは「良い例」に書いた方法を使う方が良いね。

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

echo 'stdout1' >> /dev/stdout
echo 'stdout2' >> /dev/stdout
echo 'stderr1' >> /dev/stderr
echo 'stderr2' >> /dev/stderr
```
linux > シンボリックリンクのファイル名だけ表示 (詳細はいらない時) > find . -type l または(アルファベット順) find . -type l | sort

CentOS 6.5で確認しました。

`ls`コマンドを実行した時、lsの結果が一画面で収まらない数のファイルがあり、その中からsymbolicリンクのファイルだけ見つけたいとする。
`find . -type l`
とすればシンボリックリンクのファイルだけ一覧表示される。

<hr>
上記の実行ではアルファベット順番ではないようなので、アルファベット順にしたい場合は
`find . -type l | sort`
をすればいい。

<hr>
ClassicLinkで、EC2-ClassicのインスタンスとVPC内のインスタンスを通信させる



今日発表されたClassicLinkを使うことで、EC2-ClassicのインスタンスからVPCのリソースへ通信したり、VPCのセキュリティグループを利用することができるようになりました。

ClassicLink自体は無料です（うれしい）

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/vpc-classiclink.html
https://aws.amazon.com/jp/blogs/aws/classiclink-private-communication-between-classic-ec2-instances-vpc-resources/


## いままでの問題

VPCの中で起動していないEC2(EC2-Classic)は、グローバルIPなどを使ってVPCのリソースと通信しなければなりませんでした。

しかし、それではインスタンス間の高いスループットや低いレイテンシーを享受できませんし、帯域課金や望ましくないセキュリティへの影響もありました。

ClassicLinkは上記問題に対する新しいアプローチを提供してくれる新機能ですね。

## やってみた

ClassicLinkは、VPCごとに有効にできるみたいですが、同じリージョンのVPCに限定されるみたいですね。

既存VPCの初期設定デフォルトは、Disabledです。

なので、VPCを選択して右クリックから、EnableClassicLinkを選択。

![スクリーンショット 2015-01-09 9.02.11.png](https://qiita-image-store.s3.amazonaws.com/0/18114/e7e0fcd4-ccc4-6404-ecef-745e587f5863.png "スクリーンショット 2015-01-09 9.02.11.png")

Yes, Enableで有効にします。

![スクリーンショット 2015-01-09 9.02.53.png](https://qiita-image-store.s3.amazonaws.com/0/18114/661f09ce-f344-5188-17f5-621eadb4ac61.png "スクリーンショット 2015-01-09 9.02.53.png")


次に、EC2-Classicインスタンスを右クリックして、ClassicLink　→　Link to VPCを選択。

![ClassicLinktoVPC.png](https://qiita-image-store.s3.amazonaws.com/0/18114/bec65f02-ee0e-fab3-949f-95ff0a6b52f9.png "ClassicLinktoVPC.png")


VPCを選ぶと、VPCのセキュリティグループ一覧が表示されますので、選択してLink to VPCを押します。

![LinktoVPCPopup.png](https://qiita-image-store.s3.amazonaws.com/0/18114/7b62c2ce-1cda-bc57-ff2f-4f0c07970351.png "LinktoVPCPopup.png")


これでClassicLinkの設定はおしまい。

次は、インスタンスにセキュリティグループを設定してプライベートIPで疎通させてみます。

## 疎通テスト

通信の確認として、EC2-ClassicのインスタンスのClassicLinkにはdefault VPCのセキュリティグループを設定し、VPC側のインスタンスにも同様のセキュリティグループを設定します。

セキュリティグループはこんなかんじです。

![DefaultSecutiryGroup.png](https://qiita-image-store.s3.amazonaws.com/0/18114/233468d3-4099-09e0-364a-b9fdcc3f2401.png "DefaultSecutiryGroup.png")

これで、同じセキュリティグループに属しているインスタンスであれば通信できる設定になります。


AWSマネジメントコンソールから確認すると、EC2-Classicのインスタンスには、ClassicLinkの項目に、先ほど設定したセキュリティグループが付いていることが確認できます。

通常のセキュリティグループとは別の所に表示されるようです。

![ClasscLinkSecurityGroup.png](https://qiita-image-store.s3.amazonaws.com/0/18114/81e2ecba-4862-e128-41aa-e72644366e5a.png "ClasscLinkSecurityGroup.png")


EC2-Classicにログインして、VPC側のインスタンスが持つプライベートIPにpingを飛ばすと返ってきた！

```terminal
       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2014.09-release-notes/
20 package(s) needed for security, out of 44 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-166-24-250 ~]$ ping 10.0.0.91
PING 10.0.0.91 (10.0.0.91) 56(84) bytes of data.
64 bytes from 10.0.0.91: icmp_seq=1 ttl=64 time=0.691 ms
64 bytes from 10.0.0.91: icmp_seq=2 ttl=64 time=0.484 ms
^C
--- 10.0.0.91 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1474ms
rtt min/avg/max/mdev = 0.484/0.587/0.691/0.106 ms
```

## まとめ

最近めっきり出番の減ったEC2-Classicですが、この機能によって通信が柔軟になったので利用出番が増えるかもしれませんね。
[Ruby]配列に対するメソッドまとめ


最初にお伝えします。これは私用メモです。
[jnchito様](http://qiita.com/jnchito/items/dedb3b889ab226933ccf)のを参考文献として引用させて頂きました。大変勉強になります。

numbers = [1, 2, 3]

##find  最初に見つかったものを返す

```
def find_admin(users)
  users.find(&:admin?)
end
// 1
```

##find_index  要素のインデックスを返す

```
def find_admin(users)
  users.find_index(&:admin?)
end
```

##select  条件に合うもの全てを返す

```
def find_admin(users)
  users.select(&:admin?)
end
```

##reject  条件に合わないものを全て返す

```
def find_admin(users)
  users.reject(&:admin?)
end
```

##count  条件に合う要素の数を返す

```
def count_admin(users)
  users.count(&:admin?)
end
```

##map ある配列から別の配列を作る

```
def user_names(users)
  users.map(&:name)
end
```

##compact  nil以外の要素を集める

```
numbers_and_nil = [1, 2, 3, nil, nil, 6]
only_numbers = numbers_and_nil.compact
//[1, 2, 3, 6]
```

##any?  最低でも一つ条件に合う要素があればtrueを返す

```
def contains_nil?(users)
  users.any?(&:nil?)
end
```

##all?  全ての要素が条件が合っている場合にtrueを返す

```
def contains_nil(users)
  users.all?(&:nil?)
end
```


##empty? 1件もなければtrueを返す

```
puts "empty" if users.empty?
```

##first/last  最初と最後の要素を返す

```
first_user = users.first
last_user = users.last
```

##sample  任意の要素を返す

```
users.sample
```


##each_with_index  eachでループしつつカウンタも同時に取得する

```
users.each_with_index |user, counter|
  puts ", " if counter > 0
  puts user.name
end
```

##join  配列を1つの文字列として返す

```
def numbers_text(numbers)
  numbers.join(",")
end
//[1, 2, 3] => "1, 2, 3"
```

##max/max_by  最大の要素を返す

```
def oldest_user(users)
  users.max_by(&:age)
end
```

##min/min_by  最小の要素を返す

```
def youngest_user(users)
  users.min_by(&:age)
end
```


##each_with_object  ループを回しつつ、別のオブジェクトを組み立ててそれを返す

```
def admin_names(users)
  users.each_with_object([]) do |user, names|
    names push.user.name if user.admin?
  end
end
```
SourceTree で鍵生成

Windows の SourceTree の場合

- Tools - Create or Import SSH Keys で PuTTY Key Generator が起動する
- 「Generate」をクリック
- 上の空白の領域でマウスを動かし続ける
- 「Key comment」に名前を入力
- 「Save private key」で秘密鍵を保存しておく
- 「Public key for pasting into OpenSSH authorized_keys file:」欄の値をリポジトリ管理者に設定してもらう

使用時
- Tools - Launch SSH Agent...
- システムトレイに pagent が起動するので、右クリック - 「Add Key」で先ほど保存した秘密鍵を開く
まだUIAlertViewとUIAlertControllerで使い分けで消耗してるの？


## 消耗

私は完全に消耗してました。
下記のような処理をあちこちに書き散らしそうになってましたね。

```
if(OS_VERSION <= iOS7) {
	// UIAlertView
} else {
	// UIAlertController
}
```

『この辺の処理を隠ぺいする独自のクラスを作ればいいじゃない』というモヒカン話なのですが、当方怠惰を愛するハッカー(笑)なので作りたくないです。

なので、私はRMUniversalAlertに移住することにしました。

https://github.com/ryanmaxwell/RMUniversalAlert

ありがてえ。

## 使い方

githubのUsageを見れば終わりです。
`tapBlock`という所で『○○がタップされたとき』の処理を書いてゆきます。
煩雑になりそうですね。

下記は自分で使った箇所のメモ。

アプリでTwitter連携したい、よくあるかと思います。
で、アカウント一覧をアクションシート上に表示してユーザに選択させるようなヤツが必要になったりしますよね。

```swift:Twitterアカウント一覧をシートに表示して選ばせるヤツ
let accountList = "ACAccountのArrayがあると想定"
let accountNameList = (accountList).map { (account) in
      account.username
}

RMUniversalAlert.showActionSheetInViewController(self, withTitle: "アカウント認証", message: "twitterアカウントを選択してください", cancelButtonTitle: "キャンセル", destructiveButtonTitle: nil, otherButtonTitles: accountNameList, tapBlock: {(alert, buttonIndex) in
        if (buttonIndex >= alert.firstOtherButtonIndex) {
          let index = buttonIndex - alert.firstOtherButtonIndex
          let selectedAccount = accountList[index]
		  AwesomeMode.instance.loginBy(selectedAccount)
        }
})
```

キャンセルとかは一切使わないので`tapBlock`ではアカウントが選択されたときの処理だけを書いてます。
で、アカウントのリストは人によって変化するので、タップされたときに`index`を出してあげて`accountList`から対象の`ACAccount`インスタンスを取ってきて何かしらの処理をするようにしました。

# 勉強になりました、シェアさせてください。
【Xcode】プロジェクトコピーのやり方。

ただいま初・Swiftで書いたアプリを作るべく悪戦苦闘しているのだが…
昨日あまりにも思いつきで機能を増やしすぎ…
ちょっと削ろうと思い始めたのだった。

プロジェクトコピーをして、現在の状態を保管しておこう。

kubouさんの<a href="http://kubou.net/archives/325" target="_blank"> XcodeのプロジェクトをコピーしてiOSアプリを複製する</a>が参考になった。
ありがとうございます。

ここで大事なことが…。

<b>書いてある順序をきちんと守る</b>

という、当たり前のことだった…。

たとえば
1. Finderで
oldディレクトリをコピーして、newにリネーム。
のところで
<b>この時点でnewにリネームするのはディレクトリ名のみ。</b>
ここで焦ってディレクトリ内のファイル名をリネームしたりするとうまくいかないので
ほんとうに、kubouさんの仰る通りの順序で臨んでいただきたい。
私はこれがわからず、前回3時間くらい無駄に費やすハメになったので。。。

みなさま、お互いにステキな開発ライフを。
Ansibleを使って、AmazonLinuxに最低限の初期化を行う

Ansibleを使って、AmazonLinuxに最低限の初期化をやってみました。

日本で利用しやすいように、最低限の初期設定とパッケージの更新を行っています。

## AMI

AmazonLinuxのAMIは以下を利用しました。

`amzn-ami-hvm-2014.09.1.x86_64-ebs (ami-4985b048)`


## 環境設定 (+ yum update)

言語と時刻の設定をします。

1. localeを変更 (ja_JP.UTF-8)
2. リポジトリの自動更新を止める(repo_upgrade: none)
3. 言語設定を変更(LANG=ja_JP.UTF-8)
4. タイムゾーンを変更(ZONE=Asia/Tokyo)
5. ローカルタイムを変更(Asia/Tokyo)
6. yum update

## playbook

playbookはこんな感じです。

gistはここに置いておきます。
 :octocat: https://gist.github.com/szkkentaro/c1dfe2bd8af9798c3571

```yaml:AmazonLinux.yml
# This playbook is for Amazon Linux
- hosts: Amazon Linux
  sudo: yes
  gather_facts: no
  vars:
    locale: ja_JP.UTF-8
    zone: Asia/Tokyo
    repo_upgrade: none
    zoneinfo_path: /usr/share/zoneinfo/Asia/Tokyo
  tasks:
    - name: set locale to /etc/cloud/cloud.cfg
      lineinfile: 'dest=/etc/cloud/cloud.cfg line="locale: {{locale}}"'
    - name: set repo_upgrade to /etc/cloud/cloud.cfg
      lineinfile: 'dest=/etc/cloud/cloud.cfg regexp="repo_upgrade\:" line="repo_upgrade: {{repo_upgrade}}"'
    - name: set locale to /etc/sysconfig/i18n
      replace: >
        dest=/etc/sysconfig/i18n
        regexp='^LANG=en_US\.UTF-8'
        replace='LANG={{locale}}'
    - name: set zone to /etc/sysconfig/clock
      replace: >
        dest=/etc/sysconfig/clock
        regexp='^ZONE=\"UTC\"'
        replace='ZONE="{{zone}}"'
    - name: set localtime
      file: >
        src={{zoneinfo_path}}
        dest=/etc/localtime
        state=link
        force=yes
    - name: yum update
      yum: state=latest name=*
```


## 実行

リモートから実行する方法もありますが、今回はサーバにansibleをインストールし、
playbookをgistから取ってきてローカルで実行するようにしました。


以下をUserDataをインスタンス起動時に設定すれば、実行されます。
ec2-userでログインしてからコピペして実行する場合は、sudo yum をお忘れなく。

1. aisibleのインストール
2. hostsファイルを作る
3. playbookをgistから取得
4. ansible-playbookを実行

```bash:user-data.txt
#!/bin/bash
yum install ansible -y --enablerepo=epel
echo -e "[Amazon Linux]\n127.0.0.1" > /tmp/hosts
curl -s https://gist.githubusercontent.com/szkkentaro/c1dfe2bd8af9798c3571/raw/AmazonLinux.yml -o /tmp/AmazonLinux.yml
ansible-playbook -i /tmp/hosts /tmp/AmazonLinux.yml --connection=local
```

## まとめ

AmazonLinuxをベースにAMI作ってる時に、あれ？あと何設定しとくんだっけ？ってよく忘れるので今回やってみました。

正直、User-dataに直接シェルスクリプトで書いたほうが早い気もします（気が向いたら作ります）が、
環境構築ツールをAnsibleに統一させる場合などは利用用途があるかもしれません。

お役に立てば幸いです。

## 追記

glibc更新により/etc/localtimeが変更されてしまうことへの対応として、/etc/sysconfig/clockのUTCをfalseに変更する設定を入れていましたが検証した結果いらなさそうなので、削除しました。

http://qiita.com/szk3/items/4cb2b91000432c74275d

必要という判断であればご自由に追加してご利用ください。

```yaml
    - name: set false to clock utc
      replace: >
        dest=/etc/sysconfig/clock
        regexp='^UTC=true'
        replace='UTC=false'
```