OmniAICreator/Qiita-1.07M huggingface dataset:
WidnowsにNode.jsをインストールする方法

# Node.jsとはなにか？

* 概要
- 大量のリクエストを高速にさばくためのサーバ側のJavaScript
- 非同期(I/Oの結果を待たないノンブロッキング処理、I/O処理が完了したらコールバック通知を実行する)
- シングルスレッド

（詳細は [Node.js を5分で大雑把に理解する][1] を参照）


* 公式サイト
- https://nodejs.org/en/

* 必要な知識
- HTML/JavaScript

* 環境
- ローカル開発環境(Windows7/Rasbian)

# Node.jsのインストール

Node.jsにはWindows用のインストーラが存在する（しかも公式に配布されている）というのに、なぜ手動でインストールするのか？
会社のPCに~~勝手に~~勉強用で入れるつもりだからね…レジストリを汚したくなかったからさ。

+ [公式サイト][3]よりLTS版のWindows Binary (.zip)ファイルをダウンロードする
+ zipファイルを解凍したら中身を`C:\node\`の直下に全コピーする
+ 環境変数Pathにnode.exeを置いたフォルダのパスを設定しておく
+ 環境変数NODE_PATHを追加してnode_modulesのパスを登録する
+ コマンドプロンプトから`node -v`を叩いてバージョンが表示されれば完了

（[WidnowsにNode.jsをインストールする方法][3] を参照）



[1]: http://qiita.com/hshimo/items/1ecb7ed1b567aacbe559
[2]: http://d.hatena.ne.jp/eel3/20140309/1394294944
[3]: https://nodejs.org/en/
[sbt]multi project(module)構成でテスト実行時、ミドルウェア(DBなど)の立ち上がりを待つ方法

## ユースケース

* sbtでマルチプロジェクト構成
* rootプロジェクトで全プロジェクトのテストを一括実行している
* すべてのプロジェクトのテストの実行があるミドルウェアに依存している
    * 1例: DBと実際に接続してテストを実行している
* テスト実行時、ミドルウェアが起動していなければ起動させたい

## 解決策

sbtのカスタムタスク定義とタスクの依存関係の宣言を利用する。

```scala
//--------------------------------//
//       カスタムタスク定義          //
//--------------------------------//

val waitMiddlewareBoot = taskKey[Unit](
  "boot middlewares and wait warms up if no runs"
)

waitMiddlewareBoot in Global := {
  import scala.sys.process.Process
  if (Process("docker-compose ps -q").!!.length == 0) {
    Process("docker-compose up -d").!
    Thread.sleep(10 * 1000L)
  }
}


//--------------------------------//
//     全プロジェクト共通設定         //
//--------------------------------//

lazy val baseSettings = Seq(
  test in Test := (test in Test).dependsOn(waitMiddlewareBoot in Global).value
)


//--------------------------------//
//       個別プロジェクト設定        //
//--------------------------------//

lazy val project1 = project.
  settings(baseSettings).
  settings(...)

lazy val project2 = project.
  settings(baseSettings).
  settings(...)
```

## 解説

ミドルウェアの起動を待つカスタムタスク`waitMiddlewareBoot`を個別のプロジェクトではなくGlobalスコープで1つだけ定義することと、すべての個別プロジェクトの`test in Test`タスクに`waitMiddlewareBoot`への依存を宣言することが鍵。
rootプロジェクトでtestを実行するとき、`waitMiddlewareBoot`への依存が何度も出てくるがsbtがタスク実行を1回のみに最適化してくれるので`waitMiddlewareBoot`の実行は1回のみに抑えられる。

## 蛇足

この正解に行き着くまでかなり苦労した。
rootプロジェクトだけで `test in Test := (test in Test).dependsOn(waitMiddlewareBoot in Global).value` を宣言しても、ミドルウェアの起動と個別プロジェクトのtest間に依存関係がないためそれらが平行実行されてしまい、ミドルウェアの起動前・起動中もテストが走ってしまった。
次に全プロジェクトで`waitMiddlewareBoot`を定義したときは、個別プロジェクト数分`waitMiddlewareBoot`が実行されてしまいこれも失敗だった。

ほんとsbt難しい。
プロダクト改善のためのデータ分析入門 プロダクトをより良くするためのデータの活かし方 / 2017年9月27日

#はじめに
2017年9月27日に行われたサポーターズCoLab勉強会『Gunosyが贈るプロダクト改善のためのデータ分析入門プロダクトをより良くするためのデータの活かし方』の簡単な勉強会メモになります。

今回の勉強会では、Gunosyがどのようにデータをプロダクト改善に活かしているのかをニュースアプリ「グノシー」での実例を混じえながらお話いただきました。Gunosyはデータとアルゴリズムをもってあらゆる課題解決に取り組む会社であり、データ分析に基づいたプロダクト開発のための環境が整っている旨が熱量をもって伝わってきました。

講師紹介
株式会社Gunosy 開発本部データ分析部
石塚淳　@ij_spitz


#データ分析タスク

>施策分析
数値計画の作成、計画通りに進んでいるかの可視化
計画との差分埋めや上振れを作るための施策立案
施策実施と結果計測、次の施策に繋げる
　
>ロジック開発
ユーザが満足するコンテンツに出会わせるのが目的
ユーザの「満足度」とは？どうで会わせるか？
満足度の定義と満足度を向上させるマッチングアルゴリズムの開発


Gunosyの使用技術
>サービス側
Go：API
PythonとScala：コンテンツ収集、推薦、分析
Rails：管理画面　
全サービスでAWSを使用  
分析側
Redash：定常的な可視化
Django、Jupyter Notebook：アドホックな分析
データ収集：確定値ログ基盤、速報値ログ基盤



例えば、アプリのRP(継続率）を高めるために記事閲覧数が向上するような記事選定ロジックをCTR（クリック率）重視で施策したりする。

また、コストやリスクを最短最小限にして検証するために手動運用や簡単なif文による実装で仮説を検証している。仮説が検証されれば、自動化と大規模反映してより正確に検証する。

Gunosyではデータ分析に基づいた意思決定を非常に重要視しているが、ニュースアプリであるため、時流や季節要因などの影響を受けやく、データに予期しないノイズが乗り、計測が困難になることもある。

できるだけ施策効果を正確に計測するために、Gunosyではインフラ環境も含めて、1日20以上のABテストを走らせている。


下記は本講義でご紹介いただいたブログになりまして、より深い知見を得ることができる良質な記事で溢れています。


[海外の有名IT企業ABテストブログまとめ](http://data.gunosy.io/entry/2016/08/09/100000)
[Gunosyデータ分析ブログ](http://data.gunosy.io/)
[Gunosyテックブログ](http://gunosy.github.io/)
Springでprofileアノテーションによるbeanの切り替え

springのprofileの仕組みを利用して、動的にインジェクトされるbeanを切り替える。

とりあえず適当なspring-bootプロジェクトを作る。

```xml:pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>hoge</groupId>
	<artifactId>springbootexpr2</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springbootexpr2</name>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.7.RELEASE</version>
	</parent>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
	</dependencies>
</project>
```

適当なinterfaceを作成し、これの実装クラスをいくつか作る。

```java
public interface ProfileSample {
	String getValue();
}
```

```java
@Component
@Profile("default")
public class DefaultProfile implements ProfileSample {

	public String getValue() {
		return "default";
	}

}
```

profileは未指定のデフォルト値は```default```になっている。そのため、profileアノテーションにその値を指定すると、profile未指定時にはこのクラスが使われる。

```java
@Component
@Profile("dev")
public class DevProfile implements ProfileSample {

	public String getValue() {
		return "dev";
	}

}
```

```java
@Component
@Profile("production")
public class ProductionProfile implements ProfileSample {

	public String getValue() {
		return "production";
	}

}
```

起動用のクラスに上で作成したinterfaceをインジェクションさせる。

```java
@Controller
@EnableAutoConfiguration
@ComponentScan
public class SampleController {

	@Autowired
	ProfileSample sample;

	@RequestMapping("/")
	@ResponseBody
	String home() {
		System.out.println(sample.getValue());
		return "Hello World!";
	}

