OmniAICreator/Qiita-1.07M huggingface dataset:
WindowsXPライクなボタンをCSS3とSass(Compass)で作ろう

## これが実際のXPのボタン
![qiita_xp.png](https://qiita-image-store.s3.amazonaws.com/0/2509/7316ac52-f9e8-386b-4faa-69036a0bb1da.png "懐かしい…")

こんなの作ってみよう。

```scss:xplike.scss
input {
	padding: 5px 30px;
	color: #020167;
	font-weight: bold;
	background-color: rgb(252,252,250);
	@include background(linear-gradient(top, rgba(252,252,250,1) 0%,rgba(236,235,230,1) 100%));
	@include border-radius(3px);
	border: 1px solid #003c73;
	@include box-shadow(
		1px 0 0 #e6e1db,
		0 -1px 0 #e6e1db,
		-1px 0 0 #e6e1db,
		0 1px 0 #e6e1db,
		2px 0 0 #bcd4f6 inset,
		0 1px 0 #bcd4f6 inset,
		-2px 0 0 #bcd4f6 inset,
		0 -1px 0 #bcd4f6 inset
	);

	&:active {
		background-color: rgb(236,235,230);
		@include background(linear-gradient(top, rgba(236,235,230,1) 0%,rgba(252,252,250,1) 100%));
	}
}
```

## できあがったもの
![qiita_xplike.png](https://qiita-image-store.s3.amazonaws.com/0/2509/15bbf6e9-a76b-5e18-83a7-61259cd7b112.png "もうちょっと頑張れば何とかなりそうな気もする")

瓜二つというわけにはいかなかったけど、まあこんなもんじゃないでしょうか。mixinで使い回そう！
コードにコンパイル日時を埋め込みたい

# モチベーション

コンパイルしたときの日時情報（C/C++ の \_\_DATE\_\_ や \_\_TIME\_\_）が欲しくなることがあります。

# 解決方法

次のマクロを使う。マクロの展開がコンパイル時であることを利用する。

```py
# pythonじゃないよ。Booだよ。
import Boo.Lang.Compiler.Ast

# build_date: 引数名の変数にコンパイル日時を代入するコードを生成するマクロ。
macro build_date( vn as ReferenceExpression ):
	# この行はコンパイル時(build_date が展開されるとき)に実行されるので、dt にはコンパイル時の日時文字列が代入される。
	dt = System.DateTime.Now.ToString() 

	# ここはコンパイル時に展開されて、ランタイムコードとなる部分。
	yield [|
		$(vn) = $(dt)  # コンパイル日時文字列をコードに埋め込む。
	|]
```

次のように使う。

```py
build_date bd
print "build: ${bd}"
```
Titanium Android 開発メモ


## Keytool
`keytool -genkey -v -keystore ./XXXX.keystore -alias XXXX -keyalg RSA -keysize 2048 -validity 11000`

## 本番ビルド
`titanium build --platform android --deploy-type production -f --target dist-playstore --keystore _assets/XXXX.keystore --alias XXXX --password XXXX --output-dir ~/Desktop/`
あるコードを環境変数の値によってコンパイルするかどうか決める

# モチベーション

* 自分がビルドしているときだけコンパイルされるコードを入れたい。
* 特定の環境上でビルドしているときだけ組み込まれるメソッドが欲しい。

# 解決方法

次のマクロを使う。

```py
# pythonじゃないよ、Booだよ。
import System
import Boo.Lang.Compiler.Ast

macro ifenv( en as ReferenceExpression, v as StringLiteralExpression ):
	# macro内のコードはマクロ展開時（コンパイル時）に実行される。
	# よって、un にはコンパイル環境上の環境変数値が代入される。
	un = Environment.GetEnvironmentVariable( en.Name )

	# 引数で指定した文字列なら、ifenvマクロの本体ブロックを展開。
	yield ifenv.Body if un == v.Value
```

## 使用方法

次のような感じ。ifdef のように使用出来る。


```py
ifenv USER, "nistake":
	print "hello nistake!"   # 環境変数USER=='nistake'のときだけコンパイルされる。
```

# 結論

あまりオレオレコードをたくさん入れると、他人には何のゴミだと思われることもあります。

# おまけ

Boo の ifdef は、この ifenv マクロと同じく、言語コアな機能ではなくただのマクロです(Booコンパイラソース "   src/Boo.Lang.Extensions/Macros/IfdefMacro.boo)。
Cでの正規表現


C+11では正規表現をサポートしているがそれ以前のバージョンだとサポートしていないようなのでC言語の正規表現を利用する

C言語で正規表現を利用する場合`regex.h`をincludeして、`regcomp``regexec``regfree`この３つの関数を利用する。

```main.cpp
#include <iostream>
#include <regex.h>

int main( int argv, char* args[] )
{
	char checkString[] = "abc, def, ghi";					// チェックをする文字列
	const char regex[] = "([a-z]+), ([a-z]+), ([a-z]+)"; 	// マッチングをする文字列
	regex_t	regexBuffer;									// 正規表現オブジェクト

	// 正規表現オブジェクトのコンパイル
	if( regcomp( &regexBuffer, regex, REG_EXTENDED | REG_NEWLINE ) != 0 )
	{
		std::cout << "regex compile failed" << std::endl;
		return 1;
	}

	// パターンにマッチングしたインデックス格納する構造体
	regmatch_t patternMatch[4];

	int size = sizeof( patternMatch ) / sizeof( regmatch_t );
	if( regexec( &regexBuffer, checkString, size, patternMatch, 0 ) != 0 )
	{
		std::cout << "No match!!" << std::endl;
		return 1;
	}

	// マッチした場合patternMatch構造体に文字列のindex番号が入る
	// 配列の数がマッチ数を超えていた場合超えた構造体の各要素には-1が入る
	for( int i = 0; i < size; ++i )
	{
		int startIndex = patternMatch[i].rm_so;
		int endIndex = patternMatch[i].rm_eo;
		if( startIndex == -1 || endIndex == -1 )
		{
			std::cout << "exit" << std::endl;
			continue;
		}
		std::string putStr( checkString, startIndex, endIndex - startIndex );
		std::cout << putStr << std::endl;
	}

	// オブジェクトの開放
	regfree( &regexBuffer );
	return 0;
}
```

上のコードの結果は下記になる

```Terminal.app
abc, def, ghi	 #patternMatch[0]の結果の文字列
abc				 #patternMatch[1]の結果の文字列
def				 #patternMatch[2]の結果の文字列
ghi				 #patternMatch[3]の結果の文字列
```

結果の格納先の配列数が少ない場合その分結果のオブジェクトが削られるがマッチしないことはない
結果はpythonの正規表現と同じように一番指定文字列全体にマッチングした文字列
それ以降はグルーピングごとの順番で格納される。
ただしregcomp 関数をコールする際に指定した`REG_EXTENDED`この指定を行わないとグルーピングなどの拡張正規表現は使えないようだ。
REG_EXTENDED 大事！！
[ ]などとマッチングを指定したい場合メタ文字になっているため\をつけるなど指定には注意が必要


以下は正規表現を行うのに使用した関数の説明

##regcomp
```
int regcomp(regex_t *preg, const char *regex, int cflags)
正規表現のコンパイルを行なう。コンパイル成功時には0を返す。
cflags には以下に示す定数一つ以上のビッ>トごとの OR (bitwise-or) を指定する。

REG_EXTENDED
regex に POSIX 拡張正規表現を使用する。もしこのフラグが設定されない場合、POSIX 標準正規表現が使われる。
REG_ICASE
大文字小文字の違いを無視する。
REG_NOSUB
このフラグを設定してコンパイルされたパターンバッファが regexec の引数に指定されると、パラメータ nmatch, pmatch が無視される。
REG_NEWLINE
全ての文字にマッチするオペレータに改行をマッチさせない。
```


##regexec

```
int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
正規表現による検索を実行する。
eflags には以下に示す定数一つ以上のビットごとの OR (bitwise-or) を指定する。

REG_NOTBOL
行頭にマッチするオペレータは、必ずマッチに失敗する (コンパイル時のフラグ REG_NEWLINE の項目も参照)。このフラグは、複数行にまたがる文字列を regexec() で検索する際に、文字列の先頭を行の先頭として解釈させない場合に用いる。
REG_NOTEOL
行末にマッチするオペレータは、必ずマッチに失敗する。
```

##regfree

```
void regfree(regex_t *preg)
正規表現パターンバッファを解放する。
```
空でないディレクトリを削除する

glob() を使ってディレクトリ配下のパスを収集。

再帰関数版

```rmrf.php
<?php

function rmrf($dir) {
    if (is_dir($dir) and !is_link($dir)) {
        array_map('rmrf',   glob($dir.'/*', GLOB_ONLYDIR));
        array_map('unlink', glob($dir.'/*'));
        rmdir($dir);
    }
}

$dir = "aaa";
rmrf($dir);
```

インライン版

```rmdir_r.php
<?php

$dir = "aaa";

if (is_dir($dir) and !is_link($dir)) {
    $paths = array();
    while ($glob = glob($dir)) {
        $paths = array_merge($glob, $paths);
        $dir .= '/*';
    }
    array_map('unlink', array_filter($paths, 'is_file'));
    array_map('rmdir',  array_filter($paths, 'is_dir'));
}
```

隠しファイルやディレクトリへのシンボリックリンクが含まれていると失敗する…
文字列をバイト列のstreamとして扱う

文字列をバイト列にし、それをstreamとして扱いたい場面があったのでその方法をメモしておく。

以下のような関数のテストがしたかった

```common-lisp:read-string.lisp
(defmethod get-data-from-post-data (query)
  "clackサーバのenvironmentからPostのデータを読み取って適切な文字コードに変換して返す"
  (let ((stream (getf query :RAW-BODY))
	(temp ""))
    (setf temp (concatenate 'string 
			    temp 
			    (jp:decode (getf query :RAW-BODY-BUFFER) :guess)))
    (do ((line (read-line stream nil)
     	       (read-line stream nil)))
     	((null line))
      (setf temp (concatenate 'string
      			      temp 
      			      (jp:decode (kmrcl:string-to-usb8-array line)  :guess)
      			      (list #\newline))))
    temp))

```

clackではqueryの:raw-bodyに送信されてきたデータが入っている。 
その型は、バイト列のstream(flexi-stream)である。

この関数のテストをしようとしたら
文字列からバイト列のstreamを作成する必要がある。

```common-lisp:create-stream.lisp
(flexi-streams:make-flexi-stream (flexi-streams:make-in-memory-input-stream (flexi-streams:string-to-octets 
"こんにちわ
日本語でもだいじょうぶ
&author=test" :external-format :utf-8)))
```

上記のようにすることで、文字列をバイト列のstreamに変換できた。
これを見つけるのに2時間も時間を使ってしまった...。

in-memory-input-streamで作っただけだとread-lineするとエラーになってしまう。
in-memory-input-streamからflexi-streamに変換することでread-lineできるstreamに
なることに気が付かなかった...。

とりあえず、これで様々な入力のテスト実行ができたのでガシガシ開発進めていきたい。
stashからapplyやpopができなくなった時。

git stash applyやgit stash popを実行した際に、エラーが出て実行できなくなるときってありますよね？

例えば)
ブランチAで
untrackedなファイルA.txtがある状態で

```bash:
git stash save -u
```

ブランチBで同じファイルA.txtがある状態で

```bash:
git stash apply
```
なんてすると以下のエラーが出ます。

```bash:
A.txt already exists, no checkout
Could not restore untracked files from stash
```
こういった場合、強制的にstash applyしたい時は以下の様にすればOK

```bash:
 git merge "stash@{0}"  
```
そうです、stashもmerge出来るんです。
もちろんcheckoutで個別にファイルを取得することもできます。
document.body.scrollTopが常に0を返す謎を調べてみた

JavaScriptを使って現在のスクロール位置を取得するために

```js
document.body.scrollTop
```

としますが、この値がどうしても常に **0** を返してしまうことがありました。

# bodyにoverflow: auto

結論としては、CSSに

```css
html, body {
  height:100%;
  min-height:100%;
  overflow:auto;
}
```

という指定がしてあったからでした。

これは **body** の子要素で **body** からはみ出る部分は自動的にスクロールバーが表示されて、スクロールが出来るようになります。

# 詳しくはこう

で、図にしてみるとわかりやすいのですが

<pre>
+-------------------------------------------------------------
| html
| +-------------------------------+←ーー ここがscrollTop = 常に0
| | body                          |   ↑
| | +---------------------------+ |   |
| | |                         ↑ | |  bodyではスクロールしないで
| | |               Scroll Area | |  子要素の中でスクロールする
| | |                         ↓ | |   |
| | +---------------------------+ |   ↓
| +-------------------------------+←ーー
+--------------------------------------------------------------
</pre>

こんな感じになってました。普通はこんなんだと思う。

<pre>
+--------------------------------------
| html
| +-------------------------------+
| | body                       ↑  |
| |                            |  |
| |                  Scroll Area  |
| |                            |  |
| |                            ↓  |
| +-------------------------------+
+--------------------------------------
</pre>

# あとがき

原因がわかれば結構単純なんですが、3日くらいはまりました orz
FacebookのGraph APIでユーザーの母国語名取得

今まで「FQL」を使う方法しか知らなかったけど、Graph APIでも母国語名の取得が出来たのか…
という事で以下備忘録的に。

```php:
<?php
// 略
// fbの友達リスト取得
$graph_url = "https://graph.facebook.com/me/friends/?locale=ja_JP&access_token=" . $access_token;
$friendlist = json_decode(file_get_contents($graph_url));
/* var_dump($friendlist);
object(stdClass)#79 (2) {
  ["data"]=>
  array(5) {
    [0]=>
    object(stdClass)#80 (2) {
      ["name"]=>
      string(19) "山田 太郎"
      ["id"]=>
      string(10) "xxxxxxxxxxxxxxx"
    }
    [1]=>
    object(stdClass)#81 (2) {
      ["name"]=>
      string(10) "山田 花小"
      ["id"]=>
      string(15) "xxxxxxxxxxxxxxx"
    }
  }
*/
```
Access の SQL で 3つ以上の表を join する

Access で普通に join を使うと、2つまでしか結合できません。
が、下のように結合した表を括弧で囲んでやり、それを1つの表としてやると、
3つ以上の表を結合できます。

```sql:3つの表をJOIN
SELECT TA.*,TB.*,TC.* FROM ( TA 
LEFT JOIN TB ON ( TA.b = TB.id ) )
LEFT JOIN TC ON ( TA.c = TC.id ) ;
```
for内の変数のうごき

for文を使うとき、

1. $_を使う
2. my変数を使う
3. 中でmy変数に代入して使う

のような書き方があると思うんですが、
それぞれを書き換えてみたとき、挙動が1と2は同じで、3だけ違ったのがびっくりだったので、めもめも。

---


* 1.  $_を書き換え

```pl:
my @arr = qw/a b c d e f g/;

for (@arr) {
    if ($_ eq "c") {
        $_ = "!!!";
    }
}

print @arr;    # ab!!!defg 破壊的
```

* 2.  my変数を使って書き換え

```pl:
my @arr = qw/a b c d e f g/;

for my $arg (@arr) {
    if ($arg eq "c") {
        $arg = "!!!";
    }
}

print @arr;    # ab!!!defg 破壊的
```

* 3.  中でmy変数に代入して書き換え

```pl:
my @arr = qw/a b c d e f g/;

for (@arr) {
    my $arg = $_;
    if ($arg eq "c") {
        $arg = "!!!";
    }
}

print @arr;    # abcdefg 非破壊的
```

こんな感じ。

---

Devel::Peekを使ってみてみたら、
1と2は内部的にまったく同じものとして処理されていました。
for宣言時のmy変数は、$_と同じく、for構文が用意してくれる変数、ということなのでしょうか。

一時的に中身を書き換えたい、というときなどは、ループ内で代入してあげるのがよさそうですね。
n秒おきにcronを指定


seq コマンドで待機（sleep）する秒数を出して、その分 sleep してからスクリプトを実行します。

```bash:crontab
; 10秒おきに実行
* * * * * for i in `seq 0 10 59`;do (sleep ${i} ; /path/to/script prm1 prm2) & done;

; 15秒おきに実行
* * * * * for i in `seq 0 15 59`;do (sleep ${i} ; /path/to/script prm1 prm2) & done;

; 毎分15秒と45秒に実行
* * * * * for i in 15 45;do (sleep ${i} ; /path/to/script prm1 prm2) & done;
```
ArchARMでabsしようとするとERRORする件について

Raspberry pi上のArchLinux(ArchARM)でabsしようとすると通らない。

```sh:
> $ sudo abs
==> Downloading tarballs...
==> core...
==> ERROR: Download failed
==> extra...
==> ERROR: Download failed
==> community...
==> ERROR: Download failed
==> multilib...
==> ERROR: Download failed
```

# 対処

まず最初に`abs core`する必要があるとのこと。
その後`abs`すると通る。なぜかわからないけど、とのこと。

## 参考:

http://archlinuxarm.org/forum/viewtopic.php?f=31&t=4420#p24381
Scalaでニコ生アラート(コメントサーバに接続するところまで)書いてみた

# Scalaでニコ生アラート
rubyとかjavaとかでニコ生アラートつくってみた、という記事はありますがScalaでニコ生アラートつくってみた、というのがなかった(or 見つけられなかった)ので作ってみました。
Web APIとの通信はDispatcherを使っているのでBuild.scalaでDependenciesに追加する必要があります

```scala:NicoliveAlert.scala
/**
 * author: crexista
 */
class NicoLiveAlertClient {

	val mailAddress = ""//ここにニコニコ動画に登録してるメールアドレスを入れます

	val passWord = ""//ここにニコニコ動画にログインするさいのパスワードをいれます

	val authURL = "https://secure.nicovideo.jp/secure/login?site=nicolive_antenna"

	val userAgent = "NicoLiveAlert 1.0.0"

	val apiURL = "http://live.nicovideo.jp/api/"

	val getAlertAPI = "getalertstatus"

	def start() = {
		val http = new Http
		val param = Map[String, String]("mail" -> mailAddress, "password" -> passWord)
		val userAgentMap = Map[String,String]("User-Agent" -> userAgent)

		//ユーザー認証トークンです
		val token = (http(url(authURL).POST <:< userAgentMap << param >> ((a:InputStream) => XML.load(a))) \\ "ticket").text

		//ニコ生アラートに接続するためのスレッド情報を取得します
		val alertStatus = http(url(apiURL + getAlertAPI).POST << Map("ticket" -> token) >> ((a:InputStream) => XML.load(a)))

		val host = (alertStatus \\ "ms" \\ "addr").text
		val port = (alertStatus \\ "ms" \\ "port").text.toInt
		val thread = (alertStatus \\ "ms" \\ "thread").text.toInt

		val socket = new Socket(host, port)
		val echoMessage = "<thread thread=\"" + thread.toString + "\" version=\"20061206\" res_from=\"-1\"/>\0"
		val recieveData:ArrayBuffer[Byte] = new ArrayBuffer[Byte](200)

		socket.getOutputStream.write(echoMessage.getBytes("UTF-8"))
		socket.getOutputStream.flush()

		while(true) {
			val onData = socket.getInputStream.read.toByte
			recieveData += onData
			if (onData == 0){
				println(new String(recieveData.toArray, "UTF-8"))
				recieveData.clear()
			}
		}
	}

}
```
## はまりどころ
ニコ生のコメントサーバはXmlSocketというプロトコルを使っていて
xmlデータの最後には改行コードではなくNULL文字をつけて通信しているということ。
詳しくはここ
http://d.hatena.ne.jp/rivertop/20070622/1182529919

なので、getlineとかつかうとずっと待ち受け状態になってしまう。

## Build.scala
ニコニコ生放送のWeb APIをDispatcherを使って叩いているのでDispatcher(classic)をDependenciesで呼んであげる必要がある

```scala:Build.scala
import sbt._
import sbt.Keys._


object NicoLiveAlertBuild extends Build {

	val dispatch = "net.databinder" %% "dispatch-http" % "0.8.9"

	val typeSafeResolver = "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"


	lazy val root = Project(
		id = "NicoliveAlert",
		base = file("."),
		settings = Project.defaultSettings ++ Seq(
			name := "NicoliveAlert",
			organization := "st.crexi",
			scalaVersion := "2.10.0",
			libraryDependencies ++= Seq(dispatch),
			resolvers ++= Seq(typeSafeResolver)
		)
	)

}
```
コンフリクトした xib ファイルを上手にマージする

本稿では、 Git でブランチをマージした際にコンフリクトした xib ファイルの衝突解決手順を解説する。

**追記：** Xcode 5 から導入された新しい xib フォーマットではコンフリクトが起こりにくくなっている。また、コンフリクトした場合に手作業で xib ファイルを編集することも、以前のフォーマットと比べれば容易になっている。本稿では以前のフォーマットを使っていることを前提に話を進める。

# ステップ0：コンフリクトの解決をあきらめる
Xib ファイルをテキストエディタで編集してコンフリクトを解決しようなどと考えてはいけない（変更がごく小規模な場合を除く）。コンフリクトした xib ファイルは捨てて素直に作り直すのがよい。ただし、記憶を頼りに変更を再現する必要はない。 Xib ファイルの要素は **コピー&amp;ペーストできる** ので、変更点の移植は比較的簡単にできる。

# ステップ1：ベースにする xib ファイルをチェックアウトする
以下、 `base` ブランチに `other` ブランチをマージし、 `Foo.xib` がコンフリクトしたと想定する：

```
git checkout base
git merge --no-ff other
# Foo.xib がコンフリクト
```

まずはどちらかのブランチから `Foo.xib` をチェックアウトする。ここでチェックアウトしたファイルをベースにして他方のファイルの変更を取り込むため、共通の祖先から見て **変更量が多いほう** を選ぶとよい：

```
git checkout base -- Foo.xib
# または
git checkout other -- Foo.xib
```

# ステップ2：他方の xib ファイルをプロジェクトに追加する
他方のブランチから xib ファイルを `Foo_.xib` に書き出す：

```
# ステップ1で base をベースにしたなら
git show other:Foo.xib > Foo_.xib

# other をベースにしたなら
git show base:Foo.xib > Foo_.xib
```

そして `Foo_.xib` をプロジェクトに追加する。

# ステップ3：ベースとなる xib ファイルに他方の要素を取り込む
`Foo_.xib` を開き、取り込みたい `Foo_.xib` の要素を選択してコピーする。 `Foo.xib` を開き、コピーした要素をペーストする。

![step3.png](https://qiita-image-store.s3.amazonaws.com/0/735/a0321039-8c78-fd8c-3d68-037b62741eda.png)

コピー&amp;ペーストでは Identifier や Tag、 Editable といった属性もコピーされる。ただし、アウトレットと Cocoa Binding の設定は **コピーされない** ので、コピー後に改めて設定する。また、要素の Object ID も変化していることに注意。

要素のコピーと設定を終えたら `Foo_.xib` をプロジェクトから削除する。

# ステップ4（オプション）： strings ファイルを編集する
ローカライズに使う strings ファイルが存在する場合、コピー後の要素に合わせて Object ID を書き換える：

```C:Foo.strings
/* Class = "NSButtonCell"; title = "Button"; ObjectID = "42"; */ // ←ここと
"42.title" = "ボタン";                                            // ←ここの ID
```

# ステップ5（オプション）： ibtool で xib をローカライズする
[ibtool コマンド](http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/ibtool.1.html)で差分ローカライズを実践しているなら、コンフリクトした2つの xib ファイルの **共通の祖先** を差分のベースにするとよい。

```
git show `git merge-base base other`:Foo.xib > Foo_common_ancestor.xib
ibtool --localize-incremental \
       --previous-file    Foo_common_ancestor.xib \
       --incremental-file Foo_localized.xib \
       --strings-file     Foo.strings \
       --write            Foo_localized.xib \
       Foo.xib
rm Foo_common_ancestor.xib
```

# Git Tips
マージ中の2つのブランチの、元々チェックアウトされていたほうは `HEAD` で参照できる。他方（`git merge` の引数にしたほう）は `MERGE_HEAD` になる。つまりステップ1とステップ2は次のようにも実行できる：

```
git checkout HEAD -- Foo.xib
git show MERGE_HEAD:Foo.xib > Foo_.xib
```

また、 `git checkout` には `--ours` と `--theirs` オプションもある：

```
# 同じ
git checkout HEAD -- Foo.xib
git checkout --ours -- Foo.xib

# 同じ
git checkout MERGE_HEAD -- Foo.xib
git checkout --theirs -- Foo.xib
```
videoタグの描画がchromeでおかしい

videoタグで横幅100%である程度までウィンドウサイズに合わせてリサイズしたかったのですが
なんかchromeで描画がおかしい。。。

chromeのバージョン 27.0.1453.110
Mac、windows共に同様の現象あり

具体的には
・音がするから動画は再生されているが何故か表示はされない
・下までスクロールして戻ってくるとたまに表示される
・デベロッパーツールとかでスタイルを変えてみると表示される

みたいな現象だったので読み込まれてはいるけど描画途中で止まっちゃたみたいな感じかなーと推測。
しかしなぜかcontrolsを表示するときちんと表示される。。。

とりあえずデザイン的にcontrolsはいらなかったので後からjsで消すというクソ対応で乗り切る。。。

```html:
<video id="vid" poster="img/cover.jpg" controls autoplay preload="auto">
<source src="video/video.mp4" type="video/mp4">
<source src="video/video.ogv" type="video/ogg">
<source src="video/video.webm" type="video/webm">
<p id="titile_top"><img src="img/cover.jpg" width="1100" height="621" alt="カバー"/></p>
</video>
```

```js:
var v = document.getElementById("vid");
v.controls = false;
```

ちなみに動画のサイズは
mp4：8.7MB
ogv：16.4MB
webM：10MB
Nginxのインストール


## 環境

Mac OS X 10.7.5

## インストール

Homebrew 使ってインストール

```
brew install nginx
```


```
==> Caveats
In the interest of allowing you to run `nginx` without `sudo`, the default
port is set to localhost:8080.

If you want to host pages on your local machine to the public, you should
change that to localhost:80, and run `sudo nginx`. You'll need to turn off
any other web servers running port 80, of course.

You can start nginx automatically on login running as your user with:
  mkdir -p ~/Library/LaunchAgents
  cp /usr/local/Cellar/nginx/1.2.7/homebrew.mxcl.nginx.plist ~/Library/LaunchAgents/
  launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist

Though note that if running as your user, the launch agent will fail if you
try to use a port below 1024 (such as http's default of 80.)

To have launchd start nginx at login:
    ln -sfv /usr/local/opt/nginx/*.plist ~/Library/LaunchAgents
Then to load nginx now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist

WARNING: launchctl will fail when run under tmux.
Warning: /usr/local/sbin is not in your PATH
You can amend this by altering your ~/.bashrc file
==> Summary
 /usr/local/Cellar/nginx/1.2.7: 9 files, 892K, built in 12 seconds
```

## サーバ起動と動作確認

以下の通り設定のテストを実施する

```
$ nginx -t -c /path/to/nginx.conf
```
結果が successful であればOK


以下のとおりサーバ起動

```
$ nginx -c /path/to/nginx.conf
```

その後、http://localhost:8080/ にアクセスして Welcome ページが表示されたらOK

## サーバ停止

```
$ nginx -s stop
```

## 設定再読み込み

```
$ nginx -s reload
```


## 設定

/usr/local/etc/nginx/nginx.conf

設定ファイル指定で起動

```
$ /usr/local/sbin/nginx -c /Users/nakamatsu（設定ファイルパス）
```

設定ファイルは絶対パス推奨

## 参考

[Rails + Nginx + Unicorn インストール | ハコフグ](http://dehehedori.com/ruby/1320/)
[nginx + unicornでrails3.1が動作する環境を作る - A Peak Never Ending !](http://semind.github.com/blog/2012/01/19/nginx-plus-unicornderails3-dot-1gadong-zuo-suruhuan-jing-wozuo-ru/)
[Nakajijapan » 「Unicorn + Rails + Nginx」で構築してみる](http://blog.nakajijapan.net/archives/3135)
Node.js & Express & MongoDB でREST サーバーを作る

http://coenraets.org/blog/2012/10/creating-a-rest-api-using-node-js-express-and-mongodb/

このページを参考に作りました。
英語ページですが、コードを読めば英語を理解しなくても作れます。

私の場合、参考ページと違うのはMongo DBをインストールするのに`brew`をした点だけです。

ただ、動作はするのですが、以下のメッセージが表示されてしまいます。

========================================================================================
=  Please ensure that you set the default write concern for the database by setting    =
=   one of the options                                                                 =
=                                                                                      =
=     w: (value of > -1 or the string 'majority'), where < 1 means                     =
=        no write acknowlegement                                                       =
=     journal: true/false, wait for flush to journal before acknowlegement             =
=     fsync: true/false, wait for flush to file system before acknowlegement           =
=                                                                                      =
=  For backward compatibility safe is still supported and                              =
=   allows values of [true | false | {j:true} | {w:n, wtimeout:n} | {fsync:true}]      =
=   the default value is false which means the driver receives does not                =
=   return the information of the success/error of the insert/update/remove            =
=                                                                                      =
=   ex: new Db(new Server('localhost', 27017), {safe:false})                           =
=                                                                                      =
=   http://www.mongodb.org/display/DOCS/getLastError+Command                           =
=                                                                                      =
=  The default of no acknowlegement will change in the very near future                =
=                                                                                      =
=  This message will disappear when the default safe is set on the driver Db           =

========================================================================================

`var server = new Server('localhost', 27017, {safe:true});`
としてみたのですが、このメッセージが出てしまいます。
むむむぅ。
Goの開発環境(Vim + Vundle編)

Goの開発環境Vim版について、[mattnさんの記事](http://mattn.kaoriya.net/software/vim/20130531000559.htm)を見ながら作りました。
私はVimの環境に[Vundle](https://github.com/gmarik/vundle)を使っており、その絡みでほんの少し手順に違いがあったので、メモとして残しておきます。
ついでにLintも入れてみる次第です。

# 大前提：PATHの設定
Goの環境変数はGOROOT(Goのインストールフォルダ)とGOPATH(Goの外部ライブラリを保存するフォルダ)の2つがありますが、このうちGOPATHを用いて $GOPATH/bin を環境変数PATHに含めます(Windowsの場合は%GOPATH%\bin)。


# gocodeとGo用lintのインストール

[gocode](https://github.com/nsf/gocode)は下記コマンドでインストール。

```
go get github.com/nsf/gocode
```

[Golint](https://github.com/golang/lint)は下記コマンドでインストール。

```
go get github.com/golang/lint
```

それぞれ、$GOPATH/bin/ 以下にgocode, golintの実行形式ファイルが出来ていればOKです。


# .vimrcの設定

Vundle用gocode設定として、下記の設定を追加し、BundleInstallでインストールします。

```vim:.vimrc
Bundle 'Blackrush/vim-gocode'
```


既にVundleをご利用の方は、""Vundleの設定と書いているコメントより下の2行が既に.vimrcに書かれているかと思います。
このVundleの設定よりも上に、gocodeとgolintの設定を記述します。

```vim:.vimrc
" gocode
set rtp+=$GOROOT/misc/vim
"golint
exe "set rtp+=" . globpath($GOPATH, "src/github.com/golang/lint/misc/vim")

""Vundleの設定
set rtp+=~/vimfiles/bundle/vundle/
call vundle#rc('~/vimfiles/bundle')
```

最後にGo用に下記も記載してください。

```vim:.vimrc
"" Go
filetype plugin indent on
syntax on
```

これでVimの設定は完了です。

# コード補完、Lintの実行方法

コードの補完はオムニ補完を使えばOKですが、使い方は最初に上げたmattnさんの記事が断然参考になります。

mattnさんの記事に書かれていないLintの使い方ですが、単純に:Lintと打てばOKです。
少し触った感じですと、publicの関数・メソッドに対してコメントが書かれていない場合などに指摘してくれるようです。

# TODO
この辺は対応して行きたい…

+ quickrunによるテスト
+ ソース保存時の自動フォーマット → 追記しました(2013-06-11)

## ソース保存時の自動フォーマット (2013-06-11追記)
保存時に自動フォーマットを行うには、下記を.vimrcに追加してください。
これで保存時に有無を言わさず自動フォーマットがかかります。

```vim:.vimrc
auto BufWritePre *.go Fmt
```
Oracle JDK on EC2 Linux

Amazon Linux AMI だとOpenJDKがインストールされている。
Sun/Oracle JDKにに変えたい。

[こちら](http://blog.kdecherf.com/2012/04/12/oracle-i-download-your-jdk-by-eating-magic-cookies/)を参考にJDKを直接ダウンロード

```bash:
wget wget --no-cookies --header "Cookie: gpw_e24=xxx;" http://download.oracle.com/otn-pub/java/jdk/6u45-b06/jdk-6u45-linux-x64-rpm.bin
```

```bash:
$ chmod +x /jdk-6u45-linux-x64-rpm.bin
$ ./jdk-6u34-linux-i586-rpm.bin
$ alternatives --install /usr/bin/java java /usr/java/default/bin/java 20000
$ update-alternatives --config java
$ ln -s /usr/java/default/jre /usr/lib/jvm/jre
$ ln -s /usr/share/java /usr/lib/jvm-exports/jre
```

profileを書き換え

```bash:
$ sed -i 's/\/usr\/lib\/jvm\(\/jre\)*/\/usr\/java\/jdk1.6.0_45/g' /etc/java/java.conf /etc/profile.d/aws-apitools-common.sh
```
Casperjsのインストール(windows編）

ブラウザ開かなくてもスクリーンショットが取れたり、スクレイピングができたりするCasperJS。
PhantomJSの上に乗ってるらしい。
Windows環境にインストールするのも簡単なのでメモ。

http://casperjs.org/
http://casperjs.org/installation.html
CasperJS on Windows

##1)PhantomJSのインストール
###1-1)PhantomJSをダウンロードしてくる。
http://phantomjs.org/download.html
phantomjs-1.9.1-windows.zipをダウンロード→解凍。

###1-2)移動→リネーム→PATHを通す。
・フォルダごとC:\PhantomJSへ移動してリネームする。しなくても多分OK。
・C:\PhantomJSなり、PhantomJSディレクトリへPATHの設定をする。
（コントロールパネル→システム→詳細設定タブ→環境変数→PATH)
・phantomjs -v でバージョンが出てくればOK。

#2)CasperJSのインストール
##2-1)CasperJSのダウンロード
http://casperjs.org/
download as .zip archive
n1k0-casperjs-1.0.2-0-gbc0da16.zip が落ちてきたよ。

###2-2)移動→リネーム→PATHを通す。
・フォルダごとC:\Casperjsへ移動してリネームする。しなくても多分OK。
・C:\Casperjs\batchbinなり、casperjs\batchbinディレクトリへPATHの設定をする。
（コントロールパネル→システム→詳細設定タブ→環境変数→PATH)
・casperjs --version でバージョンが出てくればOK。

##3)動かしてみる
ScreenShotのサンプルを動かしてみる。
samplesディレクトリにいろいろ入っているので、ちょっとやってみる。
screenshot.jsは、ツイッターアカウントと画像ファイル名を指定すれば、スクショを取って保存してくれる。
例題は私のページ。

casperjs C:\casperjs\samples\screenshot.js usakoyama caspertest.jpg
GASでHTMLサービスを使ってサーバとのやり取りをDOMに反映させる

コード.gs

```js:
function doGet(e) {
  var tgt_page = "index";
  Logger.log(e.parameters);
  if (typeof e.parameters.page != 'undefined') {
    tgt_page = e.parameters.page[0];
  }
  var app = HtmlService.createTemplateFromFile(tgt_page).evaluate();
  app.setSandboxMode(HtmlService.SandboxMode.NATIVE);
  return app;
}


function sendSampleText(fromWeb){
  Logger.log( fromWeb );
  return 'hoge from gas : "' + fromWeb + '"' 
}
```

index.html

```html:
<html>
  <title>test page</title>
  <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
  <script>
  $(function() {
  
  $("#tags").on('change', function(val){
  $("#result").val($( "#tags" ).val());
  });
  
  $("#getfromgas").on("click",function(){
  var send_text = $( "#tags" ).val();
  var src_text = google.script.run.withSuccessHandler(writeDiv).sendSampleText(send_text);
  });
  
  function writeDiv(src_text){
  $("#fromGAS").html( src_text );
  }
  
  
  });
  </script>
  <body>
  <div class="ui-widget">
  <label for="tags">Src: </label>
  <input id="tags" />
  <hr>
  <label for="tags">JS: </label>
  <input type="text" id="result" />
  <hr>
  <button id='getfromgas'>get data from gas</button>
  <br/>
  <label for="tags">fromGas: </label>
  <div id="fromGAS">aa</div>
</div>
</body>
</html>
```
Jenkinsスレーブとの接続ポートを固定する方法

## はじめに
* jenkinsのスレーブとしてWindowsマシンをjenkinsのマスターに接続するにはスレーブ側からマスターへ接続する必要がある
* 接続先のポートはデフォルトではマスターの再起動の度にランダムで変わってしまう
* マスターの再起動はマスター側の不調やインストールしたプラグインを適用したり色々な場面で必要になる
* その度にiptablesの設定を書き換えたりするのは面倒くさいので、ポートを固定する方法をご紹介します

### 確認した環境
* jenkinsマスター ： centOS 6.4
* jenkinsスレーブ ： Windows8
* jenkinsのバージョン ： 1.517

## jenkins側の設定
* [jenkins] -> [Jenkinsの管理] -> [グローバルセキュリティの設定]で設定ページを開く
* セキュリティを有効化にチェック -> JNLPスレーブ用TCPポート番号で固定を選択して任意のポート(例：9000)を入れる

## jenkinsマスターのiptablesの設定
* /etc/sysconfig/iptablesに以下を追加

```
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9000 -j ACCEPT
```

* iptablesの再起動

```
sudo /etc/init.d/iptables restart
```

## マスターと接続
* スレーブ側からjenkinsのホームを開く
*  [jenkins] -> [Jenkinsの管理] -> [ノードの管理] -> 対象のスレーブを選択
* あとはコマンドライン実行 or LaunchボタンクリックでConected!と出れば接続完了

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
mongodが起動していなかった時の対処メモ

先日、サーバー障害が発生してから気づかなかったがmongoが動いてない事に気づいた時のメモ

**起動してみる**
`# /etc/init.d/mongod start`
Starting mongod: all output going to: /var/log/mongo/mongod.log
forked process: 52609

`# ps ax | grep mongo`
30314 pts/0    S+     0:00 grep mongo
**動いてないっぽい。**

`# /etc/init.d/mongod status`
mongod は停止していますがサブシテムがロックされています

`# find /var -type f -name mongod`
/var/lib/mongo/mongod.lock
**ロックファイル発見**

`# rm -f /var/lib/mongo/mongod.lock`
**迷わず消す！**

`# /etc/init.d/mongod start`
Starting mongod: forked process: 32313
**動いた**
立体的（立体風）なボタン表現のパターン

![button.png](https://qiita-image-store.s3.amazonaws.com/0/21225/d57eacb4-49e7-e206-94fd-bd4b4160ca2f.png)

こういうやつ。考えられるのは、

- `box-shadow`を使う
- `border`を使う
- 擬似要素を使う
- `border-image`を使う

今回はサンプルの見栄えを揃えるために`width`を適用させたりしているが、実際にはボタンのラベルの長さに左右されないような、という前提でつくる。

## `box-shadow`を使う

```css:
btn {
  box-shadow: 0 6px 0 #369;
}
```

ぼかしが`0`のbox-shadowにすることでそれっぽく見せる。 ただこれだとAndroid2.3（2.2かもしれない）以下では影が見えないので注意。

## `border`を使う

```css:
.btn {
  border-bottom-width: 8px;
}
```

これもそれっぽく対応できるが、`border-radius`を使っている場合にはborderの外側部分にだけborder-radiusが適用されるので注意。

※もしかしたらブラウザによって違うかも。

## 擬似要素を使う

```css:
.btn{
  position: relative; 
}
.btn:after {
  display: block;
  content: "";
  position: absolute;
  left: -2px;
  right: -2px;
  bottom: -8px;
  z-index: -1;
  border-radius: inherit;
  height: 100%;
  background-color: #369;
}
```

擬似要素で影部分のオブジェクトをつくり、`position`で配置を制御する。 もしサンプルのように`border`がある場合には、その分の値を`left`、`right`で調整する。大きさは`bottom`で。

悪くはない感じもするが、少し大げさかもしれない。

## `border-image`を使う

```css:
.btn {
  /* box-sizing: border-box; */
  border-color: transparent;
  background-color: transparent;
  border-style: solid;
  border-width: 8px 8px 16px 8px;
  border-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAsBAMAAAD2lqe8AAAAJ1BMVEUaZJwcZZ0lbaJJga1Lga5Tn7taqMCCp8eDqMiP5N6q/+/i6/L////KlPzsAAAAnUlEQVQoz+2SoRHCUBBE9zq4JYEME0UJlJASaAMXTToAg41H5Lso6CARWxQmZP5RAIrn9s3OmT1Ir4YL5VWCZmbcBDW7Pi0Mp1KYNmtOaTh0GPcp416jPefiUaHpczGUYArwL34hLM7gsDiUw+KUDo9jG2jb7B2coOcPYwQJ+0QHCX6BY8wF2igqjFHUmKLooHCkEBQqnSA9105xkd4swUbH0UjqRQAAAABJRU5ErkJggg==) 8 8 16 8 fill repeat;
}
```

`border-image`も結構あり。ただ`border`なので、デザインによってはその太さ分見栄えが大きくなってしまうので、`box-sizing: border-box` のようなものも使うといいかもしれない。その場合は`padding`のことも考慮しないといけないけど。

## 今回のサンプルはCodePenに。
http://cdpn.io/fugzD
第11回オフラインリアルタイムどう書く Java による実装

オフラインリアルタイムどう書く
http://atnd.org/events/38770
の、問題(ビットあみだくじ)
http://nabetani.sakura.ne.jp/hena/ord11bitamida/
の、Java による実装。

他の言語などの解答例は
http://qiita.com/items/93cde1a6b7561426a3ac
から辿れます。

慣れない Java なので Java らしくない点も多々あるとは思うけど、こんな感じ。

```java:Bitamida.java
import java.util.ArrayList;

class Bitamida
{
  ArrayList<Integer> lines = new ArrayList<>();
  Bitamida( String src )
  {
    for( String s : src.split("-")){
      lines.add( Integer.parseInt(s, 16 ) );
    }
  }
  static void swapArrayElement( byte[] a, int x, int y)
  {
    byte tmp = a[x];
    a[x]=a[y];
    a[y]=tmp;
  }
  byte[] exchange( byte[] users, int line )
  {
    Integer left=null;
    for( int i=0 ; i<9 ; ++i ){
      int bits = (line<<i) & (256+128);
      if ( bits==256 || bits==128 ){
        if ( left != null ){
          swapArrayElement( users, left, i );
          left = null;
        } else {
          left = i;
        }
      }
    }
    return users;
  }
  byte[] solveImpl( int depth, byte[] start )
  {
    if ( depth <0 ){
      return start;
    } else {
      return exchange( solveImpl( depth-1, start), lines.get( depth ) );
    }
  }
  String solve( String start )
  {
    return new String( solveImpl( 3, start.getBytes() ) );
  }
  static void test( String src, String expected )
  {
    String actual = new Bitamida( src ).solve( "012345678" );
    boolean ok = actual.equals( expected );
    System.out.printf( "%s, %s->%s ( %s )\n", 
      (ok ? "ok" : "***NG***"), src, actual, expected );
  }
  public static void main(String[] args)
  {
    /*0*/ test( "d6-7b-e1-9e", "740631825" );
    /*41*/ test( "6f-dd-ff-ff", "230685147" );
  }
}
```

いつもどおり、テストデータの大半を省略。

今回は、下から順に、いっぺんに置換で、xor は使わず、という方針で。

あみだくじが4段と決まっているので遠慮なく再帰を使った。

ややマジカルな 256 と 128 がソース内にあるけど、2の8乗と7乗なのでわかるよね、と思う。

配列の要素を入れ替えるためにメソッドを書かなければならない上に、そのメソッドをなんかクラスに入れなくちゃいけないところが嫌な感じ。

exchange メソッドがちょっと複雑すぎる気もする。

文字列と byte[] の間の変換が、` "string".getBytes() ` と ` new String( byteArray ) ` でできるのを知らなかった。便利。
全角対応sprintf

sprintf()を拡張し、型指定子にwを追加すると全角文字になるようにした。

```sprintfw.php
<?php
function sprintfw($format) {
	$v = func_get_args();
	return preg_replace_callback(
			'/(?<!%)%((?<pos>\d+)\$)?(?
([-+]?(\'.|0)?[-+]?\d+)?(.\d+)?)(?<w>w?)(?<t>[bcdefgosuxEFGX])/u',
			function ($m) use ($v) {
				extract($m);
				static $c = 0;
				$i = empty($pos) ? ++$c : (int)$pos;
				$str = sprintf('%'.$s.$t, $v[$i]);
				return mb_convert_kana($str, empty($w) ? 'a' : 'AK');
			},
			$format
	);
}
```

使い方

* 型指定子の直前に’w’を付加すると全角に変換する。
* 'w' なしだと 全角を半角に変換する。

```php:
<?php

// 型指定子の直前に’w’を付加すると全角に変換
echo sprintfw("%04wd", 12); // => ００１２
echo sprintfw("%ws", "Apple"); // => ’Ａｐｐｌｅ'

// 逆に、wなしだと 全角を半角に変換してしまう。
echo sprintfw("%s", "Ａｐｐｌｅ"); // => ’Apple'
```

使用例

```php:
<?php

$user_profile = array(
    'no' => 32,
    'name' => '谷川 Christel',
    'birth' => '19900701',
    'votes' => 123,
    'lang'  => 'Ｊａｖａ、ＰＨＰ、Ｃ言語'
);
$u = (object)$user_profile;
$total = 1234;
$fmt = '会員番号：（%06wd）　%ws（%wd）　　得意な言語：（%s）　　得票率：%.2wf％　';
echo sprintfw($fmt, $u->no, $u->name, 
	((int)date('Ymd') - (int)$u->birth) / 10000, // age
	$u->lang,
	$u->votes / $total * 100 //share
	);

// => 会員番号：（００００３２）　谷川 Ｃｈｒｉｓｔｅｌ（２２）　　得意な言語：（Java、PHP、C言語）　　得票率：９．９７％
```

sprintf() の書式指定子とその挙動はかなり複雑で、ほぼフォローしているとは思うのだが、互換性は保証はできない。
一見便利そうだが、実際は思ったほど使い道がなかったことも言っておく。
むしろ Junk Code として参考になれば。

それと、クロージャを使えるのは PHP5.3 からだった。
未だ 5.3 に乗り換えられない環境も多いと思うので、クロージャなしで書きなおしたバージョンもつけておく。

```sprintfw_old.php
<?php

function sprintfw_old($format) {
	$code = ''
		.'list(,,$pos,$s,,,,$w,$t) = $m;'     //.'extract($m);'
		.'$v = '.var_export( func_get_args(), true).';'
		.'static $c = 0;' 
		.'$i = empty($pos) ? ++$c : (int)$pos;'
		.'$str = sprintf("%".$s.$t, $v[$i]);'
		.'return mb_convert_kana($str, empty($w) ? "a" : "AK");';
	return preg_replace_callback(
			'/(?<!%)%((?P<pos>\d+)\$)?(?P
([-+]?(\'.|0)?[-+]?\d+)?(.\d+)?)(?P<w>w?)(?P<t>[bcdefgosuxEFGX])/u',
			create_function('$m', $code),
		    $format
	);
}
	
```

create_function はメモリリークすることをコメントで教えて頂きました。
代わりにクラス化したコードをコメント欄に追記しました。
CloudStackオペレーション

##システムVMへのSSH接続
`# ssh -i /root/.ssh/id_rsa.cloud <<リンクローカルアドレス>> -p 3922` 

##独自Webサイト上のISOイメージを取り込む
グローバル設定の「secstorage.allowed.internal.sites」にWebサイトのIPアドレスを設定する
コマンドラインから画面共有する方法

コマンドラインから、OSXの画面共有を、アドレスを指定して開く方法。
参考URL：
http://blog.youria.jp/kyo/mac/open_screen_sharing_fron_terminal_on_macosx/

open vnc://URL:ポート番号

と簡単にできるらしい。
まさかと思って、IPアドレスを入れてみると、いけた。

open vnc://IPadd

で画面共有完了。便利だ。知らなかった・・・
pythonをはじめるためのリンク


pythonをはじめるためのリンク
========================================

1. 本家
http://www.python.org/

2. 日本ユーザー会
http://python.jp/Zope.1

3. python tutrial 日本語 2.7.1
http://www.python.jp/doc/release/tutorial/index.html

4. tutrial 動画　英語
http://www.lastday.jp/2011/05/30/python-tutorial

5. Learn Python The Hard Way
http://learnpythonthehardway.org/book/

6. document　説明書 日本語　2.7.1
http://www.python.jp/doc/release/

おすすめの活用順序
========================================

基本は、３をやりながら、４をチラ見、６は辞書代わり。
それが終わったら、５をよんでみる。
１，２は情報集めのため。

Markdown
==========

おいおいmarkdownだと、順序付きリストは、アイテムの次の行は改行しちゃいけないのか・・・
RubyでCLIから入力を求めるとき

`Kernel#gets` を使うと、バックスペースなどの制御コードが文字として入力されてしまい残念な事になる。

```
irb(main):001:0> s = gets
abce^?d^[[D^[[D
=> "abce\u007Fd\e[D\e[D\n"
```

`Readline.readline` を使うと、行の編集が出来るため便利。

```
irb(main):002:0> s = Readline.readline('> ', false)
> abcdef
=> "abcdef"
```

という事で良いのだろうか？`readline` ではない、他の組み込みライブラリや標準添付ライブラリで上手くやれたりするだろうか。
Chefのknifeコマンドで何かを編集する時にJSONのヴァリデーションを行う

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。


knifeでChefServer上の情報を編集したら、しょっちゅうJSONのパースエラーで全部パアになる。
`from_file`でローカル編集してからというのも手だが、アップロード前に手軽に確認する方法がある。

この方法は`EDITOR`がvimのとき限定ですが、他のエディタでも似たようなことはできるでしょう。

## コケるとき

エディタの終了=ChefServerへのアップロードなので、編集したJsonがおかしいとコケる上に編集していた内容がなくなる。

```bash:Shell-Out
$ knife role edit monit_smartos

-- 編集後 --

ERROR: Yajl::ParseError: parse error: unallowed token at this point in JSON text
                                 "name": "monit_smartos",   "descripti
                     (right here) ------^
```

これが意外と面倒くさい。

## Vimからjson_verifyをコール

`!` でシステムコマンド実行、と`%`がカレントのファイルパスに置き換えられるので、`json_verify`コマンドに渡してみよう。

```vim:Vimのコマンドモードで
:!cat % | json_verify

-- コンソール側にvarifyの結果 --

JSON is valid

Press ENTER or type command to continue
```

またVimに帰ってくるので、続けて編集するか終了してChefServerにアップロードするか選ぼう。

json_verifyはMacOSXならbrewで手に入る、linux系でも`yajl`等のパッケージに付いてくるはずなのでそちらを使うとよい。
PHPでカリー化？なにそれ美味しいの？

食べてみたい？

とりあえず既存の関数をカリー化した関数を返す関数というのを作ってみたわけだが。

```curry.php
<?php

function curry($fn) {
	$args = func_get_args();
	$fn = array_shift($args);
	if (!is_a($fn, 'ReflectionFunction'))
		$fn = new ReflectionFunction($fn);
	return function() use ($fn, $args) {
		$args = array_merge($args, func_get_args());
		if (count($args) >= $fn->getNumberOfRequiredParameters())
			return $fn->invokeArgs($args);
		else 
			return call_user_func_array(
				'curry', array_merge(array($fn), $args));
	};
}
```

使い方

```php
<?php

function hoge($a1, $a2, $a3) {
    return $a1 + $a2 + $a3;
}

// 引数を個別渡し
$c0 = curry('hoge');
$c1 = $c0(1);
$c2 = $c1(2);
$ret = $c2(3);

// 複数まとめて
$c0 = curry('hoge');
$c2 = $c0(1, 2);
$ret  = $c2(3);

// 最初の引数を決めうち
$c1 = curry('hoge', 1);
$ret = $c1(2, 3);

// 複数引数決めうち 
$c2 = curry('hoge', 1, 2);
$ret  = $c2(3);
```

現状、引数の参照渡しには対応していない。（エラーになる）

使用例

```php:
<?php

$c = curry('implode');
$csv = $c(',');
$tsv = $c("\t");

$arr = array(1,2,3);
var_dump( $csv($arr));       // string(5) "1,2,3"
var_dump( $tsv($arr));        // string(5) "1	2	3"

```

```php:
<?php

$arr = array(1,2,3);
var_dump( array_map( curry('sprintf', '%04d'), $arr));
/*
array(3) {
  [0]=>
  string(4) "0001"
  [1]=>
  string(4) "0002"
  [2]=>
  string(4) "0003"
}
*/
```

```php:
<?php

$even = curry(function ($m, $v) { return ($v % $m) == 0 ; }, 2);
print_r( array_filter(range(1, 10), $even));
/*
Array
(
    [1] => 2
    [3] => 4
    [5] => 6
    [7] => 8
    [9] => 10
)*/
```

```php:
<?php

$replace_md_link = curry(
    'preg_replace_callback', '/\[(.+?)?\]\((\S+?)(\s+"(.+)")?(\s*?\))/');
$format_link_callback = curry(
    'vsprintf', '<a href="%3$s" title="%5$s">%2$s</a>');
$convert_link = curry($replace_md_link, $format_link_callback);

$markdown = '[ほげぶろぐ](http://example.jp "Hoge Blog!")';
var_dump( $convert_link($markdown));
// => string(66) "<a href="http://example.jp" title="Hoge Blog!">ほげぶろぐ</a>"

```

```php:
<?php

$csv = fopen("sample.csv", 'r');
$read_csv = curry('fgetcsv', $csv);
$fields = $read_csv();  // 1行目がフィールド名
$assoc = curry('array_combine', $fields);

$rset = array();
while($values = $read_csv()) {
	$rset[] = $assoc($values);
}

fclose($csv);
var_dump($rset);

```

いろいろ頑張ってみたが、あまりうれしい感がない、というかコレジャナイ感がただようのはなぜなのか。

計算機科学的にこれがカリー化と呼べるシロモノなのかは正直自信がない。
本場の味を知る人に聞いてみないとわからないところだ。
Rails の link_to で `controller` にパラメータの渡し方


## バージョン
* Rails 4.0.0 rc1

## 内容

```event.html.slim
= link_to "参加", join_group_event_path(@group, @event, join_type: Event::JOIN)
```

```event_controller.rb
def join
  @event.event_users.create user: current_user, join_type: params[:join_type]

  redirect_to group_event_path(@group, @event)
end
```
* `controller`で`params[:join_type]`で取得できる

## ポイント
* `link_to`のパラメータではなく、命名ルートのパラメータにしないと行けない

## 懸念点
* `join_type` は生のままクライアントまで分かられていることは、大丈夫かな？
* そもそも `join` は `GET` ではなく `POST` では？
Rubyを用いたログインのセキュリティについて


ログイン分野において最も重要なのは、
`全てのパスワードに常にソルトとハッシュをかける`
ことである。

ソルトとは、ユーザごとに設定したパスワードが同じものであっても、ハッシュによって得られる値がユーザによって違うものになるようにするプロセスである。

ソルト化しなかったパスワードはレインボー攻撃に弱くなる。
（ここではレインボー攻撃については割愛する）

次は、ソルトを適用したログイン名とパスワードの例である。


```ruby:salt.rb

# -*- coding: utf-8 -*-
require 'digest/sha1'

$hashes = { }
$salts = { }

def hash(password, salt)
  # hash化の際にsaltを含む
  Digest::SHA1.hexdigest("#{salt}#{password}")
end

def generate_salt(login)
  Digest::SHA1.hexdigest("#{Time.now.to_s}#{login}")
end

def store_password(login, password)
  # hashを作成する前に、ユーザごとのsaltを作成する
  salt = $salts[login] = generate_salt(login)
  # 作成したsaltを含ませて、パスワードにhashをかける
  $hashes[login] = hash(password, salt)
end

def verify_password(login, password)
  $hashes[login] == hash(password, $salts[login])
end

store_password('tak158', 'password')
store_password('snthd', 'password')

puts $hashes
puts $salts

puts verify_password('tak158', 'password') # => true
puts verify_password('tak158', 'pass') # => false
puts verify_password('snthd', 'password') # => true

```

この方法では、同じパスワードからhashしても異なる値が得られるのでレインボー攻撃に強くなる。
Appiumを使ってスマートフォンアプリのテストを自動化する - 概要編


##1. はじめに
「AndroidやiOSのアプリのテストを自動化したい。何かいいものないかな・・・。」とWeb上でいろいろと探しまわっていたら"Appium"というものを発見。
今回はAppiumがどんなものか、また、どういった環境でどのようにインストールしたらよいかを記述します。

詳細な利用方法は、後日、記述する予定です。

##2. Appiumとは

Appiumとは、ネイティブ型およびハイブリット型モバイルアプリ向けに開発されたテスト自動化を実現するためのフレームワークです。
[Sauce Labs](https://saucelabs.com/appium)がAppiumの開発に参加しています。

以下のプログラム言語を使って、テストコードを書くことができます。

* Python
* JavaScript (Node.js)
* Java
* Ruby
* Objective-C
* PHP
* C#

##3. Appiumでどんなことができるのか

YoutubeにAppiumのデモがあるので、そちらを見ながらAppiumでどんなことができるのかを確認してみてください。

* [Android版 デモ](http://www.youtube.com/watch?feature=player_embedded&v=ILKi6B54_sw, "Appium android demo")
* [iPhone版 デモ](http://www.youtube.com/watch?feature=player_embedded&v=eKhuF_4KzYo, "Appium iPhone demo")

##4. 動作環境

Appiumを動かすためには、以下の環境が必要になります。

### (1) iOS

|ソフトウェア|バージョン|
|:----:|:----:|
|OS|OSX 10.7以上|
|XCode|4.5以上 (Command Line Toolがインストールされていること)|

### (2) Android

|ソフトウェア|バージョン|
|:----:|:----:|
|OS|OSX 10.7以上、Windows 7以上、Linux|
|Android SDK| 16以上|

##5. Appiumをインストールする

今回は、Mac上でのインストール手順を記述します。(Windows上でのインストール手順も後日記載できたらいいなと思います・・・。)

インストール対象となるMac環境は以下のとおりです。

|ソフトウェア|バージョン|
|:----:|:----:|
|OS|Mountain Lion (OSX 10.8.4)|
|XCode|4.6.3|
|Homebrew|0.9.4|
|Node.js|0.10.5|

### (1) Homebrewを使って、node.jsをインストールします。
ターミナルで以下のコマンドを実行します。

```
brew install node
```

### (2) Node.js向けパッケージ管理システム「npm」(以下、npm)を使って、「appium」をインストールします。
ターミナルで以下のコマンドを実行します。

```
npm install -g appium
```

### (3) AppiumからiOS Simulatorを使用できるようにするために、以下のコマンドを実行します。

```
sudo authorize_ios
```

##6. サンプルプログラムを使ってAppiumの動作を確認する

Github上にあるサンプルコードを使って、Appiumの動作を確認します。
ターミナルで以下のコマンドを実行します。

```
# サンプルプログラムを保存するフォルダを作成し、そのフォルダに移動します
mkdir appium-test & cd appium-test
# npmを使って「wd」をインストールします
npm install wd
# Githubからサンプルプログラムを取得します
curl -O https://raw.github.com/appium/appium/master/sample-code/examples/node/simplest.js
# Appiumを起動します
appium &
# node.jsを使ってサンプルプログラムを実行します
node simplest.js
```

(補足)「wd」とは、Node.jsからSelenium2のWeb Driverを実行するためのライブラリになります。詳細は[こちら](https://npmjs.org/package/wd)。

##7. 参考

* [公式サイト](http://appium.io/)
Anything だけでなく Helm でも情報源を C-M-x でテストしたい

Anything では， `(defvar anything-c-source-***` の中で C-M-x を入力することで，その情報源のテストを起動することができます．これはアドバイスで実現されており，該当部分を取ってきて関数名などをちょっと書き換えるだけで Helm でも同じことができました．

以下を .emacs に書けば `(defvar helm-source-***` に対して C-M-x でテストが行えるようになります．

```common-lisp
(defvar helm-enable-eval-defun-hack t)

(defadvice eval-defun (after helm-source-hack activate)
  (when helm-enable-eval-defun-hack
    (let ((varsym (save-excursion
                    (beginning-of-defun)
                    (forward-char 1)
                    (when (memq (read (current-buffer)) '(defvar setq))
                      (read (current-buffer))))))
      (when (string-match "^helm-source-" (symbol-name varsym))
        (helm varsym)))))
```
KIFメモ

このサンプルの一部のコメントアウトを外すとわかりやすい

https://github.com/square/KIF

```objc:
#import "EXTestController.h"
#import "KIFTestScenario+EXAdditions.h"

@implementation EXTestController

- (void)initializeScenarios;
{
    // If your app is doing anything interesting with parameterized scenarios,
    // you'll want to override this method and add them manually.
//    [self addScenario:[KIFTestScenario scenarioToLogin]];
//下のコメントアウト外した
    [self addScenario:[KIFTestScenario scenarioToSelectDifferentColors]];
    
    // If you're not, 
    [super initializeScenarios];
}

@end

```
リバースプロキシを利用して外部サイトのhttp画像をhttpsで表示してみた

AmazonのMWSを利用したサイトを構築していて、下記の問題に遭遇した。
sslを利用したページで商品の画像を表示したいが、amazonの画像はhttpsではアクセスできない。下記のメッセージが出る。

```
Service Unavailable

The server is temporarily unable to service your request. Please try again later.
Reference #6.f5bcf648.1370745556.563d5fc
```

httpの画像URLのままだと、SSLのセキュリティ警告がでてしまうので、、かっこわるい。。

##そこでNginxのリバースプロキシを利用する。

```nginx:/etc/nginx/nginx.conf
location /images {
                        proxy_pass http://ec2.images-amazon.com:80;
                }

```
画像パスを

```ruby:
url =  url.gsub(/http\:\/\/ec2\.images\-amazon\.com/,'https://hogehoge.com')
```

##これで、下記のように自分のドメインからでも、amazonの画像がsslで表示された！
https://hogehoge.com/images/I/31aTAm5bBGL._SL75_.jpg

![スクリーンショット 2013-06-09 11.18.56 AMのコピー.png](https://qiita-image-store.s3.amazonaws.com/0/8118/09e4749d-507a-bbd0-961e-4118094719c9.png)

ネットで、それらしい情報が無かったので、書いてみました。
Amazonのアフィリエイトの方のAPIを使ってこれをやるのは規約違反かもしれないので、注意してください。	問題があるやり方かもしれないので、自己責任で
Play! Framework2.0(scala)でherokuのpostgresqlに接続する

Play Framework(Scala)でherokuのPostgreSQLに接続する方法をせっかく調べたので記載しておく。
ドキュメント見ながら試行錯誤したので、正しい方法かどうか不明。

誤ってる点があればご指摘頂きたく。。


#### インストールされているアドオンの確認
```
heroku addons --app アプリケーションＩＤ

=== アプリケーションID Configured Add-ons
heroku-postgresql:dev  HEROKU_POSTGRESQL_BRONZE
heroku-postgresql:dev  HEROKU_POSTGRESQL_CHARCOAL
```
heroku に postgresqlアドオンがインストールされていることを確認。
インストールされていない場合、以下のコマンドで追加

```
heroku addons:add heroku-postgresql --app アプリケーションＩＤ
```

#### データベースのURLの確認
```
heroku config
DATABASE_URL:                   postgres://XXXXXXXXXXXXX
・・・
```
DATABASE_URLが表示されることを確認


#### Procfileの設定
Procfileに以下の内容を記述

```
web: target/start -Dhttp.port=${PORT} -DapplyEvolutions.default=true -Ddb.default.url=${DATABASE_URL} -Ddb.default.driver=org.postgresql.Driver
```


#### application.confにDBのURLを指定
```
db.default.url="jdbc:postgresql://localhost/XXXXX"
db.default.url=${?DATABASE_URL}
```
上記のように書くと、環境変数DATABASE_URLがセットされているときdb.default.urlの値が更新される。
ローカルでテストするときdb.default.urlはローカルのURLになり、herokuで動かす時は${DATABASE_URL}
となる。

#### herokuにpushしてテスト
herokuにgit pushすればよしなにdeployされる


#### うまくいかないとき
ログを見て何とかする

```
heroku logs
```


#### [その他]サーバ上のpostgre SQLにpsqlコンソールで接続する
```
heroku pg:psql
```
但しローカルにpsqlがインストールされていないと実行できない。


参考： https://devcenter.heroku.com/articles/heroku-postgresql
FactoryGirl使い方メモ

## model定義
```group.rb
class Group < ActiveRecord::Base
  has_many :events
  has_many :members
end
```
```event.rb
class Event < ActiveRecord::Base
  has_many :groups
end
```

## has_manyの定義方法
```group_event.rb
FactoryGirl.define do
  factory :seq_group, class: Group do
    sequence(:name) { |n| "group #{n}"}
    sequence(:description) {|n| "description #{n}"}
    sequence(:img_url) {|n| "http://test.com/#{n}.jpg"}
  end

  factory :group_event, class: Group do
    sequence(:name) { |n| "group #{n}"}
    sequence(:description) {|n| "description #{n}"}
    sequence(:img_url) {|n| "http://test.com/#{n}.jpg"}

    events {
      [FactoryGirl.create(:seq_event)]
    }
  end
end
```

## 重複を除く為のparent
* 「`parent: :seq_group`」を使ったのですが、もっと便利な書き方があります。
* ネストして定義しちゃえば、継承出来ます

```group_event.rb
FactoryGirl.define do
  factory :seq_group, class: Group do
    sequence(:name) { |n| "group #{n}"}
    sequence(:description) {|n| "description #{n}"}
    sequence(:img_url) {|n| "http://test.com/#{n}.jpg"}

    factory :group_event do
      events {
        [FactoryGirl.create(:seq_event)]
      }
    end
  end
end
```

## 配列・リストの作り方
```group_event.rb
FactoryGirl.define do
  factory :group_event, class: Group do
    members {
      FactoryGirl.create_list(:seq_user, 10)
    }
  end
end
```
ハッシュから配列で指定したキーの要素だけを取り出す

例えば

```
@post = Post.new
temp = JSON.parse(@post.to_json)
#=> {id:nil, title:nil, body:nil, created_at:nil, updated_at:nil}

Post.new(tmp)
```
ってやると`id`や`created_at`, `updated_at`などがMass assignment securityに引っかかる
必要なものだけのHash(`title`と`body`だけ）にしてやりたいなら、ActiveSupportの`Hash#slice`をつかう

```
Post.new(tmp.slice(*Post::accessible_attributes) #=> true
```
スマホのパターンロックの場合の数をHaskellで計算した

import Data.List as L
import Data.Map as M

type Vertex = Int
type Route = [Vertex]
type ReverseRoute = Route
type Candidate = Map Vertex [Vertex]

cand :: Candidate
cand = M.fromList
       [(0, [1, 3, 4, 5, 7]),
        (1, [0, 2, 3, 4, 5, 6, 8]),
        (2, [1, 3, 4, 5, 7]),
        (3, [0, 1, 2, 4, 6, 7, 8]),
        (4, [0, 1, 2, 3, 5, 6, 7, 8]),
        (5, [0, 1, 2, 4, 6, 7, 8]),
        (6, [1, 3, 4, 5, 7]),
        (7, [0, 2, 3, 4, 5, 6, 8]),
        (8, [1, 3, 4, 5, 7])]

makeNextVertexs :: Vertex -> Route -> [Vertex]
makeNextVertexs vertex route = cand M.! vertex L.\\ route

stepRoute :: ReverseRoute -> Maybe [ReverseRoute]
stepRoute route =
  let
    nowVertex = head route
    nextVertexs = makeNextVertexs nowVertex route
  in
   if L.null nextVertexs
   then Nothing
   else Just $ L.map (\p -> p:route) nextVertexs

startToEnd :: Vertex -> [Route]
startToEnd vertex =
  let
    loop :: ReverseRoute -> [ReverseRoute]
    loop route = case stepRoute route of
      Just routes -> concatMap loop routes
      Nothing -> [route]
  in
   L.map reverse $ loop [vertex]

subRoutes :: Route -> [Route]
subRoutes = drop 4 . inits

startWith :: Vertex -> [Route]
startWith = concatMap subRoutes . startToEnd

main :: IO ()
main =
  print $
  4 * length (startWith 0) + 4 * length (startWith 1) + length (startWith 4)