OmniAICreator/Qiita-1.07M huggingface dataset:
え、git pushしてtagをインクリメントしてCocoaPodsのpodspecを更新するのって手動でやってるんですか？

##更に後日
今は`pod repo push`使ってます。

##後日談
エラー処理とかちゃんと書いてなく激しくバギーでトラブルが発生した場合に逆に時間がかかるから今は手作業だよ！！！！

---

はい、手動でやってます。

数えた所ここ2ヶ月で100回程度更新しているので、1回1分計算でpodspecの更新にきっと100分くらい費やしていることになります。

<blockquote class="twitter-tweet" lang="ja"><p>pushしたらtagをインクリメントしてpodspecを更新して作業中のプロジェクトでpod updateまでしてくれる簡単な方法ないのかな・・・</p>&mdash; yusuga (@yusuga_) <a href="https://twitter.com/yusuga_/statuses/445789655636533248">2014, 3月 18</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

そんな疑問をつぶやいたところ

<blockquote class="twitter-tweet" data-conversation="none" lang="ja"><p><a href="https://twitter.com/yusuga_">@yusuga_</a> そういうのは地味なスクリプトを書くぐらい。</p>&mdash; もっさりさん (@TeamMOSA2) <a href="https://twitter.com/TeamMOSA2/statuses/445790217278980096">2014, 3月 18</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-conversation="none" lang="ja"><p><a href="https://twitter.com/yusuga_">@yusuga_</a> 入門bash</p>&mdash; ふぐ (@tenchu0314) <a href="https://twitter.com/tenchu0314/statuses/445790476910600193">2014, 3月 18</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

という諸先輩方の温かいご助言がありましたが、bashを書いたことないので

	bashのお作法を覚える > Objective-Cで書く

