OmniAICreator/Qiita-1.07M huggingface dataset:
mysql index 検証②　force indexを使用

https://qiita.com/zukaishi/items/bcfb67fb952a50d25792


続き。

```
| data5 | CREATE TABLE `data5` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `status` tinyint(1) NOT NULL,
  `name` varchar(50) NOT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_1` (`status`),
  KEY `idx_2` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4194305 DEFAULT CHARSET=latin1
```
`idx_1` (`status`)、`idx_2` (`name`)　それぞれインデックスが存在する。
force indexで強制的に使用するインデックスを指定してあげると
ただしくインデックスが張られていても、使用されない。

```
mysql> explain  select * from data5 force index(idx_1) where name = "test000000000";
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | data5 | ALL  | NULL          | NULL | NULL    | NULL | 4165246 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)
```

```
mysql> explain  select * from data5 force index(idx_2) where name = "test000000000";
+----+-------------+-------+------+---------------+-------+---------+-------+------+-----------------------+
| id | select_type | table | type | possible_keys | key   | key_len | ref   | rows | Extra                 |
+----+-------------+-------+------+---------------+-------+---------+-------+------+-----------------------+
|  1 | SIMPLE      | data5 | ref  | idx_2         | idx_2 | 52      | const |    1 | Using index condition |
+----+-------------+-------+------+---------------+-------+---------+-------+------+-----------------------+
1 row in set (0.00 sec)
```

以前の対応した案件では、1億レコード近いデータから対象のデータを取得する時
性能劣化により、インデックスが使用されないという事態が発生しました。
その際、force indexを使用する事で解決できました。
レイヤーチェック

#L3チェック
ICMPを使用してIPアドレスが生きているかチェックする。
冗長化していないNICが壊れたりケーブルがぬけていたりしたらICMPは返ってきません。
L3チェックが失敗するとL4以上のすべてのサービスが提供できなくなる。

#L4チェック
3ウェイハンドシェイクを使用してポート番号が生きているかチェックします。
定期的に3ウェイハンドシェイクを実行し、応答を確認します。
L4チェックが失敗するとL7も失敗します。

#L7チェック
アプリケーション層のチェック。
実際のアプリケーション通信を使用してアプリケーションが生きているかチェックします。
PHPでの無難なエンコーディング検出方法

検出順序によって結果が変わるのでなるべく変わらないパターンのメモ

# 検出方法

```php
$string = 'えんこーど';
// エンコード検出
$expected_encode = mb_detect_encoding($string,  ['ASCII', 'ISO-2022-JP', 'UTF-8', 'EUC-JP', 'SJIS'], true);
```

# 追記

使用する際にはSJISでも漏れる場合があったので決まらなかったらSJISにする処理を入れたら良さそう。

```php
$from_encoding = mb_detect_encoding($encoded_string, ['ASCII', 'ISO-2022-JP', 'UTF-8', 'EUC-JP', 'SJIS'], true);
if ($from_encoding === false)
{
    $from_encoding = 'SJIS';
}
mb_convert_encoding($encoded_string, 'UTF-8', $from_encoding);
```

# 確認

```php
$internal_encoding = mb_internal_encoding();
$string = 'えんこーど';

$code_list = ['ASCII', 'ISO-2022-JP', 'UTF-8', 'EUC-JP', 'SJIS'];

foreach ($code_list as $code)
{
  $encoded_string = mb_convert_encoding($string, $code, $internal_encoding);
  if ($encoded_string === false)
  {
    continue;
  }
  var_dump('内部エンコーディング：'.$internal_encoding);
  var_dump($code.'に変換');
  var_dump('エンコーディング検出:'.mb_detect_encoding($encoded_string, $code_list, true));
}
```

# 結果

```
string(38) "内部エンコーディング：UTF-8"
string(14) "ASCIIに変換"
string(36) "エンコーディング検出:ASCII"

string(38) "内部エンコーディング：UTF-8"
string(20) "ISO-2022-JPに変換"
string(42) "エンコーディング検出:ISO-2022-JP"

string(38) "内部エンコーディング：UTF-8"
string(14) "UTF-8に変換"
string(36) "エンコーディング検出:UTF-8"

string(38) "内部エンコーディング：UTF-8"
string(15) "EUC-JPに変換"
string(37) "エンコーディング検出:EUC-JP"

string(38) "内部エンコーディング：UTF-8"
string(13) "SJISに変換"
string(35) "エンコーディング検出:SJIS"
```
Xcoce に XVim2 をインストール

Qiita 初投稿です。よろしくお願いします。

愛用していた MacBookPro が壊れて、最近 MacBook に変えたんですが、Xcode の環境構築の際に XVim 入れようとして一筋縄では行かなかったので書いておきます。

環境
MacBook (Retina, 12-inch, 2017)
macOS High Sierra バージョン 10.13.1
Xcode Version 9.2 

同じ症状で困っている人の参考になってくれれば幸いです。

まず、Xcode 9.x 以上では XVim2 を使えって何人かの方が書いていたので、Xvim2 を落としきます。
証明書もキーチェーンで作成して、

```sh
sudo codesign -f -s XcodeSigner /Applications/Xcode.app
```
を実行。
この辺りは、README にも書いてありますし、参考になる記事がいっぱいあります。



ここから本題なのですが、いざ make すると。


```sh

The domain/default pair of (/Library/Developer/CommandLineTools/../Info, DVTPlugInCompatibilityUUID) does not exist
 
The domain/default pair of (/Library/Developer/CommandLineTools/../Info, CFBundleShortVersionString) does not exist
```

のメッセージが出て make が動いていないっぽかった。
(XVim も試したのですが、同様)




結論から行ってしまうと、この記事 [Github "Getting the error The domain/default pair of (/Library/Developer/CommandLineTools/../Info..."](https://github.com/XVimProject/XVim/issues/920) の通りにやれば動きました。

```sh
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
```
の後で make すれば良いです。

xcode-select は知らなかったので、後日調べて何か解ったら追記します。
Rails：HTTPを使わずに自身のAPIを独自ヘッダー付きでリクエストできて感動する方法

Railsを使ったAPI開発者のあなたはきっとこう考えたことがあるはずです。

***「既にあるAPIを使えればテストも書いてあるから新規にモジュールを作るより楽できそうだなぁ。でもHTTPでリクエストするのは処理時間的にきついなぁ。HTTPを経由しないでリクエストできないかなぁ。。だって自分に対してHTTPとかわけわかんなくない？」***


### **奥さんできますよ！**



# コード
```ruby:my_app/lib/internal_api_client

module InternalApiClient

  def self.request(headers_hash, internal_endpoint, params = nil)
    params = params.to_query if params.present?
    hash = Rack::MockRequest.env_for(internal_endpoint, params: params)

    # 何も指定していないと"REQUEST_METHOD"=>"GET"になる
    pp hash

    # headers_hashをmergeして追加する
    hash.merge!(headers_hash)

    # この中身が肝心
    pp hash

    # リクエストを投げる！
    res = Rails.application.routes.call(hash)

    # resの中身はこんな感じで取れます
    pp res[0]      # status
    pp res[1]      # headers
    pp res[2].body # body

    JSON.parse(res[2].body)
  end
end

```

# 使い方
rails consoleからすぐに使えます。
`internal_endpoint`に渡すURL文字列には`http://`は不要です。内部だから関係ないという事なんでしょうね。

```shell
[foo@bar my_app]$ rails c
Running via Spring preloader in process 21427
Loading development environment (Rails 5.0.2)
[1] pry(main)> require "#{Rails.root}/lib/internal_api_client"
=> true
[2] pry(main)> headers_hash = { 'REQUEST_METHOD' => 'POST'}
=> {"REQUEST_METHOD"=>"POST"}
[3] pry(main)> InternalApiClient.request(headers_hash, 'users')
=>諸事情によりお見せできません
```


ぜひ実際に動かして***HTTPを使わない***という感動を味わっていただきたいです。

と、ここまできて、読んでいただいている方の中には既に試したことがあり、独自ヘッダーの指定方法がわからずに断念した方もいらっしゃるのではないでしょうか？

### **奥さんできますよ！**





# 独自ヘッダーを指定する方法
`Rack::MockRequest.env_for`の戻り値のハッシュに独自ヘッダーもmergeしてあげればいいのですが、三つのポイントがあります。

1. **ヘッダー名は全て大文字にする**
* **ヘッダー名に`'HTTP_'`という接頭辞を付ける**
* **ヘッダー名のハイフンはアンダースコアに置き換える**


例

```ruby
header_hash = {
  'REQUEST_METHOD' => 'POST',
  'HTTP_USER_TOKEN' => user_token,
}
```

上記の例ではアプリとして`user_token`という独自ヘッダーを定義しているという仮定で、上記の三つのポイントを踏まえheaders_hashを作っています。



# ただし・・・
一応動作確認した限りは問題なさそうなのですが、先例が殆ど無いので怖くて使っていません。。
mockという名前が付いているので心配になってproductionでも試しましたがちゃんと動きました。

使った方ご報告下さると助かります！

