OmniAICreator/Qiita-1.07M huggingface dataset:
Capistranoでソースリポジトリを変更した時

BitbucketからGitHubにリポジトリを移動してからdeployに失敗してアレー？となっていたのでメモ。

```
  * 2013-06-26 00:48:42 executing `deploy:update_code'
    updating the cached checkout on all servers
    executing locally: "git ls-remote XXXXXXXXX master"
    command finished in 3193ms

...

 ** [SERVERNAME :: out] fatal: The remote end hung up unexpectedly
    command finished in 2495ms
*** [deploy:update_code] rolling back
```

みたいな感じで失敗しちゃうのですね。もちろん、変更後のリポジトリにもSSH鍵などの設定が適切にされているものとしますが、この場合は、

```
shared/cached_copy
```

こいつを.gitごと削除すればOK。 `cap deploy:update_code` を行った際、前の設定を引きずっちゃうのが問題っぽい。
ぷよぷよする玉をCSSで作ってみた

「攻城戦記バハムートグリード」のマイページで、ぷよぷよはねる玉のボタンがあったので、それを参考にしてぷよぷよする玉をCSSで作ってみた。

今回作ったサンプル
http://jk0602.sakura.ne.jp/sample/jelly_ball/

ソースコード
http://jk0602.sakura.ne.jp/sample/jelly_ball/jelly_ball.zip

「攻城戦記バハムートグリード」のソースを見てみると、scaleの変化だけであのぷよぷよした感じを作っていた。。。使い方次第でこんな風にも表現できるんだなぁ～と感心しました。

```html:index.html
<body>
	<div class="content">
		<div class="ball jelly"></div>
	</div>
</body>
```

```css:index.css
.ball{
    position:absolute;
    top:100px;
    left: 110px;
    width: 100px;
    height: 100px;
    border-radius:50px;
    background: #FFF;
}

.jelly {
  -webkit-animation-duration: 4s;
  -webkit-animation-timing-function: ease-in;
  -webkit-animation-iteration-count: infinite;
  -webkit-transform-origin: bottom center;
  -webkit-animation-name: jelly;
}

@-webkit-keyframes jelly {
    0%    {-webkit-transform: scale(1, 1);}
    8%    {-webkit-transform: scale(1, 1);}
    10%   {-webkit-transform: scale(1.1, 0.9);}
    13%   {-webkit-transform: scale(0.9, 1.1);}
    17.5% {-webkit-transform: scale(1, 1);}
    19%   {-webkit-transform: scale(1, 1);}
    58%   {-webkit-transform: scale(1, 1);}
    60%   {-webkit-transform: scale(1.1, 0.9);}
    63%   {-webkit-transform: scale(0.9, 1.1);}
    67.5% {-webkit-transform: scale(1, 1);}
    69%   {-webkit-transform: scale(1, 1);}
    100%  {-webkit-transform: scale(1, 1);}
}
```
カーソル上の単語でvim-refを検索する

```vim:.vim/after/ftplugin/php.vim
nmap <F4> :execute 'Ref phpmanual ' . expand('<cword>') <CR>
```

```vim:.vim/ftplugin/ruby.vim
nnoremap <F4> :execute 'Ref refe ' . expand('<cword>') <CR>
```

`expand('<cword>')`でカーソル上の単語が取れる。この関数をマッピングで使ううまいやり方わからなかったけど、これでとりあえずいけた。
Laravel3認証のカスタムドライバーを作ってみた


認証ドライバーの拡張方法はドキュメントにタイトルだけ有って、本文がないので焦ったんですが
[ここ](http://firmanw.com/writing-a-custom-authentication-driver-for-laravel/)を参考にしたらサクッと出来たのでメモ的に残しときます。

##Eloquentドライバーを元に拡張

`laravel/auth/drivers/eloquent.php`をコピーして、
`application/libraries/sha1.php`を作ります。


``` application/libraries/sha1.php
-<?php namespace Laravel\Auth\Drivers; use Laravel\Hash, Laravel\Config;
+<?php
-class Eloquent extends Driver {
+class Sha1 extends \Laravel\Auth\Drivers\Eloquent {

	/**
	 * Get the current user of the application.
	 *
	 * If the user is a guest, null should be returned.
	 *
	 * @param  int|object  $token
	 * @return mixed|null
	 */
	public function retrieve($token)
	{
		// We return an object here either if the passed token is an integer (ID)
		// or if we are passed a model object of the correct type
		if (filter_var($token, FILTER_VALIDATE_INT) !== false)
		{
			return $this->model()->find($token);
		}
		else if (is_object($token) and get_class($token) == Config::get('auth.model'))
		{
			return $token;
		}
	}

	/**
	 * Attempt to log a user into the application.
	 *
	 * @param  array $arguments
	 * @return void
	 */
	public function attempt($arguments = array())
	{
		$user = $this->model()->where(function($query) use($arguments)
		{
			$username = Config::get('auth.username');
			
			$query->where($username, '=', $arguments['username']);

			foreach(array_except($arguments, array('username', 'password', 'remember')) as $column => $val)
			{
			    $query->where($column, '=', $val);
			}
		})->first();

		// If the credentials match what is in the database we will just
		// log the user into the application and remember them if asked.
		$password = $arguments['password'];

		$password_field = Config::get('auth.password', 'password');

-		if ( ! is_null($user) and Hash::check($password, $user->{$password_field}))
+		if ( ! is_null($user) and self::checkPassword($password, $user->{$password_field}))
		{
			return $this->login($user->get_key(), array_get($arguments, 'remember'));
		}

		return false;
	}

	/**
	 * Get a fresh model instance.
	 *
	 * @return Eloquent
	 */
	protected function model()
	{
		$model = Config::get('auth.model');

		return new $model;
	}

+    protected static function checkPassword($password, $hash){
+        return sha1($password) === $hash;
+    }
}
```

`eloquent.php`ではハッシュ化周りをもともと`Hash::check()`メソッドでチェックしていたのを`sha1()`のみでチェックするようにします。
実際には`sha1()`だけってのはNGで、ソルト値も使ったり、なんやかんやすると思うんですが、わかりやすさを優先しています。めんどくさい訳ではないです。


##Userモデルのハッシュ化方法の変更
ここも上記と同様に`sha1()`を使います。

```application/models/user.php
class User extends Eloquent {

    public static $timestamps = true;

    public function set_password($password)
    {
-        $this->set_attribute('password', Hash::make($password));
+        $this->set_attribute('password', sha1($password));
    }
}
```

##Laravelにドライバーを教える

```application/config/auth.php
return array(

-	'driver' => 'eloquent',
+	'driver' => 'sha1',

	'username' => 'username',
```


```application/start.php
+Auth::extend('sha1', function()
+{
+    return new Sha1;
+});
```

これでOK！

おわり
第12回オフラインリアルタイムどう書くの参考問題。python による実装



オフラインリアルタイムどう書く
http://atnd.org/events/40389
の、参考問題(道なりの亀)
http://nabetani.sakura.ne.jp/hena/ord12aloroturtle/
の実装例。ruby。

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

で。
慣れない python で書いてみた。
python 3.3 と python 2.7 の両方で動く。

こんな感じ。

```python
#coding:utf-8
import re

MAP =  [
    range(i*11, i*11+11) for i in range(0,3)
  ] + [
    range(33+i*3, 33+i*3+3) for i in range(0,9)
  ]

def chars( start, len ) : 
  return [ chr(c) for c in range(ord(start),ord(start)+len) ]

NAMES=chars( "A", 26 ) + chars( "a", 26 ) + chars( "0", 10  )

def turn( d, r ):
  return [r*d[1],-r*d[0]]

def name( t ):
  return NAMES[ MAP[ t[0][1] & 0xff][ t[0][0]  & 0xff] & 0xff]

def move(t):
  n=name(t)
  for warp in [[2,11,"efg"], [10,2,"567"]]:
    if n in warp[2] and t[1][1]==1 :
      t[0]=[warp[0]-warp[2].index(n),warp[1]]
      t[1]=[0,-1]
      break
  else:
    t[0][0]+=t[1][0]
    t[0][1]+=t[1][1]

def solve( src ):
  t=[[0,0],[1,0]]
  r="A"
  try:
    for c in src :
      if c=="L" or c=="R":
        t[1]=turn(t[1], 1 if c=="L" else -1)
      else:
        for i in range(int(c,16)):
          move(t)
          r+=name(t)
  except IndexError:
    r+="?"
  return r

def test( samples ) :
  for line in samples.splitlines():
    a=re.split( "\s+", line ) # num, input, expected
    if 2<len(a):
      actual = solve( a[1] )
      ok=actual==a[2]
      print( [ "ok" if ok else "***NG***", a[1:3], actual ] )

test( """
0   2RcL3LL22   ABCNYjmpsvy147edcbcdef
1   L3R4L5RR5R3L5   A?
40  6LR2R1LR5LRLRL484L63    ABCDEFGHITe741yxw?""" )
```

いつも通り、テストデータの大半は省略。

実装方針としては、直交座標系になるように地図を読み替え、必要な場所でワープするというもの。

テストを除いて 45行。長いようなそうでもないような。

name メソッドの `& 0xff` は、負の index を不正な index に変換するためのもの。邪悪な感じ。

今回は初めて for 文の else と 例外を使ってみた。
特に例外はよろしくない使い方だと思う。

しかし何度書いても if 式は気持ち悪い。
FileVaultで暗号化された外部ディスクにホームディレクトリを置く方法

# どういう状況か？

MacBook Pro（without Retina）は、標準で装備されている光学ドライブを摘出して、[MacBay](http://www.akibakan.com/BCAK0062822/)などのサードパーティ製のハードウェアの力を借りてHDDやSSDを装填することが出来る。

私はOSなどを容量の少ないSSDに入れ、音楽などで容量が大きくなりがちなホームディレクトリをHDDのどこかに置くという戦略を取っていた。

しかし最近[FireVault](http://support.apple.com/kb/HT4790?viewlocale=ja_JP)によってこの2枚のディスクを共に暗号化したが、
そうするとログインした際に暗号化したHDD（ホームディレクトリが設置されている）が複合化出来ず、結果としてホームディレクトリがないものとして、ログインに失敗するという現象が発生した。

# 解決策

[Unlock](https://github.com/jridgewell/Unlock)を入れれば、ものの見事に解決した。
少なくとも私の環境（OS X 10.8.4）では正しく動いたが、ログイン直後にCPU使用率がすごく高まる。
Visual C++ で作る printf 風デバッグのためのマクロ


「引数で与えられた書式＋引数を、ソースファイル名と行番号付きで表示するマクロ」の作り方４種。

printf といっても出力先はデバッガの出力ウィンドウです
（`_CrtDbgReport` 使ってるので `_CrtSetReportMode/_CrtSetReportFile` で出力先を標準出力とかに変えられます）。

## その１. `__noop` を使う

関数オブジェクトのコンストラクタで `__FILE__` と  `__LINE__` を受け取り、括弧演算子で `printf` な書式と引数を受け付けます。

リリースビルドでは `__noop` で `TRACE_F` マクロの中身が実行されないようにします。

```cpp
#ifdef _DEBUG

#include <crtdbg.h>
#define TRACE_F debug_trace_format(__FILE__, __LINE__)

    class debug_trace_format
    {
    private:
        const char* _file;
        long _line;

    public:
        debug_trace_format(const char* file, long line) : _file(file), _line(line) {}
        
        void operator ()(const char *fmt, ...)
        {
            va_list arg;
            va_start(arg, fmt);
            int size = vsnprintf(NULL, 0, fmt, arg);
            std::unique_ptr<char[]> buf(new char[size + 1]);
            vsnprintf(buf.get(), size + 1, fmt, arg);
            _CrtDbgReport(_CRT_WARN, _file, _line, NULL, "%s", buf.get());
            va_end(arg);
        }
    };

#else
#define TRACE_F __noop
#endif

int main()
{
    //_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
    //_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
    TRACE_F("%s: %d\n", "errcode", 1234);
    return 0;
}
```

## その２. `__VA_ARGS__` を使う

いつからか Visual C++ で `__VA_ARGS__` が使えるようになっていました。

```cpp
#ifdef _DEBUG
#include <crtdbg.h>
#define TRACE_F(fmt, ...) _CrtDbgReport(_CRT_WARN, __FILE__, __LINE__, NULL, fmt, __VA_ARGS__);
#else
#define TRACE_F(fmt, ...)
#endif

int main()
{
    //_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
    //_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
    TRACE_F("%s: %d\n", "errcode", 1234);
    return 0;
}
```

楽ちんです。


## その３. `stringstream` を使う

可変個引数が気持ち悪い人のために `stringstream` を使う版。

```cpp
#include <sstream>

#ifdef _DEBUG

#include <crtdbg.h>
#define TRACE_F(expr) _CrtDbgReport(_CRT_WARN, __FILE__, __LINE__, NULL, "%s", \
    static_cast<::std::ostringstream&>(::std::ostringstream() << expr).str().c_str() )

#else
#define TRACE_F(expr)
#endif

int main()
{
    //_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
    //_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
    TRACE_F("errcode: " <<  1234 << std::endl);
    return 0;
}
```
        
## その４. `boost/format` を使う

boost が使えるなら boost/format で。

```cpp
#include <boost/format.hpp>

#ifdef _DEBUG

#include <crtdbg.h>
#define TRACE_F(fmt, expr) _CrtDbgReport(_CRT_WARN, __FILE__, __LINE__, NULL, "%s", \
    (::boost::format(fmt) % expr).str().c_str() )

