OmniAICreator/Qiita-1.07M huggingface dataset:
net-snmp

Ubuntu 12.04 でのインストール方法
====

<pre>
aptitude install snmp snmpd
</pre>

公開範囲を変更
----

とりあえず /etc/snmp/snmpd.conf 49行目 `rocommunity public localhost` のコメントアウトを外すとlocalhostからのアクセスは全て許可することになる

<pre>
...
 41 #  ACCESS CONTROL
...
 49 #rocommunity public  localhost
...
</pre>

取得してみる
----

snmpwalk

<pre>
% snmpwalk -v 2c -c public localhost
iso.3.6.1.2.1.1.1.0 = STRING: "Linux ubuntu1204 3.2.0-56-generic-pae #86-Ubuntu SMP Wed Oct 23 17:51:27 UTC 2013 i686"
iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.8072.3.2.10
...
</pre>

MIBのOUIがパースされていない。
/etc/snmp/snmp.conf の `mibs` の行をコメントアウトする

<pre>
#
# As the snmp packages come without MIB files due to license reasons, loading
# of MIBs is disabled by default. If you added the MIBs you can reenable
# loaging them by commenting out the following line.
mibs :
</pre>

もう一回

<pre>
% snmpwalk -v 2c -c public localhost
SNMPv2-MIB::sysDescr.0 = STRING: Linux ubuntu1204 3.2.0-56-generic-pae #86-Ubuntu SMP Wed Oct 23 17:51:27 UTC 2013 i686
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
...
</pre>

参考リンク
====