	public static void main(String[] args) throws Exception {
		SpringApplication.run(SampleController.class, args);
	}
}
```

あとは```spring.profiles.active```プロパティをどこかで指定すればそのプロファイルが、未指定であれば上で触れたように```default```が、使用される。

プロファイルの指定はコマンドライン引数ではこんな感じ。

```
--spring.profiles.active=dev
```

プロパティファイル、例えば```application.yaml```で指定する場合はこんな感じ。

```yaml:application.yaml
spring.profiles.active: production
```

ちなみにプロパティ指定の方法は沢山あるのでその一覧と優先順位については https://docs.spring.io/spring-boot/docs/2.0.0.M4/reference/htmlsingle/#boot-features-external-config

なお、この例程度の内容なら、interfeceのデフォルトメソッドで十分だったりする。
iOS11のSafariでSVGが崩れてしまう原因

# はじめに

つい先日iOS11がリリースされ、世の中のweb屋さんはデバッグに勤しんでいると思います。

そんな中、iOS11のsafariのみでSVGが崩れるの発見したので解決方法を書いていきます

# バグの内容

SVGアイコンをtransformを利用しアニメーションさせたりしているのですが、そのアニメーションがおかしい。

どうおかしいかというと、位置がずれたりする。

わけがわからない。

位置がずれるということは、何か座標計算がおかしいのかと疑いひたすらデバッグしてたら発見しました。

# バグの原因

原因は`transform-box`の初期値が、iOS11のSafariは`view-box`が指定されているため。

[https://developer.mozilla.org/ja/docs/Web/CSS/transform-box](https://developer.mozilla.org/ja/docs/Web/CSS/transform-box)

MDNを見ると`view-box`の説明はこう書かれている。

> 参照ボックスとして、直近の SVG を使用する。SVG ビューポートに viewBox 属性が指定されていた場合、参照ボックスは viewBox 属性によって設定された座標系の原点に配置されます。また、参照ボックスの寸法は viewBox 属性の幅と高さの値に設定されています。

つまり、座標計算がSVGを使用して計算されてしまう。

対策は`transform-box`に`fill-box`を指定すること解決します。

これで、iOS11のSafariはiOS10のSafariと同じ位置計算になります（ハッピーエンド

# 終わりに

もしかしたら、SVGの書き方がオカシイ説もありますが助けになったら幸いです。
SRE本まとめ（2章 SRE的Google本番環境）

自分の理解を深めるためにまとめてみました。[1章](https://qiita.com/bassbone/items/dd170b1c2e3adcc5bba3)の続きです。

## 2章 SRE的Google本番環境

### Google独自のインフラ基盤
- Borg：k8sの前身。リソースの割り当てを行う。
- Jupiter：内部ネットワーク。これによりデータセンタ内のどのサーバ間でも同じネットワーク転送速度を実現できる。
- Colossus：GFS（HDFSの前身）の後継。クラスタに向いたファイルシステム。
- Bigtable：NoSQLデータベース。数ペタのデータも扱える。
- Spanner：SQLに似たインターフェースを持つデータストア。
- GSLB：Global Software-Load Balancer。場所別／サービス別／RPC別の負荷分散を実現。
- Chubby：ロックサービス。Paxosプロトコルを使用。
- Borgman：モニタリングプログラム。
- Stubby：RPC。gRPCとしてOSS化。
- protocol buffers：RPC間のデータのやりとりに使われる。ApacheのThriftに似ている。

### Googleの開発環境
単一の共有リポジトリを使用。CL（変更リスト）に対してレビューを受けてメインラインに投入する。レビューは必ず受けなければならない。ビルドサーバにビルドをリクエストし、テスト実行後にリリースされる。

（[3章](https://qiita.com/bassbone/items/756ef8b4769ceb0ee000)に続く）
FizzBuzzクイズの実装例(groovy)

問題と、ruby による実装例は
https://qiita.com/sumim/items/f26902f2b813c075a619

で。


なんとなく、Groovy なら行けるかもと思って実装してみた。

```groovy
def val( int x ){  x }
def val( String x ){ x.val() }

def stringof( int x ){ "" }
def stringof( String x ){ x }

[
  ["fizz", "Fizz", {x->x%3==0}],
  ["buzz", "Buzz", {x->x%5==0}],
  ["pezz", "Pezz", {x->x%7==0}],
  ["hozz", "Aho", {x->x.toString().contains("3")}],
].each{ o->
  this.metaClass."${o[0]}" = { x->
    if ( o[2](val(x)) ){
      r=stringof(x)+o[1]
      r.metaClass.val{ return val(x) }
      return r
    } else {
      return x
    }
  }
}

println( fizz(buzz(1) )) //=> 1
println( fizz(buzz(pezz(3*5*7) ))) //=> PezzBuzzFizz
println( fizz(hozz(3) )) //=> AhoFizz
```

やっぱり書けた。さすが Groovy。

* メソッドの動的定義
* 特異メソッド

という辺りは拙実装の ruby 版( https://qiita.com/Nabetani/items/9c477fd222412f11e29b )と同じだけど、

* 引数の型によるメソッドの呼び分け

という辺りは Groovy ならではの技。頼もしい。

DRY でしょ？

追記。
`buzz(fizz(123))` 形式ではなく、 `123.fizz.buzz` 形式にも対応したバージョンを実装した。


```groovy
def val( int x ){  x }
def val( String x ){ x.val() }

def stringof( int x ){  "" }
def stringof( String x ){  x }

[
  ["fizz", "Fizz", {x->x%3==0}],
  ["buzz", "Buzz", {x->x%5==0}],
  ["pezz", "Pezz", {x->x%7==0}],
  ["hozz", "Aho", {x->x.toString().contains("3")}],
].each{ o->
  Object.metaClass["get"+o[0]] = { ->"${o[0]}"(delegate) }
  this.metaClass."${o[0]}" = { x->
    if ( o[2](val(x)) ){
      r=stringof(x)+o[1]
      r.metaClass.val{ return val(x) }
      return r
    } else {
      return x
    }
  }
}

println( 1.buzz.fizz ) //=> 1
println( (3*5*7).fizz.buzz.pezz ) //=> FizzBuzzPezz
println( 31.fizz.buzz.pezz.hozz ) //=> Aho
println( 33.fizz.buzz.pezz.hozz ) //=> FizzAho
println( 63.fizz.buzz.pezz.hozz ) //=> FizzPezzAho
println( 3.hozz.pezz ) // => Aho
```

`Object` にメソッドを追加することで `Integer` と `String` の両方に対応するというやや鬼畜の所業に出てみた。

Groovy の文字列は Java の文字列なので、同じ値は同じインスタンスになりがち。メソッドを生やすと同じ値の文字列はそのことを憶えていたりするのかなとも思ったけど、そうでもない感じだった。なんでだろ。
wysiwygエディタについての学習7


## draft-jsを使ってみる続き

### ContentBlock

https://draftjs.org/docs/api-reference-content-block.html#content

以下を含む、単一ブロックの不変レコード

* プレーンテキスト
* 型、段落、ヘッダー、リスト
* エンティティ、インラインスタイル、深さ

ContentStateにはContentBlockの注文マップが含まれていて、
それと合わせてエディタの全内容を構成している

### スタイルとエンティティの表現

characterListにはcharacterMetaDataのリストが保持される
以下によりメモリフットプリントへの影響を抑えて編集機能を提供できる

* 不変のメタデータ
* データ永続性

メモリフットプリントとは - IT用語辞典 Weblio辞書
http://www.weblio.jp/content/%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%95%E3%83%83%E3%83%88%E3%83%97%E3%83%AA%E3%83%B3%E3%83%88

インラインスタイルとエンティティを一緒にしてエンコード（コード化）することで、
contentBlockでの編集の関数は単一のリストオブジェクトに対してのみ操作すれば良い

	イミュータブルにすると速度面で壁を突破できるってことか。まだよくわかってないが面白い。
	単一のオブジェクトのみを対象にできるのはメリットか、、
	ただ、そのコードを走査する必要があるけど、その辺はメリットの方が大きいんだろうな。
	どういうイメージを持てばいいのか。

	細かいプロパティの説明は省略。

* Recordはimmutable-jsの方の用語なのね
	* http://facebook.github.io/immutable-js/docs/#/Record/Record

### CharacterMetadata

https://draftjs.org/docs/api-reference-character-metadata.html

単一文字のインラインスタイルとエンティティを表す不変レコード
characterMetadataは激しくプールされ、共有される
２つの単一文字が、エンティティとインラインスタイルが同じ場合には、同じcharacterMetadataとなる
これにより、使っている文の必要な組み合わせで済むので、メモリフットプリントを節約できる

	うーん、なるほど。。グラデーション的なこととかしたらリソース消費激しいってことかな。

このためには、プールを必ず利用するように実装しておく必要がありますが、
コアの処理で実装済みで意識することはありません
ただ、getterメソッドはレンダリング時に便利です

	細かいプロパティの説明は省略。

### Entity（モジュール）

https://draftjs.org/docs/api-reference-entity.html#content

メタデータでテキストを装飾する情報を保持するエンティティオブジェクトを管理するAPIを含むモジュール
また、単一のストアを持ち、エンティティデータを保持できる

高度な利用方法は別途の記事に記載される
https://draftjs.org/docs/advanced-topics-entities.html

モジュールから作成されるエンティティオブジェクトは、DraftEntityInstance不変レコードとして表される
このインスタンスはシンプルな参照のメソッドを持つ

	細かいプロパティの説明は省略。
Angular4 : Failed to execute 'setAttribute' on 'Element

## ある日突然こんなバグに遭遇した

```
ERROR Error: Uncaught (in promise): InvalidCharacterError: Failed to execute 'setAttribute' on 'Element': '(' is not a valid attribute name.
Error: Failed to execute 'setAttribute' on 'Element': '(' is not a valid attribute name.
    at EmulatedEncapsulationDomRenderer2.webpackJsonp.../../../platform-browser/@angular/platform-browser.es5.js.DefaultDomRenderer2.setAttribute (platform-browser.es5.js:2853)
    at DebugRenderer2.webpackJsonp.../../../core/@angular/core.es5.js.DebugRenderer2.setAttribute (core.es5.js:13376)
    at createElement (core.es5.js:9371)
    at createViewNodes (core.es5.js:12044)
