OmniAICreator/Qiita-1.07M huggingface dataset:
Laradockで構築したMySQLの日本語化けを解決

#はじめに
LaradockでLaravelの環境構築をしました
ところが、マイグレーションを実行しRegisterを実行しDBを確認したところ
日本語が???と文字化けしてしまっていました
色んな記事を参考に試したものの、どれもうまく行かなかったので
備忘録として残しておきます

#初期のDBの設定
まずは初期状態のDBの文字コードの設定は下記でした

```
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```

これをutf8mb4に変更していきます

#my.cnfの編集
`laradock/mysql/my.cnf`を下記に書き換えます

```my.cnf
 # The MySQL  Client configuration file.
 #
 # For explanations see
 # http://dev.mysql.com/doc/mysql/en/server-system-variables.html

 [mysql]

[mysqld]
skip-character-set-client-handshake
character-set-server = utf8mb4
# collation-server = utf8mb4_general_ci
collation-server = utf8mb4_unicode_ci
init-connect = SET NAMES utf8mb4

[client]
default-character-set=utf8mb4
```

#database.phpの編集
`config/database.php`を下記のように変更します

```
        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',    //変更
            'collation' => 'utf8mb4_unicode_ci',    //変更
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ]
```

編集はこれで終了

#buildする
--buildオプションをつけてコンテナを起動します
下記コマンドを実行

````
$ docker-compose up -d --build workspace nginx mysql
````

mysqlコンテンに入り文字コードを確認する

```
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```

utf8mb4に変更することができました

DBの文字化けしていた部分を確認すると、日本語で表示されていることが確認できました
S3バケットのオブジェクトを1000個以上取得する