#else
#define TRACE_F(fmt, expr)
#endif

int main()
{
    //_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
    //_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
    TRACE_F("%s: %d\n", "errcode" % 1234);
    return 0;
}
```

## その？. `ATLTRACE` を使う

ファイル名と行番号を表示させる方法がわからなかったので使っていない。
MacでDW5.5のコードカラーリングのファイルのある場所

ぐぐってみたけど、Mac+DW5.5だとファイルの置き場所が詳しく書かれているサイトがなかったのでメモ。

# ファイルの場所
/Users/ユーザ名/Library/Application Support/Adobe/Dreamweaver CS5.5/ja_JP/Configuration/CodeColoring/Colors.xml
※元のファイルはバックアップしたほうがいいです

# どんなカラーリングがあるの？
[このサイト](http://blog.1dz.jp/?aaa=793)にいろいろあるので、好きなものをどうぞ。
自分で作るときは
DreamWeaver＞環境設定＞コードカラーリング
からできます。
「第12回オフラインリアルタイムどう書くの参考問題」をPHPで解いてみた

http://qiita.com/Nabetani/items/1de39df381dfeee305ab
ぺちぱーはどこだ！ぺちぱーが居ないぞ！

```php:
<?php
	class KAME{
		// マップ ※文字化けではありません
		private $mapArray = [
		 'ABCDEFGHIJK', 'LMNOPQRSTUV', 'WXYZabcdefg'
		,'hij?????765', 'klm?????432', 'nop?????10z'
		,'qrs?????yxw', 'tuv?????vut'];
		// 一歩進む先
		private $directionTo = [[1, 0], [0, 1], [-1, 0], [0, -1]];
		
		// 現在地
		private $nowX = 0;
		private $nowY = 0;
		// 向いてる方向
		private $direction = 0; // →0↓1←2↑3
		
		/**
		* 辿ったルートを取得
		* @param String 辿る道順
		* @return String 辿ったルート
		*/
		public function get($route){
			$this->reset();
			
			$ret = 'A';
			foreach(str_split($route) as $now){
				if($now === 'R'){
					$this->turnRight();
					continue;
				}elseif($now === 'L'){
					$this->turnLeft();
					continue;
				}else{
					$ret .= $this->getRoute(hexdec($now));
					if(substr($ret, -1) === '?'){return $ret;}
					continue;
				}
			}
			return $ret;
		}
		
		/**
		* 辿ったルートを取得
		* @param int 何歩進むか
		* @return String 辿ったルートを表す文字列
		*/
		private function getRoute($steps){
			$ret = '';
			
			// 歩数分繰り返し
			for($i=0; $i<$steps; $i++){
				// 一歩進む
				$this->nowX += $this->directionTo[$this->direction][0];
				$this->nowY += $this->directionTo[$this->direction][1];
				
				// 進んだ先の値を取得
				if(!isset($this->mapArray[$this->nowY][$this->nowX])){
					return $ret . '?';
				}
				$kame = $this->mapArray[$this->nowY][$this->nowX];
				
				// 進んだ先が場外であれば終了
				if($kame==='?'){
					return $ret . '?';
				}
			
				// 前回進んだ先が'tuv'であれば現在地と方向を変換
				$this->routeChange($kame);
				
				// ルートを積む
				$ret .= $kame;
			}
			return $ret;
		}
		
		/**
		* 現在地が'tuv'の何れかである場合、現在地と方向を変更する必要がある
		* @param 現在地
		*/
		private function routeChange($kame){
			// tuv以外なら何もしない
			if(strpos('tuv', $kame) === false){
				return;
			}
			
			// それ以外なら位置を変更、方向は反転
			$this->nowX = (10 - $this->nowX);
			$this->turnRight();
			$this->turnRight();
		}
		
		/**
		* 右を向く
		*/
		private function turnRight(){
			if(++$this->direction >= 4){$this->direction = 0;}
		}
		
		/**
		* 左を向く
		*/
		private function turnLeft(){
			if(--$this->direction <= -1){$this->direction = 3;}
		}
		
		/**
		* リセット
		*/
		private function reset(){
			$this->nowX = 0;
			$this->nowY = 0;
			$this->direction = 0;
		}
	}
