OmniAICreator/Qiita-1.07M huggingface dataset:
SAPPORO workflow and individual task execution systemを入れて見る

https://github.com/suecharo/SAPPORO のRelease v0.3.5を導入してみるメモ

* それぞれ管理者/sudoerであるという前提で

# Mac
* dockerとdocker-composeを ```Homebrew```を使ってインストール
 * Docker version 18.09.6, build 481bc77 : docker-compose version 1.24.0, build unknown
 * 参考にしたページ：https://qiita.com/sitmk/items/ed753f6b2eb9960845f7
 * brewで```xcrun: error:なんちゃら```みたいなエラーが出た→ ```xcode-select --install```で、コマンドラインツールを（再）インストール
  * さらに参考にしたページ：https://qiita.com/nishina555/items/e23d73067a5cac182a63 
* Docker Desktop for Mac **(Docker.app)** を起動して常駐させておく
 * 予め起動しておかないと、docker run時に```Is the docker daemon running?```とかエラーが出て怒られる

# Windows
まだ試してない

# Linux (RHEL7.6)
* Dockerと、docker-composeを入れて起動 (sudo)
 * Docker version 1.13.1, build b2f74b2/1.13.1 : docker-compose version 1.24.0, build 0aa59064
 * 参考にしたページ : https://qiita.com/sawadashota/items/2bed41598d825d488701

* デフォルト利用ポートの1121を（今回は一時的に）開ける

```
# firewall-cmd --zone=public --add-port=1121/tcp
# firewall-cmd --reload
```


# Mac/Linux共通  (Winまだ試していない）
* $HOME下にSAPPOROをダウンロード
```bash
$ git clone https://github.com/suecharo/SAPPORO.git
```

## SAPPORO-web

$ cd SAPPORO/SAPPORO-web/script
$ ./web-up
```

ここで、docker-composeを入れていないと、
```./web-up: 行 195: docker-compose: コマンドが見つかりません```の後に、
```Starting uWSGI process... ```で無限繰り返しになる。

 * docker-composeを入れていても```Starting uWSGI process... ```が１秒置きに出てくるのはなぜだろう。``` ls ../log/ ``` に何も入ってない。
  * スクリプト見たら、```uwsgi.sock``` ファイルが存在してないのでループ待機してるっぽい　→ sockファイルが出来るまでに時間がかかる模様。Mac版で 20回待った後に

```
Access http://0.0.0.0:1121/ in your browser
Finish web-up...
```
と出現。
http://localhost:1121 で(Mac版は)画面デター＼(ﾟ∀ﾟ)／

## SAPPORO-service
```
cd SAPPORO/SAPPORO-service/script/
./service-up
```
 * SAPPORO-webが立ち上がって入れば``Starting uWSGI process``表示が出ないですぐサービススタートする
 * http://localhost:1122/service-info で、cwlについてのJSONデータが出てきた。

## SAPPORO-fileserver 
 * 公式説明　https://hackmd.io/s/rJHpJwkdE を読んでファイル２個書き換える。
  * ``MINIO_ACCESS_KEY:``と``MINIO_SECRET_KEY:``は、自分でローカル運用する分にはhogeでもfugaでも任意で良さそう。
  * ``nginx.conf``の中の(サーバー)rootは、設置したPC・サーバ内ディレクトリになる。
Ganacheでローカルブロックチェーンを作成しRemixからデプロイする

#概要
Ethereumのスマートコントラクトの開発のために、Ganacheでローカルの開発環境を用意し、Remixからスマートコントラクトをローカル環境にデプロイしてみます。
#Ganache
https://truffleframework.com/ganache
Ethereum のローカル開発環境。GUI版とCLI版があります。
今回はGUI版で試してみます。
公式サイトからダウンロードして起動するだけです。
本記事時点ではv2.0.1です。
#Remix
https://remix.ethereum.org/
スマートコントラクトにはSolidityという言語を使用します。
RemixはブラウザベースのSolidity用のIDE(統合開発環境)です。
Solidityソースコードのエディット、コンパイル、デプロイ、デバッグを行うことができます。
#Remixでスマートコントラクトを書く
```solidity:helloWorld.sol
pragma solidity >=0.4.0 <0.6.0;

contract Hello {
    
    function helloWorld () public pure returns (string memory) {
        return "Hello World";
    }
}
```
HelloWorldを出力するコントラクトを書いてます。
Solidityについて調べるとv0.4.0系の記事が多いのですが、v0.5.0から引数に明示的にmemoryを宣言する必要があるみたいです。
参考
[Solidity v0.5.0 Breaking Changesでの変更点をコントラクトべースで見てみる](https://qiita.com/SATOMIN/items/5036af2cbab7f4d058b3)

#Ganacheにデプロイする
先にGanacheを起動しましょう。
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401408/dfaaa120-5149-f936-7f3a-e73ee96fda4d.jpeg)
Remixの右側のタブにある、Start to compileを押してコンパイルします。
![03.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401408/fcc9c475-45e6-724b-76ea-12f5f8ce38e4.jpeg)
Runタブに切り替えてEnvironmentをWeb3 Providerに切り替えます。
Are you sure you want to connect to an ethereum node?
というのが出るのでOKを押します。
Web3 Provider EndpointはデフォルトではCLI版のhttp\://localhost:8545になっていますが、
GanacheをGUIで起動した場合はhttp\://localhost:7545で起動していると思うので書き換えてOKを押しましょう。
![04.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401408/2c68ccfb-559d-80cc-586e-20c12b607069.jpeg)
そしたら、Deployを押します。
#Ganacheで確認する
![05.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401408/52c2a513-cba2-453e-a845-2008eb79c421.jpeg)
Ganacheで確認すると新しくトランザクションが作成されていると思います。
おめでとうございます。これでローカルの環境にスマートコントラクトをデプロイすることができました！
[論文メモ] StarSpace: Embed All The Things!

* [StarSpace: Embed All The Things!](https://arxiv.org/abs/1709.03856)
* [GiHub: facebookresearch/StarSpace](https://github.com/facebookresearch/StarSpace)


# 論文概要
* 様々なタスクを解くことができる汎用的なembeddingモデル(StarSpaceと呼ぶ)を提案した。
    * 文書分類のようなラベリング
    * 文書探索やWeb検索のようなランキング
    * 協調フィルタリングやコンテンツベースの推薦システム
    * マルチリレーショングラフのembedding
    * 単語、文、文書のembedding
* それぞれのタスクに応じて、離散的な特徴量からなるエンティティを埋め込み、それらを互いに比較し、類似度を学習する。
* 数値実験では、StarSpaceは多くのタスクで他の手法と比べ十分競争力のある結果を示している。

# この論文を読む私のモチベーション
* 様々なタスクを業務で解く必要があり、汎用的な方法を活用することでベースラインモデル構築のコストを下げたい。
* 特に文書間の類似度や情報探索に興味がある。

# モデル
* 離散的な特徴量(bag-of-features)を使ってエンティティのembeddingを学習する。
    * 例えば、テキストに対してbag-of-word、n-gram、ユーザーに対して評価したアイテムなど
* 異なるエンティティ間でも比較することができる。
    * 同じ空間でメトリックに応じてembeddingを計算する。
    * 例えばユーザーとアイテム(推薦に使える)。アイテムとラベル(分類に使える)
* 損失関数
![スクリーンショット 2019-05-27 17.57.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199247/b9f6f53e-b20a-1ccf-8379-d274b78dd180.png)
  * $E^+$: positive entity pairs
  * $E^-$: negative entity pairs. ランダムに$k$個選ぶ。
     * $k$の選び方によるインパクトは後述。
     * 例えば、文書分類の場合は$a$が文書で$b$がラベル
  * $sim$: 類似度関数。cos類似や内積など。ハイパーパラメータとして調整する。
  * $L_{batch}$: 損失関数。下記2つを試す。
     * margin ranking loss: $\max(0, \mu - sim(a, b))$
     * negative log loss of softmax
     * (※ 数値実験ではmargin ranking lossのほうが良かった)
* 学習方法
    * SGD
    * Adagrad
    * Hogwild(SGDの高速並列化手法)
    * embeddingのmax normを使って半径$r$の円内にvectorを制限


## Multiclass Classification(e.g. Text Classification)
- ドキュメントのfeatureとしてbag-of-wordsを使う。
- positive pairは訓練データから作る
- negative pairは正解ラベル以外のラベルからサンプリングする。

## Multilabel Classification
- $a$に対して$b$をSGDのステップごとにサンプリングする。

## Collaborative Filtering-based Recommendation
- ユーザーのセットと各ユーザーが評価したアイテムの集合
- ユーザーとアイテムのID embeddingを行う。

## Collaborative Filtering-based Recommendation with out-of-sample user extension
- 古典的な方法では新しいユーザーに対応できない(ID embeddingされていないから)
- 1つを除いてユーザーが評価したアイテム全てを$a$とし、除いた1つを$b$とする。
- ユーザーのembeddingは評価したアイテムのembeddingの合計とする。

## Content-based Recommendation
- 1つを除いてユーザーが評価したアイテム全てを$a$とし、除いた1つを$b$とする。
- ドキュメントの場合、bag-of-wordを特徴量として使う。
    - wordのembeddingの合計をドキュメントのembeddingとして使う

##  Multi-Relational Knowledge Graph (e.g. Link Prediction)
- $(h, r, t)$
    - $h$: head concept (e.g. Beyonce)
    - $r$: relation (e.g. born-in)
    - $t$: tail concept (e.g. Houston)
- $(a, b)$の選び方は2パターンある
    - $a$として$(h, r)$, $b$として$t$
    - $a$として$h$, $b$として$(r, t)$

## Information Retrieval (e.g. Document Search) and Document Embeddings
- 教師あり学習の場合、$a$はquery keyword、$b$はドキュメント、$b^-$は無関係のドキュメント
- 教師なし学習の場合、ドキュメントからランダムに選んだ単語を$a$として使う

## Learning Word Embeddings
- 教師なしで単語のembeddingを学習する。
- $a$は言語の単語、$b$は真ん中の単語とする。

## Leaning Sentence Embedding
- positive例として、同じ文書から選んだ2つの文を$(a, b)$として使う。他の文書から選んだ文を$b^-$として使う。

## Multi-Task Learning
- 前述のタスクを同時に解くこともできる。

# Experiments
- 論文で確認([StarSpace: Embed All The Things!](https://arxiv.org/abs/1709.03856))

# ライブラリ
- [GiHub: facebookresearch/StarSpace](https://github.com/facebookresearch/StarSpace)
Springで、フォームで何も入力せずにサーバー側でフォームの値を受け取ろうとしたら、400エラーが出てしまう時の対策

## プログラム
これだと、未入力だった場合にはエラーとなります。

```java:I_am_hentai.java
@RequestParam("Order") String[] param
```

このように指定することで、未入力だった場合でも大丈夫です。

```java:I_am_hentai.java
@RequestParam(name = "Order", required = false) String[] param
```


requiredをfalseにすると、
何も入力せず送信ボタン押しても問題なくなる。

逆に、@RequestParam("Order") String[] param
と書いてフォームの値を受け取ろうとすると、送信ボタン押した瞬間に400エラーとなります。
Revit Api pyrevitでEnumを使う

```python:sample.py
from rpw import DB
from rpw.utils.dotnet import Enum
for bip in Enum.GetValues(DB.BuiltInParameter):
	print bip

