OmniAICreator/Qiita-1.07M huggingface dataset:
オフラインリアルタイムどう書く E05 に出した問題の実装例(ruby, C11)

問題 http://nabetani.sakura.ne.jp/hena/orde05dokitruck/
実装リンク集 http://qiita.com/Nabetani/items/c516875b13a4d282affe
です。

で。

実装方針はいくつかあって。

* 右から行くか、左から行くか。
* ひとつひとつ行くか、一気に行くか。
* データを何で持つか

辺りで自由に選べるつもり。

私は、後ろから、一気に計算して、データはビット。

まずは、C11かC99 ぐらいによる実装：

```c
// clang -std=c11 -Wall
// clang x86_64-apple-darwin15.5.0
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <memory.h>

char * build_ans( int s )
{
  char * r = calloc(4, 1);
  for( int i=0 ; i<3 ; ++i ){
    if ( s&(1<<i) ){
      strcat( r, (char[2]){'a'+i});
    }
  }
  if ( !*r ){
    r[0]='-';
  }
  return r;
}

char * solve( char const * src )
{
  int s=7;
  for( char const * it = src + strlen( src ) -1 ; src<=it ; --it ){
    switch(*it-'0'){
    case 1: s|=s/2; break;
    case 2: s|=(s&2)*2+!!(s&4); break;
    case 3: s|=!!(s&4)+(s&1)*2; break;
    case 4: s|=s*2; break;
    case 5: s|=(s&1)*4+(s&4)/2; break;
    case 6: s|=(s&1)*4+!!(s&2); break;
    case 7: s&=5; break;
    case 8: s&=6; break;
    case 9: s&=3; break;
    }
  }
  return build_ans(s);
}

void test( char const * src, char const * expected )
{
  char const * actual = solve( src );
  bool okay = 0==strcmp( actual, expected );
  printf( "%s %s->%s ( e:%s )\n", ( okay ? "ok" : "**NG**" ), src, actual , expected );
  free( actual );
}

int main()
{
  /*0*/ test( "1728398", "bc" );    
  // 略
  /*36*/ test( "697535114542", "ac" );
  return 0;
}
```

いつも通り、テストデータの大半は省略。

状態は生死の二種類が3個なので、3bit で表現すれば良い。
生を 1 にしたので、「`&=`」で死をもたらし、「`|=`」が生きる可能性を増やしている。

`solve` の中がごちゃごちゃしているけど、コースを構成するブロックのごちゃごちゃ具合を表現しているので仕方ない。
データで持てればかっこいいけど、今回はコードで表現している。
念の為に書いておくと「`!!`」は、論理否定二回で、 0 以外を 1 にするという趣旨の計算を意味している。

全く同じ趣旨の計算を ruby で書いたものが以下。というか、先に ruby で書いていた。

```ruby
def apply( s, c )
  case c
  when "0";    s
  when "1";    s | s[1] | s[2]*2
  when "2";    s | s[1]*4 | s[2]
  when "3";    s | s[0]*2 | s[2]
  when "4";    s | s[0]*2 | s[1]*4
  when "5";    s | s[0]*4 | s[2]*2
  when "6";    s | s[0]*4 | s[1]
  when "7";    s & 5
  when "8";    s & 6
  when "9";    s & 3
  end
end

def solve( src )
  r=src.chars.reverse.inject(7) do |s,c|
    apply( s, c )
  end
  %w( a b c ).each.with_index(0).map{ |c,ix|
    r[ix]==0 ? "" : c
  }.join.tap{ |x| return x.empty? ? "-" : x }
end

$stdout.sync=true

DATA.map do |line|
  num, src, expected = line.split(/\s+/)
  actual = solve( src )
  okay = actual==expected
  puts( "%s %2d %s->%s ( e:%s )" % [ ( okay ? "ok" : "**NG**" ), num, src, actual, expected ] )
  okay
end.all?.tap{|x| puts( x ? "everything is ok" : "something wrong" ) }

__END__
0 1728398 bc  
1 789 - 
2 274 ac  
3 185 abc 

36  697535114542  ac  
```
bit 演算すら、ruby の方が楽に書ける。
Intent-Filterでpathありとpathなしを一瞬で見分ける方法

AndroidManifest.xmlでschemeとhostを指定するとき、
`myapp://myhost/mypath` と `myapp://myhost` を見分けるのに地味に困りました。

この問題は正規表現で一発解決しました。

「myapp://myhost/mypath」

```
    <intent-filter>
         <action android:name="android.intent.action.VIEW" />
         <category android:name="android.intent.category.DEFAULT" />
         <data
             android:host="myhost"
             android:pathPattern="mypath"
             android:scheme="myapp" />
    </intent-filter>
```


「myapp://myhost」

```
    <intent-filter>
         <action android:name="android.intent.action.VIEW" />
         <category android:name="android.intent.category.DEFAULT" />
         <data
             android:host="myhost"
             android:scheme="myapp" />
    </intent-filter>
```
↑ これだと`myapp://myhost/mypath` と `myapp://myhost` の両方に反応してしまう。


```
    <intent-filter>
         <action android:name="android.intent.action.VIEW" />
         <category android:name="android.intent.category.DEFAULT" />
         <data
             android:host="myhost"
             android:pathPattern="\s"
             android:scheme="myapp" />
    </intent-filter>
```
↑ そこで空文字を表す正規表現の`\s`を使うと`myapp://myhost` にしか反応しなくなる。

これでRESTFULなスキーマにも対応できる。
dvipdfmxでepsが入ったdviファイルをPDFに変換できない

# 症状
epsが入ったdviファイルがPDFに変換できない。

# 環境
TeXインストーラ3 0.84でWindows 10(64bit)にTeX環境をインストール

# 原因
原因は不明(dvipdfmx周りでこけている)
同じインストーラで別のPC(Windows 10(64bit))では動作（中のコンポーネントのバージョンは未確認）

# 対策
C:\w32tex\share\texmf-dist\dvipdfmx\config\dvipdfmx.cfgを編集
(C:\w32texはインストール先)

```shell-session
%% GhostScript (Windows):
D "rungs -q -dNOPAUSE -dBATCH -dEPSCrop -sPAPERSIZE=a0 -sDEVICE=pdfwrite -dAutoRotatePages=/None -dCompatibilityLevel=%v -dAutoFilterGrayImages=false -dAutoFilterColorImages=false -dGrayImageFilter=/FlateEncode -dColorImageFilter=/FlateEncode -dUseFlateCompression=true -sOutputFile='%o' -c .setpdfwrite -f '%i' -c quit"
```

上記部分のrungsをGhostscriptをインストールし、書き換える。

```shell-session
%% GhostScript (Windows):
D "C:/gs/gs9.19/bin/gswin64c -q -dNOPAUSE -dBATCH -dEPSCrop -sPAPERSIZE=a0 -sDEVICE=pdfwrite -dAutoRotatePages=/None -dCompatibilityLevel=%v -dAutoFilterGrayImages=false -dAutoFilterColorImages=false -dGrayImageFilter=/FlateEncode -dColorImageFilter=/FlateEncode -dUseFlateCompression=true -sOutputFile='%o' -c .setpdfwrite -f '%i' -c quit"
```
reserve を使ってホットリロードしながらWebアプリを開発する方法

