OmniAICreator/Qiita-1.07M huggingface dataset:
apkを狙い撃ちでadb pullする

参考 : https://stackoverflow.com/questions/29992225/adb-copy-apk-from-system-app-using-pull-command

（´-`）.｡oO（タイトルのセンスが…orz）

# 狙い撃ちする

## パッケージ名を調べる

```bash
# パッケージ名一覧から探す
$ adb shell pm list packages

# grepしても良いでしょう
$ adb shell pm list packages | grep com.example.hoge
package:com.example.hoge.fuga
```

## 居所を調べる

```bash
$ adb shell pm path com.example.hoge.fuga
package:/data/app/com.example.hoge.fuga-1/base.apk
```

## 撃つ

```bash
$ adb pull /data/app/com.example.hoge.fuga-1/base.apk
/data/app/com.example.hoge.fuga-1/base.apk: 1 file pulled. 5.6 MB/s (15269701 bytes in 2.606s)
```

pullできました！

# 一網打尽

すみません、シェルスクリプトで書こうとしたんですがうまく書けず、rubyに逃げました。 :bow_tone1: 

```ruby:./apk-collector.rb
list = `adb shell pm list packages | sed -e 's/package://g'`.split("\r\n")

# Tip: 同様にgrepしても良いでしょう
# list = `adb shell pm list packages | grep com.example | sed -e 's/package://g'`.split("\r\n")


list.each {|package|
  path = `adb shell pm path #{package}`.sub(/package:+/, '').sub(/\r\n+/,'')
  `adb pull #{path}`
}
```

```bash
$ ruby ./apk-collector.rb
```

これで実行したディレクトリにapkが転がると思います。

以上
例外をcatchして更にthrowする場合は前の例外をセットする癖をつける

自分が忘れがちなのでメモ。
スタックトレースで発生源までたどれるようになります。

http://php.net/manual/ja/class.exception.php

```php
public __construct ([ string $message = "" [, int $code = 0 [, Throwable $previous = NULL ]]] )
```
$previousを設定する

```php
function base_test()
{
    try
    {
        // エラー判定省略
        throw new RuntimeException('エラー詳細1');

        // エラー判定省略
        throw new RuntimeException('エラー詳細2');

        // エラー判定省略
        throw new RuntimeException('エラー詳細3');
    }
    catch (RuntimeException $exception)
    {
        throw new RuntimeException('エラーが発生しました', 0, $exception);
    }
}

function test()
{
    try
    {
        $this->base_test();

        return true;
    }
    catch (RuntimeException $exception)
    {
        // スタックトレースをログに残す
        error_log($exception, 0);
        return false;
    }
}
```
MySQLで指定年月日をリストで取得する

MySQLでその月の日のリストを取得したい場合は、
`information_schema`テーブルを使えば取得できます。

このテーブルに、年月日などの情報を持っているので、うまくJOINすればいい感じですね。

[ブログ始めました](https://nnahito.com/)。
そこに[サンプルコード](https://nnahito.com/article/4)もおいてます。
elasticsearch-rubyで複数のホストを設定する

# 概要
Elasticsearchクラスタを立てたので、いい感じにクエリの負荷が分散してほしい。
railsからクエリを投げるシステムを構築しているので、rubyかrailsでそういう便利機能を実装したgemがあるとうれしい。

# ロードバランサはいらない？
https://discuss.elastic.co/t/easticesearch/81547/2
「ロードバランサーとかを用意しなくても、大抵のElasticsearchのクライアントライブラリであれば複数のIPアドレスを指定してラウンドロビンでやってくれる」

らしいです。

# elasticsearch-ruby
https://github.com/elastic/elasticsearch-ruby

このgemを使ってElasticsearchのクライアントを初期化する際、複数のホストを設定できる。

``` test.rb
hosts = "192.168.0.3", "192.168.0.4", "192.168.0.5"
@client = Elasticsearch::Client.new(hosts: hosts, randomize_hosts: true)
```

randomize_hosts
これを入れておくと接続の度にランダムでホストが選ばれるっぽい。


# 感想
・AWSのVPC上に立てるのであれば、簡単にELBが立ち上がるのでそんなにメリットはなさそう。
・Elasticsearchのクラスタ上にあるホストをアプリケーションが知っていないといけない。
・高度な負荷分散をやってくれるわけではない。
加速度センサーの値から速度と変位を求める

#概要
加速度センサーの値から速度と変位を求めるのは、
一筋縄ではいかないようです。
誤差などの問題もありますが、現在とっているアプローチを備忘録として記載します。

##アプローチ
1.ローパスフィルターでノイズを取り除く
2.ハイパス・フィルターで重力加速度の影響を取り除く
3.加速度を積分して速度を出す
4.速度を積分して変位を出す

###コード
```C++:main.cpp
#include <iostream>

int main(int argc, const char * argv[]) {

    float data[5] = {0.218094, -0.001328, -0.001495, -0.002014, -0.000824};
    int i = 0;
    
    // ローパスフィルターの係数(これは環境によって要調整。1に近づけるほど平滑化の度合いが大きくなる)
    float filterCoefficient = 0.9;
    float lowpassValue = 0;
    float highpassValue = 0;
    
    // 時間差分
    float timeSpan = 0.1;
    // ひとつ前の加速度
    float oldAccel = 0;
    //　加速度から算出した速度
    float speed = 0;
    // ひとつ前の速度
    float oldSpeed = 0;
    // 速度から算出した変位
    float difference = 0;
    
    
    for (i = 0; i < 5; i++) {

        // ローパスフィルター(現在の値 = 係数 * ひとつ前の値 ＋ (1 - 係数) * センサの値)
        lowpassValue = lowpassValue * filterCoefficient + data[i] * (1 - filterCoefficient);
        // ハイパスフィルター(センサの値 - ローパスフィルターの値)
        highpassValue = data[i] - lowpassValue;
        
        // 速度計算(加速度を台形積分する)
        speed = ((highpassValue + oldAccel) * timeSpan) / 2 + speed;
        oldAccel = highpassValue;
        
        // 変位計算(速度を台形積分する)
        difference = ((speed + oldSpeed) * timeSpan) / 2 + difference;
        oldSpeed = speed;
        
        
        printf(" %f", difference);
        
    }
            
}

```

###台形積分法
積分の計算方法のひとつです。
積分は、ざっくり言うと「グラフの曲線の面積を、細切れにして足し合わせることで算出する」という方法です。

台形積分法は、「あれ、細切れにしたら台形になるんじゃね？」ということで、
我々になじみの深い台形の面積を出して、足し合わせることで積分する方法です。

![台形積分.jpg](https://qiita-image-store.s3.amazonaws.com/0/26944/a68cae9a-bbbd-35c1-dcaf-263475d90170.jpeg)

台形の面積の公式は、
**　(上辺 + 下辺) × 高さ /  2 　**
ですね！
capistrano bundle install時のエラーの対処法(invalid byte sequence in US-ASCII)

railsでcapistrano3実行時のエラー。

```
bundle stderr: /home/ubuntu/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/bundler-1.16.0/lib/bundler/dsl.rb:586:
in `parse_line_number_from_description': invalid byte sequence in US-ASCII (ArgumentError)
```
どうもローカルのMacの言語設定とサーバーの言語設定に差異があるとでるらしい。

- ローカルの言語設定
$ locale
LANG="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_CTYPE="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_ALL=

- サーバーの言語設定
$ locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE=ja_JP.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

特にLC_ALLの言語設定が優先されるらしいので、LC_ALLをきちんと設定する。

## 解決
サーバー側で
$ sudo vi /etc/environment

以下を追加。
```
export LANG=en_US.utf-8
export LC_ALL=en_US.utf-8
```

$ locale
でエラーもなくなった。