for bip in Enum.GetNames(DB.BuiltInParameter):
	print bip
	print type(bip)

for pt in Enum.GetValues(DB.ParameterType):
	print pt
	print type(pt)
```

BuiltInParameterをrpwを使ってPythonで書くときにEnumをどこからインポートしたら良いか詰まりました。
Enum.GetValues（）では'BuiltInParameter'、Enum.GetNames()だと'str'を返します。


参考にしたリンクはこちら。
https://thebuildingcoder.typepad.com/blog/2011/08/built-in-parameter-name-and-labelutils.html
Excelメモ：前の行と同じ値を繰り返し表示しない（オートフィルタ対応）

Excelで、前の行と同じ値を繰り返し表示したくない、というのは、よくある要望です。

# 条件付き書式 お手軽版

値消したりするのはめんどいので、条件付き書式で文字を白（背景色と同じ色）にして対応してます。

![fig01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351781/d3ed68cd-7d24-ce6a-05c9-d2c60de79bfe.png)

「ホーム」リボンの条件付き書式
＞ 新しいルール
＞　数式を使用して書式設定するセルを決定

と進んで、数式のとこに上のセル（上のスクショだとA1）との比較を入力。
（相対参照で書いておけば、これで全行対応できる）
一致したらtrueが返るので、書式が適用されて、文字が白くなる。

簡単で良いのですが、オートフィルタで絞り込みをすると、残念な結果になります。

![fig02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351781/4a2dc783-2c60-2c59-d191-0dca91e579b8.png)

あくまで「相対参照された、一つ上のセル」と比較してるだけなのです。
そのセルがフィルタで非表示になっていても、知ったことではないのです。

正しい動作ですが、これじゃない、ということもあります。

# オートフィルタ対応版

Subtotalだとか、Vlookupだとか、MatchとかIndirectとか、セル関数をこね回して、作業用の列つくって、ぐしゃぐしゃしててみたものの。

結局、面倒になって関数書きました。

上の（表示されてる）セルと比較して、trueかfalseを返します。

```vb
' 渡されたセルと、その上のセル（表示されているもの）を比較する
Function compareToVisibleUpperCell(rng As Range) As Boolean

    Dim tmpRow As Long
    
    ' デフォルトfalse返す
    compareToVisibleUpperCell = False
    
    ' 渡されたセルが1行目なら比較せず終了
    If rng.Row = 1 Then Exit Function
    
    ' 1行上から、上向きにチェック
    For tmpRow = rng.Row - 1 To 1 Step -1
        ' 表示されていれば
        If Rows(tmpRow).Hidden = False Then
            ' 内容が同じならtrueにする
            If Cells(tmpRow, rng.Column) = rng Then _
                compareToVisibleUpperCell = True
            ' これ以上チェック不要
            Exit Function
        End If
    Next
End Function
```

で、条件付き書式の条件をこの関数にして

![fig03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351781/fe17a78d-8d7b-ad05-c470-da602b3f0ee2.png)

オートフィルタかけてみる。

![fig04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351781/d0b28ad6-d93a-fdfc-9e60-8772812b776c.png)

パフォーマンスとかは未検証ですが、とりあえず調子よく動いてます。

ネイティブのシート関数でこうやればうまくいくぜ！というのがあれば、ぜひ教えてほしいです。
TypeScript + Webpack4 + Three.js でTextGeometry生成

# はじめに
タイトルの構成でThree.jsのTextGeometryを出します。
さくっとできるでしょとたかをくくっていたら最近やってる資料がなくて変に苦労したので残しときます。

# 環境
- TypeScript 3.4.5
- Webpack 4.31.0
- Three.js r104

# 参考資料
調べたやつ

- [TextGeometryの公式ドキュメント](https://threejs.org/docs/#api/en/geometries/TextGeometry)
    - TypeScriptの場合このままだとうまくいかない
- [TypescriptでThree.jsのTextGeometry描画](https://qiita.com/t-manome/items/cb9630c35458c4b5bb58)
    - jQuery使いたくない
- [Three.js テキスト描画(TypeScript)](https://tyablog.net/2017/04/04/three-js-text-geometry-typescript/)
    - [Webpack2以降はjson-loaderのインストールがいらなくなった](https://webpack.js.org/migrate/3/#json-loader-is-not-required-anymore)らしく少しごにょったけど無理そうと察した

# 方針
いろいろ見て回った感じ、**three/examples/fontsにあるようなhoge.typeface.jsonをほしいところで読み込んでTHREE.Fontに突っ込めばよさそう**です。

# 解決策
## 1. tsconfig.json で以下の設定にする
これをすることで2番が使えるようになります。

```tsconfig.json
{
  "compilerOptions": {
    // 中略
    "esModuleInterop": true,
    "resolveJsonModule": true,
    // 中略
  }
}
```

## 2. 適当な名前でほしいフォントのjsonファイルをimportする
hogeという名前のjsonオブジェクトをインポート。

```app.ts
import hoge from 'hoge.typeface.json';//path 
```

## 3. importしたjsonオブジェクトをそのままTHREE.Font()に突っ込む
注意すべきは、そのまま(=**jsonオブジェクトの状態**)で突っ込んでください。
[TypescriptでThree.jsのTextGeometry描画](https://qiita.com/t-manome/items/cb9630c35458c4b5bb58)で「json string」という表記があってわざわざ`JSON.stringify()`してやりましたが見事通りませんでした。

```app.ts
const myFont = new THREE.Font(hoge);
```

## 4. THREE.TextGeometryParameterを作ってTHREE.TextGeometryに突っ込む
後は他サイトと同様に、パラメータを作って目的のジオメトリを作るだけです。

```app.ts
const params = new THREE.TextGeometryParameter({
  font: myFont,
  // 必要なパラメータを追記
});
const geometry = new THREE.TextGeometry('hoge', params);
// 後略
```

あとは作ったジオメトリを使って普通にメッシュ生成、描画までできます。

# 終わりに
調べていた時「なんか長ったらしくていろいろめんどくさい...」と感じていましたが実装してみたら大したことない分量でこの野郎という気持ちになりました。

メモ、json使うサンプルばっかだけど実はjsonだけじゃなくてttfにも対応してるらしい、自分で動作確認はしていません。
https://medium.com/@joshmarinacci/threejs-secretly-supports-true-type-fonts-b896df19af2e
【Java】nullを考慮しつつ複数キーでソートする

案外詰まったので備忘用に残します。

# やること
IDを3種類持つオブジェクトについて、以下のようにソートします。

- 「`id1` -> `id2` -> `id3`」の順でそれぞれソートする
- ソートは全て昇順（`NaturalOrder`）で行う
  - ただし、全てのソートで`null`は最後とする

# ソース

```java
// import類
import static java.util.Comparator.comparing;
import static java.util.Comparator.naturalOrder;
import static java.util.Comparator.nullsLast;