```

なお技巧を凝らしてコード量を減らしてみたりしようという努力は一切無し。
かかった時間は1時間くらいです。

テスト。

```php:
<?php
	$test = [];
	$test[] = [ "2RcL3LL22", "ABCNYjmpsvy147edcbcdef" ];
        /* 省略 */
	
	$kame = new KAME();
	foreach($test as $key=>$data){
		$route = $kame->get($data[0]);
		if($route !== $data[1]){
			print('えらー');
		}
	}
```
AIR for iOS Pushまわりの挙動まとめ



AIR3.4からiOSのプッシュをサポートしてる

[ドキュメント: Adobe AIR * プッシュ通知の使用](http://help.adobe.com/ja_JP/air/build/WSd6d4f896b3a8801b7be2f55d138e29d5e40-8000.html)




挙動を覚えてられないのでまとめておく

## ものすごく雑にまとめると

Pushからの起動だと

	NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, onInvoke)
	
の`event.arguments`から取得可能。


起動中だと

	_notifier = new RemoteNotifier();
	_notifier.addEventListener(RemoteNotificationEvent.NOTIFICATION, onNotification);
	
の `event.data` から取得可能。


## 入ってるデータ

こんな感じで入っている。Invokeでも、RemoteNotificationも同じ。

	{
	  "aps" : "{\n    alert = \"\hogehoge";\n}",
	  "data" : "hogehoge"
	}


## 起動していない状態でPushを受け取った場合

- RemoteNotificationEvent.NOTIFICATION
  - 飛んでこない
- Invoke
  - あり
  - invokeEvent.argumentsの中に入っている。
  - この状態から、suspendにまわして、再度全面に持ってきたときのinvokeイベントにはargumentsが空っぽ = 期待通りの挙動

## アプリが起動中の場合 

- RemoteNotificationEvent.NOTIFICATION
  -  飛んでくる。event.dataに入っている
- Invoke: なし

## suspend状態の場合

起動中の場合と似ている。違いはinvokeイベント後にNOTIFICATIONイベントが飛んでくる

- RemoteNotificationEvent.NOTIFICATION
  -  invokeイベント後に飛んでくる。event.dataに入っている
- Invoke: なし




## LocalNotificationの挙動も別途まとめます

まとめるよ！
QiitaでGoogleアナリティクスを利用する手順

:::note warn
こちらの記事には一部古い内容が含まれています。
詳しくは [Qiita ヘルプ](https://help.qiita.com/ja/articles/qiita-google-analytics) をご確認ください。
:::

QiitaではGoogleアナリティクスのトラッキングコードを埋め込むことができます。

トラッキングコードを埋め込むことで、自分の投稿やマイページなどがどの程度見られているかを把握することができるようになります。

この記事では、Googleアナリティクスでトラッキングコードを取得して、それをQiitaに登録し、確認するまでの手順を解説します。

# 1. (事前準備)Googleのアカウントを持っていない場合は作る

[Google アカウントの作成](https://support.google.com/accounts/answer/27441?hl=ja)からGoogleのアカウントを作成します。

# 2. 新しいアカウントを作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/021dfe04-b557-b927-2118-d340801157e1.png)

ログインしたら、[Googleアナリティクス](https://analytics.google.com/analytics/web/) へアクセスし、「無料で設定」リンクよりアカウントを作成してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/8e1ceff3-e7f3-16b6-c51d-7b74ba9b5417.png)

**アカウント名**はお好きな名前を入力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/0b6f2f01-b9a6-be7e-b5ec-7f0bc07332ea.png)

**プロパティ名**は**「Qiita」**を入力します。**レポートのタイムゾーン**は**「日本」**、**通貨**は**「日本円」**を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/a2129574-8f9d-743a-d560-27ca368efc19.png)

**詳細オプションを表示**をクリックし、**ユニバーサル アナリティクス プロパティの作成**を**有効**にします。
**ウェブサイトのURL**に**「 https://qiita.com 」**を入力し、**ユニバーサル アナリティクスのプロパティのみを作成する**を選択します。
**ビジネスの概要**を入力し、作成は完了です。

# 3. トラッキングIDをQiitaへ登録する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/7949cef1-9360-8a97-2308-7ae23d9bf16f.png)

サイドメニューの**管理**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/6a0c9e70-b7c0-56e9-dbee-29aff93a48a8.png)

**プロパティ設定**を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/fff2c608-79ee-da88-21a1-1d7c5b3d5002.png)

**トラッキングID**に表示されている**「UA-XXXXX-Y」**がトラッキングIDです。

:::note 
Googleアナリティクス4のトラッキングIDも利用可能です。その場合、「管理 > データストリーム」の中にある「G-XXXXX」がトラッキングIDです。
:::

続いてQiitaにこのトラッキングIDを登録します。

Qiitaの[Googleアナリティクス設定](https://qiita.com/settings/analytics)へアクセスしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352836/56bc59b7-8120-27be-494a-48ccbe2ef6eb.png)

**Googleアナリティクス**に先ほどのトラッキングIDを入力して**更新する**をクリックします。
これでトラッキングIDの登録は完了です。

# 4. 正しく設定できたか確認する

QiitaでアナリティクスのIDを登録できたら試しに自分の記事を表示し、アナリティクスに数値が反映されているか見てみましょう。


記事にアクセス後、Googleアナリティクスで先ほど作ったプロパティの管理画面に戻り、 **[リアルタイム] > [概要]** へとアクセスください。

![Screen Shot 2018-07-19 at 14.04.24.png](https://qiita-image-store.s3.amazonaws.com/0/75633/6e84ed58-e934-a92b-9386-88b420d0022a.png)

正しく設定されている場合、画像のようにアクセス数が反映されていることが確認できます。
Flat UI ColorsをUIColorで表現してみた


有りそうで無かったので[Flat UI Colors](http://flatuicolors.com/)をUIColorで表現してみた。


```objective-c
UIColor *turquoiseFlatColor = [UIColor colorWithRed:0.10196078431372549 green:0.7372549019607844 blue:0.611764705882353 alpha:1.0];
UIColor *greenSeaFlatColor = [UIColor colorWithRed:0.08627450980392157 green:0.6274509803921569 blue:0.5215686274509804 alpha:1.0];
UIColor *emeraldFlatColor = [UIColor colorWithRed:0.1803921568627451 green:0.8 blue:0.44313725490196076 alpha:1.0];
UIColor *nephritisFlatColor = [UIColor colorWithRed:0.15294117647058825 green:0.6823529411764706 blue:0.3764705882352941 alpha:1.0];
UIColor *peterRiverFlatColor = [UIColor colorWithRed:0.20392156862745098 green:0.596078431372549 blue:0.8588235294117647 alpha:1.0];
UIColor *belizeHoleFlatColor = [UIColor colorWithRed:0.1607843137254902 green:0.5019607843137255 blue:0.7254901960784313 alpha:1.0];
UIColor *amethystFlatColor = [UIColor colorWithRed:0.6078431372549019 green:0.34901960784313724 blue:0.7137254901960784 alpha:1.0];
UIColor *wisteriaFlatColor = [UIColor colorWithRed:0.5568627450980392 green:0.26666666666666666 blue:0.6784313725490196 alpha:1.0];
UIColor *wetAsphaltFlatColor = [UIColor colorWithRed:0.20392156862745098 green:0.28627450980392155 blue:0.3686274509803922 alpha:1.0];
UIColor *midnightBlueFlatColor = [UIColor colorWithRed:0.17254901960784313 green:0.24313725490196078 blue:0.3137254901960784 alpha:1.0];
UIColor *sunFlowerFlatColor = [UIColor colorWithRed:0.9450980392156862 green:0.7686274509803922 blue:0.058823529411764705 alpha:1.0];
UIColor *orangeFlatColor = [UIColor colorWithRed:0.9529411764705882 green:0.611764705882353 blue:0.07058823529411765 alpha:1.0];
UIColor *carrotFlatColor = [UIColor colorWithRed:0.9019607843137255 green:0.49411764705882355 blue:0.13333333333333333 alpha:1.0];
UIColor *pumpkinFlatColor = [UIColor colorWithRed:0.8274509803921568 green:0.32941176470588235 blue:0.0 alpha:1.0];
UIColor *alizarinFlatColor = [UIColor colorWithRed:0.9058823529411765 green:0.2980392156862745 blue:0.23529411764705882 alpha:1.0];
UIColor *pomegranateFlatColor = [UIColor colorWithRed:0.7529411764705882 green:0.2235294117647059 blue:0.16862745098039217 alpha:1.0];
UIColor *cloudsFlatColor = [UIColor colorWithRed:0.9254901960784314 green:0.9411764705882353 blue:0.9450980392156862 alpha:1.0];
UIColor *silverFlatColor = [UIColor colorWithRed:0.7411764705882353 green:0.7647058823529411 blue:0.7803921568627451 alpha:1.0];
UIColor *concreteFlatColor = [UIColor colorWithRed:0.5843137254901961 green:0.6470588235294118 blue:0.6509803921568628 alpha:1.0];
UIColor *asbestosFlatColor = [UIColor colorWithRed:0.4980392156862745 green:0.5490196078431373 blue:0.5529411764705883 alpha:1.0];
```

UIColor+FlatUIも作ってみた。
https://github.com/makotokw/CocoaWZYFlatUIColor

ついでにiOS7Colorsも少し。

![WZYFlatUIColor.png](https://qiita-image-store.s3.amazonaws.com/0/2435/50c47093-274c-36ed-73fc-8b3ef1d12679.png "WZYFlatUIColor.png")
pyramidチュートリアル メモ (bankaccount)

[Pyramid チュートリアル — Pyramid Tutorial for PyCon JP Sprint 1.0 documentation](https://pyramid_tutorial_pylonprojectjp.readthedocs.org/en/latest/#)
を参考にしてハマった点をメモ。

----

### どんな画面ができるか
![bankbalance.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3abbec7b-defd-a9d5-f68e-c016e11282eb.png)

----

### HTTPFoundがない
views.py先頭に以下追加

```py:
from pyramid.httpexceptions import HTTPFound
```

----

### インタプリタでimportエラー

定義した BankAccount モデルをインタプリタで扱ってみましょう。

```py:
>>> from bankaccount import models
```

でzope.sqlalchemyあたりがimportできない場合、おそらくpythonプロンプトから行なっているのではないでしょうか。
以下でimportエラー出なくなるかと思います。

```bash:
pshell development.ini
```

----

### bankaccount.dbファイルの初期化
ここまで来たら何したらいいか見落としてしまいました。

```py:
>>> from bankaccount import models
>>> models.Base.metadata.create_all()
>>> b = models.BankAccount(name=u'default')
>>> models.DBSession.add(b)
>>> import transaction
>>> transaction.commit()
```

### index.makファイルが見つからない
チュートリアル最初の方にtemplatesフォルダを渡すやり方があるので使用。


ファイル構成
----

| ファイル | 説明 |
|:---------|:-----|
| development.ini | db定義、debugtoolbar表示設定 |
| bankaccount.db  | dbの実ファイル		 |
| bankaccount/init.py | route設定、makoテンプレートのパス指定 |
| bankaccount/views.py | コントローラ |
| bankaccount/models.py | dbのテーブル定義と、モデル |
| bankaccount/resources.py | 残高を取ってくる | 
| bankaccount/templates/index.mak | 残高表示、預金、引き出しができる |


download
----

[bankaccount](https://github.com/tukiyo/pyramid_tutorials)
Python+FlaskなwebアプリをJenkinsでウイーン


(-_-).oO(タイトルは気にしない事、考えるの面倒なんだよ)

## はじめに

Python+FlaskなwebアプリをJenkinsでビルドしまくるようにしたのでそのメモ。

ディレクトリ構成はこんな感じ(見せたくないディレクトリは消してます)。

```shell
% tree -d
.
├── env (virtual env)
├── project
│   ├── app
│   ├── conf
│   ├── logs
│   ├── models
│   │   └── mongo
│   ├── services
│   ├── static
│   ├── templates
│   ├── tests
│   │   ├── app
│   │   ├── cover
│   │   ├── data
│   │   ├── models
│   │   │   └── mongo
│   │   ├── services
│   │   ├── utils
│   │   └── view
│   └── utils
└── script
    ├── deploy (fabricとか)
    └── tools
