OmniAICreator/Qiita-1.07M huggingface dataset:
cocos2d-xで作成したAndroidプロジェクトでlinearLayoutを使ってレイアウトを重ねる方法

#はじめに
cocos2d-xで開発したAndroidプロジェクトに広告等を入れる事があると思います。
cocos2d-xではxmlファイルを使ってレイアウトが出来ないので、直接レイアウトを記述する必要があります。
ここではcocos2d-xで作成したAndroidプロジェクトにレイアウトする方法をご紹介します。


#実装方法
```java:Activity
LinearLayout linearLayout=new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
//setだと落ちるのでaddを使う
this.addContentView(linearLayout, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
Button bt1 = new Button(this);
bt1.setText("ボタン表示");
linearLayout.addView(bt1,new LinearLayout.LayoutParams(300,100));

bt1.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
     　　/*ボタンクリックの処理*/
     }
 });
```

##=補足=
**setContentViewを使うと落ちるのでaddContentViewを使います。**
VBAHaskellの紹介　その4　（Find）

（この記事ははてなブログ　http://mmyymmdd.hatenablog.com/ の再掲です）
2015-04-12
きょう、いわゆる検索関数 "find_pred" を追加した。Haskell_1_Coreモジュールに入れている。

```vbnet
Function find_pred(ByRef pred As Variant, ByRef vec As Variant) As Variant
```
対象配列の中から条件に合致する値を探す関数で、第1引数のpredは検索における条件指定の述語で、第2引数のvecは対象配列だ。

自由度の高い**`pred`**を簡単に生成できるかどうかが検索の使い勝手を決めると思う。「指定した範囲に含まれる」とか「素数である」等の条件を述語オブジェクトとして生成するときに、いちいちヘルパ関数を定義したりするのは面倒なのでやりたくない。[^1]

**`find_pred`**は単にループを回しているだけだが、合成関数の作成と呼び出しが簡単なので、シンプルに実装できた。

これを使って乱数列の中からある範囲内の数値を探すコードはこうなる。[^2]
>
```vbnet
Points = mapF(p_rnd(0), repeat(100, 10000))
pred = p_mult(p_greater( , 29.9), p_less( , 29.99))
m = find_pred(z, Points)
```

こう書くと **`pred`** は 29.9 < x かつ x < 29.99  を満たす x に1を、そうでない x に0を返す関数になる。ラムダ式のような自由と柔軟さはないが、C++03で`bind1st`や`bind2nd`を組み合わせて生成するよりはマシかもしれない。
ところで引数の順序が **`find_pred(pred, vec)`** とするか **`find_pred(vec, pred)`** とするか決め難かった。とりあえず述語を前にしたが、ソート関連の関数[^3]では比較関数が後になっている。

