OmniAICreator/Qiita-1.07M huggingface dataset:
MySQLのトリガを一時的に無効にする

MySQLのトリガを一時的に無効にする方法を調べてみました。

SET FOREIGN_KEY_CHECKS = FALSE

のトリガバージョンに当たる機能は、MySQL5.6時点で提供されてないので、自前でトリガ無効機能を実装する必要があります。

具体的には、トリガ定義で実行フラグセッション変数を参照して条件分岐するように書いてやるとうまくいきました。


```sql
create table hoge (
  id integer primary key auto_increment,
  val varchar(255)
);

DELIMITER $$
DROP TRIGGER IF EXISTS `valCheck_beforeInsert` $$
CREATE TRIGGER `valCheck_beforeInsert`
BEFORE INSERT ON `hoge` FOR EACH ROW

thisTrigger: BEGIN
  # トリガ有効フラグセッション変数をチェック
  IF (@TRIGGER_CHECKS = FALSE)
  THEN
    LEAVE thisTrigger;
  END IF;

  # トリガ処理
  SET NEW.val = 'moge';
END $$
DELIMITER ;
```

これで、@TRIGGER_CHECKS の値でトリガ有効/無効を切り替えることができるようになりました。


```sql
> insert into hoge values ();

> SET @TRIGGER_CHECKS = FALSE;

> insert into hoge values ();

> SET @TRIGGER_CHECKS = TRUE;

> insert into hoge values ();

> select * from hoge;
+----+------+
| id | val  |
+----+------+
|  1 | moge |
|  2 | NULL |
|  3 | moge |
+----+------+
3 rows in set (0.00 sec)

```

動いてますね。
セッション変数を使ってますので、コネクションごとに独立して有効/無効を切り替えられます。