# 参考
[Codewall - Rails - Internal Requests (Example)](https://coderwall.com/p/gghtkq/rails-internal-requests)
[Qiita - RackアプリケーションのエンドポイントをHTTPを経由せずに呼び出す方法](https://qiita.com/ma2shita/items/0b454935603f810f2247)
Wildfly  <xa-datasource-property>　要素指定方法

#変数で指定する場合
```
<xa-datasource-property name="ServerName">
    ${tmp}
</xa-datasource-property>
```

#直接指定する場合
```
<xa-datasource-property name="ServerName">
    hogehoge-hostname
</xa-datasource-property>
```

#文字列＋変数で指定する場合
```
<xa-datasource-property name="ServerName">
    concat('fugafuga', ${tmp})
</xa-datasource-property>
```
Vue.jsでMap型データをv-forで取り出す方法

# 結論から言うとあっているのかはわかりませんが

`v-for="[key, val] in Array.from(map)"` だと確実に動きました。

# 連想配列的なものは v-for="(val, key) in xxx" 形式でしか受け取れないと思っていたときにできたもの

```html
<html>
  <head>
    <script src="https://unpkg.com/vue"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
  </head>
  <body>
    <div id="app">
      <div v-for="(val, key) in _.fromPairs(Array.from((new Map([['a', 10], ['b', 20]])).entries()))">
        {{key}}:{{val}}
      </div>
    </div>
    <script>
      new Vue({el: '#app'})
    </script>
  </body>
</html>
```

そのままではエラーもでずスルーされたので entries() を返してみたものの、それは配列ではなく MapIterator 型だったので試しに Array.from に渡してみたらキーと値のペアの配列になったものの、Array.from はあっても Object.from みたいなのがなくて素の連想配列に戻せず、しかし lodash にまさにそれ用の機能があったので使ってみた次第です。

正しい方法があったら教えてください。

## さらに試行錯誤の結果 `(val, key)` ではなく `[key, val]` で受け取れることに気づく

```html
<html>
  <head>
    <script src="https://unpkg.com/vue"></script>
  </head>
  <body>
    <script>
      console.log("方法1")
      const map = new Map([['a', 10], ['b', 20]])
      for (const [key, val] of map) {
        console.log(`${key}:${val}`)
      }
    </script>

    <div id="app">
      方法2
      <div v-for="[key, val] in Array.from(map.entries())">
        {{key}}:{{val}}
      </div>

      方法3
      <div v-for="[key, val] in Array.from(map)">
        {{key}}:{{val}}
      </div>

      方法4
      <div v-for="[key, val] in [...map.entries()]">
        {{key}}:{{val}}
      </div>

      方法5
      <div v-for="[key, val] in [...map]">
        {{key}}:{{val}}
      </div>
    </div>

    <script>
      const vm = new Vue({
        el: '#app',
        data: {
          map: new Map([['a', 10], ['b', 20]]),
        },
      })
    </script>
  </body>
</html>
```

方法1のように JavaScript の for で繰り返すとき `[key, val] of map` という書き方をするので試しに v-for の中で書いてみたら動きました(方法2)。ポイントは `(val, key)` を `[key, val]` に変更したところです。このあたりドキュメントのどこにも見あたらなかったのは書くまでもないことだったのかそのへんはわかりません。とりあえず動いた方法2を元にした3、4、5の方法も動きました。(この結果だけ見ると entries() って何のためにあるんだろう？)

# ところが単一ファイルコンポーネントのなかでは挙動がおかしい

喜びも束の間、.vue の中の template タグのなかで方法5の書き方 `[...map]` をすると動かなかったのは謎です。Vueのテンプレートのタグの構築を関数化(？)したときのスコープだとスプレッド演算子(...)が正しく解釈されないのかもしれません。とりあえずこの場合、`Array.from(map)` としたら動きました。
Kubernetes Meetup Tokyo #9レポート

内容の正当性は保証できません。こういう雰囲気でした。

## 概要

Kubernetes Meetup Tokyo #9
日時: 2018年1月12日19時から
URL: https://k8sjp.connpass.com/event/75328

## タイムテーブル

19:00-19:05 - Organizer & CyberAgent, Opening (5min)
19:05-19:20 - ianlewis, KubeCon Overview(15min)
19:25-19:40 - riywo, Review Adrian Cockroft’s keynote (15min)
19:45-20:00 - jyoshise, GPU, Deep Learning or Service mesh (15min)
20:05-20:20 - tnir, Kubernetes at GitHub (15min)
20:25-20:45 - CyberAgent Sponsor Session (20min)

## Review Adrian Cockroft’s keynote

@riywo

* AWSはCNCFに対してクレジットを補助したり、自社のサービスに取り入れたりと積極的にコントリビュートしている
* KubernetesのCNIのプラグインも作った
* ECSは繁盛している
* AWS Fargateをリリースした
    * LambdaのECS版的な
* Kuberentesをデプロイしているユーザーの68%はAWSにもデプロイしている
* HeptioとかがKubernetesをAWSで動かすためのインテグレーションを開発している
    * IAM連携とか
* AWS Fargate + Amazon EKSは2018年
    * フィードバックもよろしくね

## GPU, Deep Learning or Service mesh

@jyoshise

* ServiceMesh
    * マイクロサービス間をつなぐ
* Istio
    * 今アツいServiceMeshの実装
    * マイクロサービスでのカナリアテストがやりやすい
    * サービスごとにネットワークのポリシーを適用できる
* ML/DL on k8s
    * 機材が高価なのでk8sでスケジュールしてやる
    * ネットワークが問題
        * GPUノード間の通信がキツイ
    * やり方はいろいろある。
        * Microsoftはこれ用にCNIを作った

## Kubernetes at GitHub

@tnir 

* GitHubがK8sに移行
    * chatopsでnode追加
    * node設定はPuppetで
    * 1つのPodに3つのコンテナを入れている
        * Nginx, Unicorn, failbot(エラートラッキング)
        * Unix Socketを使用
    * cousul-service-router with haproxy (k8s以外のアプリへの通信？）
    * Node Portを使用。Ingressは使っていない
    * kubectl get系のコマンドはchatから使える
    * canary deployをannotationを使ってやっている
    * Persistent Volumeは分散システムを使用


## Deploying to Kubernetes Thouthand Deploys

* High Velocity重要 (こまめにリリースしよう）
    * リスク削減
    * コスト効率
        * コミットを貯めない
    * セキュリティ
        * 直ぐに脆弱性の対応等ができる
* Image First
    * Immutableなコンテナにする
        * local /dev / prdで同じイメージを
        * コンテナ実行時にプログラムをDLしない
        * localでビルドしない
* Shift Left
   * コードレビューはコスト高いので、テスト等を事前にやっておく
* Maintain Application Portability
    * クラスタが消し飛んだときに復旧できるか？
    * 設定ファイルはコンテナイメージに内包せず、ConfigMap / Secretを使う
        * Docker Buildはできるだけ避ける
    * Helm Chart化
        * 一括管理
    * DRのテスト
* Outsource Cluster Management
    * クラスタの管理は専門のチームに任せる
    * ただしスケーラビリティや冗長化を頭に入れて開発しておく
    * Certified Kubernetes Conformance Programに準拠した構成に使用
        * 一部のKubernetes環境にしかない機能は使わないようにしよう
* Connect all the dots
    * CodeFresh使うとか
        * Spinnaker + Concourse CI + DockerHub的なやつ
        * 設定をコード化できる

## Serverlessについて ~OpenFaaSの概要~

@徳田拓也

* OpenFaas
* FunctionWatchdog
    * リクエストのBodyを対象のSTDINに流す
* API Gateway /UIポータル
    * Prometheus経由でメトリクスを収集
* 同期処理 / 非同期処理 / 非同期処理+コールバック
* ```faas new --lang python sample``` でFunctionが作成される
    * Build後、Dockerイメージ化
自分用のコイン（トークン）にブラックリストを追加する（ethereum9）


前回はこちら。[自分用のコイン（トークン）を作成して、別のユーザーに渡す](http://qiita.com/joji/items/1e5341aa5f7c9dd15eec "自分用のコイン（トークン）を作成して、別のユーザーに渡す")


• ブラックリストに記載されたアドレスは入出金不可とする
• オーナーのみブラックリストへの追加・削除を可能とする
• オーナーはアドレスで識別することとし、コントラクトの作成時のアドレスを設定する

今回使うアドレスは以下の２つです。

ユーザーA；gethを起動時に指定したユーザー

```
"0x127a0614d4f606460f3cb7e05f1b9f79fdf9191b"
```

ユーザーB

```
"0x32a39ca8fd074a9c1e49b77b6613ca5287592305"
```

コンストラクタにこの値を入れて、「create」を押下する

```
10000, "OreOreCoin", "oc", 0
```

ユーザーAのbalanceOfを見て、10,000円あることを確認する

![スクリーンショット 2018-01-12 17.10.18.png](https://qiita-image-store.s3.amazonaws.com/0/39073/01367179-30f7-188a-39a5-c3e20eb84614.png "スクリーンショット 2018-01-12 17.10.18.png")

ユーザーBに2000を送金する

![スクリーンショット 2018-01-12![スクリーンショット 2018-01-12 17.18.37.png](https://qiita-image-store.s3.amazonaws.com/0/39073/d9ef8199-a7d1-5755-f74a-b8434c2a8bec.png "スクリーンショット 2018-01-12 17.18.37.png")
 17.17.43.png](https://qiita-image-store.s3.amazonaws.com/0/39073/a6b9a087-0351-6673-153c-669a2f1d8998.png "スクリーンショット 2018-01-12 17.17.43.png")

ユーザーBのbalanceOfを確認する

![スクリーンショット 2018-01-12 17.18.37.png](https://qiita-image-store.s3.amazonaws.com/0/39073/d9ef8199-a7d1-5755-f74a-b8434c2a8bec.png "スクリーンショット 2018-01-12 17.18.37.png")

blacklistingメソットを使って、ユーザーBをブラックリストに追加します。
![スクリーンショット 2018-01-12 19.43.19.png](https://qiita-image-store.s3.amazonaws.com/0/39073/447f835f-825c-af9d-bc6a-d85c8dea923c.png "スクリーンショット 2018-01-12 19.43.19.png")

blacklistプロパティにユーザーBのアドレスを入力して1という値が入ってることを確認します。

![スクリーンショット 2018-01-12 19.41.41.png](https://qiita-image-store.s3.amazonaws.com/0/39073/889e8ac8-3e78-c036-8ddb-6b91a74a8671.png "スクリーンショット 2018-01-12 19.41.41.png")

その後、再度、transferを実行してもユーザーBのお金は増えません。

次に、ユーザーBからAに送金をします。
AccountをユーザーBに変更します。
![スクリーンショット 2018-01-12 19.57.51.png](https://qiita-image-store.s3.amazonaws.com/0/39073/5e17d946-b0e5-4418-08e0-e4eb39bb385f.png "スクリーンショット 2018-01-12 19.57.51.png")

transferにユーザーAのアドレスを入力して送金しても、balanceが変わらないことを確認します。

次に、AccountをユーザーAに戻します。

![スクリーンショット 2018-01-12 20.23.30.png](https://qiita-image-store.s3.amazonaws.com/0/39073/81291737-103e-7047-8f65-41aecfb042c7.png "スクリーンショット 2018-01-12 20.23.30.png")


次にユーザーBをブラックリストの対象から外します。-1が返ってきています。

![スクリーンショット 2018-01-12 20.25.52.png](https://qiita-image-store.s3.amazonaws.com/0/39073/ead65d2e-8bb8-d233-e903-094c2b032e07.png "スクリーンショット 2018-01-12 20.25.52.png")

次にAccountのユーザーをBに戻して、ユーザーAに送金します。
balanceOfで無事に資金を送金できたことを確認して下さい
Raspberry pi model b+ では AWS greengrass できなかった

ずっと眠っていたラズパイを活用しようと`AWS Greengrass`利用しようとしたら条件満たせず使えませんでした．
（できるかわからないけど）Alexa スキルの Lambda をラズパイで実行するつもりでしたが作戦を変える必要がありそうです．

# CPUアーキテクチャ条件
よし，使うぞ！とアーキテクチャ調べたら即条件を満たせず．`Greengrass`がサポートしているアーキテクチャは`ARMv7l`だそうです．

```shell
pi@raspberrypi:~ $ arch
armv6l
```
シェルに詳しくない人はRuby でワンライナー


シェルに詳しくないけど, ターミナルでゴニョゴニョしたい.
何かの言語でワンライナーしてみたらいいかも.


# 基本

`-e` オプションをつけて実行すると 引数の文字列の部分が実行される

```sh
$ ruby -e 'puts "hello"'
```

# 応用

## `-n`

`-n` オプションをつけると `while gets` と `end` で囲った状態になる
`$_` に入力された値が入る

```sh
ruby -ne  'puts $_'
```

#### 例

```sh
cat test.txt | ruby -ne 'puts $_.count'
```


## `-p`

`-n` オプションをつけると `while gets` と `print$_; end` で囲った状態になる
`$_` を変更したりするといい

```sh
ruby -pe '$_.concat(".csv")' 
```

#### 例 (hellow => hello への置換)

```sh
cat text.txt | ruby -pe '$_.gsub!(/hellow/, "hello")'
```

## `-a`

`-a` オプションをつけると `$F` に `$_.split` が入った状態になる
`$F` は`Array`

```sh
ruby -ane '$F[0]' 
```

#### 例 (python のプロセス全キル)

```sh
# プロセス一覧 | python のものを抜き出し | プロセスID 取り出し        | キル
ps -ax      | grep python         | ruby -ane 'puts $F[0]' | xargs kill -9
```


# 最後に

Unixコマンドに詳しくなくてもとりあえずこれさえあればなんとかなるきがする

別に Ruby で無くてもいい
【UE4】AIのExample Projectを作ってみました（武器編）最終章

#はじめに
「AIのExample Projectを作ってみました」シリーズの最終章となります。

[前章はこちら](https://qiita.com/Dv7Pavilion/items/b1f259b82c2b8bd5fd8b)


ここでは武器のブループリントやウィジェットブループリント（UI）について紹介と解説をしていきます。

#プロジェクトはこちらです！
今回解説するプロジェクトはOneDriveにアップしてあります。バージョンは**4.18.2**です。

[StealthGameExample_Ver1_5.zip](https://1drv.ms/u/s!Au-8FqgREBKZhTC3k-2_VILJrrXl)


#BP_BaseWeapon
全ての武器の基底クラスです。武器の実装のほとんどはこのクラスに詰まっています。

##IFire
武器の所持者（BP_PlayerやBP_Guard）から発射イベントが呼び出されると、このイベントが実行されます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/104467/39e50d4c-9964-70fc-c9a7-2fd759202e2c.png" width=60%>

1. 関数LOSで引数Trace Startから引数Forwardに向かってトレースし結果を返します。
2. 関数SpawnBulletTraceでエフェクトを生成します。
3. Apply Point Damageでトレースがヒットしたアクタに対しダメージを与えます（武器が与えるダメージなどは構造体で定義しています）
4. 武器の装弾数を減らします。
5. 弾倉が空になれば、GetAttachParentActorで武器を所持するアクタに対し「OnReloadディスパッチャ」を呼び出しリロードするように命令します

###関数LOS
<img src="https://qiita-image-store.s3.amazonaws.com/0/104467/73e5f6f8-8e50-57f9-f8e6-f4d22a2194f8.png" width=50%>

この関数はLine Of Sight（射線チェック）を行ないます。

銃のブレを発生させる引数RandomizeがTRUEであれば関数Random Float In Rangeで-Radius～+Radiusまでのランダムな数値を取得します。
取得した数値はブレの位置を表す変数TraceNoiseに格納されます。この処理により銃弾（実際はトレース）は銃口を先端とするコーン（円錐）状に拡散します。

実際にトレースを行なうLineTraceByChannelのStartには引数Trace Startがそのまま渡されます。引数Trace Startには銃口の位置やカメラの位置が渡されます。
Endには引数Forwardから武器の持つ最大射程距離でスケーリングされ変数TraceNoiseが加えられます。引数RandomizeがTRUEであればここでブレが発生します。

Actors to Ignoreには武器を持つアクタをGet Attach Parent Actorで取得し除外対象として配列に加えられます。
武器を持つアクタのコリジョンサイズによっては銃口の位置がコリジョン内に当たったりするため、Actors to IgnoreでLOSの邪魔をしないようにしています。


#BP_Bolt
この武器は殺傷能力はありません。プレイヤーが敵をおびき出したり遠ざけたりする際に用いられます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/104467/aa36eec8-adb7-5e16-0415-820e8bf2f807.png" width=50%>

OnComponentBeginOverlapイベントではボルトが何かしらにぶつかった場所から周囲にReport Noise Eventで決まった距離に「ノイズが鳴ったよ！」と知らせます。

Report Noise EventはAIPerceptionを持つAIに対し「何か音が鳴ったよ」と知らせるイベントです。これはエンジン側で実装されています。
Noise Locationは音が鳴った位置。Max Rangeには音が鳴った時お知らせする範囲を設定します。

AIはAIPerceptionで設定された音の聞こえる範囲内でReport Noise Eventを受け取った場合に探索行動を開始します。


#各章へのリンク集
[フォルダ構造編](https://qiita.com/Dv7Pavilion/items/28e44c307b6c960c51a8)
[第1章 - プログラムの紹介＆解説](https://qiita.com/Dv7Pavilion/items/8d92042ced5074563a7c)
[第2章 - AI](https://qiita.com/Dv7Pavilion/items/b1f259b82c2b8bd5fd8b)
[最終章 - 武器](https://qiita.com/Dv7Pavilion/items/507f59cce9c2b4aae2ee)
common export to excel using poi

package com.sql.main;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * Excel 相蜈ｳ操作邀ｻ(小数据量写入<=65536)
 */
public class Excel2003Utils {

	private static final int DEFAULT_COLUMN_SIZE =30;
	
    public static void exportExcel(Class cls,String sheetName, List contents,String filePath)  {
        try {
        	File file=new File(filePath);
    	// 声明一个工作薄
        Workbook workBook;
        if (file.exists()) {
            // 声明一个工作薄
            workBook = new HSSFWorkbook(new FileInputStream(file));
        } else {
            workBook = new HSSFWorkbook();
        }
        // 生成一个表格
        Sheet sheet = workBook.getSheet(sheetName);
        if (sheet == null) {
            sheet = workBook.createSheet(sheetName);
        }else {
//			workBook.removeSheetAt(workBook.getSheetIndex(sheetName));
		}
        
        //最新Excel列索引,
//        int lastRowIndex = sheet.getLastRowNum();
//        if (lastRowIndex > 0) {
//            lastRowIndex++;
//        }
        int cellCount =0;
        Row titleRow = sheet.createRow(0);
        for(Field f : cls.getDeclaredFields()){
     		String cellName = f.getName();
     		Cell cell =titleRow.createCell(cellCount);
     		cell.setCellValue(cellName.toUpperCase());
     		cellCount++;
     	}
         int lastRowIndex=1;
//        sheet.setDefaultColumnWidth(DEFAULT_COLUMN_SIZE);
        for (Object  dataRow : contents) {
            Row row = sheet.createRow(lastRowIndex);
           Object bean =cls.newInstance();
           int cellIndex =0;
           for(Field f : cls.getDeclaredFields()){
      		 String getMethodName = "get"+f.getName().substring(0, 1).toUpperCase()+f.getName().substring(1);
      		 Method getMethod =cls.getMethod(getMethodName, null );
      		 String value = getMethod.invoke(dataRow)==null ? "NULL":getMethod.invoke(dataRow).toString();
      		Cell cell =row.createCell(cellIndex);
      		cell.setCellValue(value);
      		cellIndex++;
      	   }
            lastRowIndex++;
         }
            OutputStream ops = new FileOutputStream(file);
            workBook.write(ops);
            ops.flush();
            ops.close();
            System.out.println("sheet:"+sheetName+" write "+lastRowIndex+" success!");
        } catch (Exception e) {
        	e.printStackTrace();
        }
    }
	
}
Unity備忘録、STG制作4:弾の消去に関する一考察

※この記事は2016年当時に在籍していた某社内での（略）、社内技術ブログを作ろうと提案した言い出しっぺが三日坊主野郎だったためにブログの存在自体が埋もれてしまう事態となった。（続く）

#背景
Q：画面外に消えていったオブジェクトはどうなるか？
A：そのまま残り続ける。

つまり、不要なオブジェクトであれば、画面外に消えた時に何らかの削除処理を実装しないとメモリを食い潰すことになる。

#方法１：OnBecameInvisible()を使う
オブジェクトがカメラ外(=画面外)に消えた時にコールされるOnBecameInvisible()というコールバック関数がある。こんな感じで使えばよい。

```
void OnBecameInvisible() {
    Destroy (this.gameObject);
}
```
 
##OnBecameInvisible()を使う上での注意点
(1) カメラ内からカメラ外へと消えた時にのみコールされる。最初からカメラ外にオブジェクトがあった場合はコールされない。
(2) Unity Editor上で動作させた場合、カメラ外に出ても消えない。理由は不明だが、この時だけは編集画面の外枠が対象となる模様。下記図をご参考。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/162164/7d5bc731-13e5-9b8e-cf23-e7cc4f5ecd75.png)


#方法２：カメラ範囲を取得してカメラ外かどうかを判定する
http://bribser.co.jp/blog/delete-object-out-of-camera/ (※リンク切れ)
~~このブログに記載のコードを丸パクリする。暇な人は解析してください。~~
~~ブログがいつまであるか分からないので、ソースコードを転記しておく。~~
(2018/1/12追記)：オリジナルではないので、コード公開に不都合があるとの指摘があれば削除します。

```autoDeleteOutOfScreen.cs
using UnityEngine;
using System.Collections;

public class autoDeleteOutOfScreen : MonoBehaviour {
	public Camera _setCamera;
	
	//Margin
	float margin = 0.05f; //マージン(画面外に出てどれくらい離れたら消えるか)を指定
	float negativeMargin;
	float positiveMargin;
	
	void Start ()
	{
		if (_setCamera == null) {
			_setCamera = Camera.main;
		}
		
		negativeMargin = 0 - margin;
		positiveMargin = 1 + margin;
	}
	
	// Update is called once per frame
	void Update () 
	{
		if (this.isOutOfScreen()) {
			Destroy (gameObject);
		}
	}
	
	bool isOutOfScreen() 
	{
		Vector3 positionInScreen = _setCamera.WorldToViewportPoint(transform.position);
		positionInScreen.z = transform.position.z;
		
		if (positionInScreen.x <= negativeMargin ||
		    positionInScreen.x >= positiveMargin ||
		    positionInScreen.y <= negativeMargin ||
		    positionInScreen.y >= positiveMargin)
		{
			return true;
		} else {
			return false;
		}
	}
}
```

実行結果より、カメラからちょっと出たところで弾が消えていることが確認できる。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/162164/d086de3c-284a-0cdb-26fa-501a871afd59.png)


#その他
今回は採用しないが、こんな方法もあるらしい。
http://ftvoid.com/blog/post/653
画面内の表示領域の当たり判定を持つオブジェクトを一つ用意し、このオブジェクトに当たらなければオブジェクト破棄されるようにする。

以上
nltkで、nltk.download()でダウンロードするデータを手動で追加する方法

あまりに状況が限定的すぎるので、
自分が解るメモ程度に記載する


- 以下xmlからインデックスファイルのIDを参照して、対象ファイルのURLを探す
 - https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/index.xml
 
- ファイルを解凍して、nltkが探索するパスに配置する
 - OSによって異なる
 - Unix/Macなら、/usr/lib/nltk_data/配下など
コマンド上で「指定した1ファイル以外全消し」を実現するエイリアス

## 前書き
作業中に「**指定した1ファイル以外全消し**」をする機会が多くて、コマンド1発で実現したかった。

ググればいっぱい出てくるんだけれど、
「隠しファイル・隠しフォルダに対応してない」
「ファイル名が同じならパスが違っても生き残る」
「強引で**ちょっと怖い**」
などなどで、思う通りの挙動をするものが無かったので作りました。[^1]

**※ファイル削除が絡むので、利用は慎重に、自己責任でお願いします。**

## コマンド内容
下記を `.bashrc` に追記。

```bash:.bashrc
function rm-without() {
  # 第1引数で指定したパス&ファイル名のモノ以外のファイル削除（完全一致）
  find . -type f | sed 's/^\.\///' | grep -v "^$1$" | xargs rm -f
  # 空になったディレクトリ削除
  find . -type d -empty -delete
}
```

```bash:使い方
# source ~/.bashrc を忘れないでね！
$ rm-without sftp-config.json 
```

## 解説

1. `find . -type f` で現在のディレクトリ以下のファイルを列挙。
2. 行頭に `./` がつくので、置換処理( `sed 's/^\.\///'` )で排除。
    - 引数と同じ名前形式にしたかった。
3. `grep -v "^$1$"` で第1引数に完全一致するもの**以外**を抽出。
4. xargs rm -f で削除。
5. `find . -type d -empty -delete` で空のディレクトリを削除（便利！）
    - rmdirだと警告出る可能性があったので使わない方向にした。

## あとがき
ごくごく細部のことですが、ググってもいいのが見つからなかったので…。
「1つ1つの処理フローの意図を明確に」をモットーに書いた。

## 参考文献
[目的のファイル以外を削除するコマンド - びぶろく](http://azushink.hatenablog.com/entry/2015/09/26/142139)
[bashで複数コマンドのエイリアス - Qiita](https://qiita.com/mikakane/items/ac27582e8e52228adced)
[sedコマンドの備忘録 - Qiita](https://qiita.com/takech9203/items/b96eff5773ce9d9cc9b3)
[空のディレクトリを再帰的に消す - システム開発メモ](http://progmemo.wp.xdomain.jp/archives/430)

[^1]: `bash` 使いなので、 `bash` でしか動作確認していないですが、そんな変なことしていないので、多分 `zsh` でも動くんじゃないかなーと思っています。
WKWebViewに変更する理由


なぜUIWebiewからWKWebViewに変更するか
iOS2からあったUIWebViewiOS8から登場したWKWebView、この違い

##そもそもappleがWKWebViewを推奨
storyboard上からUIWebViewが消えました。
コード上からもdepracatedになる日も近いかもです。

> Note
In apps that run in iOS 8 and later, use the WKWebView class instead of using UIWebView. Additionally, consider setting the WKPreferences property javaScriptEnabled to false if you render files that are not supposed to run JavaScript.

https://developer.apple.com/documentation/uikit/uiwebview


##WKWebViewの方がクラッシュ率が下がる
WKWebViewの方がクラッシュが減ります。



##SDK側とアプリで別々だとクッキー同期の遅延が発生する
UIWebViewとWKWebViewでクッキーは同期されるが、同期に時間がかかるためそれによる影響がある。なのでSDKでWKWebViewなのにアプリ本体がUIWebViewだと様々な悪影響がある可能性がある。

##safari native JavaScriptの最適化をしている
つまりjsの実行速度がアップ。さらに

##その他
WKWebViewだとスライド進む、戻るをしたりプログラスバー（ロードのやつ）がプロパティを設定するだけでできたりする。
Bitbucketで静的ウェブサイトを公開する

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/Bitbucket%E3%81%A7%E9%9D%99%E7%9A%84%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E5%85%AC%E9%96%8B%E3%81%99%E3%82%8B/)をご覧ください😀

## はじめに

知ってる人も多いと思いますが、Bitbucketで静的ページを公開することが可能です。
一つのアカウントで一つのサイトしか公開できないと思われがちですが、チームを作ればいくつでも公開可能です。（これは知らない人多そう！）
手順も簡単。やってみましょう。

※URLはSSL対応されてドメインは『～.io』となっています。
ググると『～.org』で作る記事が多くヒットしますが古い情報なので注意（非SSL時代）

## 手順

### 1. チームを作る

まずはチーム作成画面でチームを作りましょう。チーム名がサブドメインになります。
※DNS標準で受け入れられるものでなければなりません。大文字と特殊文字（アンダースコアなど）は使わないこと！

- チーム名: hellosample

![ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/56789/2a243d93-e215-edff-2d06-dd020728a4eb.png)

### 2. リポジトリを作る

次にリポジトリを作ります。リポジトリ名は`{チーム名}.bitbucket.io`とする必要があります。

- プロジェクト名: hellosample（なんでもOK。ここではチーム名と同じにしました）
- リポジトリ名: hellosample.bitbucket.io

![ダウンロード (2).png](https://qiita-image-store.s3.amazonaws.com/0/56789/4618b93b-9e6d-8776-6f8c-8b914634fa3a.png)

### 3. index.htmlを作ってみる

リポジトリが作成できたらindex.htmlを作ってみましょう。
~~cloneがめんどうなので~~ Bitbucket上で『README の作成』を押してサクッと作ってみます。

![ダウンロード (1).png](https://qiita-image-store.s3.amazonaws.com/0/56789/57682bf9-de1d-9d42-464e-b8c0e6b6763e.png)

- ファイル名: README.md→index.htmlに変更
- 内容: hello sample!（なんでもOK。日本語の場合はタグしっかりかかないと文字化ける可能性あるのでビックリしないこと）

![ダウンロード (3).png](https://qiita-image-store.s3.amazonaws.com/0/56789/387275be-5b11-870c-29bd-7fd4f5970921.png)

### 4. アクセスしてみる

`https://{チーム名}.bitbucket.io/`にアクセスしてみましょう。ウェブサイトとして公開されているはずです。

- https://hellosample.bitbucket.io/
    - hello sample!と表示されていればOK！

あとはよしなに！

## 参考

- [Publishing a Website on Bitbucket Cloud(公式)](https://confluence.atlassian.com/bitbucket/publishing-a-website-on-bitbucket-cloud-221449776.html)
ButterKnifeを使ってみたまとめ


##はじめに  
Androidアプリを構築するうえで**ButterKnifeを利用すると捗る！**ということを知ったので、
導入方法や使い方をまとめます。

なお、開発環境は以下の通りです。 
 
- AndroidStudio ver2.2.2  
- ButterKnife ver8.5.1

## ButterKnifeとは  
様々な記事・書籍などで紹介されているため新たに導入しやすいライブラリの一つだと思います。

ButterKnifeはidとviewとをアノテーション(<code>@~</code>)によって関連付けることで、
findViewByIDやOnClickListenerなど**viewに関連した記述を減らす**ことができます。

##ButterKnifeの導入方法



- build.gradle(Project)  
dependencies内に下記の記述を追加する。

```Gradle
dependencies{
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.7'
        classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
```

- build.gradle(app)  
<code>apply plugin: 'com.android.application'</code>のあとに下記の記述を追加する。

```Gradle
apply plugin: 'com.jakewharton.butterknife'
```
dependencies内に下記の記述を追加する。

```Gradle
dependencies{
    compile 'com.jakewharton:butterknife:8.5.1'
    apt 'com.jakewharton:butterknife-compiler:8.5.1'
}
```

##ButterKnifeの使用方法  
使用方法は[公式サイト](http://jakewharton.github.io/butterknife/)を参考にしました。  
###おおまかな処理の流れ

1. <code>@BindView</code>を用いて関連付けるIDと変数を宣言する。
2. <code>@ButterKnife.bind()</code>を記述し、IDと変数を関連付ける。

###関連付けるIDとViewの宣言

コード中にある[]部分は対応したIDを入力してください。

- 一般的な書き方

```Java
    @BindView(R.id.[ID])
    ListView listView;
```

- ボタンをクリックしたときのイベント

```Java
    @OnClick(R.id.[ID])
    public void onClick(View v) {
        // クリック時の処理を記述
    }
```

「複数あるボタンで同一の処理をしたい」というときは下記のようにコードを書くことで実装できます

```Java
    @OnClick({R.id.[ID],R.id.[ID]})
    public void onClick(View v) {
        // クリック時の処理を記述
    }
```

- ListViewのItemをクリックしたときのイベント

```Java
    @OnItemClick(R.id.[ID])
    void OnListItemClick(int position) {
        // Itemクリック時の処理
    }
```
※上記のコードはクリックしたアイテムの位置を取得する書き方です。

###IDとviewとを関連付ける
- Activityの場合(引数:activity)
 
```Java
	OnCreate(){
		ButterKnife.bind(this);
	}
```

- Fragmentの場合(引数:activity , view)

Fragmentの場合はviewを渡す必要があります。

```Java
	OnCreateView(){
		ButterKnife.bind(this,view);
	}
```

##Tips
###アノテーションをつけたのに動作しない 
 
  1. ButterKnife.bindが記述されているかを確認
  2. gradleの記述を確認  
　Gradleプラグインが22未満の場合は<code>annotationProcessor</code>ではなく<code>apt</code>と記述してください。  
　動作しない原因となります。

###ListViewのアイテムをクリックした際のイベントについて
[KeithYokomaさんの記事](https://qiita.com/KeithYokoma/items/59e2b56f2f0736cbdea5)にありましたが、listviewにヘッダなどが登録されているとクリックされたアイテムの位置と取得する位置がずれることがあるらしいのでご注意ください。

###ver7未満からの変更点

verの違いによって書き方が違うようなのでご注意ください。

|ver7未満|ver7以降|
|:------:|:------:|
|<code>@InjectView</code>|<code>@BindView</code>|
|<code>@InjectViews</code>|<code>@BindView</code>|
|<code>ButterKnife.inject</code>|<code>ButterKnife.bind</code>|
|<code>ButterKnife.reset</code>|<code>ButterKnife.unbind</code>|
SelectManyでAnyをNullReferenceExceptionになるのでNullチェックする

SelectManyでAnyしたとき、ネスト先がNullだとNullReferenceExceptionになる。

``` error.cs
using System;
using System.Linq;
using System.Collections.Generic;
					
public class Program
{
	public static void Main()
	{
		var test = new List<string>{ 
			null
		};
		
		Console.WriteLine( test == null);
		Console.WriteLine( test.Any());
		var test2 = test.SelectMany(x=> x);
		Console.WriteLine( test2 == null); // ここはNullじゃないのでFalseになる
	    Console.WriteLine( test2.Any());
        
	}
}
```

実行結果

``` 
False

Stack Trace:

[System.NullReferenceException: Object reference not set to an instance of an object.]
   at System.Linq.Enumerable.<SelectManyIterator>d__16`2.MoveNext()
   at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source)
   at Program.Main() :line 15
```

事前にNullチェックしてあげると回避できるよ。

```
var test2 = test.Where(x => x != null).SelectMany(x=> x);
```

あたりまえだけどちょっと困ったのでめも

* 追記2018.1.25

こちらの方がすっきり

```
var test2 = test.SelectMany(x=> x ?? string.Empty);
```
EC-CUBE3でDBに触らずに動的ブロックの複製を作る

EC-CUBE3で"カテゴリ"のブロックがもう一つ欲しいなと思ったのだけど、DBから値を読んでくる動的ブロックを作るのは意外と面倒。

[EC-CUBE3でブロックを追加する方法](http://spot-web.jp/blog/2735/)

同じhtmlでいいのにDBや本体ファイルを触るのはちょっとなあとということで、twigのほうで細工してみる。

1. EC-CUBE管理画面の[コンテンツ管理]>[ブロック管理]で`category2`というファイル名のブロックを作る。
2. `src/Eccube/Resource/template/default/block.twig`を`app/template/default/block.twig`にコピーして、以下のように書き換える。

```twig:block.twig
{% for Block in Blocks %}
    <!-- ▼{{ Block.name }} -->
    {% set file_name = Block.file_name %}
    {% set logic_flg = Block.logic_flg %}
    {% if file_name == 'category2' %}
        {% set file_name = 'category' %}
        {% set logic_flg = 1 %}
    {% endif %}
    {% if logic_flg %}
        {% if app.config.http_cache.enabled %}
            {{ render_esi(path('block_' ~ file_name)) }}
        {% else %}
            {{ render(path('block_' ~ file_name)) }}
        {% endif %}
    {% else %}
        {{ include('Block/' ~ file_name~ '.twig', ignore_missing = true) }}
    {% endif %}
    <!-- ▲{{ Block.name }} -->
{% endfor %}
```

`Block.file_name`に直接代入できないのでちょっと冗長ですね。
要は、特定のブロック名が来たら既存の動的ブロックのファイル名に差し替えてやればよいのです。
あとは新しく作ったブロックを必要なページに配置しましょう。

なお、`Block/category.twig`はhtmlにid属性を含んでいるので、classに書き換えてやる必要がありますが、そこのところは省略。
RobustScalerの適用結果をグラフに描画する

scikit-learnの前処理機能の1つであるRobustScalerについて理解を深めるために、単純なデータポイントに適用した結果をグラフにプロットしてみました。

### RobustScalerの特徴

* データポイントを、中央値が0になり、四分位範囲（interquartile range、IQR）が1になるように移動・スケール変換する。
  * 高校数学では四分位数をデータポイントの中央値前後部分の中央値として求めるが、RobustScalerではデータポイントの要素数を $n$ とすると、$q$ 分位数（quartile）は $(n-1)q +1$ 番目のデータポイント（自然数にならない場合は値を補完する）として求める。
  * 例：5個の要素を持つデータポイントでは、25%分位数は2番目の要素になる。
* 平均と分散を使った移動・スケール変換に比べて、外れ値の影響を受けにくい。

### 検証用コード

```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import RobustScaler

# 検証用データポイント
X = np.array([[-4], [-3], [-1], [0], [2]])

# RobustScalerを検証用データポイントに適用する。
scaler = RobustScaler()
X_ft = scaler.fit_transform(X)

# 適用前後のデータポイントをグラフに描画する。
fig = plt.figure(figsize=(8,4))
ax1 = fig.add_subplot(1, 1, 1)
# 適用前のデータポイントをx=1上にプロットする。
ax1.hlines([1], -5, 3)
ax1.plot(X, np.array([[1], [1], [1], [1], [1]]), "o")
# 適用後のデータポイントをx=0上にプロットする。
ax1.hlines([0], -5, 3)
ax1.plot(X_ft, np.array([[0], [0], [0], [0], [0]]), "o")

# グラフの見た目を調整する。
ax1.set_xlim(-4.5, 2.5)
ax1.set_ylim(-0.5, 1.5)
ax1.set_yticks([0, 1])
ax1.set_yticklabels(["after", "before"])

# グラフに注釈（補助線など）を入れる。
ax1.vlines([X_ft[2]], -1, 0, linestyles='dashed')
ax1.vlines([X_ft[1], X_ft[3]], 0, 0.5, linestyles='dashed')
hw = 0.1
hl = 0.1
ax1.hlines([0.25], X_ft[1], X_ft[3], linestyles='dashed')
# 25%分位数は2番目（インデックス1）、75%分位数は4番目（インデックス3）となる。
ax1.arrow(X_ft[3][0]-hl, 0.25, 0.001, 0, fc='black', ec='black', head_width=hw, head_length=hl)
ax1.arrow(X_ft[1][0]+hl, 0.25, -0.001, 0, fc='black', ec='black', head_width=hw, head_length=hl)
ax1.text((X_ft[3][0]+X_ft[1][0]) / 2 - 0.05, 0.3, '1', fontsize=10)

# グラフを表示する。
plt.show()
```

### 実行結果

![RobustScaler.png](https://qiita-image-store.s3.amazonaws.com/0/186068/2ef88553-4b64-0574-356f-45a552214b61.png)
MacにTexmakerを導入

# はじめに
学校支給のMacでtexｍakerの導入に手間取ったので
メモ兼誰かの役に立てばいいなぐらいの簡単な気持ちで書いてます。
不備や質問があれば気軽にコメントをいただけると嬉しいです。

# 環境
- OS:Mac OS X 10.12.6
- homebrew導入済

# 簡単な手順
1.MacTexを入れる
2.texmakerを入れる
3.日本語化をする
4.設定を行う
5.テストする
6.喜ぶ

# 1.MacTexを入れる
- [ここ](https://tug.org/mactex/mactex-download.html)からMacTexをダウンロードしてpkgファイルを開きます
- MacTexのインストール先はとりあえずデフォルトで進める
- (インストール先を変えるとパス通す時どこかわからなくなる)

# 2.texmakerを入れる
- `brew cask install texmaker`をターミナルで叩く

# 3.日本語化をする
- [ここ](http://writingwithtexmaker.blogspot.jp/2013/04/texmaker40.html?zx=e1f2322cf558e688)から`日本語キットfor texmaker4.0.1 `をダウンロード
- 解凍して`texmaker_jp.qm`を用意しておく
- (`Apllications`からtexmakerを右クリックして`パッケージの内容を表示`をクリックして)
`Applications/texmaker.app/Contents/Resources`に解凍した`texmaker_jp.qm`を入れます
- 一回起動して`options>Interface Language`から`ja`を選択
- 再起動

# 4.設定を行う
**MacTex2017かつインストール時にデフォルト設定で入れていることが前提**

- `オプション>Texmakerの設定`のコマンドのところからパスの設定を行う
- LaTeX:`"/Library/TeX/texbin/platex" -synctex=1 -interaction=nonstopmode %.tex`
- pdfLaTeX:`"pdflatex" -synctex=1 -interaction=nonstopmode %.tex`
- dvipdfm:`"/Library/TeX/texbin/dvipdfmx" %.dvi`
- 左の簡単コンパイルのところで`LaTeX+dvipdfm+PDFファイルの表示`を選択する

# 5.テストする
```tex:test.tex
\documentclass[a4j,12pt]{jreport}
\title{ {\LaTeX} 動作確認テスト・サンプルファイル}
\author{情報リテラシTA}
\date{\today}
\begin{document}
\maketitle


\chapter{\LaTeX の世界にようこそ！}

\section{インストール成功！}
\LaTeX の世界にようこそ！この文章が「dviout」というソフトで閲覧できていれば、
インストールに成功しています。

\LaTeX（ラテフ）もしくは\TeX（テフ）は、
組版処理を行うソフトウェアです。
数学者・コンピュータ科学者のドナルド・クヌース氏によって作られました。

このソフトを使うと、きれいな文章の作成ができます。実際に出版の現場でも使われているそうです。
数学者が作ったということもあって、特に数式の出力がきれいにできるのが特徴です。
\begin{eqnarray}
& \displaystyle \lim _{x \rightarrow 1} \left( \frac{2}{x-1} - \frac{x+5}{x^3 -1} \right)\; ,\; 
& \displaystyle \int ^\pi _0 \cos ^2 (x)dx \nonumber
\end{eqnarray}
2つの数式が、きちんと表示されていますか？
複雑な数式が入った文章も、きれいに出力することができます。



\section{基本手順}

では、\LaTeX で文章を作る際の、基本的な手順をここに示します。


\begin{enumerate}
 \item ソースファイルをTeraPadなどのエディタで作成する。
 
 ソース（素）となるファイルを作成します。これにはエディタと呼ばれるソフトを使います。
 この地点では文章の形にはなっていません。
 
 \item ソースファイルをコンパイルして、dviファイルを作成する。
 
 パソコンに変換を命令して、先ほどつくったソースファイル
 をdviファイルに変換、文章の形にして確認します。
 
 \item dviファイルができたことを確認したら、PDFに変換する。
 
 dvi形式は、あまり一般的ではありません。
 そこで、Adobe Readerなどで閲覧ができるPDF形式に変換します。
 
 
\end{enumerate}


\end{document}
```
# 6.喜ぶ
いえい
# おわりに
初めての投稿なのでお手柔らかによろしくお願いします
# 参考
- [El Capitan / SierraでTeX環境をゼロから構築する方法](https://qiita.com/hideaki_polisci/items/3afd204449c6cdd995c9)
- [Mac OS X MarvericksへのTeX環境のインストール](https://qiita.com/lethe2211/items/4faf76cb498a37a43312)
- [Tex wiki](https://texwiki.texjp.org/?Texmaker#k564e4ed)
- [Texのサンプルコード](http://www.damp.tottori-u.ac.jp/~hoshi/info/doc-info-2009/sample.tex)
intra-mart実践入門の作成記録 #003 エディター選択

## 候補
　正確に言うと各種エディターに対するプラグインやアドオンの選択となるのですが、「プラグインがない＝そのエディターは使わない」となりますので実質的にはエディターの選択と同等です。あくまで[Re:VIEW](http://reviewml.org/)で執筆時に使用するエディターなので普段使いのエディター[^1]とは別の話です。

　探してみたところ、たくさんありました。

* [Re:VIEW mode for Emacs](https://github.com/kmuto/review-el)
* [Re:VIEW Color macro for CotEditor](https://github.com/kmuto/review-coteditor)
* [ReVIEW helper macro mode of Hidemaru](https://github.com/kmuto/review-hidemaru)
* [Sublime Text](https://github.com/yanzm/ReVIEW)
* [miエディタ用のReVIEWモード作ってみた](http://seuzo.net/entry/2012/02/21/222036)
* [Re:VIEW support for Atom](https://atom.io/packages/language-review)
* [vscode-language-reviewを公開します](http://atsushieno.hatenablog.com/entry/2016/11/05/214006)

## 選択
　[Visual Studio Code](https://code.visualstudio.com/)の拡張があったため、[vscode-language-review](https://github.com/atsushieno/vscode-language-review)に決めました。ライブプレビュー機能があるのがとてもありがたい[^2]。さらに、[Visual Studio Team Services Extension for Visual Studio Code](https://github.com/Microsoft/vsts-vscode)も使って、[Visual Studio Team Services(VSTS)](https://www.visualstudio.com/ja/team-services/)との連携を行えば、「編集=>タスクと紐づけてコミット=>プッシュ=>プルリクエスト=>マージ=>(CIで変換した)PDFを取得」というリズムも作り易いはずです。

　次は、[VSTS](https://www.visualstudio.com/ja/team-services/)でのCIを行うための準備となります。



[^1]: 私は普段は[EmEditor Professional](https://jp.emeditor.com/)を使用しています。
[^2]: 他にも[ライブプレビューするための方法](http://yoshiko.hatenablog.jp/entry/2015/01/04/Re%3AVIEW%E5%B0%8E%E5%85%A5_%26_Re%3AVIEW_Live_Reload%E4%BD%9C%E3%81%A3%E3%81%9F)もあったので試していたけれどRuby未使用者の私にはハードルが高かった。
Windows > Network > ルータのアドレスにhttp接続できない症状 | 対処

```txt:動作環境
Windows 7 Pro (32bit)
```

### 症状

- ルータからDHCPにてIPアドレスを取得済
- pingでルータは見えている
- IE(Internet Explorer v11)でルーター接続(http)に失敗する
    - パスワード入力ダイアログが表示されない
    - 「xxxに接続できません」
- そのPCにはVMware workstationがセットアップ済

### 対処

以下を実施したところ接続できた。

- A. IEで新規タブを開いてから`http://IPアドレス`を入力する
    - 起動時のタブ(aboutに設定)では接続できない??
- B. ネットワーク接続の「VMware Network Adapter」(複数)を無効にする

VMwareが経路情報を書換えて、ルータに到達できないようになったのだろうか。
Bの設定後にAの手順が不要か、は確認する時間はなかった。
FragmentArgsを使ってみたまとめ

##はじめに

Androidアプリを実装するうえで、便利なライブラリを教わったので使い方などをまとめます。
**内容は順次更新**していきます。

なお、開発環境は以下の通りです。 
  
- AndroidStudio ver2.2.2

- FragmentArgs ver3.0.2
 
##FragmentArgsとは

アプリを実装しようとすると画面遷移の際に引数を渡したいことがあると思います。
通常、IntentやBundleに"Key:value"の形式で格納し遷移する際に渡しますが、
**画面数や引数が増えるにつれてコードが長くなり可読性が低下**する原因となってしまいます。
~~そもそもコードの量が増えるといろいろとミスなどが・・・~~ 

そのような場面で活躍するのがFragmentArgsです。
**FragmentArgsはFragmentからビルダークラスを自動で生成することで、
Fragment間のデータのやり取りを簡略化**
してくれます。


#FragmentArgsの導入方法
導入方法は[gitのページ](https://github.com/sockeqwe/fragmentargs)を参考にしました。
FragmentArgsを導入するには、下記の内容を追加します。

- build.gradle(Project)



```Gradle:build.gradle(Project)
dependencies{
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.7'  
}

allprojects {
    repositories {
        maven {  url "https://oss.sonatype.org/content/repositories/snapshots/"  }
    }
}
```
- build.gradle(app)

```Gradle:build.gradle(app)
apply plugin: 'com.neenbedankt.android-apt'

dependencies {
    compile 'com.hannesdorfmann.fragmentargs:annotation:3.0.2'
    compile 'com.hannesdorfmann.fragmentargs:bundler-parceler:3.0.2'
    apt 'com.hannesdorfmann.fragmentargs:processor:3.0.2'
}
```
※gradleプラグインが2.2以上の場合「apt」を「annotationProcessor」とする必要があるようです。

##FragmentArgsの使い方

###おおまかな処理の流れ

1. (呼び出し元)Builderクラスを用いて遷移先を生成。このとき、渡したい値を引数とする。
2. (呼び出し先)<code>FragmentArgs.inject(this)</code>で渡された値を取得する。
3. (呼び出し先)取得した値を<code>@Arg</code>のついた変数に格納する。

###値の渡し方(MyFragmentへuserName,ageを渡す場合)

```Java
   MyFragment myFragment = new MyFragmentBuilder(userName,age).build();
```

MyFragmentBuilderはFragmentArgsによって自動で生成されるクラスです。
[Run:app]をすることで生成されるので、最初はエラーとなっていても気にせず実行してみましょう。
**builderが生成されない場合は、Tipsで紹介している方法**を試してみてください。

###値の受け取り方
- 受け取った値を格納する変数(今回はuserName,age)を宣言する。
FragmentArgsは下記のフィールドからビルダークラスを生成します。   

```Java
　　@Arg
	String userName;
    @Arg
	int age;
```
このとき<code>@Arg(required = false)</code>と記述するとオプション引数とすることができます。
変数に<code>private</code>をつけることもできます。その場合は、<code>setter,getter</code>を忘れずに用意しましょう。

- 宣言した変数に格納する(OnCreate内に記述)
 
```Java
FragmentArgs.inject(this)
```
上記のコードが<code>getArgments()</code>に相当し、<code>@Arg</code>のついた変数に代入します。

まとめると下記のようなコードになります。
※このとき、クラス名の前に<code>@FragmentWithArgs</code>をつけるのを忘れないようにしてください。

```Java:myFragment.java

@FragmentWithArgs
public class myFragment extends Fragment {

    @Arg
    String userName;

    @Arg
    int age;

    public myFragment() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FragmentArgs.inject(this);
    }

```

##Tips

### builderが自動で生成されない場合の対処
Gradleの記述が誤っている可能性があります。記述場所、記述内容(verなど)をもう一度確認してみましょう。
※aptとannotationParserの記述ミスに注意してください。

記述に誤りがない場合は、プロジェクトをクリーンすることで動作する場合もあります。
AndroidStudioの場合 :
[メニュー]→[build]→[clean Project]とすることでプロジェクトをクリーンできます。

### 値を渡す際の引数の順番
基本的にはFragment内で宣言した順番でコンストラクタが生成されます。builder内の引数の順番とFragment内にある<code>Arg</code>のついた変数の順番を一致させるようにしましょう。

なぜか私のコードは順番がバラバラで構築されるので原因を調査中です。。

### DialogFragmentを利用する場合
DialogFragmentを継承したクラスに値を渡したいときは<code>FragmentArgs.inject(this)</code>を<code>OnCreateDialog()</code>内に記述します。
thisはactivityを渡すので、必要に応じて<code>this</code>を<code>getActivity()</code>に書き換えてください。
【Laravel】ローカルで開発中のページをスマホでも見る


Laravelで開発中にスマホでも見たくなったときは

```
php artisan serve --host 0.0.0.0
```

としてサーバーをたてれば、`[PCのIPアドレス]:8000` でスマホからでも見れる。

## 注意点

PC・スマホで使うwifiを同じにすること。

## IPアドレス確認方法（Mac）

システム環境設定 > ネットワーク

## おまけ：artisanコマンドのオプション

![Screen Shot 2018-01-12 at 17.49.45.png](https://qiita-image-store.s3.amazonaws.com/0/109241/31059f69-49f6-1246-ebb9-fad66f1a579d.png "Screen Shot 2018-01-12 at 17.49.45.png")
AWS EC2のUbuntuにWindowsからリモートデスクトップで接続し、Ganacheを起動する手順

やりたいことはこちら

* AWS EC2のUbuntu 16.04に、ローカルのWindows 7からリモートデスクトップで接続する
* Ganacheを起動する

参考: https://aws.amazon.com/jp/premiumsupport/knowledge-center/connect-to-ubuntu-1604-windows/

まずは、Ubuntuでリモートデスクトップが使えるように設定していきます

# EC2インスタンスの設定
TeraTerm等のターミナルからインスタンスにSSH接続して設定をします

## パスワードでログインできるように設定

```
$ sudo vi /etc/ssh/sshd_config 

---------
# 以下のように編集
PasswordAuthentication no
　↓
PasswordAuthentication yes
---------

# ssh再起動
$ sudo /etc/init.d/ssh restart

# リモートデスクトップのログインに使うパスワードを設定します
# 推測されやすいものにしないように注意
$ sudo passwd ubuntu
```

## デスクトップ表示に必要なパッケージをインストール
```
$ sudo apt install xrdp xfce4 xfce4-goodies tightvncserver

# いろいろ設定を変更
$ echo xfce4-session> /home/ubuntu/.xsession
$ sudo cp /home/ubuntu/.xsession /etc/skel

$ sudo vi /etc/xrdp/xrdp.ini

# 以下のように編集
---------
 [xrdp1]
port=-1
　↓
 [xrdp1]
port=ask-1
---------

$ sudo vi /etc/xrdp/startwm.sh

# 以下のように編集
---------
. /etc/X11/Xsession
　↓
startxfce4
#. /etc/X11/Xsession
---------

# xrdp再起動
$ sudo service xrdp restart
```
## EC2コンソールでポートを開放
RDPポートを開放するために、AWSのEC2コンソールを表示してセキュリティグループの設定を変更します。
開放するポート番号は 3389 です。

インスタンスを選択し、セキュリティグループをクリックします。
「インバウンド」を以下のように編集し、3389ポートでアクセスできるようにします。
![WS000299.JPG](https://qiita-image-store.s3.amazonaws.com/0/113316/2fe9fbea-d9b4-80da-e2fa-eddc0f47b5ec.jpeg)


<br/>
ここまででインスタンスの設定は終わりになります。

## リモートデスクトップで接続しましょう
ここからはWindows 7で操作していきます

リモートデスクトップでインスタンスに接続します
![WS000298.JPG](https://qiita-image-store.s3.amazonaws.com/0/113316/f3ce500a-699f-d07c-6d6d-f3065821f010.jpeg)

usernameはubuntu、パスワードは先ほど設定したものを入力します
ポート番号は-1のままで、OKを押します
![WS000293.JPG](https://qiita-image-store.s3.amazonaws.com/0/113316/7e3237e3-b207-dae0-4e45-54133e0fb75c.jpeg)

デスクトップが表示されました！
![WS000294.JPG](https://qiita-image-store.s3.amazonaws.com/0/113316/f626377d-8483-b46d-66bd-d2d8e3758323.jpeg)



# せっかくなのでアプリケーションを起動してみます
ここからは、リモートデスクトップで操作していきます
GanacheというEthereumのウォレットを起動してみることにします

ブラウザを起動し、Ganacheをダウンロードします
http://truffleframework.com/ganache/
![WS000295.JPG](https://qiita-image-store.s3.amazonaws.com/0/113316/6116b5bc-44a0-c543-59c9-e55b5853ec71.jpeg)

ターミナルを開き、実行権限を付与しておきます

```
chmod a+x ~/Downloads/ganache-1.0.2-x86_64.AppImage
```

ファイルマネージャで、ファイルをダブルクリックします
![WS000296.JPG](https://qiita-image-store.s3.amazonaws.com/0/113316/41f44c32-c6b0-2356-7ee7-81e28ae7b905.jpeg)

Ganacheが起動しました
![WS000297.JPG](https://qiita-image-store.s3.amazonaws.com/0/113316/f99ebe33-f68e-f739-6e4e-a06a2d472b8b.jpeg)


---

ここまで、以下の手順についての説明でした。

* AWS EC2のUbuntu 16.04に、ローカルのWindows 7からリモートデスクトップで接続する
* Ganacheを起動する
UbuntuでPythonをソースからインストール

Python 3.8 が公開されました。Ubuntu 18.04 の場合、Python 3.8 のパッケージが用意されることはないので、Ubuntu の LTS で Python 3.8 を使おうとしたら来年の4月に公開される Ubuntu 20.04 まで待つ必要があります。
 
Python の場合は、それほどバージョンアップを急ぐ必要はないのですが、テスト等のために Ubuntu 18.04 で Python 3.8 を利用しようと思ったら、最も基本的なインストールの方法はソースを python.org からダウンロードしてきて自分でコンパイルすることです。それ以外には、データサイエンス系であれば Anaconda がお勧めですが、使えるようになるまでにはかなり時間が必要です。また、ppa の [deadsnakes](https://launchpad.net/~deadsnakes/+archive/ubuntu/ppa) を使ってインストールする方法もあります。

## ソースからビルドする場合の基本

[公式マニュアル](https://docs.python.jp/3/using/unix.html)によると、基本的には、ソースをダウンロードしてきて、普通にビルドをしてインストールできるとなっています。

```bash
./configure
make
sudo make install
```
また、警告があって「make install は python3 バイナリを上書きまたはリンクを破壊してしまうかもしれません。そのため、make install の代わりに exec_prefix/bin/pythonversion のみインストールする make altinstall が推奨されています。」と記載されています。したがって、基本的にはコマンドは以下のようになります。

```bash
./configure
make
sudo make altinstall
```

Ubuntuの場合は、既定でインストールすると`usr/local`にインストールされるので上書きまたはリンクの破壊はされませんが、PATHの優先順位の関係で、`python3`コマンドで python3.8 が起動するようになります。間違った場合には、慌てずに`/usr/local/bin`ディレクトリにある`python3`を削除すればいいだけです。ついでに`2to3`, `idle3`, `pip3`, `pydoc3`, `pyvenv`を削除すると`make altinstall`をしたのと同じになります。

## 実際の操作

#### 依存関係のインストール
build-essentialパッケージを使って基本的な開発ツールをインストールし、その他の不足している依存関係をインストールします。`tk-dev`は、サーバーでは普通は`tk`を使わないで省いています。もし、PC の場合やサーバーに GUI をインストールしていて`tk`を使う場合は、`tk-dev`を追加するようにします。

```bash
sudo apt update
sudo apt install build-essential
sudo apt install libreadline-dev libncursesw5-dev libssl-dev libsqlite3-dev libgdbm-dev libbz2-dev liblzma-dev zlib1g-dev uuid-dev libffi-dev libdb-dev
```

#### Pythonをダウンロードしてインストールするまで
```bash
wget https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tar.xz
tar -xf Python-3.8.0.tar.xz
cd Python-3.8.0
./configure --enable-optimizations
make -s -j4
sudo make altinstall
```
`configure` で `--enable-optimizations`オプションを付けているのは、`./configure`を実行するとそういうメッセージが出るためです。これをつけると処理が若干速くなりますが、`make`の時にテストが走るので高速なPCで5分ぐらいかかります。Python 3.7 の場合はテスト項目が多く20分ぐらいかかっていたのでかなり面倒でしたが、Python 3.7 の場合は高速なPCを使っているのであれば付けた方がいいと思います。

makeのjオプションは、コンパイルするときに使用するコアの数を指定するもので、-j4とすると4コアを使用するようになります。jオプションを付けないと1コアだけしか使わないのでコンパイル時間が短くなります。

Ubuntu 18.04 の Python 3.6 は、gcc 8.3 でコンパイルされていますが、Python 3.8 も、gcc 8.3 でコンパイルすることができます。gcc 8.3 でコンパイルしたい時は、`build-essential`に追加して`gcc-8`をインストールして

```
sudo apt install gcc-8
```
それから。./configure に CC オプションで gcc-8 の指定を追加すればできます。

```
./configure --enable-optimizations CC=gcc-8
```

試してみましたが処理速度としてはあまり速くならなかったです。

また、configureを実行するときに--prefixオプションを設定することでインストール先を変更することができます。例えば、ルート権限がない場合には、次のようにすれば、ホームディレクトリーにインストールできます。Ubuntuの場合には、デフォルトで`~/.local/bin`にPATHが通っているので、インストール後すぐに`python3.8`で利用できりようになります。

```bash
./configure --prefix=$HOME/.local --enable-optimizations
make -s -j2
make altinstall
```
Atom で別paneを開いてそこに、画像を出力する。

# 概要

Atom 上で、`cwl` について `cwltool` で画像を出力して別paneに出力する機能をつくりたかったので、その時のメモ。

つくったもの

* Atom package [atom-cwl-viewer](https://atom.io/packages/atom-cwl-viewer) 
* GitHub [manabuishii/atom-cwl-viewer: Atom cwl viewer](https://github.com/manabuishii/atom-cwl-viewer)

# まとめ

いくつか参考になるサイトがあった。

## Atom で別paneで開く

下で紹介する、ハンズオンの資料が大変参考になりました。

## space-gen を使う場合

* [Atomプラグイン作成入門 ハンズオン形式でプレビュー型プラグインを作ってみよう！ - Qiita](https://qiita.com/geek_duck/items/654919124d24fa74a0d3) 


## atom-space-pen-views を使う場合

* [markushedvall/plantuml-viewer: PlantUML Viewer package for Atom](https://github.com/markushedvall/plantuml-viewer) 

こちらも、コード量は少ない。
よみやすい。

## spawn とパイプ
spawn とパイプを使うときには多少注意が必要でそれについては、


* [Node.js の child_process でパイプ、リダイレクトなどを使う](https://ryuta46.com/145) 



## 未解決問題

### ライブアップデート

まだできていない。
標準入力を `cwltool` に渡す方法について、未解決

`/dev/stdin` から渡してみたが、どうも `--basedir` が意図通りに動かず。
このあたりは、おいおい考える。

### copy ができない。

参考にした `plantuml` でも同じ問題があるようで、未だ未解決

* [Uncaught Error: Could not call remote function ``. Check that the function signature is correct. ... · Issue #19 · peele/plantuml-preview](https://github.com/peele/plantuml-preview/issues/19)