OmniAICreator/Qiita-1.07M huggingface dataset:
kuromojiでユーザー辞書を使用する

# 環境
Windows7

# sbt
```scala:sample.sbt
resolvers += "ATILIKA dependencies" at "http://www.atilika.org/nexus/content/repositories/atilika" 

libraryDependencies ++= Seq(
  "org.atilika.kuromoji" % "kuromoji" % "0.7.7" ,
  "com.typesafe" % "config" % "1.2.1"
)
```
# コード
コードは以下の通り

```scala:sample.scala
object ExTokenizer {
  def tokenize(text: String): Iterator[Token] = {
    Tokenizer.builder()
      .userDictionary(".\\src\\main\\resources\\userdict.txt")
      .build().tokenize(text).iterator().toIterator
  }
}
```

```scala:Main.scala
object Main {
  def main(args: Array[String]): Unit = {
    ExTokenizer.tokenize("銀聯売上").foreach{token =>
      println(token.getSurfaceForm)
    }
  }
}
```

```text:userdict.txt
# カスタム辞書
銀聯,銀聯,ギンレン,カスタム名詞
```

# 注意点
userdict.txt ですが、 utf-8 では上手く動きませんでした。
試しに windows-31J にしたら想定通りの動きをしてくれました。
（気づくまでに時間がかかりました。。。）
「現在のページへのリンクをハイライトさせる」がjqueryでさくっとできてビックリした話



# やりたかったこと
メニューリンクによくある、いま自分のいるページ（現在地）へのリンクの文字色やら背景色やらが変わる、例のあれ。

某phpフレームワークでできているサイトでこれを作りたくて、if文なりなんなり書くのかなあ、と考えていたら、jquery でなんともあっさりできました。

# コード
jquery は読み込んだうえで。

```javascript
<script>
	 var url = window.location;
        $('.nav a[href="'+url+'"]').addClass('active');
</script>

</head>
```

```html
<ul class="nav">
	<li><a href="http://www.test.com/test.html">test</a><li>
	<li><a href="http://www.test.com/test2.html">test</a><li>
</ul>
```

```css
.active{color:red;}
```
test2.html を訪れている時は、test2のリンクテキストが赤字になる。

# 注意点
* クラス名の指定間違えないように
* リンクはhttpからのフルパスで書くように

とはいえ、リンクをフルパス以外で書きたいときもあるのですよ。
そんなときは、window.locationのプロパティを変えればよい。

```javascript
<script>
	 var url = window.location.pathname;
        $('.nav a[href="'+url+'"]').addClass('active');
</script>

</head>
```

```html
<ul class="nav">
	<li><a href="/test.html">test</a><li>
	<li><a href="/test2.html">test</a><li>
</ul>
```

# まとめ
普段PHPerな筆者。
同じことをPHPだけでやろうとしたら、出来なくはないけど非常にぐっちゃぐちゃになって面倒なコードになる。
困った時のjs, jquery 頼みを肝に銘じよう。

#参考
https://developer.mozilla.org/ja/docs/Web/API/window.location
【Unity2D】Spriteを加算合成で描画する方法

