OmniAICreator/Qiita-1.07M huggingface dataset:
nyagosスクリプト解説 - 逆クォートによるコマンド出力展開編(backquote.lua)

標準で搭載されている（=`nyagos.d\`以下に置かれている）ので、nyagos.exe 組込み機能かと思われているかもしれないが、nyagos の「逆クォートによるコマンド出力の展開機能」はスクリプトとフックで実現されている。

nyagos.filter はコマンドライン全部を加工することができるフィルター関数を代入することができるフックである。[nyagos.d\backquote.lua](https://github.com/zetamatta/nyagos/blob/master/nyagos.d/backquote.lua) では、これを利用して逆クォート展開を実現している。

```Lua:backquote.lua
local orgfilter = nyagos.filter
nyagos.filter = function(cmdline)
    if orgfilter then
        local cmdline_ = orgfilter(cmdline)
        if cmdline_ then
            cmdline = cmdline_
        end
    end
```

nyagos.filter には一つの関数しか代入できないので、最初に行うのは、まず、元々入っていた nyagos.filter の関数のバックアップを取っておき、新関数側でコマンドラインの加工をする前に元々代入されていた関数を先に呼び出してやるということになる。nyagos.filter は nil を返す時は、加工をキャンセルすることを示すので、そのあたりも処理してやる必要がある。**（が、今考えると、わざわざ if 文をつらつら書かなくとも「`cmdline = (orgfilter and orgfilger(cmdline)) or cmdline`」とだけ書けばよかったのだったー）**

```lua
    return string.gsub(cmdline,'`([^`]*)`',function(m)
        local r = nyagos.eval(m)
        if not r then
            return false
        end
        r = nyagos.atou(r)
        r = string.gsub(r,'[|&<>!]',function(m)
            return string.format('%%u+%04X%%',string.byte(m,1,1))
        end)
        return string.gsub(r,'%s+$','')
    end)
end
```

次に本番の処理を行う。

nyagos.eval は「かなりおなじみ」の関数だが、一つだけ注意する点がある。それは戻り値が現在のコードページの文字列であるということだ。これは「**コマンドの出力がテキストであるとは限らないので、下手に UTF8 に変換できない**」という **nyagos.eval の仕様**なので、ご理解いただきたい。

しかしながら、nyagos のコマンドライン自体は UTF8 なので、さすがに現在のコードページ文字列をそのまま処理するわけにはいかない。ということで、UTF8 とコードページ文字列を相互変換する関数 nyagos.atou と nyagos.utoa で変換してから、逆クォート部分と置き換えている**（つまり、逆クォートの中で、現在のコードページで表現できない文字が出力されるとゴニョゴニョ）**

あと、backquote.lua では、逆クォートの他に %u+NNNN% というユニコードリテラルの展開もやっている**（とソースを見て思い出した）**。

以上、だいたいお分かりいただけただろうか
ubuntuでpip installしたらUnicodeDecodeErrorがおきた

# 問題
Ubuntuでpip installでパッケージインストールする時にUnicodeDecodeErrorが起きました。
`'ascii' codec can't decode 以下略`とのこと。

# 原因と対策
カレントディレクトリのパスに日本語が入っていたので日本語が無いパスに移動して再度pip installしたら普通に動いてくれました。めでたしめでたし。
自分専用メモ：Docker 複数コンテナ管理の悩み

自分専用メモ。

# 複数コンテナ管理における自分勝手な要件

1. 複数コンテナのビルド、デプロイ、依存関係、起動、停止をまとめて管理・制御したい
2. 公式イメージとプライベートレジストリを併用したい
1. ビルド/起動/停止前後などのイベントでスクリプトを流したい
1. いっぺんにいろんなことをやらない（自動化しすぎない）
1. Docker ホストには役割を振り、それに応じた分岐をしたい（本番、テスト、開発など）
2. 大規模なオーケストレーションとかいらないので、まずは小規模で

# 現状の複数コンテナ管理ツール

## docker-compose

http://docs.docker.com/compose/cli/

イメージの push ができない。基本、デプロイ専用という印象。細かいことをさせてくれない。きわめて発展途上。

## maestro-NG

https://github.com/signalfuse/maestro-ng

イメージの push ができず docker-compose と同じような立ち位置だが、細かいことは結構できるかも。テスト環境をさくっと立ち上げたいと言った用途に。

## crane

https://github.com/michaelsauter/crane

なかなか良いのだが、ビルド前後のイベントはない。また、設定ファイル中で Dockerfile を指定してしまうと、crane lift する時に必ずビルドが走る仕様となっている。作者は「ビルドは分離したほうが良い気がしてきた」と言っており、V2 あたりで導入される見込み。環境依存スクリプトの概念もない。期待したいが。。。

# ないものはないので、理想ツールを夢想する

仮に、ツールの名前を dcon とする。

1. Docker ホストの役割設定（"prod" とか "test" とか任意文字列）: `$ dcon set [-g] host-role="HOST-ROLE"`
2. カレントタグの設定（ビルド/push/pull のターゲットになる）: `$ dcon set [-g] current-tag="TAG-NAME"`
3. 各種設定値確認: `$ dcon set`
2. イメージのビルド: `$ dcon b[uild]`
2. イメージの push: `$ dcon push`
3. イメージのビルド & push: `$ dcon pub[lish]`
3. イメージの pull: `$ dcon pull`
3. コンテナの起動: `$ dcon start`
4. イメージの pull & 起動（イメージがなければエラー終了）: `$ dcon up`
4. コンテナの停止: `$ dcon stop`
5. コンテナの削除: `$ dcon rm`
6. イメージの削除: `$ dcon rmi`
6. ステータス確認: `$ dcon stat`

オプション類：

