OmniAICreator/Qiita-1.07M huggingface dataset:
Spring Boot + Mybatisのmapper-locations

### 環境
Spring Boot：2.0.4.RELEASE
Mybatis：3.4.6
Mybatis-Spring：1.3.2

### Spring Boot + Mybatisのmapper-locations

Spring Boot + MybatisでMapper XMLを利用してデータアクセスを行う場合、以下のようにapplication.yml(properties)にXMLファイルのロケーションの指定ができます。

```application.yml
mybatis:
  mapper-locations: classpath*:/jp/co/arsware/example/mapper/*.xml
```

ただし、Spring Boot + Mybatisでは、Mapper XMLとMapperクラスのパスが同じ場合、上記の指定をしなくてもMybatisがMapper XMLを読み込んでくれます。「Mapper XMLとMapperクラスのパスが同じ」のイメージは以下のような形です。

・src/main/java/jp/co/arsware/example/mapper/CityMapper.java
・src/main/resources/jp/co/arsware/example/mapper/CityMapper.xml
※co以下が同じパスであれば読み込んでくれる

上記が同じでない場合でかつapplication.yml(properties)にmapper-locationsの指定がない場合、実行時に以下のようなエラーが発生することになります。

```
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
```

そのため、例えばXMLの配置先は変更したい、等があれば明示的にapplication.yml(properties)にmapper-locationsの指定をする必要があります。

以上です。
pybind11で二項分布を計算してみる。