/* 略 */

static void sortIdObject(List<IdObject> idObjects) {
  idObjects.sort(
      comparing(IdObject::getId1, nullsLast(naturalOrder()))
          .thenComparing(IdObject::getId2, nullsLast(naturalOrder()))
          .thenComparing(IdObject::getId3, nullsLast(naturalOrder()))
  );
}
```

## 解説
> 「`id1` -> `id2` -> `id3`」の順でそれぞれソートする

この部分は、比較を`comparing(xxx).thenComparing(xxx).thenComparing...`と繋いでいくことで実現できます。

> ただし、全てのソートで`null`は最後とする

今回はnullが最後なので`nullsLast([Comparator])`で囲いました。
そもそも、用意されている`comparator`は`null`を入れるとヌルポになるため、nullableな内容を比較する場合は`nullsLast`か`nullsFirst`で囲ってやる必要があります。
また、`nullsLast/First`で囲ったとしても、`compareInt`などのプリミティブ型に関する比較系はヌルポになるため注意が必要です。

> ソートは全て昇順（`NaturalOrder`）で行う

`Comparator`に`naturalOrder()`を指定することで実現できます。
逆順だと`reverseOrder()`を指定することで実現できます。

# 補足
## 今回並び替えるオブジェクト
```java
// ゲッターはLombokによる生成を想定
@Getter
public class IdObject {
  private Integer id1;
  private Integer id2;
  private Integer id3;
}
```


# 参考にさせていただいた内容
- [\(o1, o2\) \-> o1 \- o2 なんて呪文はもうやめて！ \- Java8でのComparatorの使い方 \- Qiita](https://qiita.com/tag1216/items/50ecf6a7bc10218ee889)
- [Comparator \(Java Platform SE 8 \)](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Comparator.html)
Desktop : OpenCV Watershed

<H5>Goal</H5>
Test OpenCV Watershed.

```OpenCV_Watershed.java
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class OpenCV_Watershed {
    public static void main( String[] args )
    {
        try{
            System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
            Mat source = Imgcodecs.imread(
                    "D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\lena.jpg",
                    Imgcodecs.CV_LOAD_IMAGE_COLOR);
            Mat gray=new Mat(source.rows(),source.cols(),CvType.CV_8UC1);
            Imgproc.cvtColor(source, gray, Imgproc.COLOR_BGR2GRAY);
            Mat binary=Mat.zeros(gray.rows(),gray.cols(),CvType.CV_8UC1);
            Imgproc.threshold(gray, binary, 100, 255, Imgproc.THRESH_BINARY);


            Mat fg=new Mat(source.size(),CvType.CV_8U);
            Imgproc.erode(binary, fg, new Mat(),new Point(-1,-1),2);

            Mat bg=new Mat(source.size(),CvType.CV_8U);
            Imgproc.dilate(binary, bg, new Mat(),new Point(-1,-1),3);
            Imgproc.threshold(bg,bg, 1, 128, Imgproc.THRESH_BINARY_INV);

            Mat markers=new Mat(binary.size(),CvType.CV_8U,new Scalar(0));
            Core.add(fg, bg, markers);


            Mat tmp=new Mat(binary.size(),CvType.CV_8U,new Scalar(0));
            Mat tmper=new Mat(binary.size(),CvType.CV_8U,new Scalar(0));
            Mat tmper1=new Mat(binary.size(),CvType.CV_8U,new Scalar(0));


            //Watershed
            markers.convertTo(tmper, CvType.CV_32S);
            Imgproc.watershed(source, tmper);
            tmper.convertTo(tmp, CvType.CV_8U);
            //markers.convertTo(tmp, CvType.CV_8U);
            tmper.convertTo(tmper1, CvType.CV_8U,255,255);
            Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\lena_watered.jpg", markers);
            Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\lena_watered1.jpg",tmp);
            Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\lena_watered2.jpg",tmper);
            Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\lena_watered3.jpg",tmper1);

        }catch (Exception e) {
            System.out.println("error: " + e.getMessage());
        }
    }
}
```
<h5>Result</h5>
![lena_watered.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276243/95a429f8-217c-d761-b0b4-9d350af7970d.jpeg)
![lena_watered1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276243/8ada148b-fb7c-d381-299f-c87e23361a43.jpeg)
![lena_watered2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276243/91dd711f-a31c-c220-4fd1-bceddf38e67b.jpeg)
![lena_watered3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276243/fafb4dbd-b54b-5f77-e38c-3081e21f55a0.jpeg)
IonicとFirebaseを使って3日で作る写真共有アプリ - 開発環境の構築編 -

##### この記事は「IonicとFirebaseを使って3日で作る写真共有アプリ」シリーズの中の記事です。
https://qiita.com/kazuki502/items/585aef0d79ed1235bec0

ローカルの開発環境の構築手順をまとめておきます。

### VisualStudioCodeのインストール
下記のサイトからVisualStudioCodeの最新版をインストールします。
https://azure.microsoft.com/ja-jp/products/visual-studio-code/

### Gitのインストール
Gitをまだインストールしていない人がいたら、Gitもインストールしましょう。

For windows
https://gitforwindows.org/

### Nodejsのインストール
IonicはNodejs上で動くので、Nodejsをインストールしましょう。
https://nodejs.org/ja/
これも最新版で問題ありません。

### ワークフォルダの作成
ここからは、実際にデータをダウンロードしたりするので、どこでもいいのでソースコードを配置するフォルダを作成して下さい。この後紹介するコマンドは、そのフォルダで実行する前提で説明します。

### Ionic4のインストール
※ここからはターミナルでワークフォルダに入ってから進めてください。
Ionic4の開発をサポートしてくれる"Ionic CLI"をインストールします。VisualStudioCodeのターミナルで下記コマンドを動かしてください。

```console
$ npm install -g ionic
```

参考URL：https://ionicframework.com/docs/cli

インストールが完了したら、"アプリの型"を作りましょう。AppNameはアプリ名になるので、好きな名前を付けてください。

```console
$ ionic start AppName blank --type=angular 
```

## firebaseの準備
### firebaseアカウントの作成
https://firebase.google.com にアクセスしてfirebaseのアカウントを作ってください。Googleアカウントを持っていれば、そのままログインできるので「コンソールに移動する」をクリックしてください。

### firebase新規プロジェクトの作成
ログイン出来たら、新規プロジェクトを作成して下さい。名前はなんでもいいですが、idは後から変更できないのでとりあえず「AppName-dev」とでもしておきましょう。
※リリースするときには、クリーンな新しい環境を用意したほうがスムーズなため。

### firebase CLIのインストール
ここからはローカルに戻って、firebase CLIをインストールしてください。デプロイが楽にできたり、functionsと呼ばれるサーバー再度の処理をアップロードするための機能がある便利ツールです。

```console
$ npm install -g firebase-tools
```

そのあとはhttps://firebase.google.com/docs/cli/?hl=ja を見ながら、ログインを行ってください。

```console
$ firebase login
```

ログイン出来たら、プロジェクトの初期化を行います。このとき、プロジェクトを選択する必要があるので、まだ作っていない方はfirebaseコンソールから作成してください。

```console
firebase init
```


## 初回ビルド＆デプロイ
### Ionicアプリのビルド
下記コマンドを実行すると自動的にビルドが開始されます。

```console
$ ionic build --prod
```

### 初めてのデプロイ
ビルドが完了したら、早速デプロイしてみましょう。デプロイをするには、firebase CLIの設定が完了している必要があります。

```console
$ firebase deploy
```

もし、ここで失敗するようであればどこかで間違っているはずなので最初からやり直してみてください。


以上で、環境構築が完了しました。
VS2019で.NET Core 3.0 Previewを使う

せしまるです。

Microsoftのセミナーで.NET Coreについて学んできたので復習がてら環境構築してました。

そんな中で困ったことを軽く。

「.NET Core 3.0 Previewを使うには、.NET Core SDKのPreview版を使用するという項目にチェックをいれろ！」とどこかの記事に書いてありました^^

指定されていたのはオプションの「プロジェクトおよびソリューション ＞ .NET Core」のページだったのですが

***ないやん***

なんでーとおもって調べてたら見つけました。

オプションの「環境　＞　プレビュー機能」

ここに項目がありましたｗ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284493/12699b34-8fbb-6bce-4d4e-452637acb9a3.png)


これの「.NET コア SDK のプレビューを使用する」にチェックを入れれば、.NET Core 3.0が使用できるようになります。

わーい(´・ω・`)
ラズパイでポチッと写真を撮ってLINEのグループに送信する 