という結論からObjective-Cで[upspec](https://github.com/yusuga/upspec)を作りました。UNIX実行ファイルが出来上がります。

##いくつかの前提
- 僕は汎用ライブラリは[GitHub](https://github.com/yusuga/podspec)で、プライベートなライブラリは別サーバで管理しています。
- なので本家のCocoaPods/Specsの話ではないですよ

```
├── podspec
    └── project1
        └── 0.0.1
            └── project1.podspec
        └── 0.0.2
            └── project1.podspec        
    └── project2
        └── 0.0.1
            └── project2.podspec
├── project1
└── project2
```
ローカルはこんなディレクトリ構成で運用しています。

- podspecでバージョンを上げるだけの本当に単純な更新の話です。

出来ること(※上記フォルダ構成)
---

1. project1で必要なcommitを全て済ます
2. project1で`upspec`を実行

すれば

1. project1にgit tag 0.0.3を追加
2. project1をgit push
2. podspec/project1/0.0.3/project1.podspecを生成(0.0.2のコピー)
3. podspec/project1/0.0.3/project1.podspecのs.versionを0.0.3に更新
4. podspecをgit push

が実行されます。

導入方法
---
1. [upspec.xcodeproj](https://github.com/yusuga/upspec)をビルド
2. `upspec/upspec/Build/Products/Debug/`に`upspec`というUNIX実行ファイルが出来てるのでそれを`/usr/bin`とかパスが通っているところに適宜置く

課題
---
- 今作業しているプロジェクトでのpod updateまで行いたかったのですが、複雑になりすぎるので諦めました。(実装が複雑というか運用し辛い場面が多そう)
- ビルドした後のUNIX実行ファイルを'/usr/bin'に直接置く方法がわからなかった。([ここ](http://d.hatena.ne.jp/white_wheels/20110811/p2)を参考に試してみたけどDebugとかReleaseをディレクトリを作成しないって出来るのかな・・・)

bashのスゴイ人へ
---
これbashを熟知してる方だったらどれくらいで書けるものなんでしょうね。僕はbashの各コマンドやら正規表現とかを調べるならFoundation.frameworkを使った方が早いと思った次第です。全部で4時間くらいかかりました。(結局bashを調べなきゃダメだったし、OS XとiOSとの違いでつまづいた所も・・・)

あと400回podspecを更新すれば元が取れる計算です。

よくありそうな質問
----
- そもそもpodspecってそんな更新しないよね

		そうなんですか？(；´Д｀)
		僕はversionだけ更新することすごい多いんですが・・・

- こんなディレクトリ構成で運用してねぇよ

		・・・コードを書き換えて下さい(；´Д｀)

- s.version決め打ちにしてるよね、などなど

		・・・コードを書き換えて下さい(；´Д｀)

免責事項
---
一応書いておきますが、[upspec](https://github.com/yusuga/upspec)の使用によって生じる損害の責任は負いませんので、使用は **自己責任** でお願いします！
MySQLでゼロ除算すると結果はNULLになる


NULLに首をひねるの巻

集計関数の中身でゼロ除算をしていた箇所でNULLっていた

```
$ mysql -e 'select 1/0;'

+------+
| 1/0  |
+------+
| NULL |
+------+

```

この場合ってのは「NULL(失われた情報)」のどれにあたるんでしょうか
http://codezine.jp/article/detail/532
ふたつの Iterator を LINQ で、そして LINQ を Java にも


* [ふたつのIterator - プログラマーの脳みそ](http://d.hatena.ne.jp/Nagise/20140315/1394884271)

を拝見しました。

コメントで「Zip じゃん」というのがあり、「確かに！」と思ったのでやってみました。

## C＃ の場合

```csharp:
// using using System.Linq;

var arr1 = new int[] { 1, 2, 3, 4, 5 };
var arr2 = new string[] { "hoge", "fuga", "piyo" };

arr1.Zip(arr2, (x, y) =>  new {x, y})
    .ToList()
    .ForEach(Console.WriteLine);
```

#### 結果

```
{ x = 1, y = hoge }
{ x = 2, y = fuga }
{ x = 3, y = piyo }
```

うむ、シンプル。要素数が違ってても少ない方に合わせてくれます。

## Java7以前 の場合

[reactive4java](https://code.google.com/p/reactive4java/) というライブラリがありまして、これは Java で Reactive Extensions を実現するライブラリなのですが、LINQ的な機能が ``Interactive`` というクラスで提供されています。

これを使うと Zip ができます。

```java:
//import hu.akarnokd.reactive4java.base.Func2;
//import hu.akarnokd.reactive4java.interactive.Interactive;

Iterable<Integer> array1 = Arrays.asList(1, 2, 3, 4, 5);
Iterable<String> array2 = Arrays.asList("hoge", "fuga", "piyo");

Iterator<Pair<Integer, String>> zippedIter = 
		Interactive.zip(array1, array2, 
				new Func2<Integer, String, Pair<Integer, String>>() {
	@Override
	public Pair<Integer, String> invoke(Integer x, String y) {
		return new Pair<Integer, String>(x, y);
	}
}).iterator();

while (zippedIter.hasNext()) {
	Pair<Integer, String> p = zippedIter.next();
	Log.d("StartupActivity", String.format("x=%d, y=%s", p.first, p.second));
}
```

ああ、Android で試したので ``Pair`` とか使ってしまった。
普通の Java の場合は自作の Tuple などに置き換えを。

#### 結果

```
x=1, y=hoge 
x=2, y=fuga 
x=3, y=piyo 
```

C# より冗長ですけど、いい感じで利用できるのではと思います。

reactive4java が Java8 のラムダ式に対応してくれると、上のコードはもっと簡潔に書けます。

[Reactive4Java8](https://code.google.com/p/reactive4java/wiki/Reactive4Java8) にて、対応してる感じが見られますが、[Top ページ](https://code.google.com/p/reactive4java/) によると、どうやら、「reactive4java の開発は終了し、[RxJava](https://github.com/Netflix/RxJava) の開発に参加するつもりだ」みたいなことが書いてあります。

また、RxJava でなく reactive4java を使う利点として、``Interactive`` 機能群の存在を挙げています。
単純に LINQ 的な機能を Java7以前 で使いたいならば、 reactive4java はまだまだ役に立つと思います。

## Java8 の場合

* [Java8のStreamを使いこなす - きしだのはてな](http://d.hatena.ne.jp/nowokay/20130504) ※2013年5月の記事

では、「``Streams.zip`` があるよ」と書いてあって「おお！」と思ったのですが、[リリースされた JDK8 のドキュメント](http://docs.oracle.com/javase/8/docs/api/index.html) を見たら、このクラスは見つからず…(``java.util.stream.Stream`` にも無く)。開発の過程で無くなってしまったのでしょうか、残念。。。


最後に、もしあなたが Android 開発をしていて、Java の冗長さに嫌気がさしているなら、[**Xamarin へどうぞ**](http://xamarin.com/csharp)
配列から指定した内容の要素を削除する

何番目の要素を削除とかはよくあるけど、指定した内容の要素を削除というサンプルがなかったので簡単だけど書いてみる。

```pl
use strict;
use warnings;

my @lst = qw( foo bar baz );
print "@lst\n";
# foo bar baz

@lst = grep $_ ne "bar", @lst;
print "@lst\n";
# foo baz 
```

grep関数で正にならないものを返すだけだが、別にgrepの引数は正規表現でなくていいことを以外とみんな知らない。
WPFのコントロールの座標を取得する方法

WPFのコントロールには、Left や Top といったコントロールの座標を示すプロパティが存在しません。（※Windowには存在します）

画面に対する座標であれば、Visualクラスのメソッドに、Visual オブジェクトの座標系を画面座標系に変換する `Visual.PointToScreen`メソッドに、原点の座標を渡すことで間接的にコントロールの座標を取得することができます。

```csharp
// control の左上隅の座標を取得する
Point pt = control.PointToScreen(new Point(0.0d, 0.0d));
```

**親コントロールに対する座標が必要な場合、自分と親のそれぞれの画面座標を取得しその差分より算出すれば可能かな？**
WPFでの印刷の基本(2) 複数ページの印刷

# 複数ページの印刷

[前回](http://qiita.com/hugo-sb/items/133e9b6bcbcaa6c07d63) のコードを元に複数ページの印刷を行うように修正したコードを以下に示します。

デフォルトプリンターにA4縦で3ページ分、左上隅から100x100ピクセルの位置にページ番号を印刷するサンプルです。

```csharp
// 複数ページの印刷
private void PrintMultiPage()
{
    LocalPrintServer lps = new LocalPrintServer();
    PrintQueue queue = lps.DefaultPrintQueue;
    XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(queue);
    PrintTicket ticket = queue.DefaultPrintTicket;

    // 用紙サイズの設定
    ticket.PageMediaSize = new PageMediaSize(PageMediaSizeName.ISOA4);
    ticket.PageOrientation = PageOrientation.Portrait;

    // FixedDocument の生成
    FixedDocument doc = new FixedDocument();

    for (int i = 0; i < 3; i++)
    {
        FixedPage page = new FixedPage();
        Canvas canvas = new Canvas();
        TextBlock tb = new TextBlock();
        tb.Text = string.Format("{0}ページ", i + 1);
        tb.FontSize = 24;
        Canvas.SetTop(tb, 100);
        Canvas.SetLeft(tb, 100);
        canvas.Children.Add(tb);
        page.Children.Add(canvas);

        PageContent pc = new PageContent();
        pc.Child = page;
        doc.Pages.Add(pc);
    }
    writer.Write(doc, ticket);
}
```

`LocalPrintServer`を生成し、`PrintQueue`および`XpsDocumentWriter`を取得、`PrintTicket`で用紙サイズ等を設定し、印刷データを`XpsDocumentWriter`を利用してキューの書き込むというプログラムの構造は単一ページの場合と同一です。

単一ページの印刷と異なるのは、`XpsDocumentWriter`を利用して書き込む印刷データの部分のみとなります。

共通部分の説明は[前回](http://qiita.com/hugo-sb/items/133e9b6bcbcaa6c07d63)を参照してください。

## FixedDocumentの生成

単一ページの印刷の場合、ページを表す`FixedPage`オブジェクトを生成、そのままプリントキューに書き込んでいましたが、複数ページにまたがる印刷を行う場合、ページの集合である文書を表す｀FixedDocument`というクラスを利用します。

インスタンスの生成は普通に`new`するだけです。

```csharp
FixedDocument doc = new FixedDocument();
```

## ページデータの追加

`FixedDocument`は`FixedPage`のコレクションを保持します。印刷に必要なページ数分、`FixedPage`オブジェクトを作成、`FixedDocument`の追加してやります。

```csharp
for (int i = 0; i < 3; i++)
{
    FixedPage page = new FixedPage();
    Canvas canvas = new Canvas();
    TextBlock tb = new TextBlock();
    tb.Text = string.Format("{0}ページ", i + 1);
    tb.FontSize = 24;
    Canvas.SetTop(tb, 100);
    Canvas.SetLeft(tb, 100);
    canvas.Children.Add(tb);
    page.Children.Add(canvas);

    PageContent pc = new PageContent();
    pc.Child = page;
    doc.Pages.Add(pc);
}
```

このサンプルでは単純に`for`で3回ループさせて３ページ分の`FixedPage`を作成・追加しています。

**`FixedPage`を`FixedDocument`に追加する方法ですが、`FixedDocument.Pages`に直接追加することができません。一旦、`PageContent`オブジェクトでラップしてやる必要があります。**

## 印刷の実行

`FixedDocument`の作成が終われば、`XpsDocumentWriter`の`Write`メソッドにオブジェクトを渡してやれば印刷が実行されます。

```csharp
writer.Write(doc, ticket);
```
Kiwiを試す

cocoapodsをインストールする

```
gem install cocoapods
```

Inside the project’s directory, generate the pod file:

```
pod init
```

まずは、xcodeで何かしらプロジェクトを作る
その後、プロジェクトフォルダの直下に移動し

以下ファイルを作成

```
server:プロジェクト名 shiratsu$ cat Podfile
platform :ios, '7.0'

# Add Kiwi as an exclusive dependency for the AmazingAppTests target
target :プロジェクト名Tests, :exclusive => true do
   pod 'Kiwi'
end

# If you're using Xcode 5 with a brand new project
# (XCTest based instead of OCUnit based) use this instead:
target :プロジェクト名Tests, :exclusive => true do
   pod 'Kiwi/XCTest'
end
```

```
pod install
```

を実行

open プロジェクト名.xcworkspace

これで,kiwiが使えるようになってます

テストケース

```
#import <XCTest/XCTest.h>
#import "Kiwi.h"

SPEC_BEGIN(MathSpec)

describe(@"Math", ^{
    it(@"この計算式は合っておる", ^{
        NSUInteger a = 16;
        NSUInteger b = 26;
        [[theValue(a + b) should] equal:theValue(42)];
    });
});

SPEC_END

```
CocoaPodsの導入メモ


# CocoaPodsのインストール

rbenv gemset使っているので、`sudo`はしない

```bash
gem install pod
```

# Podfileの作成

projectファイルと同じ場所に、Podfileを作成する
[CocoaPodsのXcode拡張](https://github.com/kattrali/cocoapods-xcode-plugin)を入れとくと便利かもしれない。

![pods.png](https://qiita-image-store.s3.amazonaws.com/0/15699/8f70b3cc-8a39-74ad-1f15-eeea5ef5a51e.png "pods.png")

```ruby:Podfile
platform :ios, '5.0' # 明示的にバージョンを書かないと、4.3扱いになるみたい

pod "GoogleAnalytics-iOS-SDK",  '~> 3.0.3'
```


# podsのインストール

Podfileの場所に移動して、`pod install` するだけ

### overrides the ... 対応

インストールの際に、以下の警告が出たので対応する。

```bash
[!] The target `xxx [Debug]` overrides the `HEADER_SEARCH_PATHS` build setting defined in `Pods/Pods.xcconfig'.
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

[!] The target `xxx [Release]` overrides the `GCC_PREPROCESSOR_DEFINITIONS` build setting defined in `Pods/Pods.xcconfig'.
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.
```

おそらく、自分のプロジェクトのターゲットのbuild settingが、
Podsのターゲットのbuild settingを上書きしている模様。

自分のプロジェクトのbuild settingは弄りたくないので、
$(inherited)をHEADER_SEARCH_PATHSと、GCC_PREPROCEESSSOR_DEFINITIONSに追加した。

参考:

* [公式FAQ](http://guides.cocoapods.org/using/troubleshooting.html) Using the CocoaPods Projectの1
* [The target … overrides the `OTHER_LDFLAGS` build setting defined in `Pods/Pods.xcconfig](http://stackoverflow.com/questions/18376416/the-target-overrides-the-other-ldflags-build-setting-defined-in-pods-pods)

# Git関連の設定

どのファイルをGitで管理して、どれをignoreに追加するのか？
とりあえず、bundlerと同じなら、PodfileとPodfile.lockのみ
リポジトリに追加して、他は全部gitignoreに入れれば良いはず。

GitHubにある、[Objective-Cのgitignore](https://github.com/github/gitignore/blob/master/Objective-C.gitignore)だと、CocoaPods関連はPodsのみ入っているので、そのまま利用した。
Mac On CDH Hadoop



# 前提条件
- JDK1.7インストール済み
- brewインストール済み


# tap追加

```
$ brew tap hammer/cdh
```

# HDFS/MapReduceインストール

```
$ brew install cdh-hadoop
$ brew install cdh-mr1
```

# localhostへの鍵認証

```
systemsetup -f -setremotelogin on
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
for host_id in localhost 0.0.0.0; do
  ssh-keyscan $host_id >> ~/.ssh/known_hosts
done
```

# DFS起動

```
$ `brew --cellar`/cdh-hadoop/4.2.1/bin/hdfs namenode -format
$ `brew --cellar`/cdh-hadoop/4.2.1/libexec/sbin/start-dfs.sh
$ jps
```


# MapReduce起動

```
$ export HADOOP_MAPRED_HOME=`brew --cellar`/cdh-mr1/4.2.1/libexec
$ `brew --cellar`/cdh-mr1/4.2.1/bin/start-mapred.sh
$ jps
```


# HDFSテスト

```
`brew --cellar`/cdh-hadoop/4.2.1/bin/hadoop fs -mkdir input
`brew --cellar`/cdh-hadoop/4.2.1/bin/hadoop fs -put `brew --cellar`/cdh-mr1/4.2.1/libexec/conf/*.xml input
```


# MapReduceテスト

```
$ `brew --cellar`/cdh-mr1/4.2.1/bin/hadoop jar `brew --cellar`/cdh-mr1/4.2.1/libexec/hadoop-examples-2.0.0-mr1-cdh4.2.1.jar grep input output 'dfs[a-z.]+'
```
[PureData]GUI のデバッグに Tcl Prompt を使う

Pd の Tips をお送りしています。

前回 pd に FUDI メッセージを送る方法を見たので
今回はコマンドライン繋がりで、pd-gui にコマンドを送る方法を見てみます。pd-gui は、Pd の画面(フロントエンド)と思ってもらえればとりあえず十分です。

※ Tcl Prompt の存在を Pd パッチングサークルで教えていただいたので、これを使って流せるコマンドを調べてみました、というのが今回の記事の経緯です。

#### Tcl Prompt (ティクルプロンプト)

コンソールの一番下にあるアレです。
ここに適当な Tcl スクリプトを書いてやると、pd-gui の関数を呼び出したり、画面設定を変更することができます。

![Screen shot 2014-03-18 at 20.49.20.png](https://qiita-image-store.s3.amazonaws.com/0/8510/f8f1f9ed-1893-dfd5-fa84-4772f3a41233.png)

なお、Pd-vanilla ではデフォルトで非表示になっており、メニューから `Help > Tcl Prompt` を選択すると利用できるようになります。

もしくは、pd-gui のソースを改変するという手もあります。
以下のコメントアウトを解除する。

```pdwindow.tcl
proc ::pdwindow::create_window {} { 
   ... (中途略)
#    create_tcl_entry
}
```

#### pd-gui

肝心の入力内容。実行中の pd-gui プロセスに対して、Tcl/Tk のスクリプトを実行させることができます。

- 画面の色を変える(Pd-Extendedのみ)
`set ::canvas_fill "blue"` と入力して新規ウィンドウ作成

- コンソールをクリアする
`menu_clear_console`

- コンソールにポスト
`pdtk_post "abc"`

pd-gui は Pd のフロントエンドにあたるプロセスで、Tcl/tk (ティクルティーケー)というスクリプト言語で書かれています。

GUIを書く方法は色々あるのですが、Pd の場合は特にビジュアルフロープログラミングということで、ドロー系のエディタ的な挙動が必要ということもあり、少ないコード量で柔軟にGUIを書くことができる Tcl/Tk を採用しているようです。
npm のローカルモードでインストールした実行モジュールにパスを通す設定


**[2015.06.26 追記]**

１年以上前に書いた情報で、情報入手元としてリンクしてあったURLが404になってしまっているようですね。
新しい情報入手元には [npm Webサイトの Display npm bin folder](https://docs.npmjs.com/cli/bin) を参考にするのがいいと思います。

以前のページには "実行モジュールインストール先のパス" が書いてありましたが、新しいリンク先では "各々の環境での実行モジュールインストール先のパスの調べ方" が書いてあります。

そんな訳で実行モジュールのインストール先は `npm bin` の結果をもって読み替えていただくといいと思います。

**-- 追記ここまで --**
　


実は Node.js はほとんど使っていないのですが、less だったり Yeoman だったりといった npm でインストールするものを使いたいときがあります。

そのとき npm install -g piyopiyo とグローバルモードでインストールする場合は、インストールするだけで不自由なく使える事が多いのですが、ローカルモードでインストールしたときは各実行モジュールのパスを手動で追加するのか、、？という点で困った & 解決したのでそのメモです。

※ このメモは OS が OSX or FreeBSD の前提です。

## さいしょに結論

お使いのシェルの設定ファイルで、PATH の指定に以下のような行を追加。
私は zsh で .zshenv に PATH の設定を書いているので、${HOME}/.zshenv を編集しました。

```zsh:.zshenv
if [ -d ${HOME}/node_modules/.bin ]; then
	export PATH=${PATH}:${HOME}/node_modules/.bin
fi
```

そして設定ファイルを再読み込み。

```:zsh
zsh% source ~/.zshenv
```



## グローバルモードでインストールすると

npm は -g オプションをつけるとグローバルモードになって、/usr/local/（もしくは prefix で指定したディレクトリ）以下の環境へインストールしてくれるそうで。

+ モジュール自体は --> /usr/local/lib/node_modules/ の下へ
+ 実行モジュールは --> /usr/local/bin/ の下へ

それぞれ配置されてます。

元々、実行モジュールのインストール先　/usr/local/bin/ にパスを通してあるので、-g オプションをつけてインストールした後は何もせずともコマンドが実行できます。


## ローカルモードでインストールすると

-g オプションをつけずに、npm install piyopiyo などとした場合、カレントワーキングディレクトリの下にインストールしてくれるそうで。
たとえばホームディレクトリ /home/mydir でインストールをした場合、

+ モジュール自体は --> /home/mydir/node_modules/ の下へ
+ 実行モジュールは --> /home/mydir/node_modules/.bin/ の下へ

それぞれ配置されます。

.bin/ の存在を知るまで、各 /homemydir/node_modules/*/bin/ へパスを通さないと使えないのだと思っていました。
そしてインストールした npm モジュールが複数になってきたあたりで「あれ、、、これ面倒じゃない？」という事態が起きてました。


## 参照するところ／気をつけること

[npm のWebサイト](https://www.npmjs.org/doc/npm.html) に実行モジュールのインストール先についての説明があるのでご一読を。

そしてこの設定を有効活用するには、「ローカルモードでインストールするときはホームディレクトリでインストールする」必要があります。

諸事情で別のディレクトリへインストールするのであれば、そこの .bin へパスを通すことになると思います。
※　今のところ予定はないけど、nodebrew でバージョン管理をしだしたりするとどうなるんだろう。。


## このメモを書いたときの手元の環境

参考までに。

**Mac**
+ OS X 10.9.2 
+ npm 1.3.24

**FreeBSD**
+ FreeBSD 9.1
+ npm 1.1.62
Pythonでcronからの二重起動を防止する

掲題の通りです。ドンピシャなサンプルがなかったのでメモ代わりに。

すでにプロセスが存在した場合は何もしない設計です。cronからだとこの動作が好ましい場合が多いかと思います。

```py
import fcntl

lockfilePath = 'lockfile.lock'
with open(lockfilePath , "w") as lockFile:
    try:
        fcntl.flock(lockFile, fcntl.LOCK_EX | fcntl.LOCK_NB)
        # Do SOMETHING
    except IOError:
        print('process already exists')
RestKit使ったデータ取得


### 概要
* ObjectManagerというにdescriptorを追加して利用する。
* descriptorには、どのパスから受け取ったデータをどうモデルにマッピングするかを定義している

### ObjectManagerにdescriptorを追加

* ``RKObjectManager``を継承したオブジェクト(ex. ``WTDObjectManager``)をinitするタイミングで、descriptorを追加している。

```
- (instancetype)init
{
    self = [super initWithHTTPClient:[AFHTTPClient new]];
    if (self) {
        // add descriptor
    }
    return self;
}
```
* descriptorには、``addResponseDescriptorsFromArray``と``addRequestDescriptorsFromArray``があって、前者が受け取るデータを後者が送信するデータをマッピングしている。

```
[self addResponseDescriptorsFromArray:@[]];
[self addRequestDescriptorsFromArray:@[]];

```

### descriptorの作り方
* descriptorの作り方は、以下のようにマッピングのルールとリクエストのmethodとpathとkeyPathとstatusCodeを設定する。

```
[RKResponseDescriptor responseDescriptorWithMapping:responseMapping
                                                  method:RKRequestMethodGET
                                             pathPattern:kAPIPath
                                                 keyPath:kAPIResponseKeyPath
                                             statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]
```

* keyPathは、以下のようなuser jsonをuser modelにマッピングするとき、``data``と設定する

```
{
   data: {
      user : {
          id : "1",
          name: "rei kubonaga",
      }
   }
}
```

* mappingについては、モデルに定義すると分かりやすい。``RKObjectMapping``の``mappingForClass``を利用する。

```
@implementation User

+ (RKObjectMapping *)responseMapping
{
    RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[self class]];
    [mapping addAttributeMappingsFromDictionary:@{
                                                  @"id":                           @"userID",
                                                  @"name":                         @"name",
                                                  }];
    return mapping;
}

@end
```

### 参考ページ
* https://github.com/RestKit/RestKit/
KeepAlivedの管理コマンドとか

厳密にいうと、ipvsコマンドなのかもしれない。。。有事の際にいちいちコマンドを忘れてしまうのでメモしておきます

## KeepAlived とは？

### LVS と組み合わせて使う、ロードバランサデーモンのこと

keepalived は二つの役割を持っています

* LVS でロードバランスしているリアルサーバーのヘルスチェック

* 仮想IP（VRRP） を用いた LVS 自身の冗長化


keepalived = LVS ではないので注意してください！keepalivedは、LVSとVRRPを効率よく管理くれるツールみたいなもの認識でＯＫ

## LVSの状態を確認する

```
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.20.50:3306 rr
  -> 192.168.20.21:3306           Route   10     0          0         
TCP  192.168.20.51:3306 rr
  -> 192.168.20.21:3306           Route   10     0          0         
TCP  192.168.20.52:3306 rr
  -> 192.168.20.24:3306           Route   10     0          0         
TCP  192.168.20.53:3306 rr
  -> 192.168.20.26:3306           Route   10     0          0         
TCP  192.168.20.54:3306 rr
  -> 192.168.20.22:3306           Route   10     7          0 
```

## lvs配下の、リアルサーバの重みを変更する

```
ipvsadm -e -t [VIPアドレス]:[ポート] -r [リアルアドレス] -g -w [重み] 
```

## 対象のVIP配下に、リアルサーバを新規参戦させる

```
ipvsadm -A -t [VIPアドレス]:[ポート] -r [リアルアドレス] -g -w [重み] 
```

## VIP配下の、リアルサーバを削除する

```
ipvsadm -d -t [VIPアドレス]:[ポート] -r [リアルアドレス]
```
msysGitのbash/sshでUTF-8の入出力が可能な理由

Windows上のGitで日本語ファイル名やコミット文が扱える、とかいうので2012年に話題になったっぽいですが、その副作用でsshなんかでもUTF-8の入出力が可能になっています。

何があったかは下記参照。
http://osdir.com/ml/msysgit/2013-09/msg00048.html

msys-1.0.dll(Cygwinでいうcygwin1.dll)内で対応されているので、これにリンクされてるバイナリのコンソールの入出力は基本UTF-8で動くことになっている模様。
コンソールの入出力はUTF-16とUTF-8の変換になっててサロゲートペア非対応とか書いてある。
パッチを見る限りはコンソール入力をUnicodeとみなして、UTF-8に変換しているみたい。
出力はどうなってるんだろうこれ。

今のWindowsは、システム内部ではUnicode（UTF16,CP1200）になっているのだけど、日本語Windowsでは表層に現れる文字列はShift_JIS(CP932)だったりするんで、そのへんの変換にシステムのコードページを使ったりするはず。
なんで、chcp 65001とかすると理屈ではUTF-8で入出力するんだとおもうんだけど、入力がダメなんだよな。

minttyだとローカルのlsで文字化けして、ckwではしてなかったんだけど、minttyではutf-16をutf-8と思って処理してるからかなと。

そんなわけで、msysGit以外のmsys-1.0.dllを消すと幸せになれる気が、したんだけど、[どうもだめっぽい](http://takanosho.wordpress.com/2012/04/12/git-utf8-input-japanese/)。えー。


こんな感じ
============

MinGWのbashでLANG=ja_JP.UTF-8なホストにssh接続した時

![mingw.png](https://qiita-image-store.s3.amazonaws.com/0/37937/9059a244-cce6-7929-5245-6371ce547d7a.png)

msysGitのbashの場合

![msysgit.png](https://qiita-image-store.s3.amazonaws.com/0/37937/faa57bff-aee0-acf9-f828-637398d1a527.png)
springで動くrails consoleでRAILS_ENVを指定する


# 事例

`rails c -e test`

としても、ENV["RAILS_ENV"]はtetstになっているが、データベース接続がdevelopで設定した先になっていたりする。



# 対応

`RAILS_ENV=test rails c`

データベースもtestで設定した先になっていることが確認できる（はず）

`rails c test`でもいいっぽい
色々なサービス、ソフトウェアのコミュニティ

- [Travis CI 日本語コミュニティ](https://www.facebook.com/groups/737947462901882/)
- [SendGrid 日本語コミュニティ](https://www.facebook.com/groups/702975083070507/)
- [NewRelic 日本語コミュニティ](https://www.facebook.com/groups/471639719613591/)
- [CloudFlare 日本語コミュニティ](https://www.facebook.com/groups/1396203363970226/)
- [Chef 日本語コミュニティ](https://www.facebook.com/groups/287834768030173/)
- [Atom.io 友の会](https://www.facebook.com/groups/1408474062754795/)
Javaを用いた平均値の出し方　高校数学Ⅰ

```java:SampleCode

package Sample5;

import java.util.Scanner;

public class Sample39 {
	public static void main(String[] args){
		
		Scanner scan = new Scanner(System.in);
		
		System.out.println("平均値を求めます");
		System.out.println("データの個数を入力してください");
		
		int a = scan.nextInt();
		
		double[] num = new double[a]; //　入力した数値を要素の個数として定義する
		double sum = 0.0;
		for(int i = 0; i < num.length; i++){
			System.out.println((i + 1) +"個めのデータを入力してください");
			num[i] = scan.nextDouble();
			
		}
		
		for(int i = 0; i < num.length; i++){
			sum += num[i];  //入力された総和を求める
			
		}
		
		System.out.println("平均点は "+ (sum/num.length)+ " 点です");
		scan.close();
	}

}

```


データの個数は整数でそれ以外は小数も可です
※分数は未確認
【WordPress】サイドバーのリンクリストを固定ページとして作成する

リンク一覧などのパーツを固定ページとして作成して、それをサイドウィジェットで表示する方法です。
少し回りくどい方法ではありますが、サイト管理者ができるだけ簡単にコンテンツの更新をするために、固定ページで編集できるこの手法を選びました。

#ウィジェットを作成する
functions.phpに以下のように追記し、ウィジェットを追加します

```php:functions.php
if(function_exists('register_sidebars')) {
    register_sidebars(4, array('name' => 'サイドウィジェット%d'));
}
```

[【WordPress】複数のサイドウィジェットを定義する](http://qiita.com/hyperkinoko/items/40aa2421f651a1d4457e)

#PHP Codeプラグインをインストール
テキストウィジェットにphpコードを書くことができるようになります。
[PHP Code Widget](http://wordpress.org/plugins/php-code-widget/)

#PHPCodeを使ってウィジェットの中にコードを埋め込む
![ウィジェットにコードを埋め込む](http://f.cl.ly/items/3Z1F453E0v331z37361e/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202014-03-18%2019.22.30.png)

ウィジェットに[PHP Code]を追加し、以下のように書き込みます。

```php:
<?php
$page_id = 00;//数字は表示する固定ページのID
$page = get_post($page_id, 'OBJECT', 'raw'); //ページの情報をOBJECT形式で受け取る
echo apply_filters('the_content', $page->post_content); //ページの本文をフィルターフックで整形して出力
?>
```

#表示したいところでdynamic_sidebar()を呼び出す

```php:
<?php if(!function_exists('dynamic_sidebar') || !dynamic_sidebar(4)): ?>
	<p>ウィジェットの作成に失敗しました</p>
<?php endif; ?>
```
Bitcoin採掘マシーン ASICMiner Blade Erupter の設定方法

以下に移行しました<br><a href="http://block-chain.jp/tech/asicminer-blade-erupter/" title="Bitcoin採掘マシーン ASICMiner Blade Erupter の設定方法">Bitcoin採掘マシーン ASICMiner Blade Erupter の設定方法</a>
Macのコンテキストメニューをリフレッシュする

右クリックのメニューがよく重複して表示されたりする現象の解消方法。
よく忘れるので覚書。以下をターミナルで実行。

# メニューの再構築とFinderの再起動

## コンテキストメニューの再構築

```bash
$ /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -r -domain local -domain system -domain user
```

## Finderの再起動

```bash
$ killall Finder
```

# 1行で(コピペ用)

```bash
$ /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -r -domain local -domain system -domain user && killall Finder
```
apt-get installする前にバージョンや変更点(changelog)を見る

# インストールされるバージョンを見る

```console
% apt-cache policy nginx
nginx:
  インストールされているバージョン: (なし)
  候補:               1.1.19-1ubuntu0.6
  バージョンテーブル:
     1.1.19-1ubuntu0.6 0
        500 http://jp.archive.ubuntu.com/ubuntu/ precise-updates/universe amd64 Packages
     1.1.19-1ubuntu0.5 0
        500 http://security.ubuntu.com/ubuntu/ precise-security/universe amd64 Packages
     1.1.19-1 0
        500 http://jp.archive.ubuntu.com/ubuntu/ precise/universe amd64 Packages
```

候補(Candidate)の行に書かれたパッケージが、今apt-get installしたときにインストールされるバージョン。

# パッケージの更新履歴を見る

上記のCandidateのパッケージのchangelogを表示する。

```console
% apt-get changelog nginx
nginx (1.1.19-1ubuntu0.6) precise-proposed; urgency=low

  * Enable building of the http_stub_status_module in nginx-naxsi, which was
    apparently not marked for compiling even though it's listed in the package
    description.  (LP: #1170586)

 -- Thomas Ward <teward@ubuntu.com>  Fri, 31 Jan 2014 11:02:23 -0500

nginx (1.1.19-1ubuntu0.5) precise-security; urgency=low

  * SECURITY UPDATE: ACL bypass via space character (LP: #1253691)
    - debian/patches/cve-2013-4547.patch: modify src/http/ngx_http_parse.c
      to account for a space character, fixing an issue which could result in
      security restrictions being bypassed
    - CVE-2013-4547

 -- Thomas Ward <teward@ubuntu.com>  Thu, 21 Nov 2013 13:02:22 -0500
(省略)
```

# パッケージの詳細を見る

なお、細かく Depends とか見たければ apt-cache show が使える。

```console
% apt-cache show nginx                                                          <18:10>
Package: nginx
Priority: optional
Section: universe/web
Installed-Size: 85
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Kartik Mistry <kartik@debian.org>
Architecture: all
Version: 1.1.19-1ubuntu0.6
Depends: nginx-full | nginx-light
Filename: pool/universe/n/nginx/nginx_1.1.19-1ubuntu0.6_all.deb
Size: 5886
MD5sum: de2fd98b4d0ed9d7cf2367fb94cdb958
SHA1: d66ba022ca8e842754e5cfc718e96036bbaef8e6
SHA256: b690e0b569023141a577200612e6b2880ddc795ad7051e648bcdc1da0a790701
Description-en: small, but very powerful and efficient web server and mail proxy
 Nginx (engine x) is a web server created by Igor Sysoev and kindly provided to
 the open-source community. This server can be used as standalone HTTP server
 and as a reverse proxy server before some Apache or another big server to
 reduce load to backend servers by many concurrent HTTP-sessions.
 .
 This is a dummy package that selects nginx-full by default, but also can be
 installed with nginx-light for upgrading to nginx-light directly.
Homepage: http://nginx.net
Description-md5: c71c42a7e7b75f4b7b417a4547f32b56
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Origin: Ubuntu

Package: nginx
Priority: optional
Section: universe/web
Installed-Size: 84
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Kartik Mistry <kartik@debian.org>
Architecture: all
Version: 1.1.19-1ubuntu0.5
Depends: nginx-full | nginx-light
(省略)
```
ドットつなぎの文字列で連想配列にアクセスする関数

個人的に必要だったので作成。 
同じ引数で何度も処理するのは良くないと思ったので[静的変数](http://www.php.net/manual/ja/language.variables.scope.php#language.variables.scope.static)でプチキャッシュしてる。

~~~array_dot_access.php
<?php

function array_dot_access( $str = NULL ) {
	if( empty($str) || !is_string($str) ) {
		return false;
	}

	static $buffer=array();

	if( !empty($buffer[$str]) ) {
		return $buffer[$str];
	}

	//元となる配列
	$array = array(
		'keyA'=>array(
			'keyB'=>array(
				'keyD'=>'OK'
			)
		),
	);

	$ex = explode('.', $str);
	$return = NULL;
	for ( $i=0, $l=count($ex)-1; $i<=$l; $i++ ) {
		if( 0 === $i ) {
			if( !array_key_exists($ex[$i], $array) ) {
				break;
			}
			$return = $array[$ex[$i]];
		} else {
			if( !is_array($return) || !array_key_exists($ex[$i], $return) ) {
				$return = NULL;
				break;
			}
			$return = $return[$ex[$i]];
		}
	}

	if(!empty($return)){
		$buffer[$str] = $return;
	}

	return $return;
}


/*
Example

var_dump(array_dot_access('keyA.keyB.keyD')); // string(2) "OK"

var_dump(array_dot_access('keyA.keyB')); // array(1) { ["keyD"]=> string(2) "OK" }

var_dump(array_dot_access('keyA.keyZ')); // NULL

*/
~~~
LubuntuのCaps Lock抹殺

Lubuntu限定じゃないけど

# キーを入れ替えるコマンド

```shell-session:左Ctrlキーと位置を入れ替えたい場合
setxkbmap -option ctrl:swapcaps
```

```shell-session:Ctrlキーにしたい場合
setxkbmap -option ctrl:nocaps
```

```shell-session:Superキー(≒Winキー)にしたい場合
setxkbmap -option caps:super
```
ログイン後、毎回実行する必要がある

# ログイン時に自動実行
以下のコマンドを実行して.profileに書き込んでおく
(環境によっては.bash_profileとかかもしれない)

```
echo 'setxkbmap -option ctrl:nocaps' >> ~/.profile
```

# 超追記 (2014/3/19)
昨日はLubuntuで遊んでたんだけど、やっぱりUbuntuに戻った

上のやつで、Lubuntuでは出来てた気がしたんだけど、Ubuntuやったら駄目だったので、出来てなかったのかもしれない

~/.profile, ~/.bash_profile, ~/.xprofile, ~/.xinitrc, ~/.xsessionの全部に書いてみたけど駄目だった
~/.bashrcに書いたら端末開いたあとからは有効になるけど、端末開くまでは有効にならないし

下の参考リンクを読んだら`localectl`コマンドを使えばできるらしく
`localectl -h`と`man localectl`を読んで

```shell-session
localectl set-x11-keymap jp,us pc104 dvorak ctrl:nocaps
```
ってやったらなんか出来たけど、原理がよく分かってないのでやり方違うかもしれない
てかdvorak指定してるのにqwertyのままだし分かんない
あとpc104でいいんだろうか
とりあえず今のところ問題無くCaps Lock抹殺は完了したからいいか、、、

※ちなみに、前はUbuntuソフトウェアセンターからGNOME Tweak Toolをインストールしてそこから変えたけど、設定がほとんどUnity Tweak Toolと被っていてそのためだけにインストールするのがちょっと嫌だった

# 参考
[[lubuntu] Solution to remap (ie deactivate) Caps Lock in lubuntu](http://ubuntuforums.org/showthread.php?t=1782212)
[Keyboard Configuration in Xorg (日本語) - ArchWiki](https://wiki.archlinux.org/index.php/Keyboard_Configuration_in_Xorg_(%E6%97%A5%E6%9C%AC%E8%AA%9E))
iOS7.1でボタンのタイトルが改行しなくなったら見るメモ

iPadをiOS7.1に、Xcodeを5.1にアップデートしたところ、UIButtonのタイトルが改行しなくなり、困ったのでメモ。
初期表示の時だけ改行されず、ハイライト状態(UIControlStateHighlighted)だと改行されていました。

##解決方法
setTitleの前にsetNumberOfLinesを書きます。

```objc
UIButton *btn = self.btn;
//縦幅におさまる分だけ改行する
[[btn titleLabel] setNumberOfLines:0];
//ボタンのタイトルをセット
[btn setTitle:@"改行するくらい長いタイトル" forState:UIControlStateNormal];
```

.
これまでは、setTitleをsetNumberOfLinesの前に書いていました。
上記の書き方に直すと、初期表示でもきちんと改行されて表示されました。
ただ、タイトル部分だけが一瞬遅れて表示されるようになってしまったので、ここは課題です。
JavaScriptの勉強6日目：2014年3月18日(火) 

本日もドットインストールに掲載されている動画を参考にJavaScriptの学習を進めた。

今まで、HTMLについて理解せずになんとなくで書いていたので、JavaScriptの学習をする前に、HTML入門の動画を視聴し、復習を行った。

属性などそれぞれの意味ついて再確認ができた。


JavaScriptは前回作成した割勘電卓の拡張に試みたが、思うようにプログラムを組むことができなかった。
具体的には、複数のボタンごとにそれぞれ異なった計算を方法を持たせるつもりだったが、うまくいかず、1つのボタンで全ての計算方法を実行し、すべて表示するといったものになってしまった。


また、誕生日に計算という動画を視聴し、生まれてから今まで何日経過したか計算するプログラムを書いた。


こちらも、自分の頭ではもっと拡張する予定だったが上手く記述することができなかった。(日付の計算が難しかった)

自分の頭を使ってロジックを考え、それを記述し正しく実行できるレベルに早くなりたい。

次回は今までの復習を中心に学習を進めようと思う。
Capybaraでテスト毎にsessionをリセットする

* Capybara.reset_sessions!でセッションが消えないので色々試してみた

## 環境
* mac OSX10.9
* safari 7.0.2
* cucumber 1.3.10
* capybara 2.1.0

## やってみた
### 消えない
* firefoxとかchromeだと消えるんだけど、safariだと消えない
```
Capybara.reset_sessions!
```

* これもsafariだと消えない
```
Capybara.current_session.driver.browser.manage.delete_all_cookies
```

### 消えた・・・が
```
Capybara.module_eval do
  def delete_sessions!
    @session_pool.clear
  end
end
Capybara.delete_session!
```

* 消えるには消える
* が、シナリオを実行する度にブラウザが立ち上がる
 * 実行中のsessionに対する終了処理をしてないから
 * Linuxとかで実行してるとプロセス数の上限に達してテストが途中で失敗しだした・・・
 * http://d.hatena.ne.jp/akuwano/20120413/1334312849 とかが参考になります

### sessionを消す前にブラウザを閉じる
* sessionを消す前に、ブラウザを閉じるようにする
```
 Capybara.current_session.driver.browser.quit
```

* features/support/hooks.rbに書くとこんな感じ
```
Before do
  Capybara.current_session.driver.browser.quit
  Capybara.delete_sessions!
end
```

* さらに、safariでテスト回してて File exists - ${HOME}/Library/Safari/Extensions.bak とか出るようならBeforeに次の１行も入れとくとよさそう
```
FileUtils.rm_rf "#{ENV['HOME']}/Library/Safari/Extensions.bak"
```

## 結論
```
Capybara.module_eval do
  def delete_sessions!
    @session_pool.clear
  end
end

Before do
  Capybara.current_session.driver.browser.quit
  Capybara.delete_sessions!
  FileUtils.rm_rf "#{ENV['HOME']}/Library/Safari/Extensions.bak"
end
```

### 課題
* 都度sessionを初期化するため、テストの実行が長くなるように感じる
* 場合によってはtimeoutもおきそう・・・
3/17日のJavaScript学習内容

text:独習JavaScript

本日の内容
1.3-3.7までの練習問題を解く。


今までやってきた内容の総復習です。
ここをある程度こなせないと
イベントハンドラの利用などである次項目には
進めないと思ったので復習を行っています。

次回は3.8の練習問題から解いていきたいと思います。
CakePHPのupdateAll()でエラーが出るときはここが怪しい！

CakePHPのupdateAll()を使用した際に発生したエラーで
若干ハマったので残します。

**CakePHPのupdateAll()は自動でクォート処理、サニタイズ処理を
してくれません！！**

…言いたいのはそれだけです。

それだけでハマッてしまったのです。

対処法は以下の通り

```SampleModel.php
$test = 'value';
$data = "'" . Sanitize::escape($test) . "'";
$this->updateAll(
    array('SampleModel.shop_id' => $data),
    array('SampleModel.id' => $id)
);
```

updateAllで書き換えるデータは


* 自前でクォートを付ける！
* サニタイズを行う！

この2点がポイントです。


`Column not found: 1054 Unknown column 'value' in 'field list'`
これで上記エラーが出ていた私のコードもすっきり解消しました。

##詳しい解説
http://book.cakephp.org/2.0/ja/models/saving-your-data.html
↑公式リファレンス
　ちゃんと「リテラルは Sanitize::escape() を使って手動でクォートしてください。」って書いてあるんですけどね。見落としがちなので。
ubuntuのdns設定

/etc/network/interfacesに以下のように追記

```shell-session
dns-nameservers $dns_server_addr
dns-domain $domain_name
```

この後以下のコマンドを実行

```shell-session
sudo /etc/init.d/networking restart
```

serviceからいけるような気もするけど、とりあえずこれでうまくいったのでOK
くれぐれも/etc/resolv.confを直接編集しない(上書きされるので)

# 2014-03-20追記

```shell-session
resolvconf/resolv.conf.d/
```

以下のファイルに設定する方法もある。
resolv.conf.d以下のファイルにsearch、domainなどの指定をした上で、

```shell-session
resolvconf -u
```

でresolv.confに反映される。
こっちの方が本式か？
gitとsvnを両立させる魔法のコマンド


## こんな人にオススメ

- 周りがsvnを使っていけど、自分はgitを試してみたいと思っている
- gitを愛しているがsvnと付き合う事を強要されている


## まずは準備
```
mkdir project
cd project
git svn clone --prefix svn/ -s svn://hostname/path
```

## git pull (svn update)
```
git svn fetch
git svn rebase
```

## git log (svn log)
```
git svn log
```

## git commit
```
git commit # 普通にgit commitしてok
```

## git push (svn commit)
```
git svn dcommit
```


## まとめ
git svnコマンドを使えば自分はgit、周りはsvnで快適に開発できますよ。
隣のサーバにちょっかいを出すメモ

使いどころは・・・まーどっかにあると思って

ssh [確認対象IP or hostname] [やりたい内容]

例：隣のweb02のheartbeatのサービス起動確認
ssh web02 service heartbeat status

３台構成とかで１号機に接続するだけで３台分の確認ができる

※やってみたが別に隣でなくても遠隔地にあるサーバでも使えた
自力でAjax通信してみる


## 実装
```javascript
var Ajax = {
    endpoint: "/",
    get : function(path, callback, param, header) {
        return this.request("GET", this.endpoint + path, callback, param, header);
    },
    post : function(path, callback, param, header) {
        return this.request("POST", this.endpoint + path, callback, param, header);
    },
    request : function(method, url, callback, param, header) {
        var xhr = this.xhr();
        xhr.open(method, url, true);
        xhr.onreadystatechange = function() {
            if(xhr.readyState == 4) {
                if(xhr.status == 200) {
                    var text = xhr.responseText;
                    var type = xhr.getResponseHeader("Content-Type");
                    if(type.indexOf("application/json") == -1) {
                        callback(text);
                    } else {
                        var js_obj;
                        if(JSON.parse) {
                            js_obj = JSON.parse(text);
                        } else {
                            js_obj = eval("(" + text + ")");
                        }
                        callback(js_obj);
                    }
                }
                xhr = null;
            }
        }
        if(header) {
            for(var key in header) {
                var value = header[key];
                xhr.setRequestHeader(key, value);
            }
        }
        if(param) {
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            var lines = [];
            var i = 0;
            for(var key in param) {
                var value = param[key];
                lines[i] = key + "=" + encodeURIComponent(value);
                ++i;
            }
            xhr.send(lines.join("&"));
        } else {
            xhr.send("");
        }
    },
    xhr : function() {
        if (window.XMLHttpRequest) {
            return new XMLHttpRequest();
        } else {
            try {
                return new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                return new ActiveXObject("Microsoft.XMLHTTP");
            }
        }
    }
} 
```

## 実行結果
```javascript
Ajax.get('path/to/api', function(x){ console.log(x); });
// => サーバからのレスポンスはContent-Typeに「application/json」が指定されていれば、
//    レスポンス本文を解析してオジェクト(連想配列や配列)になって変数「x」に格納される
```

## まとめ
Ajax通信はjQueryとかを使うのが王道なのですが、自分で実装してみても以外と簡単。
超絶にリッチな管理画面「AdminLTE」を導入してみる

# 超絶にリッチな管理画面「AdminLTE」を導入してみる

## About AdminLTE

![スクリーンショット 2014-03-18 14.02.43.png](https://qiita-image-store.s3.amazonaws.com/0/15518/c5b06067-2959-e402-12a5-f25b169dd704.png)

>A free premium admin dashboard and control panel theme. Based on Bootstrap 3 Framework. Open source (licensed under the MIT license) 

という事で、オープンソースでMIT Licenseなフリーの管理画面テーマやで。

###[デモ](http://www.almsaeedstudio.com/preview)

MOONGIFTさんで紹介されていたので興奮気味で導入してみます。
>[AdminLTE – ここまで多ければ何でもできそう。多機能なBootstrapベースの管理画面テンプレート](http://www.moongift.jp/2014/03/adminlte-%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7%E5%A4%9A%E3%81%91%E3%82%8C%E3%81%B0%E4%BD%95%E3%81%A7%E3%82%82%E3%81%A7%E3%81%8D%E3%81%9D%E3%81%86%E3%80%82%E5%A4%9A%E6%A9%9F%E8%83%BD%E3%81%AAbootstrap/)

## とりあえず設置

ダウンロード：http://www.almsaeedstudio.com/
Github：https://github.com/almasaeed2010/AdminLTE

WEBサーバ上で見れるようにしてみます。動的な部分は含まれていないようなので設置すれば表示できますな。

![スクリーンショット 2014-03-18 15.55.45.png](https://qiita-image-store.s3.amazonaws.com/0/15518/aabbf46b-1edc-35f8-9074-b94d38ec9d8a.png)

javascriptを無効化するとグラフ類が非表示になるのみで
数字系のパラメータはベタで指定してあるっぽい。

サーバリソース系やPV系はライブラリ化できそうな感じなんで実装次第当記事更新していきまーす。
Rubyでstrscanを使ってiniをパースする


## 実装
```ruby
require "strscan"

def parse_ini src
  section = { "" => {} }
  current = section[""]
  s = StringScanner.new(src)

  while !s.eos?
    case
    when s.scan(/\s+/)
      # nothing
    when s.scan(/\[(.+?)\]/)
      section[s[1]] = current = {}
    when s.scan(/(\w+)\s*=\s*(["'])?([^\n]+)\2/)
      current[s[1]] = s[3]
    when s.scan(/(\w+)\s*=\s*(\d+\.\d+)/)
      current[s[1]] = s[2].to_f
    when s.scan(/(\w+)\s*=\s*([\d]+)/)
      current[s[1]] = s[2].to_i
    else
      raise "Parse Error. rest=#{ s.rest }"
    end
  end

  return section
end

if $0 == __FILE__
  require "pp"
  pp parse_ini(DATA.read)
end

__END__
piyo = "piyopiyo"

[foo]
name  = "hoge"
age   = 20
point = 10.7

[bar]
hoge = 'hogehoge'
```


## 実行結果
```
% ruby /tmp/aaa.rb
{""=>{"piyo"=>"piyopiyo"},
 "foo"=>{"name"=>"hoge", "age"=>20, "point"=>10.7},
 "bar"=>{"hoge"=>"hogehoge"}}
```


## 感想
Rubyでテキストをパースする時はstrscanが本当に便利!
もう正規表現には戻れない。
ディレクトリ構成図を書くときに便利な記号

テキストベースでちょっとしたディレクトリ構成図を書きたい時、いつもあの記号どうやって出すっけ？？となる。なので、いい加減メモすることにした。

以下のようなのを書きたい
> root/
> 　├ bin/
> 　├ etc/
> 　├ usr/
> 　│　└ local/
> 　│　　　└ bin/
> 　└ lib/

コピペ用記号集

```
┣ ┠ ┝ ├
┫ ┨ ┥ ┤ 
│ ┃
─ ━
┌ ┏ ┓ ┐
└ ┗ ┛ ┘
```

ちなみに、MSIMEだと以下の変換で出せる
 (引用元：http://support.microsoft.com/kb/883172/ja)

| 読み | 文字 |
|:--------|:--------|
| たて 　 | │ ┃ |
| たてひだり | ┨ ┥ ┤ ┫ |
| たてみぎ | ┣ ┠ ┝ ├ |
| ひだりうえ | ┌ ┏ |
| ひだりした | └ ┗ |
| ふとわく  | ┗┻━┛ ┏┳━┓ |
| ほそわく  | └┴─┘ ┌┬─┐ |
| まんなか  | ┼ ╋ ┿ ╂ |
| みぎうえ  | ┐ ┓ |
| みぎした  | ┘ ┛ |
| よこ      | ─ ━ |
| よこうえ  | ┻ ┷ ┸ ┴ |
| よこした  | ┳　┯ ┰ ┬ |
DartのListにおいてJavaScriptのArray.prototype.concatのようにリスト要素を展開して要素追加を行う

JavaScriptで、ある配列にある配列の要素１つひとつを要素として追加したい場合、配列に対して配列を`push`してしまうと、配列そのものが要素として追加されてしまうので、`Array.prototype.concat`を使うかと思います。

```js:JavaScriptにおけるArray.prototype.concatの例
var a = [1, 2, 3];
a = a.concat([4, 5, 6]);
// a => [1, 2, 3, 4, 5, 6]
```

DartのListの場合ですと、`addAll`を使います。

```dart:DartにおけるList.addAllの例
var a = [1, 2, 3];
a.addAll([4, 5, 6]);
// a => [1, 2, 3, 4, 5, 6]
```

この場合、JavaScriptの`Array.prototype.concat`と違うのは、`concat`が追加された結果を返すのに対し、Dartの`List.addAll`は、メソッド呼び出し元のリストに対して追加を行う、という点です。

また、補足ですがJavaScriptでは`Array.prototype.push.apply`を用いて配列要素の追加を行うことができます。

```js:Array.prototype.push.applyを用いた例
var a = [1, 2, 3];
Array.prototype.push.apply(a, [4, 5, 6]);
// a => [1, 2, 3, 4, 5, 6]
```

こちらの場合ですと、Dartの`List.addAll`のように、メソッド呼び出し元の配列への要素の追加が行われます。
Qiitaタイトルの長さの限界

[Qiitaのタイトルって何文字まで表示されるんだろうあああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ - Qiita](http://qiita.com/bonyochan/items/8476b36c95fc6046c535)
って記事を作ったんだけどフィードとかQiitaタグの一覧に表示されない。さみしい。
タイトル長すぎるとそういうのに載せない仕様なんですかね？

#感想
長すぎると検索に引っかかんなくなるみたいだからやめたほうがよさそう。

#追記
>"Qiitaタイトルの長さの限界"は不適切な内容が含まれていたため、スタッフにより限定共有化されました。 
>利用規約をご確認の上、 内容を修正して公開していただきますようお願いいたします。

とのことなのですがいいまとめが思いつかないので誰かプログラミング的知見からコメントをお願いします。（丸投げ）
atomエディタでc#のsyntax hightlightを有効化する

github製のテキストエディタ「atom」でc#ファイルを開いたところsyntax highlightが効いてませんでした。。

Atom -> Preferences -> Packages -> 「Csharp」と入力 -> 「Language Csharp」のpackageをinstall

これでinstall完了したらsyntax highlightが効くようになりました！

ヽ(ﾟ∀ﾟ)ﾉ ﾊﾟｯ

![スクリーンショット 2014-03-18 12.10.00.png](https://qiita-image-store.s3.amazonaws.com/0/6338/dad44b06-9c0c-8af3-34ab-61b8a2c67edb.png)
■よく使うコマンド集まとめ

筆者がよく使うコマンド集を書いています。

## ruby bundle コマンド集

```
history | grep bundle
bundle install --path=vendor/bundle 
# => 地味に便利
```

## rbenv コマンド集

```
rbenv --version 
# => バージョン確認
rbenv install --list 
# => インストール可能なバージョン一覧の表示
rbenv install [バージョン] 
# => rubyのインストール
rbenv rehash             
# => rbenv の再読み込み
rbenv global [バージョン]  
# => defaultで使うrubyのバージョン
rbenv versions
# => インストールされているバージョンを確認
rbenv local 2.0.0-p247
# => ローカルのRubyバージョン変更
■rbenvの更新
rm -rf ~/.rbenv/plugins/ruby-build
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

## Rails コマンド集

コピペ様に書いて置くんですが実運用において以外に便利

```
bundle exec unicorn_rails -E -p 8080 -c config/unicorn.rb -D
# => unicornの起動
bundle exec rake db:create
# => database.ymlに記載されたDBの作成
bundle exec rake db:migrate
# => databaseのテーブル作成
bundle exec rake db:migrate:reset
# => Drop table 実行後 migrate file に従った create table
bundle exec rake db:migrate:reset RAILS_ENV=staging
# => stagingモード
```

## Capistrano
```
bundle exec cap deploy:setup  
# 初期セットアップ 
```

## AWS コマンド集

```AWSメモ
１．AMIから起動する場合どうやらインスタンスのDISKの容量を超えるDISKを設定するとterminateされてしまう。
# => 実証済み
２．
sudo cp /usr/share/zoneinfo/Japan /etc/localtime
=> 
■日本語表示のインストール
export LANG=ja_JP.UTF-8
update-locale LANG=ja_JP.UTF-8
■Amazon-Linuxの場合
rootのパスワード
sudo passwordにて変更可能
sudo su でrootユーザーに移動可能
```

## Git コマンド集

```
git コマンド
comit  #localに反映
push   #サーバーに反映
revert #ファイルを変更前に戻す
pull   #localを、サーバーの最新版に更新
reset  #指定したコミットの状態にする
git remote add リポジトリURL
git merge ブランチ名
git remote set-url test 
git remote add test Repository名
git config --global user.email "[メールアドレス]"
git config --global user.name "自分の名前"
```

## ubuntsu linux コマンド集

```
adduser ユーザー名
# => ubuntsuでのユーザーの追加 かなり便利です。
ssh-keygen -t rsa
# => sshキー作成
sudo gpasswd -a redmine sudo
# => sudo su の権限を付与する
chown redmine:redmine *
# ファイルの所有権を変更する
nginx -t -c /etc/nginx/nginx.conf
# => nginxのSyntax check
/etc/init.d/nginx restart
# => nginx の再起動
/etc/init.d/httpd restart
# => apache の再起動
```

## MYSQL 関連

```
mysql --version
# => バージョン確認
source ****.sql
# => Dumpfileのインポート
```
Gitでcheckoutできなくなった時にやったこと


## 現象
SmartyのCacheファイルをcommitしてしまったのが原因で、checkoutしようとしたら以下のエラーがでた。

```
error: unable to create file file.hoge.html.php
fatal: Could not reset index file to revision 'HEAD'.
```

## 解決法
commit済みのCacheファイルを.gitignoreしてcheckoutする。

```
# Cacheファイルのパスを書く
$ vim .gitignore
$ git add .gitignore
$ git commit -m "add .gitignore"
$ git chechout yourbranch
```
GoogleAnalyticsのイベントトラッキングタグを簡単に埋め込む

Rails前提ですが、適宜変更してお使いください。

```js
/**
Google Analytics Event Tracking Tag
google_analytics_tracker.js
 
@requred Google Analytics tag
@requred jquery
 
:class => 'js_ga_tracker', :"data-category" => '', :"data-action" => '', :"data-label" => '', :"data-num_value" => ''
 
:"data-label", :"data-num_value" is optional
 
ex)
link_to 'hoge', '/', :class => 'js_ga_tracker', :"data-category" => '', :"data-action" => '', :"data-label" => '', :"data-num_value" => ''
**/
$(function() {
  $('a.js_ga_tracker').each(function(){
    var target = $(this);
    target.click(function(){
      params = ['_trackEvent', target.data('category'), target.data('action')];
 
      if ( target.data('label') ) {
        params.push( target.data('label') );
 
        if ( target.data('num_value') && $.isNumeric( target.data('num_value')) ) {
          params.push( target.data('num_value') );
        } else {
          console.log('num_value invalid: ' + target.data('num_value'));
        }
 
      } else {
        console.log('label invalid: ' + target.data('label'));
      }
 
      _gaq.push( params );
    });
  });
});
```
スクリプト言語の相互実行

jsonやxml, データベースといった「構造を持ったデータ」の一部にスクリプトを埋め込みたいことがあります。もちろん、言語独自のデータ構造（例：マップ＋ハッシュ）にクロージャー的なものを入れれば良いのですが、できれば言語非依存の方法で実装したい・・・というような状況です。

そこで、各種プラットフォーム上で、代表的なスクリプト言語(Python, PHP, Ruby, javascript)の実行が可能かどうかを調べてみました。


| -          | Python | PHP              | Ruby   | JavaScript| Java            | .NET/Mono       |
|------------|--------|------------------|--------|------------|-----------------|-----------------|
| Python     | -      |                  |        | Brython    | Jython          | IronPython      |
| PHP        |        | -                |        |            | Quercus         | Phalanger       |
| Ruby       |        |                  | -      |            | JRuby           | IronRuby        |
| JavaScript| PyV8    | PHP-spidermonkey | execjs | -          | Rhino / Nashorn | JScriptEvaluate |

こう見ると、一番汎用性の高い言語はJavaScriptということになるかと思います。主要なプラットフォームを網羅したいのなら、JavaScriptが良いかもしれません。
GitをWindows7(64bit)にインストールしてGitLabからリポジトリをCloneする手順  

## tortoisegitをダウンロード ＆ 次へ次へインストール    
[tortoisegit](https://code.google.com/p/tortoisegit/wiki/Download)  
  
## msysgitをダウンロード ＆ 次へ次へインストール    
[msysgit](https://code.google.com/p/msysgit/)  
  
## SSH鍵作成  
* {Gitインストールディレクトリ}\bin内にあるputtygen.exe起動  
* Generateボタン押下  
* マウスぐりぐり  
* Save private key 押下してテキトーな場所に保存  
  (PuTTY Key Generatorは閉じない)  
  
## GitlabにSSH公開鍵登録  
* Gitlab開く  
* profile開く  
* SSH Keys開く  
* Add an SSH Key押下  
* Keyに PuTTY Key Generaor の Public key for pasting into OpenSSH authorized_keys file: に表示されている文字列をペースト  
* Add key 押下  
* PuTTY Key Generator 閉じる  
  
## 秘密鍵を登録する  
* Gitリポジトリ設定に秘密鍵を登録する場合  
  1. Gitリポジトリフォルダ右クリック -> TortoiseGit -> Settings -> Git -> Remote を選択
  1. Putty Key: に秘密鍵を指定

* pageantの場合
  1. {Gitインストールディレクトリ}\bin内にある pageant.exe 起動  
  1. Add Key 押下して、先ほど保存した private keyを指定  

pageantの場合は、毎回リモートリポジトリに繋ぐ際にpageantを起動しておかなければいけないので、Gitリポジトリ設定の方が楽。
  
## Gitリポジトリクローン  
* GitRepositoryをcloneしたいフォルダを作成  
* エクスプローラで右クリックしてGit Clone押下  
* URL指定  
* OKボタン押下  
  
## 参考  
[WindowsからGitLab](http://d.hatena.ne.jp/NU_Pan/20121019/1350602480)  
[Git for Windowsでplink(putty)を使う](http://d.hatena.ne.jp/hogelog/20120627/p1)
Markdownのリンクを作成するブックマークレット

```js
javascript:(function(){void(prompt(document.title,"["+document.title.replace(/[\[\]]/g,"\\$&").replace(/\\$/, "")+"]("+location.href+")"))})()
```
2秒で作った ( d（* ´∀｀）b うそです)

## 以下の問題に対応 

- タイトル中に「[」「]」が含まれる場合に正常に動作しない
- 末尾が「\」であった場合にリンクとして認識されない

(thanks to: @asahina_dev さん)
westonモジュールのテスト


参考
http://wayland.freedesktop.org/testing.html

westonそのものや、westonモジュールをテストする方法。

## Makefile.amの書き方

tests/Makefile.amのmodule_testsに`hoge-test.la`のような名前でテストを追加する。
末尾の拡張子は重要でこれを見てweston-tests-envでテストの実行方法が決定される。

hoge-test.laのビルドオプションについては他のCompositorTestsと同様に書けばよい。

```mf:Makefile.am

#(省略)

module_tests =                          \
        surface-test.la                 \
        surface-global-test.la          \
        hoge-test.la # 追加

#(省略)

hoge_test_la_SOURCES = hoge-test.c
hoge_test_la_LDFLAGS = -module -avoid-version -rpath $(libdir)

#(省略)

```

## テストコードの書き方

参考URLから引用

```c:
static void
test_foo(void *data)
{
	struct weston_compositor *compositor = data;

	/* Test stuff...
	assert(...);
	assert(...);
	...
	*/

	wl_display_terminate(compositor->wl_display);
}

WL_EXPORT int
module_init(struct weston_compositor *compositor,
            int *argc, char *argv[], const char *config_file)
{
	struct wl_event_loop *loop;

	loop = wl_display_get_event_loop(compositor->wl_display);

	wl_event_loop_add_idle(loop, test_foo, compositor);

	return 0;
}
```

基本的な部分はモジュールを作るときのコードと同じ。
テストはassertでおこなう。

### テスト用wl_resourceの作り方

ちょっと細かい話。テストのためにwl_resourceが必要になったとき、わざわざクライアントプロセスをフォークさせなくても以下の方法でwl_resourceを作ることができる。

```c:

struct wl_client* dummy_client=NULL;
int sockets[2];
struct wl_resource* resource=NULL;

assert(socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, sockets) == 0);
dummy_client = wl_client_create(compositor->wl_display, sockets[0]);
assert(dummy_client);

resource = wl_resource_create(dummy_client,&wl_display_interface, 4, 0);
assert(resource);

```

## テストの実行

ソースディレクトリ直下で

```bash:
$ make check
```

ログはtests/test-suite.log, tests/logsにでる。