OmniAICreator/Qiita-1.07M huggingface dataset:
あると便利なアサート

プログラムのバグをいち早く検知するためにアサートを使うのは当たり前ですが、

```
assert(p != NULL);
```

だけ出されてもサッパリですよね……。
例えば、「その p の値を知りたいんだよ！！」って時もあります。

個人的にはアサートで止まった時、以下の情報が欲しくなります。

* 引っかかったアサートがあるファイル名とその行数。
* 引っかかった条件
* 引っかかった値
* アサートの原因を示すメッセージ

というわけで、せっかくなのでこれらを満たすアサートを作ってしまおうと思って、ちょっと作ってみました。
今回作ったのは、以下のアサートです。

| 定義名 | 概要 |
|:------|:-----|
| my_assert(expr,...) | 一般的なアサート |
| my_assert_range(value, min, max) | 範囲外の値が指定された |
| my_assert_array(index, max) | 配列外にアクセスした |
| my_assert_must_not_happen() | 本来であれば来ちゃダメなところに来ちゃった |
| my_assert_null(ptr) | NULL アクセスした |

my_assert さえあれば後はどうにでもできますが、
他のアサートも結構頻繁に使うし、使うならメッセージを統一化しておいたほうがわかりやすいので用意しました。

ちなみに、my_assert が条件以外にも可変長引数で引数を指定できるようにしてあるのは、
my_assert_range みたくメッセージに数値を入れたくなる場合があるからです。

以下、コードです。

```cpp:main.cpp
#include <stdio.h>
#include <stdlib.h>

#ifdef _DEBUG

namespace internal { // 内部実装

// 停止(戻り値が必要なので、独自に定義)
int abort() {
	::abort();
	return 1;
}

} // namespace internal

// 自作アサート
#define my_assert(expr,...) \
	(!(expr) && printf("%s(%d): my_assert failed: "#expr"\n", __FILE__, __LINE__, __VA_ARGS__) && internal::abort())

#else

// 自作アサート(Release 時は無効)
#define my_assert(...)

#endif

// ------------------------------------------------------------------
// いろんな assert
// ------------------------------------------------------------------

// 「値が範囲外だよ！！」
#define my_assert_range(value, min, max) \
	my_assert((min <= value) && (value <= max) && "(%d <= [%d] <= %d)", min, value, max)

// 「配列外アクセスだよ！！」
#define my_assert_array(index, max) \
	my_assert((0 <= index) && (index < max) && "(0 <= [%d] < %d)", index, max)

// 「ここに来ちゃだめだよ！！」
#define my_assert_must_not_happen() \
	my_assert(false && "(must not happen.)")

// 「NULL アクセスだよ！！」
#define my_assert_null(ptr) \
	my_assert(ptr != NULL && "(null access.)");

int main()
{
	int value = 10;
	int index = 3;
	int * p = NULL;

	my_assert_range(value, 0, 3);
	my_assert_array(index, 1);
	my_assert_must_not_happen();
	my_assert_null(NULL);

	return 0;
}
```

```:output
main.cpp(50): my_assert failed: (0 <= value) && (value <= 3) && "(0 <= [10] <= 3)"
main.cpp(51): my_assert failed: (0 <= index) && (index < 1) && "(0 <= [3] < 1)"
main.cpp(52): my_assert failed: false && "(must not happen.)"
main.cpp(53): my_assert failed: p != NULL && "(null access.)"
```
Spring + Thymeleaf

環境
Spring 4.0.4
Thymeleaf 2.1.2

Template Engine
-
SpringのTutorialを進めていたらViewはThymeleafで実装されていた。
もともとJSPでやるつもりはなかったけど、VelocityとかFreeMarkerよりSpringはThymeleafが好きなのかな？ふむふむ。

Mixer2も気になったけど今回はThymeleafを選択！

Thymeleaf
-
Thymeleafは基本的にHTMLとして使うことができるのでLogicとViewを分担しやすいテンプレ。
あと個人的な感想ですが書きやすいなーと思います。そしてネーミングセンスがすばらしい！笑


Thymeleaf のインストール
-
Mavenで自動的に取ってきてもらいます。(最新バージョン2.1.2)

```xml
<dependencies>
	<groupId>org.thymeleaf</groupId>
	<artifactId>thymeleaf-spring4</artifactId>
	<version>2.1.2.RELEASE</version>
</dependencies>
```

Thymeleaf の設定(JSP → Thymeleaf)
-
Servletの設定ファイルを変更

JSP の設定

```xml
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
</bean>
```


Thymeleaf の設定

```xml
<bean id="messageSource"
		class="org.springframework.context.support.ResourceBundleMessageSource" />

<bean id="templateResolver"
		class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
	<property name="prefix" value="/WEB-INF/views/" />
	<property name="suffix" value=".html" />
	<property name="templateMode" value="HTML5" />
	<property name="characterEncoding" value="UTF-8" />
</bean>

<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
	<property name="templateEngine">
		<bean class="org.thymeleaf.spring4.SpringTemplateEngine">
			<property name="templateResolver" ref="templateResolver" />
		</bean>
	</property>
	<property name="order" value="1" />
	<property name="characterEncoding" value="UTF-8" />
</bean>
```

idとpropertyは間違えないようにしてください。
あと、TemplateResolverの設定は自分の設定に合わせてください。

これで準備完了！


後はViewをHTMLで作るだけです！
VirtualBoxでビデオメモリを使う

どうにもVirtualBoxの動きがもっさりしてて気に食わなかったのでビデオメモリの割り当てと3Dアクセレーションを有効化したらかなり改善したのでこれはオススメです。

## 設定方法
VirtualBoxのイメージごとの設定画面を開いて`設定→ディスプレイ`の`ビデオ`のところで初期設定だと12MBしか割り当てられてないので128MBにして、下の`3D アクセレーションを有効化`もチェックしときます。

もちろんホストPCのスペックが低い場合は何をどうしようが無理なので諦めて新しいPCを買いましょう。
django で twitter bootstrap を使う


#始まり
django で twitter bootstrap を使おうとした。（windows）
でも、htmlを読み込むところで失敗。

コマンドラインを見ると、bootstrapのcssとjsフォルダを読み込めていないことが発覚

え。もしかして、urls.pyで読み込むように書かないといけないの？
いやいや、そんなめんどくさいはずない！
と思って調べてみると、

settings.pyの、INSTALL_APPSで
django.contrib.staticfiles
を読み込んでいると、静的ファイル（cssとかjsとか）を簡単に扱えることがわかった。

以下、設定の手順

##静的ファイルの保存場所の設定

```py:settings.py
   import os
   from os.path import abspath,dirname,basename
   #プロジェクトのルートをSITE_ROOTとする
   SITE_ROOT = abspath(os.path.join(dirname(__file__),".."))
   #静的ファイルを保存するフォルダ名を設定
   STATIC_URL = '/static/'
   #静的ファイルを保存するフォルダのパスを設定
   STATICFILES_DIRS = (
       os.path.join(SITE_ROOT,'static'),
       )
```

##URLマッピングの追加

```py:urls.py
   from django.conf.urls import patterns, include ,url
   #追加する部分1:静的ファイル用のモジュール
   from django.contrib.staticfiles.urls import staticfiles_urlpatterns

   urlpatterns = patterns('',
   ...
   )

   #追加する部分2
   urlpatterns += staticfiles_urlpatterns()
```

##静的ファイルの配置
今回は、プロジェクトのルートディレクトリ下に、
staticフォルダを作成し、その下にbootstrapのフォルダを追加した。

##htmlファイルの書き換え
静的ファイルのリンクの前に、```{{ STATIC_URL }} ``` を追加する。

```html+django:sample.html

   ...

   <link href="{{ STATIC_URL }}css/bootstrap.min.css" rel="stylesheet" >
   ...
```

と、ここまでで、きちんと動くと思ったのだが、自分の環境では動かなかったので、次の手順を行った。
##レンダリングをRequestContextで行う

```py:views.py
   from django.shortcuts import render_to_response
   from django.template import RequestContext

   def sample(request) :
      return render_to_response('sample.html',{'title':"タイトル"},context_instance = RequestContext(request))

```

以上。

