OmniAICreator/Qiita-1.07M huggingface dataset:
VagrantとChef Soloをかじる


ずっと手を出したかったVagrantとChef。
チュートリアル[http://qiita.com/taiki45/items/b46a2f32248720ec2bae](http://qiita.com/taiki45/items/b46a2f32248720ec2bae)の履歴メモ。


##Virtual Box 入れた
##Vagrant入れた（gemだとバージョン古いらしいのでdownload）

```
vagrant -v
Vagrant 1.3.5
```
出た。

##Vagrant用のテストディレクトリつくる


##Box（テンプレート）とってくる

```
vagrant init "Debian7" "https://opscode-vm-bento.s3.amazonaws.com/vagrant/opscode_debian-7.1.0_provisionerless.box"
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```

とか、[Vagrantbox.es](http://www.vagrantbox.es)から

```
vagrant box add centos64 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box
```
とかで。

##Box（テンプレート）一覧を見る

```
vagrant box list
Debian7  (virtualbox)
centos64 (virtualbox)
```



##設定ファイルのぞいてみる
設定ファイル`Vagrantfile`

```
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "Debian7"
  config.vm.box_url = "https://opscode-vm-bento.s3.amazonaws.com/vagrant/opscode_debian-7.1.0_provisionerless.box"
end
```
さっき設定したやつや。

##立ち上げてみる

```
vagrant up
```

##立ち上がったら入る

```
vagrant ssh
```
  
##Shared Folder
ホストのVagrantfileがあるディレクトリと
VM内の`/vagrant`は共有されている。

#Chef Solo

- Vagrant が VM を立ち上げる
- Cookbook を VM に転送する
- VM 上で Chef Solo を実行する

この流れを試す。

##vagrant-omnibus
##vagrant-berkshelf

```
vagrant plugin install vagrant-omnibus
vagrant plugin install vagrant-berkshelf

gem install berkself
```

##Berkshelfの設定ファイル

`Berkshelf`が設定ファイル

```
site:opscode
```
`site:opscode`とは`source "https://rubygems.org`と同じようなものらしい。特にソースを指定しない場合はopscodeからダウンロードするよっていう意味みたい。

##Cookbookの置き場所

置き場所についての作法としては
汎用的な Cookbook を置く場所が `cookbooks` で、その環境構築固有の Cookbook を `site-cookbooks` に置くことが多いらしい。

##cookbookをberksする。

```
cd site-cookbooks
berks cookbook hello
```

hello以下にcookbookのあれそれが自動的に作られる。

`hello/recipes/default.rb`を編集する

```
log "Hello World!!!!!!!!!!!!!"
```

##VagrantFileにvagrant-berkshelfプラグインとvagrant-omnibusプラグインの設定を書く

```
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # ...
  config.omnibus.chef_version = :latest
  config.berkshelf.enabled = true
  # ...
end
```

##Berksfile helloのcookbookのパスを設定

```
site :opscode
cookbook "hello", path: "site-cookbooks/hello"
```

##Vagrant upさせる

`VagrantFile`の中身は最終的にはこんな感じ

```
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "Debian7"
  config.vm.box_url = "https://opscode-vm-bento.s3.amazonaws.com/vagrant/opscode_debian-7.1.0_provisionerless.box"

  config.vm.provision :chef_solo do |chef|
    chef.run_list = ["hello"]
  end
  
  config.berkshelf.enabled = true
  config.omnibus.chef_version = :latest

end
```
先ほど作った環境を壊して

```
vagrant destroy
```

vagrant upする

```
vagrant up
```

```
[2013-10-20T07:14:28+00:00] INFO: Hello World!!!!!!!!!!!!!
[2013-10-20T07:14:28+00:00] INFO: Chef Run complete in 0.020857476 seconds
```
出た。
objective-cとmacrubyでbluetooth deviceの存在確認をする

## objective-c版
```objc:main.m
#import <Foundation/Foundation.h>
#import <IOBluetooth/objc/IOBluetoothDevice.h>


int main(int argc, const char * argv[])
{

    NSLog(@"start");
    NSString *addrStr = @"xx:xx:xx:xx:xx:xx"; // bluetooth deviceのMAC Address
        
    IOBluetoothDevice *device = [IOBluetoothDevice deviceWithAddressString:addrStr];

    // タイムアウト3秒
    [device openConnection:nil withPageTimeout:3000 authenticationRequired:false];
        
    if ([device isConnected]) {
            NSLog(@"connected !!!");
    } else {
            NSLog(@"not connected");
    }
        
    [device closeConnection];

    return 0;
}
```

## macruby版

```rb:macruby-sample.rb
#! /usr/bin/env macruby

framework 'Foundation'
framework 'IOBluetooth'

device = IOBluetoothDevice.deviceWithAddressString "xx:xx:xx:xx:xx:xx"
device.openConnection(nil, withPageTimeout: 3000, authenticationRequired: false)

if device.isConnected
  puts 'connected!!!'
else
  puts 'not connected.'
end

device.closeConnection
```
オフラインどう書く15回参考問題解答例 ( JavaScript )

今回はテストフレームワークに jasmine を使いました。

```hena.js
function solve(src) {
    'use strict';
    var impl = function (src, begin, len) {
        var ret = len,
            i = begin,
            j;  
        for (; i < src.length; i += 1) {
            j = src.lastIndexOf(src[i]);
            if (j === i) {
                ret = Math.max(ret, len + 1); 
            } else {
                ret = Math.max(ret, impl(src.substr(0, j), i + 1, len + 2));
            }   
        }   
        return ret;
    };  
    if(src === src.split('').reverse().join('')) {
        return src.length;
    }   
    return impl(src, 0, 0); 
}
```

テストコードはこちら ↓

```hena_spec.js
describe("hena", function() {
    beforeEach(function() {
    // nothing to do.
    });
    
    it("should return 9", function() {
        expect(solve('I_believe_you_can_solve')).toEqual(9);
    });
    
    it("should return 1", function() {
        expect(solve('a')).toEqual(1);
    });

    // 以下略
});
```
C-gでリージョンのハイライトが解除されない

いつからか忘れましたがおそらくEmacs 24にした時点で`transient-mark-mode`を`t`にしたとき、リージョンのハイライトをたまにC-gで解除できなくなることがありました。

C-gで解除できる場合もあったりしてこのようになってしまう条件がよくわからず、ぐぐってみても芳しい情報をえられず悶々としておりました。特にEmacs24になってからリージョンがハイライトしている状態で文字を入力するとリージョンが消えて入力した文字に置き換わるという挙動に変わっています。なので解除ができないのは致命的でした。

今まではM-w (`kill-ring-save`) で切り抜けてきましたが、これだと勿論コピーしたくもない文字列がkill-ringに入ってしまいます。

##解決?

が、どうやら解決策らしきものを見つけました。

**C-spaceを連続で2回押下**すればよいようです。

この時“Mark deactivated”とメッセージが出てハイライトが解除されます。

もしかするとC-gではなくC-spaceで解除するのが昔からの作法だったのかもしれませんが、同じように悩んでる人がいるかもしれないと思って記しておきます。

##心配なこと
expand-regionを入れようと思ってるのですが、こいつを入れたらどういう挙動になるのだろう…
Eigenでスプライン曲線（Siv3Dで描画）

線形代数ライブラリEigenにはスプラインフィッティングがあるので、使ってみた。
Siv3Dに描かせた。楽。
細かいところはまだ理解していない。あとでもう少し調べる


```cpp

#pragma warning(disable : 4996)
#include <Siv3D.hpp>
#include <Eigen/dense>
#include <unsupported/Eigen/Splines>

void Main()
{
	namespace e = Eigen;
	using namespace std;
    
	const size_t len_t = 100;
	vector<double> t(len_t);
	vector<double> x(len_t);
	vector<double> y(len_t);
    
	for(size_t i = 0; i < len_t; ++i){
		t[i] = 1.0 / t.size() * (i + 1);
	}
    
    //二次元空間上のスプライン曲線
	typedef e::Spline<double,2> Spline2d;
	typedef Spline2d::PointType PointType;
	typedef Spline2d::KnotVectorType KnotVectorType;
	typedef Spline2d::ControlPointVectorType ControlPointVectorType;

    //5つの制御点
	ControlPointVectorType points(2, 5);
    points <<
        0.1, 0.2, 0.3, 0.5, 1.5,
		0.9, 0.1, 0.2, 0.5, 0.9;
    
    //三次のスプライン曲線を得る（tが0.～1.に正規化されている）
	const Spline2d spline = e::SplineFitting<Spline2d>::Interpolate(points,3);

    //各制御点に対応するtを得る
	KnotVectorType chord_lengths;
	e::ChordLengths(points, chord_lengths);

    
    //各制御点を通過しているかチェック
	for (e::DenseIndex i = 0; i < points.cols(); ++i)
	{
		PointType pt = spline(chord_lengths(i));
		PointType ref = points.col(i);
		LOG_MSG(Format() + ((pt - ref).matrix().norm() < 1e-14 ));
	}
    
    //出来たスプライン曲線に沿って点を打ってみる
	for (size_t i = 0; i < len_t; ++i)
	{
		PointType pt = spline( t[i] );
        x[i] = pt.matrix()[0];
		y[i] = pt.matrix()[1];
	}
    
	while(System::Update())
	{
        
		for(size_t i = 0; i < len_t; ++i){
			Circle(400*x[i], 400*y[i], 3).draw();
		}
	}
}


```
elasticsearchでインデックスのバックアップ、リストア

## esclientをインストール
```
sudo easy_install esclient
```

## 全インデックスをまるごとバックアップ
```
esdump --url http://localhost:9200/
```

## 特定のインデックスをバックアップ
```
esdump --url http://localhost:9200/ --indexes logstash-2013.10.12 logstash-2013.10.13
```

## インデックスのバックアップをファイルに出力
```
esdump --url http://localhost:9200/ --bzip2 --file esdump.bz2
```

## バックアップをファイルから復元(_idがバックアップされているので、重複すれば上書きしてくれる。)
```
esimport --url http://localhost:9200 --file logstash-2013.10.12.bz2
```


これは便利。
静的メンバ変数を静的クラスのコンストラクタでアクセスしてはいけないのか？（追記）

http://qiita.com/rai_suta/items/332a6746561301f7f249
からの追記

この問題の対策案を書いてらっしゃる方[1]を見つけたので、参考に自分のコードを書きなおしてみる

```cpp:hoge.hpp
class Fuga {
public:
	int val;
	Fuga(int x=0);
	void
	setVal(int x);
};

class Hoge {
	static Fuga& fuga();
public:
	Hoge();
	void
	showVal();
};
```

```cpp:hoge.cpp
#include "hoge.hpp"
#include <stdio.h>

Fuga::Fuga(int x){
	printf("construct Fuga:x = %d\n", x);
	val = x;
}

void
Fuga::setVal(int x){
	printf("called setVal:x = %d\n", x);
	val = x;
}

Fuga& Hoge::fuga(){
	static Fuga v;
	return v;
}

Hoge::Hoge(){
	printf("construct Hoge\n");
	fuga().setVal(123);
}

void
Hoge::showVal(){
	printf("val = %d\n", fuga().val);
}
```

[1]http://giftserver.dip.jp/anotherproject/html_l5/develop/pgmemo/static_constructor.htm
静的メンバ変数を静的クラスのコンストラクタでアクセスしてはいけないのか？

以下のようなコードがあったとして

```cpp:hoge.hpp
class Fuga {
public:
	int val;
	Fuga(int x=0);
	void
	setVal(int x);
};

class Hoge {
	static Fuga fuga;
public:
	Hoge();
	void
	showVal();
};

```

```cpp:hoge.cpp
#include "hoge.hpp"
#include <stdio.h>

Fuga::Fuga(int x){
	printf("construct Fuga:x = %d\n", x);
	val = x;
}

void
Fuga::setVal(int x){
	printf("called setVal:x = %d\n", x);
	val = x;
}

Fuga Hoge::fuga;

Hoge::Hoge(){
	printf("construct Hoge\n");
	fuga.setVal(123);
}

void
Hoge::showVal(){
	printf("val = %d\n", fuga.val);
}

```

以下の２つのコードの挙動は異なるという話

```cpp:main1.cpp
#include <stdio.h>
#include "hoge.hpp"

Hoge hoge;

int main(void)
{
	hoge.showVal();
}
```

```
construct Hoge
called setVal:x = 123
construct Fuga:x = 0
val = 0
```

```cpp:main2.cpp
#include <stdio.h>
#include "hoge.hpp"

int main(void)
{
	Hoge hoge;
	hoge.showVal();
}
```

```
construct Fuga:x = 0
construct Hoge
called setVal:x = 123
val = 123
```

結論：静的オブジェクトのコンストラクタで余計なことをするな
Vimでgithub issuesを読み書きできるように、vim-metarw-github-issuesを作った

vim-metarwシリーズ第二弾。
自分のために作ってるので、他の人が使いやすいかどうかは良く分かりませんが、vim-metarwを使ってGithubのissueを読み書きできるようにしました。

[joker1007/vim-metarw-github-issues](https://github.com/joker1007/vim-metarw-github-issues "joker1007/vim-metarw-github-issues")

大枠は前回作ったvim-metarw-qiitaと余り変化ありません。

特定のリポジトリのissueだけでなく、organization単位でもissueを一覧できるようにしています。

またissueの編集、コメントの書き込みと表示もサポートしましたが、表示の都合上、変に編集すると誤爆する危険性があるので、もし利用される方が居たら自己責任で利用をお願いします。

vimにもうちょっと詳しくなれば、色々回避できるのかもしれない。

セーフモードとか用意した方が良いのかなー。でも面倒さが増えるし…。


## Usage

### Write vimrc

```vim
let g:github_user='joker1007'
let g:github_token='xxxxxx' " API経由で取得しておく

" Optional
let g:github_per_page=50 " Max 100
```

### Post current buffer as new item

```
:write issues:repos/:owner/:repo
```

Caution: Not modify comment separator, otherwise post issue body with comments

### Open a issue


```
:edit issues:repos/:owner/:repo/issues/:number
```

### Update current open issue

```
:write
```

Caution: Not modify comment separator, otherwise post issue body with comments

### Post new comment to current open issue

Open comment buffer

```
:IssueCommentPost
```

and save

```
:write
```

Caution: Existing issue buffer is not refreshed. Refresh Manually.

### Get issues for repository


```
:edit issues:repos/:owner/:repo
```

### Get issues for organization

```
:edit issues:orgs/:org?filter=all
```

### Open by browser

```
:IssueBrowse
```
SublimeText2のiosアプリ用SublimeClangの設定

xcode5でiosアプリの勉強をしてましたがやはりSublimeText2を使いたいなーということで、設定してみました。

プロジェクトの設定ファイル（your-project.sublime-project）に以下の設定を追加します。

- 最初からある設定は省略しています。
- とりあえずエラーがです、フレームワークのヘッダー、プロジェクト内のヘッダーを元に補完が効く設定です。コンパイル等を考慮すると見直す部分が多々あると思います。
- おそらくxcode上では使うことになっていないフレームワークについても補完します。（ここに設定するのが面倒なので・・・）
- your-projectの部分は自分のプロジェクトに変更して下さい。
- your-project.sublime-projectファイルがプロジェクトのルートフォルダにあることを想定しています。ルートフォルダ以下にメインのフォルダ、テストフォルダyour-project.xcodeprojファイルがあるはずです。

```json:your-project.sublime-project
{
	"settings": {
		"sublimeclang_options": [
			"-Wall",
			"-isysroot", "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk",
			"-I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/usr/include",
			"-I/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.0.sdk/System/Library/Frameworks",
			"-arch", "arm",
			"-I${project_path:your-project}/**"
		]
	}
}
```

コンパイル等を含めてxcode抜きを目指したい。
blockdiag.comのドキュメントをKindle形式に変換してみた

[ブロック図生成ツール blockdiag — blockdiag 1.0 documentation](http://blockdiag.com/ja/)のドキュメントはreStructuredTextで書かれているようなので、Kindleのmobiファイルにしたいなーと思い、試行錯誤してやってみました。
作成したmobiファイルは https://www.dropbox.com/sh/6o7428r17ldokhz/k_v7FI3H5b/blockdiag%20-%20Takeshi%20KOMIYA.mobi にあります。

## epubファイルを生成

[ブロック図生成ツール blockdiag — blockdiag 1.0 documentation](http://blockdiag.com/ja/)のドキュメントのソースは https://bitbucket.org/tk0miya/blockdiag.com にありました。この中の sources/ja/Makefile にepubというターゲットがあります。

変換はOSX上でHomebrewで入れたPython 2.7.5で行いました。本当はvirtualenvとかで環境を作ったほうがいいのかもしれませんが、とりあえず普通にsphinxをインストールしました。手順はうろ覚えなので抜けがあるかもしれません。

まず、[homebrew と pip で sphinx-blockdiag Install — JAWSUG-Okinawa 2nd study NOTE](http://sicafe.net/macPackageManageTips/html/sphinx_blockdiagInstall.html) を参考に以下のコマンドでsphinxをインストールしました。

```shell-session
$ pip install sphinxcontrib-blockdiag sphinxcontrib-seqdiag \
sphinxcontrib-nwdiag sphinxjp.themes.s6 sphinxjp.themecore \
sphinxjp.themes.sphinxjp sphinxcontrib-googleanalytics cloud_sptheme
```

これだけだとepub変換時でエラーになったので、[(4日目) Sphinx の文書を翻訳してみよう (sphinx-gettext-helper) - Hack like a rolling stone](http://tk0miya.hatenablog.com/entry/20111204/p1)を参考に以下も実行。

```shell-session
$ pip install sphinx-gettext-helper
```

以下のコマンドでepubファイルを生成します。

```shell-session
$ hg clone http://bitbucket.org/tk0miya/blockdiag.com
$ cd blockdiag.com/sources/ja
$ make epub SPHINXBUILD=/usr/local/bin/sphinx-build GETTEXTHELPER=/usr/local/bin/sphinx-gettext-helper
```

これで ../../_build/ja/epub/blockdiag.epub に生成されました。

## epubファイルをKindle用のmobiファイルに変換

[calibre - E-book management](http://calibre-ebook.com/)を使ってepubファイルをKindle用のmobiファイルに変換しました。いつもお世話になっています。
D言語のIDEの現状

[FacebookがD言語を採用したこと](http://forum.dlang.org/thread/l37h5s$2gd8$1@digitalmars.com)が一週間遅れで[日本語記事化](http://japan.internet.com/webtech/20131018/5.html)されて[バズりました。](http://realtime.search.yahoo.co.jp/search?fr=sfp_as&p=D言語&rkf=1&ei=UTF-8&lts=1382022000&uts=1382194800&gd=1&gm=m&guts=1382281200)
この記事ではそんな「ぽっと出」と思われているD言語の開発環境についてご紹介します。

#テキストエディタ
<del>IDEの記事ですがスルーすると消されそうな気がしたしQiitaのユーザー層的にはこちらの方が多い可能性もあるので</del>

##vim
d.vimというsyntaxファイルが2002年から現在まで同じ方にメンテされています。

[d.vim - Vim.org](http://www.vim.org/scripts/script.php?script_id=379)

GitHubにリポジトリがあるのでVim.orgのもので問題が出たら参照してみると良いでしょう。

[d.vim - GitHub](https://github.com/JesseKPhillips/d.vim)

##emacs
Qiita内にtm_tnさんの記事があるのでこちらを紹介します。

[Emacs で始める D言語!](http://qiita.com/tm_tn/items/1d01c4500e1ca7632140)

##Sublime Text
Sublime Textは標準機能にD言語の文法とビルドコマンドがありますが、D1.0準拠のものでD2.0のキーワードに対応していません。
GitHubに有志が追加したD.tmLanguageファイルがあるので、こちらで入れ替えてください。

[st2-d](https://github.com/alexrp/st2-d)

Sublime Text 3の場合は言語ファイルがD.sublime-packageとしてアーカイブ化されていますが、中身はzipなので解凍→入れ替え→再圧縮の手順で置き換え可能です。
<S>公式で対応してくれるのが一番良いんですがクローズドソースなのでPull Request等ができない…</S>

##サクラエディタ
Sublime Textと同じく公式で文法ファイルが同梱されています。
[パッケージ版ファイル一式](http://sakura-editor.sourceforge.net/htmlhelp/HLP000005.html)

#IDE

##[Visual D](http://rainers.github.io/visuald/visuald/StartPage.html)
名前の通りVisual StudioでD言語プロジェクトを扱う事が出来ます。
現在の対応バージョンは2005から2012で、インストールを実行するだけでD言語関連の機能がVisual Studioで動作します。
VS拡張機能なので残念ながらExpressでは動作しませんが、MS公式のVS Shell (Isolated&Integrated)をインストールすればProfessionalを持っていなくても使う事が出来ます。
<del>現在はVS2013がリリースされた影響でVS2013 Shellしかダウンロードできませんので、Professionalを持っていない方はVisual Dの対応を待ちましょう。
参考までにVS2012には発売1ヶ月で正式対応しました。<del>

**日本時間2013/11/3 Visual D 0.3.37がリリースされVS2013に正式対応しました。**

またD言語がUnicode標準なのに対してVisual Studioの日本語版が新規作成するファイルの標準がShift-JISなので、そのままマルチバイト文字を扱うとコンパイルエラーが出てしまうので注意しましょう。

##[DDT(Eclipse Plugin)](https://code.google.com/p/ddt/)
Eclipse用のD言語開発環境プラグインです。
D言語のIDEとしては歴史が長めでアップデートも活発です。

##[Mono-D](http://mono-d.alexanderbothe.com/download/)
Mono Develop（現Xamarin Studio）用のD言語開発環境です。
現在はXamarin Studioのアドイン設定からもインストールできます。

##[D-IDE](http://d-ide.sourceforge.net)
.NET4.0で作成されたD言語専用のIDEです。
なお開発者はMono-Dと同じ方なので、まだ更新は続いていますがクロスプラットフォーム対応のMono-Dの方がおススメかと思います。

##[IntelliJ IDEA D Plugin](https://launchpad.net/intellij-idea-d-plugin)
JetBrain公式の言語プラグイン表に無かったので検索してみたら発見しました。
IntelliJ IDEAは残念ながら持っていないので試用していません。
[IntelliJ IDEAを買ってくれる方を募集しています。](http://www.amazon.co.jp/registry/wishlist/1JGF0NHVXMR1E/ref=wl_bm-view-list&altAction=1)


##おわりに
過去には[D言語製のIDEもありました](http://www.dsource.org/projects/poseidon/wiki/Screenshots)が、現在はメジャーなIDEとテキストエディタにD言語で開発するための機能を追加する形で落ち着いています。
D言語がさらにメジャーになり安定してTIOBE TOP20に入るくらいになったらまたD言語だけでIDEを作ろうとする人も現れるかも知れませんが、
実用的には現状の形が一番望ましいかと思います。

今回の記事を書くきっかけとなった[repeatedlyさんの記事](http://repeatedly.github.io/ja/2013/10/d-status-2013/)を読めば分かるように、
D言語自体は数年前に言われていたような「毎月のように破壊的変更が来る」言語では無くなっていて、
「D言語で書く」ことは日本語書籍が他の言語と比べて少ないだけで既に誰でも出来る状況になっています。
個人的にはビルド時間が自分のやる範囲ではほぼ皆無というだけでC++より好きな言語なので、今回の騒ぎでD言語を初めて知った人は是非触って見てください。
あとD言語の本とか書かせてくれる編集者の方が居たら是非声をかけてください。
Package Control のパッケージ公開方法が変更になりました

いつの間にか[Package Control](https://sublime.wbond.net)の仕組みが大幅にアップデートされていました。変わった点は2点。

## パッケージ申請時に編集するファイル

[以前の記事](http://qiita.com/makopo/items/83d551b5594e7802a3c4/revisions)でも書いたように、これまでは以下の手順を踏んでいました。
1. packages.jsonを書く
2. 自分のリポジトリに1.を配置
3. [Package Control Channelのリポジトリ](https://github.com/wbond/package_control_channel)のrepositories.jsonに自分のリポジトリのURLを書く
4. Pull Requestで申請する

しかし、今後は3.と4.だけになります。どういうことかというと、自分のリポジトリのpackages.jsonに書いていたものを、直接Package Control Channelのrepositories.jsonに書けばよくなりました。

で、みんながそうするとrepositories.jsonが大変なことになってしまう...ということで、ファイルが分割されました。"repository"というディレクトリの中に、0-9.json, a.json, b.json, ... とファイルがあるので、各自のパッケージ名の頭文字に対応するファイルの中に書いていくようになっています。

新しく申請される方は[Sublime Text 言語パッケージ作成：パッケージを公開する（応用編）](http://qiita.com/makopo/items/83d551b5594e7802a3c4)を見てください。

### 移行

これまでの手順で登録されている人は、特に何もしなくても構いません。ただ、自分のリポジトリからpackages.jsonを取り除いてスッキリさせたい！という人は、このようにすればいいです。

1. channel.jsonにある自分のURLを削除
2. repository/*.jsonに追加 (注：スキーマが新しくなったので今までとは書き方が違います。詳細は次項)
3. Pull Requestで申請
4. マージされた後で、自分のリポジトリからpackages.jsonを削除

## JSONの書き方 (スキーマ1.2 -> 2.0)

[以前の記事](http://qiita.com/makopo/items/83d551b5594e7802a3c4/revisions)で紹介した段階ではスキーマ1.2でしたが、現在は2.0に上がっています。

GitHubまたはBitBucketを使っていれば、ほぼ全自動でサイトの内容を抽出するようになったので、名前とURLぐらいしか書くことがなくなりました。

例えば、私のプラグインでは、このような記述で、

```json
{
	"schema_version": "2.0",
	"packages": [
		{
			"name": "LSL",
			"details": "https://github.com/Makopo/sublime-text-lsl",
			"labels": ["auto-complete", "color scheme", "language syntax", "linting", "theme"],
			"releases": [
				{
					"details": "https://github.com/Makopo/sublime-text-lsl/tags"
				}
			]
		}
	]
}
```

[このようなページになっています](https://sublime.wbond.net/packages/LSL)。なお、現在私のプラグインではまだrepository/*.jsonに移行していませんので、これは自分のリポジトリのpackage.jsonに書いています。

書き方の詳細は[Package Control新方式(2.0)でのJSON記述方法](http://qiita.com/makopo/items/25c73b186aa73a9edd3a)を見てください。
PHPをApacheとターミナルの両方で実行させる際のTips

PHPは、Web(Apache)経由でも呼び出せるし、ターミナル経由でも呼び出せる。

例えば、通常運用はWeb公開かもしれないが、テストはローカルのターミナル実行
なんてこともあるはず。

そんな時にいくつかハマったことがあったのでメモしておく。
＃以降自分の状況下でできたことに過ぎないので、他の環境ではその通りになるか
＃わからないのでご了承ください。


##1.　PHPが読み書きするファイルのパーミッション問題

自分のローカルマシンのUbuntuでは、ターミナルでファイル作成実行すると以下のようになる
＃仮にユーザ名：user1、グループ名:group1
＃PHPプログラム実行してファイル読み書きしても一緒

```
$ touch hoge.txt
$ ls -l hoge.txt
-rw-rw-r-- 1 user1 group1    0 10月 20 09:35 hoge.txt
```
一方Webブラウザを通してApache経由で(PHPを呼び出して)ファイル作成なんか行うと以下のようになる

```
# WebブラウザでPHPを呼び出してhoge.txtファイル作成を実行
$ ls -l hoge.txt
-rw-rw-r-- 1 www-data www-data    0 10月 20 09:35 hoge.txt
```

まぁ当たり前ではあるが、同じファイルを書き出す場合、
Web経由実行→ターミナル実行の順に実行するとすごい剣幕で怒られる。

これは、www-dataでファイルが作成されるので、user1で再度書き込みなんざしようもんなら
「おめー　www-data様じゃねーだろ。　おととい出直してきやがれ」と言われるのである。

ということで、以下で対策。

```
# 読み書きするフォルダ以下を所有者はログインユーザ、グループはwww-dataにする
$ sudo chown -R user1:www-data ~/hoge
# ログインユーザをwww-dataグループに追加する（全グループを指定したほうがいい）
#gpasswdでやった方が安全かも
$ sudo usermod -g www-data user1
```

これでどっちから実行してファイル読み書きしても怒られません。


##2.　PHPの引数問題

Web経由とターミナル経由の両方でPHPを実行する場合、引数処理がややこしい
というか面倒くさいです。

```
if( isset($_GET['param1'] ) ){
    $param1 = $_GET['param1'];
    #なんかすんばらしい処理
}
elseif ( $argc > 1 ) {
   $param1 = $argv[1];
    #なんかすんばらしい処理
}
```
上記は格好良くないし、以下の問題があります。

- 変数毎に毎回同じ呪文を唱えないといけない
- argvとか引数順番とか変わったりしたときチーン

そこで共通化してやって綺麗にしましょう。

```
// スクリプトの最初でこれをやっちゃう
// ターミナルからの実行の場合
$_PARAMS = array();
if ( $argc > 0 ) {
	foreach( $argv as $strArg ){
		if ( ( $arrTmp = explode('=', $strArg) ) && count($arrTmp) > 1 ) {
			$_PARAMS[$arrTmp[0]] = $arrTmp[1];
		}
	}
}
// Webからの実行の場合
elseif( count($_GET) > 0 ){
	$_PARAMS = $_GET;
}
```

上は２つのことをやってます。

+ 新しい配列($＿PARAMS)に$argvもしくは$＿GETの値を代入
+ $argvの引数として変数名＝値という形式をとれるようにする

これができると、以下のように呼び出しができちゃいます。

```
#Webから実行する場合
$ curl http://あなたの秘密いっぱいのURL/金になる.php?param1=value1&param2=value2

#ターミナルから実行する場合
$ php ~/あなたの秘密いっぱいのパス/金になる.php param1=value1 param2=value2
```

これでどっちで実行しようとも同じような引数形式で実行できるのでだいぶ捗ります。
homebrew-caskを使ってKobitoをインストール


Homebrew-caskに関しては[ここ](http://qiita.com/ksato9700/items/6f594597fe11c1bbeff8)に書いたので割愛。Homebrew-caskがインストールされていればコマンド一発。

```
$ brew cask install kobito
```
Chefに入門(2)


[前回](http://qiita.com/us10096698/items/d75a16e82cc1b511b883)の記事の続きです。パッケージをインストールしてみます。

## パッケージをインストールしてみる

[前回](http://qiita.com/us10096698/items/d75a16e82cc1b511b883)作ったレシピファイル(default.rb)に追記してパッケージ(zsh)をインストールしてみます。

```default.rb
#
# Cookbook Name:: hello
# Recipe:: default
#
# Copyright 2013, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

log "Hello, Chef!"

package "zsh" do
        action:install
end
```
実行してみます。

```Bash:
vagrant@precise64:~/chef-repo$ sudo chef-solo -c config.rb -j ./localhost.json 
Starting Chef Client, version 11.6.2
Compiling Cookbooks...
Converging 2 resources
Recipe: hello::default
  * log[Hello, Chef!] action write

  * package[zsh] action install
    - install version 4.3.17-1ubuntu1 of package zsh

Chef Client finished, 2 resources updated
```

インストールできたか確認してみます。

```Bash:
vagrant@precise64:~/chef-repo$ dpkg -l | grep zsh
ii  zsh                             4.3.17-1ubuntu1            shell with lots of features
```
できています。
ここがCentOSだろうがUbuntuだろうが同じ設定ファイルでできてしまう(Chefがプラットフォーム間の差異を吸収してくれる)ということになりますすごい。

ここで、もう一度同じコマンドを実行してみます。

```Bash:
vagrant@precise64:~/chef-repo$ sudo chef-solo -c config.rb -j ./localhost.json 
Starting Chef Client, version 11.6.2
Compiling Cookbooks...
Converging 2 resources
Recipe: hello::default
  * log[Hello, Chef!] action write

  * package[zsh] action install (up to date)
Chef Client finished, 1 resources updated
```

zshの最新版は既にインストールされているので、インストールは実行されませんし、エラーにもなりません。
複数回コマンドを発行してもコマンド発行後のサーバの状態に変化はありません。

この性質を「冪(べき)等性」と言うらしいです。
覚えておくといいみたいです！
Activerecord配列@hogesの特定カラム合計を、インスタンス変数として動的に生成したい

医療費総額と一部負担金の総額算出したいという状況で
hogesテーブルには
t.integer  "price_total"
 t.integer  "price_charged"
が含まれます。

```
class HogesController < ApplicationController
def index
    @hoges = Hoge.find(:all)
    [:price_total,:price_charged].each do |summable|
      sum=0
      @magics.each do |magic|
        sum=sum+magic[summable]
      end
      instance_variable_set('@' + summable.to_s + '_sum',sum) 
    end
ーーーー以下省略
```
#使い方
app/views/hoges/index.html.erb

```
<table>
  <tr>
    <th>請求額：<br>総額￥<%=@price_total_sum%></th>
    <th>負担金：<br>総額￥<%=@price_charged_sum%></th>
```

合計したい、合計可能なカラムがあれば [:price_total,:price_charged]にカラム名をシンボルで追加するだけで合計インスタンスが動的に量産できます。
c++11のlambdaでイベントハンドラ

jsっぽいイベントハンドラがけっこう短いコードで実現できる。

```cpp
#include <iostream>
#include <functional>
#include <string>
#include <map>
#include <vector>

using namespace std;

struct Event {
    Event(const string& name, int data)
        : name(name),
          data(data) {
    }

    string name;
    int data;
};

typedef function<bool(const Event&)> EventHandler;

int main(int argc, char **argv) {
    // set evnet queues
    vector<Event> queues;
    queues.emplace_back("hoge", 100);
    queues.emplace_back("hoge", 101);

    // set handlers
    multimap<string, EventHandler> handlers;

    handlers.emplace("hoge", [](const Event& e) {
            cout << "emit hoge event!!!" << e.data << endl;
            return true;
        });

    handlers.emplace("moge", [](const Event& e) {
            cout << "emit moge event!!!" << e.data << endl;
            return true;
        });

    // trigger 
    for (auto event : queues) {
        for (auto iter : handlers) {
            if (event.name == iter.first) {
                iter.second(event);
            }
        }
    }

    return 0;
}
```
PHPUnitでtrigger_errorをテストする

もう過去の遺物と思って避けて通りたいと常々思っているPHP旧バージョンのシステム開発。
残念ながら、古来より存在し、未だに猛威を振るうCMSを利用した開発案件が数多く存在するPHPではレガシーなコードと向き合うことは避けられない。

PHPのレガシーコードでは異常ケースを`trigger_error`を利用してハンドリングするのが定石のようですが、
このケースがモダン？なユニットテストを行う時に問題を起こすのです。

# ケース１

以下のようなコードがありました。

```php
class Hoge {
  function action($arg) {
    if (!is_int($arg)) {
      trigger_error('error message', E_USER_ERROR);
      return;
    }

    // some proc...
  }
}
```

このロジックで`$arg`が整数でないケースのテストを行いたい　といったケースを想定します。

## PHPUnitでtrigger_errorを使うとどんな問題が？？？

上記のコードをテストするために以下のようなテストコードを書きました。

```php
class Hoge_Action_Test extends PHPUnit_Framework_TestCase {
  function testArgmentIsNotInteger() {
    $hoge = new Hoge();
    $this->assertNull($hoge->action('hoge'));
  }
}
```

このテストは失敗します。
PHPUnitは発生するエラーレベルによって例外をスローするため、上記のケースでは例外が発生します。

## 発生する例外をテストできるようにする

PHPUnitはデフォルトの設定でPHPのエラーをレベル毎に例外へスローするようになっています。
`@expectedException`を利用して発生するべき例外を指定すればOKです。

```php
class Hoge_Action_Test extends PHPUnit_Framework_TestCase {
  /**
   * @expectedException PHPUnit_Framework_Error
   */
  function testArgmentIsNotInteger() {
    $hoge = new Hoge();
    $hoge->action('hoge');
  }
}
```

各エラーレベルと対応する例外は以下の通りです。
##### E_NOTICE | E_USER_NOTICE | E_STRICT
PHPUnit_Framework_Error_Notice
##### E_WARNING | E_USER_WARNING
PHPUnit_Framework_Error_Warning
##### E_DEPRECATED | E_USER_DEPRECATED
PHPUnit_Framework_Error_Deprecated
##### それ以外
PHPUnit_Framework_Error

# ケース２

ケース１のコードに`set_error_hundler()`が追加されています

```php
function shutdown($no, $str, $file, $line, $context) {
  die();
}

class Hoge {
  function __construct() {
    set_error_hundler('shutdown');
  }

  function action($arg) {
    if (!is_int($arg)) {
      trigger_error('error message', E_USER_ERROR);
      return;
    }

    // some proc...
  }
}
```

### この場合ケース１で行ったようなテストは失敗します...

PHPUnitがエラーを例外に置き換えるのは`set_error_hundler()`を利用して置き換えているのですが、
処理の実行順序が

_1.PHPUnitがエラーを例外に置換する処理を_ `set_error_hundler()` _でセット_
_2.テストコードがエラーのケースを_ `set_error_hundler()` _を利用してセット_

となり、PHPUnitがせっかく例外に置換する処理を設定してくれているのに、それを上書きするため例外がスローされなくなってしまいます。

### どうしましょう？更にset_error_hundlerを上書きしましょう！

テストコード上で更に`set_error_hundler()`を使いエラー時の処理を上書きしてしまえばテスト出来ます。

```php
class Hoge_Action_Test extends PHPUnit_Framework_TestCase {
  function testArgmentIsNotInteger() {
    $hoge = new Hoge();
    set_error_hundler(function($no, $str, $file, $line, $context) {});
    $this->assertNull($hoge->action('hoge'));
  }
}
```

インスタンスを作らずにテストする方法とかもあるらしいですが、それは検索すればわりと引っかかるので割愛…
そっちのほうがテストコード的に綺麗な気はしますけどね。

# ケース３

うわっ、テスト対象メソッドの中に`set_error_hundler()`が出てきた！！

```php
function shutdown($no, $str, $file, $line, $context) {
  die();
}

class Hoge {
  function action($arg) {
    set_error_hundler('shutdown');
    if (!is_int($arg)) {
      trigger_error('error message', E_USER_ERROR);
      return;
    }

    // some proc...
  }
}
```

### これはコードを修正しましょう

本当にこの処理は必要なのか？
`trigger_error()`を`Exception`にするとか、`set_error_hundler()`をコンストラクタ、初期処理に移動するとかを検討。
どうしても必要ならテスト時に`runkit`とか使うしかないかな...

# まとめ

CMS開発じゃなくてフルスクラッチで開発したい（泣）
Vimのスペルチェック機能を使う

###はじめに
Vim7以降限定ですがVimにはスペルチェック機能がついてます。
これは、~/.vimrc辺りで`set spell``しとくと有功になります。


```vim
set spell
```


![スクリーンショット 2013-10-19 22.27.21.png](https://qiita-image-store.s3.amazonaws.com/0/29365/dbecc3ba-da9e-7f87-f521-bb69425703bb.png)


こんな塩梅で、間違ったスペルに下線を引いてくれます。



ただしちょっと欠点があります。といいますのは・・・


![スクリーンショット 2013-10-19 22.34.00.png](https://qiita-image-store.s3.amazonaws.com/0/29365/bd5ea250-0f05-3465-94c6-03fb901f3a1e.png)


日本語が全部スペルミス扱いになって残念なことになります。

![スクリーンショット 2013-10-19 22.48.44.png](https://qiita-image-store.s3.amazonaws.com/0/29365/6a1a7eba-c757-79b6-f4c5-454817f49936.png)


あとは、ソースをコメントアウトした時もやっぱり残念なことになります。まあそんな英単語ないですからね。


###解決方法
ということで、こんな感じで~/.vimrc辺りに書いておくと幸せになれるかも知れません。
アスキーコード以外で書かれている単語と、キャメルケース、スネークケースのようなプログラムソースっぽい単語をスペルチェックの対象から外します。


<ins>(追記：10/20/2013 19:00ごろ) 
シンタックスハイライトが崩れることがあったので修正。
あと、やっぱりソースコードに訂正線を入れられることがたまにあります。動きがよく分からない。
</ins>
```vim
fun! s:SpellConf()
  redir! => syntax
  silent syntax
  redir END

  set spell

  if syntax =~? '/<comment\>'
    syntax spell default
    syntax match SpellNotAscii /\<\A\+\>/ contains=@NoSpell transparent containedin=Comment contained-
    syntax match SpellMaybeCode /\<\h\l*[_A-Z]\h\{-}\>/ contains=@NoSpell transparent containedin=Comment contained
  else
    syntax spell toplevel
    syntax match SpellNotAscii /\<\A\+\>/ contains=@NoSpell transparent
    syntax match SpellMaybeCode /\<\h\l*[_A-Z]\h\{-}\>/ contains=@NoSpell transparent
  endif

  syntax cluster Spell add=SpellNotAscii,SpellMaybeCode
endfunc

augroup spell_check
  autocmd!
  autocmd BufReadPost,BufNewFile,Syntax * call s:SpellConf()
augroup END
```

<ins>最新のVIMであれば日本語をスペルチェックの対象から外すオプションが入ったみたいです</ins>
``
shuhei
パッチが取り込まれたようで :set spelllang=en,cjk で日本語除外されるようです。
``

```vim
set spelllang=en,cjk

fun! s:SpellConf()
  redir! => syntax
  silent syntax
  redir END

  set spell

  if syntax =~? '/<comment\>'
    syntax spell default
    syntax match SpellMaybeCode /\<\h\l*[_A-Z]\h\{-}\>/ contains=@NoSpell transparent containedin=Comment contained
  else
    syntax spell toplevel
    syntax match SpellMaybeCode /\<\h\l*[_A-Z]\h\{-}\>/ contains=@NoSpell transparent
  endif

  syntax cluster Spell add=SpellNotAscii,SpellMaybeCode
endfunc

augroup spell_check
  autocmd!
  autocmd BufReadPost,BufNewFile,Syntax * call s:SpellConf()
augroup END
```

![スクリーンショット 2013-10-19 23.16.55.png](https://qiita-image-store.s3.amazonaws.com/0/29365/645f2c81-610c-4225-eaa1-7232275260fc.png)


###おまけ
![スクリーンショット 2013-10-19 23.17.30.png](https://qiita-image-store.s3.amazonaws.com/0/29365/90595f0b-05ce-d6cf-0537-78e6320c894b.png)
間違っているって言われた単語の上で``<c-x>s``を押すと修正候補を出してくれます。便利。
PowerShellでCSVファイルを書き込む

こんな感じで出来ました。

詳細
https://github.com/kurukurupapa/TryPowerShell/blob/master/Csv002_Write.ps1

```ps1
# サンプルデータ
$arr = @(
    @("1", "2", "3"),
    @("あ", "い", "う")
)

# 出力CSVファイル
$outCsvFile = "${baseDir}\TestResult\Csv002_Result.csv"

# CSVファイルを書き込む
# 文字コードはShift-JIS
$arr | %{
    New-Object PSObject -Property @{
        A = $_[0]
        B = $_[1]
        C = $_[2]
    }
} | Export-Csv -Encoding Default $outCsvFile
```
PowerShellでCSVファイルを読み込む

こんな感じで出来ました。

詳細
https://github.com/kurukurupapa/TryPowerShell/blob/master/Csv001_Read.ps1

```ps1
# CSVファイル（ヘッダあり、Shift-JIS）
$csvFile = "${baseDir}\TestData\Csv001_Data.csv"

# CSVファイルを読み込む
# PowerShell3.0では、Import-Csvの文字コード指定で、Shift-JISファイルを読み込み可能。
# PowerShell2.0だと、出来ないので、Get-Contentで使って、Shift-JISファイルを読み込み、
# ConvertFrom-Csvで、CSV→オブジェクト変換を行っています。
Get-Content $csvFile | ConvertFrom-Csv | %{
    $_ | Out-Default
}
```
ruby で if - else をつかわずにメソッド呼び出し分岐を実現する。

myFuncA(argv), myFuncB(argv)  の関数の呼び分けは、if - else を使わなくても可能である。

大量のメソッドの呼び出し分岐が必要な場合、 if - else を使った分岐では破綻しやすい。

次のコードに if - else 以外に２つの方法を示した。
1.rb

    # -*- coding: utf-8 -*-
    module Funcs
      # 配列の和を得る関数
      def myFuncA(argv)
        ans = 0
        ans = argv.inject {|ans, n| ans + n }
        puts "#{argv.join(' + ')} = #{ans}"
      end
    
      # 配列の積を得る関数
      def myFuncB(argv)
        ans = 1
        ans = argv.inject {|ans, n| ans * n }
        puts "#{argv.join(' * ')} = #{ans}"
      end
    end
    
    include Funcs
    
    name = ARGV[0]
    argv = [1, 2, 3, 4]
    
    # if - else による分岐
    if name == "myFuncA"
      Funcs::myFuncA(argv)
    elsif name == "myFuncB"
      Funcs::myFuncB(argv)
    else
      puts "error #{name}"
    end
    
    # method の呼び出し
    begin
      def callByName(name, argv)
        func = Funcs::method(name.to_sym)
        rails "undefined function" if ''.method(name.to_sym).source_location[0] != __FILE__
        func.call argv
      end
      callByName(name, argv)
    rescue => e
      puts "error #{name}"
    end
    
    # eval で評価
    begin
      eval("Funcs::#{name} [#{argv.join(',')}]")
    rescue => e
      puts "error #{name}"
    end


実行例：
 
    $ ruby 1.rb myFuncA
    1 + 2 + 3 + 4 = 10
    1 + 2 + 3 + 4 = 10
    1 + 2 + 3 + 4 = 10
    
    $ ruby 1.rb myFuncB
    1 * 2 * 3 * 4 = 24
    1 * 2 * 3 * 4 = 24
    1 * 2 * 3 * 4 = 24
    
    $ ruby 1.rb myFuncC
    error myFuncC
    error myFuncC
    error myFuncC
イテレータの回し方

今までイテレータ回す時

```cpp
for (std::vector<int>::iterator it = v.begin() ; it < v.end(); ++it) {
  // hogefuga
}
```

って書いてたけど

```cpp
for (std::vector<int>::iterator it = v.begin() ; it != v.end(); ++it) {
  // hogefuga
}
```

なんですね。itがv.end()以下かではなくて、itがv.end()ではないかで判断すべき。
もっと簡単に書く方法もあって、

```cpp
for (auto it = v.begin(); it != v.end(); ++it) {
  // hogefuga
}
```

こんな感じでautoを使うと便利。このときconstはどうなるんだろう。ブロック内で変更がなければ自動的にconstつけてくれたりするんだろうか。そこまではしないか。
Python3をさくらサーバー(FreeBSD)にインストール


#1.Python3のインストール
***
```Bash:Bash
mkdir ~/local
mkdir ~/local/src

cd ~/local/src
wget http://python.org/ftp/python/3.3.1/Python-3.3.2.tar.bz2
tar -xjf Python-3.3.2.tar.bz2
cd Python-3.3.2
./configure --prefix=$HOME/local/python/
make && make install
```

#2. ~/.cshrcの書き加え
***
```Bash:Bash
cd
vi ~/.cshrc
```

```Bash:vi
#以下を追加
set path = ($HOME/local/python/bin)
setenv PYTHON $HOME/local/python/lib
```

書き加えることで、"python3"とコマンド入力するだけで、python3のインタプリタが起動する。

##参考にしたサイト
http://www.mihr.net/comp/sakura.html
PowerShellでExcelファイルを作成してみる

次のような感じで、Excelファイルを作成できました。

詳細は、GitHubを参照。
https://github.com/kurukurupapa/TryPowerShell/blob/master/Excel002_Write.ps1

```ps1
# Excel2000-2003形式
$xlExcel8 = 56

# Excelを起動する
$excel = New-Object -ComObject Excel.Application

# 新規ブックを開く
$excel.Workbooks.Add() | %{
    # 新規ワークシート
    $_.Worksheets.Item(1) |  %{
        # セルに値を書き込む
        # セルのインデックスは1始まり
        $_.Cells.Item(1, 1) = "A1"
        $_.Cells.Item(1, 2) = "B1"
        $_.Cells.Item(2, 1) = "A2"
        $_.Cells.Item(2, 2) = "B2"
    }
    
    # ブックを保存する
    $_.SaveAs("${baseDir}\TestData\Excel002_Result.xls", $xlExcel8)
}

# Excelを終了する
$excel.Quit()
[System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($excel) | Out-Null
```
tmlib-rpg キャラクターの作成（２） rpg.Character / rpg.SpriteCharacter

素材（Asset）の定義ができたので、それを使って、歩行アニメーションとかもろもろを実装中。

使い方は以下のような感じ。

```coffeescript
tm.define 'MainScene',
  superClass: rpg.SceneBase

  init: ->
    # 親の初期化
    @superInit()

    @characters = [
      new rpg.Character()
      new rpg.Character()
      new rpg.Character()
      new rpg.Character()
    ]
    rpg.SpriteCharacter(c).addChildTo(@) for c in @characters

    @characters[0].moveTo(5,5).direction = 'left'
    @characters[1].moveTo(6,5).direction = 'right'
    @characters[2].moveTo(7,5).direction = 'up'
    @characters[3].moveTo(8,5).direction = 'down'
```

![ss20131019a.png](https://qiita-image-store.s3.amazonaws.com/0/30417/a84ed70c-62f2-cd3e-d8a1-5e994ee8b301.png)

new 演算子を使ってるのは、内部のクラスは、tmlib を使ってないから…
せっかく CoffeeScript を使うようになったし内部クラスは、依存性を低めに…

rpg.SpriteCharacter が参照している rpg.Character クラスを変更すると、それを監視して、表示される。

裏でいろいろデータを変更して、表示時にそれをすべて反映させるために的な？
もともとRGSSがこう言う作りってのもあるけど、処理が分離されてて、良いと思う。

RPGのイベントとか、町の人とかの移動ルート設定関連は、内部で全部解決という感じにできるはず…
あとは、マップを作成して、表示領域にも対応しないとスクロールとかとか。まだまだつくるものいっぱい。

ついでに、grunt でテストをするようにしました。

参考にしたのは、こちら
[Mocha + Chai で CoffeeScript を Grunt で自動テスト](http://qiita.com/astronaughts/items/483e04ac27bf8edde210 "Qiita")



direction はプロパティにしたけど、setDirection(...) とかあったほうが、チェーンできて良いかも？
両方つくればいいのかな。あまり用意すると混乱しそうだけど…
setter/getterがプロパティ対応で作れるので面白いと思うけど、混乱の元な気がしないでもない
便利なんだけど。
プロパティで作れるから、さらに set/get 系のメソッドは作りたくないって感じも～
へふ～
Mac OS Xでquine relayを実行する方法(2013/10 Ver)


# 結論

Vagrant使いましょう。

https://github.com/mame/quine-relay/wiki/Installation#vagrant
に基本的な構築方法が書いてあるのでこれに従えば良いです。

# Homebrewではなぜダメなのか

さっきの本家のInstallationの項目にもHomebrewでできるぜ、と[Forkされたリポジトリ](https://github.com/sxua/quine-relay
)が紹介されているのですが、自分の環境ではいくつか入れられない物がありました。

具体的には、Clojure, Logo, Intercalが辛かったです。

## Clojure

元々は、ClojureはHomebrewで入れてね、と書いてあります。

```
brew install clojure
```

でも、少し前にHomebrewでは[clojureが廃止されてleiningenに移行しろ](https://github.com/mxcl/homebrew/pull/21733)ってことみたいです。
なので、[lein-exec](https://github.com/kumarshantanu/lein-exec
)をいれれば、

```
brew install leiningen
echo "{:user {:plugins [[lein-exec "0.3.1"]]}}" > ~/.lein/profiles.clj
```

```
lein exec QR.clj > QR.cob
```
で実行できるのですが、面倒。

## Intercal
configureでこけました。

```sh
$ brew install intercal
==> Downloading http://overload.intercal.org.uk/c/intercal-0.29.pax.gz
Already downloaded: /Library/Caches/Homebrew/intercal-0.29.pax.gz
==> ./configure --prefix=/usr/local/Cellar/intercal/0.29.pax
Failed to execute: ./configure

READ THIS: https://github.com/mxcl/homebrew/wiki/troubleshooting
```

## Logo
makeでこけました。
このへんで追うのが辛くなってきたので、vagrantに頼ることに。

## まとめ
やっぱり、Ubuntuのaptは楽だなー。
生年月日から年齢を計算

元ネタ：[みんなのちからになりたい](http://ginzanomama.hatenablog.com/entry/2013/02/19/173312 "みんなのちからになりたい")

####公式：(今日の日付-誕生日)/10000の小数点以下切捨て。

```
[1] pry(main)> require "date"
=> true
[2] pry(main)> d1 = Date.new(1980, 1, 1).strftime("%Y%m%d").to_i
=> 19800101
[3] pry(main)> d2 = Date.today.strftime("%Y%m%d").to_i
=> 20130219
[4] pry(main)> (d2 - d1) / 10000
=> 33
```

例えば生年月日がDBに格納されているPersonクラスで

```
class Person < ActiveRecord::Base
  attr_accessible :birthdate
  def age
    d1=self.birthdate.strftime("%Y%m%d").to_i
    d2=Date.today.strftime("%Y%m%d").to_i
    return (d2 - d1) / 10000
  end
end
```

#使い方
person=Person.find(:first)
person.age
jQueryMobileでポップアップをJSから呼びたい時。さらにposition-to:'origin'を実現したい時。

https://github.com/jquery/jquery-mobile/issues/4913
を見てやると例えば下記のような感じでいける。
※ vclickイベントはダブルタップ判定をしないので待ち時間無くポップアップが作動する。

```js
        $action.bind('vclick', function(event){
            $popup.popup('open', {
                transition: 'pop',
                positionTo: event.target
            });
        });
```
PowerShellでExcelファイルを読み込んでみる

2022/5/3
当記事の内容をもっと詳しくしてみました。よろしければご参照ください。
[PowerShellでExcelファイルをCSV形式に変換する - Qiita](https://qiita.com/kurukurupapa@github/items/f0900ebf717e860c6ea4)

---
次のような感じで、Excelファイルを読み込めました。

詳細は、GitHubを参照。
https://github.com/kurukurupapa/TryPowerShell/blob/master/Excel001_Read.ps1

```powershell
# Excelを起動する
$excel = New-Object -ComObject Excel.Application

# ブックを開く
$excel.Workbooks.Open("${baseDir}\TestData\Excel001_Data.xls") | %{
    # シートを読み込み
    $_.Worksheets | %{
        # 行を読み込む
        $_.UsedRange.Rows | %{
            # 列を読み込む
            $_.Columns | %{
                Write-Output $_.Text
            }
        }
    }
}

# Excelを終了する
$excel.Quit()
[System.Runtime.InteropServices.Marshal]::FinalReleaseComObject($excel) | Out-Null
```
compass の設定にある javascripts_dir って何のためにあんの？

Compassで何故か自動的にjavascript をフォルダ作られるけど、そういえばこれ使ったことねーな、と思ってたら js と絡めた拡張を書くことができるそうだ。
https://groups.google.com/forum/#!topic/compass-users/rjAntZ8RZgs


例えば compass の jquery 拡張がこれ。
https://github.com/kosmas58/compass-jquery-plugin/tree/master/templates

使い方はわかりません。

css だけだと実現が難しい時に js を使うことはよくあるので、何か簡単なチュートリアルでもあれば爆発的に広まりそうだな。
メールでRedmineにチケットを作る時に、メール本文のキーワードを残したい


メールでRedmineにチケット登録する際は、

- プロジェクト識別子
- トラッカー
- カスタムフィールド

に相当するメール本文のキーワードが、『除外』された形でチケットの本文（詳細）に登録されます。
なので、キーワードが多いと、『詳細』部分はちょっと歯抜けな感じの文面になってしまいます。

## キーワードを残したい場合

redmine/app/models/mail_handler.rb の、extract_keyword メソッドの一カ所をコメントアウトすれば大丈夫です。

```
  # Returns nil if no matching keyword found
  def extract_keyword!(text, attr, format=nil)
    #… 省略  …
    regexp = /^(#{keys.join('|')})[ \t]*:[ \t]*(#{format})\s*$/i
    if m = text.match(regexp)
      keyword = m[2].strip
      # キーワードを残したい場合、ここをコメントアウト
      #text.gsub!(regexp, '')
    end
    keyword
  end
```
＃実測に基づく結果です…。
Chef の not_if についてのメモ

Chef を使っていると、not_if を使うケースが多くなると思います。
not_if の条件や、オプションについて備忘録を残したくなったので投稿します。

すべて、次のページに書いてある内容です。
http://docs.opscode.com/resource_template.html

まずは、ある特定のファイルがないときに command execute したいときの書き方。基本的な書き方ですね。

```rb
execute "aaa" do
  command "git clone https://github.com/aaa"
  not_if { File.exists?("/home/vagrant/aaa") }
end
```

次に、template です。template にも not_if 渡せること知りませんでした。(勉強不足)
また、not_if で grep 渡せること知りませんでした。(これも勉強不足)

environment で環境変数をハッシュで渡せるっていうの、ずっと知りませんでした。
これ知っていたらあちこちでもっと楽できたような気がする…

```rb
template ".bash_profile" do
  source ".bash_profile.erb"
  path   "/home/vagrant/.bash_profile"
  mode   0644
  owner  "vagrant"
  group  "vagrant"
  not_if "grep aaa ~/.bash_profile", :environment => { :'HOME' => "/home/vagrant" }
end
```
GOPATH は適当に決めて問題ない

# TL;DR

- `go get` は Ruby でいう `gem` みたいなもん
- `$GOPATH` は自分の環境に合わせて好きに指定してよい
    - 例えば `$HOME/.go` とか `$HOME/go` とか
- 好きに設定してもいいけど、一度設定したらそれをずっと使い続けた方がたぶんいい

現在では、GOPATHを明示的に設定しない場合は自動的に設定される。
[Wiki](https://github.com/golang/go/wiki/SettingGOPATH)より
>If no GOPATH is set, it is assumed to be $HOME/go on Unix systems and %USERPROFILE%\go on Windows. 


# ことの始まり

homebrewでGoをインストールしたらのっけから

> Go 1.1 から `go get` コマンドは `$GOROOT` をパッケージダウンロード先として使わなくなりなりました。
> `go get` 使うには `$GOPATH` が必要です。

と言われて、間違った設定をしてあとで苦労したくなかったので色々と調べた。

## go get コマンド

```
% go help get
```

> 使い方: go get [-d] [-fix] [-u] [build flags] [packages]
>
> パッケージ（依存するものも）をダウンロードしてインストールする。
>
> -d フラグがあるとダウンロードだけでインストールしない。
> -fix フラグは fix tool をダウンロードしたパッケージの依存関係を解消する前に実行する。（詳しくは `godoc fix` を見れば分かるらしい。）
> -u フラグがあるとパッケージとその依存パッケージをアップデートする。
>
> build flagsは `go build` と `go install` のフラグを指定する。
>
> パッケージを確認するとき `get` はローカルにインストールされている Go のバージョンと適合するブランチやタグを探す。最も重要なルールは、ローカルで走っているのが "go1" だったとすると、 `get` は "go1" という名前のブランチとタグを探すということ。もしそういうバージョンが無かったら、最新のものを取ってくる。
>
> パッケージの指定の仕方については `go help packages` を見る。
>
> どうやってソースコードを見つけるかは `go help remote` を見る。

## GOPATH

```
% go help gopath
```

> Goパスは import 文の解決に使われる。go/build パッケージで実装されている。
>
> 環境変数 GOPATH は Go コードを探す場所を表す。（PATH みたいな感じ）
> Unix の場合はコロンで区切る。
> Windows の場合はセミコロンで区切る。
> Plan 9だとリスト。
>
> GOPATH は標準の Go の外でパッケージをビルドしたりインストールする際に設定されていなければならない。
>
> GOPATH に入っているディレクトリはそれぞれ決められた構造を持っていなければならない:
>
> （詳しくは割愛）
>
> 例:
> 
> ```
> GOPATH=/home/user/gocode
> 
> /home/user/gocode/
>     src/
>         foo/
>             bar/               (go code in package bar)
>                 x.go
>             quux/              (go code in package main)
>                 y.go
>     bin/
>         quux                   (installed command)
>     pkg/
>         linux_amd64/
>             foo/
>                 bar.a          (installed package object)
> ```
> 
> Go は GOPATH の各ディレクトリからソースコードを探すが、ダウンロードしたファイルは常に GOPATH の中で一番最初のディレクトリにインストールされる。

## 結局どうすればいいのか

GOPATH は決まった場所を指定するものではなく、自分の環境で好きな場所を勝手に指定すればよい、という性質のものらしい。つまり、正しい場所を指定しておかないと Go が使えないとかそういった性質のものではない（それを恐れていた）、と。

インターネットを観測した感じだと

- `$HOME/go`
- `$HOME/.go`

あたりを設定している人が多い印象。設定は `.bashrc` や `.zshrc` で行う。

```bash:~/.bashrc
export GOPATH=$HOME/.go
```
qiita.elで専用バッファを作ってそこから投稿するようにしてみた




[Qiita.el](https://github.com/gongo/qiita-el/blob/master/README.org)

投稿するときにファイルを作成したり、新規にバッファを作ったりするのが
面倒だったので、qiita:newを実行すると自動的にバッファが作成されるように
してみた。

```Lisp
;;;###autoload
(defun qiita:new (&optional entry)
  "Open a buffer for a Qiita entry."
  (interactive)
  (switch-to-buffer (qiita:new-noselect entry)))

;;;###autoload
(defun qiita:new-noselect (&optional entry buf)
  "Open a buffer for a Qiita entry without selecting the buffer."
  (interactive)
  (let* ((title " Title")
         (content "")
         (buf (get-buffer-create qiita->new-post-buffer)))
    (with-current-buffer buf
      ;; initialize
      (erase-buffer)
      (insert (format "# %s\n\n" title))
      (insert content)
      (unless (= (char-before (point)) ?\n) (insert "\n"))
      (markdown-mode)
      (goto-char (point-min))
      (setq buffer-undo-list nil)
      (set-buffer-modified-p nil))
    buf))
```
jqコマンドとcurlコマンドを組み合わせてみよう





```
curl -X POST https://qiita.com/api/v1/auth\?url_name\=ユーザー名\&password\=パスワード | jq .
```

```json
{
  "token": トークン,
  "url_name": ユーザー名
}
```
MacにrvmとRuby 2.0.0 安定板をインストールする

rvmは、異なるRubyのバージョンを共存させて使い分けることができるらしいので、Rubyの管理はrvmですることにします。gemからも、githubからもインストールできるみたいですが、公式サイトからrvmをインストール方法をメモしておきます。xcodeが事前にインストール必要だとかないとか？（ちょっとよくわらかない。ボクはインストールしてたのでそこらへん気にしなかった）

## rvmのインストール

 [rvmのサイト](https://rvm.io/rvm/install)を参考にインストール。

```
curl -L get.rvm.io | bash -s stable
```

インストールが完了したら、以下の行を .bashrc に追記します。
※ ~/ 直下の「.rvm」に作成されたスクリプトを読み込む設定です

```
# RVM
[ -s ${HOME}/.rvm/scripts/rvm ] && source ${HOME}/.rvm/scripts/rvm
```

.bashrcを再度読み込ませます。

```
$ source ~/.bash_profile
```

rvmを最新にします

```
rvm get head
rvm get latest
```

## Ruby2.0.0のインストール

以下のコマンドでインストール（できるはず）

```
rvm install 2.0.0
```

最後に確認

```
$ ruby -v
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.3.0]
```
iOS7になったら.sqliteのファイルが見れなくなってしまった

iOS7になったらSQLITEの仕様が変更になったらしく、シュミレーターに保存してあったsqliteファイルのデータをSQLite Database Browserで見られなくなってしまった。

こちらに回答が載っていたのでそのまま実施。
http://stackoverflow.com/questions/18870387/core-data-and-ios-7-different-behavior-of-persistent-store
どうやらiOS7からはWALモードになったらしい。SQLite Database BrowserだとWALモードは見れないのだと思う。(あんまりわかってない。)


リンク先の回答者はWALを推奨していたけど、プロトタイプの状態ではデータベースが見られないと不便なので、一時的に変更する。
具体的なコードは以下。

```objc
NSDictionary *options = @{NSSQLitePragmasOption: @{@"journal_mode": @"DELETE"}};
```
このoptionsをaddPersistentStoreWithType:configuration:url:options:errorのoptionに指定するだけ。
これで以前のジャーナルモードに戻るらしい。
以上でSQLite Database BrowserでSQLiteのデータが見られるようになった。
Node のプロジェクトで、依存モジュールのアップデートを行う

Node のプロジェクトで依存モジュールのアップデートをしたときに、[npm-check-updates](https://github.com/tjunnone/npm-check-updates) を使ったら、便利だったので、メモ。

~~~sh
$ npm install -g npm-check-updates
~~~

で、インストールできる。

`npm-check-updates` のコマンドを打つと、

~~~sh
$ npm-check-updates
...
Dependency "lodash" could be updated to ~2.2.1.
Dependency "mocha" could be updated to ~1.13.0
Dependency "chai" could be updated to ~1.8.1
Dependency "sinon" could be updated to ~1.7.3
Run 'npm-check-updates -u' to upgrade your package.json automatically
~~~

こんな感じで、依存モジュールのアップデートが確認できる。

`npm-check-updates -u` とオプションを付けると、`package.json` の依存モジュールのバージョンをいい感じに変更してくれたりもする。
prawn で生成する PDF にパスワードを付ける

http://t-taira.hatenablog.com/entry/20100116/1263667269 の記事そのままですが、
自分用のメモとして。

```ruby:pdf_with_encryption.rb
# coding: utf-8
require 'prawn'
require 'prawn/security'
 
pdf = Prawn::Document.new
 
pdf.text "Hello, world"
pdf.encrypt_document :permissions => {
  :print_document => true,
  :modify_contents => false,
  :modify_contents => false,
  :copy_contents   => true,
  :modify_annotations => false,
},
  :user_password => 'xxxxxxxxxx',
  :owner_password => :random
 
pdf.render_file("ps.pdf")
```
Mac に matplotlib をインストールする手順


```bash
brew install freetype
brew install libpng

sudo easy_install pip 
sudo pip install matplotlib
```

以下のワンライナー実行して、パイチャートが別ウインドウで表示されたらインストールできてる。

```bash
python -c 'import matplotlib.pyplot as pyplot; pyplot.pie([1,2,3]); pyplot.show()'
```