OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidアプリにSalesForce MarketingCloud SDKを導入する


ちょっと前にAndroidアプリにSalesForce MarketingCloudのSDKを導入したので、どこを参考にしたのか何をやったのか残しておく。

## 前提
- SalesForce MarketingCloudのアカウントを持っていて管理画面にログインできる
- Firebaseアカウント作成済み
- SalesForce MarketingCloudとFirebaseは紐づけ済み（サーバーキーとか）

## 参考先

### SDKガイド
Journey Builder for Apps Android SDK
http://salesforce-marketingcloud.github.io/JB4A-SDK-Android/

Android MarketingCloud SDKの更新情報、導入方法、機能の実装方法が記載されている。
ちなみに全部英語、難しい事は書いてないしコードを見れば分かる。

### Github
salesforce-marketingcloud/LearningAppAndroid
https://github.com/salesforce-marketingcloud/LearningAppAndroid

実際にAndroidアプリに導入したサンプルコードがある、もちろん英語。

ちなみにこのリポジトリをcloneしてそのままビルドしてもエラーになるので注意！
サポートライブラリのバージョンを、MarketingCloudSdk内部で使用しているサポートライブラリのバージョンを合わせなくてはならない。
（導入部分で説明）

## SDK導入の実装

実装内容は[SDKガイド](http://salesforce-marketingcloud.github.io/JB4A-SDK-Android/sdk-implementation/implement-sdk-google.html)に詳しく載っている。
以下は自分がやった必要な事だけをまとめる。

### build.gradle

以下を追加

```diff:build.gradle
allprojects {
    repositories {
+       maven { url "http://salesforce-marketingcloud.github.io/JB4A-SDK-Android/repository" }
    }
}
```

### app/build.gradle

以下を追加

```diff:app/build.gradle
dependencies {
+ compile ('com.salesforce.marketingcloud:marketingcloudsdk:5.6.3') {
+   exclude module: 'android-beacon-library' //ビーコンメッセージを使うならこの行を削除
+   exclude module: 'play-services-location' //ジオフェンスメッセージを使うならこの行は削除  }
}

//11.8.0を指定
+compile 'com.google.android.gms:play-services-maps:11.8.0'
//サポートライブラリは27.1.0に合わせる
+compile 'com.android.support:appcompat-v7:27.1.0'
+compile 'com.android.support:design:27.1.0'
```

今日(2018/09/07)時点で最新Sdkは5.6.3だった。
**この5.6.3ではPlayServideは`11.8.0`, サポートライブラリは`27.1.0`に合わせないとエラーメッセージがでるので注意**


ビーコン/ジオフェンスメッセージ機能を使わないのでexcludeで除外しているが、使う場合はexclude行を削除する。

### カスタムApplicationでsdk設定
カスタムApplicationクラスを作成し、Sdkの初期設定を行う。
ここでアプリId、アクセスToken、GcmSenderId設定する。

```java
public class AndroidApp extends Application {

  @Override public void onCreate() {
    super.onCreate();

    MarketingCloudSdk.init(this, MarketingCloudConfig.builder()
        .setApplicationId("applicationId")
        .setAccessToken("accessToken")
        .setGcmSenderId("gcmSenderId")
        .setNotificationSmallIconResId(R.drawable.ic_notification)
        .setNotificationChannelName("My Notifications") // <=APIレベル26以上なら必須
        .build(), new MarketingCloudSdk.InitializationListener() {
            @Override
            public void complete(@NonNull InitializationStatus status) {
                if (status.isUsable()) {
                    Log.d(TAG, "MarketingCloudSdkが使用可能");
                } else {
                    Log.d(TAG, "MarketingCloudSdkに問題が発生");
                }
            }
        }
);
```

AndroidManifestにカスタムApplicationを登録するのも忘れずに

```diff:AndroidManifest.xml
    <application
+       android:name=".AndroidApp"
```

ここで一旦ビルドし、Logcatに`MarketingCloudSdkが使用可能`と表示されればSdkの導入完了。

あとはMarketingCloud管理画面からビルドした(インストールした）アプリの情報が確認できるはず。

もう管理画面からPushメッセージが送れるはずなので、連絡先リストのようなものを作って端末を追加し、そのリストに対してPushメッセージを送れば届くはず。
ファンファンのファン問題をpythonで 

#はじめに
FizzBuzzに変わる初心者用問題として[ファンファンのファン問題](https://qiita.com/yamamoto_hiroya/items/2633491dd4c7f6550c1d)なるものが提唱されていたのでpythonでやってみた。僕は一度もFizzBuzzをやったことがなかったので、遅い免許証ですね

#コード

```python
a="ファン"
for i in range(10):
    print(a*3+" "+a*2+"の"+a)
```

```text
ファンファンファン ファンファンのファン
ファンファンファン ファンファンのファン
ファンファンファン ファンファンのファン
ファンファンファン ファンファンのファン
ファンファンファン ファンファンのファン
ファンファンファン ファンファンのファン
ファンファンファン ファンファンのファン
ファンファンファン ファンファンのファン
ファンファンファン ファンファンのファン
ファンファンファン ファンファンのファン
```

終わり(笑）文字列の掛け算ができることを知っているとこうなる。
でもたぶんスマートに1行でかけちゃったりするやりかたあるんだろうなあ。

#以下関係ない話
今回はこんなチラ裏な記事を酒の勢いで書いてしまいましたが、自分のやったことを記事にしていいねもらえるのはやはり嬉しいです。
こういうのをルーティンにするとプログラミングが上達しそうですね。他に記事を見ていると初心者が初心者な記事を投稿してもqiitaは許される環境みたいなので、これからプログラミングをやっていきたい人はぜひqiitaを活用していきましょう！！　
(僕はpytorchのcontributerランキングを目指していきたい)
php-master-changes 2018-09-06

# 2018-09-06
## villfa: Fix typos in UPGRADING.INTERNALS
- https://github.com/php/php-src/commit/ec110f1ecc60d87a74a2ae7860b3a6fa2b9620d6
- UPGRADING.INTERNALS の typo を修正
- 実はこっちでも[昨日](https://qiita.com/sj-i/items/21ff7e37686ae4b6d7b1#dstogov-get-rid-of-zend_acc_ctor-zend_acc_dtor-and-zend_acc_implemented_abstract)見てて気付いたのだけど、良いツッコミ速度だなあ

## weltling: Sync with recent changes to default libcurl build
- https://github.com/php/php-src/commit/a1ba3007a452fb2618526ed7159236362219a208
- ext/curl の windows ビルドをいじってる
- 0x073b00 は 0x07 0x3b 0x00 で 7.59.0 の意味
- libcurl 7.59.0 以前とそれより後のバージョンで依存ライブラリのチェックを変えてるのかな

## dstogov: Fixed support for commutative "user opcodes"
- https://github.com/php/php-src/commit/1d36c3361fcad50d17d660d13fdcfebfde478dad
- オペランドを交換可能な (commutative な) ユーザオペコードのサポートを修正
- オペコードハンドラは受け取るオペランドのタイプに応じ、異なる実装を持つ
- 各実装は zend_vm_gen.php で template 的に自動生成
- commutative なオペコードではコンパイルの最後に呼ばれる pass_two() で op_array 内でオペランドを必要に応じスワップすることでソートしてしまい、A, B の順でオペランドをとる場合も B, A の順でオペランドをとる場合も同じハンドラコードを使えるようになっている
- そして不要になるパターンのオペコードハンドラは zend_vm_gen.php で生成されない
- Xdebug の PHP 7.3 対応で、これに関するバグで正しくスワップがされず、[internals へ投げられ](https://externals.io/message/103128)、修正されたという経緯
- zend_set_user_opcode_handler() でオペコードハンドラを拡張から差し替えた際にこのスワップが行われなくなっていたので、サポートするよう case を追加した形、かな

## petk: Remove netware header
- https://github.com/php/php-src/commit/b1f65fb25b2b054d98f2db4b30f20f8368740b5a
- ディスコンの Netware のサポート用ヘッダを削除
Laradockでプロジェクトごとに環境構築する

LaradockでLaravel環境構築する体験が良くて他のプロジェクトでも導入しようとしたら
思いの外ハマったので、同じことで困っている人や昨日の自分に向けて

- docker 18.06.1-ce
- docker-compose 1.22.0
- macOS High Sierra 10.13.6

### dockerのstorage等の保存先の変更
初期設定だと環境変数で、どのプロジェクトでも同じデータを参照してしまうので、MySQLが立ち上がらないなどの問題がでてくる。場所は`.env`の14行目くらい

```.env
# DATA_PATH_HOST=~/.laradock/data
DATA_PATH_HOST=.laradock/data
```

### プレフィックスを変更する
コンテナ名が被りコンテナボリューム内にデータが混在する可能性があるので33行目あたりを固有のプロジェクト名などに変更する。わたしは見事にlaradock_~のプレフィックスがついたコンテナが立ち上がりプロジェクトによってミドルウェアやドキュメントルートの変更ができずハマってしまった。
こちらは`.env`の33行目あたり

```.env
# COMPOSE_PROJECT_NAME=laradock
COMPOSE_PROJECT_NAME=private-laradock
```

すでにコンテナが立ち上がっている場合はポートが被って`docker-compose up`が失敗するので
書き換える前に`docker-compose stop`や`docker-compose down`をしてコンテナを止めて置く必要がある。

```
% docker-compose up -d apache2 mysql
% docker-compose ps
               Name                              Command               State                    Ports
--------------------------------------------------------------------------------------------------------------
private-laradock_apache2_1            /opt/docker/bin/entrypoint ...   Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
private-laradock_docker-in-docker_1   dockerd-entrypoint.sh            Up      2375/tcp
private-laradock_mysql_1              docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp, 33060/tcp
private-laradock_php-fpm_1            docker-php-entrypoint php-fpm    Up      9000/tcp
private-laradock_workspace_1          /sbin/my_init                    Up      0.0.0.0:2222->22/tcp```
```

#### おまけ
色々と試行錯誤していく中で変更が反映されない事があり`docker-compose build --no-cache`をやると
必要以上に時間が掛かるので`docker-compose build --no-cache apache2 mysql`でサービス名を指定するのが吉。
(使わないサービスのイメージも再ビルドしてしまうのが原因)

参考
[LaravelとLaradockを使ったチームでの開発環境を用意する vol.1 ~Laradock設定編~](https://qiita.com/dev_satsuki/items/e2769925da33bfa77df5)
[Docker-docs-ja](http://docs.docker.jp/compose/reference/envvars.html)
ErgoDoxEZでキーロックをホールディングで対応

またまたErgoDoxEZで、わざわざ使わないキーを設定しようと思いついた。
そして、使えない設定をすれば、設定しても設定していないことになるだろうとも思った。
(酔っていない。素面だ)
素面故に、あとあと間違いに気づいた。

ちなみに、タイトルに使っている"ホールディング"とは、キーを押し続けていることを表している。

#キーロックキー
不思議なことに、キーをロックするキーが存在する。なかなかロックな感じだろう？
何のために存在するのか分からないが、 ~~一時的にキーを使えないようにするためで、普段は使えるようにしておきたいからかもしれない。~~ 一時的に有効化したい人用かも知れない。

設定するまで勘違いしていたのだが、使えなくするのではない。
全く関係のない話だった。

以下のキーを代替ロック可能だ。

* [Caps Lock](https://ja.wikipedia.org/wiki/CapsLockキー "ウィキペディア")
* [Num Lock](https://ja.wikipedia.org/wiki/NumLockキー "ウィキペディア")
* [Scroll Lock](https://ja.wikipedia.org/wiki/スクロールロック "ウィキペディア")
* その他

3種類が標準でロック可能キーとして用意されている。
いわゆる、何チャラロックキーだ。

今までのキーでは、いわゆる[トグルキー](https://www.weblio.jp/content/トグルキー "weblio辞書")と言われ、1回の押下でOnになり、再度押下することでOffにする。
例えば、半角全角キーと同じ感覚だと思えば良いだろう。
現在の状態がどうなっているのかは、何かしらのキー操作をしなければ判断できない不便な状態だ。
それを払拭したのが今回のキーで、押下しているときだけ、有効化する代物だ。

今回設定するキーを押し続けているときだけ、このロックキーを有効化可能になっている。
以下のキーを設定する。

##Caps Lock
キャップスロックキー：`KC_CAPSLOCK`
ロックキー：`KC_LOCKING_CAPS`

押しているときだけキャップスロックキーが有効化される。
Shiftキーの役割と何が違うのかイマイチ分からないが、普段キャップスロックキーを使っていないので、そう思うのだろう。

##Num Lock
ナムロックキー：`KC_NUMLOCK`
ロックキー：`KC_LOCKING_NUM`

これは、押下しているときだけ、ナムロックが無効化される。
通常は、有効化されているため、なかなか使い勝手がよろしくないように思う。
[NumLockとは・・ 数字で「固定する」「ロックする」](https://www.pc-master.jp/sousa/numlock.html "パソコン初心者講座")

具体的には、テンキーの`7`キー押下で、数字の7が入力されると思う。
そして、ナムロックキー押下で、`Home`キーとして機能するようになる。

しかし、今回の設定では、`KC_LOCKING_NUM`を押しているときに限り、数字の7が入力可能になる。
そして、何も押していない状態で、テンキーの7キーを押したときの挙動は、`Home`キーとして動く。
これは結構困るかも・・・。

##Scroll Lock
スクロールロックキー：`KC_SCROLLLOCK`
ロックキー：`KC_LOCKING_SCROLL`

押しているときだけスクロールロックキーが有効化される。
Excelソフトを頻繁に使う人には有意義なキーかも知れない。

[ScrollLock キーをオフにする](https://support.office.com/ja-jp/article/ScrollLock-キーをオフにする-a78492cc-c124-4782-a38b-df46669520e0 "マイクロソフト")

###ErgoDoxEZの矢印キー
Vimエディタでの操作と同じキーを矢印キーに設定しているのだが、今回はExcelソフトウェアを使って、キー効果を確かめた。
そのときの矢印キー操作が難航を極めた。
慣れていないためなのか分からないが、Excelとは相性が悪いように感じた。

##その他[Key Lock](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_key_lock.md "QMK公式ページ")
`KC_LOCK`単体のキーコード設定が何か分かっていない。

> Hold down the next key pressed, until the key is pressed again

しかし、上記の3種類が使えるのであれば、気にしなくていいかもね。


#AutoHotKey(AHK)でのキーロック
そもそも、上記3種類のキーは、AHKで、無効化していた。

```AutoHotKey:AutoHotkey.ahk
ScrollLock::return	; スクロールキー無効
NumLock::return	; ナムロックキー無効
Capslock::return	; キャップスロックキー無効
```

そして、物の見事に、AHKはその役割を忠実に働かせてくれていたようで、今回の実験を失敗に誘うことに成功したようだ。
最初設定していたことを忘れており、なぜ動かないのか不思議だったほどだ。
素晴らしいAHKに拍手を送りたい。

もう一つ言わせてくれ。
今まで、AHKには、"Ctrl+H"の組合せで、バックスペースキーの役割を設定していた。
今回の動作確認で終了していたため、その組合せも使えなくなってしまった。
やはり、改めて思うことは、キーボードだけで完結できる仕組みを作っておかなければ、外部のアプリに頼っていた場合、(もしそのアプリを起動していなければ)混乱を極めることになってしまうと・・・。
今更ながらに思った。

#キー設定は普段通り
AキーやBキーのように設定すれば普通に使える。

```ErgoDoxEZ:keymap.c
　　・
　　・
　　・
KC_Q, KC_LOCKING_CAPS, KC_LOCKING_NUM, KC_LOCKING_SCROLL, KC_T
　　・
　　・
　　・
```

デフォルトのキー配列(qwerty)で言えば、Wキー・Eキー・Rキーにそれぞれ差し替えている。
そして、名前が長いためか、エイリアスも割り当てられている。
KC_LOCKING_CAPS　⇒　KC_LCAP
KC_LOCKING_NUM　⇒　KC_LNUM
KC_LOCKING_SCROLL　⇒　KC_LSCR

・通常のロックキーもエイリアスが存在する。
KC_CAPSLOCK　⇒　KC_CLCK, KC_CAPS
KC_SCROLLLOCK　⇒　KC_SLCK
KC_NUMLOCK　⇒　KC_NLCK

エイリアスで動作確認したわけではないが、使えるだろう。
以上だ。
Nim を Pythonのctypes 経由で Python から呼び出す。（NumPy渡せたよ）

#　　本日は

仕事のピークがすぎた後、また忙しくなるっぽいんで久々にQiita書きます。
今日はPython　から Nim を呼び出してみましょう。
[PythonからNimを nimpy 経由で呼び出す.](https://qiita.com/SatoshiTerasaki/items/6f2736006dbb013086ee)
でも簡単なやりとりはできますが、Numpyを突っ込ませることができませんでした。今回は NumPy も引数に渡す方法を紹介します。

次の記事、フォーラムを参考にしました。

- http://akehrer.github.io/posts/connecting-nim-to-python/
- https://forum.nim-lang.org/t/2555

# 使う道具

- Nim

Ubuntu, Mac では choosenim を使うのが一番楽ですね。
[choosenimでnim環境構築](https://qiita.com/honeytrap15/items/2c7ebe20cb69df8c53c9)
が参考になると思います。

- Python, NumPy, [ctypes](https://docs.python.jp/3/library/ctypes.html)

# 方針
1. Nim はコードを C に変換してそのコードをCのコンパイラーに委ねます。
ということは、Nimの関数に対応するCのコードの関数を見つけてそれの入出力を合わせてあげればいいわけです。
1. Nim のコンパイラオプションとして、Cのコードを共有ライブラリにさせることができます。
1. 一方で、Python は ctypes という標準ライブラリを持っています。と言うことは上で作成した共有ライブラリをロードすればいいわけです。

# やってみよう

入力が配列になるような適当な関数を記述してみます。

```nim:do_something.nim
proc do_something*(xs:openArray[float], ys:openArray[float]):float {.exportc, dynlib.}=
  var s:float=0.0
  for i in low(xs)..high(xs):
    s += xs[i]+ys[i]
    echo "s = ", s
  s
```

２つ配列を受け取って要素を全部足します。中身のセンスの良し悪しは別にして
これをコンパイルします。

```console
$ nim c -d:release --app:lib do_something.nim
```

そうすると（Macで書いているので）　`libdo_something.dylib` が出来上がります

これをPythonから呼び出します。

```python:main.py
from ctypes import *

import numpy as np

logging.basicConfig()
logger = logging.getLogger()
logger.setLevel(logging.INFO)


def main():
    logger.info("load library")
    test_lib = cdll.LoadLibrary("libdo_something.dylib")
    np_array = np.array([1, 2, 3, 4, 5, 6, 7, 8]).astype(np.float64)
    test_lib.do_something.argtypes = [np.ctypeslib.ndpointer(flags="C"), c_int,
                                      np.ctypeslib.ndpointer(flags="C"), c_int]
    test_lib.do_something.restype = c_double
    res = test_lib.do_something(np_array, 8, np_array, 8)
    logger.info(res)


if __name__ == '__main__':
    main()
```

実行例は次の通り

```
$ python main.py
INFO:root:load library
s = 2.0
s = 6.0
s = 12.0
s = 20.0
s = 30.0
s = 42.0
s = 56.0
s = 72.0
INFO:root:72.0
```

期待していた通り 72 が出ました。

# 注意したいこと

Python から呼び出す関数はNimで書いたコードになかった引数が追加されます。Nimに渡す各々の配列の長さを入れる必要があります。

```python
test_lib.do_something.argtypes = [np.ctypeslib.ndpointer(flags="C"), c_int,
                                      np.ctypeslib.ndpointer(flags="C"), c_int]
```

Nim が吐き出すCの外部から見える関数のインターフェースはヘッダーをみると良いです。
Nim のコンパイルオプションを調べるとそれが可能と言うことがわかります。

[Nim Compiler User Guide](https://nim-lang.org/docs/nimc.html)
> --header:FILE | the compiler should produce a .h file (FILE is optional) 

といふことで、`--header` オプションを追加して再コンパイル

```
nim c -d:release --header --app:lib do_something.nim
```

`./nimcache/do_something.h` を確認すると次のような記述が見えると思います。

```C
N_LIB_IMPORT N_CDECL(NF, do_something)(NF* xs, NI xsLen_0, NF* ys, NI ysLen_0);
```

`xsLen_0` と `ysLen_0` が見えますね。これが配列の要素数に相当します。

`NF` や `NI` は `~/.choosenim/toolchains/nim-0.18.0/lib/nimbase.h` にて定義されてます。

ヘッダーを除けば雰囲気をつかめるのでそこから類推して関数の引数、戻り値の型を設定してあげませう。

#　まとめ

PythonからNimを呼び出せました。引数でNumPyが使えます。
これで上位の部分をPythonで書いてスピードが必要な部分は　Nim で書くというコンビができます。
RHEL7 での GNU GLOBAL のインストール

# はじめに
ソースコードをブラウザで参照するため、以下で紹介されている GNU GLOBAL を使ってみた。
※エディタではなく、ブラウザで参照するつもりなので、エディタ関連はスルー。

https://www.machu.jp/diary/20090307.html

#事前準備
やってないと後述の make が失敗する。

```shell-session
$ yum -y install ncurses-devel
```

#インストール

```shell-session
$ cd /usr/local/src
$ wget http://tamacom.com/global/global-6.6.2.tar.gz
$ tar xvfz global-6.6.2.tar.gz
$ cd global-6.6.2/
$ ./configure
$ make
$ make install
```
#HTML の作成

とりあえず ruby-2.2.5.tar.gz でやってみた。

```shell-session
$ wget https://ftp.ruby-lang.org/pub/ruby/2.2/ruby-2.2.5.tar.gz
$ tar zxvf ruby-2.2.5.tar.gz
$ cd ruby-2.2.5/
$ gtags -v
$ htags -safnow
```
上記の ruby-2.2.5 を DocumentRoot (/var/www/html) に移動し以下を設定した後に、apache を再起動。

```shell-session
$ vi /etc/httpd/conf/httpd.conf
::
    ScriptAlias /ruby-2.2.5/HTML/cgi-bin "/var/www/html/ruby-2.2.5/HTML/cgi-bin/"

</IfModule>

<Directory "/var/www/html/ruby-2.2.5/HTML/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
</Directory>
::
```

終わったら http://localhost/ruby-2.2.5/HTML/ にアクセス。

以下は kernel の src.rpm を使った場合。あとは DocumentRoot (/var/www/html) に移動し、httpd.conf 編集すること。

```shell-session
$ yum -y install rpm-build
$ yumdownloader --source kernel
$ subscription-manager repos --enable=rhel-7-server-optional-rpms 
$ yum-builddep -y  kernel-3.10.0-862.11.6.el7.src.rpm
$ rpm -ivh kernel-3.10.0-862.11.6.el7.src.rpm
$ cd /root/rpmbuild/SPECS
$ rpmbuild -bp kernel.spec
$ cd /root/rpmbuild/BUILD/kernel-3.10.0-862.11.6.el7
$ gtags -v
$ htags -safnow
```

複数のソースを参照する場合などを考えた自動化などは要検討。

#おまけ

RHEL のカーネルのソースについては以下のページでも確認可能。

Red Hat Code Browser
https://access.redhat.com/labs/psb/
DUALだけで多行を生成するSQLクエリをいろいろ挙げてみる(Oracle)

## はじめに

行をその場で生成するとき、少ない行数ならUNION、ある程度多くなると階層や再帰クエリを使用するのが一般的かとおもわれますが、それ以外にもいろいろと方法はあります。一部はあまり実用的ではありませんが、オラクルのクエリには行を作れる機能がこんなにあるんだよーという参考としてどうぞ。

ここでは例としてそれぞれ10行のみ生成しています。10行あればファクタリング(CTE)して直積すれば大きな行数にも対応できますからね。というか、下手に大きな行数を直接取り出すよりも直積のほうが明らかに早いです。なんといってもデータベースですから。

```sql:直積例
WITH t as (select level from dual connect by level <= 10)
SELECT COUNT(*) FROM t,t,t,t,t,t;

        COUNT(*)
----------------
      10,000,000
```

## いろいろな行生成方法

それではいってみましょう。
以下、数値を指定して直接任意の行数を生成することができるのは、「階層」「モデル」「再帰」「XML」です。

### UNION

一番ベーシックな方法です。

```sql:UNION
select rownum from (
  SELECT 1 FROM dual UNION ALL SELECT 1 FROM dual UNION ALL
  SELECT 1 FROM dual UNION ALL SELECT 1 FROM dual UNION ALL
  SELECT 1 FROM dual UNION ALL SELECT 1 FROM dual UNION ALL
  SELECT 1 FROM dual UNION ALL SELECT 1 FROM dual UNION ALL
  SELECT 1 FROM dual UNION ALL SELECT 1 FROM dual);
```

### 階層

階層クエリはもっともシンプルで一般的な方法です。様々な場面で使われています。LEVELで条件指定すれば必要な行数を簡単に取り出すことができます。しかし厳密には正しい用法ではないみたいです（マニュアルによると CONNECT BY句には PRIORが必須）。

```sql:階層
SELECT level FROM dual CONNECT BY level <= 10;
```


### モデル (FOR)

モデルのDIMENSIONのFORループです。デフォルトはUPSERTなので存在しない行は作られます。

```sql:モデル
SELECT d FROM dual 
model dimension BY (1 d) measures (1 m) rules (m[FOR d FROM 1 TO 10 increment 1] = 1);
```

### モデル (ITERATE)

モデルのITERATEはルール全体を繰返します。同じくUPSERTで行が作られます。

```sql:モデル
SELECT d FROM dual 
model dimension BY (1 d) measures (1 m) rules iterate (10) (m[iteration_number + 1] = 1);
```

### 再帰

再帰は２つのSELECTをUNION ALLでつないでループします。

```sql:再帰
WITH t(n) AS (SELECT 1 FROM dual UNION ALL SELECT n + 1 FROM t WHERE n < 10)
SELECT n FROM t;
```

### UNPIVOT

かなり無理矢理感ありますが、UNPIVOTはカラムを行にを変換します。

```sql:UNPIVOT
SELECT n FROM  (SELECT 1 a,2 b,3 c,4 d,5 e,6 f,7 g,8 h,9 i,10 j FROM dual) 
unpivot (n FOR s IN (a,b,c,d,e,f,g,h,i,j));
```

### グループ

CUBEでは引数の数だけ 2のn乗した数の行がつくられます。RollupやGrouping setsでも可能です。

```sql:グループ
SELECT rownum from (SELECT 1 FROM dual GROUP BY cube(1,1,1,1)) where rownum <= 10;

SELECT row_number() over (order by null) FROM dual GROUP BY rollup(1,1,1,1,1,1,1,1,1);

SELECT row_number() over (order by null) FROM dual GROUP BY grouping sets(1,1,1,1,1,1,1,1,1,1);
```

### コレクション

パブリックコレクションを使います。有名な``odcinumberlist``は``NUMBER型``の``VARRAY``です。TABLE表現で行に変換します。DUAL使ってないけどね。

```sql:コレクション
SELECT * FROM TABLE(sys.odcinumberlist(1,2,3,4,5,6,7,8,9,10));
```

### XML

なんというか、XML拡張はいろいろチートだよなぁ、、、。

```sql:
SELECT * FROM XMLTABLE('1,2,3,4,5,6,7,8,9,10');

SELECT * FROM XMLTABLE('1 to 10');

SELECT * FROM XMLTABLE('for $i in 1 to 10 return $i');

SELECT rownum FROM XMLTABLE('/S/R' passing xmltype(rpad('<S>', 43, '<R/>')  || '</S>'));
```
## おわりに
他にもありそうな気がしますが、、、いまのところ以上です。
DynamoDB使ってみたよ

# はじめに
Lambdaのデータストア先としてDynamoDBを使ってみたので構築手順や仕様についての知見をまとめておきます。

# DynamoDBの特徴
- NoSQL
- 自動パーティショニング

# 料金
[AWS公式料金表](https://aws.amazon.com/jp/dynamodb/pricing/)

- **キャパシティーユニット** 
    - 読み込み/書き込み容量の上限
        - 説明が難しいのでここでは割愛しますが、頻繁にデータの読み書きが発生しなければそこまで料金はかかりません。
- ストレージ
    - 25 GB/月までは無料
    - それ以降は月額 0.25 USD/GB
- データ転送
    - 同AWSアカウントリージョン内の他のAWSサービスへの転送は無料

[もっと詳しく知りたい方はこちら](https://dev.classmethod.jp/cloud/aws/optimize-costs-of-dynamodb/)

# 選定理由
Lambdaでコンテナを並列で複数台起動した際にRDBMSだと最大コネクション数が少なく、基本的に相性が良くないため（MySQLのt2.mediumでも150が限界）

# 作りかた
<img width="903" alt="qiita_dynamodb.png" src="https://qiita-image-store.s3.amazonaws.com/0/61433/dded6b82-df70-99a5-9886-bcb0d2f776be.png">


初期設定はテーブル名とプライマリキーのみ！！！（お手軽:ok_hand_tone1:）
プライマリキーは下記3つの型から選択します。
- 文字列
- バイナリ
- 数値
ソートキーを追加すると複合キーのように利用することも可能です！


# ScanとQueryの違い
Scanはテーブル全体を検索し、Queryはプライマリーキー（ソートキー）を条件に特定範囲内の検索となります。Scanは負荷が高くなるのでなるべくはQueryを利用しましょう！

# まとめ
ストレージも気にせず、チューニングも不要なので管理はとても楽です！
テーブル設計さえきちんと出来ていればこれほど便利なものはないと思いました！
ただ、クエリの書き方が独特だったのでその辺さえ気をつければ問題ないかと思います。

# ハマりポイント
1リクエストの上限が1MBなので一気に取得する際は `LastEvaluatedKey` がなくなるまで繰り返し取得する処理の実装が必要となる。

# 参考サイト
[MongoHQとAmazon DynamoDBの比較](http://devdev.hatenadiary.jp/entry/2014/02/03/224709)
[なぜAWS LambdaとRDBMSの相性が悪いかを簡単に説明する](http://keisuke69.hatenablog.jp/entry/2017/06/21/121501)
[DynamoDBについて今更調べたのでメモ | 株式会社ランチェスター](https://www.lanches.co.jp/blog/6776)
swift4で宇宙船演算子を実装してufo気分を味わう

ソート処理を書いていたんですが、複雑なソートになると記述が非常にめんどくさくって。
rubyやphpにある宇宙船演算子が欲しいんですが……swiftにはない！
ないけれども、新しく実装することは出来る。ならやるしかない:thumbsup:

[この記事](https://qiita.com/to4iki/items/892de1b7a70d81485e3c)でも参考があるんですが、swift4になると動かなくなるので。

# 実装例!

```swift:ufo.swift
infix operator <=>: UfoPrecedence

precedencegroup UfoPrecedence {
    associativity: left
}

public func <=> <T: Comparable>(lhs: T, rhs: T) -> Int {
    if (lhs == rhs) {
        return 0
    }

    return lhs > rhs ? 1 : -1
}
```

# 実行結果:cow2:

```swift:cattle_mutilation.swift
0 <=> 1 // -1
1 <=> 1 //  0
2 <=> 1 //  1
```

これで楽々ソート処理に！
Vue.jsでイベント処理を間引いて処理負荷を軽減する

# はじめに
サジェスト表示のような、ユーザのアクションごとにイベントを発火させ、Ajaxで値を取得するコンポーネントを実装する場合、特に何も意識していないと、キー入力の度にAjaxでAPIをコールすることになり、APIに負荷がかかってしまいます。

一定間隔ごとに処理を間引くことで、負荷の軽減につながるため、
本記事では、簡単な実装例をご紹介します。

# 実装例
```vue
<input class="input" type="text" placeholder="キーワード検索" v-model="hoge" @input="handleSuggest">
```
`@input`でユーザの入力ごとにイベントが発火します。

```js
  data:function(){
    return{
      onEvent: false,
    }
  },
```
dataにイベント管理用のフラグを追加します。

```js
  methods:{
    handleSuggest: async function(){
      const interval = 500;
      if(this.onEvent){return false}

      // フラグをtrueにしてajax処理を開始
      this.onEvent= true;
      setTimeout(async ()=>{
        /*
          ajax処理をここに記載
        */
        // ajax処理が完了した際にfalseに戻す
        this.onEvent= false;
      }, interval);
    }
  }
```
methods内で、イベントの間引き処理を記載します。
ポイントは下記の通りです。

- `data.onEvent`のフラグが`true`になっている間は、Ajax処理に入る前に`return false`される
- Ajax処理が完了したら、`data.onEvent`のフラグを`false`に戻す

`interval`の値を変えることで、間引く量を調整することができるので、お好みで調整してみてください。
Spring Boot (Spring Cloud Netflix) でつくる Microservice (Part1) -T-Akiraメモ

#Microserviceとは
小さな疎結合なサービスたちを組み合わせて
アプリケーションを作成するアプローチ方法

#Spring Cloud Netflixとは
Spring Boot で Microservice する場合に
これを使えば必要なものは大体構築できるといったもの

[ここを読破すれば…](http://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html)

といっても読破しきるのは大層大変なので
順次メモや設定のコツなどをこのシリーズで記述していく予定。
Create exciting 360 and VR experiences using React with GraphQL

#Introduction

Do you know that we can view the Virtual Reality on Web? As the normally you can experiences Virtual Reality technology with Oculus Rift , HTC Vive Pro, Sony PlayStation VR, or Samsung Odyssey/Windows Mixed Reality.The technologies growth very fast. Many big company like Facebook and Google introduce new technology every years.In this article I will share you with my experience which I have been worked with WebVR.Lucky Facebook released new framework that build on top React which call React 360 in May 2017 for easy create WebVR.Today I would like to guided you through my sample project with React as the frontend, React360 use for WebVR, Django with GraphQl as the backend and Apollo GraphQL.


#React 360

React 360 is a framework for the creation of 3D and VR user interfaces. Built on top of React – a library designed to simplify the creation of complex UI – React 360 allows you to use familiar tools and concepts to create immersive 360 content on the web.

#React
React is JavaScript library for building user interfaces. It is maintained by Facebook and a community of individual developers and companies. React can be used as a base in the development of single-page or mobile applications

#Django
Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.

#GraphQl
GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. GraphQL provides a complete and understandable description of the data in your API, gives clients the power to ask for exactly what they need and nothing more, makes it easier to evolve APIs over time, and enables powerful developer tools.

#Apollo GraphQL

Build a universal GraphQL API on top of your existing REST APIs, so you can ship new application features fast without waiting on backend changes.

#Sample project

In this project I would to build an property website that you can view the property in Virtual environment.

Here is the sample flow of my property website project :

 - Front-end : You can view the list all properties which you can see in this picture below :
<img width="1440" alt="Screen Shot 2018-09-06 at 9.14.25 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/279549/c21a21ce-8719-9c6b-5660-d75b5f781ba8.png">
 - WebVR : To view the property detail in Virtual environment.
 <img width="1440" alt="Screen Shot 2018-09-06 at 9.12.05 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/279549/8ebba992-b91b-4883-5df2-241203fd636f.png">
 - Backend : Provide the query data as API.
 <img width="1440" alt="Screen Shot 2018-09-06 at 9.15.48 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/279549/dd8374e1-d7e5-12fc-4f02-6b8ee53129c9.png">
標準出力をファイルへの追加書き込みを並列実行

こんにちは。
コマンドの標準出力のファイルへの追加書き込みを並列実行したいと思いました（```xargs```利用）。しかしばらばらのタイミングで追加書き込みされてしまい悩みました。

そこで、そのコマンド（下記例の```COMMAND```）の標準出力は必ず 1MB 以下と仮定し、対象ファイル（下記例の```OUT.TXT```）への追加書き込みは、一旦 ```dd``` コマンドへ蓄えたものをまとめて行うすることにしました。動かしてみて問題なさそうですが、この方法の自信はありません。

```console
$ find ... | xargs -P 8 -I % sh -c 'COMMAND % | dd obs=1m >> OUT.TXT 2> /dev/null'
```
ブラック・ショールズ方程式からオプションのインプライド・ボラティリティを求めるマクロ

# BS式からIVを逆算するマクロを作成
## はじめに
ブラック・ショールズ方程式（以下BS式）を用いて、オプションのインプライドボラティリティ(以下IV)を求めるマクロを作成したので、情報を共有します。
なぜCやJavaではなくマクロなのか？それは楽天RSSでの使用を前提としているからです。

## BS式とは
BS式とは何か？という人はそもそもこの記事自体を読んでいないと思いますが、念のため参考URLを掲載しておきます。
[ブラック・ショールズ・モデル（BS式） - 金融キーワード解説 | シグマインベストメントスクール]
(https://www.sigmabase.co.jp/useful/keyword/h/bs_model.html "ブラック・ショールズ・モデル（BS式） - 金融キーワード解説 | シグマインベストメントスクール")

BS式では、原資産価格や権利行使価格、IV等からオプションの理論価格を求めますが、今回は
オプションに現在ついている価格、原資産価格、権利行使価格等からIVを逆算します。

# どうやって逆算する？
二分法という手法を用います。
この記事で書いてもよいのですが、既に分かりやすく解説されている方がいるのでリンクを貼っておきます
[2分法の理論と実装]
(https://qiita.com/Ren112358/items/f2c0bbc90810c040a2e5 "2分法の理論と実装")

# 成果物（ソースコード）
```vb
' コールオプションのIVを求める
' assetPrice    原資産価格
' optionPrice   オプションの価格
' strikePrice   権利行使価格
' rate          金利
' t             残存期間（年）
Function Call_IV(assetPrice As Double, optionPrice As Double, strikePrice As Double, rate As Double, t As Double) As Double
Dim startiv As Double
Dim midiv As Double
Dim endiv As Double
startiv = 0.00001
endiv = 1

Dim startf As Double
Dim midf As Double
Dim endf As Double
startf = Call_Buy_OptionPrice(assetPrice, optionPrice, strikePrice, rate, startiv, t)
endf = Call_Buy_OptionPrice(assetPrice, optionPrice, strikePrice, rate, endiv, t)

Do
    ' 二分法で損益分岐点を求める
    ' 中点の値を求める
    midiv = (startiv + endiv) / 2
    midf = Call_Buy_OptionPrice(assetPrice, optionPrice, strikePrice, rate, midiv, t)

    ' 前半に解がある場合
    If startf * midf < 0 Then
        endiv = midiv
        endf = midf
    Else
    '　後半に解がある場合
        startiv = midiv
        endf = midf
    End If
Loop While Abs(startiv - endiv) > 0.0000001

Call_IV = midiv

End Function
```
ParityのRPCリクエストでParse errorが返ると思ったら間抜けな理由だった

#何が起きたか

ParityでJSON-RPCリクエストを送った際にParse errorが返ってきた。
Ethereumの同期状態やportの状態など色々確認したが悪しき様子は見られない。
症状は[ParityのRPCリクエストでParse errorが返る](https://qiita.com/sot528/items/47e5ac443817de0ae8bf)で示されているものと全く同じなのだが、hexの受け渡しにも問題はない。

#現象

##リクエスト

```bash
curl --data \
  '{“method”:“personal_unlockAccount”,“params”:["0xbdeu58874620940w8iogahaw3t29joq84t237198",“password”, "0x0"],“id”:1,“jsonrpc”:“2.0”}' \
  -H “Content-Type: application/json” -X POST localhost:8545
```

##エラー
```bash
{"jsonrpc":"2.0","error":{"code":-32700,"message":"Parse error"},"id":null}
```

#原因
まったく恥ずかしい話ではあるのだが、リクエスト入力で本来「"」であるべき部分が「“」や「”」になっていたことに気づかなかった。
そりゃ動くわけがない。
全て元に戻して実行したところ、無事Parse errorは解消しました。

#そもそも
なぜこのようなミスが起きたかといえば、自分が入力コマンドをMAC標準のメモ帳に一度置いておき、そのコードをコピーしたためである。
OS Xでは~~傍迷惑な~~ありがたいことにテキストの自動置換が行われるため、一度メモ帳に貼り付けた際に勝手に置換されてしまうわけである。フォントサイズも小さくわかりにくいので全然気づかなかった。

こうした悲しい事件をおこさないための設定は[こちら](https://qiita.com/Balacker/items/67497f3ac181cf980ff1)などを参考にしてください。
empty($var)で"0"が空と判定される仕様でバグを埋め込んだ戒め

php初心者の例に漏れずempty($var)で"0"がfalseになるのを知らず、
バグを埋め込んでしまったのでメモと戒めを残しておこうと思う。

# やりたかったこと

変数の空チェック

- 以下の3つだけNGにしたかった
    - $var
    - $var = "";
    - $var = null;

# 埋め込んだバグ

- 以下の2つもNGになってしまった
    - "0"
    - 0

# 修正前

```php
if (empty($var) {
  return true; // こっちに入る
} else {
  return false;
}
```

# 修正後

変数に値が入っているかチェックしたかっただけなのでこうすればOK

```php
// $varが未定義かNULLか空文字ならtrueを返す
if (is_null($var) || $var ==="") {
  return true;
} else {
  return false;
}
```

# 参考
http://php.net/manual/ja/types.comparisons.php
Office 365 SoloからOffice 365 Business Premiumに移行した

独自ドメインのメールアドレスを使いたい、だけどできるだけ費用は抑えたいので、これまでに使っていたOffice 365 SoloからOffice 365 Business Premiumに移行しました。
少し手間取ったのでメモ残します。

#Office 365 Business Premium独自ドメインを使う方法
ドメインはお名前.comで取得。.comドメイン。
Office 365への設定は、以下を参考にしました。

- [Office365独自ドメイン設定方法(Exchange Online,Lync Online)](http://guide.onamae-server.com/mso/details.php?g=5)

ドメイン設定後、ユーザの設定を変更しないと独自ドメインのメールアドレスが有効になりません。これで20分くらいハマりました。

#OneDriveの移行
[MultiCloud](https://www.multcloud.com/)というサービスを使いました。
新旧アカウントのOneDriveを接続して、[クラウド転送]メニューから転送できます。
50GB/月は無料で転送できるので、無料で済みました。
25GBくらいのデータが24時間ほどでコピー完了しました。

#OneNoteの移行
MacのOneNoteアプリで、新旧アカウントのどちらにも接続して、セクションごとに新しいノートブックに移動できました。
以下の記事を参考にしました。

- [Onenoteのデータを引き継ぎたい](https://answers.microsoft.com/ja-jp/msoffice/forum/msoffice_onenote-mso_win10/onenote%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF/c64b3815-8101-42b9-9051-51950ca23445?auth=1)

#費用
- Office 365 solo：12,744円/年(税込)
- Office 365 Business Premium：17,625円/年(税込)
- 差額：4,881円/年

安い、、、かな？
VS Codeでファイルを比較してみた

http://www.atmarkit.co.jp/ait/articles/1806/08/news028.html

# 実行方法
### "locale":"ja" の場合
ファイル(F)＞ファイルを開く(O)＞View(V)＞コマンドパレット... Ctrl+Shift+P＞ファイル:アクティブファイルを比較しています

### "locale":"en" の場合
File＞Open File(Ctrl+O)＞View＞Command Palette... Ctrl+Shift+P＞File:Compare Active File with

(参考)

https://qiita.com/tinymouse/items/13d6e3564581a3199d32

https://qiita.com/mrrclb48z/items/f5008ca84ad9e18d2dbf

# 2019-02-05

https://qiita.com/subaru-shoji/items/b8a9d143138487da572b

# 2020-05-07

https://qiita.com/ozkknnt/items/6b786873fe815386f6c1
Javaでrm -rfを実装する。

ディレクトリを再帰的に削除する処理、要するに`rm -rf`と同等の処理をJavaで実装する機会があったので、メモを残しておきます(´・ω・｀) 今回の処理に限らず、ディレクトリを再帰的に処理したい場合は`Files.walkTree`が便利です。`Files.walkTree`は第1引数に処理対象であるディレクトリのパス、第2引数にファイルやディレクトリを検出した際のふるまいを定義した`FileVisitor`を与えることで、再帰的な処理を簡単に実装することができます。

さて`FileVisitor`はインターフェイスで、4つのメソッドの実装を要求されるのですが、`SimpleFileVisitor`クラスを継承すれば、必要なメソッドをオーバライドするだけで、簡単に目的を達成することができます。たとえば、ディレクトリを再帰的にたどりながら、すべてのファイルとディレクトリを削除する`FileVisitor`は次のようにして作成することができます。

```java:RemoveRecurseFileVisitor.java
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;

public class RemoveRecurseFileVisitor extends SimpleFileVisitor<Path> {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        return delete(file);
    }
    
    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
        return delete(dir);
    }
    
    private FileVisitResult delete(Path path) {
        try {
            Files.deleteIfExists(path);
            System.out.printf("removed '%s'%n", path);
            return FileVisitResult.CONTINUE;
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }
}
```

では作成したコードを実際に動かしてみます。まずは以下に示す一連のコマンドを順番に実行します。

```bash
mkdir -p dir01/dir02/dir03
touch dir01/file1
touch dir01/dir02/file2
touch dir01/dir02/file3
touch dir01/dir02/dir03/file4
touch dir01/dir02/dir03/file5
touch dir01/dir02/dir03/file6
```

すると次のようなディレクトリ・ファイルが作成されるはずです。

```bash
$ find dir1/ -exec stat -c '%n (%F)' {} \;
dir1/ (directory)
dir1/dir2 (directory)
dir1/dir2/dir3 (directory)
dir1/dir2/dir3/txt4 (regular empty file)
dir1/dir2/dir3/txt5 (regular empty file)
dir1/dir2/dir3/txt6 (regular empty file)
dir1/dir2/txt2 (regular empty file)
dir1/dir2/txt3 (regular empty file)
dir1/txt1 (regular empty file)
```

ここで`RemoveRecurseFileVisitor`を利用して、`dir1`とその配下にあるファイルとディレクトリを削除する`Main.java`を作成します。

```java:Main.java
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class Main {
    public static void main(String[] args) throws IOException {
        var target = Paths.get("dir1");
        Files.walkFileTree(target, new RemoveRecurseFileVisitor());
    }
}
```

あとはこれをコンパイル&実行すると、まずは標準出力に削除ログが出力されることが確認できるはずです(´・ω・｀)

```
removed 'dir1\dir2\dir3\txt4'
removed 'dir1\dir2\dir3\txt5'
removed 'dir1\dir2\dir3\txt6'
removed 'dir1\dir2\dir3'
removed 'dir1\dir2\txt2'
removed 'dir1\dir2\txt3'
removed 'dir1\dir2'
removed 'dir1\txt1'
removed 'dir1'
```

以下のようなコマンドで、ディレクトリ`dir1`とその配下すべてが削除されていることが確認できます。

```bash
$ ls -l dir1
ls: cannot access 'dir1': No such file or directory
```

参考: https://docs.oracle.com/javase/tutorial/essential/io/walk.html
Android Studioの環境設定(eclipseのショトカにするなど)

9月から実際に開発現場で働きはじめて、そこで知った知識を共有します。

# 前提条件

Android Studio Version 3.1.4
Windows 10 HOME Version 1803, OS build 17134.228

# Android Studioの環境設定

## key bindをeclipseと同じにする。
File → Settings... → Keymap
一番の上のプルダウンでeclipseを選ぶ。

これでCtrl + Yキーで行が消えていったりはしません。
またF3で定義に飛べます。
(例えばクラスやメソッドの定義箇所に飛ぶなど)

あとはCtrl +  PageUp, Ctrl +  PageDownでタブが切り替えられます。


## Projectツリーとエディタの連携
開いているソースに連動して、
Projectツリーのフォーカスも移動して欲しいやつ。

Projectツリーの右上にある歯車アイコン → Autoscroll to SourceとAutoscroll from Source。

これで開いているソースに場所にProjectツリーが連動しますので、
同じパッケージの違うソースが開きやすくなります。


## 保存時(Ctrl + Sキー)に自動でReformat CodeとOptimize Importsを走らせる
eclipseだと保存時アクション(名称うろ覚え)でコードのフォーマットなどを実行できますが、
Android Studioだと同様な機能がありません。
そのため、操作をマクロ化してCtrl + Sキーに割り当てます。
(Macでの手順はありましたがWindowsでは無かったので…)

1. Code → Optimize Importsを実行
初回だとウィンドウが出るので一度実行しておきます。

2. Edit → Macros → Start Macro Recordingをクリック
3. Code → Optimize Importsをクリック
4. Code → Reformat Codeをクリック
5. File → Save Allをクリック
5. Edit → Macros → Stop Macro Recordingをクリック
6. 適当な名前で保存する
7. File → Settings... → Keymap
8. 右側の一覧でKeymap → Macros → [さきほど保存したマクロ名]をダブルクリック
9. Ctrl + Sキーに割り当てて保存(この画面の警告は無視)
10. OK押すと警告が出るのでRemoveをクリック
既にCtrl + Sキーに割り当てがあるよ?っていう警告なので上書きでOK。


今後もあれば追記していきますー。
Rubyでおみくじ(今日のラッキーカラー)を実装

## 概要

　POST(Power-On Self-Test)実行時にログ表示するオマケ機能。仕事用のシステムに組み込むため、あまり目立たないようにワンライナーでいきます。

## コード本体

　Rubyです。

```TodaysLuckyColor.rb
lucky_color = %w{Black White Red Green Blue}.sample
```
WinMergeの3方向マージ(3-way merge)をやってみた

(参考)WinMerge 日本語版＞WinDiffを使い易くしたようなソフト＞3方向マージ(3-way merge)とは
http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html

・検索も「3画面いっしょに検索」してくれるから、ステキ。
・印刷したら、もっとステキ。

プロジェクトの保存(拡張子:WinMerge)
自分用AWS クラウドサービス活用資料集メモ AWS Lambda編

# AWS Lambdaとは

* インフラを一切期にすることなくアプリケーションコードを実行できるコンピュートサービス
    * 実行基盤はすべてAWSが管理
    * AWSサービスと連携し、イベントドリブンなアプリケーションを作れる
    * コード実行時間に対して課金

→やりたいことだけに集中できる

# ユースケース

* S3のバケットに画像が保存されたらサムネイルイメージを用意
* DynamoDBに保存されるアドレスが全て正しい形式化チェックしたい

# 詳細

* 対応言語
    * JavaScript
    * Java
    * Python
    * Go
* メモリ容量に応じてCPU能力が変動
* 隔離されたコンテナ内で実行される
* 対応起動トリガー
    * API Gateway
    * AWS IoT
    * Alexa Skills Kit
    * Alexa Smarat Home
    * CloudFront
    * CloudWatch Events
    * CloudWatch Logs
    * CodeCommit
    * Cognito Sync Trigger
    * DynamoDB
    * Kinesis
    * S3
    * SNS
    * SQS
* モバイル・WebアプリからSDKを利用して呼び出すこともできる
    * モバイルSDK経由の実行だとデバイス、アプリ、アイデンティティ情報にアクセス可能
* 同期実行と非同期実行が選べる
    * 非同期実行の場合レスポンスはリクエストが正常に受け付けられたかどうかのみ
* DynamoDBとKinesisのイベントはLambdaが自動的に取得しに行く（PULLモデル)
    * Lambdaが取得しに行くのでその権限が必要
Ubuntuをセクシーにする

youtubeで上がっていてとても参考になるのですが、文字を入力するために動画をストップするとコマンドが見えなくなるので備忘録としてコマンドだけ残します。

Ubuntuがかっこよくなります。

```bash

sudo apt update && sudo apt upgrade

LANG=C xdg-user-dirs-gtk-update

echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee -a /etc/apt/sources.list && wget https://dl.google.com/linux/linux_signing_key.pub && sudo apt-key add linux_signing_key.pub && sudo apt-get update && sudo apt install google-chrome-stable

sudo apt autoremove

sudo apt-get install powertop

sudo add-apt-repository ppa:linrunner/tlp

sudo apt-get update

sudo apt-get install tlp tlp-rdw

sudo tlp start

sudo reboot

sudo timedatectl set-local-rtc 1

sudo apt update && sudo apt upgrade

sudo add-apt-repository ppa:numix/ppa

sudo add-apt-repository ppa:papirus/papirus

sudo add-apt-repository ppa:snwh/pulp

sudo add-apt-repository ppa:daniruiz/flat-remix

sudo apt update

sudo apt install numix-icon-theme-circle papirus-icon-theme paper-icon-theme flat-remix

sudo apt install git gnome-tweak-tool chrome-gnome-shell

git clone https://github.com/tliron/install-gnome-themes

cd install-gnome-themes

sudo ./install-requirements-debian

./install-gnome-themes

sudo apt install screen fetch
```

参考サイト

Ribalinux
How to sexy up your Ubuntu 18.04 LTS desktop
https://www.youtube.com/watch?v=dlu2FYsr-HI
自分でプログラミングをしないと作れないわけでもない事例を示す

#「フラッシュ記憶の様に表示するアプリ」は"PowerPoint"で作れた。[^1]

先日、自分のホームページに載せたいと思ったので実装方法を検討した。

当初はプログラミング言語を用いなければ作れなさそうという先入観が邪魔をしていて
調査などに時間が掛かりスムーズな実装に取り掛かれなかった。

## 作りたかったものは何か
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265588/fd9a3bc2-6319-910c-5aeb-407c41d9b079.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/265588/025b7b53-9668-a16c-02b6-1d12df4b8036.png)
上記のようなコードの画像群をフラッシュ記憶の様に表示していくアプリだ。

## それは"PowerPoint"で作れる。

### 実装方法

スライドを用意する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/265588/9c5fe1b2-355f-a2c8-78b8-cb5dbeb56dd3.png)

動画で保存する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/265588/124c3bca-18ca-4d15-2e31-f3708db4a173.png)

### 実装結果

~~[出来上がったサンプルはこちら]()~~
~~[出来上がったサンプルはこちら(スマホはこちらが見やすいかもしれない)]()~~

## 何で上手くいったのか

* 「PowerPointのスライド高速で表示すれば"フラッシュ記憶"の様じゃね？」て発想
* 「そういえば、PowerPointて動画作成機能なかったっけ？」という、たまたま知っていたこと
* 「PowerPointの本来の使い方でなくても簡単に実装できればいいや」と思う気持ち
* 「上記から試してみたら、スライドの所要時間というオプションを見つけた」偶然

## 課題

スライドの順番をランダムに毎回表示できない。

## 対策

プログラミングで解決する。[^2]

## まとめ

自分が作りたいものは本当に自分でプログラミングしなきゃダメか考えることは
「なぜ、自分はプログラミングで行うか」を考えるキッカケになると思った。
PowerPointもプログラムで出来ているから自分もプログラミングでという発想も有りだと思うが、
実装時に素早く手軽に作りたいという条件付けがあれば、自分が持っているツールで作ることも有りなのだと分かった。
なぜならば、プログラミングがしたいのではなくてモノを作りたいからだ。

ソフトウェアについても機能が多ければ必ずよいわけでもない。
例えば、WordPadの様にWordに比べれば機能が少ないと思っても「本当に出来ないか」を考えると出来ることもある。
どうしても出来ないから高価なWordを買うことで、はじめて「Wordの意義」が自分の中で生まれるのではないだろうか？[^3]

もしかしたら、まだまだ知らない機能がたくさんあるかもしれない。

<!--
これはメモ程度に残す。尊敬できる同僚に必ず時間や手間を掛ければ、ない機能も作ることができる。
ただ、時間が掛かるからお金と交換を検討するのだと言っていた。マジで名言
-->

<!--
・自分なりに考えて
・工夫して
・案をだし
・実装する
・それっぽく見えないか
-->

[^1]: タイトル変更しました。
[^2]: ここで初めてプログラミングする意義を見出した。
[^3]: 宝の持ち腐れにならなくてすむ。
SVAの学習

#UdemyにSVAのコースがあるので受けてみました。

[SystemVerilog Assertions & Functional Coverage FROM SCRATCH](https://www.udemy.com/systemverilog-assertions-language-and-applications/)

一通りの文法を知るにはいいかと思います。文法の説明はIEEE1800-2012に書いてある例文などをもとにしているのでIEEE1800-2012のPDFも見ながら受講すればLRMにかかれていることの理解が進むと思います。

Udemyの通常価格は\18,000ですが時々ディスカウントをやってるのでいいタイミングを見計らって受講するといいですよ。確か\2,000以下で受講したんじゃないかな。

英語のビデオですが英語の勉強だと思って受講してみました。

どんな感じで教えているのか、人にSVAを教えるときの参考にするつもりで受講したのですが、そうそう、みたいな感じで聞いていました。

実際に仕事で使うにはもっと実践的なノウハウの取得が必要なのですが、じゃあ次に何するかが考えどころです。

簡単なところでAPBのプロトコルチェッカを自分で作ってみるなんて言うのはいいんじゃないでしょうか。
PowerShell・再帰・トランポリン


# ネタ元

[JavaScript・再帰・トランポリン](https://qiita.com/41semicolon/items/985bdd2f551d9392463c)

PowerShellで似たようなことをやってみたくなったので、やってみた。

# バージョン

PowerShellでスタックオーバーフローを起こしたいなら黙ってv2を使うんだ。

```
PS C:\> $PSVersionTable.PSVersion.ToString()
2.0
```
# スタックオーバフローが起きる関数

```posh
filter countDown ($num)
{
  if ($num -eq 1) {return 1}
  if ($num % 200 -eq 0) {Write-Host $num}
  countDown ($num - 1)
}
```

```
PS C:\> countDown 1000
1000
800
600
400
200
呼び出しの深さのオーバーフローのため、スクリプトが失敗しました。呼び出しの深さが 1001 に達しましたが、最大値は 1000 です。
    + CategoryInfo          : InvalidOperation: (1001:Int32) []、ParentContainsErrorRecordException
    + FullyQualifiedErrorId : CallDepthOverflow
```

# 評価が遅延されるように、関数を定義し直す。

```posh
filter countDown2 ($num)
{
  if ($num -eq 1) {return 1}
  if ($num % 200 -eq 0) {Write-Host $num}
  New-Trampoline $function:countDown2 ($num - 1)
}

filter New-Trampoline
  ([ScriptBlock] $ScriptBlock, [Object[]]$ArgumentList)
    {$ScriptBlock | Add-Member NoteProperty ArgumentList $ArgumentList -PassThru}
```

# トランポリン

```posh
filter Invoke-Trampoline
{
  while ($_ -is [ScriptBlock] -and ($_ | Get-Member ArgumentList))
    {$_ = Invoke-Command $_ -ArgumentList $_.ArgumentList}
  
  $_
}
```

# 確かにスタックオーバーフローは起こらなくなる

```
PS C:\> countDown2 1000 | Invoke-Trampoline
1000
800
600
400
200
1
```

おもしろ～い

# おわり
ubuntuでgithubへpushする

linux,UbuntuにはsourcetreeやTortoiseGitなどがない。
CUIでやってみる。

```bash
# インストール
sudo apt install git

# 入ったか確認
git --version

# コミットしたディレクトリに移動してinitする
git init

# ファイルを作成
touch README

# ステージする
git add README

# コミット前の設定
git config --global user.name hogetarou
git config --global user.email hogatarou@mail.com

# メッセージを付してコミット
git commit -m 'first commit'

# githubアカウントがありリポジトリがあったらこれでpushする
git remote add origin https://github.com/hogetarou/hello_world.git
git push origin master
```

参考サイト
[commitとpushしかできない人のためのgithubの使い方まとめ]
(http://myuon-myon.hatenablog.com/entry/20121114/1352906438)
Raspbianの古いのがほしい

Raspberry PiのOS Raspbianがほしいときに、ふつうは最新版をダウンロードするんですが、たまに古いのがほしいときがあります。

そんな時は、

http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/

にアクセスしてダウンロード

例えば、jessieがほしいときは

http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/raspbian-2017-07-05/

にアクセスして、zipをダウンロードします。
組み込みのfindよりも、eachで回した線形探索の実行速度が1.26倍早かった

配列から指定した値を探す処理を色々ためしていたら、
自前で実装した線形探索よりfindメソッドの方が1.26倍遅かった。

**条件：**
1~10億までの数値が入った配列を、1から順に探索して10億を見つけたら終了

**結果:**
線形探索(自前)51.５秒
find:65.1秒


|                    |user              |system             |total               |real
|:-----------------:|:-----------------:|:------------------:|:------------------:|:------------------:|
|linear_search       |       50.140000              |    0.350000    |   50.490000 | ( 51.598446)         | 
|find_method         |        64.160000           |     0.260000    |      64.420000| ( 65.156407)      |


実行したコード

```ruby

class Serarch
 attr_reader :processed_array,:serarch_num

  def initialize(processed_array,serarch_num)
    @processed_array = processed_array
    @serarch_num = serarch_num
  end

  def linear_search
    processed_array.each do |n|
      if n == serarch_num
         return
      end
    end
  end
  
  def find_method
    processed_array.find{|n| n == serarch_num}
  end
end
```

##理由
がわかりません！すみません！

組み込みのfindは線形ではなく別の方法で探してるのかなーとか。
findのソースだけ置いておきます。。

```c

From: enum.c (C Method):
Owner: Enumerable
Visibility: public
Number of lines: 18

static VALUE
enum_find(int argc, VALUE *argv, VALUE obj)
{
    struct MEMO *memo;
    VALUE if_none;

    rb_scan_args(argc, argv, "01", &if_none);
    RETURN_ENUMERATOR(obj, argc, argv);
    memo = MEMO_NEW(Qundef, 0, 0);
    rb_block_call(obj, id_each, 0, 0, find_i, (VALUE)memo);
    if (memo->u3.cnt) {
        return memo->v1;
    }
    if (!NIL_P(if_none)) {
        return rb_funcallv(if_none, id_call, 0, 0);
    }
    return Qnil;
}

```
awsのEC2においてメール送信

表記の目的を達成には下記２点が必要
・Ｅメール上限緩和
・逆引き（rDNS）

逆引きとはIP→ドメイン

申請は下記ＵＲＬに動画あり
https://www.slideshare.net/AmazonWebServicesJapan/aws-42885668

動画に辿る手順は下記

AWSのポータルサイトを開き一番下へ
![q22.png](https://qiita-image-store.s3.amazonaws.com/0/286146/3d81982c-292c-9fb1-7bb7-b81ae7829747.png)

クリックすると
![q23.png](https://qiita-image-store.s3.amazonaws.com/0/286146/0e9832d2-b39d-ae0c-178f-7b5f9df6ab61.png)

あとは動画に従う
Macの複数無線APのネットワーク環境自動切り替え

#1.はじめに

MacOSXを使っていて、iOSのように、AP（AccessPoint)ごとにProxy設定を変更出来ないのかとさがしてたどり着いたのが、下記先生の記事でした。

先生記事: 
[Mac OS Xの標準機能のみで無線LANアクセスポイント毎にプロキシ設定を自動切り替えする方法](https://qiita.com/kouichirou/items/13295fec71085e1e431c)

しかし、いくつかのAP名で切り替える必要が出てきたため、スクリプトを改造しました。

#2.仕様
AP名とネットワーク環境名のリストを用意して、リストのAP名にマッチしたらそのネットワーク環境名に変更します。

要するに
- 外部ファイルを読み込んで、AP名が合致するまで回す
- 合致したらネットワーク環境を変更
- 一件も合致しなかったらデフォルトのネットワーク環境を利用する
という仕様に修正します

#3.改造

##3-1.LaunchAgentの設定
この辺りは先生の記事そのまま

##3-2.シェルスクリプトの修正
以下のようにします。（下記コード中、`自分のアカウント`部分はご自身の環境に合わせて適宜変更ください）

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

# reference: https://qiita.com/kouichirou/items/13295fec71085e1e431c
# set AccessPoint uniqe name for switch profile.
prefdata=/Users/自分のアカウント/NWlist.txt
lastapfile=/tmp/last_airport.flg
# init
apname=""
networkprofile=""
defaultprofile=""
[ -e "$lastapfile" ] || touch "$lastapfile"
lastap=`cat $lastapfile`
device=`networksetup -listallhardwareports | grep -A 3 Wi-Fi | grep Device | awk '{print $2}'`
if [ -z "$device" ]; then
    #exit if no Wi-Fi device
    exit 0
fi
curap=`networksetup -getairportnetwork $device | grep Current | awk '{print substr($0, index($0, ":")+2)}'`

if [ "$curap" = "$lastap" -o -z "$curap" ]; then
    #exit if ap not changed or none ap
    exit 0
else
    echo $curap > $lastapfile
fi

for line in `cat ${prefdata} | grep -v "^#"`
do
    apname=`echo ${line} | cut -d ',' -f 1`
    networkprofile=`echo ${line} | cut -d ',' -f 2`
    if [ "*" = "$apname" ]; then
        defaultprofile=${networkprofile}
    fi
    if [ "$curap" = "$apname" ]; then
        scselect | grep "*" | grep $networkprofile > /dev/null
        if [ $? = 1 ]; then
            scselect $networkprofile  > /dev/null
            #osascript -e 'display notification "Network Changed to profile '$networkprofile'" with title "Network Config"'
        fi
        exit 0
    fi
done
if [ -n "$defaultprofile" ]; then
    scselect | grep "*" | grep $defaultprofile > /dev/null
    if [ $? = 1 ]; then
        scselect $defaultprofile  > /dev/null
        #osascript -e 'display notification "Network Changed to profile '$defaultprofile'" with title "Network Config"'
    fi
fi
```

##3-3.AP接続リストの準備
自分のユーザーアカウントの場所に/Users/自分のアカウント/NWlist.txtを作ります。（直下はちょっと、、、という方は、場所を好きなように変更してみてください。）
CSVでデータを作成します。
AP名に*を指定するとデフォルトのネットワーク設定を指定できます。APが一覧にない場合に使われます（下記の例ではNOProxy)
他は、AP名と、それに対応するネットワーク環境で設定した名前を記入します。
下記サンプルでは、APがHomeはProxy1を、CompanyではProxy2を、SOHOではProxy3の設定に変更するようになります。
また、切り替え時同じネットワーク設定名になる場合は、改めてネットワーク環境をスイッチしないようにもしています。

```csv:NWlist.txt(sample)
# apname,network profile name
# apname　"*"　is default
*,NOProxy
Home,Proxy1
Company,Proxy2
SOHO,Proxy3
```

これでどうでしょうか

【9/7追記】
~~sleep復帰の時に再度ネットワーク環境の選択が実行されてしまい、接続→切断→接続みたいな動きになってしまっているようです。~~
MacBook Airですと、en0がWi-Fiなのですが、ほかの機種では保証されないとのことでしたので、en0かen1かといった情報を動的に取得するように変更しました。
また、Wi-Fiがoffの時に動作しないようにしました。これで接続→切断→接続という動きはしなくなります。

#4.動作環境
MacOSX 10.13.6 High Sierra/10.14.1 Mojave
MacBook Air (13-inch,2017)
go言語でOAuth2認証を実装

# go言語でOAuth2認証
最近，go言語でGithubとQiitaのOauth2認証を実装することがあったのでメモ書き程度に書いていきます．

## OAuth2認証のフロー
OAuth2のフローは以下のようになっています(Githubの場合)


1. Githubにコードをリクエスト
2. あらかじめ指定しておいたページに自動でリダイレクト
3. リダイレクト時にURLにパラメータで渡されたcodeを使ってアクセストークンをリクエスト
4. 3のレスポンスのbodyからアクセストークンを取得
5. アクセストークンを使ってAPIを使用

ざっくりと以上のような流れで認証します．

## Githubの場合
まず，Githubのアプリに登録します．
そこで得られたClientIDとClientSecretをメモなどして覚えておきましょう．
リダイレクト先のURLは自分のサイトの適当なURLを指定しましょう(例http://自分のサイトURL/oauth/callback)

>1. **Githubにコードをリクエスト**
2. あらかじめ指定しておいたページに自動でリダイレクト
3. リダイレクト時にURLにパラメータで渡されたcodeを使ってアクセストークンをリクエスト
4. 3のレスポンスのbodyからアクセストークンを取得
5. アクセストークンを使ってAPIを使用

Githubアプリを登録したらまず，Githubの指定されたURL(https://github.com/login/oauth/authorize) に先ほど取得したClientIDをパラメータに指定してリダイレクトします．
実装は以下のようになります．なお，今回はgo言語のwebフレームワークginを使っています

```go
func RedirectAuthrizeClient(c *gin.Context, clientID string) { 
   authURL := "https://github.com/login/oauth/authorize?client_id=" + clientID
   c.Redirect(http.StatusMovedPermanently, authURL)
}

```

>1. Githubにコードをリクエスト
2. **あらかじめ指定しておいたページに自動でリダイレクト**
3. **リダイレクト時にURLにパラメータで渡されたcodeを使ってアクセストークンをリクエスト**
4. **3のレスポンスのbodyからアクセストークンを取得**
5. アクセストークンを使ってAPIを使用

次にGithubアプリを登録する際に指定したページに自動でリダイレクトされるのでそこでの処理を実装していきます．

```go

type CredentialInfo struct {
	AccessToken string `json:"access_token"`
	Scope      string `json:"scope"`
	TokenType string `json:"token_type"`
}


func GetAccessTokenClient(c *gin.Context, clientID string, clientSecret string) (*CredentialInfo){
	code := c.Request.URL.Query().Get("code")
	state := c.Request.URL.Query().Get("state")
	if state == "" {
		fmt.Println("state is empty")
	}
	values := url.Values{}
	values.Add("code", code)
	values.Add("client_id", clientID)
	values.Add("client_secret", clientSecret)
	req, err := http.NewRequest(
		"POST",
		"https://github.com/login/oauth/access_token",
		strings.NewReader(values.Encode()),
	)
	if err != nil {
		panic(err)
	}

	req.Header.Set("Accept", "application/json")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	byteArray, _ := ioutil.ReadAll(resp.Body)

	var cre *CredentialInfo
	json.Unmarshal(byteArray, &cre)
	
    c.Redirect(http.StatusMovedPermanently, "/")
	return
}

```


`req.Header.Set("Accept", "application/json")`の部分はレスポンスのbodyの形式を指定していて，これを指定しないとレスポンスがjson形式で返ってきません．Githubでは

```
{
  access_token: ***,
  scope: ***,
  token_type:"bearer"
}
```
の形式でレスポンスが返ってくるのでこの中のaccess_tokenを保存したり変数に格納などしてAPIを呼び出すときに使います．


>1. Githubにコードをリクエスト
2. あらかじめ指定しておいたページに自動でリダイレクト
3. リダイレクト時にURLにパラメータで渡されたcodeを使ってアクセストークンをリクエスト
4. 3のレスポンスのbodyからアクセストークンを取得
5. **アクセストークンを使ってAPIを使用**

あとは取得したアクセストークンをヘッダに含んでAPIを叩くだけです！
Item 60: Avoid float and double if exact answers are required

# 60.正確な値を求める場合はfloatとdoubleの使用を控えるべし

* 特に金の計算には使わないほうが良い。floatとdoubleでは0.1を表現できない。代わりにBigDecimal、int、longを用いる。

* BigDecimalのデメリットは、使いづらく、遅いところ。

* 9桁以下の計算にはintを、18桁以下ならlongを、19桁以上ならBigDecimalを使うべき。