OmniAICreator/Qiita-1.07M huggingface dataset:
Google Edge TPU用に構築されたモデル

以下のリストでは、各「Edge TPUモデル」リンクは、Edge TPUで実行するためにプリコンパイルされた`.tflite`ファイルを提供します。 APIデモに示されているスクリプトを使用して、Coralデバイスでこれらのモデルを実行できます。 （モデルの対応するラベルファイルもダウンロードすることを忘れないでください。）

多くのモデルについて、「すべてのモデルファイル」へのリンクも提供しています。これは、以下を含むアーカイブファイルです。

- 訓練されたモデルのチェックポイント
- 訓練されたモデルの凍結グラフ
- 評価グラフテキストプロトタイプ（簡単に表示できるように）
- 入力および出力情報を含む情報ファイル
- CPUで実行される量子化TensorFlow Liteモデル（分類モデルにのみ含まれる）


分類モデルを再トレーニングし、オブジェクト検出モデルを再トレーニングするチュートリアルに示されているように、この「すべてのモデルファイル」アーカイブをダウンロードして、転送学習の基礎としてモデルを使用する場合に必要なチェックポイントファイルを取得します。

すべてのモデルを一度にダウンロードする場合は、Gitリポジトリ`https://coral.googlesource.com/edgetpu`のクローンを作成してから、`edgetpu / test_data /`でモデルを見つけることができます。

> 注意：これらは製品品質のモデルではありません。 これらはデモンストレーションのみを目的としています。

Edge TPU用の独自のモデルを構築するには、Edge TPUコンパイラを使用する必要があります。

ImageNetでトレーニングされたすべてのモデルはILSVRC2012データセットを使用しました。

### 画像分類

##### EfficientNet-EdgeTpu（S）

1,000種類のオブジェクトを認識
データセット：ImageNet
入力サイズ：224x224

##### EfficientNet-EdgeTpu（M）

1,000種類のオブジェクトを認識
データセット：ImageNet
入力サイズ：240x240

##### EfficientNet-EdgeTpu（L）

1,000種類のオブジェクトを認識
データセット：ImageNet
入力サイズ：300x300

##### MobileNet V1（ImageNet）

1,000種類のオブジェクトを認識
データセット：ImageNet
入力サイズ：224x224

##### MobileNet V2（ImageNet）

1,000種類のオブジェクトを認識
データセット：ImageNet
入力サイズ：224x224

##### MobileNet V2（iNat昆虫）

1,000種類以上の昆虫を認識
データセット：iNaturalist
入力サイズ：224x224

##### MobileNet V2（iNatプラント）

2,000種類以上の植物を認識
データセット：iNaturalist
入力サイズ：224x224

##### MobileNet V2（iNatバード）

900種類以上の鳥を認識
データセット：iNaturalist
入力サイズ：224x224

##### Inception V1（ImageNet）

1,000種類のオブジェクトを認識
データセット：ImageNet
入力サイズ：224x224

##### Inception V2（ImageNet）

1,000種類のオブジェクトを認識
データセット：ImageNet
入力サイズ：224x224

##### Inception V3（ImageNet）

1,000種類のオブジェクトを認識
データセット：ImageNet
入力サイズ：299x299

##### Inception V4（ImageNet）

1,000種類のオブジェクトを認識
データセット：ImageNet
入力サイズ：299x299

#### 物体検出

##### MobileNet SSD v1（COCO）

90種類のオブジェクトの位置を検出します
データセット：COCO
入力サイズ：300x300

##### MobileNet SSD v2（COCO）

90種類のオブジェクトの位置を検出します
データセット：COCO
入力サイズ：300x300

#####MobileNet SSD v2（顔）

人間の顔の位置を検出します
データセット：Open Images v4
入力サイズ：320x320
（ラベルファイルは必要ありません）

#### デバイス上の再トレーニング（分類）

##### MobileNet v1埋め込み抽出プログラム

このモデルは、`SoftmaxRegression API`を使用したデバイス上の転送学習の埋め込み抽出機能として使用できるように、最後に完全に接続されたレイヤーを削除してコンパイルされます。 このモデルはそれ自体で分類を実行しないため、`SoftmaxRegression API`とペアにする必要があります。