## 経緯とか
* 実家で飼っている犬の写真を妹が見たがっている
* 両親は老眼のため、スマホの操作がつらいので、簡単操作で写真を送りたい
* RaspberryPiにカメラとスイッチつけて、ポチッと押してLINEに通知出来たら楽っしょ

## 物品購入
RaspberryPi：
すでに持ってた。

カメラ：
<a href="https://www.amazon.co.jp/gp/product/B01EW2KDTE/">Raspberry Pi Official Camera V2 for 3B/2B/B+/A+/B/A　ソニー製808万画素CMOSセンサ使用 ラズベリーパイ公式　HDカメラ</a>

タクトスイッチ：
<a href="https://www.amazon.co.jp/gp/product/B00EDJYK46/">uxcell タクトスイッチ 触覚押しボタンスイッチ モーメンタリ 触覚型 金属 電子部品 ブラック 10個入り</a>

## まずはRaspberryPiとカメラで写真を撮ってLINEのグループに通知する

```/usr/local/src/camera.sh
#!/bin/bash

# 変数定義
date=$(date +"%Y-%m-%d_%H%M")
save_file="/home/pi/camera/${date}.jpg"
token="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

# 写真撮影
raspistill -vf -hf -q 10 -o $save_file

# LINE通知
curl -X POST -H "Authorization: Bearer ${token}" -F "message=''" -F "imageFile=@${save_file}" https://notify-api.line.me/api/notify
```
※tokenには<a href="https://notify-bot.line.me/ja/">LINE Notify</a>のTokenが入ります。

## 配線とか
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277982/f20dc879-ac6c-a10f-3ca9-4df1cd27b51f.jpeg" width="50%">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277982/3c36da56-d644-e686-01ea-9333123270bd.jpeg" width="50%">

※お試しなのでブレッドボードで適当に接続してます。

## タクトスイッチを押すとcamera.shが実行されるようにする
```/usr/local/src/camera.py
#!/usr/bin/env python

import RPi.GPIO as GPIO
import time
import os

GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

try:
  while True:
    if GPIO.input(14) == GPIO.HIGH:
      os.system('bash /usr/local/src/camera.sh')
      time.sleep(1.0)
except KeyboardInterrupt:
    pass

GPIO.cleanup()
```
参考：<a href="https://qiita.com/sunaga70/items/30216e4cdee39ed5544c">【Raspberry Pi 2 Model B】初めての電子工作 タクトスイッチに挑戦</a>

## RaspberryPi起動時にスクリプトを実行させておく
```
su pi
crontab -e
@reboot python /usr/local/src/camera.py
```
※piユーザで実行する必要があるため、suしてます。
参考：<a href="https://qiita.com/ikemura23/items/6f9adce99a3db555a0e4">ラズパイ起動時にスクリプトを実行したい</a>


## タクトスイッチを押してLINEに通知させる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277982/bb2d35bc-5d54-4709-1893-a53610860a17.jpeg" width=50%>

※実家、散らかっております…。なお、写真はモモちゃん(チワワ・4歳)です。

## 今回の発見
* LINE Notifyの仕様上、1MB以上のデータは送信出来なかった。何も指定せずに写真を撮ると4.5MBくらいになるので、raspistillコマンドのqオプションを使って、画質を落として撮影するようにした。
* 「messages」がLINE Notifyの仕様で必須のため、画像だけの投稿が出来なかった。仕方ないので何も文字を入れずにmessagesの値を渡した。
* タクトスイッチより、もっと押しやすいスイッチを買った方が使いやすかった

## 今後やりたいこと
* スイッチとRaspberryPiをハンダで直接、接続する
* もう少し押しやすいスイッチに変更する
* 実家の掃除をする
ROS 1/ROS 2ビルドシステムへの統合　自動車ソフトウェア開発向け＃2　　

##はじめに##

自己紹介
十年間にわたり組込みOSの分野でFAE/プロジェクトマネージャを経験。
現在はヘテロマルチコア向けのソースコード解析や最適化を行うSilexicaで奮闘中。

記事内容　
今回はROS1/ROS2ビルドシステムへの統合
について記事にしました。

##目次
####ROSの統合
####ビデオで統合の解説


##ROSの統合
ROS（バージョン1と2）には、Rviz、RQTグラフ、Gazeboなど、自律システムの開発に役立つ広範囲なオープンソースのエコシステムツールが既に存在します。しかしこれらツールは[FPGA特化　自動車ソフトウェア開発向け＃1](https://qiita.com/Tastuya/items/f40de62fdd241c1d4e50)で述べたようなユースケースの解決には向いていません。

－ROS 1/ROS 2ビルドシステムへの完全な統合

　　●各個モジュールのオンデマンド解析

　　● 複数モジュールの並列解析サポート

－自動リグレッションテストなどを可能にする十分なCIインテグレーションサポート
－オリジナルのソースコードラインに回帰可能な後方トレーサビリティでアプリケーションの変動性に対する自動ルートコーズ解析。

これにより、同じソフトウェアで起こる異なった実行が違う動きをするかの理解に役立ちます。この理由として、入力データや状態の異なりによる実行経路の違いや、再帰的アルゴリズム、または異なった動的スケジューリング順列による実行動作の変動で生じる実行時間が変わってきます。

##ビデオで統合の解説

1.Rosシナリオの実行

・ v1.8 autoware適用（安定性を高めるパッチ適用)[7]
・“Moriyama” のデータセットに基づく
・分離されたGPSのテストシナリオ（実行時間：〜10秒）
・GPSセンサーの速度（ROSbagによる):25Hz
・環境：カスタムNvidia Dockerコンテナ（十分なオートウェアスタックとSLXを含む）

2.オペレーティングシステムのプロファイリング情報（コンテキストスイッチの数、カーネル/プロセスランタイム、アイドル時間など）をROS固有の情報（稼働中のモジュール/トピック、依存関係など）と融合したSLXシステム概要チャートで、システム全体の概況を把握。

3.SLX詳細解析のモジュールを選択。（ここではAutowareの「GPS」モジュール：nmea2tfpose）

4ソフトウェアアーキテクチャの概要を把握するため、スレッド、関数、および変数の依存関係の調査。

5.結果のソートをすると、かなりの数の同期呼び出しが明らかになります（特に、必要なモジュール周波数（25 Hz）とシナリオ実行時間（10秒）が与えられた場合）。

6.ソースコードに直接ジャンプして、同期呼び出しの根本的な原因の確認し、同期呼び出しを減らすコードセグメントへの置き換えます。

7.シナリオの再実行で同期呼び出しの大幅な減少が確認されます。

