OmniAICreator/Qiita-1.07M huggingface dataset:
redux-saga での stateの取り方 備忘録

#redux-saga での stateの取り方

saga でaction の内容を取るときは```take```を使ってキャッチしてこれる

```javascript
const action = yield take('GET_HOGE');
```

ここから```action.type```とか```action.payload```とかを色々使う

##やりたいこと　

###stateとactionを比較してputしたい


現在の```state```情報はactionには入って来ないのでちょっと困った

なので ```select```を使う
[redux-saga 公式 select()](https://github.com/redux-saga/redux-saga/tree/master/docs/api#selectselector-args)

公式のAPIを見ると```select```は ```getState()```と一緒だよって公式に書いてある

```javascript
import { select } from 'redux-saga/effects';

const state = yield select();　　// store.getState()と同じ

```

これで一旦、stateの情報は全て取ってこれる

ここから必要な情報だけ取ってくる


##selectors を作成
hoge state を取ってくるselectorを作成


```javascript:selectors/index.js

export const getHoge = state => state.hoge;

```

これをimport して　```select()```の引数に与える

```javascript

import { select } from 'redux-saga/effects';

//selector
import { getHoge } from 'selectors';

const state = yield select(getHoge);

```

これでHogeのstateが取ってこれた！！以上！
[正規表現]ASCII（非マルチバイト）だけの文字列を検出する

## 要旨
unicode(正確にはutf8)を前提に、全角か半角かわからない文字列を与えられている時にそれが確かにASCIIであると判別する正規表現を書けますか？
※タイトルが逆だったりと、何かとあれあったので整理しました。

# 結論
<http://rubular.com/>で色々試したところ
`/\P{ascii}+/` あるいは `/\p{ascii}+/`というシンプルな表記で（日本語以外含む）「マルチバイト文字列」と「ASCIIのみの文字列」を判別できるということを発見しました。[^1]

`/\P{ascii}+/` は
 ```
/[^_a-z\~\`\!\@\#\$\%\^\&\*\(\)\-\+\=\[\]\{\}\|\;\:\\'\"\,\.\<\>\/\?\/\d\s]+/i
```
に相当します。
もちろん"Ａｓｃｉｉ"などの全角英数もきちっと判別できます。
↑なんで`\w`使わないの？って思うかもしれませんが、perlでは`use utf8`支配下では**`\w`はほとんどのマルチバイト文字にマッチしてしまうので使えません。**

ちなみに**perl[^2]以外は試してません**ので、これが通る他の言語を教えてもらえたらタグ付けしますので**編集リクエストお願いします。**

なお、MacのUSキーボードなどで入力できる[˜ˆ]は、@scivolaさんのコメントによりマルチバイト文字と判明しました。[^3]

## 背景（という以下蛇足）
全角半角入り混じるvCardデータを[拙作のモジュール](https://github.com/worthmine/Text-vCard-Precisely-V3)で[Text::LineFold](http://search.cpan.org/~nezumi/Unicode-LineBreak/lib/POD2/JA/Text/LineFold.pod)を駆使して、マルチバイト文字列ならスペース一個、非マルチバイト文字列(要するにasciiのみの文字列)ならスペース二個でFoldしないと正しいvCard形式にならないという問題を解決したかった。
モジュールの要旨からして日本語文字列を検出できれば良いというわけではなく、全世界的に対応させたかった。

##　おしい参考文献など

- [非 ASCII 文字を含む行を検出](http://d.hatena.ne.jp/mooz/20090814/p1)[^4]
- [ASCII文字列以外を検出する正規表現](https://oshiete.goo.ne.jp/qa/2657990.html)[^5]
- [正規表現で ASCII 文字列にマッチさせる](http://qiita.com/key-amb/items/1a9d67740324b39b7aaa)[^6]

---
[^1]: 願望を入力したら通った…
[^2]: 要perl-5.12.5以上
[^3]: `˜`は ASCII のチルダ（~ U+007E TILDE）ではなく U+02DC SMALL TILDE。二文字目の `ˆ`は ASCII のサーカムフレックス（^ U+005E CIRCUMFLEX ACCENT）ではなく U+02C6 MODIFIER LETTER CIRCUMFLEX ACCENT だそうです。
[^4]: これはなるほどな、って記述ですが、そのまま使うとタブや改行にはマッチしてしまうようだ。`[^ -~\s]`ならOK
[^5]: 言語依存のようだ
[^6]: ASCIIだけを抽出するコードとしては正しいが、`\p{ascii}`に関する言及がない
GNU GLOBALのプラグインパーサーを作ってみた

## はじめに

GNU GLOBALのプラグインパーサーにはExuberant Ctagsを使ったものやPygmentsを使ったものがあります。

Pygmentsを使ったプラグインパーサーはとても便利なので、改めてプラグインパーサーを作るメリットはあまりありません。しかし、Pygmentsを使うためにはいろいろなものをインストールしなければならず少し面倒です。プラグインパーサーを作ることによって、それらのインストールの手間を省くことができます。

インストールの手間を省くことによって環境構築が楽になるだろうと思ったのと、単純に作ってみたくなったというのがプラグインパーサーを作った動機です。

## GitHub

[こちら](https://github.com/t-mochizuki/gnu-global-plugin-parser)に作ったものを上げました。詳細はソースコードを確認していただければと思います。

## 発想の転換

なぜ作ってみたくなったのかについて少し追記したいと思います。

以前にもプラグインパーサーを作ろうとしたことがありました。そのときはScalaの構文を完全にパースすることを目標にしていましたが、雲をつかむような感じでまったく手が動きませんでした。結局、そのときは挫折してしまいました。

しかし、よく考えてみると欲しいのはclassキーワードとtraitキーワードとobjectキーワードで定義しているものでした。つまり、Scalaの構文を完全にパースせずとも目標を達成することができることに気付きました。この発想の転換のおかげでもう一度トライしてみよう、トライしてみたいという気持ちが高まりました。

## まとめ

必ずしも発想の転換がいいことだとは言えませんが、今回はいい効果があったと思っています。

あと、今日は社内ハッカソンでそれを試す絶好のチャンスでした。こういうイベントのある会社は少ないかもしれません。会社にも感謝です :pray:

## 参考URL

- [GNU GLOBALの対応言語を大幅に増やすPygmentsパーサーを導入する](http://qiita.com/yoshizow/items/9cc0236ac0249e0638ff)
- [strtok](http://www9.plala.or.jp/sgwr-t/lib/strtok.html)
- [strcmp](http://www9.plala.or.jp/sgwr-t/lib/strcmp.html)
- [strstr](http://www9.plala.or.jp/sgwr-t/lib/strstr.html)
Django x Apache x mod_wsgiの環境をVagrant(Ubuntu16.04)でつくる

PythonをApacheとかNginxとかのWEBサーバで動かす場合は、WSGIという仕組みを間にかませる必要があります。WSGIの仕組みはシンプルなようですが、まだ詳しく調べてはいないです。WSGIを間にかませることから、PHPよりはちょっとめんどくさいです。でも一度覚えれば準備工数に差はほとんどありません。この投稿では、VagrantのUbuntu16.04上で、DjangoとApacheでWEBアプリケーションを動作させるようにしてみます。今回はPyenvは入れずに、既にインストール済みのPython3.5を使って設定します。

# 環境
- Windows10
- Vagrant 1.9.3
- Ubuntu16.04
- Python 3.5.2
- Apache/2.4.18 (Ubuntu)

# Vagrantfileの設定
Ubuntu 16.04のボックス(ubuntu/xenial64)を使います。

```Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"
  config.vm.network "forwarded_port", guest: 80, host: 9090, host_ip: "127.0.0.1"
end
```

# Vagrantを立ち上げて入る

```
$ vagrant up
$ vagrant ssh
```

# Apache2をインストール

```
$ sudo apt-get update
$ sudo apt-get install -y vim apache2 apache2-dev
```

# mod_wsgiをインストール

```
$ sudo apt-get install -y libapache2-mod-wsgi-py3
```

# Djangoをインストールして、アプリを作成する

```
$ sudo apt-get install -y python3-pip
$ sudo pip3 install --upgrade pip
$ sudo pip3 install django
$ mkdir /vagrant/django
$ cd /vagrant/django
$ django-admin startproject mysite
```

# apache2の設定
## django.confを作る

`/etc/apache2/sites-available/django.conf`を新たに作成します。


```/etc/apache2/sites-available/django.conf
<VirtualHost *:80>
  WSGIDaemonProcess mysite python-home=/usr python-path=/vagrant/django/mysite
  WSGIScriptAlias / /vagrant/django/mysite/mysite/wsgi.py process-group=mysite
  <Directory /vagrant/django/mysite/mysite>
    <Files wsgi.py>
      Require all granted
    </Files>
  </Directory>
</VirtualHost>
```
WSGIの各パラメタは大体下記のような感じ。[ここ](https://modwsgi.readthedocs.io/en/develop/user-guides.html)に詳細のマニュアルがあるので、不明点やエラーが出る場合はこれを頑張って読む必要がある。

- WSGIDaemonProcessのpyhton-homeは、下記で確認できる。

 ```
 $ python3
 >>> import sysconfig
 >>> sysconfig.get_config_var('prefix')
'/usr'
 ```

- python-pathは、Djangoプロジェクトのルートフォルダのパス。
- WSGIScriptAliasは、最初の/が、アプリケーションのベースとなるURLパス。/の場合はWEB ROOTになる。2番目の部分は、WSGI fileの場所。

## django.confを有効化させる

デフォルト設定を無効化し、`django.conf`を有効化させます。

```
$ sudo a2dissite 000-default
$ sudo a2ensite django
```

apache2を再起動します。

```
$ sudo systemctl restart apache2
```
go vetの使い方(go vetとは)

## ReadMeFirst

* go vetとは

goの標準パッケージに含まれるコードの静的解析ツールです。
公式documentは[こちら](https://golang.org/cmd/vet/)

```
Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string. 
Vet uses heuristics that do not guarantee all reports are genuine problems, but it can find errors not caught by the compilers.

VetはGoのソースコードを検証し、疑わしいコードを報告してくれます。例えば、Printfの呼び出しにおいて、引数とフォーマットが間違っているだとか。
Vetは、全ての報告が本当に問題かを保証しない。しかしコンパイルでは見つけられないエラーを見つけることができます。
```

原文をぽく直訳すると、 ` ちょっと難しくてヨクワカンネ ` 感あるんですが。
ワタシ、ソンナ、エイゴ、トクイデナイ

要するに


` 本当に問題になるかは分からないし、ビルドは通せるんだけど、こういう懸念があるかもね ` 的な問題を
コンパイラとは別の観点でチェックしサジェストをしてくれる、賢い子です。

原文では

```
Note that the tool does not check every possible problem and depends on unreliable heuristics 
so it should be used as guidance only, not as a firm indicator of program correctness

vetは、全ての問題をチェックするわけではないし、経験則みたいな信頼性の低い物に依存してるから
あくまでガイダンス的な使い方をするのが正しくて、プログラムが正しいかどうかの指標にはしないでね。
```

と書いてありますが、

` これは明らかにエラーでしょ ` と言うわけではないけど ` こういう問題でない？大丈夫？ ` レベルでも
情報としてはありがたい物で実行してみて損はないと思います。適用の有無は自身ないしチームで定めればよいので。

## go vetの使用方法・flagなど

と言うことで使い方です。

```
go vet package/path/name # package単位
go tool vet /path/to/*.go # file単位
go tool vet /path/to/directory # directory単位
```

` go doc cmd/vet ` でdocumentも見れます。
defaultで -allが有効なので、一部の意図的にdisabledな物(shadowとか)を除いては
特に指定しなくても検知可能です。

## go vetが検知してくれた例

* Unreachable code
* Shadowed variables
* bad syntax for struct tag value
* no args in Error Call
* Mutex Lock
* UnSafePointer

ロジック上絶対たどり着かないコードがあるよ、とか、引数に明示的にnil渡せと言う細いものから、JsonやXormなど構造体のプロパティをタグ付けしてる場合に
教えてくれたりする、コンパイルでは気づけないけど、実行コケるのでいい子もあったり。
Mutexまわりなど普段意識することないところもあると思うので良いと思います。

## まとめ

vetのsuggestする内容は、一部別に、そこまでせんでもええんちゃう？(No Args In Error Call)とか。
みたいなところとかはあるんですが。
使って損はない機能だと思いますし、フラグでカスタマイズしてcommit-hook、CI、reviewBotの検証項目に追加してもよいのかなと。
自分のコードに是非一度かけてみてください :smile:

## 参考

[go vet cmd](https://golang.org/cmd/vet/)
Redux の reducer を非同期取れるようにしてみた

Reduxへの理解を深めるために、コードをいじってみて、どれぐらい大変か確認してみた。
**実験的なものなので、プロダクションでは使わないように**

https://github.com/mizchi/redux


## 発想

主にここ
 https://gist.github.com/mizchi/d4a8455ef56a7adc123a388b3a5eaaaf

redux の reducer は非同期も取りたい。具体的には `f(state: State, action: Action): State` ではなく `f(state: State, action: Action): State | Promise<T>` としたい


## できたもの

reducer が async/await で(Promiseで)書ける。

```js
export default async (state = 0, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return state + 1
    case 'INCREMENT_ASYNC':
      await new Promise(done => {
        setTimeout(done, 500)
      })
      return await Promise.resolve(state + 1)
    case 'DECREMENT':
      return state - 1
    default:
      return state
  }
}
```

実際の挙動。

![](https://i.gyazo.com/6e67a6a0b8f86ba8b3fde9bbf7a68e44.gif)

## 感想

実際に作ってみると、ひたすら async await キーワードが伝搬していく感じだった

https://github.com/mizchi/redux/commit/601a4634a5f6fe08049d4fee3e67e3bfc410ae9a#diff-01b6e016dc33dc6cf4466e7abd376200R150

互換のものを作ろうとすると、どこまで仕様で、どこから仕様じゃないか理解してないと、この先書ける気がしなかった。似て非なるものを作るのは簡単。middleware を非互換に、subscribe を書き直すといい。

```
⋊> ~/p/redux on master  yarn test
 PASS  test/typescript.spec.js
 PASS  test/createStore.spec.js
 PASS  test/combineReducers.spec.js
 PASS  test/applyMiddleware.spec.js
 PASS  test/bindActionCreators.spec.js
 PASS  test/compose.spec.js
 PASS  test/utils/warning.spec.js

Test Suites: 7 passed, 7 total
Tests:       16 skipped, 51 passed, 67 total
Snapshots:   0 total
Time:        5.181s
Ran all test suites.
```

非同期APIを取ることでそもそもテスト側を障る必要もあり、互換というわけではない。
全然関係ないが、 jest のアサーションが非同期に対して貧弱すぎてクソという感想をもった。

## できなかったこと

- オリジナルの Middleware と互換にしたかったが、実行順の関係で、非同期用に書き直さないといけないとたぶんダメ。src/compose.js を読み切ればなんかできるかも。
- subscribe されたものが発火する順番が、オリジナルと変わってしまっている。

そもそも middleware 使わなくていいように reducer で非同期取れるようにしてるんだから、Middlewareは redux-logger が動くぐらいでいいのかもしれない。subscribe はなんとかしたい。

この辺で時間切れ
rubyのtimesメソッドを多次元に拡張してみる

rubyには `3.times { |i| do something }` みたいな便利なメソッドがあるが、これを二次元以上でもできたら便利かなと思ったので書いてみた。

すでにありそうな気もするし、クラスにダイレクトにメソッドを突っ込むのもどうかと思うのだが、実装例ということでとりあえず。 ;-)

```ruby
[2,2].times { |i,j| puts "#{i},#{j}" }
```

というような感じで使います。


```ruby
#
# usage: [2,2,2].times { |i,j,k| do something... }
#
class Array
  def times(&block)
    raise unless block_given?
    return nil if empty?
    dim_call__(nil, self, &block)
  end

  private
  def dim_call__(stack, dims, &block)
    stack ||= []
    if dims.size == 0
      block.call(*stack)
    else
      t = dims[0]
      l = dims[1..-1]
      t.times do |i|
        stack.push(i)
        dim_call__(stack, l, &block)
        stack.pop
      end
    end
  end
end
```
gist:
https://gist.github.com/chsh/0ffe801e2243059fb9f4a6d01770eaa6
RailsアプリををMacで動かす

- MacOS EL Capitan 10.11.6

会社で使っているMacが調子悪いので、クリーンインストールしてみた。
全くの素の状態から、Rails環境作ったこと無かったのでメモがてら残す。

- Chrome
- iTerm2
- Homebrew
- git
- rbenv
- Ruby
- PostgreSQL

# Chrome
当然、`Chrome`は入っていないので`Safari`を立ち上げてインストールする
https://www.google.co.jp/chrome/browser/desktop/

# iTerm2
ターミナルのちょっといいやつですね。
クリーンインストール前のターミナルは見た目もそれなりにカッコよくて普通に使っていたのだが、画面は薄い黒だし文字は緑だしで、見てるだけでイライラしたので`iTerm2`をゲットする
https://www.iterm2.com/

# Homebrew
`iTerm2`を立ち上げて`Homebrew`をインストール

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

==> Next steps:
- Run `brew help` to get started
- Further documentation:
    http://docs.brew.sh
```

https://brew.sh/index_ja.html

# git
ここからは`iTerm2`上でのお話です

```
$ brew install git
```

`git`をインストールできたら、Railsプロジェクトを`github`から取ってくる
単純に`https`でインストールするとエラーになる


```
$ git clone https://github.com/hoge/project.git
Authentication failed
Repository not found.
```


で解決方法だけど、

```
$ git clone https://[githubに登録したusername]:[githubに登録したpassword]@github.com/hoge/opiyo.git
```


って書いてあるけど、うまくいかなかった。
なので、githubにsshの設定してやったら上手くいった

```
$ cd .ssh/
$ ssh-keygen -t rsa -C hoge@gmail.com　→　鍵生成
$ ssh-add ~/.ssh/id_rsa　→　パスワードの保存をしてくれる　次回からパスワードの入力が入らなくなる
$ pbcopy < ~/.ssh/id_rsa.pub　→　公開鍵をクリップボードにコピー
$ ssh -T git@github.com　→　接続確認
i nakanoTaku! You've successfully authenticated, but GitHub does not provide shell access.
エラーのようなメッセージが出るが、内容を読むとSSH接続には成功しているけど、GitHubはシェルアクセスは許していない旨のメッセージなので、心配しなくてもOK。
$ git clone git@github.com:hoge/opiyo.git
```

[@okutani](https://twitter.com/okutani_t)さんの[サイト](http://vdeep.net/github#GitHubclone)に分かりやすくまとまっているので、こちらを是非参考してください。

# rbenv

```
$ brew install rbenv
$ brew install 2.3.3
```

# Ruby
ここは私が書いた記事を参考にしてみてください。
http://qiita.com/opiyo_taku/items/31b178875641952fc31c

# PostgreSQL
ここは私が書いた記事を参考にしてみてください。
http://qiita.com/opiyo_taku/items/dd037410788982133254


ここまでくればお約束のおまじないとやればOKかな！

# Railsサーバー起動

```
$ bundle install
$ bin/rake db:migrate
$ bin/rails s
```

# その他
素直に起動すりゃーいいんだけど、簡単にはいきませんね。
私は、`bundle install`でハマりました。2日かかった

http://qiita.com/opiyo_taku/items/6d46234ccaf371e4d32e
http://qiita.com/opiyo_taku/items/caada9f310a6c77c90f5

恥ずかしながら全く英語読めないけど、エラーっぽい場所をそのままググるといっぱい解決策が出てくるので気長にやればきっと上手くいく。
って感じかな...
Macのログイン画面が英語になった時の対処方法

## 概要
先日、macOSをアップデートしたら、ログイン画面が英語になってしまいました。

ググって解決しましたが、参考記事を探すのに少しばかり時間が掛かってしまったので、情報を共有します。

## 現象
- ログインする時に、ユーザー名以外が英語になってしまいました。

![20170330_190441.jpg](https://qiita-image-store.s3.amazonaws.com/0/142810/b89a2024-3c32-4966-d2f8-935202ddf719.jpeg "20170330_190441.jpg")

## 参考記事
- [Macのログイン画面の言語が英語になった時の対処法](http://itea40.jp/technic/mac-troubles/how-to-change-language-used-login-screen-mac/)

## 解決手順
- ログイン後にターミナルを立ち上げます。
- 以下のコマンドを実行します。

```
$ sudo languagesetup
```

- Passwordが求められますので入力します。
- 以下のような画面になります。

![スクリーンショット 2017-03-30 19.10.15.png](https://qiita-image-store.s3.amazonaws.com/0/142810/344eebda-fbbf-2b2b-440d-e9cda1167b71.png "スクリーンショット 2017-03-30 19.10.15.png")

- ここで6と入力し、実行します。
- 以下のように表示されればOKです。

![スクリーンショット 2017-03-30 19.11.18.png](https://qiita-image-store.s3.amazonaws.com/0/142810/a4202432-27ba-7ba2-f30c-e8cf828fa7fe.png "スクリーンショット 2017-03-30 19.11.18.png")

- 後はPCを再起動すれば、日本語に変更されます。
- 以上で完了です。
Raspistill や Raspivid のステレオ画像(-3d,--stereo)オプションってどうやって使うの？

だいぶ長いこと悩んでネットをググりまくってしまったので、書き残しておきます。

Raspberry Pi の標準カメラコマンド raspistill や raspivid にはステレオ画像の撮影オプション(-3d, --stereo)があります。
しかし Raspberry Pi 1/2/3 にはカメラを複数台繋ぐようなポートはありません。
ググると [Raspberry Pi に複数台カメラを接続する基板][1]を売っている方は見つかるのですが、この基板はGPIOを独自に叩いて複数のカメラを切り替えるもので、raspistill や raspivid とは全く関係がありません。

[1]: http://www.ivmech.com/magaza/en/development-modules-c-4/ivport-dual-raspberry-pi-camera-module-multiplexer-p-104

ではいったい、raspistill や raspivid のステレオ画像撮影オプションは、どうやって使うのでしょうか？

実はこれ Raspberry Pi 1/2/3 向けのオプションではなく、 Raspberry Pi Compute Module + I/O ボード向けの機能なのでした。 Raspberry Pi Compute Module の I/O ボードには、カメラインタフェースが2個付いているのです。以下は Raspberry Pi Compute Module 3 の画像です。

![cm3_io_board.jpg](https://qiita-image-store.s3.amazonaws.com/0/43781/78afbf14-3522-f915-959e-ec1ef4c12820.jpeg)

なお、この端子は Raspberry Pi Zero のカメラ端子と互換性があります。Pi Zero の登場以前は接続に変換基板を購入または自作する必要がありましたが、今は Raspberry Pi Zero 用のカメラケーブルが利用できます。

ちなみに実際に I/O ボード上のカメラ端子を有効にするには、[こちらのドキュメント](https://www.raspberrypi.org/documentation/hardware/computemodule/cmio-camera.md#sample-device-tree-source-files) にあるように、GPIOのピンをジャンパしたり、ピンコンフィグしたりと、やや手間がかかります。

ところで私は上記の I/O ボードのカメラ端子と Raspberry Pi 3とカメラ端子が同じだと勘違いしていたうえ、さらにジャンパケーブルの持ち合わせがなく、作業が数日滞ってしまいました。皆様は同じ轍を踏まぬよう、ご注意ください...。
HoloLens can do AirTap without AirTap 

#Introduction
I am a Japanese college student yoshiharu who is researching and developing HoloLens at Yumemi Co., Ltd. (https://www.yumemi.co.jp/en) since the beginning of March.

Today as well, I was focused on the research and development of the HoloLens application, **I detected continuous AirTap** by hand movements other than AirTap and surprisedly tried again (on my device) confirmed reproducibility I made it because I could do it.

#How does it occur?
Stand up only one index finger 
![IndexFinger.png](https://qiita-image-store.s3.amazonaws.com/0/114709/029afe4c-6c0f-6c39-7034-c57f681972dc.png)

and make a state with your palm facing yourself.
![FacingPalm.png](https://qiita-image-store.s3.amazonaws.com/0/114709/7955f8cd-4c4c-8fd7-f3d0-501b67097d9d.png)

When making this hand shape in front of the lens, a continuous AirTap was detected.

How many times does the angle of the finger occur? Etc. are unverified.

#Environment
 - **Version:** Windows Holographic
 - **OS Build:** 10.0.14393.953

#Verification
[![Failed to open this video](http://img.youtube.com/vi/cLMoatg--DI/0.jpg)](http://www.youtube.com/watch?v=cLMoatg--DI)
https://youtu.be/cLMoatg--DI

#Verification case Unity app 「HoloLenz」
[![Failed to open this video](http://img.youtube.com/vi/6qJpIJJUgrU/0.jpg)](http://www.youtube.com/watch?v=6qJpIJJUgrU)
https://youtu.be/6qJpIJJUgrU

#Verification case 「RoboRaid」
[![Failed to open this video](http://img.youtube.com/vi/WYmi-FGP75Y/0.jpg)](http://www.youtube.com/watch?v=WYmi-FGP75Y)
https://youtu.be/WYmi-FGP75Y

#Finaly
If there are someone who can see this article, it would be better to gather more information, so it would be a good idea to write the details in the comments section.

I believe that this phenomenon will definitely be conveyed to the HoloLens team and lead to improvements.
HoloLensでAirTapを使わずにAirTap

#はじめに
３月初めよりインターンで株式会社ゆめみ(https://www.yumemi.co.jp/ja) にてHoloLensの研究開発をしている近大生のよっしーです。

本日もHoloLensアプリの研究開発に精を出していたところ、**AirTap以外の手の動きで連続AirTap**を検知したので驚いてもう一度試してみたら(自分のデバイス上では)再現性が確認できましたので、記事にしてみました。

#どうすると起きるのか
握りこぶしから人差し指一本だけ立てて
![IndexFinger.png](https://qiita-image-store.s3.amazonaws.com/0/114709/838b71af-88b0-1d8b-03c8-81be449b1978.png)

手のひらを自分側に向けた状態を作る。
![FacingPalm.png](https://qiita-image-store.s3.amazonaws.com/0/114709/ac92b661-9834-cafd-41f3-648da3b275c9.png)

AirTapが認識可能な状態でこの手の形を作ると、連続AirTapが検知されました。
指の角度が何度の時に発生するか。などは未検証です。

#検証環境
 - **Version:** Windows Holographic
 - **OS Build:** 10.0.14393.953

#検証動画
[![Failed to open this video](http://img.youtube.com/vi/cLMoatg--DI/0.jpg)](http://www.youtube.com/watch?v=cLMoatg--DI)
https://youtu.be/cLMoatg--DI

#Unityアプリでの検証動画
[![Failed to open this video](http://img.youtube.com/vi/6qJpIJJUgrU/0.jpg)](http://www.youtube.com/watch?v=6qJpIJJUgrU)
https://youtu.be/6qJpIJJUgrU

#RoboRaidでの検証動画
[![Failed to open this video](http://img.youtube.com/vi/WYmi-FGP75Y/0.jpg)](http://www.youtube.com/watch?v=WYmi-FGP75Y)
https://youtu.be/WYmi-FGP75Y

#最後に
もしこの記事を見られた方で再現出来た方がおられれば、より多くの情報が集まる方が良いと思うのでコメント欄に詳細を書いていただけると良いかもしれません。

この現象が確実にHoloLensチームに伝わり、改善につながれば良いなと思っております。
Xcodeバージョンアップしたら***Extension has conflicting pravisioning settings 〜 switch to manual signing in the project editor. でエラーになる

![image](https://qiita-image-store.s3.amazonaws.com/0/60892/266ca67c-3709-ca32-2abf-fc645ca6732e.png)

先日Xcode8.3にアップデートした後にビルドしようとしたところ以下のエラーが発生

> ***Extension has conflicting provisioning setting. ***Extension is automatically signed, but provisioning profile *** has been manually specified. Set the provisioning profile value to "Automatic" in the build settings editor, or switch to manual signing in the project editor.

> Code signing is required for product type 'App Extension' in SDK 'iOS 10.3'

![image](https://qiita-image-store.s3.amazonaws.com/0/60892/678d9580-13bf-1214-ef82-470953202c3f.png)

このエラーは以下のTargetのGeneralのSigningの設定でチェックが入っているのに...
![image](https://qiita-image-store.s3.amazonaws.com/0/60892/ad8308c7-3fa0-36f1-a649-ecbe389b3e9f.png)

Build SettingのProvisioning Profileの指定が`Automatic`じゃない時に発生するようです。
![image](https://qiita-image-store.s3.amazonaws.com/0/60892/fc8a20bd-0382-e0a2-8f43-c702743a443f.png)

Automaticに切り替えたらBuildできました！
WavのBPMを変更して出力する

# WavのBPMを変更して出力

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ベースの練習で練習曲のCDが早すぎて弾けないので、BPMを変更して出力するアプリケーション作った　練習がはかどる <a href="https://t.co/CuS6CM2DTw">pic.twitter.com/CuS6CM2DTw</a></p>&mdash; ＧＡＮ彩坊(光の戦士) (@gansaibow) <a href="https://twitter.com/gansaibow/status/847354513098919936">2017年3月30日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## ダウンロード
BPMChanger.zip
https://1drv.ms/u/s!AsyaT0uIFWqQgZEnKrf6BgnASJ-EJw

## 使用方法

1. BPMChanger.exeを起動する
2. 入力項目を設定する
3. Outputボタンを押下する

BPMChanger.exeが実行できない場合は、Visual C++ Redistributable for Visual Studio 2015
がインストールされていないことが原因として考えられる
ダウンロードしてインストール後、BPMChanger.exeを実行する
https://www.microsoft.com/en-us/download/details.aspx?id=48145


## アプリケーションの入力項目について

|項目|値|
|---|---|
|Wav File Path|Wavのファイルフルパス(Wavファイルをドラッグ＆ドロップでフルパスが入力される) |
|Output Path|BPMを変更したWavファイルを出力するディレクトリのフルパス |
|BPM|変更したいBPMを入力(30~300)|
|x 2チェックボックス |BPM100に変更しようとしたら、BPM50扱いになるWavがある。<br/>チェックを入れてOutputを押下すると、BPM50がBPM100扱いになる |

![image](http://comiclo.jp/qiita/images/Cnv_20170330_060058_0000.png)

## 使用したライブラリ
SoundTouch Audio Processing Library
http://www.surina.net/soundtouch/soundstretch.html#examples

BPMを変更するコマンド
soundstretch input.wav output.wav -bpm=60
Intlによるlocaleの判定

[Intl - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Intl)


上記リンクによると、ブラウザ環境におけるIntlによるlocaleの判定は、Safari以外では動く。

また、node v4以降でも判定可能。


```js:node
Intl.NumberFormat().resolvedOptions().locale
// => 'ja-JP'
```


```js:chrome56
Intl.NumberFormat().resolvedOptions().locale
// => 'ja'
```

出力が全く同じというわけではない。
PythonからLINE NotifyでLINEにメッセージを送る

## LINE Notifyとは？

LINEが提供するAPIで、システムからメッセージを簡単に送ることができます。
利用にあたっては、事前にトークルームのアクセストークンを発行する必要があります。

詳細は、前回の[「Google Apps ScriptからLine NotifyでLINEにメッセージを送る」](http://qiita.com/tadaken3/items/5f916a12587e42ece814)をご覧ください。

今回は、Python3からメッセージを送る方法になります。
[requestsライブラリ](http://requests-docs-ja.readthedocs.io/en/latest/)を使って、画像付きのメッセージを送るサンプルになります。

```python:line_nofity.py
#coding:UTF-8
import requests

def main():
    url = "https://notify-api.line.me/api/notify"
    token = #ここにアクセストークンを入力します。
    headers = {"Authorization" : "Bearer "+ token}

    message =  'ここにメッセージを入れます'
    payload = {"message" :  message}
    files = {"imageFile": open("test.jpg", "rb")} #バイナリで画像ファイルを開きます。対応している形式はPNG/JPEGです。
    
    r = requests.post(url ,headers = headers ,params=payload, files=files)
    
if __name__ == '__main__':
    main()
```

## 参考URL
- http://developers.linecorp.com/blog/ja/?p=3784
- http://developers.linecorp.com/blog/ja/?p=3819
言語処理学会第23回年次大会(NLP2017)で使われている形態素解析器・辞書を調べる

[言語処理学会第23回年次大会](http://www.anlp.jp/proceedings/annual_meeting/2017/index.html)の資料(PDF)が公開されています。このなかから、どのような形態素解析器、辞書が利用されているか調べてみます。

# PDFの取得

PDFのURL一覧を取得するために、以下の方法を取りました。

* w3mでhttp://www.anlp.jp/proceedings/annual_meeting/2017/index.html
 にアクセス
* "L"を押してページ内すべての絶対パスURLを取得
* "S"を押して出力をテキストファイルに保存
* "fgrep .pdf > pdflist.txt"でpdfのみのURL一覧を取得

出来上がったリストを元にwgetでPDFを取得します。

```shell-session
wget -c -w 10 -i pdflist.txt
```

公開されているPDFの数は306(とエラッタが1)でした。

# PDFのテキスト化

popplerに付属のpdftotextを用いてPDFをテキスト化します。

```shell-session
for i in *.pdf; do pdftotext $i; done
```

# grepによるカウント

"grep -l"でヒットしたファイルの名前だけを出力できます(OSによってはない点に注意)。

```shell-session
grep -l -i neologd | wc -l
8
```

ただ、単純なmatch数だけでは必ずしもその辞書が利用されているとも限らないので、実際にはマッチしたファイルの内容について精査する必要があります。

# 結果

精査した結果は以下になります。論文中、単に名称を言及しただけのものは除外してあります。

## 形態素解析器

|MeCab|JUMAN|JUMAN++|
|-----|-----|-------|
|   22|   10|      4|

## MeCabで使われている辞書

|ipadic|mecab-ipadic-NEologd|UniDic|naist-jdic|jumandic|
|------|--------------------|------|----------|--------|
|     2|                   9|    13|         1|       1|

# 所感

* アカデミック用途ではUniDicが強い
* 品詞体系としてUniDicやJUMAN辞書のものが参照されることが多い
* SNS等のデータを扱う場合はNEologdが選ばれることが多い
Amazon Cognito UserPools を iOS から使ってみる

# ０．はじめに

AWS がサーバーレスで推奨しているサービスを、色々と使ってみます。

以前、JavaScript からの認証を確認したので、

* [Amazon Cognito UserPools を JavaScript から使ってみる - Qiita](http://qiita.com/kusokamayarou/items/60bcf9d16ce0df93b0ea)

今度は iOS Swift からの認証の確認です。

# １．Amazon Cognito User Pool と Amazon Cognito Identity Pool を作成する

Amazon Cognito User Pool と Amazon Cognito Identity Pool は、以前作成したのでそちらを利用します。

* [Amazon Cognito UserPools を JavaScript から使ってみる - Qiita](http://qiita.com/kusokamayarou/items/60bcf9d16ce0df93b0ea)

# ２．サンプルソースをダウンロード

1. 以下のサイトから、サンプルソースをダウンロードします。

* [awslabs/aws-sdk-ios-samples](https://github.com/awslabs/aws-sdk-ios-samples)

　
2. 利用するソースは、CognitoYourUserPools-Sample の Swift 版ですので、README に従って環境設定などを行います。

この時、
`let CognitoIdentityUserPoolAppClientSecret = "YOUR_APP_CLIENT_SECRET"`
は
`let CognitoIdentityUserPoolAppClientSecret:String? = nil`
に変更します。

![スクリーンショット 2017-03-30 15.38.39.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/886be768-13a2-7517-1954-95471d66db57.jpeg)

Signning の設定も忘れずに。

![スクリーンショット 2017-03-30 15.36.53.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/1bdcb8bc-d9ff-ea70-e670-24e1b0550e98.jpeg)

# ３．iOS Swift からのサインアップ、アクティベーション、サインイン、ユーザー情報の取得
　
1. アプリを起動し、「Sign Up」リンクをタッチ

* ![IMG_0008.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/6be9fdaf-1e5d-ac3e-1b03-b19e0f0b28d8.jpeg)

　
2. 以下の項目を設定し、「Sign Up」ボタンを押下

* Username : ※任意
* Password : ※任意
* Phone : [SMSを受信可能な電話番号]　※+81を付け、先頭の 0 は削除
* Email : [メールアドレス]  
　
* ![IMG_0010.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/01ae10b0-9107-c8bd-4d98-ea5479c37411.jpeg)

　
3. 以下の項目を設定し、「Confirm」ボタンを押下

* Username : ※任意
* Confirmation Code : [メールで受信したコード]  
　
* ![IMG_0012.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/488628f8-c1d0-fe33-4897-6c9755c127c7.jpeg)

　
4. 以下の項目を設定し、「Sign In」ボタンを押下

* Username : ※任意
* Password : ※任意   
　
* ![IMG_0015.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/45271c02-333c-12b7-499a-8f069e52e492.jpeg)

　
5. ユーザー情報が表示される

* ![IMG_0016.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/2847f518-e666-e810-c045-6c4b10b533d7.jpeg)

# ９９．ハマりポイント

* 電話番号の入力にハマってしまいました。+81 を先頭に付けることはわかったんですが、090 の先頭の 0 を入力しちゃダメなのは、わかりませんでした。これにどんだけ時間を食ったか…。  
　
* あと、あまり iPhone 使い慣れていないので、Sign In 画面で Username を入力してから Password を入力しようとすると、キーボードに隠れて、Username の入力欄から Password 入力欄へカーソルを移動出来なくなって困りました。iPhone を横にしたら、キーボードを隠せるようになって解決。  
　
* 他、今回の記事を投稿するにあたって、iPhone の画面キャプチャの取得とか、iPhone から Mac へ画像をインポートする方法がわからなかったので、以下を参考にしました。
    * [iPhoneでスクリーンショットを撮る方法まとめ──無音撮影、ページ全体が撮れるアプリ、できない時の対処法まで | アプリオ](http://appllio.com/iphone-take-screenshots-and-page-capture)
    * [iPhone に保存されている写真をパソコンに保存する（Mac での操作方法） \| iPhone \| お客さまサポート \| モバイル \| ソフトバンク](http://www.softbank.jp/mobile/support/iphone/data-itunes/addpcpics-mac/)

# ＸＸ．まとめ

サンプルソースがあったので、JavaScript の時よりもすんなりいきました。
awslabs さん、ありがとう。
Neovimの:terminal上のカラーパレットを変更する

Neovimの:terminalのカラーパレットはデフォルトでどきつい色をしているが、対応していないカラースキーマが多く使いにくい。
g:terminal_color_xxというグローバル変数(ANSI Colors互換のカラーパレットと番号が対応している)にカラーコードを入れることによって、これを変更することができる。

```vim:term_color.nvim
let g:terminal_color_0  = "#2E3436"
let g:terminal_color_1  = "#CC0000"
let g:terminal_color_2  = "#4E9A06"
let g:terminal_color_3  = "#C4A000"
let g:terminal_color_4  = "#3465A4"
let g:terminal_color_5  = "#75507B"
let g:terminal_color_6  = "#93A1A1"
let g:terminal_color_7  = "#D3D7CF"
let g:terminal_color_8  = "#555753"
let g:terminal_color_9  = "#EF2929"
let g:terminal_color_10 = "#8AE234"
let g:terminal_color_11 = "#FCE94F"
let g:terminal_color_12 = "#729FCF"
let g:terminal_color_13 = "#AD7FA8"
let g:terminal_color_14 = "#34E2E2"
let g:terminal_color_15 = "#EEEEEC"
```
VMWare Fusion上のWindowsが起動しなくなったときの復旧方法

## 問題発生

Mac OS X El Capitan(10.11.6)上のVMWare Fusion(7.1.3)にインストールしていたWindows 8.1の仮想マシンを無理やりシャットダウンしたところ、次回から「接続先の有効なピア プロセスが見つかりません」というダイアログが表示されるようになり起動できなくなってしまいました。

## 復旧方法

1. VMWare Fusionを終了する。
2. 仮想マシンフォルダを開く。 (通常は `~/書類/仮想マシン` などにある)
3. 対象の `Windows 8.1 x64` などのVMBundleファイルを右クリックして「パッケージの内容を表示」を選択して開く。
4. 開いたフォルダの中にある `仮想ディスク.vmdk.lck` と、 `264d2ed8-daa8-af2f-b6db-7102e23023cf.vmem.lck` というフォルダを削除する。(注意：後者の文字列は都度変わります) 
5. VMWare Fusionを起動し、仮想マシンを起動する。

以上です。
Serverspecのディレクトリ構成について相談

# この記事について

みんなのServerspecの知見を知りたい

## 背景

久しぶりに[Serverspec](http://serverspec.org)を
業務で真面目に導入しようという話になっている

## 前提

- 案件がたくさんある
- 案件によってアーキテクチャが全然違う
- ミドルウェア周りの共通的なものはまとめたい

http://serverspec.org/advanced_tips.html のページの
`How to use Serverspec tests as shared behaviors`を参照している

## 工夫できること

- `case`のディレクトリをつくって案件毎にまとめる
- `shared`のディレクトリに共通の設定をまとめる

というぐらいしかアイデアがない
みんななにを工夫をしているのか知りたい :pray: 

## 構成

```
├── Rakefile
└── spec
    ├── case
    │   ├── anken_one
    │   │   └── main_spec.rb # 1インスタンスとかであればこんな感じ？
    │   └── anken_two
    │       ├── db_spec.rb # WebやDBで分かれているならこんな感じ？
    │       └── web_spec.rb
    ├── shared
    │   ├── apache
    │   │   └── init.rb
    │   ├── nginx
    │   │   └── init.rb
    │   ├── postfix
    │   │   └── init.rb
    │   └── rails
    │       └── init.rb
    └── spec_helper.rb
```

### Rakefile

```rb
require 'rake'
require 'rspec/core/rake_task'

task :spec    => 'spec:all'
task :default => :spec

namespace :spec do
  targets = []
  Dir.glob('./spec/case/**').each do |dir| # caseディレクトリを追加
    next unless File.directory?(dir)
    target = File.basename(dir)
    target = "_#{target}" if target == "default"
    targets << target
  end

  task :all     => targets
  task :default => :all

  targets.each do |target|
    original_target = target == "_default" ? target[1..-1] : target
    desc "Run serverspec tests to #{original_target}"
    RSpec::Core::RakeTask.new(target.to_sym) do |t|
      ENV['TARGET_HOST'] = original_target
      t.pattern = "spec/case/#{original_target}/**/*_spec.rb" # ここも追加
    end
  end
end
```

### anken_one/web_spec.rb

個別の設定

```spec
require 'spec_helper'

describe 'shared' do
  include_examples 'nginx::init'
  include_examples 'postfix::init'
end

describe process("nginx") do
  its(:user) { should eq "foo" }
end
```

### shared/postfix/init.rb

```spec
shared_examples 'postfix::init' do
  describe port(25) do
    it { should be_listening }
  end

  describe process("master") do
    it {should be_running}
  end
end
```
Taxii サーバを試してみる(3.gunicorn設定)


[前回](http://qiita.com/KoriCori/items/62e0f14b187cf07f41fa)に引き続き、taxii serverを試してみる。

- gunicorn 設定

`pip install gunicorn` gunicornをインストールします。

また、`opentaxii/http.py` にベーススクリプトが記載されています。

```
from .middleware import create_app
from .config import ServerConfig
from .server import TAXIIServer
from .utils import configure_logging

config = ServerConfig()
configure_logging(config.get('logging', {'': 'info'}))

server = TAXIIServer(config)
app = create_app(server)
app.debug = False
```

上記を確認して分かる通り、
`opentaxii/config.py` にて、1.で確認した `defaults.yml` が読み込まれます。
`opentaxii/server.py` にてサーバとしてのサービスが起動されます。
`opentaxii/utils.py` にてログの管理がされます。

`gunicorn opentaxii.http:app --bind 0.0.0.0:9000` にて起動をすることができます。

以降、自動起動などはそれぞれの方法でやっていただければと思います。

次回は、collectionへの投稿などを確認できればと思います。

## 参照サイト

- OpenTAXII http://www.opentaxii.org/en/stable/

- EclecticIQ/OpenTAXII https://github.com/EclecticIQ/OpenTAXII
Slack の 🍣 にリンクを貼る

# テキストフォーマット

```
<https://supership.jp/|🍣>
```

`< | >` の中の
左に遷移させたい URL を
右に表示させたい文字列を
入れるだけ

# パラメータ 

`parse` を `none` 
`as_user` を `true` 

にするだけ

# 注意点

API 経由以外での投稿方法は知りません

# Tester

ここから簡単に投稿できます

https://api.slack.com/methods/chat.postMessage/test

# 

# Google Apps Script でやる場合

```js
var SLACK_URL_ROOMS_MESSAGE = "https://slack.com/api/chat.postMessage";
var AUTH_TOKEN = "<Slack の API トークン>";

function chatPostMessage() {
  var payload = {
        'token' : AUTH_TOKEN,
        'channel' : '#general',
        'text' : '<https://supership.jp/|🍣>',
        'parse' : 'none',
        'as_user' : true
  };
  var params = {
        'method' : 'post',
        'payload' : payload
  };
  var response = UrlFetchApp.fetch(SLACK_URL_ROOMS_MESSAGE, params);
}
```

# 自動書式設定

自動書式設定を利用すると新たにハイパーリンクを作成できます

<a href="https://slack.com/intl/ja-jp/help/articles/202288908-%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AE%E6%9B%B8%E5%BC%8F%E8%A8%AD%E5%AE%9A">メッセージの書式設定 | Slack</a>

- テキストを選択し、書式設定ツールバーのリンクアイコンをクリックする
- テキストを選択し、`⌘ + Shift + U` (Mac) か `Ctrl + Shift + U` (Windows/Linux) を押す 

すると以下のようなダイアログが表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30241/c2fec428-0506-28b6-9f62-e020f7701e3b.png)

テキストとリンクを記載して*Save*すればハイパーリンクの完成

試しに `:sushi:` にこの記事のURLを設定しました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30241/9c53c870-2aec-9396-700a-a628631bfa9f.png)

ただの文字列になりました

この方法では絵文字にリンクを付与することはできないようです
SMTPサーバーがブラックリストにのってしまった時の対処方

#SMTPサーバがブラックリストにのってしまった時の対処方
SMTPサーバがブラックリストにのってしまうとメールをspam扱いなどされ、メールを送信しても相手につかなくなるなど問題が発生します。

まず、なぜブラックリストに載ったのかなどをログから解析し対処する事が必要ですが、ここではその対処後に解除する方法を記します。

##ブラックリストに載っているのかチェック
下記サイトなどでブラックリストに載っているのかチェックできます。
http://whatismyipaddress.com/blacklist-check
http://multirbl.valli.org/lookup/（ここにipアドレス）.html

##ブラックリスト解除依頼の窓口
代表的なブラックリストを運用している窓口です。
※まだ他にもあると思いますがとりあえず。
ここにメールやHPに設置されているフォームを使用して解除をお願いします。
文面的には

- IPの管理者であると宣言
- 何故大量にメールを送ってしまったのか
- 対応をきちんとしたか
- ブラックリストからの解除をお願いする

を英語で書けば良いと思います。

###FortiGate
http://www.fortinet.co.jp/support/fortiguard_services
###all.s5h.net
https://www.usenix.org.uk/content/rblremove/antispam.html
###dnsblchile.org
http://www.dnsblchile.org/
###spam-rbl
http://spam-rbl.fr/bl.php
###dnsblchile.org
http://www.dnsblchile.org/
###Scrollout F1 Reputation Domain
http://www.scrolloutf1.com/rbl
###SenderScore Reputationlist
https://www.senderscore.org/
###DNSBL SPFBL
http://www.spfbl.net/dnsbl/english/lookup.html
###rbl.rbldns.ru
自動登録・自動解除
pandasのデータフレームを連結したときに列の順番を変えない。

# 問題

pandas のデータフレームを `pd.concat` を用いて連結したとき、列の順番が勝手に変わってしまうことがある。

```py3
>>> df = pd.DataFrame([[1, 2], [3, 4]], index=[0, 1], columns=['B', 'A'])
>>> df2 = pd.DataFrame([[1, 2], [3, 4]], index=[0, 1], columns=['A', 'B'])
>>> pd.concat([df, df2])
   A  B # df に合わせて B A がいい!
0  2  1
1  4  3
0  1  2
1  3  4
```

* cf: https://github.com/pandas-dev/pandas/issues/4588

# 解決方法

列の順番を変えないためには、`DataFrame.append` メソッドを使う。

```py3
>>> df.append(df2)[df.columns.tolist()]
   B  A
0  1  2
1  3  4
0  2  1
1  4  3
```

これで `df` の列の順番を保ったままデータフレームを結合できる。複数のデータフレームを結合する場合は、`df.append([df1, df2])` などデータフレームのリストを渡せばいい。

ただし、`DataFrame.append` は遅いのでたくさんの行を結合する場合は使わないほうがよい。

# 参考

* [Why the column order is changing while appending pandas dataframes?](http://stackoverflow.com/questions/33797454/why-the-column-order-is-changing-while-appending-pandas-dataframes)
* [Python pandas 図でみる データ連結 / 結合処理](http://sinhrks.hatenablog.com/entry/2015/01/28/073327)

# 追記

実行環境を書き忘れていたので追記

* Python 3.6.1
* pandas 0.19.2
[Linux][C/C++] pid, ppid, tidを取得する方法まとめ

Linux, pidで検索してもBashでの方法ばかりでるので、C/C++での方法のまとめ

# 使用するAPI
## pid => getpid()
[Man page of GETPID](https://linuxjm.osdn.jp/html/LDP_man-pages/man2/getpid.2.html)

## ppid => getppid()
[Man page of GETPID](https://linuxjm.osdn.jp/html/LDP_man-pages/man2/getpid.2.html)

## tid => syscall(SYS_getid)
[Man page of GETTID](https://linuxjm.osdn.jp/html/LDP_man-pages/man2/gettid.2.html)

※注意　pthread_self が返す値はLinuxのtidではない
[Man page of PTHREAD_SELF](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/pthread_self.3.html)

# 実装例

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

#include <unistd.h>
#include <sys/types.h>
#include <sys/syscall.h>

pid_t gettid(void) {
	return syscall(SYS_gettid);
}

int main() {
	std::cout << "[0] pid  : " << getpid()  << std::endl;
	std::cout << "[0] ppid : " << getppid() << std::endl;
	std::cout << "[0] tid  : " << gettid()  << std::endl;

	auto func = [] {
		std::cout << "[1] pid  : " << getpid()  << std::endl;
		std::cout << "[1] ppid : " << getppid() << std::endl;
		std::cout << "[1] tid  : " << gettid()  << std::endl;
	};

	auto th = std::thread(func);
	th.join();

	return 0;
}
```

```console:実行結果
$ g++ -pthread -std=gnu++11 test.cpp && ./a.out
[0] pid  : 13762
[0] ppid : 9459
[0] tid  : 13762
[1] pid  : 13762
[1] ppid : 9459
[1] tid  : 13763
```

# 関連

[[Linux][C/C++] tid (thread id) を取得する / pthread_createをラップして子スレッドのtidの取得 - Qiita](http://qiita.com/koara-local/items/a7c39f82909f7e2e3ece)
liboggとlibvorbisを使ってPCMエンコーディング

libogg, libvorbisを使ってPCM音源をoggに変換するやり方を調べてみました。

##OggとVorbis
とりあえず知っときたいのは、

- Oggは音声ファイル自体のことではなくて、様々なメディアを格納するコンテナフォーマット(FLAC,Theoraなど)
- Vorbisが実際の音声圧縮のフォーマットで、Ogg以外にも格納できる(Matroskaとか)
- OggにVorbisで圧縮した音声を格納したものをOgg Vorbisファイルという(拡張子.oggまたは.oga)

このため、.oggファイルを作るにはoggとvorbisの両方のライブラリが必要になります。

##Oggの概要
Oggにデータを格納するには、

1. データをパケット(ogg_packet)に分ける
2. ogg_packetをストリーム(ogg_stream)に送り込む
3. ある程度データがたまるとストリームからページ(ogg_page)単位でデータが取り出せる
4. ページにはヘッダとボディがあるのでそれぞれをoggファイルに書き込む

という手順をとります。
最初から最後までページ単位でデータを書き込みます。(ファイル単位のヘッダはコーデック自体がogg_streamに書き込む)

##Vorbisの概要
こっちはOggほど単純ではありません。

まず、Vorbisには以下のようなデータがあるので、これらをOggに詰めていきます。

- Vorbisのヘッダ
 - Ogg用のヘッダ
 - コメントヘッダ(曲名、作曲者などの楽曲情報)
 - コードブックヘッダ(Vorbisの圧縮に関する情報らしい)
- 圧縮された音声データ

Vorbisヘッダについては関数一つでポンとすべてogg_packetにできてしまいますので、
ここでは音声の圧縮について流れを見てみます。


1. VorbisInfo(圧縮音声に関する情報を格納した構造体)を初期化する
2. 圧縮モードやサンプリングレート、ビットレートなどをVorbisInfoに設定する
3. VorbisAnalysis(Vorbisの音声圧縮器)の圧縮コンテキスト(圧縮中の状態を保持する構造体)を初期化する
4. VorbisBlock(圧縮作業に必要なメモリ領域)を確保する
5. 以下6~11をPCMデータが残っている限り行う
6. 元のPCMデータを、チャンネルごとに浮動小数点数のPCMデータに変換する(各サンプルの変位を-1.0f～1.0fで表す)
7. 変換したデータをVorbisAnalysisが用意したバッファに詰める(通常6と7は同時にする)
8. 圧縮用のブロック(VorbisBlock)をVorbisAnalysisから取得する
9. 取得したブロックを圧縮し、VorbisBitrate(ビットレートの管理をするもの)に圧縮したブロックを送る
10. VorbisBitrateに圧縮したデータがたまるので、データがなくなるまでogg_packetとして取り出す
11. 取り出したogg_packetをOggに詰める
12. データがなくなったら、圧縮用に使っていた領域を解放する

わざわざ8で圧縮用のブロックを取得するのは、並列化できるようにするためらしいです。

##実際のコード
libvorbisにエンコーダのサンプルがくっついているのでそちらを参考にするとよいかと思います。
一応ソースへのリンクを貼っときます。

https://github.com/xiph/vorbis/blob/master/examples/encoder_example.c

書くのも疲れたのでこの辺で。


##参考文献
Wikipedia - Vorbis
https://ja.wikipedia.org/wiki/Vorbis

libvorbis/libogg Documentation
https://www.xiph.org/vorbis/doc/libvorbis/
https://www.xiph.org/ogg/doc/libogg/
Node.js/Webpack/Lambdaの組み合わせでエラーが出て動かない時の対処法

```
{"errorMessage": "Handler 'handler' missing on module 'index'"}
```

普通にWebpackでビルドしてLambdaにアップロードしても上記エラーが出てしまい動かず。
何が原因なのか明確に分かっていないですが、ひとまず `webpack.config.js` に以下設定を追加したら動きました。

```js:webpack.config.js
module.exports = {
  output: {
    libraryTarget: 'commonjs'
  }
}
```

誰かの役に立つかもしれないので一応投稿。
Vue.jsのデータバインディングとレンダリング


#やりたいこと

- テーブルの `tr` を初期表示で５行作成
- 「追加する」ボタンを押すと１行ずつ `tr` が複製される
- `tr` 中にあるフォームデータは後で送信したいので `v-model` でデータバインディング

#コード

```vue:app.vue
//テンプレート
<template>
    <section class="section">
        <table>
            <tr v-for="(item, index) in items">
                <td><input type="text" v-model="items[index].code1"></td>
                <td><input type="text" v-model="items[index].code2"></td>
                <td><input type="text" v-model="items[index].name"></td>
            </tr>
        </table>

        <div class="medium-4">
            <div class="button" @click="add">追加する</div>
        </div>
    </section>
</template>

//スクリプト
<script>
    export default {
        mounted() {
            console.log('Component mounted.')
        },
        data() {
            return {
                items: []
            }
        },
        created() {
            var $defaultNum = 5;
            for(var i = 0; i < $defaultNum; i++){
                this.items.push({
                    code1: '',
                    code2: '',
                    name: ''
                });
            }
        },
        methods: {
            add() {
                this.items.push({
                    code1: '',
                    code2: '',
                    name: ''
                });
                console.log("hoge");
            }
        }
    }
</script>
```
メーラーデーモン先生のメールアドレス

2017年3月30日14時32分現在
各キャリアの宛先不明になるメールアドレス

##docomo

docomo@docomo.ne.jp
test@docomo.ne.jp
##au

au@ezweb.ne.jp
##SB

softbank@softbank.ne.jp
softbank@i.softbank.jp
AMP 基礎知識

最近よく耳にするAMPについての基礎知識をまとめました。

## AMPとは
#### Accelerated Mobile Pages
直訳すると『加速されたモバイルページ』

GoogleとTwitterなどのIT企業9社で共同開発されている、モバイル端末でウェブページを高速表示するためのプロジェクト、またはそのためのフレームワーク(AMP HTML)。

## 対応するとどうなるか
- モバイル環境でのページ表示が高速化（15〜85％早くなるらしい）
- モバイルのgoogle検索画面で カルーセル形式で表示され、AMPマーク付きで表示される  
これ → <img width="48" alt="スクリーンショット 2017-03-30 16.20.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/105520/ad632ba0-3fdf-33b3-77ba-64c78ee18b9a.png">


## 仕組み
ウェブページのHTMLをあらかじめGoogleあるいはTwitter側でキャッシュすることで、読み込む分の時間を大幅に削減する。

## 基本的なルール
- AMP HTML（AMP specに従った、拡張されたHTML）を使用
- CSSはEmbedded StyleSheetで記述
- AMP JS以外のjavascriptは禁止（非同期のもののみ許容）

## 日本国内の導入事例
「朝日新聞」、「映画.com」、「zakzak」、「産経ニュース」、「SankeiBiz」、「日刊スポーツ」、「BLOGOS」、「毎日新聞」、「マイナビニュース」、「レスポンス」
いずれも記事ページ。
今は基本的に記事ページでのみ使用されているが、今後は様々なコンテンツに対応予定らしいです。

## 実装方法
以下はAMP HTMLの仕様に沿った記述です。
普通のHTMLの記述だとエラーがでます。

````
<html>   → <html ⚡︎> もしくは <html amp>
<style>  → <style amp-custom>
<img>    → <amp-img>
<video>  → <amp-video>
<audio>  → <amp-audio>
<iframe> → <amp-iframe>
````

### 禁止タグ
````
<base>
<frame>
<frameset>
<object>
<param>
<applet>
<embed>
<form>
<input>
<textarea>
<select>
<option>
````  
### SNSとか広告とかGAとかpluginとかを実装するタグ
````
<amp-analytics>
<amp-ad>
<amp-carousel>
<amp-anim>
<amp-facebook>
<amp-youtube>
<amp-twitter>
<amp-vine>
<amp-instagram>
<amp-pinterest>
<amp-lightbox>
<amp-image-lightbox>
````

## メリット
- サイト表示高速化によるユーザーストレス改善
- 検索結果直下にカルーセル表示されることによるクリック率上昇
- 検索結果の上位表示（Googleは、AMPを検索順位に反映させることは「今のところは」考えていないとコメントしているが為、予定）
- プラグインが用意されているので、スライドなどの実装が簡単

## デメリット
- 既存のHTMLで組まれたページで、禁止タグを使用していたり、javascriptを使用しているページなどをAMP HTML形式で完全に再現するのは難しい。
- AMP HTMLだけで従来のHTMLのページを再現することはできないので、従来のHTMLとAMP HTMLの2つを管理する必要がある。
- 全ての広告タグに対応しているわけではなく、以下が現状対応しているベンダー一覧だそうです。

#### 海外
- A9
- AdReactor
- AdSense
- AdTech
- Doubleclick

#### 国内
- i-mobile

## おわりに
以上が簡単なAMPについての説明です。

AMPは仕様のアップデート頻度が激しいので、この投稿に書いてあることも変わって行く可能性が高いです。
現状でも、最初からAMP HTMLでの実装を前提にしていれば、記事ページのようなテキストベースのページは割と簡単に実装できると思います。

まだまだ発展途上で、できないことは多いですが、プロジェクトに賛同するデベロッパーやパブリッシャーは増加傾向とのことで、今後改善されることを期待したいです。

以下のサイトを見れば、どんなことが可能なのかを簡単に確認できます。

公式サイト
<a href="https://www.ampproject.org/ja/" target="_blank">Accelerated Mobile Pages Project</a>
公式サンプルサイト
<a href="https://ampbyexample.com/" target="_blank">AMP by Example</a>
どちらもAMP HTMLで実装されています。
メモ:facebookIDでログインしているサイトにログインできなくなった(3/28)

#状況
17/3/28日朝にWEBでFacebookログインができない問題が発生。アプリではできる。
トークンが正しくない。(対応時間は5分もかからない。)
#解決方法
http://stackoverflow.com/questions/42994019/facebook-graph-api-not-work-from-2-2-to-2-3
Azure Storage RA-GRS セカンダリストレージをAzure Cli 2.0から触ったときメモ

RA-GRSを使ったPage Blobからの復旧をazure cli 2.0を使って試そうとしたときのメモ
ちょっとつまったので。

# RA-GRS
Azure Storage のストレージタイプをRA-GRSにすろとセカンダリリージョン(東日本ならセカンダリは西日本)にデータのコピーが非同期でとられる。確か15分以内に同期されたと思う。
普通のGRSなら東日本で障害発生時にMicrosoftの判断でセカンダリに切り替わるが、RA-GRSならいつでもセカンダリリージョンからReadができる。

# シナリオ
- 東日本に適当なVMを立て、そのストレージをRA-GRSにする。
- 東日本のVMを止める(障害発生模擬)。
- セカンダリリージョンから西日本の別のストレージアカウントへpage blobコピー
- コピーしたpage blobからvm起動

# ここからメモ 
## リソースグループに-secondaryのストレージアカウントは表示されない
タイトルの通りですが、前は表示されていた気がするけど、気のせい？
ポータルからや、az storage account listからは確認できず。

## セカンダリストレージアカウントがないといわれる
copy start実行時にnot found
```az storage blob copy start -b XXX.vhd -c vhds --source-account-name "hoge-secondary" --source-blob XXX.vhd --source-container vhds --source-sas "sas...." --account-name weststorage --sas-token "wsas..."```
>az storage blob copy start: error: Source storage account mitsuiragrs-secondary not found.

ちなみにgenerateもできなかった。これはプライマリと共通なので支障なし。
```az storage account generate-sas --expiry "2017-4-01T12:00Z" --permissions rl --resource-types sco --services bfqt --account-name hoge-secondary```
>az storage account generate-sas: error: Storage account 'mitsuiragrs-secondary' not found.

### でもshotやlistはいける
```az storage blob show -n XXX.vhd -c vhds --account-name hoge-secondary --sas-token "sas..."```
```az storage blob list -c vhds --account-name hoge-secondary --sas-token "sas..."```

## --source-uriならいける
```az storage blob copy start -b hoge.vhd -c vhds --source-uri "https://hoge-secondary.blob.core.windows.net/vhds/XXX.vhd<sas-token>" --account-name weststorage --sas-token "wsas..."```
でいけました。
AzCopyもuri指定するのでいけました。

### Portalで生成したsasだといけなかった
portalから生成できる```?sv=2016-05-31&ss=bfqt&...```のsasだと認証エラーだった。
```403: Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.```
az storage account generate-sasで生成できる、```?ss=bqtf&sp=rl&sv=2015-07-08&...```なsasだとイケました。

### 412 ConditionNotMet Copy failed when reading the source
copy startしてるときに(azcopyも)ソースのetagが変わってたりすると出るエラー。
コピーする前にVMを止めたつもりが止まってなくてちょっと苦しめられました...

# まとめ
とりあえずurl使えばいけます。
いろいろ書きましたが、なんかクライアントの問題な気がします。
ソースとか見ていません。既知の問題だったらごめんなさい。
[objective-c]ゲームでよくある画面をタッチした部分にエフェクトを表示するやつやってみる

タイトルにある通り、画面をタッチするとキラキラしたりマークが出たりするあれをやりたいなぁと思って調べた内容をメモです。

Android版は[コチラ](http://qiita.com/SAB/items/16fb5b1bdd9802086bb7)

どうやら、

touchesBegan:withEvent:
touchesMoved:withEvent:
touchesEnded:withEvent:

あたりを使うのが良さそうです。

まずはtouchesBegan:
ViewController.mに以下を記述。

```objc

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self.view];
}
```
これで画面にタッチしたタイミングでpointにタッチ座標が代入されます。
あとはこの座標を使ってアニメーションなど自由に料理できてしまうと。

```objc

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self.view];

//imageViewを生成
    UIImageView *img = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 50, 50)];

//画像を設定
    img.image = [UIImage imageNamed:@"マーク画像.png"];

//タッチポイントに画像を描画
    img.center = point;
    [self.view addSubview:img];

//0.3秒かけて透明化するアニメーション
    [UIView animateWithDuration:0.3 animations:^{
        img.alpha = 0;
    }completion:^(BOOL finished){
        [img removeFromSuperview];
    }];
}
```

これでタッチしたところにマークが出て、0.3秒かけて薄くなりながら消えていくはずです。
・・・・・・あれ？何も見えないぞ。

なるほど、画面をタッチすると同時に描画→アニメーションしてるから指を離した時点で既に消えてるのか。

じゃあ、画面から指を離したタイミングで描画した方が良さそうですね。
ここで使うのがtouchesEnded:
同じくViewController.mに以下を記述。

```objc

-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self.view];

//imageViewを生成
    UIImageView *img = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 50, 50)];

//画像を設定
    img.image = [UIImage imageNamed:@"マーク画像.png"];

//せっかくだから半分のサイズに縮小
    img.transform = CGAffineTransformMakeScale(0.5, 0.5);

//タッチポイントに画像を描画
    img.center = point;
    [self.view addSubview:img];

//0.3秒かけて元のサイズに拡大しながら透明化するアニメーション
    [UIView animateWithDuration:0.3 animations:^{
        img.transform = CGAffineTransformIdentity;
        img.alpha = 0;
    }completion:^(BOOL finished){
        [img removeFromSuperview];
    }];
}
```

これでよりふわっと感が出て、ちゃんと指を離したタイミングで描画されるから目視可能です。
もう先ほどのtouchesBegan:はお役御免です。

あと欲を言うと、画面にタッチしながら指を動かした時にも何かエフェクトが欲しいですよね。。。
そこで使うのがtouchesMoved:
またしてもViewController.mに以下を記述。

```objc

-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self.view];

//imageViewを生成
    UIImageView *img = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 50, 50)];

//画像を設定
    img.image = [UIImage imageNamed:@"マーク画像.png"];

//タッチポイントに画像を描画
    img.center = point;
    [self.view addSubview:img];

//0.2秒かけて縮小しながら透明化するアニメーション
    [UIView animateWithDuration:0.2 animations:^{
        img.transform = CGAffineTransformMakeScale(0.01, 0.01);
        img.alpha = 0;
    }completion:^(BOOL finished){
        [img removeFromSuperview];
    }];
}
```

縮小アニメーションすることで「ついてきている感」が出ますね。

ちなみに、画面をタップしたまま指をガーっとやった場合、概ね0.015秒〜0.050秒くらいの間隔でtouchesMoved:が呼ばれているっぽいです。
ログで見ただけなので確証はありませんが。。。すいません。

ともあれ、これでなんとかゲームでよくある画面をタッチした部分にエフェクトを表示するやつっぽい事は出来ました。

あとはこのViewControllerを継承して画面作っていけばOKですね。