OmniAICreator/Qiita-1.07M huggingface dataset:
Vagrantでlxcを使う

## 参考

* [GitHub - fgrehm/vagrant-lxc: LXC provider for Vagrant](https://github.com/fgrehm/vagrant-lxc)


## インストール

```bash:
sudo apt-get install -y vagrant-lxc
```

* [Discover Vagrant Boxes | Atlas by HashiCorp](https://atlas.hashicorp.com/boxes/search?provider=lxc) LXCのイメージ一覧

```rb:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "debian/jessie64"
  config.vm.network :forwarded_port, host: 3000, guest: 80
end
```

>  config.vm.network :public_network, ip: "192.168.100.10", bridge: 'enp3s0'

LXCはpublic_network指定をサポートしていません。

* LXCのtemplateは `/usr/share/lxc/templates/`にあります

## 起動

```bash:
vagrant up --provider=lxc
vagrant ssh
```

### 停止

```bash:
vagrant halt
```

## box化

```bash:
vagrant package
```

* package.box が生成される。

## X転送

```bash:
vagrant ssh -- -X

sudo apt-get update
sudo apt-get install -y xhosts xterm
```

# provision

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

Vagrant.configure("2") do |config|
  config.vm.box = "debian/jessie64"
  config.vm.provision :shell, :path => "provision.sh"
  config.vm.network :forwarded_port, host: 3000, guest: 80
end
```

```bash:provision.sh 
## locales
echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen
locale-gen
update-locale LANG=ja_JP.UTF-8

## timezone
echo "Asia/Tokyo" > /etc/timezone 
dpkg-reconfigure -f noninteractive tzdata

#apt-get update
```

```bash:provision実施
vagrant provision
```
ビットマップでアルファチャネルマスク


ポイントは cacheAsBitmap でビットマップキャッシュを有効する必要があること。

ソースコード:

```ActionScript:mask.as
package
{
	import flash.display.Loader;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.net.URLRequest;
	
	public class mask extends Sprite
	{
		public function mask()
		{
			var square:Shape = new Shape();
			square.graphics.beginFill(0x666666);
			square.graphics.drawRect(0,0,100,100);
			square.graphics.endFill();
			square.cacheAsBitmap = true;
			this.addChild( square );
			
			var loader:Loader = new Loader();
			loader.load( new URLRequest("http://upload.wikimedia.org/wikipedia/commons/c/cf/AWBWH1.png") );
			loader.scaleX = 0.25;
			loader.scaleY = 0.25;
			loader.cacheAsBitmap = true;
			this.addChild( loader );
			
			square.mask = loader;
		}
	}
}
```

実行結果:
![kobito.1375238758.975467.png](https://qiita-image-store.s3.amazonaws.com/0/8219/aacf4468-2649-f57f-9d1f-9be6ad70fcc0.png "kobito.1375238758.975467.png")
Windows7 でのシリアルマウス対策

レジストリエディタ（regedt）にて以下を変更。

**HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\sermouse** にある、Start の値を **4** に編集。
仮に Start が無い場合は、 **DWORD(32ビット)値** として作成する。

Start 値の詳細については、http://support.microsoft.com/kb/103000/ja を参照。
手書きのベンダープレフィックスをある程度自動化したい

user-select()などのCompass側でデフォルトでmixinをインポートしてくれていないようなプロパティの場合、適当に以下のようにしてました。
(frameworks内のscssを弄れば動くらしいけど)

```scss:_parts.scss
@mixin user-select($value:none) {
	-webkit-user-select: $value;
	-moz-user-select: $value;
	-ms-user-select: $value;
	user-select: $value;
}
```

しかし、「ベンダープレフィックス、スマホでもmsがtrueになってるのはおかしいよね…」
ということで下記のようにしました。

```scss:_setting.scss
$experimental-support-for-webkit: true;
$experimental-support-for-mozilla: true;
$experimental-support-for-microsoft: true;
$experimental-support-for-opera: false;

@mixin exp($property, $value,
	$webkit		: $experimental-support-for-webkit,
	$moz		: $experimental-support-for-mozilla,
	$ms			: $experimental-support-for-microsoft,
	$o			: $experimental-support-for-opera,
	$official	: true
) {
	@if $webkit	and $experimental-support-for-webkit	{ -webkit-#{$property}: $value;}
	@if $moz	and $experimental-support-for-mozilla	{    -moz-#{$property}: $value;}
	@if $ms		and $experimental-support-for-microsoft	{     -ms-#{$property}: $value;}
	@if $o		and $experimental-support-for-opera		{      -o-#{$property}: $value;}
	@if $official										{         #{$property}: $value;}
}
```
```scss:_parts.scss
@mixin user-select($value:none) {
	@include exp(user-select, $value);
}
```

## 読み込ませたいファイルにincludeします。

```scss:common_pc.scss
.user-select {
	@include user-select(none);
}
```

スマホ用scssにはベンダープレフィックスサポート用の変数を一番始めに再定義しておきます。

```scss:common_sp.scss
$experimental-support-for-webkit: true;
$experimental-support-for-mozilla: false;
$experimental-support-for-microsoft: false;
$experimental-support-for-opera: false;

.user-select {
	@include user-select(none);
}
```

## こうなります

```scss:common_pc.scss
.user-select {
	-webkit-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;
}
```
```scss:common_sp.scss
.user-select {
	-webkit-user-select: none;
	user-select: none;
}
```

user-selectだけに限らず使えるので汎用性はありますよね。
まあ、大抵のプロパティははじめからCompassがサポートしてくれてるんですけど…
Vim自分用メモ

#### アレどうやってやるんだっけ？と思ってググったらググった内容を追記していく

##### undo,redo
* undo -> u
* redo -> C-r

##### 編集中のファイルのディレクトリにカレントディレクトリを移動
* Kaoriya版 -> :CdCurrent
* 通常 -> :cd %:h

##### キーマクロ
* qa で記録開始。もう一度qで記録終了
* @aで記録したマクロ実行
* 3@aで3回実行
* "a"の部分は他の文字でもOK  
[参考](http://www.webhtm.net/vim/macro.htm)

##### 置換
* %s/target/replace/
* 後ろにgcをつければ置換時確認

##### 改行削除
* :g/^$/d
hashのkeyとvalueを逆にして再度hashにする

# ハッシュのキーと値を逆にして返す

```rb:
def reverse_hash()
  array = {"kumamoto" => 0, "ooita" => 1, "hukuoka" => 2}
  reverse= [array .values, array .keys].transpose
  hash = Hash[*reverse.flatten]
end
```
mac の 各種アプリケーションにて、「開く・保存」ダイアログの状態の時、シンボリックリンクを辿れない時

mac にて、Office やその他アプリケーションを利用していて、保存しようと思った時、シンボリックリンク(やエイリアス,ハードリンク)が半透明になっていて選択出来ない現象に出くわした。

これを回避する(回避になってないけど…)方法のメモ。

## mac の 各種アプリケーションにて、「開く・保存」ダイアログの状態の時、シンボリックリンクを辿れない時の対処法

例えば、/var/www/ を~/Documents/www へと設定している時など。

~/Documents/www/hoge.txt とかに保存したい。

なのに、ダイアログにて、~/Documents を開いている状態で www は半透明になっていて選択できない。

### 「Shift」+「Command」+「G」

これで、任意のパスを入力して指定できる。

なので、表示された入力ボックスに /var/www などと入力してやると、ダイアログが該当ディレクトリを示してくれるようになる。
Crafting Rails4 Reading 第2回に参加しました


http://lingr.com/room/crara4

http://pragprog.com/book/jvrails2/crafting-rails-4-applications

初参加でした。オンライン読書会も初めてでしたが、みんなでワイワイやりながら読めるのはすごく良いなぁと思いました！
参加者のみなさま、ありがとうございました〜


---

今日は "CHAPTER 1 Creating Our Own Renderer" の 1.1 まで。


* `render` メソッドにはオプションを追加できるようになっている
* ruby 用の csv ライブラリ、みなさん大体標準のを使っている様子
* fastercsv は ruby 1.9 から標準ライブラリ化されたよ
* comma というライブラリもある模様 [crafterm/comma](https://github.com/crafterm/comma "crafterm/comma")
* Rails での plugin の作成は `rails plugin new [name]`
* Gemfile は *.gemspec を読み込んでいる
* 基本的には *.gemspec に依存 gem を書いていくが `debugger` やら `pry` のような gem は Gemfile い入れるのが良い
* 生成した rdoc を削除するコマンドは `clobber_rdoc`
* `test/` 以下にテスト用のダミーの Rails アプリケーションがつくられる
* このダミーアプリは Gemfile と lib 以下を読み込むようになっている
* test_helper.rb に `Rails.backtrace_cleaner.remove_silencers!`
* 普段抑制されているログを出力するようにする
* [rails/railties/lib/rails/backtrace_cleaner.rb at master · rails/rails](https://github.com/rails/rails/blob/master/railties/lib/rails/backtrace_cleaner.rb "rails/railties/lib/rails/backtrace_cleaner.rb at master · rails/rails")

次回は 9/2 22時〜
Gist で管理してたレポジトリを Github に持っていくにあたりコミットログを修正する


最初 Gist に貼ってたプログラムを修正していくうち Github にレポジトリを置きたくなったとします。Gist も git レポジトリなので、pull して remote を Github 宛に変えて push すればいいのですが、そのままだとコミットメッセージが空です。

コミットメッセージは `git rebase -i` で修正できますが、以下の問題があります。

- もともとのコミットメッセージが空だと、そのままでは修正できないようです。
- 最初のコミットメッセージは修正できないようです。

`git rebase -i` そのものの使い方は、ここでは書きません。

## 空のコミットメッセージを空でなくする

[Rebasing a git history with empty commit messages](http://stackoverflow.com/questions/8542304/rebasing-a-git-history-with-empty-commit-messages) にあるスクリプトで、空のコミットメッセージを置き換えます。

解答になってる方は、複数行のコミットメッセージが入っているとおかしくなるそうです。その下の lucasmo さんによる Perl スクリプトなら複数行対応。

これで `git rebase -i` で、コミットメッセージを編集できるようになるので、最初以外のコミットメッセージを編集します。

## 最初のコミットメッセージを修正する

[Edit/amend/modify/change the first/root commit in Git?](http://stackoverflow.com/questions/2119480/edit-amend-modify-change-the-first-root-commit-in-git) より。

```
git checkout <sha1-of-initial-commit>
git commit --amend
git rebase --onto HEAD HEAD master
```
WeblogicのGeneric版をインストールするときに、パスに全角文字が含まれるとエラーになる

タイトルの通り。

#環境
##OS
Windows7 64bit

##Java
1.7.0_25

##Weblogic
10.3.6 の Generic 版

#実行例
##全角有りの場所でインストールしようとした場合
```bat:
D:\tmp\うぇぶろじっく>java -jar wls1036_generic.jar
Exception in thread "winRegistry" java.lang.UnsatisfiedLinkError: Expecting an absolute path of the library: jni_winx64
        at java.lang.Runtime.load0(Unknown Source)
        at java.lang.System.load(Unknown Source)
        at com.bea.plateng.common.jni.JNIUtil.loadLibrary(JNIUtil.java:255)
        at com.bea.plateng.common.jni.Win32Registry.<clinit>(Win32Registry.java:20)
        at com.bea.plateng.common.jni.WinRegistryHelper.getRegistry(WinRegistryHelper.java:35)
        at com.bea.plateng.wizard.installer.silent.tasks.WinRegistryTask.execute(WinRegistryTask.java:262)
        at com.bea.plateng.wizard.installer.silent.tasks.WinRegistryTask.run(WinRegistryTask.java:251)
        at java.lang.Thread.run(Unknown Source)
```

##全角無しの場所でインストールすれば問題ない
```bat:
D:\tmp\weblogic>java -jar wls1036_generic.jar
Extracting 0%....................................................................................................100%
※この後インストールウィザードが立ち上がる
```

##半角スペースがある場所でも問題なかった。
```bat:
D:\tmp\weblogic test>java -jar wls1036_generic.jar
Extracting 0%....................................................................................................100%
```

#参考
+ [Expecting an absolute path of the library: jni_... | Oracle Forums](https://forums.oracle.com/thread/2381186)

>special characters

とあるから、全角文字とは限らないかも？　とりあえず、半角英字のみの場所にしとけば間違いはないかと。。。
CarrierWaveでcontent-typeの設定を行う

CarrierWaveを使って画像のアップロードを行うAPIを作成した際に、アプリ側からアップロードされた画像のcontent-typeが"image/jpeg"ではなく、"application/octet-stream"となっており、管理画面で画像を表示しようとすると画像ダウンロードになってしまう現象が発生したので、CarrierWaveで適切なcontent-typeの設定を行うようにしました。

## uploaderに以下を追加

```app/uploaders/resource_uploader.rb

require 'carrierwave/processing/mime_types'

class ResourceUploader < CarrierWave::Uploader::Base
  include CarrierWave::MimeTypes
  process :set_content_type

  ...
end
```
ドキュメントに書いてある内容そのままですが、これで正しくcontent-typeが認識されるようになりました。

また"application/octet-stream"以外の不正確なcontent-typeの場合(例えばIEはCSVを"application/vnd.ms-excel"で送ります)、下記のように記述することによってmime-types gemによる拡張子の判定を行い、設定することが出来ます。

```app/uploaders/resource_uploader.rb

require 'carrierwave/processing/mime_types'

class ResourceUploader < CarrierWave::Uploader::Base
  include CarrierWave::MimeTypes
  process set_content_type: true # 変更箇所

  ...
end
```
## 参考
* [carrierwaveuploader/carrierwave](https://github.com/carrierwaveuploader/carrierwave)
* [Method: CarrierWave::MimeTypes#set_content_type](http://www.rubydoc.info/github/jnicklas/carrierwave/CarrierWave%2FMimeTypes%3Aset_content_type)
コマンドプロンプトで１つ前のフォルダに戻る

Linux のシェルでいうところの `cd -` みたいなことができないのか調べた。

結論は、全く同じことはできないっぽい。

代替手段としては、 `pushd` と `popd` がある。

```bat:
C:\hoge\fuga\piyo>pushd C:\fizz\buzz

C:\fizz\buzz>popd

C:\hoge\fuga\piyo>
```

`pushd <パス>` で __現在のフォルダを記録して__ 、<パス>で指定したフォルダに移動する。

`pushd` の場合は、 `cd` とは違ってドライブの移動が直にできる。

```bat:
C:\hoge>pushd D:\fuga

D:\fuga>
```

複数のフォルダを記録できる。

```bat:
C:\hoge>pushd C:\fuga

C:\fuga>pushd C:\piyo

C:\piyo>popd

C:\fuga>popd

C:\hoge>
```

`pushd` の引数に何も渡さないと、何も記録されない。

```bat:
C:\hoge>pushd

C:\hoge>cd C:\fuga

C:\fuga>popd

C:\fuga>
```

使いやすいかどうかは不明。

#参考
+ [炎のコマンドプロンプト入門/コマンド辞典/ディレクトリ操作コマンド](http://www.geocities.co.jp/SiliconValley-SanJose/1227/directory.html#pushd)
+ `pushd /?`
+ `popd /?`
[iOS] Facebook SDKのSSOボタンをローカライズする

# 追記: 2016/12/15

この記事は[Facebook iOS SDK](https://developers.facebook.com/docs/ios) バージョン3.5.3をもとに書かれており、現在では古い情報になっています。
今日時点でのFacebook iOS SDK最新版では、FacebookログインボタンはUIButtonのサブクラスとなっており、テキストの変更は容易になっています。（@mono0926 さんのコメントを参照）
最新版のSDKをご利用の場合は、公式ドキュメントを参照してください。
https://developers.facebook.com/docs/reference/ios/current/class/FBSDKLoginButton/

---

ドキュメントを見つけられなくてハマッてしまったのでメモ。さっさと[SDK付属のサンプルアプリ](https://github.com/facebook/facebook-ios-sdk/tree/master/samples/Scrumptious)を見ればよかった。。
　
やりたいのは単純に↓みたいにボタンのテキストを日本語にしたいだけ。
![SS](http://bugcloud.com/wp-content/uploads/ss20130819-01.png)
　
　
**Podfile**

```text
platform :ios, '6.1'
pod 'Facebook-iOS-SDK'
```

で
`pod install`した後に、 **Info.plist** に **FacebookAppID** を追加。　
![SS2](http://bugcloud.com/wp-content/uploads/ss20130819-02.png)
　
で、

```objective-c:ViewController.h
//
//  ViewController.h
//  FBSample
//

#import <UIKit/UIKit.h>
#import <FacebookSDK/FacebookSDK.h>

@interface ViewController : UIViewController <FBLoginViewDelegate>
@end
```

```objective-c:ViewController.m
//
//  ViewController.m
//  FBSample
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    FBLoginView *loginBtn = [[FBLoginView alloc] initWithFrame:CGRectMake(
                                                                          self.view.frame.size.width / 2 - 154,
                                                                          self.view.frame.size.height / 2 - 22,
                                                                          308,
                                                                          44)
                             ];
    loginBtn.readPermissions = @[@"basic_info"];
    loginBtn.delegate = self;
    [self.view addSubview:loginBtn];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

@end
```
　
のように **FBLoginView** を追加すると、シングルサインオンボタン（SSOボタン）が表示される。英語テキストで。
　
![SS3](http://bugcloud.com/wp-content/uploads/ss20130819-03.png)
　
英語テキストの方がかっこいいのでまったくもってこのままでいいんだけど、まー仕事だとそうもいかないので、これを日本語テキストに変更する。

`[loginBtn.label setText:@"Facebookログイン"];`

とかできてもよさそうなのに、そんなメソッドは用意されていなくて、 **Settings Bundleを追加してそこで上書かないといけない。**
　
Facebookのサンプルアプリ [Scrumptious](https://github.com/facebook/facebook-ios-sdk/tree/master/samples/Scrumptious)から **FacebookSDKOverrides.bundle** をコピーして **Info.plist** を編集。
**FacebookBundleName** に **FacebookSDKOverrides** を設定する。
　
![SS4](http://bugcloud.com/wp-content/uploads/ss20130819-04.png)
　
コンソールで
`cp -r FacebookSDKOverrides.bundle/en.lproj FacebookSDKOverrides.bundle/ja.lproj`
　
あとは **FacebookSDKOverrides.bundle/ja.lproj/Localizable.strings** を以下のように編集すれば晴れて日本語化される。

```text
/* FBLoginView (aka FBLV) */
"FBLV:LogOutButton" = "ログアウト";
"FBLV:LogInButton" = "Facebookでログイン";
"FBLV:LoggedInAs" = "%@ でログイン中";
"FBLV:LoggedInUsingFacebook" = "Facebookでログインしました";
"FBLV:LogOutAction" = "ログアウト";
"FBLV:CancelAction" = "キャンセル";
```
　
**Localizations** の追加もお忘れなく。

![SS5](http://bugcloud.com/wp-content/uploads/ss20130819-05.png)
zsh で無名関数を作る

あまり知られていないと思うんだけど、zsh には無名関数を作ってすぐに実行する機能がある。JavaScript で言うところの `(function() { /* ... */ }());` と同じやつ。これを使うと一時的な変数を作ってグローバルな領域を汚さないように出来るので紹介する。

### 書き方
書き方は簡単で、普通の関数定義の関数名の部分を省略すればOK。zsh の関数定義はいくつか書き方があるので、無名関数の書き方もその分だけある。

具体的には以下の通り。

```zsh
() {
  # 何か処理
  # local var1 とか
}
```

または

```zsh
function {
  # ...
}
```

または

```zsh
function() {
  # ...
}
```

これで「無名関数を定義してすぐに実行する」という動作になる。

無名関数の中で `local` を付けるとその関数内だけで有効な変数になるので、一時的な変数を使いたい時に便利。グローバルな変数名とかぶったとしてもローカルな変数が優先されるので大丈夫。

```zsh
variable="outside"
() {
  local variable="inside"
  echo "var = $variable"
}
echo "var = $variable"

# => var = inside
# => var = outside
```

### 使い方の例
例えば zshrc でディレクトリの存在チェックをするときとかに利用できる。

```zsh
# ~/path/to/dir ディレクトリが存在しないときは作成する
() {
  local dir_path=~/path/to/dir
  if [[ ! -d "$dir_path" ]]; then
    mkdir -p $dir_path
  fi
}
```

パスを何回も直書きしなくてすむし、その後変な変数が残ったりしないので便利。

### 引数を渡す
括弧の後ろに書いて引数を渡すこともできる。こんな感じ。

```zsh
() {
  echo $1 $2
} Hellow World

# => Hellow World
```


詳しくは man zshmisc(1) の ANONYMOUS FUNCTIONS を参照。
tozero.c

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

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

int solve(const char * const input)
{
  int i, n = atoi(input);
  for(i=0; n!=0; i++) {
    n = (n%2==0) ? n>>1:
        ((n+1)%4==0 && n!=3) ? n+1: n-1;
  }
  return i;
}

void test(const char * const input, const char * const ans)
{
  const int result = solve(input);
  printf("%d\t%s\n", result, (atoi(ans) == result) ? "OK": "NG");
}

int main()
{
/*0*/ test( "59", "9" );    
/*1*/ test( "10", "5" );    
/*2*/ test( "11", "6" );    
/*3*/ test( "12", "5" );    
/*4*/ test( "13", "6" );    
/*5*/ test( "14", "6" );    
/*6*/ test( "15", "6" );    
/*7*/ test( "16", "5" );    
/*8*/ test( "17", "6" );    
/*9*/ test( "18", "6" );    
/*10*/ test( "27", "8" );    
/*11*/ test( "28", "7" );    
/*12*/ test( "29", "8" );    
/*13*/ test( "30", "7" );    
/*14*/ test( "31", "7" );    
/*15*/ test( "32", "6" );    
/*16*/ test( "33", "7" );    
/*17*/ test( "34", "7" );    
/*18*/ test( "35", "8" );    
/*19*/ test( "41", "8" );    
/*20*/ test( "71", "9" );    
/*21*/ test( "1023", "12" );    
/*22*/ test( "1024", "11" );    
/*23*/ test( "1025", "12" );    
/*24*/ test( "1707", "17" );    
/*25*/ test( "683", "15" );    
/*26*/ test( "123", "10" );    
/*27*/ test( "187", "11" );    
/*28*/ test( "237", "12" );    
/*29*/ test( "5267", "18" );    
/*30*/ test( "6737", "18" );    
/*31*/ test( "14796", "20" );    
/*32*/ test( "18998", "20" );    
/*33*/ test( "23820", "20" );    
/*34*/ test( "30380", "21" );    
/*35*/ test( "31119", "21" );    
/*36*/ test( "33301", "20" );    
/*37*/ test( "33967", "21" );    
/*38*/ test( "35443", "22" );    
/*39*/ test( "35641", "22" );    
/*40*/ test( "43695", "23" );    
/*41*/ test( "44395", "23" );    
/*42*/ test( "44666", "22" );    
/*43*/ test( "987", "14" );    
/*44*/ test( "1021", "13" );    
/*45*/ test( "1019", "13" );    
/*46*/ test( "1015", "13" );    
/*47*/ test( "1007", "13" );    
/*48*/ test( "1011", "14" );    
/*49*/ test( "1003", "14" );    
/*50*/ test( "983", "14" );    
/*51*/ test( "999", "14" );    
/*52*/ test( "2731", "18" );    
/*53*/ test( "6827", "20" );    
/*54*/ test( "10923", "21" );    
/*55*/ test( "27307", "23" );    
/*56*/ test( "43691", "24" );    
/*57*/ test( "109227", "26" );    
/*58*/ test( "174763", "27" );
  return 0;
}
```
カスタム権限を持ったユーザを投稿者で選べるようにする

'author'をサポートしたカスタム投稿の編集画面には、セレクトボックスで投稿者を選択できるウィジェットが表示される。

このセレクトボックスに表示するユーザの一覧、どうもauthor相当のuser_levelを持っているかで抽出されているらしく、いろいろ独自に権限をカスタムしたユーザ（例えばカスタム投稿用に作ったロールのみを持ったユーザとか）だと、ドロップボックスに出ない。

検索条件を変えるfilterも見つからなかったので、ユーザ情報の編集画面のactionで、特定の権限の時に、author相当のuser_levelを設定するようにした。

```php:
if( current_user_can('edit_user', $user_id) ) {
  if( $_POST['role'] == "author相当のカスタム権限" ) {
    update_user_meta($user_id, $wpdb->prefix . 'user_level', 1);
  }
}
```

上のコードを、edit_user_profile_updateのアクションフックに設定。

悪影響がありそうな気もするが、とりあえずは動く。
nginxでtry_filesを使ってフロントコントローラにCleanURLを渡す

今更ながらnginx＋vagrantをはじめてみました。

nginxにはApacheのmod_rewrite相当のことを設定ファイルで書くようです（Apacheでも設定ファイルに書けます）。

フロントコントローラ型フレームワークで

http://example.com/aaa/bbb/ccc

のようなURL（CleanURL）を扱う場合、Apacheのmod_rewriteでURLの書き換えを行うわけですが、同様のことをnginxでする場合は、設定ファイルに以下のように記述すればいいようです。

```
server {
    location / {
        try_files $uri $uri/ /index.php?$request_uri;
    }
}
```

上記の例では、index.phpに対して「aaa/bbb/ccc」がREQUEST_URIとして渡されます。
【HTML】footerを常に最下部にする方法

今回はfooterを常に最下部に表示させる方法です。

これまたよくある話だけど、いつもスムーズにできずに時間がかかってしまう。

```html:
<!DOCTYPE html>
<html>
<head>
    <style type="text/css">
    html, body {
        width: 100%;
        height: 100%;
        margin: 0;
    }
    #container {
        position: relative;
        width: 100%;
        
        /* コンテンツ部分の高さが画面に収まらない場合はコンテンツの高さに合わせる*/
        height: auto !important;

        /* コンテンツ部分の高さが画面より低い場合は画面の高さに合わせる*/
        height: 100%;
        min-height: 100%;
        background-color: blue;
    }
    #header {
        width: 100%;
        height: 40px;
        background-color: green;
    }
    #contents {
        width: 100%;
        height: 100px;
        background-color: yellow;
        padding-bottom: 40px;
    }
    #footer {
        /* containerからの絶対位置を定義 */
        position: absolute;
        bottom: 0;
        width: 100%;
        height: 40px;
        background-color: red;
    }
    </style>
</head>
<body>
    <div id="container">
        <div id="header">header</div><!-- /#header-->
        <div id="contents">contents</div><!-- /#contents-->
        <div id="footer">footer</div><!-- /#footer -->
    </div><!-- /#container-->
</body>
</html>
```
サイコロクラス

サイコロクラスを実装してみた
まだ動作は未確認、動くかな？

class srd::ostream;辺りが怪しい・・・

後出来ればmEngineをrandom_deviceで初期化したいんだけどいい案は無いか・・・
出来ればイニシャライズリストでやりたいなーなんて

追記　初期化できたのでそのように修正

ヘッダー

```cpp:Dice.h
#ifndef _DICE_H_
#define _DICE_H_

#include <random>
#include <vector>

namespace std{
	template<typename _Ty>
	class  basic_ostream<_Ty>;
}

class Dice{
public:
	typedef typename std::vector<int> rollData_t;
	Dice();
	Dice(int num,int surface);
	virtual ~Dice(){}
	
	int roll();
	int roll(std::ostream& ost);
	int roll(int num,int surface);
	rollData_t getRollData()const;
	void setDice(int num,int surface);
private:
	int generate();
private:
	std::mt19937 mEngine;
	std::uniform_int_distribution<int> mDistribution;
	rollData_t mData;
};
#endif
```

cppファイル

```cpp:Dice.cpp
#include "Dice.h"

#include <algorithm>

Dice::Dice():
	mEngine(std::random_device()),
	mDistribution(1,6),
	mData(1)
{}


Dice::Dice(int num,int surface):
	mEngine(std::random_device()),
	mDistribution(1,surface),
	mData(num)
{}


int Dice::generate(){
	return mDistribution(mEngine);
}

int Dice::roll(){
	std::for_each(mData.begin(),mData.end(),[&](int& elem){ return elem = generate();});
	int sum=0;
	std::for_each(mData.begin(),mData.end(),[&](const int elem){return sum+=elem;});
	return sum;
}

int Dice::roll(std::ostream& ost){
	int res = roll();
	std::for_each(
		mData.begin(),
		mData.end(),
		[&](int elem){ost<<"["<<elem<<"]";});
	return res;
}
int Dice::roll(int num,int surface){
	int result = 0;
	std::uniform_int_distribution<int> dist(1,surface);
	for(int i=0;i<num;i++)
		result+=dist(engine);
	return result;
}


void Dice::setDice(int num,int surface){
	mDistribution = std::uniform_int_distribution<int>(1,surface);
	mData = rollData_t(num);
}


Dice::rollData_t Dice::getRollData()const{
	return mData;
}


```
Macにお話させる

Macのsayコマンドで

```
say 'hello'
```

とやると、ちゃんとした発音でヘェロゥと喋ってくれますが、最近は日本語にも対応しているようです。

「システム環境設定」から「スピーチ＞テキスト読み上げ＞システムの声」のドロップダウンで「カスタマイズ…」を選んで日本語のKyokoをチェックし、OKするとダウンロード＆インストールされます。

インストールが終わると、Kyokoがデフォルトになっていると思いますので、

```
say 'こんにちは'
```

で、コンニチワと喋ってくれます。

ただ、Alex君と違って英語は下手なようで、helloはハロオって片言だけど元気よくしゃべりました。

英語はAlexくんやSamanthaさんに任せたほうがよさそうですね。

```
say -v Alex 'hello'
```

<blockquote class="twitter-tweet"><p>macの人、デプロイするときはこのコマンドおすすめです -&gt; say -v Kyoko &quot;デプロイおねがいします&quot;</p>&mdash; 1500kcal/day (@yuroyoro) <a href="https://twitter.com/yuroyoro/statuses/369351024009437185">August 19, 2013</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

なるほど！

```
cap deploy; say -v Kyoko 'デプロイ終わりました'
```

っていうのもいいですねｗ
Fragmentをshowする際に何か処理をしたい場合


FragmentTransaction#showを実行しても表示するFragmentのonStart/onResumeは呼ばれないので色々試したところonCreateOptionsMenuならshowでも呼び出される事を発見。
下のようなFragmentを実装しました。これで大丈夫だと思う、多分

```java
public class HogeFragment extends Fragment {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setHasOptionsMenu(true); // onCreateOptionsMenuが呼ばれる為に必要
	}

	@Override
	public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
		super.onCreateOptionsMenu(menu, inflater);

		// showの際にやりたい処理を書く..
		setTitle();
	}

	private void setTitle() {
		// ActionBarのタイトルを設定
		ActionBar ab = getActivity() != null ? getActivity().getActionBar() : null;
		if (ab != null) {
			ab.setTitle(R.string.hoge_title);
		}
	}
}
```
Yesodのcabal-devを利用したインストールでyesod-ghc-wrapperがどうとか言われる人へ


## そもそものインストール方法

```bash
cabal-dev install --sandbox=$HOME/cabal-dev/yesod/ yesod-bin
~/cabal-dev/yesod init hoge
cd hoge
cabal-dev install-deps
~/cabal-dev/yesod --dev dev
```

これだけで開発出来るはずなのに表題の奴が出る。

## 答え

**yesodを$PATHに通したらyesod-xx-wrapperも通せ**。

## 疑問点

yesodをフルパスで呼び出せば問題はないのか?と思ったのですが、試すのが億劫なのでしていません。
OS XでIntelliJ系IDEにターミナルで開くメニューを追加する


Android StudioなどIntelliJ系IDEでSublime Text 2のTerminalプラグインである **Open Terminal Here…** を使いたくなったのでやってみました。

terminal.sh を Sublime Text 2のTerminalプラグインから拝借します。以下の内容をホームディレクトリなど適当な場所に保存してください。 ``chmod u+x terminal.sh `` で実行権限も付与。

```sh:terminal.sh
#!/bin/bash

CD_CMD="cd "\\\"$(pwd)\\\"" && clear"
VERSION=$(sw_vers -productVersion)
if (( $(expr $VERSION '<' 10.7.0) )); then
  IN_WINDOW="in window 1"
fi
osascript<<END
try
  tell application "System Events"
    if (count(processes whose name is "Terminal")) is 0 then
      tell application "Terminal"
        activate
        do script "$CD_CMD" $IN_WINDOW
      end tell
    else
      tell application "Terminal"
        activate
        do script "$CD_CMD"
      end tell
    end if
  end tell
end try
END
```

Preference > External Tools から以下のように追加します

|名前|値|
|:---|:---|
|Name|Open Terminal Here…|
|Group|Terminal|
|Description|Open Terminal Here|
|Synchronize files after execution|チェック外す|
|Open console|チェック外す|
|Showin|Project viewsのみチェック|
|Program|借したterminal.sh|
|Working directory|$FileDir$|

![2013-08-18_0244.png](https://qiita-image-store.s3.amazonaws.com/0/2435/a764abf6-c58a-94e6-60d5-9becac3ac486.png "2013-08-18_0244.png")


これでプロジェクトビューの右クリックメニューから実行できます。
ChromeCastのSender(Chrome)とReceiverを実装して任意のURLをテレビに表示させる

![ChromeCast Image](http://wired.jp/wp-content/uploads/2013/07/chrome-660x416.jpg)

# ドキュメント

* [Casting Your Content to the Big Screen - Google Cast — Google Developers](https://developers.google.com/cast/)

# 下準備
1. ChromeCastがTVで見られるようになっている
2. インストールしたChromeCastのアプリケーションを再び開き、端末の「Setting」に進み「Privacy」のところにある「Send this Chromecast's serial number when checking for updates」をOnにしておく

# SenderとReceiver
Senderはリクエストオブジェクトを送信することで、Recever側のCast端末で受信し指定のURLを開きます。

```js:Sender
var castApi = cast.Api();
var request = new cast.LaunchRequest(APP_ID, receiver); 
castApi.launch(request, onLaunch); 
```
```js:Receiver
var receiver = new cast.receiver.Receiver(APP_ID, ['Test'], "", 5);
receiver.start();
```

# APP-IDの発行
現在GoogleCast SDKはベータ版でホワイトリスト方式を採用しています。
そのためSenderからリクエストするのに必要なAPP-IDの発行をGoogleに要求する必要があります。

https://docs.google.com/forms/d/1E-vka5QP8LkF0nbfz-omN1DjNSX1uLGyqHdbpEFh6zg/viewform

上記リンクが切れていたら以下のページから「Request Whitelisting」に遷移。
https://developers.google.com/cast/whitelisting#whitelist-receiver

最低限必要な情報は

* メールアドレス
* ChromeCastのシリアル番号（端末背面に記載）
* Receiver URL(端末にリクエストが送られてきた時に開くURL)

# コード

```html:Sender
<html data-cast-api-enabled="true">
<head>
<script>
var cast = cast || {}
var cast_api, cv_activity;

var APP_ID = "YOUR APP ID"

var doLaunch = function(receiver) {
  var request = new cast.LaunchRequest(APP_ID, receiver);
  cast_api.launch(request, onLaunch);
};

var onLaunch = function(activity) {
  console.log(activity);
  if (activity.status == "running") {
    cv_activity = activity;
  } else if (activity.status == "error") {
    cv_activity = null;
  }
};

var onReceiverList = function(list) {
  // If the list is non-empty, show a widget with
  // the friendly names of receivers.
  // When a receiver is picked, invoke doLaunch with the receiver.
  console.log(list);
  doLaunch(list[0]);};

function initializeApi(){
  cast_api = new cast.Api();
  cast_api.addReceiverListener("YouTube", onReceiverList);
}

if (cast && cast.isAvailable) {
  // Cast is known to be available
  initializeApi();
} else {
  // Wait for API to post a message to us
  window.addEventListener("message", function(event) {
    console.log("message");
    console.log(event.data);
    if (event.source == window && event.data && 
        event.data.source == "CastApi" &&
        event.data.event == "Hello")
      initializeApi();
  });
};
</script>
</head>
<body>
</body>
</html>
```

```html:Receiver
<html>
  <title>Hello Chromecast</title>
  <link href='http://fonts.googleapis.com/css?family=Droid+Sans' rel='stylesheet' type='text/css'>
  <style>body { font-family: 'Droid Sans', Helvetica; font-size: 3em; text-align: center; color: white; margin: 5%;}</style>
  <script src="https://www.gstatic.com/cast/js/receiver/1.0/cast_receiver.js"></script>
  <script type="text/javascript">
    var castAppId = 'YOUR APP ID';
    var receiver = new cast.receiver.Receiver(castAppId, ['Test'], "", 5);
    receiver.start();
  </script>
  <body>
    <h1>Google Cast Receiver</h1>
    <h2>Hello Chromecast</h2>
  </body>
</html>
```
CentOS 6.4 で python から MySQL につなぐ

必要なモジュールをインストールします。

```
$ sudo yum -y install python-setuptools
$ sudo yum -y install python-devel
$ sudo easy_install pip
$ sudo pip install MySQL-python
```

テストしてみます

```py:mysql_test.py
import MySQLdb

connection = MySQLdb.connect(db="python_test", user="root")
cursor = connection.cursor(cursorclass=MySQLdb.cursors.DictCursor)
cursor.execute("select * from users")
result = cursor.fetchall()

print(result)

cursor.close()
connection.close()
```

結果：

```
$ python mysql_test.py
({'id': 1L, 'name': 'user1'}, {'id': 2L, 'name': 'user2'})
```
UITableViewCellのインジケーターカスタマイズ

UITableViewCellのインジケーターをカスタマイズする方法。

```objc:hoge.m
UIImage *img = [UIImage imageNamed:@"MyIndicator.png"];
UIImageView *imgv = [UIImageView alloc] initWithImage:img];
cell.accessoryView = imgv;
```
Emacsのビープ音を消したい

ヘッドホンを付けて集中したい時など、ビープ音が邪魔な時ってありますよね。

```el:init.el
;; 警告音の代わりに画面フラッシュ
;; (setq visible-bell t)

;; 警告音もフラッシュも全て無効(警告音が完全に鳴らなくなるので注意)
(setq ring-bell-function 'ignore)
```

私的には後者が好み。 

参考文献: [Emacs Lisp TIPS - ビープ音を消す](http://th.nao.ac.jp/MEMBER/zenitani/elisp-j.html#bell)
行を移動するときに，カーソルが置かれる列を固定したい

set-goal-column (C-x C-n) を使うと，行を移動したときにカーソルが置かれる位置を固定することができます(解除は C-u C-x C-n)．

これがどういうときに役に立つのか．例えば，以下のような文書があるとします．

```
first,,third
first,,third
first,,third
first,,third
```

この文書を編集して，以下のような文書にしたいと考えています．

```
first,second,third
first,second,third
first,second,third
first,second,third
```

そのとき，second を入力していくためには (yank を使うにしても) 行を移動した後 "," の間までカーソルを戻さないといけません．

そんなときに set-goal-column です．1行めの "," の間で C-x C-n を入力すれば，second を記述後に C-n を入力すると次の行の "," の間にカーソルが移動するようになります．

まあ，この例のように同じ文字列を入力するなら矩形編集を使った方がいいでしょうが，今後の文書編集でカーソルの列を固定すると便利な場面があるかもしれません．そんなときは是非，この隠れた(?)機能を使ってあげてください．
JavaSE 環境でCDI（Weld）を使う

CDI のリファレンス実装である Weld を使って、 JavaSE 環境上で CDI を使う方法をメモする。

#環境
##OS
Windows7 64bit

##Java
1.7.0_25

##Weld
1.1.10.Final

#準備
##Weld の入手
Weld の jar ファイルをダウンロードする。
jar は[公式サイト](http://www.seamframework.org/Weld/WeldDistributionDownloads)からダウンロードできる。

#実装
##weld-se.jar をクラスパスに追加する
ダウンロードした zip ファイル（weld-1.1.10.Final.zip）を解凍したら、`weld-1.1.10.Final\artifacts\weld\weld-se.jar` をクラスパスに追加する。

この jar に必要なライブラリとかが全部入っているらしい。中を見ると、 javassist とかが入ってる。

##beans.xml の配置
クラスパスが通っている場所に `META-INF` というフォルダを作成し、 `beans.xml` というファイルを作成する。
ファイルは作るだけで、中は空で良い。

これは CDI の仕様上必要なファイルで、このファイルがあると CDI が有効になる。多分。

##Java の実装
簡単な Hello World を実装してみる。

```java:MyApplication.java
package cdi;

import javax.inject.Inject;

import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;

public class MyApplication {
    
    public static void main(String[] args) {
        Weld weld = new Weld();
        WeldContainer container = weld.initialize();
        MyApplication application = container.instance().select(MyApplication.class).get();
        application.run();
        weld.shutdown();
    }
    
    @Inject
    private Speaker speaker;
    
    public void run() {
        this.speaker.speak();
    }
}
```

```java:Speaker.java
package cdi;

public interface Speaker {
    void speak();
}
```

```java:EnglishSpeaker.java
package cdi;

public class EnglishSpeaker implements Speaker {
    
    @Override
    public void speak() {
        System.out.println("Hello World!!");
    }
}
```

```:実行結果
Hello World!!
```

###説明
```java:MyApplication.java
public class MyApplication {
    
    public static void main(String[] args) {
        Weld weld = new Weld();
        WeldContainer container = weld.initialize();
        MyApplication application = container.instance().select(MyApplication.class).get();
        application.run();
        weld.shutdown();
    }
}
```

Java SE 環境で CDI（Weld）を使用する場合は、最初に Weld のコンテナを初期化する。
ここでは、 MyApplication の main メソッドでコンテナの初期化をしている。

コンテナの初期化は、 Weld#initialize() メソッドで実行。
取得した WeldContainer から、 MyApplication クラスのインスタンスを取得し、その後の処理を実行している。
最後は Weld#shutdown() メソッドでコンテナを終了させる。

##Eclipse プロジェクトの様子
![cdi-se-eclipse.jpg](https://qiita-image-store.s3.amazonaws.com/0/28302/c4809d14-66a5-172c-217d-ee5a4e83ec1f.jpeg)

#参考
+ [公式サイトのリファレンス](http://docs.jboss.org/weld/reference/1.1.5.Final/en-US/html/environments.html#d0e5335)
+ [CDI in Java SE | Random Ramblings](http://randling.wordpress.com/2011/08/15/cdi-in-java-se/)
git filter-branchで大事なデータを消去・上書き


gitのコミットの中からパスワードや個人情報等の大事なデータが含まれたものを除去したいときは `git filter-branch` を使うと便利らしいです。

```
localhost:example noguchiwataru$ git filter-branch -f --tree-filter 'cp -f /Users/noguchiwataru/Desktop/dummy.png img/confidential.png'
Rewrite 2f712b995fa92c8c1bdadaefd21316ffb2ae9eb7 (9/9)
Ref 'refs/heads/master' was rewritten
```

オブジェクトがローカルに残っているので `gc` で抹消します。

```
localhost:example noguchiwataru$ git gc
Counting objects: 6571, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4809/4809), done.
Writing objects: 100% (6571/6571), done.
Total 6571 (delta 1662), reused 6544 (delta 1645)
```

ここでは大事な文字が画像に書き込まれていたというシーンを想定して特定のディレクトリから画像をコピーして上書きしています。削除したいときはrmすればいいと思います。

内部的にはfilterで指定した内容で作業ツリーを書き換えた後にそれぞれのコミットについて再度コミットをかけているようです。

あとはpushするだけですが、再コミットしている段階でリモートブランチと作業ツリーの内容は完全に別物のハッシュになっているので

```
localhost:example noguchiwataru$ git push
To git@github.com:wnoguchi/example.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:wnoguchi/example.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

そのままではコンフリクトしてpushできません。なので、`-f`オプションをつけて強制的にリモートブランチを上書きしています。

```
localhost:example noguchiwataru$ git push -f
Counting objects: 6531, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4786/4786), done.
Writing objects: 100% (6531/6531), 52.51 MiB | 1.71 MiB/s, done.
Total 6531 (delta 1628), reused 6531 (delta 1628)
To git@github.com:wnoguchi/example.git
 + 2f712b9...0b6cfa9 master -> master (forced update)

```

以上で完了。

## 参考サイト

- [Git - 歴史の書き換え](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E6%AD%B4%E5%8F%B2%E3%81%AE%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88)
- [git最強のオプション filter-branch - CubicLouve](http://spring-mt.tumblr.com/post/25934691482/git-filter-branch)
warning: push.default is unset への対応


```
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:

  git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

  git config --global push.default simple

See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)

```

[Git 2.0でpush.defaultのデフォルト値がmatchingからsimpleに変わった - Humanity](http://d.hatena.ne.jp/tyru/20130105/git_push_default)

`simple` のほうが安全らしいので以下のようにして解決。

```
git config --global push.default simple
```
Mac でアプリ内のウインドウ切り替え

標準で `Command` + `F1` が割り当てられています。

Windows から入ってくると `Command` + `Tab` が「ウインドウ切り替えではなくアプリ切り替えである」ということに驚愕して思考停止して、アプリ内ウインドウ切り換えの存在まで意識が回らなかったりするので、メモ。ちなみに自分も忘れやすい。

`Command` + `Tab` で該当のアプリアイコンが選択されているとき、`Up` または `Down`キーでそのアプリのウインドウをExpose で表示できるけれども、手元の Mountain Lion だとウインドウサムネイルの選択切り換えがちゃんと機能しなかった…。
演算子を関数にする関数

うう、日本語がややこしい。

JavaScriptを関数型的に使いたい時に結構役に立つ。ついでにカリー化。

```js:op2fn.js
function curry (fn) {
  return function curried() {
    var
    args = Array.prototype.slice.call(arguments, 0);
    return args.length >= fn.length ? fn.apply(this, arguments)
      : function () {
        return curried.apply(this, args.concat(Array.prototype.slice.apply(arguments)));
      };
  };
}
function op(o) {
  return curry(Function('x, y', 'return x ' + o + 'y;'));
}
```

使い方。

```js:op2js-usage.js
var
xs = [1,2,3,4,5];

console.log(xs.reduce(op('*'))); //=> 120
console.log(xs.map(op('+')(10))); //=> [11,12,13,14,15]
```

カリー化されてるからmapにも渡せる。
一定の基準をもったテスト

## 基本ソース

```java:

import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class ParameterizedTest {

	@Parameters
	public static final List<Object[]> parameters() {
		return Arrays.asList(new Object[][] {
				{ 1, 2, 3 },
				{ 2, 3, 5 },
		});
	};

	int a;
	int b;
	int c;

	public ParameterizedTest(int a, int b, int c) {
		this.a = a;
		this.b = b;
		this.c = c;
	}

	@Test
	public void test() {
		assertEquals(a + b, c);
	}

}
```

## 例外チェックする場合

```java:
package jp.mirageworld.webapps.util;

import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class ParameterizedTest {

	@Parameters
	public static final List<Object[]> parameters() {
		return Arrays.asList(new Object[][] {
				{ 1, 2, 3, "X", NumberFormatException.class },
				{ 2, 3, 5, "0", null },
		});
	};

	int a;
	int b;
	int c;
	String n;
	Class<?> clazz;

	public ParameterizedTest(int a, int b, int c, String n, Class<?> clazz) {
		this.a = a;
		this.b = b;
		this.c = c;

		this.n = n;
		this.clazz = clazz;
	}

	@Test
	public void test() {
		try {
			assertEquals(a + b, c);
			Long.parseLong(n);
			assertNull(clazz);
		} catch (Exception e) {
			assertEquals(e.getClass(), clazz);
		}
	}

}

```
オフラインどう書く13回参考問題回答例 ( scala )

```scala:
import scala.collection.mutable._

object Hena {
  def solve(src:String):String = { 
    val n = src.toInt
    var s = Set[Int](0)
    var ans = 0 
    while(s.size != 0)
    {   
      var q = Queue[Int]()
      q = s.to
      s.clear()
      while(q.size != 0)
      {   
        val m = q.dequeue
        n == m match {
          case true => return ans.toString
          case _ => s ++= Set(m+1, m-1, m*2).filter(0 <= _)
        }   
      }   
      ans += 1
    }   
    ans.toString
  }

  def test(src:String, expected:String) = { 
    val actual = solve(src)
    println(if(expected == actual) "ok" else "***NG***")
  }

  def main(args:Array[String]) = {
    /*0*/ test( "59", "9" );
    // 以下略
  }
}
```
IllustratorのAIファイルを直接LaTeXに貼り付ける


## 環境

* MacTeX (30 May 2013)
* Illustrator CS6

~~~
$ platex --version
e-pTeX 3.1415926-p3.4-110825-2.6 (utf8.euc) (TeX Live 2013)
kpathsea version 6.1.1
ptexenc version 1.3.1

$ dvipdfmx --version
This is dvipdfmx-20130405 by the DVIPDFMx project team,
modified for TeX Live,
an extended version of dvipdfm-0.13.2c developed by Mark A. Wicks.
~~~

## 方法

Illustratorで普通に図を作成。ドキュメント設定で単位をmmではなくピクセルにすべしという記事もあったが、自分の環境ではどちらでもOKだった。

作成したAIファイルを`includegraphics`で貼り付ける。

~~~tex
\usepackage[dvipdfmx]{graphicx}
…
\includegraphics{hoge.ai}
~~~

`[dvipdfmx]`オプションがないと、PDFを生成したときに図の位置がずれた。

## 参考

* [チュートリアル/Illustratorの図をTeXに - MyTeXpert](http://mytexpert.sourceforge.jp/index.php?%A5%C1%A5%E5%A1%BC%A5%C8%A5%EA%A5%A2%A5%EB%2FIllustrator%A4%CE%BF%DE%A4%F2TeX%A4%CB)
* [Illustrator で作った図を .ai ファイルのまま LaTeX に埋め込む - 作業ログとかをメモする場所。 - mkdirグループ](http://mkdir.g.hatena.ne.jp/ymrl/20121201/1354389731)
* [Illustrator - TeX Wiki](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Illustrator#sa00c636)
第13回オフラインリアルタイムどう書くの参考問題をRubyで解く

問題はこちらのリンクから。
http://qiita.com/Nabetani/items/89fb0e2e712d4b396535

全探索なので遅いです。

```rb:
def solve(q)
  target = q.to_i
  done = {0=>0}
  cur = [0]
  (1..target).each{|nest|
    nxt = []
    cur.each{|num|
      if done[num - 1].nil?
        done[num - 1] = nest
        nxt << num - 1
      end
      if done[num + 1].nil?
        done[num + 1] = nest
        nxt << num + 1
      end
      if done[num * 2].nil?
        done[num * 2] = nest
        nxt << num * 2
      end
    }
    return nest if nxt.include?(target) 
    cur = nxt
  }
  -1
end

DATA.readlines.each do |line|
  no,q,a,*s = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans.to_s
  puts ans == a.to_i ? ' o' : ' x'
end
__END__
0	59	9	 +1 ×2 ×2 ×2 ×2 -1 ×2 ×2 -1
1	10	5	 +1 +1 ×2 +1 ×2
2	11	6	 +1 ×2 ×2 +1 ×2 +1
```
Google Static Maps APIで取得した地図画像の経緯度を調べる方法

##Google Static Maps APIに、表示範囲の経緯度を取得できるAPIが無い
　表示範囲の経緯度情報はGoogle Maps JavaScript APIでは、`google.maps.LatLngBounds`classから`getNorthEast()`や`getSouthWest()`を呼ぶことで簡単に取得可能な情報です。

　簡単に取得できる情報ですが、Google Static Maps APIにはありません。代替手段としては、[Yahoo!スタティックマップAPI](http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/static.html "Yahoo!スタティックマップAPI")を使うことで解決可能です。出力設定でXMLを指定することで、表示範囲の経緯度情報を取得可能です。その場合、地図画像とXML情報の2回リクエストを投げる必要があります。

　代替手段は、無いことはないのです...

##それでもGoogle Static Mapsの表示範囲の経緯度を知りたい！
　何度見ても、Google Static Maps APIに経緯度取得APIが無いので、[グーグルマップ（Google Maps） の座標間変換式について（１）](http://hosohashi.blog59.fc2.com/blog-entry-5.html"グーグルマップ（Google Maps） の座標間変換式について（１）")の記事に書かれている変換式を利用することで、経緯度情報を入手可能です。
　この記事を書かれた方は、[RgoogleMaps: Overlays on Google map tiles in R](http://cran.r-project.org/web/packages/RgoogleMaps/"RgoogleMaps: Overlays on Google map tiles in R")のドキュメントを参考にしたそうです。

##経緯度情報取得...
　先ほど紹介したサイトの（７）と（８）の式を利用します。これは、取得した地図画像の中心経緯度、ズームサイズと取得したい画像のピクセル位置を式に代入することで、該当する画像のピクセル位置の世界測地系経緯度情報を求められる式です。
　Javaでコードを書きました。

```java:getGoogleMapsInfomation
int zoom;//取得した画像のズームレベル
int imgXpx,imgYpx;//取得した画像のピクセルサイズ, x座標方向,y座標方向
double this.c_lng, this.c_lat;//取得した画像の中心経緯度
/**
*Google Static Mapsで取得した画像の4辺の経緯度情報を取得する
*/
public void setMapRange() {
        this.img_min_lng = (180 / Math.pow(2, this.zoom + 7)) * ((this.imgXpx / 2) * -1) + this.c_lng;
        this.img_min_lat = (180 / Math.PI) * Math.asin(Math.tanh((Math.PI / Math.pow(2, this.zoom + 7)) * ((this.imgYpx / 2) * -1) + meaAtanh(Math.sin((Math.PI / 180) * this.c_lat))));
        this.img_max_lng = (180 / Math.pow(2, this.zoom + 7)) * (this.imgXpx / 2) + this.c_lng;
        this.img_max_lat = (180 / Math.PI) * Math.asin(Math.tanh((Math.PI / Math.pow(2, this.zoom + 7)) * (this.imgYpx / 2) + meaAtanh(Math.sin((Math.PI / 180) * this.c_lat))));

    }
/**
*javaのMath.classにタンジェントアークを求めるメソッドが無いので、簡単に実装
*/
private double meaAtanh(double x) {
        return 0.5 * Math.log((1.0 + x) / (1.0 - x));
    }
````

##無事経緯度情報求めることが出来ました
　もしかしたら数ピクセルずれているのかもしれませんが、目視で確認する限りでは問題ありませんでした

##以下駄文
　経度ってlngを略称として使うのか、lonなのか非常に悩みどころですね。
Parse.comのプッシュ通知機能を使う方法

「グロースハック（growth hack）」とかいう流行りつつある単語に乗せられて、プッシュ通知（Push Notification）を使ってみようと思い立ち、この間Facebookに買収されたBaaS（Backend as a Service）のParse.comが提供するプッシュ通知機能を、[自作クソゲー「ギリジャン！」](https://play.google.com/store/apps/details?id=com.kyosuke25.edgejumper)に乗せてみたのでそのメモ。
というか、[公式ドキュメント](https://parse.com/tutorials/android-push-notifications)の必要部分を抜粋しての和訳。

なお、既にParse.comにアプリの登録をしてることを前提としています。

##【実装編】
###■AndroidManifest.xml
####1.サービス

```
<service android:name="com.parse.PushService" />
<receiver android:name="com.parse.ParseBroadcastReceiver">
  <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
    <action android:name="android.intent.action.USER_PRESENT" />
  </intent-filter>
</receiver>
```
####2.パーミッション
```
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
```

###■Activityクラス
####1.初期化
onCreateメソッドに以下のコード。

```java:
Parse.initialize(this, "アプリID", "クライアントキー");
```

アプリIDもクライアントキーもParse.comの画面（下の画像）に表示されているものを使う。
![parse-setting.png](https://qiita-image-store.s3.amazonaws.com/0/21467/d2134fc6-0f61-f62f-e22b-067a178cb3a7.png)

####2.通知を受信する部分の実装
onCreateメソッドに以下のコード。

```java:
PushService.setDefaultPushCallback(this, XxxxActivity.class);
ParseInstallation.getCurrentInstallation().saveInBackground();
```

「XxxxActivity.class」には、端末上に表示された通知をクリックしたときに表示させたいActivityクラスを書く。
普通はアプリの初期画面のActivity。
オファーウォールみたいな広告表示専用のActivityだと邪悪。うざい。

あと、インストール時に、アプリ名（言語によってアプリ名が違う場合はその言語に応じたアプリ名）とかアプリのバージョンとかタイムゾーンがParse.comに送信されるけど、それ以外にも情報がほしければ実装可能。
今回は試しに実装しただけなので省略。

####3.トラッキングの実装
onCreateメソッドに以下のコード。

```java:
ParseAnalytics.trackAppOpened(getIntent());
```

通知からアプリが開かれたかどうかをトラッキングしたければ書く。
（普通はトラッキングしたいはず。）

##【送信編】
実装できたら、あとはParse.comの管理画面から通知をするだけ。

まず、通知するページにアクセスして、Send a pushボタンをクリック

![parse-notify.png](https://qiita-image-store.s3.amazonaws.com/0/21467/775d791b-e2f6-58ec-12f6-97a415f561f2.png)

次に、通知する内容を登録して、Send Notificationボタンをクリック。

![parse-send-notification.png](https://qiita-image-store.s3.amazonaws.com/0/21467/07ff0cde-7ac8-2fa4-330f-35ac1727c3e8.png)

実装も送信もめっちゃ簡単。

**ただし、何に使うねんと言われてもよく分かりまへん。**
Apache2経由でSVNアクセス時にLDAPで認証し、認証済みユーザとして任意のLDAP属性をSVNに渡す

# 環境
* CentOS 6.4
* Subversion 1.6.11
* Apache2 2.2.15 (2.2.3以下では、AuthLDAPRemoteUserAttribute ディレクティブ未実装)
* OpenDJ 2.6.0 
* Oracle JDK 1.7.25

# 概要
* mod_authnz_ldapを使用
* LDAPに存在するユーザでBASIC認証を実施
* SVNから送るコミットメールに乗せるコミットユーザ名をいい感じにする
  具体的には、ApacheのREMOTE_USER環境変数を任意のLDAP属性にする

# 関連文献
Apache Module mod_authnz_ldap
http://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html#authldapremoteuserattribute

# 事前準備

## ミドルウェアセットアップ
``` bash:httpdとsubversionのインストール

yum -y install httpd subversion mod_dav_svn

```

javaの導入は下記に譲って省略。
http://java.com/ja/download/help/index_installing.xml

OpenDJの導入も本稿の本意ではないので省略。
以降の記述に関わる部分は、
* ベース DN:  dc=nt67,dc=org
* セットアップディレクトリは /opt/opendj/

```bash:OpenDJの設定内容
/opt/opendj# /opt/opendj/bin/status


>>>> OpenDJ LDAP 接続パラメータを指定します

管理者ユーザーのバインド DN [cn=Directory Manager]: cn=admin

ユーザー 'cn=admin' のパスワード: 

          --- サーバーの状態 ---
サーバーの稼動状態:   起動中
開いている接続数:    1

          --- サーバーの詳細 ---
ホスト名:        ldap.nt67
管理ユーザー:      cn=admin
インストールパス:    /opt/opendj
バージョン:       OpenDJ 2.6.0
Java のバージョン: 1.7.0_25
管理コネクタ:      ポート 5444 (LDAPS)

          --- 接続ハンドラ ---
アドレス:ポート     : プロトコル : 状態
-------------:-------:---
--           : LDIF  : 無効
0.0.0.0:161  : SNMP  : 無効
0.0.0.0:636  : LDAPS : 無効
0.0.0.0:1389 : LDAP  : 有効
0.0.0.0:1689 : JMX   : 無効
0.0.0.0:8080 : HTTP  : 無効

          --- データソース ---
ベース DN:    dc=nt67,dc=org
バックエンド ID: userRoot
エントリ:      1
レプリケーション:  

```

## LDAPのエントリ情報

LDAPのディレクトリ設定情報

```text:entry.ldif

dn: dc=nt67,dc=org
objectClass: dcObject
objectClass: organization
dc: nt67
o: nt67.org

dn: ou=User,dc=nt67,dc=org
objectClass: organizationalUnit
ou: User

dn: cn=user001,ou=User,dc=nt67,dc=org
objectClass: person
objectClass: inetOrgPerson
cn: user001
sn: user001_sn
userPassword: user001
mail: user001@nt67.org

dn: cn=user002,ou=User,dc=nt67,dc=org
objectClass: person
objectClass: inetOrgPerson
cn: user002
sn: user002_sn
userPassword: user002
mail: user002@nt67.org

dn: cn=user003,ou=User,dc=nt67,dc=org
objectClass: person
objectClass: inetOrgPerson
cn: user003
sn: user003_sn
userPassword: user003
mail: user003@nt67.org

```


## SVN設定

```apache:/etc/httpd/conf.d/subversion.conf

<Location /repos>
   DAV svn
   SVNParentPath /var/www/svn

   AuthType Basic
   AuthBasicProvider ldap 
   AuthzLDAPAuthoritative off
   # 認証済みユーザ名として mail属性を設定する
   AuthLDAPRemoteUserAttribute mail
   AuthName "Auth for nt67.org"
   # 認証用文字列として cn を、あわせてmail属性を引っ張ってくる。
   AuthLDAPUrl ldap://ldap.nt67:1389/ou=User,dc=nt67,dc=org?cn,mail
   Require valid-user
</Location>

```

## 結果

コミットするときの認証として、cn属性のユーザ名を使う。
コミットログには mail 属性が設定される。

```bash:commit

svn commit -m "first commit" --username user001 --password user001

svn log
------------------------------------------------------------------------
r1 | user001@nt67.org | 2013-08-17 23:09:13 -0700 (土, 17  8月 2013) | 1 line

first commit
------------------------------------------------------------------------

```