OmniAICreator/Qiita-1.07M huggingface dataset:
LINUX KERNEL DEVELOPMENTを読んでいく(3)

LINUX KERNEL DEVELOPMENTを読んでいきます。

https://www.amazon.co.jp/Linux-Kernel-Development-Developers-Library/dp/0672329468/

*  いくつかのライブラリコールはシステムコールには見つからない機能を提供します。そして従って、カーネルにコールするのはワンステップで、それ以外の場合は大きな関数になります。例えば、printf()関数を考えましょう。これはデータのフォーマッティングとバッファリングを提供する。つまり、この働きで1ステップの働きは、コンソールにデータを書き込むためにwrite()を起動します。逆に言えば、いくつかのライブラリコールはカーネルによるものと一対一の関係を保っています。例えば、open()ライブラリ関数はopen()システムコールといくつかわずかな部分を付け加えたものを呼び出します。しかし、strcpy()のような他のCのライブラリコールは、カーネルを全く使っていません。アプリケーションがシステムコールを実行した時、カーネルはアプリケーションを代表して実行します。

まず、printf()はライブラリコールで、write()と言うシステムコールを使っています。逆に、逆に、strcpy()と言うライブラリコールは、システムコールを全く使っていません。で、open()やwrite()などのいくつかのライブラリコールは、システムコール、つまり、カーネルによるものと一対一の関係を保っているようです。また、strcpy()などは、カーネルを使っていないので、システムコールを呼び出さないようです。

*  さらに言うと、アプリケーションはシステムコールをカーネルスペースで実行するように指示されます。そして、カーネルはプロセスの文脈で走ります。この関係、アプリケーションがシステムコールを経由してカーネルに呼び出すこと、はアプリケーションを正しく働かせるために根源的なことです。

システムコールがアプリケーションとカーネルとのインターフェースなんですね。アプリケーションがカーネルにやってもらいたいことは、システムコールを経由して命令する。で、システムコールは、デバイスドライバを呼び出すこともあるようです。

*  カーネルは、システムのハードウェアも制御する。ほとんど全てのアーキテクチャ、Linuxがサポートする全てのシステムを含むものは、割り込みをサポートする。ハードウェアがシステムとコミュニケーションを取りたい時、ハードウェアは、プロセッサに対する割り込みを発行する。そしてそれはカーネルに対する割り込みになるのである。

割り込み出てきましたね。割り込みはソフトウェアによって起動されるのではなく、ハードウェアによって起動されるんですね。これは初めて学んだことだと思います。プロセッサに対する割り込みはカーネルに対する割り込みにもなる。

*  割り込みは番号によって識別され、カーネルはその番号を使って、割り込みを実行または反応するために、特定の割り込みハンドラを使います。例えば、あなたがタイピングしているように、キーボードコントローラはキーボードバッファに新しいデータが入ったことをシステムに伝えるために、割り込みを発行します。カーネルは、入ってきた割り込みの割り込み番号を記録し、正しい割り込みハンドラを実行します。割り込みハンドラはキーボードのデータを分析し、キーボードコントローラに、さらなるデータを受け入れ可能であることを知らせます。

今僕はキーボードをタイピングしてますが、キーボードをタイプするたびに、割り込みが発生するんですね。で、それには番号が付与され、割り込みハンドラとして、発行される。プロセッサに対する割り込みが先なのか、カーネルに対する割り込みが先なのかは、よくわからないですが、おそらくプロセッサに対する割り込みが先だと思います。

*  同期の機能を提供するため、カーネルは割り込みを無効化することができる。全ての割り込みを無効化することもできるし、特定の割り込みを無効化することもできる。Linuxを含む全てのオペレーティングシステムでは、割り込みハンドラはプロセスの文脈では走らない。その代わりに、Linuxを含むたくさんのOSでは、割り込みハンドラはプロセスに関連づけられた特別な割り込み文脈で走る。それは特別な文脈で、割り込みハンドラに早く反応して、割り込みし、終了するためだけに存在する文脈です。

プロセスの文脈、割り込み文脈というのがどういうものかよくわからないですね。割り込み文脈とは、プロセスの文脈とは別の、割り込みハンドラに素早く反応するためにある文脈みたいです。
文脈というのがどういう意味で使われているのかがイマイチ掴めないですね。
全ての割り込みを無効化することができるようですが、それはどういう状況で使うのかなというのはちょっと気になるところです。

ということで、そろそろ疲れてきたのでこんなもので
Talendを使ってみる その１

#経緯
会社で「今度Talendを使った開発案件をやるかもしれない」というお話をいただきちょっと触ってみようと思った感じです。
まだ具体的な仕事が決まったわけではないので「やっぱりなくなったわ～」って言われるのがよくある弊社ですが何事も勉強だよね。

#そもそもTalendとは？
データの読み取り、加工を行うETLツールです。
ほかにもETLツールはたくさんありますが高価なものが多いですがTalendは無償で使用することができます。
※有償版もあるみたいですが基本的な機能はすべて無償でも使えるようでそれも特徴の一つみたいです。
プログラミングができなくてもデータ加工とかができるよ！っていうのがこの手のツールの特徴です。
TalendはJavaで動いていてコンポーネントとかを自分でコーディングして作ることも可能なようです。

#今回の目標
Talendをインストールし、うまくいったことの確認もかねて簡単なジョブを作成します。

#開発環境
PC：ThinkPad X1 Carbon 2017
OS：Windows 10
CPU：Core i7-7500U
メモリ：16GB
OS以外はあまり関係なさそうですが・・・


#環境構築
[【Talend Open Studio 入門01】開発環境の構築。Talendをインストールしよう](https://tasokori.net/%E3%80%90talend-open-studio-%E5%85%A5%E9%96%8001%E3%80%91%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B/)

基本的にここを参考にしました。
俺ここうまくいかなかったぞ～ってとこ中心に書いてきます。

###１．JDK 8をダウンロード
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
oracleからJDKをとってきます。
バージョンは8です。
参考サイトでは7をダウンロードしていますがここでは8です。

###２．Talendをダウンロード
https://www.talend.com/products/talend-open-studio/?qt-product_tos_download=3
Talendはバージョンによって対応するJavaのバージョンも違います。
6.1？6.2？くらいまではJava 7がサポート対象だったようです。
※参考のサイトでは5.6を使っているので7

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/137987/9c4eb3a8-b9f1-c4be-d212-af26b67bab46.png)

私はWindowsなので赤丸のところをクリックします。
ここでダウンロードされてくるTalendのバージョンを見ると7.0が落ちてきます。
ここでのJavaのサポート対象は8みたいです。

あと2018年8月現在画像の通り、製品が一覧で並んでるレイアウトになっています。
タブが～という記載がありますがタブを操作して対象製品やバージョンを選んだりっていうはできなそうでした。
サイトのレイアウト変わったのかな？

あとは順次同じ作業を行っていく感じです。
Talendを任意のフォルダに解答して起動
今回サポート対象になるJDK以外がインストールされている人はそこの対応も必要ですね。

#簡単なジョブを作ってみる
[【Talend Open Studio 入門02】CSVデータを変換する。Talendの使い方からはじめます。](https://tasokori.net/%E3%80%90talend-open-studio-%E5%85%A5%E9%96%8002%E3%80%91csv%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E3%80%82%E3%81%BE%E3%81%9A%E3%81%AF%E3%83%95%E3%82%A1%E3%82%A4/)

CSVを取得して編集、出力するというジョブを作りました。
ETLツール使うのは初めてじゃないので、すんなりとできました。
Javaで動いてるのでJavaをご存知だとさらに扱いやすいのかなと思いました。

#次回の予定
その２では仮想サーバーにDBとか環境を構築してそっからデータとってきてごにょごにょする何かを作りたいなと思っています。
Nim in Action SDL sample written with official SDL wrapper

The example of SDL wrapping described in Nim in Action works fine in the self-made wrapper but not on https://github.com/nim-lang/sdl2.
Replacing it with the following would work.


```nim
import sdl2
import os

if init(INIT_VIDEO) == SdlError:
  quit("Couldn't initialise SDL")

var
  window: WindowPtr
  renderer: RendererPtr
  evt = defaultEvent
if createWindowAndRenderer(640, 480, 0, window, renderer) == SdlError:
  quit("Counldn't create a window or renderer")

discard pollEvent(evt)
renderer.setDrawColor 27,64,153,255
renderer.clear

renderer.setDrawColor 255,255,255,255

var point = [
  (260'i32, 320'i32),
  (260'i32, 110'i32),
  (360'i32, 320'i32),
  (360'i32, 110'i32),
]

renderer.drawLines(addr point[0], point.len.cint)
renderer.present
sleep(5000)
```
Jupyter + Matplotlib + Python3 > Cの関数内static変数と同等の処理を使う > 折れ線データの作成

```txt:動作環境
Ubuntu 16.04.3 LTS desktop amd64
tmux 2.1-3build1
Python 2.7.12
Python 3.5.2
Jupyter Notebook v5.2.1-0d9838c
```


### 処理概要

- Cの関数内static変数と同等の処理を使う
    - 参考: https://code.i-harness.com/ja/q/44409
- 折れ線データを作成する
    - 前回のインデックスからの変化によるデータ作成

### code v0.1

```py:stacic_var_in_func_180830.ipynb
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt


def calc_dummy_linear2(idx):
    adder = 0.0
    if idx < 300:
        adder = 1.0
    elif idx < 700:
        adder = -1.0
    elif idx < 1000:
        adder = 0.5
    else:
        adder = -0.3
    calc_dummy_linear2.pre += adder
    return calc_dummy_linear2.pre


def calc_dummy_sin(idx):
    arg = float(idx)/1440.0
    wrk = np.sin(arg*np.pi)
    wrk = wrk * np.sin(-arg*(np.pi*2.0)*2.0)
    return wrk

# CONFIGURATION (selection of the function)
func = calc_dummy_linear2
#

NUM_DATA = 1440  # minutes in the day
input1 = range(NUM_DATA)
output = []
calc_dummy_linear2.pre = 0.0
for idx in range(NUM_DATA):
    output += [func(idx)]

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

x = np.linspace(-6, 6, 1000)

ax.plot(input1, output, color='blue', linestyle='solid')

ax.set_title('First line plot')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.grid(True)
# fig.show()

```

### 結果

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/801855f6-88d8-cadc-ae2a-80ee733d4d8b.png)


