OmniAICreator/Qiita-1.07M huggingface dataset:
vimメモ


0	行頭へ移動
^	行頭へ移動（行頭の空白は含まない）
$	行末へ移動

i	カーソル位置で入力モードへ(文字の前)
a	カーソル位置で入力モードへ(文字の後ろ)

f{char}		現在の行の文字を前方検索
;	検索を繰り返す
,	検索戻る
F{char}		現在の行の文字を後方検索
;	検索を繰り返す
,	検索戻る
/{pattern}<Enter>	ドキュメント内で前方検索
n	検索を繰り返す
N	検索戻る
?{pattern}<Enter>	ドキュメント内で後方検索
n	検索を繰り返す
N	検索戻る
:s/{tartget}/{replace}	置換を実行
&	置換を繰り返す
u	置換を取りやめる

di"	"内の文字を削除

## 便利
ciw カーソル位置の単語を削除してインサートモード
ci( カッコ内を削除してインサートモード
cit タグ内を削除してインサートモード

## 複合コマンド
C	c$（行末まで削除して挿入モード）
s	cl（右1文字を削除して挿入モード）
S	^C もしくは cc （行を削除して挿入モード）
I	^i（行頭入力モード）
A	$a（行末入力モード）
o	A<Enter>（下に１行追加し、入力モードへ）
O	ko（上に１行追加し、入力モードへ）
TidalCycles 0.8 リリース

TidalCyclesが0.8にアップデートして、いろいろな点で更新がありました。新機能をざっと解説します。

## 名称

これまでの名称は、「Tidal」でしたが、正式名称は「TidalCycles」、その省略形として「Tidal」と呼ぶということになりました。[TidalCycles (or Tidal for short)](http://tidalcycles.org/) おそらく、音楽配信サイトと名称が被るからだと思われます…

## 標準の音響生成エンジンがSuperDirtに

これまでのバージョンは、音を生成するエンジンとしてDirtという独自のプログラムを使用していたのですが、ver 0.8からは、SuperColliderをベースにしたSuperDirtの使用が標準となりました。ただし、以前の"classic" Dirtも併用することは可能です。

- [https://github.com/musikinformatik/SuperDirt](https://github.com/musikinformatik/SuperDirt)

## インストールが簡略化

SuperDirtが標準になったことから、インストールが大幅に簡略化されました。以下の環境を整備します。

- [Git](https://git-scm.com/)
- [Haskell](https://www.haskell.org/platform/)
- [Atom](https://atom.io/)
- [SuperCollider (version 3.7以降)](http://supercollider.github.io/download)


### Git

SuperDirtを使用する際に、Git(バージョン管理システム)が必要となります。OS Xであれば、[Homebrew](http://brew.sh/index_ja.html)からインストール可能です。

```
brew install git
```

### Haskell + TidalCycles

OS Xであれば、homebrewを使用して簡単にインストール可能です。

```
brew install ghc
brew install cabal-install
```

あとは、Haskellのパッケージ管理システムのcabalを使用してTidalCyclesのライブラリをインストールします。

```
cabal update
cabal install cabal-install
cabal install tidal
```

で完了です。

### Atom

[https://atom.io/](https://atom.io/)からダウンロードしてインストールします。

インストールが完了したら、メニューから edit > settings > install でPackageのインストールを表示して、「Tydalcycles」で検索します。すると以下のプラグインが表示されますので、インストールします。

- [https://atom.io/packages/tidalcycles](https://atom.io/packages/tidalcycles)

### SuperCollider

SuperColliderのGithubから3.7以降のバージョンをインストールします。

- [http://supercollider.github.io/download](http://supercollider.github.io/download)


## SuperDirtのインストールと起動

SuperDirtのインストールはSuperCollider内から行います。まずSuperColliderを起動して、以下のコマンドを入力して選択した状態にして、command+enterで実行します。

```
include("SuperDirt")
```

Dirtのサンプルファイルを大量にダウンロードするので、時間がかかります。気長に待ちましょう。以下のメッセージがコンソールに表示されれば完了です。

```
... the class library may have to be recompiled.
-> SuperDirt
```

ここで、全てのライブラリーを再度コンパイルする必要があるため、SuperColliderを再起動します。再起動したら、以下のコマンドを入力して、選択してcommand+enterで実行します。

```
SuperDirt.start;
```

コンソールに以下のメッセージが表示されたら、SuperDirtの起動が完了です。

```
SuperDirt: listening to Tidal on port 57120
```

Atomを起動して、メニューから、Packages > TidalCycles > Boot TidalCycles を選択してTidalを起動します。あとは、以下のようにテストのコードを入力して、音が出れば完了です!

```
d1 $ sound "bd sn"
```

## SuperColliderとの連携が簡単に

SuperDirtの導入により、SuperColliderとの連携が大幅に簡略化されました。これは別稿にまとめます。

- [TidalCyclesとSuperColliderの連携 - 改訂版](http://qiita.com/yoppa/items/261755e7f82d3387251f)
みせてもらおうか、新しいRaspberry pi zero(v1.3)の性能とやらを！

#<i class="fa fa-cubes" style="font-size:1em;"></i>はじめに
新しいpi zeroが発売されたので、早速購入しました。
カメラ用の端子が追加になったらしいのでカメラのテストとモバイルバッテリーでの稼働時間を検証してみました。


NEW PI ZERO, NOW WITH ADDED CAMERA PORT
https://www.raspberrypi.org/magpi/new-pi-zero-now-with-added-camera-port/

#<i class="fa fa-area-chart" style="font-size:1em;"></i>主な使用機器
稼働時間の比較のためpi2と２つのモバイルバッテリーで検証しました。
![IMGP0322.JPG](https://qiita-image-store.s3.amazonaws.com/0/81959/c9078e03-2260-e432-f853-cb34f1e4b720.jpeg)
●raspberry pi zero v1.3
●raspberry pi 2
●raspberry pi用カメラ
（旧製品の５００万画素のもの）
●モバイルバッテリ1　elecom 2200mAh
（購入1年くらい　10回くらい使用）
●モバイルバッテリ2　elecom 4700mAh
（購入４年くらい　30回くらい使用）

#<i class="fa fa-bullhorn" style="font-size:1em;"></i>カメラモジュールを使用する環境

OS：raspbian
新規にOSをインストール
電力消費量を少なくするため、GUIは起動せずにCUIで動かす
OS起動時に自動でpythonスクリプトが実行されるようにする
pi zeroとpi2での比較は同じメモリーカードを使用する

使用言語：python
picameraを使用
６０秒（1分）ごとに撮影するようにし、バッテリーが切れるまで撮影する
デフォルトのピクチャーフォルダに保存
※起動時の”0.jpg”はちゃんと写らないことが多いので、ループの前に少し時間を置いたほうがいいと思います。今回は稼働時間計測がメインだったので修正はしませんでした。

```py3:camera.py

import picamera
import time

with picamera.PiCamera() as camera:
    interval = 60
    picture_width = 800
    picture_hight = 600
    camera.resolusion = (picture_width,picture_hight)
    save_dir = "/home/pi/Pictures/"

    i = 0
    while True:
        file_id = str(i) + ".jpg"
        filename = save_dir + file_id
        camera.capture(filename)
        i += 1
        time.sleep(interval)
```

起動時に実行するために /etc/rc.local のexit 0 の上に下記を追加

```bash:rc.local
sudo python3 /home/pi/camera.py &
```


#<i class="fa fa-check-square-o" style="font-size:1em;"></i> 結果
撮影枚数（稼働時間）は下記のような結果になりました。

2200mAhでpi zeroが約9時間、pi2が約5時間
4700mAhでpi zeroが約17時間

pi2の4700mAhは大体推測できるので測定しなくてもいいかなーと思い割愛しました。
（思ったよりpi zeroとpi2で差がでなかったので若干テンションが下がったためですw）

| 　| pi zero | pi2 |
|:-----------:|:------------:|:------------:|
| 2200mAh |553|310|
| 4700mAh |      1024 |    -    |

タイトルのようにpi zeroがpi2の３倍以上の稼働時間になると思っていましたが、そうはいきませんでした。
しかし、1.78倍はかなり優秀。
4700mAhとpi zeroの組み合わせならば、17時間撮影できるのはなかなかではないでしょうか。

あと、撮影枚数が稼働時間に影響するかを検証するため、1時間に1枚撮影してみましたが、2200mAhでpi zero 9枚、pi2 5枚と大雑把ですがそれほど大きく影響しないことが確認できました。



#<i class="fa fa-square" style="font-size:1em;"></i>おわりに
思ったほどは差がでませんでしたが、バッテリー2が若干ヘタっていると考えるとバッテリー容量に稼働時間がほぼ比例することがわかりました。
あと、よくモバイルバッテリーは供給電力が小さくなると、自動で供給が停止するといわれていますが、（バッテリーにもよると思いますが）raspberry pi zeroでも大丈夫だったことが確認できました。
これならばcheeroやAnkerの20,000mAh以上のバッテリーを使用すれば72時間（3日）の連続使用も可能かもしれません。
1時間ごとの撮影ならば、RTCとraspberry piのON,OFFを兼ね備えたwitty piを使えばさらに稼働時間は増えそうです。
http://www.uugear.com/witty-pi-realtime-clock-power-management-for-raspberry-pi/

５ドルでこんなに遊べるなんてraspberry piは本当におもしろいですね。
いろいろ作りたくなる気持ちにさせるユニークなやつです。

お気づきの点があればどんどんご意見ください(^o^)/
iPhone,Androidの実機から開発用localhost等にProxy経由でアクセスさせてテストする方法

今回はMac環境でiPhoneやAndroid向けの開発をするのに便利なProxyの設定の方法を紹介します。

アプリ開発やスマホ向けWebサイトの開発において、実機からテスト環境にアクセスさせたい時に、特定のドメインへのリクエストをProxy経由で開発用の任意のサーバへリダイレクトして使うことを想定しています。

# ProxyサーバのSquidManをインストールする

SquidManはSquidというProxyサーバのGUIとして動作するソフトウェアで、Squidが入っていない場合はインストール時にSquidも一緒にインストールしてくれます。

![Cursor_と_SquidMan_と_新規投稿_-_Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/53041/046c71e8-f8bc-f7eb-80b2-ce334c65c10e.png)

http://squidman.net/squidman/

Downloadsから最新版をダウンロードしてインストールしてください。

# SquidManの設定をする

Preferencesから設定を行います。基本的にはClientsとTemplateを更新します。

## Clients

Clientsでは接続を許可するIPを設定します。192.168.1.4のように特定のIPのみを指定することもできますし、画像のように特定のネットワークに所属する端末を許可することも可能です。

![Cursor_と_Preferences_と_Tools_と_新規投稿_-_Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/53041/0743d700-02ea-0d5a-1000-c6010ad341d8.png)

## Template

Configを更新します。ポイントはhostsファイルの指定です。

```
# protect web apps running on the proxy host from external users
# http_access deny to_localhost
```
localhost上で動作するwebサービスへのアクセスを許可する必要があるので上記の制限をコメントアウトします。

Proxy経由のリクエストの一部を別のIPに振り分けたいのでhostsファイルを用意します。今回はlocalhostにアクセスさせたいので

```
127.0.0.1 hogehoge.com
127.0.0.1 api.hogehoge.com
```
として任意のファイル名で保存します。そして上記のconfigに

```
# hosts file
hosts_file /Users/hogehoge/hosts
```
と自分が新しく保存したhostsファイルへの参照を記載します。

あとはSaveしてProxyをリスタートさせておきましょう。

# 実機にProxyを設定する

次にiPhoneやAndroidから起動しているProxyサーバに接続させて、アプリやブラウザから開発用のアプリケーションにアクセスできるようにします。

Proxyサーバの設定は次のようになっているとします。

| IPアドレス | ポート |
|:-: |:-:|
|192.168.1.4   |8080   |

## iPhoneでのProxy設定

iPhoneではいつもの設定画面から接続しているWifiを選択してProxy設定を追加します。

![写真_2016-06-08_0_56_22.png](https://qiita-image-store.s3.amazonaws.com/0/53041/66952f14-fc1f-046d-6402-a6b9034b2b9a.png)

ネットワークの設定画面の下部にある「HTTPプロキシ」に設定を追記します。

![写真_2016-06-08_0_56_13.png](https://qiita-image-store.s3.amazonaws.com/0/53041/3a4385ed-7403-9d16-e65f-0c022567adaa.png)

これで、このネットワークを使用する際には指定したProxyサーバを経由してくれるので、hostsで設定したドメインへのリクエストを開発サーバに割り振ってくれます。

## AndroidでのProxy設定

AndroidではProxy設定を管理できるアプリをインストールして使うのが便利です。私はProxySettingsというアプリをインストールしています。
（注：どうやらAndroid6系だと使えないようです）

![Screenshot_2016-06-08-01-01-02.png](https://qiita-image-store.s3.amazonaws.com/0/53041/5bcf1765-d019-0dc8-c200-6e9043351050.png)

インストールしたら接続しているネットワークに対してProxyの設定を作成してSelectしましょう。

![Screenshot_2016-06-08-00-55-18.png](https://qiita-image-store.s3.amazonaws.com/0/53041/a57234b4-73c4-c473-982f-b4835260a0a0.png)

# 以上
これで実機上のでアプリ開発やスマホ向けウェブサイトの実機確認がとっても簡単になります。
EC2のCentOS6にVNCを入れてみた

ちょっと色々あってCentOSをGUIで操作したかったのでVNCをインストール
色々探したけど、情報が古かったりしたのでとりあえずメモ

### 使った環境
* パブリックサブネット
    * プライベートに構築するのめんどかった
* AMI
    * CentOS 6 (x86_64) - with Updates HVM
* SG
    * SSH(22)とVNCで使う5901だけ許可
    * とりあえず自宅IPからのみインバウンド許可
* EIPの付与
* あとはいい感じに


### CentOSの初期設定
* rootユーザになる

```
sudo su -
```

* SELinuxの無効化

```
# getenforce
Enforcing

# setenforce 0

# getenforce
Permissive
```

* iptablesの無効化

```
# service iptables stop
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]

# service ip6tables stop
ip6tables: Setting chains to policy ACCEPT: filter         [  OK  ]
ip6tables: Flushing firewall rules:                        [  OK  ]
ip6tables: Unloading modules:                              [  OK  ]

# chkconfig iptables off

# chkconfig ip6tables off
```

### GNOME GUIのインストール
* その前にとりあえずアップデート

```
# yum -y update
```

* GNOME GUIのインストール

```
# yum -y groupinstall "Desktop" "Desktop Platform" "X Window System" "Fonts"
```

### VNCのインストール
```
# yum -y install tigervnc-server
```

### VNC設定
```
ユーザの作成
# useradd vncuser

ユーザパスワードの設定
# passwd vncuser

# vi /etc/sysconfig/vncservers
---以下追加---
VNCSERVERS="1:vncuser"
VNCSERVERARGS[1]="-geometry 1024x768 -nolisten"
---ここまで---

# su - vncuser

# vncpasswd
Password:[ 接続時のパスワードを6文字以上で入力 ]
Verify:[ 同じものを入力 ]

# exit

# chkconfig vncserver on
```

### VNC起動
```
# service vncserver start
・・・
Creating default startup script /vncuser/.vnc/xstartup
Starting applications specified in /vncuser/.vnc/xstartup
Log file is /root/.vnc/ip-XXX-XXX-XXX-XXX:1.log

                                                           [  OK  ]
```


### GNOMEの設定
```
# vi /home/vncuser/.vnc/xstartup
-----コメントアウト-----
two &
---------------------

---------追加--------
# settings for Japanese
LANG=ja_JP.UTF8
export LANG
export GTK_IM_MODULE=scim
export QT_IM_MODULE=scim
export XMODIFIERS="@im=SCIM"

# setting for gnome
exec gnome-session &
--------------------

# service vncserver restart
Shutting down VNC server: 1:vncuser                        [  OK  ]
・・・
Starting applications specified in /vncuser/.vnc/xstartup
Log file is /root/.vnc/ip-XXX-XXX-XXX-XXX:1.log

                                                           [  OK  ]

```

### VNC接続
* Macの場合
    * 「Finder」→「移動」→「サーバへ接続」
    * サーバアドレスに「vnc://[IPアドレス]:5901」を入力
    * 設定したパスワードを入力
    * できた！！
* Windowsの場合
    * [UltraVNC](http://forest.watch.impress.co.jp/library/software/ultravnc/)をダウンロード
    * あとはIPアドレスと5901ポートを設定
    * できた！！！
* iPhoneの場合
    * [VNC Viewer](https://itunes.apple.com/jp/app/vnc-viewer/id352019548?mt=8)をダウンロード
    * あとはIPアドレス:5901を設定
    * できた！！！！


### まとめ
なんか途中接続できなかったり、作りなおしたりして、意外と時間がかかった
サーバレスアーキテクチャ最高( ´ー｀)
js初学者がDynamoDBの値をlambdaで加算してみた。

# はじめに
最近流行りのAWSを触ってみました。
jsは、初めてですので文法ミス等有ると思いますが、見つけたらコメントなどでご指摘ください。

# メモ

以下のようなjsonを渡されたとき

- JSON

```json
{
    "userid" : "peta727",
    "count" : "1"
}
```
 `userid` のDynamoDB上のcountを `count` 分だけ数値を加算します。

この場合は、 `userid` がDynamoDBのテーブルのプライマリキーです。

- lambda

```js
'use strict';
console.log('Loading function');
var aws = require('aws-sdk');
var dynamo = new aws.DynamoDB({region: 'ap-northeast-1'});

exports.handler = (event, context, callback) => {
	dynamo.updateItem(
		{
			"TableName":"peta727-dynamodb-table",
			"Key" : {
				"userid" : {"S": event.userid}
      		},
			"ExpressionAttributeNames" : {
				"#count" : "count"
			},
            "ExpressionAttributeValues" : {
                        ":i" : {"N" : event.count},
                        ":default": {"N" : "0"}
            },
            "UpdateExpression" :  "set #count = if_not_exists(#count, :default) + :i",
			"ReturnValues":"ALL_NEW"
		}, function(err, data) {
			if (err) {
				console.log("error: " + err);
				context.fail();
			} else {
				console.log("data uploaded successfulle." + JSON.stringify(data));
				context.succeed();
			}
		});
};

```

実際、触ってはいませんが `ALL_NEW` で更新後の値を返しているので再びDBを叩くことなく**更新後の値**を使用することができると思います。

- 返り値

```json

//返り値
{
	"Attributes":{
		"count":{"N":"5"},
		"userid":{"S":"peta727"}
	}
}
```
Ubuntu Community への貢献方法

[Ubuntu Community | Contribute](http://www.ubuntu.com/community/get-involved) の日本語訳。

#貢献方法
Ubuntu Project の成功は幅広いコミュニティの
才能と情熱を持つ開発者に依存している。
正しく技術的な技能は何であれ貢献することができる。
新しい作業を始める際は、開発チームも含めてオンラインで助力を求めることができる。

開発を支援するツールは多く存在する。
開発者は Ubuntu がどのように構築されているのか
[開発文書](http://packaging.ubuntu.com/) から情報を得ることができる。
[開発文書](http://packaging.ubuntu.com/) では開発チームがどのように構成され、
Ubuntu の構築についての技術情報をどのように提供し、
現在と未来における Ubuntu 支援者の有用な資源に
どのように索引を付けているのか情報を得ることができる。

今すぐに支援を始める [課題を探す](http://community.ubuntu.com/contribute/find-a-task/) か、
以下に記載する支援方法を読もう。

#非技術者のユーザ
##翻訳とローカライズ
母語は英語ではないが、強力な英語の技能を有している場合、
Ubuntu アプリケーションの英語から母語への翻訳において
多大な貢献をすることができる。
数行翻訳するだけでも、翻訳者の母国で
コンピュータとフリーソフトについて学ぶ人々の助けとなるだろう。

* Ubuntu のソフトウェアの母語への翻訳は [Launchpad](https://launchpad.net/rosetta) を使用して行う。
  [Ubuntu 翻訳者メーリングリスト](https://lists.ubuntu.com/mailman/listinfo/ubuntu-translators) へ登録し、他の Ubuntu 翻訳者と連絡を取ろう。

* [文書作成チーム](https://wiki.ubuntu.com/DocumentationTeam) によって書かれた文書の翻訳。
  こちらも [Launchpad](https://launchpad.net/ubuntu-docs) を使用して行うことができる。

* 翻訳、フォント、その他の問題について
  翻訳者の [ローカルコミュニティチーム](https://community.ubuntu.com/help-information/meeting-other-ubuntu-users/) と議論しよう。

##文書作成

問題の解決策を見つけた場合は、その事例について書き記すことで
コミュニティへ貢献することができる。
最も建設的な Ubuntu 文書作成コミュニティへの参加方法は:

* 問題の解決について記録を残す。
  文書が既に存在する場合は、既存の文書へ書き加えるか、改善することができる。
  存在しない場合は [help wiki](https://help.ubuntu.com/community) へページを追加し、
  誰もが使用できる解決事例を書こう。
  wiki ページの書き方については [Wiki Guide](https://help.ubuntu.com/community/WikiGuide) を参照。

* Ubuntu 文書作成チームへの参加。
  文書作成の初め方についてのヒントとティップスについては
  [文書作成チームの web サイト](https://wiki.ubuntu.com/DocumentationTeam) を参照。

##寄付
可能であれば Ubuntu web サイト上の Ubuntu Community 寄付基金への
寄付を一考していただきたい。
基金はイベントの費用、会議と各種会合へ人々を運ぶ一助となる。
詳細は [基金のページ](https://community.ubuntu.com/help-information/funding/) を参照。

#技術者のユーザ
問題の診断と発見は素晴らしい貢献方法である。
[pre-release 版 Ubuntu の試験](https://wiki.ubuntu.com/QATeam) は最終リリース前のバグ発見に役立つ。
早期にたくさんの試験を実施していただきたい。
[バグの報告](https://help.ubuntu.com/community/ReportingBugs) は開発チームのバグ分析の一助となる。
ユーザが開発ブランチを運営している場合は最も効果的な貢献方法だ。
技術的な討論とフィードバックの提供に加わっていただきたい。

* [Ubuntu メーリングリスト](https://lists.ubuntu.com/) の討論リストへ参加しよう。

* [IRC](https://wiki.ubuntu.com/IRC) によるチャット。
  ユーザは Ubuntu を使用する他のユーザを支援することで 
  Ubuntu Project へ貢献することができる。

* [Ubuntu メーリングリスト](https://lists.ubuntu.com/) の E mail サポートリスト、
  または討論リストへ参加しよう。 
  ubuntu-users が主要なサポートリスト。

* [フォーラム](http://ubuntuforums.org/) へ参加し、支援要請に答えよう。

* Ubuntu サポート IRC チャンネルへの参加: 
  irc.freenode.net の #ubuntu

* Ask Ubuntu の [未回答の質問](http://askubuntu.com/unanswered) への回答と、 
  [既存の FAQ](http://askubuntu.com/questions?sort=faq) と [よくある質問](http://askubuntu.com/questions/greatest-hits) の見直しは
  FAQ の品質と鮮度の向上において大きな貢献となる。
UIAlertControllerでアラート表示

すぐに使えるようにメモ

```swift:alert
alert = UIAlertController(title: "アラート", message: "メッセージ", preferredStyle: UIAlertControllerStyle.Alert)
alert.addAction(UIAlertAction(title: "YES", style: UIAlertActionStyle.Default, handler: {
            (action:UIAlertAction)in

                print("YES")
                
}))
alert.addAction(UIAlertAction(title: "NO", style: UIAlertActionStyle.Default, handler: {
                (action:UIAlertAction)in
                
                print("NO")
}))

self.presentViewController(alert, animated: true, completion: nil)

```
NSFetchedResultControllerからランダムにオブジェクトを取得するコード

ランダムに取得するコードを書いたのでメモ

```swift:random

var randomRow:Int = Int(arc4random_uniform(UInt32(self.fetchedResultsController.fetchedObjects!.count)))
let randomFetchedObject = self.fetchedResultsController.objectAtIndexPath(NSIndexPath(forRow: randomRow, inSection: 0))

```

セクションを考慮する際はまた少し違ったコードになると思われる。
swift モジュールとは

モジュール名、モジュール化、モジュールという言葉はたくさん出ますが、モジュールというのは何かの集まり？程度の認識だったのでちゃんと調べます。

モジュールとは何か？詳解swiftにはこう書いてありました。

```
すでにコンパイルされ、importで情報を取り込んで利用できるプログラムの集まりと考えればよいでしょう。
```

ふむ、この場合のモジュールの意味は1つのソースファイルから生成される一定の処理の領域。ソースフファイルの集まりってことかなと。（本にはswiftファイルが複数集まってモジュールとなっている）

さらに読むと

```
アプリケーション開発においては、アプリケーション自体、およびアプリケーションに含まれるローダブルバンドルなど、ビルドのターゲットになるものも１つのモジュールです。
```

なんかモジュール増えた。
そして、ローダブルバンドルっていう調べるとさらに知らないのでるパターンです。
ローダブルバンドル　→ Linuxにおいて、カーネルとは独立してロード/アンロードを可能にしたドライバーのこと。DOSやWindows NTのデバイスドライバーに相当する。
.bundleのことっぽい

このモジュールの説明の通りビルドのターゲットも１つのモジュールってことはedit schemeで選ぶやつも１つのモジュールなのか！（storyboardでもモジュール選ぶところがあるがそれはこれのこと）
perl 勉強ノート

ここでは自分なりにperlを勉強して、学んだことを書いていきます。(初歩の初歩ですが)
###概要
1.変数について
2.条件文
3.繰り返し文
4.ファイル処理
5.関数

#1.変数について
変数については、代入できるデータ型はスカラー値、配列、連想配列(ハッシュ)の3種類がある。
それぞれ変数を宣言するときに、変数名の頭に特定の記号をつけます。スカラー値の場合は$、配列の場合は@、ハッシュの場合は%をつける。
以下例文

```perl:sample.pl
my $num = 5; #スカラー値
my @nums = (1,2,3,4,5); #配列
my @colors = qw(red blue green); #文字列のとき
my %number = ("red"=>1,"blue"=>2,"green"=>3); #ハッシュ

print $num;
print @nums[2];
print $number{"blue"};  
```
これを実行すると
532
と結果が返ってくる。
ここで注意すべき点は、配列の中身がすべて文字列ならqw()と書けること、ハッシュの値自体はスカラー値なので、出力などの際にはスカラー型にする必要があることである。
#2.条件文
基本はcとかjavaとかと同じである。
しかし、文字列を比較する場合に*関係演算子*というものを使用する。
以下例文

```perl:sample.pl
my $name = "Joe";

if($name eq "Joe"){
    print "OK!";
}
```
ここではeqという関係演算子を使っている。
eq(equal)ということで等しいなら真を返す。
#3.繰り返し文
while文はcやjavaと同じである。ここではfor文について説明する。
perlにはforeachという繰り返し文がある。
以下例文

```perl:sample.pl
my @fruits = qw(orange banana grape melon);

foreach my $fruit (@fruits){
     print "$fruit\n";
}
```
これは()内の配列の要素を先頭からひとつずつ、()の前の変数に代入して{}内のプログラムを実行している。これを配列内のすべての要素に対して実行する。

また、これをfor文で書き換えると

```perl:sample.pl
my @fruits = qw(orange banana grape melon);

for(@fruits){
     print "$_ \n";
}
```
とできる。$_に配列の要素が入る形になっていて、これを*特殊変数*という。
#4.ファイル処理
ファイル処理にはopen()を使う。
以下例文

```perl:sample.pl
open(my $in,"<","test.dat") or die("not open"); #読み込み
open(my $out,">","test.out") or die("not open");#書き込み
#一行づつ読み込み
while(<$in>){
    print $out $_;
}

close($in);
close($out);
```
これは、test.datファイルの内容をtest.outファイルに書き込む動作である。
open()関数の第一引数にはファイルハンドルを設定します。第二引数にはそのファイルの処理を設定します。"<"が読み込み、">"が書き込みを意味しています。第三引数には使用するファイルを持ってきます。
ファイルを読み込むときは、読み込むときはファイルハンドルに<>をつけます。
最後にclose()関数でファイル処理を終了します。

#5.関数
何か一連の動作を何度も使用したいときには、関数を作っておくと便利です。関数を作成する際には sub を使用します。

```perl:sub.pl
sub max{
    my $max = $_[0];
    if($_[1] > $max){
         $max = $_[1];
    }
    return $max;
}

print max(10,50) . "\n";
```
これは二つのスカラーを変数として大きい値の方を返す関数です。ここで注目すべき点は*\$\_[n]*という部分です。nには0,1,2,3....がはいります。これは使用する引数の番号となっており一番左端の引数から\$\_[0],\$\_[1],\$\_[2]...と対応しています。
この場合ですと、10と50を比較し、値の大きい50を返します。
gitのhookをrakeで管理してみる

git の hook は `.git/hooks` 配下に配置されます。
`.git` はgitの履歴管理外です。

となると「複数人で利用する場合の git の hook をどう管理しよう？」
という問題がでてきます。
そこで `%project%/githooks` ディレクトリを作って、そこで hook のスクリプトを管理し、
rake タスクで `%project%/.git/hooks/some_hook` に symlink を作成したいと思います。

## <i class="fa fa-check-circle" style="font-size:1em;"></i> 前提
* ruby install 済み
* rubocop install 済み

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
### <i class="fa fa-sitemap" style="font-size:1em;"></i> 構成
```bash
$ tree
.
├── Rakefile
├── githooks
│   └── pre-commit
└── src
    └── hoge.rb
```

### <i class="fa fa-code" style="font-size:1em;"></i> プログラム
#### hoge.rb
ruby としては valid だけど rubocop 的には invalid なコード

```ruby
  def hoge
  puts :hoge
end

hoge
hoge
```

#### Rakefile
```ruby
namespace :githooks do
  desc "git pre-commit hookの設定"
  task :setup_pre_commit do 
    base_dir = File.expand_path(File.dirname(__FILE__))
    old_path = "#{base_dir}/.git/hooks/pre-commit"
    new_path = "#{base_dir}/githooks/pre-commit"
    if File.symlink?(old_path)
      puts "symlink #{old_path} already exist."
    else
      File.symlink(new_path, old_path)
      puts "success setup symlink to #{old_path}."
    end
  end
end
```

#### githooks/pre-commit
src以下を静的解析するrubocopを実行する git の pre-commit hook

```ruby
#! /usr/bin/ruby

exit(system("rubocop src"))
```

## <i class="fa fa-flask" style="font-size:1em;"></i> デモ
```bash
$ rake githooks:setup_pre_commit
success setup symlink to %project%/.git/hooks/pre-commit.

# 作成済みの場合はその旨メッセージが表示される
$ rake githooks:setup_pre_commit
symlink %project%/.git/hooks/pre-commit already exist.

$ git add -A

# commit 時に rubocop が実行されていることがわかる。commitも未完了。
$ git commit -m "test"
Inspecting 1 file
W

Offenses:

src/hoge.rb:1:3: C: Indentation of first line in file detected.
  def hoge
  ^^^
src/hoge.rb:2:3: C: Use 2 (not 0) spaces for indentation.
  puts :hoge

src/hoge.rb:3:1: W: end at 3, 0 is not aligned with def at 1, 2.
end
^^^
src/hoge.rb:5:1: C: Inconsistent indentation detected.
hoge
^^^^
src/hoge.rb:6:1: C: Inconsistent indentation detected.
hoge
^^^^

1 file inspected, 5 offenses detected
```

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [多人数開発で Git を使う場合の環境構築 - GREE Engineer's Blog](http://labs.gree.jp/blog/2011/03/2885/)
Webページからマップを開きたい

サービスを作る時のちょっとしたTipsです。

## 何が何でもGoogle Mapを開きたい時、
```
https://maps.google.com./maps?q=[緯度],[経度]
```
PCで開けば、Google mapへ。
Androidで開けば、WebのGoogle mapかGoogle mapアプリの選択画面へ。
iPhoneで開けば、WebのGoogle mapへ。

## デバイス固有のMapアプリを開きたい時、
```
https://maps.apple.com./?q=[緯度],[経度]
```
PCで開けば、Google mapへ。
Androidで開けば、WebのGoogle mapかGoogle mapアプリの選択画面へ。
iPhoneで開けば、プリインストールの地図アプリへ。
herokuにPHPをデプロイするとエラー

こんなエラーが出た

```
$ git push heroku master
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (7/7), 3.04 KiB | 0 bytes/s, done.
Total 7 (delta 1), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote:
remote:  !     Push rejected, no Cedar-supported app detected
remote: HINT: This occurs when Heroku cannot detect the buildpack
remote:       to use for this application automatically.
remote: See https://devcenter.heroku.com/articles/buildpacks
remote:
remote: Verifying deploy....
remote:
remote: !       Push rejected to linbot-nuppan.
remote:
To https://git.heroku.com/linbot-nuppan.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/linbot-nuppan.git'
```

なんてことはない、composer.jsonがないだけだった
エンジニア的観点での過去の振り返り

#内定者時代
##勉強したこと
###基本情報技術者の勉強
-ITの汎用的な最低限の知識が身につく。

#新人時代
##勉強したこと
###新人研修
-しょぼいネットワークの構築(Cisco)、Linux・Windowsで一通りサーバーの構築(DNSとかProxyとかHttpとか)
-インフラ系はAWSとかで簡単に考えなくても構築できるけど、どんな仕組みでどう構築されているかは知ってて損はないと思う。
###Oracle Bronze取得
-一通りSQLが分かる。
###インド研修(英語)
-基本的にエンジニアがあたる情報は英語が多いからできたほうが良い。
###Java・JavaEE
-Webサービスの基本的な作り方を学ぶ(3か月くらい?)
		 
##所感
-ちゃんとプログラミング言語を覚えて使えるようにするには(しかも初めてであれば特に)、ある程度の期間(1か月くらい?)、ひたすら触り続けるしかない。
##できるようになったこと
-デザインはできないけれど(Bootstrap使ったテンプレ落としてきて整える+Primefaces使って多少は動的に)、簡単なWebサービスは作れるようになった。(スピードはかなり遅い。)
		
#業務(2年目)
##勉強したこと
###OracleDB
-パフォーマンス計測とかチューニング(だいぶしょぼい)
###Oracle Application Server
-アプリケーションサーバのつくりを多少覚える。(ほぼ意味なかった。基本的に使われてない)
###応用情報技術者
-国語の問題。基本のが覚えること多くて大変だった印象。
##所感
  -AP/DBサーバを触ったことで、アプリがどのような構成で動くのか理解できるようになった。

##できるようになったこと
   -アプリの運用のお仕事(かじれたことが重要)
	
#業務(3年目)
##勉強したこと
###Oracle Web Logic
-値段がくそ高い。ただ安定してる。いろいろなことできそう。プライベートでは到底使えないけど、、
###Windowsバッチ(Dos)
-その名の通りWindowsでバッチ処理をするときに使う。Web系で使っているとかは聞いたことない。そもそもWindowsサーバとか使わないと思う。
ただ、実際にプログラムを書いて、それが本番で動くという経験が何気に初めてだったので、プログラムの読みやすさとかテストとか相当気を遣った。
-本当はLinuxでShellとかやりたかった。
###障害対応
-本当に精神削られる。エラーログの確認して解決策考える速度が上がる。(開発中のエラーとはまた違ったエラーが多い)
###アプリの設計の詰め方
-簡単そうだと思っても影響範囲が広くて死ぬことがあるので注意。。
##所感
-SI業界の仕事の進め方に疑問。2015年はほぼ終電以降での帰宅が多かったから。
-もし自分で請け負って仕事するのであれば、プロジェクトの期間とお金はちゃんと見合ったものにしたい。人月の神話。
-期間が極端に短いとかだと自分が一日にコミットしなければならない時間が多くなるのだからそれなりにお金をもらうべき。（自由な時間がなくなるのは辛い。。）		
##できるようになったこと
-エラーに遭遇した時にとにかく独力で解決する気持ちを養えた。笑(とにかくネットで死ぬほど探せば答えは落ちている。というかそのレベルの技術しか会社では使っていない。)
#業務(プライベート・4年目)
##勉強したこと(現在進行形)
###ひたすらJavaとScala（まだはじめて3週間くらい）でプログラム書きまくる。
###空き時間があればQiitaとかStackOverFlowとかでプログラム書いている時に引っかかったこととの解決策を探しまくる。
###最近のWeb界隈の動きとかはPodcast聞いて抑える。(Rebuild.fm、Software Engineering Radioなど)
###エンジニアリングの本を買いあさって読みまくる。(Qiitaで新人向けの本とかの情報が参考になる。)
###Wordpress触ってみたけど別にこだわらないなら自前でWebページ持たなくてもよいと思った。
  (サービス作るなら別だけど、単純なホームページとかブログとかまとめブログとかなら全然楽だし問題ない。)
##所感
-こう見るとエンジニアリングの実績が少なくて焦る。
-4年目に入って時間ができた 
##できるようになったこと
-適当に転がってるAPI使って一通りツールが作れると思われる。
-なんとなく時間がかかりながらもプログラミングで解決できることが増えた。
-自前にこだわらない
werckerの使用するIPアドレスをSecurity Groupに登録するスクリプト

GUIでポチポチするのが手間だったので作成。

wercker ciが使用するIPアドレスは以下から参照。
http://devcenter.wercker.com/docs/faq/what-ip-to-whitelist.html

ここのjsonが最新だそうですので、このIPのリストを登録する。
https://s3.amazonaws.com/status.wercker.com/worker_ips/production/public.json

```python:register_whitelist.py
#coding:utf-8
import json, commands

# セキュリティーグループのID
sg_id="sg-xxxxx"

# 標準入力からwhite list ipの取得
ip_json = raw_input()
print "input json: " + ip_json

for ip in json.loads(ip_json):
    cmd="aws ec2 authorize-security-group-ingress --group-id "+ sg_id +" --cidr " + ip + "/32 --port 22 --protocol tcp"
    print commands.getstatusoutput(cmd)
```

実行！

```
$ curl https://s3.amazonaws.com/status.wercker.com/worker_ips/production/public.json | python register_whitelist.py
```
CSSメモ

## ブロック要素
* 単体で文書を構成する基本要素になるもの。見出し、段落、区切り線、ナビゲーション、リストなど
* 幅は親要素の100%。左上からつみあがってあく積み木のようなもの。幅を指定すると、左寄せになり、残りは余白になる。

## インライン要素
* ブロック要素の中身に役割や機能を持たせる要素。画像、アンカーテキストなど
* 他の要素を含めることの出来ない要素と考えるとわかりやすいかも。
* 段落の中に画像を持たせることは出来るけど、画像の中に他の要素を持たせることは出来ない(positionを使って重ねて見えるようにするのは可能だけど)

## 基本構造を表す要素
* headerタグ
    * ヘッダー
    * セクションの見出し、検索フォームやロゴ画像、セクション内の目次などを含む範囲

## レイアウトの手法

###  floatについて
* 浮いて右へ左へよっていく。
* `float:left`は左に寄る。 `float:right`は右に寄る。`float:none`はやっぱりフロートしない
* floatの要素の幅が親要素の幅を超える場合は、下に積み上がる
* floatすると幅が100%ではなく、要素の幅になる
* 浮いた要素は高さが無くなるため、中身の要素が全てfloat指定されている場合は親要素の高さは無くなる

### clearプロパティ、clearfix、overflow:hiddenについて
* floatは次の要素も回りこみをさせてしまう & 親が子の要素を認識できなくなる
* そのため必ず解除することがお決まり

### clearプロパティ
* 次の要素で `clear`プロパティをすることで、回りこみを解除する(次の要素がfloatしている要素を認識する)
* ただこの方法だと、次の要素はfloatしている要素を認識できるが、親の要素は認識できない。
* そのため次の`clearfix`という方法をとられることが一般的

### clearfix
* 親要素の擬似要素でclearプロパティで回りこみを解除する

* display:inline-block
* display:inline
* flex-box

### 自由レイアウト
* position
  * 親要素がstatic以外の場合(relative)はその親要素からの位置になる

### floatとposition:relativeの併用
* positionの値がabsoluteあるいはfixedであれば、displayはblockにfloatは`none`に(強制的に)設定される
* つまり、relativeならfloatとの併用が可能
* floatにすると、その要素は浮いている状態になり、親要素から認識されないので、ブロック要素の特徴である親要素の100%の幅に広がることが無くなり、自身の幅になる
* これにより、検索フォーム内のアイコンなどは`position:absolute`でレイアウトが出来る

<img width="218" alt="スクリーンショット 2016-06-08 23.38.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/33823/f2e88cd7-ad11-1bbb-11aa-1bd6499a4cdb.png">

### 真ん中寄せ
* ヘッダー等の左右真ん中寄せは以下の書き方が一番いい
* ブロック要素でもなくなるので、右メニューもレイアウトしやすい
* `width, left, rightがauto以外でmarginがauto`の場合は同じ幅のマージンになるCSSの仕様に則った書き方(IE7以下以外のブラウザでは動作する)

```
position:absolute
right: 0,
left: 0,
margin: auto
```


## 見出し
* タイトルロゴはh1タグで囲む
* divではなく、なるべく意味のあるブロック要素を使う

```
<h1 class="logo">
  <a href="#">
    <img></img>
  </a>
</h1>
```

## プロパティ
* box-sizing: border-box
  * パディングとボーダーを幅・高さに含める
  * 見た目どおりの幅・高さになるため、基本的にborder-boxを指定しておく
  * 初期値はcontent-boxとなっており、幅・高さに含めない 

* border-radiusは四角の4辺に丸の半径の長さで指定
  * border-radius: 100pxとは4辺とも半径100pxの丸を指定する

## inputタグ
* フォーカスした時の青枠を消す
    * `outline:none;`
* 枠線をデフォルトの黒から変更する
    * boderで指定
    * `border 1px solid #e135e7`
* font-sizeを指定する(ex:11px)
* paddingを指定する(5px 10px)

## その他
* bodyのpadding, marginは0にリセット
* フォームやボタンなどのコンポーネントの共通の振る舞いは一箇所にまとめる

```
input[type="text"] {
  border: 1px solid #e1e5e7;
  outline: none;
}
```

* ブロック要素は親要素の幅の100%になる
* paddingでまとめて余白はとらない。marginで合わせる。使ってもpadding-leftなど1つ
* セクションの中身などコンテンツとの余白をあける時はまとめてpadding使ってもいいかも

参考: http://goodpatch.com/jp
Ubuntu14.04.4LTS + TensorFlow

VirtualBoxにubuntuをインストールして、TensorFlowのMNIST（Beginner）までを試した時のメモ書き

# バージョン確認
```bash:ubuntu
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.4 LTS"
```

```bash:python
$ python --version
Python 2.7.6
```

# インストール（CPU版）
```bash:install
$ sudo apt-get install python-pip python-dev
$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl
```

以下で動作確認

```py:hello_tensorflow.py
import tensorflow as tf
hello = tf.constant('Hello TensorFlow!')
sess = tf.Session()
print(sess.run(hello))

a = tf.constant(10)
b = tf.constant(32)
print(sess.run(a + b))
```

# MNIST（チュートリアル）を実行
input_data.py をダウンロード
https://github.com/tensorflow/tensorflow/blob/r0.9/tensorflow/examples/tutorials/mnist/input_data.py

以下でMNISTのチュートリアルを実行

```py:mnist.py 
# -*- coding: utf-8 -*-
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf

# MNISTのダウンロードと読み込み
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

# プレースホルダーを生成
x = tf.placeholder(tf.float32, [None, 784])
y_ = tf.placeholder(tf.float32, [None, 10])

# 重み(W) と バイアス(B) を生成し、初期値(0)を入れる
w = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

# SoftMax関数を使用して x, w, b から y を求める
y = tf.nn.softmax(tf.matmul(x, w) + b)

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

# 初期化
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)

# トレーニング開始
for i in range(1000):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

# トレーニングしたモデルの評価
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))

# MNISTのテストデータを使用して、精度を求める。
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
```

# 参考URL
https://www.tensorflow.org/
Node.jsのロガー log4jsでsyslogのAppenderを追加する

# はじめに

Node.jsのロギングツールのlog4jsはJavaのlog4jにちなんで名付けられたようです。たまたまlog4jsを使うアプリを触ったのですが、ロギングされた結果をsyslogに飛ばしたくなりました。
log4jではsyslogのAppenderを追加することができるのですが、log4jsはsyslogのAppenderがありません。

# log4jsのsyslog Appender

log4jsからsyslogへログを流すsyslog Appenderはいくつかあるようです。今回はMITライセンス表記されていて使いやすそうな[log4j-syslog-appender](https://www.npmjs.com/package/log4js-syslog-appender)を利用しました。以下のコマンドでインストールします。

```bash
$npm install log4js-syslog-appender -save
```

log4jsの設定ファイルに以下の設定を行います。今回は[npmのページ](https://www.npmjs.com/package/log4js-syslog-appender)に記載のある設定を記載しました。このページではappenderが１つの設定になっていますが、appendersとリストで渡すことで、複数のAppenderを設定することができます。syslogで他のサーバにログを転送しつつ、ローカルのファイルに保存することもできます。

```json:log4js.conf
"appenders": [
                 {
	             "type": "log4js-syslog-appender",
	             "tag": "YOUR LOG TAG",
	             "facility": "local0",
	             "hostname": "localhost",
	             "port": 514,
	             "transport": "UDP"
                  }
 ]
```

また、log4js-syslog-appenderはUDPの他にsocket(TCP?)での転送もできるようです。

上記設定後、localhostのsyslog.confまたはrsyslog.confの設定を変更しましょう。
localhostが転送先のサーバになっていれば転送先のサーバに設定します。
私は一度ローカルのrsyslogサーバに送り、ログを集約し、そこから転送先のサーバに転送するように設定し検証しました。
raspberryPi 2 で無線 LAN接続するメモ

#はじめに
RaspberryPi2を入手したのでハードウェアの加工があまり必要なく、かつやりたいことは何かということで、無線LAN接続を試みました。Raspberrypi3を使えば良いのかもしれませんが、小さなUSBドングルで済むのとすでにRaspberrypi2を持ち合わせていたので、というのが理由です。
#環境
* ハードウェア・・・RaspberrPi2
* WLANアダプタ・・・ELECOM WDC-150SU2MWH

* Kernelのバージョン　Linux raspberrypi 4.4.11+

#動作するまでにやったこと
1. ソフトのアップデート
２. WLANの設定
３. WLANの設定でハマって治す


#やること詳細

##1.ソフトのアップデート
パッケージの新しいものがあるかもしれないので、アップデートしておきます。
```sudo apt-get update && sudo apt-get upgrade```
これは少し時間がかかりました。またYES/NOの確認を取ってくる場合がありますので、放置していたらそこで止まっていたりします。

##2.WLANの設定
1. 無線LANモジュールが認識されているか確認する
使おうとしている無線LANモジュールはUSB接続のものです（ELECOM WDC-150SU2MWH）。これがRaspberrPiでデバイスとして認識されているか確認します。
2. wpa_passphraseコマンドでパスワードを暗号化する

`wpa_passphase [SSID][PASSWORD]`

このコマンドを打つと結果

 ``` 
network={
	ssid=”(SSID)”
	#psk=”(PASSWORD)”
	psk=xxxxxxx……………………..xxxxx
}
 ```

となります。このssidとpskをコピーして控えておきます。

次に /etc/wpa_supplicant/wpa_supplicant.conf ファイルの最後に以下追加します。

```
network={
　　　　　　　　　　　　　　　　ssid=”(SSID)”
        #psk=”(PASSWORD)”
        psk=xxxxxxx……………………..xxxxx
        key_mgmt=WPA-PSK 
        proto=RSN 
        pairwise=CCMP 
        group=CCMP 
}
```

##３.WLANの設定でハマって治す
これで動くと思っていたら動かなくて色々試行錯誤したところ、イコールとカッコの間にスペースを入れたらダメなようです。

```
NG: network = { ...
OK: network={...
```
スペースを消したら動き出しました。
これで1日つぶれました。。。
key_mgmtは認証方式、今回はWPA2-PSK方式です。
この辺りは[こちらのサイト](http://www.youchikurin.com/blog/2007/06/linuxlan_1.html)を参考にさせていただきました。

これでifconfigで確認したところしっかりとwlan0が動いていました。

```
pi@raspberrypi:~ $ ifconfig
........

wlan0     Link encap:Ethernet  HWaddr bc:5c:4c:2c:71:38  
          inet addr:192.168.11.8  Bcast:192.168.11.255  Mask:255.255.255.0
          ......
          RX bytes:1614937 (1.5 MiB)  TX bytes:237812 (232.2 KiB)
```

実際にwebにもつながりました。
gulp.registryを使ってタスクの分割をしよう

今までgulpタスクの分割は`read-dir`とかを使用してやっていた方も多いと思います。(僕は分割していませんでした)

gulp4.0では`gulp.registory`と`undertaker-registry`というものでカスタムタスクの登録ができるようになっていたので、とりあえずタスクをファイルごとに分割してみました。


gulp4.0についての記事はこちらが参考になります。
[gulp4.0 migration guide](http://qiita.com/joe-re/items/e04010ed03826fb94a16)

※ gulp4.0とes6を実行できる環境を作ってください。今回はその説明は割愛します。

## タスク分割の流れ

### 1: タスクを書く
`gulp`と`undertaker-registry`を読み込んで、タスクを次のように書きましょう。

今回は面倒なのでタスクを書いていないのですが、`console.log()`の部分にgulpのタスクを書けば大丈夫そうです。

```js:TestTask.js
import gulp from 'gulp';
import Registry from 'undertaker-registry';

class TestTask extends Registry {

  init() {

    gulp.task('test', callback => {
      return console.log('やったぜ。');
    });

  }

};

module.exports = new TestTask();
```

ファイルごとにgulpプラグインを個別importする必要があるので、各タスクに使用しているプラグインを把握しやすくなります。

### 2: 読み込む

```js:gulpfile.babel.js
import gulp from 'gulp'
import TestTask from 'TestTask.js'

// カスタムタスクを登録
gulp.registry(TestTask);

gulp.task('default', gulp.series('test'));
```

### 3: 試す

```bash
$ gulp
> gulp-setting-for-myself@1.0.0 start /Users/nyawach/Documents/private/websites/gulp-setting
> gulp

[22:12:19] Requiring external module babel-register
[22:12:19] Using gulpfile ~/Documents/private/websites/gulp-setting/gulpfile.babel.js
[22:12:19] Starting 'default'...
[22:12:19] Starting 'test'...
やったぜ。
[22:12:19] Finished 'test' after 1.06 ms
[22:12:19] Finished 'default' after 2.84 ms
```


やったぜ。

ちなみに、ツリー構造は以下のようになります。

```bash
$ gulp -T
[22:21:54] Requiring external module babel-register
[22:21:54] Tasks for ~/Documents/private/websites/gulp-setting/gulpfile.babel.js
[22:21:54] ├─┬ default
[22:21:54] │ └─┬ <series>
[22:21:54] │   └── test
[22:21:54] └── test
```

## さいごに
gulp4.0から新しく追加された機能などもどんどん利用していきたいですね！
Ansible2.1が走りきっても終了しない(未解決)

Ansible2.1が終了しなくて悩んだ
---

最初にansibleで`git clone --mirror`したくて悩んでたら、[git_config module](http://docs.ansible.com/ansible/git_config_module.html)が出ていたので、
`git モジュールの　bare オプション`+`git_confiでmirror設定追加` を試してみた。
試してみたが、動かなくて確認するとgit_confiモジュールは`v2.1`からだった、。
*早速アップデートするよね。*

そしたら`git clone --mirror`はできたけど、なんか終了しない...(下記の状態でプロンプトが帰ってこない)

```bash
PLAY RECAP *********************************************************************
10.100.10.253              : ok=21   changed=1    unreachable=0    failed=0
```

試しに`strace`してみたらずっと変なのでてるよね

```bash
$ sudo strace -p 6852
poll([{fd=6, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 100})   = 0 (Timeout)
poll([{fd=6, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 100})   = 0 (Timeout)
``` 

ansibleのpromptで `ctrl+C` するとだらだろエラー

```bash
PLAY RECAP *********************************************************************
10.100.10.253              : ok=21   changed=1    unreachable=0    failed=0

Error in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "/usr/lib64/python2.7/atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "/usr/lib64/python2.7/multiprocessing/util.py", line 325, in _exit_function
    p.join()
  File "/usr/lib64/python2.7/multiprocessing/process.py", line 145, in join
    res = self._popen.wait(timeout)
  File "/usr/lib64/python2.7/multiprocessing/forking.py", line 154, in wait
    return self.poll(0)
  File "/usr/lib64/python2.7/multiprocessing/forking.py", line 135, in poll
    pid, sts = os.waitpid(self.pid, flag)
KeyboardInterrupt
Error in sys.exitfunc:
Traceback (most recent call last):
  File "/usr/lib64/python2.7/atexit.py", line 24, in _run_exitfuncs
    func(*targs, **kargs)
  File "/usr/lib64/python2.7/multiprocessing/util.py", line 325, in _exit_function
    p.join()
  File "/usr/lib64/python2.7/multiprocessing/process.py", line 145, in join
    res = self._popen.wait(timeout)
  File "/usr/lib64/python2.7/multiprocessing/forking.py", line 154, in wait
    return self.poll(0)
  File "/usr/lib64/python2.7/multiprocessing/forking.py", line 135, in poll
    pid, sts = os.waitpid(self.pid, flag)
KeyboardInterrupt
```

わからん...私には読み解く力なんてありません。
ただふと、ansibleだったか定かではないですが、tmux上で実行すると不具合が起こる的な記事を読んだことを思い出したのでtmuxをデタッチしてから実行してみると...


すんなりと終わった...

```
PLAY RECAP *********************************************************************
10.100.10.253              : ok=21   changed=1    unreachable=0    failed=0

$
```

つまり、ansible2.1でプロンプトが帰ってこない人でtmux使ってたなら抜けてみよう！
解決策など何も出してないですが、ご存知の方いらっしゃいましたらコメントなどいただけると幸いです。

ちなみに試してた環境は以下

```bash
# amazone linuxです
$ uname -a
Linux ip-10-255-0-194 4.4.8-20.46.amzn1.x86_64 #1 SMP Wed Apr 27 19:28:52 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$
$ ansible --version
ansible 2.1.0.0
  config file = /home/momin/ansible/ansible.cfg
  configured module search path = Default w/o overrides
$
$ tmux -V
tmux 1.8
```
moduleで作るカウンター

```:javascript
var counterModule =(function(){
  var count_num = 0;
  return {
    count: function(){
      count_num++;
    },
    show: function(){
      console.log(count_num);
    },
    now: function(){
      return count_num;
    }
  }
})();


setInterval(intervalFunction, 1000)

// メインとなる関数
function intervalFunction(){
  counterModule.count();

  if(counterModule.now() > 10){
    //10秒すぎたらなんらかの処理
  }
}

```

即時関数でcounterModuleに各メソッド(count, show, now)を代入する。

`counterModule.count()`をsetInterval()で実行することで、カウントアップされる。

## ポイント1
変数counterModuleに対して即時関数を代入するようにしている。これは、即時関数を利用することにより、変数（この場合はcount_num）がスコープ外から上書いたり、上書かれたりすることを防いでいる。

```
即時関数とは...
定義とともに実行される関数のこと。
```
## ポイント2
変数counterModuleに代入している即時関数中では、returnで

```:javascript
{
    count: function(){
      count_num++;
    },
    show: function(){
      console.log(count_num);
    },
    now: function(){
      return count_num;
    }
}
```
というオブジェクトを返すようにしている。
これは単純な連想配列であるが、javascriptにおいては関数もオブジェクトであるため、valueに関数オブジェクトである`function(){}`を入れることが可能である。

実際、countModuleには上記のvalueとして関数オブジェクトをもつオブジェクトが代入されるので、
`countModule.count()`でアクセスすることができ、この呼び出しにより`function(){}`が実行される。

---

ご指摘ございましたら、宜しくお願いします。
Mongo シェルから他言語から読めるJSONを出力する

jsonなのに、他言語から読めないとかおまえ何いってんだ、と思うかもしれないが、mongoのシェル内でオブジェクトを評価すると

```
> db.test.find()
{ "_id" : ObjectId("5756c7f021baef6e3efc34c2"), "date" : ISODate("2016-06-07T13:11:12.690Z") }
```

のような出力になる。

printjson という素敵な組み込み関数があるが、その結果がこう

```
> printjson(db.test.find().toArray())
[
        {
                "_id" : ObjectId("5756c7f021baef6e3efc34c2"),
                "date" : ISODate("2016-06-07T13:11:12.690Z")
        }
]
```

`ObjectId` ,`ISODate` というのは、mongoのシェル内でコピペとかするにはそのまま使えてよろしいんだけど、 json としてはそのまま使えない。

そういう時は、

```js
> ObjectId.prototype.tojson = function() { return '"' + this.valueOf() + '"'; };
> Date.prototype.tojson = function() { return '"' + this.toISOString() + '"'; };
```

としておくと、結果を普通のjsonにできる、という小技でした。

```
> printjson(db.test.find().toArray())
[
        {
                "_id" : "5756c7f021baef6e3efc34c2",
                "date" : "2016-06-07T13:11:12.690Z"
        }
]
```
【PHP】追加したモジュールが読み込めない時に疑うポイント

追加したモジュールが読み込めない
つまり以下のようなエラーが発生する時である

```
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/XXXXXX.so' - /usr/lib64/php/modules/XXXXXX.so: cannot open shared object file: No such file or directory in Unknown on line 0
```

# モジュールが追加されているかを確認

エラーで指定されている場所にモジュールがあるかを確認してみる。

```
[root@test-web ~]# ll /usr/lib64/php/modules/ | grep XXXXXX
-rwxr-xr-x 1 root root  346117 Jun  7 10:14 XXXXXX.so
[root@test-web ~]# 
```

### 番外編:php.iniの探し方

php --iniコマンドで、一番上に書かれているphp.iniが読まれている。
今回の場合は'/etc/php.ini'が該当する

```
[root@test-web ~]# php --ini
Configuration File (php.ini) Path: /etc
Loaded Configuration File:         /etc/php.ini
Scan for additional .ini files in: /etc/php.d
Additional .ini files parsed:      /etc/php.d/bz2.ini,
/etc/php.d/calendar.ini,
/etc/php.d/ctype.ini,
/etc/php.d/curl.ini,
/etc/php.d/dom.ini,
/etc/php.d/exif.ini,
/etc/php.d/fileinfo.ini,
/etc/php.d/ftp.ini,
/etc/php.d/gettext.ini,
/etc/php.d/gmp.ini,
/etc/php.d/iconv.ini,
/etc/php.d/json.ini,
/etc/php.d/mbstring.ini,
/etc/php.d/mcrypt.ini,
/etc/php.d/mysqlnd.ini,
/etc/php.d/mysqlnd_mysqli.ini,
/etc/php.d/opcache.ini,
/etc/php.d/pdo.ini,
/etc/php.d/pdo_mysqlnd.ini,
/etc/php.d/pdo_sqlite.ini,
/etc/php.d/phar.ini,
/etc/php.d/posix.ini,
/etc/php.d/shmop.ini,
/etc/php.d/simplexml.ini,
/etc/php.d/sockets.ini,
/etc/php.d/sqlite3.ini,
/etc/php.d/sysvmsg.ini,
/etc/php.d/sysvsem.ini,
/etc/php.d/sysvshm.ini,
/etc/php.d/tokenizer.ini,
/etc/php.d/xml.ini,
/etc/php.d/xml_wddx.ini,
/etc/php.d/xmlreader.ini,
/etc/php.d/xmlwriter.ini,
/etc/php.d/xsl.ini,
/etc/php.d/zip.ini

[root@test-web ~]# 
```

## grepで出てきた場合

php.iniのextension_dirの指定が抜けていないかを確認
コメントアウトされている場合は以下のように記述

```php.ini
extension_dir = "/usr/lib64/php/modules"
```

## grepで出てこなかった場合

findコマンドで他の場所にないかを探してみる

```
[root@test-web ~]# find / -name 'XXXXXX.so'
/usr/local/php-5.5.14/lib/php/extensions/no-debug-non-zts-20121212/XXXXXX.so
[root@test-web ~]# 
```

php.iniでの読み込ませる際にディレクトリごと指定してみる。

```
extension=/usr/local/php-5.5.14/lib/php/extensions/no-debug-non-zts-20121212/XXXXXX.so
```

# php.iniを操作したら必ずやること

## httpdプロセスの再起動

```
[root@test-web ~]# /etc/init.d/httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]
[root@test-web ~]# 
```
ROS_22:OpenNI2 Driver Install

#参考
http://demura.net/robocup/11761.html
を参考にした。
openniはKinectでも使えるが、openni2はXtion用の軽いバージョン

#準備
##xtionのファームウエアを最新にする。
Windows8.1で行った。
Driverが必要なのでWindows8にある
OpenNI Package Version 20.4.4.0
をダウンロードしてCDを作成してインストールしたあとで、
FW 5.8.22
をダウンロードして実行した。
https://www.asus.com/jp/support/Download/19/11/0/3/hahEFPMWY9UVDL7z/36/

#Install
jadeを使用しているので

```
$ sudo apt-get install ros-jade-rgbd-launch ros-jade-openni2-camera ros-jade-openni2-launch
```
#実行
```
$ roslaunch openni2_launch openni2.launch
```
roscoreもroslaunchから起動される。
`$ rqt`を実行して
メニューから Plugins -> Visualization -> Image View
で、/camera/rgb/image_rawでRGBカメラが表示された。
DSL Study in ruby4


We use method.

```ruby:events.rb
@a_target_sale = 0
@j_target_sale = 0
@a_sale = 0
@j_sale = 0

set_target_sales "set target_sales in America" do
  @a_target_sale = 50
end

set_target_sales "set target_sales in Japan" do
  @j_target_sale = 50
end

select_sales "select_sales in America" do
  @a_sale = 50
end

select_sales "select_sales in Japan" do
  @j_sale = 200
end

event "sales is enough in America" do
  @a_target_sale < @a_sale
end

event "sales is enough in Japan" do
  @j_target_sale < @j_sale
end

event "sales is soso in America" do
  @a_target_sale == @a_sale
end

event "sales is soso in Japan" do
  @j_target_sale == @j_sale
end

event "sales is not enough in America" do
  @a_target_sale > @a_sale
end

event "sales is not enough in Japan" do
  @j_target_sale > @j_sale
end
```

```ruby:setup.rb
def event(description, &block)
  @events << {:description => description, :condition => block}
end

def select_sales(description, &block)
  @setups << {:description => description, :condition => block}
end

def set_target_sales(description, &block)
  @target_sales << {:description => description, :condition => block}
end

def each_event(&block)
  @events.each do |event|
    puts "----------START event: #{event[:description]}----------"
    block.call event
  end
end

def each_setup
  @setups.each do |setup|
    puts "#{setup[:description]}"
    setup[:condition].call
  end
end

def each_target_sale
  @target_sales.each do |target_sale|
    puts "START target_sale: #{target_sale[:description]}"
    target_sale[:condition].call
  end
end
```

```ruby:act.rb
@events = []
@setups = []
@target_sales = []
load 'setup.rb'
load 'events.rb'

each_event do |event|
  each_target_sale
  each_setup
  puts "ALERT: #{event[:description]}" if event[:condition].call
end
```

```bash
ruby act.rb
```

Here are result.

----------START event: sales is enough in America----------
START target_sale: set target_sales in America
START target_sale: set target_sales in Japan
select_sales in America
select_sales in Japan
----------START event: sales is enough in Japan----------
START target_sale: set target_sales in America
START target_sale: set target_sales in Japan
select_sales in America
select_sales in Japan
ALERT: sales is enough in Japan
----------START event: sales is soso in America----------
START target_sale: set target_sales in America
START target_sale: set target_sales in Japan
select_sales in America
select_sales in Japan
ALERT: sales is soso in America
----------START event: sales is soso in Japan----------
START target_sale: set target_sales in America
START target_sale: set target_sales in Japan
select_sales in America
select_sales in Japan
----------START event: sales is not enough in America----------
START target_sale: set target_sales in America
START target_sale: set target_sales in Japan
select_sales in America
select_sales in Japan
----------START event: sales is not enough in Japan----------
START target_sale: set target_sales in America
START target_sale: set target_sales in Japan
select_sales in America
select_sales in Japan
DSL Study in ruby3


If there are 2 cases like sales in America and Japan.
How should we implement it?

```ruby:events.rb
@a_target_sale = 0
@j_target_sale = 0
@a_sale = 0
@j_sale = 0

set_target_sales "set target_sales in America" do
  @a_target_sale = 50
end

set_target_sales "set target_sales in Japan" do
  @j_target_sale = 50
end

select_sales "select_sales in America" do
  @a_sale = 50
end

select_sales "select_sales in Japan" do
  @j_sale = 200
end

event "sales is enough in America" do
  @a_target_sale < @a_sale
end

event "sales is enough in Japan" do
  @j_target_sale < @j_sale
end

event "sales is soso in America" do
  @a_target_sale == @a_sale
end

event "sales is soso in Japan" do
  @j_target_sale == @j_sale
end

event "sales is not enough in America" do
  @a_target_sale > @a_sale
end

event "sales is not enough in Japan" do
  @j_target_sale > @j_sale
end
```

```ruby:setup.rb
def event(description, &block)
  @events << {:description => description, :condition => block}
end

def select_sales(description, &block)
  @setups << {:description => description, :condition => block}
end

def set_target_sales(description, &block)
  @target_sales << {:description => description, :condition => block}
end
```

```ruby:act.rb
@events = []
@setups = []
@target_sales = []
load 'setup.rb'
load 'events.rb'

@events.each do |event|
  puts "----------START event: #{event[:description]}----------"
  @target_sales.each do |target_sale|
    puts "START target_sale: #{target_sale[:description]}"
    target_sale[:condition].call
  end
  @setups.each do |setup|
    puts "#{setup[:description]}"
    setup[:condition].call
  end
  puts "ALERT: #{event[:description]}" if event[:condition].call
end

```

```bash
ruby act.rb
```

Here are result.

----------START event: sales is enough in America----------
START target_sale: set target_sales in America
START target_sale: set target_sales in Japan
select_sales in America
select_sales in Japan
----------START event: sales is enough in Japan----------
START target_sale: set target_sales in America
START target_sale: set target_sales in Japan
select_sales in America
select_sales in Japan
ALERT: sales is enough in Japan
----------START event: sales is soso in America----------
START target_sale: set target_sales in America
START target_sale: set target_sales in Japan
select_sales in America
select_sales in Japan
ALERT: sales is soso in America
----------START event: sales is soso in Japan----------
START target_sale: set target_sales in America
START target_sale: set target_sales in Japan
select_sales in America
select_sales in Japan
----------START event: sales is not enough in America----------
START target_sale: set target_sales in America
START target_sale: set target_sales in Japan
select_sales in America
select_sales in Japan
----------START event: sales is not enough in Japan----------
START target_sale: set target_sales in America
START target_sale: set target_sales in Japan
select_sales in America
select_sales in Japan