[この記事](http://mysql-0v34c10ck.blogspot.jp/2011/06/how-to-disableenable-triggers-on-demand.html)を参考にしました。
Railsで"2013年9月21日"っていう文字をDateTime型に変換する


javaだと、SimpleDateFormat使ってやるやつ。

	require 'date'
	
	p DateTime.strptime("2013年9月21日", "%Y年%m月%d日")
	=> #<DateTime: 2013-09-21T00:00:00+00:00 ((2456557j,0s,0n),+0s,2299161j)>
SphinxをShinatraでホストしつつGithubのOAuth経由でチーム認証をかけたが



[Sphinxで作成したドキュメントをherokuでホスティング、Continuous Documentationなススメ(Basic認証付き)](http://qiita.com/sawanoboly@github/items/be1dbc9f19e93e4b62cf) の外伝。
『Basic認証』 => 『Github認証+特定のチームに属するかで閲覧可』 に変更してみたコード。

## 困った

### 認証箇所で困った

- Basic認証はRackモジュールだったので`publix`含む全リクエストが対象だった
- Github連携の`sinatra_auth_github`はSinatraの仕様に依存、=> `public`へのアクセスにフィルタがかけられない

> = 1.0 / 2010-03-23
> -- snip --
>  * Filters do not run when serving static files anymore. (Ryan Tomayko)
> [https://github.com/sinatra/sinatra/blob/master/CHANGES](https://github.com/sinatra/sinatra/blob/master/CHANGES)

publicに依存しまくっているSphinxホスティングはsinatra1.0でのこの変更が非常に厳しい。



### モンキーパッチで解決してしまった

> Important: The following notes on Sinatra::Base and Sinatra::Application are provided for background only - extension authors should not need to modify these classes directly.
> [http://www.sinatrarb.com/extensions.html](http://www.sinatrarb.com/extensions.html)

すまない公式、`Sinatra::Base`オープンです。`before`フィルタを`public(static)`配信時にも実行するように猿りました。


## 問題のコード



```ruby:config.ru
require 'sinatra'
require 'sinatra_auth_github'
set :public_folder, File.dirname(__FILE__) + '/build/html'

use Rack::Session::Cookie,
  :secret => Digest::SHA1.hexdigest(rand.to_s),
  :expire_after => 3600

set :github_options, {
  :scopes    => "user",
  :secret    => ENV['GITHUB_CLIENT_SECRET'],
  :client_id => ENV['GITHUB_CLIENT_ID'],
}

@@github_team = ENV['GITHUB_TEAM_ID']

register Sinatra::Auth::Github


## Monkey for static filter
module Sinatra
  class Base
    class_eval do
      alias :org_static! :static!
      def static!
        filter! :before
        org_static!
      end
    end
  end
end

## user is team_member?
before do
  if request.path_info.end_with?('.html')
    begin
      body = github_team_authenticate!(@@github_team)
    rescue
      ## return securocat!
      halt 401, body
    end
  end
  if request.path_info == '/logout'
    logout!
    redirect 'https://github.com'
  end
end

get '/' do
  redirect "/index.html", 301
end

not_found do
  unless request.path_info.end_with?('.ico')
    redirect "#{request.path_info}.html", 301
  end
  halt 404
end

run Sinatra::Application
```

## 認証

とりあえず`*.html`へのリクエストに対して、Github未ログインorアプリ認証許可なしならGithubへ飛ばします。Github認証が済んでおり、特定のチームに所属するならドキュメントを閲覧OK。

そうでない奴は`securocat`さんにご登場願う仕様になりました。

![Denied.png](https://qiita-image-store.s3.amazonaws.com/0/7454/6e22fa97-da13-c272-c711-20e000c1285d.png "Denied.png")


## モンキーパッチ脱出案？

- RackのミドルウェアとしてSinatraの前で認証をかける
- `public`を使わずあくまで`get`で処理し、`File.exists?`と`file_send`で頑張る

どうしたものかと。
Sass 3.3で画像ファイル名に@2xを付ける関数

Retinaディスプレイ用の画像のために変数を定義するのがダルいので関数で`@2x`を付けれるようにしました。

```sass:function-image-retina.scss
@function image-retina($image, $suffix: '@2x') {
  $pos: str-index($image, '.');
  $proc: $pos;

  @while ($proc > 0) {
    $i: str-index(str-slice($image, $proc + 1), '.');
    @if $i > 0 {
      $pos: $i;
    }
    $proc: $i;
  }

  $pos: if($pos > 0, $pos, str-length($image) + 1);
  $file-name: str-insert($image, $suffix, $pos);
  @return image-url("#{$file-name}");
}
```

```sass
$image-logo: "logo.png";

#site-name a {
  background-image: image-retina($image-logo);  // => url("images/logo@2x.png")
}
```
Google Play Game Services で実績のアイコンに透過PNGを指定するとき

Google Play Game Services で実績のアイコンに透過PNGを指定しようとしたらこんなエラーがでてしまった。

![スクリーンショット 2013-09-17 9.37.24.png](https://qiita-image-store.s3.amazonaws.com/0/12564/71970075-9988-2198-2355-b2d0998777d0.png)

他のゲームを見ると透過されたアイコンもあるのでおかしいなと思っていた。

そこで、PNG24(PNG32?)の形式に変換してアップロードしたらうまくいった。

![スクリーンショット 2013-09-17 9.38.13.png](https://qiita-image-store.s3.amazonaws.com/0/12564/322732ce-aaba-09c1-ec15-4083c1d9ee87.png)

ImageMagick を使うとしたら以下の様なコマンドで変換できるだろう。

```
    $ convert tikuwaAchievement.png PNG24:tikuwaAchievement24.png
```
tagの付け方

タグの付け方

```
git tag v1.0
```

リモートへタグを反映させる

```
git push origin v1.0
```

反映してないタグを全て反映させる。

```
git push origin --tags
```

タグをpull

```
git pull origin --tags
```

タグを削除

```
git tag -d v1.0
```
wordpressのプロフィール編集から不要項目をjQuery + CSS3セレクタで削除

##よくある回答
###フィルターフックuser_contactmethodsにunset()使えば削除できるよ！
>function foo( $bar ) { unset($bar['aim']); }
>add_filter('user_contactmethods','foo',10,1);

そうだね。こんな感じで削除できるね。
aim, jabbar, yimだけなら……な（facebookやtwitterも多分いける）。

でも、ネットでよく転がってる上記の方式だと、例えば配色とか、姓名の入力欄とか、
そんな項目が削除できないんだよね……。

###今回提示する解決策の要綱
functions.phpのアクションフックにjQueryとCSS3のセレクタを使用し、
該当箇所をdisplay:none;で潰して行きます。

###だったらCSS3を読みこませるだけでいいんじゃね？
IE8以下がCSS3を扱えないので……。
selectivizr.jsが使えれば良かったんですが、wordpressと相性が悪いみたいで。


##例示の前に、wordpressでjQueryを扱うコツ
jQueryの記法、$(...)は、wordpressではjQuery(...)と記述すること。
今まで知らなかったんだ……。だってJavascript苦手なんだもん……。

WordPressでjQueryを使うときに、問題なく動作させる為の基礎知識やTipsと、動かない場合の対処例
http://kachibito.net/web-design/wordpress-with-jquery.html

##実際の例

```php
/* プロフィール欄の不要項目を、jQueryで削除 */
function profile_js() {
    ?>
<!-- wordpress3.1.4以下なら、下記が必要。使用中のjQuery1.7以上なら以下がなくても動く -->
<!--[if lt IE 9]>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
<![endif]-->

<script type="text/javascript">
	tftn = "table.form-table:nth-of-type";
	jQuery(document).ready(function() {
		jQuery("div#profile-page h3").css("display", "none");
		jQuery(tftn + "(1)").css("display", "none");
		jQuery(tftn + "(2) tr:nth-child(2)").css("display", "none");
		jQuery(tftn + "(2) tr:nth-child(3)").css("display", "none");
		jQuery(tftn + "(2) tr:nth-child(4)").css("display", "none");
		jQuery(tftn + "(2) tr:nth-child(5)").css("display", "none");
		jQuery(tftn + "(3) tr:nth-child(2)").css("display", "none");
		jQuery(tftn + "(4) tr:nth-child(1)").css("display", "none");
	});
</script>
<?php }
//アクションフックshow_user_profileにこのスクリプトを組み込む
add_action( 'show_user_profile', 'profile_js' );
```
特定のクラスを継承していて、かつ特定のインターフェースを実装している型を受け付けるメソッドの作り方

型Aを継承していて、かつインターフェースIBを実装しているような型だけを引数に受け付けたい。

以下、型A＝System.Web.UI.Page、インターフェースB＝IHogePage とする。

```csharp:方法1.cs
// Page または IHogePage を引数にして中で型チェック。不正なら例外を投げる。
public void Hoge(Page page)
{
    var hoge = page as IHogePage;
    if (hoge == null) throw new ArgumentException();
    page.Controls.Add(new TextBox { ID = hoge.HogeMember });
}

public interface IHogePage
{
    string HogeMember { get; }
}
```

* メリット
    * .NET的に素直？
* デメリット
    * `IHogePage` を実装していなければいけないことがシグネチャから伝わらない
    * `IHogePage` を実装していない型のインスタンスを渡してしまっても実行時までエラーにならない

```csharp:方法2.cs
// Page を継承していて IHogePage を実装する抽象クラスを作る
public void Hoge(HogePage page)
{
    page.Controls.Add(new TextBox { ID = page.HogeMember });
}

public interface IHogePage
{
    string HogeMember { get; }
}
public abstract class HogePage : Page, IHogePage
{
    public abstract string HogeMember { get; }
}
```

* メリット
    * 型安全になる
* デメリット
    * `HogePage` 以外を継承したいクラスに対応できない

```csharp:方法3.cs
// ジェネリックメソッドにして型制約で 2 つの型を強制させる
public void Hoge<T>(T t)
    where T : Page, IHogePage
{
    t.Controls.Add(new TextBox { ID = t.HogeMember });
}

public interface IHogePage
{
    string HogeMember { get; }
}
```

* メリット
    * 型安全かつ好きなクラスを継承してもらえる
* デメリット
    * ジェネリック本来の使い方と違う気が

方法3がベストな気がしていますが、本来ジェネリックである必要はないので気持ち悪さが残るところ。
MySQL - ネクストキーロックってどこまでロックされんの？

個人的にMySQL一番の鬼門のネクストキーロック。未だにまともな正解はわからないけれど、法則性らしきものが理解できてきたのでまとめてみる。

### そもそもネクストキーロックとは
InnoDBの行ロックはネクストキーロックを採用している。検索時はネクストキーロックを用いてインデックス走査を行うので、ギャップロックが起こる場合は常に先のギャップもロックされており、これによってファントムリードを防ぐ。一意のインデックスを持つ固有値検索の場合はギャップロックする必要がないが、値域検索の場合はギャップロックをする。

固有値検索はギャップロックしないはずだが、存在しない行を読み取ろうとした場合は排他・共有ロックではなく、ギャップロックがかかる。同時にネクストキーロックもかかるのでproduct_id = 19にはINSERTできない。

```
mysql> select * from products where product_id = 18 for update; #Tx1
Empty set (0.00 sec)
```
```
mysql> insert into products values (19, 'line', 200000); #Tx2
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
```
値域検索の条件によっては無限大にロックをかけることもある

```
mysql> select * from products where product_id > 20 for update; #Tx1
+------------+--------------+--------+
| product_id | product_name | price  |
+------------+--------------+--------+
|         21 | line         | 200000 |
+------------+--------------+--------+
1 row in set (0.00 sec)
```
```
mysql> insert into products values (37, 'line', 200000); #Tx2
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
```

### ネクストキーロックのロック範囲
ネクストキーロックの次の行とはテーブルの下の行ではなく、インデックス走査時の向きから見て先の行と捉えるべき。よって、product_id < 15などのような検索条件の場合、インデックス上を一度15まで走査し、その後15以下の方向へ走査していくので、16や10などにロックがかかることが予想される。 [参考](http://d.hatena.ne.jp/sh2/20090112)　また、ネクストキーロックがかかる範囲については、インデックス走査時に条件値の次に存在している値までがギャップロックされると推測できる。(product_id <= 15の条件で、15の次は20だった場合、20までがネクストキーロックされるイメージ)

![スクリーンショット 2013-09-19 12.34.47.png](https://qiita-image-store.s3.amazonaws.com/0/7797/b757ef26-4524-fb36-94c5-8c7ff026200e.png)

以下のクエリではproduct_id = 12にネクストキーロックがかかる。その際にインデックス上で周辺行をまとめてギャップロックし、それとTx2のINSERTが競合している。

```
mysql> select * from products where product_id <= 12 for update; #Tx1
+------------+--------------+-------+
| product_id | product_name | price |
+------------+--------------+-------+
|          1 | macbook pro  |   150 |
|          2 | iphone 5     |   150 |
|          3 | iPad         |   150 |
|          4 | NULL         |  1000 |
|          5 | sample       |   150 |
|          6 | sasa         |   150 |
|          7 | sasa         |   150 |
|          8 | thinkpad     |   150 |
|          9 | lenovo       |   150 |
|         10 | eeee         |   150 |
|         11 | fff          |   100 |
|         12 | fff          |   800 |
+------------+--------------+-------+
12 rows in set (0.00 sec)
```
```
mysql> insert into products values (13, 'fff', 800); #Tx2
#待機状態
```

何回か実験して得られた傾向なのでこれが正解とは言えないけど、参考までに。自分でも色々試してみるといいと思います。
alias bar= foo= でインデントが下がってしまったときの対処方法

イコールで終わるメソッドを alias すると _ の位置までインデントが下がってしまったけど

```rb
alias bar= foo=
  _
```

試しにセミコロンをつけたら騙せた。

```rb
alias bar= foo=;
_
```

↓ 直すのが難しいらしい。

ruby-mode.el indentation bug
http://ruby.11.x6.nabble.com/ruby-dev-28603-Re-ruby-mode-el-indentation-bug-tt3512961.html#none
[ReVIEW Tips] 文字を強調する

ReVIEWには強調用のインライン記法がいくつかあります。

- ``@<b>{...}``
- ``@<i>{...}``
- ``@<strong>{...}``
- ``@<em>{...}``

分かる人には分かる（というよりバレバレな）通り、基本的にはHTMLの各タグを意識しているわけですが、実際にはそれぞれをどう使い分けるかは特に決まっていません。文書ごとに好きに使い分けていただければ良いかと思います。

例えば``@<i>``はイタリック用のものなのですが、日本語文章、特に縦書きであればふつうイタリック・斜体などは使わないのでゴシックの指定に代用すると便利、と某電書ちゃんも言ってました。そういうのもアリだと思います。

- http://blog.livedoor.jp/denden_proj/archives/31898341.html
[ReVIEW Tips] 文字に網掛けする

ReVIEWはなぜか網掛け専用のインライン記法があります。

```review
@<ami>{この部分が網掛けになる}
```

HTMLBuilder(EPUB)については、指定された部分がamiクラスのspan要素になるので、適宜background-imageやbackground-colorなどで指定してください。簡単に背景をグレーにするだけなら以下のようにすれば実現できます。

```css
.ami {
  background-color: #cccccc;
}
```

なお、LATEXBuilderではascmacパッケージにある`\mask`マクロを使って実現してます。
変えたい方は`reviewami`マクロを再定義してください。
RubyのオブジェクトをMessagePack+LZMAでディスクに小さく保存する

Rubyで中間データをディスクにダンプする場合

```rb:dump
require 'yaml'
File.open('hoge.yaml', 'w') { |f|
    f.write(hoge.to_yaml)
}
```

とやって保存したものを

```rb:load
require 'yaml'
hoge = YAML.load_file 'hoge.yaml'
```

などと書くことで、ディスクとメモリを容易に行き来できます。
yamlは人間の目にも比較的読みやすいため便利です。

MessagePack + LZMA圧縮
======================
クローラなどで大規模なデータを処理する場合、ディスクの専有サイズが問題になることがよくあります。
そこでmsgpack+lzmaを使う事で従来より飛躍的にサイズを縮小することができます。
[msgpack](http://msgpack.org/)はJSONに近いセマンティクスを提供するオブジェクトのバイナリフォーマットです。バイナリである上、小さい数値データや真偽値などの保存に特に効果を発揮するフォーマットになっています。
lzmaは比較的最近開発された圧縮形式で、gzipよりは遅い圧縮速度と高い圧縮効率、圧縮効率の割に高速な展開速度を誇ります。(bz2の方が圧縮率では一枚上手だけど展開が遅すぎる)

msgpack, lzma共にRubyのネイティブエクステンションの形で提供されているため非常に高速です。

まずインストールは

```shell-session
$ gem install ruby-lzma
$ gem install msgpack
```

で行えます。そして

```rb:dump
require 'msgpack'
require 'lzma'
File.open('hoge.dump', "w") {|f|
  f.write LZMA.compress(hoge.to_msgpack)
}
```

のようにしてファイルに書き出せます。書いたものは

```rb:load
hoge = MessagePack.unpack(LZMA.decompress(File.read('hoge.dump')))
```

のように読み出せます。

サイズ比較
=========

たまたま僕の手元に過去の一定時間のツイートを集めたjsonファイルが1MB近くあるのでこれを圧縮保存した物を比較します。

```shell-session
-rw-r--r--  1 kumagi kumagi 917013  9月 17 09:53 tweets.json # 元ファイル：ツイートのJSONデータ
-rw-r--r--  1 kumagi kumagi 962256  9月 17 09:57 tweets.yaml # ↑のデータをYAMLにしたもの
-rw-r--r--  1 kumagi kumagi  85998  9月 17 10:04 tweets.dump # ↑のデータをmsgpack+lzmaにしたもの
```

マーベラス。
大差ない記述量で使用するディスク領域が1/10以下になっています。
ダンプのデータを人間が目視で読めないという点を除いて、先に記述したYAMLの時と同様の使い勝手で利用できるのでおすすめです。
ln コマンドでディレクトリを上書きする

`ln -sf` と上書きのオプションをつけていても対象がディレクトリだった場合上書きされない場合があります。

CentOS6.4, ln (GNU coreutils) 8.4 #上書きされない
Ubuntu12.04, ln (GNU coreutils) 8.13 #上書きされない
Fedora 18, ln 8.17 #上書きされる
Arch Linux, ln 8.21 #上書きされない

な感じです。 ln コマンドがそんなにバージョンアップしてた事自体に驚きが隠せないのですが、どのバージョンでも可能な対策があります。

# 対策

-n オプションを使う

```
-n, --no-dereference
       treat  LINK_NAME  as a normal file if it is a symbolic link to a
       directory
```

なので上書きしたい時は何も考えずに ln -snf としておくと良いでしょう。
忘れそうなら `alias ln='ln -n'` とか .bashrc にでも書いておけばオッケーです d( ´ー ｀)

## 参考

linux - how to overwrite symblic link of directory? - Super User
http://superuser.com/questions/645842/how-to-overwrite-symblic-link-of-directory
OS XにLLVMをsvnインストールする

コンパイラの勉強にLLVMがいいと聞いたので少し触ってみた。
およそ http://onsg.techtalk.jp/09/how-to-install-llvm のujihisaさんの手順の通りにやった。

1. gmakeが入っていない場合は入れる

    ```bash
% sudo port install gmake
Error: org.macports.activate for port ncurses returned: Image error: /opt/local/bin/captoinfo is being used by the active ncursesw port.  Please deactivate this port first, or use 'port -f activate ncurses' to force the activation.
--->  Computing dependencies for gettext
--->  Dependencies to be installed: ncurses
--->  Activating ncurses @5.9_2

    % sudo port -f activate ncurses
--->  The following versions of ncurses are currently installed:
--->      ncurses @5.7_1
--->      ncurses @5.9_2
Error: port activate failed: Registry error: Please specify the full version as recorded in the port registry.

    % sudo port -f activate ncurses @5.9_2   

    % sudo port install gmake
    ```
1. LLVMをインストール

    ```bash
% cd ~/src
% svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
% cd llvm
% ./configure --prefix=/Users/satzz/src/llvm/usr --enable-optimized # 場所は適当
% gmake -k |& tee gnumake.out
% gmake install
```
1. `~/src/llvm/usr` をPATHに追加。
1. あとは http://d.hatena.ne.jp/propella/20110224/p1 などを参考に挙動確認する。

※OS Xならllvm-gccなどはデフォルトで入っているらしい。
「第3回オフラインリアルタイムどう書くの参考問題」をPHPで解く

http://qiita.com/Nabetani/items/ebd8a56b41711ba459f9

野球のスコアカウントを行います。
得点やランナー等の無い超簡易版です。

```php
<?php

	class BASEBALL{
		
		/**
		* 野球のスコアカウント
		* @param  String 「ssbbbb」みたいな文字列
		* @return String 「010,020,021,022,023,000」みたいな文字列
		*/
		public function get($input){
			$baseball = [[0, 0, 0]];
			
			// すすめる
			for($i=0; $i<strlen($input); $i++){
				$baseball[] = $this->{'get'.strtoupper($input[$i])}(end($baseball));
			}
			
			// 文字列にして返す
			array_shift($baseball);
			$ret = '';
			foreach($baseball as $val){
				$ret .= ','.implode('',$val);
			}
			return substr($ret, 1);
		}
		
		// ストライク
		private function getS($input){
			// ストライク
			if(++$input[1] >= 3){
				$input[1] = 0;
				++$input[0];
				// アウト
				if($input[0] >=3){
					$input = [0, 0, 0];
				}
			}
			return $input;
		}
		
		// ボール
		private function getB($input){
			if(++$input[2] >= 4){
				$input[1] = $input[2] = 0;
			}
			return $input;
		}
		
		// ファウル
		private function getF($input){
			if($input[1] < 2){
				$input[1]++;
			}
			return $input;
		}
		
		// ヒット
		private function getH($input){
			$input[1] = $input[2] = 0;
			return $input;
		}
		
		// ピッチャーフライ
		private function getP($input){
			$input[1] = $input[2] = 0;
			// アウト
			if(++$input[0] >= 3){
				$input[0] = 0;
			}
			return $input;
		}
	}
	
	// テスト
	$test = [
		['s', '010'],
		['sss', '010,020,100'],
		['bbbb', '001,002,003,000'],
		['ssbbbb', '010,020,021,022,023,000'],
		['hsbhfhbh', '000,010,011,000,010,000,001,000'],
		['psbpfpbp', '100,110,111,200,210,000,001,100'],
		['ppp', '100,200,000'],
		['ffffs', '010,020,020,020,100'],
		['ssspfffs', '010,020,100,200,210,220,220,000'],
		['bbbsfbppp', '001,002,003,013,023,000,100,200,000'],
		['sssbbbbsbhsbppp', '010,020,100,101,102,103,100,110,111,100,110,111,200,000,100'],
		['ssffpffssp', '010,020,020,020,100,110,120,200,210,000']
	];

	$baseball = new BASEBALL();
	foreach($test as $key=>$data){
		$answer = $baseball->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
```

30分かからずで実装完了。
ひっかかるところが何一つ無かった。
やろうと思えば全サブルーチンを1行で実装可能ですが、そこまで削る必要もないでしょう。
Rails4でのController,Modelが呼び出すモジュールのロード

Rails4のController,Modelが呼び出すモジュールのロードに関するメモです。

Rails3まではプロジェクト内のlibディレクトリ内等にモジュールを設置し、config/application.rbファイル内にそのモジュール設置先PATH以下のファイルを自動でロードする設定をしていました。
Rails4からは、app/controllers, app/modelディレクトリにconcernsというディレクトリが存在します。コントローラやモデルで利用するモジュールはここに設置するようになったようです。これらのディレクトリは自動で読み込まれるようです。但し、絶対にconcernsディレクトリを使用する必要はないようで、従来通りのやり方でもいけました。

## 動作確認環境
- Rails (Ver 4.0.0)
 - [Rails 4.0: Final version released!](http://weblog.rubyonrails.org/2013/6/25/Rails-4-0-final/)

## サンプルコード
##### モジュール定義
```app/controllers/concerns/hogemodule.rb
module Hoge
  def hoge_module_method
    処理内容
  end
end
```

##### モジュールの読み込み(以下はコントローラクラスの例)
```/app/controllers/test_controller.rb
class TestController < ApplicationController
  ### モジュールの読み込み
  require 'hogemodule'
  include Hoge
  …
  def index
  …
  ### indexメソッド内でHogeモジュールの「hoge_module_method」メソッドを呼び出す
  hoge_module_method
  …
  end
  …
end
```

## 参考

- [Rails の自動読み込みの話](http://blog.eiel.info/blog/2013/09/07/autoload-rails/)
- [ActiveSupport::Concern](http://api.rubyonrails.org/classes/ActiveSupport/Concern.html)

Rails4でのController,Modleのモジュールの使い方
golangのパッケージインポート系のvimコマンド集

mattn氏の解説(http://mattn.kaoriya.net/software/vim/20130531000559.htm)では
全部書いてないので補足的備忘録

インポートは

:Import {path}
だけじゃなくて

:ImportAs {localname} {path}
で名前指定インポート

:Drop {path}
でインポート済みパッケージの削除ができる。

ソース：
http://golang.org/misc/vim/ftplugin/go/import.vim

追記：
さらにfmtだけはショートカット付きらしい
\fで　:Import fmt
\Fで :Drop fmt
たぶん、printデバッグするのに
インポートしたら使わないといけないgolangの制約のためかな。
Ansibleの変数の優先度

Ansible 1.3でroleのデフォルト変数と依存関係が設定できるようになったので、変数の優先度を調べてみた。

優先度が高い順から下記のようになっている。

- factsやregisterで設定される値
- roleにパラメータとして渡した値
- vars_file
- extra_varとしてコマンドラインから渡した値
- varsセクションで設定した値
- roles/x/vars/main.ymlで設定した値
- inventory_fileでホストに設定した値
- inventory_fileでグループに設定した値
- roles/x/defaults/main.ymlで設定した値

roles/x/meta/main.ymlで他のroleへの依存を設定した場合には、そのroleに設定した変数の
値も読み込まれる。（優先順位としては呼び出し元のroleの変数と同じで、呼び出し元のroleでも値が設定されていた場合には呼び出し元の値が優先されるようだ。）
複数のRoleで同じ変数名を使っているとハマることがあるかも。

**参考資料**
http://www.ansibleworks.com/docs/playbooks2.html
OpenCV2.4(+python)を手っ取り早くOS Xにインストールしてサンプルを試してみる

ネットや本を漁ってみると, 1.x の記事, 2.x の記事がごっちゃになっていて
混乱したので, 簡単にセットアップできる手順をまとめてみました.


#### インストール手順
- - - 

以下の手順で OpenCV 2.4 と, それを python から利用するためのライブラリ をインストールします.
`sudo port -v install opencv +python27 `

```bash
# OS X 標準の python を確認
$ which python 
/usr/bin/python

$ sudo port -v install opencv +python27 
・・・結果は略. 自分の環境では10分くらいでインストールできた・・・

# OS X 標準の python が変更されていないことの確認
$ which python
/usr/bin/python
$ python --version
Python 2.7.2

# インストールされた python を確認. MacPorts のディレクトリ( /opt/local/bin )の下
$ which python2.7
/opt/local/bin/python2.7

# どうやら python2.7 という名前でコマンドが通っているらしい. 
$ python2.7 --version
Python 2.7.5

# OpenCV のライブラリのパスを確認
# port でインストールしたところの python2.7 の影響下にインストールされてる模様
$ ls -l /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/cv2.so
-rwxr-xr-x  1 root  wheel  1579428  9 16 23:36 /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/cv2.so

```

#### 動作確認 
- - - 

ライブラリが python2.7 から参照できることをもって動作確認とします.

```bash
$ python2.7
Python 2.7.5 (default, Aug  1 2013, 01:01:17) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> 
# cv2ライブラリのインポートでエラーが出ないのでインストールはうまくいったと判断

# 開発元公式で配布されているサンプルプログラムを実行してみる
#   http://sourceforge.net/projects/opencvlibrary/files/
$ python2.7 opencv-2.4.6/samples/python2/find_obj.py

Feature-based image matching sample.

USAGE
  find_obj.py [--feature=<sift|surf|orb>[-flann]] [ <image1> <image2> ]

  --feature  - Feature to use. Can be sift, surf of orb. Append '-flann' to feature name
                to use Flann-based matcher instead bruteforce.

  Press left mouse button on a feature point to see its mathcing point.

using sift
img1 - 604 features, img2 - 969 features
matching...
75 / 80  inliers/matched
```

この時表示されるウィンドウのキャプチャがこちら.
![opencvSample.jpg](https://qiita-image-store.s3.amazonaws.com/0/8510/e1098bf1-77bd-f72d-72f8-457dad7d6834.jpeg)


#### まとめ
- - - 

以上で OpenCV のプログラムを動かすことができました.
あの面倒くさかった Cmake は port install の中でやってくれているようです.

#### 参考リンク
- - - 

利用したインストールコマンドは [開発元公式](http://opencv.willowgarage.com/wiki/Mac_OS_X_OpenCV_Port) に記載のある "1.Build via MacPorts" によっています.
apt-get が Reading package lists... となって死ぬほど遅いとき


## 問題

`apt-get install` や `apt-get update` しようとしたら軒並み以下の様な感じになって死ぬほど遅い。使いものにならないです。

```bash:
$ sudo apt-get -y install python-pip
Reading package lists... 12%
```

キャッシュクリアしてもだめ。
クリーンインストールしまくってたからディスク1ヶ月ももたずに逝ったか？と思って悲しくなったのですが、諦めきれずに探したらありました。

## 原因

**またIPv6ですか。。。**
SELinuxと並んであるあるですよ。

## 解決法

以下の項目を設定します。

```/etc/gai.conf
# 最後に追記
precedence ::ffff:0:0/96  100
```

システムを再起動します。

```bash
sudo apt-get -y update
```

快適。

## 参考サイト

### 嘆いている方々

- [ubuntu New Install - Very slow at "Reading package lists..." in apt-get](http://ubuntuforums.org/showthread.php?t=2104709)

### 本質的な答え

- [Bug 241305 Re: security.ubuntu.com not accessible in IPv6 (AAAA record missing in the DNS)](https://lists.ubuntu.com/archives/foundations-bugs/2013-March/140037.html)
- [Preferring IPv4 over IPv6 for apt-get | HoBBlog](http://www.buntschu.ch/blog/?p=493)
Struts2をすぐ試す - とにかくすぐにStruts2が動く環境が欲しくなったときに使えるよ！



参考: http://struts.apache.org/development/2.x/docs/struts-2-spring-2-jpa-ajax.html

# 前提
- jdk1.7がインストールされている
- maven3がインストールされている
- mysql5.5がインストールされて起動している

# やること

1. Webアプリで使用するテーブルを作る(CREATE文で。)
2. サンプルプロジェクトを準備する
3. 設定を環境に合わせる
4. WebアプリをJettyで動かす

# 1. Webアプリで使用するテーブルを作る(CREATE文で。)

↓これを実行する。

	CREATE TABLE 'quickstart'.'Person' (
	  'id' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
	  'firstName' VARCHAR(45) NOT NULL,
	  'lastName' VARCHAR(45) NOT NULL,
	  PRIMARY KEY('id')
	)
	ENGINE = InnoDB;

# 2. サンプルプロジェクトを準備する

## サンプルプロジェクトをダウンロードする

- [ここから](http://struts.apache.org/development/2.x/docs/struts-2-spring-2-jpa-ajax.data/quickstart_maven2.zip)
- ダウンロードしたら、 /Users/yujiroarai/workspace/java/struts2/ に置いて解凍する (場所はどこでも良い)

## jta(Java Transaction API)のjarファイルをダウンロードする

[ここから(Oracleのサイト)](http://www.oracle.com/technetwork/java/javaee/jta/index.html)

- Class Files 1.1っていうのをダウンロードする。
- ダウンロードしたら、拡張子をzipからjarに変更する。  
 jta-1_1-classes.zip → jta-1_1-classes.jar
- jar は /Users/yujiroarai/workspace/java/lib/ に置く（どこでも良い）

## mavenの設定に書いてあるライブラリをローカルリポジトリに登録する

	$ cd ~/workspace/java/struts2/quickstart
	$ mvn install:install-file -DgroupId=javax.transaction -DartifactId=jta -Dversion=1.1 -Dpackaging=jar -Dfile=/Users/yujiroarai/workspace/java/lib/jta-1_1-classes.jar

# 3. 設定を環境に合わせる

## eclipseプロジェクトにする

	$ mvn eclipse:eclipse
- そしたらeclipseにインポートしておく

## DB接続設定

quickstart/src/main/resources/applicationContext.xml を開く

  	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
	    <property name="url" value="jdbc:mysql://localhost/quickstart" />
	    <property name="username" value="root" /> # ←ここを自分のDB設定に変更する
	    <property name="password" value="root" /> # ←ここを自分のDB設定に変更する
	</bean>

quickstart/pom.xml を修正

	<!-- Java Transactions -->
	<dependency>
	    <groupId>javax.transaction</groupId>
	    <artifactId>jta</artifactId>
	-   <version>1.0.1B</version> # ← これを
	+   <version>1.1</version> # ← こうする
	</dependency>

# 4. WebアプリをJettyで動かす

	$ mvn jetty:run

http://localhost:8080/quickstart/ にアクセスすると動いてる！
[ReVIEW Tips] 目次を生成する

ReVIEWは標準で目次を生成します。

目次を生成したくない場合は、設定用YAMLファイルのtocプロパティをfalseにします。

```yaml
toc: false
```

目次にはもうちょっといろいろ設定があるのですが、仕様自体が整理されてないので少々お待ちください……。
Data.Binary.Get with Data.Conduit

引き続き簡単だった、ほぼ頭使わないで使える。

```hs:conduit_binary.hs
{-# LANGUAGE OverloadedStrings #-}

import Control.Applicative
import Data.Binary.Get
import qualified Data.ByteString as BS
import Data.Conduit
import Data.Conduit.Serialization.Binary
import Data.Word

query :: BS.ByteString
query = "\64\64\0ABC"

qSource :: Monad m => Source m BS.ByteString
qSource = yield query

getter :: Get (Word8, Word16, BS.ByteString)
getter = (,,) <$> getWord8 <*> getWord16be <*> getByteString 3

main = do
  result <- qSource $$ sinkGet getter
  print result
```
jsonを取得、表示するアプリケーション　その５

レスポンスで取得したデータを整形する
ただこのままだと日本語がユニコードエスケープされたままになるので変換処理をかませる

```groovy:json_client.groovy
import groovy.swing.SwingBuilder
import groovy.json.JsonOutput
import javax.swing.*
import java.awt.*

def cbMethod
def txtUrl
def txtParam
def txtJson

def tabPane

def prettyPrint = { text ->
	def result = JsonOutput.prettyPrint(text)
	(result =~ /\\u[0-9a-zA-Z]{4}/).each { match ->
		def code = match[2..5]
		def encTxt = new String([Integer.parseInt(code, 16)] as int[], 0, 1)
		result = result.replaceAll(/\\u${code}/, encTxt)
	}
	result
}

def sendRequest = {
	def url = txtUrl.text
	if (cbMethod.selectedItem == 'GET') {
		url = "${url}?${txtParam.text}"
	}
	
	def conn = url.toURL().openConnection()
	conn.requestMethod = cbMethod.selectedItem
	if (cbMethod.selectedItem == 'POST') {
		conn.doOutput = true
		conn.outputStream << txtParam.text
	}
	
	txtJson.text = prettyPrint(conn.inputStream.getText('utf-8'))
	tabPane.selectedIndex = 1
}

new SwingBuilder().frame(title:'jsonを取得、表示するアプリケーション', defaultCloseOperation:JFrame.EXIT_ON_CLOSE,
						size: [800, 600], show:true) {
	lookAndFeel('nimbus')
	borderLayout()
	hbox(constraints: BorderLayout.NORTH) {
		cbMethod = comboBox(items:['GET', 'POST'])
		txtUrl = textField()
		button(text:'送信', actionPerformed:sendRequest)
	}
	tabPane = tabbedPane(constraints: BorderLayout.CENTER) {
		scrollPane(name:'パラメータ') {
			txtParam = textArea()
		}
		scrollPane(name:'レスポンス') {
			txtJson = textArea(editable:false)
		}
	}
}
```

![qiita-005.png](https://qiita-image-store.s3.amazonaws.com/0/17179/8da0b259-dd27-1615-7ec1-5e3da6ca8365.png)
UIから受け取った値で要素を変化させる（handler）時にrefを使う

UIから受け取った値`styleCombo.getValue()`を元に要素を変化させるときのrefの使い方. こんな感じでいいんだろうか.

```clj
(def handler (reify EventHandler
               (handle [this event]
                 (let [style   (.. styleCombo getValue)
                       posture (ref FontPosture/REGULAR)
                       weight  (ref FontWeight/MEDIUM)]
                   (dosync
                     (condp = style
                       "Bold"       (ref-set weight FontWeight/BOLD)
                       "Italic"     (ref-set posture FontPosture/ITALIC)
                       "BoldItalic" (doto (ref-set weight FontWeight/BOLD)
                                          (ref-set posture FontPosture/ITALIC))
                       :default))
                   (.. text (setFont (Font/font family @weight @posture (Integer. size))))))))

(.. styleCombo (setOnAction handler))
```
第14回オフラインリアルタイムどう書くの参考問題


オフラインでリアルタイムに「どう書く」をやるイベント
http://atnd.org/events/43076
をやります。

前回は参考問題を公開した時点で満員だったんですが、今回はまだたくさん秋が……もとい、空きがあります。お気軽にどうぞ。

で。

今回の参考問題は「円周上のCrossing」という名前で、
http://nabetani.sakura.ne.jp/hena/ord14crosscircle/
です。

当日出す問題の難易度と分量はこれを目安に考えると良いと思います。
とはいえ、これよりは若干簡単にすると思います。

参加予定の方は、何分で解けたとかいう情報を付けてくださると、本番用の問題の参考になりますのでできればお願いします。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
MongoError: getFile(): bad file number value

```bash
MongoError: getFile(): bad file number value
```

保存しようとしたら上記のエラーが発生するようになってしまった。run repairしろと書いてある。repairすることにした。自分の場合は下記。

まずadminのDBでシャットダウン

```bash
mongo
use admin
db.shutdownServer();
```

これでDBが停止する。次いで下記。

```bash
mongod --repair --dbpath=/usr/local/var/mongodb
```
後での用事をtwitterにメモ代わりに投げておいて、@で返って来て忘れないようにする。


はい。今日は帰りに〜〜〜を買い物するのを忘れないように・・・などといった使用を想定しております。
自分のアカウントと受けて返す用のbotアカウントがあることを想定しております。
現在はまだ朝に一件だけ吸い上げて、夜にそれを返す程度のことしか出来ません。。。
毎日動作させるのに耐えられるとこまで書けておりませんが、出来たとこまでアウトプットしております。

```python:データベース用意
python -c "import sqlite3; db=sqlite3.connect('plan.db'); db.execute('create table plan(id, flag, name, plan)'); db.execute('''insert into plan values (0, 0, 'hoge', '実験成功！')'''); db.commit(); db.close()"
```

コマンドラインからこれからの動作用のDBファイルを用意。保存しているのは  発言id/フラグ判定用数値/スクリーンネーム/本文 です。フラグは0ですと未処理なのでtweet対象で終わると1になり過去ログになります。


```python:plan.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from urllib import urlencode
import twitter
import tweepy
import sqlite3
import datetime
import oat
##↑私的にOAuthトークンを保管しているものです。
t = datetime.datetime.now()


### table (id, flag, name, plan)
conn = sqlite3.connect('/plan.db')
c = conn.cursor()


def hakidashi():
# flagの値が0であるお知らせしていないものを探して処理
    c.execute('select * from plan where flag == 0')
    for row in c:
        tei = "@"+row[2]+" " + row[3]
        oat.client.request('https://api.twitter.com/1.1/statuses/update.json', 'POST', urlencode({'status': tei.encode('utf-8')}))
    c.execute('update plan set flag = 1 where plan = ?', (row[3],))
    conn.commit()
    c.close()


def suiage():

    yotei = oat.api.mentions_timeline()[0].text
    men = oat.api.mentions_timeline()[0].author.screen_name
    twid = oat.api.mentions_timeline()[0].id_str
    c.execute("insert into plan values(?, ?, ?, ?)",(twid, 0, men, yotei))
    conn.commit()
    c.close()

#cronで回すのに生活時間に合わせて調整をします。
if t.hour == 8:
    suiage()
else:
    hakidashi()
```
flagが0のものが一つもない場合の処理が出来ていないので定時で回すのはそれを先に。。
sqlite3の処理が書き方が悪いようで処理がすごく重いので機能を増やしたりなどはsql部分の効率を上げてから進めます。


####最低限動かすために現在で捨てているもの。
予定日付や時間なども定型文で投げるようにして保存させれば、お昼や夕方のことだったりその日だけで完結ではなく未来日のことにも対応。
idをとってるので予定はリプライで返す。
過去ログに同じ用事が複数あったならば日付間隔によってはbotから提案をさせる。
Closure で use するより引数の方が速い

下記のベンチマークで・・・

[PHP - Reflection vs Closure: どちらが高速にプライベートプロパティにアクセスできるかベンチマークを取ってみた - Qiita [キータ]](http://qiita.com/suin/items/6acd56c314f950444815 "PHP - Reflection vs Closure: どちらが高速にプライベートプロパティにアクセスできるかベンチマークを取ってみた - Qiita [キータ]")

私の環境 *(CentOS 6.4/phpenv install 5.4.19/php -n benchmark.php)* での結果は次の通りでした。

```
accessViaReflection: 0.1427960395813
accessViaClosure:    0.16929388046265
```

リフレクションの方が速いですが、accessViaClosure を次のように書き換えると結果が逆転しました。

```php
<?php
function accessViaClosure($object, $property)
{
    return call_user_func(
        Closure::bind(
            function ($property) {
                return $this->$property;
            },
            $object,
            $object
        ), $property
    );
}
```

結果

```
accessViaReflection: 0.14232921600342
accessViaClosure:    0.1159999370575
```

単に Closure で use していたものを引数に変えただけですが、それだけで結構変わるようです。

---

次のように、単純に use と引数を比べてみると・・・

```php
<?php
$x = 123;

///

$s = microtime(true);

for ($i = 0; $i < 1000000; $i++)
{
    call_user_func(function () use ($x) {});
}

$t = microtime(true) - $s;
echo "use: $t\n";

///

$s = microtime(true);

for ($i = 0; $i < 1000000; $i++)
{
    call_user_func(function ($x) {}, $x);
}

$t = microtime(true) - $s;
echo "arg: $t\n";

```

結構な差があるようです。

```
use: 0.53340888023376
arg: 0.36197400093079
```

↑のような即時関数で、use を引数に置き換えられるなら引数にした方が少し早くなるかもしれません。


・・・が、些細な差なので書きやすさ重視でしょうね。
OctopressをWindowsに入れる

Github Pagesをブログに出来るOctopressを入れたのでメモ。


#Rubyのインストール
http://rubyinstaller.org/downloads
からRubyとDevKitをダウンロード

Rubyをインストーラを使ってRubyをインストール

DevKitを適当なフォルダ(C:\Devkitとか)に解凍して、
cmdで`ruby dk.rb init`を実行

作成されたconfig.ymlにインストールしたRubyのパスが記載されている
(されていなければ手動で追加する)ことを確認し、
`ruby dk.rb install`


#Octopressのインストール
適当なフォルダで
```bash
git clone git://github.com/imathis/octopress.git
cd octopress
bundle install
```

windowsだと変なことになるみたいなのでRakefileの
`system "echo 'My Octopress Page is coming soon &hellip;' > index.html"`
という行を、
`system "echo 'My Octopress Page is coming soon ;' > index.html"`
に変える。

#Github Pagesの作成
Githubで、`ユーザ名.github.io`というリポジトリを作る。
古い資料だと.comとなってますが、ioになったらしいです。

#Octopressのセットアップ
```bash
bundle exec rake setup_github_pages
bundle exec rake install
```
途中でPagesのことを聞かれるので、先ほど作った自分のページを指定しましょう。

#コンテンツのアップロード
コンパイル
`bundle exec rake generate`
デプロイ
`bundle exec rake deploy`

#プレビュー
`bundle exec rake preview`
でhttp://localhost:4000/でプレビューできるよ！
二次元配列＠Ruby

10 * 10 の二次元配列をRubyで作る。

```ruby
size = 10
([[nil] * size] * size).map(&:clone)
```

最初、こういうコードを書いたけど、すべての行が同じ配列を参照することになるのでcloneしないといけないとか、そもそも読みにくいとかダサさを感じたので、

```ruby
size = 10
Array.new(size ** 2).each_slice(size).to_a
```

こう、とか？

```ruby
size = 10
Array.new(size) { Array.new(size) }
```

これが一番素直な気もしたりした。

ちなみにRubyには `matrix` と言う標準添付ライブラリがあるので

```ruby
require 'matrix'
Matrix.zero(10).to_a
```

とかでも同じようなものができる。nil埋めじゃなくて0埋めだけど。
Cookie Clickerをcapybaraでクリックする

[Cookie Clicker](http://orteil.dashnet.org/cookieclicker/) をcapybaraでクリックする

### セットアップ

[https://github.com/jugyo/capy](https://github.com/jugyo/capy)

`$ gem install  capy`

`$ gem install selenium-webdriver`

##### 必要ならChrome driver更新

[Download chromedriver](https://code.google.com/p/chromedriver/downloads/list)

`$ sudo mv ~/Downloads/chromedriver /usr/bin/`

### Capy

```ruby:cookie.capy
#!/usr/bin/env capy

visit 'http://orteil.dashnet.org/cookieclicker/'
sleep 2
1000.times { find('#bigCookie').click }
sleep 10

# ...
```

`$ capy cookie.capy`

終了するとブラウザは閉じて何もかも消える（意味ない）

---

**もともと目的は、Capybaraは外部サイトにも使えるし、いろいろ出来ることを確認したかった**

はっきりいって、少し進めれば自動で焼かれる数の方が大きいからクリックすること自体が不毛
それよりもChromeとかブラウザでmain.jsを書き換える方法が出回っている

結局、チートが度を超えると一気に面白い感覚が無くなる

ゲーム自体はすごいよくできてるゲームだと思った
日本から寄付(Donate)できなかった

---

#### Cookieを操作

ついでに少し調べたらできた
Cookieは手動で自分が使ったものと、Seleniumが立ち上げたものの間で面倒だがやり取りはできる

```ruby:cookie.capy
#!/usr/bin/env capy

require 'active_support/all'

visit 'http://orteil.dashnet.org/cookieclicker/'

cookie_value = 'XXXXX...%21END%21'
browser = Capybara.current_session.driver.browser
browser.manage.add_cookie :name => 'CookieClickerGame',
                          :value => cookie_value,
                          :path => '/cookieclicker',
                          :expires => 5.years.from_now
                          # Domain 'orteil.dashnet.org'

visit 'http://orteil.dashnet.org/cookieclicker/'
sleep 2
1000.times { find('#bigCookie').click }
sleep 120
```

さらに調べれば、自分のChromeのセッションのCookieとかもrubyのスクリプト内から変更とか出来るかもしれない

長年Capybara(Selenium)使っているが、既存のCookieをSeleniumに食わせてテストするとか、
必要になったことは正直一度も無い

#### main.js 改竄

main.jsをChrome Dev Toolとかで編集

```js:main.js
Game.Earn=function(howmuch)
{
  Game.cookies+=howmuch+10000000;
  Game.cookiesEarned+=howmuch+10000000;
}
```

とかすると数字が変わった
PHPでアルゴリズム「バイナリサーチ」

バイナリサーチの考え方は知っておいたほうがいい

という言葉を聞いてからやり始めたアルゴリズムのお勉強

以下ソース

```php:binary_search.php

<?php

<?php

//バイナリサーチ
function BinarySearch($x, $a, $left, $right){
    //検索範囲が配列の範囲外でエラー
    if($left < 0 or $right+1 > count($a)){
        return 'NOT FOUND';
    }
    while($left <= $right){
        //配列の真ん中の番号を変数$midでもつ
        $mid = (int)(($left + $right) / 2);
        var_dump($a[$mid]);
        //見つかったら配列番号を返す
        if($a[$mid] == $x){
            return $mid;
        }
        elseif($a[$mid] < $x){
            //ループ開始位置が真ん中から右になる
            $left = $mid + 1; //配列$aはソートされているので$xより$a[$mid]が小さければそれより左側に$xは存在しない

        }
        else{
            //ループ開始位置が真ん中から左になる
            $right = $mid - 1; //配列$aはソートされているので$xより$a[$mid]が大きければそれより右側に$xは存在しない
        }
    }
    //見つからなかったら以下を返す
    return "NOT FOUND";
}

//配列の要素数を指定
$N = 100;

//検索する配列を作成
$target_array = array();
$target_array[0] = mt_rand(1, 50) % 3;

for($i = 1; $i < $N; $i++){
    $target_array[$i] = $target_array[$i-1] + mt_rand(1,50) % 3;
}
//検索する値を指定
$search = 69;

$r = BinarySearch($search, $target_array, 0, $N-1);

//結果を表示
if($r == 'NOT FOUND'){
    print $search . "は見つかりません";
}
else{
    $r++; //表示用に1をプラス
    print $search . "は" . $r . "番目です";
}
```
PHPでアルゴリズム「リニアサーチ（番兵使った改良版）」

```php:LinearSearch_kai.php

<?php

//番兵を使った改良版リニアサーチ
function LinearSearch($x, $a, $num){
    $n = 0;

    //配列の最後の値を検索する値と入れ替える番兵作成
    //入れ替えた値は$tに保存
    $t = $a[$num-1];
    $a[$num-1] = $x;

    //目的の値を探す
    while($a[$n] != $x){
        $n++;
    }
    //配列最後の値を元に戻す
    $a[$num-1] = $t;

    //見つかったら表示
    //$t == $xのとき、一番最後の値が一致している
    if($n < $num-1  or $t == $x){
        $n++;
        print $x . "は" . $n ."番目です";
        return;
    }
    //見つからなかったら以下を表示
    print 'NOT FOUND';
}

$target_array = array();

//配列の要素数を指定
$N = 5;
//適当な配列を作る
for($i = 0; $i < $N; $i++){
    $target_array[$i] = mt_rand(1,10);
}
//検索する値
$search = 4;
LinearSearch($search,$target_array,$N);

```
プログラムソースから頻出単語を100個抽出

プログラムソースから単語を抽出してかっこいい変数名を付けたい。


```rb
require 'kconv'

src_pattern = ARGV[0] || "./rails-master/**/*.rb"
top_n = (ARGV[1] || 100).to_i

words = Dir::glob(src_pattern).to_ary.flat_map { |file|
	content = File.read(file)
	content.toutf8.scan(/(?:\b[a-z]+|[A-Z](?:(?:[A-Z]+)|(?:[a-z]+)))/).map(&:downcase)
}

count_by_words = words.inject({}) { |acc, word|
	acc[word] ||= 0
	acc[word] += 1
	acc
}

top = count_by_words.sort_by {|x| x[1]}.reverse.take(top_n)

header = <<EOS
|word|count|
|----|-----|
EOS

body = top.map { |line|
	inner = line.join('|')
	with_outline = "|#{inner}|"
	with_outline
}.join("\n")

puts header
puts body

```


以下は、railsの（予約語とかも拾っているので、あんまり参考にならない）


|word|count|
|----|-----|
|end|37357|
|assert|25213|
|def|19915|
|test|16533|
|option|16396|
|the|13086|
|value|11375|
|to|10619|
|n|9649|
|name|9224|
|do|8755|
|new|7817|
|active|7768|
|class|7518|
|a|6912|
|tt|5943|
|id|5720|
|if|5599|
|action|5159|
|post|5134|
|options|5118|
|record|4979|
|controller|4740|
|is|4483|
|time|4296|
|with|4215|
|true|3781|
|require|3472|
|nil|3437|
|in|3393|
|of|3258|
|type|3155|
|t|3120|
|for|3087|
|get|3046|
|and|3042|
|foo|3040|
|first|3003|
|expected|2916|
|base|2854|
|method|2842|
|topic|2745|
|be|2653|
|support|2644|
|self|2630|
|create|2599|
|module|2550|
|select|2487|
|app|2475|
|person|2469|
|string|2438|
|connection|2433|
|false|2379|
|path|2356|
|table|2292|
|title|2273|
|file|2268|
|rails|2250|
|not|2236|
|this|2225|
|default|2221|
|date|2214|
|include|2210|
|request|2187|
|html|2138|
|set|2108|
|key|2074|
|hash|2066|
|text|2057|
|content|2050|
|error|2020|
|object|2016|
|as|2010|
|response|1972|
|that|1962|
|posts|1948|
|index|1943|
|body|1935|
|render|1884|
|column|1848|
|you|1789|
|has|1738|
|config|1719|
|all|1685|
|each|1684|
|an|1675|
|find|1665|
|on|1660|
|model|1651|
|from|1635|
|cache|1620|
|case|1597|
|env|1594|
|user|1586|
|hello|1585|
|xml|1583|
|when|1563|
|http|1544|
|s|1534|
|attributes|1482|
PHPでアルゴリズム「リニアサーチ」

```php:linear_search.php

<?php

//リニアサーチ
function LinearSearch($x, $a, $num){
    $n = 0;
    
    //配列の範囲内で目的の値を探す
    while($n < $num && $a[$n] != $x){
        $n++;
    }
    //見つかったら表示
    if($n < $num){
        print $x . "は" . $n ."番目です";
        return;
    }
    //見つからなかったら以下を表示
    print 'NOT FOUND';
}

$target_array = array();

//配列の要素数を指定
$N = 5;
//適当な配列を作る
for($i = 0; $i < $N; $i++){
    $target_array[$i] = mt_rand(1,10);
}
//検索する値
$search = 4;
LinearSearch($search,$target_array,$N);

```
Pythonで逆アセンブラする

disモジュールを使って、関数のアセンブラコードのようなものを表示できます。

```py
import dis
dis.dis(lambda x, y, z: x + y * z)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 LOAD_FAST                2 (z)
              9 BINARY_MULTIPLY     
             10 BINARY_ADD          
             11 RETURN_VALUE        

dis.dis(lambda x, y, z: (x + y) * z)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 BINARY_ADD          
              7 LOAD_FAST                2 (z)
             10 BINARY_MULTIPLY     
             11 RETURN_VALUE        
```

アセンブラを理解していないし、どういう場面で役立つか分かってないが、Qiitaのテストかねてポスト。


[リファレンス](http://docs.python.jp/2/library/dis.html)
CentOS6.3にNew Relic MySQL pluginを入れてみる

MySQLとかその辺は入っているのを前提としています。
ちなみに今回試してみた環境のMySQLは5.6系です。

1. まずはJavaを入れる

openjdkで大丈夫みたいなので普通にyumでインストールする。

```
$ sudo yum install java-1.6.0-openjdk.x86_64
```
※普通にyum install javaとかやってしまうとjre1.5系が入ってしまい動きません。。。
　
2. pluginを取得する
https://rpm.newrelic.com/accounts/421449/plugins/directory/52
このページの一番下のDonwloadボタンより、ファイルをダウンロードする。

で、ダウンロードしたファイルを展開して、/usr/local/newrelic-mysqlに置く

```
$ tar zxvf newrelic_mysql_plugin-1.0.7.tar.gz
$ mv ./newrelic_mysql_plugin-1.0.7 /usr/local/newrelic-mysql
$ cd /usr/local/newrelic-mysql
```
　
3. MySQLのユーザーを作成する
パスワードの部分は適当に書き替えてください。

```
$ vim mysql_user.sql

CREATE USER newrelic@localhost IDENTIFIED BY PASSWORD 'パスワード';
GRANT PROCESS,REPLICATION CLIENT ON *.* TO newrelic@localhost;
CREATE USER newrelic@127.0.0.1 IDENTIFIED BY PASSWORD 'パスワード';
GRANT PROCESS,REPLICATION CLIENT ON *.* TO newrelic@127.0.0.1;
```

そしてスクリプトを実行する

```
$  mysql -uroot -p < mysql_user.sql
```
これでユーザー作成は完了。
　
4. 必要なファイルの用意
まずはファイルをコピーする

```
$ cp config/template_newrelic.properties config/newrelic.properties
$ cp config/template_mysql.instance.json config/mysql.instance.json
$ cp config/example_logging.properties config/logging.properties
```

で、newrelic.propertiesには自分のLicense keyを入れましょう。

```
$ vim config/newrelic.properties
LlicenseKey=自分のライセンスキー
```
次に、MySQLの接続設定を行います。

```
$ vim config/mysql.instance.json
```
```json
[
    {
        "name" : "Localhost",
        "host" : "localhost",
        "metrics" : "status,newrelic",
        "user" : "newrelic",
        "passwd" : "パスワード",
    },
]
```
　
5. 試しに起動できるかテストしてみる

```
$ java -jar newrelic_mysql_plugin-1.0.7.jar
INFO: New Relic monitor started
```

これで「INFO: New Relic monitor started」ってでれば、問題ないです。
　
6. 自動起動の設定とかとか

```
$ cp etc/init.d/newrelic-mysql-plugin.rh /etc/init.d/newrelic-mysql
$ chmod +x /etc/init.d/newrelic-mysql
$ chkconfig newrelic-mysql on
```
これであとはリロードすれば管理画面側にMySQLの項目が追加されていると思います。
New Relicがわでこんな感じで見れますよー。
![スクリーンショット 2013-09-16 16.06.43.png](https://qiita-image-store.s3.amazonaws.com/0/2095/f011b4db-2258-435f-02ce-a31231b6b560.png)


**参考**
http://youtu.be/wp260UT-GkM
https://github.com/newrelic-platform/newrelic_mysql_java_plugin
[ReVIEW Tips] EPUBのIDを指定する

EPUBではIdentifierを指定する必要があります。ReVIEWで作るEPUBにも、自動的にIdentifierが指定されます。

## IDの設定方法
ReVIEWのreview-epubmakerでEPUBを作成する場合は、設定用YAMLファイルのurnidプロパティで指定します。

```yaml
urnid: urn:isbn: 9784797372274
```

## IDを設定しなかった場合

urnidプロパティを指定しない場合でも、EPUB自体にはIdentifierがつきます。そうしないとEPUB的に正しいファイルにならないので。

この場合、ReVIEWでは自動的にUUIDによるIDが生成され、その値が設定されます。2回実行すると別々のUUIDが生成されるので（UUIDなので……）、ご注意下さい。
OS X Keyboard Cheat Sheet

⌘の長押しで表示される[CheatSheet](http://www.cheatsheetapp.com/CheatSheet/)はとても便利です。
よく使うショートカットをチートシートにまとめました。

# Special Key Symbols

まずはMacのキーボードの記号を覚えましょう。

| Symbol | Keyboard | Unicode | 由来 |
|:------:|:---------|:--------|:-----|
| ⌘ | [command](http://en.wikipedia.org/wiki/Command_key) | U+2318 | 北欧の交通標識の記号(正方形の角にループ) |
| ⌥ | [option](http://en.wikipedia.org/wiki/Option_key) / alt | U+2325 | 切り替えスイッチの回路図 |
| ⌃ | [control](http://en.wikipedia.org/wiki/Control_key) | U+2303 | テレタイプ端末の制御文字を入力 |
| ⇥ | [tab](http://en.wikipedia.org/wiki/Tab_key) | U+21E5 | 文字列を基準線にそろえる(空白を入れる) |
| ⇧ | [shift](http://en.wikipedia.org/wiki/Shift_key) | U+21E7 | タイプライターのアップストライク方式 |
| ← | ◀ | U+2190 | 左向き矢印 |
| ↑ | ▲ | U+2191 | 上向き矢印 |
| → | ▶ | U+2192 | 右向き矢印 |
| ↓ | ▼ | U+2193 | 下向き矢印 |
| ⎋ | [escape](http://en.wikipedia.org/wiki/Escape_key) / esc | U+238B | ◯から↖(脱出) |
| ⌫ | [delete](http://en.wikipedia.org/wiki/Delete_key) | U+232B | 紙テープに削除の印を付ける |
| ↩ | [return](http://en.wikipedia.org/wiki/Return_key) | U+21A9 | テキストエディタの改行(次の行へ移動) |


# Keyboard Shortcuts

キーボードのショートカットはたくさんあるので[ナレッジベース](http://support.apple.com/kb/HT1343?viewlocale=ja_JP)で検索しましょう。
よく使うものはピックアップして紹介します。(少しずつ増やしていきます。)


## Capture the screen

画面のスクリーンショットを撮る。

| Keys | 内容 |
|:-----|:-----|
| ⌘ + ⇧ + 3 | 全体画面のピクチャをファイルに保存 |
| ⌘ + ⇧ + ⌃ + 3 | 全体画面のピクチャをクリップボードにコピー |
| ⌘ + ⇧ + 4 | 選択範囲のピクチャをファイルに保存 |
| ⌘ + ⇧ + ⌃ + 4| 選択範囲のピクチャをクリップボードにコピー |
| ⌘ + ⇧ + 4 + Space | アプリケーションのピクチャをファイルに保存 |
| ⌘ + ⇧ + 4 + ⌃ + Space | アプリケーションのピクチャをクリップボードにコピー |

### Change Shortcuts

`システム環境設定`の`キーボード`で **スクリーンショット**のショートカットを変更できます。

## Switch the tab

Safari(ブラウザ)でタブを切替える。

| Keys | 内容 |
|:-----|:-----|
| ⌃ + ⇥ | 次のタブを選択 |
| ⌃ + ⇧ + ⇥ | 前のタブを選択 |

(ChromeやターミナルなどはKeysを合わせましょう。)

## Switch the application

アクティブのアプリケーションを切替える。 

| Keys | 内容 |
|:-----|:-----|
| ⌘ + ⇥ | 時計回りにアプリケーションを選択 |
| ⌘ + ⇧ + ⇥ | 反時計回りにアプリケーションを選択 |


## Switch window in the application

アプリケーションで開かれているウインドウを切替える。 

| Keys | 内容 |
|:-----|:-----|
| ⌘ + ` | 次のウインドウを選択 |
| ⌘ + ⇧ + ` | 前のウインドウを選択 |

USキーボード(英語)は **`**(アクセント)ですがJISキーボード(日本語)は`⌘ + F1`です。
JISキーボードは[Keyboard Remap](http://qiita.com/ogomr/items/c724d2ec88552104f453#2-5)を参考に変更をオススメします。

## Copy and Paste

選択した項目(テキスト)をコピーして、ペーストする。

| Keys | 内容 |
|:-----|:-----|
| ⌘ + a | すべての項目を選択 |
| ⌘ + c | 選択した項目をクリップボードにコピー |
| ⌘ + v | クリップボードを出力(ペースト) |

# Tips

`⌥ + ⇧ + k`はテキストエディタで``が出力されます。
iOSでTestFlightアプリを再インストールする方法


**この内容はAppleに買収されiTunes Connectに統合される前のTestFlightについての情報です、testflightapp.comは2015/2/26に終了です**

iOSのホーム画面に設置したTestFlight (Mobile)アプリを起動しても404ページが表示されるようになった。

基本的にTestFlight (Mobile)アプリはTestFlightサイトを表示するだけのWebアプリだと予想しているのだが、TestFlight MobileのダッシュボードページのURLが変わったせいで昔インストールしたTestFlightアプリのURLが開けない。

サポートに聞いたら再インストール方法を教えてもらった。

> I suggest following this guide (http://help.testflightapp.com/customer/portal/articles/867631) on re-initializing TestFlight on the device. You should also double check in Settings > Safari that "Accept Cookies" is set to either "From Visited" or "Always", JavaScript is enabled, and Private Browsing set to off.

1. ホーム画面から ``TestFlight`` アプリを削除する
1. ``設定`` > ``一般`` > ``プロファイル`` > ``TestFlight WebClip`` を選択し、``削除`` ボタンで一旦このプロファイルを削除する
1. ``設定`` > ``Safari`` から ``履歴を消去`` と ``Cookieとデータを消去`` を選択
1. iOSを再起動
1. Safariを起動して https://testflightapp.com/m/login からログイン
1. ``Connect Device`` を押して ``プロファイル`` をインストール

面倒にくさがった僕は 3-5 の手順を無視し、プロファイルを削除したあとSafariでTestFlightのページに言って メニューの Settings > Devices から ``Reconnect Current Device`` を実行したけどうまくホーム画面にTestFlightアプリがインストールされた。
C++11/C++14 リンク集

#C++全般
* [Welcome to Bjarne Stroustrup's homepage!](http://www.stroustrup.com/index.html)
 *  C++ を開発したビャーネ・ストロヴストルップのweb

#C++11
* [C++11 FAQ](http://www32.ocn.ne.jp/~ons/text/CPP0xFAQ.html.ja#when-standard)
* [ゲーム開発者のための C++11/C++14](http://www.slideshare.net/Reputeless/c11c14)
* [Visual C++で使えるC++11](http://www.slideshare.net/nekko1119/c11-in-visual-c)
* [C++11 の機能 (Modern C++)](http://msdn.microsoft.com/ja-jp/library/vstudio/hh567368.aspx)
* [C++11参考書の公開：C++11の文法と機能](http://cpplover.blogspot.jp/2013/10/c11c11.html)
* [More C++11](http://www.slideshare.net/KMC_JP/more-c11)
github+xcode連携めも

xcodeのプロジェクトをgithubのremoteにコミットする方法忘れてたのでメモ
xcode関係なく、何かしらのプロジェクトをコミットしたいときにも使えるよ

まずはローカルにコミット
cd プロジェクトのあるフォルダ
git init
git add .
git commit -m "コミットメッセージ"

こっからリモートにコミット
git remote add origin https://github.com/shiratsu/moneyplan.git
git push -u origin master

エラー
error: failed to push some refs to 'https://github.com/shiratsu/moneyplan.git'

ググって以下を見つけた
http://www.softel.co.jp/blogs/tech/archives/3569

git fetch
git merge origin/master
git push -u origin master

成功って感じ

gitにリモートブランチ作成

以下を見て行う
http://ameblo.jp/g-pinchan-new/entry-11352681517.html