OmniAICreator/Qiita-1.07M huggingface dataset:
Macでchef-soloとBerkshelfの環境構築手順

Berkshelfでcookbookをインストールして、knife solo cook ${node}でリモートで
chef-soloを実行するための環境をMac上で構築する手順です。

## 前提

### rbenvを使う場合

Homebrewのrbenvでruby 2.0.0-p0をインストール済みという前提です。1.9.xでも大丈夫です。

### Omnibus Chefインストーラでrubyとchefを一括インストールする場合

rubyがインストールされていない場合は以下のコマンドでrubyとchefをインストールするという手もあります。

```
curl -L http://www.opscode.com/chef/install.sh | sudo bash
```

上記のコマンドで/opt/chef/embedded以下にruby 1.9.3-p286がインストールされます。
以下の作業でgemコマンドなどを使うためにPATHを設定しておきます。

```
export PATH=/opt/chef/embedded/bin:$PATH
```

## chefレポジトリのディレクトリを作成

```
sudo mkdir /etc/chef
sudo chown `whoami` /etc/chef
cd /etc/chef
```

rbenvを使っている場合は/etc/chef以下で使うバージョンを指定しておきます。

```
rbenv local 2.0.0-p0
```

## bundlerでgemをインストール

bundlerをインストールしていない場合はインストールします。

```
gem install bundler
```

Gemfileを作ってbundlerでgemをインストールします。

```
cat <<'EOF' > Gemfile
source 'https://rubygems.org'
gem 'chef'
gem 'knife-solo', :github => 'matschaffer/knife-solo'
gem 'berkshelf'
EOF
```

```
bundle --path vendor/bundle
```

