OmniAICreator/Qiita-1.07M huggingface dataset:
PHP　パンくず

```php
<?php
class BreadCrumbs{
	
	public $separator	= "&nbsp;&gt;&nbsp;";
	public $indexkey	= "index";
	public $wrap		= "li";
	public $text		= "";

	
	public function __construct(){
		
		$this -> pattern = array();
		$this -> uri	 = "";
		
	}
	
	public function setPattern( $arg ){
		$this -> pattern = $arg;
	}
	
	public function setURI($arg){
		$this -> uri = $this -> trimURI($arg);		
	}
	
	public function setAfterText($arg){
		$this -> text = $arg;
	}
	
	public function setIndexKey($arg){
		$this -> indexkey = $arg;
	}
	
	public function setWrap($arg){
		$this -> wrap = $arg;
	}
	
	public function setSeparator( $arg ){
		$this -> separator = $arg;
	}
	
	public function getString(){
		$str = "";
		if($this->uri == "") $this->uri = $this->trimURI($_SERVER["REQUEST_URI"]);

		$exp = explode("/",$this->trimURI($this->uri));
		$v = $this -> patternSearch($this->pattern,$exp);	

		if(!$v)return false;

		if($this->extraPattern($this -> uri)){
			unset($v[1][count($v[1])-1]);
		}
		foreach($v[1] as $e){
			$str .= $this -> link($e["name"],$e["url"]);
			$str .= $this -> separator."\n";
		}
		
		$str .= is_string($v[0])? $v[0]: (is_object($v[0])?$v[0]():"E");
		return $str;
	}
	
	private function extraPattern($uri){
		$regex = "/^\/.*?\/$/";
		return preg_match($regex,$uri);
	}
	
	
	private function patternSearch($v,$exp){
		$uri 	= "";
		$cnt 	= count($exp);
		$history= array();
		for($i =0; $i<$cnt;$i++){
			if(isset($result) && is_array($result) && isset($result["index"])) {
				$history[] = array(	"name" 	=> $result["index"], "url"	=> $uri);
			}
			$result = $this -> inArrayKey($v,$exp[$i]);
			if($result === false) return false;
			if(is_array($result)){
				$uri .= $exp[$i]."/";
			}else{
				$uri .= $exp[$i];
			}
			$v = $result;				
		}
		return array($v,$history);
	}
	
	private function inArrayKey($v,$x){
		if( $x == "") $x = $this -> indexkey;
		return (is_array($v) && isset($v[$x]))?$v[$x]:false;
	}
	
	private function link($text,$url){
		if($this -> wrap != ""){
			return "<{$this->wrap}><a href=\"{$url}\">{$text}</a>{$this->text}</{$this->wrap}>";	
		}
		return "<a href=\"{$url}\">{$text}</a>";	
	}
	
	private function trimURI( $uri ){
		
		if(strpos($uri,'?')!== false){
			list($uri) = explode('?',$uri,2);	
		}
		if(strpos($uri,'#')!== false){
			list($uri) = explode('#',$uri,2);
		}
		return $uri;
	}
	

}


$pattern = array(
	"index"=>array(
	        "index" 	=> "TOP",
		"contents"	=> array("index"=> "コンテンツ","archive"=>function(){return "アーカイブ";}),
		"contact"	=> array("index"=> "お問い合わせ"),
		),		
);
$bc = new BreadCrumbs();
$bc -> setPattern($pattern);
$bc -> setWrap("span");
$bc -> setURI("/contents/archive");
echo $bc -> getString();
```
<h1>実行結果</h1>
```html
<span><a href="/">TOP</a></span>&nbsp;&gt;&nbsp;
<span><a href="/contents/">コンテンツ</a></span>&nbsp;&gt;&nbsp;
アーカイブ
```
<input type="date">をcssとfontAwsomeで使いやすくする

`<input type="date">`をcss（とfontawsome）を使ってシンプルで見やすくカスタマイズします。
cssとfontAwesomeしか使いませが、webkitを多用しています。
なので現状はchromeとsafariでしか動作しません。

↓これが何もしていない`<input type="date">`
<input type="date">
ボタンとか多くて使いづらいですね。
ここから、スピンボタンを削除したり、年月日を削除したりしてみます。

```html:index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>sample</title>
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
    <link rel="stylesheet" href="./style.css">
  </head>
  <body>
    <input type="date">
  </body>
</html>
```
fontAwesomeのリンクを忘れずに。


