OmniAICreator/Qiita-1.07M huggingface dataset:
DeflaterやInflaterを使うときに注意すること

Deflate操作時に使用するjavaの標準ライブラリである[java.util.zip.Deflater](http://docs.oracle.com/javase/jp/6/api/java/util/zip/Deflater.html "Javadoc")と[java.util.zip.Inflater](http://docs.oracle.com/javase/jp/6/api/java/util/zip/Inflater.html "Javadoc")はJNIで単にzlibを呼んでいるだけなので(少なくともOracle JRE/OpenJDKの場合)、newのタイミングでJVMの管理外の領域に少なくとも辞書窓サイズ分のメモリを確保する。Deflateの辞書窓サイズはだいたい32KiBぐらいある。
次のコードはJVMには大した影響を与えないが、あっさりJVMの外のシステムのメモリを枯渇させるだろう。

```java:DeflateSample.java
public class DeflateSample {
  public static void main(String... args) {
    for (;;) {
      new java.util.zip.Deflater();
    }
  }
}
```

##対応
使い捨てでDeflater/Inflaterを使う場合は必ず`end()`を呼ぶ。または使い捨てず、可能な限り`reset()`して使いまわすようにする。

`finalize()`が`end()`を呼び出しているので、GCが走れば解決はする。したがって`end()`しなかったとしても完全なメモリリークにはならない。
しかしDeflaterがJVM内部で必要とするメモリサイズに比べ、JVM外部で消費するメモリサイズのほうが圧倒的に大きいので、システムメモリが枯渇するより先にJVMのメモリが尽きてGCが走るだろうと思うのは幻想である。

なお、GZIPOutputStreamとGZIPInputStreamは内部でDeflater/Inflaterを生成しており、`close()`するまで`end()`を呼ばないので、必ず`close()`しよう。

###おまけ
恐ろしいことにJavadoc上の`end()`の重要性はかなり曖昧だ。「実装の問題」ということなんだろうか。おかげでこの問題は自力で引き当てるまでなかなか気が付かない。
フォルダ内の特定の文字コードのファイルを別の文字コードに変換する

無駄に複雑にやってみる．

```
ls | xargs nkf -g | grep <変換前の文字コード> | sed -e 's/:.*$//g' | xargs nkf <変換後の文字コードに対応するオプション> --overwrite
```

1.lsを使ってフォルダ内の全ファイル名をリストアップ
2.xargsを使って全てのファイルにnkf -gを適用
3.grepを使って変換前の文字コードのファイルだけ残してフィルタリング
4.sedを使って元のファイル名に変換
5.xargsを使って見つかったファイル全てを指定の文字コードに変換する．

1.2はxargs使わなくてもnkf -g *で行けるけど，lsとxargsとかfindとxargsは割と役に立つので備忘録代わりに記載しとく．
シェルスクリプトでCGI



```apache:
<Directory "/var/www/html/shell/">
    AddHandler cgi-script .sh
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
</Directory>
```
Directoryは、適宜良い感じに指定する

```bash:
#!/bin/sh

echo -ne "Content-Type: text/html; charset=UTF-8\r\n\r\n"

cat <<EOT
<html>
	<body>
`echo hello`
	</body>
</html>
EOT

#END
```
confファイルで指定したディレクトリに配置する。
スクリプトに実行権限付けるのを忘れずに。
node.js × sqlite3で作るCRUDアプリケーション

ブログに書いたよ。
<a href="http://d.hatena.ne.jp/replication/20130609/1370708554">node.js × sqlite3でCRUDアプリケーションを作ってみたよ。 - 大人になったら肺呼吸</a> <a href="http://b.hatena.ne.jp/entry/d.hatena.ne.jp/replication/20130609/1370708554"><img src="http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/replication/20130609/1370708554" alt="はてなブックマーク - node.js × sqlite3でCRUDアプリケーションを作ってみたよ。 - 大人になったら肺呼吸" border="0" /></a>
SinatraアプリケーションをサブURLで動かすためのRack::URLMap


あるSinatraアプリケーションが `http://localhost:9292/` で動いている。`config.ru`は以下のような設定。

```ruby:config.ru
require './app'
run Sinatra::Application
```

これを `http://localhost.:9292/sub` で動かしたい、そんな時は **Rack::URLMap** を使う。

```ruby:config.ru
require './app'
run Rack::URLMap.new("/sub" => Sinatra::Application)
```

WebアプリのサブURL対応を行う時の実験環境に便利です。
Markdown用のリンクを作るブックマークレット

Qiitaの記事を書いていてよく使うので残しておきます。

読みやすい版

```javascript
javascript:(function() {
  prompt('Copy to clipboard',
    '[' + document.title.replace(/([\[\]])/g,'\\$1') + ']' + '(' + location.href + ')');
})();
```

一行版

```javascript
javascript:(function(){prompt('Copy to Clipboard','['+document.title.replace(/([\[\]])/g,'\\$1')+']'+'('+location.href+')');})();
```
一応こだわった点としては、`document.title.replace(/([\[\]])/g,'\\$1')`として`[]`をエスケープしたところです。こうしないとタイトルに`[]`が含まれるページのリンクがおかしくなります。

まあ、こんなものでも意外と役に立つのでぜひ（既に自作してるかもしれませんが）
`heroku push origin master` でPermission deniedエラー


なぜか突然`push`できなくなって困った。
```
$ git push heroku master
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

解決策ここに乗ってた。
[ruby on rails - git push heroku master permission denied - Stack Overflow](http://stackoverflow.com/questions/14342553/git-push-heroku-master-permission-denied)

から

[Managing Your SSH Keys | Heroku Dev Center](https://devcenter.heroku.com/articles/keys)

```
$ heroku keys:add
```

すると、このような結果になり、
`git push heroku master`も成功。
なんだったんだ…

```
$ heroku keys:add
Found the following SSH public keys:
1) id_dsa.pub
2) id_rsa.pub
Which would you like to use with your Heroku account? 2
Uploading SSH public key /Users/~/.ssh/id_rsa.pub... done
$ git push heroku master
Counting objects: 27, done.
```



ちなみに、なぜか`heroku keys:add`でエラーがでた。
でも再トライしたら、２度目は成功した。なんなんだろー。

```
$ heroku keys:add 2
Uploading SSH public key 2... failed
 !    Could not upload SSH public key: key file '2' does not exist
```
mrubyのminirakeで自作のbinファイルを作成する

どこでもいいので(いいはず) 以下のようなフォルダ構成を作成

```text:
# mhogeというbinファイルを作りたい場合
+- mruby-bin-hoge #=> ディレクトリ名はmrbgems.rake内の設定と一致させる(後述)
    +- tools
    |  +- mhoge #=> ディレクトリ名はmrbgems.rake内の設定と一致させる(後述)
    |     |
    |     +- mhoge.c
    |
    +-mrbgem.rake
```

上記フォルダ構成だとして mrbgem.rakeを以下のように記述する

```rb:mrbgem.rake
# Specification.new(自作binルートディレクトリ名) とすること
# spec.bins = %w(tools下ディレクトリ名) とすること
MRuby::Gem::Specification.new('mruby-bin-hoge') do |spec|
  spec.license = 'MIT' #=> 自分の規定したライセンスにする?
  spec.authors = '@bamchoh' #=> 作者の名前を記載する?
  spec.bins = %w(mhoge)
end
```

最後に mrubyフォルダの直下にある build_config.rb に ビルドしたいファイルのパスを記載する

```rb:build_config.rb
# 以下の記載を MRuby::Build.new のブロック内に記載する
conf.gem 'mrbgems/mruby-bin-hoge' #=> mrbgems下にあるとした場合の指定の仕方
```

上記の設定の後、mrubyフォルダ直下でmake すると binフォルダ下にmhogeができているはず!!

have fun!
master にマージ済みのローカルで作成したブランチを削除する && alias をつくる


@uu59 先輩に教えていただいたのをメモ

```sh
$ git branch --merged origin/master | grep -v master | xargs -n1 -t git branch -d
```

`xargs` の `-n1` は１つずつ実行で、`t` は実行コマンドの出力

git で shell コマンドを alias にするには、先頭に `!` をつける

```config
[alias]
cleanb = !git branch --merged origin/master | grep -v master | xargs -n1 -t git branch -d
```

便利！

---

ついでにリモートブランチの削除は 

```sh
$ git remote prune [remote]
```
Find bug fix (C++)

#include<iostream>
using namespace std; 
/*
int main(){
	printf("Hello world\n");
	return 0;	
}
*/

//Example #3 (C++ code): What is the bug and why is it a problem?
const char* append(const char* s1, const char* s2) {
  string s(s1);
  s += s2;
  return s.c_str();
}

void foo() {
  const char* total = append("abc", "def");
}
/*
//Example #4 (C++ code): What is the bug and why is it a problem?
void erase(list<int> &l, int v) {  
  list<int>::iterator i = l.begin();  
  for(; i != l.end(); ++i) {
    if(*i == v)      
      l.erase(i);  
  }
}

//Example #11 (C++ code): What is the bug and why is it a problem?
class Base {
public:
  int x;
};

class Derived : public Base {
public:
  int y;
};

void init(Base *b) {
  for( int i = 0; i < 3; ++i) {
    b[i].x = 0;
  }
}

void foo() { 
  Derived arr[3];
  init(arr);
}
*/
Find bug test

```c
#include <stdlib.h>
#include <stdio.h>

