OmniAICreator/Qiita-1.07M huggingface dataset:
MySQL DBのコネクション数の確認とか


mysql クライアント等で以下を実行

## 現在の接続しているスレッド数

```sql
mysql> show status like 'Threads_connected';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 3     |
+-------------------+-------+
1 row in set (0.00 sec)
```

あるいは SELECT文 で

```sql
> SELECT * FROM information_schema.PROCESSLIST;
```


## プロセスリスト（処理中の接続）を表示する

```sql
mysql> show processlist;
+------+------+-----------------+---------------------------+---------+------+-------+------------------+
| Id   | User | Host            | db                        | Command | Time | State | Info             |
+------+------+-----------------+---------------------------+---------+------+-------+------------------+
|   68 | root | localhost:36562 | hogehogehogehogehogehogeh | Sleep   |   30 |       | NULL             |
|   69 | root | localhost:36563 | NULL                      | Sleep   |   40 |       | NULL             |
| 2268 | root | localhost       | hogehogehogehogehogehogeh | Query   |    0 | init  | show processlist |
+------+------+-----------------+---------------------------+---------+------+-------+------------------+
3 rows in set (0.00 sec)
```

## 不要なコネクションをkill

```sql
mysql> kill 69;
Query OK, 0 rows affected (0.00 sec)
```

## 60秒以上経過しているコネクションを抽出

RDS の場合'rdsadmin'は除外

```sql
mysql> SELECT * FROM information_schema.PROCESSLIST WHERE time >= 60 and user != 'rdsadmin';
```

そのIDをカンマ区切りで抽出

```sql
mysql> SELECT GROUP_CONCAT(id) FROM information_schema.PROCESSLIST WHERE time >= 60 and user != 'rdsadmin';
```

まとめて kill 

```console
$ mysqladmin kill xx,xx,xx -h host -u user -p
```


## （おまけ）起動してからの累積接続数

```sql
mysql> show status like 'Conn%'; 
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Connections   | 85    |
+---------------+-------+
1 row in set (0.01 sec)
```

## （おまけ）プライマリ/レプリカの判別

```sql
SHOW GLOBAL VARIABLES LIKE 'innodb_read_only';
```

プライマリは OFF, レプリカは ON


