OmniAICreator/Qiita-1.07M huggingface dataset:
NSScrollViewの内容センタリング


なんか、ネットで探すと色々皆さん工夫して色々書いてるんだけど、煎じ詰めるとこれだけで良い気がする。

`constrainBoundsRect:` は OS X 10.9 からなので、それ以前に対応する場合は deprecated な `constrainScrollPoint:` をオーバーライドすれば良い。


```objc:MyCenteringClipView.h
#import <Cocoa/Cocoa.h>

@interface MyCenteringClipView : NSClipView
@end
```
```objc:MyCenteringClipView.m
#import "MyCenteringClipView.h"

@implementation MyCenteringClipView

- (NSRect)constrainBoundsRect:(NSRect)proposedBounds
{
    NSRect documentBounds = [[self documentView] bounds];
    NSPoint delta         = NSMakePoint(NSWidth(documentBounds)  - NSWidth(proposedBounds),
                                        NSHeight(documentBounds) - NSHeight(proposedBounds));
    
    CGFloat x = (delta.x < 0) ? (delta.x / 2) : MAX(0, MIN(proposedBounds.origin.x, delta.x));
    CGFloat y = (delta.y < 0) ? (delta.y / 2) : MAX(0, MIN(proposedBounds.origin.y, delta.y));
    proposedBounds.origin = NSMakePoint(floor(x), floor(y));
    
    return proposedBounds;
}

@end
```

ちな、documentViewは `intrinsicContentSize` で自分のサイズを返すようにしてます。

手元で試してる限りでは、これだけでちゃんと動いてる。
zsh で 例外処理

zsh はプログラム言語で言うところの try/catch のような例外処理ができるので紹介する。

### シンプルな例

書き方はこんな感じ。

```zsh
#!/bin/zsh

autoload -Uz catch
autoload -Uz throw

{
  echo hoge
  throw 'MyException'
  echo fuga
} always {
  if catch 'MyException'; then
    echo "catch MyException!"
  fi
}
```

例外を投げるには `throw`、受け取るには `catch` という関数を使う。まずは両方とも `autoload` しておく。

例外処理をするときは全体を

```zsh
{
  # try ブロック
  # ここにメイン処理を書く
} always {
  # always ブロック
  # 例外が発生した時もそうでない時も実行される
}
```

という形で書く。
always ブロックは例外が発生したかどうかにかかわらず常に実行されるので、この中で `catch` を使って例外が発生したかどうか判定すれば例外をキャッチできる。

この例を実行した結果はこんな感じ。

```
% ./exception_sample.zsh
hoge
catch MyException!
```

例外を投げた時点でうまく always ブロックに移行してるのが分かる。

### 複数の例外の種類を考慮する例

もうちょっと複雑な例を見てみる。

```zsh
#!/bin/zsh

autoload -Uz catch
autoload -Uz throw

{
  lock_dir_name="lock_dir"

  mkdir $lock_dir_name || throw 'LockException'

  # メイン処理
  # ...

  rmdir "$lock_dir_name"
} always {
  if catch '*'; then
    case $CAUGHT in
      (LockException)
        echo "LockException"
        ;;
      (NetworkException)
        echo "NetworkException"
        ;;
      (*)
        echo "other Exception"
        ;;
    esac
  fi

  # 後処理が必要ならここに書く
  # 例外が発生するかどうかにかかわらず実行される
  # 他の言語で言う finally に相当する

  echo "tear down"
}
```

このスクリプトでは、ディレクトリを作って排他制御をしてる。ロックの取得に失敗したときはすぐに例外を投げてメイン処理を行わないようになってる。

この例のように `catch` の引数はワイルドカードが使えるので、`catch '*'` とすればどんな名前の例外でもキャッチできる。どんな例外もキャッチして、例外の種類ごとに違うことをしたい場合はこんなふうに書くとうまくいく。

その他詳しいことは man zshcontrib の EXCEPTION HANDLING や man zshmisc の COMPLEX COMMANDS の `{ try-list } always { always-list }` を参照。

こんな感じで例外処理を使うとエラー処理がシンプルに書けるようになるので、ぜひ試してみてください!
組み込み関数


