OmniAICreator/Qiita-1.07M huggingface dataset:
SelenideをFirefox48以降で動かす(GeckoDriverを使う)

# 始めに

Firefox48では、それまでのFirefoxDriverから[Marionette Driver](https://developer.mozilla.org/ja/docs/Mozilla/QA/Marionette)へ、対応するDriver実装が変更となりました。このMarionetteDriverを使ってSelenideでテストを動かす方法を説明します。

# 前提条件

以下の環境で検証しました。

| 環境 | バージョン |
|:--|:--|
|OS |Windows 10 Home Premium (64bit)|
|ブラウザ | Firefox 50.0.1  |
| Marionette (GeckoDriver) | 0.10.0  |
| Selenide | 3.10 および 4.0   |


# 手順

## Marionette (GeckoDrvier)ダウンロード＆インストール

Marionette(GeckoDriverに改名したようです。以下GeckoDriver)を、[Githubのプロジェクトページ](https://github.com/mozilla/geckodriver/releases)からダウンロードします。実行環境に合わせたバイナリを選んでください。

ダウンロードしたのち、アーカイブを展開しでてきたバイナリを任意の場所に配置します。UNIX系OSの場合は実行権限を付与します。

## プログラムの変更

Selenideの初期化処理で、以下のような記述を追加します。

``` Java
        Configuration.browser = WebDriverRunner.MARIONETTE 
        System.setProperty("webdriver.gecko.driver","C:/Users/hoge/bin/geckodriver.exe");
```
最初の一行目が、使用するDriver種類をMarionette(GeckoDriver)にすることを、二行目がGeckoDriverのバイナリの位置を指定してます。

なお、Selenide 3.10だと `WebDriverRunner.MARIONETTE` が定義されていないかもしれませんが、その場合は

``` Java 
        Configuration.browser = "marionette";
```
とすることで動きます。

## 例

実際に組み込んだコードは以下のようになります。
あまり例はよくなく、本当は `@Before` などでの初期処理に書いたほうがよいですね。

``` Java
public class AppTest {


    @org.junit.Test
    public void Test1(){
        Configuration.browser = "marionette";
        System.setProperty("webdriver.gecko.driver","C:/Users/shima/bin/geckodriver.exe");
        GoogleHomePage page = open("https://www.google.co.jp/?gfe_rd=cr&ei=VWfRV66pOMaS9QXTo7vQBw&gws_rd=ssl", GoogleHomePage.class );
        // GoogleHomePage page = page(GoogleHomePage.class );
        page.検索窓().waitUntil(Condition.visible, 1000);
    }
}
```

# 終わりに

この対応で「Selenideがうまく動かないからFirefox47で留め置き」がなくなります。
普段Firefoxを使っていて手元でSelenideを使う人も、これで心置きなくバージョンアップができますね。
Rubyを使った式計算プログラム入門

#はじめに
ほとんど全てのインタプリタでは計算式を入力するとその値が返ってきます

例えば
3+5を入力すると8が返り
5\*6を入力すると30が返ります

上記のようなプログラムを作る時
上の例であれば左から演算していけばいいのですが
「+」や「\*」の演算順序や「( )」がある場合を考えると
演算の順序が異なるので左から演算しても正しい値になりません

例えば
3+5\*6を左から演算すると8\*6となり48ですが
正しくは3+30と掛け算を優先させないといけないので33と出力すべきです

このように計算順序が入れ替わったときの計算法について書きます
(eval関数を使えばいいんですが,今回は仕組みを考えていきたいので使いません)

#計算法

「\*」や「/」で計算した集まりを「項」とすると
「項」を「+」や「-」で計算した集まりが「式」となります
そして「( )」の中には「式」があります
つまり
「式」:=「項」[「+」or「-」]「項」[「+」or「-」] ・・・
「項」:=「値」[「\*」or「/」]「値」[「\*」or「/」] ・・・
「値」:=[「0-9」or「(」「式」「)」]
として計算していきます

#イメージ
ペイントで3分クオリティですがこんな感じです
![calculater.png](https://qiita-image-store.s3.amazonaws.com/0/152328/52f45a4d-a550-25eb-b8e9-2088ebb0c08c.png)

処理順に見ると
1. exprのフェーズで「+」「-」で分解してtermに渡します
2. termのフェーズで「\*」「/」で分解してfactに渡します
3. factのフェーズで値だったらtermにその値を戻します(->4.)「()」ならexprに渡します(->1.)
4. termのフェーズで「\*」「/」の部分集合を演算してexprに戻します
5. exprのフェーズで「+」「-」の部分集合(最後は式全体)を演算して答えを返します

#サンプルコード
```calc.rb
class MyCalc
  def initialize(s)
    @s = s
    @p = 0
  end

  def run
    @p=0
    return self.expr
  end

  def expr
    v1 = term
    while(@s[@p] == '+' || @s[@p] == '-')
      op = @s[@p]
      @p += 1
      v2 = term
      v1 = op == "+" ? v1 + v2 : v1 - v2
    end
    return v1
  end
  
  def term
    v1 = fact
    while(@s[@p] == '*' || @s[@p] == '/')
      op = @s[@p]
      @p += 1
      v2 = fact
      v1 = op == "*" ? v1 * v2 : v1 / v2
    end
    return v1
  end
  
  def fact
    value = 0
    if @s[@p] =~ /\A-?\d*\Z/
      while @s[@p] =~ /\A-?\d*\Z/
        value = value * 10 + @s[@p].to_i
        @p+=1
      end
    else
      @p+=1
      value = expr
      @p+=1
    end
    return value
  end
end


#### Main ####

while (s=gets.chomp)!='q'
  mc = MyCalc.new(s)
  puts mc.run
end
```
式をスペースなしで入力すれば計算してくれます
ただし演算子は「+」「-」「*」「/」「(」「)」にしか対応してません
お好みで拡張してください
qが入力するまで繰り返します

プログラムはポインタもどきを進めていって
等優先度の演算を左に結合していき終わったら上の関数に渡していくという
再帰関数で処理していってます

# 反省点
上のプログラムだと空白文字に対応していません
ちゃんとトークンごとに分解して計算するようにした方がいいかもしれません
正直、別に何も変わらないんじゃないかって気はする

残念ながら、あまり人の役に立ちそうなことは書けそうにないです。ポエムを通り越してもはやエッセイです・・・。

# 技術的なこと

Qiita だから、技術に関連したことを一応最初に書きます。

## 子供のために作ったアプリケーション

子供ができるまでは、なんかいろいろ作ってやろうと思っていたような気がしますが、実際に作ったのは以下の二つくらいです。

### 百ます計算

Excel(VBA) で作りました。
Excel で作ったのは、当然「ます」は作る必要がなくて（だってエクセルは方眼紙だから！）、ただ縦横に 0 〜 9 の数字を一つずつランダムに出力するだけでいいからです。

あと、どうでもいいけど、私個人は百ます計算否定派です。あれで身につくのは計算力じゃなくて小賢しいテクニックだけでしょう。

### 計算ドリル的なの

いわゆる計算ドリル的な、計算問題を羅列するプログラムを、これまた ExcelVBA で作りました。なぜまた Excel をチョイスしたかといいますと、印刷することを考えた時一番楽だと思ったからです。だってエクセルは方眼紙だから！（大事なことだから二回言いました）
一応これは、子供の成長に合わせてバージョンアップを何度かしてます。最初は足し算だけだったのが四則全てに対応するようになったり、桁数が増えたりとか。また、ただのランダムだと部分的に数字が偏ったりして同じ計算式が続くことがままあるので、そこは対応しました。

## プログラミング教育？

子供向けロボットプログラミングの体験会に一度息子を連れて行きましたが、大して興味を示してくれませんでした。たぶんそれがこの分野でした最初で最後のアプローチだったはず。
ただ、今の子供は生まれた時から携帯電話や PC が目の前にあるのでデバイスに対する習熟そのものは早いです。息子も確かに 3, 4 歳くらいで携帯電話で一言二言くらいのメールならうてたはず。IoT なんかも何の違和感もなく受け入れていくのでしょう。

# 生活のこと

こればっかりは、家庭環境も職場環境も人によって違うからなぁ、というのが正直なところです。
私はこの業界の人間としては比較的平穏に過ごせてきた方だと思いますし、基本的に家族をほったらかして一人で遊びに行くようなことをほぼしないしできないので、家庭環境が職場環境に影響するようなこともその逆もあまりないんですよねぇ・・・。
まあ少なくとも、職場環境が悪くて家庭環境に影響が出るようなら、そんな職場やめたほうがいいとは思いますね。（子育て関係なくなってる・・・）

あと、中学受験を考えている人は要注意。志望校のレベルによっても違うのですが、小六時の週末はほぼなくなると考えてよいです。
【JMeter】負荷テスト実行はGUIから行ってはならない

## GUIで負荷テスト実行はダメ 
JMeterで負荷テストを行うとき、テスト実行をGUI上から行ってはいけません。JMeterのGUIがボトルネックになって正しい結果が得られないことがあるからです。

GUIはテスト計画の作成のためだけに使い、正式な負荷テストではコマンドラインから実行するのが正しい使い方です。

公式の[Getting Started](http://jmeter.apache.org/usermanual/get-started.html)には以下のように繰り返しかつ強い口調で負荷テストでGUIモードを使ってはいけないと記載されています(太字による強調は。

> **Don't** run load test using GUI mode !

(負荷テストをGUIモードで実行しないで！)

> GUI mode should only be used for creating the test script, NON GUI mode **must be** used for load testing

(GUIモードはテストスクリプトの作成にのみ使用し、負荷テストには非GUIモードを使用しなければなりません。)

> For load testing, you **must** run JMeter in this mode (Without the GUI) to get the optimal results from it.

(負荷テストの場合、最適な結果を得るためにはJMeterを（GUIの無い）このモードで実行しなければなりません。)

## 非GUIモード(コマンドラインモード)
非GUIでテストを実行するために、JMeterには以下のコマンドラインオプションが用意されています。

| オプション | 説明 |
|:---|:--|
| -n                | JMeterを非GUIモードで起動 | 
| -t [ファイル名]    | テスト計画のJMXファイル名を指定 |    
| -l [ファイル名]    | テスト結果を格納するJTLファイル名を指定[^1] |
| -j [ファイル名]    | JMetterの実行ログファイル名を指定 |
| -g [CSVファイル名] | （テストは実行せずCSVファイルを読み込んで）レポートを出力する |
| -e                | 負荷テスト後にレポートを出力する |
| -o [フォルダ名]    | レポートを出力するフォルダを指定する。存在しないフォルダ名か空のフォルダを指定しなければならない。 | 
他にもプロキシの設定やリモートサーバー上でテストを実行するためのオプションなどもありますので[本家](http://jmeter.apache.org/usermanual/get-started.html#non_gui)を参照してください。

[^1]: ドキュメントには記載がありませんが、`-o`オプションと同様に`-l`オプションも存在しないファイル名を指定しなければいけないようです。

【例】
`my_test.jmx`に定義されたテストを実施して`log.jtl`に結果を出力する。

```sh
jmeter -n -t my_test.jmx -l log.jtl
```

## 結果表示・解析
コマンドで実行したテストの結果表示・解析方法はいくつかあります。

### リスナによる解析
出力したjtlファイルをJMeter(GUI)のリスナに読み込ませることで結果を解析することができます。

下の画像は`グラフ表示`リスナにjtlファイルを読み込ませた例です（赤枠内でjtlファイルを指定しています）。

![リスナ.png](https://qiita-image-store.s3.amazonaws.com/0/29682/06bf3b37-be91-9b86-1685-060f2a753920.png)


### Report Dashboard(HTMLレポート)
リスナによる解析結果の表示のほか、詳細なHTMLレポートを出力することもできます。`-g`オプションまたは`-e`オプションを利用します。

【例】
`my_test.jmx`に定義されたテストを実施して`log.jtl`に結果を、`report`フォルダにレポートを出力する。

```sh
jmeter -n -t my_test.jmx -l log.jtl -e -o report
```

出力されるHTMLの一部です。

![レポート1.png](https://qiita-image-store.s3.amazonaws.com/0/29682/785dabd4-02e2-269e-dbad-f07b3b70f864.png)

![レポート2.png](https://qiita-image-store.s3.amazonaws.com/0/29682/461bdbcd-98b3-9631-75dd-586f986a9e61.png)

うーんかっこいい[^2]。これを使うとJenkinsで定期的に負荷テストを実施してレポートを出力なんて事もできちゃいますね。

[^2]: レポートを出力しただけで満足するいけないパターン。

レポート出力に関する説明や設定方法の詳細は[公式ガイド](http://jmeter.apache.org/usermanual/generating-dashboard.html)に書いてあります。

## 参考
この記事を書いた時点でのJMeterのバージョンは3.1です。
Shinjuku.rbに行こう！

こんにちは、@trebyです。アイマスが好きです。
新宿エリアの地域Rubyコミュニティ[Shinjuku.rb](http://shinjukurb.connpass.com/)からきました。

今日は[IT勉強会/コミュニティ運営 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/event-management)の3日目として筆を執らせていただきます。昨日は[4年間続いたShibuya.lispのLispMeetUp](http://keens.github.io/blog/2016/12/01/4nenkantsuzuitashibuya_lispnolispmeetup/)でした。

参加される皆様には楽しい勉強会ライフが送れるよう、また主催される皆様にはより良い勉強会とできるよう、我々の勉強会ナレッジを拙いながらもシェアできればと思います。お楽しみください！

# 運営している勉強会のご紹介

[Shinjuku.rb](https://shinjukurb.connpass.com/)を冠して、新宿近辺の地域Rubyコミュニティとして活動しています。元々は過去に西川さん(@shishi4tw)が中心となってされていた勉強会でしたが、ご本人の転職を機に行われていない状態でした。

名前を引き継いで @threetreeslightさんと@sumyappさんと私の今の体制で始めたのが、昨年2015年6月から。かれこれ1年半ほど運営しています。

特色として、

- 月一回、新宿エリアでミートアップを開催
    - 特に[メタップス様](http://www.metaps.com/ja)には高頻度で会場提供していただいております。ありがとうございます。
- LT & ディスカッションベースの会
- 毎回テーマを設定
    - [#40](https://shinjukurb.connpass.com/event/37689/) - [Admin Interface](https://github.com/shinjukurb/meetups/blob/master/notes/40.md)
    - [#41](https://shinjukurb.connpass.com/event/39813/) - [API Builder](https://github.com/shinjukurb/meetups/blob/master/notes/41.md)
    - [#42](https://shinjukurb.connpass.com/event/42245/) - [Code Analysis and Metrics](https://github.com/shinjukurb/meetups/blob/master/notes/42.md)
    - [#43](https://shinjukurb.connpass.com/event/44524/) - [Scheduling](https://github.com/shinjukurb/meetups/blob/master/notes/43.md)
- 会の最後にKPT(振り返り)を行う
- 規模は〜20人程度

といったことをしています。

規模としてそんなに大きくないのは分からないことを気軽に持ち込める場としたいという思いからです。運営としても無理なく続けられる、技術的な壁打ちの場となれば良いなと考えています。

世の中にはAsakusa.rb以外の地域Rubyコミュニティは無意味だという極端な言説もあるみたいですが、泣かない。強く生きる。

# 運営ノウハウ

ここでは勉強会を運営する上で私/私たちが気をつけていることを共有します。Shinjuku.rbのように〜20人程度のコミュニティベースの勉強会を運営される際に参考になるかと思います。

## 複数人で運営する

定期開催するような勉強会を一人で運営すると、当人が多忙となってしまうとそこで会が回らなくなってしまいます。そこで誰かが動けないようになっても勉強会が回るよう、複数人で運営するようにしました。

Shinjuku.rbは3人体制で運営を行っています。誰かがいなくても開催できる体制を作ることで無理なく勉強会を続けていくことができます。

## 自分のための目的を持つ

勉強会において運営のやることは基本的に参加者の管理や連絡、当日の進行や懇親会の手配などといった雑務が大半を占めています。そのために一定の間隔で続けようとすると、気づけば開催することが目的となってしまい、勉強会自体が辛いものになってしまいます。

そこで無理なく続けていくためにも、自分本位の目的を持つのが良いのではないかと思います。個人的にはShinjuku.rbは特定テーマの技術に触れるきっかけとして、勉強会を開催しています。

## 身内感を出さない

コミュニティベースの勉強会になると、どうしても話の文脈ができてきてしまいます。
以前この話をした、○○は○○だ――人の話は当然として、技術についてもそれまでの回の話は新しく参加される方にはさっぱりな訳です。

コミュニティのため、ある程度は仕方ありませんが、度が過ぎると話の分からない方が疎外感を感じてしまう原因となりかねません。運営者側も人で、それが故、素性の知れたメンバーとの方が話しやすいわけです。だからこそ、新しくいらっしゃった方を意識していかねばなと思うのです。

主催する側としては参加される方皆さんに満足していただきたいと思っており、参加者を公募する限りは、内輪盛り上がりしすぎないようにしたいものです。

# 運営をしているメリット

基本的には大変なことの多い勉強会の主催ですが、いくつかメリットもあります。

## 会やコミュニティの中では目立てる

司会をすれば、否応なくコミュニティでは覚えてはいただけるので、自己承認欲求を満たせます。また、プロフィールに自己アピールとして書いてすごい人アピールができます。

実際には勉強会を主催しているのと技術力が秀でているのには、なんら相関はないはずなのですが、見せ方が大事だということは世の真理の一面を表しているものです。

技術の世界で生きるものとしては見せかけだけにならないよう、日々精進していかねばと思います。

## 良い話がくる(こともある)

上記の「目立てる」ということに関連するかもしれませんが、露出することでこその経験が得られることもあります。

大分昔の話にはなりますが、学生時代に[福岡でNFCの勉強会](https://sites.google.com/site/fuknfc/)をやっていた時には、そのご縁で[NFC本](https://www.oreilly.co.jp/books/9784873116242/)の執筆の機会を得ました。今から考えると当時の自分の実力からしてありえない経験をさせていただきました。

ちなみに何故NFCをやっていたかというと、コミケでFeliCa本を書いたのをソニーの中の方に捕捉されたからで、人生何があるかわからないなと思います。

# まとめ

大変なことも多い勉強会運営ですが、様々な人と出会えたり、話す練習になったりと良いことも少なくありません。

立ち上げてさえしまえば今日からでも勉強会を開催することができます。運営に興味のある方はまずはやってみてはいかがでしょうか。

それでは、良い勉強会ライフを！
SolrのSoftCommitとHardCommitのパフォーマンスの違い

[Solr Advent Calendar 2016](http://qiita.com/advent-calendar/2016/solr) の3日目です。

前回の[記事](http://qiita.com/tkondo/items/ea3795b30018d227ef8c)でCommitの頻度を減らすとインデキシングが速く終わることに触れました。
SolrのCommitにはHardCommitとSoftCommitの2種類があるため、今回はそれについてです。

# SoftCommit
Soft CommitとはNear Real Time Searchの為に実装されたCommit方式で、
[公式ドキュメント](https://cwiki.apache.org/confluence/display/solr/UpdateHandlers+in+SolrConfig)によるとSoftCommitはメモリ上のインデックスをディスクに書き出さないため、その分高速だそうです。
そのSoftCommitとHardCommitのパフォーマンスの違いを計測したいと思います。

# 調査に使ったインデックス
~~後ほど(ry~~

201601204追記
[前回](http://qiita.com/tkondo/items/ea3795b30018d227ef8c)と同じものを使用

# Solrのバージョン
5.5.2

# 調査したパターン
前回と同じく、インデックスが0件の状態から、
1度の更新リクエストで1万件のデータを100回に分けて更新します。
調査パターンは2通りです。

1. 毎回 softCommit=trueを指定
  * <code>http:/localhost:8983/solr/collection/update?softCommit=true</code>
  * 便宜上パターン3と呼びます
2. 毎回 commitWithin=5000を指定
  * <code>http:/localhost:8983/solr/collection/update?commitWithin=5000</code>
  * 同じくパターン4とします

commitWithinとは指定されたミリ秒以内にSoftCommitを発生させる機能です。
このパラメーターを受けた時点でCommit Scheduleと呼ばれるCommitを発生させるポイントがセットされ、
そこまでに入ってきたcommitWithin付きの更新リクエストは全て、Commitが1回にまとめられます。
つまり、ユーザーが意識することなくcommitの回数の制御が可能で、(solrconfig.xmlで設定できるautoCommitと違い)Solrの本体の変更無しでcommitの間隔の調整ができます。

# 結果と考察
前回の結果と比較するため、合わせて結果を張りました。

|            |  処理時間(秒)|
|:-----------|------------:|
|    パターン1|          196|
|    パターン2|          157|
|    パターン3|          192|
|    パターン4|          146|

パターン3はパターン1とほぼ変わらずでした。
ディスクへの書き込みが無い分、高速なはずですがそれほど変わりませんでした・・・。
おかしいと思っていたのですが、Solr Adminから確認できるSoft Commitの回数が増えていなかったので、
上手くSoft Commitが発生していないようでした。
やり方を間違えたのでしょうか・・・。

パターン4に関してはパターン2よりも高速でした。
1度にまとめてcommitするよりも、定期的にcommitした方が良いのでしょうか？
(もしくは誤差範囲？)
仮にほとんどHard Commitをしないパターン2とほぼ同等と考えるとSoft Commitによるオーバーヘッドはかなり少ないものと考えれるかもしれません。


# まとめ
パターン3に関してはきちんとした調査が出来ていなかったので、単純なHard CommitとSoft Commitの比較ができ無かったのが残念でした。
ですが、パターン4の結果からcommitWithin(5000ms)であればCommitのオーバーヘッドを減らせることは分かりました。
実際の運用では定期的にメモリ上のインデックスをディスクに書き出した方が良いため、solrconfigでのauto hard commitはopenSearch=falseで少し長目の値を取ったほうが良いと考えれます(検証で設定していたのはそのためでした)。
なので、更新リクエストに関しては特に理由が無ければcommitWitinを使うとバランスが良いという結果が出たと言えます。

明日はアトミックアップデートについて書きます。
Selenium IDEはこの先生きのこるのか

この記事は[Selenium/Appium Advent Calendar 2016](http://qiita.com/advent-calendar/2016/selenium_and_appium)の3日目の記事です。
2日目はjugemixの[Selenium でキーワード駆動テストを実践したときのあれこれ 『まずはやってみた編』](http://jugemix.hatenablog.com/entry/2016/12/02/003549)でした。続きが読みたいね！

ところでこんにちは！

```
　　　　_,,...,_
　　/_~,,..::: ~"'ヽ
　(,,"ヾ　 ii　/^',)
　 　 :i　　　 i"
　　　 | (,,ﾟДﾟ)　＜ Selenium IDEはいよいよ大変なんじゃね?
　　　 |（ﾉ　　|） 　　
　　　 | 　　　|
　　　 ヽ ＿ノ
　　　 　U"U
```

Selenium IDEはFirefoxの拡張機能です
========================================

なのでFirefoxに大きな変更が入ると翻弄されますよね。
例えば2015年、Firefoxの拡張機能にMozillaのデジタル署名が必須になってしまったのは、Selenium IDEにとって非常に大きな変更でした。
インストール手順がまったく変わってしまったので、脱稿間近だったSelenium実践入門の内容をあわてて修正したのが懐かしいです...

Firefoxに今後予定されている大きな変更
======================================

まずは、Firefoxの2017年のリリーススケジュールを何も考えずに眺めてみましょう。

![Firefoxのリリーススケジュール](https://qiita-image-store.s3.amazonaws.com/0/33963/1d5747c7-d764-c59f-926c-34aa0eac7405.png)
https://wiki.mozilla.org/RapidRelease/Calendar

## Firefox 57から、拡張機能はWebExtensionsベースのみ対応となります

https://blog.mozilla.org/addons/2016/11/23/add-ons-in-2017/

ところで、Selenium IDEってXUL/XPCOMベースでしたよね。

えっ あと1年で今のSelenium IDE死んでしまうん？

```
＿人人人人人人＿
＞　突然の死　＜
￣Y^Y^Y^Y^Y￣
```

FirefoxにはESRという、主要機能に関するアップデート間隔が緩やかで法人利用向けのエディションがありまして、業務で使われている方は皆さんESRでしょうからまだまだあわてるときじゃないのかもしれませんが、それにしたって猶予は2018年中頃（Firefox ESR 52）までです。
しかしながら、2016年12月時点で、公式GitHubリポジトリーのissueで、Selenium IDEの件でWebExtensionsに言及しているのはたったの1件。
https://github.com/SeleniumHQ/selenium/issues/3181

けっこうやばそうな割にみんな騒いでないけど、ほんとはなんてことないのかな！
教えてえらい人！！

kyo-agoさんが昔WebExtensionsベースのSelenium IDEを非公式で作っていたのですが（すげー！）、これが救世主になったりするのかしら...
https://github.com/kyo-ago/selenium-ide-for-chrome

## 2017年のどこかでブラウザーエンジンがGeckoからQuantumに変わります

https://medium.com/mozilla-tech/a-quantum-leap-for-the-web-a3b7174b3c12#.2vlz42og8

そもそもFirefoxが安定しないので拡張機能もまともに動くわけないよ、という時期がブラウザーエンジン変更の直後に生じるとみられます。
Google Chrome/ChromiumのエンジンがBlinkに変わったときの不安定さも、そりゃあひどかったんじゃ...

Selenium IDEだけじゃなくて、WebDriverにも大きな影響がありそうな話ですね。

```
＿人人人人人人人人人人人人人人人人＿
＞　GeckoDriverとはなんだったのか　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣
```

FirefoxにはGeckoエンジンと関わりの深い、独自の自動操作の仕組みであるMarionetteがあって、最近のWebDriverはMarionetteと連携しています。Quantumエンジンに移行してもMarionette APIは変わらないのかもしれませんが、念のため先行きは注意深く見守って行く必要があるでしょう。

乗り換え先を考え始めた方が良い？
===================================

## Selenium Builder?

おいおい、そいつもXULベースだZE☆ HAHAHA!

## 来年の話をすると鬼が笑うんですよ

1年もあれば誰かなんとかしてくれるでしょう（白目）

今回はここまで
===================================

次回はjugemixです。よろしくお願いします。
[Selenium/Appium Advent Calendar 2016](http://qiita.com/advent-calendar/2016/selenium_and_appium)はまだまだ君の挑戦を待っているぜ！
Visual Studio Emulator for Android も捨てたもんじゃない

Visual Studio Emulator for Android も捨てたもんじゃないと思うのですが、最近 HAXM 推しの方が増えている気がするんですよね。ここでは敢えて Visual Studio Emulator for Android について書きたいと思います。

## 公式ドキュメント

公式ドキュメントはこのあたりになると思います。

[Visual Studio Android Emulator](https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/debug-on-emulator/visual-studio-android-emulator/) - [Xamarin Developer Center](http://developer.xamarin.com/)

## :-) Hyper-V と両立できる

Visual Studio Emulator for Android は Hyper-V でできています。したがって、もともと Hyper-V を利用している場合には迷わずこっちでしょう。私の場合 Win 8.1 をホストにして 7 や 10 を乗っけていました。

一方、 HAXM は Hyper-V と両立できません。 HAXM が必要なときは Hyper-V を一旦切ることになります。ちなみに、 Hyper-V を ON / OFF するには [Nuits](http://qiita.com/Nuits) さんの [HyperV-Switch](https://github.com/nuitsjp/HyperV-Switch) が便利です :)

## :-| 仮想マシン上で使えない

Hyper-V の上というか中では:

- Visual Studio Emulator for Android は使えません。 '孫' 仮想マシンが作れないので。
- HAXM も動きません。仮想化技術が利用できないので。
- 遅い方の Android Emulator だけが使えます。

## :-( Home Edition だと使えない

Home Edition だと、そもそも Hyper-V が使えないので。

## :-| IP アドレスが別に取られる

仮想マシンなので、IP アドレスは別です。会社で新しく IP アドレスを取るのに申請を回さなきゃいけなかったりすると、ちょっと面倒かもしれません。

## :-| 油断するとメモリが足りなくて起動できない

仮想マシンに割り当てるメモリを起動時にがっつり取ります。足りないときは、ブラウザで開き過ぎたタブを閉じるとか、Visual Studio をいったん閉じて Hyper-V Manager で先にエミュレーターを立ち上げるとかすることになります。

## :-) インストールが簡単

人によるのかもしれませんが、Visual Studio と一緒にインストールしてから実行まで、私は特に引っかかるところはありませんでした。

## :-) 速い

遅い方の Android Emulator と比べたら断然速いです。速い方 (HAXM) よりも速いんじゃないですか?

## :-( 対応 Android OS は 4.4 ～ 6.0

現時点では 7.0 / 7.1 Nougat に対応していません。 Android Emulator / HAXMでやるしかありません。

## :-| Portrait の写真が撮れない

せっかく画面の回転はできるのに、写真は必ず Landscape で保存されるみたいなんですよね。 Android Emulator でも同様です。実機の出番です。

## :-| ときどきキーボードがきかなくなる

そういうときはエミュレーターを再起動します。ソフト キーボードをポチポチするのは耐え難い :(

## :-D Shift + 2 で '@' を入力する癖がついてしまう

アプリを開発していて、メールアドレスを入力する場面があると、デバッグで何度も入力することになります。普段は日本語キーボードで右の方にいる '@' ですが、エミュレーターは英語キーボードで Shift + 2 になります。これに慣れ過ぎてしまって、ちょっと混乱するのです。

普段から英語キーボードを使うようにすればいいのかな...

---
Salesforceのカレンダーでカスタムオブジェクトを表示する

#Lightningどうなのよ？
そう聞かれた時には「Builder使わないならVFでいいんでない」とお答えしている最近ですが、皆さんいかがお過ごしでしょうか。
そもそも「Lightning」という定義が広がり過ぎて「それってComponentなの？それともExperience（LEX）なの？」と、質問に対して質問で返すのが面倒ということもあり、とりあえず先ほどのような回答をして食い違うようであればすり合わせています。

そんなLightningのComponentですが、Classicで使えないこともないですが、やはりLEXでAppBuilderだったり標準UIをオーバーライドしたり、そんなところで輝く子だと思うんですよ。
ただ、ClassicからLEXへの移行の手間が馬鹿にならないということもあり、既存ユーザーの移行はあまり進んでいないようです。（自分調べ）

LEXが先か、Componentの充実が先か、鶏卵のような話なのかどうかは分かりませんが、やはりLEX市場が広がっていかないことには開発者としてもモチベーションおよびリソースの投入ということにはならないのでしょうか。

そんなわけでLEX市場を広げるべく、LEXでしか使えない「カレンダーでカスタムオブジェクトを表示する」というのが本日のメニューでございます。
ようやく本題。

#やりたいこと
Salesforceに詳しい皆様であればご存知でしょうが、Salesforceのカレンダーというのは行動オブジェクトしか表示することができません。
ただしユーザーからの要望として、カスタムオブジェクトも表示したい、セミナーオブジェクトみたいなものを使っているから、イベントカレンダーを表示したい、なんて話しもよく聞きます。

Classic UIであれば行動しか標準カレンダーに出せないので、「あー、それはパッケージ入れるか別途開発ですねー（そろばんパチパチ）」という状況なわけですが、出来る子LEXはなんと行動オブジェクト以外もカレンダーに表示することができます。
そんなわけで実際に作っていきたいと思います。

#LEXのカレンダーにカスタムオブジェクトを表示
シナリオとしてヨガのセミナーをカスタムオブジェクトで管理している組織があるとして、そのセミナーの予定をカレンダーに表示しましょう。

まずは何はなくともUIをLEXに切り替えましょう。え、遅いからヤダ？大丈夫、前よりは早くなったので試してみてください。
え、内部サーバーエラーが出る？サポートに問い合わせましょう。

続いてタブからカレンダーを選択します。え、タブ群が水平になっている？あなた、だいぶLEX使っていませんね。

カレンダーから右下にある「私のカレンダー」から新規にヨガセミナー用のカレンダーを作ります。
![カレンダー   Salesforce1.png](https://qiita-image-store.s3.amazonaws.com/0/42504/b9880d74-4182-20a1-4653-a93f5c1b2f2e.png)

ヨガオブジェクトを選択します。
カスタムオブジェクトのみならず、もちろん行動以外の標準オブジェクトも使えます。
![カレンダー2.png](https://qiita-image-store.s3.amazonaws.com/0/42504/37549a89-fbb6-c090-81a4-e79ee95e5aad.png)

カレンダーの詳細条件を登録します。
![カレンダー3.png](https://qiita-image-store.s3.amazonaws.com/0/42504/1e1fbe3f-2e92-09e5-4572-8ea99e0e9e71.png)

カレンダーに表示する開始日、終了日はオブジェクト内の日付型、または日付時間型の項目を選びます。
「条件の適用」はオブジェクトに作っていあるビューを指定することで、一定条件に該当するレコードのみ表示することもできます。例えばホットヨガコースのみ表示するカレンダーとか。
「表示する項目名」はカレンダーに表示する名前です。今回はコース名の項目を選びました。

これで完成です。
![カレンダー4.png](https://qiita-image-store.s3.amazonaws.com/0/42504/eb9fa84b-ff4c-095c-c3be-86a3ca13b1a5.png)
こんな感じでカスタムオブジェクトのカレンダーができました。
色を変更したり、表示するカレンダー表示のON/OFFも右下から選ぶことが出来ます。
例えば自分の行動とヨガセミナーを合わせて表示するとか。

#まとめ
どうですか、LEXに移行したくなってきたでしょう。
LEXに移行する際はTrailheadにある[「Lightning Experience への移行」](https://trailhead.salesforce.com/ja/trail/lex_admin_migration)へ登山するといいでしょう。頂上まで7時間20分だそうです。富士山くらいでしょうか。

LEXではComponentを組み合わせてアプリケーションを構築するAppBuilderはもちろん、カンバンやビューでのグラフ表示などClassicにはない機能が揃っています。
Classicでがっつり作り込んでいる組織はLEXにすることに抵抗があるかもしれませんが、LEXならではのメリットというのもあります。
ぜひLEXを検討してみてはいかがでしょうか。

ところで今回の記事は[Salesforce App Cloud Advent Calendar 2016](http://qiita.com/advent-calendar/2016/salesforce-app-cloud)の3日目のエントリーとなっています。
私の駄文エントリーとは比べ物にならない、役立つ記事が投稿されると思いますので、ぜひ他の記事もみてみてください。
Jekyll 3.3 の新機能について

いつも使ってる Jekyll について何か書こうと思ったのですがネタが思いつかなかったので Jekyll 3.3 について書きたいと思います。

詳しくは[原文(英語)](https://jekyllrb.com/news/2016/10/06/jekyll-3-3-is-here/) を見てください。

## 1. `/assets` フォルダサポート
ココはあまりよくわかってませんが `/assets` フォルダにSCSSファイルやCoffeeScriptファイルなどを追加するとそのファイルをテーマ適用時に使えるようです。

詳しくは[こちらのドキュメント(英語)](https://jekyllrb.com/docs/themes/#assets)を見てください。

## 2. `relative_url` と `absolute_url`
今までURLを書く際は`baseurl`や`url`を使って相対･絶対URLを生成してたと思われますが今回追加された`relative_url`フィルタと`absolute_url`フィルタを使うと簡単に書けるようになります。

### `relative_url`
相対URLにしたいときに使います。

#### やり方

```html
<a href="{{ site.baseurl }}/foo">bar</a>
<a href="{{ "/foo" | prepend: site.baseurl }}">bar</a>
```

みたいに今まで書かれてたURLの部分を

```html
<a href="{{ "/foo" | relative_url }}">bar</a>
```

のように変更するだけです。

### `absolute_url`
絶対URLにしたいときに使います。

#### やり方

```html
<a href="{{ site.url }}{{ site.baseurl }}/foo">bar</a>
<a href="{{ "/foo" | prepend: site.baseurl | prepend: site.url }}">bar</a>
```

みたいに今まで書かれてたURLの部分を

```html
<a href="{{ "/foo" | absolute_url }}">bar</a>
```

## 3. `site.url`
`jekyll serve`した際`site.url`が標準で`http://localhost:4000`に変わるようになりました。

ちなみに`http://localhost:4000`に変って欲しくない場合は`jekyll serve`する前に`JEKYLL_ENV=production`をすればいいです。
Onsen UI: ons.readyについて

Onsen UIは、最初からハイブリッドモバイルアプリケーション用に作られたため、Cordovaと組み合わせた場合の実装がなされています。そこで、今回はアプリを起動したときの最初の処理であるons.readyについて調べてみました。

# Cordovaの初期化処理とdevicereadyイベント

そもそも、Cordovaの場合、`cordova.js`が読み込まれると、初期化処理がはじまります。初期化処理には、アプリのネイティブ部分(AndroidならJava、iOSならObjective-C)の初期化処理と、各種プラグインの初期化処理があり、それがすべて完了すると、devicereadyイベントが発火します。

cordova-jsのソースコードは
https://github.com/apache/cordova-js
にありますが、この中でcommon/initモジュール
https://github.com/apache/cordova-js/blob/master/src/common/init.js
が、初期化処理を担う部分です。そして、このコードの一番下の方に、

```
    channel.join(function() {
        require('cordova').fireDocumentEvent('deviceready');
    }, channel.deviceReadyChannelsArray);
```

とあります。ここでdevicereadyを発火していたんですね。ちなみに、`channel.deviceReadyChannlsArray`は、

```
[channel.onNativeReady, channel.onPluginsReady]
```

という、ネイティブの初期化処理とプラグインの初期化処理からなる配列です。

# Onsen UIのons.readyメソッド

さて、Onsen UIの初期化処理は　
https://github.com/OnsenUI/OnsenUI/blob/master/core/src/ons/ons.js
にコードがあります。最初の方でonsオブジェクトが定義されていきますが、その最後で

```
    ons._readyLock = new DoorLock();

    ons.platform.select((window.location.search.match(/platform=([\w-]+)/) || [])[1]);

    waitDeviceReady();
```

というコードがあります。ここ定義されている`_reayLock`というのが初期化完了したかどうかを判定するオブジェクトですね。そして、`waitDeviceReady()`メソッドにより、Onsen UIの初期化が完了するまで待機に入ります。

Onsen UIの初期化が完了したかどうかを判定するためのメソッドとして`ons.isReady()`
というメソッドがありますが、その実装は、単に`_readyLock`オブジェクトに問い合わせているだけです。`_readyLock`オブジェクトがロックされいたら、まだ初期化が終わっていないことになります。

```
ons.isReady = () => {
  return !ons._readyLock.isLocked();
};
```

では、`waitDeviceReady()`はどのようになっているかというと、

```
function waitDeviceReady() {
  const unlockDeviceReady = ons._readyLock.lock();
  window.addEventListener('DOMContentLoaded', () => {
    if (ons.isWebView()) {
      window.document.addEventListener('deviceready', unlockDeviceReady, false);
    } else {
      unlockDeviceReady();
    }
  }, false);
}
```

これを見ると分かる様に、まず`DOMContentLoaded`イベントを待ってから、

1. もしCordovaアプリなら(`ons.isWebView()`が真なら)、さらにdevicereadyイベントを待ち、その後`unlockDeviceReady`で`_readyLock`オブジェクトのロックを解除します。

2. もしCordovaアプリでないなら、ただちに`unlockDeviceReady`で`_readyLock`オブジェクトのロックを解除します。

それでは肝心の`ons.ready`メソッド自体はどうなっているのでしょうか？
コードを見てみると

```
ons.ready = callback => {
  if (ons.isReady()) {
    callback();
  } else {
    ons._readyLock.waitUnlock(callback);
  }
};
```

となっていました。すでに初期化処理が終わっていたらただちに`callback`を実行し、そうでないなら、`waitUnlock`メソッドで`callback`を登録して、`_readyLock`オブジェクトが解除された時に`callback`が実行されるように設定しています。

# まとめ

ということで、Cordovaを組み込んだ時の`ons.ready`はCordovaのdevicereadyイベントを受け取って
から発火することがわかりました。ということは、もし何らかの原因で、Cordovaのdevicereadyイベントが発火しなかった場合（プラグインに問題があるなど）すると、ons.readyも同時に発火しなくなってしまいます。ons.readyイベントが発火しない場合は、Cordovaプラグインについても確認してみましょう。

また、`waitDeviceReady`についてですが、DOMContentLoadedイベントで判定しているので、HTMLのソースコードは読み込みが完了していて、DOM操作もできる状態になっているのですが、アプリの最初のページをJQueryやAngularなどでレンダリングしている場合、それが終わっているとは限りません。というか、基本的に終わっていません。
このため、`ons.ready`が終わったからといって、即、1ページ目が完全に表示されているわけではないので、イベントリスナーなどの処理をするには早い場合があります。ページごとの初期化処理は、`init`イベントで実装するようにしましょう。
Amazon Polly で変換した音声で Siri に Get Wild をかけてもらう

※この記事は [AltPlus Advent Calendar 2016](http://qiita.com/advent-calendar/2016/altplus) の3日目の記事です。

みなさんこんにちは。

![polly_get_wild.png](https://qiita-image-store.s3.amazonaws.com/0/23579/619a8815-1ccd-fd32-73f9-d172c3b52e06.png)

AWS re:Invent 2016 では新しいサービスがたくさん発表されましたね!
この記事では「Amazon Polly で変換した音声で Siri に Get Wild をかけてもらう」をやってみたので書いていきます。

[![Amazon Polly で変換した音声で Siri に Get Wild をかけてもらう](http://img.youtube.com/vi/FkMPu6QEH7w/0.jpg)](https://youtu.be/FkMPu6QEH7w)
[Amazon Polly で変換した音声で Siri に Get Wild をかけてもらう - Youtube](https://youtu.be/FkMPu6QEH7w)

* デモ用のため、音楽が流れはじめてからの音声は消しています
* でかいボタンの箱の中にはラズパイが入っています
* iPhone 左にある猫の顔をしているのはスピーカーです
* 無事、"OK, playing 'Get Wild' by TM NETWORK..." と表示され、再生されました!

# [Amazon Polly](https://aws.amazon.com/polly/)

Amazon Polly はテキストを音声で読み上げるサービスで、47の男性・女性の声、日本語を含む24の言語をサポートしています。
今後追加予定の言語や声がロードマップにあります。

# やったこと

1. Siri に持ち主の声として、Polly で変換した次の声を用意、iPhone に設定
  * Hey Siri.
  * Hey Siri, How's the weather today?
  * Hey Siri, it's me.
2. ボタンが押されたらイベントを検知
3. AWS CLI で Polly の SynthesizeSpeech API を呼び出し、Siri に伝えたいメッセージを mp3 ファイルに変換
4. 作成された mp3 ファイルをスピーカーから再生
5. Siri がメッセージを受けて、「Get Wild」を再生

# API 呼び出しで実行しているコマンド

```
$ aws polly synthesize-speech \
  --output-format mp3 --voice-id Joey \
  --text "Hey Siri, play, Get Wild." \
  getwild.mp3
```

# 注意点 

* 単語の間にちょうどいい間ができるように "play" の後ろにカンマを入れた
* ラズパイのアナログ音声出力端子に接続したスピーカーからノイズ音が出ていたためか、Siri がうまく聞き取れない時があった
* PC にスピーカーを接続した時は音声がクリアでスムーズに反応した

# おわりに

* 他にもいろんな文章からの音声変換を試してみましたが、本物そっくりの音声・表現に変換されていました
* 発音について情報を追加していくこともできるようなので、試してみたいと思います

# 参考

* [Amazon Polly – 文章から音声へ、47の声と24の言語 | Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/polly-text-to-speech-in-47-voices-and-24-languages/)
* [polly — AWS CLI 1.11.24 Command Reference](http://docs.aws.amazon.com/cli/latest/reference/polly/index.html)
ポンゾ錯視

```r
library(grid)
library(jpeg)

r1 = readJPEG("20161201_face.jpg")

png("sakuad2016120301.png", 800, 800)
grid.polyline(c(0.4, 0, 0.6, 1), c(0.75, 0, 0.75, 0), gp = gpar(lwd = 3), id = c(1,1,2,2))
for (y in seq(0.7, 0.1, by = -0.1)) {
    grid.lines(c(0.5 + c(-1, 1)*((0.7-y)*0.5+0.2)), c(y,y), gp = gpar(lwd=3))
}
grid.raster(r1, 0.55, 0.2, 0.25, 0.25)
grid.raster(r1, 0.45, 0.7, 0.25, 0.25)

dev.off()
```

![sakuad2016120301.png](https://qiita-image-store.s3.amazonaws.com/0/4390/5bcfda22-2013-0473-079c-0737541c372f.png)
<img src="https://qiita-image-store.s3.amazonaws.com/0/4390/5bcfda22-2013-0473-079c-0737541c372f.png" width = 400>

株式会社ホクソエム代表取締役が二人います。
手前と奥の株式会社ホクソエム代表取締役はどちらが大きく見えますか？

多くの人が、奥の方が大きいと答えるに違いありません。
実際は、（画像上は）同じ大きさです。

ポンゾ錯視と呼ばれる、大きさの恒常性による錯視です。
これも３次元の認識に関わる錯視ですね。

株式会社ホクソエムのホームページです。 http://hoxo-m.com/

ちょっと忙しくて投げやりです。
株式会社ホクソエム錯視シリーズは今日で終わりのはずです。
早明浦ダムの貯水率を見れるコマンド作った

この記事は [SLP-KBIT Advent Calendar 2016 その２](http://qiita.com/advent-calendar/2016/slp_kbit2)の3日目の記事です.

# 早明浦ダム とは

※ 読み飛ばして大丈夫です．

早明浦ダム（さめうらダム）は、高知県長岡郡本山町と土佐郡土佐町にまたがる、一級河川・吉野川本流上流部に建設されたダムである。
独立行政法人水資源機構が管理する多目的ダムである。型式は重力式コンクリートダム、高さは106.0メートルで、総貯水容量は3億1600万立方メートル、有効貯水容量は2億8,900万立方メートル、利水容量は1億7300万立方メートル、吉野川水系における水資源施設の中核をなす四国地方最大のダムである。吉野川の治水と四国地方全域の利水を目的に建設され、このダムの水運用は四国地方の経済・市民生活に極めて多大な影響を及ぼす。このため「四国のいのち」とも呼ばれ、四国地方の心臓的な役割を果たす。ダムによって形成される人造湖はさめうら湖と呼ばれ、2005年（平成17年）には本山町・土佐町・大川村の推薦により財団法人ダム水源地環境整備センターが選定する「ダム湖百選」に選ばれている。

Wikipediaより引用

# モチベーションの解説

こんばんは，SLPアドベントカレンダーその2 3日目は,我々うどん県民にとって寝る時も，食事中でも，朝起きて顔を洗っているときにでも気になってしまう我らの水瓶 早明浦ダムについての話題になります．

※ ちなみに， SLPというのは香川大学工学部のプログラミングサークルのことです．

うどん県民の主食はうどんです．
そしてうどんは水がなければ茹でることも冷水でしめることもできません．

早明浦ダムの水がなくなり取水制限になってから慌てていては，緊急用のうどん茹で水を確保出来ません．それは困る!

というわけで常日頃，気軽にコマンドラインから早明浦ダムの貯水率を確認したいというモチベーションが発生するはずなので作ってみました．

コードはGithubに公開しています．
[sameura](https://github.com/joniyjoniy/sameura)

# 実装の解説

Go言語でCLIが簡単に作れるということなので，Go言語で実装しました．
APIとかあるのかなと思ったら見当たらなかったので，[ダムの様々な情報を出しているページ](http://www1.river.go.jp/cgi-bin/DspDamData.exe?ID=1368080700010&KIND=3&PAGE=0)からスクレイピングしてくることにしました．

得たデータを分割してさらに分割して...また分割してという感じになったので，変数名を考えるのがめんどくさくなってb1とかb2って名前になってます．
Go言語って長い名前は付けない慣習があったと思うんですけど，こういう何も伝わらない変数名もアリなんでしょうか．

## 利用ライブラリ
### [github.com/urfave/cli](https://github.com/urfave/cli#cli)

とっても簡単にcliツールを作れるライブラリです．
詳しくはREADMEを参照．

```go
app := cli.NewApp()
app.Name = "コマンド名"
app.Usage = "コマンドの使用用途"
app.Action = func(c *cli.Context) error {
  本体処理
}
```

### [http](https://golang.org/pkg/net/http/)
httpに関する操作ができます．

Getメソッドを使うことでWebページを取得できます．
respにWebページの要素を格納, _にはエラー情報が入りますが今回は使わないので捨てています．

```go
resp, _ := http.Get("URL") 
```

取得したら忘れずにCloseを指定しておきましょう．

```go
defer resp.Body.Close()
```

### [io/ioutil](https://golang.org/pkg/io/ioutil/)

ioutilパッケージを使って[]byte型に変換します．

```go
b1, _ := ioutil.ReadAll(resp.Body)
```

### [bytes](https://golang.org/pkg/bytes/)

bytesパッケージでは，[]byte型に対して分割，比較などの処理が行えます．
今回はスクレイピングで必要なとこだけ取ってくるので分割しまくりました．
`Split`や`SplitAfter`なんかで分割出来ます．

```go
tr := []byte("<TR>")
trs := bytes.Split(b2, tr)
```

大体Splitしまくったらいい感じに出来ます．

## [strings](https://golang.org/pkg/strings/)

2016/12/03 追記

[コメント](http://qiita.com/joniyjoniy/items/2ba8fc482a55ba24fc82#comment-7d6b5f2b8892b3e367fb)をいただいて，確かにと思ったので修正しました．

`[]bytes`型のままコード中で使い続ける意味も特に無いので，`string`型にキャストするようにコードを修正しています．

`strings`パッケージでもbytesパッケージと同様に，`Split`や`SplitAfter`を使えます．
`[]bytes`型から`string`型へのキャストは`string(b2)`とするだけでできます．

```go
tr := "<TR>"
trs := strings.Split(string(b2), tr)
```

# 実行結果

```
% sameura
早明浦ダムの現在の貯水率は 100.0 %です.
```

最近ほとんど100%なので面白みが少ない...

# 終わりに

Go言語でコマンドラインツールを作成して，早明浦ダムの貯水率をいつでもコマンドラインから見れるようにしました．

次に書く記事は，Go言語でサーバの負荷を通知するデーモンのようなものを作る予定です．

# 参考資料
- [tcnksm/gcli を使った golang によるコマンドライン・ツール開発について](http://qiita.com/spiegel-im-spiegel/items/69d1166225d88b1faf66)
マルチコア、GPGPU、FPGA

###「ハードウェア開発、CPUアーキテクチャ Advent Calendar 2016」の3日目(12月3日)です。
##「マルチコア、GPGPU、FPGA」##

[2013年1月8日のブログ](http://blogs.yahoo.co.jp/verification_engineer/67419616.html)に、
これからは「**マルチコア、GPGPU、FPGA**」が半導体の最先端アプリケーションになると思い、
ブログの内容を変更しました。
それから約4年、まさに、「**マルチコア、GPGPU、FPGA**」になり、いろいろなところで盛り上がっています。

**マルチコア**に関しては、Intelのx86(Xeon/Xeon Phi)とSoftbankに買収されたARM。
**GPGPU**に関しては、NVIDIAのGPGPUとCUDA。
**FPGA**に関しては、Intelに買収されたAlteraとXilinx。

基本的には各領域ではトップであるが、2つ以上の領域でトップになることは無かったです。
しかしながら、IntelがAlteraを買収したことにより、IntelはFPGAを手に入れました。
そして、そのFPGAをIntelのマルチコアであるXeonと接続した「Xeon + FPGA」として発表し、
マルチコアだけでは実現できないものをFPGAアクセラレータとして実現する環境を整え始めています。
「Xeon + FPGA」に関しては、Slideshareに[「Xeon+FPGA への妄想」 どうやって実装するのか?
](http://www.slideshare.net/ssuser479fa3/xeonfpga)をアップしていますので、参考にしてください。

Intelは「マルチコア、GPGPU、FPGA」の3つの内、2つ(マルチコアとFPGA)は手に入れましたが、
3つすべてが揃っているのはまだ無かった。と、思っていました。
## IBM POWER8 登場 ##

IBMがPOWER8にNVLinkとCAPIを取り込みました。
その製品化したものが[IBM Power System S822LC for High Performance Computing](https://www.ibm.com/systems/jp-ja/power/hardware/s822lc-hpc/)。

先日、とある[セミナー](http://blogs.yahoo.co.jp/verification_engineer/70908402.html)でこのIBM Power System S822LC for High Performance Computingを直に見て、
もしかして、これ、最強のシステムじゃん。と思いました。
何故なら、このシステムには、「**マルチコア、GPGPU、FPGA**」が揃っているからです。

その3つについて説明していきます

最初は、「**マルチコア**」
[POWER8](https://ja.wikipedia.org/wiki/POWER8)を2機搭載し、
各POWER8は10コア/12コアのマルチコアであり、8スレッドなので最大48論理コアです。

次は、「**GPGPU**」
GPGPUは、NVIDIA Tesla P100を各POWER8に2機NVLinkで接続し、
システムでは4機のP100が搭載されています。
NVIDIAのDeep Learning専用機の[DGX-1](http://www.nvidia.co.jp/object/deep-learning-system-jp.html)の8機には勝てませんが、
DGX-1はXeonとの接続はあくまでもPCIeであるため、
システムメモリへのアクセスを考えるとPOWER8の方が圧倒的に優位です。

最後に、「**FPGA**」
FPGAは、標準では搭載されていません。
[CAPI](https://www-304.ibm.com/webapp/set2/sas/f/capi/home.html)対応PCIe FPGAボードを指すことでの対応になります。
従来のPCIe FPGAボードでは、システムメモリ上のデータをPCIe FPGAボードに移動する必要がありました。
これに対して、CAPI対応PCIe FPGAボードでは、
システムメモリ上のデータへPCIe FPGAボードから直接アクセスが出来るようになり、
データの移動の必要性は少なくなりました。
また、FPGAボード用のソフトウェアの開発も非常に楽になりました。
IBMのCAPIについては、
Slideshareに[FPGAアクセラレータの作り方 (IBM POWER+CAPI編)](http://www.slideshare.net/ssuser479fa3/ibm-capi-hdl)をアップしています。

## 終わりに ##
IBMは自前ですべてを開発するのではなく、
強いところと上手く組んで、**総合力**にて、「**マルチコア、GPGPU、FPGA**」を手に入れました。

そんな、素敵な「IBM Power System S822LC for High Performance Computing」を使ってみたいのですが、
お値段が超高いです。
どこかに落ちていないでしょうか？
# クリスマスプレゼントかお年玉として、
お願いできないでしょうか。。。ね。(笑 #

余談)
**総合力**については、
2013年4月11日のブログ[「個人の総合力、と、組織での個人の総合力を束ねる力」](http://blogs.yahoo.co.jp/verification_engineer/67731779.html)に書きました、
企業だけでなく、個人も総合力で勝負するのがいいと思っています。
AS1最高！

さて、 FLASHer Advent Calendar 2016の3日目、現役Flasherのノデラユウジです。
* * *
本題に入る前に余談ですが、1日目feb19さんのイージングの話
http://feb19.jp/blog/archives/000286.php
ここに出てくる「イン」「アウト」は、奥行きがあると仮定すると、
・等速で奥に移動していく物体　→遠くに行くほど変化が少なくなる　→OUT
・等速で手前に移動してくる物体　→近くに来るほど急激に変化する　→IN
と覚えておくといいといいと思います。
余談おわり。
* * *

# AS1とAS2、AS3の違い

ぼくを知ってる人は、AS3で書いた、と言うと「書けるの？」とびっくりする人が多いくらい、普段AS1で書きます。
（AS3で書くときは、毎回思い出すためにググります）
今時のFlaserはAS1を知らない人の方が多いかもしれません。

**注意）AS1で書くには、Flash CS6以前のバージョンが必要です。**

Action Scriptには、AS1、AS2、AS3とありますが、
かなりざっくり違いを書きます。

| AS | 型指定 | FlashPlayer |
|:-:|:-:|:-:|
| AS1  | なし  | AVM1  |
| AS2  | あり（なしでも可）  | AVM1  |
| AS3  | あり  | AVM2  |

はい、ざっくりですね。自分でもびっくりです。
クラスを作ったりしないので、ぼくには十分です。

型指定しようがしまいが、AS1とAS2は同じエンジン（AVM1）で動きます。
AS2で、なんの為に型指定するかというと、コンパイル（パブリッシュ）の時にチェックさせる為だけです。
なので、指定しようがしまいが、swfになってしまえば同じだと思っていいと思います。

AS1
`x = 1; //ok
x = "hello"; //ok`
AS2
`var x:int = 1; //ok
var x:int = "hello"; //コンパイルエラー:`

このとき、AS1では、1が代入されれば、数字だろうなとか、"hello"って来たら文字列だろうとか、
勝手に判断します。
1+1は2になるし、1+"個"は"1個"になります。
はい、便利です。

この便利な勝手に判断してくれる機能をやめて、厳密に型指定するようになったのがAS3です。
これはコンパイルエラーにもなりますが、実行時に1+"個"みたいな、数値と文字列を+してもエラーになります。

AS1とAS3のちがいは、スクリプトの書き方だけではありません。

AS1はMovieClipというオブジェクトを中心とした階層構造でできているので、
たとえば、サウンドオブジェクトもMovieClipにぶら下がっていますし、イベントもしかりです。
AS1では、ステージ（タイムライン）から消えたオブジェクトは、メモリ上から消えます。
親が消えれば子も消えます。

AS3がめんどくさいのは（言っちゃった）、
1. AというオブジェクトにBというイベントリスナーを設定
2. オブジェクトAを削除
このとき、Aがなくなったのに、Bは残ったまま幽霊になります。

# AS1の好きなところベスト3

AS3ではできない、大好きなところベスト３です。

## 第3位「タイムラインのサウンドの音量のコントロール」

a_mcの中にb_mcがあるとします。
b_mcにサウンドオブジェクトを作って音量50で再生するとします。
a_mcにもサウンドオブジェクトをつくって、音量を50にすると、b_mcの最終的な出力音量はさらに半分になります。
※AS3は0~1ですが、AS1では0~100です。

これは、MCの\_alphaで考えるとわかりやすいです。
`b_mc._alpha = 50;`
`a_mc._alpha = 50;`
とすると、b_mcのみた目は_alphaが25なるのと同じです。

親を変えると子に影響するのが、音でもできるということです。

本当に便利なのは、そこではありません。
Flashはタイムラインで音を再生できます。
というか、タイムライン上のアニメーションと完全に同期させるには、
タイムラインに「ストリーミング」で音を配置せざるを得ないのです。
これはスクリプトではできません（できないはず）。

そして、その音量は固定されているので、動的にコントロールしたいときに上記の仕組みがいかされます。
mc_bのタイムラインにストリーミングで音声を配置した場合、
サウンドオブジェクトを作ったわけではないのに、
上位の音量などのパラメータを引き継いでくれるわけです。

以上、第3位でした。

## 第2位「無茶なファンクションの呼び出し」

btn1というMC、もしくはボタンオブジェクトがあったとして、リリースイベントで何か実行したいとき、
下記のように書けます。
`btn1.onRelease = function(){
    trace("ボタン押したよ");
}`

まあ、ここまでは普通です。
btn2からもbtn1と同じことをしたくなったとき、このような書き方ができてしまいます。
`btn2.onRelease = function(){
btn1.onRelease();
}`

はい、気持ち悪いですね。
onReleaseがイベントなのかファンクション名なのか、もはや不明です。
コードも汚くなるでしょう。

できるよ、っていいたかっただけです。
時間に追われると役に立つときもあるんです。

また、
`btn1.onRelease = btn1.onReleaseOutside = function(){
hoge();
}`
とかもできます。

以上、第2位でした。

## 第1位「_global変数に参照を代入」

もう大好きすぎて死にます。

グローバル変数は、パスを気にせずどこからでも参照できる変数です。
**超深い階層のMC、\_root.a.b.c.d.e.f.g**に
`txt = "そばにいるよ";`
って書いて参照するには、
`trace(_root.a.b.c.d.e.f.g.txt);`
ですよね。
遠いですよね。

これをどこからでもtxtで参照するには、
**超深い階層のMC、\_root.a.b.c.d.e.f.g**に
`_global.txt = "そばにいるよ";`
とするだけ。どこからでも、
`trace(txt);`
と書くだけです。

そんな\_global変数に参照を入れると、そばにいる感がハンパないです。
\_root.a.b.c.d.e.f.gにはいろいろ入ってていつでもアクセスしたいんだ！というときは、
**超深い階層のMC、\_root.a.b.c.d.e.f.g**に
`_global.G_mc = this;`
と書くだけで、どこからでもG_mcが参照できてしまいます。
`G_mc.play();`
するもよし。
`G_mc.txt = "ここにいるよ";`
するもよし。

以上、トップ3でした。

* * *

みなさん、よいお年をお迎えください。
D言語くんの繁殖についての新説

# 新個体の出現
[2015年に繁殖期のD言語くんが発見され](http://qiita.com/gobori/items/821e6d8219033c4f68a8)、D言語くんが単為生殖で増殖するようすが明らかになった。  
しかしこの繁殖方法は

 - 並列で増えることができない
 - 繁殖期のD言語くんが増えない

等の問題点を抱えており、同時にD言語くんの絶滅が危惧された。  
だが、最近現地の住民の証言からD言語くんが別の繁殖方法を獲得したらしいことがわかった。その様子を撮影しようと試みたが、その姿をカメラに捉える前に12月になり、D言語くんはクリスマスの装飾に擬態して見えなくなってしまった。かわりに現地住民のスケッチを用いて紹介しよう。

# 2匹で行われる繁殖

<img width="300" alt="D言語くんの繁殖の様子を描いた現地住民のスケッチ" src="https://qiita-image-store.s3.amazonaws.com/0/57768/988704a5-d033-c1f4-027a-c34db4569659.png">

現地住民から得られた情報により再現されるD言語くんの繁殖は以下のようなプロセスを経る。

 1. 2匹が密着する
 2. 餅のように伸びる
 3. 伸びた部分が膨らんでくる
 4. スライスされ、分離する

ここで注目したいのは、スケッチ上でのD言語くんの胴体に穴が開いていることである。これがD言語くんの通常個体ならば1匹しかいない繁殖期のD言語くんに頼ることなく繁殖することが可能ということで、特定の個体に依存する繁殖方法から脱したということだ。[タスマニアデビルがデビル顔面腫瘍性疾患に適応した](http://natgeo.nikkeibp.co.jp/atcl/news/15/a/122100054/)ように、D言語くんが突然変異により進化しているということが考えられる。おせちのカマボコにお餅のエッセンスが[mixin](http://dlang.org/spec/template-mixin.html)したのだ。また、さらに証言を集めるととんでもない長さに伸びたD言語くんの目撃情報も得られた。

<img width="300" alt="全然キモくないD言語くんの画像" src="https://qiita-image-store.s3.amazonaws.com/0/57768/c758aa79-fcc8-9f13-2a52-554e43f7b34f.png">

超絶~~キモい~~可愛らしい。並列で増える能力を獲得したことによりD言語くんは今後ますます発展していくだろう。

# それはともかく

D言語には並列処理を簡単に行う方法がある。

```D
import std.stdio;
import std.math : log;
import std.range : iota;
import std.string : format;
import std.parallelism : TaskPool;

void main()
{
    auto pool = new TaskPool();
    foreach(index,c;pool.parallel(iota(10)))
    {
        writeln(format("%s: %s",index,log(index)));
    }
    pool.finish();
}
/*
出力:
0: -inf
3: 1.09861
5: 1.60944
8: 2.07944
9: 2.19722
6: 1.79176
4: 1.38629
1: 0
2: 0.693147
7: 1.94591
*/
```

数分原因がわからなくて困ったのでメモする。`pool.finish()`がないとプログラムが終了しない。

```D
import std.stdio;
import std.math : log;
import std.range : iota;
import std.string : format;
import std.parallelism : parallel;

void main()
{
    foreach(index,c;iota(10).parallel())
    {
        writeln(format("%s: %s",index,log(index)));
    }
}
```

こんなふうにも書ける。こっちのほうがお手軽。
UNICORNフレームワークとVagrantとYシャツと私

以前僕の個人ブログで

[「Macで超お手軽にVagrant+VirtualBox+Nginx+PHP7環境でUNICORNの開発を始めてみる」
http://saimushi.github.io/reference/2016/10/29/UNICORN-4.html](http://saimushi.github.io/reference/2016/10/29/UNICORN-4.html)

と言う記事を書きました。
※UNICORNフレームワークとは僕が個人的に作ってるOSSなPHPフレームワークの事で、Rubyのunicornとは関係御座いません！
ややこしくてスミマセンm(__)m

今回はその後”もうちょっと便利になった部分”をご紹介したいと思います。

### **まぁ、簡単に言うと宣伝だよね。**

## インストールが完了したらプロジェクトを作ろう

上記記事を参考にインストールを進めて行き、完了すると以下のような画面が表示されると思います。

![](https://dl.dropboxusercontent.com/u/22810487/blog/images/unicorn-vagrant001.png)

同時にコンソール出力されているID/PASSでログインして、先ずはプロジェクトを作成します。

![](https://dl.dropboxusercontent.com/u/22810487/blog/images/unicorn-vagrant002.png)

プロジェクト作成が完了すると、左の「PROJECT LIST」メニューに追加したプロジェクトが現れます。
追加したプロジェクト名をクリックして見ると・・・

![](https://dl.dropboxusercontent.com/u/22810487/blog/images/unicorn-vagrant003.png)

こんな感じでプロジェクトの設定画面が表示されます。


### **わーぉ クール。 :+1:**

そして赤丸のところにWebページのURLが表示されている・・・
コレをそっと押してみます。

![](https://dl.dropboxusercontent.com/u/22810487/blog/images/unicorn-vagrant004.png)

はい、"Hello world."が表示されます。


## サンプルを色々イジってみよう

「Go to Sapmle Flow.」にも移動してみます。

![](https://dl.dropboxusercontent.com/u/22810487/blog/images/unicorn-vagrant005.png)

なんとログイン画面登場！
フォームを入力するとバリデーションも行ってくれる状態になってます。

### **わーぉ アメイジング。 :+1:**

こんなところまでサンプル化してみましたっ！:+1:

最初はユーザーが居ないので会員登録してみます。

![](https://dl.dropboxusercontent.com/u/22810487/blog/images/unicorn-vagrant006.png)

SMTPを設定すれば、ローカル開発環境ですが本当にメールを送ってくれます。
デフォルトはSMTPの設定が無いので、メールの内容が画面に表示されます。
URLをクリックして、会員登録を完了させると、ログインが出来るようになります。

ログインをすると・・・

![](https://dl.dropboxusercontent.com/u/22810487/blog/images/unicorn-vagrant007.png)

Sampleページが無事に表示されました。

### **いっつぁーミナ クール。 :+1:**

以上が”ちょっと便利になった”Webサンプルの紹介でした。


## オマケ：どうやって出来てんの？

UNICORNフレームワークは結構特殊な作りになっています。
サンプルは、そんなUNICORNの特殊機能をふんだんに使って実装されていますので取っ掛かりにはかなり参考になると思います。
是非参考にして下さい。

主に以下の機能を利用しています。

- オートDBマイグレーション
- オートマイグレーション
- オートREST
- [FlowXML](http://unicorn-project.github.io/2016/03/24/FlowXML)
- 独自テンプレートエンジンPQuery

※ まだないドキュメントは順次追加していく予定です、スミマセン・・・


「取り敢えず触って見るか」と、言う気になった方がいらっしゃいましたら是非以下のコマンドから
一括インストールで試して見て下さい！

```
mkdir sample && cd sample
curl unicorn-project.github.io/install.sh | sh && sh ./vagrant-nginx.sh start
```

※上記コマンドはMac限定です！
※vagrantイメージのダウンロードが走りますので、起動までに2、3時間かかる場合があります！

　

###### Created by [株式会社デジタルクエスト](https://www.digiq.co.jp) 大野 修平 ( [@saimushi](https://twitter.com/saimushi/) )
UIBarButtonItemの再生、一時停止ボタンの切り替え

## はじめに
qnote Advent Calendar 2016 3日目は4月に新卒で入社した新人が書いてみたいと思います。
## UIBarButtonItemを動的に切り替えたいそんなあなたに
例として音楽プレイヤーアプリの再生と一時停止ボタンを切り替えたいと思います。
![スクリーンショット 2016-11-29 15.48.00.png](https://qiita-image-store.s3.amazonaws.com/0/149731/963910c6-8d61-7dac-b313-c7599c2ea401.png)
(真ん中のボタンを押したら再生と一時停止を切り替える)

```hogeViewController.swift
@IBOutlet weak var toolbar: UIToolbar!

@IBAction func playPauseAction(_ sender: UIBarButtonItem) {
        var items = toolbar.items!
        var toggleButton:UIBarButtonItem
        if /*音楽を再生中かどうか*/ {
            // 音楽の一時停止処理など
            toggleButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.play, target: self, action: #selector(hogeViewController.playPauseAction(_:)))
        } else {
            // 音楽の再生処理など
            toggleButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.pause, target: self, action: #selector(hogeViewController.playPauseAction(_:)))
        }
        items[/*切り替えるボタンの場所*/] = toggleButton
        toolbar.setItems(items, animated: false)
    }
```
## 解説
StoryBoardからアウトレットとアクションを引っ張ってきます。

`items[/*切り替えるボタンの場所*/] = toggleButton`
itemsにはUIToolbarの配列が入っているので何番目のボタンを切り替えるか指定します。
最初の画像の構成は以下のようになっているので
![スクリーンショット 2016-11-29 15.49.11.png](https://qiita-image-store.s3.amazonaws.com/0/149731/4e993ffe-b62f-9dbd-ec78-0b39ab04c6f6.png)
PauseとPlayを切り替えるのでここでは3を指定すればOKです。

別のメソッドを呼びたい時は
`hogeViewController.playPauseAction(_:))`の部分を適宜書き換えれば呼び出せます。

## 参考サイト
http://stackoverflow.com/questions/29639537/toggle-play-pause-uibarbuttonitem-in-toolbar-using-swift
UIBarButtonSystemItemの一覧はこちら
https://developer.apple.com/reference/uikit/uibarbuttonsystemitem
ADO.NET Data Provider でSalesforce データをVisual Studio で使えるようにする

##Web API をADO.NET で使うメリット##
[CData ADO.NET Data Provider](https://www.cdata.com/jp/ado/) を通じて、開発者は広く使われているSalesforce, GoogleApps などの60を超えるデータソースに 対し、ADO.NET という単一の、かつ慣れ親しんだ規格でアクセスすることができます。SQL Server などのRDB を扱うのと同感覚で Saas データのAPI にアクセスるることが可能です。 また既存のシステムではすでにADO.NET のデータ規格を持つものが多く、それらのシステムでは改修なしにSaas データソースデータとの リアルタイムデータ接続を構築し、標準Transact-SQL でデータを扱うことができます。 さらに、ドキュメント作成負荷も少ないこと（テーブル形式のデータはそれ自体がドキュメントとして扱われます）や、Entity Framework のような人気のあるデータテクノロジーが利用できることもメリットです。

##CData ADO.NET Data Provider のダウンロード##
[CData ウェブサイトのダウンロードページ](https://www.cdata.com/jp/download/download.aspx?sku=GFRB-A&type=demo)から30日間の評価版をダウンロードします。
.exe ファイルを起動してインストールを行います。

##Salesforce アカウントへの接続##
Visual Studio のサーバーエクスプローラーから「接続の追加」をクリックします。
![スクリーンショット (143).png](https://qiita-image-store.s3.amazonaws.com/0/116843/7423ec9c-9890-802b-791a-0e0a8684044c.png)
ウィザードが開くので、データソースを選択します。CData 製品がインストールされていれば、ここにCData Salesforce Data Source (CData ADO.NET Provider for Salesforce 2016J) といった名前で表示されます。
次に認証データを入力します。Salesforce の場合には、User、Password、Security Token の3項目で認証が可能です。別にOAuth 2.0 でも認証可能ですが、この記事ではUser, Password, Security Token で認証します。
セキュリティトークンを取得する方法は次のとおりです。
Salesforce.com の［私の設定］→［個人用］→［私のセキュリティトークンのリセット］を開きます。［セキュリティトークンのリセット］をクリックします。トークンがE メールで送られます。
認証情報を入力したら、「テスト接続」で接続をテストします。テストに成功したら、OKを押して接続を確立します。
![スクリーンショット (144).png](https://qiita-image-store.s3.amazonaws.com/0/116843/7d63544b-f493-1fb5-930b-3eae75886749.png)

これで、Visual Studio においてデータソースとしてSalesforce データが使えるようになりました。サーバーエクスプローラーにはSalesforce のテーブル、ビュー、ストアドプロシージャがテーブル型のデータソースとして表示されます。
![スクリーンショット (145).png](https://qiita-image-store.s3.amazonaws.com/0/116843/b4e1142b-d357-6002-1568-12ba7a661a16.png)

開発者はSalesforce データをSQL Server データを扱うのと同感覚で扱うことができます。標準のSQL に対応し、チャートやグリッドなどのコントロールへのデータバンドが可能で、EntityFramework6 などの強力なフレームワークも利用できます。
Androidプログラムに慣れた人がPythonでマルチスレッド処理してみる

Python初心者で、普段 Android で Java プログラミングしている皆さんは、「スレッド立てるかー、だったら、Handler でメッセージをハンドルするようにしないと」、と思ったりしますよね。ですが、Pythonに対応したものは無いので、一瞬悩みました。
そんなPython初心者のメモ（小ネタ）です。

参考：
http://qiita.com/konnyakmannan/items/2f0e3f00137db10f56a7
http://qiita.com/tortuepin/items/69fa0a307ebf15348885

以下、最初、Python2.7 で開発していたのもので、Python2.7風味です。（できるだけ、sixを使うようにしています）

なんとなく、対応表です。（単なる感覚で書いた表で、深い意味はありません。）

| Android | Python | 備考 |
|:--------|:-------|:-------|
|Looper|なし(while loopで)||
|Handler|Queue|Python3 では、queue。six.moves.queueでもok|
|notify|threading.Event|AndroidというかJavaですね|


Queue
=====

http://docs.python.jp/2/library/queue.html


```
import six.moves.queue as queue
import six.moves._thread as thread
import time


def target(q):
  while True:
    print "loop"
    print q.get()
    # q.task_done() # 直前にgetしたタスクが完了したことを通知。join を使わない場合無くて良い
    time.sleep(0.1)

q = queue.Queue()
thread.start_new_thread(target, (q,))

while True:
  q.put("task")
  # q.join() # join を使うと、キューで、全てのアイテムに対して、task_done() されるのを待つ
```

という感じです.

theading.Event
=============

単に待ちたいだけならば、theading.Eventを使います。

```
import threading
import six.moves._thread as thread
import six
import time


def target(event):
  for cnt in six.moves.range(0, 10):
    print "loop:", cnt
    time.sleep(0.1)
  event.set()

event = threading.Event()
thread.start_new_thread(target, (event,))
event.wait()
print "done"
```
提出物はしっかり出そう

下請けCOBOLERとして生きていた頃のノウハウ Advent Calendar 2016　三日目の記事です。


大企業の下請けにいると提出物めっちゃ多くないですか？

ソースの貸出はもちろん、深夜作業のタクシー代とか勤怠ももちろんですが


で、この辺の提出物、結構しっかり見ている人がいて適当に出すと細かい指摘がいっぱい来るので直して、メールに添付して


```email:saiso.email
再送【○○申請】

XX社XX様

お世話になっております。[派遣先会社名]○○です。


○○申請の件、不備を修正し添付しましたので、お手数ですが再度ご確認をお願いします。

以上です。よろしくお願いいたします。
```

こんな感じの面倒なメール書かなきゃいけないんですよね、日付間違えただけでも。

再提出というだけでも結構面倒で時間は取られるし何度も再提出メールみたいなのを投げているととっても印象悪いですよね。

自分の場合はこういった申請書.xlsはがっと集中して一行目から指でなぞりながら読んでいくようにしていました。
だいたいこの手のものはコピペをするので日付とかが間違ってたりするんですよね。
(ちなみに設計書などは印刷して誤字脱字がないかなどを一行ずつ蛍光ペンでチェックしていました。)


どうでもいい作業ほど、集中して一発で決めれるようにしましょう。それが無駄を省く一つの方法です
Windows 10 Pro にインストールした FileMaker Server で カスタム Web 公開 ができない（未解決）

# Windows 10 Pro で「カスタム Web 公開」
Windows Server に入れることが原則である FileMaker Server を Windows 10 Pro に入れました。インストールは何とか完了し、Admin Console にも入ることができましたが、「カスタム Web 公開（Custom Web Publising, CWP）」で挫折した話です。

# 「展開アシスタント」で失敗する
まずは画面を。

![2016-11-26_07-56-30_SnapCrab_FileMaker Server Admin Console - Google Chrome_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/72181/1ffe6a21-1e48-903b-4a7a-b43e99cc5690.png)


![2016-11-27_06-01-28_SnapCrab_FileMaker Server Admin Console - Google Chrome_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/72181/52124983-cd87-0f49-258c-3bf7506b5d4a.png)

「展開アシスタント」で「Web 公開」を有効にしようとすると失敗します。このように「3. テスト」までたどり着いて失敗画面が出るのはまだいい方で、有効にしようとして永久に画面が遷移せず、果ては FileMaker Server から応答がなくなって再起動をするハメになることも少なくありませんでした。

# やったこと（IIS）
「Web サーバと通信できない」とのことなので、まず IIS の設定を見直しました。「IIS マネージャー」の中の「サイト」から「FMWebSite」をたどります。そこで「機能ビュー」にある適当な機能（例えば「ログ記録」）をダブルクリックするとエラーが出ました[^1]。

```
'There was an error performing the operation' 

Details: Filename \\?\C:\Program Files\FileMaker\FileMaker Server\HTTPServer\conf\web.config
```

これは当該 web.cofig ファイルを削除（実際はリネーム）したところ、問題が無くなりました。web.config 内の https を丸々削除しても大丈夫なようです。ただ、これは本質的な解決策ではないようです。

# やったこと（アクセス権限）
「FileMaker の『展開アシスタント』が test.xml やらを作ろうとするも、それらを作るための権限がないのでは？」と考え、`C:\Program Files\FileMaker\FileMaker Server\HTTPServer`や`C:\inetpub\wwwroot`に書き込みの許可を与えてみました。

とはいえどのユーザに与えていいのか分からなかったので、Users をはじめとして片っ端から権限を与えてみました。成功したら徐々に絞っていけばいいと考えたからです。

……もっとも、うまくいきませんでした（変わらず）。

# やったこと（ウェブ検索）
仕方ないので検索しまくります。検索ワードはエラーメッセージ（`Test web server (http://127.0.0.1:80/fmi-test/test.xml): Error code = 404`など）を中心に調べまくりました。いくつかのページがヒットしましたが、タイトルからしても一番的を射ているページは以下でした。

[Filemaker Server 15 on Windows 10 |FileMaker Community](https://community.filemaker.com/thread/168035)

全く同じところでハマっています。そしてやはりどうやっても解決していないようです。その一方で、問題がないという人もいて、「大丈夫な人もいれば（自分と同じように）大丈夫じゃない人もいるが、何が原因なのかの特定が難しい（分からない）」ということが分かっただけでした。

# できたこと
- 80番ポート（デフォルト設定）のルートにはちゃんとアクセスできています。

![2016-11-27_06-07-21_SnapCrab_FileMaker Website - Google Chrome_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/72181/557c0f34-9bd1-54a9-3d5d-13490755ea62.png)

- また、ODBC/JDBC の「展開」も問題ありません。

- ARR のインストールも、以下のインストールログ[^2]を見る限り問題ありません。

```
Completed the Microsoft Application Request Routing for IIS7 Setup.
Installation results - look in the respective msi log files (msiname.log) for more details

rewrite_v2.0_amd64_en-us.msi			Success
requestrouter_v3_amd64.msi			Success
ExternalDiskCache_amd64_en-us.msi			Success
```

- Yosemite ではソフト的なエラーのためこの症状になることがあるということです（解決済みのようです[^3]）。

# 結論
間違いなく IIS 周りの問題だとは思います。しかし IIS の経験がほとんど無い上に、Windows 10 で動かしている（IIS 10.0）ため、原因の特定が難しいです。

ちなみに試行錯誤の過程で得た知見ですが、IIS 10.0 にて IIS 7 へのインストールを前提としたコンポーネントなどを強引にインストールするには、レジストリの`\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp\MajorVersion`を 10 でなく 9 に書き換えるとよいです（所定の作業が終わったらちゃんと戻しておきましょう）。

![filemakerserverinstallsuccess_05.png](https://qiita-image-store.s3.amazonaws.com/0/72181/88ee623e-c606-80a1-1600-bc7007c218fd.png)

# つまり
IIS が（ますます）嫌いになりました……。

[^1]: 詳細なメッセージを保存し忘れて海外サイトの Q&A から同内容をコピペしているため、英語のメッセージになっています
[^2]: %temp%\arr_setup.log
[^3]: 詳しくは調べてみてください