## このテキストについて
scipy 1.1.0 の binom.pmfをc部分を抜き出し、pybind11で直接bindして速度計測したもの。
内容は[Github repository](https://github.com/takuyakubo/experimental/tree/master/scipy_binom_test)にある。

## scipyのc部分
おおよそ[ここ](https://github.com/scipy/scipy/blob/v1.1.0/scipy/special/cephes/gamma.c)にあるガンマ関数のlogを写したものを使う。定数などは適宜変更してある。結果は[ここ](https://github.com/takuyakubo/experimental/blob/master/scipy_binom_test/binomial.cpp)
に示した通り。

## 計算実験
python上(jupyter上)で行う。

```python
from binomial import binomial
from scipy.stats import binom
# 計算用のparameter
params = (4, 30, 0.3)
binomial(*params) == binom.pmf(*params) # ==> True

%%timeit
binomial(*params)
# ==> 420 ns ± 10.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

%%timeit
binom.pmf(*params)
# ==> 97.3 µs ± 1.78 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
```

100倍ぐらいの速度差が出ている。

## 終わりに
とりあえずやって見たけれど、想像した以上の差が出た。
なぜこの差が出るかは後ほどプロファイルしてみる予定。
HTML5 CANVAS　使ってウェブで時計を作ります。

## HTML5Canvasは何ですか。
HTML5CanvasはウェブでJavascriptを使って、アニメションやVector絵を作ることができる。

↓にはHTML５のコードです。
このコードはCanvasの場所を設定するためです。

```
<canvas id="canvas" width="150" height="150"></canvas>
```

↓にはJavascriptのコードです。
このコードは時計をCanvasで表示するためです。

```
function clock() {
  var now = new Date();　//今の時間を貰う出てくるす。

　//初めにCanvasを選んで設定する
  var ctx = document.getElementById('canvas').getContext('2d');
  ctx.save();
  ctx.clearRect(0, 0, 150, 150);
  ctx.translate(75, 75);
  ctx.scale(0.4, 0.4);
  ctx.rotate(-Math.PI / 2);
  ctx.strokeStyle = 'black';
  ctx.fillStyle = 'white';
  ctx.lineWidth = 8;
  ctx.lineCap = 'round';


  // 時のマークを作る
  ctx.save();
  for (var i = 0; i < 12; i++) {
    ctx.beginPath();
    ctx.rotate(Math.PI / 6);
    ctx.moveTo(100, 0);
    ctx.lineTo(120, 0);
    ctx.stroke();
  }
  ctx.restore();

  // 分のマークを作る
  ctx.save();
  ctx.lineWidth = 5;
  for (i = 0; i < 60; i++) {
    if (i % 5!= 0) {
      ctx.beginPath();
      ctx.moveTo(117, 0);
      ctx.lineTo(120, 0);
      ctx.stroke();
    }
    ctx.rotate(Math.PI / 30);
  }
  ctx.restore();
 
  var sec = now.getSeconds();
  var min = now.getMinutes();
  var hr  = now.getHours();
  hr = hr >= 12 ? hr - 12 : hr;

  ctx.fillStyle = 'black';

  // 時の手を作る
  ctx.save();
  ctx.rotate(hr * (Math.PI / 6) + (Math.PI / 360) * min + (Math.PI / 21600) *sec);
  ctx.lineWidth = 14;
  ctx.beginPath();
  ctx.moveTo(-20, 0);
  ctx.lineTo(80, 0);
  ctx.stroke();
  ctx.restore();

  // 分の手を作る
  ctx.save();
  ctx.rotate((Math.PI / 30) * min + (Math.PI / 1800) * sec);
  ctx.lineWidth = 10;
  ctx.beginPath();
  ctx.moveTo(-28, 0);
  ctx.lineTo(112, 0);
  ctx.stroke();
  ctx.restore();
 
  // 秒の手を作る
  ctx.save();
  ctx.rotate(sec * Math.PI / 30);
  ctx.strokeStyle = '#D40000';
  ctx.fillStyle = '#D40000';
  ctx.lineWidth = 6;
  ctx.beginPath();
  ctx.moveTo(-30, 0);
  ctx.lineTo(83, 0);
  ctx.stroke();
  ctx.beginPath();
  ctx.arc(0, 0, 10, 0, Math.PI * 2, true);
  ctx.fill();
  ctx.beginPath();
  ctx.arc(95, 0, 10, 0, Math.PI * 2, true);
  ctx.stroke();
  ctx.fillStyle = 'rgba(0, 0, 0, 0)';
  ctx.arc(0, 0, 3, 0, Math.PI * 2, true);
  ctx.fill();
  ctx.restore();

　// 秒のまるを作る
  ctx.beginPath();
  ctx.lineWidth = 14;
  ctx.strokeStyle = '#325FA2';
  ctx.arc(0, 0, 142, 0, Math.PI * 2, true);
  ctx.stroke();

  ctx.restore();

  window.requestAnimationFrame(clock);
}

window.requestAnimationFrame(clock);
```

SRC : https://github.com/andybit-okutama/learning_place/tree/master/HTML5Time
XcodeでMain.storyboardという名前を変更したいあなたにおくる失敗から得た知見

## 聞いてくれ、俺の失敗を
Xcodeで新規プロジェクトを作成すると、初回にMain.storyboardが作成される。

![スクリーンショット 2018-11-29 23.35.13.png](https://qiita-image-store.s3.amazonaws.com/0/32982/19fc688a-f2e8-23e1-54c3-c469352f49ed.png)

あ、気分でViewControllerにボタンを置いておいた。

![スクリーンショット 2018-11-29 23.44.37.png](https://qiita-image-store.s3.amazonaws.com/0/32982/d4c53864-0de4-91f3-d1e0-ea2f45509cb7.png)

このボタンが載ったMain.storyboardとViewControllerというファイル名を以下に変更。

・Home.storyboard
・HomeViewController.swift
![スクリーンショット 2018-11-29 23.37.41.png](https://qiita-image-store.s3.amazonaws.com/0/32982/b4ae4065-cf0d-618c-abe2-cb44b3d563f5.png)


で、ビルドしたのよ

![スクリーンショット 2018-11-29 23.40.09.png](https://qiita-image-store.s3.amazonaws.com/0/32982/0b45b0f7-94ea-1501-a35c-3eea1c9cff8f.png)

はい、エラー


で、まぁMain.storyboardの名前を変更したら、以下の手順でビルドできるようになると思ってたのよ。

<b>１． Home.storyboardのcustom classのclassをHomeViewControllerに変更</b>

↓ここの
![スクリーンショット 2018-11-29 23.52.47.png](https://qiita-image-store.s3.amazonaws.com/0/32982/6df74d11-206c-94b8-0e90-47ef2e57a1a8.png)

↓これを
![スクリーンショット 2018-11-29 23.57.04.png](https://qiita-image-store.s3.amazonaws.com/0/32982/dc16787e-8b83-aec7-8d70-9af1ab166e99.png)

↓こう
![スクリーンショット 2018-11-29 23.53.25.png](https://qiita-image-store.s3.amazonaws.com/0/32982/f2a5dd22-58d1-3d40-b924-6d65c83f9944.png)


<b>２．info.plistの`Main storyboard file base name`の値をHomeに変更</b>

↓ここの
![スクリーンショット 2018-11-29 23.53.48.png](https://qiita-image-store.s3.amazonaws.com/0/32982/95073d35-827f-a798-728f-0011e1baf37e.png)

↓ここを
![スクリーンショット 2018-11-29 23.53.43.png](https://qiita-image-store.s3.amazonaws.com/0/32982/a11854fb-11f6-6e90-1f4a-6ffe569c943c.png)

↓こう
![スクリーンショット 2018-11-29 23.56.03.png](https://qiita-image-store.s3.amazonaws.com/0/32982/e65bc911-9244-60e6-e08b-286562c9a99a.png)


でね、ビルドしたらねこうなったのよ。
![スクリーンショット 2018-11-29 23.58.56.png](https://qiita-image-store.s3.amazonaws.com/0/32982/9576efb9-eac3-3a48-603f-b90bcb720abb.png)

ええ、こりゃもう「えっ、、、」ってなりましたよね。
そして色々調べること20分。
みつけた

↓ここの
![スクリーンショット 2018-11-30 0.00.06.png](https://qiita-image-store.s3.amazonaws.com/0/32982/e9cf8aba-af5d-be12-0e29-acf5d70292f8.png)

↓ここが空っぽ
![スクリーンショット 2018-11-30 0.00.12.png](https://qiita-image-store.s3.amazonaws.com/0/32982/f08c2339-a9be-ea0f-e863-31c462b1aecd.png)

Main Interfaceがなけりゃそりゃ何も表示されませんわ。
ってことで、プルダウンメニューからHomeを選んでRun
![スクリーンショット 2018-11-30 0.04.01.png](https://qiita-image-store.s3.amazonaws.com/0/32982/d3f7cf8d-cdef-65ef-19bc-f9e0562ce688.png)


結果
![スクリーンショット 2018-11-30 0.04.33.png](https://qiita-image-store.s3.amazonaws.com/0/32982/b5290e74-55ac-39b4-0421-51a47ae169f8.png)


## まとめ
結構忘れてるとやっちゃいそうなミスだと思ったので、メモがてら書いてみた。
これが夜中のテンションというものです。
php-master-changes 2018-11-29

今日は opcache の誤ったアサーションの削除、DateTime::diff() が誤った値を返すバグの修正、sqlite3 の修正色々とドキュメント/メンテナ/最低要求バージョンの更新があった！

# 2018-11-29
## nikic: Fixed bug [#77215](https://bugs.php.net/bug.php?id=77215)
- https://github.com/php/php-src/commit/17f8b9fb365600408f512e8d9038e38771a768e5
- [7.2~]
- ext/opcache で、誤ったアサーションがあったのを削除

## derickr: Fixed bug [#77097](https://bugs.php.net/bug.php?id=77097) (DateTime::diff gives wrong diff when the actual diff is less than 1 second) by upgrading to timelib 2017.09
- https://github.com/php/php-src/commit/a3f2871b8ee6975e70685bca803d5499e540b803
- [7.2~]
- ext/date で、差分が 1 秒未満の際に DateTime::diff() が誤った値を返す問題の修正

## cmb69: Deny (un)serialization of SQLite3, SQLite3Stmt and SQLite3Result
- https://github.com/php/php-src/commit/035de21d77ed4ce801ad1b1a8c452b90840d921e
- ext/sqlite3 で、SQLite3、SQLite3Stmt、SQLite3Result のシリアライズ/デシリアライズを禁止に

## : Fix [#77051](https://bugs.php.net/bug.php?id=77051): Issue with re-binding on SQLite3
- https://github.com/php/php-src/commit/94ec262fca2e832ab2e1c4f03bc68cbda6aa42ae
- [7.2~]
- ext/sqlite3 で、一度パラメータをバインドしてプリペアードステートメントを実行した後、別のパラメータをバインドして再度実行しようとすると誤った値を返すメモリバグの修正
- sqlite3_reset() を使うことで解決している

## cmb69: Handle potential sqlite3_bind_*() call failures
- https://github.com/php/php-src/commit/525d3ae858ec33a1e9fe72c339d053e65d252430
- ext/sqlite3 で、念の為  sqlite3_bind_*() の返り値をチェックしてエラー処理を追加

## cmb69: [ci skip] Add myself as sqlite3 maintainer, officially
- https://github.com/php/php-src/commit/1674db8c40f363a5fe0ef2ca5dd1bcebbd6cdfa0
- ext/sqlite3 のメンテナに自分を追加

## cmb69: Require SQLite ≥ 3.7.4 for ext/sqlite3
- https://github.com/php/php-src/commit/a757ebb5b58db9e15b71ed50c6ba9e2a5111508c
- ext/sqlite3 について、ドキュメント/ビルドシステムで SQLite 3.7.4 以上を要求するよう修正
- pdo_sqlite の最低バージョンは 3.5.0 のまま
- [PR:3614](https://github.com/php/php-src/pull/3614) での議論の結果
phina.jsのフレーム更新サイクル

前々から気になったのですが、気運が高まったのでまとめてみようと思います。
対象バージョンはv0.2.3です。

## 基本

こちらの図が大変分かりやすいです。

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">1箇所間違いがありました…<br>修正版はこちらです <a href="https://t.co/KHhiXDXDlY">pic.twitter.com/KHhiXDXDlY</a></p>&mdash; axion014 (@axion014) <a href="https://twitter.com/axion014/status/937281222086090752?ref_src=twsrc%5Etfw">2017年12月3日</a></blockquote>


いくつか補足すると以下のような順番になっています。

**0. (app更新)**
**1. input（mouse/touch/keyboard）イベント発火**
**2. app更新**
**3. scene更新**
**4. scene子要素（element）更新**
**5. interactionのチェック（onpointstart等の発火）**
**6. 描画処理**
**7. statsのupdate（あれば）**
**(最初に戻る)**

- 最初の方のカッコ書き何？って思うかもですが、これについては後述します。
- interactionと描画処理も逆になってますが、これは後に[タイミングが変更されました](https://github.com/phinajs/phina.js/pull/229)。

[こちらのサンプルで実際に動作確認できます。](http://runstant.com/pentamania/projects/b8a13b00)

### onenterframeとon('enterframe', func)とupdate
app/scene/element系クラスについては以上の更新処理関数を定義しているとそれが毎フレーム実行されます。updateはおなじみですね。

```javascript
// 毎フレーム、３種類のログが表示される
phina.define('MainScene', {
  superClass: 'DisplayScene',

  init: function(options) {
    this.superInit(options);
        
    this.on('enterframe', function(e) {
      console.log('scene: enterframe');
    });
  },
  
  onenterframe: function(e) {
    console.log('scene: onenterframe');
  },

  update: function(app) {
    console.log('scene: update');
  },
});
```

実はこれらも順番が決まってて、

**onenterframe -> on('enterframe', func) -> update**

の順で実行されます。

on('enterframe', func)は複数定義でき、定義した順番に実行されます。
また基本的にオーバーライドされないので、派生クラスにも何らかの更新処理を仕込みたいときも便利です。

onenterframeは…あんまり使い所が浮かびませんが（というか[そもそも使用が推奨されていない](https://github.com/phinajs/phina.js/blob/2ec5afd1badbcf1d6037a56da165fd67e79e754d/src/util/eventdispatcher.js#L10-L13)）、真っ先に実行したい処理を明示したいときに使うといいかもしれません。

### inputイベントに関する補足
inputイベント発火はappのon('enterframe')によって実現しています。
なので厳密に言えば最初の方は

**app.onenterframe -> input発火 -> 他のapp.on('enterframe') -> app.update -> scene更新...**

の順になっています。
ちなみにmouse -> touch -> keyboardの順で発火します。

### 描画処理は？
図のとおりですが、何か思うところがあったら追記するかも…。
Elasticsearch で indices をさくっとクローズしたりする方法

# Elasticsearch で indices をクローズするには

必要ない indices をクローズすることはスマートな運用にも繋がることなので・・・

## indices をクローズするには

下記コマンドでクローズできます。

```
> curl -XPOST http://localhost:9200/<indices名>/_close
```

ついでに、indices名は `*` で wildcard 指定もできます。

```
> curl -XPOST http://localhost:9200/<indices名途中まで>*/_close
```

## indices をオープンするには

クローズしたので、ついでにオープンも書いときます。

下記コマンドでオープンできます。

```
> curl -XPOST http://localhost:9200/<indices名>/_open
```

ついでに、indices名は `*` で wildcard 指定もできます。

```
> curl -XPOST http://localhost:9200/<indices名途中まで>*/_open
```

まぁ、`close` が `open` になるだけですね。

## indices を削除するには

じゃ、削除はって言われそうなので・・・

```
> curl -XDELETE http://localhost:9200/<indices名>
```

これやると、全部消えますね。

```
> curl -XDELETE http://localhost:9200/_all
```

## 終わりに

クローズしたりオープンしたり削除したりはそんなに難しくないですね。
さくさく試してみてください。

## 参照

[Open / Close index API](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-open-close.html)
[Delete Index](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-index.html)
家族のLINEグループに毎朝Trelloのリストを送信すると便利

家族でTrello買い物リストを使っているけどなかなか使うのが面倒で、「やっぱりLINEが便利っしょ」ということでLINEに送るようにすると便利でした。

https://github.com/yousan/trello_line/blob/master/notify.sh

ちなみにその昔はRemember The Milk[^1]というサービスが好きでよく使ってました。懐かしい！

[^1]: https://www.rememberthemilk.com/

# トークン類の取得
下記のトークンなどを取得します。

| 名前 |
|----|
| Trelloのキー |
| Trelloのトークン |
| TrelloのリストID |
| LINE Notifyのトークン |

# Trello
キーとトークンを取得します。
https://trello.com/app-key


# LINE Notifyのトークン取得
LINE Notifyのトークンを取得します。
https://notify-bot.line.me/ja/

トークン名が通知名になるので短めの名前がオススメです。

# コード

`jq`を入れておきます。

[jq コマンドを使う日常のご紹介](https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af)

下記のコードに四種類のIDとトークンをセットします。

```bash:notify.sh
#!/bin/bash

#set -xe

TRELLO_KEY=xxxxxxx
TRELLO_TOKEN=xxxx
TRELLO_LIST_ID=xxxxx
LINE_TOKEN=xxxxx

TASKS=`curl  "https://api.trello.com/1/lists/${TRELLO_LIST_ID}/cards?key=${TRELLO_KEY}&token=$TRELLO_TOKEN" | jq -r '.[].name'`

curl -X POST -H "Authorization: Bearer ${LINE_TOKEN}"  \
  -F "message=$TASKS" https://notify-api.line.me/api/notify
```

このコードを適当なホストでcronで回しておきます。

# 動かすと

Trelloのリストの中身はこんな感じです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47327/b8903ba8-c0fd-a7fa-8c5c-e8d17e14c61f.png)

送られる内容はこうです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/47327/003a4bed-4e66-9940-6248-467e9264c09a.png)


便利！

# IFTTT
最初はIFTTTでできるかと思ったんですが、時間＋Trello＋LINEという組み合わせが出来ず…。
IFTTTでできそうだったら是非教えてください！

# 参考
[超簡単 LINE notify を使ってみる](https://qiita.com/iitenkida7/items/576a8226ba6584864d95)

[Trello API を叩いてカードを作成する方法（curl利用）
](https://qiita.com/isseium/items/8eebac5b79ff6ed1a180)
Laravelのバリデーションの組み合わせでハマったバグと対策について

## 動作環境
- Laravel 5.5
- php 7.2

## ハマったこと
LaravelでRequestのバリデーションを以下のように記述していました。

```
public function messages()
{
    return [
    	.
    	.
		'max' => ':attributeは5文字以内で入力してください'
		'numeric' => ':attributeは数値で入力してください'
		.
		.
    ];
}

public function rules()
{
	return [
		.
		.
		.
		'address1' => 'required|numeric|max: 3',
		'address2' => 'required|numeric|max: 4',
		.
		.
		.
	];
}
```

自分が予想していた動作結果として、入力されたFormのvalueが数値かつ5文字以下のときはバリデーションエラーにならないというものでした。

しかしながら、結果として、address1に3文字の数値、address4文字の数値を入力すると`address1は3文字以内で入力してください`, `address2は4文字以内で入力してください`と出てしまいました。


## 対策

別のバリデーションで数字かつその文字数ならバリデーションが通る`degits`というものがあるので、こちらを使いましょう
また、数字かつその文字数の範囲になら受け付ける`degits_between`もあります。


## 以下使用例
```
public function messages()
{
    return [
    	.
    	.
    	.
		'max' => ':attributeは5文字以内で入力してください'
		'numeric' => ':attributeは数値で入力してください'
		.
		.
		.
    ];
}

public function rules()
{
	return [
		.
		.
		'address1' => 'required|degits: 3',
		'address2' => 'required|degits_between: 1, 4',
		.
		.
	];
}
```
MavenでMANIFEST.MFにシステム時間を出力する

MavenでデプロイしているJavaのWebプロジェクトをMANIFEST.MFファイルに
「いつコンパイルしたのか」
を出力してほしいと言われて調べたのでメモ。
# 環境
- Maven3.5.3
- Java 1.8,0_181
- Jenkinsでコンパイルをしていましたが多分あんまり関係ないです。

# 要件
- jarファイルのMANIFEST.MFにMaven実行時のシステム時間を出力する。

# なんとなくこだわる点。
- AntRun Pluginは使わない。build.xml作りたくない。
- コード書きたくない。

# やり方
## maven.build.timestampを使用する
まずMavenが準備しているプロパティmaven.build.timestampを使用する方法。
下記参考。
http://vbnmkyoto.blogspot.com/

```xml:pom.xml(抜粋)
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-jar-plugin</artifactId>
	<version>3.1.0</version>
	<configuration>
		<archive>
			<manifestEntries>
				<Build-Timestamp>${maven.build.timestamp}</Build-Timestamp>
			</manifestEntries>
		</archive>
	</configuration>
</plugin>
```
フォーマット変更するにはmaven.build.timestamp.formatプロパティでフォーマットを指定すればいい。

```xml:pom.xml(抜粋)
<properties>
	<maven.build.timestamp.format>yyyyMMhhmmss</maven.build.timestamp.format>
</properties>
```
こうするとMANIFEST.MFにはこんな感じで出ます。

```:MANIFEST.MF
Build-Timestamp：20181129115959
```
らくちん・・・なんだけど、Maven3.2.2以降では出力する時刻がUTCになってしまった。
https://issues.apache.org/jira/browse/MNG-5452
日本で普通に仕事する分にはやはり不便。
タイムゾーン設定できればいいのだけど、そんなプロパティのようなものは見つからず。
## Build Helper Maven Pluginを使用する
そんな感じでほかのものを探して、Build Helper Maven Pluginを使用してみました。
下記参考。
https://stackoverflow.com/questions/28281988/how-to-have-maven-show-local-timezone-in-maven-build-timestamp

```xml:pom.xml(抜粋)
<plugin>
	<groupId>org.codehaus.mojo</groupId>
	<artifactId>build-helper-maven-plugin</artifactId>
	<version>3.0.0</version>
	<executions>
		<execution>
			<id>timestamp-property</id>
			<goals>
				<goal>timestamp-property</goal>
			</goals>
			<configuration>
				<name>build.time</name>
				<pattern>yyyyMMddHHmmss</pattern>
				<locale>ja_JP</locale>
				<timeZone>Asia/Tokyo</timeZone>
			</configuration>
		</execution>
	</executions>
</plugin>
```
出力する箇所の記載にはnameの設定値を設定してあげる。

```xml:pom.xml(抜粋)
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-jar-plugin</artifactId>
	<version>3.1.0</version>
	<configuration>
		<archive>
			<manifestEntries>
				<Build-Timestamp>${build.time}</Build-Timestamp>
			</manifestEntries>
		</archive>
	</configuration>
</plugin>
```

これでMANIFEST.MFに日本時間通りのビルド実行時間が出力されました。

# 参考
https://www.mojohaus.org/build-helper-maven-plugin/usage.html
便利そうなのでもうちょっと調べてみてもいいかも。
侍エンジニア塾を辞めてウェブカツに移行した理由

はい、初めましてナスくんです

一発目なので軽い自己紹介から。
前職での仕事内容に将来性を感じず今年からITに転職を果たしたが、技術者派遣という人売り事情を知らずに転職、監視業務に就くといったこれもまた見事に将来性を感じられない職種にはいってしまい、そこからの脱出を目論んでいるアラサー男子です。

さて、お題を短刀直入に行きます。

私が侍エンジニアを辞め、ウェブカツに移行した経緯についてざっと淡々に書いて行きます

晴れて２月にIT業界へ未経験で転職(キチンと調べもしなかったから人売り企業とは知らず)
↓
会社の態度、色々な処理の遅さに対する言い訳「人が多すぎて追いつかないんですぅ〜」
↓
こんな所１年で辞めたるわい！でも技術ないしな〜
↓
侍エンジニアの広告を見つける
↓
自分で稼げるほどのスキル身につくならいいじゃん！値段は高いけどローン組もう！
↓
受講開始
↓
夏も終わる頃、ツイッターで虚偽広告発覚
↓
もちろんブチ切れ
↓
入塾したときの営業に問い詰めた所、侍と名乗るのも恥ずかしい対応をされる
↓
金返せ！
↓
ある程度は返ってきた(しかし、まだローン返済中、生活苦しいです)
↓
さあ、今後どうしたものか・・・
↓
ツイッターを眺めていたら救いの手が！

それがウェブカツでした。

以下に侍とウェブカツを比べたものをざっとまとめます

動画内容
侍→環境のバージョン古すぎ！よくこんなのであの値段取ろうと思ったね。環境設定であんなにググらせるとは良い度胸やんか
ウェブカツ→少しバージョン古いのは否めないが、侍ほど酷くなくむしろいい！

講義内容
侍→直接、現役講師に聴けるのはよかった(講師は外部委託なので侍のクソみたいな営業マンより全然良い人)
ウェブカツ→それぞれの講義内容で質問ボックスが設けられており(これは侍も一緒)、返信がとにかくはやい！

質問に対するレスポンスの内容の濃さ
侍→「動画古すぎませんか？」「今作り直している最中です」
　　あはは、この質問３年も前のだよ、アフリカの野生動物の一生の動画でも作ろうとしてるんですかね〜
ウェブカツ→的確、そしてズバリ言うわよ！のノリ

レスポンスの濃さについては両方とも「自分で解決させよう！」の姿勢は見られるが、その与え方がウェブカツに側が上がります

侍からウェブカツに移行しての感想としてはこんな感じです。
気になる方は以下にリンクを貼っておきますのでぜひご覧ください
https://webukatu.com

さて、今回の件で学んだことをざっと書きます。

①同じプログラミングスクールでもキチンと内容、そしてツイッター等での口コミをよく調べる。
②同じような買い物を今後もするであろうから、まずは自分で取ってきた情報を複数並べて吟味、口コミのいい点と悪い点を羅列していく
③聞き辛いこともじゃんじゃん突っ込んでいく。自分の納得するまで。
④焦って決めるよりもじっくりと調べ、自分の納得いくまで塾考する

最後に、自分の中での林修の名言を思い出しました。
「負ける奴は決まって情報不足だ」

情報業界に入った洗礼だったのかもしれない
SEがRPAソフトウェアを触ってみた感想

仕事でRPA触っています。開発において感じた雑感を書き散らかします。

- だいたいマウスカチカチ押してる時間とソフトのローディング待機時間になる……
    - 自動でチェックしてくれるから開発が楽な分、低スペックPCでの開発が非常にしんどい。
    - キーボードたたきたい欲求が高まる
        - キーボードを叩くことで、入力した文字数分の打ち間違いリスクがある。
        - RPA開発はそのリスクが大きく減るというメリットがあるものの……キーボードを叩くという物理的な快楽が減るううううう
        - キーボード叩けることがこんなに楽しいとは知らなかった……マウスでのビジュアルプログラミングェ

- 「それRPAじゃなくてもエクセルマクロでできるんじゃね？」って言葉が脳裏をよぎる
    - できる
    - ただ、RPAはノンプログラマーが言語を知らずに開発できるのが売りだから……
    - とはいえ、変数・条件分岐、部品再利用とかの機能を理解してロボット作るなら、システム開発の素養は絶対必要

- SE的にはBizRobo!よりBlue Prismの方が楽しい
    - 自分で作ってる感あって楽しい
    - その分システム開発でよくあるリスクが高い
        - 作る人によって全然違うロボットになる
        - システム開発の注意点（『プリンシプル オブ プログラミング』や『リーダブルコード』とかに書いてあるやつ）を知らない人が触るべきソフトではない
    - BizRobo!は自由度が少ないおかげで、どのロボットも見た目は似たようなものになる
        - 「他人の作ったロボットのメンテナンス」を考えるとこれは非常に大きなメリット


【結論】
RPAソフトウェアは決して簡単なシステム開発ではない。革新・革命的な存在ではない。
日本企業に必要なのはRPAによる効率化ではなく、非効率な業務・作業手順そのものをやめる勇気。
AWS Lambdaとは何か


# はじめに

AWSが公式でスライド資料を提供するBlack-Belt。
ここにはAmazonが作り出した数々のクラウドサービスの使い方が書かれている。
その中でも、クラウド技術を代表するのが、2014年に公開された
AWS Lambda。サーバーなしでプログラミングコードを実行するサービスだ。

今日は、Black-Beltの資料を読みながら、
AWS Lambdaを触ったことのない人向けに解説を書く。

# クラウドネイティブ

一昔前にクラウドと言えば、オンライン上の仮想サーバー、
GoogleComputeEngineやAmazonElasticComputeCloud (EC2) のことだったが、
これは、通常のサーバーで動作するアプリケーションをクラウドに配置したにすぎない。

クラウドネイティブとは、その先、
クラウドで提供されるサービス利用を前提にしたシステムおよびアプリケーションのこと。
概念レベルで違う。


# AWS Lambdaって何？

1.インフラを一切気にせずプログラミングコード（JavaやPython,Nodeなど）を実行できる。
2.実行基盤は全てAWSが管理。
3.AWSサービスと連携させることで簡単にイベントドリブンなアプリケーションを実装可能
4.コード実行時間に対しての課金であり、非常に安い。
5.リクエスト数に対し、1,000インスタンス程度まで起動する。
つまり、急な負荷にも耐えられるし、アクセスがない場合は課金されない。
キャパシティ、耐障害性、セキュリティパッチの適用といった雑事から
エンジニアを開放するサービス！

## デメリット
公式情報ではデメリットが後回しにされるが、ここでは代表的なデメリットを先に伝えておくぞ。

1.実行時間に上限がある。現在は上限15分まで。(2018年前期は5分だった。2015年は60秒だった。)
2.コールドスタンバイからの起動に3秒程要する。
3.外部からの通信コネクションの上限時間は15秒。（API Gateway）
※結果を待たない、または別のLambdaから取得するのであれば通信コネクションの上限時間は関係ないだろう。


## 仕組みの概要

1.リクエストが来る。
2.コンテナ(Linux)が立ちあがる。
3.プログラミングコードの実行環境が立ち上がる。
4.Lambdaプログラムが実行される。
5.リクエストがなくなり10～20分程度でコンテナを終了する。

Lambdaはスタックを持たない。
100個同時にコールしたら、
100個コンテナが立って、100個Lambdaが立つ。
同時実行数を超えたらエラーを返す。

リクエストが断続的にある場合、
1つの環境が処理を続けるため、起動時間が無くなる。
その代わり、グローバル変数の値は残るし、メモリリークもする。
マルチスレッド処理で、サブスレッドが停止した状態で残り、別ユーザの処理で動いていた！！なんてバグも遭遇したことがある。

## 公式のサンプルアーキテクチャ

■写真共有アプリ
イベントの写真を投稿すると、その投稿が参加者にPush通知される。
■モーションセンサー
映画館で観客がケータイを振ると、加速度センサーに応じてDBに値を登録できる。


## リクエスト方法
色々な方法で呼ぶことができる。詳しくはサンプルをググる。
【例】
・JavaScriptからAjax通信で呼ぶ。
・Amazon S3（ストレージサービス）にファイルが配置されたら呼ぶ。
・DBにデータが5件登録されたら呼ぶ。

## 実装時のつまづきポイント

・Lambdaから他のAWSサービスを呼ぶ場合は、IAMロールの設定が必要。
・ファイルをアップロードする機能は、ZIPで全体をアプロードする選択肢しかない。
ライブラリなどを後から追加するときは、ソースコードを上書き削除しないように注意。
・Cloud9を使えば、EclipseやVSCodeのようなイメージでファイルのアップロードや編集ができる。
・バージョンやエイリアスごとに画面が微妙に切り替わり、メニューでできることも変わる。

## ちょっと詳しい話
インスタンスが終了するまでの間、「/tmp」というLinuxOSの領域が一時的に500MB使える。

呼び出しモデル
PUSHモデル　条件によって他のAWSサービスからLambdaを呼ぶ。
PULLモデル　Lambdaが他のサービスのデータを一定期間監視するように、
            他のサービスがLambdaに要求する。

PULLモデルは順序性ありと書かれているが、Lambdaコールをする順序は順序性があっても、終了時間に順序はない。
プライベートIPアドレスがないので、インバウンドのソケット接続は不可能。
 
VPCアクセス機能　外部から呼ばずAWSネットワークの中で利用する場合、ONにすると良い。
これを使うとインターネット越しにアクセスしなくてもよくなる。
しかしながら、インスタンス起動時間が元々3秒だったのが、この機能を使うと10秒以上になる。
リクエスト頻度が低い場合は、使ってしまうともっさりする。
CLI用ファイルマネージャー「ranger」

![aratana advent calendar 2018](https://qiita-image-store.s3.amazonaws.com/0/218282/171179f0-f41f-5bd5-aa74-60e7bde8e113.gif)

## rangerとは
- Vim操作のようなCLIファイルマネージャー！(つまりVim)
- 細かくカスタマイズできるため、自分好みにすることができます！（つまりVim）
- Pythonで実装されているため、拡張もPythonで書けます！（つまりPython）
- ターミナル上に画像を表示させたりできます！？（つまりすごい）

## どんな感じ？
こんな感じ。
![imageview.gif](https://qiita-image-store.s3.amazonaws.com/0/218282/0b081f4f-7111-a161-4fbf-731efd9033bb.gif "ranger-demo")
ターミナル上で、`mp4, pdf, gif, png`のプレビューが見えちゃってます！
設定すれば、`svg`の表示もできます。
内部的には、`w3mimgdisplay`を利用して画像表示してるっぽいです。


## こんなことできます
いくつか機能追加したものがあるので、紹介。
こういうこと追加したいなーって思ったらPython書けばよいから楽です。

### 選択して圧縮
ファイル選択してコマンド実行で圧縮。（内部で`aunpack`実行）
![zip-demo.gif](https://qiita-image-store.s3.amazonaws.com/0/218282/7845d785-53ac-1051-c532-77e09885a3af.gif "zip-demo")

### 選択して解凍
複数圧縮ファイルを解凍。（内部で`aunpack`実行）
![unzip-demo.gif](https://qiita-image-store.s3.amazonaws.com/0/218282/67241286-1953-880a-f614-f2627b25e51a.gif "unzip demo")


### マウント
デバイスファイルを選択して実行すればマウントされます。（内部で`udisksctl`実行）
回復って文字が。。。（やっぱりどんなとこでもヒーラーは必要です）
![mount.gif](https://qiita-image-store.s3.amazonaws.com/0/218282/2a9e497c-b074-ac8a-4fa2-8c874f453a3c.gif "mount-demo")


### 指定画像のサイズを変更する
選択画像のサイズをリサイズできます。（内部で`imagemagic`実行）
サイズ50%と300x300の画像にリサイズします。
![resize.gif](https://qiita-image-store.s3.amazonaws.com/0/218282/0101f1a8-aacc-787b-fc1b-af9b9380ae9a.gif "resize-demo")


## まとめ
GIF画質落としすぎたかな？ちょっと気になりました。

設定方法などは、

-  [CLIファイルマネージャrangerの基本設定](https://qiita.com/ssh0/items/3d71da415953003d47d7)
- [コマンドラインで動かすファイルマネージャrangerの設定](https://qiita.com/ssh0/items/fe85da119c93333ba34e)
- [CLI で Linux ファイルマネージャ ranger を使うことのメモ](http://malkalech.com/ranger_filer)

を見ればわかると思います。

自分の設定は、[deresmos/ranger-conf](https://github.com/deresmos/ranger-conf)にあります。
昔に書いたやつなので何書いたかあまり覚えてませんがｗ。

他のCLIファイルマネージャとか触ったことないので、便利なのあれば教えていただきたいです。
ulimit の変更

#/etc/security/limits.conf による設定変更

以下は全ユーザの nofile (max number of open files) の変更例。

```/etc/security/limits.conf
*    soft nofile 10000
*    hard nofile 20000
```

```shell-session
$ ulimit -n -S
10000
$ ulimit -n -H
20000
```

#サービスの設定変更

/etc/security/limits.conf の変更は、サービスには反映されないため、個々のサービス毎に行う必要がある。
以下は httpd での設定変更例。

##RHEL6 の場合

```shell-session
$ echo "ulimit -SHn 8192   # nofile" >>/etc/sysconfig/httpd
$ service httpd restart
```

##RHEL7 の場合

```shell-session
$ mkdir /etc/systemd/system/httpd.service.d
$ echo [Service] >/etc/systemd/system/httpd.service.d/ulimit.conf
$ echo LimitNOFILE=8000 >>/etc/systemd/system/httpd.service.d/ulimit.conf
$ systemctl restart httpd
```

以下の通り設定反映済み。

```shell-session
$ cat /proc/$(</var/run/httpd/httpd.pid)/limits| grep "Max open files"
Max open files            8000                 8000                 files
```


# 参考情報

How to set ulimit values
https://access.redhat.com/solutions/61334

What is the actual meaning of "Soft limit" and "Hard limit" in limits.conf file ?
https://access.redhat.com/solutions/648113

How to increase max file descriptor (nofile ulimit) for Apache httpd on RHEL 6
https://access.redhat.com/solutions/130573

How to set limits (ulimit) for services in RHEL6 and older with upstart, sysvinit
https://access.redhat.com/solutions/253043

How to set limits (ulimit) for services run by systemd
https://access.redhat.com/solutions/1346533
nuxt.jsでお天気アプリを作ってみた

Nuxt.jsを初めて触ってアプリを制作してみたので、学んだことをメモしていきたいと思います。

## 今回製作したお天気アプリ
さっそくですが、今回作成したアプリは下記になります。
https://relaxed-mcclintock-e42601.netlify.com/

※Nuxt.jsを試しに触ってみたいという気持ちで制作したので、見た目も機能もとても簡素です。

## 天気アプリのAPIを準備
<img width="1079" alt="スクリーンショット 2018-11-29 22.40.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/146968/66e97d2f-bada-e0ad-7dc3-fd55aa21eb86.png">

今回は天気アプリ作成にopenWeatherMapという無料のAPIを利用します。アプリ作成の下準備として、下記サイトからサインインしてAPIkeyを取得しておきます。
https://openweathermap.org/

## Nuxt.jsをテンプレートをインストール
ここからは実際にNuxt.jsでのアプリ制作。まずは基本テンプレートを以下のvue-cliコマンドで生成。

```
$ vue init nuxt-community/starter-template my-vue-app
```

下記のようなフォルダ構成のテンプレートがインストールされます。

```
├── assets
├── components
├── layouts
├── middleware
├── pages
├── plugins
├── static
├── store
├── README.md
├── nuxt.config.js
└── package.json
```

## アプリ制作に使うフォルダとファイルを追加
今回制作するのはpages内のみです。
pagesにcityディレクトリを作成しその中に_name.vueというファイルを追加。

```
pages
├── index.vue
├── city ── _name.vue 
```

## index.vueの記述

index.vueの記述。こちらはとてもシンプルで、各都市のリンクをlist形式で記述。

``` vue
<template>
<div>
  <h1>日本全国の天気</h1>
  <ul>
    <li><nuxt-link :to="`/city/sapporo`">札幌</nuxt-link></li>
    <li><nuxt-link :to="`city/tokyo`">東京</nuxt-link></li>
    <li><nuxt-link :to="`city/nagoya`">名古屋</nuxt-link></li>
    <li><nuxt-link :to="`city/osaka`">大阪</nuxt-link></li>
    <li><nuxt-link :to="`city/fukuoka`">福岡</nuxt-link></li>
  </ul>
</div>
</template>
```

Nuxt.jsはpagesディレクトリ内のVueファイルの木構造に沿って、自動的にvue-routerの設定を生成してくれるので便利です。

## _name.vueの記述
次は_name.vueの記述。Nuxt.jsでは_name.vueのようなファイルを作った場合、 _（アンダーバー）以降の名前をプロパティ名と認識して、自動的に受け取った文字列をparamsへと代入するようになっています。

受け取った都市名の文字列をAPIのクエリパラメータに代入し、リクエストを送れば、動的に指定した場所の天気情報を取得することができます。

``` vue
<template>
<div>
  <h1>{{item.name}}の天気情報</h1>
  <ul>
    <li>天気：{{item.weather[0].main}}</li>
    <li>温度：{{item.main.temp}}℃</li>
    <li>湿度：{{item.main.humidity}}％</li>
    <li>風速：{{item.wind.speed}}m</li>
  </ul>
  <nuxt-link to="/">トップに戻る</nuxt-link>
</div>
</template>

<script>
export default{
  async asyncData({route, app}) {
    const item = await app.$axios.$get(`https://api.openweathermap.org/data/2.5/weather?q=${route.params.name},jp&units=metric&appid=取得したAPIkey`)
    return {
      item
    }
  }
}
</script>

```

あとは、取得したJSONデータから必要な情報を使って、表示したい情報をマークアップすれば簡単なお天気アプリの完成です。

## まとめ
Nuxt.jsの入門ということで簡単なお天気アプリを作成してみました。

Nuxt.jsは開発環境を自分で整える必要がなく、制作に集中することが出来るので触ってみてとても便利だと感じました。

まだまだ豊富な機能の一部を使っただけですので、様々な種類のアプリ制作を通して理解を深めていければと思います。
入力された数式をmatplotplibでプロット(Python3)

# はじめに

Python3を用いたグラフ描写プログラムを書いていきます。

# 環境

Python 3.6.6
matplotlib
numpy

# プログラム本体

``` Python3
from numpy import *
import matplotlib.pyplot as plt

x = arange(-10, 10, 0.1)
y = eval(input('f(x)='))

plt.plot(x, y)
plt.show()
```

> [Github](https://github.com/Lockdef/plot/blob/master/plot.py)

入力された関数のグラフがプロットされます。

お疲れ様でした。
UNITYフォースのタイプ

## unityには4つのフォースがあります。
・Force
・Acceleration
・Impulse
・VelocityChange

オブジェクトは連続の動きを作りたい時にForceとAccelerationのタイプ使ってほうが良いです。
例えば：車の運転やロケットの燃焼や重力の十分な引っ張りなどの動きです。

突然動きを変更するのオブジェクトを作りたい時にImpulseとVelocityChangeを作りたいほうが良いです。
例えば：弾丸を発射する、爆発から回復する、または障壁を跳ね返すなど動きです。

kg　：オブジェクトの体重です。
m/s　: メーター/秒

・Force
　－　その質量に基づいて、1つの時間ステップでオブジェクトを加速する。
　－　kg * m/s^2
・Acceleration
　－　その質量を無視して、1つのタイムステップでオブジェクトを加速する。 （重力のような）
　－　m/s^2
・Impulse
　－　物体をその質量に基づいて瞬時に推進させる
　－　kg * m/s
・VelocityChange
　－　物体を瞬時に推進し、質量を無視する
　－　m/s
Unityでマリオカートみたいなレーシングゲームを作るチュートリアル

引っ越しましたので[こちら](http://getabakoclub.com/2018/11/29/blender%E3%81%A7%E8%BB%8A%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89%E3%80%81%E3%83%9A%E3%82%B8%E3%82%A7%E3%81%A7%E3%82%B3%E3%83%BC%E3%82%B9/)より御覧ください♪
OctoberCMSプラグイン作成：モデルのto-manyリレーションをクリアする

one-to-manyやmany-to-manyのリレーションで一気に全ての紐づけを消す方法メモ。

October CMSのドキュメントみても載ってなかったのですぐに分からなかったが、[Laravelの機能][l1]を使えばいいだけだった。ということで、Octoberと言うよりLaravelの話だった。
[l1]:https://laravel.com/docs/5.5/eloquent-relationships

## one-to-many
Eloquentモデルでは`hasMany`にあたる。
hasManyをクリアするには、紐付いたモデルデータ自体を削除する。（未検証）

```php
$product->pictures()->delete();
```

紐づけは子データ（上記例で言うとpicture）が持っており親データ（product）は持っていない。紐づけをなくすと小データがみなしご（オーファン）になってしまうので紐づけを消すのではなく子データ自体を削除する。ということで、`HasMany::delete()`が子データを削除するので、これでOK。

## many-to-many
Eloquentモデルでは`belongsToMany`にあたる。
`belongsToMany`では`delete`ではダメ。紐付けデータはpivotテーブルにあるため、子データを削除ても紐付けだけが残ってしまう。
また、`belongsToMany`の場合子データは他のデータにも紐付いている可能性があるのでリレーションの削除で子データも削除すべきではない。

そこで`BelongsToMany::detach()`を使う。

```php
$product->categories()->detach();
```
`BelongsToMany::detach()`はリレーションを削除するだけで、子データは削除しない。

もし、子データも消し去りたければ、下記のように`delete`を呼べば良いかな。（未検証だけど）

```php
$product->categories()->delete();
$product->categories()->detach();
```

#### おまけ
余談だが、`sync([])`でも`detach()`と同じことができる。

```php
$product->categories()->sync([]);
```
matplotlibで日本語が文字化けする件

**matplotlib**で凡例やタイトルに日本語を表示させる場合**文字化け**します。
ぐぐると対策として`matplotlibrc`という設定ファイルをいじる方法が紹介されていますが、、
それでも文字化けがなおらない人向けの **苦肉の策** を紹介します。

####普通にグラフ描画→文字化けパターン
```python
import numpy as np
import matplotlib.pyplot as plt
 
left = np.array([1, 2, 3, 4, 5])
height = np.array([100, 200, 300, 400, 500])
plt.bar(left, height)
plt.show()
```
↓見事にタイトル文字化け
![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/290041/6f94fece-f12c-f6ea-ba9b-1f03ca6f2c03.png)

####対応策
↓のフォント設定変数を定義してあげて、plt.titleに渡してあげると文字化けが解消します。
Windows標準だと↓のパスがそのまま使えると思いますが、使えない人は正しくフォント設定ファイルのパスを指定してください。

```python
from matplotlib.font_manager import FontProperties
fp = FontProperties(fname=r'c:\Windows\Fonts\meiryo.ttc')
```

####修正版グラフ描画→文字化け解消パターン
```python
import numpy as np
import matplotlib.pyplot as plt  
'from matplotlib.font_manager import FontProperties'

fp = FontProperties(fname=r'c:\Windows\Fonts\meiryo.ttc')

left = np.array([1, 2, 3, 4, 5])
height = np.array([100, 200, 300, 400, 500])
plt.bar(left, height)
plt.title('日本語タイトル',fontproperties=fp)
plt.show()
```
![Figure_2.png](https://qiita-image-store.s3.amazonaws.com/0/290041/57f3eb9d-2ef8-7719-86a6-e73f80ec9248.png)

以上、
matplotlibを用いたリアルタイムプロット

matplotlibは重すぎてアニメーションプロットに向いていない気がする。

以下の記事を参考に2変数をappendしていくlistをplotする例を書いた。
https://qiita.com/hausen6/items/b1b54f7325745ae43e47

subplotを使うのとplt.pauseが味噌。

```python

pos = []
lines = []
while 1:
 # get some newdata=[x,y]
 pos.append(newdata)

 if not lines:
  fig, ax = plt.subplots(1,1)
  lines, = ax.plot([i[0] for i in pos],[i[1] for i in pos])
  ax.set_xlim((-1.5,1.5))
  ax.set_ylim((-1.5,1.5))
 else:
  lines.set_data([i[0] for i in pos],[i[1] for i in pos])
 
 plt.pause(0.001)
```
JavaScript の pop と shift の速度差

# 概要

JavaScript の `Array` にある `shift` と `pop` の速さってどれぐらい違うのか、という話が某所で出たので、適当に測ってみた。

# 結論

ブラウザによっていろいろだけど、やっぱり `pop` のほうが速い。

# 測定方法

以下の2つのソースをブラウザの開発者機能（？）のコンソールに貼り付けて何が出るかを調査した。

なんか `var` が無いとかセミコロンがないとか、いろいろ残念なソースだけど気にしない。

```javascript:shift.js
a=[1]
while( a.length<100000 ){
  a = a.concat(a);
}
t0=performance.now();
while( 0<a.length ){
  a.shift();
}
t1=performance.now();
t1-t0;
```

```javascript:pop.js
a=[1]
while( a.length<100000 ){
  a = a.concat(a);
}
t0=performance.now();
while( 0<a.length ){
  a.pop();
}
t1=performance.now();
t1-t0;
```

# 測定結果

マシンは MacBook Pro (Retina, 15-inch, Mid 2015)。
OS は macOS Mojave 10.14.1。

|ブラウザ|shift|pop|shift÷pop|
|:--|--:|--:|--:|
|Chrome70|2788|11|253|
|Opera57|2782|11|253|
|Firefox63|52|45|1.2|
|Safari12|10|3|3.3|

続いて IE と Edge のために今は亡き thinkpad 13 で。
Windows 10 pro 64bit version 1809

|ブラウザ|shift|pop|shift÷pop|
|:--|--:|--:|--:|
|Chrome70|2138|18|121|
|Firefox63|58|54|1.1|
|Edge|3066|525|5.8|
|IE11|959|39|25|

# で。

* Chrome と Opera は同じ感じ。`shift` は `pop` に比べてすごく遅い。C++ の`vector` とかと同じ感じなのかな。
* Firefox は、shift÷pop がほぼ 1 ということで、`shift` しても先頭を指すポインタが動くだけとか、そういう実装になっているに違いない。
* Safari は shift÷pop が 3.3。どんなデータ構造を採用したらこうなるんだろうか。謎。すごく速いのも気になる。
* IE と Edge のアルゴリズムは違うみたい。意外に IE の方が速かった。
curl と cron でHTTPレスポンスを監視するシェルスクリプト (結果をSlack に飛ばす)

2018.11.30 : スクリプトが要件どおり動かない箇所があったので修正
# 目標
インターネットに出られるけれど、インターネットから入ってこれないサーバの死活監視を、お気軽にしたい。

# 知識材料 
- [curl - How To Use](https://curl.haxx.se/docs/manpage.html)　対象URLを検証
- [HTTP レスポンス状態コード - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Status)　サーバが返送する状態コード
- [Man page of CRONTAB](https://linuxjm.osdn.jp/html/cron/man5/crontab.5.html)　スクリプトの定時実行

# 今回のゴール
監視対象URLに対して、下記の要件で監視できるシェルスクリプトを作成

- HTTP 200 OK 以外を返した時、エラー通知する
- １日一回、監視していることを通知するために HTTP 200 OK を返した時も通知する
- (おまけ：通知先は Slack) 

# 実践

## 監視シェルスクリプト
### 書式
**check_http.sh** [-f] *target_url*

### オプション
**-f** *target_url* から `HTTP 200 OK` が返ってきた時も、通知する

### スクリプト
```sh:check_http.sh
#!/bin/bash
## 引数が２つより多かったらスクリプトを実行しない
if [ $# -gt 2 ]; then
 exit 0
fi
## 検証するＵＲＬ
target_url=""
## 通知するかどうかフラグ
NOTIFY=0

## スクリプトへの引数を確認
for arg in "$@" ; do
  case "$arg" in
    -f)
      NOTIFY=1;;
    *)
      target_url=$arg
  esac
done

## target_url へのアクセスを試みる
message=`curl -o /dev/null -s -w %{http_code} $target_url`

## 強制送信じゃない、またはcurl 結果 http_code が 200 だったらスクリプト終了
if [[ $NOTIFY -eq 0 &&  "$message" =~ 200 ]]; then
 exit 0
fi

 ... 以下、通知先へ飛ばす処理 ...
```

### (おまけ：監視シェルスクリプト に Slack 送信部分追加)
```sh:check_http.shの続き
## 通知メッセージ整形
message="check URL:[$target_url]   status:[${message}]"
pre='```'
payload=`echo -e "> 死活監視\n${pre}\n${message}\n${pre}"`
payload="text=${payload}"

## Slack incomming webhook URL に送信
curl --data-urlencode "${payload}" \
 --data-urlencode "icon_emoji=:dizzy:" \
 --data-urlencode "username=webMaster" \
 "https://hooks.slack.com/services/TAAAAAAAA/BBBBBBBBBB/xxxxxxxxxxxxxxxxxxxxx" > /dev/null

```
## cron 設定
- 朝９時に、死活監視をしていることを通知。
- 毎分、死活監視。異常があったら通知。

```
0 9 * * * /root/cron/check_http.sh -f https://qiita.com/
*/1 * * * * /root/cron/check_http.sh https://qiita.com/
```
朝９時に実行されるコマンドには `-f` をつけて `HTTP 200 OK` が返ってきても通知する。



# まとめ
世の中に、便利なサーバー監視ツールは多数存在すると思いますが、最低限「動いているか」を確認できればいいと割りきったら、お手軽に実装できました。

POST して通知できる WebService がネットワーク内に存在していれば、slack だけでなく、いろいろな通知先に切り替えられると思います。

# 参考にさせていただきました
[cURLでHTTPステータスコードだけを取得する- Qiita](https://qiita.com/mazgi/items/585348b6cdff3e320726)
[SlackのIncoming Webhooksを使い倒す - Qiita](https://qiita.com/ik-fib/items/b4a502d173a22b3947a0)
[シェルスクリプトの基礎知識まとめ - Qiita](https://qiita.com/katsukii/items/383b241209fe96eae6e7)
SQLでCOUNTIF

ExcelのCOUNTIF関数は、条件に一致する件数をカウントする便利関数。

=COUNTIF(A1:A3, "Apple")

みたいなの。
これをSQLでやる場合、SUMとCASEを組み合わせてやる。
CASE使って、条件に一致する場合1、しない場合0としてやってその合計をSUMで出す。

| COLA      |
|:----------|
| Apple     |
| Orange    |
| Apple     |

例えば上の表TBLAからCOLA＝Appleの件数を抽出する場合、下記で出す。

*SELECT*
*SUM(CASE WHEN COLA='Apple' THEN 1 ELSE 0 END) AS CNT*
*FROM TBLA;*

| CNT      |
|----------:|
| 2     |

・・・
ツッコんだ人も多いと思うけど、この要件ならこんなことしなくてもWHEREで条件入れてCOUNTとれば事足りる。

*SELECT COUNT(\*) AS CNT FROM TBLA WHERE COLA='Apple';*


わざわざSUMとCASE使うメリットはWHEREを使わないということぐらい。
なので、異なる条件の件数を同時に取得したい、って場合に使える。
例えば全件数とCOLA=Appleの件数を1回のSQLで同時に取得したい場合、

*SELECT*
*COUNT(\*) AS ALL_CNT*
*,SUM(CASE WHEN COLA='Apple' THEN 1 ELSE 0 END) AS APPLE_CNT*
*FROM TBLA;*

| ALL_CNT   |APPLE_CNT  |
|----------:|----------:|
| 3         | 2         |

わりとSUMとCASEを組み合わせることで、1回のSQLで色々取得することが出来るようになるので便利。

※ DB2 10で確認しました
ping断を検知したときに確認したいこと5つ (Windows版）

#概要
最近まで特に問題なく動作していたWindows仮想マシンにてPing断を検知し、暫くその状態が継続しているという障害が発生。
そういう状況に陥ったときに私がいつも確認している点を5つまとめてみます。


#環境
- ESXi6.0
- vCenter Server Appliance6.0
- Windows Server 2012R2
- VMバージョン:11
- vSphere Web Client6.0

##①VMの電源状態を確認する
Ping断の連絡を受けたら、まずやることはVMの電源が落ちているのか、そうではないのか確認です。（VMの電源が落ちている状態には遭遇したことはないですが、、、）
電源に問題がない場合、vSphere Web Clientのサマリタブやトリガーされたアラームの確認を行い、重大な警告が出ていないか見てみます。

##②ネットワーク状態を確認する
Windowsキー+Rで「ncpa.cpl」を実行し、ネットワークデバイスの状態を確認します。
まれにネットワークデバイスが無効になっており繋がらなかったことがあるので注意です。（経験あり）
![pic1](https://drive.google.com/uc?export=view&id=1sSRj9Xh3NR_17lUWJx9XLX0VKNokfH4w)

##③IPアドレス・サブネットを確認する
IPアドレスが間違っていることは殆どないと思いますが、サブネットが違うことはたまにあります。（経験あり）
ネットワークに詳しくない方が設定したりすると、違うことがあるので見直すと吉です。

※Windowsキー+Rで「ncpa.cpl」を実行するか、コマンドプロンプトでipconfigコマンドを実行して確認しましょう。

##④MACアドレスに相違がないか確認する
接続しているネットワークデバイスが2つ以上ある場合、異なるMACアドレスのデバイスにIPアドレスを設定している可能性があります。
「ipconfig /all」コマンドで物理アドレスを確認し、vSphere Web ClientにVMの設定の編集を開き各ネットワークデバイスのMACアドレスと一致しているか確認しましょう。
![pic](https://drive.google.com/uc?export=view&id=1ljWJIcbZwJwOeuj_1fHJu1bdYC_4_Opy)

##⑤ファイヤーウォールが有効になっていないか確認する
ファイヤーウォールが有効になっているとPingにて疎通確認ができないので、Windowsキー+Rで「firewall.cpl」を実行し確認します。
有効になっていた場合、「ファイヤーウォールの有効化、無効化」にてファイヤーウォールが無効にしましょう。


##最後に
私が実際に遭遇したことがあるものをもとにまとめてみたのですが、他にこんな事よくあるなど教えていただけたら嬉しいです。
普段基盤を触らない方が設定をついうっかり変えてしまうこともないとは言えないので、障害が発生したときは焦りますが、1つ1つ問題を切り分けたいなと思います。（自戒を込めて）
ブラウザからGangliaのグラフ生成コマンド確認

# はじめに
　「Ganglia」「デバッグ」でインターネットを検索してみると、大体、下記のような**gmond**や**gmetad**のデバッグモードについてヒットしますが、

```bash
$ gmond --debug=2
$ gmetad --debug=2
```
　この記事では、図1のように、ブラウザ上からグラフを生成している**rrdtool**コマンドを確認する方法について書きます。

|![ganglia_web_debug1.png](https://qiita-image-store.s3.amazonaws.com/0/217037/b537fc56-fa49-387b-0611-10e0bcea33e9.png)
|:-:|
図1 - デバッグモード①

　Gangliaはいろいろなシステムの稼働監視で使われています。身近な(?)ところだと、**Amazon EMR**あたりでしょうか。あと、**HPC**システムでも見かけます。

　大分地味ですが…、こんな小ワザあるよくらいに思っていただければと思います。

# 表示方法
　表示方法は簡単です。
　まずは、ブラウザ(Chrome、Firefox、IE等)でGangliaを開きます。そこから見たいグラフを選択していき、図2のような最下層のグラフ画面を開きます。**graph.php**という画面です。URLなどで確認してください。

|![graph_num_of_sai.png](https://qiita-image-store.s3.amazonaws.com/0/217037/713f0e16-1c43-27a5-be14-2e170ecfd734.png)
|:-:|
図2 - グラフ画面

　ここで、URLの末尾に**「&debug=3」**(3以上の数字)を入力してEnterキーを押下すると、図3のような、グラフを作成しているrrdtoolコマンドが表示されます。

|![debug_num_of_sai.png](https://qiita-image-store.s3.amazonaws.com/0/217037/4b5e2900-16a4-7ee2-bd08-0cf0eb895a2a.png)
|:-:|
図3 - デバッグモード②

# ソースコード確認

　Gangliaのソースコードを確認してみると、このような記述がありました。

```/bin/bash
$ view /usr/share/ganglia-webfrontend/graph.php
```

```graph.php(抜粋)
…
1256   if ($debug > 2) {
1257     header ("Content-type: text/html");
1258     print "<html><body>";
…
```
　OSやGangliaのバージョンにより、多少違いがあるかと思います。当環境については、後述のとおりです。

# 環境
　以下、当記事で使用した環境です。
## OS、Ganglia


- OS：Ubuntu 16.04.5 LTS
- Ganglia：
  - Web Frontend version 3.6.1
  - Backend (gmetad) version 3.6.0

　Gangliaの以前のバージョン(2は確認しています)でも表示可能かと思います。
　ローカルホスト1台のみ使用。Gangliaのインストールは下記のコマンドで行いました。

```/bin/bash
$ sudo apt-get install ganglia-monitor rrdtool gmetad ganglia-webfrontend
```
## グラフ

　前述の図2で使用したグラフは、下記のように自作したものです。
　適当な振り幅を付けたかったので、ランダムな1〜6の数値でグラフ化するようにしました。

```/bin/bash
$ vi /home/ytamura/work/ganglia/gmetric_num_of_sai.sh
```

```gmetric_num_of_sai.sh
#!/bin/bash

GMETRIC=/usr/bin/gmetric

NUM_OF_SAI=$(( RANDOM % 6 + 1))  # 1-6までのランダムな数値
#echo $NUM_OF_SAI  # debug code

$GMETRIC -t int8 -n "number_of_sai" -v $NUM_OF_SAI
```

　毎分実行するため、上記のシェルスクリプトをcrontabに登録しています。

```/bin/bash
$ sudo vi /etc/crontab
```

```crontab
…
# for Ganglia
*  *    * * *   root    /bin/bash /home/ytamura/work/ganglia/gmetric_num_of_sai.sh
```

　Gangliaのフロントエンド側は特に修正等は行っていません。

以上
画像の物体検知の予測値をカラーパレット(RGB)値に置換する

備忘録として。

画像の物体検知をディープラーニングを利用して行う際、
学習モデルの予測結果(どの物体と予測したかを示すラベル値)を俯瞰して確認するために、
画像データのドットを予測結果の値に対応するカラーパレット(RGB値)に置き換える操作をしばしば行うらしい(当方、画像処理は無知)。

カラーパレットの数が増えてもコードの修正がないように済む実装方法がないか考えてみた。

## 動作検証のためのサンプルデータ

```python
import numpy as np

# 学習モデルの予測結果を想定したダミーデータ(0～4までのラベル値)
predImage = np.random.randint(0, 5, (256,512))
print(predImage)

# 0～4のラベルデータに対応するRGB値のカラーパレット
colorPalette = [[0,0,0], [1,1,1], [2,2,2], [3,3,3], [4,4,4]]
```

## 置換処理
```python

dotColor = np.reshape([colorPalette[x] for x in predImage.flatten().astype('uint8')], (predImage.shape[0],predImage.shape[1],len(colorPalette[0])))
print(dotColor)
```


## 実行結果例

### 学習モデルの出力した予測結果

```
[[2 2 3 ... 3 2 3]
 [1 4 3 ... 1 1 2]
 [1 3 4 ... 4 4 3]
 ...
 [3 4 1 ... 1 2 4]
 [1 4 3 ... 3 4 4]
 [0 1 1 ... 3 3 1]]
```

### 対応するカラーパレットのRGB値に置換した結果

```
[[[2 2 2]
  [2 2 2]
  [3 3 3]
  ...
  [3 3 3]
  [2 2 2]
  [3 3 3]]

 [[1 1 1]
  [4 4 4]
  [3 3 3]
  ...
  [1 1 1]
  [1 1 1]
  [2 2 2]]

 [[1 1 1]
  [3 3 3]
  [4 4 4]
  ...
  [4 4 4]
  [4 4 4]
  [3 3 3]]

 ...

 [[3 3 3]
  [4 4 4]
  [1 1 1]
  ...
  [1 1 1]
  [2 2 2]
  [4 4 4]]

 [[1 1 1]
  [4 4 4]
  [3 3 3]
  ...
  [3 3 3]
  [4 4 4]
  [4 4 4]]

 [[0 0 0]
  [1 1 1]
  [1 1 1]
  ...
  [3 3 3]
  [3 3 3]
  [1 1 1]]]
```
お手元のwindowsでソースコード解析ページ（htags）環境を構築する


# 概要

OSのソースコードを解析する際などに，GNU Globalを利用して，ソースコードの解析ページをブラウザで見るのが便利だったので利用していました．
しかし，会社だと勝手にWebサーバを立てるわけにもいかなかったので，ローカルマシン上に簡易にサーバ立てました．
そのときの方法をメモ程度に書きます．

# 環境

windows + Cygwin使います．
windows + MSYS使ってもできると思いますし，Unix系OSだとコンソール上で同様にできると思います．

# 構築
## Cygwin上に必要なプログラムのインストール
### パッケージのインストール

Cygwin上で以下のコマンドにより，必要パッケージをインストールします．


```sh
$ apt-cyg install perl tar gcc-core libncurses-devel make python
```

### GNU Global

以下のURLから，最新のglobal(global-X.X.X.tar.gz)をダウンロードします．
http://www.gnu.org/software/global/download.html

Cygwin上で以下のコマンドを実行し，GNU Globalをインストールします．

```sh
$ tar zxf global-X.X.X.tar.gz
$ cd global-X.X.X
$ ./configure
$ make
$ make install
```


## 解析ページの作成

例として，Linuxのソースコードの解析ページを作ります．

### 解析したいソースコード入手

以下のURLから，Linuxのソースコード(linux-X.X.X.tar.xz)をダウンロードします．
https://www.kernel.org/

以下のコマンドを実行し，ソースコードを展開します．

```
$ xz -d linux-X.X.X.tar.xz
$ tar xf linux-X.X.X.tar
```

### タグファイル，htmlファイルの作成

展開したソースコードのディレクトリ内で，以下のコマンドを実行します．（オプションは，お好みで）

```
$ cd linux-X.X.X
$ htags -afFIsngov --tabs 4 -t "Linux-X.X.X"
```



とか

```
$ cd linux-X.X.X
$ htags -afFsngovw --tabs 8
```
オプションは，お好みで

# CGIプログラム実行の準備

CGIプログラムが実行できるように権限を付与します．

```sh
$ pwd
~/linux-X.X.X
$ chmod 755 HTML/cgi-bin
$ chmod 755 HTML/cgi-bin/*.cgi
```



# Webサーバの立ち上げ

htags-severを使い，簡易にWebサーバを立ち上げます．

```sh
$ pwd
~/linux-X.X.X
$ htags-server
```


このコマンドは，Pythonを使って，簡易にWebサーバを立ち上げています．
python2.Xが使用されるのでインストールする必要がありますが，2.X系をインストールしたくない人は以下のコマンドで，Python3.X系を使用して実現することも可能です．

```sh
$ pwd
~/linux-X.X.X
$ cd HTML
$ python3 -m http.server --cgi
```

解析ページは，perlのCGIプログラムが実行されるのでcgiプログラムを実行できるようにする必要があります．
このため，CGIプログラムを実行したい場合，cgi-binディレクトリが存在するディレクトリ内でPythonのコマンドを実行する必要があります．htagsを実行したディレクトリにHTMLディレクトリが作成され，その直下にcgi-binディレクトリが作成されるので，HTMLディレクトリ内で上記のコマンドを実行します．




# 解析ページへのアクセス

ブラウザより，以下のページにアクセスし，解析ページが表示されれば成功です．

http://localhost:8000/


# 感想

Webサーバを使って環境を構築する場合と比較して，CGIプログラム実行の設定をする必要が無いのが楽でした．解析ページを見るのが自分だけなの場合などは，この方法で十分かな．
sympyで「数列の漸化式」大学入学共通テスト>平成30年度...正解等_1111＞数学Ⅱ・数学Ｂ＞第4問(1) をやってみたい

https://www.dnc.ac.jp/albums/abm.php?f=abm00035515.pdf&n=02-03_%E5%95%8F%E9%A1%8C%E5%86%8A%E5%AD%90_%E6%95%B0%E5%AD%A6%E2%91%A1.pdf#page=20

#まずは、一般項からやってみた。
偶然うごいている気がします。何かいい方法ないですか？
(参考)フィボナッチ数を求める
http://izmmr.blog.jp/archives/10271522.html
(参考)sympyの連結の使い方を教えて下さい
https://ja.stackoverflow.com/questions/33769/sympy%e3%81%ae%e9%80%a3%e7%b5%90%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%e3%82%92%e6%95%99%e3%81%88%e3%81%a6%e4%b8%8b%e3%81%95%e3%81%84/33773#33773
(参考)SymPy can print Exponentiation base and exponent?
https://stackoverflow.com/questions/53431596/sympy-can-print-exponentiation-base-and-exponent
(参考)SymPy simplify cannot 2*3**n/3 ---> 2*3**(n-1)
https://stackoverflow.com/questions/53481402/sympy-simplify-cannot-23n-3-23n-1

```fullscript.py
from sympy import *
i,n=symbols('i n',integer=True,positive=True)
def ps(e, *args):
 x = Dummy(integer=True)
 t=list(Add.make_args(e))
 for i, ti in enumerate(t):
  c, r = ti.as_coeff_Mul()
  if c.is_Rational and not c.is_Integer:
    t[i] = Mul(c.p, r, Pow(c.q, x), evaluate=False)
    t[i] = powsimp(t[i], *args).xreplace({x: -1})
  else:
    t[i] = powsimp(t[i], *args)
 return Add(*t)
def Mycoefficient(h):
    Mypoly = poly(h)
    aa = Mypoly.all_coeffs()[1]
    bb = h - aa
    n, d = fraction(bb)
    nn0 = n.as_base_exp()[0]
    nn1 = poly(nn0)
    import re
    rese1 = re.search('^Poly\((.+?),(.+?),', str(nn1)).group(1)
    rese2 = re.search('^Poly\((.+?),(.+?),', str(nn1)).group(2)
    two=sympify(sympify(rese1)/sympify(rese2))
    return two

a = Function('a')
f=a(n+1)-3*a(n)+8
fib=rsolve(f, a(n),{a(1):6})
Mypoly = poly(simplify(fib))
print("a(n)=",ps(fib))
print("解答記号:正解")
print("イ      :",Mycoefficient(fib))
print("ウ      :",simplify((fib-Mypoly.all_coeffs()[1])/Mycoefficient(fib)).as_base_exp()[0])
print("エ      :",Mypoly.all_coeffs()[1])
# a(n)= 2*3**(n - 1) + 4
# 解答記号:正解
# イ      : 2
# ウ      : 3
# エ      : 4
```

#正規表現で、文字列をあてた方がわかりやすいですか？
募集中

#解答欄の形から、値が1桁の整数になることはわかるわけです・・・ということは、0から9まで全部試してしまえばいいのではないでしょうか。
(参考)2015年センター試験数学IAを全てプログラム(Python)で解く
https://qiita.com/Akai_Banana/items/b328fe0116d248127a36
募集中

# 問題文の手順通りにやってみたい。
ア:
募集中
【Android】adbコマンド備忘録

なにかとadbコマンドを使ったので備忘録。
作業環境はwindows10です。

# adbコマンドのpathを通す
Android Studioインストール時に一緒に入れてたplatform-toolsを使いました。
デフォルトで入れたらたぶん↓のはず
C:\Users\ユーザ名\AppData\Local\Android\Sdk\platform-tools

1. 「コントロールパネル」を開く
2. 「システム」をクリック
3. 「システムの詳細設定」をクリック
4. 「環境変数」をクリック
5. 「システム環境変数」の「Path」を選択して「編集」をクリック
6. 「新規」を選択してplatform-toolsフォルダの場所(上で書いたやつ)を入力
7. 「OK」をクリック

これでコマンドプロンプトでadbコマンドが使えるようになります。

## 参考
【Windows 10】ADBコマンドを使えるようにする方法！Platform-Tools編 https://ahiru8usagi.hatenablog.com/entry/Platform-Tools_Install

# apkファイルをAndroid実機にインストールする
公開用apkの最終確認で使ってます。

```
adb install -r XXXXX.apk
```

## 参考
apkファイルをAndroid端末（実機）にインストールする方法｜Android｜モバイル／スマートフォン｜PHP & JavaScript Room http://phpjavascriptroom.com/?t=mobile&p=android_apk_install

# Android実機からapkファイルを抽出する
パッケージ名はPlayストアの各アプリのURLのidの部分で分かります。
ttps://play.google.com/store/apps/details?id=**com.google.android.youtube**

まずはapkファイル名を抽出します。

コマンドプロンプトを開きます。Cortanaの検索欄にcmdって入れたら候補に出してくれます。

```
>adb shell pm list packages -f | findstr com.google.android.youtube
package:/data/app/(省略)/base.apk=com.google.android.youtube
```

> 2018/12/02 追記
> コメントいただいたapkファイルパス取得方法を追記しました↓

下記のコマンドでもapkファイル名を取得できます。

```
>adb shell pm path com.google.android.youtube
package:/data/app/(省略)/base.apk
package:/data/app/(省略)/split_config.ja.apk
```

apkファイルを抽出します。

```
>adb pull /data/app/(省略)/base.apk
/data/app/(省略)/base.apk: 1 file pulled. XXX MB/s (YYY bytes in ZZZs)
```

## 参考
端末にインストールされているアプリファイル(apk)を抽出する方法 https://andmem.blogspot.com/2015/06/android-application-apk-pull.html#RAncTXL.twitter_responsive



※この記事は、[アウトプットネタ棚卸し Advent Calendar 2018](https://dosomething.hatenablog.com/entry/2018/12/01/000000) 2日目の記事も兼ねています。
Chainer の extension ~精度更新時のモデルの保存・学習率の変化のさせ方~

## はじめに

よく使いそうなのに意外とサンプルが見つからない Chainer (Trainer) の extension の使い方を2つ載せておきます（要素要素はすべてドキュメントに書いてありますが、まとまった形のサンプルが意外と見つからなかったので...）。

* **Test-accuracy が更新されたときにモデルを保存する**
* **学習率を任意に変化させる**

Chainer v4.0.0/v5.0.0 で確認しています。


## Test-accuracy が更新されたときにモデルを保存する

[MaxValueTrigger](https://docs.chainer.org/en/stable/reference/generated/chainer.training.triggers.MaxValueTrigger.html#chainer-training-triggers-maxvaluetrigger) を使って、accuracy が更新されたときに [snapshot_object](https://docs.chainer.org/en/stable/reference/generated/chainer.training.extensions.snapshot_object.html#chainer-training-extensions-snapshot-object) extension を呼び出す trigger を作ってあげます。

下の例では、1エポックごとに、現時点で最も accuracy の高いモデルを `best_model` というファイル名で保存します。

```python
from chainer.training import extensions, triggers

trigger = triggers.MaxValueTrigger('validation/main/accuracy', trigger=(1, 'epoch'))
trainer.extend(extensions.snapshot_object(model, filename='best_model'), trigger=trigger)
```

## 学習率を任意に変化させる

下の例では、1エポックごとにcosine関数を使って学習率を変化させていますが、`__calc_cosine_lr()`を適当に置き換えれば学習率を任意に制御できます。


```python
from chainer.training import extension

class LrSceduler(extension.Extension):

    trigger = (1, 'epoch')

    def __init__(self, base_lr, epochs, optimizer_name='main', lr_name='lr'):
        self._base_lr = base_lr
        self._epochs = epochs
        self._optimizer_name = optimizer_name
        self._lr_name = lr_name

    def __call__(self, trainer):
        optimizer = trainer.updater.get_optimizer(self._optimizer_name)
        lr = self.__calc_cosine_lr(trainer)
        setattr(optimizer, self._lr_name, lr)

    def __calc_cosine_lr(self, trainer):
        import math
        e = trainer.updater.epoch
        #iter = trainer.updater.iteration # If you want to use current total iterations to compute lr.
        lr = 0.5 * self._base_lr * (math.cos(math.pi * e / self._epochs) + 1.)
	
        return lr

trainer.extend(LrSceduler(base_lr=0.01, epochs=100))
```

なお、定番の、一定エポック学習した後にステップ状に学習率を変化させるなら、
[ExponentialShift](https://docs.chainer.org/en/stable/reference/generated/chainer.training.extensions.ExponentialShift.html#chainer.training.extensions.ExponentialShift) extension を使うのが良いです。下は、30エポック目で学習率を0.1倍に、60エポック学習した後にさらに0.1倍にする例です。

```python
from chainer.training import extensions, triggers

trigger = triggers.ManualScheduleTrigger([30, 60], 'epoch')
trainer.extend(extensions.ExponentialShift('lr', 0.1), trigger=trigger)
```

## おわりに

また見つかったら追記します。