//Example #1 (C code): What is the bug and why is it a problem? 
/* 配列a[10]の宣言位置に問題がある。繰り返しの値を受けるためにはbuggy内で宣言しなければならない
int a[10];         //a配列宣言	
void buggy() {     //関数の宣言
	int i;         //i変数宣言
	for(i = 0; i < 10; i++);{  //iが10未満の時1ずつ足していく
    a[i] = 0;   //0をiに入れていく。？？？**
  }
}

int main(void){
	int i;
	int a[10];	
	for( i = 0; i < 10 ; i++){
		a[i] = i;
	printf("iの値は%2dです ",i);
	printf("aの値は%2dです\n",a[i]);
	}
	return 0;
}
*/

//Example #2 (C code): What is the bug and why is it a problem?
//l_lengthのwhileを抜ける条件が正しく定義されていない。
/*

int main(void){
int my_crazy_calc(int area, int length, int width) {
  int l_length = length;
  while (l_length) {
    area += length * width;
    length--;
  }
	return area;
	}
return 0;
}
int main(void){
	int my_crazy_cal(
	int area = 1;
	int length = 2;
	int width = 3;
	int l_length = length;
		while(l_length){area += length * width;
			length--;
		
		//return area;
		}
	printf("length is %d\n", length);
	printf("l_length is %d\n", l_length);
 return 0;	
}
*/

//Example #6 (C code): What is the bug and why is it a problem?
// バグではないが#include<string.h> が必ず必要
// 最初の”が全角。"を使用しなければいけない。
// 0を返すのではなく'\0' strncpy関数は文字列の最後にNullを付け加える必要がある。
/*
		char * PrintMe() {
  char str[12];
  strncpy (str, ”hello world", 11);
  str[11] = 0;
  return str;
	}
*/
		
//Example #7 (C code): What is the bug and why is it a problem?
//

struct my_struct { int val; };
int my_func( struct my_struct *ptr, int x, int y)  {
  int z = 0; 
  if((ptr != NULL) && (x < y) || (ptr->val > 0)) {
    z = x + y - ptr->val;
  }
  return z; 
} 


