OmniAICreator/Qiita-1.07M huggingface dataset:
Solr6のCoreAdmin APIについて

Solr6のCoreAdminについて調べました。

1.Coreを作成する

```
#su - solr -c "/path/to/solr/bin/solr create_core -c corename"
```
事情がありsu使用していますが、このsuで「create_core」を実行すると失敗してしまいます。これはコア作成する際に、コアのフォルダーがsuの権限で作成され、のちsolrユーザがアクセスしようとすると、権限の問題が原因だと思われる。
Solrをインストールする際に作られた「solr」ユーザで実行すればこの問題を解決できます。
```
http://solr-host:8983/solr/admin/cores?action=CREATE&name=corename&instanceDir=corename
```
ちなみに、上記コマンドの中でもHTTP APIを使うことになっているが、このAPIを直接呼んでもコアを作成することができない。このAPIを使うには「corename」のフォルダーが存在し、solr_configとschemaを配置しておくことが必要です。API経由のコア作成は推奨されていません。
こちらのコマンドは標準のsolr_configとschemaをコピーでとってきてくれるようになっており、独立のコアを作成することができます。また以下のようにSolrには複数コア間のconfigとschemaを共用するコアを作成することもできます。

```
http://solr-host:8983/solr/admin/cores?action=CREATE&name=corename&instanceDir=corename&configSet=myconfigset
```
configsetは最初「$SOLR_HOME/configsets」に置かれている、「solr.xml」で設定可能。ちなみに、こちらのAPIはsolr_configとschemaをあらたに用意する必要がないため、コアの作成はAPIだけで完結できます。

```
/<configSetBaseDir>
    /myconfigset
        /conf
            /managed-schema
            /solrconfig.xml
    /otherconfigset
        /conf
            /managed-schema
            /solrconfig.xml
```

2.Coreを削除する

```
path/to/solr/bin/solr delete -c corename
```

```
http://solr-host:8983/solr/admin/cores?action=UNLOAD&core=corename&deleteIndex=true&deleteDataDir=true&deleteInstanceDir=true
```
作成と異なり、削除は直接APIから実行可能です。

3.コアをまたいだ検索
コアは大きくなることが予想できたら、複数のコアに分けてインデックスする方式を考えたほうがいいかもしれません、そのときShardsを用いコアをまたぐ検索ができます。もともと分散検索に用いたものですが、同一サーバでも機能します。

```
http://solr-host:8983/solr/corename/select?indent=on&q=*:*&shards=solr-host:8983/solr/corename,solr-host:8983/solr/othercorename
```
標準入力をwhile文で取得する際の注意点　備忘録

最近PHPを勉強し始めました。

複数行にわたる標準入力を、while文を使って取得する際にうまく取得できなかったパターンがあるのでそれを備忘録として簡単にまとめました。

## うまく取得できなかったパターン
　複数行の標準入力を取得しようとしたところ、「0」が含まれた際に「0」以下の値を取得できなかった。

```
while ($input = trim(fgets(STDIN))) {
    
　　$num[] = $input;
   
}
    
print_r($num);


入力
1
2
0
3
4
5

結果
Array
(
    [0] => 1
    [1] => 2
)
```

## 原因
　`while ($input = trim(fgets(STDIN)))`の時点で「0」が入ってしまうと`while(0)`となってしまい、「0」は「偽」となってしまうため、whihle文を抜けてしまう。

## 解決策
```
while ($input = fgets(STDIN)) {
    
　　$num[] = trim($input);
    
}
    
print_r($num);


入力
1
2
0
3
4
5

結果
Array
(
    [0] => 1
    [1] => 2
    [2] => 0
    [3] => 3
    [4] => 4
    [5] => 5
)
```

上記のように、while文の条件では`while ($input = fgets(STDIN))`とし、改行コードを除かずに`「0 + “\n”」`のような状態をあえてつくり、配列に格納するときに`$num[] = trim($input);`とし、改行コードを除くことで解決できた。
phpbrewでphpのバージョン管理をする(Mac向け)

##事の発端
phpのバージョン管理にphpenvをいれようとしたところ、うまくいかなかった。
調べて見ると
>rbenvにパッチをあててPHP用に修正するただのスクリプト。 ビルド機能はないので、通常php-buildをプラグインとして併せて使う。

とのことで、rbenvと環境変数が被っていたりするようだ。
そこでphpenvを諦め、phpbrewで管理することに。

##phpbrewインストール手順

```
$ curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
$ chmod +x phpbrew
$ mv phpbrew /usr/local/bin/phpbrew
$ phpbrew init
```
phpbrewはPATHの通ってるディレクトリに置く。
zshrcやbashrcに以下を追加する。

```~/.zshrc
source $HOME/.phpbrew/zshrc
```

追記したらお決まりの、

```
source ~/.zshrc
```

##使い方
#### インストール可能なphpのバージョンを確認する
```
phpbrew known
```

#### インストール可能バージョンに最新が表示されていないとき
```
phpbrew update
```

#### 指定バージョンのインストール
```
phpbrew install [バージョン] +default
```

#### インストールしたphpのバージョンを確認する
```
phpbrew list
```

#### 一時的に使用するphpのバージョンの指定
```
phpbrew use [バージョン]
```

#### デフォルトで使用するphpのバージョンの指定
```
phpbrew switch [バージョン]
```

