OmniAICreator/Qiita-1.07M huggingface dataset:
MongoDBをpymongoで操作してみる

# はじめに
最近、mongoDBを触る機会が多いので、pythonと組み合わせて処理させてみました。

# DBに接続
まずはpymongoをインポートしよう
```
from pymongo import MongoClient
```
続いて、データベースに接続する。
この例では、localhostのポート番号27017に接続し、
testというデータベースにつないだ上で
id/passで認証を行い、
bookという名前のコレクションに接続している。
```
client = MongoClient('localhost', 27017)
database = client['test']
database.authenticate("id", "apass")
collection = database['book']
```

# データ抽出(select/find)
## 基本形
フィルタ条件なしでコレクションの全データを取ってくるスタイル
```
filter = {}
collection.find(filter=filter)
```
## 単純なフィルタ
フィールドの値が等しいものだけを検索
下記の例ではフィールド名starがvalue2であるレコードを抽出しています。
```
filter = {'star': 'value2'}
collection.find(filter=filter)
```
## 否定のフィルタ
star属性がvalue2では無いレコードを検索する
```
filter = {'star': {$ne: "value2"}}
collection.find(filter=filter)
```


## フィールドの存在有無に起因するフィルタ
フィールドの値の存在有無を検索する。下記の例ではbirth属性が存在するレコードを検索している。
```
filter = {"birth": {"$exists": True}}
collection.find(filter=filter)
```

## 複数条件の複合検索
フィールドの値の存在有無を検索する。下記の例ではbirth属性が2005 かつ　name属性が testaccであるレコードを検索している。
```
filter = {$and: [{'birth': '2005'},{"name": 'testacc'}]}
collection.find(filter=filter)
```
Laradockを使ってLaravel環境を構築する

Laradockを使ってLaravel環境を構築する方法を以下にまとめる。

## 環境

- OS: macOS 10.14
- docker: Docker Desktop 2.2

## 手順

### Laradockを git clone

プロジェクトのディレクトリに移動して、cloneする

```
git clone https://github.com/LaraDock/laradock.git
```

### laradockディレクトリに移動し、.envをコピーして作成

```
cd laradock
cp env-example .env
```

### docker-composeで必要ファイルをダウンロードし、コンテナ初期化 

ダウンロードと初期化完了まで30分くらいかかるので気長に待つ。

```
docker-compose up -d nginx mysql phpmyadmin workspace 
```

起動中のdockerのプロセスを確認

```
docker ps
```

このとおり起動中のコンテナが確認できる。

![_ 2020-02-22 14.57.36.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6121/61a0e204-ed4e-a2c6-a436-cdd6be1a426f.jpeg)


### workspaceコンテナへログイン

Laravelプロジェクトを仮想環境上に作成するため、コンテナworkspaceにログインします。

```
docker-compose exec --user=laradock workspace bash
```

### laravel の新規プロジェクト作成

次を実行すると、laravel（version5.8） で、「lara_sample」のディレクトリで新規プロジェクトが作成されます。

```
composer create-project laravel/laravel lara_sample --prefer-dist “5.8.*”
```

プロジェクト作成完了したら、コンテナからログアウトする。

```
exit
```

### .env の書き換え

laradockの.envを書き換えて、共有ディレクトリを設定する。

```
#変更前
APP_CODE_PATH_HOST=../

#変更後
APP_CODE_PATH_HOST=../lara_sample
```

### コンテナの再起動

設定変更を反映するため、以下のとおり再起動後、`http://localhost/` にアクセスして、Laravelの初期画面が表示されることを確認する

```
# サービスの停止
docker-compose stop

# dockerを起動する
docker-compose up -d nginx mysql
```
apollo clientのcache機能を使った際にcacheが上書きされる

# はじめに

apollo client V3.0のベータ版がリリースされ、そろそろcacheを使いこなしたいと思う今日この頃。凡ミスで時間を取られたので、備忘録として残しておきます。

# 今回出会った問題

今回はコメントリストを呼び出す例を題材に出会った問題を書き残しておきます。

## Server側の実装
まずは以下のようなサーバー側のコードを考えます。


```Javascript:sever.js
const { ApolloServer, gql } = require("apollo-server");

const typeDefs = gql`
  type Comment {
    id: ID
    title: String
    comment: String
  }

  type Query {
    commentDetail(title: String): Comment
  }
`;

const commentsList = [
  {
    id: 1,
    title: "初めて利用してみた",
    comment: "このサービスは素晴らしい"
  },
  {
    id: 1,
    title: "何回でも使いたくなるサービス",
    comment: "こんな素晴らしいサービスは見たことが無い"
  }
];

const resolvers = {
  Query: {
    commentDetail: (root, args) => {
      const com = commentsList.find(p => p.title === args.title);
      return com;
    }
  }
};

const server = new ApolloServer({ typeDefs, resolvers });

server.listen().then(({ url }) => {
  console.log(`Server ready at ${url}`);
});
```

commentListのidが重複してるのに気づくと思います。
この状態でcacheを有効化してみたいと思います。

## cacheの設定

InMemoryCacheを使います

```javascript
import { ApolloClient, HttpLink, InMemoryCache } from "@apollo/client";

const link = new HttpLink({
  uri: "http://localhost:4000/graphql"
});

const client = new ApolloClient({
  link,
  cache: new InMemoryCache(),
  defaultOptions: {
    watchQuery: {
      fetchPolicy: "cache-first"
    }
  }
});
```

上のようにApolloClientを呼び出す際、`fetchPolicy`に`"cache-first"`を指定してあります。ただデフォルトで`"cache-first"`が指定されているので、書いても書かなくても同じです。

## query

今回以下の2つのqueryを交互に投げてcacheはどう保存されていくか、確認します

```javascript
const COMMENTS_QUERY = gql`
  {
    commentDetail(title:"初めて利用してみた"){
      id
      comment
    }
  }
`;
```
```javascript

const COMMENTS_QUERY = gql`
  {
    commentDetail(title:"何回でも使いたくなるサービス"){
      id
      comment
    }
  }
`;
```

## 結果
`InMemorycache`の`data`内部に`ROOT_QUERY`があり、そこに呼び出されたデータが蓄積されていきます。そしてidが付いているものは、`__ref`に参照先が追加され、`ROOT_QUERY`と同階層に参照元データが追加されて行きます。今回idを同じに設定したため `__ref`が同じcacheを見に行き、表示が更新されないということになっています。（下にcacheの中身の参考画像を貼ります。）
これはidをちゃんとユニークにつけておけば問題ないです。

![スクリーンショット 2020-02-10 18.01.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449631/9c485bbf-b33b-8e9b-447a-0d4a2eeb1c88.png)


# idをつけなかったらどうなるか
今idが同じものであったためにcacheの重複が起こりました。idを消すと`__ref`が消え、ROOT_QUERYにデータが全て保存されるようになります。今回の場合、`commentDetail({"title":"何回でも使いたくなるサービス"})`の部分がkeyになり、cacheにどんどん保存されます。この場合だと参照先がないので、同じデータを見にいくことはありません。しかしこの場合も`title`が同じ場合は希望通りの挙動が出ない場合があるので、idはちゃんと降っておいたほうがいいかなと思います。

