OmniAICreator/Qiita-1.07M huggingface dataset:
SSL証明書の有効期限の見方 と 拡張子 意味

<pre>
open ssl x509 -noout -text -in 'crtファイル'
</pre>

Validity の NotAfter が有効期限  
  
  
____
###1.秘密鍵(Private Key)###
###2.証明書発行要求(CSR:Certificate Signing Request)###
###3.証明書(CRT:　Certificate)###
###4.証明書執行リスト(CRL: Certification Revocation List)###  

設置の時は 1 と 3 を移動させる.
中間証明書CA.crt がある場合はこれも移動させる、  
そして CRTとCA.crt はマージさせる（※順番関係有り）.中間証明書が下にくる.

###CSR作成手順
linuxでは ` /etc/ssl ` などにある。
拡張子自体に意味はなく、わかりやすいように付けているだけである。

ブラウザで確認する発行対象の情報は適当なので当てにしない。

<pre>
openssl req -new -key 秘密鍵ファイル名 -out CSRファイル名
</pre>

これの作成したCSR(証明書発行要求)を使って証明書発行を要求することでSSL証明書を入手できる。つまり、SSL証明書更新とは次の様な３つの段階の作業に分けることができる。**CSR作成、証明書発行要求、証明書設置。**
作成の際のディスティングイッシュネームはユニット名は適当なものでよく、EmailAddress以降は空欄でよい。その他は正式な入力が必要である。
http://d.hatena.ne.jp/tkrd/20120531/1338450030

受け取った証明書を設置することがSSL証明書設置の設定である。

linuxコマンドで証明書の設置がうまくできているか確認
---
http://techracho.bpsinc.jp/yamasita-taisuke/2012_12_21/6455

<pre>
$ openssl s_client \
-CAfile /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt -showcerts -connect www.example.com:443
</pre>

出力の最後の方に[Verify return code: 0 (ok)]とでていれば問題ない。
上の方にある、 Certificate chainの部分で証明書の連鎖を確認できる。

※Nginxの設定をしているサーバー以外で確認をする。実験用のIPを用いる場合は`/etc/hosts`の書き換えを忘れずに！

>何故コマンドで確認する必要があるのかというと、例えば今回必要になった例ではWEBサイトをアンドロイドでみた場合だけ警告が出るというものであった。このような問題に気づかないものなので、SSL証明書の設置の際にはブラウザチェックだけでなく、上記のコマンドを用いて確認すべき。
Mac ホームアクセス権の修復

[ command + R ] か [ option ] 押しながら 起動  
  
リカバリーHD(復旧10.8)   
  
メニューバー  

ユーティリティー  

ターミナル  

reset password  
  
ボリューム, アカウント 右下のリセット  

実行中が完了　　で終了
MySQLでn分前を取得するクエリ




```SQL;現在時間から10分以内のレコードを取得するSQL
SELECT * FROM 'テーブル名' WHERE 'カラム名' > CURRENT_TIMESTAMP + INTERVAL - 10 MINUTE
```

参考元：<a href="http://atamoco.boy.jp/mysql5/datetime/interval.php" title="MySQL5 - n分前、n時間前、n日後の日付を取得する | interval">MySQL5 - n分前、n時間前、n日後の日付を取得する | interval</a>


MINUTEの他に下記のunitが使用できます。

| unit|説明 | 
|:-----------|:-------------|
| MICROSECOND    |       マイクロ秒 |
| SECOND   |      秒 |
| MINUTE    | 分 |
| HOUR | 時 |
| DAY | 日 |
| WEEK |週|
| MONTH | 月 |
| YEAR | 年 |
Xamarin.iOS で UIWebView から C# のコードを呼び出す方法


まあ、

