OmniAICreator/Qiita-1.07M huggingface dataset:
[Android]画像をPOST通信で送信する


## 参考
[androidアプリで画像をサーバーに送る](http://ameblo.jp/guchi-ichi-man/entry-11793880342.html)

## 環境
Android4.0以上
mavenなし、eclipse Juno

## 用意するもの
以下のライブラリ(バージョンは2014/07/25現在のもの)
[apahce-mime4j-core-0.7.2.jar](http://james.apache.org/download.cgi#Apache_Mime4J)
[httpcore-4.3.2.jar](http://hc.apache.org/downloads.cgi)
[httpmine-4.3.4.jar](http://hc.apache.org/downloads.cgi)
下2つはhttpcomponents-clientを落としてくれば、2つとも入ってます。

この3つのライブラリファイルをlibsフォルダに置くだけ。
ちなみに、mavenでもpomに記述すればOKなはずです。

## 送る画像の準備
ImageViewにセットしたかったので、Bitmap形式だったのをバイナリに変換してます。

```xxxFragment.java
			// Bitmap形式をバイナリに変換
    		ByteArrayOutputStream baos = new ByteArrayOutputStream();
    		bitmap.compress(CompressFormat.PNG, 100, baos);
    		mImageData = baos.toByteArray();
			// AsyncTaskManagerに通信させる
			getLoaderManager().initLoader(0, null, updateAvaterHttpLoaderCallbacks);

```

## 本題

処理としては、いつものDefaultHttpClientのPOSTを使いますが、StringEntitiyではなく、MultipartEntityBuilder.create()を使うところがポイント。
ググった結果MultipartEntity使うやり方が大半だったんですが、参考元のサイトにある通り、4.3以上からはDeprecatedになってしまってます。
(いざやってみようと思ったら、Deprecatedで泣きそうになって参考元に辿り着いた笑)
引数がたくさんあるけど、それさえ乗り越えれば他のPOSTと代わりは特に無いですね。

送り先のサーバがRailsだったので、auth_tokenも一緒に送ってますが、ここは任意で変えれます。増やせます。Content-Typeもjsonになってますが、plainでもなんでもOKです。

```java
	/** 
	 * 画像用POSTリクエスト
	 * @param url リクエスト先
	 * @param image 送信する画像(バイト配列)
	 * @param params 一緒に送るパラメータ
	 * @return
	 */

	public String postMultipart(String url, byte[] image, String params) {
		HttpClient client = new DefaultHttpClient();
		String str = "";

		MultipartEntityBuilder entity = MultipartEntityBuilder.create();
		entity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
		entity.setCharset(Charset.forName("UTF-8"));
		try {
			// 画像をセット
			// 第一引数：パラメータ名
			// 第二引数：画像データ
			// 第三引数：画像のタイプ。jpegかpngかは自由
			// 第四引数：画像ファイル名。ホントはContentProvider経由とかで取って来るべきなんだろうけど、今回は見えない部分なのでパス
			entity.addBinaryBody("avater", image, ContentType.create("image/png"), "hoge.png");
			url = "http://example.com/image.json";

			// 画像以外のデータを送る場合はaddTextBodyを使う
			ContentType textContentType = ContentType.create("application/json","UTF-8");
			entity.addTextBody("auth_token", params, textContentType);
			
			HttpPost post = new HttpPost(url);
			post.setEntity(entity.build());

			HttpResponse httpResponse = client.execute(post);
			str = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
			Log.i("HTTP status Line", httpResponse.getStatusLine().toString());
			Log.i("HTTP response", new String(str));
		} catch (ClientProtocolException e) {
			throw new RuntimeException(e);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		return str;
	}

```

## 感想
最初は自力でHttpConnection使ってやろうと思ったけど、画像ファイルのメタデータ追加とかも必要で、頭がこんがらがったのでおとなしく乗り換えることにしました。
ライブラリ様様ですね。アプリの容量がちょっとこわいけど。。
備忘録Markdown記法

# 文法

* 公式文法
    * http://daringfireball.net/projects/markdown/syntax.php
* 記述例
    * http://kojika17.com/2013/01/starting-markdown.html
* Quiitaでの特殊な記述方法
    * http://qiita.com/Qiita/items/c686397e4a0f4f11683d


# Emacs で markdown-mode

* [公式](http://jblevins.org/projects/markdown-mode/)
* [パッケージ管理でインストールする方法、キーバインド集](http://yanqirenshi.hatenablog.com/entry/2015/01/17/Markdown-mode%E5%85%A5%E9%96%80_%28%E3%81%AF%E3%81%98%E3%81%BE%E3%82%8A%E3%81%A8%E3%81%AF%29)

## インデントの為の空白が消されて、行頭に揃えられてしまうのを防ぐ

[emacs 24.4のmarkdown-modeでリストのインデントが行頭に揃えられてしまう(解決)](http://www.nofuture.tv/diary/20141114.html)
より、設定ファイルに以下を追記。

```
; リストのインデントが行頭に揃えられてしまうのを防ぐ
(add-hook 'markdown-mode-hook
          '(lambda ()
            (electric-indent-local-mode -1)))
```

## Cygwin で M- を使えるようにする

最近の Cygwin は、端末ウィンドウに mintty を用いている。
mintty 自体に Alt キーを用いたショートカットが標準設定されているので、
まずこれを無効にする。

1. mintty のウィンドウ上で右クリックし option をクリック
2. 左部で keys をクリックし Shortcuts の中の Menu and Full Screen のチェックを外す
3. emacs の設定ファイルに、下記を追記する。

```
;AltキーをMetaキーとして用いる
(setq w32-alt-is-meta nil)
```


# Winodws の専用エディタ

* MarkdownPad
    * http://markdownpad.com/
* MarkDown#Editor
    * http://hibara.org/software/markdownsharpeditor/


# Markdown 記法が使える iPhone アプリ

* アプリ比較
    * http://akiueo.hatenablog.com/entry/markdown-iphone
* Byword
    * http://www.appbank.net/2012/03/24/iphone-application/388182.php


# Googleドキュメントで使う

* [スクリプトを使ってGoogleドキュメントをMarkdownフォーマットに変換してみよう](http://www.lifehacker.jp/2013/06/130612markdown_docs.html)
備忘録バッチファイル

# etc

* [【bat】Windowsのバッチファイル(*.bat)の書き方自分用まとめ](http://qiita.com/sksmnagisa/items/8c4c1788af44cc1dc63a)


# コメントの書き方

* REM
* ラベルをコメントの代わりに使う
    * [キミは、バッチファイル(*.bat)でREM以外でコメントアウトする方法を知ってるか？](http://orangeclover.hatenablog.com/entry/20101029/1288364190)

# 現在いるディレクトリの絶対パスを取得

``%cd%`` と書く。
使用例↓

    csvmake4 c:\mydoc\test.xls %cd%\xlstemp

http://d.hatena.ne.jp/iad_otomamay/20080221/p1


# for

* [第７回　forコマンド（その１） (1/3)](http://www.atmarkit.co.jp/ait/articles/0104/27/news002.html)

## forループ内でカウンタを用いる

通常の環境変数ではカウントアップ/カウントダウンができない。
そこで遅延環境変数を用いる。

    setlocal ENABLEDELAYEDEXPANSION
    
    set /a num=0
    
    for %%i in (*.txt) do (
        set /a num=num+1
        echo count：!num!
    )

setlocal ENABLEDELAYEDEXPANSION で宣言しておく必要がある。
遅延環境変数は %num% ではなく !num! と囲む。

http://d.hatena.ne.jp/inspfightman/20080705/1215253544
http://ameblo.jp/phyco/entry-11595146120.html
3分でできる、よく使うaliasをbashに設定しよう

#alias
皆さんもやっているようにコマンドを省略して使うことができるので大変便利です
後輩がaliasを設定したいと言っていたのでちょうど今私の設定状況をついでに紹介したいと思いました。


#設定など

```.bash_profile
# read
. ~/.bashrc

~~
```

```.bashrc
#確認
alias ll='ls -l'
alias la='ls -a'

#削除
alias rm='rm -i'

#容量
alias df='df -h'

#環境
alias e='env'
```

このような形で「.bash_profile」から「.bashrc」を読み込んで使うようにします。
「.bash_profile」にはlibのパスやらexeのパスなどを設定しているのでaliasとは分けたいはずです。

私が一般的に使うのはこちらのaliasです。他にもsshなどのaliasもありますが、あまり役に立ちませんので書きません。
上から確認しますと

* ll
ファイルの詳細情報まで出力するように

* la
ファイルの.付きのものまで出力するように

* rm
削除する時に確認したいので

* df
容量を知りたいが、MB単位でほしい

* e
よく見るので環境変数をeでとりたい

大したものではないですが、最低限これぐらいはほしいなって思っています。
Web API 経由でメール送信

この記事の最新版は <https://wiki.suikawiki.org/n/Web%20API%E7%B5%8C%E7%94%B1%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E4%BF%A1> にあります。

メールの大量送信は専門のサービスがあったりしますが、システム内部などの狭い範囲で少量のメールを送信したいだけのときには Gmail の API が便利そうです。もちろん無料で使えます。

* https://developers.google.com/gmail/api/
* https://developers.google.com/gmail/api/guides/sending
* https://developers.google.com/gmail/api/v1/reference/users/messages/send

電子メール (RFC 5322) のデータを HTTP で1回 POST するだけで送信できます。

```perl
  $mail = qq{From: <me@example.net>\x0D\x0ATo: <hoge@example.net>\x0D\x0ASubject: Test\x0D\x0A\x0D\x0AHello, world!};
  http_post
      url => q<https://www.googleapis.com/gmail/v1/users/me/messages/send?key=> . $ClientID,
      header_fields => {
          'Content-Type' => 'application/json',
          'Authorization' => 'Bearer ' . $AccessToken,
      },
      content => perl2json_bytes {raw => encode_base64url $mail};
```

なお、 scope として `https://mail.google.com/` を指定した OAuth2 のアクセストークンが必要です。アクセストークンの有効期間は短いので、[リフレッシュトークン](https://developers.google.com/accounts/docs/OAuth2InstalledApp#refresh)を保持しておく必要があるかもしれません。
Linux: インターフェイスからIPアドレスのみを抜き出したい


```console
$ ip route | grep eth1 | cut -f 12 -d " " | tr -d "\n"
192.168.0.7
```

iproute2の `ip route` のほうが `ip addr show` よりテキスト処理しやすい。


```console
$ ip route
default via 172.16.192.2 dev eth0
172.16.192.0/24 dev eth0  proto kernel  scope link  src 172.16.192.144
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.42.1
192.168.0.0/24 dev eth1  proto kernel  scope link  src 192.168.0.7
```

```console
$ ip addr show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:0c:5e:77 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.7/24 brd 192.168.0.255 scope global eth1
       valid_lft forever preferred_lft forever
```


## バージョン情報

* Ubuntu: 14.04 LTS
* iproute2: iproute2-ss131122
MacBook で外付けキーボード (Realforce) を心地よく使えるようにする

Windows マシンで利用していた Realforce を引き続き MacBook でも利用できるようにしようと試行錯誤したときのメモです。

# はじめに

MacBook で外付けキーボードを利用しようとすると、Caps キーと左 Control キーの位置だったり「英数」「かな」キーによる IME の ON/OFF 切り替えあたりが標準のキーボードと事情が異なるため、そのままの状態で利用すると相当のフラストレーションが溜まることになるかと思います。

この状態を解消するために必要な作業を、以下にまとめています。


# 必要となるソフトウェア

- [Seil](https://pqrs.org/osx/karabiner/seil.html.ja)


# 設定内容

1. Seil を Launchpad などから立ち上げます
2. "Setting" タブを表示し、以下の 3 つの項目をチエックをオンにします
    - "Caps Lock" → "Change Caps Lock"
        - チェックをオンにするのに合わせて、キーコードを ``59`` にします
    - "For Japanese" → "Enable NFER Key on PC keyboard"
    - "For Japanese" → "Enable XFER Key on PC keyboard"

![173ed76a0156a9bff29aeb1991dd24c4.png](https://qiita-image-store.s3.amazonaws.com/0/11734/04f3a139-cf9d-4c59-038e-5ec955bffbef.png)

以上です。
CakePHP2 ページネータのバグ？調整

#リストに表示されない予約番号があります！
と連絡を受けましたが正直「見落としじゃないのか？」と疑っていました。

#受注日で並び替えすると正しくない結果が。。。
SQLを見ると単純に受注日で並び替えているので問題ないと思っていましたが
受注日が複数ページにまたがると重複表示されたり表示されない予約がありました。

#主キーで並び替えないとダメ
考えてみたら当たり前ですね。
受注日順、予約番号（主キー）順になっていなければ予約番号はコントロールできていません。

#コアコンポーネントなのでさわりたくないですが。。。
PaginatorComponent.phpをローカルのコンポーネントフォルダにコピーして変更を行ないました。

問題の箇所はvalidateSort()内の\$options['sort']が設定された場合のみなので
該当IF文の最後に\$options['sort']が主キーと違う場合は
主キーを並び替えに加える様にしています。

※修正時CakePHPのバージョンは 2.5.2 です。

```lang:PHP
if (isset($options['sort'])) {
	$direction = null;
	if (isset($options['direction'])) {
		$direction = strtolower($options['direction']);
	}
	if (!in_array($direction, array('asc', 'desc'))) {
		$direction = 'asc';
	}
	$options['order'] = array($options['sort'] => $direction);
	//以下のif文を追加
	if ( $options['sort']<>"$object->name.$object->primaryKey" && $options['sort']<> $object->primaryKey ){
		$options['order'] = array_merge( $options['order'] , array( "$object->name.$object->primaryKey"=>'ASC' ));
	}
}
```
ハイフンで始まるファイルの削除方法

#はじめに
コマンドラインでいろいろ弄っていたら、ハイフンで始まるファイルができてしまった。
-c というファイルを消そうとしても、そんなオプションはないと怒られ、消せない。

```
$ rm -c
rm: invalid option -- 'c'
Try `rm --help' for more information.
```

#man コマンド を見る
> To remove a file whose name starts with a \`-', for example `-foo', use one of these commands:
> rm -- -foo
> rm ./-foo

どうやら、2通りあるようだ。
冷静に考えたら、./ をつけたら良いって思いつくな･･･

# ハイフンで始まるファイルの削除

```
$ rm -- -c
```

# 終わりに
最初びっくりしたけど、消せて良かった。
めでたしめでたし
TreeViewItemで`ItemContainerGenerator.ContainerFromItem`が取得できない場合


## ユースケース
XAMLのコンストラクタレベルで、TreeViewにアクセスしてExpandやSelectをしたい場合。

## 問題
`TreeView.ItemContainerGenerator.ContainerFromItem`でContainerから情報を解決しようとしても、常に`null`が返ってきてしまい、処理できない。

## 対応策

`BeginInvoke`を使って処理を後ろに回せばいいようです。

```C#
TreeViewItem.Dispatcher.BeginInvoke(() =>
{
	TreeViewItem item = TreeView.ItemContainerGenerator.ContainerFromItem(TreeView.Items[0]) as TreeViewItem;
	// TreeViewの操作...
});
```

## おまけ

そういえば、Flexでも同じような事を苦肉の策でしたような。

## 参考

* [How to expand items in a TreeView – Part III](
http://www.zagstudio.com/blog/493#.U9H1_4B_u8x)
Rails consoleでリロードする

Railsでなんか作ってて、動作確認のために

```
rails console
```

ってやって動作確認すると思うんだけど、そのconsoleで

```rb
reload!
```

ってやればリロードできるんですね。知らなかった。

今までコードを更新する度にいちいちCtrl + Dでコンソール終了してまた立ち上げてました。
Omake＋Windowsフォト ビューアー＝快適PlantUML編集環境

UML書いてますか。
UMLを書くツールはいろいろあれど、PlantUMLはWindows系開発者にもUNIX系開発者にも等しくおすすめです。

PlantUML
========
PlantUMLは、UMLの各種構造を書き下ろしたテキストファイルをコンパイルして画像に変換してくれるソフトウェアです。何が素晴らしいって、各オブジェクトの配置を自動で調整してくれるところが最高。

図形ソフトとかAstahとかでクラス図を描き始めて、途中からクラス構造よりも図形の配置にばっかり悩んでいたなんて経験はありませんか。これがすべてコンピュータに任せられるのです（チューニングの手間はちょっとありますがね）。

配置に悩むのはコンピュータの仕事、我々が悩むのは論理構造、最高の分業じゃないですか。ですからPlantUML使いましょう。

PlantUMLのインストール
----------------------
PlantUML自体は単独のjarファイルです。なので好きな場所においてコマンド呼び出しするだけ。あ、Javaランタイムが必要。

バックグラウンドでGraphVizという画像生成ソフトを呼び出すのでインストールしておく必要があるのですが、インストーラ任せで入れておけばPlantUMLが自力で探し出して使ってくれます。

あとは

```
java -jar 【フルパスで】\plantuml.jar 【ソースファイル】
```

でPNG画像が、

```
java -jar 【フルパスで】\plantuml.jar 【ソースファイル】 -svg
```

でSVGアートワークが吐き出されます。
日本語を使う場合のポイントですが、WindowsならシフトJISで書くのがいまのところ一番面倒もトラブルも少ないですね。

Windowsフォト ビューアー
========================
Windowsに標準で付いている画像ビューア、これにはPlantUML開発作業に必要なたった一つの大事な機能を持っています。それは、 **ファイルが更新されたらリロード** してくれること。最高です。コンパイル結果は実行と同時に確認できるのです。素晴らしい。

ソースファイル保存と同時にコンパイル
====================================
そして最後のピースが、ファイル監視コンパイルです。これで、エディタでctrl + sを押すと同時にプレビューが更新されるという最高の編集環境が完成します。

使うのはOMake。makeを拡張したソフトウェアでありmakefileとほぼ同じルールでコンパイル手順が書けるのですが、目玉機能が変更監視です。使い方は簡単。

1. UMLソースを置くディレクトリで `omake -install`
2. 生成された omakefile を次のように書き換えます。 <div class='highlight'><pre>%.png: %.puml<br/>    java -jar 【フルパスで】\plantuml.jar $<<br/>%.svg: %.puml<br/>    java -jar 【フルパスで】\plantuml.jar $< -svg<br/><br/>pumlfiles=$(glob *.puml)<br/>pngfiles=$(pumlfiles:.puml=.png)<br/>svgfiles=$(pumlfiles:.puml=.svg)<br/><br/>.PHONY: all<br/>all: $(pngfiles) $(svgfiles)<br/>.DEFAULT: all</pre></div>ただし、ソースファイルの拡張子を.pumlとした場合です。決まった拡張子があるわけではないのでお好みで。
3. `omake -P`

これでOMakeが監視状態に入り、その時点で存在したソースファイルについて監視し続けてくれます。新しいファイルを追加した場合には一旦ctrl + cで終了させて再度起動してください。
Rails の data-confirm の確認ダイアログが 2 回出てしまう

Rails（3 でも 4 でも）で data-confirm で「実行してもよろしいですか？」みたいな確認ダイアログを出すやつ。

```erb
<%= submit_tag 'Submit', :data => {:confirm => 'Are you sure?'}%>
```

これが何だか分からないけど、二回出ちゃうみたいな状態になっていたら

```ruby
config.assets.debug = true
```

を false にすると起きなくなります・・が、それでいいのだろうか。
MongoDBでドキュメントのキー一覧を取得する&mongoexportでcsv形式で出力する



mongoexportでcsv形式の出力をするときには，-fまたは-fieldFileでどのキーを出力するかを選択する必要があるのだが，キーの数が多くなってくると指定が面倒になる．そこで，以下のようにしてコマンドからすべてのキーのリストを生成して，そのファイルから出力するキーを指定することにする．なお，ここではtestというデータベースのpostというコレクションを対象にしている．

### ドキュメントのキー一覧を取得する

```
$ mongo test --quiet --eval "for (key in db.post.findOne()) print(key)" > fields.txt
```

これでfields.txtにすべてのキーのリストが出力される．ただし"_id"も含まれるので注意．

### キー一覧の取得後のcsv出力

```
$ mongoexport --db test --collection post --csv -fieldFile fields.txt --out db.post.csv
```

これですべてのキーを対象にdbデータベースのpostコレクションの内容をcsvとして出力することができる．

### 注意

今回のコマンドではfindOneで最初のドキュメントを取ってきてキーを取得しているので，すべてのドキュメントが同じjsonの構造をしていないと意味が無いので注意．


### 参考

- http://stackoverflow.com/questions/2298870/mongodb-get-names-of-all-keys-in-collection
Ubuntu + RSpec + CapybaraでJavascriptを動かす

#capybara-webkitをインストール

##依存パッケージのインストール

```bash
sudo apt-get install libqt4-dev
sudo apt-get install xvfb
```

##Gemfile

```rb
gem 'headless'
gem 'capybara-webkit'
```

##support/capybara.rb

```rb
Capybara.javascript_driver = :webkit
```

##support/headless.rb

```rb
Headless.new.start
```

##Javascriptを有効にする

```rb
describe 'some test', js: true do
  # do your test here
end
```
UILabel  backgroundColorに対してはアニメーションできない...?

labelの型をUIButtonに変更すると以下のアニメーションは動作するけど、UILabelでは動作しない。
label.layerに対してbackgroundColorを設定しても変化しない。なぜだろう...
（同様にlabel.frameも動作しない）

```objc
-(void)animateLabel:(UIColor*)color {
    [UIView animateWithDuration:1 delay:0 
    options: UIViewAnimationOptionAutoreverse | UIViewAnimationOptionRepeat 
    animations:^{
        [self.label setBackgroundColor:color];
    }completion:nil];
}
```
---

StackOverflowにも同様の質問がでており、「ドキュメントには書いてないけど、UILabelのbackgounrColorはアニメーションしないよ」的な記述がありました。

[参考　How to animate the background color of a UILabel?]
(http://stackoverflow.com/questions/3762561/how-to-animate-the-background-color-of-a-uilabel)
Atom の apm stars で興味のあるパッケージを管理する


## TL;DR
apm で atom.io のスターを管理することが出来る。
`apm stars --install` が便利。


## star とは何か
atom.io 上にあるスターを管理することが出来る。
自分がスターをつけているパッケージについては https://atom.io/users/user_name/stars で確認することが出来る。

## 使い方

初回にコマンドを実行した時 API Token での認証が行われていない場合は以下のメッセージが出力される。

```shell
% apm star <package_name>
Welcome to Atom!

Before you can publish packages, you'll need an API token.

Visit your account page on Atom.io https://atom.io/account,
copy the token and paste it below when prompted.

Press [Enter] to open your account page on Atom.io.
Token> xxxxxxxxx
⭐ Starring <package_name>
```

メッセージにあるように https://atom.io/account にアクセスすると API token を確認することができるので、それをコピーしプロンプトへ入力する。

### star
指定したパッケージにスターをつけることが出来る。

```
% apm help star

Usage: apm star <package_name>...

Star the given packages on https://atom.io

Run `apm stars` to see all your starred packages.

Options:
  --help, -h   Print this usage message
  --installed  Star all packages in ~/.atom/packages  [boolean]
```

#### --installed
インストールしているパッケージ全てにスターを付けることが出来る。
![Screen Shot 2014-07-25 at 15.02.19.png](https://qiita-image-store.s3.amazonaws.com/0/6606/18a6b841-1067-282f-3ed2-71678369fe37.png)


### unstar
指定した <package_name> のスターを外すことが出来る。

```
% apm help unstar

Usage: apm unstar <package_name>...

Unstar the given packages on https://atom.io

Run `apm stars` to see all your starred packages.

Options:
  --help, -h  Print this usage message
```

### stars

スターしたパッケージの一覧の表示。

```
% apm help stars

Usage: apm stars
       apm stars --install
       apm stars --user thedaniel
       apm stars --themes

List or install starred Atom packages and themes.

Options:
  --help, -h     Print this usage message
  --install, -i  Install the starred packages                  [boolean]
  --themes, -t   Only list themes                              [boolean]
  --user, -u     GitHub username to show starred packages for  [string]
  --json         Output packages as a JSON array               [boolean]
```

#### --themes
スターしたパッケージのテーマの一覧を表示する。

```shell
% apm stars --themes
Themes starred by you (1)
└── ⭐  railscast-theme Atom syntax theme based on Ryan Bates (@rbates) RailsCasts TextMate theme (1404 downloads)

Use `apm install` to install them or visit http://atom.io/packages to read more about them.
```

#### --json
スターしたパッケージ一覧をJSONで出力する。

#### --install
スターしたパッケージの一括ダウンロードをする。

#### --user <user_name>
任意の github ユーザーがスターしたパッケージ一覧を表示する。

## 終わりに
`apm stars --install` が便利で、これで複数のマシンでスターしたパッケージを同期することが出来る。

これを知るまでは、自分の `.atom` リポジトリに含めるか、別途テキストファイルで管理して `apm install` させるかで管理しようとしていたが、これからは悩まずに使っているパッケージにはスターしていこうと思う。

---
[Stars](http://blog.atom.io/2014/06/09/stars.html)
SSL でも VirtualHost (Apache2.2)

Apache２．２ の VirtualHost を SSL を使うサイトにも適用
=====

追記
-----
コメントで指摘を受けたとおり、この設定は `Apache2.2` までで有効な設定です。
Apache2.3 以降（多分 2.4 以降を使うのが一般的だとは思うけど）ではこの設定を書くことなく NameVirtualHost を適用することが可能です。

> This directive currently has no effect.

とあるので、2.4 では設定があってもエラーにはならないようですが。
（多分今後のバージョンアップでは完全に撤廃されてエラーになるんだろうな）

普通の VirtualHost の設定
-----

Apache の VirtualHostを適用する時、SSL を使わない場合

```apache
NameVirtualhost *:80
```

と設定してから

```apache
<VirtualHost *:80>
    ServerName virtualhost.example.com
    DocumentRoot /var/www/virtualhost.example.com

    ErrorLog logs/virtualhost_error_log
    CustomLog logs/virtualhost_access_log combined env=!no_log
</VirtualHost>
```


SSL のついたサイトの VituralHost の設定
-----

SSL を使うサイトでは以下のように設定すれば良いのだけど、それだけじゃ不十分．

```apache
<VirtualHost *:443>
    ServerName sslvirtual.example.com
    DocumentRoot /var/www/sslvirtual.example.com

    SSLEngine on
    SSLCertificateFile /path/to/file.crt
    SSLCertificateKeyFile /path/to/file.key

    ErrorLog logs/sslvirtual_error_log
    CustomLog logs/sslvirtual_access_log combined env=!no_log
</VirtualHost>
```

意外と意識から抜けてたけど

```apache
NameVirtualhost *:443
```

この記述も入れておかないと VirtualHost は設定できないので忘れないように．
Qiita と Blog と

Qiita を使ってみて Blog との違いについて考えてみた
=====

色々な人が似たような事を書いているんだろうけど，自分の頭の整理がてら書いてみる．
ちなみに自分の言う Blog は自分で建てている Wordpress を使ったサーバーの事で，はてブとか使ってるとまた違うのかもしれない．

とりあえず結論
-----
こっちの書く時の気持の持ちようが違う．
Qiitaはメモ．
ブログは意思の発信．
みたいな感じで．

「ストック」という反応がある．
-----

自分の「とりあえずメモ」程度に書いた投稿が一瞬で5,6ストックされた．あとフォローされた．
「いや、たかが5,6ストックで何言ってんだよ」とか思うかもしれないが、Blog なんて基本的になんの反応も見えないものだ．

ただでさえ自分は Blog についての発信を何もしてない．この前自分の記事がツイートされてるのを見て「ファッ！！！？？ そんな事あるの？」 って悲鳴上げたくらいだ．
そんな感じで「反応が無い」のが基本だと思ってたのに一瞬で1つの記事に5,6ストックという反応...
これは「継続して書きたい」と思わせるには十分な反応だと思う．
「メモ置き場」としても使うが、やっぱり他人からの反応は気になるものだ．

書く時の意識の違い
-----

ここで思うのが、 Qiita がユーザーにとって「メモ置き場」くらいのイメージなんだろうなという事．
「まだ書き終わっていなくても、とりあえず公開して後から追記するか」って意識で書ける所が良い．

ブログだと「一度書いた記事」は修正しないし、「書き途中の記事」を公開するというのは基本ありえない感覚だと思う．

流入の仕方の違い
-----

多分「固定のファン」みたいな層を獲得できたり、ストック数がそれなりに上がれば話は変わるだろうけど、Qiitaは記事を書いた時の瞬間的な流入は凄いが、定期的な流入は結構少なめ．色々な人が記事を書いているので、すぐ流れてしまう．
下の画像はQiitaにおけるGoogle Analyticsのグラフ．記事を書いた 7/15 は一気に流入があるけど、その後は雀の涙の流入になっているのが分かる．
![qiita-analytics.png](https://qiita-image-store.s3.amazonaws.com/0/29517/d0b3eada-13ee-f15a-ac48-26d9ed8b48c8.png)

対してブログは検索流入なので、流入自体は定期的にある．ちなみに内容は大半が技術メモ．
下の画像は自分のブログにおけるGoogle Analyticsのグラフ．最近は記事は殆ど書いていないけど流入自体は結構ある感じ．
![blog_analytics.png](https://qiita-image-store.s3.amazonaws.com/0/29517/0ef49499-ab1f-497d-db27-7a7ab8a6e80a.png)

因みにどっちも最大値は50程度(;;)

どっちの方が役に立ってるかはどっこいどっこい
-----

これは想像でしかないけど、Qiitaの場合、流入は少なくても「お、この情報見たい」と思う人が多いのに対して、ブログは情報を探している人が「これがそれについて書いてあるかな？」という意識で見に来るんだと思う．そう考えると「見に来た人数に対して有用だと思った人の割合」を考えるとQiitaの方が高そうな気もする．

データを自分で持っている感が欲しいならブログ
-----
ただ、Qiitaに書いたデータ自体はQiita側が持っているので、万が一Qiitaのサービスが終了したりした場合の事を考えると「データを自分でコントロールできる」ブログの方が安心感を感じると思う．
まぁセキュリティがずさんで乗っ取られてデータ全部消されたとかなる可能性を考えたらQiitaの方が安心できる って意見もあるだろうから「どっちがどっち」とも良い辛いけども...

とりあえずそんな感じ
-----
なんかあったらまた書きます.

このテキトーでも大丈夫感がQiitaの凄く良い所だと思う．
Chef-SoloでApacheにプロジェクト固有の設定をする


今回はVagrant上のCentOS6.4に対して実行してみました。

## 目的
* supermarket.getchef.comから取得できるapache2のレシピを使い、apacheのインストールを行う
* プロジェクト固有の設定を、apache2レシピに加筆することなく、独自のレシピを作成し、反映させる

## Berksfile

```ruby
source "https://api.berkshelf.com"

cookbook 'apache2'
```

apache2をインストールする

## プロジェクト固有の設定を行うレシピを作成する
```shell
$ knife cookbook create my-httpdconf -o site-cookbook
```

### テンプレートを編集する
apache2/templates/default/web_app.conf.erbをコピーし、作成したレシピのtemplates/default配下にペースト（名前はなんでもいいです。仮にmy-httpd.conf.erbとしておきます）

my-httpd.conf(短め)

```erb
LoadModule rewrite_module modules/mod_rewrite.so

DocumentRoot <%= "\'#{@params[:docroot]}\'" %>
SetEnv APPLICATION_ENV <%= @params[:env] %>
```

### レシピを編集する
recipes/default.rb

```ruby
include_recipe 'apache2'

web_app 'myproj' do
  template 'my-httpd.conf.erb'
  docroot '/service/htdocs'
  env 'development'
end
```
テンプレートのシンボルに対応した値がアサインされる。

### run_list

```json
{"run_list":[
  "recipe[my-httpdconf]",
  "recipe[apache2::mod_rewrite]"
]}
```
mod_rewrite使うのでそれを指定。

## 実行結果
実行すると、/etc/httpd/conf/httpd.confにapache2レシピの標準設定 + 作成したconfをincludeする旨が追記され、自前のconfが/etc/httpd/sites-enabled/myproj.confという形で配置され、httpdサービスの起動まで行われる。楽ちん！
【Photoshop】スマホ実機でリアルタイムにデザイン確認する方法

#スマホ実機でリアルタイムにデザイン確認したい
スマホのデザイン確認を実機で確認しようとすると、Photoshopで画像を書き出してFTPでアップしたりスマホに画像を送信するなど手間がかかりました。
リアルタイムで確認できるようになれば、その手間が減るということで

#アプリのダウンロード

###PC版ダウンロード
[Mac App Store - Skala Preview](https://itunes.apple.com/jp/app/skala-preview/id498875079?mt=12 "Mac App Store - Skala Preview")
※OS 10.7以上

###iPhone版ダウンロード
[Skala View on the App Store on iTunes](https://itunes.apple.com/us/app/skala-view/id498876303?mt=8 "Skala View on the App Store on iTunes")

###Android版ダウンロード
[Skala View - Google Play の Android アプリ](https://play.google.com/store/apps/details?id=com.bjango.skalaview "Skala View - Google Play の Android アプリ")

※すべて公式サイトからダウンロードできます。
[Skala Preview, a Mac app by Bjango](http://bjango.com/mac/skalapreview/ "Skala Preview, a Mac app by Bjango")

#設定方法
PC・スマホ共にインストールが完了したら、両方のアプリを起動させてPCとスマホを同期させ、お使いのPhotoshopと接続できるように設定します。

##PCとスマホを同期させる
スマホのメニューバーの左下に同期できるPCの一覧が表示されるのでお使いのPCを選択してください。
![IMG_7151.PNG](https://qiita-image-store.s3.amazonaws.com/999/49056/f3784224-33e9-0ece-c3bf-6c519d0c701b.png)


##Photoshopで<strong>リモート接続</strong>できるように設定する
####「編集」から「リモート接続」を選択
![スクリーンショット 2014-07-25 12.16.56.png](https://qiita-image-store.s3.amazonaws.com/999/49056/97960b67-5c49-9fc8-89b4-665b7742045f.png)
####「リモート接続を有効にする」の項目にチェックを入れて、「サービス名」と「パスワード」の設定をする。
![スクリーンショット 2014-07-25 12.18.02.png](https://qiita-image-store.s3.amazonaws.com/999/49056/576e9760-b76b-6b1a-4ffe-08d84b65e4f1.png)

##Skalaで先程設定したPhotoshopの登録して同期させる。
####「Setting」から「Photoshop Setting」を選択し、

![スクリーンショット 2014-07-25 12.23.28.png](https://qiita-image-store.s3.amazonaws.com/999/49056/4d2cfc09-898d-b38e-c3ee-b8efeea06bb7.png)

####事前に登録したPhotoshopの「サービス名」と「パスワード」を入力する。
![スクリーンショット 2014-07-25 12.24.27.png](https://qiita-image-store.s3.amazonaws.com/999/49056/0f05b3b6-d01c-2c5e-ce07-245dfa60723e.png)
Ubuntuでネットワーク設定の変更をする

# 従来の方法(RHEL系, Ubuntu 13以前)

/etc/network/interface を書き換えて、

```bash
sudo service networking restart
```

でOKのはず。そういうものとして覚えている人も多いでしょう。ところが、Ubuntu 14ではこれが動かない。

```
# /var/log/upstart/networking.log

Stopping or restarting the networking job is not supported.
Use ifdown & ifup to reconfigure desired interface.
```

こんなエラーメッセージになります。もちろん、再起動すれば良いのだが、なんとか再起動しないでやりたい。これではまったのでメモ。

# Ubuntu Desktopの場合

```bash
sudo service network-manager restart
```

とすれば全部勝手にやってくれるらしい。

# Ubuntu Serverの場合

先ほど示したエラーメッセージの通りで、

```bash
sudo ifdown eth0 && sudo ifup eth0
```
で基本的にはOK。

ただし、DHCPからstaticに変更した場合、dhclientのプロセスが消えないで残ってしまい、こいつが勝手に設定を書き換えてしまう。そこで、

```bash
sudo kill `cat /run/dhclient.eth0.pid`
sudo rm /run/dhclient.eth0.pid
```

でdhclientのプロセスを消す作業が必要です。
NGUIのラベルの取得方法


NGUI(ver 3.6.8)のラベルをスクリプトから取得する方法

NGUIで作成したラベル名は「LabelTest」

**間違え**

```Test.cs
// その1
UILabel LabelText = GameObject.Find("Label(LabelTest)").GetComponent<UILabel>();

// その2
UILabel LabelText = GameObject.Find("Label(LabelTest)").GetComponent();
```

**正解**

```Test.cs
UILabel LabelText = GameObject.Find("LabelTest").GetComponent<UILabel> ();
```


Webで調べると間違えの方法で書かれているところもあったが
実装するとエラーがでるため、正解の方法で取得できた



ちなみに、ラベルを取得して、そのラベルのテキストを書き換える場合は下記。
（例えば、カウントさせる場合などで使用）

```Test.cs
LabelText.text = ("Test");
```
word をアンダースコアで区切る

Ruby などの snake case を多用する言語でプラグラムを書いていると、`foo_bar_baz` の `foo` だけ書き換えたいとき、`cw` して全部消えてしまい、うわあ！となることはありませんか？

もちろん `ct_` とすればいいのですが、1 タイプ増えてしまうし `cw` の押しやすさにはかないません。そもそも `_` で区切っているのは単語なので、word と言ってもいい気がします。

そこで `_` を区切り文字に含めるには以下のようにします。区切り文字に含めるというより、`_` を単語を構成する文字から除外する感じですね。

```vim
set iskeyword-=_
```

とは言え、変数やメソッド名丸ごと書き換えたい時もあるので、微妙といえば微妙です・・・。
【iPhoneアプリ開発】横スクロールCollectionViewの作り方

iPhoneアプリ開発で横スクロールするCollectionViewを作る方法を悩んでいました。こんなに簡単だったのか！と驚きましたので共有させて下さい。みなさん既にご存知でしたらすみません。

Xcode 5.1で確認しています。

CollectionViewを選択し、Utilitiesにて、「Scroll Direction」をVerticalからHorizontalに変更する。

たったのこれだけです！

これで、綺麗な横スクロールのCollectionViewを使うことが出来ます。

★変更前

![スクショ 2014-07-25 11.01.05.png](https://qiita-image-store.s3.amazonaws.com/0/18165/6eaf7780-c54f-5eab-6a36-3b5bfe24e3c8.png)

★変更後

![スクショ 2014-07-25 11.04.28.png](https://qiita-image-store.s3.amazonaws.com/0/18165/4dde1ee4-7f8d-93fd-195f-664db6417fe6.png)

以上です。

（これに気づいた時、まじかよ・・・と思いました）
[iOS] [Objective-C] currentCalendar を使ってはいけない

## [NSCalendar currentCalendar] を使ってはいけない
使うと、iOSのカレンダー設定が和暦のときにpickerやdatefommaterの年に関連する数値が全部和暦で計算されて、年齢が2000歳になる、みたいなバグが発生する。
例えば、誕生日の表示が63年2月3日とかになる。

代わりに、下記のようにする。

```objc
[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
```

###同様に下記の2点も気をつける
* `UIDatePicker`を使うときは calendar を設定する  

```objc
picker.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"];
NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
gregorian.locale = [NSLocale currentLocale];
picker.calendar = gregorian;
```

　
* `NSDateFormatter`を使うときも calendar を設定する


```objc
dateFormatter.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
```

上記の設定をすると年の表記や、数値としての取り扱い方を西暦で統一できる。
日付を扱っているアプリの場合、iOSのカレンダーの設定を、「設定」-> 「一般」->「言語環境」->「カレンダー」から和暦にして、動作確認を一度はした方が良いと思う。
[YConnect]エラーレスポンス(code=px-04102)について

注文検索API(http://developer.yahoo.co.jp/webapi/shopping/orderList.html)
や
注文詳細API(http://developer.yahoo.co.jp/webapi/shopping/orderInfo.html)
を使用しておりますが、前日(12時間以上前)に取得したリフレッシュトークンを使用して
アクセストークンを再取得し、上記APIを実行しようとすると
下記のレスポンスが返ってきます。
["Message"]=> string(75) "AccessToken has been expired. This API session is shorter than another API."
 ["Code"]=> string(8) "px-04102"

おそらく、APIページに記載のある下記の制限によるものかと思います。
> ※こちらのAPIのセッション時間はアクセストークン発行からリフレッシュトークンを含めて
> 最大12時間です。有効期限が切れた場合は以下のレスポンスが返りますのでアクセストークンの
> 再取得をお願いします。
> <?xml version='1.0' encoding='UTF-8' ?>
> <Error>
> <Message>AccessToken has been expired. This API session is shorter than another > API.</Message>
> <Code>px-04102</Code>
> </Error>

この場合、
有効期限(4週間)内のリフレッシュトークンを使用して、12時間以内にアクセストークンを再取得
することにより、制限を回避できますか？

上記で回避できない場合、
リフレッシュトークンを12時間以内に再取得する必要があるということになり、
4週間という有効期限は無視される形となります。

恐れ入りますが、ご回答をお願い致します。
Angular環境でWebCam画像をS3に直接アップロードする（個人的メモ）

#目的
・Angular環境でWebカメラで撮影したjpg画像ファイルをS3に直接アップロードする実装にハマったのでメモしておく。
・webカメラから画像を出力するところは簡単なので省略。（ブラウザの種類によって動かなかったりしますが。）
・S3についてはPre-signed URLをサーバ側で取得しましたが、そこもハマらなかったので省略。
・問題になったのは、画像ファイルをアップロードする部分なので、その界隈のみをクローズアップする。
#ハマったところ
・まず、html5 canvasのtoDataURLで画像出力するとBase64形式になり、かつデータの前にフォーマットを示す文字列がくっついてしまう。このため、Base64形式のデータをいったんBLOBに出力する必要がある。この辺まではググればいくつか情報があるのでなんとかなる。（後ほどソースつけます。）
・BLOBデータをアップロードする部分で、Ajax呼び出しというかXMLHttpRequestで実装しようとして、FormDataとか準備してやったところ、S3にアップロードしたファイルがMIME形式のまま（いわゆるBoundaryの文字列とかそのままくっついたままのこと）保存されてしまい、どうにもならなかった。
・Webで調べてもXHRでアップロード文字列を組み立ててS3アップロードしている事例は結構見つかったが、どうにもうまくいかず。結局、XHRではなくAngularの通常の$httpでBLOBをアップロードしたところうまくいった。なんだ、それだけのことか、、という感じですが、かれこれ３日ほど悩みました。
#実装サンプル
・Controller部分だけだが、以下の通り。

```js

    var contentType = 'image/jpeg';
    //var contentType = 'image/png';

    //DataURL（Base64形式）をBlobに変換
    function dataURItoBlob(dataURI) {
      //DataURLのデータ部分をBase64からデコード
      var binary = atob(dataURI.split(',')[1]);
      var array = [];
      // Arrayに 1 バイトずつ値を埋める
      for(var i = 0; i < binary.length; i++) {
        array.push(binary.charCodeAt(i));
      }
      //BLOB形式に変換
      return new Blob([new Uint8Array(array)], {type: contentType});
    }
    //ファイルアップロード
    function uploadPicture(callback) {
      console.log('uploadPicture START!!');

      //画像情報作成（BLOB形式）
      var canvas = document.getElementById('myCanvas');
      var dataURL = canvas.toDataURL(contentType);
      var blob = dataURItoBlob(dataURL);

      //アップロード用のURL取得
      $http({
        method: 'GET',
        url: '/api/xxxx/' 
      })
      .success(function(data) {
        var uploadURL = data.url;

        //画像アップロード
        $http({
          method: 'PUT',
          url: uploadURL,
          headers: {
            'Content-Type': contentType,
          },
          data: blob,
        })
        .success(function(data) {
          console.log('アップロード完了 data:',data);
          callback();
        })

        .error(function(data, status) {
          console.log('アップロード失敗 status:',status);
          console.log('アップロード失敗 data:',data);
        });
      })
      .error(function(data, status) {
        console.log('get upload url error status:',status);
        console.log('get upload url error data:',data);
      });
    }

```
iMac上のVirtualBoxでCentOSが超絶遅い時の回避策(かも)

# ゲストOSのアプリがものすごく遅い。(数倍以上の遅さかもっとかも)

## 環境

1. iMac(OSX 10.9.4, Marvericks)
1. VirtualBox(4.3.12)
1. ゲストOSは、CentOS6.5(64bit, NAT接続)
1. アプリはネットワークを介してごにょごにょする普通のアプリ

## 症状

* "tcpdump -n port 53" を見ていると５秒待ち(タイムアウト)になっているのが分かる。

出力例(先頭のタイムスタンプに注目)

```hoge:
11:01:04.352682 IP 10.0.2.15.44697 > 10.247.XX.20.domain: 24278+ A? xxx.co.jp. (39)
11:01:04.352831 IP 10.0.2.15.44697 > 10.247.XX.20.domain: 56006+ AAAA? xxx.co.jp. (39)
11:01:09.356909 IP 10.0.2.15.44862 > 10.247.XX.21.domain: 24278+ A? xxx.co.jp. (39)
11:01:09.357024 IP 10.0.2.15.44862 > 10.247.XX.21.domain: 56006+ AAAA? xxx.co.jp. (39)
11:01:09.357783 IP 10.247.XX.21.domain > 10.0.2.15.44862: 56006* 0/1/0 (87)
11:01:09.357790 IP 10.247.XX.21.domain > 10.0.2.15.44862: 24278* 1/2/2 A 10.247.XX.36 (126)
11:01:09.466692 IP 10.0.2.15.44552 > 10.247.XX.20.domain: 62848+ PTR? 36.XX.247.10.in-addr.arpa. (43)
11:01:14.472534 IP 10.0.2.15.59215 > 10.247.XX.21.domain: 62848+ PTR? 36.XX.247.10.in-addr.arpa. (43)
11:01:14.473590 IP 10.247.XX.21.domain > 10.0.2.15.59215: 62848* 1/2/2 PTR xxx.co.jp. (149)
11:01:14.473775 IP 10.0.2.15.33606 > 10.247.XX.20.domain: 48864+ A? xxx.co.jp. (39)
11:01:19.479448 IP 10.0.2.15.43016 > 10.247.XX.21.domain: 48864+ A? xxx.co.jp. (39)
11:01:19.480513 IP 10.247.XX.21.domain > 10.0.2.15.43016: 48864* 1/2/2 A 10.247.XX.36 (126)
11:01:19.480942 IP 10.0.2.15.35673 > 10.247.XX.20.domain: 17890+ A? xxx.co.jp. (39)
11:01:19.480945 ・・・・・
```

* ssh を実行すると、接続(プロンプトがでる)までに数十秒待たされる。このとき、strace ssh hogehoge とかやると５秒待ちになっているシステムコールが分かる。
* pingだと待ちが発生しなかったりとか、実行するコマンドによって発生状況は異なる。

## 回避策

```
$ VBoxManage modifyvm "VMNAME" --natdnspassdomain1 off --natdnshostresolver1 on
```

VirtualBox の NATエンジンが関係していると思われる。
詳しい人以外は、設定ファイル(.vbox)を直接編集せず、この上のVBoxManageコマンドを使うのが良いと思います。

## やってみたこと

1. ブリッジ接続(固定IP)にすると発生しない。(NATが関係している)
1. NAT接続のままで使いたい場合は、「VBoxManage modifyvm "VMNAME" --natdnspassdomain1 off --natdnshostresolver1 on」
1. NATでFirewall越しのDNSタイムアウトの問題の解決のためのresolv.conf(single-request-reopen)では、解消しない。(別問題と思われる)
1. IPv6 に関係する問題らしいので、IPv6 を止めてみたが、解決しない。

## 参考リンク

* [vagrantでCentOSマシンを構築する - Qiita](http://qiita.com/kanuma1984/items/7d7706bf79a8773037b2 "vagrantでCentOSマシンを構築する - Qiita")
* [Vagrant + VirtualBoxでアプリがやたら重い時に試した方が良いこと - Qiita](http://qiita.com/EaleLove777/items/247df1439b2fa485f4e4 "Vagrant + VirtualBoxでアプリがやたら重い時に試した方が良いこと - Qiita")
* [vagrantでCentOSのVMを立ちあげて、ネットワークが遅い時に試すこと - $shibayu36-&gt;blog;](http://shibayu36.hatenablog.com/entry/2013/08/12/090545 "vagrantでCentOSのVMを立ちあげて、ネットワークが遅い時に試すこと - $shibayu36-&gt;blog;")
* [RHEL6/CentOS6では、single-request-reopen を必須にしたい…](http://www.kunitake.org/chalow/2012-11-02-1.html "RHEL6/CentOS6では、single-request-reopen を必須にしたい…")
作りたいアプリ・機能を一発逆引き！iOS SDK機能、フレームワーク概要まとめの記事を書きました。

by mixiappwchr


SDKのフレームワークや機能がどんどん拡充されiOS8になるとさらに増えますが
おさらいとどんなことに使えるかをわかりやすくするようまとめた記事をCodeIQの方で書かせていただきました。

こちらにもリンクします。
[作りたいアプリ・機能を一発逆引き！iOS SDK機能、フレームワーク概要まとめ](https://codeiq.jp/magazine/2014/07/13476/)
findコマンドで複数拡張子を指定して、コマンドを実行する

findコマンドで複数の拡張子を指定して、見つけたファイルに対してコマンドを実行する方法は以下のとおりです。

```
find 検索対象ディレクトリ \( 検索条件 \) -exec コマンド
```

以下の例では、検索対象ディレクトリ内のCソース、ヘッダファイル、アセンブラソースを出力し、その全ステップ数を数えます。
(検索対象ディレクトリは複数指定可能です。)

```
find src/ include/ \( -name \*.c -or -name \*.h -or -name \*.S \) -exec cat {} \; | wc -l
```

上記で注意すべき点は以下のとおりです。
1.拡張子の検索条件は括弧でくくっていますが、エスケープしましょう。
2.括弧と検索条件を示すオプション(ここでは-name)との間にはスペースを入れる。入れないとfindコマンドに以下のように怒られます。

```
find: invalid expression; you have used a binary operator '-or' with nothing before it.
```

これだけ見てすぐにピンとこないので、余計な時間を取らないためにも「括弧ときたらスペース」と心得ましょう。
HaxeでFizzBuzz TDDをやってみる

#環境構築

##Haxe

IDEである **FlashDevelop** をインストールしておきます。

空のプロジェクトも作っておきましょう。

##TDD

**プロジェクト直下**に移動して、以下のように進めます。

```shell-session:shell
$ npm install -g coffee-script
...
$ npm install -g mocha
...
$ npm install expect.js --save-dev
...
$ npm install -g testem
...
$ mkdir test
$ touch test/fizzbuzztest.coffee
$ coffee -cw test/fizzbuzztest.coffee &
```

これで、**fizzbuzztest.coffee**が更新されると自動的にJavaScriptに変換してくれます。

次に、プロジェクト直下に **testem.json** というファイルを作ります。

```json:testem.json
{
  "framework": "mocha",
  "src_files": [
    "bin/*.js",
    "test/*test.js"
  ],
  "launchers": {
    "Mocha": {
      "command": "mocha test/*test.js -R tap",
      "protocol": "tap"
    }
  },
  "launch_in_dev": [
    "Mocha"
  ]
}
```

testemを起動します。

```shell-session:shell
$ testem
```

これで、Haxeでコンパイルしたときやテストを更新したときに**自動的にテストが走ります**。

#テストを書く（レッド）

すいませんがいきなり最後まで書きます。

```coffeescript:fizzbuzztest.coffee
expect = require 'expect.js'
fizzbuzz   = require '../bin/FizzBuzz.js'

describe 'fizzbuzz', ->

	f = new fizzbuzz.FizzBuzz # スコープから出したクラスを参照する

	it 'return string Fizz when 3 is given', ->
		result = f.returnString( 3 )
		expect( result ).to.be( 'Fizz' )

	it 'return string 2 when 2 is given', ->
		result = f.returnString( 2 )
		expect( result ).to.be( '2' )

	it 'return string Buzz when 5 is given', ->
		result = f.returnString( 5 )
		expect( result ).to.be( 'Buzz' )

	it 'return string Fizz when 6 is given', ->
		result = f.returnString( 6 )
		expect( result ).to.be( 'Fizz' )

	it 'return string Buzz when 10 is given', ->
		result = f.returnString( 10 )
		expect( result ).to.be( 'Buzz' )

	it 'return string FizzBuzz when 15 is given', ->
		result = f.returnString( 15 )
		expect( result ).to.be( 'FizzBuzz' )

	it 'return string FizzBuzz when 15 is given', ->
		result = f.returnString( 30 )
		expect( result ).to.be( 'FizzBuzz' )
```

#実装する（グリーン）

FlashDevelopで**FizzBuzz**というクラスを作ります。

```hx:FizzBuzz.hx
package ;

@:expose( "FizzBuzz" ) // テストから見えるように、クラスをスコープから出す
class FizzBuzz{

	public function new() {
		
	}
	
	public function returnString(n : Int) : String {
		if ( n % 15 == 0 ) {
			return "FizzBuzz";
		}
		else if ( n % 3 == 0 ) {
			return "Fizz";
		}
		else if ( n % 5 == 0 ) {
			return "Buzz";
		}
		else {
			return Std.string(n);
		}
	}
}
```

```hx:Main.hx
package ;

import js.Lib;

class Main {
	
	static function main() {
		var f = new FizzBuzz();
		for (i in 1...100) {
			var s : String = f.returnString( i );
			trace( s );
		}
		
	}
	
}
```

これでできあがりです。

![Windows_7.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/fe5c0d6b-bd49-0b84-e22e-79f854271b20.jpeg)

クラスを出すところが、ややハマりどころでした。

そういえばFizzBuzzって何？って方はググって下さい。筆無精で申し訳ないです。

---
ブログやってます：[Weed Software](http://weed.cocolog-nifty.com/wzero3es/)
IntelliJ IDEAが起動しない時 (Mac)


あれ？起動させたんだけど動いてないな…
↓
ターミナルで起動してみる

```
JavaVM FATAL: Failed to load the jvm library. 
```

↓


`/Application/IntelliJ IDEA XXX/Contents/Info.plist` をエディタで開く
↓
以下の部分を書き換える

``` diff
<key>JVMVersion</key>
- <string>1.6*</string>
+ <string>1.7*</string>
```

これで解決

[ここら辺](https://developer.apple.com/library/mac/documentation/Java/Reference/Java_InfoplistRef/Articles/JavaDictionaryInfo.plistKeys.html)参照。
Node で AMD っぽく DI できる fount を使ってみる

npm で インストールします。

```zsh
npm install fount -S
```

fount を require します。

```js
var fount = require('fount');
```

まずは、簡単な文字列で登録してみます。

```js
fount.register('library', 'fount');
fount.register('mySaying', 'ええわ!');
```

dependencies を指定しての登録もできます。

```js
fount.register('say', ['library', 'mySaying'], function (library, mySaying) {
  return function () { console.log(library + mySaying); };
});
```

それを inject して say 関数を使います。

```js
fount.inject(['say'], function (say) {
  say(); // fountええわ!
});
```

AMD っぽく DI できました!
Factory Method パターン

![](http://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Factory_Method_UML_class_diagram.svg/500px-Factory_Method_UML_class_diagram.svg.png)

```
Factory Method パターンは、他のクラスのコンストラクタをサブクラスで上書き可能な自分のメソッドに置き換えることで、 アプリケーションに特化したオブジェクトの生成をサブクラスに追い出し、クラスの再利用性を高めることを目的とする。
```

- [Factory Method パターン - Wikipedia](http://ja.wikipedia.org/wiki/Factory_Method_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)

## ざっくり言うと?

インスタンスの生成部分を、サブクラスにお任せするパターン

## 使い道

[Template Method パターン](http://qiita.com/kasei-san/items/7df52a6a326083bde4f2) のインスタンスを使って、何かしらの処理を行う class をキレイに実装する


## 実装例

StringLister#display の内容を画面に出力する StringListerViewer を作る

```factory_method.rb

# Creator に相当
class StringListerViewer
  attr_reader :items
  def initialize(items)
    @items = items
  end

  def display # anOpreation に相当
    puts string_lister(items).display
  end

  def string_lister(items) # factoryMethod に相当
    raise NotImplementedError
  end
end

# ConcreteCreator に相当
class TextStringListerViewer < StringListerViewer
  def string_lister(items)
    # ConcreteProduct に相当
    TextStringLister.new(items)
  end
end

# ConcreteCreator に相当
class HtmlStringListerViewer < StringListerViewer
  def string_lister(items)
    # ConcreteProduct に相当
    HtmlStringLister.new(items)
  end
end

items = %w[abc def ghi]
HtmlStringListerViewer.new(items).display
# <html><body>
# <div>abc</div>
# <div>def</div>
# <div>ghi</div>
# </body></html>

TextStringListerViewer.new(items).display
# abc
# def
# ghi
```


- StringListerViewer クラス → anOparation を実装
- StringListerViewer のサブクラス → factoryMethod を実装
- インスタンスの生成を、各サブクラスに投げる
  - StringListerViewer の結合度が下がる
  - StringListerViewer のサブクラスでは、インスタンスの生成を実装するだけで済むようになる

## ConcreteCreator を作らないで、動的に Product のサブクラスを生成してみる

Object.const_get を使って、文字列からクラスを取得する
大量に Product のサブクラスがある時に、いちいち ConcreteCreator クラスを作らないので楽

``` factory_method.rb
class StringListerViewer
  attr_reader :items, :type
  def initialize(items, type)
    @items = items
    @type = type
  end

  def string_lister(items)
    Object.const_get("#{type.to_s.capitalize}StringLister").new(items)
  end

  def display
    puts string_lister(items).display
  end
end

items = %w[abc def gih]
StringListerViewer2.new(items, :text).display
StringListerViewer2.new(items, :html).display
```

## Factory パターンのその他の利点

### コンストラクタがシンプルになる

- 複雑な処理はインスタンス生成後に、別メソッドとして呼び出す事ができる
- 複雑な事前処理を分離することで、実装がシンプルになったりテストが書きやすくなる
- 事前処理が別メソッドでも、生成はファクトリメソッドに一任されているから、事前処理の呼び出しもれが無い

## 参考

- [Factory Method パターン - Wikipedia](http://ja.wikipedia.org/wiki/Factory_Method_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)
- [オブジェクト思考: Factory (ファクトリ) パターン](http://think-on-object.blogspot.jp/2011/11/factoryfactory-methodabstract-factory.html?m=1#difference)
- [const_get (Module) - Rubyリファレンス](http://ref.xaio.jp/ruby/classes/module/const_get)

→ [Abstruct Factorty パターン](http://qiita.com/kasei-san/items/97d43cce70ab087294ae) に続く
Unity+iOSにおいて、値型のOrderByがエラーになる。その回避方法を考えて、原因を予想してみた。

　OrderBy、OrderByDescending、ThenBy、ThenByDescendingなどのいくつかのLINQメソッドは、以前のUnityでは問題がありました。AOTコンパイラの不具合により、iOSなどAOTコンパイルが必要なプラットフォームで実行時例外が発生することがあったのです。

　現在Unityでは、かつてAOTコンパイルが行われていたプラットフォームで、IL2CPPという技術が使われています。

　私が把握している限り、IL2CPPでは本投稿「Unity+iOSにおいて、値型のOrderByがエラーになる。その回避方法を考えて、原因を予想してみた。」で紹介したメソッドは、問題なく使えているようです。そのため本投稿の記事本文は、削除しました。

　過去の内容を見たい場合は、[編集履歴](http://qiita.com/RyotaMurohoshi/items/a789e6965c6de3d6e31f/revisions)よりご覧ください。
データ整形まわりで必要な Python の細かいテクニック (2)

[データ整形まわりで必要な Python の細かいテクニック](http://qiita.com/ynakayama/items/824269b484e721f3ec82)を先週少し説明しましたが、他にもいくつかよく気にしておくべきポイントがあります。

特に昨日のように D3.js でデータを可視化しようとすると JSON のデータセットを生成する必要があるわけですが、データセットがどういったデータ構造になっているかはよく把握しておかないといけません。

[コンパイルして実行する言語](https://java.com/ja/download/)のように IDE 上でエラーチェックできて完成するまでバグを取ってから動かすといった方法が採れれば良いのですが、 JavaScript の場合ブラウザで実行しても思うように表示されない、警告メッセージから真の原因まで辿り着くのに時間を取られがちという傾向があります。それは実行環境によるものなのか、データの型や形式によるものなのか、あるいはコードの細かいミスなのか、切り分けをするのに時間がかかるのが原因かと思います。

そんなわけでデータセットの形式を正しく理解し、ユニットテストを書いて正確性の担保をすることは結果的に時間の節約につながりますし、地味で手間がかかりますが省略するべきではないとても重要な手順です。

## 尺度水準の変換と時刻印の変更

たとえば時系列のログデータを可視化することを考えてみます。時間というのはそもそも区切りのない延々と連続する情報です。これをスライドバーで動かして時間の推移によるデータの変化を見せたい場合、[尺度水準](http://www.geisya.or.jp/~mwm48961/statistics/scale1.htm)を変更し間隔尺度への変換をおこなうのがよくある手法です。

7/22 〜 7/25 の 4 日間の顧客の数を見せたいとします。距離尺度を等間隔に確保するために [UNIX 時刻](http://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93)と人間の日時の変換をします。

|人間の日時|UNIX 時刻|
|:--|:--|
|20140722|1404226800|
|20140723|1404313200|
|20140724|1404399600|
|20140725|1404486000|

このように 1 日単位の推移を可視化するために、左側の人間の日時から UNIX 時刻に変換するための関数を用意しておきます。 Python では time.mktime で UNIX 時刻が浮動小数点型で帰ります。

```py3
def to_unixtime(self, d):
    # time.mktime(2014,07,22,0,0,0,0,0,0) する
    return int(time.mktime((int(d[0:4]),int(d[5:6]),int(d[7:8]),0,0,0,0,0,0)))
```

上の例ではひとまず 1 日単位の距離尺度を求められれば良いので時刻の部分には 0 を固定で指定しました。 1 時間単位、 10 分単位という風に距離を設定する場合のためにもう少し改良したほうが良いでしょう。どうしたら良いかは読者の皆様が考えてみてください。

また JavaScript の世界では 1/1000 秒単位で時刻を扱うのが普通です。 JSON に変換するときに数値を 1000 倍することを忘れないようにしましょう。

なお UNIX 時刻印から人間の日時への変換は次のようにおこないます。

```py3
now = 1406255406992 / 1000
datetime.datetime.fromtimestamp(now)
#=> datetime.datetime(2014, 7, 25, 11, 30, 6, 992000)
```

## リスト内包表記

たとえば次のようなデータ形式を考えてみます。ネストした辞書型、一般に言う連想配列です。

```py3
{1404399600.0: {'a': 1, 'b': 2}, 1404486000.0: {'c': 3, 'd': 4}}
```

これを[昨日](http://qiita.com/ynakayama/items/f661b493751370ee6568)紹介した Stacked Area Chart で表示したい場合、本体の[コード](https://github.com/novus/nvd3/blob/master/src/models/stackedAreaChart.js)では JSON のデータ形式を[多次元配列として扱っている](https://github.com/novus/nvd3/blob/master/test/stackedAreaChartTest.html)ことがわかります。辞書型からの変換は一見面倒そうですが Python の持つリスト内容表記を使えば簡潔に記述ができます。

```py3
[[a*1000,b] for a,b in v.items()]
#=> [[1404399600000.0, {'a': 1, 'b': 2}], [1404486000000.0, {'c': 3, 'd': 4}]]
```

数学の世界では実数、整数などのすべては普遍集合 (universal set) であると解釈します。 for によってデータの要素を参照し各々に対して射影を得ると考えればすっきり理解できます。数学の表記に似せてあることがわかりますね。

Python 3 ではリスト内包表記の動作がジェネレータ式に改善されており例えば次のような構文は

```py3
[f(x) for x in S if P(x)]
```

以下のように list() 関数をジェネレータ式に適用したものと等価になります。

```py3
list(f(x) for x in S if P(x))
```

## まとめ

今日もひたすら地味なデータ変換をおこなう上でよく登場する細かいテクニックを紹介しました。
Yoで月曜をお知らせ

# Yoで何かやってみたい

[Yo APIを試してみた](http://qiita.com/pomu0325/items/9990dc1b0dbafd72f3e6)を見て何か作れないかと考えた結果、月曜日をお知らせするbotを作ってみました。
`GETSUYO`にYoを送ると月曜のお知らせを受け取れます。

# GETSUYOのソース 

Goで作ってherokuにデプロイしたかったので[Getting Started with Go on Heroku](http://mmcgrana.github.io/2012/09/getting-started-with-go-on-heroku.html)の手順通りに進めます。
ただし、botはWebアプリではないのでProcfileのprocess typeを`clock`(`web`以外の任意の単語)にします。

```ruby:getsuyo/Procfile
clock: getsuyo
```

タイムゾーンは[herokuでタイムゾーン設定](http://qiita.com/haman29@github/items/773b522b92bbf806ab32)のようにコンソールから設定できますが、コードで設定してみました。
またSIGTERMでプロセス停止なのできちんと処理しています。

```go:getsuyo/main.go
package main

import (
	"fmt"
	"net/http"
	"net/url"
	"os"
	"os/signal"
	"syscall"
	"time"
)

const (
	api_key            = "ここにAPI_KEYを設定する"
	location           = "Asia/Tokyo"
	offsetLoc          = 9 * 60 * 60
	offsetDayOfWeekday = time.Monday
)

func init() {
	loc, err := time.LoadLocation(location)
	if err != nil {
		loc = time.FixedZone(location, offsetLoc)
	}
	time.Local = loc
}

func main() {
	fmt.Println("starting getsuyo")
	s := make(chan os.Signal)
	signal.Notify(s, syscall.SIGTERM)

end:
	for {
		select {
		case <-time.After(nextTickTime()):
			if time.Now().Weekday() == offsetDayOfWeekday {
				yoall()
			}
		case <-s:
			break end
		}
	}
	fmt.Println("stopping getsuyo")
}

func nextTickTime() time.Duration {
	now := time.Now()
	nextDay := time.Date(now.Year(), now.Month(), now.Day()+1, 0, 0, 0, 0, now.Location())
	return nextDay.Sub(now)
}

func yoall() {
	values := url.Values{}
	values.Add("api_token", api_key)
	_, err := http.PostForm("http://api.justyo.co/yoall/", values)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("Send yoall")
	}
}
```

# まとめ

ここまでやっておいて何ですが、cronとcurlだけでほぼ同じ事ができるんですよね。
とは言え、標準ライブラリだけでこんなに簡単に作れるGoはすごいです。
[Rails]provideヘルパでlayoutにデータを引き渡す


タイトルとかOGPとかをview側から動的にlayoutにデータを引き渡したいときの定石。

```app/views/posts/index.html.erb
<% provide :title, "ページ個別タイトル" %>
<% provide :og_title, "ページ個別facebookタイトル" %>
```

このデータをlayoutから参照できる。

```app/views/layouts/application.html.erb
<title><%= yield :title %></title>
<meta property="og:title" content="<%= yield :og_title %>" />
```

provide使ってないページとかあったりする場合はデフォルトの文言が表示されるようにしておくといい。

```app/views/layouts/application.html.erb
<title><%= yield(:title).presence || "デフォルトタイトル" %></title>
```
jQueryのbindとonの違い

# bindとonは一緒

```js
$( "body" ).on( "click", function() {
    alert( "Goodbye!" );
});
```

本来のJavaScriptイベントハンドラは、`onclick`、`onblur`のように頭にonをつけます。
しかし、jQueryではonを付けずに使用していますよね。

この`on`を使うことにより、本来のJavaScriptのように`onclick`と指定しているように見えるというのは、個人的には利点だな、と思っています。

もちろん、そんな理由で`bind`から`on`に名称が変更されたというわけではありません。`bind`の問題点を改善して改善してできた機能を統合してできたのが、`on`です。オールマイティな優れものです。

とはいえ、機能が増えたことで、「引数が増えたー」「ややこしいー」と思うかもしれませんが、考え方によっては、そうでもありません。特に`live`、`delegate`を知らない、使ったことがないという場合、`bind`と`on`の違いはないといってもあながち間違いではありません。（メモリ効率や処理速度について言及したものではないということを付け足しておきます。）

むしろ`on`であれば、`bind`と同じ書き方で`live`と`delegate`の機能が使えると考えるほうが間違いといえます。

使用方法は簡単です。**これまで`bind`を使っていたところを`on`に変えてみてください**。文法を全く変えずに`bind`と同じ動作をさせることができます。

そして今後は`on`を使用しましょう。それは機能が豊富だからという理由ではありません。単にversion 1.7以降`on`の使用が推奨されているからです。

# liveとdelegate

`on`を説明するうえで、必要なキーワードは`bind`だけではありません。他に、`live`、`delegate`、`[click, change, focus...]`が重要なキーワードとなります。これらの機能を合わせ持つのが`on`です。

ただし、`live`、`delegate`はそれぞれ非推奨や削除された機能です。

- liveは、jQuery version 1.7からdeprecated(廃止予定)、version 1.9でremoved(削除)
- delegateは、jQuery version 1.7から非推奨

最新版からjQueryを使用するなら特に覚える必要はないと思いますが、`on`の全容を理解するには役に立つと思います。

ここでは機能について説明は行いませんが、簡単にいうと、

- `live`は動的に作成された要素にも対応可能な`bind`
- `delegate`は`live`の様々な問題に対応した`live`

## live、delegateをonに変える際に注意すること

変更の際は以下のことに注意してください。

- `live`は`bind`と同じ書き方
 - `live`をそのまま`on`に変えても`live`の機能は使えません
- `delegate`は`on`と引数の順序が異なる
 - `delegate`をそのまま`on`に変えても動きません

```js
// live
$( "a.offsite" ).live( "click", function() {
    alert( "Goodbye!" );
});
```

```js
// delegate
$( document ).delegate( "a.offsite", "click", function() {
    alert( "Goodbye!" );
});
```

上記のような`live`もしくは`delegate`を`on`にする場合、以下のようにします。([参考](http://api.jquery.com/live/))

```js
// on
$( document ).on( "click", "a.offsite", function() {
    alert( "Goodbye!" );
});
```

`delegate`の第1引数と第2引数が入れ替わった感じです。これで、`on`を使用した場合でも`live`もしくは`delegate`の機能を使うことができます。

# events系メソッド(click, change, blurなど)

`bind`もしくは`on`は、以下のような書き方ができます。

```js
$( "body" ).click( function() {
    alert( "Goodbye!" );
});
```

引数が少なくスッキリとした書き方です。
この書き方は、`bind`もしくは`on`と同じ動きをします。

```js
$( "body" ).bind( "click", function() {
    alert( "Goodbye!" );
});
```

```js
$( "body" ).on( "click", function() {
    alert( "Goodbye!" );
});
```

それでは何が違うのでしょうか。
それは実際のjQueryの定義を見るのが早いでしょう。

古いjQueryのソースから確認します。

```js
// jQuery version 1.3.2
click: function (G){return G?this.bind(E,G):this.trigger(E)}
```

ただ`bind`を呼んでいるだけでした。さて、最新版ではどうでしょうか。

```js
// jQuery version 2.1.1
click: function (a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}
```

なんと、ちゃんと`on`に変わっているではないですか。

1回余計な関数を挟むだけ、という考えもあると思いますが、ある意味これは使えます。
引数が少なくて済むし、なにより古いバージョンからこの書き方をしていたとしても、**わざわざ`on`に書き換える必要がない**んです。便利ですね。
rspecでログイン認証（devise）が必要なコントローラを単体テストする

ググるといくつか見つかったのですが最終的に、
Devise::TestHelperをincludeして、sign_inするだけでした。
＃手元に環境がないのでコードうろ覚えのコードです。
＃近況報告程度に。

```spec/rails_helper.rb
RSpec.configure do |config|
 :
  config.include Devise::TestHelpers, type:controller
 :
```

```spec/controller/examples_controller_spec.rb
it 'should return vaild JSON' do
  sign_in FactoryGirl.create :user, name:'my test user'
  get '/examples.json'
  :
end
```

```app/controller/examples_controller.rb
class ExamplesController < ApplicationController
  def index
    respond_to do |format|
      format.json {render json:{user:current_user} }
    end
  end
end
```

とかなんとか。
近頃はrubymineでこんなようなことをしています。