[reserve](https://github.com/sol/reserve) というツールを使うとHaskellでホットリロードしながらWebアプリを開発することが出来ます。

インストールは

```bash
$ git clone git@github.com:sol/reserve.git
$ cd reserve
$ cabal sandbox init
$ cabal install --only-dependencies
$ cabal build
```

とすると`./dist/build/reserve/`に`reserve`というバイナリが出来あがります。使い方は簡単で[公式のREADME](https://github.com/sol/reserve#examples)がとても参考になります。
ここではStackと一緒に使う方法を紹介します。試しに以下の様なプロジェクトを作ります。

```bash
$ stack new web-app
```

```yaml:web-app.cabal
name:                web-app
version:             0.1.0.0

executable web-app-exe
  hs-source-dirs:      app
  main-is:             Main.hs
  ghc-options:         -threaded -rtsopts -with-rtsopts=-N
  build-depends:       base
                     , scotty
  default-language:    Haskell2010
```

```hs:app/Main.hs
{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty

main :: IO ()
main = scotty 3000 $ do
  get "/" $ do
    text "hello\n"
```

次のように実行します

```bash
$ stack exec -- ../reserve/dist/build/reserve/reserve app/Main.hs
http://localhost:12000
```

これで<http://localhost:12000>にアクセスすると`hello`と表示されると思います。この状態でアプリを落とさずにファイルを以下のように変更してみましょう。

```diff
main = scotty 3000 $ do
   get "/" $ do
     text "hello\n"
+  get "/hello" $ do
+    text "world\n"

```

そして<http://localhost:12000/hello>にアクセスするとちゃんと`world`と表示されると思います。
【MT】MovableTypeのサーバー移行手順

#はじめに

MovableType6を別のサーバーに移行したときの手順です。
移行先のサーバーは、別のドメインですが、同じレンタルサーバー同じプランです。
移行前と移行先では同じデータベース（MySQL5.5）を使用しております。

MTには標準でエクスポート・インポート機能などがありますが、うまくいかないことが多いので使用しません。
データをガバッと移行する方法です。
この方法が一番問題なく移行できると思います。
<ins>必ず事前にバックアップを取って、自己責任でお願いします。</ins>

#手順1 サーバーにあるデータを移行

FTPで移行前のサーバーにあるデータをダウンロードし、移行先のサーバーへアップロードします。
ダウンロードまたはアップロードするときに、漏れるファイルがあるとこの先エラーが表示されます。
個人的には2～3回ダウンロードとアップロードを繰り返して漏れがないようにしておく方が無難です。

#手順2 移行前のデータベースをエクスポートして書き換え

移行前のデータベースのデータをエクスポートします。
phpMyAdminが利用できるので、phpMyAdminのエクスポートを選択し実行すると、○○○.sqlというファイルがダウンロードされます。
このファイルをテキストエディタで開きます。
Windowsにデフォルトで入っているメモ帳は使わないでください。
秀丸などのテキストエディタを使用してください。
ファイルを開くと様々なところに移行前の**ドメイン**や**フルパス**が記述されているので、全て移行先の情報に書き換えます。
テキストエディタだと置換機能があるので一括で書き換え可能です。

#手順3 移行先のデーターベースへインポート

移行先のデータベースに先ほど書き換えた○○○.sqlのファイルをインポートします。
移行先でもphpMyAdminを利用し、インポートしました。
サーバーによっては、インポートの上限サイズがあります。
○○○.sqlのファイルの容量が上限を超えているときは、zip形式などに圧縮するとインポートできます。

#手順4 MovableTypeの初期設定

手順1のアップロードのときにMT関連のファイルもアップロードしました。
アップロードしたMTディレクトリ直下にあるcgiファイルのパーミッションは`700`など適宜設定してください。
アップロードしたcgiファイルの中に`mt-config.cgi`のファイルが含まれています。
このファイルに移行前のデータベースの情報などが書かれているので、このファイルを削除します。
ブラウザから移行先のMTの管理画面へアクセスします。
初期設定のウィザードが表示されますので、ユーザー名やパスワードなどを入力してください。
データベースの情報も入力する必要があります。
移行先のデータベースの情報を入力してください。
ログインすると移行完了です。

#エラーが表示されるときは

過去に発生したエラーを下記に記載しておりますので、ご覧ください。

+ [【MT】MovableTypeのサーバー移行時のトラブルと対処法](http://qiita.com/4cres/items/82d16647581f5e5ffe3e)
UnityでVRジェットコースターを爆速で作る方法 


こんにちは、この記事ではUnityでVRジェットコースターを作る手順を紹介します。

# 手順

0. Switch Platform でiOSに変える。
1. [ジェットコースターのAsset](http://u3d.as/jzG)をダウンロードする。($6)
2. [Dive_Plugin_2.1.5.unitypackage](https://www.durovis.com/sdk.html) をインポートする。
3. Cameraの子供にDive_Cameraを入れる

これでプロジェクトは完成です。

↓ ここからダウンロード

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/816e273c-5e32-08b1-1fdd-41885218b8c5.png)


次は実際にVRを行うための準備です。

1. [Soyan VIRTUAL REALITY VR 3Dグラスメガネセット](https://www.amazon.co.jp/Soyan-VIRTUAL-REALITY-VR-3D%E3%82%B0%E3%83%A9%E3%82%B9%E3%83%A1%E3%82%AC%E3%83%8D%E3%82%BB%E3%83%83%E3%83%88%EF%BC%96%E3%82%A4%E3%83%B3%E3%83%81%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%82%B9%E3%83%9E%E3%83%9B%E7%94%A8-%E3%83%97%E3%83%A9%E3%82%B9%E3%83%81%E3%83%83%E3%82%AF%E8%A3%BD/dp/B00WEKUTDW)をポチる
2. iOS用にビルドする。
3. XcodeでBuildする。

しかしここでエラーが出る...

VRのAssetを使ってiOS用にビルドすると出るらしい。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/07af54e4-8d26-5f33-ff08-da486caf1c7e.png)

解決策は2Step

1. *Build Settings*の*Enable Bitcode*を*No*にする。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/bca6eec9-47e4-3a8e-2ade-48dad4deb640.png)

2. *General*の*Linked Frameworks and Libraries*に*Security.framework*を追加する。

![image](https://qiita-image-store.s3.amazonaws.com/0/96970/7381b881-0135-0ef5-fa2d-8f7a10559f82.png)

これで完成！

こんな感じの画面になります。

![a.gif](http://i.giphy.com/3oEjI1JNAYtSJZdnbO.gif)
Amazon Linux に 最新のGit（ver.2.9）をソースからインストールする

# Gitのインストール
`yum install git`でインストールされるGitは、バージョンが古いため、最新のGitをインストールしたい場合は、ソースからGitをインストールします。

Gitの公式HP（[リンク](https://git-scm.com/book/ja/v1/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)）を参考にAmazon LinuxにGitをインストールしようとすると、下記のようにエラーがでてインストールすることができません。

```bash
# make prefix=/usr/local all
GIT_VERSION = 2.9.0
    * new build flags
    CC credential-store.o
/bin/sh: cc: command not found
make: *** [credential-store.o] Error 127

```

これは、Amazon Linuxには、Gitの公式HPで前提となっているマシンと、インストール済みのアプリが異なるためです。

# Amazon LinuxにGitをインストールする手順

**gcc**と**perl-ExtUtils-MakeMaker**をGit公式HPの記載に追加してインストールしています。

```bash
$ sudo su -
# yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
# wget https://www.kernel.org/pub/software/scm/git/git-2.9.0.tar.gz
# tar zxvf git-2.9.0.tar.gz
# cd git-2.9.0
# make prefix=/usr/local all
# make prefix=/usr/local install
# git --version
git version 2.9.0
```

ソースから最新のGit（ver.2.9）をインストールすることができました。

※ AnsibleでGitをソースからインストールする方法について書きました。
　　[Ansibleのmakeモジュールやnuarchiveモジュールを使ってGitをソースからインストールしてみる](http://qiita.com/olympic2020/items/623665d45d90a4fb1b98)
inflections で文字列と遊ぼう

[Stack Builders Inc.](https://github.com/stackbuilders)が作っている[inflections](https://github.com/stackbuilders/inflections-hs)というライブラリで遊んでみました。これはRuby on Railsの[Inflector](http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html)を参考にしつつも型安全になるように設計されたライブラリだそうです。これを使うと

```hs
> import Text.Inflections
> toDashed "FooBar"
"foo-bar"
> toUnderscore "FooBar"
"foo_bar"
> toCamelCased True "foo_bar"
"FooBar"
> toCamelCased False "foo_bar"
"fooBar"
```

このようにスネークケースとキャメルケースを変換したり

```hs
> parameterize "Hola. ¿Cómo estás?"
"hola-como-estas"
```

URLセーフな文字列に変換したり出来ます。


```hs
parseSnakeCase :: [String] -> String -> Either ParseError [Word]
parseCamelCase :: [String] -> String -> Either ParseError [Word]
```

といった関数を使えばスネークケースとキャメルケースの文字列を独自の`Word`という型に変換することが出来ます。

```hs
> parseSnakeCase [] "foo_bar"
Right [Word "foo",Word "bar"]
```

`[Word]`の値を作ると

```hs
> let Right ws = parseSnakeCase [] "foo_bar"
> camelize ws
"FooBar"
> dasherize ws
"foo-bar"
> humanize ws
"Foo bar"
> underscore ws
"foo_bar"
```

いろんな形式の文字列に変換できます。

あと地味に便利なのが`ordinal`, `ordinalize`という関数で

```hs
ordinal :: Integer -> String
ordinalize :: Integer -> String
```

```hs
> ordinal 1
"st"
> ordinal 2
"nd"
> ordinal 3
"rd"
> ordinal 4
"th"
> map ordinal [1..10]
["st","nd","rd","th","th","th","th","th","th","th"]

> ordinalize 1
"1st"
> ordinalize 2
"2nd"
> ordinalize 3
"3rd"
> ordinalize 4
"4th"
> map ordinalize [1..10]
["1st","2nd","3rd","4th","5th","6th","7th","8th","9th","10th"]
```

この様に数字に序数標識をつけた文字列を返してくれます。
オフラインリアルタイムどう書くE05 の問題


オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/46668 )を行っています。

問題は「どきどきトロッコ」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/orde05dokitruck/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間あればなんとかなると思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
Docker swarm mode お試し環境を Vagrantで作る(CentOS7)


docker swarm mode を試すには
docker 1.12RCのインストール、
Firewallへの穴あけが必要なのでサクッと作る。
vagrantでログインすればdockerが使えます。

sshのポートとかは個人の好みです。

あらかじめCentOS7のboxを用意しておきましょう。
(ここではcent7という名前で用意されている前提で書いています)


Vagrantfile

```ruby
Vagrant.configure(2) do |config|
  @docker=<<-EOL
  curl -fsSL https://test.docker.com/ | sh
  sudo usermod -g docker vagrant
  sudo systemctl enable docker
  sudo systemctl start docker
  sudo firewall-cmd --add-port=2377/tcp --permanent
  sudo firewall-cmd --add-port=7496/tcp --permanent
  sudo firewall-cmd --add-port=7496/udp --permanent
  sudo firewall-cmd --add-port=4789/tcp --permanent
  sudo firewall-cmd --add-port=4789/udp --permanent
  sudo firewall-cmd --reload
  EOL

  (1..3).each do |i|
    config.vm.define "node-0#{i}" do |box|
      box.vm.box = "cent7"
      box.vm.hostname= "node-0#{i}"
      box.vm.network "private_network", ip: "192.168.56.#{i}0"
      box.vm.network :forwarded_port, id:"ssh",guest:22, host:2200+i
      box.vm.provision "shell", inline: @docker
    end
  end
end
```

http://qiita.com/zembutsu/items/6fb6eface38d62b3584d

このチュートリアルが試したければ、

`sudo firewall-cmd --add-port`
が並んでいるあたりに
`sudo firewall-cmd --add-service=http --permanent`
を追加しましょう。
Win10でNTFSのLFSをWin7に合わせる

####対象
USBメモリ・USB-SSD等 NTFSフォーマットされた記憶媒体

###症状
「Win7でNTFSフォーマットにて使用していたUSBメモリ」等をWin10で利用すると、再度Win7で使用した際にファイルが消失する。

###原因
NTFSボリュームのログファイルバージョン(LFS)が、Win8以降で変更されたため。
<pre>
Win7     LFS Ver.1.1
Win8, 10 LFS Ver.2.0
</pre>
Win7では LFS Ver2.0 が認識できないためエラーが発生し、自動的にエラーの回復（chkdsk）を試みる。
その際にファイルシステムが破壊される。

###解決策 1
・ファイルシステムをexFATに変換する。


###解決策2
・Win10でも、LFS Ver.1.1 で使用するようにレジストリを変更をする。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemに
"NtfsDisableLfsUpgrade"を追加し、dword値を 1 にする。
LFSのバージョンを元に戻すには "NtfsDisableLfsUpgrade" ごと削除する。
UnityのネイティブコードをSwiftで書こうとした時にはまったこと


# 内容

Unityで一部の処理をiOSのネイティブコードで書きたい時があるかと思います。
尚且つiOSであるならばSwiftで書きたいということもあるかと思います。
その時に実際にやってみてはまったことを書き残します。


私の場合はUnityアプリケーション上で動くWebカメラではなく、iOSのAVFoundationライブラリ使ってカメラモジュールを動かしバーコードの読み取りを行いたいという時にここの箇所をSwiftで書ければなぁ...ということがありました。

# ネイティブコードを書いてみて呼び出してみよう！

## サンプルコード

先にC#上で外部のファイルを呼び出す処理について記載します。
C#には[DllImport属性](https://msdn.microsoft.com/ja-jp/library/aa288468(v=vs.71).aspx)を指定することで外部のdllを読み込むことができ、
[extern修飾子](https://msdn.microsoft.com/ja-jp/library/e59b22c5.aspx)というのでネイティブコード上のメソッドや変数を指定します。

下記はネイティブコードを呼び出すためにC#で記載したクラスファイルです。

``` HogeClass.cs
using UnityEngine;
using System.Runtime.InteropServices;

public class HogeClass {
    [DllImport("__Internal")]    // Unityで提供されているネイティブプラグイン
	private static extern void hogeMethod_ ();    // ネイティブコード上のメソッド

	public static void hogeMethod () {
		if (Application.platform != RuntimePlatform.OSXEditor) {
			hogeMethod_ ();    // ネイティブコード上のメソッドを呼び出す
		}
    }
}
```

ただしC#から直接Swiftのコードを読み込むことができないため
Objective-Cで記載したコードを経由してSwiftのコードを読みに行きましょう。

``` HogeClass.mm
#import <UIKit/UIKit.h>
#import <[Unityのプロジェクト名]-Swift.h>

extern "C"{
    void hogeMethod_() {
         [HogeClass hogeMethod];    // Swiftのメソッドを呼び出す
    }
}
```

ここの

```
#import <[Unityのプロジェクト名]-Swift.h>
```

ですが
Objective-C Generated Interface Header Name
に記載されているのを指定してあげてください。

![スクリーンショット 2016-07-02 15.13.12.png](https://qiita-image-store.s3.amazonaws.com/0/89599/01cb0bc1-abb4-e2a5-4381-d0a767524116.png)

[Unityのプロジェクト名]-Swift.hの生成方法ですが
下記にまとめて記載します。（今回一番はまったところです。）


いよいよSwiftのコードの記載です。


``` HogeClass.swift
import UIKit

public class HogeClass: NSObject {
    public class func hogeMethod() {
        print("hoge")    // Xcodeのコンソール上にhogeと表示させる
    }
}

```

これでSwiftのコードを読み込むためのコーディング完了です。

## [Unityのプロジェクト名]-Swift.hの生成方法

Embedded Content Contains Swift Code　というとこをYesにすることでSwiftのコードがヘッダファイルとして生成されます。

![スクリーンショット 2016-07-02 16.11.18.png](https://qiita-image-store.s3.amazonaws.com/0/89599/be175d76-2098-8467-942c-80a92a9b0e78.png)

あとObjective-CからSwiftを呼びだそうとすると

```
dyld: Library not loaded: @rpath/libswiftCore.dylib
Referenced from: /private/var/mobile/Containers/Bundle/Application/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/App-Name.app/App-Name
Reason: image not found
```

というエラーが出てきてしまいます。
これの解決方法としてRunpath Search Pathに@executable_path/Frameworksを追加してあげることでUnity上でObjective-Cを経由しながらSwiftの処理を動かすことができるようになります。

![スクリーンショット 2016-07-02 16.22.18.png](https://qiita-image-store.s3.amazonaws.com/0/89599/8df3f487-057a-cf85-5dfb-31345026d759.png)


# 参考リンク
KAKELOG / Unity iOS のネイティブプラグインを Swift で書いた
http://blog.kakeragames.com/2016/05/07/unity-swift.html
Objective-cからSwiftを呼び出す方法
http://qiita.com/syou007/items/b0c54d795d63fb84de72
UnityのスクリプトからのiOSのネイティブプラグインとのやりとり
http://qiita.com/tyfkda/items/dc5da219d22cc55de301
Swiftで書かれたiOSアプリを実機デバッグ実行時に「image not found」エラーとなる場合の対処
http://raimon49.github.io/2016/03/20/error-at-swift-app-with-ios-device.html
テラシュールブログ / 
UnityのC#からネイティブプラグインを経由せずObjective-Cのコードを呼び出す
http://tsubakit1.hateblo.jp/entry/2014/08/14/022012
GitHub初心者が１人でコンフリクトの解決を試してみた（後編）


## １人でコンフリクトを起こせたよ！
[前編](http://qiita.com/DesignChips/items/fb1637fbac4ae6969d8a "前編")では、ローカルに複数のリポジトリを作成してコンフリクトを発生させました。今回はこの競合をなんとか解決してみます。

## やり方
私が試してうまくいった方法です。

1. GitHub のメッセージを確認する
2. repo2でリモートの最新情報を取得する
3. コンフリクトを確認する
4. コンフリクトを解決する
5. プッシュ

### 1. GitHub のメッセージを確認する
![スクリーンショット 2016-07-02 16.04.43.png](https://qiita-image-store.s3.amazonaws.com/0/130741/e54f3b5b-0051-0d8c-6355-5c7b0073f559.png "スクリーンショット 2016-07-02 16.04.43.png")


### 2. repo2でリモートの最新情報を取得する

```
git fetch origin
git checkout -b repo3 origin/repo2
git pull origin master
```

### 3. コンフリクトを確認する
```index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
<<<<<<< HEAD
    <title>repo2で変更</title>
=======
    <title>repo1で変更</title>
>>>>>>> fd8288737f01811db08acc272912e88daa83c84b
</head>
<body>

</body>
</html>
```

### 4. コンフリクトを解決する
```index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>repo2で変更</title>
</head>
<body>

</body>
</html>
```

```
git add 
git commit -m "コンフリクトを解決"
git checkout master
git merge repo3
```

### 5. プッシュ
```
git push origin master
```

![スクリーンショット 2016-07-02 16.17.40.png](https://qiita-image-store.s3.amazonaws.com/0/130741/f811513c-c225-9e04-d798-22de5379b6a0.png "スクリーンショット 2016-07-02 16.17.40.png")


## まとめ

コンフリクト自体は解決しました。が、たぶん正しい方法ではないと思います。なぜかGitHub のステップに従っても解決しませんでした。

もっと、きれいに解決できる方法があったら教えてください。
Python and numpy tips

Python関連のtipsを，一つ一つ記事にするのは細かすぎるので，ここにまとめておく．

# Algorithm

## Unique

あるシーケンスについて，ユニークな要素のみを持つシーケンスを作る．
下記コードは[Stack OverFlow](http://stackoverflow.com/a/20787336/1950104)より:

```py
def uniquify(seq):
    seen = set()
    seen_add = seen.add
    return [x for x in seq if x not in seen and not seen_add(x)]
```
[[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](https://wandbox.org/permlink/pH0wRzIXfvVee3O9)

これはおもしろい．束縛されたメソッドだけ触ることができるんだな．

### 参考情報

- [Python Tips：リストから重複した要素を削除したい - Life with Python](http://www.lifewithpython.com/2013/11/python-remove-duplicates-from-lists.html "Python Tips：リストから重複した要素を削除したい - Life with Python")
- [In Python, what is the fastest algorithm for removing duplicates from a list so that all elements are unique *while preserving order*? - Stack Overflow](http://stackoverflow.com/a/20787336/1950104)

## Split

あるシーケンスから，長さnずつに区切ったシーケンスを作る．
下記コードは[ココ](http://blog.hmm.jp/entry/split-list-into-sublist)を参考に:

```py
l = 10
n = 4

zip(*[iter(range(l))]*n)

import itertools
itertools.izip_longest(*[iter(range(l))]*n)

import more_itertools
more_itertools.chunked(range(l), n)
```
[[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](https://wandbox.org/permlink/c9qBalyK7nP8Pegy)

### 参考情報

- [リストをn個ずつのサブリストに分割 (Python) - おぎろぐはてブロ](http://blog.hmm.jp/entry/split-list-into-sublist "リストをn個ずつのサブリストに分割 (Python) - おぎろぐはてブロ")

## Once

ある関数を何度も呼び出したとしても，最初の一回のみその処理を行う．

```py
def run_once(f):
    def wrapper(*args, **kwargs):
        if not wrapper.has_run:
            wrapper.has_run = True
            return f(*args, **kwargs)
    wrapper.has_run = False
    return wrapper

@run_once
def greeting():
    print('Hello.')

greeting()
greeting()
greeting()
```

[[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](https://wandbox.org/permlink/n3hmS7dqGWqTdFmJ)

並列呼び出しの場合は排他的処理が必要になるだろう．上のコードはこれを考慮していない．
そのため，このコードはバッドノウハウとなっている気がする．

TODO: 要改善

### 参考情報

- [python - Efficient way of having a function only execute once in a loop - Stack Overflow](http://stackoverflow.com/questions/4103773/efficient-way-of-having-a-function-only-execute-once-in-a-loop "python - Efficient way of having a function only execute once in a loop - Stack Overflow")

## Reversed numpy.cumsum
wpa_supplicant の 4 way handshake (STA側) を読む

wpa_supplicantの動作を理解するためにソースコードを調査しました。

今回はWPAの特徴的な鍵交換のシーケンスである4 way handshakeを行っている部分のデータの流れを調査しました。

# まとめ
* 4way handshakeの処理は src/rsn_supp/wpa.cに実装されている。
* wpa_supplicantでは、ドライバから、wpa_supplicant_rx_eapol()を呼ぶことでEAPOLパケットを受信する。
* 受信したEAPOLパケットを処理し、WPAの鍵情報を取り出し、パケットを作成し、l2_packet_send()でパケットを送信する。
* ドライバとしては、パケットの受信、パケットの送信、暗号鍵の設定の APIを使う。

# 調査対象
* wpa_supplicant 2.5 のソースコード
* https://w1.fi/wpa_supplicant/
* WPAのSTA側 4Way handshakeの部分


# 4wayの１番めのパケットの受信 から 4wayの２番めのパケットの送信
* Association完了後にAPから4wayの１番めのパケットをSTAに送信する。
* ドライバは受信したパケットをwpa_supplicant_rx_eapol()でwpa_supplicantに渡す。
* wpa_sm_rx_eapol() で下記の処理をする。
 * wpa_supplicant_verify_eapol_key_mic()でMICをチェック
 * wpa_supplicant_decrypt_key_data()で鍵データを復号
 * - HMAC_MD5_RC4 ならrc4_skip()
 * - HMAC_SHA1_AESならaes_unwrap()
 * wpa_supplicant_process_1_of_4()
 * - wpa_supplicant_get_pmk()でPMKを取得
 * - wpa_derive_ptk()でPTKを計算
 * - wpa_supplicant_send_2_of_4()で２番めのパケットを送信
 * - wpa_eapol_key_send() でeapolパケットを送信
 * - wpa_sm_ether_send()
 * - wpa_sm->ctx->ether_send()
 * - wpa_ether_send()
 * - l2_packet_send() でドライバに送信

# 4wayの３番めのパケットの受信 から 4wayの４番めのパケットの送信
* wpa_sm_rx_eapol()の途中までは上と同じ
* wpa_supplicant_process_3_of_4()
 * wpa_eapol_key_send() で4番めのパケットを送信
 * wpa_sm_ether_send()
 * wpa_sm->ctx->ether_send()
 * wpa_ether_send()
 * l2_packet_send() でドライバに送信
* wpa_supplicant_install_ptk()でPTKをインストール
* wpa_sm_set_key()
* wpa_driver_wext_set_key() でドライバにPTKを設定 
* wpa_supplicant_pairwise_gtk()でGTKの交換

# よくわらないとこと
* ステートマシンの制御部分
* どのコンテキストで動作しているのか
OpenCVで文字列認識するためのDockerイメージを作った

# 作ったもの

[https://hub.docker.com/r/kaakaa/opencv-contrib-python3/](https://hub.docker.com/r/kaakaa/opencv-contrib-python3/)

# OpenCVで文字列認識

画像処理ライブラリのOpenCVで文字列認識をする場合、OpenCV Contorib[Itseez/opencv_contrib](https://github.com/Itseez/opencv_contrib)のtextモジュールを通じて[tesseract-ocr](https://github.com/tesseract-ocr)を利用するのが定番のようです。
[opencvで文字認識その１　Tesseractラッパ - whoopsidaisies's diary](http://whoopsidaisies.hatenablog.com/entry/2014/11/12/003100)

OpenCVの機能で画像中の文字列の存在する位置を特定し、その特定したそれぞれの位置に対してTesseract-ocrの文字列認識を実行する模様。

日本語を認識する場合、Tesseractで用意されている日本語トレーニングデータが使えそうです（まだ使ったことは無い）。
[tesseract-ocr の言語データ(jpn.traineddata)について（その1） - 古都のIT職人Blog](http://a244.hateblo.jp/entry/2015/08/24/001916)


日本語文字列認識ならNHocrというのもあるらしい。
[日本語OCRライブラリNHocrを利用してみる - Qiita](http://qiita.com/awakia/items/3e1c7eb7da39e64de3a6)

# OpenCV Contrib付きDockerイメージ

OpenCV自体は[公式でプリビルドバイナリが配布されていたりする](http://opencv.org/downloads.html)ので、環境構築自体はすぐにできる。

ただ、Contribのモジュールを使用する場合、公式ではバイナリが配布されておらず、さらに文字列認識を利用する場合はTesseractをインストールする必要があったりするので、自分でソースからビルドする必要がありそう。


そこら辺の手順が面倒なので、OpenCV + OpenCV Contrib + Tesseract + Python3環境付きのDockerイメージを作りました。

[https://hub.docker.com/r/kaakaa/opencv-contrib-python3/](https://hub.docker.com/r/kaakaa/opencv-contrib-python3/)
[kaakaa/docker-opencv-contrib-python3: Dockerfile for OpenCV, OpenCV contrib and Python 3.5](https://github.com/kaakaa/docker-opencv-contrib-python3)

元々、こちらのDockerイメージ[austriker/docker-opencv-contrib-python3](https://hub.docker.com/r/austriker/docker-opencv-contrib-python3/)を使おうとしましたが、Tesseractが入ってなかったので、そのあたりを修正しました。

# 試しに実行

[docker-opencv-contrib-python3/compose-sample at master · kaakaa/docker-opencv-contrib-python3](https://github.com/kaakaa/docker-opencv-contrib-python3/tree/master/compose-sample)の方に、文字列認識用のWebアプリが立ち上がるdocker-composeを用意しました。
（Webアプリとしても文字列認識としても、まだまだ使い物レベルにはならないですが）

実際に実行してみた結果が下記画面。

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/9891/4a39539e-8c03-cfb0-48bd-4b2d5dbc8dac.png)


下の画像のピンクで囲まれた部分が、OpenCVによって特定された文字列位置なのですが、画像全体として認識されてしまっているよう。
一行一行認識してほしいのですが。

そこらへんはいろいろチューニングしていく必要がありそうです。
Rubyコーディング規約


下記サイトに記載されている規約を写経
(公式ではなく、多くのRubyistが利用する規約)

[参考サイト①](http://www.loveruby.net/w/RubyCodingStyle.html)
[参考サイト②](https://shugo.net/ruby-codeconv/codeconv.html)
[参考サイト③](http://bojovs.com/2012/04/24/ruby-coding-style/)

## インデント、1行の桁数
- 基本
スペース2つ、タブはNG、一行80桁まで
- caseとwhenは揃える（case式代入時を除く）

 ```example
 	case num
 	when 1
 	  p 1
 	when 2
 	  p 2
 	else
 	  p 3
 	end
 	
 	# 代入時は揃えない(変数名の長さに依存するから)
 	num_value = case num
 	  when 1 then p 1
 	  when 2 then p 2
 	  else 3
 	  end
 ```


## シンタックス
- 下記にはスペースを記述
 - 演算子の前後(べき乗の前後を除く`**`)  
 `sum = 1 + 2`
 - カンマ、コロン、セミコロンの後ろ  
 `a, b = 1, 2`  
 `1 > 2 ? true : false; puts 'Hi'`
 - 中括弧の前後（開け閉じ両方）  
 `[1, 2, 3].each { |e| puts e }`

## 識別子
- モジュール・クラス名にはCamelCase
- 上記を含むファイル名には、メインクラスをdowncase
- 定数はCONST_NAME
- 変数やメソッドはsnake_case

## 括弧の省略
- 戻り値が無い場合は省略
-> function の呼び出しでは必ず括弧を付けて、 procedure の呼び出しでは必ず括弧を省略
 なお
 - function  - 戻り値が存在する「関数」
 - procedure - 戻り値が存在しない「手続き」
 
 ```example
 def has_arg(args) # 省略しちゃだめ
 end
 
 def not_has_arg # 省略する
 end
  ```

- 下記は例外
 - レシーバがあり、引数が存在しないときは省略
 `string.to_s`
 - 引数に*や&を含むとき  
   
   ```
   map(*args)
   map(&block)
   ```

## メソッド引数括弧の空白
入れない
(エラーになる事もある)

 ```example
 def space(arg) # OK
 end

 def space( arg ) # NG
 end
 ```
 
## クラス、メソッド、モジュールの区切りには空行を入れる
 
 ```example
 class Hoge
 	  def hoge
 	  end
 	  
      def fuga
      end
 end

 class Foga
 end
 ```
 
## 出来るだけforは避けてeachを利用

```example
# OK
arr.each { |elm| puts elm }

# elmがブロックスコープに入らないため、構文外から呼び出せる
for elm in arr do
end
```

## 3項演算子をネストしない

```example
# OK
if is_login
  is_admin_login ? true : false_1
else
	false_2
end

# う○こ
is_login ? (is_admin_login ? true : false_1) : false_2
```

## elseが無い場合は後置if/unlessを利用

```example
# OK
do_something if some_condiiton

# NG
if some_condition
	do_condiiton
end
```

## 否定に!は利用せずunlessを利用

```
# OK
do_something unless some_condition

# NG (可読性に配慮して「unless」が用意されているため)
do_something ! some_condition
```
Rubyのバージョン変更


- 利用中のRubyバージョン確認  
`$ ruby -v`
- インストール可能なRubyバージョン確認  
`$ rbenv install --list`
- 目的のバージョンをインストール  
`$ rbenv install 2.2.0`
- 現在コンソール上で利用しているRubyバージョン確認  
`$ rbenv versions`
- 全体で利用するバージョンを変更  
`$ rbenv global 2.2.0`
- 特定のディレクトリのみで利用するバージョンを変更  
`$ rbenv local 2.2.0`
- rehashしてあげる  
`$ rbenv rehash`
- rbenvのアップデート

	```
	$ brew update
	$ brew upgrade ruby-build
	$ cd ~/.rbenv/plugins/ruby-build
	$ git pull
	$ rbenv install -list
    # => 最新のバージョンが出てくる
	```
- bundleが動かない時
`gem install bundler`

追記:

プロジェクトルート直下に `.ruby-version` があれば、自動で読み込まれるため
`rbenv local 2.2.0` は必要ないです。

```
# .ruby-version
2.2.0
```
Rubyでgetsの前に記述したprint, putsが表示されない問題の対策

# Rubyの標準入力
Rubyではキーボード入力した文字を扱いたい時
getsを使います。

```rb

puts "あなたの名前は何ですか？"
name = gets.chomp
puts "私の名前は" + name + "です。"
```

しかし、私の環境が悪いのか
"あなたの名前は何ですか？" をprint, puts で表示したいのに
標準入力を求めてくるプログラム先輩(そこにしびれるry...

実行結果

```
| 　⇐返事がない、ただのカーソルのようだ
```

これを解決したためメモしたいと思います。

# 解決方法
やることは簡単
文字コーディング(coding:utf-8)のあとに
```STDOUT.sync = true```
を追加するだけ

```rb

# coding:utf-8
STDOUT.sync = true

puts "あなたの名前は何ですか？"
puts name = gets.chomp
puts "私の名前は + name + "です。"
```

実行結果

```
あなたの名前は何ですか？
Knta
私の名前はKntaです。
```
以上です。
DXLibをVSで使うための設定

#プロジェクトを作成
###新しいプロジェクトを作成
ファイル→新規作成→プロジェクト
###Win32プロジェクト作成
インストール済み→テンプレート→Visual C++→Win32→名前の設定→場所の設定→ソリューションのディレクトリを作成のチェックを外す
アプリケーション設定→ウィンドウズアプリケーション→空のプロジェクトをチェックする
#メインファイルの作成
ソースファイル→右クリック→追加→新しい項目
#プロパティーページを開く
まずはプロジェクトを右クリックして、プロパティをクリック
#設定を行う
###構成(C):すべての構成
構成プロパティ→全般→文字セットを『マルチバイト文字セットを使用する』に変更する。
構成プロパティ→C/C++→全般→追加のインクルードディレクトリにDXLibの『プロジェクトに追加すべき～』を追加する
構成プロパティ→リンカー→全般→追加のライブラリディレクトリにDXLibの『プロジェクトに追加すべき～』を追加する
###構成(C):Release
構成プロパティ→C/C++→コード生成→ランタイムライブラリを『マルチスレッド(MT)』にする
###構成(C):Debug
構成プロパティ→C/C++→コード生成→ライタイムライブラリを『マルチスレッドデバッグ(MTd)』にする
Jacksonで/(スラッシュ)をエスケープする

[RFC7159](https://tools.ietf.org/html/rfc7159)では以下をエスケープすると定義されています。

```text:RFC7159
"    quotation mark  U+0022
\    reverse solidus U+005C
/    solidus         U+002F
\b   backspace       U+0008
\f   form feed       U+000C
\n   line feed       U+000A
\r   carriage return U+000D
\t   tab             U+0009
```

しかし、Jacksonのデフォルト設定では`/`はエスケープされません。

# CharacterEscapes

Jacksonのエスケープ対象文字を制御するには [CharacterEscapes](http://fasterxml.github.io/jackson-core/javadoc/2.7/com/fasterxml/jackson/core/io/CharacterEscapes.html) を使用します。
エスケープ方法は以下の3種類があります。

1. \\(バックスラッシュ)を付与(`\/`)
2. \uXXXXフォーマット(`\u002F`)
3. 任意の内容(`あああ`など)

## 1. \\(バックスラッシュ)を付与

`CharacterEscapes#getEscapeCodesForAscii()`で返す`int[]`の`'/'`番目の要素を`'/'`にします。
`CharacterEscapes#getEscapeSequence()`の戻り値は`null`でOK.

```java
ObjectMapper mapper = new ObjectMapper();
mapper.getFactory().setCharacterEscapes(new CharacterEscapes() {

  private final int[] escapeCodes;

  {
    escapeCodes = standardAsciiEscapesForJSON();
    escapeCodes['/'] = '/';
  }

  @Override
  public int[] getEscapeCodesForAscii() {
    return escapeCodes;
  }

  @Override
  public SerializableString getEscapeSequence(int ch) {
    return null;
  }
});
```

```text:エスケープとアンエスケープ
https://qiita.com -> "https:\/\/qiita.com" -> https://qiita.com
```

## 2. \uXXXXフォーマット

`'/'`番目の要素を`ESCAPE_STANDARD`にします。他は同じ。

```java
  {
    escapeCodes = standardAsciiEscapesForJSON();
    escapeCodes['/'] = ESCAPE_STANDARD;
  }
```

```text:エスケープとアンエスケープ
https://qiita.com -> "https:\u002F\u002Fqiita.com" -> https://qiita.com
```

## 3. 任意の内容

`'/'`番目の要素を`ESCAPE_CUSTOM`にして、
エスケープ後文字列を指定した`SerializableString`を返します。

```java
  {
    escapeCodes = standardAsciiEscapesForJSON();
    escapeCodes['/'] = ESCAPE_STANDARD;
  }

  @Override
  public SerializableString getEscapeSequence(int ch) {
    return new SerializedString("あああ");
  }
```

```text:エスケープとアンエスケープ
https://qiita.com -> "https:ああああああqiita.com" -> https:ああああああqiita.com
```

もちろん、上のような適当なエスケープでは元には戻らない。。。
neovim as a msgpack-RPC client

neovimの新しいpluginアーキテクチャはmsgpack-RPCでpluginと通信します。
この通信は相互なのでneovim自体がmsgpack-RPCの機能を備えています。
関係する関数は以下の4つ：

- rpcnotify
- rpcstart
- rpcrequest
- rpcstop

今回はrpcstart,rpcrequestについて見ていく。

`rpcstart({prog}, [, {argv}])`はプロセスを起動してその標準入出力経由でmsgpack-RPCの通信を実行します。
通常msgpack-RPCのサーバーはアドレスとポートを指定する事が多いと思いますが、neovimはプロセスとの通信しかサポートして無いように見えます。
ですがnetcatを使用してTCPを標準入出力に変換してしまえば解決です！

試してみましょう。
まずneovimでlocalhostの6666をlistenします：

```
NVIM_LISTEN_ADDRESS=127.0.0.1:6666 nvim
```

(neovimは標準ではUNIXドメインソケットつかいます）
これを見るために別のneovimを起動して

```vim
let c = rpcstart('nc', ['localhost', 6666])
let res = c.call("vim_get_api_info()")
```

とするとアクセスできます！やったね！！
Laravel Homestead.yaml 動的ドメイン設定メモ


LaravelのHomestead.yaml に動的にドメイン設定するときのメモ。
なぞの仕様がある。


```homestead.yaml
    - map: '~^my-(?<project>.+).192.168.10.10.xip.io'
      to: /home/vagrant/Code/my/public/\$project
    - map: '~^(?<project>.+)-my.192.168.10.10.xip.io'
      to: /home/vagrant/Code/my/public/\$project
    - map: '~^(?<project>.+).192.168.10.10.xip.io'
      to: /home/vagrant/Code/\$project/public
```

このように設定している場合
my-fuga.192.168.10.10.xip.io　→/home/vagrant/Code/my/public/fuga
fuga-my.192.168.10.10.xip.io　→/home/vagrant/Code/my/public/fuga
fuga.192.168.10.10.xip.io　→/home/vagrant/Code/fuga/public

にアクセスできそうなものだが、実際は
my-fuga.192.168.10.10.xip.io　→/home/vagrant/Code/my-fuga/public
fuga-my.192.168.10.10.xip.io　→/home/vagrant/Code/my/public/fuga
fuga.192.168.10.10.xip.io　→/home/vagrant/Code/fuga/public

にアクセスしてしまう。定義の順番を変えてもだめ。なぜか条件がゆるくて、あとに定義されたものが適用されてしまう。よくわからないけど、後方に識別子をつけた

```
fuga-my.192.168.10.10.xip.io
```

のほうを使おうと思う。わかるひと教えてください！
Android SDK 2.1.2 + JDK 8 on Mac

1. http://tools.android.com/tech-docs/configuration/osx-jdk の概要
    1. Mac では多くの場合 IDE 自体が動作する Java と Java コードをコンパイルする JDK は別
    2. IDE はデフォルトで Java 6 で動く
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/131106/629856cb-fb02-b54f-5157-9e538ddfc47e.png)

        1. これは Mac の Java 6 はフォント描画時にちゃんとサブプクセルレンダリング（液晶ディスプレイに合わせたアンチエイリアシング）をしてくれるので文字が綺麗に見えるから
        2. Mac の Java 7 以降はこのアンチエイリアシングをちゃんとしてくれない
            1. Java 6 までは Apple が、Java 7 からは Oracle が管理してるから？
        3. 文字の見かけが気にならないなら Java 8 を使うべき
            1. ターミナルから以下のコマンドで Java 8 で IDE を起動できる

            ```
$ STUDIO_JDK=/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk open /Applications/Android\ Studio.app
```
            ![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/131106/50b5441f-a853-f108-c4c0-5caf5fb7f50e.png)
            1. スクリーンショットで、ちょっとアンチエイリアシングが違うのがわかる
Github Desktopを使った開発の流れ(入門)

# 背景

Github Desktopを使うタイミングがあったので整理のための備忘録.
Gitの使い方やGithubの使い方、開発の流れなど簡単に書いていきます。

* Mac OS X El Capitan 10.11.5
* [GitHub Desktop](https://desktop.github.com/) : 220
* git version 2.9.0

# 開発の流れ

普段、私がやっている開発の流れは以下の通りです。

1. ローカルPCの開発ブランチを最新にする
2. 作業用ブランチの作成
3. 作業 / コミット
4. 作業用ブランチのpush
5. プルリクエストの作成
6. レビュー / マージ (マージできなかったら3に戻る)

開発は基本的に上記のサイクルで行うと非常にスムーズに進みます。以下、細かくGithub Desktopの使い方と一緒に解説していきます。

## 1.ローカルPCの開発ブランチを最新にする

ローカルの開発用ブランチを最新にします。開発用ブランチはプロジェクトにより異なると思いますが、`master`, `develop`などがこれに相当します。

極論、この作業はしなくてもいいのですがコンフリクトの可能性が出てきます。コンフリクトとは、複数人が同じファイルの同じ行を編集したせいで自動マージできない現象のことを言います。

[サルでもわかるGit入門 - 競合の解決](http://www.backlog.jp/git-guide/intro/intro5_2.html)


Github Desktopでの作業です。 上部の `master` と書いてあるとこでブランチの切り替えができるので、そこで開発ブランチを選択します。その後 `Sync`　を押して同期します。 Syncは「⌘S」でも可能です。

![sync.png](https://qiita-image-store.s3.amazonaws.com/0/29844/629e39a9-dac3-df95-ea4f-f78ba8df7783.png)


コマンドラインでの操作だと以下のコマンドになります。

```
% git checkout master
% git pull --rebase 
```

## 2.作業用ブランチの作成

わかりやすいブランチ名をつけるのは、わかりやすいコミットメッセージを作成するのと同じくらい重要なことだと思っています。プロジェクトによって、ルールを決めたりするといいかもしれません。1つ例をあげてみます。

* 作業者名_作業内容
* `rindo_add_helloworld` (RINDOが担当する"Hello World"を追加するブランチ)

このように

* 他の開発メンバーも何を行っているのか把握できる
* ブランチ名を見れば何をしているのかひと目で分かる

ような名前だと、コミット等の中身を見ずに済むかもしれません。

Github Desktopでの操作です。 上部のブランチ作成ボタンを押すとポップアップが出てくるので、ブランチ名を作成します。 (⌘+Shift+N)

![スクリーンショット_2016-07-02_13_40_17.png](https://qiita-image-store.s3.amazonaws.com/0/29844/d7ab5cf2-d521-078f-11a0-86ea7532b20f.png)

コマンドラインでの操作だと以下のコマンドになります。

```
% git branch rindo_add_helloworld
% git checkout rindo_add_helloworld
```


## 3.作業 / コミット

作業はババッと終わらせます。 「Hello World」とだけ書かれたtxtファイルを作成します。

```
% echo "Hello World" >> hello_world.txt
```

ファイルを追加したら、 Github Desktopに戻ってください。
「1 Uncommitted Change」と書いてあるところをタップすると以下の画面になると思います。

* チェックボックスが付いていることを確認する (ついているものだけcommit対象になります)
* 右の変更が正しいか確認する (緑の行が追加, 赤の行が削除を表しています)
* コミットメッセージを書く (サムネの横のテキストフィールド)
* 場合によっては詳細も書いておくと後で便利かも?
* 「Commit to "ブランチ名"」を押して、コミット

![スクリーンショット_2016-07-02_13_47_50.png](https://qiita-image-store.s3.amazonaws.com/0/29844/af3b3ded-7532-7e65-d6a1-6cf4acaa40fb.png)

コマンドラインでの操作だと以下のコマンドになります。

```
% git add hello_world.txt
% git commit -m "add hello_world.txt"
```

## 4.作業用ブランチのpush

ローカルに作ったブランチをGithub上にも作成します。 Github Desktop上では`publish`という表記になっています。 publishボタンを押せば、Github上に同じブランチ名で作成されます。

![publish.png](https://qiita-image-store.s3.amazonaws.com/0/29844/becdca78-5f03-fa96-0962-8286200dcd1a.png)

コマンドラインでの操作だと以下のコマンドになります。

```
% git push origin rindo_add_helloworld
```

## 5. プルリクエストの作成

Github Desktopでは右上のPull Requestを押すと、Github上でプルリクエストが作成されます。
作業内容などをさらに書くと、他の人が作業を理解しやすくていいと思います。

![pull_request.png](https://qiita-image-store.s3.amazonaws.com/0/29844/8d05b5df-10b6-0feb-4c9a-ecf6cd737f59.png)


コードレビューのときは言動等に気をつけましょう..喧嘩になります。

[コードレビューで気をつける言葉や行い](http://macotox.hateblo.jp/entry/2014/08/16/231842)

## そして、また1へ

無事にプルリクエストがマージされたとして
masterにしてsyncをすると先ほどのコミットが反映されていることがわかります。

![スクリーンショット 2016-07-02 14.02.58.png](https://qiita-image-store.s3.amazonaws.com/0/29844/017d8378-9ec5-363b-acc4-48eff48bdf56.png)
Jenkinsのセキュリティを無効にする

# はじめに
+ セキュリティの設定を間違えてログインできなくなってしまった。
+ Jenkinsの初期セットアップ時にセキュリティを無効にして作業したい。

といったときに、Jenkinsのセキュリティ設定を無効にし、ログインなしで管理項目を操作できるようにする方法を説明します。

+ 検証環境：Jenkins ver.2.11

Jenkinsの日本語版Wikiの情報の設定を実施してみましたが、「旧データの管理」に関する警告がでます。
+ Jenkins 日本語版 Wiki：Disable security（[リンク](https://wiki.jenkins-ci.org/display/JA/Disable+security)）

現在のJenkins（ver.2.11）は、日本語版Wikiを作成したときと、状況が異なっているようです。
これから紹介する方法は、「旧データの管理」に関する警告がでない方法です。

# 手順概要
1. Jenkinsを停止する。
2. $JENKINS_HOME（/var/lib/jenkins）/config.xml をバックアップ。
3. config.xml を編集する。
4. Jenkinsを起動する。

# config.xml の編集
+ useSecurityをfalseに設定
+ authorizationStrategyを**削除**
+ securityRealmを**削除**

ポイントは、authorizationStrategyとsecurityRealmを編集ではなく、削除するところです。

**編集前**

```config.xml
  <useSecurity>true</useSecurity>
  <authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy">
    <denyAnonymousReadAccess>true</denyAnonymousReadAccess>
  </authorizationStrategy>
  <securityRealm class="hudson.security.HudsonPrivateSecurityRealm">
    <disableSignup>true</disableSignup>
    <enableCaptcha>false</enableCaptcha>
  </securityRealm>
```

**編集後**

```config.xml
  <useSecurity>false</useSecurity>
```

# おわりに
Jenkinsの英語版Wikiの情報は、上記の流れになっていてOKです。
+ Disable security（[リンク](https://wiki.jenkins-ci.org/display/JENKINS/Disable+security)）

セキュリティを無効化した状態は大変危険です。
本来であればJenkinsの管理者しかできない操作を、ネットワーク上の全ての人に対して許可している状態になっています。
悪用を防ぐために、運用時は認証を有効化することを検討してください。

※ Ansibleで上記のセットアップを行う方法を記事にしました。
　[AnsibleでJenkinsをセットアップする](http://qiita.com/olympic2020/items/249ebff8651050087ea8)
kivyのreStructuredText rendererを試してみた

## やったこと
KivyでRSTをレンダリングできるらしいので試してみた。

## ソースコード
試すだけなので簡単に実装

```py:main.py
import kivy
from kivy.uix.widget import Widget
from kivy.app import App

class textImput(Widget):
    def Text(self):
        pass
        
class editorApp(App):
    def build(self):
        return textImput()
            
editorApp().run()
```

KVは以下の通り

``` kv:editor.kv
<textImput>:
    BoxLayout:
        orientation: 'vertical'
        size: 800, 600
        TextInput:
            id: txt_inpt
            size_hint: 1, 5
            text: ''        
        RstDocument:
            text: txt_inpt.text
            size_hint: 1, 5
            show_errors: True     
```

## 実行結果

![rst.PNG](https://qiita-image-store.s3.amazonaws.com/0/98851/ec9c9be2-a3d7-da6f-3044-9f06a9e3fa9b.png)

画像はGetting StartedのRSTをとりあえず貼ってみた結果です。上がRST、下が結果。
レンダリングできているようです。
これは。多分、便利。

以上
試してみたでした。
脱VBA Excelツール! Pythonをインストールできない環境におけるVBAツールをPythonで駆逐する



Pythonをインストールできない環境なのにPython!?

な、何を言っているのかわからねーと思うが、俺もわからない・・・ということもなく、わかる人にはわかる話かもだけど。



とある業界では未だにVBAによるExcelツールは活発に使われている。

やはりユーザ業務におけるExcelの存在感は圧倒的であり、
そのためどうしてもExcelVBAが必要になってくる。

だから、普通にVBAを書けばいいじゃんというのは最もだと頭ではわかっているんだけど、

でもやはりVBAは体が受け付けない、

RubyなりPythonなりもっと流行り（？）の言語でツールを作りたい！

ということで、PythonでExcelVBAツールを駆逐しようという話。


ただ、とある業界では業務端末にPythonをインストールすることが難しい。
（当然、調整のうえ可能な場合もあるが）

そこで、Pythonをインストールできない環境でもPythonベースで作ったExcelツールを
実行するための手順を書いてみる。


## その前に

この投稿は正確にはxlwingsを使ってPythonでExcelにあれこれするツールが対象です。

xlwingsについて知らない場合、事前に以下の投稿を読んで見てください。

[Python(Xlwings)を使ってExcelを操作してみる](http://qiita.com/katzhide/items/8e37f4077950f7d6e7e2)
[ExcelからPythonを実行する](http://qiita.com/katzhide/items/60d0336b322105bf8fe9)


## ツールを作成する環境

|環境|バージョン|
|---|---|
|window|7|
|python|3.4.3 (Anaconda 2.3.0)|
|pyinstaller|3.2|

※作ったツールを実行する環境もwindows7です

## 方法

* Excelから実行したいpythonのスクリプトをexe化
* xlwingsを使ってExcelから作成したexeを実行して、実際の処理を実行する


## 準備

exe化するためのパッケージ`pyinstaller`をインストールする

```sh
conda install pyinstaller

pyinstaller -v

```

## 手順

### 作成したpythonスクリプトをexe化する

```sh

pyinstaller tool.py --onefile

```

### 作成したexeファイルをExcelから実行するようにマクロを定義する

```vba

Sub SampleCall()
    RunFrozenPython ("tool.exe")
End Sub

```

以前書いたpythonのスクリプトを実行する場合の以下のコードを上のコードに置き換えるイメージ

```vba

Sub SampleCall()
    RunPython ("import myproject;myproject.myfunction()")
End Sub

```

ただし、exeを呼ぶときは実行したいfunctionを指定できないみたいなので、
pythonスクリプト側で、スクリプトが実行された場合に
呼びたいfunctionが実行されるようにしておく必要がある。

### 終わり
これで、登録したマクロを実行すれば、exe化したpythonスクリプトが実行され、あれこれ処理が実行される。

これでDBからデータを取得して、あれこれ加工して、Excel上に値を貼り付け、
帳票を作成するなんてツールをVBAを一切書かないでPythonでかけるようになった＼(^o^)／


## 感想

まぁこんな遠回りするくらいなら、おとなしくVBAを書けよって話なんだろうなｗ
一応これでちゃんとツールは作れるんだけど、xlwingsを使ったスクリプトをexe化すると
それだけで130MBくらいのツールになる（苦笑）

本業務で使うかというと・・・(´・ω・｀)
Chinachu + Mirakurun をdockerに閉じ込めた話

# 3行纏め
- https://github.com/h-mineta/docker-mirakurun-chinachu
- ホスト側の環境は汚れず、かつ環境依存が大幅に減って良い感じ
- 週末は犠牲になったのだ...

# 利用方法
GithubのREADME.mdを読んでください

# [参考] CentOSで1から構成する場合
下記構成を想定しています
- CentOS 7 x86_64
- PT3
- SmartCard Reader SCR3310-NTTCom

CentOS 最小インストール後、下記順序で設定を進めることでMirakurun & Chinachuの起動が完了します。

```
# SELinux disable
sudo setenforce 0
sudo sed -i 's/^SELINUX=.*$/SELINUX=disabled/' /etc/selinux/config

# RPM Update
sudo yum -y update

# PT3 Driver install
sudo mkdir -p /usr/local/src
sudo chown root:wheel /usr/local/src
sudo chmod 775 /usr/local/src
cd /usr/local/src
sudo yum -y install git kernel-headers kernel-devel make gcc wget
git clone https://github.com/m-tsudo/pt3.git
cd pt3
make
sudo make install

sudo rpm -Uhv http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-7.noarch.rpm
sudo sed -i 's/^enabled=.*$/enabled=0/' /etc/yum.repos.d/epel.repo
sudo yum -y --enablerepo=epel install dkms
sudo ${SHELL} ./dkms.install

sudo sh -c "echo 'blacklist earth-pt1' > /etc/modprobe.d/blacklist-ptx.conf"
sudo sh -c "echo 'blacklist earth-pt3' >> /etc/modprobe.d/blacklist-ptx.conf"

# Disable pcscd
#sudo yum -y install pcsc-lite
sudo systemctl disable pcscd
#sudo systemctl start pcscd

# おまけ Sync NTP
sudo yum -y install chrony
sudo systemctl enable chronyd
sudo systemctl start chronyd

# Reboot
sudo reboot

#----------------------------------------

# docker install
curl -fsSL https://get.docker.com/ | sh
sudo usermod -aG docker `whoami`
sudo systemctl enable docker.service
sudo systemctl restart docker.service

# docker-compose install
sudo curl -o /usr/local/bin/docker-compose -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m`
sudo chmod +x /usr/local/bin/docker-compose

# Firewallを開ける
sudo firewall-cmd --add-port 40772/tcp --permanent
sudo firewall-cmd --add-port 10772/tcp --permanent
sudo firewall-cmd --add-service mdns --permanent
sudo systemctl reload firewalld

git clone https://github.com/h-mineta/docker-mirakurun-chinachu tvs
cd tvs
docker-compose up -d
```

ねっ、簡単でしょう？

# あとがき
Dockerfile自体は先週には完成していましたが、スマートカードリーダーの利用について時間が掛かってしまいました。
当初はホストマシンでpcscdを起動した後に、pcscdのUNIX domain socketをMirakurunのコンテナで利用することを計画していたのですが、カードリーダーを認識できず停滞していました。
未だに原因不明ですが、最終的にはMirakurunコンテナ内でpcscdを動かすことで解決しました。

~~なお、今回からMirakurunのサービスポートは36960/tcpとなっています。
語呂合わせでミラクル感ある番号になってて良いと思っています。~~
Mirakurunは公式で40772/tcpになると情報を頂きましたので、変更しました。
EC2 (AWS ElasticBeanstalk) へのデプロイ時に npm installで失敗した時のメモ

# AWS EBのEC2への突然のデプロイ失敗

開発用の環境を AWS ElasticBeanstalkでEC2(t2.micro)でやってたのですが、ある時からデプロイが失敗続きになってしまってました。

# 原因を探る

EBへのデプロイ時の挙動は、 `/var/log/eb-activity.log` で確認します。
失敗してるところを探しましょう。

```
[2016-07-02T03:22:47.996Z] INFO  [9470]  - [Application /AppDeployStage0/AppDeployPreHook/06_npm_install.sh] : Activity execution failed, because: ++ /opt/elasticbeanstalk/bin/get-config container -k app_staging_dir

（略）

  > node-sass@3.8.0 install /var/app/ondeck/node_modules/node-sass
  > node scripts/install.js


   (Executor::NonZeroExitStatus)


[2016-07-02T03:22:48.000Z] INFO  [9470]  - [Application /AppDeployStage0/AppDeployPreHook/06_npm_install.sh] : Activity failed.
```

こんな感じのログが出ます。
これはnpm install用の自作のデプロイフックの処理です。

NonZeroExitStatusと書いてあるので、ここで何らかの異常処理が行われてるっぽいという事は分かります。
このエラー内容だと何が原因かいまいち分からないのですが、OOM Killer（メモリ不足）な疑いが。

## スワップ領域の確保

t2.microなのでメモリが１Gしかありません。
スワップ領域を１G増やしてみます。

### まず現状の確認
```bash
$ grep Mem /proc/meminfo 
MemTotal:        1019336 kB
MemFree:          568256 kB
MemAvailable:     598736 kB
$ grep Swap /proc/meminfo 
SwapCached:            0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
$ free
             total       used       free     shared    buffers     cached
Mem:       1019336     451064     568272         80      23544      95392
-/+ buffers/cache:     332128     687208
Swap:            0          0          0
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/xvda1       7.8G  4.0G  3.7G   52% /
devtmpfs         490M   56K  490M    1% /dev
tmpfs            498M     0  498M    0% /dev/shm
```

### スワップ領域確保

```bash
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
1024+0 レコード入力
1024+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 14.0276 秒、 76.5 MB/秒
$ sudo mkswap /swapfile 
スワップ空間バージョン1を設定します、サイズ = 1048572 KiB
ラベルはありません, UUID=274ae598-42ab-41e0-b229-bb0a2ccb6c09
$ sudo swapon /swapfile 
swapon: /swapfile: 安全でない権限 0644 を持ちます。 0600 がお勧めです。
$ sudo chmod 600 /swapfile 
$ ls -l /swapfile 
-rw------- 1 root root 1073741824  7月  2 03:36 /swapfile
```

### 確認

```bash
$ grep Swap /proc/meminfo 
SwapCached:            0 kB
SwapTotal:       1048572 kB
SwapFree:        1048572 kB
$ free
             total       used       free     shared    buffers     cached
Mem:       1019336     956532      62804         80      20928     602920
-/+ buffers/cache:     332684     686652
Swap:      1048572          0    1048572
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/xvda1       7.8G  5.0G  2.7G   65% /
devtmpfs         490M   56K  490M    1% /dev
tmpfs            498M     0  498M    0% /dev/shm
```

スワップ領域の確保は色んな所にやり方が載ってますので、詳しくはググッてみてください。

# デプロイ成功

これでスワップ領域を確保してからデプロイしたら、うまく行きました。
Railsのasset precompileが同様にメモリ不足になるのは何度も経験あるんですが、npm installもメモリ食うんですね。
良かったら試してみてください。
開発環境としてchrootを用いる

chrootを用いた簡易な開発環境の構築
---
Linuxにおいて開発環境の為に仮想機械やdockerを試したが、強力すぎて宝の持ち腐れな上にリソースを食うので簡単な仮想環境としてchrootを扱うことが増えてきたのでまとめ。  

debootstrapなどを用いて環境を作るまではいいが、そのあとやらなければならないことがある。
それは
- file system としてカーネルから提供されてるAPIのprocfsとsysfsとdevfs。
- resolv.conf  
最低限はここらへんだと思う。
/etc/fstabに書き込めばって感じだけど、適当に作って適当に壊す環境がほしいので今回は見送り

今回はこれに加えて
- chroot内からのXを用いるアプリケーション
- ssh key

これらを毎回手動でやるのも疲れるのでshell scriptにまとめた。
shell scriptもいい感じに書けないので、変更したほうが良い点などを教えてもらえれば嬉しい。

```bash
#!/bin/bash

# set -x
set -eu

if [ $# -ne 1 ]; then
    echo 'example'
    echo '  $ chroot_plus.sh /home/hogehoge/chroot/debian_root'
    exit
fi

if [ ${EUID:-${UID}} != 0 ]; then
   echo 'You are not root'
   exit
fi

if [[ -v SUDO_USER ]]; then
    echo username: $SUDO_USER
    user=$SUDO_USER
else
    echo "cannot detect user."
    exit 1
fi

dest_dir=$1

mount_out=`mount`

# tmpfs
if ! echo ${mount_out} | grep ${dest_dir}/tmp > /dev/null ; then
    mount -t tmpfs tmpfs ${dest_dir}/tmp
    echo "[tmpfs] mounted."
else
    echo "[tmpfs] already mounted."
fi 

# devfs
if ! echo ${mount_out} | grep ${dest_dir}/dev > /dev/null; then
    mount --rbind /dev ${dest_dir}/dev
    echo "[devfs] mounted."
else
    echo "[devfs] already mounted."
fi

# sysfs
if ! echo ${mount_out} | grep ${dest_dir}/sys > /dev/null; then
    mount -t sysfs sysfs ${dest_dir}/sys
    echo "[sysfs] mounted."
else
    echo "[sysfs] already mounted."
fi

# copy resolv.conf
if [ ! -d ${dest_dir}/etc ]; then
    echo "${dest_dir}/etc is not found."
    exit 1
else
    cp /etc/resolv.conf ${dest_dir}/etc/resolv.conf
fi

# mount .ssh dir
if [ ! -d ${dest_dir}/home/${user}/.ssh ]; then
    echo "${dest_dir}"/home/${user}/.ssh is not found.
    exit 1
else
    mount --rbind /home/${user}/.ssh ${dest_dir}/home/${user}/.ssh
fi

# for x application
xhost +local:

# change root!
chroot ${dest_dir} /bin/bash

exit 1
```

posix警察に殺されそう
「Drupalはすでにインストールされています」

##問題
Acquia Dev Desktopで、New Drupal Site実行後、Drupalでのセットアップ画面で、
**Drupal already installed（Drupalはすでにインストールされています）**と表示されて、サイトを追加できない。
##解決法
acquiaのフォーラム（<a href="https://forums.acquia.com/general/general-discussion/new-install-says-drupal-already-installed">New install says Drupal already installed</a>）では、

Drupalのセットアップ画面で、

- usernameはデフォルトのまま
- パスワードは空

で進める。
実際にこれでセットアップは完了できた。
##環境
Windows 10 64bit
Acquia Dev Desktop(Ver 2, Built: Mar 18 2016 10:50:55)