OmniAICreator/Qiita-1.07M huggingface dataset:
command pattern

# command pattern
callbackを登録するようなもの
オペレーションの呼び出しと実行を分離する


## example
commandはreceiverに移譲するだけのものから、それ自身が処理をするものまである。

```
protocol CommandProtocol {
    func exec() {}
}

class PrintCommand: CommandProtocol {
    private let receiver: receiver

    func exec() { receiver.print() }
}

class Receiver {
    func print() {
        print(nextLine)
    }
}


class Invoker {
    private let command: CommandProtocol

    init(command: CommandProtocol) {
        self.command = command
    }

    func acceptInput() {
        command.exec()
    }
}
```

swift の BackgroundTask は適当な時間で強制終了される。
commandパターンによりretryをサポートする。

```
final class BackgroundCommand {
    enum Status {
        case willBegin, doing, done, failed
    }

    private let receiver: Receiver
    private let input: ReceiverInput
    private var status: Status = .willBegin
    private var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid

    init(receiver: Receiver, input: ReceiverInput) {
        self.receiver = receiver
        self.input = input
    }

    func exec() {
        status = .doing

        backgroundTaskID = UIApplication.shared.beginBackgroundTask(withName: "TASK_NAME", expirationHandler: { [weak self] in self.status = .failed })

        DispatchQueue.global(qos: .userInitiated).async { [weak self] in
            guard
                let r = receiver,
                let i = input,
                let taskID = backgroundTaskID else {
                self?.status = .failed
                return
            }

            r.action(i)

            UIApplication.shared.endBackgroundTask(taskID)
            self?.backgroundTaskID = .invalid
            self?.status = .done
        }
    }

    func retry() {
        guard status == .doing else { fatalError() } // 適当に処理

        receiver.restore() // receiverの内部状態が変わるとき
        status = .willBegin
        exec()
    }
}
```
BigQuery　レガシーSQLのNTH関数を標準SQLで記述する

標準SQLでNTH関数は使用できないため別の方法で解決できないか試してみた。

## やりたいこと

文字列を指定の文字列ごとにSPLITし、分割した値の3つ目のみをSELECTする。

## SPLIT関数はレガシーSQL同様に使用可能

テストデータを作成する。

```
WITH TARGETRANGE AS (
    SELECT
        'aaa_bbb_ccc_ddd_eee' AS teststr
)
```

`teststr`を引数とし、`delimiter`にアンダースコアを指定し分割する。

```
SELECT
  split((select teststr from TARGETRANGE), '_')
```
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386370/db1245fe-7bf2-9b0d-d6c3-c540964bbe55.png)
SPLIT関数の戻り値の型はARRAY。


今回は配列の3つ目のみを選択したいため、`SAFE_OFFSET`または`SAFE_ORDINAL`で配列位置を指定する。
`SAFE_OFFSET`：0を始めとする
`SAFE_ORDINAL`：1を始めとする

```
SELECT
  split((select teststr from TARGETRANGE), '_')[OFFSET(2)] as a
```

結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386370/e1d8a5f4-c8f5-4a12-4089-fdfc4ce26172.png)

文字列`ccc`だけを取得できた。
Atomのテキストサイズを元に戻すor縮小　-Windows-

#Atomのテキストサイズ変更


この記事ではAtomの1.37.0でコードのテキストサイズのショートカットキーを記してます。HTMLのソースコードを書いていて、キーボード見ないで打っていたらテキストサイズが小さくなってしまったので元に戻すためのメモです。
**使用環境：Windows10**
***
##テキストサイズを元に戻す
>Ctrl + 0(ゼロキー) 

##テキストサイズを縮小する
>Ctrl + -(ハイフンキー)


テキストサイズは全部で14段階まで変更できますが、デフォルトが一番大きくて見やすいのであまり変更の用途はないかもしれません。拡大のキーは無かったと思います。

以上
chain of responsibilty

# chain of responsibility
ruby の method_missing

誰かやってくれるっしょパターン
## 結果
### pros
責任が柔軟になる

### cons

処理される保証がなくなる

## example
```
protocol MethodHandler {
    func handle(methodName: String)
}

class Hoge: MethodHandler {
    private let successor: MethodHandler

    func handle(methodName: String) {
        successor.handle(methodName: String)
    }
}

class Fuga: MethodHandler {
    func handle(methodName: String) {
        print("method \(methodName) called!")
    }
}
```
EC-CUBE4で商品一覧のソート順を「新着順」を初期表示にする

EC-CUBE4の、商品一覧(ショップ画面)の並び順は、「価格が安い順」「価格が高い順」「新着順」が選択でき、初期表示は「価格が安い順」で表示されます。

商品を新しく登録した際など、「新着順」を初期表示にしたい、というケースもあるかと思いますので、「新着順」を初期表示に変更する方法を解説します。

## 管理画面から、設定＞マスターデータ管理＞mtb_product_list_order_byを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72858/bf7fc2cd-f2f8-dee9-6907-4c283044c5ff.png)

標準では、

1: 価格が低い順
3: 価格が高い順
2: 新着順

の順に並んでいます。

## ID/Nameはそのままで、順序を入れ替える

これを、ID/Nameはそのままで、順序を入れ替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72858/b3483a5c-a8e6-68bf-5b73-53c189018cc6.png)

2: 新着順
1: 価格が低い順
3: 価格が高い順

に変更してみました。

## 商品一覧画面を確認

商品一覧画面を確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72858/e5babcd7-590c-10e9-5566-d01feeabd64e.png)

「新着順」が初期表示となっていることを確認できました。

以上です。
Atomで短形選択する方法

Atomをインストールするたびに毎回忘れるので記録しておく

## 結論
`sublime-style-column-selection`パッケージをインストールする
これで短形選択が可能になる

<img width="832" alt="スクリーンショット_2019-05-20_8_57_07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/b7ed2510-6ba8-e3d7-3466-9b627a972d2a.png">

## 短形選択の方法
macだと`option`キー（winだとalt？）を押しながらカーソルを動かす。

パッケージインストール後はエディタの再起動不要で使用可能だった。
【OpenGL】OpenGL APIのエラーチェック

# OpenGL APIには戻り値がvoidなものが多い問題

ほとんどのOpenGLのAPIでは戻り値がvoidであり、成功/失敗の判定が出来ない。
例え失敗していたとしても、あたかもAPIが呼び出されていないかの様な挙動となる。

# エラーチェックするには？

そこでエラーチェックは、以下のAPIを使う事により確認が可能である。

```c
GLenum glGetError();
```

OpenGLにおいてエラーは、上記API呼び出しによりエラーが実際に処理されるまでキューに格納される。
つまり、 **定期的に上記APIを使って確認してないと、どのAPI呼び出し時にどの様なエラーを引き起こしたのかを知るすべがない。** 

エラーキューが空の場合、 ```GL_NO_ERROR``` を返す。
それ以外の場合は、エラー列挙子が返され、そのエラーがキューから削除される。

エラーチェック処理をしていないをしていない箇所があることも想定し、
各OpenGL API をコールした前 or 後に現在キューにある全てのエラーを破棄 or 取得する様にするのが良い。

以下の様な処理となります。

```
GLenum err;
while （（err = glGetError （）） ！= GL_NO_ERROR ）
{ 
    ;//エラーを処理/ロギング
}
```
# エラーコードについて

glGetError()によって返却されるエラーコードとそれが指す状態については以下を参照してください。

|エラーコード | 値 | 説明 |
|---|---|---|
|GL_NO_ERROR|0x0000|エラーキューが空の場合||
|GL_INVALID_ENUM|0x0500|呼んだ関数の列挙型の引数がその関数で使えない場合|
|GL_INVALID_VALUE|0x0501|呼んだ関数の引数の値が無効な値もしくは範囲外の場合|
|GL_INVALID_OPERATION|0x0502|現在のステートで無効な操作をしている場合、もしくは廃止された関数を呼び出した場合(*1)|
|GL_STACK_OVERFLOW|0x0503|スタックのプッシュ操作がスタックのサイズの上限を超える場合|
|GL_STACK_UNDERFLOW|0x0504|スタックがすでに最下点にあるため、スタックのポッピング操作を実行できない場合|
|GL_OUT_OF_MEMORY|0x0505|実行するのにメモリが足りない場合(このエラーを返した場合そのOpenGL関数の動作は未定義)|
|GL_INVALID_FRAMEBUFFER_OPERATION|0x0506|完了していないフレームバッファから読み込みまたは書き込みをしようとした場合|
|GL_CONTEXT_LOST|0x0507|グラフィックカードがリセットされたためにOpenGLのコンテキストが失われた場合|
(*1) 例えば、廃止されたAPIを呼び出した場合。

# エラー処理時の注意点

しかし、上記の通り各OpenGL API のコール前後に現在キューにある全てのエラーを処理すると **パフォーマンスが大幅に低下する。** 

