OmniAICreator/Qiita-1.07M huggingface dataset:
Typesafe configで特定のパスの設定値だけ抜き出したい


Typesafe configを使っていると、application.confで変数をグルーピングすることがあると思います。ここでは、設定値の中からあるグループだけを取り出す方法を紹介します。

例えば下のapplication.confは`myapp.account`という名前でグルーピングされています。

```nginx:application.conf
myapp.account {
  db.host = 127.0.0.1
  db.port = 3306
  db.database = account
  db.user = root
  db.password = ""
}
```

通常の方法では、`config.getString("myapp.account.db.host")`のようにフルパスで設定値を取得しないといけません。

これでは、グループ名が何度も出てきて煩わしいので、まずは`myapp.account`をまとめて読み込み、その後個々の設定値を読みだしていきます。

グループをまるごと読みだすには`getConfig`メソッドを使います。

```scala
private val config = ConfigFactory.load().getConfig("myapp.account")
```

この変数`config`には`db.*`の設定が含まれます。

個々の設定値は、この`config`に対して`getString`や`getInt`で参照することができます。

```scala
val host = config.getString("db.host")
```

以下が設定ファイルを参照するオブジェクトの完全なコードの例になります。

```scala:Config.scala
import com.typesafe.config.ConfigFactory

object Config {
  private val config = ConfigFactory.load().getConfig("myapp.account")

  object DB {
    val host = config.getString("db.host")
    val port = config.getInt("db.port")
    val database = config.getString("db.database")
    val user = config.getString("db.user")
    val password = config.getString("db.password")
  }
}
```
Autolayoutを使ったUITableViewCellの高さ計算を「手動」で行う実装


