OmniAICreator/Qiita-1.07M huggingface dataset:
シーン上でリアルタイムにシェーダー(.shader)を編集する

シーン上でシェーダー(.shader)を編集したくなったので作ってみました。

![image](https://qiita-image-store.s3.amazonaws.com/0/44288/f919cd3f-8a9c-0b91-96c5-eda68755e1ea.png)

#準備
テキスト入力ボックスを作ります。
Hierarchy -> Create -> UI -> Input Field 
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/99b5cd39-88c1-20f0-fed1-1beeaffa63fd.png)

#スクリプト
Input Field オブジェクト
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/f1c52bfc-ed73-a9dc-5d6c-44daa5dd8993.png)

これに以下のスクリプトをアタッチします。

```ShaderEdit.cs
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.IO;

[RequireComponent(typeof(UnityEngine.UI.InputField))]
public class ShaderEdit : MonoBehaviour {

    string shaderCode;
    public Shader shader = null;
    UnityEngine.UI.InputField inputField;

	void Start ()
    {
        inputField = this.GetComponent<UnityEngine.UI.InputField>();

        string path = AssetDatabase.GetAssetPath(shader);
        StreamReader sr = new StreamReader(path);
        shaderCode = sr.ReadToEnd();

        inputField.lineType = UnityEngine.UI.InputField.LineType.MultiLineNewline;

        inputField.text = shaderCode;
        inputField.characterLimit = int.MaxValue - 1;

        inputField.onValueChange.AddListener((s) => {
            OnValueChange();
        });

        inputField.onEndEdit.AddListener((s) => {
            OnEndEdit();
            SaveShader();
        });
    }

    public void OnValueChange()
    {
        if (inputField.isFocused)
        {
            shaderCode = inputField.text;
        }
    }
    public void OnEndEdit()
    {
        inputField.text = shaderCode;
    }

    public void SaveShader()
    {
        string path = AssetDatabase.GetAssetPath(shader);
        FileInfo fi = new FileInfo(path);
        try
        {
            StreamWriter sw = fi.CreateText();
            sw.WriteLine(shaderCode);
            sw.Flush();
            sw.Close();

        }
        catch (System.Exception e)
        {
        }
        AssetDatabase.Refresh();
    }
}

```
<br>
編集したい.shaderファイルもアタッチします。
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/7f90d8c8-129f-c34c-07ba-4f5a92c0cd81.png)

#再生ボタンを押して完成
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/f919cd3f-8a9c-0b91-96c5-eda68755e1ea.png)
InputField上でシェーダーを編集してESCを押すと.shaderファイルが更新されます。
iOS9でAngularJSを使っている時に"10 $digest() iterations reached. Aborting!"が発生した


# 状況
iOS8で動いていたアプリをiOS9のシミュレータで動かしたらログにエラーが吐かれた

