OmniAICreator/Qiita-1.07M huggingface dataset:
5分で作るclaspを使ったGoogle Apps Scriptの開発環境

❄️Google Apps ScriptはGoogleが提供するスクリプトエディタでコーディングできるが、好きなエディタを使えない、Gitで管理できない等の問題がある。そこで便利なのが、ローカルで開発できるようにしてくれるGoogle製のツール「[clasp]」だ。本稿ではこれを使った5分程度でできるGoogle Apps Scriptの開発環境構築法を説明する。

![](https://user-images.githubusercontent.com/744973/35164939-43fd32ae-fd01-11e7-8916-acd70fff3383.gif)

[clasp]: https://github.com/google/clasp

本稿ではできるだけ環境構築の手間を省くため、[gas-clasp-startar](https://github.com/howdy39/gas-clasp-starter)を使用する。そのため本稿で構築する開発環境は次の技術基盤を採用したものになる。

* TypeScript
* Webpack
* TSLint, Jest, Prettier

## claspをインストールする

`yarn`コマンドでインストールする。

```
yarn global add @google/clasp
```

## claspでログインする

下準備として[Google Apps Script APIの設定画面](https://script.google.com/home/usersettings)を開き「オフ」になっているところを「オン」にしておく。

![](https://cdn.suin.io/2018/04/20/1.png)



次のコマンドを実行してログインする。

```
clasp login
```

## claspでプロジェクトを作成する

```
mkdir my-first-google-app-script
cd my-first-google-app-script
clasp create my-first-google-app-script
```

## プロジェクト雛形「gas-clasp-startar」を使う

ゼロからGAS用の技術基盤を整えると手間であるため、@howdy39氏が公開しているGoogle Apps Script開発用のテンプレートプロジェクト[gas-clasp-starter](https://github.com/howdy39/gas-clasp-starter)を使う[^qiita]。

[^qiita]: gas-clasp-starterの詳細は[Google Apps Script をローカル環境で快適に開発するためのテンプレートを作りました - Qiita](https://qiita.com/howdy39/items/0e799a9bfc1d3bccf6e5#%E9%96%8B%E7%99%BA%E3%81%AE%E6%B5%81%E3%82%8C)を参照。



先程`clasp create`で作られた`.clasp.json`を開き、`scriptId`をメモした上で、一旦すべてのファイルを消す。

```
❯ cat .clasp.json
{"scriptId":"1pyPMHvGPLh7PcCphJxQ_WuX5Tf6istejbdU5XxuntoBpCDvXtGTB6GrP"}
❯ rm .clasp.json appsscript.json
```

空っぽになったディレクトリに[gas-clasp-starter]を`git clone`する:

```
git clone --depth=1 https://github.com/howdy39/gas-clasp-starter.git .
```

依存するnodeモジュールをインストールする:

```
yarn
```

.clasp.jsonを開き、メモしておいた`scriptId`を転記する:

```json:.clasp.json
{
  "scriptId": "1pyPMHvGPLh7PcCphJxQ_WuX5Tf6istejbdU5XxuntoBpCDvXtGTB6GrP",
  "rootDir": "dist"
}
```

これでgas-clasp-startarのセットアップが完了となる。

## Google Apps Scriptを実行する

GASの実行はGoogleのサーバでないと実行できない。そのためローカルで書いたコードはGoogleに`push`して実行する必要がある。

まず、`yarn build`でTypeScriptで書かれたGASを`.gs`ファイルにビルドする:

```
yarn build
```

次に、`clasp push`でGoogle Apps Scriptにビルドされたスクリプトを送る:

```
clasp push
```

最後に、`clasp open`を実行するとブラウザでスクリプトエディタが開くので、「実行」ボタンを押してスクリプトを実行する。「gas-clasp-startar」がデフォルトで生成するGASは、スプレッドシートを新規作成するものなので、実行の結果はスプレッドシートを開いてみると分かる。

```
clasp open
```

![](https://cdn.suin.io/2018/04/20/2.png)

[Google SpreadSheet](https://docs.google.com/spreadsheets/u/0/?tgif=d)を開くと、新しいスプレッドシートが生成されているはずだ。

![](https://cdn.suin.io/2018/04/20/3.png)
PHP - 年齢の範囲検索を生年月日から行う

Carbonを使います。

\$age['from']歳から$age['to']歳までを検索するとき
 
```php:test.php
    if (!empty($age)){
            if(!empty($age['from'])){
                $latestBirthday = Carbon::now()->subYear($age['from'])->format('Y-m-d');
                $user->where('birthday', '<=', $latestBirthday);
            }
            if(!empty($age['to'])){
                $earliestBirthday = Carbon::now()->subYear($age['to'] + 1)->addDay()->format('Y-m-d');
                $user->where('birthday', '>=', $earliestBirthday);
            }
        }
```

考え方としては

- \$age['from']歳の人の誕生日で一番新しい日より古い誕生日の人
- \$age['to']歳の人の誕生日で一番古いより新しい誕生日の人

を検索してるだけです。
Progateで勉強したプログラミング未経験者によるレビュー

#はじめに
１ヶ月だけProgateに課金してみたので、その記録です。
~~記事作るのがこんなに大変だとは知らなかった~~

#想定している読者
- プログラミングに入門しようとしているが、どこから始めたらいいのかわからない人
- Progateに興味がある（やったことがある）が、有料版にする踏ん切りがつかない人

#自分が修了した講習のレビュー
![Progate_profile.PNG](https://qiita-image-store.s3.amazonaws.com/0/244873/5ab631b7-8e5a-02c2-9116-053d9a0d898f.png)
## 1. Ruby
今メインで使っている言語。プログラミング言語の中では英語を書いている感覚に近く、最初にやって正解だった。
オブジェクト指向についての記述はJavaのほうがわかりやすい。
## 2. Ruby on rails
Rubyを元にしたWebフレームワーク
Progateは必要なHTML/CSSコードをコピーさせてくれるので、HTMLの知識がなくても出来なくはないが、あるに越したことはない。（HTML→CSS→（JQuery)→Ruby on railsの順でやったほうがいい）
投稿フォーム付きのwebpageを作れるようになるところまでサポートされているが、知識を纏める場を自分で設ける必要がある。

## 3. Java
## 4. Python
これから様々な場面で必須になるとは思うのだが、ProgateでやるならRubyのほうがフレームワークまで講座があって（あまりPythonと変わらないので）いいと思う。django講座が追加されたらまた評価は変わる。
## 5. Command
Gitやるのにも黒い画面に慣れておくのは重要。
## 6. Git
Gitの知識は必須だけど、本講座だけでは自分のコードを管理できるところまで行かないと思う（知識は十分なのだが、応用させづらい）
自分はSourceTreeでGitを管理しているのだが、何かエラーを踏んだときにターミナルで解決できるようになったのが本講座をうけて良かったと思う点。
## 7. Sass
HTMLの知識少ないのにSassやってもあまり良さが分からなかった。
## 8. JavaScript
バックエンドっぽい内容しか扱っていないので、JavaやRubyの講座を受けたらやらなくてもいいかと。。。JQueryまでやってようやく役立つ感じ。（多分）
#Progate全体について
## 良いところ

## 悪いところ
- 環境開発についての解説が一切無いので、例えばRuby on railsについて学んでも、その後どのようにすればそれを使えるのかわからない。(環境開発は[ドットインストール](https://dotinstall.com/)など他の入門サイトで補う必要がある)
- 入門の次に何をすればいいのかがわからない。（これは全ての入門サイトに言えることだと思う。Qiitaに頼ろう）

#個人的な反省
せめてフロントエンドかバックエンドかを考えてから言語を絞って勉強したほうが断然良かった。同じ勉強時間で作品を作れるところまで行けたと思う。
もう1ヶ月追課金してHTMLやるかもしれぬ。
Docker の Alpine Linux でタイムゾーンを JST にする

Alpine Linux でイメージを作成する際に、タイムゾーンを設定する際に悩んだので備忘録として。

タイムゾーンを `JST` にするために、ググって出てきた以下を `Dockerfile` に記述した。

```dockerfile
FROM alpine

RUN apk --no-cache add tzdata && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    apk del tzdata
```

このイメージを環境変数 `TZ=Asia/Tokyo` を指定しつつ起動すると、タイムゾーンが `GMT` になってしまった:thinking:

```shell
$ docker run --rm -e TZ=Asia/Tokyo alpine-tz date
Fri Apr 20 02:10:04 GMT 2018
```

調べてみると、環境変数 `TZ` が定義されていると `/etc/localtime` を参照しないらしい。
[tzset(3)](http://man7.org/linux/man-pages/man3/tzset.3.html)
[date(1)](http://www.manpages.info/linux/date.1.html)

試しに `TZ` を指定しないで起動すると `JST` になった。

```shell
$ docker run --rm alpine-tz date
Fri Apr 20 11:12:26 JST 2018
```

よく調べないで使うとハマりますね…。

ちなみに、Java などアプリケーションによっては `TZ` を指定しないとタイムゾーンが認識されないケースもある。
この場合は `tzdata` を削除しないでおくか、サイズを少しでも削りたい場合は以下のようにファイルをコピーする・・・のは、いまいち？

```dockerfile
RUN apk --no-cache add tzdata && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    apk del tzdata && \
    mkdir -p /usr/share/zoneinfo/Asia && \
    cp /etc/localtime /usr/share/zoneinfo/Asia/Tokyo
```
sessionStorage.getItem(key)で取得した値につくダブルクオートを剥ぎ取る

# ダブルクオート邪魔ですよね

 ```javascript
sessionStorage.getItem(key) // ← ""value""
```

これは、以下で改善できます。

```javascript
JSON.parse(sessionStorage.getItem(key)) // ← "value"
```

`JSON.parse`の働きが以下だから解決できるわけですね。

```javascript
JSON.parse('{}');              // {}
JSON.parse('true');            // true
JSON.parse('"foo"');           // "foo"
JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
JSON.parse('null');            // null
```

# そもそもなぜダブルクオートが付いてしまったのか？
共通化されたメソッドでセッションストレージに保存を行なっていたのですが、
保存するデータは何かわからないため必ず`JSON.stringify()`を通すようになっていました。

```javascript

const kuma = JSON.stringify('kuma');
sessionStorage.setItem('hoge', kuma);

sessionStorage.getItem('hoge') // ← ""kuma""
```

以上です:point_up:
MySQLでGROUP BYした際の、「集約結果毎」の件数と「まとめた結果」の件数の取得方法

しばらくハマったのでメモ

ページネーションを付ける時など、GROUP BYで「まとめた結果」の件数を取得したい時に、count(*)だと集約したそれぞれの件数が取れてしまい上手くいきません。

**集約結果毎の件数**と、**まとめた時の全体の件数**を知りたい場合の取得方法です。

# 結論

- **count(*)** -> 集約結果毎の件数を取得

```ssh:MySQL
mysql> select count(*) from table_name group by hoge;
```

- **count(distinct hoge)** -> まとめた結果の件数を取得

```ssh:MySQL
mysql> select count(distinct hoge) from table_name;
```


# ちょっとだけ説明

```
# データ
mysql> select * from table_name;
+---+------+
| id| hoge |
+---+------+
| 1 | boo  |
| 2 | boo  |
| 3 | boo  |
| 4 | foo  |
| 5 | foo  |
| 6 | foo  |
| 7 | foo  |
+---+------+
```

```
# hoge で group by する
mysql> select * from table_name group by hoge;
+---+------+
| id| hoge |
+---+------+
| 1 | boo  |
| 4 | foo  |
+---+------+
```

### ほしい結果
- 集約結果毎の件数（boo=>3, foo=>4）
- まとめた結果の件数（2）

#### 集約結果毎の件数を取得

```
mysql> select *, count(*) from table_name group by hoge;
+---+------+----------+
| id| hoge | count(*) |
+---+------+----------+
| 1 | boo  |        3 |
| 4 | foo  |        4 |
+---+------+----------+
```
count(*)を付けるだけでOK。

#### まとめた結果の件数を取得

```
mysql> select count(distinct hoge) from table_name;
+----------------------+
| count(distinct hoge) |
+----------------------+
|                    2 |
+----------------------+
```

重複を除いた値が何種類あるかを取り出せばいいので、 `DISTINCT` を使います。
group by を付けるとほしい結果が出ないので、別のsqlを書く必要がある。


# 参考

>MySQLでgroup byした結果をカウントする | WP Advisor
>https://hacknote.jp/archives/10278/

そのまんまです。
Rails 6 以降は order/pluck の引数に SQL 文字列を渡すことはできない (容易に対策可能)

# 問題点

あるプロジェクトの Rails のバージョンを 5.1 から 5.2 に上げると次のコードで警告が発生するようになった。

```rb
Item.order('COALESCE(order_no, 0)')
```

> DEPRECATION WARNING: Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s): "COALESCE(order_no, 0)". Non-attribute arguments will be disallowed in Rails 6.0. This method should not be called with user-provided values, such as request parameters or model attributes. Known-safe values can be passed by wrapping them in Arel.sql().

Rails 5.2 では警告が表示されるだが、Rails 6 ではエラーになる (例外が発生する) 模様。

# 対策

前述の警告の通り、SQL 文字列を `Arel.sql()` でラップするとよい。

```rb
Item.order(Arel.sql('COALESCE(order_no, 0)'))
```

# 非推奨になった理由

SQL インジェクションを防ぐため。

```rb
# 何かしらのコントローラ
Item.order(params[:order]) # 外部から悪意のあるパラメータが渡される可能性がある。
```

詳しくは次の issue を参照のこと。

[rails/rails » Issue #27947 » Disallow raw SQL in dangerous AR methods](https://github.com/rails/rails/pull/27947)
Flutterのネイティブ側からマテリアル・アイコンを使う

Flutter のアプリで使う画像などのリソースファイルがあります。

マテリアル・アイコンを有効にしている場合、これはフォントとしてFlutterアプリのアセットに含まれており、Flutterから使えるのは当然ですが、プラグインなどの Android / iOS 側のコードからも使うことができます。

## Flutter

Flutterでマテリアル・フォントを使う場合は `pubspec.yaml` で以下のように設定します。おそらくデフォルトで有効になっていると思います。

```yaml
flutter:
  uses-material-design: true
```

## Android

`AssetManager` を経由して、Flutter側のアセットへアクセスできます。

```java
Typeface typeface = Typeface.createFromAsset(
        getAssets(), "flutter_assets/fonts/MaterialIcons-Regular.ttf");

TextView yourText = (TextView) findViewById(R.id.your_material_icon);
yourText.text = "\uE15E";
yourText.setTypeface(typeface);
```

## iOS

iOSでは、Xcodeのプロジェクトで、以下の位置にアセットファイルが追加されています。

```
- Runner
  - Flutter
    - flutter_assets
      - fonts
        - MaterialIcons-Regular.ttf
```

続いて、プロジェクトの設定 > info > Fonts provided by application に、このフォントを設定します。

あとは、UIFontを以下のように作り、UILabelなどに設定すればOKです。

```swift
let icon: UILabel = UILabel()
icon.text = String(UnicodeScalar(0xe3c9))
icon.font = UIFont(name: "Material Icons", size: size)
```


## まとめ

Flutterのアセットは `flutter_assets` の下にすべて配置されています。

もちろん、マテリアル・フォント以外の、自分たちで追加したアセットも使うことができます。
KotlinクラスをMockito2でMockするには

Kotlinのクラスはデフォルトでfinalになっています。
そのクラスをMockする時に苦労した点を纏めておきます。

# 通常通りMockしようとした場合
このようなメッセージが表示されます。

```lang:Terminal
org.mockito.exceptions.base.MockitoException: 
Cannot mock/spy class com.furusin.www.kotlinTest.HogeClass
Mockito cannot mock/spy because :
 - final class
```

これは、上述したように `Kotlinのクラスはデフォルトでfinalになっている` ために表示されるメッセージです。

ちなみに使っているMockitoのバージョンは、執筆当時2.13.0でした。



# 解決方法その１
[KotlinでMockito2を使ってfinal classをモック化するには](http://kwmt27.net/2017/10/30/mock-kotlin-class-with-mockito2/)に記載があるように、下記ファイルを用意します。

まずはディレクトリを作成します
```
test/resources/mockito-extensions
```

そこに `org.mockito.plugins.MockMaker` というファイルを用意し、下記を記入します。

```
mock-maker-inline
```

これだけでテストを走らせると通るそうです。

これでもダメならこちらも試してみましょう

```
mockito.mock-maker-class=mock-maker-inline
```

# 解決方法その２
私の場合は解決方法１では解決しなかったので、色々と調べた結果、こちらの方法で解決しました。
[Using Mockito with Kotlin]()を参考にしました。

Kotlinで作成したクラスに `open` パラメータを付与します。
`open` を付与することで、対象のクラスを継承できるようになります。

変更前

```lang:HogeClass.kt
class HogeClass (val context: Context) {
 //...
}

```

変更後

```lang:HogeClass.kt
open class HogeClass (val context: Context) {
 //...
}
```

# まとめ
なぜ解決方法１で解決しなかったかは不明ですが、解決方法２で解決できました！
役立つ記事まとめ

個人的に気になった記事をまとめておきたかったが、せっかくなので共有します。

その都度記事リンクを追加していきます。

### 開発手法
- [ソフト開発に「かんばん方式」を導入すべき理由とスクラムとの違い](https://www.webprofessional.jp/how-why-to-use-the-kanban-methodology-for-software-development/)
チームが最高の効率で働いていれば、時間管理は効率を阻害するだけで不要というポイントが興味深かった（というかこれはいつも思っていた）。


### Github Projectの使い方
- [About task lists](https://help.github.com/articles/about-task-lists/)
- [Adding issues and pull requests to a project board](https://help.github.com/articles/adding-issues-and-pull-requests-to-a-project-board/)

### デザイン
- [Webデザイン制作の上で参考になるクリエイティブの高いWebデザインのリンク集](http://www.webdesignclip.com/category/eat-drink/)

### Django
- [Classy Class-Based Views](http://ccbv.co.uk/)
- [simple is better than complex](https://simpleisbetterthancomplex.com)

### その他
- [Best Practices for Naming String Identifiers](https://www.transifex.com/blog/2015/naming-string-identifiers-best-practice/)
ラジオ配信(Audio Player)のやり方


streampack の田中です。
## 概要

弊社のサービスでは、オープンソースの　VideoJS を使っております。動画配信での実績はあったのですが、今回はラジオ配信をやるための方法になります。HTML5のプレイヤーだけでは、audioファイルはブラウザによってはサポートしていないため、様々なOSやブラウザでサポートしているAppleが提供しているHLS(HTTP Live Streaming)に変換し、VideoJS Playerを使ってやります。

その際の手順です。

## 変換ファイルの準備

今回は Amazon Elastic Transcoder を使います。FFmpeg や Bento4 を使っても可能です。

ローカルでやる際はこちら:
https://qiita.com/khagi/items/6e8c8d10c77bee53487b

基本的には、Audio HLSのプリセットを決め、ジョブを投げれば、s3上に変換ファイルが出力されます。
すでに、Audio HLSプリセットはあるため、デフォルトの System preset: HLS Audio - 160k を使います。

### デフォルトのプリセット

<img width="1117" alt="Audio_preset.png" src="https://qiita-image-store.s3.amazonaws.com/0/232803/b0bc6e21-3e87-af46-b0a2-0f6882ec9b7f.png">

### ジョブの作成

<img width="992" alt="Audio_Job.png" src="https://qiita-image-store.s3.amazonaws.com/0/232803/f5225918-c536-c620-4590-bab02df5ab3f.png">

Pipeline: 事前に準備が必要です。s3 bucket の入出力バケットなどを登録します。
Input Key: s3 に置いた Audioファイルを指定します。
Output key: は指定した Output key Prefix（hls/) に playlist.m3u8 という名前で出力されます。

## プレイヤーの準備

下記を準備し、poster と source src(audioファイルのパス) を書き換えます。

``` html:player.html
<head>
    <title>Audio Player</title>
    <meta charset="UTF-8">
    <link href="//cdnjs.cloudflare.com/ajax/libs/video.js/5.19.1/video-js.css" rel="stylesheet">
    <script src="//cdnjs.cloudflare.com/ajax/libs/video.js/5.19.1/video.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/videojs-contrib-hls/5.5.0/videojs-contrib-hls.js"></script>
</head>

<body>
    <h1>Audio</h1>
    <audio id="content_video" class="video-js vjs-default-skin" width="640" height="360" preload="none" poster="//s3 domain/poster.jpg" playsinline controls>
        <source src="//s3 domain/hls/xxx.m3u8" type="application/x-mpegURL">
    </audio>
    <script>
      var player = videojs('content_video');
    </script>
</body>
```

posterにサムネイル画像をセットすることによって、プレイヤー上にポスターを表示したまま再生が可能です。

## 結論

HLSファイルとVideoJSを使えば、比較的に容易にラジオ配信が可能となります。
ぜひ、お試しあれ。
拡張メソッド作り方　メモ


参考URLを見ながら作ってみた

参考URL：http://www.atmarkit.co.jp/ait/articles/1711/22/news030.html

共通データに途中で動的に何かを足すときに役立つかも。

戻り値でデータクラスを返すの要らないかもですね。


## ■呼び出し元クラス（ボタンクリックされると呼ばれる）
```
using UnityEngine;

public class ExtensionTest : MonoBehaviour {

    public void OnExtensionTest()
    {
        var test = new Test()
        {
            a = 1,
            b = "abc"
        };

        test.AddValue();

        Debug.Log("a = " + test.a.ToString());
        Debug.Log("b = " + test.b);
        Debug.Log("c = " + test.c);
        Debug.Log("d = " + test.d);
    }
}

```

## ■データクラス

```

public class Test {

    public int a;

    public string b;

    public bool c = false;

    public float d = 0.0f;
}

```

## ■拡張クラス
```
public static class TestExtension  {

    public static void AddValue(this Test test)
    {
        test.c = true;
        test.d = 123.4f;
    }
}
```
Ropstenデプロイ時に躓いたことメモ

# 躓いたこと1
## 遭遇した問題
デプロイ時にガスが足りないよエラーが出ていた

```
$ truffle migrate --network ropsten
Using network 'ropsten'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
Error encountered, bailing. Network state unknown. Review successful transactions manually.
insufficient funds for gas * price + value
```

## 原因
ガスを保持しているアドレスに参照がちゃんと行っていなかったため、デプロイに必要なガスを払えなかった

## 解決策
自分の場合はmetamaskの4つ目のアドレスにropstenのethを保持していたのでそれを指定するか、デフォルトだと1つ目のアドレスのethを使ってデプロイするので1つ目のアドレスにgasを払える量のethを入れる

## 学んだこと
- `truffle-hdwallet-provider`の３番目の引数にindexを指定すればMetaMaskの２番目のアドレスを使うみたいなことができる
```
new HDWalletProvider(mnemonic, "https://ropsten.infura.io/" + accessToken, 3);
```
-  metamaskのネットワークをropstenに切り替えて、アドレスからBUY>ROPSTSN TEST FAUCETを押すと1ethを何回でもリクエストできるページに飛べる

# 躓いたこと2
## 遭遇した問題
ropstenネットにデプロイトランザクションは発行されたが終わる気配がなかった

## 原因
gasPriceが100weiだったので少なすぎた

```
ropsten: {
            provider: function() {
                return new HDWalletProvider(mnemonic, "https://ropsten.infura.io/" + accessToken);
            },
            network_id: 3,
            gas: 4700000,
            gasPrice: 100
        }
```

## 解決策
gasPriceの定義を消してデフォルト(100Gwei)にし、デプロイを行うと一瞬でデプロイがすんだ
https://ropsten.etherscan.io/tx/0x488889e5315f24e8efd5c6072dd0482ba0b3f9c5f6301c248cc83085417b1e60

### 学んだこと
- truffleのgas priceはwei単位
- トランザクションは止められないのでgas増やしてもう一度デプロイを実行する
- gasPriceが100Gweiをメインで行うともったいない。[ethgasstation](https://ethgasstation.info/index.php)を見てどれくらい支払うか学ぶ
IntelliJ(PhpStrom)で横に長い配列を縦並び(1行1要素)に整形する設定

ver.

```
IntelliJ IDEA ULTIMATE 2017.3
```

PHPの横に長ーい配列記述を縦並び(1行1要素)に整形する設定。

```
Prefernce > Editor > Code Style > PHP > Wrapping and Braces
Array initializer > 右どなりの `Do not wrap` をクリックしプルダウンから `Wrap always` を選択。
```

該当ソースコードを選択後、

```
Command + Option + L
```
で整形される。


以下の様にチェックしておくと大体、良い感じに整形してくれるみたい。

![スクリーンショット 2018-04-20 10.22.08.png](https://qiita-image-store.s3.amazonaws.com/0/87716/b0048c24-fe50-5ba5-6e70-2e8b61144964.png)

```php
$array = array(1,2,3,4,5,);

↓

$array = array(
    1,
    2,
    3,
    4,
    5,
);
```

参考
https://pleiades.io/help/idea/settings-code-style-php.html#d942688e620
Alexa Skill作るときのLambdaチートシート

モック作るときLambdaのコンソール直打ちで書けると楽ちんなのでメモ

### Alexaに喋らせる
```
this.response.speak('Alexaに喋らせる')
```

### Alexa待機状態に戻る
```
this.emit(':responseReady');
```

### IntentにSlotが一つしか無いときに値を取得する
```
var slot_value = this.event.request.intent.slots.slotName.value;
```

### APIを叩く（標準ライブラリだけで）
```
const http_request = http.request(api_url, (api_response)=>{});
http_request.end();
```
windowsでIPアドレスmacアドレスの確認方法

コマンドプロンプトにて

``ipconfig /all
``

いくつか仮想空間のイーサネットアダプターがあるらしいがIntelとかのCPUの名前が入ってるやつが本物らしい
![image.png](https://qiita-image-store.s3.amazonaws.com/0/251595/32ae731a-3c74-7d26-9c12-bd505781f531.png)


いくつか仮想空間のイーサネットアダプターがあるらしいがIntelとかのCPUの名前が入ってるやつが本物らしい

macアドレスは物理アドレス
IPアドレスはIPv4 アドレス
まっさらなMacにNuxt.js環境を構築

## 何も入っていないMacにNuxt.js環境を構築する機会があったので手順をまとめます

[こちら](https://qiita.com/mrymmh/items/9ad350bbf943aadec7ef)を見たら色々と必要なことが判明
環境はDockerを使う＋awsはひとまず置いとくので

| インストールするもの |
|:-:|
|  brew |
| Node.js  |
| npm  |
| Docker|
|  Yarn |
|  Vue-cli |

### 1. brew,node.js,npmのインストール
- https://qiita.com/akakuro43/items/600e7e4695588ab2958d<br>
Nodeのバージョンは推奨版である8.11.1にした

### 2. Dockerのインストール
- https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81

### 3.Yarnのインストール
- https://qiita.com/masterkey1009/items/50f95b1187646a7db385

### 4. Vue-cliのインストールとチュートリアル
- https://qiita.com/567000/items/dde495d6a8ad1c25fa43
日本国の新しい元号は「？？」です→やっぱりやめました 

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/67318/a132129f-5b85-cd95-01fc-510df613b54a.png)
Windows 10 機能更新プログラム (2018 Spring Release) における元号のレジストリ更新について
https://blogs.technet.microsoft.com/jperablog/2018/04/20/rs4-registry/

RS4≒2018 Spring Release であれば、

和暦西暦変換処理を独自実装しており、例外処理がない場合大変なことになります。

###影響
レジストリが更新されることで想定されるコントロールや API への影響は、次のようなものが考えられます。

1.    2019 年 5 月以降の日付を表す和暦の文字列がプレースホルダーに置き換わる可能性があります。例えば、"2020/10/10" は "？？2年10月10日" になります。カレンダー コントロールや、.NET Framework 4 以降はこの変更の影響を受けます。
2.    2019 年 5 月以降の日付を表す和暦の文字列を日付型に変換する API やメソッドは、エラーを返したり例外がスローする可能性があります。.NET Framework 4 以降はこの変更の影響を受けます。
3.    元号の一覧を返すメソッドやプロパティは 5 つの元号を返します。現在の 4 つの元号を返すことを仮定したアプリケーションなどは影響を受ける可能性があります。

3番に該当したわ。GWかえして...

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/67318/1f7a2ff2-71fa-30ec-2246-0a58764c9822.png)

###特別付録：テスト用レジストリ

```gen40_2018年現在.reg
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras]
"1868 01 01"="明治_明_Meiji_M"
"1912 07 30"="大正_大_Taisho_T"
"1926 12 25"="昭和_昭_Showa_S"
"1989 01 08"="平成_平_Heisei_H"
"2019 01 01"=-
"2019 04 01"=-
"2019 05 01"=-
```

```gen45_2018_Spring_Releaseのやばいやつ.reg
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras]
"1868 01 01"="明治_明_Meiji_M"
"1912 07 30"="大正_大_Taisho_T"
"1926 12 25"="昭和_昭_Showa_S"
"1989 01 08"="平成_平_Heisei_H"
"2019 05 01"="？？_？_??????_?"
```

```gen50_なまえきまってないやつ.reg
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras]
"1868 01 01"="明治_明_Meiji_M"
"1912 07 30"="大正_大_Taisho_T"
"1926 12 25"="昭和_昭_Showa_S"
"1989 01 08"="平成_平_Heisei_H"
"2019 05 01"="元号_元_Gengou_G"
```

---

えええええええ

Windows 10 Version 1803 における新元号の仮定義の削除について

https://blogs.technet.microsoft.com/jperablog/2018/09/21/april2018update-placeholder-deletion/

アプリケーションの互換性の向上と、さらに柔軟に検証等をご実施いただくことを
目的として、日本時間 9 月 21 日よりご提供を開始いたします Windows 10 
Version 1803 向けの更新プログラム KB4458469 により下記スクリーン 
ショットにございます仮定義の削除が行われます。検証や開発等に必要な場合には、
個別に追加をご検討くださいますようお願いいたします。


https://support.microsoft.com/ja-jp/help/4458469/windows-10-update-kb4458469
September 20, 2018—KB4458469 (OS Build 17134.319)

- Addresses an issue that returns temporary values for the new Japanese Calendar Era.

###特別付録：テスト用レジストリ（２）

```gen40_OS_Build_17134.319.reg
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras]
"1868 01 01"="明治_明_Meiji_M"
"1912 07 30"="大正_大_Taisho_T"
"1926 12 25"="昭和_昭_Showa_S"
"1989 01 08"="平成_平_Heisei_H"
"2019 01 01"=-
"2019 04 01"=-
"2019 05 01"=-
```
ローカルのMongoDBが起動しない

## node.js
```terminal
$ node app/app.js
listen on port 3000
MongoDB connection error: MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]
```

## MongoDB
```terminal
$ mongo
MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017
2018-04-15T17:15:09.310+0900 W NETWORK  [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), reason: Connection refused
2018-04-15T17:15:09.312+0900 E QUERY    [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed :
connect@src/mongo/shell/mongo.js:251:13
@(connect):1:6
exception: connect failed
```

```terminal
$ sudo mongod --repair
2018-04-15T17:15:22.386+0900 I CONTROL  [initandlisten] MongoDB starting : pid=41628 port=27017 dbpath=/data/db 64-bit host=MacBook-Pro.local
2018-04-15T17:15:22.387+0900 I CONTROL  [initandlisten] db version v3.6.3
2018-04-15T17:15:22.387+0900 I CONTROL  [initandlisten] git version: 9586e557d54ef70f9ca4b43c26892cd55257e1a5
2018-04-15T17:15:22.387+0900 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.2o  27 Mar 2018
2018-04-15T17:15:22.387+0900 I CONTROL  [initandlisten] allocator: system
2018-04-15T17:15:22.387+0900 I CONTROL  [initandlisten] modules: none
2018-04-15T17:15:22.387+0900 I CONTROL  [initandlisten] build environment:
2018-04-15T17:15:22.387+0900 I CONTROL  [initandlisten]     distarch: x86_64
2018-04-15T17:15:22.387+0900 I CONTROL  [initandlisten]     target_arch: x86_64
2018-04-15T17:15:22.387+0900 I CONTROL  [initandlisten] options: { repair: true }
2018-04-15T17:15:22.388+0900 I STORAGE  [initandlisten] exception in initAndListen: NonExistentPath: Data directory /data/db not found., terminating
2018-04-15T17:15:22.388+0900 I CONTROL  [initandlisten] now exiting
2018-04-15T17:15:22.388+0900 I CONTROL  [initandlisten] shutting down with code:100
```

```terminal
$ mongod -dbpath /usr/local/var/mongodb
```
最終的にこれでうまくいった。

## 追記
後日、また起動しなくなった。
常時起動を設定することで解決できた。

```terminal
$ brew services start mongodb # MongoDBを常時起動する
$ brew services stop mongodb # MongoDBの常時起動を停止する
$ brew services list # 自動起動しているもの一覧
```
vimの始め方

# 概要
新入社員に向けて

# TL;DL
ヘルプを読む

# 最初に
すでにたくさんの情報がネットにあるので、リンク貼ります。

オンラインヘルプをオススメします。

クグるより、ヘルプを読むのが重要です。

# 最初に読む
[usr_02 - Vim日本語ドキュメント](http://vim-jp.org/vimdoc-ja/usr_02.html)

# 次に読む
[help - Vim日本語ドキュメント](http://vim-jp.org/vimdoc-ja/index.html)

あとは、TOPから気になるページに飛ぶだけです。

OSによっては英語になるため、注意です。
PDIで日付計算をする方法

PDIの操作方法の中で、日付の計算方法をよく聞かれるので、まとめておきました。

# 計算方法
やり方は色々ありますが、Calculatorステップ（計算ステップ）を使用するのが一番簡単です。
代表的な日付関連処理については以下のとおりです。

|計算式|内容|
|---|---|
|日付Aの年|Aに指定した日付の年を取得|
|日付Aの月|Aに指定した日付の月を取得|
|日付Aの年ごとの日数|Aに指定した日付の年において経過した日数|
|日付Aの月ごとの日数|Aに指定した日付の月において経過した日数|
|日付Aの週ごとの日数|Aに指定した日付の週において経過した日数|
|日付Aで指定した年の週ごと|Aに指定した日付の年において経過した週数|
|日付A + B日数|Aに指定した日付にBに指定した日数を加算した日付|
|日付A - 日付B|Aに指定した日付からBに指定した日付を減算した日付(経過日数)|

これ以外は実際にステップを確認いただければと思います。

# 設定例
実際に設定するとこんな感じになります。
![calc_01.png](https://qiita-image-store.s3.amazonaws.com/0/186651/dad5ca1d-8d85-ac39-0735-7d2814dd1ac7.png)

実行結果は以下のような感じです。
![calc_02.png](https://qiita-image-store.s3.amazonaws.com/0/186651/854752ac-bad3-0f08-5379-9fb1b944eb3b.png)


詳細は[Pentahoの公式ドキュメント](https://wiki.pentaho.com/display/EAI/Calculator)をご確認ください。
AV1 specification を読む 2018-04-17 (7.6. CDF Update Process)

#AV1 specification 日本語訳 (2018-04-17)

## 7.6. CDF Update Process

>This process is triggered when the function update_cdf is called from the tile group syntax table.

この処理は、タイルグループシンタックステーブル内の update_cdf() 関数で実行します。

>The frame CDF arrays are set equal to the final tile CDF arrays for the largest tile (measured in bytes) as follows.

以下のように、フレームCDF配列を、（バイト数で）最大タイルの最終的なCDF配列にセットします。

>A copy is made of the saved CDF values for each of the CDF arrays mentioned in the semantics for init_coeff_cdfs and init_non_coeff_cdfs. 
>The name of the destination for the copy is the name of the CDF array with no prefix. 
>The name of the source for the copy is the name of the CDF array prefixed with “Saved”. 
>For example, the array YModeCdf will be updated with values equal to the contents of SavedYModeCdf.

init_coeff, init_non_coeff_cdfs のセマンティックで指定されたCDF配列それぞれについて、セーブされたCDF値のコピーを生成します。
そのコピー先は、プレフィックスなし名称のCDF配列です。
コピー元は、"Saved" プレフィックス付きの名称のCDF配列です。
例えば、YModeCdf は SavedYModeCdf の内容で更新します。
サイトの問合せから迷惑メールが大量に送られてくる時の対処法（いま現に大量送信されてしまっている時）

とにかく急いで止めましょう！
メールボックスから削除する手間だけでなく、サーバ負荷によるサイトのダウン・・・レンサバなどの場合によっては同サーバに置かれている、よそ様のサイトがダウンし損害賠償、なんてことも！
まずは一刻も早く大量送信を止めましょう。

# フォームの設置ページのメンテナンス表示、およびアクセス制限
フォームからの送信が疑わしい場合はそのページからフォームを一時的に表示しない状態にするか、アクセス制限をかけましょう。
ただし、キャッシュなどにより送信者が閲覧できてしまう場合もあります。
その場合はフォームそのものの動作を一時的に停止してしまうことも効果的です。

# ドメイン拒否
特定のドメインからの送信であれば、postfix にてドメイン拒否しましょう！
`/etc/postfix/main.cf` にて、 `smtpd_sender_restrictions` パラメータを記述します。

※postfix の操作が出来ないメールサーバ環境では、メールボックスの設定などを確認してみてください。フィルタリングやブラックリスト設定などの項目があればそちらから設定をしてください。

## メールアドレスの一時利用停止
状態が深刻な場合や、後述するいくつかの対策の効果が見込めない場合は一旦、送信先のメールアドレスの利用を停止しましょう。場合によってはメールアドレスそのものを削除しましょう！
お問合せが来なくなってしまいますが、そんな事よりサーバダウンした場合の賠償額の方が深刻な問題です。

## main.cfの変更
`/etc/postfix/main.cf`
拒否するドメインの一覧を指定するため、Postfixの設定ファイル `main.cf` を編集します。
`main.cf` を開き、以下の行を追加します。

```main.cf
smtpd_sender_restrictions = reject_unknown_sender_domain, reject_non_fqdn_sender hash:(拒否リストファイルのフルパス)
```

※ `hash:` 以降は拒否リストファイルの位置のため、ファイル名やパスは変更可能です。

例：

```main.cf
smtpd_sender_restrictions = reject_unknown_sender_domain reject_non_fqdn_sender hash:/etc/postfix/reject_sender
```

## 拒否リストの作成 (reject_sender の作成)
`/etc/postfix/reject_sender`
ドメインの拒否リストを作成します。

```
(拒否するドメイン/アドレス名) (オプション)
```

例1：拒否後、拒否した旨のメッセージを返信する場合

```
example.com REJECT
```

例2：拒否した旨のメッセージを返信しない場合

```
example.com DISCARD
```

例：ドメイン指定やアドレス指定等、複数の指定する場合

```
hogehoge@example.com REJECT
fugafuga@example.com REJECT
piyopiyo.com REJECT
hogera.net REJECT
```

---

# お問い合わせフォームでの対応方法

## 送信前の確認用のチェックボックスの設置

設置しているフォームからの送信が疑われる場合、相手は恐らくロボットです。（断言は出来ませんが・・・）
早急に行うべく作業としては、送信前の確認用のチェックボックスを設置することです。
contact form 7 であれば「承諾確認チェックボックス」というものでOKです。

## reCAPTCHAの設置

前述のチェックボックスを設置した場合も、これを自動的にチェックする高度なロボットが存在します。そこで次はreCAPTCHAを設置しましょう。
reCAPTCHAとは、ウェブサイトにアクセスを試みるボットを遮断するためのものであり、contact form 7 にもあります。Googleのアカウントにて、設置対象のドメインを登録することで利用ができます！
詳しい手順は @amagasu1234 さんの記事が大変参考になります。

>[Google reCAPTCHAでログイン認証の強化。](https://qiita.com/amagasu1234/items/9760c2c410776fd02e12)

たとえロボットではなく実際の人間がフォームから故意に何回も送信したとしても、reCAPTCHAであれば、2〜3回と送信を重ねるたびに画像認証の難易度が増してくるので、大量送信者に効果的なストレスを与えられます。

---

# Eメールアドレスの掲載は即刻削除しましょう！

WEBサイトへ掲載されたEメールアドレスは迷惑メール業者のソフトが順次アドレスを自動的に見つけ出して配信リストへ登録する等の悪用が日常的に行われていることはご存知でしょうか？
ネット上にはこういった無防備なメールアドレスを収集して回る業者が多数存在し、この様に収集したメールアドレスを他の迷惑メール業者に売りつけるならまだしも、大量の迷惑メールを送りつけ、サーバ全体へ負荷をかけるDOS攻撃などの行為が日常的に行われています。

メールの大量送信によりサーバへ負荷がかかりダウンした場合、状況によってはレンタルサーバ会社からサービス停止による損害賠償を請求される可能性もあり、その金額は同じサーバスペースを利用している他の全てのサイトが利用停止の間に見込まれる損害金額となるので、もし運が悪ければたった1日のサーバダウンでも数億〜数百億円規模になる事も・・・！（大げさではなく、実際に似たような事例を耳にしたこともあります）

もちろん悪意ある外部の人間が諸悪の根源ではあります・・・とはいえEメールアドレスをそのまま掲載してしまうという明らかな落ち度が認められた場合、裁判での過失割合は圧倒的にあなたへかかってしまいますよね？
まずは最初のステップとして、いま掲載されているEメールアドレスは即刻削除しましょう！

もし、今メールの大量配信が行われており、止まらずに焦っている方！まずはドメイン拒否を！それでも、送信元アドレスを変えるなどで止まらない場合は、サーバの設定からそのメールアドレスの利用を停止するか、メールアドレスそのものを削除しましょう！
お問合せが来なくなってしまうって？そんな事よりも、ダウンした時の賠償額のことを心配してください！
onlineTool > 電子回路 > falstad.com/circuit > electronic circuit simulator

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1709
Google Chrome
```

電子回路シミュレータ
http://www.falstad.com/circuit/

LEDと抵抗の回路を作ってみた。
以下のように外部リンクを作れる。
http://tinyurl.com/y7cuz5ah

### Fileメニュー

- Import From Local File
- Import From Text
- Import From Dropbox
- Export As Link
- Export As Local File
- EXport As Text

Local Fileとしてダウンロードして、Dropboxに保存。
作業再開時はDropboxから読込む?

### Circuitsメニュー

回路の具体例を選択できる。

### 新規作成

Circuits > Blank Circuit
にて空の状態にできる。

### Link

Java版をJavaScript版にポーティングしたようだ。
http://lushprojects.com/circuitjs/
割合で出力したDynamoDBのキャパシティユニット消費量を監視スクリプトっぽく関数化した

[DynamoDBのCapacityUnitsの実際の使用量を割合で出力する](https://qiita.com/kojiisd/items/c7f0fe22e1353eecb909)

この記事の続き備忘録です。割合で出力したはいいものの、特にその後有効利用していなかったので、ちょっとした処理を加えて監視アプリっぽくしてみました。

# ゴール
1. 閾値を設定できる様にする
2. 閾値をある一定回数連続でオーバーしたら処理を行える様にする

# 閾値を設定できる様にする
以下のソースを元に編集していきます。

https://github.com/kojiisd/aws-dynamodb-consumed-metrics-operator/tree/v1.0

## 閾値は環境変数で設定
閾値は環境変数で設定してLambda関数毎に変更が容易にします。

serverless.ymlをこんな感じで更新します。

```serverless.yml
functions:
  run:
    handler: handler.run
    environment:
      THRESHOLD_VALUE: 0.5
      THRESHOLD_TIME: 5
```

デフォルトでは5回連続で0.5（50%）の閾値を超えた場合に処理を行う様に設定しておきます。これでいつでも閾値利用することができる様になりました。

# 閾値をある一定回数連続でオーバーしたら処理を行える様にする

もともと取得したメトリクスから、Datapointsを整列して出していただけのoutput_metricsとは別に、連続して閾値を超えたかどうかの判定を行うメソッドを作成します。

処理はoutput_metricsと途中まで一緒ですが、ただ結果を出力しているところで閾値を連続で超えたかどうか判定しています。

```py
def is_over_time(target_metric, provisioned_cap):
    is_over_time_num = 0
    result = False
    sort_datapoints = sorted(target_metric['Datapoints'], key=lambda x: x['Timestamp'])   
    for data in sort_datapoints:
        if float(round(data['Average']) / provisioned_cap) > float(LIMIT_VAL):
            is_over_time_num += 1
        else:
            is_over_time_num = 0
            
    if is_over_time_num >= int(LIMIT_NUM):
        result = True
    
    return result
```

これで閾値を超えた回数が設定した回数（デフォルト5回）をに達したらエラーとして判定できるようになりました。

問題ない場合はこんな感じで```False```を返してくれます。

```
ProvisionedReadCapacityUnits: 3
ConsumedReadCapacityUnits result:
2018-04-17 11:35:00+00:00       0.5     0.17
2018-04-17 11:40:00+00:00       1.11    0.37
2018-04-17 11:45:00+00:00       2.0     0.67
2018-04-17 11:50:00+00:00       1.97    0.66
over: False
ProvisionedWriteCapacityUnits: 3
ConsumedWriteCapacityUnits result:
2018-04-17 11:35:00+00:00       1.0     0.33
2018-04-17 11:40:00+00:00       1.0     0.33
2018-04-17 11:45:00+00:00       1.0     0.33
2018-04-17 11:50:00+00:00       1.0     0.33
over: False
```

問題がある場合はoverが```True```となって表示されます。しばらくデータの読み書きを行なっていたところ、読み込みが設定回数をオーバーしたため、読み込み側だけoverが```True```になりました。

```
ProvisionedReadCapacityUnits: 3
ConsumedReadCapacityUnits result:
2018-04-17 11:35:00+00:00       0.5     0.17
2018-04-17 11:40:00+00:00       1.11    0.37
2018-04-17 11:45:00+00:00       2.0     0.67
2018-04-17 11:50:00+00:00       1.94    0.65
2018-04-17 11:55:00+00:00       1.98    0.66
2018-04-17 12:00:00+00:00       1.95    0.65
2018-04-17 12:05:00+00:00       1.98    0.66
2018-04-17 12:10:00+00:00       1.96    0.65
over: True
ProvisionedWriteCapacityUnits: 3
ConsumedWriteCapacityUnits result:
2018-04-17 11:35:00+00:00       1.0     0.33
2018-04-17 11:40:00+00:00       1.0     0.33
2018-04-17 11:45:00+00:00       1.0     0.33
2018-04-17 11:50:00+00:00       1.0     0.33
2018-04-17 11:55:00+00:00       1.0     0.33
2018-04-17 12:00:00+00:00       1.0     0.33
2018-04-17 12:05:00+00:00       1.0     0.33
2018-04-17 12:10:00+00:00       1.0     0.33
over: False
```

# ここまでの成果物
https://github.com/kojiisd/aws-dynamodb-consumed-metrics-operator/tree/v1.1

# まとめ
誰か使った人がいたら、フィードバックもらえると助かります。（まだ作っただけ）
onlineTool > 電子回路 > EasyEDA > simulation > It takes 2 minutes for the interval in every simulation

EasyEDAというツールでSPICEの動作ができると思われる。

実行してみた。
設定を間違ったようだ。

設定をしなおして実行しようとした。

> It takes 2 minutes for the interval in every simulation

simulationは2分起きにしか実行できないのか。

有料アカウントでもそうなのかは不明（無料で使用)
https://easyeda.com/page/pricing
Visual Studio Code の利用状況データ収集を止める設定

最近アップデートしたらこんなダイアログが。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/90361/7637cb1d-8ca3-063a-f3a2-a33f82e1ab64.png)

止める方法は、**[ここ](https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting)**に書いてあります。

**ファイル** > **基本設定** > **設定** と開いて、

```json
"telemetry.enableTelemetry": false
```

を書けばいいらしいです。
nwdiag × Ansible plugin × Jupyter でNWトポ図の生成

#はじめに
前回の記事にて、
最新のJupyter notebook上でPythonのNWトポロジー図描画ライブラリであるnwdiagを動作させる記事を書きました。https://qiita.com/t-tkgh/items/16ee383f8aa11d2fcfe9
その時にAnsibleのfilter pluginでnwdiagのテンプレート形式に出力できる様になると、
より便利になるなと思い立ちまして、今回AnsibleのPluginを独自に作ってJupyter Notebook上で動作させるデモを作りました。(現状はIPv4のみ対応です…)
思ったよりもシンプルに出来たので、今回の記事にします。

#使い方
動作環境
Ansible 2.5.0
Python 3.6

####1. nwdiagのAnsible Filter Pluginを配置する
・git cloneする
独自に作成したnwdiagのansible filter pluginsをgit cloneします

```bash:shell
git clone https://github.com/t-tkgh/nwdiag_filter.git
```

・ansible.cfgの変更
（/etc/ansible/ansible.cfg or 実行ディレクトリ/ansible.cfgでも可能）

```vim:ansible.cfg
filter_plugins = <git cloneしたディレクトリパス>/nwdiag_filter
```

の項目を追記する。

####2. NWトポロジー図の情報を定義する
・nwdiag_filterのNWトポロジー情報の定義規則

- data[node]：
この配下にNW機器の各インターフェイス情報を格納する
以下、各インターフェイスの情報の項目となる。
  - name : NW機器名を定義する
  - ifname : NW機器の対象のインターフェイスの名称を定義する
  - address : NW機器の対象のインターフェイスのIPv4アドレスを定義する
  - vrf : 対象のインターフェイスが所属するvrf名を定義する(任意)
  - vlan : 対象のインターフェイスのvlan idを定義する(任意)

- data[network]:
この配下にネットワークアドレスの名称とサブネットを定義した情報を格納する
  - name : ネットワークアドレスの名称を定義する(任意)
  - address : ネットワークアドレスを定義する※マスク値は二桁で(任意)
- data[defaultmask] ：二桁のマスク値
ここでは自動生成するネットワークアドレスのマスク値を定義する。(二桁で)
  data[network]で定義されてないが、data[node]のaddressに存在するネットワークアドレスを
  data[node]のaddressとここで定義されるマスク値から自動生成する
  

定義例
今回はyamlファイル形式のextra-varsでNWトポロジー図の作図情報を定義する。

```yaml:extar-vars.yml
data:
  node:
  - ifname: ge-0/0/0
    vlan: 1000
    name: router01
    address: 192.168.0.1
    vrf: vrf01
  - ifname: ge-0/0/1
    vlan: 2000
    name: router01
    address: 192.168.1.10
    vrf: vrf01
  - ifname: ge-0/0/1
    vlan: '1000'
    name: router02
    address: 192.168.0.2
    vrf: vrf02
  - ifname: ge-0/0/1
    vlan: '2000'
    name: router02
    address: 192.168.2.2
    vrf: vrf02
  - ifname: "gigabitethernet 0/1"
    name: cpe01
    address: 192.168.1.11
  - ifname: "gigabitethernet 0/1"
    name: cpe02
    address: 192.168.2.1
  network: 
  - name: test
    address: "192.168.0.0/24"
  defaultmask: 29
```

この例で作図されるトポロジー図は以下となる。

![スクリーンショット 2018-04-20 3.04.52.png](https://qiita-image-store.s3.amazonaws.com/0/97185/46b4c76e-7d2d-d498-dd03-02fc1efdbf5d.png)

test以外のネットワークアドレスがdefaultmaskで指定された値の/29で自動生成されています。

####3. Playbookを作成する
・extra-vars.ymlのデータをnwdiag_filterで変換する

```yaml:demo.yml
- hosts: all
  gather_facts: no
  connection: local
  tasks:
  - debug:
      msg: "{{ data | nwdiag_filter }}"
```

connectionはlocalを指定、dataはextra-varsにて定義された情報がansible.cfgで参照されるnwdiag_filterにてnwdiag形式の情報に変換されて出力される。

#デモ
デモを実行したJupyter Notebookにて、デモ内容を記載。
https://github.com/t-tkgh/nwdiag_filter/blob/master/Demo.ipynb

####デモを行う前の前提
・Jupyter Notebookでnwdiagを実行する環境は前回記事を参考に構築。
https://qiita.com/t-tkgh/items/16ee383f8aa11d2fcfe9

・Jupyter Notebookのコンテナ内でansibleをインストールしてあること。

```bash:shell
pip install ansible
```

####デモのポイント
1. In [3]でansible.cfgでansible-playbookの出力結果をjson形式にしている。
2. In [7]でansible-playbookをshellとして実行して、その結果を格納。
3. In [8]でget_ipython().run_cell_magicを使うことで、nwdiagモジュールへ
ansible-playbookで生成したnwdiagのテンプレート情報をInputさせている。
Google Drive Tablesが使えなくなっていたこと

# リリースノート

>Introducing Google Cloud SQL default instances
April 4, 2018

>Upgrade your apps that use Drive Tables to Google Cloud SQL
We recommend you use Google Cloud SQL to store and organize your app data. Cloud SQL is a reliable, easy-to-use service that delivers fully managed SQL databases in the cloud. App Maker supports two types of Cloud SQL instances:

>Default—a G Suite administrator can set up a Google Cloud SQL instance that is shared among App Maker apps in an organization. When this is enabled, a new database is automatically created whenever you add a Cloud SQL data model to an app. Choose this option if your app needs a database that requires no set up and is easy to use.

>Custom—Once your administrator sets up a default Cloud SQL instance, you can also set up your own Cloud SQL instance. Choose this option when:

>your application serves a large number of users or stores a large amount of data.
the database must be shared with other applications.
you need to manage the database or retain control of the Cloud SQL instance.
With today's release, **new apps can't create Drive Table data models.** Existing apps can continue to use Drive Tables, as well as create new Drive Tables. However, we recommend you upgrade your models to Cloud SQL as soon as possible.

# Google　App　Makerでアプリ作ろうと思ったらDrive Tableが選べなかった

- 上記リリースノートにある通り2018/4/4以降新規に作るappsではDrive Tableが選べなくなっていました。
- Googleおすすめ的にはCloud SQLインスタンス立ち上げて利用(MySQL)だそうな。
- 結構ネットで検索すると手軽さでDrive Tableで作ってみよう、という記事が多いので、利用できなくなったことを知らないと混乱する。
Laravelのデバッグ手法メモ

Laravelでクエリビルダ周りのバグを修正した際のデバッグ手法メモ.
 
# 1. ロジックの確認

記述されているロジックが正しいのか, メソッドの動作, 引数の数, 引数に渡しているデータなどをドキュメントやソースコードを参照して確認する.

# 2. ログの取得

1でバグを見つけられなかった場合, 2 ~ 4の手順を踏む.

デバッグに先立ってログを取得する.  
Laravelでは任意の場所でログを取得することができる.  
例えば, クエリビルダが実際に実行しているSQLのログを取得するには,

```php
\DB::connection()->enableQueryLog();

// 処理

\Log::debug(\DB::getQueryLog());
\DB::connection()->disableQueryLog();
```

のように記述する.  
ログの出力先は`storage/logs/laravel.log`である.

# 3. ER図の作成

関連するデータベース間のER図を作成又は確認する.  

# 4. SQL文の分析

ログに出力されたSQL文やER図を元に, 実際にSQLを実行してみる.  
MySQLならば, MySQL Workbenchで手軽に実行できる.  
SQLレベルまで追っていくとどこがおかしいのかが明確になるため, それに従ってロジックを修正する.

# 5. Laravelのソースコードを読む

Laravel本体のソースコードを読んでメソッドの動作を追うのも良い.  
ソースコードは`vendor`以下に配置されている.
openFrameworks_v0.10.0(RC1) examples一覧

(※gif画像がQiitaの月間アップロード上限に達してしまったので後日更新します)

[3d](https://qiita.com/migizo/items/e96ff8ff1ac50814d468)
[communication](https://qiita.com/migizo/items/68b7495db98eb6ef62e5)
[computer_vision](https://qiita.com/migizo/items/85bd71c3175a5df2d265)
[events](https://qiita.com/migizo/items/d6fa55bfc8059960a3cc)
[gl](https://qiita.com/migizo/items/e79e5ddf1eec77bfebe0)
[threads](https://qiita.com/migizo/items/cce8f971f0bdbf84244f)
[string](https://qiita.com/migizo/items/5a070fb382ca9483800e)
[sound](https://qiita.com/migizo/items/aa507c246ab0e8f0af12)
[windowing](https://qiita.com/migizo/items/a354dbee86d7c2fc0a93)
Atom の git-control が開けない場合の対処

## 問題

Atom の git-control パッケージを使ってみようとしたら次のエラーが出て開けなかった。

```
Uncaught TypeError: Cannot read property 'split' of undefined
```

![スクリーンショット 2018-04-20 1.05.52.png](https://qiita-image-store.s3.amazonaws.com/0/155820/6c48ef0f-fcbe-3a4d-f613-02fc452d27d3.png)

## 解決

`View Issue` のリンク先の issue のコメント

[Uncaught TypeError: Cannot read property 'split' of undefined · Issue #259 · jacogr/atom-git-control · GitHub](https://github.com/jacogr/atom-git-control/issues/259#issuecomment-380588636)

に従って `/Users/user/.atom/packages/git-control/lib/git-control-view.coffee`（mac の場合）の 76 行目を次に変更して、Atom を再起動することで開けるようになった。

```
if git.getRepository().path
   @setWorkspaceTitle(git.getRepository().path.split('/').reverse()[1])
else
   @setWorkspaceTitle(git.getRepository().repo.workingDirectory.split('/').reverse()[0])
```
openFrameworks_v0.10.0_examples/sound

#audioInputExample
![so_01.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/78a581e4-5248-ae77-07b0-4bbfee48db24.gif)

#audioOutputExample
![so_02.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/27612725-07ae-575c-9530-d2e2710b00b0.gif)

#soundBufferExample
![so_03.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/1d930a52-af53-3c38-001f-0936f3b4703d.gif)

#soundPlayerExample
![so_04.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/0bbb1480-8442-9724-1e0b-5003b1bcfff1.gif)

#soundPlayerFFTExample
![so_05.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/4e1bdfd9-e09d-d033-562a-9a119570cf84.gif)
openFrameworks_v0.10.0_examples/strings

#conversionExample
![st_01.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/e703e3d2-5980-7961-fc7b-6c19fe2b36c5.gif)

#ofLogExample
![st_02.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/1c8b85f5-30e9-5906-8a28-0e6556a6c786.gif)

#regularExpressionExample
![st_03.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/81f5c13e-1bbe-554d-f375-131a6c0b9206.gif)

#sortingExample
![st_04.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/a8a0ab9f-225e-7f6b-2dff-a49f715355b2.gif)
openFrameworks_v0.10.0_examples/threads

#threadChannelExample
![th_01.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/c8ec78cf-a750-dd7a-9f81-a8d41cee6048.gif)

#threadedImageLoaderExample
![th_02.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/da3c3b7b-cf64-ef1a-9183-0cda16a2afe1.gif)

#threadExample
![th_03.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/b13fd96a-920c-f6c3-c951-fafb63fa630f.gif)
openFrameworks_v0.10.0_examples/windowing

#multiWindowExample
![wi_01.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/4cb22d36-4eb9-35ec-da2f-7fb11578c63d.gif)

#multiWindowOneAppExample
![wi_02.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/8567f951-966f-16c3-c300-f699f6929e20.gif)

#noWindowExample
![wi_03.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/382a0978-d540-d190-8ca5-188f29672157.gif)

#windowExample
![wi_04.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/25668413-95f3-c5f4-0c4c-aaa99c298ef8.gif)
openFrameworks_v0.10.0_examples/gl

#alphaMaskingShaderExample
![gl_01.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/9d02d749-778d-a5ad-53e3-66761beba9c3.gif)

#areaLightExample
![gl_02.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/88b8f08b-8719-af97-fd44-50be5d130f5d.gif)

#billboardExample
![gl_03.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/620d7c09-03f1-c450-c27c-d0da4bebdf13.gif)

#billboardRotationExample
![gl_04.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/a75f1ac8-ed41-4b9e-f0ea-9463da588238.gif)

#fboTrailsExample
![gl_05.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/611d9fd6-50c1-b046-69b4-6e2e10244fee.gif)

#geometryShaderExample
![gl_06.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/c47e8a3c-3eb9-ead0-f6db-510077172c95.gif)

#glInfoExample
![gl_07.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/cfaec52b-c57b-1de4-51aa-2bda294f4f61.gif)

#gpuParticleSystemExample
![gl_08.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/8c7cd063-23c1-8387-5adc-f900f960deea.gif)

#multiLightExample
![gl_09.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/b329b263-65cc-b0d0-26a8-120154e3318b.gif)

#multiTextureShaderExample
![gl_10.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/75652695-5ff7-014b-6d63-f06a4a3f8363.gif)

#pixelBufferExample
![gl_11.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/071b47fb-dddf-28ed-04a2-3b28f603fbe2.gif)

#pointsAsTexturesExample
![gl_12.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/ed08fb90-e94b-fc3f-cd53-1ee8dd0474b1.gif)

#shaderExample
![gl_13.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/984b5148-fe95-be46-ca73-52921439f83f.gif)

#singleLightExample
![gl_14.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/1c2b8f27-f078-42c4-d06d-2b8eacfcedb5.gif)

#slowFastRenderingExample
![gl_15.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/f6645e13-27e2-1eea-b9fd-3f4101d97d6b.gif)

##textureBufferInstancedExample
![gl_16.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/ee5a7935-2baa-eb12-48da-3c81f593dd65.gif)

##textureExample
![gl_17.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/65ab13fc-c38b-d094-5c2c-820bddae996a.gif)

##textureScreengrabExample
![gl_18.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/40bf29ac-bb0b-df36-0c18-71163dde53e1.gif)

##threadedPixelBufferExample
![gl_19.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/51da78e0-e2e5-b679-73ab-20a21af55309.gif)

#vboExample
![gl_20.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/24d742e4-409d-4b92-5eb8-5db262d1ebeb.gif)

#vboMeshDrawInstancedExample
![gl_21.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/064b55ba-fc6d-266c-21a2-98336dd6718a.gif)

#viewportExample
![gl_22.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/3cd67ce9-207a-b6b1-9b77-6f4b7b3958be.gif)
openFrameworks_v0.10.0_examples/events

#advancedEventsExample
![ev_01.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/cb578b27-5e88-cf35-e3d8-5cb2ecd435ad.gif)

#allEventsExample
![ev_02.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/7a573305-39e9-f4c5-d4c6-c7355cf4264d.gif)

#customEventExample
![ev_03.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/63d91bdc-e552-a444-bf54-64489dba725e.gif)

#simpleEventsExample
![ev_04.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/eac581b7-bc28-6e44-310c-a6e94afc9a48.gif)

#simpleTimerEventExample
![ev_05.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/f940035b-a469-59e1-0eb1-d53aebd95077.gif)
AWS認定ソリューションアーキテクトアソシエイト合格[2018.04]

# はじめに
AWS認定ソリューションアーキテクトアソシエイトを合格しました。
これから取得しようとしている方＆自分用ログとして合格体験記を書いてみようと思います。

![2018-04-19_20h27_06.png](https://qiita-image-store.s3.amazonaws.com/0/216527/244384b6-e30e-0b61-8609-7b999c0f80f7.png)

# 前提(最初はこんな状態でも4か月で取得)
* インフラ周りさっぱりの業務アプリエンジニア。例えばSSHすらわからない状態
* 英語力は忘れに忘れて中学生以下。高校以降で英語の勉強をした記憶がない。
* 10ヵ月娘の子育て中

# おすすめの勉強法(前提が似ていれば参考に。)
## まずは動画がおすすめ

### [YoutubeのAWS公式チャンネル](https://www.youtube.com/user/AmazonWebServicesJP/featured)で情報収集

Youtubeでの情報収集は最初から最後まで使えます。
動画やドキュメントといえば多くの人が[AWS クラウドサービス活用資料集](https://aws.amazon.com/jp/aws-jp-introduction/)をお勧めしており、私も見ることは最終的に必須と思います。
しかし、いきなり見ると詳細な内容(試験には必要な知識ですが初心者すぎる状態だとよくわからない)が多く、見ながら寝落ちする問題が頻繁に発生しました。
↓
まずはAWSの公式チャンネルが良いです。AWS Summitの入門動画は30分程度にまとまっており特に見やすいです。
スピーチしている人が見える所が良いです。文字と図だけ見続けるよりは伝わるものが多いので眠くなりにくい気がします。


![2018-04-19_21h46_34.png](https://qiita-image-store.s3.amazonaws.com/0/216527/ec015e98-eea9-7641-ac2f-d180be40bb33.png)

### [Simplilearn](https://www.youtube.com/playlist?list=PLEiEAq2VkUULlNtIFhEQHo8gacvme35rz) など日本語にこだわらなければ、良い動画はたくさんある

こちらの動画は数万再生をされていることから良動画であることが伺えます。
内容としては、公式ドキュメントのような説明の後に**DEMO**があります。DEMOを見れるのは貴重です。自分で動かすのが理解する一番の方法ですが、この動画は見ると自分でも同じように動かしてみようという目標が得られます。

![2018-04-19_23h09_38.png](https://qiita-image-store.s3.amazonaws.com/0/216527/1b2e2934-86d3-d4bb-6a29-efb36d0e7dfe.png)

英語が苦手な私は自動字幕機能を使用しました。わからない英語を調べるという行為自体が手を動かして記憶することに繋がり眠気からも解放されました。英語の方がなにかと情報が充実しています。英語から逃げないと心に決めてから勉強進度が上がりました。

![2018-04-19_23h10_57.png](https://qiita-image-store.s3.amazonaws.com/0/216527/019d9feb-2c32-724c-4d5e-1052b5b5185c.png)
![2018-04-19_23h11_15.png](https://qiita-image-store.s3.amazonaws.com/0/216527/1006b830-c0e7-66b7-a515-5d0b5134e2a0.png)



## やるべき事をタスク化する(ツールを使う)
（これは、個人の性格やスタイルにも依存する内容です）

### ツールで必要と思うタスクをブレイクダウンし見える化する


AWSの資格勉強をしていると どこまで勉強したらゴールとし、いつ受験に踏み切れば良いか わからなくなる問題が発生しました。

私は途中からタスク化ツールを導入し、やれることを全てアウトプットしました。
すると、不思議なくらいそこからは勉強が順調に進みました。

仕事で何かしらのツールを使いタスクを管理しているなら、この作業はとても簡単です。
見えないものを、記憶を頼りに思いつきでのやるのと しっかり見える化してから着手する効率と正確さの違いを体験しているのであれば、先が見えにくいAWSの自己学習にも導入する事をお勧めします。


タスクのオススメは、公式記事やいろいろな方の体験記事を巡回するとよいでしょう。
まとめている良記事がたくさんありますのでここでは省略します。
なるべく最新の記事を信じて。そして多くの記事を見ると共通した内容が浮かびあがってきます。


ツールはなんでもよいです。私は[Trello](https://trello.com/)を利用しました。
スマホで学習するケースも多かったため、スマホとPCで同期ができて無料という条件で探しました。

自己学習なので**なるべく面倒にならぬようシンプルに使う**ことを重視します。
以下のように利用、仕事で使っているであろう多くの機能をあえてカットしました。

* ステータスはTodo、Working、Doneの3つに絞る。
* 優先順位は使わない。
* 日付機能は利用しない。
* 予定工数、実績工数の機能は利用しない。
* その他プラグインは入れない


![2018-04-19_22h12_12.png](https://qiita-image-store.s3.amazonaws.com/0/216527/189d90aa-8224-2116-0ed2-6eea0a905456.png)

### 模擬試験を早めに受けてタスク補充
最後に確認の意味で模擬試験を受けるという記事を見かけます。
ですが**実務でほとんどAWSを使ってない初心者の場合**、受験直前で目も当てられない正答率をはじき出すとリカバリが困難です。
点数が悪い場合(私は悪かった)、結果を分析することになります。そして当初思いつかなかった必要なタスクがこのタイミングで補充されます。

1. タスクが空になってきたら模擬試験
2. そしてここでタスクの最終補充（点数が良ければ補充は不要）
3. 尽きる日時を予測して本試験を予約するとよいでしょう。


# さいごに(受験後の感想もあわせて)
確かにこの試験は業務経験があるかどうかで難易度の体感が違うと思いました。
業務経験がない人は、機能を覚えるだけではどうしても試験中に想定外の問題と出会います。
ですが、業務を想定して考えながら勉強すれば試験問題とマッチしてくるため想定外リスクは各段に減ります。正答率もあがります。
そして心が折れなければこの試験は問題なく受かります。

最後まで読んで頂きありがとうございました。
openFrameworks_v0.10.0_examples/computer_vision

#kinectExample
<img width="1019" alt="cv_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/136558/80c0ef65-616f-e533-45c1-4ea9ed24054a.png">

#opencvExample
![cv_02.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136558/61d07f55-9f87-fc88-bf4b-5dbd7f1afde3.gif)

#opencvHaarFinderExample
<img width="1018" alt="cv_03.png" src="https://qiita-image-store.s3.amazonaws.com/0/136558/19fc0c58-a23d-5f52-5aca-d7656335abd7.png">