[iOS8からのTableViewCellの高さ自動計算は、上スクロールした時にはうまく動かない件](http://qiita.com/paming/items/35c5cf80cd593816aaf5)で、UITableViewCellの高さ自動計算でハマる場合がある事がわかりました。
これを回避するには、estimatedHeightを使わずに、真面目に高さ計算を行えば良いです。

Autolayoutが無い時代には、これをごりごりと計算していたのですが、UITableViewCellにAutolayoutを使う事で、かなり簡略化できたのでその記録を残します。

おおまかな流れ
----
- UITableViewDataSourceから参照できる所に、「表示する事の無い、高さ計算用のダミーセル」を用意します。
- tableView:heightForRowAtIndexPath: で、ダミーセルを使って高さ計算を行います。
	- このときAutolayoutで計算ができるので、比較的楽です。


ソース
----
```:Objective-c
- (void)viewDidLoad {
    [super viewDidLoad];
...    
    // estimatedRowHeightはガタガタの原因になるので使わない。
//    self.tableView.estimatedRowHeight = 100;
//    self.tableView.rowHeight = UITableViewAutomaticDimension;

    // セルの高さを計算する用の、表示されないダミーのセルを用意する。
    // ここでdequeueするのは、実際に表示するセルを使います。
    self.dummyCell = [self.tableView dequeueReusableCellWithIdentifier:@"Cell"];
    
}


/**
 Autolayoutを使ったUITableViewCellの高さ計算
 */
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 高さ計算用のダミーのセルに、cellForRowAtIndexPathで行うのと
    // 同じ設定をする。
    [self setupCell:self.dummyCell atIndexPath:indexPath];

    // 以下、サイズ計算用の処理です。
    // ダミーセルそのものに操作しても、サイズ計算は行われないので、
    // その内側にあるcontentViewに対して操作を行います。
    // contentViewを再レイアウトする
    [self.dummyCell.contentView setNeedsLayout];
    [self.dummyCell.contentView layoutIfNeeded];
    // contentViewの、Autolayoutに従った時のサイズを取得する
    CGSize size = [self.dummyCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
    // UITableViewの高さは、contentViewと「区切り線」を含んだ高さなので、
    // 高さに区切り線分の高さを+1して返す
    return size.height+1;
}

/** MyTableViewCellの設定処理 */
// MyTableViewCellへの設定処理が重たい場合は、
// 「高さ計算で必要な設定」と「高さ計算では不要な設定」に
// 分けたほうが良いかもしれません。
-(void)setupCell:(MyTableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger num = (NSUInteger)[self.array[indexPath.row] integerValue];
    cell.title.text = [self stringByLineNumber:num];
    cell.backgroundColor = [self colorByNumber:num];
}

/** 実際に表示するCellを返す */
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog( @"cellForRowAtIndexPath: row=%@",@(indexPath.row));
    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"
                                                            forIndexPath:indexPath];
    [self setupCell:cell atIndexPath:indexPath];
    NSLog( @"cell=%@",cell);
    return cell;
}
```

ソース https://github.com/taktamur/iOS8CellHeight/tree/after

おわりに
----
iOS8からUITableViewCellの高さ計算が自動になって、やぁ便利になったなぁと思いましたが、使い方によっては思った動作にならないようです。
ただ自動計算せずとも、heightForRowAtIndexPathの中で、「Autolayoutを使った高さ計算」ができれば、少しの手間で「高さの手動計算」ができるようです。
なので、高さの自動計算は、場面に応じての使い分けになるのでしょうね。
Milkcocoa Android SDKのαバージョンを公開しました。

Milkcocoa Android(Java) SDKのα版を公開しました。


## Milkcocoaとは

[Milkcocoa | リアルタイムアプリ・IoTやるならMilkcocoa](https://mlkcca.com/)

データの保存・更新・取得やリアルタイム通信がフロントエンドのコーディングだけで簡単に行えるバックエンドサービスです。また、多種多様なデバイス、プラットフォーム間でのリアルタイムなやり取りも可能です。

（[ブログ](http://blog.mlkcca.com/)にて、Milkcocoaの色々な使い方を紹介しているので、是非そちらもご覧下さい。）


## Androidプロジェクトでの利用開始方法

- Androidアプリのプロジェクトのlibs以下にmilkcocoa.jarを入れる。

- AndroidManifest.xmlに以下の一行を追加
```<uses-permission android:name="android.permission.INTERNET"></uses-permission>```


## ダウンロード・ドキュメントなど

- [milkcocoa-dev.jarのダウンロードリンク](http://cdn.mlkcca.com/java/milkcocoa-dev.jar)
- [APIリファレンス](http://milk-cocoa.github.io/milkcocoa_for_android/doc/)
- [サンプル](https://github.com/milk-cocoa/android-examples)




##さいごに

このSDKはまだα版です。動作は保証しておりませんのでご了承ください。
バグ等を発見されたら報告して頂けると大変有り難いです。
また、こちらのSDKを使ってアプリを作ってみた様子等を、ブログ等で書いて頂けるととても喜びます。
どうか今後ともMilkcocoaをよろしくお願いします。
Sublime Textユーザーが恐る恐るAtom乗り換えてみた


巷で噂のatomがsublimeを超えてるとの噂を聞いたので試しに変えてみる。

## 入れてみたpackage

- file-icons
	- ファイルの種類に応じてアイコンを出してくれる。オシャレ用。
- Linter
	- linter.とりあえず入れる。
- script
	- jsちょっと動かしてみたい！ってときに使えるplaygroundみたいなもの。
- highlight-column
	- 縦の補助線がでる。これはインデント揃える派の人には便利。
- highlight-line
	- 横の補助線がでる。まぁ必要。
- color-picker
	- 右クリックでRGBなどをえらぶGUIが出てくる。オシャレ用。
- atom-color-highlight
	- 探してみたけど見つからなかった。。
- vim-mode
	- vimバインドで扱えるようにしてくれる。sublimeでも同種のもの入れてたのでいれる。
- atom-alignment
	- ```cmd+ctrl+a```　で ```=``` などを揃えてくれる。
- autocomplete-plus





## 入れてないけど良さそうなpackage

- project-manager
	- 複数のプロジェクトまたぐ時があるのでそのときは使えそう
- atom-beautifier
	- よいと噂がだ見つからず。
- atom-beautify
	- ctrl+alt+bで整形してくれる。
	- rubyにはruby-beautify必要？
	- rubyで実行すると、[bbatsov/rubocop](https://github.com/bbatsov/rubocop) がないといわれる。

## markdownプレビュー

```Ctrl-Shift-m``` でpreviewウィンドウ表示

* [GitHub製エディタAtomのMarkdownリアルタイムプレビューの仕様 - memorandum](http://slowquery.hatenablog.com/entry/2014/05/12/014310)

kobitoを使ってたけどこれは便利。atomにエディタ統一もありうる。

## CLIから呼び出す

```
atom .
```

でカレントディレクトリをatomで開ける。このあたりも```subl .```でやってたのがそのまま問題なくできる。


## ショートカット

### 左のtreeを開閉
cmd + \

### window分割

cmd + k のあとに上下左右キー


## まとめ

ざっと1hほどでpackageあさったけど、sublimeと同じ操作感で出来そうな環境はできました。無料なこと、こちらのほうが開発が活発なことを考えると長い目でみて乗り換えておいてもありかな、という印象。Atom 1.0でパフォーマンスがだいぶよくなったのも追い風みたい。

## 参考

* [Atom がヤバイ！SublimeTextを余裕で凌駕してしまっていた件](http://www.geeks-dev.com/atom-%e3%81%8c%e3%83%a4%e3%83%90%e3%82%a4%ef%bc%81sublimetext%e3%82%92%e4%bd%99%e8%a3%95%e3%81%a7%e5%87%8c%e9%a7%95%e3%81%97%e3%81%a6%e3%81%97%e3%81%be%e3%81%a3%e3%81%a6%e3%81%84%e3%81%9f%e4%bb%b6/)
* [生粋のvimmerがAtomにのりかえる話 | Utage Blog](http://utage.headwaters.co.jp/blog/?p=3835)
* [Atom でインストールしている package 一覧 - Qiita](http://qiita.com/iorionda/items/b108e73e51ff40049c60)
tips：Unityメモ：iTween


iTween覚え書き。

Asset Store からインポート。

　iTween in Unity5

```
//使う
iTween.MoveBy(gameObject, new Vector3(x, y, z), move_time);


//Hashテーブルにパラメタをセットして使う事も出来る、らしい（未確認）
iTween.MoveBy(gameObject, hash_table);

//Hashテーブル、メモ
new Hashtable()
hash_talbe.add("各種キー", 値);
```
Amazonの商品拡大画像の実装をマネる

商品画像の実装をマネルと書いたが実際にはライブラリを使って表現してみたッて感じです！
そのとき調べたことを議事録的にまとめたもの。

# Maginifierについて
使用するライブラリ [mark-rolich/Magnifier.js](https://github.com/mark-rolich/Magnifier.js)
公式のサンプルサイト [Magnifier.js demo](http://mark-rolich.github.io/Magnifier.js/)

他にも同じようなライブラリがあったが

* 一番使いやすそうだった
* Amazonの動きと一番近かった
* サンプルがわかりやすく充実をしていた

ので、Magnifierを**採用**。

# 簡単なサンプル

サンプルサイトに記述してあることの反復である。

使用するのはファイルは3つで、githubからDownloadしてくる。

* Magnifier.js
* Event.js
* magnifier.css

一番単純な使い方

```inde.html
<html>
<head>
  <title>Magnifier Sample</title>
  <script type="text/javascript" src="./Event.js"></script>
  <script type="text/javascript" src="./Magnifier.js"></script>
  <link rel="stylesheet" type="text/css" href="./magnifier.css">
  <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/3.18.1/build/cssreset/cssreset-min.css">
</head>
<body>
  <div class="thumb-block-area">
    <img src="./small.png" class="js-magnifier-image" alt="sample"/>
  </div>
  <div id="preview" class="magnifier-preview" style="width: 300px; height: 300px;"></div>
  <script>
    ( function () {

      var initMagnifier = function(){
        var event = new Event();
        var magnifier = new Magnifier(event);
        magnifier.attach({
          thumb: ".js-magnifier-image",
          large: "./big.png",
          largeWrapper: "preview",
          zoom: 3,
          zoomable: true
        });
      };

      window.onload = function(){
        initMagnifier();
      };
    })();
  </script>
</body>
</html>

```

以下の箇所で設定をしている。
MagnifierのattachでsmallImageととBigImageを紐付けている。
気をつけるのは largeWrapper の値は**id名だけでセレクター**ではない。

```js
var event = new Event();
var magnifier = new Magnifier(event);
magnifier.attach({
  thumb: ".js-magnifier-image", // SmallImageのimg要素に設定しているセレクターを設定
  large: "./big.png",           // BigImageのパスを設定
  largeWrapper: "preview",      // BigImageを表示させる要素のid名だけを設定 ☓:#preview
  zoom: 3,                      // BigImageの拡大率を設定
  zoomable: true                // スクロール操作でBigImageのZoomの値を変更するか？
});
```

他にも設定できる値は

* mode: BigImageの表示方法の変更
* onthumbenter: 画像にhoverが始まった時
* onthumbmove:  画像上をhoverしている時
* onthumbleave: 画像へのhoverが終わった時

などがある。

# Magnifierが行っていること

サンプルを作ってブラウザのコンソールを見るのが一番わかりやすいが、
以下の実装でSmallImageの場合の表示とBigImageの場合の表示をしている。

- SmallImageのimg要素（画像の1）には**opaque**というクラスが付与されて、半透明になる。
- SmallImageと同じ階層にDOM（画像の2）を作って、そのDOM要素のBackground-imageに1と同じ画像が設定されて表示されている。
- BigImageが表示される方は、**largeWrapper**で指定した要素の下にimg要素が作られて、SmallImage上でのマウスの動きに合わせて表示位置がStyleで変更される。


![スクリーンショット_2015-06-28_15_50_13.png](https://qiita-image-store.s3.amazonaws.com/0/34345/ed1ab348-ec66-5f04-47a0-b3df64b5cf79.png)


# Amazonのような表示にするには

以下の様なスタイルを追加してあげると良い

```css
.thumb-block-area img.opaque {
  opacity: 1;
}
.magnifier-lens {
  opacity: .5;
  background-color: #342!important;
  background-image: none!important;
}
```

なんか長くなったのでここで一旦区切り。
カルーセルライブラリのslick.jsと連携については、別投稿でまとめる。
iOS8からのTableViewCellの高さ自動計算は、上スクロールした時にはうまく動かない件 


iOS8から、UITableViewAutomaticDimensionを使うと、高さ可変のCellの高さ計算を自動でやってくれるようです。
[QiitaでのUITableViewAutomaticDimension検索](http://qiita.com/search?utf8=✓&q=UITableViewAutomaticDimension&sort=created)

このUITableViewAutomaticDimensionは、Xcode6+iOS8.3シミュレータの組み合わせの場合、デフォルトでUITalbeViewnのrowHeight に設定されているようなので、試した所、estimatedRowHeightを設定するだけで反映するようでした。

```
self.tableView.estimatedRowHeight = 100;
//    self.tableView.rowHeight = UITableViewAutomaticDimension;  // ←これでも動くっちゃあ動く。
```

このUITableViewAutomaticDimension、下方向にスクロールする時には快調に動くのですが、いざ「上方向にデータを追加して上方向にスクロールする」場合には、セルが「上下に」「ガコガコと」動く現象があります。
やりたい動作としては、Twitterクライアントでリフレッシュした後に、上にスクロールしてツイートを見るのと同じような動作なのですが、これがUITableViewAutomaticDimensionを使うと「ガコガコ」と動きます。


![scrollToUp.gif](https://qiita-image-store.s3.amazonaws.com/0/7946/f6505641-b05e-c1e1-6b37-0959a41c5e5a.gif "scrollToUp.gif")

ソース https://github.com/taktamur/iOS8CellHeight/tree/before

似た状況で似た悩みに遭遇している人もいます。
[Autolayout で UITableViewCell の高さを設定すると reloadData 後にカクカクすることがある](http://qiita.com/usagimaru/items/664d0d67fe6f8f7fafed)





おそらく（高さの計算を自動でしている限り）解決作はなさそう
----
ここから推測です。
セルを上方向に追加した場合、追加されたセルの「高さ」は、表示されていない(cellForRowAtIndexPathで呼ばれていない)ので、まだ確定していません。おそらくここはestimatedRowHeightの値で代用しているのだと思われます。
TableViewを上にスクロールして、追加されたセルが初めて表示される時、高さの計算が行われます。この高さとestimatedRowHeightの値がずれているために、表示された直後に「表示されている全てのセルの位置調整が行われ」るために、テーブル全体が「ガコっ」と動いてしまっているようです。

じゃあestimatedRowHeightの値を、実際の高さに合わせれば良いよね、となるのだけど、そうすると高さの自動計算がほぼ無意味になってしまいます。


上方向にセルをたす時は自動計算が使えない...
----
という結論は、ひじょーに悔しいので、良い解決策があったら ぜひ @paming まで連絡ください。。
OpenBabelをc++からいじってみる

OpenBabelのC++ APIについての日本語資料が少なくね？ということでちょっと書く。
（本当はMoldbのHeliumを使おうとしていたがかなりあたらしい環境が必要で挫折した）

今回のお品書きは以下の2つ。

1. インストール
2. 走らせてみる


#インストール（Root権限を持っていないことを仮定）
とっても簡単。root権限がなくても簡単。
http://openbabel.org/docs/dev/Installation/install.html
基本的にはこちら参照。

wgetなどでtar.gzファイルを持ってきて、

```bash
$ tar -xvf openbabel-2.3.1.tar.gz
$ mkdir build 
$ cd build
```

する。
次にcmakeをするのだが、`~/Tools/openbabel`にインストールしたければ

```bash
$ cmake ../openbabel-2.3.1 -DCMAKE_INSTALL_PREFIX=~/Tools/openbabel
$ make 
$ make install
```

としてやればOK。
ここまでに関しては、依存関係で問題になることもあるのでそちらの方が大変だと思う。

あとはpathを通すことを忘れずに。
.bashrcかなにかに

```bash
export LD_LIBRARY_PATH=~/Tools/openbabel/lib:$LD_LIBRARY_PATH
```

を入れておこう。

#走らせてみる（コンパイルの仕方とか）
今回使うコードは以下の通り。

```cpp:test.cc
#include <iostream>
#include <string>
#include <sstream>

#include <openbabel/mol.h>
#include <openbabel/obconversion.h>

int main(int argc, char** argv){

  // smilesからOBMolを生成
  std::string smiles = "c1ccc2ccccc2c1";
  std::stringstream ss(smiles);
  OpenBabel::OBConversion conv(&ss);
  conv.SetInFormat("smi");
  OpenBabel::OBMol mol;
  conv.Read(&mol);

  // OBMolのAtomsを出力
  std::cout << "Atom information" << std::endl;
  std::cout << "AtomId AtomIdx" << std::endl;
  for(OpenBabel::OBAtomIterator ait = mol.BeginAtoms(); ait!=mol.EndAtoms(); ++ait){
    std::cout << (*ait)->GetId()
              << " "
              << (*ait)->GetIdx()
              << std::endl;
  }
  std::cout << std::endl;


  // OBMolのBondsを出力
  std::cout << "Bond information" << std::endl;
  std::cout << "BeginAtomIdx EndAtomIdx" << std::endl;
  for(OpenBabel::OBBondIterator bit = mol.BeginBonds(); bit!=mol.EndBonds(); ++bit){
    std::cout << (*bit)->GetBeginAtomIdx()
              << " "
              <<(*bit)->GetEndAtomIdx()
              << std::endl;
  }
  return 0;
}
```

これをコンパイルする。（意図的に2段階に分けてコンパイルしている）

```bash
$ g++ -O2 -I~/Tools/openbabel/include/openbabel-2.0 -o test.o -c test.cc
$ g++ -O2 -o test test.o -L~/Tools/openbabel/lib -lopenbabel
```

これで実行すると以下のような出力が得られる。

```bash
$ ./test
Atom information
AtomId AtomIdx
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10

Bond information
BeginAtomIdx EndAtomIdx
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
4 9
9 10
1 10
```

実行できた。
exec-maven-plugin を使って Maven から npm を実行する


## 概要
npm タスクを Maven と連携してみる。
具体例をひとつあげると[JSライブラリを取り込む npm タスク](http://qiita.com/youhei/items/1621f87f096d3d35da7d)を用意して、`mvn compile` と同時に動くようにしてみる。

## 手順
exec-maven-plugin を使って、npm install を実行する。
Maven には多様なライフサイクルが定義されている[^1]。例示した npm タスクは JS ライブラリを npm 経由で取ってくるタスクなので、`compile` 前のソースコード変換をする `generate-sources` ライフサイクルがこれに該当する（厳密には違う感じもするけど）。

以上を pom.xml に書くとこのようになる。

```pom.xml
	<build>
		<plugins>
		    ...
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>exec-maven-plugin</artifactId>
				<executions>
					<execution>
						<id>exec-npm-install</id>
						<phase>generate-sources</phase>
						<configuration>
							<executable>npm</executable>
							<arguments>
								<argument>install</argument>
							</arguments>
						</configuration>
						<goals>
							<goal>exec</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

```

これで `mvn compile` 実行時に `npm install` も動作するようになった。めでたしめでたし。

## おまけ - Jenkins 連携
CI に Jenkins を導入している場合は Jenkins から npm を見えるように以下の作業が必要になる。

 1. [NodeJS Plugin](https://wiki.jenkins-ci.org/display/JENKINS/NodeJS+Plugin) をインストールする
 2. 該当プロジェクトの設定ページの Build Environment セクションの "Provide Node & npm bin/ folder to PATH" にチェックを入れる

## まとめ
`mvn` と `npm` を連携した。基本的に利用者は `npm` の存在をほとんど意識しないで済むのが利点といえる。

## 参照
[^1]: [Introduction to the Build Lifecycle](https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html)
Windows上のVagrant環境で、ホストOSとゲストOS 間でシンボリックリンクを共有する

サーバサイドプログラムの開発をWindows上のVagrant環境で行っているとき、しばしばシンボリックリンクの設定に悩むことがあったのでメモしておきます。

## ホストOS (Windows) のシンボリックリンクをゲストOS (Linux)上で認識させる

Windowsのシンボリックリンク機能を使用すれば可能です。
なお、Windows 上で作成できるリンク的な機能としては以下の4種類が存在しますが、ホストOSおよびゲストOS両方で正しく認識できるのはシンボリックリンクのみです。

* ショートカット
* シンボリックリンク
* ジャンクション
* ハードリンク

シンボリックリンクは「mklink」コマンドを使用して作成することもできますが、「[Link Shell Extension](http://schinagl.priv.at/nt/hardlinkshellext/linkshellextension.html)」を使用すれば、エクスプローラ上から右クリックメニューで作成することもできて楽です。


## ゲストOS (Linux) のシンボリックリンクをホストOS (Windows) 上で認識させる

こちらは、Linuxの「ln」コマンドを使用して普通に作成すれば、ホストOS上でも正しく認識できます。
ただし、Vagrantを管理者権限で起動しておかないと以下のエラーメッセージが表示され、リンクを作成することができません。

```bash
$ ln -s Vagrantfile Vagrantfile.link
ln: creating symbolic link `Vagrantfile.link': Protocol error
```

コマンドプロンプト上から「vagrant up」を実行している場合は、スタートメニュー上のコマンドプロンプトを右クリックして、「管理者として実行」で起動すればOKです。

***2015/07/06 追記***

注意点として、Linux側でシンボリックリンクを絶対パスで指定した場合、Windows側で正しく参照することが出来ません。
つまり、

```bash
$ ln -s Vagrantfile Vagrantfile.link
```

この書き方はWindowsでもシンボリックリンクとして認識されますが、

```bash
$ ln -s /vagrant/Vagrantfile /vagrant/Vagrantfile.link
```

この書き方だとダメです。
`Error Code: 123` のようにエラーになります。

## 付記

なお、Windows のシンボリックリンクはGitにコミットすることができないので、あらかじめ .gitignore で無視してやる必要があります。
ちょっとしたログファイル監視スクリプトを書いてみた

python/tornadoで小規模なサーバーアプリを動かす際、ログファイルを監視して特定の文字列が出現した時に任意のコマンドを動かしたい要求が生じたので適当にスクリプトを書いてみました。

要件としては

+ 追記のみ行われるログファイルに対し、追記が行われたタイミングで追記部分を外部スクリプトに1行ずつ渡す
+ 複数行1度に追記された場合でももれなく渡す
+ ログローテーションは考慮しない(今後の課題)

- - -
(※コメント内容を受けて改良したので[追記の追記の追記](http://qiita.com/dplusplus/items/fa2dae282715141d8270#%E8%BF%BD%E8%A8%98%E3%81%AE%E8%BF%BD%E8%A8%98%E3%81%AE%E8%BF%BD%E8%A8%98)まで飛んでください。)
- - -


inotify-toolsに依存するので事前に導入しておきます。

```sh:logwatch.sh
#!/bin/sh

watchfile=$1
script=$2

if [ $# != 2 ] ; then
    echo 'argument is invalid.'
    exit
fi

while bookmark=$(awk 'END { print NR+1 }' < "$watchfile") ; \
      inotifywait -e MODIFY "$watchfile" >/dev/null 2>&1
do
    BKUP_IFS=$IFS
    IFS='
'

    for line in $(tail -n +"$bookmark" "$watchfile")
    do
        "$script" "$line"
    done

    IFS=$BKUP_IFS
done

```

```shell-session
% echo 'line:1' > hoge
% ./logwatch.sh hoge /bin/echo &
% echo 'line:2' >> hoge
line:2
% echo 'line:3
line:4
line:5' >> hoge
line:3
line:4
line:5
```

こんなやらんでも便利なツールがあるよーというのがあればぜひご教授ください。

# 追記
コメントで`tail -qF`が使えるよというのを教えていただきました。以下改良版。

```sh:logwatch2.sh

#中略

tail -n +$(awk 'END { print NR+1 }' < "$watchfile") -qF "$watchfile" 2>/dev/null | while read -r l ; do "$script" "$l" ; done &

```

# 追記の追記
閲覧するだけならtailfやlessのFコマンドも使えそうです。

# 追記の追記の追記
```sh
% tailf -0 | grep "pattern" | some_command
```

でいい気がしてきた。
stackでghc-modを使う試行錯誤のメモ

[こんな状態](https://github.com/kazu-yamamoto/ghc-mod/issues/498#issuecomment-111820529) なので今すぐには無理って見解が出てるんだけど、`cabal`を捨て去らずに頑張ればなんとかなるかもね。誰かのヒントになるかもしれないのでやったことをメモ。

## 1. stackを普通に使う

`stack` は普通に使いたいので、普通に使う。システムの`ghc`が入っているか、またそれを使うかで多少ややこしくなるけど、今回はシステムに `ghc` が入っていてある程度使っていて、そこでさらに `stack` 経由で `ghc-7.8.4` を入れたパターン。と言っても、この手順だとシステムのghcで使ってた環境は壊れてそうな気がする。

[stack.yamlはこんなの](https://github.com/hiratara/build-lambdabot-with-hipchat/blob/master/stack.yaml)。

最低でも `stack build` を一度は実行して、 `*.cabal` ファイルの依存は解決しておく必要がある。

## 2. ghc-modの調達

`stack install ghc-mod` で `~/.local/bin` へ投入。ただ、 `ghc-mod` はghcやCabalと密結合してるので、 `~/.local/bin` だと環境ごとの切り替えができなくてだいぶ不安。システムのghcやstackで入れた複数バージョンのghcを切り替えて使う事態になると死を覚悟した方がいい。

そういう意味では `.stack-work` 以下に入れておくのもありかもしれないし、今回の方法とはすごく相性いい気がしてきたけど、残念ながら試してないので誰か。

## 3. cabalの調達

`stack install cabal-install` で。前述の `ghc-mod` と同じビルドプランにならないとCabalのバージョン違いで死を見るので注意。

これも `.stack-work` でやるともっといいかも。

## 4. cabal configureの実行

`ghc-mod` のために必要。sandboxは使わないしbuildもしない。

普通に `ghc-mod` を叩いてみると怒られる。

```
% stack exec -- ghc-mod root
launching operating system process `cabal configure` failed: cabal configure (exit 1)
.. snip ..
```

`ghc-mod` 側で `cabal confugire` の実行をしないという方針がうまくいくかは調べてないけど、今回は言われた通り素直に `cabal configure` を実行することにした。

`stack exec -- cabal configure` が通ればきれいなのだけど、世の中そう上手くできてない。以下のように怒られる。

```
% stack exec -- cabal configure
cabal: Use of GHC's environment variable GHC_PACKAGE_PATH is incompatible with
Cabal. Use the flag --package-db to specify a package database (it can be used
multiple times).
```

以下のような `cabal.config` を `*.cabal` と同じディレクトリにおいた。あるいは `--package-db` 引数でもいいと思う。

```
% cat cabal.config
package-db: (ホームディレクトリ)/.stack/snapshots/x86_64-osx/lts-2.15/7.8.4/pkgdb
package-db: (プロジェクトのルート)/.stack-work/install/x86_64-osx/lts-2.15/7.8.4/pkgdb
```

これで `cabal config` を実行すればいいのだけど、他のghc環境が見えるとうまくない(たぶん `ghc-pgk` が足をひっぱってる)ので、`PATH`指定した。対象としているghcのバイナリが最初に見えるようにするのが重要。

```
% PATH=~/.stack/programs/x86_64-osx/ghc-7.8.4/bin:~/.local/bin:$PATH cabal configure
Resolving dependencies...
.. snip ..
```

現状、`*.cabal` を弄る度に `stack build` とこの作業を手でやってるけど、`ghc.el` をいじった方がいいかも？ そこは深く追ってない。

## 5. ghc.el を改変

ここが一番イケてないとこだけど、 [こんな感じ](https://github.com/hiratara/ghc-mod/commit/3ed5c8aeecb4987fdc25ecf44285db986d580f81) で `ghc-mod` の実行を `stack exec --` 経由にすると、うまく `ghc-mod` を騙して適切なパッケージDBを参照させられる。

`.emacs.d` 以下の対象ファイル見つけて編集してバイトコンパイルすれば十分だけど、当然その辺は自己責任で。

他、 `ghc.el` が `cabal config` を呼んでいる箇所もありそうなので、そっちも直した方が幸せになるのかも。

## 終わり

ここまでで `ghc-mod` が動いてくれるようになったよ。荒削りなのでもっといい方法は作れそう。
画面でポチポチしない！コマンドラインからJP1ジョブ定義を一括変更して楽をする方法

JP1とは
=====================================================

JP1とは、JP1ジョブ管理（JP1/AJS3：JP1/Automatic Job Management System 3)のことで、国内No.1のシェアを持つ運用管理ツールである。
JP1では、ジョブネットと言われるジョブの入れ物に、コマンドを実行するジョブとジョブネット等が格納されており、それらはジョブの定義に基づいたルールで実行される

ジョブ定義取得
====================================================
以下、JP1内部のFUNCTIONである`ajsprint`を利用すると、ジョブ定義を取得することができる。
例えば、以下のコマンドを実行すると、ジョブの絶対パスとそのサービス名を取得することができる。

```sh:ジョブ定義取得
/opt/jp1ajs2/bin/ajsprint -F ${サービス名} -f "%JN,%pm" -R -J ${ジョブパス}
```

ジョブ定義の一括変更
======================================================
先ほどのジョブ定義取得を利用して、ジョブ定義を一括変更するコマンドを作成することできる。

ジョブのパラメータを一括編集
--------------------------------------------
以下を実行すると、ジョブパス以下のジョブを"現在の状態"に編集するコマンドが生成される。
※表示された変更を行いたい内容・対象のみ、テキストエディタで編集して実行すれば一括変更できる
※JP1のFUNCTION定義配置箇所はopt/jp1ajs2/bin/と仮定

```sh:ジョブパラメータ一括取得
/opt/jp1ajs2/bin/ajsprint -F ${サービス名} -f "[%JN][%pm]" -R -J ${ジョブパス} | sed 's/\[\(.*\)\]\[\(.*\)\]/\/opt\/jp1ajs2\/bin\/ajschgjob -F ${サービス名} -pm '\''\2'\'' \1/g'
```

ジョブの所有者変更
---------------------------------------------

※表示された変更を行いたい内容・対象のみ、テキストエディタで編集して実行すれば一括変更できる
※JP1のFUNCTION定義配置箇所は`opt/jp1ajs2/bin/`と仮定

```sh:ジョブ所有者変更
/opt/jp1ajs2/bin/ajsprint -F ${サービス名} -f "[%JN][%ow]" -R ${ジョブパス} | sed 's/\[\(.*\)\]\[\(.*\)\]/\/opt\/jp1ajs2\/bin\/ajschange -F ${サービス名} -o '\''\2'\'' \1/g'
```

実行ユーザ名変更
---------------------------------------------
※表示された変更を行いたい内容・対象のみ、テキストエディタで編集して実行すれば一括変更できる
※JP1のFUNCTION定義配置箇所はopt/jp1ajs2/bin/と仮定

```sh:実行ユーザ名変更
/opt/jp1ajs2/bin/ajsprint -F AJSROOT1 -f "[%JN][%un]" -R -J ${ジョブパス} | sed 's/\[\(.*\)\]\[\(.*\)\]/\/opt\/jp1ajs2\/bin\/ajschange -F ${サービス名} -U '\''\2'\'' \1/g'
```

ジョブ削除
---------------------------------------------
※表示された変更を行いたい内容・対象のみ、テキストエディタで編集して実行すれば一括変更できる
※JP1のFUNCTION定義配置箇所は`opt/jp1ajs2/bin/`と仮定

```sh:ジョブ削除
/opt/jp1ajs2/bin/ajsprint -F ${サービス名} -f "[%JN]" -R -N ${ジョブパス} | sed 's/\[\(.*\)\]/\/opt\/jp1ajs2\/bin\/ajsdelete -F -N ${サービス名} '\''\1'\''/g'
```

コメント変更
---------------------------------------------
※表示された変更を行いたい内容・対象のみ、テキストエディタで編集して実行すれば一括変更できる
※JP1のFUNCTION定義配置箇所は`opt/jp1ajs2/bin/`と仮定

```sh:コメント変更
/opt/jp1ajs2/bin/ajsprint -F ${サービス名} -f "[%JN][%cm]" -R ${ジョブパス} | sed 's/\[\(.*\)\]\[\(.*\)\]/\/opt\/jp1ajs2\/bin\/ajschange -F ${ジョブパス} -C '\''\2'\'' \1/g'
```

保留ジョブを解除
---------------------------------------------
※表示された変更を行いたい内容・対象のみ、テキストエディタで編集して実行すれば一括変更できる
※JP1のFUNCTION定義配置箇所は`opt/jp1ajs2/bin/`と仮定

```sh:保留ジョブ解除
/opt/jp1ajs2/bin/ajsprint -F ${サービス名} -f "[%JN][%ha]" -R ${ジョブパス} | grep yes | sed 's/\[\(.*\)\]\[\(.*\)\]/\/opt\/jp1ajs2\/bin\/ajschange -F ${サービス名} -b n \1/g'
```
VagrantのRsync Synced Folderについて

# Rsync Synced Folder
ホストマシンから、ゲストマシンへのファイルの同期をするシステム
## メリット
- 開発はホストマシンで、実行はゲストマシンで行う
- 好きなエディタで開発できる
- VirtualBox の shared folderよりもパフォーマンスがよい

## デメリット
- ファイルオーナーが書き換えられてしまう

## 更新されるタイミング
`vagrant up` , `vagrant reeled`, `vagrant provision`, `vagrant rsync`が実行されたタイミング
このままだと毎回手動で更新しなければならないので、`vagrant rsync-auto`を実行しておけば、対象のディレクトリに変更があったときに自動で更新してくれる

## 環境
Vagrant 1.5以上
ホストとゲストの両方に、`rsync`が必要
基本的にはVagrantが自動的にインストールしてくれる

## 設定
Vagrantfileのsynced folderで`type=rsync`を指定する

### 参考
http://www.1x1.jp/blog/2014/03/vagrant-rsync-synced-folder.html
eclipseにAmaterasUMLをインストールする

## 概要
既存のソースをもらった時、どういうクラスがあって、どこから追ったらいいのか、分からない時がある。そのときにソースからクラス図を吐き出してくれるプラグインがあったらと思って探してみました。
その結果、[AmaterasUML](http://amateras.osdn.jp/cgi-bin/fswiki/wiki.cgi?page=AmaterasUML)がよさ気だったのでインストールしてみます。

## GEFインストール
まず[GEF](http://www.eclipse.org/gef/)をインストールします。
eclipseのヘルプ＞新規ソフトウェアのインストールから、Lunaリポジトリを選択してGEFを選択します。
![スクリーンショット 2015-06-28 7.25.20.png](https://qiita-image-store.s3.amazonaws.com/0/84298/9dd08480-e4ad-8c5d-999f-dff2b0df516f.png)
つぎへ
![スクリーンショット 2015-06-28 7.26.51.png](https://qiita-image-store.s3.amazonaws.com/0/84298/314185c5-ce21-7ccb-6143-bafd52ea6031.png)
画面を進めて、Eclipseを再起動してインストール完了になります。

## AmaterasUMLのインストール
[AmaterasUML](http://amateras.osdn.jp/cgi-bin/fswiki/wiki.cgi?page=AmaterasUML)からAmaterasUML_1.3.4.zipをダウンロードします。
解凍するとjarファイルが入っていますので、それをeclipseのdropinsフォルダにコピーします。
![スクリーンショット 2015-06-28 13.44.25.png](https://qiita-image-store.s3.amazonaws.com/0/84298/8ee72137-8329-2053-1c3c-4973dc9b726d.png)
eclipseを再起動したらインストール完了です。

## クラス図の自動生成
eclipseが起動したら、新規＞その他＞AmaterasUML＞クラス図で新規ファイルを作成します。そこに複数のjavaファイルをD&Dすれば、自動的にクラス図が生成されます。

クラスを俯瞰してみることができるので、プロジェクトの理解を早めることができると思います。
bitbucket > commit message > @void は Alexey Boriskinになるようだ

bitbucketのリポジトリへコミットするとき、@void という文字列をコミットメッセージに入れるとブラウザでコミットメッセージをみた時、以下のようになる

    Alexey Boriskin

@void　がそういうふうに割り当てられているようだ。

他にもこういうのがあるのだろうか?
Xcode のプロジェクトをよしなに開いてくれるスクリプト

小ネタですが

xcode のプロジェクトをターミナルから開くことが良くあって、
その際に `$ open Project.x[Tab]` って補完しようとしても `*.xcworkspace` と `*.xcodeproj` が両方あると `$ open Project.xc` で止まっちゃってムキーってなることが割とよくありまして、
というか今時 xcworkspace が無い方が珍しいのではと思うので大体ムキーとなるわけで、
簡単なスクリプトを書いて対応していたのでした。

https://gist.github.com/funnything/a13666cae9c6d6c7af0c

```rb
#!/usr/bin/env ruby
 
def try_open(pattern:)
  match = Dir[pattern].first
  match && `open #{match}`
end
 
try_open(pattern: '*.xcworkspace') || try_open(pattern: '*.xcodeproj')
```

これで、対象のディレクトリにいって `$ openxcode[Enter]` で大体オッケーで幸せです。
gitwatch > sinceYearMonth / fromYearMonth

ある年月以降の処理をするクラスを作っていて、その変数名をどうしようか考えていた。

githubで検索した所
- sinceMonthやsinceYear : code例がいくつかある
- sinceYearMonth : code例なし
- fromYearMonth : code例がいくつかある


sinceとfromの英語的な違いは以下が興味深かった
http://lib21.blog96.fc2.com/blog-entry-2010.html
> from は「起点」を示す (starting at a particular time and continuing)
> since は「過去の起点から現在まで」を示す (from the past until the present time)

取得済みの過去データに対して、ある年月以降のデータだけ処理したい場合、since があっているかも。

一方で、ある年月以降から今後も処理続けるような場合は from があっているように思う。
Reactでドキュメントの位置を取る

Reactで生DOMの情報を取る時は、findDOMNodeを使う。

```js
import React from 'react';

class Text extends React.Component {
  componentDidMount() {
    var pointA = React.findDOMNode(this.refs.pointA);
    var pointB = React.findDOMNode(this.refs.pointB);
    console.log(pointA.offsetTop);
    console.log(pointB.offsetTop);
  }
  render() {
    return (
      <div className="text">
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui.</p>
        
        <p ref="pointA"></p>
        <p>Morbi nec metus. Phasellus blandit leo ut odio. Maecenas ullamcorper, dui et placerat feugiat, eros pede varius nisi, condimentum viverra felis nunc et lorem. Sed magna purus, fermentum eu, tincidunt eu, varius ut, felis. In auctor lobortis lacus. Quisque libero metus, condimentum nec, tempor a, commodo mollis, magna. Vestibulum ullamcorper mauris at ligula. Fusce fermentum. Nullam cursus lacinia erat. Praesent blandit laoreet nibh.</p>
        <p>Fusce convallis metus id felis luctus adipiscing. Pellentesque egestas, neque sit amet convallis pulvinar, justo nulla eleifend augue, ac auctor orci leo non est. Quisque id mi. Ut tincidunt tincidunt erat. Etiam feugiat lorem non metus. Vestibulum dapibus nunc ac augue. Curabitur vestibulum aliquam leo. Praesent egestas neque eu enim. In hac habitasse platea dictumst. Fusce a quam. Etiam ut purus mattis mauris sodales aliquam. Curabitur nisi. Quisque malesuada placerat nisl. Nam ipsum risus, rutrum vitae, vestibulum eu, molestie vel, lacus.</p>
        <p ref="pointB"></p>
        
      </div>
    );
  }
}
export default Text;
```

スクロール位置なんかは、以下を参考に。
※ただし、getDOMNodeは既に廃止され、findDOMNodeに置き換わっているので注意。
http://blog.vjeux.com/2013/javascript/scroll-position-with-react.html
WIP - OSX設定いろいろ

新しいパソコンの環境設定を手動でするのは時間がかかって大変です。ここでは**OSX**の環境設定のコマンドについてまとめました。

![2NOYT.png](https://qiita-image-store.s3.amazonaws.com/0/5559/a028e4ef-868a-a240-4ae3-166e6a1dd679.png)

キーのリピート設定：

```bash
# 一番早い設定
$ defaults write NSGlobalDomain KeyRepeat -int 0
```

// TODO: 設定できる最小値と最大値を書く

リピート入力認識までの時間：

```bash
$ defaults write NSGlobalDomain InitialKeyRepeat -int 12
```

// TODO: 設定できる最小値と最大値を書く

より細かくキーのリピート設定やその入力認識までの時間を早くもしくは遅くしたい場合には、[KeyRamp4MacBook](https://pqrs.org/osx/karabiner/index.html.ja)を使えばできます。


## 参考

 * [Mac OS Hints](http://hints.macworld.com)
 * [OSX For Hackers](https://gist.github.com/erikh/2260182)
 * [mathiasbynens/dotfiles](https://github.com/mathiasbynens/dotfiles/blob/master/.osx)
 * [Mac Tips, Tricks & Shortcuts in easy steps, 2nd Edition: for Apple iMacs and](https://books.google.co.jp/books?id=2r7zCQAAQBAJ&pg=PT287&lpg=PT287&dq=key+repeat+mac+default+killall&source=bl&ots=GCzhDP9In-&sig=9CzbmIzdr__tc8ilDQ4gtRuatxw&hl=ja&sa=X&ei=2nCPVbuqH-O2mwWq6L7ABA&ved=0CEcQ6AEwBA#v=onepage&q=key%20repeat%20mac%20default%20killall&f=false)
[Apache2.4] yum経由でApache2.4 をインストールしてPHP5.6を動かすまで

タグがめっちゃ使いにくくなってる…
そして下書き保存すると、タグが保存されない。。


# 概要
いまさらながら、Apache2.4をCentOS6.6にインストールしてPHP5.6を動かす。

# Apache2.4 インストール

```shell-session
# cd /etc/yum.repos.d
# wget https://repos.fedorapeople.org/repos/jkaluza/httpd24/epel-httpd24.repo
# yum reinstall --enablerepo=epel-httpd24 httpd24
```

インストールされたパスは``/opt/rh/httpd24/``です。

## 設定

``/etc/httpd``っていうタイピングがなれてますので、そちらにシンボリックリンク。（必要あれば）

```shell-session
# ln -s /opt/rh/httpd24/root/etc/httpd /etc/httpd24
# ln -s /opt/rh/httpd24/root/var/www/html /var/www/html24
```

### httpd.conf

```shell-session
# vi /etc/httpd24/conf/httpd.conf
（必要に応じて設定してください）
# mod_rewrite の設定
<Directory "/opt/rh/httpd24/root/var/www">
    DirectoryIndex index.php index.html
    Options Indexes FollowSymLinks SymLinksIfOwnerMatch
    AllowOverride All
    # Allow open access:
    Require all granted
</Directory>
```

### SSL証明書の作成
オレオレ証明書の作成

```shell-session
# cd /path/to/hogehoge
# openssl genrsa 2048 > localhost.key
# openssl req -new -key localhost.key > localhost.csr
# openssl x509 -days 3650 -req -signkey localhost.key < localhost.csr > localhost.crt
```


### サービスの登録と起動

```shell-session
# chkconfig httpd24-httpd on
# service httpd24-httpd start
```
うまく起動しなかったら、メッセージを見ながら修正していく。


# php56のインストール
割愛。
yum経由でインストールすると、もれなくhttpd22がインストールされるが気にしない。
（サービスは削除しておいたほうがいいかも？）


# php-fpmのインストール
Apache24でPHPを動かすには、FastCGI経由で動かすことになります。

```shell-session
# yum install php-fpm
# vi /etc/php-fpm.d/www.conf （確認）
listen = 127.0.0.1:9000

# chkconfig php-fpm on
# service php-fpm start

# vi /etc/httpd24/conf.d/php.conf
```
```vim:php.conf
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html24/$1
```
```shell-session
# service httpd24-httpd restart
```

# 確認
```shell-session
# vi /var/www/html24/index.php
<?php phpinfo();

# curl http://localhost/
```

phpinfo()が出力されればok

# ※PHPモジュールの追加
PHPモジュールを追加したら、httpd24-httpd だけでなく、php-fpmも再起動する。

```shell-session
# service php-fpm restart
# service httpd24-httpd restart
```


# 注意点

``httpd24``は``/opt``にインストールされるため
パーティションサイズとか容量に注意
Excel 1900年うるう年問題

https://support.microsoft.com/ja-jp/kb/214326/ja

1900年は100の倍数なのでうるう年ではありませんが、
Excelさんはうるう年とみなします。

OLEとかでアクセスしたら1900/2/28以前の日付がズレて取得されます。
（Excelで1900年日付を入れたファイルを、OOoのCalcで開くと残念さがわかります）

作成しているシステムがもしテンプレート出力機能を持っているなら
1904年から日付扱いするオプション（「1904年から計算する」）があるので、
onにしておいた方が良さそうですね。
webpack-dev-server 使用入門


當在開發前端的時候，需要一個簡單的 server ，就可以用這個套件

# 前置作業

首先要有安裝過 node.js 和 npm 套件管理工具

# 安裝 

透過 npm 安裝即可

``` bash
npm install -g webpack-dev-server
```

# 使用

進到專案的根目錄

``` bash
cd /path/to/project
```

## 啟動 server

``` bash
webpack-dev-server
```

直接在終端機執行即可

這時候會跳出一段訊息

``` text
Hash: 396f0bfb9d565b6f60f0
Version: webpack 1.10.0
Time: 9ms
webpack: bundle is now VALID.
http://localhost:8080/webpack-dev-server/
webpack result is served from /
content is served from /path/to/project
```

## 開啟頁面

這時候只要在瀏覽器的網址列輸入

``` text
http://localhost:8080/
```

就可以開啟 `/path/to/project` 資料夾內的內容

## 關閉 server

這時候直接在終端機按下 `Ctrl + C` 中斷 webpack-dev-server 即可

*環境 - Mac OSX 10.10.2, npm 2.11.2, webpack-dev-server 1.10.0*
Herokuのパスワードを変更した後のheroku loginでAuthentication failed.がでる解決方法

ブラウザからHerokuのパスワードを変更したら、ターミナルからHerokuにログインできなくなりました。
環境はMacでHerokuのプラグインheroku-accountsを利用して複数アカウントで使用します。

# Heroku へのログインが失敗
`heroku login`をしたら失敗してしまいました。 https://www.heroku.com/ でパスワードの変更をした後にこの現象が出ています。

```bash:Herokuへのloginで失敗
heroku login
WARNING: Toolbelt is currently updating
WARNING: heroku-accounts plugin is installed. This plugin is known to have problems with HTTP Git.
Enter your Heroku credentials.
Email: test@example.com
Password (typing will be hidden): 
Authentication failed.
```
`Authentication failed.`が出てログインが失敗してしまいます。
Herokuのパスワードを変更したら一度ローカルのアカウントを削除して作りなおすとログインができました。その手順を以下に記述しておきます。

# 一旦アカウントを削除する
アカウントを削除します。

```bash:アカウントを削除
heroku accounts:remove アカウント名

Account removed: アカウント名
```

ターミナルを新しく開きます。
それから、同じアカウントを追加します。

```bash:アカウントを追加
heroku accounts:add アカウント名 --auto

Enter your Heroku credentials.
Email: 自分のメールアドレス
Password (typing will be hidden): 
```
追加したアカウントへ切り替えます。

```bash:アカウントを切り替え
heroku accounts:set アカウント名
```
アカウントが切り替わっているか確認します。

```bash:アカウントを確認
heroku accounts
hogepiyo
* アカウント名
```
`*`がアカウント名の前についていたら切り替わっています。

# Herokuにログイン
Herokuにログインできるか確認します。

```bash:Herokuへのlogin
heroku login
WARNING: heroku-accounts plugin is installed. This plugin is known to have problems with HTTP Git.
Enter your Heroku credentials.
Email: 自分のメールアドレス
Password (typing will be hidden): 
Authentication successful.
```
今度はログインが成功しました。やったね(☝ ՞ਊ ՞)

# 参考

http://stackoverflow.com/questions/22957664/authentication-failure-in-heroku-cli-after-password-change
atomで単語削除を拡張するパッケージを作った

Atomが正式リリースされて目出度いのと宣伝も予てQiitaへ初投稿。
作ってみたパッケージの説明です。

##atomのページ
https://atom.io/packages/delete-plus

余りにも英語力がなく説明出来ていない気がします。
スクショで何となく伝わって欲しい。。

##こんな挙動
単語削除を行う際に、ダブルコーテーションやら括弧やらで囲まれている文字列はスペースが入っていようとスラッシュが入っていようと一単語として削除するよーというもの。

![スクショ](https://camo.githubusercontent.com/35dd786f4e334e0820df395c7172709fbee36923/68747470733a2f2f646c2e64726f70626f7875736572636f6e74656e742e636f6d2f732f6d78646f743774623971326f3338372f64656c6c5f30312e676966)

![スクショ](https://camo.githubusercontent.com/d8b509d8fa7c8d56b16cacd21b1f64b22bd8d61c/68747470733a2f2f646c2e64726f70626f7875736572636f6e74656e742e636f6d2f732f326b797461783276716e766232736d2f64656c6c5f30322e676966)

対象記号の後ろにカーソルが無い場合は、atomに処理を返しているので通常通りの単語削除として機能します。

##必要に応じてkeymapsの書き換え
keymapsを書き換えてフックしているだけなので、ショートカット変えている人やvimモードの人だと上手く動かないかもしれません。下記ファイルの内容を自身の環境に合わせて書き換えれば動くんじゃないかと思います。

```coffeescript:delete-plus/keymaps/delete-plus.cson
'atom-workspace atom-text-editor:not([mini])':
  'ctrl-delete': 'unset!'
  'ctrl-delete': 'delete-plus:delete’
```

---

個人的にはatom以前から使っている挙動で、これが無いと気持ち悪くて作業になりません。
特にHTMLやXMLの書き換えに便利です。フロントエンドな人は是非使ってみてください。

あと英語を直してくれる人がいると喜びます！
雑感 > 正しいマルチタスク / 誤ったマルチタスク

正しいマルチタスクをしようとしても時々誤ったマルチタスクをすることがある。

正しいマルチタスク
- 小さい単位でそのことに集中する。その間は他のことをしない。
- 小さい単位で終わらせてから、次のことを始める。

誤ったマルチタスク
- 小さい単位でも他のことをしようとしてしまう
- 小さい単位で終わらせず、別のことを始める

例(正しい例):
シャワーを浴び始める。
シャワーを浴び終える。
風呂場の掃除を始める。
風呂場の掃除を終える。

例(誤った例):
シャワーを浴び始める。
風呂場の汚れが気になり掃除を始める。
掃除道具の整頓が気になり整頓を始める。
(シャワーを浴びることが中々終わらない）。

僕自身尊敬する人は正しいマルチタスクをしている人だと最近気づいた。そういう人はトラブルが少ないし、トラブルが起きてもその対処がきちんとしている。

時々やってしまう自分も含めて、誤ったマルチタスクをしてしまうと、最初に始めたことが終わらないうちに別のことを始めてしまい、複数のことを扱わないといけなくなるので。より解決が難しくなる。

自分がやっているのが正しいマルチタスクか時々考えるようにしている。

正しい例の場合、それぞれのタスク間の時間が伸びていくので「マルチタスク」と言わないかもしれない。

「5つのことを15分でやってください」と言われた時、1つずつ処理(3分ずつ)逐次するほうが、5つのうち複数を同時にやるよりも失敗しにくい。もちろん、複数同時にできる人もいるが、頑張って難しい方法をせずとも、普通にやって失敗しにくい方法でやっていくのが自分にはあってそう。
PHPのDateTimeを比較演算子で比較する

PHPのDateTime型は比較演算子がオーバーロードされており、普通に比較することができる。未来の日時の方が"大きい"という扱いがされる。

```php
<?php
$date1 = new DateTime('2015-01-01');
$date2 = new DateTime('2015-01-02');
$date3 = new DateTime('2015-01-02');

var_dump($date1 < $date2); // true
var_dump($date2 <= $date3); // true

var_dump($date1 == $date2); // false
var_dump($date2 == $date3); // true
var_dump($date2 === $date3); // false
```

PHPのオブジェクトは[]などを除けば演算子オーバーロードはサポートされていない(エクステンションを書けば可能だけど)ので、 **こんなことができるクラスは非常に珍しい** 。
この記法を使うときはコメントを書いておいた方がいいかもしれない。


(編集)
通常のオブジェクトの比較についてはコメント欄にて @tadsan さんの解説がわかりやすいので参照のこと。
OTA配布用Jenkinsジョブの作成

# 前提
1. Xcodeインストール済み
2. Homebrewインストール済み
3. Cocoapods利用

# 1. Nginx
`brew install nginx`
証明書作成
`openssl req -newkey rsa:4096 -x509 -nodes -out server.crt -keyout server.key -days 3650`
`mv server.crt server.key /usr/local/etc/nginx`
証明書公開
`ln -s /usr/local/etc/nginx/server.crt /usr/local/var/www`
nginx.conf修正
自動起動（80番ポート）
`sudo ln -s /usr/local/opt/nginx/homebrew.mxcl.nginx.plist /Library/LaunchDaemons`
`sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.nginx.plist`

# 2. Jenkins
`brew install jenkins`
plist変更 [参照](http://qiita.com/makoto_kw/items/cbe93d4ebbc35f3b43fd)
※ `<string>--httpListenAddress=127.0.0.1</string>`削除しないと外部から見れない

# 3. ジョブ
## [Xcode Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Xcode+Plugin)を利用
Pack application and build .ipaにチェック
## [ota-tools](https://github.com/RichardBronosky/ota-tools)を利用
Execute shellでplist, htmlを生成してipaと一緒にnginx配下にコピー
※ ota-toolsをGHE上に置いて適宜編集しています
## Post-build Actions
.ipa, plist, htmlをアーカイブ

# 4. 配布
1. server.crtをiOS端末にインストール
2. 生成したhtmlからアプリインストール
c++ builder XE4, 10.2 Tokyo > fileIO > フォルダの深さを得る

```txt:動作確認
C++ builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/09)
```

フォルダの深さを得るコード

```cpp
int __fastcall TFolderCopyUnit::countDirDepth(String dir_)
{
	int depth;
	TStringList *list = new TStringList;

	list->StrictDelimiter = true;
	list->Delimiter = L'\\';
	list->DelimitedText = dir_;
	depth = list->Count - 1; // D:\WORKは1となるように-1する
	delete list;

	return depth;
}
//---------------------------------------------------------------------------
```

UnicodeString.Pos()を使って"\"の数を数えるというのも考えたが、重複などの処理が面倒そうだったので、上記で実装した。
ES6 Promiseベースのdenodeify()を実装する

##はじめに

ES6の`Promise`を使って`denodeify()`を実装してみた。Q.jsの[denodeify()の実装](https://github.com/kriskowal/q/blob/v1/q.js#L1920-L1929)を参考にした。
nodeの非同期処理関数を簡単にPromiseオブジェクトに変換できる。


##動機

非同期処理はQ.jsを今まで使っていたけど、nw.jsでは普通にPromiseが使える。なのでQ.jsは不要になるのだけれども、非同期コールバックをラップする`denodeify()`がないとつらいので、同じ機能を持つ関数を作ろうと思った。

##実装

```js:
function denodeify(nodeFunc){
    var baseArgs = Array.prototype.slice.call(arguments, 1);
    return function() {
        var nodeArgs = baseArgs.concat(Array.prototype.slice.call(arguments));
        return new Promise((resolve, reject) => {
            nodeArgs.push((error, data) => {
                if (error) {
                    reject(error);
                } else if (arguments.length > 2) {
                    resolve(Array.prototype.slice.call(arguments, 1));
                } else {
                    resolve(data);
                }
            });
            nodeFunc.apply(null, nodeArgs);
        });
    }
}
```

##使い方

```js:
var fs = require('fs');
var readFile = denodeify(fs.readFile);

readFile('file.txt')
.then((data) => {
   // ToDo
})
.catch ((err) => {
   // エラー処理
});
```

##終わりに

投稿した後で記事をチェックしてたら、同じ目的でコードもほとんど同じものがすでに載っていましたな。。偶然の一致だ。。
[コールバックベースの関数をプロミスオブジェクトに変換する](http://qiita.com/rooooomania/items/43deeeb427e568fb79ca)
UnityEditor.Editorの意外な挙動について

# UnityEditor.Editorの挙動について #
カスタムインスペクタを作成するときに使用するUnityEditor.Editorについて注意しなければいけない挙動をまとめてみます。

## インスペクタが切り替わるたびにオブジェクトは再生成 ##
UnityEditor.Editorはいつコンストラクタが呼ばれるかつまりいつ新しいオブジェクトになるかですが、インスペクタが一回でも切り替われば新しいオブジェクトになります。

次の画像はこんなコードを入れたカスタムインスペクタのスクリプトをアタッチしたGameObjectを選択して外して選択した図

こんなコード

```csharp:Inspector
    public class Inspector : UnityEditor.Editor
    {
        public Inspector() {

            Debug.Log("ctor called");
        }
    }
```

左から選択1回め外して2回めの図です・

![first.png](https://qiita-image-store.s3.amazonaws.com/0/77177/dbec343f-90d4-5eae-6766-85eb63807625.png)

"ctor called"が2回出力されているのがわかります。
つまりUnityEditor.Editorは使い捨ての挙動になるので例えば一時的にインスペクタ側に値を保持したりするのは危険になります。

うーんでもインスペクタ側に保持したいときたまにあるぞ・・・

\#if UNITY_EDITOR で本体コード側に書いてもいいけどコード汚くなるよなぁっておもいます(しょうがない気はする)
余談ですが本体コード内でUnityEditorのコード使いたいときは、using UnityEditor;は#if UNITY_EDITORでくくらないとコンパイル通らなくなるゾ！

## コンストラクタ内ではtargetはnull ##
インスペクタが参照しているターゲットを表すEditor.targetですが、こいつはコンストラクタではまだnullです。
OnInspectorGUIの前のどっかで初めて代入されるみたいです。

で、このタイミングでなんか初期化処理的なのをしたいなーと思っても初期化関数みたいなのはないみたいです。
正確にはpublic void Initialize(UnityEngine.Object[] targets);っていうのが定義されているのですけどこれのドキュメントなんてないので内部のどっかですね！

やりたいならOnInspectorGUIの最初の1回を取るしかないのかなぁ・・・
ループ内のrequire_once

foreach内でrequire_onceを使おうとしたところ、バグが出てしまたのでメモ

```php:test1.php
<?php
$text1 = array('foo', 'piyo');

foreach($text1 as $value1) {
  require_once('test2.php');

  foreach($text2 as $value2) {
    echo $value1 . ' ' . $value2 . "\n"; 
  }
}
?>
```

```php:test2.php
<?php
$text2 = array('fuga', 'hogera', 'hogehoge');
?>
```

こちらは簡略化した例で、このコードではバグは出ません。しかし、コード規模が大きくなると（？）バグが出ることがあるようです。解決策としては2つあります。



1.**require を使う**

`require_once('test2.php')` を `require('test2.php')`とする




2.**require_onceの呼び出し箇所を変える**

自分と同じようなコードパターンの場合

```php:test1.php
<?php
$text1 = array('foo', 'piyo');
require_once('test2.php');

foreach($text1 as $value1) {
  foreach($text2 as $value2) {
    echo $value1 . ' ' . $value2 . "\n"; 
  }
}
?>
```

とすれば、ファイルにアクセスする回数も減ります。

どうやらrequire_onceでは既に一度ファイルが読まれて変数が読み込まれますが、2回目以降はrequire_onceの仕様上読み込まれなくなり、"$text2"が空の配列になるためにバグが発生していたようです。

自分の場合は、他の箇所でバグが出てると警告が出て、たどり着いたのがここでした。コード規模がこの程度だとバグが出てこなくなって不思議です。


******
参考文献
http://stackoverflow.com/questions/11468579/calling-require-once-inside-foreach-loop-code-is-not-available-on-each-iterat
【Ruby】Queueの中身を参照する

キュー（Queue）って今中身はどんな状態か参照するアクセサとか用意されてないみたいですね。
でも参照したいことってありますよね。

やってることはクラス継承でアクセサ（`attr_reader`)を追加しただけです。
デバッグに役に立ったのでメモメモ。


```rb:QueueRef.rb
class RefQueue < Queue
  attr_reader :que
end

defQue = Queue.new
refQue = RefQueue.new

i = 0
defQue.push( i += 1 ) while 10 > defQue.length 
refQue.push( i += 1 ) while 10 > refQue.length 

p defQue.que # -> undefined method `que'
p refQue.que # -> [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
```

ちなみに、`p defQue`でも中身は見れますが、色々余計な物も表示されるのでこっちの方が綺麗だと思います。

#`attr_accessor`,`attr_writer`は止めた方がいいかも*
というのも、`push`とか使わずにQueueの中身を変えると、Threadの挙動に影響が出るかもしれません。
Queueが空でsleep中のThreadに対して、`attr_writer`で値を入れてsleepが解除されるか分かりませんし。
まぁそもそも、新しい要素を追加するだけなら`push`でいいですし、Queueの途中に要素を追加する必要があるということは、そもそもQueueじゃなくて普通のArrayオブジェクトで実装した方が良いのかもしれませんし。
そんな理由もあって、検証する気もないので触らぬ神ですね。

**\* 追記**
`attr_reader`を設定したインスタンス変数も破壊的に変更できるそうです。
詳細はコメントを参照してください。

#私事
継承を活用したのは初めてかも。
標準クラスって機能が足りないって思うことが基本的に無いですしね。

Ruby始めてまだ日が浅いので他の方法もあるかもしれません。
もし他に方法があれば教えていただきたいです！
qiita > タグの候補が二重に出る @ chrome > スペース入力すればいい > ダメだった > 解決方法: 1文字入力, Esc入力

Qiitaで投稿記事を書いていて、今日気になったことがある。

タグのテキストボックスに途中まで入力した時、以下の２つの候補が重なって表示された。

    A. 10の候補リスト
    B. 1つの候補 (過去に入力したものらしい) :「Tech」入力時「TechEnglish」が表示された

Aの上にBが表示され、Aの最初の候補が見えないので困る。

動作環境としては Chrome を使っている時に発生する。Safariでは起きなかった。

BについてはChromeが勝手に表示しているもののようだ。
確かに、別のサイトでログインする時、過去に入力したものが表示されるのは Chrome で経験している。

Qiitaが表示する10の候補の表示位置がもう1行分下にしていただくと重ならないけど、この問題に遭遇してない人にとっては変な位置になるのでしょうね。

Chrome 側で過去入力履歴の表示を切ることもできるかもしれないが、この機能はこれで重宝している。

前のUIでは二重表示がなかったように思うが、何が変わったのだろう?

#対応策 >> ダメだった
~~最初にスペースを入力することで Chrome の履歴を表示させなくできることがわかった。
これで支障がない。~~

<hr>
(追記 2015/6/30)
上記の対応先で使っていたが、"<スペース>タグ"自体がChromeに登録され、二重表示が再発するようになった。

何か他の方法を考えないといけない。

<hr>
(追記 2015/08/20)
ようやく解決方法に気づいた。

以下の手順でchromeの入力候補を消してQiitaの候補を使えばいい。
1. 1文字目を入力
2. Escを押す (chromeの入力候補が消え、Qiitaの候補が表示される)
3. Qiitaの候補から選択する
技術英語 > whole number part:3 / fractional part: .141592 / decimal places

#整数部分と小数部分

3.141592
この数値の整数部分と小数部分を英語で言う。

整数部分: whole number part (=3)
小数部分: fractional part (=.141592)

#whole関連

for a whole week : まる1週間

wholeがつくことで、「まる」という意味がつく。

日本語でいう「ホールケーキ」のホールもwholeなのかもしれない。

#fractional関連

fractionで「部分」という意味を持つ。整数のようなきっちりした数値でなく、一部という意味。

関連して見つけたものとして

　　　　in a fraction of second : 1秒の何分の１かで、一瞬にして


#youtube
https://www.youtube.com/watch?v=Rub-JsjMhWY&index=11&list=PL_MJualihC5B5F2l_OOia2ew9rL66a_vV

3:50頃
> Integers are just whole numbers without decimal places.

whole numberと「decimal places (少数位）」が使われている。
外部プログラムからIE11をタブで開く【AutoHotkey+vbs】

## 手順
①下記コードをコピペしieopen.vbsを作成する。
　[このサイト](http://scripting.cocolog-nifty.com/blog/2010/02/ie-bb83.html)のコードを参考。

``` vbs:ieopen.vbs
Set Shell=CreateObject("Shell.Application")
For k=Shell.Windows().Count-1 To 0 Step -1
  Set ie=Shell.Windows().Item(k)
  If LCase(Right(ie.FullName,13))="\iexplore.exe" Then Exit For
Next
If ie = "エクスプローラー" Then
  Set ie=CreateObject("InternetExplorer.Application")
  ie.Visible=True
  ie.Navigate2 WScript.Arguments.Item(0)
Else
  ie.Navigate2 WScript.Arguments.Item(0),&H800
End If

```

②Runコマンドで①のファイルとURLを指定

``` ahk:AutoHotkey.ahk
Run, C:\**\ieopen.vbs "%OutputVar%"
```


## 補足
・①のコードもAutoHotkeyで書くならWinGetなどで現在、開いているIEのインスタンスを取得してなんらかをSendすれば良いか？
　以下のようなコマンドラインオプションだと新規で窓が開いてしまい、タブでは開けないようだ。

```
　Run, ***\iexplore.exe -e "URL"
```
pm2のforkモードで動的にCPUと同じ数のhttpサーバを起動する

# 目的
pm2のclusterモードは便利ですが、リクエストのロードバランスはNginxなどで行いたい場合があります。
pm2のforkモードでCPUの数に応じて動的にサーバプロセスを立ちあげる方法について調べました。

## clusterモードでは

pm2のclusterモード(Node.jsのclusterモジュール)はportを割り当てられるのはマスタープロセスだけなので、
以下の用にinstances=0としてマスタープロセス用の設定を書けば、
portを割り当てられたマスタープロセス1個と、実際にリクエストを処理するワーカープロセスがCPU数起動します。

```json:process.json
{
  "name": "pm2sample",
  "script": "server.js",
  "exec_mode": "cluster_mode",
  "instances": 0
}
```

```js:server.js
var http = require('http');
var port = 8080;
http.createServer(function(req, res) {
  res.writeHead(200, {
    'Content-Type': 'text/plain'
  });
  res.end("PID:" + process.pid + ' pm2sample app.\n');
}).listen(port);
```

```bash:CPUの数だけワーカープロセスが立ち上がる
$ pm2 start process.json
```

## forkモードの問題点

単純にexec_mode=forkと修正して起動すると、同じportを割り当てられたサーバプロセスを複数起動しようとして最初のプロセス以外起動しません。

```json:process.json
{
  "name": "pm2sample",
  "script": "server.js",
  "exec_mode": "fork",
  "instances": 0
}
```
pm2のログを見てみると最初のプロセスは起動できていますが、それ以外のプロセスはエラーが発生しています。

```text:~/.pm2/logs/pm2sample-error-N.log
events.js:85
      throw er; // Unhandled 'error' event
            ^
Error: listen EADDRINUSE
    at exports._errnoException (util.js:746:11)
    at Server._listen2 (net.js:1156:14)
    at listen (net.js:1182:10)
    at Server.listen (net.js:1267:5)
    at Object.<anonymous> (/Users/duck1218/workspace/github.com/geekduck/pm2sample/server.js:8:4)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
〜省略〜
```

設定ファイルに個別に全てのプロセス用の設定を書いても良いですが、
本番環境と開発環境でCPUの数が違う場合などで問題が起きます。

## 解決方法

以下のissueに書いてあるとおり、環境変数NODE_APP_INSTANCEを使って割り当てるportを動的に決定しましょう。
NODE_APP_INSTANCEは0からはじまる連番が渡されます。
[Pass instance id to app as environment variable](https://github.com/Unitech/PM2/issues/1143)

server.jsを修正してNODE_APP_INSTANCEを使用してportを設定します。

```js:server.js
var http = require('http');
var port = 8080 + parseInt(process.env.NODE_APP_INSTANCE || 0); // CPUが4個の場合port8080〜8083のサーバが起動する
http.createServer(function(req, res) {
  res.writeHead(200, {
    'Content-Type': 'text/plain'
  });
  res.end("PID:" + process.pid + ' pm2sample app.\n');
}).listen(port);
```

CPUが4つの環境ではlocalhost:8080, localhost:8081, localhost:8082, localhost:8083でサーバが起動します。

あとはNginxでロードバランスしてあげれば完璧です！

```nginx:nginx.conf
upstream io_nodes {
  ip_hash;
  server 127.0.0.1:8080;
  server 127.0.0.1:8081;
  server 127.0.0.1:8082;
  server 127.0.0.1:8082;
}
```

サンプルコード：https://github.com/geekduck/pm2sample
Unicorn 起動コマンドメモ

Railsのルートディレクトリで下記のコマンドを実行。

#### Unicornのプロセスを停止。
いない場合はエラーになります。

```Bash
kill -KILL `cat tmp/unicorn.pid`
```

### Unicornをデーモンとして実行。
-E で指定するのは、Railsの実行環境変数

```Bash
unicorn -E production -c config/unicorn.rb -D
```