OmniAICreator/Qiita-1.07M huggingface dataset:
ド素人なC#erがTableAdapterで作るWHERE句を動的に書き変えられないお話。

お仕事的なもので開発をやってて、現在進行形で詰まってるお話。

TableAdapterを使ってDBにアクセスして、もらってきた情報をDataGridViewに突っ込む。
`SELECT カラム, カラム, カラム
　FROM テーブル`
という構成でデザイナからメソッドを作っておけば、とりあえず全件表示はできた。

問題はここから。
コントロールとして配置しているテキストボックスを利用して、表示する項目に条件をかけたい。
たとえば、各レコードのとあるカラムに「xxx」という文字が含まれているもののみ表示、とか。
入力される文字は様々だから、@～、と書いて引数としてテキストボックスの中身をもらってくる。
`WHERE (カラム LIKE '%' + @引数 + '%')`
と付け足せば問題はない。指定したい条件が増えても、ANDを使って後ろに書き足していけばいい。

…ように思ってたんだけど、どうやら想像通りの動きをしてくれない。
どうやらDBの一部カラムではNULLが許容されてて、絞り込むときにうまく絞り込んでくれない。

たとえば、DBのUserというテーブルにカラムが３つあって、それぞれ
`ID
Name
Address`
だとする。テキストボックスも３つ用意してあって、それぞれのカラムに条件を指定できるようにしたい。絞り込むときは部分一致で検索していくようにしたいので、TableAdapterで作るSQL文は、
```lang:DataSetAdapter内、クエリの追加→構成
SELECT ID, Name, Address
  FROM User
  WHERE (ID LIKE '%' + @ID + '%')
    AND (Name LIKE '%' + @Name + '%')
    AND (Address LIKE '%' + @Address + '%')
```
→
としておき、
`FillBySearch`
という名前でメソッドにしておく。
プログラムの方から、
```lang:Form1.cs
// ボタンクリックイベント内
this.tableAdapter.FillBySearch(this.dataSet.dataTable, this.textBox_ID.Text, this.textBox_Name.Text, this.textBox_Address.Text);
```
と書いて呼び出す。

こうすると、入力されている項目に対しては部分一致で絞り込みをかけることができ、
入力がなければワイルドカードで絞り込みを行うので、結果的には絞り込みせずに表示を行える。

ところが、AddressカラムにはNullが許容されており、しかもわけのわからないことに全レコードのAddressカラムの値がNullなのだ。
これでは入力なしで絞り込んでも、一致をしなかったせいで全レコードが表示されなくなってしまう。大問題だ。

某所で助言を求めたところ、結局はテキストボックスに入力があるかどうかをif文で判定し、入力がある場合にその項目で検索を行う、というものがあった。
確かに思いつきはしたが、結局それだとプログラムの方から動的にWHERE句を弄る必要が出てくる。
```lang:Form1.cs
// ボタンクリックイベント内
if (textBox_ID.Text != string.Empty)
　// WHERE句にIDで絞り込む記述を追加
if (textBox_Name.Text != string.Empty)
　// WHERE句にNameで絞り込む記述を追加
if (textBox_Address.Text != string.Empty)
　// WHERE句にAddressで絞り込む記述を追加
```

ここまでは思いつくのだが、結局のところ上記のコメントの部分に相当する処理が全くわからない。
自分なりにいろいろ調べてはみたが、具体的な方法は分からずじまい。
なるべくファイルの追加等は避けたいので、ここで数時間ほど手が止まっている状態。

細かく具体的に手解きしてくださる方はいらっしゃいませんか…？



→解決。詳細はコメントにて。
ありがとうございました。
Android Studio でお手軽パッケージ名変更

# 目的
 
Debug 版と Release 版の両方欲しい

# `applicationIdSuffix ` を使え

コメント欄からご教授頂きました

```
buildTypes {
    debug {
        applicationIdSuffix ".debug"
    }
}
```

# 追記：バージョン番号で判別を

アプリを分けるとどっちがどっちなのかわからなくなるので、アプリ内でバージョン番号を表示しているのであれば、バージョン番号も変更しておくとアプリが Debug か Release かの区別がつきやすくなる.

```
buildTypes {
    debug {
        applicationIdSuffix ".debug"
        versionNameSuffix = "d"
    }
}
```

# `packageNameSuffix` は古いらしいです

 
## Deprecated
  
### 手順
 
元のパッケージ名が "com.hoge.fuga.piyo" なら
 
```
android {
    defaultConfig {
        applicationId "com.hoge.fuga.piyo.debug"
    }
}
```

# 余談
 
ワシのアプリは百八式まであるぞ
 
楽天のアプリをホーム画面に並べると似たような光景になりそうですね
CakePHPのキャッシュファイルのパーミッションエラーの対処法


CakePHPで以下のようなエラーが出るときがある。


## 問題


```
Warning: SplFileInfo::openFile(/www/app/tmp/cache/persistent/cake_core_cake_console_) [splfileinfo.openfile]: failed to open stream: Permission denied in /www/lib/Cake/Cache/Engine/FileEngine.php
```

このエラーは、キャッシュファイルのパーミッションの設定によって、ファイル所有者とアクセスユーザーが異なるために発生する。


## 解決方法

umaskを設定することで解決する。

### umaskとは
ファイルを作成するときにデフォルトで使用するパーミッション設定の事。


### キャッシュファイルの設定を更新

core.phpにのキャッシュの設定に以下の記述を追加する。

```
'mask' => 0666
```


```php:app/Config/core.php
Cache::config('_cake_core_', array(
    'engine' => $engine,
    'prefix' => $prefix . 'cake_core_',
    'path' => CACHE . 'persistent' . DS,
    'serialize' => ($engine === 'File'),
    'duration' => $duration,
    'mask' => 0666,
));
Cache::config('_cake_model_', array(
    'engine' => $engine,
    'prefix' => $prefix . 'cake_model_',
    'path' => CACHE . 'models' . DS,
    'serialize' => ($engine === 'File'),
    'duration' => $duration,
    'mask' => 0666,
));
```


これでエラーは出なくなるはず！
PHPで、簡単にログをファイルに出力する方法

# 概要
色々書くのが、面倒なので簡単な方法を調べました。

# ソース

```php
<?php
error_log(print_r($h, true)."\n", 3, 'c:/tmp/aaa.log');
```

# 参考
http://unoh.github.io/2007/05/10/php-logging-to-text-files.html
http://jp.php.net/manual/ja/function.error-log.php
Railsのテンプレート（ERB）での動的処理とコメント


#テンプレートでの動的処理について

Railsのテンプレートでの動的処理とコメントについてのまとめ。（とても初歩）

###<%= %>と<% %>の違い


<% 任意のコード %>
　　ここのコードは評価されるだけで結果をテンプレートに返さない。
　　重荷演算や制御構文の記述に利用。

<%= なんらかの値を返す式 %>
　　式の評価結果をテンプレートに挿入。

```erb
<div><% price = 1000
result = price * 1.05 %></div>
<div>￥<%= result %></div>
```

この結果は以下になる。

```html
<div></div>
<div>￥1050.0</div>
```

#コメントについて

###1. 処理でのコメント

ハイフンつきで閉じる<%= -%>、<% -%>と後方の空白やスペースを除去できる。
デザインの厳密性がある時などに必要。

###2. #によるコメント

<%# … %>
こちらはすべてコメント。
「%」と「#」の間に空白を挟んではいけない。

「#」単体でもコメントになりえる。

```erb
<% msg = '表示用' # 以後はコメント %>
```

###3.条件式によるコメント

条件分岐処理を利用したコメント
<% if false %> … <% end %>

```erb
<% if false %>
<% msg = '無視される' %>
<%=  '無視される' %>
<% end %>
```
デバッグ時に特定の機能やレイアウトを一時的に無効にしたい場合に利用。
ただ、コメントアウトとしてみにくい。

###4.begin endによるコメント

<% =begin %> … <% =end %>でのコメント

```erb
<%
=begin
%>
<% msg = '無視される' %>
<%=  '無視される' %>
<%
=end
%>
```

「=begin」と「=end」は行頭に記述しなければいけない。

**以下のように書くとエラー。**

```erb
<% =begin %>
<% msg = '無視される' %>
<%=  '無視される' %>
<% =end %>
```

###5.HTMLによるコメント

<!-- … -->
HTMLの標準的名コメントだが、ユーザのソースに見えてしまう。

```html
<!-- <div>展開式が表示される</div> -->
```
"Deploy to Heroku" Buttonで環境変数を設定する/させる

Heroku Buttonでデプロイするときに、環境変数を設定してイニシャライズしたい場合ありますね。

```json:app.json
{
  /* 続きから */
  "env": {
    "URL": "https://github.com/teki/tou",
    "SECRET_TOKEN": {
      "description": "A secret key.",
      "generator": "secret"
    },
    "CONCURRENCY": {
      "description": "The number of processes to run.",
      "value": "5"
    }
  }
}
```

* 直接値を指定する
* "description"で説明をつける
* "generator": "secret"でランダムな文字列を自動生成できる
* "value"で初期値を設定できる
* "required"で必須設定（デフォルトでon）

Heroku Buttonを押すとこういう感じ