# 解決策
[このパッチ](https://gist.github.com/IgorMinar/863acd413e3925bf282c)を利用する。

https://github.com/angular/angular.js/issues/12241
上のissueを読むとUIWebViewのみでWKWebViewなら問題ないらしい。
が、Cordovaを使っているとUIWebViewを使わざるを得ない。

Ionicの場合
http://qiita.com/shinsukeimai/items/6cf43cd7f5563730b3cb
PhalconのマルチレベルキャッシュをSessionで使えるように

# マルチレベルキャッシュとは？

キャッシュのレベルを段階的にしてパフォーマンスを上げる手段として、
APCとMemcachedの両方を使い、APCに無ければMemcachedへ取得しにいく、
組み合わせは自由で、APCとMySQLだったりと参照コストの低いものを手前に持ってくることで、
パフォーマンスを上げる的な感じ

Phalcon本体のマルチレベルキャッシュのドキュメントはこちら
http://phalcon-php-framework-documentation.readthedocs.org/en/1.3.0/reference/cache.html#multi-level-cache

Phalcon\Cache として実装されているものを、セッション情報の保存先としても使えるようにするためのアダプタ書いた感じです。

# 使い方

```php
use Iwai\Phalcon\Session\Adapter\CacheBackend;
use Phalcon\Cache\Frontend\Data as FrontendData;

$app->getDI()->setShared('session', function () {
    $session = new CacheBackend();

    $backend = new \Phalcon\Cache\Multiple();

    $backend->push(new \Phalcon\Cache\Backend\Apc(
        new FrontendData([ 'lifetime' => 3600 ]),
        [ 'prefix' => 'cache' ]
    ));
    $backend->push(new \Phalcon\Cache\Backend\Memcached(
        new FrontendData([ 'lifetime' => 86400 ]),
        [ 'prefix' => 'cache', 'host' => 'localhost', 'port' => 11211 ]
    ));

    $session->setBackend($backend);
    $session->start();

    return $session;
});
```

Packagistに登録してあるので、composerでさくっとインストールできまする
https://packagist.org/packages/iwai/phalcon-session-adapter-cachebackend
c++ builder > Int型の最大値 > MaxInt / MAXINT

```txt:動作確認
C++ Builder XE4
```

Int型の最大値の調査。

[参考1](http://docwiki.embarcadero.com/RADStudio/XE8/ja/MAXxxxx_defines%EF%BC%88%E6%95%B4%E6%95%B0%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B%EF%BC%89)

> MAXINT  int 型の最大値

[参考2](http://docwiki.embarcadero.com/RADStudio/XE8/ja/64_%E3%83%93%E3%83%83%E3%83%88_Windows_%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B%E3%81%A8_32_%E3%83%93%E3%83%83%E3%83%88_Windows_%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B%E3%81%AE%E6%AF%94%E8%BC%83)

> MaxInt $7fffffff

両方ともコンパイルできた。

```cpp
int val1 = MaxInt; // F1で複数のヘルプページの候補が開く。 System.Intも含む
int val2 = MAXINT; // F1でSystemのページが開く
```

違いについては未調査。

[参考3(delphi)](http://www.delphibasics.co.uk/RTL.asp?Name=MaxInt)
Swiftで毎時間ごとに関数を呼び出したい時の方法 

```ruby:タイマー処理
    override func viewDidLoad() {
        NSTimer.scheduledTimerWithTimeInterval(1.0, target: self,selector: "onUpdate:", userInfo: nil, repeats: true)
    }

    func onUpdate(timer : NSTimer){
        print("1秒")
    }


```
Capistranoのハングアップ防止

Capistranoのハングアップ防止
===

問題
---
Capistranoで長い時間がかかる処理があるとハングアップしてしまう。
何のエラーメッセージも出ない。

原因
---
SSHサーバのタイムアウトでコネクションが切れてしまうとCapistrano側で検知できないらしくずっと待ってしまうようだ。

対策
---
NULLパケットを定期的に飛ばす設定ができれば解決する。
この設定はサーバ側でもクライアント側でもできる。

クライアント側で設定
---
普通に考えると~/.ssh/configに```ServerAliveInterval 60```とか設定したくなるけど、RubyのNet::SSHはこの設定は見てくれないらしい。
CapistranoからNet:SSHにオプション渡してくれる口があるので、それをつかう。

```ruby:deploy.rb
set :ssh_options, :keepalive => true
```

あるいは

```ruby:deploy.rb
server "example.com",
       :user => "deployer",
       :roles => %w(web app),
       :ssh_options => {
         :keepalive => true,
         :keepalive_interval => 60 #seconds
       }
```

サーバ側で設定
---
サーバ側のopensshの設定でやる場合は下記。

```sh:/etc/ssh/sshd_config
ClientAliveInterval 30
ClientAliveCountMax 10
```

調べるとこっちの方法がたくさんでてくるんだけど、デプロイツールのためにサーバ設定変えるのって本末転倒感あるので個人的にはクライアント側の対応を推奨。

参考
---
https://stackoverflow.com/questions/11570209/capistrano-deploy-timeout
https://github.com/capistrano/rails/issues/55
CoderにWebiopi インストールバッチ


```
wget http://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz/download
tar xvzf download
cd WebIOPi-0.7.1/python/native

mv cpuinfo.c cpuinfo.c.original
mv gpio.c gpio.c.original

wget http://denshikousaku.net/wp-content/uploads/2015/02/cpuinfo.c
wget http://denshikousaku.net/wp-content/uploads/2015/02/gpio.c

cd ../..
sudo ./setup.sh

sudo /etc/init.d/webiopi start
sudo update-rc.d webiopi defaults
```

起動したらまずコレ叩く。

# アクセス

https://coder.local:8000


Basic認証
ユーザ名 ： webiopi
パスワード ： raspberry

![スクリーンショット 2015-10-05 13.47.46.png](https://qiita-image-store.s3.amazonaws.com/0/4036/f3f11bbc-b222-c38e-67e9-86e3af66006a.png "スクリーンショット 2015-10-05 13.47.46.png")
KarabinerでExcelのキーバインド変更



Karabiner.version 10.9.0で説明します。

メニューバーのKarabinerアイコンから「Preferences...」を選択。

設定画面の「Misc & Uninstall」にある
「Custom Setting」欄の「Open private.xml」をクリック。
![スクリーンショット 2015-10-05 13.09.52.png](https://qiita-image-store.s3.amazonaws.com/0/2141/13a3b116-20c0-5a54-835c-75c1f149490e.png "スクリーンショット 2015-10-05 13.09.52.png")

Karabinerのディレクトリが開くので、中にあるprivate.xmlをエディタで開く。

以下の内容を追加

```xml:private.xml
  <appdef>
    <appname>EXCEL</appname>
    <equal>com.microsoft.Excel</equal>
  </appdef>

  <item>
    <name>Excel Remap</name>
    <identifier>private.app_excel</identifier>
    <only>EXCEL</only>
    <autogen>
      __KeyToKey__
      KeyCode::H,
      ModifierFlag::CONTROL_L,
      KeyCode::DELETE
    </autogen>
  </item>
```

保存したら、Karabinerの設定ページの「Change Key」タブにある「Reload XML」をクリック。

![スクリーンショット 2015-10-05 13.17.53.png](https://qiita-image-store.s3.amazonaws.com/0/2141/74f07932-ccbe-a62f-dce8-a43686f23df6.png "スクリーンショット 2015-10-05 13.17.53.png")

「Excel Remap」が追加されていたら成功。

![screen shot 4.png](https://qiita-image-store.s3.amazonaws.com/0/2141/b45848cf-70b8-de5c-0267-b61ab93d96f2.png "screen shot 4.png")
【Unity】新しいマルチプレイ機能UNETについて調べてみた

# ネットワークリファレンスに旧が付いた
いつの間にかUnityの[ネットワーキングの概要（旧）](http://docs.unity3d.com/ja/current/Manual/net-HighLevelOverview.html)に旧が付いていたので、調べてみました。


# 既存のNetworkViewの問題点
いままでNetworkViewはRPC(リモートファンクションコール)使えたり便利だったけど、ネットワーク周りが弱かった。固定IPあることが前提な設計のため、特にスマホの場合NAT超えできなかったり、docomoとソフバンで繋がらない問題が発生していた。またスマホがホストの場合同時接続数が10人超えるとスペック不足が顕著になり、大規模マルチプレイが実装できなかった。

# 開発者はどう対応していたか
P2Pでの実装を諦めて、自社中央サーバ立てたり、外部サービスのPhotonを利用してスマホ同士を接続していました。[例えばコロプラの白猫の例](http://qiita.com/baba_s/items/7c5680b4b808defddcb7)だと裏はnodejsでパケット交換を仲介しています。

# UNETってナニモノ？Unity側が動いた
旧ネットワークリファレンスには『Unity5.1からはUNETの使用を推奨』と記述されています。UNETとは何者でしょうか？

UNETとは簡単に言うとUnityが公開しているインターネットサービスである[UnityMultiplayer](https://multiplayer.unity3d.com/landing/)サービスを利用するためのクラスです。いままでのNetworkViewのようなP2Pで相互接続できない問題を、あいだにUnityが提供する中間サーバを利用することで解消を計っています。UNET詳細については[こちらの公式リファレンス](http://docs.unity3d.com/ja/current/Manual/UNet.html)を読むといいと思います。UnityMultiplayerの内容はPhotonと同等で、かなり意識しているなーと私は感じています。戦略としては模倣でしょうか。


# サービスとして成功するのか
ゲーム向けエンジンを作っている会社（Unity）がネットワーク周り強いかというと未知数。実績もないから来年の冬くらいまでは様子見が適切だと思います。developerには公開されていないAPIが利用できたりUnityの仕様自体に手を入れられるので成功する余地は十分ありそうです。

# スマホのマルチプレイを作るとここで躓いた
WebAPIだとOAuth2.0つかって認証できるけど、TCP/IP通信の場合認証で困ります。マッチングサーバに不正アクセスされたりBotが流行したらどうしようとなりました。これはPhotonでも同じことが起こります。

またスマホ同士のパケットを交換するために、ゲーム開発者にいきなりTCP/IPサーバを書いてといっても書ける人/書いたことある人が居なくて困り果てます。TCP/IPサーバをメンテする問題も発生しそうです。

じゃあ自社でTCP/IPサーバ書くの大変だから、外部サービスを利用しようとなると実績あるのはPhotonしかありません。将来UnityMultPlayerも選択肢に入るようになるとなかなか良い感じになりそうですね。
railsで i18nで他言語化した　[目標]domain.com/signup をdomain.com/:locale/signupに。

#i18nを導入

##1. config/initializers/i18n.rbにLAUNGUAGESというのを書く

```rb
I18n.default_locale = :en

LANGUAGES = [
  ['English', 'en'],
  ['日本語', 'ja'],
  ['中文', 'zh-CN']
]
```
今回は、この三言語を使う。

##2.app/controllers/application_controllers.rbにset_i18n_locale_from_paramsを定義するとともに、urlのオプションもセットで定義しておく。

```rb
protected
def set_i18n_locale_from_params
  if params[:locale]
    if I18n.available_locales.map(&:to_s).includes?(params[:locale])
      I18n.locale = params[:locale]
    else
      flash.now[:danger] = "#{params[:locale]} translation not available"
    end
  end
end

def default_url_options
  { locale: I18n.locale }.merge(super)
end
```

とする。これで、paramsにlocaleがあった時に、そのlocaleが存在するかをチェックして、存在すれば、I18n.localeをそのlocaleにセットするというのができた。

##3.config/routes.rbを設定する。

今回の目標は、www.domain.com/helloだったものを、日本語、英語、中国語をそれぞれwww.domain.com/ja/hello、www.domain.com/en/hello、www.domain.com/zh-CN/helloに対応させるので、routing の設定が必要である。

```rb
scope '(:locale)', locale: /en|ja|zh-CN/ do #localeがないもともとのrouteもそのまま使える
  #　上のようにlocaleをurlに入れたい部分を全て書く。よくわからなければ、全てこの中に入れて仕舞えば良い。以下に例を示す
  root 'home#index' # www.domain.com/:locale/ ホームに言語の情報がつく
  resources :users  # www.domain.com/:locale/users/new　など
  get 'signup' => 'users#new' # www.domain/:locale/signup
end
```

##4.対応する言葉を定義する


各言語の対応は、config/localesないのymlファイルに定義する。

ja.yml

```rb
ja:
  hello: "こんにちは"
  
  layouts: # viewsのlayouts内の
    header: # _header.html.haml内で使われている
      user: "ユーザ" # userを"ユーザ"と表示する
      profile: "プロフィール"
      settings: "設定"
      home: "ホーム"
      help: "ヘルプ"
      logout: "ログアウト"
      login: "ログイン"
      account: "アカウント"
```
同様に、en.yml, zh-CN.ymlも定義する。

他にも

```rb
ja:
...

  views:
    something: '何か'
```
と定義すると、

```rb
= t('views.something')
```
でどのviewからも呼び出せる。
##5.viewsから定義したものを呼ぶ

例として、app/views/layouts/_header.html.haml(application.html.hamlの部分テンプレートで呼ばれてるとする)に上で定義したものを書いてみる

```rb
= t('.user') #日本語なら"ユーザ"と表示される。
```



##6.言語変更のリンクを作る。

navbarないに以下を書く

```rb
- LANGUAGES.each do |language, locale|
  %li{class: "#{I18n.locale == locale} ? 'active' : 'inactive'"}=link_to language, locale: locale
```
これで、言語変更のリンクができた。

このLANGUAGUESは、一番最初のconfig/initializers/i18n.rbで定義したものである。

##参考ページ

http://guides.rubyonrails.org/i18n.html
c++ builder XE4, 10.2 Tokyo > TDateTime > VarToDateTime()が失敗する > Lプリフィックス付きの VarToDateTime(L"2015/10/05 12:30:45");はダメ / VarToDateTime("2015/10/05 12:30:45");はOK

```txt:動作確認
C++ Builder XE4
```

[こちらの投稿](http://qiita.com/7of9/items/ab67f7c03459f294aaf8)でVarToDateTime()を使えばいいと投稿したが、今日以下のコードを実行するとエラーがでるようになった。

```cpp
TDateTime dt2 = VarToDateTime(L"2015/10/05 12:30:45");
```

エラーとして以下が表示され、CPUというウィンドウが表示される。

```
デバッグ出力: HEAP[Project1.exe]: プロセス, Project1.exe
デバッグ出力: 
Invalid address specified RtlSizeHeap( 002c0000, 00406230 )
$77B35DCDでユーザ以外によるブレークポイント。プロセスProject1.exe (1348)
```

VarToDateTime()もダメなのか。

以下では問題がない。

```cpp
TDateTime dt2 = StrToDateTime(L"2015/10/05 12:30:45");
```

http://stackoverflow.com/questions/4070105/which-date-format-does-vartodatetimevardatefromstr-use
を見ると、delphi ではStrToDateTime()にフォーマット指定ができるが、C++ BuilderではそういうAPIは用意されていない。

どうしたものか。

<hr>
##解決

以下は失敗する。

```
TDateTime dt2 = VarToDateTime(L"2015/10/05 12:30:45");
```

以下は問題ない。

```
TDateTime dt2 = VarToDateTime("2015/10/05 12:30:45");
```

Lプリフィックスがあると失敗するというのがよくわからない。

いったんString変数に入れる以下は問題ない。

```
String dtStr = L"2015/10/05 12:30:45";
TDateTime dt3 = VarToDateTime(dtStr);

OutputDebugString(DateTimeToStr(dt3).c_str());
```


### 10.2 Tokyoでも発生
(追記 2019-05-10)

```txt:動作確認
RAD Studio 10.2 Tokyo Update 3
```

10.2 Tokyoでもエラーが発生した。下記のエラーが表示される。

```
> Invalid address specific to RtlSizeHeap( ... )
```
ubuntuにinnotopを入れるAnsible Play bookを作ったよ

モジュール入れたりいろいろ複雑だったからAnsible Play bookにしておいた。

``` innotop.yml
- hosts: all
  sudo: yes
  tasks:
    - name: Package prerequisites for Perl
      apt: name=make state=present
      with_items:
        - make
        - gcc
        - curl
        - perl-doc
        - libmodule-build-perl
    
    - name: Install cpanminus
      shell: curl -L http://cpanmin.us | perl - App::cpanminus
    
    - cpanm: name=DBI
    - cpanm: name=Time::HiRes
    - cpanm: name=Term::ReadKey
    - cpanm: name=DBD::mysql
    
    
    - name: Get innotop
      get_url: url="https://innotop.googlecode.com/files/innotop-1.9.1.tar.gz" dest=/tmp
    
    - name: extract innotop
      command: tar xvfz innotop-1.9.1.tar.gz chdir=/tmp creates=/tmp/innotop-1.9.1
    
    - name: install innotop
      shell: perl Makefile.PL && make install chdir=/tmp/innotop-1.9.1
```
[CentOS]proxy経由でyum/wget実行

#yum
/etc/yum.conf に下記追記。

```
proxy=URL
proxy_username=hogehoge
proxy_password=hogehoge
```

認証がなければ、username、passwordはいらないと思われる。

#wget
.bashrc に下記追加。

```
export http_proxy=http://ユーザ名:パスワード@URL
export https_proxy=http://ユーザ名:パスワード@URL
export ftp_proxy=http://ユーザ名:パスワード@URL
```

認証がなければ、username、passwordはいらないと思われる。
wget関連の設定ファイルに記述するやり方もあるらしい？(試してない)



#その他
- 環境変数を設定すれば、yum.confの設定しなくても良いのかと思ったが、プロキシエラーになった。よくわからない。

- curlコマンドのプロキシがうまく通らなかった。仕方ないのでwgetに書き換えた。
has_many みたいな、クラス定義時に使えるメソッドの実装方法

Ruby on Rails の ActiveRecord についてくる `has_many` メソッドは、モデルクラス間の関連を宣言的に書けて大変便利だと思います。
自分でも同じように宣言的に書けるメソッドを定義したいと思ったことがある人は多いでしょう。
本記事では、このようなメソッドの定義方法について簡単に紹介したいと思います。

```rb
class Post < ActiveRecord::Base
  # こんな風に関連を宣言的に書けて便利ですね。
  # 本記事ではこのようなメソッドの定義方法を見て行きます。
  has_many :comments
end 
```

時間がない人向け
----

```rb
class Base
  class << self
    attr_accessor :_label

    def label label
      self._label = label
    end
  end

  def to_s
    "<#{self.object_id}@#{self.class._label}>"
  end
end


class Conc < Base
  label "とあるクラス"
end

puts Conc.new.to_s # <2939193@とあるクラス>
```

どのように定義するか
----

[リファレンス](http://docs.ruby-lang.org/ja/2.2.0/doc/spec=2fdef.html#class)によれば、クラス定義式の中では `self` はそのクラスになります。
なお、通常（トップレベル）での `self` は [main](http://docs.ruby-lang.org/ja/2.2.0/class/main.html) オブジェクトです。

実験してみましょう。

```rb
puts self # main

class Hoge
  puts self # Hoge
end
```

と、いうわけで、メソッドを定義してあげると、クラス定義式中でそのメソッドを使うことが可能となります。

```rb
class Hoge
  def self.piyo
    puts 47
  end
  
  piyo
end
```

引数をとって値を保存するにはクラス変数に保存してあげればよいでしょう。

```rb
class Hoge
  def self.piyo val
    @val = val # ここは @@val にしないでくださいね。
    # ややこしいですが、Hogeのクラス変数は「Hoge というクラス」のインスタンス変数とほぼ同義だからです。
  end

  def self.fuga
    @val || ''
  end

  piyo 'aaa'
end

puts Hoge.fuga # 'aaa'
```

モジュールにした場合は `Module#include` が使えないことにご注意ください。特異クラスに対する `Module#include` を実現するものとして `Object#extend` がありますので、そちらを使います。

```rb
module M
  def m1 val
    @val = val
  end

  def m2
    @val || ''
  end
end

class C
  extend M
  m 'test'
end

puts C.m2 # 'test'
```
Qiita > 検索 > タイトルが一部しか表示されないことがあるようだ

Qiitaの検索では、タイトルはすべて表示されていると思っていたが、違ったようだ。

試しに「user:7of9 TDateTime」で検索したところ、以下の一覧が表示された。

![qiitaSearch.png](https://qiita-image-store.s3.amazonaws.com/0/32870/cb39f785-d758-eacc-f9ae-ab5dabdf2bf8.png)

上記の一覧のうち、赤枠のものは本来のタイトルは以下で、後半の部分しか表示されていない。検索時に短くなったタイトルのものもよく見ないと見落としそうなので注意。

```
c++ builder > Windows 8.1 English だけ abnormal program terminationが起きる > static const TDateTime kDt = StrToDateTime(L"2000/1/1 00:00:01"); はだめ > 代替案: static const TDateTime kDt = VarToDateTime(L"2000/1/1 00:00:01");
```

なお、タグで検索した時は、一覧のタイトルは全部が表示されている。
http://qiita.com/tags/cppbuilder

![qiitaSearch2.png](https://qiita-image-store.s3.amazonaws.com/0/32870/092c6036-7114-c581-3035-175743da2ea0.png)
MSSQLのメモ

# テーブルの複製

```sql
select * into tbl_copy from tbl_origin where 1<>1;
```

# テーブルデザインの変更ができない
**Microsoft SQL Server Management Studio** での場合

http://bleis-tift.hatenablog.com/entry/20090523/1243061474 より
> 
1. メニューから「ツール」を選ぶ
2. オプション」を選ぶ
3. 左側のツリーから「デザイナ」を選ぶ
4. 右側の「テーブル オプション」から「テーブルの再作成を必要とする変更を保存できないようにする」のチェックを外す

# 緯度経度の保存
**geometry型**を仕様します。

似たようなgeography型がありますが、楕円を考慮していないです。

参考
http://d.hatena.ne.jp/ochi0218/20101229/1293646091
http://linyi-zatta.blogspot.jp/2014/02/sqlserver.html

# SQLCMDでの実行
SQLを入力後、 ```go``` で実行する

参考
http://www.geocities.jp/kandou_quester/Knowledge/Programming/SQL/_how_to_use_sqlcmd.html


# 外部ファイルの使用方法

参考
https://msdn.microsoft.com/ja-jp/library/ms178129(v=sql.120).aspx
http://d.hatena.ne.jp/aoki1210/20080807/p1
http://yunogotoshi.blogspot
p/2014/12/csv-sql-server-bulk-insert.html

# データサイズ

参考
https://msdn.microsoft.com/ja-jp/library/ms187745(v=sql.120).aspx
http://kaya-soft.com/sqlserver2008-toranomaki/beginner/columntype/

# 文字列から日付型への変換
"20151231123456" ( 2015/12/31 12:34:56 )

```
CONVERT(DATETIME,
SUBSTRING(@Term,1,8) + ' ' +
SUBSTRING(@Term,9,2) + ':' + 
SUBSTRING(@Term,11,2)
)
```
http://qa.atmarkit.co.jp/q/6184

# 実行計画
http://blogs.msdn.com/b/jpsql/archive/2011/09/07/10207003.aspx

# ファイルの移動
http://d.hatena.ne.jp/akabeina/20130218/1361161851

# パーティション
http://www.sqlquality.com/Self2012/Self2012_DP/Text/mokuji.html

## 分割
https://technet.microsoft.com/ja-jp/library/ms186307(v=sql.105).aspx

# ファイルグループの追加
https://technet.microsoft.com/ja-jp/library/ms174269(v=sql.105).aspx

# 日本測地系の変換
http://blog.livedoor.jp/g0031067/archives/51835398.html

# ポリゴン内に座標があるか
http://d.hatena.ne.jp/machi_pon/20080808/1218186010

# 最大サイズなど
https://technet.microsoft.com/ja-jp/library/ms143432(v=sql.100).aspx

# リモートアクセス
http://d.hatena.ne.jp/lranran123/20140422/1398129841
Redis　パフォーマンス向上案　まとめ

とりあえず簡潔にわかりきってることだけ。
ここで記載してるのはちょっと古いバージョンのRedis2.6を使った時の記録。最新情報ではないので注意。

# 1キーに大量のデータを入れない
簡単にスロークエリ化する。致命傷。

# スロークエリを潰す。
Redisだから速いと思った？　思った？　ボリューミーなデータを1万件集めてソートしたりすると数秒のクエリが誕生するよ。死ぬよ？
ということで、SLOWLOG コマンドを使って、スロークエリを特定して潰しましょう。

# インスタンスを増やして、処理を分ける。
Redisはシングルスレッドである。よって、スロークエリがあると瞬殺される。
シングルスレッドならインスタンス増やして、無理やりマルチスレッドにすればいいじゃない　という強攻策。
<br>

# master slave化
get系コマンドでmasterが重い！　だったらslave化だ！
<br>

# unix domain socketで繋ぐ
当たり前だがTCPを経由しなくなるので、TCPレイヤーの負荷が大幅に減る。

# pconnect化
困ったときのpconnect。ただしやり過ぎに注意。

# saveを改善
可能なら、master slave で変えたほうがいい。 slaveはsaveする意味が無いので止めてもいいと思ってる。
saveが頻繁に発生するとその度にディスクIOが発生するので重くなる。但しデメリットがあるのでご利用は計画的に。
 - メリットは、ディスクIOが減る。
 - デメリットはトラブル発生時にバックアップが消失しデータロストする。

# timeout を改善
インターバルタイムアウトを調整する。
短すぎると勝手にコネクションが切断されるので要注意。
だが長すぎても問題なので、無制限の0にするのはやめたほうがいいと思う。参考サイト：http://d.conma.me/entry/2013/03/21/114044

# プロキシを通す
コネクションが大幅に減ります。pconnect化出来ない環境でオススメ。
twemproxy が流行ってるので、これを使えばいいと思う。
デメリットとしては、multiなど使用できないコマンドが多数あるので注意が必要です。
Raspberry Pi 2 に Raspbian Jessie (2015-09-24) をセットアップした。

インストールに関するメモ書き

#NOOBS 1.4.2
はじめ NOOBS 1.4.2 を使ってセットアップしようとしたのだけれど、ファイルシステムを展開している最中に失敗したので諦めた。

#Raspbian Jessie (2015-09-24)
`2015-09-24-raspbian-jessie.zip` のイメージを microSD カードに展開。Jessieではデフォルトで GUI で起動する。

左上の `MENU` から `Preferences` - `Raspberry Pi Configuration` を選択。

1. `Expand Filesystem` を実行。
2. `Hostname` を変更。
3. `Boot` を `To CLI` に変更。
4. `Auto login` のチェックを外す。
5. `Locale` はそのまま。
6. `Timezone` を `Asia-Tokyo` に設定する。
7. `Keyboard` は `Japan-Japanese` に変更。

そして再起動。

#ソフトウェアの更新
最初にインストール済みソフトウェアを最新版に更新する。

```bash:
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
$ sudo rpi-update
$ sudo reboot
```

#ソフトウェアの追加

##Avahi をインストール
`avahi-daemon` は最初からインストールされている模様。

```bash:
$ sudo apt-get install avahi-daemon avahi-autoipd
```

##Samba をインストール

```bash
$ sudo apt-get install samba samba-common-bin
```

設定ファイルの編集。

```bash
$ sudo nano /etc/samba/smb.conf
```

以下の記述を追加。(注：Raspbian Wheezy の時と記述が異なる。)

```bash:smb.conf（追加分）
[share]
   path           = /home/pi
   writable       = yes
   guest ok       = yes
   guest only     = yes
   create mode    = 0777
   directory mode = 0777
   share modes    = yes
   force user     = pi
```

Samba のユーザーを追加。

```bash
$ sudo smbpasswd -a pi
New SMB password:********
Retype new SMB password:********
Added user pi.
```

設定を反映させるため Samba を再起動。
Jessie では `systemctl` を使う。 `nmbd` の再起動はおまじない？

```bash
$ sudo systemctl restart smbd
$ sudo systemctl restart nmbd
```

##TightVNC, XRDP のインストール

```bash
$ sudo apt-get install tightvncserver xrdp
```

特に問題なし。

##GPIO周辺
###I2Cライブラリのインストール。

```bash
$ sudo apt-get install i2c-tools libi2c-dev python-smbus
```

Raspi-Configの設定。

```bash
$ sudo raspi-config
```

`8 Advanced Options` - `A7 I2C` でI2Cバスを有効にし、Raspberry Piを再起動。 

###WiringPiの導入
WiringPiを `git clone` で導入しようと思ったら、すでにインストールされていた。


#WiFiのセットアップ
無線LANアダプタとして Planex の GW-USNANO2A を使用。

アクセスポイントのSSIDを調べる。

```bash
$ sudo iwlist wlan0 scan | grep ESSID
```

SSID が XXXXXXXX 、パスフレーズが YYYYYYYY の場合、次のコマンドを実行する。

```bash
$ sudo sh -c "wpa_passphrase XXXXXXXX YYYYYYYY >> /etc/wpa_supplicant/wpa_supplicant.conf"
```

パワーマネジメント機能をOFFにする。
Planex GW-USNANO2A の場合、以下のように現在の状態を確認する。

```bash
$ cat /sys/module/8192cu/parameters/rtw_power_mgnt
```

`0` は省電力管理無効、 `1` は最小限の電力管理、 `2` は最大限の電力管理。
省電力管理を無効にするためには、以下のように `8192cu.conf` ファイルを作成。

```bash
$ sudo nano /etc/modprobe.d/8192cu.conf
```

```bash:8192cu.conf
# Disable power management
options 8192cu rtw_power_mgnt=0
```

設定を反映させる。

```bash
$ sudo reboot
```

#Bluetooth

```bash
$ sudo apt-get install bluetooth blueman
```

#追記
公開鍵認証を使ってssh接続する手順は、以下のサイトを参考に。
- [Raspberry Piに公開鍵認証を使ってssh接続する](https://tool-lab.com/2013/11/raspi-key-authentication-over-ssh)

#参考
- [Raspberry Piで学ぶ電子工作 補足情報](http://raspibb.blogspot.jp/2015/04/blog-post.html)
- [Raspbian Jessieがリリース！](http://akkiesoft.hatenablog.jp/entry/20150929/1443536342)
statファミリ－のメモと、カーネルチューニング

調査をするときに使うが、毎回忘れてしまうので自分用にメモ

# statファミリーまとめ
## dstat
美しい！　目で見るならこれ。
最も役に立つ参考サイト：http://qiita.com/harukasan/items/b18e484662943d834901

## vmstat
メモリやCPUを見る時に使う。

## iostat
ディスクIOを見るときに使う。

## netstat
ネットワークの状態を見るときに使う。


# カーネルチューニングとKVS設定

## net.core.somaxconn 
TCPのmax connection数。
参考サイト：http://d.hatena.ne.jp/tetsuyai/20111220/1324466655

例えばmemcacheやRedis等のKVSを使うときは、memcachedのtcp_backlogや、Redisのmaxclientsの数値以上にあげたほうがいい。
Redis はソースコード中に listen バックログの値を511と記述されてるので、それ以上引き上げる場合はコードをいじって再コンパイルしないとダメ。
net.core.somaxconn を引き上げたほうがいいかどうかは、netstat -s をやって "XYZ times the listen queue of a socket overflowed" みたいな行を見ればいい。
listen backlogがオーバーフローしている場合は、この数値が高くなる。

# net.ipv4.tcp_keepalive_time
 - net.ipv4.tcp_keepalive_time
 - net.ipv4.tcp_fin_timeout
CLOSING状態でFINに対するACKを受信すると、そのままTIME-WAITとなる。FIN-WAIT-2状態でFINを受信すると、ACKを返信し、TIME-WAITとなる。
短くするとTIME_WAITを減らす効果がある。
netstat -na | grep CLOSE_WAIT | wc -l で、CLOSE_WAITがどのくらいあるかを確認して調整すると良い。

# net.ipv4.ip_local_port_range
ポートレンジを増やす。これを増やさないと大量の接続は捌けないので、みんなよく設定する値。
よく調べるのは、tcpのコネクション数を調べる下のコマンド
```
netstat -an | grep tcp | wc -l
```
この数値と、cat /proc/sys/net/ip4/ip_local_port_range　をニラメッコすると、ポート枯渇していないかが確認できる。


## 色んな設定
 - net.ipv4.tcp_window_scaling = 1 # TCPウィンドウスケーリングを有効にする
 - net.ipv4.tcp_moderate_rcvbuf=1 # 受信バッファ・サイズの自動チューニングを有効にする
 - net.core.netdev_max_backlog=2000 # カーネルの処理速度よりも早くキューが詰まれる場合の、最大個数
 - net.core.tcp_max_listen_backlog=2000 # SYN→ACKまでの状態のコネクション(listenソケット）をいくつ保持するか
 - tcp_mem # tcpに割り当てていいメモリ上限を当てる。高いほうがいい。

 - net.ipv4.tcp_wmem
 - net.ipv4.tcp_rmem
 - net.core.wmem_max
 - net.core.rmem_max
こいつらはそんなに意識する必要が無さそう？
github でホストされている go アプリを fork して PR する時には、まず go get から始めよう

# TL;DR

fork したリポジトリは clone せず、本家を go get すべし

# 経緯

Docker のコンテナ管理ツールを夢想してみたものの、なかなか険しい道のりなので、crane を拡張していく方向に切り替えました。で、最初にはまったポイントをメモ。いろいろなところで言及されているので今更感ありますが、ご了承ください。

# お勧めの手順
普通は fork したものを clone して、本家へのリモート参照を upstream として追加しますが、Go の場合には逆になります。本家を get して、fork へのリモート参照を追加するのです。

0. 本家のリポジトリを github で fork
1. 環境変数 `GOPATH` を適切に設定（迷ったら `HOME` で良いでしょう）
1. 本家のリポジトリを `go get github.com/<userid>/<repo>` で複製する
2. 複製したディレクトリに `cd $GOPATH/src/github.com/<userid>/<repo>` で移動する
3. fork したリポジトリへのリモート参照を `git remote add fork https://github.com/<my-id>/<repo>` で追加する
4. トピックブランチ切って作業を行う

ブランチ切ってからの作業はいつもの手順とほぼ同じです。push 先が origin ではなく、fork であるとか、デフォルトの master ブランチが本家を指している、といったところに気をつければ、特に難しいところはありません。

# なぜ fork したリポジトリを clone してはいけないのか？
Go には元からパッケージ管理機能が備わっており、`GOPATH` 環境変数を起点としてパッケージの存在確認を行います。パッケージのパスはローカルでも github のようなリモートでも良く、なければ `GOPATH` 以下に自動的にインストールしてくれます。

そして大抵の main.go には、本家のリポジトリを参照する import があります。

```go:main.go
package main

import (
        "github.com/michaelsauter/crane/crane"
)

func main() {
        crane.RealMain()
}
```

当然ながら fork したリポジトリは `github.com/<userid>` 部分が自分のものに置き換わりますから、ビルドでコケます。なので、まずは本家を `go get` するのがお作法になるわけです。

# 振り返り

最初は、fork したリポジトリに合わせて import を修正しようか...... なんて考えもチラリと浮かんだのですが、そんな乱暴な PR など通るはずもないしなぁと思い、お作法に辿り着きました。

Go のパッケージ管理は良くできているようで、案外、そうでもない気がしています。固有のリポジトリと強固な依存関係をソースコードに持ち込んでしまうのは、果たして良かったのか。リポジトリの物理的な場所は外出しにして、マッピングできるようになっているとか、DI 的なものでも良いのですが、そういった仕組みが用意してあれば今回のケースにもうまく対処できたように思います。

まあでも、git が柔軟だからどうとでもなるのですけどね。

# 教訓

Go に入っては Go に従え

# 参考

- [How to Write Go Code](https://golang.org/doc/code.html)
- [GitHub and Go: forking, pull requests, and go-getting](http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html)
- [GithubのGo言語プロジェクトにPull Requestを送るときのimport問題](http://deeeet.com/writing/2014/07/23/golang-pull-request/)
atomのオートインデント


macだったら、
左上のAtomから
Open Your Keymap
を開いて

```'

# Your keymap
#
# Atom keymaps work similarly to style sheets. Just as style sheets use
# selectors to apply styles to elements, Atom keymaps use selectors to associate
# keystrokes with events in specific contexts.
#
# You can create a new keybinding in this file by typing "key" and then hitting
# tab.
#
# Here's an example taken from Atom's built-in keymap:
#
# 'atom-text-editor':
#   'enter': 'editor:newline'
#
# 'atom-workspace':
#   'ctrl-shift-p': 'core:move-up'
#   'ctrl-p': 'core:move-down'
#
# You can find more information about keymaps in these guides:
# * https://atom.io/docs/latest/using-atom-basic-customization#customizing-key-bindings
# * https://atom.io/docs/latest/behind-atom-keymaps-in-depth
#
# This file uses CoffeeScript Object Notation (CSON).
# If you are unfamiliar with CSON, you can read more about it here:
# https://github.com/bevry/cson#what-is-cson

```

```
			
こういうのが出てくるのでここに

```
'atom-text-editor':'cmd-alt-l': 'editor:auto-indent'
```



これを書く。



##参考
[stackover](http://stackoverflow.com/questions/22611377/auto-indent-code-in-atom-editor)
c++ builder XE4, 10.2 Tokyo > TDateTime > ミリ秒 (msec) まで表示 > Now().FormatString(L"yyyy/mm/dd hh:nn:ss.zzz")

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

ミリ秒の処理の計測をするのに以下を使っていた。

```cpp
WORD start = GetTickCount();
WORD elapsed;

// 処理...

elapsed = GetTickCount() - start;
```

TDateTimeのFormatStringでミリ秒まで表示できないかと思って調べた。

http://docwiki.embarcadero.com/Libraries/XE8/ja/System.TDateTime.FormatString

```
OutputDebugString(Now().FormatString(L"yyyy/mm/dd hh:nn:ss.zzz").c_str());
```

```txt:結果
デバッグ出力:2015/10/05 10:09:28.324 
```

上記の `.324` がミリ秒。

上記のデバッグ出力を処理前と処理後で実行することで、だいたいの処理時間がわかる。
プログラミング設計に関してのまとめ


```
インクリメンタル設計

インクリメンタルな設計 => インクリメンタル =>  一定の値、単位や数値を「一ずつ増やしていく」ことの形容


インクリメンタルな設計の場合
最低限必要な機能から「すこしずつ」開発を進め、その過程で設計自体も「すこしずつ」進化させていく

適合するケース => アジャイルな開発
・つくりたいものが決まっていない、わからない
・開発チームが開発対象を十分理解していない
・開発対象が複雑で正しい設計を誰もしらない
```


```
#TDDの設計思想/流れ

設計思想

テスト駆動開発 Test Driven Development/TDD
価値
・インクリメンタルな設計を促す
・チームに良いリズムを生む
・開発に自信と信頼をもたらす
原則
・実装する前にテストを書く
・問題を放置せずに少しずつ前進する
・大事なのは完璧さよりも自信を持てること

開発の流れ

TDDの場合、RED(失敗)とGREEN(成功)を繰り返し、Refactor(改造)の工程をへて、再度RED(失敗)に移ります。

1 失敗するテストを書く　"CASE Red"
・機能の追加
・条件の追加
・バグの再現

2 テストが成功する最小限のコードを書く "CASE Green"

3 動作を保ったまま設計を洗練させる　"CASE Refactor"
```


```

プログラミング設計の二つの設計要素

・責任の設計 => 静的な設計
インターフェース
問題を最も単純化できるクラスやメソッドの構成は？

名前
責任の内容を端的に表現するには？

・仕事の正しさの設計 => 動的な設計
振舞い
どんな手順でクラスやメソッドを使って処理をしていくか
事前条件と事後条件
ある事前条件で求められる結果 => 事後条件は何か？？
```




```
TDDは初学者こそ学ぶべき、でも、TDD is Dead??

David Heinemeier Hansson　said

The test-first part was a wondeful set of training wheels that taught
me how to think about testing at a deeper lebel, but also some I quickly left behind.

テストファーストは自動車の補助輪のようなもので、テスティングをより深いレベルで考えるやり方を教わる
役にはたったが、私はすぐに補助輪を外してしまった。
```


```
YAGNI => You ain't gonna need it => 機能は実際に必要になるまでは追加しない方が良い

・きっと後に必要になるだろう => 90%無駄になる
・予測できない事態に伴う変更に対しては、設計を単純にする事で対処できる
・コードを素早く実装するため、バグを減らすための最適な方法 => あまりコードを書かない事である。
・YAGNIとインクリメンタル設計は親和性が高い
```


```

静的設計
BowlingGameクラスの責務の決定
・投球ごとの倒したピンの数を記録する
・スコアを計算する
責務を表現するメソッドの命名
・record_shot(pins)とsocre

動的設計
最も簡単なシナリオを考える
・全投球がガターの時にはスコアが0点になる
実際の手順を考える
・全投球がガター: 20回のrecord_shot(0)
・スコアが0点: socreの戻り値をassert_equalで確認
```


```
リファクタリング => 機能 = 振る舞いを変えずに設計を改善する事

How to do?? => ExtractMethod = メソッドの抽出/基本のリファクタ手法

リファクタリング/TDD

コードの「不吉な匂い」をきっかけにおこなう
重複したコード
長すぎるメソッド
多すぎる引数

振る舞いを変えずにコードを修正する
設計の向上、劣化の防止
理解しやすくなる
テストコードも対象となる
```

参考URL

http://thinkit.co.jp/story/2014/07/30/5097
pythonでmol2ファイルを分割する (-> 2016.04.17 sdfファイルにも対応)

100万エントリー以上の化合物を数個のファイルに分割しなければならなくなったので調べてみた。

最初はopenbabelなどを調べていたのだが、
http://openbabel.org/wiki/--splitinto
を見る限り、openbabel 2.3.0の時点ではこの機能は実装されていないらしく、手元にある2.3.1もダメだった。

ということでコード自作。とりあえず動けばいいや！という魂胆がばれますね！
https://github.com/keisuke-yanagisawa/python-tools/blob/master/split_mol2.py

```bash
python split_mol2.py hoge.mol2 #10000化合物ごとに分割がデフォルト
python split_mol2.py -n 100 hoge.mol2 #100化合物ごとに分割
```
こんな感じに使えます。

`-v`オプションも用意していて、どんな名前のファイルが出力されているか見ることができるようにしてあります。

----
2016.04.17
sdfファイルにも対応しました。（実行のやり方とかは変わってない
https://github.com/keisuke-yanagisawa/python-tools/blob/master/split_sdf.py

```bash
python split_sdf.py hoge.sdf #10000化合物ごとに分割がデフォルト
python split_sdf.py -n 100 hoge.sdf #100化合物ごとに分割
python split_sdf.py -v hoge.sdf # 何て名前のファイルが出力されたか見れる
```
Visual Studio 2015のGruntを使ってファイルをコピー

TypeScriptのIDEとしてVisual Studioを使いたいが、GAEのアップロード等はEclipseのプラグインを使った方法が簡単。
そこで、Visual Studioで作成したjsファイルをGruntでEclipseのプロジェクト下にコピーする。
Visual Studio 2015からGruntが組み込まれ、利用が非常に簡単になった。
プロジェクトファイルと同階層にpackage.jsonとGruntfile.jsを作成する。

```json:package.json
{
  "name": "AnimeInfoClient",
  "version": "0.0.0",
  "description": "AnimeInfoClient",
  "main": "Gruntfile.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/kumo2ji/AnimeInfoClient.git"
  },
  "author": "kumo2ji",
  "license": "BSD",
  "devDependencies": {
    "grunt": "~0.4.5",
    "grunt-contrib-copy": "~0.8.1"
  }
}
```

devDependenciesのバージョンは補完が効く。

```js:Gruntfile.js
module.exports = function (grunt) {
    grunt.initConfig({
        copy: {
            main: {
                files: [
                    {
                        expand: true, src: ['*.js', 'index.html', '!Gruntfile.js'],
                        dest: '../AnimeInfoClient/war', filter: 'isFile'
                    }
                ]
            },
        },
    });
    grunt.loadNpmTasks('grunt-contrib-copy');
};
```

表示 > その他のウィンドウ > タスクランナーエクスプローラーでタスクランナーエクスプローラーを確認すると、copyタスクが追加されている。
![タスクランナーエクスプローラー.PNG](https://qiita-image-store.s3.amazonaws.com/0/56307/8149beca-854e-90ee-389e-46d6cc9c4cb6.png)
copy:mainをダブルクリックすれば、必要なファイルのコピーが実行される。
Clojureのフォームを再確認する

# フォームとは
Clojureのプログラムはまずリーダがプログラムを**フォーム**という単位毎に読み込み、それをClojureのデータ構造に変換し、そのデータ構造をコンパイルして実行します。

今回はClojureの基本パーツであるフォームがどういうものか、どういう種類があるかを一通り確認していきたいと思います。

# フォームの種類一覧

| フォーム | 例 |
|:--------|:----|
|リスト| (1 2 3), (str "hello" \space "world")|
|ブール値| true, false|
|Nil| nil|
|文字| \a, \b |
|文字列| "hello" |
|シンボル| user/foo, java.langString |
|数値| 1, 2, 33|
|キーワード | :tag, :doc |
|マップ| {:name "Yuji" :gender "male"} |
|セット| #{:ruby :clojure :javascript} |
|ベクタ| [1 2 3] |

## リスト
リストは単なるデータであるが、関数呼び出しの構文としても使われる。最初の要素が関数名、その次の要素からはその関数の引数になる。

```clj
(+ 1 2 3)
;; => 6

(str "hello" "world")
;; => "helloworld"
```

## ブール値とnil
Clojureにおけるブール値の規則は以下になります。

- trueが真, falseが偽
- falseの他に、nilもブール値が必要な場面では偽
- false,nil以外は、ブール値が必要な場面では真

```clj
(if true "true" "false")    ;;=> "true"
(if false "true" "false")   ;;=> "false"
(if nil "true" "false")     ;;=> "false"
(if [] "true" "false")      ;;=> "true"
(if "hello" "true" "false") ;;=> "true"


```

## 文字
文字のリテラル表記は\{letter}で、{letter}は文字そのものか文字の名前になる。

```clj
(str \h \e \l \l \o \space \w \o \r \l \d)
;; => "hello world"

```

# 文字列
文字列はダブルクォートで囲んで表記し、複数行にまたがることもできる

```clj
"hello world"
;;=> "hello world"
"hello
 world"
;; => "hello\n world"

```

# シンボル
+, concat , java.lang.Stringといったフォームはシンボルといい、ものを名付けるのに使われる。例えば+は加算する関数の名前として使われている。

```clj
;; "hello"とプリントする関数をsay-helloというシンボルに束縛している
(def say-hello (fn [] (println "hello")))

(say-hello)
;;=> "hello"
;;=> nil

```

## 数値
数値はその値自身へと評価されるため、REPLに打ち込むとそれがそのまま返される。

```clj
57
;; => 57
```

算術演算子も以下のように使える。

```clj
(- 2 1)
;; => 1
(+ 2 1)
;; => 3
(* 2 2)
;; => 4
(/ 4 2)
;; => 2
(/ 22 7)
;; => 22/7 
(/ 22.0 7)
;; => 3.142857142857143
;; 商を求める
(quot 22 7)
;; => 3
;; 余りを求める
(rem 22 7)
;; => 1
```

## キーワード
キーワードはシンボルに似ているが、コロン(:)で始まる。そして評価されると自分自身を返す。
自分自身を返すという特性上、キーワードはマップのキーによく使われる。

```clj
:tag
;;=> :tag
(def person {:name "yuji" :gender 'male'})
(person :name)
;; => "yuji"
(:name person)
;; => "yuji"
```

## マップ
マップはキーと値のペアのコレクションである。マップはカーリブレース({})でくくって、リテラルで表記できる。
マップは関数としても動作する。キーをマップに引数として渡すと、対応する値があれば値を返し、なければnilを返す。

```clj
(def inventors  {:Lisp "McCarthy" :Clojure "Hickey"})
;; => #'user/inventors
(inventors :Lisp)
;; => "McCarthy"
(inventors :Ruby)
;; => nil

```

## セット
セットはコレクションの各要素がユニークであることを保証したコレクションです。セットはシャープカーリブレース(#{})でくくって、リテラルで表記できる。
セットに対して値を与えると、対応する値があればその値を返し、なければnilを返す。

```clj
(def languages #{"Ruby" "Lisp" "Clojure"})
;; => #'user/languages
(language "Ruby")
;; => "Ruby"
(language "PHP")
;; => nil

```

## ベクタ
ベクタはインデックスによってアクセスできるコレクションです。ベクタはスクエアブラケットでくくって、リテラルで表記できる。

```clj
(def language ["Ruby" "Lisp" "Clojure"])
;; => #'user/language
(language 0)
;; => "Ruby"
(language 1)
;; => "Lisp"
(language 9)
;; => IndexOutOfBoundsException   clojure.lang.PersistentVector.arrayFor (PersistentVector.java:107)

```

# 参考
[プログラミング Clojure 第2版](http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%-Stuart-Halloway-Aaron-Bedra/dp/4274069133)
[Collections and Sequences in Clojure](http://clojure-doc.org/articles/language/collections_and_sequences.html)
AltspaceVRに登録する手順

# AltspaceVRとは？
AltspaceVRとは、サンフランシスコの同名の企業が注目を集めている、
端的に言えば3DVR空間音声チャットサービスです。
この記事では登録を扱います。以下は空間内でキャッキャウフフしている様子です。
![2015_10_01_るぱーん.png](https://qiita-image-store.s3.amazonaws.com/0/75653/ac452295-f0a9-0953-073c-49d1e2ac8dbc.png)

# まずはじめに
サインアップを行います。トップページに「SIGN UP」ボタンがあるのでクリックします。
[http://altvr.com/](http://altvr.com/)
![2015_10_01_01.png](https://qiita-image-store.s3.amazonaws.com/0/75653/a326bbeb-6c56-2382-6af4-fbb8a0fb9fa7.png)

# 登録する内容
必要事項を記入します。注意事項として、 **ファーストネームが表示名になります** （書いてありますね）。
ユーザーネームも設定せねばなりません(こちらもリストに表示されるので変な名前にしないほうが無難です)が、
AltspaceVRで対面している時に表示される名札はファーストネームが表示されますし、
変更をするためには現状運営に連絡しなければならないので慎重に入力してください。
![2015_10_01_02.png](https://qiita-image-store.s3.amazonaws.com/0/75653/0d10b4d0-cc37-3feb-bd76-c6e0df46df17.png)

# もうできます
すると次の画面に切り替わり、同時にインストーラーが自動的にダウンロードが開始されます。
![2015_10_01_03.png](https://qiita-image-store.s3.amazonaws.com/0/75653/7b74ed6f-f75c-ad90-e92c-326979397282.png)

# 実行ファイルのインストール
やることもそんなになく、自動的にインストールされます。
画面写真がないのですが、Silverlightをインストールするように言われますので
インストールしておきましょう。
![2015_10_01_04.png](https://qiita-image-store.s3.amazonaws.com/0/75653/9b9b6029-a219-a7b8-78a3-9a592357b8f7.png)

# ログイン
あとはクライアントソフトを起動し、登録時に使用したメールアドレスとパスワードで入ればOK!
これでもうあなたもAltspaceVRの住人です(翻訳っぽい締め)！！！
![2015_10_01_05.png](https://qiita-image-store.s3.amazonaws.com/0/75653/08c99abd-c92f-c82f-4542-4448ccdb6867.png)
AndroidのWebViewで音声を再生する


AndroidのWebViewでは、Audioタグによるオーディオ再生はできなかったため、使えるプラグインを調べました。

## プラグイン追加
```bash
$ cd cordova
$ cordova plugin add https://github.com/floatinghotpot/cordova-plugin-nativeaudio.git
```


## 使い方
```javascript
var url = 'xxx.mp3';
window.plugins.NativeAudio.preloadSimple( 'music_key', url, function(msg){
    // Play
    window.plugins.NativeAudio.play( 'music_key' );
});
```


## 実装済みアプリ
* [AnimalSound - 子供向けの動物音アプリ](http://www.itmarlin.com/page-animal-sound.html) : [一覧]、[ビュー]など
Androidで日本語音声出力(TextToSpeech):音声読み上げ


AndroidのWebViewでは、HTML5の Web Speech API を利用できなかったため、使えるプラグインを調べました。

## プラグイン追加
```bash
$ cd cordova
$ cordova plugin add com.wordsbaking.cordova.tts
```


## 使い方
```javascript
TTS.speak({
    text: 'こんにちわ',
    locale: 'ja-JP'
});
```


## 実装済みアプリ
* [AnimalSound - 子供向けの動物音アプリ](http://www.itmarlin.com/page-animal-sound.html) : [ビュー]画面の言語読み上げ機能
技術英語 > We could search the ship centimeter by centimeter. / one tenth of a millimter / submillimeter 

@ Star Trek Voyager > CATHEXIS

目に見えない正体不明のエイリアンの乗船に対して、マグネトンスキャナの利用を検討して

> We could search the ship centimeter by centimeter.

[wikipedia](https://ja.wikipedia.org/wiki/U.S.S.%E3%83%B4%E3%82%A9%E3%82%A4%E3%82%B8%E3%83%A3%E3%83%BC)
によると Voyager ( イントレピッド級軽巡洋艦) の全長は 344.4m.

この大きさの船を centimeter by centimeter で走査するというのが面白い。

<hr>
ノギスで0.1m単位のチェックをするという英語を上記と関連してどう言えるかふと疑問に思った。

https://en.wikipedia.org/wiki/Vernier_scale

0.1mmを英語で言うと
> one tenth of a millimter

しかしながら、以下は冗長に思う。
> one tenth of a millimter by one tenth of a millimter

ふと思い出したのが、「〜下」という意味でよく使う sub- という接頭辞。
そこから思い出したのが以下のもので、1mm未満という意味になる。
> http://ejje.weblio.jp/content/submillimeter
submillimeter

ということで「0.1mm単位(1mm未満の単位)でそのdeviceをノギスで計測せよ」というのは、以下で言えるかもしれない。

> Measure the device with the Vernier scale, submillimeter by submillimter.
PythonのContext Managerの使い方

Context Managerとは
===================

Pythonの`with`ブロックだけで行う処理を定義する際に利用する．

例:

`with`ブロックなし

```py
f = open('hoge.txt', 'w')
f.write('hoge\n')
f.close()
```

`with`ブロックあり

```py
with open('hoge.txt', 'w') as f:
    f.write('hoge\n')
```


実装例
=====

paramikoパッケージを使って，`with`ブロック内のみでサーバーに接続

```py
import os
from contextlib import contextmanager

import paramiko


def connect_ssh(host, username=None, password=None):
    return _connect_ssh_context(host, username, password)


@contextmanager
def _connect_ssh_context(host, username, password):
    try:
        # 前処理
        ssh = paramiko.SSHClient()
        ssh.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
        ssh.connect(host, username=username, password=password)
        yield ssh  # asで受け取りたい変数
    finally:
        # 後処理
        ssh.close()
```

```py
with connect_ssh('server', 'username') as f:
    _, stdout, stderr = f.exec_command('ls')
    print(stdout.read())
```
Usage of git-svn

svn for git user. git-svn is tool to use git as svn client.

Official Documentation
----------------------

-   <https://git=scm.com/book/en/v1/Git=and=Other=Systems=Git=and=Subversion>
-   <http://git=scm.com/docs/git=svn>

Installation
------------

### Linux

``` {.sourceCode .sh}
$ sudo apt-get install git-svn
```

### Mac OS X

``` {.sourceCode .sh}
$ brew install git
```

Clone svn repository
--------------------

``` {.sourceCode .sh}
$ git svn clone svn+ssh://user@server.com/home/user/svn/trunk/abc/def def
```

Commit
------

``` {.sourceCode .sh}
$ git commit -am "commit this"
```

SVN Commit by git-svn
---------------------

``` {.sourceCode .sh}
$ git svn dcommit
```
Use Old Github Header

Use Old GitHub Header
=====================

Motivation
----------

**before**

![image2.png](https://qiita-image-store.s3.amazonaws.com/0/40686/7a81185b-5609-33a0-4da8-c5fbefd60761.png)


**after**

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/40686/25cf741c-c25d-4a1a-a1a4-f770d984a3d8.png)


How To
------

1.  Download

``` {.sourceCode .sh}
git clone https://github.com/itchyny/github-better-header ~/Documents/github-better-header
```

2.  Setup Chrome Extention

![image0.png](https://qiita-image-store.s3.amazonaws.com/0/40686/11bc8858-9668-3b03-5b08-d30b7cb8f06b.png)

Caution
-------

Don't remove donloaded repository to keep using the extention.
Image Processing with Python Environment Setup for Windows



## OpenCVのインストール  
* [OpenCVのダウンロードページ](http://opencv.org/downloads.html)より__OpenCV for Windows__をダウンロード。
* ダウンロードしたインストーラを実行。
* `opencv`フォルダがインストーラと同じフォルダに展開されるため、そのフォルダをCドライブ直下(`C:\`)へ移動させる。(例: `mv /cygdrive/c/Users/navi/Downloads/opencv /cygdrive/c/`)
* `C:\opencv\build\python\2.7\x86\cv2.pyd`を`C:\Python2.7\Lib\site-packages\`へコピーする。(例:`cp /cygdrive/c/opencv/build/python/2.7/x86/cv2.pyd /cygdrive/c/Python2.7/Lib/site-packages/`)

## PILのインストール  
* [PILのダウンロードページ](http://www.pythonware.com/products/pil/)より__Python Imaging Library X.X.X for Python 2.7をダウンロード。
* ダウンロードしたインストーラを実行。

## 参考  
* [Python for Windows インストールメモ](http://www.aoki.ecei.tohoku.ac.jp/~ito/python_windows.html)
Python Environment Setup for Windows

以下がWindowsでの環境準備で最も簡単だと思われる方法です。

## 環境
* Windows7 64bit

## インストーラによるPythonのインストール
Cygwinを入れて、`apt-cyg`, `easy_install`, `pip`で全てパッケージ管理しようとするのが自然だとは思いますが、その方法では上手くいきませんでした。(`theano`を`import`する際にエラー)
Pythonはインストーラでインストールする必要があるようです。

1. https://www.python.org/downloads/ よりインストーラをダウンロード。
1. ダウンロードしたインストーラを実行。
1. `PATH`として`C:\Python27;C:\Python27\Scripts;`を設定。(参考: [Windows 環境変数 Path の設定方法](http://next.matrix.jp/config-path-win7.html))

## easy_instalのインストール  
1. https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py より`ez_setup.py`をダウンロード。
1. コマンドプロンプトを開き、`ez_setup.py`をダウンロードしたフォルダまで移動。
1. `python ez_setup.py`を実行。(`easy_install.exe`は上でPATHに設定した`C:\Python27\Scripts`にインストールされます)

## pipのインストール

1. コマンドプロンプトを開く。
1. `easy_install pip`によって`pip`をインストール。


## インストーラによるNumpy, Scipyのインストール
`numpy`, `scipy`はインストーラからインストールしましょう。

1. http://sourceforge.net/projects/numpy/files/NumPy/ よりNumpyの最新のインストーラをダウンロード。
1. http://sourceforge.net/projects/scipy/files/scipy/ よりScipyの最新のインストーラをダウンロード。
1. ダウンロードしたインストーラを実行。


## pipによるTheanoのインストール
`theano`は`pip`でインストール可能です。

1. コマンドプロンプトで`pip install Theano`によってTheanoをインストール。


## MinGWのインストール
`g++`など必要なコマンドをインストールする。

1. http://sourceforge.net/projects/mingw/ からインストーラをダウンロード。
1. ダウンロードしたインストーラを実行し、mingwXX-baseとmingwXX-gcc-g++をインストール。
1. PATHに`C:\MinGW\bin`を追加。(上記と合わせて`C:\Python27;C:\Python27\Scripts;C:\MinGW\bin;`になるはず)


## zlib1.dllのインストール
`theano`の`import`時にない場合エラーとなるのでzlib1.dllをシステムに追加する。

1. http://jp.dll-files.com/zlib1.dll.html よりFix-1-Free DLL-Files Fixerのインストーラをダウンロード。(Free版を選択することに注意)
1. ダウンロードしたインストーラを実行。
1. Fix-1-Free DLL-Files Fixerを実行する。(zlib1.dllがインストールされる)
1. Fix-1-Free DLL-Files Fixerのアンインストーラを実行し、アンインストールする。


## Cygwinのインストールと環境準備

1. https://cygwin.com/install.html よりインストーラをダウンロード。
1. ダウンロードしたインストーラを実行。
1. インストール途中でコマンドのインストールを尋ねられるので、このときに`wget`と`svn`をインストール。(検索ボックスで`wget`, `subversion`と検索するとよい)
1. https://code.google.com/p/apt-cyg/ にあるように、`svn --force export http://apt-cyg.googlecode.com/svn/trunk/ /bin/`, `chmod +x /bin/apt-cyg`を実行。
5. 必要なコマンドをインストールする。(例: `apt-cyg install vim`)
6. コマンドのインストール中に`python`がインストールされてしまった場合は、`apt-cyg remove python`で削除する。(インストーラでインストールしたものを使用するため)
Build ARToolkit on OS X 10.9

Build ARToolkit on Mac OSX 10.9
===

Download ARToolkit
---
* Download `ARToolKit-XXX.tgz` from [here](http://sourceforge.net/project/showfiles.php?group_id=116280)

Run Configure
---

* Open `ARToolkit.xcodeproj`.
* Select `Product > Scheme > Configure`.
* Build Settings:
  * Select `Architectures: 32-bit Intel (i386)`.
  * Select `Base SDK: OS X 10.9`.
  * Select `Build Active Architecture Only: Yes`.
* Info:
  * Select `OS X Deployment Target: 10.9`.
* Build.


Run Test
---

* Connect USB camera.
* Select `Product > Scheme > simpleTest`.
* Build.
Generate gh-pages with sphinx

Generate gh-pages
---
```sh
$ cd repo
$ git checkout --orphan gh-pages
$ git rm -rf .
$ echo "First commit" > index.html
$ git add .
$ git commit -m "Just to create the branch."
$ git push origin gh-pages
```

Run sphinx-quickstart
---
```sh
$ git checkout master
$ sphinx-quickstart # in second option you should say yes
```

Add build target
---
Add below in Makefile.

```mf
GH_PAGES_SOURCES = source code wiki Makefile

...

gh-pages:
    git checkout gh-pages
    rm -rf build _sources _static
    git checkout master $(GH_PAGES_SOURCES)
    git reset HEAD
    make html
    mv -fv build/html/* ./
    rm -rf $(GH_PAGES_SOURCES) build
    git add -A
    git ci -m "Generated gh-pages for `git log master -1 --pretty=short --abbrev-commit`" && git push origin gh-pages ; git checkout master
```


Add documents
---
```sh
$ vim source/expert_python.rst
$ make gh-pages
```

Reference
---
http://blog.nikhilism.com/2012/08/automatic-github-pages-generation-from.html
Web開発のためのVirtualbox + Ubuntu on OS Xの基本設定

# Setup ssh  
## Install openssh-server  

```
$ sudo apt-get install openssh-server
```

## .ssh directory  

```
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ touch ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
```

And you add your public key (ex. `id_rsa.pub`) to authorized_keys


# Setup ufw  
```
$ sudo ufw enable
$ sudo ufw allow 80/tcp
$ sudo ufw allow 22
```

# Setup Apache  
```
$ sudo apt-get install apache2
```

# Setup Virtualbox  
* In Network > NAT > Advanced, you add 2022 and 22 (this is just an example)
* In Network, add `Bridge Addaptor` and `eth0`
* In Display, you check 3D Accelarator
* In General, you checkout guide in full screen

# Confirm now environment  
Now you can confirm using a browser in host computer. Using ip address which appears when you type `ifconfig` in __guest__ computer. (ex. 192.168.33.56) You can check using the browser if you can connect using 80 port.
7razf/7bgzf - RAZF/BGZF compressor based on 7-zip/zopfli


## 前説
これまでcisoやdaxcrといった、PSP用のseekable compressorの再実装を行ってきた。次に着手しようと考えたのはRAZF/BGZFである。
RAZF/BGZFはバイオインフォマティクスのsamtoolsで使われる圧縮フォーマットであり、gzip拡張である。学術であることから、cisoやdaxcrよりも広く使われているだろうと想像できる。また、広く使われているgzipで展開できることも特徴である。

なお、これらの圧縮フォーマットは、実際には、PSP/バイオインフォマティクスにかぎらず、 **general purposeである** ことに留意されたい。

## BGZF
BGZFの構造は容易である。各ブロックは独立したgzipであり、エクストラフィールドとして"\0BC\x02\0"+(ブロックサイズ-1、リトルエンディアン)を記録すればよい。この数値は65535以下でなければならない。ヘッダは18バイト、フッタは8バイトであるから、圧縮後のサイズが65510以下であれば良い。

## RAZF
BGZFをランダムアクセスするには、ブロックの開始位置をgzipフィールドによらずに知る必要がある。RAZFは(cisoと同様)ファイルの一部分(今回はフッタ)を見ればブロックの開始位置を知ることができる。
RAZFはgzipのエクストラフィールドとして"RAZF\x01\x80\x00"を持つ。この0x8000はブロックサイズを示す。

オフセットの指定方法は少々トリッキーである。最初のブロック(-1ブロック)はヘッダ終了位置なので書かれておらず、次のブロック(0ブロック)以降は、大区切り( **(1LLU << 32)/block_size** )ごとに8バイト絶対オフセット、小区切りごとに大区切りからの4バイト相対オフセットを記録する(この部分、仕様書がなかったのでソースから読み取る必要があり辛かった)。
また、gzipで展開できるよう、deflate(Z_FINISH)ではなくdeflate(Z_FULL_FLUSH)を用いている特徴がある。7-zip/zopfliは仕様上Z_FULL_FLUSHを指定できないので、Z_FINISHから変換する処理が必要となる。変換する必要があるのは、deflateブロックの最終ブロックの最終フラグ解除、および再ブロックの継続である。
今回は、Z_FINISHなブロックを一旦展開しなおし、この2つのオフセットを取得することに成功した(7razf_testdecode.c)。

## 入手
https://github.com/cielavenir/7razf

## 余談

オプションパーサはpoptを使用。非コピーレフトで、かつgetoptぐらい強力。最近開発が止まっているようなので適当に直した。
(getopt使った結果ファイルごとにライセンスが分断されたソフト、いくつも見てるので)
Rails validationエラーの調査


Rspec実行時に
「ActiveRecord::RecordInvalid: バリデーションに失敗しました」
となったときの調査方法。

before_validationを用意してその中でbinding.pryを呼んでバリデーションエラーになった値を確認。

```ruby:
before_validation do
binding.pry
end
```
優先権主張まとめ

個人用まとめ。

| 先の出願 | 後の出願 | 優先権の種類 |
|:-----------:|:------------:|:------------|
| 国内出願 | 国内出願 | 国内優先権 |
| 国内出願 | 国際出願 | 国内優先権(自己指定、PCT8条(2)(b)) |
| 国際出願 | 国内出願 | 国内優先権 / パリ優先権(出願人選択) |
| 国際出願 | 国際出願 | パリ優先権 |
| 外国出願 | 国内出願 | パリ優先権 |
| 外国出願 | 国際出願 | パリ優先権 |

* 国際出願は指定国に日本国を含むものとする。
* 国際出願は出願の束なので、指定国に日本国を含む国際出願を基礎とした国内出願を考えると、国際出願にかかる日本国の出願を基礎とすれば後の出願は国内優先権を主張できるし、それ以外の指定国の出願を基礎とすれば後の出願はパリ優先権を主張できる。