...
```

コンソール出力はこれだけ。色々調べてみたけど、それっぽい記事が出てこない。コンソールに情報が０なのでデバックにかなりの時間を費やした。

## 結論

環境によって理由は様々だろうが、私が上記のエラーにハマった理由はこれだった。

```typescript
<div class="card-block" ( click )="siteSelected( site );">
```
イベントバインドの両サイドの空白、、、本当にしょうもないミスだったけど、全くデバックできなかったので教訓としてメモしておきます、、、
HTMLページ内フル画面のiframe

#概要
余白なし、枠なしの縦も横も100%目いっぱいのiframeをつくりたい
# 2021年10月：JavaScriptを使わない書き方に変更
４年ぶりくらいに更新します。

##新・デモ
フル画面
https://codepen.io/tsunet111/full/BadjVKJ
CodePen
https://codepen.io/tsunet111/pen/BadjVKJ

##新・コード

```html
<div class="container">
<iframe src="iframecontent.html"></iframe>
</div>

```

```css
* {
  margin: 0;
  padding: 0;
  overflow: hidden;
  height:100vh;
}

iframe {
  border:none;
  width:100%;
  height:100%;
}
```

# 以下は旧バージョンです。
##デモ
フル画面
https://codepen.io/tsunet111/full/WNvzKWz
CodePen
https://codepen.io/tsunet111/pen/WNvzKWz

##コード

```html
<div class="container">
<iframe src="iframecontent.html" width="100%" height="100%"></iframe>
</div>

```

```css
* {
  margin: 0;
  padding: 0;
  border: 0;
  overflow: hidden;
}

iframe {
  border:none;
  width:100%;
  height:100%;
}
```

```js
$(window).on('load resize',function(){
    $('.container').css('width',  $(window).width());
    $('.container').css('height',  $(window).height());
});
```

jQueryを使用しています。
Django + nginx + uwsgi でMySQLを使う

Django + nginx + uwsgi で動くアプリでMySQLを使うようにします。
Djangoチュートリアルに沿ってやります。

Django + nginx + uwsgi を動かすまではこちら。
https://qiita.com/lemmy/items/c0b2eac14096e8eb1614

##Djangoのチュートリアル
https://docs.djangoproject.com/ja/1.11/intro/tutorial02/
Djangoのチュートリアルにそってmodels.pyをつくる。

完成したら、
`python manage.py makemigrations polls`
を実行する。

なにがしか変更点あった場合に認識してくれたり、
エラーがあるとおしえてくれたりする。

次に以下を実行すると、実行されるSQL文を吐いてくれる
`python manage.py sqlmigrate polls 0001`

そのなかに


```
CREATE TABLE `xxxxxx_xxxx_category` (`id` integer AUTO_INCREMENT NOT NULL 
PRIMARY KEY, `name` varchar(100) NOT NULL, `xxxx_category_id_id` integer NOT NULL);
```

xxxx_category_id_id ってなんやねん、と思ったが、
気にせずに

`python manage.py migrate`

してMySQLに入って

`show columns from xxxxxx_xxxx_category`
としたら

```
+-------------------+--------------+------+-----+---------+----------------+
| Field             | Type         | Null | Key | Default | Extra          |
+-------------------+--------------+------+-----+---------+----------------+
| id                | int(11)      | NO   | PRI | NULL    | auto_increment |
| name              | varchar(100) | NO   |     | NULL    |                |
| xxxx_category_id  | int(11)      | NO   | MUL | NULL    |                |
+-------------------+--------------+------+-----+---------+----------------+
```

となった。
どこかでALTER TABLEしてくれたのだろうか。。。

これでできたテーブルに対してadminモードを使うことができる。
僕がUnityを初めて気がついたこと[0]

僕がUnityを初めてから**気がついたこと**をメモしていきます。

# Prefab
Prefabはゲームオブジェクトの雛形のようなもの。
スクリプトから動的にゲームオブジェクトを生成するときにはPrefabを使うのが便利そう。

# Random.Range(x,y)
今までは

```C#
Random.Range(0,10); //0から10までの乱数を生成する
```

とか思ってたけど、

```C#
Random.Range(0,10); //0から9までの乱数を生成する
```
つまり`Random.Range()`はminからmax-1までの乱数を生成してくれる。
なぜか`float`の場合はminからmaxまでの乱数を生成する。
事情があるんだろうけど、謎w

# privateだけどUnityで初期値を設定したい
これは結構悩んだ場所。
メンバ変数をprivateにしたいけどUnityがわで初期値を設定したい・・・だけど・・・

そこで！

```Bullet.cs
public class Bullet : MonoBehaviour{
    [SerializeField]
    float angle;
    [SerializeField]
    float speed;
}
```
いちいち宣言の前に`[SerializeField]`を付けるのは面倒だけど、ないよりマシ。

# Start()の順番
これも結構ハマったところ。

```BulletManager.cs
public class BulletManager : MonoBehaviour{
    List<Bullet> bullets;

    void Start(){
        bullets = new List<Bullet>
    }

    public void Add(Vector3 pos){
        /*省略(((((((((((っ･ω･)っ ﾌﾞｰﾝ*/
    }
}
```

```GameManager.cs
public class GameManager{
    [SerializeField]
    BulletManager bulletManager;