詳細については、「バックプロパゲーションを使用してデバイス上で分類モデルを再トレーニングする」を参照してください。(https://coral.withgoogle.com/docs/edgetpu/retrain-classification-ondevice-backprop/)

##### L2ノルムを備えたMobileNet v1

これは、L2正規化レイヤーおよびImprintingEngine APIと互換性があるその他の変更を含むMobileNet v1の修正バージョンです。 Edge TPU用に構築されていますが、最後に完全に接続されたレイヤーがCPUで実行され、再トレーニングが可能になります。

詳細については、「重量インプリンティングを使用したデバイス上の分類モデルの再トレーニング」を参照してください。(https://coral.withgoogle.com/docs/edgetpu/retrain-classification-ondevice/)

_____
Coral Dev Boardは、Edge TPUコプロセッサーを搭載したシングルボードコンピューターです。 機械学習モデル用の高速なデバイス上の推論を必要とする新しいプロジェクトのプロトタイピングに最適です。

<img width="NaN" alt="google-coral-ai-iot-products.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/4a28ddcf-f19f-b470-b573-8058307ce6f3.jpeg">


- Google Coral EDGE TPU 海外代理店薦める，グローバル出荷：https://store.gravitylink.com/global

Coral USB Acceleratorは、コンピューターのコプロセッサーとしてEdge TPUを提供するUSBデバイスです。 Linuxホストコンピューターに接続すると、機械学習モデルの推論が高速化されます。
[Swift 5]iPhoneから送った画像をXcodeで使ったら警告が出た場合の解決方法「but that file does not have a valid extension.」

iPhoneで撮影した画像をMacに送り、Xcodeで使おうかと思ったところ、
<img width="655" alt="スクリーンショット 2019-08-19 14.59.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54170/6b8e54f0-89d2-6198-59b7-f3337696a2a1.png">

```
The image set "Image" references a file "IMG_xxx.JPG", but that file does not have a valid extension.
```

という警告メッセージが。

検索してみると、どうやら**拡張子のアルファベットが大文字なのが原因**なもよう。

名前変更で拡張子を小文字に変更(この場合、JPG->jpg)することで、無事警告がなくなりました。

意外にも、今まで経験したことがなかったので備忘録がてら書き残しておきます。

##参考
http://xxxx247.hatenablog.com/entry/2017/09/22/183025
1 taitanic生存者を予測する！

#A列をPassengerId B列をSuvivedと設定して,B列のSurviveデータを予測したresultファイルを作る！
※train.csvにはSurvive列も含め、全てのデータが記載されている
※test.csvにはSurvive列が記載されていない

```python
import pandas as pd
import xgboost as xgb

df_train = pd.read_csv("train.csv")
df_test = pd.read_csv("test.csv")

# trainの前処理
#欠陥値を平均値で埋める作業
df_train["Age"] = df_train["Age"].fillna(df_train["Age"].mean())
#欠陥値を最頻値で埋める作業
df_train["Cabin"] = df_train["Cabin"].fillna(df_train["Cabin"].mode()[0])
#欠陥値を最頻値で埋める作業
df_train["Embarked"] = df_train["Embarked"].fillna(df_train["Embarked"].mode()[0])
#[Name][Ticket][Cabin]の列を削除する作業
df_train.drop(["Name", "Ticket", "Cabin"], axis=1, inplace=True)
#[Sex]の列のmaleを0,womenを1に変換する作業
df_train["Sex"] = df_train["Sex"].replace({"male": 0, "female": 1})
#ダミー変数化する作業(文字列の列を数値(0or1)に変換する)
df_train = pd.get_dummies(df_train)

# 説明変数（予測する元となる変数たち）、目的変数（予測するもの）への分割
#Survived列をtrain_yに代入し、それ以外の列をtrain_xに代入します。
train_y = df_train["Survived"]
train_x = df_train.drop("Survived", axis=1)

# 機械学習アルゴリズムの宣言と学習
clf = xgb.XGBClassifier()#1行目は使用する機械学習アルゴリズムを宣言しただけの状態であり、まだ学習は済んでいない.
clf.fit(train_x, train_y)#2行目で clf.fit(x, y) とすることで clfが学習済み状態（機械学習モデル）になります。学習＝利用

# testの前処理
df_test["Age"] = df_test["Age"].fillna(df_test["Age"].mean())
df_test["Fare"] = df_test["Fare"].fillna(df_test["Fare"].mean())
df_test["Cabin"] = df_test["Cabin"].fillna(df_test["Cabin"].mode()[0])
df_test.drop(["Name", "Ticket", "Cabin"], axis=1, inplace=True)
df_test["Sex"] = df_test["Sex"].replace({"male": 0, "female": 1})
df_test = pd.get_dummies(df_test)
test_x = df_test # testにSurvived列はないのでdrop不要

# 予測
result = clf.predict(test_x)
pd.DataFrame({
    "PassengerId": test_x["PassengerId"],
    "Survived": result
}).to_csv("result.csv", index=False)

# Google Colab でデータダウンロードに必要
from google.colab import files
files.download("result.csv") # 出力なし（ダウンロード画面の起動）
```

#ダミー変数とは？
ダミー変数とは、「あるかなしか」、「ある状態をとるかとらないか」といったような、2つに1つとなる状況を、数値化して「1」か「0」かで表すこと。

###もともと数字ではないデータを数字に変換できる!
https://toukeigaku-jouhou.info/2018/08/14/dummy-variable/

#欠損値の確認方法とは？

```python
df_train = pd.read_csv("train.csv")
df_test = pd.read_csv("test.csv")

print("--train--")
for col in df_train.columns:#colは何でもいい ex) col →　i
    if df_train[col].isnull().any():
        print(col, df_train[col].isnull().any())

print("--test--")
for col in df_test.columns:
    if df_test[col].isnull().any():
        print(col, df_test[col].isnull().any())
#df[col].isnull() で特定の列のすべての値にNaNが含まれているかを判定し、
#df[col].isnull().any() で、その列の内1ヶ所以上にNaNが含まれているかを判定してくれます。
```
```python
#出力結果
--train--
Age True
Cabin True
Embarked True
--test--
Age True
Fare True
Cabin True
df[col].isnu
```
####columnsとは、列名のこと！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/c4ef36cc-c329-86d2-6551-5780f733fdee.png)


#予測精度
##0.75598
曜日を求める関数

# はじめに

jsで曜日を求めたい時、`getDay()`を使うと下記のような整数が返ってきます。

整数|en|ja
---|---|---
0|Sun|日
1|Mon|月
2|Tue|火
3|Wed|水
4|The|木
5|Fri|金
6|Sat|土

いや、Sunとか日とかを取得したいんだけど…という時に使いまわしたい関数を作ってみました。

# ソース

```js:test.js
function getWeekday(date, lang) {

    var list = {
        ja: ["日", "月", "火", "水", "木", "金", "土"],
        en: ["Sun", "Mon", "Tue", "Wed", "The", "Fri", "Sat"]
    }

    //dateチェック
    if (date == undefined || date == "") {
        date = new Date().getDay();
    } else if (date.constructor.name == "Date") {
        date = date.getDay();
    } else if (!Number.isInteger(date)) {
        return "第一引数が不正です。";
    } else if (date < 0 || date > 6) {
        return "第一引数が不正です。";
    } else {
        date = Number(date);
    }

    //langチェック
    if (lang == undefined || lang == "") {
        lang = "ja";
    } else if (lang != "ja" && lang != "en") {
        return "第二引数が不正です。";
    }

    return list[lang][date];

}
```

# 使い方

第一引数(date)
Dateオブジェクト、または0～6の整数を入力します。
省略または空白にすると今の曜日を求めます。

第二引数(lang)
jaまたはenを入力します。
省略または空白にするとja形式で出力されます。

```js:console

//今日の日本語
getWeekday()
"月"
getWeekday("","ja")
"月"

//今日の英語
getWeekday("","en")
"Mon"

//整数2に対応する日本語
getWeekday(2)
"火"
getWeekday("2")
"火"

//特定の日の日本語
getWeekday(new Date("2019-8-15"))
"木"

//エラーパターン

getWeekday("今日は何曜日？")
"第一引数が不正です。"

getWeekday(10)
"第一引数が不正です。"

getWeekday(1.1)
"第一引数が不正です。"

getWeekday("","jp")
"第二引数が不正です。"
```
nodeのバージョン上げたらビルドこけた

nodeのバージョンを上げたらエラーが起こってビルドがコケていたので備忘録。
ターミナルのエラー文見ると下記が表示されていた。

```
Node Sass could not find a binding for your current environment: OS X 64-bit with Node.js 12.x
```

`node-sass`が何やら大切な物を見つけられないでいるみたいです。

```
This usually happens because your environment has changed since running `npm install`.
Run `npm rebuild node-sass` to download the binding for your current environment.
```

続けてエラー文を見ていきます。
すると、環境が変わった時に起こる現象らしく、`npm rebuild node-sass`コマンドを打て、と言われています。

```
npm run rebuild
```

解決！
migrateメモ

LarabelでのDB作成時に、migrateというものがあったので、使ってみました。
チームで全く同じDBをつかいたいときなどは、migratefileをそろえておくとまったくおなじDBがつかえます。

##DB作成

```
CREATE DATABASE DB名;
```
##マイグレーション生成

```
php artisan make:migration テーブル名
```

##テーブル作成

```new_hoge_table.php
     public function up()
     {
         Schema::create('テーブル名', function (Blueprint $table) {
             $table->increments('カラム名');//autoincrement主キー
             $table->integer('カラム名')->unsigned();//int型つかえないのでmigrationの場合はinteger
             $table->string('カラム名', 文字数)->default("")->unique();//ユニークの書き方はこんな感じ
             $table->datetime('カラム名')->default(DB::raw('CURRENT_TIMESTAMP'));//デフォルトでINSERTした日付とってくる
             $table->boolean('カラム名')->default(0);//true or false

             // 外部キー
             $table->foreign('外部キー')
             ->references('参照カラム')
             ->on('参照テーブル名');
         });
     }


    public function down()
    {
        Schema::dropIfExists('テーブル名');
    }
```
おまじない
外部キー設定がうまくいかなかったら意味もなくこれつけてみる

$table->engine = 'InnoDB';
※カラムに関してはよくわからないけど、使えない型があるので注意。intとか使えないみたいです。



新規データベースならば、上のupメソッドを修正する

しかし、リリース後のDB定義修正の場合は、直接修正するのではなく、新たにファイルを作成し、修正を記述

```fix_hoge_table.php

    public function up()
    {
        Schema::table('修正テーブル名', function (Blueprint $table) {
            $table->boolean('maintenance_flag')->after('start_date')->default(0)->nullable(false);
            $table->string('maintenance_message',40)->after('maintenance_flag')->nullable(true);
            $table->string('maintenance_message', 255)->change();
         });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('修正したいテーブル', function (Blueprint $table) {
　　　　　　　　//追加したいカラム（修正はかかなくてもいいはず）
            $table->dropColumn('maintenance_flag');
            $table->dropColumn('maintenance_message');
        });
    }
}
```

##マイグレーション実行

```
php artisan migrate
```
###ロールバック

```
php artisan migrate:rollback
```
###リセット

```
php artisan migrate:reset
```
初期データをSeedでセット
シーダー生成のためのartisanコマンドを叩く
php artisan make:seeder テーブル作成したクラス名TableSeeder

```データセット
    public function run()
    {
        //
        DB::table('テーブル名')->insert([
            'id' => 300,
            'room_id' => 100,
            'status' => 1,
            'created' => date('Y-m-d H:i:s'),
            'updated' => date('Y-m-d H:i:s'),
        ],
        [
            'room_id' => 101,
            'status' => 0,
            'created' => date('Y-m-d H:i:s'),
            'updated' => date('Y-m-d H:i:s'),
        ],
    }
```

シーダクラスをコールする為の設定
シーダクラスの定義が完了したら、このシーダクラスをシーディング実行時にコール（呼び出す）できるようにします。

seedsディレクトリにあるもう一つのファイルDatabaseSeeder.phpに以下を記述します。


```laravel/database/seeds/DatabaseSeeder.php
    public function run()
    {
        $this->call([
          作成したテーブルのクラス名TableSeeder::class,
        ]);
    }
```
###シーディング実行

```
php artisan db:seed
```
Hanami で配列のバリデーションをする

Hanami で配列を必須項目にして最小サイズをチェックして、配列内のオブジェクトのバリデーションも追加する方法。

`schema do ... end` と `each` の使い方に迷ったのでメモ。

バリデーションしたい JSON の書式。

```json
{
  "fishes": [
    {"id": 1, "name": "アジ", "locations": ["千葉", "東京"]},
    {"id": 2, "name": "サバ", "locations": ["東京"]},
  ]
}
```

条件
- `.fishes` は配列でサイズが1以上
- `.fishes[].id` は必須で int
- `.fishes[].locations` は配列でサイズが1以上
- `.fishes[].locations` の要素は文字列

```ruby
validations do
  required(:fishes).filled(:array?, min_size?: 1) do
    each do
      schema do
        required(:id).filled(:int?)
        required(:locations).filled(:array?, min_size?: 1) do
          each { str? }
        end
      end
    end
  end
end
```
[PowerShell] ストアド実行とエラーの検知

## したいこと
SQLServerでストアドを実行して、エラーメッセージを取得する
ストアドの実行はできても、ストアド側のエラーメッセージを取得できなくてはまったのでメモ

## 使用するコマンド
|コマンドレット|実行内容|
|:--|--:|
|Invoke-Sqlcmd|SQLを実行|

## フロー
1. 除算の結果をテーブルにinsertするストアドを作成
2. 0除算エラーを起こすようにパラメータに0をセットしてPowerShellを実行

**ストアドサンプル**

```
CREATE PROCEDURE [dbo].[usp_test]
(
	@val			int,
	@err_no			int = 0 OUTPUT,
	@err_msg		varchar(500)= NULL OUTPUT
)
AS
SET NOCOUNT ON

BEGIN TRY
	INSERT INTO tbl_test
	VALUES(1/@val)
END TRY

BEGIN CATCH
	SET @err_no = ERROR_NUMBER()
	SET @err_msg = ERROR_MESSAGE() 
	RETURN 
END CATCH

SET @err_no = 0
SET @err_msg = NULL
```

**psサンプル**

```powershell

#Server
$strServer = $env:COMPUTERNAME
#DB
$strDB = 'TEST'
#パラメータ
$val = 0
#SQL
$strSQL = @"
DECLARE	@return_value int,
        @val int,
        @err_no int,
        @err_msg varchar(500)

EXEC	@return_value = [dbo].[usp_test]
        @val = 0,
        @err_no = @err_no OUTPUT,
        @err_msg = @err_msg OUTPUT

SELECT	'Return Value' = @return_value, 
        'ErrorMessage' = @err_msg        ← ここでエラーメッセージが出るようにしておく
"@

$ret = Invoke-Sqlcmd -ServerInstance $strServer -Database $strDB -Query $strSQL

if($ret.'Return Value' -ne 0){
        Write-Host "ストアドプロシージャ 実行エラー "$ret.ErrorMessage　　#ここができなくてハマった
        $retcode = 8
    }else{
        Write-Host "ストアドプロシージャ 実行OK" 
        $retcode = 8  
}
```
EC-CUBE4のトップページを編集する方法

#はじめに
この記事はとりあえずEC-CUBE4をインストールしてみたけど初めてで仕様がよくわからないという人向けに作りました。

#コンテンツ管理
__コンテンツ管理__というところを見てみると色々ありますが、まず__レイアウト管理, ページ管理, ブロック管理__を見てみましょう

#レイアウト管理
レイアウト管理を見てみると「トップページ用レイアウト」と「下層ページ用レイアウト」に別れていることがわかります。要するにトップページはここから色々とレイアウトを編集したりすることができ、それ以外のページはヘッダーとフッターが設定されている以外はシンプルな構成になっています。<br>
ここではトップページのレイアウトを見ていきましょう

|管理画面|公開ページ|
|---|---|
|<img width="401" alt="toppage.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405326/3d7ae8b5-ca02-d1d2-e951-3f1d89389fbb.png">|![block.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405326/749e971f-063b-de75-1cdb-2887106db548.jpeg)|


上の図のようにブロックが対応しています。そのため、赤く囲まれている部分を編集するときには__ブロック管理__から、トップ画像を変更したいときには__ページ管理>TOPページ__から編集しましょう。

#ロゴブロックの編集
ロゴブロックには店の名前が書かれています。そこで__ブロック管理__からロゴブロックを編集しようとすると17行目に
```
{{ BaseInfo.shop_name }}
```
という変数があります。これは__設定>店舗設定>基本設定__のページにある__店名(必須)__から引用されているので、ここを書き換えましょう。

cf. __"{{ BaseInfo.campany_name }}"__という変数を使うと__設定>店舗設定>基本設定__のページにある__会社名__から引用されます。

#トップページの画像変更
メインビジュアルの変更については以下のサイトを参考になります。
https://qiita.com/JunjiUmemoto/items/e10aa918bd0952bc0caa
Swift の Optional と Kotlin の Nullable

業務の中で iOS と Android のPRの両方をレビューしていて、**Swift** と **Kotlin** とで Type safe な書き方の呼び方が違うよねって話題に上がったので忘備録的な感じで書いています。


# 呼び方の違い
## Swift
**Optional**

```swift
var name: String?
または
var name: Optional<String>
```
[Apple Developer Documentation - Optional](https://developer.apple.com/documentation/swift/optional)

## Kotlin
**Nullable**
 (Java の Optional とは別物)

```kotlin
var name: String?
```


# Type safe な書き方の違い
**iOS Developper** なので **Swift** ベースで書いています。
**Swift** での呼び方、書き方はこうだけど、 **Kotlin** ではこう書くよ的な。


## Optional Binding (Swift)
```swift
var name: String?
if let aName = name {
  print(aName.uppercased())
} else {
  print("`name` is nil.")
}
```
[THE SWIFT PROGRAMMING LANGUAGE / The Basics - Optional Binding](https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html#ID333)

### Kotlin の場合

呼び方: **Checking for null in conditions**
(Kotlin に詳しい人はなんて呼んでいるんでしょうね・・・）

```kotlin
var name: String?
if (name != null) {
  print(name.toUpperCase())
} else {
  print("`name` is null.")
}
```
[KOTLIN PROGRAMMING LANGUAGE / Null Safety - Checking for null in conditions](https://kotlinlang.org/docs/reference/null-safety.html#checking-for-null-in-conditions)

## Optional Chaining (Swift)
```swift
var name: String?
let count = name?.count
print(count)
```
[THE SWIFT PROGRAMMING LANGUAGE / Optional Chaining](https://docs.swift.org/swift-book/LanguageGuide/OptionalChaining.html)

### Kotlin の場合

呼び方: **Safe Calls**

```kotlin
var name: String?
val length = name?.length
print(length)
```
[KOTLIN PROGRAMMING LANGUAGE / Null Safety - Safe Calls](https://kotlinlang.org/docs/reference/null-safety.html#safe-calls)



## Forced Unwrapping (Swift)
```swift
var name: String?
let count = name!.count
print(count)
```
[THE SWIFT PROGRAMMING LANGUAGE / The Basics - If Statements and Forced Unwrapping](https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html#ID332)

### Kotlin の場合

呼び方: **!! Operator** (Non-null Operator)
※人によっては呼び方が変わってくるかもです

```kotlin
var name: String?
val length = name!!.length
print(length)
```
[KOTLIN PROGRAMMING LANGUAGE / Null Safety - The !! Operator](https://kotlinlang.org/docs/reference/null-safety.html#the--operator)



## Nil-Coalescing Operator (Swift)
```swift
var name: String?
let aName = name ?? "Swift"
print(aName)
```
[THE SWIFT PROGRAMMING LANGUAGE / Basic Operators - Nil-Coalescing Operator](https://docs.swift.org/swift-book/LanguageGuide/BasicOperators.html#ID72)

### Kotlin の場合

呼び方: **Elvis Operator**

```kotlin
var name: String?
val aName = name ?: "Kotlin"
print(aName)
```
[KOTLIN PROGRAMMING LANGUAGE / Null Safety - Elvis Operator](https://kotlinlang.org/docs/reference/null-safety.html#elvis-operator)
DBeaverの接続情報ファイルの場所が分かった（DBeaver 6.1.4）


## 記事を書いた時点での各種バージョン

- DBeaver 6.1.4

## 詳しい情報はこちら

- [Github DBeaver - Admin Manage Connections](https://github.com/dbeaver/dbeaver/wiki/Admin-Manage-Connections)
- 注意点
    - Ver 6.1.3より前に作った接続情報の場合はxmlファイルになる
    - Ver 6.1.3+の場合はjson

## 接続情報が置いてある場所

- Windows10
    - Ver 6.1.3より前
        - `C:\Users\{$USERNAME}\AppData\Roaming\DBeaverData\workspace6\{$プロジェクト名}\.dbeaver-data-sources.xml`
    - Ver 6.1.3以上
        - `C:\Users\${USERNAME}\AppData\Roaming\DBeaverData\workspace6\{$プロジェクト名}\.dbeaver\data-sources.json`
- Mac
    - ?
Wrap deformer のメモ

## 背景

Maya Wrap deformer と似たようなものを作りたい.

## 参考文献

Basics of Computer Animation Skinning/Enveloping 
https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-837-computer-graphics-fall-2012/lecture-notes/MIT6_837F12_Lec06.pdf

cvwrap: OpenCL でのカスタム wrap deformer 実装.
https://github.com/chadmv/cvwrap

Blender にも wrap deformer があるようなので, Blender のソースコードも参考になりそうです.

### その他

https://graphics.pixar.com/library/WrapperSIGGRAPH2019/paper.pdf
Mesh Wrap based on Affine-Invariant Coordinates
【Google Cloud】Google App Engine 試してみよう

# Google App Engine（GAE）
- Googleのインフラストラクチャがアプリの実行環境を提供してくれるサーバレスサービス
- アプリケーションの実行環境の運用について考慮する必要がない（制約あり）
- マシンスペック、オートスケールに必要な CPU使用率の閾値を指定
- 実行環境
    - Standdard Environment（SE）
        - 運用コストが低い
    - Flexible Environment（FE）
        - SEに比べてスケールやデプロイの速度が低下する
        - SEよりも対応言語が拡張されている
        - SEよりも制約がすくない

    ||Standard Environment|Flexible Environment|
|:---|:---|:---|
|インスタンスの起動時間|ミリ秒単位|分単位|
|リクエストの最大タイムアウト|40秒|60分|
|SSHデバッグ|×|○|
|ローカルディスクへの書き込み|×|○|
|バックグラウンドプロセス|×|○|

Cloud SDKをインストールしないとできない？
ちょっとこの辺は専門外だからまた今度
[WIP] vim操作の備忘録

# ファイル操作

### 直前に開いていたファイルを開く
```vim:ノーマルモード
:b #
```

### ファイルの履歴を開く
```vim:ノーマルモード
:browse oldfile
:bro ol
```

# 文章編集
### tab 入力
```vim:入力モード
[Ctrl + v]を押した後に[tab]キーを入力する
```

### インデントを合わせてペースト
```vim:ノーマルモード
]p
```

### 単語の両脇のシンボルを削除する
- [tpope/vim-surround](https://github.com/tpope/vim-surround)プラグインをインストールする．

```vim:ノーマルモード
" *を削除する
:ds*

" {}を削除する
:ds{
```

### マークダウンファイルのコメント行を一斉に削除する
```vim:ノーマルモード
"コメント行を一斉削除
:%s/<!-- .*//g

"空行になった行を一斉削除
:g/^ *$/d

"行末の空白を一斉削除
:%s/ *$//g
```
References:

- http://yusu-iwasawa.hatenablog.com/entry/2015/04/22/150138
- https://qiita.com/shingargle/items/047f759f339398ff836d
【備忘録】PythonでSQLite3を使う

# 環境
Windows 10
Python 3.6.8（Anaconda3）

# SQLite3のダウンロード
①[https://www.sqlite.org](https://www.sqlite.org)にアクセス
②「Download」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/4bfa669d-b21e-3253-6c7c-fa23b9579882.png)

③バイナリファイルをダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373977/cc7bcc90-3df5-231f-6a59-c019004f5bb5.png)

④展開したフォルダ内のファイルをAnacondaのパス（※）が通っているフォルダにコピーし、ターミナルから`sqlite3`コマンドで呼び出せるようにする
※ C:\Users\{ユーザー名}\Anaconda3\Scripts など



# SQLite3の使い方
#### 概要
`sqlite3`をインポートしたうえで、`conn = sqlite3.connect('DB名')`でデータベースと接続し、`curs = conn.cursor()`でカーソルオブジェクトを生成し、`curs.execute('SQL文')`でSQL文を実行し、`conn.commit()`でコミット（実行を確定）する。
最後に、`curs.close()`と`conn.close()`でカーソルとDB接続を終了する。


#### コード例
```python
import sqlite3

# インメモリーにしたい場合は':memory:'を引数に渡す
conn = sqlite3.connect('test.db')

# カーソル（こいつにどうして欲しいか指示をしていく）
curs = conn.cursor()

# テーブル作成を指示する（コミットしないとDBに登録されないので要注意）
curs.execute(
    'CREATE TABLE persons(id INTEGER PRIMARY KEY AUTOINCREMENT, name String)'
)
conn.commit()

# テーブルに値を挿入する
curs.execute(
    'INSERT INTO persons(name) values("Taro")'
)
conn.commit()

# 値を更新する
curs.execute('UPDATE persons SET name = "Jiro" WHERE name = "Taro"')
conn.commit()

# 検索してコンソールに表示する
curs.execute(
    'SELECT * FROM persons;'
)
print(curs.fetchall())

# カーソルとDB接続を終了する
curs.close()
conn.close()
```



# 更新
2019年9月25日追記：テーブルAの名前の値をテーブルBの名前の値に更新するSQLとEXISTSの使いどころ
>[SQLiteのUPDATE文を教えてください。](https://oshiete.goo.ne.jp/qa/8374341.html)
>[SQL select文のinとexistsの違いがわかっていなかった問題](https://qiita.com/darkimpact0626/items/5a5d03c27ae7c849566f)

```
UPDATE tableA SET tableA.name = (
    SELECT tableB.name FROM tableB WHERE tableA.id = tableB.id
    ) WHERE EXISTS (
    SELECT tableB.name FROM tableB WHERE tableA.id = tableB.id
    )
```
Ajax通信を行う際のparamsのキーの設定について

Ajax通信を行う際のparamsのキーは、jQueryの方ではどのように設定しているのかが理解できたので、アウトプットします。

今回は、インクリメンタルサーチの実装におけるAjax通信のコードとコントローラのコードの一部のみを書きます。


Ajax通信のコード

```search.js 

$(function() {
  $(".search__products").on("keyup", function() {
    var input = $(".search__products").val();

    $.ajax({
      type: 'GET',
      url: '/products/search',
      data: { keyword: input },
      dataType: 'json'
    })
  });
});
```

3行目で、検索窓に入力された文字列のデータが、inputという変数に代入される。
8行目で、inputの変数をコントローラのparamsとして送るためのキーを設定する必要がある。このキーの名前は、コントローラのキーの名前と一致させる必要はある。その理由は、一致させなければ、paramsのキーが食い違ってしまい、Ajax通信ができなくなってしまうからである。

今回は、コントローラの方であらかじめ設定した以下のparamsのキーをAjax通信のdataという引数に渡しす。

```products_controller.rb
params[:keyword]
```

コントローラのコード

```products_controller.rb
def search
   @products = Product.where('title LIKE(?)', "%#{params[:keyword]}%")
   respond_to do |format|
     format.html
     format.json
   end
 end
```

2行目で、Ajax通信で送られてきたdataのキーが、コントローラのキーと一致するため、フロント側とコントローラ間のAjax通信が成功するようになる。
そして、その後paramsのキーに一致した複数のデータが@ productsに代入され、jsonの方に処理が行われる。
mbasicでマイコン宇宙講座

ESP8266 CP/M上で動作するmbasic(BASIC-80)で中学生時代に地元の今は無き青山堂で買った「マイコン宇宙講座」の最初のプログラム(JST<->MJD変換)を試してみました。買った当時はちゃんと試していなかったような気がします。

「マイコン宇宙講座」は1980年に廣済堂から出版された書籍でPC-8001などを対象にしていました。

![写真（2019-08-19 13.11）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/34f13b63-692d-fa2c-0858-c097377722cd.jpeg)

コードはそのまま載せるのはまずいと思うので載せませんが、Macなどのエディタで書いて、ターミナルからコピペするのが良いです。やり直したいときはnewで消えます。

130行目で使われている、WIDTH命令はmbasicでは引数は1つです。これ以外はそのままいけました。倍精度のサポート(#)もあるようです。PC-8001のN-BASICはmbasicがオリジナルなので、当たり前っていえばそうなのですが。

```
f>b:mbasic
BASIC-80 Rev. 5.21
[CP/M Version]
Copyright 1977-1981 (C) by Microsoft
Created: 28-Jul-81
32568 Bytes free
Ok
100 DIM T(12)
省略
2600 RETURN
run
DATE AND TIME(JST) ? -47120101,2100


 INPUT DATE=-4712  1  1.5 UT
       MJD =-2400000.5 UT


RETURN DATE=-4712  1  1.5 UT
       MJD =-2400000.5 UT
```

何十年ぶりかでBASICのリストを打ち込みましたが、エラーにならない打ち間違いのデバッグが大変でした。

当時はBASICしかなかったのでしかたないですが、このような実装をするにはBASICは分かりにくいです。今であれば他の言語で書くのが良い気がしました。

この本が出るまでは、宇宙の計算なんて、大きなコンピュータじゃなきゃ無理と思われていたのを、一般のパソコンでできるようにして解説した功績は非常に大きいと思います。また読み物としても大変よく書かれていると思います。

mbasicで小文字のファイル名で保存できますが、CP/Mで扱えないので、注意してください。もし小文字のファイルを作ってしまった時にはmbasicのkillで削除できます。
Cloud FunctionsをCrontabで定期実行する方法

## Cloud Functionsを定期実行したい

5分おきや1時間おき、1日おきなどでCloud Functionsの関数を実行したい場合は、`functions.pubsub.schedule().onRun()`を使用して実行します。

FirebaseのプランをBlazeに変更しないと使用することができないので注意しましょう。

## 書き方

5分おきに関数を実行したい場合は、下記のように記述します。タイムゾーンは指定しなければロサンゼルスの時刻が使用されます。

```javascript
exports.scheduledFunctionCrontab = functions.pubsub.schedule('*/5 * * * *')
  .timeZone('America/New_York') // Users can choose timezone - default is America/Los_Angeles
  .onRun((context) => {
  console.log('This will be run every day at 11:05 AM Eastern!');
});
```

### 頻度の指定方法

`functions.pubsub.schedule('* * * * *')`のような書き方は、Crontabの構文で頻度を指定する方法です。

1つ1つのアスタリスクは、左から「分」「時」「日」「月」「曜日」となっています。

### 1時間おきに実行したい

1時間おきに実行したい場合は、毎時0分に実行すればOKです。書き方は下記のようになります。

```
functions.pubsub.schedule('0 * * * *')
```

### 3時間おきに実行したい

3時間おきに実行したい場合は、下記のように記述します。

```
functions.pubsub.schedule('0 */3 * * *')
```

### 1日おきに実行したい

1日おきに実行したい場合は、下記のように記述します。

```
functions.pubsub.schedule('0 0 * * *')
```

上記の書き方だと、毎日0:00に実行されます。時刻をずらしたい場合は、0の代わりに指定したい時刻を記述すれば大丈夫です。




## 参考
[Firebase - 関数のスケジュール設定](https://firebase.google.com/docs/functions/schedule-functions?hl=ja)
[crontabコマンドについてまとめました 【Linuxコマンド集】](https://eng-entrance.com/linux-command-crontab#-ecron)
Elixirでmixコマンドでライブラリを追加する【npm install/pip installをやりたい】

## はじめに
Elixirはmixコマンドを使用したエコシステムが充実しているのですが、Pythonの`pip install`やnodejsの`npm install`みたいにCLIからプロジェクトにライブラリを追加することができません。

mix.exsをエディタで編集すれば良いのですが、iex内で新たなライブラリを試したい場合などに、ライブラリのバージョンを記述する必要があり、お手軽感が薄れてしまいます。

mix.exsの中で、ライブラリの依存関係を記述するdepsセクションは単なるjsonやyamlではなく、リストを返す関数なので、シェルスクリプトなどでのパースや編集が難しい特徴があります。

## mix_deps_add

そこで今回は、CLIでライブラリ追加が可能になるmixのプラグイン[mix_deps_add](https://github.com/bryanstearns/mix_deps_add)をご紹介します。


## インストール
```
mix archive.install https://github.com/bryanstearns/mix_deps_add/releases/download/0.1.3/mix_deps_add-0.1.3.ez
```


## 使い方

以下は、poisonとmojiexをプロジェクトに追加する例になります。

```
mix deps.add poison mojiex
```

`mix deps.get`をお忘れなく！


### 注意点

以下のような問題点があるので、ライブラリを試用する場合にとどめるのが良いと思います。

- 最新バージョンのライブラリしか読み込まれない。
- `mix.exs`の`deps`に書いたコメント欄が保持されない。
- `git:`の依存関係が使用できない


## あとがき

9月7日に小倉場で正式なExixir Conferenceである、[「ElixirConfJP 2019 小倉城 be simple, fast & reliable」](https://fukuokaex.connpass.com/event/138846/)が開催されます！ 
　スポンサー枠、来賓枠で公募の枠が少ないのですが、まだ空きがありますので、ご興味がある方はお早めにいかがでしょうか。
fukuoka.exのメンバーも万全の応援体制で挑みます。
Material UI の Shadow を完全にオフる方法（React）

# はじめに
Button をオーバーライドして

```
shadow = 'none'
```
にしておけば、オフにできるかなと思ったけど
押下した時に現れる影は消せていないことが判明したので、ちょこっと付け加えることにした

### 押下前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445967/3919d5a5-a404-8332-838c-0aaee087d016.png)

### 押下時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445967/181b313a-3b2c-6634-fa7d-7255d0572a84.png)

# 解決
これだけ
none の付け方に注目

```jsx

import {createMuiTheme, makeStyles} from '@material-ui/core/styles';
import {MuiThemeProvider} from "@material-ui/core";

const theme = createMuiTheme({
  shadows: ["none"]
});

const Index = () => {
  return(
    <MuiThemeProvider theme={theme}>
      <Button variant={valiant} className={classes.button}>
        ボタンだよん    
      </Button>
    </MuiThemeProvider>
  )
}
```

# 最後に
「この画面では、俺はリプルエフェクトだけが欲しいんだ！！！影はいらん！！」
という方は試してみてくださいな
Rails / Bootstrap 4

# 概要
Rails で Bootstrap 4 を利用するための初期設定

# 動作環境
- Rails 5.2.3
- ruby 2.5.5

# 表記の注意事項
```
「$」 記号は ターミナルにおける /bin/bash のコマンドプロンプトを表します

「+ 」 (プラスとスペース1字)は、ファイル編集において、追記した行を表します
「- 」 (マイナスとスペース1字)は、ファイル編集において、削除した行を表します
```

# 導入手順
## Gem
```:Gemfile
+ gem 'bootstrap', '~> 4.3.1'
+ # Bootstrap JavaScript depends on jQuery. If you're using Rails 5.1+, add the jquery-rails gem to your Gemfile
+ gem 'jquery-rails'
```

```
$ bundle install
```

## SCSSマニフェストファイル
### CSSマニフェストファイルを SCSSマニフェストファイルに変更
```
$ git mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss
```

### SCSSマニフェストファイル設定
```scss:app/assets/stylesheets/application.scss
-  *= require_tree .
-  *= require_self

   */
+ // Custom bootstrap variables must be set or imported *before* bootstrap.
+ @import "bootstrap";
```

### JSマニフェストファイル設定
```js:app/assets/javascripts/application.js
  //= require turbolinks
+ //= require jquery3
+ //= require popper
+ //= require bootstrap-sprockets
  //= require_tree .
```

# 参考
- [bootstrap-rubygem@github.com](https://github.com/twbs/bootstrap-rubygem)
WScriptで色々取得してみる

WScriptで色々な情報を取得して処理に使いたいことはよくある。どんな情報を取得できるか、試してみた。

```js:test.js
var shell, network, special_folders, i;

network = new ActiveXObject("WScript.Network");
shell = new ActiveXObject("WScript.Shell");
special_folders = [
    "AllUsersDesktop",
    "AllUsersStartMenu",
    "AllUsersPrograms",
    "AllUsersStartup",
    "Desktop",
    "AppData",
    "PrintHood",
    "Templates",
    "Fonts",
    "NetHood",
    "Desktop",
    "StartMenu",
    "SendTo",
    "Recent",
    "Startup",
    "Favorites",
    "MyDocuments",
    "Programs"
];

WScript.echo("【ComputerName】");
WScript.echo(network.ComputerName);
WScript.echo();

WScript.echo("【UserDomain】");
WScript.echo(network.UserDomain);
WScript.echo();

WScript.echo("【UserName】");
WScript.echo(network.UserName);
WScript.echo();

WScript.echo("【CurrentDirectory】");
WScript.echo(shell.CurrentDirectory);
WScript.echo();

WScript.echo("～以下特殊フォルダ～");
WScript.echo();

for (i = 0; i < special_folders.length; i = i + 1) {
    WScript.echo("【" + special_folders[i] + "】");
    WScript.echo(shell.SpecialFolders(special_folders[i]));
    WScript.echo();
};
```

実行結果

```shell:cmd
C:\>cscript test.js
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

【ComputerName】
XXXX

【UserDomain】
YYYY

【UserName】
ZZZZ

【CurrentDirectory】
C:\

～以下特殊フォルダ～

【AllUsersDesktop】
C:\Users\Public\Desktop

【AllUsersStartMenu】
C:\ProgramData\Microsoft\Windows\Start Menu

【AllUsersPrograms】
C:\ProgramData\Microsoft\Windows\Start Menu\Programs

【AllUsersStartup】
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

【Desktop】
C:\Users\xxxx\Desktop

【AppData】
C:\Users\xxxx\AppData\Roaming

【PrintHood】
C:\Users\xxxx\AppData\Roaming\Microsoft\Windows\Printer Shortcuts

【Templates】
C:\Users\xxxx\AppData\Roaming\Microsoft\Windows\Templates

【Fonts】
C:\Windows\Fonts

【NetHood】
C:\Users\xxxx\AppData\Roaming\Microsoft\Windows\Network Shortcuts

【Desktop】
C:\Users\xxxx\Desktop

【StartMenu】
C:\Users\xxxx\AppData\Roaming\Microsoft\Windows\Start Menu

【SendTo】
C:\Users\xxxx\AppData\Roaming\Microsoft\Windows\SendTo

【Recent】
C:\Users\xxxx\AppData\Roaming\Microsoft\Windows\Recent

【Startup】
C:\Users\xxxx\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

【Favorites】
C:\Users\xxxx\Favorites

【MyDocuments】
C:\Users\xxxx\Documents

【Programs】
C:\Users\xxxx\AppData\Roaming\Microsoft\Windows\Start Menu\Programs


C:\>
```
結構色々取得できそう。因みに今回は実験しませんが、環境変数や、レジストリにもアクセスできるようです。
slackの色味を変える方法（サイドバーのテーマ変更）

slackのアプリのテーマを変更する方法です。

「チーム名」クリック→「環境設定」→「サイドバー」
でサイドバーの設定が開きます。

<img width="644" alt="スクリーンショット 2019-08-19 12.19.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/be2a4ace-c464-98fd-9dbc-4bedb55a4337.png">

下のテーマで複数パターン用意されています。

<img width="650" alt="スクリーンショット 2019-08-19 12.19.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/b16570b4-b810-afd7-2002-d95558e96b40.png">

そしてカスタムテーマで各要素のカラーコードを指定して自分でテーマを作成することもできます。
また、以下のようにカラーコードをメッセージとして貼り付けるだけで
メンバーに設定を共有することができます。
「サイドバーのテーマを変更する」をクリックするだけでシームレスに設定を変更できます。

<img width="716" alt="スクリーンショット 2019-08-19 12.26.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/778dab77-d724-98fa-7fdd-e6e41af5efed.png">

~~~
#373D48,#303641,#5294E2,#FFFFFF,#4A5664,#FFFFFF,#5294E2,#5294E2
~~~

教えてもらったおすすめのテーマはこちら
ぜひ使ってみてください。


なお、テーマ変更はデスクトップ版のアプリにもスマホ版のアプリにも適用されます。
JetsonNanoでUSBのWifiを設定するメモ

####使うUSBのWifiドングル
GW-USMicroN

####USBにWifiドングルを入れて、デバイスとして認識されているか
lsusb
　　　　　：
　⇒Bus 001 Device 003: ID 2019:ed14 PLANEX GW-USMicroN
　　　　　：

####設定確認
lsmod
　⇒rt2800usbが表示されない

####設定
sudo modprobe rt2800usb
sudo -s
 # echo 2019 ed14 > /sys/bus/usb/drivers/rt2800usb/new_id
 # exit

####wifi ssidの確認
sudo nmcli device wifi list

####wifiの設定
sudo nmcli device wifi connect <ssid_name> password <password>
CircleCIで存在しないはずの古いブランチを削除する

# TL;DR

- 存在しないはず（既にマージされたとか削除済み）の、ブランチを削除
- なんか、ブランチに残ってて気持ち悪い

# 対象読者

CircleCI 2.0以上

# 消したはずのブランチが何故か残っている
![screenshot 2019-08-19 11.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183059/881a752d-e76f-0e86-d73b-93989023731d.png)

# コマンドで確認しても存在しない

```bash
git branch --remote # (-r でも可)

# origin/issues/#568-spa-container
# origin/master
# origin/production
# origin/staging
```

# 削除手順
リモートにもローカルにもないリポジトリなのだし、深く悩まず削除:santa:

# 心当たり
多分、ビルドの途中で消したとか？（記憶にないけど）

# 削除の手順

1. もう一度、同じ名前のブランチを作成
2. CicleCIのjobが走るはずなのでjobをキャンセルする(キャンセルしなくてもいいかもしれない)
3. 対象ブランチを削除
4. 完了

はー すっきり:santa:

# 参考
https://discuss.circleci.com/t/how-can-i-remove-an-old-branch/1323/15
.Net 多重配列から特定の要素を取り出す方法

MSのAzureよりAI Cognitive Service APIを利用して、「Detect Face」サービスを使用しています。
リクエストには成功して、返却値として下記の配列が返されました。

FaceImage[1] 
{
  FaceImage 
  {
    Age=34,
    Gender="Male",
    Position=
    [{
      X=56,Y=169,Width=225,Height=225
    }] 
  }
}

この時、例えばAgeの34だけ取り出して表示したい場合は、どのようにすればよいでしょうか？

試しに変数StrAgeに下記のように代入してみましたが、うまくいきませんでした。
StrAge = Str.Substring(Str.IndexOf("Age=")+"Age=".Length)).Split(","c)(0)

よろしくお願い致します。
AtCoder Beginner Contest 138 D - Ki のテストケースがコンテスト後に増えている件について (修正版)

# AtCoder Beginner Contest 138 D - Ki のテストケースがコンテスト後に増えている件について (修正版)

AtCoder Beginner Contest 138 の終了後も D 問題を解説を見て試行錯誤していたら、AC だったコードが WA になって、after_contest_15, after_contest_16, after_contest_17 が増えていることに気づいた. 解説 PDF にも修正が入っていた.

どうやらテストケースが追加される前は i < j の時に 頂点<sub>i</sub> は 頂点<sub>j</sub> より根に近いという決めつけをしていても通るテストケースになっていたと思われます. 追加されたテストケースはこの決めつけをしていると通らないように思われます. (だから解説 PDF に「根に近い頂点から順に行えば」という追記が入ったと思われる).

なので、追加されたテストケースと同様のテストが出来る入力としては、以下のような 2 と 3 が引っくり返った木で行えそうである.

```
　　①
　／　＼
④　　　③
　　　／
　　②
```

入力例は以下となる.

```
4 3
1 4
1 3
2 3
2 10
1 100
3 1
```

出力例は以下となる.

```
100 111 101 100
```

このテストケースで、追加テストが通らないものは WA になり、追加テストが通るものは AC になるのを確認した.
Vue基礎：フィルター

Vueでは日付フォーマットするなどの処理を「|」で簡単に記載できるのはフィルター機能です。
一般的なテキストフォーマットを適用するために使用できるフィルタを定義できます。
フィルタは、mustache 展開と v-bind 式　2 つの場所とも使用できます

#フィルターの定義方法
###1. コンポーネント内（ローカル）
コンポーネント内で定義する。
例：

```javascript
filters: {
  formatDate: function (date) {
    if (!date) {
      return ''
    }
    moment.locale("ja");
    var d = moment.tz(date, "YYYYMMDDHHmm", "Asia/Tokyo");
    return d.format("M/D(ddd) HH:mm");
  }
}

```

###2. 共通（グローバル）
main.jsの中で定義するなど
例：

```javascript
Vue.filter('formatDate', function(date){
  if (!date) {
    return ''
  }
  moment.locale("ja");
  var d = moment.tz(date, "YYYYMMDDHHmm", "Asia/Tokyo");
  return d.format("M/D(ddd) HH:mm");
}

```

#使用例
###1. mustache 展開
```mustache
{{ date| formatDate }}
```

###2. v-bind 式

```vuejs
<div v-bind:label="date | formatDate"></div>
```

#複数のフィルター
Shellのように連続フィルターをしたい場合は、下記のように複数のメソッドを設定できます。

```mustache
{{ message | filterA | filterB }}
```

#メソッドの呼び出し
メソッドは複数パラメータの場合はメソッド名ではなく、メソッドを呼び出す記載もOKです。

```mustache
{{ message | filterA('arg1', arg2) }}
```

filterAは３つのパラメータがあるメソッドです。
例：

```javascript
function filterA(message, param2, param3) {
  return  message + param2 + param3
}
```


参考URL：https://jp.vuejs.org/v2/guide/filters.html

以上
【Laravel】migrationで複合主キーのうち1つをincrementsに指定したい

`id`をオートインクリメント
`id`、`user_id`、`type`を複合主キーに設定したい。

```php

class CreateFoosTable extends Migration
{
    public function up()
    {
        Schema::create('foos', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id');
            $table->tinyInteger('type');
            $table->text('text');
            $table->timestamps();

            $table->primary(['id', 'user_id', 'type']);
        });
    }
}

```

マイグレーションを実行しようとするとエラーが出る

```
Syntax error or access violation: 1068 Multiple primary key defined
```

すでにプライマリーキーがすでに設定されているというエラー

`$table->increments('id');`で主キーを設定して
`$table->primary(['id', 'user_id', 'type']);`で再度複合主キーを設定しようとしている？

そう思ったので、`id`を一度`integer`に設定して主キーを設定した後に`increments`に変更してみた。

```php

class CreateFoosTable extends Migration
{
    public function up()
    {
        Schema::create('foos', function (Blueprint $table) {
            $table->integer('id');
            $table->integer('user_id');
            $table->tinyInteger('type');
            $table->text('text');
            $table->timestamps();

            $table->primary(['id', 'user_id', 'type']);
        });

        Schema::table('foos', function (Blueprint $table) {
            $table->increments('id')->change();
        });
    }
}

```

` requires Doctrine DBAL; install "doctrine/dbal".`
`doctrine/dbal`を追加しろと言われたので追加

https://readouble.com/laravel/5.8/ja/migrations.html
> カラム変更
>動作要件
カラムを変更する前に、composer.jsonファイルでdoctrine/dbalを確実に追加してください。Doctrine DBALライブラリーは現在のカラムの状態を決め、指定されたカラムに対する修正を行うSQLクエリを生成するために、使用しています。

```
$composer require doctrine/dbal
```


できた。
プログラミング初心者の備忘録ーヘッダーフッダー編

# はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているMaomao Maoです。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

今回は、ヘッダー・フッダーについてまとめようと思います。

## ヘッダー・フッダー
まず、レイアウトは__div__要素によって構成していきます。
下記は、ヘッダーはheader、メインはmain、フッターはfooterと言うClass名を使っています。

```
ヘッダー
<div class="header">
</div>
メイン
<div class="main">
</div>
フッター
<div class="footer">
</div>
```
###ヘッダー・フッダーを編集する時に役立つ
・リストのマークをなくす

```
li{
　list-style: none;
}
```

・ヘッダーの中身を横並びにする

```
li{
　float: left;
}
```

・余白を調整する
__padding__を使います。

```
.logo1{
 padding: 20px;
}
```

・余白をある方向だけにする

```
.logo1{
 padding-top: 20px;
 padding-right: 20px;
 padding-bottom: 20px;
 padding-left: 20px;
}
```
・一部の文字の色を変える
__span__を使います。
例えばテキストを赤にしたいという文章の中で、__赤__のところの色だけを変えたい時、

```
HTML
<h1>
テキストを<span>赤</span>にしたい
</h1>

CSS
span{
　color: red;
}
```
・枠線をつける
__border__を使います。

```
.logo{
 border: 5px solid red;
}
```
・下線をつける

```
.logo{
 border-bottom: 5px solid red;
}
```
google Analyticsメモ

# 自分用メモ

| 用語 | 意味 |
|:--------|:--|
| ユーザー | ユニークユーザー(UU)。サイトを訪れた実質の人数。 |  
| セッション |1回の訪問＝1セッション。 |  
| ページビュー | ページが表示された総回数。同一ユーザーがページ遷移するたびに増えていく。 | 
| 直帰率 |1セッションで1ページビューしかない訪問 | 
| 離脱率 |各ページでサイトの閲覧をやめたセッションの割合 |
| 滞在時間 |ユーザーがサイト内で過ごした時間 |
| チャネル |ユーザーがどこから来たかを表す最上位概念 |
| メディア |チャネル概念登場以前から発生するGoogleが訪問経路を自動で3つ(organic / referral / none)に分別する軸 |
| 参照元 |どの外部サイトから訪問して来たのかを表す、メディアの詳細版 |
| ランディングページ |ユーザーが一番最初に流入するページ |
| Organic Search |検索からの訪問 |
| Direct |URL直入力、ブラウザのブックマーク、タグ埋め込みのないメルマガリンクなど |
| Email |メール内のリンクから流入 |
| Referral | 他のサイトからのリンクから流入した訪問 |
| Social | SNSからの流入した訪問 |
| Display | バナー広告をクリックして流入した訪問 |
Elm でカスタム型、レコード型、タプル型から値を取り出す (Elm 0.19)

分割代入 (destructuring assignment) は便利というお話。


## 動機

下記のようなコードを見かけて「オゥ、ナンテコト」と思ったので。

```elm
type Hoge a = Hoge (List a)

getList : Hoge a -> List a
getList hoge =
    case hoge of
        Hoge list ->
            list
```

あと [Elm Syntax](https://elm-lang.org/docs/syntax) や [Elm ガイド](https://guide.elm-lang.jp/) にもちゃんと説明がないようなのでまとめたかった。


## カスタム型から値を取り出す

こんな型があったとさ：

```elm
-- カスタム型による要素2個のオレオレタプル
type MyTuple a b = MyTuple a b
```

### 関数内で値を取り出す

```elm
-- タプルの 1個目の要素を返す
first1 : MyTuple a b -> a
first1 tuple =
    case tuple of
        MyTuple value1 _ ->
            value1
```

先の例もこのパターン。
コンストラクタの数によらず使えるけど、コンストラクタが 1個のときは次の書き方も可能：

```elm
-- タプルの 1個目の要素を返す
first1 : MyTuple a b -> a
first1 tuple =
    let
        (MyTuple value1 _) = tuple
    in
    value1
```


### 引数の時点で値を取り出す (コンストラクタが 1個のときのみ)

```elm
first2 : MyTuple a b -> a
first2 (MyTuple value1 _) =
    value1
```

このやり方だと先の `getList` はこんな感じに：

```elm:getList
getList : Hoge a -> List a
getList (Hoge list) =
    list
```


### 引数の時点で値を取り出す (コンストラクタが 1個でカスタム型が入れ子のとき)

```elm
type Inner a = Inner a

type Outer a = Outer (Inner a)

outerToA : Outer a -> a
outerToA (Outer (Inner value)) =
    value
```

入れ子のときも一括で取り出し可能。


## レコード型から値を取り出す

こんな型があったとさ：

```elm
-- レコード型による要素2個のオレオレタプル
type alias MyTuple_ a b =
    { value1 : a
    , value2 : b
    }
```


### よく見るやつ

```elm
first0 : MyTuple_ a b -> a
first0 tuple =
    tuple.value1
```


### 関数内で値を取り出す

```elm
first1 : MyTuple_ a b -> a
first1 tuple =
    let
        { value1 } = tuple
    in
    value1
```


### 引数の時点で値を取り出す

```elm
first2 : MyTuple_ a b -> a
first2 { value1 } =
    value1
```


### 【NG】引数でレコードの入れ子を展開することはできない

```elm:NG
type alias NestedMyTuple_ a b =
    { tuple : MyTuple_ a b
    }

firstNg1 : NestedRecord a b -> a
firstNg1 { tuple.value1 } =  -- コンパイルエラー
    tuple.value1

firstNg2 : NestedRecord a b -> a
firstNg2 { tuple = { value1 } } =  -- コンパイルエラー
    tuple.value1
```

レコードの入れ子を更新できないのと同じような話なのかも。


## タプル型から値を取り出す

### 関数内で値を取り出す

```elm
first1 : ( a, b ) -> a
first1 tuple =
    let
        (value1, _) = tuple
    in
    value1
```

### 引数の時点で値を取り出す

```elm
first2 : ( a, b ) -> a
first2 ( value1, _ ) =
    value1
```


## おわり

変なところ、足りないところあったらコメントください。


**おしまり**
グローバル変数を扱いやすくする工夫

# はじめに

グローバル変数を沢山作ると結構ややしくなる

```html:test.html
<script>
    var now = new Date(),
        current_full_year = now.getFullYear(),
        current_month = now.getMonth(),
        current_date = now.getDate(),
        current_hours = now.getHours(),
        current_minutes = now.getMinutes(),
        current_seconds = now.getSeconds();
</script>
```

コンソールで確認してみる

```js:console

//今の年は？
current_full_year
2019

//じゃ、今の分は？
durrent_minutes
Uncaught ReferenceError: current_minute is not defined
    at <anonymous>:1:13

//なぬ！！変数名違ったっけ？タイプミスか？…あ、最初の文字はdじゃなくてcだ！
current_minutes
33

//よしよし！そんじゃ気分一新！グローバル変数をまとめて消しちゃおう！！

//…簡単にはできない…

//ならば全てのグローバル変数に格納されている値を一望してみよう

//…簡単にはできない…

//…

```

と、ちょっと扱いにくいことがある。

# 全てのグローバル変数を1つの変数に集約してみる

```html:test2.html
<script>
    var data = {
        now : new Date(),
        current_full_year : now.getFullYear(),
        current_month : now.getMonth(),
        current_date : now.getDate(),
        current_hours : now.getHours(),
        current_minutes : now.getMinutes(),
        current_seconds : now.getSeconds()
    };
</script>
```

コンソールで確認してみる

```js:console

//今の年は時は？
data.current_full_year
2019

//じゃ、今の分は？※今度はスペルミスしたくない
data.
//全てのプロパティが予測変換できるので、入力も楽だし入力ミスもない
data.current_minutes
47

//よしよし。それじゃ全てのグローバル変数に格納されている値を一望してみよう
data
{now: Mon Aug 19 2019 10:47:48 GMT+0900 (日本標準時), current_full_year: 2019, current_month: 7, current_date: 19, current_hours: 10, …}

//試しに全部消してみっか！
data=undefined
undefined

//消えていることを確認
data
undefined

data.current_full_year
VM961:1 Uncaught TypeError: Cannot read property 'current_full_year' of undefined
    at <anonymous>:1:6
```

少し書き方を変えるだけで頭すっきりしました(^^)
GCP Professional Cloud Architect受験メモ

##はじめに
GCP Professional Cloud Architectに合格したので勉強した内容のメモです。
試験は50問で時間は2時間です。私は1時間で終わりました。

##前提
スペック
AWS歴　3年くらい
GCP歴　2週間

##勉強した内容
[プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで](https://www.amazon.co.jp/dp/B0721JNVGT/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)を購入して、一通り触りながら読み進めて理解を深める。
まんべんなくまとまってて良かったです。

[公式模擬試験](https://cloud.google.com/certification/practice-exam/cloud-architect)を実施。
自分のレベルを知るために。AWSの模擬試験と違って無料で答えも最後に表示される。

Linux Academyの[Google Cloud Certified Professional Cloud Architectコース](https://linuxacademy.com/course/google-cloud-certified-professional-cloud-architect/)を受講。
模擬試験をメインで実施。あと、理解が弱そうなサービスのハンズオンを集中して実施。

AWS経験者用のマテリアルで各サービスのイメージをつける
https://cloud.google.com/docs/compare/aws/management?hl=ja

あとは、コンソールを触りつつ、わからない点をマニュアルで調べる

##結論
模擬試験を早めにやって問題のレベルを把握することが大切。
あとは、出題者の気持ちになって回答する。
タブーの小技 パスワードクリップ BAT/VBA/Javascript

#趣旨

職場などで使うと便利だけども
見つかると怒られる技術

そんなこつ言ったって面倒くさいものは面倒くさい
そのパスワードに意味ある？ほんとに？
ということはたびたびありますよね

クリップボードにパスワード入れてしまえばこっちのもんじゃーい！！
というあれこれです。

遊ぶ時間欲しさでやったなどと欲望直結の供述を繰り返しており
当局では精神鑑定も含め動機の解明にあたる方針です 

#Batファイル
一行で実装可能

```bat:秘密の鍵.bat
SET /P DUMMY="paswwwwwwwww"<NUL|clip
```
#IE Javascript
IE専用ですが十分じゃろ

```html:秘密の鍵.html
<html>
<head>
 <title></title>
 <script language="javascript" type="text/javascript">
  function SetClip() {
   window.clipboardData.setData("Text" , "paswwwwwwwww");
  }
 </script>
</head>
<body>
<input type="button" value="クリップボード" onclick="SetClip();"/>
</html>
```

#Excel VBA
Microsoft Forms 2.0 Object Libraryを参照設定します。

※参照設定に存在しない場合は
c:\Windows\System32\FM20.DLLを参照してあげる。

```bas:Module1.bas
Sub SetClip()

Dim clipB As Object
Set clipB = New DataObject

With clipB
  .SetText "paswwwwwwwww"
  .PutInClipboard
End With

End Sub
```

#秀丸エディタ
たまたま秀丸の入ってる環境だったので追記
カっとしてやった、反省はしていない。

```mac:秘密の鍵.mac
setclipboard "paswwwwwwwww";
```

#先達 参考 Special Thanks
検索でひっかかるとは何事だ、大変ありがとうございます

Excel VBA から、クリップボードにテキストをセットする
https://qiita.com/rohinomiya/items/1b719bc90d7497688699

Office TANAKA クリップボードを操作する
http://officetanaka.net/excel/vba/tips/tips20.htm

VBEの参照設定で『Microsoft Forms 2.0 Object Library』が見つからない
http://www.tomodachihiroba.org/2016/01/vbe-microsoft-forms-2-0-object-library/
AtCoder ABC138 C-Alchemistの木構造の作り方

#ABC138 C-Alchemistの問題
>あなたは鍋とN個の具材を持っています。各具材は 価値 と呼ばれる実数の値を持ち、i個目の具材の価値はviです。2個の具材を鍋に入れると、それらは消滅して新たに1個の具材が生成されます。この新たな具材の価値は元の2個の具材の価値をx,yとして(x+y)/2であり、この具材を再び鍋に入れることもできます。この具材の合成をN−1回行うと、最後に1個の具材が残ります。この具材の価値として考えられる最大の値を求めてください。


##解説PDF
コンテスト終了後にはコンテストページから解説PDF（YouTubeで解説動画も）を見ることができます。
そこでは，以下のようなTree構造を考えると説明されていました（ただし，ここでは具材の価値についてA>B>C>D>Eとする）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295752/c5cd5831-aef3-8323-134b-e14e62442b1a.png)

このTreeが表す手順はおよそ以下のようなもの
1.DとEを鍋にいれる。(D/2) + (E/2)の価値の新しい具材が生成される。
2.Cと1.で生成された具材を鍋に入れる。(C/2)+(D/4)+(E/4)の具材が生成される。

...


と繰り返すことで，最終的に残る具材の価値は(A/2)+(B/4)+(C/8)+(D/16)+(E/16)であり，これが取りうる価値の最大値である。
##疑問
なぜ，この手順で価値が最大になるのでしょうか。
解説PDFでは，この手順が価値を最大にすることの説明は簡潔に
>具材の番号を付け替えることで最終結果が向上するため

という程度の記載にとどまっていました（詳細は[解説PDF](https://img.atcoder.jp/abc138/editorial.pdf)を参照してください）。

※読む人が読めばすぐわかる程度には書いてあるのかもしれません
##簡略な説明
先にもあげましたが，
>具材の番号を付け替えることで最終結果が向上する

という記述や，YouTubeにあがっている[解説動画](https://www.youtube.com/watch?v=lWETOlGiuaI)でも触れられていましたが，考え方の方針は，ある手順（つまり，あるTree構造）を考えてそこにノードを付け足すときにどのように付け足すことが最善（価値を最大化する）かを考えれば良いと思います。
そこで，以下のようなTree構造を考えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295752/5769afad-7027-8e83-ca2f-ece45c27d10d.png)
具材が3個のときに考えうるTreeの形はこの一つだけです。まず，このノードが3個のとき，価値が最大となるときを考えましょう。
この形のTreeの最終的な価値は(A/2)+(B/4)+(C/4)です。また，ノードA,B,Cを付け替えることで，最終的な価値を(A/4)+(B/2)+(C/4)，(A/4)+(B/4)+(C/2)とすることもできます。
A>B>Cという条件の下で，この3つのうちどの値が最大でしょうか。
例えば以下のようにしましょう。

$\frac{A}{2}+\frac{B}{4}+\frac{C}{4}$ $\cdots①$
$\frac{A}{4}+\frac{B}{2}+\frac{C}{4}$ $\cdots②$
として，$\frac{①}{②}>1$となる条件を求めます。①，②に代入して計算すると，
$\frac{2A+B+C}{A+2B+C}>1$となり，さらに分母を払って整理すると$A>B$を得ます。

同様の計算により，A>B>Cという条件の下では,価値(A/2)+(B/4)+(C/4)が最大であることがわかります。

このTreeにあらたなノード（具材）Dを付け加えることを考えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295752/9fdd45e5-b19e-e561-0d15-47fb6969fac3.png)　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295752/8a52f6c3-6d5a-6c6f-ddc5-163cbbad8945.png)

その場合に考えられるのはこの2通りのみです(A>B>Cは仮定します)。
1番目のTreeから得られる最終的な具材の価値は(A/4)+(B/4)+(C/4)+(D/4)。
2番目のTreeから得られる最終的な具材の価値は(A/2)+(B/4)+(C/8)+(D/8)。

となることがわかります。ここで，この2つの値を比較してみましょう。
$\frac{A}{2}+\frac{B}{4}+\frac{C}{8}+\frac{D}{8}$ $\cdots①$
$\frac{A}{4}+\frac{B}{4}+\frac{C}{4}+\frac{D}{4}$ $\cdots②$
として，さきほどのノードが3つのときと同様に$dfrac{①}{②}>1$ となる条件を考えます。
すると$A>\frac{C}{2}+\frac{D}{2}$を得ます。
これを$\frac{A}{2}+\frac{A}{2}>\frac{C}{2}+\frac{D}{2}$とみれば，A>Dである限り（A>B>Cは仮定されているので），右側のTreeが表す手順で得られる価値が最大となることがわかります。
もし，**D>Aであれば，A,B,C,Dのうちから価値の大きい3つを選んで，その3つに対してラベルをA,B,Cと付け直せば**同じ議論となります。

ノードがさらに増えても同じように考えることができます。

##まとめ
簡単なパターン（ノードが少ないパターン）から考えて，ノードを付け足すということを考え，その際に価値が最大になる付け足し方はどのようなものかを考える。
また，大小関係によりラベルを付け替えることでうまく説明がつくというのは，実装上は最初にソートしておくことに相当します。
スラック　リマインダー設定方法



◎毎月の日時設定
/remind #00_todo on the 5th【日付】 of every monthat 00:00pm【時間】 to 投稿したい言葉

◎毎週の曜日設定

/remind #00_todo at 11:00 every Thursday【曜日】 to 投稿したい言葉
golangでanacondaを利用してTwitterにつぶやく。

golangでanacondaを利用してTwitterにつぶやくきます。  
今回は別サービスのリンク共有のためのつぶやきなので、[go-bitly](https://github.com/zpnk/go-bitly)で短縮URLを作成してつぶやきに付与します。


```main.go


package main

import (
	"fmt"
	"net/http"
	"os"

	"github.com/ChimeraCoder/anaconda"
	"github.com/pkg/errors"
	bitly "github.com/zpnk/go-bitly"

	"github.com/labstack/echo"
)



func main() {

	api := getTwitterAPI()
	// ハッシュタグを生成
	hashTagStr := "#ハッシュタグ"

	//文章
	sentence := "ツイートしたい文章"

	//url
	url := os.Getenv("YOUR_URL")
	addURL, err := shortURL(url)
	if err != nil {
		fmt.Println(err)
	}

	tweetStr := fmt.Sprintf("%s\r\n%s\r\n↓↓↓共有URL↓↓↓\r\n%s\r\n", hashTagStr, sentence, addURL)

	// post
	twt, err := api.PostTweet(tweetStr, nil)
	if err != nil {
		fmt.Println(err)
	}

	return c.JSON(http.StatusOK, twt)
}


//getTwitterAPI .
func getTwitterAPI() *anaconda.TwitterApi {
	anaconda.SetConsumerKey(os.Getenv("TWITTER_CONSUMER_KEY"))
	anaconda.SetConsumerSecret(os.Getenv("TWITTER_CONSUMER_SECRET"))

	return anaconda.NewTwitterApi(os.Getenv("TWITTER_TOKEN"), os.Getenv("TWITTER_SECRET"))
}

//shortURL .
func shortURL(urlStr string) (string, error) {
	b := bitly.New(os.Getenv("BITLY_TOKEN"))

	link, err := b.Links.Shorten(urlStr)
	if err != nil {
		return urlStr, err
	}
	return link.URL, nil
}

```


非常に簡単。

### 環境変数
環境変数については適宜設定してください。

```
YOUR_URL　：　短縮したいURL  
TWITTER_CONSUMER_KEY　：　TWITTER_CONSUMER_KEY  
TWITTER_CONSUMER_SECRET：　TWITTER_CONSUMER_SECRET  
TWITTER_TOKEN　：　TWITTER_TOKEN  
TWITTER_SECRET　：　TWITTER_SECRET  
BITLY_TOKEN　：　BITLY_TOKEN  
```

TWITTER_TOKENとTWITTER_SECRETはログインしているユーザ次第なので、環境変数ではなくPOSTして取得してあげた方がより汎用的です。
そのほかの環境変数は[bitly](https://bitly.com/a/sign_in)と[developer.twitter.com](https://developer.twitter.com/)から簡単に取得できます。