```

トップディレクトリ直下にprojectというディレクトリがあり、その下にアプリケーションが全て展開されている。
また、projectディレクトリからnosetestsが実行でき、現時点でテストが全て通るようになっている。
また、coverageを導入しておき、カバレッジを取得できるようにしておく。
テストの実行方法は以下のとおり。

```shell
% source env/bin/activate
% cd project
% export PYTHONPATH=$PYTHONPATH:`pwd`
% nosetests -v -w tests/ --with-coverage --with-xunit --cover-package=app --cover-package=models --cover-package=services --cover-package=utils --cover-html --cover-xml
```

## Jenkinsを立ち上げる前にやること

Jenkins内でvirtualenvで環境を整えるため、必ずpip freezeしたものをコミットしておくこと(もしくはshellでいちいち実行してもいいけどバージョンとか考えるとpip freezeが楽)。

```shell
% source env/bin/activate
% cd project
% pip freeze > requirements.txt
% git add requirements.txt
% git commit
% git push origin master
```

## Jenkins側の作業

まず、使ってるVCSのプラグインとカバレッジ計測をするためにCoberturaプラグインをインストールする。

そして新しいジョブを作成して、ソースコード管理でレポジトリのパスを入力します。
次に、ビルドのビルド手順の追加からシェルの実行を選んで以下のように入力します。

```shell
if [ ! -d venv ]; then
  virtualenv --distribute venv
