OmniAICreator/Qiita-1.07M huggingface dataset:
SSLサーバ証明書のSANsとは

# SSLサーバ証明書のSANsとは
Subject Alternate Names の略で、サーバ証明書のCN（Common Name）の別名というか追加名のこと。

普通サーバ証明書を買うと www.example.com など一つのホスト名がCNとして設定されたものが発行される。
ブラウザ等はサブドメインまで含めて完全一致でこのホスト名をチェックするから、www2.exmaple.com や example.com なんかのホスト名でアクセスすると証明書エラーが出る。でも www.example.com と example.com はサイトの中身同じだしどっちでもアクセスできるようにしたい。

だけどその為に証明書2枚も買うのはもったないし設定も面倒…。というのに対する一つの回答がSANという機能と思えば良い。より詳しいことは「[Subject Alternate Names](https://www.google.com/search?q=Subject+Alternate+Names)」でググれば分かる。

要は一つの証明書の中に2つ以上のホスト名を列挙することが出来る機能なわけだ。

サーバ側の設定もこの1つの証明書をセットしておけばSANsに含まれる全ホスト名に対応できるので楽ちん。


## SANsな証明書が発行出来るかどうかは認証局次第

普通は www.example.com の証明書を取得したら example.com は含まれないとこが多い気がする。
追加料金で両方含められたり、逆にexample.comは最初から勝手に含まれてたり、果てはうちはSANsやってないんでーってとこもそれなりにある。認証局によって違う。 
これボッタクリだろｗｗって値段のとこも多いし、色々検討すると良いだろう。

調べるのが面倒くさいので各認証局の対応具合や値段の列挙とかはここではしない。各自自分で調べてお気に入りの認証局を探せば良いと思う。ここで列挙しても数年立場値段とかも変わってその時代のベストな情報じゃ無くなっちゃうしね。


### ちなみに僕はStartSSLをよく使ってる
StartSSLではサブドメインを含まない example.com みたいなホスト名（ネイキッドドメインっていうのかな）は勝手にCNもしくはSANsに入ってくる。逆に言うとこれを除く方法が無い気もする(^^;
しかも、ここは ワイルドカード証明書だろうがSANsだろうが何でも対応してるので便利。
さらにそれら全部、無料で発行してもらえるしね！

基本無料だけど、個人認証や組織認証するのにはお金がかかる。それをすると発行できる証明書の期限を長くしたりEV証明書も発行できるようになったりなど色々便利になる。
ネックは英語でメッセージや書類のやり取りしなきゃならんのが結構大変なことかな…。

あと個人名やメールアドレスが証明書に含まれるのでそれを

あと自社用ならこれで良いんだけど、特殊メールアドレス(hostmaster@example.comとか)へのメール送信による所有者チェック以外に、それなりにちゃんと人出でのドメインの所有組織のチェックも行われているようなので、偶に証明書の取得代行を頼まれて申請してみても「このドメインお前が持ってるやつじゃないだろ？」と英語で返信が来て発行が却下されることもStartSSLにはよくある。
ちなみにホントに偶に自分が持ってるドメインなのに却下されて、ちげーよちゃんと僕のだよ、と英語で証拠を示す問答とかが発生したりすることも2度ほど経験した(^^;

つまり、メールだけ転送して貰って代行するってことはStartSSLでは出来ないんだわ。そういう場合(他人の代行)は諦めてRapidSSLとかそういうとこで個別にお金払って代行したりすることになる。本人所有以外のドメインの証明書は発行できないから、代行したい場合はその人にまずはアカウント作ってもらえって規約とかFAQにも書いてあるしな。


## ブラウザサポートの問題も

あと何気にこのSANsって機能、ガラケーや古いAndroid端末（確かver 2.x）とかだとサポートしてなかったりするので若干困る。だがまぁそういうのは時代が進むに連れて減るだろうから気にしない！

それから、そういう古い端末は大抵SNI（1個のIPとポートの組み合わせで複数証明書を切り替える機能）とかも対応してないから、対応しようと思ったら諦めて複数証明を取得して、複数IPで運用するしか無いね。

まぁ、大抵の問題はお金で解決するから心配無用。


# 元々は2chのレス
下のスレのID:fRd8fKHoは僕なわけだが2chだとそのうち倉庫に行っちゃうかもしれないので補足も兼ねて↑にメモった。

【認証局】SSLに関するスレ 2枚目【ぼろ儲け】
http://engawa.2ch.net/test/read.cgi/mysv/1286532904/294-297

```
294 ：DNS未登録さん：2013/05/30(木) 10:25:29.56 ID:???
example.comでwwwサーバ、メールサーバ、sshサーバを運営したいんだけど、 
www有りのコモンネームで証明書を取得すれば、SANsの機能で 
www有り・無し関係なくSSL通信ができるという認識であってますか？ 

295 ：DNS未登録さん：2013/05/30(木) 12:54:39.57 ID:fRd8fKHo
>>294 
example.com と www.example.com の両方がSANで含まれた証明書ならね。 
でも、普通は www.example.com の証明書を取得したら example.com は含まれないと考えるべき。 
追加料金で両方含めれたり、逆にexample.comは最初から勝手に含まれてたりとか、認証局によって違う。 

296 ：DNS未登録さん：2013/05/31(金) 07:49:15.56 ID:???
>>295 
example.com (wwwなし)の証明書って必要？ 

297 ：DNS未登録さん：2013/05/31(金) 12:17:19.50 ID:???
ComodoのPositive SSLって安いな 
ttp://www.gogetssl.com/domain-validation/ 

Positive SSL CNがexample.comにSANでwww.example.com 
Rapid SSL CNがwww.example.comにSANでexample.com 
だったはず 
```
今日作りたくなる簡単cookbook [Kim'sキッチン] jq


以下全ても●みち風に書いたメモ

皆さんおはようございます。
[ryurock@github](http://qiita.com/users/ryurock@github)です。

```shell:フガすけ(14歳)
jsonの表示を整形するjqを入れたいっす
```

今日はそんな[jq](http://stedolan.github.io/jq/tutorial/)を簡単なcookbookをknife-soloでご紹介したいと思います。


## レシピ作成時間
約2分

## 環境
* mac-osx（ホストOS）
* centos6.4-x86-minimal (ゲストOS)

## 事前準備に必要なもの
* virtualbox
* ruby 1.9.3p327 (rbenv) ※1.9.3-p286でもいけた
* chef ※入れていない方は```gem install chef```とshellから打ってください
* vagrant ※入れていない方は[chef-soloで使用するvirtualbox(vagrant)をveeweeを使用して作る](http://qiita.com/items/3cb756a9c951371a4089)を参考に入れておいてください
* git
* knife-soloのセットアップ ※やっていない方は[今日作りたくなる簡単cookbook [Kim'sキッチン] yumsetup(yum-fastestmirrorにyum update添え)](http://qiita.com/items/c99215e25bd2ff846207)の前準備を参考にしてやっておいてください。

## 参考にしたサイト（書籍）
* [入門ChefSolo-InfrastructureasCode-1.0.0](http://tatsu-zine.com/books/chef-solo)(達人出版)
* [jq](http://stedolan.github.io/jq/)


## [その１] レシピ名を決める

今回のレシピ名はjqで行きましょう

```shell
cd chef-repo
knife cookbook create jq -o site-cookbooks
```

## [その2] chef-repo/jq/recipes/default.rbを編集

```ruby:chef-repo/jq/recipes/default.rb
git "/tmp/jq" do
  repository "git://github.com/stedolan/jq.git"
  reference "master"
  action :checkout
  user "root"
  group "root"
  notifies :run, 'execute[jq_make_install]', :immediately
end

# install
execute "jq_make_install" do
  cwd "/tmp/jq"
  command "./configure; make; make install"
  action :nothing
end

```

## [その4]rbenv cookbookをリモート側で実行する設定を追加

```shell
vim chef-repo/nodes/{接続名称（任意）}.json

{"run_list":[
        "jq"
]}
```

run_listをすでに記載している場合は追記でお願いします。
またrbenvのインストールのみで問題ないならrbenvだけでも問題ないです。

## [その5] リモート側に実行依頼をする

```shell
cd chef-repo
knife solo cook {接続名称（任意）}

```

## 今日はこれで決まり「jq」の完成です

resource [notification](http://docs.opscode.com/resource_common_notifications.html)を使った簡単なサンプルです

使った[Chef Resources](http://docs.opscode.com/resource.html)

----

* [git](http://docs.opscode.com/resource_git.html)
* [execute](http://docs.opscode.com/resource_execute.html)
* [notification](http://docs.opscode.com/resource_common_notifications.html)
VS2008で「テスト駆動開発による組み込みプログラミング」の演習準備

「Test Driven Development for Embedded C」の翻訳本「テスト駆動開発による組み込みプログラミング」が発売されていた。私の環境で演習を行うには一手間必要だったので、覚え書きを書いておこう。

##私の環境
OS  : Windows XP Pro SP3（OSが何かは殆ど影響が無いかも）
IDE : Visual Studio 2008 Standard Edition（Expressでも同じかも）

何はなくとも本書のホームページからソースコードを落としてくる。
http://www.pragprog.com/book/jgade/

２種類の圧縮形式で提供されていた。Windowsはzipで、みたいな流れだったのでzipを落とした。
これを適当なディレクトリに展開する。私は D:\Home\Work に展開した。
READMEを開けば説明書きがあるので、基本的にはそれに従う。
（つまりREADMEで言うと、\<BookCodeParent> = D:\Home\Work となる）

#環境変数の設定

Visual Studioの人は、開く前に環境変数を設定しろと書いてある。
私は全体の環境を汚すのが苦手なので、まずコマンドプロンプトを開いて環境変数を定義する。

```
set CPP_U_TEST=D:\home\work\code\CppUTest
```

この環境を引き継いでVisual Studioを起動すれば良いので、このコマンドプロンプトにVisual Studioのショートカットをドラッグ＆ドロップする。

#CppUTestライブラリの生成

READMEには書いてないけど、CppUTestのライブラリが必要となるので、先にライブラリを生成する。
ソリューションファイルが用意されているので、\<BookCodeParent>/code/CppUTest/CppUTest.sln をVisual Studioにドラッグ＆ドロップする。ファイルを開くでもいいが、環境を引き継いで使うというやり方だとslnをダブルクリックでは環境を引き継いでくれないので注意のこと。F7（ソリューションのビルド）を実行すればライブラリ \<BookCodeParent>/code/CppUTest/lib/CppUTest.lib が生成される。

#全てのテストをコンパイル、実行

さていよいよ全てのテストを通してみよう。起動しているVisual Studio 2008に \<BookCodeParent>/code/BookCode.dsw をドラッグ＆ドロップする。勿論ファイルを開いても良い。新しいプロジェクトに変換するか、とか聞いてくるので「すべてはい」を押した。開いたら、READMEにある通り、Control+F5 でビルドと実行を一気にやってみよう。結果は次の通り。

```
...............................................!..
..................................................
...........................
OK (127 tests, 126 ran, 507 checks, 1 ignored, 0 filtered out, 0 ms)

続行するには何かキーを押してください . . .
```

これで「サンプルプログラムがそのまま動いた、開発環境間違ってないよね」までできた。
CentOS で Ruby が動かないときは prelink が怪しい

CentOS で chef solo を設定中のこと。
昨日は使えたはずのコマンドが一部使えなくなっている。

```console: 
$ knife solo init test
/usr/bin/ruby: No such file or directory -- $(prefix)/com (LoadError)
```

　
CentOS + Ruby で同様の問題が。

>・インストールしたての頃は問題なく動作するが、半日から1日経って起動すると発現するようになる。
>・インストールしなおせば解消される (リビルドも不要)。が、また半日か経つと発現する。

[Ruby バグ?](http://lugia.hatenablog.com/entry/2013/01/09/132330 "ルギア君の戯言")
[CentOSでrubyが実行出来なくなる現象を解決（未解決）](http://fevnir-r.hateblo.jp/entry/2013/02/05/214259 "Fevnirのブログ（仮）")

　

先輩に相談したところ、定期的に問題が発生→ cron が怪しいのでは、とのこと。
cron で prelink というものが定期的に実行されていました。

prelink を解除するコマンドを実行すると、コマンドが正常に動くようになりました。

```console: 
prelink -u /usr/bin/ruby
```
　
*** 参考
prelinkは動的リンクの書き換えを事前に行うもののようです。
[rpmで入れたバイナリのchecksumが一致しないと思ったらprelinkのせいだった](http://blog.riywo.com/2012/08/12/162527 "As a Futurist…")
　
ruby でバイナリが壊れるトラブルもよくあるそう。
ruby を prelink しないようにする方法も載っていました。
[【Ruby】prelinkなるものがrubyのバイナリを破壊するそうです](http://www.cozzbox.com/wordpress/archives/365 "cozzbox")
pvmで複数バージョンのplay環境を構築

playでもrbenvみたいなノリでバージョン管理をやってみた。

※[Parallel Virtual Machine](http://www.csm.ornl.gov/pvm/)ではなく[Play Version Manager](https://github.com/kaiinkinen/pvm)です

### セットアップ
```
$ git clone git://github.com/kaiinkinen/pvm.git ~/bin/pvm
$ echo '. ~/bin/pvm/pvm.sh' >> ~/.bashrc
```
rbenvみたくxcodeも必要無いので、git cloneしてきただけで準備完了。

[本家](https://github.com/kaiinkinen/pvm#problems)の情報だと、pvmをドットで始まるディレクトリ(**~/.pvm**とか)に格納するとplay1.2.x系の実行時に問題が起こるらしいので~/bin下に入れてみた。pvmで入れた2.1.0環境ではざっと確認した限りは問題ないみたい

### playをインストール
```
$ pvm install 2.1.0
$ pvm use 2.1.0
```

これでplayの実行環境出来上がり。他のバージョンにしたければ同様にinstall+useで切り替え。
std::min_elementで0でない最小値を見つけるための比較関数

min_element内部では

```c++:min_element
if (comp(*first, *smallest)) {
  smallest = first;
}
```

なので，
*firstが0のときにfalse，
*secondが0のときにtrueを返せばOK．

```c++:min.cpp
#include <iostream>
#include <vector>
#include <algorithm>
using std::vector;
using std::cout;
using std::endl;
int main() {
  vector<int> a = {0, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 0};
  auto min = min_element(a.begin(), a.end(), [](int a, int b) {
	  return (a == 0) ? false : (b == 0) || a < b;
	});
  cout << *min << endl;
  return 0;
}
```
twittering-mode で新たな TL を開くときに今のバッファを削除する

Emacs でツイッターを利用する [twittering-mode](http://www.emacswiki.org/emacs/TwitteringMode-ja) では，`V` で新たなタイムラインを表示するとそれまで見ていたバッファが残るので，twittering-mode を終了するためには何度も `q` を押す必要があります．そこで，新たなタイムラインを表示する `twittering-visit-timeline` を実行する前にバッファの消去 `twittering-kill-buffer` を実行する defadvice を書きました．

ただ，それだけだと `twittering-initial-timeline-spec-string` を設定することに意味がなくなってしまいます．そこで `f` と `g` のキーには，この変数に設定したタイムラインのリストを順にアクセスする機能を割り当てることにします．

以下がそのコードになります．.emacs の `(require 'twittering-mode) の後ろに記述してください．

```common-lisp
;;; 新たなタイムラインを表示する前に，現在のタイムラインのバッファを消去
(defadvice twittering-visit-timeline (before kill-buffer-before-visit-timeline activate)
  "Kill TL buffer before visit new TL."
  (twittering-kill-buffer))


;;; f / g キーでアクセスするタイムラインリスト
(setq twittering-initial-timeline-spec-string
      '(":mentions"
        ":home"))

;;; 次のタイムラインリストを表示
(defun twittering-kill-and-switch-to-next-timeline ()
  (interactive)
  (when (twittering-buffer-p)
    (let* ((buffer-list twittering-initial-timeline-spec-string)
           (following-buffers (cdr (member (buffer-name (current-buffer)) buffer-list)))
           (next (if following-buffers
                     (car following-buffers)
                   (car buffer-list))))
      (unless (eq (current-buffer) next)
        (twittering-visit-timeline next)))))

;;; 前のタイムラインリストを表示
(defun twittering-kill-and-switch-to-previous-timeline ()
  (interactive)
  (when (twittering-buffer-p)
    (let* ((buffer-list (reverse twittering-initial-timeline-spec-string))
           (preceding-buffers (cdr (member (buffer-name (current-buffer)) buffer-list)))
           (previous (if preceding-buffers
                         (car preceding-buffers)
                       (car buffer-list))))
      (unless (eq (current-buffer) previous)
        (twittering-visit-timeline previous)))))

;;; キーの設定
(defun twittering-mode-hooks ()
  (define-key twittering-mode-map (kbd "f") 'twittering-kill-and-switch-to-next-timeline)
  (define-key twittering-mode-map (kbd "b") 'twittering-kill-and-switch-to-previous-timeline))

(add-hook 'twittering-mode-hook 'twittering-mode-hooks)
```
レコードがなければINSERT,あればUPDATEをするSQL

PrimaryキーまたはUniqueキーを指定して、レコードがなければINSERT、あればUPDATEしたい。

#mysql

##INSERT …　ON DUPLICATE KEY UPDATE文を使う

mysql> desc foo;
+-------+--------------+------+-----+---------+-------+
| Field | Type           | Null  | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| code  | varchar(32)    | NO   | PRI |               |       |
| name  | varchar(256) | YES  |        | NULL    |       |
+-------+--------------+------+-----+---------+-------+


mysql> insert into foo (code, name ) values ('0001', 'abc') on duplicate key update code='0001', name='def';

code='0001'のレコードがないので、insert

mysql> select * from foo;
+------+------+
| code | name |
+------+------+
| 0001 | abc  |
+------+------+

mysql> insert into foo (code, name ) values ('0001', 'abc') on duplicate key update code='0001', name='def';

code='0001'のレコードがあるので、name='def'でupdate
+------+------+
| code | name |
+------+------+
| 0001 | def  |
+------+------+


#oracle

##MERGE文を使う(9i以降）

Ex.
merge into user_master a
using (select '0056ddgd456' as user_id, 700 as user_point from dual ) b
on (a.user_id = b.user_id)
when matched then
 update set
    user_point = user_point + 100
when not matched then
 insert (user_id, user_point)
 values ('0056ddgd456', 100 );

dual表を使わない書き方もあるみたい。
error RC1015:cannot open include file 'afxres.h'

ブログに書いたよ。
<a href="http://d.hatena.ne.jp/replication/20130528/1369749082">error RC1015:cannot open include file 'afxres.h' - 大人になったら肺呼吸</a> <a href="http://b.hatena.ne.jp/entry/d.hatena.ne.jp/replication/20130528/1369749082"><img src="http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/replication/20130528/1369749082" alt="はてなブックマーク - error RC1015:cannot open include file 'afxres.h' - 大人になったら肺呼吸" border="0" /></a>
Activity起動時にソフトウェアキーボードを出す

onCreateでgetWindow().setSoftInputModeを呼び出してSoftInputModeの設定をすると
フォーカスが当たっている場合に、ソフトウェアキーボードが表示される。
起動時にフォーカスを当てるために、対象のEditTextにrequestFocusを追記する。

```java:
package sample.softwarekeyboard;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.WindowManager;
 
public class SoftwareKeyboardActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        this.getWindow().setSoftInputMode(
                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
}
```

```xml:
<EditText
    android:id="@+id/edit_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <requestFocus />
</EditText>
```
AppleScriptでアプリケーションの操作

AppleScriptを使い他のアプリケーションの操作をする方法メモ。
テストした環境はMacOS 10.8。

アプリ起動

```applescript:
tell application "/Applications/Evernote.app"
    activate
end tell
```

アプリが起動中かどうかの判定

```applescript:
if application "Evernote" is running then
    "OK"
else
    "NG"
end if
```

アプリ終了

```applescript:
tell application "Evernote"
    quit
end tell
```
form_tagを使ったファイルのアップロード（ファイルシステムに保存）

view

```html+erb:
<%= form_tag({:action=>"upload"}, {:multipart => true} ) do %>
   <%= file_field :upload, :datafile%>
   <%= submit_tag  "Upload"  %>
<% end %>

```
ソース

```html:

<form accept-charset="UTF-8" action="/upload/upload" enctype="multipart/form-data" method="post">
   <input id="upload_datafile" name="upload[datafile]" type="file" />
   <input name="commit" type="submit" value="Upload" />
</form>
````
コントローラ

```rb:
def upload
  data=params[:upload]
  File.open('./tmp/files/'+ data[:datafile].original_filename, 'wb') do |of|
    of.write(data[:datafile].read)
  end
  redirect_to upload_index_path
end
```
gruntを試す


##[grunt](http://gruntjs.com/)用意

gruntはいろいろなタスクを自動化出来る便利なものらしい。
いきなり難しいことはしないで、taskを実行出来るところまで、
やってみました。

今回は[grunt-contrib-cssmin](https://github.com/gruntjs/grunt-contrib-cssmin)を使って、
分割されたcssファイルを一つのファイルにまとめて見ようと思います。

[Plugins - Grunt: The JavaScript Task Runner](http://gruntjs.com/plugins/)
ここにプラグインの一覧があるので、眺めてみると面白いかもしれません。

test_gruntをgruntを使うprojectとして用いる。

```
$ npm install -g grunt-cli
$ mkdir test_grunt
$ cd test_grunt
$ npm init
$ npm install grunt --save-dev
$ touch Gruntfile.js
$ npm install grunt-contrib-cssmin --save-dev
```

Gruntの設定ファイル、Gruntfile.jsを編集する。

```js:Gruntfile.js
module.exports = function(grunt) {

  // Project configuration.
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    cssmin: {
      combine: {
        files: {
          'build/css/merge.css': ['src/css/app.css', 'src/css/sub.css']
        }
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-cssmin');
  // Default task(s).
  grunt.registerTask('default', ['cssmin']);

};

```

上記で使うディレクトリーやファイルは、
あらかじめ作成しておかないとエラーが起きてしまった。
build/css/ src/css/ src/css/app.css src/css/sub.css 
を作成して次のようなファイル構成にする。

```
.
├── Gruntfile.js
├── build
│   └── css
├── index.js
├── package.json
└── src
    └── css
        ├── app.css
        └── sub.css

```

ちなみに、app.cssとsub.cssは次のようなものです。

```css:app.css
body{
  background-color: red;
}
```

```css:sub.css
h1{
  background-color: white;
}
```
ここでgruntのタスクを実行する。

```
$ grunt cssmin
```

あるいは、default taskにcssminを指定してあるので、`grunt`だけでも実行できる。

```
$ grunt
```

実行するとbuild/css/merge.cssが作成される。

```css:merge.css
body{background-color:red}h1{background-color:#fff}
```
テーブルビューが更新されないとき

UITableViewController関係。
CoreDataでデータに書き込んで、Tableに追加されてるはずなのに（見た目上）反映されていない。
一度画面遷移をして戻ってみると追加されてる。

こういうときは、「反映されてない」UITableViewControllerに以下のメソッドを追加すれば良いです。

```objc:
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [self.tableView reloadData];
}
```

サンプルコードにも書いてあるので、皆さんご存知なのかもしれませんが。
私は小一時間さまよったので…。
viewWillDisappearなど使いましたが、関係無かったです。。。
OpenGLの使い方:シェーダ編

# OpenGLの使い方:シェーダ編
## 目標
シェーダオブジェクトの操作を取り上げます．プログラムオブジェクトはここでは扱いません．

## シェーダオブジェクト
シェーダオブジェクトは一般のOpenGLオブジェクトとは幾分か異なります．
**glCreateShader** で生成します． *type* は取り扱うシェーダステージに対応する値を渡します． **glDeleteShader** で破棄します．なお，バインドに相当するものはありません．

```c:オブジェクト
// 生成
GLenum type;
GLuint shader = glCreateShader(type);

// 破棄
glDeleteShader(shader);
```

## コンパイル
まず **glShaderSource** でオブジェクトへシェーダコードを渡します． *source* はシェーダコードを表す文字列へのポインタを渡します． *length* はシェーダコードを表す文字列の長さを渡します． *source* がヌル終端文字列であれば，第4引数に **NULL** を渡すことができます．
渡したシェーダコードは **glCompileShader** でコンパイルします．

```c:コンパイル
// ソースを渡す
const GLchar* source;
GLint length;
glShaderSource(shader, 1, &source, &length);

// コンパイル
glCompileShader(shader);
```

## エラーチェック
コンパイルの成否は **GL_COMPILE_STATUS** パラメータで確認します．コンパイルに失敗した場合は，何かしらのログを受け取ることができます．
**GL_INFO_LOG_LENGTH** パラメータで，ログを受け取るのに必要なバッファサイズを確認できます． **glGetShaderInfoLog** でログを受け取ります． *max_length* はログを受け取るためのバッファのサイズを渡します． *length* には受け取るログの文字列の長さが返ります． *log* にはログを受け取るためのバッファへのポインタを渡します．

```c:エラーチェック
// 成否を確認
GLint result;
glGetShaderiv(shader, GL_COMPILE_STATUS, &result);

// ログを取得
if (result == GL_FALSE) {
  // サイズを取得
  GLint log_length;
  glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_length);

  // 文字列を取得
  GLsizei max_length;
  GLsizei length;
  GLchar log[max_length];
  glGetShaderInfoLog(shader, max_length, &length, log);
}
```

# メモ
(特になし)
初心者のための「ASP.NET Web Forms」でJsonを返すサンプル。

__2014/04/19__
[ここ](http://oshiete1.nifty.com/qa8370989.html)を読んでみて、この記事が誤解を与えそうだったので、文章を修正しました。

----------------

ASP.NETのJsonを返すサンプルをググっても、「ASP.NET MVC」だったりして「ASP.NET Web Form」のJsonを扱うサンプルを見つけることがなかなか難しかったりします。（見つかったとしても、ASP.NETの初心者には難しすぎたりと....）

まぁ、というわけで「ASP.NET Web Form」のすごくシンプルなサンプルを以下に示しておきます。

* TestJson.aspx
    Json形式のデータを取得するため、Json形式のデータをResponse.Output.Writeするためだけのページです。
    基本的に他のページから参照されるだけで、このページが直接参照されることはないです。

* TestJson.aspx.cs
    TestJson.aspxのコードですね。匿名型のオブジェクトをJavaScriptSerializerで文字列に変換しResponse.Output.Writeしています。

* Output.aspx
    TestJson.aspxからJson形式のデータを取得して、実際にそのデータを表示するページです。
    今回のサンプルでは、jQueryのajaxメソッドを使用して取得しています。
    ajaxメソッドの第一引数のメンバに`dataType: 'json'`を指定してあげると、urlで指定したページの内容をjson形式のデータだと認識してくれるのでありがたいですね。
    その結果は`success: function(data){ ... }`のdataにオブジェクトとして格納されているので、data.hogeのようにJson形式のデータを簡単にアクセスできます。

これを実行すると`http://localhost:9672/Output.aspx`のようにしてアクセスできるページになります。

## サンプル

__Output.aspx__

```html:
<!doctype html>

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Output.aspx.cs" Inherits="Output" %>

<html>
  <head>
    <script src="javascripts/jquery-1.9.1.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(function () {
            $('#json').on('mouseover', function(){
                var self = this;
                $.ajax({
                  url: 'TestJson.aspx',
                  type: "get",
                  dataType: 'json',
                  success: function(data){
                    $(self).html(data.hoge);
                  }
                });
              });
        });
    </script>
  </head>
  <body>
    <secsion>
      <div id="json">マウスオーバーするとここに出力します。</div>
    </secsion>
  </body>
</html>
```

__TestJson.aspx.cs__

```csharp:
using System;

public partial class WebForm1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        dynamic dataSet = new { hoge = "foo" };
        var s = new System.Web.Script.Serialization.JavaScriptSerializer();
        Response.ContentType = "text/javascript";
        Response.Output.Write(s.Serialize(dataSet));
        Response.End();
    }
}
```

__TestJson.aspx__

```html:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestJson.aspx.cs" Inherits="TestJson" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    </form>
</body>
</html>
```
ERROR:  While executing gem ... (NameError)となってしまい、knife-soloのインストールができない

knife-soloのインストールができずにものすごく苦労しました。

答えは単純でプロキシを通してなかったからうまくいきませんでした。

しかし、エラーが以下のように「uninitialized constant」初期化されていない定数というエラーです。

これはわかりにくい！

しかも、.gemrcにプロキシを設定するもうまく動かず・・・

$ sudo gem install knife-solo
ERROR:  While executing gem ... (NameError)
NameError: uninitialized constant Gem::RemoteFetcher

最終的には、これで対応しました。

$ sudo gem install knife-solo -p http://[プロキシアドレス]:8080

ふー　３時間くらいはまっていました＾＾；

追記：

実は、sudoが悪さをしていました。

デフォルトでsudoは環境変数をリセットします。

それが影響していた模様。

だから、-pでプロキシを指定した場合に、うまく動いた。

というおちでした＾＾；

ちなみに、こう書きます＾＾

Defaults        env_reset
Defaults:username env_keep="http_proxy"
Mac OS Xでgollumを導入してgithubにpushするようにする

## gollumのインストール

```sh 
gem install gollum
```

## レポジトリの用意
普通のgitのレポジトリを作るように、gollum用のレポジトリをつくる

```sh 
git init my_wiki
```

## 起動時にgollumが立ち上がるようにする

正確にはユーザがログインした時にgollumが立ち上がるようにする。

まずスクリプトの用意

```zsh:start.sh
#!/bin/zsh

# 適当に設定を読み込んでおいたりする。
source /Users/user-name/.rvm/scripts/rvm
source /Users/user-name/.zshrc

rvm use 1.9.2
gollum --mathjax --no-live-preview
```

launchctlを使ってログイン時に立ち上がるようにする

```xml:~/Library/LaunchAgents/com.github.gollum-startup.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Disabled</key>
        <true/>
        <key>Label</key>
        <string>com.github.gollum-startup</string>
        <key>ProgramArguments</key>
        <array>
                <string>/Users/user-name/path/to/start/sh/start.sh</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>WorkingDirectory</key>
        <string>/Users/user-name/path/to/wiki/repository</string>
</dict>
</plist>
```

launchctlにloadしておく

```sh 
launchctl load -w ~/Library/LaunchAgents/com.github.gollum-startup.plist
```

## 自動的にgithubにpushするようにする

gollumはページを編集すると、ローカルレポジトリにcommitしてくれるので、
定期的にレポジトリをpushするようにしてあげる。

同期用のスクリプトを作る


```sh:sync.sh 
#!/bin/bash
DIR="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
(cd $DIR && git pull && git push)
```

sync.shはwikiレポジトリと同じDirectoryにおいてあげる。

また、ローカルレポジトリのoriginにgithub(とか)を追加しておいてげる。

launchctl用のplistを用意する

```xml:~/Library/LaunchAgents/com.github.gollum-sync.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.github.gollum-sync</string>
  <key>RunAtLoad</key>
  <true/>
  <key>ProgramArguments</key>
  <array>
      <string>/Users/user-name/path/to/sync.sh</string>
  </array>
  <key>StartInterval</key>
  <integer>60</integer>

</dict>
</plist>
```

launchctlに追加

```sh 
launchctl load -w ~/Library/LaunchAgents/com.github.gollum-sync.plist
```

## 確認
こんなかんじに見えるはず

```sh 
launchctl list | grep gollum
2718	-	com.github.gollum-sync
1876	-	com.github.gollum-start
```
ubuntu linux に プログラミング用フォント Ricty をインストールする

## ubuntu linux に プログラミング用フォント Ricty をインストールする
プログラミングに適したフォントRictyをubuntuにインストールする。
このフォントが便利なのはmacでもlinuxでも使えるので
仕事はmac os,プライベートはubuntuみたいなパターンに対応できることだと思います。

### fontforgeのインストール
```bash
apt-get install fontforge
```

### Inconsolataフォントのインストール
```bash
wget http://levien.com/type/myfonts/Inconsolata.otf
cp Inconsolata.otf ~/.fonts
```

### Miguのダウンロード
下記リンクからMigu 1Mフォントをダウンロードする
http://mix-mplus-ipa.sourceforge.jp/migu/

```bash
unzip migu-1m-20130430.zip
cp migu-1m-20130430/*.ttf ~/.fonts
```

### Ricty生成用のスクリプトを取得
```bash
git clone git://github.com/yascentur/Ricty.git
```

### Ricty フォントを生成
```
sh ricty_generator.sh auto
```

### Rictyフォントのインストール
```
cp *.ttf ~/.fonts
```
GASからメールを送る際にちゃんと改行する

# Google Apps Script MailApp

## メール送信時に改行がキャンセルされる

HtmlServなどから、文字列を受け取ってそのまま送信すると改行がキャンセルされます。
何とかならんものかと無理くりですが、改行コードを<br />タグに置き換えてみます。

```js:
function send_mail(body_str) {
  var subject_text = "GASよりお知らせ";
  Logger.log(body_str.replace("\n", "<br />"));
  
  var send_list = [
    "hoge@hoge.com",
    "foo@foo.com"
  ];
  var html_str = body_str.replace("\n", "<br />");
  for (var i=0; i<send_list.length; i++){
    var send_addr = send_list[i];
    MailApp.sendEmail(send_addr,
                      subject_text,
                      body_str, 
                      { 
                        name: "GASよりお知らせ", 
                        html: html_str
                      });
  }
}
```
iOSで物理エンジンの動作をバックグラウンドスレッドを使用して高速化する

新しくブログを立ち上げまして、そのリンクになります。
他の記事も見ていただけたら嬉しいです。

iOSで物理エンジンの動作をバックグラウンドスレッドを使用して高速化する
http://wowdev.jp/?p=321
PHPでRSS1.0取得で躓いたので覚書。「dc:date」と「content:encoded」の取得方法

RSS2.0だと普通に日付なども取れると思うのですが、
RSS1.0だと単純に file_get_contents('rssのURL')だと
dc:dateやcontent:encodedなど階層が深くなっている部分が取得できません。
ので、下記コードで取得してくることで実装しました。

```php
<?php
  $rss_url = "RSSのURL";

  //RSSデータが取得できた場合に処理する。
  if($xml = file_get_contents($rss_url)){
    $xml = simplexml_load_string($xml);
　　　　
    //RSSデータをループ
    foreach($xml->item as $item){
      //contentデータ取得
      $content = $item->children('http://purl.org/rss/1.0/modules/content/');
      //dcデータ取得
      $dc_date = $item->children('http://purl.org/dc/elements/1.1/');
　　　　
      //取得したデータを変数に代入
      $data['date'] = date('Y年m月d日',strtotime($dc_date->date));
      $data['content'] = $content->encoded;
    }
  }
?>
```
YouTube Data API v3で特定の動画の再生回数を取得する

[Videos: list - YouTube — Google Developers](https://developers.google.com/youtube/v3/docs/videos/list)

例

```
https://www.googleapis.com/youtube/v3/videos?part=statistics&id=EJNPYff3lxU&fields=items%2Fstatistics&key={YOUR_API_KEY_HERE}
```

```
{
 "items": [
  {
   "statistics": {
    "viewCount": "48",
    "likeCount": "0",
    "dislikeCount": "0",
    "favoriteCount": "0",
    "commentCount": "0"
   }
  }
 ]
}
```

idにはカンマ区切りで複数のIDも指定可能（最大50個）

```
https://www.googleapis.com/youtube/v3/videos?part=statistics&id=EJNPYff3lxU%2CuYPYlfuuY_E&fields=items(id%2Cstatistics)&key={YOUR_API_KEY}
```

```
{
 "items": [
  {
   "id": "EJNPYff3lxU",
   "statistics": {
    "viewCount": "48",
    "likeCount": "0",
    "dislikeCount": "0",
    "favoriteCount": "0",
    "commentCount": "0"
   }
  },
  {
   "id": "uYPYlfuuY_E",
   "statistics": {
    "viewCount": "11",
    "likeCount": "0",
    "dislikeCount": "0",
    "favoriteCount": "0",
    "commentCount": "0"
   }
  }
 ]
}
```

API Keyは [Google APIs console](https://code.google.com/apis/console/‎) で作成します。

ここでは、サーバからYouTube APIにリクエストを送る構成とします。以下の手順でkeyを作成します。

* プロジェクトを作ります。
* [Services]を選んで[YouTube Data API v3]をONにします。
* [API Access]を選んで[Create new Server key...]でkeyを作成します。この時、アクセス元のIPアドレスを指定するようにします。

なお、[Create new Browser...]でkeyを生成すれば、ブラウザからJavaScriptでYouTube APIにアクセスすることも可能です。

が、アクセス制限はRefererでしかできないので、簡単に偽装されてしまいます。とはいえ、無料枠内で使うのであれば、誰でもAPI Keyは作れるので偽装される心配はあまりしなくて良い気もします。
Ruby(Motion)でmethodsを使ってメソッド検索


Rubyはirbで`methods`メソッドを使うことで、それぞれのオブジェクトに定義されているメソッドをインタラクティブに検索できて便利ですよね。

## メソッド検索用メソッド一覧

http://ruby-doc.org/core-2.0/

で`methods`という単語を含むメソッドは以下の通りです。

```
#instance_methods (Module)
#methods (Object)
#private_instance_methods (Module)
#private_methods (Object)
#protected_instance_methods (Module)
#protected_methods (Object)
#public_instance_methods (Module)
#public_methods (Object)
#singleton_methods (Object)
```

private, public等のスコープやインスタンスメソッドや特異メソッドのみ取り出すものがあるようですね。

ちなみに変数を検索するのもあります。(`variables`で検索)

```
#class_variables (Module)
#global_variables (Kernel)
#instance_variables (Object)
#local_variables (Kernel)
#thread_variables (Thread)
```

`constants`はクラスメソッドとインスタンスメソッドだけ。

```
::constants (Module)
#constants (Module)
```

以下の例では基本的に`methods`を使いますが、目的に応じて`public_methods`、`instance_methods`等に適宜置き換えてください。

## とりあえずアルファベット順にメソッド一覧をみてみる

```ruby:
hoge.methods.sort
```

めちゃくちゃいっぱいメソッドが出てくるがアルファベット順にソートしておくことで、こんなメソッドないかなーというのが探しやすくなります。

## grepしてみる

例えば`target`という文字を含むメソッドを探すには以下のようにします。
ここでは念のため`i`オプションを付けて大文字小文字を無視しています。CamelCaseを使うRubyMotionでは必須です。

```ruby:
hoge.methods.grep /target/i
```

## Object等の基底クラスで定義されているメソッドを取り除く

```ruby:
hoge.methods - Object.methods
```

`Object`は`ActiveRecord::Base`等、場合に応じて適当に変えてみて下さい。

ちなみに`instance_methods`の検索だったら、

```ruby:
hoge.instance_methods - Module.instance_methods
```


## スーパークラスに定義されているメソッドを取り除く

```ruby:
hoge.methods - hoge.class.superclass.instance_methods
```

```ruby:
hoge.class.methods - hoge.class.superclass.methods
```

`instance_methods`だったら、第二引数がinclude_superなので実は普通にできます。

```ruby:
hoge.instance_methods(false)
```

## ちなみに：pryが使える場合

pryの`ls`を使えばやりたいことは多分解決します。

```bash
[1] pry(main)> ls hoge
```

RubyMotionではpryが使えないので上の方法を組み合わせることで、メソッドをうまく探すと幸せになれるかもしれません。
RubyMotion 事始め


## [RubyMotion](http://www.rubymotion.com/)とは

* RubyでiOS, OS Xネイティブアプリを作る toolchain
* Cocoaフレームワークの上に薄いラッパをかけてRubyから使えるようにしている、よってRubyでCocoaフレームワークを使うというコーディングになる
* RubyMotionのコンパイラがRubyファイルをアセンブラにし、gccでobjファイルにする、そのためObjective-Cの実装と双方向でやり取りできる
 * Objective-Cの資産も活かせる
* ネイティブにリンクされるので実行時にJitでコンパイルする他のこの手のものと比べて実行速度が速い
* エディタは好きなものを選ぶ
* gemはRubyMotion用のgemしか使えない、[RubyMotion Wrappers](http://rubymotion-wrappers.com/)に有名なものがある
* [motion-cocoapods](https://github.com/HipByte/motion-cocoapods)を使えばCocoaPodsの実装も簡単に呼び出せる

## ライセンス

* **有償**, [RubyMotion](http://www.rubymotion.com/)のサイトから購入可能
 * 試してだめったら30日クーリングオフ可能
* 購入したバージョンについては有効期限はない
* 一年間はアップデートを無料で受け取れ、サポートがある
* 一年後からライセンスの半額で更新すると最新版のアップデートやサポートの権利を得られる

## 開発に必要なもの

* OS X 10.6 以上 (10.7以上推奨)
* RubyMotion
 * ライセンスを買うとインストーラがダウンロードでき ``/usr/bin/motion`` にインストールされる
* Xcode (IDE本体というより以下をインストールするために必要)
 * iOS SDK や OS X SDK
 * Xcode Command Line Tools
* お好きなエディタ

## motionコマンド

```
$ motion -v
2.0
$ motion --help
Usage:
  motion [-h, --help]
  motion [-v, --version]
  motion <command> [<args...>]

Commands:
  account      Access the software license account
  activate     Activate the software license
  create       Create a new project
  ri           Display API reference
  support      Create a support ticket
  update       Update the software
```

なんとなく``motion create``か``motion update``しか使わない予感。

``motion create --help``ってやったら``--help``ってプロジェクト作られたので注意。

## Hello, World

なんとなくシミュレータ不要なOS Xの方が試すのは楽かなと思ってOS Xでやってみる。

``motion create``でプロジェクト作成。

```bash:
motion create --template=osx Hello
```

こんな感じの階層。

![rubymotion_2013-05-31_1743.png](https://qiita-image-store.s3.amazonaws.com/0/2435/62fed195-2eda-4056-9796-795aec58b4b0.png "rubymotion_2013-05-31_1743.png")

チュートリアルに沿って ``app/app_delegate.rb`` にAlertを追加してみる。

```ruby:app_delegate.rb
class AppDelegate
  def applicationDidFinishLaunching(notification)
    buildMenu
    buildWindow
    
    # 追加
    alert = NSAlert.new
    alert.messageText = 'こんにちは'
    alert.runModal
  end

  def buildWindow
    @mainWindow = NSWindow.alloc.initWithContentRect([[240, 180], [480, 360]],
                                                     styleMask: NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask,
                                                     backing: NSBackingStoreBuffered,
                                                     defer: false)
    @mainWindow.title = NSBundle.mainBundle.infoDictionary['CFBundleName']
    @mainWindow.orderFrontRegardless
  end
end
```

``rake``で実行。

![rubymotion_2013-05-31_1744.png](https://qiita-image-store.s3.amazonaws.com/0/2435/c42decc0-da54-278e-1b47-95b892ffc14a.png "rubymotion_2013-05-31_1744.png")

これは便利だ。あとはサンプルプロジェクトを見ながら勉強していく。
https://github.com/HipByte/RubyMotionSamples
第11回オフラインリアルタイムどう書くの問題をRubyで解く

問題はこちらから。
http://nabetani.sakura.ne.jp/hena/ord11bitamida/

```rb:
def solve(q)
  bits = q.split('-').map{|i| [0] + ("%08b"%i.to_i(16)).chars.map(&:to_i) + [0]}
  (0..8).inject([]){|ans, i|
    pos = i + 1
    bits.size.times{|v|
      if bits[v][pos] == 0
        pos -= 1 while bits[v][pos-1] == 1
      elsif bits[v][pos-1] == 0
        pos += 1 while bits[v][pos] == 1
      end
    }
    ans[pos-1] = i
    ans
  }.join
end

DATA.readlines.each do |line|
  no,q,a = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans.to_s
  puts ans == a ? ' o' : ' x'
end
__END__
0	d6-7b-e1-9e	740631825
1	83-4c-20-10	123805476
2	fb-f7-7e-df	274056813
```
「ビットあみだくじ」

勉強会には参加してないけどおもしろそうなことしてたので勝手に参加。

##ルール
http://nabetani.sakura.ne.jp/hena/ord11bitamida/

##使用言語
候補には無かったけどAS3を使用。

##回答
個人的にビット演算はif文が少ないほうが美しい気がする。

```as:Test189.as
package  
{
	import flash.display.Sprite;
	
	public class Test189 extends Sprite 
	{
		private var count: int;
		
		private function solve(amida: String): String 
		{
			var i: int, j: int, p: int, v: int, t: int;
			var yoko: uint = parseInt(amida.split("-").join(""), 0x10);
			var res: String = "";
			for (i = 0; i < 9; i++) 
			{
				for (j = 0, p = i; j < 4; j++) 
				{
					v = ((yoko >> (j << 3)) & 0xFF) << 1;
					t = (v >> p) & 3;
					while (t == 1) t = (v >> --p) & 1;
					while (t == 2) t = (v >> ++p) & 2;
				}
				res = (8 - p) + res;
			}
			return res;
		}
		
		private function test(amida: String, answer: String): void
		{
			var reply: String = solve(amida);
			if (reply == answer) 
				trace(count + " : OK [" + reply + "]");
			else
				trace(count + " : NG");
			count++;
		}
		
		public function Test189() 
		{
			/*0*/ test( "d6-7b-e1-9e", "740631825" );
			/*1*/ test( "83-4c-20-10", "123805476" );
			/*2*/ test( "fb-f7-7e-df", "274056813" );
			/*3*/ test( "55-33-0f-ff", "123456780" );
			/*4*/ test( "00-00-00-00", "012345678" );
			/*5*/ test( "00-00-00-55", "021436587" );
			/*6*/ test( "40-10-04-01", "021436587" );
			/*7*/ test( "00-00-aa-00", "103254768" );
			/*8*/ test( "80-20-08-02", "103254768" );
			/*9*/ test( "ff-7e-3c-18", "876543210" );
			/*10*/ test( "aa-55-aa-55", "351708264" );
			/*11*/ test( "55-aa-aa-55", "012345678" );
			/*12*/ test( "db-24-db-e7", "812543670" );
			/*13*/ test( "00-01-00-40", "021345687" );
			/*14*/ test( "00-00-80-00", "102345678" );
			/*15*/ test( "01-40-00-00", "021345687" );
			/*16*/ test( "00-00-00-02", "012345768" );
			/*17*/ test( "00-00-02-00", "012345768" );
			/*18*/ test( "00-14-00-00", "012436578" );
			/*19*/ test( "00-00-01-40", "021345687" );
			/*20*/ test( "00-80-01-00", "102345687" );
			/*21*/ test( "c8-00-00-81", "120354687" );
			/*22*/ test( "05-48-08-14", "021435687" );
			/*23*/ test( "24-05-00-f0", "413205687" );
			/*24*/ test( "40-08-14-01", "021536487" );
			/*25*/ test( "18-c8-80-80", "210534678" );
			/*26*/ test( "1c-88-52-00", "120564738" );
			/*27*/ test( "ec-dc-67-62", "213468705" );
			/*28*/ test( "0a-b6-60-e9", "035162784" );
			/*29*/ test( "52-d6-c6-c2", "120345678" );
			/*30*/ test( "47-e7-b0-36", "231047658" );
			/*31*/ test( "0f-85-91-aa", "108263754" );
			/*32*/ test( "76-b6-ed-f3", "601435782" );
			/*33*/ test( "f5-5e-f7-3d", "025847163" );
			/*34*/ test( "dd-e7-fb-f9", "610247538" );
			/*35*/ test( "8f-f4-af-fd", "583246017" );
			/*36*/ test( "bf-fb-cb-f7", "105382674" );
			/*37*/ test( "e5-fd-ff-ff", "512046378" );
			/*38*/ test( "ef-df-ef-fe", "713205648" );
			/*39*/ test( "bf-7f-fd-d7", "826437105" );
			/*40*/ test( "36-ff-df-de", "814527603" );
			/*41*/ test( "6f-dd-ff-ff", "230685147" );
		}
	}
}
```
[ccchart] いろいろなチャートサンプルを一覧できるページ

ccchartのv1.06.2をリリースしましたが、最近 Qiita に全然書いてないので、この機にちょっとだけ書いときます。

えーと、ちかごろ ccchart に追加された機能は、ページ内のすべてのチャートに共通する設定をまとめてグローバルプロパティとして指定できる ccchart.base メソッド とか、バグフィックスとかバグフィクスとかバグフィクスとかいろいろやってました。

Updateの歩み
http://ccchart.com/update.json

Memoとか
http://ccchart.com/#memo

で、まぁ、なにはともあれ、実際にチャート出力したサンプル一覧みたいなページもあると便利かなぁということで、こんなの作りました。
![ccchart showcase](http://ccchart.org/doc/img/ccchart-showcase.png)

ここです。http://ccchart.com/test/showcase.htm

実際に30個以上のチャートを描画してますが、まぁ、そんなにストレスは高くないかなぁと。

＊もちろん、ccchart のバリエーションはこれだけじゃなくて、もっと、無数にあるんですけどね。
ディスパッチグループを使ってタイムアウトつきインジケータの表示

GCDのグループ機能を使ってタスクを同期してみた例。500ミリ秒以内に終わる場合はインジケータを表示しないような処理。

```objc:
- (IBAction)anAction:(id)sender
{
    dispatch_queue_t q_global, q_main;
    static BOOL busy = NO;
    
    if (!busy) {
        busy = YES;
        q_global = dispatch_get_global_queue(0, 0); // 計算用の非同期キュー
        q_main = dispatch_get_main_queue(); // 描画用のメインキュー
        dispatch_group_t grp = dispatch_group_create(); // タスク同期用のグループ作成

        // メインの処理を同期用のグループにディスパッチ
        dispatch_group_async(grp, q_global, ^{
            // タイムアウト用のタスクはグループには追加しない
            dispatch_async(q_global, ^{
                if (dispatch_group_wait(grp, dispatch_time(DISPATCH_TIME_NOW, 500*1000*1000))) { // 500ミリ秒待ってやる

                    // インジケータを用意
                    UIActivityIndicatorView *indicator;
                    indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
                    indicator.contentMode = UIViewContentModeCenter;
                    indicator.center = self.tvResults.center;
                    indicator.hidesWhenStopped = TRUE;
                    [indicator startAnimating];
                    
                    dispatch_async(q_main, ^{
                        // インジケータを表示
                        [self.view addSubview:indicator];
                    });
                    
                    // グループの終了を待ってインジケータを消去
                    dispatch_group_notify(grp, q_main, ^{
                        [indicator removeFromSuperview];
                        [indicator release];
                        dispatch_release(grp); // グループの解放
                    });
                } else {
                    dispatch_release(grp);
                }
            });
            
            heavyWork(); // 時間のかかる処理

            // 結果の表示
            dispatch_group_async(grp, q_main, ^{
                [self.tvResults reloadData];
            });
            busy = NO;
        });
        
    }
}

```
ALMiniumへWindowsからpushした日本語ファイル名が化ける件ッ！

先日、試しに構築したALMiniumでハマった文字コードについてメモします。どういう経緯で解消出来たかをつらつら書き留めるだけで、よけいな事しているかもしれません。そして間違っていたらごめんなさい…。

## 何があった？
ぼちぼち社内でGit導入をしたく、布教のために一つ検証用のリモートリポジトリを作ろうと思ったわけです。

せっかくだからTracとかRedmineも起ち上げてみようと思い、色々と楽が出来そうなALMiniumをインストールしてみました。特に問題なくインストール、起動までは確認。でもGitはそのままでは日本語ファイル名の扱いが上手でなかったのです。リポジトリブラウザでファイル名が化け化け。

## 今回の環境
### ホスト側
* CentOS 6.4
* 最新版のALMinium
    - Redmine 2.2.4.stable
    - Ruby 1.9.3
    - Rails 3.2.13

### クライアント側
* Windows7 (64bit)
* msysgit 1.8.3
* TortoiseGit 1.8.0.0

## まずはクライアント側
とりあえず諸々の導入はすっ飛ばします。で、コミットログとかの化けを解消する方法も他に譲ります。同じ方法で解消出来ます。で、今回やったのは…特にありません。

## 次にホスト側
ホスト側の設定ファイルを以下のようにしました。設定ファイルがどこにインストールされたかわからず、結構捜索しました…。うちの環境ではここで発見。

```/var/opt/alminium/git/<project name>/config```

> 【追記】どうやら/etc/の下にconfigファイル作ればシステム全体に適用されるみたいですね。
> [こちら](http://git-scm.com/book/ja/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-%E6%9C%80%E5%88%9D%E3%81%AEGit%E3%81%AE%E6%A7%8B%E6%88%90 "リレファンス")にしっかり書いてありました…。

多分どこかにグローバル設定ファイルがあると思うんですが、今回はとりあえずプロジェクト単位で。次の１行を追加すると日本語ファイル名の化けが解消できました。

```
[core]
    quotepath = false
```

## めでたしめでたし
これでとりあえず「日本語使えないならヤダ！」というクレームは回避できそうです。WindowsのGitクライアントも問題なく動作するので「KUROIGAMEN」を見ると蕁麻疹が出るような方々にも布教できそうな予感。徐々に浸透させるべく邁進です。
symlinkで複数モジュールの管理を楽に

Node.jsで複数モジュールを扱う場合は、

```sh
npm install -g symlink
```

でインストールできるsymlinkがとっても便利です。

例えばparent/child/grandchildというモジュールがあり、

	parent <- child <- grandchild

という依存関係にあった場合、モジュールを配置したディレクトリ上に移動して、

```sh
symlink -r .
```

とするだけ。これだけでparent/child/grandchild全ての依存関係が解決された状態になります。

これをsymlinkを使わずにやろうとすると、全てのモジュールをチェックして依存関係を整理し、依存する順番にnpm linkを実行する必要があります（symlinkはこれをやってくれている）。

```sh
cd hoge-parent && npm link
cd ..
cd hoge-child && npm link
cd ..
cd hoge-grandchild && npm link
```

parent/child/grandchildみたいな依存関係がなくても、全てのモジュールの依存関係をコマンド一つで解決してくれるのはとても便利じゃないかと！
symfony1.4 のプラグインを composer で管理


## composer 対応プラグイン

```composer.json
{
    "require": {
        "propel/sf-propel-o-r-m-plugin": "dev-master"
    }
}
```

[propelorm/sfPropelORMPlugin · GitHub](https://github.com/propelorm/sfPropelORMPlugin)

## symfony-project のプラグイン

```composer.json
{
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "symfony-project/sfImageTransformPlugin",
                "type": "symfony1-plugin",
                "version": "0.0.1",
                "source": {
                    "url": "http://svn.symfony-project.com/plugins/sfImageTransformPlugin/",
                    "type": "svn",
                    "reference": "trunk/"
                }
            }
        }
    ],
    "require": {
        "composer/installers": "*",
        "symfony-project/sfImageTransformPlugin": "*"

    }
}

```

[Plugins | sfImageTransformPlugin | 1.4.1 | symfony | Web PHP Framework](http://www.symfony-project.org/plugins/sfImageTransformPlugin)

## プライベートリポジトリの hogeTestPlugin

あらかじめプラグインリポジトリにcomposer.jsonを用意しておく。

```composer.json
{
    "name": "hoge/hoge-test-plugin",
    "type": "symfony1-plugin",
    "description": "symfony 1.x plugin.",
    "homepage": "https://bitbucket.org/hoge/hoge-test-plugin",
    "require": {
        "composer/installers": "*"
    }
}
```

```composer.json
{
    "repositories": [
        {
            "type": "vcs",
            "url": "git@bitbucket.org:hoge/hoge-test-plugin.git"
        }
    ],
    "require": {
        "hoge/hoge-test-plugin": "dev-master"
    }
}

```

プラグイン名は↓のルールで変換される。

```php:Symfony1Installer.php
    /**
     * Format package name to CamelCase
     */
    public function inflectPackageVars($vars)
    {
        $vars['name'] = preg_replace_callback('/(-[a-z])/', function ($matches) {
            return strtoupper($matches[0][1]);
        }, $vars['name']);

        return $vars;
    }
```
Homebrewでdnsmasqをインストールして、Web開発用にDNSサーバを立てる


dnsmasqでDNSサーバを立てて、動的にバーチャルホストを設定する。

# 環境

* Mac OSX 10.8.2
* Homebrew
* dnsmasq 2.65

# インストール

```sh
brew install dnsmasq
```

# dnsmasqの設定

設定ファイルをコピーする。

```sh
$  /usr/local/Cellar/dnsmasq/2.65/dnsmasq.conf.example /usr/local/etc/dnsmasq.conf
```

以下をdnsmasq.confに追記

```
listen-address=127.0.0.1
address=/.dev/127.0.0.1

```

# 起動

```sh
sudo cp `brew --prefix dnsmasq`/homebrew.mxcl.dnsmasq.plist /Library/LaunchDaemons
sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
```

# 確認

``` sh
host hoge.dev
hoge.dev has address 127.0.0.1
```

# apacheの設定

``` apache
<Virtualhost *:80>
    VirtualDocumentRoot "/path/to/your/workspace/%1"
    ServerName vhosts.dev
    ServerAlias *.dev
    UseCanonicalName Off
    <Directory "/path/to/your/workspace/%1">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</Virtualhost>
```

毎回プロジェクト毎に"xxx.dev"のようなドメインでアクセスできるように、httpd.confとhostsファイルを設定していたけど、これで設定の必要がなくなる。
プロジェクト毎にフォルダ構成が違ったりドキュメントルートが違ったりする場合は、適当にフォルダ作ってアクセスしたいサブドメイン名でシンボリックリンクをそのフォルダに作ればいい。
Rubyでhashの要素を処理して、hashを返す

# 例
どうしてもhashのkeyを全てシンボルにしたくなった場合

```ruby
require 'yaml'

yaml = YAML.load_file("sample.yml")

h1 = Hash[
  *yaml["a"].keys.map{|key|
    [key.to_sym, yaml["a"][key]]
  }.flatten(1)
]

p yaml["a"]
p h1
```

* sample.yml

```yaml
a: 
    b1: c1
    b2: c2
    b3: c3
    b4: c4
```

## 実行結果

```
{"b1"=>"c1", "b2"=>"c2", "b3"=>"c3", "b4"=>"c4"}
{:b1=>"c1", :b2=>"c2", :b3=>"c3", :b4=>"c4"}
```

ほら、keyがシンボルになっているでしょ！
（今回の例だと、「yaml側でシンボルにしろよ！」って言われる場面なのですが、そこに触れてはダメです。）

# なにをしているの？

[singleton method Hash.[]](http://doc.ruby-lang.org/ja/1.9.3/method/Hash/s/=5b=5d.html)

> 以下は配列からハッシュを生成する方法の例です。
> (2) キーと値のペアの配列からハッシュへ

> ```ruby
alist = [[1,"a"], [2,"b"], [3,["c"]]]
p Hash[*alist.flatten(1)]  # => {1=>"a", 2=>"b", 3=>["c"]}

というのを使っています。

## 例に挙げたコードを分解してみる

### yamlファイルから読み取る

```ruby
yaml = YAML.load_file("sample.yml")
p yaml #=> {"a"=>{"b1"=>"c1", "b2"=>"c2", "b3"=>"c3", "b4"=>"c4"}}
```

* ここは今回のメインではないです

### キーをシンボルに変更した配列を作成し、平滑化する

```ruby
array = yaml["a"].keys.map{|key|
  [key.to_sym, yaml["a"][key]]
}
p array #=> [[:b1, "c1"], [:b2, "c2"], [:b3, "c3"], [:b4, "c4"]]
p array.flatten(1) #=> [:b1, "c1", :b2, "c2", :b3, "c3", :b4, "c4"]
```

* [flatten(lv = nil) -> Array](http://doc.ruby-lang.org/ja/1.9.3/class/Array.html#I_FLATTEN)

> 平滑化の再帰の深さを整数で指定します。
> nil を指定した場合、再 帰の深さの制限無しに平滑化します。 
> 整数以外のオブジェクトを指定した場合は to_int メソッドによる暗 黙の型変換を試みます。

* keys.mapの中の処理を変えれば、hashのkeyだけではなくて、valueも自由自在ですね！

### キーと値のペアの配列からハッシュを作る

```ruby
# array #=> [[:b1, "c1"], [:b2, "c2"], [:b3, "c3"], [:b4, "c4"]]
h1 = Hash[*array.flatten(1)]
p h1 #=> {:b1=>"c1", :b2=>"c2", :b3=>"c3", :b4=>"c4"}
```

# まとめ
* hashを素にarrayを作ってhashにすれば、一応出来る

配列からハッシュが作れるとか知らなかった僕なのでした（笑
今回、例に挙げたコードは実用性が無いな〜。
何に使えるんだろ？

用途、募集中です（苦笑

# 追記

## 追記1
yuku_tさんにコメントで教えて頂きました！

> ちなみにRailsにはHash#symbolize_keysとHash#symbolize_keys!っていう、ほぼ同じことをしてくれるメソッドがあります :)
> [rails / activesupport](https://github.com/rails/rails/blob/b2f73c40b8a995ed685fc76f2df724b15ead16b6/activesupport/lib/active_support/core_ext/hash/keys.rb#L24)

> ```ruby
  def symbolize_keys!
    keys.each do |key|
      self[(key.to_sym rescue key) || key] = delete(key)
    end
    self
  end
```

ぉぉ〜。 keyをシンボル化したいだけなら、こっちですな！！

## 追記2
hilohiroさんにコメントで教えて頂きました！

```ruby
require "yaml"

yaml = YAML.load_file("sample.yml")

h1 = Hash[
  yaml["a"].map{|key, value|
    [key.to_sym, value]
  }
]
```

Hash#mapってarrayが返るんですね！
知りませんでした（＝ｗ＝；
少しずつ、シンプルになる感じがいいですね〜（＝ｗ＝
macro マクロとマクロクラス

"macro" は、実は MacroMacro という名前の「Boo マクロ」です。Boo 処理系は「Macro」で終わる名前のクラスを「マクロ」とみなすようになっていて、"macro" はそれを使って実装されています。

* Booソースの、 src/Boo.Lang.Extensions/Macros/MacroMacro.boo が "macro" の実装です。

次の macro を使った例は、macro を使わずに書けます。

```boo
# qiita で booってタグがえらべるようになったよ！
macro hello:
    return [|
        print "hello"
    |]

hello  # print "hello" に置き換わる
```

macro を使わないなら次のようになります。

```boo
import Boo.Lang.Compiler
import Boo.Lang.Compiler.Ast

# Macro で終わる名前のクラスはその前のHelloという名前のマクロ定義となります。
class HelloMacro( AbstractAstMacro ):
	def Expand( mc as MacroStatement ) as Statement:
		return [|
			print "hello"
		|]

hello
```

よって、正しく表現するなら、macro の方は「macro マクロ」と呼ぶ方が良いように思います。

通常使う分には macro マクロの方が次の点で便利です。

* class定義とか、継承元（AbstractAstMacro以外にもイロイロ選択肢がある）選択とかしなくていい。
* パターンマッチングが使いやすい。macroマクロの場合、match .. と書かずにいきなり case [|...|] と書ける。
* ネストしたマクロも書きやすい。子供マクロも macro で定義してちゃんと動作する（class ...Macro だと、内部でまた class ... と書かなければならない）。

macro マクロで不便になるのは次の場合なので、こういった時だけ class ..Macro(...): と直接 class を使って定義します。

* 他のマクロクラスを継承して使いたい（マクロ自体の機能拡張）。macro マクロは継承元を選択できない。
* いくつかのマクロで実装を共有したい。共有したいメソッド等を含むクラスを用意して、各マクロクラスで継承するなりcompositeするなり。
* その他、macro マクロ内では難しい機能（外部クラスのメソッドを呼ぶ、等）を実装する場合。
playフレームワークのサンプルwebsocket-chatを動かす

[https://github.com/playframework/Play20/tree/master/samples/scala/websocket-chat](https://github.com/playframework/Play20/tree/master/samples/scala/websocket-chat)
にあるPlayフレームワークのサンプルを動かそうとしたら

```text:
[error] websocket-chat/app/controllers/Application.scala:37: object js is not a member of package views
[error]     Ok(views.js.chatRoom(username))
[error]              ^
[error] one error found
[error] (compile:compile) Compilation failed
[error] application - 
```

というエラーがでて動かない。


[http://stackoverflow.com/questions/16235446/render-a-playframework2-javascript-as-template](http://stackoverflow.com/questions/16235446/render-a-playframework2-javascript-as-template)
を見ると、viewsで使える拡張子は".html, .xml or .txt"らしい。
じゃ、なんでサンプルでは"views.js.chatRoom"みたいな書き方をしているのかがわからない。

わからないが、
app/views/chatRoom.scala.js　を　app/views/chatRoomJS.scala.html
にファイル名を変更し、また、
app/controllers/Application.scalaを以下のように修正したら動いた。

```scala:app/controllers/Application.scala
  def chatRoomJs(username: String) = Action { implicit request =>
    Ok(views.html.chatRoomJS(username)).as("application/javascript")
  }

```

とりあえず、動いたからいいか…

## 補足
AWSのEC2のmicroインスタンスを使って試したら、メモリーが足りないと
怒られたので、[１分でできる！AmazonEC2のmicroインスタンスでswap領域を作る](http://qiita.com/items/be026d978ef5dcf1e44e)
を参考にスワップファイルを作成、また、javaのオプションでメモリの割当を
試行錯誤して以下のようにした。

```bash
export _JAVA_OPTIONS="-Xms128m -Xmx512m -XX:PermSize=256m -XX:MaxPermSize=512m"
```

javaのオプションの意味はよく調べずに適当に書いたのでおかしい点があるかもです。