    void Start(){
        bulletManager.Add(new Vector3(0,0,0));
    }
}
```
これで実行すると`ReferenceException`が発生！
どうやら`BulletManager`の`List`で発生しているらしい。

##原因

`BulletManager`の`Start()`で`List`を`new`で生成している。
そして`GameManager`の`Start()`で`BulletManager`の`Add()`を呼び出している。
`Add()`では`BulletManager`の`List`を使っている。

原因はこれを順番にしてみると分かる。

1. `GameManager`の`Start()`が呼び出されて`BulletManager`の`Add`が呼ばれる（ここでReferenceException）
2. `BulletManager`の`Start()`が呼び出され`List`が生成される。

つまり`BulletManager`の`Start()`で`List`が生成される前に`List`を参照する`Add()`が呼び出されてしまう。

##解決策
### 解決策1
解決策として`GameManager`の`Start()`より`BulletManager`の`Start()`を初めに呼び出して`List`を最初に生成させる。

### 解決策2
`BulletManager`の`List`の生成を`Awake()`関数で実行すれば`GameManager`の`Start()`よりも前に`List`が生成されるので解決できます。

参考：[イベント関数の実行順](https://docs.unity3d.com/jp/530/Manual/ExecutionOrder.html)

[ryo0ka](https://qiita.com/ryo0ka)さんありがとうございます！


解決策2のほうがUnity側で管理しなくてもいいので良さそうです。

### 方法
Unityで`Edit->Project Settings -> Script Execution Order`で`+`ボタンをクリックして`Start()`を呼び出したいクラスのtimeを短めにセットする。
How to Use LiBrow and LiLash Products in an Adequate Manner

If you are deliberately trying to beautify your eyelashes and eyebrow, then it is the time to shift to the amazing <a href="http://www.hairproductsonline.co.nz/shop/beauty/lilash-librow"><b>LiLash &amp; LiBrow NZ</b></a> products. LiLash &amp; LiBrow is a prominent brand for eyelash growth products that enhance your lashes and brows in the most perfect manner. If you are puzzled about the suitable usage of these products, then below mentioned are some guidelines which can help you:-

<b>How to Apply LiBrow Products</b>

Here are some how to use instructions which provide you the best application of your LiBrow eyebrow serum-

<ul>
<li>Apply it on dry and clean skin once in a day

</li>
<li>Take away the wand from and wipe all the overload serum off inside 

</li>
<li>Only use the unique brush for your Brow and apply a very small amount to the arch on the brow.

</li>
<li>One small stroke daily is enough 

</li>
<li>Make sure that you are applying LiBrow Serum directly to the skin

</li>
<li>Penetrate the serum through the skin to the base 

</li>
<li>Use it daily for at least 7-12 weeks. 
</li>
</ul>

<b>How to Apply LiLash </b>

Women love to have longer lashes but all good things take time; however with the most beneficial products of Lilash, you can achieve it quite quickly. Below is the most effective way of applying eyelash conditioning serum of <a href="http://www.hairproductsonline.co.nz/shop/lilash"><b>LiLash NZ</b></a>:-

<ul>
<li>Apply it directly to the upper eyelid skin. Whenever you apply it, swap the direction of the stroke from inner to outer 

</li>
<li>Let the serum dry for 2-3 minutes before applying any other any cosmetics

</li>
<li>Use every day for 7-12 weeks. 

</li>
<li>Once you have achieved eyelashes of desired length, you can use LiLash 1-3 times per week as a maintenance measure.

</li>
</ul>

Aforementioned tips can help you reap desired results in the minimum possible time. Now, another thing which can bother you is the dilemma regarding correct choice of shop to purchase the most authentic LiLash &amp; LiBrow NZ products. Hair Plus can be the perfect destination for your requirements. It is an online retail shop which exclusively offers top-notch beauty products of leading brands. Whether you are looking for the finest quality eye lashes or a top of the line shampoo, this site perfectly satisfies your requirements. All the products available here are 100% authentic and available at market leading prices.

<b>About Hair Plus:</b>

Hair Plus is a leading web retailer in New Zealand for unparalleled range of beauty products from trusted brands like <a href="http://www.hairproductsonline.co.nz/shop/beauty/lilash-librow"><b>LiBrow NZ</b></a>.

For more information, visit <a href="http://www.hairproductsonline.co.nz/shop/lilash"><b>Hairproductsonline.co.nz</b></a><b>.</b><br><br>
ダンプしたレコードを特定の件数毎にトランザクションで囲って処理する

すっごくニッチな要件とは思いますが、やってみたのでメモ。


# TL;DR

- INSERT限定
- `skip-extended-insert` でレコード毎のINSERT文を作る
- awk で begin と commit を挟み込む


# 環境

- mysql5.6互換サービス
    - 某クラウドのアレですが、mysql全般できると思う。
- 操作環境はlinux、bashなら多分どこでも行けるはず。


# 経緯

- 最近新しく開始したサービスでログテーブルのパーティションとインデックスの作り方を間違えた。
    - 気づいたときには1.5億レコード。。。
    - インデックスはオンラインでも変更できるけどパーティションはちょっとかなり無理
- [PERCONA toolkit](https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html) のスクリプト使うとオンラインで修正行けるんじゃ....？
    - パーティションの数がひどいことになっていて `alter table ... rename` が固まる。
        - 5分かかるとかオンライン更新じゃないですねこれ
- テーブル差し替えはメンテ入れるとして、データ移行は先に済ませておきたい。
    - ptのSQLを参考にパーティションとかインデックス整えた別テーブル作成して、元テーブルからトリガーで流し込む
    - 差分のデータは元テーブルからダンプして流し込む必要あり
- 途中でコケたりした場合にリトライしやすいように、id順かつ1レコードずつINSERTするようにした。
    - O・SO・I！！
    - トランザクションって偉大ですね　←　結論ここ


# やった処理

mysqldumpの内容を加工して、mysqlコマンドに流し込むSQLを作成した。

## 遅かった処理

1行ずつ書き込むようにしたバージョン。
テーブル構成次第だけどmysqlに流し込む時に毎秒200レコード程度しか処理できない → 全行登録に75万秒(9日近く)かかる。
実際はボリュームあったのでid帯で分割したけど概ねこんなイメージ

```bash
DB=hoge
TABLE=foo
mysqldump --skip-extended-insert --order-by-primary $DB $TABLE --where='id < 123456789' \
  | egrep '^INSERT' \
  | perl -ple "s/\`$TABLE\`/\`__${TABLE}__\`/g" \    # 別名テーブルは __[table]__ の名前で作った
  | gzip > table.dump

# 後で↓で流し込む
zcat table.dump | mysql 
```

## 修正版

指定行数毎にトランザクションで囲うと一気に速度上がった。
リニアには伸びないけど、100件単位投げ込んで10倍程度の速さ。

```bash
DB=hoge
TABLE=foo
(
  echo 'begin;'
  (
    mysqldump --skip-extended-insert --order-by-primary $DB $TABLE --where='id < 123456789' \
      | egrep '^INSERT' \
      | perl -ple "s/\`$TABLE\`/\`__${TABLE}__\`/g" \    # 別名テーブルは __[table]__ の名前で作った
  ) | awk '(NR%100==0){$0=$0"\ncommit;\nbegin;"}{print}' # 100行毎にcommitしてまたbeginで開始
  echo 'commit;'
) | gzip > table.dump

# 後で↓で流し込む
zcat table.dump | mysql 
```

これで75000秒(1日弱)まで縮まった。


# 注意事項

ログだからINSERTだけで処理できたのでまとめられたけど、UPDATEやDELETEみたく既存レコードいじると
トランザクション = デッドロックの温床になりかねないので、その場合はおとなしく1行毎とか
インデックス値毎にやりましょう。


# おまけ

ダンプファイルを10ファイルずつ並行とか処理すると当然早いです。
最初の1レコード毎の処理でも速くなるけど、それでもDBの性能限界あったので(´・ω・｀)

awkとかまともに使ったことない、正規表現すらperl挟んでsed使わないこと多いけど、
この辺ちゃんと勉強した方が便利そうでした。
SQLLite3で使うコマンドメモ


忘れがちなので自分用にメモ


**SQLLite起動コマンド**
`sqlite3 db/development.sqlite3`


**テーブルのカラムを確認**
`PRAGMA TABLE_INFO(テーブル名);`

```console
$ sqlite3 db/development.sqlite3
	SQLite version 3.8.2 2013-12-06 14:53:30
	Enter ".help" for instructions
	Enter SQL statements terminated with a ";"
sqlite> PRAGMA TABLE_INFO(reviews);
	0|id|INTEGER|1||1
	1|book_id|integer|0||0
	2|body|text|0||0
	3|created_at|datetime|1||0
	4|updated_at|datetime|1||0
sqlite> 
```


**SQLLite停止コマンド**
`.exit`
[PHP] SplEnumが未だ実験的なので、JavaっぽいEnumクラスを作った

**2017/10/3追記**

大バグ修正しました。

---

**2017/10/2追記**

下記プログラムには大バグがあります。

親クラス内で定義したstaticなプロパティは、全子クラスで共有されています。

いやはや、面目ない。:fearful:

---

PHPにもEnum欲しいですよね。ね？

期待のSplEnumは、、、

http://php.net/manual/ja/intro.spl-types.php
> 警告
> この拡張モジュールは、 実験的 なものです。この拡張モジュールの動作・ 関数名・その他ドキュメントに書かれている事項は、予告なく、将来的な PHP のリリースにおいて変更される可能性があります。 このモジュールは自己責任で使用してください。

まだ実験中だった！！

仕方がないので、ついカッとなって作った。後悔はしていない。

# 何作ったのさ

すでに同案件多数ですが、

[PHP で簡易 Enum を実装する](https://qiita.com/yosugi/items/38c43723501b320330b3)
[PHPで簡易Enumを実装する](https://qiita.com/t_ishida/items/2e4d2aa31d69abfd48a5)


自分的にはこんなものが欲しかったです。

```php:
class Day
{
    const SUNDAY = new Day('日曜日', '市場');
    const MONDAY = new Day('月曜日', '風呂');
    const TUESDAY = new Day('火曜日', '入浴');
    // ...

    public function __constuct($label, $work) { /* ... */ }
    public function getLabel() { /* ... */ }
    public function getWork() { /* ... */ }
}