fi
source venv/bin/activate
cd project
pip install -r requirements.txt
export PYTHONPATH=$PYTHONPATH:$WORKSPACE/project
echo "設定のコピーとか事前にやることがあればここでやる"
nosetests -v -w tests/ --with-coverage --with-xunit --cover-package=app --cover-package=models --cover-package=services --cover-package=utils --cover-html --cover-xml
sed "s|filename=\"|filename=\"project/|g" $WORKSPACE/project/tests/coverage.xml > $WORKSPACE/project/tests/coverage2.xml
```

最後のsedはディレクトリ直下にソースコードがないため、カバレッジの方でソースコードが見れない問題を解決するため、カバレッジの計測結果のパスにトップディレクトリからの相対パスを追加します(参考: [Hudson “Source code is unavailable.”](http://stackoverflow.com/questions/2285672/hudson-source-code-is-unavailable/2915958#2915958 "Hudson “Source code is unavailable.”"))

次にビルド後の処理を２つ追加します。
一つはJUnitテスト結果の集計を追加して、テスト結果XMLに以下の内容をコピーします。

```
project/nosetests.xml
```

もう一つはCobertura カバレッジ・レポートの集計を追加して、Cobertura XMLレポート パターンに以下の内容をコピーします。

```
project/tests/coverage2.xml
```

これで保存をして、ビルドをぶん回します。

たぶん、ダッシュボードを見て幸せになれると思います。
Riak doc の Clusters を意訳してみた

# Clusters

大雑把な意訳、訳しにくい箇所は英文のまま転載します。
http://docs.basho.com/riak/1.3.2/references/appendices/concepts/Clusters/

## Overciew

Riak's default mode of operation is in a cluster. Riak Cluster は一般的に互いに接続している物理ホストで構成されます。Cluster の各ホストは、ひとつの Riak ノードとして動作します。各 Riak ノードは複数の仮想ノード (あるいは vnodes と呼ぶ) で構成されます。各仮想ノードはキー空間を区別するパーティションにデータを格納します。

ノードは互いのクローンではありません。また、各ノードは全リクエストの一部の処理にしか関与しません。The extent to which data is replicated, and when, and with what merge strategy and failure model, is configurable at runtime.

## The Ring

このセクションの多くは Dynamo の論文で議論されています。しかし、Riak がどのように実装されているかに関する良いサマリーです。

Riak のクライアントインタフェースは、buckets と keys を扱います。内部で、Riak は bucket/key ペアで 160-bit の binary hash を計算します。そして、全ての values を、順序付けられた Ring にマッピングします。Ring はパーティションに分割されます。各仮想ノードは、ひとつのパーティションを担当します。

Riak Cluster の各ノードは、おおよそ等しい数の仮想ノードを持ちます。一般的な場合は、Cluster の各ノードは、"パーティション数/ノード数" 台の仮想ノードを持ちます。例えば、2 台のノードと 16 個のパーティションで構築される Cluster においては、各ノードは 8 台の仮想ノードを持ちます。Nodes attempt to claim their partitions at intervals around the ring such that there is even distribution amongst the member nodes and that no node is responsible for more than one replica of a key.

value が Cluster に格納される時は、どのノードもリクエストのコーディネートに関わる可能性があります。コーディネートするノードは、格納される value の key が属するパーティションを担当している仮想ノードを決める為に、Ring のステートを調べます。次に "put" リクエストをその仮想ノードに送信し、同じように Ring から N-1 のパーティションを担当している仮想ノードに送信します。ここでの N は、bucket の設定パラメータで、value のコピーをどれだけ格納するかの値です。その "put" リクエストは、少なくても W (=<N) 台の仮想ノードが成功したら返答するか、DW (=<W) 台の仮想ノードが永続的に格納できた後に成功したら返答するか、を指定できます。

"fetch" または "get" リクエストも同様に key が属するパーティションを担当している仮想ノードにリクエストを送信し、同じように次の N-1 のパーティションを担当する仮想ノードにリクエストを送信します。"fetch" または "get" リクエストは、R (=<N) 台の仮想ノードの応答が必要かを指定できます。

## Gossping

Ring のステートは Gossip Protocol を使用して Cluster 全体に共有されます。ノードが Ring のパーティションを担当する仮想ノードに変更が生じる度に、Gossip Protocol を使用して変更を伝えます。Ring のステートを定期的に再送することによって、前回の最新版を逃したノードでも反映されます。

## End

そんなに内容なかったけど、おしまい。
NewrelicのServerMonitorのインストール

[newrelic](http://newrelic.com/)

## YUM環境でインストール

```bash
$ sudo rpm -Uvh http://yum.newrelic.com/pub/newrelic/el5/x86_64/newrelic-repo-5-3.noarch.rpm
$ sudo yum -y install newrelic-sysmond
$ sudo nrsysmond-config --set license_key=xxxxxxxx
$ sudo /etc/init.d/newrelic-sysmond start
```

## APT環境でインストール

```bash
$ vi /etc/apt/sources.list.d/newrelic.list
vi$ deb http://apt.newrelic.com/debian/ newrelic non-free
を追記
$ sudo wget -O- http://download.newrelic.com/548C16BF.gpg | apt-key add -
$ sudo wget -O- http://download.newrelic.com/548C16BF.gpg | sudo apt-key add -
$ apt-get update
$ apt-get install newrelic-sysmond
$ nrsysmond-config --set license_key=YOUR_LICENSE_KEY
$ /etc/init.d/newrelic-sysmond start
```
配列ソートあれこれ

ソートに関する覚書。
今回ソートに利用する配列はこちら。

```objectivec:
NSArray *array = @[@"Apple", @"cocoa", @"apple", @"beta", @"Xcode", @"2013", @"35", @"Beta", @"0.9", @"70.4"];
```
※以降のサンプルコードは次の環境で作成しています。

* Xcode 4.6.3
* iOS SDK 6.1

## 文字コード順に取得したい
[NSArray sortedArrayUsingSelector:]でいけるみたい。

```objectivec:
NSArray *array = @[@"Apple", @"cocoa", @"apple", @"beta", @"Xcode", @"2013", @"35", @"Beta", @"0.9", @"70.4"];
array = [array sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@", array);
/*
(
    "0.9",
    2013,
    35,
    "70.4",
    Apple,
    Beta,
    Xcode,
    apple,
    beta,
    cocoa
)
 */
```

## Blocksを利用したソート
NSArrayに格納しているオブジェクトの要素(i.e. MyObject.name)をソート対象とする場合、Blocksで条件を拡張するとよい。

```objectivec:
array = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSStringCompareOptions compareOptions = (NSCaseInsensitiveSearch);
    return [obj1 compare:obj2 options:compareOptions];
}];
```

## 比較オプション(NSStringCompareOptions)
ビット演算を利用して複数の条件を指定できるように定義されている。

```objectivec:
typedef NS_OPTIONS(NSUInteger, NSStringCompareOptions)
   NSCaseInsensitiveSearch = 1, 		// 1 << 0
   NSLiteralSearch = 2, 				// 1 << 1
   NSBackwardsSearch = 4, 				// 1 << 2
   NSAnchoredSearch = 8, 				// 1 << 3
   NSNumericSearch = 64, 				// 1 << 6
   NSDiacriticInsensitiveSearch = 128, 	// 1 << 7
   NSWidthInsensitiveSearch = 256, 		// 1 << 8
   NSForcedOrderingSearch = 512, 		// 1 << 9
   NSRegularExpressionSearch = 1024 	// 1 << 10
};
```
先ほどのBlocks内の条件を下記に書き換えると、以下の様に出力される。

```objectivec:
NSStringCompareOptions compareOptions = (NSNumericSearch | NSCaseInsensitiveSearch)
/*
(
    "0.9",
    35,
    "70.4",
    2013,
    Apple,
    apple,
    beta,
    Beta,
    cocoa,
    Xcode
)
 */
```

## NSSortDescriptorによるソート
配列に格納されたクラスの**複数要素に対するソート条件**が必要なときに有効。
AppleのサンプルコードやSOFを見ているとCore DataやNSDictionaryなどのソートに力を発揮しそう。

今回は先ほどの配列とは別のデータを利用して説明する。
例として以下の定義に従うMyObjectクラスを作成して、

```objectivec:MyObject.h
@interface MyObject : NSObject

@property NSString *name;
@property int lifeTime;

- (id)initWithName:(NSString *)name withLifeTime:(int)lifeTime;
@end
```
このクラスから5つのインスタンスを生成して配列に格納する。

```objectivec:
NSArray *nameArray = @[@"John", @"Mick", @"Tom", @"Sam", @"John"];
    NSMutableArray *array = [NSMutableArray new];
for (int i = 0; i < 5; i++) {
    [array addObject:[[MyObject alloc] initWithName:nameArray[i] withLifeTime:(arc4random() % 100)]];
}
```
配列内の各要素の出力結果はこのようになる。

```objectivec:
John:	36
Mick:	44
Tom:	1
Sam:	61
John:	48
```
この配列のソート条件に

* name(昇順)
* lifeTime(昇順)

の2つのルールを追加する。


```objectivec:
// ソート条件を定義
NSSortDescriptor *nameSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"self.name" ascending:YES];
NSSortDescriptor *lifeTimeSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"self.lifeTime" ascending:YES];

// 上記のソート条件を適用
array = (NSMutableArray *)[array sortedArrayUsingDescriptors:@[nameSortDescriptor, lifeTimeSortDescriptor]];
```
ソート後の配列は以下の様に出力される。

```objectivec:
John:	36
John:	48	// nameが同一(NSOrderedSame)の場合はlifeTimeのソート条件に従っている
Mick:	44
Sam:	61
Tom:	1
```
CQ5 Tag Library

テンプレート開発を行うにあたって、共通で利用できるライブラリーのメモ

```java:global.jsp
puts <%@include file="/libs/foundation/global.jsp"%>
```

この共通ライブラリを読み込むためのおまじないを必ずしましょう。便利です。
global.jspの中身は以下になります。

```java:global.jsp
puts 
<%@page session="false" import="javax.jcr.*,
        org.apache.sling.api.resource.Resource,
        org.apache.sling.api.resource.ValueMap,
        com.day.cq.commons.inherit.InheritanceValueMap,
        com.day.cq.wcm.commons.WCMUtils,
        com.day.cq.wcm.api.Page,
        com.day.cq.wcm.api.NameConstants,
        com.day.cq.wcm.api.PageManager,
        com.day.cq.wcm.api.designer.Designer,
        com.day.cq.wcm.api.designer.Design,
        com.day.cq.wcm.api.designer.Style,
        com.day.cq.wcm.api.components.ComponentContext,
        com.day.cq.wcm.api.components.EditContext"
