OmniAICreator/Qiita-1.07M huggingface dataset:
競技プログラミング用テスト

# モチベーション

ある日AtCoderにて人のコードを眺めていたところテストを搭載したスニペットを使っている人がいました[^1]。

「かっこいい❤️」

自分でも作ってみました。

# 実装

```Rust
fn main() {
    // 入力
    let n = input::<usize>();
    let a = input::<usize>();

    // 何らかの処理

    // 出力
    println!("{}", max_ave);
    println!("{}", cnt);
}

#[cfg(test)]
mod tests {
    #[test]
    fn tester() {
        // テストケースをここに書く
        // (入力, 期待する出力) 
        let inputs = [
("
5 2 2
1 2 3 4 5
", "
4.500000
1
"),

("
4 2 3
10 20 10 10
", "
15.000000
3
"),
       ];

        for (input, expected) in inputs.iter() {
            call(input, expected.to_string());
        }
    }

    fn call<T: AsRef<str>>(input: T, expected: String) {
        use std::process::{Command, Stdio};
        use std::io::{Read, Write};

        let mut cmd_echo = Command::new("echo")
            .arg(input.as_ref())
            .stdout(Stdio::piped())
            .spawn()
            .unwrap();
        let mut cmd_run = Command::new("cargo")
            .arg("run")
            .stdin(Stdio::piped())
            .stdout(Stdio::piped())
            .spawn()
            .unwrap();

        // 実行と標準出力の受け取り
        if let Some(ref mut stdout) = cmd_echo.stdout {
            if let Some(ref mut stdin) = cmd_run.stdin {
                let mut buf: Vec<u8> = Vec::new();
                stdout.read_to_end(&mut buf).unwrap();
                stdin.write_all(&buf).unwrap();
            }
        }

        let res = cmd_run.wait_with_output().unwrap().stdout;
        let res_string = String::from_utf8(res.to_vec()).unwrap();

        // convert '\n' into space
        let actual = res_string
            .replace("\n", " ")
            .trim_end_matches(' ')
            .trim_start_matches(' ')
            .to_owned();
        let expected = expected
            .replace("\n", " ")
            .trim_end_matches(' ')
            .trim_start_matches(' ')
            .to_owned();

        // split into a vector
        let actual = actual
            .split(' ')
            .map(|s| s.parse::<f64>().unwrap())
            .collect::<Vec<_>>();
        let expected = expected
            .split(' ')
            .map(|s| s.parse::<f64>().unwrap())
            .collect::<Vec<_>>();

        assert_eq!(actual, expected);
    }
}
```

# 実行

```sh
$ cargo test
```

# 工夫した点

先述したサイト[^1]の実装はsolve関数に回答のための主要な処理を書き、main関数から呼び出していました。テストでは
solve関数を呼び出し、入力は全rustaceanがいいねしたであろうtanakhさんのinputマクロ[^2]に手を加えたものを使用していました。

これに対し自作のテストはmain関数をテストから完全に独立させて自由に書けるようにしました。

# コードについて

TopCoder や AtCoder は改行とスペースを区別しないらしいので改行コードを全てスペースに直しています。

### テストケース

テストケースはinputs変数 ``Vec<()>``に書いている
のですが、先述したサイト[^1]のFireFox拡張を使えば
よりスッキリ書くことができると思います今度試してみます。

# 感想

シェルのパイプ処理がクレートなしで書けたのがよかったです
だけど少し複雑で大変だったです。

# その他

こうした方がいいよなど思う所がありましたら是非コメントください❤️

