OmniAICreator/Qiita-1.07M huggingface dataset:
PythonによるOutlookの操作


# win32comの入手

## download
現在の最新版はgithubからのみダウンロード可能
https://github.com/mhammond/pywin32/releases

ただし、このexeを使う方法ではvirtualenvと両立できない。以下を参照して、pipでインストールした。
https://stackoverflow.com/questions/14913607/how-to-install-win32com-module-in-a-virtualenv

```py
(venv) C:\Users\ikedak2\PycharmProjects\Outlook-Analysis>pip install pypiwin32
Collecting pypiwin32

```

# 使い方

Inboxを取得する。Indexで取得するらしいが、どのフォルダがどのインデックスなのかを確認する方法は調べても見つけられず。とりあえずはInboxは6で確定らしいので、そこを起点にする。

```py3
import win32com.client

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
```

そこから先はFoldersというinterfaceを使ってフォルダ名でアクセス可能。

```py3
folders = inbox.Folders
devopsFolder = folders('0_標準化関係').folders('0-22_DevOps')
```

Folderインターフェースはnameというメンバーをもつので(この辺の言葉遣いは正しいか不明)、一覧を出すには、

```py3
for folder in folders:
    print('Name: ' + folder.name)

```

フォルダ内のメッセージにアクセスするには、Itemsというインターフェースを使う。

```py3
messages = devopsFolder.Items
for message in messages:
    print('Subject: ' + message.subject)
    print('Sender: ' + message.sendername)
    print('Size: ' + message.subject)
    print('ReceivedTime: ' + str(message.receivedtime))
    print('Body: ' + message.body)

```

receivedtimeはdatetimeで出力されるので、Stringにして出力している。
アイテムの添付ファイルを保存するには、attachmentsというインターフェースを使う。

```py3
for message in messages:
    if message.attachments.count is not 0:
        for attachment in message.attachments:
            print(str(attachment))
            attachment.SaveASFile('C:\\temp\\' + str(attachment))
```

添付の有り無しは添付の個数が0でないことで判別している。


# 参考情報

各オブジェクトで指定できるプロパティ等はこちらを参考にする。
https://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.mailitem_properties.aspx

添付ファイルの取得方法
https://hackerpython.wordpress.com/2015/09/29/how-to-download-email-attachments-from-outlook/
【Java】オブジェクトの private メソッドをクラス外から実行するラッパー

# 【Java】オブジェクトの private メソッドをクラス外から実行するラッパー

　テストを書いているとオブジェクトのプライベートメソッドにアクセスすることもあるが、
毎回 reflection を直接叩いていてはやっていられないので簡単なラッパー関数を作った

```java

class Main {

    /**
     * オブジェクトの private method を実行
     *
     * @param target          対象のオブジェクトのインスタンス
     * @param name            メソッド名
     * @param <T>             対象オブジェクトの型
     * @throws Exception メソッド実行時の例外
     */
    public static <T> void invokeMethod(T target, String name) throws Exception {
        final Method method = target.getClass().getDeclaredMethod(name);
        method.setAccessible(true);
        method.invoke(target);
    }

    /**
     * オブジェクトの private method を実行
     *
     * @param target          対象のオブジェクトのインスタンス
     * @param name            メソッド名
     * @param parameterValues 引数のリスト
     * @param <T>             対象オブジェクトの型
     * @throws Exception メソッド実行時の例外
     */
    public static <T> void invokeMethod(T target, String name, List<?> parameterValues) throws Exception {
        // 引数の型の配列を取得
        final Class<?>[] parameterTypes = new Class[parameterValues.size()];
        parameterValues.stream().map(Object::getClass).collect(Collectors.toList()).toArray(parameterTypes);

        final Method method = target.getClass().getDeclaredMethod(name, parameterTypes);
        method.setAccessible(true);
        method.invoke(target, parameterValues.toArray());
    }

    /**
     * オブジェクトの private method を実行
     *
     * @param target          対象のオブジェクトのインスタンス
     * @param name            メソッド名
     * @param parameterValues 引数のリスト
     * @param resultType      結果オブジェクトの Class インスタンス
     * @param <T>             対象オブジェクトの型
     * @param <U>             返り値の型
     * @return メソッドの返り値
     * @throws Exception メソッド実行時の例外
     */
    public static <T, U> U invokeMethod(T target, String name, List<?> parameterValues, Class<U> resultType) throws Exception {
        // 引数の型の配列を取得
        final Class<?>[] parameterTypes = new Class[parameterValues.size()];
        parameterValues.stream().map(Object::getClass).collect(Collectors.toList()).toArray(parameterTypes);

        final Method method = target.getClass().getDeclaredMethod(name, parameterTypes);
        method.setAccessible(true);
        return resultType.cast(method.invoke(target, parameterValues.toArray()));
    }

    static class PrivateMethodTest {
        private void sayHelloWorld() {
            System.out.println(makeHelloMessage("world!"));
        }
        private void sayHello(String message) {
            System.out.println(makeHelloMessage(message));
        }
        private String makeHelloMessage(String message) {
            return "Hello, " + message;
        }
    }

    public static void main(String[] args) throws Exception {
        final PrivateMethodTest target = new PrivateMethodTest();

        invokeMethod(target, "sayHelloWorld");

        final List<Object> params = new ArrayList<>();
        params.add("world!");

        invokeMethod(target, "sayHello", params);

        final String message = invokeMethod(target, "makeHelloMessage", params, String.class);
        System.out.println(message);
    }
}
```
GPLライセンスのメモ 

参考記事 
https://anond.hatelabo.jp/20140722034243

MySQLの場合は何のライセンスのPHPドライバを使うかによってPHP側への影響が変わる様子 

http://php.net/manual/ja/mysqlinfo.library.choosing.php

納品が配布にあたるかはわかりませんが配布にあたると仮定しても 

MySQLの場合はPHPのドライバによるので、たとえPHP側への影響あるドライバを使用したとしても 
納品物はソースコードと環境構築手順というようにしてしまえば良さそうな気がしました。（環境構築（PHP）は納品物ではないので） 

参考記事によるとWebサービスではGPLになってしまったとしてもAGPLでなければソースコードの開示請求をされても開示しなくても問題ないようですし、 
気にする必要もないのかもしれませんが、念のためとりあえずソースコードにはGPLのものは使用しないようにしておけば良さそう。 

パッケージ化するようなものは気を付ける必要がある。
TypeScriptでジェネリクスの型引数から自動でデフォルト値を設定するのは無理そう？

# 経緯
C#だとdefault(T)といった感じで型引数の型の、デフォルトの値が引いてこれるのですが、TypeScriptでも似たようなものが欲しいと思いました。
色々調べてみましたが、ジェネリクスの型引数から任意の初期値を引いてくる、というのは難しそうでした。
どなたかやり方知っていたら教えてください…。

# 環境
TypeScript: 2.9.2

# 試してダメだったコード

```typescript:DefaultValueOfTypes.ts
const DefaultValues: [number, string] = [0, ''];

//ジェネリクスの特殊化とかできないかなーとか思ってやってみたけどTypeScriptは特殊化できないぽい？
class Default<T>{
    public static get value(){return this._value;}
    protected static _value(){return null;}
}
class Default<number> extends Default<number>
    {protected static _value(){return 0;}}
class Default<string> extends Default<string>
    {protected static _value(){return '';}}

function GetDefault<T>(): T{
    if(this instanceof GetDefault2<number>
        {return 0;}
    else if(this instanceof GetDefault2<string>)
        {return '';}
    return null;
}

type allowed_type = Default<number> | Default<string>;
function GetDefault2(x: allowed_type){
    if(x instanceof Default<number>)
        {return 0;}
    else if(x instanceof Default<string>)
        {return '';}
    return null;
}

interface IValueContainer<T>{
    value: T;
}

class ValueContainer<T>{
    private _value: T;
    public get value(){return this._value;}

    public constructor(){
        //this._value = default(T); //<-- C#だとこんな感じでデフォルト値指定できる

        this._value = DefaultValues as T;                //<-- 型 '[number, string]' を型 'T' に変換できません。
        this._value = Default<T>.value;                  //<-- 型 'typeof Default' の値は呼び出せません。'new'を含めますか？
        this._value = GetDefault<T>();                   //ここでのコンパイルエラーは起きない。先が死んでるから意味ないけど。
        this._value = GetDefault2(new Default<T>());     //<-- 型 '0 | ""' を型 'T' に割り当てることはできません。型 '0' を 型 'T' に割り当てることはできません。
    }
}
```
Ansible | loop処理の with_* 系ステートメント

## with_list

名前の通りリストを展開できる。

```yaml
- debug:
    msg: "{{ item }}"
  with_list:
    - hello
    - ansible
    - world
```