その理由は以下の二点。

* エラー状態をチェックして返すだけでなく、OpenGL API コール自体のオーバーヘッドも発生する。
* マルチスレッドを使用するドライバの場合、glGetError()をコールする事によりドライバ内のスレッド間で同期が発生する。

その為、 **glGetError()のコール自体をデバッグビルドに限定した方が良い。** 

# 参考
https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetError.xhtml
https://www.khronos.org/opengl/wiki/Common_Mistakes#Checking_for_OpenGL_Errors
visitor pattern

# visitor pattern

オブジェクト構造上の要素で実行されるオペレーションを表現する。

## 結果
### pros
オブジェクト構造に対して新しいオペレーションを追加しやすい
構造に対するオペレーションをビジターに閉じ込め、構造の要素のクラスを汚さない

### cons

構造に新しい要素を加えることを難しくする。
構造の要素のクラスがビジターが働くのに十分なインターフェイスを後悔する必要がある。
これはカプセル化を緩くせざるをえないケースがある。

## example
```
protocol EquipmentVisitorElementProtocol {
    func accept(visitor: EquipmentVisitorProtocol)
}

class Cable: EquipmentVisitorElementProtocol {
    func Accept(visitor: EquipmentVisitorElementProtocol) {
        visitor.visitCable(cable: self)
    }
}

class Part: EquipmentVisitorElementProtocol {
    func Accept(visitor: EquipmentVisitorElementProtocol) {
        visitor.visit(part: self)
    }
}

protocol EquipmentVisitorProtocol {
    func visitCable(cable: Cable)
    func visitPart(part: Part)
}

class PriceEquipmentVisitor: EquipmentVisitorProtocol {
    private var price: Int

    func visitCable(cable: Cable) {
        self.totalPrice += cable.price
    }

    func visitPart(part: Part) {
        self.totalPrice += part.specialPrice
    }
}
```

## ex
https://github.com/rails/rails/blob/b13a5cb83ea00d6a3d71320fd276ca21049c2544/actionpack/lib/action_dispatch/journey/visitors.rb
MojoFailureException エラー解決メモ

なんか
netBeans環境で
しばしば
MojoFailureException
でトラブってしまうので解決メモを記載失礼します。

なんか環境だと思うんだけどな……

エラーのリンクを見ても
https://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

よく分からない……(T_T)

しかも解決方法を伺いたいと思っていた先輩休み……(T_T)

(+_+)
Vue.js で Module not found: Error: Can't resolve '' in '~' と表示される原因

とても単純なところで２日ぐらいハマったのでメモ。
ググっても同様の事例が見つからなかったので残しておきます。

# 事象
次のようなコンポーネントを作成しました。

```vuejs:App.vue
<template lang="pug">
div
</template>

<script>
export default {
};
</script>

<css scoped lang="scss">
</css>
```

webpackでコンパイルすると次のようなエラーが表示されます。

```
ERROR in ./path/to/components/App.vue
Module not found: Error: Can't resolve '' in '/path/to/components/'
resolve '' in '/path/to/components/'
  using description file: /path/to/project/package.json (relative path: ./path/to/components)
  after using description file: /path/to/project/package.json (relative path: ./path/to/components)
    using description file: /path/to/project/package.json (relative path: ./path/to/components)
      no extension
        /path/to/components/ is not a file
      .js
        /path/to/components/.js doesn't exist
      .json
        /path/to/components/.json doesn't exist
      as directory
        existing directory
          using path: /path/to/components/index
            using description file: /path/to/project/package.json (relative path: ./path/to/components/index)
              no extension
                /path/to/components/index doesn't exist
              .js
                /path/to/components/index.js doesn't exist
              .json
                /path/to/components/index.json doesn't exist
```

# 原因
`style`と書かないと行けない箇所を`css`と記載していました。
次のように修正することで解決しました。

```vuejs:App.vue
<template lang="pug">
</template>

<script>
export default {
};
</script>

<style scoped lang="scss">
</style>
```
「サイゼリヤで1000円あれば最大何kcal摂れるのか」をExcel のソルバーでで解いてみた。

# 前書き〜

