OmniAICreator/Qiita-1.07M huggingface dataset:
「プログラムでシダを描画する」をPostScriptで描画する

>空前のシダ描画ブーム到来！？(^^;)
>あなたも得意なプログラミング言語でシダを描画してみよう！

これまでの一覧

- [「プログラムでシダを描画する」一覧](http://qiita.com/qt-luigi/items/b22204c7ef73260324bd)

僕もやりたくなった。
まだ誰もやってない言語で僕の書けるものとしてPostScriptでやってみた。

# コード

```postscript:sida.ps
%!PS-Adobe-3.0
2 dict dup /PageSize [595 842] put dup /ImagingBBox null put setpagedevice
/drand {rand 2 31 exp div} def
/plotadot {842 mul exch 595 mul 595 add exch moveto 1 1 rlineto stroke} def
/W1x {0.044 mul exch 0.836 mul add} def
/W1y {0.836 mul exch -0.044 mul add 0.169 add} def
/W2x {0.302 mul exch -0.141 mul add} def
/W2y {0.141 mul exch 0.302 mul add 0.127 add} def
/W3x {-0.302 mul exch 0.141 mul add} def
/W3y {0.141 mul exch 0.302 mul add 0.169 add} def
/W4x {pop pop 0} def
/W4y {0.175337 mul exch 0 mul add} def
/f1 {2 copy W1x 3 1 roll W1y} def
/f2 {2 copy W2x 3 1 roll W2y} def
/f3 {2 copy W3x 3 1 roll W3y} def
/f4 {2 copy W4x 3 1 roll W4y} def
/fp{
    dup 0 gt
    {
	drand 0.3 le{3 copy 3 1 roll f2 3 2 roll 1 sub fp}if
	drand 0.3 le{3 copy 3 1 roll f3 3 2 roll 1 sub fp}if
	drand 0.3 le{3 copy 3 1 roll f4 3 2 roll 1 sub fp}if
	3 1 roll f1 3 2 roll 1 sub fp
    }
    {pop exch 0.5 sub exch plotadot}
    ifelse
}def
0 0 20 fp
showpage
```

# 実行結果

GhostscriptでPNGに変換したもの。
![sida.png](https://qiita-image-store.s3.amazonaws.com/0/47615/460bc935-b882-dea5-c636-23fabb7d5269.png)
Android Studioでファイル保存時にコードを最適化したい

保存時にOptimizationImportsとReformatCodeを行う方法を説明します。保存時にこれを行わないと不要なimportがコミットに含まれたりしてイラッ☆としますよね。

結論から言うとマクロ作ってCmd+Sのショートカットにマクロを割り当てるだけです！

## 環境
* Android Studio 0.5.2
* Mac OS X 10.9.3

## 方法

### マクロをスタート

```
Edit => Macros => Start Macro Recording
```

### OptimizationImportsとReformatCodeを記録

* Optimization Imports

```
Code => Optimization Imports
```
* 初回は現在のファイルかディレクトリ内の全てのファイルに適用するかどうかのダイアログが出てきます。全てのファイルにチェックをして、次からダイアログを表示しないにチェックを入れれば良いかと思います。

* Reformat Code

```
Code => Reformat Code
```

### ファイルを保存

```
File => Save All
```

### マクロを終了

```
Edit => Macros => Stop Macro Recording
```
* マクロにお好きな名前をつけて下さい。私は「OptimizationImportsAndReformatCodeOnSave」って付けました。（そのまんま）

### Cmd+Sマクロに置き換え

```
Android Studio => Preferences => Keymap
```
* 各コマンドのショートカットが出てきます。 **Macros** の中に先ほど作ったマクロ、私の場合ですとOptimizationImportsAndReformatCodeOnSaveがあります。
* OptimizationImportsAndReformatCodeOnSaveをダブルクリックして下さい。
* 以下のようなダイアログが出るのでAdd Keyboard Shortcut を選択して下さい。

![スクリーンショット 2014-06-29 1.45.06.png](https://qiita-image-store.s3.amazonaws.com/0/26265/4f39da4e-1cd1-007d-1962-c05f1c397b40.png)

* First Stroke にCmd+Sを割り当ててOKを選択して下さい。

 ![スクリーンショット 2014-06-29 1.47.31.png](https://qiita-image-store.s3.amazonaws.com/0/26265/bef97bf0-52ad-3030-1d5c-7ca72c8fadbd.png)

以上です。これで保存時にOptimizationImportsとReformatCodeされるようになりました。

参考↓↓↓
http://stackoverflow.com/questions/946993/intellij-reformat-on-file-save
android path

android コマンドを実行するためにパスを通します

sdkダウンロードして解凍したフォルダをリネーム
android/sdk ってなるのが綺麗だと思ったのでこうした
/Application以下にしたのは特に意味ない

# android
```
export ANDROID_PATH="/Applications/android/sdk"
export PATH="$PATH:$ANDROID_PATH/platform-tools:$ANDROID_PATH/tools"
```

android studioインストールしてたら

```
$ pwd
/Applications/Android Studio.app/sdk
$ tree -L 1
.
├── build-tools
├── extras
├── platform-tools
├── platforms
└── tools

5 directories, 0 files
```

こっちにしといたほうがいいのかなー

っか、android Lでたから新しくなってるやん
RaspberryPi + Raspbianで起動時にネットワークを切り替えられるようにする


RaspberryPiは[個人的にやっている計測データのライブ配信サービス](http://sports-live.me)のアプライアンスとして利用しているのですが、各計測現場で複数のRaspberryPiを稼働させたり、ネットワーク環境の異なる場所に配置することがあるため、RaspberryPiの外部からネットワーク設定を変更する必要がありました。

これまではSDカード上のLinuxのファイルシステムを別のホストでマウントして書き換えていたのですが、さすがにこれは手間がかかる上、技術者が居ないと作業が難しいため、WindowsやMac上から簡単に変更できるようにしよう、というのが今回の目的です。


# どうやってネットワーク設定を書き換えるのか

WindowsやMac上からSDカードに設定を放り込んで、それをRaspbian上で展開してあげれば良いだろうと考えました。

実はRaspbian起動後にSDカードの内容を読み書きすることが出来ます。起動直後の`/boot`にはSDカードがマウントされており、初期状態で読み書きすることが出来ます。

以下は`ls -al /boot`の出力結果（TrashesとかあるのはMacでマウントしたからだと思う）。

```text
合計 9708
drwxr-xr-x  5 root root   16384  1月  1  1970 .
drwxr-xr-x 23 root root    4096  6月 27 00:55 ..
drwxr-xr-x  3 root root    8192  6月 26 02:27 .Trashes
-rwxr-xr-x  1 root root    4096  6月 26 02:27 ._.Trashes
drwxr-xr-x  2 root root    8192  6月 28 23:11 .fseventsd
-rwxr-xr-x  1 root root   18974  9月 25  2013 LICENSE.oracle
-rwxr-xr-x  1 root root   17824  6月 19 19:59 bootcode.bin
-rwxr-xr-x  1 root root     120  6月 20 06:51 cmdline.txt
-rwxr-xr-x  1 root root    1235  6月 26 16:45 config.txt
-rwxr-xr-x  1 root root    5845  6月 19 19:59 fixup.dat
-rwxr-xr-x  1 root root    2090  6月 19 19:59 fixup_cd.dat
-rwxr-xr-x  1 root root    8822  6月 19 19:59 fixup_x.dat
-rwxr-xr-x  1 root root     137  6月 20 10:33 issue.txt
-rwxr-xr-x  1 root root 3192224  6月 19 19:59 kernel.img
-rwxr-xr-x  1 root root 2557720  6月 19 19:59 start.elf
-rwxr-xr-x  1 root root  512792  6月 19 19:59 start_cd.elf
-rwxr-xr-x  1 root root 3500744  6月 19 19:59 start_x.elf
```

ここにネットワーク設定ファイルを保存して、Raspbian起動後に自分自身を再設定するようにします。


# ネットワーク設定はどのような内容か

Raspbianのネットワーク設定は`/etc/network/interfaces`に記録されています。だいたい次のような内容になっているでしょう。


```
auto lo
iface lo inet loopback

## eth0の設定
# DHCPで設定する場合
# iface eth0 inet dhcp

# 静的アドレスを割り当てる場合
iface eth0 inet static
  address 192.168.10.200
  netmask 255.255.255.0
  gateway 192.168.10.1
  dns-nameservers 192.168.10.1
```


これを`/boot/interfaces`としてコピーします。


# Raspbian起動時にinterfacesをコピーして、ネットワークを再設定する

`/etc/rc.local`は起動時に必ず読み込まれるシェルスクリプトです。ここに`interfaces`ファイルのコピーとネットワークの再設定処理を追加します。

```
## setup network
if [ -f /boot/interfaces ] ; then
  cp /boot/interfaces /etc/network/interfaces
  /etc/init.d/networking reload
fi
```


# 確認手順

RaspberryPiを停止して、WindowsあるいはMacでSDカードをマウントし、先ほどコピーした`interfaces`ファイルを編集します。

次に、SDカードをRaspberryPiに差し込んで起動すると、新しいネットワーク設定で起動していることが解るでしょう。
Crucial SSD MX100 買ってみた、速度調査

# SSD 追加購入した
Windows 環境で Vagrant を 10個位立ち上げていたらディスクスペースが 1Gも無い状態だったので SSD を購入してみました。なんでも最近は、SSD のベンチマーク結果を公表したあと **こっそりと** コントローラのチップセットを古いのにするとかとか・・・。嫌な世の中やーｗ

> http://blog.livedoor.jp/katyou_get9/archives/crucial-ssd-mx100.html

# Crucial SSD MX100
SSD 安くなりました。13,000円（2014/06/20現在） SSD 256GB がこんな値段で買えるとは。
とりあえず samsung SSD 840 Series とのベンチマーク。

## Samsung SSD 840 Series
![sumsun.png](https://qiita-image-store.s3.amazonaws.com/0/44540/a4c1451b-7013-4d29-9832-691a40bcd9a7.png)

## Crucial SSD MX100
![mx100.png](https://qiita-image-store.s3.amazonaws.com/0/44540/7b4241af-5c6a-c011-cdf3-4f977e488a3b.png)
RaspberryPiをオーバークロックする


# 前提

* ArchLinux (Jun 2014)


# 概要

非力なRaspberryPiをなんとか高速化するためオーバークロックする。RaspberryPi model A, model BともにARM1176JZ-Fを700MHzで動作させている。オンボードチップの動作保証温度は以下のとおり。

| チップ | 用途 | 温度 |
|:-:|:-:|:-:|
| Broadcom BCM2835 | CPU, GPU, DRAM, SDIO | -40℃ 〜 85℃  |
| SMSC LAN9512-JZX | Ethernet, USB | 0℃ 〜 70℃ |

ちなみに、ケースに入れて使っていると45℃〜60℃くらい。ケースなしで50℃くらいで動作しています（vcgencmdで確認）。

```bash
/opt/vc/bin/vcgencmd measure_temp
```


# /boot/config.txtの書き換え

起動時の設定ファイルにより動作クロックを変更することが出来る。詳細については[eLinuxの資料](http://elinux.org/RPi_config.txt)を参考にした。

デフォルトのCPUクロックは700Mhzであることがわかる。

```text:/boot/config.txt
## Some over clocking settings, govenor already set to ondemand

##None
#arm_freq=700
#core_freq=250
#sdram_freq=400
#over_voltage=0
```

1GHzまでクロックアップするには次のようにする。

```text:/boot/config.txt
##Turbo
arm_freq=1000
core_freq=500
sdram_freq=500
over_voltage=6
```

----

参考

* [Raspberry Piの熱対策](http://muranoya.net/wordpress/?p=331)
* [SMSC LAN9512/LAN9512i (PDF)](http://ww1.microchip.com/downloads/en/DeviceDoc/9512.pdf)
* [BCM2835](http://ja.broadcom.com/products/BCM2835)
ubuntuでシステム設定内のパネルが消えてしまったときの戻し方

僕はgnomeを使ってるのでgnomeでの戻し方です。
↓以下をコマンドで入力
sudo apt-get install gnome-panel

【参考】
http://tattu1902.blog136.fc2.com/blog-entry-36.html
CentOS6.5 + Ruby 2.1.2p95 + Redmine 2.5.1 

# いまさらRedmine ・・・
Vagrant で作成していた redmine が立ち上がらず色々と試みたもお手上げで復旧しなかったので、クリーンインストールしたメモ。そのうちレシピ書きます。きっと。。
しかも Ruby 2.1系だと Redmine 2.5.1 は起動しないと記事見かけたので「ほんとかいな？」とインスコし試してみました（結果的に動作に問題ないようです）。

## ソフトウエアのバージョン

| ソフトウェア | バージョン |
|:-----------|:----------|
|Ruby        |2.1.2p95   |
|MySQL	     |5.1.73     |
|Passenger   |4.0.45     | 

# 公式blogとおりにインストール＆実行する
といっても自分メモ。多少バージョンの違えはあれど基本的な手順は同じです。あと rbenv は使ってません。
> [Redmine 2.5をCentOS 6.5にインストールする手順](http://blog.redmine.jp/articles/2_5/installation_centos/)

## EPELリポジトリの登録＆パッケージのインストール

```lang:command
$ rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
```

```lang:command
# yum groupinstall "Development Tools"
# yum -y install openssl-devel readline-devel zlib-devel curl-devel libyaml libyaml-devel ncurses-devel gdbm-devel tcl-devel db4-devel libffi-devel wget lsof tree
# yum -y install mysql-server mysql-devel
# yum -y install httpd httpd-devel
# yum -y install ImageMagick ImageMagick-devel ipa-pgothic-fonts
```

## Ryby 2.1.2p95 のコンパイルとインストール
ソースからコンパイルするので結構時間が掛かります。rbenv 使った方が面倒がないけど・・・まあいいか。

```lang:command
$ mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} 
$ wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.2.tar.gz -P rpmbuild/SOURCES
$ wget https://raw.githubusercontent.com/hansode/ruby-2.1.x-rpm/master/ruby21x.spec -P rpmbuild/SPECS
$ rpmbuild -bb rpmbuild/SPECS/ruby21x.spec
# rpm -Uvh rpmbuild/RPMS/x86_64/ruby-2.1.2-2.el6.x86_64.rpm
```

## あとは、公式blogとおりに手順を進める
「bundlerのインストール」 ⇒ 「MySQLの設定」 ⇒ 「Redmineのインストール」 ⇒ 「Gemパッケージのインストール」 ⇒ 「Redmineの初期設定とデータベースのテーブル作成」 ⇒ 「Passengerのインストール」 ⇒ 「Apacheの設定」 ⇒ 「Passengerの設定を追加」 ⇒ 「おわり」

## /etc/httpd/conf.d/passenger.conf
Passengerの設定を追加で少しハマる。conf を読むと判るとおり ```passenger-install-apache2-module --snippet``` の実行結果をこぴぺ。

## 設定しておくとよさげなこと

> [redmineでGitHubのMarkdown記法を利用する](http://qiita.com/mountcedar/items/9d313a6a0a8f86f1d962)
> [[Redmine]RedmineのWiki記法にMarkdownを選択する方法](http://d.hatena.ne.jp/toritori0318/20120417/1334673901)
> [Githubライクなテーマに](https://github.com/makotokw/redmine-theme-gitmike)

### 参考にさせて頂いたサイト様

> [rbenv,CentOS6.5で作るredmine環境](http://qiita.com/legnoh/items/835ad5d1fa06a333348e)
> [VagrantのCentOS6.5にRedmineをインストールする](http://qiita.com/kijitoraneko/items/c5520c4e75e26176d7e1)

# “かんばん”とバーンダウンチャートを使いたい
“かんばん”とバーンダウンチャートを使いたいのだけど plugin 入れるの面倒だし…と思っていたら、ALMinium というパッケージを入れれば全部いり！という。超絶便利なのがあるみたい。

次回、ALMinium を入れてみるの記事なり。
RuboCop | Style/DotPosition

# RuboCop | Style/DotPosition

## 概要

RuboCopの「Style/DotPosition」警告について。

複数行でメソッドを記述した場合に、ドットをどの行に記述するかをチェックする。
デフォルトはメソッド名と同じ行。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-------|:-----|:---|:--------:|
|EnforcedStyle|leading|メソッド名と同じ行にドットを記述する|○|
|EnforcedStyle|trailing|メソッド名の前の行にドットを記述する|--|

## DotPosition

各設定値（leading, trailing）での検証結果をまとめます。

### 検証プログラム

preferred_methods.rb

~~~ruby
p 'hIgE'
  .upcase

p 'hIgE'.
  downcase
~~~

### 実行結果 デフォルト の場合

.rubocop.yml

※明示的に設定しているが、デフォルト値なので何も設定しなくてもよい

~~~yaml
DotPosition:
  EnforcedStyle: leading
~~~

~~~bash
$ rubocop dot_position.rb
Inspecting 1 file
C

Offenses:

dot_position.rb:4:9: C: Place the . on the next line, together with the method name.
p 'hIgE'.
        ^

1 file inspected, 1 offense detected
~~~

### 実行結果 DotPosition を trailing に変更した場合

.rubocop.yml

~~~yaml
DotPosition:
  EnforcedStyle: trailing
~~~

~~~bash
$ rubocop dot_position.rb
Inspecting 1 file
C

Offenses:

dot_position.rb:2:3: C: Place the . on the previous line, together with the method call receiver.
  .upcase
  ^

1 file inspected, 1 offense detected
~~~
はじめてのBlender勉強会 ボーン＆IK編


2014-06-28 @渋谷

ボーン
--------------------
ボーンを追加メニューから追加
ボーンは D で複製

骨を多関節状に追加するときは、e で伸ばしてから、右クリックでXYZ軸のあれをだす。
でXYZいずれかの軸を伸ばすとその方向にボーンがのびる。
![スクリーンショット 2014-06-28 14.35.00.png](https://qiita-image-store.s3.amazonaws.com/0/20773/f7a41ae6-3d0e-5cf7-eb4c-e2f19e566152.png "スクリーンショット 2014-06-28 14.35.00.png")
_これをするとまっすぐな（ひねられてない）ボーンがのびる_

* IK  
  インバースキネマティクス（関節制御
* FK  
  フォワードキネマティクス（回転制御？

**人型リグのアドオンを追加する**
![スクリーンショット 2014-06-28 14.23.40.png](https://qiita-image-store.s3.amazonaws.com/0/20773/679a6f89-4bd2-499e-6981-3103a30c7122.png "スクリーンショット 2014-06-28 14.23.40.png")

![スクリーンショット 2014-06-28 14.24.51.png](https://qiita-image-store.s3.amazonaws.com/0/20773/49d600e1-1e97-4908-3bf7-805e3c175090.png "スクリーンショット 2014-06-28 14.24.51.png")
_ヒューマンリグ_

IK
--------------------
ボーンに名前をつける
![Blender.png](https://qiita-image-store.s3.amazonaws.com/0/20773/8f0c771a-95c7-2c70-4ab2-1bdf8b1cdcfb.png "Blender.png")

D で親子関係あるボーンを複製
![Blender.png](https://qiita-image-store.s3.amazonaws.com/0/20773/65eb63dd-6dc2-0783-6f4a-900112fd8deb.png "Blender.png")

IKをいれる
![スクリーンショット 2014-06-28 14.41.35.png](https://qiita-image-store.s3.amazonaws.com/0/20773/224cab18-e645-74d3-b6af-f0b71eceeffd.png "スクリーンショット 2014-06-28 14.41.35.png")

ターゲットを決める
![Blender.png](https://qiita-image-store.s3.amazonaws.com/0/20773/12326194-7869-8204-9f01-faa66cf55f86.png "Blender.png")


移動と回転と拡縮のツールの切り替え
![human_lookAround_fix_blend.png](https://qiita-image-store.s3.amazonaws.com/0/20773/d06530b9-c216-11cd-7374-8b3a8bde9a9d.png "human_lookAround_fix_blend.png")


ボーングループ
![human_lookAround_fix_blend.png](https://qiita-image-store.s3.amazonaws.com/0/20773/3b529696-8428-c726-f87c-e6a12c18c5af.png "human_lookAround_fix_blend.png")
3D View でボーン選択、Bone Groups の + ボタンで項目追加、Assignでボーン登録、Selectで登録されたボーンが選択される
（ボーンの解除は a）
VirtualBoxでArch Linuxを動かすための最低限の準備

VirtualBoxにArch Linuxを最低限インストールするために必要なことをメモ書きします。

なお、以下の点ご注意願います。

* ネットワークの設定については書いてませんので別途お願いします。
* 安全牌であろうファイルシステム：ext4とブートローダ：grubを選んでいます。

キーマップの設定
```
loadkeys jp106
```

パーティションを切る
```
fdisk /dev/sda
 -> o
 -> n [return/return/return/+ファイルシステムのサイズ]
 -> n [return/return/return/return]
 -> t [return/82]
 -> w
```

ファイルシステムを書き込む
```
mkfs -t ext4 /dev/sda1
mkswap /dev/sda2
```

必要なブツのインストール

```
mount /dev/sda1 /mnt

vi /etc/pacman.d/mirrorlist
  -> JapanのftpサーバURLをファイルの先頭に。

pacstrap /mnt base base-devel

genfstab -p /mnt >> /mnt/etc/fstab
arch-chroot /mnt
```

もろもろの設定

```
vi /etc/hostname
  -> hostnameを書いてください。

ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

vi /etc/locale.gen
  -> 「ja_JP.UTF-8 UTF-8」の行をアンコメント

locale-gen

vi /etc/locale.conf
  -> 「LANG="ja_JP.UTF-8"」を追加

vi /etc/vconsole.conf
  -> 「KEYMAP=jp106」を追加
```

ブートローダの準備
```
pacman -S grub-bios
grub-install --target=i386-pc --recheck /dev/sda
cp /usr/share/locale/ja/LC_MESSAGES/grub.mo /boot/grub/locale/ja.mo
pacman -S os-prober
grub-mkconfig -o /boot/grub/grub.cfg
```

rootのパスワード
```
passwd
  -> rootのパスワードを設定
```

後始末
```
exit
umount -R /mnt
reboot
```

ネットワークの設定
起動時にネットワークが有効になるようにしましょう。

```
systemctl enable netctl-auto@インタフェース名
```

インタフェース名は以下のコマンドで表示されます。

```
ip link
```

そして、DHCPでIPアドレスを割り当てられるようにしましょう。

```
systemctl enable dhcpcd.service
```

OpenSSHのインストール
Arch Linuxの[ここ](https://wiki.archlinux.org/index.php/Secure_Shell_%28%E6%97%A5%E6%9C%AC%E8%AA%9E%29)を参考にしてください。

これでインストールできると思います。
最低限インストールするだけなら、意外とArch Linuxは話が早いと思います。
Production環境のRails ConsoleをKAIZENする

production環境とdevelopment環境で複数のターミナルを開いている時に、誤ってproduction側で`User.delete_all`なんてやってしまった日には、泣くしかありません。
そうならないために、pryのpromptを拡張して自分が今どの環境のコンソールを触っているかわかるようにする。

以下を`Gemfile`に書く。

```rb:Gemfile
gem 'pry', require: false
gem 'pry-rails', require: 'pry-rails/console'
```

稼働しているサイト側でもpryを読み込んでしまうと無駄なメモリを使用してしまうので、`require: false`を必ず付ける。
`pry-debugger`などのpry拡張はproductionでは不要のため、`group :development`の中に入れておく。

```rb:config/initializers/pry.rb
if defined?(Rails::Console)
  require 'pry'
  env = if Rails.env.production?
    Pry::Helpers::Text.red(Rails.env)
  elsif Rails.env.development?
    Rails.env
  else
    Pry::Helpers::Text.purple(Rails.env)
  end
  Pry.config.prompt = [
    proc {|target_self, nest_level, pry|
      nested = (nest_level.zero?) ? '' : ":#{nest_level}"
      "[#{pry.input_array.size}] #{env} #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}(#{Pry.view_clip(target_self)})#{nested}> "
    },
    proc {|target_self, nest_level, pry|
      nested = (nest_level.zero?) ?  '' : ":#{nest_level}"
      "[#{pry.input_array.size}] #{env} #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}(#{Pry.view_clip(target_self)})#{nested}* "
    }
  ]
end
```

これで、以下のようにプロンプトが表示され、誤操作の心配がなくなります！

![792ac18c-fc77-11e3-957e-0261677f8489.png](https://qiita-image-store.s3.amazonaws.com/0/22653/05a17cb0-b481-e480-94b6-0f82614bf5ba.png)
goで作るexeファイルにアイコンを埋め込んでみる (Windows)

(2025-06-12：更新版の記事を作成しました → [Goで作るexeファイルにアイコンとかライセンス情報とか git の tag から得たバージョンなどを埋め込んでみる #Go - Qiita](https://qiita.com/zetamatta/items/05e6121d25c11d539dfd)）

# 参考サイト

* [[ANN] rsrc - Tool for embedding Windows executable manifests in Go programs.](https://groups.google.com/forum/#!topic/Golang-Nuts/shRlhV3Fe2E)
* https://github.com/akavel/rsrc

# やってみた

```
go get github.com/akavel/rsrc
cd %GOPATH%/src/github.com/akavel/rsrc
go build
copy rsrc.exe %HOME%\bin\.

cd (自分のソースディレクトリ)
rsrc -ico nyagos.ico -o nyagos.syso
```

作成された「nyagos.syso」は、組み込まれる go ソースのあるのと同じフォルダに置いておけば「go build」で自動的に組み込まれるとある。

# 注意すべきこと

`go build` だと組み込まれるが、`go build nyagos.go` など、具体的なソース名を引数に指定してしまうとアウトらしい。

# 余談

アイコンは [DotWork](http://www5a.biglobe.ne.jp/~suuta/soft.html#dotwork)というツールで作りました。
BabyTree

　今回はAOJ0191になります。いや〜なぜか分けの分からぬRuntimeError。どこが原因で起きているかわからない・・・。答えは出るのに通らない・・・・。

コード：

```java:

import java.util.*;
public class Main {
	void doIt() {
		Scanner stdIn = new Scanner(System.in);
		while(true) {
			int n = stdIn.nextInt();//肥料の種類
			int m = stdIn.nextInt();//肥料を与える回数
			if(n + m == 0) break;

			double[][] table = new double[n][n];
			for(int r = 0; r < n; r++) {
				for(int c = 0; c < n; c++) {
					table[r][c] = stdIn.nextDouble();
				}
			}
			double[][] dp = new double[m][n];
			Arrays.fill(dp[0], 1);//最初は効果がない
			for(int k = 1; k < m; k++) {
				for(int r = 0; r < n; r++) {
					for(int c = 0; c < m; c++) {
						dp[k][c] = Math.max(dp[k][c], dp[k - 1][r] * table[r][c]);
					}
				}
			}
			double ans = -1;
			for(int r = 0; r < dp[dp.length - 1].length; r++) {
				ans = Math.max(ans, dp[dp.length - 1][r]);
			}
			System.out.printf("%1.2f\n", ans);
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main().doIt();
	}

}
```
Macで知っておくとHappyなスクリーンショットあれこれ

せっかくなのでMacのスクリーンショットのとり方から保存場所と名前変更までをメモ :rabbit: 


# スクリーンショットをとる

+ 画面全体を画像として保存する

```
command（⌘） + shift + 3
```

+ 画面の一部（領域をドラッグして選択）を画像として保存する

```
command（⌘） + shift + 4

選択状態（上記を押した後）でさらに
「shift」を押しながらドラッグすると高さや横幅を固定できます。
「option」を押しながらドラッグすると選択の方法が変わります。
「space」を押しながらドラッグすると移動できます。
「esc」を押すと取り消す事ができます。
```

+ あるウィンドウ（カーソルを移動させて選択）を画像として保存する

```
command（⌘） + shift + 4 →　space

保存するときに「option」を同時に押すとウィンドウの下などの影がない画像を保存できます。
メニューバーのみの撮影も可能です。
```

+ スクリーンショットを画像としてではなくクリップボードに保存する

```
command（⌘） + shift + control + XX

XX部分は3や4など
```

+ メニューを開いている瞬間たとかカーソル付きなものなどを撮りたいときには「グラブ.app」をつかう

こんな状態を撮りたいときには　ファインダー＞アプリケーション＞ユーティリティ＞グラブ　のタイマー機能等を使ってみてください。

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/19712/babbc199-d51c-174a-184c-bdcb0cc192d5.png)

# スクリーンショットの保存場所を変更する

ターミナルでの操作です。自己責任でどうぞ。

```
$ defaults write com.apple.screencapture location ~/Desktop/screenCapture/
$ killall SystemUIServer

「~/Desktop/screenCapture/」は自分のお好きな場所に。
```

# スクリーンショットの保存時の名前を変更する

こちらもターミナルでの操作です。自己責任でどうぞ。

```
$ defaults write com.apple.screencapture name "capture"

デフォルトの「スクリーンショット 2014-01-01 10.37.15.png」のようなファイル名の スクリーンショット という文字の部分が変更できます。
```

日付だけにしようと思って「""」としても前に半角空白がはいります。そのあたりはもっと深いところを変更しないといけないので（自分はとくにやりたくないので）割愛します。
Google Map をスマートフォンサイト用 Web サイトに埋め込む

## 簡易な方法

普通に Google Map で検索すると、 __地図を共有/埋め込む__ が選択できます。

![神山温泉_-_Google_マップ.png](https://qiita-image-store.s3.amazonaws.com/0/904/2ca172de-843c-6a09-6dca-eb8bb8a7c702.png)

自分専用の地図というメッセージが出ていますが、検索結果のマーカーは表示されるので問題ありません。（表示形式が自分専用という事なんですかね）

![神山温泉_-_Google_マップ.png](https://qiita-image-store.s3.amazonaws.com/0/904/ee3f4677-12ec-cfb1-08b9-52a7d7be9d44.png)

`iframe` タグが表示されるので、後は自分の Web サイトに入れるだけです。

### ちょっと問題

埋め込んだサイトを iPhone の Mobile Safari で確認していると、拡大率が検索結果の通りではなく世界地図が表示されてしまいました。（ただしマーカーはちゃんと付いています）

ちないに Mobile Safari では Google アカウントにログインしていない状態でした。ログイン状態にすると上手くいく場合もあり、この辺がアカウントに紐付いた表示形式が関係しているのかなと思います。

### 参考

- [新しいGoogle Mapsで地図の埋め込みが可能に - Lifehacking.jp](http://lifehacking.jp/2013/12/embed-new-google-maps/)
- [地図（と短縮 URL）を共有する - Google](https://support.google.com/maps/answer/3727220?hl=ja&ref_topic=3092444)

## Google Maps Embed API を利用する

基本は以下のサイトを参照いただければ分かると思います。

- [Google Maps Embed API - Google Developers](https://developers.google.com/maps/documentation/embed/guide#api_key)
- [新しい Google Maps Embed API が公開、埋め込み地図のカスタマイズが簡単に - WWW WATCH](http://hyper-text.org/archives/2014/03/new_google_maps_embed_api.shtml)

### iframe タグを作成

[埋め込みタグの作成画面](https://developers.google.com/maps/documentation/embed/start) で検索キーを入れて、API Key を入れるだけなので簡単です。

![Google_Maps_Embed_API_—_Google_Developers.png](https://qiita-image-store.s3.amazonaws.com/0/904/9da67d08-e897-f43f-e9ca-a00a3ae7526e.png)

### 拡大率を指定する

[Optional parameters](https://developers.google.com/maps/documentation/embed/guide#optional_parameters) にあるように `zoom` で拡大率を指定できます。

>zoom sets the initial zoom level of the map. Accepted values range from 0 (the whole world) to 21 (individual buildings). The upper limit can vary depending on the map data available at the selected location.

```html:iframe_tag
<iframe width="600" height="450" frameborder="0" style="border:0" src="https://www.google.com/maps/embed/v1/place?q=%E7%A5%9E%E5%B1%B1%E6%B8%A9%E6%B3%89&key=***&zoom=18"></iframe>
```

この拡大率の指定まで行うと、 Mobile Safari で Google へのログイン状態に関わらず期待するマップを表示させる事ができました。

> iPhone(5S, iOS7) の Chrome や Android(4.4) の Chrome でも期待通り動作しました。

### できなかった事

場所の情報を表示しているカード（？）の表示がマーカーに被さってしまっていたので、表示の中心座標をずらしたかったので `region` を指定したかったのですが、`place` モードではできませんでした。。
【C言語】fscanfとwhileを使ってテキストファイルを読み込む win7 32bit


```c:003.c

#include <stdio.h>
#include <stdlib.h>

int main ()
{

    char a[20];
    FILE *f;
    char file_name[] = "test3.txt";

	/* ファイルオープン */
    if ((f = fopen(file_name, "r")) == NULL) {
        fprintf(stderr, "%s\n", "error: can't read file.");
        return EXIT_FAILURE;
    }

	while (fscanf(f, "%s", a) != EOF){
		printf("%s\n",a);
    }

	fclose(f);

    return 0;

}

```



```text:test3.txt
こんにちは
こんばんは
hello world 2010
hello world 2011
hello world 2012
hello world 2013
hello world 2013
hello world 2014

```

##環境
OS:windows7 32bit (自作機)
コンパイラ:Borland C++ 5.5.1 for Win32

##解説
fscanfとwhileを使ったテキストファイルの入力
ただし、1文のサイズが20以下とする

##コンパイルと実行結果
上記ソースを
C:\2014\0628\003.c
としてコンパイルして実行する。

```
C:\2014\0628>bcc32 003.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
003.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
C:\2014\0628>003.exe
こんにちは
こんばんは
hello
world
2010
hello
world
2011
hello
world
2012
hello
world
2013
hello
world
2013
hello
world
2014

C:\2014\0628>

```

##参考文献

[C言語関数辞典 fscanf](http://www.c-tipsref.com/reference/stdio/fscanf.html)
deploygateとwerckerを使ってタダでテスト用Androidアプリを自動配布する


TravisCI,CircleCI使いたいけど、料金が。。でも、Jenkinsとか自前で作るのもメンドイ。。と、いう方はwerckerが良いかもしれません。

以下の記事をパクって、deploygateでやるときの設定を書いていきます。ありがとうございます。
http://b.fly1tkg.com/2014/06/android-ci-testfairy/
http://blog.wercker.com/2013/09/19/Gettingstarted-with-android-part-1.html

## werckerの初期設定
省略。werckerのアカウント取得手順や、werckerbotとの連携、github,bitbucketとの連携は上記を参考にすればイケるはず。

## wercker.ymlを作成・リポジトリに追加する

werckerを使うためには、Androidプロジェクトディレクトリの直下にwercker.ymlファイルを追加してリポジトリにpushするだけです。

内容は以下のような感じになります。

```yml:wercker.yml
box: fly1tkg/android
# Build definition
build:
  # The steps that will be executed on build
  steps:
    - android-sdk-update:
        filter: sysimg-18
    - script:
        name: run gradle
        code: |
          gradle --full-stacktrace -q --project-cache-dir=$WERCKER_CACHE_DIR build
  after-steps:
    # Use the build results
    - script:
        name: inspect build result
        code: |
          pwd
          ls -la ./[your_app]/build/outputs/apk
          cp ./[your_app]/build/outputs/apk/*.apk $WERCKER_REPORT_ARTIFACTS_DIR
deploy:
  steps:
    - script:
        name: upload to deploygate
        code: |
          curl -F file=@[your_app]/build/outputs/apk/app-release.apk -F token="$DEPLOYGATE_API_KEY" https://deploygate.com/api/users/[user_name]/apps

```

buildタスクで、ソースを落としてきて、buildして、werckerのフォルダにapkを安置してます。

deployタスクで、安置されてるapkをcurlでdeploygateにpostしています。

※[your_app]には、AndroidStudioとかで作成したAndroidプロジェクト名を入力します。

※Environment Variableで、
`DEPLOYGATE_API_KEY: <deploygateのAPIキー>`
を設定しておきます。

これで、指定したブランチに差分をpushしたタイミングで自動でビルド、アプリの配信が行われるはずです。
スーパー便利。

-
追記 [2014-09-05]

google play servicesの5.0.89を使いたかったのでgradleに
`compile 'com.google.android.gms:play-services:5.0.89'`
って追加しwerckerでビルドしたらエラーがでた。

```
- android-sdk-update:
    filter: sysimg-19,extra-google-google_play_services,extra-android-m2repository,extra-google-m2repository
```

上記のように、必要なリポジトリを追加したら無事に通りました。よかった。
brew tap は不要な場合が多い

よくある

```
$ brew tap foo/bar
$ brew install baz
```

は、以下で実行できることが多い

```
$ brew install foo/bar/baz
```

  
  
効能
Brewfileにまとめた場合、明示的で分かりやすい（かもしれない）

```ruby:brewfile
install boot2docker
install homebrew/binary/jsl
install homebrew/binary/packer
install oppara/homebrew/wcwidth
install peco/peco/peco
```
PythonでE-Mailのバリデーションをする

与えられたE-Mailの形式がとりあえず正しいかをRFC 3696の方法に従ってチェックするには[lepl](https://pypi.python.org/pypi/LEPL/)が使える

```bash
pip install lepl
```

```py
import lepl.apps.rfc3696
email_validator = lepl.apps.rfc3696.Email()

if email_validator("foobar+abc@example.com"):
    print "OK"
```

[StackOverflow](http://stackoverflow.com/questions/8022530/python-check-for-valid-email-address)より
ただしピリオドが連続してるなどドコモとかの正しくRFC準拠していないメールアドレスの場合はFalseになる場合がある。@の前に一つだけピリオドがあるのはTrueが返った。
ボタンに下線をつける

既にボタン（dummyButton）がある前提で、ボタンに下線をつけてみます。


```objc
// 下線を生成
UIView *border = [[UIView alloc] initWithFrame:CGRectMake(0, _dummyButton.frame.size.height - 0.5f, _dummyButton.frame.size.width, 0.5)];

// 下線の色を設定
border.backgroundColor = [UIColor colorWithRed:0.1 green:0.1 blue:0.1 alpha:1];

// ボタンに下線を追加 
[_dummyButton addSubview:border];
```
CakePHPのプラグインやテーマで静的ファイルを使用する際の注意点


CakePHPには、プラグイン機能やViewを切り替えられるテーマ機能があり、静的なアセットファイルをwebrootとして一緒に含んで配布することが可能。便利なんだけど、当然、外から見られるような場所にあるわけじゃないので、CakePHPが用意したディスパッチャーを通して出力される。

## 前提

- CakePHP 2.4.x
- Apache 2.2.x


## 注意する点

何に注意しなくちゃいけないのかというと2点。

- PHPを通して静的ファイルを読み込み、出力するのでパフォーマンスが悪い（マニュアルにも記載されている）
- JSとCSSファイルは readfile() ではなく include で読み込まれるためPHPとして解釈される

1点目のパフォーマンス問題に関しては、マニュアルにあるように通常のwebrootからシンボリックリンクを貼れば解消される。

問題は2点目のJSとCSSをPHPとして解釈して出力する点。例えば以下の様なJSファイルが書ける。

```/app/View/Themed/hoge/webroot/piyo.js
var url = '<?php echo 'http://example.com'; ?>';
```

```実際に出力されるpiyo.js
var url = 'http://example.com';
```

一見便利そうに見える。えせsassっぽいこともできそう。が、これを表示させると出力が途中で切れる可能性がある。なぜ…と思って、CakePHPのディスパッチャーの該当ソースを見てみた。AssetDispatcher.phpに書かれている。


```/lib/Cake/Routing/Filter/AssetDispatcher.php
<?php
protected function _deliverAsset(CakeResponse $response, $assetFile, $ext) {
	ob_start();
	$compressionEnabled = Configure::read('Asset.compress') && $response->compress();
	if ($response->type($ext) === $ext) {
		$contentType = 'application/octet-stream';
		$agent = env('HTTP_USER_AGENT');
		if (preg_match('%Opera(/| )([0-9].[0-9]{1,2})%', $agent) || preg_match('/MSIE ([0-9].[0-9]{1,2})/', $agent)) {
			$contentType = 'application/octetstream';
		}
		$response->type($contentType);
	}
	if (!$compressionEnabled) {
		$response->header('Content-Length', filesize($assetFile));
	}
	$response->cache(filemtime($assetFile));
	$response->send();
	ob_clean();
	if ($ext === 'css' || $ext === 'js') {
		include $assetFile;
	} else {
		readfile($assetFile);
	}

	if ($compressionEnabled) {
		ob_end_flush();
	}
}
```

最後の方にある、拡張子がcssとjsだった場合は、readfile() ではなく include を使っていることが分かる。これによってPHPのコードが書ける恩恵がある。が、その上のコードを見るとContent-Lengthを出力している。


```
$response->header('Content-Length', filesize($assetFile));
```

これ、何がまずいかというと、PHPのコードを含んだ状態でのファイルサイズになるため、PHPが解釈されて実際に出力されるファイルサイズとは違うことになる。そうなると、10Kbあるはずのものが、12Kb出力しようとして、途中で切れてしまったりする。

## 解決方法

正直ここの根本的な解消が思いつかなかったが、gzip（mod_deflate）を有効にして、ここのContent-Lengthを無視させることで解消できる。

```deflate.conf
<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html
  AddOutputFilterByType DEFLATE text/css
  AddOutputFilterByType DEFLATE text/plain
  AddOutputFilterByType DEFLATE text/xml
  AddOutputFilterByType DEFLATE application/xhtml+xml
  AddOutputFilterByType DEFLATE application/xml
  AddOutputFilterByType DEFLATE image/svg+xml
  AddOutputFilterByType DEFLATE application/rss+xml
  AddOutputFilterByType DEFLATE application/atom_xml
  AddOutputFilterByType DEFLATE application/javascript
  AddOutputFilterByType DEFLATE application/x-javascript
  AddOutputFilterByType DEFLATE application/x-httpd-php
  AddOutputFilterByType DEFLATE application/x-httpd-fastphp
  AddOutputFilterByType DEFLATE application/x-httpd-eruby
</IfModule>
```

設定は超適当。

だが、なんかそもそもこのJSやCSSにPHPのコードを書いて、PHP経由で出力させること自体キモい感じするので、素直にシンボリックリンクを貼って、静的ファイルとして配信することが一番かもしれない。

参考URL

- http://book.cakephp.org/2.0/ja/views/themes.html
- http://book.cakephp.org/2.0/ja/plugins.html#plugin-assets
CodeIgniterで本番環境でのエラー出力を抑制する

開発環境ではエラー表示、本番ではエラー非表示。だけどPHPのエラーログは記録してほしい。
CIには`ENVIRONMENT`というそれらしい定数があるので、これを`production`にすればいいんだろうなって思ってました。
すると、エラー出力と一緒に**ログ出力も消えます**。やったね。

# error_reporting(0)

PHPのマニュアルを読むと、`display_errors`という設定が見つかります。

> display_errors string
エラーをHTML出力の一部として画面に出力するかどうかを定義します。

CodeIgniterでもこれを使って画面出力を抑制するんでしょうね。

```php:index.php
if (defined('ENVIRONMENT'))
{
	switch (ENVIRONMENT)
	{
		case 'development':
			error_reporting(E_ALL);
		break;

		case 'testing':
		case 'production':
			error_reporting(0);
		break;

		default:
			exit('The application environment is not set correctly.');
	}
}
```

> error_reporting integer
エラー出力レベルを設定します。

マニュアルにしては説明が足りない気がしますが、これはstdoutやログに渡る前にエラーをフィルタする設定です。
`error_reporting(0)`と書くと、全てのエラーをフィルタして出力しない、という意味になります。

CI「本番環境だって？じゃあエラー出力全部切るね！」

なお、v3.0では`display_errors`を変更するようになっています。

https://github.com/bcit-ci/CodeIgniter/commit/35ac46d4aad12fe723229feca403b4dee3efcc27

# CodeIgniterの例外ハンドラ

```php:/system/core/Common.php
if ( ! function_exists('_exception_handler'))
{
	function _exception_handler($severity, $message, $filepath, $line)
	{
		 // We don't bother with "strict" notices since they tend to fill up
		 // the log file with excess information that isn't normally very helpful.
		 // For example, if you are running PHP 5 and you use version 4 style
		 // class functions (without prefixes like "public", "private", etc.)
		 // you'll get notices telling you that these have been deprecated.
		if ($severity == E_STRICT)
		{
			return;
		}

		$_error =& load_class('Exceptions', 'core');

		// Should we display the error? We'll get the current error_reporting
		// level and add its bits with the severity bits to find out.
		if (($severity & error_reporting()) == $severity)
		{
			$_error->show_php_error($severity, $message, $filepath, $line);
		}

		// Should we log the error?  No?  We're done...
		if (config_item('log_threshold') == 0)
		{
			return;
		}

		$_error->log_exception($severity, $message, $filepath, $line);
	}
}
```

CIは独自に例外ハンドラを設定してエラーを表示していますが、ここも`error_reporting`だけを見ています。
`display_errors = Off`であれば`error_reporting`に関わらず非表示にしてほしいですね。

なお、v3.0では`display_errors`を考慮するようになっています。

https://github.com/bcit-ci/CodeIgniter/commit/94e36fd06f5ade974cf16a7eedbf960bc3ad27ba

# おまけ：致命的なエラー

ここまで話してきたログというのはPHPのエラーログですが、CIにもエラーログがあります。こちらは（今の実装では）`error_reporting`に関わらず記録されるので、これがあればPHPのエラーログがなくても、というところはあります。

ただ現状CodeIgniterは致命的なエラーをキャッチするためのシャットダウンハンドラが用意されていないため、致命的なエラーやそれに変換されるExceptionはCIのログに引っかからないという問題があります。これもv3.0では(ry

https://github.com/bcit-ci/CodeIgniter/commit/21fe9daf1cdc86cbd8800515166e19b2f8879b71

なおPHP初期化中のエラーはそれでもキャッチできませんが、`error_reporting`を変更するPHPコードも実行される前なので、これはphp.iniを適切に設定しましょう。

# どうするといい？

どれも CodeIgniter 3.0 で改善されています。

が、互換性のない変更点も少なくないようですから、[アップグレードガイド（英語）](http://www.codeigniter.com/userguide3/installation/upgrade_300.html)をご参照ください。

# 参考

http://stackoverflow.com/questions/1911920/does-php-error-reporting0-have-any-effect-on-logging-information
http://www.slideshare.net/noldor/code-igniter-27122684
「cannot.find.zip.align=The zipalign tool was not found in the SDK.」って出る


```
cannot.find.zip.align=The zipalign tool was not found in the SDK.

Please update to the latest SDK and re-export your application
or run zipalign manually.

Aligning applications allows Android to use application resources
more efficiently.
```

最新のADT Tools(v.23)を使用して署名付きビルド（Google Play用ビルド）しようとしたら、上記エラーが出ました。

`zipalign`コマンドが見つからないようなので、`tools`ディレクトリに無理やり置きます。

```bash
$ cd $ANDROID_HOME

$ cp build-tools/19.1.0/zipalign tools/
# lnだとなぜかダメ。。。
```

これで再度署名付きビルドすると成功します。
PHP用Elasticsearchクライント、Elasticaを使ってみる (3)


indexもtypeも指定せずに検索したいわ！というとき

```php
<?php
require_once '../vendor/autoload.php';

use Elastica\Client;
use Elastica\Search;
use Elastica\Query;
use Elastica\Query\MatchAll;

$client = new Client();
$search = new Search($client);
$query = Query::create(new MatchAll());
$total = $search->search($query)->getTotalHits();
var_dump($total);

```

SearchにClientを渡す。
これで全index、全typeを対象に検索できる。はず
CoffeeFormation


## CoffeeFormation とは？
**Coffee** Script + Cloud **Formation** = **CoffeeFormation**

CoffeScriptの記法でCloudFormationのテンプレートを書こうという物です。

## どんな感じで書くの？
```
Resources.Bucket=
  Type: "AWS::S3::Bucket"
  Properties:
    BucketName: "my-special-bucket"
```

これが

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "BucketName": "my-special-bucket"
      }
    }
  }
}
```

こうなります。

## どう使うの？

```
# npm経由でインストール
$ npm install -g csfn
/usr/local/bin/csfn -> /usr/local/lib/node_modules/csfn/bin/csfn
csfn@1.0.0 /usr/local/lib/node_modules/csfn
└── coffee-script@1.7.1 (mkdirp@0.3.5)

# 変換して出力してみる
$ cat bucket.coffee
Resources.Bucket=
  Type:"AWS::S3::Bucket"
  Properties:
    BucketName: "my-special-bucket"
$ csfn bucket.coffee
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "BucketName": "my-special-bucket"
      }
    }
  }
}

# AWS CLIに渡す
$ aws cloudformation create-stack --stack-name mybucket --template-body "$(csfn bucket.coffee)"
arn:aws:cloudformation:ap-northeast-1:123456789012:stack/mybucket/5de182a0-fe91-11e3-92e7-5088487c4896

```

## 何がいいの？
以下のメリットがあります。

+ コメントが書ける
+ JSONの文法エラーがなくなる (Atom等のエディタで随時コンパイルしながら書けばさらに安心)
+ ヒアドキュメントが書ける

```
commands = '''
#!/bin/sh
yum install -y httpd
service httod start
chkconfig httpd on
'''

:

Resources.Webserver=
  Type: "AWS::EC2::Instance"
  Proprerties:
     :
    UserData: "Fn::Base64":command

```
+ 繰り返しの定義をコードに出来る

```
Resources.Master=
  Type: "AWS::RDS::DBInstance"
  Properties:
    AllocatedStorage: 5
    DBInstanceClass: "db.t1.micro"
    Engine: "mysql"
    EngineVersion: "5.6.17"
    MasterUsername: "admin"
    MasterUserPassword: "password"

for i in [1..5]
  Resources["Slave"+i]=
    Type: "AWS::RDS::DBInstance"
    Properties:
      SourceDBInstanceIdentifier: "Ref":"Master"
```
##追記
少し改良。いきなり、"Resources.hoge=" で書き始められるようになりました。
リソースをグルーピングして、別ファイルに分けたい場合とかに便利かもしれない。

##追記2
npmでインストールできるようにしてみた。
性能設計について

性能設計はかなり難しいゾーンだと思います。
今までやってきた感覚だと以下の通りです。

構築メンバーの意見
→○○って型番のこういったスペックで△△の使用率です！！

上流メンバーの意見
→それは分ったけど、じゃあ今売ってるどのサーバのどれを何台必要なの？

クラウドは日が浅いのでちょっと分らないです。見ていて思うのが、いつでも性能変更できるからといってあまりみりみりやらないように見えます。今いるところのゆるふわ感・・・・（愚痴）

ただし、物理サーバの場合は、初期投資額の準備・置き場所・電源・手配・配線・・・etcとやること満載です。
ゆるふわだと終わります。

じゃあ実際にどうするか
私のやっていた方法を記述します。
一応国の機関に認めて貰えていたので、それっぽい感じだと思います。

#性能設計の流れ

性能設計の流れは一般的に以下の通りです。いろんなサイトや本、某メーカの性能設計講習等々で学びました。
機材手配がスケジュール的に後半で良ければ、実際の構築物で負荷試験等を実施してハードを決めることが可能です。
ただし、世の中そうは行かないのが多いかと思います。

`机上計算　→　プロトタイプによる実測及び補正　→　［機材手配］　→　実際の運用等でのチューニング`

机上計算：色々な計算方法があるので詳しくは書きません（要望があれば思い出し+勉強して書きます）
　　　　　ただし、アプリケーション構築チームの設計がある程度進んでいないとできません。
　　　　　出てくるのはせいぜいどれ位のHDD用意すれば良いか　ぐらいです（怒）

プロトタイプによる実測及び補正：これもアプリケーション構築チームが作ってくれないことにはできません。
　　　　　　　　　　　　　　　
実際の運用等でのチューニング：これは事後のお話です。ちゃんとチューニングして設計書に反映しておきましょう。
　　　　　　　　　　　　　　　次同じシステムやる時に頼りになります。

上記見て貰うと分ると思いますが、性能設計は絶望との闘いです！！

じゃあどうするのさ！（怒）

■新規構築
　①イチから作るしかない（絶望：大）
　　何としてでもプロトタイプを作成して貰いましょう　＆　性能設計出来ない旨を訴えて設計のスケジュールを長くとりましょう

　②お客様のところで類似システムがある　or　今まで似たようなシステムを手掛けたことがある（絶望：中）
　　類似システムの性能を頼りに説得文章を捻出します。

■換装（絶望：小）
　性能設計の流れを説明し、今動いているものが一番確実であると説明をします。
　そして、現行機器の性能分析をして、次の性能をどうするか決めます。

#部品に関する性能は何をポイントとするか
　今までやってきた感じだと、CPU、メモリ、HDDが決まれば営業もSEもOK!って感じです。
　どれも楽な方法は公表値を利用して机上で終わらせることです。
　お客様によっては搭載されているサーバを借りる or 買う→ベンチマークの上で決定する場合もあります。
　ベンチマークなんて・・・やりたくない

１．CPU
　今やメモリの搭載可能容量が大幅に上がり、ボトルネックが来るのがCPUとHDDになってしまいました。
　特にCPUはソフトウェアのライセンスに大きく響くので、積み過ぎは良くないです。
　下記３つのどれかで良いと思います。

（１）SPECのベンチマーク値を使用する
SPEC（Standard Performance Evaluation）というベンチマークテストの標準化を行っている非営利業界団体があります。
コンピュータの主要メーカのサーバについてのベンチマーク結果が公表されています。
http://www.spec.org/

色々テストがありますが、SPECint（整数演算性能）か、SPECfp（浮動小数点演算性能）を見ればよいと思います。
特に複数タスクで測定したSPECint_rate、SPECfp_rateの値を使います。
2014/6/28現在では「SPEC CPU2006 」を見てもらえれば大丈夫です。
（一応これにはメモリも含まれていますが・・・）

（２）FLOPS（Floating-point Operations Per Second）を計算する
浮動小数点数演算の性能になります。
http://ja.wikipedia.org/wiki/FLOPS

`クロック数　×　1サイクルの命令数　×　コア数'

http://topsecret.hpc.co.jp/wiki/index.php/2013%E5%B9%B4%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5%E3%81%AEFLOPS%E5%80%A4%E8%A8%88%E7%AE%97%E6%96%B9%E6%B3%95

（３）ベンチマークする
ロジックで変わってしまうので、自分で組んだり・ソフト使ったりで値が変わっちゃいます。同じものを使い続けるのが良いです。

このサーバではいくつでした。予定サーバではいくつで何倍なので大丈夫です！とか言いましょう。

２．メモリ
メモリの速度で処理能力が大きく変わります。しかし、他の部品の速度がボトルネックとなることが多いことから、`容量`を意識する方が強いと思います。

３．ディスク
インタフェース速度や回転速度等が大きく影響します。
用途によって使い分けるのが一般的です。

ただしお客様が一番意識するのは`容量と冗長性（RAID）`なので、そこだけ出しましょう。

システム領域：それほど性能要求が大きくないので、可用性重視で良いと思います。
データ領域　：参照・変更・削除が多い、容量が多いため複数本のディスクを用いた構成が望ましいです。
要求性能と予算に応じてどこまでやるかが勝負です。

※２および３の性能を強く求められた場合は
（１）カタログスペックで攻める
　　　インタフェース速度、回転数等々でかわせます

（２）ベンチマークする
　　　最悪の場合ですがしょうがないです・・・・



#現在利用しているサーバがあればまとめよう
下記の流れで現行システムの総性能をまとめましょう。

①機能などのカテゴリでサーバを分け、メーカ名、型番、CPU、メモリ、HDDの性能値を記述する。台数も記述する。
②それぞれの性能を台数でかけ、総性能を算出する。

#新しいサーバをどうするか
①サーバを決める前にやっておくこと
　・利用者数、接続数の増加はあるか
　　→ある場合は増加率とか言って総性能にかけてください。

　・機能追加や今遅くて困っているなどないか
　　→安全率という言葉を用い、1.2倍とかしてみる。（寝技）

②何か代表的なサーバを決めてしまいましょう
　・1台あたりの性能が今と同等（無難）
　・集約化を図るため、数倍の性能を持つものにしてみる
　　理由としては：今の市場で一番多いモデルであり、安定した供給が見込まれる　等
　　→リスクはあるが、OS使用しているところが台数減った時に浮くので保険ある状態

③いよいよ新サーバです！
　総性能/②で台数を出す

以上です。今までの流れをもっともらしく書いて調整すれば、何とかなります。

#そのほかにやっておくこと
重量、消費電力、発熱量については併せてまとめておきましょう。
お客様のサーバルームへの設置計画上で必要となります。
紙吹雪を降らせるjQueryプラグイン


生徒の作品に使えそうかなぁと思ったのと、
紙吹雪ってキャンバス意外で綺麗に見えてるのがあまりなかったので作ってみました！

ただやっぱりcanvasじゃないので、たくさんのタグを生成すると重くなっちゃいますね。

site: http://develo.org/2014/06/28/1557.html
GitHub: https://github.com/kamem/jquery.confetti


仕様
---
1. 指定の数だけ紙吹雪をふらせる
2. htmlとcssアニメーションで紙吹雪を再現
3. domなので少し重いため数は制限する必要がある
4. bodyの一番したにタグを生成
5. 画面外から消えた時にタグを削除
6. 全てのタグが画面外に消えた場合にcomplateを実行

[DEMO]
[DEMO]: http://github.develo.org/jquery.confetti/


使い方
---
	<script type="text/javascript" src="js/jquery.js"></script>
	<script type="text/javascript" src="js/jquery.confetti.js"></script>
	<script type="text/javascript">
	$(function(){
		$('html').confetti();
	});
	</script>

オプション
------

### 初期設定 ###
	x: $content.offset().left + $content.width() / 2,
	y: $content.offset().top + $content.height() / 2,
	num: 20,
	speedRange: 10,
	airResistanceNum:  0.95,
	gravityNum: 0.45,
	intervalSpeed: 30,
	complate: false

※ [x,y] defaultでは指定したタグの位置+タグの半分の位置

 * x: {Number} offset().left + width() / 2
 * y: {Number} offset().top + height() / 2
 * num: {Number} 紙吹雪の数
 * speedRange: {Number} 初速度の範囲
 * airResistanceNum:  {Number} 空気抵抗
 * gravityNum: {Number} 重力
 * intervalSpeed: {Number} 処理をどのぐらいの感覚で行うか
 * complate: {Function} 全てのタグが画面外に消えた場合実行される関数

例
------
htmlのどこかをクリックした際にクリック位置から紙吹雪をちらす

	$(function(){
		$('html').click(function(e){
			$('[class*=confetti]').remove();
			$('html').confetti({
				x: e.pageX,
				y: e.pageY,
				complate:function(){
					alert('complate');
				}
			});
		});
	});
SMTP コマンドを自分で打ってメールを送信する

# Overview

なんでもいいからテストメール投げるとか、環境の確認とか接続テストとか。
たまに必要となる時があるけど、たまにしか必要にならないので覚えられない SMTP コマンドの叩き方のおぼえがき。

# How To

`xxx` の部分は何らかのメッセージが出るところです。環境によって違います。説明文やドメイン名を表示する環境もあれば、`250 ok` みたいに一言しか返さないサーバもあります。
本当におぼえがきなので、解説はなしです。

```shell-session
$ telnet smtp.example.com 25
xxx (複数行)
220 xxx
HELO localhost
250 xxx
MAIL FROM:test@example.com
250 xxx
RCPT TO:test@example.com
250 xxx
DATA
354 xxx
Subject: Test
From: test@example.com
To: test@example.com

Test message...
.

250 xxx
QUIT
221 XXX
```
GoogleChromeで野良エクステンションが無効化されてしまうのを回避する【自分用備忘録】

##とは
2014年5月より、 Google Chrome の stable 版では、
ウェブストア以外からインストールされた拡張機能が導入済みであっても無効化されるようになりました。
( Google、Windows版 Chromeの拡張機能をウェブストア経由に限定。ストア外入手は導入済みでも無効化 - Engadget Japanese http://bit.ly/1nQZUn6)

暫定的にこれを回避する方法をメモしておきます。

##で
具体的にどうするのかというと、
グループポリシーでホワイトリストにエクステンションのIDを登録してしまうことで回避が可能のようです。
( Google Chrome ヘルプフォーラムにて alfa 氏が報告していました)

ただ、レジストリを直接いじる方法はAD管理下であるPCでしか行えないため、
それ以外のPCではローカルグループポリシーエディタで登録することになります。

##やり方
まずは Chromium Project の [Policy Templetes](http://www.chromium.org/administrators/policy-templates) のページより、
テンプレートをダウンロード。
[直リンク（http://dl.google.com/dl/edgedl/chrome/policy/policy_templates.zip）](http://dl.google.com/dl/edgedl/chrome/policy/policy_templates.zip)

MicroSoft の gpedit.msc (ローカルグループポリシーエディタ)を起動
『コンピュータの構成』→『管理用テンプレート』を右クリックし、
『テンプレートの追加と削除』を選択。

先ほどダウンロードしたzipにある、
`windows\adm\ja\chrome.adm`
を追加。

管理用テンプレートの所以下に従来の管理用テンプレート( ADM )ができるので、
『 Google 』→『 Google Chrome 』→『拡張機能』→『拡張機能インストールのホワイトリストを設定する』を選択、“有効”にする。

そのあと『表示…』のところから、追加したいエクステンションのIDを登録する。

※エクステンションのIDは、 `chrome://extensions/` より、デベロッパーモードで確認できる。

ホワイトリストに登録できたどうかを確認するには、 `chrome://policy/` を見るとわかる。

##P.S.
できるだけわかりやすく書いたつもり、
Qiitaの投稿っていうよりブログの投稿っぽいけど許して

read.crx 2 が使えなくて困っていたので無事解決
ノンプログラマーでも使えそうな、無料PHPメールフォームスクリプト３選



# やりたかったこと
プログラミングが得意でないデザイナー・コーダーさんにもフォーム実装ができるようになってほしくて、いくつか探しました。


#おすすめのスクリプト3選
##1. Microengine

Microengine メールフォーム
http://microengine.jp/mailform/

バリデーション（入力チェック）からキャプチャ認証、メール送信まで一通りなんでもできるフォームスクリプトです。マニュアルが整備されており、読めばすぐに使えます。



>主な特長
1.無料。商用利用でも無料。広告なし。~~リンクバック不要！~~無料時はリンクバック必須、購入することでリンクバックの削除が行えるようになりました。
2.静的HTMLで作成した入力画面、確認画面、送信完了画面をそのまま使える。
3.確認画面・自動応答メール・SMTP送信・CAPTCHA機能などを搭載。
4.大文字・小文字、全角・半角、カタカナ・ひらがな等の入力文字列を変換できる。
5.レンタルサーバーで動作させやすいPHPスクリプト。



##2. PHP工房

PHP工房　PHP多機能メールフォーム　フリー（無料）版
http://www.php-factory.net/mail/01.php


PHP工房さんが提供しているメールスクリプトです。Microengine に比べると非常にシンプルです。html と php の合わせて2つのファイルだけで構成されています。

無料版では、最低限の機能に限定されています。
メールアドレスの入力チェックは付いていますが、その他（例えば電話番号など）のチェックをしたい場合は、カスタマイズが必要になります。

あらかじめshift-jis, UTF-8, EUC-JP版の3つが用意されているのは嬉しい。

詳細なマニュアルはありませんが、ソースコード（mail.php）のコメントでだいたい使い方が分かります。

##3. Creasty

軽量でスタイリッシュな PHP フォームバリデーションライブラリ 
http://www.creasty.com/blog/stylish-php-form-validation-library

https://github.com/creasty/form-php

上2つに比べると、若干ハードルは高そうです。
ただ、バリデーションの拡張性は高そうで、jQueryなどでカスタマイズできる人にはうってつけかもしれません。

>特徴
オブジェクト指向
チェーンメソッドを使った jQuery のような簡単なシンタックス
Ajax 対応
自動返信メール機能
CSRF 対策として nonce 機能
スパム対策として CAPTCHA 対応
バリデーションのルールとフォームの HTML 生成のロジックを分離
フォームの HTML をルールを元に自動生成
バリデーション用のフィルターを拡張できる


#どれがいいの？

一通りの機能を手軽に使いたいなら1、シンプルで最低限の問合せフォームでよいのなら2、拡張性も求めたいのであれば3、といったところではないでしょうか。

他にもおすすめのスクリプトがあれば、ぜひ教えてください。
Agile Japan 2014 福岡サテライト


# 基調講演

##価値観の共有
+ 価値観の共有・共通の価値観
+ チームの中で自分の役割を把握している（女子サッカーの佐々木さんが見本）  
　安定雇用が生み出している
+ HOW TO レースではなく、What is　レース  
レースは一年前に終わっている！  
ビックデータを集めて分析する  

**データはマネージメントツール**

エラーなんてやってはダメ！（レーサーが死んでしまう）

**未来の目標を共有化することがチームの最高の仕事**

不景気はお金持ちが使い道に迷っていること。（投資しなくなった）
**いいもの(高級品)を出せば儲かる！**

GTRの最大の秘訣はアメリカを外したこと。

**スーパーカーでないものがスーパーカーを抜かしたこと**
日本人の発想でモノを作る（おもてなしの心）

##技術の進化
技術が進化した時に値段が上がったことがあるか？
iPhoneは技術は進化進化しているが、値段は下がっている。
**技術の進化は値段を下げる**
技術の進化は付加価値を上げない

**技術開発で原価を下げるか、海外展開して技術革新を止めるか。**
技術革新をやめると、低いレベルに合わせた技術低減。  
日本の商品は下になっている。

会社という檻の中にいるフィルターを通した情報で考えているため、社会が見えない。

**元々社会的使命で職業を選んだはず！**
会社は本来はHow To で職業の選択がWhat Iだったはずが、
いつのまにかに会社がWhat　Iになっている。

ドイツはインナーテスト。実際の道路で試す。国が支援する。
日本はテストコース。

ドイツはマイスター。国が技能認定してくれる。
日本は給料。

**仕事というものにプライドを持たせている！**

## 上流工程について
物事の開発の上流にいるのは、現場。 **現場の技術**
現場が作れるもの以外、設計も企画も書いてはダメ。

現場の技術のものづくりと設計がタッグを組んで作る。
トライアンドエラーはチームで開発していないから起こる。

『メーカーからきた部品を人間が組み合わせる。これがアッセンブリメーカー』

現場と設計がお互いレベルをあげていく。これが重要。
賃金格差ではなく、多様化での海外展開をすべき。
やるなら文化・人としてまで教育する。

**本当のグローバル化はその先にある。**
日本人の想像力はその先にあるはず。

ボーイングとエアバスの違いが表している。（海外化による多様化）

##想像力
+ 大事なことは認めること
+ 未来は言葉でなく画像でみている（夢は画像、言葉にはならない）
+ 言葉は過去しか語れないコミュニケーションツール
+ 言葉と数値でディスカッションしようとした瞬間に過去に戻っている

+　サッカーで合宿するというのは共通の画像をみるため

**一人で考える。考えた結果を言葉にする**

新しいものは言葉にならない
シーンを作れる言葉でリーダーは語る

## FQA
Q:末端まで言葉を伝えるには？
A:責任はすべて自分がとるから、全力でやってと伝える
　会社から肩書きをもらって有頂天になり自慢するしています。
　リーダーになったら会社からもらった肩書きを忘れる。失敗をフォローするにはどうすればいいかを考える。
　結果は後で考える。

Q:人月については？
A:工数ではなく能数。人は能数でみなくてはいけない。
　能数は経験した管理×イメージ力×執行実行力×　
　加点方式
　良いお金の使い方が企業活動の原理


Q:どんな価値観を共有すればいいのか
A:みんな趣味で仕事をしている。
**「人の喜び！」**というキーワードの元に目標が共有化できる。  
**仕事は人のため　 人のためにすべてを尽くせ**
　自分のために考えると発想ができなくなる。 

## 最後に
人生は一度しかない。
会社の組織に埋もれるのではなく、社会理念のために自分がやりたいことをする。
欲は持たずに、人のために尽くす。
そのくらいの決心がないと世界では勝てない。

ダメで元々。失敗しても良い。（失敗した時は社長が悪い位の気持ちでやる）
そう思うとなんでもできる。
失敗してはダメだと思うと何も出来なくなり、過去に戻ってしまい何もできなくなる。
zshの設定ファイルの読み込み順序と使い方Tipsまとめ


# 設定ファイルの種類と読み込み順序

読み込み順を確かめるには実際に各設定ファイルを作ってそのファイル上でファイル名をechoしてみれば良い


## ログインシェルの場合（iterm2起動時,SSH,TMUX,SCREENなど含む）

zshenv > zprofile > zshrc > zloginの順で、
それぞれglobalを読み込んだ後で、localを上書き読み込み

ちなみに以下の〜は環境変数\$ZDOTDIRがあればそれが使われて、なければ\$HOME(つまり〜)が使われます。

\$HOME以外に置きたい場合には\$ZDOTDIRを指定しましょう。
＃指定するとgit管理も楽ちんになりますね

1. global)  /etc/zshenv
2. local )  ~/.zshenv
3. global)  /etc/zprofile
4. local )  ~/.zprofile
5. global)  /etc/zshrc
6. local )  ~/.zshrc
7. global)  /etc/zlogin
8. local )  ~/.zlogin


## インタラクティブシェルの場合（iterm2上でbashやzshと打った場合）

zshenv > zshrc

1. global)  /etc/zshenv
2. local )  ~/.zshenv
3. global)  /etc/zshrc
4. local )  ~/.zshrc


## シェルスクリプト実行の場合

zshenv 

1. global)  /etc/zshenv
2. local )  ~/.zshenv

## ログアウトする場合

ログアウトするときだけはlocal→globalの順
zlogout

1. local ) ~/.zlogout
2. global) /etc/zlogout


# 設定ファイルの使い分け

## local(~/.xxxx)とglobal(/etc/xxx)

特定ユーザー（自分）のみ有効にしたい場合にはlocalで記述
すべてのユーザーで有効にしたい場合にはglobalで記述

ただしglobalはlocal設定で上書きされてしまうので、必ず設定されるかは保証されない


## zshenv

順序からもわかるようにどんな場合でも必ず最初に読み込まれる。
ログインシェル、インタラクティブシェル、シェルスクリプトのどの場合でも必要な環境変数などはここに記述するのが良い。

影響範囲が広くなることから特に目的がなければここに設定を記述するのは推奨されない。

例）

- $PATH
- $EDITOR
- $PAGER
- $ZDOTDIR


## zprofile

ログインシェルの場合に１度だけ読み込まれる。
つまりインタラクティブシェルやシェルスクリプトでは不要だけどログインシェルの時だけ必要な設定をする場合にはここに記述するのが良い。

## zshrc

ログインシェルとインタラクティブシェルの場合だけ読み込まれる。
シェルスクリプトでは不要な場合に記述する。
一般的に紹介されている記事ではこの設定ファイルにいろいろ記述することが多い。

困ったらここに記述してみて問題が出てきたらちゃんと場所を考えるという運用でも問題ないかもしれない。





## zlogin

ログインシェルの場合だけ読み込まれる。
zprofileと一緒なのだが、重要なのはzshrcの後に読み込まれるということ。
ちなみにzprofileとzloginを一緒に使うことはあまり想定されていないらしい。
どちらか一方を使うイメージかな

## zlogout

シェルからexitする前に読み込まれる。
最後に定型的な処理をさせたい場合にはここに記述する。

# Zsh 設定ファイルTips

## スクリプトが大きくなってきたらコンパイルしましょう

カスタマイズしていくとだんだんファイルが大きくなってきます。
ファイルが多く、とくにスクリプト系が増えると読み込みにも時間がかかってしまい快適さが失われてしまいます。

そんな時は、コンパイルをしましょう。

```
$ zcompile ~/.zshrc
```

これを実行すると.zshrc.zwcができます。
このファイルは、zshで自動的に読み取られるようになっています。

ファイル変更を完治して自動的にコンパイルすれば楽ちんですね。

## 環境に合わせて設定ファイルを分割し読み込む量を最小限にしましょう

開発で、OSXとLinuxなど複数使い分けることはよく有りますが、完全に別の設定ファイルを準備していたら管理が手間なのでできれば統一したいところです。

ただ環境依存の設定なんかもあるので完全に統一は困難でも有ります。

そういう時は共通ファイルと個別ファイルと言う形でファイル分割しておき、環境に応じて共通ファイルから個別ファイルを読み込むということを実施すれば、ファイル管理や読み込み時間も必要最小限で済みます。

以下は、個別ファイルを${OSTYPE}毎に読み分けている例です。
darwinはmacのことだと思ってください。

```
# .zshrc
case ${OSTYPE} in
	darwin*)
		source ~/.zshrc.darwin
		;;
	linux*)
		source ~/.zshrc.linux
		;;
esac
```

共通設定は、.zshrcにそのまま書いてもいいし、別ファイルに分けても構いません。


# 参考になりそうなmanページの一覧

今回関係ないものも含んでいますがいくつか列挙しときます。


|コマンド|内容|
|:-----------|:------------|
|man zsh|zshの概要|
|man zshall|zsh manページのまとめ|
|man zshbuiltins|zsh ビルトインコマンド概要|
|man zshcalsys|zshのカレンダーシステム概要|
|man zshcompsys|zshのコマンドライン補完の概要|
|man zshexpn|zsh展開の概要|
|man zshmisc|文字通り雑多な詰め合わせ(パイプ、リダイレクト等）|
|man zshoptions|zshで設定可能なオプション一覧|
|man zshparam|zshの変数関係の記号や使い方|
|man zshzle|zshのコマンドラインエディタ概要|
Railsでjoinsを多段ネストする方法（親から曾孫まで）


## テーブル構成
```rails
class Foo < ActiveRecord::Base
  has_many :bars
end

class Bar < ActiveRecord:Base
  belongs_to :foo
  has_many :bazs
end

class Baz < ActiveRecord:Base
  belogs_to :bar
  has_many :hoges
end

class Hoge < ActiveRecord:Base
  belogs_to :baz
end
```

## joins

親から辿る場合には

```rails
Foo.joins({:bars => {:bazs => :hoges}})
```
となる。has_manyでのテーブル指定は複数形。

曾孫から辿る場合には

```rails
Hoge.joins({:baz => {:bar => :foo}})
```

となる。belogs_toでのテーブル指定は単数形

## where
whereで検索する場合には

```rails
Hoge.joins({:baz => {:bar => :foo}}).where('foos.id = 1)
```
となる。

```rails
Hoge.joins({:baz => {:bar => :foo}}).where(:foos => {:id => 1})
```

という書き方もできる。

whereの中のテーブル指定は複数形。

## 何が嬉しいの？
active adminのfilterで同じおじいちゃんを持つ曾孫とかで絞り込めるのです。
python2 python3両方に対応できるmetaclassの書き方


python2.xとpython3.xでmetaclassを利用する構文が異なっている。
一方でひとつのファイルで両方のバージョンをサポートしたいことがある。
そのような場合の書き方について。

## metaclass(HasVersion)

以下のようなmetaclass HasVersionMetaがある。
単にversion番号のような文字列を持っているというだけのmetaclass。

```py
class HasVersionMeta(type):
    def __new__(cls, name, bases, attrs):
        attrs["version"] = "0.0.1"
        return super(HasVersionMeta, cls).__new__(cls, name, bases, attrs)
```

これを使ったclassを定義したい。

### python3の場合

python3の場合は継承の際に渡す引数の箇所にmetaclassオプションを付ける。

```py3
class A(object, metaclass=HasVersionMeta):
    pass
```

### python2の場合

python2の場合は、__metaclass__という特別な名前のhookに代入する

```py
class A(object):
    __metaclass__ = HasVersionMeta
```

## 両方に対応する場合

metaclassとして使われるクラスはcallable objectでもあり。
親classになるtype()が動的にclassを生成される際に使われることを考えると同じ機能をもっているはず。
なので以下のように書けば良い。

```py
HasVersion = HasVersionMeta("A", (object, ), {"__doc__": HasVersionMeta.__doc__})


class A(HasVersion):
    pass
```

動作する。

```py
print(A.version)
# 0.0.1
```