```css:style.css
/* スピンボタン（上下ボタン）を非表示 */
input[type=date]::-webkit-inner-spin-button {
  -webkit-appearance: none;
}
/* 無入力時の 年/月/日 を / / にする */
input[type=date]::-webkit-datetime-edit-year-field:not([aria-valuenow]),
input[type=date]::-webkit-datetime-edit-month-field:not([aria-valuenow]),
input[type=date]::-webkit-datetime-edit-day-field:not([aria-valuenow]) {
  color: transparent;
}
/* /の色を変える */
input[type=date]::-webkit-datetime-edit-text {
  color: #666;
}
/* clearボタンの非表示 */
input[type=date]::-webkit-clear-button {
  -webkit-appearance: none;
}
/* カレンダーのインジケータ（▼）を非表示 */
input[type=date]::-webkit-calendar-picker-indicator {
  color: transparent;
  position: relative;
}
/* fontAwesomeのカレンダーアイコンをインジケータにする */
input[type=date]::-webkit-calendar-picker-indicator:before {
  color: #666;
  font-family: FontAwesome;
  /*content: "\f073";*/ /* fa-calendar */
  content: "\f133"; /* fa-calendar-o */
  position: absolute;
  left: -5px; /* ここら辺はいい感じの塩梅で */
  top: -5px;  /* ここも */
}
```
fontAwesomeには2つのカレンダーアイコンがあります。
使いたいアイコンによって、`content:`の値を変えてください。
#結果
<i class="fa fa-calendar"></i> `<i class="fa fa-calendar"></i>`
![スクリーンショット 2015-07-15 1.03.19.png](https://qiita-image-store.s3.amazonaws.com/0/16535/e068c952-6333-e87f-b49d-ea5763a0bbb9.png)
<i class="fa fa-calendar-o"></i> `<i class="fa fa-calendar-o"></i>`
![スクリーンショット 2015-07-15 1.08.02.png](https://qiita-image-store.s3.amazonaws.com/0/16535/ae61696a-6a4b-277d-9016-281143745afe.png)
かなりシンプルになっていい感じです。
#私事
QiitaってfontAwsome使えるんですね。<i class="fa fa-thumbs-o-up"></i>
記事書いてて気がつきました。
LaTexのメモ

テスト対策用のメモ書きです。
よく忘れるんですよね。こういうの

# 環境
## table, tabular環境
表組みを作成する

```latex
表\ref{tab:price} によると，大盛の値段は並盛の値段の倍である．
このことから並盛を2つ注文したほうがコストパフォーマンスはよいといえる．

\begin{table}[htb]
  \begin{center}
    \caption{値段表}
    \begin{tabular}{|l|c|r||r|} \hline
      メニュー & サイズ & 値段 & カロリー \\ \hline \hline
      牛丼 & 並盛 & 500円 & 600 kcal \\
      牛丼 & 大盛 & 1,000円 & 800 kcal \\
      牛丼 & 特盛 & 1,500円 & 1,000 kcal \\ \hline
    \end{tabular}
    \label{tab:price}
  \end{center}
\end{table}
```
http://www.latex-cmd.com/fig_tab/table01.html から引用

## figure環境
画像を埋め込む

```latex
ハムスターを図\ref{fig:hamu}に示す．

\begin{figure}[htbp]
  \begin{center}
    \includegraphics[clip,width=7.0cm]{./dede.eps}
    \caption{ハムスター}
    \label{fig:hamu}
  \end{center}
\end{figure}
```
http://www.latex-cmd.com/fig_tab/figure01.html から引用

## itemize, enumerate環境
記号付き(itemize)や番号付き(enumerate)の箇条書きを作成

```latex
\begin{itemize}
  \item item1
  \item item2
  \item ...
  \item itemN
\end{itemize}
```
http://www.latex-cmd.com/struct/list.html から引用

## quote, quotation環境
短文(quote)や長文(quotation)を引用する

## thebibliography環境
引用を作成する

```latex
\begin{thebibliography}{数字}
  \bibitem{キー1} 参考文献の名前・著者1
  \bibitem{キー2} 参考文献の名前・著者2
  ・・・
  \bibitem{キーN} 参考文献の名前・著者N
\end{thebibliography}
```
```latex
今日よく用いられる特徴点抽出法には，ハリスのコーナー検出\cite{harris}や
SUSAN (Smallest Univalue Segment Assimilating Nucleus)\cite{susan} がある．

\begin{thebibliography}{9}
  \bibitem{harris} C. Harris and M. Stephens,
    ``A combined corner and edge detector, '' Proc. 4th Alvey Vision Conf.,
    pp.147-151, Manchester, U.K., Aug. 1988.
  \bibitem{susan} S. M. Smith and J. M. Brady,
    ``SUSAN|A new approach to low level image processing,'' Int. J. Comput.
    Vis., vol.23, no.1, pp.45-78, May 1997.
\end{thebibliography}
```
http://www.latex-cmd.com/struct/thebibliography.html から引用


# パッケージ
インポートの仕方

```latex
\usepackage{パッケージ名}
```
覚えておくパッケージ名
 * graphicx
 * multicol

# 脚注
```latex
\footnote{テキスト}
```

# 数式
```latex
% インライン
$ y=ax+b $
% 数式だけ別の行で
\[ y=ax+b \]
% 式番号をつける
\begin{equation}
  y=ax+b
  \sum_{k=1}^10 a_k
  \frac{a}{b}
  \int_a^b x dx
\end{equation}
```
讓 Mac App 成為一個 Status Bar Application


設定好 status bar 的 menu item 之後，如何讓一個 app 隱藏 dock 上的 icon 以及應用程式的選單列非常簡單。

選取 project 的檔案之後，在 project editors 中選定 target 、切換到 **Info** tab ，在 **Custom OS X Application Target Properties** 下方的列表中，新增一筆設定

在 **Key** 欄位中打入 （這裡編輯時會有自動完成，可以直接選取建議值）

``` text
Application is agent (UIElement)
```

並把 value 設定為

``` text
YES
```

這樣就完成了

註：這裡設定的值，也可以直接在 app 的 Info.plist 裡面設定。
SizeClassesを使う時の注意点


今まで縦横両方で使うアプリは考えてなかったので気付かなかったのですが、SizeClassesでBaseViewsをAnyWidth、AnyHeight以外にしてる状態でUIコンポーネントを追加した場合、そのUIコンポーネントは現在表示されているViewでしか使えない設定になっています。



![スクリーンショット 2015-07-15 00.38.09.png](https://qiita-image-store.s3.amazonaws.com/0/40693/faa16b52-49a7-6b5e-3d1d-11dfa2030697.png "スクリーンショット 2015-07-15 00.38.09.png")


基本の形でLabelを二つ追加
この状態で画面サイズをiPhone6までの縦画面に合わせたサイズに変更する


![スクリーンショット 2015-07-15 00.44.47.png](https://qiita-image-store.s3.amazonaws.com/0/40693/d4b32d1b-33ee-be5b-8379-b590003ee5ff.png "スクリーンショット 2015-07-15 00.44.47.png")

ラベルを追加

![スクリーンショット 2015-07-15 00.50.15.png](https://qiita-image-store.s3.amazonaws.com/0/40693/b99c33fe-c726-2930-2ca7-9b1ad09dafee.png "スクリーンショット 2015-07-15 00.50.15.png")

画面サイズを指定した状態で追加するとその状態でのみ表示の設定に自動でなっている。
この状態で画面サイズを変更したり向きを変えると追加したUIコンポーネントは非表示になってしまう。
キャプチャーはサイズは同じで横向きにしたもの。

![スクリーンショット 2015-07-15 00.57.59.png](https://qiita-image-store.s3.amazonaws.com/0/40693/2d541c63-881c-3dbb-a517-81ad8060a696.png "スクリーンショット 2015-07-15 00.57.59.png")

追加したラベルを横画面でも表示させたい場合はどれでも表示を選択するか、表示するサイズを指定するかになる。

![スクリーンショット 2015-07-15 00.59.22.png](https://qiita-image-store.s3.amazonaws.com/0/40693/be0e878e-5b45-ea6b-3ce2-c5250209263a.png "スクリーンショット 2015-07-15 00.59.22.png")

上の＋をクリックした時、以下のように表示条件を選べる
![スクリーンショット 2015-07-15 01.00.50.png](https://qiita-image-store.s3.amazonaws.com/0/40693/fabce3cc-5e49-51c9-dc9c-a9d94ffe644d.png "スクリーンショット 2015-07-15 01.00.50.png")

選択した結果、項目が増えていく。


![スクリーンショット 2015-07-15 01.05.20.png](https://qiita-image-store.s3.amazonaws.com/0/40693/edcbc64f-33ef-4ef6-6b79-24463bb00a37.png "スクリーンショット 2015-07-15 01.05.20.png")

ただし、上記２点で追加したUIコンポーネントは表示位置が最初に追加した画面とは全然違うので、注意する。

以上の事から画面デザインは基本、wAny,hAnyで行うのが後々楽になると思う。

以上、ちょっとした備忘録的メモでした。

#### 参考
[小学生でも分かった気になるiOS8のSize Class](http://www.slideshare.net/YoshinoriImajo/ios8size-class)
[AWSCLI]EC2を立てる上で使う簡易コマンドリファレンスその１[EC2]


ここ数日の基本的なことはわかってきました。
マネジメントコンソールなんか面倒くさいから見ねぇよ！って言えるように頑張りたい。

####　aws ec2 hogehoge help 
みたいにやるとわざわざサイト見に行かなくてもリファれることを発見！こいつは便利や！

#EC2自体は次に・・・


##1.セキュリティグループ
###aws ec2 create-security-group

セキュリティ・グループを作成するコマンド

|    オプション　|     意味 　　　| 何を書けばいいか |
|:-------------|:--------------|:--------------|
| --group-name | SGの名前　　　　| hogehogeSG |
|  --description | SGの説明　　　| "My hogehogeSG" |
|　--vpc-id     | VPCを明示的に指定する　| 書かなくて問題ない様子 

```bash:サンプル
 aws ec2 create-security-group --group-name hogehogeSG --description "My hogehogeSG"
```
「GroupId」が出力される。

---
###aws ec2 authorize-security-group-ingress
> authorize:（権威などを）与える
> ingress:入り口
> egress:出口

SGでのいつもの設定
inboundルールを設定します。（outboundはegress）

|    オプション　|     意味 　　　| 何を書けばいいか |
|:-------------|:--------------|:--------------|
| --group-id  | 設定するSGをidで指定 | sg-xxxxxxxx |
| --protocol | プロトコルを選択 | tcp / udp |
| --port | 穴を開けるポート | 22,80,8080とか 1010-2020 みたいな|
| --cidr | 通信を許可するIPの範囲 | 0.0.0.0/0 = anywhere |
|  --source-group | セキュリティグループで指定　|　sg-xxxxxxxx　|

```bash:サンプル
 aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 22 --cidr 10.0.0.0/24

```
ちょっと面倒（＾＾；
マネジメントコンソールでも面倒ですけどねっ！


##2.キーペア
###aws ec2 create-key-pair
キーベア作っておきます。

|    オプション　|     意味 　　　| 何を書けばいいか |
|:-------------|:--------------|:--------------|
| --key-name | キーの名前 | myhogeKey |

```bash:サンプル
 aws ec2 create-key-pair --key-name　myhogeKey

```
秘密鍵できるんですけどそのまま標準出力されてるだけなのでファイルに書き込んで実行権限与える必要がある。
jqで整形すれば良い？っぽい。

次回はEC2たてます。
Upgrading Flash Player in lazy way (OSX)


https://gist.github.com/cielavenir/e1faf90c3ee21c52258e

root権限で実行することにより、インストーラを介さずにFlashを更新できます。ブラウザを閉じるのが面倒な方にお薦め。
また、一般ユーザー権限で実行すると、ホームディレクトリ配下にFlashをインストールできます。システムを汚したくない方に。

NPAPI / PPAPI両対応。

https://gist.github.com/stefanschmidt/9510292 がベースです。
【Sitecore】静的なHTMLを公開サーバ上に配置する


#背景
「Sitecoreの公開サーバに静的なhtmlファイルを配置して表示したい！」というニーズもあるかと思うので、その手順を調べました。
当然ながら、Sitecoreの管理外となるので、コンテンツエディタ上では修正はできません。ファイルエクスプローラでアップロードして更新する必要があります。(´・ω・`)


#環境
　Sitecore 7.2 (rev. 141226)
　インスタンス名は"test"
　公開サイトのホスト名は、sample.net
　　→　web.configの<site name="website" .../>にhostName="sample.net"を追加済
   　→　IISのサイトバインドでsample.netを割り当て済
  
#手順
 http://sample.net/cat1/ ディレクトリ内にhtmlファイルを配置する場合
　IISのサイトのルートディレクトリとコンテンツエディター上のルートアイテムとが対応します。
 ![03.png](https://qiita-image-store.s3.amazonaws.com/0/82737/8bcf8ba7-93fb-b189-b843-dd8a23e01fbb.png)
　このため、IISでサイトルート直下にcat1ディレクトリを作成し、その中にiisstart.htm(とiis-85.png)を配置します。ブラウザで http://sample.net/cat1/iisstart.htm にリクエストすると正しく表示されます。
 ![04.PNG](https://qiita-image-store.s3.amazonaws.com/0/82737/e6dfdbb0-d698-fb23-aee5-27d46cc1ba10.png)
Rails4でhamlを導入する

htmlのごちゃごちゃした感じがどうにも好きになれないので、hamlを導入する。

検証バージョン

```
$ ruby -v
ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-darwin14]

$ rails -v
Rails 4.2.1
```

# インストール
Gemfileに追記

```
gem 'haml-rails'
gem 'erb2haml'
```

反映する

```
$ bundle install
```

インストールしたらこんな注意書きが。
備忘録として一応記載。

```
HEADS UP! Haml 4.0 has many improvements, but also has changes that may break
your application:

* Support for Ruby 1.8.6 dropped
* Support for Rails 2 dropped
* Sass filter now always outputs <style> tags
* Data attributes are now hyphenated, not underscored
* html2haml utility moved to the html2haml gem
* Textile and Maruku filters moved to the haml-contrib gem

For more info see:

http://rubydoc.info/github/haml/haml/file/CHANGELOG.md
```

# 既存ファイル変換
コマンド確認

```
$ rake -T | grep haml
rake haml:convert_erbs                  # Perform bulk conversion of all html.erb files to Haml in views folder
rake haml:erb2haml                      # Convert html.erb to html.haml each file in app/views
rake haml:replace_erbs                  # Perform bulk conversion of all html.erb files to Haml in views folder, then remove the converted html.erb files
```

実行

```
$ rake haml:replace_erbs 
Looking for ERB files to convert to Haml...
Converting: app/views/contacts/confirm.html.erb... Done!
Removing: app/views/contacts/confirm.html.erb... Removed!
Converting: app/views/contacts/create.html.erb... Done!
Removing: app/views/contacts/create.html.erb... Removed!
Converting: app/views/contacts/thanks.html.erb... Done!
・・・
```

# haml文法
[公式Document](http://haml.info/docs/yardoc/file.REFERENCE.html)を見るのがベスト。
[Hamlが5分で分るチートシート](http://morizyun.github.io/blog/beginner-rails-tutorial-haml/)もまとまっていて便利。
【AWS】参照専用のIAMユーザを作成する手順


この手順は、AWSに関するトラブル発生時などに第3者に確認頂くために、一時的な参照専用のユーザを作成することを想定しています。
また、第３者による確認が完了した後は、一時ユーザを削除することによりセキュリティを確保できます。
この手順ではEC2に関する読み取り権限のみを付与しているため、請求書情報等に関する情報にアクセスできないようになっています。
安全のため確認作業完了後は、必ず削除手順を実施ください。

# EC2に関する参照専用のユーザを作成する

※事前にAWSにログインください。

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/55774822-6745-7468-2945-0a650b39ef91.jpeg "1.jpg")

ーーーー

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/df414bd3-9959-0ec1-bb4f-4310c6a42b8d.jpeg "2.jpg")

ーーーー

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/efe72da9-f38b-dea7-6d1c-d389b1d2c2d7.jpeg "3.jpg")

ーーーー

![４.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/76f04cf3-0c54-9aff-90c9-d9e9d464292f.jpeg "４.jpg")

ーーーー

![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/37728ec1-18a9-b891-4e11-6b221b885681.jpeg "5.jpg")

ーーーー

![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/ee0a6b3e-06c4-1214-3ea9-4a7bf6cdfbcd.jpeg "6.jpg")

ーーーー

![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/fbcb7d4e-4ea9-ceca-6eeb-35e1568840dc.jpeg "7.jpg")

ーーーー

![7-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/5b9bfc0b-4ecd-3a99-cf98-de17cd8ada6b.jpeg "7-1.jpg")

ーーーー

![7-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/820e1804-d1d9-a4fd-9dac-eff69f83b4c4.jpeg "7-2.jpg")

ーーーー

![7-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/fbdd4a1f-7cb2-37e8-ccf7-e4e7eff720a9.jpeg "7-3.jpg")

ーーーー

![7-4.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/4a76986c-1bb7-801c-7791-38f08bd01271.jpeg "7-4.jpg")

ーーーー

![7-5.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/3faad581-f281-1033-3af3-2f38a0f152a6.jpeg "7-5.jpg")

ーーーー

![8.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/766475de-d2e8-445c-c11a-489041c22727.jpeg "8.jpg")

ーーーー

![9.jpg](https://qiita-image-store.s3.amazonaws.com/0/33834/7f4acf2a-0c09-da1a-333b-972da1b584de.jpeg "9.jpg")

ーーーー







# ユーザ削除手順は[こちら](http://qiita.com/iron-breaker/items/5687a9c879c6ceb003df)です
ES7 Decoratorでresizeイベントをいい感じに処理してくれるパッケージ作ったよ


今、React・Fluxで作っているツールで、window.onresize時にwindow.innerHeightをdivのheightとして設定するようなComponentを作った。

こういう感じ：

```javascript
class Example extends React.Component {
	constructor (props) {
		super(props);

		this._onWindowResize = this.onWindowResize.bind(this)
		this.setState({ height: 0, width: 0 })
	}

	render () {
		let {width, height} = this.state;
		return <div {...this.props} style={{ width, height }} />;
	}

	onWindowResize () {
		this.setState({
			height: window.innerHeight,
			width: window.innerWidth
		});
	}

	componentDidMount () {
		window.addEventListener('resize', this._onWindowResize);
	}

	componentWillUnmount () {
		window.removeEventListener('resize', this._onWindowResize);
	}
}
```

「これはES7 DecoratorやHigher-Order Componentで共通化出来そうだ」と思ったので、[on-resize](https://www.npmjs.com/package/on-resize)というパッケージを作りました。

https://www.npmjs.com/package/on-resize

## 使い方

### インストール

```
$ npm install --save on-resize
```

### ES7 Decoratorの場合

```javascript
import {onResize} from "on-resize/react";

@onResize()
class Example extends React.Component {
	render () {
		// window.onresize時にwidth, heightが渡ってくる
		let {width, height} = this.props;
		return <div {...this.props} style={{ width, height }} />;
	}
}
```

デフォルトではwindow.onresize時に、`window.innerWidth - props.offsetWidth`が`width`に、`window.innerHeight - props.offsetHeight`が`height`に、props経由で渡ってくる。
渡ってくる値とか変数名を変えたい場合は、`@onResize`に引数として渡せば変更できる。

```javascript
@onResize((props) => ({
	innerWidth: window.innerWidth,
	innerHeight: window.innerHeight
}))

// OR

@onResize({
	select: (props) => ({
		innerWidth: window.innerWidth,
		innerHeight: window.innerHeight
	}
})
```

### Higher-Order Componentの場合

Decoratorとほとんど一緒。`bindOnResize`をimport（require）して使う

```javascript
import {bindOnResize} from "on-resize/react";

class Example extends React.Component {
	render () {
		// window.onresize時にwidth, heightが渡ってくる
		let {width, height} = this.props;
		return <div {...this.props} style={{ width, height }} />;
	}
}

// ラップしたComponentを返す
export default bindOnResize(Example);

```

挙動の変更もDecoratorと一緒。

```javascript
bindOnResize(Component, (props) => ({
	innerWidth: window.innerWidth,
	innerHeight: window.innerHeight
}))

// OR

bindOnResize(Component, {
	select: (props) => ({
		innerWidth: window.innerWidth,
		innerHeight: window.innerHeight
	}
})
```

## まとめ

- ES7 Decorator、最初きもいなーと思ったけど使うと便利
- インターフェースは[redux](https://github.com/gaearon/redux)を結構参考にしている
	- 今後React以外にも対応できるように`on-resize/react`にしたりとか
- テスト書くの面倒なので、ちょっとしか書いてない。書かねば。


何かバグとかあれば、Githubのissueでご連絡くださいー

https://github.com/pirosikick/on-resize
「value at is not a member of controllers.ReverseAssets」というエラーが出た


Asset読み込みのために以下の様な記述をした。

```scala:index.scala.html
<script src="@routes.Assets.at("javascripts/hello.js")" type="text/javascript"></script>
```

そしたら以下の様なエラーが出た。

```
value at is not a member of controllers.ReverseAssets
```

結論としては `at` ではなく `versioned` を使えば解決する。

```scala:index.scala.html
<script src="@routes.Assets.versioned("javascripts/hello.js")" type="text/javascript"></script>
```

PlayFrameworkの`2.4`から`versioned`を使うようになったらしい。


## 参考

http://stackoverflow.com/questions/30562642/play-framework-routes-assets-at-compilation-error
chart.jsでレーダーチャート作成とちょっとした調整点

chart.jsでレーダーチャートを作成する時に、ちょっと詰まったところまとめ。
基本的には公式documentを参照。
http://www.chartjs.org/docs/
基本的には簡単で使いやすかった。

# 基本的なコード
```html
<canvas id=“radarChart” width=“300” height=“300”></canvas>
```

```javascript
$(function(){
    var data = {
        labels: [“ラベル1", “ラベル2", “ラベル3", “ラベル4", “ラベル5"],
        datasets: [
            {
                label: "レーダーチャート",
                fillColor: "rgba(200,0,0,0.2)",
                strokeColor: "red",
                pointColor: "red",
                pointStrokeColor: "red",
                pointHighlightFill: "red",
                pointHighlightStroke: "red",
                data: [6, 12, 10, 18, 2]
            }
        ]
    };
    var ctx = document.getElementById("radarChart").getContext("2d");
    var options = {
        pointLabelFontSize : 12,
        scaleOverride : true,
        scaleSteps : 8,
        scaleStepWidth : 2,
        scaleStartValue : 0
    };
    var radarChart = new Chart(ctx).Radar(data, options);
});
```

## チャートの最大値の設定と線の本数
options.scaleStepsが、線の数。
options.scaleStepWidthが、線1本あたりの値。
なので、最大値は options.scaleSteps * options.scaleStepWidth になる。
上の例だったら、最大値は18。


## スマホでのtap-highlight-color
このままだと、スマホで領域をタップした時に黒っぽいハイライトが出るので
(-webkit-)tap-highlight-color を
rgba(255,255,255,0)
とかで消してあげる。
Rubyの配列でswap（入れ替え）メソッド

Rubyで配列の中身を入れ替えたいときのswapメソッドをふと考えました。
コンセプトとしては`array.swap!(a, b)`でarrayのa番目とb番目の要素が入れ替わるメソッドです。

Arrayクラスに以下の様に定義しました。`Array#swap`は非破壊メソッド、`Array#swap!`は破壊メソッドです。

## 定義
```rb
class Array
  def swap!(a, b)
    raise ArgumentError unless a.between?(0, self.count-1) && b.between?(0, self.count-1)

    self[a], self[b] = self[b], self[a]

    self
  end

  def swap(a, b)
    self.dup.swap!(a, b)
  end
end
```

## 実行結果
```irb
irb(main):014:0> a = [1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]
irb(main):015:0> a.swap(0, 3)
=> [4, 2, 3, 1, 5]
irb(main):016:0> a
=> [1, 2, 3, 4, 5]
irb(main):017:0> a.swap!(1, 4)
=> [1, 5, 3, 4, 2]
irb(main):018:0> a
=> [1, 5, 3, 4, 2]
```
2015年夏、32bit Windows 7とAndroid Studio

2015年夏にもなってRAM 3GBの32bit Windows 7でAndroid Studio（1.2.2）を新規にセットアップしてやたらと苦戦したのでメモを残しておく。

# メモ
 * Javaは8でいいらしい。JDK 8u45を使用。
 * 初回ダウンロードに失敗時、「Proxy設定するかい？」とAndroid StudioのProxy設定に直案内してくれるようになった。SDK Managerのproxy設定はやってくれないのでGoogle USB Driver等の他パッケージの追加ダウンロード時には別途設定する必要がある。
 * `C:\Users\（ユーザ名）`配下にガンガン配備するので日本語ユーザ名は多分NG。SDKも`C:\Users\（ユーザ名）\AppData\Local\Android\sdk`配下に展開される。Path通し先はここ。
 * エミュレータは絶望的。HAXMと32bit用イメージをわざわざセットアップしてくれるがRAM不足で無様に死ぬ。おとなしく実機でやる。
 * 新規プロジェクトの初期化時にGradleがRAM不足で死ぬのは`gradle.properties`に`org.gradle.jvmargs=-Xms512m -Xmx1024m`という感じの1行を追加してGradleビューのReloadっぽいアイコンからRefreshをすると回避できる。ビルド時にもっと大きなRAMが必要なケースではきっと死ぬ。

# 新規プロジェクトテンプレを編集
新規作成のたびに死亡するのを回避するため、プロジェクトテンプレートを編集しておく。
**Program Files配下がUACによって保護されているケースではいったん別フォルダにコピーして編集後に、コピーし戻すこと**を忘れないこと。

`C:\Program Files\Android\Android Studio\plugins\android\lib\templates\gradle-projects\NewAndroidProject\root\gradle.properties.ftl`を編集し、前述の1行、`org.gradle.jvmargs=-Xms512m -Xmx1024m`を追記する。
Dronekitを使う開発に必要な、Android Studioのインストール手順(Ubuntu Linux 14.04)

## はじめに
[Dronekit](http://dronekit.io/)というOSSプロダクトがあります。
これは、ドローンを外部から操縦するためのアプリケーションを開発するためのプラットフォームです。
Android向け、Python、cloud向けのプラットフォームがそれぞれあるようです。
まず、Androidを調べます。
Android版の開発には、その前提としてAndroid studioのインストールが必要です。
この文書では、Android StudioをUbuntu Linux14.04にインストールした手順をまとめたものです。

## Android Studioをインストール
パッケージからインストール・・・としたいところですが、不幸にもdebパッケージになっていません。
よって、googleのWeb Pageから手動でtar玉展開する必要があります。

手順は[ここ](http://yktmnb.b.osdn.me/?p=170)を参照しつつ、進めていきます。

## Javaのインストールとプロキシ
Android studioを実行するためには、Javaが必要になります。
OpenJDKをインストールするという手もありますが、先に紹介したページの手順に従い、Java8をインストールします。

インストールする際にプロキシが落とし穴となる場合があります。認証付きプロキシ(ID,PASSが必要な場合)環境下で、PPAを加えようとすると

```
Please check that the PPA name or format is correct.
```
と言われて怒られます。エラーメッセージからではわかりにくいですが、これはリポジトリの追加時のコマンドミスでなく、プロキシ認証に失敗したことが原因です。エラーメッセージからではわかりにくいので、注意が必要です。

[このページ](https://hirooka.pro/?p=7766)にも書かれている通り、以下のようにPPAを追加します。

```:PPA追加コマンド
export http_proxy=http://proxyid:password@proxy.url:port/
export https_proxy=https://proxyid:password@proxy.url:port/
sudo -E add-apt-repository ppa:webupd8team/java
```

さらに、/etc/wgetrcにもプロキシ設定が必要です。Javaインストーラのスクリプトがwgetを使っているためだと思われます。

```:/etc/wgetrc
http_proxy=http://proxy.example.test:12345/
https_proxy=https://proxy.example.test:12345/
```

ちなみに、apt-getコマンドをプロキシ越しに実施するための、/etc/apt/apt.confへの設定については、[このページ](http://d.hatena.ne.jp/mrgoofy33/20100726/1280154695)を参照のこと。

・・・プロキシの設定、一箇所にデータベース化するとかして、どうにかならないのだろうか。

これで、ようやく先にtar玉展開したAndroid studioの**インストーラ**を起動できる。
Android Studioを展開したディレクトリ内にある、android-studio/bin/studio.sh を実行すると、インストーラが起動する。

## mksdcardユーティリティが原因のインストール失敗
mksdcardユーティリティがないと言われてインストールに失敗することがあります。
[stackoverflowのこのページ](http://stackoverflow.com/questions/29241640/unable-to-run-mksdcard-sdk-tool-ubuntu)と[Android Tools Project siteのページ](http://tools.android.com/tech-docs/linux-32-bit-libraries)が参考になります。

以下コマンドを実行し、追加でライブラリをインストールします。

```
sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0 lib32stdc++6
```

加えて、以下のコマンドも実施します。
どうやら、一部の処理で、32bit版のライブラリを使っていることに起因しているようです。

```
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1
```

これで、やっとインストールが完了しました。
次は、もう少し進めて、SITLの準備について書いてみたいと思います。
mkfileコマンド

#はじめに

『[デバイスの空き容量をゴミファイルで埋める](http://qiita.com/laiso/items/8bf4b58bc4430f40ad08)』という記事を読んで、

`mkfile -n 11g gomi.dat`

とmkfileコマンド (バイナリファイルの作成するコマンド) が出てきた。そして、`11g`って何表してたんだっけ？っと忘れてしまっていので調べた。

#結論から言うとファイルのサイズだった。

結論から言うと、`11g`とは、11GBのファイルということだった。
任意のサイズのファイルをmkfileで作るときに使えるらしく、以下の単位と共にサイズを指定することで作れるらしい。

|記述| 実際の単位|
|:------------:|:------------:|
|b|Byte|
|k|KB|
|m|MB|
|g|GB|

参考：[任意のサイズのファイルを作成する(mkfile)](http://l-w-i.net/t/macosx/mkfile_001.txt)

また、オラクルのサイトに次のように書いてありました。

> **mkfile コマンド**
mkfile コマンドは、NFS のマウント済みスワップ空間またはローカルスワップ空間に使用できるファイルを作成します。スティッキビットが設定され、ファイルは 0 が埋め込まれます。スワップファイルのサイズは、バイト数 (デフォルト) として指定するか、接尾辞 k、b、m を使用して、それぞれ K バイト数、ブロック数、M バイト数として指定できます。
(引用元：[mkfile コマンド (Solaris のシステム管理 (基本編)) ](http://docs.oracle.com/cd/E19683-01/817-4909/fsswap-5/index.html))

つまり、`b`というのはバイト数ではなく、ブロック数？

ブロック数とはWikipediaによると
>コンピューティング、特に記憶装置とデータ転送において、ブロック（英: Block）とは、ある一定の長さ（ブロックサイズ）のバイトまたはビットの並びである。そのようなデータは「ブロック化」されていると言われる。ブロック化は、そのデータを受け取るコンピュータプログラムにとって装置の物理的特性を抽象化し、データストリームを扱いやすくするために行われる。
また狭義には、
* オペレーティングシステムあるいはファイルシステムがHDDなどの外部デバイスとのデータ読み書きを行うインターフェースにおけるデータの最小単位
* データベース管理システム(DBMS)が記憶装置とのデータのやり取りを行うインターフェースにおけるデータの最小単位
* フラッシュメモリにおいて、消去操作を行うデータの最小単位
を示す。
(引用元：[ブロック (データ) - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF_(%E3%83%87%E3%83%BC%E3%82%BF)))

ということで`b`と`m`で実際にファイルを作りました。

|コマンド|結果|
|:------------|:------------|
|mkfile -v 11b test.text|test.text 5632 bytes|
|mkfile -v 11m test.text|test.text 11534336 bytes|

ということで、`11m`で作った方は11MBに近いですが、`11b`で作った方は5632bytesということで
やはりこの`b`という接尾辞はByteを表しているのではなくブロック数を指定するものみたいですね。


ちなみに、`mkfile`のオプションコマンドは次の通りです。

# `mkfile`のオプションコマンド

|オプションコマンド|内容|
|:------------|:------------|
|-n|空のファイルを作成。サイズは表示されるが、データが書き込まれるまでディスクブロックは割り当てられない。|
|-v|作成したファイル名とサイズを表示。|

# 参考
* [mkfile コマンド (Solaris のシステム管理 (基本編)) ](http://docs.oracle.com/cd/E19683-01/817-4909/fsswap-5/index.html)
* [UNIXサーバ Solaris Technical Park Solaris 逆引きコマンド一覧 ファイルの作成/削除 バイナリファイルの作成 : 富士通](http://jp.fujitsu.com/platform/server/sparcenterprise/technical/command-reference/file/file2_10.html)
各言語の1秒間のループ回数

# 目的
Rubyは簡潔に記述できる反面、実行速度が遅いと言われている。
また、Rubyで実装した常駐プロセスを動作させた時に他の言語とどのくらい違いが出るのか知りたかったので、計測。

# [計測用スクリプト／コード](https://github.com/liveralmask/lps/tree/master)
```rb:lps.rb
def time_usec( time )
  time.to_i * 1000000 + time.usec
end

sec = ARGV[ 0 ].to_i
sec = 1 if sec <= 0
usec = sec * 1000000

count = 0
start_usec = time_usec( Time.new )
while true
  count += 1
  end_usec = time_usec( Time.new )
  update_usec = end_usec - start_usec
  if usec <= update_usec
    puts "count=#{count} update_usec=#{update_usec}"
    break
  end
end
```
※各言語に合わせて計測用スクリプト／コードを用意

# 計測結果
| 言語 | ループ回数 | ツール／バージョン |
|:--|--:|:--|
| Golang | 18,000,000 | go 1.4 |
| C言語 | 17,000,000 | gcc 4.2.1 |
| Scala | 14,000,000 | scala 2.11.4 |
| Node | 9,600,000 | node 0.8.20 |
| C# | 5,300,000 | mono 2.10.12 |
| PHP | 2,000,000 | php 5.5.14 |
| Ruby | 600,000 | ruby 2.1.5p273 |
localのVirtualBox(vagrant)にknife solo prepareできない。なんで？


## knife solo prepare
``` linux
# knife solo prepare my_vagrant
Bootstrapping Chef...
ERROR: RuntimeError: Unable to connect to my_vagrant
```
うーん。prepareができない。


## ssh-configがおかしい？
``` linux
# vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /<REPOSITORY>/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
```
IdentityFileが変わってる！


## ~/.ssh/configを更新する
~/.ssh/config内のvagrantで使っていた場所を消してから、

``` linux
# vagrant ssh-config --host my_vagrant >> ~/.ssh/config
```

## まとめ
vagrantをアップデートしたらIdentityFileが変わったんだと思う。

``` linux
# vagrant -v
Vagrant 1.7.3
```

vagrant sshはIdentityFileを変更する前から通っていた。
Embulkと日付データ(その1: CSVの入力データ)


Embulkの日付データの取り扱いに関するメモ

## まとめ

CSVデータで「2015-01-27 19:23:49」のようなタイムゾーンが**未指定**のデータを日本時刻の日付型(timestamp)として取り扱う場合は、パーサーのオプション``default_timezone: "Japan"``を指定する。

## 解説

### サンプルデータの作成

```
embulk example pgtest
2015-07-14 22:01:04.483 +0900: Embulk v0.6.16
Creating pgtest directory...
  Creating pgtest/
  Creating pgtest/csv/
  Creating pgtest/csv/sample_01.csv.gz
  Creating pgtest/example.yml

Run following subcommands to try embulk:

   1. guess pgtest/example.yml -o config.yml
   2. preview config.yml
   3. run config.yml
```

### 中身の確認


```
gzip -dc pgtest/csv/sample_01.csv.gz 
id,account,time,purchase,comment
1,32864,2015-01-27 19:23:49,20150127,embulk
2,14824,2015-01-27 19:01:23,20150127,embulk jruby
3,27559,2015-01-28 02:20:02,20150128,"Embulk ""csv"" parser plugin"
4,11270,2015-01-29 11:54:36,20150129,NULL
```

* id1のデータは、2015年1月27日 19時23分49秒になっている。
* タイムゾーンは未指定

### guessにて設定ファイルを作成

```
embulk guess pgtest/example.yml -o config.yml
```

次のような設定ファイルができる。

```yaml
in:
  type: file
  path_prefix: /path/to/csv/sample_
  decoders:
  - {type: gzip}
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    escape: ''
    trim_if_not_quoted: false
    skip_header_lines: 1
    allow_extra_columns: false
    allow_optional_columns: false
    columns:
    - {name: id, type: long}
    - {name: account, type: long}
    - {name: time, type: timestamp, format: '%Y-%m-%d %H:%M:%S'}
    - {name: purchase, type: timestamp, format: '%Y%m%d'}
    - {name: comment, type: string}

```

プレビューを実行して確認をする。

```
embulk preview -G config.yml 
*************************** 1 ***************************
      id (     long) : 1
 account (     long) : 32,864
    time (timestamp) : 2015-01-27 19:23:49 UTC
purchase (timestamp) : 2015-01-27 00:00:00 UTC
 comment (   string) : embulk
```

* id1のデータは2015年1月27日 19時23分49秒と表示されるが末尾に**UTC**とついている。
* UTCは、Universal Time, Coordinated
* 日本の時刻はUTCから9時間足した時刻となる。
* 「2015-01-27 19:23:49 UTC」は、日本時刻、2015年1月28日 午前4時23分49秒になる


### default_timezoneの指定

*「2015-01-27 19:23:49」を日本の時刻として指定したい場合はdefault_timezoneを指定する
* ``default_timezone: "Japan"``をparserの設定に追加する

追加した設定

```yaml
in:
  type: file
  path_prefix: /path/to/csv/sample_
  decoders:
  - {type: gzip}
  parser:
    default_timezone: "Japan" # <-- 追加した設定
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    escape: ''
    trim_if_not_quoted: false
    skip_header_lines: 1
    allow_extra_columns: false
    allow_optional_columns: false
    columns:
    - {name: id, type: long}
    - {name: account, type: long}
    - {name: time, type: timestamp, format: '%Y-%m-%d %H:%M:%S'}
    - {name: purchase, type: timestamp, format: '%Y%m%d'}
    - {name: comment, type: string}
```

再度プレビュー

```
embulk preview -G config.yml 
*************************** 1 ***************************
      id (     long) : 1
 account (     long) : 32,864
    time (timestamp) : 2015-01-27 10:23:49 UTC
purchase (timestamp) : 2015-01-26 15:00:00 UTC
 comment (   string) : embulk
```

9時間戻った時刻が表示される。プレビューはUTC表示なので、9時間足した時刻が日本時刻となる。
Android APK署名するために必要な情報

以下の情報を英語で必要になる

・証明書の名前(英数字６文字以上)
・パスワード(英数字６文字以上)
・証明書の有効期限(なんでもOK。特に希望がなければ50年にすると良いです)
・名前(なんでもOK。特に希望がなければ国分寺さんのお名前を英語で書いて下さい)
・所属部署(なんでもOK)
・組織名(なんでもOK)
・所在地(なんでもOK)
・都道府県(なんでもOK)
・国別コード(日本はjp)
qiitaのクローンLodgeをdocker compose対応したよー

Lodgeってqiitaっぽくていいですよね。
qiita-team使いたかったけど、高かったのでこちらを使おうと思いました。

いろいろ調べてたら、Lodgeのherokuボタン対応していた記事を発見！
Rails - LodgeをHerokuボタンでデプロイする(PostgreSQL編) - Qiita http://qiita.com/usutani/items/e91babb5f547155bba1c

触発されてdocker-compose対応してみました。

j138/lodge-docker https://github.com/j138/lodge-docker

README参考に、docker-compose.ymlを記載後、ビルドしてみてください。
基本的に、ドメイン設定、メールの設定のみでOKです。

```yml:docker-compose.yml
    LODGE_DOMAIN: localhost:3000
    DELIVERY_METHOD: smtp
    MAIL_SENDER: example@example.com
    SMTP_ADDRESS: smtp.google.com
    SMTP_PORT: 587
    SMTP_USERNAME: username
    SMTP_PASSWORD: password
    SMTP_AUTH_METHOD: plain
    SMTP_ENABLE_STARTTLS_AUTO: true
```

## ビルド方法

```
git clone https://github.com/j138/lodge-docker
cd lodge-docker
```

* docker-compose.yml にてメール設定を済ませる。

```
docker-compose build
docker-compose up -d
docker-compose run rake db:create
docker-compose run rake db:migrate
```

nginxをポート80でバインドしてるので、
ブッキングするようなら適宜、8080とかに変えてもらえれば！

本家はこちら
lodge/lodge https://github.com/lodge/lodge
ansibleのtemplateでエスケープ


下記要件の時にちょっと調べたのでメモ

* 複数のサーバに対する処理をするシェルスクリプトを配布
* 対象のサーバは増えてもいいようにansibleのinventoryを使って管理したい

```
NODES=("10.0.1.1" "10.0.1.2" "10.0.1.3")
i=`expr $RANDOM % ${#NODES[@]}`
```

こんなコードを書いてましたが実行したらエラーが.....

```
error: Missing end of comment tag'
```

ansibleで使っているテンプレートエンジンはjinja2というものです

エラー内容からも分かる通り `{#` がjinja2側でコメントアウトとして認識されてしまったみたいです

なのでドキュメント見に行きました

http://jinja.pocoo.org/docs/dev/templates/#escaping

しっかり載ってますね！

下記方法で解決

```
{{ 'i=`expr $RANDOM % ${#NODES[@]}`' }}
```
AWSで簡単にRedmineを立ち上げる

クラウドが流行している昨今、
仕事場所を問わないノマドスタイルが流行ってますね。

ノマドだけでなく、クラウド上で仕事を管理することで
どこでもプロジェクト管理ができることは非常に重要とされます。

そこで、AWS（AmazonWebService）上でプロジェクト管理をすべく
以下のような環境を作成したいと思う。

>【立ち上げ予定】
>・Linux
>・Redmine
>・Git
>
>【できること予定】
>・プロジェクト管理（Redmine）
>・ソース管理（Git）
>・SSH通信

さて、今回は第一段階「Redmineを立ち上げる」を行いたいと思います。
同時にSSH通信ができることまで確認しておきます。

## **1. キーペアを作成**

こいつは作成したLINUXインスタンスとSSH通信を行うための鍵認証ファイルです。
紛失すると二度と取得できないため、扱いには十分に注意してください。

> EC2メニューを開く > サイドメニューから「キーペア」 > 「キーペアの作成」ボタン

あとは好きな名前を入力すれば作成＆ダウンロードされます。
これは大事に保管しましょう。

![スクリーンショット-2015-07-14-20.39.46.jpg](https://qiita-image-store.s3.amazonaws.com/0/85214/9a2bc579-eacb-38a2-4cec-60c02f8b16b6.jpeg)



## **2. Redmine立ち上げ**

AWSのEC2を利用するわけですが、
今回はAMIというオールインパッケージのようなものを指定します。

利用するのは、Redmine（Bitnamiバージョン）が入ったAMIです。

> EC2メニューを開く > サイドメニューから「インスタンス」 > 「インスタンスの作成」ボタン
> サイドメニューから「AWS Marketplace」 > 「Redmine bitnami」で検索

![スクリーンショット-2015-07-14-20.51.55.jpg](https://qiita-image-store.s3.amazonaws.com/0/85214/43208a99-303a-af81-b319-d97708eef1c4.jpeg)

ここでは３つありますが、大きく分けて２つです。
・普通のやつ
・HVMバージョン

個人で気軽にするのであれば前者で十分なようです。
HVMはもう少し専門的な使用方法の時に利用するようです。
そして、少しお高め。（一番小さいプランで $0.02/h でした。月1500円くらい）

ちなみに [AWSドキュメント](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/virtualization_types.html) にはこのように書かれていました。
> HVM AMI は、拡張ネットワーキングと GPU 処理を利用する場合に必要です。
> 専用のネットワークや GPU デバイスに命令を伝達するには、OS が
> ネイティブハードウェアプラットフォームにアクセスできる必要があります。
> HVM 仮想化ではこのアクセスが可能です。

利用状況に応じてプランを選択してください。
また、ここでキーペアは手順１で作成した鍵認証ファイルを指定してください。

![スクリーンショット 2015-07-14 21.08.51.png](https://qiita-image-store.s3.amazonaws.com/0/85214/94c5ae77-ef82-2cc6-ec7d-9c1aa6ee1a14.png)

これでRedmine立ち上げ完了です。
続いて接続確認をしていきます。

## **3. Redmine接続確認**

先ほど作成したインスタンス情報から、
「パブリックDNS」もしくは「パブリックIP」に対して、
ブラウザでアクセスします。

![スクリーンショット-2015-07-14-21.12.40.jpg](https://qiita-image-store.s3.amazonaws.com/0/85214/e7805b0d-19d2-ed3d-b658-8799cf918382.jpeg)

ちなみにこの値はインスタンスを起動するたびに可変ですので
固定させる場合は「ElasticIP」でIPアドレスを固定する必要があります。（有料です）

さて、接続しましたらログインだけしておきましょう。
デフォルトユーザは「user」で、パスワードはインスタンス起動ログから確認できます。

> EC2メニューを開く > インスタンス > 作成したインスタンス上で右クリック > インスタンスの設定 > システムログの取得

表示されているシステムログの下の方に「パスワードはこれ」って書かれてるのでそれがパスワードです、

![スクリーンショット-2015-07-14-20.47.45.jpg](https://qiita-image-store.s3.amazonaws.com/0/85214/8a17a2a3-90c6-4892-fa91-54ea32f021a9.jpeg)

ユーザ名：user
パスワード：システムログに記載されているパスワード

これでログイン完了。
あとは好みに設定してください。

![スクリーンショット 2015-07-14 21.23.35.png](https://qiita-image-store.s3.amazonaws.com/0/85214/b643317d-3486-fc5c-7b8c-9835118c2192.png)

## **4. SSH接続確認**

macの場合で記載します。
ターミナルを起動し、以下コマンドでアクセスできます。

> $ chmod 400 [手順1で取得した鍵認証ファイル(.pem)]
> $ ssh -i [手順1で取得した鍵認証ファイル(.pem) ubuntu@[パブリックDNS or パブリックIP]

Windowsの場合はTeraterm などを利用することでアクセスできるはずです。

お疲れ様でした！
OSX + Vagrant 1.7.3 + CentOS 7.1 で Synced Folder をNFSにすると失敗した話


ということなんですよ奥さん。

後述するけどたぶんこれは上書きインストール時のライブラリ類がちゃんと更新できなかった問題に近いと思う。バージョンアップ時にはご注意ください。

## 経緯

利用した Box は `boxcutter/centos71` です。

タイトルの通りなんですが、Synced Folder を type => "nfs" で指定すると以下のように失敗します。

```

...


GuestAdditions 5.0.0 running --- OK.
==> dev: Checking for guest additions in VM...
==> dev: Configuring and enabling network interfaces...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

/etc/init.d/rpcbind restart; /etc/init.d/nfs restart

Stdout from the command:



Stderr from the command:

bash: line 2: /etc/init.d/rpcbind: No such file or directory
bash: line 2: /etc/init.d/nfs: No such file or directory
```

共有ディレクトリにコード置いてMacでコード書いてVM上でサーバ立ててってやりたかったのに、Vagrant デフォルトの Synced Folder設定では激重で使い物にならない。`bundle exec rake unicorn:start` でデーモン起動に数分かかるレベルである。「[よろしい、ならばNFSだ](http://docs.vagrantup.com/v2/synced-folders/nfs.html)」というわけでNFSにしてみたらうまくいかなかった。

## 原因

よくわからなかったが、問題の箇所は特定できた。

```
sudo vi /opt/vagrant/embedded/gems/gems/vagrant-1.7.3/plugins/guests/redhat/cap/nfs_client.rb
```

こいつの `systemd?` メソッドによる判定に失敗しているのだ。

```
         def self.systemd?
           `ps -o comm= 1`.chomp == 'systemd'
         end
```

うーん????　これVM上で実行してちゃんと `ps -o comm= 1` の結果は `systemd` 帰ってくるけどなぁ???

って本家をみたら https://github.com/mitchellh/vagrant/blob/master/plugins/guests/redhat/cap/nfs_client.rb ・・・一瞬何が違うのかどうかわからなかったが、これはよーするにあれか。VMの中で実行しなきゃいけないコードをローカルで実行しちゃってるってことかな。そりゃ、うまくいかないよ。うん。

まあよし。お前はこうしてやる。俺が用があるのはCentOS7だけだ。つまり、systemd かどうかはお前が判定する必要はなく俺が知っているということだ。

```
         def self.systemd?
           true
         end
```


## 直したら動いた

よかったよかった。

```
...


==> dev: Machine booted and ready!
GuestAdditions 5.0.0 running --- OK.
==> dev: Checking for guest additions in VM...
==> dev: Configuring and enabling network interfaces...
==> dev: Exporting NFS shared folders...
==> dev: Preparing to edit /etc/exports. Administrator privileges will be required...
==> dev: Mounting NFS shared folders...
==> dev: Mounting shared folders...
    dev: /vagrant => /Users/ma2saka/vagrant
```

## 教訓

バージョン番号が一致しているからといってコードまでちゃんと最新化されているとは限らない。

```
$ vagrant --version
Vagrant 1.7.3
```

たぶん、https://www.vagrantup.com から Mac OS X 用のバイナリを落としてきてバージョンアップしたときに、このあたりのファイルが上書きされずに古いの残ってたんじゃないかなーと想像する。が、確認するのも面倒くさいので脳内ではクローズ。とりあえず「バージョンアップには注意しましょう」ということでひとつ。
Gitで2つ以上前のコミットに統合する

一つ前のコミットに統合するのは`git commit --amend -C HEAD`とかでいけるんだけど2つ以上前になるとめんどい。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">Gitでちょっとした修正を2つ以上前のコミットに統合したいとき、適当な名前でコミットしてrebase -iでfixupしてるけどめんどいので一発でやりたい</p>&mdash; Kazuhito Hokamura (@hokaccha) <a href="https://twitter.com/hokaccha/status/620851123566448640">2015, 7月 14</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

CTO殿にautosquashを教えてもらった。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hokaccha">@hokaccha</a> 僕はtigでコミットを選択したらcommit --fixupでコミットできるようにキーバインドをあてて使ってます。あとrebase -i --autosquash&#10;&#10;<a href="https://t.co/xFABtYXVFT">https://t.co/xFABtYXVFT</a></p>&mdash; yuku takahashi (@yuku_t) <a href="https://twitter.com/yuku_t/status/620860114975657984">2015, 7月 14</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

こういうやつ。

http://qiita.com/kyanro@github/items/818012c1b1827ed48277

しかし`rebase -i --autosquash`はエディタ立ち上がって一発でできる感じじゃないのでどうにかできないかなと思って調べたら`GIT_EDITOR=:`って指定するとGitのエディタ起動する部分をそのまま保存して終了っていう動作になるらしいのでこれを使えばいけそうというのがわかった。

```
$ GIT_EDITOR=: git rebase -i --autosquash $COMMIT
```

こんな感じのaliasを作る。

```
[alias]
	fixup = !sh -c 'COMMIT=`git rev-parse ${1:-HEAD}` && git commit --fixup=$COMMIT && GIT_EDITOR=: git rebase -i --autosquash ${COMMIT}^' -
```

これで変更を`git add`した状態で

```
$ git fixup         # 一つ前（HEAD）と統合
$ git fixup HEAD^   # 二つ前と統合
$ git fixup <sha1>  # 指定のコミットと統合
```

って感じになる。

rebaseでコンフリクトしてabortしたりするとfixupなコミットが残るけどまあそのぐらいはいいかな。
Python3で日本語のメールを送信

Python3で日本語のメールを送信します。

```py
#!/bin/env python3

import smtplib
from email.mime.text import MIMEText
import datetime

jp='iso-2022-jp'

# file.txt中に送信したい内容が入っている
fp = open('file.txt')
raw_msg = fp.read()
msg = MIMEText(raw_msg.encode(jp), 'plain', jp,)
fp.close()

fromaddr = "aaa@example.com"
toaddr = "bbb@example.com"

# Subject指定の時に使う
d = datetime.datetime.today()
date = d.strftime("%Y-%m-%d")

msg['Subject'] = date+" の使用情報"
msg['From'] = fromaddr
msg['To'] = toaddr


try:
    server = smtplib.SMTP('localhost')
    server.send_message(msg)
    print("Successfully sent email")
except Exception:
    print("Error: unable to send email")

## 参照
## http://w.builwing.info/2013/09/21/python3-3%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E9%80%81%E4%BF%A1/
```
Active DirectoryをMacに導入する際の影響箇所と解決方法

Active Directoryとは
----
Windows Serverベースのシステムに認証の機能を提供するツール。一言で言えば、アクセス可能な人かどうかを判断するため、確認する仕組み。

一般的な会社の社内システムには、会社の中の人間であれば誰でもアクセス可能なデータもあれば、一部の人にしかアクセスできないデータもある。

※導入手順は割愛

本題
----
Macにインストールするのは、そこそこレアケースだと思う。我々のチームは、安易にインストールして、あらゆるアプリが起動しない・正常に動かない、deployできないなど、開発・デザイン作業に支障をきたしたので、二度とこんな不幸が起こらないようにry...


主な懸案と対策
----

#### 1. 多くの場合ホームディレクトリのpathが問答無用で書き換わる
`/Users/#{username}` → `/Users/#{username} xxxx` 多くの場合xxxxに会社名とかのnameが付与されるので、フルパスで設定されているアプリとかはこれが原因で起動しなくなる。
大体の原因がこれ。

* VirtualBoxが起動しない 
 * ~/Library/VirtualBox/VirtualBox.xmlを開く 
 * この中の /Users/#{username} の部分を全部、新usernameに書き換える（要backup）

#### 2. owner権限が変わり、sudoが使えなくなる
/usr/local の owner が root か 会社のsuper admin になっている。（1.）でpathの変更がsudo権限でないと変更できないパティーンがあり、主に、Homebrew + McAfee Anti-Virus 環境だとこれが原因で上手くアップデートできない。

正直、Web管理でsudo使えないとか、色々支障なので普段使いのUserにsudo権限を与えてもらおう。

```
brew update

```
自分で↑できない開発者とかゴミクズ。

＜sudo付与の手順＞
1. まずsuper adminでログインする
2. ターミナルで`sudo visudo` と叩く
3. エディタが立ち上がるので、#{username} ALL=(ALL) ALL を書き足す
※ {username} は新しい方で。
4.HomebrewとMcAfeeをアップデート
```
$ sudo chown -R #{username}.kcc /usr/local
$ sudo chown -R root /usr/local/McAfee
$ sudo chown -R #{username}.kcc /Library/Caches/Homebrew
```
これでHomebrew と McAfee どちらもアップデート可能。

#### 3. gemが起動しない
rubyがぶっ壊れる。gemで入れてるコマンドは全部。rakeとかbundleとか全部該当。
~/.rbenv/shims 以下のコマンド群は最終的に(1.)と同じく /Users/#{username}/.rbenv/versions 以下のコマンドを呼びに行くように決め打ちで書かれている。

＜手順＞
Ruby をインストールし直す。全部。gem も全部入れ直し。

```
$ rbenv global system
$ rbenv versions
$ rbenv uninstall hogehoge   ※yでアンインストール開始
$ rbenv install hogehoge
```
VirtualBox の設定ファイルと同じようにフルパスで書かれている部分を全部書き換えることでも対応はできるが、膨大にあるうえに全自動で書き換えると壊れてしまうファイルもあるので、諦めるのが無難。


#### 4. sshの秘密鍵のパスフレーズを聞き直される
sshの秘密鍵の場所が変わるので、OSXのキーチェーンが覚えているパスフレーズが効かなくなる。（別な鍵と認識される。） 

これは、単に入れ直せばいいだけ。

#### 5. Library以下に権限や設定が付与されるアプリの設定を削除・再インストール

Dropboxとか、sublimetextのパプリック設定とかが該当。エラーをだして権限の変更が必要とか言われ続けしまいに止まる。

アプリをアンインストールした上で/Libraryにある設定全て全消し。再インストールしてめでたしめでたし。
「.」とかが最初につく隠しファイルは見えるようにしてから取りかかりましょう。


## まとめ
まぁ、Web開発者である我々は、おそらくMac信者が大半ででしょうが、「管理する側」はMacが嫌いなケースが多いのが、世知辛い日本社会ですね。：D

正直、全社員がある程度のリテラシーを備えて、管理ができるならば必要がないかもしれませんが、郷にしたがうのも一向。

問題を解決することで、仕組み自体の理解を深められたのなら儲けもの。。アーメン

## 追記(2015/7/16)
Vagrantがめっちゃ重たい。McAfeeの除外設定をやり直しが必要。/Users/#{user}/VirtualBox VMs を /Users/#{user}.kcc/VirtualBox VMs に変更する。
社内でMaven実行時、外部のMavenリポジトリサーバーからダウンロードができない時の対処方法

Maven実行時、社内から外部のMavenリポジトリサーバーに対してダウンロードが実行され、環境によってはエラーが起こるかと思います。 その際、Mavenの設定ファイルにプロキシの設定を行えば解消される可能性があります。(私はこれで解決できました)

`Mavenを配置したディレクトリ/conf/settings.xml` に以下の設定が書かれています。

```xml:/.../apache-maven-3.2.3/conf/settings.xml
  <proxies>
    <!-- proxy
     | Specification for one proxy, to be used in connecting to the network.
     |
    <proxy>
      <id>optional</id>
      <active>true</active>
      <protocol>http</protocol>
      <username>proxyuser</username>
      <password>proxypass</password>
      <host>proxy.host.net</host>
      <port>80</port>
      <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>
    -->
  </proxies>

```

コメントを外して、以下の設定を行います。

1. `id`はそのまま。
2. `active`もtrueのまま。
3. `protocol`も基本httpのまま。
4. `username`は認証が必要であればユーザー名を入力。不必要であれば行ごと削除。
5. `password`は認証が必要であればパスワードを入力。不必要であれば行ごと削除。
6. `host`はプロキシサーバーのIPアドレスを入力。
7. `port`はプロキシサーバーに接続するポート番号を入力。
8. `nonProxyHosts`はプロキシサーバーを使わずに接続できるドメイン。 不必要であれば行ごと削除。

これで`mvn eclipse:eclipse`とかしてもきちんとダウンロードされるはずです。
アプリケーションの外部ツールからgVimを呼び出す時の設定


gVim を外部ツールとして利用する場合、Vimには`--remote`(`--remote-tab`、`--remote-tab-silent`等を含む)というオプションがあります(gVimが`+clientserver`でビルドされている場合)。

このオプションを利用すると、既に起動しているVimのプロセスが存在していた場合、そのアプリケーションウィンドウでファイルを開くことができます。

しかし、わりと不便な欠点もあって、例えば、ファイルを開くときの行数を指定できません。

ふつう、Vimでファイル名と行数を指定する場合、

```
vim +42 foo/bar.txt
```

というように指定しますが、`--remote` 系のオプションをつけてしまうと、この`+N`の行数指定が無効になってしまいます。

これでは、Visual Studio からXMLやJSONをVimで編集したい、なんて時に、Vimで開いた後で再度検索したり、行ジャンプしなければならず、不便です。

そこで、これらのオプションを利用することをやめ、別のアプローチをすることにします。

それは、`--remote-send` オプションで、キーストロークを直に送る方法です。
こうすることにより、コマンドラインに`:edit +N foo.txt`を外部から注入してファイルを開くことができます。

例えば、Visual Studio から開く場合、以下のような設定となります。

![2015-07-13 15_38_29-External Tools.png](https://qiita-image-store.s3.amazonaws.com/0/11139/d79138d7-bb82-8f10-472f-7be79ccc1f87.png)

* Title: `g&Vim`
* Command: `Path\To\gvim.exe`
* Arguments: `--remote-send  "<C-\><C-n>:tabedit +$(CurLine) $(ItemPath)<CR>"`
* Initial directory: `$(ProjectDir)`

Arguments 以外の項目はお好みで構いません。

`--remote-send` の冒頭で `<C-\><C-n>` を入力しているのは、Vimをどのモードからでもノーマルモードに遷移させるためです。(参照:[CTRL-N_CTRL-N](http://vim-jp.org/vimdoc-ja/intro.html#CTRL-\_CTRL-N))

この例では、`:tabedit` を指定しているため、VisualStudioで編集中のファイルのカーソルのある行を新規タブで開きます。
物理マシンにCentOS6.5 32bitをインストール


余ったマシンでちょこっと遊ぶ用にセットアップしたのでメモ。

# インストール用メディアを作成
DVDドライブを取っ払ったマシンなのでUSBブートでインストールします。  

[ここ](http://vault.centos.org/6.5/isos/i386/)のLiveCDイメージを持ってきます。  
普通にググると出てこないので、イメージのファイル名から辿りました。  
  
[UneBootin](http://unetbootin.sourceforge.net/)を利用してUSBにブート可能な状態でCentOSをぶっこみます

# インストールする
+ まずUSBでブートする
+ デスクトップに、このPCへインストールする的なアイコンがあるので実行
+ なんかいろいろ言われるけどHDDはフォーマットした
+ 再起動してUSBブートからHDDでブートするように設定変更
+ 無事起動を確認

# SSHサーバインストール・起動
なんとssh-serverがデフォルトで動いてないので動かす

```bash
# yum -y install openssh-server
# /etc/rc.d/init.d/sshd start
```

sshでつながることを確認したらCentOSのGUIとはおさらば。



# その他初期設定
ユーザ作ったりします

```bash
# useradd user
# passwd user
# usermod -G wheel user
# visudo
```

```vim
root    ALL=(ALL)    ALL
user    ALL=(ALL)    NOPASSWD:ALL    #追記
```
  
    
    
IPアドレス固定(CUIからやったらコケたのでGUIでやった)

```bash:/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
NETMASK=255.255.255.0
USERCTL=no
IPV6INIT=no
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
NAME="System eth0"
UUID=5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03
HWADDR=40:61:86:8F:FC:5C
IPADDR=192.168.1.3
PREFIX=24
GATEWAY=192.168.1.1
DNS1=192.168.1.1
LAST_CONNECT=1435467743
```

DNS設定

```bash:/etc/resolv.conf
nameserver xxx.xxx.xxx.xxx
```

GATEWAY

```bash:/etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=localhost.localdomain
NTPSERVERARGS=iburst
GATEWAY=192.168.1.1
```

最後にネットワーク再起動

```bash
# service network restart
```

# SSHの設定をいじる

## 何はともあれ鍵認証する

まずは手元で鍵を作成し、CentOSに公開鍵をscpで送り付ける

```bash
$ cd ~/.ssh
$ ssh-keygen
$ scp id_rsa.pub hoge@centos:/home/hoge
```

鍵を投げたらCentOS側で操作

```bash
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ cat ~/id_rsa.pub >> authorized_keys
$ chmod 600 authorized_keys
$ sudo /etc/rc.d/init.d/sshd reload
```
ここで一旦手元のマシンから鍵認証できるか確認して次の操作へ。

## sshの設定とか

```bash
$ sudo vim /etc/ssh/sshd_config
```

```config:sshd_config
Port 9999    #←適当な値に変更する

PermitrootLogin no    #rootログイン不許可

PasswordAuthentication no    #パスワードでのログイン禁止

```
sshのポート変えたので、iptablesでポート開放の設定も変更する

```config:/etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9999 -j ACCEPT    #追加
```


最後に`sshd reload`、`iptables restart`して、鍵認証出来てるかとかパスワード認証出来なくなってるかとか確認

ついでに手元のマシンの.ssh/configも設定しておくと吉。  
  
  



# 参考リンク
+ [CentOS のLive CD からブータブル Live USBを作成してみたAdd Star](http://d.hatena.ne.jp/nash1234/20141221/1419193381)
+ [SSHサーバ構築](http://rat.cis.k.hosei.ac.jp/article/rat/serverliteracy/2004/sshd.html)
+ [はじめての自宅サーバ構築 - Fedora/CentOS -](http://kajuhome.com/openssh.shtml)
+ [ユーザーアカウントを追加する](http://www.server-world.info/query?os=CentOS_6&p=initial_conf)
+ [[Linux]CentOSで手動で固定IPアドレスの設定を行う](http://blog.quall.net/linuxserver/182/)
+ [CentOS 6.5 - SSH サーバ 鍵認証接続！](http://www.mk-mode.com/octopress/2013/12/15/centos-6-5-ssh-connection-by-key-certificate/)
dateコマンドを使って１秒未満のプログラム実行時間を計測する

# １秒未満の時間を取得

dateコマンドで+%Nオプションをつけると、000000000から999999999までのナノ秒単位で時間を返します。

ちなみに、単位の換算ですが、１秒は1,000,000,000ナノ秒です。

```
$ date +%N
479374300
```

したがって、これは「479,374,300ナノ秒」であることを示しています。

ただ、あまり小さな値は信用しないほうがいいでしょう。どれぐらいまで信用していいのかは知りません。

# プログラムの実行時間を計測する

では早速、実行時間の計測をしましょう。

ここでは、１秒かからないプログラムとして、適当にecho "Hello, World!"を採用しました。

```bash
#!/bin/bash
NANOTIME1=`date +%N`
echo "Hello, World!"
NANOTIME2=`date +%N`
NANOTIME=`echo "scale=3; (${NANOTIME2} - ${NANOTIME1})/1000000000" | bc`
echo "It took ${NANOTIME} sec"
```

bcコマンドを使って小数の計算をし、単位を秒に変換しています。手元の環境では、"It took .050 sec"と出力されました。

なお、１秒以上かかるプログラムの実行時間を計測する場合については、以前Qiitaに投稿しています。

- [dateコマンドを使ってプログラムの実行時間を計測する](http://qiita.com/kaw/items/dd4dd41afe7288e90ac9)
does not have a member named setTranslatesAutoresizingMaskIntoConstraintsって言われたら見るページ

# translatesAutoresizingMaskIntoConstraintsを試してみよう

## 実行環境
```
Xcode7 beta3
Swift2
```

## コード

```swift
hogeView.translatesAutoresizingMaskIntoConstraints = false
```

・参考
ios - UIButton does not have a member named setTranslatesAutoresizingMaskIntoConstraints - Stack Overflow
http://stackoverflow.com/questions/31252785/uibutton-does-not-have-a-member-named-settranslatesautoresizingmaskintoconstrain