OmniAICreator/Qiita-1.07M huggingface dataset:
PHPコーディング規約まとめ

# 結論

## いきなり結論

利用しているフレームワークの規約がないなら、 <a href="http://www.infiniteloop.co.jp/docs/psr/psr-2-coding-style-guide.html">PSR-2（日本語）</a> に従っておけば、間違いない! 

あとは、コマンドラインなり、エディタで自動整形する
* [PHPコードをコマンドで自動整形! Condig Standards Fixer と PHP_CodeSniffer - Qiita](http://qiita.com/hshimo/items/e8374fe721492ac4658b "PHPコードをコマンドで自動整形! Condig Standards Fixer と PHP_CodeSniffer - Qiita")

## 日本語なら以下がお勧め!

<a href="http://9ensan.com/blog/programming/php/php-psr-coding-standards/">PHPのコーディング規約 PSR-0、PSR-1、PSR-2、PSR-3とは | 9ensanのLifeHack</a>

以下、コーディング規約とツールまとめ

# 目的

- 個人向け: PHPの開発をする場合、どのコーディング規約に従うべきか? をサクッと知りたい
- チーム向け: チームでどれを使うか? を決めるための参考に
- 教育: この規約でやって!と一言で教えるための参考URL

# PHPコーディング規約の種類

PEARコーディング規約 や Zend Codig Starndard あたりが
有名かと思っていましたが、色々ありますよ!

## PSR-0, PSR-1, PSR-2, PSR-3

PHP-FIGによってまとめられている規約!
有名どころで入っていないのは、CodeIgniterくらい?

<a href="http://www.php-fig.org/">PHP-FIG — PHP Framework Interop Group</a>

0-2まで日本語訳、3は英語です。

## PSR-0: オートローディング規約
 <a href="http://www.infiniteloop.co.jp/docs/psr/psr-0.html">PSR-0　（日本語）</a>

## PSR-1: 基本コーディング規約
<a href="http://www.infiniteloop.co.jp/docs/psr/psr-1-basic-coding-standard.html">PSR-1（日本語）</a>

## PSR-2: コーディング・スタイル・ガイド
<a href="http://www.infiniteloop.co.jp/docs/psr/psr-2-coding-style-guide.html">PSR-2（日本語）</a>

## PSR-3: ロガー・インターフェイス
<a href="http://www.php-fig.org/psr/3/">PSR-3 - Logger Interface</a>


## PEAR
Manual :: 標準コーディング規約
http://pear.php.net/manual/ja/standards.php

## Zend Framework 
Zend Framework PHP 標準コーディング規約 - Programmer's Reference Guide - Zend Framework
http://framework.zend.com/manual/1.12/ja/coding-standard.html

## Zend Framework 2.0
<a href="http://framework.zend.com/wiki/display/ZFDEV2/Coding+Standards">Coding Standards - Zend Framework 2.0 - Zend Framework Wiki</a>

## CakePHP
コーディング規約 — CakePHP Cookbook v2.x documentation
http://book.cakephp.org/2.0/ja/contributing/cakephp-coding-conventions.html

## Symfony2

コーディング規約 | Symfony2日本語ドキュメント
http://docs.symfony.gr.jp/symfony2/contributing/code/standards.html

## CodeIgniter

PHPコーディングスタイル : CodeIgniter ユーザガイド 日本語版
http://codeigniter.jp/user_guide_ja/general/styleguide.html

## Yii Framework
基本: 規約 | The Definitive Guide to Yii | Yii PHP Framework
http://www.yiiframework.com/doc/guide/1.1/ja/basics.convention

## Laravel
Coding Style
https://laravel.com/docs/master/contributions#coding-style


# コーディング規約用: コード整形ツール

コーディング中にコマンドで! コミット時にフックしてもよし!
皆様のコーディングスタイルの自動統一化にお役に立ちます! 

## 公式サイト

The PHP Coding Standards Fixer for PSR-1 and PSR-2
http://cs.sensiolabs.org/

## 日本語での説明

PHPを最新コーディング規約に合わせて修正してくれるツール「PHP Coding Standards Fixer」 | 9ensanのLifeHack
http://9ensan.com/blog/programming/php/php-psr-coding-standards-fixer/


## 意見が分かれそうなところ

- SQLの書き方

## 参考

- <a href="http://blog.tojiru.net/article/278307117.html">PSR-0はなぜ0（≒最重要）なのか - 泥のように</a>

## 検索用用語

PHP, Coding Standard, Coding Style, コーディング, 規約, ルール,スタイル
[python] lassieでWebページのメタデータをサクっととってくる

こんにちは。最近暑いですね。暑くなるとページ巡回して要素を抽出するのもうんざりします。ここはpythonのlassieを使ってさっさと済ませちゃいましょう。


#lassie 

https://github.com/michaelhelmick/lassie

Web Content Retrieval for Humans™

だそうです


#installation

	pip install lassie

pipからいけます

#usage

	>> import lassie
	>> fetched = lassie.fetch('http://www.youtube.com/watch?v=tkjbEqnp_0U')

こんだけ。

中身はこんな感じ。

	>> from pprint import pprint
	>> pprint(fetched)

	{'description': u'Recording of the July 12, 2013 webcast, 	"What\'s New in Riak 1.4"',
	 'images': [{'src': u'http://b.vimeocdn.com/ts/	445/011/445011693_640.jpg',
    	         'type': u'og:image'}],
	 'title': u"What's New in Riak 1.4",
	 'url': u'http://vimeo.com/71448923',
	 'videos': [{'height': 400,
             'src': u'http://vimeo.com/moogaloop.swf?clip_id=71448923',
             'type': u'application/x-shockwave-flash',
             'width': 640},
            {'height': 400,
             'src': u'https://player.vimeo.com/video/71448923',
             'width': 640}]}


タイトル、説明、（ここでは出てないけど）キーワード、画像、ビデオ等を抜き出して返してくれます。サムネ候補もタイプ付きで返してくれるのが心憎いですね。

暑い夏も穏やかに過ごせそうです。

#dependencies
[setup.py](https://github.com/michaelhelmick/lassie/blob/master/setup.py)

	    install_requires=[
        'requests==1.2.3',
        'beautifulsoup4==4.2.1',
        'html5lib==1.0b3'
	    ],


おなじみですね。


#lassie
【名詞】【可算名詞】《スコットランド方言》 娘，少女; お嬢さん (⇔laddie).
［LASS+‐IE］

[lassieの意味 - 英和辞典 Weblio辞書](http://ejje.weblio.jp/content/lassie)


なるほど

えっとひょっとして

#名犬ラッシー

「Lassie」は、英語では、「お嬢さん・少女」の意味の愛称的な言葉で、当然ラッシーは雌のコリーである。

[名犬ラッシー - Wikipedia](http://ja.wikipedia.org/wiki/%E5%90%8D%E7%8A%AC%E3%83%A9%E3%83%83%E3%82%B7%E3%83%BC)

知りませんでした。勉強になりますね。
静的ウェブページはJekyllとAWS-S3が簡単確実

> Warning: 2014-5-15 このページの情報は古くなっています。`jekyll-s3`のメンテが中止されて、新しく`s3_website`となり使い勝手が変わっています。気が向いたらアップデートの記事を書きます。こちらの記事は参考程度としてくださいm(_ _)m



[Jekyll](http://jekyllrb.com/)で生成したウェブページをAmazon Web ServiceのS3上にデプロイしてホームページを作成してみました。これがものすごく簡単だった（かつ、管理がやりやすい）ので是非オススメしたいと思って記事を書きます。

尚、S3を使うことで多少のコストは発生しますが、[Jekyll](http://jekyllrb.com/)で作ったページを`GitHub Pages`上にホスティングすれば完全無料のウェブページを公開することができます。（今回はアクセスが少ないのですが商用ページだったためS3を利用しました）

## Jekyllとは

[Jekyll](http://jekyllrb.com/)はWebページののジェネレータです。MarkdownやTextile,Liquidのようなよくある形式で静的なページをパブリッシュします。難しくないので利用方法[公式ページ](http://jekyllrb.com/)を参照いただくと簡単に理解できると思います。

### Jekyllへ移行のコツ

今回は、既存のウェブページからの移行でしたので、既存のコンテンツを傷つけないように作業をする必要がありました。まず、jekyllのディレクトリのトップに、_originalのディレクトリを作成しここに既存のコンテンツをすべて展開、`git add _original`と`git commit`してリポジトリに格納します。Jekyllテンプレートを作成しながら、`jekyll -d ./_original build`として、コンテンツを生成後`git status`や`git diff`で差分を確認→修正を繰り返す。これで既存のコンテンツを変えてしまう事無くJekyll化することができました。


## AWS S3の準備

[AWSのマネージドコンソール](https://console.aws.amazon.com/console/home)にアクセスして、まだS3を使ったことがなければサインアップ。その後[旧形式のアクセスキー](https://portal.aws.amazon.com/gp/aws/securityCredentials)を取得する必要があります。アクセスキーIDとシークレットアクセスキーはこの後使います。

## AWS S3にパブリッシュ

[jekyll-s3](https://github.com/laurilehmijoki/jekyll-s3) というgemを利用します。Gemfileに以下のように書いて

```rb:Gemfile
source :rubygems

group :development do
  gem "jekyll", "~> 1.1.2"
  gem "jekyll-s3", "~> 3.2.0"
end
```

`bundler`の実行をします

```
$ bundle
```

`jekyll-s3`がインストールされると`jekyll-s3`というコマンドが実行できるようになるので、実行します

```
jekyll-s3
```

すると、`_jekyll_s3.yml`が生成されるので、修正します。

```yaml:_jekyll_s3.yml
s3_id: YOUR_AWS_S3_ACCESS_KEY_ID
s3_secret: YOUR_AWS_S3_SECRET_ACCESS_KEY
s3_bucket: your.blog.bucket.com
```

このYAMLはERBでパースされているので、ファイルに書きたくない人は環境変数にキーを入れて、以下のように書くこともできます。

```
s3_id: <%= ENV['AWS_S3_ACCESS_KEY_ID'] %>
s3_secret: <%= ENV['AWS_S3_SECRET_ACCESS_KEY'] %>
s3_bucket: your.blog.bucket.com
s3_endpoint: ap-northeast-1
```

もし、東京以外のS3のリージョンを使うなら、[Regions and Endpoints](http://docs.aws.amazon.com/general/latest/gr/rande.html)から適切なリージョンを選んで`s3_endpoint`に書いてください。


あとは、以下のコマンドで、S3をセットアップします。バケツも自動で作ってくれます。

```
configure-s3-website --config-file _jekyll_s3.yml
```

これで次のようなURLでウェブサイトが公開されるようになりますので、`http://www.example.com.s3-website-ap-northeast-1.amazonaws.com`独自ドメインを使いたい場合は、このホスト名をCNAMEに設定します。設定方法は各DNSサービスのドキュメントを御覧ください。

```
www.example.com CNAME www.example.com.s3-website-ap-northeast-1.amazonaws.com
```

以降コンテンツの更新は


    jekyll build

ローカルで確認したいときには

    jekyll server

S3へのアップロードは

    jekyll-s3


簡単ですね。
while read  でファイル入力する時、標準以外の入力を指定すると便利

すみません。「すると便利」は言い過ぎました。すみません。

便利なときがあります。

以下のような場合です。

```bash:
while read LINE 0<&9
do
  echo $LINE
  confirm '続行します。いいですか？'
done 9< $0
```

なんでかつーと、while の内部の標準入力はすべてファイルに置換されてしまうからです。

ファイルから読み取りながら何か処理をして、必要に応じて y/n を入力させるようなことを考えるときに困ったりします。しました。

## 失敗したパターン（標準入力をリダイレクト）

以下のようにしたら、confirm の中の read もファイルから読み込んで失敗しました。

```bash:
function confirm()
{
  echo "${0} (y or n)"
  read IN
  if [ "${IN}" = "n" ];
  then
    exit 1
  fi
}

while read LINE
do
  echo $LINE
  confirm '続行します。いいですか？'
done < $0
```

## うまくいかなかった対策

泥縄的に、read コマンドの入力を明示的に `/dev/tty` に変えました。強制でコンソールから入力させる感じですね。

```bash:
function confirm()
{
  echo "${0} (y or n)"
  read IN < /dev/tty
  if [ "${IN}" = "n" ];
  then
    exit 1
  fi
}
```

基本的にはこれでうまく動くのですが、こうしちゃうと `yes` コマンドなどが利用できなくなるので不便だと思いました。
Qiitaの投稿タイプ

# Qiitaの投稿タイプのグラフをマウスカーソルでこすりまくるとでっかく~~なる~~**ならない**

[悲報]
修正され、でっかくならなくなったようです。
いつからかはわかりません。
why Qiita... :crying_cat_face:
yum が「セグメンテーション違反です」とエラーを吐く時の復旧

##文献##
- エラーの原因と対応方法
http://bugs.centos.org/view.php?id=4702&nbn=1
- 実録
http://www.limemo.net/blog/2012/03/yum-segmentation-fault.html
- zlibインストール
http://petio.org/tools/zlib.html

##やったこと##

- zlib-1.2.5 をアンインストール

```
#cd /root/zlib-1.2.5
#make uninstall
```

- 問題のファイルを削除

```
#rm -rf /usr/lib/libz.*
```

- zlib-1.2.3 をインストール

```
#cd /root/zlib-1.2.3
#./configure -s --prefix=/usr
#make uninstall
```

- 問題のファイルが再生成されたことを確認

```
# ll /usr/lib/libz.so*
lrwxrwxrwx 1 root root 13 8月 8 18:47 /usr/lib/libz.so -> libz.so.1.2.3
lrwxrwxrwx 1 root root 13 8月 8 18:47 /usr/lib/libz.so.1 -> libz.so.1.2.3
-rwxr-xr-x 1 root root 83758 8月 8 18:47 /usr/lib/libz.so.1.2.3
```

- 動作確認

```
# yum clean all
# yum check-update
```
UITableViewでeditButtonItemを使って、Editボタンを押した時に何かする

まずeditButtonItemについて軽く説明
TableViewでよく見る、丸い赤い横棒の入ったボタンを押してセルを消したりするやつです。
![editButtonItem_Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/6688/21867c87-48c5-e149-508d-5ffaa7bce7e0.png)

↑こういうやつ。

editButtonItemはほんとに便利で、下記みたいな感じでviewDidLoadあたりでボタンを設置するだけで、セルを削除する機能が追加できてしまいます。

```objc:
self.navigationItem.rightBarButtonItem = [self editButtonItem];
```

さて、ここから本題。
editButtonItemを押した時に、削除以外にも色々したいなーって時。
そういうときは以下のメソッドをオーバーライドします。(対象のUIViewControllerに丸ごとコピペする。)

```objc:
// 編集モードになった時に呼ばれるメソッド
- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
    NSLog(@"%s", __func__);
    [super setEditing:editing animated:animated];
	if (editing) {
		// 編集モードの処理
		NSLog(@"編集モードに入りました。");
	}else{
		// 編集モードから戻った時の処理
		NSLog(@"編集モードから出ました。");
	}
}
```

こうやって書くだけでオッケー。
これで、編集モードの時だけ何か表示したい！などという要求にも対応出来ますね。
samba3の設定

[Ubuntu - windowsの共有フォルダをマウント - Qiita](http://qiita.com/tukiyo/items/ff352d45e56e13a39a74)

[global]
====

```bash:/etc/samba/smb.conf
netbios name = nas # windowsマシンからnasというコンピュータ名でアクセスができるようになる
hosts allow = 192.168.11. 127.   # アクセス元制限
log file = /var/log/samba/log.%m # ログファイル格納場所
```

[homes]
====

```bash:
   read only = no        # 書き込みを許可する
   create mask = 0644    # ファイル作成時のmask
   directory mask = 0755 # フォルダ作成時のmask
```

その他の共有名
====

```bash
[work]
   path = /home/work      # 共有のパス
   public = yes           # 認証なしでアクセス可能か
   writable = yes         # 書き込み権限
   browsable = yes        # 共有名を見せるかどうか
   create mask = 0644     # ファイル作成時のmask
   directory mask = 0755  # フォルダ作成時のmask
   hide files = _recycle  # 隠しフォルダ扱いにするもの

   vfs object = recycle   # ゴミ箱機能をON
   recycle:repository = _recycle/%U  # 削除ファイルを _recycle/ユーザ名/ に格納
   recycle:keeptree = Yes # フォルダ構造を保持する
   recycle:touch = Yes    # ゴミ箱に入れるとともにアクセス日時を更新
   recycle:versions = Yes # ゴミ箱にすでに同名のファイルがある場合、別名を付ける
   recycle:maxsize = 0    # ゴミ箱に保存するファイルサイズの上限
   recycle:exclude = Thumbs.db *.tmp *.temp *.o *.obj ~$* *.~?? # 除外パターン
   recycle:exclude_dir = /tmp # 除外ディレクトリ（※これは機能しません※）
   recycle:noversions = *.doc # バージョン管理外にするもの
```

[ゴミ箱機能のマニュアル](http://www.samba.org/samba/docs/man/manpages/vfs_recycle.8.html)
Struts2でユーザーごとのページ（設定してない場合はデフォルト）


メモ

遷移予定のページがない場合デフォルトのページに飛ばす設定だけどもっといい方法ないのかな？

```java:IndexAction

import java.io.File;
import java.io.IOException;
import java.rmi.ServerException;
import java.sql.SQLException;
import java.util.ResourceBundle;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;
import org.apache.struts2.convention.annotation.ExceptionMapping;
import org.apache.struts2.convention.annotation.ExceptionMappings;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
import org.apache.struts2.convention.annotation.Result;

/**
 * デバッグ用.
 * @author asahina_dev
 *
 */
@SuppressWarnings("serial")
@Actions({
		@Action(value = "user_*_index",
				results = {
						@Result(
								name = "success",
								location = "%{pageId}/index.jsp"),
						@Result(
								name = "input",
								location = "%{pageId}/index.jsp"),
						@Result(
								name = "defaultAction",
								type = "chain",
								location = "index"),
				},
				params = {
						"pageId", "{1}"
				}),
		@Action(value = "index",
				results = {
						@Result(
								name = "success",
								location = "index.jsp"),
						@Result(
								name = "input",
								location = "index.jsp"),
				}),
})
@InterceptorRefs({
		@InterceptorRef("defaultStack"),
		@InterceptorRef("debugging")
})
@ExceptionMappings({
		@ExceptionMapping(
				exception = "java.lang.Exception",
				result = "exception"
		),
})
public class IndexAction extends BaseAction<IndexModel> {

	/**
	 * デバッグ用.
	 *
	 */
	public IndexAction() {
		super(new IndexModel());
	}

	@Override
	public String execute() throws IOException, SQLException, ServerException {
		System.out.println("index");

		ResourceBundle property = ResourceBundle.getBundle("struts");

		String resultPath = property.getString("struts.convention.result.path");

		String classes = getClass().getResource("/").getFile();
		File root = new File(classes, "../../" + resultPath);
		File page = new File(root, "debug/" + model.pageId + "/index.jsp");
		if (!page.exists()) {
			return "defaultAction";
		}

		return super.execute();
	}
}
```
Googleスプレッドシートで、昨日までの日付列を毎朝自動で非表示にするスクリプト


業務でGoogleスプレッドシートをガントチャート的に使っていて、もう過ぎた日付の列を毎回手作業で非表示にするのがだるかったのでスクリプト書いた。

```Javascript:hide
function hide() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("hogehoge");
  var column = 4;
  var today = new Date();
  while (column <= ss.getLastColumn()){
    if(sheet.getRange(2, column).getValue() < (today.getTime()-(60*60*24*1000))){
      var range = sheet.getRange(1, column);
      sheet.hideColumn(range);
    }
    column++;
  }
}
```

トリガーを毎朝5時に仕掛けたので、朝スプレッドシートを開くと昨日までの列は非表示になっている。快適。
インスタンスプロパティを作るときの注意

# 参照型(※)は初期値にしない

JavaScriptでクラス(ライクなオブジェクト)を作る時、インスタンスプロパティに配列やハッシュ(のようなオブジェクト)を設計することはよくやると思います。

そんな時注意しなければならないのが、参照型(※)の値は初期値として設定しないということ。

## CoffeeScriptの場合

```coffeescript:

# ダメなパターン
class Foo  
  array: []
  object: {}
  
foo = new Foo
foo2 = new Foo

foo.array.push 'オラァ'
foo.object.a = '無駄ァ'

# foo に設定したはずが foo2 にも影響する
console.log foo2.array[0] # => 'オラァ'
console.log foo2.object.a # => '無駄ァ'
  

# 大丈夫なパターン
class Bar
  array: null # 初期値はnull
  object: null # 初期値はnull
  constructor: ->
    @array = [] # 本当に利用したい初期値を設定
    @object = {} # 本当に利用したい初期値を設定

bar = new Bar
bar2 = new Bar

bar.array.push 'オラァ'
bar.object.a = '無駄ァ'

# 影響しない
console.log bar2.array[0] # => undefined
console.log bar2.object.a # => undefined

```

## JavaScriptではつまりこういうこと

```js:

// ダメなパターン
function Foo () {}
Foo.prototype.array = [];
Foo.prototype.object = {};

// 大丈夫なパターン
function Bar () {
  this.array = [];
  this.object = {};
}
Bar.prototype.array = null;
Bar.prototype.object = null;

```

## なぜこうなるの？

それは君「プロトタイプチェーン」だよ！

### プロトタイプチェーンとは

ここで説明するには奥が深すぎるので、説明しません！以下など参照にしてください。

[や...やっと理解できた！JavaScriptのプロトタイプチェーン](http://d.hatena.ne.jp/maeharin/20130215/javascript_prototype_chain)

## 実はnullと設定する必要はないのでは？

基本的にそのとおりです。

ただ、Coffeeの場合など"明示的"にプロパティの宣言をしたいので先のような記述にしています。

コンストラクタ内で設定するというガイドラインもあっても問題ないと思います。

## ※参照型について

値をざっくり分類すると

基本型

- 論理値
- 数値
- 文字列
- null
- undefined

参照型

- 配列
- オブジェクト
- 関数 などなど

性質などはこれも今更ここで説明することでもないので割愛。

ちなみにオブジェクトの参照型扱いについて以下を参照してください。

[誤り : JavaScript のオブジェクト型は参照型ではないというお話](http://d.hatena.ne.jp/vividcode/20110619/1308494724)

* * *

詳しい説明は全くしませんでしたが、つまりそういうことなので覚えておきましょう。
Chef-DocsをDash.appに登録してみる

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

が、イマイチだった。

MacのアプリDashというドキュメントビュワーで、[OpscodeのChef Docs](http://docs.opscode.com)が読めるといいかもしれないと思い挑戦。
Dash.appについてはこの辺で紹介されてます。 => [Dash | naoyaのはてなダイアリー][naoya_dash]

[naoya_dash]: http://d.hatena.ne.jp/naoya/20130218/1361171277

## `doc2dash`のセットアップ

ChefDocsはSphinxプロジェクトなので、Dashが用意している[doc2dash][doc2dash_url]ユーティリティを使えるようセットアップ。

[doc2dash_url]: https://pypi.python.org/pypi/doc2dash

OSX標準で長らく触ってなかったpip(1.0.2)がマトモに動かなかったのでとりあえずbrewのを使うことに。

```shell:install_doc2dash
$ brew install python
$ brew link --overwrite python

$ /usr/local/bin/pip install --user doc2dash
$ /usr/local/bin/pip install --user sphinx

$ doc2dash --version
doc2dash 1.1.0
```
OK。

## ChefDocsをローカルでビルドする

GithubからChefDocsを取ってきます。

`$ git clone --depth 1 https://github.com/opscode/chef-docs.git `

たまに`sphinx-build`がFailするコミットがあるようなので、一応コミットログをみて安定してそうなリビジョンをCheckOutしましょう。

```shell
$ cd chef-doc
$ export PATH="/usr/local/share/python:$PATH"
$ make master
```

ビルドは時間がかかるので、しばらくほっときましょう。

### genindexの捏造

`doc2dash`ユーティリティでsphinxプロジェクトをdashに取り込むためには索引の`genindex.html`が必要ですが、Chef Docsのプロジェクトではこれを生成するようになっていません。
`conf.py`を編集すれば`genindex.html`を作れるのですが、元々のファイルがindexに登録する単語を定義してないので、生成しても空っぽです。

仕方ないので一旦トップページを使いまわすことにしてコピーします。

`$ cp build/index.html build/genindex.html`


## Dashに登録

`build/`以下に出力されたhtml達を`doc2dash`ユーティリティを使用してDashに登録します。

`$ doc2dash --name 'Chef Docs' -A build --icon ./images/opscode_chef_html_logo.png`

![Dash.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/60c02423-bec3-d28b-126c-e4d4b6477425.jpeg "Dash.jpg")


Okayです。

## Dashで閲覧

登録されたドキュメントをDashで開いてみます、見た目は良い感じです。


![Dash2.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/92cc8916-2976-a67e-3d47-af3b533576e1.jpeg "Dash2.jpg")


### 既知の残念

ローカルなので閲覧はサクサクですが、Dashならではというところまでは至らず。 変換時に何か仕込めば良いのでしょうが。

- 検索不可
- モジュール一覧なし
- クリックしたらWebに飛んじゃう箇所がいくつか

要はhtmlファイルをブラウザで見るのと変わらないので、docsetsの作り方を理解してもう少し便利にしたいところ。
とりあえず右上の`index`から索引を開く運用でなら使えるかも。
phpのエラーを /var/log/php_errors.log に出力する

```bash:
$ sudo vim /etc/php5/apache2/php.ini
error_log = /var/log/php_errors.log
$ sudo touch /var/log/php_errors.log
$ sudo chown www-data:www-data: /var/log/php_errors.log
$ sudo /etc/init.d/apache2 restart
```
flycheck で coffeelint の設定をカスタマイズする方法

前提: Emacs で flycheck を導入しており、 coffeelint による CoffeeScript のシンタックスチェックを設定済みであること。

coffeelint は -f オプションで独自の設定ファイルを渡し、特定の設定を上書きできる（例: max_line_length のチェックは無視したい、とか）

coffeelint --makeconfig で標準出力にデフォルトの設定を吐き出してくれるのでファイルに保存して必要な部分だけ編集すると便利。

```
$ coffeelint --makeconfig > .coffeelint.json
$ coffeelint -f .coffeelint.json foo.coffee
```

flycheck-coffeelintrc という変数に、 coffeelint -f に渡されるファイル名を指定できる。デフォルトで .coffeelint.json が設定済み（っぽい？）ので、 .coffeelint.json というファイル名で設定を保存しておけば何もしなくてよい。

例: max_line_length の警告は無視する .coffeelint.json (level: ignore にすると無視)

```
$ cat .coffeelint.json
{
    "max_line_length": {
        "value": 80,
        "level": "ignore"
    }
}
```
時間計測

# 方法1
```Python:test.py
    import time
    start=time.time()
    #処理
    stop=time.time()
    diff=stop-start
    print diff * 10000
```
# 方法2
```Python:test.py
    import time
    starttime = time.clock()
    （計算1）
    time1 = time.clock()
    （計算2）
    time2 = time.clock()
    （計算3）
    time3 = time.clock()
    print time1-starttime,time2-time1,time3-time2
```
weston(wayland) の screenshot の取り方 

# はじめに
Tizen IVI 3.0 以降は X11 を捨てて wayland 一本になりました。
wayland のリファレンス実装 weston でのスクリーンショットを取る方法の情報が少ないのでメモります。

# weston(wayland) の screenshot の取り方 
元ネタは https://bugs.tizen.org/jira/browse/TIVI-44

weston上で Win + s を入力すると png のスクリーンショットが /proc/"weston の PID"/cwd/wayland-screenshot.png と生成されます。

入力したコマンドは以下の通り。

    (Win + s を入力)
    root:~> ps -ef|grep weston
    root       178   170  0  8月07 ?      00:00:00 /usr/bin/weston-launch -- -i0
    app        191   178  0  8月07 tty2   00:00:00 /usr/bin/weston -i0                  <- weston の pid は 191
    app        211   191  0  8月07 tty2   00:00:00 /usr/libexec/weston-keyboard
    app        215   191  0  8月07 tty2   00:00:00 /usr/libexec/weston-desktop-shell
    root       350   283  0 00:42 pts/0    00:00:00 grep weston
    root:~> scp /proc/191/cwd/wayland-screenshot.png $USER@$SERVER:~/ <- png ファイルを scp 経由で送信する。

とれたスクリーンショットは以下の通り。
![wayland-screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/5835/48b80cfc-ac78-dd0a-e25d-8ad9a5847f9b.png)


# おわりに
wayland になって X11 で使えてた手法が使えなくなってちょっと不便ですね。
findコマンド

## findしてファイルを削除

```sh
# 検索
find . -type f -name "*filename*"

# 削除
find . -type f -name "*filename*" -delete
```


## パーミッションで検索

```bash:グループに書き込み権限があるディレクトリを表示
find . -perm -g+w -type d
```

```bash:グループに書き込み権限がないものを表示
find . -perm -g-w -type d
```

## シンボリックリンクだけ表示

```bash:
$ find . -type l
```

## 否定

! を使う。

```bash:
$ find . -type f ! -uid 501
```
mysqldumpでlatin1のデーターベースを文字化けせずに出力

参考： [MySQL 4.1 から 5.0に、文字化けせずにmysqldumpでデータを移行する - Goodpic](http://www.goodpic.com/mt/archives2/2009/01/mysql_41_50mysq.html)

* mysqlのコンソールから `select * from table` としても文字化けせずに表示されるのに、mysqladminや、`set names utf8`してから `select * from table` すると文字化ける件の解決方法。

```bash:latin1
(1, 'Ã£â<80><9a>Ë<82>Ã£Â<81>Â¿Ã£Â<81>Å<92>Ã£Â<81>ÂªÃ£Â<81>Å<92>Ã£Â<81>Å Ã£Â<81>â<80>¹Ã£Â<81>â<80><94>Ã£Â<81>â<30><9e>Ã¯Â¼Å¸Ã£â<80><9a>â<80><9a>Ã£Â<81
```

 こんなかんじで化けて絶望している時、以下のオプションでいけることを知りました。

--default-character-set=latin1
====

```bash:
$ mysqldump -uroot -p --default-character-set=latin1 bbs > bbs.dump
```

SET NAMES修正
====

* これを行わないと、mysqladminでインポートした時、文字化けします。

```bash:
$ sed -i -e 's/SET NAMES latin1/SET NAMES utf8/g' bbs.dump
```
Emacs内からrspecテストをiTerm上で走らせる設定

specを編集→行指定でrspecコマンド実行，というサイクルが多いので，Emacsからキーバインド一発で実行できるようにした．
出力結果はiTermで見たいので，Emacs内でrspecコマンドを実行するのではなくapplescriptを使ってiTermにコマンドを書き出させるようにしている．

```el:ruby-config.el
(defun execute-rspec ()
  (interactive)
  (do-applescript (format "tell application \"iTerm\"
  activate
  tell current session of current terminal
    write text \"bundle exec rspec %s:%s\"
  end tell
  end tell
  tell application \"System Events\"
    keystroke return
  end tell"
  buffer-file-name (line-number-at-pos))))

(define-key ruby-mode-map (kbd "C-c r") 'execute-rspec)
```

実行すると`bundle exec /path/to/some_spec.rb:10`のようなコマンドがiTerm上で実行される
JavaScriptでスマホかタブレットかその他かを返す

基本iPhoneかAndroidスマホかiPadかAndroidタブレットだけで良いと思うので、それ以外の端末(WindowsPhoneとかWindowsTabletとか、その他独自OSとか)は全部その他扱い。

```js:JavaScript

/**
 *	ユーザーのデバイスを返す
 *	
 *	@return		スマホ(sp)、タブレット(tab)、その他(other)
 *
 */
var getDevice = (function(){
	var ua = navigator.userAgent;
	if(ua.indexOf('iPhone') > 0 || ua.indexOf('iPod') > 0 || ua.indexOf('Android') > 0 && ua.indexOf('Mobile') > 0){
		return 'sp';
	}else if(ua.indexOf('iPad') > 0 || ua.indexOf('Android') > 0){
		return 'tab';
	}else{
		return 'other';
	}
})();

```
画像プリロード(要jQuery)

jQueryを使った画像のプリロード。
ファイルパスを配列で渡せばプリロードしてくれる。
とりあえず開始、プログレス、完了時の関数指定は必須。
一応、ロード中の状況をパーセンテージで返してくれるけど、ファイル数に対するパーセントなので全然正確じゃない。

```js:JavaScript

/**
 *	画像のプリロード
 *	※）要jQuery
 *	
 *	@param	imageArray	画像パスの配列
 *	@param	startFnc	開始時に呼ばれる関数
 *	@param	progressFnc	ロード中に呼ばれる関数(パーセントが帰ってくる)
 *	@param	completeFnc	完了時に呼ばれる関数
 *
 */
function preloadImage(imageArray, startFnc, progressFnc, completeFnc){	
	function preload(images, progress){
		var total = images.length;
		$(images).each(function(){
			var src = this;
			$('<img/>').attr('src', src).load(function() {
				for(var i = 0; i < images.length; i++){
					if (images[i] == src) images.splice(i, 1);
				}
				progress(total, total - images.length);
			});
		});
	}
	
	var nowPercent = 0;
	startFnc();
	preload(imageArray, function(total, loaded){
		nowPercent = Math.ceil(100 * loaded / total);
		progressFnc(nowPercent);
		if(nowPercent >= 100){
			completeFnc();
		}
	});
}


// テストコード
$(function(){
	function start(){ console.log('start') }
	function progress(per){ console.log(per) }
	function complete(){ console.log('complete') }
	
	var images = [
		'img1.jpg',
		'img2.jpg',
		'img3.jpg',
		'img4.jpg',
		'img5.jpg',
		'img6.jpg',
		'img7.jpg',
		'img8.jpg',
		'img9.jpg',
		'img10.jpg'
	];
	
	preloadImage(images, start, progress, complete);
});

```
vagrantのshell provisionerでCentOS 6.4にAnsibleをインストール

[InstallationのLatest Release Via Yum](http://docs.ansible.com/intro_installation.html#latest-release-via-yum)を見るとCentOS6にAnsibleをインストールするのは、EPELを入れてyumでansibleをインストールするだけです。

[Vagrant Documentation](http://docs.vagrantup.com/v2/provisioning/shell.html)を参考に、これをvagrantのshell provisionerで実際にやってみました。

Vagrantfile

```
$script = <<SCRIPT
if ! rpm -q epel-release > /dev/null; then
  sudo rpm -i http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
  sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
  sudo yum clean metadata
fi

if ! rpm -q ansible > /dev/null; then
  sudo yum install -y ansible
fi
SCRIPT

Vagrant.configure("2") do |config|
  config.vm.box = "centos6.4"
  config.vm.network :private_network, ip: "192.168.33.12"
  config.vm.provision :shell, :inline => $script
end
```

config.vm.boxやconfig.vm.networkなどの設定は適宜変更してご利用ください。

あとはいつも通りvagrant upを実行するだけです。

```shell-session:
$ vagrant up
```
Xcodeで変数名などのシンボルをスーパークラスに自動的に移すには

これも簡単だったのでシェアします。

以下の選択部分の変数をスーパークラスに移すとします。

![スクリーンショット 2013-08-08 14.32.14.png](https://qiita-image-store.s3.amazonaws.com/0/12939/b53729da-a132-9afe-0f82-9cda3f499c40.png)

「Refactor」→「Move Up」

![スクリーンショット 2013-08-08 14.32.31.png](https://qiita-image-store.s3.amazonaws.com/0/12939/a76d258a-6d7f-3af7-0d91-0bc7e9f8f9c8.png)

するとXcodeが「関係するメソッドも移すかい？」と聞いてきます。

![スクリーンショット 2013-08-08 14.32.45.png](https://qiita-image-store.s3.amazonaws.com/0/12939/1ac1e134-2653-fbed-e649-39c6768ba6e3.png)

こんな感じです。

-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
HerokuアプリケーションのDBをAmazonRDSにする


HerokuアプリケーションのデフォルトDBであるPostgreSQLをAmazonRDSに変更する手順を記します。
https://devcenter.heroku.com/articles/amazon_rds

## 環境
MacOSX

## 準備
Herokuのアプリケーション
Amazon Web Serviceのアカウント
Amazon RDSのインスタンス（us-eastリージョンのみ）
Amazon RDS Command Line Toolkit
・brew install rds-command-line-tools
Gem
・gem install heroku
・gem install sqlite3

## AWSの準備

### 環境変数
```sh:~/.bashrcとか~/.bash_profileとか
export JAVA_HOME="/System/Library/Frameworks/JavaVM.framework/Home"
export EC2_PRIVATE_KEY="$(/bin/ls $HOME/.ec2/pk-aws-account.pem)"
export EC2_CERT="$(/bin/ls $HOME/.ec2/cert-aws-account.pem)"
export AWS_RDS_HOME="/usr/local/Cellar/rds-command-line-tools/1.12.002/libexec"
```
EC2_PRIVATE_KEYとEC2_CERTは下記の手順でダウンロードして.ec2フォルダに配置する
rds-command-line-toolsのバージョンとか自分の環境に合わせる
AWS Management Console > Security Credentials > X.509 Certificates

### インスタンス情報の取得（疎通確認）
```terminal
> rds-describe-db-instances
DBINSTANCE  test_databases  2013-08-05T15:59:54.972Z  db.t1.micro  mysql  20  test_databases  available  test_databases.camuimfljs7b.us-east-1.rds.amazonaws.com  3306  us-east-1a  1  n  5.6.12  general-public-license
      SECGROUP  default  active
      PARAMGRP  default.mysql5.6  in-sync
      OPTIONGROUP  default:mysql-5-6  in-sync
```
インスタンス情報が返ってくれば、rds-command-line-toolsでAPIにアクセスできることが確認できる

## Heroku設定
https://devcenter.heroku.com/articles/amazon_rds#configuring-the-add-on

### Herokuからの通信許可
```terminal
> rds-authorize-db-security-group-ingress \
--db-security-group-name default --ec2-security-group-name default \
--ec2-security-group-owner-id 098166147350

SECGROUP  default  default
      EC2-SECGROUP  default  sg-2aca2f43  098166147350  authorizing
      IP-RANGE  1.1.1.1/32         authorized
      IP-RANGE  118.109.37.163/32  authorized
```


### HerokuアプリケーションにAddOnとしてAmazonRDSの追加
```terminal
> heroku addons:add amazon_rds --url=mysql2://test_databases:test_databases@test_databases.camuimfljs7b.us-east-1.rds.amazonaws.com/test_databases
Adding amazon_rds on test_databases... done, v10 (free)
Use `heroku addons:docs amazon_rds` to view documentation.
```

### アプリケーションに設定されているDBを確認する
```terminal
> heroku config:get DATABASE_URL
mysql2://test_databases:test_databases@test_databases.camuimfljs7b.us-east-1.rds.amazonaws.com/test_databases
```

## 参考
Heroku で Flask + SQLAlchemy + Amazon RDS をやってみる。
http://d.hatena.ne.jp/tell-k/20111106/1320583957
etckeeper で /etcをバージョン管理

参考: [etckeeperで/etcをGitで管理 « ikuya@blog](http://blog.ikuya.net/2013/02/05/etckeeper%E3%81%A7etc%E3%82%92git%E3%81%A7%E7%AE%A1%E7%90%86/)

```bash:
$ sudo apt-get install etckeeper
```

* /etc/cron.daily/etckeeper が作成され、(/etc/crontabより)毎日06:25に自動コミットされる。

以下変更

```bash:/etc/etckeeper/etckeeper.conf
VCS="git"
```

```bash:
$ sudo etckeeper init
Initialized empty Git repository in /etc/.git/
$ cd /etc
```

以下は好み (やっぱりやらなくした)
====

```bash:キャッシュに入ったファイルリストをクリアする。
$ sudo git rm --cached -r -f ./
```

```bash:
## デフォルトで全てのファイルを無視
/*
/.*
# etckeeper関連ファイルを追加
!.etckeeper
!etckeeper
!.gitignore
# Apache
!httpd
httpd/*
!httpd/conf
!httpd/conf.d
# others
!sudoers
!samba
```

コミット
====

```bash:
$ etckeeper commit "MESSAGE"
```
Xcodeでメソッドを抽出するリファクタリングを自動的に行うには

意外なほど簡単にできるので、ご紹介します。

以下のようなコードがあったとします。

![スクリーンショット 2013-08-08 14.08.54.png](https://qiita-image-store.s3.amazonaws.com/0/12939/e7c59e9e-72a3-bb44-527f-6a3349f858ea.png)

選択部分を別メソッドに抽出したいとします。これが簡単にできます。

まず右クリックして「Refactor」→「Extract」

![スクリーンショット 2013-08-08 14.09.13.png](https://qiita-image-store.s3.amazonaws.com/0/12939/b6b1d83b-6f3e-838b-36b6-f21ecca3d75c.png)

するとXcodeが「こんなメソッドでいいかい？」と聞いてくるのでメソッド名を決めてあげます。

![スクリーンショット 2013-08-08 14.09.30.png](https://qiita-image-store.s3.amazonaws.com/0/12939/ccb4cf42-d6dc-947d-479c-3c7881e5e36a.png)

すると以下のようにメソッドが抽出されます。

![スクリーンショット 2013-08-08 14.15.36.png](https://qiita-image-store.s3.amazonaws.com/0/12939/b10853ed-4e48-2f8e-55b0-f2686a262d37.png)

抽出されたメソッドは、その前にちゃんと定義されています。

![スクリーンショット 2013-08-08 14.17.02.png](https://qiita-image-store.s3.amazonaws.com/0/12939/b00864ed-ccc8-5dd6-d896-117968be1f54.png)

これはリファクタリングが捗りますね！特にレガシーコード改善には大変役立ちそうです。

-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
rubyのinstance_of? と kind_of?

instance_of? は厳密でinstanceのクラスをチェック
kind_of? はinstanceのクラスと親クラス両方チェック

a = 1
a.instance_of? Numeric	»	false
a.instance_of? Integer	»	false
a.instance_of? Fixnum	»	true
a.instance_of? Comparable	»	false
a.kind_of? Numeric	»	true
a.kind_of? Integer	»	true
a.kind_of? Fixnum	»	true
a.kind_of? Comparable	»	true
変数名自体を取得する

**【2021/10/15 追記】**
**この記事は更新が停止されています。PHP 8.x 以降での動作保証はありません。過去の記事として参考程度にご覧ください。**

初心者の頃何故かこういうことやりたがってたなぁ・・・
絶対実用アプリケーション開発でやっちゃだめよ！！！
変数シンボルの管理ぐらいプログラマの脳ミソでやるべきであって、プログラムにやらせるべきじゃない。

ちなみにグローバルスコープ限定という悲惨な縛りつき。
既にその変数が他の変数とリファレンス状態であったときもどっちの名前が返るか分からない。

```php
<?php

function get_var_name(&$var) {
    $tmp = $var;
    $var = new stdClass;
    $name = null;
    foreach ($GLOBALS as $k => $v) {
        if ($v === $var) {
            $name = $k;
            break;
        }
    }
    $var = $tmp;
    return $name;
}
 
$hoge = 'foo';
var_dump(get_var_name($hoge)); // string(4) "hoge"
```

**追記: `get_defined_vars`で得る値を渡すことを要求すれば任意のスコープに対応できます。**

```php:改良版
<?php

function get_var_name(&$var, array $scope = null) {
    $tmp = $var;
    $var = openssl_random_pseudo_bytes(100);
    $name = null;
    if ($scope === null) {
        $scope = $GLOBALS;
    }
    foreach ($scope as $k => $v) {
        if ($v === $var) {
            $name = $k;
            break;
        }
    }
    $var = $tmp;
    return $name;
}

$hoge = 'foo';
var_dump(get_var_name($hoge)); // string(4) "hoge"

call_user_func(function () {
    $fuga = 'foo';
    var_dump(get_var_name($fuga, get_defined_vars())); // string(4) "fuga"
});
```
bowerでTypeScriptの各ライブラリのd.tsを持ってくる



各ライブラリのd.tsをまとめてるリポジトリがあるのでそれをインストールすればよし。

[borisyankov/DefinitelyTyped](https://github.com/borisyankov/DefinitelyTyped.git)

```sh
$ bower install "https://github.com/borisyankov/DefinitelyTyped.git" --save-dev
```
iOS 複数Viewをxibで作ってあとでソース上から追加できる


複数Viewをxibで作ってあとでソース上からaddSubViewできます。
使い方をPopupで表示する時やメニューをポップアップさせる時などに便利です。
ViewはOutletで繋いでおいてソース上のviewDidLoadなどでaddSubViewしましょう。使うタイミングになってaddSubViewしても大丈夫です。

## 例) 使い方を別のViewとしてxib上に予め用意

うたスマと書かれているほうのViewはFile's Ownerです。
「イヤホンを使うと声にエコーがかかります」と書かれているViewはViewControllerにOutletで紐付けられています。
![kobito.1375928161.742255.png](https://qiita-image-store.s3.amazonaws.com/0/27793/9ae6f55a-3568-d6ae-af54-5c57f83aa1ba.png "kobito.1375928161.742255.png")

## 例) 動的に変化する部分を別のViewとしてxib上に予め用意
採点がONの時のみViewControllerで上の青いViewをつかいます。
![kobito.1375928337.741611.png](https://qiita-image-store.s3.amazonaws.com/0/27793/0b0fad25-59dc-5b5b-11b0-4533b0accaaf.png "kobito.1375928337.741611.png")
Seleniumでwaiting for evaluate.js load failedが出たときの対応

## 環境
* OS ： Mac OSX Mountain Lion
* ブラウザ ： Firefox23
 * Firefox22 -> Firefox23に更新した直後に発生
* Selenium ： selenium-webdriver-2.32.0
 * Firefox22では正常に動いていた

## 対応
* Firefox23にするとgemも更新しないといけない
* Gemfileに```gem "selenium-webdriver", "~> 2.34.0"```を追加
* ```bundle update```で更新してやると正常に動き始めた

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
rsyncメモ

スラッシュについて
====
* 最後に / を付ける場合、 /* と理解する。

```bash:考え方
$ rsync -a src/ dest
は以下のようなものになると頭で整理しておく。
$ cp -a src/* dest
```

----

メモ
====

* LAN内(100Mbps)でrsyncをかけたら 450GBのコピーが21:00〜08:30までかかった。 (11時間半。-z付け忘れた。)
* rsyncすると、コピー元のアクセス日時が本日に更新されます。※ファイルの更新日時はそのままです。←あせった

```bash:
$ rsync -a 192.168.11.5:/home/backup/ backup
$ rsync -az --delete  192.168.11.5:/home/backup/ backup
$ rsync -az --delete --exclude '/rpool/share/_recycle' 192.168.11.5:/home/backup/ backup
```

オプション
----

* -a ・・・ cp -a と一緒。必ず付ける。
* -z ・・・ 圧縮して転送。
* --delete ・・・ コピー元にないファイルはコピー先から消す。
* --bwlimit=8192 ・・・ 転送速度を8Mbpsに設定
* --exclude '_recycle' ・・・ _recycle にマッチしたものは除外。フルパスで書くこともできる。
* --dry-run(-n)
* --list-only
* -h ・・・ 転送量をK,Mで表示
* --exclude-from=pattern-file ・・・ 除外パターン（.gitignore的に書ける）

rsync -avz --delete ./new-dir/ /home/user/new-dir # 安全。これを使う。

あとで読む
----

* [sshのオプション](http://sonic64.com/2004-11-17.html)
* [rsync でディレクトリの同期（バックアップ）](http://www.maruko2.com/mw/)
* [rsync の使い方、オプションについてのまとめ](http://futuremix.org/2011/02/rsync) 
* [rsyncでオンラインバックアップ](https://wiki.archlinux.org/index.php/Full_System_Backup_with_rsync)
コーディングスタイル色々

コーディングスタイル

朝早いので、暇だし
検索してひっかかったのを貼っとく。見つけ次第順次更新。

# Ruby

- https://github.com/bbatsov/ruby-style-guide
- https://github.com/styleguide/ruby

# Python

- http://google-styleguide.googlecode.com/svn/trunk/pyguide.html
- https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style/
- http://www.pocoo.org/internal/styleguide/

## Pythonコーディングスタイルまとめ

- http://tell-k.hatenablog.com/entry/2012/02/26/173554

# PHP

- http://framework.zend.com/manual/1.12/en/coding-standard.html
- https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md
- http://symfony.com/doc/current/contributing/code/standards.html

## PHPコーディングスタイルまとめ

- http://qiita.com/hshimo@github/items/04be1f432240c58300f4

# JavaScript

- https://github.com/visionmedia/mocha/blob/master/mocha.js
- http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml
- http://contribute.jquery.org/style-guide/js/
- http://dailyjs.com/2012/01/12/style/
- https://gist.github.com/isaacs/357981
- http://mislav.uniqpath.com/2010/05/semicolons/
- https://github.com/airbnb/javascript [(日本語訳)](https://github.com/mitsuruog/javacript-style-guide)

# CSS

- https://github.com/styleguide/css
- http://markdotto.com/2011/11/29/css-property-order/

# TypeScript

- http://yaakaito.org/blog/2013/05/05/typescript-codeconventions/

## Product Strategy

- http://yaakaito.org/blog/2013/04/26/typescript-proj-template/ (プロジェクトテンプレートの作り方)

# CommonLisp

- http://google-styleguide.googlecode.com/svn/trunk/lispguide.xml

# SQL

- http://stackoverflow.com/questions/118288/sql-coding-style-guide

# C++

- http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
Node.js & Expressで最初にいれるべきモジュール

最近, 仕事やプライベートで, ちょっとしたプログラムを書くときは, Node.jsを使う頻度が増えてきており, その実行結果をブラウザ上で見れるようにするためにExpressを使うことが多くなってきたということもあり, 一度, Node.js & Expressでよく使っているモジュールを簡単にまとめてみます.

ただ, まだまとめ途中であり, 増えたり減ったりすると思います. 他にもおすすめのモジュールとかあったら教えていただければと思います.

## config
> npm install config

アプリケーションの設定情報を管理するためのモジュール. ルートの **config** フォルダを作成し, その中に **default.json** を作る. default.jsonの中身が, configモジュールの設定情報を保持するファイル. 開発環境用の設定ファイル, 本番環境用の設定ファイル, などのように管理できる.

## log4js
> npm install log4js

実行ログを残すためのライブラリ. 上記configモジュールの設定内に,

``` config.json
"log": {
  "type": "dateFile",
  "appenders": [ {
    "type": "dateFile",
    "filename": "log/logging.log",
    "pattern": "-yyyy-MM-dd"
  } ]
}
```
などと記述しておき, app.js内などで,

``` app.js
var log4js = require('log4js');
log4js.configure({"appenders": config.log.appenders});
var logger = log4js.getLogger(config.log.type);
logger.info('Logging start. ');
```

といった感じで使っている.

## moment
> npm install moment

日付情報を扱うためのライブラリ. 機能が豊富で使いやすい, かつ使う可能性が高いのでとりあえず入れておく系.

## mocha, should
> npm install mocha
> npm install should

JavaScript用の自動テストフレームワーク. 

## supertest
> npm install supertest

Expressのルーティングを含む全体をテストするためのツール.

``` app.js
// 末尾部分
module.exports = app;

if (!module.parent) {
   http.createServer(app).listen(app.get('port'), function(){
     console.log('Express server listening on port ' + app.get('port'));
   });
 }
```

## d3
> npm install d3

CSVのパース処理を行ってくれるライブラリ. CSVパーサーには他に,  **ya-csv** というライブラリもあるが, 自分的には **d3** のほうがおススメ. ya-csvの場合, 行ごとにパースを行い行ごとにコールバック関数が呼び出されるが, d3は一括でパースを行ってくれ, 非同期ではない点が気に入っています.

データ量が多いCSVファイルをパースするのであれば, ya-csvのような非同期型のほうがいいかもしれません.

```js:parse.js
var d3 = require('d3');
var csv = d3.csv.parse(data_string);
console.log(csv[0]['id']);
```
パース後は, 1行目をヘッダ行とみなして, 各行をヘッダ行の文字列をキーとするオブジェクトの配列として帰ってくる.

## その他いろいろ
まだ書ききれていません.
カレントディレクトリ配下の全てのzipファイルの破損チェック

標準出力を表示すると正常なファイルのチェックもコンソールに出て大変なことになるのでエラーが有った時にだけ表示。
`for file in *.zip; do unzip -t "${file}" > /dev/null ; done;`
音声認識 Julius 4.2.3 + Mac OSX Mountain Lion 10.8.4 でビルドする方法

音声認識 Julius 4.2.3 + Mac OSX Mountain Lion 10.8.4 でビルドする方法です。

##### gcc バージョンの確認

```
% gcc -v
Using built-in specs.
Target: i686-apple-darwin11
Configured with: /private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/src/configure --disable-checking --enable-werror --prefix=/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2 --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin11 --enable-llvm=/private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/dst-llvmCore/Developer/usr/local --program-prefix=i686-apple-darwin11- --host=x86_64-apple-darwin11 --target=i686-apple-darwin11 --with-gxx-include-dir=/usr/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
```

##### portaudio のインストール

http://www.portaudio.com/download.html から stable の pa_stable_v19_20111121.tgz をダウンロード。

ビルド方法
Julius は 32 ビットでないと動かないっぽいので32ビットでビルドする。

```
% tar -xzf ~/Downloads/pa_stable_v19_20111121.tgz
% cd portaudio
% env CFLAGS='-arch i386' LDFLAGS='-arch i386' ./configure --disable-mac-universal
```

ここで Makefile の CFLAGS から -Werror を削除する。  
さらに vi include/pa_mac_core.h で以下のように編集する。

```
- #include <AudioUnit/AudioUnit.h>
- //#include <AudioToolbox/AudioToolbox.h>
+ #include <CoreAudio/CoreAudio.h>
```

ビルド＆インストール作業

```
% make
% sudo make install
```

##### Julius のインストール
つづいて Julius のインストール。
最新版の 4.2.3 をダウンロード。
http://sourceforge.jp/projects/julius/downloads/59049/julius-4.2.3.tar.gz/

```
% tar -xzf ~/Downloads/julius-4.2.3.tar.gz
% cd julius-4.2.3 
% env CFLAGS='-O3 -arch i386' LDFLAGS='-arch i386' ./configure --enable-words-int --with-mictype=portaudio
% make
% sudo make install
```

##### Julius ディクテーションキットで動作確認
動作確認用にディクテーションキットをインストールします。
http://sourceforge.jp/projects/julius/downloads/59050/dictation-kit-v4.2.3.tar.gz/

インストールといっても解凍するだけ

```
% tar -xzf ~/Downloads/dictation-kit-v4.2.3.tar.gz 
```

動作確認してみた。

```
% cd dictation-kit-v4.2.3
% julius -C fast.jconf -charconv EUC-JP UTF-8
...
Stat: adin_portaudio: audio cycle buffer length = 256000 bytes
Stat: adin_portaudio: sound capture devices:
  1 [Core Audio: Built-in Microph]
Stat: adin_portaudio: use default device
Stat: adin_portaudio: [Core Audio: Built-in Microph]
Stat: adin_portaudio: (you can specify device by "PORTAUDIO_DEV_NUM=number"
Stat: adin_portaudio: try to set default low latency from portaudio: -1918613508 msec
Stat: adin_portaudio: latency was set to 6.375000 msec
STAT: AD-in thread created
<<< please speak >>>Warning: strip: sample 0-93 has zero value, stripped
pass1_best:  ハロー は ん 。            
sentence1:  ハロー ワールド 。 
<<< please speak >>>
```
CotEditorスクリプトで編集中のファイルに対してgnuplotを実行する。

CotEditorのスクリプトで編集中のファイルに対してgnuplotを実行する方法。

CotEditorのScriptMenuフォルダに以下のファイルを保存する。

```applescript:1)gnuplot.^@g.applescript
tell application "CotEditor"
	if exists front document then
		set file_path to path of front document as Unicode text
		if (file_path is not "") then
			set file_dir to (do shell script "/usr/bin/dirname " & file_path)
			set cmd to "/bin/bash --login -c \"cd " & file_dir & ";" & "gnuplot " & file_path & "\""
			set result to do shell script cmd
			if (result is not "") then
				display dialog result
			end if
			set cmd to "cat " & file_path & " | ruby -n -e 'print $_.scan(/^set output \"(.*)\"/)'"
			set result to do shell script cmd
			if (result is not "") then
				set output_file_path to file_dir & "/" & result as POSIX file
				display dialog "Done. Open " & output_file_path & "?" buttons {"Open", "Exit"} default button 1
				set button_returned to button returned of result
				if button_returned is "Open" then
					tell application "Finder" to open file output_file_path
				end if
			else
				display dialog "Done."
			end if
		else if (file_path is "") then
			display dialog "Save the file before running."
		end if
	end if
end tell
```

以上。

ショートカットキー一発で実行できるので、gnuplotに限らずよく使うCUIアプリを登録しておくとよい（いろいろなサンプルがネットで公開されてる）。
OSXでpackerでCentOS6.4のVirtualBox VMを作成する

## 2014-05-23追記 vagrantcloud.comにCentOS 6.5とUbuntu 14.04のVMを登録しました

作成済みのVMだけ使いたい場合はそちらをご利用ください。手順は["packer - Ubuntu 14.04 を Vagrant に準備する - Qiita"へのコメント](http://qiita.com/seizans/items/ef220c98fde6dbfbee32#comment-b7397a1ed66fea0bfcdc)を参照してください。

また、packer用のtemplate.jsonは[shiguredo/packer-templates](https://github.com/shiguredo/packer-templates)を利用するのがお勧めです。CentOSとUbuntuの新しいバージョンが出る度にpacker templateが追加されています。私もいつも利用させて頂いています。ありがとうございます！

## packerのインストール

詳細は[Install Packer - Packer](http://www.packer.io/intro/getting-started/setup.html)を参照してください。

* [Downloads - Packer](http://www.packer.io/downloads.html)でMac OSXのamd64のリンクをクリックしてダウンロードします。
* ダウンロードしたzipファイルを解凍して~/packer/に配置します（~/packer/packerというパスでアクセスできるようにします）。
* 以下のコマンドを実行します。

```shell-session:
$ echo 'export PATH=~/packer:$PATH' >> ~/.bash_profile
$ exec $SHELL -l
```

packerが実行できることを確認します。

```shell-session:
$ packer
usage: packer [--version] [--help] <command> [<args>]

Available commands are:
    build        build image(s) from template
    fix          fixes templates from old versions of packer
    validate     check that a template is valid
```

## vagrantのbox作成

私が作成したpacker用の設定ファイルが
https://github.com/hnakamur/my-packer-template-files/tree/895f40358ff38328d30a69727bceba5f4962c3e2/centos6.4
に置いてあります。これをダウンロードしてpacker buildを実行します。

https://github.com/hnakamur/my-packer-template-files/commit/c90c7d6a17d522f9516a07176e873b99f30251da の方を使うと、provisioningでepelとAnsibleもインストールします。

```shell-session:
$ git clone https://github.com/hnakamur/my-packer-template-files
$ cd my-packer-template-files/centos6.4
$ packer build -only=virtualbox template.json
```

これで、以下の処理が実行されます。

* CentOSのisoイメージをダウンロード
* VirtualBoxのVMを作成
* プロビジョニング実行（template.jsonのprovisionersに対応）
* vagrantのVM作成（template.jsonのpost-processorsに対応）

最終的にはpacker_virtualbox_virtualbox.boxが生成されます。VirtualBoxのVMは途中で一旦登録されますが削除されます。

vagrant box addコマンドで好きな名前をつけて登録します。

```shell-session:
$ vagrant box add centos6.4 packer_virtualbox_virtualbox.box 
```

あとはいつも通りVagrantファイルを作ってvagrant upでお使いください。

## 参考サイト

[Packerリリースおめでとうございます！ - As a Futurist...](http://blog.riywo.com/2013/06/30/190607)を参考にさせて頂きました。ありがとうございます。
win-sshfsで鍵を使ってログインする方法

win-sshfsで鍵を使ってログインする方法
=====================================

win-sshfs (Dokan .Net library) ではssh公開鍵を使ったログインをしたい時に一つ問題があります。AES-128-CBC で暗号化された秘密鍵を読み込むことができません。DES-DES3-CBC じゃないと読み込めないという謎仕様です。cygwin や Mac で ssh-keygen した時には、AES-128-CBC で生成されるというのに…。

AES-128-CBCで暗号化されたファイルをDES-DES3-CBC暗号に変換する方法
-----------------------------------------------------------------

### DSA鍵の場合

```
mv id_dsa id_dsa2
cat id_dsa2 | openssl dsa | openssl dsa -des3 > id_dsa
```

### RSA鍵の場合

```
mv id_rsa id_rsa2
cat id_rsa2 | openssl rsa | openssl rsa -des3 > id_rsa
```

最初に元鍵のパスフレーズを入力し、次に、新しいパスフレーズを二回入力しましょう。

これで、暗号方式を変更した id_dsa, id_rsa ならば、win-sshfs でも使えるようになります。
Guava の EventBus で多相の値を扱うために試行錯誤した話

百聞は一見に如かず。まずはこんなクラスを用意します。

```java:
public static class SampleHoge{
}
public class ValueEvent<T>{
	final private T x;

	public ValueEvent(T x) {
		this.x = x;
	}
	public T get(){
		return x;
	}
}
public static class HogeListener {
	@Subscribe
	public void show(ValueEvent<SampleHoge> x){
		Log.d("sample", "value:hoge:" + x.get());
	}
}
```

任意の型が含まれるイベントのうち、リスナが指定した型 ( ここでは `SampleHoge` ) のイベントのみが渡ってくるという動作を期待しています。さっそく使ってみましょう。

```java:
EventBus eventBus = new EventBus();
eventBus.register(new HogeListener());

eventBus.post(new ValueEvent<String>("hello, string!"));
eventBus.post(new ValueEvent<Integer>(1234));
eventBus.post(new ValueEvent<SampleHoge>(new SampleHoge()));
eventBus.post(new SampleHoge());

// value:hoge:hello, string!
// value:hoge:1234
// value:hoge:SampleHoge@406e3180// 本当はここだけ実行されてほしい
```

残念ながら期待どおりにはいきません。
でもこれは予想できていたことです。メソッド `void show(ValueEvent<SampleHoge> x)` の型パラメータ `SampleHoge` が type erasure で消されるのでしょう？そんなことは知ってますよ。フフン。

参考 : [What about a generic Handler<T> interface?]
(https://code.google.com/p/guava-libraries/wiki/EventBusExplained#What_about_a_generic_Handler<T>_interface?)

## 引数から型パラメータを消してみる

それならばと下記のようなクラスも試してみました。

```java:
public static class TypeBinder<T>{
	public class ValueEvent{
		final private T x;
		
		public ValueEvent(T x) {
			this.x = x;
		}
		public T get(){
			return x;
		}
	}
}
public static class HogeTypedListener extends TypeBinder<SampleHoge>{
	@Subscribe
	public void show(ValueEvent x){
		Log.d("sample", "typed-value:hoge:" + x.get());
	}
}
```

今回はメソッド `void show(ValueEvent x)` に型パラメータが現れていません。enclosing class (`TypeBinder<T>`) に与えられた型パラメータ `T` を inner class (`ValueEvent`) から参照している形です。

実行してみます。

```java:
EventBus eventBus = new EventBus();
eventBus.register(new HogeTypedListener());

eventBus.post((new TypeBinder<String>()).new ValueEvent("hello, string!"));
eventBus.post((new TypeBinder<Integer>()).new ValueEvent(1234));
eventBus.post((new TypeBinder<SampleHoge>()).new ValueEvent(new SampleHoge()));
eventBus.post(new SampleHoge());

// typed-value:hoge:hello, string!
// typed-value:hoge:1234
// typed-value:hoge:SampleHoge@406cef88// 本当はここだけ実行されてほしい
```

残念ながら結果はまるで変わりません。
でもこれも考えてみれば当たり前ですね。型パラメータの位置が変わっただけですから。

いずれの形でも ValueEvent 以外の場合に実行されていないことは確認できたので、イベントの型が一種類に保証されている場合は問題ないとも言えますが、しかしそれは何の解決にもなっていません。

## 悲しい

どうにかして EventBus で多相の値を扱うための回避策が欲しいところですが思いつきませんでした。誰か教えてください。

## 以上

失敗の記録が誰かのお役に立ちますように。
flock(1)でシェルスクリプトの排他制御（Linux）

シェルスクリプトで排他制御したいケースがたまにあります。

「多重起動の抑制」「二重起動の禁止」などとされることもあります。よくやるのは pid ファイルを作成したりロックファイルを作成したりだと思いますが、「ファイルの有無」とか「プロセスIDのチェック」がどうも不安定に感じていました。ファイルシステムの排他ロックとか簡単に使えればいいのに…！

調べてみると、flock(1) なんていう便利なものがあることがわかりました。

- http://linux.die.net/man/1/flock
- http://luna2-linux.blogspot.jp/2011/08/flock.html

## 第二版

あえて、「singleton.sh を source することでスクリプトを排他制御する」という構成にこだわる。

```bash:singleton.sh
# 利用者はこのファイルを source します
_LOCK_FILE=$0.lock

exec {F_LOCK}>>$_LOCK_FILE

flock -w 1 ${F_LOCK}

if [ $? -ne 0 ]
then
	echo "maybe already running.">&2
	exit 1
fi
```

コメントでいただいた指摘通り、やはりロックファイルを作成して、終わったら消す方式では安定した排他制御は望めない。どうしても、「ロック解放」から「削除」までのタイムラグが発生してしまう。

しかたがないので、ロックファイルを置きっぱなしにすることにする。（悔しい）

利用側は以下のように。

```bash:app.sh
#!/bin/sh

source ./singleton.sh

echo "hogehoge"
sleep 2
echo "fugafuga"

```

## 自分自身をオープンしちゃう方法と問題点

たぶん自分自身をオープンしておくやり方の方がロックファイルより確実だと思います。

ただ、シェルスクリプトを実行する際、そのファイルが書き込み用にオープンされていると気持ち悪い感じで失敗します。

```bash:app2.sh
#!/bin/sh

exec {F_LOCK}>>$0

sleep 10
echo "ok"
```

こいつを平行して実行しようとすると、

```
[vagrant@localhost ~]$ ./app2.sh &
[2] 5762
[vagrant@localhost ~]$ -bash: ./app2.sh: /bin/sh: bad interpreter: テキストファイルがビジー状態です
```

こうなるのです。

一瞬これだけで排他制御できるじゃんと思いましたそううまい話でもなく、スクリプトを起動する瞬間しか排他効果がないので、exec によってオープンされるまでの間に素早く起動させれば余裕で平行実行可能です。

## 注意事項

- 上のモジュール自体はネタです。
- flockコマンドは Util-Linux のものです。Macでは動きませんし、古いバージョンのディストリビューションでも入ってません。
CotEditorスクリプトで編集中のrubyコードをrbeautifyする。

CotEditorのスクリプトで編集中のコードをrbeautifyで整形する方法。以下の通り、とても簡単。

1. CotEditorのScriptMenuフォルダにrbeautify.rbをコピーする(rbeautifyはgemで入手可能)。
2. rbeautify.rbの文頭を以下のようにする（書き換える）。

```rb:rbeautify_for_CotEditor.rb
#!/usr/bin/ruby -w
# coding: UTF-8
#%%%{CotEditorXInput=AllText}%%%
#%%%{CotEditorXOutput=ReplaceAllText}%%%
(以下略)
```

3. ファイル名をrbeautify.^@R.rbなどに変更する。

以上。
centos＋chef-solo のタイムゾーンcookbook

使うcookbook迷ったのでメモ

# ダメだったやつ
* http://community.opscode.com/cookbooks/timezone
 * centos非対応
* http://community.opscode.com/cookbooks/timezone-ii
 * /etc/sysconfig/clock が変わらない

# いけたやつ
* https://github.com/jamesotron/cookbooks/tree/master/timezone

結局、opscode/timezone メンテナさんのgithubから最新版をもってくれば動いてくれました