タイトル　『Mastering Automotive Software Development/自動車ソフトウェア開発』
[![Mastering Automotive Software Development](http://img.youtube.com/vi/HjIylwsWd50/0.jpg)](http://www.youtube.com/watch?v=HjIylwsWd50)

###参考文献
[1] Center for Automotive Research (https://www.cargroup.org)
[2] Robot Operating System 2 (https://index.ros.org/doc/ros2)
[3] AUTOSAR Adaptive (https://www.autosar.org/standards/adaptive-platform)
[4] Motor industry software reliability association (https://misra.org.uk)
[5] Multicore Association SHIM2 (https://multicore-association.org/workgroup/shim.php)
[6] Apex.OS by Apex.AI: https://www.apex.ai/products
[7] Autoware (https://github.com/CPFL/Autoware, v1.8)
[8]提案された変更は移植性がなく、ros :: Rateの使用がより適切であると言えるが、更新レートを安定に保つメカニズムには一定の費用が必要。

##最後に
ここまで読んでくださってありがとうございます。
自動車開発、コード解析、並列処理など質問や疑問に思ったことなどあれば
いつでもお待ちしております。:point_up:
cursorプロパティについて調べてみた。

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている田島一毅です。プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

##progateでcursorプロパティについて学んだ
現在僕は、プログラミング学習サイトのprogateでHTMLとCSSを学んでいます。
その中で、cursorプロパティというものを学びました。
cursorプロパティとは、以下のようにして、マウスカーソルが目的物に乗ったときにマウスカーソルの形を変化させるCSSプロパティです。

```CSS
××{
  cursor: 値;
}
```


プログラミング初心者の僕は、マウスが乗ったときにマウスカーソルが指の形に変化しただけで非常に感動しました。
コーディングが非常に簡単なのも、感動の理由の一つです。
そこで僕は、cursorプロパティでマウスカーソルをどんなものに変化させることができるのか調べてみることにしました。

##cursorプロパティで意外といろいろできる
調べてみると、cursorプロパティでマウスカーソルを様々な形に変化させることができることを知りました。
今回は、その中でも僕が気に入ったものをピックアップして紹介します。

###1.auto
```css
××{
  cursor: auto;
}
```
autoは、初期値であり、状況に応じてマウスカーソルの形が変化します。リンクならpointer(人差し指)になり、テキストならtext(Iビーム)になります。

###2.pointer
```css
××{
  cursor: pointer;
}
```
pointerでは人差し指を表示し、主にリンクで使われます。
progateでは最初にこれを学びました。

###3.text
```css
××{
  cursor: text;
}
```
textはIビームを表示し、主にテキストで使われます。

###4.not-allowed
```css
××{
  cursor: not-allowed;
}
```
not-allowedは、道路標識の進入禁止マークのようなものを表示します。
初めて見たのですが、メンテナンスなどで操作ができないものがある時に、「操作不可能」の意味で使うことができるなあと感じました。

###5.resize
```css
××{
  cursor: 方角-resize;
}
```
resizeはある方向へのサイズ変更を表すために、矢印を表示します。
resizeは僕が一番面白いと思ったcursorの値です。
その理由は、その方角の表し方にあります。
例えば上は、northern(北)のnをとって、

```css
××{
  cursor: n-resize;
}
```
といったように表します。
ここが面白いなと感じました。
左下ならsouthwest(南西)よりswとなります。

##このほかにもいろいろある
今回は5つの値を紹介しましたが、値はまだまだたくさんあります。
よかったらぜひ調べてみてください。
IonicとFirebaseを使って3日で作る写真共有アプリ - 実装フレームワークの選定編 -

アプリの設計が終わったところで、次はそれをどのように実装していくのかを決めていきます。

### アプリの要件
今回は下記のような要件でアプリを作っていきたいと思います。
- Webアプリケーション
- シングルページアプリケーション（SPA）
- Progressive Web Application（PWA）
- サーバレス
- AndroidアプリやiOSアプリもいつか作っていきたい

### 使用するフレームワークの選定
SPA, PWA, マルチプラットフォーム対応のフレームワークといえばいろいろありますが、私が一番使い慣れているのと、デザインを整える手間を減らしたいという理由から今回は"Ionic4"で作ることに決めました。（他にもVue.js、Reactなどでも出来ると思います）

サーバーレスの環境を実現させるには、Azure、AWS、firebaseといくつかありますが、これも使い慣れているという理由と無料で使えることから、"firebase"に決めました。高性能ながら個人開発する分にはお金がいらないというGoogleの太っ腹ぶりに感謝します。

### 開発環境について
今回は"Visual Studio Code"を使ってコーディングしていきます。拡張機能も充実しているし、ターミナルとかも使えるのでかなり重宝してます。あと、バージョン管理ツールとしてgitを使います。

## まとめ
今回はこのような構成で開発をすることにしました。
クライアント側：Ionic4（HTML5, CSS, Angular）
サーバー側：firebase
開発環境：Visual Studo Code, git
【レスポンシブ】Sassを使ってレスポンシブに対応する

#きっかけ
求人をみてるとよく、レスポンシブ対応ができる人〜とあり
「あ、レスポンシブはやっとかないといけない項目だ！」と思って
[ポートフォリオ](https://gudtanuki.github.io/gud/)で使うことにしました。

いつもSassを使っているので今回も使っていきます！
（Sassって関数が使えるのを今回知りました〜）

#導入と使い方

###HTMLにviewportを記載する
参考サイト
[もう逃げない。HTMLのviewportをちゃんと理解する](https://qiita.com/ryounagaoka/items/045b2808a5ed43f96607)
時間ができたら細かく噛み砕いてここに追記します。

###メディアクエリをかく
今回はスマホ、タブレット、PCに対応させます。

参考サイト
[SCSSの基本的な書き方](https://qiita.com/nchhujimiyama/items/8a6aad5abead39d1352a#%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2%E3%82%AF%E3%82%A8%E3%83%AA)
この、メディアクエリの部分を参考に書きました。

優先させたい画面サイズがもしスマホサイズなら、
スマホ対応メディアクエリから書いていき、最後にPCサイズのメディアクエリ
のように順番が変わるようです。

レスポンシブ対応した見た目を確認するときはChromeのデベロッパーツールで確認できます。

#おわり
今回の記事はほぼ参考サイトを書くだけになってしまいました...
CSSは書くより見た目を考える方のが時間かかっちゃう気がします><

関係ないですが、スマホ対応について色々調べてたら
**PWA**なるものがあるらしく、やってみたいな〜って思いました。
[PWAに興味を持っている人向けに概要とか動向とかをまとめた](https://qiita.com/bunty/items/a0dc2d6b3986dd1c5a73)
RubyのバージョンがHeroku未対応だった

#はじめに
Rails初心者です。
主にBundlerの扱いにつまずいたのでメモします。
誤った点がありましたら、ご指摘いただけると勉強になります。

#補足
Rubyの`２.７.０`は2019年5月の段階ではまだリリースされていませんでした。
最新バージョンは`2.6.3`でしたので修正しました。

#つまづいたところ
Rubyのバージョン`2.7.0`を使ってHerokuにデプロイしたところ、
エラーが発生しました。

調べてみると、
**Heroku側がまだこのバージョンに対応していない**とのことでした。

<img width="966" alt="スクリーンショット 2019-05-26 17.46.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329941/9a201bec-acb7-fa64-704b-2af32ada5ead.png">

https://devcenter.heroku.com/articles/ruby-support#ruby-versions

対応しているのが`2.6.3`までですね。
対応したバージョンが使えるように、Rubyのバージョンを変えていきます。

ちなみに下の「MRI」のところには例として、

```
・Ruby2.6.14.4を入れたら、2.4.6になるよ
・2.7.6.2を入れたら、2.5.5だよ
・3.0.3を入れたら、2.6.3だよ
```
と書かれています。

Rubyのバージョンを変更します。
試しに今回は、`2.6.0`をインストールしてみます。

#解決策

##①使うRubyのバージョンをインストール
こちらが参考になります。

[rbenvでrubyのバージョンを切り替える
](https://qiita.com/_am_/items/c1dbeb11f40bbbac8fd9)
##②bundlerインストール

```
$ gem install bundler
```
##③Gemfileに記載

```
source 'https://rubygems.org'

ruby '2.6.0'

#省略
```
##④Gemfile.lockファイルがあれば消す
`Gemfile.lock`は`bundle install`する度に新しく作られるので、
ファイルごと消しておきます。
##⑤インストール
```
$ bundle install
```
##⑥コミット
新しい`Gemfile.lock`が作成されたのを確認し、
コミット→プッシュ

```
$ git commit
$ git push heroku
```

無事、Herokuに反映されました！
DOMだけでテーブルを作成する方法

こんにちは。
プログラミング初心者のオジサンです。

JavaScriptでミニアプリを作成しており、そのアプリでテーブルを動的に作成する必要がありまして、テストがてらDOMだけでテーブルを作成するコードを作ってみました。

##1.HTML（index.html）
テーブルはDOMで作るため、bodyタグの中はほぼ空です。
JavaScriptを読み込むためのscriptタグしかありません。
DOMを勉強するときは、だいたいこの内容でやってます。

```html
<!DOCTYPE html> 
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>表をjsで作る</title>
  <link rel="stylesheet" href="css/styles.css">
</head>
<body>
  <script src="js/main.js"></script>
</body>
</html>
```

##2.CSS（css/styles.css）
書式は最低限、整えてます。
テーブルはdivタグでflexboxちっくに。
…まだ、flexbosをよく理解できていません(;^_^A

```css
/* 表の書式設定 */
.table {
    text-align: center;
}

/* 行の書式設定 */
.row {
    display: flex;
}

/* 列の書式設定 */
.cell {
    margin: auto;
}
```

##3.JavaScript（js/main.js）
今作っているミニアプリは、テーブルの列数は固定ですが、行数はどんどん追加される仕様となっています。
そのため、本来は行数や列数を選ばさせ、表を動的に作る内容としたかったのですが、ボリュームが増えそうなので今回は4×4の固定された表とさせていただきました。

コードの流れですが、createElement()でdivタグを生成し、その後にクラスやテキストを入れ、最後にappendChild()でブラウザに表示させるようにしています。
行はdlタグ、列はdtタグで作成しています。
こちらもcreateElement()でタグを生成し、その後クラスやテキストを入れ、最後にappendChild()でブラウザに表示させるようにしています。

```javascript
{
    // divタグで表を作る
    const table = document.createElement('div');
    table.classList.add('table');
    table.textContent = '表';
    document.body.appendChild(table);

    // dlタグで行を作る（今回は4つ）
    for (let i = 0; i < 4; i++) {
        const dl = document.createElement('dl');
        dl.classList.add('row');
        table.appendChild(dl); 
        //　dtタグで列を作る（今回は4つ）
        for (let j = 0; j < 4; j++) {
            const dt = document.createElement('dt');
            dt.classList.add('cell')
            dt.textContent = `${i}行${j}列`;
            dl.appendChild(dt); 
        }
    }
}
```

##最後に
Qiita初投稿になります！
今後もどんどんサンプルコードを書いていきたいと思いますので、よろしくお願いします。
Win10での環境変数の設定場所

が結構忘れるのでメモ失礼します。

https://proengineer.internous.co.jp/content/columnfeature/5205

・「コントロールパネル＞システム＞システムの詳細設定」
・「スタートボタン右クリック＞システム＞システムの詳細設定」

の↓に出るヤツで出来るのでしたっ＼(^o^)／
[MYSQL]サブクエリを使いレコードを更新する

## モチベーション
テストデータを作るのに`created_at`に`CURRENT_TIMESTAMP`を使用したので、バラツキのある日付にしたかった。
バラツキは100日前を制限とし更新したい。


```sample.sql
UPDATE
  users,
  (
    SELECT id, DATE_SUB(created_at, INTERVAL (ROUND(RAND() * 99 + 1)) DAY) as sub_users_created_at from users 
  ) AS date_sub_users
SET
  users.created_at = date_sub_users.sub_created_at
WHERE
  users.id = date_sub_users.id;
```

備忘録です。
GAE/Goアプリをアップグレード（go1.9→go1.11）するときに必要だった変更や、参考になった記事

GAE/Goアプリをアップグレード（go1.9→go1.11）するときに必要だった変更や、参考になった記事をまとめておく。

# `app.yaml`の変更点

```yaml:go1.9のapp.yaml
runtime: go
application: hogehoge
version: 1
api_version: go1

handlers:
- url: /admin/.*
  script: _go_app 
  login: admin
  secure: always

- url: /static
  static_dir: static

- url: /.*
  script: _go_app
  secure: always
  
threadsafe: true
  
automatic_scaling:
  min_idle_instances: automatic   # idle状態にあるインスタンスの最小値
  max_idle_instances: 1           # idle状態にあるインスタンスの最大値
  min_pending_latency: 3000ms     # リクエストを処理するまでに許される待ち時間の最小
  max_pending_latency: automatic   
```

```yaml:go1.11のapp.yaml
runtime: go111
handlers:
- url: /static
  static_dir: static

- url: /.*
  script: auto
  secure: always

automatic_scaling:
  min_idle_instances: automatic   # idle状態にあるインスタンスの最小値
  max_idle_instances: 1           # idle状態にあるインスタンスの最大値
  min_pending_latency: 3000ms     # リクエストを処理するまでに許される待ち時間の最小
  max_pending_latency: automatic
```

## diff
```diff
+ runtime: go111
- runtime: go
- application: hogehoge
- version: 1
- api_version: go1

- url: /admin/.*
-   script: _go_app 
-   login: admin
-   secure: always

- threadsafe: true
```
# ファイル、フォルダー構成の変更点

```plaintext:Before
+---app
   |   app.go
   |   app.yaml
   |   
   +---static
   |           
   \---templates

```

```plaintext:After
 .gcloudignore
 app.go
 app.yaml
 go.mod
 go.sum
+---static
|           
\---templates
```


# `app`ディレクトリをなくし、ルートディレクトリに`app.yaml`等を移動させた理由

[nouhau/app-engine/note/gaego19-migration-gaego111 at master · gcpug/nouhau](https://github.com/gcpug/nouhau/tree/master/app-engine/note/gaego19-migration-gaego111#working-dir%E3%81%8Clocal%E3%81%A8production%E3%81%A7%E5%A4%89%E3%82%8F%E3%82%8B)
> Go 1.9までは app.yaml の位置がWorking Dirでしたが、Go 1.11の場合、Productionはgo.modがある位置がWorking Dirになるようになります

# `app.go`の変更点
```diff
- func init() {
+ func main() {
	router := mux.NewRouter().StrictSlash(true)
	routerV1(router)

	http.Handle("/", router)
+	appengine.Main()
}
```

# 参考記事

## 1.9→1.11アップグレードについて
- [GAE/Go アプリケーションを Go 1\.11 に移行するためにやったこと \- えいのうにっき](https://blog.a-know.me/entry/2018/10/28/215508)
- [nouhau/app\-engine/note/gaego19\-migration\-gaego111 at master · gcpug/nouhau](https://github.com/gcpug/nouhau/tree/master/app-engine/note/gaego19-migration-gaego111)

## Modulesについて
- [Go Modulesの概要とGo1\.12に含まれるModulesに関する変更 \#golangjp \#go112party \- My External Storage](https://budougumi0617.github.io/2019/02/15/go-modules-on-go112/)
DjangoとArduinoを連動したIoT　初学者向け

こんにちは、rickyです。
今回はDjangoで作成できる簡単なToDoリストの状態の変化をArduino側で反映させるIoTを作製します。
比較的簡単に実装ができるのでぜひ一度お試し下さい。
対象者は、**ArduinoでLチカができる**、**Djangoのチュートリアルを1通り終えている**方を対象としています。

完成物としては、ToDoリストに要素がある時は赤いLEDが、要素がないときには青いLEDが点灯するようにします。
配線図はこちらです。
![Untitled Sketch_ブレッドボード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/2b5aacb2-97b3-5c41-752f-eb2f018a1ec3.jpeg)



手順としてはまずDjangoのToDoリストのアプリを作製します。
次にArduino側と通信するために必要なモジュールをインポートし要素を表示するためのクラスにシリアル通信のための記述を追加します。
最後にArduino側でLEDの点灯に関する記述を追加するという流れになります。

環境
ubuntu 18.10
Python 3.7.2
Django 2.1.5
Arduino 1.8.8

まずはDjangoで簡単なToDoリストを作製します。
作り方は@morudaraさんの[はじめてのDjango Part2 [実践編] ToDoリスト作成](https://qiita.com/morudara/items/f1b45cb0cda863d4b193)
という記事を参考にしました。

次にシリアル通信に必要なモジュールをインポートします。
コマンドからsudo pip3 install PySerialでPython3のserialモジュールをインストールします。
インポートが終わったら、記述をPreview_Todoクラスにシリアル通信のための記述を追加します。

```python:views.py
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse,HttpResponseRedirect
from django.urls import reverse
from .models import Post
from .forms import PostForm
from django.views import View
from django.views.generic.edit import CreateView,DeleteView
import serial,time

class Preview_Todo(View):
    def get(self, req, *args, **kwargs):
        posts = Post.objects.all()
        print(len(posts))
        ser = serial.Serial('/dev/ttyACM0', 9600)
        if len(posts) != 0:
            ser.write(b"0")
            time.sleep(5)
            ser.write(b"1")
        else:
            ser.write(b"2")
            time.sleep(5)
            ser.write(b"3")
        form = PostForm()
        context = {'posts': posts, 'form': form,}
        return render(req, 'todo/index.html', context)
index = Preview_Todo.as_view()

class Create_Todo(CreateView):
    def post(self, req, *args, **kwargs):
        form = PostForm(req.POST)
        form.save(commit=True)
        return HttpResponseRedirect(reverse('index'))
add = Create_Todo.as_view()

class Delete_Todo(DeleteView):
    def delete(self, req, id=None):
        post = get_object_or_404(Post, pk=id)
        post.delete()
        return HttpResponseRedirect(reverse('index'))
delete = Delete_Todo.as_view()

```

次にArduino側の設定になります。
[こちらの記事](https://k99-tech.com/blog/archives/812)を参考にしました
コードは以下のようになります。

```C:arduino
void setup() {
  Serial.begin(9600);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
}

void loop() {
  byte var;
  var = Serial.read();

  switch(var){
    case '0':
        digitalWrite(10, LOW);
      break;
    case '1':
        digitalWrite(10, HIGH);
      break;
    case '2':
        digitalWrite(9, LOW);
    case '3':
        digitalWrite(9, HIGH);
    default:
      break;
  }
}
```

これでToDoリストの要素の有無によってLEDが変わるコードが記述できました。
youtubeに動作している[動画](https://www.youtube.com/watch?v=WQ-tl5JSnfY)を上げておいたので記載しておきます。

感想
Djangoの成果物だけだとありきたりだったので今回LEDと連動させてIoTっぽくしてみました。
Arduinoと連動させるやり方がなかなか見つからず調べるのが大変でしたが、なんとかうまくできました。
ただ問題点として反映されるまでの時間が長いことが挙げられます。
クラスを呼び出す際にシリアル通信を行うために起きる現象だと考えられるのですが、現状改善する方法がわかりません。
またArduino側のコードが冗長に感じられる点も気になりました。
まだまだ技術的に未熟なのでこれらの点やもっとこうした方がいいという点があればご指摘いただけると幸いです。
Desktop : OpenCV Grab Cut

<h5>Goal</h5>
Test OpenCV grab cut.

```OpenCV_GrabCut.java
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class OpenCV_GrabCut {

    public static void main( String[] args )
    {
        try{
            System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
            Mat source = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\lena.jpg",
                    Imgcodecs.CV_LOAD_IMAGE_COLOR);
            bgSubtracting(source);
        }catch (Exception e) {
            System.out.println("error: " + e.getMessage());
        }
    }

    private static void bgSubtracting(Mat img) {
        Mat firstMask = new Mat();
        Mat bgModel = new Mat();//grabCut內部運算使用
        Mat fgModel = new Mat();//grabCut內部運算使用
        Mat mask;
        Mat source = new Mat(1, 1, CvType.CV_8U, new Scalar(3.0));
        //定義矩形
        Rect rect = new Rect(0, 0,150,200);

        ///執行grabCut處理(分割)行
        Imgproc.grabCut(img, firstMask, rect, bgModel, fgModel, 1, 0 );


        //得到前景
        Core.compare(firstMask, source, firstMask, Core.CMP_EQ);
        //生成輸出圖像
        Mat foreground = new Mat(img.size(), CvType.CV_8UC3, new Scalar(255,
                255, 255));
        //複製前景數據,符合挖出的區域
        img.copyTo(foreground, firstMask);

        mask = new Mat(foreground.size(), CvType.CV_8UC1, new Scalar(255, 255, 255));

        Imgproc.cvtColor(foreground, mask, Imgproc.COLOR_BGR2GRAY);
        Imgproc.threshold(mask, mask, 254, 255, Imgproc.THRESH_BINARY_INV);
        //挖出後的替代color
        Mat vals = new Mat(1, 1, CvType.CV_8UC3, new Scalar(255.0));

        img.setTo(vals, mask);
        Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\grab_cut.jpg", img);
    }

}
```
<h5>Result</h5>
![grab_cut.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276243/f6806cf7-5ca5-8ba5-ac3e-f2c8d2a90382.jpeg)
検索レイアウトで設定できるもの

オブジェクトマネージャの「検索レイアウト」で設定できるものが分かりやすく纏まっていて欲しかったので記事にしました。
色んなところに記事が散在している割にまとめると内容が薄くてちょっと萎えます。

## 一覧
* **タブ**…「最近使った～」で表示される項目。*Classic*のみ。
* **リストビュー**…カスタムビューに表示するボタンを編集できる。
* **ルックアップ検索**…参照先を編集するときに開かれる別ウィンドウに表示する項目を編集できる。*Classic*のみ。
* **ルックアップ電話ダイアログ**…サードパーティーのコールセンターとSalesforceを統合したときのみ用いるらしい。*Classic*のみ。
* **検索条件項目**…グローバル検索結果に表示する項目。*Classic*のみ。
* **検索結果**…*Lightning*で**ルックアップ検索**と**検索条件項目**が統合された。

## 他
* *Lightning*でルックアップ検索をしたとき、「検索結果」に設定した2番目の項目が薄く表示される。3番目以降の項目は虫眼鏡ボタンからウィンドウを開いた先で確認できる。
* 自レコードが参照先になっているレコード一覧(*Lightning*なら[関連]タブ、*Classic*なら下の方にあるリスト)は、自オブジェクトの画面レイアウトで編集する。検索レイアウトとは別なので注意。

## まとめ
* *Lightning*で気にするのは「検索結果」だけでいい。
* 「最近使った～」以外のリストビューで表示したいボタンを制御する「リストビュー」は*Lightning*・*Classic*共通。
EMR「You cannot specify a ServiceAccessSecurityGroup for a cluster launched in public subnet.」

# 問題
AWS Lambda（以下Lambda）からAmazon EMR（以下EMR）を起動する構成で、Lambdaのコードは通るのにEMRが立ち上がらない（リストには表示されるけどエラーになる）というあるあるな問題に遭遇。
そのエラーのクラスターをコンソールから手動でクローンして同じ設定で立ち上げるとエラーなく起動する、という謎な状態。

# エラーの内容
EMRのコンソール上部にでているメッセージは「You cannot specify a ServiceAccessSecurityGroup for a cluster launched in public subnet.」。
S3にクラスターのログはあがっていない。

# 環境
Lambda python3.6
EMR emr-5.15.0

# 解決方法
boto3のrun_job_flow()で指定するパラメータ「ServiceAccessSecurityGroup」の指定を外したら解決した。

# 原因
「ServiceAccessSecurityGroup」は
>プライベートサブネットでクラスターにアクセスするためにサービスが使用する (Amazon EMR によって管理される) EC2 セキュリティグループの ID です。

とのこと。
エラーメッセージの「You cannot specify a ServiceAccessSecurityGroup for a cluster launched in public subnet.」を翻訳すると「パブリックサブネットで起動されたクラスタにServiceAccessSecurityGroupを指定することはできません。」となるので、そのまま。。。クローンして正常に立ち上がってしまうところが厄介だった、、、（良しなに判断していらないならそのまま使用せずに立ててくれればいいのに）
本番環境とテスト環境をわけていて、本番環境ではプライベートサブネットに、テスト環境ではパブリックサブネットにそれぞれ構築している状態だったので、当たり前だけどなるべく環境合わせないと思わぬところで余計な時間食ってしまうといういい（？）例に。

# おまけ
LambdaからEMRを立てる場合、インスタンスサイズを指定するが、EMRが対応していないインスタンスサイズがあるので注意が必要。その他にも注意点はたくさんあるが、追々。

# 参考
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-emr-cluster-jobflowinstancesconfig.html
Anacondaの仮想環境を使ってkerasを使おう

# Kerasの環境をつくろう
```shell
pip install tensorflow
pip install tensorflow-gpu //GPUを使う場合
pip install keras
```
一応これでkerasを使うことができる。

しかし、これではkerasやtensorflowと干渉するモジュールを使うPythonを使う場合や異なるpythonのバージョンを使いたい場合など、いちいちパッケージの削除やインストールをし直す必要がる。

そこで、Pythonには仮想環境というものがある。

# Python仮想環境とは？なぜ仮想環境を使うのか？
PythonのモジュールやパッケージをPythonのバージョンごとに分割させた環境。

「あるパッケージを使うには別のパッケージをインストールする必要がある」など、Pythonのパッケージには依存関係がある。また、Pythonのバージョンによっても対応してたり対応してなかったりする場合もある。

仮想環境を使わないと、Pythonで作られたソフトウェアなどによって同じシステムですでに作られた環境を破壊したりする必要も出てくる。

# 仮想環境の種類
Pythonの仮想環境にはいろいろある

- pyenv
- virtualenv
- venv
- anaconda

など

とりあえず、Python3系であればanacondaかvenvが一番使いやすいと思われる。今回はanacondaを使おう。

# anacondaをインストールしよう。
anacondaは以下からダウンロードできる。
- https://www.anaconda.com/distribution/

自分の環境に合わせてダウンロードするanacondaを選ぼう。

## GUI環境がなくてウェブブラウザが使えない
wgetを使おう。

```shell
$ wget https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh
```
なおこのコマンドはPython3.7、Linux 64bit版のインストーラーがダウンロードされる。

各自バージョンや環境に合わせてURLに適切なものを選ぼう。

## インストール
Linuxの場合は以下のコマンドでインストールが開始される。

```shell
$ bash Anaconda3-2019.03-Linux-x86_64.sh
```

ライセンス許諾などいろいろ聞かれるが、デフォルトの選択を選んでおけばだいたい問題はないと思う。

# anacondaのコマンドたち
よく使うコマンドなので覚えておくといいかもしれない。

なお以下のコマンドはLinuxで使う場合である。Windowsとかだとちょっと違うかもしれない。

## インストールされているパッケージを表示する

```shell
$ conda list
```

## パッケージをインストールする

```shell
$ conda install keras
```
このコマンドはkerasがインストールされる。"keras"の部分をインストールしたいパッケージに変えれば、そのパッケージがインストールされる。

## 新しい仮想環境を構築する。
```shell
$ conda create -n hoge python=3.7
```
このコマンドは"hoge"という名前の仮想環境をPython3.7で構築する。

## 仮想環境に入る
```shell
$ conda activate hoge
```
hogeという仮想環境に入る

## 仮想環境から出る
```shell
$ conda deactivate
```
間違えてexitとか入力しないように注意しよう。

## 仮想環境の一覧を表示
```shell
$ conda env list
```

## 仮想環境を削除
```shell
$ conda env remove -n hoge
```
hogeという仮想環境が削除される。


# 改めて、Kerasを使って機械学習をする仮想環境を作ろう。
## 仮想環境を作ってその中に入ろう
```shell
$ conda create -n keras_env python=3.7
$ conda activate keras_env
```
1行目でkeras_envという仮想環境を作り、2行目でkeras_envに入る。

## まず、Tensorflowをインストールしよう。
```shell
$ conda install tensorflow
```
GPUを使いたい人は

```shell
$ conda install tensorflow-gpu
```

## そして、kerasをインストール。
```shell
$ conda install keras
```

# 動作確認的な
下のリンクにMNISTのサンプルコードがあるのでコピペして実行してみよう

https://qiita.com/samacoba/items/207f2650ee60fe1de25a

# おわりに
jupyter notebookをいい感じに使えるようにしたい。
vue.js 現在のパスに応じて表示したり隠したり

make ページでは メニュー要素を隠したい。
そんなときは以下のように書く。

```vue:vue.blade.php

    <el-footer id="footer" class="layout-footer" v-show="$route.path.indexOf('make') < 0">
こんな塩梅
    </el-footer>
```

これで現在のページが make にマッチしない時のみ メニューが表示されるようになる。
【再起動】あれ、自動で起動するはずのJupyterが動かない。

# 状況
計算機サーバで不具合が生じて再起動した後、Jupyterにアクセスしたところエラーの表示に遭遇。

# 対処法

```ch
~/.jupyter/jupyter_notebook_config.py
```
に対して

```diff
- c.NotebookApp.ip = '*'
+ c.NotebookApp.ip = '0.0.0.0'
```
と変更を加え再起動する。
再現性もあったので、バグなんでしょうか？
ラズパイとジャイロセンサのI2C通信について

ラズパイとジャイロセンサをI2Cで通信したかったので調べてみたところ、できそうなプログラム(https://shizenkarasuzon.hatenablog.com/entry/2019/03/06/114248)
がヒットした。
しかし、動いたもののプログラムの説明が全然無く結構悩まされたのでまとめておく。

#コード
```sample.py
# -*- coding: utf-8 -*-

import smbus
import math
from time import sleep
import time

DEV_ADDR = 0x68

ACCEL_XOUT = 0x3b
ACCEL_YOUT = 0x3d
ACCEL_ZOUT = 0x3f
TEMP_OUT = 0x41
GYRO_XOUT = 0x43
GYRO_YOUT = 0x45
GYRO_ZOUT = 0x47

PWR_MGMT_1 = 0x6b
PWR_MGMT_2 = 0x6c   

bus = smbus.SMBus(1)
bus.write_byte_data(DEV_ADDR, PWR_MGMT_1, 0)

def read_word(adr): 
    high = bus.read_byte_data(DEV_ADDR, adr)
    low = bus.read_byte_data(DEV_ADDR, adr+1)
    val = (high << 8) + low
    return val

def read_word_sensor(adr):
    val = read_word(adr)
    if (val >= 0x8000):  return -((65535 - val) + 1)
    else:  return val

def get_temp():
    temp = read_word_sensor(TEMP_OUT)
    x = temp / 340 + 36.53      # data sheet(register map)記載の計算式.
    return x

def getGyro():
    x = read_word_sensor(GYRO_XOUT)/ 131.0
    y = read_word_sensor(GYRO_YOUT)/ 131.0
    z = read_word_sensor(GYRO_ZOUT)/ 131.0
    return [x, y, z]


def getAccel():
    x = read_word_sensor(ACCEL_XOUT)/ 16384.0
    y= read_word_sensor(ACCEL_YOUT)/ 16384.0
    z= read_word_sensor(ACCEL_ZOUT)/ 16384.0
    return [x, y, z]


while 1:
    ax, ay, az = getAccel()
    gx, gy, gz = getGyro()
    print ('{0:4.3f},   {0:4.3f},    {0:4.3f},     {0:4.3f},      {0:4.3f},      {0:4.3f},' .format(gx, gy, gz, ax, ay, az))
```

#解説
###ACCEL_XOUT = 0x3b ...
最初にズラーと並んでいる16進数は、レジスタのアドレスを指定している。
I2Cデバイスにはセンサ部分とレジスタ部分があり、ラズパイからはそのレジスタの読み書きを行う。
つまりその指定したアドレスにそれぞれセンサの値を入れてくれるという仕組みだ。
しかし、なぜ一個飛ばしなのか。
それはセンサから取得する情報は16bitであるのに対し、レジスタの一つのアドレスにつき格納できるのが8bitまで。
つまり二つのアドレスに格納する必要があるので一つ飛ばしになっている。

###def readword(adr)
ここで行なっているのは指定したアドレスのデータを読むこと。
データは先ほども言った通り連続する二つのアドレスに格納されているのでそれぞれ読んであげる。
あとは前半部分を8bit分左へシフトしてあげればセンサが取得した値そのものになる。

###参考
https://shizenkarasuzon.hatenablog.com/entry/2019/02/16/162647
ここでも他の部分の解説をしているので参考に。
Swift 5でユニバーサルリンク(Universal link)でアプリを開いても、何も起きない時

こんにちは、こげばんです
Swift5にバージョンアップした時に起きた問題になりました。

タイトルの通り、
ユニバーサルリンクを開いて、アプリを立ち上げたけど何も画面遷移しないし、動かないくて少し困りました。

1. 原因
2. 対処方法
3. 影響範囲

## 1. 原因
元々のメソッドは、下記を使っていました。

```swift:AppDelegate.swift
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool　{
  guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL, let _ = URLComponents(url: url, resolvingAgainstBaseURL: true) else {
    return 
  }
  print(url)
}
```

buildしながら見てみると、ユニバーサルリンクでアプリに来た時に稼働していないことに気がつきました。
リリース直前に気が付いて、焦っていましたw
Swift5にバージョンアップしたタイミングで、メソッドの呼ばれ方が変わったんだと思います。。。。

## 2. 対処方法
そこでいろいろ見ていましが、teratailのこちらを参考にしました。
https://teratail.com/questions/171281
下記のように修正しました。

```swift:AppDelegate.swift
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool　{
  guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL, let _ = URLComponents(url: url, resolvingAgainstBaseURL: true) else {
    return false
  }
  print(url)
}

⬇️

func application(_ application: UIApplication, continue continueUserActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
  guard continueUserActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = continueUserActivity.webpageURL, let _ = URLComponents(url: url, resolvingAgainstBaseURL: true) else {
    return false
  }
  print(url)

}
```

そしたら動くようになりました！
めでたしめでたし〜

## 3. 影響範囲
今のところは、ユニバーサルリンクの範囲でそれ以上は発生していない感じです。
何か新しいことがあったら、追記していきたいと思いますmm
TensorFlow Lite実行時の"pure virtual method called"の解消

Rasbian8(Jessie)でビルドしたTensorflow Liteをリンクしたバイナリーを実行すると「pure virtual method called」や「Segmentation Fault」と出て実行できない状況の修正ポイントです。

# 前提

下記にRaspberryPiでのTensorFlow Liteのビルド方法が詳しく書かかれています。

Deep Learningアプリケーション開発 (6) TensorFlow Lite with C++ on Raspberry Pi
https://qiita.com/iwatake2222/items/4d198f6203348ef7fd31

※最新ブランチ(19/5/27現在)ではうまくでできなかったので、記事中のbranch指定は重要です。

この通りにやればRasbian9(Strech)上ではうまく動くのですが、Rasbian8(Jessie)では、ビルドは成功するものの実行時に「pure virtual method called」と出て落ちてしまいます。

# 解消方法

以下に答えがありました。

Tensorflow lite aborts due to "pure virtual method called" on Raspberry Pi #22510
https://github.com/tensorflow/tensorflow/issues/22510

> vvigilante commented on 30 Sep 2018 
> I got it running. Compile flag -march=armv7-a seems to break things.
Just removing that flag worked for me.
I don't know if it is related to gcc version (mine is 4.9.2). I'm doing other tests.

と書いてあり、closeされているのですが、Makeファイルにもarmv7-aなんて書いていないのでどこだろう...と悩むこと数日。Strechでは正常に動くことからOSアップデートで逃げようとしていたところ、見つけました！

targetの下にincludeファイルがあったのですね...。この中のCXXFLAGSとCCFLAGSにある```-march=armv7-a \```を削除してコンパイルしなおしたところ、正常に動作しました！

```tensorflow/lite/tools/make/targets/rpi_makefile.inc
...
  ifeq ($(TARGET_ARCH), armv7l)
    CXXFLAGS += \
      -march=armv7-a \   ←ここを削除
      -mfpu=neon-vfpv4 \
      -funsafe-math-optimizations \
      -ftree-vectorize \
      -fPIC

    CCFLAGS += \
      -march=armv7-a \　　←ここを削除
      -mfpu=neon-vfpv4 \
      -funsafe-math-optimizations \
      -ftree-vectorize \
      -fPIC

    LDFLAGS := \
      -Wl,--no-export-dynamic \
      -Wl,--exclude-libs,ALL \
      -Wl,--gc-sections \
      -Wl,--as-needed
  endif
...
```

たぶんgccが4.9→6.3になっている違いかと思いますが、詳しくは不明です。いまさらJessieが必須なのも少ないかもしれませんが、メモとして残しておきます。

# などなど

Raspberry Pi3上で400ms程度で推論できました。この速度だと画像分類でも実用になりそうですし、もっとリアルタイム性が必要であればTPUも使えるかもしれないので夢が広がります。

```
time 399.459000[ms]
prob of 0: 0.962
prob of 1: 0.000
prob of 2: 0.038
```