Day::SUNDAY->getLabel(); // ← 日曜日
Day::SUNDAY->getWork();  // ← 市場
```

`const`で`new`してますので、このコードは動きません。
いつかできるようになればいいな。。。




# 代替策

## ユースケース

こんな使い勝手のものにしてみました。
`const`の代わりに`static`メソッド呼び出しです。

```php:
Day::SUNDAY()->getLabel(); // ← 日曜日
Day::SUNDAY()->getWork();  // ← 市場
```

switch caseでも使えますよ。

```php:
function dayEnumTest(Day $day)
{
   switch($day) {
     case Day::MONDAY():
       echo 'Mondays are bad.';
       break;
     case Day::SATURDAY():
     case Day::SUNDAY():
       echo 'Weekends are best.';
       break;
     default:
       echo 'Midweek days are so-so.';
   }
}
```

## Enumの実装

Enumの実装は次のようになります。
オーバーライドした`initialize`メソッド内で、Enum的なものを初期化しています。

```php:
class Day extends \LAPL\Lang\PHPEnum
{
    protected static function initialize() {
        /* 第1引数が名前、第2引数がインスタンス */
        self::register('SUNDAY', new Day('日曜日', '市場'));
        self::register('MONDAY',  new Day('月曜日', 'お風呂'));
        self::register('TUESDAY', new Day('火曜日', '入浴'));
        // ...
    }
}
```


# 作ったもの

こちらにソースを置きました。
https://github.com/sengokyu/php-enum

さらに詳しい使い方はテストケースを見てください。
https://github.com/sengokyu/php-enum/blob/master/Tests/PHPEnumTests.php
JSON同士の比較はYAMLが良い - WEBツール(JS)で「JSON⇒YAML」変換時に完全なエスケープ戻しを目指す

## WEBツール

API等のデータのやり取りは主にJSONを利用しているが、人の目で見たり比較する時はYAMLが便利です。
YAMLはエスケープされた記号（改行＝「\n」等）をエスケープ前に戻したデータで表現ができるのがいいところですね。

**:point_right_tone3: そこで、JSON→YAML→そのまま比較するWEBツールを作りました。**
https://rawseq.github.io/json-diff/
変換機能は[js-yaml](https://github.com/nodeca/js-yaml),比較ツールは[monaco](https://github.com/Microsoft/monaco-editor)を利用しています。

既に他のWEBツールやLive Demoで体験済かもしれませんが、「エスケープ文字が戻らない場合があるのでは？」という不安を持っている方がいると思いますが、だまされたと思って一度使ってみてください。（そして戻らなければ教えてください＞＜；）

※Chrome推奨。monacoの仕様でA→Bの比較、Bの編集しかできません。(編集したBをJSONでコピーすることはできます)

## JavascriptでJSONからYAMLに変換する

Javascript上のJSON YAML変換は特殊記号類の変換がくせものです。
JSON-YAML変換は「js-yaml」以外にもいろいろあるのですが、特殊文字が含まれる場合に動作不良になるケースが見受けられました。その中でも一番有望に見えたのが「js-yaml」でした。

しかしながら、「js-yaml」でも理想の動作をしてくれない場合があります。
例えば:point_down_tone3:のJSONをYAMLに変換しようとすると

```json:JSONサンプル
{"data":"\u6539\u884c\uff1a\n\u30bf\u30d6\uff1a\t\n\u30b9\u30e9\u30c3\u30b7\u30e5\uff1a/\n\u30d0\u30c3\u30af\u30b9\u30e9\u30c3\u30b7\u30e5\uff1a\\\n\u30b7\u30f3\u30b0\u30eb\u30af\u30a9\u30fc\u30c8\uff1a'\n\u30c0\u30d6\u30eb\u30af\u30a9\u30fc\u30c8\uff1a\"\n\u30d0\u30c3\u30af\u30af\u30a9\u30fc\u30c8\uff1a`\n\u30c9\u30eb\u8a18\u53f7\uff1a$\n\u30a2\u30c3\u30c8\u30de\u30fc\u30af\uff1a@\n\u4e2d\u62ec\u5f27\uff1a{}\n\u30b3\u30ed\u30f3\uff1a:\n\u7d75\u6587\u5b57\uff1a\u270c\n\u591a\u91cd\u30a8\u30b9\u30b1\u30fc\u30d7\u3055\u308c\u305f\u30bf\u30d6\uff1a\\t"}
```

:point_down_tone3:こんな感じになります。

```yaml:js-yamlプレーンで変換したYAML
data: "改行：\nタブ：\t\nスラッシュ：/\nバックスラッシュ：\\\nシングルクォート：'\nダブルクォート：\"\nバッククォート：`\nドル記号：$\nアットマーク：@\n中括弧：{}\nコロン：:\n絵文字：✌\n多重エスケープされたタブ：\\t"
```

これではたとえ仕様上問題ないとしても、比較や目視では使えません。
そこで、修正を加えた後に変換したYAMLが:point_down_tone3:こちら

```yaml:js-yaml修正後のYAML
data: |-
  改行：
  タブ：	
  スラッシュ：/
  バックスラッシュ：\
  シングルクォート：'
  ダブルクォート："
  バッククォート：`
  ドル記号：$
  アットマーク：@
  中括弧：{}
  コロン：:
  絵文字：✌
  多重エスケープされたタブ：\t

```
きれいにエスケープが戻るようになりました。
js-yamlでエスケープが戻らなかった原因は「\t」タブコード。
YAML変換前にタブを別な任意文字に変換。変換後に任意文字から戻す処理を加えています。
多重エスケープのタブを除外しているので少し歪になっていますが、

```js:JSONからYAML変換（デコード版）
/**
 * JSON to YAML
 * @param string val 入力
 * @return string 出力
*/
function jtoy(val){
	try{
		return jsyaml.dump(
			JSON.parse(
				val
				.replace(/([^\\])\\t/g,"$1<<TAB>>")
				.replace(/([^\\])\\t/g,"$1<<TAB>>")
				.replace(/^\\t/g,"<<TAB>>")
			)
		).replace(/<<TAB>>/g,"\t");
	}catch(e){
		alert(e.message);
	}
}

```

## おまけ（YAML⇒JSON変換時の文字列エンコード）
JavascriptのJSONオブジェクトやMDNのポリフィルではUnicode文字列のエンコードがかからなかったので、つけてみました。

```js:エンコード

/**
 * YAML to JSON
 * @param string val 入力
 * @return string 出力
*/
function ytoj(val){
	try{
		return unicodeEscape(JSON.stringify(jsyaml.load(val)));
	}catch(e){
		alert(e.message);
	}
}

function unicodeEscape(str){
	var code, pref = {1: '\\x0', 2: '\\x', 3: '\\u0', 4: '\\u'};
	return str.replace(/[^\u0020-\u007e]/g, function(c) {
		return pref[(code = c.charCodeAt(0).toString(16)).length] + code;
	});
}

```
GAS から Slack に投稿するシンプルなコード(incoming webhooks)

GAS から Slack に投稿するコードです。 incoming webhooks を用いているので、GAS から Slack に一方向にしか送れません。

# GAS から Slack に投稿するコード

```js
function main() {
   postMessage('gas から　slack に投稿', 'https://hooks.slack.com incoming web hook のエンドポイント')
}

function postMessage(message, hookPoint) {
  var payload = {
    "text": message,
    "icon_emoji": ':sparkles:',
    "username": 'bot'
  }
  var options = {
    "method" : "POST",
    "payload" : JSON.stringify(payload),
    "headers": {
      "Content-type": "application/json",
    }
  }
  var response = UrlFetchApp.fetch(hookPoint, options);

  if (response.getResponseCode() == 200) {
    return response;
  }
  return false;
}
```

# 注意点
- payload は　`JSON.stringify(payload)` のように渡す必要があります。
- incoming webhooks の設定を行っている必要があります。以下から新規作成が可能です。
 - https://my.slack.com/services/new/incoming-webhook/
- GASの新規作成はこちら
 - https://script.google.com 