%><%@taglib prefix="sling" uri="http://sling.apache.org/taglibs/sling/1.0" %><%
%><%@taglib prefix="cq" uri="http://www.day.com/taglibs/cq/1.0" %><%
%><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%
%><%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %><%
%><%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %><%
%><cq:defineObjects />
```

常に使うclassファイルのインポートとタグの宣言ができており、 特に最後に記載されている
**\<cq:defineObjects />**タグで、jspのプログラムが簡略化できるようになっています。

使えるタグとしては、以下のものをよく使ってます。

* currentPage
* properties
* currentDesign
* currentStyle

応用編としては以下を覚えます。

* resource
* currentNode
* log

次回は上記タグの使い方など。
Macにnvm + Node.jsをインストールする


## 1. nvmインストール

下記コマンドを実行。

```` sh
$ cd ~
$ git clone git://github.com/creationix/nvm.git .nvm
$ . .nvm/nvm.sh
````

`.bash_profile`や`.zshrc`に下記を追記。

```` sh
[[ -s (自分のホームディレクトリ)/.nvm/nvm.sh ]] && . (自分のホームディレクトリ)/.nvm/nvm.sh
nvm use default
npm_dir=${NVM_PATH}_modules
export NODE_PATH=$npm_dir
````

一旦ターミナルを抜けるとか、`source ~/.bash_profile`とかして、`./bash_profile`の更新を反映させる。  
下記のように`nvm`コマンドを実行して下記のように出力されたらOK。 

```` sh
Node Version Manager

Usage:
    nvm help                    Show this message
    nvm install [-s] <version>  Download and install a <version>
    nvm uninstall <version>     Uninstall a version
    nvm use <version>           Modify PATH to use <version>
    nvm run <version> [<args>]  Run <version> with <args> as arguments
    nvm ls                      List installed versions
    nvm ls <version>            List versions matching a given description
    nvm ls-remote               List remote versions available for install
    nvm deactivate              Undo effects of NVM on current shell
    nvm alias [<pattern>]       Show all aliases beginning with <pattern>
    nvm alias <name> <version>  Set an alias named <name> pointing to <version>
    nvm unalias <name>          Deletes the alias named <name>
    nvm copy-packages <version> Install global NPM packages contained in <version> to current version

Example:
    nvm install v0.4.12         Install a specific version number
    nvm use 0.2                 Use the latest available 0.2.x release
    nvm run 0.4.12 myApp.js     Run myApp.js using node v0.4.12
    nvm alias default 0.4       Auto use the latest installed v0.4.x version
````


## 2. Node.jsをインストール

下記コマンドを実行してインストールできるNode.jsのバージョンを確認。

````sh
$ nvm ls-remote
````

インストールしたいNode.jsのバージョンをコマンドラインオプションで指定して、Node.jsをインストール。

````sh
$ nvm install v0.10.12
````

`package.json`とかあれば下記コマンドで必要なライブラリをインストールすると、node_modulesDirectoryに`package_json`で指定されたライブラリがインストールされる。

````sh
$ npm install
````

## 3. Node.jsの実行

まずは、下記コマンドで使用するNode.jsのバージョンを指定する。

````sh
$ nvm use v0.10.12
````

`package_json`に下記のような記述があれば、

````json
{
  "name": "hoge",
  "version": "0.0.1",
  "description": "hoge!",
  "main": "server.js",
  "scripts": {
    "test": "mocha test/**/*.test.js",
    "start": "node server.js"
  },
````

下記コマンドで server.jsが実行される。

````sh
$ npm start
````

もしくは下記コマンドで。

````sh
$ node server.js
````

## 4. `nvm use **`コマンドを実行するのが面倒な場合

````sh
$ nvm alias default v0.10.12
````

とかして、シェルを再起動したりするとデフォルトで使用するNode.jsのバージョンを指定できる。
GALAXY S4のWebViewでcanvasのdrawImageがおかしい

```CoffeeScript
ctx = canvas.getContext '2d'
img = new Image()
img.src = 'hoge.png'
img.onload = ->
	ctx.drawImage img, 0, 0, 100, 100
```
とした時に、原点から1x1pxのドットが全画面に表示される。

発生条件は不明で、最小構成の場合起きないこともある。

起きるのは初回アクセス時のみで、2回目以降は発生しない。
ただし、setTimeoutなどで遅延描画させた場合、2回目以降も発生する。
パーフェクト JavaScript 3章 JavaScriptの型

## 3章 JavaScriptの型

#### 5つの基本形

* 文字列
* 数値型
* ブーリアン型
* null型
* undefined型

#### プロトタイプベースについて補足
>(ECMAScriptの)仕様書に基本型（primitive type）の用語はなく、その代わり基本値（primitive value）の用語が使われています。

### 文字列型の演算
文字列は不変

#ここにあとで写経する。 P43参照

###文字列型の比較

```js:
var s1 = '012';
var s2 = '0';
var s3 = s2 + '12';
s1 == s3 // 文字列の中身が一致
true
s1 === s3 // 文字列の中身が一致
true
````

#### ===
strict equal
型変換をする

#### ==
型変換をしない

文字列型においては、上記二つの結果に違いは無い。


#### Unicode コードポイントの大小比較
* 英語アルファベットは辞書順
* 英語の大文字は小文字よりも前
* 数字や記号は英文字よりも前
* ひらがな、カタカナ、漢字
* ひらがなとカタカナはそれぞれ辞書順
* へほぼぽま
* 漢字の並び順はコンピュータの都合

以上、3-3-3まで
オフラインどう書く第12回参考問題 (C 力技版)

http://qiita.com/Nabetani/items/1de39df381dfeee305ab

なんの工夫もない力技版です。

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

#define NDIRS 4

const char *str = "?ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
                  "abcdefghijklmnopqrstuvwxyz" \
                  "01234567";
int dirs[NDIRS][60] = {
    {
         1,  2,  3,  4,  5,  6,  7,  8,  9, 10, -1, 12, 13, 14, 15, 16,
        17, 18, 19, 20, 21, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
        -1, 34, 35, -1, 37, 38, -1, 40, 41, -1, 43, 44, -1, 46, 47, -1,
        49, 50, -1, 52, 53, -1, 55, 56, -1, 58, 59, -1
    },
    {
        11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
        27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, 59, 58,
        57, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
        51, 52, 53, 54, 55, 56, 57, 58, 59, 32, 31, 30
    },
    {
        -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, 11, 12, 13, 14,
        15, 16, 17, 18, 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, 30,
        31, -1, 33, 34, -1, 36, 37, -1, 39, 40, -1, 42, 43, -1, 45, 46,
        -1, 48, 49, -1, 51, 52, -1, 54, 55, -1, 57, 58
    },
    {
        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  0,  1,  2,  3,  4,
         5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
        21, 22, 23, 24, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
        45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56
    }
};


void solve(char *r, const char *s)
{
    int next;
    int step;
    int dir;
    int pos;
    int i;

    step = 0;
    dir = 0;
    pos = 0;
    *r++ = str[pos + 1];
    for (; *s != '\0'; s++) {
        if (*s == 'R')
            dir = (dir + 1) % NDIRS;
        else if (*s == 'L')
            dir = (dir - 1 + NDIRS) % NDIRS;
        else if (*s >= '0' && *s <= '9')
            step = *s - '0';
        else if (*s >= 'a' && *s <= 'f')
            step = *s - 'a' + 10;
        for (; step > 0; step--) {
            next = dirs[dir][pos];
            *r++ = str[next + 1];
            if (next == -1)
                goto end;
            for (i = 0; i < NDIRS; i++) {
                if (dirs[i][next] == pos) {
                    dir = (i + 2) % NDIRS;
                    break;
                }
            }
            pos = next;
        }
    }
end:
    *r = '\0';
}

void test(const char *in, const char *out)
{
    char r[80];

    solve(r, in);

    printf("%s -> %s(%s) %s\n", in, r, out,
        strcmp(r, out) == 0 ? "ok" : "ng");
}