![スクリーンショット 2015-02-24 13.53.39.png](https://qiita-image-store.s3.amazonaws.com/0/24784/c6a22887-b47d-8972-5227-beb83130d0a7.png)

### 参考記事

[app.json Schema | Heroku Dev Center](https://devcenter.heroku.com/articles/app-json-schema "app.json Schema | Heroku Dev Center")
軽い開発環境をつくりたい。

javascriptの開発環境の変遷はめまぐるしいですね。

業務でつかっているタスクランナーを使って個人開発や軽いプラグインを作ったりするとなにかと取り回しが悪かったりするので、

なるたけ軽く開発環境を構築して、終わったらさっと解体したい。
そう思って最近試行錯誤しています。

## ワンライナーウェブサーバー

ささっとWebサーバー建てられます。`&`を付けるとタスクがバックグラウンドになるので、
何個もTerminal立てる必要ないですね。

```zsh:php
$ php -S 0.0.0.0:8000 -t ./ &
```

```zsh:python
$ python -m SimpleHTTPServer 8000 &
```

```zsh:node
$ serve -p 8000 &
```

`grunt &`と併用すればいいかも。
止めたくなったら `fg` でフォアグラウンドにして`ctrl+c`で消すとか
`killall php`ってやればphpのタスク全部消せます。
`ps`で今動いてるタスクリストして `kill [番号]`すれば狙って消せます。

## shellで管理する。

グローバルにインストールされたプラグインを使えば、`npm install`する手間が省けます。

### CoffeeScript

```zsh
$ coffee -mwc coffee/*.coffee &
```

### Stylus

```bash

$ stylus -m -w *.styl &
```

その他でも同様にお願いします。
これを毎回やるのは面倒なので、shellscriptを作ります。

## ShellScriptを書く

フロントエンドな人には割と疎遠なshellscriptですが、
カンタンな物を書くだけなら誰でも出来て便利です

```bash:hoge.sh

# runserver
$ php -S 0.0.0.0:8000 -t ./ &
# coffeescritp
$ coffee -mwc coffee/*.coffee &
# stylus
$ stylus -w *.styl &

alias killproject='killall php coffee stylus'

```
こんな具合ですね。
実行は `sh`コマンドで。

```zsh
$ sh hoge.sh
```

## まとめ

もうちょい賢い方法を模索したいですが、最近はコレで気負いなく制作出来てます。

業務使いでも、画像圧縮したいだけなら、
`gulp-imagemin` を `npm install` してタスク登録してあれこれやるより、
`$ imagemin images/* dest`したほうが圧倒的に軽量ですね。

minifyもuglifyも同様だと思います。
pythonでOpenCVを使う一番簡単な方法

## pythonでOpenCVを使うには

#### Macの場合
Macであればnumpyがインストールされた状態で
1. HomebrewでOpenCVをインストール
2. OpenCV内にあるpythonパッケージにPYTHONPATHを通す or pythonのsite-packages以下にcv.pyとcv2.soのシンボリック・リンクを貼ってやる

という風になります。

#### Linuxの場合
Linuxであれば、yumで一発ダウンロード出来ません。したがって、
1. OpenCVをダウンロード
2. いろいろパスを指定した上でビルド
3. インストール

しかし、pyenvやvirtualenvなどを使っているとパスの指定がめんどくさい上に、バージョンを切り替えると使えなくなる可能性があります。実際、これで詰まってlinux上でpython&OpenCVの環境を使えていません。AWSでpython&OpenCVを使いたいので困りました。

* * *
いずれにせよ、
**面倒くさすぎる**


## 一番簡単で早い方法
pyenvでanacondaの環境を作成し、anacondaのコマンドでopencvをインストールする。

pyenvがすでにインストールされいるのであれば、

```
pyenv install anaconda-2.1.0
pyenv global anaconda-2.1.0
pyenv rehash
```

インストールが終わったら以下のコマンドを実行するだけ。簡単すぎてキレそうです。

```
conda install -c https://conda.binstar.org/jjhelmus opencv
```
RaspberryPiの事始め

# これは何？
* RaspberryPi を買ってきて、OSをインストールして、ごにょごにょできるまでのメモ
* モニタやマウスはつながずに、SSHでがんばる方針

# 環境
* RaspberryPi 2 Model B
* Windows 7（開発用マシン）
* （オプション）Raspberry Pi の カメラモジュール

# 準備
* MicroSD

# OSのイメージ・インストールと接続（所要時間30分、OSダウンロード時間含まず）

## 開発用マシンでの準備

1. 公式HPからOSのイメージをダウンロード。http://www.raspberrypi.org/downloads/
2. RASPBIAN をダウンロードする。Zipでダウンロードも回線が遅いせいですごく時間かかる。![]()
3. ダウンロードの時間の間に、SDカードに書き込む用のソフトウェア（[Win32 Disk Imager](http://sourceforge.net/projects/win32diskimager/)）をダウンロード＆インストールしておく。
4. OSイメージのダウンロード完了したら、Win32 Disk Imagerを使って書き込む。

## Raspberry Piでの準備
1. SDカードをボードにセットする。
2. LANをつないで、電源を入れる。（電源スイッチはないので、コネクタを刺すだけでOK）
3. しばらく待ち、LANのところが点灯し始めたら、たぶん無事起動できているはずなのでOK。

※　パソコンと1：1で接続するとうまくIPを認識できなかったので、ハブなりルータなりの下にぶら下げてあげると良さそう。

## 開発用マシンでの準備（その２）
Raspberry PiがDHCPによってIPをつかんでいるはず。今回はそれをどうにかして知らないとSSHができない。

1. xfinderを使ってIPを発見する。手順は、[ここ](http://openrtm.org/openrtm/ja/content/xfinder%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95)が詳しい
2. Putty等で分かったIPに対してアクセスする。
3. とりあえずUpadte。```sudo apt-get update```

```
user：pi
password：raspberry
```

ここまで来たら、``sudo apt-get vim``など好き放題自分の環境を構築できる。
普段使っているUbuntuのような感覚で使える。

# マシン名の変更等（いちいちIPアドレス探しをしない為に）（所要時間：5分）
1. ```sudo vi /etc/hostname``` で任意の名前に。例：myhost
2. ```sudo vi /etc/hosts```の ```127.0.0.1 raspberrypi```になっているところも、```raspberrypi```を上で設定した名前（例：myhost）に変えておく。]
3. ```sudo apt-get install avahi-daemon```
4. RaspberryPiのコンソールから、```ping myhost``` でpingが通ればOK
5. ```sudo reboot```で反映する
6. Bonjourをインストール（iTunesが入っていれば何もしない。詳細：http://openrtm.org/openrtm/ja/node/266）
7. windowsのコマンドから```ping myhost.local```でpingが通ればOK。
8. これで設定完了。ホスト名で検索可能になった。

※```sudo raspi-config```でも設定項目があって1．と2．はやってくれるっぽい。

# カメラモジュールをつなげて、ストリーミングしてみる（所要時間10分）
* Raspberry Pi の標準モジュールの場合（日本語の抄訳）： https://moomindani.wordpress.com/2014/05/20/raspberry-pi-camera/
* Raspberry Pi の標準モジュールの場合（英語原文と思われるブログ）： http://embeddedday.com/projects/raspberry-pi/a-step-further/install-motion-mmal/
* Webcamの場合：http://divide-et-impera.org/archives/1098

motion-mmal の場合、WindowsですとIE,Chromeが駄目だったので、FireFoxでアクセスすると良いです。

# SDカードの容量が2.9G以上だったら・・・（所要時間3分）
* 何も設定しないと2.9GB以上認識されないも模様なので、認識するように設定する。
* http://qiita.com/inokappa/items/0c9590b10b46cc8b2857

# Sambaの設定

とったカメラ画像なんかをちょっと覗くのに便利

```sudo apt-get install samba``` 

```:/etc/samba/smb.conf
[share]
# 共有ディレクトリのパス
path = /home/pi/samba
# 書き込み許可
writeable = yes
# ファイル作成時のファイルのパーミッション
force create mode = 0666
# ディレクトリ作成時のディレクトリのパーミッション
force directory mode = 0777
# ゲストユーザーを許可
guest ok = yes
# ゲストユーザーのみ接続可
guest only = yes
```

```sudo service samba restart```
```mkdir ~\samba```

# 参考サイト
* http://www.myu.ac.jp/~xkozima/lab/raspTutorial1.html
* http://openrtm.org/openrtm/ja/content/xfinder%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%95
* http://qiita.com/inokappa/items/b9a5a9957b9f5ca0bba7
* http://qiita.com/awakia/items/2b0bfec7cc8ab75281db
* http://qiita.com/muran001/items/14f34b735e0a6b4af98c
* http://qiita.com/inokappa/items/a0e2e48a1c517d401654
* http://mia-0032.hatenablog.jp/entry/2014/10/27/000000
vmware > ホストとゲスト間のコピーができない > isolation.tools.copy.disable = false

vmwareを使っている時に、ゲストのファイルをホストへ持っていこうとしてもゲストのウィンドウから外へ出ることができなかった。

.vmxファイルに以下の設定を追記すればよいとのこと。

    isolation.tools.copy.disable = false
    isolation.tools.paste.disable = false

[参考にしたページ](http://hana0916.blogspot.jp/2014/07/vmware-player-os.html)


<hr>

上記がダメな時

```
    isolation.tools.copy.disable = "FALSE"
    isolation.tools.paste.disable = "FALSE"
```

他の行の設定が"FALSE"になっていた。

### 追記
(追記 2018/10/22)

有効でない場合は、定義を最後に持ってくること。

- [vmware > ホストとゲスト間のコピーができない > vmxファイルの書き直し > isolation.tools.copy.disable = "FALSE"などをファイルの最終行に持っていく](https://qiita.com/7of9/items/7facd5aa07497b53a2ec)

自分は.vmxファイルのリンクを特定のフォルダにまとめておき、ゲストOS起動前に.vmxファイルを修正してから起動している、というのがここ数年のやり方。
Windows系OSをAWS上に建てるときのファイアウォールで嵌った。

AWS上で動かすアプリを作った際に１か所嵌った。タイトルの通りファイアウォール周りです。

セキュリティーグループの設定で、HTTP通信のためにポート80番を開ける設定をしていたのですが、通信が通らないといった状態に。

おかしいなーとセキュリティグループの設定を眺めていたところ１つの可能性に気が付きました。
もしかして**OS側のファイアウォールがポート閉じてるんじゃね？**と。。。

案の定OS側のポートを空けたら無事通信が通るようになりました。
めでたしめでたし。
`git push` でHetemlに公開


1. heteml管理画面で`ssh`アカウントを作成
2. 発行されたアカウント情報で`sshログイン`する
3. 適宜ディレクトリを移動して`site.git`など適当なレポジトリ格納用ディレクトリを作る
4. 上述のディレクトリ(`/site.git/`)に移動して`git init --bare`
5. `/site.git/hooks/`へ移動して`touch post-receive`
6. `vim post-receive`で以下記述

	```
	#!/bin/sh
	git --work-tree=/path/to/yoursite --git-dir=/path/to/yoursite/	site.git checkout -f

	```

7. この時`/path/to/yoursite`は`pwd`で調べたものを入れる(userとしてのルートからのパスは違う)
8. `chmod +x post-receive`で権限を変更
8. リモートレポジトリに`ssh://yourusername@ssh***.heteml.jp:2222/path/to/yoursite/site.git`を登録(***には1で発行したサーバー情報を入れる)


秘密鍵の登録とかその辺はやってないので逐次パスを聞かれて若干うるさい。
pepper開発にてsqliteでCRUDするときのデバッグ方法

[こちらの記事 ( Pepperアプリケーション開発　～データベースを利用してみよう～)](http://arit-clt.com/2015/01/08/pepper-pepper%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA%E3%80%80%EF%BD%9E%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E5%88%A9/)を参考にsqliteでの保存と取得をやってみようとしてハマった際のメモ

```
環境
mac osx 10.9.5
Choregraphe 2.1
```

Choregrapheでアプリケーションを作成して再生ボタンを押すと、以下のディレクトリに追加したdbファイル等が含まれるプロジェクトの内容が保持される。

* ローカルに接続している場合
`/Users/username/.local/share/PackageManager/apps/.lastUploadedChoregrapheBehavior/ `

* 実機に接続しているとき
`/home/nao/.local/share/PackageManager/apps/.lastUploadedChoregrapheBehavior/`


けれども、上記ディレクトリは再生ボタンを押す度に中身が書き変わってしまうので、 「dbに保存されたデータをselectして、なにがしかの処理をする」等の振る舞いを期待していると多分ハマってしまう。

デバッグしにくさは残るが、プロジェクトをロボットにインストールしてしまえば再生のたびにdbファイルが書き換わることはない。

dbファイルを確認したい時は sshで本体に接続して`/var/www/apps/`以下にインストールされたアプリのディレクトリがあるのでそこから。

Choregrapheのロボットアプリケーションのウィンドウの緑三角でインストールしたプロジェクトの再生ができる。

![](http://i.imgur.com/6ifGXLA.png)
PreloadJSで画像を読み込む

## PreloadJSとは
PreloadJSとは、外部ファイル（画像・音声・JSONなど）を読み込むライブラリ。

PreloadJSについての詳細はこの記事が分かりやすい。
[PreloadJSで「悩ませないローディング」の作り方](http://ics-web.jp/lab/archives/5239)

## PreloadJSで何ができるか
読み込み状況をイベントで監視して、読み込み率（0.0〜1.0）を取得することができる。
よって、ローディングアニメーションの作成などに利用される。

PreloadJSを使用して、画像の読み込み、DOMに反映までのプロセスをメモ。

## PreloadJSライブラリを読み込む
```html
<script src="https://code.createjs.com/preloadjs-0.6.0.min.js"></script>
```

## LoadQueueクラスのインスタンスを生成
```js
var preload = new createjs.LoadQueue();
```

## 読み込み結果をDOMに反映
イベントリスナーで画像ファイルを読み込み次第、handleFileComplete関数を実行。
body要素に読み込み結果を反映。

```js
preload.addEventListener('fileload', handleFileComplete);
preload.loadFile('circle01.png');

function handleFileComplete(event){
  $('body').append(event.result);
}
```
信じて送り出したコマンドライン信者がAdminerの使い勝手にドハマリしてQiitaエントリを書くなんて…

これまではデータベースいじりというと

> やれ、Accessだ、phpMyAdminだ、そんなもんはいらねえな
> データベースいじりはコマンドラインに飛び込んでやるもんよ。なあ？
(CV: 佐倉綾音）

というストロングスタイルを貫いていましたが、年齢を経るにしたがって色々面倒くさく思えることもあるのはまた事実でして

表からはほぼ見えない開発環境ぐらいはもうちょっとカジュアルに・・・ということになると今度はphp*Adminを使ってるDBごとに入れて個別にメンテをしなきゃいけなかったりとかえってややこしいことになるし・・・ということでまあ惰性でコマンドラインからカタカタやってたわけです

最近になって[Adminer](http://www.adminer.org/)の存在を知り、使ってみてタイトルのような状態になりまして

## Adminerの利点
* MySQL/PostgreSQL/SQLite/Oracle/MS SQL Server/MongoDBなどなどを全部統一されたI/Fで面倒見ることができる（要PHPドライバ）
* 設置がPHPファイルを1個DLして置くだけ
* 基本シンプルだけど一応デザインファイルも複数選べる(CSSファイルをDLして同じディレクトリに置くだけ)

セキュリティ的にはまあ普通のPHPなので、開発環境限定と考えてSSL+BASIC認証ぐらいは入れてます

SELECTの結果やMongoDBのfind()結果がHTMLで整形されて表示されてるのはやはりコマンドラインより見やすいもので色々捗ってます

開発用に色々データベースサーバを突っ込んでるけど、各データベースサーバごとにGUIツールをインストールするのが手間だなあ・・・と感じている方にはおすすめです
Atomでパスが通らない


Atom入門中です。

AtomをSpotlightとかから起動するとパスが`/usr/bin:/bin:/usr/sbin:/sbin`とかになっちゃって[script](https://atom.io/packages/script)とかが使いものにならない。

CLIのatomコマンドから起動すればそのときのPATHを引き継いでくれるようなので、こっちから立ち上げるようにした。

ちなみにPATHはコンソールから`process.env.PATH`で確認できる。
Mongooseのモデルに独自メソッドを作成する

Modelのインスタンスはドキュメントに対応するものです。Mongooseではドキュメントに関する操作をModelのインスタンスメソッド・クラスメソッドとして持っており、独自のメソッドを定義することもできます。

## インスタンスメソッド

```js
// schemaを定義
var animalSchema = new Schema({ name: String, type: String });

// animalSchema の "methods" オブジェクトに関数を定義します
animalSchema.methods.findSimilarTypes = function (cb) {
  return this.model('Animal').find({ type: this.type }, cb);
}
```

こうすると、全てのanimalインスタンスで`findSimilarTypes`メソッドが使えるようになります。
`this` は**Modelのインスタンス**を指します。

```js
var Animal = mongoose.model('Animal', animalSchema);
var dog = new Animal({ type: 'dog' });

dog.findSimilarTypes(function (err, dogs) {
  console.log(dogs); // woof
});
```

既存のメソッドをオーバーライドすると、予期しない不具合が発生する可能性があります。

## クラスメソッド(Statics)

```js
// animalSchema の "statics" オブジェクトに関数を定義します
animalSchema.statics.findByName = function (name, cb) {
  this.find({ name: new RegExp(name, 'i') }, cb);
}

var Animal = mongoose.model('Animal', animalSchema);
Animal.findByName('fido', function (err, animals) {
  console.log(animals);
});
```

`this` は**Model**を指します。

## まとめ

* インスタンスメソッドは `schema.methods`
* クラスメソッドは `schema.statics`

にそれぞれ関数を定義する！
サーバー容量を占有しているフォルダを調べるコマンド



# 現在の容量を調べる

ディスク・ドライブの使用量を表示するdfコマンド。

```
$ df -h
```
#### 使用オプション
-h: 容量を適当な単位で表示する。

こんな感じで結果がでる。この場合79GB中のうち23%に当たる18GB使ってるよということ。

![スクリーンショット 2015-02-24 11.28.49.png](https://qiita-image-store.s3.amazonaws.com/0/18614/d5bb6fd9-9709-5dd7-7baf-0974844b1773.png "スクリーンショット 2015-02-24 11.28.49.png")



# どのフォルダが多いか特定する

## ふつうのやり方

### 1.まずはroot権限に変更

```
$ sudo su
```

### 2.duコマンドでディレクトリ内のファイル容量を表示する。

```
# du -sh /*
```

#### 使用オプション
-s: 引数で指定したファイルやディレクトリの総計を表示する。
-h: 容量を適当な単位で表示する。


### 3.上記コマンドの結果を見ながらフォルダを絞り込んでいく。

```
# du -sh /var/*
```


## 別のやり方（こっちの方が早いかも）

```
# du | sort -nr | more
```

以下のような形で使用容量の多い順にディレクトリが表示される。（単位はキロバイト）

```
18533856	.
16310440	./var
13159992	./var/log
12962380	./var/log/httpd
2871932	./var/www
1688796	./var/www/hoge
1436332	./usr
701244	./var/www/fuga
```


### 使用しているコマンド
#### sortコマンドのオプション

-n: 先頭の数字や記号を数値とみなして、ソートする。（この場合は容量）
-r: 逆順にソートする。


#### moreコマンド
テキスト・ファイルの内容をページ単位で閲覧する。実行結果を一気に全件表示するのではなく、ページ送りしながら閲覧できるようになる。
mapの検索はfindとcountとどっちが早いんだろう


stlのmapの検索でcountの方が視覚的にわかりやすいソースになっていいよ！という記事を見かけた。
でも、findの方が見つけたら終了しそうだから、早くて、推奨されるはずでは…、と思い、試した。
※stlのソースとかは見てないです。すみません。

```cpp:test.cpp

	// 速度を判定する
	// map_testには100程度の要素が格納されていますよ。pairがkeyという変わったmapですみません。
	std::pair<wstring,wstring> a = make_pair(L"mememe",L"aaa");
	
	// 各測定で、時刻をログで出力しました。そこらへんは割愛したソースですが。
	// 測定開始
	for(int i = 0;i< 1000;i++)
	{
		 if (map_test.find(a) == map_test.end())
		 {
			 // 探すだけで処理はしないよ
		 }
	}
	// 測定終了

	// 測定開始
	for(int i = 0;i< 1000;i++)
	{
		 if (map_test.count(a) == 0)
		 {
			 // 探すだけで処理はしないよ
		 }
	}
	// 測定終了

	a = make_pair(L"mememe",L"sss");	//見つからないパターン

	// 測定開始
	for(int i = 0;i< 1000;i++)
	{
		 if (map_test.find(a) == map_test.end())
		 {
			 // 探すだけで処理はしないよ
		 }
	}
	// 測定終了

	// 測定開始
	for(int i = 0;i< 1000;i++)
	{
		 if (map_test.count(a) == 0)
		 {
			 // 探すだけで処理はしないよ
		 }
	}
	// 測定終了
```
測定結果としては、要素数の関係か大差はなかったです。
気持ち、findの方が早いくらいで…。
key=文字、value=数値のマップだったらまた変わったかもしれませんね。
アジャイルで「こんなタスクリストはクソ」って言われる理由

```
xxの検索機能
xxの登録機能
xxの編集機能
xxの削除機能
ユーザーの検索機能
ユーザーのサインイン機能
ユーザーのサインアップ機能
・
・
・
```

### すぐに使い物にならなくなる
ユーザーに価値を提供する狙いではなく手段が書かれている
手段は、状況が変われば別の手段が必要になる。そのためここに書かれた手段はナマモノでありすぐに使い物にならなくなる
(狙いの方を書いておくと陳腐化しない)

### 優先順位をつけられない
同じ尺度で比較できない
「1mと1kg、どちらがすごいか？」に回答が出せないように、同じ尺度にないため、「どれから手をつけていいか」が判断できない
(ユーザーストーリーだと欲求が含まれており、同じ欲求同士で比較できるので優先順位がつけやすい)

### 各人で解釈が異なる
コンテクストを共有していないため、実装者単位で機能の振る舞いがぶれやすい
ユーザーから見ると機能単位で一貫性がなく、ストレスのたまるUIやUXになりやすい
Atomの~/.atom/ をdotfilesリポジトリで管理

[dotfilesはhomesickで管理している](http://orihubon.com/blog/2013/01/06/improve-management-of-your-dot-files-by-homesick-and-github/)ので~/.atom/も同方法で管理することにした。

ただ、~/.atom/にはキャッシュファイルやnpmのパッケージファイルがあるので、以下のとおりgitignoreした。また、[project-manager](https://github.com/danielbrodin/atom-project-manager)を使っていてプロジェクト名一覧はリポジトリに入れたくないのでprojects.csonもignoreした。

```text:/path/to/dotfiles-repo/.gitignore
home/.atom/.apm/
home/.atom/.node-gyp/
home/.atom/compile-cache/
home/.atom/npm-debug.log
home/.atom/packages/
home/.atom/projects.cson
home/.atom/storage/
```

というわけで以下のファイルを管理するようになった。

```bash
$ cd /path/to/dotfiles-repo/home/.atom 
$ git ls
config.cson
init.coffee
keymap.cson
snippets.cson
styles.less
```
Atomで言語毎の設定

デフォルトはtabspace=2, perlはtabspace=4にしたくて調べた。

Atom公式の[Language Specific Configuration]( Settingshttp://blog.atom.io/2014/10/31/language-scoped-config.html) を見るのが良い。プラグインを入れる方法と、~/.atom/config.csonを編集する方法があるようなので、自分はconfig.csonを編集した。

```cson:~/.atom/config.cson 
"*":
  editor:
    invisibles: {}
    fontSize: 14
    fontFamily: "Source Code Pro"

  ## 略 ##

# ".source.言語名" のnamespace以下でオーバライドする
".source.perl": # perl overrides
  'editor':
    'tabLength': 4
```
Slackの投稿内容を読み上げる

先日開催された[IoT縛りの勉強会! IoTLT vol.1](http://iotlt.connpass.com/event/11373/)にて、IoT ChatOpsという内容で発表しました。そのときの発表の最後に使ったネタです。Slackで投稿した内容をbotが読み上げてくれます。

# 必要なもの
* Raspberry Pi (Model Bで確認)
* Wi-Fiモジュール
* スピーカー

# 手順
## RasPiセットアップ
いつもどおりRasPiをセットアップ、node.jsのインストールを済ませて置きます。

## RaspberryPiに喋らせる
全般的にコチラの記事を参考にさせて頂きました。hubotが受けたメッセージを、OpenJTalkというOSSで日本語対応の音声合成エンジンを使用してスピーカー出力しています。
http://shokai.org/blog/archives/6893


### OpenJTalkのインストール

```
sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic htsengine libhtsengine-dev hts-voice-nitech-jp-atr503-m001
```

`jsay`というシェルを作成してホーム(/home/pi)に置きます。hubot上でこのディレクトリを直指定しているので場所が違うと動きません。

``` ~/jsay
#!/bin/sh
TMP=/tmp/jsay.wav
#cd /usr/share/hts-voice/nitech-jp-atr503-m001
cd /usr/share/hts-voice/mei_happy
echo "$1" | open_jtalk \
-td tree-dur.inf \
-tf tree-lf0.inf \
-tm tree-mgc.inf \
-md dur.pdf \
-mf lf0.pdf \
-mm mgc.pdf \
-dm mgc.win1 \
-dm mgc.win2 \
-dm mgc.win3 \
-df lf0.win1 \
-df lf0.win2 \
-df lf0.win3 \
-dl lpf.win1 \
-ef tree-gv-lf0.inf \
-em tree-gv-mgc.inf \
-cf gv-lf0.pdf \
-cm gv-mgc.pdf \
-k gv-switch.inf \
-s 16000 \
-a 0.05 \
-u 0.0 \
-jm 1.0 \
-jf 1.0 \
-jl 1.0 \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
-ow $TMP && \
aplay --quiet $TMP
rm -f $TMP
```

## hubotを動かす
次のレポジトリからcloneしてきて下さい。
https://github.com/KeitaMoromizato/slack-speaker

Slackの設定からtokenを取得し、cloneしたレポジトリにあるファイルに埋め込みます。

``` sh:bin/hubot
set -e

npm install
export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH"
export HUBOT_SLACK_TOKEN= //ここを書き換える

forever start -c coffee node_modules/.bin/hubot -a slack

# exec node_modules/.bin/hubot "$@"
```

## hubot起動
### 自動起動
[この記事](http://qiita.com/KeitaMoromizato/items/d9130b3f6c04292c129d)で書いた用にhubotを自動起動したい場合はnpmでforeverをインストール、init.dをゴチャゴチャいじります。これで再起動したら起動しているはずなので、Slackにbotをinviteして試してみてください。

### 手動起動
手動起動する場合は、先ほどのシェルを少々修正して

``` sh:bin/hubot
# ここをコメントアウト
# forever start -c coffee node_modules/.bin/hubot -a slack

# ここのコメントアウトを解除
exec node_modules/.bin/hubot "$@"
```

次のコマンドで起動します

```
./bin/hubot -a slack
```

# 最後に
正直ネタ以外に使い道が分かりません...
EUnitでapplicationを起動したテストを書く

# EUnitでapplicationを起動したテストを書く
EUnitでapplicationを起動したテストを書こうとした場合, いくつか嵌まりどころがあったので纏めておく.

もちろん, mockライブラリの「meck」を使用するという方法もあるが, ここではそれについては触れない.


## on_loadで起動する方法 (悪い例)

```erlang:hoge_tests.erl
-module(hoge_tests).

-include_lib("eunit/include/eunit.hrl").
-on_load(init/0).

hoge_test_() ->
    %% 省略

init() ->
    _ = application:ensure_all_started(app).
    ok.
```

元々はNIF用に用意されているのだと思うのだが, moduleがloadされた際に実行する関数を指定することができる.
これを使って, applicationの起動が必要なテストはここで起動処理を書いたりしていた.
ただ, 本来の用途でないだけあって困ったことがいくつかある.

### テスト終了後の挙動
on_loadで起動したアプリケーションは, test終了後`exit(Pid, kill)`で終了される.これによる副作用がある.

applicationには`load`に関するステータスとして

- loaded
- loading

そして, `start`に関するステータスとして

- started
- running

が存在するが(ちなみに, これらは`application:info/0`を呼ぶことで取得することができる), `exit`されると`running`からは消えるが`started`に残るという現象が発生する.
そして, `application:ensure_all_started/1`は`started`に存在するアプリケーションについては実行しない.

結果, 他のテストで同じアプリケーションを使用した際にstartできなくなる.
(ちなみに, `application:stop/1`を呼ぶとstartできるようになる)

### on_loadの処理を失敗した場合
そして, もう1つは`on_load`を失敗した場合だ.

ついつい調子に乗って

```erlang
init() ->
    ?assertMatch({ok, _}, application:ensure_all_started(hoge)),
    ok.
```
とか書くと痛い目に合う.
`on_load`は`ok`が返らなかった場合, そのモジュールのテストが実行されないからだ. 
(多分ロード自体がされないと思うが調べていない)

testが実行されなければ失敗もしないので (つまりtest件数が減るだけ), 何が何でも`ok`を返さないといけない.

## setupを用いてネストする方法 (正しい例)

このように困ったことがある訳だが, 単にこれは正しい書き方ではないからこうなっているだけであって, 正しい書き方をすれば良いだけの話だ.

```erlang:hoge_tests.erl
%% 省略
hoge_test_() ->
    {setup,
     fun()        -> {ok, Started} = application:ensure_all_started(hoge), Started end,
     fun(Started) -> [application:stop(App) || App <- Started] end,
     [
       hoge_test_main(),
       hoge_test_main2()
     ]}.

hoge_test_main() ->
    [
      {"hoge", ?_assertEqual(...)},
      {"fugo", ?_assertEqual(...)}
    ]. 

hoge_test_main2() ->
    [
      %% 省略
    ].
```

多少面倒にはなるが, なんら問題はない.
数が多くなってくると多少面倒ではあるが...

## まとめ
つまるところ今まで`on_load`を使っていた訳だが, `application`が正常に終了されない為によるテスト間依存が発生していた.

Common Test (CT) を書くというのも1つの手ではあるが, 手軽さのコストが違うので, これで書けるところは書いていきたい.


----

とはいえ, Erlangを書き始めて半年なので正直なところ, これが本当に正しいかは分からない.
もし, こちらの方が良いというものがあればご教授願いたい.
milkcocoaβ版を使ったブラウザ間通信+YouTubeプレイヤーとリモコンを作る


##5分でわかるチュートリアルを行ってみる
ここで引っかかるかたはいないと思いますが、
自分はローカルのphpビルトインサーバ使ってlocalhost:1234とかでアクセスしてたら通信できない。
ポートがそのままmilkcocoaへの通信にも使われているのでできていなかったようで。。

無事出来ました。

##何度か通信して管理画面をみると
自分のアプリ管理画面→データストアにろぐが残ります。
内容は、

- データストア名
- ID(ブラウザごと)
- message内容

jsonで読込、書き出しが可能です。

管理画面ではその他にも利用できるようですがとりあえずドキュメントに進む。

##Document抜粋
###MilkCocoa(hosturl)
データストアへのホスト指定。
このオブジェクトが通信等を管理。ここからスタート！

###dataStore(path)
pathで指定したデータストアオブジェクトを返す。

###addAccount(email,password,options,callback)
訪問者をアカウント管理する場合のアカウント作成で使用する。

###その他アカウント関係
login(email, password, callback)
logout(callback)
getCurrentUser(callback)

##DataStore主なメソッド

###push(object, callback)
データストアにデータをプッシュする。

###set(id, data)
データストアのデータを更新/追加する。

###remove(id)
データストアからデータを削除する。

###send(id,data)
データストアにデータを保存せずに送信する。

###on(event, callback)
データストアにイベントを登録する。eventにpush,sendなどを登録することで他クライアント含めた指定イベントを監視する。

###child(path)
データストアの階層をたどるためのメソッド。

###query()
データストアへの取得条件を指定してデータの取得を行うオブジェクト。

##ブラウザ間を連動し片方をリモコン、片方をディスプレイとして動作するモノを作ってみた
とにかく簡単に実装しました。
操作の種類分だけDataStoreを作成し、それをリモコンがPushしてスクリーンが監視しているだけです。
またスクリーンの操作もjqueryのtriggerでclickイベントを発火させているだけなので
あっという間に出来ました。

こんな簡単な実装でもちゃんとリアルタイムに動作してくれます。

[nobu222/milkcocoa.sample](https://github.com/nobu222/milkcocoa.sample)
###リモコン画面
![Milkcocoa Remocon App.png](https://qiita-image-store.s3.amazonaws.com/0/35271/e7ed2636-f966-1256-0837-9b7d4e4f9d87.png "Milkcocoa Remocon App.png")

###スクリーン画面
![Milkcocoa Remocon App (1).png](https://qiita-image-store.s3.amazonaws.com/0/35271/9eeada36-7044-39c3-1ad1-9c3065461c9c.png "Milkcocoa Remocon App (1).png")
DrawCalls削減

UnityのDrawCallについて調べてみました。

<h2>DrawCallって何？？</h2>

```
スクリーンにオブジェクトを描画するために,描画エンジンはOpenGLやDirect3DのグラフィックAPIにドローコール(draw call)を発行しなければいけません。どんな一回のドローコールでも多くのグラフィックAPIの集まりが必要になります。つまりこれはCPUパフォーマンスのオーバーヘッドに重大な影響をもたらします。
```
（公式ドキュメントから抜粋　　http://docs.unity3d.com/ja/current/Manual/DrawCallBatching.html）

何やら難しそうなことが書かれていますがUnityが何かしら描画する回数でこれが大きいと処理が重くなる、という風に解釈します。

<h2>確認方法</h2>

今作成している画面でどのくらいDrawCallが発行されているかを確認するには「Stats」を使います。

![スクリーンショット 2015-02-24 8.40.32.png](https://qiita-image-store.s3.amazonaws.com/0/58014/da05982f-987c-79e6-1022-108cfd7d05ae.png)

Unityゲームビューの右上にある「Stats」ボタンを押すとグラフィックに関するパフォーマンス状況を確認できます。今はシーンを作ったばかりで何もオブジェクトがないのでDrawCallsは0となっています。


<h2>画像を置いてみる</h2>

画面に適当な画像を置いてみます。
![スクリーンショット 2015-02-24 8.46.03.png](https://qiita-image-store.s3.amazonaws.com/0/58014/27d22940-ba15-6431-7b55-0d33c10013a0.png)

画像１つ追加したのでStats内のDrawCalls数が１となりました。

もうひとつ追加します。

![スクリーンショット 2015-02-24 8.47.46.png](https://qiita-image-store.s3.amazonaws.com/0/58014/4c82a635-b5c6-e0c9-c707-52f8ee65a03d.png)

２つ画像を表示していますが、DrawCallsは１のままです。同じ画像の場合は増えないみたいです。

では別の画像を使ってみます。![スクリーンショット 2015-02-24 8.50.19.png](https://qiita-image-store.s3.amazonaws.com/0/58014/f50455ac-d3da-d83e-3800-8d2454165ca3.png)

別画像を追加するとDrawCallsが２に増えました。
この画面ではDrawCallsは２ですが実際に画面を作るとなると様々な画像を使い要件を満たしていくことになり、その度にDrawCallsは増えていきます。そこで工夫が必要となっていきます。

この記事ではAtlasを使ってDrawCallsを削減する方法を紹介します。

<h2>Atlasとは？？</h2>

Atlasとは複数の画像をひとつにまとめたものです。

<h2>Atlasの作り方</h2>

ここではNGUIを使ったAtlasの作成方法を紹介します。

![スクリーンショット 2015-02-24 9.00.06.png](https://qiita-image-store.s3.amazonaws.com/0/58014/7c8765cf-11ce-0bf6-522e-cdf0d3642458.png)

Project内に適当なフォルダを作成し、その中に適当な画像ファイルを格納します。
格納した画像ファイルを選択し、右クリック > NGUI > Open Atlas Makerを順にクリックすると、Atlas Makerウィンドウが開きます。

![スクリーンショット 2015-02-24 9.02.50.png](https://qiita-image-store.s3.amazonaws.com/0/58014/01436d85-7c7a-143b-e3db-934b24d9aee1.png)

「create」を押下すると保存場所と名前の入力を求められ、Atlasが作成されます。（ここではTestという名前をつけました）

![スクリーンショット 2015-02-24 9.06.06.png](https://qiita-image-store.s3.amazonaws.com/0/58014/8d72052e-a389-d3d8-675b-170d95095c17.png)

次にメインメニューのNGUI > Create > Sprite　でSpriteを作成し、Inspectorで使用するAtlasを指定して、使用するSpriteを指定します。

![スクリーンショット 2015-02-24 9.10.50.png](https://qiita-image-store.s3.amazonaws.com/0/58014/b6280e6a-0539-d34d-db17-cfe69c73aacf.png)

先ほどと同じように２つの画像を表示させました。ですが今回はAtlasで一つの画像にまとめているのでDrawCallsは１のままです。

このようにしてDrawCallsを削減することができます。ほかにも方法はありますがまた別の機会にまとめようと思います。

Atlas化は便利ですが、まとめる画像に気をつけないとAtlas自体の容量が大きくなるので注意が必要です。

以上、簡単ではありますが、DrawCallsとAtlasを使ったDrawCallsの削減方法のまとめでした。最後までお読みいただきありがとうございました。
IronRuby はご臨終でしょうか ?

#はじめに

IronRuby ですが、Microsoft 監修の元、オープンソースで開発された .NET Framework で動作する Ruby です。

久々にホームページを覗いてみましたが、*相変わらず 2011 年で更新が止まってました。* 一方、兄弟の IronPython はその後もアップデートが続いているようです。でも、IronRuby はこのまま消えて行きそうな雰囲気ですね。

#今さら IronRuby
##使いどころ

Windows でも Ruby は動作しますが、もともと Linux など Unix 系 OS からの移植なので、Windows で便利で使えると言うものではないです。IronRuby は .NET Framework で動作するので、GUI を含めて Windows のかなりの部分を利用できます。

![ironruby.png](https://qiita-image-store.s3.amazonaws.com/0/62802/17aab156-7f8a-f748-a951-a9011c6f892a.png)


##特徴

* GUIアプリケーションが簡単に作れます。
* .NET Framework クラスライブラリの豊富な機能が利用できます。
* rubyのクラスライブラリも同時に使用できます。
* すべてがオブジェクトです (rubyの特徴)。
* rubyの文法が使えるので、プログラムが簡単(短く）になります。


##実行

IronRuby を実行するには、下のような方法があります。

* ir test.rb (コマンドプロンプト内で実行)
* irw test.rb (ウィンドウを開かないで実行)
* iirb (対話モード)


##サンプル

ごく簡単なサンプルですが、coding: コメントで Shift JIS を指定しないと日本語は文字化けします。

```sample.rb
 # coding: SJIS
 require "System"

 # class
 class Ruby
   def initialize
     @name = "Ruby"
   end
  
   def ToString()
     return " シフトJISコード"
   end
 end

 a = Ruby.new
 puts(a.ToString())
```
 

[さらに詳しい内容はこちら ...](http://bonk.red/articles/Ruby/IronRuby/index.html)
ES6 import const letの意図の明確さ


ES6で追加された構文の嬉しさについて書きます。
今回は[module構文](http://www.2ality.com/2014/09/es6-modules-final.html)と[const](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/const)と[let](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/let)を扱います。


## ビフォー

ES5までは変数の宣言が方法がvarしかありませんでした。
単var派だったこともあり、CommonJSモジュールを定義すると...

```js
var subModule = require('subModule'),
    CONST_VALUE = '123',
    privateValue = {},
    func1 = function(){
      ///
    },
    main = function(){
      ///
    };
    
module.exports = main;
```

変数の定義内容を見ないと、どう使って欲しい変数なのかわかりません。
わかりずらさは命名規則でカバーします。

## アフター

ES6で導入されたmodule構文とconstとletを使うと...

```js
import subModule from 'subModule'

const CONST_VALUE = '123';

let privateValue = {};

export default function(){
  ///
}

function func1(){
  ///
}
```

命名規則ではなく構文レベルで各定義の意図が明確になります。
プロジェクト毎の命名規則を覚え必要がなくなって嬉しいです。

## なぜ明確さを重視するか

現時点で多くの環境でES6は動きません。
[Babel](https://babeljs.io/)などのトランスパイラを使って変換します。

変換したものは...

```js
"use strict";

var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; };

var subModule = _interopRequire(require("subModule"));

var CONST_VALUE = "123";

var privateValue = {};

module.exports = function () {};

function func1() {}
```

`const`も`let`も`var`に変換されます。
実行時には変更できますし、スコープは関数です。

機能的にはES5と変わりません。
それでも、ビフォーとアフターを見比べると、アフターの方が好きです。
コンテンツが存在しなくなった場合のステータスコードの扱い


## 例えば

#### 前提条件
http://example.com 
というサービスがあり、その中に
http://example.com/1
というページが存在し、既にgoogleにクロールされていたとする

あるタイミングで
http://example.com/1
というページが削除された（ex. delete flagがたった）とする

#### bad case

そのときユーザー、あるいはクローラーがページを踏んだとき

  * クロール：status:404
  * ユーザー：このページは存在しません


という表示がされるはず。
（仮に削除されたページでstatus：200などで返していたらそれはもっての外）

このままだとSEO上、またユーザーエクスペリエンス上良くない

#### 対策

1. statusは「404」で返す
  * 理由
      * 404を返すことでクローラーにインデックスから外してもらえる。
      * インデックスから外されないと（もしstatus200などで返していると）、SEO上、無意味なページがあるとして順位が下がる原因になってしまう


2. オリジナルの404ページをつくって表示させる
  * 理由
      * ただ404を表示させるだけだとユーザー離脱の原因になる
      * そこで、「見つからなかったです。こちらからお探し下さい^-^」といったページを表示させることで、離脱率を下げる。かつ1の対策と合わせることでSEO上順位が下がる原因も排除出来ることになる 

#### 参考ページ
[ソフト404エラーとは by VOLARE](http://www.seohacks.net/basic/terms/soft404/)
やっぱVOLAREは参考になる...
OSXでcgoでフォルダ階層が一階層上にあるライブラリを指定するには

# 背景

libtrusterdなるリポジトリを作って、こっそり活動していたら、
なんと! trusterdの作者の@matsumotory さんから[trusterd](https://github.com/trusterd/)に
リポジトリを移動して、こっちで開発しない？
（英語でのお誘いのため、一部意訳かも）

ということで、前々からSEO的に絶対有効だと思われるGo言語対応を
ほぼ、[cgoでのqsortの例](http://www.oki-osk.jp/esc/golang/cgo-osx.html)を見つけ、[paiza.io](https://paiza.io/)の枯れている版と思われる
goで動かせたので、これは行けると思い、早速作業。

# 1階層上のフォルダの共有ライブラリをリンク

goの例もexamplesというフォルダに入れることして、

```txt
├── libtrusterd.dylib
├── examples
│   └── trusterdGo.go
```
cgoの部分

```go
// #cgo LDFLAGS: -L.. -ltrusterd
```

これで、go build　は上手く行き、実行ファイルが出来るのです。

## ところが

実行すると、

```shell-session
./trusterdGo 
dyld: Library not loaded: libtrusterd.dylib
  Referenced from: /Users/kjunichi/work/mruby/libtrusterd/examples/./trusterdGo
  Reason: image not found
Trace/BPT trap: 5
```

# 動かすには

install_name_toolというツールで、実行ファイルがリンクしている
ライブラリ名を書き換えることで、1階層上の共有ライブラリを実行時にロード
できるようになった。

```
install_name_tool -change libtrusterd.dylib ../libtrusterd.dylib trusterdGo
```

install_name_tool前

```shell-session
otool -L trusterdGo
trusterdGo:
	libtrusterd.dylib (compatibility version 0.0.0, current version 0.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
```

install_name_tool後

```shell-session
otool -L trusterdGo
trusterdGo:
	../libtrusterd.dylib (compatibility version 0.0.0, current version 0.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
```


# libtrusterdとは

mrubyで作られた高速なhttp2サーバーであるtrusterdを共有ライブラリ化することで、
Python、OCaml、Node.js、その他libffiが使える言語からこのtrusterdを
動かすことを可能にしたものです。

# 参考リンク

- [homebrew - non-AppleなPythonでLeapMotionを動かす方法 - Qiita](http://qiita.com/hatchinee/items/b16ee02b3c93603aee0c)

# 関連記事

- [node-ffiをGoで入門してElectronを使って応用してみる](http://abrakatabura.hatenablog.com/entry/2015/12/11/000722)
- [GIMPのプラグインをGoで書く(その1)](http://abrakatabura.hatenablog.com/entry/2015/05/25/063913)
- [GoでFaceTime HDカメラやWebカメラを使う](http://abrakatabura.hatenablog.com/entry/2014/10/24/065607)
- [Goオールスターズ2に行くので、gopheronをGo言語で動かせるようにした #websocket](http://abrakatabura.hatenablog.com/entry/2016/10/02/073024)
- [Goオールスターズ2に行った](http://abrakatabura.hatenablog.com/entry/2016/10/08/070830)
- [Goの学習メモ～ファイルの存在チェックとWindowsでのファイルパスの扱い～](http://abrakatabura.hatenablog.com/entry/2017/04/03/192539)
- [Go言語でコマンドプロンプトに画像を表示するコマンドを作って、Vimの:terminalで表示させた](http://abrakatabura.hatenablog.com/entry/2017/08/19/093906)
- [Goの符号なし整数の計算でハマった件](http://abrakatabura.hatenablog.com/entry/2017/08/26/153528)
- [WindowsでmrubyからGoで作ったライブラリを呼び出して、Webカメラの画像をコマンドプロンプトに表示した](http://abrakatabura.hatenablog.com/entry/2017/09/01/072123)
- [RustでGoのライブラリを使うときのCargoのbuild.rsの書き方](http://abrakatabura.hatenablog.com/entry/2017/10/22/110223)
Inputマネージャー


|入力値取得例|内容|
|:---|:---|
|Input.GetAxis ("Horizontal")|水平方向の入力値を取得する。-1.0f〜1.0fの範囲の値を返す。|
|Input.GetAxisRaw ("Vertical")|垂直方向の入力値を取得する。-1.0f〜1.0fの範囲の値を返す。|
|Input.GetButtonDown ("Fire1")|ボタン1が押されていればtrueを返す。|
|Input.GetButtonDown ("Jump")|ジャンプボタンが押されていればtrueを返す。|
HTMLの中の文字列を、NGワードとマッチさせてjQueryで要素を消す


```
やりたかったのは、liの中の要素に、<a>やら<p>やら<h3>やらがあり、その中にNGワードで指定したものが含まれていた場合に、li要素を消すというもの。１時間位試行錯誤したので、メモっておこうと思う。（jQueryをあまりしらないので、試行錯誤です）
```



###改良版
kazu56さんからのご指摘でもっとシンプルに書けますよ！とのご連絡を頂戴しております。（こっちのがいいですね）

```
var ngword = ['エロ','本番','胸','ビッチ','エッチ'];

$.each(ngword,function(index,value){
  var selector = ".list li:contains('" + value  + "')";
  $(selector).remove();
});

```


###対象のHTML

```
<div class="list">

<li>
	<p>エロい</p>
	<img src="エロ画像">
</li>

<li>
	<a>胸が大きい</a>
	<img src="胸画像">
</li>

<li>
	<h3>ビッチが沢山</h3>
	<img src="ビッチ画像">
</li>


</div>



<script>

	var ngword = ['エロ','本番','胸','ビッチ','エッチ']; //NGワードをここに指定する

	var i = 0;

	$('.list li').each(function() { // list classの中のliを選択
		var txt = $(this).html(); // 対象の要素のHTMLを取得
		for ( i = 0  ; i < ngword.length ; i ++ ) { //ngwordの数だけ繰り返す
			if ( txt.indexOf(ngword[i]) != -1) {
				$(this).remove(); //NGワードにマッチした時に li 要素を消す
			}
		}
	});


</script>

```
OS X Yosemite で Nokogiri gem を bundle install

`mac nokogiri インストール` でググれば山のように出てくるけど、一応自分のやった方法も書き残しておきます。

## バージョン

- Mac OS X 10.10.2
- Ruby 2.1.5 (by rbenv)
- Nokogiri 1.6.3.1

## `bundle install` する

何も考えずに `bundle install` したら、libiconv が無いと言われました。

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/dtan4/.anyenv/envs/rbenv/versions/2.1.5/bin/ruby -r ./siteconf20150224-35319-1dn56el.rb extconf.rb
Building nokogiri using packaged libraries.
-----
libiconv is missing.  please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
```

ここで `brew install libiconv && brew link libiconv` とか gem 単体インストールとかチャレンジしましたが、それでもインストールがコケる…つらい…

## 解決

[Nokogiri 公式サイトに書いてある方法](http://www.nokogiri.org/tutorials/installing_nokogiri.html#mac_os_x) でだいたいいけました。`bundle install` するときは `bundle config` のくだりを事前に実行してあげるのが大切です。


```bash
$ gem update --system
$ xcode-select --install
$ bundle config build.nokogiri --use-system-libraries
$ bundle install
```

## REF
- [Installing Nokogiri - Nokogiri 鋸](http://www.nokogiri.org/tutorials/installing_nokogiri.html#mac_os_x)
Middleman+slimでhtmlエスケープ


slimのpreタグでhtmlを書こうと思ったらエスケープされずにそのままhtmlが表示されてはまった。

```slim
pre
  code= "<span>hogehoge</span>"
```

[middleman公式](https://middlemanapp.com/jp/basics/helper_methods/#フォーマットヘルパ)にもある通り、`escape_html`またはエイリアスの`h`を使う必要があるっぽい。

```slim
pre
  code= escape_html("<span>hogehoge</span>")
  / または
  / code= h("<span>hogehoge</span>")
```
各ホスティングの小規模構成の価格

どこかレンタルしたいがどうも決め手にかけるので値段を列挙してみる。

| 系列 	| リンク 	| 初期費用 	| 月額 	| 年額 	| 年契約+初期費用 	| メモリ 	| HDD 	| CPU 	|
|----------------------	|-------------------------------------------------------	|----------	|------	|-------	|-----------------	|--------	|----------------------	|-----	|
| さくらインターネット 	| http://vps.sakura.ad.jp/specification/ 	| 1000 	| 635 	| 6985 	| 7985 	| 512MB 	| 20GB 	| 1 	|
| さくらインターネット 	| 同1G 	| 1500 	| 900 	| 9900 	| 11400 	| 1GB 	| SSD 30GB / HDD 200GB 	| 2 	|
| GMO 	| https://www.conoha.jp/pricing 	| 0 	| 930 	| 11160 	| 11160 	| 1GB 	| 100GB 	| 2 	|
| GMO 	| http://www.onamae-server.com/vps/kvm/price/ 	| 0 	| 896 	| 9523 	| 9523 	| 1GB 	| 100GB 	| 2 	|
| GMO 	| http://vps.gmocloud.com/service/?navi=menu_micro 	| 4000 	| - 	| 11208 	| 15208 	| 2GB 	| 100GB 	| 3 	|
| DigitalOcean 	| https://www.digitalocean.com/pricing/ ※1ドル118円換算 	| 0 	| 590 	| 7080 	| 7080 	| 512MB 	| SSD 20GB 	| 1 	|
| DigitalOcean 	| 同＄10 	| 0 	| 1180 	| 14160 	| 14160 	| 1GB 	| SSD 30GB 	| 1 	|
Ractive.jsでイベントを拾う方法まとめ

## 1. イベントハンドラをテンプレートに設定する方法
```html:template
<div id="container">
  <script id="template" type="text/ractive">
     <div on-click="fire">イベントハンドラを付与</div>
  </script>
</div>
```

```js:ractive.js
var ractiveModel = new Ractive({
  el: '#container',
  template: '#template'
});

ractiveModel.on('fire', function(event){
  console.log(event);
});
```

## 2. イベントハンドラとメソッドをテンプレートに設定する方法
```html:template
<div id="container">
  <script id="template" type="text/ractive">
     <div on-click="fire()">イベントハンドラとメソッドを付与</div>
  </script>
</div>
```

```js:ractive.js
var ractiveModel = new Ractive({
  el: '#container',
  template: '#template',
  fire: function() {
    console.log(this);
  }
});
```

## 3. データバインド中のオブジェクトを監視する方法
```html:template
<div id="container">
  <script id="template" type="text/ractive">
     <div> {{target}} </div>
  </script>
</div>
```

```js:ractive.js
var ractiveModel = new Ractive({
  el: '#container',
  template: '#template',
  data: {
    target: 'abcdefg'
  }
});

ractiveModel.observe('target', function(value){
  console.log(value);
});

// 値を書き換えた瞬間にイベントが発生する
ractiveModel.set('target', 'xxxxxx');
```

その他にもあるようなので、把握次第追記します。
Perl v5.20よりithreadは非推奨です

今更ですが・・・

perl5200delta - perl v5.20.0 での変更点 - perldoc.jp
http://perldoc.jp/docs/perl/5.20.0/perl5200delta.pod#Interpreter-based32threads32are32now32discouraged
>Interpreter-based threads are now discouraged
>(インタプリタベースのスレッドは 非推奨 になりました)
>Perl によって提供されている「インタプリタベースのスレッド」は、想定されたり 望まれたりしているかもしれないような、マルチタスクのための高速で軽量な システムではありません。 スレッドは、誤用しやすい方法で実装されています。 これを正しく使う方法を知っている人や、助けを提供できる人はほとんどいません。
>perl でのインタプリタベースのスレッドは公式に 非推奨 です。

perl5 ithread についての個人的な見解。そして Coro について。 - blog.64p.org
http://blog.64p.org/entry/20090629/1246239835

# 参考

Perl 5.20.0 released [LWN.net]
http://lwn.net/Articles/600350/
意訳

* とりまforkで我慢すればええんちゃう？
* AnyEventとかCoroモジュールが使えばええんやで
ฅ(・ω・ฅ){ EA (Emoji Art) でサザンイマジネーション 第3回 お題「 IT 系の勉強会あるある 」 }

## <i class="fa fa-image" style="font-size:1em;"></i> 概要
Ascii Art ならぬ EA (Emoji Art) で 3 x 3 の絵を作る。

## <i class="fa fa-history" style="font-size:1em;"></i> 経緯
CodeIQ で <i class="fa fa-external-link" style="font-size:1em;"></i> [Emoji-サザンイマジネーション](https://codeiq.jp/ace/tbpgr_badge/q1323)
という問題の出題を始めました。

Emoji で 3 x 3 の絵を作るプログラムを作成する問題です。

この問題のフィードバック時に、解答者の 3 x 3 の Emoji に対して、
3 x 3 の Emoji でフィードバックする、という試みをしています。
これが結構楽しかったので、 Qiita 上でも出題期間中 ( ～ 2015年3月6日) は
1日1お題くらいやってみたいな、と思いました。

最近の チャットツール とか GitHub とか、多くのツールが Emoji をサポートしてるので
面白いものを作っておくと、開発メンバー間のコミュニケーションツールとして使えそうですよね。

Emoji のリストと対応サービスはこちらで確認。
<i class="fa fa-external-link" style="font-size:1em;"></i> [EMOJI CHEAT SHEET](http://www.emoji-cheat-sheet.com/)

## :flower_playing_cards: 作品 「 IT 系の勉強会あるある 」
IT 関係の勉強会によるあることといえば・・・

:crying_cat_face::hammer::rage1:
:sunglasses::beginner::sunglasses:
:zap::movie_camera::speech_balloon:

* マサカリ（の代わりにハンマー）
* ﾜﾀｼ○○ﾁｮｯﾄﾃﾞｷﾙ
* LT

## :books: 関連情報
* <i class="fa fa-external-link-square" style="font-size:1em;"></i> [emoji 関連記事](http://qiita.com/tbpgr/items/b32c83e2f3f348a4ce0a)
gulp-webpackで複数のファイルをコンパイルするときに注意する点のメモ




# 問題

+ gulp-webpackでは、webpackを内部で呼び出している。
+ その際、copyせずにentryやoutputにデータを入れてstream対応している。
+ 公式ドキュメントのように``webpack(require("webpack.config"))``するとrequireのキャッシュにより、同じオブジェクトが参照される。
+ 結果ファイル名が同一になり、保存のタイミング次第でA用の結果がBに出力されることがある。


# 対策

webpack.configのオブジェクトを毎回違うものにする。

```js
var config = module.exports = function() {
	// 毎回別のもにして、生成する
    return {
        externals: {
            "jquery": "jQuery"
        },
        resolve: {
            root: "./js"
        },
        extensions: ['', '.js']
    };
};
```
そして、都度関数を呼び出して別のオブジェクトにする。

```js
return gulp.src(ROOT_DIR + src)
       .pipe(webpack(require('./webpack.config.js')()))
       .pipe(rename(dst))
       .pipe(gulp.dest(DST_DIR));
```

一応このように対策したけど、なにかが間違っている気もするけどメモとして。
「○○は複数のファイルで定義されています」と表示される問題

FlashBuilderで編集中のプロジェクトで埋め込みファイルの差し替えを行っていると
「○○（ファイルパス）は複数のファイルで定義されています」
という消えない警告メッセージに遭遇することが、度々あります。

ワークスペース側で重複（？）しているらしく、普通にプロジェクトをクリーンしてもまず消えません。
警告が出ていることによる実害は特にないみたいですが、困ったものです。

とりあえず、誤ってリソース重複の警告が表示されている場合は
「プロジェクト(P)→プロジェクトを閉じる(S)」で一旦プロジェクトを閉じ、
改めて「プロジェクトを開く(E)」で開きなおしてから「クリーン(N)」を実行すると消えます。
（少なくとも自分の環境では毎回この方法でちゃんと消えています）

謂われのない警告表示に困っている場合は一度試してみるといいかもしれません。
SwiftでUITextViewの一部の文字色を変更する方法

NSMutableAttributedStringを使用すれば、簡単に文字列の一部の装飾を変更することができます。

```swift
let attrText = NSMutableAttributedString(string: "rich text")
attrText.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSMakeRange(0, 4))
textView.attributedText = attrText
```

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/69538/7f8f8ab1-2cc8-9e6a-c23f-1695d522bd8b.png)


上記は文字色を変更する方法ですが、他にも文字の背景色 (NSBackgroundColorAttributeName) 等を変更できます。

また、UILabelやUITextFieldでも同様に文字の装飾をすることができます。
to_a を持たない引数に * を前置した場合


Ruby で、実引数の前に * を前置すると to_a を呼んだ結果の配列の要素が、それぞれ引数として渡される。

```ruby
def print_args(*args)
  p args
end

print_args(*[1, 2]) #=> [1, 2]
print_args(*{a: 1, b: 1}) #=> [[:a, 1], [:b, 1]]
```

では、to_a を持たない引数の前に * を前置するとどうなるだろう。

```ruby
def print_args(*args)
  p args
end

print_args(*"foo") #=> ["foo"]
```

どうやらそのまま単一の引数として渡されるようだ。
ただし、ドキュメントには記述が見つけられなかった。

- http://ruby-doc.org//core-2.2.0/doc/syntax/calling_methods_rdoc.html
- http://docs.ruby-lang.org/ja/2.2.0/doc/spec=2fcall.html

Ruby 2.2.0p0 で確認した。
Riot@2.0.11 雑感

Riotjs の 2.0.11 がリリースされました。

リリースノートはこちら -> https://muut.com/riotjs/release-notes.html#2-0-11-em-feb-23-2015-em-

リリースノートでは `riot.mount`, `riot.mountTo`, `riot.unmount` あたりのことが書いてあるんですが、僕としては `2.0.7` にエンバグされた[コンポーネントに値が渡るときに遅延する問題](http://qiita.com/jgs/items/ddd97715d8cb24785a16#%E8%BF%BD%E8%A8%9820150212)がついに修正されたのが一番の朗報です！！！！！！！！

ちょっと前に自分で直そうと試行錯誤していたのですがいまいちどこが問題か特定できずに断念したので...。コミットログ追ってみると修正コミットはたぶん https://github.com/muut/riotjs/commit/2eecb48ebf5d2b112f25167bc8133c752454a8af がそれっぽいような気がするけど定かではないです。

それから、気付いた変更点としては 2.0.10 までは

```jade
some
  p(data='{ test }')
  script(type='text/coffeescript').
    @test = ['test1', 'test2', 'test3']
```

というようなコードで配列が `toString` されて展開されていたのが 2.0.11 だと属性が~~そのまま消滅する~~(**追記を参照**)ので注意が必要です。なので、お気付きとはおもいますが

```jade
some
  p(data='{ test.toString() }')
  script(type='text/coffeescript').
    @test = ['test1', 'test2', 'test3']
```

というような感じで明示的に `toString` してやれば同様の動きをします。ちなみに、これをやっているのは click のイベントハンドラで `event.target.getAttribute('data').split(',')` をするためなんですが、実装としては微妙な感じがするのでなんとかしたいなあとおもいつつ...。

# 追記(2/25)

コメントにもありますが

* String: DOMと、optsに入る
* Function: イベントハンドラ
* Bool: DOMと、optsに入る
* Object/Array: optsのみに入る

というような挙動をするようです。

---

その他トピックスとしては、プラグインシステムを作っているらしい([参照](https://github.com/muut/riotjs/issues/416))だったり、CSS まわりが整理されそう([参照](https://github.com/muut/riotjs/issues/381))といったあたりでしょうか。

これ言うの何度目かもう分からんぐらいですが、今度こそぼちぼち使えそうな感じだとおもうので引き続き使ってみていきたい所存です。

また、コンパイラ絡みの変更は特にないのであんまり対応することもなかったですが弊 gulp プラグインも既に対応済 ([リポジトリ](https://github.com/e-jigsaw/gulp-riot)) ですのであわせてどうぞ。また、上記のバグで 2.0.7 で止めていた絵文字検索サービス[emo](http://emo.jgs.me)([リポジトリ](https://github.com/jgsme/emo))もようやく 2.0.11 に上げられたので参考までに。
Command 指向の Emacs 利用

Emacs は大變便利だ．しかし，いろいろな key bind を記憶するのが辛い．記憶できても，指がもつれる．この問題を解決するのが，本稿で紹介する「Command 指向の Emacs 利用」である．

# 「Command 指向の Emacs 利用」とは何か

「Command 指向の Emacs 利用」とは，command を打ち込んで Emacs を操作することを本則とする利用法である．

# Command を入力するには

M-x を押して，command 名を入れてやればよい．Command 名は概ね系統的に命名されてゐるし，command 入力では Tab や C-i による補完が使へるから，樂だ．

# M-x を押すのが辛いならば

init.el に

```init.el
(global-set-key [tab] 'execute-extended-command)
```

と書いてやる．「M-x」は實は「execute-extended-command」という command を實行してゐるのだ．私はこの command に tab を割り當ててゐるが，もちろん，他の key でもよい．

# Command 名を思ひ出せぬときは

「apropos」といふ command を使ふ．Keyword を入力すれば，それに關係する command や變數を表示してくれる．

# 長い command 名を入力するのが辛いならば

Command に alias を設定できる．例へば init.el に

```init.el
(defalias 'kb 'kill-buffer)
```

と書いてやれば，「kill-buffer」といふ command に「kb」といふ alias を與へられる．

# key bind から command 名を知るには

「describe-key」といふ command を活用する．M-x describe-key の後に當該の key bind を入力すれば，その key bind がどの command を實行してゐるかを表示してくれる．

# key の押し間違ひに惱むならば

その key bind を無效にしてやる．やはり init.el に

```init.el
(global-unset-key (kbd "C-o"))
```

と書いてやれば， C-o を押しても何も起こらなくなる．

# 最後に

皆樣の快適な emacs life のお役に立てたらうれしいです！
ホームディレクトリを取得するのにos/userを使うとエラーになる場合がある

ホームディレクトリが必要になるのは、コマンドラインツールとかを作っていて、設定ファイルを保存するようなケースです。
Goにはos/userパッケージがあって、一見これを使うのがセオリーのように見えるのですが、クロスコンパイルするとエラーになります。

```go
package main

import (
	"fmt"
	"os/user"
)

func main() {
	fmt.Println(user.Current())
}
```
https://play.golang.org/p/fI0-SKcrXR

これは、私の手元のOSX環境では動きますが、Go Playgroundでは以下のようにエラーになります。

```
<nil> user: Current not implemented on nacl/amd64p32

Program exited.
```
他にも、例えばTravis CI(Ubuntu Linux)でビルドしたバイナリをOSXやWindowsで動かすと、以下のようなエラーになりました。

```
panic: user: Current not implemented on darwin/amd64

goroutine 1 [running]:
(中略)
main.main()
        /home/travis/gopath/src/github.com/hironobu-s/******/main.go:47 +0x71b

goroutine 2 [runnable]:
runtime.forcegchelper()
        /home/travis/.gimme/versions/go1.4.1.linux.amd64/src/runtime/proc.go:90
runtime.goexit()
        /home/travis/.gimme/versions/go1.4.1.linux.amd64/src/runtime/asm_amd64.s:2232 +0x1

goroutine 3 [runnable]:
runtime.bgsweep()
        /home/travis/.gimme/versions/go1.4.1.linux.amd64/src/runtime/mgc0.go:82
runtime.goexit()
        /home/travis/.gimme/versions/go1.4.1.linux.amd64/src/runtime/asm_amd64.s:2232 +0x1

goroutine 4 [runnable]:
runtime.runfinq()
        /home/travis/.gimme/versions/go1.4.1.linux.amd64/src/runtime/malloc.go:712
runtime.goexit()
        /home/travis/.gimme/versions/go1.4.1.linux.amd64/src/runtime/asm_amd64.s:2232 +0x1
```

これはos/userパッケージが[cgo](http://golang.org/cmd/cgo/)に依存していて、Goでクロスコンパイルするとcgoが無効になっているからだそうです。私もあまり詳しくわかっていませんが、以下の解説を参考にしました。

[Issue 6376:	user.Current panic in darwin-amd64 when crosscompiled from linux-amd64](https://code.google.com/p/go/issues/detail?id=6376)

[go - Cross compiling: "user: Current not implemented on linux/amd64" - Stack Overflow](https://code.google.com/p/go/issues/detail?id=6376)



そして、ホームディレクトリを取得するのには、こちらのパッケージを使わせてもらうことにしました。ありがたや。
https://github.com/mitchellh/go-homedir