## 参考
[Capistranoデプロイ時にinvalid byte sequenceエラーになる - Qiita](https://qiita.com/yamy/items/d42b63956b9541cddfdb)
plotly.jsのメモ

JavaScript用のグラフツールのほとんどがビジネスマンが使うような誇張クソグラフしか作ることができず、まともに使えるのはgoogle chartと、[plotly.js](https://plot.ly/javascript/)のみ、うちgoogle chartはライセンスが厳しくオフライン利用不可で、MITライセンスのplotly.jsのみがまともという結論に至ったため、使い方のメモを取っていく。

plotly.jsを使いたいけど使い方がわからんという話はコメント欄に書いていただけると調べてメモを追加するかも


基本プロットと基本機能のリファレンス
---------------------------------

* [グラフ全体のサイズ](https://plot.ly/javascript/setting-graph-size/)
* [軸](https://plot.ly/javascript/axes/)
  * [対数軸](https://plot.ly/javascript/log-plot/)
  * [範囲指定](https://plot.ly/javascript/axes/#setting-the-range-of-axes-manually)
* [エラーバーの付け方](https://plot.ly/javascript/error-bars/)


個別例
------

### 複数系列あり、非対称エラーバー付き棒グラフの例

```JavaScript
var trace1 = {
  x: ['Trial 1', 'Trial 2', 'Trial 3'],
  y: [3, 6, 4],
  name: 'Control',
  error_y: {
    type: 'data',
    symmetric: false,
    array: [1, 0.5, 1.5],
    arrayminus: [0.5, 1.5, 1],
    visible: true
  },
  type: 'bar'
};
var trace2 = {
  x: ['Trial 1', 'Trial 2', 'Trial 3'],
  y: [4, 7, 3],
  name: 'Experimental',
  error_y: {
    type: 'data',
    symmetric: false,
    array: [0.5, 1, 2],
    arrayminus: [2, 1, 1],
    visible: true
  },
  type: 'bar'
};
var data = [trace1, trace2];
var layout = {barmode: 'group'};
Plotly.newPlot('myDiv', data, layout);
```

### 画像でプロットを取得
[説明書](https://plot.ly/javascript/static-image-export/)
[この更新](https://github.com/plotly/plotly.js/pull/446)

```JavaScript
var id = 'plotarea';
Plotly.newPlot(id , data, layout);
var element =  document.getElementById(id);
Plotly.Snapshot.downloadImage(element , { filename: "name", format: 'png'}); // width, heightも可
```
怠惰な FizzBuzz を作ってみた (Python 版)

# はじめに

先日 [怠惰な FizzBuzz を作ってみた](https://qiita.com/QUANON/items/c77c22b910651b54fe24) という、Ruby で FizzBuzz を実装する記事を投稿しました。今回はそれを Python で実装します。

Ruby 版では怠惰さを [Enumerator::Lazy](https://docs.ruby-lang.org/ja/latest/class/Enumerator=3a=3aLazy.html) で実現しましたが、Python 版では [ジェネレータ](https://docs.python.jp/3/glossary.html#term-generator) を利用します。

# 実装

[itertools](https://docs.python.jp/3/library/itertools.html) 万歳 :innocent: 

```fizzbuzz.py
import itertools


class FizzBuzzRule(object):
  @classmethod
  def say(cls, word):
    return cls(word)

  def __init__(self, word):
    self.word = word

  def for_multiples_of(self, number):
    return itertools.cycle((*itertools.repeat('', number - 1), self.word))


numbers = itertools.count(1)
fizzes = FizzBuzzRule.say('Fizz').for_multiples_of(3)
buzzes = FizzBuzzRule.say('Buzz').for_multiples_of(5)

fizzbuzz_generator = (f'{fizz}{buzz}' or n
                      for n, fizz, buzz
                      in zip(numbers, fizzes, buzzes))


if __name__ == '__main__':
  for word in itertools.islice(fizzbuzz_generator, 30):
    print(word)
```
```shell-session
$ python fizzbuzz.py
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
```
Android Studio 2.3 から 3.0へMigration（主にFlavor）について


Kotlinも正式に採用されたようなので、Android Studioもアップデートしようかと思って軽い気持ちでやったら、案の定エラーになったのでとりあえずビルドが出来るところまでメモしておきます。

## 事象

>
Error:All flavors must now belong to a named flavor dimension.
The flavor 'flavor_name' is not assigned to a flavor dimension.

上記の様なエラーメッセージがでて、コンパイルが通らなくなりました。

## 原因

>
The plugin now requires that all flavors belong to a named flavor dimension—even if you intend to use only a single dimension. Otherwise, you will get the following build error:

という事で、記述方法がかわりFlavor名を明示的に指定する必要があるとの事です。

## 解決方法

### before

```app/build.gradle
android{
    productFlavors {
        www {

        }
        dev {
            applicationIdSuffix = '.dev'
        }
        stg {
            applicationIdSuffix = '.stg'
        }
    }
}
```
### after

```app/build.gradle
android{

    flavorDimensions "environment"

    productFlavors {
        www {
             dimension "environment"
        }
        dev {
            applicationIdSuffix = '.dev'
            dimension "environment"
        }
        stg {
            applicationIdSuffix = '.stg'
            dimension "environment"
        }
    }
}
```

この様にflavorDimentionsを明示的に宣言します。

## :paperclip: Refs

- [Migrate to Android Plugin for Gradle 3.0.0
](https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html?utm_source=android-studio#variant_aware)
- [似たようなAndroidアプリを同一端末にインストール出来るようにする](https://qiita.com/mfks17/items/52fa8904b6d16bded0b5#android-studio-3%E3%81%8B%E3%82%89)
NativeScriptからNSDictionaryをスマートに扱う

NativeScriptからNSDictionaryを使う方法を見ていきましょう。

# 方法1. NSMutableDictionaryを使う

NSMutableDictionaryのオブジェクトを生成して、setObjectForKeyメソッドで一つずつ値を追加していきます。

```ts
		let attr = NSMutableDictionary.alloc<string, any>().init();

		attr.setObjectForKey(UIColor.whiteColor, NSForegroundColorAttributeName);
		attr.setObjectForKey(UIColor.blackColor, NSStrokeColorAttributeName);
		attr.setObjectForKey(-1.0, NSStrokeWidthAttributeName);

		let attrStr = NSAttributedString.alloc().initWithStringAttributes("白抜きテキスト", attr);
```

# 方法2. オブジェクトリテラルを使う

NativeScriptでは、JavaScriptのオブジェクトをNSDictionaryに変換してくれるMarshalという機能があります。（ただ、この機能について公式のどこにも明確に書かれていないようなのですが...) この機能を使うと、オブジェクトリテラルの形でNSDictionaryを定義できます。

```ts
		let txt = NSMutableAttributedString.alloc().initWithStringAttributes("白抜きテキスト", <any>{
			[NSForegroundColorAttributeName]: UIColor.whiteColor,
			[NSStrokeColorAttributeName]: UIColor.blackColor,
			[NSStrokeWidthAttributeName]: -1.0
		});
```
コチラのほうが、コンパクトで直感的ですね。

# 参考
NativeScriptのMarshalについて
https://docs.nativescript.org/runtimes/ios/marshalling/marshalling-overview

JavaScript Object to NSDictionaryについて
https://github.com/NativeScript/ios-runtime/issues/54
３つめの投稿で、開発者からJS Object -> NSDictionaryについて簡単に説明されています。
複数のsagaを一つのrootSagaにまとめて使う


# 概要
* sagaを複数のファイルで書いといて一つのrootSagaにまとめて使うなら、各ファイルで、effectをexportし、rootSaga内で、yield allすればOK

# 背景
* reducerは複数のファイルで個々に管理して、`combineReducers`でまとめてexportするのが主流
* sagaでも同じように、関心事に複数のファイルで分けて管理して、まとめてexporとして使いたい

# 環境
* redux-saga: 0.16.0


# 手順
1. item.jsとregsiter.jsでsagaを用意し、各ファイル毎にeffetctを配列にまとめてexportする
2. index.jsでeffetcの配列をimportしてyield allでrootSagaにまとめる

## item.jsとregsiter.jsでsagaを用意し、各ファイル毎にeffetctを配列にまとめてexportする
ポイントは、effectを配列としてexportするところ。


```sagas/item.js
// 省略

const itemSagas = [
  takeLatest(AA_AAA, aFlow),
  takeLatest(BB_BBB, BFlow),
]
export default itemSagas;

```

```sagas/register.js
// 省略

const registerSagas = [
  takeLatest(CC_CCC, cFlow),
  takeLatest(DD_DDD, dFlow),
]
export default registerSagas;

```

## index.jsでeffetcの配列をimportしてyield allでrootSagaにまとめる
ポイントは、配列をspreadで展開（`...`のこと）してyield allするところ

```sagas/index.js
import itemSagas from './item'
import registerSagas from './register'

// 省略

export default function* rootSaga() {
  yield all([
    ...itemSagas,
    ...registerSagas,
  ])
}
```

完了!

## （参考）
まとめたrootSagaを使うまでの方法も参考までに示します。至って普通です。

### こんな感じでconfigureStoreを用意して

```store/configureStore.js
import {createStore, applyMiddleware} from 'redux';
import rootReducer from '../reducers';
import createSagaMiddleware from 'redux-saga'
import rootSaga from '../sagas/index'
const sagaMiddleware = createSagaMiddleware()

const configureStore = initialState => {
  const store = createStore(
    rootReducer,
    initialState,
    applyMiddleware(sagaMiddleware)
  );
  sagaMiddleware.run(rootSaga)
  return store
};

export default configureStore

```

### こんな感じでアプリに統合すればOK

```packs/app_root.jsx
import React from 'react'
import ReactDOM from 'react-dom'
import {Provider} from 'react-redux';
import configureStore from '../store/configureStore';
import App from '../containers/App'

const store = configureStore();

document.addEventListener('DOMContentLoaded', () => {
  ReactDOM.render(
    <Provider store={store}>
      <App/>
    </Provider>,
    document.getElementById('app_root'),
  )
});
```

# 参考
* https://github.com/redux-saga/redux-saga/issues/160
Android 8.0.0(Oreo) Emulator build 手順

Android 8.0.0(Oreo)のframeworkの調査を行う為、Emulator buildを行ったので、
その手順をメモ。

# build環境構築
[The Android Source Code](https://source.android.com/setup/)
を参考に構築してください。

# Android 8.0.0(Oreo) のSource Code取得
どこかの作業フォルダー内で下記コマンドを実行。

```
$ repo init -u https://android.googlesource.com/platform/manifest -b android-8.0.0_r34
$ repo sync -j12
```

# 現状の内容ではEmulatorが起動しない為、コードを修正
1.Emulator用のライブラリ読み込みパス修正Patch
https://android.googlesource.com/platform/frameworks/native/+/3adf9e1403bee30d1ef79c3a8cf310292df4745f
のpatchを適用する必要があります。
下記コマンドでPatchを適用してください。

```
$ cd frameworks/native
$ git fetch https://android.googlesource.com/platform/frameworks/native refs/changes/50/471850/1 && git cherry-pick FETCH_HEAD
$ cd ../../
```

2.設定アプリを開くとクラッシュする為クラッシュメソッドを呼ばないように修正
packages/apps/Settings/src/com/android/settings/wfd/WifiDisplaySettings.javaの
public static boolean isAvailable(Context context)内のontext.getSystemService(Context.WIFI_P2P_SERVICE)を呼ばないように修正してください。

```WifiDisplaySettings.java
public static boolean isAvailable(Context context) {
    return context.getSystemService(Context.DISPLAY_SERVICE) != null
            && context.getSystemService(Context.WIFI_P2P_SERVICE) != null;
}
```

#ビルド手順
下記コマンドでビルドを行います。

```
$ source build/envsetup.sh
$ lunch aosp_x86-eng
$ make -j4
```

#Emulator起動
下記コマンドで起動。

```
$ emulator
```

#Android StudioのEmulatorで起動する方法
Android SDK Path(Android SDK Location)内の"system-images/android-26/google_apis/x86"
の中にある
・ramdisk.img
・system.img
・userdata.img
をビルドしたイメージで上書きする。
AVD ManagerのCreate Virtual Deviceで上書きしたイメージで作成し起動する。
AWSのメンテナンス[EC2編]

#AWSからのメンテナンス通知

AWSからたまに送られてくる以下のような定期メンテナンス実施のアナウンスメール。

```
Dear Amazon EC2 Customer,

One or more of your Amazon EC2 instances is scheduled for maintenance on 2017-**-** for 2 hours starting at 2017-**-** 12:00:00 UTC UTC. During this time, the following instances in the ******* region will be unavailable and then rebooted:

************

Your instances will return to normal operations after maintenance is complete and all of your configuration settings will be retained. To continue normal operation and avoid any unavailability or reboots during this time, you can migrate the instances listed above to replacement instances. Replacement instances will not be affected by this scheduled maintenance. Otherwise, no action is required on your part.

以下省略
```

AWSではEC2群を頻繁にアップデートしており、多くのパッチやアップグレードの適用を行なっています。
今回も指定期間のうちにメンテナンスをするから、インスタンスが再起動されるよ。と言うお知らせでした。

再起動にかかる時間は通常、数分程度ですが少しでもサービスが止まってしまうと困る！と言う場合は指定のメンテナンス期間より前の任意の時間で再起動を行なってしまえばOKです。

#メンテナンス対象はコンソールからも確認可能

コンソール＞EC2＞左側のメニュー上部の[イベント]

![EC2メンテナンス01.png](https://qiita-image-store.s3.amazonaws.com/0/174392/3a2a4da8-330f-44eb-5ff8-9c20e721ba38.png)

現在予定されているメンテナンス対象が表示されます。

![EC2メンテナンス02.png](https://qiita-image-store.s3.amazonaws.com/0/174392/f622a8c7-5e50-7d51-5d58-1101e3f387d1.png)

予定の他に、進行中や完了ステータスになっているものも確認できます。
指定期間に実行されたインスタンスの状況も確認できるので安心です！

![EC2メンテナンス03.png](https://qiita-image-store.s3.amazonaws.com/0/174392/291e2d32-acb7-be8e-4ef0-fa3726d5fe93.png)


#システムリブートとインスタンスリブート

メンテナンスの内容によって、システムリブートとインスタンスリブート対応の仕方が少し異なります。
予定されたメンテナンスがどちらに該当するかはイベントの[イベントタイプ]から確認可能です。

システムリブートの場合は、stop　→　start
以下のように、インスタンスを完全に停止させてから開始します。

![EC2メンテナンス04.png](https://qiita-image-store.s3.amazonaws.com/0/174392/3974d412-02c1-5d3c-6c3f-e9a00c4bc0dd.png)

インスタンスリブートの場合は、再起動でOKです。
が、stop　→　startの対応しておけばより確実。
逆引きプログラマブルGit (WIP)

# ワークツリーにおける情報取得

* 現在のブランチ名を取得

```
> git symbolic-ref --short HEAD
master
```

(`git rev-parse --abbrev-ref HEAD`とかもあるけど、どれが最適?)

* HEADのcommit idを取得

```
> git rev-parse HEAD
7c6a8d55d5a950ceab260499efb3038f86043fe1
```

* ブランチ/タグ等の一覧  
  `git for-each-ref --format='%(refname)'` _PATTERN_
    * ローカルブランチ一覧  
      `git for-each-ref --format='%(refname)' refs/heads`
    * リモートブランチ一覧 (リモート名が`origin`の場合)  
      `git for-each-ref --format='%(refname)' refs/remotes/origin`

* HEADのタグ名一覧を取得

```
> git tag --contains
test-tag1
test-tag2
```
(`--contains`と`--points-at`の違いは?)

* タグの有無をチェック

```
if git rev-parse "タグ名" >/dev/null 2>&1; then
  echo "指定のタグが有る"
else
  echo "指定のタグが無い"
fi
```

# リモートリポジトリに関する情報取得

* リモートのブランチ一覧

```
> git ls-remote URL
7c6a8d55d5a950ceab260499efb3038f86043fe1        HEAD
892061636bbb85dba1d265c6ac36d595d64eda17        refs/heads/develop
7c6a8d55d5a950ceab260499efb3038f86043fe1        refs/heads/master
668e2255d29e4078b1163f3132a353572037dfff        refs/tags/release-20171117_01
```
(ブランチ名のみは拾えない?)

* リモート名に対応するURLの取得 (リモート名の設定有無にも使用可能)

`git config remote.`_REMOTE_NAME_`.url`

```
> git config remote.origin.url
https://github.com/vmi/selenese-runner-java.git
```

* アップストリーム名の取得

```
> git rev-parse --abbrev-ref '@{upstream}'
origin/master
```

# ローカルリポジトリの操作

* ブランチをチェックアウトせずにリモートと同期する

`git update-ref refs/heads/`_BRANCH_NAME_` refs/remotes/`_REMOTE_NAME_`/`_BRANCH_NAME_  

```
> git update-ref refs/heads/master refs/remotes/origin/master
```
CLA not sighed yet が消えなかったが、解決してプルリクできた件


タイトルで完結してまして、経過は以下で見れます。
https://github.com/node-red/node-red-web-nodes/pull/201

以下、背景を書いておきます。


##プルリク送った
[Node-RED](https://nodered.org)というサービスで使えるaws用のnode（[node-red-node-aws](https://flows.nodered.org/node/node-red-node-aws)）に不具合があったので、プルリク送ってみました。

##CLA not signed yet
そしてプルリク先を見てみると、こんな表示が
![cla_not_signed_yet.png](https://qiita-image-store.s3.amazonaws.com/0/1533/6e1970ef-5b55-70c6-47b2-0266c284ef0d.png "cla_not_signed_yet.png")

CLA not signed yet ということなので、このマークをクリックすると[こんなページ](https://cla.js.foundation/node-red/node-red-web-nodes?pullRequest=201)に遷移します。


##サインしたが消えないマーク
要はCLA（Contributor License Agreement）というのにサインしてね、ということです。簡単にしか内容見てないですが、コントリビュータになるにあたってサインしなきゃいけない権利関係のお話かなと、理解して、サインしました。

ところが、サインしても上のマークが消えない。
で、調べたら同様の事例はあって、行き着くのがemailアドレスを合わせろという話。

##メールアドレスを合わせる

確かにgithubで登録しているメインのアドレスと、CLAでサインしたアドレスが違っていたので、github側のメインアドレスを修正してサインインし直しました。
（ちなみにCLAにはサインアウト機能が見当たらなかったので、cookie消してやり直してます（汗））

ところがそれでもマークが消えない。はて。。。と思っていると、コメントが助けてくれて判明。要は、
`commit情報のメールアドレスとCLAアドレスが違う`
ということでした。

##commmit情報にもメールアドレスが紐付いている
手元でgit logして確認すると、確かにコミット情報のアドレスが個人用のつもりが、会社用のアドレスになってました。

なので、
`git config user.email メールアドレス`

で、まず、CLAの（githubの）メールアドレスに合わせて

`git reset --hard HEAD^`

からコミットし直してプルリクし、無事マークが消えました。

![スクリーンショット 2017-11-17 10.57.34.png](https://qiita-image-store.s3.amazonaws.com/0/1533/0cc17645-7077-65d8-d859-95a4ac3ff550.png "スクリーンショット 2017-11-17 10.57.34.png")

あとは、マージされるのは待つだけですね。

追記）
無事マージされました
https://github.com/node-red/node-red-web-nodes/pull/201
日付、時間、曜日の表示

## 概要
アプリにおいて日付や時間の表示はだいたいやるので
その時に毎回どうやるんだっけ？とならないように備忘録です。

## DateFormatterについて
日付、時間表示をするためにはDateFormatterを利用する。

#### 生成について
ただ、このDateFormatterは生成コストが実は高いのでTableViewのCell上で毎回初期化するのはあまり適切ではない。
なので初期化は1度だけ行い、あとはその初期化したインスタンスを使い回し必要に応じてdataFormatを変えると良いです。

#### localeの設定について
localeは基本的にen_US_POSIXを指定しておくと良いと思います。
これは、localeによってユーザーが自ら西暦/和暦や24時間表示/非24時間表示の設定によって取得されるデータが変わってしまうことがあります。
ex_US_POSIXを指定しておけばユーザーの環境によって表示が崩れることはなくなります。
ただ、曜日の表示をしたい時にはこれだとうまくいかないパターンもあるので、その際には別のlocaleを当てます。

```Date.swift
public var dateFormatter: DateFormatter {
    let dateFormatter = DateFormatter()
    dateFormatter.locale = Locale(identifier: "en_US_POSIX")
    dateFormatter.timeZone = TimeZone(abbreviation: "JST")
    return dateFormatter
}
```

## よくある日付、時刻表示のやり方
dateFormatの指定の仕方だけ書きます。

#### 年を表示する
表示したい形式 = 2017年

```
dateFormatter.dateFormat = yyyy
```

#### 日付を表示する
表示したい形式 = 11/17

```
dateFormatter.dateFormat = MM/dd
```

#### 時間を表示する
表示したい形式 = 11:17

```
dateFormatter.dateFormat = HH:mm
```

#### 曜日を表示する
表示したい形式 = 11/17(金)

(金)と日本語で出すのは、localeがen_US_POSIXだと実現できないのでその時はja_JPを指定しましょう

```
formatter.locale = Locale(identifier: "ja_JP")
formatter.dateFormat = "MM/dd(EEE)"
```
三項演算子 理解に苦労したお話

### 概要：三項演算子での記述でつまずいた点を記述する。

- 三項演算子を使用して修正を依頼されたコードの意味が理解できない。

修正前のコード


```erb:tops_controller.rb
  def set_varriable
    @language = params[:la]
    action = params[:action]
    return render "tops/en/#{action}" if @language.try(:include?, 'en')
    render :"#{action}"
  end
```  
viewから送られてくるparams[:la]を判断してparams[:la]が'en'を含んでいればrenderで"tops/en/#{action}"に遷移する。
それ以外の場合はrenderで"#{action}"に遷移するという内容であった。
しかし`@language.try(:include?, 'en')` と書くより `@language == 'en'`で判断した方がいいということで下記三項演算子での記述に変更することになった。

```
@language = params[:la] ? params[:la] : 'ja'
```

ここで疑問が。。。三項演算子って私の認識ではこうだったんです。

**条件式 ? 真の時の値 : 偽の時の値**

上記の書き方は`@language = params[:la]`の部分が果たして条件式なのだろうか？？？
(正確にはparams[:la]のみが条件式　↓下記コメント参照)

困ったのでrails consoleで確認する。

```ruby:terminal
[1] pry(main)> @language = nil ? 'en' : 'ja'
=> "ja"
[2] pry(main)> @language = nil ? 'ja' : 'en'
=> "en"
[3] pry(main)> @language = true ? 'en' : 'ja'
=> "en"
[4] pry(main)> @language = false ? 'en' : 'ja'
=> "ja"

```
なるほど、続いて下記を実行する

```ruby:terminal
[5] pry(main)> params = {:la=>"en"}
=> {:la=>"en"}
[6] pry(main)> @language = params[:la] ? params[:la] : 'ja'
=> "en"
[7] pry(main)> params = {:la => nil}
=> {:la=>nil}
[8] pry(main)> @language = params[:la] ? params[:la] : 'ja'
=> "ja"
[9] pry(main)> 

```
なるほど、なるほど。
つまりはこういうことだったのか。
`@language = params[:la]`が**存在すれば**真を返す。
`@language = params[:la]`が**存在しなければ**偽を返す。
左辺はこれだけで条件式として見なされるのだ。

修正後のコード

```erb:tops_controller.rb
  def set_varriable
    @language = params[:la] ? params[:la] : 'ja'
    action = params[:action]
    return render "tops/en/#{action}" if @language == 'en'
    render :"#{action}"
  end
```  

renderの条件が`@language == 'en'`で表されシンプルになった。
R 色見本とプロット点の形

##色見本
http://www.okadajp.org/RWiki/?色見本

##plotの引数pch種類
~~~R
x = c(rep(1,5),rep(2,5),rep(3,5),rep(4,5),rep(5,5))
y = rep(seq(1,5,1),5)
plot(x,y,pch=c(seq(1,25,1)),xlim = c(0.5,5.5),ylim=c(0.5,5.5),xlab = "",ylab = "")
text(x,y,1:25,pos = 3) #上に書く
~~~
![Rplot_pch.png](https://qiita-image-store.s3.amazonaws.com/0/210627/da321215-c84b-099c-3d92-c7bb3f97b19b.png)
図の番号とpchの番号は同じなので、プロットしたい形の番号を指定すれば番号の形がプロットされる


~~~R

install.packages("RColorBrewer", dependencies=T)  # RColorBrewer のインストール（初回のみ必要なコード）
library(RColorBrewer)  # RColorBrewerの呼び出し（毎回必要。名前が長い…忘れてしまうorz）
display.brewer.all()  
brewer.pal(8, "YlOrRd") # Greensを選択する場合。数字は色数（段階数）
# ただし、各セットに用意されている色数を超えて指定することはできない（cf. 上図）
brewer.pal(8, "Greens")[1] # 実際の使用では[1]のように添字を付けて色を取り出す


~~~
![Rplot06.png](https://qiita-image-store.s3.amazonaws.com/0/210627/fe2a12e6-152c-d1c3-045a-ebeb0befb4db.png)
FFmpegを使って動画をWebMへ変換する手順

MP4より圧出画質の良いWebMをFFmpegで変換する手順をまとめました。

# 動作環境
- macOS 10.13.1
 - Homebrewがインストール済み

# 登場人物

- WebM
- FFmpeg（version 3.4：2017/11/17現在）

## WebM

> WebM（ウェブエム）は、Googleが開発しているオープンでロイヤリティフリーな動画のコンテナフォーマット。
> 引用「[WebM - Wikipedia](https://ja.wikipedia.org/wiki/WebM)」

WebMはMP4とくらべて画質が優れているため、MP4と同等の画質をWebMへ変換するとファイルサイズが小さくなります（参考記事「[WebM(VP9)とMP4(H.264)の違い](http://aviutl.info/youtube-webm-vp9-mp4-h264/)」）。データの転送量にシビアな時代なので、動画を扱うコンテンツではWebMを採用するケースが増えてきています。

## FFmpeg

[FFmpeg](https://www.ffmpeg.org/)は、動画の圧縮などで使うツールです。コマンドライン（黒い画面）で実行します。

# 作業手順

## 1. FFmpegのインストール

```
brew install ffmpeg --with-libvpx
```

## 2. 動画ファイルがあるディレクトリへ移動

```
cd ディレクトリのファイルパス
```

## 3. 変換コマンド実行

```
ffmpeg -i input.mov -strict -2 output.webm
```

変換元となる`input.mov`を`output.webm`へ変換するコマンドです。パラメーターも細かく設定できるのですが、理解がふわふわなため詳細はカットします:bow_tone1:

# 変換後の比較

- 変換元ファイル：input.mov（音声あり）
  - ファイル形式：MOV
  - 解像度：853x480
  - 容量：249.2MB

![input.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/32a2cf87-c83b-dbfb-8a5b-0450e7925bf4.jpeg)

▲変換元動画（MOV）

- 変換後ファイル：output.webm
  - ファイル形式：WebM
  - 解像度：853x480
  - 容量：41.6MB

![output.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/57664ca1-1048-4f8d-b249-e38afb81a421.jpeg)

▲変換後動画（WebM）

# 検証に使用した動画

- [Big Buck Bunny](https://peach.blender.org/download/)

# 参考記事

- [WebM(VP9)とMP4(H.264)の違い](http://aviutl.info/youtube-webm-vp9-mp4-h264/)
- [Mac+Homebrew環境にffmpegを導入し、動画を.mp4→.webmへ変換する方法](https://0017.org/1151.html)
- [Encode/VP9 – FFmpeg](https://trac.ffmpeg.org/wiki/Encode/VP9)
- [CompilationGuide/macOS – FFmpeg](https://trac.ffmpeg.org/wiki/CompilationGuide/macOS#ffmpegthroughHomebrew)
Rocket.chatの使い方（簡易マニュアル）

# はじめに
rocket.chatの簡易マニュアルです。
使い方で少し分かりにくい部分を中心に記載します。（社内布教用に作ってます）
最新かつ正確な情報は公式マニュアルを参照下さい。
マニュアル作成時のバージョン：　本体：0.54.0　クライアントツール：2.10.1

#メッセージ
##操作
| 操作       | キー |補足 |
|:-----------------|:------------------|:------------------|
| 改行       |       shift + Enter | |
| メッセージの送信       |Enter | |
|メンション | @ | サジェストが出るため詳細は割愛。|
|コマンド | / |サジェストが出るため詳細は割愛。 |
|バッククォート(windows)  | shift + @  |文字装飾時に利用（よく聞かれるので記載） |

※左上の自分のアイコン＞マイアカウント＞Enter key Behaviorで、「改行」「メッセージ送信」のキーを変えられます。
Normalが上記で、Alterだと逆になります。

##リアクション
メッセージは、メッセージ右側の　歯車マーク　でリアクションできる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214587/80618093-026c-cd5c-d904-ef5efa3701c7.png)

| マーク       | 名称 | 説明 |
|:-----------------|:------------------|:------------------|
| ![image.png](https://qiita-image-store.s3.amazonaws.com/0/214587/5396eae7-def8-7ab5-c549-8b7574dffae0.png)       |固有リンク| このメッセージに記載されたURLを、クリップボードにコピーします。|
| ![image.png](https://qiita-image-store.s3.amazonaws.com/0/214587/066828ea-84bb-1b6a-c898-04378582792c.png)       |引用 | 該当メッセージを引用する形で、メッセージ欄にコピーします。|
| ![image.png](https://qiita-image-store.s3.amazonaws.com/0/214587/e40d71c9-0eb0-0e87-773e-1a80c71daa2f.png)       |未読設定 |指定したメッセージ **以降** を、未読扱いにできる。 |
| ![image.png](https://qiita-image-store.s3.amazonaws.com/0/214587/47f6fda2-5cb8-5db7-2fcb-d51c3725743d.png)       |スター | **個人** に限定した「お気に入り」（自分以外には見えない） |
| ![image.png](https://qiita-image-store.s3.amazonaws.com/0/214587/7ca6c395-6321-808b-fc9b-deac4c808b78.png)       |ピン止め | **ルーム共通** の「お気に入り」（自分以外にも見える） |
※返信とかわかりやすいのは割愛
※モラル次第ですが、「ピン止め」は全員できると楽。（管理＞権限＞pin-message）

#検索
右上の虫眼鏡アイコンから検索できます。
スラッシュで囲いましょう。
`開発` で検索したい場合は、 `/開発/` って感じ。

#クライアントツール
##ダウンロード/インストール
https://github.com/RocketChat/Rocket.Chat.Electron/releases/latest
windowsユーザ：「rocketchat-setup-x.x.x.exe」
インストール時の選択肢：インストール端末が個人利用なら「only current user」を選択



以上
クラスタで突然skimageが読み込めなくなる

ipython を使っていてskimageを読み込んで時に発生したエラー
from skimage import io
Intel MKL FATAL EROR: Cannot load libml_avx2.soor libmkl_def.so
とエラーが発生しipython が強制終了される。

https://stackoverflow.com/questions/36659453/intel-mkl-fatal-error-cannot-load-libmkl-avx2-so-or-libmkl-def-so
ここを参考に
conda install nomkl
を打ち込む、他のもろもろは同時にインストールされた
conda remove mkl mkl-service
で終わりかと思いきや

from skimage import io
QXcbConnection: Could not connect to display
中止（コアダンプ）

より悪化した。こちらについては下記ＵＲＬを参考にした
https://github.com/ipython/ipyparallel/issues/213

ipython の開始前に
export QT_QPA_PLATFORM=offscreen
をすることで問題なく読み込めた

環境：
CentOS7
anaconda3-4.2.0
ipython 5.1.0
文系がやってみたまとめ

文系でもできそうな.techのまとめ。
基本動作環境は　macOS Sierra 10.12.6 でしたが、
1811月頃から、macOS Mojave 10.14.1　になりました。


#Dialogflow

1. [Dialogflowでチャットボットをつくってみる](https://qiita.com/ume1126/private/5955a0680c430a1cf25f)
2. [Dialogflowで天気情報を呼び出す](https://qiita.com/ume1126/private/f60335179b1cee25fa2f)
3. [DialogflowをSlackと連携させる](https://qiita.com/ume1126/private/1fa38c430fc0e6248be8)

[Dialogflow辞書](https://qiita.com/ume1126/items/7fa08f747a3070fd712f)




#Python
##- Pythonの基礎
・[pythonで他の.pyプログラムを実行する](https://qiita.com/ume1126/items/c1be49cc9ad5553ecc78)
　→Python
・[python3で、ぐるなびAPIを叩いてみる](https://qiita.com/ume1126/items/14e9c1b0662acc289b19)
　→Python/api

## - TensorFlow
・[ゼロから始める物体検出](https://qiita.com/ume1126/private/3562b38b2401257ba65a)
　→Python/TensorFlow/Keras/YOLOv2
・[TensorFlow r1.4 で画像認識の再学習](https://qiita.com/ume1126/items/0d525595cfed7e48871d)
　→Python/TensorFlow
・[TensorFlow r1.4 で Error: No module named 'tensorflow.contrib.quantize' となる時の対処法](https://qiita.com/ume1126/items/b46c3632f3437e40fd13)
　→Python/TensorFlow
・[TensorFlowでOpenPose(macでできるモーションキャプチャ)](https://qiita.com/ume1126/items/cc2ae610418296e6db22)
　→Python/TensorFlow/openCV



## - Pythonモジュールたち
・[python pdf2imageでPDF→png](https://qiita.com/ume1126/items/5d9ae08689de737176d2)

## - Django
・[Django2.0で静的Webページ作成〜リンク編〜](https://qiita.com/ume1126/items/822f9559b066d613f353)
　→Django2.0
・[Django2.0でブログの作成（その１）](https://qiita.com/ume1126/items/323e6dbbb886acb3d575)
　→Django2.0
・[AWS(EC2)にDjango2.0のアプリをデプロイ(nginx+gunicorn)
](https://qiita.com/ume1126/private/7acb9a632865400d7b4a)　→AWS/EC2/nginx/gunicorn/Django2.0
・[REST化したDjangoアプリを、Swift(Xcode)から叩いてみる](https://qiita.com/ume1126/items/9492f1f2b9e863c48871)
　→Django2.0/Swift/api
・[Django+ngrokでtwitter認証 〜Callback URLの設定〜](https://qiita.com/ume1126/items/3879128b16e65a78044d)
　→Django2.0/Auth認証
・[nginx + gunicorn + Django タイムアウト処理](https://qiita.com/ume1126/items/4f062c90283a958a95bc)
　→nginx/gunicorn




#Node-RED
・[Node-REDでMySQLに格納されたデータを検索し、ブラウザ表示する。](https://qiita.com/ume1126/items/0d3fe877a775054d43e1)
　→Node-RED/MySQL


#AWS
・[AWSにEC2インスタンスを作成して、nginxを使い、webページを公開する【前編】](https://qiita.com/ume1126/items/09e7cfc58ba003618bf9)
・[AWSにEC2インスタンスを作成して、nginxを使い、webページを公開する【後編】](https://qiita.com/ume1126/items/7cef8cb2c19959d25cb5)
　→AWS/EC2/nginx
・[AWS LambdaからLambdaを非同期で呼び出す(Python)](https://qiita.com/ume1126/items/8170a10fad6b21f0f54a)
・[AWS Lambda で opencvを動かす (python3, S3)](https://qiita.com/ume1126/items/e0d57a217345b9dab620)
・[AWSのポリシー一覧](https://qiita.com/ume1126/items/b9bc8a8d43e4e0b326b4)
　→未完




#そのた
・[Xcodeに関するあれこれ](https://qiita.com/ume1126/private/1443875e4f692bb3655d)
　 →Xcode/Swift
・[MySQLにCSV(日本語)を読み込ませたい](https://qiita.com/ume1126/items/01ab78d16ef2ca58eae1)
　 →MySQL
・[WEBテスト自動化！Seleniumのインストール方法](https://qiita.com/ume1126/private/748a3742a366241a9df7)
　 →Python3/Selenium
・[OSに関するあれこれ](https://qiita.com/ume1126/private/dcf39e9a2d71f5c1e852)
　 →Unix/Linux
・[Elasticsearchで、分かち書き(kuromoji:形態素解析)したqueryを_searchする。](https://qiita.com/ume1126/items/b8be3ce191944cbf83e5)
・[同一端末で複数のgithubアカウントを使う](https://qiita.com/ume1126/items/57348c5e02306e7f312d)
・[超個人的なGitメモ](https://qiita.com/ume1126/private/31e7c6ac89b836a1741e)
linux操作上の問題リスト

## ファイル操作

* grepする際にsymbolicの検索も含まれているので、それを排除するオープションがあるかな？

* selinuxの設定問題   [理由がわかれば怖くない！SELinux とのつきあい方](https://blog.fenrir-inc.com/jp/2016/09/selinux.html)
Mautic のエイリアスの仕組み


Mautic 2.11.0 で確認

## 実際のコード

https://github.com/mautic/mautic/blob/staging/app/bundles/CoreBundle/Model/FormModel.php

## 動作

- 全角文字であれば、ライブラリーで中国語の読みに変換
- 英数字のみ取り出す
- スペースは下線 (_) に変換
- 小文字に変換
- エイリアスが空白だったらとにかく、5文字ぐらいのランダムな英小文字のエイリアスを作成する
- エイリアスが許容する最大の文字数が設定されていたらそこまで文字をカットする
- 最後に下線 (_) が入っていたらカットする
定理証明支援の紹介

# 目的

定理証明支援とは何かと現状の整理。

# 定理証明支援とは

定理証明支援とは数学の定理を自動で証明することではなく、ステップバイステップでコンピュータに命令を送り、数学の定理を証明するのを助けるシステムである。

支援だから意味ないということでなく、最近の数学の証明は長くなり証明の検証が難しいのを助ける意味がある。定理証明支援の意義については[こちら](https://staff.aist.go.jp/reynald.affeldt/ssrcoq/coq-jssst2014.pdf)が詳しい。
また、信頼性が求めらる難しいアルゴリズムの検証、たとえばTLS(暗号通信)や[Raft(分散合意アルゴリズム)のサーバー](https://github.com/uwplse/verdi)に利用されつつある。

ここでいう定理は大げさなものだけでなく、$1+1=2$、$0*何か=0$、$a*b=b*a$といった簡単なものを証明しながらどんどん積み上げていく。通常のプログラムと違うのは証明であるので使用する変数が整数ならそのすべての値について成り立つ定理を証明する。

定理を証明するのに使うツールは下記である。(他にもあるとは思いますが。)

* [数学的帰納法](https://ja.wikipedia.org/wiki/%E6%95%B0%E5%AD%A6%E7%9A%84%E5%B8%B0%E7%B4%8D%E6%B3%95)
* [命題論理](https://ja.wikipedia.org/wiki/%E5%91%BD%E9%A1%8C%E8%AB%96%E7%90%86)
    * [演繹定理](https://ja.wikipedia.org/wiki/%E6%BC%94%E7%B9%B9%E5%AE%9A%E7%90%86)
    * [数学記号の表](https://ja.wikipedia.org/wiki/%E6%95%B0%E5%AD%A6%E8%A8%98%E5%8F%B7%E3%81%AE%E8%A1%A8)
    * [シークエント計算](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%BC%E3%82%AF%E3%82%A8%E3%83%B3%E3%83%88%E8%A8%88%E7%AE%97)
* [ペアノ数に代表される帰納的な変数](https://ja.wikipedia.org/wiki/%E3%83%9A%E3%82%A2%E3%83%8E%E3%81%AE%E5%85%AC%E7%90%86)
    * 下記のcoqの例のように自然数を0と+1（S)のように帰納的に定義し、プログラムで容易に条件を網羅できる変数を扱う。自然数の場合は2つのケースしかない。
    * 実数の取り扱いは難しく、デフォルトでサポートされないケースが多い。
* [カリー＝ハワード同型対応](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%EF%BC%9D%E3%83%8F%E3%83%AF%E3%83%BC%E3%83%89%E5%90%8C%E5%9E%8B%E5%AF%BE%E5%BF%9C)
    
```
Inductive nat : Set := 
  | O : nat
  | S : nat -> nat.
```

# 証明のやり方

証明の具体的なやり方は次の入門書を直接読むのがいいです。
[さまざまな言語による証明の例](https://rosettacode.org/wiki/Proof)にあるように言語により証明のスタイルが異なります。下記のように2つあります。

1. Coqのように数式と証明用の言語が完全に分離していて、数式はGallina、証明はtacticsという言語で書く。
2. Agdaのようにカリー＝ハワード同型対応を生かしているのか、数式が型、証明がプログラム。

どちらがいいのかよくわかりませんが、どちらも証明でやっていることは既存の定義や仮説の式を置き換えたり、つなげたりしてゴールの証明を目指します。証明はテトリスのように組み合わせゲームです。
Coqはtacticsが多すぎて既存のソースが大変読みにくく、Agdaのほうが読みやすいと思います。


# 入門書

* Coq
    * [Software Foundation](https://softwarefoundations.cis.upenn.edu/)
        * 英語ですがわかりやすいです。最近3部だてに分かれたようです。
        * [日本語訳](http://proofcafe.org/sf/)
            * 2011と、かなり古い訳です。
    * [Mathematical Components](https://math-comp.github.io/mcb/)
        * 素のCoqはtacticsが多く、可読性が悪いのでSSReflectというマクロのようなもの？を使い、証明の可読性をあげ、大規模プロジェクトに耐えられるようなスタイルに変わってきています。SSReflectの使い方の本です。
* Agda
    * [Programming Language Foundations in Agda](https://plfa.github.io/)
        * 最近(2018)に作られた参考書
    * [Verified Functional Programming in Agda](https://www.amazon.co.jp/dp/1970001240)
        * 高い本ですがわかりやすいです。
        * ただ、agda-stdlibでなくioa libraryで記述されているのがネックです。
* Haskell
    * [Dependent Type in Haskell](https://www.cis.upenn.edu/~sweirich/papers/eisenberg-thesis.pdf)
        * 依存型の書き方の本。途中まで読みやすいですが、後半はわかりにくいです。


# 各言語の状況

* Coq
    * 歴史が長い分ドキュメントとエコシステムが充実（日本語のドキュメントは少ないです。）
    * パッケージマネージャー
        * ocamlと同じopam
    * 信頼の実績
        * 四色問題の証明など多数
* Agda
    * ドキュメント少ないです。
        * 最近[Verified Functional Programming in Agda](https://www.amazon.co.jp/dp/1970001240)が読めて大変うれしいです。
    * ライブラリ管理機能が最近追加されたが、cabalとかに比べると貧弱
* Haskell
    * 簡単な証明はできますが、私が勉強不足でrewriteとかどうやるのかどうやるのかわかっていません。
CloudFront + Rails5.1 + SSLでsessionが引き継がれない

自分のための備忘録

CloudFront + Rails5.1 + SSL　構成でsessionの値が引き継がれない問題が発生した。

解決方法としてはapacheのhttpd.confに下記の設定を記述すればよい。

>
SetEnvIf CloudFront-Forwarded-Proto "https" HTTPS
RequestHeader set X-Forwarded-Proto "https" env=HTTPS
Turnipで他のシナリオを実行するステップ

# 状況

Turnipで`GivenScenario`したい!

[Turnip](https://github.com/jnicklas/turnip)向けに書いた[Gherkin](https://github.com/cucumber/cucumber/wiki/Gherkin)シナリオが、他のシナリオに書いたステップで実現される状況を前提としている。
このため、前に書いたシナリオAを今書こうとしているシナリオBにおいて「前提」ステップとして再利用したい。

こんな風に書けたらいいな

```gherkin
機能: Hoge
  背景:
    前提 Fugaする

  シナリオ: Aを登録
    もし Piyoする
　　　　　　　　ならば PiyoPiyo

  シナリオ: Bを登録
    前提 「Aを登録」しておく
    もし Hogeraする
　　　　　　　　ならば HogeraHogeHoge
```

# 解

Cucumberの各ホスト言語における実装は知らんけど、Turnipの場合割とシンプルに内部でRSpecの`describe` ... `context` ... `it`構造にマップされているため頑張ればなんとかなる。

このfeatureに対応して内部で生成されているのはだいたいこういうコードだ。

```ruby
feature = Turnip::Builder.build(feature_file)

describe "機能 Hoge" do
  background_steps = feature.backgrounds.map(&:steps).flatten
  before {
    background_steps.each do |step|
      run_step(feature_file, step)
    end
  }
  
  feature.scenarios.each do |scenario|
    describe scenario.name do
      # "Bを登録 前提 「Aを登録」しておく -> もし Hogeraする -> ならば HogeraHogeHoge"みたいなやつ
      description = (略)
 
      it description do
        scenario.steps.each do |step|
          run_step(filename, step)
        end
      end
    end
  end
end
```

我々がstepの定義を書くときはこの`run_step`から呼び出された中にいる。従って、現在の`it`ブロックへのアクセスだけできれば`scenario`にも`feature`にもアクセスできる。
これを利用すると次のように書ける。

```ruby
step '「:name」しておく' do |name|
  context = RSpec.current_example.metadata[:block].binding
  current_feature = context.local_variable_get(:feature)
  filename = context.local_variable_get(:filename)

  scenario = current_feature.scenarios.find {|scenario| scenario.name == name }
  scenario.steps.each do |step|
    run_step(filename, step)
  end
end
```

# 今後の課題
残念ながら、このままでは他の`feature`に属するシナリオにアクセスすることはできない。
ローカル変数`feature`はそのfeatureのための`describe`を構築しているブロック内にしか存在しないので、そのままでは他のfeatureを現在の`it`内から参照する術はないのである。

ただし、RSpecが`describe`をネストした`RSpec::Core::ExampleGroup`のサブクラスにマッピングする内部APIはもう何年も安定していて、そこそこ安心して利用できそうだ。したがって、`ObjectSpace.each_object`でそれっぽい`ExampleGroup`インスタンスを浚って目標のfeatureに相当するものを特定すれば、なんとかする余地はありそうだ。

# 警告!

Cucumberにおける公式の見解は「そういう機能はサポートしない」らしい。代わりに、Cucumberのホスト言語で高度なヘルパーメソッドを書いてそれをステップ定義で利用したり、前提状況を再現する`World`を作ったりするのが推奨されている。

本稿はそれでもなんとかしたいという話であるが、以下に見るように(少なくともcucumberでは)あまり歓迎されていない手法である。

http://blog.josephwilk.net/ruby/cucumber-waves-goodbye-to-givenscenario.html
> I initially thought this was a great feature...
> However... in the longer term it produces scenarios that are hard to maintain and understand
  
https://github.com/cucumber/cucumber-jvm/issues/502#issuecomment-16068777
> this is a common request that we are not going to implement

https://github.com/cucumber/cucumber-js/issues/237#issuecomment-53555187
> We implemented this feature (we call it "nested steps") in the Ruby Cucumber, and it's been hard to maintain, and led to some very complex dependencies in people's test code.
appleへ特急申請を出す方法(2020年9月更新)


appleへの特急申請を出す際の画面がコロコロ変わるのでメモ。
以下の申請方法は2020/9現在の特急申請の方法になります。
申請画面にいくまで英語だったのが日本語になっていたので追記しました。

1.まずはお問い合わせに飛ぶ

https://developer.apple.com/contact/

お問い合わせからContact Usから「Appのレビュ」「App Reviewの優先リクエスト」の順で選択
英語の場合：「App Review」 「App Store Review」 「Request Expedited Review」

![スクリーンショット 2020-09-16 22.48.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64331/3ba602df-2a03-e880-bf7e-0a840b875b76.png)

2.すると、App Reviewのお問い合わせがあるのでそこから特急申請の依頼ページに飛ぶ



3.App Informationに App Name Apple ID of App Platformを選択する。日本語のアプリ名しかない場合は日本語のみで申請します。

![スクリーンショット 2017-11-09 16.04.03.png](https://qiita-image-store.s3.amazonaws.com/0/64331/3979498d-6fcb-3890-0838-744b0c07db3a.png "スクリーンショット 2017-11-09 16.04.03.png")![スクリーンショット 2020-09-16 22.48.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64331/f87c1ad2-c3e0-d3da-b124-630733c03ef5.png)

「Description Select a reason」とExplanationを記載して送信。

![スクリーンショット 2020-09-16 22.56.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64331/d9e8b299-0da3-3324-d3fb-48db9d6b8bab.png)


これで次の日ごろには返信が来て、申請が通ります。
tmux起動するとnvmがエラー出してこまってた

```
nvm is not compatible with the npm config "prefix" option: currently set to "/usr/local"
Run `npm config delete prefix` or `nvm use --delete-prefix v8.8.1 --silent` to unset it.
```

こんな感じで出てた。

なんでかなーって思って色々調べてもよー分からんかったんですが、やっとGitHub Issues見つけた。

[NVM fails to load within nested shell #1652](https://github.com/creationix/nvm/issues/1652)

どうやら、 `/usr/local/bin/npm` ができてたみたい。

いつこさえてもたんやろ…。

Homebrewでインストールしてもたんやろか。

なんせ、このファイル不要なので消したら出なくなった。

たすかった。
MATLAB > COMMAND WINDOWの出力をファイル保存 > diary

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```

COMMAND WINDOWで実行した結果をファイルに保存したい。

unixのredirectのような機能があるかは未消化。

diaryというコマンドはあるようだ。
https://jp.mathworks.com/help/matlab/ref/diary.html

MATLAB Online R2017bにおいてはdiaryは使えない。

```matlab
>> diary test.txt
Unable to run the 'diary' command, because it is not supported for MATLAB Online.
```

### 備考

https://jp.mathworks.com/help/matlab/ref/diary.html
> R2006a より前に導入

https://jp.mathworks.com/help/matlab/ref/diary.html?lang=en
> Introduced before R2006a

いつのことだか不明。
R2003? R1980? R1050?
LOCを理解する: 簡単なようで難しいコード行数の数え方について

コード行数の数え方は一見すると簡単に思えますが、実は意外と難しいものです。本稿ではその理由を説明するとともに、現実的なコード行数との付き合い方についての見解をまとめてみました。

## LOC（lines of code）とは

「LOC」とはソースコードの行数を意味し、生産性や品質の分析に使われる指標です。

独立行政法人情報処理推進機構（IPA）が毎年発行している「ソフトウェア開発データ白書」では「SLOC (source lines of code) 」という同義の言葉が使われています。

**日本では「ステップ数」と表現されることもありますが、海外では「LOC」、「SLOC」という表現の方が一般的です** 。

### 物理LOC（physical LOC）

「物理LOC」とは **テキストファイルとしての総行数** のことです。物理LOCは完全に客観的な数値であり、これの数え方については全く問題ありません。

### 論理LOC（logical LOC）

問題は「論理LOC」です。「論理LOC」とは **物理LOCから空行やコメント行などを除いた行数** です。

論理LOCの数え方はプロジェクトによって（最悪の場合、プログラマーによって）以下のような **様々な定義があります** 。

- スペースやタブだけの行をカウントする
- 2つの命令が書かれた行は2行としてカウントする
- 括弧だけの行をカウントしない
- 連続した空行は1行としてカウントする

コードの差分比較では以下のように定義がさらに複雑になります。

- スペースやタブの数のみを変更した行はカウントしない
- 空行の数の変更はカウントしない


見積もり手法「COCOMO」を提唱したBarry Boehmの論文「A SLOC counting standard」によると、論理LOCはその定義が異なれば **1.5倍以上の差** が生じることもあります。このことは生産性や品質の評価値に大きな誤差を生み出す原因となります。

現状、論理LOCは世界的な標準となる定義が存在しない、 **ワールドワイドでカオスな指標** となっています。

世の中にはコード計測ツールがたくさんありますが、同じファイルであっても各ツールによって算出される論理LOCは大きく異なっています。

このように、論理LOCは生産性や品質を図る上で大変便利な指標ですが、 **客観的な指標には向いていない**ということを認識しましょう 。



--------------------------------------------------------------------------------

[LOC - Wikipedia](https://ja.m.wikipedia.org/wiki/LOC)  
[Nguyen, Vu, et al. "A SLOC counting standard." COCOMO II Forum. Vol. 2007. 2007.](https://www.researchgate.net/profile/Barry_Boehm/publication/228629006_A_SLOC_counting_standard/links/53fd97860cf22f21c2f8105d.pdf)  
[COCOMO - Wikipedia](https://ja.m.wikipedia.org/wiki/COCOMO)

## 「ソフトウェア開発データ白書」ではどのように論理LOCが定義されているのか

「ソフトウェア開発データ白書」では、どのように論理LOCが定義されているのでしょうか。以下の表は定義を要約したものです。

項目|説明
---|:---
SLOC規模|**コメント行** 及び **空行を含まない** コード行数
SLOC実績値| **総合テスト完了時** のSLOC値
実効SLOC実績値| 実効SLOC実績値 = SLOC実績値(追加・新規) + SLOC実績値(変更) + SLOC実績値(削除)

「ソフトウェア開発データ白書」においても、これ以上明確な論理LOCの説明はありません。

また、[「ソフトウェア開発データ白書」シリーズに関するよくある質問と回答：IPA 独立行政法人 情報処理推進機構](https://www.ipa.go.jp/sec/qa/whitepaper.html#chap01)では論理LOCに関して以下のように言及しています。

> 物理行数、論理行数、言語による定義の違い等ありますが、どのように定義するかは各社で取り方が異なります。統一はできないため、各社の方針に任せております。

「ソフトウェア開発データ白書」では分析のために論理LOCが多用されていますが、 収集された論理LOCのデータは **定義が統一されておらず、各データによってバラバラである** ということです。「ソフトウェア開発データ白書」に記載されている平均指標値はあくまで **参考程度** に留めておくべきです。

--------------------------------------------------------------------------------

[ソフトウェア開発データ白書 2016-2017 | 3.2.2 データ項目の取り扱いに関する取り決め](https://www.ipa.go.jp/files/000057877.pdf#page=20)<br>
[ソフトウェア開発データ白書 2016-2017 | A.2 データ項目定義 Version 3.3](https://www.ipa.go.jp/files/000057877.pdf#page=326)  
[ソフトウェア開発データ白書 2016-2017 | A.4 導出指標の名称と定義](https://www.ipa.go.jp/files/000057877.pdf#page=335)  

## 論理LOCとうまく付き合うために

このように現場に混乱をもたらしかねない論理LOCですが、生産性や品質を簡単に示すことができるため見限ることはできません。では、どのようにすれば論理LOCを客観的な指標とすることができるでしょうか。

その最善策は以下の3つです。

1. プロジェクトで使用するコード計測ツールを選定する
2. 採用したツールにおける論理LOCの定義をできる限り明文化する
3. すべてのプログラマーが同じツールを使って論理LOCを算出する

ツールを統一することでプロジェクトにおける論理LOCはすべて同じ定義に従って算出することができ、生産性や品質を客観的に評価することができます。

--------------------------------------------------------------------------------

[![クリエイティブ・コモンズ・ライセンス](https://i.creativecommons.org/l/by/4.0/88x31.png)](http://creativecommons.org/licenses/by/4.0/)<br>
この 作品 は [クリエイティブ・コモンズ 表示 4.0 国際 ライセンス](http://creativecommons.org/licenses/by/4.0/)の下に提供されています。
15Puzzle


``` C++:
#include <iostream>
using std::cout;
using std::cin;
using std::endl;;

#include <cstdlib>
using std::rand;
using std::srand;

#include <ctime>
using std::time;

const int arraySize = 4;
char elements[arraySize][arraySize] = {{'1','2','3','4'},
			 {'5','6','7','8'},
			 {'9','A','B','C'},
		         {'D','E',' ','F'}};
char chack[arraySize][arraySize] = {{'1','2','3','4'},
			 {'5','6','7','8'},
			 {'9','A','B','C'},
			 {'D','E','F',' '}};

int vSP = 3; // vertical space Position
int hSP = 2; // h space Position

void moveUp();
void moveDown();
void moveRight();
void moveLeft();
void randomise(); // randomize the array 
int winer(); // chacks if player have solved the puzzel
int main(){
	srand(time(0));
	randomise();
	bool quite(false);
	do{
		for(int i = 0; i < arraySize; i++){
			for(int j = 0; j < arraySize; j++)
				cout << "  " << elements[i][j];
				cout << endl << endl;
		}
		char a;
		cout << "w - Up, z - Down, a - Left, s - Right" << endl; 
		cin >> a;
		switch(a){
			case 'W':
			case 'w':
				moveUp();
				break;
			case 'Z':
			case 'z':
				moveDown();
				break;
			case 'S':
			case 's':
				moveRight();
				break;
			case 'a':
			case 'A':
				moveLeft();
				break;
			default:
				cout << "Wrong character, pleas type again!" << endl;
				break;
		}
		int c = winer();
		if(c == 1){
			cout << "Bravo! You solved the puzle!" << endl;
			quite = true;
		}
		system("cls"); 
	}
	while(quite == false);
		return 0;
}

void moveUp()
{
	int vP = vSP;
	if(vP + 1 < 4 && vP >= 0){
	
	elements[vSP][hSP] = elements[vSP + 1][hSP];
	elements[vSP + 1][hSP] = ' ';
	vSP += 1;
	}
}
void moveDown(){
	int vP = vSP;
	if(vP + 1 <= 4 && vP > 0){
		elements[vSP][hSP] = elements[vSP - 1][hSP];
		elements[vSP - 1][hSP] = ' ';
		vSP -= 1;
	}
}
void moveRight(){
	int hP = hSP;
	if(hP + 1 <= 4 && hP > 0){
		elements[vSP][hSP] = elements[vSP][hSP - 1];
		elements[vSP][hSP - 1] = ' ';
		hSP -= 1;
	}
}
void moveLeft(){
	int hP = hSP;
	if(hP + 1 < 4 && hP >= 0){	
		elements[vSP][hSP] = elements[vSP][hSP + 1];
		elements[vSP][hSP + 1] = ' ';
		hSP += 1;
	}
}
void randomise(){
	for(int i = 0; i < 20000; i++){
		int a = 1 + rand() % 4;
		switch(a){
			case 1:
				moveUp();
				break;
			case 2:
				moveDown();
				break;
			case 3:
				moveRight();
				break;
			case 4:
				moveLeft();
				break;
		}
	}
}
int winer(){
	int ans;
	for(int i = 0; i < arraySize; i++){
		for(int j = 0; j < arraySize; j++){
			if(elements[i][j] == chack[i][j])
				ans = 1;
			else 
				return -1;
		}
	}
	return 1;
}
```
dev.toと阿部寛のホームページについてちゃんと計測させてくれ


Twitter見てたら、以下のツイートを見た。

![Kobito.PWcWWH.png](https://qiita-image-store.s3.amazonaws.com/0/58800/9183eefa-ebd7-291b-4b59-c5f819ed1010.png "Kobito.PWcWWH.png")

数時間後、[dev.toと阿部寛のホームページどっちが速いですか？](http://kuxumarin.hatenablog.com/entry/2017/11/15/dev.to%E3%81%A8%E9%98%BF%E9%83%A8%E5%AF%9B%E3%81%AE%E3%83%9B%E3%83%BC%E3%83%A0%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%A9%E3%81%A3%E3%81%A1%E3%81%8C%E9%80%9F%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F)というブログがTLに現れた。

GoogleのPageSpeed Insightsで測って阿部寛のホームページの方が早かったという結論付けてよいのかという疑問が浮かび、webpagetest.orgで計測することにした。

## 設定

![Kobito.Lvk0xl.png](https://qiita-image-store.s3.amazonaws.com/0/58800/df0b62f2-fc09-70cb-97fc-bfcc042170fa.png "Kobito.Lvk0xl.png")


![Kobito.ORtVPG.png](https://qiita-image-store.s3.amazonaws.com/0/58800/98a1e4e2-19d3-464d-d69b-42ec55e1bfc7.png "Kobito.ORtVPG.png")



阿部寛のホームページに関しては、Tokyoリージョンにあるものとする。
そして、dev.toはNY発らしいので、サーバーの設定をNYにして測定する。

> The platform was created in 2016. The twitter account, @ThePraticalWeb 
![Kobito.BpoUJD.png](https://qiita-image-store.s3.amazonaws.com/0/58800/60a1b8a1-0de8-4cf1-0d9c-753fc763c0b2.png "Kobito.BpoUJD.png")


## 評価結果

[Webpagetest - 阿部寛のホームページ](https://www.webpagetest.org/result/171116_B5_6f8f8f7e62acf6c7f7f3e4a086c26c23/)
[Webpagetest - dev.to](https://www.webpagetest.org/result/171116_B5_6f8f8f7e62acf6c7f7f3e4a086c26c23/)

### 阿部寛のホームページ
![Kobito.8564GP.png](https://qiita-image-store.s3.amazonaws.com/0/58800/05acff49-2bf0-a1fd-cf5d-2f44cec7456e.png "Kobito.8564GP.png")

サーバーからのレスポンスの圧縮がされておらず、イメージも圧縮されていない。さらには、キャッシュの利用も圧倒的にダメである。

### dev.to

![Kobito.AijZLm.png](https://qiita-image-store.s3.amazonaws.com/0/58800/55d29755-761a-9ab6-f010-5c57e4b42eb1.png "Kobito.AijZLm.png")

これはすごい。キャッシュの利用こそFであるが、画像の圧縮もCまでに伸びているし、CDNの利用も効果的な模様。

見ての通り、パフォーマンスに対しての工夫はdev.toの方がすばらしい評価を受けている。

### 速度指標比較

| 指標               | 阿部寛のホームページ | dev.to |
| -----------:      |------------:      |:------------:|
| 読み込み速度        | 0.313秒           | 2.717秒 |
| ファーストバイト     | 0.109秒           | 0.291秒 |
| レンダー開始        | 0.133秒           | 0.907秒 |
| スピードインデックス | 257               | 908 |

### フィルムストライプビューでディテールを見よう

![Kobito.uOFFf1.png](https://qiita-image-store.s3.amazonaws.com/0/58800/61501654-933c-ed72-bb25-872bceacd7e6.png "Kobito.uOFFf1.png")

見よ、0.3秒の速さで頭部が映し出されたと思った刹那、0.4秒ですべて表示完了していることがわかるだろう。

![Kobito.vlDyhr.png](https://qiita-image-store.s3.amazonaws.com/0/58800/f8d3aab9-60fd-9e84-f053-41a90ac62a26.png "Kobito.vlDyhr.png")

対して、dev.toは0.4秒経過どころか、**倍**の0.8秒経過しても、一切なにも表示されていない状況だ。

## 結論

阿部寛のホームページは改善の余地が多くあるにも関わらず、dev.toよりも圧倒的に読み込みが早い。
Web制作の現場の皆さま、Webpagetest使いこなしましょう。

## リンク
- [阿部寛のホームページ](http://abehiroshi.la.coocan.jp/)
- [dev.to](https://dev.to/)
- [WebpageTest Documentation](https://sites.google.com/a/webpagetest.org/docs/)