OmniAICreator/Qiita-1.07M huggingface dataset:
Chef Solo / Vagrant / serverspecでインフラのTDDを行う

Vagrantでつくった環境を、Chefでプロビジョニングし、それをserverspecでテストします。

##前提環境
以下のものがインストールされている必要があります。

* Vagnrat
* chef-solo
* knife
* serverspec

##作業ディレクトリの用意

```
> mkdir infra-tdd
> cd infra-tdd
```

##Vagrantの立ち上げ

Vagrantを立ち上げます
vagrant box add **** であらかじめboxを登録する必要あり。

```
vagrant init opscode-centos-6.4
vagrant up
```

これでVagrantサーバーが立ち上がるので、

```
> vagrant ssh
```

でVagrantサーバーにsshログインできればOK。


Vagrantサーバーの接続情報を次のコマンドで.ssh/configに追記しておきます。

```
> vagrant ssh-config --host infra-tdd >> ~/.ssh/config
```

##Chefレポジトリの準備
knife-soloを使ってChefレポジトリを初期化します。

```
> knife solo init .
```

次に、先ほどのVagrantサーバーをChefのnodeとして追加してあげます。

```
> knife solo bootstrap infra-tdd
```

これでnodeとして追加されるほか、VagrantサーバーにChefがインストールされます。

##テストの用意
今回はTDDなので、serverspecを使ってテストを先に書いて行きます。

```
> serverspec-init
```

を実行すると、いろいろ聞かれるので答えていきます。

```
Select OS type:

  1) UN*X
  2) Windows

Select number: 1

Select a backend type:

  1) SSH
  2) Exec (local)

Select number: 1

Vagrant instance y/n: y
Auto-configure Vagrant from Vagrantfile? y/n: y
 + spec/
 + spec/default/
 + spec/default/httpd_spec.rb
 + spec/spec_helper.rb
 + Rakefile
 
```

`spec/default/httpd_spec.rb`というファイルが既に作られているので、以下のように編集(余計な部分を削っただけです)

```spec/default/httpd_spec.rb
require 'spec_helper'

describe package('httpd') do
  it { should be_installed }
end
```

「httpdがインストールされているべき」といったTDDならぬBDD(振る舞い駆動開発)っぽい感じでテストが書けます。

##テストの実施

いよいよテストを実施してみます。

```
> rake spec
```
これだけでテストが実行されます。実行結果は以下のようになります。

```

/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby -S rspec spec/default/httpd_spec.rb
F

Failures:

  1) Package "httpd" should be installed
     On host `default`
     Failure/Error: it { should be_installed }
       sudo rpm -q httpd
       パッケージ httpd はインストールされていません。
       expected Package "httpd" to be installed
     # ./spec/default/httpd_spec.rb:4:in `block (2 levels) in <top (required)>'

Finished in 3.6 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/default/httpd_spec.rb:4 # Package "httpd" should be installed
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby -S rspec spec/default/httpd_spec.rb failed

```

httpdがインストールされていないので、テストが通りません。


##レシピの用意

次に、テストを通すためのapacheをインストールするレシピを準備していきます。

```
> knife cookbook create apache -o site-cookbooks
```

`site-cookbooks/apache/recipes/default.rb`が出来てますので、これを編集します

```site-cookbooks/apache/recipes/default.rb
package "httpd" do
 action :install
end

service "httpd" do
 action [ :enable, :start ]
end
```

このレシピをnodeの設定ファイル(nodes/infra-tdd.json)に追加

```nodes/infra-tdd.json
{
  "run_list": [
    "recipe[apache]"
  ]
}
```

##プロビジョニングの実行とテスト再実施

以下のコマンドでinfra-add(Vagrantサーバー)に対してChefによるプロビジョニングが行われます。

```
> knife solo cook infra-tdd
```

これで、httpdがインストールされたはずなので、serverspecによるテストを再実施してみます。

```
> rake spec

/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby -S rspec spec/default/httpd_spec.rb
.

Finished in 4.01 seconds
1 example, 0 failures