//Example #9 (C code): What is the bug and why is it a problem?
//i=10となったとき、配列の領域(11番目)が確保できないためエラーとなる
/*配列の要素数を増やすor whileの条件をi < 9にする等
int main(void){
void foo(int x[10]) {
  int i = 0;
  do { 
    x[i] = i++; 
  } while( i < 10 );
}
*/
//Example #10 (C code): What is the bug and why is it a problem?
/*
int foo(int in) {
  int *buf1 = (int *)malloc(1000*sizeof(int));
  if(!buf1) return -1;
  int *buf2 = (int *)malloc(2000*sizeof(int));
  if(!buf2) return -1;

  int retVal = process(in,buf1,buf2);

  free(buf1);
  free(buf2);

  return retVal;
}

*/
```
MacOSXでTizenSDKをインストールできない場合

https://developer.tizen.org/downloads/tizen-sdk
からダウンロードしたInstall Managerを利用してTizen SDKをインストールしようとするものの、ダウンロードしたイメージからTizen_SDK_Install.appをクリックした時に、下記のようなメッセージが出てしまう。ダウンロードし直してみてもダメだった。
![broken.jpg](https://qiita-image-store.s3.amazonaws.com/0/3882/7d36d16a-7193-dad3-4c1f-1e18c84e3507.jpeg)

https://developer.tizen.org/forums/sdk-ide/failed-install-sdk-2.1-on-mac-os-x-moutain-lion
によると、

> Your system will not allow the application to run due to tight security. To open up the security, try this:
1. Go to System Preferences...
2. Click on Security & Privacy
3. On the General tab change "Allow applications downloaded from:" to "Anywhere".
> 
> Try to open the DMG file again.

適当な訳：
システムがキツイセキュリティの為にアプリケーションを起動する事を許さないのでしょう。セキュリティを広げるのに、これを試してみて：
1. システム環境設定を開く
2. セキュリティとプライバシーをクリックする
3. 一般のタブで「ダウンロードしたアプリケーションの実行許可」を「全てのアプリケーションを許可」にする

下記の所を「全てのアプリケーションを許可」に変更して改めて実行。事なきを得た。
![security.jpg](https://qiita-image-store.s3.amazonaws.com/0/3882/a4679662-2650-b298-2b3d-4211637ea814.jpeg)

※セキュリティーの設定を広げたのを戻すのを忘れないようにしましょう。
PODをgithubのトップページに表示させる方法

GithubにPerlのモジュールをアップロードする時、
README.podという名前でシンボリックリンクをトップディレクトリに置いておくと、
エイリアスを貼った先のモジュールのPODをREADMEとして表示してくれるそうです。

```bash:
$ ln -s lib/Test/More/Hooks.pm README.pod
```
こんな感じに。
https://github.com/ainame/p5-Test-More-Hooks

参考
https://github.com/github/markup#readme
JSのまともな開発環境を構築するメモ


現在進行形です。JSフレームワークとかライブラリの名前は聞いたことあるけどよく分かんないしどう使うのかも分かりません！っていう状態だけどまともな環境で開発したいのでいろいろメモしていきます。

とりあえずの目的としては

* Unitテスト書こう
* 素のJSで書くのはやめよう

ということで、TypeScript + Jasmine をとりあえずの目標として。


### typescript

TypeScriptはnpmで入れれる。npmを使うにはnode.jsが必要なのでHomebrewでnodejsを入れる。

```
brew install nodejs
npm install -g typescript
```

とかそんな感じで。
tscでコンパイルしてくれます。

```
tsc -w hoge.ts
```

とかしておくと変更を検知してコンパイルしてくれます。が、俺はPhpStormを使ってるのでwatchしてもらってます。

-

### PhantomJS
Wikiを参考に入れる。
https://github.com/ariya/phantomjs/wiki

phantomjsにPATHを通してこんなJSを呼ぶと実行してくれる

```javascript:hello.js
console.log('Hello, World');
phantom.exit();
```

phantom.exit()は呼び出し忘れないように。
というWebKitベースで画面描画しないから高速に動かしてテストさせるツールって感じかな。

-

### Jasmine
https://github.com/pivotal/jasmine

wiki見れば書いてる。
TDDで回すならいちいちブラウザで確認したくは無いので、Consoleで実行出来るようにしたい。のでGitでcloneしておく。

consoleで動かすには、ランナーのHTMLで
lib/jasmine-1.3.1/jasmine-html.js の代わりに
ConsoleReporter.js を読み込むようにする。


-
### 大変お世話になったサイト
http://y-anz-m.blogspot.jp/2012/12/typescript_12.html
yumで削除してはいけないパッケージを保護する

# 紹介
CentOS6.x系のyumは誤って必要なパッケージを削除しないように、yum.confのprotected_packagesオプションでパッケージを保護することが可能になりました。

なお、削除してはいけないことで有名なPythonですが、CentOS6系ではデフォルトでyumパッケージは保護されているため、yumパッケージが依存しているPythonも削除できません。

***
# 設定方法
ここでは例として`vim-enhanced`パッケージを保護します。

yum.confに直接記述しても有効ですが、`/etc/yum/protected.d/*.conf`ファイルも自動的に読み込んでくれます。
構成管理ツールで管理する場合は後者のほうが都合がよいと思いますので、今回は後者の方法で設定します。

## 設定例
下記のようにprotected_packagesだけ指定した設定ファイルを作成します。

```text:/etc/yum/protected.d/vim-enhanced.conf
protected_packages = vim-enhanced
```

## 実行例
あとは実際に`yum erase`してみましょう。


```text:
% sudo yum erase vim-enhanced          
Loaded plugins: fastestmirror, refresh-packagekit, security
Setting up Remove Process
Resolving Dependencies
--> Running transaction check
---> Package vim-enhanced.x86_64 2:7.2.411-1.8.el6 will be erased
--> Finished Dependency Resolution
Error: Trying to remove "vim-enhanced", which is protected
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest
```

このようにエラーで削除されなくなります。
Y/Nの質問すら出ないので、-yオプションを付けても削除されることはありません。
.embeddedframework とは

iOS/OS X 向けの SDK を .embeddedframework の形式で SDK を配布している場合があるので調べてみた。

どうやら、 .framework 本体に含まれる画像リソースなどを SDK を利用するプロジェクトからも利用しやすくするためのハックっぽいです。

.embeddedframework を丸ごと Xcode プロジェクトに追加すれば、 .embeddedframework/Resources 以下のファイルもプロジェクトに追加されるので使いやすい。

```text:Pinterest.embeddedframeworkの例(一部省略)
$ tree Pinterest.embeddedframework
Pinterest.embeddedframework
├── Pinterest.framework
│   ├── Resources -> Versions/Current/Resources
│   └── Versions
│       ├── A
│       │   └── Resources
│       │       ├── Info.plist
│       │       ├── PinterestSDKResources.bundle
│       │       │   ├── Btn_PinIt_Pressed.png
│       │       │   ├── ...
└── Resources
    └── PinterestSDKResources.bundle -> ../Pinterest.framework/Resources/PinterestSDKResources.bundle
```


Apple の公式ドキュメントにもどうやら情報が無い
http://www.google.com/search?q=site:developer.apple.com+%22embeddedframework%22

## .embeddedframework を利用している SDK
http://developers.pinterest.com/ios/
  Resources にはロゴ画像などを含む .bundle


## .embeddedframework についての情報
https://github.com/kstenerud/iOS-Universal-Framework/issues/20
http://rayvinly.com/how-to-build-a-truly-universal-framework-for-ios-and-mac-with-just-a-single-codebase/
AWS S3でURLを発行する時有効期限を設定する方法

タイトル通りですが、

```rb:
S3Object.url_for([ファイルのパス], BUCKET, :expires_in => [秒数])
```

で設定完了

他にも

```rb:
doomsday = Time.mktime(2030, 9, 13).to_i
S3Object.url_for([ファイルのパス], BUCKET, :expires => doomsday)
```

でもOK

基本的に制限を設けない場合

```rb:
S3Object.url_for([ファイルのパス], BUCKET, :authenticated => false)
```

でセキュリティは落ちるが無限時間
Googleから学ぶ ヌルヌルサクサクなスライドメニュー

##スマフォwebページのスライドメニュー
アプリでは当たり前のように実装されているスライドメニューですが、webページではなかなか使い心地のよいスライドメニューが実装されているのは見かけません。
スマートフォンのブラウザではjavascriptでのアニメーションはどうしてもガタガタになってしまうし、ちらつきやスクロール制御のめんどくささからもうwebページでネイティブアプリ並のスライドメニューを実装するなんて無理と思っていました。
Facebookのwebページですらボタンの反応は悪いしアニメーションも動かないし最悪です。


##一方Google先生はパーフェクトなスライドメニューを実装していた

![写真 2013-06-07 22 17 19.png](https://qiita-image-store.s3.amazonaws.com/0/14846/312066b2-f5ec-9d6a-7333-147bcb859b24.png "Googleのスマフォwebページ")

**さすがGoogle先生！ 俺達に出来ないことを(**

Googleのスライドメニューは以下の点でパーフェクトです。
1. スライドのアニメーションがとても滑らか・ちらつかない
2.  ボタンの反応にストレスを感じない
3.  メインコンテンツ部分のどこをさわってもメニューが閉じる
4.  横スクロール対策がしっかりされている
5. メニューだけスクロールできる

**今回はこれらがどのように実装されているのか調査しながら、jQueryのプラグインとしてスライドメニューを実装しました。**
**具体的なソースはあまり載せていないので、この記事の最後に貼ってあるサンプルページとgithubを見てみてください。**

##アニメーションについて
GoogleといえばFlash使わずjavascriptでなんでもやっちゃうイメージが強かったので、当然**スライドのアニメーションもjavascriptを使っている**と思ってソースを眺めていると、CSSにこんな記述がありました。

```
	-webkit-transform: translateX(0);
	-webkit-transition: .2s -webkit-transform ease-in-out;
```
CSS3のアニメーション...だと...！
[参考 CSS3 - transform](http://www.htmq.com/css3/transform.shtml "")

**スマートフォンではjavascriptではクラスの切り替えのみを行い、アニメーションはCSSに任せるのが定石**のようですねー。
また、Googleは`translateX`を使っていますが、よくある実装としては`translate3d`を使い**GPUアクセラレーター**を有効にすることでにぬるぬる描画を実現していることが多いです。

あとソースを読んでいて気づいた細かいテクニックとしては

####実際に動かすのはコンテンツ部分
　　メニューはz-indexに負の値をもって奥に隠れているだけです。
　　横スクロール対策にもなっている

####目立たない要素はアニメーション時はhiddenにする
　　アニメーションを軽くするための努力

####はじっこのちらつきは背景色でカバーする
　　実装してみてわかってのですが、メニュークローズ時にbodyの色がちらつきます。
　　Googleではメニューとちらつく部分の背景色を同じにすることで対策しているようです。

##イベントについて
Facebookのスライドメニューの反応が悪いように感じるのは、おそらく`onclick`でアニメーションを発火しているからです。
スマートフォンでは`onclick`の発生が遅いので、スマフォ特有の`ontouchstart`や`ontouchend`を使うことでストレスなく操作できます。

**メニューオープンはメニューボタンのontouchend、クローズはコンテンツ部分のontouchstart**にするのがよさそうです。


##メニューのスクロールについて
今回実装する上で一番苦労したがこれでした。
実際にさわってみるとわかりますがGoogleのスライドメニューはネイティブアプリと同じようにメニュー部分だけがスクロールでき、項目が多い場合でも対応できます。

なぜ苦労したか、**結論から言うとスクロールの処理を自前で書いていたからです。**

まず考えたのはメニュー部分を`overflow: scroll`などでスクロール可能にし、`event.preventDefault()`でページ全体にイベント伝播しないようにする方法でしたが、結局うまくいかず。
困って再度Googleのソースを見てみるとメニューを囲っているdivに怪しい記述が...

```
style="-webkit-transform:translate3d(0px, 0px, 0px)"
```
さきほども登場した`translate3d`ですね！
Googleのjsは当然 圧縮難読化されているので実際に確認してはいないのですが、どうやら**メニュー部分の`ontouchmove`を拾って、styleにy軸方向の値を設定した`translate3d`を連続的に書き込むこと**でスライドを実装しているようです。
実際この実装方法でうまくいきました。

## 今回作成したプログラムのソース & サンプルページ

今回作ったものを載せておきます
[サンプルページ](http://encircle.jp/sp/ "")
※iPhone5でのみ動作確認してあります
※PCでは動きません(ontouch系が使えないので)

githubにもおいてあります
[github - jSlideMenu](https://github.com/ukitaka/jSlideMenu "")

## まとめ
#### ・javascriptでなくCSS3のアニメーションを使おう
#### ・ちらつくならtranslate3dを使おう
#### ・ontouch系を使おう


## 最後に

#### CSS3すげぇ
　角丸くできるだけかと思ってました。ごめんなさい。

#### Googleすげぇ
　とても参考になりました。
Auto Complete でコメントや文字列リテラルでも補完を行う

デフォルトの Auto Complete では，ソースコード中のコメントや文字列リテラル (" " の中など) での補完が無効になっています．これを有効にするためには以下の内容を .emacs に記述します．

```common-lisp
(setq ac-disable-faces nil)
```
使用omniauth-bitbucket和bitbucket.org做帐号连接


#1. 安装omniauth-bitbucket
首先新建一个rails的工程，具体过程就不说了，然后编辑Gemfile

````ruby
gem 'bitbucket_rest_api', :git=>'https://github.com/vongrippen/bitbucket.git'
gem 'omniauth-bitbucket'
````
其中，bitbucket_rest_api是bitbucket API的Ruby包装，这里如果不写git源的话，在我Ruby2.0+Rails4的情况下会导致hashie依赖错误。

omniauth-bitbucket是omniauth的bitbucket实现。
值得一提的是，[omniauth-bitbucket](https://github.com/sishen/omniauth-bitbucket) 是一个杭州的工程师写的，具体可以参考其[github主页](https://github.com/sishen)。


编辑完Gemfile之后，就可以执行**bundle install**了。

#2. 使用omniauth-bitbucket和bitbucket


##2.1. 设置oauth 的provider
编辑**config/initializers/omniauth.rb**文件

```ruby
Rails.application.config.middleware.use OmniAuth::Builder do
   provider :bitbucket, 'BITBUCKET_KEY', 'BITBUCKET_SECRET'
end
```

##2.2. 设置oauth认证的routing规则

编辑routes.rb

```ruby
match “/auth/:provider/callback” => “bitbucket#callback”
```
这一句，同时生成了/auth/:provider这个url，在本例里，即"/auth/bitbucket"。用户访问这个url，会立即被导向provider的认证授权页面。而授权后的callback页面，就是上面的match规则指定的url。

关于oauth认证相关的东西，代码其是很少。

##2.3. 处理callback

在上面设置的callback方法里，就可以处理服务端返回的授权token了。

```ruby
class BitbucketController < ApplicationController

  def callback
    
    auth = request.env["omniauth.auth"]
    …
    …

  end
end

```

直接从request里即可取得auth情报，这个auth是一个AuthHash类的实例，其中最重要的信息应该就是用户的access token和secret了，可以通过：

```ruby
config.oauth_token   = auth.credentials.token
config.oauth_secret  = auth.credentials.secret

```
从request里取得的auth情报，就可以做各种处理了，比如保存到数据库之类的。

现在就可以开始测试了，可以设置一个页面，里面有指向/auth/bitbucket的连接，或者直接在浏览器输入/auth/bitbucket。

##2.4. 使用BitBucket

有了auth信息，就可以生产BitBucket的实例并使用了：


```ruby

bitbucket = BitBucket.new do |config|
  config.oauth_token   = a.credentials.token
  config.oauth_secret  = a.credentials.secret
  config.client_id     = 'BITBUCKET_KEY'
   config.client_secret = 'BITBUCKET_SECRET'
end

repos = bitbucket.repos.list

changesets = bitbucket.repos.changesets.all  'USER_NAME', 'RESP_NAMEW'


```

具体的BitBucket类和方法请参考相关[Doc](http://rubydoc.info/github/vongrippen/bitbucket/master/frames)，也可以通过irb来确认：

    irb(main):008:0> BitBucket.actions
    |--> actions
    |--> authorizations
    |--> events
    |--> issues
    |--> oauth
    |--> pull_requests
    |--> repos
    |--> repositories
    |--> search
    |--> teams
    |--> users

    irb(main):001:0> BitBucket::Repos.actions
    |--> actions
    |--> all
    |--> branches
    |--> changesets
    |--> create
    |--> edit
    |--> find
    |--> following
    |--> get
    |--> keys
    |--> list
    |--> list_branches
    |--> list_tags
    |--> repo_tags
    |--> repository_tags
    |--> sources
    |--> tags

#3. 其它

如果不喜欢omniauth的url风格，可以在初始化的时候自己定制：

```ruby
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, 'TWITTER_CONSUMER_KEY', 'TWITTER_CONSUMER_SECRET',
           :request_path => '/sign_in', :callback_path => '/sign_in/callback'
end
```
go语言中的cookie处理


本例子主要是演示go语言中关于cookie处理的几个函数，也可以在[这里](https://gist.github.com/liubin0329/5705616)下载

有几点需要注意的，先提前列出来。

1. 往客户端写入cookie，需要往respose里写，而不是request，这个很容易混淆，因为request有[AddCookie](http://golang.org/pkg/net/http/#Request.AddCookie)方法，这个看起来就很吸引人使用。而往response的方法是http包里的函数[SetCookie](http://golang.org/pkg/net/http/#SetCookie) 。实际上，request的AddCookie是把http当做客户端的时候使用的。

2. 写cookie需要在往response里写入body前进行。特别要注意这个时机问题。

3. 删除cookie通过设置cookie的MaxAge为负数来实现。

全部代码如下（请从[这里](https://gist.github.com/liubin0329/5705616)取得最新代码）

测试的话请运行此程序然后在浏览器确认。



```go

package main

import (
    "io"
    "net/http"
    "log"
    "fmt"
    "time"
)

func DrawMenu(w http.ResponseWriter){
    w.Header().Set("Content-Type", "text/html")
    io.WriteString(w, "<a href='/'>HOME <ba><br/>" + "\n")
    io.WriteString(w, "<a href='/readcookie'>Read Cookie <ba><br/>" + "\n")
    io.WriteString(w, "<a href='/writecookie'>Write Cookie <ba><br/>" + "\n")
    io.WriteString(w, "<a href='/deletecookie'>Delete Cookie <ba><br/>" + "\n")

}

func IndexServer(w http.ResponseWriter, req *http.Request) {
    // draw menu
    DrawMenu(w)
}


func ReadCookieServer(w http.ResponseWriter, req *http.Request) {

    // draw menu
    DrawMenu(w)

    // read cookie
    var cookie,err = req.Cookie("testcookiename")
    if err == nil {
        var cookievalue = cookie.Value
        io.WriteString(w, "<b>get cookie value is " + cookievalue + "</b>\n")
    }

}

func WriteCookieServer(w http.ResponseWriter, req *http.Request) {
    // set cookies.
    expire := time.Now().AddDate(0, 0, 1)
    cookie := http.Cookie{Name: "testcookiename", Value: "testcookievalue", Path: "/", Expires: expire, MaxAge: 86400}

    http.SetCookie(w, &cookie)

    // 
    // we can not set cookie after writing something to ResponseWriter
    // if so ,we cannot set cookie succefully.
    // 
    // so we have draw menu after set cookie
    DrawMenu(w)

}


func DeleteCookieServer(w http.ResponseWriter, req *http.Request) {

    // set cookies.
    cookie := http.Cookie{Name: "testcookiename", Path: "/", MaxAge: -1}
    http.SetCookie(w, &cookie)

    // ABOUT MaxAge
    // MaxAge=0 means no 'Max-Age' attribute specified.
    // MaxAge<0 means delete cookie now, equivalently 'Max-Age: 0'
    // MaxAge>0 means Max-Age attribute present and given in seconds

    // draw menu
    DrawMenu(w)

}

func main() {

    http.HandleFunc("/", IndexServer)
    http.HandleFunc("/readcookie", ReadCookieServer)
    http.HandleFunc("/writecookie", WriteCookieServer)
    http.HandleFunc("/deletecookie", DeleteCookieServer)

    fmt.Println("listen on 3000")
    err := http.ListenAndServe(":3000", nil)

    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

```
Install Ruby2.0 and Rails 4.0 on OX S Part 2


接上文[《Install Ruby2.0 and Rails 4.0 on OX S Part 1》](http://liubin.org/2013/06/01/install-ruby2-0-and-rails-4-0-on-ox-s-part-1/)，本文接着介绍如何安装rails4.0 。

#1. 安装bundle
需要注意bundle版本问题

>$ gem install bundler --no-ri --no-rdoc

>$ bundle -v
Bundler version 1.3.5

*必要时可能需要rbenv rehash操作。*

#2. 安装rails4.0

安装过程很简单，也很顺利。

按照rails官方说法，如下安装：

> $ gem install rails --version 4.0.0.rc1 --no-ri --no-rdoc

最新的rails版本是4.0.0.rc1

本文采用bundle方式安装：

>$ mkdir /tmp/rails4
$ cd /tmp/rails4
$ bundle init

然后编辑Gemfile，让它内容像下面这样：

>$ cat Gemfile
\# A sample Gemfile
source "https://rubygems.org"
gem "rails","~> 4.0.0.rc1"


然后运行安装命令：

>$ bundle install

不出意外的话，即可以确认rails版本：

>$ rails -v
Rails 4.0.0.rc1



#3. 启动rails

首先建立个rails项目：

>$ rails new foo --edge
      create  
      create  README.rdoc
      create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile
      … ...
      create  vendor/assets/stylesheets/.keep
         run  bundle install
      … ...
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
Post-install message from rdoc:
Depending on your version of ruby, you may need to install ruby rdoc/ri data:
… ...
<= 1.8.6 : unsupported
 = 1.8.7 : gem install rdoc-data; rdoc-data --install
 = 1.9.1 : gem install rdoc-data; rdoc-data --install
>= 1.9.2 : nothing to do! Yay!

然后启动服务器：

>$ bundle exec rails server
[2013-06-01 16:42:10] INFO  WEBrick 1.3.1
[2013-06-01 16:42:10] INFO  ruby 2.0.0 (2013-05-14) [x86_64-darwin12.3.0]
[2013-06-01 16:42:10] INFO  WEBrick::HTTPServer#start: pid=1183 port=3000

一切正常，即可以通过浏览器来确认环境：

![rails 4.0](https://www.evernote.com/shard/s45/sh/9559664b-af2c-4c60-b3a9-6e38718173ef/d77047ddc74fc6b3f2d3fd3d1ccaddea/res/1b1a211e-b5bd-4f43-97a3-1ee357a71e07/skitch.png)


--完--
Go と Objective-C

```go:main.go
package main

// #cgo CFLAGS: -x objective-c
// #cgo LDFLAGS: -framework Cocoa
// #import <Cocoa/Cocoa.h>
//
// void SayHello() {
//   NSLog(@"Hello, World!");
// }
//
import "C"

func main() {
        C.SayHello()
}
```
これだとビルド時ににリンクエラーになるんだよなあ…。 go run -x ... で調べた所、最後の 6l まで行っており、 6l が -framework を解さないのが原因ではないかと考えられる。

追記: できた: https://github.com/hajimehoshi/cocoa_in_go 。原理は、 Objective-C の部分だけ独立した dynamic library にして、 Go から (C の) 関数を呼んでいるだけである。
Auto Complete でファイル名の入力が上手くいかない問題を解決する

Auto Complete の ac-source-filename を有効にしている状態で Elisp を書いているとき，"~/" 以降の補完がきかないことが気になったので調べてみました．すると [auto-completeでファイル名補完](http://d.hatena.ne.jp/m2ym/20091108/1257680169) にこう書いているのをみつけました．

> オムニ補完の仕様上、ac-sourcesの中にファイル名らしき文字列を補完するソースがac-source-filenameより先に存在する場合、正しくファイル名補完が開始されないことがあります。M-: ac-soucesなどで順番をチェックして、ac-source-filenameが先頭に来るようにしておいてください。

Elisp で ac-sources を見てみると ac-source-filename が先頭にきていません．どうやら ac-common-setup の設定は ac-**-mode-setup よりも後ろにきてしまうようです．

ということで，以下のようにして解決しました．

```common-lisp
(require 'auto-complete-config)

;;; パス入力用の情報源を追加
(defun ac-common-setup ()
  (add-to-list 'ac-sources 'ac-source-filename))

;;; ac-source-filename は ac-sources の先頭でないと "~/" が上手く補完できないため，
;;; ac-sources の後ろに mode-hook 用情報源を付け足すよう変更
(defun ac-emacs-lisp-mode-setup ()
  (setq ac-sources (append ac-sources '(ac-source-features ac-source-functions ac-source-yasnippet ac-source-variables ac-source-symbols))))

(defun ac-cc-mode-setup ()
  (setq ac-sources (append ac-sources '(ac-source-yasnippet ac-source-gtags))))

(defun ac-css-mode-setup ()
  (setq ac-sources (append ac-sources '(ac-source-css-property))))

;;; 設定した ac-source を適用する
(ac-config-default)
```

auto-complete-config のデフォルトの設定をコピーしてきて，各モードの ac 情報源が全て ac-sources の後ろに追加されるように，append の引数の順序を入れ替えました．

ac-source-filename 以外で情報源の順番がどのような影響を与えるかよくわかっていないのですが，とりあえず .el ファイルで "~/" の補完がきくようになったのでよしとします．
SpringのRestTemplateを使ってYahoo!ジオコーダAPIから緯度経度を取得する

面倒なんでJsonNodeでやっちゃう。

```java:
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<JsonNode> response = restTemplate.getForEntity(
		"http://geo.search.olp.yahooapis.jp/OpenLocalPlatform/V1/geoCoder?appid={appId}&query={query}&output={output}",
		JsonNode.class,
		"[YahooのAPIキー]",
		"[検索する住所]",
		"json");

String coordinates = response.getBody().get("Feature").get(0).get("Geometry").get("Coordinates").asText();
```
シングルトンでクロージャなカウンタ

これもずっと使いまわしているクラス。
private なクラスとして下の方に、こそっと追加して使ったりしてます。

シングルトンって？
クロージャって？

って人への一例として登録します。


```java.count
class cnt
{
	static cnt Cnt;
	int counter = 0;

	static cnt getInstance(){
		if(null == Cnt) {
			Cnt = new cnt();
		}
		return Cnt;
	}
	void add() {
		counter++;
	}
	int get() {
		return counter;
	}
	void reset() {
		counter = 0;
	}
}
```
canvas で円を描画

日経ソフトウェア2013年7月号のコードを若干アレンジ

```html:3点を使って円を描画.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>3点を使って円を描画</title>
	<style>canvas { background-color: #d0d0d0; }</style>
</head>
<body onload="draw()">
	<canvas id="canvas" width="600" height="600"></canvas>
<script>

	xx = new Array(3);
	yy = new Array(3);
	var cx, cy;		// 円の中心
	var n = 0;		// クリック回数のカウンタ

	function draw() {
		var canvas = document.getElementById("canvas");	// 描画対象の canvas を選択
		var context = canvas.getContext("2d");			// 描画コンテキストを取得
		
		// マウスダウンイベント処理
		canvas.onmousedown = function(e) {
			// canvas 内でのマウス座標を計算
			var rect = e.target.getBoundingClientRect();
			var mouseX = e.clientX - rect.left;
			var mouseY = e.clientY - rect.top;
			
			context.beginPath();
			context.strokeStyle = "rgb(128, 128, 128)";
			
			xx[n] = mouseX;
			yy[n] = mouseY;
			context.rect(xx[n], yy[n], 2, 2);	// 点を描画
			if( n >= 2 ) {
				drawLine();		// 3点を結ぶ直線を描画
				calcCenter();	// 垂直二等分線の交点を計算
				drawCircle();	// 3点を通る円を描画
				n = 0;
			} else {
				n++;
			}
			context.stroke();
		}
		
		// 3点を結ぶ直線を描画
		function drawLine() {
			context.beginPath();
			context.strokeStyle = "rgb(128, 128, 128)";
			context.moveTo(xx[0], yy[0]);
			context.lineTo(xx[1], yy[1]);
			context.lineTo(xx[2], yy[2]);
			context.closePath();
			context.stroke();
		}
		
		// 垂直二等分線の交点を求める
		function calcCenter() {
			// 2点間の垂直2等分線を求める
			f = function (x1, y1, x2, y2) {
				// 直線の係数を求める
				var a = (y2 - y1) / (x2 - x1);
				var b = y1 - (a * x1);
				// 直線の中点を求める
				var mx = x1 + ((x2 - x1) / 2);
				var my = y1 + ((y2 - y1) / 2);
				// 直線の垂直二等分線の係数を求める
				var aa = -1 / a;
				var bb = my - (aa * mx);
				return [mx, my, aa, bb];
			}
			ret = f(xx[0], yy[0], xx[1], yy[1]);
			m1 = [ret[0], ret[1]];				// 中点座標
			ab = [ret[2], ret[3]];				// 垂直二等分線の係数
			ret = f(xx[1], yy[1], xx[2], yy[2]);
			m2 = [ret[0], ret[1]];
			cd = [ret[2], ret[3]];
			
			// 二つの垂直二等分線の交点を求める
			// 解法）x = (-1/(-a+c) * -b) + (1/(-a+c) * -d)
			//		 y = (-c/(-a+c) * -b) + (a/(-a+c) * -d)
			var z = 1 / (-ab[0] + cd[0]);					// z = 1/(-a+c)
			cx = z * (-1     * -ab[1] + 1     * -cd[1]);	// x = z * (-1 * -b + 1 * -d)
			cy = z * (-cd[0] * -ab[1] + ab[0] * -cd[1]);	// y = z * (-c * -b + a * -d)
			
			// 垂直二等分線を描画
			context.strokeStyle = "rgb(0, 255, 0)"
			context.beginPath();
			context.moveTo(cx, cy);
			context.lineTo(m1[0], m1[1]);
			context.stroke();
			//
			context.beginPath();
			context.moveTo(cx, cy);
			context.lineTo(m2[0], m2[1]);
			context.stroke();
		}
		
		// 3点を通る円を描画
		function drawCircle() {
			// 円の半径を求める
			var r = Math.sqrt(Math.pow(cx - xx[0], 2) + Math.pow(cy - yy[0], 2));
			
			// 円を描画
			context.beginPath();
			context.strokeStyle = "rgb(255, 0, 0)";
			context.arc(cx, cy, r, 0, 2 * Math.PI, true);
			context.stroke();
		}
	}
</script>
</html>
```
htaccessで動的URLを静的URLに

動的URL
hoge.php?id=123
を静的URL
hoge123.html
として認識させる.htaccessの設定

```.htaccess
RewriteEngine on
RewriteRule hoge(.+)\.html$  hoge.php?id=$1

```

上手く動作するかは、サーバーの設定によって変わりそうですが。
いろいろな情報があるなかで、試行錯誤して実際に使えた方法のメモです。
emacs-jediのinstall


[jediとは](http://tkf.github.io/emacs-jedi/)emacsでpython編集時に、入力のautocomplete（自動補完）を行なってくれるemacs lispです。簡単な設定でemacsに強力で、高速な自動補完環境を構築出来ます。

emacsでpythonだと、python.elやら（また別の）python.elやらpython-mode.elやらac-python.elやらと混在して、全部入れると、一体どれが正常に動いてるのやら確認するのも嫌になります。どれもネーミングが悪すぎる。

今回紹介する、jediもネーミングがよくわからないのですが、統一的な仕様になっているので使いやすいかもしれないと思ったからです。

主な参考サイト : 
1. ここがメイン[2012-10-21 関西Emacsにいってきた](http://kozo2.hatenablog.com/entry/2012/10/21/053157)
2. 補助的[2013-04-15 emacs-jedi で Emacs の Python のオムニ補完をする場合のメモ](http://d.hatena.ne.jp/CortYuming/20130415/p1)
3. 補助的[2012年11月13日 Emacs で Python の補完を強化する jedi を設定してみた](http://www.sakito.com/2012/11/emacs-python-jedi.html)
4. 記事[JEDI: A COMPLETION LIBRARY FOR PYTHON by mickey on January 10th, 2013](http://www.masteringemacs.org/articles/2013/01/10/jedi-completion-library-python/)


install
---------

まずは、jedi関連のファイルをgitする場所を掘って、移動しておきます。
（私は、.elは全部用途別にファイル分割して、それをinit.elから読みに行っております。新しいパッケージはsite-lisp以下にパッケージごと（用途別じゃないのかい！）に整理しています。ご自分の環境では好きにしてください。）

```bash
mkdir ~/.emacs.d/site-lisp/jedi
cd ~/.emacs.d/site-lisp/jedi
```

ここで、gitからcloneしてきます。

```bash
git clone git://github.com/tkf/emacs-jedi
git clone git://github.com/kiwanami/emacs-deferred
git clone git://github.com/kiwanami/emacs-epc
git clone git://github.com/kiwanami/emacs-ctable
```

次は、virtualenvとかよくわからないのですが、次の呪文をemacs-jediで実行する必要があるようです。virtualenvやらpipがない人は、先にそちらをinstallする必要があります。

```bash
cd ~/.emacs.d/site-lisp/jedi/emacs-jedi
virtualenv env
source env/bin/activate
pip install jedi epc
```

設定
------

それが済んだら、ロードパスの通っているファイル（.emacs.d/init.elでもいいですし、私は.emacs.d/input-utils.elです）に以下を書き込みます。
auto-completeのセッティングの後に読み込まれるように書かないといけません。

```lisp
(add-to-list 'load-path "~/.emacs.d/emacs-deferred")
(add-to-list 'load-path "~/.emacs.d/emacs-epc")
(add-to-list 'load-path "~/.emacs.d/emacs-ctable")
(add-to-list 'load-path "~/.emacs.d/emacs-jedi")
(require 'auto-complete-config)
(require 'python)
(require 'jedi)
(add-hook 'python-mode-hook 'jedi:ac-setup)
(define-key python-mode-map (kbd "<C-tab>") 'jedi:complete)
```

私はこれでうまく行かず、試行錯誤の結果以下で落ち着きました。

```lisp
;;;この上にはpath設定やらsuto-completeの設定
(require 'jedi)
(add-hook 'python-mode-hook 'jedi:setup)
;;これを入れるとjediを手動<C-tab>で立ち上げないといけない。
;(setq jedi:setup-keys t)
(setq jedi:complete-on-dot t)
```

使い心地
--------------

python-modeよりはいい気がします。関数のヘルプが速いのに驚きました。
ネットワークドライブへのアクセスが遅いときの対処法

Mac(特にMacBookAir)でネットワークドライブ(共有フォルダ？)へのアクセスが激しく重い場合、

```
# sysctl -w net.inet.tcp.delayed_ack=0
net.inet.tcp.delayed_ack: 3 -> 0
```

とすると解決。デフォルトは
このままだと当然ながら再起動したときに戻っちゃうので

```bash:/etc/sysctl.conf(/private/etc/sysctl.conf)
net.inet.tcp.delayed_ack=0
```

これも忘れずに。
OSXはsysctl.confがないので新規でつくろう。
毎回gh-pagesブランチを作る時のコマンドを忘れる

githubのリポジトリでgh-pagesという名前のブランチを作ると、リポジトリ毎にwebページをホスティングしてくれる。
その時にgh-pagesブランチは親を持たないブランチにするのが定石なんだけど、いつもコマンドを忘れる。
ので、スクリプト書いた。

```bash:git-new-branch-without-parent
#!/bin/sh

#----------------------------------------
# git-new-branch-without-parent
#----------------------------------------
#
# make branch without parent
#
# example :
# git-new-branch-without-parent gh-pages
#
# @author ton1517 <tonton1517@gmail.com>

if [ $# -ne 1 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
    echo "usage: $0 <new-branch>"
    exit
fi

branchName=$1
gitRootDir=`git rev-parse --show-toplevel`

if [ ! -n "$gitRootDir" ]; then
    exit
fi

cd $gitRootDir

git symbolic-ref HEAD refs/heads/$branchName
rm .git/index
git clean -fdx
```

これを保存して、実行権限もたせて

```
chmod +x git-new-branch-without-parent 
```

パスの通った場所に置いて、リポジトリ内で

```
 git-new-branch-without-parent gh-pages
```

とやれば親を持たないgh-pagesブランチが作れる。

だいぶ楽になった。名前長い。
uiautomationとkifの比較

わかりやすかったのでメモ
https://github.com/mixi-inc/iOSTraining/wiki/11.4-KIF%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E7%B5%90%E5%90%88%E3%83%86%E3%82%B9%E3%83%88
iPhoneアプリの公開停止方法 (iTunes Connect)

Appleストアに公開しているアプリを公開停止する方法。
※アプリの削除はしない。

# 手順

* iTunes Connectにログインする。
* 「Manage Your Apps」を選択する。
* 対象のアプリを選択する。
* 「Rights and Pricing」を選択する。
*  「Select All」を選択し、すべてのチェックを外し、「Save」を押す。
* ステータスが下記になったことを確認する。  
"Developer Removed From Sale"

以上でAppストアに公開されなくなる。※アプリの削除はされない
復帰する場合は、あらためて「Rights and Pricing」にて、公開対象の国を設定すれば良い。

# 補足

アプリを削除する場合、「Developer Removed From Sale」の状態から「Delete Application」を実行する。
Windows 8でvagrantの環境を作ったまとめ

最近はやりのvagrantとかchef-solo(+ knife-solo)とかの環境を作りたくなったのでまとめときます。

chocolateyを入れてある前提です。
http://chocolatey.org/

```shell-session:
cinst virtualbox
cinst vagrant
cinst cwrsyn
cinst ruby
cinst ruby.devkit
cgem knife-solo
```

以上。

便利な時代になりました。
rsyncを入れてるのはknife-soloで利用するからです。
iTerm2のtabのタイトルと色を動的にいじる

[![https://gyazo.com/1d0c40169e6c700ba4c8086691b0cd18](https://i.gyazo.com/1d0c40169e6c700ba4c8086691b0cd18.png)](https://gyazo.com/1d0c40169e6c700ba4c8086691b0cd18)
後述の応用例が本編かも


##title(mac標準のターミナルでも可能)

```bash:shell
#例
$ echo -ne "\033]0;${USER}@${LANG}\007"
```
`${USER}@${LANG}`の部分は適宜変更する


参考:
Automatically set title on iTerm tabs | MrBrown blob
http://charles.lescampeurs.org/2008/05/07/automatically-set-title-on-iterm-tabs



##color(iTerm2のみ)
RGBでtabの色を指定できる
使い方:
`$ tab-color 255 255 255` 	→ 真っ白
`$ tab-color 255 0 0 ` 		→ 真っ赤
`$ tab-color 192 82 24 ` 		→ ｵﾚﾝｼﾞ

```bash:.zshrc 
#関数定義(引数3つ)
tab-color() {
    echo -ne "\033]6;1;bg;red;brightness;$1\a"
    echo -ne "\033]6;1;bg;green;brightness;$2\a"
    echo -ne "\033]6;1;bg;blue;brightness;$3\a"
}

tab-reset() {
    echo -ne "\033]6;1;bg;*;default\a"
}

```
参考:
https://gist.github.com/wadey/1140259

---
---

#応用例(本編)
##title
たとえば、`.zshrc`に

```bash:.zshrc
function chpwd() { ls; echo -ne "\033]0;$(pwd | rev | awk -F \/ '{print "/"$1"/"$2}'| rev)\007"}
```
と書いておけば、`cd`したときに`ls`が実行されるのに加えて
タブのtitleとして
`[一個上のディレクトリ名]/[現在のディレクトリ名]`
が表示されて、複数のtabで行き来する場合に「どのtabがどのディレクトリで作業してるか」把握しやすい

##color
同じく`.zshrc`に

```bash:.zshrc
alias top='tab-color 134 200 0; top; tab-reset'
```
って書いとけば、topを起動している間tabの色が黄緑っぽくなる。
irb,pry,octave等のインタプリタ系や、
htop,mc等の常駐系なら問題無く使えると思う。
JavaScriptテストツールメモ


JavaScriptのテスト周りについて調べた時のメモ。[codylindley/frontend-tools · GitHub](https://github.com/codylindley/frontend-tools "codylindley/frontend-tools · GitHub")から部分的に抜き出して編集

## ツール

###Test Runners

テストの自動実行などのサポート

* [testem](https://github.com/airportyh/testem)
* [testacular](http://vojtajina.github.com/testacular/)



###User Automated Testing

これはテストランナーに含まれないのか？

* [casperJS](http://casperjs.org/)

```
$ brew install phantomjs
$ brew install casperjs
```


###Testing Frameworks

* [mocha](http://visionmedia.github.com/mocha/) : 高機能
* [buster.js](http://busterjs.org/) : ブラウザからとヘッドレスモードでの実行有り。ベータ
* [qunit](http://qunitjs.com/) : jqueryで採用、古い印象
* [jasmine](http://pivotal.github.com/jasmine/) : BDD
* [expect.js](https://github.com/LearnBoost/expect.js) : Minimalistic BDD assertion toolkit based on [should.js](https://github.com/visionmedia/should.js "should.js")
* [Laika](http://arunoda.github.io/laika/concepts.html "Laika") : phantomjs, mocha, meteorを利用



###Assertion Libraries

上記のTesting Frameworksのベースに利用されてる

* [chai](http://chaijs.com/)
* [should](https://github.com/visionmedia/should.js)
* [expect](https://github.com/LearnBoost/expect.js)



## リンク
関係のありそうなリンク

* [javascript におけるユニットテストについて (2013/01)](https://gist.github.com/taichi/4482819 "javascript におけるユニットテストについて (2013/01)")
* [npm 1.0: Global vs Local installation](http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/ "npm 1.0: Global vs Local installation")
* [Selenium何とかっていうツールがやたら色々あるのはどういうわけなのか | 品質向上ブログ](http://blog.trident-qa.com/2013/05/so-many-seleniums/?utm_source=rss&utm_medium=rss&utm_campaign=so-many-seleniums "Selenium何とかっていうツールがやたら色々あるのはどういうわけなのか | 品質向上ブログ")
ちょっとだけjQuery使ってテストしたい。

chromeのjavascript consoleとかで以下をブロックごとにコピペした上でごにょごにょ。

```js:
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'http://www.google.com/jsapi';
document.body.appendChild(script);
```

```js:
google.load('jquery','x.y.z'); // 2番目は任意のバージョン
```
uiautomationメモ

・xcodeでアプリ作る
・ビルド通るまで作る
・Produc→Profileで実行する（そうなるとInstrumentsが立ち上がる）
・automation選択する（シミュレータなら、シミュレータ、実機なら、実機かな）
・add scriptでscriptを追加
・recordボタンをクリックする
・色々動作させて記憶させる
・stopで止める
・scriptを選んで再生ボタンを押す
・再生される
Muninのグラフを修正したかった。

Muninのグラフを少し修正したかった。

特に歴史を改ざんしたかったわけではなくDERIVEなグラフに対してプラグインが0とかの値を返してしまうとグラフの値がおかしくなってしまうため、これを修正したかった。

先にまとめだけ書くと、検索したら出てくるように、MuninのデータはRRDTOOLを使ってデータを管理しているので、rrdtoolコマンドでdumpしてrestoreすればよい。

しかし、muninにより（標準だと）5分間に1回更新されてしまうので非常に素早くXMLファイルを書き換える必要がある。また、muninがmuninユーザで動いているとき、rootでデータを作ってしまうとmuninが書き込めなくなる。ということで下のようなスクリプトを書いておいた。

```sh:modify_rrd.sh
#!/bin/bash -x
#
# muninのデータを修正するツール
#

name=`basename ${1}`
tmp_xml="/tmp/${name}.xml";

rrdtool dump ${1} ${tmp_xml};
vim ${tmp_xml};
\mv ${1}{,.backup};
rrdtool restore ${tmp_xml} ${1};
chown munin:munin ${1};

```

```bash
$ sudo ./modify_rrd.sh /var/lib/munin/example.com/example2-if_eth0-up-c.rrd
```

こんなのを書いておけば、上のようなコマンドを叩くだけでvimが開いてXML書き換えて保存すればrestoreされる。これでデータを慌てて書き換えて権限を変えわすれてデータがなくなったりすることもなくなった。
blessは破壊的メソッドである罠



##結論

blessは、オブジェクトを返すんじゃなくて、
受け取ったリファレンス自体をオブジェクト化して返す
→blessは破壊的メソッド。

これを知らないと、以下の罠にはまります。

##追記(2013/11/19)


```perl
package Class1;
sub new{
my ($class, %args )  = @_;
  bless +{
    hoge => 'initial value',
    %args,
  }, $class;
}

Class1->new( hoge => 1)
```

cpanを見ると、上記のように書くのが一般的なようです。
そもそも参照で渡すな、って話でした。


##例

```perl
package Class1;
sub new{
my ($class, $args )  = @_;
  bless $args, $class;
}

package Class2;
sub new{
my ($class, $args )  = @_;
  bless $args, $class;
}
```

と適当なクラスを定義します。

```perl
my $args = {hoge => 'hoge'};

my $obj1 = Class1->new($args);
my $obj2 = Class2->new($args);

print ref $args; # => Class2
print ref $obj1; # => Class2

```

$obj1がClass2なんだぜこれ…
$argsもちゃっかりオブジェクトになってるし…

## 対策
$obj1をきちんとClass1にするためには、
以下のうちどれかをすればいいです。

- 無名ハッシュで渡す
- そのままblessせずに、無名ハッシュをblessする
- ```bless Clone::clone($args), $class``` とする

なお、unblessも破壊的です。
findで指定カラムの値のみを取得



モデルのカラムの値一つだけが知りたいとき、`find`でselectオプションを使えば指定のカラムの値だけを取得することができる。

例えば、idが1のUserモデルについてusernameカラムの値だけが知りたい時、以下のように記述する。

```
User.find(1, select: "username")
```

SQL

```
SELECT username FROM `users` WHERE `users`.`id` = 1
```

**参考サイト**

* [find の :select オプション - bunshin.]( http://d.hatena.ne.jp/double_m/20081111/1226397354 )
CentOS6でgistからgit cloneする

## 参照サイト
 * [CentOS 6のgitバージョンを1.7.1から新しくする - torutkの日記](http://d.hatena.ne.jp/torutk/20130128/p1)
 * [gistからcloneしようとすると、error: RPC failed; result=22, HTTP code = 400 ってでる。 #git - Qiita [キータ]](http://qiita.com/items/3f3a48a0285e2372a6ac)

## 現象
 * CentOS 6.4でgistからgit(ver.1.7.1)でcloneしようとするとエラーになる

```bash:
$ git clone https://gist.github.com/5726649.git
Initialized empty Git repository in /home/hotta/Documents/program/ruby/test/html_escape/5726649/.git/
error: RPC failed; result=22, HTTP code = 400
```

## 対策
 * 最新のgitを入れる(ソースコードからじゃなくてrpmでいれてみた)
  * => 認証付きproxyでうまく動作しなかったので結局ソースコードから入れた

 * 既存のgitを削除する(perl-Gitの依存関係でgitも削除)

```bash:
$ sudo yum erase perl-Git
```

 * [Repoforge](http://pkgs.repoforge.org/git/ )より最新のgitとperl-Gitを取得する
  * 32bitでとりあえずこれ：git-1.7.11.3-1.el6.rfx.i686.rpm、perl-Git-1.7.11.3-1.el6.rfx.i686.rpm
  * 64bitでとりあえずこれ：git-1.7.11.3-1.el6.rfx.x86_64.rpm、perl-Git-1.7.11.3-1.el6.rfx.x86_64.rpm 
 * rpmインストール

```bash:
 $ sudo yum localinstall git-*.rpm perl-Git-*.rpm
```

## はまった
 * git削除するとconfigが消えてjenkinsのgitプラグインでエラーになった
  * user.nameとuser.emailが消えてjenkinsがタグを打てなくなってた

 * 認証付きプロキシ越しにhttps_proxyを設定してもgit cloneできずにタイムアウトする
  * => 原因不明、結局ソースコードから入れた
TTYtterを使ったったー


Homebrewを使っていたら、`ttytter`の文字があり、気になったので使ってみることにした。

## OS
- Mac OS X Moutain Lion

## TTYtterとは？
- コマンドラインから使用できるTwitterクライアント。
- OAuthトークンとシークレットをキーファイルに登録することで、ID/パスワードをクライアント側で保持していなくてもTwitterを使用できるとのこと。
http://www.floodgap.com/software/ttytter/

## TTYtterのインストール
- ここではHomebrewを使用してインストールする。

1. ターミナルを起動し以下のコマンドを入力する。

```Bash:Terminal
homebrew install ttytter
```

2.ターミナルで以下のコマンドを入力する。

```Bash:Terminal
ttytter
```

3.ターミナルに以下のURLが表示されるので、ブラウザからURLにアクセスする。

```Bash:Terminal
Request from http://api.twitter.com/oauth/request_token ... SUCCEEDED!

1. Visit, in your browser, ALL ON ONE LINE,

https://api.twitter.com/oauth/authorize?oauth_token=<token>
```

4.ブラウザからTwitterにログインする。ログイン済みの場合は不要。
5.ログインに成功すると、ブラウザにアプリケーション認証画面が表示されるので、「連携アプリを認証」ボタンをクリックする。
6.認証に成功すると、ブラウザにPINが表示されるので、ターミナルの以下の部分にPINを入力する。

```Bash:Terminal
Enter PIN> <PIN>
```

7.ターミナルに以下のメッセージが表示されたら、成功。

```Bash:Terminal
Request from http://api.twitter.com/oauth/access_token ... SUCCEEDED!
Written keyfile /Users/<ユーザ名>/.ttytterkey
```

## 使い方
### タイムライン取得
- ターミナルから`ttytter`コマンドを実行すると、最新のタイムラインが取得できる。

- `-vcheck`オプションを付けると、ttytterの最新版をインストールしてからttytterを起動する。

### ツイート
- １行だけのツイートであれば、以下のコマンドから実行できる。

```Bash:Terminal
ttytter -status="ここにツイートしたい内容を入れる"
```

- 他の機能については後で、、、

### 終了
- `Control+c`でOK
magicolor 1690MF のトナー残量をSNMP経由で得る

今回はプリンタのトナー残量をSNMPから取得することを試みます。

一言で言えば以下のページで全て分かれ、となります。

* http://wiki.kainhofer.com/hardware/magicolor_scan/snmp_all

しかし残念ながら、対応するMIBファイルが公開されていないようです。

コニカミノルタの他のプリンタでは公開されているケースもあるようですが、整合性がありませんでした (そもそもそのMIBファイル、exeで自己展開するという悲しい形式で、しかも出てきたMIB形式としては壊れたものでした。うぐぅ)

気を取り直して上のページで一応snmpwalkの結果らしきものが出てます。これと管理者ページのトナー残量の結果を見比べて探すという非プログラマティカルなことをした結果

    ~> snmpget printer.example.com -v 2c -c public SNMPv2-SMI::enterprises.18334.1.1.1.5.7.4.4.1.3.1
    SNMPv2-SMI::enterprises.18334.1.1.1.5.7.4.4.1.3.1 = Counter32: 60
    ~> snmpget printer.example.com -v 2c -c public SNMPv2-SMI::enterprises.18334.1.1.1.5.7.4.4.1.3.2
    SNMPv2-SMI::enterprises.18334.1.1.1.5.7.4.4.1.3.2 = Counter32: 40
    ~> snmpget printer.example.com -v 2c -c public SNMPv2-SMI::enterprises.18334.1.1.1.5.7.4.4.1.3.3
    SNMPv2-SMI::enterprises.18334.1.1.1.5.7.4.4.1.3.3 = Counter32: 40
    ~> snmpget printer.example.com -v 2c -c public SNMPv2-SMI::enterprises.18334.1.1.1.5.7.4.4.1.3.4
    SNMPv2-SMI::enterprises.18334.1.1.1.5.7.4.4.1.3.4 = Counter32: 30
    ~> snmpget printer.example.com -v 2c -c public SNMPv2-SMI::enterprises.18334.1.1.1.5.7.4.4.1.3.5
    SNMPv2-SMI::enterprises.18334.1.1.1.5.7.4.4.1.3.5 = Counter32: 30

このあたりがそれ臭いということが分かりました。

後は使いたいように使えば良いですね。

一般論として言えば、多分トナー残量を示す上での共通の値はありません。enterprises 下に独自ツリーを各社が作っている状況ですんで、別のプリンターでは上の値は使えません。あはは。
Feedly 移行記念、Feedly をはてブ対応させるユーザースクリプト

Google Reader が終了してしまうので Feedly に移行したのですが、Feedly は、はてなブックマークには対応していません。
なので、Feedly をはてブ対応させるためのユーザースクリプトを書いてブログで公開しました。

見た目としてはこんな感じになります。

![ここに追加](http://www.otchy.net/wp-content/uploads/2013/06/fwt_listview.png)

詳細は自ブログ参照願います！

[Feedly 移行記念、Feedly をはてブ対応させるユーザースクリプト](http://www.otchy.net/20130606/feedly-hatebu/)
godを使ってguardを永続化してみる

ディレクトリを監視し続けて、変化があったらスクリプト実行、というのをバックグラウンドで動かし続けたかったので、rubyでguardとgodを使って動かしてみました。

本当はもうちょっとスマートな方法あるかもしれませんが、guardをコマンドからgodで実行するというパターンです。

まずは普通にguardとgodをgemでinstallし、Guardfileを作成します。

```
gem install guard
gem install god

guard init
```

Guardfileを普通に記述。

```rb:Guardfile
guard :shell do
  watch %r{^(.*).txt$} do |m|
    #do something
  end
end
```

godのためのファイルを書いて、コマンドラインからguardを実行します。-iオプションでinteractionできなくしておいた方が、logファイルの見通しがよくなります。

```rb:guard.god
require "god"

God.pid_file_directory = File.dirname(__FILE__)+"/tmp/god_pids/"
God.watch do |w|
    w.name      = "guard"
    w.start = "guard start --guardfile Guardfile -i"
    w.dir = File.dirname(__FILE__)
    w.log = File.dirname(__FILE__)+"/log/guard.log"
    w.keepalive
end
```

そしてgodを実行。

```
god -c guard.god
```

ログも残せるので、裏でずーっと回しておきたい処理を行うのにオススメです。
FuelPHP【parser】デフォルトのviewの拡張子が.phpだとみずらいので識別拡張子を変更する


テンプレートエンジンって書きづらくないですか？
書きづらくない。そうですか。
自分は素のPHPがすきなんですがFuel\Coew\Viewの拡張子が.phpだとvimとかでタブをいっぱい開いたときにどれがcontrollerでどれがviewかがわかりずらいのでいっそのこと拡張子を変更することにしました。


## 環境

* centos6.3
* fuelPHP1.6.1

## 事前準備に必要なもの
* php5.3以上
* git
* fuelPHPがインストール済みであること インストールをしていない場合は[FuelPHP【入門】-- CRUDを作った時のメモ(インストールからCRUD作成まで) --](http://qiita.com/items/ae107a96699745a02560)を参考にインストールしてください。

## 参考にしたサイト
* [日本語版ドキュメント(1.6ドキュメント)](http://fuelphp.jp/docs/1.6/)

## packages/parser/config/perser.phpをコピーする


```shell
cp fuel/packages/parser/parser.php fuel/app/config/
```

### 編集

```php:fuel/app/config/parser.php
return array(

	// ------------------------------------------------------------------------
	// Register extensions to their parsers, either classname or array config
	// ------------------------------------------------------------------------
	'extensions' => array(
		'phtml'     => 'View',
	),
);

```

1.5系とかは適時packagesのパスを置き換えてください。


## packageのロード

```php:fuel/app/config/config.php
	'always_load'  => array(
		'packages'  => array(
			'parser',
           'my',
		),
```

## Fuel\Core\Viewを継承したクラスを作成する

ファイルの置き場所は好みに応じて自分は自分用パッケージ作って管理しました。


```shell
mkdir fuel/packages/my fuel/packages/classes fuel/packages/my/config fuel/packages/my/tests 
```

## bootstrap.phpを置く

```php:fuel/packages/my/bootstrap.php
<?php
Autoloader::add_core_namespace('My');

Autoloader::add_classes(array(
	'My\\View'                         => __DIR__.'/classes/view.php',
));


/* End of file bootstrap.php */
```

## 拡張viewクラス

```php:fuel/packages/my/clasees/view.php
<?php
namespace My;


/**
 * View class
 *
 * Acts as an object wrapper for HTML pages with embedded PHP, called "views".
 * Variables can be assigned with the view object and referenced locally within
 * the view.
 *
 * @package   My
 * @category  View
 */
class View extends \Fuel\Core\View
{
	/**
	 * @var  string  The view file extension
	 */
	protected $extension = 'phtml';
}

```

$extensionはお好みに応じて変更すればと

上記の設定が完了したらviewsのファイルの拡張子を変更すればできあがりです。