OmniAICreator/Qiita-1.07M huggingface dataset:
ElixirでPhoenix Frameworkを使ってチャットアプリを作成する


Phoenixとは、ElixirのWebアプリのフレームワークで、自動的にアプリのひな形を作ってくれます。特徴的なのは、公式ドキュメントでは、オートリロードを簡単に行えることが紹介されています。これは、たとえばチャットアプリなんかに便利そうです。例えば、Lingrというチャットサイトがありますが、このLingrは、ブラウザを自らリロードして新しい投稿を読み込まなければなりません。ここで、Phoenixの特徴は、リロードキーを押さなくても、新しい投稿が見られるので便利ということですね。

![](https://raw.githubusercontent.com/mba-hack/images/master/phoenix-elixir-chat.png)

Mithrilは、「VirtualDOMを採用したデータバインディング型JavaScriptフレームワーク」というものらしいです。ご指摘があったので修正しました。

ここでは、Node.jsの`Bower`を使ってインストールすることにします。ちなみに、Bowerとは、RubyでいうところのGemfileのような働きをするツールのことで、最近ではよく使われています。私自身、例えばサイトを作る際にも、ライブラリのインストールと組み込みは、このBowerを使うことが多いです。インストールする依存ライブラリやツールを`bower.json`に書いて、`bower install`します。Bootstrapなんかもルートに`bower.json`置いてあったような気がしますね。忘れましたが。

それだけ`bower.json`を使って依存関係と必要なものを書き出すようにしている開発者は多いです。

さて、基本的な説明が終わりましたので、実行するコマンドを見ていきます。まずはテンプレートの作成と必要な物のインストール手順です。

```bash:
#phoenixでテンプレートを作成
$ mix phoenix.new ./chat_phoenix
$ cd chat_phoenix

#bowerでライブラリのインストールと依存関係の書き出し
$ npm install -g bower
$ bower init
$ bower install mithril --save
```

ちなみに、今回は、既にサンプルアプリを作成している方のコードを参考にしながらアプリを見ていくことにします。写経に近いです。

[https://github.com/niku/ff_stack_chat_example/](https://github.com/niku/ff_stack_chat_example/)

すごく分かりやすいです。ありがとうございます。

```bash:
# lib/chat_phoenix.ex
$ cd lib
$ curl -O https://raw.githubusercontent.com/niku/ff_stack_chat_example/master/lib/chat.ex
$ diff chat.ex chat_phoenix.ex
1c1
< defmodule Chat do
---
> defmodule ChatPhoenix do
11c11,13
<       supervisor(Chat.Endpoint, []),
---
>       supervisor(ChatPhoenix.Endpoint, []),
>       # Start the Ecto repository
>       worker(ChatPhoenix.Repo, []),
13,15c15
<       # worker(Chat.Worker, [arg1, arg2, arg3]),
<       worker(Chat.LoginUser, []),
<       worker(Chat.Message, [])
---
>       # worker(ChatPhoenix.Worker, [arg1, arg2, arg3]),
20c20
<     opts = [strategy: :one_for_one, name: Chat.Supervisor]
---
>     opts = [strategy: :one_for_one, name: ChatPhoenix.Supervisor]
27c27
<     Chat.Endpoint.config_change(changed, removed)
---
>     ChatPhoenix.Endpoint.config_change(changed, removed)

# web/static/js/app.js
$ cd ../web/static/js
$ curl https://raw.githubusercontent.com/niku/ff_stack_chat_example/master/web/static/js/app.js -o app_tmp.js
$ diff app.js app_tmp.js
#---省略

# web/channels/room_channel.ex
$ curl -sL https://raw.githubusercontent.com/niku/ff_stack_chat_example/master/web/channels/room_channel.ex
#---省略
$ curl -O https://raw.githubusercontent.com/niku/ff_stack_chat_example/master/web/channels/room_channel.ex
```

コードはこんな感じになってます。

次に、Phoenixで作られたプログラムをElixirでプレビューしてみます。GitHubのRepositoryをCloneしてそのまま使えます。この際、ルートにある`package.json`が使われます。

```bash:
$ git clone https://github.com/niku/ff_stack_chat_example

$ cd ff_stack_chat_example

$ nmp install
$ mix deps.get
$ mix phoenix.server

$ iex -S mix phoenix.server
--------------------------
$ curl -sL localhost:4000
```


参考:

こちらのブログ記事も本当に分かりやすく書かれています。素晴らしいです。

[ElixirとPhoenixとMithrilのFFスタックでChatアプリを作った](http://niku.name/articles/2015/08/22/Elixir%E3%81%A8Phoenix%E3%81%A8Mithril%E3%81%AEFF%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%81%A7Chat%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%9F)
右辺値、左辺値などの細かい定義

glvalue、rvalue、lvalue、xvalue、prvalueといった言葉を聞いたことがあると思います。黒魔術師や闇の軍団の方たちのお話ではさらっとでてくるこの言葉ですが、普通は細かい定義を把握しているわけではないと思います。なので、備忘録的にメモ書きをしておくことにしました。

気になったところ、間違い等ございましたらコメントをいただけると幸いです。

#expression

式。まずはここから。C++の全ての式は何らかの値であり、オブジェクトまたはポインタである。

```
1 + 2;  // expression ; an object
3;      // expression ; an object
func(); // expression ; an object
&func;  // expression ; a pointer
```

# lvalue
左辺値。代入式の左側にくることができる値のこと。この名前は上の理由から慣習的についたものであるが、当然右辺にくることもある。

```
int n = 0;
n = 1;     // n is lvalue.
int m = n; // n is lvalue.

int& func();
func() = 12;   // the result of func() is lvalue.
```

# rvalue
右辺値。これも慣習的についた名前だが、基本的に左辺にくることはない。
以下に紹介するxvalueとprvalueに分類できる。

```
int n = 0;            // 0 is rvalue ; prvalue
int m = std::move(n); // the result of std::move(n) is rvalue ; xvalue
```

# prvalue
pure rvalueの略。純粋右辺値。C++03までは全てのrvalueがここに分類される。
リテラルや、参照を返す関数を除く関数の戻り値がここに分類される。

```
int func();
func(); // the result of func() is prvalue.
```

# xvalue
eXpiring valueの略。死にかけの値の意で、C++11からは左辺値を右辺値参照にキャストすることで一時オブェクトと同じ扱いをさせることができるが、そのような余命宣告をされたオブジェクトがxvalueに分類される。ムーブセマンティクスの最も基本となる概念。

```
int n = 0;
int m = static_cast< int&& >(n); // static_cast< int&& >(n) is xvalue.

int&& func();
func(); // the result of func() is xvalue.
```

# glvalue
generalized lvalueの略、総合lvalue。
lvalueとxvalueを包含する概念。xvalueは右辺値参照であり、右辺値の扱いではあるが、本質はlvalueである。
そのため、lvalueとxvalueを総称してglvalueと呼ぶ。

```
int n = 0;
n; // glvalue ; lvalue
std::move(n); // glvalue ; xvalue
```

# 表
N3337 3.10 図1のコピペ。
![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/59629/18ca3ce6-a812-29b0-5323-3f5281e6eb43.jpeg)
jsでデザインパターン勉強メモ2 (初心者向け) シングルトンパターン

![472674a2-f991-6b12-c710-d4848a557f40.jpeg](https://qiita-image-store.s3.amazonaws.com/0/76843/c8e6a078-3d9a-3481-a390-672c6caa7273.jpeg)



噂の名著で勉強中です
今回はこちらの丁寧な記事も参考にさせていただきました。
http://bashalog.c-brains.jp/14/04/03-100000.php
今回はシングルトンパターンです。



# 3,シングルトンパターン



![スクリーンショット 2015-08-27 12.34.02.png](https://qiita-image-store.s3.amazonaws.com/0/76843/d7ca4ac0-48ef-b95d-2445-167be980f0bc.png)

シングルトン: 一枚札

⭐︎ クラスのインスタンスが存在しなければ新規作成。
インスタンスがすでにあればそのオブジェクトへの参照を返す。
とうおうパターンらいしです。

下記コード

```js:hoge

	var Singleton = (function() {

	  // シングルトンへの参照を保存
	  var instance;
	  
	  function init() {

	  	// オブジェクトを返す
	  	return {
			score :0,
		  	showScore: function(){
		  		console.log(this.score + '点です。');
		  	}
	  	}

	  }

	  return {
	    // ここからpublic
	    getInstance: function() {
	      if(!instance) {
	        instance = init(); 
	      }
	      return instance;　// instanceを返す
	    }
	  }

	})();



	var obj1 = Singleton.getInstance();
	var obj2 = Singleton.getInstance();

	// obj1とobj2は同じオブジェクト
	console.log(obj1 === obj2); // true

	obj2.showScore(); // 0点です。
	obj2.score++;
	obj1.showScore(); // 1点です。


```


続く、かもしれない
Scalaでshell-scriptのように書いたらすぐに動かしたい

## モチベーション

- Scala を shell script みたいにパッと書き換えてサッと動かしたい
- Java以外のものを環境にインストールしたくない（Javaのみインストールしている環境で気軽に実行したい）

## できるのか・・・？

結論として「できます。」

## 下ごしらえ

必要な物が何点かありますので、それを用意します。

[sbtのドキュメント](http://www.scala-sbt.org/release/docs/Scripts.html) では [conscript](https://github.com/n8han/conscript) を使いなされと書いてますが、
裏で知らないものがインストールされるのもちょっと気持ちが悪いので、必要な物を手で準備します。

１. sbt-launch.jar

```
https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/0.13.9/sbt-launch.jar 
```

こちらのURLからダウンロードします。

```
$ wget https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/0.13.9/sbt-launch.jar
```
ってかんじですね。

２. scalas というスクリプトを作成

    #!/bin/sh
    java -Dsbt.main.class=sbt.ScriptMain -Dsbt.boot.directory=$HOME/.sbt/boot -jar `dirname $0`/sbt-launch.jar "$@"


この2つを同一のディレクトリに入れ、パスを通しましょう

配置はこんな感じ

```
script-dir
  ├ sbt-launch.jar
  └ scalas
```

で、そこにPATHを通します。通します。（環境に合わせてPATHを通します）

```
echo "export PATH=$PATH:/{path}/{to}/script-dir/" >> ~/.bash_profile
source ~/.bash_profile
```
コマンドはこんな感じで。

下ごしらえは完了！！
（これがインストールじゃないのか？？という意見もあるかと思いますが、、、）

## バイバイ！ shell scriptッッ!!

以下の様な Scala スクリプトを作成してみましょう

```hello.scala
#!/usr/bin/env scalas

/***
scalaVersion := "2.11.7"
*/

println("Hello " + args.toList.headOption.getOrElse("World"))
```

で、ファイルができたら実行します。

```
./hello.scala
```

sbtがコンパイルするので若干もっさりと待たされた後に

```
Hello World
```

と表示されたら出来上がりです。
Phalconのvoltでタイトルタグをview内で設定したい

大概のテンプレートエンジンで、titleタグは共通のテンプレートに入っているかと思います。
そして、タイトルの中身はController内ではなく、後で指定したい事もあるかと思います。
そんな時は、表示しようとしているviewでsetしてやればいいだけみたいです。

```html:view/index.volt
<html>
  <head>
    <title>{{ title | e }}</title>
  </head>
  <body>
    {{ content() }}
  </body>
</html>
```

```html:view/controller/action.volt
{% set title = "タイトルです" %}
```

簡単ですねー

# おまけ

他のvoltと変数を共有するってことは、安易な名前を付けるとかぶってしまうんじゃ？
と、思ったので、下記ソースで実行順を調べてみました。

```html:view/index.volt
INDEX_TOP before:{{ title }}<br />
{% set title = "INDEX_TOP" %}
INDEX_TOP after:{{ title }}<br />

{{ partial("header") }}
{{ content() }}
{{ partial("footer") }}

INDEX_LAST before:{{ title }}<br />
{% set title = "INDEX_LAST" %}
INDEX_LAST after:{{ title }}<br />
```

```html:view/header.volt
HEADER before:{{ title }}<br />
{% set title = "HEADER" %}
HEADER after:{{ title }}<br />
```

```html:view/footer.volt
FOOTER before:{{ title }}<br />
{% set title = "FOOTER" %}
FOOTER after:{{ title }}<br />
```

```html:view/partial.volt
PARTIAL before:{{ title }}<br />
{% set title = "PARTIAL" %}
PARTIAL after:{{ title }}<br />
```

```html:view/controller/action.volt
CONTENTS_TOP before:{{ title }}<br />
{% set title = "CONTENTS_TOP" %}
CONTENTS_TOP after:{{ title }}<br />
{{ partial("partial") }}
CONTENTS_LAST before:{{ title }}<br />
{% set title = "CONTENTS_LAST" %}
CONTENTS_LAST after:{{ title }}<br />
```

で、結果は以下。

```text:実行結果
INDEX_TOP before:CONTENT_LAST
INDEX_TOP after:INDEX_TOP
HEADER before:INDEX_TOP
HEADER after:HEADER
INDEX_LAST before:FOOTER
INDEX_LAST after:INDEX_LAST
CONTENTS_TOP before:
CONTENTS_TOP after:CONTENTS_TOP
PARTIAL before:CONTENTS_TOP
PARTIAL after:PARTIAL
CONTENTS_LAST before:PARTIAL
CONTENTS_LAST after:CONTENTS_LAST
FOOTER before:HEADER
FOOTER after:FOOTER
```

以下の順で実行されているようです。

1. CONTENTS_TOP
2. PARTIAL
3. CONTENTS_LAST
4. INDEX_TOP
5. HEADER
6. FOOTER
7. INDEX_LAST

このことから、contents()を実行後、index.voltを実行といった所でしょうか。
partialに関しては記載されている順序で実行のようです。

ちなみにController内で設定したものは最優先のようで、上書きもできないみたいです。
デフォルトを設定したい場合はdefinedで調べて処理を変えるのがよさそうかも？

```html
<title>
{% if title is defined %}
  {{ title | e }}
{% else %}
  デフォルトのタイトル
{% endif %}
</title>
```
AndroidManifestのpackageとinfo.plistのBundle identifierに別の値を指定する


# 問題
Cordova(Phonegap)ではAndroidアプリでのパッケージ名、iOSアプリでのBundle identifierにconfig.xml内のidが設定される。
Android、iOSで別の値を使いたい。

# 方法

```config.xml
<widget ... android-packageName="Androidパッケージ名" ios-CFBundleIdentifier="Bundle identifier" ... >
```

# 参考
[Cordova: How to set different package names per platform using the cordova-cli?](http://stackoverflow.com/questions/27167009/cordova-how-to-set-different-package-names-per-platform-using-the-cordova-cli?)

//Android版公開後にiOS対応始めてXCodeでinvalid character in Bundle identifierって言われて冷や汗かいた
FriendsOfCake/searchが便利

# FriendsOfCake/searchが便利

## はじめに

cakephp3で検索機能を実装するにあたり
2系の時のお馴染みのCakeDCの [search](https://github.com/CakeDC/search) プラグインを使って実装できますが、
FriendsOfCakeの [search](https://github.com/FriendsOfCake/search) プラグインを使って実装することもできます。

これが意外とスッキリしてて使いやすかったのでご紹介したいと思います。

※FriendsOfCakeはcakephpの中の人達が作っています。

## 使い方

FriendsOfCake/searchのREADME.mdを行うことでとりあえず動くが一部変更

#### Controller
```
public function index()
{
    $this->loadComponent('Search.Prg');
}
```
↓

```
public function initialize()
{
    parent::initialize();
    $this->loadComponent('Search.Prg');
}
```

に変更する。   
actionメソッドの前にしないとfriendsofcakeのPrgComponent.phpのstartupが動かない。



## 実際に使ってみる

### usersテーブルにnameというカラムがあり、テキストのフォームに入力した文字列と一致したものを取得する

#### model/table

```
public function initialize(array $config)
{
    $this->addBehavior('Search.Search');
}
```

```
public function searchConfiguration()
{
    $search = new Manager($this);
    $search
    ->value('name', [
        'field' => $this->aliasField('name')
    ]);
    return $search;
}

```

#### controller

```
public function index()
{
    $query = $this->Companies
        ->find('search', $this->Users->filterParams($this->request->query))
        ->contain(['Users']);
    $this->set('users', $this->paginate($query));
    $this->set('_serialize', ['users']);
}
```

#### view

```
<?= $this->Form->create('Post'); ?>
<?= $this->Form->input('name', ['type'=>'text']); ?>
<?= $this->Form->button(__('Submit')); ?>
<?= $this->Form->end(); ?>
```

こんな感じでいけます。


## 一致じゃなく含むで検索したい場合（like検索）

#### model/table
```
public function searchConfiguration()
{
    $search = new Manager($this);
    $search
    ->like('name', [
        'before' => true,
        'after' => true,
        'field' => $this->aliasField('name')
    ]);
    return $search;
}
```

beforeとafterは前方後方の曖昧検索をする/しないの設定になります。

## その他

FriendsOfCake/search/src/Type/Maneger.phpにあるので見てみるといいです。
Appiumを使えるようになるまで（Mac編）

#appiumとは
上流工程エンジニアをやっていると、アプリの受入試験をよくやります。
ツールを使った効率化のためにAppiumを検討しましたが、
まず環境構築で色々悩んだので纏めました。
[appium公式サイト](http://appium.io/)
![スクリーンショット 2015-08-27 14.14.47.png](https://qiita-image-store.s3.amazonaws.com/0/84307/20a96c3d-9795-43f6-8dce-ab4c6ee048f4.png)


#必要なツールをインストールする
必要なもの
1. nvm
2. npm
3. appium

##nvm/npmのインストール
下記コマンドを打ちます。

```lang:Terminal
$git clone git://github.com/creationix/nvm.git ~/.nvm
$source ~/.nvm/nvm.sh
```

[公式サイト](https://github.com/creationix/nvm#installation)に則り、curlかwgetでインストールすることも可能です。

```lang:Terminal
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash
```

```lang:Terminal
$ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash
```

次に、インストールできるバージョンを確認してからインストールします。

###インストールできるバージョンを確認
```lang:Terminal
$ nvm ls-remote
```
ここで出てきた最新バージョン（頭にiojs-がついていないもの）をインストールします。

###最新バージョンをインストール
```lang:Terminal
$ nvm install v0.12.7
```

###appiumのインストール
コマンドひとつで終わりです。

```lang:Terminal
sudo npm install -g appium
```


#./bash_profileにJavaとAndroid SDKのパスを設定する
JavaとAndroidのSDKパスを設定します。
##JavaのSDKが入っている場所の確認方法
下記コマンドを打って出てきた場所ばSDKのパスとなります。

```lang:Terminal
$/usr/libexec/java_home
```
私の場合はこんな感じでした。

```lang:Terminal
/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home
```
##Android Studioで使っているSDKが入っている場所の確認方法
Android Studioで
「File」＞「Other Settings」＞「Default Setting Structure…」
ここに記載されています。
私の場合はこんな感じでした。（ここにJavaのパスも入ってましたね）
![スクリーンショット 2015-08-27 12.54.24.png](https://qiita-image-store.s3.amazonaws.com/0/84307/915b70d0-c0c5-39ea-cef1-f299ea122fe0.png)

##.bash_profileにパスを設定する
.bash_profileに下記のようにSDKのパスを追記します。

```lang:~/.bash_profile
export JAVA_HOME='/usr/libexec/java_home'
export ANDROID_HOME='/Users/furusin/Library/Android/sdk'
```

#これで全部OK？の確認
##appium-doctorで確認
下記コマンドを全て叩いてみましょう。

```lang:Terminal
$appium-doctor
```

こんな感じで返ってきたらＯＫです。
![スクリーンショット 2015-08-27 14.15.58.png](https://qiita-image-store.s3.amazonaws.com/0/84307/99e5417c-5049-057a-868c-46993b0426d8.png)

※2015/09/09追記
なんだか上記だけじゃ全くダメでした。
簡単にテスト的に下記のようなのを作ったら
「appium_lib？あ？んなもん知らねーよ！（LoadError）」って言われました

```lang:test.rb
require 'appium_lib'
puts "hello world!¥n"
```

これもターミナルで実行しておく必要がありました。

```lang:Terminal

sudo gem install --no-rdoc --no-ri appium_console
```


##必要な環境が入っているかそれぞれ確認する方法

###appiumの有無
`$appium -v`
バージョン情報が返ってきたらOKです。
（2015/08/27現在、私は1.4.10でした。）

###nvmの有無
`$nvm --version`
バージョン情報が返ってきたらOKです。
（2015/08/27現在、私は0.26.1でした。）

###npmの有無
`$npm -v`
バージョン情報が返ってきたらOKです。
（2015/08/27現在、私は2.11.3でした。）

#完了
なんだか微妙にずれてる気がしないでもないので、随時修正します。
c++ builder > Delphi TList of records

構造体をTListで扱いたい。

http://stackoverflow.com/questions/5797368/delphi-tlist-of-records
にdelphi版はある。

これを参考に実装中。

と思ったけど、昔のコードが見つかったので貼っておく。

```cpp
void __fastcall TForm1::btnAddClick(TObject *Sender)
{
	if (m_lstData == NULL) {
		m_lstData = new TList();
	}
	data_t data;

	data.fval = 123.0;
	data.str = "TEST";

	m_lstData->Items[0]->fval = fval;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
	if (m_lstData != NULL) {
		delete m_lstData;
		m_lstData = NULL;
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnDispClick(TObject *Sender)
{
	data_t *data;
	for(int i=0; i<m_lstData->Count; i++) {
		data = (data_t *)m_lstData->Items[i];
		int nop=1;	// for breakpoint
	}
}
//---------------------------------------------------------------------------
```
FacebookSDK4.3.0でSharePhotoContentにcontentUrlをセットするとシェアダイアログが表示されない

FacebookSDKで画像をシェアしたい時には `SharePhotoContent` を使いますが、 `contentUrl` をセットするとなぜかシェアダイアログが表示されないという現象に小一時間ハマりました。

![Screenshot_2015-08-27-14-02-52_png.png](https://qiita-image-store.s3.amazonaws.com/0/15267/7863b8e5-a190-c46f-a5f6-8801c0fcf694.png "Screenshot_2015-08-27-14-02-52_png.png")


SDKのコードを追えていないのですが、URLを変えたりドキュメントを調べたりして色々試してもダメそうだったので書いておきます。
もし間違っていたり追記があれば、是非お願いします。

```java
SharePhoto sharePhoto = new SharePhoto.Builder()
        .setBitmap(bitmap)
        .setCaption("Caption")
        .build();

SharePhotoContent content = new SharePhotoContent.Builder()
        .addPhoto(sharePhoto)
//        .setContentUrl(Uri.parse(url)) これがあるとダイアログが表示されない
        .build();

ShareDialog.show(activity, content);
```

確認したのは、Android4.4.0です。

そもそもリンクのシェアではないので `setContentUrl()` をつけても何も変わらない気がするんですが、何なんでしょうか。。。
Makefileで繰返し処理

Makefile の中で簡易的に繰返し処理を行う
シェルはbash以外だとどうなるかはちょっとわかりません

```mf:Makefile
LIST=cat dog horse cow

do_it:
      @LIST="$(LIST)";\
      for x in $$LIST; do\
        touch $$x ;\
      done
```

こんな

2018.10.29 修正
=の前後にスペースがあるとダメなようです

```
正： LIST="$(LIST)"
誤： LIST = "$(LIST)"
```
RedHat  Enterprise Linux 6.7 に nginx をインストールしてみた

# はじめに

RedHat  Enterprise Linux 6.7 で、Proxy を使いたかったので、Nginx を導入する。
いきなり yum install しようとして、パッケージが見つからないって怒られたので、調べた結果の備忘録。

# 環境
```
$ more /etc/redhat-release
Red Hat Enterprise Linux Server release 6.7 (Santiago)
```

# yum install で失敗
Redhat 公式のリポジトリにないにない様子

```
$ sudo yum install nginx
No package nginx available.
```

# nginx 公式サイトにリポジトリ発見
http://nginx.org/en/linux_packages.html#stable

Redhat 5,6,7/ CentOS 5,6,7 があるので、Redhat 6 のリポジトリを使用する。

```
$ sudo rpm -ivh http://nginx.org/packages/rhel/6/noarch/RPMS/nginx-release-rhel-6-0.el6.ngx.noarch.rpm
```
(注意: URL が変わる可能性があるから、公式サイトから直接コピーした方が良い)

#### (蛇足) このとき rpm の proxy でハマったから以下のページを参考に解決
http://qiita.com/Ki4mTaria/items/d10f3d562d02a0a4ded4

# yum install で成功

```
$ sudo yum install nginx
```


# 終わりに
単純にリポジトリの追加だけで、完了した。
次は、proxy の設定する予定。
vi / vim を初めて触るレベルの人が最初に習得すべき12個の操作


はじめに、 __たまにVimを触る必要があるけどあんまり積極的に触りたくない__ 人に向けた記事ではないです。 __Vimを習得したいけど情報多すぎるし、とりあえず何を覚えるのが良いの？__ みたいな人に向けています。

vi / vim という
魔物
エディタと戦うために最低限まずはこの12個知っておけば良いんじゃないかな、という操作です。本当は10個にしたかったんですが絞りきれませんでした。

当然「いや `u` くらいは…」「 `Ctrl` 絡みのキーバインドが無い…」とかあるんですが、それは2歩目ということでこの記事では1歩目だけに絞りました。

1歩歩き出せれば、2歩目を踏み出すのは容易だろうと思います。


カーソル移動系
--------------------

vi / vim を起動すると __ノーマルモード__ になっており、まず編集したい箇所までカーソルを移動します。

* 1. `h` … 左
* 2. `j` … 下
* 3. `k` … 上
* 4. `l` … 右


ノーマルモード→インサートモード
---------------------------

編集したい箇所までカーソルを移動したら、文字を入力するために __インサートモード__ に変更します。

* 5. `i` … カーソル位置に文字入力
* 6. `a` … カーソル位置の右に文字入力
* 7. `o` … カーソル位置の下に文字入力



インサートモード→ノーマルモード
---------------------------

文字の入力が終わったら __ノーマルモード__ に戻ります。

* 8. `Esc` … ノーマルモードに戻る



文字削除
--------------------


ノーマルモードの状態で削除したい文字にカーソルを移動して削除をします。

* 9. `x` … 1文字削除
* 10. `dd` … 1行削除



終了
--------------------

編集が終了したら vi / vim を終了します。

* 11. `:wq` … 保存して終了
* 12. `:q!` … 保存しないで終了


追記・undo/redoくらいはさせて！
----------------------------

と言われたのでオマケ。古臭い環境の古い vi や、busybox の vi なんかだと使えない場合もあります。

ちなみにノーマルモードでおこなってください。

* `u` … アンドゥ
* `Ctrl+r` … リドゥ

「なんか変になっちゃった！」→ `Esc` → `u` で元に戻る！という使い方は非常に多い気がします。

最後に
--------------------

この12個を知ってれば一通りの編集が出来るようになります。
はじめはノーマルモードとインサートモードという概念がわかりづらいので、慌てず今自分がどのモードで操作をしているのかを念頭に置いて作業すると良いです。

そしてどの状態でも `Esc` を押せばノーマルモードになります。これはとても重要。ワケわからなくなったら慌てずに `Esc` を押しましょう。

そして次のステップへいくためにお手元のターミナルでおもむろに `vimtutor` と打って実行してみてください。

### 追記 ###

__生き残る__ というレベルから __Vimの強大な力__ を感じるに至るまでの Vim との触れ合い方を書いてくださっている記事がとっても良いのでリンク貼らせていただきます。ご参考までに。

* [Big Sky :: Learn Vim Progressively](http://mattn.kaoriya.net/software/vim/20110902125512.htm)
【iOS】Alamofireを使ってauth_tokenをヘッダーに含める方法


Alamofireを使って、`auth_token`を**パラメーター**ではなく、**ヘッダーに含めて**HTTP通信をする方法を紹介したいと思います。

## そもそも何で`auth_token`をパラメーターに含めてはいけないのか！？
ユーザーは自由にパラメーターを変更してアクセスすることができます。HTTPメソッドが`GET`であればURLに表示されている部分を変更するだけといういとも簡単な操作で可能になります。たとえHTTPメソッドが`POST`でも同様です。
なので、盗まれてはいけない値`auth_token`は**絶対にパラメーターに含めてはいけません。**

　
## auth_tokenをヘッダーに含める方法
`パラメーターを送らない場合`は、非常に簡単です。

```StockTweets.swift
class func checkReplyLetter() {
     let authToken = CurrentUser.sharedInstance.authToken
        
     let URL = NSURL(string: "http://localhost:3000/api/v1/twees/")!
     let mutableURLRequest = NSMutableURLRequest(URL: URL)
     mutableURLRequest.HTTPMethod = "GET"
     // ヘッダーにauth_tokenを含める
     mutableURLRequest.setValue(authToken, forHTTPHeaderField: "auth_token")  // 第一引数が値で、第二引数がキー
     let manager = Alamofire.Manager.sharedInstance
        
     // HTTP通信
     manager.request(mutableURLRequest)
         .responseJSON { (request, response, JSON, error) in
     }
}
```
`パラメーターを送る場合`は、**少し**だけやることが増えます。

```StockTweets.swift
class func checkReplyLetter() {
     let authToken = CurrentUser.sharedInstance.authToken
     var params: [String: AnyObject!] = [
         "text": text,
     ]
     
     let URL = NSURL(string: "http://localhost:3000/api/v1/twees/")!
     let mutableURLRequest = NSMutableURLRequest(URL: URL)
     mutableURLRequest.HTTPMethod = "POST"  // GETではなくPOST
     mutableURLRequest.setValue(authToken, forHTTPHeaderField: "auth_token")
     let manager = Alamofire.Manager.sharedInstance
     // 増える箇所
     let request = Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: params).0  // エンコードの設定が必要になります。
        
     // HTTP通信
     manager.request(request)
         .responseJSON { (request, response, JSON, error) in
     }
}
```


## さいごに
Alamofireの導入方法の記事
· http://qiita.com/SoyaTakahashi/items/4a40aefdf13417b1857f
[Swift] コードでの画面遷移で NavigationControllerを使ってもスライドアニメーションをさせない方法

あたりまでだけど、Segueとこんがらがったりしてなんか忘れていたので、メモ。

# スライドアニメーションが出るコード

```swift
var storyboard: UIStoryboard = UIStoryboard(name: "storyboardName", bundle: nil)
var nextVC: UIViewController = storyboard.instantiateInitialViewController() as! UIViewController
self.navigationController?.pushViewController(nextVC, animated: true)
```

# させない方法

```swift
var storyboard: UIStoryboard = UIStoryboard(name: "storyboardName", bundle: nil)
var nextVC: UIViewController = storyboard.instantiateInitialViewController() as! UIViewController
self.navigationController?.pushViewController(nextVC, animated: false)
```

animatedをfalseにするのです。
Unity HierarchyにC#スクリプトをドラッグ＆ドロップできるようにするエディター拡張

#Unity5 HierarchyにC#スクリプトをドラッグ＆ドロップできるようにするエディター拡張

![image](https://qiita-image-store.s3.amazonaws.com/0/44288/19dc3f36-30be-b17d-28a1-37a4dd8d52a0.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/44288/f4403612-51c2-ba9f-9db9-a8795e4297c7.png)


##ソースコード

```  CustomHierarchy.cs
using UnityEngine;
using UnityEditor;

[InitializeOnLoad]
public static class CustomHierarchy
{
    static EventType event_last;
    static MonoScript[] mss;

    static CustomHierarchy()
    {
        mss = Resources.FindObjectsOfTypeAll<MonoScript>();
        EditorApplication.hierarchyWindowItemOnGUI += OnGUI;
    }

    private static void OnGUI(int instanceID, Rect selectionRect)
    {
        var evt = Event.current;

        if (evt.type != event_last)
        { 
            switch (evt.type)
            {
                case EventType.DragExited:
                    OnHierarchyDragExit();
                    break;
            }
        }
        event_last = evt.type;
    }

    private static void OnHierarchyDragExit()
    {
        Object obj = UnityEditor.Selection.activeObject;
        System.Type type = (obj == null) ? null : obj.GetType();
        string path = AssetDatabase.GetAssetPath(obj);
        string name;

        {
            string[] array = path.Split('/');
            name = array[array.Length - 1];
            name = name.Split('.')[0];

            Debug.Log(string.Format("ドラッグ : {0} ({1})",name,type));
        }

        if (type == typeof(MonoScript))
        {
            foreach (MonoScript ms in mss)
            {
                var cls = ms.GetClass();
               
                if (cls != null && cls.Name == name)
                {
                    GameObject go = new GameObject();
                    go.name = name;

                    //if(go.AddComponent(name) == null)  //Unity4ならこっち
                    if (UnityEngineInternal.APIUpdaterRuntimeServices.AddComponent(go, "Assets/CustomHierarchy.cs (57,24)", name) == null)
                    {
                        GameObject.DestroyImmediate(go);
                    }
                    AssetDatabase.Refresh();
                }
            }

        }
    }

}
```
c++ builder > TList / vector >  Lists in Delphi are implemented the same as stl Vectors:

TListとvectorの違いについて

http://www.pascalgamedevelopment.com/showthread.php?5797-c-vector-delphi

virtualさんの発言
> in experts-exchange they said that Tlist is very slow comparing to c++ vector

VilleKさんの発言
> Lists in Delphi are implemented the same as stl Vectors: they are array-based. And since data structure are the same then also performance should be comparable. 

両者とも同じ実装なのでパフォーマンスは同じだろうとのこと。
SNSを通してSQSにメッセージを送信する


## 環境
PHP 5.4
AWS SDK 2.8.19 (Composer未使用)

AWS SDK3系はPHP5.5以上にしか対応していないため、2系を使用致します。
諸事情によりComposerは利用しなかったので、[SDK一覧](https://github.com/aws/aws-sdk-php/releases)から2系の最新SDKをダウンロードしてきて直接フレームワークのライブラリ置き場にポイしました。

## AWSコンソール

### SNSの作成
1. 新しいSNSトピックの作成  
![1.png](https://qiita-image-store.s3.amazonaws.com/0/35451/babdd47b-961a-ef6a-1e25-a3044084718f.png "1.png")
2. 登録  
![2.png](https://qiita-image-store.s3.amazonaws.com/0/35451/d72ef4a9-4b9b-1268-35f2-dbd6cee71295.png "2.png")

### SQSの作成

1. Queueの作成  
![4.png](https://qiita-image-store.s3.amazonaws.com/0/35451/627325eb-7526-5017-1432-72aeb1129408.png "4.png")

2. Queueの名称を入力  
![5.png](https://qiita-image-store.s3.amazonaws.com/0/35451/b24b8bdf-fc90-4ecd-31cf-d3a426cf4f73.png "5.png")

3. 作成したQueueのARNはのちほど使用します  
![6.png](https://qiita-image-store.s3.amazonaws.com/0/35451/45299604-6e4d-6bbf-0879-582050027561.png "6.png")

### SNSに作成したSQSのARNを登録する

1. 先ほど作成したSNSのARNをクリック  
![8.png](https://qiita-image-store.s3.amazonaws.com/0/35451/afd74d51-45c1-29a8-e301-489a505beeaa.png "8.png")

2. Create Subscriptionをクリック  
![9.png](https://qiita-image-store.s3.amazonaws.com/0/35451/7a522485-5a6d-f8f5-459d-5b752a6eaba5.png "9.png")

3. 作成したSQSのARNを貼り付け
![10.png](https://qiita-image-store.s3.amazonaws.com/0/35451/1f5451d0-3ae8-c24e-3c95-e892491b5ee1.png "10.png")

以上でAWSコンソール上での操作はおしまいです。

## ソースコード

```php
// Composerで入れた場合はautoload.phpを読み込むが、直接ポイした場合はaws-autoloader.phpを読み込む
require_once('aws_sdk/path/aws-autoloader.php');
class Hoge{
    // AWS SNS通知送信
    try{
        $sns = SnsClient::factory(array(
          'key'    => AWS_KEY,
          'secret' => AWS_SECRET,
          'region' => AWS_REGION
        ));
        $sns->publish(array(
            'TopicArn'=>AWS_SNS_ARN,
            'Subject'=>'メッセージのタイトル',
            'Message'=>'メッセージの内容'
        );
    }catch (Exception $e){
        // 何かしらのエラー処理
    }
}
```

KeyとSeretに入力する値は下記の手順にそって作成できます。

1. ヘッダーのユーザ名をが表示されているドロップダウンをクリック  
![11.png](https://qiita-image-store.s3.amazonaws.com/0/35451/33b8783c-d0bd-b03f-79ca-340a01dc52ca.png "11.png")
2. 左のメニューからユーザをクリック  
![12.png](https://qiita-image-store.s3.amazonaws.com/0/35451/e2a02f7a-434d-2502-dd18-69c2b79aeb95.png "12.png")
3. CreateAccessKeyをクリック
![13.png](https://qiita-image-store.s3.amazonaws.com/0/35451/8de0aa17-a771-1ec8-20b6-34b42c4b49c9.png "13.png")
privilege の綴りのおぼえ方

「アクセス権」を英語では「access privilege」と言う。この privilege という単語は SQL でもよく使う。例えば、`grant all privileges to user` のように。

しかし privilege の綴りがおぼえにくくないか。私はよく pr *e* vilege とか privi *r* ege と間違える。

weblio で privilege を引くと

> [ラテン語で「個人のための法律」の意]

との記載がある (http://ejje.weblio.jp/content/privilege)。これを hint にすればおぼえやすくなる。

- priv は *priv* ate や *priv* acy の *priv*
- leg は *leg* al の *leg*

だ。
Unix/Linuxでのユーザ名・グループ名に関する制限


## Overview

Unix/Linux系システムのアカウントを外部アプリケーションと連携させる時に各ディストリビューションでユーザ名やグループ名の制限(limitation)がどうなっているか気になったので調べてみた

## ユーザ名の制限

### ユーザ名長

Linux系ではlibcのバージョンによって変わってくる。libc5が使われている古いシステムとlibc6では制限が違う。また古いSolaris(8,9,10系)では8byte以上のユーザ名を作ろうとすると警告が表示され、ps系コマンドでユーザ名が暗黙的にtruncateされたりするなどユーザ名を使用するアプリケーションの挙動が変わってくる。

#### hard limit

|種類|長さ|
|:--|:--|
|libc5|8|
|libc6|32|

#### soft limit

|種類|長さ|
|:--|:--|
|Solaris|8|
|libc6|32|

### 使用可能文字

- 数字、アルファベット、アンダーバーを使用可能
- 大文字は使用不可
- 先頭文字は数字は使用不可

正規表現で表すと `([a-z_][a-z0-9_]{0,30})` となる。




## グループ名の制限

|種類|数|
|:--|:--|
|Linux|32|
|Solaris|32|

### グループ名の長さを回避

GNU groupaddを`--with-group-name-max-length`オプションを付けてソースからコンパイルし直す。
ただしグループ名を使用するアプリケーションで32文字以上のグループ名が動作する保証はない。



### グループ数の制限

長さとは関係ないが１ユーザが所属出来るグループ数にはNISやNFSにより上限がある

|種類|グループ数|
|:--|:--|
|Linux Kernel < 2.6.3|16|
|Linux Kernel >= 2.6.3|32| 
|Solaris|16|

## まとめ

各システムでのユーザ・グループの制限を確認し、すべてのシステムで使用可能なサイズとしてはユーザ名・グループ名ともに **8文字** ということが分かった。
レガシーなUnixシステムとの互換性を保つためにアプリケーション側でユーザ名やグループ名をあえて8文字までしか認識しないよう実装している可能性もあるため、念を入れたい場合はユーザ名・グループ名共に8文字までに抑えよう。
expectでrsync over sshのパスワード入力を楽にする

# 前提

やんごとなき事情でファイル単位でrsync over sshをする、かつ、rsync over sshがパスワード認証の場合、ファイルごとにコマンドを実行してコマンドごとにパスワード入力が求められます。expectを使うとパスワード入力が1回で済むので楽できます。

# 準備

CentOS5/6などではyumでexpectをインストールしてください。

```
sudo yum install expect
```

# 例題のパラメータ

* ssh先のIPアドレス: a.b.c.d
* ssh先のポート番号: 10022
* sshのログインID: user
* ssh先の同期対象のディレクトリの絶対パス:/var/www/html

# 例題

まず更新対象のファイルのリストを以下のように作成します。ディレクトリの場合は末尾に「/」をつけないでください。ファイル名を「filelist.txt」とします。

```
app/Config/core.php
app/View/Top/index.ctp
...
```

以下のコマンドを実行して更新用のシェルスクリプトを生成します。

```
$ cat <<EOT>rsync.sh
#!/bin/bash

read -sp "Password: " PASS
tty -s && echo

EOT
$ for i in `cat filelist.txt`; do
cat <<EOT
expect -c "
set timeout 10
spawn rsync -auzv -e \"ssh -p 10022 -l user -o StrictHostKeyChecking=no\" --exclude \".svn\" --exclude \".git\" ${i} a.b.c.d:/var/www/html/`dirname ${i}`/
expect password:
send \"\${PASS}\n\"
interact
"
EOT
done | tee -a rsync.sh
```

生成したシェルスクリプトを同期対象のディレクトリにcdして実行します。

```
/bin/bash rsync.sh
```

## 備考

rsyncは事前にdry run(rsync -n)で結果を確認してから実行する方が良いので、dry run用のスクリプトも作って実行するのがお勧めです。
catでファイルを連結するとき・・


```sh
$ cat file1
This is file1.
$ cat file2
This is file2.
```

これらをcatで連結するときは

```sh
$ cat file1 file2 > file_all
$ cat file_all
This is file1.
This is file2.
```

とやりますが、途中でセパレートとか入れたいときは

```sh
$ cat file1 <(echo ---) file2 > file_all
$ cat file_all
This is file1.
---
This is file2.
```

などとできます。

転じて、サーバ間で設定ファイルを比較するときなど

```sh
$ diff /etc/postfix/main.cf <(ssh hostA cat /etc/postfix/main.cf)
```
なんてこともできます。
Google Chart ToolsのGeochartでビジュアル化してみる

# Google Chart Tools

Google Chart Toolsは無料で使えるグラフ作成APIです。色々な種類のグラフがありますが、今回はGeochrtを使ってみたいと思います。

https://developers.google.com/chart/

# Geochart

地図上にデータをマッピングできるグラフです。


https://developers.google.com/chart/interactive/docs/gallery/geochart

Excelでは作りづらいこんな感じのビジュアル化が簡単にできます。

![gc.png](https://qiita-image-store.s3.amazonaws.com/0/54004/6071cb0e-0942-1575-af75-520ea55c615a.png)

# Geochartでビジュアル化

今回は日本地図で都道府県別のデータをマッピングしてみたいと思います。テーマはずばり「都道府県別エンジニア求人数対決 Ruby vs PHP」。

エンジニア向けの求人サイトは色々ありますが、都道府県別のデータのぶっこぬきやすさで「IT転職ナビ」を選びました。

* http://www.itnavi.jp/

ここから都道府県別にRubyとPHPの求人数データを取得しました。このデータを使ってこんな感じでビジュアル化します。

```
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>IT転職ナビ 求人情報数 2015年7月31日版</h1>
<h2>Ruby求人情報数</h2>
<div id="drawChartRuby" style="width: 1200px; padding: 0; margin: 0; border: 0;"></div>
<h2>PHP求人情報数</h2>
<div id="drawChartPHP" style="width: 1200px; padding: 0; margin: 0; border: 0;"></div>
<script src="https://www.google.com/jsapi"></script>
<script>
google.load('visualization', '1', {'packages':['geochart']});
google.setOnLoadCallback(graphChart);
 
function graphChart() {
  var data_ruby = google.visualization.arrayToDataTable(
[
['都道府県', 'Ruby求人情報数'],
['北海道', 3],
['青森', 0],
['岩手', 0],
['宮城', 1],
['秋田', 0],
['山形', 0],
['福島', 0],
['茨城', 5],
['栃木', 2],
['群馬', 2],
['埼玉', 29],
['千葉', 33],
['東京', 797],
['神奈川', 50],
['新潟', 1],
['富山', 2],
['石川', 1],
['福井', 0],
['山梨', 0],
['長野', 1],
['岐阜', 1],
['静岡', 2],
['愛知', 10],
['三重', 1],
['滋賀', 3],
['京都', 18],
['大阪', 49],
['兵庫', 7],
['奈良', 4],
['和歌山', 2],
['鳥取', 0],
['島根', 5],
['岡山', 0],
['広島', 0],
['山口', 1],
['徳島', 0],
['香川', 0],
['愛媛', 0],
['高知', 0],
['福岡', 21],
['佐賀', 0],
['長崎', 0],
['熊本', 0],
['大分', 1],
['宮崎', 1],
['鹿児島', 0],
['沖縄', 5]
]
  );

  var data_php = google.visualization.arrayToDataTable(
[
['都道府県', 'PHP求人情報数'],
['北海道', 23],
['青森', 3],
['岩手', 2],
['宮城', 8],
['秋田', 2],
['山形', 1],
['福島', 4],
['茨城', 10],
['栃木', 9],
['群馬', 14],
['埼玉', 92],
['千葉', 103],
['東京', 1832],
['神奈川', 205],
['新潟', 2],
['富山', 2],
['石川', 8],
['福井', 3],
['山梨', 2],
['長野', 5],
['岐阜', 6],
['静岡', 7],
['愛知', 31],
['三重', 4],
['滋賀', 6],
['京都', 41],
['大阪', 222],
['兵庫', 39],
['奈良', 7],
['和歌山', 6],
['鳥取', 2],
['島根', 9],
['岡山', 4],
['広島', 7],
['山口', 5],
['徳島', 2],
['香川', 3],
['愛媛', 2],
['高知', 2],
['福岡', 79],
['佐賀', 2],
['長崎', 3],
['熊本', 6],
['大分', 3],
['宮崎', 4],
['鹿児島', 2],
['沖縄', 15]
]
  );
 
  var option = {
    region: 'JP',
    resolution: 'provinces',
    colorAxis: {colors: ['white', 'blue', '#00853f', 'black', 'yellow', '#e31b23']},
    backgroundColor: '#81d4fa',
    datalessRegionColor: '#f8bbd0',
    defaultColor: '#f5f5f5'
  };
 
  var graph_ruby = new google.visualization.GeoChart(document.getElementById('drawChartRuby'));
  graph_ruby.draw(data_ruby, option);
  
  var graph_php = new google.visualization.GeoChart(document.getElementById('drawChartPHP'));
  graph_php.draw(data_php, option);
}
</script>
</body>
</html>
```

## 完成物

http://jholiday-sadapon2008.rhcloud.com/itnavi20150731.html

![gc2.png](https://qiita-image-store.s3.amazonaws.com/0/54004/852b2402-bb5a-6280-7417-3da82c55c646.png)
いろいろな方法で1から100までを出力する

# まえがき
再学習用に記事へ起こしました。
[C# - いろいろな方法で1から100までを出力する](http://qiita.com/muro/items/330c6c5a059436bb497b) みたいな感じで、メモ書きです。

# 1. Array
``` rb
puts [1, 2, 3, 4, ... , 100]
```
`1`～`100`まで記述した`Array`クラスのオブジェクトを表示するという力技！


# 2. Range を Array に変換
```rb
puts [*1..100]
```

`1..100`と宣言するだけだと`Range`クラスだけど、
`[*1..100]`と宣言すると`Range`クラスを`Array`クラスへ変換してくれる。
べんりヾ(｡>◡<)ﾉ"


# 3. each
```rb
(1..100).each{|n| p n }
```
Rubyistなら`each`は使いまくってると思う(　‘◟ ‘)✧
`Array`でも`Range`でも、要素を1つずつ処理できるヤツです。
個人的には`each`と`map`と`inject`をよく使う（論点ずれてる

# 4. times
```rb
100.times{|n| p n+1}
```
繰り返す回数が決まってる場合は`times`使うよね！
名の通り、指定回数繰り返す便利なヤツだよ(๑˃̵ᴗ˂̵)و

# 5. upto
```rb
1.upto(100){|n| p n}
```
最小と最大が決まってる場合は`upto`も有効だね◝(╹▿╹)◜
`upto`の逆で`downto`もあるから、降順に処理も楽チン！

# 6. step
```rb
1.step(100){|n| p n }
```
`step`って名前が直感的でいいよね！
`n.step(max, m)`と宣言すると、`n`に`max`を超えるまで`m`を加算してくれるよ☆ゝω・)v
`1.step(10, 4)`だと`1, 5, 9`だね。
因みにこいつは`m`の部分にマイナス値や浮動小数も宣言できるよ！

# 7. for
```rb
for n in 1..100
  p n
end
```
他言語の`for`や`foreach`にあたるやつがこれかな？
ただ、Rubyは`each`があるから滅多に使わないね……(٥﹏٥` )

# 8. loop
```rb
n = 0
loop{
  n += 1
  break if n > 100
  p n
}
```
名前の通りブロック内を`loop`させるヤツだね。
`for`と同じく滅多に使わな……(´・ω・`)

# 9. while
```rb
n = 0
while n < 100 [do]
  n += 1
  p n
end
```
終了条件が変化する時などは`while`をよく使うよね！
終了条件が真の間、ずっと繰り返す処理だね。
Rubyの構文がすごいところは、`if`や`while`などが後置できるところだねƪ(•◡•ƪ)
こんな感じで書けるもんね！ ⇒ `p n+=1 while n < 100`
※`do`はあってもなくてもいいようです。

# 10. until
```rb
n = 0
until n >= 100 [do]
  n += 1
  p n
end
```

これはぶっちゃけ、`while`の終了条件の`not`だから特筆することないんだけど…。
個人的には、`while`で書く際に、終了条件が複雑になってしまい、`not`したら読みやすくなる場合に`until`を使うよ！(*´～｀ *)


# まとめ
えんじょい るびー ぷろぐらみんぐ！
Go言語のドキュメントに従って簡単なライブラリとテストコードを作ってみた

引き続き[How to Write Go Code](http://golang.org/doc/code.html)を見ながらGo言語の作業ディレクトリの作り方について調べて見る。

前回：[Go言語の作業ディレクトリをドキュメントに従って作り直してみた](http://qiita.com/ttsuzo/items/45eb4fc269986df9122c)

今回はGitへのコミット、ライブラリの作成、単体テスト、など。

#Gitへのコミット
普通にgit commitするだけです。

```
$ cd $GOPATH/src/github.com/chooyan/hello
$ git add hello.go 
$ git commit -m "commit hello world program"
[master (root-commit) 6b51615] commit hello world program
 1 file changed, 7 insertions(+)
 create mode 100644 hello.go
```

これをGithubにpushすれば、世界中の人がgo getできるようになるってことかな。

#ライブラリの作成

mathパッケージを作って、引数を足して返すだけのSum関数を実装したsum.goをhello.goにインポートして使ってみる。

```
$ mkdir math ; cd math
$ vi sum.go
```

```go:sum.go
package math

func Sum(a int, b int) int {
        return a + b
}
```

パッケージ名、ディレクトリ名等は以下に従うと良いみたい。

> where name is the package's default name for imports. (All files in a package must use the same name.)
Go's convention is that the package name is the last element of the import path: the package imported as "crypto/rot13" should be named rot13.

つまり、.goファイルを置いてあるディレクトリをそのままパッケージ名として宣言する。同じディレクトリに置いてある.goファイルのパッケージ名は全て同じになる。

以上を踏まえて、ライブラリを作ったらgo buildしておく

```
$ go build github.com/chooyan/math
```

ライブラリの場合、ビルドしたファイルは/pkgの下に生成される。

```
$ ll /usr/local/workdir/go/pkg/darwin_amd64/github.com/chooyan/
total 8
-rw-r--r--  1 chooyan staff  1048  8 26 23:53 math.a
```

/pkg下のディレクトリは、ビルドを実行したマシンによって分けられる様子。

> The linux_amd64 part is there to aid in cross-compilation, and will reflect the operating system and architecture of your system.


#ライブラリを使ってみる
では、作ったmathパッケージをhello.goで使うように変更する。

```
$ cd $GOPATH/src/github.com/chooyan/hello
$ vi hello.go
```

```go:hello.go
package main

import (
	"fmt"

	"github.com/chooyan/math"
)

func main() {
	x := 10
	y := 4
	fmt.Printf("Hello, world.\n")
	fmt.Printf("Sum of %d and %d is %d", x, y, math.Sum(x, y))
}
```

修正したら、go installして実行する。

```
$ go install github.com/chooyan/hello
$ hello
Hello, world.
Sum of 10 and 4 is 14
```

できた。

#ライブラリをテストする

最後に、testingパッケージを使った簡単なテストコードを書いてみる。

>You write a test by creating a file with a name ending in _test.go that contains functions named TestXXX with signature func (t *testing.T).

なので、今回はmathディレクトリ配下にsum_test.goファイルを作り、そこにTestSum関数を定義する。

```
$ cd $GOPATH/src/github.com/chooyan/math
$ vi sum_test.go
```

```go:sum_test.go
package math

import "testing"

func TestSum(t *testing.T) {
	a := 10
	b := 20
	expected := 30
	actual := Sum(a, b)
	if expected != actual {
		t.Errorf("Sum(%d, %d) == %d, want %d", a, b, actual, expected)
	}
}
```

実行する。

```
$ go test github.com/chooyan/math
ok  	github.com/chooyan/math	0.037s
```

ちなみに、Sum関数をいじってわざと失敗するとこんな感じ。（結果の出力だけ記載）

```
$ go test github.com/chooyan/math
--- FAIL: TestSum (0.00s)
	sum_test.go:11: Sum(10, 20) == 29, want 30
FAIL
FAIL	github.com/chooyan/math	0.010s
```

以上。
写経って大事。
PCsafariでiframeが左に1pxずれる現象

#現象
PCsafariでabsoluteのiframeが左に1pxずれる

#対処（ハック）

```
_::-webkit-full-page-media, _:future, :root iframe { /* safariのみ */
    right: -1px;
}
```

PCsafari（Yosemite未満）で直るが、Yosemiteは右に1pxずれる・・・
→Yosemite以降はこのバグが直ってるみたい。

デモ：http://jsrun.it/Ituki/yAOG
[Java] エンティティのJSON化において、無限ループを防ぐ

# 概要

エンティティAとBの2つがあります。

AとBは双方向にリレーションシップをはっています。

ここでAをJSONシリアライズすると……

Aをシリアライズ
↓
AからリレーションシップをたどってBもシリアライズ
↓
BからリレーションシップをたどってAをシリアライズ
↓
・
・
・
（以下続く）

というように、無限ループになってしまいます。これを防ぐ方法です。


# 方法１：シリアライズを一方向に制限する

リレーションシップは双方向のままで、シリアライズのみを一方向にできます。

AをシリアライズしたときはBもシリアライズします。けど、BをシリアライズしたときはAをシリアライズしません。

方法は、A側に``@JsonManagedReference``アノテーションをつけ、B側に``@JsonBackReference``をつけます。

```java:A.java
@Entity
class A implements Serializable {
   @OneToMany(mappedBy="a")
   @JsonManagedReference
   private List<B> bList;
}
```

```java:B.java
@Entity
class B implements Serializable {
   @ManyToOne
   @JsonBackReference
   private A a;
}
```

Aをシリアライズすると、このようになります。

```js:
{
  b: [
    { }
  ]
}
```

# 方法2：複数回登場するエンティティは、IDに置き換える

エンティティクラスに``@JsonIdentityInfo``をつけると、シリアライズ時にIDを発行し、同じエンティティを参照するときはIDに置き換わります。

```java:A.java
@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class)
class A implement Serializable {
   @OneToMany(mappedBy="a")
   private List<B> bList;
}
```

```java:B.java
@Entity
class B implements Serializable {
   @ManyToOne
   private A a;
}
```

Aをシリアライズすると、このようになります。

```js:
{
  @Id: 1
  b: [
    { a: 1 }  /* @Id=1のオブジェクトを参照している */
  ]
}
```
Mac よく使う開発ツール

#よく使う開発ツール

##クラウドストレージ
###DropBox
[DropBox](https://www.dropbox.com/ja/)
ファイルは大体**Googleドライブ**か**DropBox**に入れますね。
複数端末で管理したい時は、**Dropbox**を使うという使い分けをしています。
パソコンの容量がなくなって来た時にも、一時的な保存に便利です。

##DBクライアント
###SequelPro
[SequelPro](http://www.sequelpro.com/)
無料で高機能で便利ですね。
**HTTPトンネル**には使えないのが、少し痛いです。

##画像編集
###Pixelmator
[Pixelmator](http://www.pixelmator.com/)
無料で**Photoshop**の代わりに使えるソフトです。
操作がわかりやすく、手軽に使えます。

##画像圧縮
###TinyPNG
[TinyPNG](https://tinypng.com/)
png形式もjpeg形式もドラッグ&ドロップで圧縮できる画像圧縮ソフトです。


##コマンドラインツール
###Homebrew
[Homebrew](http://brew.sh/index_ja.html)
ライブラリや、コマンドなどの導入が圧倒的に楽になるので、絶対に入れておきたいですね。

##作業効率アップ
###Alfred
[Alfred](https://www.alfredapp.com/)
作業中に他のアプリの起動や切り替えを早く行う事ができる作業効率upのソフトですね。

##バージョン管理ツール
###codebreak
[codebreak](http://codebreak.com/ja/)
和製github。
無料でプライベートリポジトリが持てるのですごくありがたい。

###github
[gihub](https://github.com/)
もちろん、本家もご紹介。

##スマホ・PC間でデータを自在に転送できるソフト
###pushbullet
[pushbullet](https://www.pushbullet.com/)
複数端末でファイルやリンク送る時に重宝しますね。

##コンタクトを入れる時使います
###FaceTime
defalutで入っています。
Macがあればどこでもコンタクトを入れることができます。
## 随時他に使ってる良ソフトを更新します。
-Keynote
-Pages
-iMovie
-numbers
-Skype
-Slack
-245cloud
-misoca
-keynote
-MAMP
-Atom
-Blocs
-Adobe Creative Cloud
-feedly

おすすめの開発が捗るツールがあれば教えてください。
Google Compute Engine がめっちょ安い

(※2015/8/27 現在の値段です。)

![gce_price1.png](https://qiita-image-store.s3.amazonaws.com/0/13836/64032d0c-ed56-444b-a7ea-58fe8928198c.png)

試しに`n1-standard-4` (Core 4, Memroy 15 GB、GCEU 11) で試算してみても、月々たったの6000円弱。めっちょ安い・・・(※1ドル120円で計算)

![gce_price2.png](https://qiita-image-store.s3.amazonaws.com/0/13836/b62faa9b-4dff-8772-7ab4-41f94cc5c373.png)

`f1-micro` に至っては、月々500円で使えるぞ・・・！（レンタルサーバや他の最安VPS並）
knife (zero) bootstrapで入れるChef Clientのバージョンを変える(test-kitchenも)

# 方法
以下の２つを利用する。

- `bootstrap-install-command` でインストールに使うコマンドを変えられる。
- ChefのLinux向けインストーラとして公開されているシェルはオプションを渡すとバージョンが変えられる。

## knifeコマンド
なのでこんな感じで任意のバージョンが入れられる。

```shell-session
knife zero bootstrap --bootstrap-install-command "(echo 'version=12.3.0'; curl -L https://www.chef.io/chef/install.sh) | sudo bash"
```

## test-kitchen
上記の仕組みを利用したオプションが用意されているので、それを使う。

```yaml:.kitcehn.yml
provisioner:
  name: chef_zero
  chef_omnibus_install_options: "-v 12.3.0"
```

動かないバージョンに当たった時などにご利用ください。
c++ builder > Hash値の計算 > MD5 / SHA-1 / SHA-256

~~[Indy 9 と Indy 10 でハッシュ値を計算 - MD5, SHA-1, SHA-256](http://blogs.embarcadero.com/teamj/2011/06/23/2194/)~~ (リンク切れのようです。 2018/11/14)

> Indy 10では、従来の古いMD5だけでなく、「SHA(Secure Hash Algorithm)」のアルゴリズムも利用できるようになっています。例えば、160ビットのSHA-1を使用するには、...
...
> 

エラー発生時の追跡として、任意のIDをつけるためにHashを使うのが良いのだろうか。。。

### リンク (2018年11月現在)
(追記 2018/11/14)

下記の英語ページを見つけた。読込みが遅く30秒程度待たされる。

https://community.embarcadero.com/blogs/entry/sha-hash-with-c-builder-and-delphi
lhaのrpmを作ってみる

.lzh形式のファイルの圧縮・解凍をLinux上で行えるlhaのrpmを作ってみます。

* http://lha.sourceforge.jp/

# 参考にしたページ

* http://linux.yebisu.jp/memo/747

# 前提

* CentOS5 64bitで作業します。
* rootで作業します。

# 準備

ビルドに必要なパッケージをインストールします。

```shell
yum -y install rpm-build make autoconf automake gcc glibc-devel
```

# 実行

```shell
cd /usr/src/redhat/SOURCES
curl -LO http://iij.dl.sourceforge.jp/lha/22231/lha-1.14i-ac20050924p1.tar.gz
cat <<'EOT'>header.patch
--- src/header.c.orig   2006-10-11 01:27:51.000000000 +0900
+++ src/header.c        2015-03-23 15:20:13.000000000 +0900
@@ -236,9 +236,11 @@
     }

     if (from_code == CODE_SJIS && to_code == CODE_UTF8) {
-        for (i = 0; i < len; i++)
+        for (i = 0; i < len; i++) {
             /* FIXME: provisionally fix for the Mac OS CoreFoundation */
             if ((unsigned char)name[i] == LHA_PATHSEP)  name[i] = '/';
+            else if ((unsigned char)name[i] == '\\')  name[i] = '/';
+        }
         sjis_to_utf8(tmp, name, sizeof(tmp));
         strncpy(name, tmp, size);
         name[size-1] = 0;
EOT
cd /usr/src/redhat/SPECS/
cat <<'EOT'>lha.spec
Summary: LHa for UNIX
Name: lha
Version: 1.14i
Release: ac20050924p1%{?dist}.fusic.1
License: distributable
Group: Applications/Archiving
Source: http://iij.dl.sourceforge.jp/lha/22231/lha-1.14i-ac20050924p1.tar.gz
URL: http://lha.sourceforge.jp/
Patch: header.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
BuildRequires: make autoconf automake gcc glibc-devel

%description
LHa for UNIX

%prep
%setup -n lha-1.14i-ac20050924p1
%patch -p0
mv man/lha.man man/lha.man.euc
iconv -f EUC-JP -t UTF8 man/lha.man.euc >man/lha.man
mv man/lha.n man/lha.n.euc
iconv -f EUC-JP -t UTF8 man/lha.n.euc >man/lha.n

%build
./configure --enable-multibyte-filename=utf8 --prefix=/usr --mandir=/usr/share/man
make

%install
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/usr/bin
mkdir -p $RPM_BUILD_ROOT/usr/share/man/mann

make prefix=$RPM_BUILD_ROOT/usr mandir=$RPM_BUILD_ROOT/usr/share/man install

pushd $RPM_BUILD_ROOT
for n in lha ; do
    chmod 755 ./usr/bin/$n
done
popd

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root)
/usr/bin/lha
/usr/share/man/mann/lha.n*

%changelog
* Mon Mar 23 2015 Tsuyoshi Sadakata <sadakata@fusic.co.jp>
- first release
EOT
rpmbuild --define 'dist .el5' -bb lha.spec
```

※ CentOS6の場合は↓でいけると思います。

```shell
rpmbuild -bb lha.spec
```

# インストール

```shell
rpm -Uvh /usr/src/redhat/RPMS/`uname -m`/lha-1.14i-ac20050924p1.*.rpm
```
Linuxでよく使うコマンドをMacのターミナルに登録（エイリアスを作る）

仕事でLinuxサーバを触っていて、よく使うコマンドがMacに無くて「んがあああ」となったことがある人は少なくないはず。

簡単に手順化しました。

#コマンドを登録する（エイリアスを作る）
私は勝手に「オレオレコマンドを登録する」と言っています。
一般的には「エイリアスを作る」と言うそうです。

##手順１．ターミナルを起動する
ターミナルを起動しましょう。
アプリケーション一覧に出てこない（下のDockにも出てこない）人は、
Control＋スペースでSpotlightを起動し、「Terminal」と入力しましょう。
![スクリーンショット 2015-08-27 11.12.13.png](https://qiita-image-store.s3.amazonaws.com/0/84307/ca902247-779c-ae9e-f528-cb6e88b854e7.png)
 
##手順２．コマンドを登録する
コマンドを登録する先のファイルにガリガリ書き込みます

###ファイルを開く
vi(エディタ)でbash_profileを開きます
※viの使い方はググってください

```$vi ~/.bash_profile
```

###オレオレコマンドを書き込む
私はllをよく使うので、これを登録しました。
次のように追記します。

```alias ll='ls -l'
```


###オレオレコマンドを読み込む
方法は２つあります。
１．ターミナルを再起動
２．コマンドで改めて読み込む

###コマンドで改めて読み込む場合
ターミナルで次のコマンドを打ち込みます。

```$source ~/.bash_profile
```

#完了
これで終わりです。

##応用編
よく使うコマンドをガバっと入れてしまうのもアリですね。
今ちゃんとhttpdのプロセス動いてるよね？の確認とか。
```alias hoge=`ps -ef | grep httpd | grep -v grep`
```
続 pandoc をつかって markdown で簡単にレポート的なものをつくる

昨日書いた記事の、レポートをつくるためのもろもろのものを生成するシェルスクリプトを書いた。
![pandoc をつかって markdown で簡単にレポート的なものをつくる](http://qiita.com/Paragraph_14/items/dbd1ef9f1ae4ec091199)

```makerepo.sh
#!/bin/sh

dirName=$1

if test $# -ne 1; then
    echo "pleas dir name"
    return 0
fi

makefile=$dirName/makefile
contents=$dirName/contents.md
main=$dirName/main.tex

echo -n "report name? : "
read reprotname
echo -n "author name? : "
read author

makefiletxt="TEX=platex
DVI2PDF=dvipdfmx
MKDFILE=contents.md
ROWTEX=rowtex.tex
TEXFILE=contents.tex

SOURCES=main.tex

all: makexbb md2tex converttex dvi2pdf clean

makexbb:
	@extractbb *.png

md2tex:
	@pandoc \$(MKDFILE) -o \$(ROWTEX)

converttex: \$(ROWTEX)
	@cat \$^ \\\\
	| sed 's/includegraphics/includegraphics[width=1.0\\\\\\\\columnwidth]/g' \\\\
	> \$(TEXFILE)

.tex.dvi: main.tex
	@\${TEX} \$<
	@\${TEX} \$<

dvi2pdf: \$(SOURCES:.tex=.dvi)
	@\${DVI2PDF} \$^

clean:
	@rm -f *.dvi *.aux *.log \$(ROWTEX)"

maintext="\\\\documentclass[11pt,a4paper]{jsarticle}

\\\\usepackage{amsmath,amssymb}
\\\\usepackage{bm}
\\\\usepackage{ascmac}
\\\\usepackage[dvipdfmx]{graphicx,color}
\\\\usepackage{longtable}
\\\\usepackage{booktabs}

\\\\title {$reprotname}
\\\\author {$author}

\\\\begin {document}
\\\\maketitle
\\\\input {contents}
\\\\end{document}"


mkdir $dirName
touch $makefile
touch $contents
touch $main

echo $makefiletxt > $makefile
echo $maintext > $main
```

こんなかんじになる。

```zsh
% mkrepo.sh dirname
report name? : レポートタイトル
author name? : 書いたひと
% cd dirname
% ls
contents.md  main.tex  makefile
% make
```
CentOS 7.1+Fluetnd+Elasticsearch+Kibana4をAnsibleで構築する

CentOS 7.1 x86_64にyumでFluetnd+Elasticsearch+Kibana4を構築するAnsible Playbookを作ってみました。

- https://github.com/sadapon2008/ansible-fluentd-elasticsearch-kibana4-centos7


# 構築

Ansibleのインベントリファイルは設定済みと仮定します。

```
$ sudo yum -y install git
$ git clone https://github.com/sadapon2008/ansible-fluentd-elasticsearch-kibana4-centos7.git
$ cd ansible-fluentd-elasticsearch-kibana4-centos7
$ ansible-playbook site.yml
```

# Fluentd経由でElasticsearchに確認用ダミーデータを投入

構築したホスト上で実行します。

```
$ echo '{"json":"message"}' | /opt/td-agent/embedded/bin/fluent-cat app.test
```

# ブラウザからKibana4にアクセスして確認

ブラウザから以下のアドレスにアクセスするとKibana4にアクセスできます。

- http://(IPアドレス):5601

# Elasticsearchの全データのクリア

構築したホスト上で実行します。

```
$ curl -XDELETE 'http://localhost:9200/*'
```
Andoird Support Library v23入れた時にハマったポイント@AndroidStudio


* SDK 23にしたらビルドが失敗しまくった。
* 色々ためしながら何とか成功までこぎつけたので、備忘録。
* まだまだありそうなので見つかり次第追記していきます

# エラーとして吐かれたもの

## その1: processReleaseResourcesでこける

```
* What went wrong:
Execution failed for task ':share:processReleaseResources'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Users/suzuki/workspace/android/sdk/build-tools/21.1.2/aapt'' finished with non-zero exit value 1

```


## その2: Appcompat内のstyleでparentが解決できない

![Kobito.SxLQ1T.png](https://qiita-image-store.s3.amazonaws.com/0/59166/ebe1502b-0b39-e396-821b-e214595ba08d.png "Kobito.SxLQ1T.png")

## その3: drawer menu系のresourceが見つからない

![Kobito.GBmQ7p.png](https://qiita-image-store.s3.amazonaws.com/0/59166/ba076dc8-93cf-521d-7a34-5665b3c8fa8b.png "Kobito.GBmQ7p.png")


# ためしたこと
* 基本的にはcompileSdkVersion, buildToolsVersion, targetSdkVersionを合わせる様にしました

## 問題その1とその2への対応: build.gradle修正
* compileSdkVersion, buildToolsVersion, targetSdkVersionを23にしました

## 問題その3
* resource名の前に"design_"をつける(命名が変わったのか?)
* 例: 

```before.xml
android:drawablePadding="@dimen/navigation_icon_padding"
```

```after.xml
android:drawablePadding="@dimen/design_navigation_icon_padding"