### 注記

Pythonを扱う時間が減っているため、良い書き方ではないかもしれません。
より良い書き方は他のところを参考に。

### 関連

- [python > array > 個数を決めて初期化する > mylist = [idx for idx in range(10)] / mylist = [0 for idx in range(10)] >> mylist = [0] * 10](https://qiita.com/7of9/items/586f62fa46dc3409d954)
- [matplotlib > csvファイルを読み込んで折れ線グラフにする / 散布図にする](https://qiita.com/7of9/items/864a98294448f4c4bdc0)

### 一つの関数内で完結させてみる

- 前提: idx=0が最初にコールされる
- 関数使用前の関数外での`calc_dummy_linear2.pre = 0.0`は不要になる

```py
def calc_dummy_linear2():
    MINVAL = 40.0
    MAXVAL = 130.0
    # assuming idx is used from 0
    if idx == 0:
        calc_dummy_linear2.pre = MINVAL

    adder = 0.0
    if idx < 1440*1/4:
        adder = 1.0
    elif idx < 1440*2/4:
        adder = -0.5
    elif idx < 1440*3/4:
        adder = 0.5
    else:
        adder = -1.0    
    adder = adder / 350.0  # rescale from [0, 350] to [0, 1]
        # where 350 was obtained by checking the graph before the normalization
    adder = adder * (MAXVAL - MINVAL)
    calc_dummy_linear2.pre += adder  # as static variable
    return calc_dummy_linear2.pre

```

350.0という値は規格化する前に得られたグラフのおよその最大値。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6241a475-febf-d40d-df60-b66e32b32126.png)
C#, VB, C++/CLI, MFCから呼ぶLoggerModuleを作るメモ

#この記事は？
『C#』『VB』『C++/CLI』『MFC』を使ったプロジェクトで、共通のLoggerを作成する上でのモジュール間呼び出しに関するtipsをまとめたメモ。
やり取りに関係しないところは適当に簡略化してます。

＜必要な要素＞

* IFは共通であること
* ファイル名、関数名、行数を勝手に表示すること

#誰向け？
* C#やVBで出来たソリューションにMFCの古い秘伝のソースを入れる必要が出た悲しき定めの人
* ログ出力初心者さん？

#全体観
![ほげ.png](https://qiita-image-store.s3.amazonaws.com/0/255401/c4fb6142-1a4b-5544-31cf-6819c5d3c0f9.png)

#LogModule
『C++/CLI』で作成。
C#, VBからもC++/CLI、MFCからも呼ぶ必要があるためです。
今回の話に全く関係ありませんが、[NLog](https://nlog-project.org/)使いました。

``` Logger.cpp
void CLogger::WriteInfoMessage(String^ message, String^ file, String^ func, int line)
{
	CLogger::Initialize();
	CLogger::logger->WriteLog(Loglv::Info, message, file, func, line);
}
```
**＜簡単な説明＞**
秘伝のソース過ぎて最初にどこを通るか全くわからないので、全ての外部IFにインスタンス作成等のInitializeがついてます。
WriteLog内でメッセージをフォーマットして、Nlogのインスタンスに対しInfoメソッドを呼んでいます。

#C#, VB用IF
『C#』で作成。
LogModuleのdllをLib参照しているプロジェクト。

```LoggerIF.cs
public static void WriteInfoMessage(
    string message,
    [CallerFilePath]string file = "",
    [CallerMemberName]string func = "",
    [CallerLineNumber]int line = 0)
{
    Logger.WriteInfoMessage(message, file, func, line);
}

```
**＜簡単な説明＞**

| 属性名 | 効果 |
| -------- | -------- |
| CallerFilePath    | 呼び出し元ファイル名を取得     |
| CallerMemberPath | 呼び出し元関数名を取得 |
| CallerLineNumber     | 呼び出し元行数を取得     |
LogModuleのWriteInfoMessage等ログ出力関数を直接を呼び出しています.

#C++/CLI, MFC用ヘッダファイル
LogModule, C++/CLIプロジェクト、MFCプロジェクト共用。

```LoggerIF.h
#ifdef LOGDLL_EXPORTS
#define LOGDLL_API __declspec(dllexport) 
#else
#define LOGDLL_API __declspec(dllimport) 
#endif

#define WriteInfoMessage(message) _WriteInfoMessage(message, __FILE__, __FUNCTION__, __LINE__)

extern "C" {
	LOGDLL_API void _WriteInfoMessage(const char* message, const char* file, const char* func, int line);
}
```
**＜簡単な説明＞**

| 定義名 | 効果 |
| -------- | -------- |
| \_\_FILE__    | 呼び出し元ファイル名を取得     |
| \_\_FUNCTION__ | 呼び出し元関数名を取得 |
| \_\_LINE__     | 呼び出し元行数を取得     |
WriteInfoMessageをDefineで定義し、ファイル名等を追加で取得してextern"C"の内部関数に渡しています。
また、LogModule内のログ出力クラスにてヘッダInclude時にLOGDLL_EXPORTSを定義することで、呼び出し元/呼び出し先のdllimport/dllexportを分けています。（お決まり）

``` Logger.cpp
#include "Logger.h"
#define LOGDLL_EXPORTS
```
#呼び出し部分
**C#**

```sample.cs
using static Logs.LoggerIF;
...
    WriteInfoMessage("test");
```

**VB**

```sample.vb
Imports Logs.LoggerIF;
...
    WriteInfoMessage("test")
```

**C++/CLI, MFC**

```sample.cpp

#include "LoggerIF.h"
...
    WriteInfoMessage("test");
```
#妥協点
LogModuleのあるC++/CLIにもCallerFilePath等は存在しているため、C#, VB用IFを使わずC#側から直接LogModuleを呼び出すことはもちろん可能です。
**ただし、VB側から呼び出してもファイル名などが入ってきませんでした。**

おそらく中間コードからVBに直す際、VBの仕様に合わせるために初期値が設定されていないと強制的に後からNothingを入れてしまうから・・・？CallerMemberPath等は値が設定されている場合無視されてしまうので、結果ファイル名が入って来ないのではないかと。

OptionalAttributeやDefaultValue等試してみてもうまく出来ず断念。そのため、C#でIFを作成しています。
**対処法がわかればこのIFは不要です。**

C#側からは初期値問題が発生しないので直接LogModuleを呼び出しても問題ありませんが、どうせC#でIFを作るなら参照しない理由がないので、C#側からもこのIFを参照しています。
第34話 スキューズ数

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第34話です。

```math
⌈\log_{10} ⁡\log_{10} ⁡log_{10} ⁡Sk_1⌉=34
```

第一スキューズ数の式です。第一スキューズ数とは次のような数です。

```math
Sk_1=e^{e^{e^{79} } }<10^{10^{10^{34} }}
```

第一スキューズ数とはめちゃくちゃ大きい数で、34桁の桁の桁の数です。
つまり、第一スキューズ数はx桁の数で、xはy桁の数で、yは34桁の数です。

スキューズ数とは、素数定理に関連する数です。
素数定理とは、素数がどのぐらいの割合で登場するのかを表した次の式です。

```math
π(x)≅∫_2^x \frac{1}{\log_e⁡t}dt
```

要は、素数の大体の割合を知ることができる式があります。

例えば、10000だった場合、$1/\log_e ⁡10000=0.10$になります。
ですから、1/10程度の確率で素数が出てくることになります。
先程の積分の式はそれらを足し合わせた数を意味します。

実際の素数の個数と素数定理の式は、計算する限り素数の個数の方が常に大きいので、
素数定理の式が追い越すことはないと思われていました。
しかし、これらは無限の交点を持つ、つまり無限に入れ替わることがわかっています。

しかし、最初の入れ替わる数、というのが未だにわかっていません。
ただ、この数までには絶対に入れ替わるはず、という数がこのスキューズ数です。

ですが冒頭に語ったとおり、スキューズ数はものすごく大きい数なので、
コンピュータを用いても計算できる数ではありません。

冒頭では、第一スキューズ数と書いています。
もちろん第二スキューズ数もあります。

第一スキューズ数はリーマン予想を使って求めた数です。
しかし、リーマン予想が間違いだったときの為に、
リーマン予想を使わず求めたスキューズ数が第二スキューズ数です。
そして、それは第一スキューズ数よりもっと大きい数です。

```math
Sk_2=e^{e^{e^7.705 } }<10^{10^{10^{964}}}
```

先程の34の部分が964に変わっています。
比較にならないほど大きな数なのですが、
もはや第一スキューズ数ですら大きいですから想像はつかないですね。

ちなみに、現在は316桁以下の数でいれかわる、まで小さくなっています。
桁の桁、みたいな数ではなく、桁です。
ずいぶんと小さくなりましたが、まだコンピュータで求めるほど小さい数ではないので、
未だに具体的な数はわかっていません。
NetBeansの初期設定をさくっと終わらせたい（PHP）

# なにするの
タイトル通りだよ。NetBeansをインストールした直後の初期設定。
こうゆうのって、地味に忘れてしまいがちなので備忘録として

# 最低限最初にやっときたいこと

## true・false・nullを小文字で補完

デフォルトでは大文字なので、以下ファイル編集する
`{ダウンロードしたディレクトリ}/php/phpstubs/phpruntime/Core.php`

```php:Core.php(変更前)
define ('TRUE', true);
define ('FALSE', false);
define ('NULL', null);
```
```php:Core.php(変更後)
define ('true', true);
define ('false', false);
define ('null', null);
```
参考：[NetBeans、FuelPHP と過ごしたこの 2 ヶ月](https://www.slideshare.net/suno88/netbeansfuelphp-2)

## カラースキーム・フォント

黒くしたいよね。見た目大事。

プラグイン：**Darcula LAF for NetBeans** とか、**Dark Look And Feel Themes**とか

私は、**Darcula LAF for NetBeans**を使用
* `オプション` → `外観` → `ルック・アンド・フィール` → **`[優先ルック・アンド・フィール]`**：**Darcula**
* `オプション` → `エディタ`　→ **`[フォーマット]`**：**Noway Today**
* `オプション` → `エディタ`　→ **`[フォント]`**：**Ricty Diminished 18** 
(Ricty Diminishedは別途ダウンロード必要）
* `オプション` → `外観` → `Darcula Look and Feel`→ ここでメニューとかのフォントとか変えたければ変更。

エディタの背景とかは適当に変えたりしてる。

## 文字コード

新規プロジェクト作成するときにちゃんと指定すれば大丈夫かと。たぶん。
デフォルトを変更したい場合はnetbeansの設定変更が必要（割愛）

## 改行コード

以下２ついれてる。私の場合、改行コードの確認は前者、変換（ってゆうか指定）は後者で行ってる。

* プラグイン：**Show and change line endings**

改行コードの確認・変更ができる。右下に表示されるから、そこで確認・変更。

* プラグイン：**Change Line Endings on Save**

保存するときに指定の改行コードに変換してくれる。
`オプション`  → `エディタ` → `Line Endings`（プラグイン入れると追加されるタブ） 
　　→ **`[Enable adjusting the line endings]`**：チェックを入れて、お好きな改行コード選択
（変換する際、ダイアログ出してほしければ下のにもチェック入れる）


## ファイルのパスを表示

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197235/f21c043b-8c6e-f898-19c5-f5b3d548c2eb.png)
`オプション` → `外観` → `ドキュメント・タブ` → **`[フル・ファイル・パスの表示]`**：チェックいれる
**Show path in titlebar**ってゆうプラグイン入れてもいいと思う。（こっちは、上のバーにパスが表示される）

## エディタのタブをプロジェクトごとにほかの色にする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197235/a906d1ab-171b-aa5f-3b8d-ea45567299b2.png)
`オプション` → `外観` → `ドキュメント・タブ` → **`[同じプロジェクトのファイルと同じ背景色]`**：チェックいれる

# ここからは細かい設定

場合によってはやってもやらなくてもいいと思ってる。

## エディタ

#### フォーマット

タブを空白にしたいとか、そういう設定が必要あれば
`オプション`  → `エディタ` → `フォーマット` で。

上記は全体の設定だけど、プロジェクトごとに変えたければ
`プロジェクトを右クリック`  → `フォーマット`で。

#### 保存時に、末尾の空白除去

`オプション`  → `エディタ` → `保存時` → **`[次から末尾の空白を除去]`**：「すべての行」か、「変更された行」を選択

どっちにするかは、状況によりけり。
「すべての行」にすると、自分がいじってないコードにも差分が出ちゃう場合があるので、それが嫌なら「変更された行」を選ぶ。

#### 空白とか、表示不可系の強調表示
`オプション`  → `フォントと色` → `強調表示`：好みで編集

表示不可の文字を表示する際、色が気に入らなかったらここを編集していい感じにする
たとえば、`カテゴリ`：**`[末尾の空白]`**の**`[前景]`**を赤にしとけば、削除し忘れが回避できたりする。
（前述の設定してれば勝手に削除されるけど）

## その他

#### エクスプローラーでフォルダを開きたい

プラグイン：**Explore from Here**

#### リモートにある開発環境のソースを編集したい

こちらをちぇけら：[NetBeansでリモートの開発環境のファイルを編集する](https://qiita.com/crarrry/items/3569d1dd731f0dffee4d)
AWS Cloud Development Kitをさわってみた

[AWS Cloud Development Kit (Developer Preview)](https://aws.amazon.com/jp/blogs/news/aws-cdk-developer-preview/)をさわってみました。

# どんなもの？
AWSのインフラストラクチャをコードで定義して CloudFormation でプロビジョニングできる優れもの。

# チュートリアルをやってみる
https://awslabs.github.io/aws-cdk/getting-started.html

S3バケットを作成します。

```bash
$ npm install -g aws-cdk
$ mkdir hello-cdk
$ cd hello-cdk
$ git init
$ npm init -y
$ vi index.js
$ vi cdk.json
```

```index.js
const cdk = require('@aws-cdk/cdk');
const s3 = require('@aws-cdk/aws-s3');

class MyStack extends cdk.Stack {
    constructor(parent, id, props) {
        super(parent, id, props);

        new s3.Bucket(this, 'MyFirstBucket', {
            versioned: true
        });
    }
}

class MyApp extends cdk.App {
    constructor(argv) {
        super(argv);

        new MyStack(this, 'hello-cdk');
    }
}

process.stdout.write(new MyApp(process.argv).run());
```

```cdk.json
{
  "app": "node index.js"
}
```

```
$ cdk synth hello-cdk
$ cdk deploy
 ⏳  Starting deployment of stack hello-cdk...
[0/2] Thu Aug 30 2018 06:32:39 GMT+0900 (JST)  CREATE_IN_PROGRESS  [AWS::CloudFormation::WaitConditionHandle] WaitCondition
[0/2] Thu Aug 30 2018 06:32:39 GMT+0900 (JST)  CREATE_IN_PROGRESS  [AWS::CloudFormation::WaitConditionHandle] WaitCondition Resource creation Initiated
[1/2] Thu Aug 30 2018 06:32:40 GMT+0900 (JST)  CREATE_COMPLETE     [AWS::CloudFormation::WaitConditionHandle] WaitCondition
[2/2] Thu Aug 30 2018 06:32:41 GMT+0900 (JST)  CREATE_COMPLETE     [AWS::CloudFormation::Stack] hello-cdk
[0/4] Thu Aug 30 2018 06:32:55 GMT+0900 (JST)  CREATE_IN_PROGRESS  [AWS::CDK::Metadata] CDKMetadata
[0/4] Thu Aug 30 2018 06:32:55 GMT+0900 (JST)  CREATE_IN_PROGRESS  [AWS::S3::Bucket] MyFirstBucketB8884501
[0/4] Thu Aug 30 2018 06:32:56 GMT+0900 (JST)  CREATE_IN_PROGRESS  [AWS::S3::Bucket] MyFirstBucketB8884501 Resource creation Initiated
[0/4] Thu Aug 30 2018 06:32:58 GMT+0900 (JST)  CREATE_IN_PROGRESS  [AWS::CDK::Metadata] CDKMetadata Resource creation Initiated
[1/4] Thu Aug 30 2018 06:32:58 GMT+0900 (JST)  CREATE_COMPLETE     [AWS::CDK::Metadata] CDKMetadata
[2/4] Thu Aug 30 2018 06:33:18 GMT+0900 (JST)  CREATE_COMPLETE     [AWS::S3::Bucket] MyFirstBucketB8884501
[2/4] Thu Aug 30 2018 06:33:19 GMT+0900 (JST)  UPDATE_COMPLETE_CLEANUP_IN_PROGRESS  [AWS::CloudFormation::Stack] hello-cdk
[2/4] Thu Aug 30 2018 06:33:21 GMT+0900 (JST)  DELETE_IN_PROGRESS  [AWS::CloudFormation::WaitConditionHandle] WaitCondition
[3/4] Thu Aug 30 2018 06:33:21 GMT+0900 (JST)  DELETE_COMPLETE     [AWS::CloudFormation::WaitConditionHandle] WaitCondition
[4/4] Thu Aug 30 2018 06:33:21 GMT+0900 (JST)  UPDATE_COMPLETE     [AWS::CloudFormation::Stack] hello-cdk
 ✅  Deployment of stack hello-cdk completed successfully, it has ARN arn:aws:cloudformation:us-east-1:***********:stack/hello-cdk/0c3c7ce0-abd3-11e8-b59a-50d5ca6e601e
```

# 対応サービス
https://awslabs.github.io/aws-cdk/reference.html

ECSやEKSやNeptune等、比較的新しいサービスにも対応しているようです。


# 雑感

- これでAWSのインフラエンジニアやCloudformation職人はいらない子に。→ 自分
- 逆に言えば、アプリエンジニアがAWSをさわらない言い訳ができなくなった
- 他のクラウドにも早く対応しないかな
SSD(keras version2以上)の実装でエラーにはまったらここを直せ

# 実装環境

Keras v2.2.0
Tensorflow v1.8.0
OpenCV v3.4.1

# 前提
画像データセット、アノテーションのpickleファイル、重みのhdf5ファイルはすべて準備万全という前提。

# SSD(Single Shot MultiBox Detector) with Keras and Tensorflowについて
まず、SSDとは畳み込みニューラルネットワーク(CNN:Convolutional Neural Network)を用いた物体検出アルゴリズムで、300×300の入力に対して，VOC2007 testデータセットで74.3％のmAP1を達成している。
論文はこちらからhttps://arxiv.org/abs/1512.02325
といろいろ説明する前に、おそらく、このページに来てくれた読者諸君は、kerasのSSDの実装がうまくいなかい、エラーがでてしまうがどうやって解決すればいいのか困り果てている、だから解決法を簡単に教えてくれるサイトはないかなと調べて辿りついたかもしれない。
多くのサイトでは、keras(＆tensorflow)フレームワークのSSDコードは、https://github.com/rykov8/ssd_keras が紹介されている。
ただし、Keras v1.2.2, Tensorflow v1.0.0, OpenCV v3.1.0-devで動作可能と謳っている。ローカルで実装する場合、Keras、Tensorflowのバージョンのダウングレードを余儀なくされているのが現状であろう。

ここでは上記のコードを、
Keras v2.2.0,
Tensorflowv1.8.0,
OpenCVv3.4.1
で動作可能にするため、修正箇所を以下に示す。

# ssd.pyの修正箇所

kerasのupdateにより、ライブラリの「merge」が「concatenate」に変更になった。よって以下のように書き換える。

```ssd.py
#以下の13行目
from keras.layers import merge 
# を下記の通り修正
from keras.layers import concatenate

# 282,290,298行目、そして316行目
merge => concatenate
#のように変更します。

#258,265,272,287行目　
mode='concat'
# は全て削除。

# 最後に
concat_axis=1 => axis=1
# へ変更

```

# ssd_layers.pyの変更箇所

```ssd_layers.py
# 111行目の
 def get_output_shape_for(self, input_shape):
# を以下に変更
 def compute_output_shape(self, input_shape):

```

# SSD_training.ipynbの変更箇所
SSD_training.ipynb内でモデルの学習を実行するコードも、同様に変更。kerasバージョンアップでfit_generatorの引数変更のため。
https://keras.io/ja/models/sequential/

```(誤)SSD_training.ipynb

nb_epoch = 30
history = model.fit_generator(gen.generate(True), gen.train_batches,
                              nb_epoch, verbose=1,
                              callbacks=callbacks,
                              validation_data=gen.generate(False),
                              nb_val_samples=gen.val_batches,
                              nb_worker=1)
```

```(正)SSD_training.ipynb
epochs = 30
batch_size=16 #例
history = model.fit_generator(gen.generate(True), 
                     steps_per_epoch =gen.train_batches//batch_size,
                              epochs=epochs, verbose=1,
                              callbacks=callbacks,
                              validation_data=gen.generate(False),
                              validation_steps=gen.val_batches,
                              workers=1)
```
workersはデフォルトで1に設定されている。nb_workerのままでも大丈夫(だと思う)。

# videotest.pyの変更部分
自ら準備した動画でDetectionを行う時に使う、testing_utilsフォルダ内のコード。
しかし、vedeotest.pyは、もともとOpenCVのV2用にコードが書かれている。V3対応にするため、以下のように一部変更する。

```videotest.py
#87,88行目を下記に変更
     vidw = vid.get(cv2.CAP_PROP_FRAME_WIDTH)
     vidh = vid.get(cv2.CAP_PROP_FRAME_HEIGHT)

# 93行目を下記に変更
     vid.set(cv2.CAP_PROP_POS_MSEC, start_frame)
```
Good Luck!
VisualStudioで自分のプログラムを対話的に実行する

# 概要
VisualStudioにはInteractive機能というC#の対話的実行環境：REPL（Read-eval-print loop）があります。
自分で作ったプログラムを簡単にテストしたい時、Interactive機能にプロジェクトを読み込ませると便利です。

# 方法
.NET Frameworkのプロジェクトを作成します。.NET FrameworkならWPFやConsoleでも良いですが、UWPや.NET Core, .NET Standardプロジェクトは読み込めないようです。
例としてこんなPersonクラスを作ります。

```csharp:Person.cs
public class Person
{
    public string Name { get; set; } = "TARO";
}
```

ソリューションエクスプローラーのプロジェクトを右クリックして「プロジェクトでインタラクティブを初期化」を選びます。

![スクリーンショット 2018-08-24 22.36.05.png](https://qiita-image-store.s3.amazonaws.com/0/120077/2809f978-459e-2054-681e-3a7d1b8bf767.png)

すると[C# Inteacrive(32-bit)]というウインドウが出てきて、色々読み込まれているのが分かります。

```csharp:interactiveウインドウ_プロジェクト読み込み後
> #reset 32
実行エンジンをリセットしています。
'CSharpInteractive.rsp' からコンテキストを読み込んでいます。
> #r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.1\System.dll"
> #r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.1\System.Core.dll"
> #r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.1\System.Xml.Linq.dll"
> #r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.1\System.Data.DataSetExtensions.dll"
> #r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.1\Microsoft.CSharp.dll"
> #r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.1\System.Data.dll"
> #r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.1\System.Net.Http.dll"
> #r "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.1\System.Xml.dll"
> #r "ConsoleAppFrame.exe"
> using ConsoleAppFrame;
> 
```

続けてその場で、自作プロジェクト内のクラスなどを呼び出すことができます。

```csharp:interactive実行結果
> var p = new Person();
> p.Name
"TARO" //実行結果が出力
> 
```

ちなみにWPFのウインドウをすぐ表示してプロパティを変更などもできます。

```csharp:interactive実行結果
> using WpfApp1;
> using System.Windows.Media;
> var m = new MainWindow();
> m.Show(); //MainWindowが表示される
> m.Background = new SolidColorBrush(Colors.Purple); //ウインドウの背景色が紫色に変わる
> 
```

# 感想
ちょっとした実験とかをするのに便利。
実験用のコンソールアプリとか、実験用のブランチとかをわざわざ作る必要がなくなった。
実はVisualStudio2015ぐらいからあったらしい。

# 些末なことですが、、、

表記が揺れているのが気になる。

![スクリーンショット 2018-08-24 22.36.05 - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/120077/27769313-a5da-df40-f034-8f4492f87d7a.png)
![スクリーンショット 2018-08-24 23.17.30.png](https://qiita-image-store.s3.amazonaws.com/0/120077/39e4abad-c731-9d2b-68cc-aee8c406055a.png)
![スクリーンショット 2018-08-24 23.19.06.png](https://qiita-image-store.s3.amazonaws.com/0/120077/0ba64151-568b-8558-2f0d-8caca6d1331b.png)


# 参考
http://var.blog.jp/archives/66991653.html

# 環境
VisualStudio2017
.NET Core2.1
.NET Framework 4.7.1
C#7.1
ffmpegでSRTを試す

ほぼ https://qiita.com/tetsu_koba/items/b8e1868a726c6201d3ab のままですが、自分の作業メモとして残しておきます。

環境: macOS Sierra 10.12.6

# ビルド

```shell-session
$ curl -L https://ffmpeg.org/releases/ffmpeg-4.0.2.tar.bz2 > ffmpeg-4.0.2.tar.bz2
$ tar xf ffmpeg-4.0.2.tar.bz2
$ cd ffmpeg-4.0.2/
$ vim libavformat/libsrt.c   # 469行目に h->max_packet_size = 1316; を追加
$ ./configure --enable-libsrt --enable-libx264 --enable-gpl; say 'オワッタヨ'
$ make; say 'オワッタヨ'
$ ./ffmpeg -protocols | grep srt
ffmpeg version 4.0.2 Copyright (c) 2000-2018 the FFmpeg developers
  built with Apple LLVM version 9.0.0 (clang-900.0.39.2)
  configuration: --enable-libsrt --enable-libx264 --enable-gpl
  libavutil      56. 14.100 / 56. 14.100
  libavcodec     58. 18.100 / 58. 18.100
  libavformat    58. 12.100 / 58. 12.100
  libavdevice    58.  3.100 / 58.  3.100
  libavfilter     7. 16.100 /  7. 16.100
  libswscale      5.  1.100 /  5.  1.100
  libswresample   3.  1.100 /  3.  1.100
  libpostproc    55.  1.100 / 55.  1.100
  srtp
  srt
  srtp
  srt
```

# 動作確認

先に受信側を起動（こちらはhomebrewでいれたffmpegのffplay）

```sh
ffplay -analyzeduration 100 -i 'srt://127.0.0.1:3000?mode=listener'
```

送信側を起動（こちらはさきほどビルドしたもの）

```sh
./ffmpeg -f avfoundation -framerate 30 -i "0:" -c:v libx264 -pix_fmt yuv420p -profile:v baseline -level 1 -preset ultrafast -tune zerolatency -x264opts bitrate=2000 -an -f mpegts 'srt://127.0.0.1:3000'
```

# メモ

- https://trac.ffmpeg.org/ticket/7187 で`the mss option should be used per mss=1316 So not a bug.`とあったので`srt://127.0.0.1:3000?mss=1316`も試してみたけど、やはり`SRT.c: LiveSmoother: payload size: 15040 exceeds maximum allowed 1316`といわれてしまう
WordPressでWP-CLIのdb export時にキャッシュテーブルを除外する

[WP-CLI](https://wp-cli.org/)便利ですね。`db export`というテーブルをダンプするコマンドがあるのですが、デフォルトでは全部のテーブルをダンプします。

KUSANAGIのページキャッシュを使ってるとキャッシュテーブルが含まれてすごいサイズになったりするので、これを除外して出力します。

![Screen Shot 2018-08-30 at 6.38.50.png](https://qiita-image-store.s3.amazonaws.com/0/47327/acad8175-fd02-b603-d45c-9752feef3d88.png)


```bash
$ wp db export --exclude_tables=wp_site_cache
```

ついでにzip化すると持ち運びに便利です。

```bash
$ wp db export --exclude_tables=wp_site_cache - | gzip - > hoge.sql.gz
```
psql: could not connect to server: No such file or directory

postgreSQLをインストールし、初のコマンドである
psqlを入力したら即刻エラーがでた。

```
psql: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
```

これはどうやらサーバーで起動をしないといけないようだ。

ここを参考に
https://www.turbolinux.co.jp/products/server/11s/user_guide/posgrestart.html

このコマンドを入力して起動

```
/etc/init.d/postgresql start
```

これで正常にコマンドの結果が帰ってきた。

```
postgres@cdf97162355a:~$ psql
psql (9.6.10)
Type "help" for help.

postgres=#
```
App Review for Login - Examples

https://developers.facebook.com/docs/facebook-login/review/examples
の翻訳です。適当ですので、参考程度に


#App Review for Login - Examples
App Review申請のクオリティを向上させるために、申請の説明の例を読んでください。
***


<a name="instructions" />
## 例の説明
説明を一つ一つ上げることで、あなたがしなければいけないことを
すべての説明は英語で行ってください。以下のことをしないように気をつけてください。
- あなたが作成した他の申請の説明を参照すること
- 指示ではなく、要約すること
- あなたのAPIがどのように動作するかの技術詳細を説明すること

#### 例： user_likes パーミッション
1. "Coco and Etoile Dating App"にFacebookログインする
2. "user_likes"パーミッションを許可する
3. "Coco and Etoile Dating App"のプロフィールにアクセスする。左側の上、３行をクリックする。"profile"タブをクリック
4. プロフィールビューで、interestセクションが見えるまでスクロールダウンする。ここのinterestsはFacebookの"user_likes"パーミッションを表示している

#### 例：user:events パーミッション
1. "Coco and Etoile Dating App"にFacebookログインする
2. "user_events"パーミッションを許可する
3. "yes"をクリックし、今後の試合を許可する
4. 許可した後すぐ、イベントの提案が表示される。例えば、設定されたテストユーザはサッカーの試合に参加していた。提案されたイベントは今度実施されるスタンフォードの女子サッカーゲームである。
5. Facebookの"user_events"パーミッションがないと、ローカルの位置情報を使ったイベントのみが表示される。

#### 例：オープングラフのプロパティのある"make"アクション
1. www.domain.comに行く（例）
2. Facebookで接続をクリック
3. レシピページに移動
4. "I'm making this!"ボタンをクリック。"make"アクションがタイムラインに表示される

一緒に料理をしている友達をタギングするには：
1. "I'm making this!"ボタンのしたの足すボタンをクリック
2. 友達を選ぶ

料理しているレシピの写真を追加するには
1. アップロードボタンをクリック
2. 料理の写真を選択

<a name="example" />
## App Review 例： user_likes
承認された申請は、パーソナライズしたり関連したコンテンツを表示するために"user_likes"を使うことが可能です。

例えば、Sasquatchアプリは、なぜ"user_likes"パーミッションが必要で、どのようにアプリがパーソナライズされたレコメンデーションをするのかを説明しています。

この二番目の例も、レビュアーが承認されます。

> Coco and Etoile Dating Appは"user_likes"パーミッションを利用し、ユーザの共通の興味をマッチングしています。共有された興味はFacebookの"user_likes"で重なっています。それぞれのアプリのユーザはディティングアプリのプロフィール画面から、彼らの興味を削除することができます。

承認されていないappや機能に誰かがlikeしたかを確認するためにuser_likeを利用してください。"user_likes"パーミッションは、あるユーザのすべてのLikeを提供し、これらのすべてのデータをアプリの体験向上の役立てることができます。

<a name="screencast" />
## ビデオスクリーンキャストの撮り方
※ もしアプリのユーザがあなただけ、もしくはとても限られたユーザだけの場合、アプリを申請する必要はありません。App Dashboardで表示されるすべてのアカウント（Adminも含む）はすべてのパーミッションにアクセスでき、ユーザ・ページアクセストークンを作成できます。

スクリーンキャストは、あなたのアプリでどのようにパーミッションを要求するのかを確認する、とてもよい方法です。以下はベストプラクティスとスクリーンキャストをとるためのサードパーティリソースです。

### ベスト・プラクティス
#### 1. アプリがきちんと動作することを確かめる
レビューようにサブミットしたアプリのバージョンを確かめてください。アプリが動作しない場合、私達はアプリのテストができずに承認もできません。
#### 2. ログインの方法を見せる
ログインボタンは簡単に見つかるところに配置しましょう。見つけられない場合は、アプリのテストができずに、承認ができません。
#### 3. パーミッションのダイアログを出すために、[規定のFacebookボタン](https://developers.facebook.com/policy/#login)を使ってください
#### 4. 要求したパーミッションをどのように利用するのかを実演する
例えば、あなたのアプリが"publish_video"を利用するのであれば、アプリからユーザのタイムラインにビデオをポストするステップを実演してください。
#### 5. [ユーザの入力していないコンテンツを入れていない](https://developers.facebook.com/docs/facebook-login/review/requirements#platform-policy)か、[Facebookのポリシー](https://developers.facebook.com/policy/#login)に違反していないか確認する
#### 6. パーミッションの利用方法がFacebookの[規定にあっているか](https://developers.facebook.com/docs/facebook-login/review/what-is-login-review)を確認する
必要なパーミッションだけ申請してください。[ここ](https://developers.facebook.com/docs/facebook-login/permissions)にすべての利用可能なパーミッション一覧があります。
Railsのフロントエンドを、Webpackerからvue-cli3に移行できないか調査

# 概要
Railsで、Webpacker使ってVueで開発しようとしてたけど、lintの設定とかtypescriptの環境作りとか面倒なので、vue-cli3を使ってみたかった。

ただ、RailsのSlim上のDOM要素をマウントさせたいので、JSファイルとかCSSファイルをコンパイルして、Railsのpublic フォルダ内に配置したかった。（この設計が正しいかは置いといて技術要件としてあった）

そこで、いろいろ調べてみたことのメモ

# 2018/8/31追記
~~[Async Web Component](https://cli.vuejs.org/guide/build-targets.html#async-web-component)
JSファイルのコンパイルには、こっち使った方がいいかも？
1つの管理ファイルだけ最初に読み込んで、非同期で必要なコンポーネントだけ遅延ロードしてくれるらしい。
digest管理がどうなってるかわかんないので再調査
気になるのは、JSを一ファイルにまとめられないところ~~

IE11で使えなかった...
https://github.com/vuejs/vue-web-component-wrapper#compatibility

# 簡単な流れ
- Railsのフォルダ内に、マニュアル通りvue-cliでプロジェクトを作る
- プロジェクトのルートに、vue.config.jsを作る。（中身は下記）
- いろいろ修正
    - public ディレクトリの中身が、全部いらないので削除
    - コンパイルしたいtsファイルを、packsフォルダ作ってそこに写す
    - imageの読み込みを ``src="./assets/logo.png"`` から、``:src="require('./assets/logo.png')"`` に変更
- yarn run build 実行
- manifest.json を参照して、Railsから読み込み！
    - https://inside.pixiv.blog/subal/4615
        - こちらのサイトが凄く参考になりました。

# webpackの設定
vue.config.js にwebpackの設定は書く。

```vue.config.js
const path = require('path')
const glob = require('glob')
const ManifestPlugin = require('webpack-manifest-plugin');

// 指定のフォルダにあるtsファイルを全部コンパイル対象に！
let entry = {}
glob.sync("./src/packs/*.ts").map(file => {
  entry[file.replace('./src/packs/', '').replace('.ts', '')] = file
})

module.exports = {
  // コンパイル後のファイルの設置先。
  outputDir: '../public/dist/',
  configureWebpack: {
    plugins: [
      // cookie管理のために必要
      new ManifestPlugin({
        fileName: 'manifest.json',
        publicPath: '/dist/',
        writeToFileEmit: true
      })
    ],
    entry
  },
  // imageだけは、パス指定が必要。JSとCSSは、Rails側でパスを指定できるので必要ない。
  chainWebpack: config => {
    config.module
      .rule('images').use('url-loader')
      .tap(options =>
        Object.assign({}, options, {
          publicPath: './dist/'
        })
      )
  }
}
```

# 感想
- Railsからフロントエンドがある程度脱却できそうでよかった！
- vue ui ってしたら出てくるコンソールが、かっこいい！
- 簡単にtypescriptの設定とかできてほんと楽！
- webpackの設定全部消して、デフォルトにしちゃえば、SPAにすぐ移行できそう！

# 困ってること
- entryに初期設定の「app」があって、これをどうやって消したらいいか調査中
- 全体的にもっといい方法ありそうなので、もしあったら教えてください！

# 参考
- https://cli.vuejs.org/
- https://inside.pixiv.blog/subal/4615
- https://github.com/vuejs/vue-cli/issues/1019
- https://github.com/vuejs/vue-cli/issues/968
Mac — Alfred で スニペットの中にクリップボードのテキストを埋め込む

ありがとうあるふれっど‥これがほしかったんだよ…！ 

これでかなりMarkdown記事を書くのが楽になりそうだ。

## 例

`{clipboard:n}` 記法は「指定番号前のクリップボード履歴」のテキストとして展開される。

### スニペット登録


```
[{clipboard:0}]({clipboard:1})
```

ちょっと分かりにくいだろうか？

- `[TITLE](URL)` の部分がマークダウン記法
- `{clipboard:0}` `{clipboard:1}` の部分がAlfredの記法

![image](https://user-images.githubusercontent.com/13635059/44812678-deabf400-ac12-11e8-99b9-ca8079a6ff09.png)

### アドレスバーなどからURLをクリップボードにコピーする

![image](https://user-images.githubusercontent.com/13635059/44813141-0e0f3080-ac14-11e8-8d72-54403b9b4366.png)

### Webページのテキストなどからタイトルをクリップボードにコピーする

![image](https://user-images.githubusercontent.com/13635059/44813237-50387200-ac14-11e8-8c7b-f6df59c8fd40.png)

### Alfredでスニペットを選ぶ

![image](https://user-images.githubusercontent.com/13635059/44813052-cf797600-ac13-11e8-890f-6fbdd8288294.png)

### 結果. 成功

![image](https://user-images.githubusercontent.com/13635059/44813062-d56f5700-ac13-11e8-83be-9f62490d20df.png)

```
[Mac Alfred App — Include current clipboard text to snippet text
](https://gist.github.com/YumaInaura/0a17ad7823e00b22cd76695429d47726)
```

## 記法を思い出す

登録画面からいつでもチェック可能

![image](https://user-images.githubusercontent.com/13635059/45196924-98513780-b299-11e8-8793-d1d07d45462f.png)

## Ref

[Dynamic Placeholders - Alfred Help and Support](https://www.alfredapp.com/help/features/clipboard/dynamic-placeholders/)

## Versions

- Alfred v3.3.2
- Max OS X High Sierra

## Links

- [Gist](https://gist.github.com/YumaInaura/0a17ad7823e00b22cd76695429d47726)
- [Medium—imported](https://medium.com/supersonic-generation/mac-alfred-app-include-current-clipboard-text-to-snippet-text-dynamic-placeholders-5aed967482e3)









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Bash — echo で連番を出力する


## 例

### 素直なやつ

```
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
```

### 0埋め

```
$ echo {01..10}
01 02 03 04 05 06 07 08 09 10
```


### 逆順

```
echo {10..1}
10 9 8 7 6 5 4 3 2 1
```

### セクション分け

```
echo {1..3} {6..9}
1 2 3 6 7 8 9
```

### 任意指定

```
echo {1,2,5,7,9}
1 2 5 7 9
```

### マイナス値

```
echo {-5..5}
-5 -4 -3 -2 -1 0 1 2 3 4 5
```

### ミックスして使う

```
echo {1,7,9} 6 {05..-1}
1 7 9 6 05 04 03 02 01 00 -1
```

### ループさせる

```
for i in {1..10}; do echo "$i"; done
1
2
3
4
5
6
7
8
9
10
```

## Version

- bash 4.2

## Links

- [Gist](https://gist.github.com/YumaInaura/5d11011781fc2db4dd8b5253bc96e27a)
- [Medium—imported](https://medium.com/supersonic-generation/bash-echo-repeated-number-ed2a704ccdf5)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
git + peco + Vim — git grep でマッチしたファイルを選んでVim で編集する


## イメージ

- `echo` という文字列があるファイルを `git grep` する
- 12行目でマッチしているファイルを選ぶ

![image](https://user-images.githubusercontent.com/13635059/44803731-40ac2f80-abfa-11e8-9839-85b8365107b7.png)

- Vimで12行目から編集開始できる

![image](https://user-images.githubusercontent.com/13635059/44803733-41dd5c80-abfa-11e8-9cbb-e4328ed012ea.png)

## ポイント

- `$EDITOR` の環境変数で利用するエディタを決める
- `git grep --line-number` オプションを使って、git grepで引っかかった行を読み込むようにする ( Vim を使う場合 )
- git grep の結果からファイルパスをパースする
- peco を使ってインクリメンタル検索をする
  - [peco/peco: Simplistic interactive filtering tool](https://github.com/peco/peco)
  
## スクリプト例

```sh
#!/usr/bin/env bash -eu

# Usage
#
# $ command [grep-keyword] --some-grep-option

# 利用するエディタを環境変数から決める
readonly editor=${EDITOR:-vim}

# peco が入っていなければ終了する
if [ ! $(which peco) ]; then
  echo You need peco please install
  exit
fi

# git grep する
# git grep には自由なオプションを渡せるようにしておく ( --line-number をのぞいて )
readonly git_grep_result=$(git grep --line-number $@)

# git grep のマッチ結果がなければ終了する
if [ -z "$git_grep_result" ]; then
  echo No match with git grep
  exit
fi

# git grep の結果からpecoで検索モードに入る
readonly git_grep_select=$(echo "$git_grep_result" | peco --query="$1")

# peco での選択結果がなければ終了する
if [ -z "$git_grep_select" ]; then
  exit
fi

# pecoで選んだ行からファイルパスをパースする
readonly filepath=$(echo "$git_grep_select" | awk -F':' '{ print $1 }')

# git grep の結果からファイルの行番号をパースする
readonly line_number=$(echo "$git_grep_select" | awk -F':' '{ print $2 }')

if [ ! -z "$filepath" ]; then
  # エディタが Vim なら 引っかかったファイル行番号から開くようにする
  if [[ "$editor" =~ vim ]] && [ ! -z "$line_number" ]; then
    eval "$editor" +"$line_number" "$filepath"
  else
    eval "$editor" "$filepath"
  fi
fi
```

[gitim/git-grep-edit at acdbbf9bcbfd92e10d62be3f92bff5e6e5b0366e · YumaInaura/gitim](https://github.com/YumaInaura/gitim/blob/acdbbf9bcbfd92e10d62be3f92bff5e6e5b0366e/bin/git-grep-edit)

## Versions

- git version 2.8.1
- peco version v0.5.3 (built with go1.10)
- bash 4.2
- Mac OS High Sierra

## Links

- [Gist](https://gist.github.com/YumaInaura/ed6963ad1b0898299628b1291e2e71f4)
- [Medium—imported](https://medium.com/supersonic-generation/git-git-grep-and-edit-with-editor-e-g-vim-fae7d468530f)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider


## 環境

```
Android Studio 3.2 RC 2
Build #AI-181.5540.7.32.4974118, built on August 24, 2018
JRE: 1.8.0_152-release-1136-b06 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
macOS 10.12.6
```

## 現象

Android Studioでビルドしたところ、アプリ起動すると即エラーメッセージが出て落ちる状態になった。

端末はOS4.4.2 (Kitkat)

```logcat
java.lang.RuntimeException: Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider"
```
 
FirebaseInitProvider...？
 
なんだこのエラーメッセージは？？
 
## 解決方法
 
どうやらAPIレベル19以下でメソッド数が65kの壁を超えたら出るエラーメッセージらしいので、MultiDex化する必要がある。

Oreo端末ではビルドできるのになぁ

```gradle:app/build.gradle
multiDexEnabled true
compile 'com.android.support:multidex:1.0.1'
```

```java:MyApplication.java
public class MyApplication extends MultiDexApplication
```

これでKitkat端末でも起動できた

あのエラーメッセージのどこにMultiDexが関係あるのか...
pre-commit と pre-push

# [Husky](https://github.com/typicode/husky)

## TL;DL

.git/hooks/**じゃなくて、[Husky](https://github.com/typicode/husky)を入れてれば大丈夫ってはなし。

_versionは、[Stable](https://github.com/typicode/husky/tree/v0.14.3)じゃなく、[develop branch](https://github.com/typicode/husky)を想定_

## Install

```terminal
$ cd project-path
$ npm install husky@next --save-dev
```

## Setting Up

```package.json
{
  "devDependencies": {
    "husky": "^1.0.0-rc.13",
  },
  "husky": {
    "hooks": {
      "pre-commit": "npm test",
      "pre-push": "npm test",
    }
  }
}
```

pre-commitのタイミングで、npm testがはしる。
pre-pushのタイミングでnpm testが走る。lintやprettierをいれてじゃまなファイルチェンジを無くしたい。

### Pre-commit

ファイルが変更される可能性があるものは、基本的にpre-commitのイメージかなと。
なので、[Prettier](https://github.com/prettier/prettier)とかが該当かと。

### Pre-push

ファイルが変更されて、問題ないものが基本的にpre-pushのイメージかなと。
なので、test、lint系統がメインになるかと。

他に指針でこれ使ってるよーとかあればください。
macOSにhomebrewでffplayをインストールする

```sh
brew install ffmpeg
```

だけでok。ffplayも一緒にはいります。

古い資料だと`--with-sdl2`とか`--with-ffplay`をつけろと書いてあるのだけど、最新版だとなにもつけなくてもよくなっていた。

**動作チェック**

カメラの映像がでるよ

```sh
ffplay -f avfoundation -framerate 30 -i "0:"
```
Laravel の migrate で Base table or view already exists というときに、migrate:refresh した


`php artisan migrate` したらテーブルがあるよと言われました。

```
docker-compose exec phpfpm /var/www/laravel/artisan migrate

Illuminate\Database\QueryException  : SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'posts' already exists (SQL: create table `posts` (`id` int unsigned not null auto_increment primary key, `title` varchar(255) not null, `created_at` timestamp null) default character set utf8mb4 collate 'utf8mb4_unicode_ci')
```

データベースのテーブルが既に存在する状態なので、エラーがでているみたいです。

# migrate の一覧をだす
`php artisan list` をすると一覧がだせるようです。

```
docker-compose exec phpfpm /var/www/laravel/artisan list  | grep migrate
  migrate              Run the database migrations
 migrate
  migrate:fresh        Drop all tables and re-run all migrations
  migrate:install      Create the migration repository
  migrate:refresh      Reset and re-run all migrations
  migrate:reset        Rollback all database migrations
  migrate:rollback     Rollback the last database migration
  migrate:status       Show the status of each migration
```

# migrate:fresh する
テーブルを捨てて作り直したいので、 `php artisan migrate:fresh` しました。

```
docker-compose exec phpfpm /var/www/laravel/artisan migrate:fresh

略
```

こんどはうまくいきました(☝ ՞ਊ ՞)

# 参考
https://readouble.com/laravel/5.5/ja/migrations.html
Github, GitLab上のnotebookをGoogle Collabで開く

# TL;DR
- githubやgitlab上のnotebookはgoogle collaboratoryで開いて実行できるよ！
- chromeの拡張機能を使ってササッと開けるようにするよ！

# 方法
urlの"github.com"または"gitlab.com"を"colab.research.google.com/github"に置換するだけ！

# 拡張機能でサクッと

[chromeの拡張機能](https://chrome.google.com/webstore/detail/url-replacement/hcggkglhggiegnomijleedobpnmgklim)を用います。

![Screenshot from 2018-08-30 02-28-14.png](https://qiita-image-store.s3.amazonaws.com/0/271822/70040b59-a3d1-0e11-03b6-f805a5ce121b.png)


設定はこれ以上ないくらいシンプル。


![Screenshot from 2018-08-30 02-30-02.png](https://qiita-image-store.s3.amazonaws.com/0/271822/b81c659b-beab-43c6-b747-3f721ed459b2.png)

右クリックすると置換して開いたろか？と聞いてくれます。置換してみると……


![Screenshot from 2018-08-30 02-32-02.png](https://qiita-image-store.s3.amazonaws.com/0/271822/3824ccd6-d078-8fcd-9774-7e3d225d087d.png)


開けました！！やったね！！！

# 参考
https://sekailab.com/wp/2018/05/24/colaboratory-github-jupyter-notebook/
論文からキーワード抽出してキーワード間の関係性を可視化した

# 本記事でやったこと
- KDD2018のホームページをスクレイピングし、論文のタイトル、アブストラクトを取得
- TF-IDF法により各論文からキーワードを抽出
- キーワード間の共起に基づきグラフを構築し、グラフを可視化

本記事のコードは[GitHub](https://github.com/haradai1262/kdd2018_visualization/)にて公開しています。

# スクレイピングより論文のタイトル、アブストラクトを取得

以下のコードにより、KDD2018のホームページをスクレイピングし、論文のタイトル、アブストラクトを取得します。

```python
papers = {}
target_url = 'http://www.kdd.org/kdd2018/accepted-papers'
r = requests.get(target_url)
soup = BeautifulSoup(r.text, 'lxml')
for i, item in enumerate( soup.select('a[href^="http://www.kdd.org/kdd2018/accepted-papers/view/"]') ):
    title = item.get_text()
    url = item.get('href')
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'lxml')
    s = soup.find('div', {'class': 'g-mb-60'})
    author = s.find('h6').get_text()
    author_list = [ n.strip() for n in author.split(';')]
    abst = s.find('p').get_text()
    
    paper = {}
    paper['title'] = title
    paper['author'] = author_list
    paper['abst'] = abst
    papers[i] = paper
```

# TF-IDFによる論文のキーワード抽出

### - TF-IDF法とは
TF(Term Frequency, 単語の出現頻度）とIDF（Inverse Document Frequency, 逆文書頻度）を掛け合わせることにより、各文書における単語の重要度を表すスコアを算出できる手法

本記事では、得られた単語の重要度を用いて各論文のキーワードを抽出します。TF-IDF法について詳細に知りたい人は具体例とかもあってわかりやすいので以下のサイト等を参考に。

#### TF-IDF法についての参考サイト
- [tf-idf - Wikipedia](https://ja.wikipedia.org/wiki/Tf-idf)
- [TF-IDFで文書内の単語の重み付け | takuti.me](https://takuti.me/note/tf-idf/)
- [【Pythonで分析】女子トーク、男子トーク、男女混合トークの会話内容を比べてみた](https://goworkship.com/magazine/ranran-python-boy-meets-girl/)


### - キーワード抽出結果

TF-IDF法により各論文から以下のように単語の重要度が取得される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/264359/48274457-8454-b355-f6bc-3284c51865d3.png)

そして、単語の重要度が閾値より大きいものをその論文のキーワードとする。
各キーワードを含む論文を整理すると以下のようになる。KDD2018はデータマイニングに関する国際会議であるため、"graph"や"cluster(clustering)"というキーワードを含む論文が多い。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/264359/708661da-be38-0748-4b20-f72d4754866c.png)

# キーワードに基づき論文の関係性を可視化

### - キーワードに基づき論文の関係性を表すグラフを定義
以下のようなグラフを作成する。
ノード：論文、キーワードをノードとして定義する
エッジ：論文とその論文に含まれるキーワード間にエッジを定義する

### - グラフ可視化

グラフの可視化には[Gephi](https://gephi.org/)を使用し、力学モデルによりノードを配置しています。可視化結果は以下の図です。緑色の文字がキーワード、ピンク色のxが論文です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/264359/ac3786a4-081e-728d-4a96-f8d4db335472.png)

上図では、グラフにおけるノードの次数が大きいほど、キーワードの文字サイズを大きくしています。
すなわち、KDD2018では"graph", "recommend", "cluster(clustering)"といったキーワードを含む論文が多いことが確認できます。

また、このグラフは論文上でのキーワード共起に基づきエッジが定義されています。
よって、このグラフから下図のように共起したすいキーワード群を確認することができます。

"risk"と"medic(medical)"や"visual"と"cnn"
![image.png](https://qiita-image-store.s3.amazonaws.com/0/264359/2c2aaca5-d235-d756-75aa-2a893aff2f67.png)

"ad","campaign"と"auction"や"privaci","mobile"と"event"
![image.png](https://qiita-image-store.s3.amazonaws.com/0/264359/a463ddf3-85ab-8b07-99ee-0c5267792481.png)


# 終わりに

本記事では、データマイニングに関する国際会議KDD2018の論文からキーワード抽出して、キーワード間の関係性をグラフにより表現し可視化しました。

論文に出現するキーワードの共起に基づく関係性を何となく確認することができたような気がしましたが、
キーワード抽出、グラフの作り方、グラフの可視化方法などもっと頑張れるところがあったようには思います。
マルチモジュール構成のAndroidプロジェクトでbuild.gradleの記述を共通化する

##モジュール毎のbuild.gradleのdependenciesの記述を共通化したい

Android Studioでレイヤー毎にモジュール化を行ったプロジェクトを作成した際に、モジュール間の依存性解決にKoinを用いたところ、各モジュールのdependenciesにそれぞれKoinに対するimplementationを記載しなければいけなくなった。

```groovy:app/build.gradle
dependencies {
    // Koin
    implementation "org.koin:koin-core:$rootProject.koin_version"
    implementation "org.koin:koin-android:$rootProject.koin_version"
}
```

すべてのモジュールにこれを記載していくのはあまりイケていないなー。共通化したいなと思い、なにか良い方法が無いかなと調べたところ、プロジェクトレベルのbuild.gradleに`subprojects`ブロックを定義するとすべてのモジュールで共通となる記述をまとめることが出来るようなので、試してみました。

ところが`implementation`が定義されていないよ的なエラーがでてGradle Syncが失敗する…

原因調べたところ、appモジュールやライブラリモジュール作成時に定義されている

```groovy
apply plugin: 'com.android.application'
```
などの後に定義する必要があるようです。たしかにそうですね。

##解決方法
上記の`apply plugin`の部分を`subprojects`に移動したのですが、1つ困った事があり、

|モジュールのタイプ|プラグイン名|
|:-----------|:------------|
|App Moduleの場合|com.android.application|
|Android Library Moduleの場合|com.android.library|

みたいな感じでプラグイン名を変える必要があったのでモジュール名によって判定するコードを追加しました。

```groovy:build.gradle
subprojects {
    switch (project.name) {
        case 'app':
            apply plugin: 'com.android.application'
            break
        default:
            apply plugin: 'com.android.library'
            break
    }

    dependencies {
        // Koin
        implementation "org.koin:koin-core:$rootProject.koin_version"
        implementation "org.koin:koin-android:$rootProject.koin_version"
    }
}
```

Java LibraryやDynamic Feature Module等を使用している場合はまた別のプラグインとなるので、

- モジュール名によって判定
- するか、モジュール名の命名規則を決めて`switch`文で正規表現を用いた判定などを行う

などの対応を行うと良いかと思います。

最初のswitch文だけ書いておけば、モジュール側のbuild.gradleに記述されている内容はほぼこちらに記載することが可能なので次のように
`android`ブロックの内容なども`subprojects`で共通化すれば、app, library側の`build.gradle`はかなりスッキリさせる事ができるのではないかなと思います。

```groovy:build.gradle
subprojects {
    switch (project.name) {
        case 'app':
            apply plugin: 'com.android.application'
            break
        default:
            apply plugin: 'com.android.library'
            break
    }

    apply plugin: 'kotlin-android'
    apply plugin: 'kotlin-android-extensions'

    android {
        compileSdkVersion 27

        defaultConfig {
            minSdkVersion 23
            targetSdkVersion 27
            versionCode 1
            versionName "1.0"

            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
    }

    kotlin {
        experimental {
            coroutines 'enable'
        }
    }

    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])

        // Kotlin
        implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:0.24.0'
        implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:0.24.0'

        // Koin
        implementation "org.koin:koin-core:$rootProject.koin_version"
        implementation "org.koin:koin-android:$rootProject.koin_version"
    }
}
```
PythonでDBFファイルをCSVファイルに、CSVファイルをDBFファイルに相互変換する話

https://github.com/Kanahiro/dbfConverter

一部GIS技術者等が用いるシェープファイル（.shp）には、その図形データに加え、プロパティデータであるdBaseファイル（.dbf）があり、このファイルの編集が必要になることがよくある。

Excel2003までは編集に対応していたようだが、以降は読み取りのみ対応で、書き込みはMicrosoftAccessを使うようになり、利便性は落ちていました。

そんなわけで、DBFをエクセルだけで処理できたらなぁと思って、CSVとDBFを相互に変換するスクリプトを書きました。
編集したいDBFファイルをCSVに変換して、CSVをエクセルで編集後DBFに再変換すればよいというわけです。
手持ちのシェープファイルでのみ試したので、バグがあれば連絡頂ければと思います。

そのうちWindows環境の実行ファイルをつくります。
もしくは上記のリンクからスクリプトをダウンロードして、各自Pyinstallerでコンパイルしてもらっても大丈夫です。

※8.31追記
.exe形式の実行ファイルをgithubに登録しました。DBFファイルをドラッグドロップしたらCSVファイルを出力、CSVファイルならDBFファイルを出力します。
CFRアルゴリズムについて

# CFRとは
最適戦略を見つける手法です。
主にポーカーAIに用いられ、プロポーカー４人相手に大差をつけ勝利した"Libratus"がCFRにモンテカルロ法を適用したMCCFRを利用しています。

#どんなアルゴリズムなのか
CFRではゲーム中の選択肢に関してどれを選べば勝率が一番高いかを計算します。
例えば、ポーカーにおいて、あなたは以下の選択肢を持っているとしましょう。

- 賭けに出る
- 賭けを降りる

あなたの手札かブタ（価値なし）なら賭けを降りるべきでしょう。手札がまぁまぁの強さなら、賭けに出ても良いかもしれません。
どちらの選択肢を選べば良いか、CFRではシミュレーションを行い学習します。シミュレーション中、CFRは「効用」と「後悔」に着目します。「効用」とはゲームの勝敗結果を数値で表わしたもので、買ったら1点負けたら−1点という具合に設定できます。「後悔」とは(自分が選択しなかった選択肢の効用)-(自分が選択した選択肢の効用)という式で計算されます。つまり、CFRでは選択しなかった選択肢を選択したらどうなるのかを計算するのです。


学習は以下のステップを踏んで行われます。

1. 後悔を計算するプレイヤーを一人選択する。ただし、他のプレイヤーはこれまでの学習結果を利用する。
2. 選択されたプレイヤーがゲーム中に選択を求められる場面に達すると、プレイヤーはこれまでの学習結果を利用し選択を行う。
3. プレイヤーが選択しなかった選択肢を選択した場合の効用をサンプリングする。
4. プレイヤーが選択しなかった選択肢の効用に比例する値を後悔の値とする。
5. 後悔の値の累積値を更新し、和１に正規化し新たな戦略とする。

# 終わりに
今回の説明では多分に省略された部分があります。ですので、大筋を掴んでもらえればと思います。より詳細を知りたい方は、以下に示す今回参考にした文献を参照してください。

参考文献　[An Introduction to Counterfactual Regret Minimization](http://modelai.gettysburg.edu/2013/cfr/cfr.pdf)