OmniAICreator/Qiita-1.07M huggingface dataset:
関西Rubyの会でのRuby初心者向けレッスンの復習

=====================================

#### Variables
|	  Type		|	Format	|
|:------------:|:---------:|
|local var		|	foo		|
|instance var	|	@foo	|
|class var		|	@@foo	|
|global var		|	$foo	|
|static 		|	Foo		|

#### Method
```rb
	def method_name [arg1[, arg2....]]
		statement
	[rescue [exception class1[, exception class1'...]] [=> var] [then]
		statement1]...
	[else
		statement2]
	[ensure
		statement3]
	end
```

#### Arguments
|	   Format	|				Meaning				|
|:-------------:|:--------------------------------:|
|arg			|			(only name)				|
|arg = default	|	assign defalut if omitted		|
|*args			|	remained args assigned to Array |
|&args			|			Block					|

##### initialize
```rb
	def initialize(args)
		[statement]
	end
```
+ called when "new"
+ "new" arguments are assigned initialize method arguments

#### Accessors
```rb
	attr_reader		:foo	# @foo reading attribute
	attr_writer		:bar	# @bar writing attribute
	attr_accessor	:baz	# @baz reading and writing attribute
```
	
	
-------------------------------------------------------------------------

`2014/3/29 (Sat.)` <br>
## Array & Hash

#### Array Objects
```rb
	("a".."c").to_a		# => ["a", "b", "c"]
	[*"a".."c"]			# => ["a", "b", "c"]
	
	%w(a b c)			# => ["a", "b", "c"]
	%i(a b c)			# => [:a, :b, :c]
```
	
#### Initialize Array Object
```rb
	Array.new(3){0}				# => [0, 0, 0]
	Array.new(3){|i| i.to_s}	# => ["0", "1", "2"]
```
	
#### String to Array
```rb
	"No Ruby, No Life".scan(/\w+/)		# =>	["No", "Ruby", "No", "Life"] 
	"Ruby Kansai".scan(/\p{Word}+/)		# =>	["Ruby", "Kansai"]
	"1,1,2,3,5,8".split(/,/).to_i		# =>	[1, 1, 2, 3, 5, 8]
```
	
#### Array to String
```rb
	["matz", 48, "dhh", 34].join(',')	# =>	"maz,48,dhh,34"
	"%s(%d)" % ["matz", 48]				# =>	"matz(48)"
```
	
#### Hash Default Value
```rb
	sum = Hash.new{|h, k| h[k] = 0}
	
	sum[:foo]			# => 0
	sum[:bar] += 1		# => 1
	
	sum					# => {foo: 0, bar: 1}
```
	
#### Hash to Array
```rb
	{foo: 0, bar: 1}.to_a			# => [[:foo, 0], [:bar, 1]]
	[[:foo, 0], [:bar, 1]].to_h		# => {foo: 0, bar: 1}
```
	
#### Array to Hash
```rb
	a = [foo: 0, bar: 1]
	Hash[*a]
```
	
#### Enumerable
```rb
	a = [1, 2, 3, 5]
	
	a.map{|i| i*i}				# => [1, 4, 9, 25]
	a.select{|i| i.odd?}		# => [1, 3, 5]
	a.inject{|s, i| s + i}		# => 11
	a.find{|i| i.odd?}			# => 1
	a.all?{|i| i.even?}			# => false
	a.any?{|i| i.even?}			# => true
```
	
#### Injection
```rb
	a = [1, 2, 3, 5]
	
	a.inject do |s, i|
		s			# => 1, 3, 6
		i			# => 2, 3, 5
		s + i		# => 3, 6, 11
	end
```
	
#### Array Copy
```rb
	a = [1, 2, 3]
	b = a.clone
```
Vagrant+VirtualBox+nfsを使ってsynced_folderを設定する

#Vagrant + VirtualBoxでsynced_folderをnfsでマウントした時のメモ

##環境
Mac OS X 10.9.2
Vagrant 1.5.1
VirtualBox 4.3.10

##やること

* Mac側の設定
* VagrantFileの設定
* トラブルシューティング

## Mac側の設定

```
$ sudo nfsd status
nfsd service is enabled
nfsd is running (pid 2140, 8 threads)
```

立ち上がってない場合は

```
$ sudo nfsd enable
```

で、OK。
次に、/etc/exportsが必要なのでこれを作る。

```
$ sudo touch /etc/exports
```

## VagrantFileの設定

```rb
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  ...
  config.vm.synced_folder ".", "/vagrant", type: "nfs"
  ...
end
```

これでvagrant upすればゲストOSの/vagrantフォルダにホストOSのVagrantFileのあるディレクトリがマウントされる。

## トラブルシューティング
vagrant up時に

```
NFS requires a host-only network to be created.
Please add a host-only network to the machine (with either DHCP or a
static IP) for NFS to work.
```

って言われたら
VagrantFile

```rb
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  ...
  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  config.vm.network "private_network", ip: "192.168.33.10"
  ...
end
```

ここでprivate_networkを設定すれば良い。
ipは適宜変更で。

よーしvagrant reloadだ。

```
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

mount -o 'vers=3,udp' 192.168.33.1:'/path/to/hoge' /vagrant

Stdout from the command:



Stderr from the command:

mount.nfs: rpc.statd is not running but is required for remote locking.
mount.nfs: Either use '-o nolock' to keep locks local, or start statd.
mount.nfs: an incorrect mount option was specified
```

