OmniAICreator/Qiita-1.07M huggingface dataset:
Vue.Draggable


閲覧ありがとうございます(*^^)v

#git
[mymarkdown2](https://github.com/kazukinakamuraKN/my-markdown-2)

#結論
vue.Draggableすごい

#導入後イメージ
[![Screenshot from Gyazo](https://gyazo.com/9f1c7bd253cda6b1a875a9ab8c59cfff/raw)](https://gyazo.com/9f1c7bd253cda6b1a875a9ab8c59cfff)

#導入方法

###npmを使ってインストール

```:コマンドプロンプト
npm install vuedraggable --save-dev
```
###vueにインポート
vue.Draggableを使いたいvueファイルにインポートします。

```vuejs
import draggable from 'vuedraggable'
```
###componentsに配置
vuedraggableをimportしたdraggableをcomponentsに配置します

```vue

export default {
  name: 'editor',
  props: ['user'],
  components: {
    draggable,
  },
  data () {
    return {
      memos: [
        {
          markdown: ''
        }
      ],
      selectedIndex: 0
    }
  }
}
```

###templateに記載
templateファイル内に記述します

```vue
<template>
  <draggable>
    <div class="memoList" v-for="(memo, index) in memos" :key="index" @click="selectMemo(index)" :data-selected="index == selectedIndex">
      <p class="memoTitle">{{ displayTitle(memo.markdown)}}</p>
    </div>
  </draggable>
</template>
```

**配列や、リストの外側をdraggableで囲む**のがポイントのようです（詳しく把握してませんので下記リンク先などを参照）

#読んだ技術書

[改訂新版-Vue-jsとFirebaseで作るミニWebサービス-技術書典シリーズ（NextPublishing）-渡邊-達明](
https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E6%96%B0%E7%89%88-Vue-js%E3%81%A8Firebase%E3%81%A7%E4%BD%9C%E3%82%8B%E3%83%9F%E3%83%8BWeb%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9-%E6%8A%80%E8%A1%93%E6%9B%B8%E5%85%B8%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%88NextPublishing%EF%BC%89-%E6%B8%A1%E9%82%8A-%E9%81%94%E6%98%8E-ebook/dp/B07HXMHQQK/ref=sr_1_1?ie=UTF8&qid=1542527374&sr=8-1&keywords=vue.js%E3%81%A8firebase%E3%81%A7%E4%BD%9C%E3%82%8B%E3%83%9F%E3%83%8Bweb%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9)

###今回やった内容

ちょい足しポイント５です

#参考にさせていただきました

https://qiita.com/kimuray/items/d728fa1635aeacad359f

https://re-engines.com/2018/04/26/vue-js%E5%85%A5%E9%96%80%E3%81%9D%E3%81%AE%EF%BC%98%E3%80%9Cvue-draggable%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%89%E3%83%A9%E3%83%83%E3%82%B0%E6%A9%9F%E8%83%BD%E3%81%AE%E5%AE%9F%E8%A3%85%E3%80%9C/

#vue.Draggable git

https://github.com/SortableJS/Vue.Draggable

#おまけ

##Gyazo GIF

###導入
[ダウンロード先](
https://support.gyazo.com/hc/ja/articles/208945986-Gyazo%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%A8%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

###起動
ctrl + shift + g 動画で画面キャプチャ
ctrl + shift + c 静止画で画面キャプチャ

###個人的に押したい機能

**ctrl + shift + g の動画キャプチャ**いいです！！
コンパクトな動画にまとめて、Qiitaでササット説明動画を上げたい時に便利です♪

文字より、直感的にわかりやすい解説が可能


#うまくいかなかったポイント
###App.vueにインポートした
結果は、Editor.vueに導入でよかったのですが、importならどこでもいいだろうと思っていたのが間違いでした。
今回、Draggableを導入したかったのが、Editor.vueでした。解説していたサイトでApp.vueにimportしていたのを真似したらうまくいきませんでした。

###componentsにdraggableを配置しようとしたが、どこだかわからなかった
結果はexport default内に導入する！で今回は成功でした。
draggableをコンポーネントに配置する、と書いてあるサイトがあったのですが、どこだかよくわからず迷いました。

###サーバーを再起動しなかった
サーバーを再起動したらうまく動きました。大事。

###draggable.vueをインポートしようとした
結果的には、import draggable from 'vuedraggable'
で導入できたのですが
Draggable.vueというコンポーネントを作って、
import draggable from './components/Draggable.vue'
とやったのはうまくいきませんでいた。
C言語で静的なジャグ配列(っぽいもの)を実現する方法

C言語では、ジャグ配列は構文としてサポートされていない。
[Wikipedia](https://ja.wikipedia.org/wiki/%E9%85%8D%E5%88%97#%E3%82%B8%E3%83%A3%E3%82%B0%E9%85%8D%E5%88%97) の例のように、ポインタ型の配列に各配列を格納しなければならない。
扱いにくいため、個人的にはあまり使用しないが、「初期化された静的な可変長配列のリスト」が欲しいときがある。
(ROM持ちバイナリデータをリストとして扱いたい、とか。)

探せば解説しているページもあるだろうが、Qiita には無さそうなので実装してみた。

## 注
規格に精通してはいないので、用語に関しては誤りがあるかもしれません。
編集リクエストをお待ちしています。

## 要件
- C99(相当)レベルの主要なコンパイラ(というかVisual C++ 2008)でコンパイルできること。  
  (規格準拠はあまり気にしていない。)
- 内部の可変長配列は静的領域に確保されること。
- 要素はイニシャライザで初期化できること。
- できればインライン展開可能であること。

## サンプルコード

```c
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <sys/ioctl.h>

#define DEFINE_INNER_ARRAY_INFO(T) \
  typedef struct {                 \
    size_t length;                 \
    const T* data;                 \
  } InnerArrayInfo_##T;
#define INNER_ARRAY_BEGIN          \
  enum { base = __COUNTER__ + 1 }; \
  switch (index) {
#define INNER_ARRAY(T, ...)                                              \
  case (__COUNTER__ - base): {                                           \
    static const T data[] = {__VA_ARGS__};                               \
    const InnerArrayInfo_##T a = {sizeof(data) / sizeof(data[0]), data}; \
    return a;                                                            \
  }
#define INNER_ARRAY_END(T)            \
  default: {                          \
    const InnerArrayInfo_##T a = {0}; \
    return a;                         \
  }                                   \
  }

DEFINE_INNER_ARRAY_INFO(uint8_t);

InnerArrayInfo_uint8_t numArr(size_t index) {
  INNER_ARRAY_BEGIN
  INNER_ARRAY(uint8_t, 1, 2, 3);
  INNER_ARRAY(uint8_t, 4, 5, 6, 7);
  INNER_ARRAY(uint8_t, 8, 9);
  INNER_ARRAY_END(uint8_t);
}

int main() {
  size_t i = 0;
  for (InnerArrayInfo_uint8_t array = numArr(i); array.length > 0;
       i++, array = numArr(i)) {
    ioctl(0, 0xDEAD, array.data, array.length);
  }
}
```

## 解説(というかメモ)
- ジャグ配列となるオブジェクト自体は作らず、「インデックスを渡すことでジャグ配列のように振る舞う関数」で実装している。
- サンプルコードを見ての通り、 `case` 内のブロック内に静的な可変長配列を用意している。
- 引数の処理が面倒で、翻訳単位に複数のジャグ配列を書けるようにするため、 `__COUNTER__` を使用している。  
  [主要なコンパイラ](http://d.hatena.ne.jp/yohhoy/20121211/p1) では対応しているようなので、問題ないだろう。
- 長さ0を番兵にしているので、内部の配列では長さ0の配列はサポートしていない。
- ジャグ配列の長さは直接取得できない。  
  C++であれば、クラス化すれば可能であるが、 
  そもそも C++11であれば`std::vector<std::vector<T>>` でイニシャライザーリストを用いればいいので、この手法の出番ではない。

## インライン展開
サイズによると思うが、[できることもある。](https://godbolt.org/z/n13fEs)
スーパーグローバル変数備忘録

## GET方式について

```
<!DOCTYPE HTML>
<html lang="ja">
<head>
   <meta charset="UTF-8">
   <title>スーパーグローバル変数</title>
</head>
<body>
<h1>フォームに入力した内容を取得する</h1>
<form method="get" action="receive.php">
   <label>名前： <input type="text" name="my_name"></label>
   <input type="submit" value="送信する">
</form>
</body>
</html>
```

```　<?php
if( isset( $_GET['my_name'] ) === TRUE && $_GET['my_name'] !== '' ) {
   print 'ここに入力した名前を表示： ' . htmlspecialchars($_GET['my_name'], ENT_QUOTES, 'UTF-8');
} else {
   print '名前が未入力です';
}
?>
```
### form method="get" action="receive.php"
form=入力したデータを違うところに飛ばす
actionの後ろにURLを入れることにより、そこに飛ぶようになる。

### if( isset( $_GET['my_name'] ) === TRUE && $_GET['my_name'] !== '' )
$_GET[my_name]は連想配列(my_nameという箱のなかにhtmlのmy_nameが入ってる)
issetは上記のGET[my_name]が存在しているかチェックしている←絶対忘れない
$_GET['my_name'] !== ''とはちゃんと文字が入力されてるかチェック(文字が入ってないなんてことはないよね？って意味)

※htmlspecialchars($_GET['my_name'], ENT_QUOTES, 'UTF-8')htmlspecialcharsを使って$_GET['my_name']を表示させてる。

# POSTとGETの違い

GET方式はURLに名前として出てくる
POST方式はURLに表示されないため、セキュリティが必要な場合に使う。(パスワードなど)
さらにGET方式はmethod="GET"を省略可能だが、POSTは必ずmethod="POST"と書く必要がある。
POSTはform文出ないと使えないが、GET方式はハイパーリンクとかでも使える。
URLの?から後ろに表示されてるのがリクエストパラメータと呼ばれている
google.co.jp/search?q=codecamp(リクエストパラメータが表示されるのがGET方式)
Csharp Coding Guidlines Unity Community 和訳

# Csharp Coding Guidelinesの和訳をしました
元のサイトはこちら
[Csharp Coding Guidelines](http://wiki.unity3d.com/index.php/Csharp_Coding_Guidelines)
## 波括弧
{は常に中身を書く前の行の初めから書く。波括弧の中身は4文字tab

```cs
if (someExpression)
{
    DoSomething();
}
else
{
    DoSomethingElse();
}
```

switch文のcaseはインテンドする

```cs
switch (someExpression)
{
    case 0:
        DoSomething();
        break;
    case 1:
        DoSomethingElse();
        break;
    case 2:
        {
            int n = 1;
            DoAnotherThing(n);
        }
        break;
}
```

波括弧は常に書く。たとえ処理が一行の文章でも可読性と保守性を高めるために書く必要がある

```cs
for (int i = 0; i < 100; i++) { DoSomething(i); }
```

## Single line statements
一行の処理は同じ行の最初と最後に波括弧をつける

```cs
public class Foo
{
    int bar;

    public int Bar
    {
         get { return bar; }
         set { bar = value; }
    }
}
```

## コメント
コメントはコードの意図やアルゴリズムの説明、論理和などのロジカルの説明に使う。コメントを読めば他の人が関数の意図する振る舞いを理解し、使えるようにする必要がある。コメントが必要ないほどの短いルーチンもあるが、ほぼ全てのルーチンにプログラマの意図を伝えるためにコメントが追加されるべきである。

## コメントのスタイル
//を使うべき。コードの横ではなく、上にコメントを書く。

```cs
// This is required for Controller access for hit detection
FPSController controller = hit.GetComponent<FPSController>();

// Create a new ray against the ground
Ray ray = new Ray(hit.transform.position, -Vector3.up);
```

スペースが許すときはコードの横に書いてもいい。

```cs
public class SomethingUseful
{
    private int         itemHash;            // instance member
    private static bool hasDoneSomething;    // static member
```

## スペース
スペースはコードの可読性を向上させ、コードの密度を下げる。
関数の引数の,(コンマ)の後は一つスペースを空ける

```cs:良い例
Console.In.Read(myChar, 0, 1);
```

```cs:悪い例
Console.In.Read(myChar,0,1);
```

関数の括弧の後や、引数の後にはスペースを使わない

```cs:良い例
CreateFoo(myChar, 0, 1)
```

```cs:悪い例
CreateFoo( myChar, 0, 1 )
```

関数名と括弧の間にはスペースを入れない

```cs:良い例
CreateFoo();
```

```cs:悪い例
CreateFoo ();
```

[]の中ではスペースは使わない

```cs:良い例
x = dataArray[index];
```

```cs:悪い例
x = dataArray[ index ];
```

条件文の括弧の前にスペースを一つ入れる

```cs:良い例
while (x == y)
```

```cs:悪い例
while(x == y)
```

比較演算子の前後にスペースを入れる

```cs:良い例
if (x == y)
```

```cs:悪い例
if (x==y)
```

##命名規則
* ハンガリアン記法は使わない
* 接頭語(\_, m_, s_, etc)は使わない
* ローカルとメンバ変数を判断するときは"this"を使う
* メンバ変数にはキャメルケースを使う(e.g myData)
* パラメータにはキャメルケースを使う
* ローカル変数にはキャメルケースを使う
* 関数、プロパティ、イベント、クラス名にはパスカルケースを使う(e.g MyData)
* インタフェースの名前は"I"から始める
* enums, classes, delegatesの先頭は文字で修飾しない

[C#のプロパティ、メンバ変数、メソッドについて](https://qiita.com/toshi0607/items/801a0d37fb48313cbdbd)

## ファイル
* ソースファイルは一つのpublicタイプのみを持つ。ただし、複数のインナークラスは許される。
* ソースファイルはそのpublicなクラス名によって命名される
* クラスのメンバはアルファベット順、ソースコード内はセクションに分けて順番に書く(
フィールド、
コンストラクタ、
プロパティ、
イベント、
メソッド、
privateインタフェースの実装、
ネストのタイプ)

```cs:例
using System;
using UnityEngine;

public class MyClass : MonoBehaviour
{
    // フィールド
    int foo;

    // プロパティ
    public int Foo { get {...} set { ... } }

    // メソッド
    void MyMethod(int number)
    {
        int value = number + 2;
        Debug.Log(value);
    }
}
```
【Hive】カラム追加後のFULL OUTER JOINがどうなるかわかってなかった

## はじめに
FULL OUTER JOINを使っているバッチ処理があり
片方のテーブルにカラム追加することになった。
どんな結果になるのかイメージがつかなかったため
自分でテストしてみた。

## 環境
Hive

## やったこと
下記のような2つのテーブルがある。
同じようなテーブルだが
fugaテーブルの方はカラムが1つ少ない。

###hogeテーブル

|no|name|yomi|number|
|:-:|:-:|:-:|:-:|
|1|佐藤|sato|200|
|2|鈴木|suzuki|175|
|3|高橋|takahashi|145|
|4|田中|tanaka|135|
|5|渡辺|watanabe|115|
|6|伊藤|ito|110|

###fugaテーブル

|no|name|yomi|
|:-:|:-:|:-:|
|1|佐藤|sato|
|2|鈴木|suzuki|
|3|高橋|takahashi|
|4|田中|tanaka|

下記のコマンドを叩いてfugaにもカラムを追加する。

```
ALTER TABLE fuga ADD COLUMNS (number INT);
```

こうするとnumberカラムが追加されるが、カラムの中身はNULLになる。

###fugaテーブル(カラム追加直後)

|no|name|yomi|number|
|:-:|:-:|:-:|:-:|
|1|佐藤|sato|NULL|
|2|鈴木|suzuki|NULL|
|3|高橋|takahashi|NULL|
|4|田中|tanaka|NULL|


ここで下記のSQLを投げてfugaの中身を
INSERT OVERWRITEで上書きしてみると思ってた結果と違った。

###投げたSQL

```
INSERT OVERWRITE TABLE fuga
SELECT
  if(h.no IS NULL, f.no, h.no) as no,
  if(h.name IS NULL, f.name, h.name) as name,
  if(h.yomi IS NULL, f.yomi, h.yomi) as yomi,
  if(h.number IS NULL, f.number, h.number) as number
FROM
  (
   SELECT
     *
   FROM
     hoge
  ) h
FULL OUTER JOIN
     fuga f
ON
  h.no = f.no
;
```



###INSERT OVERWRITE後のfugaテーブル(予想)

|no|name|yomi|number|
|:-:|:-:|:-:|:-:|
|1|佐藤|sato|NULL|
|1|佐藤|sato|200|
|2|鈴木|suzuki|NULL|
|2|鈴木|suzuki|175|
|3|高橋|takahashi|NULL|
|3|高橋|takahashi|145|
|4|田中|tanaka|NULL|
|4|田中|tanaka|135|
|5|渡辺|watanabe|115|
|6|伊藤|ito|110|



###**INSERT OVERWRITE後のfugaテーブル(実際の結果)**

|no|name|yomi|number|
|:-:|:-:|:-:|:-:|
|1|佐藤|sato|200|
|2|鈴木|suzuki|175|
|3|高橋|takahashi|145|
|4|田中|tanaka|135|
|5|渡辺|watanabe|115|
|6|伊藤|ito|110|


## 終わりに
クエリを見ればわかる当たり前な結果が出たけど
テストしてみるまで間違った予想をしていたので
自分で手を動かして確かめて良かった。
Swift メソッド

## メソッド
- 型に紐づけられた関数
- 型のインスタンスの振る舞いを実現するた目に使用される

### 定義方法
型の定義の内部でfuncキーワードを使用する。

```swift
func メソッド名(引数) -> 戻り値の型 {
    メソッド呼び出し時に実行される文
}
``` 
メソッドを呼び出すには、型のインスタンスが代入された変数や定数に.とメソッド名と()を付けて、変数名.メソッド名()のように書く。

```swift

struct Greeting {
    func greet(user: String) -> Void {
        print("My name is \(user).")
    }
}

let greeting = Greeting()
greeting.greet(user: "KunioTerada")
```
```
My name is KunioTerada.
```
Dockerfile のコマンド一覧

# 前提
- FROM と RUN くらいしか使ったことない
- ドキュメントをなめたことない

といった方向け（つまり自分向け）

# 環境
- Docker v18.09

# TL;DR

| <img width="500">コマンド名 | 詳細 |
| --- | --- |
| escape | Dockerfile が現状唯一サポートしている Parser Directive。 Dockerfile 内でエスケープする文字を指定することができる。デフォルトだと `\（バックスラッシュ）` が指定されている。 
FROM | - build stage を初期化して（multi stage build とかやる場合は、複数回 FROM を書くことになる）、ベースイメージをセットするためのコマンド。 <br/> - だいたいは公式にリリースされているイメージから引っ張ってくることが多い。<br/> - ARG コマンドは唯一 FROM の前に来ていいコマンド。
RUN | ビルド時に任意のコマンドを実行できるコマンド。 RUN <command> の場合、 `/bin/sh -c` 。 RUN ["exec", "foo", "bar"] の場合、他の "exec" の部分で `/bin/bash` とか指定できる。
CMD | - `docker run` か `docker-compose run` を実行するときに実行されるコマンド。 ENTRYPOINT あとに書けば追加の引数になる（その場合はJSON形式で書く必要がある）。
LABEL | イメージにメタデータを付与するコマンド。バージョンはいくつだとか、作成者の名前とかをキーバリューで記入したりするのに使う。
MAINTAINER | 非推奨。作成者の名前をイメージに付与するコマンド。 LABEL の方を使うべき。
EXPOSE | コンテナが公開するポートを指定するコマンド。ただ、これはコンテナ側から公開するだけなので、実際にホスト側からアクセスするには、 `docker run -p 80:80` みたいな感じでバインドする必要がある。このあたりは、 docker-compose.yml で管理する方がシンプルな気がする。
ENV | 環境変数をセットするコマンド。 Dockerfile 内で定義して以降、使い回したり、値を上書きできたりする。
ADD | - ホスト側のファイルをイメージ側の指定したディレクトリにコピーするコマンド。<br/>- コピーするファイルが前回ビルドしたときから変わった場合、その ADD 以降のコマンドのキャッシュはすべて破棄される。<br/>- gzip, bzip2 などの圧縮ファイルをコピーする場合、解凍してコピーされる。動きとしては `tar -x` と同じ。
COPY | - ホスト側のファイルをイメージ側の指定したディレクトリにコピーするコマンド。
ENTRYPOINT | - `docker run` か `docker-compose run` を実行するときに実行されるコマンド。実行時に CLI 上から引数を受け取ることができる。
VOLUME | ホスト側のデータをマウントするディレクトリを指定するコマンド。
USER | コンテナ内でのユーザー／グループ名を指定するコマンド。何も指定しない場合は `root@imageID:/` のように root ユーザーが指定される。
WORKDIR | 作業ディレクトリを指定（ない場合は新しく作成）するコマンド。
ARG | CLI 上から引数を代入するキーを指定するコマンド。 `ARG <key>` といった感じに書いておいて、 `--build-arg <key>=<value>` オプションで代入することで、 Dockerfile 内で <key> の値は使い回しすることができる。
ONBUILD | あるイメージをベースイメージとして他で使用する（ FROM で引っ張ってくる）タイミングで実行するコマンド。
STOPSIGNAL | コンテナを終了させる際に送信されるシグナル（ `man signal` で出てくるシグナル）を指定するコマンド。正直言って何に使うのか皆目見当もつかない。
HEALTHCHECK | コンテナを立ち上げている最中に一定間隔でCMDを実行させるコマンド。
SHELL | Dockerfile 内で実行されるシェルコマンドの形式を上書きするコマンド。 Linux 環境の場合だと、デフォルトで `/bin/sh -c` として実行されるが、これを `/bin/bash` とかに変更できたりする。

# 参考文献
- [Dockerfile reference](https://docs.docker.com/engine/reference/builder/)
Pythonista3でのUI制御方法

<h1>Pythonista3でUI制御を練習する記録</h1>
iPhoneでpythonを勉強する為にPythonista3を購入。
[公式ドキュメント](http://omz-software.com/pythonista/docs/ios/ui.html)で勉強した事の備忘録です。

そもそもiphoneだとpresentの種類は選べず全画面表示になる事も上記ドキュメントで知りました。。。


<h1>Pythonista3でUIを練習する手順</h1>

* プラスマークをクリックして「Script with UI」を選択
* 二つファイルが生成される(.pyと.pyuiの二種類)
* .pyuiと.pyの編集


<h1>公式の.py練習用コード解説</h1>

```py
import ui

def button_tapped(sender):
    sender.title = 'Hello'

view = ui.View()                                      # ①
view.name = 'Demo'                                    # ②
view.background_color = 'white'                       # ③
button = ui.Button(title='Tap me!')                   # ④
button.center = (view.width * 0.5, view.height * 0.5) # ⑤
button.flex = 'LRTB'                                  # ⑥
button.action = button_tapped                         # ⑦
view.add_subview(button)                              # ⑧
view.present('sheet')                                 # ⑨

```

①view = ui.View()　
vビューの生成

②view.name = 'Demo'　
view変数の名前

③view.background_color = 'white'
viewの色

④button = ui.Button(title='Tap me!')新
しいボタンの生成とキーワード引数の設定

⑤button.center = ()・・・・・ 
親のviewサイズからボタンの位置を指定

⑥button.flex = 'LRTB'
ボタンのサイズを、可変にする

⑦button.action = button_tapped
ボタンを使うための関数を設定

⑧view.add_subview(button)
このメソッドでコンテナビューの子になるらしい意味不明

⑨view.present('sheet')
画面に表示するメソッド。iPadだとカスタムが選べる。iPhoneだと常に全画面とのこと


<h1>おわりに</h1>
このあとUIエディタで、より簡素なプログラムで操作ができる事がわかりましたが
今回のソースを理解することにより制御が少々わかりました。
[Swift] お前、rethrowsだったのかよ...


こういう関数があったとしましょう。

```swift
func hoge() throws -> Bool {

   //　それほど時間のかからない処理
   return result
}

func fuga() throws -> Bool {

  // 結構時間のかかる処理
  return result
}
```

この2つの関数のうちのいずれかが `true` なら特定の処理をするとします。

普通に書くとこうなります。

```swift

do {
  if try hoge() || try fuga() {
    // 処理
  }
}
catch {}
```

swiftcさん

```
error: 'try' cannot appear to the right of a non-assignment operator
```

だめだー！

書き直します。

```swift

do {
  if try hoge() {
    //処理
  } else if try fuga() {
    // 上と同じ処理
  }
}
catch {}
```

ありえねぇ！！！

書き直します。

```swift

do {
  let isHoge = try hoge()
  let isFuga = try fuga()
  if isHoge || isFuga {
    // 処理
  }
}
catch {}
```

不要かもしれないのに必ず時間のかかる`fuga()`を実行してるのつらい。


実はこのように書けます。
（@t_ae さんにコメントをいただきさらに簡略化しました）

```swift

do {
  if try hoge() || fuga() {
    // 処理
  }
}
catch {}
```

`||` さん、 お前、`rethrows`だったのかよ...
Associate Cloud Engineerを受験します

##取得する理由
GCPを仕事で使うならやっぱり資格持ってたいよね、ってことで取得に向けて勉強を始める。
まずは一番簡単と言われているAssociate Cloud Engineerから。

##受験申込
https://cloud.google.com/certification/guides/cloud-engineer/?hl=ja
ここの「登録」ボタンから

##勉強方法
- [模擬試験](https://docs.google.com/forms/d/e/1FAIpQLSc7bkUHpDbFShBI5xE4u8OO2vl99DrP0htnswa-la9DQynToA/formResponse?hl=ja)
- [試験ガイド](https://cloud.google.com/certification/guides/cloud-engineer/?hl=ja)
- [公式ドキュメント](https://cloud.google.com/products/?hl=ja)
- 書籍（プログラマのためのGoogle Cloud Platform入門）

##模擬試験の感触
どういう質問されるのかがいまいちイメージが沸かなかったから
通勤中の浅い勉強のみでとりあえず受けてみた。

　結果：14／20問（なんとも言えない点数:sleeping:）
ただ個人的には、元々パブリッククラウドの知識がゼロからだったのに
思ってたより正解していて少し驚いた。

やっぱり、それぞれのサービスの概要の理解と、向き不向きを把握することが大事そう。
あとは、設定周りと権限周り。
こういう設定をしたいときはどうやったらいいんだっけ？どの権限与えるのが適切？とか。

##今後の勉強方法
模擬試験でどういった内容が質問されるのか、なんとなくわかったので
試験ガイドと公式ドキュメントを読み、整理しつつ勉強してみる。

Console周りは実際に触ったほうが覚えられそうだから、書籍を読んで手を動かすが良さそう。
株価をscikit-learnで機械学習してみる　GUI化

（注）ここでは最終結果だけでなくエラーの試行錯誤も含めて書いていきます。
　　　また中途半端でもアップし後々更新することとします。

# 目的
以前行った[回帰分析](https://qiita.com/soshi8/items/4ed22872cf185ce421ea)をGUI化してみます。


# GUI化方法

## ライブラリ
ググってみるとtkinterというツールがあるようなので試してみます。

## 開発環境
今まではjupyterで開発していましたが、Spiderに変えます。  
jupyterは使いやすいのですが、各セル単位で文法チェックしてしまうため  
後に書いておくものがチェック対象にならずエラーとなるのが面倒と考えたためです。  

## 作ってみる
とりあえず画面を作ってみます。

```
import tkinter 

root = tkinter.Tk()
root.title(u'My First App')
root.geometry("600x450")
root.mainloop()
```

![app1.png](https://qiita-image-store.s3.amazonaws.com/0/248083/25addf9e-036b-eeea-ea91-df3858449714.png)

意外と簡単そうですねえ。
では入力欄を作成します。  

```
label1 = tkinter.Label(text=u'４営業日前:',font=8)
label1.pack()
label2 = tkinter.Label(text=u'３営業日前:',font=8)
label2.pack()
label3 = tkinter.Label(text=u'２営業日前:',font=8)
label3.pack()
label4 = tkinter.Label(text=u'１営業日前:',font=8)
label4.pack()
label5 = tkinter.Label(text=u'予想結果:',font=8)
label5.pack()
label6 = tkinter.Label(text=u'xxxxx円',font=8)
label6.pack()

Entry1 = tkinter.Entry(font=8)
Entry1.pack()
Entry2 = tkinter.Entry(font=8)
Entry2.pack()
Entry3 = tkinter.Entry(font=8)
Entry3.pack()
Entry4 = tkinter.Entry(font=8)
Entry4.pack()
```

![app2.png](https://qiita-image-store.s3.amazonaws.com/0/248083/7c9ca2e7-1672-7b7d-bee6-77368b3b55aa.png)

かっこ悪い・・・  
packではなくplaceとすることで位置決めできるみたいなので変えてみます。  
ただし画面の大きさに応じてみたいなことができなくなってしまうようなので一長一短ですが。  

```
label1 = tkinter.Label(text=u'４営業日前:',font=8)
label1.place(x=50,y=50)
（略）
Entry4 = tkinter.Entry(font=8)
Entry4.place(x=200,y=200)
```

![app3.png](https://qiita-image-store.s3.amazonaws.com/0/248083/37a8dd28-3656-8ad4-65f9-dc5c52443495.png)
これなら見れますね。

ボタン追加します。押したときにcalcNikkeiで計算させます。  

```
Button1 = tkinter.Button(text=u'予測します。', font=8)
Button1.bind("<Button-1>", calcNikkei)
Button1.place(x=100,y=300)
root.bind('<Return>', calcNikkei) 
```

Button1.bind("<Button-1>", calcNikkei)  
bindについて解説  
- １つ目："<Button-1>"：対象行為。これは左クリック。  「Button-2」真ん中クリック、「Button-3」は右クリック  C++、VBなどではOnClick()イベントみたいなイメージ
- ２つ目：calcNikkeiがよびだす関数。  
  
root.bind('<Return>', calcNikkei)   
- これはroot画面でリターンキーを押したときcalcNikkeiを実行  
- C++、VBなどではButton1のdefault=trueのようなイメージ。　　


## 値の読み取り

floatでないといけないのでチェックが必要です。  
さてチェックし方ですかpythonではgotoで飛ばせそうもないのでtry-catchで対応します。  
retをTrueで初期化し、Falseとしエラーの場合にメッセージ表示させます。

```
    ret = True
    if ret:
        try:
            val1 = float(Entry1.get())
        except ValueError:
            msg.showerror(title = '４日前のエラー', message = u'４日前の値が数字ではありません')
            ret = False
```

この調子で入力欄４まで判定します。  
ここまでで１つでもエラーの場合はretはFalseになっていますので計算結果は表示しません。Trueの場合のみ入力欄１～４の値で計算します。  

```
    if ret:
        test_data = np.array([[val1,val2,val3,val4]])
        predicted = reg.predict(test_data)
        label6["text"] = str(predicted.tolist()[0]) + "円"        
    else:    
        label6["text"] = "xxxxx円"
```

実行してみた結果
![app4.png](https://qiita-image-store.s3.amazonaws.com/0/248083/ed22c333-35ec-b8e1-f346-cf0e5a965d41.png)

クリアボタン、終了ボタン等も作成しています。  
メニューバー等を作ってみたいですね。  

## ソース
https://github.com/soshi8/finance2/blob/master/PythonTK.py

とりあえず並べただけのソースです。
画面作成部分はクラス化できそうですかね。  
学習データも選択できるようにできれば。
RailsでI18nにtrue/false のキーを設定するとtranslation missing

# I18n
Railsで多言語化や、表示文言の統一などで用いるRuby のgemです。
詳しいことはネット上にたくさんわかりやすい記事がありますので省略させていただきます。

# 問題
さっそく表題にある問題について書いていきます。
ソースコードは以下のとおりです。

```config/locales/ja.yml
ja:
  example:
    true: "おｋ"
    false: "だめ"
```

```app/views/example.html.erb
<div>
  <%= t('example.true') %>
  <%= t('example.false') %>
</div>
```

「おｋ/だめ」が表示されるのを期待したのですが以下のようなエラーが発生。

`translation missing: ja.example.true`
`translation missing: ja.example.false`

設定がミスっていないことを確認して原因を調べると、同じ問題に直面している方とそれに対する解決策が見つかりました。
https://github.com/rails/rails/issues/27829

# 解決策
つまるところ、キーのtrue/false をダブルクォーテーションで囲めば上手くいきます。

```config/locales/ja.yml
ja:
  example:
    "true": "おｋ"   # 'true'でもいいよ
    "false": "だめ"  # 'false'でもいいよ
```
yes/no でも同じ現象が起きるみたいですが、同じようにダブルクォーテーションで囲ってあげれば大丈夫みたいです。

「enumerizeのI18nではまったこと」
https://qiita.com/runamoon@github/items/d0a953afc25ea4e9365b

「YAML: Keys like "yes" or "no" evaluate to true and false」
https://makandracards.com/makandra/24809-yaml-keys-like-yes-or-no-evaluate-to-true-and-false

以上です。

# メモ
表題について調べてる途中に、i18n の小技集という記事があったのでメモとして残させていただきます。意外にこういう細かいことは検索しても出てきにくいので、とてもありがたいです。先人に感謝です。

「i18nロケールファイルの書き方小技集」
https://qiita.com/tomomomo1217/items/858f290a0dc1a817985c
Pocketに保存したサイトをMicrosoft Teamsに送る

[Microsoft Teams](https://products.office.com/ja-jp/microsoft-teams/free)のチャットルームに、[Pocket](https://getpocket.com/about/)で保存したページの通知を自動的に送信してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/50391/1209a7c5-69e4-03b2-a558-7f1f376f17a4.png)

MicrosoftTeamsへの通知内容は見た目を結構カスタマイズすることができます。たとえば今回の例では、テーマカラーとしてPocketらしい`#ef4056`を指定していて、ピンク色の横線が入っていることが分かります。

連携には[IFTTT](https://ifttt.com/discover)のWebhookを使います。

### Microsoft Teams側の操作
- 通知を送りたいチャネルの「コネクタ」→「Incomming Webhook」
- 表示されるURLをクリップボードにコピー

### IFTTT側の操作
- Choose a service(this): Pocket
- Choose trigger: Add New Item
- Choose action service(that): Webhooks
- Make a web request

項目|内容
:--|:--
URL|コピーしたURL
Method|POST
Content Type (optional)|application/json
Body (optional)|下記のようなJSON

```json
{
  "@context": "http://schema.org/extensions",
  "@type": "MessageCard",
  "themeColor": "ef4056",
  "title": "{{Title}}",
  "text": "{{Excerpt}}...",
  "sections": [
    {
      "facts": [
        {
          "name": "追加日",
          "value": " {{AddedAt}}"
        }
      ],
      "heroImage": {
        "image": "{{ImageUrl}}"
      },
      "text": "{{Tags}}"
    }
  ],
  "potentialAction": [
    {
      "@type": "OpenUri",
      "name": "読む",
      "targets": [
        {
          "os": "default",
          "uri": "{{Url}}"
        }
      ]
    }
  ]
}
```

以上で設定完了です。

## 参考
- [コネクタによる操作可能なメッセージの概要 \| Microsoft Docs](https://docs.microsoft.com/ja-jp/outlook/actionable-messages/actionable-messages-via-connectors)
Working CopyでHerokuのgitをクローンする

# Working Copyについて。
要はiOSデバイス上でGitを扱えるらしい。
[公式](https://workingcopyapp.com/)
[iOSアプリWorking CopyとTextasticでgitが使えるモバイル開発環境を作る](https://liginc.co.jp/323828)

移動の多い仕事なので、電車の中でGit見れたら便利かなと思った。

# やりたいこと
Heroku上のgitをiOSにクローンしたい

# 下調べ
[公式ユーザガイド-Heroku Remote](https://workingcopyapp.com/users-guide#heruko-remotes)
あらかじめ、別のマシンで今回繋ぎたいHerokuのGitに繋いでおくこと。
今回はMacBookを別マシンということでやってみた。

# 手順
### 1.Remote詳細情報の確認
MacBookのターミナルで以下コマンド

```
$ git remote -v
origin	https://git.heroku.com/hogehoge.git (fetch)
origin	https://git.heroku.com/hogehoge.git (push)
```

これでURLが分かった。


### 2.Heroku Gitにアクセスするための認証情報確認
WorkingCopyではHeroku Toolbeltは使わないので、HerokuにログインするID/PWとは
別の認証情報が必要らしく、それを調べる。
MacBookのターミナルで以下コマンド

```
$ cat ~/.netrc
machine api.heroku.com
  login yourname@domain
  password xxxxxxxx
machine git.heroku.com
  login yourname@domain
  password xxxxxxxx
```

これで認証情報が分かった。

### 3.WorkingCopyでリポジトリ追加
ここからはiOS側の作業。
WorkingCopyアプリを起動し、Repositories画面の右上の➕ボタンを押すと
「Clone repository」という選択肢が出てくるのでタップ。
<img width="375" alt="IMG_1743.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/317276/da066607-4ed0-87e4-7b51-0221ac699e9f.png">
URLには1.で確認したURLを入力。
Protocolはhttps。
Userには2.で確認したユーザ名(loginのところ)を入力。
残りは空欄で、Cloneボタンを押す。
たまにこのとき、URLのところが最初に入力したやつから変わってしまって、
なんだかUserの内容がURLに紛れ込んでいることがあるので、その場合には
たしかに1.の内容となるように戻す。

以上のはず。
ひらがなをランダムに出力する

今日は。
今日（昨日）、友達とTSUTAYAに寄りました。
5枚借りると1000円でお得！なキャンペーン中だったので、この際5枚借りようってなったのですが、でもお互い特段借りたいCDも合わせて3枚ほどしかなかったので、残りの2枚はランダムで決めることにしました。

ひらがなをランダムに出力するプログラムが必要になったので、ここに記します。

```python
# coding: utf-8
import random

k = random.randint(ord('あ'),ord('ん'))
print(chr(k))
```
libv8のエラーでbundle installが通らずに悩まされた

## エラー内容

```
An error occurred while installing libv8 (3.16.14.13), and Bundler cannot continue.
Make sure that `gem install libv8 -v '3.16.14.13'` succeeds before bundling.
```

**参考にした記事**
https://blog.skylarking.me/2016/12/09/nokogiri_therubyracer_libv8_error/

##解決策
`therubyracerとlibv8はマシンによってバージョンが異なる`

これにつきる！！！本当にこれ！！！
多分過去に、このエラー何度かやった記憶があるので、もう悩まされないために記録に残す。
**絶対に**
【今日から携わる】コーディングチェックリスト。見た目と文章構造だけでなく、コードインデントや使うツールも共有しよう。WEBディレクターにおすすめです！

多人数でマークアップを行う案件の場合、htmlのチェックの方法が大事になってきます。
書面や口頭では個人差が出るため、ルール化いたしました。

#　「コーディングWaveチェックガイドライン」

・Wave.1 コーディング時のチェック（各コーダー）
・Wave.2 バリデーション文法チェック（各コーダー、またはメインコーダー）
・Wave.3 ブラウザ・実機検証（ディレクター&コーダー）

## Wave.1 コーディング時のチェック（各コーダー）

### 【チェック】　インデントを揃える（スペース×4）
vscodeの機能でインデントを揃える

>VisualStudioCodeに自動整形機能があった
>https://qiita.com/maron8676/items/017cd830ab0c5fb8bcac

### 【チェック】　HTMLのタグの記述ミス
タグの閉じ忘れや、入れ子の間違いが無いかチェックする

 [HTMLエラーチェッカー](https://chrome.google.com/webstore/detail/html%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%81%E3%82%A7%E3%83%83%E3%82%AB%E3%83%BC/ohdllebchmmponnofchalfkegpjojcaf?hl=ja)

### 【チェック】　正しいアウトラインがとれているか見出しの文法チェックを行う
見出しタグを使用すると自動で生成される文章の階層構造のアウトラインが正しいかチェックする

[HTML5 Outliner](https://chrome.google.com/webstore/detail/html5-outliner/afoibpobokebhgfnknfndkgemglggomo/related?hl=ja)




## Wave.2 バリデーション文法チェック（メインコーダー）

gitのmasterにmergeする前に、バリデーションの文法チェックを行う。

・画像のaltが入っているか
・使用禁止文字を使ってないか

### 【チェック】　gulpでバリデーションチェックする

> JavaScript、HTML、CSSを簡単にLintできる開発環境を作った
> https://qiita.com/muraken720/items/468b9f420ab4c900e241
> 
> 【gulp】「gulp-htmlhint」でHTMLの文法をチェックする方法をメモメモ
> http://bashalog.c-brains.jp/15/10/08-121056.php
> 
> [GitHub 奮闘記] gulp で eslint 設定とコード チェック環境の共有
> https://qiita.com/ynunokawa/items/5471ff84c83104450ecb



## Wave.3 ブラウザ・実機検証（ディレクター&コーダー）

### 【チェック】　実際に確認する
IE11
IE Edge（最新バージョン）
FireFox（最新バージョン）
Google Chrome（最新バージョン）
Mac Safari（最新バージョン）
iPhone（Safari最新バージョン）
iPad（Safari最新バージョン）
Android（Chrome最新バージョン）





## 関連

[HTML5のアウトラインを極めるための6つのルール](http://shibe97.tumblr.com/post/121266132377/html5%E3%81%AE%E3%82%A2%E3%82%A6%E3%83%88%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%92%E6%A5%B5%E3%82%81%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE6%E3%81%A4%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%AB)
[タイトルや見出しの確認など、SEOに便利なブックマークレット](https://www.pixelimage.jp/blog/2015/08/bookmarklet_seo.html)
[DOEの強み > 凄まじい納品チェック](https://www.doe.co.jp/strength/strength11.php)
Spring Bootを使ってみた

# Spring Bootで単純なWebAPIを作成

## 背景

Springの勉強をしていましたが、設定ファイルなどの設定が多く、いまいちイメージが湧かなかったので、まずは動くものを作って、少しずつ理解を深めよう思い触ってみました。また、文章を書く練習も込めて記事にしました。

以下の記事がわかりやすかったので、内容を参考にさせてもらいました。
<https://qiita.com/sugaryo/items/5695bfcc21365f429767>

## 環境

| 環境       | バージョン                      |
| :--------- | :------------------------------ |
| OS         | macOS Hige Sierra 10.13.6       |
| 開発環境   | Spring Suite Tool 3.9.4.RELEASE |
| 開発言語   | Java 1.8.0_171                  |
| SpringBoot | 2.1.0                           |


## 手順

プロジェクトはSpringのHPからダウンロードすることができます。

<https://start.spring.io/>
![スクリーンショット 2018-11-19 0.15.13.png](https://qiita-image-store.s3.amazonaws.com/0/186898/6c1665ce-e38d-4ebf-0e7e-81e32080d2bf.png)


Artifactに「example」、Dependenciesに「Web」と入力して、「Generate Project」ボタンを押下します。ダウンロードしたzipファイルを解凍して、STSにインポートすればOKです。

※STSからSpringBootの雛形を作成することも可能ですが、ここでは割愛します。

ExampleApplication.javaを右クリックして「Run As」でTomcatが実行されます。しかし、現状ではControllerが定義されていないため、エラー画面が表示されます。そこで「Hello Spring Boot!」を返すよう、ExampleApplication.javaに以下を追記します。

### 文字列を返す

```java
@RequestMapping("/test0")
private String testRetrun() {
    return "Hello! Spring Boot!";
}
```

再度、ExampleApplication.javaを右クリックして「Run As」を実行して、ブラウザから`http://localhost:8080/test0` にアクセスすると「Hello! Spring Boot!」が返ってきます。

### パスパラメータを返す

次にパスパラメータを返すように修正します。

```java
@RequestMapping("/test1/{param}")
private String testPathVariable(@PathVariable String param) {
    return "受け取ったパラメータ：" + param;
}
```

上記のように、`@RequestMapping`でマッピングするURLの{param}のパスを`@PathVariable`でアノテートしたパラメータ(上記の場合はparam)にバインドしています。`http://localhost:8080/test1/hoge`にアクセスすると「受け取ったパラメータ：hoge」が返ってきます。

### リクエストパラメータを返す

```java
@RequestMapping("/test2")
private String testRequestParam(@RequestParam() String param) {
    return "受け取ったパラメータ：" + param;
}
```

上記では`@RequestParam()`でリクエストパラメータを受け取っています。上記は`@RequestParam("param")`と同じ意味で、仮引数名と同じ名前の場合省略することができます。
`http://localhost:8080/test2?param=hoge`にアクセスすると「受け取ったパラメータ：hoge」が返ってきます。

`@RequestMapping`では、HTTPメソッドを指定することができます。以下のようにするとPOSTのみ、処理することが可能となります。

```java
@RequestMapping(value = "/test3", method = RequestMethod.POST)
```

### JSONを返す

SpringBootのRestControllerでは、いわゆるJavaBean(POJO)を返すとJSON形式に変換して返してくれます。（これ便利だと思う
まずは適当なJavaBeanクラスを作成します。

```java
public static class HogeMogeBean {
    private String hoge;
    private int moge;

    //getter,setter,ctorは省略
    //上記を書かないと裏で動いてると思われるjacksonでエラーとなるので必ず作成すること
```

受け取ったリクエストに対して、JavaBeanクラスを返すようにします。

```java
@RequestMapping(value = "/test4", method = RequestMethod.GET)
private HogeMogeBean testRequestJson() {
    return new HogeMogeBean("ほげ",123);
}
```

`http://localhost:8080/test4`へアクセスすると、以下のようなJSONが返ってきます。

````javascript:応答
{"hoge":"ほげ","moge":1234}
````

````javascript:応答ヘッダ
Content-Type: application/json;charset=UTF-8
Date: Sun, 18 Nov 2018 15:01:41 GMT
Transfer-Encoding: chunked
````

## 終わりに

単純なWebAPIは簡単に作れそうだなという印象でした。Spring Bootの良い点として、jarファイルを作成すればtomcatなどなく、実行できるためデプロイなどが不要となるところだと思います。その分、ファイルサイズが大きくなると思いますが、現状は問題ないサイズだと思います（ファイルサイズが大きくなったりライブラリの数が増えると重くなるのかも）。さくっと簡単な機能を実装するには良いと思いました。これをベースにDBアクセスやJPA、簡単な画面作成などしていきたいと思います。
Rails tutorial -第一章まとめ

Rails tutorial 第一章のまとめ

■バージョンを指定してRailsをインストールする
gem install rails –v 5.1.6

■rails newをしてファイルを作成する
rails _5.1.6_ new hello_app

■hello_appのGemfileにライブラリーを設定、インストール
cd hello_app/
Bundle install
※バンドルインストールしないとライブラリーが反映されません。
※hello_appからバンドルインストールしないとエラーでます。

■Railsサーバーを実行する
rails server

■Application controllerにhelloを追加する
def hello
Render html: “hello,world”
end
end

■routingの設定
root “application#hello”
end

■rails serverを起動して"hello,worl"が起動しているか確認
Cloud9ならRUNボタンを押してからrails server

■新しいリボジトリを作成
Git init
■リボにファイルを追加する
Git add –A
■リボの格納ファイルを確認する
Git status
■ステージングに格納されているファイルをコミットさせる
Git commit
CodeCommitでip-range.jsonの変更履歴を記録する

### やりたいこと

AWSは現在利用しているIPアドレスブロックを[JSONファイル(ip-ranges.json)](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-ip-ranges.html)にして公開していますが、このファイルの過去履歴を知りたいときがあります。
CodeCommitにはgitプロトコルを使わずにファイルを直接アップロードする[API](https://aws.amazon.com/jp/about-aws/whats-new/2018/02/aws-codecommit-supports-creating-and-editing-files-via-the-console-editor-and-sdks/)がありますので、これを使って履歴を追えるようにしましょう。

### 事前準備

履歴を管理するためのCodeCommitリポジトリ("ip-range")を適当なリージョンに用意します。後述のLambda関数と同じリージョンに作成してください。

README.mdなど適当なファイルを作って、initial commitしておいてください。

### Lambda関数の作成

ip-ranges.jsonは変更があるとSNS通知が飛ぶようになっているので(ARNは[ドキュメント](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-ip-ranges.html)参照のこと)、この通知をトリガーにして以下のLambdaスクリプト(Python3)を呼び出します。

``` python
import os, sys
import json
import urllib.request
import yaml
import boto3

repositroy_name = 'ip-range'
branch_name = 'master'

def upload_file(client, repositroy_name, branch_name, createDate, content, path):
  print("uploading: " + path)
  try:
    branch = client.get_branch(
      repositoryName=repositroy_name,
      branchName=branch_name,
    )
    response = client.put_file(
      repositoryName=repositroy_name,
      branchName=branch_name,
      fileContent=content,
      filePath=path,
      fileMode='NORMAL',
      parentCommitId=branch['branch']['commitId'],
      commitMessage=createDate,
      name='autoupload',
      email='auto@example.com',
    )
  except:
    print("failed to upload: " + path)
    import traceback
    traceback.print_exc()

def handle(event, context):
  with urllib.request.urlopen("https://ip-ranges.amazonaws.com/ip-ranges.json") as res:
    json_data = res.read().decode("utf-8")

  data = json.loads(json_data)
  yaml_data = yaml.dump(data, default_flow_style=False)
  createDate = data['createDate']

  client = boto3.client('codecommit')
  upload_file(client, repositroy_name, branch_name, createDate, json_data, 'original/ip-range.json')
  upload_file(client, repositroy_name, branch_name, createDate, yaml_data, 'ip-range.yaml')

  return("done")
```

要はダウンロードしたjsonファイルをアップロードし直しているだけですが、jsonだと差分が追いにくいので、yamlにフォーマット変換したものものあわせてアップロードしています。

参考までにこの関数を一ヶ月ほど走らせたものを下記のリポジトリに公開しています。
https://github.com/sumikawa/ip-range

### Further Working

サービス単位やリージョンごとにdataを分割することで、CloudFrontのアドレス履歴や東京リージョンの履歴を追うことも簡単にできるかと思います。
IT業界と医療は似てるなと思った話

※雑記です
※プログラミング要素どこいった

こんにちは、難病系フリーランスオカンのくわっち（ [Twitter@kuwatti_uc](https://twitter.com/kuwatti_uc) ）です。
楽天apiからデータをもぎ取ってきたらどうやってphpに反映させるのかが分からなくてつまづいています。
JSON叩く→分かる
PHP→なんとなく分かる
JSONをPHPで表示させる→分からん
うーむ。

## それはさておき
お風呂に入りながらぼんやりと考えていた話です。
**またアホがよう分からんこと言い出したな**ってくらいに見ていてほしいです。

皆さんの中で、医療ってどんなものでしょうか。
身近な存在、いざとなった時に、ライフライン…
難病系オカンの私にとっては、自分の（限りなく健康に近付くための）生命活動を維持するための存在です。
でもそれって、ちょっとだけ、エンジニアやデザイナー職、IT業界に通じるところはあるんじゃないかなあって思ったんです。


例えばエンジニアといってもさまざまで、それこそ暮らしを支えるものからそれをディレクションする人、さまざまな言語を駆使する人や単一の言語を極めた人、そのサポートに回っている人もいます。
Web制作でも、表立った部分をデザインする人、コードを書く人って分かれているよな、というのがトリ頭オカンのイメージ。

医療の世界って同じくらい奥が深くて、病院に行けば密接に関わることになる「医師」「看護師」「薬剤師」のほかに、事務、清掃、リネン担当などさまざまいます。
もうちょっと身近なところだと、レントゲン技師、助産師（男性はあまり関わりがないかも？）、栄養士、病理医とかかな。
オペ室だけでも、機械があったり道具があったり。その道具を洗浄する人もいるし、機械を動かす人もいる。
すごくマニアックなところだと、義手や義足を作る「義肢装具士」なんてお仕事もあります。

患者が骨折したあとはリハビリに通うように、何かあればシステムを改善する人もいる。
医療系のメディアもあれば、IT系のメディアもある。


## ね？ちょっとだけ似てると思いませんか？
日頃から病院にお世話になっているオカンですが、知れば知るほど「医療職」ってすごいなって。
そしてとんでもなくえげつない世界だなと思うんです。
病院で掃除のオバハンしてたときも、飛び交う医療用語についていくのが精いっぱい。勉強会に行ってもさっぱり。
でも、そういった「振り返り」「情報共有」の積み重ねがあるからこそ、今の自分が生きているんだなと本当に思うのです。
自分の病気ひとつ取っても、診察・採血・検査・入院・オペ…色々なところで色々な人が関わっています。

もちろん今これを書いている最中のwindowsも、このQiitaも、色んな人が関わってできたもの。

得意な人が得意なものをやる。知識が蓄積される。新しいものが作られる。
病気の治療と同じくらい日々新しい情報がどこかで共有されているプログラミング職やweb職、私には到底追いつきそうにないや。


とぶつぶつ独り言言いながら、堂々と仕事をサボっています。
そろそろ仕事しようかな。ではでは。
[ RNN]    文章・時系列データで、見落としがちな英語ストップワード

<b>ストップワード</b>
>
出現頻度は高いが、それ自体は独自・特徴的な意味をほとんど持たない単語（を処理の対象から除外すること）

#ストップワード処理の注意点
<b>文章中の記号をスペースに置き換えるという処理をするコードを入れたとき</b>
→　ストップワードに<b>'s','t'</b>などを入れ忘れる

###例1

```python

import re

stopwords = ["I", "am", "you", "are", "he", "is", "a"]

sentence = "he's a good student."
sentence = sentence.lower() # lower 
sentence = re.sub(re.compile(r"[!-\?()' ‘’.,;/:-@[-`{-~]"), " ", sentence) # symbol to space
sentence = sentence.split(" ") # split words with space
sentence_words = []
for word in sentence:
    if word in stopwords: # delete words with stopwords
        continue
    sentence_words.append(word)        

print('sentence_words : ', sentence_words)
```
>sentence_words :  ['s', 'good', 'student', '']

heはストップワードとして処理されたがisの短縮形のsは処理されず残っている

###例2(例1を訂正したもの、ストップワードに's'を加える)

```python

import re

stopwords = ["I", "am", "you", "are", "he", "is", "a", "s"]

sentence = "he's a good student."
sentence = sentence.lower() # lower 
sentence = re.sub(re.compile(r"[!-\?()' ‘’.,;/:-@[-`{-~]"), " ", sentence) # symbol to space
sentence = sentence.split(" ") # split words with space
sentence_words = []
for word in sentence:
    if word in stopwords: # delete words with stopwords
        continue
    sentence_words.append(word)        

print('sentence_words : ', sentence_words)
```
>sentence_words :  ['good', 'student', '']

残ってほしい単語だけ残るような処理ができている

##その他に見落としがちなストップワード
>"s", (he's, she's)
"t", 　(don't, didn't)
"don", 
"didn",
 "aren",
 "isn",  
"re", （you're, they're)
"ll",　(I'll, we'll)
"ve"　(I've, you've)
【GAS】メール取得


やっていることはGmailアプリの検索画面でメールをフィルタしている。
<img width="992" alt="スクリーンショット 2018-11-18 23.10.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/258930/063de773-dd27-7dcf-35d1-16d847b8500e.png">

以下、ソース

```javascript
function GetMail(){
 var year = 2018;
 var month = 11;
 var startPeriod = "after:" + year + "/" + month + "/01";//取得開始月
 var lastDay = new Date(year, month, 0).getDate();//月末日
 var endPeriod = "before:" + year + "/" + month "/" + lastDay;//取得終了月
 var to = "to:指定メールアドレス";
 var searchThread = to + "," + startPeriod + "," + endPeriod;//検索条件
 var threads = GmailApp.search(searchThread);

 //検索条件「toが指定メールアドレスかつ2018/11/01〜2018/11/30」のメールをログ出力
 threads.forEach(function(thread,i,array){
 Logger.log(thread.getFirstMessageSubject()); 
 });
}
```
あとは、スプレッドシートに転記するなど、タスク実行させてもいいかも。
UITableview

# UITableview
オートレイアウトでtableViewを画面いっぱいに表示

``````swift
let tableView: UITableView = UITableView()
tableView.dataSource = self

        tableView.register(InformationTopCell.self, forCellReuseIdentifier: 
        "InformationTopCell")

        // オートレイアウト時にUIViewのレイアウトが変更しないようにする
        tableView.translatesAutoresizingMaskIntoConstraints = false

        // カスタマイズビューを追加
        view.addSubview(tableView)

        // オートレイアウトでtableViewを画面いっぱいに表示
        tableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true

        //仮の値（小さいと成約がでるためある程度余裕を持つ）
        tableView.estimatedRowHeight = 1000
        tableView.rowHeight = UITableViewAutomaticDimension
``````

tableViewを使う時、多くの場合カスタムセルクラスを作ってtableViewにregisterしてからdequeueする、という決まった手順を踏むことになる
ARP をパケットキャプチャしてみる

## TL;DR

ARP の様子を Wireshark で眺めた。

## 検証概要

- 互いに相手の MAC アドレスを知らない、同一リンク上の 2 つのホスト host A, host B を調達。
- host A から host B に対して ping を打つ。
- このときに流れる ARP 要求/応答パケットを tcpdump で取得。
- これらのパケットを Wireshark で解析。
- 「ARP を利用して host A が host B の MAC アドレスを知る様子」をパケットキャプチャで見てみる。

## 検証

### ホストを調達する

192.168.1.0/24 のセグメントに 2 つのホストを立てます。プライベート IP アドレスは以下の通り。

| host A | host B |
| :---: | :---: |
| `192.168.1.125` | `192.168.1.150` |

host A は host B の MAC アドレスを学習済みのようですが、検証のためにこの学習情報を削除します。

```
[ec2-user@ip-192-168-1-125 ~]$ arp
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.1.150            ether   06:6c:c2:38:da:6a   C                     eth0
gateway                  ether   06:85:cc:0c:f0:16   C                     eth0
169.254.169.254          ether   06:85:cc:0c:f0:16   C                     eth0
[ec2-user@ip-192-168-1-125 ~]$ sudo arp -d 192.168.1.150
[ec2-user@ip-192-168-1-125 ~]$ arp
Address                  HWtype  HWaddress           Flags Mask            Iface
gateway                  ether   06:85:cc:0c:f0:16   C                     eth0
169.254.169.254          ether   06:85:cc:0c:f0:16   C                     eth0
[ec2-user@ip-192-168-1-125 ~]$ 
```

今回の検証では ping 実行時に流れる ARP パケットを解析しようと思うので、icmp ポートの穴開けも行います。

### tcpdump を仕込む

試しにオプション指定なしで tcpdump を実行したところ、尋常じゃない量のパケットが流れてきて辛かったので、適当にフィルタをつけます。

Wireshark で解析したいので、ファイル出力オプションもつけて実行します。

```
[ec2-user@ip-192-168-1-125 ~]$ sudo tcpdump icmp or arp net 192.168.1.0 mask 255.255.255.0 -s 0 -w /tmp/pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
```

### パケットを流して取得する

別のターミナルにて、 host A から host B に対して ping を打ちます。

```
[ec2-user@ip-192-168-1-125 ~]$ ping 192.168.1.150
PING 192.168.1.150 (192.168.1.150) 56(84) bytes of data.
64 bytes from 192.168.1.150: icmp_seq=1 ttl=255 time=0.656 ms
64 bytes from 192.168.1.150: icmp_seq=2 ttl=255 time=0.516 ms
64 bytes from 192.168.1.150: icmp_seq=3 ttl=255 time=0.457 ms
64 bytes from 192.168.1.150: icmp_seq=4 ttl=255 time=0.446 ms
64 bytes from 192.168.1.150: icmp_seq=5 ttl=255 time=0.475 ms
64 bytes from 192.168.1.150: icmp_seq=6 ttl=255 time=0.473 ms
^C
--- 192.168.1.150 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5121ms
rtt min/avg/max/mdev = 0.446/0.503/0.656/0.077 ms
[ec2-user@ip-192-168-1-125 ~]$ 
```

### Wireshark で解析する

取得したパケットファイルをローカルに持ち帰り、 Wireshark で開きます。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/288168/90c28e96-6197-1aee-9eda-6b02df9af5f8.png)


パッと見ただけで、以下の流れがわかります。

1. host A がブロードキャストで host B の MAC アドレスを問い合わせる。
1. host B が host A に対して、自身の MAC アドレスを応答する。
1. 以降、ICMP 問い合わせ/回答を繰り返す。

## 参考文献

- みやた ひろし (2017) 『パケットキャプチャの教科書』 SBクリエイティブ
The Go Blog のトピックピックアップ（16 October 2018）

# お題
「[The Go Blog](https://blog.golang.org/)」の気になったトピックをピックアップして翻訳・消化する。
今回は、「[Announcing App Engine’s New Go 1.11 Runtime](https://blog.golang.org/appengine-go111)」。
 
# 本題
「[App Engine](https://cloud.google.com/appengine/?hl=ja)」は２０１１年からGoのサポートを開始した。
そのサポートバージョンは、最近まで 1.9 だったところ、ベータ版ではあるが、1.11 をサポートするようになった。
https://cloud.google.com/blog/products/application-development/go-1-11-is-now-available-on-app-engine

1.11 サポート以降、App Engine でGoを扱う際、アプリの構造や使うパッケージ、HTTPクライアントに制限がなくなった。
また、以前の[Vendoring方式](https://golang.org/cmd/go/#hdr-Vendor_Directories)だけでなく（1.12で正式な適用を目指す実験的な）[Modules方式](https://golang.org/doc/go1.11#modules)も使える。

1.11バージョンでのアプリケーションのサンプルは下記。

```go
// This server can run on App Engine.
package main

import (
    "fmt"
    "log"
    "net/http"
    "os"
)

func main() {
    port := os.Getenv("PORT")
    if port == "" {
        port = "8080"
    }
    http.HandleFunc("/", hello)

    log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
}

func hello(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello, 世界"))
}
```

以前のバージョンでApp Engineアプリケーションを作った経験があれば、`appengine.Main()`の呼び出しがないことに気づくだろう。
1.11バージョンからは、googleのSDKに依存しなくとも、アプリ起動時のロジックが書ける。

アプリが完成したら、`app.yaml`に以下のように書くだけでApp Engineにデプロイ可能なアプリとなる。

```yaml
runtime: go111
```

# 所感
Goのバージョン云々は（Goに後方互換性があるため）特に意識せずとも動かせるように思う。
`appengine.Main()`の呼び出しがなくなったことは、Javaで言うフレームワーク依存からPOJOへの流れに通ずるものがあるのかな。
これまでGoを使ってきた人からすると、Vendoringを使う分には感触は変わらなそうだけど、Modulesを採用するなら、別途それ用の学習ありきでないとプロダクションレベルでの採用は怖い。
もっとも、App EngineにおけるGo1.11自体がベータ版である以上は迂闊にプロダクションで使うのはマズイ気はする。
G Suiteに登録されているメーリングリストと、中に入っているユーザーの一覧を取得する

#背景
全容はまた書きたいのですが、色々あってメーリングリストに含まれているユーザーを全量把握する必要が出てきた。
ネット検索したら出てくるけど、何故かうまく行かないので結局自分で書きました。

#対応
スプレッドシートのスクリプトエディタに書いてください。
あとドメイン名は会社で使っているドメイン名を入れてください。

```js:getGroupUser
//onOpenで書く事でスプレッドシート読み込み時に実行され、ツールバーへ「管理」ー「グループアドレス一覧取得」とメニューが表示されるようになる。
function onOpen() {
  SpreadsheetApp.getUi()
  .createMenu("管理")
  .addItem("グループアドレス一覧取得", "GetGroupUser")
  .addToUi();
}

//以下実際に実行される処理
function GetGroupUser()
{
  // アクティブなシート取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('ここにスプレッドシートのシート名を入力');
   
  // グループ一覧の取得
  var groups = AdminDirectory.Groups.list({
    domain: 'ここはドメイン名を入力してください'
  });
  
  if(groups) {
    var rows = [];
    var rowcount = 0;
   
    // ヘッダ行
    rows.push(["GroupAddress", "Description", "Name", "DirectMembersCount", "UserAddress"]);
    
    // データ行
    for(var i = 0; i < groups.groups.length; i++){           
      // グループに所属するメンバーの取得
      var cols = [];
      var members = AdminDirectory.Members.list(groups.groups[i].email).members    
      if (members) {
        var memlen = members.length;
      }else{
        var memlen = 1;
      }                   

      //メーリングリストにメンバーが含まれている場合の処理
      for (var j = 0; j < memlen; j++){
        cols.push(groups.groups[i].email);
        cols.push(groups.groups[i].description);
        cols.push(groups.groups[i].name);
        cols.push(groups.groups[i].directMembersCount);

        //メンバーが含まれていなかった場合は
        if(members){
          cols.push(members[j].email);
        }else{
          cols.push("");          
        }
        // 行追加
        rows.push(cols);
        var cols = [];         
        // 最終的な行数計算
        rowcount = rowcount + 1;
      }
    }   
    // 書き込み
    sheet.getRange(1, 1, rowcount +1 , 5).setValues(rows);
  } 
}

```
こんな感じでメニューとして表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/87715/0e519bac-1eb9-0d5e-05a7-fef523ad6bf8.png)
cordova-plugin-fcmインストール後のcordova run androidでエラー

# はじめに

OS: Windows 7
cordova-android: 7.1.2
cordova-plugin-fcm: 2.1.2

cordovaを使ったハイブリッドアプリでプッシュ通知を実装しようとしてcordova-plugin-fcmをインストール（`cordova plugin add cordova-plugin-fcm`）したところ、インストールはうまくいったのですが、実行（`cordova run android`）時に以下のエラーが出ました。

```
$ cordova run android
Android Studio project detected
Invalid data, chunk must be a string or buffer, not object
```

原因と解決策はググるとすぐ出ましたが英語しかなかったので一応日本語情報としてメモしておきます。
参考：https://github.com/fechanique/cordova-plugin-fcm/issues/481

# 原因
cordova-androidのバージョンが７以上だと発生するみたいです。


# 解決策①
cordova-androidのバージョンを落とす

```
cordova platform rm android
cordova platform add android@6.4.0
```

# 解決策②
cordova-plugin-fcmプラグインのソースを修正する。

**対象ソース**：plugins/cordova-plugin-fcm/scripts/fcm_config_files_process.js
**修正①**
　前：`var strings = fs.readFileSync("platforms/android/res/values/strings.xml").toString();`
　後：`var strings = fs.readFileSync("platforms/android/app/src/main/res/values/strings.xml").toString();`
**修正②**
　前：`fs.writeFileSync("platforms/android/res/values/strings.xml", strings);`
　後：`fs.writeFileSync("platforms/android/app/src/main/res/values/strings.xml", strings);`

次に`google-services.json`を以下の２つのフォルダに設置
1. platforms/android/google-services.json
2. platforms/android/app/google-services.json

# おわりに
解決策①も②もどちらもうまくいきましたが、ソース修正は影響範囲が不明でちょっと怖いので自分は解決策①にしました。
まあただのパスの修正なので解決策①でも問題ないと思います。

それではよきエンジニアライフを～
文章・時系列データ分類を　"LSTM" と ”CNN”　で比較

<b>RNNだけでなく、CNN(Conv1D)でも文章・時系列データを学習できる</b>
・ニューヨークタイムズ紙の記事分類をLSTMとCNNでそれぞれ学習して比較
・比較のための条件設定として、とりあえずパラメーター数を同じぐらいにしておいた

NewYorkTimes紙の記事分類やってみた
https://qiita.com/Phoeboooo/items/dbc8bb5308c9ec5af6a0


##データ
>
politics :  1000
science :  1000
sports :  1000
total :  3000

#LSTM
```python

model = Sequential()
model.add(Embedding(4002,64,input_length=20))
model.add(Dropout(0.3))
model.add(LSTM(64, dropout=0.3, recurrent_dropout=0.3))
model.add(Dense(3))
model.add(Activation("softmax"))

model.compile(loss="categorical_crossentropy", optimizer="adam",
              metrics=["accuracy"])

model.summary()
```
>
Total params: 289,347
Trainable params: 289,347
Non-trainable params: 0

##結果
```python

Train on 2400 samples, validate on 600 samples
Epoch 1/3
2400/2400 [==============================] - 7s 3ms/step - loss: 0.9500 - acc: 0.5138 - val_loss: 0.6780 - val_acc: 0.7317
Epoch 2/3
2400/2400 [==============================] - 3s 1ms/step - loss: 0.5800 - acc: 0.7554 - val_loss: 0.4645 - val_acc: 0.8533
Epoch 3/3
2400/2400 [==============================] - 3s 1ms/step - loss: 0.3229 - acc: 0.8875 - val_loss: 0.3778 - val_acc: 0.8733
```
<b>Test score: 0.378, accuracy: 0.873</b>


#CNN
```python



model = Sequential()
model.add(layers.Embedding(4002,64,input_length=20))
model.add(layers.Conv1D(32, 2, activation='relu'))
model.add(layers.MaxPooling1D(5))
model.add(layers.Conv1D(32, 2, activation='relu'))
model.add(layers.GlobalMaxPooling1D())
model.add(Dense(3))
model.add(Activation("softmax"))

model.compile(loss="categorical_crossentropy", optimizer="adam",
              metrics=["accuracy"])

model.summary()

```
>
Total params: 262,435
Trainable params: 262,435
Non-trainable params: 0


##結果
```python

Epoch 1/10
2400/2400 [==============================] - ETA: 0s - loss: 1.0442 - acc: 0.469 - 1s 585us/step - loss: 1.0417 - acc: 0.4704 - val_loss: 0.8294 - val_acc: 0.6350
Epoch 2/10
2400/2400 [==============================] - 1s 331us/step - loss: 0.6708 - acc: 0.7533 - val_loss: 0.5984 - val_acc: 0.7617
Epoch 3/10
2400/2400 [==============================] - 1s 326us/step - loss: 0.3608 - acc: 0.8721 - val_loss: 0.5604 - val_acc: 0.7667
.
.
.
Epoch 8/10
2400/2400 [==============================] - 1s 357us/step - loss: 0.1527 - acc: 0.9262 - val_loss: 0.7415 - val_acc: 0.7583
Epoch 9/10
2400/2400 [==============================] - 1s 364us/step - loss: 0.1458 - acc: 0.9312 - val_loss: 0.7581 - val_acc: 0.7567
Epoch 10/10
2400/2400 [==============================] - 1s 357us/step - loss: 0.1420 - acc: 0.9292 - val_loss: 0.7744 - val_acc: 0.7600
```

<b>Test score: 0.774, accuracy: 0.760</b>
##比較結果
LSTM : 87.3%　　
CNN : 76.0%

基本通りに時系列データではRNNを使った方が結果が良かった