##参考
- [PHPBrew](https://github.com/phpbrew/phpbrew/blob/develop/README.md)
- [MacでのPHP開発はphpbrewが非常に良い](http://www.karakaram.com/mac-install-phpbrew)
- [phpenvやphpbrewの雑な比較](http://qiita.com/Hiraku/items/61eeec22f78e9a6217ee)

##最後に
便利な機能があれば教えてください！！！！
Mac でシステムで用意されているサウンドをランダムに再生する

```sh
$ afplay -v 2 $(find /System/Library/Sounds -type f -maxdepth 1 | gshuf | sed -n "1p")
```

上記を実行すると

* /System/Library/Sounds/Basso.aiff
* /System/Library/Sounds/Blow.aiff
* /System/Library/Sounds/Bottle.aiff
* /System/Library/Sounds/Frog.aiff
* /System/Library/Sounds/Funk.aiff
* /System/Library/Sounds/Glass.aiff
* /System/Library/Sounds/Hero.aiff
* /System/Library/Sounds/Morse.aiff
* /System/Library/Sounds/Ping.aiff
* /System/Library/Sounds/Pop.aiff
* /System/Library/Sounds/Purr.aiff
* /System/Library/Sounds/Sosumi.aiff
* /System/Library/Sounds/Submarine.aiff
* /System/Library/Sounds/Tink.aiff

のいずれかがランダムで再生されます

## <i class='fa fa-sitemap'></i> 分解する
### <i class='fa fa-sticky-note'></i> 任意の音声ファイルを再生する
```sh
$ afplay some.mp3
```

### <i class='fa fa-sticky-note'></i> 乱数を取得
※ gshuf を使う場合は `brew install coreutils` しておくこと

```sh
$  seq 10 | gshuf
7
6
5
3
8
10
9
1
2
4
```

### <i class='fa fa-music'></i> 先頭1行を取得する
```sh
$ seq 10 | sed -n '1p'
1
```

## <i class='fa fa-pencil'></i> 補足
とくにShellに詳しいわけではないのでよりよいかき方があるかも

## <i class='fa fa-book'></i> 関連資料
* [shufコマンドで行をランダムに散らす](http://shuzo-kino.hateblo.jp/entry/2015/08/05/231512)
Google map SDK for iOSで経路検索を行う。

#Google map SDK for iOS

iPhone で地図系アプリを作成する場合は、Google map SDK for iOSを使い地図をアプリに表示しますが、経路検索のAPIがGoogle map SDK for iOSには用意されておりません。
ですのでスクラッチで実装しなければなりませんが、GETで取得して取得した値を経路検索のデーターに用いることは結構骨が折れます、

そこで簡単に開始地点から、目的地までの最短の経路を表示することができるライブラリーがありますのでそちらを使用します。

下記 git hub に上がってるライブラリーをクローンもしくわ、ダウンロードします。

[Git hub keisukeYamagishi](https://github.com/keisukeYamagishi/Direction)

sshにてクローンする場合

```
git@github.com:keisukeYamagishi/Direction.git
```

https にてクローンする場合

```
https://github.com/keisukeYamagishi/Direction.git
```

cocoapods でインストールすることもできます。

```console
$ pod init
$ vi ./Podfile 
```

```rb
target 'Target Name' do
  pod 'Direction'
end
```

```console
$ pod setup
$ pod install
```

そのまま再生ボタンか、⌘+ Rでビルドできると思いますので、

ビルドしていただくと下記画像のように起動時に指定された軽度、緯度で経路を表示することができます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/31394/d7c0c7e4-010b-e67c-93b4-e7a7aa768912.png" width="30%" height="30%">


##Sample Code 

```swift


let direction = Direction(from:"35.6775602107869,139.692658446729",to: "35.707848364433,139.701456092298",mode: .walking)
direction.directionCompletion(handler: { (route) in

    for route in route.routes {
        self.mapView.addDirection(path: (route?.overview_polyline?.points)!)
    }

}) { (error) in
    print (error)
}
```
flumpt で decorator インターフェースを追加した

flumpt, 正直自分ではあんまり使ってなくて、薄く作って手離れがいいように作ってたつもりではあったんだけど、「プロダクションで使ってます」ってのをちょくちょく聞いたんで、v0.3.0 出して、インターフェースをモダンな感じに対応しといた。

```js
import React from 'react'
import {withFlux, dispatchable} from 'flumpt'

@dispatchable
class CounterIncrement extends React.Component {
  render() {
    return <button onClick={_ev => this.context.dispatch('increment')}>+1</button>
  }
}

@withFlux((update, on) => {
  on('increment', () => {
    update(state => {
      return {count: state.count + 1}
    })
  })
}, {count: 0})
class MyApp extends React.Component {
  render () {
    return <div>
      <span>{this.props.count}</span>
      <CounterIncrement/>
    </div>
  }
}
```

継承じゃなくしたので、より自然なReactと「後付で」統合できる。他の環境に移行するのにも使える。SSRもこれで対応したと思う。

他の例: https://github.com/mizchi/flumpt/blob/master/examples/with-decorator/main.js
heroku の postgres データ移行

heroku で運用している app1 の DB を、app2 の DB へ移行したい時。

* 接続情報を調べる

```
$ heroku config:get DATABASE_URL --app <app1>
postgres://<username>:<password>@ec2-X-X-X-X.compute-1.amazonaws.com:5432/<dbname>
```

* dump

```
$ pg_dump -h ec2-X-X-X-X.compute-1.amazonaws.com -p 5432 -U <username> -d <dbname> -a > <dumpfile>.sql
```

* restore

```
$ heroku pg:psql --app <app2> < <dumpfile>.sql 
```
KinectV2の平滑化フィルターをつかう

結論からいうと、そんなものはない。

kinectV1にはありました。

>TransformSmoothParameters
>https://msdn.microsoft.com/en-us/library/microsoft.kinect.transformsmoothparameters_members.aspx

なんか*「V2になってkinectもだいぶ精度よくなったしもうSmoothingFilterなんていらないっしょ！」*ということらしい(ちゃんと調べてないので間違ってる可能性大)

無いなら作るしかない...orz

でもやさしいMicrosoftの人がV2ユーザー用に平滑化フィルターのサンプルを書いてくれてました。

>Joint Smoothing code for c#
https://social.msdn.microsoft.com/Forums/en-US/850b61ce-a1f4-4e05-a0c9-b0c208276bec/joint-smoothing-code-for-c?forum=kinectv2sdk

ちなみにC#です。C++も探せばあるかも。

ちなみに平滑化のアルゴリズムは「2重指数平滑法」が使われています。
なんかちゃんと丸まるし、遅延もほどほどに抑えられる的ないい感じな感じだそうです←

>平滑化アルゴリズムのサンプルはこちらがわかりやすいです
http://nbviewer.jupyter.org/github/wingcloud/notebooks/blob/master/SmoothingFilter1.ipynb

平滑化している様子をplotして視覚化してあるのでイメージが湧きやすいです。
python素敵。

>TransformSmoothParametersのパラメータはこちらに日本語訳があります
http://neareal.net/index.php?Kinect%2FKinectForWindowsSDK%2FTips%2FTransformSmoothParametersDocInJapanese

おわり。
Slackで誰がリアクションしたかを50人以上でも取得する

# 問題

Slackではメッセージに対して[絵文字でリアクション](https://get.slack.help/hc/en-us/articles/206870317-Emoji-reactions)を投稿できる。他の人も同じリアクションをした場合には、横の数字が増えていく。

![message](https://get.slack.help/hc/en-us/article_attachments/214876427/Screen_Shot_2016-10-19_at_4.41.02_PM.png)

誰がリアクションしたかは、PCではマウスオーバー、SPでは長押しすれば表示される。
しかし50人以上になった場合は `and others` と省略されてしまい、完全なリストを取得することができない。 (HTMLソースやXHRを見ても無理)

# 解決策

[reaction.get](https://api.slack.com/methods/reactions.get) APIを使おう。

# 取得方法

以下は簡易的にWebから取得する方法。プログラムからAPI叩けるならそっちで。

1. メッセージのリンクを取得
    - 時間の部分を右クリックとかメニューの `Copy link` とか
2. URLから `channel` と `timestamp` を読み解く
    - URL形式は `https://<team>.slack.com/archives/<channel>/p<timestamp>`
3. [reaction.get Tester](https://api.slack.com/methods/reactions.get/test) にパラメータを設定
    - `token`: 所属チームを選択 未発行の場合は適宜発行する
    - `channel`: 2で読み解いたもの
    - `timestamp`: 2で読み解いたものに小数点を追加 (`1234567890123456` → `1234567890.123456`)
    - `full`: `true`
    - 他は空欄でOK
4. `Test Method` をクリックすると結果が出てくる
    - `message.reactions.0.users` 辺り
    - 但し `U1234567890` みたいな形式のみで表示名は取れない
5. 必要に応じて [users.info](https://api.slack.com/methods/users.info) なり [users.list](https://api.slack.com/methods/users.list) 使って `real_name` を取得

# あとがき

リアクション使ったアンケートをしたら、50名超えた分の名前が見れなくて焦ったので書いた。
Maya Send to Unreal


# Maya Send to Unreal

## Unreal Engine にシーンを書き出す
https://knowledge.autodesk.com/ja/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2016/JPN/Maya/files/GUID-51B5F746-12B0-4AB5-9701-A0A740D0ADA5-htm.html

## Set Unreal Project
![image](http://comiclo.jp/qiita/images/Cnv_20170327_092430_0000.png)

データを送信するUnrealProjectのフォルダを選択する
![image](http://comiclo.jp/qiita/images/Cnv_20170327_092430_0001.png)

## データ(FBX)を書き出す

書き出すモデルを選択する
②File -> Send To Unreal -> Selection
![image](http://comiclo.jp/qiita/images/Cnv_20170327_092430_0002.png)

名前を設定する
Export Selection
![image](http://comiclo.jp/qiita/images/Cnv_20170327_092430_0003.png)

## UnrealにImportする
![image](http://comiclo.jp/qiita/images/Cnv_20170327_092430_0004.png)

## Reimport設定
Edit -> Editor Preferences...
![image](http://comiclo.jp/qiita/images/Cnv_20170327_092430_0005.png)

Loading & Saving
Directories to Monitorの+をクリック
FBXをImportしたディレクトリを選択する
Include/Exclude Wildcardsに[*.fbx]を設定する
Include?にチェックを入れる
![image](http://comiclo.jp/qiita/images/Cnv_20170327_092430_0006.png)


FBX コンテンツ パイプライン
https://docs.unrealengine.com/latest/JPN/Engine/Content/FBX/index.html
Cloud Datalabの概要

これまで良さそうな雰囲気はしつつも何となく日が当たらなかった[Cloud Datalab](https://cloud.google.com/datalab/)ですが、[Google Cloud NEXT](https://cloudnext.withgoogle.com/)のタイミングにあわせて、2017/3/8にBETAからGAとなっており、[v1.0](https://github.com/googledatalab/datalab/wiki/Release-Info)が出ていました。

結構すごいはずなのにまだ注目を浴びていないので、少しずつDatalabの魅力を伝えていこうと思います。（たぶん3回くらいに分けて記事を書きます。）まずはCloud Datalabの概観をお伝えします。

## Cloud Datalabとは？
- GCP上でデータ分析や可視化、機械学習のためのインタラクティブな分析環境です
- データ分析者に人気のJupyterをベースに開発されているので、すでにJupyterを使っているユーザーにとってはスムーズに移行できるいい感じツールです
- GCP上で動かすメリットとして、BigQuery、GCS、CloudML Engineと統合されているため、シームレスに大きなデータを触ることができます
- Datalab自体はGCE上で動かすことを前提として、Dockerイメージとして[githubで公開](https://github.com/googledatalab/datalab)されています

## 価格
- Datalab自体には特に費用は発生しません
- ただしDatalabはGCE上で動作させることが前提になっているため、利用するGCE分の費用が発生します
  - その他、GCPのコンポーネントの費用を利用した分だけ課金されます
    - BigQueryとかGCSとか
  - その他、デフォルトで永続化のためにディスクを作成し、GCSにもバックアップ用にデータを保持しますので、その辺の費用がデフォルトでは発生します。

## 起動とかいろいろ

ほぼCloud Datalabの[QuickStart](https://cloud.google.com/datalab/docs/quickstarts)通りです。

### インストール

Google Cloud SDKがインストールされている前提で、追加でdatalabコマンドを取得しておきます
```
$ gcloud components install datalab
```

### セットアップ

プロジェクトとかゾーンとかのセットアップをしておくと、コマンドのオプションにつけなくて済むので楽ちんです。上述の通り、GCE上で動かすものなので、GCEに関連する設定をします。

```
$ gcloud config set core/project ${PROJECT_ID}
$ gcloud config set compute/zone ${ZONE}
```

### Datalab用のインスタンスの立ち上げと、Datalabへの接続

```
$ datalab create ${INSTANCE_NAME}
```

これで、Datalab用のインスタンスが立ち上げられ、いい感じにネットワークを作って設定してくれて、ブラウザが立ち上がってDatalabに接続されます。楽ちんです。

![datalab.png](https://qiita-image-store.s3.amazonaws.com/0/1046/f4c58601-686d-59c2-c626-365a05efc457.png)

Jupyterを使ったことのある人には何となく何をしたらいいか分かる画面ですね。


### サインイン

ブラウザ上から自分のアカウントでサインインします。Datalabが他のGCPのサービスを使うのにサービスアカウントを使っているからということです。GUIからなので楽ちんです。


### 後はお好きに分析を

Jupyterに馴染んでる方でしたら、好きに分析をしていけます。慣れていない方にも[素敵なREADME](https://github.com/googledatalab/notebooks/blob/master/Readme.ipynb)が同梱されているので、そこに従っていけば、notebookの使い方、BigQueryやGCSとの連携について理解できると思います。とりあえずここ見とけページがdatalabを立ち上げたら見れるので楽ちんです。


### 終わったら

使いたいだけ使ったらさよならできるのがクラウドのいいところ。さよならしましょう。

```
$ datalab delete ${INSTANCE_NAME}
```

さよならするのも楽ちんです。ただし、これは、インスタンスを削除しているだけなので、課金をこれ以上されたくない、という場合には、デフォルトで作られるディスク（notebookの内容自体はこちらにマウントされている）を削除したり、バックアップのGCSを削除したりするのを忘れてはいけません。

## 雑感

- Jupyterの環境をものすごくお手軽に構築できるのは良いですね
- Jupyter単体で動かす以上に他のクラウドサービスと統合されているのは良さそうです
- クラウドならではのメリットがありそうなので、もう少し深掘りして良さそうです

次回はDatalab自体についてもう少し詳しくみていきます。
Ubuntuがインストールされている状態からのWindowsとのデュアルブート

# 何がしたいのか
**UbuntuがインストールされているPCに、Windowsを入れてデュアルブートにするよ**という話です。
WindowsがインストールされているPCに、Ubuntuを入れてデュアルブートにする記事はよく目にしますが、その逆がなかったので記しておきます。

**サラッと一通り読み終えてから始めるのがオススメです。**(個人的には)

# 準備するもの
- Ubuntu Live USB  
必要になるので用意しておいて下さい。
- バックアップ  
もしもに備えてUbuntuの必要なファイルはバックアップを取っておきましょう。何かあっても僕は責任とりません。

# 自分の環境
僕自身が実行した環境を記しておきます。

- PC: VAIO Pro 13
- CPU: Intel Core i7
- 既に入っていたOS(ディストリビューション): Ubuntu 16.10
- デュアルブートしようとしたOS: Windows: 10

# WindowsのISOをダウンロード
Windows 10のISOファイルをダウンロードしておきます。
[Windows 10 のディスク イメージ (ISO ファイル) のダウンロード](https://www.microsoft.com/ja-jp/software-download/windows10ISO)←こちらからダウンロードしましょう。

# DVD-ROMに焼く
その後適当なソフトを使ってWindows 10のISOファイルをDVD-ROMに焼いて下さい。

USBに焼くのも良いかもしれませんが、なぜか僕はWindowsのインストール時に「ドライバが見つからない」とか訳のわからないことを訊かれて進みませんでした。USBでダメだったらDVD-ROMを試して下さい。

# Windows用のパーティションを作っておく
Ubuntuで、Windowsをインストールするパーティションを作ります。

パーティションの作成は、Ubuntuからは多分無理なので、Live USBで起動したUbuntuから行います。
1回PCの電源を落とします。
用意しておいたUbuntuのLive USBをPCに挿してUSBから起動を掛けます。するとなにやら黒っぽい画面が現れて
`Install Ubuntu`か`Try Ubuntu without Install`みたいなことを訊かれるので、後者を十字カーソルで選択してEnterをﾀｰﾝｯ!

Live USB上のUbuntuが立ち上がったと思います。

パーティションはGPartedというGUIツールで簡単に作れます。元からインストールされているので、起動しましょう。
GPartedの使い方は各自ググって下さい。
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/132881/948bf808-45f8-cc1b-a18e-2e8336277f4b.png)
最終的に上の画像のようにパーティションが作れればOKです。

Live USBのUbuntuはもう用済みなのでシャットダウンしましょう。

# Windowsをインストールする
DVDからブートして、Windowsのインストール画面を立ち上げます。
指示に従ってインストールを進めていくとインストール先のドライブを指定する画面が出てくるはずなので、そこで先ほど作ったWindowsを入れる用のパーティション(画像だとオレンジの部分)を選択。あとは指示に従ってどんどん進んでいって下さい。

インストールが完了してWindows 10の~~ダサい~~素晴らしいデザインを堪能して、edgeブラウザってこんなのなのか!と感動し終わったら、再起動にかけてみましょう。

**あれ...Windowsが起動するばっかりで起動時にUbuntuの選択が出来ない...**

# boot-repairによる修復
このままではかなりまずいので、修復していきます。
起動時に呼び出されるEFIがWindowsに乗っ取られているのが問題のようなので(多分。詳しいことは知らない。)、boot-repairというツールで修復していきます。

1回PCの電源を落とします。
またさっきの要領でLive USBのUbuntuを起動します。
そして立ち上がったら、端末を開いて以下のコマンドを叩きます。

```bash
$ sudo add-apt-repository ppa:yannubuntu/boot-repair
$ sudo apt update
$ sudo apt install boot-repair
$ boot-repair
```

するとパスワードの入力を求められた後に、以下のような画面が出てくるはずです。
![image](https://qiita-image-store.s3.amazonaws.com/0/132881/a96fd9ff-6ea0-da44-22c1-6e2919689043.png)
`高度なオプション`をクリックして、「ウィンドウズのEFIファイルをバックアップの上、ファイルの名称を変える」というところにチェックを入れます。
![image](https://qiita-image-store.s3.amazonaws.com/0/132881/8fad9923-16c1-cc89-a2cc-eadf62c24c3f.png)

あとは適用をクリックして指示に従って適当に進めていってください。
終了したら、シャットダウンしてUSB抜いてまた起動。

# どやっ!
すると起動時にWindowsかUbuntuか選べて、デフォルトでUbuntuが起動するはずです。やったぁ!!!!!!Foo!
Python note

### Basic
```py:hello.py
#!/bin/python

print "Hello World"
```

```
$ ./hello.py
Hello World
```

### File
```py:file.py
#!/bin/python

import os.path

if os.path.isfile("error.log"):
        os.remove("error.log")
else:
        print "Doesn't exist"
```

```py:write.py
#!/bin/python

# overwrite
log = open('access.log', 'w')
log.write("ABCD\n")
log.close()

# append write
log = open('access2.log', 'a+')
log.write("ABCD\n")
log.close()
```
Homebrewを使わずにRedisをインストールしてみよう

## はじめに

makeすればインストールできると思っていたら、そうではなかったので紹介します。

## ダウンロード

下記URLからダウンロードします。

- https://redis.io/

バージョンは3.2.8です。

## ビルド

下記コマンドラインを実行してビルドします。

```shell-session
xcode-select --install
tar -zxf redis-3.2.8.tar.gz
cd redis-3.2.8
make distclean all
```

`make test`したほうがいいかもしれません。

## インストール

redis-server, redis-cliを適当なところに配置して、パスを通して、インストール完了です！

## 参考URL

- http://jasdeep.ca/2012/05/installing-redis-on-mac-os-x/
- http://stackoverflow.com/questions/38631251/issue-with-redis-install-geohash-int-geohash-o
HoloLensで壁、床、机、天井の分類をする

#はじめに
３月初めよりインターンで株式会社ゆめみ(https://www.yumemi.co.jp/ja) にてHoloLensの研究開発をしている近大生のよっしーです。
国内でこの１月から提供を開始したMicroSoft製MRデバイスのHoloLensについての記事を書いていきます。

「HoloLens +他社製の外部入力」や「動きを３Dモデルにして配信」など、いろいろな方たちが面白い試みを数多く試されていますが、HoloLens開発の基本的部分の記事があまりなかったので、それをメインに書いていこうと思います。

#すること
**平面を壁、床、机、天井に分類する**

生成するオブジェクトを、Gazeの当たっている平面の種類によって変更したい。
という時などに使えると思います。

#前提環境
- Version: Windows Holographic
- OS Build: 10.0.14393.953
- HoloLensの開発環境セットアップ済み
- Unityでの開発
- HoloToolkit-Unityの利用
- HoloLens開発の基礎用語
- PlaySpaceManager(Holographic Academy 230で出てくる）の利用で、メッシュを取り除いた平面へと変換が出来ている。

# Physics.Raycast()の利用
Raycastはオブジェクトの衝突を判定できるもので、今回使うものは以下の引数を取ります。
- **origin:** ワールド座標でのレイの開始地点
- **direction:** レイの方向
- **maxdistance:** レイが衝突を感知する最大距離
- **layerMask:** レイキャスト時に選択的に衝突を無視するために使用する

#実装例
```csharp:RecognizePlane
RaycastHit hitInfo;

bool hit = Physics.Raycast(GazeManager.Instance.GazeOrigin,
GazeManager.Instance.GazeNormal, out hitInfo, 20f, SpatialMappingManager.Instance.LayerMask);
    if (hit) {
        GameObject surface = hitInfo.transform.gameObject;
        SurfacePlane plane = surface.GetComponent<SurfacePlane>();
        if (plane != null) {
            switch (plane.PlaneType) {
                case PlaneTypes.Floor:
                    //Do somothing
                    break;
                case PlaneTypes.Ceiling:
                    //Do somothing
                    break;
                case PlaneTypes.Wall:
                    //Do somothing
                    break;
                case PlaneTypes.Table:
                    //Do somothing
                    break;
                case PlaneTypes.Unknown:
                    //Do somothing
                    break;
            }
        }
    }
```

#解説
 - **GazeManager.Instance.GazeOrigin:** 視線の座標を取得
 - **GazeManager.Instance.GazeNormal:** 視線のforwordを取得
 - **out hitInfo:** 衝突判定のあった平面を取得
 - **layerMask:**　特に重要なポイント！ SpatialMappingManager.Instance.LayerMaskの値を使い空間マッピングオブジェクト以外が反応しないように設定している。

HolotoolKitのデフォルトでは以下のように、レイヤーマスクが31に設定されています。
![DefaultLayer.png](https://qiita-image-store.s3.amazonaws.com/0/114709/b18227c4-0b53-c958-25a7-34f204cc745b.png)

hitoInfoのtransform.gameobjectをsurface<GameObject>として取得し、
surfaceにアタッチされているSurfacePlaneコンポーネントをplaneとして取得します。
そうすることにより、plane.PlaneTypeによって平面タイプを分類出来ます。

#参考
RayCastその2、衝突するオブジェクトの制限【Unity】
http://kan-kikuchi.hatenablog.com/entry/RayCast2

Holographic academy Holograms230
https://developer.microsoft.com/en-us/windows/holographic/holograms_230
Ajax で POST するときに Pace.js のプログレスバーが出ない

## Pace.js

[Pace.js](http://github.hubspot.com/pace/docs/welcome/) とはプログレスバーを付けるための JS ライブラリです。

JS ファイルを読み込んで、決められたCSSを追記するだけでお手軽に、いい感じのプログレスバーを付けてくれます。

## 問題

ところが、デフォルトの挙動では Ajax 通信で POST リクエストした際にプログレスバーを出してくれません。

## 解決策

調べてみたら次のような記述を発見。

https://github.com/HubSpot/pace/issues/188#issuecomment-73080536

> You can choose what pace tracks by setting the options. By default pace only tracks GET requests.
>
> ```
> paceOptions = {
>    ajax: {
>          trackMethods: ['GET', 'POST', 'DELETE', 'PUT', 'PATCH']
>    }
> }
> ```

これを参考にして JS ファイルに次の1行を追記してあげたところ、無事に出てきました。

```js
// POST の Ajax 通信でもプログレスバーを表示する
Pace.options.ajax.trackMethods = ['GET', 'POST'];
```
Ryzen + amdgpu-pro + Ubuntu は 2017 年夏頃まで辛抱が必要(2017/08/03 時点)

Ryzen + amdgpu-pro driver + Ubuntu で GPU 計算機クラスタを構築しようと思案しましたが, まだドライバの熟成が必要なことがわかりました.

## Linux kernel

Ryzen を効率的に動かすには Linux 4.10 以上が必要になります. 4.10 以上が標準になるのは Ubuntu 17.04 か, Ubuntu 16.04.3(2017 夏頃リリース予定?)を待つことになります.


AMD's Ryzen Will Really Like A Newer Linux Kernel
https://www.phoronix.com/scan.php?page=news_item&px=AMD-Ryzen-Newer-Kernel

Ubuntu 16.04 その137 - AMDの新CPU Ryzen 7はUbuntuで利用できるのか？
https://kledgeb.blogspot.jp/2017/02/ubuntu-1604-137-amdcpu-ryzen-7ubuntu.html

追記: 2017/08/03, ついに 16.04.3 がリリースされました! 4.10 カーネルになっています. しかし amdgpu-pro ドライバがまだ 4.10 に対応していない...

## amdgpu-pro driver

また, amdgpu-pro driver は Ubuntu 16.04 までしかオフィシャルでは対応していません(2017/04/02 現在. version 16.60). Ubuntu 17.04 にインストールしようとするとエラーが出ます

AMD Ryzen conflict with Radeon
http://askubuntu.com/questions/893527/amd-ryzen-conflict-with-radeon

そもそも amdgpu-pro driver の kernel 4.10 対応もまだような気がしますね.

## 現状(2017 年 3 月時点)では Ubuntu 16.04 一択...?

したがって, 現状では Ubuntu 16.04 一択になりそうですが, Ryzen のパフォーマンスが出ないままになりそうですね.

Ubuntu 16.04.3 が出るか, amdgpu-pro driver がアップデートされるまでは, CPU 性能重視なら NVIDIA GPU にするか amdgpu driver(pro ではない方), GPU 重視なら CPU は Intel にすることになります.

### Ubuntu 16.04.2 + Ryzen 所感

amdgpu-pro driver をインストールしたところ, kernel 4.8.0.44 では画面がブラックアウトしました.
4.8.0.36 では動作しました. 

NanoRT path_tracer https://github.com/lighttransport/nanort を動かしたところ, omp threads=16 では極端に動作が遅くなった(omp threads=8 の半分以下)ので, やはりスケジューラーが十分最適化されていないようですね.
(追記: kernel 4.10 では速度低下は微小であることを確認しました)

### amdgpu-pro ドライバ補足

また, amdgpu-pro ドライバは省電力周りでまだ不都合があるのか, Intel CPU + Ubuntu 16.04 で動かしていてもたまに画面がレジュームされない時があるので, この不都合も早く治ってほしいですね...

Ubuntu 16.04 で AMDGPU Pro ドライバを使う
http://qiita.com/syoyo/items/7cb6e73cc7770e1f89da
Macでproxy.pacを設定したいとき


## tl;dr
Chromeだと[Proxy SwitchySharp](https://chrome.google.com/webstore/detail/proxy-switchysharp/dpplabbmogkhghncfbfdeeokoefdjegm?hl=ja)っていう便利なものがあるけど、Safariだとなぁ...ってんで、proxy.pacを使ってそれっぽくやってみるテスト

## やったこと

↓みたいなファイルを用意する。

```/Library/Frameworks/proxy.pac
function FindProxyForURL(url, host) {
    if (shExpMatch(url, "*.example.com*")
        || shExpMatch(url, "*://example.com*")
    ) {
        return 'PROXY localhost:8080';
    }
    return 'DIRECT';
}
```

んで、「システム環境設定」->「ネットワーク」->右下の「詳細」と辿っていって、プロキシの設定のところを↓みたくする。

![Kobito.0IADbJ.png](https://qiita-image-store.s3.amazonaws.com/0/21901/fc01a2ef-29ab-f9e9-ae27-42b66359538a.png "Kobito.0IADbJ.png")

したっけ、よしなに proxy 通してアクセスしてくれる。

## ハマりどころ

proxy.pacファイルをホームディレクトリに置いても、プロキシ構成ファイルとして認識してもらえなかった。
あれこれ試して */Library/Frameworks* に置いたら認識してくれたんだけど、pathが限定されてるってことかなー。
SQL Server 2016 Express LocalDBインストール

Visual Studioなど開発環境がインストールされていないPCで、SQL Server 2016 Express LocalDBを使ったアプリケーションを実行できるようにしてみました。

SQL Server LocalDBを使ったアプリケーションの開発方法は以下を参考にしてください。
http://qiita.com/akabei/items/3412ed032ca325c168a0

#環境
Windows 7 Professional SP1 64bit
.NET Framework 4.6.1

※今回はWindows7で問題なく動作しましたが、SQL Server 2016からWindows7はサポート外となったようです。
https://docs.microsoft.com/ja-jp/sql/sql-server/install/hardware-and-software-requirements-for-installing-sql-server

#LocalDBインストーラーダウンロード
以下の公式サイトから「無料でSQL Server 2016 Expressを試す」をクリックしてインストーラーをダウンロードします。

SQL Server 2016 SP1 Express エディション
https://www.microsoft.com/ja-jp/sql-server/sql-server-editions-express

![fff.png](https://qiita-image-store.s3.amazonaws.com/0/112075/429d4b00-c70e-f684-cd0a-53476b9d0b60.png)

ダウンロードしたファイル(SQLServer2016-SSEI-Expr.exe)を実行します。

![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/2944d097-9797-8900-897b-cdabaeaf81e8.png)

ダウンロードするパッケージの選択で「LocalDB(44MB)」を選択してインストーラーをダウンロードします。

#LocalDBインストール
ダウンロードしたインストーラー(SqlLocalDB.msi)を実行します。

![bbb.png](https://qiita-image-store.s3.amazonaws.com/0/112075/1e6982e3-cb5f-181b-9157-4fe5dfa8500a.png)

あとはインストーラーの指示にしたがってインストールします。

#アプリケーション実行
LocalDBがインストールできたらアプリケーションを実行します。
が、エラーが発生・・・！！

![ggg.png](https://qiita-image-store.s3.amazonaws.com/0/112075/689f580a-666e-bdf3-27c4-7e7df89929e1.png)

#LocalDBインスタンス確認
コマンドプロンプトからsqllocaldbコマンドを使ってLocalDBのインスタンスを確認します。

```:コマンドプロンプト
>sqllocaldb info
MSSQLLocalDB

```

プログラムを作成した環境のLocalDBインスタンスは「ProjectsV13」だったのでそれが原因のようです。

#接続文字列変更
アプリケーション設定ファイル(XXXXX.exe.config)をメモ帳などで開いて接続文字列を以下のように修正します。

Data Source=(localdb)\ProjectsV13;
　　　　　　　　　　　　↓
Data Source=(localdb)\MSSQLLocalDB;

```Xml:WindowsApp1.exe.config(修正前)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="WindowsApp1.My.MySettings.SampleConnectionString" connectionString="Data Source=(localdb)\ProjectsV13;AttachDbFilename=|DataDirectory|\Sample.mdf;Integrated Security=True" providerName="System.Data.SqlClient"/>
    </connectionStrings>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
    </startup>
</configuration>
```


```Xml:WindowsApp1.exe.config(修正後)
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="WindowsApp1.My.MySettings.SampleConnectionString" connectionString="Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Sample.mdf;Integrated Security=True" providerName="System.Data.SqlClient"/>
    </connectionStrings>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
    </startup>
</configuration>
```

#アプリケーション再実行
もう一度アプリケーションを実行します。

![hh.png](https://qiita-image-store.s3.amazonaws.com/0/112075/d347535d-e06c-6950-880d-7599cfe680cc.png)

動いた！！！

#まとめ
.NET Frameworkがインストールされている環境でも別途LocalDBをインストールする必要があるようです。
N-Queen(将棋版)

# N-Queen を将棋でやってみる

駒は 敵味方20個ずつ、合計40個置くことにする。(もっと置けるかもしれないが)
条件は、どの駒も、敵味方含めて移動できる位置にいないこと。[数理最適化](http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721)で解いてみよう

```py3:python3
import numpy as np
from itertools import product
from more_itertools import pairwise
from pulp import *
koma = '歩90g,香21g,桂20ce,銀20fghln,金20fghikm,角21fhln,飛21gikm,王20fghiklmn'.split(',')
arr,pos,whc = [],[0],[]
for iko, ko in enumerate(koma):
    for my in range(-1,2,2):
        ar = []
        lst = [(ord(c)%3-1,(ord(c)//3-35)*my) for c in ko[3:]]
        for x,y in product(range(9),range(9)):
            a = [0]*81
            a[x+y*9] = 40
            for p,q in lst:
                for z in range(1,int(ko[2])*7+2):
                    i,j = x+z*p,y+z*q
                    if not (0<=i<9 and 0<=j<9):
                        break
                    a[i+j*9] = 1
            ar.append(a)
        arr.extend(ar)
        pos.append(pos[-1]+len(ar))
        whc.extend([iko*2+my//2+1]*len(ar))
        if iko > 4:
            break
A = np.array(arr)
pp = (A==40).dot(range(81))

m = LpProblem()
x = [LpVariable('x%.4d'%i, cat=LpBinary) for i in range(A.shape[0])]
m += lpSum(x) == 40
for i, (p1, p2) in enumerate(pairwise(pos)):
    m += lpSum(x[p1:p2]) <= int(koma[i//2 if i < 10 else i-5][1])
for i in range(81):
    m += lpDot(x,A[:,i]) <= 40
%time m.solve(GUROBI_CMD())
print(LpStatus[m.status])
>>>
Wall time: 582 ms
Optimal
```

さすが、GUROBI！
0.5秒ほどで解けた[^1]。

[^1]: 「目的関数が dummy の許容性判定問題となっています．『線形緩和問題の許容解の目的関数値＝元問題の最適値』なので，整数許容解が見つかった瞬間に分枝が終了します．」[農工大の宮代先生](http://web.tuat.ac.jp/~miya/)のコメントより

表示してみよう。

```py3:python3
from PIL import Image, ImageDraw, ImageFont
v = np.vectorize(value)(x)
n = 181
fnt = ImageFont.truetype(r'C:\Windows\Fonts\ipaexg.ttf', 18)
im = Image.new(mode='1', size=(n,n), color=1)
for h in range(2):
    im = im.transpose(Image.ROTATE_180)
    d = ImageDraw.Draw(im)
    d.font = fnt
    for i,j,k in zip(range(40),np.array(whc)[v==1],pp[v==1]):
        x,y = (k%9,k//9) if h else (8-k%9,8-k//9)
        if (j<=9 and j%2==h) or (j>9 and i%2==h):
            d.text((x*20+2,y*20+2),koma[j//2][0])
for i in range(10):
    d.line([(0,i*20),(n,i*20)])
    d.line([(i*20,0),(i*20,n)])
im.show()
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/9c38f6ff-d93c-a8da-c939-0feebda8c9c9.png)

参考:
- [組合せ最適化でN Queen問題を解く - Qiita](http://qiita.com/Tsutomu-KKE@github/items/8ae87b08668307b58006)

以上
ActiveReportsでコントロールの幅、高さ、縦位置、横位置を一括設定する方法

ActiveReports使用中、テキストボックスを大量に配置するとき、幅、高さ、縦位置、横位置を一括設定する方法を知ったのでメモ書き

#結論：VisualStudioのレイアウトタブで調整できる。
VisualStudioのレイアウトタブで調整できる。
細かい手順は下記のとおり

#レイアウトタブの表示方法
１．VisualStudioのメニューから「表示」→「ツールバー」→「レイアウト」でレイアウトタブを表示する。

２．調整したいコントロールを複数選択する。

３．レイアウトタブから調整したい設定を選ぶ。
要検討 > geometry > 緯度経度から距離を求める式の理解 > 極座標から直交座標変換 / 天頂角 / 方位角

*** 以下の式導出は正しくないかもしれない ***

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

緯度緯度の２セットのデータから距離を求める。

自分が馴染みのある式は以下 (式1..3)。
参考 https://en.wikipedia.org/wiki/Spherical_coordinate_system
のCartesian coordinatesの2つ目の式。

```math
x = rsin\theta cos\phi
```

```math
y = rsin\theta sin\phi
```

```math
z = rcos\theta
```

ここで、$r$はradius (地球の半径[km])。$\theta$は天頂角 (zenith angle)のradianを取ったもの。$\phi$は方位角 (polar angle)のradianを取ったもの。
参考 https://en.wikipedia.org/wiki/Spherical_coordinate_system
の右上の図。

上記をlatitude, longitudeにどう関連付けるか。

$\theta$の定義は`[0, pi]`。latitudeの定義は`[pi/2, -pi/2]`とする(pi/2は北極点とする)。
関係式は以下と置ける (式4)。

```math
\theta = lat - pi/2
```

$\phi$の定義は`[0, 2pi)`として、どこを0に取るかは任意とすると、関係式を以下と置く (式5)。

```math
\phi = lon
```

式1..3に式4,5を代入して、加法定理を使うと以下を得る。

```math
x = -r cos(lat)cos(lon)
```

```math
y = -r sin(lat)sin(lon)
```

```math
z = rcos(lon)
```

http://qiita.com/s-wakaba/items/e12f2a575b6885579df7
の`latlng_to_xyz`の式と正負の符号が異なるのは未消化。

2点の距離を計算するときはzip()した値同士でかけて負号は消えるので、同じ結果にはなる。
( Osaka, Tokyo ): 403.63km
( London, Tokyo ): 9571.22km

上記リンクでは「何の式か」はコード自体からは分からない。

自分が理解しやすい[haversine法](https://en.wikipedia.org/wiki/Haversine_formula)を使う方が良さそう。
[iOS]StackViewのsubviewsの挙動

挙動がちょっと気になったので調べてみた。

<img width="682" alt="スクリーンショット 2017-03-27 18.56.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/a9a6e989-7cde-a760-3f25-6768bb5688c0.png">


subViewsは`addSubview`と`addArrangedSubview`の合計
arrangedSubviewsは`addArrangedSubview`だけのsubviewを返す。

特に違和感は無い。subViewsが合計なのだけ注意
All in One SEO Pack で出力される<link rel="prev/next">を消す

よく見る

```
remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10);
```
だけじゃ消えなくてなんでかなー、と眺めてたらAll in One SEO Packで出力されてました。

All in One SEO Pack で出力されるものを消すなら以下でできました。

```
add_filter('aioseop_prev_link', '__return_empty_string' );
add_filter('aioseop_next_link', '__return_empty_string' );
```
【Max/MSP】プロジェクトファイル(.maxproj)からMaxforLiveに書き出す際にハマったこと

Max7のプロジェクトでMaxforLiveデバイスを開発していていて、ハマってしまったことが解決できたのでメモしておきます（毎度のことながら全然高度な内容ではないです！）。

Max7から書き出したMIDIエフェクトが何度試してもAbletonLiveでオーディオエフェクトとして認識されてしまったのですが、フォーラムのこの記事を読んで謎が解けました。。

[Topic:Export Max for Live Device…](https://cycling74.com/forums/topic/export-max-for-live-device/#.WNjV7hKLSRs
)

下図のような操作をするだけです。

<img width="299" alt="スクリーンショット 2017-03-27 18.40.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/147344/f75946a4-7174-9f0d-0762-f958431faba2.png">

<img width="400" alt="スクリーンショット 2017-03-27 18.40.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/147344/b8874b97-cb0b-a9d5-c705-68500b8b120f.png">

※追記) プロジェクトを別名保存したタイミングでプルダウンがまた"Audio"に戻っている場合がありますのでその時はまた"MIDI"に戻すと解決します。

以上です！

日々このような試行錯誤をしつつ、曲をつくったりしてますのでご興味あれば聴いてみてください〜
[onigiri:SoundCloud](https://soundcloud.com/o_nigiri)
【超初心者用】Reactでinputタグに入力した文字を表示させる書き方

## 超初心者がReactの機能を使ってみた
inputタグに入力した文字をその下に設置したpタグに表示させてみました。
参考にさせてもらったサイト(丸写し)
[http://basic-react.axlight.com/html/lesson-08.html](http://basic-react.axlight.com/html/lesson-08.html)

## 作業環境
- Babel
- React
- ReactDOM

## 書いてみた

``` HTML:HTML
<div id="app"></div>
```

``` Javascript:React
let textData = '';
const textInput = (event) => {
  textData = event.target.value;
  if (textData.length > 10) {
    textData = textData.slice(0, 10);
  }
  render();
};

const MyBox = () => (
  <div>
    <input type="text" value={textData} onChange={textInput} />
    <p>{textData}</p>
  </div>
);

const App = () => (
  <div>
    <MyBox />
  </div>
);

const render = () => ReactDOM.render(<App />, document.getElementById('app'));
render();
```

ここまではなんとなく分かった（当たり前か。。）
拡張ライブラリの組み込み方法

# 拡張ライブラリの組み込み方法
　PepperにはPythonの標準ライブラリ（NAOqi2.4.3時点ではPython2.7.3でした）がインストールされており利用できます。ですが、アプリ開発では標準ライブラリ以外の拡張ライブラリを利用したい場面がでてきます。
　この記事では、Choregraphe上での拡張ライブラリの組み込み方法をステップバイステップで紹介します。拡張ライブラリが利用できることにより、Pepperのアプリ開発の可能性が広がるはずです。

# サンプルプロジェクトはこちら
https://github.com/Atelier-Akihabara/pepper-exlib-example

## ロード用ボックスの作成
### 手順
1.［Python］ボックスを作成します。
2.以下のコードを onInput_onStart(self): 以下に追加します。onStart入力が呼び出されるとsys.pathにプロジェクト内にある”lib”フォルダをシステムの読み込み対象に加えます。

```python:
def onInput_onStart(self):
	appFolder = self.behaviorAbsolutePath().replace(self.behaviorRelativePath(), "")
	self.folderName = os.path.join(appFolder, "lib")
	if self.folderName not in sys.path:
		sys.path.append(self.folderName)
		self.pathModified = True
	self.onReady()
```

3.以下のコードを onUnload(self): 以下に追加します。このコードはボックスがアンロードされる時追加されたライブラリパスをシステムから取り外します。

```python:
def onUnload(self):
	if self.pathModified and self.folderName and self.folderName in sys.path:
		sys.path.remove(self.folderName)
		self.folderName = None
```

4.作成した［Python］ボックスにonReady()出力を追加します。
5.［Python］ボックスの役割がわかるように［SetPathLibFld］と名前を変更します。

## ライブラリフォルダの作成
### 手順
1.［プロジェクトファイル］パネル内の［＋▼］ボタンを押します。
2.ポップアップメニュー［新規フォルダ…］をクリックします。
3.［ディレクトリの…］ウィンドウが表示され、名前に：”lib”を入力し［Create］ボタンを押します。プロジェクトに”lib”フォルダが追加されます。

![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/54394/250f1dca-b130-def6-b655-2a24bca80ddc.png)
図：ボックスとフォルダが追加された状態

## 拡張スクリプトのロード
　requestsライブラリを例にとり、拡張ライブラリを利用できる状態します。本記事はrequestライブラリでの操作を取り上げていますが、そのほかのライブラリでも手順は同様です。
### requestsライブラリの紹介
　requestsライブラリはpythonで簡単にREST APIを呼ぶことができる有用な拡張ライブラリです。requestsライブラリを使うことにより、接続が難しいWebAPIを比較的簡単な手順で接続できます。
参考：Requests: 人間のためのHTTP（プロジェクトHP）
http://requests-docs-ja.readthedocs.io/en/latest/

##手順
1.新たに［Python］ボックスを作成します。
2.先ほど作成したリネーム済みの［SetPathLibFld］ボックスのonReady出力に、新たに作成した［Python］ボックスのonStart入力を結線します。
3.以下のサイトより利用したい、requestsライブラリ（requests-2.11.1.tar.gz）をダウンロードし展開します。
https://pypi.python.org/pypi/requests/2.11.1
4.展開したフォルダに含まれるライブラリフォルダこの場合”requests”をプロジェクト下の”lib”フォルダにコピーします。ライブラリによってはフォルダを含まないことがあります。この場合はライブラリ名のスクリプトを”lib”フォルダ内にコピーしてください。

![fig2.png](https://qiita-image-store.s3.amazonaws.com/0/54394/d6fb0447-1445-801d-3925-e83c177b3329.png)
図：結線され、ライブラリフォルダが展開された状態
5.新たに作成した［Python］ボックスにrequestsを読み込むためのコードをonInput_onStart(self)に追加します。

```python:
def onInput_onStart(self):
	import requests
	self.logger.info(requests.get('http://www.yahoo.co.jp').text.encode('utf-8'))
```

　上記例では動作を確認するためYahoo!に接続しログにソースデータを書き出す動作となっております。
##依存するライブラリが他にも含まれる場合
　ライブラリによっては読み込むコードを実行する段階でエラーになることがあります。依存するライブラリが足りない場合は、エラーが出なくなるまで3.〜4.までの操作を繰り返し行ってください。（依存ライブラリが不足している場合、エラーメッセージにどのライブラリが不足しているかの情報が含まれております）
【Windows&Mac】基本の必須キーボードショートカット集

## はじめに
個人的に必須だと思う基本的なショートカットのメモです。
この中でも特にCtrlキーを使うショートカットはすぐ覚えた方がいいです。

ほとんどのショートカットはどのアプリでも共通で使うことができ、修飾キーを押しっぱなしで組み合わせのキーを押した回数だけ動作を繰り返せます。

この記事ではMacの修飾キー記号を使っていませんが、どの記号がどの修飾キーかは、覚えるとはかどります。

MacのCaps Lockキーを `システム環境設定 > キーボード > 修飾キー` でcommandキーに変更しておくと、Windows感覚でショートカットを使いやすくなります。お好みでどうぞ。

**太字はマウスジェスチャやトラックパッド拡張ソフトへの登録を強く勧めます。**それがなにかはこの記事では説明しないので、よければ調べてみてください。

Linuxは知らん。



## 編集
| Windows | Mac | 動作 |
|:--|:--|:--|
| Ctrl + A | command + A | 全選択 |
| Ctrl + S | command + S | 上書き保存 |
| Ctrl + C | command + C | コピー |
| Ctrl + V | command + V | 貼り付け |
| Ctrl + X | command + X | 切り取り |
| Ctrl + Z | command + Z | 元に戻す（アンドゥ） |
| Ctrl + Y | shift + command + Z | やり直す（リドゥ） |
| Shift + カーソル移動 | shift + カーソル移動 | 範囲選択 |
| Delete | fn + delete ,<br> control + D | 後の文字の削除 |
| Ctrl + BackSpace | option + delete | 前の単語削除 |
| Ctrl + Delete | option + fn + delete | 後の単語削除 |
| 知りません | command + delete | 行頭まで削除 |
| F7, Ctrl + I, 無変換 | F7, control + K | 未確定文字を全角カタカナに変換 |
| F10, Ctrl + T | F10, control + ; | 未確定文字を半角英数字に変換 |

見出しは「編集」となっていますが、当然ファイルの操作やブラウザなどでも使えます。

Ctrlキーでの変換はIMEによっては異なる場合があります。
WindowsのCtrlキーを使う変換は、多分MS-IMEやOffice IME固有のもので、Google日本語入力やATOKとは違うキーかもしれません。
MS-IMEは私はあまり使いやすいとは思わなかったので、Google日本語入力などに変えることを勧めます。


## カーソル移動
| Windows | Mac | 動作 |
|:--|:--|:--|
| Ctrl + ← or → | option + ← or → | 単語移動 |
| Home | command + ← | 行頭に移動 |
| End | command + → | 行末に移動 |
| Ctrl + Home | command + ↑ | **最初に移動** |
| Ctrl + End | command + ↓ | **最後に移動** |

HomeとEndが無いキーボードの場合 `Fn + なにか` でいけます。青字などでどこかのキーに印字されています。



## ウィンドウ＆タブ＆ブラウザ系
| Windows | Mac | 動作 |
|:--|:--|:--|
| Ctrl + N | command + N | 新規ウィンドウ |
| Ctrl + T | command + T | **新規タブ** |
| Ctrl + W | command + W | **タブ(orウィンドウ)を閉じる** |
| Ctrl + Tab | control + tab ,<br> command + { (shift+[) | **次のタブへ移動** |
| Ctrl + Shift + Tab | shift + control + tab ,<br> command + } (shift+]) | **前のタブへ移動** |
| Alt + Tab | option + tab | ウィンドウの切り替え |
| Windows + D | 知りません | ウィンドウを全て最小化、もう一度押せば復元 |
| Ctrl + クリック ,<br> ホイールクリック | command + クリック ,<br>  ホイールクリック | **リンクを新規タブで開く** |
| Ctrl + Shift + T | shift + command + T | **閉じたタブを復元** |
| Ctrl + L | command + L| アドレスバーにフォーカス |

**ここらへんはマウスジェスチャやトラックパッド拡張ソフトに登録しておくと、ブラウジングを筆頭にPC操作が劇的に楽になります。感動します。**


## その他
| Windows | Mac | 動作 |
|:--|:--|:--|
| Esc | esc | **ダイアログを消したりキャンセルしたり** |
| Delete | command + delete | ファイルの削除など |
| Tab | tab | Webページなどで次の入力フォームやボタンに移動 |
| Shift + Tab | shift + tab | 前の入力フォームやボタンに移動 |
| F5, Ctrl + R | command + R | **リロード** |
| Windows + E | 知りません | エクスプローラー起動 |
| Alt + ↑ | command + ↑ | エクスプローラーやFinderで上の階層に移動 |
| Alt + F4 | command + Q | プログラムの終了 |
| Alt + Enter | command + I | **プロパティ表示** |

Enterキーもマウスジェスチャに登録すると結構便利ですよ。


## おわりに
スマホの時代になり、普段PCを使っていてもあまりショートカットを知らない人が増えているかと思います。
基本的なものだけでも使えるようになると、PC操作の効率がかなり上がるのでどんどん覚えていきましょう！
fishでtmuxの空いてるセッションにアタッチする

http://qiita.com/ssh0/items/a9956a74bff8254a606a

これがしたいんだけど、fish scriptがアレすぎて「bash script to fish script」とかでググり続けた結果…。


fishermanから
https://github.com/fisherman/fisherman

bass入れて
`fisher edc/bass`

`vim  ~/.config/fish/functions/tmux.bash.sh`

```tmux.bash.sh
if [[ ! -n $TMUX && $- == *l* ]]; then
  # get the IDs
  ID="`tmux list-sessions`"
  if [[ -z "$ID" ]]; then
    tmux new-session
  fi
  create_new_session="Create New Session"
  ID="$ID\n${create_new_session}:"
  ID="`echo $ID | $PERCOL | cut -d: -f1`"
  if [[ "$ID" = "${create_new_session}" ]]; then
    tmux new-session
  elif [[ -n "$ID" ]]; then
    tmux attach-session -t "$ID"
  else
    :  # Start terminal normally
  fi
fi
```

という感じでそのままコピペして…

`chmod 755 ~/.config/fish/functions/tmux.bash.sh`

権限あげたら

`vim ~/.config/fish/config.fish`

```config.fish
bass ~/.config/fish/functions/tmux.bash.sh
```

`source ~/.config/fish/config.fish`

動いた。

#教訓

fishで動かないものはbassにsh投げろ
《Wordpress》Contact Form 7でメールアドレスの再入力チェック


入力フォームプラグイン「Contact Form 7」で、メールの再入力チェックを行いたいときのコードです。
UI的にはイマイチですが、この実装は要件によく含まれますね。


## フォームの編集

WordPressの管理画面のコンタクトフォームの編集画面から以下のコードを入力します。

```html

[email* inquiry_mail]
[email* inquiry_mail_confirm]

```

確認用のコードの`name`属性の末尾に`_confirm`を記述します。



## function.phpの編集

「function.php」に以下のコードを記述します。

```php

function wpcf7_main_validation_filter( $result, $tag ) {
  $type = $tag['type'];
  $name = $tag['name'];
  $_POST[$name] = trim( strtr( (string) $_POST[$name], "\n", " " ) );
  if ( 'email' == $type || 'email*' == $type ) {
    if (preg_match('/(.*)_confirm$/', $name, $matches)){
      $target_name = $matches[1];
      if ($_POST[$name] != $_POST[$target_name]) {
        if (method_exists($result, 'invalidate')) {
          $result->invalidate( $tag,"確認用のメールアドレスが一致していません");
      } else {
          $result['valid'] = false;
          $result['reason'][$name] = '確認用のメールアドレスが一致していません';
        }
      }
    }
  }
  return $result;
}

add_filter( 'wpcf7_validate_email', 'wpcf7_main_validation_filter', 11, 2 );
add_filter( 'wpcf7_validate_email*', 'wpcf7_main_validation_filter', 11, 2 );

```


おわります。
NoMethodError: undefined method `name' for nil:NilClass と出たら... パーフェクト Ruby on Rails

# パーフェクト Ruby on Rails p.54の操作中「NoMethodError: undefined method `name' for nil:NilClass」のエラーが出たら...

Railsのバージョンを指定の4.1.1から、4.1.2にバージョンアップさせましょう。

```:Gemfile
gem 'rails', '4.1.2'
# railsのバージョンを書き換え
```

```:Terminal
bundle update rails
# railsのバージョンを書き換えをGemfile.lockに反映 
```

```:Terminal
bundle install
```

エラーが出るのは、Railsのバグが原因だそうです。

参考：[one by one 「NoMethodError: undefined method `name' for nil:NilClass」](http://tsyknsr.hatenablog.com/entry/2016/03/26/153129)
Scrapboxを使ってみた


# Scrapboxで出来る書き方の太字について
 - [[Hello,world！]]
  - ↑このように書くと太字になります。
 - [* Hello,world！]
  - ↑このように書いても太字になります。
   - この場合、*の数によって大きさが変わります。
    - 数が大きいほど大きくなり、最大10段階あるようです。
![Screenshot_20170327-173309.png](https://qiita-image-store.s3.amazonaws.com/0/170642/5e185e44-bd87-ad1a-f57b-36eae52f8ba8.png)
 - 太字0 → [[Hello,world！]]
 - 太字1 → [* Hello,world！]
 - 太字2 → [** Hello,world！]
 - 太字3 → [*** Hello,world！]
 - 太字4 → [**** Hello,world！]
 - 太字5 → [***** Hello,world！]
 - 太字6 → [****** Hello,world！]
 - 太字7 → [******* Hello,world！]
 - 太字8 → [******** Hello,world！]
 - 太字9 → [********* Hello,world！]
 - 太字10 → [********** Hello,world！]
JavaScriptでbackground-imageを取得した時のブラウザ間差異メモ

一人日を無駄にした哀と怒りと悲しみをぶつけるメモ

```JavaScript:hoge.js
var path = $("#hoge").css("background-image");

（jQuery使わないとめんどくさすぎる）

var path = document.defaultView.getComputedStyle( document.getElementById("hoge"), null ).getPropertyValue( 'background-image' ));
```

IE11(on Win8/10),chrome(on Win8/10)
url("https://foobar.jp/bg.jpg")

IE Edge(38 on Win10)
url(https://foobar.jp/bg.jpg)

もしもし、ポリスメン？

---
画像の差し替えルーチンがうまく動作せず。
ダブルクォーテーションの有無に気づかずEdgeのみ動作不良→直したと思ったら反対側が壊れ
本当にIEの罪は重い。闇も深い。生きてて恥ずかしくないのかしら……

とりあえず楽な解決策は

```JavaScript:hoge.js
path.replace('"','');
```
をくぐらせて統一するとかかしら。
Express4.xのディレクトリインデックスでハマった話

## ファイル構成
`/404/index.ejs` (404の場合ここへリダイレクトするよう設定してある)
`/403/index.ejs`

## どうしたいのか
http://example.com/403/ にアクセスした時に`index.ejs`を表示したい

## 現象
http://example.com/403/ にアクセスしても404に繋がる

## 原因
`.ejs`にしていたのが原因

## 解決方法
`.html`にすればいい

### .ejs を使いたい場合
`app.get('/path', function (req, res) {});`とか書いて自分でルーティングすればいい(と思う)
3 key points of SAP ABAP Parallel Processing

#What I've learned from the last project
In the last project, I faced many issues with SAP parallel processing.  
Many people often simply just parallelize ABAP jobs, which are designed and have run as single process.  As a result, thoughtless parallelizations cause many problems.  In this article, I'm going to share 3 key points of SAP ABAP Parallel Processing.

#Parallel Processing is great!
First of all, I want to be clear that I'm not against parallel processing.  Actually I really love and evaluate it highly.
SAP BAPI processes tend to be slow, since SAP implemented so much logic in them.  We cannot modify SAP standard codes, so there are limited ways to improve performance with single process.  In such case, parallelization is easy and powerful method to update many data.

#SAP ABAP Parallel Processing methods
Though ABAP server is not for distributed computing, like Apache hadoop and Spark, it has several strong ways for parallel processing.
1. Simple Parallel Background Process
Firstly, I introduce a very simple way.  Just run background jobs parallel via t-cd:sm37 or job schedule soft.  Is is so simple that no specific knowledge is unnecessary.  If you don't trust your engineers much,  this way is the best, even though you couldn't get additional advantages.
2. aRFC
aRFC is an abbreviation of asynchronous RFC.  I really love the aRFC, since we can dynamically change the number of parallel processing.
Please look at the article ["ABAP aRFC Call Sample Program"] (http://qiita.com/FukuharaYohei/items/9e07de9d07e743215531) for sample program.
Make sure **aRFC uses dialog work processes**, not background work processes.

* You can configure server group settings via t-cd:rz12.

* You can monitor aRFC resources via t-cd:sarfc.

Also see the [SAP Help](https://help.sap.com/saphelp_nwpi71/helpdata/en/22/042592488911d189490000e829fbbd/content.htm).
3. others(bgRFC, tRFC, qRFC)
I haven't used bgRFC, tRFC and qRFC.  

#3 key points of Parallel Processing
You have to cosider these points for parallelized processes.

1. Key duplicate and time series
Key duplicate and time series are the most important things, since when you divide input data, a program doesn't know other divided process's data and may update master/transactions using old data.  So when there are duplicate data, to summarize same key data is the first thing to do.

2. Lock
Lock is not preferable for parallel processing, since parallelized processes may lock same key data.  So only to insert into table(no update), or to collect same key data into one process is necessary. 

3. UPDATE TASK LOCAL
Usually DB processes become bottleneck when parallel processing.  To eliminate unnecessary DB processes are one of the most important consideration for parallel processing.  When using ["SET UPDATE TASK LOCAL"](https://help.sap.com/http.svc/rc/abapdocu_751_index_htm/7.51/en-US/abapset_update_task_local.htm), commit processes don't use table update, so DB can process more and faster.
Gedit からテキストをコピペしようとしたら固まる問題についての解決方法


Gedit からテキストをコピペしようとすると固まるバグが報告されています。

* https://bugzilla.redhat.com/show_bug.cgi?id=1413858
* https://bugzilla.gnome.org/show_bug.cgi?id=782694

# 現象

私の環境でも発生しました。

* Fedora25
* Gedit 3.22.0

固まったあとに `journalctl -n 100` してログを見ると次のエラーが出力されていました。

```
Mar 27 17:03:51 localhost.localdomain gedit[3139]: Error writing selection data: Error writing to file descriptor: Broken pipe
Mar 27 17:03:51 localhost.localdomain gedit[3139]: Error writing selection data: Error writing to file descriptor: Broken pipe
Mar 27 17:03:51 localhost.localdomain gedit[3139]: Error writing selection data: Error writing to file descriptor: Broken pipe
Mar 27 17:03:53 localhost.localdomain gedit[3139]: Error writing selection data: Error writing to file descriptor: Broken pipe
Mar 27 17:03:55 localhost.localdomain gedit[3139]: Error writing selection data: Error writing to file descriptor: Broken pipe
Mar 27 17:03:57 localhost.localdomain gedit[3139]: Error writing selection data: Error writing to file descriptor: Broken pipe
Mar 27 17:03:59 localhost.localdomain gedit[3139]: Error writing selection data: Error writing to file descriptor: Broken pipe
Mar 27 17:04:01 localhost.localdomain gedit[3139]: Error writing selection data: Error writing to file descriptor: Broken pipe
```

# 解決方法

Wayland が上手く動いていないことが原因です。

https://blogs.gnome.org/mclasen/2016/03/04/why-wayland-anyway/
に書いてある方法でログイン時に Xorg を選択すると発生しなくなります。
JSON と YAML の対応データ型の比較メモ

JSON には日時型が無いため、任意の日時形式の文字列や Unix time の整数型で表現したりします。

一方 YAML の方は日時型に対応していることを知り衝撃を受けたので、対応するデータ型の違いを比較してみました。

## 対応データ型の比較表

**YAML は JSON のスーパーセット** のため、JSON で表現できるものは基本的に全て YAML でも表現出来ます。

| 型名 | Type name | YAML | JSON | 値の例 |
|----------------|-----------|------|------|--------|
| 文字列 | string | ○ | ○ | `"apple"` |
| 整数 | integer | ○ | ○ | `123456` |
| 浮動小数点 | float | ○ | ○ | `123.456` |
| 真偽値 | boolean | ○ | ○ | `true`, `false` |
| Null値 | null | ○ | ○ | `null` |
| 配列 | array (sequence) | ○ | ○ | `["value1", "value2"]` |
| オブジェクト | object (map) | ○ | ○ | `{"key": "value"}` |
| タイムスタンプ | timestamp | ○ | ✕ | `2002-12-14`<br>`2002-12-14 10:00:00` |

上記に記載した型は全てではありません。
YAML で表現できる全ての型を知りたい場合は以下も参照してみてください。

- [Language\-Independent Types for YAML™ Version 1\.1](https://yaml.org/type/)

## タイムスタンプ型の YAML 記述例

```yaml
canonical:        2001-12-15T02:59:43.1Z
valid_iso8601:    2001-12-14t21:59:43.10-05:00
space_separated:  2001-12-14 21:59:43.10 -5
no_time_zone:     2001-12-15 2:59:43.10
no_time:          2002-12-14
```

特徴を掻い摘むと、

- 秒の少数まで指定できます。
- タイムゾーンの指定もできます。省略すると UTC と見なされます。
- 時刻以降の部分を省略すると 00:00:00 UTC と見なされます。

といった感じです。

詳しくは [YAML の Timestamp 型の仕様書（原典）](https://yaml.org/type/timestamp.html) を参照するのが最も正確でしょう。

尚、日時形式の文字列をダブルクォーテーションで囲むと普通に文字列型として扱われます。

## 参考

- [Timestamp Language\-Independent Type for YAML™ Version 1\.1](https://yaml.org/type/timestamp.html)
- [The Official YAML Web Site](https://yaml.org/)
- [RFC 7159 - The JavaScript Object Notation (JSON) Data Interchange Format](https://tools.ietf.org/html/rfc7159)
- [Rubyist Magazine \- プログラマーのための YAML 入門 \(初級編\)](http://magazine.rubyist.net/?0009-YAML#l8)
TextMeshPro!で、文字毎の送り幅を変える

### なぜ変えたいのか
大抵の場合、引用符でクォーテーションマークとダブルクォーテーションマークはそれぞれ ' と " を使っているかと思います。
しかしアート側からの要求で ’ と ‘ や ” と “ を使って欲しいという要求があったりします。
uGUIの普通のTextでこれらを出すと、見た目には半角なのに幅は全角あって、微妙に隙間が出てしまいます。
これを何とかしたかった。

### どうやるか
ひとまずはFontAssetCreatorで当該文字を含むビットマップフォントを作ります。
できあがったら、保存してProjectツリーに含まれたそれを選択。Inspectorの下の方にあるGlyph Infoを展開します。

![スクリーンショット 2017-03-27 17.24.34.png](https://qiita-image-store.s3.amazonaws.com/0/48561/685b8dff-5f2f-85e9-7ced-8decfb69219b.png)

今回必要な情報はOXとADVになります。

- OX
    - これから文字が表示される場所の左下を原点として、この文字の描画開始位置の横座標
- ADV
    - 文字送り幅

ADVの値ですが、通常のアルファベットなどが30前後の所、60も取っています。
これをそれぞれ20程度にし、 “ については描画開始位置が随分と右にあるので、ひとまず ” と同じにしました。

![スクリーンショット 2017-03-27 17.15.19.png](https://qiita-image-store.s3.amazonaws.com/0/48561/f8ccc172-421d-f171-c558-7405c53234d3.png)

これで完了です。