OmniAICreator/Qiita-1.07M huggingface dataset:
自作アプリから標準のマップアプリに経路案内をさせる

自作の地図系アプリで，始点と終点を指定して経路案内をさせてみました．

```objectivec:foo.h
	CLLocationCoordinate2D toCoordinate;
	CLLocationCoordinate2D fromCoordinate;
```

それぞれ，始点と終点を格納しています．今回はアプリの都合でヘッダに記述していますが，局所変数でfoo.mの関数内に書いても問題ありません．

```objectivec:foo.m
	// 出発地のPlacemark作成
	MKPlacemark *fromPlacemark = [[MKPlacemark alloc]initWithCoordinate:fromCoordinate addressDictionary:nil];
	// 目的地のPlacemark作成
	MKPlacemark	*toPlacemark = [[MKPlacemark alloc]initWithCoordinate:toCoordinate addressDictionary:nil];

	// PlacemarkからMKMapItemを作成
	MKMapItem	*fromMapItem = [[MKMapItem alloc]initWithPlacemark:fromPlacemark];
	MKMapItem	*toMapItem = [[MKMapItem alloc]initWithPlacemark:toPlacemark];

	// 作成したMKMapItemをNSArrayに格納
	// こうしないとマップアプリに二地点の情報を渡せません
	NSArray		*aryMapItems = [[NSArray alloc]initWithObjects:fromMapItem, toMapItem, nil];

	// オプションの指定
	// 今回は徒歩で標準マップを指定します
	NSDictionary	*mapOptionDictionary = [[NSDictionary alloc]initWithObjectsAndKeys:
											MKLaunchOptionsDirectionsModeWalking, MKLaunchOptionsDirectionsModeKey,
											MKMapTypeStandard,MKLaunchOptionsMapTypeKey
											, nil];
	
	// この行が実行されるとマップアプリに値を渡して起動します．
	[MKMapItem openMapsWithItems:aryMapItems launchOptions:mapOptionDictionary];
```

思ったより簡単にマップを開けます．自分自身を経路制御アプリケーションにするのは，ちょっと敷居が高いので今度挑戦してみます．
rubyでプロセスをバックグラウンドで起動する



## プロセスを起動
```ruby:process.rb
pid = Process.spawn('top')

# pidを表示
puts pid
```

## プロセスをデタッチ
```ruby:process.rb
Process.detach pid
```

## バックグラウンドで起動したプロセスをkill
```ruby:process.rb
Process::kill(:INT, -pid)
```

## 注意
* ruby1.9以上のみです
* windowsは未確認
Ubuntu14.04でffmpegをPPAからインストール

ffmpeg、ビルドしたりするの面倒くさい。
PPAパッケージ公開されてるので簡単インストール。

```bash
$ sudo add-apt-repository 'deb http://ppa.launchpad.net/jon-severinsson/ffmpeg/ubuntu '"$(cat /etc/*-release | grep "DISTRIB_CODENAME=" | cut -d "=" -f2)"' main' && sudo apt-get update
```

「GPG鍵ない」と怒られる
```bash
W: GPG エラー: http://ppa.launchpad.net trusty Release: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 1DB8ADC1CFCA9579
```

なので鍵を追加してからインストール

```bash
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys  1DB8ADC1CFCA9579
$ sudo apt-get install ffmpeg
```

わーい

## 参考
http://ubuntuforums.org/showthread.php?t=2219550
http://askubuntu.com/questions/127326/how-to-fix-missing-gpg-keys
SQLのJOINみたいなことをプログラムで超簡単にやる方法

LINQ for C++ というライブラリーにjoinというメソッドがあります。

http://cpplinq.codeplex.com/

これを使うとSQLのJOINみたいなこと超簡単にできます。

やっつけで作ったサンプルですが、join_test.cppのmain()の中で使っています。

あと、このライブラリーはモダンな作りでヘッダー・オンリーなので使いやすいです。

```cpp:join_test.cpp
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <utility>
#include <cstdlib>
#include "cpplinq.hpp"

using namespace std;

struct test_data
{
    test_data() : string_code(), numeric_data()
    {}

    test_data(string string_code0, long numeric_data0) : string_code(string_code0), numeric_data(numeric_data0)
    {}

    string string_code;
    long numeric_data;
};

void read_file(vector<test_data>& input, const char *filename)
{
    ifstream in(filename);

    string line;
    while (getline(in, line)) {
        size_t pos = line.find('\t');
        if (pos != string::npos) {
            long numeric_data = atol(&line[pos] + 1);
            input.emplace_back(line.substr(0, pos), numeric_data);
        }
    }
}

int main()
{
    using namespace cpplinq;

    vector<test_data> input1, input2;

    read_file(input1, "input1.tsv");
    read_file(input2, "input2.tsv");

    auto query = from(input1)
        >> join (
            from(input2),
            [](test_data const& left) { return left.string_code; },
            [](test_data const& right) { return right.string_code; },
            [](test_data const& left, test_data const& right) { return make_pair(left.numeric_data, right.numeric_data); })
        >> to_vector()
        ;

    for (auto const& row : query) {
        cout << row.first << "\t" << row.second << endl;
    }

    return 0;
}
```

ビルド用のファイル

```text:Jamroot
import testing ;

run join_test.cpp
    :
    :
    : <toolset>gcc:<cxxflags>-std=gnu++0x <toolset>clang:<cxxflags>-std=c++11
    ;
```

テストデータ作成ツール

```py:gen_test_data.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import uuid
import random
from optparse import OptionParser

parser = OptionParser()
parser.add_option("-n", "--num", dest="num", default="100")
(options, args) = parser.parse_args()

data = [ (uuid.uuid4(), num) for num in range(0, int(options.num)) ]

random.shuffle(data)
with open('input1.tsv', 'wb') as f:
    for row in data:
        print >>f, "%s\t%d" % (row[0], row[1])

random.shuffle(data)
with open('input2.tsv', 'wb') as f:
    for row in data:
        print >>f, "%s\t%d" % (row[0], row[1])
```

使い方の例

```bash
./gen_test_data.py --num=100
time bjam variant=release -a
```

同じようなライブラリーで、Ovenというのを使ってもできそうな気がしますが、こちらは試してないです。
[プログラミング作法]マルコフ連鎖アルゴリズムをrubyで実装してみた

最近「プログラミング作法」という本を読んでいます。基本C言語ベースで話が進んでいくんですが、アルゴリズム自体は言語問わず勉強になると思いましたので、rubyで「マルコフ連鎖アルゴリズム」を実装してみました。きっともっといいアルゴリズムがあるはずなので、教えてください(他力本願)

```rb:markov.rb
# 番兵(NONWORD)を定義
NONWORD = "\n"

# 標準入力から文章を取得。先頭と末尾に番兵を配置し
# 後処理を単純化
text = [NONWORD, NONWORD] +  STDIN.read.split + [NONWORD]

# == 入力フェーズ
# プレフィクスをキーとし、サフィックスをバリューとするハッシュ配列を作成
# text内の連続する2ワードがプレフィックス。それに続く1ワードがサフィックス
# となるのでtextを3つずつに分割してeachで回す。
h = {}
text.each_cons(3).each do |pre_suf|
  suffix = pre_suf.pop
  prefix = pre_suf
  h[prefix] ||= []
  h[prefix] << suffix
end

# == 出力フェーズ
# 初期値をNONWORDに設定し、それをキーとしてランダムにサフィックスを表示する。
# プレフィクスの先頭を削除、表示したサフィックスを末尾に追加、次のキーとする。
# 上記をサフィックスにNONWORDがくるまで繰り返す。
prefix = [NONWORD, NONWORD]
loop do
  break if h[prefix].last == NONWORD

  suffix = h[prefix][rand(h[prefix].size)]

  print("#{suffix} ")

  prefix.delete_at(0)
  prefix << suffix
end
puts
```

