OmniAICreator/Qiita-1.07M huggingface dataset:
「npm WARN package.json xxx No repository field.」は気にするな

http://stackoverflow.com/questions/16827858/npm-warn-package-json

```
However, don't worry, there are sooooooo many packages which still don't have the repository field in their package.json. The field is used for informational purposes.
```

だけれども、気にしなくていい、package.jsonに未だにrepositoryフィールドを持っていないとーーーーーっても沢山のパッケージがあるんだ。そのフィールドは情報の（付加情報的な？）目的で利用されている。
Marionette ViewでHoganのプリコンパイルテンプレートを用いる


どこかで、Marionette.Rendererを上書きする。
templateは、Hogan.Templateが渡ってくる。
renderはその中のメソッド

```*.js
Marionette.Renderer.render =
	function(template, data) {
		return template.render(data);
	};
```
[Objective-C] NSLogフォーマット指定子一覧


一覧は[Appleのドキュメント](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html#//apple_ref/doc/uid/TP40004265-SW1)にまとまってます。

ですが、よく使うのでメモとして抜き出しておきます。

| Specifier | Description |
|-----------|-------------|
| %@ | Objective-C object, printed as the string returned by descriptionWithLocale: if available, or description otherwise. Also works with CFTypeRef objects, returning the result of the CFCopyDescription function. |
| %% | '%' character. |
| %d, %D | Signed 32-bit integer (int). |
| %u, %U | Unsigned 32-bit integer (unsigned int). |
| %x | Unsigned 32-bit integer (unsigned int), printed in hexadecimal using the digits 0–9 and lowercase a–f. |
| %X | Unsigned 32-bit integer (unsigned int), printed in hexadecimal using the digits 0–9 and uppercase A–F. |
| %o, %O | Unsigned 32-bit integer (unsigned int), printed in octal. |
| %f | 64-bit floating-point number (double). |
| %e | 64-bit floating-point number (double), printed in scientific notation using a lowercase e to introduce the exponent. |
| %E | 64-bit floating-point number (double), printed in scientific notation using an uppercase E to introduce the exponent. |
| %g | 64-bit floating-point number (double), printed in the style of %e if the exponent is less than –4 or greater than or equal to the precision, in the style of %f otherwise. |
| %G | 64-bit floating-point number (double), printed in the style of %E if the exponent is less than –4 or greater than or equal to the precision, in the style of %f otherwise. |
| %c | 8-bit unsigned character (unsigned char), printed by NSLog() as an ASCII character, or, if not an ASCII character, in the octal format \\ddd or the Unicode hexadecimal format \\udddd, where d is a digit. |
| %C | 16-bit Unicode character (unichar), printed by NSLog() as an ASCII character, or, if not an ASCII character, in the octal format \\ddd or the Unicode hexadecimal format \\udddd, where d is a digit. |
| %s | Null-terminated array of 8-bit unsigned characters. Because the %s specifier causes the characters to be interpreted in the system default encoding, the results can be variable, especially with right-to-left languages. For example, with RTL, |
| %s | inserts direction markers when the characters are not strongly directional. For this reason, it’s best to avoid %s and specify encodings explicitly. |
| %S | Null-terminated array of 16-bit Unicode characters. |
| %p | Void pointer (void *), printed in hexadecimal with the digits 0–9 and lowercase a–f, with a leading 0x. |
| %a | 64-bit floating-point number (double), printed in scientific notation with a leading 0x and one hexadecimal digit before the decimal point using a lowercase p to introduce the exponent. |
| %A | 64-bit floating-point number (double), printed in scientific notation with a leading 0X and one hexadecimal digit before the decimal point using a uppercase P to introduce the exponent. |
| %F | 64-bit floating-point number (double), printed in decimal notation. |
Mustache Hoganで配列内のキーの無い値の取得


**{{.}}**で取得する

```area.json
{"response":{"area":["\u5317\u6d77\u9053","\u6771\u5317","\u95a2\u6771","\u4e2d\u90e8","\u8fd1\u757f","\u4e2d\u56fd","\u56db\u56fd","\u4e5d\u5dde"]}}
```

```template
	{{#response}}
    {{#area}}
	{{.}}
    {{/area}}
    {{/response}}
```
Xcode関連の不要ファイルを削除してディスクスペースを節約


# 注意
**この記事の内容は古くなってしまっています。**

**内容をアップデートした記事は[こちら](http://dev.classmethod.jp/smartphone/remove-xcode8-related-unnecessary-files/)にあります。(2016/12/29 更新)**

# はじめに
起動ディスクの空きスペースが10GBを下回っていたので、以下のページを参考にどのファイルがたくさんのディスク容量を使っているのかを調べてみました。

* [ハードディスクの空き容量が極端に少なくなる場合の対処方法](https://discussionsjapan.apple.com/docs/DOC-1081 "ハードディスクの空き容量が極端に少なくなる場合の対処方法")

どうやらXcode関連のファイルがたくさんのディスク容量を使っているようだったので、以下の場所を確認してみました。
(実際にファイルを削除する場合は自己責任でお願いします。)

#　Archives
アプリ申請時や配布用のipa作成時などにProduct -> Archiveを実行しますが、その時に作成されるデータが以下の場所にあります。XcodeのOrganizerのArchivesタブからも確認できます。

* ~/Library/Developer/Xcode/Archives

デバッグ情報なども含まれているためipaファイルよりサイズが大きいようです。
保存し続ける必要がなければ削除します。XcodeのOrganizerのArchivesタブから削除することもできますし、finderで上記フォルダを開き、まとめて削除することもできます。

#　DerivedData
DerivedDataは以下の場所にあります。OrganizerのProjectsタブでも確認できます。

* ~/Library/Developer/Xcode/DerivedData

DerivedDataはプロジェクトごとに作成され、プロジェクトのインデックスやビルド時の生成物、ログを含みます。これらは再びプロジェクトを開いた際に再生成されます。

XcodeのOrganizerのProjectsタブから削除できます。
finderで上記フォルダを開き、まとめて削除することもできます。

#　Device Logs, Screenshots, Software Images
Device Logs、Screenshots、Software Imagesは以下の場所に保存されています。私の環境では、Software ImagesフォルダにiOSのベータ版をインストールした際のipswファイルが10個ほど存在し、20GBくらいのサイズになっていました。スクリーンショットを撮った際の画像ファイルも数が多いと結構な容量になります。

| 項目 | 保存場所|
|:-----------|:------------|
| Device Logs|        This |
| Screenshots|Library/Application Support/Developer/Shared/Xcode/Screenshots|
|Software Images|Library/MobileDevice/Software Images|

#　iOS DeviceSupport

iOSデバイスを接続した際に、以下の場所にデータが生成されます。
デバイスとOSバージョンごとに生成されるようで、私の環境では合計サイズが14GBになっていました。接続したデバイスの機種とバージョンに該当するファルダがない場合は生成されるようです。

* ~/Library/Developer/Xcode/iOS DeviceSupport/

#　iPhone Simulator Apps

iOSシミュレーターにインストールしたアプリケーションは、以下のフォルダ内に保存されています。不要なアプリケーションを削除することでディスクの使用容量を削減できます。私の環境では200MB程度のサイズでした。

* ~/Library/Application Support/iPhone Simulator

#　参考、関連ページ

* [ハードディスクの空き容量が極端に少なくなる場合の対処方法](https://discussionsjapan.apple.com/docs/DOC-1081 "ハードディスクの空き容量が極端に少なくなる場合の対処方法")
* [Xcode: 5 places to save some disk space](http://blog.favo.org/post/31649090293/xcode-5-places-to-save-some-disk-space "Xcode: 5 places to save some disk space")
* [Is it safe to erase ~Library/Developer?](http://apple.stackexchange.com/questions/104810/is-it-safe-to-erase-library-developer "Is it safe to erase ~Library/Developer?")
 
## Apple Documents

* [Devices Organizer Help](https://developer.apple.com/library/ios/recipes/xcode_help-devices_organizer/_index.html "Devices Organizer Help")
* [Projects Organizer Help](https://developer.apple.com/library/ios/recipes/xcode_help-projects_organizer/_index.html "Projects Organizer Help")
* [Archives Organizer Help](https://developer.apple.com/library/ios/recipes/xcode_help-archives_organizer/_index.html "Archives Organizer Help")
MacでPython環境を作る時に気をつける事


マシンを交換したので久しぶりにPython環境を構築してたら色々つまずいたのでメモ。

###### 参考ページ
http://d.hatena.ne.jp/nakamura001/20111129/1322579170
http://www.sicafe.net/macPackageManageTips/html/homebrewPythonInstall.html
http://yono.hatenablog.jp/entry/20100923/1285235346
http://mzmttks.blogspot.jp/2011/12/python-site-packagesdist-packages.html
http://hello-hello-world.blogspot.jp/2011/09/pythonsite-packages.html


Macには標準でPythonがインストールされています。

しかし、開発環境を構築する時には標準の環境を汚したくなかったり、別のバージョンのPythonが必要だったりするので別にインストールする事も多いのです。

しかし、中途半端なセットアップを行うとライブラリのインストールで意図しないうちにライブラリのインストール先が混じってしまい、インストールしたはずのパッケージが行方不明なんて事になったりします。

easy_install は元から入っている

```
/usr/bin/easy_install
```

にあるけど pip は公式インストーラーから入れたので

```
/usr/local/bin/pip
```

だったりするわけです。さらにPythonが /opt 以下だったりするとさらにカオス。

例えば標準の python の site_packages は以下になりますが

```
/Library/Python/2.7/site-packages
```

MacPortsでインストールした python だと以下になります。

```
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages
```

まぁ基本的に virtualenv 内のみで使ってれば問題は出ないんですが。

### MacPortsでインストールしたPythonを標準にする

ここらへんはpython特有の歴史的な問題も絡むので細かい話は置いておいて、MacPortsを使ってPython用の環境を作る場合です。


1. まずはpython本体

	```bash
$ sudo port install python27
```
1. 次にeasy_install。なぜかsetuptoolsの方はselectに対応してないので easy_install はインストール先のpythonに合わせて easy_install-2.7 みたいなコマンドを使います。

	```bash
$ sudo port install py27-setuptools
```
	ここでエラーになる場合エラーログにも出てきますが以下のコマンドで直ります。ちなみに私の場合は公式のget_pip.pyをportでいれたpythonで実行後の環境だと発生しました。
	
	```bash
sudo port -f activate py27-distribute
	```

1. 次に pip もportで入れます。select で標準の pip を切り替え。

	```bash
$ sudo port install py27-pip
$ sudo port select --set pip pip27
```
1. virtualenv関係。
	
	```bash
$ sudo port install py27-virtualenv py27-virtualenvwrapper
$ sudo port select --set virtualenv virtualenv27
$ echo -e "\n# virtualenv\nexport WORKON_HOME=\$HOME/.virtualenvs\nsource `which virtualenvwrapper.sh-2.7`\n" >> ~/.bashrc
```
	virtualenvはselectで切り替えを。virtualenvwrapperはselect無いので注意。


### パスの調べ方

python の参照しているパスを調べる方法

```bash
python -c "import site; print(site.getsitepackages())"
```

distributeの参照先

```bash
python -c "import distutils.sysconfig as s; print(s.get_python_lib())"
```
Githubのpull-requestみたいなdiffを出力する


Githubのpull-request時のdiffは、例えば
`master <- hotfix`
というpull-requestを行うとき、hotfixブランチで行った追加・削除分のみの差分が表示されます。
例: https://github.com/rails/rails/pull/14400/files

これをgitでどうやるのかなと調べてみたら見つかった。
上記のhotfixとmasterの例なら

```
$ git diff master...hoge
```
でいける。

**追記**
勘違いで間違ったコマンド貼ってたようです。
正確には`...`を使う方が正しいです。

`git help diff`から引用

```
git diff [--options] <commit>...<commit> [--] [<path>...]
   This form is to view the changes on the branch containing and up to the second <commit>, starting at a common ancestor of both <commit>. "git diff A...B" is equivalent to "git diff $(git-merge-base A B) B". You can omit any one of
   <commit>, which has the same effect as using HEAD instead.
```

`git-merge-base A B`というのは、AとBの共通の先祖を探してくれるらしいです。gitまだまだおくがふかい。
tmux+zshで他のウィンドウでのコマンド終了を通知する

他のウィンドウでmakeなどの実行が終了したときに通知してくれる便利な機能。

![notify.png](https://qiita-image-store.s3.amazonaws.com/0/39647/922a6a7e-843e-3dc5-787b-20644fd2c362.png)

```bash
$ mkdir .zsh
$ cd .zsh
$ git clone https://github.com/papamitra/zsh-behind-window-notify.git
$ echo 'source ~/.zsh/zsh-behind-window-notify/behind-window-notify.zsh' >> ~/.zshrc
```

macならgrowlnotify, それ以外ならnotify-sendを使って通知を試みる。
ヘッダのカスタマイズや独自処理をしたいときの AFNetworking 2.0 の使い方


# 普通の使い方

```AFHTTPRequestOperationManager``` というクラスを主に利用します。
GETで通信したい場合は、以下のように ```GET:parameters:success:failure:``` メソッドを呼び出すことで、リクエストを開始することができます。
parameters: に NSDictionary 型のデータを渡せば、それをよしなにURIパラメータやBODYに付与してくれます。

サーバとの通信に成功しレスポンスが返って来た場合には、success: で指定したブロックが呼び出されます。また、ネットワークに繋がっていなかったり、指定したURLのサーバホストの名前解決がでいないなどサーバとの通信に失敗した場合は、failure: で指定したブロックが呼び出されます。
ちなみに、```AFHTTPRequestOperation``` からステータスコードやレスポンスヘッダといった情報を取り出すことができます。

```Objective-C
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"https://hogehoge.api.com/user"
  parameters:@{ @"user_id":@"hoge" }
     success:^(AFHTTPRequestOperation *operation, id responseObject) {
         NSLog(@"res:%@", responseObject);
     }
     failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         NSLog(@"error:%@", error);
     }];

``` 

GET 以外には、POST, DELETE, PUT 用のメソッドも用意されています。

# ヘッダのカスタマイズ

さて、ここからカスタマイズ編です。リクエスト時のヘッダをカスタマイズしたい場合は、以下のように ```AFHTTPRequestOperationManager``` の ```requestSelializer``` というプロパティに対して、```setValue:forHTTPHeaderField:``` を呼び出します。
```NSMutableURLRequest``` にヘッダを設定する場合と似てますね。

```
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.requestSerializer setValue:@"SomeValue" forHTTPHeaderField:@"SomeHeaderField"]
```

ちなみに、BASIC認証したい場合は、以下のメソッドが使えます。

```
- (void)setAuthorizationHeaderFieldWithUsername:(NSString *)username
                                       password:(NSString *)password;

...

[manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"username"
											   	     		password:@"xxx"];

```

# NSURLRequest のカスタマイズ

リクエストを開始する前に```NSURLRequest```にある処理を実行したいという場合があると思います。
例えば、Parse を使っていてリクエストヘッダにアクセストークンを付与したい場合、以下のように行うことができます。

```objc
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

AFHTTPRequestSerializer *selializer = [AFHTTPRequestSerializer serializer];
self.requestSerializer = selializer;

NSString *URLString = @"https://api.twitter.com/1.1/friendships/create.json";

// リクエストに使う NSURLRequest を生成
// このメソッドを使うことで、AFNetworkingのパラメータのエンコードを良しなにやってくれる処理を再利用できる
NSMutableURLRequest *request =
   [selializer requestWithMethod:@"POST"
					   URLString:URLString
                      parameters:@{ @"screen_name":@"gologo13" }
                           error:nil];
    
// 独自の処理 リクエストヘッダに Twitter API を叩くためのアクセストークンを付与する
[[PFTwitterUtils twitter] signRequest:request];

// リクエスト開始
AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure];
[self.operationQueue addOperation:operation];
```

最初に紹介したやり方よりは記述量が多くなってしまいますが、必ず毎回実行したい処理なら```AFHTTPRequestOperationManager```のカテゴリ拡張もしくはサブクラスを作っても良いかもしれません。

# Reference

- [元ネタ](http://www.gologo13.com/2014/03/17/objective-c-afnetworking2-customize/)
- [iOS - AFNetworking 2.0 のまとめ - Qiita](http://qiita.com/asakahara/items/9cb68bef56ca70b505c6)
- [iOS - AFNetworking 2.0 - Qiita](http://qiita.com/jtemplej/items/c3c25a5301c7250305fe)
 - Request Serialization,  Response Serialization の説明がわかりやすい
SVGコードの効率的な編集環境

IllustratorやInkscapeもいいけど、せっかくSVGはxmlベースなんだから直接ソース編集しようぜ。

ということでMacユーザならおなじみのテキストエディタCotEditorちゃんでSVGを編集する環境を作ります。


## 従来のOS XでのSVG編集の不便な点
- OS Xではプレビュー.appでSVGは開けないしSVGZはQuick Lookすらできない
- 「InkscapeとかIllustratorで編集できるよ」とは言ったものの:
    - 独自にレンダリングするからブラウザで見るのと結果が違う (とくにスタイルシートとかは酷い)
    - 所詮は画像編集ソフトだからコードは直接弄れないしアニメーションも無理
    - ちょっと見たいだけなのにソフトウェアの起動に時間がかかる
- 「`qlmanage`とかコマンドラインでPNGに書き出しできるよ」とは言ったものの:
    - いちいちサイズを指定する必要がある
    - 背景が透過されなくて結局使い物にならない
- 「Safariとかwebブラウザで見られるよ」とは言ったものの:
    - SVGパーツをプレビューするにはwebブラウザはウインドウが大き過ぎるし、いちいちウインドウサイズを変更するのはめんどう
    - ローカルファイルのSVGZをSVGに展開できないので、SVGZはいちいち手動で解凍する必要がある

まぁ、こういう諸々の不満を解決するための環境づくりです。


## 用意するもの
以下の3つを組み合わせます。全部フリーウェアです。

![CotEditor icon](https://qiita-image-store.s3.amazonaws.com/0/6520/372b9470-e716-d91d-f2b3-d47d3f058a83.png) ![Gapplin icon](https://qiita-image-store.s3.amazonaws.com/0/6520/17aecb08-ef2f-8329-9ab6-fee35943ce7b.png) ![zip.png](https://qiita-image-store.s3.amazonaws.com/0/6520/660059bc-4255-111e-8811-45693d2b78ba.png)



- [CotEditor](http://coteditor.com/) (テキストエディタ)
- [Gapplin](http://gapplin.wolfrosch.com/) (SVGビューア)
    - 外部のエディタで編集しつつプレビューすることに重きを置いたSVGビューア
- [CotEditor用SVG編集スイート](http://wolfrosch.com/works/goodies/coteditor_svg)   (CotEditor用マクロ)
    - CotEditorでのSVG編集を助けるマクロ・CotEditorとGapplinの連携マクロの詰め合わせ

インストール方法はぞれぞれの案内にゆだねます。

### Gapplin の外部エディタに CotEditor を指定
環境設定から選んでおいて下さい。これでGapplinから「編集」を実行したときにCotEditorでソースファイルが開くようになります。

![Gapplin環境設定](https://qiita-image-store.s3.amazonaws.com/0/6520/8c3e8b50-3739-d0b5-d340-1801221576b1.png)

また「ファイルが更新されたときに自動的に再描画」をチェックしておくと良いでしょう。


## 編集手順

こんな感じでGapplinでSVGの描画をプレビューしながらCotEditorでSVGソースを編集します。

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/6520/9f27792b-271d-3ad4-69da-cdec837e4ddd.png)


### ファイルオープン
#### a. プレビュー先行型
1. GapplinでSVGファイルを開く
2. （ファイルがSVGZ形式だった場合）GapplinでプレーンテキストのSVGに展開する
3. ⌘+E またはメニューの「ファイル > 編集」からCotEditorでファイルオープン

#### b. エディタ先行型
1. CotEditorでSVGファイルを開く
2. ⌘+Shift+R またはスクリプトメニューの「SVG > Preview」からGapplinでファイルオープン

### 編集
CotEditorでソースを編集し保存をすると、Gapplinのビューも更新されるので、ビューを見ながらエディタで編集を進める。SVGスイートにはW3Cの文法チェックやスニペットなども入っているので適宜使うと便利。

### 編集終了
1. CotEditorで保存をする
2. 必要があればGapplinでSVGからSVGZに変換する
3. 必要があればPNGなど他の画像形式に書き出す

## ここが便利
まぁ、最初に上げた不満が解決するわけですけれど、それ以外にも：

- 使い慣れた普段のテキストエディタが使える
- アイコンとかの真っ白な画像も背景色が切り替えられるからちゃんと見える
- escキーでちゃんとキーワードの補完もするよ
- 軽い・コンパクト
- 日本語ローカライズ済み
- バッチ処理用のAutomator.appアクションも付いてくる

なんかがいいんじゃないかと思います。

## おわりに
お気づきかもしれませんが、CotEditor用SVG編集スイートとGapplinは拙作です（というかCotEditorも開発やってますね）。

そうです、CotEditorでSVG編集がしたいがために、こんなにマクロを書いて、シンタックス定義を書いて、そしてSVGビューアそのものまで開発したんです。CotEditorのためです。なのでGapplinとCotEditorとの相性の良さは保証します。 __SVG編集はCotEditor__ 、覚えておきましょう。

あとGapplin使って下さい。こんだけ書いといてなんですが、CotEditor以外でも使えます。
Safariで使用するフォントをRictyに統一する

cssを作ってブラウザで指定。

```css:~/Documents/Ricty.css
* {
  font-family: "Ricty Discord","FontAwesome","octicons";
}
```

![スクリーンショット 2014-03-17 6.43.27.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2cbbf49e-2f67-5677-b7ee-b6f620c9d3bf.png)

httpsのサイトのフォントは変わりません。
Redmine のローカル起動方法


### 実績環境

-

| 環境 　　　　|バージョン  |備考 |
|:-----------|:------------|:------------|
| MacOSX     | 10.9.2     |MacBookProRatina|
| Homebrew   | 0.9.5      ||
| Ruby       | 2.1.1      |最新バージョン|
| Rails      | 3.2.17    |Redmineの最新がこれ|
-


## 必要なもの
・MAC => Windowsでも出来るかもしれません。
・Redmineのソースコード
・Imagemagickがインストールされている。 [Imagemagickインストール方法](http://qiita.com/issobero/items/a86cbc3a1dfd26cdab4b)
・rubyがインストールされている。        [rubyインストール方法](http://qiita.com/issobero/items/e0443b79da117ed48294)
・データベース 今回はMYSQLを使います。

■ソースコードはここから撮ってきましょう
[redmineダウンロード](http://www.redmine.org/projects/redmine/wiki/Download)

■最新バージョン Redmine 2.5.0
rails => 3.2.17


まずは必要な物があるかチェックです。

```必要なものチェック
display
# => Version: ImageMagick 6.8.7-7 Q16 x86_64 2013-11-27 http://www.imagemagick.org
# => OK
ruby -v
# => ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin13.0]
# => OK
mysql
# => Server version: 5.5.33 MySQL Community Server (GPL)
# => OK
```

MYSQLの設定
今回、ユーザーはredmineは良さそうなので、redmineというユーザーを作ります。
ユーザー名：redmine
PASSWORD：redmine

## MYSQLの準備

```Redmine
mysql -u root -p
# => passを入力して入る。
GRANT ALL PRIVILEGES ON *.* TO redmine@localhost IDENTIFIED BY 'redmine' WITH GRANT OPTION;
```

ユーザーを作ったら「database.yml」を編集します。

```database.yml
production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: root
  password: ""
  encoding: utf8

development:
  adapter: mysql2
  database: redmine_development
  host: localhost
  pool: 5
  username: redmine
  password: redmine
  encoding: utf8
```

## Redmineのインストール

早速インストールしましょう
コマンドを上げてインストール

```Redmine
bundle install --path=vendor/bundle
```

無事インストール出来たら最後にこんなメッセージが出ればOKです。

```Redmine
Your bundle is complete!
```

ここからかなりゴニョゴニョします。
これで取り急ぎ、以下コマンドでアクセス出来るようになるはずです。
私は出来ました♪

```ゴニョゴニョ
bundle exec rake -v                    # => ちゃんと帰って来ればOK
bundle exec rake db:create             # => データベース作成
bundle exec rake db:migrate            # => テーブル一覧を作成
bundle exec rake generate_secret_token # => セッションストアの作成 config/secret_token.rb が出来る。
bundle exec rake redmine:load_default_data # => データの導入
=> jaを入力しましょう
```


```redmine
bundle exec rails s
http://localhost:3000 # => つながるはず
```

```redmine
bundle exec rake -vT
```

```結果
bundle exec rake generate_secret_token
# => config/secret_token.rb にtokenを生成する。
bundle exec rake redmine:load_default_data
# => ワークフローなどのデータを入れる。
# => これをやらないと自分でフローを作らないといけない。
```


■デフォルトアカウント

	login: admin
    password: admin


■TODO
Ubuntsu での nagix + uniron redmine構築
プラグインの導入等
Rails rmagickをインストールする手順


筆者はかなりrmagickに苦戦させて頂いたので、同じ人がいるのではないかと思いやり方を記載します。

■必要なもの
ImageMagick


```エラー
No package 'MagickCore' found
checking for stdint.h... yes
checking for sys/types.h... yes
checking for wand/MagickWand.h... no

Can't install RMagick 2.13.2. Can't find MagickWand.h.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/takashiisobe/.rbenv/versions/2.1.1/bin/ruby

extconf failed, exit code 1

Gem files will remain installed in /Users/takashiisobe/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/rmagick-2.13.2 for inspection.
Results logged to /Users/takashiisobe/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/extensions/x86_64-darwin-13/2.1.0-static/rmagick-2.13.2/gem_make.out
```

これがエラー何だけど・・・
何言っているかわからないですよね！？

要するに「MagickCore」が見つからないということです。

brewでImageMagickをインストールすればPATH通って簡単なので、やってみてください。

```2014/3/05現在のImageMagick最新バージョン
6.8.7
```

```コマンド
brew update # => updateするといい感じに入ってくれます。
brew install ImageMagick
```

brewのインストール方法は以下で説明しています。
http://qiita.com/issobero/items/e0443b79da117ed48294
PHPでフレームワークとかは使わずにそれっぽいアドレスにしてみたり

もう既にタイトルが意味不明ですね…

## URLのパラメーターを/で区切って渡したい

こんなことする方法は色々あるかと思います。今回はRewrite先生の力を借りました。ぐぐれば山のように出てくると思うので今回は割愛したかった()

### まずそれなりにこいつ(ルーティング)が厄介

あれ、鯖によって書き方が違うのは[以前例を示した](http://qiita.com/kimama1997/items/af3d76110e6c67a3d96f)んですけど、多分この方法でhoge/foo.phpにhoge/foo/aaa/bbb/なんてやろうとすると無限ループが発生してしまい`500`エラーを返したり(Apache)そもそもそんなのはマッチしない！ってことで`404`を返したり(IIS)するわけです。

どうしろって書いてる記事見つからないんだよこれが…

### とりあえず今回は限られたパターンが通せばOK

(既存のページの改造に用いたため、)今回は`hoge/user/(screen_name)/?param`ってのを`hoge/user.php?screen_name=(screen_name)&param`って渡せればよかったので、試行錯誤の末以下のようなRewriteに辿り着いた。(抜粋)

```.htaccess
RewriteRule ^(.*user)\/([0-9a-zA-Z_]{1,15})\/? $1.php?screen_name=$2&%{QUERY_STRING} [L]
```

```xml:web.config
              <rule name="user" stopProcessing="true">
                  <match url="^(.*user)\/([0-9a-zA-Z_]{1,15})\/?" />
                  <action type="Rewrite" url="{R:1}.php?screen_name={R:2}" appendQueryString="true" />
              </rule>
```

なお、これをやるにあたって@mpywに相談してみたところ、いっそのことパラメーターのパースとか自前でやっちゃえば、とか言われたけどめんどくさいので今回はパス。

ところでこのRewrite、鯖によって仕様の違いが良かったりめんどくさかったり。
両鯖共通してGETクエリ(ブラウザから送られたアドレスの?hoge)は渡されない。

Rewrite後のURLにクエリがついてなかったら自動的に付与される(？)

今回はもちろん`?screen_name=$2`ってしてるのでそうはいかず、
`hoge/user/(screen_name)/?param`のようにリクエストして受け取ったクエリを見たらparmはついていなかったので、 **Apache** のRewriteには`&%{QUERY_STRING}`を直接当ててやったらうまくいった。

続いて **IIS** 。こちらはとても親切。シンプルに `appendQueryString="true"`がついてるだけで勝手にクエリが追加された。


## 相対パスの問題

都合上、今回作っていたものは環境によって様々なURIに同じものを置く必要があった。そのためルーティングもそうなってた訳だが、ページ内の内部リンクは全て相対パスになっている。もちろんこのタグを全て置き換えるのは面倒なのだが、それ以前に置き換えてもおかしくなる。

### 結論から言えば置き換えない
このために便利な`<base>`タグがあるんじゃないだろうか。
全てのリンクより(script/cssのlink等含)これを指定してやれば全く今まで通り動く。`HTML5`で追加された新要素でもなく昔から存在するタグでもありブラウザ互換の心配もない。

### 但しそのパスを取得するのに注意が必要かも

```php
dirname($_SERVER["SCRIPT_NAME"])
```

を使ってやれば目的のpathは取れるのだが、`dirname()`はwindows上では`/`を`\`で返すと言う厄介な性質がある。

`str_replace`してやればこの差異は解決。

```php
$path = str_replace("\\", "/", dirname($_SERVER["SCRIPT_NAME"]));
```

あとはそれがドキュメントルートかどうかで分けてやる(これもdirnameのある意味厄介なところ)

```php
$base_path = $path == "/" ? "/" : $path ."/";
```

こうして出来上がった`$base_path`をヘッダの出来るだけ上(`meta charset`を最初に置いておいてその次、ってのがいいっぽい。)で呼び出してやる。

```php
<base href="<?=$path?>" />
```

## お疲れ様でした。
これでやっとこさ
変なパス指定
が出来ました！

### ところで...
`<base>`タグなんてちゃんと活用してる人いんの？
結構化石化してそう…
[これを使ってパスを分かりにくくする](http://www.broadband-xp.com/hidesource/base.html)なんていう記事もあったけど…(多分今時のブラウザにはインスペクタがついてるから完全に無駄。)

以上、役に立たないやったことまとめメモでした。読みにくくてごめんなさい！
MYSQL rails brewの環境下でライブラリがコケた場合の対処方法


■筆者環境
MacOSX 10.9.2
端末：MacBookPro
Homebrew 0.9.5
Ruby 2.1.0
Rails 3.1.0,4.0.3


```エラー内容
/Users/takashiisobe/work/hitokadochi/vendor/bundle/ruby/2.1.0/gems/activesupport-4.0.3/lib/active_support/dependencies.rb:229:in `require': dlopen(/Users/takashiisobe/work/hitokadochi/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-13/2.1.0-static/mysql2-0.3.15/mysql2/mysql2.bundle, 9): Library not loaded: libmysqlclient.18.dylib (LoadError)
Referenced from: /Users/takashiisobe/work/hitokadochi/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-13/2.1.0-static/mysql2-0.3.15/mysql2/mysql2.bundle
Reason: image not found - /Users/takashiisobe/work/hitokadochi/vendor/bundle/ruby/2.1.0/extensions/x86_64-darwin-13/2.1.0-static/mysql2-0.3.15/mysql2/mysql2.bundle
```

どうもライブラリが見当たらないという事なので、以下コマンドにて解決です。

```コマンド
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
```
Assert failed: ShaderID is greater than 2^10     を消す

みなさん！ cocos2d-x 3.0 使ってますか？

cocos2d-x 3.0 を実行したところ
ログに 

Assert failed: ShaderID is greater than 2^10

というのが大量に吐かれて、デバッグしにくい事ありませんか？
どうもこれは、不具合のようです

ので、駆逐しましょう

#cocosフレームワーク書き換えるよ

```cpp:frameworks/cocos2d-x/cocos/2d/renderer/CCQuadCommand.cpp
    //Generate Material ID
    //TODO fix shader ID generation
    CCASSERT(_shader->getProgram() < pow(2,10), "ShaderID is greater than 2^10");
    //TODO fix texture ID generation
    CCASSERT(_textureID < pow(2,18), "TextureID is greater than 2^18");
```

ここをコメントアウトするだけで

快適なcocos2d-xライフをおくる事が出来ます！

ご武運を！
cocos2dx-3.0 でLuaはじめました　プロジェクト作成編

#はじめに
会社でcocos2d-xを使ったプロジェクトがあります

偉いプロデューサーに対して
「cocos2d-xを使うならLuaかJavaScriptバインディング使わないならメリットがない！」
と偉そうな口を叩いてしまいました

私はC++ゲンガーなのですが、C++11で開発するなら自分でフレームワーク作れるし
C++11を新人に教えるのは大変なので
LuaとC++を併用すべきだと提案した以上 調査しなければなりません

・・・もちろん時間外に ね！


#環境構築
##[cocos2d-x-3.0rc0](http://www.cocos2d-x.org/download)
3/15日にアップデートされました。β2から たいしてかわってない
・・・・と思ったら プロジェクトの作成方法からなにから 全く変わっててビックリwww

##[cocoStudio-1.3.0.0](http://www.cocos2d-x.org/download)
まだWindows版しかないので、私はVMWareにWindows入れてます
6月か7月に Mac版が出るというロードマップを見た覚えがあります（不確か）

##Android環境
Android-SDK、Android-NDK、ANT
が必要です
ちな 私はNDKはr9 使ってます
多分今回からじゃないかな、ANTが必要になってます

##iOS環境
XCODE必要。わたしは5.0


#プロジェクト作成
インストール手順は省略します
今までは create_project.py を使ってたと思いますが
今回は cocosコマンドになってます！
readme.md を読んでくださいね！

##setup.py
Android環境のセットアップをするスクリプトなので実行しておきましょう
ANDROID_SDK、ANDROID_NDK、ANT_ROOT
のパスの設定をするだけです

##cocosコマンド
cocos2d-xのルートディレクトリにある README.md を読みましょう
ターミナルより cocosコマンドで設定します
設定内容は 以前のpythonスクリプトと似てます
今回は Luaなので -l に luaを指定で
$ cocos new アプリ名 -p パッケージ名 -l lua -d 作業ディレクトリ
これでプロジェクトが作成されます
ちな、今回はコマンドラインよりビルド＆実行 スクリプトが追加されてます
$ cocos run -j 4 -p android
$ cocos run -p ios

マダ使った事ないけど、jenkins等のスクリプトもついているので
色々と楽ができそうです


#ディレクトリ構成
PROJ_ROOT/frameworks/cocos2d-x
cocos2d-xフレームワークのソース＆プロジェクトファイル

PROJ_ROOT/frameworks/rutime-src
アプリのソース＆プロジェクトファイル
上記の cocos run コマンドでビルド＆実行出来ますが
従来通り、ここのプロジェクトファイルを開き IDEからビルドも出来ます

PROJ_ROOT/src
Luaソースを置きます。

PROJ_ROOT/res
リソースファイルを億場所

PROJ_ROOT/runtime
出力ファイル（apk、ipa）が置かれます


#実行！
![スクリーンショット 2014-03-17 01.31.37.png](https://qiita-image-store.s3.amazonaws.com/0/13916/e9bde5e3-6043-348a-d8f2-0f1dd017b36a.png)

お疲れさまでした！
次は cocoStudioを使って UIつくります。
環境変数で Vagrant の bridge を指定できるようにする

背景
===

1. Vagrant で開発中のプロダクトを同僚に見てもらいたい
1. 同僚は同じ LAN の中にいる
1. そうだ bridge 使おう

...という感じで Vagrant に public interface を追加したくなる場面がありますよね、ね :question: 

```rb
config.vm.network :public_network
```

でもそれだけだと `vagrant up` する度に interface を手動選択しなければいけなくなります。

```shell-session
Available bridged network interfaces:
1) en0: Wi-Fi (AirPort)
2) en4: Thunderbolt 1
3) p2p0
```

これは `bridge` の指定をすることで回避できるのですが……

```rb
config.vm.network :public_network, bridge: 'en0: Wi-Fi (AirPort)'
```

ブリッジに使いたい interface は、ホストによって違いますよね。 (MacBook Air は Airport が en0 だけど MacBook Pro は en1 とか……)

そこで、 **環境変数で指定** できるようにしてみました。

手順
===

- Vagrantfile に以下のコード片を足します

```rb
  if ENV['VAGRANT_BRIDGE']
    interfaces  = %x(VBoxManage list bridgedifs)
    re          = /Name: +(.*#{ENV['VAGRANT_BRIDGE']}.*)/

    if interfaces =~ re
      config.vm.network :public_network, bridge: $1
    end
  end
```

- 環境変数 `VAGRANT_BRIDGE` に使いたいインターフェースの名前(一部でも可)を指定して `vagrant up` します

```shell-session
$ VAGRANT_BRIDGE=Wi-Fi vagrant up
```

これで様々な環境で bridge することができるようになりました。

---

環境変数での指定がなければ public_network 自体を作らないので安心ですね :smiley: 

ちなみに
===

こんな風に書くと bridge に指定できるinterface 名を Vagrant を実行せずに得られます

```shell-session
$ VBoxManage list bridgedifs |grep '^Name:'
Name:            en0: Wi-Fi (AirPort)
Name:            en4: Thunderbolt 1
Name:            bridge0
Name:            p2p0
```
if文の中に書くfunction定義

PHPではif文のブロックの中で関数定義したときは特別な意味を持つ。

例えば、以下の例ではhello関数の定義が二カ所あるがエラーにはならない。

```php
<?php
$a = true;

if ($a) {
	function hello() { echo "hello\n"; }
}
else {
	function hello() { echo "HELLO\n"; }
}

hello();
```

実行結果

```
hello
```

http://ideone.com/JrxS0L

よく見ると、cfunctionなる記述もある。内部的にも特別に扱われているようだ。

http://jp2.php.net/manual/en/tokens.php

ただ、私はこの機能を実際に活用しているコードをまだ見たことがない。
わかりやすいブロックチェーン(blockchain)とは何か? の説明

以下に移行しました<br><a href="http://block-chain.jp/tech/what-is-blockchain/" title="わかりやすいブロックチェーン(blockchain)とは何か? の説明">わかりやすいブロックチェーン(blockchain)とは何か? の説明</a>
プロパティの型を強制するオブジェクトを作る

PHPで、強い型付けが欲しくなることがあったので作ってみた。

- [spindle/types](https://packagist.org/packages/spindle/types)
- [GitHub](https://github.com/spindle/spindle-types)

他にも型っぽいコードをパッケージに含めてある。
まだREADMEとか色々書きかけです。

使い方
----------

composerでインストールできる。

```bash
$ composer require spindle/types:*
```

`Spindle\\Types\\TypedObject` を継承してクラスを作る。
TypedObjectは２つのメソッドの実装を強制する。staticメソッドの`schema()` および `checkErrors()` である。

```php:typed.php
<?php
namespace Acme;

use Spindle\Types;

class Klass extends Types\TypedObject
{
  static function schema()
  {
    return [
      //プロパティ名 => 型, デフォルト値(省略可), を繰り返して書く
      'propInt' => self::INT,
      'propStr' => self::STR, 'initial value',
      'propBool' => self::BOOL, false,
      'propDate' => 'DateTime', new DateTime,
    ];
  }

  //単純な型チェックではとらえきれないバリデーションを行うときに使う。何かエラーを表すものの配列を返すイメージ。
  //例えば「他のプロパティの状態によってチェック条件が変わる」など
  function checkErrors()
  {
    $errors = [];
    if ($this->propInt < 0) {
      $errors['propInt'][] = 'propIntに負数が入っている';
    }
    return $errors;
  }
}

$klass = new Klass;
$klass->propInt = 1;
echo $klass->propInt;

$klass->propInt = '1'; //例外を発生させる
```

schema()は上記のような書き方でプロパティの定義を配列で返す。型がオブジェクトの状態に依存するはずがないから、staticを強制しておいた。


想定する用途
----------

リファクタリングのパターンに出てくる、「引数オブジェクトの導入」あたりを念頭に置いている。

```php:before.php
<?php

function doSomething1($firstname, $lastname, $age)
{
  //...
}

function doSomething2($firstname, $lastname, $age)
{
  //...
}
```

こういう「同じ形式の引数」があちこちに存在するコードはくさい。意図がわかりにくいし、関数によって引数の順序が統一されていないという気持ち悪い状態になりやすい。

そのためTypedObjectを作ってわかりやすくする。

```php:after.php
<?php
class User extends Spindle\Types\TypedObject
{
  static function schema()
  {
    return [
      'firstname' => self::STR,
      'lastname' => self::STR,
      'age' => self::INT,
    ];
  }

  function checkErrors()
  {
    return [];
  }
}

function doSomething1(User $user)
{
  $user->firstname;
  $user->lastname;
  $user->age;
  //...
}

function doSomething2(User $user)
{
  //...
}
```

別に素のクラスで作ってもよいが、getter/setterを型の保証のためだけに作るのは面倒くさいし、getter/setterのテストは書きたくない。カバレッジの実態もずれてしまう。

そこでTypedObjectを使えばお手軽に型だけ保証したクラスを作ることができる。ただし、__getや__setをfinalで奪ってしまうので、用途は限られるかもしれない。PHPであえて型の保証をしようとすると、クラスから能力を奪うことになる、というのは面白い。

あ、これだとカプセル化したことにならないので、ConstObjectなどでImmutable化することはできる。(JavaScript風？C言語のconst風？)

## もんやり

いろんな関数/メソッドに引き渡され、長時間生き残るデータは、カチッとしたクラスに押し込めておいた方が扱いを間違えない。

PHPにおいて安全性とかは動的型付けで保証されているので、別にこんな努力は不要なのだが、データに印を打ってプログラムの論理的整合性を保証するという型システムのメリットをちょっとだけでも使えれば、テストケースとテストケースの隙間を埋めることができそうに思って、いろいろジタバタしている。
Reverse ssh tunnel を安定運用する

追記(2022/02): 本記事の想定するユースケースでは, 長期稼働する場合 tailscale(wireguard)がよさそうです!
ただ, tailscale は sudo 権限いるようなので, sudo が使えない場合のとき(第三者のサーバやクライアント PC 使っているとか)は本記事の reverse ssh tunnel がいいかもしれません. (一応いろいろ設定すれば user 権限でもうごく. パフォーマンスも問題ないようである! https://tailscale.com/blog/throughput-improvements/)
 
Reverse ssh tunnel は便利な機能で, たとえばグローバル IP などで直接アクセスできない自宅 PC に外部からアクセスしたり, VPN をオフィス(仕事場環境)で使えない(が, ssh port は使える. or VPN を建てるほどの構成でない)とか, NAT 越えなどを, SSH のポートフォワーディング(の逆を使って)セキュアに接続できるという利点があります.

たとえば, 自宅の Raspberry Pi マシンへ, Reverse SSH tunneling を使い外部からアクセスするとかができます.

http://www.tunnelsup.com/raspberry-pi-phoning-home-using-a-reverse-remote-ssh-tunnel

利用には, 何かしらグローバル IP を持つサーバ(中継サーバ)が必要になります. 

```
+---------+ ssh -R  +------------------+   ssh fw  +-----------+
| home PC | ------> | global IP server | <-------- | Office PC |
+---------+         +------------------+           +-----------+
    /|                                                   | 
     +---------------------------------------------------+  ssh login(server 経由)
```

このような構成になります.

Google GCP ですと, 海外拠点にはなりますが, free でインスタンスを立てることができますので, とりあえず中継サーバとして使うのも手です. 最近は Docker + コンテナ用 OS などで, サービス(ssh)だけ動かし OS は自動アップデートさせるなどで, サーバーレスっぽいのができるようになってきて便利ですね.

GCE f1-micro インスタンスを介して reverse SSH 接続する
https://qiita.com/syoyo/items/e54c2fe8525c9f68a39c

(追記 2023/02: 最近だと free で使えるのは e2-micro になってました. https://nellab.net/archives/01036/ )

海外サーバだと, レイテンシはやはりどうしてもかかってしまいますので, うまくいくのを確認したら国内の GCP リージョンなり各社の VPS サービスなど使うのがよいでしょう.

reverse ssh tunneling を実際に 3 ヶ月くらい試してみたところ, 時々繋がらなくなる現象がありました. ssh のプロセスとしては動いているようなので, どうも keep alive あたりの問題のようです.

ClientAliveInterval(サーバ側で設定, reverse ssh でログインするリモート PC)と, ServerAliveInterval(クライアント側, reverse ssh を発行する PC)はどちらかを設定すればよいようですので, sshd_config に変更を与えない ServerAliveInterval を利用してみます.

リバース SSH tunneling を発行するマシンで, ~/.ssh/conig に以下の設定をしてみました.

```
Host remote.com
   ServerAliveInterval 60
```

60 秒の設定.

また, ときどき

```
debug1: remote port forwarding failure for listen port xxxxx
```

と出るので,

http://superuser.com/questions/352268/can-i-make-ssh-fail-when-a-port-forwarding-fails

を参考に ExitOnForwardFailure を設定し, フォワード接続に失敗したら終了する(あとのスクリプトで再起動させるため)ように設定してみます.

```
Host remote.com
   ServerAliveInterval 60
   ExitOnForwardFailure yes
   TCPKeepAlive no
```

TCPKeepAlive も no にしておきます.

さらに, reverse tunnel を行うスクリプトを cron 化して自動的に処理するようにします


```
# reverse_ssh_tunnel.sh
#!/bin/sh
COMMAND="ssh -N -f -R 2200:localhost:22 remote.com"
pgrep -f -x "$COMMAND" > /dev/null 2>&1 || $COMMAND
```

crontab -e で以下の行を追加します.

```
*/1 * * * * /bin/sh /home/username/reverse_ssh_tunnel.sh
```

これで, プロセスが動いていなかったら 1 分ごとに再起動されるようになります.

これにより, reverse SSH tunneling が安定して運用されます.
(まだ完全ではないが, 概ね数ヶ月は安定して動く様になりました) 

## TODO

* [ ] cron ではなくて autossh や systemd(Ubuntu, CentOS client の場合)で ssh 接続を自動化・永続化する.
  * CentOSでautosshをsystemd serviceとして動かす https://qiita.com/sandopan65/items/e21bdf710ac70f691e21
* [ ] バックアップとして VPN を使う(IPsec などの暗号強度の弱い VPN の利用はあまり推奨されないようなので, tailscale(wireguard)で暗号強度保ち, 最低限 ssh プロセスの再起動用の経路だけ確保にするのがよさそう) https://qiita.com/syoyo/items/f4ed1186b644dfdc8c0c
IntelliJ IDEA で PSR1/PSR2 のコード規約を適用する


## 前提条件

IntelliJ IDEA 12 Ultimate でかつ予め PHP のプラグインをインストールされていることを前提に話を進める。IntelliJ IDEA 13 以降でも同じ方法が適用できるかは分からない。

## 方法

*Preferences...* から *Code Style* -> *PHP* を開き、右側の *Set from...* の *Predefined Style* -> *PSR1/PSR2* を適用する。

スクリーンショットを見たほうが早いかと思う。

![PSR.png](https://qiita-image-store.s3.amazonaws.com/0/3984/6d0f22ce-eeaa-4097-ebca-c1382821684e.png "PSR.png")

あとは http://samuraism.com/products/jetbrains/intellij-idea/quickstart/codestyle-and-formatting を参照してコードをリフォーマットをしよう。
Python 2.7 日本語ドキュメントを Dash.app に追加する


基本的なやりかたはこちらを参考にしました。
[Dash.appにSphinxベースのドキュメントを追加する方法(日本語ドキュメントでもOKだよ) - プログラマ行進曲第二章](http://takuan-osho.hatenablog.com/entry/2013/02/20/how-to-add-sphinx-based-documentation-in-dash-app)


で、このサイトでもふれられているように単純に変換しただけでは Classes とか Modules をうまくインデックスできませんでした。

以下、Mac OS X 10.9.2 での手順です。

##手順1 doc2dash をインストール
pip が入ってないので easy_install でインストールしました。command line tools のインストールが必要です。依存パッケージ lxml のビルド中にエラーで止まる場合は、

`sudo ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future easy_install doc2dash`

とフラグを設定して実行すれば大丈夫でした。pip でもたぶん同じでしょう。
参考：[Error installing python module lxml on osx mavericks - Stack Overflow](http://stackoverflow.com/questions/20669068/error-installing-python-module-lxml-on-osx-mavericks)

##手順2 日本語ドキュメントを変換

[python-doc-ja - Pythonドキュメント日本語翻訳プロジェクト - Google Project Hosting](https://code.google.com/p/python-doc-ja/) から html 一式ダウンロードして doc2dash で変換。

`doc2dash -n Python2.7ja -i _static/py.png -I index.html -d pathto/output pathto/python-doc-2.7ja1-html`

試しにこれを Dash に食わせてみるとやっぱりインデックスができていない。

##手順3 英語ドキュメントを変換してインデックスを抜き出す

そこで同じバージョンの英語ドキュメントを変換して違いを見てみようということに。  
[Download — Python v2.7.6 documentation](http://docs.python.org/2.7/download.html) から html 一式ダウンロードして doc2dash で変換。日本語ドキュメントのときより時間がかかり、正常にインデックスができていました。docset の中を見てみると `docSet.dsidx` のサイズが明らかに違っていたのでこれを日本語 docset にコピー。すると Classes や Modules のリストが出てくるようになり、リンクも正常に機能しました。すべてのインデックスを検証してはいないので、どこかで整合性が取れていないかもしれません。

![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/970/9a6a3d84-64ed-3fa6-71d6-e7ec6a195acf.jpeg)

  
Dash 純正の docset から取り出す方法でも可能かもしれませんが、doc2dash とは違う方法で変換しているようでインデックスファイルの種類が異なっています。

Python 3 系でも同じようにできると思いますが、日本語ドキュメントを一括ダウンロードできる場所がなさそうなので試していません。

[Dash - Documentation Browser, Snippet Manager - Kapeli](http://kapeli.com/dash)
[doc2dash 1.2.0 : Python Package Index](https://pypi.python.org/pypi/doc2dash)

## 追記 2017-05-17: Python 3.6.1

英語版 docset の html を直接置き換えるという無理矢理な方法で 3.6.1 版を作りました。英語版の充実したインデックスをそのまま利用できます。html にアンカーを埋め込む必要があるのでちょっと複雑なスクリプトになっています。
https://gist.github.com/hetima/26f21023c417e68be1d4db2d1e388816
Dockerを動かしてみる on Amazon EC2（CentOS6.5）

#概要

![homepage-docker-logo.png](https://qiita-image-store.s3.amazonaws.com/0/22893/84b37d59-b208-c57c-cd68-34c42ab02d92.png)

2014/03/10に、Dockerの0.9がリリースされました。
http://blog.docker.io/2014/03/docker-0-9-introducing-execution-drivers-and-libcontainer/

LXCに依存しなくなるど、構成も変わったようなので、早速試してみます（といっても、そこまで意識する必要のあることはやっていないが）。
これまで、ローカルのVirtualBoxで試していたけど、せっかくなので、Amazon EC2上でやってみることにしました。

#EC2インスタンスの生成
* Dockerは、Ubuntsがメインのサポート対象になっていますが、今回はCentOSにしてみます。
* 「AWS Marketplace」から「CentOS 6 (x86_64) - with Updates」を選択して、インスタンスを生成。
* 最初に、現在のCentOSのバージョンを確認。

```
# cat /etc/redhat-release
CentOS release 6.4 (Final)
```

* CentOSだと、6.5以降にしておかないと、いろいろ面倒になりそうなので、ひとまずUpdate。

```
# yum -y update
・・・
# cat /etc/redhat-release
CentOS release 6.5 (Final)
``` 

* wgetがインストールされていないので、先に入れておく。

```
# yum -y install wget
```

#Dockerのインストール
* yumのリポジトリに、EPEL（RedHatの拡張パッケージ）を登録する。

```
# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -Uvh epel-release-6-8.noarch.rpm
```

* Dockerをインストールする。

```
# yum -y install docker-io
# chkconfig docker on
# docker -v
Docker version 0.8.1, build a1598d1/0.8.1
```

* ん？「Docker version 0.8.1」!? どうやら、現時点ではまだ0.9は公開されていないようですね。
* ということで、個別にダウンロードしてインストールする。

```
# wget http://dl.fedoraproject.org/pub/epel/testing/6/x86_64/docker-io-0.9.0-3.el6.x86_64.rpm
# rpm -Uvh docker-io-0.9.0-3.el6.x86_64.rpm
# docker -v
Docker version 0.9.0, build 2b3fdf2/0.9.0
```

* これで、Docker0.9.0のインストールが完了。

#Dockerで"Hello World"
* Dockerを起動する。

```
# service docker start
```

* Dockerが実行できることを確認する。コンソールに「Hello World」と表示されればOK。

```
# docker run centos /bin/echo "Hello World"
Hello World
```

#Dockerの実行ユーザを作成
* Dockerに限った話ではないですが、Dockerの操作を行うために、専用のユーザを作成しておく。

```
# useradd docker -g docker
# passwd docker
New password:
Retype new password:
```

* dockerグループに所属されたことを確認する。

```
# id docker
uid=500(docker) gid=498(docker) groups=498(docker)
```

* dockerユーザで、sudoを使えるようにする。

```
# visudo
```

* ```docker ALL=(ALL) ALL``` の部分を追加する。

```
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
docker  ALL=(ALL)       ALL
```

* これで、dockerユーザでsudoが実行できるようになったので、改めて、dockerユーザでDockerを実行する。

```
# su - docker
$ sudo service docker restart
$ docker run centos /bin/echo "Hello World"
Hello World
```

* とりあえず、動くことは確認できた。

#参考
* [Installation on Amazon EC2 - Docker Documentation](http://docs.docker.io/en/latest/installation/amazon/)
* [Amazon EC2でDocker - 河童＠漂流中](http://d.hatena.ne.jp/kappaseijin/20140104/1388816840)
MicroBoardのLED / インターフェースZERO No.4の写真5.3の間違い

CQ出版のインターフェースZERO No.4の記事のうち、5章の写真5.3がどうも間違っているようだ。

MicroBoardのUser LEDsはD2, D3, D9, D10の4つであるが、写真5.3においてはD1が光っているように表されている。

Avnet社の資料(xlx_s9_lx9_fpga_microboard-ug072711.pdf)には以下のような表が2.6.1 User LEDsにある。


| Net Name | Reference | FPGA Pin# |
|:-----------|------------:|:------------:|
| FPGA_GPIO_LED1 | D2 | P4 |
| FPGA_GPIO_LED2 | D3 | L6 |
| FPGA_GPIO_LED3 | D9 | F5 |
| FPGA_GPIO_LED4 | D10 | C2 |


インターフェースZERO No.4の5章の記事ではUCFファイル内のledの定義を
`NET led LOC = P4 | IOSTANDARD = LVCMOS18;`
としているので、D2の点滅が正しい動作となる。
gemパッケージのコマンドが実行できないかったけど解決した

忘れないようにメモをば。

luckypoolさんの[anyenvで開発環境を整える](http://qiita.com/luckypool/items/f1e756e9d3e9786ad9ea)を参考にMacにanyenvを導入し、globalなruby 2.1.1の環境を整えました。

んで、gemパッケージをインストールした後、そのパッケージのコマンドを実行！
でもプロンプトには"command not found"とつれないお言葉が。

あれー？パッケージどこー？と探すと、`~/.anyenv/envs/rbenv/versions/2.1.1/bin/`の下に入っておりました。

$PATHを見ると確かにその場所にはPATHが通っていない。
rbenvでなんか忘れたかなー？と思いつつ、rbenvコマンドのオプションを探していたら、shellオプションなるものが。
一時的に希望するバージョンの環境を作るらしい。

とりあえずこれを使おう。
`rbenv shell 2.1.1`を実行！
んで、gemパッケージのコマンドを実行！
おお、動きました。

なんで動くの？と調べてみるとgem installしたパッケージ内のコマンドが、PATHの通っている`.anyenv/envs/rbenv/shims/`の下にコピーされていました。

以後は、ターミナル再起動しても、新たなgemパッケージをインストールしても、”command not found”となることはありません。
必ず`.anyenv/envs/rbenv/shims/`の下にコピーされています。

なんでなんだろう？（そもそもrbenv環境がうまく構築できていなかったんだろうか？）
理由が判る方いましたら、どうか教えて下さい。
get_or_newのススメ


Webサービスでユーザーの状態をRDBを使って管理している事は多いので、レコードを取得時に無ければ作成といったコードを色んなプロジェクトで見かけます。

Djangoにもテーブルのレコードが有れば取得(SELECT)、無ければレコードの作成(INSERT)を行う get_or_create というメソッドが標準で用意されています。

例えば懸賞サイトでユーザーごとにポイント残高を表示したい場合、ユーザーのレコードが無い場合はデフォルト値である0ポイントになります。

無ければレコード作成という動きは、この0ポイントという情報を **わざわざ** テーブルに保存するという事ですが

**デフォルト値って保存する必要ありますか？**

その上、作成(INSERT)は **更新系の処理** です。
更新をするという事は排他制御や2重実行など色々な事を考慮する必要が有ります。INSERTによってロックも発生しますし。

とはいえ単なる get ではモデルのインスタンスが取得できず処理が書きにくいでしょう。

**そこで get_or_new です**

無ければインスタンスのみ作成してレコード作らない get_or_new を作りましょう。これなら副作用なくインスタンスを取得できます。

コードだとこういう感じになります

```python
# models.py
from django.db import models


class User(models.Model):
    point = models.IntegerField('獲得ポイント', default=0)
    
    @classmethod
    def get_or_new(cls, pk):
        try:
            return cls.objects.get(pk=pk)
        except cls.DoesNotExist:
            return cls(pk=pk)


# view.py
from django.views.generic import TemplateView
from .models import User


class IndexView(TemplateView):
    template_name = "index.html"
    def get(request, user_id):
        user = User.get_or_new(user_id)
        self.render_to_response({'user': user})


```


これなら必要なUserのインスタンスもとれて、もちろん user.point として 0 が返ってきます。他にもメリットがあって

* INSERTを行わないので当然ロックがない
* DBには最初のSELECTしか飛ばないので負荷も殆どない
* デフォルト値のレコードが作成されないのでデータ量が増えない

などなど。
注意点として、get_or_newから取得したデータを元に更新処理を行ってはいけません。2重実行した場合に間違ったデータが最終的に書き込まれます。

今回は参照の話なので、今度更新系の話も書こうと思います。
ExcelVBAによるIE自動操作サンプル

#概要
InternetExplorerをExcel-VBA経由で操作するサンプルを記述する。
Google検索を自動で行い、検索数を取得してみる。
Excel単体テスト仕様書との連携が待たれない。

#コード
参照設定:
  Microsoft HTML Object Library
  Microsoft Internet Controls

```bat:Module1.bat
Attribute VB_Name = "Module1"
Option Explicit
  
Private Const URL_TARGET As String = "http://google.co.jp/"
Private Const TIME_MINIMUMWAIT As Integer = 1
Private Const TIME_MAXWAIT As Integer = 3
 
Public Sub Main()
    Dim ie As InternetExplorer
    Dim doc As HTMLDocument
    
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = True
    
    IENavigate ie, URL_TARGET
    
    Set doc = ie.document
    With doc
        .getElementById("gbqfq").Value = "google"
        .getElementById("gbqfba").Click
    End With
    IEWaitReady ie
    
    Range("A1").Value = doc.getElementById("resultStats").innerText
    
    ie.Quit
    
    Set doc = Nothing
    Set ie = Nothing
End Sub
 
Public Sub IENavigate(ByRef ie As InternetExplorer, ByVal url As String)
    ie.navigate url
    IEWaitReady ie
    IEWaitFor
End Sub
 
Public Sub IEWaitReady(ByRef ie As InternetExplorer)
    Do While ie.Busy = True Or ie.readyState <> 4
        DoEvents
    Loop
    IEWaitFor
End Sub
 
Public Sub IEWaitFor(Optional ByVal second As Integer = -1)
    Dim endTime As Date
    
    If (second < 0) Then
        Do While second < TIME_MINIMUMWAIT
            second = Int(Rnd * TIME_MAXWAIT)
        Loop
    End If
 
    endTime = DateAdd("s", second, Now)
    While Now < endTime
       DoEvents
    Wend
End Sub
```
VBScriptによるInternetExplorerクローラー化サンプル

#概要
InternetExplorerをVBScript経由でクローラー化するサンプルを記述する。
Google検索を自動で行い、HTMLを取得する。
職場でも安心バッチ実行できるね。

#コード

```bat:IE.bat
CScript IE.vbs > LOG.txt
```

```vbs:IE.vbs
Option Explicit
 
Private Const URL_TARGET = "http://google.co.jp/"
Private Const TIME_MINIMUMWAIT = 1500
Private Const TIME_MAXWAIT = 3000
 
Main
 
Public Sub Main()
    Dim ie
    Dim doc
    
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = True
    
    IENavigate ie, URL_TARGET
    
    Set doc = ie.document
    With doc
        .getElementById("gbqfq").Value = "google"
        .getElementById("gbqfba").Click
    End With
    IEWaitReady ie
    
    WScript.echo doc.Body.InnerHtml
    
    ie.Quit
    
    Set doc = Nothing
    Set ie = Nothing
End Sub
 
Public Sub IENavigate(ByRef ie, ByVal url)
    ie.navigate url
    IEWaitReady ie
    IEWaitRandom
End Sub
 
Public Sub IEWaitReady(ByRef ie)
    Do While ie.Busy = True Or ie.readyState <> 4
        WScript.Sleep 100
    Loop
    IEWaitRandom
End Sub
 
Public Sub IEWaitRandom()
    Dim milliseconds
    milliseconds = -1
    Do While milliseconds < TIME_MINIMUMWAIT
        milliseconds = Int(Rnd * TIME_MAXWAIT)
    Loop
    WScript.Sleep milliseconds
End Sub
```
Windows 7 で Apple Wireless Keyboard の「英数」「かな」キーが反応しない時

# 問題の概要
Macの Boot Camp 機能を使うときなど、 Apple Wireless Keyboard を Windows 7 で使用したい時があります。その際「英数」「かな」キーが反応しない場合があります。

# 原因
Windows 7 がキーボードを101キーボードとして認識しているためです。

# 対処法
KB2644616に従い、 Microsoft Fix it 50311 を実行することで Windows 7 が106キーボードとして認識するようになり、「英数」「かな」キーを使用できるようになります。

# 参考
http://support.microsoft.com/kb/2644616/ja
配列をインデックス付きで逆順にeachする

ただ単に逆順にしたいなら`Array#reverse`を使えばいいが、それに`with_index`を使うと昇順になってしまう。なので、`each_with_index`に、`reverse_each`を使う。

```rb
%w(one two three).each_with_index.reverse_each do |v, i|
    puts "#{v} : #{i}"
end
```

```
three : 2
two : 1
one : 0
```
Vim で tags ファイル生成を補助するプラグインを作ってみた

[Vim Advent Calendar 2013](http://atnd.org/events/45072)の106日目(2014-03-16)の記事です。

tags ファイルを全然使っていなかったので、使い始めようと一念発起。

[vim-tags](https://github.com/szw/vim-tags) は一応入れていたけれど、なんだかよくわからないファイルが作成される。
Vim プラグインのルートディレクトリで :TagsGenerate すると .gittags というファイルが作成されていた。
Windows に対応していないからみたいで、.git/tags にファイルを保存しようとして、こんなことになっている様子。

もっとシンプルに使えるものがほしいとも思って、初のプラグイン作成。
いろいろと足りなかったりおかしかったりするだろうけれど、ひとまず動いているので公開してみる。
[vim-tagsgen](https://github.com/hokorobi/vim-tagsgen)

vimrc に NeoBundle 'hokorobi/vim-tagsgen' と書いて :Tagsgen を実行すると、tags ファイルどこに作るのよと聞いてくるので指定。そこをカレントディレクトリに変更して tags ファイル生成コマンドを実行。tags ファイルが生成されるはず。

tags ファイル生成コマンドのデフォルトは ctags。個別に指定したい場合は filetype の key にコマンドを指定。
```vim
let g:tagsgen_tags_command = {
      \ '_': 'ctags',
      \ 'go': 'gotags'
      \ }
```

tags ファイル生成コマンドのオプションも同じように filetype の key に指定。
```vim
let g:tagsgen_config = {
      \ '_' : '-R',
      \ 'vim': '-R --languages=Vim',
      \ 'python': '-R --languages=Python',
      \ 'go': '{CURFILES} > tags'
      \ }
```

絶賛開発中なので、オプションの使い方も名前も変わると思うので悪しからず orz
ツッコミ大歓迎。でもお手柔らかに(:-)
rubyでevernoteにノートを送る


rubyから任意のデータをevernoteに送信します。
定期的なレポートなどのために調べたので、高度な処理は考えていません。  
そのため、データの送信はEvernote APIではなく、
gmailからevernoteのメールアドレスに送信することにします。

##コード
tlsmailとmailを使っていますので、インストールしておいてください。
メールの添付ファイルを使うことで、evernoteに画像を入れることにも成功しています。


```ruby:evernote_send.rb
require 'yaml'

# これをやらないと警告が沢山出る
# http://stackoverflow.com/questions/8783400/warning-already-initialized-constant-after-installing-tlsmail-gem
require 'net/smtp'
Net.instance_eval {remove_const :SMTPSession} if defined?(Net::SMTPSession)

require 'net/pop'
Net::POP.instance_eval {remove_const :Revision} if defined?(Net::POP::Revision)
Net.instance_eval {remove_const :POP} if defined?(Net::POP)
Net.instance_eval {remove_const :POPSession} if defined?(Net::POPSession)
Net.instance_eval {remove_const :POP3Session} if defined?(Net::POP3Session)
Net.instance_eval {remove_const :APOPSession} if defined?(Net::APOPSession)

require 'tlsmail'
require 'mail'

class SendEvernote
  def initialize(evernote_mail, gmail_account, gmail_pass)
    @smtpserver = Net::SMTP.new('smtp.gmail.com',587)
    @smtpserver.enable_tls(OpenSSL::SSL::VERIFY_NONE)

    @evernote_mail = evernote_mail

    @gmail_account = gmail_account
    @gmail_pass = gmail_pass

    # まとめて送るのでそれ用のバッファ
    @buffer = []
  end

  def addNote(subject, body, files)
    mail = Mail.new

    mail[:from] = @gmail_account
    mail[:to] = @evernote_mail
    mail.subject = subject
    mail.body = body
    files.each do |path|
      mail.add_file(path)
    end

    @buffer << mail
  end

  def send
    @smtpserver.start('gmail.com',@gmail_account, @gmail_pass, :login) do |smtp|
      @buffer.each do |mail|
        smtp.send_message(mail.encoded, mail.from, mail.to)
      end
      @buffer.clear
    end
  end
end

config = YAML.load_file("evernote.yml")
send_evernote = SendEvernote.new(config["evernote_mail"], config["gmail_account"], config["gmail_pass"])

send_evernote.addNote("test", "this is test", ["logo-new.png", "logo.png"])
send_evernote.send

```

##結果
![スクリーンショット 2014-03-16 17.40.24.png](https://qiita-image-store.s3.amazonaws.com/0/273/a253b729-31ac-7530-3bc0-b5792af8e193.png "スクリーンショット 2014-03-16 17.40.24.png")