* [インフラ技術の実験室 - SNMPの設定](http://www.infra.jp/squeeze/snmp.html)
* [ITmedia - SNMPによるネットワークモニタリング](http://www.itmedia.co.jp/enterprise/special/0705/snmp/)
Bitbucket と HipChat を連携する


通知系を HipChat に集約しようとしているので、設定方法をメモしておく。

ちなみに、HipChat は、基本有料(2$/1 User) だが、5 User までは無料で利用できるので、少人数のチームにとっては助かるサービス。

http://www.hipchat.com/

設定方法は 2種類あって、Bitbucket と HipChat のそれぞれから設定できる。

## HipChat からの設定方法

ログイン後の手順は、以下の通り。

1. Group admin のページへ移動
2. Rooms タブへ移動
3. My Rooms から、通知をとばしたい Room を選択。
4. 左側の Administration から Add-on を選択。
5. Find New から HipChat Bitbucket Connector を Install
6. Install 時に表示される Dialog で “Authticate with Bitbucket” を選択。
7. 続いて、対象の Repository を選択する。New Repository で Repository を入力して Add
8. 一通り入力したところで Done を押して、完了。

### ポイント

Group Admin のタブに Add-ons とあるが、そこからインストールしてもうまくいかないので、必ず Rooms から行うこと。

また、レスポンスが悪く設定に失敗することがあるので、その場合はうまくいくまでリトライするしかない(Heroku 上で動かしているけど、けちっているのかな。。。)。

## Bitbucket からの設定方法

設定するリポジトリのトップページからの手順は、以下の通り。

1. 画面上部の右側にある設定ボタン(よくある Cog アイコン) を選択。リポジトリの設定画面に移動する。
2. 左側のメニューから Hooks を選択する。
3. HipChat を選択して、”Add Hook”
4. API URL は、デフォルトのまま。Room ID は、HipChat の Room の Summary にある API ID を入力。Token は、Room の Tokens ではなく、Group Admin の API から API Auth Token を発行して入力する。権限を制限するため Type は、Notification で発行するほうがいい。
5. 一通り入力したところで Save を押して、完了。

まぁ、ここを見れば全部書いてあります :)

https://confluence.atlassian.com/display/BITBUCKET/HipChat+hook+management

## まとめ

現時点では、HipChat の Add-on は、設定する部分がいまいち安定していないので、Bitbucket で Hook を設定するほうを勧める。設定してしまえば、通知が来ないということは、なかった。

HipChat の Add-on のほうがいいところは、複数のリポジトリに対して、同時に設定できるところ。リポジトリごとに Room を分ける運用をする場合は、どちらも手間は変わらないから Bitbucket で設定する方がよいと思う。
POJOのフィールドの値が同一か比較する


POJOクラスのフィールドが一致しているか否かを比較するサンプルメソッド。

- 比較元と比較先のPOJOクラスオブジェクトを引数に渡す
- publicフィールドのみが対象
- String以外だとうまくいかなかも。
- 例外処理は手抜き

```java

private boolean compareFiledValue(Object target1, Object target2) {

		Field[] fields = target1.getClass().getFields();
		for (Field field : fields) {

			try {
				Object value1 = field.get(target1);
				Object value2 = field.get(target2);

				if (value1 == value2) {
					continue;
				}
				if (value1 == null || value2 == null) {
					return false;
				}
				if (!value1.equals(value2)) {
					return false;
				}
			} catch (IllegalArgumentException e1) {
				e1.printStackTrace();
				return false;
			} catch (IllegalAccessException e1) {
				e1.printStackTrace();
				return false;
			}
		}
		return true;
	}
```
DDNSにBasic認証でIPアドレスを通知する

# はじめに
Dynamic DNSを利用する場合、定期的にIPアドレスを通知する必要があります。
一定期間更新されないと利用できなくなったり、IPアドレスの変更に気付かず、繋げられなくなるからです。

# Basic認証
Dynamic DNSはBasic認証によるIPアドレスの更新(HTTPリクエストしてきたIPアドレスに設定する)を提供しているので、それを利用します。
wgetでBasic認証をする場合、以下のコードになります。

```wget
wget Basic認証のURL --http-user=ID --http-passwd=PWD -O /dev/null
```

Basic認証のURLとID、PWDは適宜書き換えてください。
-O /dev/nullを付けることで、ゴミが残らないようにしています。

これをシェルスクリプトにしてcron.hourly以下に配置すると、一時間ごとにIPアドレスを通知するため、便利です。
以下はMyDNSにIPアドレスを通知するシェルスクリプトの例。

```wget
#!/bin/sh

wget http://www.mydns.jp/login.html --http-user=ID --http-passwd=PWD -O /dev/null
```


# さいごに
wgetでBasic認証することで、Dynamic DNSにIPアドレスを通知する方法を解説しました。
awkでテキストから集計する


awkの勉強がてらに面白そうなデータ(xvideosのデータベース)があったので挑戦。
※awkと書いていますがgawk(4.1.0)を使っています。

## 扱うデータ
http://info.xvideos.com/db/ よりzipをダウンロードし、展開する。
※リンク先は非18禁です
中身は2014/1/4時点で約1.7GB,約380万件ほどのテキストデータ。

データは以下のような形式で`;`区切りで保存されており、
フィールドは順にURL,タイトル,時間,サムネイル画像URL,埋め込み用コード,タグ,ジャンルとなっている。

##ジャンルの出現頻度を集計する

`gawk -F ";" '{c[$7]++} END{for(i in c)printf("%8d:%s\n",c[i],i)}' xvideos.com-db.csv | sort -r`


## タグの出現頻度を集計する
タグはジャンルとは異なり、カンマ区切りで複数個出現することがあるので、splitで区切って処理していきます。
ワンライナーで書くと流石に長いのでawk部分を別記載にします。


```xvideos.awk
#! /usr/local/bin/gawk -f
# xvideos.awk

{
	num=split($6,tags,",")
	if (num > 0) {
		for(i=1;i<=num;i++) count[tags[i]]++
	}
}
END {
	for(tag in count) {
 		if(count[tag] >= 1000) printf("%8d:%s\n",count[tag],tag)
	}
}
```

集計の実行＆結果のソート

```
gawk -F ";" -f xvideos.awk xvideos.com-db.csv | sort -r
```

タグの数が多すぎる(sortがダルい)ので上記処理では1000回以上出現タグに絞っています。


## 結果について
qiitaはポルノ禁止になっており、
ここでの結果のような単語だけでもアウトになるかどうか分からなかったので、
結果は別途以下に貼りつけました。結果を楽しむ趣旨でもないので。
https://gist.github.com/anonymous/8252544

## 参考
単語頻度カウント - 日本 GNU AWK ユーザー会 0.2 - http://d.hatena.ne.jp/Rocco/20071127/p2
共有フォルダー内のファイルが、内容が更新されずサイズだけ更新されて困っている（未解決）

環境:

* WIn 8.1 (Macでも過去に同様の現象を体験）
* VMWare 6.0.1 (VirtualBoxでも過去に同様の現象を体験)
* Debian 7 (Scientific Linuxでも過去に以下略）
    * VMWare Toolsはインストール済み（失敗していないと私は認識）
* ホスト側にフォルダーを用意し、共有フォルダーとしてゲスト側に自動認識させる

こんなファイルがあったとして。

```js
(function() {
  console.log('OK!!');
})();
```

こう編集する。（メッセージ末尾"!!"を削除した。）

```js
(function() {
  console.log('OK');
})();
```

すると、Debianはこう認識する。（vimで開いたりApache経由で表示させたり。）

```js
(function() {
  console.log('OK!!');
})(
```

ファイルの内容はそのままだがファイルサイズだけ更新されている。今回は二文字削除したので、末尾二文字が消えている。

逆に内容を加えた場合は末尾に謎の文字が追加されたりするんだけど、今試したら再現しなかったので具体的な値は不明。

ときどき発生して、ときどき直る。
シングルクォーテーションとダブルクォーテーションのちがい

・ダブルクォーテーション　 ･･･ 文字列中の変数を変数値に置換する
・シングルクォーテーション ･･･ 文字列中の変数を変数値に置換しない
--------------------------------------------------------------
1. ダブルクォーテーションの場合
文字列中に変数を埋め込んでいた場合、変数内の値に置換されて表示されます。
$str = 'pen';

//「This is a pen.」 と表示される　
echo "This is a $str.";

2. シングルクォーテーションの場合
文字列中に変数を埋め込んでいた場合でも、変数名がそのまま表示されます。

変数と同様に、特殊文字 (エスケープシーケンス)を記述してもそのまま表示されます。
$str = 'pen';

//「This is a $str.」 と表示される　
echo 'This is a $str.';

//「12345\n67890」 と表示される　
echo '12345\n67890';
direnvを使おう

## direnvとは？
ディレクトリ毎に環境変数を定義して、そのディレクトリがカレントになった時だけ環境変数を有効/無効にしてくれるツール。開発中のアプリ毎に環境変数を変えたい時に重宝する。

リポジトリはこちら
https://github.com/direnv/direnv

direnvは今話題のgoで作成されているみたいですね。

### インストール方法
```
git clone https://github.com/direnv/direnv
cd direnv
sudo make install
```
Mac上でHomebrewを利用しているのであれば、```brew install direnv``` でいいです。

#### shellにhookを追加する

##### bash

```shell-session:~/.bashrc
export EDITOR=お使いのエディタ
eval "$(direnv hook bash)"
```

##### zsh
```shell-session:~/.zshrc
export EDITOR=お使いのエディタ
eval "$(direnv hook zsh)"
```

##### fish

```shell-session:~/.config/fish/config.fish
set -x EDITOR お使いのエディタ
eval (direnv hook fish)
```

### 使い方
環境変数を設定したいディレクトリにcdし、

```shell-session
direnv edit .
```

すると、カレントディレクトリに `.envrc` が作成され、下記のように設定した環境変数が追記/削除されます。

```shell-session
# ここで設定したTESTはカレントディレクトリ配下のみ有効にできる
export TEST=test

# 上位フォルダで設定した環境変数の削除（unset)もできる
unset ABC
```

**`.envrc` は `bash` で評価される点は注意してください。(fishを使っててもbashの記法で環境変数を指定します)**

例えばカレントの"bin"をPATHに追加したいのであれば、下記のように環境変数を宣言しましょう。

```shell-session:.envrc
export PATH=bin:$PATH
```

または、ショートカットで指定できます。

```shell-session:.envrc
PATH_add bin
```

自動的に環境変数が読み込まれます。

direnvにはその他便利な関数が定義されています。詳しくは [direnv stdlib](https://github.com/direnv/direnv/blob/master/man/direnv-stdlib.1.md) を見てみてください。

#### エラーが発生する場合

``direnv: error .envrc is blocked. Run `direnv allow` to approve its content.`` というエラーが発生する場合は（エラーメッセージにある通り）以下のコマンドを実行してください。

```
direnv allow
```

## 注意: .envrcをリポジトリにコミットしないように注意しましょう

このファイルをリポジトリに追加し、githubにpushしてしまうと環境変数に設定したパスワード等が漏れてしまいます。[こちらのQiitaを参考にシステム全体で.envrcをコミットできないよう、gitignoreを設定するか](https://qiita.com/katsew/items/5cade12fa743a2f31f25)、`.gitignore`に`.envrc`を追加する、また、[git-secretsを設定しておく](https://qiita.com/pottava/items/4c602c97aacf10c058f1)ことをオススメします。
[php]mysqliでNo such file or directoryが出る

phpのmysqliでDB接続を試みたところ、
[No such file or directory]とか出てくる。

google先生に質問してみたところいっぱい出てきた。
php.ini か my.conf のmysql.sock の場所を指定してあげれば良いらしい。

[mysql.sockの場所を確認]
$mysqladmin -u name -p version

Server version 5.6.14
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /tmp/mysql.sock ←ここ
Uptime: 1 day 12 hours 30 min 23 sec

[php.ini]上のUNIX socketに書き換え
pdo_mysql.default_socket = /tmp/mysql.sock
mysql.default_socket = /tmp/mysql.sock
mysqli.default_socket = /tmp/mysql.sock

でNo such云々は出なくなったけどDBから結果をとれなくて

$mysqli = new mysqli("localhost", "name", "pass", "test");
を
$mysqli = new mysqli("127.0.0.1", "name", "pass", "test");
に変更したらうまい事いった。
わーい。
プログラミング義務教育化ってやっぱりどうなの

プログラミング義務教育化に関する話題でつぶやくことがまれにあるので、ここで私の意見や疑問点をまとめておこうと思います。ちょっとした思いつきです。

稚拙な意見かとは思いますが、コメントいただけると嬉しいです。
（Qiita に書いたのはやや偏向があるかもしれませんが、ほかに適当なブログチャネルを持っていないのであしからず...）

# 事実の整理

## プログラミング義務教育化の目的

### IT を活用した 21 世紀型スキルの修得 

> 2010 年代中に 1 人 1 台の情報端末による教育の本格展開に向けた方策 
を整理し、推進するとともに、デジタル教材の開発や教員の指導力の 
向上に関する取組みを進め、双方向型の教育やグローバルな遠隔教育 
など、新しい学びへの授業革新を推進する。また、来年度中に産学官 
連携による実践的 IT 人材を継続的に育成するための仕組みを構築し、 
義務教育段階からのプログラミング教育等の IT 教育を推進する。 

※「平成25年6月 産業競争力会議 成長戦略（素案）」より抜粋

### オバマ大統領の「全ての人よ、プログラミングを！」

> こういったスキルを学ぶのは単に将来に役立つからというだけではありません。
我が国の将来に必要なのです。
我が国が最先端をゆく国であり続けたいのであれば、
私達の生活を変えてくれるような、ツールや技術を習得した、
あなたたちのような若い人が必要なのです。

※ [オバマ大統領「全ての人よ、プログラミングを！」発言をどう受け止めるべきか](http://allabout.co.jp/newsdig/w/56942/2/)

# 意見・疑問点

## １．実用的、職業に直結するスキルを義務教育化すること

まず上記２つの言葉の意味をそのまま受け取るとしたら、
**義務教育過程で**
**ある程度実用的な**
**プログラミングスキルを**
身に付けることが目的だということになります。

### **だれが** 教えるのか

実用的なスキルはいくら教科書にまとめたところで、教える人間に相応のスキルが求められます。
教員より学生の方が吸収力は高いでしょうから、学生の閃きを教員が潰してしまうという悲劇が目に浮かびます。
（教員がダメだという話ではなく、プログラミングにはそういう性質があるという話です）

### **どうやって** 教えるのか

プログラミングを学ぶ教材は、現時点でも幾つか選択肢はあります。
タートルプログラミングは昔からプログラミングの初歩を理解するのに重宝されています。
LEGO で動くロボットをプログラミングするというのも意欲を掻き立てるかと思います。
（学習向けのパッケージもあるようです）

### **どうやって** 評価するのか

まさか100点満点の紙媒体テストを実施するってことはないでしょうけど、 **唯一の正解がない** 実用スキルを評価するだけのスキルも教員に求められます。
100点満点の紙媒体テストに頼るなら、実用的なスキルとして評価されないことが明白です。

「優秀なハッカーを育てるわけじゃないんだから」というのは言い訳にしかなりません。
せっかく学んで少し興味が持てても、最後に残るのが無意味な数字では台無しです。

最も有効なのは、同じゴールに対して競争する方法です。
目的は一つでも、手段は個人に委ねることができますし、結果も可視化されます。

### ほかの方法はないのか

実際には、興味をもった人間であれば **ほっといても** 優秀なスキルを身につけ、その先も成長を続けます。
逆に興味がない場合、苦痛でしかありません。興味がないのに人と比べられるほど嫌なことはありません。
本当に必要なのは義務教育化でしょうか。

本当に実用的なスキルを持った人間を増やしたいのであれば、そういったイベントがあることを教えたり、技術書が手に入りやすくしたり、興味をもった人間の成長を阻害しない工夫のほうが重要ではないかと私は思います。

## ２．情報リテラシー学習の足がかりとしてプログラミングを義務教育化すること

実用的なスキルが目的ではなく、IT 社会で生きる哲学を身に付けることが目的と考える事もできます。
むしろ、義務教育として必要なのは IT 社会で生きる哲学ではないかというのが私の意見です。

### 情報リテラシーを学ぶのにプログラミングの初歩が適役か

プログラミングを「母国語の読み書き」と同列に表現する記事を見かけました。
母国語の読み書きを学習するということは、自分が生きる社会の概念に直結しています。だからこそ全ての人間が学ぶべき課題と言えます。

対してプログラミング言語を学習するということは、コンピュータの動作原理の世界につながっています。
一見すると IT 社会と深い関わりがあるように見えますが、プログラミングは所詮舞台裏の技術です。
コンピュータは人間に近づくべく進化を続けています。
それでも人間がコンピュータに近づくべきでしょうか。

### 情報リテラシーはどうやって学ぶことができるか

情報リテラシーは、「コンピュータの向こう側には常に人間がいる」ということを認識して初めて身に付けることができます。
情報リテラシーを学ぶのに最も手っ取り早い手段は、「クローズドネットワークで失敗を経験する」という方法ではないでしょうか。失敗はどんな講釈よりも効果があります。「インターネットを使うときの注意」なんてタイトルの箇条書きは一人でも読むことができますが、一人では失敗することもできません。

プログラミングを知らずとも、インターネットの向こう側に不特定多数の人間がいることなんで、きっと言われなくてもわかっています。電話をかけるのに仕組みを理解する必要はありません。
自分の行動が自分の未来にどう影響するかを予見できないのは、単に失敗したことがないからです。

IT 社会特有の失敗を経験するのに適役なのは、プログラミングではなく教室そのものだと思います。
パソコン教室内で、かんたんなブログを使った擬似的な炎上を再現するとか、そんな方法はいかがでしょうか。

---

追記：ツイッターにて意見を下さった @SatoshiMasutani さんとの会話で思い至った点を追記します。

[トゥギャッター](http://togetter.com/li/611739)

## サブセット化によって「プログラミングの世界の一部を見せる」

水彩画や鍵盤ハーモニカのように、プログラミングを「一度に見渡せるほどの大きさにサブセット化」することで、義務教育に組み込むことは既に行われております。

実用的なスキルを身に付ける足がかりや、情報リテラシー学習の足がかりではなく、興味を持ってもらうことが目的ということですね。

「義務教育段階からのプログラミング教育等の IT 教育を推進する。 」という言葉の真意がそこにあるのであれば、ぜひ施策すべきことだと思います。
KVM Disk Images Backup Script with "ruby-libvirt"

This is script which backup KVM disk image by using ruby-libvirt

Test Enviroment

* KVM on CentOS release 6.3 (Final)
* ruby 1.9.3p194 (2012-04-20) [x86_64-linux]
* ruby-libvirt (0.4.0)

Script

```ruby
#
# KVM Disk Image Backup Script
#
#                fetaro@gmail.com
#
# usage : $ ruby kvmbackup.rb (domain-name)
#
# 1. Get Disk image paths from domain-xml
# 2. Susupend domain if running
# 3. Backup Disk image to BACKUP_DIR with BACKUP_CMD (cp or scp)
# 4. Resume domain if suspended
#
require 'libvirt'

BACKUP_CMD="scp"
#BACKUP_CMD="cp"
BACKUP_DIR="host:/path/to/backup/dir"
#BACKUP_DIR="/path/to/backup/dir"

if ARGV[0].nil?
  STDERR.puts "There is no argument"
  exit 1
end

domain=ARGV[0]
conn = Libvirt::open("qemu:///system")
dom = conn.lookup_domain_by_name(domain)

# get disk image path
img_paths = []
require "rexml/document"
xml = REXML::Document.new(dom.xml_desc)
xml.elements.to_a("domain/devices/disk").each do |disk|
  if disk.attributes["device"] == "disk"
    img_paths << disk.elements["source"].attributes["file"]
  end
end

return_code = 0
begin
  if dom.state[0] == 1 # domain is running
    puts "suspend #{domain}"
    dom.suspend
  end

  img_paths.each do |img_path|
    cmd = "#{BACKUP_CMD} #{img_path} #{BACKUP_DIR}"
    puts cmd
    system cmd
    if($? != 0) then
      STDERR.puts "fail to #{cmd}"
      return_code=1
    end
  end
rescue => e
  p e
  return_code = 1
ensure
  if dom.state[0] == 3 # domain is paused
    puts "resume #{domain}"
    dom.resume
  end
end

exit return_code
```
define-*** 系のマクロを正しくハイライトしたい

前回の投稿でfont-lockについての間違いを認識したのでリベンジ。
例えば `define-exported-class` とかでも class色にハイライトされます。
追加したければregexpに追加すればよろし。

```cl
(defface extra-ws-face
  '((t (:background "hotpink" :foreground "black")))
  "Used in text-mode and friends for exactly one space after a period.")

(defun font-lock-something-name-face (str)
  (save-match-data
    (cond
     ((string-match "\\(const\\(ant\\)?\\|parameter\\|var\\)\\>" str)
      font-lock-variable-name-face)
     ((string-match "\\(class\\|package\\|suite\\|struct\\|type\\|pattern\\)\\>" str)
      font-lock-type-face)
     ((string-match "\\(syntax\\|read\\)\\>" str)
      font-lock-constant-face)
     (t font-lock-function-name-face))))

(font-lock-add-keywords
 'lisp-mode
 '(("\\<\\(FIXME\\|TODO\\)" 1 font-lock-warning-face t)
   ("^[^\n]\\{80\\}\\(.*\\)$" 1 font-lock-warning-face t)
   ("(\\(\\(?:\\(?:\\s_\\|\\w\\)*:\\)?\\(?:use-\\|in-\\|def\\)\\(\\(?:\\s_\\|\\w\\)*\\)\\)\\>\\(?:\\s-*\\(?:\\s<.*
\\|
\\)?\\)+\\(?:\\(?:\\s-\\|(\\)*\\(?:\\s<.*
\\|
\\)?\\)*\\(\\_<\\(?:\\s_\\|\\w\\)+\\_>\\)?" ;; def*** , define-*** , in-***
    (1 font-lock-keyword-face)
    (3 (font-lock-something-name-face (match-string 2))))
   ("^\\s-+$" . 'extra-ws-face)))
```

修正：defstruct や defcached のように、第一引数にシンボルだけでなくsubexpを持つ場合に対応。
以下がすべてハイライトされるはず。
in- 系と use-系にも対応、 syntax や read を含むものは別の色で。(defreadtableなど)

```cl
(use-syntax :annot
(cl-syntax:use-syntax (%_!$&=~^-[]+*?/<>.:annot))
(cl-syntax:use-syntax ( ;; hi!
                       (  (%_!$&=~^-[]+*?/<>.:annot))
(cl-syntax:use-syntax ( ;; hi!
                       ( ;; hi!
                        (%_!$&=~^-[]+*?/<>.:annot))))
(defcached aaa
    )
(defcached bbb
    )
(defcached (symbol :table table)
    )
(defcached (aaa 
    )
```
rubyのoauth2を使ってfacebook連携

rubyのoauth2を使ってfacebookとのOAuth連携を試みてみた。環境は以下の通り。

* ruby: 1.9.2p180
* oauth2: 0.5.2

まずは、facebook認証のURLを生成するコードを書いてみる。

```rb
require 'oauth2'

site = "https://graph.facebook.com"
token_url= "/oauth/access_token"
key="xxxx"                          # facebookのAPP ID
secret="xxx"                        # facebookのAPP SECRET
callback_url="http://xxx.com/"      # callbackしてほしいURL

#インスタンス作成
client = OAuth2::Client.new(key,secret,:site => site,:token_url => token_url)

#URL作成
url = client.auth_code.authorize_url( :redirect_uri => callback_url)

#URL表示
puts url
```

これで出来たURLでアクセスすると、facebookのログイン画面が出るので、そこでログインすると次のようなLocationを指定したリダイレクト要求のレスポンスが返ってくる。

    Location: (callbackしほしいURL)/?code="(認証コード)"

次に認証コードを使って、tokenを取得するスクリプトを書いてみる。

```rb
require 'oauth2'

site = "https://graph.facebook.com"
token_url= "/oauth/access_token"
key="xxxx"                          # facebookのAPP ID
secret="xxx"                        # facebookのAPP SECRET
callback_url="http://xxx.com/"      # callbackしてほしいURL
code ="xxxx"                        # 前のスクリプトで取得したcode

#インスタンス作成
client = OAuth2::Client.new(key, secret, :site => site, :token_url => token_url)

#tokenの取得
access_token = client.auth_code.get_token( code, { :redirect_uri => callback_url })

#token表示
puts access_token.token
```

これを実行すると、以下のようなエラーがでた。

    /usr/local/lib/ruby/gems/1.9.1/gems/oauth2-0.5.2/lib/oauth2/client.rb:129:in `get_token': OAuth2::Error (OAuth2::Error) 

まったくわからなかったので、ソースを見ると、問題の個所はこのようになっており、

```rb
response = request(options[:token_method], token_url, opts)
raise Error.new(response) if options[:raise_errors] && !(response.parsed.is_a?(Hash) && response.parsed['access_token'])
```

ここのoptions[:raise_errors]というのがtrueのため例外を飛ばしていることが分かった。

原因を調査していると、githubの掲示板にこのことが書いてあり、acvwilsonさんが解決策を書いてくれている。

まとめると「facebookからのレスポンスの形式(=が入っているやつ)に対応できていないので、以下のコードを追加してパーサを対応させてくれ。」とのこと

```rb
OAuth2::Response.register_parser(:text, 'text/plain') do |body|
  key, value = body.split('=')
  {key => value}
end
```

これを追加するとうまく動いた！
Hibernate4+SpringでDDLをExportする

@EntityでアノテーションしたHibernate(JPA)のクラスからDDLを生成する。
サンプルは標準出力にcreate文を出力する。

```java
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.dialect.MySQL5InnoDBDialect;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.SimpleMetadataReaderFactory;

import javax.persistence.Entity;

public class Hbm2ddl {
	
	public static void main(String[] args) throws Exception {
		String locationPattern = "classpath:/hoge/foo/entity/*";

		Configuration configuration = new Configuration()
				.setProperty(Environment.DIALECT, MySQL5InnoDBDialect.class.getCanonicalName());

		PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
		Resource[] resources = resourcePatternResolver.getResources(locationPattern);
		SimpleMetadataReaderFactory metadataReaderFactory = new SimpleMetadataReaderFactory();
		for (Resource resource : resources) {
			MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource);
			AnnotationMetadata metadata = metadataReader.getAnnotationMetadata();
			if (metadata.hasAnnotation(Entity.class.getName())) {
				configuration.addAnnotatedClass(Class.forName(metadata.getClassName()));
			}
		}

		new SchemaExport(configuration)
				.setDelimiter(";")
				.create(true, false);
	}
}
```
Haxeを試してみる


![logo.png](https://qiita-image-store.s3.amazonaws.com/0/20773/91ddb306-4556-1e34-947f-a7cd1642500c.png "logo.png")

altJS 界隈で耳にする Haxe を試してみました。
環境は Mac OSX 10.9

型推論とかOpenFLとかで話題になったり、クロスプラットフォームで出力できるというのがうりらしいです。

![haxe-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/20773/b228fa34-f3db-3433-b5ab-b20e49eb4d67.jpeg "haxe-1.jpg")

いろんな形式で出力できるようだけど、まずはjsとflashでハロワしてみます。


##インストール
公式からインストーラーをDL
http://haxe.org/download

Automatic Installer の haxe-3.0.1-osx-installer.pkg をDLして実行。確認時 Haxe 3.0.1 が最新だった

コマンドラインで haxe をたたいてみるとなんかでたのでインストールできたようです。
![1__bash.png](https://qiita-image-store.s3.amazonaws.com/0/20773/38e7487d-dd0d-c570-5fbd-ac6d0fdf0a48.png "1__bash.png")
インストールできたっぽい

##コマンドラインからコンパイル
新規ファイル Test.hx を作成

```hx:Test.hx
class Test {
    static function main() {
        trace('Hello World !');
    }
}
```

コンパイルしてみます。

```
$ haxe -js test.js -main Test
```

jsファイル test.js が生成されました。
確認用のHTMLを以下の内容で作成します。

```html:index.html
<html>
<head>
<title>Haxe JS</title>
</head>
<body>

<script type="text/javascript" src="test.js"></script>

</body>
</html>
```

このHTMLをひらくと 'Hello World !' と alert がでます。
JS 向けにビルドしたので trace が alert に変換されたのですね。

##ビルドファイルからコンパイル
コマンドラインに引数たくさん書くのが面倒なので設定ファイルを作成します。

```compile.hxml
-js test.js
-main Test
```

コンパイルしてみる。

```
$ haxe compile.hxml
```

設定ファイルを指定すると、さきほどと同じように test.js が生成されます。

## SWF書き出ししてみる
出力形式を swf にしてコンパイル。

```Haxe:compile.hxml
-swf test.swf
-main Test
```

swf ファイルが生成されました。
いちおう Hello World ってでてるので成功なのかな。

コンパイラがとっても速いです。

2014/01/05 追記：
ブラウザで試せる Try Haxe! てのがあるようです。
http://try.haxe.org/
ContextMenuの簡単な使い方

コンテキストメニューに項目を追加します。
コンテキストメニューとは、スクリプトをゲームオブジェクトにアタッチした後、Inspector上でそのスクリプトを右クリックしたときに表示されるやつです。多分...。

```java
using UnityEngine;
using System.Collections;

public class test : MonoBehaviour {
	[ContextMenu ("Do ContestMenu")]
	void hogehoge(){
		Debug.Log("Exe ContestMenu!!");
	}
}
```

上記をコンテキストメニューから実行すると、hogehogeメソッドが実行されます。
なんかをリフレッシュしたいときに使うのかも。
Obsoleteの簡単な説明

Obsolete 属性をつけると警告やエラーを出すことができます。

#クラスに使った例

```java
using UnityEngine;
using System.Collections;

public class test : MonoBehaviour {
	[System.Obsolete("I will warn!!")]
	class A{ }

	void Start ()
	{
		A a = new A();
	}
}
```

Aクラスのインスタンスを生成しようとすると警告が出力されます。

# メソッドを使った例

```java
using UnityEngine;
using System.Collections;

public class test : MonoBehaviour {
	class B
	{
		[System.Obsolete("I will warn!!")]
		public void Method()  { }
	}

	void Start (){
		B b = new B();
		b.Method();
	}
}
```

BクラスのMethodoというメソッドを呼びだそうとしたので警告がでます。

# エラーにする例

```java
using UnityEngine;
using System.Collections;

public class test : MonoBehaviour {
	class B
	{
		[System.Obsolete("I will error!!", true)]
		public void Method()  { }
	}

	void Start (){
		B b = new B();
		b.Method();
	}
}
```

System.Obsoleteの第2引数をtrueにすると警告でなく、エラーとなります。

いまいち使いどころがわからない...。多分、バージョンを新しくしたとき下位互換とかをもたせるために使うと思っているんですが、個人的には警告やエラー吐かせるぐらいならバッサリ切り捨てますw
systemdのPredictable Network Interface Names

http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/
ある時からネットワークインターフェース名がよくある ```eth0``` とかにならず、ちょっとした気持ち悪さを覚えていたのだが、理由が分かった。
こことかも読みました。http://knowd2.com/drupal-rotake/?q=node/165

```eth\d``` はカーネルモジュールがインターフェースを発見した順に0から番号を振っていくので、理論的には順番は一定ではない。インターフェースごとにiptablesやfirewalldを入れるのは意外に危険な行為だったのか。
数を作る 〜 第9回オフラインリアルタイムどう書くの参考問題


（元ネタは http://nabetani.sakura.ne.jp/hena/ord9nummake/ ）

なんの工夫もなく極く基本的なリスト操作を連ねて解く。

```hs:ConstructingNumbers.hs

module Main where
import Control.Applicative
import System.Environment (getArgs)
import Data.List

-- 6の個数と同じだけ9をカードに追加して、4桁数字列を構成し
-- 最後に6と9の個数が元々の個数以上になるものを除去（ただし6が多いとかなり遅い）
construct :: String -> [String]
construct n =   nub $ sort $ filter check $ 
              filter ((/='0').head) $ map (take 4) $ permutations $
              (++) n $ take num $ repeat '9'
  where num = length $ filter (=='6') $ n
        check = (<=num) . length . filter (\x -> x=='6' || x=='9')

-- 自分用メモ
-- filter check $ filter ((/='0').head) という連鎖が気に入らないならば
-- filter p . filter q は filter (&&) <$> p <*> q で、(->)ファンクタでは 
-- <$>は(.)に等価になるからこれはつまり filter ((&&).p <*> q)と等価で
-- ひとつにまとめて filter ((&&).check<*>(/='0').head) としてもいい。
-- まあでもこれは(->)アプリカティヴ・ファンクタの濫用だよな……


-- 先に4桁数字列を構成した上で、6を9に置き換える（6が多くてもまあまあ速い）
-- アプリカティヴ・ファンクタとしてリストを使うにはうってつけの事例ではある
construct2 :: String -> [String]
construct2 = nub . sort . concat . map convert . nub .
             filter ((/='0').head) . map (take 4) . permutations
  where convert [] = [[]]
        convert (s:ss) = case s of
          '6' -> (:)<$>['6','9']<*>convert ss
          _ -> (:)<$>[s]<*>convert ss


solve :: String -> String
solve str = 
  let result = construct2 digits
      (num, digits) = parse str
  in case length result >= num of
       True -> result !! (num-1)
       False -> "-"

parse :: String -> (Int, String)
parse str = (read n,tail d)
  where (n, d) = break (==':') str

-- コマンドラインから文字列を受け取って解答を出力
main = solve<$>concat<$>getArgs >>= putStrLn

```
NVIDIA OptimusにはBumblebee

NVIDIA Optimusのラップトップを使うすべてのFedoraユーザは、X Window Systemがスタックして画面が真っ黒ですべてのキー入力も反応せず、すなわちttyの切り替えも不可能となり、誇りを胸にほほえみとともにスーパー電プチすることを自ら知っている。それが、長いたそがれの時代を生きた我々の業だからだ。

http://bumblebee-project.org/
いろいろ苦労したわけですが、1、2年ほど前からNVIDIA Optimus用のドライバを出すプロジェクトが始まっていました。正確にはカーネルモジュールのラッパー、と言う方が正しいようです。本家のプロプラドライバとnouveauを選択できますし、カーネルバージョンアップ時の自動再ビルドもしてくれます。慈愛の念溢れんばかりのパッケージです。

インストールはyumを連打するだけです。
https://fedoraproject.org/wiki/Bumblebee

素晴らしいとは思わんかね。
BrewfileとHomebrew-caskでmacのセットアップ

## 2014/07/31追記

しばらく使わない間に色々更新があったようです。

### Brewfile がオワコン化していました。

```
$ brew bundle
Warning: brew bundle is unsupported and will be replaced with another,
incompatible version at some point.
Please feel free volunteer to support it in a tap.
```

カスタムタスクとして bundle を追加する方法はあるけども、ぶっちゃけ Brewfile の各行の先頭に brew つけたシェルスクリプトに置き換えればいいと思います。

（というか以前に brewfile の実装を読んだときは、各行の先頭に brew 付けて system で実行してるだけだったような）

### tap なしでインストールできるようになっていました。

```
brew install caskroom/cask/brew-cask
```

これは多分 brew 側の機能追加によるものですかね。

結構ストックされていたので更新通知を送ってみました。どんな記事でも言えることではありますが、導入の際は公式ドキュメントを確認されることをオススメします。

↓↓↓以下は参考にならない部分もあるかと↓↓↓

## homebrew-caskって？

macおなじみのdmgをマウントしてアプリアイコンをドラッグしてインストールするアレをbrew cask install dropboxとかってできるようにしちゃうもの。

caskは大樽のことらしい。dmgを大樽に見立ててるみたいですね。

## Brewfileって？

[homebrew](http://brew.sh/)のコマンドをずらずら書いておけるファイル。rubyのgemfileとかnodeのpackage.jsonなんかで依存パッケージを書いたことある人なら、あーあれねとなりそう。

## ざっくりとした手順

- xcodeをインストール
- mavericksの場合はxcode-select —installとしてコマンドラインツールをインストール
- homebrewをインストール。ワンライナーでいける
- Brewfileを用意する
- Brewfileのおかれたディレクトリでbrew bundleをたたく
- Brewfileに書かれた通りアプリがインストールされる

## Brewfileの例

```
update
upgrade

# homebrew-caskのインストール
tap caskroom/cask || true
install brew-cask

# 各種インストール
install rbenv ruby-build

cask install iterm2
cask install java
cask install google-chrome
cask install dropbox
cask install virtualbox
cask install vagrant
cask install kobito
```

tapでtrueとしてるのは[こちらの記事](http://deeeet.com/writing/2013/12/23/brewfile/)を参照して下さい。

## いい点・悪い点

### いい点

- homebrewで入れるものってどのみち結構あるので、こいつでdmgもまとめられるのは魅力。
- 手軽。最初boxenを使ってみようかと思ってたけど、個人マシンの用途を考えると、これで十分だった。
- まだやってないけど[ここ](https://github.com/phinze/homebrew-cask/tree/master/Casks)をみる限りマイナーなdmgを対応させるのも難しくなさそう。

### 悪い点

- mac app storeのやつは入れられないみたい。こればっかりはapp storeの購入済み開いてぽちぽち、かなぁ。

## 参考

[BrewfileでHomebrewパッケージを管理する | SOTA](http://deeeet.com/writing/2013/12/23/brewfile/)

[homebrew-caskが良さそうなので導入してみた - About Digital](http://blog.digital-bot.com/blog/2013/09/08/homebrew-cask/)

## 2014/05/07 追記

homebrew-cask のリポジトリが変更になりました。Brewfile の更新と、リポジトリの変更が必要となります。上記の Brewfile は更新済みです。

リポジトリの変更については、ほとんどの人は下記のコマンドで問題ないハズです。私の環境では、下記を実行したら legacy tap の消去が行われ、正常にマイグレートされました。

```brew update && brew upgrade brew-cask```

何か問題が起きたら、下記ドキュメントの If Something Goes Wrong の章を見て、もろもろ試してみて下さい。

<https://github.com/caskroom/homebrew-cask/blob/master/doc/TAP_MIGRATION.md>
phpQueryでHTMLのtitle要素を抜き出す

# はじめに
phpQueryを使うと、PHPでjQueryみたいなことができる。スクレイピングに使おう。
Webサイトはこちら。
[https://code.google.com/p/phpquery/](https://code.google.com/p/phpquery/)

# phpQuery準備
上記WebサイトのDownloadsから、phpQuery-0.9.5.386.zipをダウンロードして展開。
Webサーバーの /var/www/html/ に配置する。

```wget
wget https://code.google.com/p/phpquery/downloads/detail?name=phpQuery-0.9.5.386.zip
unzip phpQuery-0.9.5.386.zip
mv phpQuery /var/www/html/
```

これでアクセスすると、Cent OSだと

>PHP Fatal error:  Class 'DOMDocument' not found in ****  

とか出るので、php-mbstringとphp-xmlをyumでインストールする。

```yum
yum install php-mbstring php-xml -y
```

加えて、後で使うためにGoogleトップページをダウンロードしておく。

```wget
wget http://www.google.co.jp/
```

# title要素を抜き出す
先ほどダウンロードしたGoogleのHTMLに書かれているtitle要素を抜き出す。
手順は、
1. phpQueryのスクリプト読み込み
2. phpQueryのメソッドをコールしてindex.html解析
3. title要素抜き出して表示
の順。

```php:test.php
require_once('phpQuery/phpQuery.php');

phpQuery::newDocumentFile('index.html');
print pq('title')->text();
```

test.phpに保存し、Webブラウザでアクセスすると、
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/9665/f87c8a9b-c5a0-57a1-bee7-656e1fb8e5af.png)
と表示される。

# さいごに
phpQueryを使ってHTMLのtitle要素を抜き出してみた。色々と使えそう。
Play2.2でHerokuのpostgresqlを利用する


Play2.2でHerokuを利用する際、postgresqlへの接続にハマったのでメモ。

HerokuのpostgrtesqlアドオンはSSLで接続することが前提となっているので、db.XXX.urlに対して以下のように設定する必要がある。
この点は、調べた限りではherokuのドキュメントにもplayのドキュメントにも触れられていないっぽいので要注意。

application.conf(もしくはそれ以外のconfファイル)に以下のようにDB設定を行う。
ポイントは、urlに対して `ssl=true` と `sslfactory=org.postgresql.ssl.NonValidatingFactory`のパラメータを付けること。

```
db.default.url="jdbc:postgresql://<HOST>:5432/<DB_NAME>?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory"
db.default.user="<ROLE_NAME>"
db.default.password="<PASSWORD>"
```

# 参考

[playframework - Postgresql with Play Framework - Stack Overflow](http://stackoverflow.com/questions/7731933/postgresql-with-play-framework)
CentOS6.4上でMojolicious+WebSocket+SSL環境構築

Perlをあまり使ったことがなかったので、メモ的に…

### PerlとCPANのインストール
実際にはこれに加えてDBとかWebサーバとかも必要になるけど、まずは最低限ということで。

```
$ yum -y update
$ yum -y install perl cpan
```

### CPANでインストール中の質問をデフォルトで答えるための設定
インストールしているモジュールが依存しているモジュールも一緒にインストールするか？という質問にyesで答えるための設定。
これをしておかないと、沢山のモジュールを入れるときは結構面倒くさい。

```
$ cpan
cpan> o conf prerequisites_policy follow
cpan> o conf commit
cpan> q
```

### 必要なモジュールをインストール
あんまり一気に入れるとうまくいかない場合があったので、少しずつ…

```
$ cpan -i CGI Cwd DBI Encode File LWP Mail::Sendmail Math::BigInt JSON
$ cpan -i Time::Local Time::HiRes Mojolicious
$ cpan -i Module::Build DateTime
```

ここまで構築したところで、WebSocketを使ったチャットプログラムのサンプルを動かしてみる。
参考：[Mojolicious::Lite で WebSocket を使ったチャットを作る(現時点：2012年3月10日で動くコード)](http://kazuph.hateblo.jp/entry/20120310/1331396492)

```
$ morbo app.pl
[info] Listening at "http://*:3000".
Server available at http://127.0.0.1:3000.
```

無事に動いた。

### 暗号化
WebSocketで暗号化を行う際にはプロトコルが```ws://```ではなく```wss://```となるので、予めソースの該当部分を書き換えておく。分かりやすくするためにポートも変更。

```
【変更前】
var ws = new WebSocket('ws://localhost:3000/echo');

【変更後】
var ws = new WebSocket('wss://localhost:3001/echo');
```

morboのオプションでポート指定して起動する。

```
$ morbo -l "https://*:3001" app.pl
IO::Socket::SSL 1.75 required for TLS support at /usr/local/share/perl5/Mojo/IOLoop.pm line 119
```

IO::Socket::SSLモジュールが無い、と怒られるのでインストール。

```
$ cpan -i IO::Socket::SSL
（中略）
cp lib/Net/SSLeay/Handle.pm blib/lib/Net/SSLeay/Handle.pm
/usr/bin/perl "-Iinc" /usr/share/perl5/ExtUtils/xsubpp  -typemap /usr/share/perl5/ExtUtils/typemap -typemap typemap  SSLeay.xs > SSLeay.xsc && mv SSLeay.xsc SSLeay.c
gcc -c   -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -g   -DVERSION=\"1.55\" -DXS_VERSION=\"1.55\" -fPIC "-I/usr/lib64/perl5/CORE"   SSLeay.c
SSLeay.xs:153:25: error: openssl/err.h: No such file or directory
SSLeay.xs:154:27: error: openssl/lhash.h: No such file or directory
```

依存モジュールであるNet::SSLeayのインストール中に大量のエラーが発生して失敗。
そもそもOpenSSLが入っていないことが問題ということで、いくつか関連するものをインストールする。
参考：[CPANでNet::SSLeayのインストールに失敗する時の対処法](http://blog.livedoor.jp/nemesis_00x/archives/18003783.html)

```
$ yum -y install openssl-devel zlib-devel readline-devel
$ cpan -i IO::Socket::SSL
$ morbo -l "https://*:3001" app.pl
[info] Listening at "https://*:3001".
Server available at https://127.0.0.1:3001.
```

今度はうまくいった。
ブラウザからSSL版のページにアクセスし、無事にWebSocketの通信も動いていることを確認できた。
Rubyで第N曜日を求める（define_methodとsendを使う）

各曜日の配列を返すメソッド（sundays .. saturdays）をdefine_method()で定義する。
また、days()に渡すブロック内において曜日を判断するメソッド（sunday? .. saturday?）をsend()で呼び出す。

```rb
require 'date'

class Date
  %w[sunday monday tuesday wednesday thursday friday saturday].each{ |day|
    define_method("#{day}s") { days { |date| date.send("#{day}?".to_sym) } }
  }
  def days
    firstday = self.firstday
    lastday = self.lastday
    results = []
    firstday.upto(lastday) {|date|
      results << date if yield date
    }
    results
  end
  def firstday
    Date.new(self.year, self.month, 1)
  end
  def lastday
    next_month = self >> 1
    next_month_first_day = next_month.firstday
    next_month_first_day - 1
  end
end
```
public_sendを信用しちゃいけないよ、というお話

Rubyでは、`private`なメソッドは普通に呼んでもエラーになります。

```rb
class Foo
  private
  def bar
    puts "Don't call me!"
  end
end

Foo.new.bar
#=> NoMethodError: private method `bar' called for #<Foo:0x007fe1232991c0>
```

一方、Rubyには`send`というメソッドがあって動的なディスパッチが可能となっていますが、これは`private`なメソッドも呼べてしまいます。

```rb
Foo.new.send :bar
#=> Don't call me!
```

そこで、`public`なメソッドのみが呼べる`public_send`というものが用意されています。

```rb
Foo.new.public_send :bar
#=> NoMethodError: private method `bar' called for #<Foo:0x007fe123238aa0>
```

しかし、`public_send`にはこんな抜け道が……

```rb
Foo.new.public_send :instance_eval, 'bar'
#=> Don't call me!
```

そう、`instance_eval`を使い、引数として呼びたいメソッドの名前を「文字列で」渡せば`private`なメソッドも呼べてしまうのです（シンボルでは動作しません）。
この辺はRubyの自由度の高さですが、それが裏目に出る場合もあります。
例えばRailsで外部からの入力を直接、動的にディスパッチする必要がある場合、`public_send`を使うだけでは危険です。おそらく呼びたいメソッドの種類はそう多くないので、ホワイトリスト形式でそれらをリストアップし、残りはsendすべきではないでしょう（そもそもそんな危ない橋を渡るな、という話ですが……）。

```rb
whitelist = %w(foo bar buzz)
if whitelist.include? params[:method_name]
  obj.public_send params[:method_name]
else
  raise "Not in whitelist"
end
```

以上、Rubyの世界ではすべてが`public`なんだ！というお話でした。

追記：
参考：http://www.phenoelit.org/stuff/hitb2013ams/#/
runkitでprivateな__constructを呼び出す

[前回](http://qiita.com/rana_kualu/items/43dddf983303a2777f05)の続き。
runkitにはクラスに対しても色々やっちゃうことが可能です。

```php
<?php
	// クラス
	class A{ public static function getName(){print('A');} }
	class B{ public static function getName(){print('B');} }
	class C extends A{}
	print(C::getName()); // A
	
	runkit_constant_add('C::hoge', 1);
	print(C::hoge); // 1
	
	runkit_class_emancipate('C');
	print(C::getName()); // Fatal error: Call to undefined method C::getName()
	
	runkit_class_adopt('C', 'B');
	print(C::getName()); // B
```

クラス定数やメソッドの追加削除に留まらず、親クラス入れ替えなんて芸当もできてしまいます。
ここでは前やった[privateな__construct()呼び出し](http://qiita.com/rana_kualu/items/d13893e45ba131de8e72)を、runkitを使ってやってみます。

```php
<?php
	class HOGE{
	    public $value = 0;
	    private function __construct(){
	        $this->value = 1;
	    }
	}

	runkit_method_rename('HOGE', '__construct', 'construct');
	runkit_method_add('HOGE', '__construct', '', '$this->construct();', RUNKIT_ACC_PUBLIC);
	$hoge = new HOGE();
	print $hoge->value; // 1
```

クラスを書き換えた結果、最終的にはこういう形になっていると思われます。

```php
<?php
	class HOGE{
	    public $value = 0;
	    public function __construct(){
	        $this->construct();
	    }
	    private function construct(){
	        $this->value = 1;
	    }
	}
```

これならごく自然にnewできますね。
いいのかそれ。
なお、最近のPHP関数は引数にクロージャを受け付けてくれるものが多いですが、runkit_method_add()等は文字列しか駄目なようです。

runkitはあまりに強力すぎるため、実環境で使うことはまず無いでしょう。
こんな風に遊んでみるくらいならともかく、仕事でこんなことをやられたらたまったものではありません。
回文基数 (O(√n))

問題:
http://qiita.com/Nabetani/items/dabe8ec57e0313229552
http://nabetani.sakura.ne.jp/hena/ord17scheherazade/

http://qiita.com/shiracamus/items/20ae065c90007279c753 のアイデアをお借りしました。
O(√n)です。
「あるN(Nは単数でない自然数(2以上の整数))をn進法(nは単数でない自然数)で表すとする。それが2桁以上の回文となるならば、nはsqrt(N-1)以下か、N-1を整数除算した商である」という定理が導かれます<del>が、証明はできません(汗)</del>
Mi_Sawa氏よりコメントを頂きました。

>nが大体sqrt(N)以上くらいならまぁn進2桁なのでan+a=Nなるaが各桁になっている訳で, N=a(n+1)になるからNの約数-1を全部考えればいいよねという感じかな.

ありがとうございました。

- n<=sqrt(N-1)の場合は全部調べる
- (sqrt(N)を越える最小の整数)<=n<=N-1の場合、N=an+a=a(n+1)<=>n=N/a-1とできるので、 **Nの約数aを列挙し1を引けば良い**
- と思ったのですが、2=6/2-1を捕捉してしまう問題が出たので今回はこちらもpalindrome判定します--;

|Language|Validator C++(Text)|Validator Ruby(HTTP)|
|:--|:--|:--|
|C++|0.02s|0.22s|
|Ruby|**0.06s**|0.26s|

0.2秒は鍋谷さんのサーバーからHTMLを拾って解析する時間です。
おそらく0.02sはfork/execlに要する時間と見て良いと思われます。

> clang -O2 hena17pre.c;echo 999999999|time ./a.out # 4.83s
> clang++ -O2 hena17pre_fast.cpp;echo 999999999|time ./a.out # 0.00s

```cpp:hena17pre_fast.cpp
//http://qiita.com/Nabetani/items/dabe8ec57e0313229552
//http://nabetani.sakura.ne.jp/hena/ord17scheherazade/
#include <deque>
#include <cstdio>
#include <cmath>
bool palindrome(int n,int b){
	int n0=n,n1=0;
	for(;n0;n0/=b)n1=n1*b+n0%b;
	return n1==n;
}
int main(){
	int n,i;
	for(;~scanf("%d",&n);){
		if(n<3)puts("-");
		else{
			std::deque<int> result;
			for(i=sqrt(n-1);i>1;i--){
				if(palindrome(n,(n-1)/i))result.push_back((n-1)/i);
				if((n-1)/i!=i&&palindrome(n,i))result.push_front(i); // n-1 might be a square number
			}
			for(i=0;i<result.size();i++)printf("%d,",result[i]);
			printf("%d\n",n-1);
		}
		fflush(stdout);
	}
}
```

```rb:hena17pre_fast.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/dabe8ec57e0313229552
#http://nabetani.sakura.ne.jp/hena/ord17scheherazade/
STDOUT.sync=true
class Integer
	def palindrome?(b)
		n0=self
		n1=0
		while n0>0
			n1=n1*b+n0%b
			n0/=b
		end
		n1==self
	end
end
while gets
	n=$_.to_i
	if n<3 then puts '-';next end
	result=[]
	Math.sqrt(n-1).to_i.downto(2).each{|i|
		result.push((n-1)/i) if n.palindrome?((n-1)/i)
		result.unshift(i) if (n-1)/i!=i&&n.palindrome?(i) # n-1 might be a square number
	}
	puts (result+[n-1])*','
end
```
uniteでfile_include的な挙動を実装する

導入
--------------------------------------------------------------------------------
あけvim!
この記事は[Vim Advent Calendar 2013](http://atnd.org/events/45072)の34日目の記事です。
前日は @ne_sachirou さんの [Vimで、文字数をstatuslineやlightline.vimに表示する](http://c4se.hatenablog.com/entry/2014/01/02/010615) でした。

さて、去年のVACで紹介した拙作pluginであるところのunite-javaimportに対して、
速度改善の目的でfile_include的な挙動を実装しましたので、今日はその話をしたいと思います。

リポジトリはこちら [unite-javaimport](https://github.com/kamichidu/unite-javaimport.git)

モチベーション
--------------------------------------------------------------------------------
javaのインポート可能なクラスの数というのは、どうしても巨大になります。
最低限、jdk標準ライブラリに含まれるpublicクラスだけと考えたとしても、1万クラス以上あります。
unite.vimで1万以上の候補を表示させようとすると、世界が止まります(stop the world!)。
なので、何かしらの回避策を用意する必要がありました。
lingrのvim部屋で何か良い方法は無いかと質問を投げたところ、file_include的な挙動にすれば表示する候補数を絞れるんじゃないかと有り難い指摘を頂きました。

実装方針
--------------------------------------------------------------------------------
javaのインポートの仕組みを考えてみます。
基本的にインポート可能なクラスは、publicなクラスのみです。
publicなクラスにネストしたpublicなクラスもインポート可能です。
またクラスはパッケージで修飾することが推奨されます。
これらの事実から、方針を以下のように定めました。

1. 最初にuniteインタフェイス上にパッケージ名のみを列挙
1. 選択されたパッケージ内に存在するクラスを列挙
1. 選択されたクラス用のインポート文を挿入

以上の仕様にすることで、表示され得る候補数を、最大で数千程度まで減らすことができます。
数千程度なら、stop the worldを回避できそうです。

実装方法
--------------------------------------------------------------------------------
では、早速本題であるところのfile_include的な挙動の実装方法について書いていきたいと思います。

まず、パッケージ名の列挙用のunite-kindを作成します。
名前は適当にexpandableとしました。

```vim:autoload/unite/kinds/expandable.vim
let s:kind= {
\   'name': 'expandable',
\   'default_action': 'expand',
\   'action_table': {},
\}

function! unite#kinds#expandable#define()
    return s:kind
endfunction

let s:action_expand= {
\   'is_start': 1,
\   'is_selectable': 0,
\}

function! s:action_expand.func(candidate)
    " unite-javaimportを再帰的に呼び出す
    " 通常の呼び出しと区別するため、引数を渡す
    call unite#start_script(['javaimport'], {'source__package': a:candidate.action__package})
endfunction

let s:kind.action_table.expand= s:action_expand
```

続いて、unite-javaimportのgather_candidates()から返却するcandidateのkindを、expandableにします。
また、クラス名の列挙の際には、kindは今まで通りjavatypeとします。

```vim:autoload/unite/sources/javaimport.vim
let s:source= {
\   'name': 'javaimport',
\}

function! unite#sources#javaimport#define()
    return s:source
endfunction

function! s:source.gather_candidates(args, context)
    " 説明のため、file_include的な処理と関係ない箇所は省略しています
    if has_key(a:context, 'source__package')
        let l:package= a:context.source__package

        " l:package以下に存在するクラス一覧を候補として返却
        return [
        \   {
        \       'word': 'hoge.fuga.Piyo',
        \       'kind': 'javatype',
        \   },
        \]
    else
        " パッケージ名の列挙
        return [
        \   {
        \       'word': 'hoge.fuga',
        \       'kind': 'expandable',
        \       'action__package': 'hoge.fuga',
        \   },
        \]
    endif
endfunction
```

まとめ
--------------------------------------------------------------------------------
以上、説明のための簡易的な実装でしたが、これでunite.vimでfile_include的な挙動が実装できました。
候補数が巨大になってしまうようなunite-sourceも、これで便利できますね。

以上でVAC2013の34日目の記事を終わります。
明日は @cocopon さんです。
環境ごとにfaviconを変える


[開発環境と本番環境で favicon を変える](http://qiita.com/hotchpotch/items/70d1446fec081fc95eee)
> 開発環境と本番環境をブラウザ上で間違って操作してしまった経験はありませんか？僕はあります。

僕もよくあります。。。（さっきもやっちまった）
設定したのでメモがてら。

```ruby:application_helper.rb
def display_favicon
  if Rails.env.production?
    favicon_link_tag '/favicon.ico'
  else
    favicon_link_tag "/favicon-#{Rails.env}.ico"
  end
end
```

```haml:application.html.haml
%head
  …
  = display_favicon
  …
```

public配下に環境ごとのfaviconを置く。
一目で分かる色にしておくとよいですね。

![favicon-env.png](https://qiita-image-store.s3.amazonaws.com/0/4545/dfb0c435-68bf-87e6-9c9b-1d77c07139ad.png "favicon-env.png")
アルゴリズムの計算量


# はじめに

アルゴリズムを比較する基準として、アルゴリズムの計算量がある。
それぞれのアルゴリズムが答えを出すまでに要する計算時間などを計算し、比較する。

# O-記法

一般的に、計算量はO-記法を用いて表す。
O-記法は、関数の挙動を分かりやすい別の関数を目安にして記述するための記法である。

例えば、関数 `f(n)` が `g(n)` と同じような挙動をする場合、

    f(n) = O(g(n))
と表記する。


関数の挙動、つまり計算量の増加にさほど関係しない項は無視し、
また主要項の係数も無視する。

アルゴリズムの計算量が `O(g(n))` であるとき、このアルゴリズムのオーダーが
`g(n)` である、という。

# よく使われるオーダー

増加率の低いものから順に並べる。

つまり、計算量の小さい順。

| オーダー | アルゴリズムの例|
|----------|-----------------|
| O(1)     |                 |
| O(log n) | バイナリサーチ  |
| O(n)     | 線形サーチ      |
| O(n^2)   |                 |


なお、アルゴリズムのオーダーを表記する際、
対数の底が省略されていた場合はその対数の底は2であることが多い。

# リファレンス

 * [アルゴリズムとデータ構造 (岩波講座 ソフトウェア科学 3)](http://www.amazon.co.jp/アルゴリズムとデータ構造-岩波講座-ソフトウェア科学-3-石畑/dp/4000103431)

 * [ランダウの記号 - Wikipedia](http://ja.wikipedia.org/wiki/ランダウの記号)
   - O-記法について書いてある。

 * [対数 - Wikipedia](http://ja.wikipedia.org/wiki/対数)
   - 対数関数 log n について。
ときどき使う Vim コマンド


# `:h[elp] {subject}`
help ファイルを開く。

`{subject}` としてコマンド名を指定すると、
そのコマンドの help ページを開くことが出来る。

実行例)

    :help :scriptnames


 * リファレンス
   - [Vim-users.jp - Hack #45: help を引く](http://vim-users.jp/2009/07/hack45/)
     * help を引く際に役立つ tips が書かれている。

# `:scrip[tnames]`
読み込んだ全ての設定スクリプトを表示する。
Herokuで独自ドメインでWebアプリを動かす。(Route 53版)


別にRoute53に限らずできる手順だとは思いますが。

参考
https://devcenter.heroku.com/articles/custom-domains

## ドメインをRoute53に設定する
例として、example.comとすると、

* Create Hosted Zone
* 「example.com」を入力

## CNAMEレコードを登録する
サブドメインの例として、ex1.example.comとすると、

* Create Record Set 
*  Nameに ex1を入力 
*  TypeでCNAMEを選択 
*  Value に herokuでのドメインを入力（***.herokuapp.comみたいなやつ

これだけだとなんだか弾かれるので、herokuのコマンドを叩く。

## heroku CLIで、ドメインを登録
$ heroku domains:add ex1.example.com

これで、そのうち http://ex1.example.com が閲覧できるようになるはずです。
エスケープされた日本語文字列を読みたい

ちょっとした日本語出力がエスケープコードになってイラッとすることがある。
そのたびにツールをさがしたり変換スクリプトを書いてしのいできたが
実はコマンドの echo -e や printf で手間なしでデコードできることを最近知った。

```bash:
$ echo -e '\xe3\x82\xa8\xe3\x83\xa9\xe3\x83\xbc'
エラー
```


ただし環境によりでサポートに違いがあるので注意が必要。

```bash:

$ /usr/bin/printf '\xef\xbc\x91\xef\xbc\x96\xe9\x80\xb2\xe6\x95\xb0 \357\274\230\351\200\262\346\225\260 \u30e6\u30cb\u30b3\u30fc\u30c9 \n'
１６進数 ８進数 ユニコード

$ printf '\xef\xbc\x91\xef\xbc\x96\xe9\x80\xb2\xe6\x95\xb0 \357\274\230\351\200\262\346\225\260 \u30e6\u30cb\u30b3\u30fc\u30c9 \n'
１６進数 ８進数 \u30e6\u30cb\u30b3\u30fc\u30c9

$ /bin/echo -e '\xef\xbc\x91\xef\xbc\x96\xe9\x80\xb2\xe6\x95\xb0 \357\274\230\351\200\262\346\225\260 \u30e6\u30cb\u30b3\u30fc\u30c9'
１６進数 ８進数 \u30e6\u30cb\u30b3\u30fc\u30c9

$ echo -e '\xef\xbc\x91\xef\xbc\x96\xe9\x80\xb2\xe6\x95\xb0　\357\274\230\351\200\262\346\225\260 \u30e6\u30cb\u30b3\u30fc\u30c9'
１６進数 \357\274\230\351\200\262\346\225\260 \u30e6\u30cb\u30b3\u30fc\u30c9

```

上記は CentOS6.5 環境で試した例だが、まず bash の組み込みか、外部コマンドかで挙動が違う。
また他の環境でも試したが、サポート状況にばらつきあった。
マニュアルの記述もあてにならないので、今の環境でなにが変換できるかは実際に試してみるしかない。

ここで、よく見かける形式の例として

*  **\xHH** 16進数。 
   PHP で日本語メッセージを trigger_error() すると Apache の error_log にこの形式で出力される。
*  **\nnn** 8進数。
   Ruby でみかける。
*  **\uHHHH** ユニコードの16進表現
   Java のプロパティーファイル(properties) 。

もし文字化けしたら、それは文字コードの問題なので nkf などでさらに変換すれば読めるはず。

シェル関数かエイリアスでフィルタにしておくと便利かも。

```bash:
$ alias unesc='while read -r a; do /usr/bin/printf "$a\n" ; done'

$ tail -f error_log | unesc | grep 'エラー'
[Thu Jan 02 22:43:39 2014] [error] [client 192.168.56.1] PHP Notice:  妄想エラーです in　/var/www/html/trigger_error.php on line 3

```
第17回オフラインリアルタイムどう書くの参考問題をRubyで解く

問題はこちら。
http://nabetani.sakura.ne.jp/hena/ord17scheherazade/

```rb
def num2ary(num, radix)
  d,m = num.divmod(radix) 
  num == 0 ? [] : num2ary(d, radix) + [m]
end

def solve(q)
  num = q.to_i
  (2...num).each_with_object([]){|radix, a|
    ary = num2ary(num, radix)
    a << radix if ary == ary.reverse
  }.join(',').gsub(/^$/,'-')
end

DATA.readlines.each do |line|
  no,q,a,s = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans
  puts ans == a ? ' o' : ' x'
end
__END__
0	17301	5,38,100,218,236,5766,17300
1	2	-
2	1	-
3	3	2
4	4	3
5	5	2,4
```
python3でtwitter

twitterからツイートを取得するため、twitterライブラリを使った
https://github.com/sixohsix/twitter

##アプリを登録
https://dev.twitter.com/apps

登録後、Consumer keyとConsumer secretを確認する

##OAUTH_TOKEN、OAUTH_SECRETの取得
twitterライブラリにoauth_dance関数が用意されているので、それを呼び出し。
呼び出し後ブラウザでアプリ認証画面が開くので、ログインすればPIDが表示される。
PIDをコンソールに入力しEnter。
Oauth_TokenとOauth_secretが出力される。

```Python:oauth_test.py
from twitter import *
#第１匹数は何でもよい。
#第４匹数にファイル名を指定すれば、そのファイルに保存される模様
print(oauth_dance('hoge',consumer_key, consumer_secret))
```

##タイムラインの読み込み
※ライブラリのサンプルそのまま

```Python:get_timeline
from twitter import *
 
# 上記で取得した各token,secretを設定しアクセス
t = Twitter(
            auth=OAuth(OAUTH_TOKEN, OAUTH_SECRET,
                       CONSUMER_KEY, CONSUMER_SECRET)
           )
t.statuses.home_timeline()
```
回文基数


（元ネタ http://nabetani.sakura.ne.jp/hena/ord17scheherazade/ ）
いかにもProject Eulerの最初の方でありそうな問題。これは流石に5分で書ける。
実行時間も5msとかなので、そのまんまのコードだがもうこれでいいのではないかと。

```hs:
module Main where
import Control.Applicative
import System.Environment (getArgs)

base 0 b = []
base n b = (mod n b): base (div n b) b

palindromeBase n = filter (palindrome.base n) [2..n]
  where palindrome n = n == reverse n

-- コマンドラインから文字列を受け取って解答を出力
main = palindromeBase<$>read<$>concat<$>getArgs >>= printresult
  where printresult n = case n of
          [] -> putStrLn "[-]"
          n -> print n
```
第17回オフラインリアルタイムどう書くの参考問題をHaskellで書いた

実行効率は考慮せず素朴な方法で書きました。

```hs:base.hs
import Control.Applicative

--基数変換
convertBase :: Int -> Int -> [Int]
convertBase n b = convertBase' n b []
	where
		convertBase' :: Int -> Int -> [Int] -> [Int]
		convertBase' 0 _ ns = ns
		convertBase' n b ns = let q = n `div` b
		                          r = n `mod` b
		                      in convertBase' q b (r:ns)
--回文かチェック
isPalindrome :: [Int] -> Bool
isPalindrome ns = ns == reverse ns

solve :: Int -> String
solve n = let base = concatMap (\b -> if isPalindrome $ convertBase n b then [b] else []) [2..n]
          in if null base
          	then "-"
          	else listToString base
	where
		listToString (n:[]) = show n 
		listToString (n:ns) = show n ++ "," ++ listToString ns

main = do
	tests <- lines <$> readFile "test.txt"
	mapM (\t -> print $ runTest solve t) tests
	where
		runTest :: (Int -> String) -> String -> Bool
		runTest f t = let [input, output] = words t
		              in f (read input :: Int) == output 
```

```hs:test.hs
17301	5,38,100,218,236,5766,17300
2	-
1	-
3	2
4	3
5	2,4
6	5
10	3,4,9
101	10,100
1001	10,25,76,90,142,1000
10001	10,24,30,42,80,100,136,10000
1212	22,100,201,302,403,605,1211
123412	62,100,205,215,30852,61705,123411
5179	5178
4919	4918
5791	5790
5498	2748,5497
453	150,452
134	66,133
8489	27,652,8488
1234	22,616,1233
5497	41,238,5496
4763	19,35,432,4762
3974	17,27,1986,3973
3521	44,55,502,3520
5513	20,38,53,148,5512
8042	23,29,60,4020,8041
7442	37,60,121,3720,7441
4857	25,1618,4856
22843	49,69,91,141,430,22842
194823	84,121,21646,64940,194822
435697	160,169,235,626,1822,435696
142	3,7,70,141
886	5,14,442,885
3102	7,65,93,140,281,516,1033,1550,3101
17326	11,28,99,105,8662,17325
32982	13,72,238,477,716,1433,5496,10993,16490,32981
36	5,8,11,17,35
37	6,36
251	8,250
252	5,10,17,20,27,35,41,62,83,125,251
253	12,14,22,252
6643	2,3,9,81,90,510,948,6642
5040	71,79,83,89,104,111,119,125,139,143,167,179,209,239,251,279,314,335,359,419,503,559,629,719,839,1007,1259,1679,2519,5039
9240	23,38,62,104,109,119,131,139,153,164,167,209,219,230,263,279,307,329,384,419,439,461,615,659,769,839,923,1154,1319,1539,1847,2309,3079,4619,9239
```