OmniAICreator/Qiita-1.07M huggingface dataset:
Mroongaでベクターカラムを使ってタグ検索を実現するには


> gihyo.jpの[隔週連載groonga](http://gihyo.jp/dev/clip/01/groonga)も参考になりますよ。

# はじめに

MySQLで高速に全文検索するためのオープンソースのストレージエンジンとして[Mroonga](http://mroonga.org/ja/) (むるんが)を公開しています。
最新のバージョンは2013年7月29日にリリースした[3.06](http://mroonga.org/ja/docs/news.html#release-3-06-2013-7-29)です。

今回は、Mroongaでベクターカラムを使ってタグ検索を実現する例を紹介します。

# タグ検索のためのサンプル

bugsテーブルにタグをつけて検索する、というのを例にしましょう。

サンプルのスキーマは次の通りです。

```sql
CREATE TABLE tags (
  name VARCHAR(64) PRIMARY KEY
) ENGINE=Mroonga DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='default_tokenizer "TokenDelimit"';

CREATE TABLE bugs (
  id INT PRIMARY KEY AUTO_INCREMENT,
  tags TEXT COMMENT 'flags "COLUMN_VECTOR", type "tags"',
  FULLTEXT INDEX bugs_tags_index(tags) COMMENT 'table "tags"'
) ENGINE=Mroonga DEFAULT CHARSET=utf8;
```

ポイントはGroongaのベクターカラムを使っていることと、デフォルトのトークナイザーを指定していることです。

タグを空白区切りで格納するので、TokenDelimitをデフォルトのトークナイザーとして指定しています。また、空白区切りで格納されたタグをベクターカラムとして扱うようにCOMMENTで指定しています。

```sql
tags TEXT COMMENT 'flags "COLUMN_VECTOR", type "tags"'
```

typeにはタグの参照先となるテーブル名を指定します。このサンプルではtagsテーブルです。

ベクターカラムに格納されたタグを転置索引を使って高速に検索するために、tagsカラムに対してFULLTEXT INDEXを設定します。

```sql
FULLTEXT INDEX bugs_tags_index(tags) COMMENT 'table "tags"'
```

tableにはタグの参照先となるテーブル名を指定します。このサンプルではtagsテーブルです。

では、サンプルデータを投入してみましょう。

```sql
INSERT INTO bugs (tags) VALUES ("Linux MySQL Groonga");
INSERT INTO bugs (tags) VALUES ("Mroonga");
INSERT INTO bugs (tags) VALUES ("Groonga Mroonga");
```

# タグ検索してみる

サンプルデータも投入できたので、実際にタグ検索をしてみましょう。

Groongaでまずは検索してみます。

```bash
mysql> select * from bugs where match(tags) against("+Groonga" IN BOOLEAN MODE);
+----+---------------------+
| id | tags                |
+----+---------------------+
|  1 | Linux MySQL Groonga |
|  3 | Groonga Mroonga     |
+----+---------------------+
2 rows in set (0.00 sec)
```

きちんと、Groongaをタグに含むものを検索できていることがわかります。

次はMroongaで検索してみます。

```bash
mysql> select * from bugs where match(tags) against("+Mroonga" IN BOOLEAN MODE);
+----+-----------------+
| id | tags            |
+----+-----------------+
|  2 | Mroonga         |
|  3 | Groonga Mroonga |
+----+-----------------+
2 rows in set (0.00 sec)
```

こちらも、Mroongaタグに含むものを検索できていることがわかります。

# まとめ

今回は、Mroongaでベクターカラムを使ってタグ検索を実現する方法を紹介しました。

Mroongaの基本的な動作を知るための[ユーザガイド](http://mroonga.org/ja/docs/userguide.html)もあります。インストールしたら試してみてください。
errno: TLS definition in /lib64/libc.so.6 section .tbss mismatches non-TLS reference in envdir.o

daemontoolsを以下のページに従ってインストールしようとしたらエラーが。
http://cr.yp.to/daemontools/install.html

```
# package/install
・
・
・
/usr/bin/ld: errno: TLS definition in /lib64/libc.so.6 section .tbss mismatches non-TLS reference in envdir.o
/lib64/libc.so.6: could not read symbols: Bad value
collect2: ld はステータス 1 で終了しました
make: *** [envdir] エラー 1
```

64bitOSだとうまくいかないみたいです。
compile/conf-ccを編集して解決。
編集前

```
gcc -O2 -Wimplicit -Wunused -Wcomment -Wchar-subscripts -Wuninitialized -Wshadow -Wcast-qual -Wcast-align -Wwrite-strings
```

編集後

```
gcc -O2 --include /usr/include/errno.h
```

上記のように書き換え、再度package/installを実行すると成功しました。
デストラクタで任意の関数オブジェクトを実行したい

処理を行っている間だけフラグを立てたいときなどがあります。コードを書くならこんな感じです。

```cpp:
BOOL flag = FALSE;
{
    flag = TRUE;
    cout << "#1 " << flag << " -> ";
    flag = FALSE;
}
cout << flag << endl;
```

```text:結果
#1 1 -> 0
```

　
通常はこれで問題ないのですが例外をthrowされると期待通り動きません。

```cpp:
try
{
    flag = TRUE;
    cout << "#2 " << flag << " -> ";
    throw runtime_error("");
    flag = FALSE;
}
catch(runtime_error &e)
{
}
cout << flag << endl;
```

```text:結果
#2 1 -> 1
```

　　
こういうときは、クラスのデストラクタを利用するとうまくいきます。

```cpp:
class Foo 
{
public:
    Foo(std::function<void ()> func)
    : m_func(func)
    {
    }

    ~Foo()
    {
        m_func();
    }

private:
    std::function<void ()> m_func;
};
```

```cpp:
try
{
    flag = TRUE;
    cout << "#3 " << flag << " -> ";
    Foo foo([&]{flag = FALSE;});
    throw runtime_error("");
}
catch(runtime_error &e)
{
}
cout << flag << endl;
```

```text:結果
#3 1 -> 0
```

　　
STLなど標準ライブラリにFooのようなクラスがないか調べてみたのですが見つかりませんでしたが、
shared_ptr のカスタムデリータを使えば同じ事ができました。

```cpp:
try
{
    flag = TRUE;
    cout << "#4 " << flag << " -> ";
    shared_ptr<int> pObj(0, [&](int *){flag = FALSE;});
    throw runtime_error("");
}
catch(runtime_error &e)
{
}
cout << flag << endl;
```

```text:結果
#4 1 -> 0
```

　
他にも方法があれば教えて欲しいな。
GitHubにpushする度にusername/passwordを求められるとき


たぶんgit remote -vするとhttpsになってる


```````````
$ git remote -v
origin  https://github.com/memerelics/config (fetch)
origin  https://github.com/memerelics/config (push)
````````

gitに変えてやればおとなしくなる

`````````
$ git remote set-url origin git@github.com:memerelics/config.git
````````
「増やす減らす二倍する」をErlangで(横へな13参考)

http://qiita.com/Nabetani/items/89fb0e2e712d4b396535
http://nabetani.sakura.ne.jp/hena/ord13updowndouble/
「増やす減らす二倍する」をErlangでやってみました。

0からスタートするのではなく、逆に目的の値からスタートし、1増やす、1減らす、2で割るを繰り返して0に到達するまでに要した回数を調べています。どの演算をするかは値の下位2ビットで判定します。

下位2ビットが:

- ?0 → 2で割る
- 01 → 1減らす
- 11 → 1増やす

01のとき1減らし、11のとき1増やすことで下位2ビットを00にすることができます。これは4の倍数であり、2で2回割れるため、より少ない回数で1に収束させることができます。

ただし下位2ビットが11になる数のうち3の時だけは、4にするより2にする方が収束が早いため、特例として1減らすことにします。実際には2→1→0にする処理を省略し「回数を3回増やしてその場で終了」しています。

```erlang:updown.erl
-module(updown).
-compile(export_all).

solve(Data) ->
  integer_to_list(op_count(list_to_integer(Data), 0)).

%% 結果が1か3になるまで2で割るか1を増減し、その回数を返す
op_count(1, Count) -> Count + 1;
op_count(3, Count) -> Count + 3;
op_count(Num, Count) ->
  Bit0 = Num band 1,         % 最下位ビット
  Bit1 = (Num bsr 1) band 1, % 最下位ビットの1つ上のビット
  case {Bit1, Bit0} of                        % 下2ビットが
    {_, 0} -> op_count(Num bsr 1, Count + 1); % ?0なら2で割る
    {0, 1} -> op_count(Num - 1, Count + 1);   % 01なら1減らす
    {1, 1} -> op_count(Num + 1, Count + 1)    % 11なら1増やす
  end.

test(Data, Expected) ->
  Result = solve(Data),
  OkNg = case Result =:= Expected of true -> ok; false -> ng end,
  io:fwrite("~s: ~s -> ~s~n", [OkNg, Data, Result]).

tests() ->
  test("59", "9"), %0
  test("10", "5"), %1
  test("11", "6"), %2
  test("12", "5"), %3
  test("13", "6"), %4
  test("14", "6"), %5
  test("15", "6"), %6
  test("16", "5"), %7
  test("17", "6"), %8
  test("18", "6"), %9
  test("27", "8"), %10
  test("28", "7"), %11
  test("29", "8"), %12
  test("30", "7"), %13
  test("31", "7"), %14
  test("32", "6"), %15
  test("33", "7"), %16
  test("34", "7"), %17
  test("35", "8"), %18
  test("41", "8"), %19
  test("71", "9"), %20
  test("1023", "12"), %21
  test("1024", "11"), %22
  test("1025", "12"), %23
  test("1707", "17"), %24
  test("683", "15"), %25
  test("123", "10"), %26
  test("187", "11"), %27
  test("237", "12"), %28
  test("5267", "18"), %29
  test("6737", "18"), %30
  test("14796", "20"), %31
  test("18998", "20"), %32
  test("23820", "20"), %33
  test("30380", "21"), %34
  test("31119", "21"), %35
  test("33301", "20"), %36
  test("33967", "21"), %37
  test("35443", "22"), %38
  test("35641", "22"), %39
  test("43695", "23"), %40
  test("44395", "23"), %41
  test("44666", "22"), %42
  test("987", "14"), %43
  test("1021", "13"), %44
  test("1019", "13"), %45
  test("1015", "13"), %46
  test("1007", "13"), %47
  test("1011", "14"), %48
  test("1003", "14"), %49
  test("983", "14"), %50
  test("999", "14"), %51
  test("2731", "18"), %52
  test("6827", "20"), %53
  test("10923", "21"), %54
  test("27307", "23"), %55
  test("43691", "24"), %56
  test("109227", "26"), %57
  test("174763", "27"). %58
```

結果の一部:

<pre>
ok: 59 -> 9
ok: 10 -> 5
ok: 11 -> 6
ok: 12 -> 5
...
</pre>
シェルでSSL証明書の有効期限を確認する

意外とSSL証明書の有効期限をコマンドラインで取得する方法が見つかりにくかったので書いてみる。
運用担当さんが複数のSSL証明書の期限管理などを機械的に実施したい場合に便利かも。

opensslコマンドを使って以下の様にすると${DOMAIN}のSSLを${CERT}というファイル名で取得します。
次のdateコマンドは、処理しやすいように証明書期限の日付を取ってくる例です。

```
openssl s_client -connect ${DOMAIN}:443 </dev/null > ${CERT} 2>/dev/null
date +%Y%m%d --date="`openssl x509 -text -in ${CERT} | sed -e "/Not After/{s/^.* : //;p};d"`"
```
Node.js/Expressで静的ファイル（ここではPDFビューア）を見せるには

全然大したことをやってないのですが、いつかオフライン・キャッシュなどと連携して応用するかもしれないのでメモしておきます。

Mozillaが開発したPDFビューア「pdf.js」のサンプルをNode.jsで表示します。

![スクリーンショット 2013-08-22 11.32.54.png](https://qiita-image-store.s3.amazonaws.com/0/12939/c9481c6f-45a8-c324-ac29-e219927cb420.png)

```
$ express pdfjsRichSample
$ cd pdfjsRichSample
$ npm install
$ cd public
$ git clone git://github.com/mozilla/pdf.js
```

**index.html** にPDFビューアへのリンクを付けます。

```jade:index.jade
extends layout

block content
  h1= title
  p Welcome to #{title}
  p
    a(href='pdf.js/web/viewer.html') PDF Viewer
```

以上です。

-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
ヒットしたキーワードの前後数行をファイルに抽出

# set
export UE=3 #上何行
export SITA=4 #下何行

export FILE=hoge #ファイル名

export KEY=keyword #キーワード


# exec
for i in `grep -n $KEY $FILE|awk -F: '{print $1 } '`
do
    export BASE=`expr $i + $SITA`

    export SITAA=`expr $UE + 1 + $SITA`

    echo ----------
    head -$BASE $FILE| tail -$SITAA
    echo ----------
done
thunarでアイコンが表示されない場合の対処

![スクリーンショット 2014-12-06 5.42.24.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7e615b4f-4dd0-7b8a-a4cc-d92156bdfe4b.png)

## Ubuntuの場合

```bash:
$ sudo apt-get install gnome-icon-theme-full
```

## CentOS7の場合

```bash:どれか一つインストール
yum install -y faience-icon-theme
yum install -y gnome-icon-theme-extras
yum install -y gnome-icon-theme-legacy
yum install -y mate-icon-theme
yum install -y mate-icon-theme-faenza
yum install -y mono-icon-theme
yum install -y nuvola-icon-theme
yum install -y oxygen-icon-theme
```

アプリケーションメニュー
-> Settings
-> 外観
-> アイコン
-> Faience Azur

### faience-icon-theme の例

![スクリーンショット 2014-12-06 5.40.25.png](https://qiita-image-store.s3.amazonaws.com/0/25728/34741e25-9412-ec0a-c74b-651599164652.png)
Node.js/ExpressでHTML5オフライン・キャッシュを使う

まずHTML5のオフライン・キャッシュとはどのようなものかお見せします。

まず普通にオンラインの状態です。

![スクリーンショット 2013-08-22 10.52.24.png](https://qiita-image-store.s3.amazonaws.com/0/12939/73ceaf54-cb39-3dce-d6e5-5c7e0f72f82e.png)

こちらのページも普通に見ることができます。

![スクリーンショット 2013-08-22 10.51.50.png](https://qiita-image-store.s3.amazonaws.com/0/12939/308ac2ba-0147-5473-bd0c-e89c8db9a21d.png)

次にオフラインにしてみます。もちろんGitHubを見ることはできません。

![スクリーンショット 2013-08-22 10.52.39.png](https://qiita-image-store.s3.amazonaws.com/0/12939/f150e1a3-e020-27f1-7435-e6f6626a8a25.png)

ところが先ほどのページは見ることができます。

![スクリーンショット 2013-08-22 10.52.54.png](https://qiita-image-store.s3.amazonaws.com/0/12939/c7425b56-c8c6-4223-77ae-90c555dd7391.png)

JavaScriptを実行することもできます。

![スクリーンショット 2013-08-22 10.53.11.png](https://qiita-image-store.s3.amazonaws.com/0/12939/59660b07-f412-4b9d-927f-237fc961014e.png)

開発者ツールを見ると、 **from cache** と書かれています。

![スクリーンショット 2013-08-22 11.05.29.png](https://qiita-image-store.s3.amazonaws.com/0/12939/41c74b02-d713-fbf2-a173-1ee856de5151.png)

-----
私は **connect-cache-manifest** モジュールを使いました。

まず **package.json** に `connect-cache-manifest` を追加します。

```json:package.json
{
  "name": "application-name",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "3.3.5",
    "connect-cache-manifest": "*",
    "jade": "*"
  }
}
```

モジュールをインストールします。

```
$ cd project
$ npm install
```

**app.js** を編集します。

```js:app.js
...
var cacheManifest = require('connect-cache-manifest');
...
// cache-manifest
app.use(cacheManifest({
  manifestPath: '/application.manifest',
  files: [{
    dir: __dirname + '/public',
    prefix: '/'
  }],
  networks: ['*'],
  fallbacks: []
}));
...
```

**view/layout.jade** も編集します。

```jade:view/layout.jade
html(manifest='application.manifest')
...
```

これで、一度キャッシュされたら2回目以降はオフラインでもページを見ることができます。

iPadなどでも使えるので、上手に使えば面白いことができそうです。

-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
Windowsの日付取得

@echo off
set YYYYMMDDHHMMSS=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
echo ################# >> d:\temp\test.log
echo %YYYYMMDDHHMMSS% >> d:\temp\test.log
echo %1 >> d:\temp\test.log
AWR自動取得

set pages 0
spool awr_tmp.sql
 select 
 'define report_type=text' || chr(10) ||
 'define num_days=2' || chr(10) ||
 'define begin_snap='  || SNAP_ID      || chr(10) ||
 'define end_snap='    || (SNAP_ID + 1)|| chr(10) ||
 'define report_name=' || SNAP_ID || '_' || (SNAP_ID + 1) || '.txt'  ||
 chr(10) ||
 '@?/rdbms/admin/awrrpt.sql' || chr(10)
 from sys.dba_hist_snapshot
 where snap_id > 
     (select max(snap_id)-3 from sys.dba_hist_snapshot)
     and snap_id < (select max(snap_id) from sys.dba_hist_snapshot)
 order by snap_id;
spool off
@awr_tmp.sql

exit
複数ユーザーにランダムなパスワードを一括設定するワンライナー

サーバ管理してると、誰にもわからないランダムパスワードを設定したい場合とかあるよね。
めったに使わなくてよく忘れそうになるのでメモついでに記事にした。

こんなかんじでワンライナー。

```bash
for name in $(echo "user1 user2 user3"); do chpasswd < <(echo "$name:$(echo $RANDOM |md5sum |head -c 10)"); done
```

ちなみに、RHEL系だと`chpasswd`にリダイレクトじゃなくて、`passwd --stdin` にパイプ渡しする形でもできる。
Active Recordでバリデーションの種類 Rails

#presence: true
空白禁止
#allow_blank: true
空の検証をスキップさせるときに使用する
#:length => { :maximum => 20 }
入力長さを指定する、上記の例では２０文字まで
#:uniqueness => true
データの内容がユニークである事、つまりデータベースに同じ内容のデータがない事
名前やmailは重複しないようにとかに使う
#:numericality => only_integer
整数のみ
#:format => { :with => /regex/ } 
正規表現にマッチする
#:confirmation => true
パスワードなどの確認入力項目が、比較元項目と一致しているかチェックを行う
#:exclusion => { :in => %w(ruby python perl ) }
指定された値が含まれないことをチェックする
#:inclusion => { :in => %w(small medium large) }
指定された値が含まれることをチェックする
他の例:  validates :lock, inclusion: { allow_blank: true, in: %w(0 1 2) }


参考サイト
http://wiki.usagee.co.jp/ruby/rails/RailsGuides%E3%82%92%E3%82%86%E3%81%A3%E3%81%8F%E3%82%8A%E5%92%8C%E8%A8%B3%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%82%88/Active%20Record%20Validations%20and%20Callbacks#q8915bf2

http://www.techscore.com/tech/Ruby/Rails/model/validation/1/

http://d.hatena.ne.jp/h-kageyu/20120321/1332312955
PHP標準例外まとめ


参考　[PHP公式：例外](http://www.php.net/manual/ja/spl.exceptions.php)

##PHP定義済み例外
###Exception
すべての基底となる例外クラス。
PHPはException型以外のオブジェクト、値をthrowできません。
javascriptが異常なだけです。

###ErrorExcetption
エラー例外。
変換用ロジックはこちら

~~~~PHP:
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
}
set_error_handler("exception_error_handler");
~~~~

protected $severityでエラー番号が取得可能とか。

##SPL例外
##LogicException
　ロジック内部でのエラーを表す例外。コード異常を示し,修正を促す。
####BadFunctionCallException
　未定義関数のコールバックや、引数異常を示す例外
#####BadMethodCallException
　`BadFunctionCallException`のメソド版
####DomainException
　定義されたデータドメインに対する不適合を示す例外
####InvalidArgumentException
　引数が期待する形式と一致しなかったことを示す例外
####LengthException
　データ長エラーを示す例外
####OutOfRangeException
　無効なインデックス要求に対する例外


##RuntimeException
　実行時にのみ検出可能な例外。
####OutOfBoundsException
　値が有効なキーでなかった場合にスローされる例外
####OverflowException
　上限となるコンテナへのデータ追加で生じる例外
####RangeException
　範囲エラーを示す例外。`DomainException`の実行時版
####UnderflowException
　空のコンテナに対する削除操作等を示す例外
####UnexpectedValueException
　期待した値と一致しないことを示す例外

ざっくり
Eclipse PDT で入力補完が効かないときの最後の手段

## はじめに

Eclipse といえば IDE なので当然メソッド名などの入力補完が可能です、改めて言うことでは無いですが。

`@return` などの DocComment を書いておけば、それを元に候補を出してくれます。

```php
<?php
class Hoge
{
    public function get() {}
}

/**
 * @return Hoge
 */
function func() {}

// 入力補完が効く
func()->get();
```

DocComment を書いていなくても文脈からある程度察してくれます。

```php
<?php
function nodoc()
{
    return new Hoge();
}

// DocComment がなくても入力補完が効く
nodoc()->get();
```

ところで最近知ったのですが、次のようにすればオブジェクトの配列でも入力補完させられます。これは便利！

```php
<?php
/**
 * @return Hoge[]
 */
function returnArray() {}


foreach ($a as $x)
{
    // 入力補完が効く
    $x->get();
}
```

もちろん、配列の場合でも文脈からある程度察してくれます。かしこい！

```php
<?php
function nodocArray()
{
    return array(new Hoge);
}


foreach (nodocArray() as $x)
{
    // 入力補完が効く
    $x->get();
}
```

ただ、DocComment や 文脈からでは入力補完させられない場合もあります。例えば次のような場合です。 

```php
<?php
$class = 'Hoge';
$o = new $class();
```

他にもリフレクションから `newInstance` したり、DI や ServiceLocator を使ってると入力補完を効かせられないケースがてんこ盛りです。

そんなときはブロックコメントで `@var` と変数名とクラス名を書いてやれば OK です。

```php
<?php
$class = 'Hoge';

/* @var $o Hoge */
$o = new $class();

// 入力補完が効くようになった！
$o->get();
```

## 本題

Eclipse は色々と頑張って入力補完してくれるのですが、頑張りすぎなのか、もしくは私の書き方がなにかおかしいのか、たまに `@var` しても入力補完が効かないことがあります。

そんなときに使う最後の手段がこれ。

```php
<?php
$o instanceof Hoge;
$o->get();
```

`instanceof` するとほぼ間違いなく入力補完を効かせることができます。

唐突に意味のない `instanceof` が出てくるのはちょっと気持ち悪いですが・・・テストコードとかならいいよね！
iTunsで他のマシンにプレイリストにコピーする方法


曲のコピーはホームシェアリングで簡単に出来るけどプレイリストのコピーは出来なかったので。


[iTunes：音楽ファイルを新しいコンピュータに移動する方法](http://support.apple.com/kb/HT4527?viewlocale=ja_JP)

>プレイリストの転送
>
コンテンツだけでなく新しいコンピュータでプレイリストも使いたい場合は、古いコンピュータからすべてのプレイリストのコピーを転送することをお勧めします。これを行うには、古いコンピュータで「ファイル」>「ライブラリ」>「ライブラリを書き出し」の順に選択します。デスクトップに作成された XML ファイルを保存します。
>
プレイリストファイルを新しいコンピュータに転送するには、メールの添付ファイルとしてプレイリストファイルを送信するか、外付けドライブを使うか、ファイル共有 を使います。新しいコンピュータにファイルを保存したら、iTunes を開いて、「ファイル」>「ライブラリ」>「プレイリストを読み込み」の順に選択します。読み込み処理では、ホームシェアリングで共有されなかったプレイリストの項目が削除されます。
Macにおけるバックスラッシュ（\）の入力方法


# はじめに

この投稿は、macOSをJISキーボードで使っている時、プログラミングでよく使われるバックスラッシュ（\）を入力するための方法を記しています。

# 環境

* macOS10.13.6で動作確認を行っています。
* Google 日本語入力は、2.24.3250.1（2018年9月18日時点のもの）で動作確認を行っています。

# やり方（macOS標準の場合）

macOSをJISキーボードで使っている場合、バックスラッシュ（\）の入力は

* optionキーを押しながら、¥キーを押す。(Mac mini 等で Windows用のキーボードを接続している場合は Alt キー)

の方法でできます。

毎回、optionキーを押しながら入力するのは面倒くさい人は、macOSについているIME「ことえり」の設定を変えることで対応可能です。

1.  画面右上に、黒地で白文字の「A」が出るように選択
2. 「"キーボード"環境設定を開く...」を選択
3. 「入力ソース」の「"¥"キーで入力する文字」を「\（バックスラッシュ）」に変更

![スクリーンショット 2018-09-18 20.50.54.png](https://qiita-image-store.s3.amazonaws.com/0/15996/68a684a5-ec75-45cb-ecd7-84d7992d99e2.png)

# やり方（Google 日本語入力の場合）

Google日本語入力の場合でも、バックスラッシュ（\）の入力は、

* optionキーを押しながら、¥キーを押す

の方法でできます。

毎回、optionキーを押しながら入力するのは面倒くさい人は、Google日本語入力の設定を変えることで対応可能です。

1. 画面右上に、青字で白文字の「A」が出るように選択
2. 「環境設定...」を選択
3. 「一般」の「¥キーで入力する文字」を「\（バックスラッシュ）」に変更

![スクリーンショット 2018-09-18 20.58.37.png](https://qiita-image-store.s3.amazonaws.com/0/15996/3209a1ef-4d34-d550-f281-27a1555cc649.png)
jQueryでURLをパースする

メモ。

```js:
var url = 'http://www.youtube.com/watch?v=Q16KpquGsIc&gl=JP&hl=ja#comment';

var elm = $('<a>', { href:url } )[0];

console.log(elm.hostname);
//->www.youtube.com

console.log(elm.pathname);
//->/watch

console.log(elm.search);
//->?v=Q16KpquGsIc&gl=JP&hl=ja

console.log(elm.hash);
//->#comment
```
vim-airline にカーソル下の文字コードを表示する

[vim-airline](https://github.com/bling/vim-airline) が流行ってるみたいですね。
流れに乗って私も [vim-powerline](https://github.com/Lokaltog/vim-powerline) から乗り換えてみました。

- [もぷろぐ: vim-airline に乗り換える5つの理由](http://ac-mopp.blogspot.jp/2013/08/vim-airline-5.html)

[vim-powerline](https://github.com/Lokaltog/vim-powerline) では文字コードの表示が可能だったので [vim-airline](https://github.com/bling/vim-airline) でもやってみました。
(結構便利なので個人的には必須)

![vim-airline 2.png](https://qiita-image-store.s3.amazonaws.com/0/10548/5794066c-5f52-b5be-bdf4-acab3e567403.png)

# 実装

文字コードを取得する部分は vim-powerline からパクry…流用しました。

- [Powerline#Functions#GetCharCode() - vim-powerline](https://github.com/Lokaltog/vim-powerline/blob/develop/autoload/Powerline/Functions.vim#L100)

以下のコードを .vimrc に書けば画像のように表示されます。

```vim
" https://github.com/Lokaltog/vim-powerline/blob/develop/autoload/Powerline/Functions.vim
function! GetCharCode()
  " Get the output of :ascii
  redir => ascii
  silent! ascii
  redir END

  if match(ascii, 'NUL') != -1
    return 'NUL'
  endif

  " Zero pad hex values
  let nrformat = '0x%02x'

  let encoding = (&fenc == '' ? &enc : &fenc)

  if encoding == 'utf-8'
    " Zero pad with 4 zeroes in unicode files
    let nrformat = '0x%04x'
  endif

  " Get the character and the numeric value from the return value of :ascii
  " This matches the two first pieces of the return value, e.g.
  " "<F>  70" => char: 'F', nr: '70'
  let [str, char, nr; rest] = matchlist(ascii, '\v\<(.{-1,})\>\s*([0-9]+)')

  " Format the numeric value
  let nr = printf(nrformat, nr)

  return "'". char ."' ". nr
endfunction

function! GetEncoding()
  let fenc = strlen(&fenc) >0 ? &fenc : ''
  let ff = strlen(&ff) > 0 ? &ff : ''
  return fenc . '[' . ff . ']'
endfunction

" Display charcode, fileencoding and fileformat.
let g:airline_section_y = '%{GetCharCode()} %{g:airline_right_alt_sep} %{GetEncoding()}'
```

見た目が気に入らない方は適当に弄って下さい。

## デフォルトの設定を流用してみる

`fileencoding` や `fiileformat` の表示がデフォルトと同じで良いなら以下のようにしても良いかも

ただし `NeoBundle` 限定です。

```vim
let bundle = neobundle#get('vim-airline')
function! bundle.hooks.on_source(bundle)
  let g:airline_section_y = '%{GetCharCode()} %{g:airline_right_alt_sep} ' . g:airline_section_y
  call airline#update_statusline()
endfunction
unlet bundle
```

この方法の場合は `GetEncoding()` 関数は不要になります。

もっと良い方法があれば教えて下さい。

ちなみに私の vim-airline の設定は以下のような感じになってます。

- [dotfiles/.vimrc.plugins_setting at master · yonchu/dotfiles](https://github.com/yonchu/dotfiles/blob/master/.vimrc.plugins_setting#L34)
プロセスを監視するスクリプト

linuxでデーモンを開発する場合なので、プロセスを監視するためにpsコマンドなどを手動で打って、生きているかどうか調べることがあります。毎回同じようなことを書いている気がするので、メモしておきます。

```bash:sample.sh

#!/bin/bash

function createReport()
{
        #ここで終了時に必要な処理を行う
        sleep 1
}

function isAlived()
{
        ps_name=$1
        isAlive=`pidof $ps_name | \
                 wc -l`
        return $isAlive
}

while true
do
        ps_name="a.out"
        isAlived $ps_name
        if [ $? -eq 0 ]; then
                echo "$ps_name is not alived"
                break
        fi
done

echo "report create -> start"
createReport
echo "report create -> end"

sleep 1
echo "finished ..."

```

このスクリプトでは無限ループでps コマンドを実行してプロセスがいるかどうかを調べて、プロセスがいなくなったら無限ループを抜けるようにしてあります。
対話的なスクリプト

linux上でコマンドを打って何か値を設定してそのあと設定できたことを確認するということがたまにあります。そういうとき毎回手動でコマンドを打つのも面倒なので、値を確認するコマンドを打ったあとで入力待ちをするようにしてあげることで毎回手動実行しなくてもよくなります。

```sh:sample.sh

#!/bin/bash

echo -n "check (yes|no)?>"
read input
case "$input" in
        y | yes ) frag=1 ;;
        n | no  ) frag=0 ;;
esac

if [  $frag -eq 0 ]; then
        echo "good bye ..."
        exit 1
fi

echo "next.."

```

↑のスクリプトのcheck の前に設定/値確認コマンドを書いて、値が正しい場合にはy or yesを入力してやりたい処理をnext..に書くという感じです。
「金平糖」アプリリリース＆ソース公開

![Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/8588/fdbd6aa3-f028-41aa-22d9-819ad9da25c2.png)

動画はこちら
http://www.flickr.com/photos/80124738@N05/9564307258/

カウンターアプリで、
タップで瓶の中に金平糖が入ることで数えます。
上に名前をつけたり、
ロングタップで削除したり、
瓶を増やしたりできます。

ダウンロードはこちらからお願いします。無料です。
https://itunes.apple.com/jp/app/crystalsuger/id689723657?ls=1&mt=8


完全なソースコードはこちらに公開しています。
https://github.com/Ushio/CrystalSuger

このソースから得られる技術は以下の通りです。
・OpenGL ES 2.0 shader 技術全般
・マルチビューGLレンダリング
・基本的なポストプロセッシングの実装
・ビュー空間 スペキュラ・リムライティングの効率的実装
・GLステートの効率的管理
・マルチサンプリングアンチエイリアスの適用（MSAA）
・blocksベースの薄いGLエンジン
・シンプルなCoreDataバインディング
・ベーシックなパーティクル制御
・3D物理エンジン Bullet Physicsの統合およびC++ブリッジ
・マルチコア最適化
・PDFベースのアイコンの使い方
・GLKitの使い方

みなさんの開発ヒントになれば幸いです。

//ところで、アニメのこ？と。が元ネタなのはこっそりと書いておきます
Ubuntu 12.04でLXCを使う

[第226回　LXCで軽量仮想環境の活用：Ubuntu Weekly Recipe｜gihyo.jp … 技術評論社](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0226)を参考にやってみました。

## LXCのインストール

```shell-session:
$ sudo apt-get update
$ sudo apt-get install lxc
```

## コンテナの作成

コンテナのテンプレートは/usr/lib/lxc/templates/lxc-*というファイルで定義されています。
ここではubuntuのコンテナを作成してみます。マシンスペックにもよりますが10分程度かかります。

```shell-session:
$ sudo lxc-create -t ubuntu -n ubuntu01
```

## コンテナ一覧表示

起動状態毎のコンテナ名一覧

```shell-session:
$ sudo lxc-list
RUNNING

FROZEN

STOPPED
  precise

```

コンテナ名だけの一覧

```shell-session:
$ sudo lxc-ls
precise
```

## コンテナの起動

### シリアルコンソールに接続して起動する方法

```shell-session:
$ sudo lxc-start -n ubuntu01
```

起動後ログインプロンプトが出たら、ubuntu / ubuntu でログインします。
ログアウトするとシリアルコンソールのログインプロンプトに戻ります。
ここでシリアルコンソールから抜ける方法は不明です。

### シリアルコンソールに接続せずに起動する方法

```shell-session:
$ sudo lxc-start -n ubuntu01 -d
```

起動後シリアルコンソールに接続

```shell-session:
$ sudo lxc-console -n ubuntu01
```

この場合は、Ctrl+a qでシリアルコンソールを抜けられます。

### ホストからゲストにssh接続

ホストではdnsmasqが10.0.3.1で動いていて、ゲストはDHCPで動的IPが割り当てられています。以下のコマンドでゲストのIPアドレスを取得します。

```shell-session:
$ dig ubuntu01 @10.0.3.1 +short
10.0.3.16
```

sshで接続

```shell-session:
$ ssh ubuntu@10.0.3.6
```

### dnsmasqのネームサーバを最初にする

```shell-session:
$ echo "nameserver 10.0.3.1" | sudo sh -c "cat >> /etc/resolvconf/resolv.conf.d/head"
$ sudo resolvconf -u
```

これでネームサーバを明示的に指定しなくても名前解決できます。

```shell-session:
$ dig ubuntu01
```

## CentOS 6.4コンテナを使う

[LXC CentOS template. Work with Ubuntu if the yum package is installed](https://gist.github.com/hagix9/3514296)を元に適宜調整した
https://github.com/hnakamur/ansible-playbooks/blob/master/roles/lxc/templates/ubuntu_lxc.centos.j2
を/usr/lib/lxc/templates/lxc-centosに配置します。調整内容は以下の2点です。

- /etc/resolv.confはresolvconfの自動生成に任せる。
- /etc/sysconfig/network-scripts/ifcfg-eth0のDHCP_HOSTNAMEはコンテナ名にする。これによりdig ${コンテナ名}で名前解決できるようになります。

あとは、以下のコマンドを実行すればCentOS 6.4のコンテナが作成されます。

```shell-session:
$ sudo lxc-create -t centos -n centos01
```

## Ansibleのプレイブック

https://github.com/hnakamur/ansible-playbooks/commit/0aa690d63d86fadc70f58570f244b067542f6974
にUbuntu 12.04にLXCをセットアップするプレイブックを置いています。
modified なファイルだけ add したいことあるよねー

コミットまでしたいときは，

```
git commit -a -m "some message"
```

でよいけど，とりあえず modified なファイルだけ add して，untracked なやつとかは一緒のコミットにするか別にするか考えよう，という場合は（極めて安直だけど）

```
git status | sed -e "s/#.*modified://g" | xargs git add
```

でおｋ．
毎回書くのは面倒なので，スクリプトにでもしておくと便利かも．

＃ 何かスマートな方法はないものか…
iPhoneアプリのPush通知をRubyで実装するならhoustonが良さげ


iPhoneアプリのPush通知を実装するのに使用した「houston」というライブラリが良さげだったのでメモ。


##経緯
アプリにPush通知を実装する事になったので、[この記事](http://mihyaeru21.hatenablog.com/entry/2013/05/17/174910)を参考にやってみたのですが何故か通知が来ない。。で、他に良いライブラリがないか探して見つけたのがこの記事でした。
[Ruby - 巨大な Helios を取り巻く gem 群について調べてみた - Qiita [キータ]](http://qiita.com/ne_ko_/items/ab20e84ff34ac670b070)

> 1-2. houston
> 
> mattt/houston · GitHub
>
> Houston is a simple gem for sending Apple Push Notifications. Pass your credentials, construct your message, and send it.
> 
> iOS のプッシュ通知サービスを利用するためのライブラリ。
> 同様の機能を持つライブラリに APNS gem があるが、houston gem のほうが実用的な機能がまとまっている。


これは良さげ！！


##houstonのここが良い

###1. URLを意識しなくて良い
最初に感じたのはこれでした。
[APNS](https://github.com/jpoz/APNS)の場合は通知を送るURLを文字列として直書きする必要があり、そのURLによって開発環境か本番環境かを識別していたのですが、houstonの場合は最初に development か production を指定するだけでURLを意識する必要がありません。


```objective-c:APNSの場合
// 開発環境
APNS.host = 'gateway.sandbox.push.apple.com'
```

```objective-c:houstonの場合
// 開発環境
APN = Houston::Client.development
```

直感的に分かって良いですねー。


###2. 通知処理をバックグラウンドで実行する事が可能
バックグラウンドで動かしたい場合は、こんな感じに書けばOK！

```Ruby:
certificate = File.read("/path/to/apple_push_notification.pem")
passphrase = "..."
# 開発環境
connection = Houston::Connection.new(APPLE_DEVELOPMENT_GATEWAY_URI, certificate, passphrase)
connection.open

notification = Houston::Notification.new(device: token)
notification.alert = "Hello, World!"
connection.write(notification.message)

connection.close
```


###3. コマンドラインから動作確認ができる
apnというファイルを使うと、コマンドラインでPush通知の動作確認ができます。

```bash:
$ apn push "<token>" -c /path/to/apple_push_notification.pem -m "Hello from the command line!"
```


## まとめ
というわけで僕はこれをおすすめします。

[nomad/houston](https://github.com/nomad/houston)

この記事で紹介しているような事は、READMEに書かれています。
分かりやすいドキュメントも魅力的ですね！

どのライブラリを使うか迷っている方はぜひどうぞ！
他に何か良さげなライブラリがありましたら教えて下さい〜。
javascriptでスタックトレース

javascriptでちょっと賢いロガーっぽいのを作ったとしても、最終的にはconsole.logを使ったりすると、ログの表示箇所が全て同じファイル、行になるのでいまいち不便。

そこで、V8エンジンのブラウザだけだけど、スタックトレースを取得してログメソッドが実行された行数、ファイル名などを一緒に出力する方法を調べた。

https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi

を使えばいける。例えばこんな感じ。

```js:
Error.prepareStackTrace = function( e, st ) {
  return {
    functionName: st[0].getFunctionName(),
    lineNumber: st[0].getLineNumber(),
    //いろいろお好きに
  };
};

function log( msg ) {
  var obj = {};
  Error.captureStackTrace( obj, log );
  console.log( msg + " at " + obj.stack.functionName /* 後はお好きに */ );
}
```

captureStackTraceを実行すると、スタックトレースが生成される。第２引数の"log"は、今まさに実行している関数を渡していて、これによってスタックトレース情報からcaptureStackTraceを呼んでいる自分自身の関数情報が除外される。

obj.stackにアクセスすると、初回アクセスであればスタックトレースがフォーマットされる。普通は文字列で生成されるのだけど、prepareStackTraceを上書きすると、任意のフォーマットで生成することができる。

prepareStackTraceのstには、実行行数、ファイル名などのトレース情報が配列で入っていて、それぞれgetFunctionNameなどを実行すると実行時の関数名などが取得できる。上の例では、必要な情報だけオブジェクトにして返している。

これうまく使えば、かなり詳細なログ情報を出せる。注意点として、prepareStackTraceに設定したフォーマッタは通常のエラー発生時のスタックトレースのフォーマットにも適用されるという点。元のフォーマッタを一度何かの変数に参照させておいて、用が済んだら元に戻すとかしたほうが良いかも。
NSManagedObject(CoreData)のDoubleやIntのデータ型に値を入れるときはNSNumber

NSManagedObject(CoreData)のattributeにintをそのまま入れようとするとダメって言われます。
NSNumberで入れるのが正しい。

```objc:
NSString *str = @"123";
[managedObject setValue:@([str intValue]) forKey:@"number"];
```
Memcachedでフォーム2重投稿対策


Linuxサーバとして動作し、任意のキーや値をキャッシュしてくれる。RDBMSと連携してデータ参照の高速化によく使われるけど、今回はPerlでのAPIを通してフォームの2重投稿対策として使ってみるメモ。

##準備

1. Memcachedのインストール

[技評](http://gihyo.jp/dev/feature/01/memcached/0001?page=2)さんを参考にしました。Memcachedの操作方法もこちらを参照。

2. PerlのAPI導入

[Cache::Memcached::Fast](http://search.cpan.org/~kroki/Cache-Memcached-Fast-0.21/lib/Cache/Memcached/Fast.pm)を使います。setとgetとdeleteしか使わないのでこれで十分。

##コードはこんな感じ

```Perl
use Cache::Memcached::Fast;
use Digest::MD5 qw(md5_hex)

my $mc = new Cache::Memcached::Fast(
	{servers => [{address => 'localhost:11211'}]}
);

sub set_double_post_check {
	my ($user_id, $expiration_second) = @_;

	my $key = "double-post-check-$user_id";
	my $value = md5_hex($user_id);
	$expiration_second ||= 300;

	return $mc->set($key, $value, $expiration_second);
}
sub check_double_post_check {
	my $user_id = shift;

	my $key = "double-post-check-$user_id";
	my $value = $mc->get($key);
	if ( $value eq md5_hex($user_id) ) {
		$mc->delete($key);
		return 1;
	}
	return 0;
}
```

即席でやればこんなもん。本当はkeyも暗号化したほうがいいし、valueは時間情報なども含めて暗号化すべき。

とりあえずこんな感じでMemcachedを使ってフォームの2重投稿対策が実装できるので、cookie以外での2重投稿対策をお探しの方はぜひお試しあれ。
Railsのバージョン管理にbitbucketとmercurialを使う手順


[前提条件]
ローカルにmercurialをインストールしていること。
bitbucket上にリポジトリを作成していること。

##ローカルにリポジトリ作成
railsのプロジェクトを配置したい場所に移動する。
リポジトリをクローンし、そのままrailsアプリを作成する。

```
hg clone https://XXXXX@bitbucket.org/XXXXX/XXXXX
rails new XXXXX -d mysql
```

##設定ファイルの変更
railsアプリの中に含まれている.hg/hgrcに記述を追加する。
※このファイルはmercurialの管理ファイルであり隠しファイルとなっている。

```.hg/hgrc
[auth]
ipros.prefix = bitbucket.org/XXXXX/XXXXX
ipros.username = XXXXX
ipros.password = XXXXX

[hostfingerprints]bitbucket.org = 24:9c:45:8b:9c:aa:ba:55:4e:01:6d:58:ff:e4:28:7d:2a:14:ae:3b
```

これをやると警告がでないようになる。
HMAC 方式を使用してハッシュ値を生成する。

HMAC 方式を使用してハッシュ値を生成する方法。

```py:hmac_digest.py
import sha
import hmac
from hashlib import sha1
key = 'foo'
raw = 'baa'
hashed = hmac.new(key, raw, sha1)
digested = hashed.hexdigest()
print digested
print len(digested)
```

結果は以下の通り

```bash:
8b1be576578bd4725ff7733f44fb8d7afed21808
40
```
各社VPSとかRaspberryPiで性能比較してみました(UnixBench)

ちょっと自前でサーバを建てるにあたり、
運用コストの比較のためにベンチマークを取ってみました。
個人用に1000円/月位のコストのものを探っていました。


|提供|プラン|unix-bench score|月額|備考|
|:-------:|:---------:|:---------------------:|:----:|:----:|
|--|MacBookPro(Early 2008)|466.2|--|ベンチ結果の参考値として|
|[マイコン](http://www.raspberrypi.org/)|RaspberryPi|97.3|--|ベンチ結果の参考値として。まあ安かろう悪かろうなスペックですね|
|[conoHa](http://www.conoha.jp/) |メモリ 1GBプラン|2500.3|976円|isoをアップロードしてインストールできる機能には惹かれました|
|[お名前.com](http://www.onamae-server.com/vps/)|VPS（KVM）1GBプラン|2987.0|980円|conoHaとUIは一緒で使いやすい|
|[budgetvm](https://www.budgetvm.com/account/aff.php?aff=1448) |Linux VPS (Xen) - 768MB VPS|1046.0|6.99$|グローバルIPが２つ付きます。海外vps|
|[digitalocean](https://www.digitalocean.com/?refcode=58b04120b7b2) |512MB / 1 CPU 20GB SSD DISK 1TB TRANSFER|1538.5|5.0$|WebApiでインスタンスのコントロールが可能等、使い勝手が良さそう。海外vps|

海外vpsは海外って備考に入れています。
国内と海外ではレスポンスタイムが30msと150msくらいの違いがありました。
でも、極限まで安くとなるとdigitaloceanかなと。
(国内にも500円以下のVPSがありましたが中身はOpenVzで色々問題がありました。)



最終的にdigitaloceanにしました。

下記により詳細な比較を行っている方がいました。
http://sakuhindb.com/pj/6_B4C9CDFDBFCDA4B5A4F3/20121106.html#0_6_A4CFA4B8A4E1A4CB
Blenderのショートカットまとめ


Blenderをやっていく上で、ショートカットキーを知ることは必須に近いので、色々と知ったことを備忘録的にまとめていきます。
なので、随時更新予定。



##モデリング操作系
* `Ctrl + R` ループカット。さらに`+`, `-`キーで分割数を増減できる。
* `Ctrl + I` 選択の反転
* Alt


##操作系

* `h`, `Shift + h`, `Alt + h` 「選択部分の非表示」、「選択してない部分の非表示」、「非表示を表示」
* `Alt + G` locationを0, 0, 0に戻す
* `Alt + S` 生成されたときのサイズに戻す
* `Alt + R` 全軸に対して0度に戻す
* `Alt + O` 子要素のオリジンをクリアする。

* テンキー0：カメラとユーザー切り替え
* テンキー5：パース有無
* テンキー2、4、6、8：視点回転（+Ctrlで視点のパン移動）
* テンキー1、3、7：正面、左、上（+Ctrlで逆向き）
* テンキーピリオド：選択物全体表示、視点回転の中心に
* テンキーEnter：選択物全体表示
* テンキー+：画面拡大
* テンキー-：画面縮小
* テンキー/：選択オブジェクトのみ表示（ローカル表示）

Read more: Blender基本操作（ショートカットキー） 

##カーソル系

* `Shift + S` メニューが展開。「カーソルに移動」や「カーソルを移動」のメニューが出る。
* `.`(Fn + .), `Ctrl + .`, `Alt + .` それぞれpivotの位置が変更できる。


##ショートカット編集
ショートカットの編集は、UserPreferenceの「Input」から編集できます。

###マニピュレータの切り替えをショートカットで行う方法

![custom-input.png](https://qiita-image-store.s3.amazonaws.com/0/5616/57be447c-ffa8-1326-22aa-3f09eaea8f19.png "custom-input.png")

その中の[3D View] > [3D View(Global)]が、マニピュレータの設定に関する項目です。
ただ、マニピュレータの変更用ショートカットはデフォルトはないので新規作成しないとなりません。
上記項目の下の方に「Add New」ボタンがあるので、それを押して新しいショートカットを作成します。
そして以下の画像のように項目を追加することでショートカットが設定されます。

![custom-input2.png](https://qiita-image-store.s3.amazonaws.com/0/5616/101434d3-1e49-4cbb-033c-69b4e5c40ad3.png "custom-input2.png")

追加したばかりだと最初は項目名が「none」になっているので「view3d.enable_manipulator」と入力します。
あとはそれに対してどのキーを割り当てるかを設定することでショートカットの設定は終わりです。

[詳細はこちら](http://tamable.blogspot.jp/2010/11/blender25.html)を参考にしてください。


##リンク集
* [boneのauto weightでエラーが出るときの対処法（動画）](http://www.youtube.com/watch?v=IZPqxADetWE)  
どこかからか落としてきたモデルにboneを入れてauto weight入れようとするとたまにエラー（failする）が出るときがあるけど、これ見て解決した。
* [頂点ウェイト（WeightVGroup）モディファイア](http://wiki.blender.org/index.php/Doc:JA/2.6/Manual/Modifiers/Modify/Vertex_Weight)
* [本当に初めての方のために作成したBlenderチュートリアル for 2.6](http://www.cgradproject.com/Blender_Tutorial/Tute_Chapter24.html)
* [頂点グループ（Vertex Groups）](http://wiki.blender.org/index.php/Doc:JA/2.6/Manual/Modeling/Meshes/Vertex_Groups)
* [BlenderでMecanimしようぜ（前編）](http://qiita.com/ivoryfunc/items/22d770556978533ad554)  
Rigifyを使ったRiggingのサンプル記事。
* [Introduction to Rigging!](http://www.blenderguru.com/videos/introduction-to-rigging/)  
Riggingをムービーで解説してくれているサイト。ただし英語。
* [IK(インバースキネマティクス)の設定〈Empty〉](http://6b.u5ch.com/2010/10/ik1.html)  
IKについて基本の記事。ただし、若干記事が古いのでBlenderのverが古い。
* [モデルデータ](http://artist-3d.com/)
* [UV展開とテクスチャペイントとテクスチャをはるメモ](http://blog.livedoor.jp/hawamo21/archives/2949798.html)
* [手首をなるべくきれいにひねるための補助ボーン](http://shinichiaoyagi.blog25.fc2.com/blog-entry-283.html)
lxc簡易構築メモ

```bash:作成
$ sudo lxc-create -n pyramid -t ubuntu -- -r precise
```

```bash:IP設定
$ sudo vim /var/lib/lxc/pyramid/config
lxc.network.ipv4 = 10.0.3.3
lxc.network.ipv4.gateway = 10.0.3.1
```

```bash:起動
$ sudo lxc-start -n pyramid -d
```

```bash:接続
$ ssh ubuntu@10.0.3.3
```

centos6
========

```bash:
$ cd /usr/share/lxc/templates/
$ wget -O /usr/share/lxc/templates/lxc-centos6-vagrant \
   https://github.com/tukiyo/vagrant-lxc_create_box/tree/master/lxc-templates/lxc-centos6-vagrant
$ sudo chmod +x /usr/share/lxc/templates/lxc-centos6-vagrant
$ sudo apt-get install curl yum
$ sudo lxc-create -n gitlab -t centos6-vagrant
```

CentOS5を動かしたい場合は、上のcentos6をcentos5に読み替えてください。

[参考](http://wiki.1tux.org/wiki/Lxc/Installation/Guest/Centos/5)
Re:Chefのレシピでsed的な事を実施

Chefのexecuteを使ってsedとかgrepとかでファイルの書き換えをせこせこしてたら

```code.rb
execute "add_virtual_domain" do
  not_if 'grep hogehoge virtual_domain'
  command "sed -i '/^hoge.com/moge.com/g' virtual_domain"
end
```

@sawanoboly@github さんにChef::Util::FileEdit使えYOということでコードを書き換えました。


ポイントとしては、content _file.send(:contents).joinを使うとvirtual_domainsの全ての行を評価した後に実行するので以下となります。

node['postfix']['domain_list'] = ['hoge.com', 'moge.com']の時に

```virtual_domain(1回目)
+hoge.com OK
```

```virtual_domain(2回目)
-hoge.com OK
+moge OK
```
となってしまうので、_fe.write_fileで毎回write_fileしてしまうところがコツです。

```setup_virtual_domain.rb
node['postfix']['domain_list'].each.with_index(1) do |domain, index|
  ruby_block node['postfix']['action'] + '_' + domain + "_to_virtual_domains_#{index}" do
    block do
      _fe = Chef::Util::FileEdit.new('/etc/postfix/virtual_domains')
      case node['postfix']['action']
      when 'add'
        _fe.insert_line_if_no_match('^' + domain + ' OK$', domain + " OK")
      when 'delete'
        _fe.search_file_delete_line('^' + domain + ' OK$')
          end
          _fe.write_file
        end
        notifies :run, 'execute[make_virtual_domains.db]'
      end
    end
  end
end

# make virtual_domains.db
execute 'make_virtual_domains.db' do
  action :nothing
  user 'root'
  cwd node['postfix']['etc']
  command '/usr/bin/postmap /etc/postfix/virtual_domains'
  notifies :reload, 'service[postfix]'
end
```

@sawanoboly@github さんありがとう!!

>追記
ruby_block名が毎回同じ名前で実行されるので.each.with_indexで名前を変えてみました。
UITableViewの微調整のメモ


微調整で使ってみたプロパティのメモです。

* contents inset　コンテンツの外側に余白をつくりそこまでスクロールさせる。
(デフォルト０)
* Scroller inset　その余白部分まではスクロールバーを出させたくないときに調整する
(出しても良いならcontents insetと同じで良い)
* contents offset スクロールの開始位置
* contents size スクロールのコンテンツサイズ

UITableViewCellの幅の調整方法は次に記載があります。
[UITableViewCellの横幅を調整する/ひよっこ](http://hikaruworld.bitbucket.org/blog/html/2012/11/30/howto_uitableviewcell_resize_width.html)
trac

```bash:apt-getで入れる場合
$ sudo apt-get install \
  trac trac-ja-resource trac-git
```

```bash:プロジェクトの作成
trac-admin $HOME/mytrac initenv
```

$HOME/mytrac/ にプロジェクトディレクトリが作られる。

日本語化
----

```bash:$HOME/mytrac/conf/trac.ini
[inherit]
plugins_dir =
templates_dir = /usr/share/trac-ja-resource/trac/templates
```

```bash:
$ trac-admin  $HOME/mytrac wiki load \
  /usr/share/trac-ja-resource/trac/wiki/default-pages
```

basic認証の準備
----

```bash:
$ echo "manager:$(openssl passwd -crypt fj23q89)" >> .htpasswd
```

とすると、manager:fj23q89 で認証が通る.htpasswdファイルが作成される。


サーバーの起動
----

```bash:
$ tracd -d -p 8000 --basic-auth=mytrac,.htpasswd, mytrac
```
ZenCodingでHTML記述速度を上げる2

続き
Part1では基本WinのEclipseでの検証だったけれど
今回は事情でMacのNetBeansから動作検証。

展開キーは
Win ……` Ctrl` +` E`
Mac……` comand` +` E`

---
<br />
* 属性の指定

```img.html
/* img */
<img src="" alt="" />

/* img[width=100][height=200] */
<img src="" alt="" width="100" height="200" />

```
デフォルトでついてくる属性もある。
ない場合は `[属性名= 値]` 指定で追加できる。
デフォルトの属性は変えられないのかな？

* リスト

```list.html
/* ul+ */
<ul>
  <li></li>
</ul>
```
ul+でリスト項目をセットに出力。
ddタグなどにも使用可能


```table.html
/* table+ */
<table>
  <tr>
    <td></td>
  </tr>
</table>
```
最低限の形はこれでよいけど

```table.html
/* table#test>tr*3>td.sample1+td.sample2 */
<table id="test">
  <tr>
    <td class="sample1"></td>
    <td class="sample2"></td>
  </tr>
  <tr>
    <td class="sample1"></td>
    <td class="sample2"></td>
  </tr>
  <tr>
    <td class="sample1"></td>
    <td class="sample2"></td>
  </tr>
</table>
```
面倒くさいテーブルもすぐにできる。
 ` tableタグid=test  `  > ` trを3回繰り返す ` > ` tdタグclass=sample1` と ` tdタグclass=sample2 `
>
&gt; は小要素
+は隣接属性の追加

さっきのリストもそうだけど、+がないと単なる` <table></table>`になるので注意。

* グループ化

```priority.html
/* (ul>li*3)+h2+p */
<ul>
  <li></li>
  <li></li>
  <li></li>
</ul>
<h2></h2>
<p></p>

```
カッコで括らないと、ulの中にh2とpが括られるので注意


*  連番

```increment.html
/* (ul>li[class=test$]*3) */
<ul>
  <li class="test1"></li>
  <li class="test2"></li>
  <li class="test3"></li>
</ul>
```
>
` $ `は連番 


*  ラップ変換（Wrap with Abbreviation）
囲った範囲をタグで括れる。
IDEのショートカットキーの設定されている項目から
「Wrap with Abbreviation」に割り当てられているキーを確認
（参考にした情報と、自分の環境とのキーが異なっていたため。僕の環境だと`Ctrl`+`Command`+ `w`）   

括ってWrap with Abbreviationショートカットキー押すと、以下のダイアログが出るので、
括りたいタグを指定する（存在しないタグだと無理っぽい）
![スクリーンショット 2013-08-21 11.28.44.png](https://qiita-image-store.s3.amazonaws.com/0/27781/66171441-4beb-5672-796c-40f54d44f2fc.png)

```wrap.html

<div>テスト</div>
```
こうなる。
範囲が広いdivとか、あとからpなんか足したいときに便利そう。

<br />
>
* 参考サイト
//ぱせらんメモ 
http://d.hatena.ne.jp/pasela/20100223/zencoding

>
* 参考書籍
『HTML+CSSコーディングが10倍速くなるZen Coding 』　著こもり　まさあき 、岡部 和昌
Pythonでオブジェクトの内部構造を知る方法

常識かもしれんけどとりあえずメモ。

Pythonでサードパーティ製ライブラリを使ってるとき、ドキュメントが無くてクソアってなるときがある。

そんなときは慌てず騒がず

```py:qiita.py
import inspect
inspect.getmembers(object)
```

で使えるメソッドを調べる。
cronで実行時に環境変数を読み込む

# crontab

cronは大抵標準で入っていて特殊な設定も特になく使えるので便利ですが、コマンド実行時に通常のshellで読み込まれている環境変数が読み込まれません。

crontabの設定ファイル内で変数の指定が出来ますが、いちいち別箇所に定義してやるのも面倒。

なので

```shell-session:
* * * * * /bin/bash -l ruby script.rb
```

としてやれば、通常のlogin shellと同様に実行出来ます。

rubyのscript内で

```rb:
require 'activerecord'
require 'erb'

config = YAML.load(ERB.new(File.read('/path/to/config/database.yml')).result)
ActiveRecord::Base.establish_connection(config['production'])
```

とかしてyml内の`<%= SOME_VARIABLE %>`を読みだしていたのですが、環境変数が読み込まれていないためlocalhostに接続しようとして

```rb:
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) (Mysql2::Error)
```

が出ていました。何故ローカルホスト…？となってconfigをcron内で読み出すと接続情報がnilになっていて、それに気付くまで少しハマりました。

# 余談: cronのログ出力

初めは面倒で`> /dev/null 2>&1`してログを破棄していたのですが、コケたとしても何も残らない為デバッグの初動が遅れます。
と言うかログを捨てていたせいで何故動いていないのか（通常のshellだと動くので）に気付くまで時間がかかりました。

```shell-session:
* * * * * ruby script.rb 1>> /path/to/log/acript.log 2>> /path/to/log/script_err.log
```

としておけば `1>>`で標準出力が`2>>`でエラー出力が残ります。

こう言うの大事。

## 参考にしたリンク
[“/usr/bin/env bash” is not found when running from a cron script](http://superuser.com/questions/552337/usr-bin-env-bash-is-not-found-when-running-from-a-cron-script)
[crontabでrbenvのrubyを使う](http://shokai.org/blog/archives/7258)
[crontabからrvmとbundlerを使う](http://fatsumiyoshi.hatenablog.com/entry/2013/02/28/024915)
[crontabがどうしても動かないときに確認すべき3つの点+α](http://d.hatena.ne.jp/natsumesouxx/20100313/1268479064)
[cron力をつけよう！全てのcrontab入門者に贈る9個のテクニック](http://dqn.sakusakutto.jp/2012/06/cron_crontab9.html)
[crontabの使い方](http://www.omnioo.com/omnioolab/2012/03/crontab.php)
[cron(crontab)の簡単な使い方](http://d.hatena.ne.jp/satake7/20080615/p1)
[cron 実行時にログインシェル(bash)と同じ環境変数で動かしたい](http://blog.44uk.net/2012/07/16/cron-in-login-env/)
SWF の発音

Adobe 公式情報

[Adobe Flash Player 管理ガイド バージョン 1.0](http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/jp/devnet/flashplayer/articles/flash_player_admin_guide/flash_player_8_9_admin_guide.pdf) より引用

> Flash Player が使用する主要形式の SWF（「スウィッフ」と読みます）
perlのテンプレートエンジン、Text::Xslateの便利機能一覧１。


早そうで有名なXslateの小技。詳しくはperldocを参照してください。使い方しらないけれどとりあえず自己流の便利と思ったものを掲載してみます。

一応、[Text::Xslate::Bridge::Star](http://search.cpan.org/perldoc?Text%3A%3AXslate%3A%3ABridge%3A%3AStar)を使っているのが前提です。

##共通マクロのimport
```html:macro.tx
:macro multi_line -> $text {
  :my $list = split($text,rx('\r?\n') );
  :for $list -> $row {
    :$row;
    :if(!$~row.is_last) {
    <br />
    :}
  :}
:}

:macro pager ->$pager{
<ul class="pager">
    :for $pager.pages_in_navigation ->$page {
      <li>
      :if($page == $pager.current_page){
      :$page
      :}else{
      <a href="<:$c.url_with({page => $page}):>"><:$page:></a>
      :}
      </li>
    :}
</ul>
:}
```
```html:page.tx
:cascade with macro
:#$pagerはData::Page::Navigation
:pager($pager);
```
共通のマクロを1つのテンプレートに集めてcascade withで呼び出すとそれぞれのテンプレートで共通の関数が使えるようになります。

##DISPATCH処理
```html:dispatch.tx
:macro dispatch -> $name {
:my $dispatch = {
:	header => header,
:	nav1    => nav1,
: 	nav2    => nav2,
:	main    => main,
: 	footer  => footer
:}
: $dispatch[$name]();
:}
:macro header ->{}
:macro nav1 ->{}
:macro nav2 ->{}
:macro main ->{}
:macro footer ->{}

```
```html:cascade.tx
:cascade with dispatch;
:#dbから保存された表示順序を呼び出し
:# $display = ['header','nav1','main','nav2','footer']など
:for $display -> $name{
:dispatch($name);
:}
:
:override header {...}
:override main {...}
```
マクロをディスパッチ形式で書くことでDBやperl側で順序のソート、非表示、さまざまなパターンの記事を表現できます。
マクロは引数をつけなければブロックと同じように使えるはずなので引数なしではoverrideできます。用途によって使い分けれます。引数を使えば詳細記事を高度に書くこともできますし、呼び出しマクロとdispatch処理をわけてテンプレートごとにcascade withで分岐するとかいろいろ。

##マクロ、フィルタの応用

```html:macro.tx
: form(->{
<p><label>text２</label><input type="text" /></p>
<p><label>text３</label><input type="text" /></p>
:}() ,1)| fillin($q);

:macro form -> $block,$flag{
<form>
<p><label>text</label><input type="text" /></p>
:#フォームを拡張
:$block
:given $flag{
:#分岐パターン ログイン前／後いろいろな組み合わせ
:}
</form>
:}
```

HTML::FillInForm::Liteを使ったFormの充足処理とフォームのパターンを組み合わせた複雑な処理を簡単にします。

1つのHTMLに同じようで違う複数のパターンのフォームを書くことも多い（非表示分またはscript要素に書いてのJSでの生成など）ので、macroで大枠のフォームを書いて匿名マクロを引数で渡して複数のパターンを使えるようにして汎用性を高めます（overrideではすべて上書きされてしまう）。

fillin関数の設定は[Text::Xslate::Manual::Cookbook](http://search.cpan.org/perldoc?Text%3A%3AXslate%3A%3AManual%3A%3ACookbook)を参照してください。




##macroでスクリプト要素のHTMLのシンタックスカラーが表示されないのを回避

エディターでscript要素内にhtmlを書くとテキストとして扱われてシンタックスカラーがテキストカラーになったり、表示がおかしいわけではないですが気持ちが乗らないときがあります。blockのoverrideやマクロで書く位置を変えることでわかりやすくかけます。	

```html:script.tx
<!--  jsでテンプレート処理 -->
<!--  これはカラーリングされない-->
<script type="text/template">
<section>
<h1>テキストテキスト</h1>
</section>
</script>

<!--  マクロで展開 -->
<script type="text/template">
:template();
</script>

<!-- カラーリングされる -->
:macro template ->{
<section>
<h1>テキストテキスト</h1>
</section>
:}
```

##includeの挙動
includeで指定したテンプレートを実行して結果を展開するイメージ。
include($filename)とかdispatch的な処理ができたはずなのでそんな感じと勝手に思っています。
openコマンドでアプリケーションを指定（したらすごい！革命だ！）

Mac OS Xの中でもトップクラスの便利コマンド、 `open(1)` 。実はどのアプリケーションで開くかを指定できる。

```
Options: 
      -a                Opens with the specified application.
```

例えば、テキストファイルを開くときに確実にCotEditorを指定できたりする。なので下のようなエイリアスを作ったら、

```bash
alias cot="open -a CotEditor"
cot hoge.md
```

革命的に便利!!!!!!

### ちなみに

```
open -a C<Tab>
```

を押したらちゃんとアプリケーション名が自動補完される（当方zshユーザ）
DISK障害でCPU負荷が上がった

nagiosから警告
====

```
***** Nagios *****

Notification Type: PROBLEM

Service: Current Load
Host: localhost
Address: 127.0.0.1
State: CRITICAL

Date/Time: Wed Aug 21 11:05:57 JST 2013

Additional Info:

CRITICAL - load average: 7.00, 7.01, 6.97
```

サーバーにログイン
====

```bash:dmesg確認
$ dmesg -T | less
```

* /dev/sdbの認識の後、Call Trace: が表示されている。

```bash:logの確認
$ watch -d "ls -ltr /var/log/*log"
```

syslog に書き込みがどんどんされている。

```bash:/var/log/syslog
Aug 21 11:20:48 server udevd[635]: timeout: killing '/sbin/blkid -o udev -p /dev/sdb1' [2918]
Aug 21 11:20:48 server udevd[2916]: timeout: killing '/sbin/blkid -o udev -p /dev/sdb5' [2921]
Aug 21 11:20:48 server udevd[2915]: timeout: killing '/sbin/blkid -o udev -p /dev/sdb3' [2920]
Aug 21 11:20:48 server udevd[663]: timeout: killing '/sbin/blkid -o udev -p /dev/sdb2' [2919]
Aug 21 11:20:49 server udevd[2917]: timeout: killing '/sbin/blkid -o udev -p /dev/sdb6' [2922]
```

の組みがどんどん表示されている。

/dev/sdb が障害の様子。

----

# Calculate CPU load limit

* [Calculate CPU load limit on GNU/Linux | commandlinefu.com](http://www.commandlinefu.com/commands/view/15039/calculate-cpu-load-limit-on-gnulinux)

```bash:calc_la_limit.sh
echo "$(( $(( $(grep 'physical id' '/proc/cpuinfo' | uniq | wc -l) * $(grep 'core id' '/proc/cpuinfo' | wc -l) )) * 2 + 1 ))"
```

```bash:
$ ./calc_la_limit.sh
9
```
Bashにおける配列の定義

```bash:Bash
# 配列への格納は以下の2パターンで記述することが可能。
# パターン2の方が分かりよい形で記述できるが、途中項目を削除する場合には
# 添え字を詰めなければならない。
# 特に可変コンフィグ定義の場合はマニュアル上にも書きづらい。

# パターン1
ARRAY=(AAAAA BBBBB CCCCC)

# パターン2
ARRAY[0]=AAAAA
ARRAY[1]=BBBBB
ARRAY[2]=CCCCC

# ${#ARRAY[@]}、あるいは${#ARRAY[#]}で配列の要素数を確認できるため、
# 以下のように記述する事ができる。

# パターン3
ARRAY[${#ARRAY[@]}]=AAAAA
ARRAY[${#ARRAY[@]}]=BBBBB
ARRAY[${#ARRAY[@]}]=CCCCC

# 13/08/31追記
# インクリメントを利用して以下のようにも記述できる。"index"は任意の未定義文字列
# いっそiにしてしまえば見やすくはなる。
ARRAY[index++]=AAAAA
ARRAY[index++]=BBBBB
ARRAY[index++]=CCCCC

```
ufw

## 接続元IPの許可

```sh:
ufw status

# 1.2.3.4からのアクセスを許可
ufw allow from 1.2.3.4 to any
```


設定ファイル
====

|ファイル|説明|
|:--|:--|
| /etc/default/ufw | ufwの基本設定ファイル。ipv6有無,input,output,forward の設定 |
| /lib/ufw/user.rules | ufwコマンドで設定した内容がここに保存される。 |

/etc/ufw/applications.d/
----

アプリケーション名とポート番号定義。
複数ポートを使うアプリケーションや/etc/servicesに載っていないアプリケーションを使う時、ここで定義すると
`ufw app list`で一覧に載る。


コマンド
====

```bash:全アクセス禁止
ufw default deny
ufw allow 22
ufw enable
```

```bash:状態確認
ufw status
```

```bash:状態確認(ロギング設定・初期設定の表示)
ufw status verbose
```

```bash:追加(enableの時、即座に有効になる)
ufw allow in ssh
```

許可リスト追加
----

* アプリケーション名は`/etc/ufw/applications.d/` と `/etc/services` にあるもので登録可能。

```bash:
ufw allow proto tcp from 192.168.11.0/24 to any port 22
ufw allow ssh
ufw allow 80/tcp
ufw allow ftp
ufw allow https
ufw allow from 192.168.11.0/24
ufw allow 5000/tcp
ufw allow 60000:61000/udp
```

```bash:applist
ufw app list
ufw allow Samba
ufw allow from 192.168.11.0/24 to any app Samba
```

許可リスト削除
----

```bash:
ufw delete allow 22

ufw delete allow from 192.168.11.0/24

# もしくは、登録番号を確認して削除
ufw status numbered
ufw delete 1
```

ログ
====

```bash:
ufw logging on
tail -f /var/log/ufw.log
ufw logging off
```

ipv6のufwを無効
====

```diff:
vim /etc/default/ufw
- IPV6=yes
+ IPV6=no
```

ファイアウォールを再読込
====

```bash:
ufw reload
もしくは
/etc/init.d/ufw restart
```

dry-run
====

```bash:
ufw --dry-run delete allow 22
ufw --dry-run status
ufw --dry-run disable
```
PHPで日付比較の簡単なヤツ

if (date("Y-m-d 00:00:00") >= "2013-08-13 00:00:00") {
 echo "盆休みって都市伝説でしょ？";
}

以上。

ふと忘れて調べたら
strtotimeやらタイムスタンプやら
ごちゃごちゃ書いてるのが多かったので。

ぁ、日本以外だと、たぶんそのままではダメなんでいい感じにグリグリしてください。
EmacsのPython開発環境構築メモ

emacswikiの文書をもとに設定を行う。
http://www.emacswiki.org/emacs/PythonProgrammingInEmacs

どれもこれもpymacsを要求してくるので適宜インストールする。
Ubuntuでは、```apt-get install pymacs```でインストールできる。

- Emacs for Python
- Elpy
- Ropemacs

の三種類が紹介されている。とりあえずropemacsは面倒くさそうだったので
他の2つを試してみた。

# Emacs for Python

インストールはちょっとハマったが、このEmacs for Pythonの仕組みをわかっていないだけであった。
これは、Emacsを完全にPythonの開発環境に変更するもので、Emacs自体を大きく変更する。
使うなら専用のEmacsを用意したほうが良いだろう。
既にある他のEmacs資産などの兼ね合いもあるので、導入は見送った。
なお、完成して出来た環境はとても使いやすそうであった。

- rope
- autocomplete
- yasnippets

などとの連携も特に問題なくできていた

# Elpy

インストール自体に少し手こずった。
まずpython.elが自分の環境では想定と違うものが使われているため上手く動かず。

自分の環境ではこれが使われている(emacs標準)
http://www.loveshack.ukfsn.org/emacs/python.el

想定しているのはこちらだった模様
https://github.com/fgallina/python.el

なので```(require 'python)```するときには注意が必要である。

imenuが上手く動かないので

```
(semantic-mode 1) 
(add-hook 'python-mode-hook
  (lambda ()
    (setq imenu-create-index-function 'python-imenu-create-index)))
```

このように設定して、動作するように修正したところ、特に問題なく使えた。

- rope
- autocomplete
- yasnippets
- imenu
- nose

などとの連携も問題なく動作した。