[VBAHaskellの紹介　その5　（関数のシグネチャ）](http://qiita.com/mmYYmmdd/items/a89754da3717b7c1e40d)
[VBAHaskellの紹介　その3　（FizzBuzz）](http://qiita.com/mmYYmmdd/items/93040f07121d95898161)
[VBAHaskellの紹介　その2　（合成関数）](http://qiita.com/mmYYmmdd/items/1e528ad68ad2c4e3de29)
[VBAHaskellの紹介　その1　（最初はmapF）](http://qiita.com/mmYYmmdd/items/c731edf943acc0a0ebe9)

ソースコード：https://github.com/mYmd/VBA

[^1]: もちろん込み入った条件を定義するには個別に関数を定義した方がいい
[^2]: test_moduleのSub vbaUnitにサンプルがある
[^3]: sortIndex_pred、lower_bound_pred、upper_bound_pred、equal_range_pred
MeteorでWebアプリがカンタンにできる！超入門編

## [Meteor](https://www.meteor.com/)とは
Webアプリケーション開発をとことんまで素早く，楽に行えるようにするためのさまざまな仕組みが盛り込まれている、フルスタックフレームワーク。
Node.jsをベースとしており，全てをJavaScriptで記述できます。

### その他機能

- MongoDBが内蔵され、クライアント側からDB操作が可能
- WebSocketを使用しており、リアルタイム処理が可能
- ブラウザリロードしなくても、保存後、自動更新
- 自動的にMinifyしてくれ、CoffeeScriptやSassも自動変換してくれる（Gruntが内蔵してあるかのように動いてくれる）
- テンプレートエンジンもあり、コード管理がしやすい
- ホスティングも兼ねていて、サーバーを持っていなくてもすぐに世の中に公開できる！



## インストール
```bash
curl https://install.meteor.com/ | sh
```


## アプリ作成
1. 任意のディレクトリに移動
2. 以下コマンドを実行

```c
meteor create hellow
```

以下の通り、html, css, jsのひな形が自動的に作成されます

- hello.html：通常のHTMLとは少し異なり，DOCTYPE宣言や`<html>`要素がなく，`<template>`という要素が使用されている
- hello.js：Meteorのフレームワークに則ったコードが出力されている
- hello.css：通常のCSSファイル


## アプリ実行
#### アプリのディレクトリに移動
```
cd hellow
```

#### 以下コマンドを実行
```
meteor
```

http://localhost:3000/
上記URLでブラウザでアクセス


## デプロイ
```
meteor deploy my_app_name
```

URLは以下になります。
http://my_app_name.meteor.com

※全世界の人から上書きも可能ｗ
※ID、PWもつけられる設定あり

## コマンド

| コマンド | 説明 |
|:-----------|------------:|
| run | [デフォルト] プロジェクトをローカルの開発環境で実行 |
| create | 新しいプロジェクトを作成 |
| update | Meteorを最新バージョンにアップデート |
| add | プロジェクトにパッケージを追加 |
| remove | プロジェクトからパッケージを取り除く |
| list | 利用可能なパッケージをリスト表示 |
| bundle | プロジェクトをtarballに固める |
| mongo | 特定のサイトのMongo DBに接続 |
| deploy | Meteorにプロジェクトをデプロイ |
| logs | 指定されたサイトのログを表示 |
| reset | プロジェクトの状態をリセットし、ローカルのデータベースを削除 |


## 感想
数分で世の中リリースできる仕組みは感動。またおもしろい。
ただし、独自記法を覚える、学習コストがあり、途中断念してしまった。。
あと、エラーがおきたら、どう対処していいかまだ分からない。。
また依存度が非常に高いので、このページだけ使うかというのはできない。
導入は慎重に検討した方が良い。

## 参考サイト
- [チュートリアル（公式）](https://www.meteor.com/install)
- [1分でWebアプリを作れて、3分で公開できた！](http://d.hatena.ne.jp/Syunpei/20120413/1334276712)
- [Meteor.js](http://d.hatena.ne.jp/naoya/20120422/1335109615)
- [体感！JavaScriptで超速アプリケーション開発 －Meteor完全解説](http://gihyo.jp/dev/serial/01/meteor/0001)
Stethoを使ってみた

## きっかけ

もともとAndroid端末内のSQLiteの中身を覗きたかった。
[あなたとAndroid 今すぐダウンロード！？ Android開発で変わる SIerのJava技術事情について](http://www.slideshare.net/s_kozake/android-android-sierjava)
で、TelnetSqlite と RdbAssistantを知ったけど、面倒で手を付けて無かった。

そんなときに、[Stetho](http://facebook.github.io/stetho/)を知った。
[StethoでAndroidのNetwork Performanceを見る - Qiita](http://qiita.com/wasabeef_jp/items/1e7bdb78766708206d3d) 読んで、使ってみようと思った。

## ハマった

### Chrome DevToolsってどうやって起動するんだ？

アドレス欄に `chrome://inspect/#devices` を入力したらいけました。
ドキュメントはちゃんと読みましょう。。

### inspectってリンクが表示されない

Chrome DevToolsは起動したけど、パッケージ名だけで`inspect`ってリンクが表示されてない。
 
ネットワークアクセスをほとんどしないアプリを作っていて、`enableWebKitInspector`は要らないと思ってた。
`enableWebKitInspector`つけて、再度インストールしたら表示された。
とりあえずつけとくべきっぽい。

## releaseビルドに含まれないようにする

実際の差分は[こちら](https://github.com/noboru-i/car-navi-modoki/commit/aaf74c7b3ee2176c9db14ad65b00caafe66d9ad2)

### debugにのみユーティリティクラスを作る

至って普通。

```java:StethoUtil.java
package hm.orz.chaos114.android.carnavimodoki.util;

import android.content.Context;

import com.facebook.stetho.Stetho;

public class StethoUtil {

    public static void initStetho(Context applicationContext) {
        Stetho.initialize(
                Stetho.newInitializerBuilder(applicationContext)
                        .enableDumpapp(Stetho.defaultDumperPluginsProvider(applicationContext))
                        .enableWebKitInspector(Stetho.defaultInspectorModulesProvider(applicationContext))
                        .build());
    }
}
```

### Applicationクラスの修正

下記、抜粋したコードです。
リフレクションにより`StethoUtil`のメソッドを呼び出すことで、import文にも現れず、
クラスが存在する場合のみ実行されます。

```java:App.java
public class App extends android.app.Application {
    @Override
    public void onCreate() {
        super.onCreate();

        initStetho();
    }

    private void initStetho() {
        try {
            // debugビルドの場合のみ成功
            Class<?> clazz = Class.forName("hm.orz.chaos114.android.carnavimodoki.util.StethoUtil");
            clazz.getMethod("initStetho", Context.class).invoke(null, this);
        } catch (Exception e) {
            // ignore
        }
    }
}
```

こんなんでいいのかなぁ。。
proguardは設定が必要ですね。

## 雑感

思ってた以上に、導入は簡単でした。
releaseに影響しないようにも出来たと思うし。
SQLiteの中身も、簡単に覗けたし。

ネットワーク使うようなものであれば、OkHttpClientのFactoryクラス作る感じでしょうか？
使うことがあれば、またやってみようと思います。
a.zshというLinuxのGUIアプリを補完するプラグインを作った

私が使っているデスクトップ(ウィンドウマネージャーのこと)は、Awesomeですが、Awesomeは、GUIアプリをデスクトップから起動するには、通常、自分でメニュー作るか、自動生成するプラグインを使うかしかありません。

私の場合、それほどGUIメニューの必要性は感じていないため、作っていませんが、時々、あのアプリって名前なんだったかなということがあります。

したがって、そんな時に、GUIアプリを起動するコマンドがあれば便利だなあと思ってこのツールを作りました。

主に、LinuxにインストールされているGUIアプリを推測し、補完関数を作成するツールになっています。ちなみに、Arch Linuxで動きましたが、どのLinuxでもほぼ使えるんじゃないかなあと思います。

https://github.com/syui/a.zsh




```bash:
$ git clone https://github.com/syui/a.zsh

$ cd a.zsh

$ a.zsh -h

# 関数を出力する
# デフォルトでは"a"コマンドの補完関数として出力されます
$ a.zsh -m

# 関数を作成する
# デフォルトでは"/usr/share/zsh/site-functions/_a"に作成されます
$ a.zsh -o

# 設定とリロード
$ echo -e "alias a=`pwd`/a.zsh\nbindkey -s '^o' 'a '"
$ !! >> ~/.zshrc
$ source !$

# コマンドを指定して関数を作成する
# この場合、GUIアプリを起動するコマンドが"test"になります
# したがって、使用する場合は"alias test=/path/to/a.zsh"としてください
$ a.zsh -o test
```

想定している設定は以下のような感じになってます。

```bash:~/.zshrc
alias a=/path/to/a.zsh/a.zsh
bindkey -s '^o' 'a '
```

適当なプラグインなので、動かない場合とか、必要があれば適時、適当に書きなおしてください。
CreateJSの基本メモ4　画像を表示する

#準備
Preload.js とEaselJSを読み込んでおきます。

```test.html
<!DOCTYPE html>
<html>
<head>
        <script src="http://code.createjs.com/preloadjs-0.3.1.min.js"></script>
        <script src="https://code.createjs.com/easeljs-0.8.0.min.js"></script>
</head>
<body>
        <canvas width=1920 height=1080></canvas>
        <!--画像読み込み先-->
        <div id=imgArea></div>
</body>
</html>
```

#1.一つの画像を読み込む
```pleloadtest.js
function loadImages(){
    //キューを作成する
    var queue = new createjs.LoadQueue();
    //画像の読み込みが完了したときに呼ばれるイベントリスナー
    queue.addEventListener('fileload', function(event){
                //event.resultに読み込まれた画像要素が格納されています。
                document.getElementById("imgArea").appendChild(event.result);
    });
    //画像ファイルの読み込み
    queue.loadFile({"src:hoge.jpg"});
}
```

イベントリスナで受け取る変数 event.itemに下記のような情報が格納されています。

     ext: "png" //拡張子
     src: "img/score/1251/29-32.png" //画像url
     tag: img   //これはevent.resultと同じ)
     type: "image" 

また、読み込み時に

     queue.loadFile({id:"hoge",src:"hoge.jpg"});
と指定すると、event.itemは

     id: "hoge"
     ext: "png"
     src: "img/score/1251/29-32.png"
     tag: img
     type: "image"
渡した情報が格納されています。

#2.複数の画像を読み込む
manifestを作成して、読み込みすれば一括読み込み可能です。

```pleloadtest.js
function loadMultipleImages(){
    //キューを作成する
    var queue = new createjs.LoadQueue();
    //画像の読み込みが完了したときに呼ばれるイベントリスナー。一つのファイルが読み込みされるたびに呼ばれます。
    queue.addEventListener('fileload', function(event){
                //event.resultに読み込まれた画像要素が格納されています。
                document.getElementById("imgArea").appendChild(event.result);
    });

   //すべてのファイルが読み込みされた際に呼ばれるイベントリスナー
     queue.addEventListener('complete', function(event){
                    //完了後の処理
    });

    //マニフェストファイルを作成
    var manifest =[
      {id:"hoge1",src:"hoge1.jpg"},
      {id:"hoge2",src:"hoge2.jpg"},
      {id:"hoge3",src:"hoge3.jpg"},
    ];

    //画像ファイルの読み込み
    queue.loadManifest(manifest);
}
```

#リンク
[CreateJSの基本メモ5　影を描く](http://qiita.com/PianoScoreJP/items/85667a212c925d8bf1c8)
Unity4でAnimationEventでオーバーロードしたメソッドが選択できない

UnityのAnimation機能で、指定したアニメーションのキーフレームでメソッドを呼べる「AnimationEvent」という機能を使った時に罠にかかったメモ

AnimationEventはAnimator/Animationコンポーネントがついたゲームオブジェクトに、スクリプトをAdd Componentすることで、対象のスクリプトのメソッドを呼べる機能です。

そもそもオーバーロードしたメソッドを実装した時点で、アニメーションイベントのプルダウンに対象のメソッドが表示されなくなった。

おかしいなと思い、オーバーロードしたメソッドを前に選択していたAnimationを見てみたら…
Animationエディターがぶっこわれた…
![スクリーンショット 2015-04-30 19.52.54.png](https://qiita-image-store.s3.amazonaws.com/0/14945/4a67c24a-ca36-2602-4c05-d5cd65d86d3b.png)

散々悩んだ結果、オーバーロードせずに別メソッド化した時はこのような現象が起きず。
そもそもAnimationEvent自体、対象のメソッドが存在しなくなると
呼び出しに失敗してエラーを吐くのであまりおすすめできないが
特定のキーフレームでAnimatorのTriggerを引いて
ステート遷移したい時に便利なので使わざるを得ない…

Unity5で治ってるか後日見てみます。
uGUI + uniRXことはじめ


uniRXをuGUIと一緒にどう使っていくかを調べてつらつらと書いていく予定です。

#クリック


```csharp
button
.OnClickAsObservable ()
.Subscribe (_ => Debug.Log ("ButtonA Clicked"));
```
かんたん

#長押し

こちらの
https://github.com/neuecc/UniRx#create-your-own-custom-triggers
Create your own custom triggersを参照

#複数回タップ

長押しを参考に...

```csharp:ObservablePluralTapTrigger.cs
using UnityEngine;
using UnityEngine.EventSystems;
using UniRx;
using UniRx.Triggers;

/**
* 複数回タップ取得トリガ
*/
public class ObservablePluralTapTrigger : ObservableTriggerBase, IPointerClickHandler
{
        //最初のタップから何秒監視するか
	public float TapTerm = 1f;
        //watchするタップ数
	public int TapCount = 2;
	
	Subject<Unit> onPluralTap;
	
        //経過時間
	float elapsedTime;
　　　　 //現在のタップカウント
	int currentTapCount = 0;
	
	void Update()
	{
		if (currentTapCount >= 1) 
		{
			elapsedTime += Time.unscaledDeltaTime;
		}
		
		if (elapsedTime < TapTerm) {
			if (currentTapCount == TapCount) {
				if (onPluralTap != null) 
				{
					Debug.LogError("onPluralTap");
					onPluralTap.OnNext (Unit.Default);
				}

				ResetTap ();
			} else if (currentTapCount > TapCount) {
				ResetTap ();
			}
		} else
		{
			ResetTap ();
		}

	}
	
	void IPointerClickHandler.OnPointerClick(PointerEventData eventData)
	{
		currentTapCount++;
	}

	void ResetTap()
	{
		elapsedTime = 0f;
		currentTapCount = 0;
	}
	
	public IObservable<Unit> OnPluralTapAsObservable()
	{
		return onPluralTap ?? (onPluralTap = new Subject<Unit>());
	}
	
	protected override void RaiseOnCompletedOnDestroy()
	{
		if (onPluralTap != null)
		{
			onPluralTap.OnCompleted();
		}
	}
}
```

上記をUIPartsに貼付けて

```csharp
		var tapTrigger = 
			button.GetComponent<ObservablePluralTapTrigger> ();
		tapTrigger.OnPluralTapAsObservable().Subscribe(_ => Debug.Log ("PluralTapped!!"));
```
こんな感じで監視すればok



##以後追記予定です。
2点間の線形補間を計算する

線形補間とは、次のように2点 (x0, y0) と (x1, y1) を直線で結んだ時に、間にある任意のx座標に対応するyを計算することです。
![線形補間の図](http://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/LinearInterpolation.svg/300px-LinearInterpolation.svg.png)

[Wikipedia先生](http://en.wikipedia.org/wiki/Linear_interpolation)によるとこの計算は次の式で行えます。
![](http://upload.wikimedia.org/math/f/4/7/f472ceedb1868e147ebe2c1197bf8748.png)

なので、これをそのままメソッドとして実装しました。

```java:Java
static double lerp(double x0, double y0, double x1, double y1, double x) {
  return y0 + (y1 - y0) * (x - x0) / (x1 - x0);
}
```

一応JavaScriptでも。

```js:JavaScript
function lerp(x0, y0, x1, y1, x) {
  return y0 + (y1 - y0) * (x - x0) / (x1 - x0);
}
```
[warn]_default_ VirtualHost overlap on port 80 という警告が出た場合の対処

ApacheでVirtualHostの追加設定をして再起動したところ

```
[warn] _default_ VirtualHost overlap on port 80, the first has precedence
```
というような警告が出ました。

この状態でアクセスしても追加したサイトは表示されずもともと入れてたVirtualHostが表示されます。

この警告は何かというと名前ベースのVirtualHostが有効になってないので、このようなエラーが出るみたい。そりゃそうだというかんじです。

```httpd.conf
NameVirtualHost *:80
```
Apacheの設定ファイルで上のように設定し再起動すれば警告は出なくなります。
Pythonで丸く切りぬいたサムネイルを生成する

Pythonで、丸く切りぬいた画像を生成する方法。

基本的には、元画像を正方形にして、丸でマスクするだけだけど、PIL (Pillow) のImage、ImageDrawとか使うとアンチエイリアスが効かなくて汚くしか切り抜けない。

PIL (Pillow) だと、resize、thumbnailしか、アンチエイリアスとかフィルタの設定ができないみたい。
[stackoverflow](http://stackoverflow.com/questions/14350645/is-there-antialiasing-method-for-python-pil)

解決策は、以下のとおり。
* マスク画像は、事前に8ビットグレイスケールで準備する。(透過で準備したらダメだった。マスク画像を、8ビットのグレイスケール画像にして、putalphaでアルファ値として適用するので、透過画像で準備すると、グレイスケールにする際に画像が荒くなっちゃうみたいでダメだったあ。アルファ値として使うんで、白が見えるとこ、黒が切り抜かれるところになる。)
* 正方形に切りぬいた画像に、putalphaでマスク画像を適用。

```py
from PIL import Image, ImageOps
mask = Image.open("マスク画像のパス")
org = Image.open("元画像のパス")
sq = ImageOps.fit(sq, (400, 400), method = Image.LANCZOS)
sq.putalpha(mask.convert("L"))
sq.save("丸く切りぬいた画像の保存先のパス")
```

参考にしたページ。
[stackoverflow](http://stackoverflow.com/questions/890051/how-do-i-generate-circular-thumbnails-with-pil)


他にも、[Cairo](http://cairographics.org/pycairo/)、[aggdraw](http://effbot.org/zone/aggdraw-index.htm) とかの画像ライブラリを使うのもいいみたいだけど、メンテがされてなさそうだから使わなかった。
[Quora](http://www.quora.com/Which-graphics-module-for-Python-is-best-for-antialiased-drawing)
裏でServiceが動いているか確認するコード

ネタ元
http://stackoverflow.com/questions/600207/how-to-check-if-a-service-is-running-on-android

毎回ググっていたのでメモ

```java
    private boolean isYourServiceWorking() {
        ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningServiceInfo serviceInfo : manager.getRunningServices(Integer.MAX_VALUE)) {
            if (YourService.class.getName().equals(serviceInfo.service.getClassName())) {
                return true;
            }
        }
        return false;
    }
```
lsコマンドでの色を変える

# やりたいこと
表題の通り
**lsコマンドで表示されるファイルの色をそれぞれ指定します。**

具体的な作業は二つ

* `.bash_profile`に表示の色を変えるよう編集
* 色を指定（指定の仕方がいろいろある）



## `.bash_profile`に表示の色を変えるよう編集
`alias ls='ls -G'`を追記するだけ。
最後にまとめますが、**alias**というコマンドは、「コマンドの別名を登録する」コマンドらしい。設定がまだの方は、`$ls -G`　をしてみると色が変わると思う。

## 色を指定
ここもやることは一つで
`export LSCOLORS=gxfxcxdxbxegedabagacad`
を追記するだけ。
これは色を指定しているのだが、表（適当に引っ張ってきた）の通り前から二文字づつファイルの種類で色分けしている。
![スクリーンショット 2015-04-30 18.34.10.png](https://qiita-image-store.s3.amazonaws.com/0/73081/f4767967-42b5-d4ff-b4c7-045b1a7dc0a6.png)
今回はディレクトリの色だけを変えたかったので、
この表をみると、ディレクトリは1,2文字目で指定している。
１文字目が文字の色
２文字目が背景の色
を指定していて、
![スクリーンショット 2015-04-30 18.37.57.png](https://qiita-image-store.s3.amazonaws.com/0/73081/10b176fa-b90a-bffa-8931-c78d42f65f0b.png)
この表で色を探せば良い。

調べれば山ほど出てくるので、みなさんも是非。

●ショートカットコマンドの設定

前述した**alias**コマンドを使う。
例えば、
`$la -a`
で隠しファイルなどを表示できるが,これを
`$la`
と、少し省略したりできる
`.bash_profile`に`alias la='ls -a'`を追記するだけ。

これはもっと便利にショートカットの設定ができるが、とりあえず置いておく。。。
ぜひぐぐってみてくださいw
素数の逆数和って本当に発散すんのかよって話

なんか簡単に証明できるっていうけどまじかよってことで
pythonで書いてみました。
練習も兼ねて
コードはこちら

```ruby:prime.py
  1 import matplotlib.pyplot as plt
  2 
  3 def prime(value):
  4         for num in range(2,value):
  5                 if value%num==0:
  6                         return -1
  7         return 1
  8 list=[]
  9 for num in range(2,10000000):
 10         if prime(num)>0:
 11                 list.append(num)
 12 print list
 13 list2=[]
 14 for num in list:
 15         list2.append(1.0/num)
 16 list3=[]
 17 sum=0
 18 for num in list2:
 19         sum=sum+num
 20         list3.append(sum)
 21 plt.plot(list3)
 22 plt.show()
```

出てきたグラフは見てのお楽しみ〜
CentOS7のインストール方法

VMWareにCentOS7をインストールしてネットワークを有効にするまでの方法を記載します。

# 利用環境
Mac OS X Mavericks
プロキシサーバ：なし

# 使用ソフト
* VMWare Fusion 7.1.1
* CentOS 7 minimal<br>http://mirror.fairway.ne.jp/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso 

# ゲストOSのインストール
1. [VMWare Fusion]-[ファイル]-[新規]
2. インストール方法を選択させる画面が出てくるので、「詳細なオプション」をクリック。
3. インストール方法を「カスタム仮想マシンを作成」にします。<br>
※簡易インストールしたくないため。
4. オペレーティングシステムを選択させる画面が出てくるので、[Linux]-[CentOS(64ビット)]を選択します。
5. 仮想ディスクを選択させる画面が出てきますが、今回は一から作成するため、「新しい仮想ディスクを作成」にチェックを入れておきます。
6. デフォルトの仮想マシンの設定を変更したいため、「設定のカスタマイズ」をクリックします。<br>「設定のカスタマイズ」をクリックしなかった場合は、仮想マシンの名前を付けたあと、ゲストOSのインストールが始まります。
7. isoファイルの読み込み先がデフォルトだと異なっているため、変更します。<br>取り外し可能デバイスの「CD/DVD(IDE)」を選択します。
<br>![os-set-up.png](https://qiita-image-store.s3.amazonaws.com/0/56851/cec4d6f0-610c-e29d-350e-1102e4972c0b.png)<br>　　　　　　
![select-iso.png](https://qiita-image-store.s3.amazonaws.com/0/56851/1abbe148-8ab4-a73b-91b4-3360a00edc0e.png)「ディスクまたはディスクイメージを選択」から、上記サイトで入手したCentOSのイメージを選択します。
8. 仮想マシンを開始すれば、インストールが始まります。<br>
インストール画面に従ってインストールします。<br>
言語と地域設定以外はすべてデフォルトのままで良いです。<br>
CentOS 7だとインストールしながらユーザ作成できるようになっていたので、rootパスワードだけ設定しておきます。<br>![user-setting.png](https://qiita-image-store.s3.amazonaws.com/0/56851/cf116eaa-6dae-149e-b348-1d961c73b84f.png)

# ネットワーク設定
インストールが終わったので、外の世界に出られるようにします。
1. 以下のファイルを変更します。<br>
/etc/sysconfig/network-scripts/ifcfg-enoXXXXXX
<br>※XXXXXXはご自身の環境に読み替えてください。
<br>CentOS 7からは色々な方が仰られている通りでifcfg-eth0がありません。ただ、同等のファイルが上記のファイルです。中身は従来と同じみたいなので、
* BOOTPROTO=dhcp
* ONBOOT=yes
に変更して保存します。
2. ネットワークを再起動します。
<br>コマンド：service network restart
3. ネットワークにつながったことの確認。
ifconfigがないので、ipコマンドで確認します。
ip addr とします。
ifcfg-enoXXXXXXにIPアドレスが割り当てられていればOKです。
<br>本当に外と通信できているかを確認したい場合は、yumでwgetをインストールして、google.comにでも繋いでみてください。index.htmlが取れるはずです。
WordPressで「子ページ」のデフォルトテンプレートファイルを設定する

#動機
固定ページは `page-$slug.php` みたいな名前を取ったファイルがあれば勝手にテンプレートとして利用されるが、子ページも同じ命名規則が適用されてしまうのだ。

これでは、ファイル名から「子ページなのか親ページなのか」が推測できないので、**ページの親子関係をきちんとファイル名で表されるようにしたいよー**。

そうすると、いちいち管理画面からテンプレートとして利用するファイルを選ばなきゃいけない…　面倒だしメンテナンス的にも宜しくないと思うので、子ページの命名規則を決めて、勝手にインクルードしてくれるようにしたいところですね！

#子ページの命名規則
普通の子ページ
`page-$parent-slug__$child-slug.php`

子ページの子ページの子......... の場合
`page-$parent-slug__$child-slug__$child-slug.php`


例：

```
company                (page-company.php)
└── recruit            (page-company__recruit.php)
    ├── designer       (page-company__recruit__designer.php)
    └── developer      (page-company__recruit__developer.php)
        ├── backend    (page-company__recruit__developer__backend.php)
        └── frontend   (page-company__recruit__developer__frontend.php)
```
#やり方
`page.php`を開いて、以下を記入。

```php:page.php

<?php namespace Page;
function get_parents( $p, $parents = array() ) {
    if ( $p->post_parent ) {
        $parent = \get_post( $p->post_parent );
        array_unshift( $parents, urldecode( $parent->post_name ) );

        return get_parents( $parent, $parents );
    }

    return $parents;
}


$parents = get_parents( $GLOBALS['post'] );

if ( count( $parents ) ) {
    $template_name = 'page-' . implode( '__', $parents ) . '__' . urldecode( $GLOBALS['post']->post_name );
    \get_template_part( $template_name );
}

```

#Bladeテンプレートエンジンを使っている場合

```php:page.php
<?php namespace Page;
function get_parents( $p, $parents = array() ) {
    if ( $p->post_parent ) {
        $parent = \get_post( $p->post_parent );
        array_unshift( $parents, urldecode( $parent->post_name ) );

        return get_parents( $parent, $parents );
    }

    return $parents;
}


$parents       = get_parents( $GLOBALS['post'] );
$template_name = false;

if ( count( $parents ) ) {
    $template_name = 'page-' . implode( '__', $parents ) . '__' . urldecode( $GLOBALS['post']->post_name );
}

?>

@if($template_name)
    @include($template_name)
@endif
```

ちなみに、Bladeを知らない人はこちらの[Blade紹介記事](http://liginc.co.jp/web/programming/php/152804)をどうぞ！
JPEGの回転画像をEXIF情報(Orientation)からなんとかする

Orientation	制御
1	そのまま
2	上下反転(上下鏡像?)
3	180度回転
4	左右反転
5	上下反転、時計周りに270度回転
6	時計周りに90度回転
7	上下反転、時計周りに90度回転
8	時計周りに270度回転

```
// EXIF回転
function f_exif_orientation($filename,$orgin_path,$full_path)
{
  $im = new Imagick($full_path.$filename);
  $orientation = $im->getImageOrientation();
  switch ($orientation) {
    case 2: // Mirror horizontal
        $im->flopImage();
        break;
    case 3: // Rotate 180
        $im->rotateImage('#000000', 180);
        break;
    case 4: // Mirror vertical
        $im->flipImage();
        break;
    case 5: // Mirror horizontal and rotate 270
        $im->flopImage();
        $im->rotateImage('#000000', 270);
        break;
    case 6: // Rotate 90
        $im->rotateImage('#000000', 90);
        // $im->flopImage();
        break;
    case 7: // Mirror horizontal and rotate 90
        $im->flopImage();
        $im->rotateImage('#000000', 90);
        break;
    case 8: // Rotate 270
        $im->rotateImage('#000000', 270);
        break;
}
  // $im->stripImage(); //EXIFを消す場合
  $im->setImageOrientation(1);//EXIFを消さない場合
  $im->writeImage($full_path.$filename);
}
```
ターミナルが壊れたので・・・

ターミナルが壊れました笑

まず経緯から。。。

ターミナルのlsコマンドでディレクトリの色を変えたいな、と思い調べた結果
どうやら`.bash_profile`に下記を追記すればいいそうで

```alias ls='ls -G'```

そこでvimで`.bash_profile`を開いたのですが文字化け・・・
調べたがよくわからず
catコマンドで中身を出力したらちゃんと出るので、これをコピペして、vimで改めて書き直しました。
すると

ターミナルでコマンドがほとんど使えなくなった！！！笑
いや、笑えません・・・

lsやcdは使えたのですが、どうやら<font color="red">シェル組み込み関数</font>がどうとかってでてきました（改めて調べる必要がありそう・・・）
http://oxynotes.com/?p=5418
このサイトであるように`.bash_profile`や`.bashrc`はログイン時に必ず読み込まれるファイルらしいです。
なのでここでのパスの指定を間違えると大変なことになるということです。

原因はわかり、対処法もわかったのですがここで新たな問題が！！
この時点で、vimコマンドも当然使えず、肝心の`.bash_profile`
が開けない笑
Finderで隠しファイルを表示させるのもターミナルでの操作が必要で（もちろんこの時点では使えない）打つ手がない・・・

しかしググったら
隠しファイルをFinderに表示させるアプリがあった！

それがこの「Funter」というアプリ
http://nektony.com/products/funter
これでなんとか隠しファイルをFinderに表示させ、無事編集できました。

これでやっと当初の目的である<font color=green>lsコマンドでの色を変える</font>ができます。
Linuxでシリアル通信


古いネットワークハブの設定を確認するためにシリアル通信をする必要があったのでメモ

###機器

ケーブル:ストレートRS232C
ネットワークハブ:Allied telesis FS816TX V1

###設定確認

ホストOSでのシリアルデバイスの確認

```
# cat /var/log/dmesg | grep ttyS
[    2.911270] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    3.155264] serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
[    3.155788] 00:08: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    3.155980] 00:09: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
```

実際に繋いで使えるポートは一つなので、ttyS0と推定

###シリアル通信開始

ネットワークハブの通信設定は9600 8N1。
通信にはscreenコマンドを使う。

```
# screen /dev/ttyS0 9600
```

直後は、何も出てこないが、Escキーを押すとメニューが出る。

###シリアル通信終了

終了は、メニューからQuitを選択しても効かないので、screen自体を終了させる。
自分のキーバインドでは、Ctrl-J-K(デフォルトではCtrl-AがscreenのエスケープキーになってるのをCtrl-Jに変更してある為)

###その他注意事項

FS816TXV1のメニュー中ではCtrl-Qで、トップメニューに戻るようになっているが、screen中では、Ctrl-J-Qとしないといけない。

＊）またくれぐれもパスワードを設定しないこと。（パスワード回復はユーザーではできず有償修理となるもよう。）
iOSライブラリを導入する時にgit submoduleでエラーになる場合の対処


  ``` git submodule add ``` して、ライブラリを導入したい。が、以前1度登録して削除なんてことをやっていると（なかなかやらないだろうけど）gitに怒られる。
  
例えばプロジェクトディレクトリで Alamofireを取得する場合。

```
git submodule add https://github.com/Alamofire/Alamofire.git

```
しかし1度登録したことがあるライブラリだと、 

```
A git directory for 'Alamofire' is found locally with remote(s):
origin https://github.com/Alamofire/Alamofire.git
If you want to reuse this local git directory instead of cloning again from
https://github.com/Alamofire/Alamofire.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.
```

と言われてしまうので、メッセージに従い ```--force``` オプションを付ける。

```
$ git submodule add --force https://github.com/Alamofire/Alamofire.git
Reactivating local git directory for submodule 'Alamofire'.
```

成功.

* まぁSwift対応した今となっては、pods使えっていう話ではある。
ADX2 LEを使おう その２

##サウンドデータについて
###チャンネル数
出力する音の数を表す。
１つならモノラル、２つならステレオとなる。
モノラル設定の音は全てのスピーカーから同じ音が流れ、ステレオ設定の音ならば
２つスピーカーがあった場合、それぞれのスピーカーから別の音を流すことが出来る。
一般的に、BGMはステレオ、ボイスはモノラル、SEは状況に応じてステレオとモノラルを使い分ける。

###サンプリングレート
音の滑らかさを表す。
動画に例えるとFPSに該当する。
ゲームの最高音質は48KHzとなり、一般的には44.1KHzで
スペックが低い携帯機などでは22.05KHzまで落とすことがある。

###ビット数
音の精度を表す。
動画に例えると、１枚あたりの画像の綺麗さに該当する。
8bitか16bitが一般的で、8bitだと音割れが顕著に表れるため
容量を削減する場合、ビット数を16のままにしてサンプリングレートを下げるほうが良い。

###容量について
サウンドの生データの容量の計算は上記の項目から算出することが出来る。

<b>サンプリングレート x ビット数 x チャンネル数 x 時間 = ファイル容量</b>

生データは容量が大きいので一般的にはmp3に変換して圧縮する。
ADX2を使う場合は、HCAという形式に変換を行う。

##ファイルパッキングについて
複数のファイルを一つのファイルにまとめることをファイルパッキングと言う。
ファイルパッキングを行うことで高速なファイルアクセスを可能とする。

[その３](http://qiita.com/sawasaka/items/5c72d5aff03224ad1d10)へ続く
PackerでHomebrew CaskでインストールしたVMware Fusion.appが見つからないとき

Homebrew CaskでVMware Fusionをインストールすると、`/Applications`ではなくユーザのホームディレクトリの`~/Applications`に配置されます。Packerはユーザのホームディレクトリを探さないため、`packer build`が失敗します。

```console
% packer build template.json
vmware-iso output will be in this color.

Build 'vmware-iso' errored: Failed creating VMware driver: Unable to initialize any driver for this platform. The errors
from each driver are shown below. Please fix at least one driver
to continue:
* Fusion application not found at path: /Applications/VMware Fusion.app
* Fusion application not found at path: /Applications/VMware Fusion.app


==> Some builds didn't complete successfully and had errors:
--> vmware-iso: Failed creating VMware driver: Unable to initialize any driver for this platform. The errors
from each driver are shown below. Please fix at least one driver
to continue:
* Fusion application not found at path: /Applications/VMware Fusion.app
* Fusion application not found at path: /Applications/VMware Fusion.app
```

これを回避するには、環境変数`FUSION_APP_PATH`でVMware Fusion.appのパスを指定しておきます。


```console
% export FUSION_APP_PATH=/Users/suin/Applications/VMware\ Fusion.app
```

環境変数を定義したら、通常通りpacker buildを走らせます。

```console
% packer build template.json
```
ansibleからinstance作成し、instance内の処理を実行する方法

ansibleを使った、AWSでインスタンスを作成し、サーバの設定までを１つのplaybookで書くには、どうすればよいか？
色々と調べたところ、以下のように書くと、いけました。


``` main.yml

# インタンスの作成を行う（EBS付き）
- name: Create instance
  hosts: 127.0.0.1
  connection: local
  user: www
  sudo: no
  vars_files:
    - vars/dev-front-deploy-vars.yml

  tasks:
   - name: インスタンスとEBSを作成し、attachまで行う
     ec2:
       aws_access_key: "{{ aws_access_key }}"
       aws_secret_key: "{{ aws_secret_key }}"
       region: "{{ region }}"
       zone: "{{ zone }}"
       key_name: "{{ keypair }}"
       instance_type: "{{ instance_type }}"
       image: "{{ ami }}"
       wait: "{{ instance_running_wait }}"
       group: "{{ security_group }}"
       count: 1
       vpc_subnet_id: "{{ vpc_subnet_id }}"
       assign_public_ip: "{{ assign_public_ip }}"
       instance_tags:
          Name: "{{ instance_name }}"
       volumes: # ここがEBSの設定
          - volume_size: "{{ ebs_volume_size }}"
            device_name: "{{ ebs_device_name }}"
            name: "{{ ebs_tag_name }}"
            delete_on_termination: true
     register: ec2

   - name: 新規作成したインタンスをホストグループに追加する
     add_host: 
       name={{ item.private_ip }}
       groups=dev-front　
     with_items: ec2.instances

   - name: インスタンスが起動し、SSHで接続できるようになるまで待つ
     wait_for: 
       host={{item.public_dns_name}} 
       port=22 delay=60 timeout=320 state=started
     with_items: ec2.instances


# 新規作成したインスタンスに対する処理を行う　
- name: Configure instance
  hosts: dev-front　# 上記で作成したホストグループ名を指定
  user: www
  sudo: no
  vars_files:
    - vars/dev-front-deploy-vars.yml

  tasks:
   # ここに作成したインスタンス内での処理を書いていく
```

このような、playbookを書くとインスタンス作成〜インスタンス内での処理を一連の流れで行うことができます。
荒削りな部分もありますので、あくまで参考までに。

# 参考
[Github:ansible-example](https://github.com/ansible/ansible-examples/blob/master/language_features/eucalyptus-ec2.yml)
#if UNITY_EDITOR がなければSVNコミットさせない

#背景
Editor用のスクリプトなんだけどEditorフォルダには格納できない。
そういう類のスクリプトでは、#if UNITY_EDITOR を使用します。
（GameObjectにコンポーネントとしてアタッチする系）

が、書き忘れてコミットしてしまうとビルドエラーになったりします。
それを防ぐ手段としてSVNのフックスクリプトを用意しました。
※今回はクライアントスクリプトです。

#概要
* フックスクリプトとは？設定方法は？などは省略します。
* フックタイプは pre-commit です。
* 特定フォルダ以下にある *.cs を処理することだけを考えています
* バッチファイルにしましたがjs/vbs/pythonなどで書いたほうがきっと楽です

#コードサンプル
```bat
@ECHO OFF

REM ---------------------------------------------------------------------------------
REM ユーザー指定のチェック用文字列
REM ---------------------------------------------------------------------------------

REM チェック対象のフォルダ
SET SEARTH_PATH=D:/projects/test/Assets/Scritps
REM チェック対象の拡張子
SET SERACH_EXT=cs
REM チェック条件（１行目の文字列）
SET SEARCHTEXT=#if UNITY_EDITOR


REM ---------------------------------------------------------------------------------
REM ユーザー指定のチェック用文字列
REM ---------------------------------------------------------------------------------

REM subversionから渡される引数を格納
REM Tempフォルダの svn*.tmpファイルへのパス
SET PATH_TMP=%1

REM tmpファイル内のパスをフィルタリングする文字列
SET QUERY="^%SEARTH_PATH%[^?]*\.%SERACH_EXT%$"


REM ---------------------------------------------------------------------------------
REM メインルーチン：tmpファイルの行を読み込みチェック対象ファイルパスをサブで処理
REM ---------------------------------------------------------------------------------
for /f "delims=" %%a in ('FINDSTR /R %QUERY% %PATH_TMP%') do CALL :CHECK_FILE %%a
GOTO OK


REM ---------------------------------------------------------------------------------
REM サブルーチン：対象となるファイルの１行目を取得してサブで処理
REM ---------------------------------------------------------------------------------
:CHECK_FILE
SET PATH_FILE=%1

IF NOT EXIST "%PATH_FILE%" (
	REM 削除コミットの場合はファイルが存在しないのでチェックしない
	ECHO %PATH_FILE%が存在しません。チェックをスキップします。>&2
    EXIT /B
)

for /f "delims=" %%c in (%PATH_FILE%) do (
	CALL :CHECK_HEADER "%%c"
	EXIT /B
)


REM ---------------------------------------------------------------------------------
REM サブルーチン：受け取った１行目がチェック条件文字に合致するかチェック
REM ---------------------------------------------------------------------------------
:CHECK_HEADER
SET FIRST_LINE=%1

REM 合致しない場合は直接エラー終了へジャンプ
ECHO %FIRST_LINE% | find "%SEARCHTEXT%" >NUL
IF NOT ERRORLEVEL 1 (
	ECHO EXISTS %SEARCHTEXT%>&2
	EXIT /B 
) ELSE (
	ECHO NO EXISTS %SEARCHTEXT%>&2
	GOTO NG
)


REM ---------------------------------------------------------------------------------
REM EXIT
REM ---------------------------------------------------------------------------------
:OK
	EXIT 0
:NG
	EXIT 1
```
一括してDockerイメージを最新にアップデートしたい

pull済みのDockerコンテナイメージを一括して最新にするワンライナーです。

```
sudo docker images | cut -d ' ' -f1 | tail -n +2 | sort | uniq | egrep -v '^(<none>|ubuntu)$' | xargs -P0 -L1 sudo docker pull
```

## どのようにしたらイメージが最新になるか？

Dockerのコンテナイメージを最新にするには、イメージ名を指定して`docker pull`します。

```
docker pull イメージ名
```

Docker 1.6では、引数に1つのイメージのみ指定可能であるため、全てのイメージをアップデートしようとしたら、`docker pull イメージ名`を繰り返し実行します。イメージが多くなると、手動でやるのは大変なので、上記のワンライナーでは`xargs`で一括して`docker pull`できるようにしています。

## 各コマンドの説明

* `sudo docker images`: Dockerのイメージ一覧を取得するコマンドです。イメージ名だけでなくタグ名など他の情報も出ます。

```shell-session:出力例
$ sudo docker images
REPOSITORY                            TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
mysql                                 5.7                 804442d17d6a        8 days ago          321.7 MB
mysql                                 5.7.7-rc            804442d17d6a        8 days ago          321.7 MB
mysql                                 5.7.7               804442d17d6a        8 days ago          321.7 MB
mysql                                 5.6                 56f320bd6adc        8 days ago          282.9 MB
...
```

* `cut -d' ' -f1`: 1列目だけを抜き出すコマンドです。-dはデリミタにスペースを指定、-fでは1列目を指定しています。

```console:出力例
$ sudo docker images | cut -d' ' -f1
REPOSITORY
mysql
mysql
mysql
mysql
mysql
mysql
mysql
mysql
mysql
```

* `tail -n +2`: 2行目以降に絞り込みます。つまり1行目(ヘッダ行)を取り除きます。
* `sort`: イメージ名をアルファベット順にソートします。
* `uniq`: イメージ名で重複している行を取り除きます。
* `egrep -v '^(<none>|ubuntu)$'`: アップデート対象外にするイメージ名を指定しています。
* `xargs -P0 -L1 sudo docker pull`:  各イメージを`docker pull`するコマンドです。`-P0`は並列してコマンドを実行するオプションです。`-P`の数値は並列数です。`-P4`のように明示的に4並列などと指定することもできます。`-P0`にしておくとxargsがリソースに応じて並列数を決めてくれます。`-L1`は1行おきにコマンドを実行するオプションです。
NERDTreeが重い時はカレントディレクトリを確認してみて

## 環境

* OS: Windows 8.1
* Vim: gVim 7.4

## 起動直後に:NERDTreeするとやたら重い

Vimでディレクトリツリーを表示して楽に開いてくれる[NERDTree](https://github.com/scrooloose/nerdtree)

大変重宝していますが、Vimの起動直後に`:NERDTree`すると

```
Please wait, caching a Large dir...
```

というメッセージが出てしばらく動かなくなります。

## NERDTreeを起動するときのディレクトリを変えてみて

どうやらカレントディレクトリを調べると、初期位置が`C:\Windows`とかになってました。
これをサイズが小さいディレクトリにcdしてやるとスムーズになるみたい。

そこで起動後のカレントディレクトリをホームディレクトリにしましょう。
ということで、以下をvimrcに追記

```
" 起動時のカレントディレクトリ
cd ~
```

これでVimを再起動すれば、直後に`:NERDTree`しても重くならないですよ。

もしC直下とかで作業することが多いのなら[Bookmarkでもすればよい](http://d.hatena.ne.jp/pospome/20140224/1393262444)のではないでしょうか。

## 参考

[Vim becomes unresponsive when toggling NERDTREE - Super User](http://superuser.com/questions/265829/vim-becomes-unresponsive-when-toggling-nerdtree/265864#265864)
docker imagesからイメージ名のリストを作成したい

`docker images`コマンドの結果から、イメージ名だけを抽出し、ダブルクォーテーションでかこったリストを作るワンライナーです。

```console
$ sudo docker images | cut -d' ' -f1 | tail -n +2 | sort | uniq | xargs -L1 -I{} echo '"'{}'"'
"clue/httpie"
"mysql"
"phusion/baseimage"
"selenium/hub"
"shouldbee/ansible-boto"
"shouldbee/baseimage-go"
"shouldbee/flyway"
"shouldbee/go"
"shouldbee/html2pdf"
"shouldbee/nginx-https-reverse-proxy"
"shouldbee/phantomjs"
"shouldbee/php"
"shouldbee/scala"
"shouldbee/selenium-node-chrome"
"shouldbee/selenium-node-firefox"
"shouldbee/tcpproxy"
"sylvainlasnier/memcached"
"ubuntu"
```

## 各コマンドの説明

* `sudo docker images`: Dockerのイメージ一覧を取得するコマンドです。イメージ名だけでなくタグ名など他の情報も出ます。

```shell-session:出力例
$ sudo docker images
REPOSITORY                            TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
mysql                                 5.7                 804442d17d6a        8 days ago          321.7 MB
mysql                                 5.7.7-rc            804442d17d6a        8 days ago          321.7 MB
mysql                                 5.7.7               804442d17d6a        8 days ago          321.7 MB
mysql                                 5.6                 56f320bd6adc        8 days ago          282.9 MB
...
```

* `cut -d' ' -f1`: 1列目だけを抜き出すコマンドです。-dはデリミタにスペースを指定、-fでは1列目を指定しています。

```console:出力例
$ sudo docker images | cut -d' ' -f1
REPOSITORY
mysql
mysql
mysql
mysql
mysql
mysql
mysql
mysql
mysql
```

* `tail -n +2`: 2行目以降に絞り込みます。つまり1行目(ヘッダ行)を取り除きます。
* `sort`: イメージ名をアルファベット順にソートします。
* `uniq`: イメージ名で重複している行を取り除きます。
* `xargs -L1 -I{} echo '"'{}'"'`:  各行について、ダブルクォーテーションでくくる処理です。`-L1`は1行おきにコマンドを実行するオプション、`-I{}`は変数のプレースホルダの定義、`echo`以降は各行に実行するコマンドです。
AppleWatch/WatchKitにてインジケーターを表示する

AppleWatch/WatchKitにてiPhone側処理待ちの時にインジケーターを表示しようと思い、Storyboardを見てみるとUIActivityIndicator的なものがなく困ったのでメモ。
結論的には連番画像を用意してWKInterfaceImageでアニメーションしろという感じでした。

参考：[Make Animations for WATCH Using iPhone](http://blog.andydrizen.co.uk/blog/2015/01/03/making-watchkit-animations/)

#導入方法

まず、参考ブログ下部のコメント欄にて公開されている連番インジケータの画像を使用させてもらいます。
[Make Animations for WATCH Using iPhone](http://blog.andydrizen.co.uk/blog/2015/01/03/making-watchkit-animations/#disqus_thread)

まず、zipファイル解凍後WatchKitAppのImages.xcassetsに画像ファイルをドラッグ&ドロップでコピーします。
この時、公開されている画像は`spinner@2x○○`このような連番となっているので、retina対応するためには`spinner○○@2x`のような形式に変更してください。

その後、Storyboard上でWKInterfaceImageを配置し、Imageを連番を含めない画像ファイル名を指定します。
リソースが`spinner@2x○○`ならば`spinner@2x`
`spinner○○@2x`ならば`spinner`のようになります。

![スクリーンショット 2015-04-30 16.28.11.png](https://qiita-image-store.s3.amazonaws.com/0/1500/65d8e5f3-8e9b-88e7-dea2-31e010e15a71.png)

その他パラメータは
Animate:Yes
Duration:3
Animate on Loadにチェック

Durationはパッと見た感じ３秒くらいがいい感じでした。

後は画像を好きな感じに変えてインジケータを表示するだけです。

そもそもなんで、iPhone側の処理待機が必要なのに標準でインジケータがついてないのか不思議なんですが、なにか理由など知ってる方いらっしゃいましたら教えて下さい。
rubyzipでZip内のファイル名を変更する

例えばzipファイル内のfoo.txtをbar.txtにリネームするには次のようにする。

```rb
require "zip"

Zip::File.open(zip_path) do |zip_file|
  entry = zip_file.find_entry("foo.txt") # Zip::Entry
  zip_file.rename(entry, "bar.txt")
end
```

ループで回して一括で連番にしたいときには次のようにする。

```rb
require "zip"

Zip::File.open(zip_path) do |zip_file|
  # Zip::File#entriesはEnumerableなZip::EntrySetを返す
  zip_file.entries.sort_by(&:name).each.with_index(1) do |entry, n|
    new_name = "#{n}.txt"
    zip_file.rename(entry, new_name)
  end
end
```

rubyzip 1.1.7で確認した。1.xと0.xとでAPIが変わっているので要注意。
Resolve-Pathでファイルのフルパス取得

Powershellでファイル一覧はGet-ItemやGet-Childrenを使います。
これはあくまでファイルの一覧であってファイルのフルパス一覧ではない。

ファイルのフルパス一覧が欲しい場合には、
Resolve-Pathを使います。


##Resolve-Pathを使う

```ps1:Resolve-Path
PS > Resolve-Path FileName
Path
----
C:\Users\yusuke\FileName
```

ワイルドカードも使えます。

```ps1:ワイルドカードを使って複数ファイルのパスを取得

PS > Resolve-Path Folder\*
Path
----
C:\Users\yusuke\File1
C:\Users\yusuke\File2
C:\Users\yusuke\File3
```

私はこんな風に使います。

```ps1:フォルダー内のCSVファイルを全てインポート
PS > $files = Resolve-Path resources\*.csv
PS > $files
Path
----
C:\Users\yusuke\title.csv
C:\Users\yusuke\firstname.csv
C:\Users\yusuke\familyname.csv

PS > $data = Import-Csv $files
PS > $data | Format-Table
ID   Data
---  ----
 1   Mister
 2   Yusuke
 3   Arakawa

```

##参考サイト
[Resolve-Path 　Microsoft TechNet](https://technet.microsoft.com/library/f84dd2a9-2961-400b-8b0a-45551b886172(v=wps.630).aspx)
Firefox for iOSを実機で動かす

**2015/11/13 AppStoreにて正式にFirefoxが公開されました :tada:**
ですので、普通はもう自分でビルドしなくてもいいです。
***
* [Firefox ユーザの皆さん、ついに iOS でもいつものブラウザがお使いいただけるようになりました！ | Mozilla Japan ブログ](http://www.mozilla.jp/blog/entry/10513/)
* [Firefox Web ブラウザを App Store で](https://itunes.apple.com/jp/app/id989804926)

***

Chromeも使いますが、Firefoxにとっても愛着を感じております。iOS版の開発も伝えられていましたが
ソースが公開されているので、待ちきれずに自分でビルドしてみることにしました。

xcodeを使って実機デバッグできる環境が必要です。iOS Developer Programとかですね。
(円安でさりげなく値上がりしていますね)

手順は、 https://github.com/mozilla/firefox-ios に掲載されていますので
その通り実行しました。

実は、「2. Install Carthage.」 を見逃していて5分ほど途方に暮れました

Cloneの中にある、 Client.xcodeproj を起動して、何も考えずにビルド。
エミュレーターでは上手く動きました！この調子で実機でもとんとん拍子に・・・と
甘い考えをしていたのですが、ダメでした(T-T)

#失敗1 SendTo にてエラー
![スクリーンショット 2015-04-30 15.22.22.png](https://qiita-image-store.s3.amazonaws.com/0/48016/9f28e3bb-3178-ab33-73b3-94708eb1cbba.png "スクリーンショット 2015-04-30 15.22.22.png")

SendToのプロパティを見るとTeamが「Unknow name」になっていたので自分のアカウントに修正

![スクリーンショット 2015-04-30 15.25.45.png](https://qiita-image-store.s3.amazonaws.com/0/48016/232e338a-42fb-0ae1-dd80-2d9bd684b89b.png "スクリーンショット 2015-04-30 15.25.45.png")

アカウントを変更して、Fix Issueをクリックするも以下のエラーが出るのでBundle Identifier を適切な値に変更した。(jp.qiita.hanamiche.*にしました)
「An App ID with Identifier 'org.mozilla.ios.Fennec.SendTo' is not available. Please enter a different string.」

![スクリーンショット 2015-04-30 15.30.14.png](https://qiita-image-store.s3.amazonaws.com/0/48016/de23a29d-255a-6ab0-d40a-7f82d8c7d73b.png "スクリーンショット 2015-04-30 15.30.14.png")

#失敗2 ShareTo にてエラー
SendToと同じように、ShareToもBundle Identifier を適切な値に変更した。

#失敗3 とにかく Bundle Identifierを変更しまくる
とにかく、org.mozilla.* や group.org.mozilla.* の記載があると実機で実行できないので変更する
### Client, SendTo, ShareToの「Keychain Sharing」「Add Groups」を適度に修正

ちなみに、swiftファイルに記載してある「org.mozilla.*」は修正不要

#そしてついに動いた
IDの衝突で動かないだけなのでBundle Identifier周りを調整してあげれば後はビルドするだけで簡単に動きました！
<img src="https://qiita-image-store.s3.amazonaws.com/0/48016/83339d7e-cd42-89bf-9525-9010d5150a99.png" title="実機のスクリーンショット" width="480">

やった！
Capistrano のデプロイ時にmigrateされない現象


Capfileに

```Capfile
 require 'capistrano/rails/migrations'
```
と書いてたが、

```shell
$ cap staging deploy:migrate --dry-run --trace
** Invoke staging (first_time)
** Execute staging
** Invoke load:defaults (first_time)
** Execute load:defaults
** Invoke deploy:set_rails_env (first_time)
** Execute deploy:set_rails_env
** Invoke deploy:set_rails_env 
** Invoke deploy:migrate (first_time)
** Invoke deploy:set_rails_env 
** Execute deploy:migrate
$
```

と実行されないので、確認してみた。

http://d.hatena.ne.jp/akishin999/20140516/1400251748
を参照してみて config/deploy/staging.rb のサーバのrolesに、dbがないことが原因と判明。

ブログにも書いてあるけど、わかってしまえばそりゃそうだよな。となりますね……。
「フォルダーには名前が長すぎる項目が含まれていてごみ箱に移動できません」

「フォルダーには名前が長すぎる項目が含まれていてごみ箱に移動できません」

階層が深すぎてこんなメッセージが表示されます。
node_modulesフォルダとか消す時に表示されたりしますよね。

## 階層の深い適当なあたりのファイルから、共有にする。
ファイルのプロパティを見て、「共有」タブを選択します。
その後、「詳細な共有」を選択して、「このフォルダーを共有する」をチェック

「アクセス許可」ボタンを押し、everyoneに「フルコントロール」をチェックで適用させます。

## ネットワーク
「ネットワーク」にいき、自分のPCを選択します。
その中に先ほど選択したファイル・フォルダがあるので、削除しちゃいます。

戻って、ファイルを見ると（当たり前ですけど、）深い階層のファイルは消えてますので、
もうあのメッセージが出ることなく要らないフォルダをまるっと削除できてしまいます。
Ansibleでファイルのコピー

# Ansibleでファイルのコピー
ansibleで構築したサーバ上でファイルのコピーを行おうと思って、コマンドを探したら「copy」というものがあったので、使ってみた。

```yaml:sample.yml

- copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode="u=rw,g=r,o=r"
```

実行したところ、/srv/myfiles/foo.conf not foundと表示され、ファイルは確かにあるのになーと小一時間考えていたところ、

# エラーの原因
どうやらcopyコマンドはローカル（src)のファイルをリモート(dest)にコピーするコマンドだったので、「ローカルにそんなファイルはないよ」と怒っていたようだ。

もっとちゃんとドキュメントを読んでおくべきでした。。。


# 解決策
今回やりたかったのは、リモート上でファイルのコピーをしたいので、

そのようなコマンドを探していたが、見つからず。。。

結局、以下のようにして解決した。


```yaml:sample.yml

- command: cp -p /srv/myfiles/foo.conf /etc/foo.conf 
```

# まとめ
copyコマンドはローカルのファイルをリモートにコピーするときに使う

リモート上でファイルのコピーをする際は、commandで行う。
incronを使ってみた

# incronとは？
- ファイルの作成、変更、削除、移動といったイベントを検知して、登録したジョブを実行させるものです。
- Linuxのinotifyという仕組みを使っている。（Linuxカーネル2.6.13以降で利用可能）

# incronを選んだ理由
とあるファイルを修正した後に、必ずあるコマンドを実行して、ファイルを再作成する必要がある、それを毎回手動で行うのは面倒なので、色々調べた結果、incronにたどり着いた。

# インストール手順

```
$ sudo yum install incron
```

# 起動

```
$ sudo /etc/init.d/incrond start
```

# 停止

```
$ sudo /etc/init.d/incrond stop
```

# ジョブの登録

```
$ incrontab -e
[監視対象のファイル] [イベント] [実行するコマンド]
```

例

```
/home/www/test.ini.dev IN_MODIFY,IN_NO_LOOP /usr/bin/php /home/www/bin/test.php
```

## 解説
/home/www/test.ini.devを、

IN_MODIFY(編集)したら、

/usr/bin/php /home/www/bin/test.phpを実行

という意味


- イベントはカンマ区切りで複数指定が可能
- PATHなどの環境変数は一切反映されていないっぽい（なので、phpとかも/usr/bin/phpと書かないといけない）
- IN_NO_LOOPは、よくわかっていないが、実行するコマンドが完了するまで、イベント監視を無効にするというイベント。（これを指定しないとなぜか、２回目以降にイベントが実行されない）

マニュアルには、

>「there  is  a  symbol which doesn’t appear in the inotify symbol set. It it IN_NO_LOOP. This symbol disables monitoring events until the current one is completely handled (until its child process exits).」

## 検知可能なイベント
- IN_ACCESS
 - File was accessed (read)
- IN_ATTRIB
 - Metadata changed (permissions, timestamps, extended attributes, etc.) 
- IN_CLOSE_WRITE
 - File opened for writing was closed
- IN_CLOSE_NOWRITE
 - File not opened for writing was closed
- IN_CREATE
 - File/directory created in watched directory
- IN_DELETE
 - File/directory deleted from watched directory
- IN_DELETE_SELF
 - Watched file/directory was itself deleted
- IN_MODIFY
 - File was modified
- IN_MOVE_SELF
 - Watched file/directory was itself moved
- IN_MOVED_FROM
 - File moved out of watched directory
- IN_MOVED_TO
 - File moved into watched directory
- IN_OPEN
 - File was opened


# 登録したジョブの反映

```
$ incrontab -d
```

これを実行しないと、登録したジョブが反映されないので、ご注意。

# 登録したジョブの確認

```
$ incrontab -l

```

ちなみに、登録したジョブは
/vat/spool/incron/以下にファイルとして保存されています。

```
$ ls -l /var/spool/incron/
合計 4
-rw------- 1 root www 131  4月 27 11:35 2015 www
```

ファイル名はジョブを登録したユーザ名になっているみたいです。


# ログの確認

```
$ sudo tail -f /var/log/cron
```

cronのログと共有みたいです
こんな感じで表示されます。

```
Apr 27 11:35:09 ip-172-20-112-61 incrond[1248]: table for user www created, loading
Apr 27 11:35:09 ip-172-20-112-61 incrond[1248]: table for user www changed, reloading
Apr 27 11:36:11 ip-172-20-112-61 incrond[1248]: (www) CMD (/usr/bin/php /home/www/bin/test.php)
Apr 27 11:36:21 ip-172-20-112-61 incrond[1248]: (www) CMD (/usr/bin/php /home/www/bin/test.php)
```

# まとめ
cronライクで設定できるのは楽。
一方で、結構古いプロダクトのわりに、あまりネットに情報がなかったりするので、調べるのに苦労します。なお、開発は今も継続しているみたいです。

# 本家
http://inotify.aiken.cz/?section=common&page=home&lang=en


以上
Gitリポジトリ移行のメモ

Gitリポジトリ移行でちょっとハマったのでメモ書き。

既存のGitリポジトリのホストを変える方法を探していたら、下記コマンドでタグとかブランチごとまるっとできるよっていう記事がいくつか見つかったのだけど、エラーになったり、そもそもどこで作業してるの？？とかよく分からなかった・・。

>git clone --mirror \<REPOSITORY_URL>
>cd \<REPOSITORY>
>git push --mirror \<NEW_REPOSITORY_URL>

エラー内容
>No refs in common and none specified; doing nothing.
>Perhaps you should specify a branch such as 'master'.
>Everything up-to-date

いろいろやってみたところ、`clone --mirror` でできるディレクトリはバックアップファイルだということ。
このバックアップファイルの中に、push したいデータがまとめて入っていた。
あーそうか、`cd \<REPOSITORY>`ってそういうことだったのね・・。

ということで、まとめると以下。

1.作業したいディレクトリを作成し、そこに移動する
2.`git clone --mirror http://xxxx.xxxx.xx.xx/testgroup/test_repository.git`を実行し、リポジトリをブランチもタグも含めまるっとバックアップファイルを作成
3.test_repository.git というバックアップファイルができるので、`cd test_repository.git`で一階層下がる
4.`git push --mirror http://++++.++.++/testgroup/test_repository.git`を実行し、バックアップファイルを新しいホストに push する

これで完了！
Visual Studio Code を使って Markdown のプレビュー

Visual Studio Codeが巷で話題になっているので、Markdownの記法をざっと記述してみました。

## Visual Studio Code
作業画面としてはこんな感じです。一番左のビューで開いているファイルやフォルダの一覧が見れます。
また、Markdownのファイルを開いているときに、`command`+`shift`+`V`でMarkdownをプレビューすることが出来ます。
![VSC.png](https://qiita-image-store.s3.amazonaws.com/0/44446/1d893290-c053-fc68-95c5-21a939f037da.png "VSC.png")


## Markdownサンプル
以下のコードをVisual Studio CodeのプレビューとKobitoのプレビューを比較します。
![test.png](https://qiita-image-store.s3.amazonaws.com/0/44446/1b82f1d5-01d8-d30e-4093-7786ad7bb1a1.png "test.png")


## Kobito
![Kobito_preview.png](https://qiita-image-store.s3.amazonaws.com/0/44446/6029f6ab-db6d-225b-3dcd-0e84e5e5dc81.png "Kobito_preview.png")



## Visual Studio Code
![VSC_view.png](https://qiita-image-store.s3.amazonaws.com/0/44446/1d15074e-16d6-7a5f-d7f7-6772fc2fa144.png "VSC_view.png")



## 感想
 * 画面分割をして、記述しながら隣でビューできる(Kobitoみたいな感じ)はとても便利！
 * 起動がとても軽い！
 * 文字の漢字変換をreturnキーで候補を表示したあと、決定しないまま次の単語を入力すると消えてしまう
 * テーブル表記とインラインコードと引用のプレビューが、なんか…なんかなぁ…
 * コードを記述する際のシンタックスハイライトがJavaやCなどでは対応していない？？？

## 参考
 * Markdown Cheatsheet  
https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet
svnの目立たないけど便利な機能


# URLの省略記法

URLのリポジトリを示す箇所を"^"で置き換えることができる。
例えば、ワーキングコピーをブランチ "hoge" に切り替える場合、以下のとおりで行える。

```
$ svn switch ^/branches/hoge
```

trunkに切り替える場合は以下。

```
$ svn switch ^/trunk
```


# 元ネタ

http://stackoverflow.com/questions/294256/favorite-non-obvious-feature-of-svn
【CakePHP】独自に設定ファイルを作成する

app/Config配下にデフォルトで用意されているbootstrap.phpやcore.php以外にも独自にで設定ファイルを用意することができる。

１．設定ファイルの作成
app/Config配下に設定ファイルを作成する。
設定内容は$configへ連想配列で設定する。

```php
$config['limit'] = '10';
$config['address'] = [
  'from'=>'foo@example.com',
  'to'=>'bar@example.com '
];
```

２．設定ファイルの読み込み
Config配下に作成した設定ファイルをmyConfig.phpとすると以下のように読み込む。
常に使う設定の場合はapp/Config/bootstrap.phpに書く。

```php:bootstrap.php
Configure::load("myConfig.php"); 
```

３．設定の読み込み
$configのキーで値が取得できる。
多次元配列の場合は、ドット区切りでキーを指定できる。

```php
$limit = Configure::read("limit"); 
var_dump($limit);
//=>10

$from_address = Configure::read("address.from");
var_dump($from_address);
//=>foo@example.com
```

参考：[CakePHPでアプリケーション独自の設定ファイルを利用する](http://ameblo.jp/itboy/entry-11407741622.html)
自身のためのネットワークトラブル対処メモ

#まだ草案(失望
後輩とかに軽くこれくらいは知っておいてほしい的なものをここに溜め込んでおこうと思う。あとコメントとかもらっていろいろブラッシュアップできてもいいんじゃないかな(他人事)

##モチベーション
　ネットワークトラブルが起きた時の簡易ティップス。主に自分と初心者(１年生レベル)向け。初心者向けなので「なぜ？」をくどく書いているよ。急いでいるときは下の具体例までスキップしよう。暇な人は全部読むといいんじゃないかな。

キーワード: ネットワーク, トラブル, ping, ifconfig, ipconfig, ip a

##トラブルが起きたときは原因を切り分けよう
　トラブルに関しては大まかに２種類に分けて考えよう。正常に動いていたものが動かなくなったケースと初めて実装したものが動かないケース。

###正常に動いていたものが動かなくなった
　まず最初に、動いていた時と動かなくなった今の間に何があったか思い出すor調べよう。だいたいその変わった部分が悪さをしてる。元に戻すのが吉。さて、ここから本番。今回ネットワークトラブルに焦点を当てるよ。ここで用いる例は"オンラインサービスがつながらなくなった"。正常に動いていたのに...というケースは、個人的には**トップダウンで調べる**と割と良い感じ。以下はコマンドプロンプト(Windows)やターミナル(Mac/Linux/Unix)で入力。

**pingコマンド**
`ping -c 3 www.google.com`
　コマンドの詳しい説明は無しで、これはgoogleに「つながってますかー！」と問いかけをしている。これでgoogleから返答が帰ってきたらとりあえずインターネットとは通信が出来ている。なのに特定のオンラインサービスが使えないなら、自分とそのサービスの間だけの問題と原因を切り分けることができる。
※pingを実行して0% packet lossみたいな事が言われてたら大丈夫。100%ロスしてたら何かおかしい。
※`ping -c 3 64.233.167.99`これもgoogleに問い合わせてるのだけど、64.233.167.99とgoogle.comではちょっと内部でやってることが違う。ここでは詳しく解説しないがDNSが調子悪いと前者では通信が通るが、後者では通信が通らないという事が起こる。これでDNSが調子悪いときは特定できますね！

**ifconfig / ipconfigコマンド**
`ipconfig` //Windowsの場合
`ifconfig` //Mac,Linuxの場合
`ip a` //いくつかのLinuxの場合
　これは自分に今割り当てられているIPアドレスとかネットワークのざっくりした設定とかを見るコマンド。ここでipアドレス(inetとか書いてあるところ)に何も設定されていなかったら、そもそもネットワークに繋がる準備が出来ていない。インターネットそのものが落ちることは確率的にあまりに小さいので、十中八九で自分たちのLAN内の問題である可能性が高い。LANケーブルとかルータがちゃんと動いてるか確認してみるべし。

###初めて実装したものが動かない
　この場合は**ボトムアップで原因を特定していく**のが良いと思われる。小さな部分からちゃんと動くことを確認しながら、どこで正常に動かないかを見つけるのが良い。ここでは"自分の作ったwebサイトが見れない"と言う例で考えていくよ。

**そのファイル、開けますか？**
　もちろん作ったファイルは正常に開けるよね？開けなかったらファイルに問題アリだな！

**そのサービス、動いてますか？**
　出来ればサーバ自身のブラウザで`127.0.0.1`或は`localhost`にアクセスしてみてほしい。アクセスできません的なエラーが帰ってきたらそれ多分サービスが起動してないよ。

**そのサーバ、繋がってますか?**
　適切にネットワーク設定がされていたらipアドレスがあるはず。前述のping, ipconfig/ifconfig/ip aコマンドを使ってネットが使える状態になっているかを確認すべし。

**そのサーバ、アクセスできますか?(LAN内)**
別の端末からブラウザでサーバのipアドレスにアクセスしてみる。うまく見れない？じゃあサーバのサービスとクライアント間に問題がありそう。ファイルやフォルダ/ディレクトリのアクセス権限とか、ファイアウォールで外からのアクセスを弾いていないか要チェックや！

**そのサーバ、外からアクセスできますか?(Internet越し)**
　[cman様](https://www.cman.jp/network/support/port.html)あたりにご助力頂いて、自分のグローバルIPアドレスのサービスにアクセスできるかチェックしてみよう。繋がらない？十中八九ルータのポート解放だよ!!逆説的にLAN内のアクセスは許すのに外部ネットワーク(インターネット)からのアクセスを弾くなら、ルータのファイアウォールかサーバで任意のIPからしかアクセスを受け付けないという設定くらいしかないよ!!

##最後の一言
　大概のトラブルの原因(98%くらい)はくだらない事が原因です。入力のタイプミス、SELinux切ってなかった(爆)、アクセス権限の設定間違ってる、LANケーブルが外れてた/挿すポート間違ってる、サーバの電源つけてなかった、自動再起動だと思ってたら手動でしないといけなかった…etc。いや、本当にこんなんばかりなんですって。上手に切り分けて早く解決しましょう。

まだまだいっぱい書かないといけないことあるね。