```

今回はちゃんとテストが成功しました。
以上のような流れでVagrant、Chef、serverspecをつかったTDDが行えます。
UNITY コースター

#概要
![コースター２.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/78f0b1a3-de93-f5f9-e631-d007d9ff245e.jpeg)

通称オキュラスコースターでも使えるコースターのようなものを作ってみました。
こちらのURLに動いてるものがあるので、参照してください。
http://unityroom.com/games/play/256

カスタムパッケージはこちらのものになります。
http://bowlroll.net/up/dl44556
パスワードは「superspline」です。


#使用したアセット
SuperSplines
https://www.assetstore.unity3d.com/en/#!/content/2020
スプラインを作ることができます。
そして作成したスプラインから様々な情報を取り出すことができます。
下記はその中の一例になります。
本当はほかにもいろいろできます。

1, ある点からのスプライン上の最近点を求めます。

```csharp:code
float GetClosestPointParam (Vector3 point, int iterations, float start=0, float end=1, float step=.01f)
```

2, スプライン上のある一点の接線を求めます。

```csharp:code
Vector3 GetTangentToSpline (float param)
```
3, スプライン上のある一点の位置を求めます。

```csharp:code
Vector3 GetPositionOnSpline (float param)
```

スプラインの形状を決めるアルゴリズムも直線、通常のスプライン、Bスプラインなど何種類かあったりします。

#サンプルプロジェクトの使用手順

###１、スーパースプラインをインポートしてください。
持ってない人は購入してからインポートしてください。

![スーパースプライン.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/15e7e51a-a07a-ed35-6edd-dee95017630d.jpeg)


###２、カスタムパッケージをDLし、インポートします。

カスタムパッケージはこちらのものになります。※冒頭に記載されているURLと同じものです。
http://bowlroll.net/up/dl44556
パスワードは「superspline」です。

UNITY画面上のここからインポートします。
![カスタムパッケージ.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/b0b71727-d8b2-883a-9fbd-f0da03a5b79c.jpeg)

ZIPファイルの中に入っているこちらのファイルをインポートしてください。
![コースターパッケージ.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/59bcca57-4def-c7af-382b-a428bab2991d.jpeg)

###３、シーンファイルのmainを開くと動く状態のシーンが開きます。

![シーンファイルを開く.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/f7680252-330c-f438-f978-ed02cd71302a.jpeg)

#インスペクタのパラメータについて
作成したコンポーネントは３つになります。

![インスペクタ.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/0edf8056-91d4-f337-0903-51f0e1e391ee.jpeg)

### PIDJointer
Spline : どのスプラインに沿うか指定します。
Dead Zone P : 位置のずれに比例してかかる力が無くなる幅を指定します。
Dead Zone D : 速度に比例してかかる力が無くなる速度を指定します。
P : 位置ずれに比例してかかる力の大きさを指定します。
D : 速度に比例してかかる力の大きさを指定します。（Y軸の速度、及びスプラインの接線方向への速度は無視します）
Pos Now : スプライン上の最近点の位置を入れます。プレイ中でないと出ません。
Seek Width : 最近点を探す処理で、実際に探す幅を指定します。
Loop End In : スプラインの切れ目近くでは最近点を探す処理が特殊になります。
その処理に切り変わる位置を指定します。
Loop End Out : スプラインの切れ目近くの処理から抜ける位置を指定します。

### Aliner
アタッチしたオブジェクトをスプラインの接線方向へ向けます。

### Speed Low Limit
コースターの速度が遅くなった場合、ロックし、強制的にコースターを押します。
Speed Limit : 押す場合にターゲットになる速度を指定します。
To Free Sukima : ロック状態からフリーになるための速度を指定します。
実際にはSpeed LimitよりもTo Free Sukimaだけ早い速度になると、ロック状態から開放されます。
To Lock Speed : この速度よりも遅くなった場合、ロックされます。
Speed Ajuster : あまり強く押すと吹っ飛ぶので、力を抑えます。
Speed Now : 現在の速度、プレイ中でないと表示されません。
Debian Wheezy(armhf)にowncloudをインストール

#必要なライブラリをインストール

大規模な利用ではないので、バックエンドはsqliteにする
```bash
apt-get install php5-gd php-xml-parser php5-intl smbclient curl libcurl3 php5-curl php5-sqlite
```
#apache2のライブラリを有効化
```bash
a2enmod rewrite
a2enmod headers
```
#owncloudのパッケージを取得・解凍
```bash
cd /usr/src
wget http://download.owncloud.org/community/owncloud-latest.tar.bz2
cd /var/www
tar -xjf /usr/src/owncloud-latest.tar.bz2
chown -R www-data:www-data owncloud/
```
#Webから設定
http://mydomain/owncloudへアクセス
画面に従い設定を行う
grunt serveでlocalhost以外のドメインからアクセスする方法


## Gruntfile.jsを修正する。
`hostname: 'localhost'`と記載のある箇所を、`hostname: '0.0.0.0'`へと修正する。

```js
        connect: {
            options: {
                port: 9000,
                open: true,
                livereload: 35729,
                // Change this to '0.0.0.0' to access the server from outside
                hostname: 'localhost'
            },
```

## この対応を入れてみて
自分のiPhoneなどの端末からアクセスできる様になったので、随分と開発が楽になったような気がしました♩
Xamarin.Android が使用する debug.keystore の在処


Google Maps などを使用する時、開発中ならば ``debug.keystore`` のフィンガープリント(SHA1)を取得する必要がありますが、 debug.keystore がどこにあるのか分からなくてハマった。

## 結論

から書いておくと

* [Obtaining a Google Maps API Key | Xamarin](http://developer.xamarin.com/guides/android/platform_features/maps_and_location/maps/obtaining_a_google_maps_api_key/)

に書いてある通りで、

* Windows - ``C:¥Users¥[USERNAME]¥AppData¥Local¥Xamarin¥Mono for Android¥debug.keystore``
* OSX - ``/Users/[USERNAME]/.local/share/Xamarin/Mono for Android/debug.keystore``

がそれぞれ使われる。

## なぜハマったか？

### Eclipse と同じだと思ってた

Java での Android 開発時に設定したディレクトリを使ってくれると思い込んでた。けどよく考えればあれは Android SDK ではなく Eclipse 固有の設定だったのよね。

### ドキュメントが古いと思ってた

上記で紹介した「Obtaining a Google Maps…」の記事が古いと思ってた。なぜならディレクトリ名に ``Mono for Android`` が含まれていて、これは Xamarin.Android の旧製品名だったから。

### Spotlight検索でヒットしなかった

Mac を使っているのだけど、Spotlight検索（所謂PC内検索）で ``debug.keystore`` がヒットしたのがいつもJava-Android開発で使ってる１つだけだったので、.local の中にあるとは気付けず。。。隠しディレクトリだからヒットしないよね。

こんなことでハマるのは自分くらいだろうけど、メモしときます。。
[Grails]AssetPipelineが有効な状態でｊQuery-uiの画像を設置する場所（暫定）

Asset-Pipelineについては[http://qiita.com/saba1024/items/2ae86dd1878e4bebe60c]()を参照。
jquery-uiには画像がついてきますが、デフォルトのjquery-ui.cssではその画像を
`background: #f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;`
といった形で相対パスで指定しています。

このCSSはAssetPipelineで管理するようにすると、画像をURL的に
`/アプリ名/assets/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png`
から読み込もうとします。

おそらくちゃんとした対応方法があるんでしょうが、暫定対応として、web-appディレクトリ配下に
`/assets/css/images`というディレクトリを作って、そこにｊQuery-ui付属の画像を配置すればとりあえずちゃんと動作します。

##追記
`grails-war`でwarに固めた場合には更にURLが変わります。
warで固めた場合には
`/アプリ名/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png`
と行った形で、assetsのあとのcssがなくなります。
そのため、上記で作成した`/assets/css/images`のimagesディレクトリを、丸々web-app配下の`/assers/`にコピーする必要があります。
簡単な処理を行うAPIの作り方


今回はじめてAPIというのを作ったので、そのやり方を忘れないうちに記していこうと思います。

##APIってなんぞや？
APIとは"Application Programming Interface"の略です。
具体的には、あるコンピュータープログラムの機能や管理するデータなどを、外部の他のプログラムから呼び出して利用する為の手順やデータ形式などを定めた規約のことだそうです。(参考：[API](http://e-words.jp/w/API.html) IT用語辞典より)

一般的には、外部のプログラムから使われることを目的として作られた関数という認識なのかなと個人的には思ってます。

##作ってみました。
今回は、user_idを入力したらその``user_id``に紐づいている``photo_id``を出力してくれるAPIを作成しました。

#1.関数を作る。

```ruby:test_controller.rb
def user_photos
  user = User.where(id: params[:id])
  user_photos = Photo.where(user_id: params[:id])
  error_message = User.where(id: params[:id]).blank? ? 'Can`t find the user`s photo' : ''
  render :json => { user_photos: user_photos , error_message: error_message }
end
```

これで、user_photosを実行するとphoto_idをゲットすることが出来ますが、まだ外部のプログラムからは呼び出せません。

#2.ルーティング設定
外部から呼び出したい場合は、test/user_photosに対しルーティング設定を行う必要があります。

```ruby:routes.rb
GET test/user_photos/:id
```

と設定します。

これでブラウザで`~/test/user_photos/:id #存在するuser_ID`を叩けば、紐づいているphoto_idがjson形式で返ってくるようになりました。

この時点で、user_photosは外部からアクセスが可能な関数となりました。

次回は、このapiの使い方について書きたいと思います。
Windows のディスプレイに Raspberry Pi のデスクトップを表示する


# はじめに

## ようするに

[Mac のディスプレイに Raspberry Pi のデスクトップを表示する](http://qiita.com/TakeyukiUeda/items/7cc0fc6011cb0448c070)
の Windows 版です。Max では OSX の標準のX11をつかって Raspian の LXDE を開きましたが、Windows では Cygwin-X を使って LXDE を開くことができます。

## なにがうれしいのか
Mac とおなじですが
1. HDMI をTVにつないだり、キーボードやマウスの用意をしないで Mac だけで Raspberry Pi を使える
2. Mac のアプリと Raspberry Pi のアプリの間でコピー&ペーストが出来るので便利

## 注意
以下で、192.168.11.11 は、私の環境での Raspberry Pi の IP アドレスです。この値は、ご自身の環境でのアドレスに置き換えてください
アカウントとパスワードはデフォルトのままとしてますので、ここもご自身の環境で変更されているなら、そのように置き換えてください

# 手順
## Windows に Cygwin-X のインストール
1. cygwin をすでにインストールしている方はインストーラを起動します。そうでない方は [Cygwinのサイト](https://www.cygwin.com)からインストーラをダウンロードして起動します
2. 一番下の X11 が Default になっていたらクリックして "install" にして、次へをクリック、X11 のインストールが始まります。結構時間がかかります。
![キャプチャ2014.08.29-01.PNG](https://qiita-image-store.s3.amazonaws.com/0/46544/92b068d3-9369-82c0-2aac-53421dbacbd0.png "キャプチャ2014.08.29-01.PNG")

## Windows で Cygwin-X から Raspberry Pi の LXKD を起動
1. Windows で Cygwin-X の xterm を起動します
![キャプチャ2014.08.29-02.PNG](https://qiita-image-store.s3.amazonaws.com/0/46544/d2e55fc9-8a1b-f7c2-f9a8-e87227251f99.png "キャプチャ2014.08.29-02.PNG")

2. ssh -X （Xは大文字です）で raspberry pi に接続し、lxsession を起動
![キャプチャ2014.08.29-03.PNG](https://qiita-image-store.s3.amazonaws.com/0/46544/cd0b3227-94a4-cb70-e2f3-80dc9bfc6980.png "キャプチャ2014.08.29-03.PNG")
このとき、-x と小文字にすると lxsesssion が　“only one lxsession can be exeuted at a time” というエラーになります。大文字の -X は X11 をイネーブルに、小文字の -x はディスエイブルにするオプションなので、-x だと X11 をひらけないからのようですが、エラーメッセージがわかりにくいかもしれません。

3. 以下のように、Windows 上で Raspberry Pi のデスクトップがひらきます。Windows のアプリケーションの一つとして開くので、秀丸と混在させてコピー＆ペーストもできます
![キャプチャ2014.08.29-04.PNG](https://qiita-image-store.s3.amazonaws.com/0/46544/33cc58be-6cfd-d231-2cf6-d8503e9973d2.png "キャプチャ2014.08.29-04.PNG")

#まとめ
上記の手順を一言でまとめると「-X オプション付きで ssh で接続し、lxsession を起動」になります
Project Eulerをhaskellで練習していく日記: Problem 34

#問題
145は、各桁の階乗の和が元の数にかる希有な数である。
1! + 4! + 5! = 1 + 24 + 120 = 145

このように、各桁の階乗の和が元の数になるような全ての数の和を求めよ。
ただし、1=1!と、2=2!は右辺が和ではないので、除外する。
#回答
```hs
-- 9までの階乗をあらかじめ計算しておきます。
facts = scanl (*) 1 [1..9]

-- 最大何桁まで調べれば良いかを計算します。
keta = maximum $ takeWhile (\n->n*(facts !! 9)>10^n) [n|n<-[2..]]

-- 各桁の階乗の和が元の数になるかどうか
isSum n = n == sum[facts !! (read (x:"")) | x<-(show n)]

main = do
     print $ sum $ filter isSum [10..10^keta]
```

#感想
今回も上限を見極めるのがちょっとややこしかった。
VB.Net の FileOpen 関数

VB6 からVB.Netへコンバートしたソースなどでは FileOpen 関数がそのまま使われていることが多い。だが

**FileOpen関数のファイルハンドルは、アセンブリローカルだぞ**

それゆえ、ハンドル(Int32)を DLL に渡してもちゃんと機能しない。時間がちゃんとあれば、StreamWriter/Readerに書き換えておきたいものだな…
ついカッとなってFuelPHPのvalid_stringのparam部分のエラーメッセージを日本語化した


仕事でvalid_stringのparam部分のエラーメッセージを日本語化しなければならなかったので、コードを書いた。
今後の参考に慣ればと思い、書き残しておく。

## 方針

1. `core`を拡張する
2. `lang`ファイルを使う

## コード

もういきなりコード紹介

### 拡張したcoreのコード

```php:app/classes/core/validation/error.php
<?php

class Validation_Error extends Fuel\Core\Validation_Error
{
	public static function _init()
	{
		parent::_init();

		\Lang::load('validation_params', true);
	}

	protected function _replace_tags($msg)
	{
		// あとでもとに戻すためにコピーしておく
		$params = $this->params;

		if ($this->rule === 'valid_string')
		{
			foreach ($this->params as $key => $val)
			{
				foreach ($val as $k => $v)
				{
					// ここで param:1 の部分を日本語化
					$this->params[$key][$k] = \Lang::get('validation_params.' . $this->rule . '.' . $v) ?: $v;
				}
			}
		}

		$msg = parent::_replace_tags($msg);

		$this->params = $params;

		return $msg;
	}
}
```

### 作った言語ファイル

```php:app/lang/ja/validation_params.php
<?php

return array(
	'valid_string' => array(
		'numeric' => '整数',
	),
);
```

### bootstrapで読み込む

```php:app/bootstrap.php
<?php

// ...

Autoloader::add_classes(array(
	// ...
	'Validation_Error' => APPPATH . 'classes/core/validation/error.php',
));
```

## おしまい

念のため最低限必要なときだけ翻訳して、あとは戻すことで影響を最小限にした。
そもそも別のruleとかにしておけばこんなにめんどくさい事はしなくていいんだけど...。
LinuxおよびMacOSXで複数のファイルの拡張子を一括変更するには？

コマンドラインでの操作です。
ターミナルでシェルを利用して実現します。

## ワンライナー

    for filename in *.dmp; do mv $filename ${filename%.dmp}.sql; done

## メモ

* 拡張子を .dmp から.sqlに変更
GNU Time にある壮大なバグ (はもうありませんので安心してください)

とりあえず警告として拡散できればということで。

bash の time ではなく、 明示的に /usr/bin/time と書くことで呼び出せる
プログラムがあります。機能はtime と同じく、コマンドを引数に取り、
それを実行し、そして使用メモリ量、使用時間(user,sys)を出力します。

bashのtimeにくらべて、引数でフォーマットを自由に変更できるので便利です。
しかししかし、壮大なバグがあります。

それはすなわち、

**使用メモリ量が4倍に表示される**

ことです。BSDの実装をlinuxにそのまま持ってきたらこうなったそうです。
2010年ぐらいに見つかったバグですが、
ubuntu14.04の公式aptリポジトリでも time のバージョンは1.7のまま。
直っていません。直せよ・・・。

論文締め切り前なんですが、これで結構な時間を無駄にしました。ちくしょー

ソース
https://bugzilla.redhat.com/show_bug.cgi?id=702826
https://bugzilla.redhat.com/show_bug.cgi?id=783143
有効期限付きのCookieを削除する時に、削除できなかったのでメモ(IE11)

Cookieを参照するcgiファイルが複数あって、有効期限を設定した場合、
単純に下記のように過去の日付を設定しただけでは削除できなかったのでメモ。

```
Set-Cookie: hoge=fuga; expires=Thu, 1-Nov-2012 00:00:00 GMT;
```
今回解決した方法は、domain属性を指定する方法。
Cookieを発行する時に、domainを指定。

```
Set-Cookie: hoge=fuga; domain=connan.jp; expires=Thu, 28-Aug-2014 00:00:00 GMT;
```

Cookieを削除する時に、domainを指定。

```
Set-Cookie: hoge=fuga; domain=connan.jp; expires=Thu, 1-Nov-2012 00:00:00 GMT;
```

とりあえず今回はこれで解決したけど、domain属性を付けると、ホスト名に関係なくCookieが有効になるようなので要注意。
pathとかを巧みに設定すると解決できかも。
windows7/python3.3/virtualenv/cx_Freeze/Import Error/MAXREPEAT

# windows7/python3.3/virtualenv/cx_Freeze/Import Error/MAXREPEAT

Pythonを使ってシリアル通信をしよう！となったとき、PyserialとTkinterを使うっていうのはよくある（たぶん）と思います。ただ、pythonで書かれたプログラムをみんなが使えるようにするためにはPythonの環境に依存しない形に変換する必要がありますよね。そこで、cx_Freezeというライブラリを使ってpythonスクリプトをexeファイルに変換します。その時に起こったエラーとその解決方法についてまとめました。

###exe化する際にtkinterをimportする場合に発生しがちなエラー
まず、cx_Freezeで.pyのファイルを.exeに変換する過程でエラーが発生して処理がストップします。
tkinterを使用するのに必要なTCL_PARAMETERとTK_PARAMETERがインポートできないっぽいです。
```
Import Error
TCL_PARAMETER
```
手動でパスを追加してやれば良いです。僕の場合、virtualenvを使った仮想環境だったので、activate.batに以下の二行を追加してやります。

```
set "TCL_LIBRARY=C:\Python33\tcl\tcl8.5"
set "TK_LIBRARY=C:\Python33\tcl\tk8.5"
```

こうすると、”とりあえず”exeファイルを作ることができるようになります。ただ、実行はできません( ◠‿◠ )

###exe化したファイルを起動できないケース
もしあなたがある特定のバージョンのpythonを利用していた場合、exeファイルを起動すると以下のエラーが出ます。

```
Cannot import traceback module.
Exception:cannot import name MAXREPEAT
Original Exception:cannot import name MAXREPEAT
```
ぐぐってもさっぱりわからず、３時間以上格闘しました。
いろいろ試しましたが、解決方法を先に書いておきます。
###解決方法
python3の人はpython3.3.5にアップグレードしましょう。（python2の人はすいませんがわかりません）
MAXREPEATがimportできないのはpython3.3.0のバグなので、アップグレードすれば直ります。
* * *

###僕がトライした内容
すいません、最初は諸事情で英語で書いたのですが日本語に訳すのが面倒なので英語のままにしておきます←
###1. check sre_constants.py, sre_parse.py, sre_compile.py
     As the first refferece (bottom of this article) says, I tried to modify sre_constants.py, but the file of python33 was different from that of python27, so I couldn't try this solution. Next, I tried the solution mentioned in the second referrence, but it also didn't work.

###2. install cx_Freeze in other ways
 * donwload exe file <br> https://pypi.python.org/pypi?:action=display&name=cx_Freeze&version=4.3.3 
 * change the python environment ( virtualenv -> local python3 )
   <br>The error message changed to the following one 
http://stackoverflow.com/questions/8597126/cx-freeze-ldap-importerror-dll-load-failed-1-is-not-a-valid-win32-application
<br>
<b>First,</b> I tried installing "cx_Freeze-4.3.3.win32-py3.3.exe", but it didn't work because my computer is 64bit, not 32bit. <br>
<b>Second,</b> I tried installing "cx_Freeze-4.3.3.win32-py3.3.exe" but it didn't work too. The error message of the second one is the same as the mentioned in the top of this article.<br>
<b>Third,</b> I downloaded "cx_Freeze-4.3.3-cp33-none-win_amd64.whl" and checked some examples. 

###3. change the version of Python
 the version of my Python3 was 3.3.0, so I changed it to 3.3.5, then it worked...

    

#### reference
1. http://blog.goo.ne.jp/narisawanwan/e/4e936c8a519f3ec2eb1c10e25e8cb39d
2. http://stackoverflow.com/questions/25316851/maxrepeat-importerror-when-using-cx-freeze-with-python-3-2
AndroidStudioプロジェクトでgradlewにプロパティ渡すことで署名ビルドを行う


# gradlewでビルド

JenkinsでAndroidアプリのCIとかさせる場合、Gradle Wrapperの仕組みによりAndroidStudioプロジェクト配下にデフォルトで作成される `gradlew` スクリプトが結構便利で助かる。
シェルで実行のジョブを作成し、そのまま

```bash
$ ./gradlew clean build
```

とかやると簡単にapkを生成してくれるスグレモノ。

あんまGradle自体には詳しくないのでそのうちガツッと読んどこう。
[http://gradle.monochromeroad.com/docs/userguide/gradle_wrapper.html](http://gradle.monochromeroad.com/docs/userguide/gradle_wrapper.html)

# 署名をアドホックに行いたい

普通は `build.gradle` 内に `signingConfigs` で署名情報を設定しておくと思うのだけれど、今回はそれを完全に分離して `gradlew` でのビルド時に引き渡したい。

軽く `gradlew` のソース読むとこいつ自身のコマンドライン引数の本格的な利用箇所は最終行の

```bash:gradlew
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
```

のみ。
すべてをまるっとそのまま食わせているようなので少し調べることに。

まず、ドキュメントのオプションに関する項を読み進めてみると、
http://gradle.monochromeroad.com/docs/userguide/tutorial_this_and_that.html#sec:gradle_properties_and_system_properties
> projectオブジェクトに追加するプロパティは、コマンドラインオプションの-Pオプションで設定することもできます

こんな記述が。
なるほど `-P` 使えばいわゆる `properties` として引き渡せるのか。
がしかし、肝心の署名にまつわるプロパティ名って何になるんだ・・・？

# ソースみてみた

結局 [AndroidのGradleプラグイン公式](http://tools.android.com/build) に乗ってた手順にしたがってソース落として見てみることに。
Gradleプラグインのお作法とかまったくもって知らないけど、とりあえずレベルでドキュメント読んでみると `Plugin` インターフェイスの `apply` メソッドを実装して作成していく形らしいのでそれっぽいクラス探してgrepしてたらみっけた。

```groovy:BasePlugin.groovy
    private SigningConfig getSigningOverride() {
        if (project.hasProperty(PROPERTY_SIGNING_STORE_FILE) &&
                project.hasProperty(PROPERTY_SIGNING_STORE_PASSWORD) &&
                project.hasProperty(PROPERTY_SIGNING_KEY_ALIAS) &&
                project.hasProperty(PROPERTY_SIGNING_KEY_PASSWORD)) {
```

こいつら4つが定義されてれば署名情報をオーバーライドするっぽい。
さらにこの定数値たちを辿って行くと

```java:AndroidProject.java
    String PROPERTY_SIGNING_STORE_FILE = "android.injected.signing.store.file";
    String PROPERTY_SIGNING_STORE_PASSWORD = "android.injected.signing.store.password";
    String PROPERTY_SIGNING_KEY_ALIAS = "android.injected.signing.key.alias";
    String PROPERTY_SIGNING_KEY_PASSWORD = "android.injected.signing.key.password";
```

いたわぁ。

# 結果

最終的にはこんな感じ。

```bash
$ ./gradlew signingReport -Pandroid.injected.signing.store.file=[キーストアファイルへのパス] -Pandroid.injected.signing.store.password=[キーストアのパスワード] -Pandroid.injected.signing.key.alias=[キーのエイリアス] -Pandroid.injected.signing.key.password=[キーのパスワード]
```

で `Variant: release` に署名情報が反映されてるか一応確認後

```bash
$ ./gradlew clean assembleRelease -Pandroid.injected.signing.store.file=[キーストアファイルへのパス] -Pandroid.injected.signing.store.password=[キーストアのパスワード] -Pandroid.injected.signing.key.alias=[キーのエイリアス] -Pandroid.injected.signing.key.password=[キーのパスワード]
```

で署名付きリリースパッケージング。

# まとめ

長々と調査しちゃったけど、最初から `build.gradle` に自前で用意したパラメータ用のプレースホルダ的な動作を書いておけばコレ直で指定することもない気がする。調べる労力考えると絶対そっちが楽。

あとAndroidStudioのほうのソース内にある `ExportSignedPackageWizard` クラス読むとわかるんだけど、結局AndroidStudioでの署名ビルドウィザードでもダイアログで指定されたキー値で↑の4つのプロパティをオーバーライドしてビルドしているだけっぽい。そういう意味では `gradle.build` 汚さずに済む・・・のか・・・？
GYPにおけるdependencies設定メモ



いつも混乱するのでメモ。
基本的に
[GypUserDocumentation](https://code.google.com/p/gyp/wiki/GypUserDocumentation#Skeleton_of_a_typical_executable_target_in_a_.gyp_file)ベースです。

間違ってたら教えてください。

# dependencies

なにはともあれ、依存を示す。

依存する`target`を指定する。
他のgypファイルに記述されているターゲットも指定可能で、
`path/to/other.gyp`の`bar`
ターゲットの場合は
`path/to/other.gyp:bar`
という指定になる。

```
'dependencies': [
  'foo',
  'path/to/other.gyp:bar',
],
...
```

# direct_dependent_settings

このターゲットに依存する他のターゲットに対して、
適用する設定を記述します。
`include`ディレクトリだったり、`defines`だったりを、
そのターゲットに依存するターゲットに公開する感じです。

```
'direct_dependent_settings': [
  'defines': [
    'DEBUG',
  ],
  'include_dir': [
    'include',
    ...
  ]
]
```

# export_dependent_settings

このターゲットに依存しているターゲットに対して、
"`direct_dependent_settings`が **渡される**べきターゲット"を記述します。

つまり、ここに記述されたターゲットの`direct_dependent_settings`は、このターゲットに依存する
ターゲットにも反映されます。

```
'export_dependent_settings': [
  'path/to/other.gyp:bar'
],
```
Hubotで放映中アニメ一覧を返すスクリプト

# hubot-animemap

[github](https://github.com/aozora0000/hubot-animemap)

![スクリーンショット 2014-08-28 17.20.09.png](https://qiita-image-store.s3.amazonaws.com/0/25388/8ae05e82-7415-bafa-5977-0f06151570b0.png)


## インストール方法
```
1. $ npm install hubot-animemap --save
2. "hubot-animemap" を external-scripts.json に追加
3  $ export HUBOT_ANIMEMAP_PREF=[pref]  *下記pref一覧参照(デフォルト動作追加)
4. Hubotをリスタートさせる
```

## コマンド一覧

### ヘルプ表示
```
hubot animemap help *ヘルプURL(このページ)を表示
```
### 都道府県別放映アニメ一覧取得
```
hubot animemap from [pref] *下記pref一覧参照
hubot animemap from [pref] today *本日放映分のみ参照
```

### pref一覧
都道府県   | 入力値
:---------:|:----------:
北海道     | hokkaidou
青森県     | aomori
岩手県     | iwate
宮城県     | miyagi
秋田県     | akita
山形県     | yamagata  
福島県     | fukushima
茨城県     | ibaragi
栃木県     | tochigi
群馬県     | gunma
埼玉県     | saitama
千葉県     | chiba
東京都     | tokyo
神奈川県   | kanawaga  
新潟県     | niigata
富山県     | toyama
石川県     | ishikawa  
福井県     | fukui
山梨県     | yamanashi
長野県     | nagano
岐阜県     | gifu
静岡県     | shizuoka  
愛知県     | aichi
三重県     | mie
滋賀県     | shiga
京都府     | kyoto
大阪府     | osaka
兵庫県     | hyogo
奈良県     | nara
和歌山県   | wakayama  
鳥取県     | tottori
島根県     | shimane
岡山県     | okayama
広島県     | hiroshima
山口県     | yamaguchi
徳島県     | tokushima
香川県     | kagawa
愛媛県     | ehime
高知県     | kochi
福岡県     | fukuoka
佐賀県     | saga
長崎県     | nagasaki  
熊本県     | kumamoto  
大分県     | oita
宮崎県     | miyazaki  
鹿児島県   | kagoshima
沖縄県     | okinawa

## 利用にあたって
このスクリプトは[アニメマップ](http://animemap.net/pages/api/)様のAPIを利用しています。

過度な負荷を掛けたり悪用されるとサービスが停止する可能性もあります。
PHPの静的コード解析ツール『PHPMD』を使ってみた。


コードレビューしてもらう前に、静的コード解析をして事前に問題点の修正を行いたいと思ったので使ってみました。

## PHPMDとは

[Hudson+phpmdでPHPコードの問題を自動検出する方法 | Ryuzee.com](http://www.ryuzee.com/contents/blog/3479)に記載されているのは以下のような内容です。

```
phpmdはPHP Mess Ditectorの略で、PHPコードの潜在的なバグになりそうな箇所や実装上の問題を検出してくれるツールである。例えば未使用の変数の指摘、多数のpublicメソッドのある巨大クラスの検出、一文字変数等もこのツールで検出可能だ。
```

## インストール手順

[composer](https://getcomposer.org/)を利用します。

```composer.json
{
    "require-dev": {
        "phpmd/phpmd" : "*"
    }
}
```

インストールして、パスを通します。

```
php composer.phar install
sudo ln -s /vagrant/vendor/phpmd/phpmd/src/bin/phpmd /usr/bin/phpmd
sudo chmod ugo+x /usr/bin/phpmd
```

## 使い方

```
# phpmd [ファイル名|ディレクトリ] [レポートフォーマット（text or xml）] [ルール]
```

引数に設定するルールについては以下となります。
* codesize：循環的複雑度などコードサイズ関連部分を検出するルール
* controversial：キャメルケースなど議論の余地のある部分を検出するルール
* design：ソフトの設計関連の問題を検出するルール
* naming：長すぎたり、短すぎたりする名前を検出するルール
* unusedcode：使われていないコードを検出するルール

複数確認したい場合、カンマ区切りで利用するようです。

```
$ phpmd test.php text codesize,controversial
```


## 動作確認

以下のファイルを用意します。

```phpmdtest.php
<?php

class PhpMdTest
{
    public function test_function($param_string)
    {
        print "Hello World!!" . $param_string . "\n";
    }
}

$hoge_fuga = new PhpMdTest();
$hoge_fuga->test_function("( ﾟдﾟ )ｸﾜｯ!!");
```

このファイルをphpmdを使って確認します。

```
$ phpmd phpmdtest.php text codesize,controversial,design,naming,unusedcode

/vagrant/test phpmdtest.php:5	The method test_function is not named in camelCase.
/vagrant/test phpmdtest.php:5	The parameter $param_string is not named in camelCase.
/vagrant/test phpmdtest.php:5	The variable $param_string is not named in camelCase.
```


指摘された内容を基に直してみます。

```phpmdtest.php
<?php

class PhpMdTest
{
    public function testFunction($paramString)
    {
        print "Hello World!!" . $paramString . "\n";
    }
}

$hoge_fuga = new PhpMdTest();
$hoge_fuga->testFunction("( ﾟдﾟ )ｸﾜｯ!!");
```


このファイルをphpmdを使って再度確認します。

```
$ phpmd phpmdtest.php text codesize,controversial,design,naming,unusedcode

```

特に何も表示されなくなりました。


作ってて何となく不安になった場合とか、プロジェクトに自分しかいない場合はこちらを試すのも良いのではないしょうか。


## 参考にしたURL

* [CentOS6.3で静的解析ツールPHPMDを動かしてみる（PHP用）](http://matome.naver.jp/odai/2134971273831838401)
* [Hudson+phpmdでPHPコードの問題を自動検出する方法 | Ryuzee.com](http://www.ryuzee.com/contents/blog/3479)

### PHPMDが使えるSaaS

* [SideCI](https://www.sideci.com/ja)
[baserCMS] CORESERVER へのインストール時の注意点

CORESERVER
http://www.coreserver.jp/

CORE-MINIプランでbaserCMSインストールしてみました。

## インストール

DB（今回はMySQL）を用意してFTPでファイルをアップロードして、、という流れは
http://basercms.net/manuals/3/introductions
の手順のままで問題なくインストール出来ました。

## スマートURLで問題発生

しかし、スマートURLをオンにすると 500 Internal Server Error が発生してしまい、動作しなくなってしまいました。

* スマートURLとは：http://basercms.net/manuals/3/base/4.html

原因は http://www.coreserver.jp/info/20140604.html に記載がありました。
サーバの仕様の問題のようです。

http://www.coreserver.jp/info/20140604.html
>.htaccess に「Options ALL」の設定があると500エラーとなる

ということで、

(baserCMSインストールフォルダ)/app/webroot/.htaccess

> \# Order allow,deny
> \# Deny from all

Order,Denyをコメントアウトしました。

更に、スマートURLを有効にするには、CGI版PHPとして動作する必要があるようでした。

参考 http://wordpress.ykishi.net/2012/01/23/coreserver_basercms/

※ 参考サイトではmod_gzip_onの記述もありましたが、mod_gzip_on　は下記のようにCORESERVERの仕様変更があったようで追加していません。

http://www.coreserver.jp/info/20140604.html
>.htaccess に「mod_gzip_on」の設定があると500エラーとなる


http://www.coreserver.jp/info/20140604.html
>.htaccess に
>AddHandler application/x-httpd-php52cgi .php
>AddHandler application/x-httpd-php53cgi .php
>AddHandler application/x-httpd-php54cgi .php
>AddHandler application/x-httpd-php55cgi .php
>等と記載することでCGI版PHPとして動作しますが、動作が遅くなりますのでおすすめしません。

ということで、AddHandlerを追加してみました。

(baserCMSインストールフォルダ)/.htaccess

>AddHandler application/x-httpd-php55cgi .php
>
>RewriteEngine on
>RewriteBase /
>RewriteCond %{REQUEST_FILENAME} !-d
>RewriteCond %{REQUEST_FILENAME} !-f
>RewriteRule ^(.*)$ index.php [QSA,L]

これで問題なく動作しているようです。


## まとめ

少し設定変更するとスマートURLも動作するようでした。
スマートURLをOFFのままだったらFTPでアップしてインストールするだけでバッチリ動いています。


実際にインストールした baserCMS 3.0.5.1
http://baser.cms.am/

baserCMS公式サイト
http://basercms.net
ログ表示ライブラリYosakuの紹介


# Yosakuとは

iOSアプリ開発において、アプリケーションの出力するログをデバイス上で確認できたほうが良い場合があります。 [Yosaku](https://github.com/sgr/Yosaku) は [CocoaLumberjack](https://github.com/CocoaLumberjack/CocoaLumberjack) のロガーとして、UITableView上にログレコードを表示するライブラリです。

![Yosaku on iPhone portrait](https://github.com/sgr/Yosaku/raw/master/Resources/iPhone_portrait.png "Yosaku on iPhone portrait")

![Yosaku on iPhone landspace](https://github.com/sgr/Yosaku/raw/master/Resources/iPhone_landscape.png "Yosaku on iPhone landspace")

# 使い方

Yosakuは [CocoaPods](http://cocoapods.org/?q=yosaku) から導入できます。この時依存するCocoaLumberjackも導入されます。

```ruby:Podfile
pods 'yosaku', '~> 0.2.0' # for CocoaLumberjack 2.0.x
```

```ruby:Podfile
pods 'yosaku', '~> 0.1.1' # for CocoaLumberjack 1.9.x
```

Yosakuは`YSLogger`という`DDLogger`の実装を提供しています。これを初期化ののち、CocoaLumberjackの他のロガー同様に`DDLog`に追加します。

```Objective-c:(AppDelegateでの初期化例)
#import <YSLogger.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"JST"];
    dateFormatter.dateFormat = @"yyyy/MM/dd HH:mm:ss.SSS";

    _logger = [[YSLogger alloc] initWithCapacity:100 dateFormatter:dateFormatter];
    _logger.updateIntervalSec = 1.5;
    [DDLog addLogger:_logger];

    return YES;
}
```

なお、`YSLogger`の初期化時にログレコードの時刻フォーマッタ、ログレコード保持数、ログレコード表示更新インターバル（秒）を与えます。

ログレコードの表示には表示用の空の`UITableView`を用意し、`YSLogger`にセットします。`YSLogger`は`UITableViewDataSource`, `UITableViewDelegate`として自身をテーブルビューにセットします。

```Objective-c:UIViewController
- (void)viewDidLoad
{
    [super viewDidLoad];

    // _app.logger is a YSLogger
    _app = [UIApplication sharedApplication].delegate;
    _app.logger.tableView = _logTableView; // YSLogger set myself to tableView's data source and delegate
    [_app.logger viewDidLoad];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [_app.logger viewWillDisappear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [_app.logger viewDidAppear:animated];
}
```

ログレコードの表示ビューが非表示になった場合は画面更新処理が不要になるため、`UIViewController`の`viewDidAppear`や`viewWillDisappear`で同名のロガーのメソッドを呼ぶようにしてください。


### 追記

- Yosaku 0.2.0, 0.1.1 をリリースしました。0.2.0 は CocoaLumberjack 2.0.0 に対応しています。CocoaLumberjack 1.9.x をお使いの方は Yosaku 0.1.1 をお使いください。 （2015年3月24日）
YSlowのthresholdについて

[YSlow for PhantomJS](http://yslow.org/phantomjs/) で指定可能となっているthreshouldがよく分からなかったので調べてみた

* 抜粋

```
$ phantomjs yslow.js --help
 
  YSlow Options:
 
    -t, --threshold <score>  for test formats, the threshold to test scores ([0-100]|[A-F]|{JSON}) [80]
                             e.g.: -t B or -t 75 or -t '{"overall": "B", "ycdn": "F", "yexpires": 85}'

```

----
### threshold
#### 指定方法
* -t の後にスコアを0-100かA-F(ケース非依存)で指定、もしくはJSONを記述する
 * JSONで記述する場合は項目別にスコアを指定することができる
 * JSONで描かない場合は全項目に同じスコアが指定されることになる

```
-t B
-t 75
-t '{"overall": "B", "ycdn": "F", "yexpires": 85}'
```

#### JSONで指定可能な項目
| 項目 | 説明 |
|:----|:----|
| overall | the common threshold |
| ynumreq | Make fewer HTTP requests |
| ycdn | Use a Content Delivery Network (CDN) |
| yemptysrc | Avoid empty src or href |
| yexpires | Add Expires headers |
| ycompress | Compress components with gzip |
| ycsstop | Put CSS at top  |
| yjsbottom | Put JavaScript at bottom |
| yexpressions | Avoid CSS expressions |
| yexternal | Make JavaScript and CSS external |
| ydns | Reduce DNS lookups |
| yminify | Minify JavaScript and CSS | 
| yredirects | Avoid URL redirects |
| ydupes | Remove duplicate JavaScript and CSS | 
| yetags | Configure entity tags (ETags) |
| yxhr | Make AJAX cacheable |
| yxhrmethod | Use GET for AJAX requests |
| ymindom | Reduce the number of DOM elements |
| yno404 | Avoid HTTP 404 (Not Found) error |
| ymincookie | Reduce cookie size |
| ycookiefree | Use cookie-free domains |
| ynofilter | Avoid AlphaImageLoader filter |
| yimgnoscale | Do not scale images in HTML |
| yfavicon | Make favicon small and cacheable |
* yslow.js -i all を実行すると全ての結果が表示されるので、それでどのような項目を評価しているか分かります
* スコアを指定しない項目には overall で指定した値またはディフォルト(80)がセットされます
 * -t B と -t '{"overall":"B"}' は同じ意味となります
右手でマウスを利用することを想定し作成

右手でマウス、左手でキーボードを使うことを想定しています。
アローキーはHを中心に
↑Y
↓H
←G
→J
となっています。
Enterは小指
DEL、BSは一段上がった薬指と小指
Mでブラウザの右タブに移動
Nでブラウザの左タブに移動
などを割り振っています。

```ini
[HowToUse]
Check=http://jp.enthumble.com
Name=enthumble version 3.0
[KEY]
Space={Enter}
Muhenkan={Esc}
Henkan={Esc}
Hiragana={}
F1={}
F2={}
F3={}
F4={}
F5={}
F6={}
F7={}
F8={}
F9={}
F10={Volume_Mute}
F11={Volume_Down}{Volume_Down}
F12={Volume_Up}{Volume_Up}
F23={}
F24={}
1={F1}
2={F2}
3={F3}
4={F4}
5={F5}
6={F6}
7={F7}
8={F8}
9={F9}
0={F10}
-={F11}
Hat={F12}
\={}
Q=^q
W={ctrl down}{x}{ctrl up}
E={END}
R={Delete}
T={BS}
Y={up}
U=^u
I={Tab}
O=^o
P={}
@={}
LB={}
A={HOME}
S=^s
D={shift down}{Enter}{shift up}
F={Enter}
G={left}
H={down}
J={right}
K={}
L={}
Semicolon={}
:={}
RB={}
Z=^z
X=^x
C=^c
V=^v
B={}
N={ctrl down}{PgUp}{ctrl up}
M={ctrl down}{PgDn}{ctrl up}
,={}
.={}
/={}
Backslash={}
Up={ASC 33194}
Down={ASC 33195}
Left={ASC 33193}
Right={ASC 33192}
LButton={ctrl down}{PgUp}{ctrl up}
MButton={MButton}
RButton={ctrl down}{PgDn}{ctrl up}
WheelUp={}
UWheeDown={}
PageUp={}
PageDown={}
Home={}
End={}
Delete={}
Bacspace={}
Enter={}
Escape={}
Hankaku={}
Tab={}
Capslock={}
Lwin={}
Rwin={}
Insert={}
```
[baserCMS] ブログのアイキャッチ画像の使い方

baserCMSでブログのアイキャッチ画像を出力するには

```php
    $this->Blog->eyeCatch($post, $options);
```

で出力できるのですが、

```php
    if($this->Blog->getEyeCatch($post): 
      $this->Blog->eyeCatch($post, $options);
    endif;
```

とかするとアイキャッチがあるときだけ出力できます。

※ $optionsの部分は色々指定できるので、
http://baser-for-wper.tecking.org/functions/BlogHelper/blog_out/eye_catch
とかを参考にすると便利ですね！

具体的には、どんな風に使うかといいますと、

```php
<?php if($this->Blog->getEyeCatch($post): ?>
<div class="xxxx">
<?php $this->Blog->eyeCatch($post, array('width'=>300)) ?>
</div>
<?php endif ?>
```

のような感じでアイキャッチ画像を別のタグなどで囲ったりする時なんかに便利です。:smile:
iOS8でUIActionSheetに追加したUIDatePickerなどのviewが表示されない時の対処法


Xcode6 beta5で検証。

UIActionSheetにUIDatePickerやUIToolbarをaddSubviewしているものが、表示されない！

![actionsheet.png](https://qiita-image-store.s3.amazonaws.com/0/4593/56eb1038-92d2-eb09-b199-9e1d48166e51.png "actionsheet.png")

こんな感じで。

## UIActionSheetはiOS8からdeprecatedです

UIActionSheetがdeprecatedになったので、代替としてiOS8ではUIAlertControllerを利用したほうがよいです。

[iOS8でのアクションシート：廃止されるUIActionSheetと推奨されるUIAlertController](http://qiita.com/Night___/items/bdaab13c5608685b1827)

iOS7以前とiOS8以降で切り分けが必要。

ただ現在（2014/08/28、Xcode6 beta5）のところ、viewなどを追加していないUIActionSheet自体は問題なく表示できているため、deprecatedでの影響ではない。

## UIActionSheetのドキュメント

Appleの公式ドキュメントから、そもそもはUIActionSheetにviewのせるなよってiOS8以前から書かれてたようです。

>UIActionSheet is not designed to be subclassed, nor should you add views to its hierarchy. If you need to present a sheet with more customization than provided by the UIActionSheet API, you can create your own and present it modally with presentViewController:animated:completion:.
https://developer.apple.com/library/ios/documentation/uikit/reference/uiactionsheet_class/Reference/Reference.html

となると、UIAlertControllerやUIActionSheetをバージョンによって切り替えるなどの実装をするより、自前でviewを作って実装するしかないかと。

## 代替案

とはいえ、UIActionSheetを独自viewで代替実装となると、全体のviewをブロックしてアニメーションさせて表示させたり、タップで解除したりなどそれなりに手間がかかりそう。

でいいいもの見つけてきました！

RMDateSelectionViewController
https://github.com/CooperRS/RMDateSelectionViewController

実装はかなりシンプル

```objc
RMDateSelectionViewController *dateSelectionViewController = [RMDateSelectionViewController dateSelectionController];
dateSelectionViewController.hideNowButton = YES;

dateSelectionViewController.datePicker.datePickerMode = UIDatePickerModeDate;
[dateSelectionViewController showWithSelectionHandler:^(RMDateSelectionViewController *vc, NSDate *aDate) {
    //選択したとき
  } andCancelHandler:^(RMDateSelectionViewController *vc) {
    //キャンセルしたとき
}];
```
blocksで実装できます。

![are.png](https://qiita-image-store.s3.amazonaws.com/0/4593/7492cc7a-70f7-e4b1-e849-6bacc7a82a45.png "are.png")


簡単かつアニメーションまでいい感じですね！
TwilioはRubyでも電話の発信ができちゃいます！

前回、PHPから電話を発信するブログを投稿しました。
こちらをご覧ください。
http://qiita.com/joohounsong/items/f516f4e1f6c91572e7f5

TwilioはPHPだけではなく、RubyやJAVAなど様々なプログラミング言語のSDKを提供しています。
今日は、その中、Rubyのライブラリを使って電話の発信を試してみたいと思います。

<h2>準備</h2>
まずは、Twilioのgemをインストールします。
```gem install twilio-ruby```

これでRubyから電話をかける準備はオッケーです。
他のライブラリの情報はこちらからご確認できます！
https://jp.twilio.com/docs/libraries

<h2>今回も早速コードを書いてみます。</h2>

下記のソースコードを用意して、account_sid 〜 url までにみなさんの情報を入力します。
<h4> account_sidとauth_token </h4> Twilioのダッシュボードにログインするとトップ画面で確認可能です。
この二つのキーでアカウントを識別します。

<h4>to</h4>
発信先番号を記入します。記入方法は国際電話番号形式にしてください。
(080xxxxxxxx → +8180xxxxyyyy）のように！
※ トライアルアカウントの場合、新規登録の際に認証を行った電話番号にしか発信ができませんので、
　認証済みの電話番号を入力してくださいませ〜！

<h4> from </h4>
発信元電話番号を記入します。ここにはTwilioの050番号を設定します。
電話番号の確認、ダッシュボード → 電話番号から確認可能です。
※ 無料の新規登録で、1つの電話番号を取得可能です！

<h4>url</h4>
上で簡単に説明しました！Twilioを動かす命令語が書いてあるファイルのパスを設定します。
※ このファイルはウェブ上（グロバール）に公開されている必要があります。
なお、このファイルのセキュリティーの面に関しては「ダイジェストとベーシック」を使った参照も可能になっていますので、ご安心ください。

```rb:twilio_call.rb
    require 'rubygems'
    require 'twilio-ruby'
 
    account_sid = '[account SID]'
    auth_token = '[Auth Token]'
 
    @client = Twilio::REST::Client.new account_sid, auth_token
 
    @call = @client.account.calls.create(
      :from => '+8150xxxxxxxx',   # From your Twilio number
      :to => '+8180xxxxxxxx',     # To any number
      :url => 'http://your URL/calling.xml'
)
```

こちらはTwiMLです。
※ TwiMLはウェブに公開されている必要があります。

```xml:calling.xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say language="ja-jp">Twilioへようこそ。</Say>
</Response>
```

このようにRubyでも簡単に電話の発信が可能です。
電話の発信だけではなく、SMSの送信など、gem をインストールするだけで、Twilioの機能を実装することが可能になります。

是非、試してみてください。
UUIDをなるべく短い文字列に変換する


Objective-CではNSUUIDでUUIDを生成できますが、これを文字列で保存あるいは送信する必要がある場合、通常は`UUIDString`メソッドを用いて、`1799AE5A-2F5D-4E89-B709-3B45AF6FE58F`のような形式の36文字を得ることになると思います。区切り文字を除いても32文字です。

これより短い文字列表現が欲しい場合、Base64を使う方法があります。この場合は24文字、パディング文字を除けば22文字で済みます。

以下にNSUUIDのカテゴリとしての実装例を示します。文字列表現におけるパディングの有無を引数で指定するようになっています。

```objective-c:NSUUID+Base64.h
//
//  NSUUID+Base64.h
//
//
 
#import <Foundation/Foundation.h>
 
@interface NSUUID (Base64)
 
- (instancetype)initWithBase64String:(NSString*)string withPadding:(BOOL)padding;
- (NSString*)Base64StringWithPadding:(BOOL)padding;
 
@end
```

```objective-c:NSUUID+Base64.m
//
//  NSUUID+Base64.m
//
//
 
#import "NSUUID+Base64.h"
 
@implementation NSUUID (Base64)
 
- (instancetype)initWithBase64String:(NSString*)string withPadding:(BOOL)padding
{
    if (padding == NO) {
        string = [string stringByPaddingToLength:(string.length + (string.length % 4)) withString:@"=" startingAtIndex:0];
    }
 
    NSData* d = [[NSData alloc] initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters];
    uuid_t bytes;
    [d getBytes:bytes];
    return [self initWithUUIDBytes:bytes];
}
 
- (NSString*)Base64StringWithPadding:(BOOL)padding
{
    uuid_t bytes;
    [self getUUIDBytes:bytes];
    NSString* string = [[NSData dataWithBytes:bytes length:sizeof(uuid_t)]
                        base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
    if (padding == NO) {
        return [string stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"="]];
    } else {
        return string;
    }
}
 
@end
```
PCモニタ解像度のシェアについて 2014/08

次のサイト [Top 10 Desktop Screen Resolutions in Japan on Aug 2014 | StatCounter Global Stats](http://gs.statcounter.com/#desktop-resolution-JP-monthly-201408-201408-bar) から、2014年8月の日本国内のPCモニタ解像度のシェアについて調査しました。

まず、結果のグラフをキャプチャしたものが以下になります。
![Top_10_Desktop__Tablet___Console_Screen_Resolutions_in_Japan_on_Aug_2014___StatCounter_Global_Stats.jpg](https://qiita-image-store.s3.amazonaws.com/0/27707/d9757a86-e1c1-6007-93ab-d8bd5acb0c49.jpeg)

次に、エクスポートしたCSVデータを、表にまとめたものが以下になります。

| Screen Resolution | Market Share Perc.|
|:-----------:|------------:|
|1366x768|25.21|
|1920x1080|1.76|
|1280x800|7.04|
|1280x1024|4.83|
|1440x900|4.48|
|1600x900|3.77|
|1680x1050|3.29|
|1024x768|2.74|
|1920x1200|2.38|
|1280x720|2.05|
|1536x864|1.96|
|2560x1440|1.94|
|1093x614|1.32|
|1360x768|1.12|
|1301x731|0.99|
|1242x698|0.71|
|1438x808|0.55|
|360x592|0.53|
|1280x768|0.48|
|1188x668|0.45|
|Other|12.4|

# 簡単な考察
- 1366x768が強い。量販店でよく売れてそうな15インチくらいのノートPCって、未だにこの解像度が多いですよね。
- 幅については、1024px以下のシェアが数%程度であることを考えると、最低を1280px程度で想定すれば問題なさそうです。
- 一方、高さについては、相変わらず768pxのシェアが多いので、この値をベースに想定する必要がありそうです。（この点は、私の認識とズレがあって意外でした。900px〜1000pxくらいでいいかな、考えていたので。）

# 参考サイト
- [Top 5 Desktop, Tablet & Console Browsers from July 2013 to July 2014 | StatCounter Global Stats](http://gs.statcounter.com/)
オークション 検索API のレスポンスでUnitsWord欄だけが数値文字参照になっています

下記のURL（APIキーが必要）をリクエストすると、
ブラウザ上では日本語で表示されますが、
ソースを表示すると数値文字参照のような文字列になります。

http://auctions.yahooapis.jp/AuctionWebService/V2/search?sort=bids&order=a&page=1&store=0&item_status=0&gift_icon=0&category=2084039765&type=all&query=%E5%AF%8C%E5%A3%AB%E9%80%9A&appid=(あなたのAPIキー)

▼ブラウザ上の表示
＜UnitsWord＞富士通 ノートパソコン＜/UnitsWord＞

▼ソースを表示
＜UnitsWord＞＆#23500;＆#22763;＆#36890; ＆#12494;＆#12540;＆#12488;＆#12497;＆#12477;＆#12467;＆#12531;＜/UnitsWord＞

なぜこの部分だけ数値文字参照のような文字列になっているのでしょうか？

これが正しい場合、この部分を使うときだけ特殊なデコード処理が必要になります。

ご回答のほどよろしくお願いいたします。
EC-CUBE 新規ページが[500 Internal Server Error]となってしまう問題

EC-CUBEバージョン 2.13.1 です。

/user_data へ出力されるファイルのパーミッションに問題あり。

666の実行権限なしで「PHP」ファイルが生成されていた。

★生成する箇所を編集

　↓　↓　↓

```lang:/data/class/helper/SC_Helper_FileManager.php
    public function sfWriteFile($filename, $value)
    {
        if (!is_dir(dirname($filename))) {
            SC_Utils_Ex::recursiveMkdir(dirname($filename), 0777);
        }
        $fp = fopen($filename,'w');
        if ($fp === false) {
            return false;
        }
        if (fwrite($fp, $value) === false) {
            return false;
        }
        chmod($filename, 0755); //★ココ
        return fclose($fp);;
    }

```

上記「★ココ」の行（パーミッションを変更処理）を追記
331 行目あたり。
go-tourの#71を解いてみる

# 問題
[こちら](http://go-tour-jp.appspot.com/#71)
元々用意されているwebクローラを改良するのが課題

* 平行処理でクロールする
* クロール済みのページはクロールしない

# 回答
こんなんでいいのかな…もっといい感じに書ける気がする。
ポイントは

* fetch済かどうかをChennel(holder)で管理している
* 子goroutineが終わるまで親のプロセスが待つためのChannel(done)を用意する

```go
package main

import (
	"fmt"
	"time"
)

type Fetcher interface {
	// Fetch returns the body of URL and
	// a slice of URLs found on that page.
	Fetch(url string) (body string, urls []string, err error)
}

// Crawl uses fetcher to recursively crawl
// pages starting with url, to a maximum of depth.
func Crawl(url string, depth int, fetcher Fetcher) {
	fmt.Printf("start. depth=%d, url=%s\n", depth, url)
	if depth <= 0 {
		return
	}

	history := <-holder
	if _, ok := history[url]; ok {
		fmt.Printf("already fetched: %s \n", url)
		holder <- history
		return
	}
	history[url] = url
	holder <- history

	body, urls, err := fetcher.Fetch(url)
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Printf("found: %s %q\n", url, body)
	done := make(chan bool)
	for _, u := range urls {
		go func(url string) {
			Crawl(url, depth-1, fetcher)
			done <- true
		}(u)
	}

	for _, _ = range urls {
		<-done
	}

	fmt.Printf("end. depth=%d, url=%s\n", depth, url)
	return
}

var holder chan fetchHistory

func init() {
	holder = make(chan fetchHistory, 1)
	holder <- fetchHistory(make(map[string]string))
}

func main() {
	Crawl("http://golang.org/", 4, fetcher)
	fmt.Println("finish!!")
}

var historyHolder chan fetchHistory

type fetchHistory map[string]string

// fakeFetcher is Fetcher that returns canned results.
type fakeFetcher map[string]*fakeResult

type fakeResult struct {
	body string
	urls []string
}

func (f fakeFetcher) Fetch(url string) (string, []string, error) {
	if res, ok := f[url]; ok {
		return res.body, res.urls, nil
	}
	// timeout
	time.Sleep(1000 * time.Millisecond)
	return "", nil, fmt.Errorf("not found: %s", url)
}

// fetcher is a populated fakeFetcher.
var fetcher = fakeFetcher{
	"http://golang.org/": &fakeResult{
		"The Go Programming Language",
		[]string{
			"http://golang.org/pkg/",
			"http://golang.org/cmd/",
		},
	},
	"http://golang.org/pkg/": &fakeResult{
		"Packages",
		[]string{
			"http://golang.org/",
			"http://golang.org/cmd/",
			"http://golang.org/pkg/fmt/",
			"http://golang.org/pkg/os/",
		},
	},
	"http://golang.org/pkg/fmt/": &fakeResult{
		"Package fmt",
		[]string{
			"http://golang.org/",
			"http://golang.org/pkg/",
		},
	},
	"http://golang.org/pkg/os/": &fakeResult{
		"Package os",
		[]string{
			"http://golang.org/",
			"http://golang.org/pkg/",
		},
	},
}
```
MacにAWS CLIをインストール


前提としてMacOS10.9&Pythonほとんど触らないこと(virtualenvとかpyenv使っている場合はよくわかりません)

AWSCLIのインストール条件にPython2.6以上があるので、そこは注意(まあ、今ならたいていおっけ？だとおもうけど)MacOS10.9だとデフォルトで2.7.5が入っているはず。


```bash:
$ pytyon --version
Python 2.7.5
```

実際にインストールしてみる

```bash:
$ sudo easy_install pip
$ sudo pip install awscli
```


```bash:
$ aws help
```

これでhelpが出てればおっけーです。
pyenv を使って macOS に Python の環境を構築する

[pyenv](https://github.com/pyenv/pyenv) という Python のバージョンマネージャを使って Python を管理する。macOS であれば元々 Python はインストールされているけど、これはシステム用なので使いたくない。もちろん Homebrew 使っても楽にインストールできるけど、Python のバージョンを複数切り替えて使いたい場合はバージョンマネージャを使うのが現実的である。

## pyenv をインストールする

pyenv をホームディレクトリの `.pyenv` にクローンしてくる。

```bash
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

## pyenv にパスを通す

zsh であれば `.zprofile` とか、bash であれば `.bash_profile`とか。

```bash
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/shims:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
```

つまり、以下の設定が記述されていれば OK。

```
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/shims:$PATH"
eval "$(pyenv init -)"
```

シェルを再起動すると `pyenv` コマンドが使えるようになる。

## pyenv で Python をインストールする

以下のようにバージョンを指定して Python をインストールする。

```bash
$ pyenv install 3.4.3
$ pyenv install 2.7.9
```

すると、`~/.pyenv/versions/` 配下にインストールしてきた Python が配置される。インストールしてきた後は shim のリフレッシュをしておく。

```bash
$ pyenv rehash
```

## 使う Python を指定する

あとは、実際に使う Python を指定する。グローバルに指定したいのであれば、`pyenv global` を、ローカルで指定したいのであれば `pyenv local` を使う。

```bash
$ pyenv global 3.4.3
```

実行後に、パスが `.pyenv` 配下の python を向いていれば OK。`pyenv local` の場合はカレントディレクトリに `.python-version` というファイルが生成され、そこで指定したバージョンの Python を参照するようになる。

```bash
$ which python
# /Users/1000ch/.pyenv/shims/python
```

## Python をアンインストールする

`pyenv` を使ってインストールした Python は、以下のようにしてアンインストールする。

```bash
$ pyenv uninstall 3.4.3
```

そのままですね。
traitでabstract methodを使ってクラスの変数にアクセスする

PHPのtrait。まだ使いこなせません。

例えばtraitでメンバー変数を扱うことが出来ます。

```php
trait HelloTrait {
  protected $hello = 'hello trait';
  function hello() {
    echo $this->hello;
  }
}
```

ただ、この```$hello```のメンバー変数をクラスと共有しようとすると面倒です。

クラスで設定したメンバー変数の値を表示する場合です。

```php
class Hello {
  use HelloTrait;
  protected $hello = 'hello class';
}
echo (new Hello)->hello();
```

上のコードはFatalエラーを発生します（するはず。実は走らせてない…）。クラスとtraitで同じメンバー変数がありますが、値が違うからです。同じにしてもE_STRICTエラーが発生します。

ならば、traitの```protected $hello```を削除すればエラーがなくなりますが、traitで使っているメンバー変数が存在しないので、変です。それに```$hello```を持たないクラスで使うとエラーが出るかもしれません。

そんな時はgetter関数を使います。
例えば```function getHello()```。

更にtrait内でabstractメソッドを指定してあげると使い勝手が上がります。

```php
trait HelloTrait {
  abstract protected function getHello();
  function hello() {
    echo $this->getHello();
  }
}

class Hello {
  use HelloTrait;
  protected $hello = 'hello class';
  protected function getHello() {
    return $this->hello;
  }
}
```

クラス側で```getHelloメソッド```を持たないクラスで```HelloTrait```を使うと、すぐエラーがでて問題が分かります。

値を変えるときは、同じようにsetterメソッドを追加します。

参考：http://www.slideshare.net/mikestowe/traits-and-horizonal-design
PATH に特定のパスが含まれるかどうか調べる

```sh
[[ ":${PATH}:" == *:"/usr/local/bin":* ]] ; echo $?
```

**パクリ元**

[rbenv/rbenv-init - sstephenson/rbenv](https://github.com/sstephenson/rbenv/blob/13a474c4e9c3305179b364723349fc49b3e935e3/libexec/rbenv-init#L95 "rbenv/rbenv-init - sstephenson/rbenv")
iOSでキーボードがニョキッと出てきてUIScrollView上の入力フォームが隠れる問題を0.5秒でフィクスする

# 実際は多分50秒くらいかかります
つかみが大切なので悪しからず。

UIScrollView上のUITextFieldに入力しようとタップするとキーボードがせり上がってきますよね。そのキーボードでこれから入力しようとしているUITextFieldが隠れるのを解決する方法です。

## やり方

Cocoapodを使って1つだけ入れてください。

```bash:Podfile
pod "EKKeyboardAvoiding"
```

中にUIScrollViewのカテゴリが含まれてます。

```objc:UIScrollView+EKKeyboardAvoiding.h
#import <UIKit/UIKit.h>
@interface UIScrollView (EKKeyboardAvoiding)
- (BOOL)keyboardAvoidingEnabled;
- (void)setKeyboardAvoidingEnabled:(BOOL)enabled;
@end
```

見ての通りUIScrollViewのインスタンスでsetKeyboardAvoidingEnabled:YESを呼んでやれば、キーボードが出てきたときにその分スクロールしてくれます。スクロールが一番下まで来ていても、なんというかオーバースクロール？してくれます。

## ストーリーボードだけで解決する

上記のヘッダファイルは、正確にはこう言ってしまっていいのかは分かりませんが、俺的には

```objc:UIScrollView+EKKeyboardAvoiding.h
#import <UIKit/UIKit.h>
@interface UIScrollView (EKKeyboardAvoiding)
@property (readwrite) BOOL keyboardAvoidingEnabled;
@end
```

と等価だと思ってます。

なのでストーリーボードで対象のUIScrollViewを選択しUser Defined Runtime AttributesにkeyboardAvoidingEnabledというキーを追加しBOOLでチェックボックスをオン（YES）にします。

こうすればコードを一切書かずにフィクス出来ます。
Githubのタブが8文字で見にくいのでextensionで解決


参考：http://stackoverflow.com/questions/8833953/how-to-change-tab-size-on-github

## Stylish(ChromeExtension）のインストール

[ChromeのExtensionをインストール](https://chrome.google.com/webstore/detail/stylish/fjnbnpbmkenffdnngjfgmeleoegfcffe)
[FirefoxもAdd onあります](https://addons.mozilla.org/en-US/firefox/addon/stylish/?src=external-userstyleshome)


## 設定

Extensionの設定画面から下記設定します。

![スクリーンショット_2014-08-28_13_31_12.png](https://qiita-image-store.s3.amazonaws.com/0/8463/dca57b44-8937-5137-66f0-e1dbdb9602c5.png "スクリーンショット_2014-08-28_13_31_12.png")

css上書き用のコードはこちら。デフォルトで4文字、rubyのコードの場合は2文字にしたい時には下記のようになります。言語によっていろいろ変えたい場合は適宜編集してください。

```
.tab-size-8 {
    -moz-tab-size: 4 !important;
    -webkit-tab-size: 4 !important;
    -o-tab-size: 4 !important;
    tab-size: 4 !important;
}
    
.type-ruby .tab-size-8 {
    -moz-tab-size: 2 !important;
    -webkit-tab-size: 2 !important;
    -o-tab-size: 2 !important;
    tab-size: 2 !important;
}
```

## おまけ
パラメータの後ろに```?ts=2```とか```?ts=4```とか入れると簡単にタブサイズ切り替えれるようです。ただ、毎回は面倒なのでExtension入れとくといいかと。