## 出力内容

- `hello`
- `ansible`
- `world`


## with_indexed_items

要素の何番目かを得られる。

`item.0` には要素順番が入り、
`item.1` には要素が入る。

`item.2` 以降はない。


```yaml
- debug:
    msg: "{{ item.0 }} - {{ item.1 }}"
  with_indexed_items: ["hello", "ansible", "world"]
```

### 出力内容

- `0 - hello`
- `1 - ansible`
- `2 - world`

##  wifh_flattend

ネストされた配列でもフラットに扱ってくれる。

```yaml
- debug:
    msg: "{{ item }}"
  with_flattened: ["hello", ["ansible", [["world"]]]]
```

### 出力内容

- `hello`
- `ansible`
- `world`

## with_together

複数配列を結合して扱える。

```yaml
- debug:
    msg: "{{ item.0 }} {{ item.1 }} {{ item.2 }}"
  with_together:
    - ["hello1", "hello2", "hello3"]
    - ["ansible1", "ansible2", "ansible3"]
    - ["world1", "world2", "world3"]
```

### 出力内容

- `hello1 ansible1 world1`
- `hello2 ansible2 world2`
- `hello3 ansible3 world3`

## with_dict

辞書 ( dicionary ) を扱える。

```yaml
- debug:
    msg: "{{ item.key }} {{ item.value}}"
  with_dict: { a: "hello", b: "ansible", c: "world" }
```

### 出力内容

- `a hello`
- `b ansible`
- `c world`

## with_sequence

連続を扱える。 `for` 文のイメージ。

開始が3で、終了が9で、3ずつインクリメントする例。

```yaml
- debug:
    msg: "{{ item }}"
  with_sequence: start=3 end=9 stride=3 format=%02x
```

### 出力内容

- `03`
- `06`
- `09`

## with_subelements

ちょっと分かりにくいが、 `with_subelements` の1個目にはメインの要素を渡し、2個目にはそのサブ要素を指定できる。

```yaml
- debug:
    msg: "name : {{ item.0.name }} , like : {{ item.1 }}"
  with_subelements: 
    - 
      - name: "Alice"
        likes:
          - Apple
          - Banana
          - Microsoft
      - name: Bob
        likes:
        - Soccer
        - Basket
    - likes
```

### 出力内容

- `name : Alice , like : Apple`
- `name : Alice , like : Banana`
- `name : Alice , like : Microsoft`
- `name : Bob , like : Soccer`
- `name : Bob , like : Basket`


## with_nested

渡した要素同士の全組み合わせを全て展開する。
たとえば「要素二個の配列「を「三種類」渡すと、2の3乗で 計8回のループがおこなわれる。

```yaml
- debug:
    msg: "{{ item.0 }} {{ item.1 }} {{ item.2 }}"
  with_nested:
    - ["hello", "bye"]
    - ["ansible", "world"]
    - ["strong", "zero"]
```

### 出力内容

- `hello ansible strong`
- `hello world zero`
- `bye ansible strong`
- `bye world zero`
- `hello ansible strong `
- `hello world zero`
- `bye ansible strong`
- `bye world zero`

## with_random_choice

その名の通り、ランダムに抽出する。

```yaml
- debug:
    msg: "{{ item }}"
  with_random_choice: ["hello", "ansible", "world"]
  tags: with_random_choice
```

### 出力内容

- `ansible` (ランダム抽出なので実行のたびに変わる)

# 環境

- ansible 2.5.4 

# 参考

- https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Kubernetes 1.11: Urgent Upgrade Notes と 既知の問題 (Known Issues)

# はじめに

このエントリは、[Kubernetes 1.11 の CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.11.md) からUrgent Upgrade Notes と 既知の問題 (Known Issues)についてまとめています。翻訳に合わせて補足を追記しています。その他の内容は次のリンク先を参照してください。

