OmniAICreator/Qiita-1.07M huggingface dataset:
ヘッドレスChromeをもっとも簡単に操作できると思われるNightmareJS風ライブラリ

Chrome59(2017/05/27現在はベータ)から--headlessオプションを使うことでChromeをヘッドレスブラウザとして使えます。これをNodeJSから操作するには`chrome-remote-interface`というNPMパッケージを使うのですが、そのままですとなかなか面倒です。そこで、NightmareJS風にヘッドレスChromeを操作することができるライブラリをご紹介します。

GitHub: https://github.com/OnetapInc/chromy

## 基本的な使い方

このようにNightmareJS風のメソッドチェーンで操作することができます。visibleオプションを指定すればヘッドレスモードではなく通常モードでChromeを起動することもできます。
Chrome本体は標準的なインストールをしていれば自動的に最も新しいChromeを探してそれを起動します。
試す場合はChrome 59以上(2017/05/27現在はBeta)をインストールしてください。

```js
const Chromy = require('chromy')

// not headless
// let chromy = new Chromy({visible:true})
let chromy = new Chromy()
chromy.chain()
      .goto('http://example.com/')
      .evaluate(() => {
        return document.querySelectorAll('*').length
      })
      .result((r) => console.log(r)) // result()は一つ前の処理の結果を受け取る
      .end()
      .then(() => chromy.close())
```

Chromyはメソッドチェーンではなくasync/awaitを使ったインタフェースも用意されています。

```js
const Chromy = require('chromy')

async function main () {
  let chromy = new Chromy()
  await chromy.goto('http://example.com/')
  const result = await chromy.evaluate(() => {
          return document.querySelectorAll('*').length
        })
  console.log(result)
  await chromy.close()
}

main()
```

README.md に使えるAPIの一覧が載っています。NightmareJSと比べると足りないAPIもありますが、下記のような基本的なAPIはだいたい揃っています。

・ナビゲーション
・キーボード関連イベント
・マウス関連イベント
・フォーム関連のユーティリティ
・ブラウザ内でのJS実行やブラウザ内からのChromyへのメッセージ送信
・クッキー
・モバイルエミュレーション

## Chromyのメソッドチェーンの実装(async-chain-proxy)

Chromyのメソッドチェーンは async-chain-proxy という別のライブラリを使って実装されています。
Chromy自体にはasync functionが定義されているだけです。

GitHub: https://github.com/OnetapInc/async-chain-proxy

このライブラリはオブジェクトを与えるとそのオブジェクトのメソッドをメソッドチェーンで呼び出すことができるプロキシオブジェクトを作ってくれるライブラリです。下記のコードを見れば何をしてくれるか一目瞭然かと思います。

```js
class A {
  async foo () {
    console.log('foo')
  }
  async bar () {
    console.log('bar')
  }
}

const chainProxy = require('async-chain-proxy')
const obj = chainProxy(new A())
obj.foo().bar().end()
```

## ChromyのNightmareJSとの違い

NightmareJSはElectronをベースにしていますので、レンダリングエンジンはChromyと同じくChromeが採用しているBlinkになります。現時点ではElectronはChromeのヘッドレスモードに対応していないため、起動にはxvfbなどでスクリーンを用意する必要がありますが、Chromyではその制約がありません。

そのほか、NighmareJSにはない機能として、モバイルのエミュレーション機能があります。
エミュレーションを使うとスクリーン解像度やユーザーエージェントなどの切り替えやタッチイベントのエミュレーションなどが簡単にできます。

```js
const Chromy = require('chromy')

let chromy = new Chromy()
chromy.chain()
      .emulate('iPhone6')
      .goto('http://example.com/')
      .evaluate(() => {
        return navigator.userAgent
      })
      .result(console.log)
      .tap(100, 200)
      .doubleTap(200, 300)
      .end()
      .then(() => chromy.close())
```

## NightmareJSの動向

NightmareJS自体がそのうちヘッドレスChromeで動かせるようになるんじゃないのか思っている方が多いと思いますが、たぶんなります。

関連Issue:
https://github.com/segmentio/nightmare/issues/1092

現在（2017/05/27)はElectronの対応待ちのようで、ElectronのIssueがこちら。
https://github.com/electron/electron/issues/228

動いてませんが、まぁそのうち対応するでしょう。たぶん。

## まとめ的な

そのうちNightmareJSも対応するでしょうが、いますぐにでもそれっぽいAPIでヘッドレスChromeしたい方はぜひChromyを試してみてはいかがでしょうか。

https://github.com/OnetapInc/chromy
履歴書・職務経歴書の管理と公開

# 背景
データマイニングエンジニア、もとい**何でも屋**に近いことをしております。

最近家庭の都合により転職活動をすることになりました。
ただ、そのような時に個人的に困るのは履歴書の管理でした。もちろん、LinkedInやWantedlyといったサービスがありますが、LinkedInやWantedlyなどのサイトに書き散らした履歴書・職務経歴書もどきがありこれをまとめて一括でupdateするのはめんどくさいと思うようになりました。また、これらのサイトに登録すると、転職を考えてない時にも**人身売買業が得意なケモノ**もといフレンズから連絡が絶えずきてしまうので、非常にうざいことが多々あります。

