OmniAICreator/Qiita-1.07M huggingface dataset:
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」チュートリアル（１１）物理演算スプライトを使う

ここでは、「**game01**」というディレクトリ内で作業しているという前提で説明しています。

**※enforceの現在のバージョンでは、tmlib.jsで物理演算スプライトが使えません。**

# box2dを使った物理演算スプライトを使う
**enchant.js**には、box2dライブラリを使った専用のライブラリがあります。
enforceでは標準で物理演算ライブラリが読み込まれますので、システム側で特になにかする必要はありません。

# 地面を表示する
物理演算スプライトは、動的属性を付けた場合は重力によって延々と下へ落ちていってしまうため、地面となるオブジェクトを生成します。
まずは地面に使うスプライト画像をプリロード一覧に追加します。
「**environ.coffee**」を開き、

```coffeescript
    bear    : 'media/picture/chara1.png'
```
の下に、

```coffeescript
    ground  : 'media/picture/controlplane.png'
```
を追記してください。
この「**controlplane.png**」は、スマートフォンでタッチ操作を受け取るプレーンに使用する透明な画像なのですが、とりあえずはこれを使っておきます。
　次に「**enforceMain.coffee**」を開き、「**constructor**」メソッドの最後に下記を追記してください。

```coffeescript
        box2dGround = addObject
            image: 'ground'
            width: SCREEN_WIDTH
            height: 32
            x: SCREEN_WIDTH / 2 
            y: SCREEN_HEIGHT
            rigid: true
            kind: STATIC_BOX
            animlist: [
                [100, [0]]
            ]   
```
表示に使用する画像として、先ほどプリロード一覧に追加した「**ground**」を使っています。
ここで注目するのは、

```coffeescript
            rigid: true
            kind: STATIC_BOX
```
です。
スプライト生成の際に「**rigid**」パラメータを「**true**」にすることで、物理演算スプライトになります。
物理演算スプライトには4種類あり、

1. DYNAMIC_BOX
1. DYNAMIC_CIRCLE
1. STATIC_BOX
1. STATIC_CIRCLE

という定数で「**kind**」パラメータで指定します。
「**DYNAMIC**」で始まるものは、重力の影響を受け下に落ちていきます。
「**STATIC**」で始まるものは、重力の影響を受けないので、その場に静止しています。
「**STATIC**」で始まる物理演算スプライトは、見た目は通常のスプライトと同じですが、通常のスプライトは物理演算スプライトとの物理衝突処理が行われません。
　「**enforceMain.coffee**」に追記し、コンパイルされましたらWebブラウザをリロードしてみてください。
画面再下段に赤い枠が出て、物理演算スプライトが生成されているのが分かります。

# 物理演算キャラを生成する
次に、「**gameControl.coffee**」の「**when 1**」の最後にある「**@nextjob()**」の直前に、下記のコードを追記してください。

```coffeescript
                for i in [0...5]
                    box2dObj = addObject
                        image: 'bear'
                        motionObj: enemy01
                        width: 32
                        height: 32
                        x: SCREEN_WIDTH / 2 + (rand(6) - 3)
                        y: 0
                        rigid: true
                        kind: DYNAMIC_BOX
                        density: 1.0
                        friction: 0.1
                        restitution: 0.9
                        animlist: [
                            [50, [0, 1, 2, 1]] 
                        ] 
```
　今度は、「**DYNAMIC_BOX**」で物理演算スプライトを生成しています。
動きを定義するクラスとして「enemy01」を指定していますので、画面の左右を越えてしまう時の対処が行われるので、画面外に消えることはありません。
「**density**」で質量、「**friction**」で摩擦係数、「**restitution**」で反発力を指定します。

　それでは、保存しコンパイルし、Webブラウザをリロードしてみてください。
「z」キーを押してゲームを開始すると上から5匹のクマが落ちて来ると思います。
そして、最初に生成した地面の物理演算スプライトに衝突すると弾け飛びます。