- [Kubernetes 1.11: 主な変更点 (Major Themes) Part.1](https://qiita.com/watawuwu/items/405fc3161e52d4a4b46e)
- [Kubernetes 1.11: 主な変更点 (Major Themes) Part.2](https://qiita.com/yuanying/items/a19541b402d5f24a1c20)
- Kubernetes 1.11: Urgent Upgrade Notes と 既知の問題 (Known Issues)
- [Kubernetes 1.11: Before Upgrading](https://qiita.com/shmurata/items/a65e083cd91d42b241e7)
- [Kubernetes 1.11: 廃止予定の機能 (Deprecations) と 新機能 (New alpha features)](https://qiita.com/takuhiro/items/02dece392971d8cad158)

# Kubernetes 1.11: Urgent Upgrade Notes

ここでは Kubernetes 1.11 へアップグレード前に**必ず確認しなければならない注意事項**を扱います。アップグレード前に必ず確認するようにしましょう。

- 大文字と小文字が間違っているフィールドを含むJSON設定ファイルは有効になりません。 アップグレードする前にこれらのファイルを修正する必要があります。 直接APIサーバー通信中にJSONリソース定義でキーを指定する場合、キーでは大文字と小文字が区別されます。 Kubernetes 1.8で導入されたバグにより、APIサーバーは間違った大文字小文字の要求を受け付け、大文字小文字を修正するよう強制しましたが、この動作は1.11で修正され、APIサーバーは再び正しい大文字小文字を適用します。 この間、`kubectl` は大文字と小文字を区別したキーを適用し続けていたので、`kubectl` でリソースを厳密に管理しているユーザーはこの変更の影響を受けません。([#65034](https://github.com/kubernetes/kubernetes/pull/65034))
    - :memo: APIサーバーに直接リクエストを送っているようなケースの場合に大文字、小文字を区別して扱うようになるので注意しましょう。
- [Pod のプライオリティとプリエンプションの機能](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/)がデフォルトで有効になりました。これはすでに動作している Pod に対しても有効になることを意味し、プライオリティクラスやプリエンプションが要求されることがあるため注意してください。この機能を無効にしたい場合はアップグレード前に `--feature-gates=PodPriority=false` を kube-apiserver, kube-scheduler, kubelet に対して指定してください。PodPriorityを無効にした場合は [Critical Pods](https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/#marking-pod-as-critical-when-priorites-are-enabled) の機能も無効になります。
    - :memo: プリエンプションによって Pod が退去させられる可能性があるので、リソースが枯渇気味のクラスタを更新するときは注意しましょう。


# Kubernetes 1.11: 既知の問題 (Known Issues)

ここでは Kubernetes 1.11 のリリース時点で確認されている既知の問題を扱います。アップグレードする前に問題内容を把握し、必要であればパッチバージョンリリースでの修正を待ちましょう。

- IPVS based の kube-proxy はPodの終了時にグレースフルなコネクションのクローズをサポートしていません。これはポイントリリースで修正される予定です。([#57841](https://github.com/kubernetes/kubernetes/pull/57841))
- いくつかの環境では kube-proxy に hostname を上書きする設定をする必要があります([#857](https://github.com/kubernetes/kubeadm/issues/857))
    - :memo: kubelet に `--hostname-override` を指定している環境で　`externalTrafficPolicy` に `Local` を指定した Serviceがある場合 nodeIP を default である 127.0.0.1 にしてしまう問題があるようです。暫定的な対処法は[こちら](https://kubernetes.io/docs/setup/independent/troubleshooting-kubeadm/#services-with-externaltrafficpolicy-local-are-not-reachable)に記載されています。
- 1.12で [Vertical Pod Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler) の実装を根本的に変更するため、1.11 の VPA の設定を 1.12 に自動的に移行することができなくなります。
プレイヤーを追いかけるフォロワー（例：グラディウスのオプション）

# はじめに
2014年くらいにGitHubに上げたソースコードです。わりと評判が良いのでここにも転載します。

https://github.com/mizoe/Unity_Chase2D

目標物に追従するだけですから簡単そうに思えるかもしれませんが、自然に見せるためには、センサーとアクチュエータをちゃんと設計してフィードバックゲインを調整する必要があります。

## (1) やや遅れて、一定速度で追従する

敵（Enemy, 赤）が自機（Player, 白）を追いかけてきます。
自機はカーソルキーで操作できます。
敵はプレファブからインスタンス化して作成しています。

![Unity_Chase2D.gif](https://qiita-image-store.s3.amazonaws.com/0/19238/4d08d941-dd73-4cb8-ba60-5f3d70b0b872.gif)

## (2) 目標物と同じ速度で追従する

(1)は遅れて追従するので、あまり賢い敵には見えませんね。
では、速度を上げたらどうなるでしょうか？ 目標物と同じ速度にしてみましょう。

(1)の白と赤に加えて、白のfollowers(青)があります。
followerは自機から一定の距離を保ちつつ、自機を追跡します。
followerの速度は自機と同じ値を使います。
自機の速度はPlayer.cs において private static でグローバル変数にしています。

![Unity_Chase2D_ef.gif](https://qiita-image-store.s3.amazonaws.com/0/19238/33d33a5a-2bae-9156-c5a3-70de07095184.gif)

## (3) フィードバック制御

(2)のときは、followersの速度がゼロか自機と同じという２つの状態しかありませんので、動作がロボット的になり、自然に見えません。
特に、白が静止した瞬間に着目してください。その瞬間に青もピッタリと静止しています。
こういう動作は現実世界ではありえませんから、不自然に見えてしまうというわけです。

そこで、速度を指定して強制運動させるのではなく、AddForce() を使ったフィードバック制御により現実世界と同様の動作をさせます。

　白： 目標物
　赤： （１）遅れて一定速度で追従
　青： （２）目標物と同じ速度で追従
　緑： （３）フィードバック制御で追従

![Unity_Chase2D_control.gif](https://qiita-image-store.s3.amazonaws.com/0/19238/facc975d-2ca2-44d2-506f-59695507f8f6.gif)

緑のfollowerは自機から一定の距離を保ちつつ、自機を追跡するのは(2)と同じです。
しかし今度は rigidbody2d.AddForce() によりフィードバック制御（PD制御）します。

　制御フォース = 比例制御フォース + 速度制御フォース

ただし、
　比例制御フォース ＝ （目標物の位置 - 制御対象物の位置） x 比例ゲイン
　速度制御フォース ＝ （目標物の速度 - 制御対象物の速度） x 速度ゲイン

制御性能の調整は比例ゲインと速度ゲインで行います。Unityのインスペクターウィンドウで次の二つのパラメータを調整できるようにしてあります。
 - controlGainP: 位置に対するゲイン。比例(P)ゲイン。
 - controlGainD: 速度に対するゲイン。微分(D)ゲイン。

ちなみに、積分(I)ゲインがないため、残留偏差が残る制御系になっています。
残留偏差が問題になるのであれば積分ゲインを追加し、PID制御にすると良いでしょう。

(参考)
[Wikipedia: PID制御](http://ja.wikipedia.org/wiki/PID%E5%88%B6%E5%BE%A1)

## 偏差の計算
目標物と制御対象物の位置や速度の差を「偏差」と読んでいます。
偏差の計算で物体の方向や演算の符号を間違ったり、ゲインの符号を間違ってしまうとフォースが逆向きに作用します。その結果、制御物の動きがおかしくなってしまいます。
AddForce() で制御フォースを与える前に、偏差の計算が正しいかどうかを確認しておいたほうが良いでしょう。

## ゲインの調整手順
制御理論によれば、モデルの数式がわかれば最適なゲインを求めることができるらしいのですが、数式のことを考えたくない私は次のように調整しています。

[1] 比例ゲインに適当な数値、例えば「3」を入れてみる（最初は完全にカンです）。速度ゲインはゼロにします。
　[1.1] ゲーム開始後も制御対象物が動かない
　　　→ 比例ゲインが小さすぎます。比例ゲインを10倍にしてもう一度 [1] へ
　[1.2] ゲーム開始直後に、目標物から離れる方向に飛んでいってしまった　
　　　→ 制御フォースの符号が違います。偏差の計算が正しいなら、比例ゲインの符号を反転させてもう一度 [1] へ

[2] 今度は比例ゲインを固定にして、速度ゲインに適当な数値、例えば「3」を入れてみる（これも、最初は完全にカンです）。
　[2.1] 制御対象物がバネのように行ったり来たりする
　　　→ 速度ゲインが小さすぎます。速度ゲインを10倍にしてもう一度 [2] へ
　[2.2] 制御対象物の速度がどんどん増えていってしまう　
　　　→ 制御フォースの符号が違います。偏差の計算が正しいなら、速度ゲインの符号を反転させてもう一度 [2] へ

[3] 祈る

## Licence
GPLv3

## Author
溝江 智徳
[https://github.com/mizoe](https://github.com/mizoe)
arduinoのasm命令でanalog readをする

#参考文献
[これ](https://garretlab.web.fc2.com/arduino/inside/hardware/arduino/avr/cores/arduino/wiring_analog.c/analogRead.html)を参考にアセンブラで書きました
[命令セット一覧](http://www.cs.shinshu-u.ac.jp/~haeiwa/m-com/instruction.html)
[命令セット一覧](https://avr.jp/user/DS/PDF/AVRinst.pdf)

[参考文献](https://www.avrfreaks.net/forum/adc-converter-assembly-using-atmega328p-mcu)
[参考文献](https://qiita.com/autumn-position/items/ac016c58190f77f66a13#avratmega328p%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E5%9F%BA%E6%9C%AC)
[参考文献](https://qiita.com/TakeoChan/items/8362eaf53cf199262cb7)


```arduino:global変数
//global変数にする
volatile byte c = 0;
volatile byte d = 0;
```

```arduino:main()
//main関数とかに入れる。
asm(
    "ldi  r16, 0x60     \n"
    "sts  0x007C, r16   \n"
    "ldi  r16, 0xC0     \n"
    "sts  0x007A, r16   \n"

    "wait_adc:          \n"
    "lds  r17, 0x007A   \n"
    "sbrc r17, 6        \n"
    "rjmp wait_adc      \n"
    
    "lds r17,0x0078     \n"
    "sts  (c), r17      \n"

    "lds r17,0x0079     \n"
    "sts  (d), r17      \n"
);
```
# 全文
```
//変数はグローバルかどうかで挙動がちがう。
volatile byte c = 0;
volatile byte d = 0;


void setup() {
  Serial.begin(115200);


  //アセンブラ
  //ADMUX(address:0x7C)に0を代入
  //ADCSRA(address:0x7A)に0を代入
  //ADCL(address:0x78)とADCH(address:0x79)にvalueが入っている。
  while (1) {
    asm(
      "ldi  r16, 0x60     \n"
      "sts  0x007C, r16   \n"
      "ldi  r16, 0xC0     \n"
      "sts  0x007A, r16   \n"

      "wait_adc:          \n"
      "lds  r17, 0x007A   \n"
      "sbrc r17, 6        \n"
      "rjmp wait_adc      \n"


      "lds r17,0x0078     \n"
      "sts  (c), r17      \n"

      "lds r17,0x0079     \n"
      "sts  (d), r17      \n"
    );

    //表示
    Serial.print(c);
    Serial.print(',');
    Serial.print(d);
    Serial.print('\n');
    delay(100);
  }
}

void loop() {
}
```
Visual Studio 2017/2019でpythonのリモートデバッグをする時の注意

Visual Studio Codeや、Visual Studo 2015のリモートデバッグ記事は多いのですが．．．
基本は下記の公式説明で問題ないのですがハマった所がありました。

Linux 上の Python コードのリモート デバッグ
https://docs.microsoft.com/ja-jp/visualstudio/python/debugging-python-code-on-remote-linux-machines

### その１）ptvsdのバージョンは「3.2.1」
Visual Studo 2017の場合、リモート側にインストールする「ptvsd」は「3.2.1」が必要となります。
通常にpipでインストールすれば最新が入ると思いますが、少し古い記事だと「3.0.0」や「2.2.0」を入れているため真似するとハマります。
※その３）の通り version 15.8より ptvsdのバージョンは4.0となりました。4.0での動作は見ておりません

### その２）【version 15.8より前】「試験的デバッガーを使用」はOFFに
これは関係ないかもしれませんが私が行った事として、「デバッグ」-「オプション」メニューから、「Python」-「試験的」の中にある「試験的デバッガーを使用」はOFFにしましょう。
変更後はVisual Studioの再起動が必要となります。

### その３）【version 15.8より】「レガシデバッガーを使用」はONに
https://blogs.msdn.microsoft.com/pythonengineering/2018/08/14/python-in-visual-studio-2017-version-15-8/
Visual Studio 2017 Ver15.8より使用可能なptvsdがバージョン4.0となりました。
従来通り「3.2.1」で利用するためには、「デバッグ」-「オプション」メニューから、「Python」-「デバッグ」の中にある「レガシ デバッガーを使用」をONにしましょう。

## 2018/7/4追記
Visual Studio Codeでリモートデバッグする場合には、ptvsdを「3.0.0」とする必要があります。
「3.2.1」では動作いたしません。

## 2018/8/21追記
Visual Studio 2017 version 15.8 より ptvsdのサポートバージョンが 4.0に代わりました。
「3.2.1」で使用するための記載を追記

## 2019/1/9追記
Visual Studio 2019 でも 「レガシデバッガーを使用」をONにする事により
ptvsd「3.2.1」を利用したデバッグを出来る事を確認しております。
SubGitを使って，Subversionのプロジェクトをgitで管理する

# はじめに
Subversionは何でも入れられるのでお気楽なのですが，時間が立ってくるとツリーの切り方が標準の使い方ではなくなったり，自分には全然関係のないリポジトリが増えてきたりしてきます．
そんなSubversionをGitで管理し直したい場合にgit-svnを使う方法もありますが，trunkやbranch，tagの細かなサポートが難しかったりします．
そこで，SubGitを用いてシンプルなGitのプロジェクトへ分けて管理するSubgitの使いかたをメモします
https://subgit.com/

# SubGitの要件
Javaが必要になります．
WSLで動かしたい場合は[Windows Subsystem for Linux (WSL) でJava環境の導入する](https://qiita.com/mitsu48/items/0f18c62a9e368752b243)をどうぞ

# SubGitの基本的な使い方
こちらのQiitaの記事が参考になります
[SubGitでSubversionからGitへ移行](https://qiita.com/n_slender/items/66b4c186c86abfbe5128)
今回はSVNからgitへの一回だけの移行方法です．

## SVNの情報を取得する
```
subgit configure --layout auto URL project.git
```

## configファイルを修正する
project.git/subgit/configのファイルを適時修正します．

## configファイルの情報をもとにsubgitでインポート
```
subgit import project.git
```

## リモートサイトの情報を追記して，リモートgitへプッシュ
```
cd project
git remote add origin git@hoge:project.git
git push origin --all --follow-tags --tags
```

# 参考サイト
[SubGitでSubversionからGitへ移行](https://qiita.com/n_slender/items/66b4c186c86abfbe5128)
[Windows Subsystem for Linux (WSL) でJava環境の導入する](https://qiita.com/mitsu48/items/0f18c62a9e368752b243)
複数AWSアカウントのCodeCommitからgit cloneする際のssh設定についての覚書

複数のAWSアカウントのCodeCommitからgit cloneでコードを取ってくる必要があった。
その時にssh接続設定をどのように書けば良いか困ったため、調べたことの覚書。

## CodeCommitへのssh接続設定
これは[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-ssh-unixes.html#setting-up-ssh-unixes-connect-console)にある通り。

1. ローカルで公開鍵、秘密鍵を生成
2. AWSのIAMユーザに生成した公開鍵を登録
3. ~/.ssh/configに以下のように設定


``` :~/.ssh/config
Host git-codecommit.ap-northeast-1.amazonaws.com
User ***********  　　#IAMユーザの認証情報ページにある、手順2で登録した公開鍵に対応するSSHキーID
IdentityFile ~/.ssh/id_rsa  　　#手順1で生成した秘密鍵
```
``` :gitclone
git clone ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test_app
```

こう書くことで、Hostで指定したAWSのリージョンのCodeCommitからgit cloneする際に上記ssh設定が利用される。
AWSアカウントが一つだけの場合はこの書き方で問題なし。

## 複数のAWSアカウントへのssh設定
困るのは複数のAWSアカウントのCodeCommitを利用する場合。
AWSアカウントが違うということはssh認証に使うUser(SSHキーID)も違うことになるので、上記の書き方だと一つのアカウント以外にはssh認証で弾かれてしまう(***※登録する公開鍵が違えば、IdentityFileも異なる***)

そんな時どうするかと言うと、下記のように書くと良いらしい。

``` :~/.ssh/config
# 1つ目のAWSアカウントに対するssh設定
Host aws1
HostName git-codecommit.ap-northeast-1.amazonaws.com
User ***********  #IAMユーザの認証情報ページにある、手順2で登録した公開鍵に対応するSSHキーID
IdentityFile ~/.ssh/id_rsa  #手順1で生成した秘密鍵

# 2つ目のAWSアカウントに対するssh設定
Host aws2
HostName git-codecommit.ap-northeast-1.amazonaws.com
User ***********  #IAMユーザの認証情報ページにある、手順2で登録した公開鍵に対応するSSHキーID
IdentityFile ~/.ssh/id_rsa  #手順1で生成した秘密鍵
```

``` :1つ目のAWSアカウントからgit_clone
# こう書く所を
# git clone ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test_app

# このように書く
git clone ssh://aws1/v1/repos/app
```

つまり~/.ssh/configのssh設定に任意のHost名を付けた上で、git cloneする際にHost部分を置き換えれば良いということらしい。

## 終わりに
という訳で、複数AWSアカウントのCodeCommitからgit cloneする際のアカウントの使い分け方でした。
git cloneする度にHost部分を書き換えるのがちょっと面倒なので、他にもっと良い方法がないか知りたいところ。
Docker 備忘録


* ドキュメント [Docker Documentation](https://docs.docker.com/)
* image とは: ファイルシステム。変化しない。
* container とは: 実行中の image。

## image の操作

```
docker pull # image のダウンロード
docker run hello-world # hello-world image から container を生成して実行する

docker image ls # image のリスト
docker image rm # image の削除

docker image history (image) # image の作成履歴
docker image tag bb584af21a3a propella/docker-kujira:latest # image に名前をつける。
docker image push propella/docker-kujira # image をアップロードする。
```

## image の指定方法

書式 `IMAGE[:TAG|@DIGEST]`

* NAME (REPOSITORY)
  * 例: `docker run --rm hello-world`
    * ローカルに無ければ dockerhub から library/hello-world:latest をダウンロードする。
  * なぜか `docker image ls` では REPOSITORY と呼ばれる
* TAG
  * 例: `docker run --rm hello-world:linux`
    * `:` の後ろを TAG と呼ぶ。
    * ローカルに無ければ dockerhub から library/hello-world:linux をダウンロードする。
* DIGEST
  * DIGEST を使うと image を特定出来る。
  * DIGEST は `docker image ls --digests` で表示する。
  * 例: `docker run --rm hello-world@sha256:3e1764d0f546ceac4565547df2ac4907fe46f007ea229fd7ef2718514bcec35d`
* IMAGE ID
  * 例: `docker run --rm e38bc07ac18e`

https://docs.docker.com/engine/reference/commandline/pull

## コンテナの操作

```
docker container ls # running 中の container を表示
docker container ls -a # 停止している container を含めて表示
docker container rm # container の削除
docker container stop # container 開始
docker container start # container 停止
docker container rm $(docker container ls -a -q) # 全 container を削除
docker container exec # 実行中の container でコマンド実行
    例: docker container exec -it db bash
```

## docker run のオプション

* `-i`: STDIN を開く
* `-t`: pseudo-TTY を割り当てる
  * 例: `docker run -it propella/docker-kujira bash`
* `--rm`: 実行後コンテナ削除
* `-u`: 実行ユーザを指定
* `-e`: 環境変数を指定
* `-w`: 実行ディレクトリを指定
* `-v`: ホスト位置:コンテナ位置 でホストのディレクトリをコンテナから見えるようにする。

```
docker run -it -v ホストのパス:コンテナのパス (image) bash
```

## Dockerfile

自分で image を作るには Dockerfile という名前のファイルを作る。

```
FROM alpine

RUN apk --update add git openssh make gcc libc-dev ncurses-dev && \
    git clone https://github.com/mtoyoda/sl.git && \
    cd sl && \
    make

CMD ["./sl/sl"]
```

カレントディレクトリの Dockerfile から sl という名前の image を作る。

    docker build -t sl .

実行。この場合アプリが curses を使っているので -it オプションをつける。

    docker run --rm -it sl


Dockerfile に [FROM](https://docs.docker.com/engine/reference/builder/#from) を複数回指定すると image が複数個出来る。最初の image でビルドをして、次の image にコピーするような使い方をする。コピー対象を指定するためには FROM AS 書式を使う。

```
FROM alpine AS build-environment
...

FROM alpine AS SERVER
COPY --from=build-environment src dst
```

のような使い方をする

## Network 設定

```
docker network ls # 表示 標準で bridge ネットワークが使われる
docker run -itd --name=networktest ubuntu
docker network inspect bridge # bridge ネットワークの表示
docker network create -d bridge my-bridge-network # ネットワークの作成
docker run -d --net=my-bridge-network --name db training/postgres # postgres image を my-bridge-network に繋げて実行
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' db # container の IP アドレスを表示
docker network connect my-bridge-network # web ネットワークに繋げる
```

## Docker registry

あとで

## 参考

* [Dockerfile reference](https://docs.docker.com/engine/reference/builder/)
* [Docker run reference](https://docs.docker.com/engine/reference/run/)
【gorm】論理削除したデータを抽出する

# はじめに

gormを導入すると、delete関数を実行すれば自動で論理削除してくれたり、クエリを実行する際に自動的に論理削除データを除外してくれたり色々と便利だったのですが、論理削除を復活させるために一旦論理削除済みのデータを抽出する必要が出てきたので調査しましたのでメモ。

# やり方

ソースを眺めていたのですが、そもそも公式に書いてあることに気づきました。
http://doc.gorm.io/crud.html#delete
※Soft Deleteの項を参照

通常通り、以下のようにWhere関数で条件を指定すると、論理削除されたデータを除く条件が追加されたSQLが実行されます。

```go
db.Where("age = 20").Find(&user)
```

```sql:実行するSQL
SELECT * FROM users WHERE age = 20 AND deleted_at IS NULL;
```

以下のように``Unscoped()``で取得したdbに対して条件を指定すれば、SQLに条件が追加されません。

```go
db.Unscoped().Where("age = 20").Find(&users)
```

```sql:実行するSQL
SELECT * FROM users WHERE age = 20;
```

# 終わりに

``github.com/jinzhu/gorm/main.go``を覗いてみると、関数によってはコメントにリファレンスのURLが載っていたりするので、次困ったことがあったら``main.go``を覗いてみようと思います。
Bootstrapのnavのheightの罠


# Bootstrapを倒したかった



Bootstrapで遊んでいて、よくある左側固定のメニューを作ろうとしていました。




`<div class="col-3 bg-dark">`で左側作って

`<ul class="nav flex-column">`で縦並びにして

`<li class="nav-item"><a class="nav-link" href="#">Link</a></li>`とかなんとかしてそれっぽいものはできたのですが、思っていたのと違うじゃないか。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/268235/04e74f78-c99b-7d51-cb1a-def315009058.png)


なぜそこで諦めた。

## sassでしばく
仕方がないのでsassでしばいてやろうと思いました。sassで`height: 100%`とかやりゃいけるやろ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/268235/b4624393-6fda-66d5-98ac-4099f7a29b25.png)

いけませんでした。意味がわからない。

(ちなみにsassはAtomに`sass-autocompile`をインスコしてセーブしたら自動でコンパイルしてくれるのがおすすめです。調べたらいくらでも出てきます)

## いろいろ調べました

 色々調べてみるとCSS3から使える魔法の単位`vw`(width用)と`vh`(height用)があるらしい。

なるほどとなったので、`height: 100%`を`height: 100vh`としてみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/268235/5ab31d14-bbaf-bc15-c8eb-bf817d71a2f1.png)


できました。
[学習用]コピペで使いたいRails5 seeds.rb データ集

テストデータ登録するのに使うseed 
まだだいたい同じなので忘れない様に作ったものコピペ用メモ
使ったら追加しておきたい。

#ランダムで値を入れる(未確認)
```seeds.rb
10.times do
  Staff.create(
    name: Faker::Name.name,
    age: Faker::Number.between(18, 60),
    joined_on: Faker::Date.between(20.days.ago, Date.today)
  )
end
```
between(18, 60)で18歳～60歳をランダムで入れられる。
Date.between(20.days.ago, Date.today)で日付を今日から20日前までランダムに入れられる。
まだこの方法は試してないので未確認
FakerというGemが必要で、それっぽいユーザーデータが作る。

参考：https://qiita.com/schiughi/items/86ca88b3ccd0a491ea4f
参考：http://maru877.hatenablog.com/entry/2017/07/02/152020

#会社名・住所・電話番号を10個入れる
```seeds.rb
10.times do |i|
  Company.create(
      companyname: "会社名 #{i}",
      zip: "123-456#{i}",
      sentence: "一言文章 #{i}",
      prefectures: "東京都",
      address: "東京都中央区#{i}",
      category: "1",
      # category: "#{i}",
      tell: "03-1234-456#{i}",
      fax: "03-4567-789#{i}",
      mailaddress: "info@test#{i}.com",
      website: "https://test#{i}.com"
  )
end
```

Company.createのCompanyを自分のカラム名に変える。

##会社名・住所・電話番号を1個入れる

```seeds.rb
Company.create(companyname: '会社名',  sentence: '一言文章',zip: '1234567',prefectures: '東京都',address: '東京都中央区中央1-2-3',category: '1',tell: '0120123456',fax: '0120654321',mailaddress: 'info@test.com',website: 'https://test.com/')
```

Company.createのCompanyを自分のカラム名に変える。


#メール・パスワード・名前・フラグ

```seeds.rb
User.create(email: 'admin@test.com', password: 'password', name: '管理者', admin: true)
User.create(email: 'writer@test.com', password: 'password', name: 'ライター', admin: true)
User.create(email: 'worker@test.com', password: 'password', name: '編集者', admin: true)
User.create(email: 'test@test.com', password: 'password', name: '桜田佐藤', admin: false)
User.create(email: 'test2@test.com', password: 'password', name: '横井鈴木', admin: false)
```
アドミンフラグを使ってグループ化してるとき

#メール・パスワード・名前

```seeds.rb
#Admin
Admin.create(email: 'admin@test.com', password: 'password', name: '管理者')
#User
User.create(email: 'satou@test.com', password: 'password', name: '佐藤武田')
User.create(email: 'suzuki@test.com', password: 'password', name: '鈴木田中')
User.create(email: 'tanaka@test.com', password: 'password', name: '田中斎藤')
User.create(email: 'test@test.com', password: 'password', name: 'テスト')

```

#メール・パスワード

```seeds.rb
User.create(email: 'admin@test.com', password: 'password')
User.create(email: 'satou@test.com', password: 'password')
User.create(email: 'suzuki@test.com', password: 'password')
User.create(email: 'tanaka@test.com', password: 'password')
User.create(email: 'test@test.com', password: 'password')
```


#名前・タイトル・コンテンツ

```seeds.rb
10.times do |i|
  Post.create(
          name: "名前 #{i}",
          title: "タイトル #{i}",
          content: "コンテンツ #{i}"
  )
end
```


#わからないこと
ポスト入れつつ、コメントのサンプルも入れたいのに
どうすれば入るのかわからない。
Google Apps Scriptを使って、技術ニュースを気合いで分類する

毎朝、ニュースをいい感じに通知できると便利ですよね。というわけで、Google Apps Script(以下GAS)で作りました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/127762/78b26c21-1813-a17c-4536-18de4e9dff8a.png)

とあるニュースRSSからURLとタイトルが取得できるので、あとはそれなりの精度で分類して通知するプログラムを作りました。技術ニュースは英文のものも多いので、「日本語と英語をごちゃ混ぜの状態のものをいい感じに判定する」部分を工夫して実装しました。

# 実装

アイデア自体はシンプルで、以下の処理を行っているだけです。

1. Google翻訳で英文に翻訳する（GASではLanguageAppで簡単に翻訳可）
2. "-"などを取り除く
3. 単語のn-gramを取って、特定の単語が含まれているものをタグ付けする
4. （整形してチャットに通知）

## 単語のタグ付けのための辞書（ハッシュテーブル）を作る

こういう単語表を気合いで準備します。うまく判定出来なかったものがあれば、その都度追加していきます。

ここで、```'machine-learning'```のような"-"区切りの単語は、2単語を表しています。

```javascript
var raw_dict = {
    '機械学習・データ処理': ['tensorflow', 'chainer', 'ai', 'ais', 'ml', 'deep-learning', 'reinforcement-learning',
            'machine-learning', 'deep-learning', 'data-infrastructure', 'gpu',
            'feature', 'analysis', 'p-hacking', 'natural-language', 'big-data', 'neural-network', 'jupyter', 'jupyter-notebook',
            'data-science', 'data-scientist', 'data-scientists', 'statistics', 'statistical', 'predict', 'predicts',
             'regression', 'linear', 'matplotlib', 'kagglers', 'kaggler', 'kullback-leibler', ...],
   'セキュリティ': ['security', 'leakage', 'privacy', 'ssh', 'tls', ...],
# 以下略
```
先程の辞書を加工していきます。"-"の有り無しを両方ルールとして作るのは、例えば'ReactNative'と'React Native'のようなの表記ゆれに対応するためです。 

```javascript
function createDict(raw_dict) {
  var result = {};
  for (key in raw_dict) {
    raw_dict[key].forEach(function(val) {
      // "-"が有ってもなくても判定
      result[val.replace('-', '')] = key;
      result[val] = key;
    });
  } 
  return result;
}
```

## 英語に翻訳して判定する

```TAGGING_DICT``` が、先程の関数で作った辞書です。

ニュースの判定は、文頭から3単語→2単語→1単語の順にチェックしていきます。これによって、例えば'web-assembly'はフロントエンド技術として、'assembly'は情報工学系の話として判定することができます。

判定できなかった場合は「その他」に分類します。

```javascript
function tag(title) {
  // 日本語を英語に翻訳（英語は英語のまま）
  var eng_title = LanguageApp.translate(title, 'ja', 'en');
  // 小文字に統一し、余計な文字を取り除く
  var words = eng_title.replace(/[\.|,|:|'|"|\!|\?| |\-||【|】|\[|\]]+/g, ' ').toLowerCase().split(' ');
  return (createNgrams(words)).reduce(function(res, w) {
    if (res) return res;
    res = TAGGING_DICT[w];
    return res;
  }, null);
}

function createNgrams(words) {
  // 3単語までに対応
  return [3, 2, 1].reduce(function(res, n) {
    return res.concat(createNgram(words, n))
  }, [])
}

function createNgram(words, n) {
  var queue = [];
  return words.reduce(function(res, w) {
    queue.push(w);
    if (queue.length >= n) {
      res.push(queue.join('-'));
      queue.shift();
    }
    return res;
  }, []);
}
```

# 現状の問題と今後の展望

それなりの精度で判定できるようになりましたが、いくつかの問題があります。

* 「AI」という単語を機械学習系のニュースとして扱うか困る
* 複数形の違いで判定できないことがある
* 「暗号通貨」「仮想通貨」など、日本語から英語への翻訳が一定でない単語がある
  * （'virtual-currency', 'crypto-currency', 'cryptographic-currency', 'encryption-currency'などをその都度追加して対応）
* フロントエンドの「デザイン」と、バックエンドの「設計」が両方'design'になってしまう（英語としては正しいですが）
* セキュリティ関連のニュースなど、URLだけで明らかに判定できるものもあるのでURLの判定ルールを追加したい
* 一般的な単語が技術名に使われている場合に判定できない。例えばGo言語が単に'go'と表記されていた場合、判定できない。
* 単語ルールが肥大化してきたのでどうにしかして楽したい
industrial_ci で roslaunch test する 2. Travis CI と Github の連携

# はじめに
今回は，Travis CIとGithubの連携方法です．

# 目次
1. [はじめに](https://qiita.com/RyodoTanaka/items/790d92c00065311e1165)　
2. [Travis CI と Github の連携](https://qiita.com/RyodoTanaka/items/5051e3403525822a38ee) **← 今ココ**
3. `industrial_ci`の導入
4. `CMakeLists.txt`の記述方法
5. ローカルでのチェック
6. 実際のパッケージでの動作例

# 前提条件
前提条件として下記のものがあります．

- Githubのアカウントを持っていること
- Travis CIのアカウントを持っていること
- リポジトリが公開リポジトリであること

Travis CIのアカウントは，Githubのアカウントと連携可能です！
なので，持ってなくてもゼロから作る必要はありません．
また，非公開リポジトリの場合はどうするかというと，

- ローカルでのみテストする
- [Jenkins](https://www.buildinsider.net/enterprise/jenkins/001)サーバーを自分で建てる

という方法があります．
今回は，そういった例外を除いた場合についてご紹介します．

# 連携の手順
##### 1. Settingsより設定画面へ
![image0.png](https://qiita-image-store.s3.amazonaws.com/0/110699/4e00deb7-5350-ec5a-8be3-6a959b8ac7db.png)
##### 2. Integration & Serviceを選択
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/110699/8750978d-e22d-0bcb-8fa3-278e1566d72a.png)
##### 3. Travis CIの連携を追加
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/110699/e7ace01f-7eec-62a1-90e1-c35ce4eaf157.png)
##### 4. 設定は特にせず，追加を確定
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/110699/b6105c6c-90bf-9b77-afa2-0e2afceaf1bf.png)
##### 5. Travis CIにログイン
前述の通り，Githubアカウントがある方はそれを元にアカウント作れます．
いずれにせよ自分のTravis CIのページに飛んでください．
##### 6. 連携するリポジトリを選択
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/110699/371d0f76-7ee4-cb02-d437-90addd05a7f5.png)
連携の同期ができていなかったりしたら，下図のボタンを押下して更新しましょう．
![image5.png](https://qiita-image-store.s3.amazonaws.com/0/110699/f8cdebb3-397b-6610-67d7-a8b4372bcf8e.png)


以上で完了です．
超簡単ですね！
あとは，対象のリポジトリに`.travis.yml`という設定ファイルをおいておけばOKです．
これについては次回ご紹介します．

# おわりに
というわけで，今回はTravis CIとGithubの連携方法についてご紹介しました．
LibreOffice の Calc で Excel ファイルを開いたら、SUMPRODUCT 関数でエラーになったので修正する

LibreOffice の Calc で Excel ファイルを開いたら、
以下の様な SUMPRODUCT 関数でエラーになった。

`=IF($E14="","",SUMPRODUCT((★祝日★!$H$1:$H$105=$E14)*1))`

なんとか解決出来たので、シェア。

~~`=IF($E14="","",SUMPRODUCT(OFFSET(INDIRECT(ADDRESS(1,8,,,"★祝日★")),0,0,105,1)=$E14)*1)`~~
`=IF($E14="","",SUMPRODUCT((OFFSET(INDIRECT(ADDRESS(1,8,,,"★祝日★")),0,0,105,1)=$E14)*1))`

とりあえず、
以下は同じみたいです。たぶん…。

`[シート名]!$H$1:$H$105`
`OFFSET(INDIRECT(ADDRESS(1,8,,,"[シート名]")),0,0,105,1)`

以上。
Adobe XD UI KIT のリンク先


## 公式っぽいもの

### Wires

いい感じのワイヤフレーム
[Wires, free wireframe kits for Adobe XD on Behance](https://www.behance.net/gallery/55462459/Wires-wireframe-kits-for-Adobe-XD)
<img src=https://qiita-image-store.s3.amazonaws.com/0/49910/1adc41ff-100e-cf95-1994-dbf3050cfed2.png width=400px />

### Wires 日本語版
[Wires jp on Behance](https://www.behance.net/gallery/67284971/Wires-jp)



### iOS

Apple制作
[Apple Design Resources - Apple Developer](https://developer.apple.com/design/resources/)

### Material

Google制作
[Sticker sheets & icons - Resources - Material Design](https://material.io/archive/guidelines/resources/sticker-sheets-icons.html#)

### Windows

Microsoft制作
[UWP アプリ用の設計ツールキットとサンプル - UWP app developer | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/uwp/design/downloads/index)




## その他


### xd resources

XDのリソースが揃ってます。
[xd resources](https://www.xdresources.co/)


### xdguru - XD Free UI kits

[Adobe XD Free UI kits - XDGuru.com](https://www.xdguru.com/free-xd-ui-kits/)

### Navigo UI Kit

[Navigo Transportation UI Kit FREE for Adobe XD on Behance](https://www.behance.net/gallery/60581581/Navigo-Transportation-UI-Kit-FREE-for-Adobe-XD)

### MentorMe UI Kit

[MentorMe UI Kit for Adobe XD on Behance](https://www.behance.net/gallery/65354875/MentorMe-UI-Kit-for-Adobe-XD)

![Kobito.SS8nic.png](https://qiita-image-store.s3.amazonaws.com/0/49910/0d35c01f-22b4-de45-26a5-af59485700ce.png "Kobito.SS8nic.png")
[FREE MentorMe UI Kit by Adobe XD - Dribbble](https://dribbble.com/shots/4590829-FREE-MentorMe-UI-Kit)


### Cooin

[Bestfolios - FREE Cooin Cryptocurrency UI Kit](http://bestfolios.com/resource/free-cooin-cryptocurrency-ui-kit)

<img src=https://qiita-image-store.s3.amazonaws.com/0/49910/c3a3d3f1-db9f-6678-e40a-60524dd45e2b.png width=400px />


### Music Player

[Bestfolios - Music Player App UI Kit Freebie](http://bestfolios.com/resource/music-player-app-ui-kit-freebie)

<img src=https://qiita-image-store.s3.amazonaws.com/0/49910/1d061c59-7bcb-0535-0110-315bbc8210ee.png width=400px />

### Free UI kits

[Adobe XD Free UI kits - XDGuru.com](https://www.xdguru.com/free-xd-ui-kits/)



## 資料

[モバイルとweb向けのUIデザインキット | Adobe XD CC](https://www.adobe.com/jp/products/xd/ui-design-kits.html?promoid=8DN85MZ7&mv=other)
[Five FREE UI Resources for Adobe XD | Adobe Blog](https://theblog.adobe.com/five-free-ui-resources-adobe-xd/)
[XDresources on Behance](https://www.behance.net/xdresources/members)
Android Studioのエミュレータがネットワークに接続できない問題の解決方法

### 現象

環境
Mac OS High Sierra
Android Studio 3.1.3

WebViewで以下のような表示になっており、
DNSで名前解決ができていない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52847/575376cd-be65-97db-384c-b612a2500e90.png)


### 解決方法

エミュレータをCLIからDNSサーバー指定のオプション付きで起動すると解決

```
cd $ANDROID_HOME/emulator/
```

emulatorの名前を確認

```
./emulator -list-avds
```


DNSをGoogle Public DNSに設定

```
./emulator -avd YOUR_EMULATOR_NAME -dns-server 8.8.8.8,8.8.8.
```

でエミュレータが起動するが、これだとエラーが解消していた。

参考:
https://stackoverflow.com/questions/48411091/mac-os-high-sierra-10-13-2-android-emulator-has-no-internet-connection
フロントエンドエンジニアへの復帰の道 ー目標ー

秋頃の転職考えているので、その為に勉強や準備することを纏めておく。

##言語
- JavaScript
    - React
- Ruby

##資格
HTML5プロフェッショナル認定試験
- エンジニアの転職で資格が有利かは分からないが、一応取っておきたい。

##作品
###ポートフォリオサイト
 - 以前作っていた物はエンジニアとしては未熟だと転職エージェントに言われたので、
もっといい物を作る。

###ポートフォリオに載せる作品
 - 実務で作ったサイト以外に5~8個は作りたい。
 - 具体的には、
    - イラストをカラー・ツール・サイズなどに分類して検索できるサイト
    - コーポレートサイト
    - LP
    - wordpressで構築した、個人制作の作品紹介のサイト
    - その他は考え中

以上を三ヶ月で勉強・制作する。
頑張ります。
pythonでランダムな文字列を生成する

[random.choices](https://docs.python.org/3/library/random.html#random.choices)

```py
import random, string

print(''.join(random.choices(string.ascii_lowercase, k=20)))
# => 'vruffnprgthivdocbpgk'
```

> Return a k sized list of elements chosen from the population with replacement. If the population is empty, raises IndexError.

`with replacement`なので重複がある。

---

[random.sample](https://docs.python.org/3/library/random.html#random.sample)

```py
import random, string

print(''.join(random.sample(string.ascii_lowercase, k=20)))
# => 'piwuhekfvrgmaqnxzbcj'
```

> Return a k length list of unique elements chosen from the population sequence or set. Used for random sampling without replacement.

`without replacement`なので重複はない。


[What does replacement mean in numpy.random.choice?
](https://stackoverflow.com/questions/40689152/what-does-replacement-mean-in-numpy-random-choice)
フロントエンドエンジニアへの復帰の道 ー近況と読書ー

##近況
二か月前に買ったmac miniが壊れて、修理に出していたので読書以外の勉強ができなかった。
一昨日修理から戻って来たのでコード書いたりできるようになったので今日からする。

##読んだ本
####リーダブルコード
https://www.oreilly.co.jp/books/9784873115658/
以前から友人に勧められていたり、初心者はこれを読めという記事が多かったので読んだ。
Cやpythonが分からないのでコードの意味がわからない点もあったが、
コードを書く上で重要なことが纏まっていて読みやすかった。
iPadで一通り軽く読んだだけなのでこれからJavaScriptを書く際は適宜参照しようと思う。

##買った本
####パーフェクトJavaScript
https://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88JavaScript-PERFECT-4-%E4%BA%95%E4%B8%8A-%E8%AA%A0%E4%B8%80%E9%83%8E/dp/477414813X
サイ本と迷ったけど軽くて読みやすそうなのでこちらにした。
まだ４０ページほどしか読んでいないが、基本的なことでも細かく例を挙げて説明してくれるので、
基礎を固める＋レベルを上げる為に読んでいきたい。

####入門React
https://www.oreilly.co.jp/books/9784873117195/
まだ読んでない。
パーフェクトJavaScriptを読んでから着手したい。

以上。
Ubuntu1804(bionic)にZabbixをインストール。

件名通りにUbuntu1804にZabbixを入れる。
公式サイトはまだ1604までしか書いておらず、リポジトリサーバ見たらありました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/213689/8b0e4065-7992-c222-1812-84c4f69fa643.png" width=50%>



・Bionic用のパッケージをダウンロード

```sh
wget http://repo.zabbix.com/zabbix/3.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.4-1+bionic_all.deb
```
・リポジトリのインストール

```sh
dpkg -i zabbix-release_3.4-1+bionic_all.deb
apt update
```
・Zabbixサーバのインストール、フロントエンドやエージェントも一緒に。

```sh
apt install zabbix-server-pgsql zabbix-frontend-php php-pgsql zabbix-agent
```

・初期データベースの作成

むむ。公式通り`root`で作業してたらエラー？が出ました。

```sh
sudo -u postgres createuser --pwprompt zabbix
could not change directory to "/root": Permission denied
Enter password for new role:
```

以下に変更してみた。

```sh
su -l postgres -c 'createuser --pwprompt zabbix'
Enter password for new role:
Enter it again:
```
次のコマンドも以下に変更。

```sh
sudo -u postgres createdb -O zabbix zabbix 
↓
su -l postgres -c 'createdb -O zabbix zabbix'
```

・初期化したDBにスキーマやデータを入れる。

```sh
zcat /usr/share/doc/zabbix-server-pgsql*/create.sql.gz | sudo -u zabbix psql zabbix 
```

・ZabbixのConfig変更
`vim /etc/zabbix/zabbix_server.conf`

```vim
DBPassword=password
```
※DBPasswordはコメントアウトされてるので、外すこと。

・Zabbixフロントエンドの設定変更(タイムゾーン)

` /etc/zabbix/apache.conf`
選択肢にあるかわからないけど、大体あってるであろう以下にしました。
`php_value date.timezone Asia/Tokyo`

・Zabbixサーバの再起動、有効化

```sh
systemctl restart zabbix-server zabbix-agent apache2
systemctl enable zabbix-server zabbix-agent apache2 

```

・ブラウザアクセス

![image.png](https://qiita-image-store.s3.amazonaws.com/0/213689/01ed11a8-d393-9630-1fa1-432175483bdb.png)

やったぜ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/213689/02022bcc-801a-14de-74f4-7196eed97028.png)

初期のログインパスは

ID| Password
---|---
Admin |zabbix

みたいです。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/213689/cd9d2143-8919-b714-63f3-2615da2a0741.png)


#### 追記
よく見たら、ブラウザの下に変なメッセージが。
`Zabbix Server is not running. the information displayed may be current.`

ログを確認しました。
`/var/log/zabbix/zabbix_server.log`

```
  2228:20180705:134228.027 database is down: reconnecting in 10 seconds
  2228:20180705:134238.036 [Z3001] connection to database 'zabbix' failed: [0] fe_sendauth: no password supplied

```

DBアクセスができてませんでした。

Postgresqlの認証設定を変更。
`/etc/postgresql/10/main/pg_hba.conf`

```sh

# "local" is for Unix domain socket connections only
#local   all             all                                     peer
local   all             all                                     md5

```

`local all all` のところをmd5に変更しました。

`/etc/init.d/postgresql restart`

接続確認する場合は、`psql -U zabbix`でパスワードを聞かれるかどうかみるとよいすね。

無事接続できた様子です。
APIGateway + Lambdaで、IP制限付き署名付きS3バケットURLの発行と配信を行う

# 背景
`APIGateway` + `Lambda` 経由でユーザからデータを送られてきたデータをS3に保存する。このデータに、「時間制限付き」で「社内IPからのみ」、URLでアクセスできるようにしたい。

# 実現手法
## `署名付きURL` + `Policy` で実現する

署名付きURL付きをLambda関数内で発行する。このURLには有効期限を設定することができる。
また権限は、 `Lambda Function` に設定されているユーザロールと同様のものとなるため、このユーザロールのポリシーに社内IPからのみのアクセス制限をかける。

# ポリシー例
* バケット：`mybucket`
* アクセス可能に設定したいIP: `203.0.113.0/24` (社内IPが固定であれば、 `***.***.***.***/32` のような形になる）

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Resource": "arn:aws:s3:::mybucket/*",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ]
        },
        {
            "Resource": "arn:aws:s3:::mybucket/*",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "203.0.113.0/24"
                }
            }
        }
    ]
}
```

`Action` ごとに `Condition` を設定することで個別にIPアクセス制限を設定する。
当該バケットへのデータの送信はどのIPからでも可能、データへのアクセスは指定されたIPからのみ可能とする。
このPolicyをLambda関数のユーザロールにアタッチする。

# Lambda 関数例（抜粋）

```py

fileObj = ... # 受信したファイルオブジェ
key = ... # S3 key
bucket.put_object(
  Body = fileObj,
  Key = key
)

# この s3_url がアクセス可能なURLになる
# これは何らかの方法でアクセスしたい人に通知する
s3_url = s3_client.generate_presigned_url(
  ClientMethod = "get_object",
  Params = {"Bucket": "mybucket", "Key": key},
  ExpiresIn = 3600, # 3600秒
  HttpMethod = "GET"
)
```

Lambda関数内での、各サービスへのアクセス権限及び、発行した署名付きURLはLambda関数の持つポリシーと同様になるため、`put_object`はどのIPからでも可能、URLアクセスである`get_object`はポリシーに設定されているIPからのみとなる。
また3,600秒のみURLアクセスが可能である。
曜日をbit管理する

色々やりたいタイミングなのでopenFrameworksでbit値を使って曜日管理したいと思い、
C++全然触ったことないけど一生懸命調べた。

要件としては与えられた曜日設定に対して、本日が対象の曜日かを調べること。

日月火水木金土を0000000の7bitとして
1000001なら土日、0111110なら月〜金みたいな感じで
今日の曜日に対してフラグが立ってるかの関数を実装。

```c++
bool ofApp::CheckWeekday(unsigned short settingDay){
	bool result = false;

	bitset<7> bitsetWeeks{settingDay};

	int current = pow( 2, 6 - ofGetWeekday());
	bitset<7> bitsetCurrent{static_cast<unsigned short>(current)};

	if ((int)(bitsetWeeks & bitsetCurrent).to_ulong() > 0){
		result = true;
	}
	return result;
}
```

ofGetWeekdayが0=Sunday〜の対応だったので
要件を満たす形に変換したのが↓コレ

```c++

pow( 2, 6 - ofGetWeekday());
//日:64,月:32,火:16,水:8,木:4,金:2,土:1
```

この記事書いてる今日は火曜日なので
0010000
と変換出来る。

ここまでくればbitsetの論理積を取ってあげて
整数値に戻した値が0より大きければ対象曜日となる。。。
んだけどキャスト塗れでかっこ悪い…cppって難しいなぁ
標準入力を受け取る

シェルスクリプトではパイプラインを用いて、同時に実行するコマンドに出力を渡してあげる事が可能です。
渡される出力を 標準入力 と呼びます。
このパイプラインがDOSコマンドやPowerShellと比較にならないほど強力です。

### 標準入力を用いる例
```
例：echoで渡された出力「パスワード」をzipで圧縮してからリダイレクトする
$ echo "パスワード" | gzip -c > ./test.txt

例：内蔵モニタの明るさを変える(lightとzenityが必要です。)
$ zenity --scale --print-partial | while read i;do light -S $i;done

例：sedコマンドを練習する
$ echo aaabbbccc | sed 's/bbb//g' #bbbを取り除く
aaaccc
```

こんな感じで便利に使う事が出来ます。

## 1.test.shを作り内容を以下の様にします。
```
stdin=`cat`

echo "ここから標準入力"
echo $stdin
echo "ここまで標準入力"
```

## 2.実行してみる
```
$ chmod +x test.sh
$ echo "標準入力テスト！" | ./test.sh
ここから標準入力
標準入力テスト！
ここまで標準入力
```

簡単でした。
Dynamicsでユーザーのログイン情報や記憶域の使用量を確認する方法

ユーザーのログイン状況を知りたい！
記憶域の使用状況を知りたい！

ってときは
どうやら「組織インサイト」というものをインストールするとそれっぽいものが見えそうです。

何時ごろDynamicsで操作が行われているかとか
プラグインの失敗数まで見れます


こんな感じです↓

![組織インスタンスTOP.png](https://qiita-image-store.s3.amazonaws.com/0/258847/9cb6d63d-06df-a487-6750-404d323e790a.png)

![組織インスタンスTOP.２png.png](https://qiita-image-store.s3.amazonaws.com/0/258847/f4f13446-9f9b-2c63-372b-80e97f268ee4.png)

記憶域の使用量やその推移も見れます
![組織インスタンスTOP.png](https://qiita-image-store.s3.amazonaws.com/0/258847/897fbcec-628c-697b-a179-7360a7986120.png)




##組織インサイトを入れる方法

①下記URLにアクセス
https://appsource.microsoft.com/ja-jp/product/dynamics-365/mscrm.04931187-431c-415d-8777-f7f482ba8095?tab=Overview

③「今すぐ入手する」をクリック
![組織インサイト.png](https://qiita-image-store.s3.amazonaws.com/0/258847/9270c549-d5e6-ea47-e72f-f6c418dd0b4f.png)

③あとは表示される通りに進んでいく

④接続されると画像の画面が開く
　画面ではわかりづらいが、「Organization Insights」が「インストール完了」となれば終了
　何分か時間かかります

　![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/258847/56de0358-b282-fa85-aa8f-2bf9ffbe2ca6.png)

組織インサイトを確認するには、Dynamicsを起動して
設定メニューの中に「組織インサイト」が追加されているはずですので
それを開ければOKです。


ちなみに
もし、サイトマップをカスタマイズしたものを使用している場合は
下記のようにサブエリアを追加すれば表示できました

![サイトマップ.PNG](https://qiita-image-store.s3.amazonaws.com/0/258847/ecd4952e-3d68-b649-0540-79ca90ab751b.png)




以上です。
組織インサイトの中身はこれからちゃんと見てみます
[Angular] 開発環境準備 - UbuntuとVisual Studio Codeで始めるAngular (1)

# はじめに

[Angularのチュートリアル](https://angular.io/tutorial)を写経していきます。

しばらくお目汚し失礼します。

# 前提

環境は以下のとおりです。

* Ubuntu 18.04
* Visual Studio Code 1.24.1

# 開発環境の準備

~~TypeScriptをインストールします。~~ __(追記) TypeScriptのバージョン指定があるので、グローバルに入れないほうがよいです。__

```shell_session
sudo npm install --global typescript
```

Angularのコマンドをインストールします。

```shell-session
sudo npm install --global @angular/cli
```

## Visual Studio Code 拡張

何を入れればよいか、よくわからないところではあります。

* TypeScript Hero<br>`import`を整理してくれます。
* Prettier<br>コードフォーマッタです。
* TSLint<br>コードチェッカーです。VSCode単体でもチェックしてくれるので不要かも?初期状態だとPrettierと喧嘩しますし。。。
Raspberry Pi3で何か作ろう2018夏　スケジュール

# Raspberry Piとは
ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団（英語版）によって開発されている。日本では略称としてラズパイとも呼ばれる。
IoTが隆盛した2010年代後半以降は、安価に入手できるIoT機器として趣味や業務に広く用いられている。

wiki参照
https://ja.wikipedia.org/wiki/Raspberry_Pi

# Raspberry Piでできること
・湿度と温度センサー
・天気ステーション
・クリスマス用電飾と音楽の同期
・デジタルフォトフレーム
・モバイル・ロボット
・ホームオートメーション・システム
・デジタルカメラ
・DIYスマートホーム
・Google Play Music専用音楽デッキ
・植物自動水やり機

readwrite参照
http://readwrite.jp/develop/4888/

btrax参照
http://blog.btrax.com/jp/2015/02/24/raspberrypi/

# 今回やること
ラズパイから湿度と温度センサーで湿度と温度を取得して
Webプロダクトと連携する。

# 7月1週目課題
1.Raspberry Pi起動の調査 8h
2.RASBIANインストール 8h
3.周辺機器購入 4h
4.MACからRaspberry Piに接続 4h
5.成果まとめ
　[①Raspberry Pi3の開発環境構築 for MAC](https://qiita.com/ksk8/items/516e8cde88138be9631b
)

# 7月2週目課題
1.Raspberry Piから温度と湿度を取得方法の調査 8h
2.周辺機器購入 4h
3.pyson、db、Django 4h
4.Raspberry Piから温度と湿度をセンサーから取得 8h
5.成果まとめ
　[②Raspberry Pi3で湿度と温度を取得する](https://qiita.com/ksk8/items/ec78e8ed3ab299fc94fa
)

# 7月3週目課題
1.Raspberry Piから温度と湿度をセンサーから取得 8h
2.pyson+DB接続 8h
3.pysonスクリプト修正 8h
4. 成果まとめ
　[③Raspberry Pi3でdh11とDBを連携する](https://qiita.com/ksk8/items/f5f3710e5cf7ff94e52e
)


# 7月4週目課題
1. 土壌センサー調査 8h
2. 土壌センサー連携 16h
3. サーバーの設定

# 8月1週目課題
1. webプロダクトの設計（UI、DB）
2. 競合調査
3. ビジネスモデル作成
4. ロードマップ作成
5. ヒアリング

# 8月2週目課題
1. Webプロダクトモックorプロトタイプ作成
2. Django

# 8月3週目課題
1. Webプロダクトモックorプロトタイプ作成
2. Django

# 8月4週目課題
プレゼン資料作成

[Raspberry Pi3の開発環境構築 for MACに続く](https://qiita.com/ksk8/items/516e8cde88138be9631b
)