# 参考文献
以下の記事を参考にさせていただきました。ありがとうございました。
[apollo-clientを使っていてデータが変に重複してる（キャッシュが変）？と思った時に見てみる事](https://qiita.com/github0013@github/items/0d9fde930cc732ce2c4a)
UPDATE文作成マクロ

```vb:MakeUpdate
Option Explicit

Sub MakeUPDATE()

'SQLシートをクリア
SQL.Cells.Clear

Dim sqlstring1 As String
'テーブル名を取得
sqlstring1 = "UPDATE " + DATA.Range("B3") + " SET "

'表の範囲を取得
Dim maxcol As Integer
Dim maxrow As Integer

maxcol = Range("B6").End(xlToRight).Column
maxrow = Range("B6").End(xlDown).row

'1カラムだけだと16384が返ってくるので2を無理やり代入
If maxcol = 16384 Then
  maxcol = 2
End If

'UPDATE文の生成
Dim colindex As Integer
Dim rowindex As Integer
Dim sqlstring2 As String
Dim wherestring As String

For rowindex = 7 To maxrow

'  Where句の値を先に取得
  wherestring = " WHERE " & DATA.Cells(6, 2).Value & " = " & makeSetValue(DATA.Cells(7, 2)) & ";"
  For colindex = 3 To maxcol
  
    sqlstring2 = sqlstring2 & DATA.Cells(6, colindex) & " = " & makeSetValue(DATA.Cells(rowindex, colindex))
    
    If colindex <> maxcol Then
        sqlstring2 = sqlstring2 & ", "
    Else
    ' カラム定義の最後尾の処理
        Dim sqlstring As String
        sqlstring = sqlstring1 & sqlstring2 & wherestring
        SQL.Cells(rowindex, 1) = sqlstring
        
        sqlstring = ""
        sqlstring2 = ""
        
    End If
  Next
  
Next

End Sub

'セルの内容を判定して空ならNULL文字列を返す
'文字列型なら''で囲んで返す
'それ以外は単なるstringにして返す
Function makeSetValue(targetCell As Range)
    Dim valuestring As String
    
    If IsEmpty(targetCell.Value) = True Then
      valuestring = "NULL"
    ElseIf TypeName(targetCell.Value) = "String" Then
      valuestring = "'" + targetCell.Value + "'"
    Else
      valuestring = CStr(targetCell.Value)
    End If
    
    makeSetValue = valuestring
End Function



```
JMeter チートシート


# JMeter とは

自動でブラウザ操作をするツール
主にラッシュテストに使う
ちょっとした操作なら[postman](https://www.postman.com/) の方が優秀だが、
**postman は複数スレッドを起動できないため、JMeterを使わざるおえない**　

# 前提

JMeterのインストール先：c:\apache-jmeter-5.2.1


# JMeter の起動（画面）

```:jmeter_view.bat

set JMETER_LANGUAGE=-Duser.language="ja" -Duser.region="JP"
c:\apache-jmeter-5.2.1\bin\jmeter.bat -H "プロキシホスト" -P "プロキシポート" -u "プロキシユーザー" -a "プロキシパスワード" -t honya_rush_test.jmx
```


1行目：日本語化
2行目：jmeterをviewモードで起動
　起動オプション
　-t：ブラウザ操作の設定を保存するファイル名。初回はファイルがないのでエラーになる

# JMeter の設定（画面）

![jmeter_view.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63018/69f735fc-9353-1c5d-2fd1-99bfc61231a3.png)


外部から設定した方が便利な設定は、変数にする
**書式：${__P(変数名)}**

ここでは、スレッド数、Ramp-Up期間、ループ回数を変数にした。



# JMeter の起動

起動するごとに日時フォルダを作成し、結果をまるっと保存する設定

```:jmeter_run.bat
set time_tmp=%time: =0%
set now=%date:/=%%time_tmp:~0,2%%time_tmp:~3,2%%time_tmp:~6,2%

set JMETER_LANGUAGE=-Duser.language="ja" -Duser.region="JP"
c:\apache-jmeter-5.2.1\bin\jmeter.bat -H "プロキシホスト" -P "プロキシポート" -u "プロキシユーザー" -a "プロキシパスワード" -n -t honya_rush_test.jmx -Jthread_count=100 -Jloop_count=100 -Jramp_up=100 -j %now%/jmeter.log -l %now%/jmeter.jtl -e -o %now%/report

```

1行目、2行目：日時フォルダ名の設定
4行目：日本語化
5行目：jmeterをバッチモードで起動
　起動オプション
　-t：viewモードで作成したファイル名
　-n：jmeterをバッチモードで起動
　-J変数名=値：viewモードで設定した外部設定にした変数に値を入れる
　-j：ログファイル名
　-l：テスト結果出力先ファイル名
　-e：レポートを出力する
　-o：テスト結果出力先フォルダ名


# あとがき

-a がパスワード って、passwordの a かな?
-l がテスト結果ということは、もしかして leport?？
-j がログファイル名? 
![genkai-3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63018/feb9576e-d9a2-0567-795d-efe1871097db.gif)

###**覚えられないオプションよりチートシート**


# おまけ

#### JMeterのインストール
java8 以上が必要

[Apache JMeter 5.2.1](http://jmeter.apache.org/download_jmeter.cgi)　公式

　[apache-jmeter-5.2.1.zip](http://ftp.tsukuba.wide.ad.jp/software/apache//jmeter/binaries/apache-jmeter-5.2.1.zip)　zipの直リン（2020/2/10現在）
Power Automateで文字列を1文字ずつに分割する方法

前に英数字の全角と半角の変換をPower Appsで作った際、「入力文字列を1文字ずつに分割する」という操作を入れたのですが、それをPower Automateでもできないかと思って試したのでご紹介です。

Power Appsだと、 ```Split(文字列, "")``` で簡単に配列化することができるのですが、 Power Automateでも同じように ```split(文字列, '')``` としてみると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/ca730d43-24f7-56ec-5c21-3f20f42f7880.png)
このように、分割してくれないのです。

# 文字列を1文字ずつに分割する
ではどうするかというと、**substring**関数を利用します。
substring関数は、与えられた文字列の、N文字目からM文字を取り出すという関数です。
例えば

```
substring('HelloWorld',2,3)  --> llo
```
こんな風に文字列を抽出できます。注意しなければいけないのは、「N文字目」が0から始まるところです。

ここだけ気を付ければ、任意の文字列を1文字ずつに分割するには**substring(文字列,N,1)**とすればいいとわかります。
反復処理でApply for each を使ってもいいのですが、1アクションで済ませることができるので、そちらを紹介します。

## Select + range + substring
何か決まった規則で配列を作るときはSelectアクションが有効です。このアクションの詳細は[Shibateaさんの投稿](https://qiita.com/shibatea/items/a07ecd00697d26417e70)をご覧ください。

今回の方法では、Selectの入力として、**range**を利用します。
※rangeはrange(N,M)で、NからM個の整数列を返す関数 ex: ```range(2,3) --> [2,3,4]```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/f1d32da2-dcf1-174c-0309-f8466faff8f1.png)
まずはrange関数で、0~入力文字の長さ分だけ整数の配列を用意しました。
Hello Worldの例では、空白も含めて [0,1,2,3...,10]の配列が生成されます。

次にSelectアクションのMapですが、ここは[前の投稿](https://qiita.com/h-nagao/items/25fb21d7133e25c07a34#compose-json-dictionary-method)で紹介した手順を用います。
中に入れる数式は

```
substring(variables('InputString'), item(), 1)
```
です。
この場合のitem()は、[0,1,2,3,...,10]の各数字になります。つまり、
[0文字目から1文字, 1文字目から1文字, 2文字目から1文字....,10文字目から1文字]
という配列が、この数式で返されるわけです。

実際動作させてみると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/1a86c64a-1731-74e1-2ec6-4296ed82d228.png)

無事1文字ずつに分割できました！

入力の文字列を除いて、なんと1アクションです！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/1e2d8725-26b6-7d92-970e-4990b7bf6134.png)

これを利用すると全角半角変換の対象文字列を1文字ずつに分割して、変換できるんです。

# まとめ
Power Automateでは・・・
- split関数の分割では、空文字での分割は不可
- substring関数を使うと、文字列を部分的に抽出できる
- rangeは賢い
- Selectすれば配列を簡単に作れる

あまり使いどころもないかもしれませんが、空文字("")での分割がしたくなったら試してみてください！
AtCoder言語アップデートでRustの入出力が楽になっていた

[AtCoderの言語アップデート](https://atcoder.jp/contests/language-test-202001)（現在テスト公開中？）でRust環境に入出力系の便利ライブラリが追加されていました。ライブラリを使うと入出力周りがかなりスッキリ書けるようになっていたので紹介します。
追加されているライブラリの一覧はこちら（[https://github.com/rust-lang-ja/atcoder-rust-base/blob/ja-all-enabled/Cargo.toml](https://github.com/rust-lang-ja/atcoder-rust-base/blob/ja-all-enabled/Cargo.toml)）


## 確認に使用する問題
https://atcoder.jp/contests/language-test-202001/tasks/abc086_a
> ## 入力
> 入力は以下の形式で標準入力から与えられる。
>
> ```
> a b
> ```
> 
> ## 出力
> 積が奇数なら Odd と、 偶数なら Even と出力せよ。


## ライブラリ使用なしのコード
まずはライブラリ使用なしで解いた場合のコードです。

```rust
fn main() {
    let mut buf = String::new();
    // 標準入力をStringで読み込み。IOは失敗するのでunwrap()
    std::io::stdin().read_to_string(&mut buf).unwrap();
    // 空白区切りのiteratorに分割
    let mut iter = buf.split_whitespace();

    // iteratorからnext()で値を取り出し、parseでi32に変換。next(), parse()ともに失敗するのでunwrap()
    let a: i32 = iter.next().unwrap().parse().unwrap();
    let b: i32 = iter.next().unwrap().parse().unwrap();
  
    let answer = if a % 2 == 0 || b % 2 == 0 { "Even" } else { "Odd" };
    println!("{}", answer)
}
```

標準入力、空白区切り、数値変換がそれぞれ失敗する可能性があるのはわかりますが、毎回unwrap()を書くのは面倒ですね。
rustでAtCoderに参加している方はこのあたりの面倒な処理をマクロで解決していることが多いようです。

## ライブラリ使用ありのコード
AtCoder環境に追加された[ライブラリ一覧](https://github.com/rust-lang-ja/atcoder-rust-base/blob/ja-all-enabled/Cargo.toml)には、入出力周りで以下3つのライブラリが追加されています。

+ [proconio](https://docs.rs/proconio/0.3.6/proconio/)
+ [text_io](https://docs.rs/text_io/0.1.8/text_io/)
+ [whiteread](https://docs.rs/whiteread/0.5.0/whiteread/)

それぞれのライブラリを使用した場合のコードを示します。

### proconio
名前の通りプロコンのIO専門のライブラリのようです。
input!マクロの中に読み込む値を並べると自動的に値を読んでくれます。今回使用しませんでしたが、多次元配列を読み込む機能もあるようでかなり高機能なライブラリです。

```rust
use proconio::input;

fn main() {
    input! {
        a: i32,
        b: i32,
    }
    
    let answer = if a % 2 == 0 || b % 2 == 0 { "Even" } else { "Odd" };
    println!("{}", answer)
}
```

### text_io
read!()マクロで1ブロックずつ値を読み込むライブラリです。
C++のstd::cinに近い挙動でしょうか。

```rust
#[macro_use] extern crate text_io;

fn main() {
    let a: i32 = read!();
    let b: i32 = read!();
    
    let answer = if a % 2 == 0 || b % 2 == 0 { "Even" } else { "Odd" };
    println!("{}", answer)
}
```

### whiteread
こちらは1行単位で読み込んで、空白区切り分割&parse()をまとめてくれるライブラリです。
もともとの問題が何度もunwrap()しないといけないのが面倒ということで、unwrap()を一回にまとめてくれている感じです。問題をシンプルに解決していて個人的には一番好みです。

```rust
use whiteread::parse_line;

fn main() {
    let (a, b): (i32, i32) = parse_line().unwrap();
  
    let answer = if a % 2 == 0 || b % 2 == 0 { "Even" } else { "Odd" };
    println!("{}", answer)
}
```

## 終わりに
AtCoder言語アップデートでRust環境に追加された入出力ライブラリを紹介しました。
どのライブラリを使用する場合でも入出力をシンプルに書けて楽ですね。
今回は整数２つを読むだけのシンプルな入力でしたが、配列やグラフ構造の入力が必要な問題ではまた印象が変わってくると思います。

入出力のやりかたを調べるのが面倒でRustでAtCoder参加をためらうことがありましたが、
これらのライブラリが正式に使えるようになったらまた挑戦して見ようと思います。
unshift, shift, pop, push, splice

<p class="codepen" data-height="1000" data-theme-id="default" data-default-tab="result" data-user="mykysyk" data-slug-hash="BaNNKjO" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="unshift, shift, pop, push, splice ">
  <span>See the Pen <a href="https://codepen.io/mykysyk/pen/BaNNKjO">
  unshift, shift, pop, push, splice </a> by mykysyk (<a href="https://codepen.io/mykysyk">@mykysyk</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
TextMeshProを使ったVCIをexe(runtime)実行で出力できない場合の対策

#概要
VCIをexe(runtime)実行で出力するときに困ったことを共有します。

#Version
Unity 2019.3.0f6
UniVCI-0.24

#現象
TextMeshProを含むとexe(runtime)実行で出力できません。

#原因
VCI.Exportから参照されるUniGLTF.ShaderPropExporter.ShaderPropsの中身にはUNITY_EDITORの記述があり、EditorはUnityEditor.ShaderUtilを使い、exe(runtime)ではUniVRMがそれ相当の実装を持つのですが、VRMはTextMeshProなど知らないので……、という予想です。

#対策
無いなら作る。知らないなら教える。ということで、UniGLTF.ShaderPropExporter.PreShaderPropExporterにTextMeshPro/Distance Fieldをでっちあげます。ホントは中身があった方が良いと思いますが、無くても動いたので気にしないことにしました。

```cs
using System.Collections.Generic;


namespace UniGLTF.ShaderPropExporter
{
    public static partial class PreShaderPropExporter
    {
        [PreExportShader]
        static KeyValuePair<string, ShaderProps> TextMeshPro_Distance_Field
        {
            get
            {
                return new KeyValuePair<string, ShaderProps>(
                    "TextMeshPro/Distance Field",
                    new ShaderProps
                    {
                        Properties = new ShaderProperty[]{}
                    }
                );
            }
        }
    }
}
```

たぶん何処にどんな名前で保存しても良いと思うのですが、私は以下へ保存しました。
.\Assets\VRM\ShaderProperty\Runtime\TextMeshPro_Distance_Field.cs
シェルスクリプトの便利な関数

# 概要
シェルスクリプト（bash）でスクリプトを書く上で利便性の高い関数をまとめました。

## CLI

### 色付きのecho

赤、青、黄の3種類を用意しておくと、エラー、メッセージ、警告と使い分けられます。

#### 赤

エラーなどに使います。

```bash
function echo_r () {
    echo -e "\033[1;31m$@\033[0;39m" >&2
    return 0
}
```

#### 青

経過表示などに使います。

```bash
function echo_b () {
    echo -e "\033[1;36m$@\033[0;39m"
    return 0
}
```

#### 黄

警告などに使います。

```bash
function echo_y () {
    echo -e "\033[0;33m$@\033[0;39m" >&2
    return 0
}
```

### ユーザの存在をチェック

存在するなら`true`しないなら`false`を返します。

```bash
function user_check () {
    if [[ $(getent passwd $1 > /dev/null ; printf $?) = 0 ]]; then
        true
    else
        false
    fi
}
```

使い方

```bash
if user_check hoge; then
    echo "ユーザーhogeは存在しています。"
else
    echo "ユーザーhogeは存在していません。"
fi
```

####補足
コメントで教えてもらいましたが、以下のようにもできるようです。
if文は長くなってしまいますが、全体の行数は減りますね。

```
if id hoge >/dev/null 2>&1; then
    echo "ユーザーhogeは存在しています。"
else
    echo "ユーザーhogeは存在していません。"
fi
```

## GUI
シェルスクリプトでGUIを扱うには`zenity`を使います。
簡単なGUIフロントエンドはこれで十分実装できます。

### ウィンドウの基本
下のスクリプトはこれを定義した上で使います。

```bash
function window () {
    zenity \
        --title="ウィンドウタイトル" \
        --window-icon="ウィンドウアイコン" \
        $@
}
```

### 経過

```bash
function info () {
    window \
        --info \
        --width="$1" \
        --height="$2" \
        --text="$3"
}
```

使い方


```bash
info <横幅> <高さ> "文字列"　
info 500 100 "処理が完了しました。"
```

### 注意

```bash
function warning () {
    window \
        --warning \
        --width="$1" \
        --height="$2" \
        --text="$3"
}
```

使い方

```bash
warning <横幅> <高さ> "文字列"　
warning 500 100 "デバッグモードです。"
```

### エラー

```bash
function error () {
    window \
        --error \
        --width="$1" \
        --height="$2" \
        --text="$3"
}
```

使い方

```bash
error <横幅> <高さ> "文字列"　
error 500 100 "エラーが発生しました。"
```

### ローディング

```bash
function loading () {
    window \
        --progress \
        --auto-close \
        --pulsate \
        --width="$1" \
        --height="$2" \
        --text="$3"
}
```

使い方

```
<コマンド> | loading 500 100 "文字列"
sleep 5 | loading 500 100 "読み込み中です..."
```
Pythonista(iPhone)からプログラミング・フォロを操作する

#目的
iPhone上でPythonのプログラムを書いて実行できるPythonista3上でBluetoothを使ったプログラムが作れるのが分かったので、プログラミング・フォロを操作するプログラムを作ってみた。
##Pythonista3
iPhone(iOS)上で動作するPythonの統合環境です。
有料で少し高いんですが、iPhoneのカメラや加速度センサーやBluetoothも扱うことも出来るし、NumPyやMatplotlibなどの一般的なライブラリも使えるので、いろいろ遊べる環境です。
なんと言ってもiPhone上で作って実行できるので、ネイティブなプログラム開発に必要なMacがなくてもアプリが作れるのが魅力です。
追加でstashをインストールすると、ssh/scpとかgitも使えます。
##プログラム
[プログラムはgithubに置いてます](https://github.com/roxa-delphi/microbit/blob/master/iphone_ctrl_folo_2.py)
Bluetoothの操作にはcbライブラリを利用してます。
UI上でボタンの押しっぱなしに対応するためにsceneライブラリを使用してます。
ただし今回作ったGUIではボタンの状態はOnかOffの2値しか取得出来ず中間の値を取得出来ないので、速度コントロールは出来ません。
また、マルチタッチには対応してません。
micro:bitとの接続が出来てしまえば、あとは「[PS3コントローラーでプログラミング・フォロを操作する](https://qiita.com/roxa/items/3e7fe604043776397edc)」とあまり変わらず、micro:bitのI/O端子に信号を送るだけです。
##実行
実行するとこんな風に動きました。
iPhoneから直接micro:bitを操作できるので、便利で楽しいです。
![iphone_folo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576327/9fd61a99-dc56-a73c-5478-7ac5d4a9942e.gif)
##関連URL
- [PS3コントローラーでプログラミング・フォロを操作する](https://qiita.com/roxa/items/3e7fe604043776397edc)
QGISでベクタータイルをレイヤーとして追加する

## はじめに
最近、[MapTilerの日本向けサービス開始](https://internet.watch.impress.co.jp/docs/column/chizu3/1232026.html)が話題になりましたが、従来のサービスと何が違うかと言えば、ラスタータイルに加え、ベクタータイルが配信された点です。ベクタータイルが何かという説明は省きますが、昨今の地図配信で外せない要素と感じ、色々いじっています。FOSS4Gっ子ならやっぱりQGISでベクタータイル、表示したいですよね？この記事で、表示する方法（プラグイン）を紹介します。

## 目標
以下のように、ベクタータイルをQGISレイヤーとして読み込む。
こうなれば、欲しいレイヤーを外部ファイルに出力も出来ます、夢が広がりますね！
![スクリーンショット 2020-02-10 23.15.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/94d3d5be-1c8d-345d-175d-66ee94710790.png)
© MapTiler © OpenStreetMap contributors

## Vector Tiles Reader
https://github.com/geometalab/Vector-Tiles-Reader-QGIS-Plugin
公式リポジトリにも登載されているので、QGISからシームレスにインストール可能です。

## 使い方
![スクリーンショット 2020-02-10 22.55.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/e904c35a-6026-dc75-3718-550189c03d6d.png)

![スクリーンショット 2020-02-10 22.56.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/180185a8-de7d-3758-1d8a-cf40503eb759.png)

プリセットされているMapTiler.comなどのレイヤーを追加出来ますが、今回は任意のベクタータイルを追加する事を考えます。

#### 追加方法
Connections下部のNewを押下すると、上画像のようなダイアログが表示されます。以下のとおり入力してSaveしましょう。

- Nameには任意の文字列
- TileJSONにはtiles.jsonのURL
- GL Style JSON URLにはstyle.jsonのURLを（Optional）

tiles.jsonのURLがわからないけどstyle.jsonはわかる場合、style.jsonの中身を見るとtiles.jsonの在り処もわかります（tiles.jsonでファイル内検索してみてください）。style.jsonはOptionalで、なくても動きますが、なんらか定義されたstyle.jsonがあるならば、追加しておいた方が当然ながら見栄えがよいです。

追加したいベクタータイルをプルダウンで選択後、「Connect」してから、下部の「Add」で、レイヤーが追加されます。もし一部のレイヤーだけQGISに追加したい場合は、Layers of〜の中から追加したいレイヤーを選択してからAddしてください（未選択の場合、全レイヤーが追加される）。以後、追加されたグループ削除するまで、画面領域（ズームレベル含む）の変更に応じ、その都度サーバーからデータを持ってきてくれます。

## 注意点
#### ベクターデータの範囲外で「Add」してはいけない
現状、ベクタータイルが提供されていない領域でAddすると、再読み込みもされない仕様となっています。
特に起動直後は表示領域がおかしな事になりがちなので、手頃なレイヤー（XYZ Tileなど）を追加して、表示領域を絞ってからAddしましょう。

#### 複数のsourceを持つstyle.jsonのスタイリングは未対応
標記のとおりです。たとえばMapTiler.jpのJP MIERUNEのstyle.jsonは、sourcesに4つのデータを持つため本プラグインでは一切スタイリングされません。これは、style.jsonがoptionalである事からもわかるのですが、このプラグインはtiles.jsonがまずあって、「必要であれば」style.jsonでスタイリングする仕組みとなっているからです。
一方で、そもそもstyle.jsonにはtiles.jsonへのリンクが含まれているため、Mapbox GL JSでは必ずしもtiles.jsonを必要としません。
私はこれをバグだと思い、一応issueを立ててあるので、そのうち直せればなぁなんて思っています。
ちなみに、JP MIERUNEのようにstyle.jsonのsourcesに複数のデータがある場合、プラグインで指定したtiles.jsonのレイヤーのみをスタイリングするようにstyle.jsonを加工してやれば（指定しなかったtiles.jsonを対象とするデータを削除してやれば）、適切にスタイルが反映される事は確認済です（しかしこの場合でも日本語文字列は表示されないよう…これもfixしたい）。
31. Next Permutation

I did't know what next permutation really is but I have found some explanations on Wikipedia, and it helped.

## Quick Explanation

The explanation below is grab from next permutation section on Wikipedia.

cf. <https://en.wikipedia.org/wiki/Permutation#Generation_in_lexicographic_order>

1. Find the **largest index `k`** such that **`a[k]` < `a[k+1]`**. If no such index exist, the permutation is the last permutation.
2. Find the **largest index `l` *greater than* `k`** such that **`a[k]` < `a[l]`**.
3. Swap the value of `a[k]` with that of `a[l]`.
4. Reverse the sequence from `a[k+1]` up to and including th final element `a[n]`.

### Other Resources

- https://www.youtube.com/watch?v=quAS1iydq7U
  - Good resource to understand how it works.

## Code

``` swift
class Solution {
    func nextPermutation(_ nums: inout [Int]) {
	    // I have created methods for each step
        let k = findLargestK(&nums) // ①
        if k >= 0 {
            let l = findLargestL(&nums, k) // ②
            swap(&nums, k, l) // ③
        }
        reverse(&nums, k + 1) // ④
    }
    
	/// Find the largest index k such that a[k] < a[k+1].
	/// If no such index exist, the permutation is the last permutation.
    private func findLargestK(_ nums: inout [Int]) -> Int {
	    // We start from the back because we need to find a largest index.
		// -2 for we need an extra space for k+1
        var k = nums.count - 2
        
        while k >= 0 && nums[k] >= nums[k+1] {
            k -= 1
        }
        
        return k
    }
    
	/// Find the largest index l greater than k such that a[k] < a[l].
    private func findLargestL(_ nums: inout [Int], _ k: Int) -> Int {
	    // We start from the back because we need to find a largest index.
        var l = nums.count - 1
        
        while l >= 0 && nums[k] >= nums[l] {
            l -= 1
        }
        
        return l
    }
    
    private func swap(_ nums: inout [Int], _ a: Int, _ b: Int) {
        let temp = nums[a]
        nums[a] = nums[b]
        nums[b] = temp
    }
    
    private func reverse(_ nums: inout [Int], _ start: Int) {
        var lower = start
        var upper = nums.count - 1
        
        while lower < upper {
            swap(&nums, lower, upper)
            lower += 1
            upper -= 1
        }
    }
}
```
Vuefireとは

firebaseとVue.jsを使ったアプリケーションを作っていて、vuefireがどうして必要なのかわからなかったので調べてみました。

## vuefireとは
firebaseのリモートデータベースとローカルの状況を用意に一致させるためのツールのことを言います。

firebaseはバックエンド部分を圧倒的に効率化できるサービスですが、そのデータベースとローカルの状況をリアルタイムに同期させるのは多くの工夫が必要となります。
そこで、vuefireを使うと、多くのことを考えることなく、同期作業を行うことができます。

## どうやってやるのか
まず、npmを使ってvuefireをインストールします。

```
npm install firebase vuefire@next
```

注意するのは、 `vuefire` ではなくて `vuefire@next` をインストールすることです。
さらに、これまでは `--save` で保存することが必要ですが、 npm5.0からは必要なくなったとのことです。
https://qiita.com/havveFn/items/c5beda8572aa8c1e6be6

さらに、vuefireから `firestorePlugin` をインポートします。

```
import { firestorePlugin } from 'vuefire'
Vue.use(firestorePlugin)
```

これは、firestoreを使う場合は `firestorePlugin` を、Realtime Databaseを使う場合は `rtdbPlugin` をインポートするとのことです。

また、 `Vue.use(plugin)` で、pluginを有効化することができます。

そしてvue内でデータベースのインスタンスを作成します。

```
export const db = firebase.firestore

```


これでvue内でデータベースを触ることができるようになり、vuefireが使えるようになりました。
今からスマホアプリの学習をしようとしてる人に向けて！

##1. はじめに
私は新卒でITベンチャーに入社して、現在スマホアプリのフロントエンドエンジニア(※以下 アプリのフロント)として、
Android、iOS共に、主にECアプリなどを開発しております。
そんな私がスマホアプリの学習をしようか検討中の方に向けて、「**アプリのフロントはこんな感じ**」というのを共有させていただければと思い記事にしました。

##2. スマホ開発の仕事はある？
学習するか悩んでる言語がある方の多くは、「その言語を学んでも仕事が無いんじゃ意味がない」と思っている方だと思います。
確かに「仕事がない」=「必要とされていない」と言っていいと思うので、これから学習する言語は仕事が多く取れる言語が良いですよね。
その点、**スマホのエンジニアは仕事がある**と私は胸を張って言えます。
これは「勤めている会社の中で仕事があるから」「自分がやっているから」というだけが理由ではありません。
私は趣味で英語の勉強会に行くのですが、その際職業の話になりアプリを作っていることを話すと、
結構な確率で「こういうサービスを考えているんだけど…」と相談されます。
今、何かサービスを作って流行らせようとする人は「アプリを作ろう」と考える人が多いと思います。
一昔前Webサイトのエンジニアが引っ張り凧だったように、**アプリもサービスの入り口**として考える人が多くなった今では、**比較的仕事は取りやすくなっている**と言えると思います。

##3. 将来性は？
いきなりマイナスな事を言いますが、**近い将来アプリの言語が衰退する**のは間違いないと思います。
その将来が何年後になるかは分かりませんが、スマホがもの凄い勢いで発展したように、
スマートグラスなのか、スマートウォッチなのかは分かりませんが、次のハードが進化した時、
必ずスマホ周りの言語も衰退します。
ただこれはどんな言語もほぼ同じなので、月並ですが、**日々情報を追っていく**しか無いと言えるでしょう。

##4. 学習コストは？　Python、Ruby、C++と比べたら？
####4-1) 難しさのレベルは？
私が学習したことのある言語で具体的にアプリ等を最後まで作ったことのある言語は、
Swift、Kotlin、Java、 JavaScript、GAS、Python、Ruby、C#(Unity)、C++です。
これらを実際に学習してみて、アプリのフロントで主に扱う言語のSwift、Kotlin、Java Script (React-Nativeなど)、C# (Unity)の学習コストを比較して考えてみると…
**中くらいのレベルの難しさ**、と僕は言いたいです。

複数の言語を学習したことがある方ならお分かりいただけると思うのですが、
基本文法の学習コストはどれもそんなに変わりません。**個々の好み**の範囲と言えると思います。
現によくRubyやPythonは学習コストの低い言語として取り上げられますが、僕はあまりそう思いません。

####4-2) 学習コストの差
では学習コストで生まれる差は何か？
それは**何に使うか**です。Pythonなら機械学習など、RubyならWebアプリ作成など、C++ならPCのリソースに関わるプログラムの作成…などなどです。
ではアプリのフロントで使用する言語では？
当然**スマホのアプリを書くため**です。
他の言語と比較して目的がはっきりしている分、学習者が突っかかる問題も同じ事が多いです。
そのためネットでエラーを検索するとその**解決法は他の言語に比べ見つけやすい**です。
初学者にとって**入門しやすい**と私は思います。

####4-3) アプリのフロントならではの難しさ
ではなぜ「Swiftは簡単な言語」と、手放しでは言えないのか？
その主な理由は**OSやハードウェアの進化**にあります。
皆さんも日々生活されていて、新しいiPhoneのニュースなどはTVやYouTubeなどで、よく見かけると思います。
Androidも同様に日々革新的な進化をし続けています。
アプリのフロントはこれらを**追い続けなければならない**のです。
アプリのフロントの言語は初学者にとっては入門しやすいですが、どれだけ**熟達しても学習が定期的に必要**な言語と言えると思います。
これが私が簡単が言語とは言い難いと思う理由です。

##5.クロスプラットフォーム？ネイティブ？
少し突っ込んだ話になります。
まず学ぶなら、React-Nativeなどのクロスプラットフォームがいいか、ネイティブがいいか？
**私はネイティブをオススメします。**
というのもクロスプラットフォームを使っても**どのみちXcodeやAndroid Studioの使い方を知る必要がありうる**からです。
例えばReact-Nativeでアプリを書いた場合、iPhoneの実機でのデバッグはXcodeからビルドする必要があります。
また、アプリのアーカイブやライブラリの設定、証明書の設定などをする際も同様です。
せっかくアプリを書いたのに、そこから使ったことのないツールをまた一から学習するのは少しうんざりしますよね。
ですので、チュートリアル程度でいいので**SwiftとKotlinである程度学習してから、**クロスプラットフォームを使用することをオススメします。

##6.最後に
色々とごちゃごちゃ書きましたが、
私はアプリのフロントはとても楽しくやらしていただいております。
世の中から必要とされている実感がある、とてもやりがいのある仕事です。
この記事が少しでもスマホアプリのフロントエンドエンジニアになろうと思っている方のお役に立てたら、とても嬉しいです。
terraformの書き方入門（ファイル構成と構文）


terraformの書き方をざっくりまとめます。


##基本的な構成

```bash
.
├── main.tf 　　//メインのファイル（リソース作ったりするファイル）
├──valiables.tf　　//変数ファイル
└──outputs.tf　　//作成したリソースの情報を変数として保持するファイル
```
terrafirmはカレントディレクトリにある.tfファイルをすべて読むので、一つのファイルにまとめて書いても実行できるがメインの処理と変数を分けて記載しておく。

##各ファイルの記載内容と構文
###main.tf 
**data**
コード内で使うデータを、すでにあるリソースから取得する。

```HCL
#data "${要求するリソース名：aws_vpc}" "${エクスポートするローカル名：example_name}" 
data "aws_vpc" "example"{
  #要求する条件
  id = "vpc-01b2caf4c15eaab98"
}
data "aws_subnet_ids" "example_subnet" {
#↑のaws_vpcのexampleで指定したid
  vpc_id = data.aws_vpc.example.id
  name   = "aqua-all"
}
```

**resource** 
これから作成するリソースについて記載する。

```HCL
resource "aws_network_interface" "interface1" {
  count = 1
  subnet_id = tolist(data.aws_subnet_ids.aqua-all.ids)[count.index]
}
```


module 
利用するリソースの情報を一つにまとめたもの

```HCL
module "ec2" {
  source = "../../"

  instance_count = 1

  name          = "terraform-test"
  ami           = ${var.ami}
  instance_type = "c5.large"
  subnet_id     = tolist(data.aws_subnet_ids.aqua-all.ids)[0]
  vpc_security_group_ids      = [data.aws_security_group.aqua-all.id]
  associate_public_ip_address = true
  placement_group             = aws_placement_group.web.id

  user_data_base64 = base64encode(local.user_data)

  root_block_device = [
    {
      volume_type = "gp2"
      volume_size = 30
    },
  ]

  ebs_block_device = [
    {
      device_name = "/dev/sdf"
      volume_type = "gp2"
      volume_size = 5
      encrypted   = true
    }
  ]

  tags = {
    "Env"      = "Private"
    "Location" = "Secret"
  }
}

```

### valiables.tf
**provider**
プロバイダー（どのクラウド環境を使うか）の設定

```HCL
provider "aws" {
  region = "ap-northeast-1"
}
```

**locals **
ローカル変数の指定

**variable**
変数の定義

```HCL
#variable "${変数名}" 
variable "foo" {}
#default値を指定することもできる。
variable "vpc_cidr" {
  default = "172.16.0.0/16"
}
```

```HCL
ここで作成した変数は、${var.変数名}でアクセスできる。
resource "aws_s3_bucket" "s3_bucket" {
  bucket = "${var.vpc_cidr}"
  acl = "private"
}
```
値の代入方法は
・ 実行時に指定
・ コマンド引数による指定
・ 環境変数による指定
・ 設定ファイルによる指定
の4種類ある。下記参照
https://qiita.com/ringo/items/3af1735cd833fb80da75


### outputs.tf
main.tfで作成したリソースの情報を使って他のリソースを作りたい時がある。そのため、作成したリソースの情報を変数として保持して使えるようにするためのファイル。

**output**
作成したリソースの情報の出力

```HCL
output "public_dns" {
  #説明書き（任意）
  description = "List of public DNS names assigned to the instances"
  #どのリソースで作成される値かを指定
  value  = module.ec2.public_dns
}
```

## 参照
Terraformはサンプルコードも公式ドキュメントも充実しているので、こちらを参照
▼サンプルコード
https://github.com/terraform-providers

▼公式ドキュメント
https://www.terraform.io/docs/configuration/resources.html
【初心者向け】java -jar コマンドでJVM(-D)オプションが効かない、ライブラリがバグってるんじゃないかと言いたくなったとき。

## 背景

Java製のOSSや社内に閉じたライブラリを開発していると、こんな問い合わせを受けることが何度かあったので、せめてQiitaに書いておけばググって自己解決してくれるのではないかという淡い期待をこめて。

## 問い合わせはこんな感じ

### パターン1

ライブラリのドキュメントには、`-Dxxxx=yyyy`を指定すると、`xxxx`オプションが有効になると書いてありますが、動作しません。ライブラリがバグってませんか？

### パターン2

組み込みTomcat（またはJettyなど）を使用したjarを起動する際、JMXを有効にするために`-Dcom.sun.management.jmxremote`やそのほかJMXのオプションをつけてますが、アプリケーションを起動してもJMXのポートがLISTENになりません。

組み込みTomcat(またはJettyなど)のパラメータ調整が必要でしょうか？

## バグってるのはライブラリでもServletコンテナでもない

```bash:誤ったコマンド
java -jar zzzz.jar -Dxxxx=yyyy -Dcom.sun.management.jmxremote
```

一見特段問題なく見えるんですが、正しくは下記の通りです。

```bash:正しいコマンド
java -Dxxxx=yyyy -Dcom.sun.management.jmxremote -jar zzzz.jar 
```

要するに、`-jar`オプションの後にJVM引数を指定するなって話ですね:sweat:

ちなみに、`java -help`コマンドで、ちゃんと順序は明示されています。言うまでもなく`[options]`がJVMオプションで、`[args]`がプログラムが処理するコマンドライン引数ですね。

```bash
$ java -help

使用方法: java [options] <mainclass> [args...]
           (クラスを実行する場合)
   または  java [options] -jar <jarfile> [args...]
           (jarファイルを実行する場合)
   または  java [options] -m <module>[/<mainclass>] [args...]
       java [options] --module <module>[/<mainclass>] [args...]
           (モジュールのメイン・クラスを実行する場合)
   または  java [options] <sourcefile> [args]
           (単一のソースファイル・プログラムを実行する場合)

 メイン・クラス、ソース・ファイル、-jar <jarfile>、
 -mまたは--module <module>/<mainclass>に続く引数は、メイン・クラスへの引数として
 渡されます。

... 以下、略
```

## 最後に

JVMオプションが効かない！？ってときは、他人を疑う前に、まずは自分の打ち込んだコマンドをご確認ください。
リレーションで特定のユーザーの記事を取得する手順

# はじめに
情報共有サイトにおいて、全てのユーザーが投稿した記事を取得することは簡単ですが、特定のユーザーが投稿した記事のみを取得したいとなると、リレーションが必要になり、初学者にとってはちょっと複雑になります。本記事では備忘録も兼ねてその手順をメモします。

## テーブルの作成
#### テーブル名を決める
テーブル名は複数形にします
今回は下記のように定義します。

- 記事を保存するテーブル名→news
- ユーザー情報を保存するテーブル名→users

#### マイグレーションファイルの作成
下記コマンドを打ちます

```
$ php artisan make:migration create_テーブル名_table
```
database/migrationsディレクトリ直下にテーブル名.php というファイルが生成されます。

#### マイグレーションファイルへの編集
newsテーブルに記事のタイトルと本文のカラムを加える場合、下記のように'title'と'body'を追記します。

```
public function up()
    {
        Schema::create('news', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('title'); // ニュースのタイトルを保存するカラム
            $table->string('body');  // ニュースの本文を保存するカラム
            $table->timestamps();
        });
    }
```

変更を反映させる為には、下記コマンドを実行します。
このコマンドはマイグレーションファイルのup関数を実行します。

```
php artisan migrate
```

## モデルの作成
モデルとは簡単に言うとテーブル内のデータを操作でき、保存、編集、削除などが出来るものになります。
#### テーブルとモデルの紐付け
- Laravelでは1つのテーブルにつき1つのモデルが紐づきます。
- テーブルとモデルは命名規則で紐づけられます。テーブル名の単数形をモデル名にしてモデル名の頭文字を大文字にすることで紐づけられます。
例えば下記のようになります。

| テーブル名 | モデル名 |
|:--------:|:-------:|
|   news   |  News   |
|   users  |  User   | 

#### モデルの作成
Newsモデルを作成するには下記コマンドを実行します。

```
php artisan make:model News
```

appディレクトリ直下にNews.php というファイルが生成されました。
同様にUserモデルも作成します。

ここまでで、ユーザー情報に関するusersテーブル/Userモデルと、記事情報に関するnewsテーブル/Newsモデルを作成しました。これでそれぞれの情報を個々に取得することはできます。しかしある特定のユーザーが投稿した記事を全て取得したいとなるとこのままでは難しいです。これを解決するにはnewsテーブルにusersテーブルのidを加えてあげる必要があります。このnewsテーブルに追加するusersテーブルのidを外部キーと呼びます。

外部キーにも命名規則があります。
usersテーブルのidカラムを外部キーとして設定する場合、リレーション先のカラム名は[リレーション元モデル名＿id]となり、'user＿id'と設定します。

## テーブルにカラムを追加する手順
テーブルにカラムを追加する方法としては、テーブル自体を削除して作り直すやり方もあるのですが、これでは保存したデータが消えてしまう問題があります。そこで今回は別の方法でカラムを追加します。詳しいことは下記記事が参考になります。
[【Laravel】カラムを追加する方法](https://note.com/koushikagawa/n/na88c7b77b43f)

下記コマンドでカラムを追加するための専用のmigrationファイルを作成します。

```
php artisan make:migration add_user_id_to_news_table --table=news
```

--table=news:ここにカラムを追加するテーブル名を書きます。

作成されたmigrationファイルを編集します。

```
public function up()
   {
       Schema::table('news', function (Blueprint $table) {
           $table->integer('user_id');
       });
   }

public function down()
   {
       Schema::table('news', function (Blueprint $table) {
           $table->dropColumn('user_id');
       });
   }
```
変更を反映させます。

```
php artisan migrate
```


## モデルの紐付け
外部キーによってテーブル間の紐付けができたら次にモデル間の紐付けをします。
テーブル間の関係が '1対他' か '他対1' かによって使用するメソッドが下記のようになります。

- [1対他]のリレーション → hasManyメソッド
- [他対1]のリレーション → belongsToメソッド

今回はusersテーブルとnewsテーブルの関係は[1対他]になり、それぞれのメソッドは下記のように扱います。

- newsテーブルを扱うNewsモデルではbelongsToメソッド
- usersテーブルを扱うUserモデルではhasManyメソッド

それぞれのメソッドはモデル内で下記のように記入します。

#### Newsモデル

```php:App/News.php
public function user()
    {
        return $this->belongsTo('App\User');
    }
```

#### Userモデル

```php:App/User.php
public function news()
    {
        return $this->hasMany('App\News');
    }
```

これで特定のユーザーの記事を取得することができます。
# 参考

- [【Laravel】1対多のテーブルリレーション・hasMany/belongsToとは？](https://moripro.net/laravel-hasmany-belongsto/)
- [【Laravel】カラムを追加する方法](https://note.com/koushikagawa/n/na88c7b77b43f)
GCPの Cloud Data Catalog の ドキュメント読んだメモ

GCPでのメタデータ管理用サービスとして超便利。

# Data Catalog の概要
フルマネージドでスケーラビリティの高いデータ検出およびメタデータ管理サービス

#### [公式Doc](https://cloud.google.com/data-catalog/docs/concepts/introduction-data-catalog?hl=ja)

やれることは2つ

- アクセス可能なデータアセットを検索
- メタデータでアセットにタグ付けする

### Cloud Data Catalog の対象データ

- BigQueryのデータセット、テーブル、ビュー
- Cloud Pub/Subトピック
- Cloud Strogeバケット、 Cloud Stroageオブジェクト
  - ※ GCSはドキュメントには対象として記述があるが現在DataCatalogの検索対象には入ってない

タグを使って独自のメタデータを適用することも可能

### 検索と発見

- アセットが存在する元のストレージシステムから提供されるネイティブメタデータ
    - 名前や ID などのプロジェクト情報
    - アセットの名前と説明
    - Google Cloud Platform のリソースラベル
    - BigQuery のテーブルとビューのスキーマ名と説明
- アセットに適用したユーザー生成の Cloud Data Catalog メタデータ
    - タグ
    - [マネージド エントリ](https://cloud.google.com/data-catalog/docs/concepts/introduction-data-catalog?hl=ja#managed_entries)と、マネージド エントリのタグ

### Getting started with Data Catalog

- タグの使い方がわかる
- 自分で定義したメタデータがタグとしてデータセットにつけられる

### Data Catalog の検索構文

検索方法の詳細。

`description: hoge` で検索すると説明文のみの検索になるなど。
Cloud Functionsのリージョンを変更する


Cloud Functionsでは `.region("asia-northeast1")` っていうのを追加してデプロイするだけでリージョンが変更できるそう。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">FirebaseのCloud Functionsってfunctions.region(&quot;asia-northeast1&quot;)っていうのを追加するだけで、リージョンを日本に変更できるんだー！知らなかった！<br><br>しかもこれでこのままデプロイしたら、USリージョンの関数全部消してくれた！楽！ <a href="https://t.co/U7DRKG9pbV">pic.twitter.com/U7DRKG9pbV</a></p>&mdash; shogo.yamada (@yshogo87) <a href="https://twitter.com/yshogo87/status/1226862393541554177?ref_src=twsrc%5Etfw">February 10, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


```typescript

export const test_delete = functions
  .region("asia-northeast1")
  .firestore.document("test/{testId}")
  .onDelete(async (snap, context) => {
      // hogehoge
  });
```

これをこのままデプロイするとUSリージョンの関数も削除してくれるので便利でした。
Segment Treeことはじめ【前編】

競技プログラミングでよく使うデータ構造第1位（勝手に決めました、要出典）の、Segment Treeに関する記事です。[前編](https://qiita.com/ageprocpp/items/f22040a57ad25d04d199)では、Segment Treeの主な理論や実装などについて扱います。[後編](https://qiita.com/ageprocpp/items/9ea58ac181d31cfdfe02)では、発展形である遅延Segment Treeなどについて扱います。

# Segment Treeとは
シンプルなSegment Tree（いわゆる「うし木」）は、おおざっぱには、数列に対して次のような処理を行うデータ構造です。

- 数列のどこかの値になんらかの演算をする。（変更する、値を加算するなど）
- 数列の一部の区間になんらかの演算をした結果を求める。（最小値を求める、総和を求めるなど）

これらの処理を、数列の長さを $N$ として、一回 $O(\log N)$ で行えるのがSegment Treeです。
# 要件
Segment Treeにのせる演算は、次の要件を満たす必要があります。

- 数列の各要素と、区間に対して行う演算が結合法則を満たす。（交換法則は満たさなくてよい）

他の操作を付け加えたり拡張したりすると要件が増えますが、最低限必要なのはこれだけです。
# Segment Treeの発想
Segment Treeの大まかな発想は次の通りです。

- 先に、いくつかの区間に対してそこに演算を行ったときの結果を計算しておく。
- 結果を求めるときは、上で計算した結果を適当に用いて、計算を節約しつつ求めたい結果を出す
- 値に演算を加えるときは、計算しておいた結果の一部を更新する。

ここで大事になってくるのが先に挙げた結合法則です。
結合法則が成り立つことを利用して、一部の区間を先にまとめて計算しておいても、それを使って正しい値を求めることができます。

# 構造
実際のSegment Treeの構造は、次の図のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550283/38239780-be5d-e276-fa2d-6b50c279086a.png)
数列の長さは、簡単のため2のべき乗とします。
2のべき乗の長さで区間を統合していき、それらの区間に対して演算を行った結果を格納しておきます。
木の高さは $O(\log N)$ になり、全体のセグメント数は $O(N)$ になります。
実はここでは、ノードの番号は1-indexedにしておくとかえって便利です。

最初は、結合法則を利用して下から計算していけば、$O(N)$ でそれぞれのノードの値が計算できます。

区間についての演算結果を求めたいときは、ノードを高々 $O(\log N)$ 個組み合わせて、結合法則を利用して順番に計算すれば任意の区間についての演算結果を求められます。

値に対する演算をしたいときは、一番下のノードに演算をし、上にさかのぼっていけばよいです。これは、下から素直にさかのぼっていく実装でもよいですし、上から見ていって再帰を利用する実装でもよいです。

# 実装
基本的な実装は、蟻本に載っているものを使えばよいですが、ここでは僕が適当に実装した例を載せます。
ここでは、Segment Treeの例としてよく使われる、値の変更とRMQ(Range Minimum Query, 区間の最小値を求める)を実装します。

```cpp
const int INF=1000000000;
int N,node[400010];
void init(int N_){
    while(N<N_)N*=2;
    for(int i=0;i<2*N-1;i++)node[i]=INF;
}
void update(int a,int x){
    a+=size-1;
    node[a]=x;
    while(a>0){
        a=(a-1)/2;
        node[a]=min(node[2*N],node[2*N+1]);
    }
}
int query(int a,int b,int k=0,int l=0,int r=N){
    if(b<=l||r<=a)return INF;
    if(a<=l&&r<=b)return node[k];
    int vl=query(a,b,2*k+1,l,(l+r)/2);
    int vr=query(a,b,2*k+2,(l+r)/2,r);
    return min(vl,vr);
}
```
再帰を使わずに書く方法もあります。そちらのほうが高速ですが、再帰のほうが理解はしやすいです。今回は再帰で書きました。
# 練習問題
[AOJ DSL2-A Range Minimum Query](https://onlinejudge.u-aizu.ac.jp/courses/library/3/DSL/2/DSL_2_A)(典型的なSegment Treeです)
[AOJ DSL2-B Range Sum Query](https://onlinejudge.u-aizu.ac.jp/courses/library/3/DSL/2/DSL_2_B)(典型的なSegment Treeです)
[ABC153-F Silver Fox vs Monster](https://atcoder.jp/contests/abc153/tasks/abc153_f)（使わなくても解けますがセグ木があると楽です）
[ARC008-D タコヤキオイシクナール](https://atcoder.jp/contests/arc008/tasks/arc008_4)
暇なときに追加します。
# おわりに
短い記事になりましたが、基本的なセグ木の考え方は実はこれで網羅できています。
2べきで区間を分けて前計算をしておき、更新クエリではそれらを書き換える、という処理だけで高速なクエリへの応答が可能になります。
後編では、Segment Treeの発展形である、遅延Segment Treeなどを扱います。
遅延Segment Treeまでを学ぶと応用できる域が大きく広がり、日本情報オリンピックの春合宿で出題される問題なども解けるようになります。
Segment Treeをマスターして、解ける問題の幅を広げましょう！
goのioインターフェースを使ってみよう

# はじめに

こんにちわ、すえけん([@sueken5](https://twitter.com/Sueken51))です。

今回の記事ではgolangのioインターフェースを使うと効果的な処理がかけるようになるのでそれを紹介します。

# io.Reader/io.Writer

io.Reader/io.Writerはioパッケージで提供されているインターフェースです。
どこで使われているかというとbyte列をいじる際によく採用されています。よくみるところだと`encoding/json`や`os`パッケージのファイル周りで使われています。

# Benchmark

次の二つの関数のベンチマークを測ってみます。一つはreaderからbyteを取り出した後にmarshalし、もう一つはdecoderにFileインスタンスを渡しています。

```
package io_bench

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"
)

type test struct {
	Message string `json:"message"`
}

//not use io interface.
func Ex1() error {
	f, err := os.Open("test.json")
	if err != nil {
		return fmt.Errorf("ex1 err: %w", err)
	}

	defer f.Close()

	data, err := ioutil.ReadAll(f)
	if err != nil {
		return fmt.Errorf("ex1 err: %w", err)
	}

	t := &test{}
	if err := json.Unmarshal(data, t); err != nil {
		return fmt.Errorf("ex1 err: %w", err)
	}

	return nil
}


//use io interface.
func Ex2() error {
	f, err := os.Open("test.json")
	if err != nil {
		return fmt.Errorf("ex2 err: %w", err)
	}

	defer f.Close()

	t := &test{}
	if err := json.NewDecoder(f).Decode(t); err != nil {
		return fmt.Errorf("ex1 err: %w", err)
	}

	return nil
}
```

結果は次の通りです。（ベンチマーク用のテストコードは[こちら](https://github.com/sueken5/io-bench)）

```
> go test -bench . -benchmem
goos: darwin
goarch: amd64
pkg: github.com/sueken5/io-bench
BenchmarkEx1-8   	   88365	     12195 ns/op	    2392 B/op	      10 allocs/op
BenchmarkEx2-8   	1000000000	         0.000065 ns/op	       0 B/op	       0 allocs/op
PASS
ok  	github.com/sueken5/io-bench	1.224s
```

decoderにFileインスタンスを渡してる方が圧倒時に早くメモリ効率も良いです。

# まとめ

通信のレスポンスなどをこのようにioインターフェースをうまく使うことができればよりパフォーマンスのでるプログラムが書けそうです。
スクリプト言語の比較しながらGoのお勉強 〜 標準入力編

# 前回からのおさらい
前回、[Hello World編](https://qiita.com/kuroseets/items/e25e90515380d08a2d5f)にて、標準出力に文字列を表示するという処理を確認しました。
今回はその対になります標準入力にてキーボードにて入力する文字列を受け取る処理を比較してみたいと思います。

# 標準入力
簡単にキーボードから1行入力された文字列を表示するプログラムを見ていくことにしましょう。

## Goの標準入力
Goでの標準入力のプログラムです。

```go:input.go
package main

import (
  "fmt"
  "os"
  "bufio"
)

func main() {
  stdin := bufio.NewScanner(os.Stdin)
  stdin.Scan()
  text := stdin.Text()

  fmt.Printf(text + "\n")
}
```

実行してみましょう。

```
$ go run input.go 
Hello, Go
Hello, Go
```

ただ単に鸚鵡返しするだけですが、思い通りの処理はできています。

プログラムの中身ですが、
importで３つのパッケージを読み込んでいます。`fmt`パッケージは標準出力でも使用したものですね。`os`パッケージと`bufio`パッケージは今回初めて使用するライブラリです。
[`os`パッケージ](https://golang.org/pkg/os/)は公式サイトによると、
>オペレーティングシステムの機能へのプラットフォームに依存しないインタフェースを提供します。
Unixライクな設計です。

ドキュメントを読んでると[`syscall`パッケージ](https://golang.org/pkg/syscall/)をラップしていることがわかりました。`os`パッケージはシステムのローレベルな処理から汎用的にレベルを上げたパッケージということですね。

[`bufio`パッケージ](https://golang.org/pkg/bufio/)は、
>I/Oのバッファリング機能を提供します。io.Reader・io.Writerをラップし、別のオブジェクト(ReaderまたはWriter)を作成します。インタフェースは同じままでバッファリングやその他便利な機能を追加します。

とのことで[`io`パッケージ](https://golang.org/pkg/io/)をラップして機能拡張しているものの様です。

処理に関してですが、１０行目のNewScannerはドキュメントによると１行ごと読み込む処理です。
またos.Stdinの処理は`syscall.Stdin`で`/dev/stdin`を開いたファイルディスクリプたということで、標準入力を１行ごと読み込む処理の様です。
11行目で１行ごとバッファし、１２行目で変数に文字列を格納、そして１５行目で出力という流れになっています。

簡単な標準入力の処理ですが、なかなか理解しなければならないことの多いGoです。

では、他の言語との比較です。

## Python
Pythonでは組み込み関数の`input`関数で入力処理を実装できます。
[組み込み関数](https://docs.python.org/ja/3/library/functions.html)

```python:input.py
text = input()
print(text)
```
実行結果

```
$ python input.py
Hello, Python
Hello, Python
```

## Ruby
Rubyでは組み込み関数の`gets`で実装可能です。
[module Kernel](https://docs.ruby-lang.org/ja/latest/class/Kernel.html)

```ruby:input.rb
text = gets
print text
```
実行結果

```
$ ruby input.rb
Hello, Ruby
Hello, Ruby
```

## Perl
PerlではI/O演算子の`<>`で標準入力のファイルハンドル`STDIN`を指定して入力処理を実装します。
[I/O 演算子](https://perldoc.jp/docs/perl/5.26.1/perlop.pod#I47O32Operators)

```perl:input.pl
$text = <STDIN>;
print $text;
```
実行結果

```
$ perl input.pl
Hello, Perl
Hello, Perl
```

## Bash
Bashでは`read`コマンドで入力処理を実装します。
[man read](https://linuxjm.osdn.jp/html/LDP_man-pages/man2/read.2.html)

```shell:input.sh
read text
echo $text
```
実行結果

```
$ bash input.sh
Hello, Bash
Hello, Bash
```

# 入力処理を比較してみて
入力処理を比較してみて感じたことは[Hello World編](https://qiita.com/kuroseets/items/e25e90515380d08a2d5f)と同様で、本体は簡素に作られているというところです。
今回は多少パッケージのソースにも目を通してみたところ、低レベルの処理を駆使して実装はできるのでしょうが、
車輪の再発明は無駄で何も旨味がないためパッケージの使用を学ぶべきと感じました。
(但し、実装方法を確認することは多くの知見を得られますので、できる限りソースには目を通すべきだと思います)
では、次回以降は変数に関しての演算子や文字列処理について勉強したいと思います。
【メモ】GitLab + TortoiseGit を使ってみる

#GitLab + TortoiseGit メモ
GitLabでソースコードの管理をするのは久しぶりなので、復習と備忘録を兼ねてメモ

##TortoiseGitのセットアップ
PC環境：
・Windows 10 Pro 1903 x64
・Git for Windows 2.25.0 x64
・TortoiseGit 2.9.0 x64

@SkyLaptor さんの「TortoiseGitのセットアップ」を参考に設定。記事の最終更新から1年以上経過していたが、Git for Windows / TortoiseGit とも最新版でほぼほぼ手順通りに設定できた。

セットアップの手順は
・Git for Windowsをダウンロード、セットアップ
・TortoiseGitをダウンロード、セットアップ
・TortoiseGit Language Kit（日本語）をダウンロード、セットアップ
・PuttyGenで公開鍵、秘密鍵を作成
・公開鍵をGitLabに登録
・GitLabのリポジトリをクローン
　→GitLabのGUIが一部変更に。クローン用のディレクトリは「Clone↓」ボタンから取得

参考URL:
     https://qiita.com/SkyLaptor/items/6347f38c8c010f4d5bd2

##TortoiseGitを使ってみる
基本的な動作を確認した
・GitLabに新規プロジェクトを作成
・Localに新規プロジェクトのリポジトリをクローン
・Localのリポジトリにコードを追加
・Localのリポジトリで変更をコミット
・変更したコミットをサーバーに送る

参考URL:
     https://doss.eidos.ic.i.u-tokyo.ac.jp/html/git.html
数理最適化・(量子)アニーリングでFGO攻略 ~ 多数 v.s. 多数 編 ~

# 本記事の概要

以前紹介した[FGO最適化 1 v.s. 1 編](https://qiita.com/github-nakasho/items/0d3cc464a6d9342f13f3)を発展させて、敵も自分のパーティも多数の場合に最適なパーティ編成をシミュレートしようというのが本記事の目標です。

# 定式化

## バイナリ変数

以下のようにバイナリ変数を定めます。

```math
x_{mk} = \{0, 1 \}
```

この変数は自分のパーティの$m$番目のメンバーがクラス$k$のときを1、そうでなければ0とする変数です。

## コスト関数

[前回の記事](https://qiita.com/github-nakasho/items/0d3cc464a6d9342f13f3)と同じく、こちらの攻撃ダメージが最大となるようにコストを選びます。

## 制約条件

### マスターは限られた人数のサーヴァントしか召喚できない

マスターが召喚できるサーヴァントの数には限りがあります(FGO内ではパーティメンバーのコストとして表示されています)。パーティに入れられるサーヴァントの人数を$M$とすると、この制約条件は

```math
\sum_{mk} x_{mk} = M
```

となります。これをQUBOの制約として表現すると

```math
H_a 
= \left( \sum_{mk} x_{mk} -M\right)^2
```

### サーヴァントは1つのクラスしか持ちえない

サーヴァントが複数のクラス(例えばセイバーとランサーのクラス)を同時に持つことはできません。よってこれを数式で表すと以下のようになります。

```math
\sum_{k} x_{mk} = 1
```

これをQUBOで制約として入れようとすると

```math
H_b 
= \sum_m \left( \sum_k x_{mk} -1\right)^2
```

となります。

## Total QUBO

以上より、Total QUBOは以下のようになります。

```math
{\rm Energy} 
= -{\rm damage} + \lambda_a H_a+ \lambda_b H_b
```

ここで$\lambda_a, \lambda_b$はハイパーパラメータです。

# 実際のスクリプト

## make_energy.py

### スクリプト

```python:make_energy.py
import numpy as np
from pyqubo import Array, Constraint, Placeholder


def make_energy(my_member, enemy_member, kind, atk_matrix, enemy):
    # set placeholder (hyper parameters)
    lambda_a = Placeholder('h_a')
    lambda_b = Placeholder('h_b')
    # set binary variables
    x = Array.create('x', shape=(my_member, kind), vartype='BINARY')
    # convert to numpy array
    x = np.array(x)
    # set cost function
    atk_cost = sum([np.dot(x[m], 
                    sum([np.dot(atk_matrix, enemy[e]) for e in range(enemy_member)])) 
                    for m in range(my_member)])
    # set member constraint
    h_a = Constraint((sum([x[m][k] for m in range(my_member) for k in range(kind)])-my_member)**2, label='h_a')
    # set one-hot constraint
    h_b = Constraint(sum([(sum([x[m][k] for k in range(kind)])-1)**2 for m in range(my_member)]), label='h_b') 
    # compute total energy
    energy = -atk_cost + lambda_a * h_a + lambda_b * h_b
    # compile
    model = energy.compile()
    return model
```

### スクリプト詳細

[PyQUBO](https://pyqubo.readthedocs.io/en/latest/)を用いてQUBOの自動生成を行なっています。バイナリ変数$x$を$M \times K$のArrayとして生成し、それらを用いてdamageと制約を計算しています。

# 結果

## 適当な計算例

試しに敵を1種類で統一してみましょう。

```
-----us-----
archer
archer
archer
-----enemy-----
saber
saber
saber
```

敵全員がセイバーのとき、こちらのパーティは全員アーチャーであれば有利であることがわかります。

## ケーススタディ: 項羽・虞美人戦

第2部3章の「人智統合真国シン」の項羽(バーサーカー)と虞美人(アサシン)に最適な3人を求めてみましょう。すると以下のようになります。

```
-----us-----
caster
caster
caster
-----enemy-----
berserker
assassin
```

結果はみなさんのご想像の通り、全員キャスターになります。これは与えるダメージが最大になるように最適化を行なっているためです。しかし何度か実行すると、出力される結果が異なることもあります。

```
-----us-----
berserker
caster
caster
-----enemy-----
berserker
assassin
```

これはアニーリングによる解の求め方が、高速に解を出すが解の精度に保証がないアルゴリズム「ヒューリスティクス」と呼ばれるものだからです。
PytorchでData Augmentationした後の画像を表示する

##背景

**Data Augmentationした後の画像を表示したい！**

と思って実装してみました。

Data Augmentationとは、1枚の画像を水増しする技術であり、以下のような操作を加えます。

- Random Crop(画像をランダムに切り取る)
- Random Horizontal Flip(画像を一定の確率で左右反転する)
- Random Erasing(画像の一部にランダムにノイズを付加する)
- Random Affine(画像をランダムに拡大・縮小・回転する)

この他にもいろいろあります。

##実装

今回は、CIFAR-10の訓練画像データセットを読み込んで、transformsにRandomHorizontalFlipとRandomErasingを組み込んでみました。

```test.py
import torch
import numpy as np
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import Dataset,DataLoader
import torchvision.datasets as dsets
import matplotlib.pyplot as plt

#画像の読み込み
batch_size = 100
train_data = dsets.CIFAR10(root='./tmp/cifar-10', train=True, download=False, transform=transforms.Compose([transforms.RandomHorizontalFlip(p=0.5), transforms.ToTensor(), transforms.RandomErasing(p=0.5, scale=(0.02, 0.4), ratio=(0.33, 3.0))]))
train_loader = DataLoader(train_data,batch_size=batch_size,shuffle=True)
test_data = dsets.CIFAR10(root='./tmp/cifar-10', train=False, download=False, transform=transforms.Compose([transforms.ToTensor(),]))
test_loader = DataLoader(test_data,batch_size=batch_size,shuffle=False)

def image_show(data_loader,n):

  #Augmentationした画像データを読み込む
  tmp = iter(data_loader)
  images,labels = tmp.next()

  #画像をtensorからnumpyに変換
  images = images.numpy()

  #n枚の画像を1枚ずつ取り出し、表示する
  for i in range(n):
    image = np.transpose(images[i],[1,2,0])
    plt.imshow(image)
    plt.show()

image_show(train_loader,10)

```

image_show関数がAugmentation後の画像を表示する関数です。

iter()により、DataLoaderからミニバッチ1つ分を取得します。

そして、.next()により画像データをimagesに、ラベルをlabelsに格納します。

images = images.numpy()では、画像データをテンソルからnumpyに変換しています。

この時点でimagesは**[バッチサイズ, チャンネル数, 幅, 高さ]**という構造になっていますが、matplotlibのpyplotで画像を表示するには**[幅, 高さ, チャンネル数]**とする必要があります。

よって、np.transposeをつかって変形しています。

##実行結果例

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459175/c02cb797-6931-6fe7-3fb2-e63d55fade47.png)
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459175/0c42129f-95e9-fc01-68ac-94e8badd8ad9.png)

左右反転されていたりRandom Erasingでノイズが付加されていたりすることが確認できました。