[» めんどくさい bundle exec を省略する方法 TECHSCORE BLOG](http://www.techscore.com/blog/2012/10/22/%E3%82%81%E3%82%93%E3%81%A9%E3%81%8F%E3%81%95%E3%81%84-bundle-exec-%E3%82%92%E7%9C%81%E7%95%A5%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)を参考にして、以下のコマンドを実行します。

```
bundle install --binstubs
```

PATHに./binを追加するのは気が引けたので、/etc/chefにて./bin/knifeのように実行することにしました。

## knifeの設定

```
./bin/knife configure
```

最後の```Please enter the path to a chef repository (or leave blank):```のみ ```/etc/chef```と入力して他はデフォルト値のままにします。

knife solo cook ${node}での転送先はknife-soloのgit (0.3.x)だとsolo_pathの設定値になりますが、0.2だとfile_cache_pathの設定値になります。

~/.chef/knife.rbにsolo_pathの設定を追加します。

```
cat <<'EOF' >> ~/.chef/knife.rb
knife[:solo_path] = '/etc/chef'
EOF
```


## chefレポジトリを初期化

一旦/etc/chef/repo/に作って/etc/chef/に移動します。

```
./bin/knife solo init /etc/chef/repo
mv /etc/chef/repo/* .
rmdir repo

cat <<'EOF' > /etc/chef/solo.rb
file_cache_path           "/var/chef"
data_bag_path             "/etc/chef/data_bags"
encrypted_data_bag_secret "/etc/chef/data_bag_key"
cookbook_path             [ "/etc/chef/site-cookbooks",
                            "/etc/chef/vendor/cookbooks" ]
role_path                 "/etc/chef/roles"
EOF
```

## gitレポジトリを作成して初回コミット

```
cat <<'EOF' > .gitignore
/bin
/.bundle
/.ruby-version
/vendor
EOF

git init
git add .
git commit -m 'first commit'
```

以降、適宜区切りの良い所でgitにファイルをaddしてcommitしてください。


## Berkshelfでcookbookをインストール

```
cat <<'EOF' > Berksfile
site :opscode

cookbook 'yum'
cookbook 'nginx'
EOF

bundle exec berks install --path vendor/cookbooks
```

## リモートサーバにchef-soloをセットアップ

BerkshelfのVagrant連携は使わないようにしています。VagrantのVMとリモートサーバで
同じ手順でchef-soloを実行したいからです。

以下のコマンドでリモートサーバにchef-solo環境をセットアップします。${node}の部分はリモートサーバのホスト名を指定します。予め~/.ssh/configでホスト名に対応する設定を追加してrootユーザでログインできるようにしておきます。

```
./bin/knife solo prepare ${node}
```

## リモートサーバでchef-soloを実行

以下のコマンドでchefレポジトリをリモートサーバに同期し、chef-soloを実行します。

```
./bin/knife solo cook ${node}
```
commit.cleanupの設定でgit commit時のコメント行が無視されなくなる

コミットメッセージ中の行頭や行末の空白を git commit の際に削除してくれるオプションである

```
$ git config --global commit.cleanup whitespace
```

を設定するとコミット時の#から始まる行が無視されなくなります。


おそらくこの機能に対応していないバージョンであろう1.7.11.3だと下記のように表示されます

```

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#>......modified:   Readme.md
#
```

1.8.2だと下記のように表示されます。

```

# Please enter the commit message for your changes. Lines starting
# with '#' will be kept; you may remove them yourself if you want to.
# An empty message aborts the commit.
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#>......modified:   Readme.md
#
```

この挙動が気に入らない場合は設定を削除するか、```commit.cleanup = strip```とする必要があります。
Windowsにnode.jsを導入する方法

windowsにnode.jsを導入する方法を簡単にまとめました。  
windows8で試しました。

# nvmwの導入

nvmw(Node Version Manager for Windows)はwindowsでnode.jsをバージョンごとに管理するためのツール。複数のバージョンのインストールや切り替えが楽にできる。詳細は[hakobera / nvmw](https://github.com/hakobera/nvmw)を参照。  
　以下、導入手順

* Gitとpythonが必要なのでなければインストール
* ホームディレクトリにnvmwをクローン

```
git clone git://github.com/hakobera/nvmw.git "C:\Users\ユーザ名\.nvmw"
```

* システムのプロパティの環境変数の設定で.nvmwへのパスを通す 
* コマンドプロンプトを起動し、nvmwを実行

```

D:\>nvmw

Node Version Manager for Windows

Usage:
  nvmw help                    Show this message
  nvmw install [version]       Download and install a [version]
  nvmw uninstall [version]     Uninstall a [version]
  nvmw use [version]           Modify PATH to use [version]
  nvmw ls                      List installed versions

Example:
  nvmw install v0.6.0          Install a specific version number
  nvmw use v0.6.0              Use the specific version
```

と表示されればnvmwの導入はOK。

# node.jsのインストール

導入したnvmwを使ってnode.jsをインストールする。バージョン0.10.1をインストールしてみる。

```
nvmw install v0.10.1
```

これでインストール完了。  
バージョンの切り替えはnvmw useで簡単にできる

```
D:\>nvmw use v0.9.8
Now using Node v0.9.8

D:\>node -v
v0.9.8
```
【WP-Champloo】指定したページに所属するのかを調べる関数

現在の投稿（ページ）が指定したページに所属するのかを調べる関数です。
複数の場合は配列形式で指定します。

## ソースコード

```php5:functions.php
<?php
/**
* @function in_parent_page
* @param pages_id(array)
* @return bool
*/
if(!function_exists('in_parent_page')){
	function in_parent_page($pages_id = null){
		if(is_page()){
			global $post;

			$parent_pages = get_post_ancestors($post->ID);

			foreach((array)$pages_id as $page_id){
				if($parent_pages && in_array(intval($page_id), $parent_pages)){
					return true;
				}
			}
		}

		return false;
	}
}
?>
```


## パラメータ

**page_id（ページID）**


## 使用例

```php5:ソース
<?php if(in_parent_page(10)): ?>
<p>親ページ「10」に所属しています。</p>
<?php endif; ?>
```

**複数ある場合**

```php5:ソース
<?php if(in_parent_page(array(10,20))): ?>
<p>親ページ「10」または「20」に所属しています。</p>
<?php endif; ?>
```
Googleリーダー購読フィードの出力

Googleリーダーの購読フィードの出力
設定からインポート/エクスポートで、情報をエクスポートで取り出せる。
だけど、欲しいお目当てのもの以外までご丁寧に付けてくれて、zip圧縮してくれたりするので、ちょっと鬱陶しい。

欲しいのは、購読フィードのOPMLデータのみなので、下記のURLで直接取得できます。
http://www.google.com/reader/subscriptions/export
MySQLで「おととい」「昨日」「明日」「あさって」

# 概要

MySQLにて、SQLで期間データを取得する際によく利用するSQLを記載しています。

# SQL

```sql
SELECT DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH), '%Y-%m-01');  -- 前月の月初
SELECT LAST_DAY(DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH)); -- 前月の月末

SELECT DATE_FORMAT(CURRENT_DATE, '%Y-%m-01'); -- 当月の月初

SELECT DATE_SUB(CURRENT_DATE, INTERVAL 2 DAY); -- おととい
SELECT DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY); -- 昨日

SELECT CURRENT_DATE; -- 現在

SELECT DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY); -- 明日
SELECT DATE_ADD(CURRENT_DATE, INTERVAL 2 DAY); -- あさって

SELECT LAST_DAY(CURRENT_DATE); -- 当月の月末

SELECT DATE_FORMAT(DATE_ADD(CURRENT_DATE, INTERVAL 1 MONTH), '%Y-%m-01');  -- 次月の月初
SELECT LAST_DAY(DATE_ADD(CURRENT_DATE, INTERVAL 1 MONTH)); -- 次月の月末
```

# 補足

## 現在の日付について

CURRENT_DATE() および CURRENT_DATEは、CURDATE()のエイリアス。

## 日付の演算について

下記はどちらも結果が同じ。

```sql
DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY)
DATE_ADD(CURRENT_DATE, INTERVAL - 1 DAY)
```


# 留意点
DATETIME型項目を条件に当月データを修正したりする場合は、下記に注意。

**よくある誤り**

```sql
SELECT
  *
FROM
  some_of_table
WHERE
  -- 月末の値が正しく取れない
  created_at BETWEEN DATE_FORMAT(CURRENT_DATE, '%Y-%m-01') AND LAST_DAY(CURRENT_DATE)
;
```

**正しい**

```sql
SELECT
  *
FROM
  some_of_table
WHERE
  created_at >= DATE_FORMAT(CURRENT_DATE, '%Y-%m-01')
AND
  created_at < DATE_ADD(LAST_DAY(CURRENT_DATE), INTERVAL 1 DAY)
;
```
もしくは

```sql
SELECT
  *
FROM
  some_of_table
WHERE
  created_at BETWEEN DATE_FORMAT(CURRENT_DATE, '%Y-%m-01') AND DATE_FORMAT(LAST_DAY(CURRENT_DATE), '%Y-%m-%d 23:59:59')
;
```

# 参考

[MySQL :: MySQL 5\.7 Reference Manual :: 12\.6 Date and Time Functions](https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html)
[MySQL :: MySQL 8\.0 Reference Manual :: 12\.6 Date and Time Functions](https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html)
FuelPHP 1.5 で oil generate admin... すると無限ループになるかもに暫定対処する

##FuelPHP 1.5 で oil generate admin... すると無限ループになるかもに暫定対処する

FuelPHP 1.5 で 

> $ oil generate admin...

を実行すると、認証部分で無限ループになるかも。

そんな時は以下を参考に対処すると良いかも知れん。

http://fuelphp.com/forums/discussion/11811/using-oil-to-generate-admin-panel-problem/p1

https://github.com/fuel/oil/commit/1b334d1160736846fe7a3bdc4e3ca5e9fb1abb16

###oil 側を修正することで oil g admin しても大丈夫になるようにする。

以下の2ファイルを各々、以下の内容に修正する事で、oil g admin した時に生成されるファイルにおいて、無限ループに陥らないようになる。

```./fuel/packages/oil/views/admin/crud/controllers/admin.php
    public function before()
    {
        parent::before();

        if (Request::active()->controller !== 'Controller_Admin' or ! in_array(Request::active()->action, array('login', 'logout')))
        {
            if (Auth::check())
            {
                if ( ! Auth::member(100))
                {
                    Session::set_flash('error', e('You don\'t have access to the admin panel'));
                    Response::redirect('/');
                }
            }
            else
            {
                Response::redirect('admin/login');
            }
        }
    }
```

```./fuel/packages/oil/views/admin/orm/controllers/admin.php
    public function before()
    {
        parent::before();

        if (Request::active()->controller !== 'Controller_Admin' or ! in_array(Request::active()->action, array('login', 'logout')))
        {
            if (Auth::check())
            {
                if ( ! Auth::member(100))
                {
                    Session::set_flash('error', e('You don\'t have access to the admin panel'));
                    Response::redirect('/');
                }
            }
            else
            {
                Response::redirect('admin/login');
            }
        }
    }
```




###もう既に oil g admin してしまっていて、とりあえずApp側だけ修正する場合

もう既に oil g admin してしまっていて、とりあえずApp側だけ修正したいんだけど…
という場合は以下の内容に書き換えればOKなはず。

```./fuel/app/classes/controller/admin.php
    public function before()
    {
        parent::before();

        if (Request::active()->controller !== 'Controller_Admin' or ! in_array(Request::active()->action, array('login', 'logout')))
        {
            if (Auth::check())
            {
                if ( ! Auth::member(100))
                {
                    Session::set_flash('error', e('You don\'t have access to the admin panel'));
                    Response::redirect('/');
                }
            }
            else
            {
                Response::redirect('admin/login');
            }
        }
    }
```

上記にすることで、oil g admin で生成されたファイルの無限ループには暫定対応可能なはず。
Pythonで文字列からさくっと文字の出現頻度を数えるには？


```python
word = 'adsgsdfhsdgfhsdfggsfdgsdfgs'
```
とまあこんな感じの文字列があった場合、文字の出現頻度を数えたいけどややこしいことはしたくないなーと思ったので、どうやったらできるか考えてみた。


```python
# 文字列から文字の集合を作る
char_set = { x for x in word }

# 出現頻度を辞書で表す
char_freq = { x : word.count(x) for x in char_set }
```

---


もっと本格的に文字列の出現頻度の算出やらをやるには[nltk](http://nltk.org/)とかが必要かと思いますが、これでもするっと腑に落ちる感があったので良し。


----
###追記
Python2.7で追加されたCounterオブジェクトがそのものズバリな模様。yasuharu519さん情報ありがとうございます。

```python
from collections import Counter

c = Counter(word)
```

* [Counterオブジェクト](http://docs.python.jp/2/library/collections.html)
node.js での RPC ライブラリー pillion の紹介

- http://dailyjs.com/2013/04/01/streams-streams-streams/
 > DailyJS: Five Minute Guide to Streams2
の記事中で pillion という RPC ライブラリーが紹介されていました。

github の pikkion (https://github.com/deoxxa/pillion) の READJE.md にある javascript のサンプルコードを coffeescript で書きなおし、
さらにすこし変更してみました。

ソースコード：
- https://gist.github.com/katoy/5293424
>  Sample for pillion ( https://github.com/deoxxa/pillion )

変更点：
- クライアント側で最期に Server と接続切断するようにした。(元の javasrit コードは Ctrl-C で client を停止するようになっている) 
- 引数不足で RPC 呼び出しした場合を追加した。
- サーバー側に ログ出力を追加した。

node.js での RPC システムとしては dnode (https://github.com/joyent/node) というものがあります。
pillion のほうが、クライアント側の書き方が素直と感じました。
﻿
参考；
node.js での RCP ライブラリーの一覧: https://nodejsmodules.org/tags/rpc
gitlabをさわってみて気がついたところ一口メモ

#文字コードsjisのソースのmerge requestを送った場合に、ブラウザ上で文字化けしない

sjisのコードはまだまだたくさんあるのでこれはかなり助かった。
(githubでのpull requestだと文字化けした)
Ruby 2.0.0をrvmでインストールしようとして妙にはまった

たまに早く帰れるからって、色んなことやろうとするとこれだ。。。
というわけで後学の為にメモを残しておきます。ってか、残しておかないと絶対にまたはまる。

意気揚々と

http://qiita.com/items/4f4cb38a1fac31b37ff3

とか

https://coderwall.com/p/tptocq

とかを見ながら`rvm install 2.0.0`とかする訳ですが、こける。ググっても何をやってもこける。
ここは一つ深呼吸ですよ。冷静に吐かれたエラー見ると、

`rvm reinstall -force`

とか書いてあるから実行したらremoveだけ上手く行ってインストールでこける。

**え〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜**

いや、ちょっと待て、ほんとにちょっと待て。。。明らかに二次災害じゃないかこれ。
もう、完全に心が折れかかってる中、もう一度深呼吸してインストールコマンド叩いてエラーを確認しますよっと。

>Searching for binary rubies, this might take some time.
>No binary rubies available for: osx/10.7/x86_64/ruby-2.0.0-p0.
>Continuing with compilation. Please read 'rvm mount' to get more information on binary rubies.
>Installing requirements for osx, might require sudo password.
>Skipping `brew update` make sure your formulas are up to date.
>Cowardly refusing to continue, please read 'rvm autolibs'.

(reinstallしろと出たのがどのタイミングだったか記憶にない。。。)

>Cowardly refusing to continue, please read 'rvm autolibs'.

どうやらここが問題らしい。autolibsを読めと書いてある。
autolibsはどうやら依存関係のあるパッケージを自動的にインストールするためのRVMの機能っぽい。

`rvm autolibs`

でヘルプが確認できる。

>〜抜粋〜
> ##Modes
>
>* `0`, `disable`, `disabled` &nbsp;=>&nbsp; Disable autolibs.
>* `1`, `read`, `read-only` &nbsp;=>&nbsp; Do not fail if missing packages.
>* `2`, `fail`, `read-fail` &nbsp;=>&nbsp; Fail if missing packages.
>* `3`, `packages`, `install-packages` &nbsp;=>&nbsp; Install missing packages.
>* `4`, `enable`, `enabled` &nbsp;=>&nbsp; Install packages and homebrew if missing.

各モードの

* 0 => autolibsを解除
* 1 => 依存関係のあるパッケージが見つからなくてもインストールは止めない、警告のみ
* 2 => 依存関係のあるパッケージが見つからない場合はインストールを止める
* 3 => パッケージマネージャを使って見つからなかったパッケージをインストールする(linux or mac)
* 4 => homebrewを使って見つからなかったパッケージをインストールする(macのみ)

このモードが2になっているからこけていた、というのが今回の現象。
というか、いつからあるオプションなんだろう？2012年10月あたりにrvm使ってrubyをインストールしたときは少なくともオプションに気を使う必要がなかった。
他にもパッケージ管理ソフトを指定するオプションがあったり、状態を見るためのオプションがあるらしい。
  
という訳で気を取り直して`rvm install 2.0.0`を「ッターン」。

>〜略〜
>\Error running'env GEM_PATH=/Users/atom/.rvm/gems/ruby-2.0.0-p0:/Users/atom/.rvm/gems/ruby-2.0.0-p0@global:/Users/atom/.rvm/gems/ruby-2.0.0-p0:/Users/atom/.rvm/gems/ruby-2.0.0-p0@global GEM_HOME=/Users/atom/.rvm/gems/ruby-2.0.0-p0 /Users/atom/.rvm/rubies/ruby-2.0.0-p0/bin/ruby -d /Users/atom/.rvm/src/rubygems-2.0.3/setup.rb --verbose',
>please read /Users/atom/.rvm/log/ruby-2.0.0-p0/rubygems.install.log
>Installation of rubygems did not complete successfully.
>〜略〜

orz
ログ見れ、って書いてあるから見てみる。

>〜略〜
>ERROR:  While executing gem ... (NoMethodError)
>    undefined method `fu_stream_blksize' for #<Gem::Commands::SetupCommand:0x007fcc21988218>
>〜略〜

これは結局、カズさん(@kazuhisa1976)に助けてもらいました。
検証してもらった結果、

*エラーは出ているがgemは普通に使えるからOK
*このエラーもそのうち直るだろうから、rvmの更新はこまめにして様子見

ということに。

さてさて、環境吹っ飛んだりしてるので後始末ですよ。。。

```rvm install 1.9.3
rvm install 1.9.2
rvm use 1.9.3 --default
bundle install
gem install powder```

他にも、自力でpowの設定をして.rvmrcとか作ってたプロジェクトの参照がおかしくなってるから.rvmrcと.powrcを消したりした。
新しく作ってる方のアプリでspecは流せたかし、powの連携確認もできた。
node.jsでnpm installするモジュールのバージョンを固定する

#モジュールのバージョン固定は簡単だった
シェルとか手でモジュールをnpm install hogehogeしてるといつの間にバージョンが上がってたりして動かなくなってることがよくある。
特定のバージョンで動くことを保証したい場合はpackage.jsonを作って依存関係を記載することでnpm installコマンドだけでインストールできるようになる。

package.jsonはいろいろ設定する項目があってめんどくさいように見えるがモジュールの依存関係だけ書いても良い。（すくなくてもそれだけで動く）

作成中のプロジェクトで今動くモジュールのバージョンを固定してない場合は今すぐpackage.jsonを作ろう。
忘れた頃に動かなくなってるゾ

#モジュールのバージョン確認方法
mysqlモジュールを例にすると
node_modules/mysql/package.jsonを開く
そこに書かれているversionの値を指定する
```"version": "2.0.0-alpha7",```

#動くバージョンを固定しよう
以下のようにpackage.jsonを記載しよう

```javascript:package.json
{
  "dependencies": {
    "mysql": "2.0.0-alpha7",
    "redis": "0.8.2"
  }
}
```
#今まで
```
npm install mysql@2.0.0-alpha7
npm install redis@0.8.2
```
#これから
```
npm install
```
PegjsでAltjsを作る 第二回 構文ブロックの表現

第二階は構文ブロックを表現します。次のようなものを作ります。


## 入力

```
{
  { a }
  { b }
  { c }
}
{ d }
```

ブレースのブロックが二つあります。

## 出力
```
[ [ [ 'a' ], [ 'b' ], [ 'c' ] ], [ 'd' ] ] 
```

a,b,c のArrayのブロックと、dのブロックで分割されるようにします。


## 解説

まずこの構文木全体のpegjsファイルです。

```javascript:block.pegjs
start = Expr+
Expr = expr:(Block / Identifier) _ {return expr}
Block = "{" child:(_ expr:Expr _ {return expr})* "}" {return child;}

Identifier = $([a-z]+)

_ = (Whitespace / LineTerminator)*
  Whitespace = [\t\v\f \u00A0\uFEFF]
  LineTerminator = [\n\r\u2028\u2029]
```

Exprが行ごとの表現で、必ず { ではじまり } で終わります。Expr+ で複数行を受取り可能にします。
_ で空白を許し、その空白は0文字以上のWhitespace もしくは 改行コードで構成されます。(この改行コードはpegjs/examples/json.pegjsから借りてきました))

Blockは識別子identifierもしくはBlockを再帰で受け取ります。これでネストされたブロックの表現ができるわけです。


## 実際

と長々述べるのもいいんですが、実際には start = "{" identifier "}" と書き始めたし、普通はボトルネックに書き足していく感じになります。このぐらいなら問題ないですが、他人の作ったパーサを読むのは難しい…(CoffeeScriptReduxのパーサ読んでる)。
iTermで新しいタブを開いたときにディレクトリを継続させる


iTermで新しいタブを開いたときに開く前と同じディレクトリで開くには
`Preferences..` -> `Profiles` -> `General`を開き、
`Working Directory`で`Reuse previous session's directory`を選択する。
これでOK。

また、新しくウィンドウを開いた場合とタブを開いた場合のディレクトリを変更したかったら、`Advanced Configuration`の`Edit…`で変更すればOK。
[Windows][デザイン] 画像圧縮ツールは「PNGGauntlet」が便利

 
## [PNGGauntlet](http://pnggauntlet.com/)

 
## メリット
 - 対象ファイルを全選択できる！
    - 「Puny pngの無料版」だと一つずつ上げないといけない

 - windowsでも使える！
    - 「ImageAlpha」はMacでしか使えない。

 - ドラッグ&ドロップで楽に選択できる！
    - 「Puny pngの無料版」だと一つずつ対象を選択しないといけない。

 - 「Puny pngの無料版」で圧縮できない画像が圧縮できる！
    - 「Puny pngの無料版」ではかなりの頻度で「圧縮できない」画像がありました。

 - 劣化させずに画像圧縮が可能
    - 実際の画像をみて見ましたが、劣化による差異はほとんど見受けられませんでした。

## 圧縮した実行結果

![20121227011018.png](https://qiita-image-store.s3.amazonaws.com/0/15812/606143da-f6d8-1aff-76ad-84abedd00f4d.png)

 
## [PNGGauntlet](http://pnggauntlet.com/)


#その他の画像圧縮系オススメツール

## [Puny png](http://www.punypng.com/)


## [ImageAlpha](http://pngmini.com/)
Rubyで日本語のURI(URL)をパーズするなら Addressable::URI を使おう

Rubyの標準URIクラスでは日本語を含むURIをparseすることはできません(どのRFCを対応しているかの関係らしいです)。
なので解決方法としては Addressable::URI というgemがあるのでそれを使用することで日本語URIに対応することができます。

ライブラリURL
https://github.com/sporkmonger/addressable


```ruby
# Gemfile
gem 'addressable', require: 'addressable/uri'
```

 # bundle 実行...

 # rails console にて確認

```ruby
URI.parse('http://ja.wikipedia.org/wiki/日本語')
#=> URI::InvalidURIError: bad URI(is not URI?): http://ja.wikipedia.org/wiki/日本語

Addressable::URI.parse('http://ja.wikipedia.org/wiki/日本語')
#=> #<Addressable::URI:0x3fc05653a740 URI:http://ja.wikipedia.org/wiki/日本語>
```

■ 参考
本家
https://github.com/sporkmonger/addressable
情報
http://d.hatena.ne.jp/kitamomonga/20100316/ruby_gem_addressable_howto
http://memo.yomukaku.net/entries/220
Testemでサクサク駆動開発


駆動開発にて一行書き換えた度にブラウザをリロードする人いらっしゃいませんか？

複数のブラウザやモバイルなどもまとめてCIしたい方は？

今回はCLIでブラウザテストをするためのテストランナー[testem](https://github.com/airportyh/testem)を紹介します。

## testemのお勧めポイント

* 複数のブラウザ、phantomjsでテスト可能
* CIモードではブラウザの起動まで全自動化
* mochaやjasmineなど人気があるフレームワークに対応済み
* coffee-script、LESS、Browserifyなどの前処理も自動にやってくれます
* `testem ci`コマンドでブラウザまで起動してくれます

## インストール

```
npm install testem -g
```

## 使い方

testem.jsonに記述するだけで簡単に実行してくれます。

```json:testem.json
{
  "framework": "jasmine",
  "src_files": [
    "hello.js",
    "*spec.js"
  ]
}
```

対応出来るフレームワークは以下の通り。

* Jasmine
* QUnit
* Mocha
* Buster.js
* アダプターさえ書けば何でも有り

`testem`コマンドを実行すると`http://localhost:7357`にサーバが立ち上がり、テスト開始。

![Testem](https://raw.github.com/airportyh/testem/master/images/green.png)

テスト中は上下キーでレポートをスクロールします、又左右キーでブラウザを切り替えます。リターンで強制リロード。

socket.ioでブラウザと通信しますので、コマンドはブラウザに即反映されますし、エラーするとCLIにもほぼリアルタイムで反映されます。

![エラー](https://github.com/airportyh/testem/raw/master/images/red.png)


## 自分でテストページを書きたい方は

```testem.json
{
  "test_page": "tests.html"
}
```

```tests.html
<script src="/testem.js"></script>
```

と記述すればおk

## 前処理

coffee-scriptなど前処理が必要な場合は

```testem.json
{
  "before_tests": "coffee -c *.coffee",
  "src_files": [
    "*.coffee"
  ],
  "serve_files": [
    "*.js"
  ]
}

```

## 困った時のtips

色んなフレームワークと組み合わせるとき参考になるサンプル。
https://github.com/airportyh/testem/tree/master/examples

`testem launchers`コマンドでCIモードに対応するブラウザ一覧
Amazon SNS から au iPhone へメールを送信する場合の設定

メモMemo。

Amazon SNSの通知メールをau iPhoneへ送信しようとしても、迷惑メールと判定されるようでメールアドレスの確認メールが届かない。（環境や設定によって違うと思うが、自分はauがオススメする設定で届かなかった）

そこでauのメールフィルタ関連の設定から、「個別受信指定」にドメイン名「sns.amazonaws.com」を指定しがた、これでは受信できなかった。

**「なりすまし・転送 個別受信指定」**に指定することで、受信できるようになった。
homebrewで入れたredisが止まってくれないとき

コンソールからshutdownしても駄目だし、プロセスをkillしてもダメだった。
インストールしたときの記憶が無いのだが、どうやらlaunchctlがいけなかったらしい。

launchctlが悪さしていることは`ps -ef`で親プロセスを確認して突き止めた。
以下のコマンドによりlaunchctlを鎮めることで無事redisは止まった。

```
$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
```

今までは自動で立ち上がっていたものが、次回は止まってるかも。
その時はたぶん、loadすればいいのかもしれない。
スゲい簡単なPerl入門 -5thDay @_ $_


````findName.pl
#!/usr/bin/perl -w

use File::Find;

find(\&fileProc,'.');

sub fileProc{
        #もしいま注目しているファイルやディレクトリがファイルとして存在したら、
        #$File::Find::nameします
        print "$File::Find::name\n" if -f $_;
}
````

##$_　とは
Perl独特の特殊変数$_とか@_とか。
コレ単体ではなかなか覚えられないから、上の使い方を見るといいかもしれないと思った。

````
sub fileProc{
        #もしいま注目しているファイルやディレクトリがファイルとして存在したら、
        #$File::Finde::nameします
        print "$File::Find::name\n" if -f $_;
}

````

もし**いま注目しているファイルやディレクトリ**がファイルとして存在したら、
File::Finde::nameします。


**いま注目しているファイルやディレクトリ**

使い方で覚えると、なんか使い勝手が良さそうでいいですなε-(/･ω･)/ ﾄｫｰｯ!!


ちなみに上のプログラムは書き換えるとこんな感じになります。

````findName.pl
#!/usr/bin/perl -w

use File::Find;

find(\&fileProc,'.');

sub fileProc{
        # もし$_というファイルが存在しなければメソッドを脱出
        return unless -f $_;
        print "$File::Find::name\n"
}

````
同じブロックで別テンプレートファイルを使えるようにする


一部のモジュールはブロック編集画面でどのテンプレートファイルを使って表示するかを変更できるようになっています。

でも多数のモジュールではブロックのテンプレートファイルを変更することができません。

今回Bulletinの新着ニュースブロックを2箇所で使い、それぞれデザインを変えたかった（テンプレートを別にしたかった）ので、ブロック管理画面を改造しちゃいました。

![スクリーンショット](http://f.cl.ly/items/0i2y3t0H0c223g2t370Y/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2013_04_02_11_32-2.png)


改造したのはXOOPS Cube Legacy2.1系です。（ブロック周りに変更少なければXCL2.2、momoxoでも組み込めるとおもいます）


html/modules/legacy/admin/templates/block_edit.html フォーム内に下記追加

```smarty
      <tr>
          <td class="head"><{$smarty.const._AD_LEGACY_LANG_TEMPLATE}></td>
          <td class="<{cycle values="odd,even"}>">
              <{xoops_input type=text name=template value=$actionForm->get('template') size=20 class=legacy_list_number}>
          </td>
      </tr>
```


html/modules/legacy/admin/forms/BlockEditForm.class.php

prepareメソッド内で下記追加

```php
        $this->mFormProperties['template'] =& new XCube_StringProperty('template');

        $this->mFieldProperties['template'] =& new XCube_FieldProperty($this);
        $this->mFieldProperties['template']->setDependsByArray(array('maxlength'));
        $this->mFieldProperties['template']->addMessage('maxlength', _MD_LEGACY_ERROR_MAXLENGTH, _AD_LEGACY_LANG_TEMPLATE, '255');
        $this->mFieldProperties['template']->addVar('maxlength', '255');


```


loadメソッドに下記追加

```php
		$this->set('template', $obj->get('template'));
```

updateメソッドに下記追加

```php
        $obj->set('template', $this->get('template'));

```


これでブロック編集画面でテンプレートファイル名が指定できるようになってます。


あとはテーマ下テンプレート機能使ってテーマ下に配置したり、AltSysでカスタムテンプレート作製したりですかね。

#2013/05/06追記
この方法だとブロックの新規インストールで問題が発生。要修正

#2013/06/04追記
ブロックの新規インストールに対応するためには html/modules/legacy/admin/templates/blockinstall_edit.htmlも修正する

82行目あたり

```smarty
      <td colspan="2" class="foot">
        <input class="formButton" type="submit" value="<{$smarty.const._INSTALL}>" />
        <input class="formButton" type="submit" value="<{$smarty.const._BACK}>" name="_form_control_cancel" />
      </td>
```
上記にtemplateについての記述を追加して下記の様にする

```smarty
      <td colspan="2" class="foot">
          <{xoops_input type=hidden name=template value=$actionForm->get('template') }>
        <input class="formButton" type="submit" value="<{$smarty.const._INSTALL}>" />
        <input class="formButton" type="submit" value="<{$smarty.const._BACK}>" name="_form_control_cancel" />
      </td>
```

これでブロック新規インストールでも大丈夫です。
ファイルの中身を簡単な暗号化（Python）

text.txtをtext.encode.txtに出力する。

Pythonだと

```python:encode.py

# coding:UTF-8

# ストリームを読み取る
with open("text.txt","r") as origin_file:
  stream_raw = origin_file.read()
  # ord()でコード値取得
  str_code_num = (ord(str) for str in stream_raw)
  # 0から255のコード値
  seed = 255
  # xorしながら連結しちゃう
  enc_result = "".join(map(lambda str: chr(str^seed), str_code_num))
  
# ファイルに書き出し
with open('text.encode.txt', 'w') as new_file:
  new_file.write(enc_result)
  
```
ファイルの中身を簡単な暗号化（Ruby）

text.txtをtext.encode.txtに出力する。
Rubyで書くと

```ruby:encode.rb
# ストリームを読み取る
src_stream = File.open("text.txt", "r"){ |f| f.read }

tmp = []

# 0から255のコード値でxorする
src_stream.each_codepoint do |cp| 
  tmp << (cp ^ 255) 
end

# 連結する
enc_result = tmp.map{|i| i.chr}.join("")

# ファイルに書き出し
File.open("text.encode.txt","w") do |f|
  f.write(enc_result)
end

```

[元ネタ](http://itpro.nikkeibp.co.jp/article/COLUMN/20060131/228211/)
ハードリンクの一覧を出力する

ハードリンクされているファイルをコンソールに出力します。

fsutil hardlink list コマンドを実行して、結果が複数行返ってくればハードリンクされてるという判断です。
かなりの力技ですがｗ


```powershell
Get-ChildItem C:\ -Recurse | ?{ !$_.PSIsContainer } | 
%{
    $res=fsutil hardlink list $_.FullName;
    if (($LASTEXITCODE -eq 0 ) -and ($res -is [System.Object[]])) {
	Write-Host $_.FullName;
    } 
}
```
gitlab 5.0をvmware上のubuntu 12.04にいれたときのメモ

公式のインストールガイド
https://github.com/gitlabhq/gitlabhq/blob/5-0-stable/doc/install/installation.md
を参考にいれてみました。

ubuntuとか初めて触ったので、もう一度入れようと思った時に自分が躓かないようにととったメモがこちらになります。

[作業メモ](https://github.com/kyanro/gitlabknowledge/blob/5.x/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%A1%E3%83%A2.md)

設定ファイルのどこを書き換えたか等もメモしたので、多分このメモをみれば次にインストールするときはさくさくインストールできる・・・はず。

あくまで自分なりのメモのため、間違ってる箇所もあるかとおもいます。
もし見つけたらぜひ教えて下さい
(´・ω・｀)


####ユーザが自分でSignUpできるようにするオプション

設定ファイルを開く
`sudo -u git -H vim /home/git/gitlab/config/gitlab.yml`

下記の部分のコメントを外す
`signup_enabled: true`

gitlabサービスをリスタート
`sudo /etc/init.d/gitlab restart`

キャッシュの問題のためか、反映されるのに１～２分ほどかかる模様。
app/assetsフォルダ内で使えない名前

## app/assetsフォルダ内で使えない名前がある？

Alloyの話題。

自家製ライブラリなどを使う場合、app/assetsフォルダ内に配置すると思うけど、何度か**フォルダ名**でハマったので備忘録。

+ プロジェクト名と同じ名前のフォルダはNG
    iOSで確認。シミュレータも起動しなくなる。また大文字小文字は区別されない模様。

+ フォルダ名の先頭にアンダースコアNG
    Androidで確認。アンダースコアで始まるフォルダ名はビルドの対象外となるらしい。
【heroku】php、html5でもデプロイ出来ます。

タイトルで完結しているのですが、herokuはRails以外にもhtml5、phpのソースもデプロイ可能です。
ネタとしてブログに書きましたので、ぜひ読んで頂けると幸いです。
(詳細は不明ですがなぜか、htmlファイルだけの場合は別途、簡易（php.infoレベル）のphpファイルが必要となります。)

http://g08m11.hateblo.jp/entry/2013/01/24/012808
http://g08m11.hateblo.jp/entry/2013/03/16/225307
http://g08m11.hateblo.jp/entry/2013/03/16/230628
【Rails】Ruby on Rails初心者は読んだ方が良い本。

最近、読んだ中でCGIやAPI関連で詰まったところに関してほぼ書かれた本があったので、
投稿します。

詳細はブログに書いてあります。
http://g08m11.hateblo.jp/entry/2013/03/27/201115
View-based table view の delegate の awakeFromNib が複数回呼ばれる問題

View-based なテーブルビューを扱う場合、テーブルビューの delegate の `awakeFromNib` が複数回呼ばれるかもしれないことに注意。

典型的な状況は次のとおり。ある NIB が、 view-based なテーブルビューと、そのセルとなるビューを含んでいる。 `NSTableView` の `delegate` アウトレットに xib 内のあるオブジェクトが接続されている。さらに、セルビューをインスタンス化するとき、 owner に同じオブジェクトを指定している：

```
MyWindow.xib
  |
  |`-- NSTableView
  |     |    `-- MyTableCellView
  |     |              |
  |     | [delegate]   | [owner]
  |     |              |
  |     v              v
   `-- MyTableViewDelegate (may be File's Owner)

```

```objc
@implementation MyTableViewDelegate

- (NSView *)tableView:(NSTableView *)tableView
   viewForTableColumn:(NSTableColumn *)tableColumn
                  row:(NSInteger)row {
    // owner に self を指定して MyTableCellView を作成している
    MyTableCellView *view = [tableView makeViewWithIdentifier:@"..."
                                                        owner:self];
    ...
}
```

以上の状況では、 NIB がロードされたときに加えて、 `MyTableCellView` **が NIB からインスタンス化されたときにも**  `MyTableViewDelegate` の `awakeFromNib` が呼ばれる。

これは、標準のビューをセルビューにしたい場合（つまり、標準のビューのサブクラスを作って `awakeFromNib` を実装する手間をかけたくない場合）に、 owner がセルビューを初期化してやるための機構である。

よって、 owner の `awakeFromNib` は複数回呼ばれても構わないようにする必要がある。この機構が不要なら、セルビューを作るとき `makeViewWithIdentifer:owner:` の owner に `nil` を渡せばよい。
SlidingMenuのSimple Example補足

facebookでおなじみのスライドメニュー（ただし現在facebookはスライドメニューを廃止するかどうかのA/Bテスト中）をandroidで簡単に実装するためのライブラリー「SlidingMenu」があるのですが、これを導入してSimpleExampleを試す際の覚書。

SlidingMenu - GitHub
https://github.com/jfeinstein10/SlidingMenu

##ライブラリの導入方法
下記の2つを参考に。下記2つはActionBarSerlockを例にしていますが、やり方は同じなので問題ありません。
むしろSlidingMenuはActionBarSherlockとも連携をとれる作りになっているので、合わせて導入するのもいいでしょう。

Android 2.xでAction Barが使えるActionBarSherlockの使い方
http://d.hatena.ne.jp/gabuchan/20120227/1330302592

Jarじゃないソースしか無い、Androidのライブラリーをプロジェクト内に組み込む
http://blog.excite.co.jp/spdev/18968801/

（覚書）ライブラリのフォルダ名を「（親のプロジェクト名）_（ライブラリ名）」にしておくと、プロジェクトエクスプローラで親とライブラリのプロジェクトが隣同士に並ぶので管理しやすい。

##Simple Exampleの補足

```java:SlidingExample.class
public class SlidingExample extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTitle(R.string.attach);
        // set the content view
        setContentView(R.layout.content);
        // configure the SlidingMenu
        SlidingMenu menu = new SlidingMenu(this);
        menu.setMode(SlidingMenu.LEFT);
        menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
        menu.setShadowWidthRes(R.dimen.shadow_width);
        menu.setShadowDrawable(R.drawable.shadow);
        menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
        menu.setFadeDegree(0.35f);
        menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
        menu.setMenu(R.layout.menu);
    }
}
```

当然、作成したActivityにonCreateの中身を入れるとエラーになる部分がいくつかあります。とりあえず動作だけ見たいのであれば、サンプルソースに入っている値をそのまま入れてしまいましょう。

*menu.setShadowWidthRes(R.dimen.shadow_width);*
スライドメニューと親のActivityの境目につける陰の幅。15dp。

*menu.setShadowDrawable(R.drawable.shadow);*
スライドメニューと親元のActivityの境目につける陰の画像。サンプルソースでは、xmlで作成しています。
https://github.com/jfeinstein10/SlidingMenu/blob/master/example/res/drawable/shadow.xml

*menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);*
スライドメニューを出した時に、親のActivityの端をどれだけ表示するか。60dp。

*menu.setMenu(R.layout.menu);*
スライドメニューのレイアウトファイル。お好きな様に。サンプルソースでは、fragmentにしているので、同様にfragmentで作成する場合は、親のActivityは当然FragmentActivityにする必要がある。

ちなみにFragment関連は全てsupport-v4にしても動作します。
その他のスライドメニューの使い方は、プロジェクト内のExampleコードを参考にしましょう。Playストアに上がっているデモアプリで動作の確認もできます。
https://play.google.com/store/apps/details?id=com.slidingmenu.example
Sublime Text 2でSphinX


思いの外に難産してしまったので備忘録。わかってしまえば「あー」で終わるんですけど、そこにたどり着くまでがイバラなんですよねぇ。

以下Macのみにつき失礼。あとST2でプロジェクト使ってることを前提としてます。

# SphinXプロジェクトをビルドする

* [Sublime text 2でSphinxを使う](http://progblogyamayama.blogspot.jp/2012/11/sublime-text-2sphinx.html)

こちらを参考に、

```json:SphinX.sublime-build
{
    "cmd": ["make", "html"],
    "working_dir": "${project_path:${folder}}",
    "windows":
    {
       "cmd": ["make.bat", "html"]
    }
}
```

とはやってみたものビルドしても・・・

```
sphinx-build -b html -d _build/doctrees   . _build/html
make: sphinx-build: No such file or directory
make: *** [html] Error 1
[Finished in 0.1s with exit code 2]
```

うーむ？でまぁあーだこーだと調べ回った（ぐぐりまくった）んですけど。結果としてMacの場合なら、

```json:SphinX.sublime-build
{
    "cmd": ["make", "html"],
    "working_dir": "$project_path"
}
```

これで充分なんですな。

んでもってこれだけではまだダメで。ここに気付くのに随分と時間を浪費してしまったのですが、結論としてST2にPATHを明示さてあげなければいけなかったと。

これひとつだけなら直接SphinX.sublime-buildに記述してあげてもいいんですけど。どうせ他のコマンドでも使うので、Preferences.sublime-settingsに、

```json:Preferences.sublime-settings
{
...
	"build_env":
		{
			"PATH": "/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin"
		},
...
}
```

このように自分のシェルで使ってるPATHを丸々コピー追記してあげます。


ここまでやってあげてようやく、[Tools]-[BuildSystem]から作成した[SphinX]を選択、cmd+Bで目出度くビルドできるようになりました。やれやれ。

# どうせならひと手間

こうなると欲が出てくるもので。確かにビルドはできるんですけど、いちいちBuildSystem選択しなきゃならんのがめんどくさい。せっかくAutomaticに判断してくれる機能があるんだからそれ使いたい。という訳で。

* [Sublime Text 2 で TypeScript をビルドする](http://y-anz-m.blogspot.jp/2012/11/sublime-text-2-typescript.html)、
* [Sublime Text 2でMarkdown](http://d.hatena.ne.jp/nacookan/20120907/1347002253)

あたりを参考に最終形。一行足しただけですけど。

```json:SphinX.sublime-build
{
    "cmd": ["make", "html"],
    "working_dir": "$project_path",
    "selector": "text.restructuredtext"
}
```
BuildがAutomaticにて実行される際、このselecorというのを参照するそうです。んでもってそのSphinXの対象となるrstファイルを示すのが"text.restructuredtext"<strike>ってわかんねぇよこれ</strike>。拡張子毎にどうゆう形式かを調べるにはcmd+option+P。

あとはついでに、buildしたHTMLの確認用にも、

```html:Chrome.sublime-build
{
    "cmd": ["open", "-a", "Google Chrome", "$file"],
    "selector": "text.html.basic"
}
```

というのを追加して。.rstファイル開いている時にcmd+Bならビルドを、ビルドされたHTMLファイルを直接確認する時にはcmd+BでChrome起動・・・という形式が、とりあえずは整いましたよと。あー長かった。
【覚書】Git で任意のツールを使ってdiffを取る方法

自分用の覚書として。
gitconfigで簡単に設定出来れば良いんだけど少し探してみてよく分からなかった。
その代わりに以下の方法で解決出来たので当面はこれを使っていくことにする。

例)diffツールとしてmeldを使用する場合

### ___$ meld <(git show HEAD~1:xxxx.cpp) xxxx.cpp___
とか
### ___$ meld <(git show HEAD~2:xxxx.cpp) <(git show HEAD~1:xxxx.cpp)___

といった具合。
出力のリダイレクトはよく使うことがあるけど、入力では殆ど使ったことがなかった。
()でコマンドの出力結果も使えるのな。
evernote-sdk-rubyを使ってEvernoteのノートを検索する


EvernoteのAPIはthriftなのでWebAPIとはところどころ使い勝手が違う。

基本はこちらの[サンプル](https://github.com/evernote/evernote-sdk-ruby/blob/master/sample/client/EDAMTest.rb)から。

authTokenは以下から取得
https://www.evernote.com/api/DeveloperToken.action

```ruby:evernote_search.rb
authToken = "THE TOKEN YOU'VE GOT"
evernoteHost = "sandbox.evernote.com"

# UserStoreサービスのクライアントを生成
userStoreUrl = "https://#{evernoteHost}/edam/user"
userStoreTransport = Thrift::HTTPClientTransport.new(userStoreUrl)
userStoreProtocol = Thrift::BinaryProtocol.new(userStoreTransport)
userStore = Evernote::EDAM::UserStore::UserStore::Client.new(userStoreProtocol)

# NoteStoreサービスのクライアントを生成
noteStoreUrl = userStore.getNoteStoreUrl(authToken)
noteStoreTransport = Thrift::HTTPClientTransport.new(noteStoreUrl)
noteStoreProtocol = Thrift::BinaryProtocol.new(noteStoreTransport)
noteStore = Evernote::EDAM::NoteStore::NoteStore::Client.new(noteStoreProtocol)

# 検索条件となるfilterを設定
# 'こんにちは'を含む更新された順
filter = Evernote::EDAM::NoteStore::NoteFilter.new
filter.word = 'こんにちは'
filter.order = Evernote::EDAM::Type::NoteSortOrder::UPDATED

# filterを使って検索実行
noteList = noteStore.findNotes(authToken, filter, 0, 10)
```
こうするとEvernote::EDAM::NoteStore::NoteListのオブジェクトが取得できて、noteList.notesの中に検索の結果が入ってくる。

[evernote-sdk-ruby](https://github.com/evernote/evernote-sdk-ruby)は[EvernoteAPI](http://dev.evernote.com/documentation/reference/)に合わせるためかキャメルケースになってるのがrubyとしては独特。
今回はこの書き方に則ってみた。

Evernoteの開発者向けドキュメントは[日本語版](http://dev.evernote.com/intl/jp/)と[英語版](http://dev.evernote.com/)で書かれている範囲が違ったりするので両方見ておくといいかも。
XCL2.2（XoopsX）のブロックコントローラのせいでデザイン崩れが出るので、jQueryを使って切り替えるようにしてみた。


XCL2.2（XoopsX）を使っていて、便利だなと思う反面、ちょっと邪魔だなぁ〜と思うのが、管理権限がある場合に表示されている「各ブロックの右端に表示されるブロックコントローラ」

これ、わざわざ管理画面に移動しなくても、これをクリックするだけで直接そのブロックの編集・削除画面などに飛ぶことができるので、管理者にはとっても便利な機能なんですけど・・・

管理者としてログインした状態でサイトを見ていると、これがあるためにデザイン崩れというか、ゲスト状態で見るのとちょっと違う感じに表示されるので、何とかしたいなぁ〜って思ってました。

で、とりあえず、テーマに次の記述を追加することで、なんとか切り替えができるようにしてみました。（もちろん、プリロードで作ってもいいのでしょうけど）

###次の記述をテーマのhead内の最後の方に追加

```
<head>
<{if $xoops_isadmin}>
<script>
  jQuery(document).ready(function(){
    jQuery("span.block_controller").css("display","none");
    jQuery("#b_con").click(function () {
      jQuery("span.block_controller").toggle();
    });
  });
</script>
<{/if}>
</head>
```

###次の記述をテーマの適宜の場所に追加


```
<{if $xoops_isadmin}>
<a href="#" id="b_con">block controller</a>
<{/if}>
```

とか書くとリンクをクリックするとブロックコントローラの表示切り替えができるし

```
<{if $xoops_isadmin}>
<button id="b_con">block controller</button>
<{/if}>
```

とすると、ボタンで切り替えができるようになる。

ちなみに、上記のjQueryのコードでは、他のJSとのバッティングを避けるために、グローバルとして利用される$をjQueryに置き換えているけど、実は、最初の部分だけを変えたらあとはそれで包まれるので、あとは$でも良いらしい・・・でも、面倒なんで全部jQueryに置き換えていたりします。はい。
Gitのオブジェクトについてのメモ


[Git天空闘技場](http://connpass.com/event/1958/)でGitのオブジェクトについて学びました。忘備録のためのメモ。

## Gitのオブジェクトとは？種類は？
Gitはプロジェクトの状態をオブジェクトと呼ばれる形で記録する。オブジェクトはblob、tree、commit、tagの4種類。それぞれzlibで圧縮されSHA-1でハッシュ値が生成される。

* blobはファイルに対応
* treeはディレクトリに対応
* commitは変更履歴に対応
* tagはタグに対応

## オブジェクトの確認方法は？
オブジェクトは次のコマンドで確認できる。

```
git cat-file -p object
```

-pオプションは「pretty-print object's content」。見やすく表示される。このコマンドはたくさん打つので、適宜`~/.gitconfig`にaliasを追加。

```~/.gitconfig
[alias]
        cf = cat-file -p
```

## オブジェクトの作られ方の確認
### その1 git initして.gitの中を確認

`git init`コマンドでカレントディレクトリ内に`.git`ディレクトリができるが、この時点ではオブジェクトが入る`.git/objects`や、ブランチが入る`.git/refs/heads`、タグが入る`.git/refs/tags`は空っぽ。

### その2 commitのハッシュ値からオブジェクトを辿る

下記手順でcommit => tree => blobの関係を把握。

1. 適当なファイルを作成しコミット。コミット時に表示されるハッシュ値を先ほどの`git cat-file -p`コマンドの引数として指定。するとtreeのハッシュ値が表示される。
2. 次に、treeのハッシュ値を引数に`git cat-file -p`コマンドで確認。blobのハッシュ値が表示される。
3. 最後に、blobのハッシュ値を引数として`git cat-file -p`コマンド。1でコミットしたファイルの中身が表示される。

### その3 .git/objectsディレクトリの変化

コミットをした時点で`.git/objects`ディレクトリの中身が変わる。オブジェクトのハッシュ値の最初の2桁のディレクトリが作成され、その中に上記で確認したcommit、tree、blobのハッシュ値があることが確認できる。

## parentとは？

上記のリポジトリから適当なブランチを切り、そのブランチに移動して、作成していたファイルの中身を変更しコミット。commitのハッシュ値を確認すると、parentという項目があり、そのハッシュ値を`git cat-file -p`コマンドで確認すると、直前のコミットであることがわかる。parentでコミットの繋がりが把握できる。

## Gitのオブジェクトの観点から、mergeとは？

元のブランチに戻り、先ほど適当に切ったブランチを`git merge --ff-no`でマージする。そして、マージしたcommitのハッシュ値を`git cat-file -p`で確認。parentが2つあることが確認できる。mergeとはcommitオブジェクトにparentを2つ持たせることであるとわかる。

## Gitのオブジェクトの観点から、rebaseとは？

Git天空闘技場ではrebaseの解説はなかったため、自分で確認。rebaseをしたコミットのハッシュ値を`git cat-file -p`で確認すると、parentは1つのみ。もちろん、`git log`でログを表示しても、まとめられたコミットは表示されない。しかし、`.git/objects`ディレクトリには、rebaseでまとめられてしまったオブジェクトのハッシュ値が残っている。そのため、`git reflog`コマンドでrebaseでまとめる前のコミットを確認できる。

## まとめ

Gitのオブジェクトが何たるかを踏まえた上でGitを見直すと、それぞれのコマンドが実際に何をしているか、内部の処理の詳細はわからないまでも、少なくとも想像はできるようになると思います。Gitのオブジェクトについて学習する場を設けてくださったGit天空闘技場の主催者3名に篤く御礼申し上げます。
PeclのWeakRef

###### unsetしても参照が残ってしまう
```php:Satou.php
class Satou {
    private $d;
    public function setD($d) {
        $this->d = $d;
    }
    public function __destruct() {
        echo "Destroy!\n";
    }
}
```

```php:RefTest1.php
class RefTest1 {
    private $satou;
    public function setSatou($satou) {
        $this->satou = $satou;
    }
    public function printSatou() {
        var_dump($this->satou);
    }
}

$satou = new Satou();
$satou->setD("bbbb");

$t = new RefTest1();
$t->setSatou($satou);
$t->printSatou();

unset($satou);

$t->printSatou();
```
```shell:結果
$ php RefTest1.php
object(Satou)#1 (1) {
  ["d":"Satou":private]=>
  string(4) "bbbb"
}
object(Satou)#1 (1) {
  ["d":"Satou":private]=>
  string(4) "bbbb"
}
```


当然ガベージコレクションの対象にはならない。
リークの危険性をはらむ。
そこで、Peclで提供されているWeakRefを使ってみる。

```php:RefTest2.php
class RefTest2 {
    private $obj;
    public function setWeakRefObj($obj) {
        $this->obj = $obj;
    }
    public function printWeakRefObj() {
        var_dump($this->obj->get());
    }
}
$satou = new Satou();
$satou->setD("aaaa");
$ref = new \WeakRef($satou);

$t = new RefTest2();
$t->setWeakRefObj($ref);
$t->printWeakRefObj();

unset($satou);

$t->printWeakRefObj();
```
```shell:結果
$ php RefTest2.php
object(Satou)#1 (1) {
  ["d":"Satou":private]=>
  string(4) "aaaa"
}
Destroy
NULL
```

unsetを呼び出したタイミングでdeconstructorが呼び出され、
2回目のprint時に、RefTest2のプロパティには参照が残っていない状態になる。

---------------------------------------
このように、参照を渡したいが、オブジェクトのライフサイクルを共有したい場合には、このWeakRefが使える。
現在Versionが0.2.2で、まだまだメジャーバージョンには程遠いが、例のような使い方程度なら全く問題ないように思える。
RubyのAWS::S3を使ってS3の東京リージョンにファイル出来ない場合の対処法！！


以前
http://qiita.com/items/84c9fdefae40e9190005
こういう記事を書きました。

でも、この時はデフォルトのリージョン時の物でした。

そして今回、正規利用する為に東京リージョンに変えたら
ファイルをUPできませんでした。

色々調べた結果以下の方法で、解決しました。

```ruby
# S3設定
AWS::S3::Base.establish_connection!(
  :access_key_id     => ACCESS_KEY_ID,
  :secret_access_key => SECRET_ACCESS_KEY,
);

# 東京リージョンの場合設定値を置換します。
if REGION == "Tokyo" then
  AWS::S3::DEFAULT_HOST.replace "s3-ap-northeast-1.amazonaws.com"
end
                                                                
# アップロード                                                
AWS::S3::S3Object.store(                                       
  remote_file,              # アップロード先のファイル名       
  open(local_file),         # アップロードしたいローカルファイル
  BUCKET_NAME,         # バケット名                            
  :access => :public_read   # 全体に読み込み公開               
);                                                            
```

地味にgithubで修正版を公開中
AWS系ツールを今後も開発していきますので、出来る限り公開していきます。（勉強がてら）
https://github.com/shinofara/aws_tools
※まだまだテスト段階なので、コメントとか修正が必要な箇所とか色々残ってますが笑

おすすめのツール等ありましたら、教えてください＞＜
第10回オフラインリアルタイムどう書くの参考問題。ruby による実装例。

イベント : http://atnd.org/events/38678
問題 : http://nabetani.sakura.ne.jp/hena/ord10pokarest/
解答リンク集 : http://qiita.com/items/d819d1e5f2378317511e

```ruby:ord10pokarest.rb
#coding:utf-8

def rank(s)
  { "J"=>11, "Q"=>12, "K"=>13, "A"=>1 }[s] || s.to_i
end

def flash?( hand )
  hand.all?{ |c| c[1]==hand.first[1] }
end

def straight?( hand )
  r=hand.map{ |c| c[0] }.sort
  r==(r.first .. r.last).to_a || r==[1]+(r[1]..13).to_a
end

def roy?( hand )
  hand.map{ |c| c[0] }.sort==[1,10,11,12,13]
end

def score( hand )
  { flash?:4, straight?:2, roy?:1 }.map{ |k,v|
    send(k,hand) ? v : 0
  }.inject(&:+)
end

def solve( src )
  hand = src.scan(/(([^shdc]+)([shdc]))/).map{ |m| [ rank(m[1]), m[2] ] }
  { 7=>"RF", 6=>"SF", 4=>"FL", 3=>"ST", 2=>"ST" }[score(hand)] || (
    fours=hand.combination(4)
    { 6=>"4SF", 4=>"4F", 2=>"4S" }[ fours.map{ |four| score(four) }.max ]
  ) || "-"
end

DATA.each do |line|
  num, input, expected = line.split( /\s+/ )
  actual = solve( input )
  ok = actual==expected
  puts( "%s : %s->%s ( %s )" % [ (ok ? "ok" : "***NG***"), input, actual, expected ] )
end

__END__
0   Qs9s3dJd10h 4S
1   KdAdJd10dQd RF
52  10dKdQdAdJd RF
```

今回は rspec ではなく、コード内にテストを埋めた。
テストデータの大半は省略。

こんなところでも役に立つ `combination`。ありがたい。

`||` と Hash を乱用気味に使って楽をしてみた。

score の計算で send をしているが、if 文か ?: を三個書いたほうが素直だと思う。

ruby 1.9 や 1.8 では試していない。
Magitでコミット前にコミットメッセージに関する注意点をチェックする


# 概要
[`magit-commit-training-wheels`](https://github.com/re5et/magit-commit-training-wheels) パッケージを使うと、
Magitでコミットするときに次の[注意点](http://keijinsonyaban.blogspot.jp/2011/01/git.html)をチェックしてくれます。

1. 1行目は50文字以内であること
2. 1行目の最初の単語は大文字で始めること
3. 2行目は空行であること
4. 3行目以降は72文字で折り返すこと

# インストール方法
	M-x package-install magit-commit-training-wheels


# 設定


```scm
(require 'magit-commit-training-wheels)
(ad-activate 'magit-log-edit-commit)
```
d3forumの「参考にならない」ボタンが好きではないので、「いいね！」ボタンだけを表示するようにしてみた。


基本的には、テーマのテーマ下テンプレートとして、d3forumのテンプレート inc_eachpost.html などを編集することで対応することを想定、もちろん、オリジナルのテンプレートを修正するのもOK。（その場合は、altsysを使った方法が良いかも）

d3forumのテーマ下テンプレート　inc_eachpost.html について次のような編集を行う。

101行目あたりの

``` smarty
<span class="d3f_vote">
	<{$smarty.const._MD_D3FORUM_VOTECOUNT}>:<{$post.votes_count}>
	<{$smarty.const._MD_D3FORUM_VOTEPOINTAVG}>:<{$post.votes_avg|string_format:"%.2f"}>
</span>
```

を削除するかコメントアウトする。

116行目あたりの

```
<form action="<{$mod_url}>/index.php" method="get" style="display:inline;">
	<input type="hidden" name="page" value="vote_to_post" />
	<input type="hidden" name="post_id" value="<{$post.id}>" />
	<input type="hidden" name="point" value="0" />
	<{if $caller == 'listposts'}>
		<input type="hidden" name="ret_name" value="topic_id" />
		<input type="hidden" name="ret_val" value="<{$topic.id}>" />
	<{/if}>
	<input type="submit" value="<{$smarty.const._MD_D3FORUM_VOTEPOINTDSCWORST}>" />
</form>
```

を削除するかコメントアウトする。（これが、「参考にならない」ボタン部分）

106行目あたりの

```
<form action="<{$mod_url}>/index.php" method="get" style="display:inline;">
	<input type="hidden" name="page" value="vote_to_post" />
	<input type="hidden" name="post_id" value="<{$post.id}>" />
	<input type="hidden" name="point" value="10" />
	<{if $caller == 'listposts'}>
		<input type="hidden" name="ret_name" value="topic_id" />
		<input type="hidden" name="ret_val" value="<{$topic.id}>" />
	<{/if}>
	<input type="submit" value="<{$smarty.const._MD_D3FORUM_VOTEPOINTDSCBEST}>" />
</form>
```

の最後にあるinputを改造して、ボタンに「いいね！」の数を表示させる

```
<form action="<{$mod_url}>/index.php" method="get" style="display:inline;">
	<input type="hidden" name="page" value="vote_to_post" />
	<input type="hidden" name="post_id" value="<{$post.id}>" />
	<input type="hidden" name="point" value="10" />
	<{if $caller == 'listposts'}>
		<input type="hidden" name="ret_name" value="topic_id" />
		<input type="hidden" name="ret_val" value="<{$topic.id}>" />
	<{/if}>
	<input type="submit" value="<{$smarty.const._MD_D3FORUM_VOTEPOINTDSCBEST}><{if !$post.votes_count == 0}>:<{$post.votes_count}><{/if}>" />
</form>
```

テーマ下のlanguageにて、d3forumの言語定数を上書きする設定を追加（元は、「参考になった」となっている）

```
define('_MD_D3FORUM_VOTEPOINTDSCBEST','いいね！');
```

これで、d3forum独自の「いいね！」ができあがる。
unite-buildのbuilderを自作してみる。


この記事は[Vim Advent Calendar 2012](http://atnd.org/events/33746) : ATND 141日目の記事になります。
140日目は[@tyru](http://twitter.com/tyru)の[エンター巻き込み事故を防ぐ](http://d.hatena.ne.jp/tyru/20130419/avoid_tyop)でした。

- - - - - - - - - - - - - - - - - - - - - - - -

103回目の[Vim Advent Calendar 2012 ujihisa 5](http://vim-users.jp/2013/03/vim-advent-calendar-2012-ujihisa-5/)で[unite-build](https://github.com/shougo/unite-build)が紹介されていた。
unite-buildがどんなものかについては103日目の記事を参照していただければ、概要は理解できるでしょう。
103日目の記事に書いてある通り、このunite-buildはquickrunのoutputter/quickfixに似て非なるものです。

ここでは、unite-buildの使い方とunite-buildのbuilderを自作する方法を説明したいと思います。


# unite-buildの使い方

まずはunite-buildの使い方ですが、unite-buildを実行するには以下の4パターンがあります。

### :Unite build

これは、各builderのdetent関数によって実行されるかされないかが決まり、実行されるものは順に実行されます。
detent関数については後述する`s:builder.detect(args, context)`を参照してください。

### :Unite build:!

これは、`:Unite build`のエラーについてフィルタリングを行わないようなbuilderになります。

### :Unite build:{builder-name} or :Unite build:{builder-name}:{args}

上記の2つの場合にはdetent関数によって実行の有無が決定しますが、これは実行したいbuilderを決めることが出来ます。
{builder-name}はbuilderの名前です。 {args}は実行するコマンドへ渡す引数です。
{builder-name}や{args}に空白を含まれている場合には空白をエスケープしなけらばならないことに注意してください。


# unite-buildのbuilderの作り方

unite-buildのbuilderの作り方は、コードを読んでもらった方が理解しやすいと思うので最小限であろうコードを以下に示します。
これは単にlsコマンドを実行するだけのbuilderです。

```vim:
" autoload/unite/sources/build/builders/ls.vim

call unite#util#set_default('g:unite_builder_ls_command', 'ls')

function! unite#sources#build#builders#ls#define()
  return executable(g:unite_builder_ls_command) ? s:builder : []
endfunction

let s:builder = { 'name': 'ls', 'description': 'ls builder', }

function! s:builder.initialize(args, context)
  return g:unite_builder_ls_command . ' ' . join( a:args, ' ' )
endfunction

function! s:builder.parse(string, context)
  let candidate = { 'type' : 'message', 'text' : a:string }
  return candidate
endfunction
```

このコードを&runtimepathが通っている"autoload/unite/sources/build/builders/ls.vim"のような場所に置きます。
そして、`Unite build:ls:-al`と実行すると以下のような感じで出力されます。

![](http://img.viame-cdn.com/photos/fc2a8d00-8bbe-0130-9cc6-22000a1de5bc/r600x600.jpg)


# unite-buildのbuilderの詳細

### s:builder.name

builderの名前です。{builder-name}にあたる部分になります。

### s:builder.description

builderの説明文になります。
これは省略可能です。

### s:builder.detect(args, context)

上記にコードにはありませんが、`:Unite build`に引数がなにも指定されていない時のみに呼ばれます。
この関数が返す値はBool値で、真を返した時にコマンドを実行し、偽を返した時にはコマンドを実行しません。
これは省略可能です。

### s:builder.initialize(args, context)

この関数は実行するコマンドを返します。
a:argsには{args}で指定された値が渡されます。

### s:builder.parse(string, context)

コマンドの出力結果の1行ごとにこの関数が呼ばれます。その時、a:stringに1行の文字列が格納されます。
この関数はその行を解析して、その行に関してUniteへの出力に必要な情報を辞書で返します。
返す辞書は、以下のキーを持ちます。

    type: 種類を指定します。現状、"error", "warning", "message"のうちのどれかです。
    text: Uniteに表示される文字列を指定します。
    filename: エラーの場合に参照するファイル名を指定します。(省略可)
    line: エラーの場合に参照する行数を指定します。(省略可)
    col: エラーの場合に参照する列数を指定します。(省略可)

### unite#sources#build#builders#...#define()

s:builderを返す。もし、コマンドが実行出来ないなどのエラーがある場合には空リストを返す。
`...`の部分にはbuilder名を指定します。


# 終わりに

unite-buildのbuilderの作成については大体こんなところです。
実際に作成するとなると、`s:builder.parse(string, context)`が肥大化していくことになるでしょう。
unite-buildには標準でmakeとrepomanが入っています。これらを参考に皆さんもbuilderを作成してみてはいかがでしょうか。
第10回オフラインリアルタイムどう書くの参考問題をRubyで解く

問題はこちらの記事にリンクがあります。
http://qiita.com/items/d819d1e5f2378317511e

```ruby
RANK_TO_NUM = {X:10,J:11,Q:12,K:13,A:14,a:1}

def max_seq(cards)
  cards.zip([-1]+cards.map{|_|_[0]})
       .map{|card,prev| card[0] - prev}
       .inject([0,0]){|seqs,d|
         max_seq,cur_seq = seqs
         if d == 1
           cur_seq += cur_seq == 0 ? 2 : 1
           max_seq = cur_seq if cur_seq > max_seq
         else
           cur_seq = 0 unless d == 0
         end
    [max_seq,cur_seq]
  }[0]
end

def solve(q)
  cards = q.gsub("10","X")
           .gsub(/A(.)/){"A#{$1}a#{$1}"}
           .scan(/../)
           .map{|_|_.split('')}
           .map{|rank,suit| rank.to_i > 0 ? [rank.to_i,suit] : [RANK_TO_NUM[rank.to_sym],suit]}
           .sort
  max_seq = max_seq(cards)
  cards_w = cards[0][0]==1 ? cards.drop(1) : cards
  suit_group=cards_w.group_by{|_|_[1]}.values.map{|_|_.size}.sort.reverse

  if suit_group.size == 1
    if max_seq == 5
      cards[-2][0] == 13 ? "RF" : "SF"
    else
      "FL"
    end
  elsif max_seq == 5
    "ST"
  elsif %w(s h d c).map{|suit|max_seq(cards.select{|_|_[1]==suit})}.max == 4
    "4SF"
  elsif suit_group[0] == 4
    "4F"
  elsif max_seq == 4
    "4S"
  else
    "-"
  end
end

DATA.readlines.each do |line|
  no,q,a = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans
  puts ans == a ? ' OK' : ' NG'
end

__END__
0	Qs9s3dJd10h	4S
1	KdAdJd10dQd	RF
```
Tips : VMware上のUbuntuの解像度の変更

ずっと出来ずにイライラしていた
VMware上のUbuntu解像度変更が出来たので、
備忘録として手順を残しておきます。

Ubuntu 12.04 LTS
VMware ESXi 7.0

### 現象
Ubuntuの「システム設定→ディスプレイ」で選べる解像度が、
Maxで1200×1000位(うろ覚え)までしか選択できなかった。

### 手順
1. 対象のマシンを一旦落とす。

2. VMwareのClientから対象マシンの「設定の詳細」を開く。

3. 「ハードウェアタブ」の「ビデオカード」を選択し、
右の「表示用のメモリ設定」で、
「ビデオ設定を自動検出」に変更。OKを押す。

4. 起動。
「システム設定→ディスプレイ」で選択出来る項目が増えている。