[公式リファレンス](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#list_objects_v2-instance_method)に記載があるように、[list_objects_v2](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#list_objects_v2-instance_method)は1000個以上のS3オブジェクトを取得する際には面倒なnext_tokenの処理が必要になります。

そこで、1000個以上のS3オブジェクトを扱う際には、[Aws::S3::Bucket#objects](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Bucket.html#objects-instance_method)を使うと、このようにシンプルに書けます。

```ruby:list-objects.rb

require 'aws-sdk'
bucket = Aws::S3::Bucket.new('<バケット名>')
obj_array = bucket.objects.map(&:key)

obj_array.size	# => オブジェクト数
obj_array.first	# => プレフィックス/オブジェクト名

```
OSSフレームワークにおけるバッチ処理(カスタムコマンド、コンソールコマンド)の起動コマンドの比較

# 概要
バッチ処理は様々な用途で必要になるため、OSSフレームワークを利用せずに自作することも多い。

バッチ処理を自作する時の起動コマンドの設計の参考資料として、OSSフレームワークのカスタムコマンド、コンソールコマンドの起動コマンドを比較してみる。


# Javaフレームワーク

## Spring Batch
buildツール(gradle or maven)によってソースコードをビルドしてjarファイル作成済みとする。

#### 起動コマンド

```java
java -jar $jar
```



# Pythonフレームワーク

## Django
Custom Commandsとして紹介されている。
https://docs.djangoproject.com/en/2.1/howto/custom-management-commands/

バッチファイル
batch.py

#### 起動コマンド

```python
cd $django_project_dir
python manage.py batch
```

## Flask
Custom Commandsとして紹介されている。
http://flask.pocoo.org/docs/1.0/cli/

バッチファイル
test.pyの中身

```python
import click
from flask import Flask

app = Flask(__name__)

@app.cli.command('test')
@click.argument('name')
def create_user(name):
    print("Hello World" + ' ' + name)
```

#### 起動コマンド

```python
cd $flask_project_dir
export FLASK_APP=test.py
flask test $arg1
```
*flaskコマンドはpip install flaskでflaskをインストールすると、グローバル領域(/usr/bin/flask)にインストールされる。

## Luigi

バッチファイル
helloworld.py

バッチファイル内でclass HelloWorldを定義しているものとする。

#### 起動コマンド
```python
python helloworld.py HelloWorld
```
もしくは

```python
python -m luigi --module helloworld HelloWorld
```


# PHPフレームワーク
## Symfony2

バッチファイル
BatchCommand.php


#### 実行コマンド
バッチファイルの中で

```php
$this->setName("$batch_name")
```
のようにバッチ実行時の名称を設定した後、下記を実行。


```php5
cd $symfony_installed_dir
php app/console $batch_name
```
*symfony2まではappディレクトリの下にconsoleファイルがあったが、symfony3になるとappディレクトリがbinディレクトリに変更されている。

# Rubyフレームワーク
## Ruby on rails
railsはバッチ処理を実行するパターンが複数用意されている

E.g.1

rakeを利用する場合

バッチファイル


#### 起動コマンド


```ruby
bundle exec rails $set_name_in_rake
```

E.g.2

rails runnerを利用する場合

バッチファイル
$BatchFile.rb

#### 起動コマンド

```ruby
bundle exec rails runner '$BatchFile.new.$method_name'
```


＊railsコマンドをグローバルインストールしてrails ***のみで実行することもできるが、基本的にはbundler execの利用が多いと思う。



# 参考
https://qiita.com/YusukeHigaki/items/cc5729b772ec963de7c2
https://qiita.com/okamu_/items/541ac96a1380b26d95c8
【随時更新】Google Spread Sheet 調べたショートカットキー

# 環境
Mac

# ショートカットキー
|操作|ショートカットキー|参考|
|:--|:--|:--|
|次のシートへ移動|command(⌘) + shift + Fn + ↑|
|前のシートへ移動|command(⌘) + shift + Fn + ↓|
|行頭へ移動|Fn + ←|
|行末へ移動|Fn + →|
|行を選択|Shift + Space|
|値のみ貼り付け|command(⌘) + shift + v|
|行の削除(行を選択している状態)|command(⌘) + option + -|
|行の削除(行を選択していない状態)|ctrl + option + E, E|
Xcode11以降でfastlane matchで証明書を更新してはまったこと

Xcode11でfastlane matchで証明書を更新してから以下のようなエラーがでてビルドできなくなりました。

`Provisioning profile xxxx doesn't include signing certificate yyyy`

## 原因
生成された証明書を確認してみるとCertificate Typeが以前は`iOS Development`だったものが`Development`に変わっていました。
<img width="350" alt="Screen Shot 2020-03-24 at 10.53.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6149/cf927576-16e9-e116-86a5-97bb84afe6d4.png">

違いが何なのか調べてみると、これまでは`iOS Developer`や`iOS Distribution`だったものが、Xcode11以降で`Apple Development`, `Apple Distribution`に変わっていました。（[document](https://help.apple.com/xcode/mac/current/#/dev80c6204ec)）

## 修正方法
Code Signing Identityを`Apple Development`や`Apple Distribution`にしておけばよいです。（automaticの場合はiOS Developer/Distribution`にしていても大丈夫なようでした。直接keychainのcertificateを指定すると今回のようなビルドエラー起こってしまうのでよくないですね）
<img width="504" alt="Screen Shot 2020-03-24 at 11.00.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6149/1999bcd9-8956-8a12-c776-c9baeae23743.png">


## 参考
[fastlane PR 15410](https://github.com/fastlane/fastlane/pull/15410)
VueでFontAwesomeのアイコンを表示する方法（Vue.js）

##はじめに
Vue.jsを用いてポートフォリオサイトを制作するのに、Vue-cliを利用したのですが、コンポーネントでFontAwesomeの呼び出し方法がわからず苦戦しました。
そこでの経験を踏まえて、Twitterアイコン等を表示させるために使うFontAwesomeのVueでの導入方法と記述方法について書いていきます。


##FontAwesomeを導入する
ルートディレクトリに移動する

```shell
> cd my-project 
```

インストールする

```shell
> npm install --save @fortawesome/fontawesome-svg-core
> npm install --save @fortawesome/free-solid-svg-icons
> npm install --save @fortawesome/vue-fontawesome
```
さらに多くのアイコン（twitterアイコンなど）を使いたい場合はこちらも追加でインストールする

```shell
> npm install --save @fortawesome/free-brands-svg-icons
> npm install --save @fortawesome/free-regular-svg-icons
```

インストール完了！


##コーディング方法について
`main.js`に以下のようにコードを追加する

```src/main.js
import Vue from 'vue'
import App from './App.vue'

//ここから
import { library } from '@fortawesome/fontawesome-svg-core'
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
import { fas } from '@fortawesome/free-solid-svg-icons'

//追加でインストールした場合は下の2行も
import { far } from '@fortawesome/free-regular-svg-icons'
import { fab } from '@fortawesome/free-brands-svg-icons'

library.add(fas, far, fab)
Vue.component('font-awesome-icon', FontAwesomeIcon)
//ここまで

Vue.config.productionTip = false

new Vue({
  render: h => h(App)
}).$mount('#app')
```

あとは表示したい場所でアイコンを呼び出すだけです

##アイコンを呼び出す
今回はAboutページでアイコンを呼び出してみます。

```src/views/About.vue
<template>
  <div class="about">
    <h1>This is an about page</h1>

    <!--Solidアイコン-->
    <font-awesome-icon :icon="['fas', 'envelope']"/>
    <!--Solidアイコンの省略記法-->
    <font-awesome-icon icon="envelope" />
    <!--Regularアイコン-->
    <font-awesome-icon :icon="['far', 'envelope']"/>
    <!--Brandsアイコン-->
    <font-awesome-icon :icon="['fab', 'twitter']"/>

  </div>
</template>
```

呼び出しに成功しているか確認します
<img width="956" alt="2020-03-24 (5).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519632/1f9e06e3-2ce4-e943-0d21-4dd9cf1fca91.png">
ちゃんと表示されています！

##まとめ
自分はTwitterアイコンの呼び出しをを省略記法で記述していたためうまく表示されませんでした。Solidアイコンのみ省略記法で呼び出すことができ、そのほかのRegularやBrandsアイコンについてはきちんと記述する必要があるようです。
以上、VueでFontAwesomeのアイコンを表示する方法でした。読みにくい点や異なる点などございましたら、ご指摘お願いします。

##参考
- Font awesome を Vue.js で使ってみよう
https://qiita.com/kurararara/items/d76776a7dc2d763a068b

- Vue CLIでFont AwesomeのTwitterアイコンを追加する方法
https://zarigani-design-office.com/blog/vue-cli-twitter/
VSCode で「Git: remote: HTTP Basic: Access denied」というエラーメッセージが出たときの対処方法

# [VSCode] で「Git: remote: HTTP Basic: Access denied」というエラーメッセージが出たときの対処方法

[VSCode]:https://code.visualstudio.com/
[Git]:https://ja.wikipedia.org/wiki/Git

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107592/cd11ca84-c395-6e06-7090-3519141bd161.png)

[Git]サーバー側のIDのパスワードなどを更新した場合に出る模様。

要するに、Windowsが覚えている「資格情報」を更新すればよいのだが、更新するには、いったん削除するしか手段が無いっぽい。

詳しい情報はこちら↓
資格情報マネージャーにアクセスする
適用対象: Windows 10
https://support.microsoft.com/ja-jp/help/4026814/windows-accessing-credential-manager

## 対処方法

（１）

コントロールパネル＞ユーザーアカウント＞資格情報マネージャー

を開いて、「Windows資格情報」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107592/1fd262e8-38ba-7346-463c-627d8f925017.png)

（２）

汎用資格情報から、該当する（エラーになる） Gitサーバーを選択して「削除」する。

（３）

再度、[VSCode] から、[Git]にアクセス（例えば「変更の同期」とか）をすると、IDとパスの入力を求められる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107592/1139db03-dd81-f62c-8ec7-b2bb5d7c0a21.png)

ここで正しい情報（あたらしいパスワード）を入れればつながるようになる、、、、はず。

以上、わかってしまえば簡単なことなんだけど、なかなかたどり着けないんですよねー。

みなさまのプログラミングライフの助けになれば幸いです。
🐙SourcetreeからGitKrakenに移行しました

## おはようございます🌿
突然ですが久野は今チームでアプリを開発しています．そこではみんなGitKrakenを使っているのでお前も使えということで愛用だった（べつに使いこなしてはいない）SourcetreeからGitKrakenに移行しました．ヒィ

## Sourcetree
<img width="100" alt="sourcetree" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149433/a4c1c78f-dd9e-96a5-80e9-7580ba1e2533.png">

日本人ならGit初心者はみんなSourcetree使うんじゃないかと勝手に考えています．日本語表示だし，GUIが見やすくてすごく直感的に操作できます．1人で開発したものを永遠GithubにあげるだけならSourcetreeでいいと思います．

## GitKraken
<img width="100" alt="gitkraken" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149433/86b48742-17c9-386c-63ce-07d8dbf08e94.png">

[ここ](https://www.gitkraken.com/)からダウンロードできます．

チーム開発で
1．「だれが」「どこをコミットしたか」を視覚的に見る
2．developとbrunchのコードをワンクリックで行き来する
ってことができるのがGitkrakenの良いところです．

### 備忘録
* **WIP**
    *  クリックすると右に編集中の画面がでるのでそれをステージにあげてコミット
*  **Amend commit**
    *  Force Commitでむりやり前のコミットに今のコミットをくっつけちゃう（歴史改変魔法）

## おわり🥀
何か知るたびに備忘録を更新していきます．
JupyterにMicrosoft.Data.Analysisを入れてみる

[Jupyter環境に展開したC#](https://qiita.com/gorn708/items/bf7f2f33254d7cbca587)に[Micorosoft.Data.Analysis](https://devblogs.microsoft.com/dotnet/an-introduction-to-dataframe/)を載せてみました。

```
#r "nuget:Microsoft.Data.Analysis, 0.2.0"
```



Installing package Microsoft.Data.Analysis, version 0.2.0.........done!

```
using Microsoft.Data.Analysis;
```

```
#r "nuget:MathNet.Numerics,4.9.0"
```

Installing package MathNet.Numerics, version 4.9.0.......done!
Successfully added reference to package MathNet.Numerics, version

```
#r "nuget:XPlot.Plotly"
```

Installing package XPlot.Plotly..........done!
Successfully added reference to package XPlot.Plotly, version

```
using MathNet.Numerics;
using XPlot.Plotly;
```

```
var df = Microsoft.Data.Analysis.DataFrame.LoadCsv("Data/german.csv");
df
```

Columns	Rows
[ [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ... (990 more) ], [ A11, A12, A14, A11, A11, A14, A14, A12, A14, A12 ... (990 more) ], [ 6, 48, 12, 42, 24, 36, 24, 36, 12, 30 ... (990 more) ], [ A34, A32, A34, A32, A33, A32, A32, A32, A32, A34 ... (990 more) ], [ A43, A43, A46, A42, A40, A46, A42, A41, A43, A40 ... (990 more) ], [ 1169, 5951, 2096, 7882, 4870, 9055, 2835, 6948, 3059, 5234 ... (990 more) ], [ A65, A61, A61, A61, A61, A65, A63, A61, A64, A61 ... (990 more) ], [ A75, A73, A74, A74, A73, A73, A75, A73, A74, A71 ... (990 more) ], [ 4, 2, 2, 2, 3, 2, 3, 2, 2, 4 ... (990 more) ], [ A93, A92, A93, A93, A93, A93, A93, A93, A91, A94 ... (990 more) ] ... (12 more) ]	[ [ 0, A11, 6, A34, A43, 1169, A65, A75, 4, A93 ... (12 more) ], [ 1, A12, 48, A32, A43, 5951, A61, A73, 2, A92 ... (12 more) ], [ 2, A14, 12, A34, A46, 2096, A61, A74, 2, A93 ... (12 more) ], [ 3, A11, 42, A32, A42, 7882, A61, A74, 2, A93 ... (12 more) ], [ 4, A11, 24, A33, A40, 4870, A61, A73, 3, A93 ... (12 more) ], [ 5, A14, 36, A32, A46, 9055, A65, A73, 2, A93 ... (12 more) ], [ 6, A14, 24, A32, A42, 2835, A63, A75, 3, A93 ... (12 more) ], [ 7, A12, 36, A32, A41, 6948, A61, A73, 2, A93 ... (12 more) ], [ 8, A14, 12, A32, A43, 3059, A64, A74, 2, A91 ... (12 more) ], [ 9, A12, 30, A34, A40, 5234, A61, A71, 4, A94 ... (12 more) ] ... (990 more) ]

となります。

さらに、可視化してみます。

```
var chart = Chart.Plot(new Graph.Scatter() {y = df["Credit amount"]});
```

```
chart
```

サンプルのJupyter Notebookを[github](https://naoyaikeda.github.io/cstry_exam/exam001a.html)に置いておきます。
VSCodeでキーバインドを設定する。keybindings.jsonが無い時の対処法

VSCodeでは、設定系のjsonファイルが無いことが多々あります。
キーバインドの設定をしようとしたときになかったので、出し方を調べました。
今回、いじりたいのは、keybindings.jsonです。
他の設定でも、今回と同じやり方でjsonファイルを生成できるでしょう。

##手順

まず、設定画面を開きます。
<img width="573" alt="スクリーンショット 2020-03-24 11.24.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169789/33944fe7-b266-f666-264b-6cf79e186f27.png">

一覧が出ます。
<img width="1173" alt="スクリーンショット 2020-03-24 11.27.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169789/6cecf8e2-52ea-c8f9-d255-549950021fb3.png">

右上の下記のマークを押すとjsonファイルが生成されます。
<img width="231" alt="スクリーンショット 2020-03-24 11.25.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169789/f401b1cf-211c-4617-15cc-e2123a002b03.png">


##参考
vscodeを快適に使うためのキーバインド設定集
https://note.mokuzine.net/vscode-keybindings/

Visual Studio CodeのIntelliSenseをTabで選べるようにする | コンパス
https://routecompass.net/vscode/
ParallelsでElectronで開発されたアプリの表示がおかしくなるのを回避する方法


--disable-gpuオプションを付与して起動するとうまくいく。

## VSCode

```bash
open /Applications/Visual\ Studio\ Code.app --args --disable-gpu
```


## Googole Chrome

```bash
open /Applications/Google\ Chrome.app --args --disable-gpu
```

.zash等にエイリアスで登録するか、Automator等でスクリプト化すると良い。

## （追記：2021年3月15日）

ChromeもVSCodeもハードウエア（GPU）アクセラレーションをOFFににする機能があるのでそれをOFFにしたほうが早いかもしれません。

2021年3月15日時点で、

* VSCodeのUI乱れは何もしなくても解消してるように見える（ParallelsおよびOSは最新）
* ChromeはUI乱れは無いが動作が遅くて事実上使い物にならない。

### VSCode

cmd + shift + pでコマンドパレットを出して[Configure Runtime Argument]を選択。

![スクリーンショット 2021-03-28 11.58.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/5df64778-1dc7-80bd-9780-640eb7db251b.png "スクリーンショット 2021-03-28 11.58.01.png")


表示されるargv.jsonに

```json
"disable-hardware-acceleration": true
```

と追記。VSCodeを再起動。（あまりかわらないけど）。


### Chrome

詳細設定でハードウエアアクセラレーションをOFFにしてChromeを再起動。


![スクリーンショット 2021-03-28 11.52.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/a18cb1d6-ac7c-81d9-4066-d031dc1e5208.png "スクリーンショット 2021-03-28 11.52.21.png")
pandasで複数行ヘッダのCSVを出力する方法

# やりたいこと
以下のようなヘッダが複数行で構成されている表をCSVで出力したいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/88f92a75-5770-e0f1-1b9f-04b2b3de4b00.png)


備忘録として記事を投稿いたします。

# 環境
* Python 3.8.1
* pandas 1.0.3


# 実現方法

1. columnsが`MultiIndex`であるDataFrameを作成する
2. DataFrameの`to_csv`メソッドで出力する


## DataFrameの作成方法

### `DataFrame`コンストラクタの`data`引数にdictを渡す。

```python
df = pandas.DataFrame({
    ("Alice","Math"): [80,81],
    ("Alice","English"): [90,91],
    ("Bob","Math"): [70,71]
})

print(df)
#   Alice          Bob
#    Math English Math
# 0    80      90   70
# 1    81      91   71

print(df.columns)
# MultiIndex([('Alice',    'Math'),
#             ('Alice', 'English'),
#             (  'Bob',    'Math')],
#            )
```

### `DataFrame`コンストラクタの`columns`引数に`MultiIndex`を渡す

```python
index = pandas.MultiIndex.from_tuples([
    ("Alice","Math"),
    ("Alice","English"),
    ("Bob","Math")
])

df2 = pandas.DataFrame([[80,90,70],[81,91,71]], columns=index)

print(df2)
#   Alice          Bob
#    Math English Math
# 0    80      90   70
# 1    81      91   71

print(df2.columns)
# MultiIndex([('Alice',    'Math'),
#             ('Alice', 'English'),
#             (  'Bob',    'Math')],
#            )
```


###  `DataFrame`コンストラクタの`data`引数にdictのlistを渡す

コンストラクタ引数`columns`がNoneだと、`columns`プロパティの型が`Index`になり、複数行ヘッダで出力できません。

```python
df3 = pandas.DataFrame(
    [
        {("Alice","Math"):80, ("Alice","English"):90,("Bob","Math"):70},
        {("Alice","Math"):81, ("Alice","English"):91,("Bob","Math"):71},
    ]
)

print(df3)
#    (Alice, Math)  (Alice, English)  (Bob, Math)
# 0             80                90           70
# 1             81                91           71

print(df3.columns)
# Index([('Alice', 'Math'), ('Alice', 'English'), ('Bob', 'Math')], dtype='object')

```

`columns`引数に`MultiIndex`を渡せば、複数行ヘッダを出力できます。

```python
index = pandas.MultiIndex.from_tuples([
    ("Alice","Math"),
    ("Alice","English"),
    ("Bob","Math")
])

df3 = pandas.DataFrame(
    [
        {("Alice","Math"):80, ("Alice","English"):90,("Bob","Math"):70},
        {("Alice","Math"):81, ("Alice","English"):91,("Bob","Math"):71},
    ]
    ,columns=index
)

print(df3)
#   Alice          Bob
#    Math English Math
# 0    80      90   70
# 1    81      91   71

```


## DataFrameの`to_csv`メソッドで出力する

```
df.to_csv("foo.csv", index=False)
```

```csv:foo.csv
Alice,Alice,Bob
Math,English,Math
80,90,70
81,91,71
```
【PHP】出したエラーの数々

エラーが出た原因と解決法の備忘録

##シンタックスエラー

`syntax error, unexpected ';', expecting ']'`
']'付近に想定外の';'があると怒られました。
連想配列の最後にセミコロン付けてるのが原因です。

```php
$result = [
          'result' => 'NG',
          'message' => $e->getMessage();
        ];

//　getMessage();の';'を消して解決↓

$result = [
          'result' => 'NG',
          'message' => $e->getMessage()
        ];
```
【Go】インターフェース（Error）


◎ errorインターフェース
fmtパッケージにあり。
Error()メソッドを利用。
エラーの内容・文字列を返してくれる。

使い方
①ストラクト作る（エラーメッセージで必要な要素を設定）
②ストラクトを型にインターフェースのメソッドと同じ名前のメッソドを作る
③インターフェースのメソッドと同じ返り値の型(string)を設定

※エラーメッセージのやりとりはポインタを利用する
（ポインタ使わなかった場合、EOFの値が異なり処理がうまくいかない）

```Go:

package main

import (
	"fmt"
)

type NoUser_ErrorMessage struct {
	Username string
}


//エラーメッセージ返す用のメソッド作成
func (e *NoUser_ErrorMessage) Error() string {
	return fmt.Sprintf("User Not found: %v", e.Username)
}


func myFunc() error {
	// falseを設定
	is_ok := false
	if is_ok {
		return nil
	}
	return &NoUser_ErrorMessage{Username: "Ken"}
}

func main() {
	if err := myFunc(); err != nil {
		fmt.Println(err)
	}
}
```

結果

```
User not found: Ken
```
RaspberryPi で キャラクタ液晶に起動時の IP アドレスを表示する

「1602 キャラクタ LCDモジュール を STM32 と RaspberryPi で動かす」
https://qiita.com/nanbuwks/items/d5f094e54a3f6641c970

で使用したLCDを使って、いつもお悩みの起動時のIPアドレスの表示をしてみます。

# 環境

- Raspbian GNU/Linux 10 (buster)
- Raspberry Pi 3 Model B
- Adafruit_CharLCD ライブラリ
- Python 3.7.3

# 配線

先の記事の通り


|LCD PIN|SIGNAL NAME|RaspberryPi3|
|:---:|:---:|:---:|
|1| VSS|GND|
|2| VDD|3.3V|
| 3 |VO |(Volume)|
| 4| RS|GPIO26|
| 5 |R/W|GND|
| 6| E|GPIO19|
|7| D0|(NC)|
|8 |D1|(NC)|
|9 |D2|(NC)|
|10 |D3|(NC)|
| 11 |D4|GPIO20|
|12 |D5|GPIO21|
|13|D6|GPIO22|
|14|D7|GPIO27|
|15 |LED(+)|3.3V|
|16 |LED(-)|GND|

# インストール

adafruit_character_lcd ライブラリを以下のようにしてインストールします

```
sudo pip3 install adafruit-circuitpython-charlcd

```



# プログラム

引数でメッセージを表示する汎用プログラムです。

```

#!/usr/bin/env python

import sys

import Adafruit_CharLCD as LCD
lcd_rs        = 26
lcd_en        = 19
lcd_d4        = 20
lcd_d5        = 21
lcd_d6        = 22
lcd_d7        = 27
#
lcd_columns = 16
lcd_rows    = 2
#
#
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7,
                       lcd_columns, lcd_rows)
lcd.clear()
if ( 2 >  len(sys.argv)):
  lcd.message("No IP address.")
if ( 1 <  len(sys.argv)):
  message = sys.argv[1]
  lcd.message(message)
if ( 2 <  len(sys.argv)):
  message = sys.argv[2]
  lcd.message("\n")
  lcd.message(message)
# cursol blink
lcd.blink(False)
```


# 自動起動に設定

```

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# ifconfig eth0:1 169.254.12.24


sleep 5
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi


python3 /home/pi/LCDmessage.py $_IP

exit 0

```

途中でコメントアウトしている、 

```

# ifconfig eth0:1 169.254.12.24

```

は以下の記事で紹介した、リンクローカルアドレスの割当です。
「Raspbian Buster で eth0:1 にスタティックIPを割り当てる」
https://qiita.com/nanbuwks/items/1433e8203dcf03034a1a

また、sleep 5 
は、試したDHCP環境だと有線のIPアドレス取得に時間がかかっていたので、そのためのディレイです。



# 実行結果

先の記事にあった、HATもろともケースに入れてみました。

![IMG_20200324_102448.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/eebcaaee-7bff-f7da-f240-e1ac4272291e.jpeg)

ちゃんと、有線と無線のIPアドレスが表示されています。
ESP-32S開発環境など

# ESP32

https://ja.wikipedia.org/wiki/ESP32

Xtensaデュアルコア32ビットLX6マイクロプロセッサ

# runtime・開発環境
##  nodemcu

luaが動作する環境
https://github.com/nodemcu/nodemcu-firmware/tree/dev-esp32

## arduino

arudino上で動作する環境

https://github.com/espressif/arduino-esp32

## ESP-IDF

ESP32 Socを開発するためのC toolchain・API一式
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/index.html

# ESP-IDF ツールチェーン

ツールチェーンなど一式インストール

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html#get-started-get-prerequisites

```bash
ghq get espressif/esp-idf
git submodule update --init --recursive 
```
SysOps試験対策

#ECインスタンス関連
 - InstanceLimitExceeded　⇒　あなたは地域で起動できるというインスタンスの数の上限に達してる（リージョン単位）
 - InsufficientInstanceCapacity　⇒　AWSにはリクエストを処理するのに十分なオンデマンド容量がない
 - EC2インスタンスがpendingからterminated
  - EBSボリューム制限に達してる
  - EBSスナップショットが破損
  - ルートEBSボリュームは暗号化されており、復号化のためにKMSキーにアクセスする権限がない
  - インスタンスの起動に使用したインスタンスストアにバックアップされたAMIに必要な部分（image.part.xxファイル）がない
 - CacheNodeTypeパラメータ　⇒　EC2インスタンスタイプ指定
 - CreateCacheCluster　⇒　新しいクラスタ作成

#CloudWatch
 - DiskQueueDepthメトリック　⇒　使用可能なストレージスペースではなく、ディスクへのアクセスを待機している未処理のIO（読み取り/書き込み要求）の数を提供
 - FreeableMemoryメトリック　⇒　使用可能なストレージスペースではなく、使用可能なランダムアクセスメモリの量を追跡
 - BinLogDiskUsageメトリック　⇒　マスター上のバイナリログが占有するディスク容量を追跡する、MySQLリードレプリカにのみ適用
 - FreeStorageSpaceメトリックス　⇒　RDS DBインスタンスの利用可能なストレージスペースを監視できる
 - CloudWatchアラームアクションを使用すると、インスタンスを自動的に停止、終了、再起動、または回復するアラームを作成できる
 - CloudWatchイベントをEBSと統合し、Lambda関数を設定してスナップショットを別のリージョンにコピーする
 - 単一のCloudWatchダッシュボードを使用して複数のリージョンのAWSリソースを監視できるが、リージョン間でデータを集約することはできない


#Amazon EMR
 - 企業、研究者、データアナリスト、開発者が膨大な量のデータを簡単かつコスト効率よく処理できるようにするウェブサービス
 - 数百、または数千のコンピューティングインスタンスをプロビジョニングして、あらゆる規模でデータを処理できる

#KMS
 - デフォルト保留期間は30日
 - 削除保留中のCMKは暗号化操作できない
 - 削除保留中のCMKのバッキングキーをローテーションしない
 - キーポリシーは、AWS KMSで顧客マスターキー（CMK）へのアクセスを制御する主要な方法

#Amazon Redshiftログ情報
 - 接続ログ：認証の試行、接続および切断を記録
 - ユーザーログ：データベースユーザー定義の変更に関する情報を記録
 - ユーザーアクティビティログ：データベースで実行される前に各クエリを記録
 - クラスターのスナップショット（自動または手動）を別のリージョンに自動的にコピーするようにAmazon Redshiftを構成できる

#ELB
 - SpilloverCount　⇒　サージキューがいっぱいであるために拒否された要求の合計数を提供
 - SurgeQueueLength　⇒　正常なインスタンスへのルーティングを保留しているリクエスト（HTTPリスナー）または接続（TCPリスナー）の総数を提供
 - HealthyHostCount　⇒　ロードバランサーに登録されている正常なインスタンスの数
 - BackendConnectionErrors　⇒　ロードバランサーと登録済みインスタンスの間で正常に確立されなかった接続数
 - 【AWSELB】クッキー作成、セッションをインスタンスマッピングに使用
 - 複数のアベイラビリティーゾーンにわたってEC2インスタンスを起動し、ロードバランサーでクロスゾーンロードバランシングを有効にする

#Auto Scaling
 - 実行中のEC2インスタンスの属性を使用して起動設定を作成するオプションがある
 - 必要以上にインスタンスを追加しないように、ウォームアップ期間設定、その間メトリックに含まれない

#Route53
 - enableDnsHostnames　⇒　VPCで起動されたインスタンスがパブリックDNSホスト名を取得する
 - enableDnsSupport　⇒　VPCでDNS解決がサポート、IPアドレス関連

#RDS
 - デフォルトではSSL接続しない
 - IOPSのプロビジョニングはEBSの設定、スケールアップ⇒インスタンスタイプ変更

#CloudFormation 
 - StackSetsは、1回の操作で複数のアカウントとリージョンにわたってスタックを作成、更新、削除できる
 - スタックを更新するときに変更セット使用し、変更を表示できる
 - デフォルトではスタックをロールバックする
 - EC2サーバー、Redshift、EMR構成を含むCloudFormation設計が優先事項

#CloudFront
 - エッジキャッシュからファイルを削除方法
  - ①エッジキャッシュからファイルを無効にする
  - ②ファイルのバージョン管理を使用して、異なる名前を持つ異なるバージョンのファイルを提供
 - エンドポイントは、リソースが正常であることをRoute 53に通知する2xxおよび3xx応答コードで応答する

#SSL証明書をIAMにアップロードされた証明書に置き換える
 - 1. get-server-certificateコマンドを使用して、証明書のARNを取得します。
  -  aws iam get-server-certificate --server-certificate-name my-new-certificate
 - set-load-balancer-listener-ssl-certificateコマンドを使用して証明書を設定
  - aws elb set-load-balancer-listener-ssl-certificate --load-balancer-name my-load-balancer --load-balancer-port 443 --ssl-certificate-id arn:aws:iam::123456789012:server-certificate/my-new-certificate

#コスト
 - AWSのコストと使用状況レポートを設定して、CSV形式の請求レポートを毎日S3バケットに生成および発行できる
Jetson Nanoでjtopを使ってみる

Jetson NanoでGPUの使用率とか見てみたくなり、`jtop`というコマンドがあるのを知ったので入れてみた。

まずはpipが入ってないのでpipをインストール。

```
$ sudo apt install python-pip
```

そしてpipにてjtson-statsをインストール。

```
$ sudo -H pip install jetson-stats
```

で、`jtop`コマンドを実行。

```
$ jtop
```

こんな感じ。CPUやメモリも一緒に参照可能。また、`1`, `2`, `3`キーでビューを切り替えることもできる。

![jtop1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/2b7e89ad-2c4a-05f6-8d15-7f5a4eca7d2f.png)
![jtop2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/387ee43c-b091-2647-9818-75a051a2997f.png)
![jtop3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/38eec339-374d-ceff-3991-55269d903e2c.png)
以下のサイトのコードの完全版欲しいです

GASで作る社内ツール (キャンセル・報告編
https://qiita.com/nyanko-box/items/905d224d3ba8d3d00796


ソースコードそのままコピペしても、
キャンセル、報告ボタンが書かれておらず動きません。完全に動くソースコードが欲しいです。

当方、プログラミング初心者につき、最初は先人のマネから入って、
カスタマイズして、業務に応用させたく、どなたかお力添えはただけると幸いです。
既存RailsアプリにCircleCIを導入した手順


自作のRailsアプリにCircleCIを使ってCI/CDを導入しました
今回は、CircleCIとGitHubとの連携までを行います。


# 自動化したいこと

- テスト
- コード解析
- デプロイ

ただ、今回は導入しか行いませんので、正直以上の３つは関係ありません。


# CircleCIを採用した理由

- 無料プランがついている
- メジャーどころっぽい
- 日本語の資料が多い（死活問題）


# 1. アカウント取得・連携

やることは以下の３つ。

- CicleCIに登録
- GitHubと連携（登録と同時にできる）
- CircleCIを導入するアプリ（リポジトリ）を選ぶ

[CircleCI公式（英語）](https://circleci.com)でSignUpします。
基本的には画面の指示に従っていたら間違いないはずです。

英語じゃねえか... と心が折れかかりますが、私でもなんとかなったので多分大丈夫です。
少し時間が経っていて画面デザインが少し違いますが、次のブログは参考になります。
[【CircleCI】CircleCI 2.0からはじめる個人での簡単なCI導入方法 - githubとの連携まで](https://www.tweeeety.blog/entry/2018/02/09/195345)


CircleCIを導入するアプリを選んだら、`ブランチを作って設定ファイルを自動で作ってあげるよ！`と言ってくれますが、私は勉強も兼ねて自分で作りました。


# 2. 設定ファイルを作成する

CircleCIに登録後、表示されたconfig.ymlのサンプルをコピペします。

その前に、コピペ先を導入アプリのルートディレクトリにフォルダと設定ファイルを作成します。

``` Terminal
$ cd ~/Rails_App
$ midir .circleci
$ touch .circleci/config.yml
```

作成したconfig.ymlを開いて（vimでもエディタでも）、設定サンプルをコピペします。

私のサンプルはこうなってました。

``` config.yml
version: 2.1
orbs:
  ruby: circleci/ruby@0.1.2 

jobs:
  build:
    docker:
      - image: circleci/ruby:2.6.3-stretch-node
    executor: ruby/default
    steps:
      - checkout
      - run:
          name: Which bundler?
          command: bundle -v
      - ruby/bundle-install
```

試しにpushしてみます。

``` Terminal
$ git add -A
$ git commit -m "CircleCIの設定ファイルを追加"
$ git push origin master
or
$ git push origin branch-name
```

開発ブランチなどで作業していた場合は、GitHubでプルリクエストします。

CircleCIのダッシュボードを確認し、pushに反応してアイコンがグルグルしていると思うので、待ちます。

![PixelSnap 2020-03-24 at 09.46.19@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532774/d923cae7-6bba-75fe-f4db-44abb2144023.png)

少し待つと（私の環境で３分）SUCCESSとなるので、
こうなったら、CircleCIとGitHubとの連携は完了です。



# 導入完了

これからは自動化したいことによって、.circleci/config.ymlを書き換えていきます。

Railsの場合は、公式が日本語ガイドを用意してくれています。
[言語ガイド](https://circleci.com/docs/ja/2.0/language-ruby/)

CI/CDの概略やCircleCIの設定ファイルを優しく解説してくれている
ネット記事もありました。
[「エンジニアのためのCI/CD再入門」連載一覧](https://codezine.jp/article/corner/754)

ご参考までに。

最後までお読みいただきありがとうございました！
エンジニア登竜門：1週目

##まずは仕事の準備から。
2020/2/3からスタート。事情があって月から木の週4勤務。
MacOS環境を勧められていたが、<font color=blue>半年無職の男にMac買うような金あるわけない</font>ので自前のWinで始める。パーツは古いが、長年いろんなゲームと戦ってきた愛用のPCだ。
最初の業務は会社のWebシステムを自分のパソコンに落とし込んでローカル環境を作るところから。ただプログラミング初心者には**ジットハブ**から**リポジトリ**を**クローン**して**ドッカー**で**ビルド**してから**コンポーズアップ**して**ローカルホスト**に**アクセス**して**環境テスト**とかもう訳わかんなかった。なんでこんなカタカナだらけなの。何にもわからん。検索しながらなんとかローカルを整える。
<Font color=red>**ところが問題発生**</FONT>、マニュアル通りに入れたはずなのにエラーで立ち上がらない。エラーログの見方も分からない、質問しても**「Winはわからんっすね」**。
そりゃそう。事前に言われてたし。

##仮想環境でGO
####WSLでGO
急遽変更、仮想環境を使って少しでもMacに似てる**Linux環境を作る**ことにする。もちろん上司の指示。（初心者にそんな気が回るワケがない。）
Winには<font color=blue>便利な**WSL**(Windows Subsystem for Linux)というものがある</font>のだ。説明は不要だろう。せっかく用意されてるんだしそれで環境を作る。
普通の仕事で言ったら**「デスクに資料を並べる」ような作業**で2日くらい取られてるので焦ってくる。早く環境を作らねば。
そして<font color=red>**またしてもエラー**</font>。なぜだ、わからん、エラー読んでも分からん。CUI（これは知ってた）なんぞ**凡人の扱える代物じゃねえ**。どうやら「WSLだとUbuntuのバージョンとDockerのバージョンがかみ合わない事がある」らしい。WSLでDocker使う人もそこそこいるみたいだが、**検索しても何にも分からん**。Ubuntuごと消しては再構築するという無駄を重ねまくる。もちろん解決せず。
####VirtualBOXでGO
**これはマズイ**。別の手段にしよう。どうやら<font color=blue>WSLよりは一般的に使われている**VirtualBOX**</font>というのがあるらしい。こいつにかけるしかねえ。慣れた手つき（激遅）でVirtualBOXにUbuntuを導入する。GUIが使える分さっきよりテキパキと…と思いきや、**「Winを起動しながらメモリやCPUの力をVirtualBOXに割く」という仕組みなので作業がハチャメチャに重い** 。15年前かよ。メイプルストーリーの裏でスカイプとかいじるとこんな感じだったわ。
何とかかんとか導入完了、ようやくずっとボトルネックになってたシステムが動き始め…**てない**。<font color=red>**1個だけ動いてない**。</font>
エラーログも大して吐いてない（見方を教えてもらった）。必死に色々試す。**間違いなく今までで一番順調ではあるんや**…なんで最後のこれだけ動かないんだ…しかも原因不明…！最初の1週間、<font color=red>俺は「デスクの準備」で終わってしまう</font>のか…！？

##原因解明
泣きそうになりながらエラーになるような部分のワードを検索した。英語の資料ばっか出る。**何言ってんのかわかんねえ**。
しかしここでようやく、**<font color=red>ほぼ同じ症状のエラーが出てるという英語の資料を発見。</font>ああ、神は生きてるんだ…！！**
ついに長い戦いも終わり、原因解明、そのエラー番号はなんと、**「CPUの処理機能が非対応」**ということ。

**…ん？え？CPU非対応？**ハードが古すぎるということ？

つまり、環境構築云々の前に、**<font color=red>「スーパーファミコンではSwitchのソフトは遊べません」というエラーが起きていた。</font>…神は死んだのだ。**

俺は悟った。なぜエンジニアはみんなMacBookで仕事をするのか。
あれは**スタバでドヤる**ためではなく、**開発環境のハードウェアを統一する**ためだったのだ。物事には須らく理由があるのだ。  

##怒涛の4日間を終えて(進捗：0%)
そうして、エンジニアとしての最初の4日間は**「開発初心者はMac使っとけ」**というツイッターのクソリプのような事実を、その身をもって理解する事だけに使われてしまったのであった。  

なお、見かねた上司がオフィス側の人に掛け合ってくれたので、**オフィスに余ってたMacを貸していただける**事になった。
週明けからはMacで開発します。頑張りますのでよろしくお願いします。
対戦オセロwebapi その2

#概要

対戦オセロwebapiを作ってみる。
石を使ってみる。
ライブラリーは、jquery,tatenoを使う。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/0369b944-6ec0-7420-2e3a-a703a861cdb7.png)



#サンプルコード


```
var chara = "https://camo.qiitausercontent.com/7873b55118f9bac84a20de35c02770aac1d1f02a/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f31383130342f33656230653537342d643430362d326537342d663238312d3561663132396130353834362e706e67";
window.onload = function() {
	game = new Game();
	game.preload(chara);
    game.fps(30);
    game.start();
    var j = 0;
    var isi = new Sprite(40, 40, chara, 3, 1);
    function main() {
        setTimeout(function() {
            j++;
            isi.frame(j);
            if (j > 2)
            {
                j = 0
            }
            main();
        }, 800);
    }
    main();
}

```

#成果物

https://embed.plnkr.co/plunk/wiVqDHHrpjzxE3ut

以上。
エクセルの呪縛から開放されよう(マスターデータ管理の仕組みの提案)


## マスターデータ管理の悩み

ゲームエンジニアの皆さん、マスターデータの管理ってどうしてますか？

開発の初期段階で必要になるマスターデータの仕組み。
とりあえずエクセルで管理して、ゲーム側はエクセルから出力したcsvを読み込むようにしとこう・・・なんてすると、後になって面倒なことになります。

例えば、エクセルとCSVを使ったやり方だと、

- エクセルファイルはgitで差分が取れない。マージできない。
- カラムを追加したり変更するたびに、ゲームプログラム側のcsvパース処理も書き換えないといけない

こんな問題が出てきます。これが後になればなるほど、開発イテレーションの遅れとなって足を引っ張るようになってくるんですね。

運営タイトルだと、複数のブランチを並行で作業するのが日常なので、マージできない事による不便さMaxですし、データのミスも多発します。

いろいろと悩み多く、これだ！という解決策がなかなか見つからないのがマスターデータ。

今回は、エクセルを使いつつも、エクセルファイルは使わない、そんなやり方を考案したので、紹介します。


## エンジニアはエクセルが嫌い、プランナーは大好き

マスターデータの仕組みを考えたとき、大体以下の様な要件があると思います。

- エクセルで編集したい（プランナーが使いやすいから）
- エクセルファイルを管理したくない（gitで差分がとれない、マージできないから）
- VBAは使いたくない（ソースがエクセルファイルに埋め込まれるので、これまた差分が取れない）
- スキーマ定義からゲームプログラムのソースを自動生成したい

エクセルを使いたい、でも使いたくない・・・矛盾している！
と思うかも知れません。

## ではどうしたらよいか？

私の携わったプロジェクトでは、前述の要件を満たすために、以下の方法を取ることにしました。

- gitで管理するマスターデータはyamlで表現する（差分取れるし、マージもできる）
- yamlを編集するために、エクセルを **エディターとして** 使う
- エディターの開発には、VBAじゃなく[Windows PowerShell](https://docs.microsoft.com/ja-jp/powershell/?view=powershell-7)を使う
- スキーマ定義とデータのシリアライズ・でシリアライズには [Protocol Buffers](https://developers.google.com/protocol-buffers)を使う

これで完璧です。

Windows PowerShellは、Windowsで使えるスクリプト言語で、エクセルなどのオフィスソフトを外から操作することができます。
Protocol Buffersは、google製のシリアライザ・デシリアライザで、.protoというデータの定義を書くと、シリアライズ・デシリアライズ処理のソースをいろんな言語で出力してくれます。

今回作ったものの構成を下図に示します。例として、敵キャラのテーブル`EnemyTable`で見てみます。

![masterdata.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227302/cc27b430-6c89-e355-c1f2-c2c61a9c622e.png)


上の図で、`enemy_table.proto`, `enemy_table.yaml`, `EnemyTableバイナリデータ`はgitで管理されます。エクセルは単なるエディタとして使うので、テーブル毎のエクセルファイルはありません。

また、EnemyTableバイナリデータは、.yamlをProtocol Buffersのバイナリデータに変換したものです。

細かく処理を見ていきましょう。

## ロード処理

ロードの処理は、

- .protoファイルをロードしてエディタのヘッダ部分を表示する
- .yamlファイルをロードしてエディタのデータ（ボディ）部分を表示する

この２つを行います。

#### ヘッダのロード

ヘッダをロードするためには、.protoファイルをパースしなければなりません。
そのために、[protoc-gen-json](https://github.com/sourcegraph/prototools/blob/master/README.json.md)を使うことにしました。
protoc-gen-jsonは、その名の通り、protocファイルをパースして、結果をjsonとして出力してくれます。
そのjsonデータを読み込んで、エクセル上にカラム名などのヘッダを表示します。

.protocファイル内のコメントもjsonに出力されるので、書式を決めて適切に処理すれば、ゲームの処理とは直接関係ない情報（例では、カラムの説明文）も、ヘッダに反映させることができます。

#### ボディのロード

ボディ部分は、.yamlを読み込んでExcel上に展開します。
そのために、yamlを一度csvに変換し、それをexcelの機能を利用してロードしています。
yamlをcsvに変換する処理は、C#で書きました。

PowerShellで直接yamlをパースし、エクセルの１つ１つのセルに直接データを書き込むやり方もありますが、これだとすごく処理が重たくなるので、csvを経由する方法を採っています。


## セーブ処理

エディタ上のデータを.yamlに変換します。
これも高速化のために、一度csvに保存した後に、yamlに変換しています。


## 変換処理

yamlをProtocol Buffersのバイナリに変換します。
yamlをパースし、protocによって自動生成されたソースコードを使って、シリアライズされたバイナリデータとして書き出します。



## まとめ

以上、私が作ったマスターデータ管理の仕組みと、関連するツールを簡単に紹介しました。
同じ様な事で悩んでいる方の参考になれば、幸いです。

----
最後に、図中のテキストを貼り付けておきます。


```yaml:enemy_table.yaml

- enable: true
  id: 1000
  name: slime
  hp: 100
  _memo: スライム
- enable: true
  id: 1001
  name: ghost
  hp: 120
  _memo: ゴースト
```


```protobuf:enemy_table.proto

//1行分のデータ定義
message Enemy {
  uint32 id = 1;      //id:敵ID
  string name = 2;    //name:名前
  uint32 hp = 3;      //hp:HP
}

//テーブルの定義
message EnemyTable {
  repeated Enemy records = 1;
}
```
引数を空白区切りでコンソール画面に表示する関数

タイトルの通り、可変長引数で渡された値を空白区切りで出力する関数です。
競技プログラミングのデバッグ時に欲しかったので作りました。

```c++:C++
#include <iostream>

#define MY_ATCODER_DEBUG //提出時はコメントアウトする
#ifdef MY_ATCODER_DEBUG
  #define DBG(...) debug_print(__VA_ARGS__)
#else
  #define DBG(...)
#endif

template<class... Args>
void debug_print(Args... args) {
	std::cout << std::endl;
}
template<class Head, class... Args>
void debug_print(Head head, Args... args) {
	std::cout << head << ' ';
	debug_print(args...);
}
```

※上記では、ソースコード内で「MY_ATCODER_DEBUG」マクロを定義していますが、
コンパイラオプションを使って定義すれば、提出時にコメントアウトせずに済みます。
[VisualStudioでのプリプロセッサ定義の設定方法](https://docs.microsoft.com/ja-jp/cpp/build/reference/d-preprocessor-definitions?view=vs-2019#to-set-this-compiler-option-in-the-visual-studio-development-environment)

##使い方
```c++:C++
using namespace std;
int main(){
	int    a = 20;
	double b = 2.5;
	string c = "文字列";

	DBG(a, b, c);
	return 0;
}
```
```:コンソール画面の出力
20 2.5 文字列 
```
複数の型を混合して引数に渡すことができます。

##参考URL
https://leico.github.io/TechnicalNote/Cpp/variadic-template
（実は、こちらのサイトの内容をデバッグ用に整えただけで、私自身は理解しきれていません。）
（もっと良いやり方があれば、教えて下さい。）

##編集履歴
2020/3/25(水)
指摘を基に、定数「DEBUG」を「MY_ATCODER_DEBUG」に改名。
また、コンパイラオプションを使ったプリプロセッサ定義を追記しました。
OpenBabelの最新版をソースコードからコンパイルしてインストールする方法

## はじめに

こんにちは，(株)日立製作所 研究開発グループ サービスコンピューティング研究部の露木です。

今回はOpenBabelプログラムのインストール方法を簡単に紹介します。OpenBabelは情報化学 (ケモインフォマティクス) 分野の各種計算に役立つツールボックスです。計算対象の化学構造や計算条件のフォーマットが統一されていない，シミュレーション計算用の入力ファイルの相互変換に特に役立ちます (ちなみにOpenBabelの名称は「バベルの塔」に由来しており，名称からもフォーマットを標準化したい気持ちを想像いただけるかと思います)。

OpenBabelをインストールするとき，Ubuntuではリポジトリから `apt install openbabel` で可能できますが，本稿の執筆時点 (2020年2月) では，とても古いバージョン2.3.2しか使えません。そこで本稿では[openbabelのGitリポジトリ](https://github.com/openbabel/openbabel)からソースコードを取得してコンパイルし，最新版のOpenBabelをインストールする方法を説明します。2020年2月現在の最新版は OpenBabel 3.0です。


## 前提環境

- OS: Linux (Ubuntu 18.04)
- GUIなし

## 依存関係のインストール

まずはOpenBabelのコンパイルに必要なライブラリをインストールします。以下のコマンドを実行してください。

```bash
sudo apt install -y git cmake libxml2-dev zlib1g-dev libwxgtk3.0-dev libboost-all-dev libomp-dev libeigen3-dev libcairo2-dev
```

## コンパイル

次にOpenBabelのソースコードを取得し，コンパイルするための環境を整えます。

```bash
git clone https://github.com/openbabel/openbabel.git
mkdir -p openbabel/build
cd openbabel/build
```

オプションを設定し，コンパイルとテストを実行します。もしも，共有の計算機などroot権限が無い環境下でコンパイルを行いたい場合は cmakeコマンドに `-DCMAKE_INSTALL_PREFIX=${HOME}/.local/app/obabel` といったオプションを指定してください。これにより，ホームディレクトリ以下にOpenBabelをインストールできます。

```bash
# GUIを無効化，スレッド並列化を有効化するオプションを設定
cmake -DENABLE_OPENMP=ON -DBUILD_GUI=OFF ..

# 8並列でコンパイル。並列数は計算機のCPUに合わせて変更してください
make -j8

# テストを実施
make test   # make test ARGS=--verbose とすればエラー時に詳細ログがでます

# インストールの実行
sudo make install
```

インストールが終了したら，OpenBabelのバージョンを確認してみます。以下のようにOpenBabel Version 3.00 をインストールできたことがわかります。

```bash
$ obabel -V
Open Babel 3.0.0 -- Feb 12 2020 -- 12:34:21
```

## 動作確認

せっかくなのでOpenBabel3.0系にしかない新機能を動作確認してみます。具体的には，SMILESからBall and Stick形式の画像に変換して可視化してみます。SMILESは1行の文字列で分子構造を表すフォーマットであり，例えばベンゼンは `c1ccccc1` と表記されます。SMIELSの文字列だけから分子構造をイメージするのは難しいため，画像に変換して可視化するのは重要な操作です。

なお，オプションの意味は， `-i smi` でSMILESの文字列を入力とし， `-O benzene.svg` で保存先の画像ファイル名を指定しています。また，`--gen3D` は分子動力学法にもとついて3次元構造を最適化する指定であり，`-xS` でBall and Stick形式を指定しています。

```
#  SVGに-xSオプションをつけるとBall and Stickで可視化できる
echo 'c1ccccc1' | obabel -i smi -O benzene.svg --gen3D -xS
```

保存された benzene.svg を開くと以下のようになります。たしかに新機能が使えることがわかりました。

![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541219/50a49777-0953-742d-46e9-fa2dd2168745.png)

## おわりに

今回の記事でOpenBabelの最新版をインストールし，利用できるようになりました。また，動作確認としてSMILESからの簡単な可視化を行う方法も合わせて示しました。しかし，[開発元のマニュアル](https://open-babel.readthedocs.io/en/latest/) をご覧いただければわかるようにOpenBabelには今回紹介したもの以外にも多種多様な機能があります。そこで，[次回の記事](https://qiita.com/MasafumiTsuyuki/private/cdacf9175dad5e098ff4)では「OpenBabelを使ってSMILES表記の分子式から3次元の分子構造を復元する方法」を説明し，シミュレーション計算の入力ファイルを作成できるようにします。

## 参考URL

- [OpenBabelのインストール  In Silico 創薬](https://www.insilico.jp/blog/2019/07/01/openbabel%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)
- [Install Open Babel  Open Babel v2.3.1 documentation](http://openbabel.org/docs/dev/Installation/install.html)
- [openbabel/INSTALL at master · openbabel/openbabel](https://github.com/openbabel/openbabel/blob/master/INSTALL)
TypescriptでenumのキーのみforEachする

単純にObject.keysの値をforEachすると、数値も文字列も両方が取得されてしまうので、filterで数値のキーのみ取り出すことで実現できる。

```typescript

enum SomeType {
    HOGE = 0,
    FUGA = 1,
}

Object.keys(SomeType).filter(key => !isNaN(Number(key))).forEach((entry) => {
    console.log(entry); // 0,1
});
```

文字列のキーのみ取得したい場合はfilterの条件を `isNan` にすればよい。

```typescript

Object.keys(SomeType).filter(key => isNaN(Number(key))).forEach((entry) => {
    console.log(entry); // HOGE,FUGA
});
```
TerraformのModuleを理解するための雑なメモ

# これはなんですか

- Terraform の Module を調べたときに理解しづらかったことを垂れ流しておきます。

# 実行ディレクトリの .tf はルートモジュール

実は、普段 `terraform plan`, `terraform apply` を実行するときに作る `.tf` 一式も **ルートモジュール** というモジュールである。モジュールだからこそ、通常のモジュールと同様に `variable` や `output` で入出力を持たせることができる。これはQiitaやブログだけ見てTerraformを設定していると見逃しがちである。

https://www.terraform.io/docs/configuration/modules.html

> Every Terraform configuration has at least one module, known as its root module, which consists of the resources defined in the .tf files in the main working directory.

ルートモジュールは他の子モジュールとは以下の点が異なる。
- `variable` の値を `terraform` コマンドやtfvarsファイルで渡せる
- `output` の値を `terraform apply`、`terraform refresh` で表示できる


# variable は値渡しのための記法

モジュールを作るとき、`variable` ブロックでは `default` 属性を設定せず、値を空のままにすることが多い。

```
variable "name" {} # this is the input parameter of the module
```

普段何気なくルートモジュールで `variable` を書くときは `default` 属性で値を埋め込んでいる。しかし、Terraformの実行ファイルをモジュールの集まりと考えれば、「 `variable` の値は空で問題なく、`default` は入力が空の場合のデフォルト値を入れるための設定」という考え方が自然になる。ルートモジュールでわざわざ `default` を書くのも、コマンドから値を渡すのは面倒だからあらかじめデフォルト値を設定している、と考えられる。

ドキュメントにも、`variable` が「Input Variables」すなわち入力変数であることが明記されている。

https://www.terraform.io/docs/configuration/variables.html

> Input variables serve as parameters for a Terraform module, allowing aspects of the module to be customized without altering the module's own source code, and allowing modules to be shared between different configurations.
> 
> 入力変数はTerraformモジュールのパラメーターとして機能し、モジュールのソースコードを変更せずにモジュールの側面をカスタマイズしたり、異なる構成間でモジュールを共有したりできます。(Google翻訳)

これらのことから、 「`variable` はモジュールへの値渡しのために用意された要素」であり、「ルートモジュールにおける `variable` の書き方は (極端な話) 特別な例」であると言える。
Jupyter NotebookにC#をインストールする

[.NET Core with Jupyter Notebooks](https://devblogs.microsoft.com/dotnet/net-core-with-juypter-notebooks-is-here-preview-1/)にある通り、.NET CoreをJupyter Notebookから使えるようになったので、手元のWindows 環境でやってみました。Jupyter Notebookのインストールそのものは、[Ububtu 18.04 環境上にJupyterとQ#環境を構築する](https://qiita.com/gorn708/items/712334e1c2e9c99803b9)あたりとか、その元とかが使えると思います。

基本的には
```dotnet tool install -g --add-source "https://dotnet.myget.org/F/dotnet-try/api/v3/index.json" Microsoft.dotnet-interactive```
とやって、.NET Interactiveをインストールして、Windows Terminalを再起動して、サーチパスを有効化し、
```dotnet interactive jupyter install```でjupyterのKernelをインストールしただけです。
あとは、おもむろに```jupyter notebook```でJupyter Notebookを起動。
```System.Console.WriteLine("Foo");```
とやって、Fooが出ることを確認できました。
うむ、すごく簡単。
次は、DataFrameで遊んでみよう。
Vagrant環境でsu, sudoコマンドでrootになれなくなった〜きっかけはnpmでpermission denied〜

ローカルのVagrant環境をいじっていたら`su`コマンドも`sudo`コマンドもエラーになってしまい、めちゃめちゃ焦った話。

結論から言うと開発環境を作り直すことになったので、自戒も込めてここに投下します。

# 環境

* Vagrant 2.1.2
* CentOS Linux release 7.5.1804

# rootログインエラーになる理由

npmでPermission Deniedだなんだと怒られたので、原因を検索して見つけたこんなコマンドをなんの気なしに打ってみました。

```bash
sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
```


それでもnpmはエラー。

しかもVagrantがシャットダウンも起動もできない。

調べてみるとどうも/usr/bin以下の権限がrootから変わってしまった模様。。。

```bash
$ ll /usr/
dr-xr-xr-x.  2 hogehoge root 28672  3月 23 08:37 bin
```

su、sudoコマンドの権限まで変わってしまったのが問題ぽい。

```bash
$ ll /usr/bin/
︙
-rwxr-xr-x.   1 hogehoge root       32184  4月 11  2018 su
---x--x--x.   1 hogehoge root      143184  4月 11  2018 sudo
︙
```

この状態でrootログインしようとするとエラーになってしまう。

```bash
$ su -
Password: 
su: Authentication failure
```

いろいろ調べてみたんだけど、root権限になれない時点で何もできず。
環境を作り直すのが一番良さそうという結論に。。。

はーーーVagrant上でよかった。。。
Mac上とかでやってたらやばかったかも…。

見かけたコマンドをなにも考えずに叩いてしまうのはよくないですね。
対戦オセロwebapi

#概要

対戦オセロwebapiを作ってみる。
石を作る。
サイズは、120*40

#写真

![isi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3eb0e574-d406-2e74-f281-5af129a05846.png)


#サンプルコード

```
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(0, 40);
ctx.lineTo(120, 40);
ctx.lineTo(120, 0);
ctx.lineTo(0, 0);
ctx.moveTo(40, 0);
ctx.lineTo(40, 40);
ctx.moveTo(80, 0);
ctx.lineTo(80, 40);
ctx.closePath();
ctx.fillStyle = "limegreen";
ctx.fill();
ctx.strokeStyle = "black";
ctx.lineWidth = 1;
ctx.stroke();
ctx.beginPath();
ctx.fillStyle = "black";
ctx.arc(20, 20, 18, Math.PI * 2, 0, false);
ctx.fill();
ctx.closePath();
ctx.beginPath();
ctx.fillStyle = "white";
ctx.arc(100, 20, 17, Math.PI * 2, 0, false);
ctx.fill();
ctx.closePath();
```

#成果物

https://embed.plnkr.co/plunk/iE7KA2fk6jnCFIgt

以上。
BigQueryにローカルのcsvファイルをインポート


# 環境
- MacOS X 10.14.5 (Mojave)
- Homebrew 2.2.5
- Google Cloud SDK 281.0.0
- bq 2.0.53


# GCPアカウント登録
[【画像で説明】Google Cloud Platform (GCP)の無料トライアルでアカウント登録](https://qiita.com/komiya_____/items/14bd06d0866f182ae912)


# Google Cloud SDKのインストール
[Google Cloud SDKのインストール ~ 初期化](https://qiita.com/komiya_____/items/5af0dcc8639fad9fee29)


# プロジェクト作成
[Google Cloud SDKでプロジェクトを作成する](https://qiita.com/komiya_____/items/fb02f38e1886db280d52)

# サービスアカウント / サービスアカウントキーの作成
PythonからGCSにアクセスできるうようにするため、サービスアカウント / サービスアカウントキーを作成します。

### サービスアカウント作成

```bash
gcloud iam service-accounts create サービスアカウントネーム \
                                   --display-name サービスアカウントディスプレイネーム \
```
<img width="1137" alt="スクリーンショット 2020-02-10 0.10.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/f50a8e15-dd4f-f488-846b-c6fdf0d8bf85.png">

### 今プロジェクトに紐付いている権限を確認

```bash
gcloud projects get-iam-policy mypj-id

# bindings:
# - members:
#   - user:anata_no_address@gmail.com
#   role: roles/owner
# etag: BwWeTrntoao=
# version: 1
```


### サービスアカウントへ権限付与
BigQuery管理者の権限を付与

```bash
gcloud projects add-iam-policy-binding プロジェクトID \
--member serviceAccount:サービスアカウントネーム@プロジェクトID.iam.gserviceaccount.com \
--role roles/bigquery.admin
```
<img width="1137" alt="スクリーンショット 2020-02-10 0.16.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/d01bb796-0ab7-211a-2d56-05b7d14bb7aa.png">

### roleリスト
https://cloud.google.com/iam/docs/understanding-roles?hl=ja#predefined_roles


### 再度権限を確認

```bash
gcloud projects get-iam-policy mypj-id

# bindings:
# - members:
#   - user:anata_no_address@gmail.com
#   role: roles/owner
# - members:
#   - serviceAccount:mysa-name@mypj-id.iam.gserviceaccount.com
#   role: roles/bigquery.admin
# etag: BwWeTz6vIBY=
# version: 1
```

# データセットを作成

```bash
bq --location US mk --dataset(-d) プロジェクトID:データセットID
```

# csvファイルの読み込み
※ テーブルは自動で作られます。

```bash
bq load \
--autodetect \ # スキーマの自動設定
--source_format CSV \
データセット名.テーブル名 \
local/path/to/file.csv
```
## テーブルの確認

```bash
bq ls

#  datasetId
# -----------
#  テーブル名
```

# 参照

https://cloud.google.com/bigquery/docs/loading-data-local?hl=ja
java bronze silver合格

大分前ですがOracle認定のJava bronzeとsilverのSE8合格しました。
bronzeもsilverも対策は一緒なのでひとまとめに。

# 勉強時間の目安(bronze)
1. プログラミング未経験：50h
1. 何らかのプログラミング言語を習得している：30h
1. java経験者：10h

いきなりsilverを受験する場合は+10h程度


# 参考資料
[黒本](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-Java-Silver-%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-808/dp/4844339931/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5+Java+SE+8+Silver+%E5%95%8F%E9%A1%8C%E9%9B%86&qid=1584927815&sr=8-1)と[白本](https://www.amazon.co.jp/%E3%82%AA%E3%83%A9%E3%82%AF%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8-Java%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E-Silver-SE-%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86/dp/4798142743/ref=sr_1_6?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5+Java+SE+8+Silver+%E5%95%8F%E9%A1%8C%E9%9B%86&qid=1584927815&sr=8-6)

# その他
受験するのにピアソンVUEとoracleの登録が必要になるので先に登録しておくことをオススメします。
結構面倒でした。
bronzeは自宅で受験可能です。
SVG を PNG に変換する

ImageMagick の `convert` だと失敗する SVG ファイルがあるので調べていたら、`librsvg` を直接呼べばいいらしい。

```bash
brew install librsvg
rsvg-convert --format=png --output=image.png image.svg
```
Wikipedia に使い方は書いてあった。https://en.wikipedia.org/wiki/Librsvg
【Go】インターフェース（タイプアサーション・switch type文）


どんな型が入るかわからない・なんでもOKの場合、
インターフェースを引数にして受け取る

[受け取ったときの処理]

・関数内でアサーションしてタイプを確定させる　例：a.(int)
・switch type文で型を判定するのも可能


・参考リンク：
https://blog.y-yuki.net/entry/2017/05/08/000000
【Go】インターフェース

[準備]

⓪メソッドらがある

①インターフェースに使いたいメソッドらを指定

②ストラクトを作る

③ストラクトを型にメソッドの処理をつくる (オーバーライド的な？)


[呼び出し]

①インターフェース型の変数を作る
②ストラクトを設定する
③そのストラクトの値でメソッドが実行される



メリット
・インターフェースの型を指定することで利用するメソッド、返り値を指定できる
・異なるストラクトでメソッドが利用できる



参考リンク：
https://dev.classmethod.jp/articles/golang-6/
https://qiita.com/rtok/items/46eadbf7b0b7a1b0eb08
https://medium.com/eureka-engineering/golang-embedded-ac43201cf772


◎ Stringer interface
・fmtパッケージに入っているインターフェース
文字を返すString()メソッドを持っている

・以下のようにインターフェースのメソッドを利用できる。
下記のように表示したいデータのみ表示させることができる。

```Go:

package main

import "fmt"

type Cat struct {
	Name string
	Age  int
}

// String()メソッドを利用すると名前だけ表示し
// 他の値は表示しないようにしたりできる
func (a Cat) String() string {
	return fmt.Sprintf("My name is %v.", a.Name)
}

func main() {
	cat := Cat{"Kuro", 18}
	fmt.Println(cat)
}

```

結果　（18は表示されない）

```
My name is Kuro.
```




◎ まとめ

予めあるメソッドはインターフェースを利用して
異なるストラクトでメソッドを定義できる