# 参考
- [Incoming Webhooks](https://api.slack.com/incoming-webhooks)
iOS 11ファイルAppにDocumentsフォルダを表示して他のアプリと共有する方法


<img width="659" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f383932302f65353036666465332d303363352d633266332d313436372d3662336536316533373766312e706e672.png" src="https://qiita-image-store.s3.amazonaws.com/0/8920/fb6d8009-4df7-b672-4a66-223c0fe4b289.png">


iOS 11から自動でインストールされているファイルアプリ(Files App)のサイドバーには`このiPhone/iPad内`(`On My iPhone/iPad`)という項目があります。
この場所に自分のアプリの`Documents`フォルダを表示し、他のアプリと共有させる方法です。

## Step.1

info.plist内に以下を追加し値を`YES`にします。

* [`UIFileSharingEnabled`](https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW20) (`Application supports iTunes file sharing`)
* [`LSSupportsOpeningDocumentsInPlace`](https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/uid/TP40009250-SW13) (`Supports opening documents in place`)

![Screen Shot 2017-09-28 at 21.29.15d.png](https://qiita-image-store.s3.amazonaws.com/0/8920/d166b1a0-2b8c-1e24-6eeb-9d8c0592c5f4.png)


## Step.2

`Documents`フォルダ内が空だとファイルアプリに表示されないので、適当にファイルを置きます。

```swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let fm = FileManager.default
        let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
        //let documentURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
        let filePath = documentsPath + "/myfile.txt"
        if !fm.fileExists(atPath: filePath) {
            fm.createFile(atPath: filePath, contents: nil, attributes: [:])
        }
    }
}
```

## 注意点 1

`LSSupportsOpeningDocumentsInPlace`を`YES`にすると、他のアプリからUIActivityControllerなどでファイルを受け取るときにAppDelegateの`application(_:open:options:)`が呼ばれます。もし、`application(_:open:sourceApplication:annotation:) deprecated in iOS 9`を使っていた場合は、この組み合わせでクラッシュするので`application(_:open:options:)`に移行しましょう。

また、[`LSSupportsOpeningDocumentsInPlace`](https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/uid/TP40009250-SW13)の説明にあるように共有などでコピーとして渡されていたURLを直接取りに行くようになるので、別途`Bookmarks` と `Security Scope`について処理する必要があります。

## 注意点 2

`Documents`フォルダ内に晒したくないファイルがある場合は、`Library`フォルダ直下の`Application Support`フォルダに移動させておきましょう。

```swift
let support = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first!
```

`Application Support`が存在しない場合はどうめい作成します。

`Application Support`フォルダはiCloud等でバックアップされますが、ユーザはiTunesアプリやファイルアプリから見ることができません。
iOS 10以降の`Core Data`もデフォルトで`Application Support`フォルダにデータを保存するようになりました。

ファイルアプリのサイドバーにはiCloud DriveやDropBoxなどがありますが、ここに表示させたい場合は`File Provider Extension`を適切に設定する必要があるようです。


## 参考

:link: [Working with the Files App in iOS 11](https://www.bignerdranch.com/blog/working-with-the-files-app-in-ios-11/)
:link: [Apple: File Provider](https://developer.apple.com/documentation/fileprovider#overview)
16進数を１０進数へ変換する計算式

# 16進数を10進数へ変換する計算式

16進数を10進数へ変換する関数などがあり、計算式について考えたことなどなかったが、

今回気になったので、描いてみた。

4E5F <- 左記16進数を変換します。

```math
4×16^3 ＋ E×16^2 ＋ 5×16^1 ＋ F×16^0 ＝ 20063(10進法)
```

上記のような感じ

これをコードにします。

Swift で書きました。

```
class HexDecimal {
    
    public func HexDecimal (hex: String) -> Int{
        
        var decimal = 0
        var place = hex.characters.count
        var isNotHex: Bool = false
        for str in hex.characters {
            place -= 1
            let hexStr = self.Hex(hex: String(str), place: place)
            if (hexStr == -1){
                isNotHex = true
                break
            }
            decimal += hexStr
        }
        if (isNotHex == true){
            return -1
        }
        return decimal
    }
    
    
    public func Hex( hex: String, place: Int ) -> Int {
        
        var hexNumber = 1
        
        for _ in 0..<place{
            hexNumber *= 16
        }
        let hexHum = self.HexNumber(hexStr: hex)
        if (hexHum == -1){
            return -1
        }
        return self.HexNumber(hexStr: hex) * hexNumber
    }
    
    public func HexNumber(hexStr: String) -> Int {
        
        switch hexStr {
        case "0":break
        case "1":break
        case "2":break
        case "3":break
        case "4":break
        case "5":break
        case "6":break
        case "7":break
        case "8":break
        case "9":break
        case "A":
            return 10
        case "a":
            return 10
        case "B":
            return 11
        case "b":
            return 11
        case "C":
            return 12
        case "c":
            return 12
        case "D":
            return 13
        case "d":
            return 13
        case "E":
            return 14
        case "e":
            return 14
        case "F":
            return 15
        case "f":
            return 15
        default:
            return -1
        }
        return Int(hexStr)!
    }
}
```

実行方法
```
print( ColorUtil().HexDecimal(hex: "4E5F"))
```

一応エラーハンドリングも書きました。

１６進数のみ対応で、対応外の文字が来た場合は-1を返します。

git hub gist:
https://gist.github.com/keisukeYamagishi/a0e87cfa4da899d92ae4dae9ebd77894

気になったので書いてみました

が、

実際はApple が作ったものの使い方を書きに記載しておく

https://developer.apple.com/documentation/swift/int/2924481-init

```
let x = Int("123")
// x == 123

let z = Int("07b", radix: 16) // １６進数変換
print (z) // z == 123 

```

こちらの方が間違いなく良い、
PythonでExcel(その2)


1年程前に書いた[PythonでExcel](https://qiita.com/fukuit/items/f28ae581cd199fc30e0b)を、pandasを使って書き換えてみます。

# pandasの準備

Anacondaで環境を構築している場合は、pandasはインストール済です。
そうでない場合も、PyPIで簡単にインストールできます。

# Excelのシートからデータを読み込む

このあたりの前フリについては、[一年前](https://qiita.com/fukuit/items/f28ae581cd199fc30e0b)に書いたとおりです。
> 単身赴任で京都に住んでた頃に「京都は暑いでしょう」ってよく言われていたので、検証のために2016年7月の東京と京都の日毎の最高気温のデータを気象庁からダウンロードしてExcelにまとめてみた。

![20160831001.jpg](https://qiita-image-store.s3.amazonaws.com/0/15553/302c78f3-35d2-4b60-a5d8-189e8530e772.jpeg "20160831001.jpg")

> これ、見るだけで京都の方が暑いな。Pythonで解析するまでもないわ。でも、気を取り直して、両都市の平均気温を計算してみる。

[一年前の記事](https://qiita.com/fukuit/items/f28ae581cd199fc30e0b)では、numpyのarrayにExcelファイルの中身を読み込んだのですが、今回はpandasで読み込み、DataFrameに格納します。

```Python:read_excel2.py
import pandas as pd
import os.path

xlfile = "temperature.xlsx"
if os.path.exists(xlfile):
    xls = pd.ExcelFile(xlfile)
    sheet1 = xls.sheet_names(0)
    df = pd.DataFrame(xls.parse(sheet1))

	print(df.mean())

```

これだけで、temperature.xlsxに記載されているTokyo列とKyoto列の平均値を表示することができます。

```sh
% python read_excel2.py
Tokyo    29.732258
Kyoto    32.951613
dtype: float64
```

# グラフ描画
[一年前の記事](https://qiita.com/fukuit/items/f28ae581cd199fc30e0b)同様に、グラフを書いてみることにします。

```Python:read_excel2.py
import pandas as pd
import os.path

xlfile = "temperature.xlsx"
if os.path.exists(xlfile):
    xls = pd.ExcelFile(xlfile)
    sheet1 = xls.sheet_names(0)
    df = pd.DataFrame(xls.parse(sheet1))

	print(df.mean())
	
	df.plot()

```

![20170928_001.png](https://qiita-image-store.s3.amazonaws.com/0/15553/81431a85-afa6-4023-4843-9e34f420a48e.png "20170928_001.png")

[一年前の記事](https://qiita.com/fukuit/items/f28ae581cd199fc30e0b)では悩みのタネだった、日付型のX軸についても分かりやすく表示することができました。

また、```df.boxplot()``` あるいは```df.plot(kind='box')``` すれば箱ひげ図を、```df.hist()``` あるいは```df.plot(kind='hist')``` するとヒストグラムを描くことができました。

![20170928_004.png](https://qiita-image-store.s3.amazonaws.com/0/15553/c17a8a5d-c4c2-f1d7-0ace-4afbf2d823e5.png "20170928_004.png")

以上のように、当初の目論見通り、東京と京都の夏の気温の違いについて、可視化することができました。

----

# 本日のまとめ
- Pandasスゴい
- DataFameスゴい

## 本日のコード
- https://github.com/fukuit/Python_SelfLearning/blob/master/read_excel2.py
Ansible | インベントリとPlaybookとRoleの関係 ( Roleの基本と動作例 )

# インベントリとPlaybookとRoleの関係は？

- Playbook が「対象のホスト」をインベントリから得る
- Playbook は「実際の動作部分」をRoleに委ねる
- Playbookは、MVCでいうコントローラーのようなイメージに近いかもしれない

# 何が良いの？

- 実行対象 ( インベントリ )
- 動作 ( Role )
- 「実行対象」と「動作」の組み合わせ ( Playbook )

このそれぞれをパーツ化することによって、柔軟に一連の処理を作ることが出来る。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/087b7e4c-538e-5303-984f-276398cd601c.png)


- 仮にインベントリが存在しなかったら、Playbookに長大な対象ホストを書かなければいけない。
- 仮にRoleが存在しなかったら、複数のPlaybook同士で重複する処理があっても、共通化することが出来ない。
 
# 動作例

## インベントリファイル

おなじみのインベントリファイルで、対象のホストをグループ化しておく。

```inventory.txt
[example]
0.0.0.0
0.0.0.1
```

## Playbook

ここではPlaybookには直接タスクを書かず、Roleに処理を任せるようにする。

この例では「 `example` グループに対して `touch_file` というRoleを実行する」ということを Playbook で指定する。

```playbook.yml
---
- hosts: example
  roles:
    - touch_file
```

## Role

実際の「動作部分」を受け持つ Roleを1個作ってみる。
ここでは簡潔に、ファイル作成だけをおこなわせる。

```roles/touch_file/tasks/main.yml
- name: touch file
  shell: touch example.txt
```

ファイル階層は次のとおりにする。

```
roles/ロール名/tasks/main.yml
```


## 実行

インベントリとPlaybookを指定して `ansible-playbook` コマンドを実効する。
このやり方はRoleを使う場合でも、使わない場合でも変わらない。

```
ansible-playbook -i inventory.txt playbook.yml
```

## 間違えの例

`tasks/main.yml` に記述している以上、タスクであることは自明なので、YAMLのキーに `tasks:` と書く必要はない。

```roles/touch_file/tasks/main.yml
tasks:
  - name: touch file
    shell: touch example.txt
```

## ちなみに

Role には tasks 以外にも色々な要素を定義出来るが、ここでは無視して tasks だけを作った。
他のものはなくても動作する。

```
tasks/
handlers/
files/
templates/
vars/
defaults/
meta/
```


# 参考

- [Ansible | Docker で Ansible の動作環境を作る - Qiita](https://qiita.com/YumaInaura/items/621640b853af71ecb21f)
- [Roles — Ansible Documentation](http://docs.ansible.com/ansible/2.4/playbooks_reuse_roles.html#role-directory-structure)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
FizzBuzzクイズの実装例(Aho対応)

問題と実装例：https://qiita.com/sumim/items/f26902f2b813c075a619

以前
https://qiita.com/Nabetani/items/a02c922a21ce357b62da
に実装していたんだけど、sumim さんが「ついカッとなった」部分に対応するために再実装。

```ruby
[
  [:fizz, "Fizz", ->(x){ x%3==0 }],
  [:buzz, "Buzz", ->(x){ x%5==0 }],
  [:pezz, "Pezz", ->(x){ x%7==0 }],
  [:hozz, "Aho", ->(x){ x.to_s.include?(?3)}],
].each do |name, text, proc|
  Numeric.class_eval do
    define_method name do
      if proc[self]
        text.dup.tap{ |x| # ここで dup しないと大変なことになる
          this=self; # ここで this に受けるのがなんか悔しい
          x.define_singleton_method( :val ){ this }
        }
      else
        self
      end
    end
  end
  String.class_eval do
    define_method name do
      self.tap{ self  << text if proc[self.val] }
    end
  end
end
```

基本的に同じ戦略で書けたのでちょっとホッとした。

「`text.dup.tap`」の `dup` がちょっとトリッキー。
ここでトリッキーになるのは、`self  << text` という具合に `String` の副作用を利用しているから。
ここで `+` の類ではなく副作用のある `<<` を使っているのは、`x.define_singleton_method` で生やしたメソッドを維持するため。
副作用のお陰で `define_singleton_method` を二度書かずに済んでいる。

DRY でしょ？
ReactがMITライセンスになった

React 16でついにReactがMITライセンスになりました！

[React blog](https://facebook.github.io/react/blog/2017/09/26/react-v16.0.html#mit-licensed)からの引用
> ...　React 16 is available under the MIT license. We've also published React 15.6.2 under MIT, for those who are unable to upgrade immediately.

(翻訳: React 16はMITライセンス下で利用可能です。すぐにアップグレードができない人のために、React 15.6.2もMIT下で公開しました。)

とのこと。

[先週(9月23日)](https://code.facebook.com/posts/300798627056246/relicensing-react-jest-flow-and-immutable-js/)に発表されている通り、ReactだけでなくJest、 Flow、Immutable.jsもMITライセンス下で配布されることになりました。
facebookの他のライブラリはBSD + Patentsのままだそうです。
【LINE DEV DAY 2017】LINE BOTとMessaging API #line_devday


急いで書いてるので色々おかしくてすみません！
雰囲気だけでも感じてもらえれば。

# 概要
LINE Messaging API公開後、開発者のみなさまのアイディアにより続々と革新的なBotが生みだされ、人々のコミュニケーションをより楽しく便利なものにしています。本セッションでは、LINE Botの発展を振り返りつつ、Flexible Rich Menuなどの最新APIを、デモを交えてご紹介します。Botが提供する心地よいUXを体感ください。

# アジェンダ
* Messaging API
* Review of last year and updates 
* Flexible rich menu
* Upcoming

# Messaging API
20億人のともだち登録(のべ人数)
100億回のメッセージやり取り

## LINE BOTコンテスト
## グランプリ
&HAND
LINE Beaconを人に持たせて、その人同士を結びつけるBOT。

## BOT Awards 2?
開催決まってません。
もろもろの準備が整い次第、あるかも。

# Multi-function
テンプレートを元に、ユーザが文字を入力するのではなく、選択肢の中から選択して入力できるようなインターフェースを作成することが出来る。

# Demo
## Messaging API と LINE Loginを組み合わせた実際のデモ
LINEのリッチメニューを選択するとLINE Loginをして、Web上でグラフ形式の体重遷移をみることが出来る。(ログインが簡単。文字入力なし)

## 翻訳BOT
LINEのグループに一人BOTを入れておいて、翻訳を行わせる。

## 課題提出BOT
グループの中にBOTを入れて、ユーザにやらせることを提示。
提出用のリンクを送るなど。

# Coming soon
縦の長さが従来の半分になるリッチメニューを設置することが出来るように。
リッチメニューで電卓機能。
ゲームのコントローラ風のリッチメニュー。

## Rich Menu API
ユーザの状態により、リッチメニューを切り替えるような実装も可能になる。
例えば、アカウントの連携前後で切り替える。
友達の登録のタイミングで年齢を選択してもらって、以後は選ばれたものに対応したリッチメニューを切り替える。
リッチメニューでリバーシをすることもできる様になる。

APIの仕様は残念ながらまだ公開されていません！近日公開予定。

## LINE Developer Centerリニューアル中
画面が黒くなった。
リファレンス等の充実を図っている。

## LINE API Expert
LINE API Expertに対しては、LINE APIのβ機能をいち早く公開する。
そういったことにメリットを感じてもらえる方を募集している。
PayPalのSandboxで即時支払い通知(IPN)を有効にする方法

# 設定
* まずは、[Sandboxのアカウントにログイン](https://www.sandbox.paypal.com/jp/)します。**ログイン先のURLに、sandboxが入っていることを確認してください。**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71588/560d6212-4c45-3b81-f07d-52a94efda648.png)
> ログイン時のIDとPasswordは、SandboxのBUSINESSアカウントです。
> **@以前にfacilitatorが含まれるものです。**
> パスワードが違うと出る場合は、本番アカウントで[Developerセンター](https://developer.paypal.com/)にログイン後、**Sandbox**のAccountsから**facilitator**が含まれるアカウントのProfileから【Change password】で変更してください。
> この際、Saveを押し忘れないようにしてください。

* ログイン後、プロフィール編集を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71588/db7f2c5f-0f2d-ff07-4eb9-d3943d2f8089.png)

* 【販売ツール】から【即時支払い通知】の【更新】を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71588/fa059836-7393-2f9b-3157-c5bb53c4864b.png)

* 通知URLに通知先のURLを入力し、【IPNメッセージを受信する(有効)】を選択し【保存】を押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/71588/b0174a38-7151-2179-a9d7-32071d56667d.png)

* 以上で設定は完了です。お疲れ様でした。

---
**通知メッセージが飛んでくるまでにだいたい5分位の時間差があります。**
**その点には、注意が必要です。**

---
この設定がわかるまで、時間がかかりました。
他に誰かが悩んでいる方がいれば少しでもお役に立てれば幸いです。
Javaで外部プロセス実行

#やりたいこと
keytoolでp12ファイルをcacert(Javaのキーストア)にインポートさせたい。
実運用でコマンドラインからのインポートを手動実行するのは、手間がかかって現実的ではないため、稼動しているWebアプリの一処理として盛り込みたい。

#事前準備
cacertsの書き換えは管理者でしかできないように設定されていたため、Webアプリを実行しているユーザーにも権限を付与。（コマンドプロンプトを管理者権限で実行しないと、証明書をインポートできないようになっていた）

※これに気づくまで、waitFor()の返り値が1（実行失敗）となってて原因探すのに時間かかりました。。。

#サンプルソース
※windowsでの実行を想定

```java:sample1.java
String JRE_PATH = "C:\\Program Files\\Java\\jre1.8.0_144";
String KEYSTORE_PATH = JRE_PATH + "\\lib\\security\\cacerts"; //cacertsのパス
String CERTFILE_PATH = "cert.p12"; //p12ファイルのパス
String ALIAS = "test"; // エイリアス
String KEYSTORE_PASS = "changeit"; // キーストアパスワード
String PRIVATEKEY_PASS = "root"; // 証明書のパスワード

// 証明書をインポートするコマンド
ProcessBuilder importCertPb = new ProcessBuilder( "keytool", "-importkeystore", "-keystore",
                "\"" + KEYSTORE_PATH + "\"", "-srckeystore",
                CERTFILE_PATH, "-srcstoretype", "PKCS12", "-srcstorepass", PRIVATEKEY_PASS, "-deststorepass",
                KEYSTORE_PASS );

// エイリアス「1」でインポートされるため、別名をつける
// XXXX:エイリアス（証明書を一意に識別する名前のようなもの）
ProcessBuilder changeAliasPb = new ProcessBuilder( "keytool", "-changealias", "-alias", "1", "-destalias", XXXX,
        "-keystore", "\"" + KEYSTORE_PATH + "\"", "-keypass", PRIVATEKEY_PASS, "-storepass", KEYSTORE_PASS );

// 証明書がインポート済みかチェックするコマンド
ProcessBuilder checkExistCertPb = new ProcessBuilder( "keytool", "-list", "-alias", XXXXX,
        "-keystore", "\"" + KEYSTORE_PATH + "\"", "-storepass", KEYSTORE_PASS );

// 外部プロセス実行
Process importCertPbSt = importCertPb.start();

// プロセスが終了するまで待機
importCertPbSt.waitFor();
```

##結果を取得し出力する

```java::sample2.java
// エイリアス：XXXXに合致する証明書を取得するコマンドを実行
Process checkExistCertPbSt = checkExistCertPb.start();
checkExistCertPbSt.waitFor();
InputStream in = checkExistCertPbSt.getInputStream();

try {
    String line = null;
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (Exception e) {
    e.printStackTrace();
}
```

##関連記事

[Javaアプリから外部コマンドを実行した際に、ファイルパスが認識されない](https://qiita.com/irohamaru/items/bad8361672f24643e652)
Ansible — ansible playbook の基本

# 概念

## インベントリ

Ansibleの大前提として、
インベントリでは、動作対象のホストをグループ化出来る

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/cb8411ef-422b-a217-55aa-4bc44d8741c4.png)

## Playbook

Playbook では「このグループに対して、こういう動作をさせる」という、一連の処理の流れを記述できる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f51235ad-e139-62ce-f938-b516a430645c.png)

## インベントリ x Playbook

この組み合わせは自由。

インベントリファイルでホストをグループ化しているので、
Playbookでは対象ホストに関して、煩雑な記述をしなくても済む。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/4d332fe8-5f9a-9d6d-094c-1143328f6be8.png)


# 動作確認

## インベントリ

example グループとして、接続先のホストを記述する

```:inventory.txt
[example]
0.0.0.0
0.0.0.1
```

## プレイブック

この例では

- example グループに対して 
- shell モジュールを使って
- ファイルを作成する

という処理をする。

```yaml:playbook.yml
---
- hosts: example
  tasks:
  - name: touch text file
    shell: touch example.txt
```

## 実行

```
ansible-playbook -i inventory.txt playbook.yml
```

# インベントリで変数を定義する

## インベントリ

- example グループが変数 ( `vars` ) を持つようにする

```:inventory.txt
[example]
0.0.0.0
0.0.0.1

[example:vars]
file_name=example
```

## プレイブック

Playbook の中で変数  ( `{{file_name}}` ) が使えるようになる

```yaml:playbook.yml
---
- hosts: example
  tasks:
  - name: touch text file
    shell: touch {{file_name}}.txt
```

# プレイブックで変数を定義する

インベントリで定義していた変数を、Playbookの中に移し替えてみる。

## インベントリ

ここでは変数を指定しない。

```:inventory.txt
[example]
0.0.0.0
0.0.0.1
```

## プレイブック

Playbook の中で変数を定義して、さらにそれを使ってみる。

```yaml:playbook.yml
---
- hosts: example
  vars:
    file_name: example
  tasks:
  - name: touch text file
    shell: touch {{file_name}}.txt
```

# ansible コマンドとの違い

ansible コマンドで同様の操作をおこなう場合は、次のとおり。

```
ansible -i inventory.txt example -m shell -a 'touch example.txt'
```

ansible コマンドでもインベントリファイルを使うことに変わりはないが、
動作自体はワンライナーで書く必要があるため、複雑な処理はおこないづらい。


# 参考

- [Ansible | Docker で Ansible の動作環境を作る - Qiita](https://qiita.com/YumaInaura/items/621640b853af71ecb21f)
- [Intro to Playbooks — Ansible Documentation](http://docs.ansible.com/ansible/latest/playbooks_intro.html#playbook-language-example)
- [shell - Executes a shell on a remote node — Ansible Documentation](http://docs.ansible.com/ansible/latest/shell_module.html)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Pattern Synonymsで遊ぶ

# Pattern synonymsとは

pattern synonymsとはGHC7.8から導入されたGHC拡張で、読んで字のごとく、パターンマッチで使うパターンに別名を付ける事ができる機能である。

# 基本

pattern synonymsの宣言構文には、以下の種類がある。

```haskell
pattern pat_lhs = pat

pattern pat_lhs <- pat
    [where ...]
```

前者で定義されるのはbidirectional synonymsといって、パターンマッチにも使えるし、コンストラクタ的な関数としても使う事ができる。

```haskell
{-# LANGUAGE PatternSynonyms #-}

pattern Cons x xs = x:xs
pattern Nil = []

main = do
  let x = Nil -- コンストラクタ的用法
  case x of {Cons _ _ -> undefined; Nil -> putStrLn "Nil!"} -- パターンマッチ
```

後者で定義されるのはunidirectional synonymsといって、パターンマッチにしか使えないが、逆変換が必要ない分だけ自由に書けるのがメリット。

```haskell
{-# LANGUAGE PatternSynonyms #-}

pattern Head x <- x:_ -- _ を含む物は = では定義できない

main = do
  case [] of {Head _ -> undefined; _ -> putStrLn "No head!"}
```

さらに、whereで逆変換を手書きしてやる事もできる。これをexplicitly bidirectional synonymsと呼ぶ。

```haskell
{-# LANGUAGE PatternSynonyms #-}

pattern Head x <- x:_
  where Head x = [x] -- コンストラクタとして使った場合の定義を手書き

main = do
  let x = Head 5
  case x of {Head y -> print y; _ -> putStrLn "No head!"} -- 5がprintされる
```


# unidirectional synonymsで遊ぶ

せっかくunidirectionalなのだからガードなど書ければ面白い気がするのだが、これは構文エラーになる。残念。

```haskell
{-# LANGUAGE PatternSynonyms #-}

pattern Even <- x | even x -- Syntax error
```

しかし、ViewPatternsを使えば同じ事ができる。

```haskell
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}

pattern Even <- (even -> True)
```

アズパターンを使えば更に夢が広がりそうなのだが、pattern synonymsにおいてアズパターンは制限されている。

```haskell
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}

pattern Even x <- x@(even -> True)
```

```
synonyms.hs:3:19:
    Pattern synonym definition cannot contain as-patterns (@):
      x@(even -> True)
```

多分bidirectionalの時にダメだからだろう。これもViewPatternsで回避可能。

```haskell
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
import Control.Arrow ((&&&))

pattern Even x <- (id &&& even -> (x, True))
```

マッチした値に関数適用して返したい。でもこれは構文エラー。

```haskell
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
import Control.Arrow ((&&&))

pattern TwiceOf (x `div` 2) <- (id &&& even -> (x, True)) -- Syntax error
```

こうすれば出来る。そう、ViewPatternsならね。

```haskell
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
import Control.Arrow ((&&&))

pattern TwiceOf x <- ((`div` 2) &&& even -> (x, True))
```

# 結論

自分で書いておいて何だが、これはちょっとアクロバティックすぎる気がする。

```haskell
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
import Control.Arrow ((&&&))

pattern TwiceOf x <- ((`div` 2) &&& even -> (x, True))

main = do
  case 2 of {TwiceOf x -> print x; _ -> print "Odd number"}
```

元々、某GUIライブラリで「キャスト可能性の確認→ダウンキャスト」が安全に出来たらいいな、と考えてみた方法でした。
あまり元の情報を変えてしまうようなpattern synonymsは可読性を損なう恐れがありますので、用法、用量を守って正しくお使い下さい。