# 参考
[^1]: [Rust で競技プログラミング用のテストマクロと AtCoder のテストコード生成ツールを作る](https://techracho.bpsinc.jp/jhonda/2019_08_05/78537)

[^2]: [Rustで競技プログラミングの入力をスッキリ記述するマクロ](https://qiita.com/tanakh/items/0ba42c7ca36cd29d0ac8)
Blender備忘録

##はじめに
この記事は1日前にBlenderを触り始めた人の勉強メモです。過度な期待はしないでください。
誤った内容が含まれる可能性が多々あります。誤りに気付いた方は、コメントにて脇腹をつついてください。

###なぜいきなりBlender？
Unityでモデルを動かす際、設定されたボーンに応じて、VRIKなどの設定を行うことや、
モデルにスクリプトをアタッチすることで、モデルが動作できるようにすることがあります。
そこで、モデルに対する理解度を上げるために、Blenderでは何を行うことが可能なのか、
Unityで実装する部分とBlenderで実装する部分の境界はどこなのか、
Blenderで実装した内容はどのようにUnityに反映されるのか、などを知ることで、
Unityの理解も同時に深めよう、ということを目的としています。

###Blenderの操作（Blender 2.80）
以下の動画を参考にさせていただいております。
ただし、Blender 2.80を用いている都合上、説明と違う操作をする必要があります。
操作のショートカットとバージョンによる操作の違いを自分用にまとめておこうと思います。

「ワニでもわかるゼロからのBlender」
https://www.youtube.com/watch?v=7oNfgOOcKm8

■日本語化
Edit-Preference-Interface-Translate-Languageから日本語（Japanese）を選択
Languageの下のInterfaceのチェックボックスにチェックを入れる

■視点移動
Shift、Ctrl、Alt、マウスホイールでなんやかんやすれば、動く

■原点への戻し方
Shift+C

■オブジェクトの追加
Shift+A

■オブジェクトの移動
移動時は画面左側の「Move」（上下矢印のアイコン）を選択し、移動させる

■オブジェクトの編集
画面上側の「オブジェクトモード」を「編集モード」に変更（Tabでも変更可能）
![1_ビュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483109/187c159a-7921-c2dc-1246-48b68831476e.png)

Shift＋左クリックで頂点を選択し、操作することが可能
繋がった複数の頂点を選択する際は、一つの頂点を選択後、
もう一つの頂点をAlt＋左クリックで選択することで、繋がった頂点をまとめて選択することが可能

編集に関しては、Gを選択することで選択した頂点を含めたメッシュを操作可能
Gを選択した場合、頂点間の距離は維持された状態で移動されるが、
Sを選択した場合、選択した頂点間の距離の比率を維持したまま、大きさを変化させることが可能
Xを選択した場合、選択した頂点に紐づく情報を削除することが可能
G、Sなどで変形させる際、X、Y、Zなどを続けて選択することで、特定の座標のみを変更させることが可能
X、Y、Zではなく、X、Y両方に動かしたい場合、Shift+Zとすることで、「Z以外」の座標を変更することが可能
編集完了時は左クリックを押下

■プロポーショナル編集
選択した頂点以外の頂点も座標を変更することが可能

以下の画像のボタンを選択し、「接続のみ」などの各種選択
![2_プロポーショナル1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483109/49ffa898-c933-9312-f18a-d49f3f538b28.png)

頂点を選択して移動させながらマウスホイールを操作することで、白円の範囲内の頂点を同時に操作可能
![3_プロポーショナル2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483109/a9c76c64-427b-8fd6-eda7-0214603e9694.png)

■下絵の追加
オブジェクトモードの状態で、追加-エンプティ-画像からエンプティ画像を追加
画面右下のコンテクスト.オブジェクトデータから画像を開くを選択
![4_下絵.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483109/8cc50ae0-7513-f9ec-b79f-f8ba4cf4f416.png)

疲れたので今回はここまで
Google play consoleへデプロイする際のエラー[must target at least api level 28](ReactNative)

# エラー
Google play consoleへアプリをデプロイ（`.apk`ファイルのアップロード）の際に、下記のようなエラーが発生しました。

```
must target at least api level 28
```

# 解決法
`android/build.gradle`の下記を28に書き換えた上で`.apk`ファイルの発行->再度、google play consoleへアップロード

```
buildscript {
    ext {
        targetSdkVersion = 28
```

# 参考
[Meet Google Play's target API level requirement](https://developer.android.com/distribute/best-practices/develop/target-sdk)
LINEボットアプリを開発・運用するにあたっての事前調査メモ

## 【1】 LINEボットアプリを運用するために、LINEに対して発生する費用に関して

- 開発〜試験運用までは、 **LINEへ課金なし** で進行可能. 
- 試験運用が終了して、本格的に運用となった場合、以下3つのプランのいずれかでリリース可能. 
    1. Freeプラン: `0円/月`
    2. Basicプラン: `5,400円/月`
    3. Proプラン: `32,400円/月`
        - もちろん、安いプランほど、機能制限が多い. 
        - 以下の「MessagingAPIで利用できる料金プラン」の詳細に記載. 
            - https://at.line.me/jp/plan
- 機能制限で、個人的に1番のネックだと感じたのは、 **メッセージ配信の制限**
    1. Freeプラン: `1,000通` まで無料
    2. Basicプラン: `5,000人` 以内はメッセージ数無制限で無料
    3. Proプラン: `100,000人` 以内はメッセージ数無制限で無料
- より多くの人にメッセージ配信を行っていくためには、Proプランの契約が必須.

## 【2】 LINEボットアプリの開発工数に関して

- 要件によって変動はするが、 **だいたい1ヶ月〜3ヶ月** の期間でほとんどのLINEアプリは開発できそう. 
    - （個人の主観が入ってるので、一般的かどうかは無視で...）

- 通常アプリとの開発の違い
    - フロント（UI）箇所は、ほぼLINE側でパーツは用意してくれている
        - そのため、フロント実装は、そのパーツの組み合わせで良い. （※ こだわりがある場合は別）
        - 通常のフロントアプリ開発より工数は少なめ. （※ こだわりがある場合は別）
    - サーバサイド実装は、通常アプリ同様に独自実装が必要（ プログラミング言語は、Javascript(Node.js) ）
        - 主にDB制御や、外部サービス連携がメイン
        - 通常のバックエンド開発（API開発）とほぼ同じくらい.

## 【3】 LINEボットアプリ上のLINEアカウントの関係性に関して

- LINEボットアプリ開発を進めるにあたって、大きく2つのアカウント概念が存在する.
    - `開発者アカウント`
        - このアカウントで、複数のLINEボットアプリ開発が可能.
        - 管理画面: [LINE Develop コンソール](https://developers.line.biz/console/)
    - `LINE＠アカウント`
        - LINEボットアプリに1対1で対応させておく必要があるアカウント.
        - 管理画面: [LINE@ Manager](https://admin-official.line.me/)
        - アカウントの開設方法は、 [こちら](https://ferret-plus.com/curriculums/9850)
        - このアカウントの中にも、2つのアカウントの概念が存在する.
            - `一般アカウント` : 
                - 誰でも登録できるが、LINEボットアプリの一部機能（グループやトークルーム関係）制限が発生する.
                - このアカウントで登録後も、 認証済みアカウントへ申請可能.
            - `認証済みアカウント` : 
                - LINEの審査が必要なアカウント
                - 詳細は [こちら](https://blog.kcr-cp.com/index.php/2017/09/06/lineat_account-type/) 

<img width="500" alt="スクリーンショット 2019-08-30 19.02.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355287/d5abdb6f-ecc4-d98d-8386-8987d9f192ef.png">

- したがって、LINEボットアプリ開発を進めるためには、 **開発者アカウント＆LINE＠アカウントの2つ用意する必要** がある.
    - 開発者アカウントは一度作ってしまえば、2回目以降のアプリ開発で使い回せる. 
    - フル機能を活用するためには、 **LINE＠アカウントは、承認済みアカウントにする必要** がある.

- 参考資料: [LINE Messaging APIの使い始めで混乱した概念色々](https://blog.en30.net/2018/10/25/180943/)
Go言語初心者メモ

# 概要

知ったことをメモする。
随時追記予定。

# 言語の特徴

- Googleが開発した言語
- 静的型付け言語
- コンパイル言語
- メモリ管理が安全
- 並行処理が得意
- C言語に似ている
- 2019年9月現在日本では、Go言語を扱う開発者は希少であり市場価値が高い
- Go言語を扱う開発者は比較的ベテランのエンジニアが多いように感じる
- 便利機能とかは豊富ではない。原始的なアプローチが多い
- サクッとプロトタイプを開発するのはRailsやLaravelに劣るが、速度を求めるなら適している

# 学習方法

- [A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)

# ライブラリ

| Left align       |       Right align |
|:-----------------|------------------:|
|realize |ホットリロード|
|goose|DBマイグレーション|
|siris|Webアプリケーションフレームワーク|
|go-cmp|値比較|
|pprof|プロファイリング|
|guregu/null|変数にnullが入ってきたときに型のデフォルト値にするのではなくnullとして扱えるようにする|
|hashicorp/golang-lru|LRUキャッシュ|
|gorm|ORM|
|julienschmidt/httprouter|ルーティング|
|kr/pty|unix操作するやつ|
|labstack/echo|Webサーバー|
|go-urn|URNパーサー|

# Log出力

```
import "log"

func main() {
    log.Print("hoge")
}
```

実行結果

```
# go run main.go
2019/08/30 09:20:52 hoge
```

# echoのサーバー起動

```
import "github.com/labstack/echo/v4"

func main() {
    e := echo.New()
}
```

```
# go run main.go
   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.1.5
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on [::]:8081
```

# Classがない

structを使う。

# ジェネリクスがない

# ArrayとSliceがある

繰り返す際はrangeを使う。

## 変数名の命名は慣例的に短い

1~3文字の変数名とかがよくある。

## 外部のパッケージから利用するエクスポートする関数や変数は先頭文字を大文字にしなければならない

例：

```
import (
	"fmt"
)

func main() {
	fmt.Println("Hello World")
}
```

↑の Println とか

# 「例外」はない

エラーハンドリングはerrorインタフェースを用いて行う。

```Go:example.go
v, err := hoge.Fuga()
if err != nil {
    // エラー時の処理
}
```

# ＆（アドレス演算子）

値のポインタ

# 変数の宣言

```
var s = "文字列"
s := "文字列"
```

↑どちらも同じ挙動となる。
変数の初期化の際は := で宣言すると var を省略できる。
※ただし後者の宣言方法は関数内でのみ使用できる。

## 複数の同じ型の変数を宣言する場合、型を省略して書ける

```
var firstName, lastName string
```

## 型推論してくれる

```
var firstName, lastName = "yamada", "tarou"
```

# 変数は型ごとにゼロ値（デフォルト値）が決まっている

数値型(int,floatなど): 0
bool型: false
string型: "" (空文字列( empty string ))

# テスト

デフォルトで用意されている、 'testing' を用いる。
テストコードはテスト対象のプロダクトコードと同じディレクトリに作成する。

ファイル名は_testのサフィックスをつける。

例：

```
example.go
example_test.go
```

# .envファイルで定義した環境変数を参照する

godotenv というライブラリを使う。

ライブラリのインストール

```terminal
# go get github.com/joho/godotenv
```

使用

```env:.env
# データベースにログインするユーザー名
DB_USER: root
```

```go:main.go
	err := godotenv.Load()
	if err != nil {
		log.Fatal("Error loading .env file")
	}

	DB_USER := os.Getenv("DB_USER")
```

# 関数

### 引数

同じ型の引数を複数個受け取る場合、引数の型は省略できる。
例：

```
func add(x, y int) int {
	return x + y
}
```

`x, y int` でも `x int, y int` でも良い。

### 戻り値

#### 関数は複数の戻り値を返却できる
例：

```
func hoge() (string, error) {
}
```

↑括弧で戻り値を複数指定できる。

#### 戻り値を変数名で指定する

例：

```
func split(sum int) (x, y int) {
	x = sum * 4 / 9
	y = sum - x
	return
}
```

↑ `return` の変数名を省略できる。

# 型変換

型変換

例：

```
var i int = 42
var f float64 = float64(i)
var u uint = uint(f)
```
Railsでのランダム表示を実装してみた　簡単！[初心者向け]

#初めに
ポートフォリオを作成するにあたり、ランダム表示を実装しました。
プログラミング歴4ヶ月の初学者でも簡単に実装できたのでメモを残します。
もし良かったら、参考にしてみてください。

#環境
・Ruby '2.3.8'
・Rails '5.2.3'

#前提条件
bookというテーブルに、titleとcontentカラムがあるとします。

#実装方法
実装方法はは簡単でコントローラーとビューに記述するだけです。

##コントローラー
```ruby:books_controller.rb
#5件表示
@random = Book.order("RANDOM()").limit(5)

#全件表示
@random = Book.order("RANDOM()").all
```

limitを設定することで表示される件数を指定することができます。

###注意点
mysqlを使用しているとエラーが発生します。
その場合は、以下のように記述する必要があります。
**(*RANDOMをRANDにしないといけません。)**

```ruby:books_controller.rb
#5件表示
@random = Book.order("RAND()").limit(5)

#全件表示
@random = Book.order("RAND()").all
```

##ビュー
```ruby:index.html.erb
<% @random.each do |book| %>
  <%= book.title %>
  <%= book.content %>
<% end %>
```
以上で実装完了です。

#参考資料
[railsでランダムに複数のレコードを取得する](https://qiita.com/nekononeko_53/items/34748a2ecc9a521a19bc)

#最後に
たったこれだけで実装できます。
もし良かったら試してみてください。

最後までお付き合い頂きましてありがとうございます。
Sublime 徒然メモ

昔はEmacsを使ってましたが、最近はSublimeTest( https://www.sublimetext.com/ )が好きです。設定で悩んだ時のメモです。


## 最後のセッションを開かない

Menu Bar > Preference > Settings

    {
      "hot_exit": false,
      "remember_open_files": false
    }

- 参照
    - https://forum.sublimetext.com/t/disable-automatic-loading-of-last-session/4132/16

## PDFを開く

PDFの中を見せられても困るので、Non Text File (https://packagecontrol.io/packages/Non%20Text%20Files) を使う。

- Preferences -> Package Control 
    - Install Package
        - Non Text File

その後、Setting に下記追加

    "open_externally_patterns": [
      "*.jpg",
      "*.jpeg",
      "*.png",
      "*.gif",
      "*.zip",
      "*.PDF",
      "*.pdf"
    ],

## RHEL6で使う


最新版だと色々エラーが出て動きません。build 3176 (sublime_text_3_build_3176_x64.tar.bz2) ならGtk2なので大丈夫。


    wget https://download.sublimetext.com/sublime_text_3_build_3176_x64.tar.bz2



- 参照
    - https://forum.sublimetext.com/t/build-3200-in-rhel-6-missing-glibc-2-15/42320
    - https://github.com/SublimeTextIssues/Core/issues/2796

## Package Control

https://packagecontrol.io/installation

## Verilog

- Preferences -> Package Control 
    - Install Package 
       - Verilog
       - SystemVerilog



- Verilog https://packagecontrol.io/packages/Verilog
- SystemVerilog https://sv-doc.readthedocs.io/en/latest/

## 行末のスペースを表示

- Prefarences -> Package control
    - Install package
        - TrailingSpaces
Railsでサブドメインに対応させる方法

# はじめに
こんにちは！
こちらの記事では、RubyOnRailsでサブドメインに対応させる方法をご紹介したいと思います^^

サブドメインを設定することによって、localhost:3000から脱却し、mysite-onaga.comや、one.mysite-onaga.com、two.mysite-onaga.com、three.mysite-onaga.comなど好きなドメインを設定できます！

しかし、こちらのドメインはあくまでローカル(自分のPCだけ)だけで使えるものになりますのでご注意ください。。サイトを公開するには、お名前.comさんなどでドメインを取得して設定する必要があり、こちらはご紹介しておりません。

**前提：Rails環境構築済み, Mac**

# URLをlocalhost:3000以外に変更する
はじめにPCの設定そのものにlocalhost:3000にサブドメインを設定してあげます。設定済みの方は飛ばしていただいて大丈夫です。

Macの場合、ターミナルを開いて、`vi /etc/hosts`で設定ファイルを開きます。人によっては書き込み権限がなく、`sudo vi /etc/hosts`にする必要があるかもしれません。

```
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost
127.0.0.1       mysite-onaga.com one.mysite-onaga.com
255.255.255.255 broadcasthost
::1             localhost
```
localhost:3000はIPアドレスにすると、`127.0.0.1`となります。
ですので、hostファイルの`127.0.0.1`の行に自分で設定したいサブドメインを記述します。

# Railsでrouteを設定する
前章の設定で、URLをmysite-onaga.comなどでアクセスすることで、localhost:3000で開いていたページを開くことができるようになりました。しかし、今回設定したサブドメインは3つあります。せっかくなので、サブドメイン別にrouteを設定していこうと思います。
例えば、`get 'home/zero'`はmysite-onaga.comでしかアクセスできないように、`get 'home/one'`はone.mysite-onaga.comでしかアクセスできないようにすることができます。

やっとこRailsのroutes.rbを編集していきます！

```
### routes.rb ###

# mysite-onaga.com
constraints subdomain: '' do
  get 'home/zero'
end

# one.mysite-onaga.com
constraints subdomain: 'one' do
  get 'home/one'
end
```

以上の設定により、`http://mysite-onaga.com/home/zero`と`http://one.mysite-onaga.com/home/one`にアクセスできるようになったかと思います^^

`rails routes`コマンドを打つとパスがちゃんと設定されているか確認できると思いますので、試してみてください。


#終わりに
以上がRailsでサブドメインに対応させる方法になります！
MySQLでマルチバイト含む文字列カラム検索(like,with ngram,mroonga)

## う゛ぁーじょん
CentOS7
MySQL 8.0.17
Mroonga 9.05
MeCab 0.996

## やりたいこと
そこそこ件数が膨らむ算段のテーブルのVARCHAR(128)カラムに対し、曖昧な検索をかける。
その際、欲しい結果としては部分一致(LIKE '%検索ワード%')。

## とりあえず
```sql
CREATE TABLE test (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(128) NOT NULL UNIQUE,
  PRIMARY KEY (id),
  FULLTEXT KEY ftk_test_name (name) COMMENT 'tokenizer "TokenMecab"'
) ENGINE=mroonga DEFAULT CHARSET=utf8mb4;
```

このテーブルにa-zまでの英小文字のみで構成される、5文字のstringを100万件放り込む。

## 没案
```sql
  FULLTEXT KEY ftk_test_name (name) WITH PARSER NGRAM'
```
mysql 5.7からデフォルトで全文検索できるようになってると聞いたので試したが、
検索結果が大きくなるようなクエリだと何故かempty setが返る。調べたところ、

https://dev.mysql.com/doc/refman/5.7/en/fulltext-natural-language.html

結果セットがテーブル全体の50%を超えたらあかんでみたいなこと書いてある。
`IN BOOLEAN MODE` つけても結果に変化はなかったので、結果セットが小さくなるように頑張れよって意味か…？

何にせよ、使いづらそうなのでmroonga導入。

## like結果
```sql
SELECT COUNT(*) FROM test where name LIKE '%abc%';
+----------+
| count(*) |
+----------+
|      207 |
+----------+
1 row in set (1.32 sec)
```
やはりlikeだとちょい遅い。最初から件数がデカくなると分かっているテーブルに対して持ち出したくない。

## MATCH AGAINST結果
```sql
SELECT COUNT(*) FROM test WHERE MATCH(name) AGAINST('abc');
+----------+
| count(*) |
+----------+
|       67 |
+----------+
1 row in set (0.11 sec)

SELECT COUNT(*) FROM test WHERE MATCH(name) AGAINST('abc' in boolean mode);
+----------+
| count(*) |
+----------+
|       67 |
+----------+
1 row in set (0.00 sec)
```
速いのはいいけど、これ前方一致検索結果だよ。 LIKE 'abc%' になっちまってる。
いや、困った。mroongaのドキュメント見る限り、特に何もせずとも普通は最初から部分一致検索に思うんだけど…
知ってる方いたらそっと教えてください

## 追記
```sql
FULLTEXT KEY ftk_test_name (name) COMMENT 'tokenizer "TokenBigramSplitSymbolAlphaDigit"'
```
にしたらあっさり解決しました。アホすぎ。
※今回のデータ要件はマルチバイト・英数字全部入る可能性があるのでDigitにしてます
Ruby on Railsでchart.jsに変数を入れる方法

# はじめに
１９年６月からプログラミングの勉強をはじめているものです。
作成したアプリでchart.jsを使用し、変数を入れるところに苦労したので書いてみます。

# chart.jsの導入
導入に関しては[こちら](https://qiita.com/Y_uuu/items/ef107a02c27836696545)を参照、大変分かりやすくグラフの導入部までは簡単にできます。

# グラフに変数を入れる。
例えば、毎日の運動時間を測るアプリで、運動時間と日付を棒グラフで作る際は、このような感じになります。

### 前提　
UsersとSportsとテーブルがある。
UsersとSportsは親子関係で一対複数の関係
Sportsにはsport_day（データ型はdate）とsport_time（データ型はfloat）のカラムを持つ
*created_atでも問題なし

### Controllerからです。

X軸はこちら、日付を配列させます。

```users_controller.rb
        @graphdays =  @user.sports.order(sport_day: "DESC").limit(6).reverse
        @dayline = Array.new
        @graphdays.each do |graphday|
            @dayline.push(graphday.sport_day.strftime('%m/%d').to_s)
        end
```
以上、limitの数はご自由に、reverseさせないと表示された時、31日、30日という順番になります。
date型は.to_sを使用しないと文字列として表示されないので注意

Y軸はこちら、時間を配列させます。

```users_controller.rb
        ＠graphtimes =  @user.sports.order(sport_day: "DESC").limit(6).reverse
        @timeline = Array.new
        @graphtimes.each do |graphtime|
            @timeline.push(graphtime.sport_time)
        end
```
こちらもreverseを忘れずに

### 次はViewです。

```show.html.erb
<canvas id="spotsChart" width="200" height="200"></canvas>
   <script>
    var graphdays = <%== @dayline %>, graphtimes = <%= @timeline %>
   </script>
  　<script>draw_graph();</script>
```
ここはvarを使わないと変数が入らないので注意が必要
daylineのところは<%== %>と＝＝が二つならないとなぜか表示されませんでした。
（場合によっては＝＝でなくても大丈夫かも知れません）

### 最後はcoffeeです。

```users.coffee
    window.draw_graph = -> 
    ctx = document.getElementById("sportsChart").getContext('2d')
    sportsChart = new Chart(ctx, {
        type: 'bar',
        data: {
            labels: graphsdays,#ここは日付が表示される　X軸に当たる
            datasets: [{
                label: '運動時間',
                data: graphtimes,#ここは時間が表示される　Y軸に当たる
                backgroundColor: [
                    'rgba(255, 159, 64, 0.2)',
                    'rgba(255, 159, 64, 0.2)',
                    'rgba(255, 159, 64, 0.2)',
                    'rgba(255, 159, 64, 0.2)',
                    'rgba(255, 159, 64, 0.2)',
                    'rgba(255, 159, 64, 0.2)'
                ],
                borderColor: [
                    'rgba(255, 159, 64, 1)',
                    'rgba(255, 159, 64, 1)',
                    'rgba(255, 159, 64, 1)',
                    'rgba(255, 159, 64, 1)',
                    'rgba(255, 159, 64, 1)',
                    'rgba(255, 159, 64, 1)'
                ],
                borderWidth: 1
            }]
        },
        options: {
            scales: {
                yAxes: [{
                    ticks: {
                        beginAtZero:true
                    }
                }]
            }
        }
    })
```

このようなグラフができると思います。
![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462567/34650338-abe2-df75-76c2-ea2076a34e8a.png)
gitをpushする際にエラー発生(error: src refspec ブランチ名 does not match any)

# エラー詳細
任意のブランチをpushする際に、下記のようなエラーが発生しました。

```
$ git push origin ブランチ名
error: src refspec ブランチ名 does not match any
```
`git branch`を実行すると、下記のような表示がでます。

```
$ git status
develop
master
*(HEAD detached at origin/49792)
```

# 解決策

```
git push origin HEAD:pushしたいブランチ名
```

# 参考
[making a git push from a detached head](https://stackoverflow.com/a/40929378)
*tagsの話

C++のソースを書いていると、この変数の宣言どこだっけ？とか、この関数の宣言どこだっけ？とか、呼んでるところどこだっけ？みたいなことが良くあります。
VisualStudioなら、なんかファンクションキーを押したら飛んでいける奴です。

# etags, ctags

昔からある奴です。
面倒なので説明は省略します。

# gtags

GNU globalのものだそうです。
Ubuntuだとその名もglobalと言うパッケージをインストールすると、gtagsとかglobalコマンドが使えるようになります。

init.el に以下を追加します。

```init.el
;; gtags
(use-package gtags
  :commands gtags-mode
  :config
  (add-hook 'c-mode-common-hook 'gtags-mode)
  )
```

プロジェクトのトップディレクトリで、gtags と打つと、GPATH, GRTAGS, GTAGS と言う3つのファイルができます。
デフォルトではキーが何も設定されていないので、`M-x gtags-find-tag` とか打つ必要があります。
gtagsを使う場合は、使いそうなコマンドをキー割り当てしましょう。

ここまでは github の gtags ブランチで。

# rtags

ctags, etags, gtags は、タグの情報をファイルに書き、emacsはそのファイルを読んで動作する。
rtags は、rdm と言うデーモンが情報をemacsとやり取りする。

Ubuntuの場合、パッケージに見当たらなかったので、[github](https://github.com/Andersbakken/rtags)に書いてある通りにgit cloneしてビルドした。
使い方は[wiki](https://github.com/Andersbakken/rtags/wiki/Usage)にある。
手順通りにビルドすると rtags.el は /usr/local/share/emacs/site-lisp/rtags に入るのだが、最近はpackage-installばかり使って個人の ~/.emacs.d にパッケージが入ったため、/usr/local/share/emacs/site-lisp/subdirs.el が存在しなかった。
このため、rtags.elが読み込めなくて少し悩んでしまった。

以下の内容をinit.elに追加する。

```init.el
;; rtags
(use-package rtags
  :hook (c++-mode . rtags-start-process-unless-running)
  :config
  (rtags-enable-standard-keybindings)
  (setq rtags-completions-enabled t)
  (add-to-list 'company-backends 'company-rtags)
  (bind-keys :map c-mode-base-map
             ("M-." . rtags-find-symbol-at-point)
             ("M-," . rtags-location-stack-back)
             ("C--" . rtags-find-references-at-point)
             ("M-;" . rtags-find-file)
             ("C-." . rtags-find-symbol)
             ("C-," . rtags-find-references)
             ("C-<" . rtags-find-virtuals-at-point)
             ("M-i" . rtags-imenu))
  )
```

rtags-enable-standard-keybindingsでデフォルトのキー設定がされるのだが、prefixが深くて使いにくいので、良く使うコマンドはキー割り当てしよう。
この状態でc++のソースを開いて、`M-.`とか押すと、indexされてませんよ？とか怒られるので、プロジェクトのトップディレクトリで `rc -J build/`とかやってcompile_commands.json の位置を教えてあげると、情報がインデックスされて使えるようになる。
Makefileにも対応しているので、マニュアルを読んで欲しい。

とは言え、lspにも似たようなことができるはずだし、rtagsにもcompileコマンドっぽいものがあったりして、機能がかぶっているような気もしないでもない。

ここまでは github の rtags ブランチで。
apkファイル(android)を実機にインストールする方法(ReactNative)

# 手順
デバイス(OSがandroid)をお使いのコンピュータに接続します。
その後、apkファイルがある場所まで移動し、下記を実行します。

```
adb install sample.apk
```

# エラー

```
$ adb install sample.apk
* daemon not running; starting now at tcp:5037
* daemon started successfully
error: device unauthorized.
This adb server's $ADB_VENDOR_KEYS is not set
Try 'adb kill-server' if that seems wrong.
Otherwise check for a confirmation dialog on your device.
```

### 解決法
デバイスをコンピュータから外します。
andoridのSystemsへ移動し、Developer options -> `USB debugging`をon, `Revoke USB debugging authorizations`をタップします。

ターミナルにて、下記コマンドを実行

```
adb kill-server
adb start-server
```

# 参考
[How To Fix ADB Device Unauthorized Message On Android](https://www.addictivetips.com/android/fix-adb-device-unauthorized-message-android/)
minicondaのインストールと仮想環境の複製・インポート


# Minicondaを使う利点
-  condaでtensolflowを入れると、GPUで学習を並列処理するのに必要となるライブラリ（CUDAやcuDNN）を勝手にインストールしてくれる。
https://www.anaconda.com/tensorflow-in-anaconda/
- 仮想環境の設定ファイルが出力できるので、仮想環境の使いまわしが簡単。（pipenvのPipfileと同様）
- Anacondaと比べて、最小限の機能だけ有しているので、インストールなどが楽で気軽に手を出せる。

# 環境
- Ubuntu 18.04
- conda 4.7.11(2019年8月30日時点 最新)

# Minicondaのインストール

```bash
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh  
bash Miniconda3-latest-Linux-x86_64.sh
```

参考：Minicondaのアーカイブ（Windows版、Mac版もダウンロードできます）
https://repo.continuum.io/miniconda/

# 仮想環境の準備

仮想環境の作成
```-n``` に環境名を設定します。

```bash
conda create -n <envname> python=3.6
```

作成した仮想環境を確認

```bash
conda info -e
```

仮想環境の有効化

```bash
conda activate <envname>
```

```source activate```でも仮想環境に入れるが、conda 4.4.0(2017-12-20)以降からは```conda activate```が推奨されている。
[4.4.0 (2017-12-20) Recommended change to enable conda in your shell](https://github.com/conda/conda/blob/a4c4feae404b2b378e106bd25f62cc8be15c768f/CHANGELOG.md#440-2017-12-20)

仮想環境の無効化

```bash
conda deactivate
```

# condaのProxy設定（Proxy環境のみ）

設定ファイル ```.condarc```を作成

```bash
# create '.condarc' inside home directory
conda config
```

```.condarc``` を編集。隠しファイルなので、```ls``` では表示されない。

```bash
cd $home
sudo vim .condarc
```

以下の内容を転記。{}の内容は、適宜書き換え

```bash
proxy_servers:
    http: http://{user}:{password}@{proxy_ip_or_domain}:{proxy_port}
    https: http://{user}:{password}@{proxy_ip_or_domain}:{proxy_port}
```

設定が反映されているか確認

```bash
# create '.condarc' inside home directory
conda config --show
```


# パッケージのインストール

```bash
conda install ライブラリ名
```

# 仮想環境の設定ファイル出力

yml形式で設定ファイルを出力します。
この設定ファイルは、GCPやAWSなどのインスタンスに同一環境を作成する際に重宝します。

```bash
conda env export -n <envname> > myenv.yml
```

# 設定ファイルをもとに仮想環境を複製

前項で作成した設定ファイルを、```-f```オプションに指定し、```conda env create```を実行します。


```bash
conda env create -n <envname> -f myenv.yml
```

仮想環境が作成されているか確認

```bash
conda info -e
```

# 仮想環境の削除

```bash
conda remove -n <envname> --all
```


以上
Lambda使用時のenvについて

###Rubyでは.envに書いていたようなトークンなどをどうするか悩んだので、忘れないようにメモ。


1. template.yamlのEnvironmentにTOKENを付け足す。

2. デプロイ時にパラメーターとしてTOKENの実際の値を受け取れるように、ParametersにTOKENを設定。


```template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  my_app

  Sample SAM Template fo  my_app

Parameters:
  TOKEN:
    Type: String
    Default: xxxx

Globals:
  Function:
    Timeout: 3

Resources: 
  MyFunction: 
    Type: AWS::Serverless::Function 
    Properties:
      Role: !GetAtt IamRole.Arn
      CodeUri: directory_name/
      Handler: my_function.lambda_handler
      Runtime: ruby2.5
      Environment:
        Variables:
          SAM_ENV: production
          TOKEN: !Ref TOKEN
      Events:
        SlackSchedulePost:
          Type: Api 
          Properties:
            Path: /
            Method: post

IamRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: "sts:AssumeRole"
      Policies:
        -
          PolicyName: "lambda_my_app"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              -
                Effect: "Allow"
                Action: "dynamodb:*"
                Resource: [
                  "xxxx"
                ]
              -
                Effect: "Allow"
                Action: "logs:*"
                Resource: "*"
```

3  env.jsonにTOKENを設定。

```env.json
{
  "MyFunction": {
    "TOKEN": ""
  }
}
```


これで、デプロイ時にパラメータとしてTOKENの値を渡せば、その値で上書きして作動してくれる。
ローカルのmasterブランチが古くなってしまって、ぶつかってcheckoutできないときの対応

よくある話かと思いますが、masterからブランチを切って作業していて、PRを出してマージしたんだけどmasterに戻ろうとすると一部の変更ファイルがあってcheckoutできない場合があります。

```
$ git checkout master
error: Your local changes to the following files would be overwritten by checkout:
	ファイル...
Please commit your changes or stash them before you switch branches.
Aborting
```

これはまあPleaseに書いてあるとおり、一度

- `git stash`して、
- `git checkout master`
- `git pull`して
- `git stash apply`

すると対応ができるのですが、これが正直面倒です。
変更ファイルを残すなって話もあるかと思いますが、これをスピーディーにやる方法があります。

```
git fetch origin master:master
```

というコマンドを打つと、他のブランチにいてもローカルのmasterブランチの内容が最新に更新できるので、

- `git fetch origin master:master`
- `git checkout master`

の２コマンドで解決することができます。(これでもAbortしてしまったらそのときはstash利用しようね)

ちょいちょい`git fetch origin master master`だとか`git fetch origin master`だとかコマンドを忘れがちなのでメモ程度にここに書いておきます。
styled-componentsをTypeScriptで使うTips

styled-componentsをTSで使うケースは多いですが、意外とまとまった記事がなく、聞かれることが多いのでかきました。

## propsに型をつける
親が特定のreact componentでないときは、下記のようにシンプルに書くのがおすすめです。

```tsx
const Button = styled.button<{primary: boolean}>`
  color: ${({primary}) => primary ? 'skyblue' };
`
```

コンポーネントが複雑になったり親のpropsを参照する場合は、Pickを使うとメンテコストが下がることがあります

```tsx
interface Props {
  primary
  secondary
  // 略
}

function MyComponent(props: Props) {
  return (
    <div>
      <Button secondary={props.secondary} primary={props.primary}>{props.children}</Button>
    </div>
  )
}

const Button = styled.button<Pick<Props, 'primary' | 'secondary'>>`
  ${({primary, secondary}) => primary ? css`` : secondary ? css`` : css``}
`
```

## 定数に型をつける
色やサイズなどの定数に型を付けると、利用するときにどのpxが適用されるのかがわかって便利です。

```ts
const FONT = {
  XXXLARGE: 32,
  XXLARGE: 24,
  XLARGE: 18,
  LARGE: 16,
  MEDIUM: 14,
  BASE: 12,
  SMALL: 11,
  XSMALL: 10,
  TINY: 8,
} as const

const FONT_WEIGHT = {
  NORMAL: 400,
  BOLD: 600,
} as const

const BORDER_RADIUS = 4 as 4

export default {
  FONT,
  FONT_WEIGHT,
  BORDER_RADIUS
}
```
このようにすることで、↓エディタのsuggestion機能でどの定数がどのpxを持っているかを確認することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145279/d8146a8d-d5e5-e4c7-67f8-8fc702774eb9.png)

## css propを使うとき
babel-pluginや、babel macroで有効になるcss propは、jsxの拡張になるため何もしないとTSに怒られます。
type rootのindex.d.tsで下記を記述すれば解決します。（styled-components/csspropはreactの拡張をしています）

```ts
import {} from 'styled-components/cssprop'
```

## attrsを使うとき

これはちょっと面倒な書き方をしなければいけないので、そもそもattrsを多用しないのもありかもしれません。

```ts
const StyledImg = styled.img.attrs<{ logoSrc: logoSrc }>(
  ({logoSrc}) => ({
    src: logoSrc,
  })
)<{ logoSrc: logoSrc }>``

```
Azure Sphere で curl を使う

　初めて投稿いたします！
　WEB～組み込みまで、ソフト系いろいろやっているエンジニア hasenagataです。

##背景
　最近、業務やその他お試し/実験含めて Azure (特にIoT周り) を触る機会が多くなってきています。
　その流れで AzureSphere MT3620 Development Kit を使って色々開発しているのですが、下記の様な疑問を感じました。
　
**　　　AzureSphere で既存サービスにデータ送るときはどうしたらいいの？？**

　AzureSphereからのデータ送信について、Azure IoTHub や IoTCentral等のPaasとの連携はサンプルも多いです。しかし、既存サービスに存在するAPI経由でデータを送る方法がいまいちわからずにいました。ただ、色々調べていくとAzureSphereでもcurlを使う事でHTTP/HTTPS経由でデータを送信できることがわかりました。今回はその内容を自分の備忘録も兼ねて記載します。

##AzureSphere で curl を使う
　基本的には次のドキュメントを参考にしています。
　・[Connect to web services - AzureSphere](https://docs.microsoft.com/en-us/azure-sphere/app-development/curl)

　下記の様にいくつか設定するだけでcurlを使う事ができます。
###ヘッダファイルの変更
```c:main.c
#include ・・・
#include <curl/curl.h>	// add to curl
```
上記の様に対象ソースに定義を追加します。

###リンカの設定
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489752/f5bdb781-b8ea-1a0d-395e-dc99deac0efc.png)


VisualStudio ソリューションエクスプローラ > 対象のプロジェクトで右クリック し上記の様に「curl」の定義を追加します。
###app_manifest.jsonの変更
```JSON:app_manifest.json
  "Capabilities": {
    "AllowedConnections": [ "xxxxx.azurewebsites.net", "yyyyy.azurewebsites.net" ],
    "Gpio": [],
    "Uart": [],
    "WifiConfig": false
  }
```
上記のとおり**AllowedConnections**に接続したサーバのホスト名を記述します。
記述したホスト以外に接続できませんので、注意が必要です。

###curlの実行
```c:main.c
headers = curl_slist_append(headers, "Content-Type: application/json");
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_URL, "http://xxxxx.azurewebsites.net/data/");
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, sendJson);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, buf);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ApibufferWriter);
rt = curl_easy_perform(curl);
curl_easy_cleanup(curl);
```
　あとはcurlを実行すればOKです。
　上記は **sendJson** に格納したJSON形式のデータを**http://xxxxx.azurewebsites.net/data/**にPOSTする際の例です。

##まとめ
　上記の様にする事で既存のAPIに則ってHTTP/HTTPSでデータを送信することができました。私の場合は他の処理や割り込みを考慮して通信部処理にキューを使ったりもしていました。
　ただ、上記のやり方はAzureSphereの強力なセキュリティ機能や認証機能を使わずにデータを送信しています。ですので、基本的にはIoTHub等のAzure のPaaSと組み合わせて使うべきなんだろうなと個人的には思います。
　本来のAzureの機能をゴリゴリ使う部分は今後別途投稿していきます。
IntelliJでSpringBootをデバッグ

## はじめに
IntelliJでSpringBootのデバッグ手順を調査したので、
まとめたいと思います。

## 環境
Windows 10
IntelliJ IDEA 2019.2.1(Ultimate Edition)

## 実行・デバッグ構成の作成
始めに実行・デバッグ構成を作成します。

実行・デバッグ構成のプルダウンから「Edit Configurations」を選択
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439739/f7c2ada1-e677-6b18-10c9-8528aa099c90.png)


選択すると「Run/Debug Configurations」設定画面が立ち上がるので、
「＋」を選択して「Spring Boot」を選択。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439739/a7c049d2-067a-d257-86ad-4ef92b0518d2.png)

実行・デバッグ構成が出来るので、「Name」に任意の名前、「Main class」にデバックしたいプロジェクトの
メインクラスを指定してOKを選択。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439739/86896044-f5e0-b646-ed11-d2558129926b.png)

これで実行・デバッグ構成の作成は完了です。

##デバッグ
デバッグ構成が出来たので実際にデバッグしていきます。
ここではDemo用として「hello-world」と言うAPIを用意したので、それをデバッグしていきます。

・ブレークポイントの設定
　ソースコードの横のバーをクリック、もしくは「Ctrl+F8」で止めたい行にブレークポイントを設定
　![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439739/81f411be-8682-58fd-2cd3-98dd8ed7abcf.png)

・デバック
　メニューバーの「Run」 → 「Debug 'デバッグ構成名'」を選択、もしくは「Shift+F9」でプロジェクトを実行
　![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439739/38ae0484-020d-d276-2780-38ab88d162f0.png)
　APIを叩くとブレークポイントを設定した行で処理が止まります。
　変数がある場合は「Variables」で値の確認もできます。
　![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439739/762352ac-746b-771b-dfeb-f35bfb4ca125.png)

##「ステップ・イン」「ステップ・オーバー」
「ステップ・イン」「ステップ・オーバー」は以下のショートカットで実行できます

| 項目　　　　　              |       ショートカット|
|:-------------------------:|:-------------------:|
| ステップ・イン              |                 F7 |
| ステップ・オーバー          |                 F8 |
　その他ステップについては以下公式ヘルプが解りやすかったので
　参考にしてみてください。
　https://pleiades.io/help/idea/debug-tool-window.html#steptoolbar

##その他便利機能
　IntelliJではブレークポイントにプロパティーを設定することが出来ます。
　今回はその中から条件を設定する方法を紹介します。
　特定の条件の時のみ処理を止めたいことは多々あるかと思いますが、
　その際に使用することが出来ます。

　以下は100回ループして1回ごとに「hello world[iの値]」を作る処理です。
　この処理をiが89になったところでブレークしてみます。
　![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439739/a78bd06d-8d2b-7651-abfc-0aec85773de3.png)

　ブレークポイントを右クリックするとプロパティーの編集画面が出るので「Condition」に
　「i==89」と指定します
　![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439739/cc9ff9e5-23ee-b5bd-9153-dc8cdfe872a7.png)
　これで実行するとiが89の時点でブレークされ、その時点の変数が確認できます。
　![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439739/b225bf5f-2dbf-519f-f66e-4714b169b066.png)

　プロパティーはこの他にも設定が可能なので興味がある方は以下公式ヘルプをご確認ください。
　https://pleiades.io/help/idea/using-breakpoints.html#breakpoint-properties
　
##参考リンク
　・[公式ヘルプ（デバッグ）](https://pleiades.io/help/idea/debugging-code.html)
　・[続：今さらだけどIntelliJ IDEAで使えるJavaのブレークポイントあれこれ](https://qiita.com/oohira/items/31767e0958ea322184fb)
　・[IntelliJ IDEAのデバッガのstep over, step into, force step into, step out, drop frame, run to cursor 機能の解説](https://qiita.com/takc923/items/35979a3ae68c9ad890df)
add_filterで複数引数を扱う場合は指定が必要

`wp_count_posts`を`add_filter`して処理をフックしようとすると以下のエラーが発生。

```
Fatal error: Uncaught ArgumentCountError: Too few arguments to function ...
```

引数の数が不正とのこと。
結論として、`add_filter`の第4引数に、関数に渡す引数の数を指定する必要がある。
初期値は1だから1つしかとれてないのね。

```php
add_filter('wp_count_posts', function($counts, $type, $perm) {
	// 処理内容
}, 10, 3);
```

ドハマリした。。

参考
- [関数リファレンス/add filter \- WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_filter)
- [ワードプレスで寄稿者に画像アップ権限を付ける＋自身の所有メディアしかリストさせない｜コンサルティング事業部ブログ｜株式会社アクセスジャパン](https://access-jp.co.jp/blogs/webcon/44)
Object等の呼び出しでkeyに動的な変数を使う [TypeScript]

# やりたいこと

object等の呼び出しで `Object[key]` のようにするとき、`key` に動的な変数を入れたい。

# 問題・エラー

何も考えずに下記のように書くと、

```typescript
const object = {
    aaa: 'aaaa',
    bbb: 'bbb',
};
// keyには動的に生成された値
const key: string = receivedStringValue;
const value = object[key];

```
下記のエラー

```
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ aaa: string; bbb: string; }'.
```

# 解決策

`object` に対して型を定義する

## よくない例

このエラーは、`key` に規則性がない(any型)、であるためにでているエラーなので、下記のような型定義ではエラーは治らない。

```typescript
interface AB {
    aaa: string;
    bbb: string;
}
const data: AB = {
    aaa: 'aaaa',
    bbb: 'bbb',
};
const key: string = receivedStringValue;
const value = data[key];
```

## 結論

### `key`の型がわかるような`object` の型を定義する

```typescript

interface StringKeyObject {
    // key に string、value も string が返る
    [key: string]: string;

    // value には string 以外も渡せる
    // ex) number, unknown, any, ...
    // [key: string]: unknown;
}
const object: StringKeyObject = {
    aaa: 'aaaa',
    bbb: 'bbb',
};
// keyには動的に生成された値
const key: string = receivedStringValue;
const value = object[key];
```

(`StringKeyObject` ... もっと良い命名とかあれば教えてください…)

# 参考
[Typescriptで、Object[key]とすると出るIndex signature of object type implicitly has an 'any' type.を正しく回避する](https://qiita.com/gonta/items/fb7b9e6d0f12060c27d6)
macOSのhostsファイルではポート番号は指定できない

自分の中で曖昧で忘れそうなのでメモします。

#状況｜前提
docker-machine上にdocker-compose+Dockerfileでnginxコンテナを立てて
開発環境を作成しているところでポート、IPの設定が曖昧で少しはまった状態。
192.168~:8080でwelcome to nginxは出るものの
テスト環境用のドメイン、example.comではアクセスできなかった。

```error.hosts

192.168~ example.com:8080

```

docker-machine ls時のURLが
tcp://192.168~:2376

docker container ls した時のportsの部分が
8080/tcp, 0.0.0.0:8080->80/tcp

という状況でした。

machineにIP１９２．１６８が割り当てられ
0.0.0.0はhostOS(macOS）自身を指している？
docker-machineの8080で受けたものをnginxの８０に渡している？
この辺り解釈が曖昧で恐縮です。間違っていたら突っ込みいただけたら嬉しいです。

#hostsファイルで指定できるのはIPとホスト名（ドメイン）だけ
[参考サイト１](https://okwave.jp/qa/q6547976.html)
これがはっきりして助かりました。

#アクセスできるようになった設定

以下の設定でアクセスしたところOKでした。

```ok.hosts

192.168~ example.com

```

```/etc/nginx/conf.d/example.conf

server {
    listen       80;
    server_name  example.com;

    location / {
        root   /app/example;
        index  index.html index.htm;
    }
}

```

↑の設定にして
example.com:8080
でアクセスすると見れました。
【初心者用】新規構築時のGit一連の流れ

備忘録＆定着のため、自分が使いそうな点も含め残します。
個人用トラブルシューティング的なやつです。
必要になれば追記していきます。

VScodeのgit拡張機能ってとても便利ですよね。
現職では、静的Webサイト構築時に使用しています。

##設定

```
$ git config --global user.name 'username' // 作業者名の表示に使用（コミット者名等）
$ git config --global user.email 'username@example.com' 作業者メールアドレスの表示に使用（コミット等）
```
上手くいかないからと何度も行うとエラーが発生する。（当たり前）
その場合はエディタで編集すると解決しやすいかも。

###エディタで設定
```
$ git config -e  # ローカルの設定を変更
$ git config --global -e
$ git config --system -e
```

##一連の流れ

###ファイルのステージング（全ファイルをステージングするとき）
```
git add --all
```

####ファイルを指定する
```:
git add index.html
```

####コミットする
```
git commit -m "first commit"
```

####リモートリポジトリへpush
#####リモートリポジトリの登録
```
git remote add origin [url]
```

#####リモートリポジトリの変更
```
git remote set-url <リポジトリの名前> <新しいリポジトリのURL>
```

#####リモートリポジトリの削除
```
git remote rm origin
```

#####登録済みのリモートリポジトリ確認
```
git remote -v
```

#####リモートリポジトリへpush
```
git push -u origin master
```

#####リモートリポジトリへ強制上書きpush
```
git push -f
```

###リモートリポジトリと同期する
```
git pull <repository> <branch>

//例）
git pull origin master

```

###リモートリポジトリから引っ張ってくるとき
```
git clone [クローンしたいリポジトリ] [クローン先のディレクトリ(省略可)]
```

##参考

Git(Hub)で作業をする一連の流れ 忘備録 - Qiita
[https://qiita.com/oreo/items/d07877c640bfd94fb489]
Processingで使えないフォントでも使いたい

# 結論

dataフォルダーのなかにttfファイルなどを置き、それをcreateFont()でPFontを取得できる

それをtextFont()で設定する

例

```java
textFont(createFont("font.ttf", 64));
```

# 過程

先週、あのフォントを使いたい！と思ったのですが、

```java
void setup()
{
  textFont(createFont("KHドット秋葉原16", 32, true));
}

void draw()
{
  text("abcあいう", 0, height);
}
```

このコードを実行すると、

> "KHドット秋葉原16" is not available, so another font will be used. Use PFont.list() to show available fonts.

というエラーを吐いた

コンピュータにインストールしてあるフォントなのですが、ダメらしい

試しにPFont.list()を確認する

```java
String[] list = PFont.list();

for (int i = 0; i < list.length; i++)
{
  println(i + ":" + list[i]);
}
```

>0:Agency FB
1:Agency FB Bold
2:Algerian
（省略）
258:KHドット秋葉原16
（後略）

KHドット秋葉原16が存在していた

```java
String[] list = PFont.list();

for (int i = 0; i < list.length; i++)
{
  textFont(createFont(list[i],64, true));
}
```

>"Bahnschrift Bold" is not available, so another font will be used. Use PFont.list() to show available fonts.
"Bahnschrift Bold Condensed" is not available, so another font will be used. Use PFont.list() to show available fonts.
（省略）
"KHドット秋葉原16" is not available, so another font will be used. Use PFont.list() to show available fonts.
（後略）

やはり、PFont.list()の中に書いてあるフォント全てが使えるわけではなさそうだ

また、Processingの開発ツールの「ツール」の「フォント作成」では、選べるフォントが全て英語だった（私の環境だけ？

公式リファレンスを見てみると、
https://processing.org/reference/createFont_.html

>When sharing a sketch with other people or posting it on the web, you may need to include a .ttf or .otf version of your font in the data directory of the sketch because other people might not have the font installed on their computer.

>他の人とスケッチを共有したり、Webに投稿したりする場合、他の人がフォントをコンピューターにインストールしていない可能性があるため、スケッチのデータディレクトリにフォントの.ttfまたは.otfバージョンを含める必要があります。（グーグル翻訳より）

dataフォルダーの中にttfファイルなどを置き、それをロードすることができるらしい

```java
textFont(createFont("KH-Dot-Akihabara-16.ttf", 64, true));
```

これで無事に好きなフォントを使うことができた
python勉強メモ①

今日から自己学習の為に学んだ内容をメモしていきます。
※さぼり防止の自己満足メモです。

▼下記 cmd にて実施する　※Windowsの場合。今回は10使用
・python起動方法
cmdにて「py.exe」を入力

・pythonの起動バージョン確認
python -m pip -V

・pipのインストール
python -m pip install <パッケージ名>

・現在インストールされているpip確認
python -m pip freeze
python -m pip list

・パッケージの検索
python -m pip search <パッケージ名>

・pipアップグレード
python -m pip install --upgrade pip


▼ライブラリ
pep8 ⇒ ガイドラインに準拠しているかどうかチェック
pyflakes ⇒ 文法の誤りや不要な import 文など無駄なコードも検出
pytest-pep8 ⇒ pep8より見やすくまとめて詳細に表示してくれる





https://docs.python.org/ja/3/library/index.html
☆おすすめ
↓いつも隣にITのお仕事
https://tonari-it.com/python-standard-module-import/

↓CSV書き出し系
https://stjun.hatenablog.com/
【LT資料】Node.jsとは？

## 自己紹介

松田尚也(24)
(一応)二年目エンジニア

### 最近やったこと・やっていること
- 金融系のREST APIの開発
- スマホアプリ設計 / 開発

### 得意・好き
- JavaScript
- Node.js
- CI/CD (Azure)
- OAuth2.0/(Open ID Connect)

- ♡ビール♡ 
（最近サッポロビールからアサヒ派になりました）

---

## What is Node.js?

---

## What is Node.js

1. だいたい ServerSide JavaScript 実行環境
2. だいたい イベントループ
3. だいたい ノンブロッキングI/O と 非同期処理

---

## だいたい ServerSide JavaScript 実行環境

---

## ServerSide JavaScript 実行環境

- 従来ブラウザで動いていたJavaScriptをServerでも動かせるようにした
    WebServer + JavaScript の実行環境がセットになった感じ

- `node`コマンドを使用できる
   サーバーサイドというよりは、実行環境の提供
   `node hoge.js`
   これだけで対象ファイルのJavaScriptコードが実行される

- npm(Node Package Manager)
  非常にかんたんにライブラリ管理を行える

---

## だいたいイベントループ

---
## イベントループ と 背景

Node.jsの開発が開始された２００９年

C（クライアント）10K（1万台）問題

クライアントの同時接続数が1万件を超えると、CPU等のリソースは余裕があるにも関わらず、
同時接続のオーバーヘッドにより、速度が遅くなってしまう問題のこと

---
## 同時実行（並行処理）の限界

Web及びフロントの発展
↓
Serverに対するリクエスト数が増える
↓
1リクエストに対して1スレッドの処理方式だと、メモリの消費が激しい
↓
結果
1万クライアントを超えると処理が遅くなる

---
## イベントループ

そこで生まれたのがイベントループ
![eventLoop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351271/e6b58581-80a9-7604-5cfa-a083ca2fe0a5.png)


- 一つのスレッドでイベント
- イベントキューには
  Node.jsより更に下のOS等がやってくれる処理を登録  
  イベントループは常にイベントキューに処理がないか監視し、ある場合は実行する


---

## あれ。。。<br> 遅いんじゃない？？？

---

## ノンブロッキングI/O と 非同期処理

---

## ノンブロッキングI/O と 非同期処理

同期的なイベントループ方式だと、、、
I/Oが発生するたびに処理がブロック(何もできない状態)されてしまう。

---

## ノンブロッキングI/O と 非同期処理

そこで、ノンブロッキングI/Oな非同期
![nonblocking.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351271/b6bc85ba-f65f-7ac6-f3c7-b8ab9e3e87b8.png)

- I/Oが発生する処理を行うと直ちに処理が返ってくる
- でも実際には、イベントキューの中で実行待ち状態
- 実際の処理が終わると、予め処理が終了した際に行う`call back`処理が呼び出される


---

## What is Node.js

1. ServerSide JavaScript 実行環境
2. イベントループでシングルプロセス
3. ノンブロッキングI/O で 非同期処理

---
Photoshopで作るランダムなストライプ or ボーダー

![eyecatch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/6322812c-72d9-4e74-e3c0-e355fc3d1019.png)

ランダムなストライプ(ボーダー)を作る方法はいろいろあると思いますが、私が今までに試した中ではこの方法が一番簡単でイメージに近いものが作りやすいのでご紹介します。

#作り方

##1.配色を決める

3～5色で作ると綺麗です。
不慣れな方はこういったツールを使って決めるのもお勧めです。
[Paletton](http://paletton.com/)
[ColorSpace](https://mycolor.space/)

今回は同系色で纏めたかったのでColorSpaceでピックアップしたこの5色を使います。
`#f53d46` `#ff9d96` `#cb0029` `#650000` `#ffc0b6`

##2.1.で選んだ色のうちどれか1色で塗りつぶす
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/945a756a-fbd3-bf3c-be12-b2b39d4ccf1c.png)

##3.残りの色を長方形ツールで適当に配置

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/57c6663e-629e-2f71-d2f3-1b999e556270.png)
長方形を気持ちカンバスからはみ出させてください。
この時、メインの色を多め、アクセント的な色を少なめにするのがコツです。

##4.レイヤーを結合

`レイヤー(L)` > `表示レイヤーを結合`で2.～3.で作ったレイヤーを全て結合してください。

##5.「渦巻き」を適用

`フィルター(T)` > `変形` > `渦巻き`を選択してください。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/e3ac80f0-e6de-0df2-6742-84d6b6d5f831.png)
`角度(A)`は最大の999にして`OK`をクリックしてください。

![5_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/9180fe42-08ef-df17-3041-da72ddf30dec.png)
こんな感じになると思います。

##6.「一行選択ツール」 or 「一列選択ツール」で好きな場所を選択してコピー

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/f4511537-4710-0581-2ac7-27e4a1a78e04.png)

今回はストライプを作るので「一行選択ツール」を使いました。
ボーダーにしたい場合は「一列選択ツール」を使用してください。

**「一行選択ツール」を使った場合…**
![sample_stripe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/08d62213-a23e-fbdb-87d5-9a81d0e4b330.png)

**「一列選択ツール」を使った場合…**
![sample_borderpng.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/9f205e9e-5732-dfa8-d1b9-36a09873a1ce.png)

<details>
<summary>**※「一行選択ツール」「一列選択ツール」の使い方** (クリックすると詳細が表示されます)</summary>
![6_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/5d3eeb06-1ca5-5d5e-afa1-81efa8885383.png)
長方形選択ツールを長押しすると起動できます。
「一行選択ツール」は幅:カンバスの幅一杯×高さ:1pxの範囲を選択します。
「一列選択ツール」は幅:1px×高さ:カンバスの高さ一杯の範囲を選択します。
</details>

##7.6.でコピーしたパーツで新規ファイルを作成
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/151e38e0-41bf-f53c-e57c-f1bee543eae5.png)
分かりづらいかもしれませんが、こんな感じになると思います。

##8.作成したパーツを用途に合わせて活用する

選択した部分をパターンとして登録する、画像として保存してWebサイトの背景などに等、用途に合わせて活用してください。

<details>
<summary>**※パターンとして登録する場合** (クリックすると詳細が表示されます)</summary>
`編集(E)` > `パターンを定義`を選択してください。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/ac5f9a14-ffcf-139a-f584-79a8e0960675.png)
</details>

<details>
<summary>**※そのままWebサイトの背景などにする場合** (クリックすると詳細が表示されます)</summary>
gifまたはpngで保存してください。
</details>

#バリエーション

##「渦巻き」を複数回適用

5.の時に「渦巻き」を複数回適用すると、より細かくて複雑な模様になります。
1回目
![5_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/9180fe42-08ef-df17-3041-da72ddf30dec.png)

2回目
![5_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/04640c38-aa67-823d-d0e4-54b2f93ce699.png)

##選択する位置を変えてみる

6.の時にどこを選ぶかで雰囲気が変わってくるので、色々と試してみることをお勧めします。
![sample_stripe_variation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/af89cae5-f0c9-8088-3e87-04955655ee38.png)
Lookerで選択したmeasure項目をグラフに表示しない方法


Lookerで、**measureで選択した項目をそのままにしたいが、グラフには表示したくない。**といった要望に応える機能がありましたのでメモ残します。

## やりたい事
**measure**で選択した項目を消さずに、グラフから表示対象外にしたい
![選択項目の非表示化1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/4d254611-41cc-04ee-5e0d-db59092757d3.png)

## 作業手順
**DATAタブ**からグラフから非表示にしたい項目の**設定**を選択し、**Hide from Visualization**を選択する
![選択項目の非表示化2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/7d2b0b7f-80ee-d619-a00d-b2c3810df39a.png)
![選択項目の非表示化3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/3d14f75e-bf0d-5abf-749d-3d707c080b8d.png)

## まとめ
重要情報の動きはグラフで可視化しておきたいが、その他データも数字では見てみたい。または、CSVやスプレッドシート等へデータを落として分析してみたい。といった要望がある場合、この機能を利用することになると思います。
AWS lambdaのDynamoDB更新処理で "Invalid UpdateExpression: Attribute name is a reserved keyword"になった時の対処方法

lambdaからDynamoDBの値を更新しようとした時に
タイトルのエラーで怒られた時の対処方法です。

試しにこんな更新処理を書いてみます。

```sample.py
table.update_item(
    Key= {'device_id': device_id},
    UpdateExpression='set store = :s, updated_at = :u',
    ExpressionAttributeValues={
        ':s' : store_name,
        ':u' : updated_at
    }
)
```

これを実行すると…

```console

"An error occurred (ValidationException) when calling the UpdateItem operation: Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: store"
```

どうやらstoreは予約語のようです。

こちらを参照
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/ReservedWords.html

##対処方法として

ExpressionAttributeNamesを使用して、
属性名をプレースホルダー名で置き換えることで解決出来ました。

こんな感じです。

```sample.py
table.update_item(
    Key= {'device_id': device_id},
    UpdateExpression='set #st = :s, updated_at = :u',
    ExpressionAttributeNames= {
        '#st' : 'store'
    },
    ExpressionAttributeValues={
        ':s' : store_name,
        ':u' : updated_at
    }
)
```

無事更新を行うことが出来ました。

##参考
~~ここにハマった！DynamoDB~~
~~https://blog.brains-tech.co.jp/entry/2015/09/30/222148~~

DynamoDB の予約語
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/ReservedWords.html
UnityのmetaファイルにImportLogsという謎の差分が出てしまうときの対処法

UnityプロジェクトをGitで管理していてLFSを使っているときに起きた現象です。

# 事象
Unityで開発してたときにgitをみるとmetaファイルに謎のdiffが出ている。
ImportLogsがうんちゃら。
類似現象 → https://forum.unity.com/threads/editor-keeps-reimporting-fbx-assets.514085/

# 原因
差分の出るmetaファイルの元ファイルがlfs fetchされる前のテキスト状態になってた。
なぜか `git lfs fetch --all` してもファイルがfetchされない。

# 対処
一度fetchされないファイルを削除してgitで変更を破棄する。
「不動産プラグイン」で簡単にCMS構築

##はじめに

Web製作者として活動していると、不動産サイトを作成する機会がどこかでやってくるかも知れません。
そんなとき、役立つかもしれない情報をひとつご紹介します。


とても便利な「不動産プラグイン」を使ってWordpressで作成する方法です。


##不動産プラグイン特徴
一言で言うと、「よくある不動産サイトのCMSプリセット」です。
・トップページ
・各種物件検索機能
・物件詳細ページ
・レインズ連携※1

といった不動産サイトの基本的な骨組みがすぐに利用できます。

※1レインズ
不動産情報の標準化・共有化を目的に1990年に作られたネットワークシステム
https://www.homes.co.jp/words/r4/525000873/

追加プラグインで以下の機能が拡張可能
・地図
・会員
・マッチングメール
・CSV取込み
・校区
・町名検索
・デザインテーマ

この中で、「CSV取込み」が特に便利でした。
インポート設定を変更することで、項目ごとにエクスポート時の対象項目や上書きの条件などを細かくカスタマイズできます。
筆者はこれのお陰ででクライアント様の細かな要望に対応できました。

##導入方法
1.本体DL

https://www.nendeb-biz.jp/よりDL
![dl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/e548c261-8d35-1ae1-0368-403ce3c2d929.png)

2．Wordpressへアップロード
プラグイン→プラグインを追加　よりアップロード
![plugin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/6319c9f9-ec61-f1da-a1ab-ddc766a5c66d.png)

3.有効化
プラグインを有効化
![Activate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/4dc452e4-7e5d-165e-e234-7e9a5e9c3ae3.png)


参考：https://nendeb.jp/1129


おわりに
今回は紹介（さわり）だけでしたが、具体的な利用シーンなども後々書いていけたらと思います。