+ -g: グローバル設定(Daemon labels でも良いが、これなら再起動不要ですぐに切り替え可能）
+ -f: 強制
+ -d: デバッグ出力
+ -v: バージョン表示
+ -h: 使い方表示

dcon.yaml に設定を書く。ひとまず crane.yaml と同じで良い気がする。

```yaml:docn.yaml
containers:
    apache:
        image: some-apache-image:latest
        run:
            volumes-from: ["app"]
            publish: ["80:80"]
            link: ["mysql:db", "memcached:cache"]
            detach: true
    app:
        dockerfile: app
        image: michaelsauter/app
        run:
            volume: ["app/www:/srv/www:rw"]
            detach: true
    mysql:
        image: mysql
        run:
            env: ["MYSQL_ROOT_PASSWORD=mysecretpassword"]
            detach: true
    memcached:
        image: tutum/memcached
        run:
            detach: true  
```
EdisonでInfluxDBを使う


# 前提

* ubilinux (Debian Wheezy 7.8)
* InfluxDB 0.8.8

# InfluxDBのインストール

[公式サイトのインストール手順](https://influxdb.com/docs/v0.9/introduction/installation.html)にi386 (i686)版が無いので探した。公式なファイルは見つけられなかったので、[チケットの情報](https://github.com/influxdb/influxdb/issues/1217)を頼りにS3に置いてあるファイルを直接ダウンロードしてインストール。インストール時も`package architecture (i686) does not match system (i386)`というエラーが出るので `--force-architecture`を付与。

```bash
wget https://s3.amazonaws.com/influxdb/influxdb_0.8.8_i686.deb
dpkg -i --force-architecture influxdb_0.8.8_i686.deb
```

InfluxDBをスタートする。

```bash
/etc/init.d/influxdb start
```

InfluxDBは8083番ポートをバインドするのでブラウザからアクセス。

![kobito.1437540135.043145.png](https://qiita-image-store.s3.amazonaws.com/0/29860/9daf1938-74af-afd0-4b6c-d9184b429c52.png "kobito.1437540135.043145.png")


# Pythonから書き込んでみる

InfluxDBが公開している[公式のinfluxdb-pythonモジュール](https://github.com/influxdb/influxdb-python)を使用する。

```bash
pip install influxdb
```

```python:influxdb_test.py
# 先ほどインストールした32bit環境用のInfluxDBは0.8.8なので、
# influxdb08モジュールのクライアントを使用する。
from influxdb.influxdb08 import InfluxDBClient

json_body = [
    {
        "name": "cpu_load_short",
        "columns": ["time", "value"],
        "points": [
            [1382819388, 0.64]
        ]
    }
]

# 接続先を決めて書き込み
client = InfluxDBClient('127.0.0.1', 8086, 'root', 'root', 'example')
client.write_points(json_body)

# 読み込んで表示
result = client.query('select value from cpu_load_short;')
print("Result: {0}".format(result))
```
RspecでUninitialized Constantが出た際に

例えば、

```rb
require 'spec_helper'

describe Api::V1::BaseApiController do
  it "hoge" do
  end
end
```

こんなテストをしたいとき、UninitializedConstantエラーが出た場合。

spec_helper.rbに以下を追記すると解決しました。

```rb
require File.expand_path("../../config/environment", __FILE__
```
React Native 勉強メモ

React Nativeについて勉強したことを随時追記するメモ。

# React Nativeとは？

## 参考

Facebookのblog。なんでReact Nativeを作ったか、について書いてる。
https://code.facebook.com/posts/1014532261909640/react-native-bringing-modern-web-techniques-to-mobile/

http://jlongster.com/First-Impressions-using-React-Native

https://www.youtube.com/watch?v=KVZ-P-ZI6W4
https://www.youtube.com/watch?v=7rDsRXj9-cU

# サンプルが置いてある場所

https://rnplay.org/

# その他リンク

## Nativeのモジュールを書くときにSwiftを使う

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

http://kevin-deleon.com/2015/05/custom-react-native-components-in-swift/
FirefoxでFacebookのコメント欄等を表示・非表示切り替えた時、表示されなくなる現象


facebookのコメント欄を自分のサイトの個別ページに埋め込む事があると思いますが、今回要件として、それをユーザーの操作によって、表示非表示切り替えたいというものがありました。
さっくり対象のdomをjQueryからshow()やhide()を呼び出していましたが、
firefoxで再描画されません。

結論から言うと、

```javascript
FB.XFBML.parse() //全XFBML再描画
FB.XFBML.parse(document.getElementByid("comments-block")) //対象のDOMのXFBML再描画
```

をshow()後に呼び出す事でで解決しました。

実際に描写されているYahooの以下のURLを見て、
http://news.yahoo.co.jp/pickup/6151920
ソースコード参考にさせてもらっていたら、上のコマンドを呼び出してあって、ようやく合点がいきました……。


参考：
https://developers.facebook.com/docs/reference/javascript/FB.XFBML.parse
OpsWorks上にGitlabを建てる


# 概要
OpsWorks 上に Gitlab を建てる機会があったのでその時のメモです。

# 手順
ざっくり以下の4手順で構築可能です。

1. Gitlab AMI から EC2 インスタンスを起動する
2. ドメインの設定を DNS と Gitlab に行う
3. EC2 インスタンスを OpsWorks 配下にする
4. SES を使い迷惑メールにならないようにする（オプション）

## Gitlab AMI から EC2 インスタンスを起動する
[GitLab CE AWS AMI](https://about.gitlab.com/aws/)にある AMI を使いインスタンスを立ち上げます。

リージョンを Gitlab のページから選択すると AMI ID が表示されるので c4.large でインスタンスを起動します。

AMI の仮想化方式が hvm になっているため、c4.large などのその方式に適応したインスタンスを選ぶ必要があります。
Gitlab のページで c4.large を推奨していたためそちらを選択しました。

インスタンス起動後、インスタンスにログインし`sudo gitlab-ctl reconfigure`を実行します。
ログインユーザは Gitlab のページにある通り ubuntu です。

するとなんと！もうアクセスできるようになります！

凄い……。

## ドメインの設定を DNS と Gitlab に行う
外からアクセスするためにインスタンスにドメインを設定します。

ドメインがない場合はドメインを購入しておきます。
次に必要であれば Hosted Zone を作成します。
そして Created Record Set でドメインを割り振ります。

ここまでの手順は Route 53 を何も考えずにポチポチするだけでできます。

### Gitlab へドメインを設定する
正常に動作させるためには、Gitlab 自身が参照する URL を変更する必要があります。

Gitlabの設定ファイルは`/etc/gitlab/gitlab.rb`だそうです。
ここの`external_url`を変更すれば OK です。

```bash
sudo vi /etc/gitlab/gitlab.rbexternal_url # 設定変更
sudo gitlab-ctl reconfigure # 設定反映
```

これで Gitlab の基本的な設定は完了です。
設定ファイルの変更とかは Cookbook で管理したくなりますね！

## EC2 インスタンスを OpsWorks 配下にする
まずはスタックを作成し、Custom Layer を追加します。
Layer の名前は Gitlab App Serverとしました。

そして OpsWorks 上で Register Instances を行います。

気をつけるべき点はユーザ名が ubuntu である点のみです。
最後に Regster コマンドを AWS CLI から叩くときに指定する必要があります。

ぽちぽちして登録実行！

以上、終了！

## SES を使い迷惑メールにならないようにする（オプション）
アカウントなどを作成した時、ユーザにメールが送信されるのですが、現在のままだと Gmail などでは迷惑メールとして処理されてしまします。

これを回避しようと思った場合、SES という Amazon のメール配信サービスを使うと良いそうです。
迷惑メールとして扱われるのを回避する必要がある場合はこちらを使おうと思います。

今回は設定しませんでした。

# 失敗談
[cookbook-omnibus-gitlab-cookbook](https://gitlab.com/gitlab-org/cookbook-omnibus-gitlab/blob/master/README.md) を使って自動で作れないか、きちんと調べることなく試してみましたが、ダメでした(´・ω・｀)

[cookbook-gitlab-opsworks](https://gitlab.com/gitlab-com/cookbook-gitlab-opsworks) というのもありましたが、こちらはどうやら既にメンテもされてなく、deprecated だそうだったのでそちらには触っていません。

## 詳細
[cookbook-omnibus-gitlab-cookbook](https://gitlab.com/gitlab-org/cookbook-omnibus-gitlab/blob/master/README.md) というのを見つけたため、こちらを用いて OpsWorks 上に Gitlab が簡単構築できないかを試してみます。

まずは何も考えずにスタックの Custom JSON に以下を追記します。

```json
{
  "omnibus-gitlab": {
    "package": {
      "repo": "gitlab/gitlab-ee",
      "name": "gitlab-ee",
      "version": "7.11.1~ee.omnibus-1"
    },
    "gitlab_rb": {
      "external_url": "http://gitlab.example.com"
    }
  }
}
```

スタックの Custom Cookbook に`https://gitlab.com/gitlab-org/cookbook-omnibus-gitlab.git`を指定します。

Rayers に Custom Layer を追加します。
名前は Gitlab App Server としました。

Custom Chef Recipes の Setup に`omnibus-gitlab::default`と`omnibus-gitlab::backup_cron_job`を追加してみます。

いざ実行！

``ERROR: undefined method `allow_downgrade' for Chef::Resource::Package``で落ちました。無念。

Chef の Version が 11.10 なのが原因なのでしょうか？それとも何か設定不足……？

必要なパッケージが足りないっぽいエラーですが、Chef も OpsWorks も初心者過ぎてどうしていいかわからず、調べていたら最初に紹介した AMI を見つけたので作業を中止しました。

そもそもその CookBook を OpsWorks でどう使うか、全く理解していないまま始めていたのがダメダメですね。

修行して出直してきます。

# まとめ
AMI 準備してくれてる Gitlab さん素敵！
AWS を使えば爆速で Gitlab が建設できちゃいます！

Chef 力あげたい！
CentOS7_ホスト名変更方法

# CentoS7のホスト名変更方法

通常インストールしたCentOS7 と EC2のAMIで提供されているCentOS7では、ホスト名変更が一部異なる。
EC2-AMIのCentOS7では、cloud-initサービスが起動時にホスト名を上書きしてしまい変更が反映されないので、
追加で対応が必要となります。

## CentOS7(通常)の場合

ホスト名変更(ホスト名　sv.example.com　にセット)

```shell-session
$ sudo hostnamectl set-hostname sv.example.com
```

確認

```shell-session
$ sudo hostnamectl                                                                                                                       
   Static hostname: sv.example.com
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 
           Boot ID: 
    Virtualization: xen
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-229.7.2.el7.x86_64
      Architecture: x86_64
```


## CentOS7(AMI)の場合

ホスト名変更(ホスト名　sv.example.com　にセット)

```shell-session
$ sudo hostnamectl set-hostname sv.example.com
```

上記、実行後、/etc/cloud/cloud.cfg ファイルを編集し、"- update_hostname" をコメントアウトします。
コメントアウトする事で、再起動時に、ホスト名が上書きされなくなります。

```shell-session
$ sudo vim /etc/cloud/cloud.cfg
```

```diff:/etc/cloud/cloud.cfg
- - update_hostname
+ # - update_hostname

```

確認

```shell-session
$ sudo hostnamectl                                                                                                                       
   Static hostname: sv.example.com
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 
           Boot ID: 
    Virtualization: xen
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-229.7.2.el7.x86_64
      Architecture: x86_64
```
以上となります。
sublime text > "}"が閉じられていない時、関数名の色が変わる

```txt:動作確認
Sublime Text2 
Windows 7Pro
```

Color Schemeは Monokai を使用。

関数の閉じかっこが入力間違いなどで足りない時、関数名の色が変わるのに気付いた。

- 黄緑色 : 上の関数がきちんと閉じられている
- 白色 : 上の関数がきちんと閉じられていない

リファクタリングしていく中で閉じ括弧を１つ忘れてこの症状が出た。コンパイルする前に間違いが気づけるのがよい。
aws-cliを使ってS3で静的コンテンツを公開する

※こちらの記事は[個人ブログ](https://tech.tsukapah.com/publish-your-site-on-s3-using-the-command-line/)に移行しました。

#前提
+ aws-cliが入っていること
+ IAMのパーミッションがいい感じに設定されていること
+ Credentialがconfigureもしくは環境変数に設定されてること 
	※ `--profile`使ってもいいです

+ default region が ap-northeast-1 で設定してあること
	※ 別にいいんだけど適宜いい感じに読み替えて下さい

+ Mac想定してるのでWindowsの人はEC2使うとかいい感じに読み替えるとかしてください
+ loggingの設定はこの手順には含まれてません

#手順
1. バケットの作成
2. コンテンツの設置
3. Static Website Hostingを有効にする
4. BucketPolicyを設定する

##バケットの作成
```bash:command
$ BUCKET_NAME=backetnonamae
$ aws s3 mb s3://${BUCKET_NAME}
```
```bash:出力結果
make_bucket: s3://backetnonamae/
```
##コンテンツの設置
コンテンツはカレントディレクトリにあるものとして記載しています。
置いてあるファイルは`/index.html`と`/css/index.css`の2つです。

```bash:command
$ SC_DIR=$(pwd)
$ aws s3 sync ${SC_DIR}/ s3://${BUCKET_NAME}/
```
```bash:出力結果
upload: css/index.css to s3://backetnonamae/css/index.css
upload: ./index.html to s3://backetnonamae/index.html
```
##Static Website Hostingを有効にする
```bash:command
$ aws s3 website s3://${BUCKET_NAME} --index-document index.html
```
```bash:出力結果
(なし)
```
##BucketPolicyを設定する
このポリシーを適用することでアップロードしたファイルはすべてpublicになります。
###ポリシー用のjson作成
```bash:command
$ PUBLIC_POLICY=public.json
$ cat << EOF > ${PUBLIC_POLICY}
{
	"Version": "2012-10-17",
	"Id": "PublicRead",
	"Statement": [
		{
			"Sid": "ReadAccess",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::${BUCKET_NAME}/*"
		}
	]
}
EOF
```
```public.json
{
	"Version": "2012-10-17",
	"Id": "PublicRead",
	"Statement": [
		{
			"Sid": "ReadAccess",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::backetnonamae/*"
		}
	]
}
```
###ポリシーの適用
```bash:command
$ aws s3api put-bucket-policy --bucket ${BUCKET_NAME} --policy file://${PUBLIC_POLICY}
```
```bash:出力結果
(なし)
```
###表示確認
```bash:command
$ open http://${BUCKET_NAME}.s3-website-ap-northeast-1.amazonaws.com
```
MakerFaire Shinzen(SeeedStudio訪問その①)


##集合
いよいよ深圳工場ツアースタート！
最初はSeeedStudioから！

SeeedStudioは本社が移転になり、工場とオフィスが別々の場所になりました。
そしてツアーの集合場所が、MakerFaireの会場になったビル群にある、
新しいSeeedStudioオフィスです！

集合してそのままツアーかと思いきや、
なんと！エリック・パンのありがたいお話しが！！
会議室の床に座り、Seeedの生い立ち、深圳の今、ビジネスモデルを紹介してくれた。

##エリック・パン(Seeed代表)からのお話



###マスプロダクションマネージメントをSeeedが請け負う

<<<<<<<<<<<<<<画像>>>>>>>>>>>>>>

|開発規模|開発のスタンス|
|:-----------|:------------|
|0|Groove(Arduino)|
|0.1|組み合わせれば形になるパーツを提供
|1|PCB基盤Fusion|
|1000| 会社員しながら起業サポート|
|10k| Seeed外の工場提携|
スライドの表は↑な感じの内容。
これらのアイデアの段階から、大規模な大量生産までを、手厚くサポートしてくれる。


###Makerとは
<<<<<<<<<<<<<<画像>>>>>>>>>>>>>>

Makerはフルスタック。
すべての中心のポジションがMakerとなり、難しい技術、知見、テクノロジーそのものが重要じゃない。

<<<<<<<<<<<<<<画像>>>>>>>>>>>>>>

Appleを例にとると、ジョブスとヴォズがまさにそうだ。
二人はお互いのことをわかっていた。全員の仕事を把握し、理解できる。
それこそがハードウェアスタートアップの強み。


###あるべきMakerとしてのスタンス
<<<<<<<<<<<<<<画像>>>>>>>>>>>>>>

世間とは真逆の考え方。
マーケットと作る側は分かれていた。メーカー側とコンシューマー側のような形で。
Seeedが目指しているインディーデザインは「とりあえず」出してみる。
世の中の判断を優先するし、いわいる同人誌などは良い例。物作りがコンテンツになる。

<<<<<<<<<<<<<<画像>>>>>>>>>>>>>>

デジタル・ダーウィズム(進化論)。
日本ではドワンゴが当てはまり、スペースを与えて買い手などを奨励。

###深圳の今
<<<<<<<<<<<<<<画像>>>>>>>>>>>>>>

深圳メイカーズマップ。製造を検索すると物凄い工場が出てくる。
深圳がメイカーズの場所になったのはこういった環境もある。

<<<<<<<<<<<<<<画像>>>>>>>>>>>>>>

「騙して」購入させようとしているのは悪いコピー。
元より少しでも良い、安い、早くなど、何かに長けたものが「山塞」と呼ばれ、梁山泊のような立ち位置で、ハックに似てる。
エリックはこの「山塞」を支援している。

<<<<<<<<<<<<<<画像>>>>>>>>>>>>>>

アメリカのソロホイール($2000)がみんな作り出したので安くなった。いわいる電動一輪車。
MITみたいな独自の発想もいいが、デプロイから何かを生まれることを推奨。研究とは相反する形。

<<<<<<<<<<<<<<画像>>>>>>>>>>>>>>

携帯電話のインディー開発も始まっている。
LinkitOne - 携帯電話を作れるキット
すごい遅い帯域の電波帯。世界中で通信できる。
2Gバージョンはニューヨークメーカーで発表予定。3Gは年内。

<<<<<<<<<<<<<<画像>>>>>>>>>>>>>>

深圳以外でラピットスタートは難く(東京ではできるかも)、中国政府単位でプレゼンをかけている。
ここでの一週間は、シリコンバレーの一ヶ月より価値がある。
エリックは東京に来たことがあるが東京メイカーフェスは世界的に評価できる。

日本のMakerのスタンスとして、どうしても作りたいから作った、でもクオリティが高いといった部分が評価されている。
エリックが欲しがっているDIYの文化は日本にある。

物作ろうと思ったら、中の部材を知らないといけない。勿論ケースも。

<<<<<<<<<<<<<<画像>>>>>>>>>>>>>>

キックスターターで人気のアイテム。

<<<<<<<<<<<<<<画像>>>>>>>>>>>>>>



なぜハッカースペースを作ったか？
そこに集まる人に価値があると考えた。

<<<<<<<<<<<<<<画像>>>>>>>>>>>>>>



首相がメイカースペースの会員にサインした写真。
みんなでMakerになろうとシフトしている。
政策がかわり、潰れる会社は潰れた方が世の中良くなると考えている。

<<<<<<<<<<<<<<画像>>>>>>>>>>>>>>


深圳市内のメイカー向けマップ。
政府が今これを外人向けに作っている。
walterを使ってslackにメッセージを送ってみた

## curlでslackに投稿する場合

```bash:curlで投稿する場合
curl -X POST --data-urlencode \
  'payload={"channel": "#walter", "username": "walterbot", "text": "日本語でok"}' \
  https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYY/zzzzzzzzzzzzzzzzzzzzzzzz
```

## walter用設定

* [Releases · walter-cd/walter](https://github.com/walter-cd/walter/releases)からwalterをダウンロードしておく。

```bash:yml指定して実行
$ ./walter -c pipeline.yml
```

```yml:pipeline.yml
---
messenger:
   type: slack
   username: walterbot
   channel: "#walter"
   url: "https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYY/zzzzzzzzzzzzzzzzzzzzzzzz"

pipeline:
  # step 1
  - stage_name: "ステージ1"
    command: echo "build pipeline is started"
    message: true
    run_after:
      -  stage_name: "ステージ2"
         command: echo "hogehoge 1"
  - stage_name: "ステージ3"
    command: echo "build pipeline is finished"
```

![aa.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2378c94d-d9f1-6023-6758-c2d044752506.png)
[JavaScript] forの中でコールバックが発生する場合は要注意

**forループの中で<font color="red">外部処理系からのコールバック</font>が発生する場合は、ループ変数だけが一気に変化するので注意が必要です。** ここでいう『外部処理系からのコールバック』とは、たとえばAjax等を利用してWebからデータを取得したり、KiiCloud等を利用してmBaaSからデータを取得したりする場合を指します。

# ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png) 悪い例

```js:JavaScript
// テスト用配列
var abc = ["a","b","c"];

// 悪い例
for(var i in abc) {
    // コールバックが発生する外部処理
    external(function() {
        alert(abc[i]); // c→c→c と３回表示されてしまう
    });
}
//============================================
// 外部処理系のつもり（Web接続、DB接続などを想定）
//============================================
function external(callback) {
    setTimeout(callback, 1000);
}
```

# ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png) 良い例１：ループ変数を受け取る関数でラップ

```js:JavaScript
// 良い例１：ループ変数を受け取る関数でラップする
for(var i in abc) {
    wrap(i);
    function wrap(n) {
        // コールバックが発生する外部処理
        external(function() {
            alert(abc[n]); // a→b→c の順に正しく表示される（※）
        });
    }
}
```

（※）実際の外部処理系では順不同です


# ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png) 良い例２：例１を無名関数化

```js:JavaScript
// 良い例２：ループ変数を受け取る無名関数でラップする
for(var i in abc) {
    (function(n) {
        // コールバックが発生する外部処理
        external(function() {
            alert(abc[n]); // a→b→c の順に正しく表示される（※）
        });
    })(i);
}
```

（※）実際の外部処理系では順不同です


# ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png) デモソース

⇒ <a href="http://jsfiddle.net/zfbyc51q/1/" target="_blank">デモソースはこちら</a>

(･o･ゞ いじょー。
Swiftの外部引数名の省略関連まとめ

外部引数名を指定する時に注意しなければならないタイミングが3つある。

```
1. イニシャライザ呼び出し時
2. インスタンスメソッド呼び出し時
3. メソッド呼び出し時
```

下記に、タイミング別で外部引数名の指定がどうなっているのか、ルールを記述する。

## 1. イニシャライザ呼び出し時
* 外部引数名をすべて指定しなければならない。

* 定義側に外部引数名が指定されていなかった場合、内部引数名を外部引数名として指定しなければならない。

* 定義側で外部引数名を`_`で記述した場合、~~第2引数以降に~~外部引数名を指定しなくても良い。

```swift
class Person {
    var id: UInt
    var name: String
    var age: UInt8
    
    init( myId id: UInt, name: String, _ age: UInt8){
        self.id = id
        self.name = name
        self.age = age
    }
}

let person = Person( myId: 12345, name: "Taro", 20 )

```

## 2. インスタンスメソッド呼び出し時
* メソッドの第2引数以降に外部引数名をつけないといけない。

* 定義側に外部引数名が指定されていなかった場合、内部引数名を外部引数名として指定しなければならない。

* 定義側で外部引数名を`_`で記述した場合、第2引数以降に外部引数名を指定しなくても良い。

```swift
class Person {
    var id: UInt
    var name: String
    var age: UInt8
    
    init( myId id: UInt, name: String, _ age: UInt8){
        self.id = id
        self.name = name
        self.age = age
    }
    
    func speak ( contents: String, toName to: String, when: String ){
        println("TO: \(to)")
        println("  \(contents)")
        println("@\(when)")
    }
}

let person = Person( myId: 12345, name: "Taro", 20 )
person.speak("Hello!", toName: "Kunio", when: "2015-07-22")
```

## 3. メソッド呼び出し時
* メソッドの引数にデフォルト値が設定されているメソッドの引数に引数を渡す場合、必ず外部引数名を指定する必要がある。

* 定義側に外部引数名が指定されていなかった場合、内部引数名を外部引数名として指定しなければならない。

```swift
func printName( firstName str1: String = "Taro", str2: String = "Sato" ){
    println( "\( str1 ) \( str2 )" )
}

printName( firstName: "Jiro" , str2: "Imada")
```
bulletとactiverecord-precountの併用を試す

N+1を警告してくれるgem [bullet v4.14.7](https://github.com/flyerhzm/bullet)
count系を事前ロードできるgem [activerecord-precount v0.5.0](https://github.com/k0kubun/activerecord-precount)
を併用するに問題があったので取り敢えず動くところまで
使い込むと問題が出るかもしれないので参考程度に

以下のようなコードでcountSQLを1回で済ます際に

```ruby:test.rb
User.preload(:comments_count).map(&:comments_count)
```

bullet側でエラーが発生した

```console:console
NoMethodError - undefined method `id' for 100:Fixnum:
  bullet (4.14.7) lib/bullet/ext/object.rb:10:in `primary_key_value'
  bullet (4.14.7) lib/bullet/detector/n_plus_one_query.rb:28:in `add_possible_objects'
  bullet (4.14.7) lib/bullet/active_record42.rb:162:in `reader'
  activerecord (4.2.3) lib/active_record/associations/builder/association.rb:115:in `comments_count'

```

どうやらアソシエーションの取得結果が `record` ではなく
数値なのが問題らしいので数値の場合は自身を `record.id` 扱いにしたら動いた

```ruby:config/enviroments/development.rb
Rails.application.configure do
  # gem bullet の設定
  config.after_initialize do
    Bullet.enable = true

    # gem activerecord-precount で数値を取得する仕組みと
    # gem bullet でprimary_key基準でチェックする仕組みを共存させるための拡張
    Fixnum.prepend(Module.new do
      def id
        self
      end
    end)
  end
end
```

# もう一つの方法

```ruby:test.rb
User.preload(:comments_count).map{|user| user.comments.count }
```
`.count` 参照だと `Object` の拡張は不要ですが

```console:console
nused Eager Loading detected
  Authority => [:comments_count]
  Remove from your finder: :includes => [:comments_count]
```
と `comments_count` を使っていないことを警告されてしまうので
毎回ホワイトリストに登録する必要があります
OSS版drone.io + Gogsの連携を試みたがpushしてもbuildしなくて断念

* proxmox4β(debian8)にて実施。

## パッケージインストール

* /media/3tb/ を作業ディレクトリとする

```bash:最新のdockerインストール
wget -qO- get.docker.com | sh
mkdir /media/3tb/docker
ln -s /media/3tb/docker /var/lib/docker
```

```bash:OSS版drone.ioのインストール
wget http://downloads.drone.io/master/drone.deb
dpkg -i drone.deb
ln -s /usr/share/drone/systemd/drone.service /etc/systemd/system/multi-user.targ
systemctl start drone
systemctl enable drone
```

# Gitリポジトリの準備(Gogs使ってみた)

```bash:Gogs
cd /media/3tb/
wget http://gogs.dn.qbox.me/gogs_v0.6.1_linux_amd64.zip
apt-get install -y unzip
unzip gogs_v0.6.1_linux_amd64.zip
```

```bash:gitユーザ作成
adduser git
mkdir /media/3tb/gogs-repositories/
chown -R git:git /media/3tb/gogs*
```

* gitアカウントのcrontab編集

```bash:crontab&nbsp;-e
@reboot (cd /media/3tb/gogs && nohup ./gogs web &)
```

`(cd /media/3tb/gogs && nohup ./gogs web &)`を実行すると

* http://ipaddress:3000/ でGogsのWebUIが表示される。

![Screenshot from 2015-07-22 08:43:20.png](https://qiita-image-store.s3.amazonaws.com/0/25728/347e70cf-0aae-91a7-2977-63e37300554f.png)

* Gogsで使う管理者アカウントを作成
* Registerから一般ユーザアカウントを作成。(もしくは管理者アカウントで`Admin Panel`->`Users`で登録)
* 一般ユーザでログインしSSH鍵の登録、リポジトリを作成。
  * SSH鍵は、`git clone`などで使用する。
* Gogsでホスト名を変更したい場合は`gogs/custom/conf/app.ini`を編集。[公式doc](http://gogs.io/docs/installation/configuration_and_run.html)

## Access Token取得

* [公式doc](http://readme.drone.io/setup/config/gogs/)

![01.png](https://qiita-image-store.s3.amazonaws.com/0/25728/404b50a9-4272-5bf7-66c4-2982641130d6.png)

![02.png](https://qiita-image-store.s3.amazonaws.com/0/25728/cbbe659f-2ea3-794c-93c2-cf57e2eeb9dc.png)

* 今回は`e89dfc27bc12e3d1ebfdcfaa45ec45c38daeba4f`がAccess Tokenとなる。


# drone.ioのWebUIにアクセス

* http://IPアドレス/login にアクセスすると droneの画面が表示される。

##  Port番号を変更したい場合

```diff:/etc/drone/drone.toml
  [server]
- port=":80"
+ port=":3001"
```

![Screenshot from 2015-07-22 08:14:53.png](https://qiita-image-store.s3.amazonaws.com/0/25728/af75664a-de0f-b1fc-725d-18cbb2b14436.png)

### GogsのAccess Token登録

```diff:/etc/drone/drone.toml
+ [gogs]
+ url="http://localhost:3000"
+ secret="e89dfc27bc12e3d1ebfdcfaa45ec45c38daeba4f"
+ open=true
```

```bash:
systemctl restart drone
```

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/0a7bdc83-5a02-4f82-3d35-73b18e278974.png)

* Gogsが登録されたことを確認

![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/048f2320-6422-44d4-9bf3-8fa2d1c5087d.png)

* Gogsに登録しているユーザ名、パスワードでログイン

![3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/efdb4a68-69d3-7a4d-1713-c4bff2329525.png)

![4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ea825845-ba30-a0b3-5e40-21057f572478.png)

* Gogsに登録されているリポジトリ一覧が表示される。
* syncボタンがあるのでたまに押す。
* ログは`journalctl -u drone -f`で確認ができる。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/25728/86ebc1e7-23ce-97ca-85c0-90874b382e39.png)

* `.drone.yml`を追加してコミットしろと出るのでコミットしたが何も変わらないので断念。
All rights reserved. って（現在では）意味ないんだね！知らなかった！

[Wikipedia 著作権表示](https://ja.wikipedia.org/wiki/%E8%91%97%E4%BD%9C%E6%A8%A9%E8%A1%A8%E7%A4%BA#All_rights_reserved)

&copy; 2015 HogeFuga Inc.

だけでよいそう。
C#の継承やインターフェース

文法的な話です。

# 継承

- 継承させる場合、クラス宣言では : を付ける

```csharp
class Child : Parent {
}
```

- 仮想メソッド(overrideさせる時は、virtualをつける)

```csharp
public virtual void func() {
}
```

- baseキーワード(AS3でのsuper)

```
public override void func() {
    base.func();
}
```

- コンストラクタ(親のコンストラクタを使用する場合)

```csharp
class Child : Parent {
    public Child() : base() {
    }
}
```

- protectedは使える

# インターフェース

- 文法はAS3と一緒

```csharp
interface I {
    void func();
}
class A : I {
    public void func() {
    }
}
```

# 抽象クラス
- インスタンスを生成できない
- 抽象メソッドを定義できる
- abstractキーワードを使用する

```csharp
public abstract class AbstractParent{
	public AbstractParent (){}
	public abstract void func();
}

public class Child : AbstractParent {
    public Child() : base() {
    }
    public override void func() {
    }
}
```
まだブラウザでGithubを開いてPull Requestしてるのですか？


Pull Requestの時間を省略することで、積み重なった多くの無駄な時間が解消できると思います。

`hub` をインストールして下記を設定をすると、

```..gitconfig
[alias]
	pr = !hub browse -- compare/$(git symbolic-ref --short HEAD)'?'expand=1'&'body=%23%23%20%E7%9B%AE%E7%9A%84%0A%0A%23%23%20%E5%A4%89%E6%9B%B4%E5%86%85%E5%AE%B9
```

`git pr` コマンドで

![スクリーンショット 2015-07-22 11.18.34.png](https://qiita-image-store.s3.amazonaws.com/0/150/fd8aea3a-b3a7-0540-162b-12d8336f1b64.png "スクリーンショット 2015-07-22 11.18.34.png")

自動的にブラウザが立ち上がり、このようなPull Requestが作成されます。


また、bodyに好きな文章を入れて使ってください。チームで共有すると文体が統一されて良いです。

.gitconfigをGithubで公開したくない、もしくはGithub Enterpriseでも使用したい場合は、[いちいちgit configしたくないがgithubなどで公開したくない設定をする場合の対処法 - Qiita](http://qiita.com/tsuwatch/items/88a61ff2b8357c23e452
)
Xcodeでシミュレータ名がおかしくなって泣きたい君へ

![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/8093/1c41c074-d869-97d8-a180-fcc76bf9f387.png)  
こうなって、泣きたいときは、心を落ち着かせて  
```~/Library/Developer/CoreSimulator```
を削除してOSを再起動すると幸せになれるよ。

![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/8093/11fa9afa-8d99-8ac0-d25d-150524fd31ab.png)

@kitasukeさんが[おしえてくれました](https://twitter.com/kitasuke/status/623673108474368000 "yusuke_kitaさんはTwitterを使っています: &quot;@haranicle ~/Library/Developer/CoreSimulator⁰を消して再起動&quot;")
備忘録

# vagrant使用時の備忘録メモ

◆vagrant up時にマウントエラーが出た時の修正方法　参考記事
http://qiita.com/kazu69/items/812b236e84fee1db3900

◆node.jsの参考
http://qiita.com/tsumekoara/items/88cb83a0a14670540719


◆railsをインストールするときの備忘録参考
http://qiita.com/chobi9999/items/7b66677b3bf3da8acc14

## facebookとwordpressの連携

「寝ログ」さんの記事を参照
http://nelog.jp/how-to-use-facebook-page-plugin

「バズ部」さんの記事を参照
http://bazubu.com/how-to-connect-wp-to-fb-23544.html
git diffでの文字化け対策


# あるプロジェクトだけ
基本は ```UTF-8``` なんだけどこのプロジェクトだけ ```EUC``` とか ```Shift-jis``` とかあるｗ
そいで ```~/.gitconfig``` には ```UTF-8``` って書いてあったりしてそこは変えてなくない！ｗ

## というわけで
そのリポジトリ[^1]だけを設定したい。

```bash:~/bin/diff-wrapper
#!/bin/bash

old=$2
new=$5

diff -Nau <(lv $old) <(lv $new) | cat
```

上記のファイルを作成し、以下のコマンドで設定

```bash
$ chmod +x ~/bin/diff-wrapper
$ git config diff.external ~/bin/diff-wrapper
```

## 参考サイト
- [gitリポジトリ内にいろんな文字コードのファイルが混在しててもgit diffで文字化けさせずに表示する](http://blog.uu59.org/2012-03-27-git-diff-multi-encodings.html)

[^1]: とあるプロジェクト
コミュニケーション能力

エンジニアスキルによく求められるのがコミュニケーション能力。
少しでも向上させるために２つのことを意識するとよいです。

* 要約しない
* 相手の気持ちを考える


#１．要約しない
相手の話に対して「つまり・・・」や「簡単に言うと・・・」などの話でまとめてしまわないこと。
結果としてそうだったのかもしれないけど、相手はその過程の苦労を伝えたいのである。

#２．相手の気持ちを考える
相手の話の本意を知る。共感すること。
相手の内面に入り、内面から客観的にみる。（外からではない。内面からが重要）


たったこれだけでも意識するとコミュニケーション能力も上達するでしょう。
Cordovaのファイル暗号化プラグインを作った

CordovaはHTML等のソースファイルがそのまま配置されるので、中身が丸見えの状態です。
そのためファイルを暗号化するプラグインを作りました。
AES256-CBCで暗号化します。

#cordova-plugin-crypt-file
https://www.npmjs.com/package/cordova-plugin-crypt-file


#使い方
`cordova plugin add cordova-plugin-crypt-file`
プラグイン追加して
`cordova build`
ビルド時に暗号化
`cordova emulate [ios /android]` or `cordova run [ios / android]`
実行時に複合化

という感じなので、プラグイン追加したらあとは勝手にやってくれます。


#暗号化するファイル
暗号化するファイルは以下の通り。画像ファイル等は暗号化しません。
* .html
* .htm
* .css
* .js


#対象プラットフォーム
* iOS
* Android
* CrossWalk


以上。
twig で再帰処理

twig で再帰処理をしたい場合は、 macro を使う

```html+django
        {% macro recursiveCategories(Category) %}
            {% if Category.hasChildNodes() %}
                <ul>
                    {% for child in Category.childNodes() %}
                        <li>{{ child.name }}</li>
                        {{ _self.recursiveCategories(child) }}
                    {% endfor %}
                </ul>
            {% endif %}
        {% endmacro %}
        {% if Category.hasChildNodes() %}
        <ul>
            {% for ChildCategory in Category.childNodes() %}         
                <li>{{ ChildCategory.name }}</li>
                {{ _self.recursiveCategories(ChildCategory) }}         
            {% endfor %}
        </ul>
        {% endif %}

```

### 参考

<https://gist.github.com/tentacode/3892186>
iterm2にtmuxを統合するメモ

ただのメモです。
とりあえず動いた設定をメモしていますが、各々いい感じに設定するには各自よきようにカスタマイズが必要です。
あしからず。

# install

```rb
$ brew install tmux
```

# set .tmux.conf

```rb
# ----------------- #
# Window #
# ----------------- #

## window number begins with 1
set-option -g base-index 1

# mouse scroll
set-window-option -g mode-mouse on
# これを有効にすると、MacでCommand+Cなどができなくなるが、
# Optionを押しながら範囲選択すると、コピーできる。

# reset window number at closing it
set-option -g renumber-windows on

# ------------------- #
# status bar #
# ------------------- #

# 色コード: http://www.calmar.ws/vim/256-xterm-24bit-rgb-color-chart.html

# 256 color
set-option -g default-terminal "xterm"

# status bar color
set -g status-fg colour253
set -g status-bg colour237

# non-active window color
set-window-option -g window-status-fg default
set-window-option -g window-status-bg default

# active window color
set-window-option -g window-status-current-fg colour16
set-window-option -g window-status-current-bg colour178

# position of status bar    
set-option -g status-position bottom

# item of left side of status bar
set -g status-left '#[fg=colour32, bold]#S'

# item of right side of status bar
set -g status-right ''

# kill K k
unbind K
bind K kill-window
unbind k
bind k kill-window

# detach ^D d
unbind ^D
bind ^D detach
```

# set shortcut

iterm2のkey bindに以下を設定

| key | hex code | action |
|:-----------|:------------|:------------|
| Ctrl Shift ] | 0×2 0x6e | move to next window |
| Ctrl Shift [ | 0x2 0x70 | move to last window |
| Ctrl n | 0x2 0x63 | open new window |
| Ctrl t | 0x2 0x63 | close window |
| Ctrl w | 0x2 0x6b | close window |
| Ctrl Shift % | 0x2 0x25 | divide window vertically |
| Ctrl ] | 0×2 0x6f | move to next pane |

# set command alias

```rb:~/.zshrc
alias t='tmux'
alias ta='tmux attach'
alias td='tmux detach'
```

# references

- https://codeiq.jp/magazine/2014/01/5143/
- http://d.hatena.ne.jp/tacahiroy/20121007/1349626161
- http://dackdive.hateblo.jp/entry/2014/08/08/210000
CrontabでEC2を指定の時間にシャットダウンさせる

# rootでcrontab -e してコピペして保存

```
# コマンドの実行に、デフォルトの /bin/sh ではなく /bin/bash を使用する。
SHELL=/bin/bash
# root PATHを設定
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin:/opt/aws/bin
# mailを送信したくない時
MAILTO="" 

# JSTかUSTかシステムに合わせる。これはJST ログはmessageに書く
0 19 * * * shutdown -h now  2>&1 | logger -t shutdown -p local0.info
```

* crontabのPATHが通ってなくて失敗する時があるのでPATHを通したい（shutdownとか）
* mailを送信したくない時はMAILTO=""

# crontabの書き方

## 時刻設定の例

```
43 23 * * *               23:43に実行
12 05 * * * 　　          05:12に実行
0 17 * * *                17:00に実行
0 17 * * 1                毎週月曜の 17:00に実行
0,10 17 * * 0,2,3         毎週日,火,水曜の 17:00と 17:10に実行
0-10 17 1 * *             毎月 1日の 17:00から17:10まで 1分毎に実行
0 0 1,15 * 1              毎月 1日と 15日と 月曜日の 0:00に実行
42 4 1 * * 　          　 毎月 1日の 4:42分に実行
0 21 * * 1-6　　          月曜日から土曜まで 21:00に実行
0,10,20,30,40,50 * * * *　10分おきに実行
*/10 * * * * 　　　　　　 10分おきに実行
* 1 * * *　　　　　　　　 1:00から 1:59まで 1分おきに実行
0 1 * * *　　　　　　　　 1:00に実行
0 */1 * * *　　　　　　　 毎時 0分に 1時間おきに実行
0 * * * *　　　　　　　　 毎時 0分に 1時間おきに実行
2 8-20/3 * * *　　　　　　8:02,11:02,14:02,17:02,20:02に実行
30 5 1,15 * *　　　　　　 1日と 15日の 5:30に実行
```

## 書き方のポイント

* 実行結果をdev/nullに捨てない。

```
ダメ 2 2 * * * hoge.php > /dev/null 2>&1
良い 2 2 * * * hoge.php > hogee.log 2>&1
```

* 環境変数の指定をcrontabの中に書く時，シェル内での指定と違い右辺の環境変数が展開されない点に注意が必要。

```
ダメ PATH=/usr/local/bin:$PATH
良い PATH=/usr/local/bin:/usr/bin:/bin
```

* 特定の処理のみメール送信

```
0 2 * * * /bin/sh /etc/hogehoge 2>&1 | Mail [送信先メールアドレス]
```

* ~/.bashrcにalias crontab='crontab -i 'を追記してcrontab -rに確認をつける。

```file:~/.bashrc
# crontab -e(編集)と-r(削除)の押し間違い防止
alias crontab='crontab -i '
```

## 【>/dev/null 2>&1】とは??(これやると何が起きているのかわからないのでダメ)

* /dev/nullはごみ箱
* 2>&1は2標準エラーを1標準出力に出す。
* つまり、標準エラーと標準出力をごみ箱にすてて表示させない。という記述

### ベター ファイルに出力する

* どこに出力したかわかりやすい

```
3 19 * * * shutdown -h now >> shutdown.log 2>&1
```

### ベスト　syslog に記録 : logger コマンドに渡す
    
* ログファイルをローテーションしてくれる
* 多数のホストで実行する場合、ログを一カ所に集約したい

```
3 19 * * * shutdown -h now 2>&1 | logger -t shutdown -p local0.info
```

* ログ確認するコマンド

```
# tail -f /var/log/messages
Jan 16 11:05:02 ip-172-31-5-106 shutdown: hoge
Jan 16 11:06:01 ip-172-31-5-106 shutdown: hoge
```

* もしサーバが立てたばかりで、UTC,JSTを切替えた直後などは、crondを再起動しよう

```
sudo service crond restart
```
Rails で JavaScript 管理をbowerにしてから、method: :delete が効かなくなった場合の対処方法

## method: :deleteのハズなのに、普通にGETが送られてる

devise使ってるレイアウト箇所

``` views/layouts/_header.html.haml
= link_to 'Log out', destroy_user_session_path, method: :delete
```

普通に作ったオブジェクトを削除しようとしている箇所

``` views/answers/index.haml.html
= link_to '削除', @answer, method: :delete, data: { confirm: 'Are you sure?' }, class: "btn btn-sm btn-danger"
```

```method: :delete``` なのに無視されて deviseはルーティングエラー、オブジェクト削除の方はshowページに飛ばされる。

どうやらjsが効いてないらしい。

## javascriptの読み込み部分の確認

足りないapplication.js

``` app/assets/javascripts/application.js
//= require jquery
//= require bootstrap-tagsinput
//= require_tree .
```

``` //= require jquery-ujs ``` がない。。
（bowerの流れでなんとなく削除してた・・）

こいつがないとjsでdelete methodを上手くやってくれる箇所が動かないっぽい。
戻す。

大丈夫なapplication.js

``` app/assets/javascripts/application.js
//= require jquery
//= require jquery-ujs
//= require bootstrap-tagsinput
//= require_tree .
```

## Bowerでインストール

Bowerfileに追加する。

```Bowerfile
asset 'jquery-ujs'
```

インストール

```
$ ./bin/rake bower:install
```

無事deleteできるようになった。

## 蛇足

この辺のごにょごにょがアホ過ぎて Qiita 向きじゃなかったため、[ブログ](http://mpiyok.hatenablog.com/entry/2015/07/22/085352) にごにょごにょ部分を書いた。
シェルスクリプトで進捗とか


シェルスクリプトの`\n`とか`\t`とか使いたい場合

```
echo -e "a \t b"
```

というような感じで -e オプションを付けることでタブや改行を表現することができます

そのほか、改行などを制御するエスケープシーケンスが存在していて色々できそうなのでやってみました

## 行末までクリア

`\e[K`

## 改行しない

通常echoなどで出力すると改行も自動で入ってしまうのですが改行をさせないということもできます

`\c`

## 座標へカーソルを移動

* 描画している座標を0,0へカーソルを移動
* 数値を変えれば任意の座標に移動できる

`\e[0;0H`

# サンプル

改行しなかったり、座標を自由にセットできたりすれば色々自由にできそうです

試しに時刻を表示するスクリプトを書いてみました

```
#/bin/sh

echo_bar(){
  length="$1"
  i=0
  while [ $i -lt $length ]
  do
    echo -e "*\c"
    i=`expr $i + 1`
  done
}

clear
echo -e "\e[0;0H"
while true
do
  hour=`date +%H`
  min=`date +%M`
  sec=`date +%S`

  echo -e "\e[K\c"
  echo -e "h: $hour: \c"
  echo_bar $hour
  echo ""

  echo -e "\e[K\c"
  echo -e "m: $min: \c"
  echo_bar $min
  echo ""

  echo -e "\e[K\c"
  echo -e "s: $sec: \c"
  echo_bar $sec
  echo ""

  sleep 1
  echo -e "\e[0;0H"
done
```

![text](clock.sh.gif "alt")

簡単な監視スクリプトなど図にして見やすくしたい場合とかに使えそうです
iOS 9のSearch APIのドキュメントが追加されました


今朝、OSX El Capitan・iOS 9・watchOS 2のβ4のアップデートが来ました。
これまで大体隔週で日本時間水曜くらいの朝にアップデート来ている感じです。
(全部更新しちゃいました。watchos 2のバッテリー問題がそろそろ解消されていることを願います（´-ω-｀）)

新しいβがリリースされると、こちらのドキュメントが大量に更新されます。
[iOS Developer Library](https://developer.apple.com/library/prerelease/ios/navigation/)


そのうちの一部として、Search APIのCore Sportlightのドキュメントが追加されていました。
これで、かなり実装がしやすくなりますね(　´･‿･｀)

- [Core Spotlight Framework Reference](https://developer.apple.com/library/prerelease/ios/documentation/CoreSpotlight/Reference/CoreSpotlight_Framework/index.html#//apple_ref/doc/uid/TP40016250)
	- [CSSearchableItemAttributeSet Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/CoreSpotlight/Reference/CSSearchableItemAttributeSet_Class/index.html#//apple_ref/doc/uid/TP40016247)
	- [CSSearchableItem Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/CoreSpotlight/Reference/CSSearchableItem_Class/index.html#//apple_ref/doc/uid/TP40016212)
	- [CSSearchableIndex Class Reference](https://developer.apple.com/library/prerelease/ios/documentation/CoreSpotlight/Reference/CSSearchableIndex_Class/index.html#//apple_ref/doc/uid/TP40016246)
- [App Search Programming Guide](https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/AppSearch/index.html) (8月7日追記)

個人的に注目しているAPIなので、良かったです:
[searchapi - iOS 9の「Search API Best Practices and FAQs」が公開されたので読み解いてみた - Qiita](http://qiita.com/mono0926/items/27af791065ed919255e0)


Search API系のは無かったですが、[新しいサンプルコード](https://developer.apple.com/library/prerelease/ios/navigation/#section=Resource%20Types&topic=Sample%20Code)などもたくさん追加されているのでチェックしてみると良いかもしれません。
OPアンプ > 反転増幅回路 > バイアス電流の影響 > -R2/R1 (V_I - I_B *R_I)

引用: オペアンプ基礎回路再入門 by 岡山努さん

```math
V_O = - \frac{R_2}{R_1}(V_I - I_B \times R_I) ... (2.11)
```

> 式(2.11)は入力側から見ると、入力バイアス電流 I_B が、-I_B * R_I の入力電圧と同じように増幅されることを示します。
unix > man > 検索順序 > 1, 8, 2, 3, n, 4, 5, 6, 7, 9, 1

引用: プログラミングテクニック UNIXコマンドのソースコードにみる実践プログラミング手法 by 多治見寿和さん
man

> 複数の節に同じ名前のマニュアルが格納されていることもあります。その場合、次の順序で検索されます。
1 -> 8 -> 2 -> 3 -> n -> 4 -> 5 -> 6 -> 7 -> 9 -> 1

こういうのはmanのmanに記載があるのだと思うが、どこに記載されているかさっぱりである。

別の本なりwebなりで情報を偶然見つけて、「そうだったのか」となることがある。

http://linuxjm.osdn.jp/html/LDP_man-pages/man7/man-pages.7.html
qiita > 検索キーワードの考察

unixのman関連の記事を投稿しようとして、ふと「"man"で検索しても膨大な無関係の結果が出てきて後々参照できなくなりそう」と思った。

そういう場合、独自のキーワードをつければいいのだが、キーワードの名前の付け方により、思ったような検索にならなかったりする。

現在のQiitaの検索の特徴としては以下。

|検索キーワード|検索結果|
|---|---|---|
|79man| 79で検索した結果 + manで検索した結果 | 
|"79man" | 79manで検索した結果 |
|man. | manで検索した結果 |
|"man." | manで検索した結果 |

"man#","man_"などは 「manで検索した結果」になってしまった。

結局、後々の参照性のために独自のキーワードを付けるときは
- 英語 + 数値 の組み合わせ
- 検索時に " " で囲う
のがよさそうに思う。


manがもっとユニークな名前であればこういうことは考えなくてもいいのだが。

<hr>
(追記)
manとタグ付けすれば tag:man で無関係のものが一切表示されない。これが一番シンプルかもしれない。
unix > man > roff形式が使われている > 画面出力:nroff / 紙への印字: troff

引用: プログラミングテクニック UNIXコマンドのソースコードにみる実践プログラミング手法 by 多治見寿和さん
man

> オンラインマニュアルではroffと呼ばれる形式が使われています。roff形式では、画面への出力にはnroff、紙への印字にはtroffという異なるコマンドを使うことで、それぞれに最適な出力が得られます。通常は、manコマンドはマニュアルの内容をnroffコマンドで処理、整形して画面に表示しています。
cpp > 外部リンケージのリーク問題の解決法 > static宣言 / 匿名の名前空間

引用: C++のためのAPIデザイン by マーティン・レディ

> カプセル化を壊すコード

```cpp:user.cpp
extern void FreeFunction();
extern const int INTERNAL_CONSTANT;
extern std::string Filename;
...
```

>この外部リンケージのリーク問題を解決するソリューションは２つある。
> 1. static宣言 : ...これで、関数や変数は内部リンケージを持つことになり...
> 2. 匿名の名前空間 : ...匿名の名前空間に囲い込む...
cpp > シンボルのエクスポート > 外部リンケージ / 可視性のエクスポート

引用: C++のためのAPIデザイン by マーティン・レディ
6.9 シンボルのエクスポート

> 言語レベルではパブリック、プライベート、プロテクトというアクセス制御機能があるが、これに関連して、物理的なファイルレベルでは、APIのシンボルを開示する概念が２つある。
1. 外部リンケージ
2. 可視性のエクスポート
外部リンケージとは、ある翻訳単位内のシンボルは他の翻訳単位からアクセスできることを意味する。可視性のエクスポートとは、DLLなど、あるライブラリファイルから可視化されたシンボルを指す。外部リンケージのシンボルだけがエクスポートできる。

> 外部リンケージのリーク問題
cpp > 返し値のconstコレクトネス

引用: C++のためのAPIデザイン by マーティン・レディ
6.3.3　返し値のconstコレクトネス

> ...プライベートのデータメンバへのポインタまはた参照を返す場合は、結果をconstと宣言すべきである。そうしないと、ユーザは、パブリックAPIを経ずに内部状態を変更できるからだ。

```cpp
// const参照で戻す
const std::string &GetName() const
{
    return mName;
}
```
技術英語 > 3回連続で > three times in a row 

「3回連続で」と言いたい時に
three times in a row
というのが使える。

出典は忘れたが、CNN English ExpressかEnglish Journalのどちらかだったかと思う。

<hr>
http://loe.org/shows/shows.html?programID=13-P13-00011
>  for the last three years in a row

<hr>
ある試行処理をしていて、連続N回成功した場合にだけ条件が成立するなどに使えそう。

ただし、in a rowというのは行列の扱いをしている処理(row and column)ではこのフレーズを知らない人にとっては混乱を生じるかもしれない。
Homograpy行列を用いてopenGLで画像を射影

# Homograpy行列とは

画像を射影したい(例えばカメラで撮影した角四点の位置がわかっている画像を正面から見られるようにしたいとか)時にはhomograpy行列を使います．

いままではopenCVのcvFindHomograpyとcvWarpPerspectiveを使ってのcv系での処理しかやったことが無く，今回シェーダー使ってgl系で処理しようとしたら上手く行かず1日ふっとばしたのでメモ．

## openCVで射影変換

まずopenCVで処理する際のおさらい．前述したようにCVで射影変換をしたい場合はcvFindHomograpyとcvWarpPerspectiveを使えば簡単にホモグラフィ行列の算出・画像の射影ができます．以下に簡単に例を載せておきます．

```objc

#import <opencv2/opencv.hpp>
/**
角4点の対応から画像を射影するメソッド
@param     src     元画像
@param     dst     射影先画像
@param     srcP     元画像の角4点座標
@param     dstP     射影画像の角4点座標
*/
- (void) calcHomograpy:(IplImage *)src dst:(IplImage *)dst srcP:(float *)srcP dstP:(float *)dstP
{
    CvMat    src_point;
    src_point = cvMat( NUM_POINTS, 2, CV_32FC1, srcP );
    CvMat    dst_point;
    dst_point = cvMat( NUM_POINTS, 2, CV_32FC1, dstP );
    // homography 行列を計算
    CvMat    *h = cvCreateMat( 3, 3, CV_32FC1);
    cvFindHomography( &src_point, &dst_point, h );
    cvWarpPerspective( src, dst, h );
}
```

## openGLで射影変換

openGLでhomograpy行列を使う場合，この行列がProjectionMatrixとModelViewMatrix両方を内包しているため，Projection行列を正射影にして、ModelView行列にHomography行列をロードする方法が簡単らしいです．そのあたりの話はここなどに詳しく書かれています．

で，ここで少し困るのはhomograpy行列は3×3なのに対し`ProjectionMatrix`や`ModelViewMatrix`は4×4なので大きさがあわないこと．これに関しては

````
a11 a12 a13
a21 a22 a23
a31 a32 1
````

を

```
a11 a12 0 a13
a21 a22 0 a23
0 0 1 0
a31 a32 0 1
```

にすれば良いらしいです．

ただこの方法，結局上手く行かず，最終的にはhomograpy行列のinverseをとってfragmentシェーダにて`texCoord`に直接掛け合わせるという苦肉の策をとりました．こんな方法をとる人は他に無いと思いますが，一応嵌ったところ自戒を込めて書いておくと，

```c

//これは上手く動かない
//vec2 newTexCoord = (invHomograpyMatrix * vec3(texCoord.st, 0.0);
//gl_FragColor = vec4(texture2D(texSampler2D, result.xy).rgb, 1.0);
 
//正解
vec2 newTexCoord = (invHomograpyMatrix * vec3(texCoord.st, 1.0)).st;
gl_FragColor = vec4(texture2D(texSampler2D, result.xy/result.z).rgb, 1.0);
```

なので注意が必要．(この`x,y,w`の`w`の存在を完全に忘れていて半日つぶした)
`invHomograpyMatrix`は`cvFindHomograpy`で計算した射影行列の逆行列(`mat3`)で`texCoord`は`vertex`シェーダから送ってきたテクスチャ座標です．`invHomograpyMatrix`はglとcvの行列走査の違いから転置をとってあります．
Ansibleでshellやcommandを叩くときに':'や'='を使う方法

## Ansibleとは

[Ansible](http://www.ansible.com/home)とは，Pythonで記述された構成管理ツールです．[Chef](https://www.chef.io/chef/)みたいなやつです．今回はこのツールを使っていて特に困ったことがあったので解決策をメモしておきます．Ansibleのインストールや基本的な使い方は，わかりやすく解説されているサイトがたくさんあるのでそちらを参考にしてください．

## 問題：shellやcommandを叩くときに':'や'='を使おうとするとエラー

Ansibleでshell, commandを書くときに例えば，

```
- name: Make test
  sudo: yes
  shell: VAL=test make
```

みたいな書き方をしようとすると，エラーが吐かれてしまいます．
これは，本来ansibleの中で`=`等が，`command: make chdir={{dir}}` のように使われているため，変な解釈が行われてしまうからです．

## 解決策

あらかじめ，`=`,`:`等悪さをするものを変数として宣言しておき，呼び出すことでこのエラーを回避できます．

```
var:
    equal: '='
task:
- name: Make test
  sudo: yes
  shell: VAL{{equal}}test make
```
Embulk が利用している Java のエコシステム

Java エコシステムを全く追っておらず、Embulk がなにをどのように使っているのかわかっていなかったのでメモ。

Embulk で利用しているエコシステムには以下のものがある。

* gradle
* maven central
* jcenter
* rubygems

## Gradle

[Gradle](https://gradle.org/) というビルドツールを利用している。設定を groovy で書き、古き良き xml を使わないあたりがナウいようだ。

Java なプラグインを雛形から生成すると `build.gradle` ファイルがおかれていて、このファイルが Gradle の設定ファイルとなっている。

build.gradle には次のような設定がある。ここで Java なライブラリをどこのレポジトリからダウンロードしてくるのか設定してある。

```
repositories {
    mavenCentral()
    jcenter()
}
````

### gradlew (gradle ラッパー)

Java プラグインの場合、https://github.com/sonots/embulk-filter-row/tree/master/gradle/wrapper のように gradle/wrapper なるディレクトリおよび gradlew (gradlew.bat) スクリプトが作られて git レポジトリにつっこんでおく形になる。

ラッパーを使ってGradleビルドを実行すると、Gradleが自動的にダウンロードされ、それを使ってビルドが実行されるようになるようだ。

> ラッパーは、バージョン管理システムにチェックインするべきです。ラッパーと一緒にプロジェクトを配布することで、前もってGradleをインストールすることなく、誰もがすぐプロジェクトで作業できるようになります。 さらにいいことに、ラッパーを使ってもらうことで、ビルドに使用されるGradleのバージョンをプロジェクトが想定しているものに強制することができます。 もちろん、ラッパーは継続的インテグレーションサーバーで作業するときも非常に便利です。サーバーでビルドの設定を行う必要がないからです。

cf. http://gradle.monochromeroad.com/docs/userguide/gradle_wrapper.html

というわけで、`./gradlew classpath` のようにビルドし、`./gradlew test` のようにテストを実行し、`./gradlew gemPush` のように rubygems にプラグインをリリースすることになる。

## Maven Central Repository

[Maven Central Repository](http://search.maven.org/) は Java のライブラリを公開する場所らしい。perl でいう cpan, ruby でいう rubygems。ただ、どうも使い勝手が良くないらしく、Java のライブラリを公開するレポジトリが他にもいくつか存在している群雄割拠の時代になっているようだ。後述の jcenter もその１つ。

## JCenter

[JCenter](https://bintray.com/bintray/jcenter) は bintray.com が提供している Java ライブラリを公開するレポジトリのようだ。
embulk 本体は Maven Central ではなくこちらで公開しているようだ。しかし、一般的な Java ライブラリは Maven Central にあることが多いので併用しているようだ。

## Rubygems

プラグインの公開には rubygems を使っている(Java プラグインでも)。JRuby gem としてラップして、`./gradlew gemPush` とすることにより rubygems に公開できる。
プラグインを rubygems に公開することにしているのは、jruby プラグインでも java プラグインでも分け隔てなく公開するための場所として rubygems を選定したためだろう。
Mac + Java8

SparkFrameworkを試してみようと思ったが、Macの開発環境にはJava8が入っていなかった。

何はともあれダウンロード
http://www.oracle.com/technetwork/java/javase/downloads/index.html

pkgファイルでインストールしたが、EclipseでJava8のプロジェクトを作ってもエラーになった。「No JREs in workspace compatible with specified execution environment: JavaSE-1.8 mac」とか文句を言われる。再起動してもダメ。

そこで、Eclipseの環境設定から「Java」「Installed JREs」を選び「search」ボタンを押すとJavaSE8が表示された。オッケー。
Pythonファイル入出力用メモ

業務でcsv加工系の処理を書きそうなのでカンペ作成"φ(・ｪ・o)~ﾒﾓﾒﾓ
2系のつもりで3系混ざっていたらすみません。

### open関数
```py
file = open("read.txt", "r", "UTF-8")
```
| 引数 | 必須 | 説明        |
|:----:|:---:|:------------|
|  $1  |  ○  | ファイル名    |
|  $2  |  -  | モード       |
|  $3  |  -  | 文字コード    |
モードのオプションは複数指定が可能。

| タイプ |  説明               |
|:-----:|:--------------------|
|   r   | 読み取り専用         |
|   a   | 追記、ファイルがない場合は生成  |
|   t   | テキストモード(default)    |
|   b   | バイナリモード       |

withステートメントを使用すると、自動でclose()が可能。

```py
with open('text_file.txt') as file:
    print(file.read())
```

### 連結
```py
# join関数で簡単に連結
"-".join(["foo", "bar", "baz"])
>>> 'foo-bar-baz'
```

### 変換
```py
# "%s"で置き換えも楽チンに
"%s, %s, %s!" % ("one", "two", "three")
>>> 'one, two, three!'
```
Bowerを利用してVue.jsを使えるところまでのインストール手順

Vue.jsに入門するため、とりあえず動かすことができる環境を作りました。
ローカルでhtmlファイルを作成して、[公式サイト](http://jp.vuejs.org/)の「10秒で分かる例」を動作させることを目標にします。
ついでにJavaScriptのエコシステムを体験したいので、Bowerからインストールしていきます。

※ Node.jsのインストールは省略します。
## Bowerのインストール  
```
$ npm install bower -g
```

バージョン確認

```  
$ bower -v
```


※パッケージからNodeをインストールして`npm insall`の実行時にパーミッションエラーが発生する場合などは、適宜 `sudo` をつけて実行します。

## BowerでVue.js入門用のプロジェクトを作成
プロジェクト用に適当なディレクトリを作成して、そこへ移動
 
```
$ mkdir hello_vue
$ cd hello_vue
```
Bowerの初期化コマンドを打って、bower.json(設定ファイル)を作成

```
$ bower init
```
このあとたくさん質問が出てきましたが、今回はname, descriptionだけ指定して、他はEnterもしくはYesにしました。

```作成されたbower.json
{
  "name": "hello_vue",
  "version": "0.0.0",
  "authors": [
    "xxx <xxx@example.com>"
  ],
  "description": "My first Vue.js application.",
  "main": "index.html",
  "license": "MIT",
  "ignore": [
    "**/.*",
    "node_modules",
    "bower_components",
    "test",
    "tests"
  ]
}
```
## BowerでVue.jsをインストール
```
$ bower install vue --save
```
Vue.jsのパッケージは、 __bower_components__ というディレクトリの中にインストールされており、vueディレクトリの中にはなにやらたくさんファイルができています。

```
$ ls -1 bower_components/vue
LICENSE
bower.json
build
circle.yml
dist
perf
src
```

bowerはgithubから取ってくるだけなのでこうなっているようですが、今回の例であれば実際は __dist__ の中にある、

* vue.js
* vue.min.js

しか必要ありません。


## HTMLファイルを作成して、Vue.jsのサンプルコードを動かす
サンプルコードは[公式サイト](http://jp.vuejs.org/)の「10秒で分かる例」そのままです。

* __HTMLファイルのひな形(index.html)を作成__

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title>Hello Vue</title>
</head>
<body>

</body>
</html>
```

* __Vue.jsを読み込む__

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Hello Vue</title>
  <script type="text/javascript" src="bower_components/vue/dist/vue.min.js"></script>
</head>
<body>

</body>
</html>
```

* __bodyタグの中にサンプルコードを挿入__

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Hello Vue</title>
  <script type="text/javascript" src="bower_components/vue/dist/vue.min.js"></script>
</head>
  <body>
    <div id="demo">
      <p>{{message}}</p>
      <input v-model="message">
    </div>
    <script>
    var demo = new Vue({
      el: '#demo',
      data: {
          message: 'Hello Vue.js!'
      }
    })
    </script>
  </body>
</html>
```
ここで script部分をheadタグの中に入れてしまうと、DOM読み込み前なのでうまく動きませんでした。

最後にWebブラウザでindex.htmlを開いて、動作確認できれば終了です!

## 番外: gitで上記のようなBowerプロジェクトを管理するとき
パッケージインストール時の--saveオプションによって記載される、 __bower.json__の"dependencies"(依存関係)に書かれているパッケージは、`bower install`コマンド(パッケージ名を指定しない)で勝手にインストールされます。
そのため、ファイルサイズなどを考慮するとbower_componentsディレクトリ自体をgitの管理対象外にしておいたほうが良いようです。

### bower_componentsディレクトリを無視する
* .gitignoreを作成 
ディレクトリ名を一行書くだけです。

```.gitignore
bower_components/
```
* .gitignoreをstageしてcommit

```
$ git add .gitignore
$ git commit
```