int main(void)
{
/*0*/ test( "2RcL3LL22", "ABCNYjmpsvy147edcbcdef" );
...snip...
    return 0;
}
```
不具合：「限定共有」にチェック付けて「Qiitaに投稿」ボタンを押すと、「限定共有」のチェックが外れる


そのため、限定共有のつもりの投稿が公開になってて慌てて投稿を消したことが何度かある。
この挙動を改善してほしい。

再現手順：

* 限定共有にチェックを付けて「Qiitaに投稿」ボタンをクリック

![スクリーンショット 2013-06-25 13.52.50.png](https://qiita-image-store.s3.amazonaws.com/0/8219/86e6c5d9-9788-3eb8-b248-67ab0ddc5265.png "スクリーンショット 2013-06-25 13.52.50.png")


* 確認のダイアログが開いたときには「限定共有」のチェックが外れてる

![スクリーンショット 2013-06-25 13.53.04.png](https://qiita-image-store.s3.amazonaws.com/0/8219/6e9979f4-fe75-9ff4-41ec-80255bc9fb5f.png "スクリーンショット 2013-06-25 13.53.04.png")
Photon Cloud × Unity GameJam 事前勉強 - Rigidbodyの同期


GameJamの事前勉強会のために作った資料です。

> http://kokucheese.com/event/index/95326/

ネットワークゲームにおいてオブジェクトの動きに関するものには注意を払わなければいけません。
UnityではRigidbodyを例として説明します。

![名称未設定-1 copy.png](https://qiita-image-store.s3.amazonaws.com/0/5549/fc1b598b-363d-8b31-dcc0-8734cfd683a4.png "名称未設定-1 copy.png")

ネットワークゲームではオブジェクトの *位置・角度・スケール* がどの画面から見ても同じでなければいけません。
Rigidbodyは物理演算に則って、オブジェクトの *位置・角度* が変化します

しかし、動きをRigidbodyに任せてしまうと、どの画面でも動きが全く同じになるという保証がされなくなります

> タイムラグが原因で１つの画面のみ違う動作をしてしまった場合、どう修正を行いますか？

そこで、ある程度保証ができるように、少し特殊な処理を施さなければいけません

![名称未設定-1 copy.png](https://qiita-image-store.s3.amazonaws.com/0/5549/a3bc0667-fde0-f61b-5e8a-1628f881b07f.png "名称未設定-1 copy.png")

* *自分の画面* : Rigidbodyの適用によって変化した位置・角度情報を相手の画面に送信する
* *相手の画面* : isKinematicにチェックを入れ、重力による挙動をなくす
* *相手の画面* : 送られてきた位置・角度情報を適用する

以上でRigidbodyの同期についてのお話は終了です。これを理解しておくと開発がぐっと楽になるのではないでしょうか。


最後に実際に適用する時のソースコード

```Sample.cs
using UnityEngine;
using System.Collections;

[RequireComponent(typeof(PhotonView))]
[RequireComponent(typeof(Rigidbody))]
public class Sample : Photon.MonoBehaviour
{
	void Awake ()
	{
		// 相手の画面だったら
		if (!photonView.isMine) {
			rigidbody.isKinematic = true;
		}
	}
}
```

##初学者向け問題はこちら
[Unityに関する初歩問題](https://codeiq.jp/ace/kamata_yasuyuki/q362)
##published by

日本Androidの会 秋葉原支部 Unity部
https://www.facebook.com/groups/android.akb.unity/
オブジェクトのプロパティ名の一覧とプロパティ値の一覧を取得

オブジェクトに含まれるプロパティ名とプロパティ値の一覧を取得するためには、Objective-C のランタイムを利用します。

```objc:
#import "objc/runtime.h"
```
をImportして以下のコードで一覧を取得可能です。

```objc:
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList([(任意のオブジェクト) class], &outCount);
for (i = 0; i < outCount; i++) {
   objc_property_t property = properties[i];
   const char *name = property_getName(property);
   NSString *propertyName = [NSString stringWithUTF8String:name];
   NSString *propertyValue = [(任意のオブジェクト) valueForKey:propertyName]; 
   NSLog(@"プロパティ名[%d]:%@",i ,propertyName); 
   NSLog(@"プロパティ値[%d]:%@",i ,propertyValue);
 }
free(properties);
```
pythonのsqlite3でインメモリDBをセーブ/ロードする

sqlite3.connect(':memory:') として
メモリ上に作成されたDBイメージは、
ダンプファイルにすることで保存できます。

以下のサンプルではダンプファイルはgzipで格納してます。

```py:
#ファイルからロード
con = sqlite3.connect(':memory:')
fp = gzip.open('./dump.sql.gz' ,'rb')
con.executescript(fp.read())
fp.close()

#ファイルへセーブ
fp = gzip.open('./dump.sql.gz','wb')
for line in con.iterdump():
  fp.write('%s\n' % line)
fp.close()

```

ただし、この方法では件数が増えると、
ロードにとても時間がかかるため実用的ではありません。

実用上ではsqlite3.connect(':memory:')を使わず
tmpfsにdbファイルを置いたほうがいいです。
CDN代わりにgithubを使いたい場合は外部サービスrawgithubを利用しよう

すでにこの記事の内容は古いので、
以下の記事を参考にしてください。

[【個人メモ】rawgithub(CDN)のサービスがアップデートされてた](http://qiita.com/futoase/items/8e20db8f7a191941d6b6)

#CDN代わりにgithub.comを利用したいが...

推奨されないやり方なのかもしれない。

github上にあるリポジトリにあるjsファイルなどを
直接読み取ることで、CDN代わりに利用しようという感じ。

例えば
https://raw.github.com/futoase/rawgithub-demonstration-sample/master/dest/clash.min.js
とか。raw.github.com/user/repository/filenameでファイルそのものの内容を見ることができる。

けどまあ、自分のために使うだけだし...ということで使おうとしたところ、
MIME Typeの指定がtext/plainなためにJavaScriptを実行できねーよ！ってブラウザーが怒る。
あれ、前からこうだったっけ???

![スクリーンショット 2013-06-25 1.11.06.png](https://qiita-image-store.s3.amazonaws.com/0/3985/82ff17fc-fe3c-4965-ec81-8f0cff7c666d.png)

#検証してみよう

先ほどのブラウザーの怒りを検証するためのファイルを用意した。
くだらないアプリケーションをJavaScriptで書く(アプリケーションとは言えないレベルだけど)

ファイルは以下のリポジトリに置いてある。
https://github.com/futoase/rawgithub-demonstration-sample

##リポジトリからファイルをgit cloneしよう

```
> git clone git@github.com:futoase/rawgithub-demonstration-sample.git
```

##git cloneし終えたら、index-raw.github.com.htmlを開いてみる。

```
> cd rawgithub-demonstration-sample
> open index-raw.github.com.html
```

##Chromeさんのご機嫌をみてみると

うう、辛い、JavaScriptじゃないって言われてるんだけど？って怒られる。
(先ほどあげた画像)

![スクリーンショット 2013-06-25 1.11.06.png](https://qiita-image-store.s3.amazonaws.com/0/3985/82ff17fc-fe3c-4965-ec81-8f0cff7c666d.png)

![スクリーンショット 2013-06-25 1.15.40.png](https://qiita-image-store.s3.amazonaws.com/0/3985/79a53fe2-abf6-54d5-f0ac-112cf96e50e0.png)

text/plainだ...

#rawgithub.comを使おう

と思って探してたところ、
[http://rawgithub.com/](http://rawgithub.com/)というサービスを見つけた。
サードパーティー製で、公式じゃないようだ。

で、ソースの読み込み先を変えてみる。

https://raw.github.com/futoase/rawgithub-demonstration-sample/master/dest/clash.min.js
から
https://rawgithub.com/futoase/rawgithub-demonstration-sample/master/dest/clash.min.js
へ。

変えたものについては既にサンプルファイルに置いてある。

```
> open index-rawgithub.com.html
```

おお...大丈夫だ

![スクリーンショット 2013-06-25 1.20.19.png](https://qiita-image-store.s3.amazonaws.com/0/3985/ea4b4637-010e-79ea-efda-31e7fa677109.png)

#結局のところ

rawgithubというサービス、プロダクトとしてコードが公開されてて、
[ローカル環境でサーバー(proxy)として起動できるようだ。](https://github.com/rgrove/rawgithub)

気軽に使うには良いと思うが、何時サービス停止するのかが不明確なので
S3にファイルをアップロードするなりそういう形で自前でCDN持たせたほうが良いかもしれない。

2013/7/11追記

コメントに追記していただいたのですが、
rawgithub.comについて本番では利用しないように、という注意書きがされているので、
あくまでお試しで利用する形にしましょう。
Chrome の debugger の開始と終了

ソースに `debugger;` を入れれば、そこをブレークポイントとして Chrome のデバッガが起動する

Console パネルからローカル変数が参照できる、Python の pdb 的動作

終了するには `Cmd + /` か Sources パネル右の ||＞ ボタンを押す

![](http://gyazo.com/46a26c0d60eb44976bdd252304c2c9b3.png)


## 参考

- Chrome Keyboard shortcuts - Source Panel https://developers.google.com/chrome-developer-tools/docs/shortcuts?hl=ja#sources-panel
- http://developer.chrome.com/extensions/debugger.html
bash/zshでsourceされたスクリプト内で、ファイル自身の絶対パスをとるシンプルな記法

    追記: コメント欄にて、若干変なパスが含まれている場合の対処方法について、補足いただきました。
    ご指摘ありがとございますm(_ _)m

bash / zshなどでシェルスクリプトを書いていると、環境変数の設定を外部ファイルにまとめてsource して使う、というのはよくある。
そのような場合にsourceされたファイル内での絶対パスがイマイチうまく取れない、という問題に突き当たる事がある。

## bashの話: うまくいかない方法と理由

通常、シェルスクリプト内で自分自身の絶対パスをとるときによくやるのが下記の手法だとおもう。

    script_dir=$(cd $(dirname $0); pwd)

が、単体で呼び出した場合にはちゃんと動くのだが、bashからsourceで呼び出した場合にはうまく動かない。

なぜかというと、sourceされたファイルの実行が、呼び出し元のシェルプロセス内になるから。
bashでは`$0`は実行コンテキストに依らず、実行ファイル名が入っている。
そのため、source されたファイル内では$0が大本のファイルの情報となっているため、直感と異なる動きとなってしまう。

## zshの話

ちなみに、zshだとちゃんと動く。zshは、`$0`をコンテキストに合わせて置き換える。
関数内であれば関数名になるし、sourceすればsourceされたファイルパスが入る。
そのため、zshなら`$0`を使っていれば問題ない。

## bashの話: 解決の糸口

一般に言われるのは、`$BASH_SOURCE`を使う方法。
これには、呼び出されたファイル自身の絶対パスが入っている。そのため、bash限定であればこれを利用して

    script_dir=$(cd $(dirname $BASH_SOURCE); pwd)

を使えば、解決できる。

## これ使うと何が辛いか

bash限定なんですよね。zshかbashかを判定して、場合分けするような処理をいちいち書きたくない。

## じゃあどうすんの

こうすればいい

    script_dir=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd)

`$BASH_SOURCE`が定義されていればそれを使い、無いなら`$0`を使う。
これでさくっと解決できる。


最後のほう書くの面倒になって説明が雑になった。。。わけじゃないよ！＞＜
pythonのsqlite3 に日本語(マルチバイト文字列)を格納する

"文字列はunicode にしてからsqlite3モジュールに渡す" ようにすると
問題なくマルチバイト文字列に対応できる。

```py:
import sqlite3,sys,os