* [WebView で Javascript と Objective-C のコードを相互に呼び出す方法 | 【スマホ×HTML5】Web&ハイブリッドアプリ開発者ブログ](http://i26.jp/html5dev/webview-%e3%81%a7-javascript-%e3%81%a8-objective-c-%e3%81%ae%e3%82%b3%e3%83%bc%e3%83%89%e3%82%92%e7%9b%b8%e4%ba%92%e3%81%ab%e5%91%bc%e3%81%b3%e5%87%ba%e3%81%99%e6%96%b9%e6%b3%95/)

を Xamarin.iOS でやってみたという話なだけです。

## サンプル

```csharp:MainViewController.cs

/* in MainViewController.designer.cs
[Outlet]
[GeneratedCodeAttribute ("iOS Designer", "1.0")]
MonoTouch.UIKit.UIWebView MyWebView { get; set; }
*/

public override void ViewDidLoad()
{
    base.ViewDidLoad();
    
    MyWebView.LoadRequest(NSUrlRequest.FromUrl(NSUrl.FromString("http://www.hatena.ne.jp/")));

    // LoadFinished はイベント
    MyWebView.LoadFinished += (sender, e) => {
        if (String.Equals(MyWebView.Request.Url.Host, "b.hatena.ne.jp"))
        {
            new UIAlertView("Load Finished", "ページが表示されました", null, "Close").Show();
        }
    };

    // ShouldStartLoad は Delegate
    MyWebView.ShouldStartLoad = (webView, req, navType) =>
    {
        var permited = !String.Equals(req.Url.Host, "hatenablog.com");
        if (!permited)
        {
            new UIAlertView("ShouldStartLoad", “はてなブログは見ちゃダメ！", null, "Close").Show();
        } 

        return permited;
    };
}
```

画面に UIWebView を一つ貼り付けて、 www.hatena.ne.jp を表示してます。

はてなブックマーク(b.hatena.ne.jp) へ移動すると、ページ読み込み後に「ページが表示されました」とポップアップします。
はてなブログ(hatenablog.com) へ移動しようとすると、「はてなブログは見ちゃダメ！」とポップアップし、移動はキャンセルされます。

Objective-C の、``webViewDidFinishLoad`` , ``shouldStartLoadWithRequest`` デリゲートが、Xamarin.iOS では、 ``LoadFinished`` , ``ShouldStartLoad`` に対応します。

注意点は、``LoadFinished`` はイベントであるのに、 ``ShouldStartLoad`` は delegate であるという事です。

Obj-C のデリゲートは、Xamarin.iOS では全てイベントになっているのかなーと思っていましたが、 ``ShouldStartLoad`` のように「値を返す」必要があるものについては delegate になっているようです。

Xamarin.iOS の APIデザインについては、公式サイトに説明があります。

* [API Design | Xamarin](http://docs.xamarin.com/guides/ios/advanced_topics/api_design/)

ガッツリ熟読した方がよさそうですねえ。

最後に、作ったサンプルを動かしてみます。

![](http://blog.amay077.net/assets/images/posts/calling_csharp_from_webview_01.gif)

なんか ``LoadFinished`` が２回呼ばれてる。重複チェックしなきゃダメですね
第8回Jenkins勉強会 参加メモ

## 川口氏

* 1090人のコミッタ
* 62コミット/day
* コンテナがWinstone から Jetty に変わった
* credentialsプラグイン
* git プラグイン 2.0
 * 拡張ポイント
* CloudBees をオープンに
* 文芸的ビルド
 * READMEを参照してジョブをよしなにしてくれる
 * 新しいブランチを勝手にチェックしてビルドを設定もしてくれる  
大規模環境を意識したつくりに
* スレーブのためのスレッド数を減らした
 * やっぱり大規模意識？
* LTS1.532.1
* Docker
* CloudBeesのとりくみ
 * Jenkins Operations Center → 多くのJenkinsをコントロール（マスターのマスター）
 * ZFSを使ってワークスペースを高速にコピー

## 石川氏＠Yahoo JP

* Yahooでの運用例
* プロモーション広告
 * なんだかよくわからん
* 夏の甲子園
 * けっこうな資源を使った
* オペレータ2人＋Jenkins
* マスター三台＊スレーブ10台
* job数約300
* 道のり
 * 数名の有志から→社内エバンジェリストに
* 独自ビルドスクリプトによるデプロイパイプライン
 * ワンクリックデプロイ
* トラブル事例、課題
 * SCMポーリングでGitHubEPに負荷増大  
Web Hook  
ポーリングがいい場合も？→ quiet period で調整したらいい（川口氏）
 * スレーブ機を買う金が・・・  
Jcloudsプラグインで仮想化  
OpenStackベースのPaaSで物理サーバ不要
 * ジョブが増え続ける。整理したい。
* エバンジェリストの存在が重要
 * 開発プロセスも見直す必要
* まずはルールはゆるめで、とにかく使い始める
 * あとから軌道修正

## 玉川氏＠SHIFT

* Jenkins Enterprise by CloudBees
* 業務内容→テスト自動化、
* Jenkinsの有償版
 * サポート  
OSS版のコア、プラグインも対象範囲
 * 独自プラグイン
 * 川口さん
* 導入対象
 * 稼働率向上、大規模運用
* Foldersプラグイン(free)
 * フォルダをコピーで、フォルダ以下のジョブを丸ごとコピーできる
* Templatesプラグイン
 + 親子関係を持っていて、親の変更を自動で子に伝播できる
 + build template
 + Job template  
他のジョブから設定をロード
* セキュリティへの対処
 + Role-base access control plugin  
OSS版の競合プラグインより柔軟でカンタン  
redmineとかの権限管理と似た雰囲気
 + Secure Copy Plugin
 + custom update center plugin
* リソース最適化
 + Even Scheduler plugin
 + vmware vCenter auto-scaling plugin
 + Skip Next Build Plugin
* Jenkins Boot Camp セミナー（Jenkinsを使ったことない人向け）

## LT たかの氏

* 情シス部門で導入したその後
* スライドの造りがすごいきれいだった

## LT すだ氏

* Docker
 * LXCベースの軽量仮想化
 * ジョブごとにクリーンな実行環境
* かなり速いっぽい
 * あとでスライドのURLを入れる

あとでなおす。
Ceylonのユニットテスト

今回はCeylonでのユニットテスト実行のしかたを解説しようと思います。

前回までにも使っていたカウンタのクラスをちょっとだけ使います。

```ceylon

"カウンタ"
class Counter(variable Integer i=0) {
	
	if(i < 0) {
		i = 0;
	}
	"数字を足します"
	shared Integer inc(Integer add=1) {
		return (i += add);
	}
	
	shared Integer nowCount =>
		 i;
	
	
	assign nowCount =>
		 i = nowCount;
	
}

````

まずいつものようにモジュール追加。

>    import ceylon.test "1.0.0";


次はテストファイルを別に作ります。
今回は成功と失敗を色々やります。

```ceylon

import ceylon.test {
	test, fail, assertEquals
}
test void success() {
	// success
}

test void failure() {
	fail("always fail");
}

test void successCounterTest()  {
	value counter = Counter(1);
	
	counter.inc();
	counter.inc();
	
	assertEquals(counter.nowCount, 3);
}


test void failureCounterTest()  {
	value counter = Counter(1);
	
	counter.inc();
	counter.inc();
	
	assertEquals(counter.nowCount, 300); // 失敗します
}

````

右クリックでRun > Ceylon Testを実行します。

実行結果は以下のように表示されます。
JUnitなどを使って来ていたら、見慣れたような画面ですね。

![スクリーンショット 2013-12-20 20.35.11.png](https://qiita-image-store.s3.amazonaws.com/0/17213/13867612-dfc7-3b02-8b79-60b78d11f3e2.png)

失敗したテストケースは選択すると
そのスタックトレースや失敗原因などのメッセージなどが表示されます。

これで最近流行のTDDをCeylonでもバシバシ実行してください！
OpenStreetMap地図をウェブサイトに埋め込む方法

OpenStreetMap をウェブサイトに埋め込む方法です。

## 手作業で取得する方法

<a href="http://www.openstreetmap.org/">http://www.openstreetmap.org/</a>にアクセスします。
![osm_start.png](https://qiita-image-store.s3.amazonaws.com/0/31643/d037e320-7b6a-8c38-2d06-5287344e397a.png)

「share」をクリックします。
![osm_share.png](https://qiita-image-store.s3.amazonaws.com/0/31643/07f2c094-c31f-714c-b1cd-6fc6abf42ed4.png)


リンクを貼る場合はLinkを、埋め込む場合はHTMLを選択します。これでOKです。「Include marker」をチェックするとピンを打つことができます。

## 手作業で処理するのが面倒、という方にCMS地図プラグイン

CMS(Contents Management System)を利用します。
日本で使われている有名どころのものでOSM地図に対応しているCMSは、

* <a href="https://www.concrete5.org/marketplace/addons/free-map">concrete5</a>
* <a href="https://drupal.org/project/mappingkit">Drupal</a>
* <a href="http://extensions.joomla.org/extensions/maps-a-weather/maps-a-locations/maps/19997">Joomla</a>
* <a href="https://github.com/ounziw/ounziw_osm">Novius OS</a>
* <a href="http://wordpress.org/plugins/osm/">WordPress</a>

があります。他にもOSMプラグイン／アドオンがありましたら、お知らせください。

## 自分でシステムを対応させるぜ、という方に

自分が使っているシステムで、OpenStreetMap 埋め込みツールが無い、という場合もあるかもしれません。たいていのシステムでは、自分でつくることができます。
私が Novius OS 用の OpenStreetMap 埋め込みツールを作ったときは、OpenStreetMap API 実験室(2017年3月時点でリンク切れ)と、<a href="http://www.slideshare.net/smellman/osc2013tkspring">OSMを使ったスマホ&Web開発入門</a>を参考にさせていただきました。どうもありがとうございます。
RecSys Handbook Chapter2 2.2.3.2~

今回はSVDの話です。次元が増えすぎると機械学習がうまくいきませんっていう話でしたよね（次元の呪い）。そこで、SVDで次元圧縮しましょう！ってことです。

前回分はこちら↓↓
http://qiita.com/ru_pe129/items/e42183569ef52681a350
主成分分析の解説があまりにも雑だったので、すこし付け加えました。

…SVMと勘違いしてました。少なくとも授業ではやってません。
今までは全訳っぽくなっていたので、少しテイストを変えてゆるい感じで書きます。

* * *
####2.2.3.2 Singular Value Decomposition
  **SVD(Singular Value Decomposition)** はMatrix Facorizationの手法を実現したものであり、PCA（主成分分析）にも関係がある。SVDのキーポイントは、「concepts」や各「concept」の強さを表現できるような低次元の特徴空間が計算可能かどうか判断すること（？？？？）。SVDは低次元空間で意味的conceptを抽出しやすいため、LSI（Latent Semantic analysis　潜在的意味解析）の基礎として使われている。（LSIは自然言語処理で使われている技法）　ここでいうconceptというのは、複数のアイテムが持っている特徴をまとめて表現しているもののことを指すのだろう。

では、アルゴリズムの説明に移る。
ある与えられた行列Aについて、常にAは以下の形で分解することができる。

```math

A = U\lambdaV^{T}

```
![PCA.png](https://qiita-image-store.s3.amazonaws.com/0/28744/c0d93468-50e8-b830-77da-173ed195a211.png)

Aはn×m行列（n個のアイテムにm個の特徴）、Uはn×r行列（n個のアイテムにr個のconcept）、λはn×nの対角行列（各成分は各conceptの強さ）、Vはm×r行列（r個のconceptにm個の特徴）を表している。

λの対角成分は常に正の値をとり、成分が降順に並んでいる。また、Uはitem-to-conceptの類似度を表す行列、Vはterm-to-conceptを示す行列であると解釈する。n≠mの場合、つまりAが正方行列でない場合、

```math

T=AA^{T}　と　D=A^{T}A

```
を考える。Uの列はTの固有ベクトル、Vの列はDの固有ベクトルであるとし、λの各成分は両者に共通する0以外の固有値の平方根となる。つまり、まずTとDを求めTとDの固有値と固有ベクトルを求めるのである。

λに含まれる固有値は降順になっているため、上位k個の固有値（k個の大きい固有値）を得るだけで、もとの行列Aを推測することが出来る。つまり、上位k個の切り取られたAは以下のように表すことが出来る。


```math

A _{k}= U_{k}\lambda_{k}V_{k}^{T}

```

A_kはランクがkであり、Aにもっとも近い行列であると言える。ここで、近いというのはAとA_kの成分の二乗誤差の和が最小になるという意味である。（成分の数が違うのにどうやって二乗誤差を求めるのだろうか…）こうして得られたSVDはk次元空間において意味構造を示すものであり、元の次元数のときよりもノイズを減らしたものであると言える。

SVDの利点は、新しいデータを加えた時に計算済みの要素について再計算しなくてよい点である。このアイデアがonline におけるSVDに拡張され、Netflix Prizeで成功を収めたことで現在は一般的に受け入れられている。Simon Funkという人がブログで公開したSVDに関する手法がNetflix Prizeでは転換点となり、SVDのアルゴリズムの改善も進んだ。（気になる方はNetflix PrizeやSimon Funkでググってください！）

SVDに似た手法として、 **Matrix Factorization(MF)** や **Non-Negative Matrix Factorization(NNMF)** などがある。元の行列をユーザーの特徴を記述する行列とアイテムの特徴を記述する行列の二つの行列に分解することで次元削減を行うというのがMFとNNMFの基本的な考えである。MFは欠損値の扱いがSVDより優れているが、SVDで0の値を持つ要素をアイテムの平均スコアで入れ替えることによって欠損値の扱いについては改善できる。SVDやMFの抱える問題点は、計算が複雑であるがゆえにデータを更新した際に再計算が非常に大変であるという点だ。この問題点を解決するためにRegularized Karnel Matrix Factorizationと呼ばれる手法が提案されている。、MFやSVDについてはChapter5でNetflix Prizeに関連する話として詳しく述べられている。

###2.2.4 Denoising
　欠損値や外れ値といったノイズの低減はデータマイニングにおいては非常に大切な処理である。本章では一般的な意味として、ノイズを「データマイニング、分析、解釈に悪影響を及ぼす好ましくない人工的なノイズ」として定義する。RSにおいては自然発生するノイズと悪意のあるノイズの二つに分けられる。前者はユーザーの自然な行動によって生まれたノイズを指し、後者は推薦結果に偏りを与えるために意図的に加えられたノイズを指す。意図的なノイズが推薦システムに対して悪影響を及ぼすのは明らかだが、自然発生したノイズについても無視できないと研究によって結論付けられている。自然発生したノイズについては、複雑な計算によって解決するよりもデータの前処理を用いる方が正しい修正が可能であるということも結論付けられている。

* * *
今回は短くなりましたが、きりが良いのでこれで終わりです。
次回は分類器の話です。年内に3章まで終わるといいのですが…
Mojolicious＋jQueryで、getJSONでハマった

## Mojoliciousで吐き出したJSONを$.getJSONが受け取ってくれないんです

いま、Webアプリの管理画面を作成してます。
細かい項目選択で、ドリルダウンをしたかったのですが。
内容は、単純な日付の選択です。年/月を選ぶと日が出てくるという簡単な部分。

単純に引数受け取ったPerl側が対応する月末日をJSONで返す、という感じです。


## 各ファイルの内容

```perl:lib/MyApp/Admin/Common/
package MyApp::Admin::Common;
use Mojo::Base 'Mojolicious::Controller';
use strict;
use warnings;
use utf8;
use Encode;
use Time::Piece;
use JSON::XS;

sub month_day{
	my $self = shift;
	my $print_json;

	#self->param('date')に、'2013-12'のような文字列が入っています。
	if( $self->param('date') ){
		my $get_time = Time::Piece->strptime( $self->param('date'). '-1 00:00:01', '%Y-%m-%d %H:%M:%S' );
		$print_json = {
			'lastday' => $get_time->month_last_day
		};
	}
	else{
		$print_json = {
			'status' => 'error', 'err' => '引数が間違っています'
		};
	}
	
	$self->render( printjson => decode_utf8(JSON::XS->new->utf8->encode($print_json)) );
}
1;
```

```perl:template/my_app/admin/common/month_day.html.ep
<%= $printjson %>
```

```js
	$.getJSON("/Admin/common/month_day", { date: '2013-12' }, function(data, status) {
		alert( data.lastday );
	});
```


と、シンプルな感じです。


で、いくらやっても、`$.getJSON`がデータをとってこないのです。
ブラウザで確認したら画面は表示されるし、`$.getJSON`からのリクエストがサーバで受け取れてることもターミナルにデータをダンプしてみたりして、で確認できました。


2～3時間悩みました。まさにハマったという感じです。
いま思えば、単純に気づきが足りなかったんです。。。
`jQuery`の`$.getJSON`が廃止要素なんじゃないか、なんて考えたりしました。ずいぶんと視点がずれていますね。。。


## で、結論

ふと気づきました。

```perl:template/my_app/admin/common/month_day.html.ep
<%== $printjson %>
```

これで解決でした。。。
よく見てみてください。`<%=`の`=`がひとつ増えました。

単純なことなのですが、`<%=`は変数をエスケープして出力、`<%==`は変数をそのまま出力、という違いです。


1週間ほど前にTitanium側でJSONを受け取った際にはすぐに気づいて、

```js
var this_response = JSON.parse( response );
```

を、

```js
var this_response = JSON.parse( String(response).replace(/&quot;/g, '"') );
```

なんてして回避しました。
（この時は、`<%=`と`<%==`の違いは分からず、単純にエスケープされて出力されるんだな、とだけ思っていました）


つまらないことで時間を使ってしまった、それはとても寒い冬の日のことでした。
Getting Started Middleman on Windows 7

![image](https://qiita-image-store.s3.amazonaws.com/0/3561/82388702-e825-46dd-e37b-95aa7c2e76b1.png)


Windows 7 にRuby をインストールするところからMiddlemanを動かすまで。

## はじめに：ハマるポイント

64bit版のRubyでは現状、Middlemanは動かない。

なぜならNokogiriのインストールがうまくいかないため。
詳細は[こちら](https://github.com/sparklemotion/nokogiri/issues/864)を参照のこと。

このIssueが解決すれば64bit版RubyでもMiddlemanが動くであろう。

また、Ruby と DevKit で同じ環境向けのインストーラを使うこと。
32bit版のRubyをインストールしたら、32bit版のDevKitをインストールすること。

当たり前だけど、とても重要。

## 目次

1. Ruby 2.0.0-p353 をインストール
2. DevKit をインストール
3. Middlemanをインストール
4. Bundlerをインストール
5. Middleman

## 1. Ruby 2.0.0-p353 をインストール

http://rubyinstaller.org/downloads/

上記のサイトからRuby 2.0.0-p353 (32bit版) をダウンロードして、実行する。

### 以下インストールウィザードの内容（断片的）

1. 日本語を選択
2. インストール場所は C:\Ruby200 とする (たぶん最初からそうなっているはず)
3. 内容を余り覚えてないけど、以下のようにチェックを行う

    [ ] .....( GUIでRubyを使うためのなにか
    [r] .....( RubyをPathに含める
    [r] .....( *.rb をRubyに関連付ける

## 2. DevKit をインストール

http://rubyinstaller.org/downloads/

上記のサイト（さっきと同じ）から For use with Ruby 2.0 (32bits version only) のDevKitをダウンロードして、実行する。

詳しくは[こちら](https://github.com/oneclick/rubyinstaller/wiki/Development-Kit)を確認すると良い。
かいつまんで説明すると、

1. C:\devkit にインストール (解答？
2. コマンドプロンプトにて C:\devkit へ移動
3. `ruby dk.rb init`
4. `ruby dk.rb install`
5. 完了

ここでも 32bit版 をインストールすること。

## 3. Middlemanをインストール

``` sh
gem i middleman
```

## 4. Bundlerをインストール

``` sh
gem i bundler
```

## 5. Middleman

Middlemanに関する情報は基本的に[こちら](http://middlemanjp.github.io/)を参照のこと。
Images with git


    # make a directory and cd to it.
    $ mkdir ~/Github_wiki && cd $_
    # clone your wiki
    $ git clone git@github.com:USER/REPO.wiki.git
    # create a image dir and cd to it.
    $ mkdir images && cd -
    # add images in images dir
    $ mv ~/somedir/someimage.png ~/Github_wiki/REPO.wiki/images/someimage.png
    # add, commit and push it
    $ git add .
    $ git commit -m "someimage.png added"
    $ git push origin master

Go to your wiki and add a sample page and add the following.

    
    ![sample image](images/vimnote1.png)
    The above image is added with `![sample image](images/someimage.png)`
    This image can be found here, https://raw.github.com/wiki/shinokada/vimnotes/images/someimage.png

Adding link to an image.

    [![Alt attribute text Here](images/someimage.png)](http://google.com)

## Sample in README page


![sample image](https://raw.github.com/wiki/shinokada/vimnotes/images/vimnote1.png)


## Resources

[Stackoverflow](http://goo.gl/pWYDnR)
[my github page](https://github.com/shinokada/gitnotes/blob/master/notes/images%20with%20git.md)
R：データフレームの列を入れ替える・削除する。

データフレームの項目の順序を入れ替えたり削除したりする方法です。
いくつか方法があるけど、これが個人的に一番楽かな。
毎度おなじみirisさんで確認。

最初の状態。

```
> iris[1,]
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
```

1列目と2列目の入れ替え。

```
> iris2 <- iris[,c(2,1,3,4,5)]
> iris2[1,]
  Sepal.Width Sepal.Length Petal.Length Petal.Width Species
1         3.5          5.1          1.4         0.2  setosa
```

1列目、2列目だけ残す。c(1:2)でも可。

```
> iris2 <- iris[,c(1,2)]
> iris2[1,]
  Sepal.Length Sepal.Width
1          5.1         3.5
```

1列目、2列目だけ残す。他の列を削除する形式。

```
> iris2 <- iris[,c(-3,-4,-5)]
> iris2[1,]
  Sepal.Length Sepal.Width
1          5.1         3.5
```
Light Tableの設定変更(スキン、テーマ、キーバインド…)

インタラクティブに式を評価しながらコードが書けるIDEとして注目されている[Light Table](http://www.lighttable.com/)の見た目や振る舞いについての設定方法を紹介します。

Light Tableの見た目や振る舞いを変更するには、`user.behaviors` を修正します。

`user.behaviors` は `Ctrl + Space` でコマンドペインを表示し、 `Settings User behaviors` を選択することで開くことができます。
※ファイル自体は `LightTable/settings/user/` にあります。

![lighttable-settings.png](https://qiita-image-store.s3.amazonaws.com/0/6092/8be0a6c9-3251-ed10-45a1-977ad09a61c6.png)

### スキンの変更

スキンを変更するには、 `user.behaviors` の `:app` タグの `:lt.objs.style/set-skin` の値を変更します。
デフォルトで `dark` と設定してある値を `light` に変更すると以下のようになります。

![skin_light.jpg](https://qiita-image-store.s3.amazonaws.com/0/6092/809165b3-f813-833c-c6e5-ee2ae2ee53dc.jpeg)

### テーマの変更

テーマの変更は、 `:editor` タグの `:lt.objs.style/set-theme` の値を変更します。 設定できるテーマは `LightTable/core/css/themes/` に用意されています。既に存在しているCSSを修正したり、自身で追加することも可能です。

![lighttable-theme.png](https://qiita-image-store.s3.amazonaws.com/0/6092/220af564-abf9-334e-8262-596045c53edd.png)

`solarized` が好きなので設定してみました。

![theme.jpg](https://qiita-image-store.s3.amazonaws.com/0/6092/696270c3-517a-a8a3-f0b8-3eb060c97493.jpeg)

### キーバインドの変更

IDEが変わっても普段使っているエディタのキーバインドを使いたい方も多いと思います。Light TableではVimとEmacsキーバインドをサポートしています。

Light Table 0.6.0からpluginを追加していくアーキテクチャに変更になった為、VimかEmacsのプラグインをインストールします。プラグインは `Ctrl + Space` でコマンドペインを表示し、 `Plugins: Show plugin manager` を選択すると一覧が表示されるのでそこからインストールを行います。

![light_table_plugins.jpg](https://qiita-image-store.s3.amazonaws.com/0/6092/a6200880-9c56-6671-5fc1-b0207071189e.jpeg)

キーバインドの変更は `:editor` タグに新規で項目を追加します。
`Vim` や `Emacs` と途中まで入力すれば補完候補が出てくるので、それぞれ `Activate vim mode` か `Activate Emacs mode` を選んでください。

#### Vim
![keybind_vim.jpg](https://qiita-image-store.s3.amazonaws.com/0/6092/630427f3-f384-1645-81fc-a12298fe6034.jpeg)

#### Emacs
![keybind_emacs.jpg](https://qiita-image-store.s3.amazonaws.com/0/6092/983929ad-539e-de4f-0d32-517d2cd8bf30.jpeg)

これで好みのキーバインドになりました。

### 行数表示

行数を表示するには、 `:editor` タグに新規で `:lt.objs.editor/line-numbers` を追加します。

![show_numbers.jpg](https://qiita-image-store.s3.amazonaws.com/0/6092/7c0e994f-9b79-a5b3-e6e3-dfbc15c18453.jpeg)

### インデントの設定

インデントのタブ利用有無やスペース数の設定をするには、`:editor` タグに新規で `:lt.objs.editor/tab-settings` を追加します。
引数は `use tabs?, tab size in spaces, indent unit` だそうです。

https://github.com/Kodowa/Light-Table-Playground/issues/487

![indent.jpg](https://qiita-image-store.s3.amazonaws.com/0/6092/5d7a8c85-b928-c38a-80dc-c5030741119a.jpeg)

ちなみに、スペースを可視化するにはコマンドペインから `Editor: Toggle visible whitespace` を実行します。 

### フォントの変更

フォントを変更するには、 `:editor` タグに新規で `:lt.objs.style/font-settings` を追加します。引数としてFont, familySize(pt), Line height(em) を取るので、値を渡してあげます。

![font_settings.jpg](https://qiita-image-store.s3.amazonaws.com/0/6092/e8ec4f73-6a40-b0b7-fe64-e8d278163a9b.jpeg)

### まとめ

設定方法はSublime Textと似ており、PythonがClojureに変わった感じです。
インタラクティブに式が評価されるの、かなり良いです。
DJangoメモ：はじめから（汎用ビューの使用）


ショートカットよりもさらに短くページを作れるのが汎用ビュー。
http://docs.djangoproject.jp/en/latest/ref/generic-views.html

今までviews.pyにいろいろと書いてきたが、汎用ビューを使えばそれをごっそり削ることができる。

アプリケーション側のurls.pyを以下のように編集。

###### polls/urls.py ######

```py
from django.conf.urls import patterns, include, url
from django.views.generic import DetailView, ListView
from polls.models import Poll

urlpatterns = patterns('',	# 空の状態に戻すのを忘れずに
    url(r'^$',
        ListView.as_view(
            queryset=Poll.objects.order_by('-pub_date')[:5],
            context_object_name='latest_poll_list',
            template_name='polls/index.html'
		)
	),
    url(r'^(?P<pk>\d+)/$',
        DetailView.as_view(
            model=Poll,
            template_name='polls/detail.html'
		)
	),
    url(r'^(?P<pk>\d+)/results/$',
        DetailView.as_view(
            model=Poll,
            template_name='polls/results.html'
		),
        name='poll_results'
	),
    url(r'^(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
)
```

ここではListViewとDetailViewとが出てきている。

まず共通の点でいうと、これまではviews.py側で

```py
# def index..
	temp = loader.get_template('polls/index.html')
```

とか

```py
	return render_to_response('polls/detail.html',{	#..
```

という風に関数内でテンプレートを指定していたのを、

```py
# url(..
	# SomeView.as_view(..
		template_name = 'polls/index.html'
```

の一文で代替。URLconf内でそれぞれのテンプレートを直接指定している。
ここを指定しなかった場合は’appName/modelName_detail.html’というものがデフォルト名になるらしいが、このファイル名でテンプレートを作るのは今いち。特に今回の例ではdetailとresultsでテンプレート名がカブってしまうので絶対によろしくない。

次に汎用ビューの種類ごとに見てみる。

##### まずはListView。 #####

- queryset:リストで表示したいデータを入れる（配列）。

- context_object_name:querysetの名前を指定（指定しなければmodelName_listという名前がデフォルト）。前回までに作ったテンプレートでは受け取る名前が’latest_poll_list’だったためこれに変更（テンプレート側の名前を編集しても結果は同じ）。

##### DetailView。 #####

最初に、urlの第一引数が微妙に変わっているところに注目。

```py
# before
	r'^(?P<poll_id>\d+)/$'
# after
	r'^(?P<pk>\d+)/$'
```

‘\d+’（一桁以上の数字）をpk（PrimaryKey）としたデータがテンプレートに反映される。ここでのpkは決まり文句。slugというのもあるらしいが現状ではよく分からない。

- model:そのままだがモデルクラスを指定している。

- name:ビューに名前を設定している。このビューを呼び出すようなURLを自動生成できるらしい（名前付きパターン？）。

URLconfの編集はこれにて終了。そしてここまでやったのであれば、

### views.pyのindex,detail,results関数はもう要らない。 ###

消してしまっても大丈夫。ただしvoteだけは残しておこう。
そして以下のように一行だけ編集。

###### views.py ######

```py
#def vote..
	return HttpResponseRedirect( reverse('poll_results', args=(pobject.id,)) )
```

reverseの第一引数が'polls.views.results’から’poll_results’に変更されている。
これは先ほど設定したresultsページのnameで、reverseはここからビューに応じたURLを自動生成してくれるみたい。

## 以上で汎用ビューへの乗り換えは完了。 ##
 
動作確認をすると、[前回](http://qiita.com/juniskw/items/dd2628975e58769df35c)とまったく同じ動作をすることが確認できる。
明らかにこっちのほうが楽。

## ついでにチュートリアルもこれにて終了。 ##

さしあたっては過去の投稿[DJangoメモ：ブログ作成の基礎](http://qiita.com/juniskw/items/204aeef1c43af403a532)を参考にしていた本と一緒に見直してみて、同時にやり直してもいきたい。

# そして、それをherokuで公開するのが次の目標。 #
R：データフレームの各項目の型を調べる。

class関数を使う。おなじみ組み込みデータフレームのirisさんで確認。

```
> class(iris$Species)
[1] "factor"
```

全項目を一度に確認。sapply関数を使う。

```
> sapply(iris, class)
Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
   "numeric"    "numeric"    "numeric"    "numeric"     "factor" 
```
`Handle`、`HandleFunc`、`Handler`、`HandlerFunc`についてまとめ

ただの勉強メモ程度ですが、httpパッケージ配下の`Handle`、`HandleFunc`、`Handler`、`HandlerFunc`についてまとめました。

Goでアプリケーションサーバを書くのはとても簡単で、そこらのLL並みの行数で小さなWebアプリケーションが立ち上がる。

```go:httpd-sample.go
package main
import (
	"fmt"
	"log"
	"net/http"
)

func index(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "hello, go httpd!")
}

func main() {
	http.HandleFunc("/", index)
	e := http.ListenAndServe(":8080", nil)

	if e != nil {
		log.Panic(e)
	}
}
```

```bash
$ go run ./httpd-sample.go
```

何のログも出ないですが、これで8080番をリスンするっぽい（logパッケージで細かく出してあげれば出る）。

流れは:

* `http.Handle` や `http.HandleFunc` でパスごとのハンドラーを指定する
* `http.ListenAndServe` で立ち上がりる

便利簡単！

`http.HandleFunc`は`http.ResponseWriter`と`*http.Request`を取る関数をそのまま渡せる。

`http.Handle`は、`http.Handler`インタフェースを実装したオブジェクトを渡す。要するに`ServeHTTP(http.ResponseWriter, *http.Request)`という関数を実装したオブジェクトであれば良い。以下のような感じ:

```go:httpd-sample2.go
package main
import (
	"fmt"
	"net/http"
)

type AppHandler struct {
	appName string
}

func(index *AppHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "hello, %s!", index.appName)
}

func main() {
	index := new(AppHandler)
	index.appName = "sample app"
	http.Handle("/", index)
	http.ListenAndServe(":8080", nil)
}
```

`http.HandlerFunc`というものもあり、これは関数を渡せば`http.Handler`を実装したオブジェクトを返してくれる。

`http.HandlerFunc`は実際には`func(ResponseWriter, *Request)`の別名だが、`ServeHTTP`をちゃんと実装している。`ServeHTTP`は自分自身をただ呼び出すだけである。簡潔。

```go
type HandlerFunc func(ResponseWriter, *Request)

// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
	f(w, r)
}
```

先ほどの`HandleFunc`も、実際は中で`HandlerFunc`を読んで変換している、と言う感じ。

```go
func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
	mux.Handle(pattern, HandlerFunc(handler))
}
```

次は @hajimehoshi さんです
「!== false」 V.S. 「false !==」

# 導入

### [PHP Manual - array_search](http://php.net/manual/ja/function.array-search.php)

配列から探したい値に対応するキーを取ってくる関数です。見つからなかった場合には **FALSE** が返されます。この記事の内容には直接関係ないですが、この関数にはいろいろ落とし穴があるので注意してください。

- 結果の比較には `===` `!==` を使わなければならない
- 第3引数 *`$strict`* は **TRUE** にすることが推奨される

さて、これを例として問題を提起します。

```php
/* 問題 */
echo "ランダムに選出したアルファベットはH～Nの中に含まれているか？\n";
echo "またそのアルファベットは(Hから数えて)何番目のアルファベットか？\n";
echo "\n";

/* 変数の準備 */
$range = range('H', 'N');       // 限定する範囲
$all = range('A', 'Z');         // 全範囲
$rand = $all[array_rand($all)]; // ランダムに選出されたアルファベット

/* 判定と表示 */
$pos = array_search($rand, $range, true);
if ($pos !== false) {
    printf("アルファベット[%s]は[%d]番目にありました\n", $rand, $pos);
} else {
    printf("アルファベット[%s]は見つかりませんでした\n", $rand);
}
```

この場面において

```php
$pos = array_search($rand, $range, true);
if ($pos !== false) { }
```

を1つにまとめたいとき、あなたならどう書きますか・・・？

# 考察

## `!== false` を用いたとき

以下のコードは正しく動作しません。

```php
if ($pos = array_search($rand, $range, true) !== false) { }
```

何故ならば **`=`**<ins>より</ins>**`!==`**<ins>の方が優先度が高い</ins>ことにより、array_search関数の返り値と **FALSE** を比較した結果が *`$pos`* に代入されてしまうからです。この書き方をしたい場合には

```php
if (($pos = array_search($rand, $range, true)) !== false) { }
```

として明示的に評価の順番を変更する必要があります。

## `false !==` を用いたとき

```php
if (false !== $pos = array_search($rand, $range, true)) { }
```

```php
if (false !== ($pos = array_search($rand, $range, true))) { }
```

実はコレ、どっちでも動いちゃうんです。

#### `( )` が省略できる理由

<ins>異なる順番で評価されれば、それが代入式として無効なものとなる</ins>のが理由です。代入式は必ず **$変数 = 値;** という形である必要がありますが、`false !== $pos` が先に評価されてしまった場合、次に評価される代入式は **値 = 値;** という形になってしまいます。そこでPHPがこのようなものは例外として考えて、順番を自動的に最適化してくれているのです。

## 他の例

他によく見る例として、 下記のような `!` 演算子でのケースが考えられるでしょうか。これも同様の省略を行うことが出来ます。

```php
$str = (string)filter_input(INPUT_GET, 'str');
if (!$len = strlen($str)) {
    echo "入力された文字列は{$len}バイトです";
} else {
    echo "文字列が入力されていません";
}
```
スクロールビューの上に固定の(スクロールしない)Viewをつける

UIScrollViewの上に浮かんでいるような、スクロールしないViewをつける方法です。
英語で検索する時は　[Stationing View UIScrollView]とか[Header View UIScrollView]とかpinningなどと検索したら出てきます。
また、appleのWWDC 2011の　https://developer.apple.com/videos/wwdc/2011/　
で「Advanced ScrollView Techniques」としてビデオで紹介されています。

スクロールしたらscrollViewDidScrollでそこの座標を受け取って、固定したいビューに渡します。


まず、固定したいViewを koteiViewという名前にするとしたら、
.hに
@interface ViewController : UIViewController<UIScrollViewDelegate> //スクロールビューのデリゲートも
UIScrollView *ScrollView;
UIView *koteiView;


.mのviewDidLoadに
<スクロールビューを作って>
scrollView.delegate = self; //これを忘れずに
<固定ビューを作る>
CGPoint koteiViewCenter = [koteiView center];
として、最初の中心座標を取得します。

-(void)scrollViewDidScroll:(UIScrollView*)scrollView
{
     CGPoint contentOffset = [scrollView contentOffset];
    CGPoint newCenter = CGPointMake(koteiViewCenter.x + contentOffset.x,
                                    koteiViewCenter.y + contentOffset.y);
    [koteiView setCenter:newCenter];
}
tunnelblick を使った画面共有の設定メモ


## 接続する側、される側macの設定
- 参考 http://matome.naver.jp/odai/2133218146563100601)
- 接続される側の vnc:// から始まるアドレスをメモしておいて自宅へ

## 以下接続する側（自宅）macの設定

### tunnelbrick install
- https://code.google.com/p/tunnelblick/wiki/DownloadsEntry#Tunnelblick_Stable_Release

Mavericks 用は beta

- https://code.google.com/p/tunnelblick/wiki/DownloadsEntry#Tunnelblick_Beta_Release

### tunnelbrick 設定
- 起動してウィザードに従い、「設定ファイル有り」「OpenVPN形式 (.ovpn)」を選択

- client.ovpn ファイルを開き、cert と key の行を、用意して頂いたファイル名に変更する

- Desktop に 「Empty Tunnelblick VPN Configuration」という空フォルダができるので、設定ファイル、鍵一式を置く

- Tunnelblick の接続先として使用したい名前にフォルダ名を変更し、拡張子 .tblk を付ける

- フォルダをダブルクリックして設定インストール

### vpn接続
- tunnelbrick の先ほど作った設定を選び、接続する

### 画面共有
- safari を起動し、接続される側の vnc:// から始まるアドレスを入力

-
環境: OSX10.9.1 tunnelblick 3.4beta18 (build 3704)
XML と Namespace と VerifyError

何か変なものに遭遇したので共有。

サーバーなどから XML を受け取った時に XML に Namespace が設定されていることがある。

```xml
<data xmlns="http://hogehoge.mojamoja/">
	...(略)...
</data>
```

の、 `xmlns="http://hogehoge.mojamoja/"` の部分のことだ。
このような場合、大体は下のようにアクセスすると思う。

```as3
// message は 受け取ったXML
var ns: Namespace = message.namespace();
trace(message.ns::hoge);
```

XMLが深かったりすると、こんな感じになる。

```as3
var ns: Namespace = message.namespace();
trace(message.ns::hoge.ns::moja.ns::piyo.ns::pugyaaa);
// または
trace(message..ns::pugyaaa);
```

---

さて、ココからが本題。
じゃあ他のやり方は？というと
こんな方法がある。

```as3
var ns: Namespace = message.namespace();
default xml namespace = ns;
trace(message.hoge);
trace(message.hoge.moja.piyo.pugyaaa);
trace(message..pugyaaa);
```

デフォルトの XML Namespace を設定する方法だ。

テストしてみるとわかるが、これを実行すると、一見上手くいくのだが、
この後に別メソッドに飛んだりすると 

```
[Fault] exception, 情報=VerifyError: Error #1025: 無効なレジスタ 1 がアクセスされました。
```

というランタイムエラーが表示される。
(全部のプレイヤーやSDKで試してないけど…)

この時の対処法。

```as3
default xml namespace = null;
```

を入れておくと大丈夫。
xml の Namespace は設定したら、解除しないと駄目なんだね。
まぁそのままにしておいたらカオスになるからね…。

ところで俺は何でこんなこと調べてたんだっけ。
KeyChainAccess がフリーズする問題と、その対応策


# 前置き

ボクの愛機である MacBook Pro 15inch (Early 2011) が最近 KeyChainAccess でパスワード入力しようとすると OS 全体巻き込んでフリーズするようになったので、解決策を調べてみた。
<span style="color: #999999;"># これは、MacBook Pro 13inch Retina を買えという神の啓示か…！？</span>

環境としては以下の通り

* OS: OS X 10.9.1 (Mavericks)
* CPU: Intel Core i7 2.3GHz
* メモリ: 16GB 1333MHz DDR3 (8GB &times; 2)

# 現象

* 開発サーバのオレオレ SSL 証明書を KeyChainAccess に食わせようと思って crt をダブルクリックする
* 「信頼する」ボタンをクリックする
* パスワード入力画面が表示される
* **フリーズ！！**

もう、こうなると Finder はもとより、全てのアプリケーションが反応しなくなる。

電源 4 秒押しして再起動すれば何事も無かったように動くんだけどね。

# 対応策

全く以て根本解決にはなっていないが、以下の手順を踏んだら解消された。 (ように見える。)

1. 安定した状態で KeyChainAccess を普通に開く。
	* `/Applications/Utilities/KeyChain Access.app` にあるよ。
	* Finder から探す場合は `[アプリケーション] > [ユーティリティ] > [キーチェーンアクセス.app]` ですな。
1. [環境設定] を開く。
1. [自分のデフォルトキーチェーンをリセット] をクリックする。

これで、一応フリーズしなくなった。

が、副作用として、 **キーチェーンに保存済の全てのパスワードがリセットされる** ので、ご利用は計画的に。
css counter用のmixin【あると便利かもしれないsass用mixin】

ありと便利かもしれないmixinシリーズです。

今回はたまーに使いたくなる css counter篇。

### css counterとは？

css counterとは、ネイティブのcssで使えるカウンタのことです（そのまんま）。

順序付きリストだったり、セクション番号をつけるのによく使います。（存在が忘れられがちなのでよく使いません）便利です。

初期値の設定や、カウンタの増加値の設定などができます。

`:before`、`:after`擬似要素の`content`プロパティに入れることでcss カウンタの値を表示できます。

### mixin

```scss
@mixin resetCounter($name, $int: 0) {
    counter-reset: $name $int;
    list-style-type: none;
}

@mixin addCounter($name, $before: '', $after: '', $int: 1) {
    &:before {
        counter-increment: $name $int;
        content: "#{$before}"counter($name)"#{$after}";
    }
}
@mixin addCounters($name, $split: '.', $before: '', $after: '', $int: 1) {
    &:before {
        counter-increment: $name $int;
        content: "#{$before}"counters($name, $split)"#{$after}";
    }
}

```

`$name`: カウンターの名前。カウンターの名前ごとにカウンターが管理されます。必須です。
`$before`: 出力される数字の前に付けたい文字列。デフォルトは空文字列。
`$after`: 出力される数字の後に付けたい文字列。デフォルトは空文字列。
`$int`: 
  - resetの場合は初期化後のカウンター値。デフォルトは0。（0なら表示は1から）。
  - addの場合は加算されるカウンターの値。デフォルトは1。
`$split`: `addCounters()`で、カウンターの値を接続する文字列。デフォルトは'-'。（例 3-1-2)


### 使い方
キャプションに章番号つけるときなど。

`addCounter()`します。

```scss
$counterName: oreoreCounter;
.parent-section {
    @include resetCounter($counterName);
    h2 {
        @include addCounter($counterName, '第', '章');
    }
}
```
### 使い方その２
入れ子になってるリストに通し番号(1-1-1みたいな）を付けたいときなど。

`addCounters()`します。こちらは`s`がつきます。

```scss
$counterName: listCounter;
ol {
    @include resetCounter($counterName);
    li {
        @include addCounters($counterName, '-');
    }
}
```

--- 

表示結果はご自分でお確かめ下さいまし。
git rebase -i の使い方


gitを使ってるとよく聞くrebase
コミット履歴を改変してるので基本的には使わないほうがいいと思います。
でもローカルでぐだぐだになってしまっている履歴を意味のある単位に整理しなおしてからpushするためには使ってもいいと感じました。

整理したい履歴の数を指定して
` git rebase -i HEAD~4 `

これで出てきたコミットに対して、
pickとなっているものが適用するコミット。
pickをsにしてメッセージを書き直す。
pickをfにしてメッセージはpickのものを使用する。

この使い方なら気楽にやれると思います。
Railsで簡単にメニューバーを作る方法

備忘を兼ねて。
ヘッダ下などに横長（Horizontal）のメニューバーを簡単に作る方法です。

1._html.erb
ホーム画面とメニュー1～5の各画面へのリンクがあるようなメニューバーです。
メニュー2にはさらに4つのサブメニューがあります。

```erb
<div id='menu'>
<ul>
   <li><%= menu_link_to "Home", root_path %></li>
   <li><%= menu_link_to "Menu1", "#" %></li>
   <li class='has-sub'><%= menu_link_to "Menu2", :items %>
      <ul>
         <li><%= link_to "Menu2-1", "#” %></li>
         <li><%= link_to "Menu2-2", "#” %></li>
         <li><%= link_to "Menu2-3", "#” %></li>
         <li class='last'><%= link_to "Menu2-4", "#” %></li>
      </ul>
   </li>
   <li><%= menu_link_to "Menu3", "#" %></li>
   <li><%= menu_link_to "Menu4", "#" %></li>
   <li class='last'><%= menu_link_to "Menu5", "#" %></li>
</ul>
</div>
```

2.CSS
各メニューを横並びに表示させます。
また、メニュー2にカーソルが乗った時にメニュー2のサブメニューを縦並びにドロップダウン（？）で表示させます。
※色や幅、フォントサイズなどは適当です。

```css
/* 親メニュー */
#menu {
  width: auto;
}
#menu > ul {
  background-color: #123456;
  position: relative;
  font-size: 18px;
}
#menu > ul li {
  list-style: none;
  width: 120px;
}
#menu > ul > li {
  float: left;
  background-color: #987654;
  color: white;
  position: relative;
  display: block;
  line-height: 32px;
  text-align: center;
  vertical-align: middle;
}
#menu > ul > li > a {
  background-color: #123456;
  display: block;
  padding: 7px 30px;
  color: white;
  text-align: center;
  text-decoration: none;
  line-height: 18px;
}
#menu > ul > li:hover > a {
  background-color: #bbb;
}
#menu > ul > li > a > span {
  line-height: 18px;
}

/* 子メニュー */
#menu > ul ul {
  visibility: hidden;
  position: absolute;
  width: 120px;
  background-color: blue;
  z-index: -1;
}
#menu > ul li:hover ul {
  opacity: 1;
  visibility: visible;
  color: #000;
  z-index: 2;
  top: 32px;
  left: 0;
}
#menu > ul ul li {
  list-style: none;
  width: 100%;
}
#menu > ul ul li a {
  padding: 7px 0px 7px 0px;
  background-color: blue;
  display: block;
  color: white;
  font-size: 14px;
  text-decoration: none;
}
#menu > ul ul li a:hover {
  background-color: #30308b;
}
```

CSSが無駄に長い気がしてならない。
dotfiles


Resource: [USING GIT AND GITHUB TO MANAGE YOUR DOTFILES](http://blog.smalleycreative.com/tutorials/using-git-and-github-to-manage-your-dotfiles/)

[My dotfiles](https://github.com/shinokada/dotfiles)

I have changed makesymlinks.sh to use .filename.

```
$ mv ~/.filename ~/dotfiles/.filename

# add .filename to makesymlinks.sh
...
files=".vimrc .vim .NERDTree .Xresources .bashrc .oh-my-zsh .zsh .zshrc .filename"
...

# run makesymlinks.sh
cd ~/dotfiles
chmod +x makesymlinks.sh
# note that makesymlinks.sh doesn't work. Use ./
./makesymlinks.sh 

# prepare git
git init

# add to git
git add .
git commit -m ".filename added"
git remote 
git remmote add origin http://github.com/shinokada/dotfiles.git
git push -u origin master

# from the second time
git push origin master

```
SSLのアップロードサイズを増やす

```bash:apacheのエラー
request body exceeds maximum size (131072) for SSL buffer
could not buffer message body to allow SSL renegotiation to proceed
```

* [SSLRenegBufferSize Directive](http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#sslrenegbuffersize)

```apache:
SSLRenegBufferSize 10000000
```

* .htaccessにて設定も可能。

デフォルトだと128KBなので、10MBに設定しておきました。
knife soloでdata_bagsを使う


# 秘密鍵を作成する
```
openssl rand -base64 512 | tr -d '\r\n' > data_bag_key
```

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


# data_bagsを作成する
```
knife solo data bag create staging leftronic --json '{"id": "leftronic", "key": "${leftronic_password}"}'
knife solo data bag create production leftronic --json '{"id": "leftronic", "key": "${leftronic_password}"}'
```

# 登録されているかどうか確認
```
knife solo data bag show staging leftronic
```

# data_bagsをレシピから取得する
```rb:default.rb
data_bag = Chef::EncryptedDataBagItem.load("staging", "leftronic")
p data_bag['key']
```


# templateで使用
```rb:default.rb
template "/etc/td-agent/conf.d/aggregate_pageview.conf" do
  mode "0644"
  source "aggregate_pageview.conf.erb"
  variables(:leftronic_key => data_bag['key'])  
end
```
AmimotoでWordPress立てたときにハマったこと


# AmimotoでWordPress立てたときにハマったこと
___
## 失敗

1. 事前にドメイン取得
1. AWSのシンガポールリージョンでMarketPlaceからAmimotoをぽちりしてT1.microインスタンスをLounch
1. AWSのPublicDNS名にアクセス！
1. 諸々の設定をし、公開できるレベルにサイトを整える！
1. EIPを付ける！
1. ネームサーバのAレコードにEIPのIPアドレスを登録！
1. 数分後に新ドメインアドレスでサイトを確認！
1. WordPressの管理画面が404 NotFound！
1. あ”ーーーーーーーーーーーーーーーーーっ！！！！！！！

いきなり公開するのもなんだから整えてからというのが心情じゃないですか。
しかし、3の際にWordPressのInstallとか管理画面設定とかするんですが、その際にアクセスしているドメイン名がDBに格納されるらしいのですよ。

mySQLにアクセスしてちょいちょいと変更すればいいのですが、イチから建てようと思っていたがAmimotoで楽をしようとして逆にブラックボックス化して、くじけました。orz

で、再度やり直し。
___
## 成功

1. 事前にドメイン取得
1. AWSのシンガポールリージョンでMarketPlaceからAmimotoをぽちりしてT1.microインスタンスをLounch
1. EIPを付ける！
1. ネームサーバのAレコードにEIPのIPアドレスを登録！
1. EIPをAレコードに登録したドメイン名でアクセス！
1. WordPress設定
1. 諸々の設定をし、公開できるレベルにサイトを整える！

という順番が正解です。
まあせっかくだから、WordPressのドメイン名変更手順を纏めておきますか。
EIPを付けてPublicDNS名が変わってしまった時点で気付くべきだった。
Git で空ブランチ（根が複数のリポジトリ）を作る

GitHub の Project Pages のような空ブランチ（根が複数のリポジトリ）の作り方は次の通りですが・・・

 - [Creating Project Pages manually - GitHub Help](https://help.github.com/articles/creating-project-pages-manually)

どうにもこれが覚えられません。

orphan なんて英単語知らないし。

`git rm -rf .` とかなんだかドキドキするし。

（人によりけりですが）そもそも master と gh-pages は別々にチェックアウトした方が捗るって気がするし。

---

まっさらなリポジトリを作って push すれば良いんじゃ？ と思いました。

```console
$ mkdir gh-pages
$ cd gh-pages

$ git init
$ git checkout -b gh-pages
$ echo testing > index.html
$ touch index.html
$ git add index.html
$ git commit -m first

$ git remote add -t gh-pages origin git@github.com:ngyuki/testing.git
$ git push -u origin gh-pages
```
2013-12-20 コンポーネントの名前の付け方について


[Delphi Advent Calendar ](http://qiita.com/advent-calendar/2013/delphi)2013 12/20 の記事です。


## はじめに

プログラムを作成する上で、名前の付け方は重要だと思っています。

名前はどうでもいい、と言うすご腕プログラマはおられますが、私自身は凡人プログラマなので、名前の付け方を工夫することで、ソフト作成とその後のメンテナンス効率を高めたいと考えています。


## 視点

以下の視点を考慮して、名前をつけます。

1. 見つけたいものがすぐに見つかること
2. 関係ないものが検索結果に出ないこと
3. 同じ種類のものは、同じ種類とすぐにわかるもの。
4. ある種類のものを探すのが簡単なこと。


視点1に関して、これはそもそも名前の付け方を考慮する一番の理由と思います。

視点2に関して、Ctrl+Fなどで検索した時に関係ないものが表示されないほうが、よりその時の作業に集中できます。

視点3に関して、同じ種類のものを名前から判別することで、コード補完機能(Ctrl+Space)が有効に使えます。

視点4に関して、IDEの「構造ビュー」から該当部品を迅速に見つけることができるように。例えば、「ボタンのxxxがあったよな」という感じで「構造ビュー」から見つける時。


## 種類

名前の付け方は3つくらいに分けられると思います。
フォームのTButtonコンポーネントを例としてあげてみます。

1. 先頭に種類を表す名前をつける (例: btnTest)

2. 最後に種類を表す名前をつける (例: testBtn)

3. そもそも種類を表す名前をつけない (例: test)

種類1の利点は、コード補完機能を有効に使えます。btnだけ入力してCtrl+Spaceして、リストからすぐに該当部分を見つけられます。ただし、TButtonが30個もあるようなフォームになったら、リストから探すのが面倒にはなりますが。

種類1のもう一つの利点はIDEの「構造ビュー」において、同じ種類のものがかたまって表示されるので、探すのが楽になります。

種類2の利点は、種類1のようないわゆる「Yoda notation / ヨーダ記法(Blue is the sky)」とは異なり、物理的なものの名前(例: テストボタン)と似たような読み方となることです。ただ、それがコーディングにおいて便利なのかは、私自身はわかりません。

種類3の利点は、わかりません。


## 失敗例 (途中まで同じ名前)

種類以外にも名前をつける時に気を付けたいとおもった経験があります。似たようなものがある場合です。

- btnMon (最初に作ったもの)
- btnMonB (後で追加したもの)
- btnMonC (後で追加したもの)

上記のような名前のTButtonがあると、「btnMon」で検索した時、btnMonBもbtnMonCも検索されてしまう。これでは修正すべき該当部分を見つけるのが面倒になります。

btnMonBが追加される時点で、btnMonはbtnMonAなりにした方が、後々のソフト開発がやりやすくなります。


## 終わりに

しかしながら...命名規則の適用は状況によります。

単独で組むソフトの場合は、自分がプログラムしやすい命名規則にすることでコーディングをしやすくなります。

複数人で組むソフトの場合は、他者のソースと同じ命名規則にすることでソースの可読性が高まります。自分が担当する部分だけ独自の命名規則にしてしまうと、他の人がそのソースを見た時に、コードが読みづらくなります。

単独で組むソフト開発とチームで組むソフト開発の両方の作業がある時は、チームで組むソフト開発のルールに沿ったほうがいいかもしれませんね。二つのルールを切替えながら作業すると、混乱を生じてしまうので。

あとは、単独でソフトを開発し続ける場合、途中で命名規則を変えると昔のソースと最近のソースで規則が異なり、ソースコードが読みにくくなります。
パーフェクトRuby の次に読む本

このエントリは [パーフェクトRuby Advent Calendar](http://www.adventar.org/calendars/198) の 20 日目のエントリです

## はじめに
みなさん [パーフェクトRuby](http://www.amazon.co.jp/dp/4774158798/) はもう読みましたよね。わしも読んだ。
今までは [プログラミング言語 Ruby](http://www.amazon.co.jp/dp/4873113946) を傍らに置いてコードを書いていたんですが、最近は [パーフェクトRuby](http://www.amazon.co.jp/dp/4774158798/) も一緒に置いてあります。

さて、６００ページを超えるボリュームで、Ruby での開発に必要な事はだいたい載ってる[パーフェクトRuby](http://www.amazon.co.jp/dp/4774158798/) を既に読み終わって手持ち無沙汰になってる人、いますよね？そんなあなたに、次に読む本を１冊ご紹介したいと思います。

## dRubyによる分散・Webプログラミング
[dRubyによる分散・Webプログラミング](http://www.amazon.co.jp/dp/4274066096) という本があるんですが、とても面白いです。日本語で書かれた書籍ですが、後に[英語訳版が出版](http://www.amazon.co.jp/dp/193435693X)されるという技術書としては珍しい書籍です。
dRuby は Ruby に __標準添付されている__ 便利なライブラリです。ざっくりと説明すると、別プロセスが持っているオブジェクトに TCP 経由でアクセスして、手元で使うのと変わらぬ感覚で使えてしまうというものです。

## マルチプロセスな処理って難しい
例えば、独立した処理の結果を順番に印字しようと思ったときに、子プロセスに処理を分散させようとして下のようなプログラムを書いてみたとします。

```rb:multi_process.rb
# 共有するパイプ
reader, writer = IO.pipe

# 適当な処理をする１０個のプロセス
10.times do |n|
  index = n
  fork do
    reader.close
    result = rand(5)
    sleep result
    writer.puts "#{index},#{result}"
  end
end

writer.close
Process.waitall
puts reader.read
```

```txt:結果
1,1
4,1
2,2
9,2
3,3
5,37,3

0,4
6,4
8,4
```

６行目で意図しない感じになってますね。これじゃあ、パースしてソートとか出来ない...
複数のプロセスから同時にパイプへの書き込みがあったときに、排他的ロックみたいなことが出来てないのが原因でしょうか。パイプよりもうちょっと高級なものを使わないといけない気がしますね。

## dRuby でマルチプロセスなプログラムを書いてみる
そこで、パイプの代わりに dRuby のサーバープロセスを使って書いてみます

```rb:multi_process_by_drb.rb
require 'drb/drb'

URI = 'druby://localhost:33333'

# データ収集サーバー
server_pid = fork do
  DRb.start_service(URI, Array.new)
  sleep
end

# 適当な処理をする１０個のプロセス
pids = []
10.times do |n|
  index = n
  pids << fork do
    DRb.start_service
    result = rand(5)
    sleep result
    DRbObject.new_with_uri(URI)[index]= result
  end
end

# 適当な処理たちが全部終わるのを待つ
pids.each do |pid|
  Process.waitpid(pid)
end

# 子プロセスを立ち上げた順に結果を取り出し
DRb.start_service
DRbObject.new_with_uri(URI).each_with_index do |result, index|
  puts "#{index},#{result}"
end

# データ収集サーバープロセスを殺害
Process.kill("HUP", server_pid)
```

```txt:結果
0,3
1,3
2,0
3,2
4,0
5,3
6,2
7,1
8,2
9,0
```

うまくいった感じがしますね。ただ、なんでうまくいくのかについては、いまいち理解してません。dRuby本の『5.3.1 排他制御』(p.82) に書いてあるっぽいですが難しくて、もう少し勉強が必要です。ここら辺を理解できるようになると次の世界への扉が開く気がします。

このプログラムは子プロセスが適当な秒数 sleep してるだけなので大したこと無いんですが、ちゃんとゴリゴリ計算するような仕事を与えてやると、マルチコアプロセッサの各コアが熱くなって楽しいです。でも調子にのって fork しすぎると死ぬので、どれくらいまでなら fork しても大丈夫なのか、ちゃんと基礎的な勉強をしたいところです。

## One more thing
実はこの記事を書くにあたって参考にした本がもう一冊あります。[なるほどUnixプロセス ― Rubyで学ぶUnixの基礎](http://tatsu-zine.com/books/naruhounix) という電子書籍です。 [パーフェクトRuby](http://www.amazon.co.jp/dp/4774158798/) の p.223 〜 p.224 で解説している Process について深く掘り下げた内容です。わしにとっては dRuby 本の副読本のような位置づけで、併せて読むと理解が深まる気がします。

## まとめ
[プロセッサのコアがどんどん増えていく今日この頃](http://store.apple.com/jp/buy-mac/mac-pro?product=MD878J/A&step=config)、皆様いかがお過ごしでしょうか。また、[金にものを言わせればいくらでも計算資源が増やせる時代](http://aws.amazon.com/jp/ec2/)をどうやって生き抜いていますか。何をそんなに計算することがあるんだ、と思うかもしれません。わしもそう思う。
せっかく沢山の資源があるんだから、それらを束ねてドッカンと仕事をさせてみたい。しかもお手軽に。と思ったとき、dRuby があなたを見つめているかもしれません。

異常です。
Mojoliciousの「字面的に」洒落てる5つ

Mojolicious使っているとたまーに

> お、洒落てるなこりゃ！

っていう **字面** に出会います。日本人のセンスとしては微妙に理解しがたい点もありますが5つほど、そんなものをピックアップしてみました。ではいってみよー！

***

### mojolicio.us

まずプロジェクトのホームページのURL。CPANモジュールを閲覧できる `search.cpan.org` や `metacpan` 以外に独自にMojoliciousを紹介したり解説するページがあるのですが、そのURLが…

> **http://mojolicio.us/**

なんですよ。ドメインハックですよ！クールですね ^^

### Test::Mojo

Mojoliciousアプリケーションをテストするのに `Test::Mojo` が便利なんですが、 `status_is(200)` とか書けてカッコいいですね！

```pl
use Test::More;
use Test::Mojo;

my $t = Test::Mojo->new('MyApp');
$t->get_ok('/')->status_is(200);

done_testing();
```

### hypnotoad

本番環境向けのpreforkサーバがMojoliciousには同封されていてそれが `hypnotoad` って名前です。英和辞書とかでひくとそういう単語は無いと言われるのですが、翻訳サービスにかけると

> **催眠ヒキガエル**

って出てきます。由縁がぶっちゃけ分からないので、どなたかご存じでしたら教えてください。これはもしかしてコンテキストさえ分かっていれば何かしらクールなのかもしれないですね。

### j

JSONフォーマットを扱う `Mojo::JSON` ではエキスポートされるメソッドとして `j` ってのがあってencode/decodeを自動的に判別します。

```pl
my $json_string = j({ message => 'Mojolicious is COOL ?' });
```

単に一文字 `j` がいいか悪いか置いといて、まぁ洒落てると捉えてもいいかもしれませんね！

### ojo

最後のネタ。 `ojo.pm` なんても入っていて

> オジョってなんだよ

って思っていたらワンライナーで使う場合に `-M` をつけたら結果 **-Mojo** になる。おお、これは洒落ている！ちなみにこのojoを使ってWebページのDOM操作したければこんな具合。

```
$ perl -Mojo -E 'say x(g("yusuke.be")->body)->at("title")->text'
# ゆーすけべー日記 - yusukebe
```

ほえ〜〜〜

***

5つ紹介してきましたが、こんなところがMojoliciousっぽいなーって思います。

以下の写真は昨日つくった唐揚げエンジニア顔負けの唐揚げです。記事の内容と相関はございません。

![IMG_2540.JPG](https://qiita-image-store.s3.amazonaws.com/0/22289/4ca286a1-e30a-fb25-d704-b2420a9a27df.jpeg)
【PHP】public,private変数の使い方とアクセス方法

こんにちは。

まず、なぜprivateでpublicはクラス内でほとんど使わないのか。
雑誌を読んで結構理解が深まりました。

>
鍵をかけないと周りから見られるから。

こんな感じで書いてあることが多いですが、僕なりに一番納得したのは
ほかの方がそのメソッド(変数も？)を呼べないようにするため。

例えば統合開発環境を利用した際、補完機能で「.」を押すと候補がでてきますが
privateメソッドにしておくと候補として表示されなくなります。
あぁ、確かに同じような名前のメソッドが候補でたくさん出てくると
困るなぁというのがしっくりきました。

まず正常な動作をするソース

```php
<?php
class Calendar{
  
  private $year;

  public function __construct($y){
    $this->year = $y;
  }

  public function get_info(){
    return $this -> year ;
  }

}

$test = new Calendar(2013);
echo $test->get_info(); //2013
?>
```

privateで定義された$yearが、
>
  public function __construct($y){
    $this->year = $y;
  }

  public function get_info(){
    return $this -> year ;
  }

ここでアクセスされていますが、これは同一クラス内であり
$this ->　を利用することでアクセスが可能になります。

同一クラス外

```php
<?php
class Calendar{
  
  private $year;
}

$test  = new Clendar(2013) ;
echo $test -> year ;

```
とやるとエラーで返ってきます。

また同様に

```php
<?php
class Calendar{
  
  private $year;

  public function __construct($y){
    $this->year = $y;
  }

  private function get_info(){
    return $this -> year ;
  }

}

$test = new Calendar(2013);
echo $test->get_info(); //エラー
?>
```
とやっても、Calendarクラスをnewしたところで
get_info()関数がprivateになっているのでエラーで返ってきます。

よし、なんだかつかめてきてうれしくなっております。
(実務レベルに早くとうたつしたい～)

それではこれからもよろしくお願いいたします。
objective-cでユニコードエスケープされたJSON文字列をデコードする方法（not Parse）

ユニコードエスケープされたJSON文字列をデコードする方法が見つからないので調べてみました。
（パースする方法はいくらでもあるのですが。。。）
こんな感じでUtilityクラスにでも定義して呼び出すと便利な予感です。

```Utils.h
+ (NSString *)decodeJSONString:(NSString *)input;
```

```Utils.m
+ (NSString *)decodeJSONString:(NSString *)input
{

    NSString *esc1 = [input stringByReplacingOccurrencesOfString:@"\\u" withString:@"\\U"];
    NSString *esc2 = [esc1 stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
    NSString *quoted = [[@"\"" stringByAppendingString:esc2] stringByAppendingString:@"\""];
    NSData *data = [quoted dataUsingEncoding:NSUTF8StringEncoding];
    NSString *unesc = [NSPropertyListSerialization propertyListFromData:data
                                                       mutabilityOption:NSPropertyListImmutable format:NULL
                                                       errorDescription:NULL];
    assert([unesc isKindOfClass:[NSString class]]);
    return unesc;
}
```
使い方
`NSString *escapedString = [Utils decodeJSONString:error];`


下記投稿のコピペですが（白目）
http://stackoverflow.com/questions/2099349/using-objective-c-cocoa-to-unescape-unicode-characters-ie-u1234

日本語でこそ必要そうな情報なので投稿してみます。
名前を付けてフォルダ生成ダイアログ

'変数を宣言
Dim str_path

InputMSG = InputBOX("フォルダ名","フォルダ生成ダイアログ","TEST")

Set objFS = CreateObject("Scripting.FileSystemObject")

'"vbs_test" というフォルダを作成する
str_path = objFS.CreateFolder(".\" & InputMSG)

'作成したフォルダの絶対パスを表示
MsgBox str_path
Ansibleを導入したい人の為のくどきポイント


Advent Calendar初参加です。
ガクガクプルプルしています。(((( ；ﾟДﾟ))))ｶﾞｸｶﾞｸﾌﾞﾙﾌﾞﾙ

プロビジョニングフレームワークの中でも比較的ユルっとフワッと始められる[Ansible](http://yteraoka.github.io/ansible-tutorial/)
でもあなたがもしDevなら導入にあたりOpsの説得が必要です。
そんなときにAnsibleの導入で謙る、ごねるネタをいくつかご紹介します。


## 対象者

最近流行のプロビジョニングフレームワークを導入したい！！って方。

## でも、それって結構インフラ担当者から嫌がられる事が多いんですよね。

そりゃあ、普段あまりプログラムを書かない人達に

#### 「プログラムを書いて自動化できるんですよ！！」

って口説いても

#### (＇ε＇)ﾌｰﾝ

って感じになるわけで

「kickstartですでに管理しているし」
「インストール手順とかすでにshell化してるし」

とかそりゃまあ、新しい事に対する反発ってのは常にでますよね。
分かります。普段業務で忙しいのに新しい事覚えろってのは最初は苦痛なはずです。

そんな方々にAnsibleを導入する為の口説きポイントをいくつかご紹介します。

## 【その１】インストールはHost側だけでいいんですよ！！！

ここはChefとの違いですね。

Chefは対象とする

* Host側
* ゲスト側

両方にChefのインストール(RubyとGem)が必要ですが
Ansibleは必要ありません。

働いてる場所によってはミドルウェアインストール一つだけでもインフラの方に

### (　ﾟДﾟ)ｺﾞﾙｧ!!本番環境に必要ないもんいれて何すんじゃぁぁぁぁ！！！

と怒られる場所があります。	

でもAnsibleの基本概念は

### SSHで頑張る！！

です。

なんで怒られそうな場所でしたら

### 「本番環境に何もミドルウェア入れずに使える便利なツールがあるんですけどもぉぉぉぉぉ」

って(((( ；ﾟДﾟ))))ｶﾞｸｶﾞｸﾌﾞﾙﾌﾞﾙしながら言ってみましょう。

## 【その２】ドキュメントがシンプルっす

### Chefに比べてドキュメントがシンプル!!

Chefはドキュメント探すのに苦労するって方は自分だけでもないはず！！

でもAnsibleは

### [ドキュメント](http://www.ansibleworks.com/docs/)がシンプルです

これは布教活動をしていくにあたって

### 「覚える事がそんなにないんですよぉぉぉぉぉ」

って(((( ；ﾟДﾟ))))ｶﾞｸｶﾞｸﾌﾞﾙﾌﾞﾙしながら言ってみましょう。


## 【その３】とりあえず始められますっす

Chefの最近の流行は[opscode-cookbooks](https://github.com/opscode-cookbooks)のリポジトリのソースを利用してゴニョゴニョしましょう。とかが流行らしいですが、(自分は挑戦して途中で挫折しました)
ソースを見てもらえればわかりますが

* 結構ガチな感じがする。。。(お、俺だけか。。。)
* attibuteの定義をいっぱい追わなくてはならない。。。。

と最初に挫折しやすい、cookbookの中身を理解、習得するのにそれなりに時間がかかります。
※ opscodeのソース使わなければ該当はしません。が、Ansibleの導入が目的なのであえて(･д･)シラッと伏せておきましょう。

Ansibleはそんな流行とかはあんまりないんで、自由に気軽に書ける感じです。

なので

### 「とりあえず簡単にかけるんですよぉぉぉ」

って(((( ；ﾟДﾟ))))ｶﾞｸｶﾞｸﾌﾞﾙﾌﾞﾙしながら言ってみましょう。

(だんだん何を言いたいんだが分からなくなってきた。。。)

## 【その４】5000台くらいは接続できますっす

[Ansible入門…?](http://www.slideshare.net/r_rudi/ansible-28755803)の35ページあたりに5000台くらいいけるって書いてありました。(自分ではさすがに検証はしておりません）

この規模の台数を扱うのは限られてる場所だと思いますので、

### 「5000台くらいは同時に管理できなんですよぉぉぉぉぉ」

って(((( ；ﾟДﾟ))))ｶﾞｸｶﾞｸﾌﾞﾙﾌﾞﾙしながら言ってみましょう。


## 最後に

ゆるっとフワッとしている感じが自分は好きですし、python使えなくても(自分は使えない)人でも導入は比較的簡単にできるAnsible
。
さあ、

### いつ口説くか？

### 「今でしょ！！」(古い。。。。）
Railsで既存DBを流用したときのDangerousAttributeErrorを解消

railsで既存DBからアプリケーションを作るときは、database.ymlにつなげたいDBの接続情報を記述した上で、

    rake db:schema:dump

して、スキーマを作成します。
ここのテーブルに対しては、

    rails g model hoge

でhogeモデルのクラスを作成すれば、名前がhogeのテーブルのモデルクラスを作ることができます。






しかし、例えばテーブル中にhashというカラムがあると、

    ActiveRecord::DangerousAttributeError: hash is defined by Active Record

というエラーが出てしまいます。
Active Record中のhashメソッドと名前がかぶってしまっているからです。




そんなときに使うのが [safe_attributes](https://github.com/bjones/safe_attributes) というgemです。

Gemfileに以下を記述しbundle installしてあげると、

    gem 'safe_attributes'

内部処理での名前かぶりを自動的に解決してくれます。





全てのテーブルで必要としている訳でなく、特定のテーブルのみ適応させたいと言う場合は、

    gem 'safe_attributes', :require => 'safe_attributes/base'

のように記述し、modelクラスに問題となるカラムを記述します。

```rb
class MyModel < ActiveRecord::Base
  bad_attribute_names :my_attr
  validates_presence_of :my_attr
end
```





既存DBがactiverecord関係なしに設計されている時は、activerecordの変数やメソッドに関しては当然考慮されていないので、こういった事態に陥ることがあります。

そんなときお手軽にこのgemで解決することができます。