[チュートリアル（１０）](http://qiita.com/digitarhythm/items/ec2ddf65496b0d536d0d) <--- ⬛︎ ---> [チュートリアル（１２）](http://qiita.com/digitarhythm/items/79b8c39c491ed66106cb)

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
RustでrustソースファイルのASTを構築するサンプル

## 背景

rustでサンプルプログラム書いてたら、コンパイラのバグを踏んでしまいました。（ちなみにバグはすでに報告されてて、修正待ちの様子）

その関係でrustのコンパイル周りのソースを読んでいて、rustのソースファイルからASTを構築したくなったので、勉強ついでに書いてみました。

## ASTを構築するサンプル
```rust
use std::os;

extern crate syntax;

use syntax::parse;
use syntax::ast;

fn main()
{
    let args = os::args();

    let cfg = Vec::new();
    let path = Path::new(&args[1]);
    let sess = syntax::parse::new_parse_sess();

    // parse_crate_from_file(input: &Path, cfg: CrateConfig, sess: &ParseSess) -> Crate
    let krate = syntax::parse::parse_crate_from_file(&path, cfg, &sess);
    print!("{:?}", krate.module); // crate のmodule を debug dump
}
```

cfg は用途がわからなかったので、とりあえず空にした。

コンパイルして、 ``./parse 任意のrustソースファイル`` とすると、そのソースをパースしてASTを構築し、デバッグダンプする。
結構な出力が一行に出力されるので、簡単なlintツールをお気に入りの言語で書いてください。

## rustc でASTをダンプする方法

ASTをダンプしたいだけなら、下記でjson形式でダンプできます。

``rustc -Z ast-json <source>``
または
``rustc -Z ast-json-noexpand <source>``

＃上記２つの違いはちょっと調べ中。

その他のデバッグオプションを確認するには、``rustc -Z help``とすれば一覧が表示できます。
How to convert an array to regular method arguments

Few examples

![Screen Shot 2015-01-26 at 1.52.11 AM.png](https://qiita-image-store.s3.amazonaws.com/0/41038/6fc4d39b-23b0-e41e-43df-eb72c1689323.png)

![Screen Shot 2015-01-26 at 1.56.02 AM.png](https://qiita-image-store.s3.amazonaws.com/0/41038/544aa3ed-5d4a-4f80-f255-32e8d195ddb1.png)
root取ったandroidのotaを止める方法

GoogleサービスフレームワークのSystemUpdateServiceを止めればrootとらなくてもotaメッセージが消えるという話もありますが、手元のnexus4-4.4.4 では 5.0.1のotaメッセージが消えませんでした。
そこで、一番確実っぽいbuild.propの書き換えを行いました

- su して mount して現在のマウントオプション確認
- /systemをrwでremount
- build.propのro.build .fingerprintを適当に変更 オリジナルはコメントアウトで残しとくのがよいかも
- adbにエディタは無いので adb pull して編集して adb push
- adb pull したbuild.propはバックアップとしてどこかに保存しておくのが吉
- パーミッションは644
1行もコード書かずにAndroidとArduinoでADKを試す

USBホストシールドがAmazonから届いたので，AndroidとArduinoを繋いでADK(Accessory Development Kit)を試してみました．

最近のAndroid端末はUSB Hostを持っていてADK無しでもArduinoとシリアル通信できたりするので，あまり必要ないかも．ただ，Androidに電源を供給しつつ使えるので長時間動かせる利点はあります．(あとから気づきましたが，ドックやqiで電源供給できる端末ならUSBふさがってても大丈夫ですね．．．)

# Arduino

[USBホストシールド 2.0 for Arduino](http://www.amazon.co.jp/dp/B007YNG6RW) (Amazon)

ホストシールドは，2世代目の2.0のものを使います．

[Arduino Leonardo](http://www.amazon.co.jp/dp/B008V5PZC4) (Amazon)

Unoや他のArduinoでも良いと思います．

あと，Android端末とHost Shiel間用のものと，ArduinoとPCの接続用にマイクロUSBケーブルが二本必要です．

# 開発環境・ライブラリ

http://www.arduino.cc/

普段はArduinoの開発環境は使わずavr-gccでやってるのですが，慣れるためにIDE使います．IDEのバージョンは1.0.6をインストール．

https://github.com/felis/USB_Host_Shield_2.0

git cloneするなり，zipをダウンロードするなりして，説明通りにArduinoのlibrariesディレクトリにUSB_Host_Shield_2.0という名前で配置．

# アプリ

サンプルコードは色々公開されているので，参考にしつつ．

サンプルコードを探していると「android.hardware.usb」パッケージを使ったものと，「com.android.future.usb」パッケージを使ったものが存在しますが， com.android.future.usb の方は Android 2.3 でのAPIなので，今から使うなら android.hardware.usb の方を使うのが良いです．

とりあえず，ここではADKのデモアプリがPlayストアにあるのでAndroid端末にインストールします．

https://play.google.com/store/apps/details?id=com.diyphonegadgets.DemoKit

# 動かしてみる

ArduinoにUSB Host Shieldシールドをつなぎます．

IDEで「ツール」→「マイコンボード」でArduino Leonardoを選択．USB_Host_Shield_2.0のサンプルに， adk/demokit_20/demokit_20.ino があるので，とりあえずこれを書き込みます．


書き込んだあと，Android端末にUSBケーブルで接続すると，アプリからUSBアクセサリに接続を確認するダイアログが出るので「OK」を押すと，DemoKitのアプリが立ち上がるはずです．

demokit_20.ino のサンプルは，DemoKitのアプリから送られてくるデータのうちLED1のREDの値をpin3に出力しているようなので，適当なLEDをつなげば，アプリ上でバーを動かすとLEDの明るさが変わると思います．

LEDを繋ぐのすら面倒だという場合は，

``` c
#define  LED1_RED       13
```

として，Arduino Leonardoの基板上に載っているLEDにするのが良いです．(1行書いてしまった…)


# 他

Android と Arduino，構成文字が似ていて何度も書いていると？？？ってなります．
EmacsLispの再帰の上限回数を増やす

# 概要
EmacsLispの再帰がしょぼいという話を何度か耳にしたので、
何度くらい再帰できるのか、上限を増やせないのか確認してみた。

# 再帰関数の実装

再帰の回数を調べるためのコードを定義した。  
一回実行する度にバッファに数字を挿入するので終了後の数字を見て回数を確認する。  

```el
(defun recursive (num)
  "数字をバッファに挿入して数字を増やして再帰呼び出しする"
  (insert (format "\n%d" num))
  (recursive (+ 1 num)))
(recursive 0)
```
# 再帰回数の実験

実行すると、580回ほどrecursiveが実行された。  


# 再帰上限をあげる設定

このあたりの変数で上限設定をしているそうなので値を大きくしてみる。  

```el
(setq max-specpdl-size 10000) ;; デフォルト 1300
(setq max-lisp-eval-depth 10000) ;; デフォルト 600
```

# 再帰上限の実験

複数マシンで試したところ20000前後まで再帰できた。
20000異常は、あまり上限を大きくしすぎてもエラーで停止せずにEmacsが落ちてしまうだけであった。  

# 設定した変数の説明
それぞれの変数の説明は以下。  

## max-specpdl-size

>Variable: max-specpdl-size
>この変数は、ローカル変数束縛とunwind-protectのクリーンアップの総数の 上限を定義します(see section 非局所脱出)。
>これらは、エラーが通知されるまで (データ"Variable binding depth exceeds max-specpdl-size"による)行なわれます。
>この制限を超えると、それに対応するエラーが発生します。これは、適切に定義され ていない関数への無限再帰を防ぐためのものです。
>デフォルトの値は 600 です。
[GNU Emacs Lispリファレンス・マニュアル: 10. 変数](http://www.fan.gr.jp/~ring/doc/elisp_19/elisp-jp_12.html)

## max-lisp-eval-depth
> max-lisp-eval-depth
> この変数は、 （エラーメッセージ"Lisp nesting exceeds max-lisp-eval-depth"で） エラーを通知までのeval、apply、funcallの呼び出しの 最大の深さを制限する。 この制限、および、これを超えたときのエラーは、 不正に定義された関数によってLispが無限に再帰することを防止する 1つの方法である。
> 深さ制限は、Lispコードによる明示的な呼び出しに加えて、 Lisp式で書かれた関数の呼び出しや関数呼び出しの引数や関数本体のフォームの 再帰的な評価などの内部的なeval、apply、funcallの 呼び出しも数える。
>この変数のデフォルト値は300。 これに100未満の値を設定すると、指定した値に達するとLispは100に設定し直す。 Lispデバッガに入ったとき、 制限に近い場合にはデバッガ自身が実行できることを保証するために値を増やす。
[GNU Emacs Lispリファレンスマニュアル: Eval](http://www.geocities.co.jp/SiliconValley-Bay/9285/ELISP-JA/elisp_120.html)
How to make sublime divided into Column and Row Workspace Panes

It is very productive if we found some tricks to use while working on codes on text editors. This one is a simple one for a sublime text editor user to be able to see side by side panes. By this, you don’t need to switch back and forth between HTML files and CSS document.

(Vertical view)
![Screen Shot 2015-01-26 at 1.15.06 AM.png](https://qiita-image-store.s3.amazonaws.com/0/41038/3d9e8f1f-9e4e-1e3c-629d-a41c9fbedf6b.png)

To view vertically, use the shortcut 


    OPTION-⌘-2 


(for Mac users) 

and 

    ALT-UP-2 

(for Windows users).

Replace 2 with any number of view panes that you needed but if you use 5 it will give you a 4 pane grid output.

(4 pane grid)
![Screen Shot 2015-01-26 at 1.19.03 AM.png](https://qiita-image-store.s3.amazonaws.com/0/41038/5908c34e-172e-1241-179f-f7270d731dae.png)


(Horizontal view)
![Screen Shot 2015-01-26 at 1.17.20 AM.png](https://qiita-image-store.s3.amazonaws.com/0/41038/2765940b-1222-e363-eb1e-38b192d55411.png)

To view horizontally, use the shortcut 

    SHIFT-OPTION-⌘-2 

(for Mac users) 

and 

    SHIFT-ALT-UP-2 

(for Windows users).
iOSデバイスをiBeacon発信機にする.

# 道具作りから

ちょっとしたiBeaconアプリを作りたかったんですが、開発用に使ってたLightBlue Beanのコイン電池が切れてたので、とりあえず自宅にはiPhone6もiPad Airもあるので一台をiBeacon発信機にして開発を進めることにしました。

AppStoreにはこれというものがなかったので、ネットで探すと実装の参考となるサイトも見つかったのですが、検索キーワードの問題なのか探すのは大変でした。
iBeacon自体がそんなに話題になってないのかな・・・とか思ったり。
単純なものでよかったので、自分で実装してみることにしました。

# 実装

## サンプルコード

iBeaconアプリもそうなんですが、うまくフレームワーク化されているので非常にシンプルに利用することができます。（これで面白いアプリを作るのは簡単ではないかも）

### CBPeripheralManagerとCBPeripheralManagerDelegate

iBeaconの発信にはCBPeripheralManagerとCBPeripheralManagerDelegateを実装する必要があります。

```

self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self
                                                                 queue:dispatch_get_main_queue()];

```

これはviewDidLoadにでも置いておけばよいです。

```

#pragma mark - delegate
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral
{
  
}

```
このメソッドをオーバーライドしないとWarningが出ますが、中身は空でよいです。

### ビーコンの発信

次のようなコードで発信できます。

```
 
  NSUUID* uuid = [[NSUUID alloc] initWithUUIDString:UUID];
  CLBeaconRegion* region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid
                                                                   major:[self.majorText.text intValue]
                                                                   minor:[self.minorText.text intValue]
                                                              identifier:[uuid UUIDString]];
  
  NSDictionary* peripheralData = [region peripheralDataWithMeasuredPower:nil];//Default
  [self.peripheralManager startAdvertising:peripheralData];

```

UUIDは128bitのユニークなキーを与える必要がありますが、コンソールからuuidgenを使って生成したキー文字列を利用するのがよいと思います。

## github

下記にサンプルプロジェクトを起きました。
参考にしてください。
https://github.com/g-1/iBeaconDevice

## 確認方法
ちゃんとビーコンを発信できているかどうかという確認ですが、私は[LightBlue](https://itunes.apple.com/jp/app/lightblue-bluetooth-low-energy/id557428110?mt=8&uo=4&at=10lKgJ)
というアプリを使ってます。
お手軽に確認ができるのでオススメです。

![IMG_3596.PNG](https://qiita-image-store.s3.amazonaws.com/0/17287/b7103b76-8252-9c4c-04a4-c58794ae3900.png)

# 謝辞
下記のサイトを参考にさせていただきました。
http://www.gaprot.jp/pickup/ios7/vol2/

ただ、iOS7のときの記事なので、iOS8になっていろいろ変わっているかもしれません。
設定の位置情報のくだりは、確認できませんでした。
iBeaconはiOS8になっていろいろ変わっているので他にも違っている箇所があると思われます。
並列性に注意しつつ os.Mkdir() する

# はじめに

この記事は私の頭の中の整理を目的として書かれています。
記事中で紹介する書き方について、私自身絶対の自信があるわけではないので、問題のある場合はご指摘いただけると幸いです。

---

# ディレクトリが存在しないときだけ作る

Go でディレクトリを作るときは `os.Mkdir()` 関数を使います。

プログラム中でディレクトリを作る必要があり、かつそのディレクトリは既に存在するかもしれないから、まだ作成されていないときだけ作成するようにする必要があるとします。
これをそのままプログラムに表現すると、だいたい以下のようになるでしょうか。

```go
stat, err := os.Stat(dir)
if err != nil {
	// ディレクトリの存在をチェック
	if os.IsNotExist(err) {
		// 存在しないので作る
		err = os.Mkdir(dir, 0755)
		if err != nil {
			// ディレクトリの作成に失敗
			panic(err)
		}
	}
}
```

これでもほとんどの場合は問題にならないでしょう。
「ほとんどの場合」というのは、例えば自分だけが手元で動かすちょっとしたコマンドラインツールなど、複数のプロセスが同時に起動することがまず無いような場合です。

ですが、プログラムが並列に実行されると問題になるでしょう。
例えば以下のような状況です。

1. プロセス A でディレクトリ DIR の存在チェックをし、「存在しない」という結果を得る
2. プロセス B でディレクトリ DIR の存在チェックをし、「存在しない」という結果を得る
3. プロセス A で DIR は「存在しない」ので作成しようとする (成功する)
4. プロセス B で DIR は「存在しない」ことになっているので作成しようとする (実際はプロセス A が既に作っているのでエラーになる)

ここで「プロセス」と言っているのは UNIX プロセスかもしれませんし、Goroutine からもしれません。
上記の例でいうと、存在しないはずのディレクトリを作成しようとしてエラーになったので `panic()` されてしまいます。

# 並列性に気をつけて書き直す

以下のようにすれば、この問題を避けることができます。

```go
// いきなりディレクトリの作成を試みる
err := os.Mkdir(dir, 0755)
if err != nil {
	if !os.IsExist(err) {
		// 「ディレクトリが既に存在する」以外のエラー
		panic(err)
	}
}
```

とりあえずエラーを気にせずやってみて、エラーが起こったときはそのエラーが想定通りのものであるかをチェックします。
上記の実装でいうと、それ以外の場合は回復を諦めて `panic()` しています。

これならほぼ同時に複数のプロセスが同一のディレクトリを作成しようとしても、後者はディレクトリの作成に失敗し、エラー内容のチェックをした結果「想定通りのエラーしか起きていないから問題ない」として、何事もなくプログラムの実行を継続できます。

# os.MkdirAll() の場合

`os.Mkdir()` は一度に一階層のディレクトリしか作ることしかできません。
つまり、`foo/bar` というディレクトリを作るとき、`foo` がなければその時点でエラーになります。
`foo` を作ってその次に `foo/bar` を作る、ということをする必要があります。

`os.MkdirAll()` であれば、存在しない階層をすべて作ってくれるので、こちらを使ったほうが楽にできる場合がほとんどでしょう。

ただし `os.MkdirAll()` は、対象のディレクトリが既に存在してもエラーを返しません。
なので以下のようにすればよいでしょう。

```go
err := os.MkdirAll(dir)
if err != nil {
	panic(err)
}
```

`os.Mkdir()` のときのように `os.IsExist()` を使ってエラー状況をチェックする必要はないでしょう。

問題は `os.MkdirAll()` が並列実行しても問題無い実装になっているかですが、そこは後日あらためてソースコードを読み込んで記事にできればと思ってます。
AngularJSの開発に使えるブラウザ拡張「ng-inspector」

AngularJSの開発に使えるChrome拡張と言えば「AngularJS Batarang」がスタンダードです。

[AngularJS Batarang](https://chrome.google.com/webstore/detail/angularjs-batarang/ighdmehidhipcmcojjgiloacoafjmpfk)

が、私の環境では最近のVersionからきちんと動かなくなってしまいました。
Angularを使っているページで、こういうコードがあったとき

```js
var _scope = angular.element(hoge).scope();
	  _scope.$apply(function(){
}

```

consoleでは`Uncaught TypeError: Cannot read property '$apply' of undefined `となってしまいAngularJSが使えません。

このようなissueも結構上がっています。
https://github.com/angular/angularjs-batarang/issues/207


代わりはないものかと探していたら「ng-inspector」というようなものを見つけました。

[ng-inspector](http://ng-inspector.org/)

特徴的なのはChromeだけでなくSafari Extentionも提供されていることです。(Firefox版も開発中)


使い方は簡単で、導入したらAngularJSを使ってるページでツールバーのボタンを押すだけ。

適当なサンプル・アプリケーションで試すとこんな感じ。
http://todomvc.com/examples/angularjs/#/


![ss.png](https://qiita-image-store.s3.amazonaws.com/0/2341/018e0452-55c8-fd31-0292-433f338fd9ec.png)

scope内のfunction,modelの中身などが一覧表示されます。

入力されたものはリアルタイムで反映されます
![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/2341/53811ac0-f761-b896-94d5-ef3b4d85f6f2.png)

マウスオーバーするとDOM要素のハイライトもしてくれます。

![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/2341/c4987339-4b4c-fe60-509d-6c0eb4e8c5a7.png)


functionの実行&展開も出来ます。
![ss4.png](https://qiita-image-store.s3.amazonaws.com/0/2341/4d6161bd-29f1-75f6-a6f1-46e47b2bd5e6.png)



個人的にはこれで十分ですが、AngularJS Batarangとの違いは結構あります。

https://github.com/rev087/ng-inspector/issues/18

Batarangにあってng-inspectorにない機能として
- Dependency graph
- Expression performance profiling

の2つが上げられていて、特にパフォーマンスプロファイリングが出来ないのは痛いなぁと思います。
[AngularJSのパフォーマンス改善入門](http://qiita.com/zoetro/items/5156aef51222e81dd022)

逆にng-inspectorにあり、Batarangにないものとしては

- List the controllers and directives that triggered the creation of each scope
- Cross-browser support (Chrome and Safari currently, Firefox coming soon)
- Look good ;)

が挙げられており、複数ブラウザでの対応、Batarangよりもいい見た目（個人差)、scopeごとのControllerとディレクティブを一覧で見られるというものです。



個人的にはどちらも使えると便利でいいのですが、Batarangが使えなくて開発に不便があるなぁという人は入れてみるとよいのではないでしょうか？
HTMLカラーコードの16進数10進数変換

# はじめに

HTMLカラーコードの16進数を10進数へ、10進数を16進数へ変換するコードをSwiftで書きます。
今回は、#8a2be2（BlueViolet）を変換していきます。

# 16進数から10進数

文字列を詳細に解析できるNSScannerクラスを使います。
このクラスは、内部で解析開始位置の情報を持っていて、それを動かしながら文字列を解析していきます。
特定の文字やキャラクタセットを取り出したり、数値解析に関するメソッドを持っています。

```swift:
let code = "8a2be2"
let scanner = NSScanner(string: code as NSString)
var color:UInt32 = 0
if(scanner.scanHexInt(&color)) {
	let r = (color & 0xFF0000) >> 16
	let g = (color & 0x00FF00) >> 8
	let b = (color & 0x0000FF)
}
```

実行結果は`(r, g, b) = (138, 43, 226)`となります。


# 10進数から16進数

先ほどの実行結果の`(r, g, b) = (138, 43, 226)`を`8a2be2`にするためにNSStringのformatを利用します。
%02xとすることで最小フィールド幅未満のとき0で埋めます。

```swift:
NSString(format: "%02x%02x%02x", r, g, b)
```

実行結果は`8a2be2`となり、もとのHTMLカラーコードと一致します。


# 最後に

色を管理するUIColorクラスで利用する場合は、(r, g, b)をそれぞれ255.0で割ります。

```swift:
UIColor(red: CGFloat(r)/255.0, green: CGFloat(g)/255.0, blue: CGFloat(b)/255.0, alpha: 1.0)
```

UIColorクラスは16進数からUIColorを作成できないため、UIColorクラスを拡張するカテゴリを作成すると便利かもしれません。
VirtualBox 4.3.20にlubuntuをインストールする

高位合成でいろいろ試してみたい､かつ軽いLinux環境を使ってみたいということで､VirtualBoxとlbuntuで環境整備(VMware Playerだとどうしても共有がうまくいかなかったので)


1, VirutualBoxのインストール
http://www.forest.impress.co.jp/library/software/virtualbox/

2, lubuntuのダウンロード
https://help.ubuntu.com/community/Lubuntu/GetLubuntu
からlubuntu-14.10-desktop-i386.isoをダウンロード

3,VirtualBoxを起動してlubuntuのインストール
はまったこととして
･MacTypeを使っていると｢起動｣ボタンを押しても起動しない
　　ここを参照 http://qiita.com/yusuke-k/items/e1cedaa421be4de25e33
･設定画面において､
｢I/O APICを有効化｣､｢EFIを有効化｣のチェックを入れない

4,apt-getを使って各種インストール
インストールするものは
･build-essential
･linux-generic
･dkms
･virtualbox-guest-dkms

上記4つのインストールが終わった段階で再起動

5,共有フォルダの設定
適当にググってください｡
D言語の値型と参照型と関数の引数と返値の整理

D言語の値型と参照型の違いが自分で把握できていなかったのでまとめてみた。
まとめて得られた知見として値型と参照型についてコーディングの際に気を付けるべき指針もまとめてみた。

配列については記述していない。また、ポインタについても記述していない。

値型と参照型という点以外のクラスと構造体の違いはドキュメントの[Structs, Unions](http://dlang.org/struct.html)によくまとまっている。
(C++ではstructとclassはアクセス指定のデフォルト以外は同機能であるが、DではstructはCのシンプルさを残したままオブジェクト指向的な構造データをclassのみに実現させた）

# D言語の型の原則

* 基本データ型は値型である
* 構造体は値型である
* クラスは参照型である
* 値型を参照型として変数を宣言する方法はない
* 参照型を値型として変数を宣言する方法はない

# 値型と参照型

値型はその変数への代入は値の代入である。

```d
// 基本データ型は値型である
int i = 0;
int j = i;
j = 47;
writeln(i, ", ", j); // -> 0, 47
```

```d
// 以下、構造体の説明においてこの構造体を使用する
struct MyStruct
{
  int intValue = 0;
}

// 構造体は値型である
MyStruct ms1; // ms1.intValue = 0
MyStruct ms2 = ms1;
ms2.intValue = 47;
writeln(ms1.intValue, ", ", ms2.intValue); // -> 0, 47
```

参照型はその変数への代入は参照の代入である。

```d
// 以下、クラスの説明においてこのクラスを使用する
class MyClass
{
  int intValue = 0;
}

// クラスは参照型である
MyClass mc1 = new MyClass;
MyClass mc2 = mc1;
mc1.intValue = 47;

writeln(mc1.intValue, ", ", mc2.intValue); // -> 47, 47
```

# 関数の引数の原則

* 関数の引数は原則としてコピーが渡される(記憶クラスrefが指定されている場合を除く)
  * (補足)値型の引数は値のコピーが渡される
  * (補足)参照型の引数は参照のコピーが渡される

```d
void funcInt(int a)
{
  a = 47;
}

int i = 0;
funcInt(i);
writeln(i); // -> 0
// 値のコピーを操作されても呼び出し元は変わらない

void funcStruct(MyStruct a)
{
  a.intValue = 47;
}

MyStruct ms; // ms.intValue = 0
funcStruct(ms);
writeln(ms.intValue); // -> 0
// 値のコピーを操作されても呼び出し元は変わらない

void funcClass(MyClass a)
{
  a.intValue = 47;
}

MyClass mc = new MyClass; // mc.intValue = 0
funcClass(mc);
writeln(mc.intValue); // -> 47
// 参照のコピーを操作されたので呼び出し元が変わる
```

参照型の引数でもコピー渡しであるため、引数自体に代入を行っても呼び出し元の参照型の変数は書き換えられない。

```d
void funcClass2(MyClass mc)
{
  mc = new MyClass;
  mc.intValue = 47;
}

MyClass mc = new MyClass; // mc.intValue = 0
funcClass2(mc);
writeln(mc.intValue); // -> 0
```

# 関数の返値の原則

* 関数の返値は原則としてコピーが返る(ref関数を除く)
  * 値型の返値は値のコピーが返る
  * 参照型の返値は参照のコピーが返る
* 関数の返値は右辺値である(ref関数を除く)

注意すべきは返値はコピーかつ右辺値であるが、参照型(クラス)の返値は参照型であるため代入は不可能であるが、操作が可能であるということである。

```d
// クラスを返すときは参照のコピー(これも参照)を返す
MyClass funcClass(MyClass mc)
{
  return mc;
}

MyClass mc1 = new MyClass;
funcClass(mc1).intValue = 47;
writeln(mc1.intValue); // -> 47
```

# 引数のref記憶クラスおよびref関数

## ref記憶クラス

関数の引数をref記憶クラスに指定すると参照渡しができる。

```d
void funcInt2(ref int i)
{
  i = 47;
}

int i = 0;
funcInt2(i);
writeln(i); // -> 47
```

参照型(クラス)の参照先を操作することもできる(あまりないケースだが)。

## ref関数

関数の宣言にrefを付けると返値を参照で返すことができる。クラスや構造体のメンバを返すシチュエーションなので有用。

```d 
ref refFuncInt(ref int i)
{
  // intの参照を受け取りそのまま返す関数
  return i;
}

int i = 0;
refFuncInt(i) = 47; // iの参照を操作している
writeln(i); // -> 47
```

# まとめ、D言語での型の運用の指針

まとめ

* 基本データ型と構造体は値型、クラスは参照型
* 値型の変数への代入は値の代入
* 参照型の変数への代入は参照の代入
* 関数の引数は原則コピー渡し
* 関数の返値は原則コピー返し
* 引数にref記憶クラスを指定すると参照渡しができる
* ref関数を作ると参照返しができる

指針

* 変数への代入操作を記述するときはそれが値型か参照型か意識できるようになるべきである
* 関数の引数はそれが値型か参照型かを意識できるようになるべきである
* 参照型の関数の引数は呼び出し元を操作可能である。そのため必ず適切なin, outなどを指定するようにすべきである
* 参照型の関数の返値も参照型であるため操作可能である。そのため必ず適切なconstnessを指定するべきである
SlackからHubot経由でサーバにコマンドを送る

Slackからサーバにコマンドを発行したい
nodejsモジュールのssh2を使って実現した
鍵はaesで暗号化したものを保持し環境変数に復号化用のパスワードを持たせる様にした
全てのコマンドを通過させるのは危険なので絞る
全員がコマンド発行できるのも危険なのでアカウントを絞る

### sshの鍵を暗号化する
```bash
cat ~/.ssh/key.pem | openssl enc -aes-256-cbc -nosalt -a -k password > key.enc
```

### herokuの環境変数にpasswordを設定する
```bash
heroku config:set DECIPHER_PASSWORD=password
```

### モジュールssh2/cryptoをインストール
```bash
npm install ssh2 --save
npm install crypto --save
```

### script
* コマンドは`hubot ssh [uptime|df]`とした

```coffeescript
# -*- mode:coffee; coding:utf-8 -*-
# Description:
#   SSH commands
#

cipher = '''
上で暗号化したkey.encの内容を貼り付ける
'''

Connection = require('ssh2')
crypto = require('crypto')
aes = crypto.createDecipher('aes-256-cbc', new Buffer(process.env['DECIPHER_PASSWORD']))
privateKey = aes.update(data, 'base64', 'utf8')
privateKey += aes.final('utf8')

module.exports = (robot) ->
  # uptimeとdfだけ許可する
  robot.respond /\s+ssh\s+(uptime|df)\s*/i, (msg) ->
    # user1とuser2だけ許可する
    return if not /^(user1|user2)$/i.test(msg.message.user.name)
    cmd = msg.match[1]

    result = ""
    conn = new Connection()
    conn.on 'ready', () ->
      console.log 'Connection :: ready'
      conn.exec cmd, (err, stream) ->
        if err
          console.log err
          msg.send err
          conn.end()
          return
        stream.on 'exit', (code, signal) ->
          console.log 'Stream :: exit :: code: ' + code + ', signal: ' + signal
        .on 'close', () ->
          console.log 'Stream :: close'
          conn.end()
          msg.send ">>> #{result.toString()}"
        .on 'data', (data) ->
          console.log 'STDOUT: ' + data
          result = data
        .stderr.on 'data', (data) ->
          console.log 'STDERR: ' + data
          result = data
    .connect({
      host: 'x.x.x.x',
      port: 22,
      username: 'username',
      privateKey: privateKey
    })
```
boost::spirit のセマンティックアクションに C++ lambda を使う

# 事の始まり
休日の暇つぶしに ```boost::spirit``` のサンプルソースを見ていてセマンティックアクションに
関数ポインタや ```boost::bind```、関数オブジェクトを用いた方法が紹介されていたが、C++11 
以降の lambda で代用できるのではという点から。

# 試行
## [Parser Semantic Actions](http://www.boost.org/doc/libs/1_57_0/libs/spirit/doc/html/spirit/qi/tutorials/semantic_actions.html)

```c++
#include<boost/spirit/include/qi.hpp>
#include<string>
#include<iostream>

namespace qi = boost::spirit::qi;

int main(){
  using qi::int_;
  using qi::parse;
  {
    std::string str("{46}");
    auto w = [](int x){std::cout << x << std::endl;};
    parse(
      first,
      last,
      '{' >> int_[w] >> '}'
    );
  }
  return 0;	
}
```

### コンパイルしてみる
環境は gcc 4.9.2 @ msys2 にて。

```shell-session
$ g++ -std=c++11 -o action action.cpp
action.cpp:59:32: error: two consecutive '[' shall only introduce an attribute before '[' token
  parse(first, last, '{' >> int_[ [](int x){std::cout << x << std::endl; } ] >> '}');
```

いきなり、怒られました。```'[['``` がいけないのかと思ってスペース挟んだり
もしましたが、駄目な模様。とりあえず下記のように対策

```cpp
auto w = [](int x){std::cout << x << std::endl;};
parse(
  first,
  last,
  '{' >> int_[w] >> '}'
);
```

```shell-session
$ g++ -std=c++11 -o action action.cpp
$ ./action
46
```

どうやら無事動いているようです。ちなみにこのコード、Visual Studio 2013 
では正常にコンパイル、実行が出来ました。

## [Complex](http://www.boost.org/doc/libs/1_57_0/libs/spirit/doc/html/spirit/qi/tutorials/complex___our_first_complex_parser.html)

上記のエラーを鑑みて以下のようにコーディング。

```cpp
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
using qi::double_;
using qi::phrase_parse;
using ascii::space;

double rN = 0.0;
double iN = 0.0;
auto cap_real = [&](double x){rN = x; };
auto cap_img = [&](double x){iN = x; };
bool r = phrase_parse(first, last,
           (
             '(' 
             >> double_[cap_real]
             >> -( ',' >> double_[cap_img]) 
             >> ')'
             | double_[cap_real]
           ),
           space);
```

こちらは問題無くコンパイル及び実行が出来ました。参照キャプチャ
なども問題無く使えるようです。こちらのケースですが、```cap_real```
のように一度変数に格納してからセマンティックアクションに用いた場合
は問題なかったのですが、```double_[[&](double r){...}]``` のように
した場合、Visual Studio 2013 でもコンパイルエラーが出てしまいました。
```template``` の ```>>``` みたいな状況になっているのでしょうかね…

# まとめ
boost::spirit のセマンティックアクションに c++11 の lambda を使った
ケースを試行してみた。結果、問題無く使えることが判明。
特に Complex では、lambda を用いることで ```boost::pheonix::ref``` や
```boost::spirit::qi::_1``` のようなプレースホルダを用いる必要が無くなる
ので ```using namespace``` のし忘れなどが減る予感。

# Appendix
今回試したソースコードを Gist に置いておきます。
[boost_spirit_cpp_lambda.cpp](https://gist.github.com/trairia/5d6ff4c62542b91a9e59)
[備忘録] Fluentd, Elasticsearch, Kibana の各種インストール手順

[備忘録] Fluentd, Elasticsearch, Kibana の各種インストール手順


# 環境

* Vagrant を使用した Ubuntu 14.04
* 下記、 Vagrantfile で立ち上げ

```:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "chef/ubuntu-14.04"
  config.vm.network "private_network", ip: "192.168.33.10"
end
```

# 各種インストール
## Apache のインストール

```bash
$ sudo apt-get install apache2 -y
$ sudo chown vagrant:vagrant -R /var/www
$ apache2 -v
Server version: Apache/2.4.7 (Ubuntu)
Server built:   Jul 22 2014 14:36:38
```

## Apache の確認

* ブラウザから http://192.168.33.10/ にアクセスし、 Default Page が見えれば OK

![スクリーンショット 2015-01-24 21.55.14.png](https://qiita-image-store.s3.amazonaws.com/0/28573/beddacf4-254a-5495-1dcd-a8910097fa8b.png)


## Fluentd のインストール

```bash
$ sudo apt-get update
$ sudo apt-get install curl -y
$ wget http://packages.treasure-data.com/debian/RPM-GPG-KEY-td-agent
$ sudo apt-key add RPM-GPG-KEY-td-agent
$ curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh
$ sudo service td-agent start
$ td-agent --version
td-agent 0.10.58
```

* OS のバージョンごとにリポジトリが異なる
    * http://docs.fluentd.org/ja/articles/install-by-deb

## Elasticsearch のインストール

```bash
$ sudo apt-get install openjdk-7-jre-headless -y
$ wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.2.1.deb
$ sudo dpkg -i elasticsearch-1.2.1.deb
$ sudo service elasticsearch start
```

* 最新のバージョンは下記で確認
    * http://www.elasticsearch.org/download/

## kibana インストール

```bash
$ cd /var/www/html
$ wget https://download.elasticsearch.org/kibana/kibana/kibana-3.0.1.tar.gz
$ tar xvf kibana-3.0.1.tar.gz
$ ln -s kibana-3.0.1 kibana
$ sudo service apache2 restart
```

* 最新バージョンは下記で確認
    * http://www.elasticsearch.org/overview/kibana/installation/

## kibana の確認

* ブラウザから http://192.168.33.10/kibana/ にアクセスし、 Dashboard が見えれば OK

![スクリーンショット 2015-01-24 21.56.57.png](https://qiita-image-store.s3.amazonaws.com/0/28573/2e9d2090-718d-5194-114e-5dbd2e9f9dfe.png)



## Fluentd のプラグインインストール

```bash
$ sudo apt-get install libcurl4-openssl-dev -y
$ sudo apt-get install gcc -y
$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elasticsearch
```

* ひとまず、インストールはここまで。
* 各種、設定の方が大変そう。
[Xamarin.Forms]Shared ProjectでカスタムコントロールのAssemblyが見つからない時の対処法


Xamarin.FormsのPCLプロジェクトからSharedプロジェクトに乗り換えたら少しハマったのでメモ。

## 問題

共有プロジェクトで作ったカスタムコントロールをXAMLで参照する際、`	xmlns:local="clr-namespace:MyApplication;assembly=MyApplication"`のように名前空間を追加すると思います。これをそのまま実行すると...

> System.IO.FileNotFoundException has been thrown
> Could not load file or assembly 'MyApplication' or one of its dependencies. The system cannot find the file specified.

こんな例外が出ます。
これは、PCLプロジェクトと違って共有プロジェクトのAssemblyが作られないことが原因です。

## 対処

プロジェクトのプロパティから、全プラットフォームの出力アセンブリ名を同じにします。
プロジェクト名と同様に付加されている ".iOS" や ".Droid" の部分を削除しましょう。(iOSプロジェクトでは実機、シミュレータの両方の設定があるので忘れないように注意)

![AssemblyName.jpg](https://qiita-image-store.s3.amazonaws.com/0/40121/722133a4-d0a7-1475-e364-b6873c838b87.jpeg "AssemblyName.jpg")

こんな感じ。
php-buildをアップデートして、install -lで出てくるリストを更新するには

php-buildをgit cloneでインストールした場合、単純にそのフォルダへ行ってgit pullすればOK。
phpenvのpluginとしてインストールした場合、標準のパスは

~/.phpenv/plugins/php-build

である。
MODXのリソースツリーをカスタマイズする

MODXの管理画面左側にあるリソースツリー。

![modx01.png](https://qiita-image-store.s3.amazonaws.com/0/63201/cbc49325-b546-1f70-eea0-c4885a454254.png)

ここに表示されるリソースは「公開、非公開、削除」といった状態によって若干色が変わったりしてツリーを見るだけでリソースの状態が分かるようになっています。
この部分もプラグインによって制御する事が可能です。

例えば次のプラグインをMODX管理画面のプラグインで保存すると本文に「追記予定」と書いているリソースについてはリソース名に「(追記予定)」というprefixを付けます。

```php
/**
 * リソースツリーのカスタマイズデモ
 *
 * リソースツリーで「追記予定」リソースの表示を変更させます。
 *
 * @category    plugin
 * @version     1.00
 * @license     http://www.gnu.org/copyleft/gpl.html GNU Public License (GPL)
 * @author      soushi
 * @internal    @events OnManagerNodePrerender
 * @internal    @modx_category demo
 * @internal    @properties 
 */


if( $this->Event->name == 'OnManagerNodePrerender' ){
	$doc = $modx->getDocument($modx->event->data->param['id'],'content');
	if( preg_match('/追記予定/',$doc['content']) ){
		$modx->event->data->param['nodetitleDisplay'] = preg_replace('/(<span class=".*?">)/','${1}(追記予定)',$modx->event->data->param['nodetitleDisplay']);
	}
}
```

以下はMODXデモサイトで実際に「新サービスのおしらせ」リソースの本文に「追記予定」と書いて保存した時の画面です。

![modx02.png](https://qiita-image-store.s3.amazonaws.com/0/63201/8be80e8c-6240-dfa8-57b6-6783851cbd7f.png)

こうしておくと左側のツリーを見るだけで後で追記しようと思ってたリソースを簡単に確認する事が出来るようになります。
追記が終わったリソースは本文から「追記予定」の文字を消すことでツリーに表示された「追記予定」の文字も削除されます。

上記は簡単な使用例ですが、他にも色々な用途に使えると思います。
io.jsについて

# まず・・・
　最近リリースされたio.jsについて
恥ずかしながらnode.jsを書いているのにio.jsについて知らなかったので調べてみました。

# io.jsって
io.js(アイ・オー・ジェイえす)はnode.jsのv0.12をForkしたものです。
> https://iojs.org/

# 結局のところnode.jsとio.jsの違いは
大きな違いは*プロジェクトの進め方*

io.jsは
・週単位でのリリース
・オープンガバナンスモデル

# node.jsとio.jsの互換性は？
node.jsからio.jsへの互換性は保つと明言されていますが、
io.jsからnode.jsへの互換性は保証されていません。

# 最後に
2015/2/10に開催される東京Node学園 15時限目でio.jsについてお話されるみたいです。
> http://nodejs.connpass.com/event/11436/
CentOS7 への Tomcat8 のインストール

Tomcat の勉強をするために CentOS7 に Tomcat をインストールしたので、その手順を残しておく。

# 前提条件

* CentOS-7.0-1406-x86_64-Minimal.iso を仮想マシンにインストール済みとする。
* 基本的なコマンド wget や vim などは yum でインストール済みとする。
* とりあえず動く環境のため、作業はすべて root ユーザーで行う。
* SELinux は無効化済みとする。

# JDK のインストール

Oracle から JDK をダウンロードする。
今回は「server-jre-8u31-linux-x64.tar.gz」をダウンロードする。
ダウンロードしたファイルを WinSCP などで /root にアップロードする（または wget で直接入手する）。

ssh でログインしてアップロードしたファイルを解凍する。

```
cd /root/
tar xvzf ./server-jre-8u31-linux-x64.tar.gz
```

解凍したディレクトリを /opt/java/ に移動する。

```
mkdir /opt/java/
mv ./jdk1.8.0_31/ /opt/java/
```

## 環境変数の設定

Tomcat をインストールするには環境変数 JAVA_HOME を設定する必要がある。

```
export JAVA_HOME=/opt/java/jdk1.8.0_31/
```

これだとログアウトするたびに設定が必要になるので、毎回それが面倒であれば ~/.bash_profile に上記のコマンドを追加すると良いかもしれない。追加後はログインし直す。

# Tomcat のインストール

今回は「apache-tomcat-8.0.17.tar.gz」をインストールする。
ダウンロードしたファイルを WinSCP などで /root にアップロードする。

ssh でログインしてアップロードしたファイルを解凍する。

```
cd /root/
tar xvzf ./apache-tomcat-8.0.17.tar.gz
```

解凍したディレクトリを /opt/tomcat/ に移動する。

```
mkdir /opt/tomcat/
mv ./apache-tomcat-8.0.17 /opt/tomcat/
```

Tomcat を起動する。

```
cd /opt/tomcat/apache-tomcat-8.0.17/bin/
sh ./startup.sh
```

## Firewalld の設定

Tomcat を起動できても、仮想マシン外部から tcp 8080 ポートにはアクセスできない。このため、tcp 8080 ポートを開ける必要がある。

以下のディレクトリに tomcat.xml を作成する。

```
vim /etc/firewalld/services/tomcat.xml
```

tomcat.xml の中身は以下のような感じ。

```lang:xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Tomcat (HTTP)</short>
  <description>Tomcat HTTP Server.</description>
  <port protocol="tcp" port="8080"/>
</service>
```

このファイルを firewalld に読み込ませてサービスを再起動すれば良い。

```
firewall-cmd --permanent --add-service=tomcat
systemctl restart firewalld.service
```

以下のコマンドを実行し、その結果の services に tomcat が追加されてればＯＫ。

```
firewall-cmd --list-all
```

# 今後について

Tomcat を自動起動する設定を記載したい。
perl: warning: Setting locale failed.

MacからsshでCentOSに接続してPerlを実行すると以下のエラーが出た。

```text
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LANG = "ja_JP.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
```

これはMacの/etc/ssh_configの設定で環境変数を受け継いでいるかららしい。
以下の行をコメントアウトするとよし。

```text
 Host *
   SendEnv LANG LC_*
```

## 参考URL

http://d.hatena.ne.jp/tkrd/20120828/1346123699
bashでストリームデータ処理

パイプ、名前付きパイプ、Process Substitutionなどを使うとbashでそれなりに複雑なストリームデータ処理を組むことができます。

# 基本

```bash
$ cmd1 | cmd2 | cmd3
```

パイプでつなげば前段のコマンドの標準出力と後段のコマンドの標準入力が接続されます。

```bash
$ cmd < input > output
```

`<`でファイルや名前付きパイプ(named pipe, fifo)から標準入力へデータを流すことでき、`>`で標準出力をファイルや名前付きパイプへ流すことができます。

# 分配

一つのデータストリームを複数のプロセスに分配するパターンです。「放送(ブロードキャスト)」と言ってもいいかもしれません。

基本的には`tee`コマンドで実現できます。

## 名前付きパイプを使う場合

```bash
$ mkfifo p
$ tee p < input | cmd1 & cmd2 < p
```

`tee`によって`input`ストリームを名前付きパイプ`p`及び標準出力へ出力します。`cmd1`は`tee`の標準出力から、`cmd2`は名前付きパイプ`p`からストリームを読み込みます。

## Process Substitutionを使う場合

bashの機能であるProcess Substitutionを使うと名前付きパイプを使わずに上記と同様のことを実現できます。

```bash
$ tee >(cmd2) < input | cmd1
```

`>()`の部分がProcess Substitutionです。

bashはこれを見ると、一時的な名前付きパイプを生成し、そのパイプを標準入力として中の`cmd2`を実行し、`>()`の部分自体はその名前付きパイプのパスに置き換わります。(ただし、環境によってはパイプじゃなくてファイルだったり、それへのシンボリックリンクだったりするかもしれません。詳細はmanpageを参照)

もちろん、複数のプロセスへ分配することも可能です。

```bash
$ tee >(cmd1) >(cmd2) >(cmd3) | cmd4
```

## 参考

- http://unix.stackexchange.com/questions/72371/how-to-duplicate-a-stream-and-process-both-parts-in-a-streaming-way

# 集約

複数のデータストリームを束ねて一つのプロセスで処理するパターンです。分配に比べるといろいろトリッキーな問題が出てきます。

## 各入力ストリームを順番に処理すればいい場合

この場合は比較的簡単です。

サブシェルを使うのもよし。

```bash
$ ( cmd1 ; cmd2 )  | cmd3
$ { cmd1 ; cmd2; } | cmd3
```

(`()`と`{}`の違いについてはmanpageなどを参照)

`cat`とProcess Substitutionを使うこともできます。

```bash
$ cat <(cmd1) <(cmd2) | cmd3
```

ただし、いずれの場合も`cmd1`のデータを全て読み出した後でないと`cmd2`のデータが読み出されないことに注意が必要です。そのため、`cmd1`が永続的にデータを出力し続けるようなプロセスの場合はうまくいきません。

## 全ての入力ストリームから同時にデータを吸い上げたい場合

以下は**ダメな例**です。

```bash
$ (cmd1 & cmd2) | cmd3
```

この方法では、`cmd1`の出力と`cmd2`の出力が意図しないところで混ざって`cmd3`に渡される可能性があります。「どういう混ざり方をしてもOK」という場合ならこれでもいいですが、そういうケースは稀でしょう。

試しに以下のようなコマンドを実行してみます。

```bash
$ ( perl -e 'print "a"x1024 . "\n" for 1..100' & \
    perl -e 'print "b"x1024 . "\n" for 1..100' ) | \
  perl -nle 'print if !/^(.)\1*$/'
```

上記における`cmd1`は「1024文字の"a"を100行出力する」というもの、`cmd2`はその"b"バージョンです。`cmd3`は"a"と"b"が混ざっている行のみを表示します。環境にもよるかもしれませんが、何件か行が混ざっているケースがあるはずです。

このように、行単位で出力を区切って欲しい場合は`fdlinecombine`が便利そうです。

- https://github.com/vi/fdlinecombine

`fdlinecombine`は、複数ストリームを同時に読み込みつつ、行単位で出力を区切って混ざらないようにしてくれます。

```bash
$ fdlinecombine <(cmd1) <(cmd2) | cmd3
```

また、`SEPARATOR`環境変数を設定することで改行以外のデータをメッセージ境界とすることができるようです。(設定方法が若干トリッキーなので要注意)

## pasteを使ってみる

`fdlinecombine`は便利なのですが、どこにでもインストールされているわけではないのがキビシイところです。

入力と出力の条件次第ですが、`paste`コマンドで集約できるケースもあります。

```bash
$ paste -d \\n <(cmd1) <(cmd2) | cmd3
```

`paste`コマンドは引数で指定したストリームを同時に読みだして、それらの各行を「横に並べて」出力します。デフォルトではTABで並べて出力されますが、`-d`オプションでデリミタを改行コードに変えることで1本のストリームにまとめることができます。

`paste`を使う場合は以下の2点に注意が必要です。

- `paste`では入力ストリームは行ごとに処理されるのみであり、任意のメッセージ境界を設定することはできません。
- `paste`は全ての読み出し可能な入力ストリームからの行データが揃うのを待ってから出力を行います。そのため、例えば`cmd1`と`cmd2`で出力スループットが異なる場合、遅い方にペースを合わせて速い方がブロックすることになります。

## 参考

- http://qiita.com/kawaz/items/98768ba5eea8d6fe6a19
- http://serverfault.com/questions/171095/how-do-i-join-two-named-pipes-into-single-input-stream-in-linux
- http://askubuntu.com/questions/133386/how-to-merge-and-pipe-results-from-two-different-commands-to-single-command
- http://stackoverflow.com/questions/16867414/can-i-take-an-output-stream-duplicate-it-with-tee-munge-one-of-them-and-pipe
uGui スクロールバーによるスクロールするボタン

■親パネル　ScrollRectをくっつけてVerticalScrollbarにScrollbarを関連づける
![親パネル.png](https://qiita-image-store.s3.amazonaws.com/0/17904/4eeee768-24cb-7909-928e-8a30535357ab.png)

■子パネル　Maskをつけてボタンの下側の表示を綺麗にする
![子パネル.png](https://qiita-image-store.s3.amazonaws.com/0/17904/eba66445-09c3-d45f-d1c7-0d75a39b9f92.png)

■孫パネル　GridRayouttGroupをつけて子オブジェクトのボタンサイズを指定
![孫パネル.png](https://qiita-image-store.s3.amazonaws.com/0/17904/7815e69b-ed54-3393-191c-1672d89f7b55.png)

■スクロールバー　ScrollbarをくっつけてDirectionsを「Buttom To Top」にする
![スクロールバー.png](https://qiita-image-store.s3.amazonaws.com/0/17904/912f39dc-fe56-4e05-7cfa-18e1994d6495.png)
日本の祝日データをEXCEL(VBA)で取得してみた - ICAL編


## 概要
この記事は [日本の祝日データをEXCEL(VBA)で取得してみた](http://qiita.com/slangsoft/items/10b900fb178737d5fc58 "日本の祝日データをEXCEL(VBA)で取得してみた") の続編です。

Google は XML/ICAL/HTML の形式で日本の祝日データ (当年とその前後一年分) を提供しています。今回は ICAL のデータを取得して, 祝日名と日付情報をコレクションに格納してみます。

## コード
GitHub に置いておきますので, 必要な方は自由に使ってください。

* slangGetIcalHoliday.cls
* slangGetIcalHolidayType.cls

クラスファイルのダウンロードはこちら → https://github.com/slangsoft/SlangBox

## 使い方
1. 適当な Excel ファイルに [slangGetIcalHoliday.cls] と [slangGetIcalHolidayType.cls] をインポートする。
2. 標準モジュールを新規追加し, その中に下記の様なサブルーチンを用意する。

下記サンプルでは, 取得した祝日データをイミディエイトウィンドウに表示します。ちなみにソートは行っていません。ICAL から取得した順番に表示されます。

~~~VBA
Public Sub main()

    Dim myGetIcalHoliday As New slangGetIcalHoliday
    Dim holidayDataset As Collection
    Dim i As Long
    
    myGetIcalHoliday.setTmpFilePath ("c:\")    '一時ファイル作成用ディレクトリ設定
    Set holidayDataset = myGetIcalHoliday.getIcalHolidayData
    
    For i = 1 To holidayDataset.Count
        Debug.Print holidayDataset.Item(i).hDate & " " & _
                    holidayDataset.Item(i).hName
    Next i

End Sub
~~~

`holidayDataset.Item(i).hDate` に日付データ (yyyy/mm/dd形式), `holidayDataset.Item(i).hName` に祝日名が入っています。

## あとがき
[日本の祝日データをEXCEL(VBA)で取得してみた](http://qiita.com/slangsoft/items/10b900fb178737d5fc58 "日本の祝日データをEXCEL(VBA)で取得してみた") では XML データから祝日データを取得しましたが, Google が提供している XML データは祝日データが不足していました。

ということで, 急遽 ICAL データから祝日データを取得するクラスを作ってみたのですが・・・コードが美しくないです。力技感が半端ないので, 動けば OK という人向けになってます。(^^;

もっと素敵なやり方をご存知の方は, 是非ご教授ください。
Ruby | 文字列からシンボルへの変換 String#intern の命名の由来

# Ruby | 文字列からシンボルへの変換 String#intern の命名の由来
## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
文字列からシンボルへの変換 String#intern の命名の由来について

## <i class="fa fa-question-circle" style="font-size:1em;"></i> `String#intern` とは？
<i class="fa fa-external-link" style="font-size:1em;"></i> [るりま String#intern / to_sym](http://docs.ruby-lang.org/ja/2.2.0/method/String/i/intern.html)

文字列に対応するシンボルを返すメソッドです。
`String#to_sym` と同じ。

### <i class="fa fa-flask" style="font-size:1em;"></i> サンプルコード

~~~ruby
p "hoge".intern
p "hoge".to_sym
p "hoge".to_sym == "hoge".intern
~~~

### <i class="fa fa-desktop" style="font-size:1em;"></i> 出力

~~~
:hoge
:hoge
true
~~~

## <i class="fa fa-history" style="font-size:1em;"></i> String#intern の命名の由来
Ruby メーリングリストに由来がありました。

<i class="fa fa-external-link" style="font-size:1em;"></i><i class="fa fa-mail-reply" style="font-size:1em;"></i> [ruby-dev](http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/3312)

~~~
まつもと ゆきひろです

|原です。
|
|また気まぐれなリクエストです。この前 once をどう定義するかと
|いうやりとりを見ていて思ったのですが、Fixnum#id2name がある
|のだから、
|
|String#name2id
|
|があってもいいのではないでしょうか。

String#internってのがあります．名前が気に入らないかも知れま
せんが我慢して下さい．lisp由来の名前です．
~~~

## <i class="fa fa-question-circle" style="font-size:1em;"></i> intern とは？
<i class="fa fa-external-link" style="font-size:1em;"></i> [Wikipedia String intering](http://en.wikipedia.org/wiki/String_interning)

~~~
In computer science, string interning is a method of storing only one copy of each distinct string value, which must be immutable.
Interning strings makes some string processing tasks more time- or space-efficient at the cost of requiring more time when the string is created or interned.
The distinct values are stored in a string intern pool.
~~~

## :books: 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [るりま String#intern / to_sym](http://docs.ruby-lang.org/ja/2.2.0/method/String/i/intern.html)
* <i class="fa fa-external-link" style="font-size:1em;"></i><i class="fa fa-mail-reply" style="font-size:1em;"></i> [ruby-dev](http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/3312)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Wikipedia String intering](http://en.wikipedia.org/wiki/String_interning)
Vagrant/VirtualBox上にたてたWebサイトの実機確認をiPhone/iPadからおこなう


# Goal

* MacOSXをHostとして、CentOSをGuestとしたVMをVagrant/VirtualBoxで起動し、HTTPサーバをたててWebアプリを開発する
* Guest(CentOS/Vagrant)をpublic_networkの固定ipつきで起動し、同ネットワークからのアクセスを可能にする
* iPhone, iPadを同じWifiネットワークに接続し、固定ip直うちでWeb画面にアクセスする
* ホスト名でのVirtualHostを有効にできるように、WebサーバがのっているGuest(CentOS/Vagrant)に自前のDNSもたてて名前解決ができるようにする（iPhoneはjail breakしないとhostsをいじれないらしいので、その代替案...）

![スクリーンショット 2015-01-25 19.55.56.png](https://qiita-image-store.s3.amazonaws.com/0/36978/d1897c5f-e618-4601-3208-a8a1bc1f03e3.png "スクリーンショット 2015-01-25 19.55.56.png")

この例では、Wifiネットワークアドレスを192.168.2としている.
192.168.2.XXXはMac OSXが外と通信するためのネットワークインタフェース.
192.168.2.YYYはiPhone/iPadが外と通信するためのネットワークインタフェース（MacOSXと同じWifiを選択する）.
192.168.2.ZZZはvagrantのホストが外部と直接通信するためのネットワークインタフェース.

# vagrantに固定ipを割り当てて起動

固定ip=192.168.2.ZZZとしてWifiにブリッジして起動する.
bridgeは指定しなければvagrant起動時に選べるようになるので、その他のネットワークを選択したい場合は都度接続先を決めれば良い.

public_networkのIPはprivate_networkとは別のアドレスを指定する.
Mac OSXのIPを調べて、同じネットワーク以下のアドレスをもつようにする(今回は192.168.2をprefixにする).

```Vagrantfile
config.vm.network :public_network, ip: '192.168.2.ZZZ', bridge: 'en0: Wi-Fi (AirPort)'
```

#### 確認

Guestマシンのネットワークインタフェースが増えていることを確認する.

```
ifconfig | grep '192.168.2.ZZZ'
```

Hostマシン（Mac OSX）からpingコマンドで疎通できることを確認する.

```
ping 192.168.2.ZZZ
```

Guestマシン（CentOS,Vagrant）でapacheなどを起動して、port80をlistenしておく.

```
netstat -an | grep :80
  # 192.168.2.ZZZ:80でLISTEN状態になっていること
```

iPhone/iPadからブラウザのアドレスバーにIP(192.168.2.ZZZ)直うちして、vagrantのapacheへリクエストがくることを確認する.

# 自前のDNSをたてて、ローカルドメインでアクセス可能にし、ホスト名でのVirtualHostを使えるようにする

IP直うちでアクセス可能にするところまでは簡単だけど、DNSサーバをたてるのはいろんな作業がいるので注意.

### DNS設定

以下を参考にして、Guestマシン（CentOS,Vagrant）にDNSサーバをたてる.
[djbdnsでローカルドメインの名前解決をおこなう](http://qiita.com/metheglin/items/01d3334c19ca559e25cf)

↑の例では、
192.168.2.ZZZ => 192.168.2.12
192.168.2.XXX => 192.168.2.100
として設定しています.

### iPhone/iPadのDNSサーバを指定する

ネットワーク設定で、192.168.2.ZZZのアドレスを指定する.

```
設定 > Wi-Fi > 接続されているネットワークの(i)ボタン > DHCP > DNS
```

iPhone/iPadブラウザのアドレスバーにローカルドメインを入力してvagrantのapacheなどにアクセスできるようになればOK.

# Environment

CentOS, Vagrant

```
uname -a
  # Linux *** 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

cat /etc/issue
  # CentOS release 6.5 (Final)
  # Kernel \r on an \m
```

Mac OSX

```
OSX Yosemite version 10.10.1
```

iPhone

```
iOS 8.1.2
```
正規分布の画像を出力する

スライドとかで色々使う割に、Powerpoint/Keynoteにオブジェクトが無い正規分布。手で書くと難しいのでRで描く。

```R
png(file="Normal.png", width=400, height=200)
plot(dnorm, -4, 4, ann=F, axes=F)
n  <- 100
xs <- seq(-4, 4, length=n)
ys <- dnorm(xs)
 
polygon(c(xs,rev(xs)), c(rep(0,n),rev(ys)), col="gray")
dev.off()
```
![Normal.png](https://qiita-image-store.s3.amazonaws.com/0/17038/89679827-f08a-a84a-eba6-553745f73b95.png)
Unity初歩的プログラミングメモ


UnityでiOSアプリ開発時に調べた初歩的なプログラミングメモ。
GUIでの操作は画像貼るのが面倒なのでテキストで説明。

## GameObjectの生成

```C#
public GameObject Prefab; // Inspector上でPrefabを設定

GameObject CreateGameObject()
{
	// GameObjectをゲーム上に生成
	GameObject gameObject = (GameObject)Instantiate(
		Prefab,                         // 生成するPrefab
		new Vector3(0.0f, 0.0f, 0.0f),  // 位置
		Quaternion.identity);           // 角度

	return gameObject;
}
```

## GameObjectの削除

```C#
void DestroyGameObject(GameObject gameObject)
{
	// GameObjectをゲーム上から削除
	Destroy(gameObject);
	// 第2引数に削除までの秒数を指定可能（1.0f=1秒）
	// Destroy(gameObject, 1.0f);
}
```

## GameObjectからComponentを取得

```C#
// GameObjectに設定したColliderを取得
Collider GetCollider(GameObject gameObject)
{
	Collider collider = gameObject.GetComponent<Collider>();
	return collider;
}

// 同じ方法でGameObject設定したScriptも取得可能
Script GetScript(GameObject gameObject)
{
	Script script = gameObject.GetComponent<Script>();
	return script;
}
```

## 指定したTagからGameObjectを取得

```C#
// 単一のGameObjectを取得する場合（例、プレーヤは単一で存在）
GameObject player = GameObject.FindGameObjectWithTag("Player");

// 複数のGameObjectを取得する場合（例、敵は複数で存在）
GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy");
```

## タッチされたGameObjectを取得

```C#
void Update()
{
	// 毎ループ当たり判定を行う
	Touches();
}

void Touches()
{
	if (Input.GetMouseButtonDown(0))
	{
		// メインカメラ（tagにMainCameraを設定）からの当たり判定
		Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
		// メインカメラ以外に設定したカメラからの当たり判定
		// OriginalCamera camera = GameObject.FindWithTag("OriginalCamera");
		// Ray ray = camera.ScreenPointToRay(Input.mousePosition);

		RaycastHit hit = new RaycastHit();
            
		if (Physics.Raycast(ray, out hit))
		{ 
			// タッチされたGameObject
			GameObject gameObject = hit.collider.gameObject;
		}
	}
}
```

## UnityでiOSのArchive生成時にビルドエラー発生

UnityでiOS用のXcodeを吐き出し、Archive生成時に、ビルドエラーが発生。

```
Dsymutil Error
error: invalid abbreviation code [114] for DIE at 0x00002c82 in '/Users/narumi/Library/Developer/Xcode/DerivedData/Unity-iPhone-gbmljcuczmtzcnaojsftlrghkvka/Build/Intermediates/ArchiveIntermediates/Unity-iPhone/IntermediateBuildFilesPath/Unity-iPhone.build/Release-iphoneos/Unity-iPhone.build/Objects-normal/armv7/Assembly-CSharp.dll.o'
```

"<b>Dsymutil Error</b>"との事。

Xcode上で「Build Settings」→「Build Options」→「Debug Information Format」
"DWARF with dSYM file"から"DWARF"に設定。これで直りました。
datum->syntaxの嵌りどころと駄文

#`datum->syntax`の嵌りどころ

R6RSには`datum->syntax`という手続きがある。これを使えば`aif`等の`syntax-rules`のみでは書くことが難しいマクロ[^1]も書くことができる。例えば`aif`は以下のように書ける。

```scm:aif.scm
#!r6rs
(import (rnrs))

(define-syntax aif
  (lambda (x)
    (syntax-case x ()
      ((aif test then)
       #'(aif test then #f))
      ((aif test then else)
       (with-syntax ((it (datum->syntax #'aif 'it)))
         #'(let ((it test))
             (if it then else)))))))

(aif (assq 'a '((a . 0) (b . 1))) it #f)
;; -> (a . 0)
```

ここまでならば嵌りどころはないように思えるが、上記の定義を以下のようにすると問題が起きる。

```scm:aif-broken.scm
#!r6rs
(import (rnrs))

(define-syntax aif
  (lambda (x)
    (syntax-case x ()
      ((_ test then) ;; here is got changed
       #'(aif test then #f))
      ((aif test then else)
       (with-syntax ((it (datum->syntax #'aif 'it)))
         #'(let ((it test))
             (if it then else)))))))

(aif (assq 'a '((a . 0) (b . 1))) it) ;; use the first pattern
;; error unbound variable it
```

これは`datum->syntax`でテンプレートとして受け取る識別子が最初のパターンで生成されたテンプレート変数になるため、本来の構文情報を取得できないからである。これを回避するためには最初に示したように`_`を使わずに何かしらのパターン変数で置換してやる必要がある。

この嵌りどころは`syntax-case`のみを使っているのであれば問題はないのだが、`syntax-rules`と組み合わせると意外なところで嵌ることがある。例えば以下のようなコードを考えてみる。

```scm:wrapped-aif.scm
#!r6rs
(import (rnrs))

(define-syntax aif
  (lambda (x)
    (syntax-case x ()
      ((k test then else)
       (with-syntax ((it (datum->syntax #'k 'it)))
         #'(let ((it test))
             (if it then else)))))))

(define-syntax wrapped-aif
  (syntax-rules ()
    ((_ test then else)
     (aif test then else))))

(wrapped-aif (assq 'a '((a . 0) (b . 1))) it #f)
;; -> error unbound variable it
```

一見特に問題がないように見えるのだが_it_は`aif`の構文情報で生成されるので`wrapped-aif`からは参照することができない。解決方法は読者への宿題とすることにする[^2][^3]。

#駄文

ここからは駄文である。関数型ポエムを大量に書いていた人の処分についてであり、特に読む必要はないので、適当に読み飛ばしていただきたい。

全てを観測したわけでもないので事実と反する部分があるかもしれないが、結果としてポエムを大量生成していたかの氏はアカウント凍結という処分になったようである。この決定について一点だけ懸念がある。氏のアカウント凍結は、他者への誹謗、中傷を行ったためという理由であってほしいということだ。多くの人が技術的に間違いであり、指摘してもそれが直ることがないということを気にしていたようであるが、それが理由での凍結であれば、Qiitaというサービスは学者もしくはそれに類する知識を有する人々のみが何かを書くことを許されたサービスということになる。それが悪いというわけではないが、誤りを含む記事を書くこと＝アカウント凍結の処分ではいささか厳しすぎるように思える。

悪貨が良貨を駆逐するという事象であったことに異論を唱えるつもりはないが、もしこの決定について単に識者の勝利だと思っている方がいるのであれば、大変危険ではないかと思う。

[^1]: ある程度であれば不可能ではない
[^2]: 筆者はこの問題を`syntax-rules`側から識別子を挿入してやれば解決できるのではないかと思っていたのだが、そう簡単な問題でもないようである。
[^3]: こんなマクロを書かないというのでも問題はない。
Go by Example: Maps


(この記事は [Go by Example: Maps](https://gobyexample.com/maps) を翻訳したものです。)


MapsはGoのbuild-in 連想配列([associative data type](http://en.wikipedia.org/wiki/Associative_array))他の言語ではhashやdictと呼ばれているものです。


```go
package main

import "fmt"

func main() {

	// 空のmapを作るためにbuildinのmakeを使います。
	// make(map[key-type]val-type)
    m := make(map[string]int)
    
    // kye/valueのペアをセットするには典型的な文法の name[key] = val を使います。
    m["k1"] = 7
    m["k2"] = 13
    
    // mapを表示させる。
    // 例として Printlnはすべてのkey/valueペアを表示する。
    fmt.Println("map:", m)
    
    // name[key]でkeyに対するvalueを取得する
    v1 := m["k1"]
    fmt.Println("v1: ", v1)
    
    // build inのlenはmapで呼ばれた際key/valueペアの数を返す。
    fmt.Println("len:", len(m))
    
    // build in deleteはkey/value ペアをmapから消去します。
    delete(m, "k2")
    fmt.Println("map:", m)
    
    // 値をmapから取得する際、オプションとして、二個目の値を返す。
    // これはkeyがmapに存在したかどうかを示すものである。
    // これはkeyが存在しない場合と、keyの値が0や、""などのzero valueかどうかの曖昧さをなくすために使えるだろう。
	// ここでは、value自体はいらないので、 blankをしめす _で無視する。
    _, prs := m["k2"]
    fmt.Println("prs:", prs)
    
    // 新しいmapの宣言と初期化はこのような文法で同じラインで出来る。
    n := map[string]int{"foo": 1, "bar": 2}
    fmt.Println("map:", n)
}


```


```
$ go run maps.go 
map: map[k1:7 k2:13]
v1:  7
len: 2
map: map[k1:7]
prs: false
map: map[foo:1 bar:2]

```


----

pythonのmap.valuesみたいなものbuild inではないようだ。2015/01/20

http://stackoverflow.com/questions/13422578/in-golang-is-there-a-nice-way-of-getting-a-slice-of-values-from-a-map
シェルスクリプト内で、passwdコマンドを利用する。

色々な事情により、CentOSでパスワード認証が必要なユーザアカウントを作成する必要が出てきました。
今後も必要になる作業だったので、スクリプトを作成しておけば誰でもできるし時短にもなると思い
シェルで書き始めました。

しかし、 expect は使いたくなかった(インストールされてないとか面倒だから)ので色々調べたら、
passwd コマンドの man から以下のオプションを見つけた。

```
 --stdin
　このオプションは passwd が標準入力から新しいパスワードを読み込む場合を指す。パイプからでも可能である。
```

ということでなんかパイプで渡せば出来るっぽい。
 
```
# echo [パスワード] | passwd --stdin [ユーザ名]
```

これで、シェルスクリプト内で簡単にパスワード設定ができるようになった。

2019/12/12
```--stdin```の日本語説明があったので修正