そんな中、[職務経歴書OSS化](http://qiita.com/okoysm/items/abcad0b4aefa585bc50b)という記事を読み、これもやろうと思いました。ただ、githubとかで公開してしまうと、SICPや勉強会の読書メモ、**途中でめんどくさくなって作るのやめたサービスやWebフレームワーク**など、あまり他人様には見せられないものばかりで、githubに乗せてしまうと評価が下がるだろうなーと思ったため、ちょっと乗り気ではない。

そこで考えたのがgithubで管理しつつFirebaseでHTMLをhostingさせ、そのHTMLでmarkdownを呼び出せれば色々と楽になる。公開する部分はHTMLのみにさせて、githubの経歴書はそのまま管理する。そうすることで、書き散らしたrepositoriesを見せる必要がなさそう。というわけで、今回はこの件について実際にやったメモを残そうと思う。

# 方法
## 履歴書・職務経歴書Markdownの準備
何もないところからフォーマットを決めるのは面倒くさいので、適当にそこらへんからどういうことを書けばいいのかパクりましょう。ちなみに僕の場合は英語のCVを一回日本語で書いたものをMarkdownに持ってきました。

## Firebase Hosting
基本的にはhttps://firebase.google.com/docs/cli/ をみてください。通常の設定だとhostingされるのは`public`ディレクトリ内になるので、Markdownをそこに移動する必要がある。`firebase serve`のコマンドを叩くと、ローカル上でHTMLを表示できるので、結構便利です。Firebase用のタグをHTMLに埋め込み、Firebaseの設定は終了。

## Markdownの読み込み
こちらを参考にしました。 http://qiita.com/amay077/items/704d48130e5cf17e8654
どうやらMarked.jsとやらでMarkdownを読み込みHTMLにparseして対象のdivに反映することができる模様。ただ、この記事の場合jQueryのバージョンが古いようですので、その点のみに留意する必要がある。ローカルで検証して特に問題なければ、`firebase deploy`で本番環境に反映。

https://kou2kkkt-19840312.firebaseapp.com/
（1時間で作ったので、すごく雑です。。。）

ついでにGoogle Analyticsも入れると幸せになれます。
Excelのセルに日付を「2017/xx/xx (月)」のように表示する書式設定

セルの書式設定-表示形式-ユーザー定義の種類に以下のとおり設定する。

yyyy/m/d(aaa)

![_ 2017-05-27 9.23.58.jpg](https://qiita-image-store.s3.amazonaws.com/0/6121/fb3d9432-c480-6dd8-9368-5e30e271365f.jpeg)

![_ 2017-05-27 9.25.47.jpg](https://qiita-image-store.s3.amazonaws.com/0/6121/27657f61-d65a-52ce-ebf8-c053200a8d72.jpeg)
USBメモリからUbuntu 17.04をインストール時に "cdから追加パッケージをインストールするためのapt設定の試行に失敗しました" と出て終了する


# 環境

以下で試しています。

- XPS15(9560)
- Ubuntu 17.04


# どうでもいい前置き
ようやくSSDなXPS15(9560)が届きました。
今まで使っていた9550も悪くはなかったのですが、いかんせんストレージがHDD。
Android StudioやらIntellijが起動するのに3分半(実測値)とか、なんか色々10年以上前にタイムスリップしたのか俺？みたいなストレスフル〜な日常を送っておりました。やっぱりSSDすよ。ソリットでステートなドライブですよ。これぞ2017年です。あんまり使わないWindows10も爆速起動になりました。
というわけで早速慣れ親しんだUbuntuをインストールです。

コンサバな私ですが、Kaby Lakeの力を十全に引き出すにはKernel4.10である必要がある

> Kaby Lake is unleashed with Linux kernel 4.10
http://www.pcworld.com/article/3173618/linux/kaby-lake-is-unleashed-with-kernel-410.html


ということで、16.04LTSを離れ17.04を入れてみることにしました。すでに消滅が運命づけられているUnity好きな私ですが、17.04のデフォルトWMはまだ、Unity7。ウキウキとインストールを始めたのです。その後に待ち受ける大変な問題も知らず....(誇張度400%)


# エラー

まずはWindows経由でUSBメモリにUbuntuのインストーラーを焼きます。
ちなみにWindows10とのデュアルブートの方法はこちら

> DELL XPS15 9550,9560 に ubuntu 16.04 LTSをWindows10とデュアルブートでインストールする
http://qiita.com/furu8ma/items/3af582658780c9679e3f


順調にインストールは進み、終盤に差し掛かった頃以下のエラーに遭遇。


**cdから追加パッケージをインストールするためのapt設定の試行に失敗しました**

英語なら

**An attempt to configure apt to install additional packages from the CD failed**

そして無慈悲に強制終了😱

なんでUSBからインストールしてんのにCDから追加しようとすんの？バカなの？Linuxの人ってみんなCDROMドライブ持ってんの？そこはせめてDVDじゃないの？
と頭を抱えること3日。鍛え上げたggりスキルでなんとか突破することができました。


# 対応方法

正解はこちら

> Install from USB fails: "An attempt to configure apt to install additional packages from the CD failed"
http://forum.kodi.tv/showthread.php?tid=126351

ただこの通りだとうまく行かなかったので若干アレンジしています。

- インストーラー起動時に、"Try Ubuntu without installing"を選択 **← 超重要！**
-  UbuntuのGUIが起動したら、デスクトップにある"Ubuntuをインストール” アイコンをクリックしインストール開始
- ユーザー名、PC名の設定に至ったら、おもむろにターミナルを起動。
-  ターミナルから以下のコマンドを実行 **← ここがミソ！**

```sh
sudo rm /usr/lib/ubiquity/apt-setup/generators/40cdrom
```

- インストールを続行
- エラー終了することなくインストール完了


こんな塩梅です。
ちなみに17.04ですが、いい感じに動いてくれています。なにより起動がちょっぱやです。Windowsとの切り替えも1分くらいで済むのでつらい思いをする覚悟は不要になりました。バンバン再起動しまくりです。
しいていえば、せっかくの指紋認証が使えないこと、仮想デスクトップ切り替え時に非選択なデスクトップがグレイアウトせず、今どのデスクトップにいるのかわかりづらいくらいでしょうか。ともかく実用上ほぼ問題ありません。

9560と末永く付き合っていこうと思います。
(LTSじゃないUbuntuは半年後に再インストールだけれども！)

![Screenshot from 2017-05-27 09-19-30.png](https://qiita-image-store.s3.amazonaws.com/0/74328/983b6b00-6c9e-36d6-cd96-94ae7291f4e9.png)
モンテカルロ法で円周率近似　その２

Rustを勉強しているため、[前回の記事](http://qiita.com/xshirade/items/b8c9c58e74d5ac415dcd)では、Javascript実装したものをRustで再実装してみました。

## コード
```rust:main.rs
extern crate rand;
use std::env;
use rand::Rng;

struct Point {
    x: f64,
    y: f64
}

fn main() {
    let sample: u64 = env::args().nth(1)
        .expect("Usage: main SAMPLE")
        .parse::<u64>().ok()
        .expect("SAMPLE must be u64");
    let mut inner_points: u64 = 0;
    let mut rng = rand::thread_rng();
    for _ in 1..sample {
        let point: Point = Point { x: rng.gen::<f64>(), y: rng.gen::<f64>() };
        let distance: f64 = (point.x.powi(2) + point.y.powi(2)).sqrt();
        if distance < 1 as f64 {
            inner_points += 1;
        }
    }
    let pi: f64 = 4 as f64 * inner_points as f64 / sample as f64;
    println!("{}", pi);
}
```

## 実験
サンプル数を`10^3`から`10^11`まで試しました。

```sh
$ time ./target/release/main 1000
3.18

$ time ./target/release/main 10000
3.1492

$ time ./target/release/main 100000
3.14576

$ time ./target/release/main 1000000
3.139368

$ time ./target/release/main 10000000
3.1404616

$ time ./target/release/main 100000000
3.14174324

...
```

## 考察
[前回の記事](http://qiita.com/xshirade/items/b8c9c58e74d5ac415dcd)のJavascript実装を、コンパイル言語とインタープリタ言語の実行時間の比較のための再利用しました。`time`命令を利用して時間を計測しました。掲載時間は`usr + sys`です。また、`main.rs`のコンパイル時間は、`rand`や`libc`などのコンパイル時間も含み`3.75s`でした。

| Sample | Javascript (s) | Rust (s) | Ratio (Javascript / Rust) |
| ---:| ---:| ---:| ---:|
| 10^3 | 0.068 | 0.004 | 17.0 |
| 10^4 | 0.074 | 0.005 | 14.8 |
| 10^5 | 0.083 | 0.017 | 4.882352941 |
| 10^6 | 0.159 | 0.090 | 1.766666667 |
| 10^7 | 1.377 | 0.849 | 1.621908127 |
| 10^8 | 13.517 | 8.649 | 1.562839635 |
| 10^9 | 147.012 | 83.308 | 1.764680463 |
| 10^10 | 1908.46 | 864.523 | 2.20752947 |
| 10^11 | 26568.773 | 14148.49 | 1.877852195 |

`Ratio`を見ると全て`1`以上なので、Rust(コンパイル言語)の実行時間はやはり短いという割と当たり前のことが確認できました。もちろんコンパイル時間を考慮すれば、Javascript(インタープリタ言語)のほうがサンプル数が`10^7`以下の場合は短いです。 ~~サンプル数を増やしていけば`Ratio`が粗いながらも収束していくように少しみえます。勘違いでしょうけれど。~~
angular


angulerJS  v1.5.8

■疑問点 
入力値のバリデーションの実現方法について

■やりたいこと 
ある文字列の中に半角数字が混在しないようにする 
混在した場合は、エラーメッセージを表示する

■現在のHTML 
```
<input required class="form-control" id="name" name="name" type="text" ng-model="name" value="" ng-pattern="/???????????????/" /> 
<div ng-show="myForm.name.$invalid && !myForm.name.$untouched && myForm.name.$error.pattern"> 
<span class="sign" >数字が混在しています</span> 
</div>
```
■現状 
inputタグには、半角数字を除き、どのような文字でも入力可能とします。 
上記ではバリデーションがうまくいっていません。

どのように、半角数字の混在を検出したらよいでしょうか？
angular

angulerJS  v1.5.8

■疑問点 
入力値のバリデーションの実現方法について

■やりたいこと 
ある文字列の中に半角数字が混在しないようにする 
混在した場合は、エラーメッセージを表示する

ng-pattern で条件を　inputタグに追加する方法で実現したいです。

inputタグおよび検出時のエラーメッセージをどのように記述したらいいでしょうか？

■現状 
inputタグには、半角数字を除き、どのような文字でも入力可能とします。 
上記ではバリデーションがうまくいっていません。

どのように、半角数字の混在を検出したらよいでしょうか？
CentOS7にMySQL5.7を入れる

#CentOS7にMySQL5.7を入れる

##mariaDBを消す
CentOS7には初めからmariaDBが入っているので、これをremoveします。
※MySQLの他のバージョンが入っている場合も削除する必要があります。

```# yum -y remove mariadb-libs```
```# rm -rf /var/lib/mysql/```

![1.png](https://qiita-image-store.s3.amazonaws.com/0/183427/a1d7b1a1-f066-c479-0048-cf3acc70fa3e.png)

##yumでMySQLをインストール
まずはリポジトリを追加します。
```# yum -y localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm```

MySQLを入れます。
```# yum -y install mysql-community-server```

![2.png](https://qiita-image-store.s3.amazonaws.com/0/183427/1c918ffd-e3b3-3da7-2042-724ddea8a797.png)

バージョンの確認
```# mysql --version```

これでMySQL5.7が入っていれば成功です！

#MySQL初期設定
まずはMySQLを起動します。
```# systemctl start mysqld.service```

初期パスワードが振られるので確認します。
```# cat /var/log/mysqld.log```

見づらいですが、A temporary password is generated for root@localhost:の後に表示されます。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/183427/fc4cf82d-61a8-35fe-7a33-f3f7fc8a4ab9.png)

次に初期設定を行います。
```# mysql_secure_installation```

以下連続で質問に答えます。

```
Enter password for user root:
先ほどのパスワードを入力

The existing password for the user account root has expired. Please set a new password.
新しいパスワードを入力

Re-enter new password:
新しいパスワードの再入力

Change the password for root ? ((Press y|Y for Yes, any other key for No) :
空エンター（何も入力しない）
Remove anonymous users? (Press y|Y for Yes, any other key for No) :
空エンター（何も入力しない）
Disallow root login remotely? (Press y|Y for Yes, any other key for No) :
空エンター（何も入力しない）
Remove test database and access to it? (Press y|Y for Yes, any other key for No) :
空エンター（何も入力しない）
Reload privilege tables now? (Press y|Y for Yes, any other key for No) :
空エンター（何も入力しない）
```

新しいパスワードを入力してログイン出来れば成功！
```# mysql -u root -p```

以上です。
Android Goメモ (Google I/O '17)


Google I/O 2017の「Android Go」のセッションメモです。
KeynoteのAndroid Go関連の発表も含んでます。

## Android Goの特徴

- メモリ512MB以下
- 端末が$100以下
- Android OをカスタマイズしたOSが載っている
- 多言語対応
- バックグラウンド制限がある

## なぜAndroid Goを作ったか
- 次の10億人のユーザーのため
- Android Oneが価格上昇や高スペック化が進んでしまったため

## Android Goに最適化されたアプリの特徴

- 10MB以下
- オフライン動作対応
- 小さい画面サイズ対応

## Goに最適化されたアプリの紹介

- YouTube Go
  - P2Pで動画受け渡しできる
  - プレビュー機能
  - 画質選択機能
  - 動画ダウンロード機能
- Chrome
  - Data Saverがデフォルトで有効
- Play Store
  - Android Go端末に最適化されたアプリが最初に表示されてる
    - Facebook Lite
    - Skype Liteなど

## 他
- 今後リリースするAndroid OSはAndroid Go用にカスタマイズしたOSもリリースする予定
- 新興国のユーザーはデータ通信量が限られているのでバックグラウンド通信しすぎるアプリは嫌われて削除される
- Eventually connected
  - 接続しているネットワーク毎に挙動を最適化
  - テキストファースト
  - 使いやすいオフライン体験
- バックグラウンド制限
  - Save RAM
     - ServiceとBroadcastsの制限
     - アプリ起動処理削減
  - Save Battery
     - 位置情報とWiFiのスキャン制限

## スライド抜粋
2020年ではまだ10億人以上のユーザーが2Gネットワークに接続している。
<img width="808" alt="Screen Shot.png" src="https://qiita-image-store.s3.amazonaws.com/0/123122/74cc89a2-2a6c-ea50-0eed-d1567c2fab48.png">

Google Play Services を 再構成した。
<img width="810" alt="Screen Shot.png" src="https://qiita-image-store.s3.amazonaws.com/0/123122/df3c65e7-82b4-8a01-65f0-2feaa71ba583.png">

Android Studio の Memory Monitorでメモリ制限して検証できる。
<img width="887" alt="Screen Shot.png" src="https://qiita-image-store.s3.amazonaws.com/0/123122/9eece4e2-4e52-d4b5-fa2d-40d53932093a.png">

## 補足
他のセッションでAndroid Oでは位置情報取得は1時間に2回までに制限されていると言ってました。

## リンク
- セッションの動画: [Android Go (Google I/O '17) - YouTube]
(https://www.youtube.com/watch?v=CHKfKChZSE0)
[AutoHotKey]FileSelectFileの複数選択がクソなのでなんとかする


## FileSelectFileの複数選択がクソ
なにがクソって、わざわざディレクトリパスとファイル名に分割して出力しやがるところが。

> 複数のファイルが選択された場合、改行(\`n)区切りで列挙される。
その場合、1行目はファイルのあるディレクトリになり、残りはディレクトリパスを含まないファイル名になる。
>
> [FileSelectFile - AutoHotkey Wiki](http://ahkwiki.net/FileSelectFile)

そのため、複数選択してループ処理とかしようとした時に、素直に処理できない。

いったいなんのためにそんな謎仕様にしたのか本気で理解できないんだけど、まあ仕様ならしょうがないのでなんとかしよう。

## オプションは4ではなくMにする
> なお、Optionsで Mを使わずに 4で複数選択にした場合、ひとつしか選択しなかったときはフルパスが1行に格納されるようになる。 
>
> [FileSelectFile - AutoHotkey Wiki](http://ahkwiki.net/FileSelectFile)

オプションで`4`または`M`を選択することでファイルの複数選択が可能になるが、`4`の場合にはファイルが1個の場合と2個以上の場合で分岐処理が必要になる。

それはやってられないので、どうせなら`M`を選択すべき。

## Loop,Parseで1回目だけ処理を変える
`Loop,Parse`コマンドで、デリミタを`` `n``にすることで、`FIleSelectFile`で取得した各ファイルに対して処理を行うことができる。

`M`オプションを選択した場合、`` `n``で区切られる1つ目のフィールドがディレクトリパスであり、以降がファイル名であることは確定している。
よって、1回目のループだけ例外にして、2回目以降は同じ処理をすればいい。

例えば、以下は選択したファイルを削除するスクリプトである。

```ahk
FileSelectFile, SelectedFiles, M, , 削除するファイルを選択,
If ErrorLevel = 1 ; ファイルを選択せずダイアログを閉じた場合
{
    MsgBox, , , ファイルが選択されていません
    Exit
}
Loop, Parse, SelectedFiles ,`n
{
    If A_Index = 1 ; ループが1回めなら
        SetWorkingDir, %A_LoopField% ; 作業ディレクトリを選択したファイルの親ディレクトリに変更
        ; Dir = %A_LoopField% ; または、ディレクトリパスを変数に格納
    Else
        FileDelete, %A_LoopField% ; 作業ディレクトリ内の対象ファイルを削除
        ; FileDelete, %Dir%\%A_LoopField% ; または、フルパスを指定して削除
}
```

実行したい処理の内容によるが、基本的には、ループ1回目で作業ディレクトリを変更する、またはディレクトリパスを変数に格納する。

そのままループ内で順次処理を実行してもいいし、改めてフルパスを変数に格納した上で、次の処理に引き渡してもいいだろう。
GameViewのCameraをSceneViewのカメラとだいたい同じ感じで操作できるスクリプト

視点の回転と平行移動はよく見かけますが、上下回転でジンバルロック起こしたり、注視点を中心に回転する機能があるものは見つからなかったので自分で作りました。

## 操作方法
- **右クリックでドラッグ**：視点の回転
- **ALTキー＋左クリックでドラッグ**：注視点を中心に回転
- **中クリック(ホイール押下)でドラッグ**：平行移動
- **ホイール回転**：ズーム

## ソースコード
```csharp
using UnityEngine;

[RequireComponent(typeof(Camera))]
public class SceneCameraController : MonoBehaviour {

    public Vector3 targetPoint; // 注視点
    public float rotateSpeed = 10;
    public float translateSpeed = 1;
    public float zoomSpeed = 5;
	
	// Update is called once per frame
    void Update () {
        float mouseX = Input.GetAxis("Mouse X");
        float mouseY = Input.GetAxis("Mouse Y");
        float mouseWheelScroll = Input.GetAxis("Mouse ScrollWheel");

        // 平行移動
        if (Input.GetMouseButton(2))
        {
            targetPoint += transform.right * mouseX * translateSpeed;
            targetPoint += transform.up * mouseY * translateSpeed;

            this.transform.Translate(mouseX * translateSpeed, mouseY * translateSpeed, 0);
        }

        // 回転
        if (Input.GetMouseButton(1))
        {
            float dist = Vector3.Distance(this.transform.position, targetPoint);

            this.transform.rotation = Quaternion.AngleAxis(rotateSpeed * -mouseY, transform.right) * transform.rotation;
            this.transform.rotation = Quaternion.AngleAxis(rotateSpeed * mouseX, Vector3.up) * transform.rotation;

            targetPoint = this.transform.position + this.transform.forward * dist;
        }

        // ズーム
        if(mouseWheelScroll != 0)
        {
            this.transform.Translate(Vector3.forward * mouseWheelScroll * zoomSpeed);

            float dist = Vector3.Distance(this.transform.position, targetPoint);
            if(dist <= 1f)
            {
                targetPoint = this.transform.position + this.transform.forward * 1f;
            }
        }

        // 注視点の周りを回る
        if (Input.GetMouseButton(0) && (Input.GetKey(KeyCode.LeftAlt) || Input.GetKey(KeyCode.RightAlt)))
        {
            this.transform.RotateAround(targetPoint, transform.right, -mouseY * rotateSpeed);
            this.transform.RotateAround(targetPoint, Vector3.up, mouseX * rotateSpeed);
        }
    }

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.red;

        Gizmos.DrawWireSphere(targetPoint, 0.1f);
    }
}
```

---
gistにも上げてます。
https://gist.github.com/kaiware007/e0cc65124acf7008a5f5a6fa081e683d
Shared Libraryでコールバックを試してみた

いつものように備忘録
ポインタから、charまでいろいろ戻せた模様

```cpp:main.cpp
#include <classtest.h>
#include <iostream>

class Hoge
{
public:
    Hoge() {};
    ~Hoge() { }
    int m = 5;
    void Test(int t){
        std::printf("Hoge::Test %d \n",t);
    }
};

int some_function(int t){
    std::printf("some_function %d \n",t);
    t = t + 1;
    return t;
}

void char_function(const char * msg){
    std::printf("char_function %s \n",msg);
}

void func_function(void * func){
    std::printf("func\n");
    Hoge* a = (Hoge*)func;
    a->Test(1);
    std::cout << a->m << std::endl;
}

int main() {
    Foo foo;
    foo.print();
    foo.print2();

    Hoge hoge;
    hoge.m = 1;
    foo.funcTest(&hoge);
}
```

```cpp:classtest.h
#ifndef CLASSTEST_H_
#define CLASSTEST_H_

#include <functional>
#include <iostream>

extern int some_function(int t);
extern void char_function(const char * msg);
extern void func_function(void * func);

class Foo
{
public:
    Foo();
    ~Foo() { }

    void Test(int t);
    void print();
    void print2();
    void funcTest(void*);
};

class EventHandler
{
public:
    void addHandler(std::function<void(int)> callback)
    {
        std::cout << "Handler added..." << std::endl;
        callback(1);
    }
};

#endif
```

```cpp:classtest.cpp
#include <classtest.h>
#include <iostream>
#include <functional>

int i = 1;

Foo::Foo(){
  std::cout << "constructor" << std::endl;
  i = i + 1;
}

void Foo::Test(int t){
  std::printf("test %d \n",t);
}

void Foo::print(){
    int t = some_function(10);

    std::printf("print %d \n",t);
}

void Foo::print2(){
    char_function("print2");

    EventHandler* evt;
    evt->addHandler(std::bind(&Foo::Test, this, std::placeholders::_1));
}

void Foo::funcTest(void* func){
  func_function(func);
}
```

```CMakeLists.txt
cmake_minimum_required(VERSION 3.1.0)
project(sample)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )

set(serial "1.0.0")
set(soserial "1")
include_directories(include)
link_directories(build)
add_library(classtest SHARED classtest.cpp)

message("work dir: " ${PROJECT_SOURCE_DIR})
set_target_properties(classtest PROPERTIES VERSION ${serial} SOVERSION ${soserial})
install(TARGETS classtest LIBRARY DESTINATION ${PROJECT_SOURCE_DIR}/lib)

add_executable(sample main.cpp )
target_link_libraries(sample pthread classtest)
```

# 出力
```
constructor
some_function 10 
print 11 
char_function print2 
Handler added...
test 1 
func
Hoge::Test 1 
1
```
Ansibleのsetup

#Ansibleのインストール
## yumでインストール
```bash
#RHEL7系の場合のURL
sudo yum localinstall https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
sudo yum install -y ansible
ansible --version
```

#動作確認
##ローカルホストへpingしてみる
```ini:inventory/test_inventory.ini
[test_servers]
localhost
```

```bash
ansible -i inventory/test_inventory.ini test_servers -m ping --ask-pass
```

## Playbookファイルを作って接続
```yaml:test_playbook.yml
---
- hosts: test_servers
  tasks:
  - name: create directory
    file:
      path: ~/tmp
      state: directory
      owner: kazunori
      mode: 0755
  - name: copy file
    copy:
      src: /etc/hosts
      dest: ~/tmp/hosts
      owner: kazunori
      mode: 0644
```

```bash
ansible-playbook -i ./inventory/test01_inventory.ini ./test_playbook.yml --ask-pass
```

#その他

## 設定ファイルをホームディレクトリへ配置

```bash
cp /etc/ansible/ansible.cfg ~/.ansible.cfg
```

## ログ出力先の設定
```~/.ansible.cfg
...

log_path = ~/log/ansible.log

...
```
【Mac】OpenAI Baselinesで強化学習やってみた

OpenAIが2017/5/24に発表した強化学習のオープンソースが簡単に使えそうなので使ってみた:smiley:
[「DQN」とその3種のバリエーションの強化学習アルゴリズムを人工知能の研究団体「OpenAI」が公開](http://gigazine.net/news/20170526-openai-baselines-dqn/)
[Baselinesのgithub](https://github.com/openai/baselines#baselines)

実行するのはチュートリアルとして紹介されている以下の２つ
baselines.deepq.experiments.train_cartpole
baselines.deepq.experiments.train_pong

#環境
Mac OS Sierra 10.12.4
python 3.6.1
ちなみに python2.7系ではできないので注意

#cartpole
このチュートリアルは台車の棒が倒れないようにするゲームらしい
とりあえず何も考えずに実行する

色々とモジュールが足りないと言われるのでガンガンインストールする

```cartpole
# 学習用のコマンド
python -m baselines.deepq.experiments.train_cartpole

# 学習結果のモデルで遊ぶコマンド
python -m baselines.deepq.experiments.enjoy_cartpole
```

強化学習してそう・・・
ちなみにepisodesが690で停止した。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150607/8e81d1fa-3d5f-9f9f-1c82-a60954d43d80.png)

##遊んでみた
これはどうやって遊ぶのだろうか・・・:thinking:
黒い物体が倒れたと判定されたらリロードされてる感じはあるけど、意味不明
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150607/4ce582c7-e197-2800-16ee-5c15f988cec0.png)


#pong
これはアイスホッケーみたいな対戦ゲームらしい

ここでも足りなモジュールはガンガンインストール
ちなみに`cv2`がないと言われたらと言われたらOpenCVのことなので以下を参考にすると良い
[pyenvでインストールしたpython3からOpenCV3を利用できるようにする](http://qiita.com/oct_itmt/items/75cce93d5732ec83882d)

下記の記事を見てもらうとわかりますが、linuxだとopencv設定がかなり面倒です。
[pythonでOpenCVを使う一番簡単な方法](http://qiita.com/zabeth129/items/8a1a75cdf713d4fa6bc8)
なので、私はanacondaに切り替えて実行しました。（すぐ出来るのでオススメ）


```pong
# 学習用のコマンド
python -m baselines.deepq.experiments.train_pong

# 学習結果のモデルと遊ぶ用のコマンド
python -m baselines.deepq.experiments.enjoy_pong
```
学習してる・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150607/1cbe7234-0126-1f1b-7eb3-638f20852afc.png)

1episodesが90秒で、690回繰り返されるとしたら、約62,100秒、17時間15分・・・・

~~途中でやめました~~

やってみました:innocent:

約1160回のepisodeがあったので、さすがに時間かかりました・・・
途中でスリープモードで止まっていたので何とも言えませんが、8時間ぐらいかかった気がします。
![Screenshot from 2017-05-28 21-43-00.png](https://qiita-image-store.s3.amazonaws.com/0/150607/ead45253-3068-5c61-d5b1-14e660d6db8d.png)

遊んでみた結果は以下で動画になっているので確認してください。
[OpenAI Baselinesをwindows（winpython）で試す。]
(http://qiita.com/tmizu23/items/ff1d5c89bc99292410c0)

（ちなみにこれ、人間vs機械学習でバトルできるのかなって思ってたけど、そうじゃないんだね・・・、強化学習と戦ってみたかったです・・・）
様々な言語でMap, Filter, Reduceを実現してみた(2)

前書き
==================================
[(1)](http://qiita.com/kuroyakov/items/0b2076df3619e20725e6)の続き。

自分ルールの中で、慣れない言語に触れるときに必ずやっているのが、データドリブン的に「Map, Filter, Reduce」が素直に記述できるかを確かめること。

慣れない言語を触らなければならない時に「あれ、map, filter, reduceっぽいことどうやるんだっけ？」ってなった時のリファレンスになれば幸い。

実際にやってみた
==================================
処理概要
----------------------------------
1. 10,000,000件のデータを生成（整数値で0〜9,999,999の値が入っている）
2. 各要素を2倍にする
3. 3の倍数である数値のみ抽出
4. 抽出後の要素を総和する

対象言語
----------------------------------
* F# (4.1)
* Scala(v2.12.2)

環境
----------------------------------
* MacBook Air (Early 2014)
* macOS Sierra 10.12.4
* Visual Studio Code (エディタ）

制限事項
----------------------------------
* 言語特有の裏技を駆使して最速を目指すのは避けた（自分の中では普通に書いたつもり）
* 生成したデータはイテレータオブジェクトではなく、実体データの集合になるようにした
* map, filter, reduce処理呼び出しについては続けて呼ぶような記述にした
* 計算結果は全ての言語において`33333336666666`になっていることを確認済み
* map処理の開始直前からreduce処理終了までの時間を**参考までに計測した**

コード
----------------------------------
時間計測処理付きのコードは[GitHub](https://github.com/kuroyakov/minimum-examples)に上げており、各言語のフォルダにある`mapFilterReduce.*`ファイルを参照のこと。


```fsharp:F#
open System

let a = 
    // 1. Generating sequence
    [|0L..10000000L|]

let result = 
    a
    // 2. Mapping the sequence into another (Deferred execution)
    |> Seq.map ((*) 2L)
    // 3. Filtering the sequence (Deferred execution)
    |> Seq.filter (fun n->n%3L=0L)
    // 4. Reducing the sequence
    |> Seq.fold (+) 0L

// As a result
printfn "%A" result
```

```scala:Scala
object MapFilterReduce extends App{
    // 1. Generating sequence
    val a = (0L to 9999999L).toArray
    var result = 
        // 2. Mapping the sequence into another
        a.map(_*2)
        // 3. Filtering the sequence
        .filter(_%3==0)
        // 4. Reducing the sequence
        .fold(0L)(_+_)

    // As a result
    println(result)
}
```

考察
=================================

* 今回の件を機に初めて触る言語も多いのだが、Map, Filter, Reduce以外にもArray生成方法とか処理時間計測の方法も副産物として覚えることができた
* F#はSeqモジュールを使っている関係上、遅延評価の部分がある。Scalaはまだ勉強開始したばかりなので機会があれば調べてみたい。

参考結果
----------------------------------
計測値は揺らいでいたけど大体この前後ということで端数をカット。

言語        | 計測値(msec) | 備考
-----------|-------------:|---------
F#         | 400          |
Scala      | 550          | scalacオプションなしでコンパイル
LabVIEW2016以降のライブドラッグ(オブジェクトドラッグ時のリアルタイム描画)を一部無効化する

LabVIEW 2016以降、オブジェクトをドラッグした時、ワイヤ等がドラッグ中もリアルタイムで描画更新されるようになりました。
移動後の状態を把握しながら移動出来るのはメリットですが、環境や操作対象のオブジェクトの条件によっては描画のもたつきが気になることがあります。

## デフォルト無効にする方法
LabVIEWのインストール先にあるLabVIEW.iniに "LiveDrag = False" を追記してLabVIEWを再起動します。

## 有効/無効を切り替える
ドラッグ中にXキーを押します。

![26-05-2017-23-15-28.gif](https://qiita-image-store.s3.amazonaws.com/0/36514/511664bf-d933-a50c-ffaf-91845f40da9c.gif)

##参考
LabVIEW 2016の機能および変更点
http://zone.ni.com/reference/ja-XX/help/371361N-0112/lvupgrade/labview_features/

Labview 2016 new improvments to selecting, moving and resizing objects
http://forums.ni.com/t5/LabVIEW/Labview-2016-new-improvments-to-selecting-moving-and-resizing/td-p/3333161
Philips Hueを固定IPにする

意外と情報でてきにくいのでメモ

## システム構成

ルーターで固定IPにしたり、動的に割り振られたものを取得してもいいのですが、あんまり機材増やしたくない場合が多いので、MacとHueを直結して固定IPにしちゃう。

ですので、以下のような構成だとします。

```
Macbook
↓
USB Ethernet Adapter
↓
Hue bridge
```

## Hue 側の設定

### コンソールを開く
http://{HUE_BRIDGE_IP}/debug/clip.html

デバイス名のとかの設定は済んでいるとして、

**URL:**

```
/api/{USERNAME}/config
```

**Message Body:**

```
{
  "ipaddress":"192.168.0.200",
  "dhcp":false,
  "netmask": "255.255.255.0",
  "gateway": "192.168.0.100"
}
```

## Mac側の設定

Hue のゲートウェイと、Mac側のIPアドレスを揃えておくこと

<img width="668" alt="network.png" src="https://qiita-image-store.s3.amazonaws.com/0/20773/510644b4-8fc5-a7b5-d3d3-088ac1535df5.png">

無事に設定できれば、
http://192.168.0.200/debug/clip.html
が開くはず。

## curl でも設定できるっぽい
ちなみにブラウザコンソール以外に curl でも設定できるっぽい。知らなかった

https://developers.meethue.com/content/configuring-static-ip-address-bridge-claims-success-stays-old-address
__new__から返される前にインスタンスのメソッドを呼ぶ用法


`__new__`は、そのクラスの新たなインスタンスを作成するコンストラクタで、`__init__`は、その名のとおり新たに作成されたインスタンスをカスタマイズするためのイニシャライザです。こちらの[Pythonの公式文書](
https://docs.python.org/3/reference/datamodel.html#basic-customization)に説明されているとおり、`__init__`は、`__new__`が作成したインスタンスを、呼び出し元に返される前に`self`として受け取ります。

実際は、`__new__`の中であっても、インスタンスが既に作成されていれば、その時点でインスタンスメソッドを使用することが可能なようです。

次のサンプルコードでは、`Foo.__new__`の中で`object.__new__`を用いて`Foo`のインスタンスを作成した直後に、さっそく`early_call`インスタンスメソッドを呼んでインスタンス変数`self.arg`を作成していますが、ちゃんと実行出来ています。

```py:
class Foo:

    def __new__(cls, arg):
        instance = object.__new__(cls)
        instance.early_call(arg)
        return instance
                 
    def __init__(self, arg):
        print(self.arg)

    def early_call(self, arg):
        self.arg = arg

foo = Foo("I'm foo.")    # I'm foo. が出力される。
```

実際に[pandasのMultiIndex](https://github.com/pandas-dev/pandas/blob/v0.20.1/pandas/core/indexes/multi.py#L51)の実装では、この用法が使われています。
さくらVPSでCentOS7にPHP7を入れる

#CentOS7にPHP7を入れるまで
さくらVPSに限った話ではないですが、CentOS7にPHP7を入れる手順です。

##VPSのOSを変える
各種設定→標準OSインストールを選択します。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/183427/7773fe92-7c02-d209-291a-445c8da8c132.png)

CentOS7を選んでパスワードを入力し、設定内容を確認すると選びます。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/183427/9e4e6f0f-f887-755c-0f2f-c87c05bdeb0e.png)

インストールに時間がかかります。
終わったらTera Termとかでログインします。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/183427/671b67e7-c27c-a9e2-99d6-4d3352d7f3cf.png)

##yumで色々入れる
EPELリポジトリを入れます。
```# yum -y install epel-release```

Remiリポジトリを入れます。
```# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm```
※CentOS6ならremi-release-6.rpmになります。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/183427/2949c1da-f22c-124e-61e3-80615a93ee4c.png)

いよいよPHPを入れます。
```# yum -y install --enablerepo=remi,remi-php70 php```

今回はLaravelを使いたかったので色々入れます。
```# yum -y install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd php-mysqlnd php-intl phpunit```

バージョンの確認
```# php -v```

これでPHP7.0が入っていれば成功です！


**追記**
ブラウザアクセスをさせたい場合はポート開けたり、Selinuxを無効化する必要があります。
[http://qiita.com/minechan1234/items/146833d6ba1458f1a49d]
(http://qiita.com/minechan1234/items/146833d6ba1458f1a49d)

以上です。
Rancher CLIの閲覧系操作


# 目的
Rancher CLIの閲覧系操作についてざっくりとまとめる。

# 前提
Rancher CLIの導入が完了していること
(参考) [Rancher CLIを触ってみる](http://qiita.com/RyoMa_0923/items/547ee25f17d23f649220)

# 一覧系コマンド

--formatでjsonを指定することでjson形式での
取得も可能

## スタックの一覧を見る

```bash:スタックの一覧
./rancher stack ls
```

## サービスの一覧を見る

```bash:サービスの一覧
./rancher ps
```

## コンテナの一覧を見る

```bash:コンテナの一覧
./rancher ps -c
```

### ホストの一覧を見る
```bash:ホストの一覧
./rancher host ls
```

# ログ閲覧系コマンド

-fをつけることでtail -f を同じ挙動になる。
IDや名前は前述のps系コマンドで取得

## サービスのログを見る
```bash:サービスのログを見る
./rancher logs サービスIDまたはサービス名
```


同一サービスに所属する全コンテナのログが見れるので便利

## コンテナのログを見る

```bash:コンテナのログを見る
./rancher logs コンテナIDまたはコンテナ名
```
Pythonでリストを使って薬のレビューを表示する

```py
medicine = [
"ロヒプノール　眠りすぎて怖かった",
"ベルソムラ　良い感じに眠れた",
"エビリファイ　喉が乾いて辛かった",
"アキネトン　効いてるのか効いてないのか分からなかった",
"マイスリー　乱用なら一番向いてると思った。効き目は微妙",
"サインバルタ　胃がやられた",
"ストラテラ　胃と肝臓がやられた。頭の働きが落ちた気がする",
"レクサプロ　効いてるのかどうか分からなかった",
"リフレックス　体がふわふわして死にかけた",
"メイラックス　体がふらふらして死にかけた",
"デパス　効かなかった",
"リーゼ　当然効かなかった",
"レキソタン　効きすぎた",
"ワイパックス　効かなかった",
]
for v in medicine:
   print(v)
```
Moodleのbackupファイルを編集する

# Moodleのバックアップファイルを編集する
- 色々詰まった上、あんまり日本語の情報がなかったので書いておきます。
- 今回やったのは最小限なのでご注意を
- 前提として**linux、mac**をご利用の方を想定してます

## バックアップと解凍
- コース管理から、バックアップしてダウンロードしてください
- 保管用ディレクトリ(backupとします)を作り移動し、**terminalのコマンドでtar xvzf ../{backup file}**してください
- 自動化しようとしてコマンド以外で解凍するとmoodleが読み込んでくれません
- 無事解凍できました

## 編集
- 基本的にmoodle_backup.xmlがメインです。それやsection/やactivity/やquestions.xmlをいじってください。他はあんまり重要ではないです
- 特に、section/section.xmlのsectionnumberは**セクションの絶対位置を表します。**これが飛ばし飛ばしだと、**その間に空のセクションが混じる**ので注意してください

## 圧縮とリストア
- **backupディレクトリ自身を含まない全てを圧縮します**
- backup/内で、tar cvzf ../edited.tar.gz ./*ということです
- これはedited.mbzでもいいです
- コース管理からリストアし、諸設定を終わらせてください

### 終わりに
- 基本的に一つのコースをいくつかに分割することを目的でやりました
- セクションの作成やアクティビティの作成はmoodle内でやったほうがいいです
Pythonでバックグラウンド実行中にキー入力を取得する(windows)

# はじめに

あまり需要はないのかもしれませんが，バックグラウンド実行中（つまりPythonアプリにフォーカスがあっていない状態）のキー入力を取得したい時が稀にあります．Javaには[JNativeHook](https://code.google.com/p/jnativehook/)というライブラリがあり使い勝手もそこそこ良いのですが，それだけのためにJavaを使うのもな，，，，と思いPythonでやる方法を模索した結果，どん詰まりしたので備忘録を残しておきます．

# 環境

- Windows8 (10)
- Python3.6.0

# PyHookなるものがあるものの．．．

まず調べて色々なところで引っかかったのが，[PyHook](https://pypi.python.org/pypi/pyHook)を使う方法．
バックグラウンドで動いて，キーダウン，キーアップ等のイベントがとれるらしい（[おもしろ雑感- pyHookについてコケたところ](http://d.hatena.ne.jp/favcastle/20120206/1328537612)）．

早速試してみようと，http://www.lfd.uci.edu/~gohlke/pythonlibs からpyHookの対応するバージョンを落としてきて，

```
wheel install pyHook‑1.5.1‑cp36‑cp36m‑win_amd64.whl
```

でインストール（バージョン問題等で非常に手間取った）．

```py
from pyHook import HookManager
from win32gui import PumpMessages, PostQuitMessage

class Keystroke_Watcher(object):
    def __init__(self):
        self.hm = HookManager()
        self.hm.KeyDown = self.on_keyboard_event
        self.hm.HookKeyboard()


   def on_keyboard_event(self, event):
        try:
            print ('MessageName:',event.MessageName)
            print ('Ascii:', repr(event.Ascii), repr(chr(event.Ascii)))
            print ('Key:', repr(event.Key))
            print ('KeyID:', repr(event.KeyID))
            print ('ScanCode:', repr(event.ScanCode))
            print ('Time:',event.Time)
            print ('-'*5)
        finally:
            return True

   def your_method(self):
        pass

   def shutdown(self):
        PostQuitMessage(0)
        self.hm.UnhookKeyboard()


watcher = Keystroke_Watcher()
PumpMessages()
```

を実行してみたものの，Emacs,　SublimeTextを使っているときは問題なく動くが，chromeブラウザ上でキーを叩くと落ちるという謎事態に．エラーとしては

```
TypeError: KeyboardSwitch() missing 8 required positional arguments: 'msg', 'vk_code', 'scan_code', 'ascii', 'flags', 'time', 'hwnd', and 'win_name'
```

のようなもので，調べていったっ結果，どうやらPython3系にて実行した時に発生するバグらしく（https://stackoverflow.com/questions/26156633/pythoncom-crashes-on-keydown-when-used-hooked-to-certain-applications ），お手上げ状態．

## PyHooked

なにかいい代替手段が見つからないかさがしていたところ，[pyHooked](https://github.com/ethanhs/pyhooked)なるものをみつけました．
インストールは

```
pip install pyhooked
```

で行い，Githubページのexample.pyにあるように，

```py
from pyhooked import Hook, KeyboardEvent, MouseEvent


def handle_events(args):
    if isinstance(args, KeyboardEvent):
        print(args.key_code, args.current_key, args.event_type)

    if isinstance(args, MouseEvent):
        print(args.mouse_x, args.mouse_y)

hk = Hook()  # make a new instance of PyHooked
hk.handler = handle_events  # add a new shortcut ctrl+a, or triggered on mouseover of (300,400)
hk.hook()  # hook into the events, and listen to the presses
```
イベントハンドラを作成してあげることで，キーボード，マウスの入力がバックグラウンドで簡単に取れるようになります．

# 参考

- おもしろ雑感- pyHookについてコケたところ(<http://d.hatena.ne.jp/favcastle/20120206/1328537612>)
- ＜紙＞さんＬｏＧ- msvcrt.kbhit() (<http://jn1inl.blog77.fc2.com/blog-entry-2039.html>)
- pythoncom crashes on KeyDown when used hooked to certain applications (<https://stackoverflow.com/questions/26156633/pythoncom-crashes-on-keydown-when-used-hooked-to-certain-applications>)
ServiceNow インシデントを登録してみる

問い合わせユーザを新規登録し、そのユーザからのインシデントを登録してみる。
インスタンスのビルドタイプはIstanbul。

※ 本操作は組織が日本語化されていることを前提としています。
　 組織の日本語化は以下の記事を参考として下さい。
> [ServiceNow初期設定 インスタンスを日本語化する](http://qiita.com/Kisaragi13/items/abbc205134d1696ff644)

# 問い合わせユーザを新規登録
インスタンスにログイン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/3f5b1f4f-f158-35e5-8456-1ef466299c53.png)

アプリケーション一覧の中から、サービスデスク → 問い合わせユーザを選択（<font color="red">赤枠</font>）。
（フィルタナビゲータ（<font color="blue">青枠</font>）に「**問い合わせ**」と入力すると簡単です）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/4f38ef8c-bd74-db8d-0518-5a8b05446a6e.png)

新規ボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/e5b71909-d830-b12f-a03f-1cff5a86a7cc.png)

必要な情報を入力して「**送信**」ボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/c1875ee8-66ff-a07a-80fb-5d1bcc5d19c9.png)

以上で問い合わせユーザの追加作業は終了です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/bddcd2ca-fb8c-6a2b-5cc8-dbcf4c8a0ec7.png)

# インシデントを登録する
今回はインシデントを登録する際の入り口を2つ紹介します。
1. インシデントアプリケーションから登録する
2. 問い合わせユーザレコードから登録する

## 1. インシデントアプリケーションから登録する
アプリケーション一覧の中から、インシデント管理 → 新規作成 を選択
（幾つか似たような名前のアプリケーションがありますが、ここでは扱いません）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/46578609-e534-de08-06c9-69789db0d980.png)

## 2. 問い合わせユーザレコードから登録する
先ほど登録した問い合わせユーザレコード画面下部のインシデント一覧から「**新規**」ボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/ed04e7b3-3329-21be-3aee-a53de3dcb683.png)

問い合わせユーザ名が最初から入力されている所が2と1との違いです（<font color="blue">青枠</font>）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/208b3fb1-80a1-93a3-2416-1255d6ef26f1.png)

項目に適当な値を入力後、「**送信**」ボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/69fe9f5c-8cbb-f686-12cd-8ac7dca339b0.png)

以上で、インシデントの登録作業は終了です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/1780412d-64a9-bead-c5ad-9a3ed652451a.png)
※ ↑ オープン時刻が実際の時間からずれています（<font color="blue">青枠</font>）これはタイムゾーン設定の問題で、次回対応していきます。

# 関連記事
> - [ServiceNow初期設定 インスタンスを日本語化する](http://qiita.com/Kisaragi13/items/abbc205134d1696ff644)
【Laravel 5.4】モデルのフィールドの暗号化・復号化

# はじめに
最近いろいろ個人情報保護の観点から、DBに保存する特定フィールドは暗号化して欲しいとのニーズが多くなってきている。
しかも AESアルゴリズム を使えとか。

幸い Laravelの Cryptファサード は AES-256-CBC アルゴリズムなので、モデル側のセッター、ゲッターに機能を実装して、通常のアルゴリズムからは透過的に、DB保存の暗号化・復号化を実現する。
# 実装方法(アクセサ・ミューテタを使う(laravel推奨))
1. まずは通常のモデルを作成する。
2. Model 側に Name フィールド用のアクセサ・ミューテタを定義する。
3. 暗号化、復号化を実装する。

```php:Admin.php
<?php
use Crypt;

class Admin extends Model
{
    public function getNameAttribute($value)
    {
        return Crypt::decrypt($value);
    }

    public function setNameAttribute($value)
    {
        $this->attributes['name'] = Crypt::encrypt($value);
    }
}
```
# もちろんシーダー側も
シーダー側も予め暗号化しておく必要がある。

```php:AdminTableSeeder.php
<?php

use Illuminate\Database\Seeder;
//use Crypt;

class AdminTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('admins')->truncate();
        DB::table('admins')->insert([
            'loginid' => 'admin',
            'name'    => Crypt::encrypt('スーパーバイザー'),
            'password' => bcrypt('pass'),
        ]);
    }
}
```

こんな感じ。
ちなみに use Crypt; を有効にするとシーダーでエラーになる。

```sh:
$ php artisan db:seed
Seeding: AdminTableSeeder

  [ErrorException]
  The use statement with non-compound name 'Crypt' has no effect

```

これはシーダーが Global であるため。正解は Crypt を use しない。
# その後の顛末
laravel の Crypt は同じ文字列であっても、暗号化のたびに暗号後の文字列が異なる。
つまり、入力された文字列を暗号化して比較しようとしても一致しない。
もちろん復号化すれば、復号前の文字列が異なっていても両方とも正しく暗号前文字列に戻る。

しかたないから、検索が必要なキーに対しては、暗号後の文字列が一致する自前の暗号化/復号化クラスを自作した。
Crypt ファサードのオプションでなんとかならんかね。

[- 目次 -](https://qiita.com/search?q=laravel+nekyo)
Photoshopのバッチ処理 方法メモ（画像をたくさん一気にリサイズ）

※バージョン：Photoshop CC 2017

画像をたくさん、いっぺんにリサイズしたい時に利用。
もっと応用は効くはず。

#下準備...アクションを作成

あらかじめ、何かアクション作成用に画像を開いておく。

ウィンドウ＞アクション
新規アクションで、リサイズ用のアクションを作成する
今回、画像を全て200pxにしたいので「画像リサイズ200」という名前にした。

![Photoshop 新規アクション](https://qiita-image-store.s3.amazonaws.com/0/40940/adfa000e-a171-7d01-5b7c-764989517a9b.png)

アクション名を入れて、
「記録」を押した瞬間に録画モードになる（丸い録画マークが赤くなる）ので、

![Photoshop アクションウィンドウ](https://qiita-image-store.s3.amazonaws.com/0/40940/29127216-8370-914a-7173-3313b22bc2b8.png)

イメージ＞画像解像度
で画像リサイズを実際に操作する。

![Photoshop イメージ＞画像解像度](https://qiita-image-store.s3.amazonaws.com/0/40940/bd4de3e3-3663-fa99-f63e-0981cf80a02d.png)
![Photoshop イメージ＞画像解像度](https://qiita-image-store.s3.amazonaws.com/0/40940/7aaf9b18-05a4-375d-9f35-a27418cba68f.png)

リサイズしたら、
丸い録画マーク左の、録画停止ボタン（■）を押す

![Photoshop アクションウィンドウ](https://qiita-image-store.s3.amazonaws.com/0/40940/40c36076-2687-2abb-434c-b44be97dde25.png)


#バッチ処理を行う

ファイル＞自動処理＞バッチ

![Photoshop バッチ処理](https://qiita-image-store.s3.amazonaws.com/0/40940/ffa69c14-c99e-c3c3-92f0-668fb3c54f2f.png)

「アクション：」 → さっき作成したアクションを選ぶ
「選択...」 → 保存したいフォルダを選ぶ
「実行後」 → 保存して閉じる

を入力して、
「選択...」で入れた保存したいフォルダに画像を入れてみる。
![フォルダ](https://qiita-image-store.s3.amazonaws.com/0/40940/af2e3c02-3d29-fc71-bc37-448381550897.png)


入れたら、「OK」を押す

#結果

「OK」を押した瞬間、
さっき入れた画像がリサイズされていた！
![フォルダ](https://qiita-image-store.s3.amazonaws.com/0/40940/dc24dbb1-0adb-ea04-c221-fc336ab196f4.png)

今回は一個だったけど、複数いける。
WebKit ではSVGグラデーションを `fill-opacity` を持った要素に適用すると色味がくすむ

WebKit（Mac版のSafari含む）では `fill-opacity` を設定した要素にSVGグラデーションを適用すると色味がくすんでしまいます。
SVGグラデーションを透明化する場合には、 `stop-opacity` を用いるか、塗りと線のパスを分けた上で塗りのパスに `opacity` を設定する必要がありそうです。  
なお、iOS版Safariでは問題ないもよう（なぜだ）。

## 現象確認用のデモ
以下の様なSVGで現象が発生します。

```xml
<svg viewBox="0 0 300 200">
  <defs>
    <linearGradient id="g0">
      <stop offset="0%" stop-color="red"></stop>
      <stop offset="50%" stop-color="green"></stop>
      <stop offset="100%" stop-color="blue"></stop>
    </linearGradient>
  </defs>
  <circle cx="50%" cy="50%" r="33%" fill="url(#g0)" fill-opacity=".67"></circle>
</svg>
```

デモURL： https://codepen.io/haribote/pen/BREjKV?editors=1100#0  
![スクリーンショット 2017-05-26 13.17.32.png](https://qiita-image-store.s3.amazonaws.com/0/36521/228d97ea-047b-7a37-707d-ca6505bd5eac.png)  
↑はデモをSafariで開いたキャプチャーです。
お分かりいただけただろうか…？ 
方法は違えどすべて同じ透明度を指定しているにもかかわらず `fill-opacity` を設定しているパターンのみ色味がくすんでしまっています。  
ちなみにSVGの `<linearGradient />` や `<radialGradient />` には `color-interpolation` 属性で色空間を指定することができますが明示的に `sRGB` を指定してもダメでした。

## 対応方法いろいろ

### `stop-opacity` を用いる

```xml
<svg viewBox="0 0 300 200">
  <defs>
    <linearGradient id="g1">
      <stop offset="0%" stop-color="red" stop-opacity=".67"></stop>
      <stop offset="50%" stop-color="green" stop-opacity=".67"></stop>
      <stop offset="100%" stop-color="blue" stop-opacity=".67"></stop>
    </linearGradient>
  </defs>
  <circle cx="50%" cy="50%" r="33%" fill="url(#g1)"></circle>
</svg>
```

グラデーションを適用する要素に透明度を指定するのではなく、グラデーション定義側に透明度を指定します。
定義したグラデーションの使い方が全ての適用要素において同じなのであればこの方法でも良さそうです。  
しかし、 `stop-opacity` は本来、透明度のグラデーションを設定するための属性・スタイル（不透明から透明にしたい、など）です。
なので要素ごとの塗りの透明度とグラデーション定義自体の透明度はやはり別に設定したいといった場合がおそらく多く、そういった場合にこの方法を用いることはできません。

### `opacity` を用いる

```xml
<svg viewBox="0 0 300 200">
  <defs>
    <linearGradient id="g2">
      <stop offset="0%" stop-color="red"></stop>
      <stop offset="50%" stop-color="green"></stop>
      <stop offset="100%" stop-color="blue"></stop>
    </linearGradient>
  </defs>
  <circle cx="50%" cy="50%" r="33%" fill="url(#g2)" stroke="none" opacity=".67"></circle><!-- 塗りを適用するパス -->
  <circle cx="50%" cy="50%" r="33%" fill="none"></circle><!-- 線を適用するパス -->
</svg>
```

次に考えられるのが、グラデーションを適用する要素に `opacity` を設定する方法です。
ただ `opacity` は要素丸ごと、すなわち塗りも線も一緒くたに透明化してしまいます。
したがって塗りにだけ透明度を指定したい場合は、上記コードのように塗りを適用するパスと線を適用するパスを分けて書く必要があります。  

うん、本当はそんなことしなくて良いように `fill-opacity` があるはずなんだけどね…。
ElectronのIPCをまとめる

# 前書き
Electronには、メインプロセスとレンダープロセスでプロセス間通信を行うIPCモジュールがあります。
デスクトップアプリを作るにあたり、IPCモジュールおよび各プロセスの動きというのは、とても大事なのでまとめてみました。
もしお手元にソースがない場合は、僕の記事で多用しているReactTodoのElectron版を利用してくだされば幸いです。

https://github.com/gcmae/react-todo/tree/react-redux-electron

# IPC-プロセス間通信-
Electronには、二つのプロセスがあります。

* アプリケーションを司る**メインプロセス**
* 画面を司る**レンダープロセス**

メインプロセスでは、アプリケーションの起動から終了、画面(レンダープロセス)の作成から終了まで、アプリが行う動作全てを補っています。
メインプロセスは、アプリを司るため一つのアプリにつき一つしか動作できません。

対するレンダープロセスは、HTML、ざっくり言うと画面を司っており、今までの記事で言うとReactが動作している部分をレンダープロセスと言います。
画面ごとのプロセスのため、メインプロセスとは違い、複数動作できます。
例えば、メインプロセスからレンダープロセスに通信がしたい時
レンダープロセスからメインプロセスの処理を呼びたい時
そんな時に用いるのが、プロセス間通信、IPCです。

# IPCの使い方
IPCでは、**非同期通信**、**同期通信**が利用できます。
同期通信の場合、通信中はレンダープロセスが停止、スリープの状態になります。

## モジュールのインポート
ipcを利用するにはipcモジュールをインポートする必要があります。
Electronの中に含まれているので、インストール等はいりません。
ただ、ipcモジュールは
メインプロセス用のモジュール
レンダープロセス用のモジュールがあるので、それぞれインポートします。

### メインプロセス
メインプロセスには、**ipcMain**をインポートします。

```index.js
// Electron
import {
  app,
  ipcMain, // <- メイン用のipc
  BrowserWindow
} from 'electron'
```

### レンダープロセス
レンダープロセスには、**ipcRenderer**をインポートします。

```js:app.jsx
import {
  ipcRenderer // <- レンダー用のipc
} from 'electron'
```

## 非同期通信
では実際、ipcの非同期を用いて、メッセージを表示してみます。

レンダープロセス

```js:app.jsx
  AsyncMessage() {
    ipcRenderer.send('message', 'ping')
    ipcRenderer.on('reply', (event, arg) => {
      console.log(arg)
    })
  }
```

メインプロセス

```index.js
ipcMain.on('message', (event, arg) => {
  console.log(arg)
  event.sender.send('reply', 'pong');
})
```

実行して、AsyncMessageを呼ぶと以下の結果になります。

![スクリーンショット 2017-05-26 17.15.55.png](https://qiita-image-store.s3.amazonaws.com/0/159013/95dc6c0d-6561-9dd5-b740-2d6f9523c61c.png)

上はターミナル上(メインプロセスによる)のログ
下はElectronのログです

動きとして早口に述べると

**レンダープロセスのipcRenderer.sendでチャンネルmessageにpingを送信し、メインプロセスのチャンネルmessageでpingを受け取ってlogに表示し、受信元にチャンネルreplyでpongを送り、レンダープロセスのチャンネルreplyでpongを受け取り、logに表示**

以上の処理を行なっています(説明が下手ですみません…）
チャンネルというのは、ipcの通信帯のようなもので
sendとonの第１引数です。
同じ文字列がsendとonを結んでいるので、今回の場合、sendのmessageとonのmessageがつながっているため
レンダープロセスのsendの先は同じチャンネルであるメインのonになるわけです。

処理自体は非同期となっており、メインからsendが帰ってくるまでの間は他の処理は進んでいます。

チャンネルreplyのsendがメインプロセスから送られてレンダープロセスのチャンネルreplyのonが呼ばれます。

### 同期通信
同期通信の場合、基本的に非同期と変わる部分はありません。
ただ、メインプロセスからリプライを待つわけではないので、メインプロセスにsendは記述する必要がありません。

レンダープロセス

```js:app.jsx
  SyncMessage() {
    const result = ipcRenderer.sendSync('sync-message', 'ping')
    console.log(result)
  }
```

メインプロセス

```index.js
ipcMain.on('sync-message', (event, arg) => {
  console.log(arg)
  event.returnValue = 'pong';
})
```

非同期の際はsendと記述していましたが、同期通信の場合はsendSyncを使います。
そうすることでipc通信は同期通信となり、メインプロセス側のreturnValueがない限り処理は止まります。
同期通信のため、resultにはpongが代入され、undefinedになることなくその次でlogが出せます。

# 後書き
Electronの二つのプロセス、IPCによる非同期、同期通信
まとめてみましたが、書き方はとても簡単なのに処理はなかなかややこしいです…
ただ、ここを理解できれば、Electronを使ってデスクトップアプリを作る際にいろいろと幅が広がる気がします。
お読みいただき、ありがとうございました！
Storyboard Segue とは？

このサイトがわかりやすかった！
http://hajihaji-lemon.com/smartphone/swift/segue_attribute/
#Adaptive Segues
##Show (e.g. Push)
##Show Detail (e.g. Replace)
##Present Modally
modalを使うときは、どうやって前の画面に戻ればいいの？
##Present As Popover
#Deprecated Segues
##Push
##Modal
##Popover
##Replace
#Custom
coincheckの仮想通貨情報をAPIで取得♪

最近何かと話題の仮想通貨用情報を取得するcoincheck提供の[Public API](https://coincheck.com/ja/documents/exchange/api#public)を
csv形式として保存するツールを作りました．

https://gist.github.com/namakemono/aba4bae86aa89fc56b35f9ecfa9cd934

役立ちそうでしたら幸いです．

## 保存する情報Public APIデータ
- ティッカー
- 取引履歴
- 板情報(売買注文)
- 販売レート(各仮想通貨の金額)

## 使い方

```
python coincheck.py --save_to_dir /tmp
```

## 保存結果

```
==> coincheck_order_books_2017-05-26.csv <==
datetime,order_type,price,amount
2017-05-26 09:37:00,bids,302609.0,1.7
2017-05-26 09:37:00,bids,302608.0,0.91896872
2017-05-26 09:37:00,bids,302607.0,1.0
2017-05-26 09:37:00,bids,302600.0,1.0
2017-05-26 09:37:00,bids,302365.0,0.27724783
2017-05-26 09:37:00,bids,302000.0,6.00910455
2017-05-26 09:37:00,bids,301810.0,4.25611537
2017-05-26 09:37:00,bids,301800.0,1.0
2017-05-26 09:37:00,bids,301767.0,0.05847437

==> coincheck_rate_2017-05-26.csv <==
datetime,pair,rate
2017-05-26 08:49:01,btc_jpy,302587.5
2017-05-26 08:49:01,eth_jpy,22678.60935638
2017-05-26 08:49:01,etc_jpy,2061.2865675
2017-05-26 08:49:01,dao_jpy,226.78630538
2017-05-26 08:49:01,lsk_jpy,170.17823588
2017-05-26 08:49:01,fct_jpy,1807.948209
2017-05-26 08:49:01,xmr_jpy,5275.7583045
2017-05-26 08:49:01,rep_jpy,3206.00533875
2017-05-26 08:49:01,xrp_jpy,35.73558375

==> coincheck_ticker_2017-05-26.csv <==
datetime,last,bid,ask,high,low,volume,timestamp
2017-05-26 09:10:00,301814,302702,302996,335973,230255,27238.46130438,1495789795
2017-05-26 09:13:00,302460,302314,302460,335973,230255,27236.96192468,1495789977
2017-05-26 09:16:00,302204,302003,302204,335973,230255,27239.3630376,1495790156
2017-05-26 09:19:00,302370,302153,302363,335973,230255,27246.89351123,1495790335
2017-05-26 09:22:00,302811,302679,302807,335973,230255,27261.04811664,1495790515
2017-05-26 09:25:00,302779,303167,303238,335973,230255,27300.46158307,1495790697
2017-05-26 09:28:02,303518,303518,303637,335973,230255,27304.2766997,1495790875
2017-05-26 09:31:02,303426,303159,303424,335973,230255,27331.07795757,1495791058
2017-05-26 09:34:02,303591,303419,303685,335973,230255,27320.81268638,1495791234

==> coincheck_trades_2017-05-26.csv <==
id,datetime,amount,rate,order_type,created_at
5918218,2017-05-26 09:37:00,0.0002946,302959,buy,2017-05-26T09:36:54.000Z
5918217,2017-05-26 09:37:00,0.0377054,302765,buy,2017-05-26T09:36:54.000Z
5918216,2017-05-26 09:37:00,0.0000946,302858,sell,2017-05-26T09:36:54.000Z
5918215,2017-05-26 09:37:00,0.0399054,302858,sell,2017-05-26T09:36:52.000Z
5918214,2017-05-26 09:37:00,0.0000946,302859,sell,2017-05-26T09:36:52.000Z
5918213,2017-05-26 09:37:00,0.0099054,302859,sell,2017-05-26T09:36:52.000Z
5918212,2017-05-26 09:37:00,0.0000946,302860,sell,2017-05-26T09:36:52.000Z
5918211,2017-05-26 09:37:00,0.0218,302860,sell,2017-05-26T09:36:51.000Z
5918210,2017-05-26 09:37:00,0.05,302860,sell,2017-05-26T09:36:51.000Z
```
蟻本をpythonで: page 49 Fence Repair

```py

# coding: utf-8
import numpy as np
N = raw_input()
L = raw_input()
N, L = map(int, N.split())[0],np.array(map(int, L.split()))

cost = 0
while(1):
    argindex = np.argsort(L)
    l1 = L[argindex[0]]
    l2 = L[argindex[1]]

    L = np.delete(L, argindex[0])
    L = np.delete(L,argindex[1]-1)

    cost += l1 + l2

    L = np.append(L, l1  + l2)

    if len(L) ==1:
        break
print cost

```

argmin(0)とargmin(1)でよかった。


各問じゃなくて章ごとの記事にしたほうがいいかもしれない。


ポイントは
・どんな切り方をするにせよ、切断の最終的な回数は変わらない。
・各切断で板は独立なブロックに分かれる
・コストは各ブロックで板の切り出しが完了する深さに比例する

なので、L = {a, b, c} (a <= b <= c)の場合だとcを単独で切り出すのがベストで、コストは (a + b + c) + (a + b).


Lの要素数が奇数なら、木の最も深い部分ではこんな感じの形になるのでaとbをペアにすればよい。

Lの要素数が偶数の場合
L = {a, b, c, d} (a<= b<= c<= d)のとき、二分割-> 二分割とdの切り出しのコストを比べると

2(a + b + c + d )  
と
(a + b + c + d) + (a + b + c) + (a + b) = 3(a+b) + 2c + d

となり一概にどちらが正しいかは言えない(a, b, dの値に依存)。

ただ、どちらのケースにしろ、コスト最小ではaとbが最終的なペアになっている。

aとbをペア (ab) にしてしまうと、
L = {ab, c, d}の板になるので奇数の場合に帰着できて次の結合はL = {abc,d}

要素数が5の時 L = {a, b, c, d, e}を考えても、最小コストのときは常にaとbがペアになるので3の場合に最終的に落とせる。

というわけで、最小の2枚をペアにするように作っていけばok.
蟻本をpythonで: page 47 Saruman's Army (POJ 3069)

```py

# coding: utf-8
N = raw_input()
R = raw_input()
X = raw_input()
N, R, X = map(int, N.split())[0],map(int, R.split())[0],map(int, X.split())


colored_pos = [X[0]]
pos = X[0]
# print X
while(1):
    far = pos
    for (i,x) in enumerate(X):
        if pos + R > x:
            far = x
        else:
            break
    colored_pos.append(far)
    pos = x

    if pos + x > X[-1]:
        break

print colored_pos

```

split()を覚えた。