OmniAICreator/Qiita-1.07M huggingface dataset:
[備忘録] コピペしてすぐ使える iOSで時間測定

「ここからここまで、もっさり動作してるんで、少し高速化したいな」
って作業して、
「はて？どのくらい効果があったんだべ？？」
と、効果を確認したくなりませんか？

私は良くあります。

そして、都度調べて、すぐに忘れます。

自分のために、メモ。

```objc:sample1.m
<mach/mach_time.h>
:
:
//CPU時間を測定する
uint64_t start, elapsed;
start = mach_absolute_time();
// ↓時間計測したい処理 ここから
UIImage * image =[self imageWoNanikaHenkan:hoge];
// ↑時間計測したい処理 ここまで
elapsed = mach_absolute_time() - start;
NSLog(@"===============================");
NSLog(@"=== shingargle CPU TIME === [%llu]", elapsed); // ログ解析で検索しやすいように
NSLog(@"===============================");
```

効果測定なら、これで十分。

ちなみに「何秒かかってるんだべ？」を知りたいときは以下のような感じでナノ秒がとれます。

```objc:sample2.m
<mach/mach_time.h>
:
:
//CPU時間を測定する
uint64_t start, end, elapsed;
start = mach_absolute_time();
// ↓時間計測したい処理 ここから
UIImage * image =[self imageWoNanikaHenkan:hoge];
// ↑時間計測したい処理 ここまで
end = mach_absolute_time();
mach_timebase_info_data_t base;
mach_timebase_info(&base);
elapsed = (end - start)/base.denom;
NSLog(@"===============================");
NSLog(@"=== shingargle TIME === %llu nano second", elapsed); // ログ解析で検索しやすいように
NSLog(@"===============================");
```

これで忘れても安心。
RSpecの特殊なマッチャーを敢えて使わない方がいいケース

RSpecが提供するマッチャーは色々便利だったりしますが、一部のものはあまりうまく作りこまれておらず、テストの結果が本来行うべき、**失敗した時にどう失敗したのかを分かりやすく伝えるという機能を損ない、本末転倒に**なってしまっていることがしばしばあるので、そういうマッチャーは無理に使わないようにしましょう、という話です。

# expect(response).to be_ok など

例えば、下記のようなよくあるexampleを考えてみます。

```rb
it '400 Bad Requestを返す' do
  expect(response).to be_bad_request
end
```

このexampleが失敗した場合、次のような出力になります。

```
expected `#<ActionController::TestResponse:0x007f79b8ed6348 @body=...
[...超長い出力...]
>>.bad_request?` to return true, got false
```

欲しい情報はstatus codeだけなのに、`ActionController::TestResponse`オブジェクトの中身がまるまる表示されてしまい、一体間違ったstatus codeが何だったのか、少なくともひと目ではわからないでしょう。
また、これらのマッチャーはあらゆるHTTP status codeをサポートしているわけではないため、例えば下記のようには書けず、一貫性にも欠いてしまいます。

```rb
it '201 Createdを返す' do
  expect(response).to be_created
end
```

結局いずれの場合においても、`status`メソッドの中身を直接`eq`マッチャーで比較したほうがわかりやすいのです。

```rb
it '400 Bad Requestを返す' do
  expect(response.status).to eq 400
end
```

こちらのexampleが失敗した場合は、次のように非常に明瞭な結果が出力されます。

```
expected: 400
     got: 200
```

# expect(page).to have_css(...) など