con = sqlite3.connect("./temp.sqlite")

#テーブル作成
sql = u"""
  create table filepath(
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    path text);"""
con.execute(sql)

#標準入力からファイルリストを受け取り
#DBに格納する
for rwln in iter(sys.stdin.readline,""):
  path = rwln.rstrip('\n') #末尾改行を削除
  sql = u"""insert into filepath(path) values (?); """
  cur = self.con.cursor()
  #ファイルシステムのエンコーディングはsys.getfilesystemencoding() で取得できるので
  #これを使ってunicode()関数で変換後にsqliteモジュールに渡す
  cur.execute(sql,(unicode(path, sys.getfilesystemencoding()),))
```

この方法以外にもbase64変換後に格納する事もできるけど、
エンコーディングが特定出来る場合はunicodeにしとくのが良い。
さくらのクラウドでUbuntu 12.04 LTSを導入して最初にする設定


実は初 Iaas。本当にクリックだけで簡単にサーバがつくれるんですねぇ・・・すごい。

最小構成でサーバを作成。月額2500円。
OS は Ubuntu 12.04 LTS。サーバ作成時に、ホスト名と公開鍵を設定。
以降、サーバ作成後の話。

## ログイン周り設定

### 登録した公開鍵で接続する
* `ubuntu` ユーザがデフォルトで作成されている 
* サーバ→コンソール→情報→NIC→IPv4アドレス にグローバルIPが書いてある

```sh:ローカル
$ ssh ubuntu@[上記で確認したIP]
```

### hosts の修正
* （おそらく、サーバ作成時にホスト名を設定した場合）sudo した時に warning が出るので、きちんと設定する
* [「sudo: unable to resolve host ***」と怒られたときの対処法 - sakurako_sの日記](http://d.hatena.ne.jp/sakurako_s/20100916/1284599963 "「sudo: unable to resolve host ***」と怒られたときの対処法 - sakurako_sの日記")

例) ホスト名を `akarin.gorakubu.yuruyuri` とした場合

```config:サーバ(/etc/hosts)
127.0.1.1 akarin.gorakubu.yuruyuri akarin
```

### ユーザの作成と sudo 権限の付与
* ubuntu ユーザは最後の砦としてとっておきましょう
* 新しく作成したユーザで sudo もできるようにしておく
    * sudo の管理は `/etc/sudoers`
    * グループの管理は `/etc/group`
    * 自分の所属グループの確認は `groups`

```sh:サーバ
ubuntu$ sudo adduser akarin
ubuntu$ sudo gpasswd -a akarin sudo # Ubuntu 12.04 LTS だと sudo グループを設定すれば sudo が使えるようになる
ubuntu$ sudo su - akarin
```

### sshd の設定変更
* デフォルトポートの変更
* ルートログイン不可
* パスワード認証不可
* 空パスワード不可

辺りを設定。参考: [madroom project: UbuntuでSSHのセキュリティ設定メモ](http://madroom-project.blogspot.jp/2012/12/sshubuntu.html "madroom project: UbuntuでSSHのセキュリティ設定メモ")

```config:サーバ(/etc/ssh/sshd_config)
# デフォルトポートの変更
Port xxx
 
# ルートログインは不可
PermitRootLogin no
 
# パスワード認証不可
PasswordAuthentication no

# 空パスワード不可
PermitEmptyPasswords no 
```

sshd 再起動

```sh:サーバ
akarin$ sudo service ssh reload
```

### authorized_keys 設定
* パスワードログインを不可にしたので、きちんとログインユーザのホームに `authorized_keys` をつくって ssh でログインできるようにする。
* ubuntu ユーザのをもってくるだけでおｋ。

```sh:サーバ
akarin$ cd
akarin$ sudo cp -r /home/ubuntu/.ssh .
akarin$ sudo chown -R akarin:akarin .ssh
```

### ssh config 設定
* ローカルからサーバへの接続を簡単にできるようにする

```config:ローカル(~/.ssh/config)
Host akarin
 HostName XXX.XXX.XXX.XXX
 Port XXX
 User akarin
```

```sh:ローカル
$ ssh akarin # でログインできるようになる
```

## ネットワーク周り

### ファイアーウォール

* 設定しておく。なんとなく。
* ここをほぼ丸コピ。ありがたい。
    * [madroom project: Ubuntuでファイアウォール設定メモ](http://madroom-project.blogspot.jp/2012/12/ubuntu.html "madroom project: Ubuntuでファイアウォール設定メモ")
    * ***sshd に設定したポートを開放するのをお忘れないように!!!***
        * 開放し忘れて ssh 接続できなくなっても焦らず慌てず落ち着いてブラウザから ubuntu ユーザでログインして開放すればおｋ

### あ、ping 通ってない

```sh:サーバ
akarin$ ping google.co.jp
ping: unknown host google.co.jp
```

### 外に出る
* ネットワークカード周りの設定は正常だった
* 名前解決がうまくいってないのが原因だった
    * google.co.jp はダメだけど、IP 直打ちだったらいけた
    * いつも忘れるけど、正引き/逆引き には `nslookup` な
* `sudo /etc/init.d/networking restart` したら `resolvconf: Error: /etc/resolv.conf isn't a symlink, not doing anything.` って言われた
    *   [12.04 - NetworkManager not populating resolv.conf - Ask Ubuntu](http://askubuntu.com/questions/137037/networkmanager-not-populating-resolv-conf "12.04 - NetworkManager not populating resolv.conf - Ask Ubuntu") によると、`sudo dpkg-reconfigure resolvconf` するといいらしい
    * 全部 OK して `sudo reboot` して戻ってきたら ping 通った！やったね！解決！
        * `sudo /etc/init.d/networking stop` して ssh 接続が切れても焦らず慌てず落ち着いてブラウザから ubuntu ユーザでログインして start すればおｋ

## おわり

```sh:
akarin$ sudo aptitude update
akarin$ sudo aptitude full-upgrade
```

した後に、好きなアプリケーションを入れていけば良いと思う！