と言われる。
[このへん](https://github.com/mitchellh/vagrant/issues/1744#issuecomment-22864574)でも同様の議論されてる。

とりあえずvagrant reloadでうまくいった。
vim-gal-character を作ってみた。


この記事は [Vim Advent Calender 2013](http://atnd.org/events/45072) 119日目の記事です。

## 経緯

きっかけは、たまたま見た、このツイートでした。
https://twitter.com/upgrade_ayp/status/449036965619310592

> javascript:K='あいうえおやゆよわつは。';k='ぁぃぅぇぉゃゅょゎっゎo';with(document.body){for(i in K){innerHTML=innerHTML.replace(RegExp(K[i],'g'),k[i])}}focus();

翻訳とかならともかく、そんな変換しようと思ったこともないけど、  
何か不思議に「ほぅ…」って思ってしまい、「この発想で何か作ろう」と思いました。

で、まんまなものを作ってしまったのですが、  
これが **初** の自作Vimプラグインです。

## 現在の行をギャル文字に変換します！

[tgfjt/vim-gal-character](https://github.com/tgfjt/vim-gal-character)

`:ConvertGalChar` とやると、現在行の文字列変換を行います。

## プラグインが出来るまで

[Vim プラグインを github で公開するまで](http://d.hatena.ne.jp/osyo-manga/20121201/1354288903) や、  
[Vimプラグインが出来るまで - ぼっち勉強会](http://kannokanno.hatenablog.com/entry/20120403/1333462565) を見ながら、  
`.vimrc` にちまちま書いては怒られ書いては怒られ、  


`autoload` って何だ…と今も思いつつ、  
もっと良ぃ実装無ぃのかな…とか、変数名とかのぉ作法もょく分からずゃってぃますo

実質のコードは下記のみですね。

```
function! s:GalChar()
  let before_gal_character = ["あ", "い", "う", "え", "お", "や", "ゆ", "よ", "わ", "つ", "は", "。"]
  let after_gal_character = ["ぁ", "ぃ", "ぅ", "ぇ", "ぉ", "ゃ", "ゅ", "ょ", "ゎ", "っ", "ゎ", "o"]
  let current_line = getline('.')

  let c = 0

  while c < len(before_gal_character)
    let current_line = substitute(current_line, before_gal_character[c], after_gal_character[c], "g")
    let c += 1
  endwhile

  call setline('.', current_line)
endfunction
```

もしもっと作りこむなら、現在の行だけではなく、  
選択された `textobj` とか ビジュアルモードの選択にも対応してみたいです。

## TravisCI

111日目のVAC、 [vim-vimlint で Travis-CI 連携](http://d.hatena.ne.jp/syngan/20140321/1395411106) も使ってみました！

## 最後に

作り終わる直前に、osyo-mangaさんの言葉が脳裏に浮かび、

> 「既存のプラグイン名と被らないようにする」

検索してみたところ、

### [Vimでギャル文字](http://mattn.kaoriya.net/software/vim/20120607224505.htm)  

もぅぁるゃんo  :anguished:  
mattnさんが2012年に作ってたょooo

`gal-vim` だから名前は被ってないけど…
HSB(HSV) のすすめ

みなさんは普段アプリの開発の際にどのような形で色を指定していますか？個人的な経験と予想では

```objc
[UIColor colorWithRed:0.251 green:0.514 blue:0.663 alpha:1.000]
```

のような RGB での指定だったり、カテゴリやマクロで拡張して `#4083A9` のような Hex 指定だったりするのではないでしょうか？このような指定になっている理由としてはデザイナーさんから指定される形式が RGB だからというのが多い気がします。デザイナー不在で開発者だけで作っている場合も RGB の方が何となくわかりやすい気がするという理由だったりします。

## 色の調整

デザイナーさんがいる環境であれば本職であるデザイナーさんの指示を仰ぐ形がプロダクトとしてはベストだと思うので開発者だけで色調整する場合の話です。特に色に関する知識がほぼない人です。僕自身も全く色に関する知識はありません。

RGB は Red, Green, Blue, Alpha の要素の組み合わせで色を表しています。UIColor であれば R:1, G:0, B:0, A:1 であれば赤。単純です。それではこのような真っ赤ではなく少し暗い赤が欲しい場合にはどうしますか？RGB の各値をいじくり回しますか？気がつけばとんでもない色になったりしませんか？

## そこで HSB

HSB は

* Hue: 色相
* Saturation: 再度
* Brightness: 明度

で色を表現します。先ほどの例の少し暗い赤が欲しい場合は HSB 表現の赤の B の値を少し下げるだけで暗い赤になります。単純です。

* [The ustwo™ Pixel Perfect Precision Handbook 2 日本語版](http://www.concentinc.jp/labs/2014/01/pixel-perfect-precision-handbook-2-japanese/ "The ustwo™ Pixel Perfect Precision Handbook 2 日本語版 | ラボ ｜ 株式会社コンセント | 株式会社コンセント")

こちらで配布されている日本語版 PDF の P18 でも進められているように個人的にも HSB は非常に色の調整がやりやすいです。

ちなみにこの PDF はおすすめなので1度見ることをおすすめします。

## デモアプリ等で適当な色が欲しい時

ランダムな色が欲しい場合は HSB のうち H の値を変えるだけでそれなりに色が変わります。特に連続した色が欲しい場合は H の値を順番にループさせてやれば非常にカラフルで小綺麗な色になります。

## 補助ツール

任意の色が欲しいとかはさすがに 

```objc
[UIColor colorWithHue:0.560 saturation:0.621 brightness:0.663 alpha:1.000]
```

とかいきなり書いたりはできないですよね。色を見ながら作りたいのでアプリで補助します。個人的におすすめは 

* [HexColor](https://itunes.apple.com/jp/app/hexcolor/id446103121?mt=12) 
* [Developer Color Picker](http://download.panic.com/picker/ "Developer Color Picker")

上記2つの合わせ技です。

HexColor は OS の Color Picker を単独のアプリとして動かせるアプリです。このアプリ自体にも色を Hex や NSColor に変換してPasteboardにはき出すことができますが、[Developer Color Picker](http://download.panic.com/picker/ "Developer Color Picker") プラグインを入れることで UIColor にも吐き出せるようになります。これらのアプリとプラグインは iOS 開発以外でも便利なのでおすすめです。他にも [sip](http://theolabrothers.com/sip/ "theolabrothers.com/sip/") なんかもあります。対応するフォーマットが多いのが特徴です。

## まとめ

HSB は同系色の調整が割と直感的にできるのでおすすめです。HSB だけでいろんな色を作るのは難しいかもしれませんが RGB でざっくり色を作ってから HSB で微調整するとか、スポイトツール的な機能で欲しい色を抜いてきて HSB で調整とかすると色の幅が広がっていいのではないでしょうか。
CmusをRuby ワンライナーでコントロールする

* #Cmusとは

   [Cmusの本家](https://cmus.github.io/)

* #そのワンライナー
Cmusで音楽を流しながら、新しいターミナルで、

```bash
$ ruby -r socket -e 'Socket.unix("#{ENV["HOME"]}/.cmus/socket"){|s| IO.copy_stream($<, s)}'
  player-pause <--コントロールコマンド 
  player-play
  seek +1m
　...
```
　　 全部のコントロールコマンドは[ここ](http://manpages.ubuntu.com/manpages/hardy/man1/cmus.1.html)「Common Context」節にあります。
JavaのRuntime.exec()をWindowsで使った場合、拡張子がexe以外のファイルはファイル名だけでは起動できない

#ことの起こり
ant の `exec` タスクを使っていたところ、 `notepad` は起動できるけど `groovyConsole` は起動できないという現象が発生。

色々ためしていたら、 `groovyConsole` を `groovyConsole.bat` にしたら起動できた。

#原因
調べてたら、 [Ant のマニュアル](https://ant.apache.org/manual/Tasks/exec.html) にそれっぽい記述を見つける。

> The <exec> task delegates to Runtime.exec which in turn apparently calls ::CreateProcess. It is the latter Win32 function that defines the exact semantics of the call. In particular, if you do not put a file extension on the executable, only ".EXE" files are looked for, not ".COM", ".CMD" or other file types listed in the environment variable PATHEXT.

`exec` タスクは `Runtime.exec()` を使っているが、それは最終的に `CreateProcess` という Windows の関数を使用している。
この `CreateProcess` は、拡張子を省略した場合 `PATHEXT` で指定している他の拡張子を全て無視して、 `.EXE` のファイルしか解決してくれないらしい。

このため、 `Runtime.exec()` メソッドを使った場合、たとえパスを通していても `.bat` などの非 exe ファイルはファイル名だけで起動することができない。

今回遭遇したケースでは、 `notepad` は `notepad.exe` だからファイル名だけで起動できたが、 `groovyConsole` は `groovyConsole.bat` しかなかったのでファイル名だけでは起動できなかった。

#Gradle の Exec も同じ
Gralde の [Exec](http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Exec.html) も同じ現象が発生する。


#参考
- [実行ファイルの拡張子を追加定義する － ＠IT](http://www.atmarkit.co.jp/fwin2k/win2ktips/842pathext/pathext.html)
- [Exec Task | Apache Ant™ 1.9.3 Manual](https://ant.apache.org/manual/Tasks/exec.html)
Unityでビルド時の画像差替

iOSアプリで画像を綺麗に表示するのにウェブテクノロジのClear PVRTCを利用しています。
開発中はPNGを利用しており、PVRTCは別途用意し、ビルド時に差し替えています。
差替方法として、依存関係を取得しPNGとPVRのGUIDを置換するようにしました。

同一フォルダにpngと差し替え用のpvrがあると過程したSample

```csharp:TextureConvert
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;

public class TextureConvert {

	public TextureConvert(string[] paths){
		AssetDatabase.StartAssetEditing();
		TextureDependenciesConvert(paths);
		AssetDatabase.StopAssetEditing();
	}

	string[] convertExtension = new string[]{ 
		".unity",
		".prefab",
		".mat",
		".asset",
	};

	Dictionary<string,string> GetConvertPath(string _path){

		Dictionary<string,string> convertList = new Dictionary<string,string>();

		foreach(string path in AssetDatabase.GetDependencies(new string[]{_path})){
			if (Path.GetExtension(path) == ".png"){ 
				string pvrPath = Path.ChangeExtension(path,".pvr");
				if (!string.IsNullOrEmpty(pvrPath) && File.Exists(pvrPath) && path != pvrPath){
					convertList.Add(
						AssetDatabase.AssetPathToGUID(path),
						AssetDatabase.AssetPathToGUID(pvrPath)
					);
				}
			}
		}
		return convertList;
	}

	void TextureDependenciesConvert(string[] paths){
		
		foreach(string path in AssetDatabase.GetDependencies(paths)){

			Dictionary<string,string> convertList = GetConvertPath(path);
			if (convertList.Count == 0) continue;

			string ext = Path.GetExtension(path);
			if (convertExtension.IndexOf(ext) > 0){

				StreamReader sr = new StreamReader(path,System.Text.Encoding.ASCII);
				string s = sr.ReadToEnd();
				sr.Close();

				StringBuilder sb = new StringBuilder(s);
				foreach(KeyValuePair<string,string> x in convertList){
					sb.Replace(x.Key, x.Value);
				}
				if (s != sb.ToString()){
					StreamWriter sw = new StreamWriter(path,false,System.Text.Encoding.ASCII);
					sw.Write(sb.ToString());
					sw.Close();
					sw = null;
				}
				s = null;
				sr = null;
				sb = null;
			}
		}
	}
}

```

Unityでは直接ファイルのGUIDを書き換えるドキュメントは見た事がないので、バージョン変わると出来なくなるかもしれません。
Javaのversion出力は標準エラー出力

```text:Windowsで実行
>java -version 1>out.txt 2>error.txt

>type out.txt

>type error.txt
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
```
Vagrant上のjavascriptで「Uncaught SyntaxError: Unexpected token ILLEGAL」


WebページをVagrantを使ってローカル環境で確認している時に「Uncaught SyntaxError: Unexpected token ILLEGAL」というエラーがconsoleで表示され、javacriptが動かなくなることがあります。

この時のjavascriptをChrome Developer Toolsで見たときに、末尾になぞの空白（Unicode U+200B??）が存在しているのであれば、javascriptのキャッシュを疑ってみてください。

##原因
Vagrantの「config.vm.synced_folder」を使って、javascriptのあるフォルダを共有フォルダに指定していると、ApacheがNFSとして認識してしまうために、Apacheがjavascriptをキャッシュしてしまうことに起因します。

##解決方法

httpd.confを修正するか、recipeで修正済みのhttpd.confを用意します。
今回は直接Vagrantにsshで接続し、httpd.confを修正しちゃいます。

1.Vagrantにsshで接続する

```shell
vagrant ssh
```

2.Apacheの設定ファイルであるhttpd.confをviで開く

```shell
sudo vi /etc/httpd/conf/httpd.conf
```

3.httpd.confの``EnableMMAP``と``EnableSendfile``の設定がコメントアウトされているので、これをOFFに設定しなおせばOK

```vi:httpd.conf
#EnableMMAP off
#↓↓↓
#コメントアウトをはずす
EnableMMAP off

#EnableSendfile off
#↓↓↓
#こっちも
EnableSendfile off
```
うまい棒約2本分の費用でサーバの脆弱性のスキャンをする

最近は個人で簡単にサーバを立ち上げられるようになりました。そこで心配になるのがセキュリティですが、なんと **うまい棒約2本分のコスト（20円くらい）、都合1時間で、きっちりとサーバの脆弱性を試験できます。**

それでは実際の手順に。

## 注意！
脆弱性スキャンをするのは、必ず、自身の管理するサーバにしてください。攻撃者は簡単に脆弱性を発見するためにこの手のツール（そもそも、全く同じツールの場合も）を使うことは多く、攻撃と区別がつきません。

## つかうもの
### Nessus
Tenable Network Security社が開発する脆弱性検知スキャナです。非商用（個人）は無料で利用できます。法人は年間サブスクリプションが$1,500/USD位です。

製品紹介
http://www.tenable.com/products/nessus

こいつのオープンソース版もあるので、商用利用したい＆お金が無い人はこいつを自力でがんばってセットアップしてください。（こちらだとさすがに初回で1時間は厳しいです）

OpenVAS
http://www.openvas.org

※OpenVASの構築については今回はやりません

### AWS
今回のインフラはコレです。その他のクラウドでも出来ますが、AWS Marketplaceを使うのでこいつで。AWSの契約がない場合は事前に済ませておいて下さい。

http://aws.amazon.com/jp/


## 手順
### 1. Nessus Homeの登録
Nessusを無料で利用するために、ユーザ登録をします。といっても、名前とメールアドレス、国を登録してさくっと終わり。

http://www.tenable.com/products/nessus-home

### 2. AWS Marketplaceからインスタンスを起動する
はい。今回使うNessusにはAMIがあるんです。

http://www.tenable.com/blog/nessus-ami-now-available-on-aws-marketplace

なので、マーケットプレイスでNessusで検索し、こいつを起動します。
**CPU中心に結構リソースを食うので**、ある程度CPUパワーがあるやつを使って下さい。私はc1.mediumを使いました。(AMIから起動したからだと思いますが、c3が使えなかった）

### 3. Nessusにログインする
AMIが起動したら、以下のURLにブラウザで接続しセットアップをします。

https://[server_addr]:8834

基本的には管理者ユーザの登録と、プラグイン（パターンファイル的なもの）等のアップデートです。アップデートは少し時間がかかるので10分くらいでしょうか。
終わったら先ほど作ったアカウントでログインできるので、ログインして以下の手順に。

#### 3-1. Policyの作成
管理画面上のPoliciesを選択し、"+ New Policy"を押して新しいポリシーを作成します。いくつかテンプレートがありますが、今回は"Basic Network Scan”で作ります。
基本的にはウィザードに答える形で簡単に作れると思います。 *最後に聞かれる認証情報は、それがあるとログインしていろいろ調べてくれますが、必須ではないので選択・入力しなくても大丈夫です。*


#### 3-2. Scanの作成
先ほど同様に、管理画面上のScansを選択肢、"+ New Scan"を押して新しいスキャン定義を作成します。これも画面を見れば判るくらい簡単です。
ちなみに作成が終わると、初期設定だと自動でスキャンが開始すると思います。

#### 3-3. レポートが出来るのを待つ
もしスキャンが開始していなかったら、Scanの一覧から手動で開始してください。環境にも依りますが、1サーバあたり概ね10〜20分くらいでスキャンが終わると思います。

#### 3-4. レポートを見る
はい、あとは見るだけです。HighとかCriticalがあったらがんばって直しましょう。英語ですが、対策の仕方なども書かれていると思います。

### 4. インスタンスを止める
忘れずにきっちり止めましょう。EC2なんで、どんどんお金がかかります。


## あとがき
Nessusは基本英語になりますが、亜種のOpenVASと比べてインターフェースはわかりやすいので、英語が苦手な人でもあまり苦にならないと思います。
セキュリティというとどうしても取っつき辛いところはありますが、EC2の基本操作さえ出来れば1時間あれば出来ると思います。ぜひチャレンジしてみてください。
Windowsマシンでvagrant-vbox-snapshotプラグイン使ってsnapshotとる

## 環境
OS : Windows 7
VirtualBox :  4.3.10
Vagrant : 1.5.1

## vagrantで作成しているマルチVM環境
|OS  |名前|
|----|----|
|Ubuntu 13.04 i386 |server |
|Ubuntu 13.04 i386 |client |

## プラグイン インストール
`vagrant plugin install vagrant-vbox-snapshot`
> Installing the 'vagrant-vbox-snapshot' plugin. This can take a few minutes...
> Installed the plugin 'vagrant-vbox-snapshot (0.0.4)'!

## vm起動
`vagrant up`

## snapshotとる
`vagrant snapshot take [vm-name] <SNAPSHOT_NAME>`
例) 
`vagrant snapshot take client initial`
> Taking snapshot initial
> 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

## snapshot一覧見る
`vagrant snapshot list [vm-name]`
例)
`vagrant snapshot list client`
> Listing snapshots for 'client':
>  Name: initial (UUID: aefd2188-8c47-4fef-8a98-d2c81b9af697) *

## client 弄ってみる
clientに入って`$ touch test.txt`

## 戻してみる
`vagrant snapshot go [vm-name] <SNAPSHOT_NAME>`
例)
`vagrant snapshot go client initial`
> Powering off machine e7574cb9-4950-4bb9-9b33-7d579b5f9c25
> 0%...10%...20%...30%...40%...50%...Restoring snapshot aefd2188-8c47-4fef-8a98-d2c81b9af697
> 60%...70%...80%...90%...100%
> Starting restored VM
> ==> client: Resuming suspended VM...
> ==> client: Booting VM...
> ==> client: Waiting for machine to boot. This may take a few minutes...
>     client: SSH address: 127.0.0.1:2200
>     client: SSH username: vagrant
>     client: SSH auth method: private key
>     client: Error: Connection refused. Retrying...
>     client: Error: Connection refused. Retrying...
>     client: Error: Connection refused. Retrying...
> ==> client: Machine booted and ready!

## 戻ったか確認
clientに入って`$ ll`してtest.txtが存在しない！  
戻ってる!スゲェ!これでやりたい放題だ!!

# 参考リンク
[vagrant-vbox-snapshot本家](https://github.com/dergachev/vagrant-vbox-snapshot)
MacでVirtualBoxとParallelsを併用するとMacが落ちるときはParallels Desktop 10を使うかVirtualBox4.2.12を使う。

VagrantでVirtualBoxの仮想サーバーを使おうとしてハマりました。
Mac上でParallelsとVirtualBoxを同時に使用すると、
Macが強制的に再起動してしまう問題が有ります。

※この問題は Parallels Desktop 10 では解決したようです。

詳しい内容はこちらにまとめました。
[Mac OS X で VirtualBox と Parallels Desktop を同時に使用するとコンピュータが強制終了する](http://niwatako.info/20140329/article1406.html)

回避策ですが、Parallels Desktop 10では解消しているようです。
[KB Parallels: Mac reboots when you attempt to launch Parallels Desktop 8/9 and Virtual Box simultaneously](http://kb.parallels.com/en/115966)
> Resolution
> for Virtual Box:
> [Upgrade Parallels Desktop to version 10.](http://www.parallels.com/products/desktop/)

(2015/06/12 Parallels Desktop 10 について記載を更新)

9以下を使用中の場合で、VirutalBoxが古くても構わない場合は
バージョン4.2.12のVirtualBoxを使用すれば強制再起動は発生しません。

[Download VirtualBox (Old Builds): VirtualBox 4.2](https://www.virtualbox.org/wiki/Download_Old_Builds_4_2)
4.2.12は多分2ページ目の一番上にあります(2014/03/29現在)。
3状態チェックボックス（HTML5だけど古いIEでも動く）


## 3状態のチェックボックス

* チェック状態
* 非チェック状態
* 中間状態（不定状態?） 

これを、Webでやりたい。できれば画像とか使わないで。

### indeterminateプロパティ

HTML5では、inputのindeterminateプロパティが使えます。

### 具体例

こんな感じです。

![スクリーンショット 2014-03-29 22.18.29.png](https://qiita-image-store.s3.amazonaws.com/0/12889/90a5cd91-14ea-ec97-4a6c-3c2e14357fa7.png "スクリーンショット 2014-03-29 22.18.29.png")


```html
<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8" />
  <title>3 state chexkbox</title>
  <script>
    function indeterminateTest(){
        var checkbox = document.getElementById('target');
        checkbox.indeterminate = true;
    };
  </script>
  </head>
<body onload="indeterminateTest();">
  <div>
    <p>3 state checkbox</p>
    <ul>
      <li><input type="checkbox" checked >checked</li>
      <li><input type="checkbox" >unchecked</li>
      <li><input type="checkbox" id="target">indeterminate</li>
      <li><input type="checkbox" indeterminate >これはindeterminateにはならない</li>
    </ul>
  </div>
</body>
</html>
```

jQueryだったらこんな。

```Javascript
$('#target').prop('indeterminate', true);
```

### HTMLとJavaScriptだけで実現できる

HTML4では、Webで3状態のチェックボックスを実現しようとすると画像を使う必要があったのですが、HTML5ではindeterminateプロパティを使えばHTMLとJavaScriptだけで行けます。しかも古いIEも対応してる!!
これはノンデザイナーにはありがたいです（私はすごくありがたかった）。

### 注意

indeterminateはHTMLでは指定できなくて、Javascriptから操作する必要があります。
また、indeterminateは単なる見た目の指定（checkedプロパティは状態を表す）なので、動きは自分で書く必要があります。

### おおまかな動作条件

主要なブラウザ（chrome, FireFox, safari, IE）の最近のバージョンでは動きます。古い方は、少なくともIE7、FireFox5で動くことは確認しました。

windowsのsafari5は動かなかったですね。
[html5testのsafari5](http://html5test.com/compare/browser/safari-5.0.html)を見るとinput=checkboxのindeterminateプロパティは"yes"になっていたのですが。macの話なのでしょうか。


## 参考にしたサイト

最近になって CSS Tricks というサイトで indeterminate のことを知りました。詳しく解説されています。デモもあります。

[Indeterminate Checkboxes - CSS Tricks](http://css-tricks.com/indeterminate-checkboxes/)

本家（?）というとこちらでしょうか。

[W3C]
(http://www.w3.org/TR/html5/forms.html#dom-input-indeterminate)
rubyのp, putsとUnicode

初めての投稿です．
**今までやってきたことがなんとなく自分の中で無駄になっている気がしたので，とりあえずまとめておいて自分でも見れるようにしたいと思い，記事として残しておくことにしました．(同じことで詰まる人が少しでも減ればという思いもちょっと含めて)**

最近rubyを始め，RSSを取得して表示するということをやろうとした際に詰まったところです．

RubyのRSS取得，parseをする際に，便利なライブラリの**Feedjira(旧名:Feedzirra)**(またこれに関しても記事に後日まとめます．)があることを知り，早速行うことにしました．

基本的な使い方としては，
`feed = Feedjira::Feed.fetch_and_parse(<URL>)`
とするだけでrssの取得ができます．(簡単!)

しかし，そのチェックのため，文字列を書き出してみたところ，
"\u3010 29\u65E5\uFF08\u571F\uFF09 \u6D25\u8EFD\uFF08\u9752\u68EE\uFF09 \u3011 \u66C7\u308A - 17\u2103/10\u2103 - Yahoo!\u5929\u6C17\u30FB\u707D\u5BB3"
とUnicodeの文字列が・・・
pythonでやったときはこんなことなかったのに・・・

最初はparseの問題かと思い，色々調べましたが，どれもうまくいかず・・・
途方に暮れていたところ，友人からUnicodeの変換について書いてある記事を教えてもらい，それを参考に実装．
以下の様に書いたところ，うまく出力されました．
```rb
puts str.gsub(/\\u([\da-fA-F]{4})/){
    [$1].pack('H*').unpack('n*').pack('U*')
}
```

これは分からんでしょｗｗｗ
と思っていたが，翌日，これを使って別のRSSから取得するコードを書いたところ，またUnicode文字が・・・
前のコードと見比べてみても特におかしいところがないので，混乱状態・・・

しかし，全く関係ない(というかもはや同じだと思っていた)pとputsが違うことに気づき，putsに変えてみるとちゃんと出力．
rubyを知らな過ぎたこともあり，初歩的な部分でのミスでした・・・

ちなみに，ここから出力系のメソッドについて調べ，以下のサイトにまとめてあったので載せておきます．
[シリコンバレー ２４時: Rubyの表示メソッド](http://www.skymerica.com/blog/yotsumoto/arch/2006/11/18/000594.html)
要は，pだとそのまま表示されちゃうっぽいですね・・・

これからも色々挙げていこうと思うので，よろしくお願いします．
Titanium Androidアプリで通知バーにメッセージを表示


TitaniumでAndroidアプリの通知バーにメッセージを表示(+クリックされた自アプリを起動)する方法を調べたのでメモ。
サーバからの通知を受け取ったりする処理は対象外。

# 通知の作成及び送信するコード部分


```javascript:
		var notification = Ti.Android.createNotification({
			//通知領域に表示されるアイコンの指定
			icon: Ti.App.Android.R.drawable.appicon,
			//通知領域に表示されるメッセージのタイトル部分
			contentTitle: 'contentTitle',
			//通知領域に表示されるメッセージ部分
			contentText: 'contentText',
			//通知領域の右側に表示される付属情報.多分数字だけしか指定できない.
			number: 5,
			//クリック時に発行されるIntentの指定
			contentIntent: pending,
			//以下の値を指定しておかないと通知時にLEDが光らないし、バイブも起きない
			//音は使ってないからDEFAULT_LIGHTS | DEFAULT_VIBRATEでもいいかも
			defaults:  Titanium.Android.DEFAULT_ALL, // DEFAULT_LIGHTS | DEFAULT_SOUND | DEFAULT_VIBRATE
			//画面を切ってる際に通知があることを知らせる為にLEDを光らせる
			flags: Ti.Android.FLAG_SHOW_LIGHTS,
			//通知メッセージが届いた際に画面上部の通知領域に表示されるメッセージ
			tickerText: "tickerText"
		});
		//通知番号は通知メッセージを識別するのに使う
		//同じ通知番号の通知を２つ以上送っても通知領域に表示されるメッセージは１つだけ
		//異なる通知番号の通知を送ると複数の通知が通知領域に表示される
		var notificationId = 1;
		Ti.Android.NotificationManager.notify(notificationId, notification);
```


# 通知メッセージクリック時に自分のアプリを起動するインテント作成

```javascript:
		var intent = Ti.Android.createIntent({
			flags : Ti.Android.FLAG_ACTIVITY_CLEAR_TOP | Ti.Android.FLAG_ACTIVITY_NEW_TASK,
			className: 'com.example.notificationbar.NotificationbarActivity'		
		});
		var pending = Ti.Android.createPendingIntent({
			intent: intent,
			flags: Titanium.Android.FLAG_UPDATE_CURRENT 
		});
```

インテント生成時に指定するclassNameは自分のアプリのアクティビティ名.
以下はTitaniumで生成される場合のActivity名の命名規則。

```
<app_id>.<Appname>Activity
<app_id> : アプリケーションのapp ID(tiapp.xmlのidタグの値)
<Appname> : アプリケーションの名前(但し、最初の文字だけ大文字で後は全部小文字になる)
```
#通知するためのサンプルコード全体

```javascript:
		var intent = Ti.Android.createIntent({
			flags : Ti.Android.FLAG_ACTIVITY_CLEAR_TOP | Ti.Android.FLAG_ACTIVITY_NEW_TASK,
			className: 'com.example.notificationbar.NotificationbarActivity'		
		});
		var pending = Ti.Android.createPendingIntent({
			intent: intent,
			flags: Titanium.Android.FLAG_UPDATE_CURRENT 
		});
		var notification = Ti.Android.createNotification({
			icon: Ti.App.Android.R.drawable.appicon,
			contentTitle: 'contentTitle',
			contentText: 'contentText',
			contentIntent: pending,
			defaults:  Titanium.Android.DEFAULT_ALL, // DEFAULT_LIGHTS | DEFAULT_SOUND | DEFAULT_VIBRATE
			flags: Ti.Android.FLAG_SHOW_LIGHTS,
			tickerText: "tickerText",
			number: 5
		});
		var notificationId = 1;
		Ti.Android.NotificationManager.notify(notificationId, notification);
```


# 参考URL

Notifications
http://developer.android.com/guide/topics/ui/notifiers/notifications.html

GCM push notifications for Titanium (made easy)
http://iamyellow.net/post/40100981563/gcm-appcelerator-titanium-module

Titanium.Android.NotificationManager
http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.Android.NotificationManager

Android Notifications
https://wiki.appcelerator.org/display/guides/Android+Notifications
foreachよりlist,eachのほうがメモリを消費しないというお話を検証してみた


<blockquote class="twitter-tweet" lang="ja"><p>最近の若い子たちはPHPでforeachを使わないという選択肢をもっていないようだ。ちなみに糞でかい配列まわすときはlist,eachつかったほうがいいよな気がしたけど気のせいかな。&#10;<a href="https://t.co/osKTAOlrY7">https://t.co/osKTAOlrY7</a></p>&mdash; はいぱふぉーまんすポリドッグ (@polidog) <a href="https://twitter.com/polidog/statuses/449621433384067072">2014, 3月 28</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ちゃんと検証しなさいと突っ込まれてしまったので検証してみました。

## 検証コードは以下の二つ

``` test1.php
<?php
$data = [];
for($i = 0; $i < 800000; $i++) {
  $data[] = "あ";
}
echo "point1:".memory_get_usage()."\n";
foreach ($data as $d) {}
echo "point2:".memory_get_usage()."\n";
```

``` test2.php
<?php
$data = [];
for($i = 0; $i < 800000; $i++) {
  $data[] = "あ";
}
echo "point1:".memory_get_usage()."\n";
while(list($key, $value) = each($data)) {}
echo "point2:".memory_get_usage()."\n";
```

これでちゃんと検証できるのか自信はないんですが、まあこんなコードにしてみました。
環境はMBAでphpbrewな環境で`php-5.4.26`で実行させてます。
ちなみに`php-5.5.10`でも実行させましたが、結果はほとんど変わらないです。

## foreachを使ったループ、test1.phpの実行結果

| 回数 | point1(kb) | point2(kb) | time(s) |
|:-----------:|------------:|------------:|------------:|
| 1 |  114664.87 | 114664.98    | 0.14
| 2 |  114664.87 | 114664.98    | 0.14
| 3 |  114664.87 | 114664.98    | 0.13
| 4 |  114664.87 | 114664.98    | 0.14
| 5 |  114664.87 | 114664.98    | 0.13

## list,eachを使ったループ、test2.phpの実行結果

| 回数 | point1(kb) | point2(kb) | time(s) |
|:---:|-----------------:|-------------------:|:--------:|
| 1 |  114665.06 | 114665.27    | 0.32
| 2 |  114665.06 | 114665.27    | 0.32
| 3 |  114665.06 | 114665.27    | 0.33
| 4 |  114665.06 | 114665.27    | 0.36
| 5 |  114665.06 | 114665.27    | 0.34

## 結果から見えてくる事
foreach使ってた方が全然よいですね。メモリ使用量はそんなにかわらないし、速度はlist,eachのほうが遅いし・・・
まあ今の時代list,eachなんて使う人はいないか。
homeshickを使ったdotfilesの管理


## homeshick
[homesickとhomeshickの違い](http://qiita.com/yu_suke1994/items/37e626ec9b479f72f854)でも述べたように、homeshickはシェルスクリプトで書かれたdotfiles管理のためのアレです。

## 実行環境

- Linux Mint 16 Cinnamon 64bit
- Linux Kernel 3.11.0-12-generic
- GNOME 端末 3.6.2

要は普通のシェルなら動きます。cshもtcshもfishもzshも一緒です。
とりあえずbash(zsh)の場合で話を進めます。

## インストール

```bash
~ $ git clone git://github.com/andsens/homeshick.git 
~ $ printf '\nsource "$HOME/.homesick/repos/homeshick/homeshick.sh"' >> $HOME/.bashrc
~ $ printf '\nsource "$HOME/.homesick/repos/homeshick/completions/homeshick-completion.bash"' >> $HOME/.bashrc
~ $ source .bashrc 
```

1行目でhomeshickの本体をcloneし、2行目でhomeshickへのPATHを通し、3行目でtab補完のための設定をし、4行目で通したPATHの反映をします。3行目のはbashとzshで変わってきます。

```zsh
~ $ printf '\nfpath=($HOME/.homesick/repos/homeshick/completions $fpath)' >> $HOME/.zshrc
```

zshならこう書きます。

ちなみに、ディレクトリ名が`.homesick`になっているのは、前述の[homesick](https://github.com/technicalpickles/homesick)との互換性を意識してのことだろうと思われます。

## dotfilesの管理

```bash
~ $ homeshick generate my_shick_castle
~ $ touch .vimrc
~ $ touch .gvimrc
```
homeshickでは(homesickでもそうですが)dotfilesの管理は`castle`という単位で行われます。まずcastleを`generate`コマンドで作成します。補完が効くので`gene`くらいでtabを押せばだいぶ楽になると思います。
castleができたら、今までに書き溜めてきたdotfilesを早速管理します。(上ではまさに今作ってますけど)

```bash
~ $ homeshick track my_shick_castle .vimrc .gvimrc
```

`track`コマンドに続けてcastleの名前、追加したいdotfilesを指定することで、dotfilesの本体はcastleの中に入り、ホームディレクトリにはそのシンボリックリンクが張られます。

```bash
~ $ homeshick cd my_shick_castle 
~/.homesick/repos/my_shick_castle $ ls -la
合計 16
drwxr-xr-x 4 unasuke unasuke 4096 3月 28 23:42 .
drwxr-xr-x 4 unasuke unasuke 4096 3月 28 23:42 ..
drwxr-xr-x 7 unasuke unasuke 4096 3月 28 23:53 .git
drwxr-xr-x 2 unasuke unasuke 4096 3月 28 23:53 home
```

では、どのように管理されているかを見てみます。(homeshickの)`cd`コマンドに続けてcastleの名前を入力すると、実際に管理されているcastleディレクトリの中に移動します。`ls`すればわかるように、gitで管理されています。
あとは、GitHubやbitbucketで作った空のリポジトリにpushしてしまいましょう。

## dotfilesの取得
新しいマシンに今までのdotfilesを移したり、よく出来ているdotfilesをGitHubから持ってきたりしたいときには、`clone`コマンドを使います。

```bash
~ $ homeshick clone robbyrussell/oh-my-zsh
```

この場合、`oh-my-zsh`というcastleが新たに作成されます。既存のcastleがある場合、競合を避けてか、シンボリックリンクは張られません。外部のリポジトリも含めた管理をするなら、submoduleとして導入したほうがいいでしょう。

また、 **ディレクトリに対してはシンボリックリンクを張ってくれない** ので、自分でシンボリックリンクを作成する必要があります。

```bash
~ $ ln -s ~/.homesick/repos/my_shick_castle/home/.vim .vim
```


## submoduleやディレクトリの管理
submoduleとして導入する場合や、ディレクトリの管理を行いたい場合、castleディレクトリ内のhomeディレクトリに実体を移し、手動でシンボリックリンクを張る必要があります。


これは、 **もともとホームディレクトリにあった実体をcastleディレクトリに移しシンボリックリンクを張る** ため、はじめからホームディレクトリに存在しないものについては何もしてくれないっぽいからです。

「`track`できないの」と思うかもしれませんが、`track`コマンドではディレクトリを指定することができないため、例えば[Shougo/neobundle.vim](https://github.com/Shougo/neobundle.vim)を新たに`track`したいと思っても、ファイルのパスをすべて列挙して指定しなければならず、不便です。

## まとめ

 - `homeshick generate castle_name`で管理する単位を作る

 - `homeshick track castle_name file_name`で管理開始

 - `homeshick clone username/reponame`で持ってくる

 - ディレクトリへのシンボリックリンクは手動

## 参考
[andsens/homeshick](https://github.com/andsens/homeshick)
[Homeshickでdotfilesを管理することにした](http://befool.co.jp/blog/jiska/homeshick-git-dotfile-synchronizer/)
[Git Submodules: コアコンセプト、ワークフロー、コツ](http://japan.blogs.atlassian.com/2013/07/git-submodules-workflows-tips/)
Webで見つけた拡張子のない画像を専ブラでサムネ表示できるように直リンする

時々

http://example.com/img/Hax98a

みたいな画像URLがある。
そのまま2chに貼ると専ブラで画像として認識してくれない。

それを無理やり画像として認識させるには…

http://example.com/img/Hax98a?.jpg

こうすればいい。
末尾に`?.jpg`とつける。png画像なら`?.png`。
`?`から先はクエリ文字列として解釈されるから、
大抵のサイトでは無効なパラメータとして無視される。
SQL Server 用の sqldump

MySQL では、データベースの内容をSQL形式でバックアップを取ることができますが、SQL Server にはありません。

普通にバックアップを取ると bak 形式となり、テキストエディタでは読めなくて不便なので、SQL形式にする関数を作りました。

[DumpSQLServer - GitHub](https://github.com/takashi-noboru/DumpSQLServer)

なお、gDB.ExecuteSQL() 関数は、String 型の引数 で受け取った SQL 文を実行して、 DataTable 型の結果を返すという関数です。
Serverspec (1/3) ：はじめに

Serverspecなるものがあるらしい。<br>

Serverspecについてまずは調べてみた。

* コマンド実行結果や設定ファイルの内容をテストコードで設定した結果と比較してくれるもの
* Ruby実装
* RSpecに準拠した記述方法
* テストはローカル又はSSH経由で実行できる⇐重要



ただ、少し気になる点も見つけた。<br>

1. 導入方法
他の人の導入方法を見るとgemコマンドで簡単にインストールできるらしい。
`$ gem install serverspec`
商用機だの開発機はスタンドアロン環境で構築・運用されていくのが普通だろう。
なのでgemコマンドでは使えない。<br><br>

1. テストの方法
各コマンドはsudo経由で実行されるらしい。
sudoは設定を入れないと使えない上に、テストをするために商用機に設定を入れるのもナンセンスである。<br><br>

よってココらへんについてどうにかする方法調べたのでまとめてみた。
具体的には以下のことを行う。
1.についてはスタンドアロン環境でインストールができること。
2.についてはsudoのかわりにsu -cを用い、Serverspec導入コストを下げる。

* [Serverspec (2/3) ：スタンドアロン環境へのServerspecインストール](http://qiita.com/sumih/items/1f2c653a980a5a4a858a)
* <del>Serverspec (3/3) ：テストコードの実行をsu -cでも可能とする</del>⇛作成中

なお、今回の扱うPP、サーバ構成は以下の通り。
OS:RHEL 6.4(2.6.32-358.el6.x86_64)
Ruby:2.1.1
RubyGems:2.2.2
Serverspec:1.0.0
運用サーバにServerspecをインストールし、運用セグメント経由で各サーバのテストをSSH経由で行う。

![スライド02.jpg](https://qiita-image-store.s3.amazonaws.com/0/40643/35ec240a-7721-88c6-aaf6-88e8f294869e.jpeg)
macにchefとknife-soloをインストールする（rbenv）

#macにchefとknife-soloをインストールした時のメモ

##前提
rbenvインストール済
参照：[Ruby on Railsの導入](http://qiita.com/EaleLove777/items/0bcafb66c0de6c9b9ee5)

##やること

* chef インストール
* knife-solo インストール

## chef インストール

```
gem install chef
```
何故か--no-ri --no-rdocつけてるとインストールできずハマった。。。

## knife-solo インストール
```
gem install knife-solo
```

以上。

knifeコマンド見つからなくてなんでだよって思ってコンソール立ち上げ直したらあっさり見つかった。

```
rbenv rehash
```
お前か。。。

rbenvではgemをインストールまたはアンインストールするたびにrbenv rehashする必要があるので
自動化したい場合はrbenv-rehashを入れるとよろしい(https://github.com/ryansouza/rbenv-rehash)
頭の体操的な問題2_フィボナッチ数列

2014.3.29の第14回ゆるびぃ会で出題した問題の記録です。

問. フィボナッチ数列を10番目まで出力する。
==========
- 0,1からスタート
- 制限時間は10分。
- 言語はなんでもOK。

ちなみに私は以下のように書きました。
----------

```ruby:fizzbuzz.rb
fib = Fiber.new do
  first = 0
  second = 1
  Fiber.yield first
  Fiber.yield second
  loop do
    tmp = first + second
    Fiber.yield tmp
    first = second
    second = tmp
  end
end

10.times { puts fib.resume }
```

[前回](http://qiita.com/shunsugai@github/items/950e9deadd953de7c95c)、コメントで教えていただいたFiberを使ってみました。

「もっと良い解き方がある！」とかリベンジしたいという方はコメントお願いします。
コメントでもコードを書けます。
AWS Workspacesメモ

3月27日からAWS Workspacesが、利用可能になったので投稿の練習のついでにセットアップしてみたメモ。


# AWS Workspacesって？

AWS re: Invent 2013で発表されたサービスで、ユーザのデスクトップ環境を簡単にクラウド環境上にセットアップできるのだとか。
Windows や iOS , Android , iPadからも簡単にアクセスすることのできる環境が手に入るとのこと。
わざわざ、Macにwindows OSを導入することなく手軽に利用できる環境が手に入るのは魅力的かも？

私は、家でもWindows環境なのでそこまで必要ではないと発表当時考えていなかったのですが、副業が提督の身としてはAndroid,iPadからアクセスできるというのはとても気になるのでセットアップしてみた。





# AWS Workspaces環境のセットアップ
データセンターを選びます。US East , US Westしかまだ選べないぽいです。

![AWS_WS_4.JPG](https://qiita-image-store.s3.amazonaws.com/0/36221/52f872c9-2892-0410-df3c-813a53aeaef2.jpeg)



ホーム画面？のworkspacesを選択。
![aws-workspaces.JPG](https://qiita-image-store.s3.amazonaws.com/0/36221/2cdcc62d-6c41-b6f7-8a5c-aad0f3656936.jpeg)



バンドルと各項目を埋める。
バンドルは、4種類あるけどとりあえずここではStandardを選択し「Provision Workspaces」を押す。
![AWS_WS_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/36221/cd354f69-85b4-4aa8-7e1d-8ef58f3c522f.jpeg)



これだけで、リモートデスクトップ環境のセットアップが開始されました。
![AWS_WS_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/36221/8b2ca2bb-ac57-3b64-d826-c90fb5e4eed1.jpeg)



[Workspaces]画面を覗いてみると、[Pending]状態でステータスが表示されます。
ここからRunningになるまで待つ・・・（だいたい20分くらい）
![AWS_WS_3.JPG](https://qiita-image-store.s3.amazonaws.com/0/36221/c71ff3b8-06cd-cfca-c0f8-eaae04618de1.jpeg)



ステータスが[Running]に変わったころ、登録したEmailアドレスにAWSからメールが届きます。

![AWS_WS_5.JPG](https://qiita-image-store.s3.amazonaws.com/0/36221/de15d5d5-e7e2-cf20-4ac7-8cbb95740eb0.jpeg)



メールには３つのステップが書かれています。あとは順番に進めるだけです。
1つ目のリンクからユーザプロファイルの設定画面に飛びます。
ここでパスワードを設定します。

![AWS_WS_7.JPG](https://qiita-image-store.s3.amazonaws.com/0/36221/6ee7e60b-f53f-44fb-afd8-a6013de1017c.jpeg)


パスワード設定後、クライアントダウンロード画面に飛びます。
ここでクライアントアプリをダウンロードしインストールをします。


![AWS_WS_8.JPG](https://qiita-image-store.s3.amazonaws.com/0/36221/0048778d-719a-801c-7e62-29508d824118.jpeg)


クライアントアプリをインストールし起動すると、registration code codeを聞かれるので、メールに書かれているregistration code Codeを
入力すればクライアントのセットアップ完了です。


あとは、先ほど登録したパスワードでログインできます。
![AWS_WS_9.JPG](https://qiita-image-store.s3.amazonaws.com/0/36221/b6b17bfc-ab19-5c06-5720-b2ea08f7784d.jpeg)

こんな感じ。デスクトップ画面には元からFireFoxのショートカットが設定されていました。
![AWS_WS_10.JPG](https://qiita-image-store.s3.amazonaws.com/0/36221/c4649787-fcc9-f552-eecc-03bc29ae06a8.jpeg)


##少し触ってみて

* 環境が英語なのでいろいろとセットアップが必要？
* やはり遅延があるのでまだ厳しいか。Tokyoリージョンでのサービス開始に期待。
* 利用料は帯域料金もすべて含まれるそう。Tokyoリージョンでのサービス開始時には増税の影響で値段がおもったよりも高くなったりするのかな？
* Mac環境しかない人には、便利なサービスになるかも？


とにかくセットアップが簡単。早くTokyoリージョンでサービス開始して欲しい。個人的には、GPUが利用できるバンドルもつけて欲しかったな・・・。
MacでPVRを表示する

PVRを表示するにはPVRTexToolGUIが一般的だが、インストールにはユーザ登録の必要があるので少々大変。

pvrを表示するには下記ページのソフトが便利。
http://www.limbic.com/quickpvr.html

ダウンロードして解凍後
/Library/Quicklook folder に quickpvr.qlgenerator を入れるだけ。

コマンドに設定しておくと更に便利
`$ alias ql='qlmanage -p "$@" >& /dev/null'
$ ql hoge.pvr`
要素のリサイズイベントを取得


要素のリサイズイベントを取りたいが、jQueryだけでは出来ないみたいなので、探していたらこういうものを見つけた。

http://d.hatena.ne.jp/cyokodog/20101101/exresize01
https://github.com/cyokodog/jquery.ex-resize

ただ、このままだとjQuery1.9以降でエラーがでるみたいなので、その部分だけとりあえず動くようにしてみた。
この変更を入れると、古いブラウザに対応できなくなるのかな？
古いブラウザも対応する必要がある場合は、ここのブラウザ判定処理をそれ用に書き直せばいけると思う。

```javascript
$.ex.resize = function(idx , targets , option){
	if ($.isFunction(option)) {
		option = {callback : option};
	}
	var o = this,
	c = o.config = $.extend({} , $.ex.resize.defaults , option);
	c.targets = targets;
	c.target = c.watchTarget = c.targets.eq(idx);
	c.index = idx;
	// ----------
	// c.oldBrowser = $.browser.msie && ($.browser.version < 8.0 || !$.boxModel);
	c.oldBrowser = false;
	// ----------
	c.key = { height : '', width : ''};
	if (c.contentsWatch) {
		o._createContentsWrapper();
	}
	c.currentSize = c.newSize = o.getSize();
	if (c.resizeWatch) o._resizeWatch();
}
```

使い方。

```javascript
$("#elid").exResize(function() {
	// 処理
}
```
AWS EC2 でSSH ログインするユーザを追加する

## 確認事項

* Ubuntu インスタンスを立ち上げたので、sshログインユーザ名はubuntu
* ローカルマシンもUbuntu (Desktop ver.)
* 初期ユーザ(ubuntu)の他にユーザ(deployer)を追加したい
* 追加ユーザへはSSH でアクセスできるようにしたい
* 間違いや改善点があればツッコミを

---

大まかな手順としては、

1. [EC2]  sshdの設定をして、ユーザの追加
2. [Local] ssh-keygen して、scp で公開鍵(.pub)をアップロード
3. [EC2]  アップした鍵を新規ユーザの~/.sshフォルダに保存
4. [EC2]  ディレクトリ、ファイルの所有権、アクセス権を適切に設定

## [EC2] sshd の設定、ユーザの追加

### sshd の設定

```:/etc/ssh/sshd_config
...
#AuthorizedKeysFile %h/.ssh/authorized_keys
...
```

とコメントアウトされているので、コメントアウトを外す。(これで ~/.ssh/authorized_keys で認証できるように。)

このままだと設定が有効にならないので、`sudo /etc/init.d/ssh restart` して再読み込み。

### ユーザの追加

```
adduser deployer          # ユーザの追加
usermod deployer -g admin # admin グループに追加
```

## [Local] ssh-keygen, scp

いったんローカルに戻って、鍵の作成とアップロードをする

```
cd ~/.ssh/
ssh-keygen -f aws
scp aws.pub ubuntu@xxx.xxx.amazonaws.com:/tmp
```

そして再びEC2 インスタンスにubuntu ユーザとしてログイン。

## [EC2] 公開鍵を保存

`/tmp/aws.pub` に公開鍵を保存したので、sshd での設定に習ってdeployer のホームディレクトリ下に鍵をリネームして配置する

```
# ファイルの移動
whoami    # => ubuntu
sudo su - deployer
whoami    # => deployer
pwd       # => /home/deployer
mkdir .ssh
mv /tmp/aws.pub ~/.ssh/authorized_keys
```

## [EC2] フォルダ、ファイル権限の設定

```
whoami    # => deployer
pwd       # => /home/deployer
sudo su
whoami    # => root
chmod 700 .ssh
chown deployer:admin .ssh
chmod 600 .ssh/authorized_keys
chown deployer:admin .ssh/authorized_keys
```

### ユーザの削除
ユーザが要らなくなったら、`userdel -r deployer` であとしまつ。

## Links

* [Tips for Securing Your EC2 Instance : Articles & Tutorials : Amazon Web Services](http://aws.amazon.com/articles/1233)

---

(ただ `ssh-copy-id` したかっただけだったのに...)
Fabricで起動時にsudoパスワードを入力する


Fabricで時間のかかる処理をしていて、処理の途中でパスワードの入力を求められると、そこで処理が止まってしまっていて、不便に感じることがあります。

`fab -I`または`fab --initial-password-prompt`とオプションをつけて起動すると、パスワードを必ず実行時に入力するように強制することが出来ます。`.zshrc`などで`alias fab="fab -I"`などと設定しておくと、便利かもしれません。
Core Dataでスカラー値をプリミティブ型のプロパティで扱う方法

`NSManagedObject`のサブクラスを作るとき、XcodeでジェネレートするとデフォルトではIntegerやBooleanの属性が`NSNumber`のプロパティになります。

```objc
@property (nonatomic, retain) NSNumber *number;  // Integer 32
@property (nonatomic, retain) NSNumber *yesOrNo; // Boolean
```

これはコレクションに値をそのまま放り込めるメリットはありますが、値を使いたいときにいちいち`integerValue`や`boolValue`を呼ぶ必要がありますし、セットするときは`@()`でくくる必要があって何かと面倒です。

特にBooleanの場合、

```objc
if (obj.yesOrNo) ...
```

とやってしまいがちで大変危険です。（この場合値が`@(NO)`でもif文判定は真になる）

このようなときはプリミティブ型のプロパティを利用する事ができます。やり方はプロパティの宣言を書き換えるだけです。

```objc
@property (nonatomic) int32_t number;
@property (nonatomic) BOOL yesOrNo;
```

Xcodeでジェネレートするときはファイル保存時のダイアログで「Use scalar properties for primitive data types」にチェックを入れれば上記のようなコードが生成されます。

[Appleのドキュメント](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html)にはプリミティブ型を使いたい場合はアクセサメソッドを自分で実装する必要があると書かれていますが、iOS 5からは自動生成されるようです。したがって実装部は`@dynamic number, yesOrNo;`としておくだけで大丈夫です。

## 参考リンク
- [Data Models and Model Objects - Core Data - objc.io issue #4](http://www.objc.io/issue-4/core-data-models-and-model-objects.html)
即売会サービスを作ろう1


##背景

最近決済システムがリプレイスされて簡単になっているので
スマホ向け即売会サービスを作ります。


##即売会サービスとは

![screenshot.jpg](https://qiita-image-store.s3.amazonaws.com/0/2029/b56ed26c-077f-e39c-2582-51bc29f48cab.jpeg "screenshot.jpg")

このような画面で出店するも購入するも自由なサービスでスマホだけで完結するようにします。
いままでのネットショップサービスと違い、クオータービュー上のマップにすることでサークル同士の親近感、購入者の動線を作ります。
また即売会というだけあってチャット機能を提供して売り手と買い手をつなぎます。


##開発の順番
* ログイン
* アイテム管理
* フィールドマップ
* 購入処理

の順番に作っていきます

##本日の作業
ログイン機能と土台作った
https://github.com/nagai/freemarket


https://github.com/nagai/freemarket/blob/master/server/controller/user/api/account.py#L21

アプリを起動するとサーバにログインリクエストが送られてサーバはAuthTokenを返します。
アプリからリクエストを送るときは必ずこのAuthTokenをヘッダに含めて行うことで
最後にログインしたものかどうかの簡単な認証を行います。


##次の作業
アイテム管理機能を作るにあたってのDB設計とコーディング
シェルスクリプトからAWKに文字列を渡す時、本当に正しく渡せていますか？

# 問題（正解率25%……独自調査）

シェル変数`$s`に格納された文字列をAWKに渡し、文字列をそのまま表示すると共に、文字数を表示するコードを書いてください。ただし、 **`$s`は英数のみならず記号類が入っている可能性があります。** また、標準入力は使ってはいけないものとします（他のデータが受け取れなくなってしまうため）。

# よくある誤解答

次の回答はどちらも不正解です。

## その1（AWKソースコードに直接埋め込む）

```sh:誤解答1
awk 'BEGIN{s="'"$s"'"; print s; print length(s);}'
```

## その2（AWK -vオプションを使う）

```sh:誤解答2
awk -v s="$s" 'BEGIN{print s; print length(s);}'
```

## 反例

「うそだー」と思うなら、`$s`にバックスラッシュを含む文字列をセットして実行してみてください。

```sh:反例
$ s='\\'
$ echo "$s"
\\                # ← $sには、確かにバックスラッシュ2個が入っている
$ awk 'BEGIN{s="'"$s"'"; print s; print length(s);}'
\
1                 # ← あれ?
$ awk -v s="$s" 'BEGIN{print s; print length(s);}'
\
1                 # ← あれあれ?
```

# 解説

## 誤解答1,2が含む問題

AWKは、文字列を取り込む時に一部の記号をエスケープ処理してしまい、文字列が変わることがあります。（`\`はその記号の一つ）

それだけではありません。記号類が含まれていると、それが取り込み対象の文字列の一部なのか、それとも取り込むために記述している構文で出てくる記号なのかの判断を誤る場合があります。例えば、誤解答1ではダブルクォーテーション`"`が含まれていると失敗しますし、誤解答2では先頭にイコール`=`が含まれていると失敗します。

## じゃあどうすればいいか

まずは、正解の一例をご覧ください。

```sh:正解
octed_s=$(printf '%s' "$s"              |
          od -v -A n -t o1              |
          tr -d '\n'                    |
          sed 's/[[:blank:]]*$//'       |
          sed 's/[[:blank:]]\{1,\}/\\/g')
awk 'BEGIN{s=sprintf("'$octed_s'");print s; print length(s);}'
```

AWKのエスケープや構文記号の影響を受けないように、printf用のフォーマット文字列形式にエンコードして渡し、それをAWK内のsprintf関数でデコードして使えば無事に渡すことができます。

まぁ、特殊な記号類が含まれないと始めからわかっているなら、こんな細工をしなくていいんですけどね。
gitのaliasコマンドに引数を渡す方法

### gitのaliasコマンドに引数を渡す

引数の渡し方をいろいろ調べたのでメモ。
関数を使うやり方の方が分かりやすくて良さそう。

```text
[alias]
        command1 = "!sh -c 'echo $1 $2' -"
        command2 = "!f(){ echo $1 $2;};f"
```

```shell-session
$ git command2 hoge fuga
hoge fuga
```

### sh -c を使う

```text
command1 = "!sh -c 'echo $1 $2' -"
```

最後のハイフンは$0を消すためのダミー。
ハイフン無しで```'echo $0 $1'```とすると、引数ありの時は一つ目が\$0に。無しの時は\$0にshが入る。

### 関数を使う

```text
command2 = "!f(){ echo $1 $2;};f"
```

こちらは見ての通り。{の後のスペースを詰めると動かないので注意。
[git] ローカルでbranchをバックアップするalias

### ローカルでbranchをバックアップするalias

他人のbranchにちょっと手を加えて試してみたり、rebaseなんかをする前にもしもの時のためにバックアップしておいたり、ローカルでbranchを複製することが良くあります。一時的なやつです。

```shell-session
$ git branch hoge hoge.backup
```

とかするんですが、後からみるとどれが何だったか忘れちゃう。

```
$ git branch
* hoge
  hoge.backup
  hoge.backup1
  hoge.backup2
```

なのでタイムスタンプとかついたらいいなーと思ってaliasを作りました。タイムスタンプだけだと結局分からなくなるので、簡単なコメントもつけられるようにしました。

### 設定方法

gitconfigに下記を追加します。

```
[alias]
        bk = "!f() { git branch $1_bk`date \"+%Y%m%d%H%M%S\"`$2; }; f"
``` 

```
$ git bk hoge test
$ git bk hoge テスト
$ git branch
* hoge
  hoge_bk20140329164828test
  hoge_bk20140329164845テスト
```

git-completionで補完が効かなくなるのが難点。
もっと良い方法があるのかもしれませんが…
【WordPress】ショートコードの書き方

markdown記法でもいいんだけど、ちょっとカスタマイズしたいとか、色々処理を施したいとか、そういうののためのショートコードの書き方です。
ほぼ自分用のメモなので雑な書き方ですみません。

ショートコードは[　]で囲んで書きます。
[ショートコード名 属性名1=値1 属性名2=値2]みたいな書き方です。
また、[ショートコード名 属性名=値]文字列など[/ショートコード名]というふうにも書けます。

```:投稿記事
[banner img="banner1.png"]案内ページ[/banner]
```

そしてこのショートコードをfunctions.phpで定義します。

```php:functions.php
function make_banner($atts, $content = 'バナー') {
	extract(shortcode_atts(array(
	'img' => 'banner_noimage.png'
	), $atts));
	
	$src = get_template_directory_uri().'/images/'.$img;
	return '<img class="banner" src="'.$src.'" alt="'.$content.'">';
}
add_shortcode('banner', 'make_banner');
```
\$attsには属性名と属性値の入力が、\$contentには挟まれた文字列が入ります（\$content = xx でデフォルトの値を設定します）
extract...の部分で、属性名の変数（\$img）に得た値を代入し、入力値がない場合にはデフォルト値（例の場合なら'banner_noimage.png'）を代入します。

例の場合の出力結果は
\<img class="banner" src="http://hogehoge.com/wordpress/wp-content/themes/original_theme/images/banner1.png" alt="案内ページ">
のようになります。
Mac から Microsoft Azure 上の Windows Server にリモートデスクトップ接続してみた。


## 手順
- 大まかな手順は以下の通り。

1. Mac App Store から Microsoft Remote Desktop をインストールする。(詳細手順は省略)

2. Microsoft Azure 上 Windows Server 仮想マシンを作成する。(手順については後述)

3. Windows Server にリモートデスクトップ接続する。

### 仮想マシン作成手順
1.ブラウザから Microsoft Azure にサインインする。
2.画面下部の[新規]をクリックし、[コンピューティング]→[仮想マシン]→[簡易作成]を選択し、以下の項目を入力し、[仮想マシンの作成]をクリックする。

- DNS名 : 一意の名前
- イメージ : Windows Server 2008 系 or Windows Server 2012 系を選択
- サイズ : いずれか1つを選択
- ユーザー名 : ログインユーザ名
- 新しいパスワード、確認 : ログインパスワード
- リージョン : いずれか1つを選択

### 仮想マシン接続手順
1.ブラウザから Microsoft Azure にサインインする。
2.画面左側の[仮想マシン]を選択し、作成した仮想マシンが選択された状態で、画面下部の[接続]をクリックする。
3.RDPファイルのダウンロードが完了したら、RDPファイルをダブルクリックする。
4.仮想マシンにアクセスできたら、ログインユーザ、ログインパスワードを入力し、仮想マシンにログインする。

## Windows Server 2012 日本語化
- Microsoft Azure の仮想マシンのデフォルト言語が英語なので、日本語化してみた。

### 手順
1.[Control Panel]→[Clock, Language, Region]→[Add a language]を選択する。
2.[Add a language]をクリックし、[Add languages]から[日本語]を選択し、[Add]ボタンをクリックする。
3.[Languages]画面の[日本語]のOptionsをクリックし、[Download and install language pack]をクリックする。
4.Language Pack インストール完了後、[日本語]を選択した状態で[Move up]をクリックし、[日本語]を1番上に表示させる。
5.仮想マシンをログアウト、ログインする。
Rubyで前処理。Pixivのタグ検索結果から1タグ1カラムの表データを作る

#概要
Pixivのタグ検索結果に対して統計解析をする際に、
作品別のタグ情報を1タグ1カラムの表データにする必要があった。
具体的に言えば、(A)から(B)に変換する必要があった。
そのため、Rubyコードを記述した。

(A)
X Y Z
X
Y Z

(B)
X,Y,Z
1,1,1
1,0,0
0,1,1

#データ
[-> Pixiv検索結果をCSVダウンロードするHTMLファイルを用意した](http://qiita.com/nezuq/items/55800d55c03606e0b13c)

#コード
```ruby:pxcsv2tagtable.rb
# coding: UTF-8

=begin
pxcsv2tagtable.rb
Copyright (c) 2014 nezuq
This software is released under the MIT License.
http://opensource.org/licenses/mit-license.php
=end

require 'csv'

#入力ファイル名
INPUT_CSV = 'INPUT.csv'
#出力ファイル名
OUTPUT_CSV = 'OUTPUT.csv'
#しきい値（出現頻度が指定範囲外のタグのカラムは出力しない）
MAX_FREQUENCY = 1.000
MIN_FREQUENCY = 0.005
=begin
#しきい値（出現回数が指定範囲外のタグのカラムは出力しない）
MAX_COUNT = 1000
MIN_COUNT = 15
=end
#表示しないタグのパターン
UNDISP_KEYPATTERN = /.+00users入り|R-18|漫画|落書き/
#元データの列名
ORIGINAL_COLUMNS = %w(illust_id user_id extension title server_no user_name illust_128_url x1 x2 illust_480mw_url x3 x4 illust_entry_dt tags tool_name evaluate_cnt evaluate_sum view_cnt caption page_cnt x5 x6 x7 x8 user_disp_id x9 r18_flg x10 x11 user_url)
#元データの表示フラグ
DISP_ORIGINAL_COLUMNS = false

h_org = {}
h = {}
clm = []
CSV.foreach(INPUT_CSV, encoding: "UTF-8") do |row|
    ORIGINAL_COLUMNS.each_with_index do |key, i|
        h_org[key] = clm.clone if (! h_org[key])
        h_org[key].push(row[i])
    end if (DISP_ORIGINAL_COLUMNS)
    tags = row[13] ? row[13].split(' ') : []
    (h.keys | tags).each do |key|
        h[key] = clm.clone if (! h[key])
        h[key].push(tags.include?(key) ? 1 : 0)
    end
    clm.push(0)
end

sum = ->(ary){ary.reduce {|x, y| x + y}}
cnt = h.values[0].length
lst = h.delete_if {|key, ary|
        (key =~ UNDISP_KEYPATTERN) || !((sum.call(ary)*1.000/cnt).between?(MIN_FREQUENCY, MAX_FREQUENCY))
#       (key =~ UNDISP_KEYPATTERN) || !((sum.call(ary)).between?(MIN_COUNT, MAX_COUNT))
    }.sort_by{
        |key, ary| -sum.call(ary)
    }

CSV.open(OUTPUT_CSV, "wb") do |csv|
    hdr = []
    h_org.each do |key,val|
            hdr.push(key)
    end if (DISP_ORIGINAL_COLUMNS)
    for i in 0..(lst.length - 1) do
        hdr.push(lst[i][0])
    end
    csv << hdr
    for i in 0..(cnt - 1) do
        row = []
        h_org.each do |key,val|
            row.push(val[i])
        end
        for j in 0..(lst.length - 1) do
            row.push(lst[j][1][i])
        end
        csv << row
    end
end

puts "end!"
```

#出力イメージ
```csv:OUTPUT.csv
艦隊これくしょん,百合,艦これ,赤賀,加賀,赤城,天龍田,天龍,龍田,大北,北上,大井,赤城(艦隊これくしょん),今日も鎮守府は平和です,鈴熊,女性提督,加賀(艦隊これくしょん),愛高,愛宕,艦これかわいい,金剛,高雄,比叡
1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
（以下略）
```
[objc][memo] さっくと、四角いUIView 丸いUIViewを作る。


サクッとUIView作って表示確認したいとき

```objc

//------------------------------
// 四角のUIView
//------------------------------
UIView * square = [[UIView alloc] initWithFrame:CGRectMake(35,55,10,10)];
square.backgroundColor = [UIColor blueColor] ;
[self.view addSubview:square];


//------------------------------
// 円のUIView
//------------------------------
float r = 12.0f;
float x = 5.0f;
float y = 5.0f;
UIView *circle = [[UIView alloc] initWithFrame:CGRectMake(x,y,r,r)];
circle.alpha = 0.5;
circle.layer.cornerRadius = r*0.5;
circle.backgroundColor = [UIColor blueColor];
[self.view addSubview:circle];

```