### 追記
入力フェーズでサフィックスを`+=`を使って代入していましたが、`<<`を使うことで高速化することができたので、修正しました。
本書記載のperlスクリプトとの速度比較で約8倍の差があったので、何かおかしいんだろうと思い調べていたところ、[こちらの記事](http://d.hatena.ne.jp/suer/20100508/string_concat)を見つけました。`+=`は内部処理の関係で配列のインスタンスを再生成するようです。`<<`に変更したところ、perlスクリプトと同等の速度になりました。
configファイル(typesafe config)

# typesafe config
とあるものを作った時に設定ファイルが欲しくなり、
検索してみるとtypesafe configなるものを見つけました。
playframework でも利用されているようです。

# 使い方
使い方は
[typsafe config](https://github.com/typesafehub/config)
の通りです。
簡単に書くと
sbtファイルに以下の記述を追加して

```built.sbt
libraryDependencies ++= Seq(
  "com.typesafe" % "config" % "1.2.1"
)
```
※↑2014/05/06現在の設定

```scala:main.scala
  val config = ConfigFactory.load() // デフォルトで application.conf が読まれる
  val file = config.getString("hoge") // 設定値「hoge」を読み込む
```

という具合で使います。

## jarファイル化し、外部ファイルを読み込みたい場合

```java
java -jar -Dconfig.file=xxxx.conf XXXXX.jar
```

としてやれば指定したファイルを読み込んでくれます。

※ 外部ファイル読み込みは他にもload時に設定してやる方法もあるようです。
次のバージョンの JavaScript を待つ必要はないのです

# Classes (クラスの利用)
http://www.typescriptlang.org/Handbook#classes

Traditional JavaScript focuses on functions and prototype-based inheritance as the basic means of building up reusable components, but this may feel a bit awkward to programmers more comfortable with an object-oriented approach, where classes inherit functionality and objects are built from these classes. Starting with ECMAScript 6, the next version of JavaScript, JavaScript programmers will be able to build their applications using this object-oriented class-based approach. In TypeScript, we allow developers to use these techniques now, and compile them down to JavaScript that works across all major browsers and platforms, without having to wait for the next version of JavaScript.

伝統的な JavaScript は再利用可能なコンポーネントを構築するための手段として関数とプロトタイプベースの継承にフォーカスしていますが、このことについてプログラマーたちは、不便さ(扱いにくさ)を感じていて、クラスが機能を継承したりクラスからオブジェクトが構築されるようなオブジェクト指向のアプローチに快適さを感じています。ECMAScript 6 (JavaScript の次のバージョン) から JavaScript プログラマーたちは、オブジェクト指向のクラスベースのアプローチを用いてアプリケーションを構築できることになるでしょう。TypeScript では、開発者たちがこれらの技法を今使えるようにします。そしてクラスベースのオブジェクトたちをメジャーなブラウザーやプラットフォームで動作可能なJavaScript にコンパイルして変換する(落としこむ)のです。次のバージョンの JavaScript を待つ必要はないのです。

## 参考
* [JavaScriptのクラス定義を簡単にする](http://qiita.com/akmiyoshi/items/5fde6be4a9191221eaea)
* [CoffeeScript と TypeScript の開発環境](http://qiita.com/akmiyoshi/items/6b8cd9680d611cde6251)
* [TypeScript Language Specification Version 1.0 (April, 2014)](http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf)
NSLog chars の Basic Data Types の表


| Type | NSLog chars |
|:-----------|:------------|
| Char | %c |
| Short int | %hi, %hx, %ho|
| unsigned short int | %hu, %hx, %ho |
| int | %i, %x, %o |
| unsigned int | %u, %x, %o |
| long int | %li, %lx, %lo |
| unsigned long int | %lu, %lx, %lo |
| long long int | %lli, %llx, %llo |
| unsigned long long int | %llu, %llx, %llo |
| float | %f, %e, %g, %a |
| double | %f, %e, %g, %a |
| long double | %Lf, %Le, %Lg |
| id | %p |

> Programming in Objective-C を参考にメモ
Windows Update によって自動的に再起動する問題

#自動的に再起動する
スリープ状態にしていても自動で再起動してしまうので非常に厄介。

#対処法
スタートボタン → コントロールパネル → Windows Update → 設定の変更
更新プログラムをダウンロードするが、インストールを行うかどうかは選択する

#参考
http://ch.nicovideo.jp/hkn/blomaga/ar260192
はじめての ConTeXt

>「[ConTeXt について記述し始めてみる](http://qiita.com/kuroky_plus/items/c22f5b7e88cabd0faf2f)」に続く一連のポストです．

# 環境構築方法

日本語組版の実験が始まった以降の新しめの ConTeXt（MkIV）を使いたいとき，どんな準備が必要だろうか？　もし読者がTeX Live 2013以降や，W32TeXで`context.tar.xz` をインストールしているならば，ほとんどの場合すでにインストールされている．

コマンドラインから `context --help` と打ってみよう．`ConTeXt Process Management` などで始まり，`wiki     : http://contextgarden.net` のような情報で終われば，特に追加でインストールせずとも ConTeXt MkIV は使えるはずである．

もしもインストールできていなければ，ConTeXt は単独で動く小さな配布物があるので，[ConTeXt Standalone](http://wiki.contextgarden.net/ConTeXt_Standalone) を参考にインストールすれば，既存の TeX 環境とは独立にも運用できる．

# とにかく試してみる

```tex:test.tex
\starttext
Foo bar.
\stoptext
```

といったファイルを作って，`context test.tex` としてみよう．できあがった `test.pdf` において，ページ上部中央にページ番号の 1，本文の位置に Foo bar. と印字されていれば成功である．
Railsで404/500エラーの処理

# Railsで404/500エラーの処理をする
## application_controllerを編集

```rb:app/controllers/application_controller.rb
# 例外処理
rescue_from ActiveRecord::RecordNotFound, with: :render_404
rescue_from ActionController::RoutingError, with: :render_404
rescue_from Exception, with: :render_500

def render_404
  render template: 'errors/error_404', status: 404, layout: 'application', content_type: 'text/html'
end

def render_500
  render template: 'errors/error_500', status: 500, layout: 'application', content_type: 'text/html'
end
```

## エラーページのviewファイルを作成
### 動的にページを表示する場合
`app/views/errors/error_404.html.erb`と`app/views/errors/error_500.html.erb`を作成する。
(静的ページを表示する場合は、`public`配下に作成)


## ルートファイルを編集
`config/routes.rb`の一番下に以下を書く。

```rb:config/routes.rb
get '*path', controller: 'application', action: 'render_404'
```


## ローカル環境でエラー処理の動作確認をする場合
development環境でエラーページの動作を確認する場合は、`config/environments/development.rb`を以下のように`false`にする。

```rb:config/environments/development.rb
config.consider_all_requests_local       = false
```
[PHP]正規表現のメモ

・スラッシュ(/)で囲む理由
　そういう決まりだから？
　http://jp2.php.net/manual/ja/regexp.reference.delimiters.php

・プラスかマイナスで文字列を区切りたい場合
　\$split = preg_split("/[\+\-]/", $string);

追記
　これ
　\$split = preg_split("/[\+\-]/", $string);
　は

　こうでした。
　\$pattern = preg_split("/[\\+\\-]/", $ary[1]);
for文でのパターンマッチ

これできるかなぁと思って書いたら出来たのでびっくり

```coffeescript
ary = [[1, 2], [3, 4], [5, 6]]
for [a, b] in ary
  console.log a + b

ary2 = [
  {x: 1, y: 2}, {x: 3, y: 4}, {x: 5, y: 6}
]
for {x, y} in ary2
  console.log x + y

obj = {
  a: [1, 2], b: [3, 4], c: [5, 6]
}
for _, [a, b] of obj
  console.log a + b
```
Android Studioへの乗り換え備忘録(参考にしたページ一覧)

Eclipse + ADTからAndroid Studioに乗り換える準備を始めた。
Android Studioの使い方を学ぶにあたって役に立った資料の一覧と補足を備忘録として記録しておく。

# インストール

dmgからのコピー程度なので、公式のダウンロードページ見ればわかる。

http://developer.android.com/sdk/installing/studio.html

# Android Studioを理解する
## Gradleとは

**今まで、継続的インテグレーションとかテスト自動化とかで`Ant`の設定をいじったり、外部ライブラリなどの管理で`Maven`を使っていなかった人には、ピンとこないし最初から意識しなくても問題ない**かもしれないけど、`Android Studio`では`Gradle`という新しいビルドツールが使われている。

> Android Studioが標準対応しているGradleは、Androidアプリ向けのビルドツールとしてAntやMavenより柔軟で使いやすいので良いよ！！

[僕がEclipseをやめてAndroid Studioを使っている10の理由](http://blog.nkzn.info/entry/2014/03/21/015914)

## Gradleを使って外部ライブラリをインクルード

Gradleのメリットは、外部ライブラリを使うときに実感できる。

例えば、ネットワーク通信用のライブラリの[Volley]()を使う場合、`app/build.gradle`(build.gradleは2つあるので注意!)に

```
// /app/build.gradle
// ...
dependencies {
  // ...
  compile 'com.mcxiaoke.volley:library:1.0.+'
}
```

みたいに書くだけで、自動的に必要な(最新の)ライブラリをダウンロードしてきてビルドしてくれる。パッケージ管理(`Ruby`でいうところの`Bundler`みたいな)をやってくれるので、プロジェクトの設定・レポジトリがすっきり。

[Android: Getting Started with Volley](http://blog.chrisblunt.com/android-getting-started-with-volley/)

# Android Studioの機能
## キーバインド

Eclipseとはキーバインドが全然違うので、まずこの対応表を見て重要なショートカットを押さえておくべき。

[Android StudioでEclipseのアレをやるには？](http://d.hatena.ne.jp/esmasui/20130607/1370621300)

### 参考:ここに載っていないショートカットで、個人的によく使うもの

| Eclipse         | Android Studio            |備考|
|:----------------|:--------------------------|:--|
| Cmd + Shift + R | Cmd + O / Cmd + Shift + O |すばやく開く、的なやつ|
| Cmd + D | Cmd + Backspace | 行削除 |

設定画面からキーバインドを好みにあわせて変更してしまうのもアリ。特にiOSの開発もする人は`Xcode`ともある程度共通化させておくと快適かも。

## 各機能

自動補完の挙動やGetter/Setterの自動生成など、各部分の機能はEclipseをはじめ多くのIDEに似つつも微妙に違ったりするけど、こればかりは一つ一つ見ていくしかない。ローンチ時に表示されるTipsに結構よく使う機能は説明されてるので、Tipsは活用したほうがいい。

ほかに、独自にTipsをまとめられている下記のページも参考になる。

> Ctrl+Oでベースクラスの関数一覧が出るのでOverrideするのが簡単。Ctrl+IでInterfaceの実装も可。
> Ctrl+Shift+Spaceで現状の文脈にあった補完

[Android Studio – 0.1 Tipsをまとめる 1～20](http://sceneryandfish.withnotes.net/?p=1375)
[Android Studio – 0.1 Tipsをまとめる 21～40](http://sceneryandfish.withnotes.net/?p=1380)
[Android Studio – 0.1 Tipsをまとめる 41～50](http://sceneryandfish.withnotes.net/?p=1389)

# Android Studioを使ってみる
## 新規プロジェクト作成

Eclipseで作った既存のプロジェクトのインポートだと何かと小さな壁が増えるので、新規プロジェクト作成で慣れていった方がいい。

Android Studioを使ってプロジェクトを作る記事はいろいろあるけど、mixiがgithubで公開してるのが最低限の内容を丁寧に説明してて、良い感じ。

[1.03. Androidプロジェクトの作成 ( Android Studio ) ](https://github.com/mixi-inc/AndroidTraining/wiki/1.03.-Androidプロジェクトの作成-(-Android-Studio-))

## 既存プロジェクトのインポート

慣れたら既存プロジェクトのインポート。
ただ、基本的にはウィザードの内容に従う + 移行時に発生する問題はプロジェクト毎にケースバイケースなので、特別参考になるような記事はなし。

# 最後に

当たり前な結論だけど

1. まずキーバインドをしっかり覚える(必要に応じてカスタマイズする)
2. Tipsしっかり読んで便利な機能把握する
3. Gradleでパッケージ管理とかしてみて、便利さを実感する
4. 既存のプロジェクトを移行してく

みたいな手順を踏んで移行していけばいいと思う。
cPickle, gzipによるシリアライズ


[個人メモ] 定形だがたまに忘れるのでメモ．

```python:dump.py 
import gzip
import cPickle

obj = 1

with gzip.open('test.pkl.gz', 'wb') as gf:
    cPickle.dump(obj, gf, cPickle.HIGHEST_PROTOCOL)
```

```python:load.py
with gzip.open('test.pkl.gz', 'rb') as gf:
   x = cPickle.load(gf)
```
あまり誰も教えてくれないネタjavascript小話

* スコープの話を見てたら思い出したので話の小ネタに。
* javascriptをそこまで熟知していない人に話すと結構驚かれる話。
* ついでにプラスアルファ。
* こういうときにどういうタイトルをつけるのがベストなのか分からない。


* **05/06追記：undefinedの項に訂正があります**

# グローバルスコープってwindowのことだよ

* 多分ブラウザ上で動くjavascriptに限った話だとは思いますが。
* nodeとかだとどうなるんでしょうか。
* グローバルスコープやグローバル変数という言葉の正しさは、分かりやすさを優先するためスルーしてます。

## だからvarがあっても関数の中からグローバル変数を使えるよ

```js
var a = 1;
function hoge(){
  var a = 2;
  alert(a); // 2
  alert(window.a); // 1
}
hoge();
```

## そのalertもwindowのものだから

* いわゆるグローバル関数と呼ばれているものはwindow.をつけても呼び出せます。

```js
window.alert(1);// 1
```

ということはつまり、

## window.は省略できるよ

* さっきの逆バージョン

```js
//window.open(url);
open(url);

//window.setTimeout(fn,100);
setTimeout(fn,100);

```

* `alert`を`window.alert`、`window.open`を`open`と説明しているサイトや書籍には遭遇したことが無いんですが、付ける付けないの基準は何なんでしょうね。

## グローバルスコープって言うか、windowオブジェクトスコープなのです

* ほら、javascriptって一応オブジェクト指向ですから。
 
```js
this.a = 100;
alert(a); // 100
alert(window.a); //100

```

* オブジェクトに紐づいていない関数呼び出しのthisはwindowです。
* **追記：thisがwindowなのは、`"use strict"`ではない場合のみ。** 
**`"use strict"`の場合はundefined**
* 追記参考：[JavaScriptの関数の基本事項をまとめる会（のコメント）](http://qiita.com/Imamotty/items/711e77140814404c802d#comment-d8819e760eed4366dd58)

```js
var c = 100;
var a = {
  b: function(){ alert(this.c) },
  c: 200
}
a.b(); // 200
d = a.b;
d(); // 100

```

* 説明

```js
d = a.b; //ここがつまり、window.d = a.b;
d(); // そして、window.d() なので、alert(window.c);となり、 var c = 100 が window.c = 100を意味する。
```

# alertはalertできるよ

* だいたい **「何言ってんだコイツ」** と言う顔で見られます。

## やったこと無い人はやってみよう

```js
alert(alert); // どうなるかはみんなでやってみよう
```

* そもそもjavascriptにおいては、関数も変数なのでこういうことができるわけです。
* 変数と言うことは、つまり・・・

## alertは代入できるよ

```js
hoge = alert;
hoge("ほげー");
```

## alertの書き換えも出来るよ

```js
alert = 100;
console.log(alert); // 100
```

* 元々のalertが使えなくなるからやっちゃ駄目だよ。

```js
alert = confirm;
alert("もう何がなんだか");
```

* こんなことも出来るよ。メリットは無いけど。

# ~~undefinedは変数~~ （追記）変数だった頃がありました

* ~~これは結構有名だと思うんですが。~~
* **追記：undefinedが変数だったのは昔の話で、今は定数なので書き換えできません。下記の内容は全部消しても問題ない内容に成り下がったのですが、自分への戒めのために残してあります。**

## 書き換え可能

```js
var a;
console.log(a == undefined); // true
undefined = 100;
console.log(a == undefined); // false
```

* ~~いつから定数だと錯覚していた？~~
* 今日まで定数じゃないと錯覚していました。

## 信頼できるundefinedを作る

* 普通undefinedをvarで定義する人はいません。
* ということは、グローバル変数と同じなのだから、どこかで書き換えれば全てのソースで影響が出ることも考えられます。
* なので、信頼できるundefinedを作り自分のライブラリ内だけでも保護するわけです。

```js
undefined = "hoge";
(function(undefined){
  var a;
  console.log(undefined == "hoge"); // false
  console.log(a == undefined);  // true
})();
```
* 渡されていない関数の引数はundefinedになることを利用しています。
* jqueryでも使われています。
* って書こうとしたら、1.11以降書き方が変わっていた・・・。1.11未満を見てね。

## undefinedを意味する値もundefined

* ややこしい。

```js
var a;
console.log(typeof a); // "undefined"
```

* 1.11以降のjqueryではこの方式によるunedefinedチェックに変わったようです。

# まとめ

* グローバルスコープの正体、関数も変数である証拠、undefinedをいちいち再定義する理由。その全てを説明しているサイトにはなかなか遭遇したことが無いので書いてみました。jqueryは使えるけど素のjavascriptはいまいち分からないんだよなーという方々を対象に説明したものを少し焼きなおしたものになりますが、何か一つでも「知らなかった」ことがあると幸いです。個人的にはalertをalert出来たことで、javascriptにおける関数の扱いへの理解が深まりました。どれも直接的には役に立たない話かもしれませんが、javascriptの仕様の理解への手助けにはなるのではないでしょうか。なればいいなぁ。
FossilからGitにExportしてGitHubにpushする

# 概要

[Fossil](https://www.fossil-scm.org/index.html/doc/tip/www/index.wiki) のデフォルトブランチ名は master じゃなくて trunk だから注意しましょう。

# 実際の流れ

## fossil からエクスポート & git へのインポート

```bash
git init new-repo
cd new-repo
fossil export --git ../repo.fossil | git fast-import
```

新しい git リポジトリを作成し、その中に入り、fossil のリポジトリを指定して情報を移行する。

![PrtScrn.png](https://qiita-image-store.s3.amazonaws.com/0/35880/067931a4-1d41-f04e-84a1-8741a9a0ee01.png)

成功するとこういう上記のようなログが出る。

ここまでは [fossil の公式 Wiki](https://www.fossil-scm.org/index.html/doc/tip/www/inout.wiki)に記されている通り。

## 結果を確認

しかし、ここで履歴が移行されたか確かめるために `git log` しても、`fatal: bad default revision 'HEAD'`というエラーが出るのではないだろうか。

git ではデフォルトのブランチが master なのに対して、fossil では trunk になっているためだ。

`git checkout trunk` することでブランチを移行でき、`git log` の結果も正しく表示されるだろう。

## GitHub へ push

GitHub側では[GitHubのヘルプ](https://help.github.com/articles/create-a-repo)を参考にして先にリポジトリを作る。

そして、`Step 3: Push your commit` のステップで `git remote add origin https://github.com/[ユーザ名]/[リポジトリ名].git` した次は、先ほどと同じくローカルのブランチについて master ではなく trunk を指定する必要がある。

```bash
git push origin trunk
```

さもないと、認証の後、

```bash
error: src refspec master does not match any.
error: failed to push some refs to 'https://github.com/[ユーザ名]/[リポジトリ名].git'
```

といったエラーに見舞われるだろう。
お手軽URL偽装

表面上は正規のURLを見せておいて実際にリンクを踏むと別のところに飛ばすのってどうやってやるのかなと思って実装してみたら案外あっさりできた。

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>URL偽装</title>
  </head>
  <body>
    <a href="https://www.google.co.jp/" data-real-url="http://www.yahoo.co.jp/">https://www.google.co.jp/</a>

    <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.0.min.js"></script>
    <script type="text/javascript">
      $(function () {
        $('a').click(function() {
          location.href = $(this).data('real-url');
          return false;
        });
      });
    </script>
  </body>
</html>
```

やってることはaタグがクリックされたらlocation.hrefをdata-real-url属性の値に設定しているだけだ。これでステータスバーも偽装されたリンクができた。

僕みたいにリンクにポインタを合わせてステータスバーで飛ぶ先を確認している人は気をつけたほうがいいかもしれない。
バックアップしておいた Kobito.db からアイテムをリストアする


v1.8.7 のバックアップファイルを v1.8.10 に戻した時の memo.

```
% rm ~/Library/Kobito/*
% cp ~/Dropbox/Setup/kobitoDB/Kobito.db ~/Library/Kobito/
```

v1.8.7 当時に存在していたファイルは、Kobito.db と .bak ファイルのみでした。

現在バージョンにある以下のファイルは、アプリ起動時に生成されたよう。

* Kobito.db-wal
* Kobito.db-shm

この環境下では戻りましたという実例として。


## 参考

> * [Dropboxを使用した複数端末でのKobito同期 - Qiita](http://qiita.com/yamakuda/items/5fdd269af54f83c6c64e)
> * [kobito.appのデータを複数のMacで共有する - yasuoza diary](http://blog.yasuoza.com/2012/07/05/share-kobito-app-data/)
[状態マシン図] UML2.0 仕様の細かな注意点 

状態マシン図を勉強している中級者以上向けに、細かな注意点をいくつか説明しておこう。

(1) 領域は名前空間を継承している。
直交状態で、互いに直交している領域に、同じ名前の状態があっても良いことになっている。それは領域に名前をつけて区別できるからである。

上位状態の名前：領域の名前：領域内の下位状態の名前、というふうに名前空間がつくので、「領域内の下位状態の名前」が互いに同じでも良い。
領域に名前をつける工夫をすることで、凝集度が高いモデルが作れる可能性がある。astah*は、領域に名前が付けられなくて、ちょっと残念。

フルパスの名前空間は読むと長いので、レビューしやくするためには、
やはり、上位下位を含めすべての状態に別の名前をつけるのがおススメ。

![01_region_inherites_namespace.png](https://qiita-image-store.s3.amazonaws.com/0/11188/72496257-30e5-278d-c442-62a3f5b0ea46.png)


(2) 内部遷移は、状態が保有するのではなく、領域が保有する。astah*では、内部遷移は、状態が保有している。UML2.0仕様では、状態が保有する遷移は存在せず、領域が保有する遷移しか存在しない。

つまり、内部遷移は、状態が保有する領域が遷移を保有するしかない。
このように決まってはいるが、実用上は、状態が保有していれば十分なので、この点は、ツールの実装仕様で良い。

![02_internal_transition.png](https://qiita-image-store.s3.amazonaws.com/0/11188/8e448262-0013-ed36-5a6f-33f25fa03fe4.png)


内部遷移は遷移の仲間ではあるが、sourceやtargetとする節点はどこかなど、気にしてはいけない。領域は節点ではない。

また、状態が保有する遅延トリガは、ツールでサポートされておらず、扱いが難しいので、遅延トリガは使わずに分析、設計する。

(3) 遷移１本に、トリガは複数設定できる。

astah*では、遷移１本にトリガは0個か1個であって、2個以上は設定できないことになっている。これはこのほうがシンプルで統一的でわかりやすい。この点も、ツールの実装仕様で良い。

たとえ、UMLでできるからと言って、１本の遷移に２つ以上のトリガを設定しないこと。

![03_transition_has_many_triggers.png](https://qiita-image-store.s3.amazonaws.com/0/11188/85cb3703-b8aa-6e3c-3190-b48912d867df.png)


(4) 最終状態は、疑似状態の仲間ではなく、状態を継承している。

図を描画しているときは、疑似状態か状態かあまり意識しないが、実際の動きとしては、最終状態は状態の仲間であり、
・最終状態を起点とする遷移を持てない。
・入場時アクションなどを持てない。
など多くの制約付きの状態であるが、状態のサブ状態にある最終状態であれば、イベントを受け取れるし、タイムアウトもできることを知っておく。

![04_final_state.png](https://qiita-image-store.s3.amazonaws.com/0/11188/35d11b51-b28d-552f-6bc3-95156f6b6be3.png)


(5) 遷移は名前空間を継承している。

コード生成するときは、もちろん遷移１本ずつ違う名前が必要。
これは分析モデル作成時には不要なので気にしないで良い。

![05_transition_inherits_namespace.png](https://qiita-image-store.s3.amazonaws.com/0/11188/e871af62-fb9c-dd27-dfcb-5e3d105c9774.png)


(6) ジャンクション疑似状態も、選択疑似状態も、
２つ以上の入力、２つ以上の出力を同時に持てる

![06_junction_choice.png](https://qiita-image-store.s3.amazonaws.com/0/11188/44891711-6e6c-8629-7f42-2c55a244c1aa.png)


UML仕様上は、ジャンクション疑似状態、選択疑似状態ともに、複数入力、複数出力できるので、以下のような状態マシン図も描ける。しかしこれはとてもわかりにくいので避ける。

たとえUMLでできるからといってやらないこと。状態マシン図はフローチャートではない。

ジャンクション疑似状態は、１出力のみ、
選択疑似状態は、１入力、２出力のみ。２出力の片方は必ず[else]、という規約をチームで決めておこう。

![071_junction_choice.png](https://qiita-image-store.s3.amazonaws.com/0/11188/91e36cab-c66a-7aa7-9fc0-eae40d0cf80b.png)


上のジャンクション疑似状態は、以下のモデルと同等の振る舞いをする。

![072_junction_choice.png](https://qiita-image-store.s3.amazonaws.com/0/11188/d7167ecf-9b0c-3827-a7ad-cba135300c6b.png)


上の選択疑似状態は、以下のモデルと同等の振る舞いをする。状態を起点とする完了遷移（明示的なイベントが設定されていない遷移）はただちに発火する。

![073_junction_choice.png](https://qiita-image-store.s3.amazonaws.com/0/11188/1b37fac3-e377-b466-cbda-520138489d97.png)


モデルはわかりやすく描こう。

参考リンク

1. UML2.4.1仕様<br>http://www.omg.org/spec/UML/2.4.1/
1. [状態マシン図] UML2.0 状態機械 モデル<br>http://saltheads.blog134.fc2.com/blog-entry-138.html
ConTeXt について記述し始めてみる

TeX（テック）は，マクロによっていろいろに拡張できることで知られている．真に素の TeX 用にソースを記述する人はなかなかおらず，少なくとも Knuth 自身が執筆するために作成した最低限のマクロ，plain TeX（プレインテック）マクロは使っているだろう．もちろん，それよりも普及しているのはLaTeX（ラテック）マクロである．LaTeX になれば，マークアップ言語と呼んでもよい状態になる．`\section` などの命令を用いて，文書中の構造を体裁とは独立に指定できるからである．

ここ最近になって，LaTeX とは独立なマークアップマクロである，ConTeXt（コンテクスト）マクロが，ヨーロッパを中心に開発・利用され始めている．開発は Hans Hagen（ハンス・ハーゲン）が一人で行っていると思って差し支えない．ConTeXt ユーザグループやメーリングリスト，年に一度の集会 ConTeXt meeting があり，周りでサポートする体制は整っている．

LaTeX ではマクロをいろいろな人が独立に開発して発展してきたという事情から，パッケージの読込み順番によって正常に機能する場合とそうでない場合があるといった問題をはらんでいることは有名で（たとえば [mr_konn さんの今日の記事](http://qiita.com/mr_konn/items/822112fa5aa2a71a36de)），それを解決するために，現代的に必要な機能を一人ですべて実装した，というのが当初のふれこみであった（と理解している）．

Hans はオランダ人であり，元はオランダ語を扱うために作り始めたということだが，最近では多言語を統一的に扱って，各言語のルールなどを内部で実装している．言語と言えば英語のことしか知らない人たちが作ったシステムでは小手先の改良しか施せないので，根本から多言語に対応しなければならないという信念のようである．フォントプロジェクトとしてポーランドを中心に開発が進む TeX Gyre の要求をすぐに取り込むなど，一人で開発していることによる機動力が利点である．ConTeXt プロジェクトへの貢献方法としては，いきなりパッチやプログラムを頑張って作って送ることよりも，「要求」をまずは自然言語で説明することが歓迎されている．

以前のバージョンは MkII（Mark II, マークツー）と呼ばれており，e-拡張のあるTeX拡張エンジンであればどんなエンジンでも内部処理に使えた．ただし，日本語組版に関しては「使えた」といった状態であり，動作確認程度にしか使われていなかったのではないかと思われる．開発の中心は MkIV（Mark IV, マークフォー）に移っており，エンジンは LuaTeX（ルアテック）を用い，マクロのほとんどは Lua 言語で記述するという方針で進んでいる．日本語に関してもいくつかのルールを2012年に実装してもらったのだが，まだまだ発展途上である．[Requirements for Japanese Text Layout](http://www.w3.org/TR/2012/NOTE-jlreq-20120403/)（以下，jlreq）の存在は伝えてあるが，いきなりすべてを実装するように要請するのは酷だというのも理解できるので，jlreq の入力例をテキストファイルで提供して trial and error を促すなど，日本語利用者が努力して貢献できることもまだまだたくさんある．

今後投稿を予定している一連の記事では，ConTeXt の使い方や，これから実装を促したい事柄について紹介していければ幸いである．
SpriteKit入門 -12-


今回はcolorBlendFactorを見ていきます。
いつものようにSpriteを表示します。

```objectivec:HelloScene.m
- (void)createSceneContents
{
    SKSpriteNode *spaceship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship.png"];
	spaceship.name = @"spaceship";
    spaceship.position = CGPointMake(300,600);
    [self addChild:spaceship];
}
```

![spritekit_12_01.png](https://qiita-image-store.s3.amazonaws.com/0/30731/476683cd-7837-ecd8-eb88-84ffc03cb054.png "spritekit_12_01.png")

タップしたときに、Spriteを赤くします。

```objectivec:HelloScene.m
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
	SKNode *spaceship = [self childNodeWithName:@"spaceship"];
	if (spaceship != nil) {
		SKAction *pulseRed = [SKAction sequence:@[[SKAction colorizeWithColor:[SKColor redColor] colorBlendFactor:1.0 duration:0.15],
												  [SKAction waitForDuration:0.1],
												  [SKAction colorizeWithColorBlendFactor:0.0 duration:0.15]]];
		[spaceship runAction:pulseRed];
	}
}
```

![spritekit_12_02.png](https://qiita-image-store.s3.amazonaws.com/0/30731/87f722b4-a423-79fd-22b9-b204c0febfe0.png "spritekit_12_02.png")

今回はここまで。
SpriteKit入門 -11-


今回はUIで使えそうなSpriteの使い方です。
このようなテクスチャを用意します。（普通はもっとセンスのある画像になります）

![stretchable_button.png](https://qiita-image-store.s3.amazonaws.com/0/30731/3a3e6415-8239-c8cc-a037-da7d161133bc.png "stretchable_button.png")

単に、拡大すると形が歪んでしまいます。

```objectivec:HelloScene.m
- (void)createSceneContents
{
	SKSpriteNode *button = [SKSpriteNode spriteNodeWithImageNamed:@"stretchable_button.png"];
	button.position = CGPointMake(300, 600);
	button.xScale = 10.0;
	button.yScale = 2.0;
	[self addChild:button];
}
```

![spritekit_11_01.png](https://qiita-image-store.s3.amazonaws.com/0/30731/05fecc12-1a30-e4fa-fa69-d3833f018fab.png "spritekit_11_01.png")

拡大する領域をcenterRectで指定すると、中心あたりだけ拡大されていい感じになります。

```objectivec:centerRect指定
- (void)createSceneContents
{
	SKSpriteNode *button = [SKSpriteNode spriteNodeWithImageNamed:@"stretchable_button.png"];
	button.position = CGPointMake(300, 600);
	button.centerRect = CGRectMake(14.0/32.0, 14.0/32.0, 4.0/32.0, 4.0/32.0);
	button.xScale = 10.0;
	button.yScale = 2.0;
	[self addChild:button];
}
```

![spritekit_11_02.png](https://qiita-image-store.s3.amazonaws.com/0/30731/9637246b-9ccb-a04e-f7fc-ed9a0249774a.png "spritekit_11_02.png")


今回はここまで。
SpriteKit入門 -10-


テクスチャは、デフォルトではSpriteの中心に合わさるようになっています。

```objectivec:HelloScene.m
- (void)createSceneContents
{
    SKSpriteNode *spaceship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship.png"];
    spaceship.position = CGPointMake(300,600);
    [self addChild:spaceship];
}
```

![spritekit_10_01.png](https://qiita-image-store.s3.amazonaws.com/0/30731/02d27cff-362a-4c3d-4917-b110a4034d7c.png "spritekit_10_01.png")

anchorPointを設定することにより、テクスチャの基準点を変更できます。

```objectivec:anchorPoint指定
- (void)createSceneContents
{
    SKSpriteNode *spaceship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship.png"];
    spaceship.position = CGPointMake(300,600);
	spaceship.anchorPoint = CGPointMake(0.5, 1.0);
    [self addChild:spaceship];
}
```

![spritekit_10_02.png](https://qiita-image-store.s3.amazonaws.com/0/30731/b776d2db-5e3d-eb2f-bbb1-cf7dc4b737b6.png "spritekit_10_02.png")

xScaleやyScaleで拡大するとanchorPointを中心として拡大されていることが分かります。

```objectivec:yScale指定
- (void)createSceneContents
{
    SKSpriteNode *spaceship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship.png"];
    spaceship.position = CGPointMake(300,600);
	spaceship.anchorPoint = CGPointMake(0.5, 1.0);
	spaceship.yScale = 2.0;
    [self addChild:spaceship];
}
```

![spritekit_10_03.png](https://qiita-image-store.s3.amazonaws.com/0/30731/64e862a7-e24c-481f-2a76-29698375a6e4.png "spritekit_10_03.png")

今回はここまで。
Typesafe ActivatorでPlay framework 2実行環境を整える

# はじめに

Windows 7をインストールし直したので、新しくPlay2環境を作ろうと思ったところTypesafe Activatorというものが出てました。
Play Framework、Akka、Scalaが含まれたプラットフォームで、アプリケーションのチュートリアルなどのテンプレートが用意されています。

## 環境
- Windows 7 Professional 64bit
- JDK 1.7.0 25
- Typesafe Activator 1.1.2
- Play Framework 2.2.3

# 作業

### Step 1

[Play 公式サイト](http://www.playframework-ja.org/download)からTypesafe Activatorをダウンロードして、適当なフォルダに展開します。

### Step 2

展開されたフォルダの中の`activator.bat`を実行します。コマンドプロンプトが立ち上がり、Playアプリケーションが起動します。

![activator bat.JPG](https://qiita-image-store.s3.amazonaws.com/0/43208/8ef2b9a6-a1d6-73e4-728e-39f8bdd8c852.jpeg)

そのうち勝手にブラウザが立ち上がりActivatorのスタート画面が表示されます。

![activator launch.JPG](https://qiita-image-store.s3.amazonaws.com/0/43208/e7a1547d-0e1d-1c16-842a-c921d06e3c37.jpeg)

### Step 3

左側のテンプレート選択画面で、チュートリアルの`Hello Play Framework`を選択します。
フォルダを選択できるので、適当なフォルダを選びます。

`Create`ボタンをクリックすると、プロジェクトの作成が開始されます。
結構時間かかります。

作成が終わると、「Your application is ready」という画面が表示されます。

![activator app is ready.JPG](https://qiita-image-store.s3.amazonaws.com/0/43208/e2d1c528-80b0-ccd9-7dbb-2ac5cdc9c4a5.jpeg)

### Step 4

コードの編集やコンパイル、テストもActivator内でできてしまいますが、今回はとりあえず確認だけしてみます。

左のメニューの`Run`をクリックすると既に起動されている状態になっていて、`Open the app: http://localhost:9000`とURLが表示されています。
URLをクリックするとアプリケーションを確認できます。

![hello.JPG](https://qiita-image-store.s3.amazonaws.com/0/43208/523264e1-7f0f-61b1-a747-15d8f0f81644.jpeg)

# おわりに

非常に簡単でびっくりしました。
さすがにコードの編集とかはIDE使った方がよさそうですが、便利ですね～。
HomebrewでHaxe + Lime導入

## 前提

- OS X Mavericks
- Homebrew
- Zsh

## 導入

HomebrewでNekoとHaxe、haxelibをインストール、Zshから呼び出せるようにする。

```zsh
brew install haxe
echo "export HAXE_STD_PATH='/usr/local/lib/haxe/std'" >> ~/.zshrc
```

リポジトリを作成してhaxelibを初期化

```zsh
sudo mkdir -p /usr/lib/haxe/lib
sudo chown [username]:admin /usr/lib/haxe/lib
haxelib setup /usr/lib/haxe/lib
```

Limeをインストールして初期化

```zsh
haxelib install lime
haxelib run lime setup
```

ついでにOpenFLをインストール

```zsh
lime install openfl
```
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableViewでインデックスが文字化けする場合


sectionIndexTitlesForTableViewで返されたNSArrayをもとに、TableViewの右側に表示されるセクションインデックスは作成されますが、インデック数が多すぎると、勝手に「●」に置き換えられて、インデックスの数を調整されてしまいます。
これはTableViewの表示領域によって上限値が決まるので、一概にいくつまで表示できると言い切れませんが、およそ２０代後半から４０個くらいになるのではないかと思います。

3.5インチでは、Master-Detailで自動的にできたプログラムにsectionIndexTitlesForTableView:だけを実装すると、３０個のインデックスで「●」に置き換えられます。
![スクリーンショット 2014-05-05 17.31.40.png](https://qiita-image-store.s3.amazonaws.com/0/37244/f5b2d624-6b1f-63f3-91d4-528e34847b20.png "スクリーンショット 2014-05-05 17.31.40.png")


２９個であれば、全て正しく表示されます。
![スクリーンショット 2014-05-05 17.33.26.png](https://qiita-image-store.s3.amazonaws.com/0/37244/4c852df1-e1d6-cf3d-98ff-ddf8b03ca319.png "スクリーンショット 2014-05-05 17.33.26.png")


４インチであれば、表示領域が3.5インチよりも広いため、30個でも正しく表示されます。
![スクリーンショット 2014-05-05 17.35.05.png](https://qiita-image-store.s3.amazonaws.com/0/37244/61852cb4-5df8-d6f6-bb1d-dc2dcddce507.png "スクリーンショット 2014-05-05 17.35.05.png")
counter_cacheを使って子モデルの件数を自動で親モデルのカラムに格納する

親モデル`Parent`と子モデル`Child`があり、子モデルの件数を親モデルで持つ場合、`counter_cashe`が便利。

やり方は、以下。
これで子モデルを作るたびに、自動的に`child_count`をインクリメントしていってくれる。

```rb:parent.rb
# == Schema Information
# Table name: good_reviews
#  id           :integer          not null, primary key
#  child_count  :integer          default(0), not null

class Parent < ActiveRecord::Base
 has_many :child

end
```

```rb:child.rb
# == Schema Information
# Table name: good_reviews
#  id           :integer          not null, primary key
#  parent_id    :integer

class Child < ActiveRecord::Base
  belongs_to :parent, counter_cache: :child_count

end
```
CoffeeScript と TypeScript の開発環境

Visual Studio Professional 2013 以上で CoffeeScript と TypeScript の開発環境が構築できます。
Visual Studio 2013(Professional/Premium/Ultimate)は、[こちら](http://www.visualstudio.com/ja-jp/downloads/download-visual-studio-vs.aspx)から90日間無償評価版がダウンロードできます。

#1. Windows OS のバージョンを確認します。
サポートされる OS を以下に挙げます(Windows Server 系を除きます)。

|OS          |サービスパック          | x86/x64               |
|:----------:|:----------------------|:----------------------|
|Windows 7   |Service Pack 1 (SP1) 　|x86 および x64          |
|Windows 8   |                       |x86 および x64          |
|Windows 8.1 |                       |x86 および x64          |

#2. Windows 7 Service Pack 1 をインストールします。
Windows 7 で Service Pack 1 が入ってない場合は Service Pack 1 をインストールします。
Windows 8 および Windows 8.1 の場合は 4. に進みます。
   【Windows 7 Service Pack 1 (SP1) をインストールする方法】
    　⇒ http://windows.microsoft.com/ja-jp/windows7/learn-how-to-install-windows-7-service-pack-1-sp1

#3. Internet Explorer 11 をインストールします(Windows 7 のみ)。
Windows 7 で [Internet Explorer のバージョンが 10 より下の場合](http://www.microsoft.com/ja-jp/security/pc-security/ver_ie.aspx)は Internet Explorer 11 をインストールします。
   【Internet Explorer 11 のダウンロード】
    　⇒ http://windows.microsoft.com/ja-jp/internet-explorer/ie-11-worldwide-languages

#4. Visual Studio Professional (または Premium/Ultimate) 2013 をインストールします。
   (Visual Studio Express 2013 for Web は、Web Essentials 2013 がインストールできないため、Professional / Premium / Ultimate でお願いします)
   【Visual Studio 2013 90日間無償評価版】
    　⇒ http://www.visualstudio.com/ja-jp/downloads/download-visual-studio-vs.aspx

#5. 「Visual Studio 2013 Update 2 RC」をダウンロードしてインストールします。
   【ダウンロードサイト】
    　⇒ http://www.microsoft.com/ja-jp/download/details.aspx?id=42307

#6. 「Web Essentials 2013 for Update 2 RC」をダウンロードしてインストールします。
   【ダウンロードサイト】
    　⇒ http://visualstudiogallery.msdn.microsoft.com/56633663-6799-41d7-9df7-0f2a504ca361

以上で開発環境が完成しました。
使い方はまた今度～。

# スクリーンショット

![2014-0505-2323.png](https://qiita-image-store.s3.amazonaws.com/0/32879/db4a29d3-7faa-cd11-165b-2525694208aa.png)

* 左側の画面で TypeScript を編集して保存するたびに自動的にコンパイルが走って右側の画面に生成された JavaScript のコードが読み込まれて表示されます。

* 左側の画面で行を選択した上で F9 を押すと TypeScript のソース上にブレークポイントを設定することができます。

![2014-0505-2229.png](https://qiita-image-store.s3.amazonaws.com/0/32879/8793ab2d-aa2a-c428-9762-5d83b08af0bf.png)

![2014-0505-2320.png](https://qiita-image-store.s3.amazonaws.com/0/32879/eaeebcc8-4b3e-f631-bc81-e86599404472.png)

![2014-0506-0058.png](https://qiita-image-store.s3.amazonaws.com/0/32879/89c18388-b8e4-dba8-a08a-a6827553e7f6.png)

![2014-0506-0102.png](https://qiita-image-store.s3.amazonaws.com/0/32879/c0c51ef6-b8a2-2054-d12f-08cb7944f08b.png)
モデルでdefault_scopeを設定していると、モデルのデフォルト値が正しく動作しないことがある

マイグレーションファイルで以下のようにbooleanのデフォルト値を設定していたが、正しく動作しなかったのでいろいろ調べてみると、モデルで設定した`default_scope`が問題だということがわかった。
```rb
t.boolean :is_checked,                     null: false,      default: false
```

モデルでは以下のように`default_scope`を設定していた。
```rb
default_scope { where(is_checked: true) }
```

モデルで上のような`default_scope`を設定すると、`is_checked`のデフォルト値が`true`になってしまう。

解決方法は不明。
テザリングの切り替えを検知する


##経緯
開発中のアプリでテザリングの切り替えを検知する必要が出てきたので自分用にメモ。

##テザリングを切り替えた時のBroadCastを検知する
テザリングの状態を変更した時に次のアクションのIntentがブロードキャストで送信される

`"android.net.conn.TETHER_STATE_CHANGED"`

このアクションはConnectivityManagerに定義されている非公開のアクションだが、IntentFilterに定義することでブロードキャストを検知できる

```xml:AndroidManifest.xml
<receiver android:name=".TetherStateChangedReceiver" >
    <intent-filter>
        <action android:name="android.net.conn.TETHER_STATE_CHANGED" />
    </intent-filter>
</receiver>
```

```java:TetherStateChangedReceiver.java
@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals("android.net.conn.TETHER_STATE_CHANGED")) {
        Log.d(TAG, "availableArray:" + intent.getStringArrayListExtra("availableArray"));
        Log.d(TAG, "activeArray:" + intent.getStringArrayListExtra("activeArray"));
        Log.d(TAG, "erroredArray:" + intent.getStringArrayListExtra("erroredArray"));
    }
}

```

テザリングを切り替えた時のログは以下のようになる。

```
availableArray:[wlan0]  #利用可能なテザリング名
activeArray:[]          #今使用しているテザリング名
erroredArray:[]         #使用不可能なテザリング名
```

テザリングの切替時にアクションが複数回走るが、
テザリングをオフにした時は最終的にactiveArrayに空配列が、
テザリングをオンにした時は最終的にactiveArrayにテザリング名が入った配列が取得できるので、それでテザリングが有効かどうか判断できる。
S3へ最高のパフォーマンスでログを保存する



概要
====

ログの収集にfluentdを利用して一カ所に集めるというよくある構成の場合、
収集するログの量と対象のサーバーのスケールアウトでログの量が急増した時に
ログ転送先がスケールできなかったり下手すると単一障害点になることもあります。

そこで、[fluent-plugin-forward-awsで疎結合なログ転送](
http://qiita.com/tomohisaota/items/fb5ac1bcf92ac1d02910) で、「スケールし、落ちないログ転送先」として紹介されている
各サーバーから直接S3にログを転送し、SQSを使ってログの収集元と収集先を疎結合にする
という方法が良さそうだなあと思ったんです。

しかし、肝心のS3のリクエスト数に制限は無いのかどうか心配になり調べてみました。


S3のリクエスト数の限界
===================


[Amazon S3のパフォーマンスをあげるコツ](http://aws.typepad.com/aws_japan/2012/03/amazon-s3-performance-tips-tricks-.html) によると、秒間50リクエストを超えるような場合は、この記事中のベストプラクティスに従わないとパフォーマンスが出ないようです。

fluentdを使って毎分定時でアップロードするとなると、1台あたり10個のログを保存するとなると、サーバー5台で同時50リクエストに達してしまいます。
毎分転送はやり過ぎかもしませんが・・・

S3のパフォーマンスを最高にする
=========================

[Amazon S3のパフォーマンスをあげるコツ](http://aws.typepad.com/aws_japan/2012/03/amazon-s3-performance-tips-tricks-.html)や、
[Request Rate and Performance Considerations](http://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html) に記載されているのですが、
オブジェクト名の先頭の３〜4文字をランダムにすれば良いようです。

例えば、

```
examplebucket/2013-26-05-15-00-00/host01/apache/access_log
examplebucket/2013-26-05-15-00-00/host02/apache/access_log
examplebucket/2013-26-05-15-00-00/host03/apache/access_log
examplebucket/2013-26-05-15-00-00/host04/apache/access_log
```

こういうような日付が先頭になる形式はよくやってしまうとおもうんですが、これが最悪なパターンなようです。

改善するためには、以下のように、

```
examplebucket/0Dke-2013-26-05-15-00-00/host01/apache/access_log
examplebucket/AkqD-2013-26-05-15-00-00/host02/apache/access_log
examplebucket/1T8H-2013-26-05-15-00-00/host03/apache/access_log
examplebucket/vZgR-2013-26-05-15-00-00/host04/apache/access_log
```

先頭にランダムな文字をいれることで最高のパフォーマンスが得られるようです。


fluentdのS3プラグインは上記のようなハッシュを生成できないため改造が必要です。
面倒なら、ログファイルのIDをハッシュ化して16進を使う方法か、ハッシュをbase64して+,/,=をurlセーフな他の文字に置換する方法を推奨しているようですね。

ハッシュは、rubyだとこんな感じで生成するといい感じで4文字が生まれるのかも

```ruby:
Base64.urlsafe_encode64(Digest::MD5.digest("hogefuga")[0,3])
```


というわけで
==========

fluentdのプラグインを作らないと・・・


その他
====


[DynamoDBやSQSといったAPIを高頻度に使うときに忘れずにセットしておきたいカーネルパラメータ]
(http://understeer.hatenablog.com/entry/2014/02/25/173810)
リモートファイルのサイズを取得する

真っ先に思いつくのはこういう実装でしょう。

```php
function remote_filesize($url) {
    if (false === $response = @file_get_contents($url)) {
        return false;
    }
    return strlen($response);
}
```

しかしこのままだと巨大ファイルを相手にしたとき、サイズのみを知りたいのに延々とダウンロードで待たされるのは無駄な感じがしますよね。そこでヘッダーを取得したらレスポンスを待たずにブッチしちゃう **[get_headers](http://www.php.net/manual/ja/function.get-headers.php)** 関数を利用します。処理は一瞬で終わるようになりますが、 **Content-Length** ヘッダーが返されていない場合には取得に失敗するという欠点はあります。

```php
function remote_filesize($url) {
    static $regex = '/^Content-Length: *+\K\d++$/im';
    if (
        !$list = @get_headers($url) or
        !preg_match($regex, implode("\n", $list), $matches)
    ) {
        return false;
    }
    return (int)$matches[0];
}
```

両方を組み合わせて効率よく確実に取得したい場合は以下のようにします。 `http://` ストリームラッパーを使用したときに得られる **[$http_response_header](http://www.php.net/manual/ja/reserved.variables.httpresponseheader.php)** という変数を利用します。この実装であればリモートファイルに対してもローカルファイルに対しても使うことが出来ますね。

```php
function remote_filesize($url) {
    static $regex = '/^Content-Length: *+\K\d++$/im';
    if (!$fp = @fopen($url, 'rb')) {
        return false;
    }
    if (
        isset($http_response_header) &&
        preg_match($regex, implode("\n", $http_response_header), $matches)
    ) {
        return (int)$matches[0];
    }
    return strlen(stream_get_contents($fp));
}
```
色付きカレンダーをWindowsで使う

こんなのができます。「あれ？ ゴールデンウィークの休みっていつまでだっけ？」という思ったので調べたら書いてる方がおられました。ひゃっほーい。

![201405055.jpg](https://qiita-image-store.s3.amazonaws.com/0/19475/59549280-6501-7683-e0a1-6db476ce1596.jpeg)

http://www.xmisao.com/2013/09/25/xcal-display-a-japan-calendar-like-cal.html

常にターミナルで作業してるとカレンダーもコマンドラインから使いたくなってきます。できれば色を付けるだけじゃなくて、Google Calendarの予定のチェックとか追加とかできると良いんですが残念ながらそんな機能を提供してくるものは見つかりませんでした。

## インストール方法

MacやLinuxで`ruby`が入ってるなら`gem i xcal`だけでOKのようですがWindowsの場合はもう2手間ほど必要でした。

### SSL の認証確認

```
cd ~/Dropbox/home
wget http://curl.haxx.se/ca/cacert.pem
set SSL_CERT_FILE=%USERPROFILE%\Dropbox\home\cacert.pem
```

ファイルの保存場所はもちろん適宜変えてください。

`SSL_CERT_FILE`はこれだとシェルを再起動すると消えちゃうので環境変数に入れときましょう。自分の環境だと`~/.nyaos`に 

```
set HOME=%USERPROFILE%
set DROPBOX=%HOME%\Dropbox
# ...
# 他にも色々
# ...
set SSL_CERT_FILE=%DROPBOX%\home\cacert.pem
```
と言った感じで書いてます。

詳しくはここらへん https://gist.github.com/fnichol/867550

### tzinfo-data がない

`gem install tzinfo-data`しましょう。何かそんなエラーが出ます。

んであとは`gem i xcal`したらOKです。
モデルの向き（角度）から単位ベクトルを求める


y軸に対するモデルの回転角度から、x, z 平面での単位ベクトルを求める

```
double radian = transform.eulerAngles.y * (Math.PI / 180); 
float momentX = (float)(Math.Sin (radian) * 0.1);
float momentZ = (float)(Math.Cos (radian) * 0.1);
Vector3 momentAddition = new Vector3(momentX, 0, momentZ);
```

なんて、ことしなくても`transform.forward`で取得することができた...
SQLAlchemyでのデータ挿入と取り出しで文字コードにハマる

##SQLAlchemyと文字コードにハマる（UTF-8, Unicode）

###問題
自分でMySQLに入れたデータだと問題なくsqlalchemyで取り出して文字化けが起こらないのに、友人からもらったdumpファイルで入れたデータだとsqlalchemyで取り出すと文字化け／(^o^)＼

###解決策
sqlalchemyを使ってデータを出し入れする場合、 **挿入(insert)と取り出し(select)では必ず同じ文字コード（設定）を使う。** 

* * *

###解説
今回、以下のような基本的？な接続を行おうとしていました。

```py
# -*- coding: utf-8 -*-

from sqlalchemy import create_engine,
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import MetaData


# dbとの接続関連の処理
engine = create_engine('mysql://username:password@localhost/dbname?charset=utf8')
Base = declarative_base()
metadata = MetaData()
Session = sessionmaker(bind=engine)
session = Session()
```

自分ひとりで出し入れをする分には致命的な問題は起こりません。
ただし、他の人からもらったデータをsqlalchemyで取り扱う場合は注意が必要です。

今回、mysqlのdumpファイルをもらってデータを突っ込んだのですが、sqlalchemy経由で取り出すと文字化けが／(^o^)＼

####状態

自分：

```py
create_engine('mysql://username:password@localhost/dbname')
```

charsetをutf-8にしていない／(^o^)＼

相手：
きちんとcharsetをutf-8にしていた。（railsでMySQLにデータを挿入していたため、sqlalchemyは使っていません。）

####どうやったら直ったの？
以下のように書き直しました。

```py
create_engine('mysql://username:password@localhost/dbname?charset=utf8')
```

最後に?charset=utf8を加えただけです。
ただし、以下の流れはダメです。

(?charset=utf8なしで)データを挿入
↓
(?charset=utf8を付け加えた状態で)データを取り出す
文字化けします。




同じ設定でデータの挿入と取り出しをしましょう。つまり、

（?charset=utf8を加えた状態で）データを挿入
↓
（?charset=utf8を加えた状態で）データを取り出す

こうすれば文字化けは起こりません。


あと、逆もまた然りです。?charset=utf8を付けずにデータを挿入したのであれば?charset=utf8を付けずに取り出しましょう。

なお、?charset=utf8をつけた状態でデータを取り出すと、文字データはUnicodeで返って来ました。?charset=utf8を付けなかった場合はasciiで返って来ました。


早くPython3にしたい＼(^o^)／
weiboに開発者登録してみた

#はじめに
weiboのアプリ作ってみたいという、簡単な動機で登録フローを確認してみました。
いくつかサイトを検索してみたいのですが、登録の部分については明記されていない場合が多く、登録フローへの変更が結構多いのかなと。

そのため、現状での作業履歴的な内容になっています。
また、開発者登録については途中で止めています。
#Weiboへの登録
**2014年5月の状況です。**

開発者登録を行うには
 1. weiboへのユーザ登録
 2. 開発者としての登録

上記二つの登録が必要です。

##ユーザ登録
中国語が分からなかったり、中国語を調べる手間が省きたい方は
英語表示にすることを勧めます。
![スクリーンショット 2014-05-05 13.57.39.png](https://qiita-image-store.s3.amazonaws.com/0/12362/009beef3-04db-bade-fe7a-dbd166117a12.png)
サイトの右下に言語を切り替えるフォームがあり、切り替えが可能です。

http://weibo.com/signup/signup.php

**英語表記**にした場合
![スクリーンショット 2014-05-05 14.04.31.png](https://qiita-image-store.s3.amazonaws.com/0/12362/472661f4-6f5c-d79e-81ae-f81d779b56e0.png)

##注意
>Safariの場合とChromeなどブラウザによって挙動が違うかもしれません。
>メールアドレスでの登録が出来なかった気がします。

メールアドレスで登録した場合はログインはメアドなんですが
携帯でSMS使うと、あとのログインも携帯の番号です。

メールアドレスを入力させる場合と
![メールの場合.png](https://qiita-image-store.s3.amazonaws.com/0/12362/e7c85700-595d-87fc-90bc-5989a56fb3eb.png)

携帯電話にSMSを送る場合がありました。
![スクリーンショット 2014-05-05 13.36.13.png](https://qiita-image-store.s3.amazonaws.com/0/12362/61d2507f-bdf8-1e52-1e2a-b088872aaa31.png)

Weiboのトップページから登録処理を進めると
![スクリーンショット 2014-05-05 9.52.37.png](https://qiita-image-store.s3.amazonaws.com/0/12362/97cb44c1-f8fb-68de-575d-c938cd9cf53f.png)

両方の入力が必要で、アクティベーションするための
SMSの送信先に海外（weiboからすると日本は海外です）が指定出来なかったため
登録処理ができませんでした。
![スクリーンショット 2014-05-05 14.18.51.png](https://qiita-image-store.s3.amazonaws.com/0/12362/4626536b-a09b-8240-b827-0ee80420fd98.png)

登録フローがばらついてる印象を持ちました。

##開発者登録:基本情報
ここは中国語表記のみなので、がんばるしかないです。

![開発者登録1.png](https://qiita-image-store.s3.amazonaws.com/0/12362/e5e9df34-677e-86a6-9b7f-6fcb63f4cb28.png)

![開発者登録2.png](https://qiita-image-store.s3.amazonaws.com/0/12362/af01d798-ef2d-9f8b-42ff-3a709417815b.png)

必須項目のように見える住所の詳細は入れなくても良いですが

 - メールアドレス
 - 電話番号
 - 自分が管理するホームページ
 - IMのアカウント（MSN、QQ、Gtalk）

が必須。IMのアカウントはMSNを選びました。

##開発者登録:身元確認
![スクリーンショット 2014-05-05 15.12.01.png](https://qiita-image-store.s3.amazonaws.com/0/12362/45a00379-a217-3bcd-481d-de100d8344a3.png)

パスポートがあれば登録できるような、個人的にはここでストップです。

#参考URL

授权机制说明(OAuth認証についての説明)
http://open.weibo.com/wiki/授权机制说明

iOSからWeibo(微博)にログイン〜ツイートしてみる
http://b.ruyaka.com/2013/12/10/weibo-ios-application-basic/

#さいごに
他のSNSに比べて開発者の登録では敷居の高さが数段上です。
仕様や、登録の条件、またサイトの作り込みからあまり海外の開発者を求めている感じがしない印象です。
ログインが電話番号なのは個人的にいやなので、登録時の設定がログイン後に変更できたりしないのかしら、と思ってます。やり直そうかなと。

weiboでiOS用のデモアプリのキーを自分で登録したものに差し替えてみたものの、当初正常になレスポンスは確認できていませんでした。
結局はソースコードに付属したpdf：微博IOS平台SDK文档V2.4.0.pdfをみつつ、アプリ側の設定が、抜けてました

アプリ編は後ほど。
CraftLaunch から Giraffe+ へ移行しようとした

# CraftLaunch から Giraffe+ へ移行しようとした

今現在 CraftLaunch 2.08 を使っていて、Giraffe+ 0.7.9.1556_20140406 へ移行しようとした話。
CraftLaunch 3.30 でも良かったんじゃないかと思うけど衝動的だったので。

## CraftLaunch 2.08 で気になるところ

1. 日本語を Delete で削除すると 1 バイト分しか削除されない。
2. Google 検索に ue を使わないと文字化けする。
3. 古い

## Giraffe+ をインストールして試したこと

### Google 検索コマンド

doc/manual.html に記載の通り、以下を Data へ格納。文字化けしない。

```:Google.girrafe
(Googleで検索)
(google.ico)
include((www))
Shell.Execute(cat((http://www.google.co.jp/search?ie=sjis&q=)www:url-encode(param(0))))
```

### コマンドの優先順位指定

Priority.txt に優先したいコマンドを記載。
何も指定しないと文字列順（？）になる。
実行することで優先順位が変わることもない。

### コマンド実行後 Giraffe+ が非表示になったら IME を Off にする

ユーザスクリプト用の Script2/settings/setup へ以下を追加して、設定から有効にした。

```:IMEOffInactive.giraffe
LOCALE& 'japanese', 'ディアクティベイト時にIME Off', 'IME Off when deactivating'
AddEvent& 'Deactivate',	[
	Giraffe.SetImeState(false Giraffe.MainWnd.m_hWnd)
]
```

## Giraffe+ で気になるところ

1. モディファイアキーでの動作の変更が簡単にはできない？　スクリプトを書かないといけなさそう。
2. Google 日本語入力で変換候補を表示している際に、ウィンドウの幅からはみ出ると、候補ウィンドウを右か下のどちらに表示するかしっかり決まらないらしくちらつく。Google日本語入力のみかな？
3. 履歴表示時のウィンドウサイズの変更が遅い。AutoResize.SetTextTimeOutで変更可能だったので解決。
4. ウィンドウサイズが変更されるまで左に文字がはみ出すのが気持ち悪い
5. 履歴表示時にウィンドウサイズの変更が頻繁にあると鬱陶しい。AutoResize.Enable を 2 にすることで緩和された。

## そもそも

CraftLaunch でも大したことをしていないので、わざわざ変える必要はないかなと思い直した。
Giraffe+ できになるところの 2. が解決できるのなら移ってもいいとは思う。
【アジャイルソフトウェア　開発の奥義】オープン・クローズドの法則

#オープン・クローズドの法則 (OCP)

アジャイルソフトウェア　開発の奥義を読んで、OCPを学んだのでメモします。

##定義
>ソフトウェアの構成要素(クラス、モジュール、関数など)は拡張に対して開いて(オープン:open)いて、修正に対して閉じて(クローズド:closed)いなければならない

##意味
拡張がし易く、機能を追加した事による修正が多岐に渡らず、閉じている事。
具像クラスに依存せずに、抽象に依存させる事で実現できる
抽象クラス、インターフェースに依存すれば、機能を追加する時は派生クラスを作れば機能を拡張できる。
また、抽象クラス、インターフェースを使用している箇所は具像クラスとは無関係になるので、
派生クラスを作っても、変更する必要が無く、閉じている

変更箇所が具像クラスを呼び出す所がメインになるので保守性も良くなる。