* [サイゼリヤ1000円ガチャをつくってみた(Heroku + Flask + LINEbot)](https://qiita.com/marusho_summers/items/a2d3681fac863734ec8a)
* [「サイゼリヤで1000円あれば最大何kcal摂れるのか」を量子アニーリング計算(Wildqat)で解いてみた。](https://qiita.com/hodaka0714/items/cf44b4ece992a39b5be4)
* [「サイゼリヤで1000円あれば最大何kcal摂れるのか」をSMTソルバー(Z3)で解いてみた。](https://qiita.com/tanakh/items/a1fb13f78e0576415de3)

に習って、エクセルおじさん登場！

# エクセルのソルバーとは、
エクセルのアドインとして提供されているもので、Frontline Systemsというところが開発しているらしい、

# 解いてみよう
まずはシートを開けて、皆さんお使いのdbファイルからサイゼリアのメニューを抽出します。

ペタペタエクセルのシートに貼って、
メニュー別に、個数、カロリー、価格の列を追加して、価格とカロリーのセルには計算式入れます、

それぞれの列に上限下限の制約入れます、
こんな風になります
![表の絵.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420296/9990e6f4-f106-305e-89c6-25b6ec1f1bf8.png)

# ソルバー設定
ソルバーのダイアログだして、それぞれ設定します。
カロリー最大、合計金額の上限、そして個数は整数でかつ0,1とします。
設定画面はこんな風になります

![solversetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420296/fa95671c-ab3a-6700-79a1-5143acf72369.png)

# 解いてみる
シンプレックス方を選んで
解く！

答えはこうなって、皆さんと同じになりました
![E8DAC95B-3486-4BFE-A320-DD7497111716.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420296/04ce1bf0-a60e-3646-29fe-a34db42435c9.png)
Androidで他アプリのリソースを使う

「Androidは他のアプリのリソースを取得することができる」ということを聞いたので、実際どのように行うのかを調べてみました。

ちなみに他社アプリのパッケージ名は[こちら](https://sp7pc.com/google/android/31029)などの情報を元にすぐ調べることができますが、リソース名までは（たぶん）わかりません。なので使うとしたら同じ会社のアプリで共通管理をするため、などの理由になるのかなと思うのですが、それはそれでややこしいことになりそうなのであまり実務で使うことはないのかなぁと思っています。

サンプルコードはこちらにおいています。
https://github.com/akatsuki174/UseOtherAppResourceSample

※環境
Android Studio: 3.4
Kotlin: 1.3.31

# 文字列

試しに設定アプリの文字列リソースを取得してみます。

```kotlin
fun showOtherAppResource() {
    val res: Resources?
    try {
        val packageName = "com.android.settings"
        // 他アプリのリソース群を取得
        res = this.packageManager.getResourcesForApplication(packageName)
        // パッケージ名、リソースの種類、リソース名を指定
        val resourceId = res?.getIdentifier("clear_activities", "string", packageName)
        if (resourceId != 0 && resourceId != null) {
            val text = this.packageManager.getText(packageName, resourceId, null)
            Toast.makeText(this, text, Toast.LENGTH_LONG).show()
        }
    } catch (e: PackageManager.NameNotFoundException) {
        e.printStackTrace()
    }
}
```

# 画像

こちらは画像です。リソース名まで知っている実例がなかったので、パッケージ名は適当なものにしています。

```kotlin
fun showOtherAppImage() {
    val res: Resources?
    try {
        val packageName = "com.hogehoge"
        res = this.packageManager.getResourcesForApplication(packageName)
        // 今回はmipmapを指定しているが、もちろんdrawableなどでも画像は取得できる
        val resourceId = res?.getIdentifier("ic_launcher", "mipmap", packageName)
        // API level 22以降はこの書き方
        val drawable = resourceId?.let { ResourcesCompat.getDrawable(res, it, null) }
        if (resourceId != 0 && resourceId != null) {
            val toast = Toast(this)
            toast.duration = Toast.LENGTH_LONG
            // 画像要素しかないレイアウトを作成して埋め込んでいます
            val layout = layoutInflater.inflate(R.layout.custom_toast, linearLayout)
            layout.customToastImage.setImageDrawable(drawable)
            toast.view = layout
            toast.show()
        }
    } catch (e: PackageManager.NameNotFoundException) {
        e.printStackTrace()
    }
}
```
グラフDB初心者　Neo4jインストールからサンプル実行まで

グラウフDB入門者がNeo4jをインストールして、サンプルデータベースを操作するまでの手順を備忘録程度に残します。
まずは実際に操作してみることで、グラフDBのわかりやすさを感じることができたので、入門としてはぜひオススメです！

##目次
- 動作環境
- インストール
- Neo4j Browser
- サンプルデータベース
- 最後に

##動作環境
macOS Mojava
java version "1.8.0_201"　※JDK8が必要になる


##インストール

####インストーラーの取得
0.公式サイトからインストーラーを取得して、インストールしてください。
<b>Community Server</b>が無償のものなのでそちらを選択します。
https://neo4j.com/download-center/

![download1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297721/c3d49700-d846-d114-22a6-9ad4033d6201.png)


####tarファイルからインストール
1.ターミナルを起動する

2.tarファイルを展開する

```terminal
tar -xf ./neo4j-community-3.5.5-unix.tar.gz
```

####Neo4jを起動する
3.NEO4J_HOME を設定する

```terminal
echo export NEO4J_HOME=<ファイルのPATH> >> ~/.bash_profile
例:echo export NEO4J_HOME=Users/****/graphDB/Neo4j/installer/neo4j-community-3.5.5 >> ~/.bash_profile
source ~/.bash_profile
```

4.Neo4jを起動する

```terminal
$NEO4J_HOME/bin/neo4j console
```

5.(Neo4jを停止する）
停止する際には'Ctrl-C'で停止させることができます。
以下の手順を行う際は、起動したままにしてください。


以下、公式サイトの手順
![download2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297721/1298f3d5-5867-16f3-4cc5-0e67b30d3025.png)



##Neo4j Browser を起動する
1.neo4jにアクセスする
ブラウザを起動し`http://localhost:7474/`に接続します。

2.ログイン
ログイン画面が表示されるので、passwordに`neo4j`と入力し、接続します。
![login](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297721/f491f67e-d4cf-35e3-fa70-effab4e9c603.png)

3.パスワード設定
新規のパスワードを設定する。
![password](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297721/71292d0b-4c11-1063-e16e-72de3323ebd2.png)

ホーム画面が表示されたら、インストール完了です！！
![home](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297721/0ea3d471-f9a9-8f61-dcdc-bcf3dd637aee.png)


##サンプルのデータベースの操作
サンプルで用意されているデータベースに接続してみます。
ホーム画面上部に以下のコマンドを入力し、実行`▷`します。

```Neo4j:
:play movie graph
```
![movie](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297721/ea8ef6f4-599e-87cd-661b-0e13fcbe82e8.png)

実行すると、サンプルデータベースの構築から可視化までのコードが表示されますので、順々に実行していきます。
![movie2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297721/250343d5-a131-3757-f8da-78744b429f54.png)

1.Create Table
サンプルコードを実行します。
![movie3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297721/ecc07dd5-a602-d3bc-3b3e-32cca3c9a2e8.png)
実行が成功するとグラフが表示されます。
グラフはクリック等で操作できるので、ぜひ触ってみましょう！
![movie4](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297721/735cfe99-4a0c-a51c-370b-73afcda6ac79.png)

以降の手順も同様にサンプルコードを実行して結果を確認していきます。
2.Find
3.Query
4.Solve
5.Recommend
6.Clean up

全てを実行すると「Next steps」が表示されます。
他にもサンプルデータベースは用意されているので、参考にしてみてください。
![movie7](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297721/2f4d8464-c1d7-4e45-3aeb-2a0a7928d5b4.png)


##最後に
Neo4jをダウンロードして、実際にサンプルデータベースを操作するまでは簡単に操作できます。グラフDBを始める際には、まずは操作してみるとイメージが掴みやすいし、クエリのコードの雰囲気を理解することができました。入門としても、いい手順と思うのでオススメです。
Nuxt と Go で Software Architecture の実験 ~2日目 Docker編~

## はじめに

2日目と言いつつ前回の日記から1週間立ってしましました...。Midtermシーズンなので仕方なかったです（言い訳）。今回も[@Sekky0905Ks](https://twitter.com/Sekky0905Ks)さんの[コミット](https://github.com/sekky0905/nuxt-vue-go-chat/commits/master)を遡らせていただき、使われている技術一つ一つをまとめさせていただきました。

サーバーサイドは勉強中の身なので間違い等ありましたらご報告いただけると嬉しいです。それでは始めていきましょう。

## Dockerのセットアップ

前回はビルドされたnuxtのファイル（index.html）を表示するstatic serverを立ち上げるところまで実装しました。

今回はDockerを導入していきます。なぜDockerを使う必要があるのかという疑問を持つ方もいると思いますが、端的にいいますと、Dockerを利用することで**プログラムの実行環境を管理し、共同開発者と実行環境を共有しやすくする**というメリットがあります。詳しくは["【図解】Dockerの全体像を理解する -前編-"](https://qiita.com/kotaro-dr/items/b1024c7d200a75b992fc)を参考にしてください。

まず最初に、コンテナの構成情報を定義したDockerfileを作成します。詳しいコマンドが気になる方は["いまさらDockerに入門したので分かりやすくまとめます"](https://qiita.com/gold-kou/items/44860fbda1a34a001fc1#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)を参考にしてください。

```dockerfile:docker/Dockerfile
FROM golang:1.12

# root を docker内の/go/src/github.com/hideUW/nuxt_go_templateにコピー
ADD ./ /go/src/github.com/hideUW/nuxt_go_template

# nuxt_go_template ディレクトリに移動
WORKDIR /go/src/github.com/hideUW/nuxt_go_template
```

次に、Dockerコンテナ内での処理を```docker/docker-compose.yaml```内に記述します。

```yaml:docker/docker-compose.yaml
version: '3'

services:
  app:
    build:
      context: ./
      dockerfile: docker/Dockerfile
    volumes:
      - ./:/go/src/github.com/hideUW/nuxt_go_template
    command: bash -c 'cd /go/src/github.com/hideUW/nuxt_go_template/server && go run *.go'
    ports:
      - "8080:8080"
    container_name: app
```

最後に、```$ docker-compose up -d```を実行し、```docker-compose.yml```からコンテナの生成と起動を行います。

http://localhost:8080/ にアクセスし、前回と同様の画面が表示されていれば、Dockerのsetupが完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182922/25e624df-a28b-7c35-2754-8c98554f5d08.png)

## 終わりに

次回はmysqlのセットアップをしていこうと思います。

## 参考
[@Sekky0905Ks](https://twitter.com/Sekky0905Ks)さん - [nuxt-vue-go-chat](https://github.com/sekky0905/nuxt-vue-go-chat/commits/master)
@kotaro-dr さん - [【図解】Dockerの全体像を理解する -前編-](https://qiita.com/kotaro-dr/items/b1024c7d200a75b992fc)
@gold-kou さん - [いまさらDockerに入門したので分かりやすくまとめます](https://qiita.com/gold-kou/items/44860fbda1a34a001fc1#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)
絶対パスと相対パス

##  パスとはなにか？

パス（Path）とは日本語に訳すと「経路・道」のことを言います。

HTMLコーディングでは、ページをリンクさせたいときや画像を表示させたい時に使います。

表示させたい画像がどこに存在しているのか？の経路を書くのがパスの役割です。

アプローチ方法が「絶対パス」と「相対パス」の２種類あります。

### 絶対パス（absolute path

href属性やsrc属性の値に「http://」または「https://」から始まるURLを書く方法を「絶対パス」と言います。

基本的な用途は、自分のサイト以外（`外部サイトへのリンクを自分のサイトに掲載したいとき`）に使います。

ルートディレクトリという階層構造の頂点から目的地までの経路をすべて省略しないものを「フルパス」と言います。

<u>*絶対に変わることないファイルの住所*</u>のようなものです。

フォルダが保管してある一番上の階層「どのドメインの、どのファイルの中の、どのファイル」をすべて書く必要がありますが、複雑な階層を移動しながら作業していても目的地を間違えにくいです。

階層が深くなるごとにスラッシュを書いて区切りましょう。


### 相対パス（relative path）

ユーザーが現在作業しているフォルダから目的のフォルダまでの経路を言います。

基本的な用途は、`一般的なwebサイト開発`です。

相対パスは同じサーバー内のファイルを読みこむ場合にしか使用できません。

表示したいページから見て「読み込みたいページがどこ」にあるか？を基準としてパスを書きます。

表示したいファイルから見て読み込みたいファイルが上の方にある場合は「../」を書きます。

webで繋がることはないためローカル環境でのテストができます。
SciPyで常微分方程式の数値解を得る

# 1. 概要
`scipy.integrate.odeint`を用いることで、常微分方程式の数値解を得る。

# 2. 問題設定
今回は以下のような微分方程式を題材とする。

2重井戸ポテンシャル $V(x) = - \frac{1}{2}x^2 + \frac{1}{4} x^4$ の中を動く質量1の粒子を考えると、運動方程式は以下の形を取ることが知られている。

```math
\ddot{x} = x - x^3
```

位置 $x$ と速度 $\dot{x}$ の初期値が与えられたとき、解析的に解くことなしに粒子の挙動を知りたいとする。

# 3. 方法
## 3.1. 一階への変形
先述の運動方程式は二階の微分方程式だが、新たな変数 $v$ を $v = \dot{x}$ として定義してやることにより、以下のように一階の形に変形できる。この変形は`scipy.integrate.odeint`を利用する際に重要である。

```math
\begin{eqnarray}
  \begin{cases}
    \dot{x} = v & \\
    \dot{v} = x - x^3 &
  \end{cases}
\end{eqnarray}
```

## 3.2. 実装
まずは必要なライブラリをimportする。ここではJupyter Notebookでのグラフ描画用も含む。

```python
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
%matplotlib inline
```

次に、先ほどの微分方程式をもとに、「従属変数と独立変数を受けて導関数を返す関数」を実装する。従属変数は配列であってよい。今回の例では $x, v$ の時間微分を考えているため、`x, v`の配列を第一引数・時間`t`を第二引数とするような関数を実装する。

```python
def f(y, t):
    x, v = y
    return [
        v,
        x - x**3
    ]
```

ほとんど微分方程式そのままであることに注意。今回は第二引数`t`を使っていないが、強制外力を受ける振動子のように非自律的な方程式を扱う場合には用いることができる。

あとは、考えたい時間ステップと初期値を与えて`scipy.integrate.odeint`を利用するだけ。
今回は時間を0-10で200分割し、初期値は位置が2, 速度0とした。

```python
t = np.linspace(0, 10, 200)
y0 = [2, 0]
result = odeint(f, y0, t)
```

`odeint`の返り値（今回は`result`変数）には数値計算の結果が収められており、`shape`は`(200, 2)`となっている。$x, v$ それぞれについて各step（時間を200分割していた）の値が入っている。

## 3.3. 可視化
`result`変数の中身をplotする。周期的になっていることがわかる。

```python
fig, axes = plt.subplots(1, 2)
axes[0].plot(result[:, 0])
axes[0].set_xlabel("step")
axes[0].set_ylabel("x")
axes[1].plot(result[:, 1])
axes[1].set_xlabel("step")
axes[1].set_ylabel("v")
```

![スクリーンショット 2019-05-20 7.25.01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58850/191e2ef8-c764-414e-8a9d-5a03dd9181ef.jpeg)

本筋とは関係ないが、ついでに`streamplot`を行ってベクトル場を可視化してみよう。横軸・縦軸に $x, v$ をとり、エネルギー $E =  \frac{1}{2} \dot{x}^2 - \frac{1}{2} x^2 + \frac{1}{4} x^4$ で色分けした。軌道はエネルギーの等高線になることが知られている。

```python
w = 3
Y, X = np.mgrid[-w:w:100j, -w:w:100j]
U = Y
V = X - X**3

E = 0.5 * Y**2 - 0.5 * X**2 + 0.25 * X**4

plt.streamplot(X, Y, U, V, color=E)
```

![スクリーンショット 2019-05-20 7.33.36.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58850/ba00a9b3-0c32-5db3-1a78-0504af5038ef.jpeg)


# 4. 参考
- ストロガッツ 非線形ダイナミクスとカオス (p177)
- [scipy.integrate.odeint](https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.odeint.html)
- [Streamplot - Matplotlib](https://matplotlib.org/gallery/images_contours_and_fields/plot_streamplot.html)
Rails チュートリアル 第13章　学習内容のメモ

# 第13章  ユーザーのマイクロポスト

# ビューの表示ができない？？
- `render @microposts`でエラーが発生していた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353542/bd600b0f-455f-255b-885e-aa998abb0097.png)

- マイクロポストのパーシャルが取得できていない？？
- かなり時間を消費したが、パーシャル名のファイル名を間違えるという凡ミスだった`app/views/microposts/_microposts.html.erb`
⬇︎
`app/views/microposts/_micropost.html.erb`

# Linuxの操作
- ファイルのパーミッションを調べる→`ls -l`
- ファイルのパーミッション変更`chmod [パーミッション] ファイル名`
| 数字 | アルファベット| 権限 |
|:-----------|------------:|:------------:|
| 4 | r | 読み取り |
| 2 | w | 書き込み |
| 1 | x | 実行 |

# AWSの設定
以下を参考にした
[S3: バケットポリシーで特定のアカウントに対して参照可能にする - aws memo](http://understeer.hatenablog.com/entry/2013/03/27/182015)
[S3で誤ったデータの公開を防ぐパブリックアクセス設定機能が追加されました ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/s3-block-public-access/)
人の手による自動コードレビューでコードのベストプラクティスをだそう。

こんにちは、[入江](https://twitter.com/)です。
個人のスキルシェアサービス[MENTA](https://menta.work/)というサービスをつくっています。

## 突然ですが、あなたには自分が書いたコードをチェックしてくれる人はいますか？

僕はいま、自分で会社をつくってサービス開発をしているのですが
サラリーマン時代、社内には僕しかエンジニアがおらず、
フリーランスになってからも当然一人なので**コードをみてくれる人がいませんでした**。

しかし、ここ数年になってリモートワークで何人かのエンジニアさんとチームを作り
開発をしてきたなかで、コードレビューをしたり、されたりしてきました。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72150/d788c27e-c1f8-eabd-0499-0fa3239a4ae6.png)

## 結論、コードレビューは最高にいいです。

自分では当然と思って書いていたコードが
**実はもっとシンプルに実現できたり、メンテナンス性の高い書き方を教えてもらったり。
人のコードをみることで、学べることばかりでした。**

気づかせてもらったコードをきっかけに調べていって
もっといい書き方があるかな？と考えてみたり、**「自分以外の人がみる」ので、
コードを書く時にいい緊張感がでてきました。**

ある程度実践をこなしていったエンジニアがさらにスキルアップするために
人が書いたコードを見て学ぶのは最適です。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72150/5fc4d2d2-3e97-cb76-26d0-5d74220fe15b.png)

とはいえ、まわりにレビューをしてくれるエンジニアさんがいない、
というケースも多いですよね。

そこで、そのような機会をオンラインでつくるべく
僕がつくっているスキルシェアサービス[MENTA](https://menta.work/)で
コードレビューをしてくれるメンターだけを集めた特集をつくろうとしています。
なにより、僕もつかいたい。

## だれがレビューするの？
この記事をみてくれているあなたにお願いしたいですm(__)m

MENTAでは個人がプランをつくることができます。
・月●時間以内まで、もしくはコード量で上限時間をつくる
・週1回くらいを目処にその週に開発したコードをみて、気がついたことをレビュー
もしくはプルリクエスト単位でレビュー。
（コードレビュー・プランの条件は各エンジニアさんが決める）

教える方も自分のスキルを活かした副業になるのはもちろん
人のコードをみてつっこみいれるというプロセスも、レビュワーのスキルアップにつながります。
プランをつくってみませんか？

## コードレビューをするまでの流れ
1.利用者がMENTAで自分の開発している言語、求めているスキルのメンターをさがす
2.メッセージを送って条件などを確認する
3.MENTAで契約する（月額1-3万程度を想定）
4.個別にNDA（機密保持契約）をクラウドサインなどで結ぶ
5.毎週、プルリク単位もしくはコミットをみてレビューしてもらう
の繰り返しで**自分が書いたコードを客観的にレビューしてもらえる環境が整います。**

### コードレビューをやりたいエンジニアさんへ
MENTAに登録して、プラン編集画面のタグに「コードレビュー」を設定して
料金プランをつくってください。[特集ページ](https://menta.work/plan?tag=397)に表示されるようになります。

[MENTA](https://menta.work/)にて、オンラインで個人同士でレビューしあえる環境をつくっていきたいです。
![687474703a2f2f6c67746d2e696e2f702f3674394643744c5470.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72150/3a32a52b-6fcf-7feb-5306-cbb2df73889d.jpeg)
Laravelでtouchコマンドが使えないときの解決法【Windows】

Laravelでマイグレーションする際に、デフォルトのWindowsではtouchコマンドが使えなかったので、使えるようにしました。


## 作業環境
自分の環境は以下の通りでした。

- Windows10
- laravel5.8
- php 7.3

## 解決法：npmでtouchコマンドを使えるようにする
まず、下準備としてnode.js（npm）をインストールしなくちゃいけません。
下記の記事は比較的新しめの情報で尚且つわかりやすいので、参考にするといいでしょー↓

[Node.js (npm) をWindowsにインストールする](https://blog.y-yuki.net/entry/2018/11/11/113000)
※node.jsをすでにつかっている方は、スキップしてOKです。

では、以下のコードをコマンドプロンプトで実行してみます。

`npm install touch-cli -g`

↓実行結果
![2019-05-20_04h07_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415222/2bc4eb6e-34af-9f4e-1c3f-1152639b2394.png)


これで無事にtouchコマンドがWindowsでも使えるようになりました。

例えば、Laravelでデータベースファイルを作成するときに、`touch database/database.sqlite`という感じで使えるので便利です。



今回のお話は、Laravelを例にしましたが、他の言語でも当てはまるかと思います。

誤りがありましたら、ご指摘していただけると幸いです:grin:
はじめに

#自己紹介
はじめまして．
ヒューマンインターフェースを主に研究している修士課程のものです．
現在の主な研究領域，勉強中の領域は以下の通りです．

- User Interface ( TableTop System, Pointing User Interface )
- Brain machine interface 
- Virtual Reality
- Machine Learning



#今後の投稿に関して
大きく２つあります．
##論文紹介
これから，研究を行う上で読み進めた論文について
要約を投稿していきます．
扱う内容は，主に **User Interface**および**Brain machine interface** に関する要論文が主になります．
絶対に読むべき論文には！！マークをつけて明示します．
##実験や趣味等で調査した手法や処理の紹介
分野は脳機能から画像処理，検定など多岐にわたります．
研究で関わったものに関して紹介していきます．
3D空間上の範囲をPixelで指定する。



![May-20-2019 01-36-05.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/940642f2-ebd5-d5ab-e2e4-f35e50363bf8.gif)

<img width="329" alt="スクリーンショット 2019-05-20 1.38.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/c2ee01f5-d111-432a-9912-69780e541eec.png">


NGUIのWidgetのように範囲を指定する機能を最小限で作りたかったので作成

SpriteRendererとは別に範囲を設定するに使えるんじゃないかと思います

```Rectangle.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#if UNITY_EDITOR
using UnityEditor;

[CustomEditor(typeof(Rectangle))]
public class RectangleEditor : Editor{

    SerializedProperty pixelsPerUnitProperty;
    SerializedProperty boundsProperty;

    Rectangle rectangle;

    void OnEnable()
    {
        rectangle = target as Rectangle;
        pixelsPerUnitProperty = serializedObject.FindProperty("pixelsPerUnit");
        boundsProperty = serializedObject.FindProperty("bounds");
    }

    public override void OnInspectorGUI(){
        serializedObject.Update();
        EditorGUILayout.PropertyField(pixelsPerUnitProperty);
        using(new EditorGUILayout.HorizontalScope()){
            GUILayout.FlexibleSpace();
            var oldLabelWidth = EditorGUIUtility.labelWidth;
            EditorGUIUtility.labelWidth = 20;
            int oldWidth = (int)(rectangle.bounds.size.x * rectangle.pixelsPerUnit);
            var width = EditorGUILayout.IntField("W", oldWidth, GUILayout.MaxWidth(100));
            int oldHeight = (int)(rectangle.bounds.size.y * rectangle.pixelsPerUnit);
            var height = EditorGUILayout.IntField("H", oldHeight, GUILayout.MaxWidth(100));

            if(width != oldWidth || height != oldHeight){
                rectangle.bounds.size = new Vector3(width, height, 0f) / rectangle.pixelsPerUnit;
                EditorUtility.SetDirty(rectangle);
            }
            EditorGUIUtility.labelWidth = oldLabelWidth;
        }
        serializedObject.ApplyModifiedProperties();
    }
}
#endif

public class Rectangle : MonoBehaviour {
    public Bounds bounds;

    public int pixelsPerUnit = 100;

    /// <summary>
    /// Callback to draw gizmos that are pickable and always drawn.
    /// </summary>
    void OnDrawGizmos () {
        Gizmos.color = Color.red;
        Gizmos.DrawWireCube (this.transform.position + bounds.center, bounds.size);
    }
}


```
【macOS Mojave】ChromeのみダークモードをOFFにする。

macOS MojaveのダークモードはカッコいいけどChromeのシークレットモードとパッと見の区別が付かないので、以下をターミナルで実行してChromeのみダークモード解除。

```defaults write com.google.Chrome NSRequiresAquaSystemAppearance -bool YES```
Vue.jsって何だろう

# Vue.js って何だろう

## 背景
最近フロントエンジニア界隈でよく耳にする「vue.js」って何だろう？
と思ったので簡単に纏めてみましょう。

> 「時代はバックエンドからフロントエンド」  

Webアプリケーション開発における要はユーザと実際にやりとりするフロントエンドだ！
このフロントエンド開発アプリケーションの1つとして昨今注目されるのが vue.js。
Nuxt.jsというVue.jsを更に拡張させたフレームワークの利用が主流（諸説あり）らしい。

## 特徴

### リアクティブプログラミング

Vue.jsは、データが更新されるたびに自動的にそれらのデータを利用している画面の表示も更新される。  

### コンポーネントシステム

再利用可能な部品で構成され、機能を実装している。
このコンポーネントを配置することで自動的に必要な表示や処理がなされる。

### テンプレート

HTMLベースのテンプレート構造が用意されており、中身の複雑な処理を理解すること無く、HTMLの延長線上の様な感覚で記述し利用できる。


## 終わりに

Vue.jsの特徴を簡単に纏めてみた。
次回の記事で実際に触ってみることにする。
仕事してなかったら通知するスクリプトを作った

## はじめに
都内でエンジニアしている[@emono](https://twitter.com/emono_dev)といいます。
エンジニアにとって**仕事をしている**とはなんだろうとふと考えました。

`営業` は**顧客からプロダクトを購入**してもらうことだろうし、
`マーケター` は**数字を伸ばす**ことだろうし、
`エンジニア` は**コードを書く** ことだと思います。

正確にはコードを書く以外にも、reviewをしたりissueを上げたりすることも含めて可視化して、
仕事をサボっていたら通知するようと思いました。

ってことでgithubのcontribution数（いわゆる草）を確認して少なかったら通知するようにすることにしました〜
作った最終型は[こちら](https://github.com/emono/no-job-alert)

contribution数については、下記参照
https://qiita.com/sta/items/2c1f0252a6a9ce5e2087
https://qiita.com/ryosuketter/items/2f0152b32007ac8351f3

## contribution数の確認方法について

- https://github.com/users/ユーザ名/contributions で確認できる
- 下記のhtml要素をparseすれば、確認できそう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116518/baef4304-fd60-63e5-ed27-f4738bf44f1e.png)
- ということでライブラリを作った（仕事でrubyを使っているのでrubyのGem）
    - [github](https://github.com/emono/contribution_count)
    - [使い方メモ](https://qiita.com/emono/items/c3c9209d5c2dde1b1721)

```rb
# contribution数が0より大きいかどうかを判断する
ContributionCount.new(name).contribution_today?
=> true
```

## ということで実装
- 要件は以下
    - 当日のcontribution数が0のときに通知する
    - 通知はslackのwebhookを使う

```rb
# slack通知する
require 'slack/incoming/webhooks'
# さっき作ったcontribution数を確認するgem
require 'contribution_count'
message = '仕事しろ'
github_name = "emono"
# contributionしているか判断
if !ContributionCount.new(github_name).contribution_today?
  Slack::Incoming::Webhooks.new(ENV['SLACK_WEBHOOK_URL']).post(message)
end
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116518/1213ec32-8d68-38c1-a4f9-788a598d737c.png)

すいませんでした・・・
Amazon Alexaのスキルをノンコーディング(Alexa Skill Blueprint)

Alexa Skill Blueprintsは、テンプレートを使って独自のAlexaスキルを数分で作成できます。
テンプレートには、QAや単語帳、グリーティングカードなどがありますが、作ったもの長く使うというよりは、単語帳のように単語を日々追加・更新していったり、グリーティングカードのように送っって終わりのように使い捨てたりと、通常のスキルとは違った使い方になるものが多いようです。
したがって、如何にお手軽に使えるかがBlueprintsを使う上でのキモになるかと思います。

# スマホでスキル作成ができるのか？
`https://blueprints.amazon.co.jp`をスマホのブラウザで開くと、しっかりスマホの画面が表示されました。
スキルを更新したい時に、いちいちPCをたちあげなくて良さそうです。

| PC | スマートフォン |
|:-:|:-:|
|<img width="1259" alt="スクリーンショット 2019-05-20 0.22.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393858/d4b55659-9297-5b9a-4064-5339fb50cb41.png">|![Screenshot_20190519-200542.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393858/5db976d8-6199-25ab-ac0e-4440fa2ccd1e.jpeg)|



# デプロイまで
[Amazon Alexaのスキルをノンコーディング(Voiceflow)](https://qiita.com/drafts/40685b9656b61fb0bf0f/edit)と同じ事をしてみたいと思います。
こちらが聞いた事に対してAlexaが答える形式なので「カスタムQ＆A」をテンプレートにして作りました。
下記の左から右に５つの画面遷移を行えばスキルが使えるようになります。
何も悩む事なく完成します。

|テンプレートを選んで|作り方を読んで|質問と回答を入力して|デプロイして|完成|
|:-:|:-:|:-:|:-:|:-:|
|![Screenshot_20190519-200633.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393858/794b4ded-74c4-b78c-6803-920e921ee235.jpeg)|![Screenshot_20190519-200712.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393858/a441df93-e0e7-c840-6196-9bcbd07e955b.jpeg)|![Screenshot_20190519-200747.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393858/7941b5c6-f5c6-2087-ded5-7a30e519ea28.jpeg)|![Screenshot_20190519-200758.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393858/7db5da78-7886-ccf8-879f-6007abd892c8.jpeg)|![Screenshot_20190519-200811.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393858/76b96159-78ab-f0da-29a2-9ec96e754756.jpeg)|

# おわりに
Skill Blueprintで作成できるスキルは、かなり限定的な使い方になると思いますが、強力な開発環境？のおかげで、思いついたら悩んだり考えたりせずすぐに作る事ができます。
テンプレートという制限があるからこそ、誰も思いつかないようなテンプレートの使い方でスキルを作ってみたいなあ。なんて思ったりしてます。
【Qiita】Teamを作らず他の人に記事を書いてもらう方法【裏ワザ】

# おことわり
表題には「裏ワザ」という大袈裟なことが書かれていますが、これから書くことは当たり前のことを書いています。ご期待に沿えない内容になるかもしれませんがご了承ください。

# どうやるの？
`MDファイル`を作ってもらって送ってもらえばイイんです。以上！
`Markdown (マークダウン)` とは、文書を記述するための軽量マークアップ言語のことで、Qiitaの記事も`Markdown`の形式ですので、事前にMDファイルで作っておいてその内容をコピペすればイイんです。

# 具体的にどうやるの？

- 新規テキストファイルを作成して拡張子をmdに変更する
- `VSCode(Visual Studio Code)`で作成した`MDファイル`を開く
- プレビューを横に表示しながら記事を書いていく

上記の方法でmdファイルを気軽に作れます。`Markdown`がわからない〜っていう人は、最初によく使う記述方式を記載しておいて保存しておけばイイです。いわゆるテンプレートや雛形ってカンジです。ちなみに過去の記事を`VSCode`で開いた画像です。

![2019-05-20 00_49_27-Greenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/c44513f1-8c31-cc0f-1acb-9a2942dbdbd4.png)



# 図などはどうするの？
始めは画像ファイルも`MDファイル`と同じフォルダに入れてもらって参照してもらうカンジでイイのではないでしょうか。Qiitaにコピペするときに画像のパスをQiitaのモノへ変更するのはダルいですが。
画像のパスを変更したくない人は、Googleドライブなどのクラウドストレージで公開しても良いフォルダを作って、そこに画像を入れてパスを参照すればイイと思います。

# なぜこんなことやっとるん？
Teamを作成して書いてもらうのが一番ですが、誰が記事を書いたかということは重要ではなかったカンジです。勉強会の活動記録などを単純に記録を残したいということが重要で、マークダウンで記述するスタイルが一番手軽だと思いQiitaを使うことにしました。最初はマークダウンで手軽で書けることにメリットを感じて、上記の方法については後付で形式化したカンジです。
（当初は`Google Slide`やスライドを作ってもらったり、ブログなどの共同編集も検討していました）

# 理想的な仕組み
QiitaのAPIで記事内容をブン投げて下書き保存までできる仕組みが理想的です。下書きまでで最終的には代表者がチェックしてから投稿できればイイですね。GITでいうところのプルリクエストを投げるような感覚でできればハッピーです。
ただ、このAPIの口を作るのにお熱になって本来の活動が疎かになると本末転倒なので、とりあえずは手でマークダウンを書くカタチでイイのかなと思います。もしAPIの仕組みを作るなら以下のような形で作ればイイかなと思います。

- APIを投げる口：SlackのWebhook 等
- APIから受け取ってQiitaに突っ込む：Node.js（無料でやるならGlitch?）
- 画像を格納するクラウドストレージ：Google クラウド　等

画像用ストレージが必要そうなのは、JsonデータのBodyで文章を送るときに画像のパスは設定されている必要があるかなと思いました。Qiitaに画像をアップロードした場合、アップロードしてからAWSのリンクが表示されるので、それを事前に取得することは難しいのかなと。

# 【結論】結局何がメリットになるの？
上記の手法を取ればいろんな人に活動内容を書いてもらうことができます。これまでは勉強会で作成していたレポートや資料などは個人で作成していたため何かしら負荷を分散できればと考えてみました。
技術的な記事を個人のアカウントで集約するのは微妙ですが、勉強会の活動内容くらいだったらアカウントで集約しても大丈夫かなと思っています。ちなみにこれまでの`AZML`タグで投稿した内容は、まだ`一人`で書いているので、来月あたりからはその日に書いてもらうようにしないなと・・・。
Power BI勉強帳：ワークスペース作成権限と新しいワークスペース

Power BIサービスで、「**ワークスペースを作成しようとしたら、権限がなくてできなかった**」という場合があります。

そういうとき、テナント管理者（多くの場合、社内の情シス部門かと思います）に、ワークスペース作成権限を振ってもらうか、あるいは代わりにワークスペースを作成してもらう必要があります。

しかし、テナント管理者がPower BIの機能に必ず明るいわけではなく、公式の説明も該当箇所がややわかりづらかいと思ったので、書いておきます。

####公式情報はこちら
管理ポータルでの Power BI の管理
https://docs.microsoft.com/ja-jp/power-bi/service-admin-portal

##Power BI管理ポータル
Power BIのテナント管理（その組織内での様々な設定）は、「Power BI管理ポータル」で行うことができます。ワークスペースの作成権限も、ここで設定します。

####Power BI管理ポータルへのアクセス権限
Office 365 のグローバル管理者か、「Power BI 管理者ロール」に割り当てられたユーザーがアクセスできます。

####Power BI管理ポータルへのアクセス方法
Power BIサービスの右上のアイコンをクリックし、「管理ポータル」を選択すると、Power BI管理ポータル画面が開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221646/37ac11f8-2cc5-a87c-cb7d-a842dbfe4245.png)

##ワークスペースの作成権限を設定する箇所
管理ポータルの中の、「**テナント設定**」＞「**ワークスペースの設定**」の項にあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221646/ded96812-d1a0-75ee-a2cc-e446a57391d5.png)

####選択肢

- 組織全体…その組織全員に権限を与える（Proライセンス付与の方）
- 特定のセキュリティグループ…指定したセキュリティグループに含まれるユーザーに権限を与える
- 特定のセキュリティグループを除く…指定したセキュリティグループに含まれないユーザーに権限を与える

テナント管理者へお願いする選択肢としては、

1. Proライセンス持っている人全員が自由にワークスペースを作成できるようにしてもらう
2. 特定のユーザーのみワークスペースを作成できるようにしてもらう
3. 情シス部門が都度ワークスペースを作成し、その編集権限をユーザーに振ってもらう
4. Power BI管理ポータルの権限を振ってもらう（ご自身が社内のPower BI利用を統括される場合）

ということになるかと思います。

##ワークスペースについての注意点
ワークスペースには、**新しいワークスペースとクラシックなワークスペースの2種類があり、できることが違うので注意が必要**です。
新しいワークスペースは現在進行中で進化していて、日本語と英語で公式情報の内容が異なります。（英語の方が新しく、現在の仕様と合っているようです）

**日本語**
https://docs.microsoft.com/ja-jp/power-bi/service-new-workspaces
**英語**
https://docs.microsoft.com/en-us/power-bi/service-create-the-new-workspaces

この記事を書いている現在は、すでに新しい方がデフォルトになっているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221646/f88c55de-dea0-8458-a98e-683ee8282eee.png)

###Office365グループに関する違い
新しいワークスペースは、Office365グループを自動的に作成しませんが、クラシックなワークスペースは、自動的にOffice365グループを作成します。
どちらを使うかで、テナント管理者とのお話し合いも変わってくるかと思います。

###機能の違い
クラシックなワークスペースに存在した機能のうち、新しいワークスペースではまだ対応していないものがいくつかあり、順次実装されていっているようです。

日本語と英語の公式情報で説明に差があるのですが、英語の方が現状に合っていると思われます。例えば、「利用状況の指標」（レポートへのアクセス情報の取得）は、私の使用環境では使えるようになっていました。

状況が刻々かわるので、使いたい機能が使えるかは、事前にテストしてみた方が無難と思われます。
Composerでautoload.phpを作成する


##Composerでオートローダを作成する方法

```:ディレクトリ構成

composer.json
src/
  index.php
  bar/
    Hoge.php   ... foo\bar\Hoge クラス
```

```json:composer.json
{
    "autoload": {
        "psr-4": {
            "foo\\": "src"
        }
    }
}

```
＊composer.jsonの記述は場合によってことなります。
https://qiita.com/suin/items/b31e3c5bff15c821ccaa

コマンドラインでcomposer.jsonが置いてあるディレクトリに移動し
コマンドを実行

```
composer dump-autoload
```

vendorが生成される

```
composer.json
vendor/
  composer/
  autoload.php
src/
  index.php
  bar/
    Hoge.php   ... foo\bar\Hoge クラス
```

autoload.phpを読み込む

```php:index.php
<?php
use foo\bar\Hoge;

require_once __DIR__.'/../vendor/autoload.php';
```

#参考文献
[Composerのautoloadの書き方早見表](https://qiita.com/suin/items/b31e3c5bff15c821ccaa)

[PHP開発でComposerを使わないなんてありえない！基礎編](https://qiita.com/niisan-tokyo/items/8cccec88d45f38171c94)
Kotlin Coroutineのdelay()をユニットテストのときだけ待ち時間なしで実行する

`delay()`を使ったコードのテストを実行すると、その設定時間だけ待たなきゃいけなくて辛いです。

``` Kotlin
class MyPrettyStopwatch(
    override val coroutineContext: CoroutineContext = Dispatchers.Default
) : CoroutineScope {

    var keikaByou: Int = 0
        private set

    private var job: Job? = null
    fun start() {
        stop()
        keikaByou = 0
        job = launch {
            while (true) {
                println("$keikaByou byou")
                delay(1000)
                keikaByou += 1
            }
        }
    }

    fun stop() {
        job?.cancel()
        job = null
    }
}
```

``` Kotlin
class MyPrettyStopwatchTest {
    @Test
    fun realtimeTest() {
        runBlocking {
            val stopwatch = MyPrettyStopwatch()
            stopwatch.start()
            delay(3100) // おっそ！
            Assert.assertEquals(3, stopwatch.keikaByou)
        }
    }
}
```

そんなときは[TestCoroutineDispatcher](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/-test-coroutine-dispatcher/index.html)を使います。

## dependencies

```build.gradle
dependencies {
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.1'
    testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.2.1'
}
```

`TestCoroutineDispatcher`は`kotlinx:kotlinx-coroutines-test`の`1.2.1`以降(2019/5/20現在の最新版)に入ってます。

## 使い方

```Kotlin
class MyPrettyStopwatchTest {
    @ExperimentalCoroutinesApi
    @Test
    fun useTestCoroutineDispatcher(){
        val dispatcher = TestCoroutineDispatcher()
        val stopwatch = MyPrettyStopwatch(dispatcher)
        stopwatch.start()
        dispatcher.advanceTimeBy(3100) // すぐに実行されてえらい！
        Assert.assertEquals(3, stopwatch.keikaByou)
    }
}
```

## その他

[kotlinx-coroutines-test](https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-test/)には他にもコルーチンのテストのためのユーティリティが揃ってます。

- suspend関数をテストするのは`runBlockingTest`が便利そう。
- `Dispatchers.setMain()`で`Main` dispatcherを切り替えられる。
【Visual Studio Code】クリップボードに文字列だけを貼り付ける設定方法

皆さん、こんにちは。戸倉彩です。

Visual Studio Code (以下、VS Code)で編集しているコードを、何か別のエディタやメールなどにコピペして貼り付けた時に、もれなく背景も一緒にコピーされてしまい困ったことはありませんか？
<img src="https://iq7zmq.by.files.1drv.com/y4mnzH3lOYZrHa8l4P3zA9HF0m38geBzR3VZ2Uvm_6hPaFskOELN9Z-dHw5NrD8UQ56BDcK1R_p1p2-7wgEmAkMs_tkSeByDw3MMWbvE8UuS05gkz6ymvcxWMRa005UvHQIJVhnqEi_R4dxVaQf-5vXc1r7szMoxFIXhc6ov3NosX1-rpNgWet9g3p-Htsplm93WOqIwpC0XrfXQWzI7TWCKg?width=1554&height=968&cropmode=none" width="600">

これはVS Codeのバグではなく、デフォルトの設定によるものです。ですので、**「設定」** を変えることで文字列だけをクリップボードにコピーできるように手動で設定しておくことで回避できます。頻繁にテキストベースのコピペ作業を行いたい方は設定しておくと良いでしょう。

1. VS Code で**「設定」**を開く。
2. 検索ボックスで**「クリップボード」** もしくは **「copyWithSyntaxHightlighting」** を検索する。
3. 「Editor: **Copy With Syntax Hightliting**」の**「構文ハイライトをクリッップボードにコピーするかどうかを制御します。」**チェックボックスのチェックを外す。
<img src="https://iq7ymq.by.files.1drv.com/y4mheScQAcQ15ZFd6cQ_07MS_6Fio_hL1Fn9sIZuNzmMNBD0vA0ZjO4cFFMekmGp0nvty9-XAXFxh7y-mWFsAm7iO8akH36IeP8KoCpbMjsgkdA7A52q_JCEj-GzKb1MmPdhh8pcOxjl7JofPwRQl1IXqiWpHlD_HlTWcmp9HAkQQlbRIssxgto_A-CRIgqhqGVUp7HdWKGczTPd-QioiVEvA?width=1892&height=1076&cropmode=none" width="600">  
設定は以上です。  

再びコピペを試してみましょう。
<img src="https://gv6wdg.by.files.1drv.com/y4mjyBqI2K2ctuudZiwN0piTMEe0VdcnO91drrvPwIgJ8Bae6ZxJghUjUgfSnPVeSyzI70OFFuCe9TsPNdaAGYRN5U1iXfwSemYl3vrOP8CjiXuweJuZ9PuyFzEvhxZdFndhlBM-gUpiFYwyPR1aT6Wt2B_sGb8aNknVLKbdNS6lZSh9inO-G4-AduHqQ1g4pyNZ7oKK8AnD9hU2-1ZCbG9AQ?width=1574&height=988&cropmode=none" width="600">

設定が反映されていることが確認できたら成功です。

### 参考動画
[Microsoft Build 2019 - Visual Studio Code Tips and Tricks](https://mybuild.techcommunity.microsoft.com/sessions/77039?source=sessions#top-anchor)

Have a nice Geek Life♪

※Twitterで最新情報配信中 [@ayatokura](https://twitter.com/ayatokura)
GASを使ってGoogleカレンダーの内容をLINEに送る方法（今日の予定編）

#用途
今日の予定を手軽に確認するために、LINE notifyを使ってユーザに通知する

#用意するもの
LINEアカウント
Googleアカウント

#1：LINE notifyでトークンをメモっておく
https://qiita.com/iitenkida7/items/576a8226ba6584864d95

#2：GoogleカレンダーのIDをメモっておく
http://www.sukicomi.net/2018/07/google-calendarid.html

#3：Google Apps Scriptでコーディング

```send.gs
function myFunction(){
　var myCal = CalendarApp.getCalendarById("ここにGoogleカレンダーのIDを入れてね");
　
　//今日の予定一式がここで取れるよ
　var myEvents = myCal.getEventsForDay(new Date());
  
　//予定が見つからなかったら何もせず処理を終えるよ
  if(myEvents.length == 0){
    return;
  }
　
　//sendTextに文字列が加筆されていくようにする
　var sendText = "今日の予定だよ\n";
  for(var i = 0; i < myEvents.length; i++){
    var title = myEvents[i].getTitle();
    var startTime = Utilities.formatDate(myEvents[i].getStartTime(),'JST','HH:mm');
    var endTime = Utilities.formatDate(myEvents[i].getEndTime(),'JST','HH:mm');
　　
    if(startTime != endTime){

　　　//開始時刻と終了時刻が決まっていれば「10:00～12:00：○○をする」
      sendText += startTime + "～" + endTime +"：" + title + "\n";

    }else if(startTime != "00:00"){

　　　//開始時刻だけ決まっていれば「10:00～：○○をする」
      sendText += startTime + "～：" + title + "\n";

    }else{
　　　
　　　//開始時刻がなければ「○○をする」（タイトルだけ）
      sendText += title + "\n";
    }
  }

　var token = "ここにLINE notifyトークンを入れてね";
  var opt = {
    "method" : "POST",
    "payload" : "message=" + sendText,
    "headers" : { 
      "Authorization" : "Bearer " + token
    }
  };
  UrlFetchApp.fetch("https://notify-api.line.me/api/notify", opt);
}
```

#4：試してみよう

![qiita4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420117/156616ce-acac-707c-1da5-6ceae880d295.jpeg)

↓

![qiita5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420117/089527af-4654-f0ad-db30-de34c5df11b4.jpeg)


できたね。

#5：定刻発信できるように設定する
https://vba-gas.info/gas-trigger

#備考：iCal形式のURLを登録したカレンダーも通知可能
セクション2で取ってくるIDのパターンが違うだけ。「○○○@import.calendar.google.com」となってるはず。

#終わりに：コーディングの発端と今後の可能性
私が所属する会社が自前でスケジュールソフトを作った。リマインダー機能もあるんだが、リマインドメールの送り先が会社のアドレスとなっていた。
どうにかして手持ち環境へ送れんものかと考えたのが始まり。
そのスケジュールソフト、iCal連携OKになっていたのでいろいろ調べ回りながらコーディングしてみたらあっさりできた。といっても40分くらいかかったけどね（一番時間かかったのは、LINE通知のヘッダー定義で誤字を見つけるのに15分くらい）

今は日時バッチ化してる都合上スケジュール確認は1回しかしない。まだうっかり忘れの可能性が残ってるので、「ちゃんとしたリマインダー（10分前通知）」とかできるようにしようと思う。

※　リマインダーできたので記事作成中・・・　※
できたよ
https://qiita.com/watarimaycry2/items/3f977321434f2749ad87
【SEO】Qiita記事の「view」と「いいね」数を増やす方法とは？

結論から言うと、やることはもの凄く簡単で、公開している自身のQiitaの**記事タイトルを書き直すだけ**です。

どう書き直すかと言うと、その記事の大元のテーマになる技術や言語、サービスの名前をタイトルの一番前にラベル形式で入れます。

- Pythonについての記事であれば、`【Python】`をタイトル頭に
- AWSについての記事であれば、`【AWS】`をタイトル頭に

といった具合に。
具体的に例をあげると以下のような形になります。

#記事タイトルのリライト例

:worried: 悪い
RubyとJavaScriptの正規表現では複数行モードの意味が違う

↓↓↓↓

:smiley: 良い
**【正規表現】RubyとJavaScriptでは複数行モードの意味が違う**

※「正規表現」というテーマの中でRubyとJavaScriptでの違いを説明するので、タイトル一番前に明示しておく。

---

:worried: 悪い
[Python]Pythonでジュリア集合を描く

↓↓↓↓

:smiley: 良い
**【Python】ジュリア集合を描く**

※タイトルに2回以上、キーワードが出現するのはくどい。ラベル形式で1回で十分。

#記事タイトルをリライトするとどういう効果があるのか？

単純に、**SEOでの効果UP**が見込めます。「技術や言語、サービス名」掛け合わせのクエリに対しての順位に強くなるでしょう。
またラベル形式にすることでクリック数も上がりCTRが向上します。

さらに掛け合わせクエリに強くなることで、検索者の目的達成への貢献ができ、「いいね」をもらえる可能性も上がるかと。

SEOの専門的な視点でこれ以上、複雑なことは言いませんが、一つだけ言うするなら、
タイトルを見ただけで記事の中身を想像できるようにするのはユーザーにとってもクローラーにとっても大切だということ。

#最後に〜なぜ記事を書くのか？〜

そもそも、あなた方は何の為に記事を書いてるのでしょうか？

- 自分用のメモとして書いている
- 「バズる」らせることで有名になりたい
- etc

様々なライティング意欲がそこには存在するのでしょう。
ただ多くの人に共通するのは、自身の失敗や成功を記事として人に伝えることで、それを次の成長や挑戦への糧にして欲しい思いがあることではないでしょうか。

とするならば、**SEOライティング**によって、検索者に対して最適化された記事品質にするというのは当然の行為です。
[JavaScript]URLパラメータを継承しつつスマートフォン用のページへリダイレクト


PC用のURLからスマートフォン用のページへリダイレクトさせる際に、URLパラメータを継承したまま遷移する方法の備忘メモになります。

リダイレクト元に下記のコードを追加することで実現できます。

## 仕様

- PC→スマートフォンページへのリダイレクトを想定
- 同一ドメイン内のページに遷移するものとする
- 同一のパラメータを継承するものとする
- スマートフォン判定は、ユーザーエージェントもしくはウィンドウの横幅を基準にする



## コード

リダイレクト元、今回の場合はPC用ページに以下のコードを追加します。


```javascript
(function(){
  let domainRoot = window.location.protocol + '//' + window.location.host;
  let parameter = document.location.search;
  let windowWidth = window.innerWidth;
  let bp = 750; // ブレイクポイント

  if(navigator.userAgent.match(/(iPhone|iPad|iPod|Android)/i) || windowWidth <= bp){
    location.replace(domainRoot + '/sample.html' + parameter); // リダイレクト先
  } // if
}());
```

- 5行目の ```bp``` という変数でリダイレクト対象となるウィンドウ幅を指定します。
- 8行目の ```sample.html``` をリダイレクト先に直せばOKです。



ブレイクポイントを指定するので、 ```userAgent``` でモバイルデバイスの指定漏れがあったとしてもウィンドウ幅から判定して遷移させています。
今後モバイルデバイスがどのように多様化していくか分からないので、ユーザーエージェント（userAgent）だけで指定するのは無理があると思うからです。

簡単なコードになりますが、参考になりましたら幸いです。
Django で Models.py の ER図をPDF化

# 概要

django-extensions の graph_models を使って Models.py から ER 図を PDF形式 で出力

# 環境

* Windows 10 Latest
* Powershell Latest
* python 3 Latest
* Miniconda 3 Latest
* django 2.2

# 前準備

condaでPythonパッケージをインストール

```posh:AnacondaOnPoweshell
conda install pygraphviz
conda install pydotplus
conda install django-extensions
```

※[Windows Terminal に Anaconda Powershell Prompt を追加する](a50c6467bdb77548fd81.md)ことができるので、そこでこのコマンドを実行しています。

Django プロジェクトの settings.py で INSTALLED_APPS に追加

```python:settings.py

INSTALLED_APPS = [
    # INSTALLED_APPS

    'django_extensions',
]
```

# コマンド

例1

```posh:AnacondaOnPoweshell
python manage.py graph_models -a -g -o graph-model.pdf
```

例2

```posh:AnacondaOnPoweshell
python manage.py graph_models auth -I User,Group
```

例3

```posh:AnacondaOnPoweshell
python manage.py graph_models auth -g -o graph-model-auth.pdf
```

※[Windows Terminal に Anaconda Powershell Prompt を追加する](a50c6467bdb77548fd81.md)ことができるので、そこでこのコマンドを実行しています。

# 出力形式

* png, jpg
* svg
* pdf
* [etc](https://graphviz.gitlab.io/_pages/doc/info/output.html)

# 参考

* [Djangoで利用するコマンドまとめ](https://qiita.com/guile/items/8aa3809474db7e454ec5)
* [Graphviz - Graph Visualization Software](https://graphviz.gitlab.io/)

**Excelsior!**
実質的にfinalな変数とは何か

# 実質的にfinal
Javaのラムダ式では**実質的にfinal**なローカル変数にアクセスできるらしい。
参考書には「**final**で修飾されていなくても変更されない変数」とあった。
# どういうことか
「**final**付いていないけど宣言時から一切変更無いからつまり**final**と同じだよね！」ってこと

この場合、ローカル変数`i`は実質的finalだけど、

```LambdaStudy.java
public class LambdaStudy {

	public static void main(String[] args) {
		int i = 10;
		Calculate c = x -> x + i;
		System.out.println(c.calc(20));//30
	}
}

interface Calculate {
	public int calc(int x);
}
```

この場合はインクリメントで`i`の値を変えてしまっているので、実質的finalでは無くなり、コンパイルエラーとなってしまう。

```LambdaStudy.java
public class LambdaStudy {

	public static void main(String[] args) {
		int i = 10;
		i++;
		Calculate c = x -> x + i;//Local variable i defined in an enclosing scope must be final or effectively final
		System.out.println(c.calc(20));
	}
}

interface Calculate {
	public int calc(int x);
}
```

#参照型ではどうか
参照型であっても変わらない。

この場合、`sb.append("d")`は変数`sb`の参照先のオブジェクトに変更を与えているだけで変数`sb`それ自体を変更している訳では無いので`sb`は実質的finalとなり実行できる。

```LambdaStudy.java
public class LambdaStudy {

	public static void main(String[] args) {
		int i = 10;
		StringBuilder sb = new StringBuilder("abc");
		sb.append("d");
		Calculate c = x -> {
			System.out.println(sb.toString());//abcd
			return 	x + i;
		};
		System.out.println(c.calc(20));//30
	}
}

interface Calculate {
	public int calc(int x);
}
```

`sb`に再代入したら`sb`の参照先が変わってしまうので実質的finalでは無くなってしまう。（コンパイルエラー）

```LambdaStudy.java
public class LambdaStudy {

	public static void main(String[] args) {
		int i = 10;
		StringBuilder sb = new StringBuilder("abc");
		sb.append("d");
		sb = new StringBuilder("efg");
		Calculate c = x -> {
			System.out.println(sb.toString());//Local variable sb defined in an enclosing scope must be final or effectively final
			return 	x + i;
		};
		System.out.println(c.calc(20));
	}
}

interface Calculate {
	public int calc(int x);
}
```

#まとめ
実質的finalな変数とは**「変数宣言時から一切変更がない変数」**のことである。