### 参考
* [MySQL show status - show open database connections](http://alvinalexander.com/blog/post/mysql/how-show-open-database-connections-mysql)

* [プロセスを強制終了する - MySQL 逆引きリファレンス](http://mysql.javarou.com/dat/000580.html)
* [MySQLで処理に長時間かかっている複数クエリをまとめて殺す方法](http://tech.basicinc.jp/MySQL/2014/04/06/mysql_processlist_kill/)
*
cURLでRedmineのIssueを更新する

```sh
curl [REDMINE_HOME]/issues/[ID].json?key=xxxxxxxxxxxxxxxxxxxxxxxxxxxx  -H "Accept: application/json" -H "Content-type: application/json" -X PUT -d '{"issue": {"subject": "IF_YOU_NEED_TO_CHANGE_SUBJECT","notes": "UPDATE_MESSAGE" }}' -k
```

-d 以降のJSONで　Subjectとnotesを変更可能。issueを更新したいだけならnotesのjsonだけ
にすれば良い。(だいたいそれでOKだと思われる)

-k はオレオレSSL証明書の場合無視するためのもの
tailの結果などに色付けする


事前に`gem smart_colored`で必要なgemをインストールしておく。

bashrc などで以下のようにalias を定義する。

```bash:
alias hi="ruby -r'smart_colored/extend' -e 'while l = STDIN.gets; puts l.gsub(Regexp.new(ARGV[0]), \"\\\\0\".red); end'"
```

以下のように使う

```
$ tail -f log/hoge.log | hi Hoge
```

のように実行すると、`Hoge`というキーワードが赤く色づけされて出力される。
linuxの時間がおかしいから直した

linux(debian lenny)の時間がなんかおかしい。けどntpdは動いてる。

```
[$] <> ps aux | grep ntpd
ntp      22190  0.0  0.0   4156  1268 ?        Ss   15:02   0:00 /usr/sbin/ntpd -p /var/run/ntpd.pid -u 108:109 -g
2001     22479  0.0  0.0   4996   788 pts/7    S+   15:05   0:00 grep ntpd
```

まずntpdをストップ

```
[$] <git:(master)> sudo  /etc/init.d/ntp stop                                                                                                                                                                                                                                   
Stopping NTP server: ntpd.
```

時間を合わせる

```
[$] <git:(master)> sudo /usr/sbin/ntpdate ntp.nict.jp
19 Nov 15:02:40 ntpdate[22143]: step time server 133.243.238.244 offset -32205.637181 sec
```

この時点で時間は直った。
ntpdを再起動する

```
[$] <git:(master)> sudo  /etc/init.d/ntp start
Starting NTP server: ntpd.
```

おｋ。

ぐぐったところ/etc/init.d/ntpdを動かすドキュメントが出てきたけど、ディストリビューションによって違うんだと思う。

参考
ntpd の起動と動作確認　http://www.turbolinux.co.jp/products/server/11s/user_guide/x6278.html
NTP サーバ一覧 http://www.venus.dti.ne.jp/~yoshi-o/NTP/NTP-Table.html
Rails3のwhereのいろいろな使い方。

＊MySQLのLIKE検索

```ruby:xxx.rb
User.where("name like?","%sato%")
```

＊既存の別配列からの検索

```ruby:xxx.rb
Topic.where("id in (?) or user_id in (?)", topic_id_list, user_id_list)
```

＊null以外の検索

```ruby:xxx.rb
Topic.where("user_id IS NOT NULL")
```

＊日付を指定したの検索（3日前~5日前の場合）

```ruby:xxx.rb
t1 = Time.now - 5.day
t2 = Time.now - 3.day
Topic.where(["created_at >= ? AND created_at <= ? " , t1 , t2])
```
ドメイン名やXOOPS_URLの変更時に使う HTML一括置換preload


ドメイン変更やXOOPSインストール先の階層変更等でXOOPS_URLを変更することがあります。

そんなときにDBに保存されてるコンテンツのURLもダンプデータを一括置換等するのですが、いろいろ事情があってダンプデータの置換ができないときにhtmlの置換preloadでしのいだことがあります。

仕組みとしてはSmartyのOutputフィルタプラグインを使ってるだけです。


XOOPS_ROOT_PATH/preload/htmlReplace.class.php

```php
<?php
if (!defined('XOOPS_ROOT_PATH')) exit();

class htmlReplace extends XCube_ActionFilter
{
	function preFilter()
	{
		$this->mRoot->mDelegateManager->add('XoopsTpl.New', array( &$this , 'xoopsTplHook' ) ) ;
	}

	function xoopsTplHook( &$xoopsTpl )
	{
	    $xoopsTpl->register_outputfilter("htmlReplaceFilter");
	}
}

function htmlReplaceFilter($tpl_output, &$smarty)
{
	// ここで置換
    $replaced = preg_replace('/http:\/\/old_domain\.com/', 'https://new_domain.com', $tpl_output);
    return $replaced;
}
```
関手の合成と自然変換の水平合成


もう眠いので http://d.hatena.ne.jp/hiratara/20121118/1353252127 から要点だけ抜粋。

関手の合成はf gって書いてFunctorになってくれればありがたいのにそうもいかないのでこれ使う。

http://hackage.haskell.org/packages/archive/transformers/0.2.2.0/doc/html/Data-Functor-Compose.html

自然変換の水平合成はライブラリ見つけられなかったので誰か教えて下さい。。。

自分で書いたらこうなった。

```haskell
natComp :: (Functor m1, Functor m2, Functor m3, Functor m4) =>
           (forall a.m1 a -> m2 a) -> (forall a.m3 a -> m4 a)
                                           -> (forall a.m3 (m1 a) -> m4 (m2 a))
s `natComp` t = (fmap s) . t
```
MeteorからNode.jsのrequireを利用する


Meteor
http://meteor.com/

bootstrapすれば良いらしいです。meteorで出来ることが広がります。
例えばシステムコマンド実行やIPアドレス取得は以下のような感じ。

```
Meteor.methods({
    show_files: function(){
        var exec = __meteor_bootstrap__.require('child_process').exec;
        exec('ls -l ./', function(err, stdout, stderr){
            console.log(stdout);
        }); 
    },  
    show_ip_address: function(){
        __meteor_bootstrap__.require('dns').lookup(
            __meteor_bootstrap__.require('os').hostname(), function (err, addr, fam) {
                console.log('server ip address : ' + addr);
            }   
        )   
    }   
});
```

気軽にサクッとアプリ作るのにMeteor良いですよね！
検索エンジンにインデックスさせない方法(robots.txt)


```robots.txt
User-Agent: *
Disallow: /
```

*(ワイルドカード)はすべての検索エンジンが対象。
Disallowでクロールさせないページを指定。
上記の場合はサイト全体が範囲。例えばabc.htmlやabcディレクトリのみクロールさせない場合は下記のような記述

```robots.txt
User-Agent: *
Disallow: /abc.html
Disallow: /abc/
```
AFMotionでWeb APIを実行する。


[AFMotion](https://github.com/clayallsopp/afmotion)は``AFNetworking``の``rubymotion``用ラッパ。
お手軽にAPIを使えるのが良さげ。試しにQiitaのAPIを実行してみる。

##インストール

```sh
bundle init
```

```ruby:Gemfile
gem 'afmotion'
```

```sh
bundle install
```

```ruby:Rakefile
require 'bundler'
Bundler.require

Motion::Project::App.setup do |app|
  app.name = 'hoge'
  app.pods do
    pod 'AFNetworking'
  end
end
```

##設定

APIのベースとなるURL、およびやり取りに``JSON``を使うことを指定。

```ruby
AFMotion::Client.build_shared('https://qiita.com/api/v1') do
  header "Accept", "application/json"
  operation :json
end
```

##実行

検索を実行してみる。

```ruby
AFMotion::Client.shared.get('search', {'q' => 'ruby'}) do |result|
  if result.success?
	p result.content
  elsif result.failure?
    p result.error.localizedDescription
  end
end
```

``shared``は``build_shared``で指定されたURLをベースとして対象のURLを構築して実行する。
この場合、``https://qiita.com/api/v1/search?q=ruby``が対象のURLとなる。

``result.content``の形式は``operation``で指定した値によって変化する。詳細は下表の通り。


|operation|結果の形式|
|:--|:--|
|json|Hash, Array|
|PLIST|Hash, Array|
|XML|NSXMLParser|
|HTTP|NSURLResponse|


##おまけ

###画像を表示する

```ruby
@image = UIImageView.alloc.initWithFrame([[10, 100], [160,160]]).tap do |v|
  v.url = 'http://hoge/fuga.jpg'
end
```
macのlocalにインストールしたapache2,php5,mysqlの設定


```Bash

MacBookAir:bin tomoyuki$ sudo -u _mysql /opt/local/bin/mysql_install_db5 
Installing MySQL system tables...
OK
Filling help tables...
OK

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

/opt/local/lib/mysql5/bin/mysqladmin -u root password 'new-password'
/opt/local/lib/mysql5/bin/mysqladmin -u root -h MacBookAir.local password 'new-password'

Alternatively you can run:
/opt/local/lib/mysql5/bin/mysql_secure_installation

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the manual for more instructions.

You can start the MySQL daemon with:
cd /opt/local ; /opt/local/lib/mysql5/bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl
cd /opt/local/mysql-test ; perl mysql-test-run.pl

Please report any problems with the /opt/local/lib/mysql5/bin/mysqlbug script!

```
bashのプロセス置換


bashのプロセス置換を使ってみてるけど仕組みを理解してないのでよくわからん

これは動いた

```bash
bash-3.2$ cat <(ls)
```

これも動いた

```bash
bash-3.2$ f(){ p=<(ls); cat $p; }; f
```
これはだめ

```bash
bash-3.2$ p=<(ls); cat $p
cat: /dev/fd/63: Bad file descriptor
```

変数に代入とか，やらないほうがいいのか

## 試した環境
* Mountain Lionのbash(3.2.48)
SketchUpのジオロケーションで401エラーが発生したら

macのSketchUpで、モデルをジオロケートする際、401エラーが発生した時の対処法です。

safariでGmailにログインすると、ジオロケートできるようになるようです。

［今回試した環境］
mac OS X バージョン： 10.8.2
SketchUp バージョン： 8.0.4810
アプリケーションのイベント一覧を取得


例えば「これってAppleScriptで出来るのかなー」と思った時に、そのアプリケーションの持ってるイベントや属性を参照したくなることがままあります。

普通はAppleScriptエディタの「ファイル」->「用語説明を開く…」からアプリケーションの一覧を開いて選択していると思います。しかし、このダイアログの使い勝手がいいとはお世辞にも言いがたく、アプリケーションの数が増えてくると、目的のブツを探すだけで大変です。

そこで、実はもっと簡単に用語説明を開く方法があったりするのです。やりかたは簡単で、DockのAppleScriptエディタのアイコンの上に、用語説明を見たいアプリケーションをD&Dするだけです。FinderやSpotlightなら目的のアプリケーションを探すのは(用語説明を開くダイアログよりは)容易なはずです。

注意点としては、用語説明を見たいアプリケーションはDockからではなくFinderから(大体の場合はアプリケーションフォルダから)引っ張ってくる必要がある点です。
ApexTriggerの判定方法

■BeforeTriggerか判定

```Apex:Apex
if (Trigger.isBefore) { }
```


■AfterTriggerか判定

```Apex:Apex
if (Trigger.isAfter) { }
```


■InsertTriggerか判定

```Apex:Apex
if (Trigger.isInsert) { }
```


■UpdateTriggerか判定

```Apex:Apex
if (Trigger.isUpdate) { }
```


■DeleteTriggerか判定

```Apex:Apex
if (Trigger.isDelete) { }
```


■UnDeleteTriggerか判定

```Apex:Apex
if (Trigger.isUnDelete) { }
```
C#で、文字コードを表す文字列から、文字に変換する

定数ではなく変数で扱いたい場合に若干調べるのに時間がかかったのでメモ。

"304C" -> "が" のように、
Unicode文字コードを表す文字列から文字に変換したい場合、
Convert クラスを使用します。

```csharp:sample.cs
string charCode = "304C";
int charCode16 = Convert.ToInt32(charCode,16);  // 16進数文字列 -> 数値
char c = Convert.ToChar(charCode16);  // 数値(文字コード) -> 文字
string newChar = c.ToString();    // "が" という「文字列」
```

# 参考

* [文字と文字列を変換するには？［C#、VB］ － ＠IT](http://www.atmarkit.co.jp/fdotnet/dotnettips/899charstring/charstring.html)
* [16進数、8進数、2進数の文字列を整数に変換する: .NET Tips: C#, VB.NET](http://dobon.net/vb/dotnet/programing/converthex.html)
chromeやsafariでglobalCompositeOperation="darker"としたときの合成を他ブラウザで再現する

```javascript
function darker(src, dst, globalAlpha)
{	
	var w,h;
	
	if(src.width > dst.width)
	{
		w = src.width;
	}
	else
	{
		w = dst.width;
	}
	
	if(src.height > dst.height)
	{
		h = src.height;
	}
	else
	{
		h = dst.height;
	}

	var ctx1 = src.getContext("2d");
	var canvas = document.createElement("canvas");
	canvas.setAttribute("width", w);
	canvas.setAttribute("height", h);
	ctx2 = canvas.getContext("2d");
	ctx2.drawImage(src, 0, 0);

	var canvas2 = document.createElement("canvas");
	canvas2.setAttribute("width", w);
	canvas2.setAttribute("height", h);
	ctx3 = canvas2.getContext("2d");
	ctx3.drawImage(dst, 0, 0);

	var result = ctx2.getImageData(0, 0, w, h);
	var blend  = ctx3.getImageData(0, 0, w, h);
	var alpha;

	for(var data = result.data, blend = blend.data, i = 0 ; i < data.length ; i+=4)
	{
		if(typeof globalAlpha !== "undefined") gA = globalAlpha * 1;
		else gA = 1;
		
		alpha = blend[i+3] * gA;
		alpha = alpha / 255;

		if(data[i] == 0 && data[i+1] == 0 && data[i+2] == 0 && data[i+3] == 0)
		{
			data[i] = blend[i] * alpha, data[i+1] = blend[i+1] * alpha, data[i+2] = blend[i+2] * alpha, data[i+3] = 255;
		}
		else
		{
			data[i] = ((data[i]) * (1 - alpha) - (blend[i]) * alpha);
			data[i+1] = ((data[i+1]) * (1 - alpha) - (blend[i+1]) * alpha);
			data[i+2] = ((data[i+2]) * (1 - alpha) - (blend[i+2]) * alpha);
			data[i+3] = 255;
		}
	}
	
	ctx1.putImageData(result, 0, 0);
	
	return src;
}
```
NSArray, NSMutableArrayの高速列挙は順序を保証"する"

保証しない、という情報をずっと信じていた恥ずかしい私をどうかお許しください。
今回のこの勘違いは、
ブログ等を安易に信じてはいけない、という教訓になりました。
昔のSDKのバグが原因なのか、一定量この情報が流れているきがします。

きちんと公式に書いてありました。信ずるべきは公式ドキュメントです。ブログではありませんね。
https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html

- (NSEnumerator *)objectEnumerator
Return Value
An enumerator object that lets you access each object in the array, in order, from the element at the lowest index upwards.

Discussion
Returns an enumerator object that lets you access each object in the array, in order, starting with the element at index 0, as in:

```
NSArray *array = <#Get an array#>;
NSUInteger index = 0;
 
for (id element in array) {
    NSLog(@"Element at index %u is: %@", index, element);
    index++;
}
```

なので安心して使いましょう。
Mercurial フックを使ってコミットしちゃいけないキーワードが含まれてるとコミットできないようにする

* 2012-11-21 ファイルを削除した時、例外を出してコミットできない状態になってしまうバグを修正しました

binding.pryやデバッガのブレークポイントなど、コミット前に削除すべきキーワードがあります。
こういうコミットしてはいけないキーワードが含まれてたら、コミットに失敗するようにする、
Mercurialの設定を紹介します。

* フックメソッドを定義します。

```python:~/.hg/prevent_ngword.py
from mercurial import hg, ui, util

ng_words = ['binding.pry', 'DONTCOMMIT']

def hook(ui, repo, **kwargs):
  current_context = repo[None]
  for file_name in current_context.files():
    if (not file_name.endswith('.rb')) and (not file_name.endswith('.erb')) and (not file_name.endswith('.haml')):
      continue
    file_context = current_context.filectx(file_name)
    try:
      file_context.size() # for file exists check
    except:
      continue

    file_data = file_context.data()
    for ng_word in ng_words:
      if ng_word in file_data:
        raise util.Abort("File %s contains forbidden string %s" % (file_name, ng_word))
  return False

```

* ~/.hgrc に以下の記述をしてください。

```hgrc:.hgrc
[hooks]
precommit.prevent_ngword = python:~/.hg/prevent_ngword.py:hook
```

~/.hgrcではなくて、リポジトリ直下の .hg/hgrc に書いてもOKです。
ファイル名の制限とかNGワードの定義は適宜書き換えてください。

以上です。

このTipsは、https://gist.github.com/1183543 のコードをほぼ丸々いただいて、説明補足したものです。
ICU を Emscripten で使う方法

やや無理矢理な方法を行う必要があるが、ICU を emscripten 上でもビルドすることが可能である。

## 1. ホスト環境でビルド

まずクロスビルド環境でビルドする必要が有るため、事前に icu をホスト環境でビルドしておく。ホスト環境は MacOSX とする

```bash
mkdir build
cd build
../source/runConfigureICU MacOSX
```

## 2. tool 系をいくつか黙らせる

以下のツールは emscripten では正しくビルドできないため、Makefile.in を置換してビルドしないようにする。

 - toolutils
 - genccode

元の Makefile.in は一旦リネームして以下の内容で何もさせないようにする

```makefile
all:
clean:
```

## 3. U_TIMEZONE を書き換える

クロスビルドのために Linux ベースでビルドさせるが、__timezone ではなく emscripten が定義している _timezone に書き換える

```diff
@@ -116,7 +116,7 @@
 #elif U_PLATFORM == U_PF_ANDROID
 #   define U_TIMEZONE timezone
 #elif U_PLATFORM_IS_LINUX_BASED
-#   define U_TIMEZONE __timezone
+#   define U_TIMEZONE _timezone
 #elif U_PLATFORM_USES_ONLY_WIN32_API
 #   define U_TIMEZONE _timezone
 #elif U_PLATFORM == U_PF_BSD && !defined(__NetBSD__)
```

## 4. ビルド

emconfigure と emmake を使ってビルドする

```bash
/path/to/emscripten/emconfigure \
  ../source/configure \
  --enable-static \
  --disable-shared \
  --disable-icuio \
  --disable-layout \
  --disable-tests \
  --disable-samples \
  --with-data-packaging=files \
  --build=i686-pc-linux-gnu \
  --with-cross-build=`pwd`/../build
/path/to/emscripten/emmake make
```

ビルドしたら lib ディレクトリに libicui18n.a と libicuuc.a があることを確認する。

## 5. つかう

files で指定しているため、UnicodeString を使用する前にデータを読みこませる必要がある。そのためには icudt[xx].dat を読み出し、[udata.h にある udata_setCommonData](http://www.icu-project.org/apiref/icu4c/udata_8h.html#a467bda719595adb58f959dde735e1153) を使って設定すればよい。

```cpp
// icudt[xx]l.dat を何らかの方法で読み出し、bytes 変数にメモリ上に配置する
UErrorCode code;
udata_setCommonData(bytes, &code);
if (U_SUCCESS(code)) {
  // 読み込みに成功したら UnicodeString を使用する
}
else {
  // 読み込みに失敗したらエラー処理を行わせる
}
```

emscripten には[仮想ファイルシステムの仕組みを持っている](https://github.com/kripken/emscripten/wiki/Filesystem-Guide)ので、コンパイル時に icudt[xx]l.dat を --embed-file 引数に渡して組み込み、STDIO で読み出して上のコードでやれば JavaScript でも ICU 使って高度な文字コード変換が可能になる。
ICU のライブラリサイズを削減する方法

[ICU](http://site.icu-project.org/) とは Unicode 関連の処理をまとめたクロスプラットフォームでポータブルな、そして実績があり [MITライセンス](http://userguide.icu-project.org/icufaq#TOC-How-is-the-ICU-licensed-) と組み込みにやさしいライブラリである。

ICU の変換や正規化などに使われるリソースデータは 20MB と大きく、再配布するアプリケーションには大きな足かせとなる。これを削減したい場合はどうすればよいだろうか？

答えは公式の FAQ にのっている。これに基づいて削減してみよう。
http://userguide.icu-project.org/icufaq#TOC-How-can-I-reduce-the-size-of-the-ICU-data-library-

## 1. ICU Data Customizer を使う

ICU Data Customizer は ICU で使われる変換テーブル、正規化ルールなどを必要に応じてカスタマイズし、データを生成してダウンロードできる便利なサービスである。
http://apps.icu-project.org/datacustom/

バージョン毎に異なるので、古い ICU のバージョンを使っている場合はそれに対応するものを使う必要がある。例えば ICU 49 なら以下を使う。
http://apps.icu-project.org/datacustom/ICUData49.html

デフォルトでは圧縮なしで約 20MB あることがわかる。ここでは ShiftJIS <=> UTF-8 の変換だけ行うというニーズをやってみる。

> The estimated uncompressed size of this data library is 19195 KB

まず変換テーブル (Charset Mapping Tables) だけ残し、残りのチェックを外す。これだけでなんと約 25% になる。

> The estimated uncompressed size of this data library is 4696 KB

つぎに一旦変換テーブルのチェックを外し、ShiftJIS 関連にチェックを入れる（もしかしたら ibm-943_P15A-2003 だけでよいかもしれない）。

 - ibm-942_P12A-1999.cnv
 - ibm-943_P130-1999.cnv
 - ibm-943_P15A-2003.cnv
 - ibm-5039_P11A-1998.cnv

すると 500KB 程になり、元の約 20MB に比べると約 40 倍の差が出た。これで "Get Data Library" ボタンをクリックするとダウンロードできるようになる。

> The estimated uncompressed size of this data library is 503 KB

ちなみに一度ダウンロードすると 410 で再ダウンロードは出来ないので、再ダウンロードしたい場合はもう一回 "Get Data Library" で再生成しておく必要がある。また、UTF-8/UTF-16 はコアにバンドルされているため問題ない。

## 2. ファイルを置換してビルドする

その前に置換前の icudata ライブラリを確認してみよう。ダウンロードしてすぐ `../source/runConfigureICU MacOSX` した場合はサイズは約 20MB あることがある。

```bash
-rwxr-xr-x  1 hkrn staff 20787296 libicudata.50.1.dylib
```

話に戻って入手したデータは ICU のソースコード中の icu/data/source/data/in/icudt[xx]l.dat ([xx] は ICU のバージョン) と置換し、もう一度ビルドする。そしてサイズを確認すると 520KB 程度になっていることがわかる。

```bash
-rwxr-xr-x  1 hkrn staff  520288 11 17 libicudata.50.1.dylib
```

文字コードを変換するだけなら通常 icuuc と先ほどの icudata のみでよく、必要に応じて icui18n をリンクする。前者の場合静的リンクしても 2MB 程度になり、小型化を図ることが出来る。
Clojureで文字列を反転する

文字列の反転にはreverseが使えけど、結果型がcharのシーケンスになってしまうので、繋げる必要がある。

```clj
(let 
  [rev-str (reverse "foobar")]
    (reduce str 
      (first rev-str) 
      (rest rev-str)))
```

もっと1発で繋げられる方法ないかな？

---
##追記
tnoda_さんに情報頂きました

```
(apply str (reverse "foobar"))
```

もしくは、

```
(clojure.string/reverse "foobar")
```
vimの連続コピペできない問題

# vimの連続コピペできない問題

## 概要
### コピーしておいた文字列を任意の単語や文章の代わりにペーストしたい

このヒドイ文章のtypoを、修正したい

```ruby
def hoge
  text = "A long time ago in a galaxy far far away"
  puts test1    # => puts text
  puts xtex2   # => puts text
  extt3_array = twxt4.split(" ") # => text_array = text.split(" ")
  puts txet5.gsub(" ", "¥n")       # =>  puts txet.gsub(" ", "¥n") 
end
```

textをヤンクして、txet xtex extt twxtの箇所にペーストしてやれば良い。
こういうとき、最初のtestをvisualモードで選択してペーストして、次のtxetも同様にペーストしようとすると思います。

## 問題
visualモードで選択したあとに、ヤンクした文字をペーストするとその置き換えた文字がヤンクされてしまい2回目同じようにしようとすると、前回置き換えた文字がペーストされてしまう。

このザマだよ！

```ruby
def hoge
  text = "A long time ago in a galaxy far far away"
  puts text    # ココは直せてる
  puts test1   # => puts text
  xtex2_array = extt3.split(" ") # => text_array = text.split(" ")
  puts twxt4.gsub(" ", "¥n")       # =>  puts txet.gsub(" ", "¥n") 
end
```

## 解決策
visualモードで置き換えたい文字を選択した後、「p」でペーストするかわりに  

####「"0p」 
でペーストする（0のレジスターを使用する）

### でもめんどくさいじゃないですか〜
 そこでこの設定

```vimrc
vnoremap <silent> <C-p> "0p<CR>
```

### これで Ctrl-p で連続して貼り付けれるようになったぁ

## まとめ

*  visualモードで選択して「Ctrl-p」で貼り付けれるようになったぁ。
* 何回やっても同じ内容をペーストできるようになった。
* コードを書く効率があがったぁー

ながらく探し求めていた方法が、０番のレジスターを使い、それに対してキーマッピングするだけで解決するとは思ってもなかったので自分のvim弱さを痛感している。
mavenでdependencyを自動的に更新


versionsプラグインを使うと簡単にチェックすることができます。
http://mojo.codehaus.org/versions-maven-plugin/

まず、プロジェクトのpom.xmlに以下を追記します。

```xml:pom.xml
  …
  <pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>versions-maven-plugin</artifactId>
        <version>1.3.1</version>
      </plugin>
    </plugins>
  </pluginMangement>
  …
```

この状態で、以下のコマンドを実行すれば、pom.xmlを勝手に最新のライブラリバージョンが入ったものに更新してくれます。

```sh:
$ mvn versions:use-latest-versions
```

勝手に更新されては困るという場合は、更新があるかどうかの確認だけをすることもできます。

```sh:
$ mvn versions:display-dependency-updates
…(省略)…
[INFO] The following dependencies in Dependencies are using the newest version:
[INFO]   com.google.code.findbugs:jsr305 ................................ 2.0.1
[INFO]   com.google.guava:guava ........................................ 13.0.1
[INFO]   commons-codec:commons-codec ...................................... 1.7
[INFO]   org.apache.commons:commons-lang3 ................................. 3.1
[INFO] 
[INFO] The following dependencies in Dependencies have newer versions:
[INFO]   junit:junit ............................................. 4.10 -> 4.11
[INFO]   org.apache.httpcomponents:httpclient .................. 4.1.3 -> 4.2.2
[INFO]   org.codehaus.jackson:jackson-core-asl ................ 1.9.5 -> 1.9.11
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 15.768s
[INFO] Finished at: Sat Nov 17 15:08:50 JST 2012
[INFO] Final Memory: 9M/148M
[INFO] ------------------------------------------------------------------------
```

依存するライブラリが多いと数分以上かかる事もあるのでご注意を。
末尾再帰かどうかはIDEに見分けさせる


末尾再帰したらいいのはわかってる。わかってるんだけど、末尾再帰になってないのを見落とさないのは難しい、っていうのが普通の人なので、IntelliJ Idea を使うと幸せになれるらしい。

## これはただの再帰

```scala
def fuga(xs:Seq[String]):String = xs match {
  case x :: Nil => x
  case x :: tail => x + "\n" + fuga(tail)
}
println(fuga(List("a","b","c")))
```

よく考えたら最後に評価されるのが `+` メソッドになる。

## これが末尾再帰

```scala
def hogehoge(tmp:String)(xs:Seq[String]):String = xs match {
  case x :: Nil => tmp + x
  case x :: tail => hogehoge(tmp + x + "\n")(tail)
}
val hoge = hogehoge("")_
println(hoge(List("a","b","c")))
```

IntelliJ でこれ書き比べたら違うアイコンが付くので感動したらいいと思いますね。
MySQLとPDOの組み合わせでcharsetを指定する

mysql関数の場合は[mysql_set_charset関数](http://jp.php.net/manual/ja/function.mysql-set-charset.php)でOK。

PDOでMySQLを使う場合は、[PHP 5.3.6からDSNでcharsetを指定できるようになっている](http://www.php.net/manual/ja/ref.pdo-mysql.connection.php)ので、PDOのインスタンスを作るときにcharsetをきちんと指定してあげる。

```php
<?php
$pdo = new PDO(
    'mysql:host=yourhost;dbname=yourdb;charset=utf8mb4',
    'user', 'password'
);
```

PHP 5.3.6より前のバージョンをどうしても使わなければいけない場合は次のようにする。

```php
<?php
$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4',
); 
$pdo = new PDO(
    'mysql:host=yourhost;dbname=yourdb',
    'user', 'password', $options
);
```
いつの間にかPHPのマニュアルに[MySQLの文字セット指定についてのページ](http://www.php.net/manual/ja/mysqlinfo.concepts.charset.php)が追加されてた。
Xcodeのコマンドラインツールを入れる


この情報は古くなっています。Mavericks以上の環境では[Mac - Xcodeのコマンドラインツールを入れる (Xcode 5.0) - Qiita](http://qiita.com/xtetsuji/items/f373cb10412c68d046a1)を参考にしてください。

# Xcode4.3からの変更

Xcode4.2からバージョンアップしたら、以前導入したコマンドラインツールが使えなくなったのでメモ。

情報は**Xcode4.5.2**が最新バージョンの**2012年11月現在**です。

参考URL:

* [Xcode 4.3はコマンドラインツールが別に配布されるようになったらしい - 作業ログとかをメモする場所。 - mkdirグループ](http://mkdir.g.hatena.ne.jp/ymrl/20120226/1330222634)

Xcode4.2以前はコマンドラインツールが同梱されていて、"/Developer" 以下にそれらが入っていたが、Xcode4.3以降はXcode本体にコマンドラインツールが同梱されなくなり、別途導入する必要がある。

Xcode4.2をアンインストールすると、"/Developer" は "/Developer-old" に名前を変えて避けられていることが分かる(アンインストール時の質問への回答によっても変わるかも)。"Developer-old" は 20MB 程度だった。

上記URLでは、実はXcode4.3以上にもコマンドラインツールは "/Application/Xcode.app/Contents/Developer/usr/bin" 以下に同梱されているが、別途 "Command Line Tools for Xcode" の導入を勧めているのでそうすることにする。

ちなみに、コマンドラインツールはディスクの肥やしになっているかといえば、そうでもない。

> $ du -sh /Applications/Xcode.app/Contents/Developer/usr/bin/
> 7.9M	/Applications/Xcode.app/Contents/Developer/usr/bin/

# 導入

というわけで https://developer.apple.com/downloads/index.action から "Command Line Tools for Xcode" をダウンロードする。2012年11月更新の Mountain Lion 向けの *.dmg は110MBだった。

後は

1. ダウンロードしたディスクイメージをマウント
2. パッケージファイルをクリックしてインストーラ起動
3. インストールを進める
4. インストールを完了

という流れになる。

![Sing in with your Apple ID](http://media-cache-lt0.pinterest.com/upload/191473421628867097_MKjxfIwd.jpg)

![Command Line Tools (OS X Mountain Lion) for Xcode.](http://media-cache-ec5.pinterest.com/upload/191473421628867099_Dwf0ATuB.jpg)

![Command Line Tools (Mountain Lion) のインストール 1.](http://media-cache-ec6.pinterest.com/upload/191473421628867106_9vDx2oxR.jpg)

![Command Line Tools (Mountain Lion) のインストール 4.](http://media-cache-lt0.pinterest.com/upload/191473421628867109_SDq6ZbEQ.jpg)

これで make や gcc 等のコマンドが使えるようになった

>
$ type make 
make is hashed (/usr/bin/make)
$ type gcc
gcc is /usr/bin/gcc

ちゃんと "/usr/bin" 以下に入っている。

以前("/Developer/usr/bin" 以下に入っていたとき)とは違い、"/usr/bin" 以下に入っていることが分かる。通常の $PATH であればここにパスは通っているはずなので、そのまま使い始めることができる。

最後にダウンロードしてマウントしたディスクイメージをアンマウントするのを忘れずに。
coffeescript で、formのajax送信


```xxxx.coffee.js
  init_like_button: ->
    forms = $(".new_article_user")
    forms.submit (ev,f) =>
      ev.preventDefault()
      form = $(ev.target)
      num = form.parent().parent().find($(".num"))[0].textContent
      $.post form.attr("action"),form.serialize()
        ,(data) =>
		      if form.find(".submit_button").length == 0
		        form.find(".no_submit_button")[0].className = "submit_button"
		        form.parent().parent().find($(".num"))[0].textContent = parseInt(num)-1
		      else
		        form.find(".submit_button")[0].className = "no_submit_button"
		        form.parent().parent().find($(".num"))[0].textContent = parseInt(num)+1
```

ある一定の条件を確認してから、送信したい場合。
例：特定のinput form にカーソルがある場合で場合分け

```xxxx.coffee.js
  init_submit_form: =>
    form = $("#spot_create_form")
    form.bind "submit",(ev) =>
      now_focus = $(":focus").attr("id")
      if now_focus is "search_location"
        #特定の処理
        return false
      else
        return true
```
Yii 1.1.x で PHPExcel ライブラリを使う

PHPExcel は、PHP で Excel のファイルを読み書きできる非常に便利なライブラリです。
もちろん、Yii-framework と一緒に使うことも出来ます。

ただし、PHPExcel のようにそれ自身がオートローダを持っているライブラリを Yii で使うときには、ちょっとした注意が必要です。

~~~php
<?php

// Yii のオートローダを一旦登録解除する
spl_autoload_unregister(array('YiiBase', 'autoload'));

// PHPExcel のオートローダを登録する ... PHPExcel.php の中でやっている
$phpExcelPath = Yii::getPathOfAlias('ext.phpexcel');
include($phpExcelPath . DIRECTORY_SEPARATOR . 'PHPExcel.php');

// Yii のオートローダを改めて登録する
spl_autoload_register(array('YiiBase', 'autoload'));

...

// Yii のオートローダが働く
$models = SomeModel::model()->findAll();

...
 
// PHPExcel のオートローダも働く
$objReader = PHPExcel_IOFactory::createReader('Excel5');

...
~~~

上記のようにすることで、Yii のオートローダと PHPExcel のオートローダの両方をお互いに干渉することなく動作させることが出来ます。PHPExcel のコードは一行もいじる必要はありません。

キモは、オートローダの登録の順序です。

Yii のオートローダは、ロードすべきファイルが見つからないと**例外**を投げます。と言うことは、後から登録された別のオートローダは、何もするチャンスを与えられない、という事になります。一方、PHPExcel のオートローダは、ファイルが見つからなかった場合には **false** を返して、後に続く別のオートローダに席を譲ります。

この点は、滅多にない Yii における設計の失敗、と言ってよいかもしれません。ともかく、順序を変えてやれば無問題、という次第です。

PHPExcel をラップした Yii のためのエクステンションも存在しますが、オートローダの処理を間違ってコケる事があるようです。素の PHPExcel をお奨めします。

あ、PHPExcel の解説だと思った人、ごめんなさい。

なお、また、上記は Yii 1.1.x のための記事です。 Yii 2.0 では、オートローダの問題は無くなりました。
Microsoft 製ハッシュ値計算ツール `fciv'

何時もはCygwin のGnu coreutils のtool を使うが，Microsoft 製の物を見つけたので試してみる．
＃Windows8 にも導入できた．

* [Availability and description of the File Checksum Integrity Verifier utility](http://support.microsoft.com/default.aspx?scid=kb;en-us;841290)

# usage

```
>fciv
//
// File Checksum Integrity Verifier version 2.05.
//

Usage:  fciv.exe [Commands] <Options>

Commands: ( Default -add )

        -add    <file | dir> : Compute hash and send to output (default screen).

                dir options:
                -r       : recursive.
                -type    : ex: -type *.exe.
                -exc file: list of directories that should not be computed.
                -wp      : Without full path name. ( Default store full path)
                -bp      : specify base path to remove from full path name

        -list            : List entries in the database.
        -v               : Verify hashes.
                         : Option: -bp basepath.

        -? -h -help      : Extended Help.

Options:
        -md5 | -sha1 | -both    : Specify hashtype, default md5.
        -xml db                 : Specify database format and name.

To display the MD5 hash of a file, type fciv.exe filename
```

# sha1/md5 に対応．規定値はmd5．

```
>fciv -sha1 Contacts\desktop.ini
//
// File Checksum Integrity Verifier version 2.05.
//
a316a38e1a8325bef6f68f18bc967b9aaa8b6ebd contacts\desktop.ini

>fciv -md5 Contacts\desktop.ini
//
// File Checksum Integrity Verifier version 2.05.
//
449f2e76e519890a212814d96ce67d64 contacts\desktop.ini


>fciv -both Contacts\desktop.ini
//
// File Checksum Integrity Verifier version 2.05.
//
                MD5                             SHA-1
-------------------------------------------------------------------------
449f2e76e519890a212814d96ce67d64 a316a38e1a8325bef6f68f18bc967b9aaa8b6ebd contac
ts\desktop.ini
```

何もないよりはいいけど，md5/sha1 しか対応してないのは悲しいですね．
Yii Framework: コンソールアプリケーションでPDO関連にエラーが出たときの対処

~~~
PHP Error[2]: PDO::__construct(): [2002] No such file or directory (trying to connect via unix:///var/mysql/mysql.sock) ...
~~~

みたいなエラーが出たときは `/protected/config/console.php` にて、データベース接続の `connectionString` のホスト名を `localhost` から `127.0.0.1` を書き換えてやればいいみたいです。これはおそらくYii Frameworkに限った問題ではないと思います。

## 参考リンク

* [Stackoverflow: Error when connecting to MySQL using PHP/PDO](http://stackoverflow.com/questions/1819592/error-when-connecting-to-mysql-using-php-pdo)
* [Yii Forum: MySQL connection error generating model](http://www.yiiframework.com/forum/index.php/topic/8499-mysql-connection-error-generating-model/page__p__42449__hl__pdo+error+con+ole#entry42449)
git-svn で後から svn のブランチを切る方法 


git-svn を使っていて、gitのローカルブランチで完結させるつもりでいた変更が膨らんで「ヤベ、svnにもブランチ切らなきゃ」って羽目に陥った。その場合のリカバリ方法。

```shellscript
# svn にブランチを切って…
git svn branch new-feature
# ローカルに svn のブランチをチェックアウトして..
git checkout new-feature svn/new-feature
# new-feature ブランチを svn のブランチと対応した svn/new-feature の先に rebase
git rebase --onto svn/new-feature new-feature
```

これで手元の new-feature ブランチがsvn上に作った new-feature ブランチと対応づけられた状態となる…はず。

試行錯誤の末にたどり着いたので、合ってるかどうかイマイチ自信ありません。もっと簡単な方法があれば教えてくださいな
同じ型が入った std::tuple を楽に書く方法

`std::tuple<double, double, double, double>`とか書くのが面倒なので。

# 結論

以下のような構造体を定義する。

```cpp
#include <tuple>

template <class T, std::size_t Size, class... Args>
struct HomoTupleStruct
{
	typedef typename HomoTupleStruct<T, Size - 1, Args..., T>::type type;
};

template <class T, class... Args>
struct HomoTupleStruct<T, 0, Args...>
{
	typedef std::tuple<Args...> type;
};

template <class T, std::size_t Size>
using HomoTuple = typename HomoTupleStruct<T, Size>::type;
```

利用例は以下の通り。

```cpp
#include <type_traits>
#include <cassert>

static_assert(std::is_same<HomoTuple<int, 1>,
			  std::tuple<int>>::value, "orz");
static_assert(std::is_same<HomoTuple<double, 2>,
			  std::tuple<double, double>>::value, "orz");
static_assert(std::is_same<HomoTuple<int&, 3>,
			  std::tuple<int&, int&, int&>>::value, "orz");

int main()
{
    HomoTuple<int, 5> homoTuple1 = std::make_tuple(3, 1, 4, 1, 5);
    HomoTuple<int, 3> homoTuple2 = std::make_tuple(9, 2, 6);
    HomoTuple<int, 8> homoTuple3 = std::tuple_cat(homoTuple1, homoTuple2);

    assert(std::get<6>(homoTuple3) == 2);
}
```

# 備考

`std::array` は tuple のように扱える（`std::tuple_size`, `std::tuple_element`, `std::get` が特殊化されている）ので、大抵の用途においては `std::array` で十分だったりする。以下は clang++ で動くコードである。

```cpp
int main() {
  std::array<double, 4> rgba {{0.1, 0.2, 0.3, 0.4}};

  double r, g, b;
  std::tie(r, g, b, std::ignore) = rgba;
  std::cout << r << ", " << g << ", " << b << '\n';
  std::cout << std::get<3>(rgba) << '\n';

  // std::array -> HomoTuple
  HomoTuple<double, 4> rgba_tuple = rgba;
}
```

ただし、`std::tie` しようとしたりすると [g++ ではコンパイルが通らなくなる (Wandbox, gcc HEAD 7.0.0 20161219)](http://melpon.org/wandbox/permlink/aYzbcYUrLqazWtBU) [^array_tuple] ので、同じ型の入った `std::tuple` を使わなければいけない場面はありそう。Boost.fusion も考慮に入れるべきかも。

[^array_tuple]: `std::array` の tuple インターフェースについては C++11 規格ドラフト (N3337) の "23.3.2.9  Tuple interface to class template `array` **[array.tuple]**" の項に記載されている。`array` の `tie` についての g++（あるいは clang++）の実装が規格違反（あるいはどっちも ok）なのかどうかはよくわかんなかったです……。

`std::tuple` から `std::array` への変換については下記ページが参考になる。

* [c++ - Convert std::tuple to std::array C++11 - Stack Overflow](http://stackoverflow.com/questions/10604794/convert-stdtuple-to-stdarray-c11)

```cpp
int main() {
  HomoTuple<double, 4> rgba_tuple = {0.1, 0.2, 0.3, 0.4};
  std::array<double, 4> rgba = to_array(rgba_tuple); // 上記ページ参照
  for (auto && x : rgba)
    std::cout << x << ' ';
  }
  std::cout << '\n';
}
```
Rails のコントローラのフィルターをテストする際、renderをstub/mockしてなおかつhaltさせたい

環境は rspec-rails である。

`render_template` はrenderの細かい引数まで見てくれないのでたまに困る。

かといって、`should_receive(:render).with(hash_including(...))`と簡単にできない場合もある。具体的にはフィルタの中でrenderしてhaltさせてる場合。mockすると、何もしないので、haltもしなくなる。

で、Railsの場合、before filter内部でresponse_bodyがセットされていれば機械的にhaltするので、

```ruby:sample_controller_spec.rb
before do
  controller.should_receive(:render).with(hash_including(template: 'foo', layout: 'bar')) do
    controller.response_body = "OK"
  end
  get :foo
end
subject { response }
it { should be_ok }
```

## see also

* https://github.com/rails/rails/blob/master/actionpack/test/abstract/callbacks_test.rb#L229

この辺のテストを参照した。

## ﾊｽﾞｶｼｲ追記

layout を確認したいだけだったので、以下でも良かったとさ……。

```ruby
it { should have_rendered template: 'foo', layout: 'layouts/bar' }
```

辛い

* http://apidock.com/rails/ActionController/TemplateAssertions/assert_template

`have_rendered/render_template` は中で↑を呼んでいます。
添字の部分マッチ

 The R language definition を眺めていたら [Indexing](http://cran.md.tsukuba.ac.jp/doc/manuals/r-release/R-lang.html#Indexing "Indexing") に 

> [[ forms are rarely used, ．．． (e.g. it drops any names or dimnames attribute, and that partial matching is used for character indices). 

と部分文字列マッチするとあるので，そうだったかしら，と思ってすぐ試した．

```
> x <- matrix (1:9, nrow = 3)
> dimnames (x) <- list (ABC = c("R1OW1", "R2OW2", "R3OW3"),
+                       DEF = c("C1OL1", "C2OL2", "C3OL3"))
> x["R1", "C2"]
 エラー：  添え字が許される範囲外です 
> x[["R1", "C2"]]
 以下にエラー x[["R1", "C2"]] :  添え字が許される範囲外です 
```

ならねぇじゃん，と思って読み進めたら，
[By-Vector](http://cran.md.tsukuba.ac.jp/doc/manuals/r-release/R-lang.html#Indexing-by-vectors "By-Vector")
に

> Setting exact to TRUE prevents partial matching from occurring, a FALSE value allows it 

と．バカやろう．この引数指定を見て，そう言えば，そうだったなと思いだした．

```
> x[["R1", "C2", exact = FALSE]]
[1] 4
> x[["R1", "C2", exact = NA]]
[1] 4
 警告メッセージ： 
1: In x[["R1", "C2", exact = NA]] :  'R1' の 'R1OW1'　への部分的マッチ 
2: In x[["R1", "C2", exact = NA]] :  'C2' の 'C2OL2'　への部分的マッチ 
> x[["R1", "C2", exact = TRUE]]
 以下にエラー x[["R1", "C2", exact = TRUE]] :  添え字が許される範囲外です 
```

マニュアルではデフォルトは NA と読めるんだが，TRUE なんでは？
rescue Exception を安易に使うべきではない理由


Rubyにおいて`Exception`クラスは各種例外クラスの親クラスになっているが、その派生クラスには`Interrupt`も含まれる。

そのため、`rescue Exception` とした場合、`ctrl`+`c` でプログラムを停止しようとした場合にそのシグナルも捕捉されてしまい、プログラムが停止できなくなる。（そのような場合、`kill -9`コマンドなどでプロセスを強制停止することになる）

### 危険なコード
```ruby:bad_rescue.rb
begin
  # なんらかの処理
rescue Exception
  # 割り込みを含むすべての例外をキャッチしてしまう
end
```
 
### 改善したコード

```ruby:better_code.rb
begin
  # 何らかの処理
rescue
  # StandardError およびそのサブクラスのみキャッチ
end
```

または

```ruby:better_code.rb
begin
  # 何らかの処理
rescue SomeException => e
  # SomeException およびそのサブクラスのみキャッチ
end
```


## 参考
[Why is it bad style to 'rescue Exception => e' in Ruby?](http://stackoverflow.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby)
configで設定可能なRails用gemを作る


ActiveSupport::Configurableを使えばできる。
Class Methods, Instance Methodsどっちもある。

```ruby:
require 'active_support/configurable'

class User
  include ActiveSupport::Configurable
end

user = User.new

User.config.default_level = 3
user.config.allowed_access = true
user.config.level = 1

User.config  # => {:default_level=>3}
user.config  # => {:allowed_access=>true, :level=>1}
```

### 参照

- http://api.rubyonrails.org/classes/ActiveSupport/Configurable/ClassMethods.html
- http://api.rubyonrails.org/classes/ActiveSupport/Configurable.html
自分なりのObjective-Cのコードの書き方


基本的には、Non-ARC

```objectivec:Sample.h
#import <Foundation/Foundation.h>

@class CustomClass;

@interface Sample : NSObject

@property (nonatomic) BOOL flag;
@property (nonatomic, copy) NSString *string;
@property (nonatomic, retain) CustomClass *customClass;
@property (nonatomic, copy, readonly) String *readOnlyString;

@end
```

```objectivec:Sample.m
#import "Sample.h"
#import "CustomClass.h"

@interface Sample ()

@property (nonatomic, copy) NSString *readOnlyString;

@end

@implementation Sample

- (void)dealloc {
  [_string release]; _string = nil;
  [_items release]; _items = nil;
  [_readOnlyString release]; _readOnlyString = nil;
  [super dealloc];
}

- (id)init {
  self = [super init];
  if (!self) return nil;

  self.string = @"";

  return self;
}

+ (instancetype)instance {
  return [[[[self class] alloc] init] autorelease];
}

@end
```

循環参照を避ける為に、ヘッダファイルではフレームワーク以外のものはimportしない。

実装ファイルでimportするファイルが増えてきたら

import.h

```objectivec:import.h
#ifndef __import_h__
#define __import_h__

#import "aaa.h"
#import "bbb.h"
…
#import "zzz.h"

#endif
```

みたいなファイルを作ってこれを読み込む。

## ここには書いていないこと

- IBOutlet, IBActionは実装ファイル内に
- 親クラスのヘッダファイルはxxx.hで読み込む
- デリゲート的なものはassign
- `NSArray`や`NSDictionary`とかはModernな書き方に http://www.zero4racer.com/blog/798
nokogiriでlibxml warningが出た時の対処法

Nokogiri was built against LibXML version 2.7.8, but has dynamically loaded 2.8.0

nokogiriを完全にアンインストールする

```
$ いろいろ頑張る
```

libxmlをインストール

```
$ brew install libxml
```

libxmlのインクルードパスを変更する

```
$ bundle config build.nokogiri  --with-xml2-include=/usr/local/Cellar/libxml2/2.8.0/include/libxml2 \
                              --with-xml2-lib=/usr/local/Cellar/libxml2/2.8.0/lib \
                              --with-xslt-dir=/usr/local/Cellar/libxslt/1.1.26 \
                              --with-iconv-include=/usr/local/Cellar/libiconv/1.13.1/include \
                              --with-iconv-lib=/usr/local/Cellar/libiconv/1.13.1/lib
```

nokogiriをインストール

```
$ bundle install [--path vendor/bundle]
```

こんなかんじでインストールすると.bundle/configファイルから設定外してもnokogiriのワーニング出なくなるようですが、どうでしょうか？コメントで教えてください><
XOOPSにSSLでもhttpでもアクセスできるようにする


通常のhttpでもSSLでのアクセスもOKにするためにXOOPS_ROOT_PATH/mainfile.phpの XOOPS_URL を編集します。

下記の様な感じ。

```php
if(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on')){
    $protocol='https://';
}else{
    $protocol='http://';
}
define('XOOPS_URL', $protocol . 'example.com');
```
n個の数を重複なしでランダムに並べる

配列をシャッフルする「Fisher-Yates法」というのがあるみたいなんだけど、
欲しいのはindexを並べ替えたものだけで
いちいち配列に数字を入れてからシャッフルするのも面倒なので
配列のiとかjの場所に数値がなければ、iとjをそのまま使うようにした。

```javascript
function randomIndex(n){
    var i, j, tmp, a = new Array(n);
    a[0] = 0;
    for(i = n - 1; i > 0; i--) {
        j = Math.floor(Math.random() * (i+1));
        tmp = a[i] || i;
        a[i] = a[j] || j;
        a[j] = tmp;
    };
    return a;
}

console.log(randomIndex(10));
console.log(randomIndex(10));
console.log(randomIndex(10));
console.log(randomIndex(10));
console.log(randomIndex(10));
```

全indexの配列を先に作るのは無駄な気がしてきたので、
クロージャにして呼び出すたびに計算させるようにしてみた。
指定した数未満の数字を重複なしに呼び出して、全部出し終わったらnullを返す。

```javascript
function makeBingo(n){
    var i, j, tmp, a = new Array(n);
    return function (){
        if(n > 0){
            i = n - 1;
            j = Math.floor(Math.random() * (n));
            tmp = a[i] || i;
            a[i] = a[j] || j;
            a[j] = tmp;
            n = i;
            return a[i];
        }else{
            return null;
        }
    }
};

var bingo = makeBingo(10);
for(var i=bingo();i!=null;i=bingo()){
    console.log(i);
};
```

#### 2018/07/27 追記

こういうのを書きたかったということ。

```javascript
var hukubiki = [
    "5等 ティッシュ1箱",
    "5等 ティッシュ1箱",
    "5等 ティッシュ1箱",
    "5等 ティッシュ1箱",
    "5等 ティッシュ1箱",
    "5等 ティッシュ1箱",
    "4等 クッキー詰め合わせ",
    "4等 クッキー詰め合わせ",
    "4等 クッキー詰め合わせ",
    "4等 クッキー詰め合わせ",
    "3等 炊飯器",
    "3等 炊飯器",
    "3等 炊飯器",
    "2等 大型テレビ",
    "2等 大型テレビ",
    "1等 ペアでハワイ旅行"
];

var bingo = makeBingo(hukubiki.length);
for(var i=bingo();i!=null;i=bingo()){
    console.log(hukubiki[i]);
};
```
Vim: neosnippetで手前に文字があると変換できないときの対処

10月後半くらいからneocomplcache-snippets-complete が neosnippet になりましたが、手前に文字があると変換できなくなってしまったので、その対処。自作したスニペットファイルで `options word` と書くと、変換してくれました。

~~~
snippet p                                                                   
options word
     <?php ${1}; ?>
  
~~~

## 参考リンク
* [JavaScriptのスニペットで()の中で展開がされない](https://github.com/Shougo/neosnippet/issues/55)
HomebrewでComposerのインストール

HomebrewでComposerがインストールできる。

うまくいかない場合、失敗理由の多くは、APCのapc.enable_cliが1になっていること。エラー理由が表示されないためわかりにくい。 php5x-apcのデフォルトは1になっているので書き換えること。

    apc.enable_cli=0

更新は `brew upgrade` ではなく `composer selfupdate` がよい。
postfixとgmailと自宅サーバー


はい、狙っていたのはウチのドメインのnawshika.comで沢山のメール作りまくることだったんですがso-netの壁が超えられずにgmailで妥協しました。

ウチの環境
本体：eeePC 900HA
ＯＳ：Ubuntu10.04.4 LTS
自宅サーバーでプロバイダはso-net
回線はauひかり

導入したもの
postfix
dovecot
mailutils
sasl2-bin

```
# ウチの/etc/postfix/mail.cf 
# 非常によくわからないので下記参考先サイト様を参照がいいです。

# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_tls_cert_file = /etc/ssl/certs/ssl-mail.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-mail.key
smtpd_use_tls = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

myhostname = google.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = google.com, localhost.localdomain, localhost
relayhost = [smtp.gmail.com]:587
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
default_transport = smtp
relay_transport = error

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/authinfo
smtp_sasl_security_options = noanonymous
smtp_sasl_mechanism_filter = plain

home_mailbox = Maildir/
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/dovecot-auth
smtpd_sasl_authenticated_header = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sender_restrictions = reject_unknown_sender_domain
mailbox_command = /usr/lib/dovecot/deliver -c /etc/dovecot/conf.d/01-dovecot-postfix.conf -n -m "${EXTENSION}"
smtp_use_tls = yes
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtpd_tls_received_header = yes
smtpd_tls_mandatory_protocols = SSLv3, TLSv1
smtpd_tls_mandatory_ciphers = medium
smtpd_tls_auth_only = yes
tls_random_source = dev:/dev/urandom
smtpd_tls_cert_file = /etc/ssl/certs/ssl-mail.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-mail.key

```

参考先サイト様
http://weble.org/2012/03/21/ubuntu-server-postfix
http://www.aconus.com/~oyaji/centos/smtp-centos.htm
http://www.icoro.com/200908243988.html


ポートはufwでとレンタルのルーターとで587番開けてるんですが外部からは開いて見えず。。so-netでの制限でしょうか。それでも
echo test | mail 任意の宛先
でgmail、so-net、ケータイ宛のいずれにも送信可能でした。2byte文字も問題無さそうです。

恐らく難関はやはり25番ポートは制限がされているのが殆どなので587番ポートでの認証周りでしょうか、多分。。

悪用されないかなど全然チェック出来てませんので、ココ以外をじっくりとお読みください。ウチはザルなのでココ以外のサイトでじっくりとお調べ下さい。
[Xlib]ウィンドウの装飾を取り除く

私が最初に勉強した本では、ウィンドウの装飾を取り除くのに
ウィンドウマネージャの設定リクエストをリダイレクトするものでした。

```c:main.c
XSetWindowAttributes att;
att.override_redirect = True;
XChangeWindowAttributes(dpy, win, CWOverrideRedirect, &att);
```

しかし、これではウィンドウの前後関係を変えるのが難しくなってしまいますし、
そのままだとEvent関連もスルーしていまいます。
スクリーンセーバや、"oneko"のようなアプリケーションであれば問題ないですが、
他のウィンドウと同様に扱える、装飾なしのウィンドウも欲しいところです。

少し調べてみたら、別の方法を用いて装飾を外せることがわかりました。
Motif のウィンドウマネージャあたりをいじるようです。
(Motif はGUI規格のひとつですが、以下の参考資料には「Motifを使っていなくても大丈夫」と、書いてあります)

(参考資料)
http://tonyobryan.com/index.php?article=9

```c:main.c
/*************************************
サンプルプログラムは、
http://homepage3.nifty.com/rio_i/lab/xlib/001window.htm
のところを参考に書かせていただきました。
**************************************/
#include <X11/Xlib.h>

typedef struct{
	unsigned long flags;
	unsigned long functions;
	unsigned long decorations;
	long inputMode;
	unsigned long status;
} Hints;

int main(){
	Display *dpy;
	Window root;
	Window win;
	int screen;
	unsigned long black, white;
	XEvent e;
	
	dpy = XOpenDisplay("");
	
	root = DefaultRootWindow(dpy);
	screen = DefaultScreen(dpy);
	
	white = WhitePixel(dpy, screen);
	black = BlackPixel(dpy, screen);
	
	win = XCreateSimpleWindow(dpy, root, 32, 32, 64, 64, 2, black, white);
	
	XSelectInput(dpy, win, KeyPressMask);
	
	{
		Hints hints;
		Atom property;
		hints.flags = 2;
		hints.decorations = 0;
		property = XInternAtom(dpy, "_MOTIF_WM_HINTS", True);
		XChangeProperty(dpy, win, property, property, 32, PropModeReplace, (unsigned char *)&hints, 5);
	}
	/*
	{
 		XSetWindowAttributes att;
 		att.override_redirect = True;
		XChangeWindowAttributes(dpy, win, CWOverrideRedirect, &att);
	}
	*/    
	
	XMapWindow(dpy, win);
	XMoveWindow(dpy, win, 32, 32);	/* 一回マップするまで座標はWMによって決定するみたいです */
	
	XFlush(dpy);			/* 念のためのFlush */
	
	while(1){
		XNextEvent(dpy, &e);
		
		switch(e.type){
			case KeyPress:
				XDestroyWindow(dpy, win);
				XCloseDisplay(dpy);
				return 0;
		}
	}
}

```

いかがでしょうか。
もしかしたらオープンソースのGUI内部を覗けば書いてあるかもしれませんね。

お役に立つかどうか分かりませんが、
以上 Tips でした。
クエリーの結果表示を自動更新する


Webアプリのデバッグ時に、なにか操作する→DBの変化を確認する という作業を繰り返したことはないでしょうか。
そのたびに毎回クエリーを叩くのは面倒ですよね。

下記のようにすると、ターミナルに常に最新のクエリーの結果が表示されるようになります。

```javascript:watch.js
printjson(db./*collections*/.find(/*query*/).toArray());
```

```bash
$ watch mongo <database> watch.js
```

ブラウザとターミナルを横に並べてみると、なかなか楽しいです。
例はmongodbですが、他のDBでも可能だと思います。
scalaでコラッツ問題を解いた場合のベンチマークをとってみた

[コラッツの問題](http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E3%81%AE%E5%95%8F%E9%A1%8C)
1〜1000までの整数についてコラッツの問題を解くコード

```BenchCollatz.scala
import scala.testing.Benchmark

object BenchCollatz extends Benchmark {

  override def prefix = "Collatz"

  def collatz(num: Int): List[Int] = {
    num match {
      case 1                   => List(1)
      case num if num % 2 == 0 => num :: collatz(num / 2)
      case num if num % 2 == 1 => num :: collatz(num * 3 + 1)
    }
  }

  def run() = {
    1 to 1000 map (collatz)
  }
}
```

```
# コンパイル
% scalac src/BenchCollatz.scala 

# コラッツの問題を100回繰り返す処理を10回繰り返すベンチマーク
# % scala BenchCollatz <繰り返す回数> <1回の試行でrun()を呼び出す回数>

% scala BenchCollatz 10 100
Collatz	308	154	131	144	133	133	132	132	128	129
# 単位はミリ秒 100回実行して130~150ミリ秒で処理できる様子
```


*1回目は遅くなる傾向があるので参考に* <= たぶん、JVMの起動が遅い
Xperia acro IS11S で tcpdumpする

* Xperia acro IS11S root化済み
* DooMLoRD_v4_ROOT-zergRush-busybox-su.zip

```
# 2.3.3のEmuを起動する
$ adb -e pull /system/xbin/tcpdump .

# Xperia acro IS11Sを繋ぐ
$ adb push tcpdump /sdcard/tcpdump
$ adb shell
$ su
# mount -o remount,rw /dev/block/mtdblock0 /system
# cp /sdcard/tcpdump /system/xbin/tcpdump
# rm /sdcad/tcpdump
# reboot

# tcpdump
$ adb shell 'tcpdump -aUX -s0 -w- port 80 or port 443 | tee /sdcard/capture.cap | tcpdump -r-'
$ adb pull /sdcard/capture.cap .
$ wireshark capture.pcap
```

* Proxy使いたいならば  [ProxyDroid](https://play.google.com/store/apps/details?id=org.proxydroid) を使う

* [CA証明書をインストールする](http://blog.takuo.jp/2010/02/nexus-one-android-ca-cert-install.html)
  * [*.dev CA証明書] (http://i.dmap.tk/pow/dev.ca.crt)

```
$ adb pull /system/etc/security/cacerts.bks cacerts.bks
# cp cacerts.bks cacerts.bks.bak
$ keytool -keystore cacerts.bks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -storepass changeit -importcert -trustcacerts -alias DEV_CA -file demoCA/cacert.crt
$ adb shell
$ su
# mount -o remount,rw /dev/block/mtdblock0 /system
# cp /sdcard/cacerts.bks /system/etc/security/
# reboot
```
$pullの条件にidを指定する場合の注意


Mongoidで少し複雑な更新処理を書こうとして、Mopedを直接叩く場合の注意です。
update()内で、$pullでの削除条件にidを指定する場合は、Moped::BSON::ObjectId型で渡す必要があります。

```ruby
Project.collection.find({ '_id' => project_id }).update({
  "$pull"=>{"tasks"=>{ '_id' => Moped::BSON::ObjectId(task_id) } }
})
```

困ったことに、find()内では文字列で渡しても動きます。
$pullでも同じでいいだろうと思うとハマるので気をつけましょう。