参考サイト：[DjangoでCSSなどの静的ファイルを配信する(開発サーバー編)](http://0xfffffff7.hatenablog.com/entry/2013/12/01/004209)
Mint16 CinnamonにDropboxをインストール

Dropboxがないと生きていけない体になってしまったのでLinuxディストリをいれたらまずはDropboxです。Dropboxが対応してなかったらそのディストリは諦めます。

## インストール方法

Mint16 Cinnamonの場合は

```shell-session
$ sudo apt-get install nemo-dropbox
$ dropbox start
```

すればOK。Ubuntuより簡単だ、すごい！！
ちゃんとタスクトレイにも入るししっかりしてる。

## Mint with Mate の場合

Mateの場合は `nemo-dropbox`の代わりに `caja-dropbox`を使うといいらしいです。

## 参考

<a href="http://www.youtube.com/watch?v=ya7miJvjWPE">How to install Dropbox in Linux Mint 16 - YouTube</a>
Git 勉強会で学べた共同開発で意識すべき2つのこと


[SCMBootCamp in Nagoya #2](http://peatix.com/event/34581) に参加させていただきました。
Gitをチームで運用した際の注意点を学べました。

# pull するときの注意点

他のリモートリポジトリの内容をローカルリポジトリに取り込むコマンドが `pull` である。

	$ git pull

このコマンドは、デフォルトの動作は以下のような動作となる。

	$ git fetch
	$ git merge origin/master

よって何も考えずに `pull` しているとコミットログがえらいことになる。
具体的には[こんな感じになる(最初の方)](https://github.com/nkkn1008/GitCheetSheet/network)。
![first.png](https://qiita-image-store.s3.amazonaws.com/0/16341/f3c2c58c-5769-1101-3754-62c5dd19f880.png)

`pull` だけのためのブランチがたくさんできてしまう。

これを避けるために `rebase` を利用する。

	$ git pull --rebase

リモートリポジトリの情報を取り込む際に `rebase` することでコミットログが綺麗に保てる。
![later.png](https://qiita-image-store.s3.amazonaws.com/0/16341/b376a3b4-2f60-f9e3-3ce3-a8aa784b0e2a.png)


# pushするときの注意点

`push` する前に、リモートリポジトリのコミットログを分かりやすくすることが望ましい。
それを実現するために、ローカルリポジトリは、以下の2つのコマンドを利用して整理しておくとよい。

	$ git rebase -i

このコマンドによって、歴史の改変ができる。複数のコミットをまとめたりコメントを編集できるので `push` 前に綺麗にするとよい。

	$ git checkout -b branch
	$ git merge branch

いわゆる feature branch をきちんと切る、ということ。
機能の追加等の目的ごとにブランチを切ることで、コミットログ上で何をやっているかが明確になる。

# その他勉強会の振り返り

## Keep
- いろいろと幅広い知識をもつ人達に会うことができ、とても良い機会であった
- `merge` と `rebase` の使いどころの理解が深まった
- Git Command のCheet Sheet作成を通じたチームでのGit運用が楽しかった
- Git Commandのカルタが楽しかった

## Problem
- 勉強会のコマンドの `history` をコピーし忘れてしまった

## Try
- Team運用する際は、とくにコミットログの綺麗さを意識する
- 興味のあることのCheet Sheetをチームで友人とGithubを通じて作成してみる
VirtualBoxにMint16 Cinnamonをインストール

VirtualBoxにISOからMint16をインストールする時のメモ。
初めはVirtualBox専用のイメージを落としてきて動かそうとしてたけどISOから直接インストールするのが一番簡単でした。

## ISOをダウンロード

`Linux Mint 16 "Petra" - Cinnamon (32-bit)`のISOをここから落としてくる。
http://www.linuxmint.com/edition.php?id=143

バージョンは適当に選びましょう。32bitを選ぶのは何かこっちのほうが仮想環境で動かすなら安定してる気がするというあやふやな理由です。


###追記

ゲストOSが64bitじゃないと複数CPUを割り当てることができないと知って後悔。
il||li ▄█▀█● il||li

## VirtualBoxのイメージを作成

- VirtualBoxで`Mint16Cinnamon`とか適当な名前でイメージを新規作成。
- 「設定→ストレージ」でドライブにISOを指定して起動すると後は普通に支持に従ってインストール。

仮想ディスクサイズを聞かれると思うので可変サイズの20GBぐらいにしといたほうが後々楽です。

これでとりあえずインストールは終わり。
Mint16にChromeをインストール

できれば`apt`からインストールしたいもんですが、残念ながらMintでChromeをインストールするときは`deb`ファイルを直接ダウンロードしてきてインストールしないとダメなようです。

## インストール

https://www.google.com/chrome/browser/?platform=linux&extra=devchannel

から環境にあったのをダウンロードするとFirefoxで開いてるなら標準で`gdebi-gtk`というパッケージマネージャーので開くらしいので任せて開く。

`Install Package`をクリックすればインストールされます。

もうデフォルトでインストールしててくれたらいいのにライセンスがめんどくさいんでしょうね。
expressの開始方法

単純な起動方法

1. インストール

 ```bash
 npm install -g express
 npm install -g express-generator 
 ```

2. テンプレート生成
 ejsテンプレートで作成

 ```bash
 express -e TestApp
 ```

3. 起動

 ```bash
 cd TestApp
 npm start
 ```

 ※`package.json`を次のように編集すると、`node-dev`で起動できる。

 ```diff
   "scripts": {
 -    "start": "node ./bin/www"
 +    "start": "node-dev ./bin/www"
   },
 ```
swizzlingを理解する

objective-cではオブジェクトへメッセージが送られたときに呼び出されるメソッドは実行時に
決定する（動的結合）。この性質を使ってメッセージとして送られてきたセレクタによって
解決されるメソッドを入れ替えてしまう方法が存在する。これをswizzlingと呼ぶ。

やり方は凄く簡単でFooクラスのhogeメソッドとbarメソッドを置き換えるとすると
まずは両方のメソッド情報をclass_getInstanceMethodを使用して取得。
`Method hoge_method = class_getInstanceMethod([Foo class], @selector(hoge));`
`Method bar_method = class_getInstanceMethod([Foo class], @selector(bar));`
交換するにはmethod_exchangeImplementationsを実行するだけ。
`method_exchangeImplementations(hoge_method, bar_method);`

class_getInstanceMethodとmethod_exchangeImplementationsはランタイムAPIとして
提供されている。ランタイムの提供している関数を呼び出すことでswizzlingなどのように
一見変わったごにょごにょしたことが出来たりする。
[ランタイムAPI](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html)

参考までに検証に用いたコードを以下に示す。

```objc:main.m
#import <Foundation/Foundation.h>
#import <objc/runtime.h>

@interface Foo : NSObject
-(void)hoge;
-(void)bar;
@end

@implementation Foo
-(void)hoge
{
    NSLog(@"selector:%@  method:hoge method!!",NSStringFromSelector(_cmd));
}
-(void)bar
{
    NSLog(@"selector:%@ method:bar method!!",NSStringFromSelector(_cmd));
}
@end

int main()
{
    Foo *foo =[[Foo alloc] init];
    //それぞれのメソッドを呼び出す。
    [foo hoge];
    [foo bar];
    
    Method hoge_method = class_getInstanceMethod([Foo class], @selector(hoge));
    Method bar_method = class_getInstanceMethod([Foo class], @selector(bar));
    
    method_exchangeImplementations(hoge_method, bar_method);
    
    //swizzlingでメソッドを交換後にそれぞれ呼び出し。
    [foo hoge];
    [foo bar];
    
    return 0;
}
```

どういう時に使うのか少し調べてみると、
ソースが公開されてないメソッドの動きを解析するときに独自メソッドに
置き換えて色々情報を取得するとか、
参考)Estimote Beacon をリバースエンジニアリング
http://d.hatena.ne.jp/shu223/20140131/1391155397

Effective-Objective-C2.0でもソースコードを持たないメソッドのデバッグで使えと
書いてあり、実用的に使うよりもデバッグ、解析用途が多いのかなという印象。

実用的な例としては、以下のような記事もあった。
http://qiita.com/shu223/items/3868894458832d4cc8e1
実用的に使う場合もあるみたい。
VirtualBox上のMintのディスクサイズを変更

Virtualboxに`Mint`をインストールすると、パーティションの区切り方の問題で初期設定の8GBのままだとすぐに容量が一杯になってしまいます。なので仮想ディスクのサイズを増やしてMint上でもその設定を反映させる必要があります。

## VirtualBoxの仮想ディスクサイズの変更

VirtualBoxの仮想ディスクファイル`.vdi`をこんな感じでサイズ変更。これで最大20GBに変えれます。

```
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyhd "C:\Users\ironsand\VirtualBox VMs\Mint16Cinamon\Mint16Cinamon.vdi" --resize 20000
```

## Gpartedでパーティションサイズを変更

http://gparted.org/download.php

からGpartedのisoファイルをダウンロードしてきて、VirtualBoxのMint16の設定→ストレージで光学ドライブにそのISOを指定して仮想マシンを再起動してGpartedを立ち上げる。

`/dev/sda1`を拡張したいけど`/dev/sda2`が邪魔でできないので配下の`/dev/sda5`のスワップディスクとともに削除するして、`dev/sda1`をswap用の500MBぐらい残して増やす。

んで、もう一度拡張倫理ドライブを作ってその下にLinux-swapディスクを作成する。んで`Apply`して変更を保存します。

このままだとUUIDが変更されたswapディスクがエラーを起こしてしまうのでGpartedのTerminalを使って`fstab`を編集。

```shell-session
sudo mount /dev/sda1 /mnt
sudo vi /mnt/etc/fstab
```

でファイルを開いて

```
UUID=xxxx-xxx-xxxx-・・xxx  none  swap sw 0 0
```

を

```
# UUID=xxxx-xxx-xxxx-・・xxx  none  swap sw 0 0
/dev/sda5  none swap sw 0 0
```

な感じに変更。以上でGpartedの作業は終了なので`sudo shutdown -h now`とかで終わらせる。

## Mintの立ち上げ

問題がなければ以上でMintで使えるディスクサイズが増えてるはずなので起動させて確認しましょう。

```
ironsand@vm-mint ~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        19G  3.7G   15G  21% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            2.0G  4.0K  2.0G   1% /dev
tmpfs           404M 1000K  403M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            2.0G  964K  2.0G   1% /run/shm
none            100M  8.0K  100M   1% /run/user
```

ひゃほーい！

## 参考

<a href="http://ankyo.blog.so-net.ne.jp/2011-02-20">【Ubuntu】Virtualbox の仮想ハードディスクの容量を増やす方法：なんでもかんでもコンピュータ：So-netブログ</a>
VirtualBoxでホストPCとゲストPCでクリップボードを共有する

VirtualBox、特に初期設定が終わってなくて日本語がまだ使えない時とかはクリップボードをホストOSと共有できないと大変です。昔は拡張機能を入れないと出来なかった気がするのですが、最近は設定したらその場で反映されます。ゲストPCの再起動さえ必要ありませんでした。すげー。

## 設定方法

`設定→一般`の`高度`タブを選択して`クリップボードの共有`を`双方向`に設定。以上。
Ruby アルゴリズム 線形探索と二分探索

Rubyを通して線形探索と二分探索を学ぶ


##線形探索(リニアサーチ)
線形探索(リニアサーチ)とはリストの先頭から終端に向かって目的の要素を探し出すアルゴリズム。

とても単純で書きやすいアルゴリズムであるがリストのデータ量が多くなればなるほどに遅くなる。

```rb
def linear_search(arr_size, value)

  arr = (1..arr_size).to_a

  arr.each do |number|
    if number == value
      return "Found!"
    end
  end
end
```

下記イメージ図

![2014-05-18 16.05.10.jpg](https://qiita-image-store.s3.amazonaws.com/0/26003/91ce0f70-9913-1149-d977-6d08f34eff79.jpeg)


##二分探索(バイナリサーチ)
二分探索(バイナリーサーチ)はソート済みの配列において、検索する間隔を半分に分割しながらデータを探し出すアルゴリズム
リニアサーチより高速であるがデータを必ずソートしなければならない

手順
１：配列を昇順もしくは降順にソートする。
２：配列の中央の要素を調べる
３：中央の要素が目的のデータより大きければ中央より後半の部分を調べる、また目的のデータより小さければ中央より前半の部分を調べる。
４：２に戻る

```rb
def binary_search(arr_size, value)
  arr = (1..arr_size).to_a

  left = 0
  right = arr.last
  mid = 0

  while left <= right do
    mid = (left + right) / 2
    if arr[mid] == value
      return "Found!"
    elsif arr[mid] < value
      left = mid + 1
    else
      right = mid - 1
    end
  end
end
```

下記イメージ図

![2014-05-18 16.04.25.jpg](https://qiita-image-store.s3.amazonaws.com/0/26003/55819376-60ab-9518-0466-5c56e2942635.jpeg)



##ベンチマークで検証


```rb

require 'benchmark'

#(以下省略)

puts Benchmark.measure { linear_search(1000, 100) }
puts Benchmark.measure { binary_search(1000, 100) }

=> 0.000000   0.000000   0.000000 (  0.000063)
=> 0.000000   0.000000   0.000000 (  0.000057)
 
puts Benchmark.measure { linear_search(100000, 10000) }
puts Benchmark.measure { binary_search(100000, 10000) }

=> 0.010000   0.000000   0.010000 (  0.004974)
=> 0.000000   0.000000   0.000000 (  0.004211)

puts Benchmark.measure { linear_search(100000, 99999) }
puts Benchmark.measure { binary_search(100000, 99999) }

=> 0.010000   0.000000   0.010000 (  0.011502)
=> 0.000000   0.000000   0.000000 (  0.004361)

```

検索範囲が大きくなればなるほど線形探索と二分探索の検索結果が大きくなっていく、また検索する対象が後尾になればなるほど二分探索の結果が早くなる。
秒を時間表示へ変換する

#前提条件
* 秒が正であること。

負の場合は適当に符号をひっくり返して元に戻したりしてください。

#手順
適当な日の0時のTimeオブジェクトを取得し、そのオブジェクトに目的の秒数を加算し、Time#strftimeで変換後の値を取得。
ただし目的の秒数が86400秒（1日）を超える場合には、超えないように処理しておく。
#例
##10000秒は何時間何分何秒？

```rb
require 'time'
sec = 10000
day = sec.to_i / 86400
(Time.parse("1/1") + (sec - day * 86400)).strftime("#{day}日%H時間%M分%S秒")
=> "0日02時間46分40秒"
```
2時間46分40秒。
##1000000秒は？secへの代入を除いて一行で書きたい。

```rb
sec = 1000000
(Time.parse("1/1") + sec - (day = sec.to_i / 86400) * 86400).strftime("#{day}日%H時間%M分%S秒")
=> "11日13時間46分40秒"
```
##一行で書けたけど、86400が多くて、なんか根本的にイマイチ。
`Numeric#divmod`を使ってみてはいかがでしょう。
>self を other で割った商 q と余り r を、 [q, r] という 2 要素の配列にして返します。 商 q は常に整数ですが、余り r は整数であるとは限りません。
[instance method Numeric#divmod](http://rurema.clear-code.com/2.6.0/method/Numeric/i/divmod.html)

```rb
sec = 1000000
day, sec_r = sec.divmod(86400)
=> [11, 49600]
(Time.parse("1/1") + sec_r).strftime("#{day}日%H時間%M分%S秒")
=> "11日13時間46分40秒"
```
##じゃあこれを一行で書いてみてよ。
`Numeric#divmod` の返値が要素二つの配列と決まっているので、かなり強引ですが [`Enumerable#each_slice`](http://rurema.clear-code.com/2.6.0/method/Enumerable/i/each_slice.html)を使ってみましょう。

```rb
sec = 1000000
sec.divmod(86400).each_slice(2).map { |day, sec_r| (Time.parse("1/1") + sec_r).strftime("#{day}日%H時間%M分%S秒") }.first
=> "11日13時間46分40秒"
```


##秒以下表示は？例えば99999.9秒とか？
`Time#strftime`でミリ秒表示をする`%L`を使いましょう。

```rb
sec = 99999.9
day, sec_r = sec.divmod(86400)
=> [1, 13599.899999999994]
(Time.parse("1/1") + sec_r).strftime("#{day}日%H時間%M分%S秒%L")
=> "1日03時間46分39秒899"
```
…残念。演算誤差が出ました。
では`Rational`クラスを使ってみましょう。

```rb
sec = 99999.9
sec_rationaled = Rational(sec.to_s)
=> (999999/10)
day, sec_r = sec_rationaled.divmod(86400)
=> [1, (135999/10)]
(Time.parse("1/1") + sec_r).strftime("#{day}日%H時間%M分%S秒%L")
=> "1日03時間46分39秒900"
```
ここまでやるかどうかはお任せしますw
#表示から余分な0を除く
Time#strftimeで%Hの場合、一桁だと0で埋められてしまいます。

```rb
(Time.parse("1/1") + 10000 + 15 * 60 + 25).strftime("%H時間%M分%S秒")
=> "03時間02分05秒"
```
%とHやMとの間に`-`を入れると余分な0を消せます。

```rb
(Time.parse("1/1") + 10000 + 15 * 60 + 25).strftime("%-H時間%-M分%-S秒")
=> "3時間2分5秒"
```
その他いろいろあります。
>
\^: 大文字で出力を行なう
\#: 小文字であれば大文字に、大文字であれば小文字に変更する
\-: 左寄せにする(0埋めや空白埋めを行わない)
\_: 空白埋めにする
0: 0埋めにする
数値: 表示桁数を指定する

>```rb
t = Time.now                         #=> 2010-09-05 15:41:17 0900
t.strftime("Printed on %m/%d/%Y")    #=> "Printed on 09/05/2010"
t.strftime("Printed on %m/%-d/%_6Y") #=> "Printed on 09/5/  2010"
t.strftime("at %I:%M%p")             #=> "at 03:41PM"
t.strftime("at %I:%M%#p")            #=> "at 03:41pm"
```
>[instance method Time#strftime](http://rurema.clear-code.com/2.6.0/method/Time/i/strftime.html)

#参考
* [数字から時間フォーマットに変換する方法は何ですか？ - QA@IT](http://qa.atmarkit.co.jp/q/2178)
* [Ruby - strftimeで月日の頭のゼロを表示しないようにする。 - Qiita](http://qiita.com/ryam/items/668f718fc425a4f72816)
Angularjsを試してみた

最近Angularjsに魅せられてます。
めっちゃ楽しいです

というわけで、Angularjsの紹介です

以下に特徴を上げます。間違っていたらすみません。

* Googleが作った、MVCのフレームワーク
* MVCフレームワーク・・・例えば、backbone.jsとかですと、viewとcontrollerがごちゃまぜになってしまい、Collectionの一要素としてmodelを定義するなど、決してわかりやすいとは言えません。また、backboneの場合、jqueryなどのフレームワークと組み合わせないと、結局余り使えない
* Viewにあたるのが、テンプレートファイルになるので、RubyやPHPなどサーバサイドのフレームワークを使う人にとってもわかりやすい仕組みになっている
* DOM要素の取得がjqueryより簡単（らしい。）
* jqueryで出来たことは、多分こいつで書けるっぽい

ここのページの紹介文がわかりやすいかもです
http://blog.livedoor.jp/sasata299/archives/51966228.html
あとは公式のサンプル
https://docs.angularjs.org/tutorial/step_03

で、今回何をしたかって言うと、
http://www.buildinsider.net/web/bookjslib111/86
このbackbone.jsのサンプルを、全部Angularjsで作り直してみました

以下がこのソースコード

```
'use strict';

/* Controllers */

var gistApp = angular.module('gistApp', []);


gistApp.controller('GistListCtrl', function($scope, $http) {
  	console.log($scope.query);

	//ng-modelの値が変化するたびに呼ばれる  
  	$scope.onChange = function () {
	    $http({
  		method:'get',
  		params:'callback=json',
  		url:'https://api.github.com/users/'+$scope.query+'/gists',
  		responseType:"json"
  		}
  		).success(function(response) {
			//console.log(response.data);
			//console.log(response);

		$scope.gists = response;
		});
	};
  	
  	
  
});
```

```
<!DOCTYPE html>
<html ng-app="gistApp">
<head>
  <meta charset="UTF-8" />
  <title>Angular.jsを用いたGist検索サンプル</title>
  <!-- Modelクラスをインポート -->
  <script type="text/javascript" src="js/angular.min.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.8/angular-resource.min.js"></script>
  <!-- Viewクラスをインポート -->
  <script type="text/javascript" src="js/controller.js"></script>
  
</head>
<body ng-controller="GistListCtrl">
  <!-- Viewの定義 -->
  <div id="gistapp">
    <header>
      <h1>Gist 検索</h1>
    </header>
    <section id="condition">
      ユーザ:
      <input ng-model="query" ng-change="onChange()" >
    </section>
    <section id="result" >
      <ul id="gist-list">
        <li ng-repeat="gist in gists track by $index">
        <a href="{{gist.html_url}}" target="_blank">{{gist.id}} : {{gist.description}}</a>
        </li>
      </ul>
    </section>
  </div>
</body>
</html>
```

こんだけです。backbone使うより圧倒的にスッキリしてます。

* チュートリアルを見てもらうとわかるのですが、チュートリアルはjsonに対して、ng-modelで取得したものを検索かけるのですが、今回はサーバ検索時にng-modelで取得した値が必要なため、チュートリアルとは違った実装をしています
* ng-repeatでループ処理してます
* 基本扱うデータはJSON形式です。
* ng-changeはng-modelの値が変わるたびに呼ばれています。(keyup,keydown,keypressに近い)

githubにソース上げてあります
https://github.com/shiratsu/backbone_sample
（元々backboneを学んでる過程で出てきたものなので、backboneと混じってます。両者を比較して参考にしてみてください）
RでTwitter分析。指定キーワードの時間帯別ツイート数を可視化する。

#出力イメージ
![Rplot01.jpeg](https://qiita-image-store.s3.amazonaws.com/0/38787/2119bf30-8251-ab06-1366-c1a177a822b4.jpeg)


#概要
指定キーワードの時間帯別ツイート数をRで可視化する。
Twitterでは、キーワードごとにツイートされやすい時間帯がある。
例えば、「おはよう」は朝にツイートされやすい。
この可視化により、そのキーワードを話題にしてもらいやすい時間帯が分かる。

#作業
「[Rでネットワーク分析。指定Twitterユーザーのフォロー関係を可視化する。](http://qiita.com/nezuq/items/75235f2139370cd8166c)」の作業を行う。
ただし、コードの「#【本処理】」以降は下記のものに変更する。

```r:TwitHoursHist.R
#【本処理】

#Twitter検索キーワード
keyword.tgt <- '"島風くん"'
#Twitter検索対象日付
date.tgt <- "2014-05-17"
#Twitterで検索
date.next <- format(as.POSIXct(date.tgt) - 1, "%Y-%m-%d")
twt.raw <- searchTwitter(keyword.tgt, n = 1500, since = date.next, cainfo = cacert.name)
twt <- twListToDF(twt.raw)
twt$created.jst <- format(as.POSIXct(twt$created) + (3600 * 9), "%Y-%m-%d %H:%M:%S JST")
twt$created.jst.dt <- as.POSIXct(twt$created.jst, "JST") 
#検索対象日付のものを抽出
twt.tgt <- twt[as.POSIXct(date.tgt, "JST") <= twt$created.jst.dt & twt$created.jst.dt < (as.POSIXct(date.tgt, "JST") + (3600 * 24)), ]
#描画
hist(
  twt.tgt$created.jst.dt, 
  breaks = "hours",
  freq = T,
  col = "red",
  format = "%H時",
  main = paste('時間帯別ツイート数（', keyword.tgt, '、',date.tgt,'）', sep = ""), 
  xlab = "時間帯", 
  ylab = "ツイート数")
```

#感想
「島風くん」は夜の話題。（意味震）
railアプリを作成してherokuにデプロイする(Ubuntu 14.04 LTS)




http://railstutorial.jp/

⬆️を写経しようとしたが結構違ってしまった


git設定

$ git config --global user.name "ユーザ名"
$ git config --global user.email メアド


※ postgresql用
$ sudo apt-get install libpq-dev
$ gem i pg


※ postgresのロール追加
$ sudo su - postgres
$ createuser "rails newとかするユーザ名" -d


railsアプリ作成

$ mkdir rails_projects
$ cd rails_projects/

※この手順本当にいるのか不明
$ sudo apt-get install ruby-railties-4.0

$ rails new rails_tutrials -d postgresql
$ cd rails_tutrials

$ git init
$ git add .
$ git commit -m "Initialize repository"


※ログ確認
$ git log

githubにログインして、「rails_tutrials」リポジトリを作成する

$ git remote add origin git@github.com:ユーザ名/rails_tutrials.git


$ git push -u origin master


$ rake db:create


$ rake db:migrate

railsの起動を確認

$ rails s


heroku toolbeltをインストールする

https://toolbelt.heroku.com/
$ wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh

$ heroku login

$ cd ~/rails_projects/rails_tutrials

$ heroku create

$ ssh-keygen -t rsa
/home/ユーザ/.ssh/id_rsa_heroku

$ heroku keys:add ~/.ssh/id_rsa_heroku.pub

herokuに接続するための設定を追加

$vi ~/.ssh/config
Host heroku.com
 User git
 Hostname heroku.com
 IdentityFile ~/.ssh/id_rsa_heroku

herokuデプロイ

$ git push heroku master

heroku停止

$ heroku ps:scale web=0
$ heroku ps:scale worker=0
Web APIのクロスドメインアクセスについて


JSONPやXMLHttpRequest Level2などの仕組みについて、現時点の理解を以下にまとめた。
簡単なので読んでみてほしい。

<iframe src="http://www.slideshare.net/slideshow/embed_code/34814937" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px 1px 0; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/kitfactory/web-api-34814937" title="クロスドメインアクセスを理解してWeb APIを楽しく使おう" target="_blank">クロスドメインアクセスを理解してWeb APIを楽しく使おう</a> </strong> from <strong><a href="http://www.slideshare.net/kitfactory" target="_blank">kitfactory</a></strong> </div>
PuppyLinux+QtCreatorでのgit sshakpass

git では、リモートからclone/push/pullなどの操作をする時に
ssh のパスフレーズの入力を求められます。
(git接続のみ、https接続では不要。)
  これを QtCreator の git のメニューから実行しようとすると、
sshのパスフレーズに対応するコマンドが設定されていないために、
失敗します。

これを解決するには、QtCreatorの
ツール>>オプション>>バージョン管理システム>>共通
の設定画面のsshプロンプトコマンドの項目にsshaskpassに該当する
コマンドを設定してあげる必要があります。
例えば、x11-ssh-askpass をインストールして設定することで解決できます。

x11-ssh-askpass
http://www.jmknoble.net/software/x11-ssh-askpass/

ちなみにopenSUSEでは、KDE Wallet に対応する ksshaskpass というソフトがリポジトリに登録されているようで、インストールしてQtCreatorのオプションにパスを設定すれば使えるようになります。
GNOME環境であれば gnome ssh askpass が使えるかと思います。
開発時にplackupで起動した時に出力されるログを制御する


出力されるログを制御するPlack::Middleware::LogFilterというものを書いた。
https://github.com/memememomo/Plack-Middleware-LogFilter

以下のようにして使用する。

```perl:app.psgi
use Plack::Builder;
builder {
    enable 'LogFilter', filter => sub {
        my ($env, $output) = @_;

        # ignore static file log
        if ($output =~ /\/static\/(js|css|images)/) {
            return 0;
        }

        return 1;
    };
    $app
};
```

ログの１行１行で、出力するかどうかを判別するフィルタを設定できる。
上記の例では、静的なファイルの配信ログを出力しないように設定している。


開発でplackupコマンドでアプリを立ち上げて
WAFなりPlack::Middleware::Staticなりで、
静的ファイルもPSGIアプリで返すと、
静的ファイルの配信ログもドバっと出力されてしまう。
printデバッグで出力しているログが流れてしまってたりしたので不便だった。

パイプやgrepで頑張れば同じことができそうな気もしたが、
うまくいかなかったのでひとまずこの形で解決した。
Mint16にEmacs24をインストール

「Mint良いらしいよ。」というあやふやな噂に惹かれてVirtualBoxにMint16をインストールしてみました。まずはEmacs24をインストールしたので、そのメモ。

別にMint限定じゃなくてDebian系列なら全部こうする気がします。

## インストール方法

```
sudo apt-get update
sudo apt-add-repository ppa:cassou/emacs
sudo apt-get update
sudo apt-get install emacs24 emacs24-el emacs24-common-nondfsg
```

です。
`emacs24-el emacs24-common-nondfsg`の2つがなんでいるのかはよくわからないけど、そう説明されてたので何も考えずに従いました。

## Dropboxで設定を同期

んでこんな感じで設定も同期しとく

```shell-session
$ ln -s ~/Dropbox/Applications/Emacs ~/.emacs.d
```

これで複数PC間で同じ設定のEmacsが使えるようになってとても便利。
違うOS感の差異の吸収については`init-loader`とかで検索するとわかります。

## 参考

https://launchpad.net/~cassou/+archive/emacs
1つの画像で4つの角を再現するCSS


site: http://develo.org/2014/05/11/2100.html


4つの角を1つの画像を反転して置きたいときにいつも 「どうやったらできるんだろ・・。」と悩んでました。

あるとき・・。「こうやったらできるんじゃない！？」と閃いて試してみたらできたのでメモしときます。

仕様
----

1. :before,:afterを使って再現。（なので背景は別で使うことができます。）
2. -webkit-box-reflectを使うため、webkit系ブラウザのみ対応（スマホサイトなど作るときに役立つ！）

CSS
----
sectionタグの4つ角に設定したい場合

	section {
		position: relative;
	}
	
	section:before,
	section:after {
		content: '';
		display: block;
		background: url('test.gif') no-repeat;
		position: absolute;
		width: 50%;
		-webkit-box-reflect: right;
		height: 15px;
	}
	
	section:before {
		top: 0;
		left: 0;
	}
	section:after {
		right: 0;
		bottom: 0;
		-webkit-transform:rotate(-180deg);
	}


DEMO（jsdo.it）
----

[1つの画像で4つの角を再現するCSS - jsdo.it][jsdo.it]

[jsdo.it]: http://jsdo.it/kamem/faGs
How to use mbstring with heroku

[heroku](http://heroku.com) の `php` で [mbstring](http://www.php.net/manual/ja/book.mbstring.php) を使うには、以下のコマンドを叩きます。

```shell-session
$ php composer.phar require ext-mbstring:~0
```

以下を参照しました。
http://ja.phptherightway.com/
GitHubで人気のある言語ランキング作ってみた。github_popular_lang α ver 0.0.1 release

GitHubで人気のある言語ランキング作ってみました。
[[github_popular_lang α 0.0.1]](http://soarcreator.net/service/github_popular_lang/index.html)

デザインは未完です。（来週中に綺麗にしときます）
*（5/18 23:30 デザイン改善しました release version 0.0.2）*

![スクリーンショット 2014-05-18 13.01.03.png](https://qiita-image-store.s3.amazonaws.com/0/43135/82b30691-3143-2696-e628-057b4974f37f.png)

何故作ったのかと言いますと、米国 RedMonk のアナリスト Donnie Berkholz 氏 が 5/2 に出した「GitHubで最も人気の高いプログラミン言語」の調査結果がおかしいと感じたからです。
その調査報告では、Objective-Cが、C++やC#より人気がないと書かれてありましたが、私の予想では、スマートフォンの普及が進み、Objective-Cはかなり人気があるはずでした。

また、記事のmeta descriptionには「プログラミング言語のほとんどが、人気下落傾向にあることが明らかになった。開発者の言語に対する嗜好が多様化し、あまり知られてない言語が選択されるケースが増加していることが原因であるという。」と書いてありますが、割合(Percentage %)で書かれてあるデータで人気が下落しているかが判断できるのか疑問でした。

[参考記事][GitHub でもっとも人気の高いプログラミング言語は？](http://internetcom.jp/webtech/20140509/1.html)

調査方法を変更することにしました。


### 1, 調査方法

#### 1-1, 言語一覧

まず、調査対象をわかる限り全ての言語で行いました。
全ての言語は下記のサイトを参考にしました。

[http://qiita.com/potato2003@github/items/fbbc5d5edc80b43801e7](http://qiita.com/potato2003@github/items/fbbc5d5edc80b43801e7)

DelphiはGitHub Search APIがおかしな値を返してきたので、除きました。
こうやったら取れるよっていう方法があったら教えてください。

#### 1-2, 集計方法

リポジトリの数で集計をするより、スターの数で集計するほうが、人気という単語に相応しい結果が返ってくると考えました。
「人気」とは、世間がどれだけそのリポジトリを見たいか、ということだと考えたからです。
また、リポジトリの数での集計では、作ったが公開されない可能性もあり、JavaScriptなどのオープンな言語は公開されるが、ソースコードが見えない言語は公開されにくいと考えたからです。

UTC Time 0時に、2週間以内に作られた各言語のスターの多いトップ30位のリポジトリのスターの数の合計を集計していきます。（日本時間9時ぐらい）

### 2, 結果

#### 1日目

1, JavaScript
2, Ruby
3, Objective-C
4, Java
…

#### 2日目

1, JavaScript
2, Objective-C
3, Ruby
4, Java
…

### まとめ

集計方法は統計的には間違ってるのかもしれません。わかりやすく教えていただければ、変更するかもしれません。
私は、Objective-Cは4位ぐらい人気だと思っています。2位はおかしいと思っています。
Javaの順位もおかしいと考えています。

どんどん更新していくので、追記していきます。

TODO
* まだ詳細のデバッグを行っていません。全ての言語で結果が返ってきているか、調査していません。異常な値が返ってきた言語には対応しました。
* 新機能として、各言語でrepositoryの数とstarの数で、散布図も描画したいと考えています。
* HTMLもJavaScriptもCSSも勉強中です。見た目を綺麗にしたいのですが、どうしていいかわからない状態です。
* 英語力がありません。英語に関する間違い、ベターな表現を教えていただければ、幸いです。
IBActionはカテゴリ分割して実装されていてもいい


趣旨はタイトルで全て。あるクラスのカテゴリを作り、そこに IBActionを定義したときにインターフェースビルダからそのアクションは見えるんだろうか?という話。

AppControllerクラスにカテゴリX,Y,Zを追加、それぞれのファイルでactionを定義する。こんな感じ

```objectivec:AppController+X.m
@implementation AppController (X)

-(IBAction)actionX:(id)sender
{
    NSLog(@"actionX");
}
@end
```

インターフェースビルダでAppControllerオブジェクトを配置し、Window上に適当にボタンを置いて、そこから AppControllerに対してactionをつなげようとする

すると、こういう風にカテゴリごとに定義したアクションが全部見える
![fig.png](https://qiita-image-store.s3.amazonaws.com/0/3847/8adca579-3167-e438-daea-41e989b4b178.png "fig.png")

ちょっと複雑なコントローラを作りたいけど機能ごとにクラス分割するほどではない、けどひとつのソースに書くと見通しが悪くなるのでカテゴリに分割できるといいな、と思ってやってみた。

リファクタリング途中にファイルを切り分けていく作業でも有効かも。
[HTML5] オフラインでローカルストレージを利用するときの注意

オフラインでローカルストレージを扱うコンテンツをつくったときにすごいコケ方をしたのでメモしておきます。（※iOSのアプリのUIWebViewで読み込ませるコンテンツ）

＜症状＞
自分の環境では問題なく動作するが、先方の環境ではうまく動作しない。
・自分の環境(win/chrome)
・先方の環境(max/safari)

ローカルストレージを扱っている部分でドメイン毎に共通のストレージにアクセスされるはずなのに、なぜかページ毎に個別のストレージが作られているような症状がでた。

＜原因＞
macでhttp/ftp経由でデータをダウンロードすると否応なしにファイルに「com.apple.quarantine」という拡張属性が強制的に付加される。これは隔離属性とよばれているもので、この属性が付いているとどうやらファイルがアクセスできる領域に制限がついてしまうらしい？

＜解決策＞
この拡張属性を消すにはターミナルからコマンドで

xattr -d com.apple.quarantine ******.zip

としてあげると消える。
もしくはMacでダウンロードしない。
逆アセンブリから最適化の効果を知る

Debug ビルドと Release ビルドでコードサイズや実行速度は変わります。

**しかし、なんであんなに変わるのか？**

その例として、以下のコードを挙げます。

```cpp:test.cpp
#include <iostream>

int main()
{
	return 0;
}
```

何の変哲もない main 関数です。
これを Visual Studio の **「逆アセンブリ」** ウィンドウで見てみます。

#「逆アセンブリ」ウィンドウって？

「逆アセンブリ」ウィンドウとは、
コンパイラによって作成された命令に対応するアセンブリコードやバイトコードなどを見るためのウィンドウです。

「逆アセンブリ」ウィンドウは以下のようにして見ます。

<b>

1. プログラムを実行し、ブレークポイントで止める。
1. メニューの「デバッグ」 > 「ウィンドウ」 > 「逆アセンブリ」をクリック

</b>

すると、「逆アセンブリ」ウィンドウがタブに追加されます。


#「逆アセンブリ」ウィンドウでアセンブラコードを見てみよう

先ほどの「test.cpp」を Debug ビルドでビルドして、
「逆アセンブリ」ウィンドウで見たときのアセンブラコードが以下のコードです。
(Debug ビルドはプロジェクトを作成した時の設定そのままです。)

```:逆アセンブリ(Debug)
#include <iostream>

int main()
{
01101380  push        ebp  
01101381  mov         ebp,esp  
01101383  sub         esp,0C0h  
01101389  push        ebx  
0110138A  push        esi  
0110138B  push        edi  
0110138C  lea         edi,[ebp-0C0h]  
01101392  mov         ecx,30h  
01101397  mov         eax,0CCCCCCCCh  
0110139C  rep stos    dword ptr es:[edi]  
	return 0;
0110139E  xor         eax,eax  
}
011013A0  pop         edi  
011013A1  pop         esi  
011013A2  pop         ebx  
011013A3  mov         esp,ebp  
011013A5  pop         ebp  
011013A6  ret  
```

Debug ビルドでビルドした時は、これだけの命令が実行されています。
何の変哲もない main 関数しか実行してないにも関わらず、いろんな命令が実行されてますね……。

では、今度は Release ビルドでビルドしたものを見てみます。
(こちらもプロジェクトを作成した時の設定そのままです。)

```:逆アセンブリ(Release)
#include <iostream>

int main()
{
	return 0;
00EE1000  xor         eax,eax  
}
00EE1002  ret  
```

だいぶスッキリしましたね。

**これがコードサイズや実行速度が変わる原因です。**
Release ビルドだと最適化処理が働いて、実行される命令がこれだけ削減されます。

こうやって目に見える形にすると、最適化の効果がよくわかりますね。

ただし、最適化でどれだけ命令が削れるかは最適化レベルや最適化をかけるコードに依存しますので、
必ずしもこれだけ削れるとは限りませんので、ご注意を。

#最後に

今回は自分の持ってるにわか知識を最大限に使って検証したものです。
間違いのご指摘や補足は大歓迎です！
Go言語のperiod(.) importとblank(_) importについて

# importについて

Go言語のperiod importとblank importについて調べてみました。
import全般の仕様は以下から確認できます。

* [Goプログラミング言語仕様 / インポート宣言](http://golang.jp/go_spec#Import_declarations)
* [The Go Programming Language Specification / Import declarations](http://golang.org/ref/spec#Import_declarations)

## period(.) import

Goプログラミング言語仕様のインポート宣言より引用

> 名前の代わりにピリオド(.)を指定したときは、インポートされたパッケージのパッケージブロックでエクスポートされている全識別子がインポートしたソースファイルのファイルブロックで宣言され、プレフィックスなしでアクセスできるようになります。

period importの仕様は上記の通り単純です。
ただし、以下の理由から利用はおすすめできません。

* period importしたパッケージに含まれる関数と同名の関数を宣言できなくなる
* どのパッケージの関数なのか分かりにくくなる

例外として[「Go言語のパッケージのテストでプライベートな関数や変数を呼び出すには」](http://atotto.hatenadiary.jp/entry/2013/01/19/112012)で解説している使い方は非常に有用だと思います。

### period importのサンプル

```go:main.go
package main

import . "fmt"

func main() {
	Println("period import")
}
```

```shell-session:実行結果
$ go run main.go
period import
```

## blank(_) import

Goプログラミング言語仕様のインポート宣言より引用

> インポート宣言は、インポート「する側」と「される側」の依存関係を宣言します。自分自身のパッケージをインポートすること、またはインポートしたパッケージ内でエクスポートされている識別子を一切参照しないことは誤った使い方です。インポートによる副作用(初期化)のためだけにパッケージをインポートするときは、パッケージ名としてブランク識別子を使ってください。

こちらはinit関数だけを実行する場合に使う事ができます。
[Effective Go / Import for side effect](http://golang.org/doc/effective_go.html#blank_import)ではHTTPのデバッグのために`net/http/pprof`パッケージを利用する方法が挙げられています。

### blank importのサンプル

```go:main.go
package main

import (
	"fmt"

	_ "./blank"
)

func main() {
	fmt.Println("main")
}
```

```go:blank/blank.go
package blank

import "fmt"

func init() {
	fmt.Println("blank/init")
}
```

```shell-session:実行結果
$ go run main.go
blank/init
main
```

**追記**

最終的に消すけど開発途中で消したくないimportがある場合にもblank importを使えます。
次のように全ての`fmt`をコメントアウトしてもimportでエラーになりません。

```go:blank/foo.go
package main

import _ "fmt"

func main() {
	// fmt.Println("begin")
	anyFunction()
	// fmt.Println("end")
}
```
Context root の変更方法

環境
Mac OS X 10.9.2
Eclipse 4.3
Tomcat 7


Context Root 変更
---
Eclipseでプロジェクト生成後にContext rootを変更しようとしてもなかなか上手くいかなかった...

何がしたいのかというと、

<p> http://localhost:8080/test/ </p>
<p>↓</p>
<p> http://localhost:8080/app/ </p>

というように、<b>test</b>ではなく<b>app</b>でアクセスできるようにしたい。

pom.xmlのgroupIdとartifactIdを変更すれば行けると思っていたが変更しても変わらず...
Cleanしても変わらず...

と、いろいろやっていたが解決方法発見！
ProjectのPropertiesにWeb Project Settingsという項目があり、そこにContext rootがあった。

![スクリーンショット 2014-05-18 11.22.55.png](https://qiita-image-store.s3.amazonaws.com/0/43666/a642a7d9-996d-1bfa-e652-81e3ff603bb6.png)

書き換えて、ServerをCleanすると...できました＼(^o^)／

参考
http://stackoverflow.com/questions/2437465/java-how-to-change-context-root-of-a-dynamic-web-project-in-eclipse
ターミナルでMacの絵文字の時計を回す


## 前書き
ほんとは絵文字をそのままソースに入力してました
QiitaにMacの絵文字を書き込めないことが判明したので文字コードから変換する方法にしました
(変数名にも絵文字を使う頭おかしいソースで、けっこう好きでしたが)

# 時計を回す

ワンライナー

```sh
ruby -e 'clock=[*128336..128359].map{|c|c.chr("UTF-8")};clock=(clock[0..11].zip(clock[12..23])).flatten;10.times{clock.each{|time|print "Time flies like an arrow. #{time}\r";sleep 0.05}};puts'
```
ターミナルで絵文字を使うと後ろの文字列と重なるので、避けるには後ろに半角スペースを入れる



## 文字列の書き換え

ターミナル上の文字列を書き換えるには`\b`か`\r`でカーソルを移動して上書きする
`\b`は半角1文字分、`\r`は行頭にカーソルを戻す
改行されたらもう上書きする手段は無い(かも)

## 時計の絵文字について
時計の絵文字は24個ある
文字コード順に、最初の12個が0分ちょうどで、残りが30分のもの
まとめて使うには並べ替える

```rb
clocks_oclock = [*128336..128347].map{|c|c.chr("UTF-8")}
clocks_thirty = [*128348..128359].map{|c|c.chr("UTF-8")}

clocks = (clocks_oclock.zip(clocks_thirty)).flatten
```
![スクリーンショット 2014-05-18 11.17.21.png](https://qiita-image-store.s3.amazonaws.com/0/18902/eb76c836-a054-6ff3-a072-8b3f65fb23aa.png "スクリーンショット 2014-05-18 11.17.21.png")

分針は2種類しかないのに回ってるように見える気がするから不思議

ちなみによく見ると30分の表示でも時針は動いてないので、現実とちょっと違う
時針も動いてれば、もう少し滑らかに回ってる感じになったんではないかと

# おまけ

## 月のやつ

```sh
ruby -e 'moon=[*127761..127768].map{|c|c.chr("UTF-8")};10.times{moon.each{|m|print "Fly me to the moon. #{m}\r";sleep 0.05}};puts'
```

月の絵文字は8個で並べ替える必要も無いので楽

## 記号で回転っぽいやつ

`\|/-`を順番に表示すると回転してるっぽくなる
(環境によってはバックスラッシュが円記号に見えるかも)

```sh
ruby -e '10.times{%q!\|/-!.each_char{|c|print "Please wait... #{c}\r";sleep 0.05}};puts'
```

`->)|(<-`を往復させると微生物っぽくてキモい

```sh
ruby -e '10.times{"->)|(<-".tap{|s|s<<s[1..-2].reverse}.each_char{|c|print "Please wait... #{c}\r";sleep 0.05}};puts'
```

#参考
[Node.js - CLIでプログレスバーみたいのを出力する - Qiita](http://qiita.com/hokaccha/items/3abd55aa23894b57ffd1)
[unicode - RubyでIntegerと文字を相互変換する - Qiita](http://qiita.com/chezou/items/947900faef4c1032ed94)
dlを使ったtableのdtとddの高さを揃えるjQuery プラグイン


site: http://develo.org/2014/04/29/2219.html
GitHub: https://github.com/kamem/jquery.dlTableSet

dlを使ってdt ddを横並びにしてテーブルを再現するときに、dtの高さがddよりも高い場合にレイアウトが崩れてしまいます。それを解消するためのjQueryプラグインです！単純に読み込ませてタグを指定するだけなのでお手軽です。

[DEMO]
[DEMO]: http://github.develo.org/jquery.dlTableSet/


仕様
------
* dlを使ったtableのdtとddの高さを揃える
* ひとつのdtに対して複数ddがあった場合 dtの高さをddの数で割った値が 一つのddの高さになる。

使い方
------
	<script type="text/javascript" src="js/jquery.js"></script>
	<script type="text/javascript" src="js/jquery.dlTableSet.js"></script>
	<script type="text/javascript">
	$(function(){
		$('dl.table').dlTableSet();
	});
	</script>
Docker の image を Trusted build で公開する

Docker の image を [Docker index](https://index.docker.io/) に登録しておくとどこからでもダウンロードできて便利です。登録の方法には

* 手元のマシンで image をビルドしてバイナリを upload
* Docker index 管理下のホストで image をビルド (これが Trusted build)

の2通りの方法があります。

Trusted build には

* Repository に Dockerfile を commit するたびに自動的に image がビルドされる
* ビルドに使用した Dockerfile が公開される

といったメリットがあります。公開 image を作る際には大きなメリットです。今のところ無料で使えるのもうれしいですね。

## アカウント登録

Docker index を利用するにはアカウントが必要です。
まずは https://www.docker.io/account/signup/ から登録します。

## Github アカウントとのリンク

Trusted build は Github 上に Dockerfile のレポジトリがあると想定しています。
https://index.docker.io/builds/ にアクセスすると linking a source repository account と言われますので、説明に従って Github アカウントとリンクします。

![スクリーンショット 2014-05-18 9.12.31 AM.png](https://qiita-image-store.s3.amazonaws.com/0/5441/57311291-7a2f-ee9e-684a-384825f3fb5c.png "スクリーンショット 2014-05-18 9.12.31 AM.png")

## Trusted build の追加

ビルドを追加するには Github 上に Dockerfile を置いたレポジトリが必要です。レポジトリがない人はここで作りましょう。最も簡単な Dockerfile の例は次のようになります。`ubuntu:trusty` をベースにして、rubyをインストールしたイメージを作る Dockerfile です。

````:Dockerfile
FROM ubuntu:trusty
MAINTAINER Your Name <name@example.com>
RUN sudo apt-get install -y ruby
````

Github上にレポジトリが用意できたら trusted build を設定します。
https://index.docker.io/builds/ の Add New ボタンを押して、Githubのレポジトリを選択します。
設定画面が出ますが、レポジトリのトップディレクトリに Dockerfile がある場合はそのままで構いません。
![スクリーンショット 2014-05-18 9.23.07 AM.png](https://qiita-image-store.s3.amazonaws.com/0/5441/0b060aa6-9c87-b269-667d-9dbdbd1493e0.png "スクリーンショット 2014-05-18 9.23.07 AM.png")

Create Repository を押すと登録が完了します。お疲れ様でした。

## ビルドの確認
ビルドにはしばらく時間がかかるので気長に待ちましょう。
ビルドの状態やビルドログは Builds History の画面から確認できます。
EC2起動したらやること


# ホスト名の変更

/etc/sysconfig/network を編集

```
HOSTNAME=webserver.mydomain.com
```

参考）
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-hostname.html


# タイムゾーンの変更

```
# cp /usr/share/zoneinfo/Japan /etc/localtime
```

clockファイルを変更

```
# vi /etc/sysconfig/clock

ZONE="Asia/Tokyo"
UTC=False
```
Nginx で PHP Slim Framework を動かす設定



```
upstream fastcgi_backend {
    server 127.0.0.1:9000; # 9000ポートで受ける
}

server {
    listen 192.168.33.10:8000;
    root   /var/www/project_name/public;
    index  index.php;

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

    location ~ \.php$ {
            fastcgi_pass   fastcgi_backend; # 上記upstreamに流す
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include /etc/nginx/fastcgi_params;
            fastcgi_connect_timeout 3s;     # default of 60s is just too long
            fastcgi_read_timeout 10s;       # default of 60s is just too long
    }
}
```

参考 : 
https://github.com/codeguy/Slim

基本的に、これ書いときゃいいらしい。

```
try_files $uri $uri/ /index.php?$args;
```
2014.5.15 Groongaドキュメント読書会の記録

## 概要

2014.5.15 Groongaドキュメント読書会に参加した。
まず、読書会の目的、進め方について説明があり、その後輪読形式でGroongaのドキュメントを読み進めた。そして最後に簡単なふりかえりがあった。

## 理解したこと

今回読んだ[Groongaの特徴](http://groonga.org/ja/docs/characteristic.html)について、理解したことを以下に記録する。

### 1.1Groongaの概要

* 転置索引とは
    * indexは検索対象を間引くためのもの。検索速度を上げるために必要なもの。
転置索引(転置インデックス)は キーワードに対して、それが含まれる文章がどこにあるかという情報をマッピングしたもの。転置索引があることで早く検索結果を返すことができる。
 
* 列指向とは
    * 列指向の対義語は行指向。列で引くことが得意、列の追加のコストが低い。特定のデータを集計したりするのが得意であることから分析等に活用できる

### 1.2全文検索と即時更新
Solrでは、複数の転置索引を統合するような重い処理を必要とするようだ。転置索引を作るだけなので、そのうちに転置索引が増えてくる。そうすると転置索引を統合しないといけなくなる。
一方Groongaは転置索引が変更される前提となっているので、転置索引を統合するような作業は発生しない。

### 1.3カラムストアと集計クエリ
列指向であるからこそ、集計、分析が得意。

### 1.4転置索引とトークナイザ
Groongaは形態素方式とN-gram方式の両方に対応している。

### 1.5共有可能なストレージと参照ロックフリー
例えばMroongaをつかって、MySQL経由でgroongaのデータベースを使っているケースに
おいて、同時にGroongaのHTTPサーバからGroongaのデータベースを操作することができる。Groongaのデータベースは複数プロセスから触ることができる。

### 1.6位置情報検索
位置情報によってインデックスをつくると、検索できる

### 1.7Groongaライブラリ
Cのライブラリを提供するので、いろんな関連プロダクトがある。

### 1.8 Groongaサーバ
GQTPは速度を出すためにカリカリにチューンしたGroonga独自のプロトコル。

### 1.9Groongaストレージエンジン
GroongaストレージエンジンはMroongaに修正する必要あり。

## ふりかえり

参加者から活発な質問があり、その回答を通じて自分の理解を深めることができたので、目的は達成したと言える。
Xamarin.iOS/Androidアプリで、バンドルリソース処理を完全共通化できそうな仕様

もしかしたら私が知らなかっただけで常識だったのかもしれません。
だったらみんなもっと早く教えてくれればよかったのに！的なww

Xamarin.iOS/Androidアプリで画像やjson設定ファイル、内部html等のリソースを、iOSのBundleResourceやAndroidのAndroidAssetの形で持ってませんか。
私はそうしていたので、リソースアクセスのロジックを書く時もいつも場合分けしてました。
（もちろん普通は隠蔽化しますが）こんな感じで

```csharp:リソースアクセスの場合分け
#if __IOS__
    var bundlePath = NSBundle.MainBundle.BundlePath;
    var filePath   = Path.Combine(bundlePath, "Assets/hoge.png");
    InputStream attachmentStream = File.OpenRead(filePath);
#else
    InputStream attachmentStream = Application.Context.Assets.Open ("hoge.png");
#endif
```

これ、ビルドアクションとしてBundleResourceやAndroidAssetではなく、EmbeddedResourceというのを使ってやると、共通化できるようです。
EmbeddedResourceを使うと、そのリソースが含まれたアセンブリのアセンブリ名（デフォルト名前空間かもしれない。[前記事](http://qiita.com/kochizufan/items/329d89417eddab4daf98)で問題になった、Xamarin.iOSでのアセンブリ名でドットが外れる問題が、こちらでは存在しないので）をベースにして、プロジェクト内でのフォルダ構成を加えたものをアクセス子としてアクセスできるようです。
例えば、デフォルト名前空間がHoge.Fuga.Fooのアセンブリ内で、プロジェクト内での配置がBar/Baz.pngだった場合、アクセス子は「Hoge.Fuga.Foo.Bar.Baz.png」になります。

このアクセス子を利用して、

```csharp:GetManifestResourceStream
    using System.Reflection;

      ...

    //thisはとりあえずクラスだと何でもいい模様？
    //その後の文法からして、アクセスするリソースのアセンブリに属するクラスでないといけないかもしれません。
    //その辺は要追調査…
    Type type = this.GetType(); 
    Stream manifestResourceStream = type.Assembly.GetManifestResourceStream ("Hoge.Fuga.Foo.Bar.Baz.png");
    InputStream resourceInputStream = InputStream.Wrap (manifestResourceStream);
```

のような形でアクセスしてやると、リソースからのStreamが取れます！

AOTかJITかの違いで、実機とシミュレータの動作が異なる事で不安のあるXamarinですが、Android/iOS実機でも(Debugモードでの流し込みのみですが)確認したので、多分共通に使えるはずです。
公式の情報としては、[この辺](http://docs.xamarin.com/content/EmbeddedResources/)にサンプルがあるようです（今まで知らなかったので未見…）。

環境変数での処理分けなんか必要なかったんや…。
これで相当レベル、下位レイヤの処理もPCL化できる？
書き込み可能フォルダ（iOSだとDocument/Cacheフォルダ、Androidだとdataフォルダとか）も隠蔽化/共通化できる仕様ってあるんだろか？
Xamarin.Mobileあたりがなんかしてるんだっけ？
Windows8でAtomをビルドするメモ

# Windows8環境でAtomをビルドする方法

Github製のテキストエディタatomをwindows向けにビルドする方法です。

### 下記ドキュメントの通り実行すれば基本的に成功します。
https://github.com/atom/atom/blob/master/docs/build-instructions/windows.md

### 作業手順

1. 以下のツールをWindowsにインストールする
    * VisualStudio
    * node.js
    * Python2.7.*
    * Github for Windows

2. Windowsの環境変数を変更して以下のパスを通す
   C:\\path\\to\\nodejs\\ 
   C:\\path\\to\\atom\\repo\\node_modules\\ 
   C:\\path\\to\\python\\ 

3. 管理者権限でGit Shellを起動する


4. パスが通っていることを確認する

    node -v 
    python --version 


5. インストールを実行する
    cd C:\workspace\
    git clone https://github.com/atom/atom
    cd atom
    script\build


6. 下記のメッセージが表示されればインストールが完了
Installing modules ✓
┇
┇
Running "install" task
Done, without errors.

7. 下記フォルダに実行ファイルが生成されているか確認
C:\Program Files (x86)\Atom

8. Atomを起動
    atom.exe

#### 注意事項

* visual studioの設定が正しくないエラーが出る場合
  - 環境変数"GYP_MSVS_VERSION" に正しいVisual studioのバージョンを設定する

* 古いVisual studioのインストールフォルダの残骸が残っている場合
  - フォルダを削除するかリネームが必要

* ビルド途中で文字化けして停止する場合
  - Github Shellを管理者権限で開き直してスクリプトを実行する


* Visual studioのインストールをデフォルトフォルダ以外に指定している場合
  - 下記設定ファイルを修正してビルドを行う 
  
    C:\workspace\atom\apm\node_modules\atom-package-manager\lib\config.js

    例：
vs2012Path = path.join(this.x86ProgramFilesDirectory(), "Microsoft Visual Studio 11.0", "Common7", "IDE");
↓
vs2012Path = path.join("D:\Program Files (x86)", "Microsoft Visual Studio 11.0", "Common7", "IDE");
```
Erlangコード最適化メモ: JSONデコード処理(2): HiPEを使う

[『Erlangコード最適化メモ: JSONデコード処理(1): まず基本形』](http://qiita.com/sile/items/6df1400ce45f870b4b03)の続き。

今回は、前回実装した[json_decode_1.erl](https://gist.github.com/sile/fa3c77155d61c97205e1)を、HiPEコンパイラを使ってコンパイルした場合の結果を書いておく。

HiPE
====
**High Performance Erlang**の略。
HiPEコンパイラを使うと、Erlangのソースコードを(VMのコードではなく)ネイティブコードにコンパイルしてくれるらしい。
経験的には、バイナリ処理が中心のモジュールやデータ構造(ex. ハッシュツリー)を実装した場合、HiPEコンパイラでコンパイルするとだいたい3～4割程度高速化する印象がある。


HiPEコンパイラを使うには、コンパイル時に以下のようなオプションを指定すれば良い。

```erlang
$ erl
Erlang R16B03-1 (erts-5.10.4) [source] [64-bit] [smp:2:2] [async-threads:10] [hipe]
Eshell V5.10.4  (abort with ^G)

%% nativeをコンパイルオプションに、指定するとHiPEコンパイラが使われる
> c(hoge, [native]).
{ok, hoge}.

%% hipe:help/0 でヘルプが表示できる
> hipe:help().
The HiPE Compiler (Version 3.10.2.2)

 The normal way to native-compile Erlang code using HiPE is to
 include `native' in the Erlang compiler options, as in:
     1> c(my_module, [native]).
 Options to the HiPE compiler must then be passed as follows:
     1> c(my_module, [native,{hipe,Options}]).
 Use `help_options()' for details.

 Utility functions:
   help()
     Prints this message.
   help_options()
     Prints a description of options recognized by the
     HiPE compiler.
   help_option(Option)
     Prints a description of that option.
   help_debug_options()
     Prints a description of debug options.
   version() ->
     Returns the HiPE version as a string'.

 For HiPE developers only:
  Use `help_hiper()' for information about HiPE's low-level interface
ok

%% 最適化レベルが選べたりもする (o3が最高, デフォルトはo2)
> c(hoge, [native, {hipe, [o3]}]).
{ok, hoge}.
```

計時
====

以下の表は、前回の計時結果に、HiPEコンパイラを使った場合の処理時間を追加したもの。

| 平均処理時間                   | 1x.json | 3x.json | 9x.json | 27x.json | 81x.json | 243x.json |
|------------------------------|--------:|--------:|--------:|---------:|---------:|----------:|
| json_decode_1:decode/1       |    49μs |   153μs |   412μs |   1163μs |   4089μs |   11780μs |
| json_decode_1:decode/1(hipe) |    24μs |    68μs |   236μs |    750μs |   2158μs |   6221μs |

[json_decode_1.erl](https://gist.github.com/sile/fa3c77155d61c97205e1)の場合は、HiPEの効果が大きく、nativeオプションを指定しただけで、処理時間が半分程度になっている。

ただしHiPEコンパイラを使うと、エラー補足時のスタックトレースから、エラーが発生した関数の引数の情報や行番号が消えてしまうようで、デバッグが一気に難しくなるのが困りもの。(R16B03時点)

```erlang
%% HiPE無しでコンパイルした場合
> json_decode_1:decode(<<"[1,2,]">>). % 不正なJSONを渡す
** exception error: bad argument
     in function  json_decode_1:value/1
        called as json_decode_1:value(<<"]">>) % 引数情報がつく
     in call from json_decode_1:array/2 (json_decode_1.erl, line 44) % 行番号もつく
     in call from json_decode_1:decode/1 (json_decode_1.erl, line 18)

%% HiPE有りでコンパイルした場合
> json_decode_1:decode(<<"[1,2,]">>).
** exception error: bad argument
     in function  json_decode_1_hipe:value/1  % 関数名のみ
     in call from json_decode_1_hipe:array/2
     in call from json_decode_1_hipe:decode/1
     in call from lists:reverse/1             % 何故か経由していないはずの関数が含まれている
```


ソースコードの修正は一切行っていないが、今回はここまで。
とりあえずJSONデコードのケースでは、HiPEが結構有効なことが分かった。

補足
====
計測環境:

- CPU:  Intel(R) Core(TM) i7-4600U CPU @ 2.10GHz (VMware上で二コア)
- OS: Scientific Linux release 6.5 (Carbon)
- Erlang: R16B03-1 (erts-5.10.4)
CMS（オープンソース中心）

記述がない限りオープンソースです

# エンタープライズ向け

* 導入までに手間がかかるが高機能
* フルオープンというより社内・パートナー向けに適したアプリケーション

---

* Liferay（ライフレイ）
 * http://www.liferay.com/ja/
 * Java

---

* Alfresco（アルフレスコ）
 * http://www.alfresco.com/
 * ドキュメント管理
 * Java

---

* SharePoint
 * http://www.microsoft.com/ja-jp/sharepoint/
 * 有償（オープンソースなし）

---

# スタートアップ向け

* 導入が簡単、すぐに始められる

---

* WordPress（ワードプレス）
 * http://ja.wordpress.org/
 * PHP / MySQL
 * 圧倒的なシェアを誇る

---

* Joomla!（ジュームラ）
 * http://www.joomla.org/

---

* Drupal（ドルーパル）
 * https://drupal.org/

---

* Concrete5（コンクリートファイブ）
 * http://concrete5-japan.org/
 * PHP/ MySQL

---

* baserCMS（ベーサーシーエムエス）
 * http://basercms.net/
 * PHP / MySQL, PostgreSQL
 * 日本で開発

---

* SHIRASAGI（シラサギ）
 * http://www.ss-proj.org/
 * RoR / MongoDB
 * 日本で開発

---

* Joruri（ジョールリ）
 * http://joruri.betokyo.jp/
 * 自治体向け
 * Japan Originated Ruby-based RESTful and Integrated CMS の頭文字
 * Ruby
 * 日本で開発

---
Xamarin.iOSでInternalsVisibleToを指定する時の注意

c#で指定可能なinternalというアクセシビリティ、[同一のアセンブリ以外からのアクセスを禁止](http://dobon.net/vb/dotnet/beginner/accessibilitylevel.html)するものですが、何でもかんでも禁止してしまうとテストプロジェクトを書いたりする際に問題になります。
それを回避するため、intetnalを指定したアセンブリのAssemblyInfo.csの中で、InternalsVisibleToという、アセンブリを指定する事でそこからのアクセスのみ許す機構があります。

```csharp:AssemblyInfo.cs
[assembly: InternalsVisibleTo("Couchbase.Lite.Tests")]
```

が、これ、アクセスを許す先のアセンブリが、Xamarin.iOSのアプリケーションプロジェクトだとうまく動きません。
試行錯誤を繰り返した結果、どうもXamarin.iOSだと、アプリケーションのアセンブリ名が（理由はよく判りませんが）ドットを抜いたものになってしまうので、そのドットを抜いたアセンブリ名を指定してやらないといけないようです。

![アセンブリ名指定](https://qiita-image-store.s3.amazonaws.com/0/10108/2827fa7f-6cff-cd60-901b-400f82b0df6b.png)

上記のアセンブリ名指定のダイアログで、Xamarin.iOSのアプリケーションのアセンブリ名のみ、勝手にドットが外れたものになっているのはよく見ると思います。
このドットなしのアセンブリ名を指定してやらないと、うまくinternalへのアクセスができません。

```csharp:AssemblyInfo.cs
[assembly: InternalsVisibleTo("CouchbaseLiteTests")]
```

こんな感じで。