![001.png](https://qiita-image-store.s3.amazonaws.com/0/43772/e477484d-fef5-bae4-329b-65c51a967e9e.png)
こんな感じのイケてない画像を加算合成する方法を紹介したいと思います。

![002.png](https://qiita-image-store.s3.amazonaws.com/0/43772/06aa4205-7364-5eec-9256-79d8117ef32c.png)
Spriteを作成した直後はデフォルトのシェーダがアタッチされているためこのような描画となっています。
なので、これを加算合成用のものに差し替えます。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/43772/94957f83-fada-2c54-68dc-7cc405073434.png)
Projectビューを右クリックして、「Create > Meterial」を選択し、Materialを新規作成します。作成したらそのMaterialを選択し、InspectorからShaderを「FX/Flare」に変更します。

![004.png](https://qiita-image-store.s3.amazonaws.com/0/43772/c3b2cc0e-1ed7-0ea1-7165-ca4f77c47a61.png)
そうしたら適用したいSpriteのInspectorのSprite Rendererから先ほど作成したMaterialを選択してアタッチします。

![005.png](https://qiita-image-store.s3.amazonaws.com/0/43772/eeb8fdde-7cb5-aef0-a0e5-d24b7ed1d077.png)
これでそのSpriteは加算合成で描画されるようになります。

###追記
FX/Flareだと、透過値（アルファ値）が変更できないので、「Particles/Additive」または「Particles/Additive (Soft)」を使ったほうが良さそうです。
VBAで作ったアドインをリボン付で配布する

#VBAで作ったファイルをリボン付でアドイン化する

前提1：ExcelのVBAに、IRibbonControl型のパラメーターを唯一の引数とする関数は_eventhandlerを接尾語として記述する

```
Public Sub MainHtmlReading_eventhandler(control As IRibbonControl)
  Htmlreader
End Sub
   
'呼出し関数の本体
Public Sub Htmlreader()
  'VBAの処理    
 End Sub
```

前提2：ExcelのVBAを特定のブックに依存しない形で作成し、xlam形式(Excelアドイン）で保存する


##ツールのダウンロード

* OfficeCustomUIEditorSetup.zip をダウンロードする
http://openxmldeveloper.org/blog/b/openxmldeveloper/archive/2006/05/26/customuieditor.aspx
こちら、zipを解答するとmsi形式のインストーラーになっています。途中で管理者権限を求められたりしますが、openxmldeveloper.orgはMS公式サイトみたいなものなので、大丈夫（なはずです）

## Custom UI EditorによるRibbonパーツ編集
1. インストーラーによりスタートメニューに登録されているので、スタートメニューから「Custom UI Editor for Microsoft Office」を起動する

1. File>Openからあらかじめ作ったxlamファイルを呼び出す

1. Menu Insert>'Office2010 Custom UI part' を実行することで、customUI**.xmlが追加される

1. 次のxmlを下のxmlへコピーして必要に応じて名前を書き換える

```
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
	<ribbon>
		<tabs>
			<tab id="customTab" label="TestCase" insertAfterMso="TabHome">
				<group id="customGrp" label="Compiler" imageMso="MailMergeResultsPreview" autoScale="true">
				<button id="SeleniumBuilder" label="SeleniumIDE" imageMso="ViewSheetGridlines" onAction="MainHtmlReading_eventhandler" visible="true" size="large"/>
				</group>
			</tab>
		</tabs>
	</ribbon>
</customUI>
```
5. File>Save により保存する

##さらに、マクロ時実行時にセキュリティの警告ができないようにアドインを配置する

1. ファイル>オプション>セキュリティセンター>セキュリティセンターの設定... からセキュリティセンターを呼び出す
2. 「信頼できる場所」から適当な場所にxlamファイルをコピーする

##そして、アドオンを登録する

1. ファイル>オプション>アドインにて「管理(A)」でExcelアドインが表示されていることを確認の上、「設定...」をクリック
2. 「参照(B)...」でxlamファイルを登録する
[jQuery]トースト通知を表示する

2020/09/04 加筆
**バージョンアップさせ、非jQuery依存にしましたので、[Androidっぽい見た目のトースト通知を作ってみた(非jQuery依存)](https://qiita.com/negi3d/items/285e7882513271290fc2)の方をご覧ください**

---

Androidで数秒で消える通知メッセージ（トースト通知）を、jQueryで実装してみました。
見た目もAndroid風で、画面下のセンターに黒背景・白文字で表示します。
(IE9～11、Chrome、FireFoxで動作確認)

　　　![クリップボード.png](https://qiita-image-store.s3.amazonaws.com/0/27057/ecd66c9d-f399-f518-9dac-fa3959bd5266.png)

**トースト通知のJavaScript版ライブラリとしては、[Toastr](http://codeseven.github.io/toastr/)というライブラリが有名なようです。**

```js:JavaScript
// トースト通知クラス
var Toast = (function(){
	var timer;
	var speed;
    function Toast() {
		this.speed = 3000;
    }
    // メッセージを表示。表示時間(speed)はデフォルトで3秒
	Toast.prototype.show = function(message, speed) {
		if (speed === undefined) speed = this.speed;
		$('.toast').remove();
		clearTimeout(this.timer);
		$('body').append('<div class="toast">' + message + '</div>');
		var leftpos = $('body').width()/2 - $('.toast').outerWidth()/2;
		$('.toast').css('left', leftpos).hide().fadeIn('fast');
	
		this.timer = setTimeout(function() {
			$('.toast').fadeOut('slow',function(){
				$(this).remove();
			});
		}, speed);
	};
    // 明示的にメッセージを消したい場合は使う
	Toast.prototype.hide = function() {
		$('.toast').fadeOut('slow',function() {
			$(this).remove();
		});
	}
    return Toast;
})();
```

```css:CSS
.toast{
	position: fixed;
	bottom: 10px;
	display: inline-block;
	background: rgba(0, 0, 0, 0.6);
	color: #fff;
	border-radius: 15px;
	padding: 8px 15px;
	border: none;
	z-index: 1000;
	box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.2);
	font-size: 13px;
}
```
`var toast = new Toast();`で初期化して、
使うときは、`toast.show(msg);`または`toast.show(msg, 5000);`みたいに
使います。
【Unity2D】Spriteを左右反転する方法

![001.png](https://qiita-image-store.s3.amazonaws.com/0/43772/2b73b9d7-3b87-f4c4-11d9-e0dedd2b2eb0.png)
Spriteの中心(Pivot)をCenterにしていれば、transform.localScale.xに負の値を代入することで、Spriteが左右反転します。

```csharp:
float x = Input.GetAxisRaw("Horizontal");
// デフォルトが右向きの画像の場合
// スケール値取り出し
Vector3 scale = transform.localScale;
if(x >= 0) {
  // 右方向に移動中
  scale.x = 1; // そのまま（右向き）
}
else {
  // 左方向に移動中
  scale.x = -1; // 反転する（左向き）
}
// 代入し直す
transform.localScale = scale;

```
Express + Backbone.js 初手

===========


独自解釈、現時点でこれは覚えたいと思ったbackbone.jsパターン
fetchが絡むが、JSONからビューのパターンだと思ってます。


Expressの役割
-----------
### APIの提供(get, post, put, delete)
アクセスデータをparse
データベース自体の検索、追加、更新、削除
データベース情報を最適な形でリターン

	方法１：データをそのままレスポンス、ルーティングするならres.redirect、クライアントはコールバックかルーティングを待つ。
	方法２：動的routingの際に、クライアントが読み取れる場所に記す。サーバー：JSON stringify > クライアント：JSON parseのパターン。

### 動的routing
templateエンジンを使ってrenderする。
メリット


* データに直結したビューを作れる。（以下の例では分離する。）

>
* partialでHTMLのパーツ化ができる。HTMLの再利用ができる。
 * ヘッダー、フッター、ナビゲーターをパーツ管理
 * hbs(Handlebars)では 「 \\{{ variable }} 」 でレンダーエスケープできる点を利用して、クライアントの扱うテンプレートをさらに部品化できる、再利用性が高まる。

パーツ化は便利だが、JSTを使えばクライアントサイドで完結しそう。

### 静的routing
クライアントがjs, cssを正しく読み取るフォルダ、ファイル構成を作る。
これによってクライアント側のjavascriptのロジックに集中できる。

Backboneの役割＊方法１の場合
-------------
### Backbone.js のワークフロー
![Backboneクラス間関係](http://appkitbox.com/wp-content/themes/knowledge/images/ID003_backbone-500x281.jpg)


上でのRouter, Event以外を実装します。
画像にはないですが、CollectionからはServerへ矢印が伸びています。伸びるようにしているのがurlの指定です。


以下でCollection -> Model を作ります。
Collection -> Server -> Collection -> Model
でデータバインドするのがcollection.fetch()メソッドです。



### fetchへの準備

~~~coffee
	Book = Backbone.Model.extend
		idAttribute: "_id" # mongoDBの場合
	BookCollection = Backbone.Collection.extend
		model: Book
		url: "/books" # JSONの配列を得るAPIの接続
~~~

この時点でサーバー -> モデル が完成。
完全に黒魔術・・・

### １モデルの１ビュー
View（のひとつ） -> Model を部分を作ります。
View -> Template のメソッドを作ります。

~~~coffee
	BookView = Backbone.View.extend
		tagName: "li" # 「追加をしていくビュー」はliですという意味。
		className: "book"
		render: () ->
			template = $('#book-template').html()
			compiled = Handlebars.compile template
			html = compiled @model.attributes
			@$el.html html
			return this
~~~

		renderメソッド解説
			１．「templateに使うstring」を持ってくる。
			２．「templateに使うstring」からtemplate関数を作る。
			３．template関数にJSONを投げて、「追加するstring」を得る。
			４．「追加をしていくビュー」に「追加するstring」を追加


>
えっ、意味わからん・・・！ 僕はテンプレート投げて返ってくる奴をそのままビューとして扱いたいのに・・・、Backbone.js使う場面じゃないのかな・・？

A. それなら親になるタグをjQueryでとってきてel: に指定してください。木構造ですから親は一人ですよ。


### １ビューをより大きなビューに追加するためのコレクションビュー

View -> Collection を作る。
View -> Template のメソッドを作る。

~~~coffee
	BookCollectionView = Backbone.View.extend
		tagName: "ul" # 追加をしていくビューは(ry
		className: "books"
		render: () ->
			@collection.each (book) =>
				bookView = new BookView
					model: book
				@$el.append bookView.render().el
			return this
~~~



		renderメソッド解説
			１．コレクションを受け取っている（∵インスタンスパターン）
			２．よってコレクションが持つ、モデルも知っていることになる。
			３．よって１ビューを作れることになる。
			４．「追加をしていくビュー」に１ビューずつ追加する。

この時点で モデル -> ビューの召還魔法は整った。

### 手続き部（コントローラー）（routerへリファクタリングする前）

初期化 + Template -> HTML 

~~~coffee
	$ () ->
		collection = new BookCollection()
		collection.fetch
			success: (data) ->
				view = new BookCollectionView
					collection: data
				$('body').append view.render().el
~~~



Backboneの役割＊方法２の場合
-------------
これをリファクタリング？する方法

* Backbone.Routerをコントローラ化
* fetch解消（サーバー -> データ + データ -> モデルに分離）
* ビュー追加の分離（統括ビューに追加状態からビュー生成 + ビュー追加メソッドに分離）

拡張：

* DOMイベント
* 別routeでviewを切り替える
* Routerイベントを張る
* Eventオブジェクトで発火
* モジュール化（require.js or browserify）

たぶん続き書く。
minicom 使い方・オプション

### 基本的な使い方
<pre>
$ minicom -D デバイスファイル
</pre>

### よく使うオプション
* -s ... 設定画面。設定値は /etc/minirc.dfl に保存される。  "-o" 同様初期化されないで起動する。
* -o ... 初期化しないで起動。再設定なしで、高速に再起動することが出来る。　　
* -D ... デバイスを指定。
* -S ... 起動時に指定したスクリプトを走らせる。
英語キーボードでenthumbleを使用する方法

# <i class="fa fa-check-circle-o"></i> はじめに
## <i class="fa fa-check-square-o"></i> キーボード快適化ソフト | enthumble
[http://jp.enthumble.com/](http://jp.enthumble.com/  "enthumble")
Windows用フリーソフト | インストール不要 

# <i class="fa fa-check-circle-o"></i> 英語キーボードへの対応方法
英語キーボード等は、無変換キーや変換キーがないため、enthumbleが動作しません。この課題を解決するため、enthumbleではF18キーが無変換キー・F19キーが変換キーとして動作するようにしています。

(または英語キーボード専用のenthumbleも作成していますので、作者までご連絡ください。)

キーコード変更ソフトで、左右のAltキーをF18、F19キーへ設定してください。これで英語キーボード等でもenthumbleが正常に動作します。

キーコードの変更には、フリーソフトのChangeKeyなどが便利です。
http://www.forest.impress.co.jp/library/software/changekey/

ChangeKeyは、「管理者権限」で実行する必要があります。

```html
@設定用キーコード(ver. 4.0～)
左Alt: 0x0069 (F18)
右Alt: 0x006A (F19)
```
*ver. 4.0 からキーコードを変更しています。

# <i class="fa fa-check-circle-o"></i> リンク
こちらもご参照ください。

・[enthumble Readme 【説明書】](http://qiita.com/mhara/items/d2d072592a4db9243c99  "enthumble Readme 【説明書】") 

・[enthumble キーカスタマイズ【基本編】](http://qiita.com/enthumble/items/44064da2d77ddbd258b7  "enthumble キーカスタマイズ【基本編】")

・[enthumble キーカスタマイズ【応用編】](http://qiita.com/mhara/items/5ea8de992e8f99fce829  "enthumble キーカスタマイズ【応用編】")

・[enthumble キーカスタマイズ例 【開発者本人】](http://qiita.com/mhara/items/c666b487fbd06805527b  "enthumble キーカスタマイズ例 【開発者本人】")

以上
UIWebViewの高さを動的に変更する方法

UIWebViewで動的に高さを変更したかった。
※ちなみにRubyMotion使ってますが、やり方はそんな変わらないはず。

調べるとwebViewDidFinishLoad内でJSでコンテンツの高さを取得して設定する方法が一般的らしい。
ということで試してみたら出来ずに困った。
まず最初はこんな感じで書いてみた。

```ruby:view_controller.rb
def viewDidLoad
  super
  web_view=UIWebView.alloc.initWithFrame(self.view.frame)
  web_view.delegate =self
  web_view.loadHTMLString("<html><body>text</body></html>", baseURL: nil)
  self.view.addSubview web_view
end

def webViewDidFinishLoad(web_view)
  height = web_view.stringByEvaluatingJavaScriptFromString("document.documentElement.clientHeight;")
  new_bounds = web_view.bounds
  new_bounds.size.height=height.floatValue
  web_view.frame=new_bounds
end
```

でも高さが変わらない。
heightの値を見るとWebViewの高さがそのまま返ってきてる模様。
でもコンテンツの高さなんて「text」しか書いてないのでそんなわけない。

結果JSで取得する方法を変えてみたら取得できた。
単にJSの問題・・・。

```ruby:view_controller.rb
def viewDidLoad
  (略)
  web_view.loadHTMLString("<html><body><div id='HtmlId'>text</div></body></html>", baseURL: nil)
  self.view.addSubview web_view
end

def webViewDidFinishLoad(web_view)
  height = web_view.stringByEvaluatingJavaScriptFromString("document.getElementById('HtmlId').clientHeight;")
  (略)
end
```

でもUIWebViewの大きさを動的に変更したあとの数値を使って画面を構成しようと思ったらwebViewDidFinishLoadのあとに処理書くことになるのかな？
うーむイマイチ理解不足。。。
VBAで作ったマクロをxlsx形式のファイルで利用する

# ExcelVBAで作ったマクロをアドイン化する

VBAでマクロを作成して作業を自動化する方は多いと思いますが、マクロだけ分離しても大丈夫ということは結構知られていないのではと思います。

## 1. xlsm形式で保存する

普通にマクロ付ファイルとして保存すると、xlsm形式になるのはご存知ですがこちらは開くたびに警告が出るのは困りものです。
報告書を作成するのにVBAを使っていたりする場合、マクロの部分だけxlsmとして作って、報告書のファイルとか共有する部分はxlsxで作成する。で、二つのファイルを一緒に開いて、xlsxのドキュメント上の「開発」タブから「マクロ」を呼び出してやる。もしくはAlt+F11で"Microsoft Visual Basic for Applications"を呼び出すととxlsmの関数が呼び出せます。
xlsm上でActiveSheetとかActiveWorkBookとかは最後にactiveだったxlsxになります。

## 2. xlam形式で保存する
あまり知られていないのがExcelアドイン形式で保存すること。
こちらはデフォルトのExcelアドインフォルダに保存されようとします。この形式のファイルは「オプション」>「アドイン」の管理（A):Excelアドイン の「設定(G)...」の「アドイン」ダイアログの「参照(B)...」から読み込むことで、Excelのアドインとして登録することが可能です。
上記1.ではxlsmを一緒に立ち上げなければいけないという難点がありましたが、こちらはExcelが起動するときに常に使える状態になっています。

## 3. マクロの呼び出し用のリボンを作る
上記で登録したマクロはリボンに簡単に登録することができます。
「オプション」>「リボンのユーザー設定」で「コマンドの選択」から「マクロ」を選択すると、呼び出し可能なマクロの一覧が出てきます。
 ただし、このマクロは「ユーザー設定」のグループにしか登録できないので「新しいグループ」によりマクロ用のグループを作成し、そこに対して「追加」することになります。
新しいグループは既存の「ホーム」タブとかにも追加可能です。

ただし、この方法だと、xlam形式のアドインを配った端末・ユーザーに対してそれぞれリボンを追加する必要があります。
そこで利用可能なのは Custom UI Editor tool http://openxmldeveloper.org/blog/b/openxmldeveloper/archive/2006/05/26/customuieditor.aspx になります
Windows Server 2012評価版をvmware playerにインストールする

# 環境
## ホストOS
1. Windows 7 Professional SP1 64bit
2. VMware Player 5.0.0 build-812388

## ゲストOS
1. Windows Server 2012 評価版

# インストール要件
 http://technet.microsoft.com/library/jj134246#BKMK_sysreq
 システムパーティション 32GB 以上という以外は、個人的に気にすることはなし。

# はまったところ
- 簡易インストールは失敗(VMWare Playerからプロダクトキーの入力が要求されてしまう)
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/18719/e8868e23-585c-17bb-4a48-5c70f963620e.jpeg)

# 手順
1. 仮想マシン作成ウィザードから仮想マシン作成
簡易インストールをかわすために「後でOSをインストール」を使用
![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/18719/e85cad90-3093-b4dd-0a87-b8ce14a8cd62.jpeg)

2. ゲストOSの選択
「Windows  8 Server x64」を選択
![WS000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/18719/1722ead1-47df-84eb-505a-8caeb8b654b5.jpeg)

3. 仮想マシンの名前
適当に。
![WS000009.JPG](https://qiita-image-store.s3.amazonaws.com/0/18719/e2bbe939-5eec-84a7-4376-f5acb2fa6084.jpeg)

4. ディスク容量の指定
仮想ディスクを単一ファイルとして格納を選択。特に理由はなし。
![WS000010.JPG](https://qiita-image-store.s3.amazonaws.com/0/18719/001e1f4e-2b82-10cc-a5ac-796a9807fd95.jpeg)

5. インストールディスクを仮想マシンに食わせる
![WS000013.JPG](https://qiita-image-store.s3.amazonaws.com/0/18719/1a3c0e68-3d75-eb35-328e-c496afe9f17b.jpeg)
 
![WS000014.JPG](https://qiita-image-store.s3.amazonaws.com/0/18719/8768acda-e423-4223-38a7-38ccbde663d6.jpeg)

6.仮想マシンを起動
![WS000015.JPG](https://qiita-image-store.s3.amazonaws.com/0/18719/2496c3be-ba8e-8788-5a9d-399804cec121.jpeg)

7.OSインストール
以下、設定事項を箇条書き
- インストールするオペレーティングシステムの選択: Windows Server 2012 Standard 評価版(GUI)
- インストールの種類: カスタム
- インストール場所: ひとつしかないので迷わない
- AdministatorのPW設定: アルファベット小文字・数字だとパスワードポリシーエラーとなった。アルファベット大文字を足すとクリア

8.完了
![WS000016.JPG](https://qiita-image-store.s3.amazonaws.com/0/18719/a571c294-14e1-a3c4-dc3f-41a29a24c0b6.jpeg)
dockerを触ってみる。


dockerを試しで操作した時のメモ


rpmを追加する。

```
$ wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ rpm -ivh epel-release-6-8.noarch.rpm
```

dockerをインストール

```
$ yum -y --enablerepo=epel install docker-io
```

```
service docker status
docker is stopped
```

動かしてみる。

```
$ docker run -t centos /bin/echo "hello docker"
hello docker
```

コンソールに入ってみる。

````
docker run -i -t centos /bin/bash
bash-4.1#
```

使えるコマンド

```
cat /proc/cpuinfo
```

df はエラーが出る。

```
df -h
df: cannot read table of mounted file systems: No such file or directory
```


イメージファイルを確認する。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
centos              update              30c0ab421520        2 weeks ago         343.5 MB
centos              centos6             0b443ba03958        3 weeks ago         297.6 MB
centos              latest              0b443ba03958        3 weeks ago         297.6 MB
centos              6.4                 539c0211cd76        13 months ago       300.6 MB
```


logも確認できる

```
$ docker logs 0b443ba03958
2014/05/13 22:21:05 Error: No such container: 0b443ba03958
```


helpを見ると色々ある。

```
$ docker help
Usage: docker [OPTIONS] COMMAND [arg...]
 -H=[unix:///var/run/docker.sock]: tcp://host:port to bind/connect to or unix://path/to/socket to use

A self-sufficient runtime for linux containers.

Commands:
    attach    Attach to a running container
    build     Build a container from a Dockerfile
    commit    Create a new image from a container's changes
    cp        Copy files/folders from the containers filesystem to the host path
    diff      Inspect changes on a container's filesystem
    events    Get real time events from the server
    export    Stream the contents of a container as a tar archive
    history   Show the history of an image
    images    List images
    import    Create a new filesystem image from the contents of a tarball
    info      Display system-wide information
    insert    Insert a file in an image
    inspect   Return low-level information on a container
    kill      Kill a running container
    load      Load an image from a tar archive
    login     Register or Login to the docker registry server
    logs      Fetch the logs of a container
    port      Lookup the public-facing port which is NAT-ed to PRIVATE_PORT
    ps        List containers
    pull      Pull an image or a repository from the docker registry server
    push      Push an image or a repository to the docker registry server
    restart   Restart a running container
    rm        Remove one or more containers
    rmi       Remove one or more images
    run       Run a command in a new container
    save      Save an image to a tar archive
    search    Search for an image in the docker index
    start     Start a stopped container
    stop      Stop a running container
    tag       Tag an image into a repository
    top       Lookup the running processes of a container
    version   Show the docker version information
    wait      Block until a container stops, then print its exit code
```

今度もうちょい試してみよう。
指定した日付以前に作成されたファイルを一括で削除するコマンド

アプリケーションログなどが溜まってディスク容量を逼迫している場合に便利です。

# 例）90日より前に作成されたログファイルを削除する

```bash
find /export/httpd/hogehoge/logs -maxdepth 1 -type f -mtime +90 -regex ".*/logs/.*\.log" | xargs rm -f
```

下記のようにcronを仕込んでおくと便利です。

```bash
# 毎日0時10分に、3ヶ月以前のアプリケーションログを削除
10 0 * * * /usr/bin/find /export/httpd/hogehoge/logs -maxdepth 1 -type f -mtime +90 -regex ".*/logs/.*\.log" | /usr/bin/xargs /bin/rm -f
```


**※tmpwatch使えよとか言わないの...**
sshとか鍵とかの設定 [初心時メモφ(・・*)]

エンジニアにキャリアチェンジして苦労した時、ざっくりメモ。


＜アクセス側＞
● kye 作成
   ・ 作成場所：~/ .ssh 　※なければ作る
　`ssh-keygen -C coment`

　※コメントは、何のデバイスか Serverユーザー名、
　なんのドメインサーバーか等を書いておくと見分けがついていいかも

　※既存の公開鍵ファイルと重ならないように
　　鍵ファイル名を設定して作成したい場合
　　オプション -f filename

   ※作成時にいろいろ聞かれるけれど、設定すると後で面倒だったり、
　　特に設定の必要はいらないことが多いのでそのままEnterで
　　進み続けて作る。

   ※.pubがついているほうが、公開鍵


●アクセス
　`ssh user@IP`


＜アクセスされる側＞

●アクセス者の公開鍵登録
・登録場所：~/.ssh/authorized_keys 　 ※なければ作る
・アクセス側の公開鍵
 　id_rsa.pubの中をコピーして　authorized_keys内に貼り付け
　`vi authorized_keys `
・`chmod 600 authorized_keys`


●ssh 再起動
`service sshd restart `

参考：[sshdを再起動する時は - OpenGroove](http://open-groove.net/linux/sshd-restart/)
※注意：設定が失敗しても大丈夫なように、別画面で、ログインしておく


●sshd_config 設定
 アクセス認証の設定 鍵認証かパスワード認証か切り替え

参考：[ssh接続を鍵認証で行なう](http://www.tooyama.org/ssh-key.html)

`vi /etc/ssh/sshd_config`
PasswordAuthentication no ←yesから変更

参考：[SSHD_CONFIG](http://www.unixuser.org/~euske/doc/openssh/jman/sshd_config.html)


●公開鍵の登録先
` cd .ssh/ `
` touch authorized_keys `
` chmod 600 authorized_keys`


他参考：
[ssh鍵認証ログイン時のホームディレクトリパーミッション制限を緩める - teketeke_55の日記 ](http://teketeke55.hatenablog.com/entry/2012/02/02/165238)


●@WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!のエラーがでたとき


　〜/known_hosts:1 
　→1行目をさしている。
　たまに2行かかれてしまうことがある。

・問題なければ、該当箇所削除
・ハッシュ化されてわからない場合は

`ssh-keygen -F アクセス先IP`
`ssh-keygen -R アクセス先IP` ※指定して削除

　※アクセス先のIP ` ping ドメイン`

参考：[OpenSSH : WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! ](http://futuremix.org/2007/08/openssh-warning)
buftabs.jsをFirefox29.1に対応


[Vimperator - buftab.jsをPanoramaに対応 - Qiita](http://qiita.com/tigberd/items/802ffbd69c1da4035021) の続き

アドオンバーが廃止された（内部的にはナビゲーションバーの下あたりに移動した？）せいでbuftabs.jsが動作しなくなったので適当に動くように対応

- アドオンバーの代替として [The Addon Bar (Restored) :: Add-ons for Firefox](https://addons.mozilla.org/ja/firefox/addon/the-addon-bar/) をインストール

- buftabs.jsを挿入していた先を上記アドオンで追加したアドオンバーに変更する [tigberd/buftabs.js](https://github.com/tigberd/buftabs.js)

``` diff:buftabs.js
@@ -148,7 +148,7 @@ 
buftabs = {
     // Create the horizontal box for adding the tabs to
     createBar: function()
     {
-        var addonbar = document.getElementById("addon-bar");
+        var addonbar = document.getElementById("GiT-addon-bar");
         var buftabs = document.getElementById("liberator-statusline-buftabs");
         // Only create if it doesn't exist yet
         if (!buftabs)
```

- アドオンバー上の邪魔なトグルボタンを削除する

```vimscript:.vimperatorrc
javascript <<EOM
var adbar = document.getElementById('GiT-addon-bar');
var toggleButton = document.getElementById('GiT-addon-bar-toggle-button');
adbar.removeChild(toggleButton);
EOM
```
VPSの設定メモ


ユーザ作成

```
# adduser username
# passwd username
# visudo
```

```diff
+ username ALL=(ALL) NOPASSWD: ALL
+ Defaults    env_keep += "PATH"
+ # Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
- Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
```

ssh公開鍵登録

```
# login username
$ mkdir .ssh
$ chmod 700 .ssh
$ echo 'hoge' >> .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
```

sshサーバ設定

```
$ sudo vi /etc/ssh/sshd_config
Port, PermitRootLogin, PasswordAuthentication
$ sudo /etc/init.d/sshd restart
```

色々入れる

```
$ sudo yum -y install zsh wget tmux tig python-setuptools
$ sudo easy_install pip
$ sudo pip install --allow-external percol --allow-unverified percol percol
$ sudo pip install diff-highlight
```

git

```
$ sudo yum -y install zlib-devel perl-devel gettext gcc curl-devel
$ cd /tmp
$ git clone https://github.com/git/git.git
$ cd git
$ make configure
$ ./configure --prefix=/usr/local
$ make all
$ sudo make install
```

dotfiles

```
$ ssh-keygen
$ git clone --recursive git@github.com:tigberd/dotfiles.git
$ cd dotfiles
$ ./install.sh
$ chsh -s /bin/zsh
```

rubyをコンパイル

```
$ sudo yum -y install gcc zlib-devel openssl-devel sqlite sqlite-devel
$ cd /tmp
$ wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.1.tar.gz
$ tar zxvf ruby-2.1.1.tar.gz
$ cd ruby-2.1.1
$ ./configure
$ make
$ sudo make install
$ sudo gem install bundler
```

vim

```
$ sudo yum -y install mercurial ncurses-devel lua lua-devel perl-devel python-devel
$ cd /tmp
$ hg clone https://vim.googlecode.com/hg/ vim
$ cd vim
$ ./configure --enable-multibyte --with-features=huge --disable-selinux \
    --prefix=/usr/local \
    --enable-luainterp=yes --with-lua-prefix=/usr \
    --enable-rubyinterp=yes \
    --enable-pythoninterp=yes --with-python-config-dir=/usr/lib64/python2.6/config
$ make
$ sudo make install
```

ufw

```
$ cd /tmp
$ wget https://launchpad.net/ufw/0.33/0.33/+download/ufw-0.33.tar.gz
$ tar zxvf ufw-0.33.tar.gz
$ cd ufw-0.33
$ sudo python ./setup.py install
$ sudo chmod -R g-w /etc/ufw /lib/ufw /etc/default/ufw /usr/sbin/ufw
$ sudo service iptables stop
$ sudo service ip6tables stop
$ sudo chkconfig --del iptables
$ sudo chkconfig --del ip6tables
$ sudo vi /etc/rc.d/rc.local
+ ufw enable
$ sudo vi /etc/ufw/ufw.conf
+ ipv6=no
```
CakePHPでsession_regenerate_id(true)を呼ぶ

## 環境

* PHP 5.3.x
* CakePHP 2.4.7

## CakeSession::renew()

セッションアダプション、セッションフィクセイションの脆弱性対策として、ログイン後session_regenerate_id(true)でセッションIDを付け直すことが推奨されています。

CakePHPのフレームワークにそのような機能がないかと調べた結果、lib/Cake/Model/Datasource/CakeSession.phpにsession_regenerate_id(true)を呼んでいるrenewメソッドがあったので、これを利用することにしました。

```php:SomeController.php
CakeSession::renew();
```

core.phpでSession.autoRegenerateオプション（CakeSession::$requestCountdownがリジェネレートリクエスト間隔）を有効にしてもいいですが、定期的に変更しなくても、ログイン時だけでいいので、この方法を使っています。

これでログイン時にセッションIDを付け直すことができました。今のところ副作用はないようですが、様子見です。
RubyMineでGuardを動かしたい

RubyMine上でGuardを動かしながら快適なテストライフを送りたいと思ったのですが、設定の方法がわからなかったので調べたところstackoverflowに載っていたのでメモ

参考:[Is it impossible to use Guard with RubyMine?](http://stackoverflow.com/questions/11996124/is-it-impossible-to-use-guard-with-rubymine/12000765#12000765)

### 設定方法

1. まず、menuから`RubyMine > Rreferences`を選択し、検索ボックスに`save`と入力します。その後、リストから`General`を選択します。
![スクリーンショット 2014-05-12 18.19.38.png](https://qiita-image-store.s3.amazonaws.com/0/6129/844443e2-7796-d186-8df5-78ecaa5b9ae7.png "スクリーンショット 2014-05-12 18.19.38.png")
そして、`save files on frame deactivation`のチェックを外します。これで、auto saveが解除されました。
1. あとは`Tools > Open Terminal`でterminalを開いて
![スクリーンショット 2014-05-13 10.27.21.png](https://qiita-image-store.s3.amazonaws.com/0/6129/4412cfdb-62f9-abc3-c779-dde93a16d944.png "スクリーンショット 2014-05-13 10.27.21.png")
guardを手打ちすればRubyMine内でguardが動いてる（ふう）になります。
![スクリーンショット 2014-05-13 10.30.36.png](https://qiita-image-store.s3.amazonaws.com/0/6129/ea851ac5-e100-fc6a-399b-f534f3d161e7.png "スクリーンショット 2014-05-13 10.30.36.png")

参考にしたスレッドではIRB consoleに設定をするようになってますが、guardがbashスクリプトだったのでterminalで実行することにしました。

他の方法としてはbash pluginを入れてあげれば`Run`から実行できるようになります。ただ、こちらだと色がつかなかったり表示がちょっとおかしかったりするので、terminalでの実行におちついてます。
CentOS6.5にdockerをインストール

# Linux カーネルのバージョンアップ
RHEL系におけるdockerの[動作環境](http://docs.docker.io/installation/rhel/)は
> You will need RHEL 6.5 or higher, with a RHEL 6 kernel version 2.6.32-431 or higher as this has specific kernel fixes to allow Docker to work.

とのことですが、Linuxカーネルの不具合に起因してdockerのdevicemapperがディスクを開放しないことがある([Device-mapper does not release free space from removed](https://github.com/dotcloud/docker/issues/3182))ようなのでカーネルを最新の安定版にバージョンアップしておきます。
[CentOS6.5のカーネルを3.x系にバージョンアップ](http://qiita.com/zkangaroo/items/a3e1cd4b4d28a7c12e14)

# dockerインストール
```
$ sudo yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum -y install docker-io
$ sudo service docker start
$ sudo chkconfig docker on
```
CentOS6.5のカーネルを3.x系にバージョンアップ


**Linux kernel 3.x系に対応していないモジュールが解決していないので、実運用には向きません**

### ビルドに必要なパッケージのインストール
```sh
$ sudo yum -y groupinstall "Development tools"
$ sudo yum -y install ncurses-devel
```

### ビルド用ディレクトリの作成
```sh
$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
```

### カーネルのソースを展開
[The Linux Kernel Archives](https://www.kernel.org/)から最新の安定版をダウンロードします。

```sh
$ cd ~/rpmbuild/SOURCES/
$ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.14.3.tar.xz
$ xz -cd linux-3.14.3.tar.xz | tar xf -
```

### カーネルの再構築
現在インストールされているカーネルのconfigファイルを元に再構築

```sh
$ cd linux-3.14.3
$ cp /boot/config-2.6.32-431.17.1.el6.x86_64 ./.config
```

出てくる質問は全てデフォルト(Enter長押し)応答

```sh
$ make oldconfig
```

### カーネルのビルド
```bash
$ make rpm
```

### インストール
```sh
$ cd ~/rpmbuild/RPMS/x86_64
$ ls -1
kernel-3.14.3-1.x86_64.rpm
kernel-devel-3.14.3-1.x86_64.rpm
kernel-headers-3.14.3-1.x86_64.rpm
$ sudo rpm -Uvh kernel-*
ERROR: modinfo: could not find module ipt_addrtype
ERROR: modinfo: could not find module ipt_MASQUERADE
ERROR: modinfo: could not find module iptable_nat
ERROR: modinfo: could not find module nf_nat
ERROR: modinfo: could not find module snd_page_alloc
```
※kernel 3.x に対応していないモジュールはロードできずにエラーになる(要調査)

### 再起動
```sh:
$ reboot
```

### カーネルバージョン確認
```sh:
$ uname -r
3.14.3
```
MySQLのバックアップ関連で最低限やるべき項目

MySQLのバックアップにて最低限やるべき項目をまとめました。

#MySQL version#
* MySQL 5.6.16

#To Do#
0. mysqldump + cronによる自動バックアップ
1. バイナリログ設定（基本設定、定期削除、etc...）

上記２点について、以下で解説します。

##1. mysqldump + cronによる自動バックアップ##
###シェルスクリプトの作成###
rootディレクトリへ移動し、バックアップ保存用のディレクトリを作成します。

```
~ cd /root
~ mkdir mysql && mkdir mysql/backup
```

続いてバックアップを作成するためのシェルスクリプトを作成します。

```
~ vi backupmysql.sh
```


```sh:backupmysql.sh
#!/bin/sh

# バックアップの保存期間（days）
period=3

# バックアップ保存用ディレクトリの指定
dirpath='/root/mysql/backup'

# ファイル名を指定する(※ファイル名で日付がわかるようにしておきます)
filename=`date +%y%m%d`

# 指定したDBのスキーマおよびデータをすべて吐き出す
mysqldump -u[ユーザ名] -p[パスワード] -h[ホスト名] [データベース名] > $dirpath/$filename.sql

# パーミッション変更
chmod 700 $dirpath/$filename.sql

# 保存期間を過ぎたバックアップを削除
oldfile=`date --date "$period days ago" +%y%m%d`
rm -f $dirpath/$oldfile.sql

```

mysqlbackup.shにはDBの接続情報に関するデータが書いてあるため、rootユーザー以外の閲覧を禁止にする。

```
~ chmod 0755 /root/backupmysql.sh
```

ここで作成したシェルスクリプトが実行できるか確認します。
これで指定したディレクトリに、.sqlのファイルが作成されていれば、正常に実行できています。

```
~ ./backupmysql.sh
```

###cronの設定###
cronの設定をします。設定については以下のページが分かりやすいかと。
http://www.server-memo.net/tips/crontab.html

```
echo "0 3 * * * root /root/backupmysql.sh" > /etc/cron.d/backupmysql
```

以上が定期的にSQLを吐き出しバックアップを取る方法です。
これだけでも事足りますが、実際には次に説明するバイナリログの設定まで行った方が何かと便利かと思います。

##2. バイナリログ設定##

/etc/my.cnfにて、バイナリログの有効化および有効期限の設定を行います。

```
~ vim /etc/my.cnf
```

```sh:my.cnf
[mysqld]
# バイナリログ有効化
log-bin=mysql-bin

# 有効期限の設定（day）
expire_logs_days=3
```

ここまできましたら、MySQLの再起動をします。
これでバイナリログの設定は完了です。


#まとめ#
以上２点がMySQLのバックアップを設定する際に押さえておきたい項目です。
これが抜けてる等々ありましたら気軽にコメント頂けますと助かります。

以下が今回の設定をする際に参考にしたURLとなります。

##参考ページ##
0. http://qiita.com/crimson_21/items/6171a95f8ddb2861e2e6
1. http://www.machiiro.jp/machiblog/blog/mysql_purge_binarylog/
2. http://www.mogumagu.com/wp/wordpress/?p=1048
3. http://dev.classmethod.jp/cloud/aws/ec2_mysqldump/
4. http://blog.jicoman.info/2013/08/mysqldump_restore/
heroku+rails+ckeditorで画像やファイルをアップロードすると、herokuにpushする度にファイルが消えてしまう問題


（当たり前な話だけど初herokuだったので一瞬あれ？って思った）

##掲題の通りなのでAWSのS3にアップロードすればいいかなという事で以下を参考にした

http://gihyo.jp/dev/serial/01/heroku/0011?page=2

```Gemfile
gem 'fog', '~> 1.3.1'
```

fogを追加してbundle install


```app/uploaders/ckeditor_attachment_file_uploader.rb
  # Choose what kind of storage to use for this uploader:
　# storage :fileと記述されているのをfogに変更
  storage :fog
```

```app/uploaders/ckeditor_picture_uploader.rb
  # これも同じく
  storage :fog
```

initializersにcarrierwave.rbというファイルを作成して

```config/initializers/carrierwave.rb
CarrierWave.configure do |config|
  config.fog_credentials = {
    :provider               => 'AWS',
    :aws_access_key_id      => '[id]',
    :aws_secret_access_key  => '[key]',
    :region                 => 'ap-northeast-1' #Tokyo
  }
  config.fog_directory = '[bucket-name]'
end

```

こんな感じでローカルでは動作。

herokuのENVにも追加しておく。

```
heroku config:add AWS_S3_KEY_ID="[id]" AWS_S3_SECRET_KEY="[key]" AWS_S3_BUCKET="[bucket-name]"
```
Windowsフォームアプリケーションの非同期処理

別スレッドからフォームを更新するにはInvokeを使うらしい。Invokeとかラムダ式とか馴染みがなかったけど、今回サンプルを動かして感じが掴めたのでメモしとく。

## サンプルソース
```csharp
using System;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace invoketest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private Task t;
        private void Form1_Load(object sender, EventArgs e)
        {
            t = new Task(() =>
            {
                for (;;)
                {
                    Action a = () =>
                    {
                        label1.Text = DateTime.Now.Second.ToString();
                    };
                    Invoke(a);
                    System.Threading.Thread.Sleep(1000);
                }
            });
            t.Start();
        }
    }
}
```
## 参考文献
川俣晶著 C#ショートコードプログラミング http://goo.gl/EblJNn
emacs上でrbenvが使えなくなる件について

## 発端
ある日突然、rspec-modeのテスト実行が失敗するようになった。
ログによるとシステムのrubyを使おうとしており、rbenvが無視されている。
rbenv.elはもちろん使っているし、exec-pathに~/.rbenv/shimsを入れるようにしてもダメ。[exec-path-from-shell](https://github.com/purcell/exec-path-from-shell)も使ってみたけどダメ。

## 犯人はpath_helper
弱り果ててrpsec-modeに直接デバッグコードを埋めて調べてみると、PATHの先頭に/usr/bin,/binなどが入っていて、rbenvのrubyよりもシステムのruby（/usr/bin/ruby）が優先されていた。
もちろんrbenvのパスはrbenv.elが先頭に追加しているはずなので、原因がよく分からなかったのだが、[こちら](http://ikasama.hateblo.jp/entry/2014/01/28/104244)などを見て判明。
/etc/zshenvに以下のコード

```bash:/etc/zshenv
# system-wide environment settings for zsh(1)
if [ -x /usr/libexec/path_helper ]; then
        eval `/usr/libexec/path_helper -s`
fi
```

が書かれていて、書いてある通りにpath_helperを実行すると

```bash:
$ /usr/libexec/path_helper -s
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin(略)"
```

のように標準のpathが先頭について返ってくる。このpathは/etc/pathsに

```bash:/etc/paths
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
```

のように記述されている。

## 回避策
さて、zshの設定ファイルが読み込まれる順番は以下の通り。

1. /etc/zshenv
2. ~/.zshenv
3. /etc/zprofile (ログインシェルの場合)
4. ~/.zprofile (ログインシェルの場合)
5. /etc/zshrc (対話的シェルの場合)
6. ~/.zshrc (対話的シェルの場合)
7. /etc/zlogin (ログインシェルの場合)
8. ~/.zlogin (ログインシェルの場合)

対話シェルではないので.zhsrcは使われず、/etc/zshenvだけが読み込まれた結果、先頭に/usr/binが追加されてしまっていたわけ。
というわけで回避策は

**~/.zshenvにrbenvの設定を書く**

でした。
rbenvの設定はいつも通り

```sh:.zshenv
export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init - zsh)"
```

でOK。

## 補足
なお、.zshrcにもrbenvの設定が書いてある場合はPATHが重複してしまうので、気になる人は調整しましょう。
あるいはpath_helperを消す、/etc/zshenvをzprofileにリネームするなどの方法もあるけれど、なるべくシステムのファイルに手を加えない方が無難と思われます。（OSアップデートの時に戻ってしまったりするしね）

## おまけ
なぜ突然この問題が表面化したのかは結局分からないまま。
.emacsをどこかいじった結果だと思われるが・・・
Nexusシリーズでスクリーンショットを撮る方法

備忘録

「電源ボタン」＋「ボリュームダウンボタン」長押し

Nexus4,Nexus5,Nexus7
にて確認済み

Android4.0以降の標準機能ですが、
機種によっては、対応していません。
シーケンスに要素を連結する

(๑╹ω╹)＜欲しいなあ

と思ったので。

## yield return を使用するパターン

```csharp:Program.cs
/// <summary>
/// シーケンスの前方に要素を連結します
/// </summary>
/// <typeparam name="TSource">入力シーケンスの要素の型</typeparam>
/// <param name="first">連結する最初の要素</param>
/// <param name="second">最初の要素に連結するシーケンス</param>
/// <returns>2つの入力シーケンスの連結された要素が格納されている System.Collections.Generic.IEnumerable&lt;T&gt;</returns>
public static IEnumerable<TSource> Concat<TSource>( this TSource first, IEnumerable<TSource> second )
{
	yield return first;
	foreach ( var _second in second ) { yield return _second; }
}
```

```csharp:Program.cs
/// <summary>
/// シーケンスの後方に要素を連結します
/// </summary>
/// <typeparam name="TSource">入力シーケンスの要素の型</typeparam>
/// <param name="first">連結する最初のシーケンス</param>
/// <param name="second">最初のシーケンスに連結する要素</param>
/// <returns>2つの入力シーケンスの連結された要素が格納されている System.Collections.Generic.IEnumerable&lt;T&gt;</returns>
public static IEnumerable<TSource> Concat<TSource>( this IEnumerable<TSource> first, TSource second )
{
	foreach ( var _first in first ) { yield return _first; }
	yield return second;
}
```

## Enumerable.Concat を使用するパターン

```csharp:Program.cs
/// <summary>
/// シーケンスの前方に要素を連結します
/// </summary>
/// <typeparam name="TSource">入力シーケンスの要素の型</typeparam>
/// <param name="first">連結する最初の要素</param>
/// <param name="second">最初の要素に連結するシーケンス</param>
/// <returns>2つの入力シーケンスの連結された要素が格納されている System.Collections.Generic.IEnumerable&lt;T&gt;</returns>
public static IEnumerable<TSource> Concat<TSource>( this TSource first, IEnumerable<TSource> second )
{
	return Enumerable.Concat( new[ ] { first }, second );
}
```

```csharp:Program.cs
/// <summary>
/// シーケンスの後方に要素を連結します
/// </summary>
/// <typeparam name="TSource">入力シーケンスの要素の型</typeparam>
/// <param name="first">連結する最初のシーケンス</param>
/// <param name="second">最初のシーケンスに連結する要素</param>
/// <returns>2つの入力シーケンスの連結された要素が格納されている System.Collections.Generic.IEnumerable&lt;T&gt;</returns>
public static IEnumerable<TSource> Concat<TSource>( this IEnumerable<TSource> first, TSource second )
{
	return Enumerable.Concat( first, new[ ] { second } );
}
```

エラーチェックがありませんのでご注意下さい。
UITabBarControllerの中にUINavigationContorollerを置いている場合の回転制御(iOS6以降）


以下のようにすることで、それぞれのViewごとに回転を制御できるようになります。
TabBarControllerとNavigationBarでは直接画面制御の判定をせず、実際に表示されるView側で判定をするという仕組みです。
なお、各メソッドは、

```
shouldAutorotate
 -> supportedInterfaceOrientations
　　 -> preferredInterfaceOrientationForPresentation
```

という順番で呼び出されるため、仮に回転をさせない画面(shouldAutorotate = NO の場合）には、それ以外のメソッドを実装する必要は無いようです。

```objectivec:MyTabController.m
#pragma mark - Rotate

- (BOOL)shouldAutorotate
{
    return [self.selectedViewController shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations
{
    return [self.selectedViewController supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [self.selectedViewController preferredInterfaceOrientationForPresentation];
}

```

```objectivec:MyNavigationController.m
#pragma mark - Rotate

- (BOOL)shouldAutorotate
{
    return [self.viewControllers.lastObject shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations
{
    return [self.viewControllers.lastObject supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation];
}

```

```objectivec:MyViewController.m
#pragma mark - Rotate

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAllButUpsideDown;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}
```
バッチファイルだけで wc -l の真似事

```bat
@echo off
setlocal
:loop
if "%1" == "" exit /b
set COUNT=0
for /F %%I in (%1) do set /A COUNT+=1
echo %COUNT% %1
shift
goto loop
```

```
$ wc.cmd ~\_nya
45 C:\Opt\Share\_nya
```

CMD.EXE のバッチコマンドで変態なのは for だけじゃない！
set も十分変態だということですね、わかります。
Redmine APIの結果にプラグインからカラムを追加する


* 単に ``app/views/issues/*.api.rsb`` に対応する ``plugins/my_plugin/app/views/issues/*.api.rsb`` を置くだけでした
* つまりhtmlを出力する.erbテンプレートと同じ手順でAPIの出力も改変できます
* なんで気づかなかったんだろうこれ・・・orz
* `` *.api.rsb`` だけ置き換えると ``ActionView::Template::Error`` が発生するので、``*.html.erb``も同時にコピーせよとのことです
  * http://www.redmine.org/issues/13924

<del>このへんをいじればいけそう。

```lib/redmine/views/api_template_handler.rb
module Redmine
  module Views
    class ApiTemplateHandler
      def self.call(template)
        "Redmine::Views::Builders.for(params[:format], request, response) do |api|; #{template.source}; self.output_buffer = api.output; end"
      end
    end
  end
end
```

**template.source** はテンプレート（app/views/issues/index.api.rsb など）のソースコードを返しているので、pluginからself.callを横取りすれば任意の別のテンプレートを差し込めるっぽい。

どのコントローラ/アクションのテンプレートを呼び出しているかは **template.virtual_path** を見ればいいっぽい。

<del>まだ試したわけじゃないんでそのうち試す。</del>
試したし動いた。

```plugins/my_plugin/lib/my_plugin/patches/api_template_handler_patch.rb
module ApiTemplateHandlerPatch
  module ClassMethods
    def hello
      puts 'Hello, from plugin'
    end

    def call(template)
      case template
      when 'app/views/issues/show.api.rsb' then
        template = 'plugins/my_plugin/app/views/issues/show.api.rsb'  # 改変済みの.rsbファイル
      end
      p template
      super(template)
    end
  end

  def self.prepended(base)
    class << base
      prepend ClassMethods
    end
  end
end
```

```plugins/my_plugin/init.rb
ActionDispatch::Callbacks.to_prepare do
  Redmine::Views::ApiTemplateHandler.send(:prepend, ApiTemplateHandlerPatch)
end
```

Redmineのプラグインでは ``alias_method_chain`` を使ってメソッドの再定義を行っている例が多いけど、ruby2.0以降のみで動けばいいなら ``Module#prepend`` を使うと見通しがよくなる。

* [ruby - How to prepend classmethods - Stack Overflow](http://stackoverflow.com/questions/18683750/how-to-prepend-classmethods)
* [Ruby2.0のModule#prependは如何にしてalias_method_chainを撲滅するのか！？ TECHSCORE BLOG](http://www.techscore.com/blog/2013/01/22/ruby2-0%E3%81%AEmodule-prepend%E3%81%AF%E5%A6%82%E4%BD%95%E3%81%AB%E3%81%97%E3%81%A6alias_method_chain%E3%82%92%E6%92%B2%E6%BB%85%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8B%EF%BC%81%EF%BC%9F/)


## template.sourceを直接いじるには？

Redmineのプラグインテンプレートである.rsb（中身はただのrubyのDSLっぽい）をコピーして改変したものをプラグイン側にもたせておくのはあまりスマートでない気がする（コードを流用するとなるとRedmineのライセンスに従わないといけないとか; まあMITライセンスなのであんま問題にならないけど）んで、文字列で渡されるテンプレートのソースコードをコードから変更する案。

[Ripper](http://i.loveruby.net/w/RipperTutorial.html)でAST（抽象構文木）が取得できるので、template.sourceをASTに変換して、ASTをいじってソースコードに変換すればよさそう。
ASTからソースコードへの再変換は[sorcerer](https://github.com/jimweirich/sorcerer)が使えるっぽい。

* http://www.todesking.com/blog/2014-04-29-highlight-ruby-local-variables-in-vim/
* http://stackoverflow.com/questions/4878032/how-would-i-recompile-rippers-ast-back-to-ruby-code

こちらに関してもまだ一切何も試してない。

</del>
Plack::Middlewareに依存したアプリをTest::Mojoでテストする


Plack::Middlewareに依存した動作をするアプリの場合、
特になにもしないとTest::Mojoでテストができないので、
以下の手順で対応した。

## Mojolicious::Plugin::PlackMiddleware の導入

https://metacpan.org/pod/Mojolicious::Plugin::PlackMiddleware

Mojoliciousのフックであるaround_dispatch内で、
Plack::Middlewareを使えるようにしてくれるプラグイン。

導入は普通に以下のようになる。

```shell
$ cpanm Mojolicious::Plugin::PlackMiddleware
```

Plack::Builderを使うのではなくて、
こちらのプラグインを使う方針であれば解決。

今回は、やはり起動スクリプト内でPlack::Builderを使いたかったので、
もう一手間行った。


## Test::Mojoでビルドしたアプリにプラグイン設定する

以下のように、
Test::Mojoでいったんアプリを普通にビルドして、
そのアプリに対してプラグイン設定をする形をとった。

```perl:t/basic.t
use Mojo::Base -strict;

use Test::More;
use Test::Mojo;

my $t = Test::Mojo->new('MyApp');

$t->app->plugin(plack_middleware => [
    'Session' => {store => 'File'},
]);

$t->get_ok('/')->status_is(200)->content_like(qr/Mojolicious/i);

done_testing();
```

$t->appで、アプリを参照できるので、
pluginメソッドでプラグインを設定している。

## 参考

https://metacpan.org/pod/Mojolicious::Plugin::PlackMiddleware
https://metacpan.org/pod/HTTP::Server::PSGI
CakePHPアプリのwebrootをサブディレクトリとしてデプロイ

## 環境

* apache2.2.x
* CakePHP2.4.7

## httpd.confと.htaccessを修正

apacheのドキュメントルートはhoge/app/webrootとして、サブディレクトリをaliasする。
CakePHPアプリは/var/hogeへデプロイし、subをサブディレクトリ名とする。

```httdp.conf
<VirtualHost *:80>
  DocumentRoot /var/www/html
  Alias /sub /var/hoge/app/webroot
  <Directory /var/hoge/app/webroot>
    AllowOverride All
  </Directory>
</VirtualHost>
```
.htaccessにRewriteBaseを追加する。

```/var/hoge/app/webroot/.htaccess
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^ index.php [L]
  RewriteBase /sub
</IfModule>
```
2つの配列を短いコードでスマートに比較する

**[「2つの配列が同じものかどうかチェックするPHP関数」](http://qiita.com/kijtra/items/2bfb45fc8013413886f2)** にインスパイアされて作ってみました。多次元配列に対応しています。

## 同じ値を持つときに `True` を返す

ソートさせて配列全体を `===` で比較させます。素直に **[in_array](http://www.php.net/manual/ja/function.in-array.php)** 関数あたりを使うことも考えましたが個数を考慮することが出来ないので、やはりソートが一番手っ取り早いし分かりやすいという結論に達しました。

```php
function is_same_array(array $a, array $b) {
    static $sort;
    if (!$sort) {
        $sort = function (array &$array) use (&$sort) {
            foreach ($array as &$value) {
                if (is_array($value)) {
                    $sort($value);
                }
            }
            sort($array);
        };
    }
    $sort($a);
    $sort($b);
    return $a === $b;
}
```

## 同じキーと値のペアを持つときに `True` を返す

ソートさせて配列全体を === で比較させます。**[sort](http://www.php.net/manual/ja/function.sort.php)** 関数はキーを保存しないので、代わりに **[asort](http://www.php.net/manual/ja/function.asort.php)** 関数または **[ksort](http://www.php.net/manual/ja/function.ksort.php)** 関数を選択します。キーの方が情報量が一般的に少ないと言えるので、ここでは後者を採用することにします。

```php
function is_same_assoc(array $a, array $b) {
    static $sort;
    if (!$sort) {
        $sort = function (array &$array) use (&$sort) {
            foreach ($array as &$value) {
                if (is_array($value)) {
                    $sort($value);
                }
            }
            ksort($array);
        };
    }
    $sort($a);
    $sort($b);
    return $a === $b;
}
```

## 同じキーと値のペアを持ち順番も一致しているときに `True` を返す

配列全体を `===` で比較させます。関数作る必要ないですねｗ

```php
function is_same_order_assoc(array $a, array $b) {
    return $a === $b;
}
```
[jQuery] click / touch / pointer イベントを完全に制御する

# デバイスごとのイベント判定方法と問題点
タッチデバイスとポインティングデバイスでバインドするイベントを分別する際、いままでは以下のようにしてきました。

```js:JavaScript
var event = 'ontouchstart' in window ? 'touchend' : 'click';

$('hoge').on(event, function());
```

しかし、この記述で判定すると、特定の環境でイベントの判別がうまくいかないのです。

1. タッチディスプレイを搭載したPC
2. Google Chrome

上記の組み合わせだと、event変数は必ずtrueを返します。
iOSやAndroidなどのスマートフォンOSでは、touchendとclickが時間差で発生するため (本当はもっといろんなイベントが発生していますが)、以下のようなことは当然できません。

```js:JavaScript
$('hoge').on('touchend click', function());
```

# 新しい (?) イベント判定方法
そこで、最初に発生したイベント (touchstartやmousedownなど) を判別して、正しいイベントをバインドするようなスクリプトを作りました。

```js:JavaScript
var event = {
  all: 'mousedown touchstart pointerdown mouseenter mouseleave',
  type: '',
  start: '',
  enter: '',
  leave: '',
  move: '',
  end: ''
};

// イベント判定
event.check = function(e){
  var _default = e.type;
  event.start = _default;
  event.move = _default === 'pointerdown' ? 'pointermove' : (_default === 'touchstart' ? 'touchmove' : 'mousemove');
  event.end = _default === 'pointerdown' ? 'pointerup' : (_default === 'touchstart' ? 'touchend' : 'click');
  event.enter = _default === 'pointerenter' ? _default : (_default === 'touchenter' ? _default : 'mouseenter');
  event.leave = _default === 'pointerleave' ? _default : (_default === 'touchleave' ? _default : 'mouseleave');
};

event.on = function(type, elm, fn, delegate){
  $(document).off(event.all, elm).on(event.all, elm, function(e){
    e.preventDefault();
    event.check(e);
    if (fn != null) {
      if (e.type === event.enter || e.type === event.leave) {
        // mouseenter mouseleaveのとき、コールバック関数を即実行
        fn(this, e);
      } else {
        if (type === 'bind') {
          // jQuery $(element).on(event, func);
          $(elm).off(event.end).on(event.end, function(e){
            fn(this, e);
          });
        } else if (type === 'live') {
          // jQuery $(document).on(event, element, func);
          $(document).off(event.end, elm).on(event.end, elm, function(e){
            fn(this, e);
          });
        } else if (type === 'delegate') {
          // jQuery $(parentsElement).on(event, element, func);
          $(delegate).off(event.end, elm).on(event.end, elm, function(e){
            fn(this, e);
          });
        }
      }
    } else {
      // 引数にコールバック関数が定義されていないときの処理
    }
  });
};
```

処理はそんなに難しいことをしていないはずなので、内容の説明は省きます。
実際の使い方は以下のようになります。

```js:JavaScript
event.on(type, element, func, parentsElement);

var func = function(elm, e) {
  if (e.type === event.end) {
    //touchend、pointerup、clickのいずれかのときに実行
  }
};

// example
event.on('bind', '.hoge', func);
event.on('live', '.hoge', func);
event.on('delegate', '.fuga', func, '.hoge');
```

これでどの (?) デバイスでも正しいイベントが自動的にバインドされるようになりました。

改善のアドバイスがございましたら、是非ご連絡ください。
IEでラジオボタンに枠がついてしまった時の対処法

# 症状

IEでラジオボタンに以下のような枠がついてしまいました。

![スクリーンショット 2014-05-13 17.49.03.png](https://qiita-image-store.s3.amazonaws.com/0/3153/23000b03-264b-a11b-3309-325b318fb510.png)　

# 対処方法

スタイルシートに以下のように記述します。

```css:style.css
input[type="radio"] {
    border: 0px;
}
```
※上記記述でも枠が消えない場合は`border: 0px !important;`にしてみてください。
↑ここぞと言う時以外は`!important`は控えましょうね(>_<)

# 結果

IE7、IE8、IE9、IE10、IE11で以下のように枠が消えました。

![スクリーンショット 2014-05-13 17.49.21.png](https://qiita-image-store.s3.amazonaws.com/0/3153/ae290af3-2f71-b47b-f221-fdf34576ca9c.png)

どんなに強固なIフィールドでもぶち抜けますね！
LabVIEW HTTPClient のプロキシー設定

LabVIEW HTTPClient のプロキシー設定

LabVIEW HTTPClient関数は、システムのプロキシーサーバの設定は見ないので、
そのままでは、プロキシー経由の通信ができない。
Windowsでは、インターネットオプション>>接続>>LANの設定の画面に
ある「プロキシーサーバ」のところに、設定項目があるが、これを設定しても
HTTPClient 関数には無視される。

環境変数に http_proxy を設定すれば、Proxyサーバ経由でWebサーバと通信することができる。

なお、Windowsでの環境変数の設定は、マイコンピュータのプロパティから「システムの詳細設定」
画面を開いて、「詳細設定」タブ画面の「環境変数」ボタンから設定できる。
Proxyサーバのアドレスやポート番号は、ネットワーク管理者に確認すること。

変数名: http_proxy
変数値: http://<サーバ名 or IP アドレス>: <ポート番号>
           例: http://192.168.52.240:8880

LabVIEW起動中に、この値を変更しても、LabVIEWには認識されないので、環境変数 http_proxy設定後に、
一度、LabVIEWを終了する必要がある。
（http_proxyが必要なあたりは、なぜか unixから移植されたツール等と同じ。）

なお、cRIO-RTでも、.outファイル(DLL)を作成して、putenv()関数で、環境変数HTTP_PROXYを
設定することで、同じようにプロキシーサーバ経由でHTTPClientが使えることは確認した。

ちなみに LabVIEW 2013 から追加された WebDAVクライアント関数も同様。

できれば、DLLなどを自作しなくても使えるようにLabVIEW側で対応してほしいものだ。



さらにいくつか問題が発覚したので、追記しておく。

1.認証
  環境変数http_proxyに、ユーザ名とパスワードを付加すれば解決できそうな気がしますが、
  機会がなく試したことはありません。もしかしたら、proxy_user, proxy_passwordかもしれません。
  また、ユーザ名とパスワードがだだもれになること、ユーザによって切り替えできないことも問題。

2.環境変数http_proxyだと宛先IPによるプロクシーサーバの切り替えができない、が、対象外は設定できる
~~問題としてはより深刻。
  社外のサーバ、社内の有線/無線LANDAQデバイスと同時に通信する場合、
  社外のサーバに対して、プロクシーサーバ経由でしかつなげられないからといって、
  環境変数http_proxyを設定してしまうと、社内の有線/無線LANDAQデバイスと
  通信できなくなってしまう。
  Windowsのプロクシー設定だと、proxy.pacというスクリプトを書くことで、接続しようと
  している宛先のIPによって、プロクシー経由か、直接つなぐかを切り替えできますが、
  環境変数http_proxyでは、そういう器用なことはできません。~~

~~無線LANDAQデバイスで各種センサーデータを収集して外部のサーバに送信する、というのは
  ごく普通に思いつくソリューションなので、これができないとなると、結構、痛い。~~

接続先のIPアドレスによって、プロクシーサーバの切り替えはできないが、特定のIPを
プロクシーの対象外にすることはできる。
方法は、環境変数no_proxyにIPアドレスをカンマ区切りで追加していくだけ。
注意としては、'*'などワイルドカード指定にはできないらしい。

LabVIEWのhttp/webdav通信でも、Windowsの設定を利用するように修正してもらいたいものだ。

参考
http://sechiro.hatenablog.com/entry/2013/08/06/no_proxy_%E3%81%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%A8%E3%81%8B%E3%83%AF%E3%82%A4%E3%83%AB%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89%E3%82%92