はい。元々はこちらにきれいな解説がありますが
[http://docs.python.jp/2.7/library/functions.html](http://docs.python.jp/2.7/library/functions.html)

自分の手で挙動を試してみたメモ書きなど
順次追記します。多分。。。

######cmp(x,y)
-二つのオブジェクト x および y を比較し、その結果に従って整数を返します。戻り値は x < y のときには負、 x == y の時にはゼロ、 x > y には厳密に正の値になります。

```python:cmp(x,y)
cmp(8,20)
-1
cmp(30,6)
1
cmp(15,15)
0
#x,y のいずれか、若しくは両方が負の数で合った際も比較結果に基づいて-1,1,0が返ってくる挙動は変わらず。

#if文に使った場合の挙動
print 'true' if cmp(6,10) else 'false'
true

print 'true' if cmp(18,10) else 'false'
true

print 'true' if cmp(18,18) else 'false'
false
#x,yが等しい、cmpの返り値が0の場合のみelse節が発動されるっぽい
#真/偽が1/0ではなくて、(0以外の値)/0という判定なのかな
#とりまよnot()で反転？させることも出来るっぽい。
print 'true' if not(cmp(18,18)) else 'false'
true

print 'true' if not(cmp(18,19)) else 'false'
false
```

######ord

```python:ord.py
>>> ord('a')
97
>>> ord('z')
122
>>> ord('z')
122
>>> ord('A')
65
>>> ord('Z')
90
>>> ord(90)
#エラーになる
>>> ord('90')
#エラーになる
>>> ord('$')
36
>>> ord('9')
57
>>> type(ord('A'))
<type 'int'> #intで返って来てるらしい
```
Looperを使って常にテストを回そう #golang

# Looper

Rubyにおける[Guard](https://github.com/guard/guard)みたいな、ファイルを監視して
テストを回してくれる、そんな便利なライブラリがないかな、って
探してみたら[Looper](https://github.com/gophertown/looper)というものがあった。

早速使ってみることにした。

# セットアップ

自分の環境はMac OS XなのでREADME.mdに書かれている通り、readlineをインストールする

```
brew install readline
```

そしてlooperのインストール(go get)

```
go get -u github.com/gophertown/looper
```

# 実行してみる

looperは、goのファイルが書き換えられると
go testを走らせる。

## looperを起動する

```$GOPATH/bin``` に$PATHが通っていれば、```looper``` コマンドを
対象となるプロダクトコードがあるディレクトリ上で叩けば良い。

ここで使ったプロダクトは自分で書いた[fizzbuzz.go](https://github.com/futoase/fizzbuzz-go)で、
```$GOPATH/src/github.com/futoase/fizzbuzz-go```にディレクトリを移動している。

![first.gif](https://qiita-image-store.s3.amazonaws.com/0/3985/fa8ca152-ff28-ee1f-84ae-fff69a12e8cc.gif)

...アスペクト比がおかしい...

## テストの実行をlooperに実行してもらう

あとはgoのソースコードを編集すれば逐次テストを動かしてくれる。

![second.gif](https://dl.dropboxusercontent.com/u/614755/qiita/advent-calendar-go/second.gif)

# その他

looperにはファイルの動的な監視以外にも、
```a``` を入力すると全てのテストファイルを実行するというオプションも有る。

looper良さそうだなと思った(小並感
... ネタ探しは前日までにやっておくべきだと悟った。
GASからYouTube関係のサービスが増えたのでやってみたよ。

今日のGoogleAppsScriptのアドベントカレンダーに隙間があったので、あわてて参加します。
よろしくおねがいします。

先日、このようなうれしいお知らせが出ていたので、さっそく写経してみた報告です。
[Building on YouTube APIs in the cloud with Google Apps Script](http://apiblog.youtube.com/2013/12/building-on-youtube-apis-in-cloud-with.html)

#GASからYouTubeのキーワード検索して、ログに出力するのをやってみる。

##1) 新規にスクリプトを作る。
Google Drive →　作成　→　スクリプト　→　好きな名前を付けて保存する。
保存しないと次へ進めません。

##2) YouTube APIの追加
リソース　→　Advanced Google Services
![20131219_GAS_Youtube.png](https://qiita-image-store.s3.amazonaws.com/0/12298/c7f8db00-84dc-efdd-8815-0a06ff5f945e.png)

①YouTube Data API と、 YouTube Analytics API をONにします。
②These serveces must also be enabled in the Google Developers Console.の青いリンク先をクリックして、①と同様にYouTube Data API と、 YouTube Analytics API をONにします。

##3) あとはコーディング。
せっかくなので、html5jの動画を検索してみるサンプルです。

```js:searchByKeyword.js
function searchByKeyword() {
  var keyword = "html5j";
  var results = YouTube.Search.list("id,snippet",{q :keyword , maxResults: 5});
  for(var i in results.items) {
    var item = results.items[i];
    Logger.log("[%s] Title: %s", item.id.videoId, item.snippet.title);
  }
}

```

ログはこんな感じで、先日のカンファレンス動画とか入っているのがわかります。

```

[13-12-19 01:54:46:686 JST] [undefined] Title: html5j
[13-12-19 01:54:46:686 JST] [98MKy-0K8bU] Title: ようこそ、HTML5裏APIの世界へ - HTML5 Conference 2013 -
[13-12-19 01:54:46:687 JST] [rB_nl_P49Ag] Title: スペシャルセッション - HTML5 カンファレンス 2013
[13-12-19 01:54:46:687 JST] [Bw_rHvmInrI] Title: html5j自動車部 勉強会 #1
[13-12-19 01:54:46:687 JST] [KEkR1ox_K10] Title: Google I/O 2011: GWT + HTML5: A web developers dream!
```


##リファレンスはこのへんです。
[Google Apps Script / YouTube Service](https://developers.google.com/apps-script/advanced/youtube)

それでは、みなさんよいGASライフを！
VirtualBox: 「VT-x is not available」エラーで仮想マシンが起動しない際の対処方法

みなさま、はじめまして。 @keiichiroy こと 山本慶一郎と申します。
Qiita初投稿です。日頃からお世話になっているので、ハマったことや調べたことを誰かの役に立てるよう、書いていきたいと思います。

最近自宅や会社でVagrantやPackerを使ってVirtualboxに触れることが多いのですが、違う環境で実行すると、思わぬエラーにぶつかるなんてこと、ありますよね？ はい、自分も例外に漏れず、です。

表題の症状は、原因から書くと「ハードウェア仮想化(VT-x)のサポートがないCPU環境でVT-xを使おうとしていたため」です。文字にすると当たり前なのですが、PackerやらVeeweeなど、間接的にVirtualBoxを扱っていたため、気付くのが遅れました...orz

仮想マシンの構成ファイルが納められているフォルダのログ出力が下記のような状態であれば、この症状に該当すると思われます...(が、必ずしもです。ハードウェアがサポートしているのにBIOSで無効化されているだけの場合もあるので、まずはそちらに設定項目がないか確認することをおススメします！)

症状
---
VirtualBox VMが起動しない。かつ、ログに``VT-x is not available``や``VERR_VMX_NO_VMX``等の出力がある。
(ログはWindows 7でVirtualBoxをデフォルトインストールした場合、下記のようなパスになります。ログローテーションで末尾に.1とか.2とかついているかもしれません)

```
C:\Users\(ユーザ名)\VirualBox VMs\(仮想マシン名)\Logs\VBox.log
```

自分の場合だと、ログファイルの末尾が下記のようなエラーで異常終了していました。

```VBox.log
00:00:01.274363 VMSetError: D:\tinderbox\win-4.3\src\VBox\VMM\VMMR3\HM.cpp(531) int __cdecl HMR3Init(struct VM *); rc=VERR_VMX_NO_VMX
00:00:01.274401 VMSetError: VT-x is not available.
00:00:01.274969 ERROR [COM]: aRC=E_FAIL (0x80004005) aIID={8ab7c520-2442-4b66-8d74-4ff1e195d2b6} aComponent={Console} aText={VT-x is not available. (VERR_VMX_NO_VMX)}, preserve=false
00:00:01.284319 Power up failed (vrc=VERR_VMX_NO_VMX, rc=E_FAIL (0X80004005))
```

対策
---
VirturlBoxの管理コマンドを使って書くと、以下の操作を行ってハードウェア仮想化をオフにします。仮想マシンを管理するVBoxManageコマンドを直接使うなら、下記の2項目をオフに変更します。

```
VBoxManage modifyvm (VM名) --hwvirtex off
VBoxManage modifyvm (VM名) --vtxvpid off
```

Packerのテンプレートだと、builderセクションに下記のようなVMオプションを指定することになります。

```
  "builders": [
    {
      "type": "virtualbox",
           ...(中略)...
      "vboxmanage": [
        [
          "modifyvm",
          "{{.Name}}",
          "--hwvirtex",
          "off"
        ],
        [
          "modifyvm",
          "{{.Name}}",
          "--vtxvpid",
          "off"
        ],
           ...(中略)...
    }
  ],
...(次のセクション)...
```

それと、今回の症状に該当する方は、32bit用のOSしかインストールできません！64bit環境のVMを作成する際に仮想化支援の機能が必要になるためです。この点も注意が必要ですね。

また、上述したように「本当は物理ハードウェア側で仮想化サポートしているのに、単にBIOSで有効になっていないだけ」というケースがあります。この場合は、BIOSの設定をオンするだけで解決するかもしれません！(自分の場合はいくら確認してもVT-xやAMD-V項目が見当たらない安価ノートPCだったので、上記の方法を実践しました...)

参考URL
---
* [Disabling VT-X in VirtualBox (on Linux)](http://zachzimm.com/blog/?p=162 "Zach's Technical Notes") - 英語。Linuxとありますが、Windowsでも適用可能でした。
* [仮想化支援機能(VT-x/AMD-V)を有効化できません](http://d.hatena.ne.jp/yohei-a/20110124/1295887695 "ablog")

所感
---
まだまだ日本語の情報が少なくて使うのが大変なDevOps分野かと思いますが、自分もいろんな人のブログを参考にひたすらビルドを実践している最中です。特に、Veeweeで生成したテンプレートをveewee-to-packerで変換してPackerビルドをいじるのは良い勉強になります。

ビルドしてもsshログインできない..なんてテンプレートにハマったり..と大変なこともありますが、その辺も踏み固められるように、上手いビルドテンプレートが作れたら随時公開してみたいと思います！
eclipseのSave Actions(保管アクション)を設定する


Javaに限らず、ソースコードの整形（フォーマット）に手を取られるのはムダなことです。
最近のIDEは自動整形を当然のように備えていますが、自動整形を自動で実行するのが、eclipseの __Save Actions(保管アクション)__ 。

Save Actionsをうまく使えば、ソースコードの整形だけでなくいろんな処理をソース保存時に行えるようになります。
初めはソースが勝手にごそっと書き換わるので戸惑いますが、慣れると機械的な作業に一切手を取られなくなるので劇的にコーディングが早くなります。

# 設定箇所
eclipseの __環境設定__ から設定します。

```
Java → Editor → Save Actions
```

# 設定内容

最低でも次の２つは有効にしておきましょう。

* Format source code
* Organize imports

これでソース保存時にソースコード整形とimport文の整理が行われます。

これに加えて、私は次のような設定を追加しています(抜粋)。

* フィールドアクセスに```this```を保管
* 各変数に可能な限り```final```を付与
* 不要なキャストを除去
* メンバのソート
* 空白文字の統一

などなど・・・

結局のところ Clean up で行うのと同じことをやりたいのですが、Save Actionsに「Clean upと同じことを行う」という設定がないので、別途設定するしかないのです。
この点は非常に残念。

# まとめ
Save Actionsをうまく使って機械的作業から逃れ、人間にしか出来ない作業に没頭出来る環境を手に入れましょう！
PostgreSQLでシーケンスを今の最大値にリセットする

レコードはあるがシーケンスの値が消えてしまった、なんて時に `select setval('table_col_seq', 123)` みたいなのを叩くので、そのSQLを生成するSQLを書いた。

:::note info
2023/06/21 追記:
文字数基準で切り出すなんて雑なことをしないものが PostgreSQL wiki にあるようなので、そっちを使うのがよいかと思います。実現方法は違えど「setvalするSQLを自動生成する」というのは同じなので、同じように使えます。
https://wiki.postgresql.org/wiki/Fixing_Sequences
:::

```sql
select
	  'select setval(''' || sequence || ''', (select max(' || column_name || ') from ' || table_name || '));' as setval
from
	( 
		select
			  table_name
			, column_name
			, substr(column_default, 10, length(column_default) - 21) as sequence 
		from
			information_schema.columns 
		where
			table_schema = 'public' 
			and column_default like 'nextval(%'
	) a;
```
publicスキーマ内のテーブルでデフォルト値に使われてるシーケンスが対象。ひとつのシーケンスを複数の列で共有してる状況とかは想定していない。

簡単な解説:

1. publicスキーマの全テーブルの全カラムのうち、デフォルト値が `nextval(` で始まるものを抽出し
2. `nextval('accounts_id_seq'::regclass)` みたいな文字列から `accounts_id_seq` を取り出し
3. テーブル名や列名と組み合わせて `select setval('accounts_id_seq', (select max(id) from accounts));` を生成

見てのとおりすごく単純なので、おかしなSQLが生成されてないか一応確認してね。。
ドコモの「しゃべってコンシェル」や Appleの「Siri」のようなサービスが誰でも作れる！？ドコモが提供する「雑談対話」APIを試してみた！


## 今回作ったアプリのイメージ

アプリのスクリーンショットです。

![screenshot_chat.png](https://qiita-image-store.s3.amazonaws.com/0/30826/89a5c442-6055-2560-b41a-c3fd7d6fd11b.png "screenshot_chat.png")

## 概要

現在ドコモが提供している音声・会話関連のAPIには以下のものがあります。

・音声認識(Androidのみ対応)
・雑談対話
・知識Q&A

せっかくこんなサービスが無料で使えるんで、
今回は上記の中から「雑談対話」APIを利用したチャット風アプリを開発してみましたので紹介します。
「音声認識」APIも使ってユーザーの声でそのままやり取りできるようにしたかったのですが、
Androidしかサポートしていないためこちらは諦めました・・・。
代わりにキーボードからSiriを呼び出し音声をテキストに変換してもらうことでご容赦ください。

また「知識Q&A」APIは申請後に審査があるため今回は対象から外しています。
審査が通ったら紹介するかもです。

まずAPIを使用するためにはユーザー登録とアプリ情報の登録が必要になるので下記URLから登録作業を行ってください。

http://dev.smt.docomo.ne.jp/?p=index

「雑談対話」APIリファレンスのURLは下記になります。

http://dev.smt.docomo.ne.jp/?p=docs.api.zatsudan.reference.detail01

APIをPOSTで呼び出すとレスポンスがjson形式で返却されます。
パラメータはAPI_KEYとユーザの発話をテキストで付与するだけで使えます。

チャット風な画面をサクッと作るため[JSMessagesViewController for iOS](https://github.com/jessesquires/MessagesTableViewController)というライブラリを使用しました。
MITライセンスで無料なので安心して使ってください。

## 導入手順

APIをPOSTでリクエストするので「雑談対話」API専用に用意するものはありません。
代わりにAPIとやり取りするために`AFNetworking 2.0`と`JSMessagesViewController for iOS`を導入します。

導入にはCocoaPodsを利用しましょう。
まず適当な名前でプロジェクトを作り
プロジェクトのルート配下のディレクトリに下記のPodfileを作成します。

```
platform :ios, '6.0'pod "AFNetworking", "~> 2.0"pod 'JSMessagesViewController', '~> 3.4.0'
```

次にコンソールから下記コマンドを実行してインストールします。

```
pod install
```

## APIの使い方

ここではAFNetworkingを利用してAPIをリクエストします。

``` リクエストURL
https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=xxxxxxxx
```

パラメータの詳細はリファレンスを参照するとして、
ここでは下記二つのパラメータのみ使用します。

``` パラメータの例
{
 　"utt":"こんにちは",
 　"context":"aaabbbccc111222333"
}
```

パラメータはjson形式で設定してください。

`AFNetworking`を使えば簡単に実装できます。

```objc

static const NSString * API_KEY = @“xxxxxxx”;

- (void)fetchChatRequest:(NSString *)comment context:(NSString *)context completionHandler:(void (^)(NSDictionary *result, NSError *error)) completionHandler
{
    AFHTTPRequestOperationManager* manager = [AFHTTPRequestOperationManager manager];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    
    if (!context) context = @"";
    
    // パラメータの設定
    NSDictionary* param = @{@"utt" : comment, @"context" : context};
    [manager POST:[NSString stringWithFormat:
                   @"https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=%@", API_KEY]
       parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
        
        NSLog(@"response: %@", responseObject);
        
        if (completionHandler) {
            completionHandler(responseObject, nil);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
        
        if (completionHandler) {
            completionHandler(nil, error);
        }
    }];
}

```

リクエストが成功すると下記のようなjson形式のレスポンスが返却されます。

``` レスポンスサンプル
{
　"utt":"こんにちは",
　"yomi":"こんにちは",
　"mode":"dialog",
　"da":"0",
　"context":"aaabbbccc111222333",
}
```

あとは結果をパースして画面に表示します。

## 結論

細かい説明も書こうと思いましたが、長くなりそうなので
やめておきますw
興味がある方は作成したサンプルのソースコードを下記にアップしてますのでダウンロードしてみてください。

https://github.com/asakahara/ASAppLikeSiri

改善の余地はまだまだあって「知識Q&A」APIを組み合わせるともっとおもしろい事ができそうです。

Siriに飽きた方は是非こいつと会話してみることをオススメしますw
Gumi Study Cocos2d-Xmas Special もらえた資料まとめ

先日のセミナーでもらえた資料が中国語なので、一応、みんなさんと具体的な部分を共用したいと思います

自分がcocos2dxの開発（利用）者なので、今度のChu Kong発表についてすごく感心しました。

確かcocos2d-iPhoneの作者RicardoQuesada氏がChu Kongに入社しましたね、これからcocos2dxにとって激しい成長を迎えるだろう。cocos2dxバージョン３について、Qiitaの中に確かに書いているですが、細かい部分を追加したいと思います。

どうしても「いいね！」と言いたいのは、Rendererの仕組みが変わったですね、スピードがすごくあがった、RicardoQuesada氏のおかけです。

C++11でコードを書けます、Android2.3以後、iOS5以後が完全に対応しています。
Object-Cの特徴、例え、変数のハンガリアン記法などをC++のベストプラクティスにしました。

特にバージョン３では、LabelTTFを再構築した、仕組みは以前と全然違いましたね、すごいスピードになりました、みんなぜひ使えましょうと。

javascriptのupdateをすごく便利になりました、又、Luaがもっと自動化しましたようです、以前の場合、自分でLuaの関数を追加したいなら、cocos2dxのpkgなどに対応のAPIを追加しますね。バージョン３では、pythonで直接処理できる、便利。みんなあんまにこれを使えないけど、実は、すごく便利なツールなんです、例えば、ゲームに新しいイベントを追加したい場合すごく効くよ、だって、サーバー更新したら済むだから（最近研究中。。。）

Luaでは、OpenGLのAPIあって、直接Luaの関数でOpenGLの関数を呼べる、あとLuaJavaBridgeのツールがあって、名前の通り、Javaと連携ですね、もちろん、Androidだねw。

AndroidではNativeActivityを使用しています、アプリを起動するときがすごく早い。

あと、みんなはなんで「cocos2dx 3d extension」が　2.5dになるのは気になるでしょう。Chu Kongは多数の3Dツールを開発終わりましたが、3Dシーンの管理の処理がまだ用意してないです。だから、現時点ではモデルエディタがある場合、2.5dのゲームはもう十分です。Chu Kongはきっと3Dの部分を追加するだろう、楽しみましょう。

みんなご存知の通り、windows上で、openGLじゃなくて、DirectXですね、openglの基礎があったらこそのcocos2dxですが、windowsがゲームは動けるのかなぁと心配あるでしょう。cocos2dx2.2以後は「Angel project」を使って、DirectXのAPIをopenGLのAPIに変換した！ww、つまり、実は開発者たちはDirectX使っているですが、openGLを使えるように感じます（超受けるww）。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
cocos2d-html5 2.2について

自分がHTML5を使って、ゲームを開発したことないですから、cocos2d-html5開発についてすごく基本な部分に気付けたかもしれない、申し訳ございませんでした。

（下のjsはjavascriptのことです）
HTML5と言えば、新しいHTMLルールとCSSとJSの融合体と僕が認識しています。
cocos2d-html5が設計の目標について、みんなさんに知るべきだと思います、まずは、cocos2d-html5はjsプログラマーの為、そしてjsbのバージョンがhtml5のAPIバージョンに従っている。

今度のcocos2dx3.0バージョンと共に、コードの仕組みをかえて、以前より６倍くらいのスピードをあがりました。
cocos2d-html5チームの経験だと、エンジン開発は「テンポラリオブジェクトできるだけ使用しない、ステイブルクラスを定義する、連続てJITを呼ぶのを避ける、chain（chromeで見える）を最小限にする」を従って、スピードあがって成果として、やり甲斐ありましたと。

開発に移して、
中国の開発経験によると、プロジェクト最初段階で、ウェブブラウザでゲームを楽しめる、つまり、ゲーム本体がブラウザで開発する、性能の部分もきっちり調整する。
プロジェクトが最後の段階に移ると、JSB（神の手）を使って、まだ課金、広告などのプラグインを導入する、SDKの関数を呼ぶなど（推測）、最終的にAndroidや、iPhoneのプロジェクトが完成。
この手順に従って、作ったアプリの速度が早いと言いました。

ツールを使う
自分がchrome万能だと思いますが、よく使えるのはデベロッパーツールが実にすばらしい、性能などの調整や、デバッグ機能など。
js debugger（venkman）の改善ツールがcocos2dx3.1の中に入る予定です。

すごくはやっている「艦これ」がどうやって開発するのが知らないですけど（実は遊んだことすらないけど）、もしこんなゲームが同時にパソコン、スマートフォンで遊べるようになりましたら、ソーシャル性がまだ広がったような気がする。

最近がWebGLを弄ったので、html5が元々WebGLできますから、cocos2d-html5も3dのツールを出る可能性は高いと思います。

とりあえず、コツコツがんばって勉強しましょう
Objective-Cで、C#でいうところのout引数みたいなことをやりたいとき


複数の戻り値を戻したいときですね。
ポインタのポインタを使います。

# サンプル
例として __HTTPリクエストを投げてボディのデータを戻り値で受け取りつつレスポンス情報とエラー情報を引数で受け取る__ というメソッドを書いてみます。

```Objective-C:URLUtility.m
+ (NSData*) syncGetFrom: (NSString*)url response: (NSHTTPURLResponse**)response error: (NSError**)error
{
    NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
    NSHTTPURLResponse* res;
    NSError* err;
    NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&res error:&err];
    if (response) *response = res;
    if (error) *error = err;
    return data;
}
```

呼び出し側はこんな感じです。

```Objective-C:
NSHTTPURLResponse* response;
NSError* error;
return [HTTPUtility syncGetFrom:@“http://…” response:&response error:&error];
```


# ポイント
引数にポインタをセットするコードがポイントです。

```Objective-C:
*response = res;
```

この書き方が分からず、しばらくはまってしまいました。
Write Yourself a Theorem Prover in 48 Hours (その3)

誰でも定理証明器を作れるようになろうという趣旨です。ここではCoqのパクリみたいなサブセットを48時間で作ります。

前回 http://qiita.com/kikx/items/b0eda41bc7b9036ac18d の続きです。

今回は新しい型を追加します。

# 新しい型を追加する

前回までの言語には関数型と型の型しか型がなかったので、新しい型を追加します。型を追加するには以下の情報が必要です。

* 型のコンストラクタを表す項
* 値のコンストラクタを表す項
* 値のデストラクタを表す項
* 計算規則

例えば、リスト型を追加したい場合はそれぞれ以下のようになります。

* 型コンストラクタ `list : forall A : Type, Type`
* 値コンストラクタ
 * `nil : forall A : Type, list a`
 * `cons : forall A : Type, a -> list A -> list A`
*  デストラクタ

```
list_rec
     : forall (A : Type) (P : list A -> Set),
       P nil ->
       (forall (a : A) (l : list A), P l -> P (cons a l)) ->
       forall l : list A, P l
```

* 計算規則
 * `list_rec A P Hnil Hcons nil ===> Hnil`
 * `list_rec A P Hnil Hcons (cons a l) ===> Hcons (list_rec A P Hnil Hcons l) a l`

Coq ではこれらをまとめて

```
Inductive list (A : Type) : Type :=
    nil : list A | cons : A -> list A -> list A
```

と書くだけで一度に全部やってくれます。

ここではリスト型を追加してもたいして面白くないので、eq型を追加します。

# eq型

Coqでは以下のように定義されています。

```
Inductive eq (A : Type) (x : A) : A -> Prop :=
  eq_refl : eq A x x
```

これを追加するためには、リストと同じように必要な項の一覧と計算規則を作ります。われわれはPropを作っていないので、適当な i を選んで Univ i を使います。さらに、Coqでは x = y の両辺は対称ではありません。今回はもっと対称的な形の、

```
Inductive eq' (A : Type) : A -> A -> Type :=
  eq_refl' : forall x, eq' A x x
```

を使います。使い勝手ではCoqの定義のほうがはるかに簡単なのですが、やっぱり対称なほうが綺麗なのでこっちにします。

というわけで、eq型に必要なものは

* 型コンストラクタ `eq : forall A : Univ i, A -> A -> Univ i`
* 値コンストラクタ `eq_refl : forall (A : Univ i) (x : A), eq A x x`
* デストラクタ

```
eq_rec
     : forall (A :  Univ i) (P : forall x y : A, eq A x y -> Type),
       (forall z : A, P z z (eq_refl A z)) ->
       forall (x y : A) (p : eq A x y),
       P x y p
```

* 計算規則 `eq_rec A P H z z (eq_refl A z) ===> H z`

になります。

なお、元ネタは http://homotopytypetheory.org/book/ の付録にあります。

# 項の定義に追加

色々とやり方はありそうですが、今回はアンチョクに必要な引数を全部持っている形でエンコードします。

```hs
data Term = Var String
         | ...
         | Eq Type Term Term
         | Refl Type Term
         | EqRec Type Term Term Term Term Term
```

課題: typeofを改造してこれらの項に対応させて見ましょう。規則は上に書いたとおりです。

課題: reduceFullを改造して計算規則を追加しましょう。

時間なくて手抜きになってしまいましたが、
次回はやっとタクティックの実装を始めます。たぶん年末に書きます。
iOSオープンソースライブラリのまとめのまとめ、2013年12月版

最近、iOSのオープンソースのまとめが増えてきたので、まとめてみました。

1. [ブラウザ開発で使用した超絶便利なオープンソースライブラリ10選](http://showrtpath.hatenablog.com/entry/2013/12/18/223836)
1. [街のカタログアプリ「Here」で利用しているiOSライブラリのまとめ](http://lab.heathrow.co.jp/2013/12/18/7951)
1. [[iOS] iOS 7対応アプリで使いたいライブラリ4選 +α | アドカレ2013 : SP #17](http://dev.classmethod.jp/smartphone/iphone/sp17-ios-introduce-library-for-ios7/)
1. [iOS開発で使って便利だったオープンソースライブラリ](http://blog.mokosoft.com/entry/2013/12/17/180337)
1. [Q＆Aアプリで使用した便利なiPhoneライブラリ](http://nanapi.co.jp/blog/2013/12/11/qaapp_iphone_library/?utm_reader=feedly)
1. [[iOS] iPhoneアプリの初回起動時に表示したい「おもてなし」ライブラリ4選 | アドカレ2013 : SP #10](http://dev.classmethod.jp/smartphone/iphone/sp10-ios-introduce-introduction-library/)
1. [iOSで使える日本語OKな音声読み上げエンジン8種（TTS,音声合成）](http://qiita.com/shu223/items/223492e4f061032e652e)
1. [ぼくがかんがえた最強の「一度使ったら手放せない!? iOS開発で絶対に使うべきライブラリ!」](http://aknep.hatenablog.com/entry/2013/11/28/031849)
1. [一度使ったら手放せない!? iOS開発で絶対に使うべきライブラリ!](http://d.hatena.ne.jp/yayugu/20131127/1385541746)

まとめてみると、みなさん質の良いオープンソースを使用していますね。

同内容が http://showrtpath.hatenablog.com/entry/2013/12/18/234212 でも書かれています。
マルチプラットフォームにリリースできたアプリ「走れテディ」の紹介


#自己紹介

普段は外資系の化粧品会社で経理してます。アプリ開発は趣味で始めて2011年の６月に最初のiOSアプリ「シフト電卓」をリリースしました。

その後、「4ナンバーズ」が [ゲーム-教育] カテゴリーで１位になったことで、このアプリをAndroid、Windowsストア、WindowsPhone用のアプリを開発しようと思い、AndoridはJava, Windowsストア、WindowsPhoneはC#で開発しリリースしました。

#Unityとの出会い

しばらくして、Unityというゲームエンジンがあることを知りました。

でも最初は、２Dのゲームアプリもまともに作れないのに、３Dなんてとても無理と思っていました。それに、iOSに書き出すのにお金を支払わなければいけなかったし。暫くして、無料になったことで、（C＃は好きだし）ちょっとやってみようと思いました。

書籍やYouTubeで学習しながら、週１個のペースでアプリを３つ作り、リリースしました。そして、Unity Mecanimの学習セミナーで熊ちゃんに出会いました。スワイプでジャンプ出来るようにして、傾きセンサーで左右に移動できるようにしたのが、「走れテディ」です。

このアプリは、Unityで作成した４つ目のアプリです。最初に、iOSとAndroidでリリースしました。

#そして
10月１２日, 13日にNHN PlayArt x Unity: PlayArt Game Jamに参加し、Kamcord（プレイ動画をTwitter, Facebook, YouTubeで公開できる）の存在を初めて知り、早速iOS向けに組み込みました。

その後、Unity 4.2がリリースされたので、WindowsストアとWindowPhone用に修正を加えリリースしました。以下にアプリのリンクでご紹介させて頂きます。

##iOS
https://itunes.apple.com/jp/app/zouretedi/id687068104?mt=8
リリース日:８月１９日
Download数: 13,428

特有の機能:
Kamcordの機能を追加しています。
http://www.kamcord.com/games/teddy-run/

##Android
https://play.google.com/store/apps/details?id=com.investway.teddyrun&hl=ja
リリース日:８月１４日
Download数: 577

##Windowsストア
http://apps.microsoft.com/windows/ja-jp/app/teddy-run/530b433f-3f72-49a3-8a45-d89e399f7220/m/ROW
リリース日:１０月２８日
Download数: 881


##WindowsPhone
http://www.windowsphone.com/ja-jp/store/app/teddy-run/b9422f97-0830-4eb5-9f46-5278b3f6ce9d
リリース日:１１月７日
Download数: 2,356


以上、マルチプラットフォームに対応したアプリ「走れテディ」をご紹介させて頂きました。

Unity 楽しい 最高だ!! by Twitter: @sadaki7
VagrantをGUI起動する(VirtualBox)

Vagrantfile内の以下の記述をコメントアウトする

```Vagrantfile:Vagrantfile
config.vm.provider :virtualbox do |vb|
  # Don't boot with headless mode
  vb.gui = true

  # Use VBoxManage to customize the VM. For example to change memory:
  vb.customize ["modifyvm", :id, "--memory", "1024"]
end
```
ゲーム制作12日目！

#今日のメニュー
・画像再改変
・エサをクッキーという設定に変更
・ステータス画面設置。
・ステータス画面にクッキーストッカー設置
・成長するために必要なエサの数を可変に
・ツイートボタン設置

#画像について
画像について一部差し替えました。
が、まだ完成されていない画像が多く、仮画像で置き換えているので残念な様相を呈しています。

#ステータス画面
画面を横に拡張し、さまざまな情報を表示できるスペースを作りました。
たとえば、タイトルロゴやおなかのたまりぐあいを表示します

#クッキーストッカー
おなかのたまり具合をしめすものです。
食べるほどクッキーが積まれていき、
成長するとたまっているクッキーが消えます。
現在エラーと格闘中

#成長するために必要なクッキー数
一般的なゲームの経験値のように、
成長するほど次の段階に行きにくくなりました。

#ツイートボタン
ツイートボタンを設置しました。
しかし、現在enchant.jsの内部と繋がっていないので、
明日はそれについて行います。

#今日の成果
エラーで見せられないです…。
フレームワーク基本操作まとめ ExtJS3編


フレームワーク間の比較をしやすくするため、まずは現在使っているExtJS3の基本操作をまとめていきます。
随時更新予定です。

# ビュー定義
```JavaScript:HogeView
var HogeView = Ext.extend(Ext.Panel, {
  width: 500,

  initComponent: function() {
    HogeView.superclass.initComponent.call(this);
  }
});
```

# ビュー生成
```JavaScript:HogeView
parentView.add(new HogeView({
  height: 100
}));
```

# ビューの動的デザイン変更
```JavaScript:
if (condition)
  view.removeClass('red');
else
  view.addClass('red');
```

# DOMアクセス
```
Ext.select(‘#hoge’).createChild(htmlStr);
```

# フィールドへの値設定/取得
```JavaScript:
this.field.getValue();
this.field.setValue(val);
```

# モデル定義
```JavaScript:HogeModel
// モデルクラス定義
var HogeModel = Ext.data.Record.create([
  {name: 'id'},
  {name: ‘name’}
]);

// モデルクラスメンバ定義
Ext.apply(HogeModel, {
  invalidId: -1
});

// モデルインスタンスメンバ定義
Ext.apply(HogeModel.prototype, {
  getDisplayName: function() {
    return this.get(‘name’) + ‘(‘ + this.get(‘id’) + ‘)’;
  }
});
```

# モデル生成
```JavaScript:HogeModel
var hoge = new HogeModel({
  id: HogeModel.invalidId,
  name: ’hoge’
});
```

# イベント定義/送信
```JavaScript:
this.hogeButton.on(‘click’, function(button, e) {
  Ext.Msg.alert(‘title’, ‘message’);
}, this);
```

# イベント送信
```JavaScript:
this.hogeButton.fireEvent(‘click’, this.hogeButton);
```

# Ajax通信
```JavaScript:
Ext.Ajax.request({
  url: '/api/' + action,
  method: 'POST',
  params: {},

  success: function(httpRes) {
    var appRes = Ext.util.JSON.decode(httpRes.responseText);
  },
  failure: function(httpRes) {
  }
});
```
RubyMotionによるIn App Purchaseの実装について

RubyMotionでIAPを実装するときに自分が躓いたポイントについて書いて、
IAPの実装のサンプルコードを載せました。

http://ainame.hateblo.jp/entry/2013/12/18/233709

![スクリーンショット 2013-12-18 23.29.04.png](https://qiita-image-store.s3.amazonaws.com/0/1743/9d84b158-6848-d47c-68be-7338da1f1a75.png)
Git HTTP サーバの作り方

JVM系言語でGitサーバを作ろうとしたら、JGitのGiｔServerを使うと簡単ですが、Clojureの場合ringで動かしたいので、Servletだとちょっと扱いづらいところがあります。

そこで、GitServletを使わずにGit http サーバを作ってみます。

https://github.com/kawasima/gring

[Gitの内側 - トランスファープロトコル](http://git-scm.com/book/ja/Git%E3%81%AE%E5%86%85%E5%81%B4-%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B9%E3%83%95%E3%82%A1%E3%83%BC%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB) にあるとおりのプロトコルを実装すればよいわけですが
、JGitを使えば簡単です。

例えば、git cloneを実行した時には、サーバへは以下の２回のHTTPリクエストがとびます。

    GET /hoge.git/info/refs?service=git-upload-pack
    POST /hoge.git/git-upload-pack

最初の info/refs はブランチの一覧を返します。
昔のgitクライアントからはservice=git-upload-packのパラメータが付いてきません。これはdumbクライアントと呼ばれています。現在のgitクライアントはsmartクライアントと呼ばれていて、dumbクライアントがリポジトリ下のinfo/refsファイルの内容をそのまま送信するのに対し、多少のヘッダ情報がついたりします。

そんな調子で、gitコマンドでやりとりされるURLを実装します。基本的にはJGitのメソッドを呼ぶだけです。

```clj
(defroutes git-routes
  (compojure/context ["/:name.git", :name #"[0-9A-Za-z\-\.]+"] {{repo-name :name} :params}
    (GET "/info/refs" {:as request}
      (get-info-refs (open-repo repo-name) request))
    (POST "/git-upload-pack" {:as request}
      (service-upload (open-repo repo-name) request))
    (POST "/git-receive-pack" {:as request}
      (service-receive (open-repo repo-name) request))
    (GET "/HEAD" {params :params}
      (get-text-file (open-repo repo-name) "HEAD"))
    (GET "/objects/info/alternates" []
      (get-text-file (open-repo repo-name) "objects/info/alternates"))
    (GET "/objects/info/http-alternates" []
      (get-text-file (open-repo repo-name) "objects/info/http-alternates"))
    (GET "/objects/info/packs" []
      (get-info-packs (open-repo repo-name)))
    (GET "/objects/info/*" {params :params}
      (get-text-file (open-repo repo-name) (str "objects/info/" (params :*))))
    (GET ["/objects/:hash2/:hash38", :hash2 #"[0-9a-f]{2}" :hash38 #"[0-9a-f]{38}"] [hash2 hash38]
      (get-loose-object (open-repo repo-name) (str "objects/" hash2 hash38)))
    (GET ["/objects/pack/:pack-file", :pack-file #"[0-9a-f]\.(pack|idx)"] [pack-file]
      (cond
        (. pack-file endsWith ".pack")
        (get-pack-file (open-repo repo-name) (str "objects/pack/" pack-file))
        (. pack-file endsWith ".idx")
        (get-idx-file  (open-repo repo-name) (str "objects/pack/" pack-file))))))
```

僅か171行で、GitServerが完成しました。
https://github.com/kawasima/gring/blob/master/src/gring/core.clj

簡単ですね。
Foursquare API(venue search)




緯度と経度を元に周辺の情報を取得するvenue searchは、認証なしでも利用できます。

レスポンスはJSON形式になります。


```php

    $client_id = <Client ID(48桁の英数字：要取得)>;
    $client_secret = <Client Secret(48桁の英数字：要取得)>;
    // venues search
    $url = "https://api.foursquare.com/v2/venues/search?";
    // パラメーター
    $params = 
        '&ll=' . $lat.','.$lon . 
        '&client_id=' . $client_id . 
        '&client_secret=' . $client_secret . 
        '&v=' . '20120712' . 
        '&locale=' . 'en';
    // リクエストURL
    $url .= $params;
    // JSONデータ取得
    $res_in_json = file_get_contents( $url);
    // 配列に変換
    $res_in_array = json_decode( $res_in_json, true);

```
コード引用元：<a href="http://kwski.net/api/761/" title="Foursquare APIのvenue searchを使って周辺のランドマークを取得">Foursquare APIのvenue searchを使って周辺のランドマークを取得</a>

##パラメータ

| パラメータ|説明 | 
|:-----------|:-------------|
| ll     |        緯度,経度（カンマ区切り） |
| client_id / client_secret     |      登録して取得 |
| v      |     APIのバージョン、v=YYYYMMDDの形で記入 |
| locale         |       ロケール、デフォルトは'en' |


##レスポンス

| パラメータ|説明 | 
|:-----------|:-------------|
| id    |       venueの一意な文字列 |
| name   |      venue名 |
| verified    |    この場所の事業主が情報が正しいと承認しているかどうか |
| contact         |      電話番号など |
| location  |      住所 |
| categories    |    venueが割り当てられたカテゴリーの配列です |

##制限
認証無しで使用する場合は、

5000リクエスト/1時間
Twitter Card Deep Linking

スマホのTwitter公式アプリで下記metaタグを仕込んでいるページのリンクが貼られるとカードを表示してくれる。
Twitterさまさま。

## metaタグを仕込む
```html
<meta name="twitter:app:name:iphone" content="Example App"/>
<meta name="twitter:app:id:iphone" content="306934135"/>
<meta name="twitter:app:url:iphone" content="example://action/5149e249222f9e600a7540ef"/>
<meta name="twitter:app:name:ipad" content="Example App"/>
<meta name="twitter:app:id:ipad" content="306934135"/>
<meta name="twitter:app:url:ipad" content="example://action/5149e249222f9e600a7540ef"/>
<meta name="twitter:app:name:googleplay" content="Example App"/>
<meta name="twitter:app:id:googleplay" content="com.example.app"/>
<meta name="twitter:app:url:googleplay" content="http://example.com/action/5149e249222f9e600a7540ef"/>
```

##  参考サイト
https://dev.twitter.com/docs/cards/app-installs-and-deep-linking
Wordpressのための最低限のnginx設定

- 前提条件：php-fpmが127.0.0.1:9000で動いているとする

nginxは標準でfastcgi.confという設定ファイルを用意してくれているので，
以下の設定のみでwordpressを設置できる．

```nginx
server {
  server_name example.jp;
  root /path/to/wordpress;
  index index.php index.html index.htm;

  location / {
    try_files $uri $uri/ /index.php?$args;
  }

  location ~ \.php$ {
    include fastcgi.conf;
    fastcgi_pass 127.0.0.1:9000;
  }
}
```

try_filesの行は，記事のURLをwordpress/2013/12/article-name/ のようにrewriteするために必要．
model別にSeedファイルを用意する方法

全てをdb/seeds.rbに書くのは見た目も良くないし、seedbankを使えば、ファイル別にSeedを用意できます。

seedbankのホームページ：https://github.com/james2m/seedbank

使用方法：
Seedファイルを用意します：
> $ mkdir db/seeds  
$ touch db/seeds/cities.seeds.rb  
$ vi db/seeds/cities.seeds.rb

ファイルの編集が終わったら、rakeタスクを実行します。

> $ rake db:seed:categories

ファイル名とディレクトリ名などを気をつけてください。
3DCGで髪や服の描画方法を思いついたのでメモ

業界の人には常識なのかもしれないが思いついたのでメモ。

- 服のポリゴンを表地と裏地の二セット用意する。表と裏で色とかテクスチャとかが違っててもおｋ。
- カリングとステンシルバッファを有効にする。
- まず表地を表だけ描画するようカリングしつつ描画する。その時ステンシルバッファにマークする。
- 裏地と中身を描画。その時ステンシルバッファがマークされてたら描画しない。裏地は裏だけ描画するようカリング推奨。

<p>こんな感じ。表側が描画されていると中身が描画されないので表地が描画されている範囲からはみ出すほど突き出さなければポリゴンを突き破って...なんてことは起きなくなる。なので形状をを厳密に作り込む必要がなくなる。なお、裏地が絶対に見えない場所は当然省略可能だ。</p>
<p>また重ね着しているような場合にも応用できる。表地は単純に表から描画していけばいい。が、裏地はそのままだと重ねた時にデプスファイトする恐れがあるので内側程優先して描画されるようにマスクする必要がある。結局、描画時の優先順位は...</p>

1. 表地(表面が最優先)
1. 中身
1. 裏地(内側が最優先)

となる。

<p>同様に、髪の場合もステンシルを設定することで座標生成が多少荒くても破綻しないようにできる。それでも結構面倒そうなんだけどね。</p>
cron で ruby を自動実行する

<pre>
which ruby
</pre>
rubyのパスを取得し,

<pre>
0 * * * * cd ’実行したいプログラムがあるディレクトリ'; 'rubyのパス' '実行したいプログラムのパス'  
</pre>
cronは6つのフィールドにより形成

|分       |時     |日     |月    |曜日                  |コマンド                                        
|:------:|------|----- |----- |-----------------:|--------------
| 0~59 |0~23|1~31|1~12|0~7(0,7は日曜) |空白でもok 


 `*`は毎  
コンマ(,)やハイフン(-)やスラッシュ(/)で時間指定、範囲、間隔値(例：1-5/2 後ろに指定した値の間隔で処理を実行するを指定可能
  

###http://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html
GitBucketのインストール手順

[Githubクローン界の新星 GitBucket を Ubuntu 12.04 で動かす](http://qiita.com/tanacasino/items/4d683debd9bcb2f6e06e)に触発されてitBucketをインストールしました．概ねこちらの記事のとおりですが，バージョンが上がっているようなので自分用のメモとしてインストール手順を記しておきます．

## GitBucketとは？

これまで数多くのGit用Webインタフェースが存在しましたが，Githubという巨星に敵わないばかりか，インストールが面倒だったり，手順書に従ってインストールしているにもかかわらず気づかないところでミスしていたりで，なかなか実用には至りませんでした．（私だけ？）

そこに彗星の如く現れたのがGitBucketです．まだ世に出たばかりなのでgoogleでgitbucketで検索すると，「もしかしてbitbucket?」などと余計なお世話を焼かれるぐらい新しいです．

特徴として，単独のwarファイルで提供されるのでインストールがとてつもなく楽です．DBMSも不要です．

## 用意するもの
    Ubuntu Server 12.04.3 LTS 64bit
以上です．

## 動作方針

冒頭で紹介したWebページでは，大変ありがたいことにTomcat，Jetty，sbtという3つのデプロイ方法を紹介して頂いております．ここでは手抜きですが，Tomcatのみを取り扱います．

## インストール

以下のように，openjdk（7），Tomcat（7.0.47），GitBucket（1.8）の順にインストールしてください．

```sh
$ sudo apt-get install openjdk-7-jre
$ wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/tomcat/tomcat-7/v7.0.47/bin/apache-tomcat-7.0.47.tar.gz
$ tar zxvf apache-tomcat-7.0.47.tar.gz
$ wget https://github.com/takezoe/gitbucket/releases/download/1.8/gitbucket.war
$ mv gitbucket.war apache-tomcat-7.0.47/webapps/
$ cd apache-tomcat-7.0.42
```

GitBucketの起動

    $ ./bin/startup.sh

GitBucketの停止

     $ ./bin/shutdown.sh

ポート番号は標準では8080になっていて，ユーザとしてID：root，パスワード：rootのユーザが登録されています．Webブラウザからログインしてパスワードの変更やユーザの登録を行ってください．

なお，私はポート番号として80番を利用したかったので，nginxをインストールしてリバースプロキシとしました．

    $ sudo apt-get install nginx

以下は/etc/nginx/sites-enabled/defaultからコメントを取り除いたものです．簡単ですね．

```
server {
	root /usr/share/nginx/www;
	index index.html index.htm;

	server_name localhost;

	location / {
	}

	proxy_set_header Host $host;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header X-Forwarded-Host $host;
	proxy_set_header X-Forwarded-Server $host;
	proxy_set_header X-Real-IP $remote_addr;
	location /gitbucket {
		proxy_pass	http://localhost:8080;
	}
}
```

nginxを再起動します．

    $ sudo /etc/init.d/nginx restart

これで（サーバのFQDNがgit.foo.comの場合）Webブラウザから

    http://git.foo.com/gitbucket

にてアクセスできるようになりました．
Sublime Text3のタブの挙動を元に戻す

12/17にSublime Text 3の最新版がリリースされました。
既存のバージョンを使っている場合はそのままアップデートができますが、
アップデートするとタブの挙動が変わるようです。

![enable_tab_scrolling=true](https://qiita-image-store.s3.amazonaws.com/0/3790/6d4423f6-2f7d-0e8c-3a8d-465225ec2c9a.png)

元に戻すには、設定ファイルに以下の項目を追加します。

```json
{
    "enable_tab_scrolling": false
}
```

![enable_tab_scrolling=false](https://qiita-image-store.s3.amazonaws.com/0/3790/3778c9df-a9fc-cd2d-ea03-242b67482074.png)

元に戻すかは、お好みで。
Settingslogicを使ってconfig.yml, config.local.yml運用してみる

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


[Settingslogic](https://github.com/binarylogic/settingslogic) は設定ファイルを一回ERbで処理してから使えるステキなRubygem。


CIやherokuなどは`config.yml`を読んで環境変数を使いつつ、ローカル環境では`config.local.yml`で上書きしたいと思ったので試してみた。

ちなみに`*.local.yml`を使うという運用方はtest-kitchenから拝借。


```ruby:app.rb
require 'settingslogic'

class EnvSettings < Settingslogic
  source File.expand_path('../config.yml', __FILE__)
end

if File.exist?(File.expand_path('../config.local.yml', __FILE__))
  class EnvLocalSettings < Settingslogic
    source File.expand_path('../config.local.yml', __FILE__)
  end
  EnvSettings.merge!(EnvLocalSettings)
end

puts EnvSettings[:hoge]
```

多少冗長のような気もするが、既存のコードも`if`ブロックを一個追加で同じ対応ができるしOK。

とりあえず`config.yml`のみで実行。

```yaml:config.yml
hoge: <%= ENV['HOGEHOGE'] %>
```


```shell:
 $ HOGEHOGE=moge ruby ./app.rb 
moge
```

`config.local.yml`を置いて実行。

```yaml:config.local.yml
hoge: mogemoge
```

```
$ HOGEHOGE=moge ruby ./app.rb 
mogemoge
```

local側がENVを読んでもいいんだけど、使い勝手を考えるとこの順番かな。
[MariaDB] ubuntuにMariaDBをインストールしてみた

Red Hat系にインストールしたかったのだけど
MySQLちゃんがインストールされているとmysql-libsが競合するようなので、
そこらへんに転がってたubuntusくんにインストール。

##### OSのバージョン

```shell-session
user@ubuntu:~$ cat /etc/os-release
```

```:
NAME="Ubuntu"
VERSION="12.04.3 LTS, Precise Pangolin"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu precise (12.04.3 LTS)"
VERSION_ID="12.04"
```

##### レポジトリの登録
```shell-session
user@ubuntu:~$ sudo vi /etc/apt/sources.list.d/MariaDB.list
```

```:
deb http://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/mariadb-10.0.6/repo/ubuntu precise main
deb-src http://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/mariadb-10.0.6/repo/ubuntu precise main
```
ミラーサーバーは、適当なところを探してください。

##### キーの取得 から インストールまで
```shell-session
user@ubuntu:~$ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 CBCB082A1BB943DB
user@ubuntu:~$ sudo apt-get update
user@ubuntu:~$ sudo apt-get install mariadb-server-10.0 mariadb-common mariadb-client
```
このとき、rootパスワードの設定があります。

##### 初期設定
```shell-session
user@ubuntu:~$ sudo mysql_secure_installation
```

##### サービス再起動
```shell-session
user@ubuntu:~$ sudo service mysql restart
```
##### 接続
```shell-session
user@ubuntu:~$ mysql -uroot -p
```

```:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 33
Server version: 10.0.6-MariaDB-1~precise-log mariadb.org binary distribution

Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> \q
Bye
```

以上で完了です。




## 補足（はまったこと）
```shell-session
apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 CBCB082A1BB943DB
```
で利用する`` CBCB082A1BB943DB ``ですが
どこに記載されているのかわからず、しばらくはまりましたが

`` apt-get update `` をした時点で、`` ftp.yz.yamagata-u.ac.jp `` に対するキーが表示されました。
正しいやり方なのかわかりませんが、とりあえずうまく行ってしまった感じです。
[SystemVerilog]packed構造体のrand_mode

HDLあどべんが瀕死なので前にハマった事をちょいと書きます。
ただあまり考察できてない内容なので間違いがあるかもしれませんがご容赦ください。

SystemVerilogでたまに構造体を使うのですがランダムと組み合わせて使った時にハマりました。

配列にしろ、構造体にしろpackedの方が何かとサボれるので何も考えずにpackedにするのですが
下記のコードのようにrandをつけて宣言した場合、構造体のメンバ個別のrand_modeのON/OFFができなくなります。

```v:test1.sv
`timescale 1ns/1ps

typedef struct packed {
  logic [3:0] hoge;
  logic [7:0] fuga;
} my_st1;

module test1();

  class my_class;
    rand my_st1 st1;
    
    constraint c_st1_hoge { st1.hoge >= 4'h8;  }
    constraint c_st1_fuga { st1.fuga >= 8'h88; }

    function new(logic [3:0] st1_hoge, logic [7:0] st1_fuga);
      this.st1.hoge = st1_hoge;
      this.st1.fuga = st1_fuga;
    endfunction : new

  endclass : my_class

  initial begin
    // 1st
    my_class c = new(4'h0, 8'h00);
    $display("1st: hoge = 0x%01h, fuga = 0x%02h", c.st1.hoge, c.st1.fuga);

    // 2nd
    void'(c.randomize());
    $display("2nd: hoge = 0x%01h, fuga = 0x%02h", c.st1.hoge, c.st1.fuga);

    // 3rd
    c.st1      = 12'h111;
    $display("3rd: hoge = 0x%01h, fuga = 0x%02h", c.st1.hoge, c.st1.fuga);

    // 4th
    c.constraint_mode(0);
    c.st1.rand_mode(0);
    void'(c.randomize());
    $display("4th: hoge = 0x%01h, fuga = 0x%02h", c.st1.hoge, c.st1.fuga);

    // 5th
    c.st1.rand_mode(1);
    c.constraint_mode(1);
    c.c_st1_hoge.constraint_mode(0);
    c.st1.hoge.rand_mode(0);
    void'(c.randomize());
    $display("5th: hoge = 0x%01h, fuga = 0x%02h", c.st1.hoge, c.st1.fuga);

    $finish(2);
  end
  
endmodule : test1
```

実行結果

```
1st: hoge = 0x0, fuga = 0x00
2nd: hoge = 0xd, fuga = 0xcb
3rd: hoge = 0x1, fuga = 0x11
4th: hoge = 0x1, fuga = 0x11
5th: hoge = 0x2, fuga = 0x95
```

構造体じゃなくてバスの信号でも、各bit個別のrand_mode ON/OFFができないということを考えれば、
まぁ当たり前のことかもしれません。

そう、当たり前のことなんですよ。きっと、、、


__じゃあエラーにしろよ！！！__

シミュレータによってはエラーになるのですが、
私がよく使っているシミュレータでは何も言わずに通りました。

まぁね、こんな記述するほうが悪いのかもしれないんだけど。
一言ぐらい言ってくれてもいいじゃない・・・
構造体使わないかもしれないけど使うときにはご注意を。
gitコマンドの初歩

##リポジトリの初期化
    git init
リポジトリを初期化します．gitでファイルを管理する場合、最初に行うコマンドです．

##管理対象ファイルの登録
    git add <filename>
リポジトリにファイルを追加します．新規ファイルが多く有り，一つ一つ登録するのが面倒な場合，以下のように実行することで，ディレクトリ内のすべてのファイルが管理対象となり，ファイルの取りこぼしがなくなります．

    git add .

##管理対象ファイルをコミット（リポジトリに反映）
    git commit -a
git addで追加されたファイルを実際にリポジトリに反映させます。実際にgit commitを実行すると、コメントの編集画面になります。面倒な場合は以下のように実行します。コメントはシングルコーテーションかダブルコーテーションで囲ってください。

    git commit -a -m 'ここにコメントを記述'

##実際のサイクル
実際には、以下のようなサイクルでgitコマンドを使っていきます。

* ファイルの編集
* （新規ファイルが有る場合）ファイルの登録
* コミット（リポジトリに反映）

##gitサーバにpush（外部リポジトリに登録）
ファイルに変更を加え，一段落したらgitサーバ（外部リポジトリ）に登録しましょう．Githubや自前gitサーバなどを想定しています．適切にgitサーバの設定が済んでいれば，下記のコマンド一発で登録できます．

    git push

サーバによっては公開鍵の登録が必要だったり（Githubなど），IDとパスワードの入力を求められたり（GitBucketなど）します．
JUnitの基礎知識

## メソッドのテスト

通常，プログラムの汎用性向上や開発効率向上を目指すと，最終的に多数のメソッドを作成することになります．記憶力が続く間は良いのですが，その内一つ一つのメソッドの動作をきちんと検証する必要が出てきます．そこで役に立つ仕組みの一つにJUnitと呼ばれる，自動的にメソッドの動作を検証する仕組みがあります．

## インストール

以下のサイトから3番の「JAR including Hamcrest」と書いてあるjunit-4.11.jarをダウンロードしてください．
~~（執筆時はver4.10が最新だったので，junit-4.10.jar）~~
追記：JUnit4.11がリリースされていたので，URLを変更しました．なお，以下のURL以外で配布されているjunit-4.11.jarには，hamcrest関連のクラスが同梱されておらず，コンパイルや実行時にエラーが出る場合があります．

[Downloads · junit-team/junit](https://github.com/junit-team/junit/downloads)

junit-4.11.jarを，環境変数CLASSPATHに含まれるディレクトリに移してください．CLASSPATHが設定されていない場合は設定してください．


```
例：/hoge にjunit-4.11.jarが置かれている場合
$ export CLASSPATH=/hoge:/hoge/junit-4.11.jar;
```

テストコードをコンパイルしましょう．CLASSPATHが設定されていれば通常の手順でコンパイルできます．

```
例：TestClass.javaをコンパイルする
$ javac TestClass.java
```

最後に，テストを実行します．

```
$ java org.junit.runner.JUnitCore TestClass
```

## メソッドの動作検証の例

ここでは，動作を検証するメソッドの例として，パラメータとして整数（int型）を受け取り，その値が偶数かどうかを判別するメソッドis_evenについて考える．

is_evenメソッドの仕様は下記のとおりとし，Method8クラスに属するものとする．

```java
/**
 * is_evenメソッド
 * パラメータが偶数ならtrueを返し，奇数ならfalseを返す.
 * @param number 数値
 * @return 数値が偶数ならtrue
 */
public static boolean is_even( int number )
```

テスト用のクラス（UnitTest8a.java）は以下のように書きます．

```java
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.junit.*;

public class UnitTest8a {
	/** 4ならばtrue */
	@Test
	public void test1() {
		assertThat( Method8.is_even( 4 ), is( true ) );
	}
	/** 5ならばfalse */
	@Test
	public void test2() {
		assertThat( Method8.is_even( 5 ), is( false ) );
	}
}
```

基本的に，@Testに続いてテスト用のメソッドを記述します．すなわちテスト項目です．そのメソッド内でassertThatを呼び出します．第1パラメータが検証するコードで，第2パラメータが正しい動作結果です．動作結果はisメソッド内に書きます．

それでは実際にテストを実行してみましょう．

```
$ java org.junit.runner.JUnitCore UnitTest8a
JUnit version 4.11
..
Time: 0.009

OK (2 tests)
```

JUnit versionの次の行に.（ピリオド）が2つ続いています．ピリオド1つがテスト項目1つ分を表します．最後にOK (2 tests)と表示されているので，こちらからも2項目のテストを実施して，無事に動作検証が済んだことを示しています．

以上のように書式自体は単純かも知れませんが，その効果は絶大です．もしプログラムを変更しようとしているのなら，変更前にテスト項目を書いて動作を検証し，変更後に再度動作を検証すれば，変更したコードの正しさが保証されます．

## 実行のためのコマンドを簡略化する

「効果が絶大なのは分かったが，実行のためのクラス名が覚えられないよ」との意見ももっともです．そこで，もっと簡単に実行するためにテストのためのコードにmainメソッドを追加しましょう．追加するのはたったの3行です．

```java
public static void main( String[] args ) {
	   org.junit.runner.JUnitCore.main( UnitTest8a.class.getName() );
}
```

言い忘れましたが，カッコ内のクラス名は，テストのためのクラス名に合わせてください．以上の3行を追加することにより，以下のように実行できます．

```
$ java UnitTest8a
```
Android Studioのgradleでビルドのメモ


参考
[Android Studioでライブラリ依存関係を設定する方法](http://qiita.com/skonb/items/25e6b16e58a89b413908)


あと、SDKマネージャで、

## Android Support Repositry

## Google Repositry
　

はインストールしておきましょう。

　
　
　
　

*こんなことでハマるなんて・・・*
Specs2でJsonマッチャーを使う

Specs2 にはオプションも含めると多量のマッチャーがあるようです。僕が今日ちょっとJsonのマッチャーでハマったので、記事を残しておきます。

Json マッチャーを使うのに必要な準備
-----------------------------------

``` scala
import org.specs2._
import specification._
import matcher.JsonMatchers

class HogeSpec extends script.Specification with Grouped with JsonMatchers
```

s2 interpolationを使わない場合は、

```scala
class HogeSpec extends Specification with JsonMatchers
```

でいけるはずです。僕としては[s2記法をおすすめ](http://qiita.com/erukiti/items/abd4234b52d7b70e263f)してみたりしてます。

今日はこの import と with JsonMatchers を知らずにハマってました…。

マッチさせる方法
----------------

```scala
val json = """{"hoge":"fuga","piyo":{"id":1}}"""
```

みたいなjsonがあった時に、

```scala
json must /("hoge" -> "fuga")
```

や

```scala
json must /("piyo") /("id" -> 1.0)
```

のようにマッチするといいようです。

また、文字列だけじゃなくて、Play-jsonのJsValueなんかもうまくマッチしてくれるようです。

詳しくは、http://etorreborre.github.io/specs2/guide/org.specs2.guide.Matchers.html のOptionalのJsonの項目を見てみてください。(僕には説明が割と意味不明でしたが。)
CentOSとmod_perlの未来


こんにちは、mod\_perlをこよなく愛用している @[xtetsuji](https://twitter.com/xtetsuji) です。

みなさん、mod\_perl使っていますか？Plack全盛の時代でも、まだレガシープロジェクトであったり、色々な理由でmod\_perlを使い続けている方、結構いるんじゃないかと思っています。

「新しいものが良くて古いものが悪い」という考えは置いといて、mod\_perlはとてもよく枯れていて実装も一つで安定したPerlの永続的実行環境の一つです。Plackやそれらのエコシステムを使えない現場では今も有力な選択肢の一つではないでしょうか。使用の際に極度にmod\_perlにロックオンされないように設計すれば、中長期的な視野も入れた良いアプリケーションがかけると思います。



##RHEL7ベータ発表

この記事を書いているのは2013年12月ですが、去る2013年12月11日にRHEL7のベータ版が登場しました。

- [RHEL 7、ベータ登場 | マイナビニュース](http://news.mynavi.jp/news/2013/12/13/064/)

ネットの情報によると **RHEL7ベータはmod\_perl2のパッケージをコアから外した** ようです。

- [No mod_perl in RHEL 7 and CentOS 7 | Michiel Beijen](https://huntingbears.nl/2013/12/17/no-mod_perl-in-rhel-7-and-centos-7/)

その理由は「mod\_perl2がApache2.4に対応していないから」だそう。要するにRHEL7でApache2.4を採用することに決めたことで、それに対応していないmod\_perl2のパッケージが必然的に無くなることになるということらしいです。

mod\_perl2がApache2.4に現状(2013年12月現在)対応していないのは、主にWindows上のApache2.4での対応に苦慮していることが原因のようです。これは Old Nabble というフォーラムで度々議論されていたのですが、その Old Nabble のサイト自体が無くなってしまい、今ではその議論を追うことができません。mod\_perlのSubversionリポジトリのhttp24ブランチが現状を理解できる数少ない場所です。

##今後登場するCentOS7でもmod\_perl削除の動きか？

RHEL7でmod\_perl2のパッケージが削除されれば、それの写像といってもよいCentOS7でもmod\_perl2のパッケージが削除されることが避けられないでしょう。

よく「システムPerlはスレッドを有効にしてコンパイルしてあるから、まずPerl、そしてApacheとmod\_perlも自前でコンパイルする」という人がいますが、そういう人は大丈夫でしょう。ただ、そういったシステムPerlとはいえ、スレッドを有効にコンパイルしたことによって、ウェブの実行環境としてパフォーマンスに如実に影響を与えるかといったら、よほどの大規模サイトでない限り有意な差はないように思えます。

制限された案件では、ディストリビューションのコアにあるパッケージのみしか使えないという場合もありえます。今までユーザ人口の多いCentOSの新しいバージョンでmod\_perlが削除されることの影響は皆無ではないでしょう。



##もとからあるRedHat系ディストリビューションのmod\_perl問題

RHELとCentOSが写像の関係であるという前提のもとでCentOSに焦点を絞ってお話ししますが、CentOSの特定のバージョンでは「mod\_perl1.99」と呼ばれる、当時はmod\_perl2betaであったものの、結果的にmod\_perl1とmod\_perl2のキメラのような、今では使ってはいけないAPIとなってしまったものを採用してしまったバージョンもあります。バージョンは失念してしまいましたが、`rpm` コマンドなどで分かるかと思います。

ともかく、RHELが採用するミドルウェアのバージョンは、落とし穴となるものが結構あるようなので要注意です。もちろん「全部自分でコンパイルして入れる」という人には無関係な話かもしれません。



##今後のmod\_perlについて

RHELのような動きが他のディストリビューションで出てこないとは言えません。Old Nabbleのフォーラムでは「いつまでもWindows対応のおかげでLinuxのApache2.4でmod\_perlが使えないのはオカシイ！Windows対応を切り捨てたApache2.4対応mod\_perlを出すべきだ」という意見もあり、それへの賛同も結構ありました。Linux等のPOSIX系OSで動作する用意はできているようです。mod\_perlのアップストリームの動向を観察する他ないでしょう。

ただ、世間のLinuxディストリビューションはPerlだけに関心があるわけではなく、最新を追っていくためにApache2.4を取り入れていくことは自然なことでしょう。その際、同様の理由でmod\_perlが切り捨てられていくのか、それともmod\_perlがApache2.4に「Windows環境でも完全に」サポートされリリースされて円満解決するのか、はたまたWindowsサポートを切り捨てたApache2.4対応mod\_perlが出てくるのか、にわかに判断がつかない状況です。

ちなみに2013年12月時点、Subversionのmod\_perl http24ブランチに最後にコミットがあったのは10月末です。
来年の課題はCollaboration!!!

#2009年からオープンガバメントに取り組んできたが、やっとみんなに注目されるところまでやってきた。

取り組み当初は、メディアの人に、「インターネット・オタクの取り組み」、「そんなの世論を反映していない」と言われたものだ。もちろんオープンガバメントの取り組みを応援してくれる人も多かったものの、PRが足りないと叱責を受けたものである。

それでも地道に取り組んでいたら、やっと2012年に本格的にブレイクし始めた。

#2013年のテーマは、安定したオープンガバメントの基盤作りであった。
実導入を前提とした実証等によるユースケースの創出を図るとともに、持続的にオープンデータを推進するためのエコシステムの整備を推進してきた。そのため、データカタログサイトOpenDataMETIを構築・運用し、語彙の基盤IMIを作ってきた。
データカタログサイトといっても先例のないものを作るだけに、現場の説得、メタデータ構造の作り方、データの名前の付け方等、悩みの連続であった。例えば白書を見ると、和暦／西暦、年／年度、白書の前に年があったり後ろにあったりと千差万別である。これらの公表の方法の検討、収集フロー等の整備を行ってきた。
また、語彙の基盤の構築も国内でこれほど大構想なものは先例がなく、基軸はどこに置くのか、国際協調をどう考えるのか、深さはどこまで考えるのかといった検討の毎日で、仮の案をもとに実データを当てはめ修正ということの繰り返しであった。それでも、様々な専門家の支援を受けながらなんとか道筋をつけられた。
これらの経験を活かし、国のデータカタログサイトが近日公開される等、なんとかオープンデータの基盤を作ることができたのではないか。

#あらためて、オープンガバメントの基本視点であるTransparency、Participation、Collaborationに立ち戻ってみよう。

Transparencyに関しては、データの公開という点では、まだ改善点は多いものの、かなり頑張ってきたのではないかと思う。しかし、プロセスの公開という点では十分ではない。会議等の資料や議事は公開されるものの断面の情報にすぎず、1年間のタイムラインで見ると限られた情報しか公開されていない。twitterによるこまめな情報発信は、そこを補完できたのかなと思っている。

Participationに関しては、これまでの、市民活動、業界活動、勉強会とは違った層の違った形での参加が進み、アイデアソンやハッカソンが各地で行われている。また、オープンデータ・アイディアボックスでは多くの意見を頂戴している。このように、新しい社会参加の仕組みが出来上がってきている。

Collaborationはどうであろうか。まだ改善の余地が大きいのではないか。自治体ではアイデアソンやハッカソンへ職員が参加する良い事例が増えてきている。そこでの議論や作業を、多くの参加者が有意義と評価している。一方、府省からの参加者は少なく、Collaborationというレベルに達していないのではないか。ネット上の議論であるアイディアボックスも双方向の会話レベルで活用できる府省は一握りである。

#さて、2014年に向けては、Collaborationの年にしていきたい。
データの公開等を実施してきた府省や部署も含め、「では、それをどう使うのか」、「データの可能性を引き出すのはどうしたらいいのか」を、官民の参加者全員で考え解を出せないだろうか。目的志向で多様な視点で考えると様々なヒントが出る。また、「そんなことが伝わっていなかったのか」「それなら一緒にやりませんか」という気づきが沢山ある。こんなCollaborationができましたと、いくつもの成功が出てくるように役所の中のマインドセットの変化に取り組んでいきたいものである。
Go言語: PHPのarray_combine()のような処理をする関数


# どんな振る舞い?

キーのスライスと値のスライスを与えると、マップにして返す関す。例えば、 `[]string{"green", "red", "yello"}` と `[]string{"avocado", "apple", "banana"}` を与えると `map[string]string{"green":"avocado", "red":"apple", "yello":"banana"}`  を返してくる。


```go:main.go
package main

import (
	"log"
	"errors"
)

func arrayCombile(keys []string, values []string) (map[string]string, error) {
	association := map[string]string{}
	
	if len(keys) != len(values) {
		return association, errors.New("Both parameters should have an equal number of elements")
	}
	
	for index, key := range keys {
		association[key] = values[index]
	}
	
	return association, nil
}

func main() {
	a := []string{"green", "red", "yello"}
	b := []string{"avocado", "apple", "banana"}
	c, _ := arrayCombile(a, b)
	
	log.Printf("%#v", c)
}

```