同じような問題はcapybaraのマッチャーにも言えます。
`have_css`は（試してないですが多分`have_xpath`も）はテストが失敗した時、テスト対象のDOMが具体的にどんな構造になっていたかを教えてくれません。
[`find`メソッド](http://www.rubydoc.info/github/jnicklas/capybara/Capybara/Node/Finders#find-instance_method)などで対象の要素を取得し、[`Capybara::Node::Element`](http://www.rubydoc.info/github/jnicklas/capybara/Capybara/Node/Element)のAPIを駆使して、求めたい値を比較しましょう。
例えば、下記は`hoge`というクラスの画像のpathを調べる例です。
`[]`メソッドを使って`src`アトリビュートを取得しています。

```rb
expect(find('img.hoge')[:src]).to eq '/hoge.png'
```

formの要素の値を調べたりもできます。

```rb
expect(find('textarea.hoge').value).to eq 'hoge'
```

`all`を使って要素の数を確認するのもいいでしょう。

```rb
expect(all('.hoge').length).to eq 1
```
PDOでMySQLに接続、INSERT

自分で書かないと忘れてしまうのでメモ。
PDOを触り始めたばかりなので、おかしい部分があったらご指摘お願いします(o*｡_｡)oﾍﾟｺｯ

#とりあえず接続
localhostにDB名=dbname,user名=user,パスワード=password,で接続する場合。
DBの構成はこんな感じ

|id |name       |
|:--|:---------:|
|1  |1個目のデータ|
|2  |2個目のデータ|

```php:PHP5.3.6以降の場合
$dns = ('mysql:host=localhost;dbname=dbname;charset=utf8');
$usr = ('user');
$pass = ('password');


try{
  $pdo = new PDO($dns,$usr,$pass);
  $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXPENTION);
  $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC)
}catch (PDOExpention $e){
  $err_msg = "エラー：". $e->getMessage();
  echo $err_msg;
}

```

PHPのバージョンがそれより古い場合は以下の方法でutf8を設定

```php:PHP5.3.6より古い場合
$dsn = ('mysql:host=localhost;dbname=dbname');
$user = ('user');
$pass = ('password');
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');

try{
  $pdo = new PDO($dns,$usr,$pass,$options);
  $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXPENTION);
  $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC)
}catch (PDOExpention $e){
  $err_msg = "エラー：". $e->getMessage();
  echo $err_msg;
}
```

#INSERT
for文で１００個のデータを挿入してみる

```php:名前なしプレースホルダ
for( $i = 0 ;$i < 100 ;$i++){
  $name = ($i+1)."個目のデータ";

  $sql = "INSERT INTO テーブル名 (id,name) VALUES (?,?)";
  $stmt=$pdo->prepare($sql);
  $stmt->bindParam(1,$i,PDO::PARAM_INT);
  $stmt->bindParam(2,$name,PDO::PARAM_STR);
  $stmt->excute();
}
```

```php:名前つきプレースホルダ
for( $i = 0 ;$i < 100 ;$i++){
  $name = ($i+1)."個目のデータ";

　$sql = "INSERT INTO テーブル名 (id,name) VALUES (:id,:name)";
  $stmt=$pdo->prepare($sql);
  $stmt->bindParam(':id',$i,PDO::PARAM_INT);
  $stmt->bindParam(':name',$name,PDO::PARAM_STR);
  $stmt->excute();
}
```

#SELECT
```php:単純なSELECT
$stmt = $pdo->query("SELECT * FROM テーブル名");

foreach($stmt AS $row){
  //見やすい形に成形して表示
  echo "<pre>";print_r($row);echo "</pre>";
}
```

```php:prepare
$sql = "SELECT * FROM テーブル名 WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(1,1,PDO::PARAM_INT);
$stmt->execute();

foreach($stmt AS $row){
  //見やすい形に成形して表示
  echo "<pre>";print_r($row);echo "</pre>";
}
```
Log Macros in Objective-C

```objc:Prefix.pch
#define LOG(...) NSLog(__VA_ARGS__)'
#define LOG_PRINTF(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#define LOG_METHOD NSLog(@"%s", __func__)
#define LOG_METHOD_AND_ABORT LOG_METHOD; abort()
```

\_\_VA_ARGS_\_ : Mutable Args
\#\#\_\_VA_ARGS_\_ : Mutable Args (Except "," when args is nil)
\_\_func_\_ : Function Name

>References
http://tezfm.blogspot.jp/2010/05/objc-vaargs.html
http://www9.plala.or.jp/sgwr-t/c/sec05.html
http://wikiwiki.jp/redstrange/?%C4%EA%B5%C1%BA%D1%A4%DF%A5%DE%A5%AF%A5%ED
実際に実行したSQLをSQL Server Profiler でトレースする

1. ASP.NETのWeb.configでSQLの設定のところでidをユニークな値にする。(HOGEHOGEのところ)

    ```xml
<!--データベースアクセス設定-->
<add key="DataBase_1" value="@weight=100:data source=Datasource01;Failover Partner=Datasource01;initial catalog=xxxxx;user id=xxxx;password=xxxx;persist security Info=True;workstation id=HOGEHOGE;packet size=4096"/>
```
1. SQL Server Profilerを起動して「ファイル」-「新しいトレース」から新しいトレースを作成する
1. SQLサーバーへ接続後、「イベントの選択」タブで「全ての列を表示する」にチェックする
1. 「HostName」の列ヘッダーをクリックして、「次のパターンに一致」ツリーを開き「HOGEHOGE」を入力してOKボタンをクリック
1. ほかの値はデフォルトのまま（好みで変更する）
1. 実行ボタンをクリック後、画面操作して発行したSQLをトレースする
FirefoxOS用のFlappy Birdのクローンアプリを作る         (tmlib.js使用)

# Firefox OS って? 


Firefoxといえばブラウザですが、
最近KDDIがFx0の販売を始めたように、Firefox OSについても注目され始めています。


HTML5基盤に開発されている, スマートフォン用のOSで
HTML,CSS,Javascriptなどの汎用的な言語でアプリをなどを開発することができます。


iOSやAndroidのように、それ用の言語を覚える必要なくアプリが作れちゃいます。
（簡単なホームページが作れれば、アプリも作れる...!


> 公式サイトは以下
[Mozila](https://www.mozilla.org/ja/firefox/os/)




# アプリを作る
Flappy Birdのつくり方自体は調べてもらえば、いろいろ載っているので、
ある意味、本題のような感じです。


開発者用のFirefox ブラウザ　を使うと楽です。
> 
[Firefox Developer Edition](https://www.mozilla.org/ja/firefox/developer/)


### 作成手順
WebIDEのボタンを押すと、新規ウィンドウが開きます。
![ffde.PNG](https://qiita-image-store.s3.amazonaws.com/0/56030/f3a29774-ef39-3b9c-a5da-8194cc49ed1f.png)



![ffde2.PNG](https://qiita-image-store.s3.amazonaws.com/0/56030/8050175a-5b08-5ffd-3166-87ffbac09cef.png)

プロジェクト　＞　新しいアプリ　と進むと、また新規ウィンドウが開きます。
一番上の簡単なテンプレートを選択し、プロジェクト名を入れます。
![ffed3.PNG](https://qiita-image-store.s3.amazonaws.com/0/56030/e050655c-fe70-7e3d-6027-9d19bcdb3b12.png)



今回はsampleとしました。
既存のフォルダを開かずに進むと雛形ができます。
![ffde4.PNG](https://qiita-image-store.s3.amazonaws.com/0/56030/a2f8b6a6-2632-dcb8-5c45-6a0f2675976d.png)



これがアプリの設定ファイルです。
`manifest.webapp`
![ffde5.PNG](https://qiita-image-store.s3.amazonaws.com/0/56030/bc57d332-fe0f-df2a-ec39-62a951e84f00.png)
画像が小さいですが、、、
ここの`launch_path`に指定したファイルが起動時に開かれます。（ここでは`index.html`）
> マニュフェストファイルについては
[こちら](https://developer.mozilla.org/ja/Apps/Manifest)



### エミュレーターを使う
実際にFirefox OSのエミュレーターで動かすことも出来ます。
右上の**ランタイムを選択**のところから、エミュレーターをインストールして真ん中の再生ボタンを押します。


エミュレーター起動時
![ffde6.PNG](https://qiita-image-store.s3.amazonaws.com/0/56030/5482ebf5-d9d5-46cc-6175-3b677f784209.png)



試しに、雛形アプリを動かして見ると
![ffde7.PNG](https://qiita-image-store.s3.amazonaws.com/0/56030/78349a99-9326-de96-af5e-07a23986a075.png)


となります。
特別なのは`manifest.webapp`くらいでしょうか。
※実際のソースは一番下に貼ってあります。

# tmlib.js
ゲーム開発用のjsライブラリです。
> [tmlib.js](http://phi-jp.github.io/tmlib.js/)

今回はこれを使用して、Flappy Birdを作成します。
簡単なゲームに必要であるだろう機能はとりあえず揃っているので、ドキュメントのサンプルをいじりながら作って行きます。

※tmlib.jsの情報はgoogle先生に聞くと、いろいろと出てくるのですがバージョンの違い等で動かないケースが多々ありますので、お気をつけください。それもまとめろよ！っていうのは次回以降に持ち越しで...


# 実際に作ったアプリ
今回はクローンアプリと言う事で本家と全く同じモノを作るのではなく、
ちょっとアレンジしています！

**※登場するキャラクターは実在の人物に基づいています。**


### そして作ったのがこれ、　ゲーム画面はこんな感じ
![ゲーム画面](https://qiita-image-store.s3.amazonaws.com/0/56030/56121c05-0194-ce12-91e5-448b42249ddc.png)

### ロード画面はこんな感じ
![ロード画面](https://qiita-image-store.s3.amazonaws.com/0/56030/97ca852e-f0c1-6a2c-6462-52e17b3c8860.png)
このロード画面をカスタマイズするのに手こずりました...

# 公開、ソース
~~まだ[Firefox Marketplace](https://marketplace.firefox.com/?lang=ja)には申請を出しておらず、~~
→　申請したら通ってしまいました！https://marketplace.firefox.com/app/flappy?src=new

現状はKDDIが提供している[Creator Showcase](http://showcase.kddi.com/csc/)でのみ公開しております。
（[こちら](http://showcase.kddi.com/csc/works/view/70)からダウンロード、インストール出来ます！！

ソースもGithubに公開しています。[リポジトリ](https://github.com/TakahikoYoshii/Flappy)


* ツッコミ、ご意見、感想などなどありましたら、コメントにお願い致します。
adbコマンドを使ってマルチバイトテキストをスマホに送る方法

Androidにアプリを入れたり、接続デバイス確認したり、何かとadbコマンドを利用していますが、「input text」で日本語が送れない問題にぶち当たりました・・・


```rb:adb
adb shell            # 端末にログインして
input text aiueo     # 送信OK
input text あいうえお
Killed               # 瞬殺
```

クリップボード経由で日本語を送信するなど色々試したもののうまくいかず・・・
やっと見つけました。

### ☆☆☆ ADBKeyBoard ☆☆☆
（https://github.com/senzhk/ADBKeyBoard）

imeアプリになっていて、imeを「ADBKeyBoard」に切り替えてから利用します。

まず、上記のgithubからapkをダウンロードして、インストールしてください。
（https://github.com/senzhk/ADBKeyBoard/blob/master/bin/ADBKeyBoard.apk）

```rb:adb
adb install -r ADBKeyBoard.apk
```

一気にテキストを送信してみます

```rb:adb
adb shell

# IMEをADBKeyBoardに切り替えます
ime set com.android.adbkeyboard/.AdbIME
# 日本語送信
am broadcast -a ADB_INPUT_TEXT --es msg 'あいうえお' 
# githubにも記載されてますが、keyeventのコードも実行できます
am broadcast -a ADB_INPUT_CODE --ei code 67
```

正直、エンジニアでも必要性がない人多数だと思いますが・・・
私としては大発見！！
iOS7.0.xのSafariでif文の条件式が正しく判定されないバグ

# はじめに
検証は2014年8末頃に行いましたが、私の手元にはもうiOS7.0.xの端末が無いのでもう追加検証することはできません。

(何故検証した時に投稿していないのかというと、そこ頃は私がQiitaをやっていなかった、それだけの理由です。)

iOS7.0.3とiOS7.0.4で確認しました。iOS7.1では直ってます。


# このバグについて

iOS7.0.xで、『**if文の条件式内の論理値と論理積を含む条件式との比較が正しく判定されないバグ**』があります。

何を言っているか分からないと思うので、検証コードをご覧ください。

```js
if (false !== (null && 'hoge')) {
    alert('success');
} else {
    alert('error'); // iOS7.0.4だとelse文が実行される
}
```

この条件式は、```(null && 'hoge')```は```null```なので、```false```との厳密等価比較結果は偽です。なのでelse分には入りませんね。しかし、**iOS7.0.xはelse文に入ります。嘘でしょ？ と思いますよね。でも本当なんです**。

``null`` や ``'hoge'`` のように値を書いたせいで分かりにくくなっているかもしれませんが、変数でも同じです。例えば、引数指定無しなら何もしないけど、引数にfalseが明示的に指定されているかつ何かのフラグがfalseならチョメチョメするみたいな場合にこの地雷パターンのコードが出てくると思います。

# 回避方法

この地雷パターンですが、**if文の条件式でないなら何も問題ないです**。

**if文の条件式に、論理値と論理積を含む条件式**を書かなければよいだけです。

以下のように回避できます。

```js
var val = null && 'hoge';
if(false !== val){
} else {
  // iOS7.0.xでもここには入らない。
}
```

このようにして**if文の外で問題となる条件式を評価する**ようにすれば簡単に地雷回避できます。



# 簡単に回避できるならよかった…？

と、思いますよね。。。

しかし、Closure Compiler等を使って**ソースコードをminifyしている場合には簡単には回避できないでしょう**。

オリジナルコードで回避しても、minifyしたら値がif文の条件式に突っ込まれてしまうからです。さらに言えば、

**元々この地雷パターンで書いていなくてもminifyしたら地雷パターンを踏んでしまう。**
↓
**minifyするまで気づかない！**

ということもあります。むしろこのパターンが一番多いと思います。

(そもそもiOS7.0.xで検証してなくて気づかないパターンが一番多いと思いますが。。)

minify後のコードがこの地雷を踏まないようになんとかするしかありません。Closure Compilerは賢いのでちょっとやそっとオリジナルを変えただけでminify結果はなかなか変わりません。

フラグを適当なオブジェクトに持たせるとかすれば、if文条件式に突っ込まれるようなことは無くなると思いますが、そんな意味のない無駄な処理は書きたくないですよね。どうしてもダメならそうするとして、minify結果が変わるまで色々試行錯誤してコードを変えてみるのが最善かなと思います。

# 最後に
このバグについての情報が探しても見つからなすぎるので、ここで自分で調べたことを纏めさせていただきましたが、他にこの問題を調べた人(気づいた人)っているんですかね…。

もしそういう人を見つけた方はコメント等で教えて下されば幸いです。
Angularでのtype="hidden"ではng-valueをつかう。

```
<div ng-app="">
    <div ng-controller="Ctrl">
        <input type="hidden" ng-value="foo" />
    </div>
</div>
```

参考
[http://stackoverflow.com/questions/18446359/angularjs-does-not-send-hidden-field-value](http://stackoverflow.com/questions/18446359/angularjs-does-not-send-hidden-field-value)
MySQL派がOracle11g(+ODP.NET)を触ってみた感想

現行の最新は 12c なので、内容は古いかもしれないです。

# 環境を準備するのがめんどくさい
Oracle初心者がまず陥る罠。
実行環境、開発環境ともに準備するのが非常にめんどくさい。

開発環境を構築する為には、Oracle Client をインストールし、場合によっては TNSの設定も必要になる。
ネットの情報だけでは分かりにくいので、バージョンにあった入門本を購入したほうがよい。
あと、**Oracle Client アンインストールは茨の道。**なかなかきれいに消えてくれない。

なお、MySQLで開発環境を構築する場合、DLLを入れておけば完了。

# バージョンに厳しい(ODP.NET)
**Oracle Client と、DLLのバージョンが違うと全く動作しない。**
その割には、結構バージョンが細かかったりする。

# ツール
色々ツールは出ているのだけど、Oracle社の提供している**Oracle Sql Developer**が個人的にはよいと思う。
実行計画(Explain)を確認しながらのSQLチューニング作業の場合、こういったツールは必須。

phpMyAdmin 的なものもあるのだけど、あまり一般的ではないかも。
phpOraAdmin
http://sourceforge.net/projects/phporaadmin/

# Edition
Standard One、Standard、Enterprise など幾つかのEditionがある。
Editionによっては使えない機能があるので注意が必要。

ただ、パラレルクエリー（SQLの実行を並列化する）ぐらいは Standard とかでも利用できたらいいのに、と思う。

# SQLのチューニングについて
MySQLに比較してかなり複雑なSQLを記述できる。
ただ一方その複雑さ故に、パフォーマンス向上の為のSQLチューニングに結構な時間を割くことになる。

Oracle はあるタイミング（例えば大幅にデータが追加になった場合）で統計情報をとり、また、SQLの実行計画は統計情報に依存する。
つまり、**SQLが変わらなくても実行計画は変わる可能性はある。**
MySQLの場合、データ量などによって変わることはないので、それに比べると、賢いといえば賢い。
ただ、統計情報依存の為、**適切なデータ量を元にしないSQLチューニングは意味がない。**
DBであれば当然の話かもしれないが、Oracleの場合、その傾向がより強い。

# テーブルのID自動連番
DBによってバラバラだけど、
Oracleはsequenceチーム、MySQLは自動連番チーム。

# フィールド変更について(ALTER TABLE)
MySQLと違い、**`ALTER TABLE` で途中にフィールドを追加、ということができない。**
Oracle運用環境で、フィールド末尾に後から追加されたっぽいフィールドがあることが多いのはそのせい。

# 外部結合
その昔は `LEFT JOIN` とかがなくて、代わりに`(+)`というOracle独自の記法を利用していたようです。
標準SQLではないので、割とスルーしてます。

# WITH句を利用した再帰SQL
まず、MySQLにはWITH句がない。
他のDBと比較しても、これはちょっと奇妙なことではあると思う。

mysql “with” clause
http://stackoverflow.com/questions/324935/mysql-with-clause

**OracleにはWITH句があり、Oracle11gは再帰SQLとしてそれを利用できる。**

```SQL
-- HOGE.ID=10以下のツリー一覧を取得するサンプル
WITH T(ID) AS (
SELECT ID FROM HOGE WHERE ID=10
UNION ALL
SELECT HOGE.ID FROM HOGE WHERE HOGE.PARENT_ID=T.ID
)
SELECT T.ID FROM T;
```

# fetchについて(ODP.NET)
厳密に調べたわけではないので、これは本当に感想。

MySQLと比較して、fetchなどデータ読取速度が少し遅いかもしれない。
というか、`SELECT * FROM HOGE` とかフィールド数を意識しないで書くと、速度に影響を与えるケースが多い。
パフォーマンスを考慮するなら、他のDBでもあまり変わらないのだろうけど、Oracleの場合、BLOBを使う機会が多いので**（通常の文字列型フィールドは2000文字ぐらいまでしか扱えない）**、尚更そうなのかもしれない。

# パーティション分割
Oracle は１テーブルを複数のパーティションに分割することができる。
で、抽出対象が複数パーティションにまたがっている場合、インデックスがあっても読取速度が落ちる。
なお、データ条件によるパーティション振分けもできるので、パフォーマンス要アップ時はそういうことも考慮したりするらしい。

# プロシージャ
Oracleのプロシージャは相当強力なんだけど、MySQL派からすると**「それアプリケーション側でやればいいんじゃね？」**的な感じで全く出番がない。
検証作業が大変そうだし、ORMが活用されることが多いので、今後ますます出番が減る予感。
まるっと`ROLLBACK`できるのは素敵なんだけどね。

# ネットの情報
 ~~当然なのかもしれないが、MySQLと比較して、ネットの情報が少ない~~  
それから、**「それぐらいの知識しかないならOracle触らないでください」という説教じみた回答に出くわす機会が多い気がする。**

なので、拙い感想ながらも、投稿してみることにしました。
ActiveRecordMigrationのMySQLのTypeの対応表

Migrationで指定するときの`limit`がMySQLのどの`Type`に対応しているか知りたい

# デフォルト

![rails_abstract_mysql_adapter_rb_at_49618d6f31d453d3cbed8ed2bea6ca491412c272_·_rails_rails.png](https://qiita-image-store.s3.amazonaws.com/0/2432/148cae3f-e4ca-925d-de56-0cf61bbae267.png)

[ソースコード](https://github.com/rails/rails/blob/49618d6f31d453d3cbed8ed2bea6ca491412c272/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb#L206-L218)

# 対応表

![rails_abstract_mysql_adapter_rb_at_49618d6f31d453d3cbed8ed2bea6ca491412c272_·_rails_rails.png](https://qiita-image-store.s3.amazonaws.com/562/2432/46d5a584-23bf-615d-f944-63667e6b76c3.png)

[ソースコード](https://github.com/rails/rails/blob/49618d6f31d453d3cbed8ed2bea6ca491412c272/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb#L637-L666)

# MySQL

![MySQL____MySQL_5_1_リファレンスマニュアル__オンラインヘルプ_____6_2_数値型.png](https://qiita-image-store.s3.amazonaws.com/562/2432/e4f532cb-6c4d-090f-612c-e28464218e3a.png)
[MySQL 5.1 リファレンスマニュアル 数値型](http://mysql.stu.edu.tw/doc/refman/5.1-olh/ja/numeric-types.html)
Linux実行コマンド記録

実際に使用したコマンドを記録する

### 特定の文字列を含むファイルを検索して文字を置き換える

```
$ grep -lr -P "x+" * | xargs sed -b -i~ -r -e 's/(x+)/\1000/g'
```
grep の -P は Perl 正規表現指定
sed  の -b は、Cygwin で CR+LF が LF に変換されないようにバイナリモードで開くように指定。
sed  の -r は、拡張正規表現指定
sed  の 後方参照は 1桁だけ。対象文字列が "xxx" だと "xxx000" になる。

### 日付ごとのディレクトリにファイルを移動する

以下のようなファイルがあるとする。

xxx-20160301.bin
xxx-20160302.bin
xxx-20160303.bin
xxx-20160304.bin

これらのファイルをファイル名に含まれる日付をディレクトリ名としたディレクトリを作成して、そこへ移動したい。

```
$ for d in $(\ls -1 xxx-2016* | sed -e "s/^xxx-\([0-9]*\)\.bin$/\1/g" | sort | uniq); do \
  [ -d $d ] || mkdir $d; \
  mv xxx-$d.bin $d; \
done
```
一応、ワンライナー。
参考：[どのUNIXコマンドでも使える正規表現 - Qiita](http://qiita.com/richmikan@github/items/b6fb641e5b2b9af3522e)
sed は、"+"が使えなかったのか。カーリブラケット{}にはエスケープ必要と。
以下の変形でもいいかも

```
$ for d in $(\ls -1 *.bin | sed -e 's/\(.*\)\([0-9]\{8\}\)\(.*\)/\2/g' | sort ); do echo $d; done
```

### .git 以外で20日以内に修正したファイルを検索する

```
find . -not -path "*/.git/*" -a -mtime -20
```
JavaScriptにおけるビット演算と剰余の速度比較

[jsbn](http://www-cs-students.stanford.edu/~tjw/jsbn/)というJavaScriptの暗号用多倍長整数演算ライブラリをHaxeへ移植するという作業をしている関係で多倍長整数演算ライブラリについて調べていると、JavaScriptは他のプログラム言語に比べて多倍長整数演算ライブラリの実装がこの世にたくさん存在するということが明かになった。例えば次のようなものがある。

- http://silentmatt.com/biginteger/
- http://blog.livedoor.jp/dankogai/archives/51516961.html
- https://github.com/peterolson/BigInteger.js/tree/master

多倍長整数演算は内部で配列を使って、一要素を一桁として大きな数を表現するのが一般的だが、問題は一桁をどれだけの大きさにするか、つまり _基数_ をいくつにするかが重要である。既にスタンダードが存在すると考えていたが、どうも実装によって色々な基数が存在するということがあきらかになった。それも、2の補数ではない10の$n$乗といった数を基数にしている実装もあった。
しかし、$10^n$乗を基数にして多倍長整数演算を実装すると、剰余を使った計算が必要になる。$2^n$を基数にした場合はビット演算で済む。僕みたいな素人の考えでは、どう考えても「剰余 _vs_ ビット演算」ではビット演算が勝つと考えてしまうが、もしかしたらもしかするかもしれないので、とりあえずは検証してみることにした。ただし全てのビット演算を試すのは面倒だったので、ここではビットシフトを代表として使うことにした。

# 検証環境

## ハードウェア

<dl>
  <dt>CPU</dt>
  <dd>Intel Core i7 2.7GHz</dd>
  <dt>メモリ</dt>
  <dd>8GB</dd>
  <dt>OS</dt>
  <dd>Mac OS X Yosemite</dd>
</dl>

## ブラウザのバージョン

|  Firefox  |    Chrome    |  Safari  |
|:---------:|:------------:|:--------:|
|  36.0.1   | 41.0.2272.76 |  8.0.3   |

# 実験内容

次のようなコードでベンチマークをとった。（参考：[http://d.hatena.ne.jp/mindcat/20091119/1258651717](http://d.hatena.ne.jp/mindcat/20091119/1258651717)）

```js
function perf_test1(val) {
	var cnt = 1000000000;
	var tm1 = (new Date).getTime();
	while (cnt-- > 0) {
		val % 10
	}
	var tm2 = (new Date).getTime();
	console.log("modulo time=" + (tm2 - tm1));
}

function perf_test2(val) {
	var cnt = 1000000000;
	var tm1 = (new Date).getTime();
	while (cnt-- > 0) {
		1 << val;
	}
	var tm2 = (new Date).getTime();
	console.log("bit-shift time=" + (tm2 - tm1));
}

perf_test1(10);
perf_test2(10);
```

# 結果

次のような結果になった。

|           |  Firefox  |    Chrome    |  Safari  |
|:---------:|:---------:|:------------:|:--------:|
| modulo    | 915       | 1340         | 9804     |
| bit-shift | 914       | 1343         | 7791     |

FirefoxとChromeでは差がほとんどなく、Safariではそれなりに差が出た。ただ冷静に考えてみたら、これは`%`に与える`val`が小さすぎた可能性があるとして、`val`を`2147483647`（特に意味はないが一応$2^{31} - 1$）にして再度実験した。ビットシフトの方はそのまま`val`に`10`を用いる。

|           |  Firefox  |    Chrome    |  Safari  |
|:---------:|:---------:|:------------:|:--------:|
| modulo    | 940       | 1355         | 9804     |
| bit-shift | 944       | 1372         | 7790     |

同じような結果となった。

# 考察

JavaScriptは数値をDoubleで持っているが、ビット演算は32bit整数で表現されている。ということは、ビット演算するたびに暗黙的にDoubleで保持していた数値を何かの関数で32bit整数へと変換している。その関数は[ECMAScript262](http://www.ecma-international.org/ecma-262/5.1/#sec-9.5)で定義されていて、要約すると次のようになる。

1. ゼロに近い整数へまとめる（`floor`）
2. $2^{32}$との **剰余** をとる

つまり、ビット演算を行うと中で自動的に剰余が行われているので、たいしてパフォーマンスに差がでなかったのではないかと思う。ビットシフト以外の他のビット演算についても恐らく同じと思われる。
そうすると、どうしてSafariでは速度に差が生じたのか謎。

# 結論

結局この実験だけでは、多倍長整数演算ライブラリの基数に$10^n$か$2^n$かどちらがよいのかを直ちに結論付けることはできなかった。
ただ、MacのSafariではビット演算（今回の実験で試したのはビットシフトだけだが）の方が剰余よりも早い可能性があるので、今すぐパフォーマンスが欲しい場合は$2^n$を基数にした実装を選ぶべきかもしれない。（微妙）
Heroku で ransack による日付一致検索

# 概要
gem 'ransack' で検索機能を追加。
日付一致検索に関しては、エラーが起きていたので、ransacker で日付用のメソッドを作成。

`Ruby 2.1.5`
`Rails 4.2.0`
`ransack 1.6.3`

## 編集すべきファイル
* `config/initializers/ransack.rb`  を作成し、日付に変換して比較するメソッド追加

```ruby:config/initializers/ransack.rb
Ransack.configure do |config|
  config.add_predicate 'date_equals',
  arel_predicate: 'eq',
  formatter: proc { |v| v.to_date },
  formatter: proc { |v| v.present? },
  type: :string
end
```

* 日付検索を追加したい `model` へ `ransacker` を追加

``` ruby:app/model/purchase.rb
private 
  ransacker :order_date do
    Arel.sql('date(order_date)')
  end
```

* 日付検索を追加したい `view` `app/purchases/search.html.erb` へ先ほど作ったメソッドを追加

``` erb:app/views/purchases/search.html.erb
<label>注文日</label>
<%= f.search_field :order_date_date_equals, class: 'date' %>
```

* `controller` の ストロングパラメーターに追加

```ruby:app/controller/purchase_controller.rb
class PurchaseController < ApplicationController
  private
  def search_params
    search_conditions = %i(
      order_date_date_equals
    )
    params.require(:q).permit(search_conditions)
  end
end
```

## 参考にしたサイト
* Using Ransackers  (2番を参考)
https://github.com/activerecord-hackery/ransack/wiki/Using-Ransackers

* ransackerを使ってRansackの検索を拡張する
http://qiita.com/ishidam/items/3002f9d6f71424a8aafb


## 背景

ローカルのSQLite3では、問題なく動いていたのに、
herokuに上げたら、以下のエラーで止まってしまった。

postgresql用に、`date`型を指定して`eq`で比較する。

`heroku logs`

```
app[web.1]: Parameters: {"utf8"=>"✓", "q"=>{"order_date_cont"=>"2015-03-02"}}
app[web.1]: Purchase Load (4.9ms)  SELECT DISTINCT "purchases".* FROM "purchases" WHERE ("purchases"."order_date" ILIKE '%2015-03-02%')  ORDER BY "purchases"."order_date" DESC
app[web.1]: PG::UndefinedFunction: ERROR:  operator does not exist: date ~~* unknown
app[web.1]: LINE 1: ... FROM "purchases" WHERE ("purchases"."order_date" ILIKE '%20...
app[web.1]:                                                              ^
app[web.1]: HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
app[web.1]: SELECT DISTINCT "purchases".* FROM "purchases" WHERE ("purchases"."order_date" ILIKE '%2015-03-02%')  ORDER BY "purchases"."order_date" DESC
app[web.1]: Rendered shared/_search_result_box.html.erb(6.9ms)
app[web.1]: Completed 500 Internal Server Error in 69ms
```
confluence > 情報をexpand/collapseしたい > 展開マクロを使う

詳細な情報に関して、必要な時だけ表示したい。
そういう場合は「展開マクロ」を使う。

    {展開
でEnterを入力すると展開マクロがページに入るので、展開した時だけ表示したい情報をマクロの中に記載する。

マクロ挿入時に日本語変換を使うのが面倒な時は

    {exp
でEnter入力でもよい。


展開マクロはネストができる。展開マクロの中に展開マクロを入れたり、展開マクロの中にコードマクロを入れたりといった使い方ができる。
codecademyのテキストエディターに似ているテキストエディター

# 目的

インデントの位置とか、文字色とか、codecademyのテキストエディターは使いやすいので、それと似たようなテキストエディターをローカル環境でも使いたい。

# 問題

[sublimetextが良いらしい](http://www.codecademy.com/forum_questions/5164c8dff12beaac5d000985)ので使ってみたら…
カーソルの位置にでかい「あ」が表示されて非常に邪魔！

# 対策

[GoogleIMEの補助機能らしい](http://blog.livedoor.jp/fs00r612/archives/51955818.html)ので、該当箇所の有効化を外した。

# 感想

入門者はこういうところで躓いて、ドロップアウトしていくんだろうな…
Vagrant 導入〜CakePHP導入までメモ


- MacでUbuntu14.04の仮装ホストでCakePHPを動作させるまでのメモです
- 作業メモなので必要最低限の事しか書いてません

## VirtualBox 導入

- [VirtualBox](https://www.virtualbox.org/wiki/Downloads) からVirtualBox X.X.XX for OS X hosts らへんをDLし、適当にインストール

## Vagrant 導入

- [Vagrant](https://www.vagrantup.com/downloads.html) からMAC OS X らへんをDLし、適当にインストール
- [Vagrantbox.es](http://www.vagrantbox.es/)に色々なBoxがあるので、今回はUbuntu 14.04 with Docker enabledを試す

```bash
$ vagrant box add ubuntu1404 https://github.com/jose-lpa/packer-ubuntu_14.04/releases/download/v2.0/ubuntu-14.04.box
```
- DL後、`vagrant box list` で、ubuntu1404 (virtualbox, 0)というような出力を確認
- 以下設定ファイルの作成

```bash
$ mkdir -p ~/vagrant/ubuntu1404
$ cd ~/vagrant/ubuntu1404
$ vagrant init ubuntu1404
```

- 以下の'#'を除去して保存

```config:~/vagrant/ubuntu1404/Vagrantfile
# config.vm.network "private_network", ip: "192.168.33.10"
```

- ここまでで、 `vagrant up` で起動、 `vagrant ssh` でログインできるようになる
- SSHログイン後、とりあえずaptのアップデートをする

```bash
$ sudo apt-get update && sudo apt-get upgrade
```

## プラグイン導入
```bash
vagrant plugin install vagrant-vbguest
```

## CakePHP設定
[Qiita:CakePHP 2.x系初期設定手順メモ](http://qiita.com/kazamai/items/89c084ab2608ba166bcf)参照

### Vagrant用の追加設定

#### リンク設定

```bash
sudo ln -s /vagrant/cakephp /var/www/html/
```

- 最後の確認は http://192.168.33.10/cakephp/ にアクセス

## パッケージング

- 他に必要なパッケージを入れておく（完全に自分メモ...）

```bash
$ sudo apt-get install libjcode-pm-perl unzip imagemagick
```

### Boxを作成

- `exit` でリモートから抜け、以下を実行

```bash
$ vagrant package --output cakephp.box
```

- これで新規にサーバを作成する際、以下のように指定できます

```bash
$ vagrant box add cakephp cakephp.box
```

- 並行稼働させる場合はVagrantfile内のIPを変更してください

お疲れさまでした。

## 追記：スクリプトとコマンド一覧

１ヶ月くらい経ったら操作方法完全に忘れてました。

### Box追加スクリプト

上記説明のスクリプト版。

```bash
#!/bin/bash

# Last modified: 2015/04/02 11:10:23
# Author: Kou Kazamai

if [ $# -ne 2 ]; then
		echo "Usage: $0 name box"
		exit 2
fi

vagrant box add $1 $2
mkdir -p $1
cd $1
vagrant init $1
```

### コマンド一覧
上記説明文から見つけるのが面倒。

`vagrant up` -- 起動
`vagrant ssh` -- SSHログイン
`vagrant box list` -- Box一覧表示
Unity5でOculus


Oculusの開発案件がきたので、実装に向けて細かい部分をメモします。

##Oculus SDKの導入

###インポート
まずは、本家のサイトよりSDKをダウンロード

Oculus
https://developer.oculus.com/downloads/#sdk

このZipファイルの中にSDKのパッケージが入っているので、対象のプロジェクトにインポートしましょう。
通常のパッケージのインポートと同じです。

##コードエラー
Unity5.0.0にインストールした際に、```OVRMainMenu.cs```の247行目と966行目にエラーが発生しました。SDKのバージョンはOculus SDK 0.4.4となります。

このエラーは、```RenderMode```クラスの```RenderMode.World```が存在しないことによるエラーとなります。
まだUnity5がβ版の時のSDKですので、リリースに向けて変更された内容になります。

こちら正しくは```c.renderMode = RenderMode.WorldSpace;```と修正すると良いでしょう。
念のため、リファレンスも残しておきます。

**RenderMode**
http://docs.unity3d.com/ScriptReference/RenderMode.html

**RenderMode.WorldSpace**
http://docs.unity3d.com/ScriptReference/RenderMode.WorldSpace.html

各247行目と966行目は以下のように修正しましょう。

```OVRMainMenu.cs
#if UNITY_5_0
		// TODO: Unity 5.0b11 has an older version of the new GUI being developed in Unity 4.6.
	   	// Remove this once Unity 5 has a more recent merge of Unity 4.6.
		c.renderMode = RenderMode.WorldSpace;

#else
```
特定のLocaleを削除したり、C/POSIXだけにする方法

とある検証用に、localeをASCIIだけにして、テストせよと指示されたのですが、追加する方法はよくあっても消す方法は意外と少なくてはまったので記載してみます。

なお、Ubuntu 14.10 のみ検証しています。

# 1.とりあえずlocale purge

```
$ sudo apt-get install localepurge
```
まずこれで不要なロケールが削除されるとあったので試してみましたが、変わった気配なし。

```
$ locale -a
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
POSIX
```

# 2.特定のLocaleを指定してpurge
```
$ sudo locale-gen --purge en_US.iso88591 && echo 'Success!'
$ locale -a
C
POSIX
en_US
en_US.iso88591
```

減った！！
でもまだなんか残ってる...。

# 3.いろいろ消したり変えてみたり。

```
$ sudo mv /usr/lib/locale/locale-archive /tmp/
$ sudo mv /var/lib/locales/supported.d/en /tmp/
$ sudo cp -p /etc/default/locale /etc/default/locale.org
$ sudo vi /etc/default/locale
LANG="C"
$ sudo locale-gen --purge                     
Generating locales...
  en_US.UTF-8... done
Generation complete.
```

なぜUTF-8...

# 4.もしかしてバックアップファイルみてる？

```
$ sudo mv /etc/default/locale.org /tmp/
$ sudo locale-gen --purge
Generating locales...
Generation complete.
$ locale -a
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
C
POSIX
```

BINGO!

あとはエラーに対応して

```
$ export LANG=C
$ export LC_ALL=$LANG
$ locale -a
C
POSIX
```

完成！

参考:
http://askubuntu.com/questions/58191/how-can-i-uninstall-a-locale-via-command-line
http://serverfault.com/questions/604846/locale-gen-with-purge-does-not-work
テーブルにあるデータのINSERT文を作成する

SQL ManagementStudio使用

1. データベースを右クリックし、メニューから[タスク]-[スクリプトの生成(E)...]
2. データベース全体または特定テーブルのいずれかを選択して次へ
3. 詳細選択をクリックして、スクリプトを作成するデータの種類を「データのみ」に変更する
4. 確認画面で次へを押すと出力開始

> [テーブルに保存されているデータを使って SQL の INSERT 文を生成する簡単な方法(SQL Server 限定)](http://tnakamura.hatenablog.com/entry/20100915/sql_server_management_studio_generate_script)
Gitでcommitとpull時にindex.lockのエラー


windows環境でcommitを行おうとした際に下記エラーでcommitやpullできないとの報告があり調査。

```エラー内容
fatal: Unable to create 'C:/path/to/.git/index.lock': File exists.

If no other git process is currently running, this probably means a
git process crashed in this repository earlier. Make sure no other git
process is running and remove the file manually to continue.
```

エラー主さんで、```.git/index.lock``` のファイルが存在しているため削除をしたみたいだが、また ```index.lock``` が復活してしまうとのこと。

確かに、いろいろ調べてみると、 ```.git/index.lock``` の削除で対応できそうな感じだけど、うまくいかない。

どうやら、```.git/.COMMIT_EDITMSG.swp``` の削除で解決した人がいるらしいが、エラー主さんに確認してもらったところ、ファイルがない。
```.git/COMMIT_EDITMSG```ファイルが存在するので、それを削除してもらったら解決した。

結果、 ```.git/index.lock``` と ```.git/COMMIT_EDITMSG``` のファイル削除で解消。

***
参考サイト
* [困った＆困っていること](http://milkyway.sci.kagoshima-u.ac.jp/groups/git/wiki/15e21/)
* [git commit したときにfatal: could not open '.git/COMMIT_EDITMSG': Permission denied が出た場合](http://qiita.com/trsqxyz/items/fefb2fb92d008c351db9)
既存のAndroidStudioプロジェクトにCrashlyticsを導入

## SDKダウンロード

[Crashlytics公式](https://fabric.io/downloads)からAndroidStudioのプラグインをダウンロードしてきます

## インストール

AndroidStudioを開き、上部メニューの

```
AndroidStudio -> Preferences -> Pllugins -> Install plugin from disk...
```

を選択し、先ほどDLしたSDKのzipファイルを指定

## プロジェクトに導入

インストールが終わると、ツールバーにCrashlyticsのアイコンが表示されます
ので、

```
アイコンクリック -> プロジェクト指定 -> ビルドして実行
```

をして完了

## Answerを有効化

無事アプリを登録出来たら、FabricのDashboardを開きます
Answersのタブを開くと、有効化するかどうかを聞くダイアログが表示されますのでOK選択後、
アプリを起動し直します

WebページのほうでSuccessとなればOK


## CIにBetaを設定

バイナリのBeta Testing用に

```
crashlyticsUploadDistributionDebug
crashlyticsUploadDistributionRelease
```

というgradleタスクが追加されているので、ローカルやCI上などで

```
./gradlew crashlyticsUploadDistributionDebug
```

とでも呼び出してあげれば、簡単にテスターに公開ができます

## 感想

iOSに比べて簡単でした

BetaTestingでガンガンドッグフーディングしつつ、アプリをimproveさせていくのはとても大事なことだと思っていて、
この導入の簡単さは有り難いところです
The following build commands failed:Write auxiliary files CompileC...エラーへの対処

複数人でのCordovaでのアプリ開発にて、実際に起きたエラー。

Aさんがメインで開発したソースをバージョン管理システムにコミットし、
Bさんが、そのソースを落としてきてビルドしたら、以下のエラーが吐かれた。。。

開発がほぼ完了していた時だったので、メンバー騒然?!

```
The following build commands failed:
	Write auxiliary files
	CompileC
/your/app/path/platforms/ios/CordovaLib/build/CordovaLib.build/Debug-iphonesimulator/CordovaLib.build/Objects-normal/i386/NSDictionary+Extensions.o
Classes/NSDictionary+Extensions.m normal i386 objective-c
com.apple.compilers.llvm.clang.1_0.compiler
	CompileC
/your/app/path/platforms/ios/CordovaLib/build/CordovaLib.build/Debug-iphonesimulator/CordovaLib.build/Objects-normal/i386/CDVInvokedUrlCommand.o
Classes/CDVInvokedUrlCommand.m normal i386 objective-c
com.apple.compilers.llvm.clang.1_0.compiler
(3 failures)
Error:
/your/app/path/platforms/ios/cordova/build:
Command failed with exit code 65
    at ChildProcess.whenDone
(/usr/local/lib/node_modules/cordova/node_modules/cordova-lib/src/cordova/superspawn.js:135:23)
    at ChildProcess.emit (events.js:98:17)
    at maybeClose (child_process.js:756:16)
    at Process.ChildProcess._handle.onexit (child_process.js:823:5)
```	

で、結論から言うと、iosのCordova platformを入れ直すしかないみたい。

```
$ cordova platform remove ios
$ cordova platform add ios
```

で、ここで注意点!!

上記のように、iosのCordova pluginを入れ直したら、自分たちで準備して配置していたiosのアイコン用画像とスプラッシュ用画像が、デフォルトの画像になっちゃいます。

なので、くれぐれも、iosのアイコン用画像とスプラッシュ用画像は、バックアップを取っておくようにしてください。
BrowserSyncが2.0になって設定画面ができてた



デフォルトでは`port:3001`にアクセスすると、設定画面が開くようになった

![貼り付けた画像_2015_03_06_13_33.jpg](https://qiita-image-store.s3.amazonaws.com/0/2631/e3e96832-b62a-3bb4-73c3-eb4c62ed4f59.jpeg "貼り付けた画像_2015_03_06_13_33.jpg")

# とりあえず、動画を見ればなんとなくわかる

公式の紹介動画を見よう (30秒すぎくらいから)
http://www.browsersync.io/


# できること一覧


## 設定変更
* スクロール、クリックとかの同期の設定

なので、他人に見せるときに、ページやスクロールが同期のストップが簡単にできる。

## リモートデバッグ系

* Remote Debugできるようになった (weiereってやつ。Adobe Edge Inspectでも使われてるやつ)
* CSSのアウトライン表示
* レイテンシ設定

## 同期のやりなおしとか

* いま、どのページを表示するかの決定
* 表示したページの履歴もある
* 目立たないけど **右上にReload AllとかScroll Topとかのボタンもある**


# くわしくはドキュメントとかchangelogとかを見ると最新を追えるので、死ぬほどヒマで息をする以外にやることがないときに見よう！

* [browser-sync/CHANGELOG.md at master · BrowserSync/browser-sync](https://github.com/BrowserSync/browser-sync/blob/master/CHANGELOG.md)
* [BrowserSync options](http://goo.gl/OBlNNe)
* [BrowserSync 2.0 - JH](http://www.wearejh.com/news/browsersync-2-0/)
Pythonの単体テスト


##doctestモジュールを利用して単体テストを行う

以下のように書くと各ファイル単位で単体テストができる(本番はスキップされる)

```test.py
#!-*- coding:utf-8 -*-
def double(x):
    """ 与えられた数の3倍を返す関数
		ここからの内容を単体テストする
     
    >>> double(3)
    9
    
	基本的に自由にコメントを付けていい">>>"とその次の行のみ認識される

    >>> double(10)
    30
     
    >>> double(8)
    24
     
    """
    return x * 3
 
if __name__ == "__main__":
    import doctest
    doctest.testmod()
```

-vオプションをつけて実行すれば単体テストをすることができる。
(-vをつけないと正常終了だとなにも返ってこない)

```shell
python test.py -v
```


```実行結果
Trying:
    double(3)
Expecting:
    9
ok
Trying:
    double(10)
Expecting:
    30
ok
Trying:
    double(8)
Expecting:
    24
ok
1 items had no tests:
    __main__
1 items passed all tests:
   3 tests in __main__.double
3 tests in 2 items.
3 passed and 0 failed.
Test passed.
```

##解説

`if __name__ == "__main__":` はスクリプトとして実行された時のみ
動作する。(`import test.py`されたときはスキップされる)

doctestモジュールは、テストコードとその結果をコメントとして書くことで
自動的にテストを行ってくれる。(どういうチェックをしたかコメントとして残るので便利)
「`bind_listen': socket=/tmp/unicorn.sock specified but it is not a socket! (ArgumentError)」への対処

NginxとUnicorn連携の情報って、Web上に溢れてる。
けど、シンプルな構成、入門的な内容って、少ない気がする。。。



Unicornを起動するシェルスクリプトを作って、「起動っ！オリャっ！」ってやったら、失敗。
以下のエラーが吐かれた。。。

```
`bind_listen': socket=/tmp/unicorn.sock specified but it is not a socket! (ArgumentError)
```

で、ちょっと詰まったので、メモ。  

結論から言うと、unicorn.sockファイルを、一旦消せばOK。

同じエラーにハマった方は、是非参考にしてみてください。
[翻訳]Amazon CloudSearchに2つの新機能("domain metrics"と"index field statistics")が追加されました

本記事は[Amazon CloudSearch launches domain performance metrics through Amazon CloudWatch and index field statistics](https://aws.amazon.com/jp/about-aws/whats-new/2015/03/amazon-cloudsearch-launches-domain-performance-metrics-through-amazon-cloudwatch-and-support-for-index-field-statistics/)の翻訳です。

なお、本投稿は私が個人的に訳したものであり所属する企業や団体における公式見解ならびに公式発表ではございません。
****

Amazon CloudSearchに "domain metrics" と "index field statistics" という、2つの新機能が追加されました。

domain metricsは、スケーリングの決定、トラブルシューティング、そして、あなたのクラスタをよりよく管理するのにご活用いただけます。Amazon CloudSearchは下記の4つのメトリクスを公開します。
・SuccessfulRequests: 正常に処理された検索リクエスト数
・SearchableDocuments: 検索INDEXの中で検索可能なドキュメントの数
・IndexUtilization: 検索インスタンスにおけるストレージの使用率
・PartitionCount: 検索INDEXが保持されているパーティションの数
本日から、Amazon CloudSearchを利用可能な全てのリージョンにおいて、追加コストをお支払い頂くこと無く、これらのメトリクスを取得することができます。但し、CloudWatchを用いてメトリクスのアラームをセットする場合は、CloudWatchの標準の利用料金がかかります。
domain metricsの詳細に関しては *Amazon CloudSearch Developer Guide*の
[Monitoring an Amazon CloudSearch Domain with Amazon CloudWatch](http://docs.aws.amazon.com/cloudsearch/latest/developerguide/cloudwatch-monitoring.html)をご覧ください。

上記に加えて、検索結果と共にfield statisticsを取得することが出来るようになりました。field statisticsをご利用いただくことで、チャート作成や分析をpost-processing無しに行うことが出来ます。こちらは、Apache SolrのStats componentと同等の機能を持ちます。Field statisticsはfacet可能なnumericなフィールドでのみ利用可能です。取得出来る統計は、count, min, max, mean, missing, stddev, sum, そして sumOfSquares になります。
index field statisticsの詳細に関しても*Amazon CloudSearch Developer Guide*の[Getting Statistics for Numeric Fields in Amazon CloudSearch](http://docs.aws.amazon.com/cloudsearch/latest/developerguide/retrieving-stats.html)をご覧ください。

Amazon CloudSearchはフルマネージドなサービスで、簡単に、セットアップ、管理、スケールが可能な検索ソリューションをあなたのWebサイトやアプリケーションにお届けします。
これからAmazon CloudSearchをはじめる方は、AWS Management Consoleからご利用ください。[30日間の無料トライアル](https://console.aws.amazon.com/cloudsearch/home)が適用されます。リリースされた機能についてより深く知りたい方は、[Amazon CloudSearch Developer Guide](http://docs.aws.amazon.com/cloudsearch/latest/developerguide/what-is-cloudsearch.html)をご覧ください。是非、追加された機能に関しまして、[CloudSearch forum](https://forums.aws.amazon.com/forum.jspa?forumID=137)でご意見をシェアしてください。私たちは皆さまからのフィードバックに感謝するとともに、今後のリリース計画を立てる際のプライオリティ付けの参考にさせていただきます。
Go by examples: Methods



(この記事は [Go by Example: Method](https://gobyexample.com/methods) を翻訳したものです。)

Goは構造体にメソッドを定義することができます。

```go
package main

import "fmt"

type rect struct {
    width, height int
}


// このarea メソッドは*rect型のレシーバを持っています。
func (r *rect) area() int {
    return r.width * r.height
}

// メソッドはポインタ、値のレシーバの両方の型で定義することができます。この例は値のレシーバです。
func (r rect) perim() int {
    return 2*r.width + 2*r.height
}

func main() {
    r := rect{width: 10, height: 5}

	// 構造体のために定義した2つのメソッドは呼びます。
    fmt.Println("area: ", r.area())
    fmt.Println("perim:", r.perim())

	// Goは自動的にメソッドを呼ぶために値とポインタの変換をします。ポインタレシーバはメソッドを呼ぶ際にコピーを防ぐため、もしくは受け取った構造体を変更するためのメソッドとして使えます。
    rp := &r
    fmt.Println("area: ", rp.area())
    fmt.Println("perim:", rp.perim())
}
```


```
$ go run methods.go 
area:  50
perim: 30
area:  50
perim: 30
```
zabbix agent起動時にactive checkエラーがでる

server、agentを同じ機器上で動かして、情報収集をしようとしたところ、
アイコンZのstatusが赤色のまま、、、

ログをみると

 ```/var/log/zabbix/zabbix_agentd.log
6587:20150306:121443.451 no active checks on server [127.0.0.1:10051]: host [zabbix-server] not found
6587:20150306:121643.493 no active checks on server [127.0.0.1:10051]: host [zabbix-server] not found
```

active checkが失敗している。



関係のありそうなパラメータを確認してみる

```zabbix_server.conf
ListenPort=10051
ListenIP=127.0.0.1
```

```zabbix_agentd.conf
 Server=127.0.0.1
 ListenPort=10050
 ListenIP=0.0.0.0
 ServerActive=127.0.0.1:10051
 Hostname=zabbix-server
```

特に問題なさげ。


/etc/hostsも確認

```
$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 zabbix-server
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
```

```
# ping zabbix-server
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.013 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.037 ms
```

通信もできており、問題なし。

ZabbixのWebUIで登録したホスト情報が”Zabbix Server"となっており、
これをhostsnameの”zabbix-server”に合わせたところ、
正常にデータがとれるようになりました。

WEB-UI側の設定とリンクさせる必要があるんだなというメモです。
テキストマイニングの正規化

MacOSはコンソールコマンドが揃っているので、テキストの前処理も出来るだけコマンドラインで済ませてしまった方が楽です。

# 全角文字、半角文字、大文字小文字等の吸収

phpコマンドを1Linerで使うのが手っ取り早い。

```

# 全角英数字を半角英数字に統一
$ cat /path/to/file | php -R 'echo mb_convert_kana($argn, 'a', "UTF-8" ), "\n";'

# 小文字を大文字に統一
$ cat /path/to/file | php -R 'echo mb_strtoupper( $argn, "UTF-8" ) , "\n";'

# 上記を一気に
$ cat /path/to/file | php -R 'echo mb_strtoupper( mb_convert_kana( $argn, "a", "UTF-8"), "UTF-8" ), "\n";'

```


# 単語の置換

sed の -f オプションを使うと辞書ファイルのように使い回しができて便利。

置換する単語のリストを適当な名前(sed.command)で作成する。

```
s/hogehoge/Foo/g
s/moo/woo/g
```

sedコマンドで上記を実行

```
$ sed -f sed.command /path/to/original 
```

# 空行の削除

grepを使う

```
$ grep -v '^\s*$' /path/to/file
```

sedを使う

```
$  sed -e 's/^$//g' /path/to/file
```

# 上記を1linerで実行

sed.command に ```s/^$//g```を追加しておく


```
$ cat /path/to/file | php -R 'echo mb_strtoupper( mb_convert_kana( $argn, "a", "UTF-8"), "UTF-8" ), "\n";' | sed -f sed.command >/path/to/new_file
```
VirtualBox上のLinux系ゲストOSで動かしているChrome 41でマウスイベントがおかしくなったときの対処方

# 結論

VirtualBoxのマウス統合を無効にする．後は不具合が修正されるのを待つ．．．

# なんかおかしいぞ？

昨日（2015-03-05）からマウスの動きが怪しい．．．

* タブがドラッグできない
* メニューの上にポインタがのっかっても背景色が変わらない
* うーん，mousemoveイベントが起きないな．．．

という現象が．以下，確認したこと．

* VirtualBox 3.22.24でも3.22.22でも発生する
* ゲストOSがUbuntu 14.04でもXubuntu 14.04でもLubuntu 14.04でも発生する
* ゲストOSがCentOS 7でも発生する
* ホストOS Windows 7では発生しない
* ホストOS x86版Xubuntu 14.04上のx86版Chromeでは発生しない

# どうやら不具合みたいだ

情報源は[こちら](https://code.google.com/p/chromium/issues/detail?id=463928&q=os%3Alinux%20mouse&colspec=ID%20Pri%20M%20Week%20ReleaseBlock%20Cr%20Status%20Owner%20Summary%20OS%20Modified)．

コメントにあるように，VirtualBoxのマウス統合を無効にしたら，動作するようになった．
RubyistがPHPをいじって困ったこと

# RubyistがPHPをいじって困ったこと
 エンジニアとして活動を始めたのが2年半前。関わったサービスがRuby on RailsでWEBメディアを開発していたので、ずっとRuby, JavaScriptと向き合ってきました。
 そんな僕が会社を移って、PHPを触らなければならなくなった時に、困ったことをあげてみます。ただの意見なので、「へぇ、そういう考えもあるんだ」程度で読み流してください。

## 思想がない！
　Rubyはオブジェクト指向型言語として確固たる地位を気づいています。特にRailsがオブジェクト指向で書くことを強制するので、Railsで書いたことがある人は、「どっちでも同じなんだけど、こっちの方が正しいよね」ということが議論できる環境がありました。
　一方でPHPはというと、思想がない！つまり、「どっちでもできるから、どっちでもいいんじゃない？」となる。結果、ソースに一貫性がなくなって読みにくいという状態を生んでいました。
　試しにやってみる場合はいいけど、長期的に運用するならルールはあったほうがいいですね。

## 関数が分かりにくい

### 1. `isset`は`!empty`ではない
　PHPの存在確認、空値確認の~関数=言語構造として、`isset`、`empty`があるのですが、`isset`は`!empty`と同じではないということ。
　~~Ruby~~ Railsでは`present?`は`!blank?`と等しかったので、分かりやすかった。（半角スペースがblank判定されたり、いい感じにしすぎな感じもありますが）
 > [PHPでの空値の扱い～issetとemptyを比較する](http://d.hatena.ne.jp/tatakauashi/20080529/1212030859)

### 2. `try`メソッドがない
~~Ruby~~ Railsの便利メソッド`try`に相当する関数がない。毎回、三項演算子などで評価しないといけない。面倒くさい。

## 逆に「PHPすごい」と思ったこと

### 1. ライブラリの対応が早い
　人数が多いので、Google APIのClient Libraryに始まり、ライブラリの対応が早い。（PHPはβ版、Rubyはα版）

### 2. 「まぁいっか」って気分になる
　Rubyだと「オブジェクト指向ってこうだ！」とか「関数型vsオブジェクト指向」的な思想論争に時間を取られることもあった。
　しかし、PHPはそもそも思想もそんなにないから、「まぁいっか」ってなる。そんなに大きなシステムをいじらないなら、そっちの方がいいかもしれない。


***
　結局、どの言語使うかを考えなきゃいけないサービスなんて世の中に一握りしかないので、「何で書いても大差ないよねー」と思った。
　ただ、エンジニアになりたての人が触るなら、Rubyの方が軸を持って学べるからいいと思う。読みやすいし。
Eclipse4.4がMacで起動できなかったメモ

Eclipseサイトから、*eclipse-php-luna-SR2-macosx-cocoa-x86_64.tar.gz*　をダウンロード。
ダブルクリック(「The Unarchiver」)で解凍して、*eclipse.app*を開こうとすると、

> アプリケーション"eclipse.app"を開けません。

というメッセージが出てきて、起動しなかった。
`tar`コマンドで解凍しなおすと開いた。

前にもこういうことあった気がする。
`tar` と 「The Unarchiver」 で何かが違うのだろうな、きっと。
「.plistファイル」とは何か？（ざっくり）

ざっくり一行で言うと・・・
**「.plistは、Apple系のxmlみたいなファイル」**

##plistは、property list（プロパティリスト）の略
.plistファイルは主にApple系のソフトウェアが発祥のようです。
Cocos2d-xではAndroidでも使うことがありますが、パースには「NSPropertyListSerializationクラス」が（本来は）必要です。NSの略つまりNeXTSTEP＝スティーブ

ちなみに、NeXTについてのエピソード記事がありました
世界のOSたち - 1990年代にコンピューターの未来を生み出した「NeXTSTEP」
http://news.mynavi.jp/articles/2012/06/28/nextstep/

##.plistの実体
![スクリーンショット 2015-03-06 11.31.28.png](https://qiita-image-store.s3.amazonaws.com/0/57193/71a53c1e-7a5f-26d0-5b74-9403b726d8a5.png)

Xcodeで.plistファイルを見ると、こんなふうに整っているのでイメージしにくいのですが、テキストエディタで開いてみると以下のように。

![スクリーンショット 2015-03-06 11.30.16.png](https://qiita-image-store.s3.amazonaws.com/0/57193/997a59e5-b0ff-e187-a592-aca834960943.png)

実体としてのplistファイルはxmlやjsonのように< >や{ } などで括られた文字列の羅列です。まさにプロパティーのリストです。
まぁ、xmlみたいなものですね。というか冒頭でxml宣言してます。
ちなみに昔はxml形式じゃなかったっぽいです。（これ以上深くはまだ知りません。。）

##Cocos2d-xの場合
Cocos2d-xでは.plistを再生したりします。.plistを再生する？何か特別なファイルなのかな？と思っていたんですがそうではありませんでした。
Cocostudioのファイルや、パーティクルデザイナーで吐き出されるエフェクトにもplistファイルがあります。でもplistの実体はxmlのような羅列なので何か動画ファイルのようなものがあるのではありません。
実際は、**plistにたくさんの値をセットしてOpenGLのエンジンに働きかけてるイメージ**のようです。

##.plistの深い話
ITmediaの「Undocumented Mac OS X」という連載にもっと深い話がありました。
原理的に深い話なので読みにくいかもしれませんが、時間がある時に読んでみる価値はあるかも。
第3回　plist（プロパティリスト）とFoundation【前編】 (1/4)
http://www.itmedia.co.jp/enterprise/articles/0705/14/news013.html
"ええやんボタン"使ってる人が気をつけたほうがいいこと

Facebookの言語設定を関西弁にしている人気をつけたほうがいいかも！

Webサイト用に[いいねボタン](https://developers.facebook.com/docs/plugins/like-button)の埋め込みタグを作成するとき、
普段あまりなにも考えずにコピペしていたのですが

```lang:html
<script>
(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/ja_KS/sdk.js#xfbml=1&appId=1572492349641086&version=v2.0";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
</script>
```

Facebookの言語設定を関西弁にしていると、タグの言語も関西弁になってしまうらしく
そのまま貼ると誰がそのサイトを見ても、"ええやん"と表示されてしまいます。


コード中の`ja_KS`を`ja_JP`にしてあげると標準の日本語にもどります！
XBML、iframeも同様に変えてあげればOKでした。

狙って関西弁にしたいとき以外はちゃんともどしてあげたほうが良さそうですね。
ちゃんとした言語として扱われてるんだなー・・・


(いちいち変えるのめんどくさいので日本語に戻しました)
制御文字をパスワードに含めて ZIPファイルを作る

Ubuntu 14.04.1 LTS x86_64

■概要
アーカイブ時に暗号化する際、bash 様の助けを借りて
キーボードからは入力できない文字をパスワードにすれば
辞書攻撃が効かないZIPファイルを作ることができる。
（※総当りされちゃうとどうしようもないんだけどねー）

■詳細
<a href="http://www.docokanotep.sakura.ne.jp/ascii/index.html">ASCIIコード表を見る。</a>


我々がキーボードから入力できるのは
0x20(Space)　から　0x7E(~) までである。そのため、
0x01(SCH) から 0x1F(US) および 0x7F(DEL) を含んだパスワードにしてしまえば
総当りしか効かない面倒な ZIPファイルが完成する。
（NULL文字 0x00 は使えません）
（訂正：改行コード 0x0D(CR), 0x0A(LF) がありましたね）

■コマンド例
パスワードを 0x01(SOH) 0x02(STX) 0x03(ETX) の3文字に設定
※コマンド履歴が残ることに注意！

	$ zip -P $'\x01'$'\x02'$'\x03' -o testfile.txt.zip testfile.txt
	  adding: testfile.txt (stored 0%)
	$ rm testfile.txt
	$ unzip -P $'\x01'$'\x02'$'\x03' testfile.txt.zip
	Archive:  testfile.txt.zip
	 extracting: testfile.txt

■注意点
アルファベットと記号などの
表示可能文字と混ぜて使いましょうね。
（約128文字 * ）

■注意点その2
root ユーザのパスワードにも使えますが
コンピュータが起動と同時に sshd が起動しなくなった場合、
とても悲惨なことになるのでおすすめしません・・・。
Rでデータフレームからデータを抽出(検索)

```
都道府県	国語A	国語B	算数A	算数B
北海道	71.8	52.9	75.8	55.2
青森県	76.6	60.5	81.3	60.8
岩手県	73.7	58.3	78.9	58.7
宮城県	74.2	54.3	77.3	56.8
秋田県	77.4	67.3	85.1	66.2
山形県	74.3	56.7	77.8	57.7
福島県	73.3	57.0	78.7	57.8
茨城県	76.9	57.4	79.7	58.6
栃木県	71.9	54.5	77.7	56.8
群馬県	73.6	55.5	78.0	57.8
埼玉県	72.5	55.5	76.9	57.8
千葉県	75.8	55.5	78.2	58.8
東京都	75.5	57.2	79.4	61.2
```
というCSVファイルを読み込んで、answer というオブジェクトにセットされているとき。
(一番上の ```都道府県    国語A 国語B 算数A 算数B``` は、Header として扱われている)

# 行番号と列番号を指定して抽出

```
> # 1行目、3列目のデータ(52.9)を抽出
> answer[1,3]
[1] 52.9
```

# 行番号で抽出

## 行番号が一致するデータを抽出

```
> # 3行目を抽出
> answer[3,]
  都道府県 国語A 国語B 算数A 算数B
3   岩手県  73.7  58.3  78.9  58.7
```


## 行番号が一致する範囲のデータを抽出

```
> # 3~5行目を抽出
> answer[3:5,]
  都道府県 国語A 国語B 算数A 算数B
3   岩手県  73.7  58.3  78.9  58.7
4   宮城県  74.2  54.3  77.3  56.8
5   秋田県  77.4  67.3  85.1  66.2
```


# 列番号で抽出

## 列番号が一致するデータを抽出

```
> #3列目を抽出
> answer[,3]
 [1] 52.9 60.5 58.3 54.3 67.3 56.7 57.0 57.4 54.5 55.5 55.5 55.5 57.2
```


## 列番号が一致する範囲のデータを抽出

```
> #3列目~4列目を抽出
> answer[,3:4]
   国語B 算数A
1   52.9  75.8
2   60.5  81.3
3   58.3  78.9
4   54.3  77.3
5   67.3  85.1
6   56.7  77.8
7   57.0  78.7
8   57.4  79.7
9   54.5  77.7
10  55.5  78.0
11  55.5  76.9
12  55.5  78.2
13  57.2  79.4
```

# Headerをキーに、比較演算子がマッチするデータを抽出

## 文字列一致

```
> # Header[都道府県]が岩手県の行を抽出
> answer[answer$都道府県=="岩手県",]
  都道府県 国語A 国語B 算数A 算数B
3   岩手県  73.7  58.3  78.9  58.7

```
## 数値の比較

```
> # Header[算数B]の値が60以上の行を抽出

> answer[answer$算数B>60, ]
   都道府県 国語A 国語B 算数A 算数B
2    青森県  76.6  60.5  81.3  60.8
5    秋田県  77.4  67.3  85.1  66.2
13   東京都  75.5  57.2  79.4  61.2
```

- データフレームの変数とHeaderの区切りは$記号を使う
- [都道府県]や[数学B]はHeaderなのでクオートの必要はない
- 文字列比較の場合は、比較演算子として == を使う
- 数値比較の場合は、比較演算子として < や > を使う
- "岩手県"は文字列なので、ダブルクオートでくくる
- 行を抽出するので最後に[,]が必要

# 複数の条件によるマッチ

比較演算を[ & ]記号で繋げる

```
#国語Aが75以上で、算数Bが55以下
> answer[ answer$国語A > 75 & answer$算数B < 55, ]
```

# ソートして表示する

```
> # [算数A]の列の値で昇順にソートする
> answer[ order( answer$算数A ), ]
   都道府県 国語A 国語B 算数A 算数B
1    北海道  71.8  52.9  75.8  55.2
11   埼玉県  72.5  55.5  76.9  57.8
4    宮城県  74.2  54.3  77.3  56.8
9    栃木県  71.9  54.5  77.7  56.8
6    山形県  74.3  56.7  77.8  57.7
10   群馬県  73.6  55.5  78.0  57.8
12   千葉県  75.8  55.5  78.2  58.8
7    福島県  73.3  57.0  78.7  57.8
3    岩手県  73.7  58.3  78.9  58.7
13   東京都  75.5  57.2  79.4  61.2
8    茨城県  76.9  57.4  79.7  58.6
2    青森県  76.6  60.5  81.3  60.8
5    秋田県  77.4  67.3  85.1  66.2

> # [算数A]の列の値で降順にソートする
> answer[ order( -answer$算数A ), ]
   都道府県 国語A 国語B 算数A 算数B
5    秋田県  77.4  67.3  85.1  66.2
2    青森県  76.6  60.5  81.3  60.8
8    茨城県  76.9  57.4  79.7  58.6
13   東京都  75.5  57.2  79.4  61.2
3    岩手県  73.7  58.3  78.9  58.7
7    福島県  73.3  57.0  78.7  57.8
12   千葉県  75.8  55.5  78.2  58.8
10   群馬県  73.6  55.5  78.0  57.8
6    山形県  74.3  56.7  77.8  57.7
9    栃木県  71.9  54.5  77.7  56.8
4    宮城県  74.2  54.3  77.3  56.8
11   埼玉県  72.5  55.5  76.9  57.8
1    北海道  71.8  52.9  75.8  55.2
```
コマンドプロンプトのデフォルトドライブを変更したい

# 目的

4年前に自作したWindowsパソコンは、SSDとHDDのハイブリッドだ。
OSは、SSDにインストールしていて、その他プログラムはHDDにインストールしている。
SSDが(C:)で、HDDが(D:)だ。
基本的な作業はDドライブでしたい。

# 環境

OS:Windows 7

# 問題

なのに、コマンドプロンプトを立ち上げるとCドライブを指定される。

# 対策

デスクトップにコマンドプロンプトのショートカットを作成する。
ショートカットを右クリックしてプロパティを開く、作業フォルダをDドライブに変更する。

# 感想

コマンドプロンプトの設定からなんとかできるようにならんのか？
プログラミングの勉強方法

# 目的

プログラミングを勉強したい。

# 問題(1)

同僚に気が付かれる。（気が付かれたくない）

# 対策(1)

本を使わずに、ブラウザだけで完結できる[codecademy](http://www.codecademy.com/)を使う。

# 問題(2)

codecademyは日本語に対応していない。

# 対策(2)

やむを得ないので英語も勉強する。
教材として、[Duolingo](https://ja.duolingo.com/)を使う。

# 感想

移動中にスマホで2chまとめとか見るのやめて、スマホアプリのDuolingoで勉強してる。
Duolingoで学ぶコツは、出題に対して考えすぎずに、直感で回答すること。それを繰り返す。
codecademyとDuolingoを同時進行で進めるのは割りといい感じ。
Apache2.4の中間CA証明書のインストールのメモ

自分用メモ

`SSLCertificateFile`で証明書をまとめて指定できると思い込んでいたけど、`SSLCACertificateFile`で中間証明書を指定したらFirefoxとかで`sec_error_unknown_issuer`とか怒られなくなった
OSX Mavericks/Yosemite の環境変数設定

Yosemite 以降、 `~/.MacOSX/environment.plist` や `/etc/launchd.conf` が動かないようなので、 `launchctl` 経由で設定する。 (Mavericks でも動作する。逆に Yosemite では動作確認できてないけど、動くんじゃないかとか。)

具体的には以下で示す plist ファイルをシステムに登録し、環境変数を設定するスクリプトを呼び出す。

このスクリプトは他のユーザーから書き込まれるとセキュリティ上宜しくないので、 `chmod 0700` などで書き込めないようにしておくと良いと思う。

# 手順

以降の plist ファイルとスクリプトが存在する前提とする。

(ただし、 `launchctl` コマンドは screen/tmux などの中では動かないので注意。)

以下のコマンド実行すると、 **次回ログイン時から、** ユーザーの環境変数が設定される。

```
$ launchctl load ~/Library/LaunchAgents/my.environment.plist
```

## `~/Library/LaunchAgents/my.environment.plist`

スクリプトまではフルパスでないと動かない。

```plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>my.environment</string>
	<key>Program</key>
	<string>/Users/tomo/.local/libexec/set_my_env</string>
	<key>RunAtLoad</key>
	<true/>
</dict>
</plist>
```

## `~/.local/libexec/set_my_env`

```sh
#! /bin/sh
/bin/launchctl setenv FOO BAR
```

# 参照

- [Yosemiteアップデートでlaunchdが死亡した - retlet.net](http://retlet.net/log/2014/10/yosemite-launchd.html)
Rのxtableで列の位置をすべてセンタリングしてtexに出力

大した話ではないけど、よく忘れるのでメモ。
テーブルをtexに出力する関数を作成しておくと後で便利なので、ある程度汎用的に使えるものを作成。
xtableで作成したテーブルの列数を数えて、その分、"c"をalignに追加する。
pasteではうまくいかない。

```R:temp.r
tbl_pdfout <- function(x,y,z){
	 n <- ncol(x)
	 nalign <- paste0("l", paste0(rep("c",n),collapse=""), collapse="")
	 xtbl <- xtable(x, align=nalign, caption=y)
	 print(xtbl, floating.environment='sidewaystable', file=z)
	 return(x)
}
```