OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】ここが辛いよUnityさんっていう個人的な思い

# まえがき

Unityが一般的に流行りだして5～6年くらいですかね。
最初はおっかなびっくりしながら触っていましたけど
わぁなんて素敵なツールなんだろうとすぐに考えを改めた懐かしい思い出です。

Unityで作ったゲームをリリースしたこともあるけど
実はいうほどUnity使った開発はしたことない

だから浅い事を言っているかもしれないですが
ここが辛いよUnityさんっていう個人的な思いを適当に書きます。

# 君は誰に動かされてるんですか

プレイヤーだろうと敵だろうとだいたいは
沢山のゲームオブジェクトが集まっていると思います。

そしてあちこちにいろんなコンポーネントがくっついている。
まぁそれはいいとしよう

でもあちこでアップデートは動かないで

あちこちでアップデートされてると
一体こいつは誰に突き動かされいるんだぁあああ！！！
っていうコンポーネント捜索隊のお仕事が始まります。

なので個人的にはメインのスクリプト以外にはUpdateは書きたくない。

# Updateの順番だって大事だよ

Execution Order?でしたっけ
コンポーネントのUpdate順を制御するやつ

ゲームではこの処理をしてから、この処理を動かしたいという事は往々にしてあるはず
しかしそういう動作順序なんかはプログラム外で制御したくないという気持ち。
Execution Orderでちまちま指定するのもめんどっちぃ

あとコンポーネント単位で順番を制御できてもあまり利点がないというか
わかりにくいというかこのオブジェクトを先に処理したいっていう感覚。


# FixedUpdateでカオス

衝突検知でRigidBodyを使い始めると

FixedUpdate「ねぇねぇ、使ってよ」

やってきますねこいつが。

FixedUpdateとUpdateは必ず1:1でコールされるわけではなく
なんとも御しがたい機構だなと思います。

衝突検知はいいんだけどね、ポジションの制御が鬱。
もう自分で衝突処理書くよって言いたくなるけど
書き始めるとなんでUnity使ってるんだっけ？と自問自答が始まり手が止まる。

# エディター依存の恐怖

エディターで簡単に値いじれて調整できてトライ&エラーが早い！
というわけでエディタでバランス調整したりしてたけど

プログラマーとしては精密機器を扱ってる部屋を一般公開したようで落ち着かない。

エディタに設定された値の整合性チェックとか総合チェックとかするなら
最後までエディターっで調整ってのは嫌で
デバッグとかモック作成の時だけの用途にしたい。

あとプレハブ事に調整したりとかで一括で見づらいというか
設定があちこちに散らばるイメージがある。
それようにエディタカスタマイズして作ればいいんだけどね。。

# 完成までのこり10%の10%が遅々として進まぬ

モック作成はめちゃはやいしやりやすい。
90%まで作るのはえらい楽です。
ただ製品版として100%にするのがなぜか前半の90%よりしんどい

# そもそもコンポーネント思考って

もともとあったものにコンポーネントを追加するだけで、違う性質のものになる
っていうのは素敵だと思うけど、現実そう簡単にはいきませぬ。

要するに委譲だと思うんすよね。
１つのクラスに沢山処理書くと可読性悪くなるのでクラスを小分けにしましょう。
分けたクラスをメンバ変数で持ちましょう(isではなくhasだ!)

ってやってたのがGetComponentでとってくるようになっただけで
根本はそんな変わってない。

ただ独立して動けるUpdateを持ってしまっているところが恐ろしいのじゃ。
人はあれば使ってしまう生き物なのじゃ。。。



# まとめ
まとまりもなくただただ駄文を書き連ねてしまいました。

たしかにUnityは便利なんだけど

リソースエディタとしてとか動作確認ツールとして優秀
でも開発環境としては御しきれないという印象。
俺のスキルの問題なんだろうなと思うけど。。。

どうやったらこのUnityを綺麗に制御できるんだろうっていう答えがなかなか出てこない。
色んなやり方があるにしても、どれもこれもうーんってなる。

やっぱゲームの根本はC/C++でごりごりに書けるほうがやりやすい。
欲を言えばC#で使えるような便利な機構が使えるC/C++が欲しい。
そう思うわけでした。
【Android】画面回転時に表示内容を修復する。【onWindowFocusChanged】


## 困ったこと

<img width="1116" alt="スクリーンショット 2018-04-18 19.03.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/91182/bd02dd59-4bdc-c5c0-7e44-f3bd8a06f4f6.png">


図のように画面が回転したときも検索結果が表示され続けるようにしたかったとします。
画面回転時はActivity/Fragmentが再生されるので、Fragment#onRestore時にEditText#dispatchKeyEventを用いて検索イベントを発行すれば検索結果も復元できると考えました。
しかし結果は何も起こりませんでした。

## 何が起こっていたか。

EditText#dispatchKeyEventの結果はfalseでした。
検証してみると、Fragment#onRestoreが実行されたあとにいくらか経ってから以下のSearchViewModel#setOnKeyListener()が実行されていました。

```java:ViewModel

public class SearchViewModel {
  ...
  public View.OnKeyListener setOnKeyListener() {
      return new View.OnKeyListener() {
          @Override
          public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
            ...
            return true;
          }
      };
  }
  ...
}

```

```xml:レイアウト
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable name="viewModel"
            type="xxx.SearchViewModel" />
    </data>

    <RelativeLayout
        android:id="@+id/search_fragment_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:id="@+id/search_edit_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Keyword"
            android:inputType="text"
            android:onKey="@{viewModel.setOnKeyListener}">
        </EditText>

</layout>

```

## 解決方法

OnWindowFocusChangeListener#onWindowFocusChangedをつかいました。
例えばこうするとViewが生成されてDataBindingの解決もされたあとにやりたいことが実行されるように仕込むことができます。

```java
View view = binding.getRoot().findViewById(R.id.search_fragment_container);
view.getViewTreeObserver().addOnWindowFocusChangeListener(new ViewTreeObserver.OnWindowFocusChangeListener() {
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        ...
        //やりたいこと
        editText.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ENTER));
    }
});

```
文字列にプレースホルダを使用する

Rubyでは使ってたけどそういえばkotlinでどうなんだ?と思い調べてみた
`.format` で `%s` を置換できた

```kotlin
val foo = "foo%s"
println(foo.format("bar")) // foobar
```

複数でもできる

```kotlin
val foo = "foo%s%s"
println(foo.format("bar", "baz")) // foobarbaz
```
Railsの配列をランダムで取得して、○件のみ表示とする

# やりたかったこと

```ruby:hoge_cotroller.rb
@data= [
  ['aaa','AAA','あああ'],
  ['bbb','BBB','いいい'],
  ['ccc','CCC','ううう'],
  ['ddd','DDD','えええ'],
]
```
みたいな配列を

ランダムに取得してきて、それを5件だけview側に表示する。

ということをやりたかったので、調べてみました。

# 解決策

 [こちら](http://qiita.com)を参考に下記のようにしました。

```ruby:hoge_cotroller.rb
@data= [
  ['aaa','AAA','http://aaa.com'],
  ['bbb','BBB','http://bbb.com'],
  ['ccc','CCC','http://ccc.com'],
  ['ddd','DDD','http://ddd.com'],
・・・・・・・（中略）
  ['zzz','ZZZ','http://zzz.com'],
].sample(5)

```

```erb:hoge.html.erb
<ul>
  <% @data.each do |html_class, text, url| %>
    <li>
      <%= link_to text, url, class: html_class %>
   </li>
  <% end %>
</ul>
```
Javaでresourcesに配置したテキストファイルがjar化すると読み込めません

jar化した時にリソースの参照が出来ません。

１．EclipseでMavenプロジェクトを作成。（特にMavenに関係する事象では無いと思いますが）

２．src/main/resources配下にフォルダーを作成してテキストファイルを配置する。

３．リソースを読み込んでSystem.out.printlnする処理を作成。

このような状況で、Eclipseから実行すると正しくテキストファイルの中身が出力されるのですが、Eclipseでjarにエクスポートして実行すると、参照できず例外が発生します。

■ Eclipseで定義している内容とテスト実行してFile1.txtの中身が出力されている実行結果のイメージです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/88706/5344612f-91e9-04fe-77cd-3519f45aae28.png)

■ Jar化したファイルの中身を確認してFile1.txtが含まれていることを確認したうえで実行するとNull参照例外が発生した時のイメージです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/88706/cd5a60ad-c389-e638-4464-207d543a3a65.png)

jar化した状態で正しくリソース参照する場合の設定が有ったり、ロジックに問題が有るのかもしれませんが、手掛かりがつかめない状況です。

なにか、想定される問題点等あれば教えて頂けないでしょうか？
Amazon RDS for MySQL同士でデータコピー（シェルスクリプト）

# 前提
**"Amazon RDS for MySQL"**インスタンス2台
 （*mysql1, mysql2*と表記）

mysql1とmysql2でテーブル定義が同じであるようなテーブル(1GB程度)が複数ある。
例えば、ステージング環境と本番環境。

シェルスクリプトを動かす**EC2** 1台用意済みとする。

# やりたいこと
mysql1からmysql2へ下記5テーブルをコピーしたい。

 - table_name1
 - table_name2
 - table_name3
 - table_name4
 - table_name5

# コード
対象テーブルのDB名はmysql1もmysql2も共通で、*db_name*とした場合。

```sh:table_copy.sh
#!/bin/bash
function tablecp {
    # CSVファイル削除
    rm -f data_$1.csv
    # CSVファイルにエクスポート
    mysql -h mysql1.**************.ap-northeast-1.rds.amazonaws.com -P 3306 -u root db_name -e "SELECT * FROM $1"  | sed -e 's/^/"/g' | sed -e 's/$/"/g' | sed -e 's/\t/","/g' | sed -e 's/"NULL"/NULL/g' > data_$1.csv
    # テーブルを空にする
    mysql -h mysql2.**************.ap-northeast-1.rds.amazonaws.com -P 3306 -u root db_name -e "truncate table $1"
    # CSVファイルをインポート
    mysql -h mysql2.**************.ap-northeast-1.rds.amazonaws.com -P 3306 -u root db_name -e "LOAD DATA LOCAL INFILE 'data_$1.csv' INTO TABLE $1 FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES;"
    # CSVファイル削除
    rm -f data_$1.csv
}

tablecp table_name1
tablecp table_name2
tablecp table_name3
tablecp table_name4
tablecp table_name5
```
Google Maps APIでpolygon編集時にイベントを発生させる。

### 課題
Google Map上に表示したpolygonを編集した際に、緯度経度を取得したい。
`set_at`イベントをaddListenerすると、ドラッグ中もイベントが発火して動きが重くなってしまう。

### 対応方法
以下の方法で、ドラッグ中は`set_at`イベントを発火しないようにした。

1. Google Map初期化時に`set_at`イベントを`addListener`。
1. `dragstart`イベントで`set_at`イベントをクリア。
1. `dragend`イベントで緯度経度を取得しつつ、再び`set_at`イベントを`addListener`。

```javascript
// Google Map初期化
initMap = () => { 
  const defaultCenter = {
    lat: xxx,
    lng: xxx,
  }
  const map = new google.maps.Map(document.getElementById('map'), {
    center: new window.google.maps.LatLng(defaultCenter.lat, defaultCenter.lng),
    zoom: 13
  });

  const polygonArea = new google.maps.Polygon({
    ...
    draggable: true,
    editable: true,
  })
  polygonArea.setMap(map)

  // set_atイベントをaddListener。
  this.addListenerSetAtToPolygonPath(polygonArea)

  google.maps.event.addListener(polygonArea.getPath(), 'insert_at', () => {
    this.setCoode(polygonArea)
  });

  google.maps.event.addListener(polygonArea, 'dragstart', () => {
    // set_atイベントをクリア。
    google.maps.event.clearListeners(polygonArea.getPath(), 'set_at')
  });

  google.maps.event.addListener(polygonArea, 'dragend', () => {
    this.setCoode(polygonArea)
    // set_atイベントをaddListener。
    this.addListenerSetAtToPolygonPath(polygonArea)
  });

  this.setCoode(polygonArea)
  console.log('map is open')
  console.log(map)
}

// polygonPathの編集時にイベント追加
addListenerSetAtToPolygonPath = (polygonArea) => {
  google.maps.event.addListener(polygonArea.getPath(), 'set_at', () => {
    this.setCoode(polygonArea)
  });
}

setCoode = (polygon) => {
  //polygonの緯度経度取得。
}
```

もっと良いやり方があれば教えてください。

### 参考
- [図形#編集イベントをリッスンする  \|  Google Maps JavaScript API  \|  Google Developers](https://developers.google.com/maps/documentation/javascript/shapes#editable_events)
- [イベント#イベントリスナを削除する  \|  Google Maps JavaScript API  \|  Google Developers](https://developers.google.com/maps/documentation/javascript/events?hl=ja#removing)
【CSS】Focus時のInputをいい感じにする

## 完成品イメージ
InputにFocusした時に↓のように下線が広がるようにします。

![focus-css.gif](https://qiita-image-store.s3.amazonaws.com/0/192435/ec0d6c31-ae8b-247f-74fc-d4fdf76b9d39.gif)

CSSだけでつくれちゃいます。

## サンプルコード

### HTML

```index.html
<input class="input">
<div class ="underline"></div>
```

### CSS

```style.css
.input {
  width: 200px;
  height: 30px;
  font-size: 16px;
  border: none;
  outline: 0;
  border-bottom: 1px solid #d1d5db;
}

.underline {
  width: 200px;
  height: 2px;
  background: skyBlue;
  transform-origin: center center;
  transform: scaleX(0);
  transition: transform 0.18s ease-out;
}

.input:focus + .underline {
    transform: scaleX(1);
  }
```

ポイントは、*.input:focus + .underline* でFocus時に自身の要素(input)ではない要素(.underline)のCSSを変えていることです。
*+*セレクタは隣接する要素に適応されます。

手軽に使えるので、ちょっとしたアクセントにお試しください。
Installing RKernel on Windows JupyterLab

# installing R with conda

conda install -c conda-forge r

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/6e021e8e-3a4a-22f1-4057-56da48d6a62d.png)

Proceed ([y]/n)? y

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/b0789c13-8792-ea5a-d5de-507d8aea81ff.png)

# run R console
```
which r
r
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/d118cd5f-6e10-cafc-1ea5-2fcf6b39c0c4.png)

# install IRKernel

```
install.packages(c('repr', 'IRdisplay', 'evaluate', 'crayon', 'pbdZMQ', 'devtools', 'uuid', 'digest'))
devtools::install_github('IRkernel/IRkernel')
```

you can select Japan CRAN mirror
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/7358936a-15cc-9291-c253-6948f18f360e.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/84885cf0-682c-238e-5c1d-ddd08a52eb06.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/3afbb36c-c672-49d4-7180-3037f71c6665.png)

install Rkernel on current environment
```
IRkernel::installspec()
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/3b2164cc-e6b2-050a-8e74-6f2adc01f47b.png)

exit RTerm with `q()` coomand and run `jupyter lab` again.

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/2ac47af5-750c-0fe2-ed8f-bf839f16543c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/68ff129f-3dbd-83e7-e971-c9631fa45289.png)

# check Rkernel

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12587/2ec01167-aff4-4be1-726d-7c7854771897.png)


# ref
irkernel installation
https://irkernel.github.io/installation/

Producing Simple Graphs with R
https://www.harding.edu/fmccown/r/
アプリ内のWebView画面をデバッグする。（Unityビルドアプリでテスト）


①：iPhone側で「設定」→「Safari」→「詳細」→「Webインスペクタ」をONにする。

②：iPhoneをMacに接続する。

③：Mac側でSafariを立ち上げる

④：「環境設定」→メニューバーに開発メニューを表示をONにする。

⑤：iPhone側でアプリを立ち上げ、WebViewの画面を表示する。

⑥：Mac側でSafariの「開発」メニューより接続しているiPhoneを選択し、アプリが選択できるようになっているので
　　選択する。

⑦：ログ等が表示される

⑧：WebView画面内で操作をして、情報が取得できている事を確認


参考URL：https://www.tam-tam.co.jp/tipsnote/html_css/post12114.html
dockerで連番のportをforwardする

docker runのmanに以下のように書いてあります。

>       -p, --publish=[]
          Publish a container's port, or range of ports, to the host.

>        Format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort Both hostPort and containerPort can be specified as a range of ports.  When
       specifying ranges for both, the number of container ports in the range must match the number of host ports in the range.  (e.g., docker run -p 1234-1236:1222-1224 --name
       thisWorks -t busybox but not docker run -p 1230-1236:1230-1240 --name RangeContainerPortsBiggerThanRangeHostPorts -t busybox) With ip: docker run -p
       127.0.0.1:$HOSTPORT:$CONTAINERPORT --name CONTAINER -t someimage Use docker port to see the actual mapping: docker port CONTAINER $CONTAINERPORT

なので、`-p 1234-1236:1222-1224`という形式で指定ができるようですね。

```
$ docker run -itd --name renban -p 1234-1236:1222-1224/udp ubuntu
bdee0c27e5c6ead4ff5c1bdd615e02111d27a0ec41d4d70905dc60a662aa45f9
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                                                    NAMES
bdee0c27e5c6        ubuntu              "/bin/bash"         4 seconds ago       Up 1 second         0.0.0.0:1234->1222/udp, 0.0.0.0:1235->1223/udp, 0.0.0.0:1236->1224/udp   renban
```

設定できました。
終わり。
RailsでGETメソッドのクエリストリングで配列を渡したい時にどうするか

## 考えられるパターン

### 1. 変数名に[]を付けるパターン
```
https://example.com/hoge&jobs[]=foo&jobs[]=bar
```

- `params[:jobs]` で配列を取得できる
- URLが冗長

### 2. カンマ区切りで渡すパターン
```
https://example.com/hoge&jobs=foo,bar
```

- `params[:jobs].split(',')` で配列を取得できる
- URLがスッキリする

## 結論
[Array に to_query メソッドが存在した](https://apidock.com/rails/Array/to_query)ので、その実行結果に従うと良さそう。

```console:console
pry(main)> ["hoge", "piyo"].to_query("jobs")
=> "jobs%5B%5D=hoge&jobs%5B%5D=piyo"
```

ということで、Rails Wayに従うと、**「 1. 変数名に[]を付けるパターン 」** を採用するのが良さそう。
`[]` をURLエンコードした `%5B%5D` を使用する。
最終的なRails Wayに従ったURLの形は下記となる。

```
https://example.com/hoge&jobs%5B%5D=hoge&jobs%5B%5D=piyo
```

## 参考
[php - How to pass an array within a query string? - Stack Overflow](https://stackoverflow.com/questions/6243051/how-to-pass-an-array-within-a-query-string)
[http - Passing array of parameters through get in rails - Stack Overflow](https://stackoverflow.com/questions/11312930/passing-array-of-parameters-through-get-in-rails)
【Ethereum】WindowsでTruffleを使ってSolidity開発

#はじめに
ごっついGPUを搭載したPCを買った。(買ってもらった)
暗号通貨のマイニングだけではもったいないのでDappsでも開発してみようかと情報収集。
独自通貨(独自トークン)を作るサンプルを見つけるもその通り実施したがエラーで動かず。

開発環境やツールのバージョンアップが激しいので3か月前の情報では古くてそのまま動かない昨今、
みなさんのお役に立てるように情報共有させていただきます。

この内容も3か月後には古くなっていることもありえるのでご注意ください。

#参考にしたサイト
>[Ropstenのテストネット上でERC20トークンを作成・送付してみる](https://tech.pepabo.com/2017/12/06/erc20-token-on-ropsten/)

[GMOペパボ](https://tech.pepabo.com/)さんのテック系ブログです。
独自暗号通貨を作ってみるという先進的な取り組みをされています。

#問題点1
TruffleのWindowsへのインストールは問題無くすんなりといきました。
しかしながらいざコマンドを打つとOSが反応して処理をフックしているような感じで動きません。
そこで以下のように **truffle.cmd** と打てば問題なく実行されます。

```
truffle.cmd compile
truffle.cmd develop
```

#問題点2
zeppelin-solidityというライブラリをインストールしてインポートしますが、
コンパイルするとエラー(ワーニング)がでます。
どうやらsolidityの現時点での最新版(0.4.19以降?)はイベントを呼び出す際に
**emit** という予約語を追加する仕様変更があったようです。

現時点ではワーニングレベルで問題ありませんが、この先はエラーになる可能性があります。
その際はzeppelin-solidityが対応していない場合はソースを編集しましょう。

#最後に
ブロックチェーンの開発はLinux系が標準のようでWindows、さらに言うと日本語の情報は少ないです。
エラーの内容は英語版のStackOverflowをじっくり翻訳しながら調べるしかありません。

日本を盛り上げていきましょう。
SourceTreeからGitHubへのSSH接続で事故った話

##事の発端
SourceTreeでローカルのリポジトリをGitHubにプッシュしようと思ったら、特にエラーコードが出るわけでもなく延々と終わらなかったんですよ。
SSHキーを作り直したりSourceTreeを再インストールしたりGitそのものを更新したり色々試しましたが中々進展せず。
同様にGitでプッシュできない、SourceTreeからプッシュできないというトラブルシューティングは多数あったのですが、どれも解決には至らず心が折れかかっていたのですが、ようやく打開できたのでその方法を公開します。

##原因
###SSHクライアントの初期設定が上手くなかった
実は今使っているPCでSourceTreeを使うのは結構ご無沙汰で、使う前に最新版に更新させたんですよ。
そこで設定が書き変わっちゃったんですかねぇ、SSHクライアントの設定が「PuTTY/Plink」ではなく「OpenSSH」になってたんです。
一見すると「OpenSSH」なんて如何にもスタンダードな雰囲気の名前ですが、確かに以前SSH接続していた時はPuTTYを使っていました。

##対処方法
* ツール＞オプション＞全般＞SSHクライアントの設定＞SSHクライアント を「PuTTY/Plink」に変更する
* ツール＞SSHキーの作成/インポート よりキーの作成またはインポートを行う

SSHキーの登録について、SourceTreeの付属ではない単体のPuTTYがインストールされている場合、そちらの登録とは別扱いになるみたいです。
同じ鍵が使えますが、SourceTreeのメニューから開けるPuTTYから登録する必要があります。
SSHキーの作成、登録方法は他に解説されている方が多くいらっしゃるので、そちらに譲らせていただきます。

##検証環境
- SourceTree2.4.8.0
- Windows8.1(x64)

同じ案件で困っている方の助けになれば幸いです。
特定の拡張子ファイルの権限を変更する

特定フォルダ以下の～.bashだけをchmodとかchownしたいとき

```bash:カレントディレクトリ以下の～.bashファイルのアクセス権を700に変更する
find ./ -name "*.bash" | xargs chmod 700
```

```bash:カレントディレクトリ以下の～.bashファイルの所有者をroot:rootに変更する
find ./ -name "*.bash" | xargs chown root:root
```
「明日の開発カンファレンス 2018」- ちょっとしたまとめ


# 概要
「明日の開発カンファレンス 2018」にいってきましたので、発表内容などを簡単に整理したいので、この記事を書きました。メモ程度です。

# まとめ

| No     |       内容 |    備考   |
|:-----------------|:-----------------:|:------------------|
| 1    | [明日の開発カンファレンス 2018](http://asucon.alleyoop.jp/)| 公式ページ| 
|2|[明日の開発カンファレンス 2018 に行ってきた](https://qiita.com/fnifni/items/d1eb998d23fb75e4db7b)|参加者のQiita記事<br>自分が書いたメモより良かったので、こちらを共有|
|3|[新卒3年目のぼくが、でぶおぷす???なエンプラ金融PJにAnsibleを導入してみた](https://www.slideshare.net/taroshun/3ojisanansible)|フューチャー株式会社の人<br>発表内容が面白かった<br>導入までのプロセスをしっかり、参考になる<br>新卒3年目なのに、Ansibleの導入も発表もよくやった。|
|4|カイゼン・ジャーニー 〜たった一人からはじめて、「越境」するチームをつくるまで〜|会社員、エンジニアとして一回見るべきもの<br>発表スライド現在まだ上がっていないが、下記スライドのマージしたもの<br>1: [ジャーニーは、いつだって一人から。](https://www.slideshare.net/papanda/ss-92876806)<br>2: [越境・ジャーニー](https://www.slideshare.net/papanda/ss-90788372)<br>3: [カイゼン・ジャーニー Can we change the world?](https://www.slideshare.net/papanda/can-we-change-the-world-88022989)|
|5|脆弱性検知ツール [Vuls](https://vuls.io/)|日本製、開発者はフューチャー株式会社　神戸康多さん　<br>VulsはOSSもSaaSもあり<br>GitHub: [vuls](https://github.com/future-architect/vuls)<br>16年に自分も触ってみたことある、非常に便利なツールだった。<br>※興味ある方は下記のQiita記事にて<br>[(意外と簡単)EC2とDockerを使って、脆弱性診断ツールVulsを触ってみました!](https://qiita.com/jobbin/items/468770283df7fb203637)<br>※2016年のものなので、UIがだいぶ変わったと思います<br>※相当進化したらしい
EthereumのPopulusで_pytest.vendored_packages.pluggy.PluginValidationErrorが出たときの対処法

# 環境
populus 2.2.0

# 現象
```
_pytest.vendored_packages.pluggy.PluginValidationError: Plugin 'ethereum' could not be loaded:
(eth-utils 0.8.1 (/Users/hidehiro/.pyenv/versions/anaconda3-5.0.0/lib/python3.6/site-packages), Requirement.parse('eth-utils==0.7.*'), {'eth-abi'})!
```

# 対処
`pip install --force-reinstall eth-utils==0.7.4`
PowerShellでリストアしたデータベースのユーザーマッピングを修正する

# リストアしたデータベースのユーザーマッピングを修正する

ログインユーザーを作成してからリストアしてもユーザーマッピングが不正になってしまう。
しょうがないからリストア後にユーザマッピングを修正する。

## ログインユーザーを作成する

``` sql
use master
CREATE LOGIN [apuser] WITH 
    PASSWORD=N'apuser', 
    DEFAULT_DATABASE=[master], 
    DEFAULT_LANGUAGE=[日本語], 
    CHECK_EXPIRATION=OFF, 
    CHECK_POLICY=OFF
GO
ALTER LOGIN [apuser] ENABLE
GO
```

``` powershell
$newDBServerName = "NEW"
$userName = "sa"
$password = "password"
$scriptDir=Split-Path $MyInvocation.MyCommand.Path -Parent
$createLoginUserSQL = $scriptDir + "\..\SQL\createLoginUser.sql"

sqlcmd -S $newDBServerName -U $userName -P $password -i $createLoginUserSQL
```

## ユーザーマッピングを修正する

リストアしたデータベースのユーザーとログインユーザーをマッピングしなおす。

``` sql
USE TEST
EXEC sp_change_users_login 'Update_One', 'apuser', 'apuser'
GO
```

``` powershell
$newDBServerName = "NEW"
$userName = "sa"
$password = "password"
$scriptDir=Split-Path $MyInvocation.MyCommand.Path -Parent
$modifyUserMappingSQL = $scriptDir + "\..\SQL\modifyUserMapping.sql"

sqlcmd -S $newDBServerName -U $userName -P $password -i $modifyUserMappingSQL
```

## まとめ

これでDBサーバーの構築が自動化できそうだ。。。

``` powershell
$newDBServerName = "NEW"
$userName = "sa"
$password = "password"
$scriptDir=Split-Path $MyInvocation.MyCommand.Path -Parent
$createLoginUserSQL = $scriptDir + "\..\SQL\createLoginUser.sql"
$modifyUserMappingSQL = $scriptDir + "\..\SQL\modifyUserMapping.sql"

# ログインユーザー作成
sqlcmd -S $newDBServerName -U $userName -P $password -i $createLoginUserSQL

# ユーザーマッピング修正
sqlcmd -S $newDBServerName -U $userName -P $password -i $modifyUserMappingSQL
```
LoopbackのAPIサンプルをMySQLに変更するステップ

LoopbackはオープンソースのBaaSです。大元はIBMに買収されたようですが、フレームワークはオープンソースとして公開されています。

[LoopBack - Node.js framework](https://loopback.io/)

デモ的なアプリが認証、トークン周りを含んでいて良い感じです。これをベースに拡張していこうと思った時にデータベースを用意するかと思います（デフォルトはオンメモリ）。MongoDBは運用大変なイメージしかないのでMySQLを使ってみます。

## データソースの追加

```
$ lb datasource
```

後はウィザードに沿って答えていくだけ。ライブラリのインストールもやってくれます。

```
$ lb datasource
? データ・ソース名を入力してください: mysql
? mysql のコネクターを選択します: MySQL (StrongLoop でサポートされます)
? Connection String url to override other settings (eg: mysql://user:pass@host/db): mysql://xxx:yyy@127.0.0.1/zzz
? host: 127.0.0.1
? port: 
? user: xxx
? password: ******
? database: zzz
? loopback-connector-mysql@^2.2 のインストール Yes
+ loopback-connector-mysql@2.4.1
```

## モデルのリソース変更

Loopbackはモデルごとにリソースが設定できるようです。 `server/model-config.json` を編集します。

```javascript
  "User": {
    "dataSource": "mysql" // <- db から自分で指定したリソース名に変更
  },
```

他のリソースもすべて変更します。

## テーブル作成

で、既存のスキーマはオンメモリに展開されているのでMySQLに展開します。 [Creating a database schema from models | LoopBack Documentation](https://loopback.io/doc/en/lb3/Creating-a-database-schema-from-models.html#auto-migrate)にあるのですが、 `server/create-lb-tables.js` を作成します。

```javascript
var server = require('./server');
var ds = server.dataSources.mysql; // <- mysql は自分で指定したリソース名
var lbTables = ['User', 'AccessToken', 'ACL', 'RoleMapping', 'Role'];
ds.automigrate(lbTables, function(er) {
  if (er) throw er;
  console.log('Loopback tables [' + lbTables + '] created in ', ds.adapter.name);
  ds.disconnect();
});
```

これでテーブルができあがってハッピー！
ZabbixでRaspberry Pi 3のCPU温度を監視

# ZabbixでRaspberry Pi 3のCPU温度を監視

## 環境

* Raspberry pi 3
* Zabbix 3.4

## zabbix_agentd.conf の編集

以下を追加

``` zabbix_agentd.conf
UserParameter=system.cpu.temperature,cat /sys/class/thermal/thermal_zone0/temp
```

Zabbix agent を再起動

## Zabbixアイテム追加

### アイテム

| 項目 | Value |
|---|---|
| 名前 | CPU temperature |
| タイプ | Zabbixエージェント |
| キー | system.cpu.temperature |
| ホストインターフェース | 任意 |
| データ型 | 数値(浮動少数) |
| 単位 | ℃(任意 図ではC) |
| 更新間隔 | 1m (任意) |

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150940/a4f1a9ea-ac1a-f96e-fd35-17a72cdd2a6d.png)

### 保存前処理

| 名前 | パラメータ |
|---|---|
| 乗数 | 0.001 |

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150940/634d0a61-4e57-aa5b-bea5-c4f99d79f5ef.png)


## 結果

1日取ってみましたがいい具合です
環境：ヒートシンクのみ

![chart.png](https://qiita-image-store.s3.amazonaws.com/0/150940/ec7b9854-fbd0-27cd-c0ef-29bb56ef9048.png)
MATLAB LiveScriptでコピペできない問題の解決

LiveScriptについては[ここを参照](http://ossyaritoori.hatenablog.com/entry/2018/04/17/MATLAB_LiveScript%E3%81%A7%E5%A0%B1%E5%91%8A%E6%9B%B8%E4%BD%9C%E6%88%90)

## Windows10のMATLABのLiveScriptでコピペできない

原因はここにあるとおり，クリップボードのデータをWindowsのプログラムが勝手に消してしまうから。
https://jp.mathworks.com/matlabcentral/answers/394091-2018a-copy-paste-not-working-live-scripts


コマンドプロンプトを管理者権限で実行して以下のコードを走らせる。

```
schtasks.exe /change /TN “\Microsoft\Windows\DiskCleanup\SilentCleanup” /Disable
```

一方でこの変更を元に戻す場合はこうする。

```
schtasks.exe /change /TN “\Microsoft\Windows\DiskCleanup\SilentCleanup” /Disable
```
ウィンドウ作成

※自分の勉強用のメモとして使っています。

環境:Windous 10、Visual Studio 2012

##ウィンドウの追加+レイアウトとコントロール
初めにソリューションエクスプローラーでプロジェクトをの選択して右クリック、
真ん中あたりにある追加からウィンドウの追加を選んで追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/151a4653-68b9-1c29-bd61-656cd427fef9.png)
追加したら Title、Width、Height、WindowStyleを指定しておく。
次にxamlファイル内の
Gridと/Gridの間に

Grid.ColumnDefinitions
ColumnDefinitions 大きさ/ (追加したい列の分だけ)
/Grid.ColumnDefinitionsと
Grid.RowDefinitions
RowDefinitions　大きさ/ (こちらも追加したい行の分だけ)
/Grid.RowDefinitionsを追記したあと

/Grid.RowDefinitionsの下に

(データを記入する用)
TextBlock Grid.column="列" Grid.Row="行"
VerticalAlignment="配置" Text="文字列"/
ComboBox Grid.column="列" Grid.Row="行"
Margin="余白"

(日付を記入する用)
TextBlock Grid.column="列" Grid.Row="行"
VerticalAlignment="配置" Text="文字列"/
DatePicker Grid.column="列" Grid.Row="行"
Margin="余白"

(文字列を記入する用なので必要な分だけ)
TextBlock Grid.column="列" Grid.Row="行"
VerticalAlignment="配置" Text="文字列"/
TextBox　Grid.column="指定したい列" Grid.Row="行"
Margin="余白"

(エラーメッセージを出す用)
TextBlock Grid.column="列" Grid.Row="行"
Grid.ColumnSpan="このセルを含めた横方向の結合セルの数"
HorizontalAlignment="横方向の配置の指定"
Foreground="メッセージの色"

(コマンド項目に関するコントロールの配置用)
StackPanel Grid.column="列" Grid.Row="行"
Grid.ColumnSpan="このセルを含めた横方向の結合セルの数"
HorizontalAlignment="横方向の配置の指定"

(ボタンの配置設定)
Button Margin="余白" Width="ボタンの横幅" Content="ボタンの中の文字列"
を追記して
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/0e886452-5805-3267-2c59-08d1bcb0c198.png)
次にスタイルを設定する。
Title、Width、Height、WindowStyleとGridの間に
Window.Resources
/Window.Resourcesを追記、中に

Style Target="スタイルを適用したいターゲット名"
Setter Property="設定したいプロパティ" Value="プロパティの数値"
/Style
をスタイルを適用したいプロパティの数だけ追記

Style x:Key="適用したいStyleプロパティ" TargetType="適用したいターゲット"
Setter Property="横方向の配置の指定" Value="位置"/
Setter Property="適用したいプロパティ" Value="色"/
/Styleを記入して
設定したプロパティと同じのをGridの中から削除して
エラーメッセージを出す用の
TextBlock Grid.column="列" Grid.Row="行"
Grid.ColumnSpan="このセルを含めた横方向の結合セルの数"の後ろに
Style="{StaticResouce "Styleプロパティ"}"を追記する。

次にApp.xamlを開いてApplication.Resourcesと/Application.Resourcesの間に
Style TargetType="ターゲット名"
Setter Property="プロパティ" Value="配置"/
/Style
Style TargetType="ターゲット名"
Setter Property="プロパティ" Value="配置"/
Setter Property="プロパティ" Value="配置"/
/Style
Style TargetType="ターゲット名"
Setter Property="プロパティ" Value="配置"/
Setter Property="プロパティ" Value="配置"/   
/Style
を追記する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/51ee37f5-ef95-103b-ac2e-81f21ad8d980.png)
これで画面が完成になる。
あとはこれをそのまま使い必要な画面を作る。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/bc5061e2-f3cf-39ca-357c-1948d4a07703.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/350e2262-cc22-0ae2-569a-62de80569cb6.png)
Androidアプリのリリースに関するメモ

## はじめに
Androidアプリをリリースするまでに色々とわからないことがあったので備忘録として残します。

## リリースの種類
リリースにはいくつか種類があります。

- 製品版
- ベータ版
- アルファ版
- 内部テスト版 <- NEW

<img width="500" src="https://qiita-image-store.s3.amazonaws.com/0/185323/58b697e6-30f3-7d70-20bf-bc9bd32d55a2.png"/>

ここ最近に内部テスト版が追加されました。従来のリリースだとアプリがGooglePlayストアにリリースされるまでに1〜2時間弱の時間がかかっていたのですが、内部テスト版はなんと **わずか数分** でリリースされます！すごい！

アプリ内課金のテストをするためにはいずれかのリリースをしなければいけないのですが、ぼくがアプリ内課金のテストをしていた時は内部テスト版は存在していなかったので時間的に非常につらい気持ちでした笑

## 検証としてのリリース
製品版以外のリリースならば特定のユーザに限定したリリースができます。
例えば社内だけでテストをしたい時は次の手順でOKです。

- テストユーザのリストを作成
- テスト方法をクローズドxxx版テストを選択
- オプトインURLをテストユーザに配布

オプトインURLやテスト方法をリリースの種類ごとにまとめました。

リリースの種類|URL|テスト方法
---|---|---
ベータ版|https://play.google.com/apps/testing/パッケージ名|オープン ベータ版テスト<br/>クローズド ベータ版テスト<br/>Google グループまたは Google+ コミュニティを使用するベータ版テスト
アルファ版|https://play.google.com/apps/testing/パッケージ名|クローズド ベータ版テスト<br/>Google グループまたは Google+ コミュニティを使用するベータ版テスト
内部テスト版|https://play.google.com/apps/internaltest/xxxxxxxxxxxxxxxxxxx|内部テスト

## テスター
クローズドなテストをする場合は、あらかじめテストユーザのリストを作成します。
リストの作成はGoogle Play Consoleの左ペインを「設定 > テスターの管理」で辿れると思います。

<img width="500" src="https://qiita-image-store.s3.amazonaws.com/0/185323/49198d58-1989-c5ee-ebb9-3c9b9323fd0d.png"/>

また、アプリの各リリースでも追加ができます。

<img width="500" src="https://qiita-image-store.s3.amazonaws.com/0/185323/e49f2d03-20db-9b74-8ad0-d886725f850a.png"/>

## アプリ内課金の検証
アプリ内課金をテストするためには一度リリースをする必要があります。
内部テスト版ならば数分でGooglePlayストアにリリースされるので、内部テスト版でリリースするのがもっとも効率的です。

テストで課金する場合は、左ペインの「設定 > アカウントの詳細」にある「テスト用のアクセス権がある Gmail アカウント」に登録しておくことで課金額を請求されることなく行えます。

<img width="500" src="https://qiita-image-store.s3.amazonaws.com/0/185323/efece3cf-3198-aa65-af99-470964428d37.png"/>

ちなみにテスト課金すると注文管理ではこのように表示されます。

<img width="500" src="https://qiita-image-store.s3.amazonaws.com/0/185323/5a28bbdd-04e2-79a8-320d-255a540d5185.png"/>

## 以上
他に何か思い出したら追記します。
Kodiのaddonを作る（その３）

いつからだったのか、addonを導入するには
/Users/hoge/Library/Application Support/Kodi/addons
に直に置くのでは認識されなくなった。

zipファイルからインストール
というメニューから行う。

これでインストール可能なファイルが問題だった。

metadata.hoge.nantoka
というaddonを作成する場合

metadata.hoge.nantokaフォルダ内に
addon.xml
hoge.xml
icon.png
を入れておく。

これをmacOSのFinderで圧縮して作成するとダメ。
command lineで

$ zip -r -0 metadata.hoge.nantoka.zip metadata.hoge.nantoka
として metadata.hoge.nantoka.zipを作成する。
-r と -0
のオプションが必須のようだ。
アプリケーションの仕様決定の手順2/2

授業でした内容を自分のメモとして書き残します。

---

【 アプリケーションの仕様決定の手順1/2 】の続きです。
前回は、
1.アプリケーションの定義
2.画面イメージの定義
を、書き残しました。

---

#３．データの定義#

##3 - 1 データ型について##
今回使用する、Visual C#で使用できるデータ型は、次の２種類に分けることができる。

- 値型

小さな値を扱う場合に向いている。
スタックメモリを使用する。
　⇒変数の値を直接格納するための領域

- 参照型

文字列(string型)のように大きな値や、構造化されたデータのまとまりを管理したい場合などに向いている。
スタックメモリとヒープメモリを使用する。
　⇒ヒープメモリに文字列などの大きなデータの実体が格納され、スタックメモリに格納されている「ヒープメモリへの参照先」が参照型の変数に格納されている値ということになる

##3 - 2 売上情報データの定義##
売上情報データの各項目を定義する。

※売上情報は、売上管理アプリケーションの基本となるデータで、尚且つ項目ごとに検索されたり集計されることを考慮すると、データベースのテーブルとして保存するのがよい。

##3 - 3 年度データの定義##
集計の開始年度である値は、将来的に変更される可能性がある。
⇒売上管理アプリケーションの環境設定ファイルで最初の値を保存しておいて、変更する場合は環境設定ファイルを変更する

##3 - 4 部門データの定義##
部門データ（第１営業課、等）は将来的に件数が増減する可能性がある。
⇒年度データ同様、環境設定ファイルで変更できるようにする

##3 - 5 集計表データの定義##
⇒集計表データは売上管理アプリケーション内で、必要に応じて生成して使用する

#４．コマンドの定義#

##4 - 1 集計画面/一覧画面/編集画面のコマンドの定義##
各コマンドによって実行される処理、そのコマンドが実行できるための条件について次のように定義する。

- コマンド名
- 処理内容
- 実行条件

#５．アプリケーションの設計#

##5 - 1 アプリケーションの構成##
売上管理アプリケーションは、ユーザーとデータベースの橋渡し役である。
⇒橋渡し役として必要なことは次の３つである

1. View
    - UIのデザイン部分
2. ViewModel
    - Viewの状態を保持する、ViewとModelの橋渡し役
3. Model
    - アプリケーションのモデル、実行処理やデータベースへのアクセスなど

このように分担することにより、各プログラムの役割が明確になり独立性が高くなる。
⇒これによるメリットは次の３つである

1. 異なるテクノロジーにリメイクしやすい
    - 将来的に機能の追加や変更が生じた場合でも、変更を加える場所を明確にすることができる
    - 修正箇所を少なくすることができる
2. 問題個所を明確にできる
    - パフォーマンス低下の理由や、値検証の問題などを明確にすることができる
3. 複数人で開発できる
    - 複数人で役割分担をしながら開発することができる

〇MVVMパターン〇
WPFアプリケーションを開発する際に「Model-View-ViewModel」のように分けることを呼ぶ。

---

これでアプリケーションの仕様決定の手順は終了です。
最後まで見ていただき、ありがとうございました。
PowerShellでリモート接続出来るようにSQL Serverを設定する

外部マシンからSQL Serverにリモート接続出来るようにスクリプトを書いてみた。

やることは以下。

1. SQL ServerのTCP/IPを有効にする
2. SQL Serverのポートをデフォルトの1433にする
3. DBサーバーのファイアウォールを編集してSQL Serverで使用するポートを開放する

## SQL ServerのTCP/IPを有効にする

SQL Server PowerShellモジュールを使ってSQL Serverの設定を編集する。
Alter()を呼び出して、SQL Serverを再起動しないと変更が反映されないので注意。

``` powershell
$dBServerName = "NEW"
$dBInstanceName = "TEST"
$sQLServerServiceName = "SQL Server (TEST)"

Import-Module 'sqlps'
$uri = "ManagedComputer[@Name='{0}']/ ServerInstance[@Name='{1}']/ServerProtocol[@Name='Tcp']" -f $dBServerName, $dBInstanceName
$wmi = New-Object 'Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer'

# TCP/IPを有効にする
$tcp = $wmi.GetSmoObject($uri)
$tcp.IsEnabled = $true
$tcp.Alter()

# SQL Serverを再起動する
net stop $sQLServerServiceName /y
net start $sQLServerServiceName
```

## SQL Serverのポートをデフォルトの1433にする

「SQL ServerのTCP/IPを有効にする」とほぼ同様。
こちらもAlter()を呼び出して、SQL Serverを再起動しないと変更が反映されないので注意。

``` powershell
$dBServerName = "NEW"
$dBInstanceName = "TEST"
$port = "1433"
$sQLServerServiceName = "SQL Server (TEST)"

Import-Module 'sqlps'
$uri = "ManagedComputer[@Name='{0}']/ ServerInstance[@Name='{1}']/ServerProtocol[@Name='Tcp']" -f $dBServerName, $dBInstanceName
$wmi = New-Object 'Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer'

# ポートを1433に設定する
$tcp = $wmi.GetSmoObject($uri)
$wmi.GetSmoObject($uri + "/IPAddress[@Name='IPAll']").IPAddressProperties[1].Value = $port
$tcp.Alter()

# SQL Serverを再起動する
net stop $sQLServerServiceName /y
net start $sQLServerServiceName
```

## DBサーバーのファイアウォールを編集してSQL Serverで使用するポートを開放する

New-NetFirewallRuleでファイアウォールにルールを追加するだけ。
ちなみに「`」でコマンドを途中で改行することが出来る。

``` powershell
New-NetFirewallRule `
    -Name "SQLServer（1433）" `
    -DisplayName "SQLServer（1433）" `
    -Description "SQL Serverで使用するポート（1433）を開放する。" `
    -Enabled True `
    -Profile Domain,Private `
    -Direction Inbound `
    -Action Allow `
    -Program Any `
    -LocalAddress Any `
    -RemoteAddress Any `
    -Protocol TCP `
    -LocalPort 1433
```

## まとめ

スクリプト書くのたのしくなってきた。

``` powershell
$dBServerName = "NEW"
$dBInstanceName = "TEST"
$port = "1433"
$sQLServerServiceName = "SQL Server (TEST)"

Import-Module 'sqlps'
$uri = "ManagedComputer[@Name='{0}']/ ServerInstance[@Name='{1}']/ServerProtocol[@Name='Tcp']" -f $dBServerName, $dBInstanceName
$wmi = New-Object 'Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer'

# TCP/IPを有効にする
$tcp = $wmi.GetSmoObject($uri)
$tcp.IsEnabled = $true
$tcp.Alter()

# ポートを1433に設定する
$wmi.GetSmoObject($uri + "/IPAddress[@Name='IPAll']").IPAddressProperties[1].Value = $port
$tcp.Alter()

# SQL Serverを再起動する
net stop $sQLServerServiceName /y
net start $sQLServerServiceName

# 1433開放！
New-NetFirewallRule `
    -Name "SQLServer（1433）" `
    -DisplayName "SQLServer（1433）" `
    -Description "SQL Serverで使用するポート（1433）を開放する。" `
    -Enabled True `
    -Profile Domain,Private `
    -Direction Inbound `
    -Action Allow `
    -Program Any `
    -LocalAddress Any `
    -RemoteAddress Any `
    -Protocol TCP `
    -LocalPort 1433
```
[YahooAPI][在庫API]SellerID is not specifiedとなります。

お世話になります。

Yahooショッピングの商品一括更新APIにおいて質問がございます。

エンドポイント
https://circus.shopping.yahooapis.jp/ShoppingWebService/V1/getStock
headers:
'Authorization':"Bearer "+ access_token,
'Content-Type':"application/x-www-form-urlencoded",
POST内容
seller_id：xxxxxxxxxxxxx
item_code:b110011010054-MINT-IP7

上記内容でPOSTしました所、下記のようなエラーが返ってきました。

{"Error":{"Message":["\"seller_id\" is not specified"],"Code":["px-04001"]}}

seller_idは指定させていただいておりますが、原因が不明です。
「seller_id」という項目名は正しいでしょうか。（エラーがSellerIDでしたので）
その他に、考えられる問題点はございますでしょうか。

よろしくお願いいたします。
破滅的プログラミングの末路#01 「整数の絶対値でやらかす」

普通のプログラマなら直感的、反射神経的に理解しているような、
初歩的で単純な小ネタを記事にしていこうかと思います。
初歩的が故に、私のようなヘボなプログラマはよくやらかします。

誤りや適切でない内容がある場合は、コメントいただければ、
修正、内容の調整等検討します。


# 1. 整数の絶対値

多くのプログラミング言語では、整数の絶対値を返してくれるような、
関数なり、メソッドなりが用意されています。

たとえば、
`int result = Math.abs(-15);`とか実行すると、引数では負の整数を指定していますが、
`result`には、符号が取れた`15`が代入されます。
これは、多くのプログラマにとって、どうということないことでしょう。


# 2. 整数型

C言語とかJavaとかC#とか多くのプログラミング言語には整数型というものがあります。
整数を取り扱うための型ですが、今回はそれ自体が本題ではありません。
C, Java, C#あたりの経験者がイメージしやすいint型を例に考えてみます。

int型のサイズは、言語によったり環境にもよると思いますが、
とりあえず、32ビットの符号付きの整数型を考えてみます。

32ビットの符号付の整数型が表現できる範囲は多くのプログラミング言語の場合は、
`-2,147,483,648 から 2,147,483,647`
になっているはずです。

これ見ただけでも既に怪しい雰囲気が漂ってます。

# 3. 32ビット符号付き整数型で一番小さな整数の絶対値を考えてみる

`int result = Math.abs(-2147483648);`とやると、`result`はどうなるでしょう？
正の整数としては、**2147483647**までなので、よからぬことになりそうです。

ちなみに、C#の`System.Math`では、OverflowExceptionが投げられます。

``` csharp
try
{
    int result = System.Math.Abs(Int32.MinValue);
}
catch(OverflowException)
{
    Console.WriteLine("OverflowExceptionが発生");
}
```

Javaの`java.lang.Math`では、絶対値と言えど変わらず、負の整数の`-2147483648`になります。
(これは仕様通りの動作です。)

``` Java
int result = Math.abs(Integer.MIN_VALUE);

// 絶対値だけど、-2147483648のまんま。
System.out.printf("result = %d%n", result);
```

C/C++の`cmath`の場合、私の手元の環境では、負の整数の`-2147483648`になりました。
こちらはどうなるかは未定義なので、環境によっては、別の結果になるかもしれません。

``` cpp
#include <cmath>

int main()
{
  int result = abs(INT_MIN);

  return 0;
}
```


# 4. 末路

絶対値を返す関数、メソッドに、符号付き整数型の最小値を渡す可能性があるようなコードを書いていると、
"**いずれ**"よからぬことが発生する可能性があります。

"いずれ"というのがポイントで、今回の例では、問題があるのは、
`-2,147,483,648 から 2,147,483,647`までの、4,294,967,296個の整数値のうち、
１つだけになります(`-2,147,483,648`だけ)。
問題は、なかなか顕在化しない場合もあります。
よりサイズの小さな整数型だと、より問題は発生しやすくなるはずです。


# 5. 対策

設計上、符号付き整数型の最小値を渡す可能性がない場合は、問題ありません。
そうでない場合は、対策が必要です。

基本的には、符号付き整数型の最小値に対して特別な処理をすることになります。
例えば、最小値は除外されるように実装する、
最小値の絶対値も必要である場合は、より大きなサイズが扱える整数型を利用するなどになると思います。
(より大きなサイズの整数型でも最小値では問題は発生します。)

要件等によっては、`BigInteger`のような任意精度の整数型の活用も考えられます。
たとえば、JavaやC#の場合は、`BigInteger`クラスや構造体が用意されていて、
abs()メソッド(C#では、staticメソッド)もあります。
`BigInteger`の場合は、オーバーフローする心配はありません。
(メモリが不足する場合はあるかもしれませんが、
メモリが不足するほど巨大な数値を扱う人が、もしいれば、敬意を表したいと思います。)

また、可能な限り、符号付き整数型の最小値も評価できるような単体テストを組みましょう。

# 6. 謝辞

コメントいただいた皆様ありがとうございました。

[@saka1029](https://qiita.com/saka1029)さんのコメントに関連した内容は、いずれ、独立した記事にしようと思います。
[@tsuyoshi_cho](https://qiita.com/tsuyoshi_cho)さんのコメントは、本記事に反映させていただきました。
Wicket で Form から POST request, URLにはパラメータを出さない

# Wicket で Form から POST request, URLパラメータ非表示

### **Version**
Wicket 7.3

### **経緯**
デフォルトではフォームコンポーネントで onSubmit() を実行すると、URLにパラメータの値が出てしまう

`https://mysite.com/;jsessionid=B85EE5CB0349CCA2FE37AF76AB5C30C1?wicket:bookmarkablePage=:com.mycompany.cheese.CheeseMain&Title=Havarti&group=cheeseName
`
### **試行錯誤**
デフォルトでは PageParametersEncoder を使っている様子
[IPageParametersEncoder: Wicket Reference](https://ci.apache.org/projects/wicket/guide/7.x/single.html#_controlling_how_page_parameters_are_encoded_with_ipageparametersencoder)

パラメータを付けない IPageParametersEncoder を作成

``` java:NoParamsPageParametersEncoder.java
public class NoParamsPageParametersEncoder extends PageParametersEncoder {
  
	public NoParamsPageParametersEncoder() {
		super();
	}

	@Override
	public Url encodePageParameters(final PageParameters pageParameters) {
		Url url = new Url();
		// URLをそのまま返す
		return url;
	}
}
```
これをマウント時に指定させるとできる様子

``` java:WicketApplication.java
mount(new MountedMapper("/NextPage", NextPage.class, new NoParamsPageParametersEncoder()));
```

そしてフォームからパラメータを付けて渡す

``` java:PrevPage.java
StatelessForm<PrevPage> inputForm = new StatelessForm<PrevPage>("inputForm") {

	@Override
	protected void onSubmit() {
		PageParameters newParams = new PageParameters();
		newParams.set("USER", "user_id");
		newParams.set("PASSWD", "password");
		setResponsePage(new NextPage(newParams));
	}
};
```
ちなみに Form でも StatelessForm でもできました

Wicket関連ドキュメント少ない・・・
初めのWPFアプリケーション

Sales(売上管理)プロジェクトを作成する手順:

- スタートメニューからVisual Studio 2012 を開いて、「新しプロジェクト…」ボタンをクリックします。
![スケッチ.png](https://qiita-image-store.s3.amazonaws.com/0/251603/652e7d19-ea28-d132-8aac-516a1995cb18.png)
- 下記の画像の通り選択します。名前のボックスにSalesを入力します。最後にOKボタンをクリックすると、Salesプロジェクトの作成が完了となります。

*参照:　WPFアプリケーションとは:　WPSのアプリケーションのウィンドウのことを「WPSウィンドウ」と呼びます。ここで説明したように、Visual　Studio　2012　ではツールボックスからコントロールをWPSウィンドウのデザイン編集画面に配置して、WPSウィンドウの画面デザインを視覚的に行うことができます。
![スケッチ (1).png](https://qiita-image-store.s3.amazonaws.com/0/251603/d635cca8-1dc4-8a77-d17c-951d8b2cec91.png)
はじめてのsnmpとsnmpd


目標は、NASの帯域幅グラフをzabbixで見れること。

まずはcent7サーバが自分でsnmpを提供できるようになる && それを自分自身で取得して見るところから。

```ruby
# snmpwalk, snmpgetコマンドのインストール。これが snmp マネージャというのだろうか。
yum install net-snmp-utils -y
# snmpエージェント（採取される側）の snmpd インストール
yum install net-snmp -y

# 起動
systemctl start snmpd
systemctl status snmpd

# 触らなくていいけど、設定ファイル。 `public` というcommunityがデフォルトで定義されている
cat /etc/snmp/snmpd.conf 

# 自分自身を採取してみる
snmpget -v 1 -c public localhost system.sysDescr.0
snmpwalk -v 2c -c public localhost  system.sysDescr.0

# snmpwalkは配下のものを全部引くのでイケてる
snmpwalk -v 2c -c public localhost  .1.3.6.1.2.1
# ドットを減らすと山程とれーる
snmpwalk -v 2c -c public localhost  .1

# MiBのリスト？
snmptranslate -Tp
```

portも開いていて隣のサーバからも取れたので、問題なさげ。だめな場合はちまたで話題のせいぬｘとか `firewall-cmd --list-all` かな。

採取方法がわかったので、zabbixに変わってまずは自分でNASのsnmpを取得してみる。

```ruby
# buffalo terastation の場合
## コミュニティってデバイスごとに違う。WorkGroupみたいなもんかと思ってたら全然違うのね・・。
## buffalo のデフォルトコミュニティは TeraStation です。
### コミュニティを間違えると Timeout: No Response って言われる。
### nc -u も効かないし届いてないのかと思ったよ！
snmpwalk -v 2c -c TeraStation 192.168.100.100    .1.3.6.1.2.1.2.2.1
```

# zabbix
zabbixでのcommunityの変更方法がわからなかった。user macroを使うらしい？
~~とりあえずpublicにすれば取れるらしいので buffalo側を public にして様子見。~~ これは嘘でした
目標は、帯域幅のグラフが見れること。

怪しいbuffalo用のzabbix templateを見つけたので当ててみた。明日確認してみる（たぶんダメだろうな）

> https://share.zabbix.com/storage-devices/buffalo/buffalo-terastation

このtemplateも中身は `{$SNMP_COMMUNITY}`  なので、user macro必須なのかと思われる。どーやｒんだ・・・

追記：普通にHostの設定の横のタブに合った

![image.png](https://qiita-image-store.s3.amazonaws.com/0/24737/73105ad3-8d71-0cba-5a03-0012ffe304e2.png)

おおーmacroやったら取れた！

メモリ状況とかcpu load average

![image.png](https://qiita-image-store.s3.amazonaws.com/0/24737/8c46bdd2-4af8-495f-7e3e-af040f4d0990.png)


diskごとのsmartとか

![image.png](https://qiita-image-store.s3.amazonaws.com/0/24737/b7be4540-3d41-efc9-3da9-05d898cef360.png)

取りたかったトラフィックも取れてる！！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/24737/afb95d59-3872-2ec9-a6ba-6c5dc033e730.png)

神だ！！
PowerShellで旧DBサーバーから新DBサーバーに移行する

旧DBサーバーからデータベースを新DBサーバーに移行する。
旧DBサーバー：SQL Server 2008 R2
新DBサーバー：SQL Server 2016
方針は下記の通り。

1. 旧DBサーバーでデータベースのフルバックアップを取得する
2. 旧DBサーバーからフルバックアップを新DBサーバーにコピーする
3. 新DBサーバーにフルバックアップをリストアする

## 旧DBサーバーでデータベースのフルバックアップを取得する

SQLは以下の通り。
バックアップ先はローカルしか指定できない。。。

fullBackup.sql

``` sql
BACKUP DATABASE [TEST] TO  DISK = N'E:\TEST\Backup\TEST_FULLBACKUP' WITH NOFORMAT, NOINIT,  NAME = N'TEST-完全 データベース バックアップ', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
```

sqlcmdを使って旧DBサーバーでSQLを実行する。

``` powershell
$oldDBServerName = "OLD"
$dBInstanceName = "TEST"
$userName = "sa"
$password = "password"
$scriptDir=Split-Path $MyInvocation.MyCommand.Path -Parent
$mainBackupSQL = $scriptDir + "\..\SQL\fullBackup.sql"

sqlcmd -S $oldDBServerName -d $dBInstanceName -U $userName -P $password -i $backupSQL
```

## 旧DBサーバーからフルバックアップを新DBサーバーにコピーする

バックアップはローカルでしか取得できないので別途コピーする必要がある。
robocopyでコピーする。

``` powershell
$oldDBBackupSrcDir = "\\OLD\E$\TEST\Backup\"
$newDBBackupDstDir = "E:\TEST\Backup\"
$backupFileName = "TEST_FULLBACKUP"

robocopy $oldDBBackupSrcDir $newDBBackupDstDir $backupFileName /r:0
```

## 新DBサーバーにフルバックアップをリストアする

新DBサーバーにコピーしたフルバックアップを使ってリストアする。
SQLは以下の通り。

restore.sql

``` sql
USE [master]
RESTORE DATABASE [TEST] FROM  DISK = N'E:\TEST\Backup\TEST_FULLBACKUP' WITH  FILE = 1,  NOUNLOAD,  STATS = 5
GO
```

後は新DBサーバーでSQLを実行するだけ。

``` powershell
$newDBServerName = "NEW"
$userName = "sa"
$password = "password"
$scriptDir=Split-Path $MyInvocation.MyCommand.Path -Parent
$restoreSQL = $scriptDir + "\..\SQL\restore.sql"

sqlcmd -S $newDBServerName -U $userName -P $password -i $restoreSQL
```

## まとめ

スクリプトを実行するだけで旧DBサーバーのデータベースが新DBサーバーにリストアされるようになった。
めでたし。
SQLは別途用意してね。

``` powershell
$oldDBServerName = "OLD"
$newDBServerName = "NEW"
$dBInstanceName = "TEST"
$userName = "sa"
$password = "password"
$scriptDir=Split-Path $MyInvocation.MyCommand.Path -Parent
$mainBackupSQL = $scriptDir + "\..\SQL\fullBackup.sql"
$restoreSQL = $scriptDir + "\..\SQL\restore.sql"
$oldDBBackupSrcDir = "\\OLD\E$\TEST\Backup\"
$newDBBackupDstDir = "E:\TEST\Backup\"
$backupFileName = "TEST_FULLBACKUP"

# バックアップ
sqlcmd -S $oldDBServerName -d $dBInstanceName -U $userName -P $password -i $backupSQL
# バックアップ転送
robocopy $oldDBBackupSrcDir $newDBBackupDstDir $backupFileName /r:0
# リストア
sqlcmd -S $newDBServerName -U $userName -P $password -i $restoreSQL
```
PHP: TCPDF でページの下端まで印刷する方法

TCPDF を使って１枚のPDF を作成する時、ディフォールトだと下端に描画できません。それを解決する方法です。

```php
pdf->SetAutoPageBreak(false, 0);
```

ディフォールトだと自動改ページが ON になっています。

次のページを改造して、A4 一杯に書き込んでみます。
[PHP: TCPDF だけで日本語を表示](https://qiita.com/ekzemplaro/items/f0a64b652806ed13ecf2)

```php:a4_max.php
#! /usr/bin/php
<?php
// ------------------------------------------------------------------
//
//	a4_max.php
//
//						Jun/11/2021
// ------------------------------------------------------------------

require_once('/usr/share/php/tcpdf/tcpdf.php');

// $pdf = new TCPDF("L", "mm", "A4", true, "UTF-8" );
$pdf = new TCPDF(PDF_PAGE_ORIENTATION,PDF_UNIT,"A4",true);
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->SetAutoPageBreak(false, 0);
$pdf->AddPage();

$pdf->SetFont('kozminproregular', '', 24);

$pdf->Text(0, 0, "左上");
$pdf->Text(190, 0, "右上");
//
$ymax = 286;
$pdf->Text(0, $ymax, "左下");
$pdf->Text(190, $ymax, "右下");
//

$pdf->Output();

// ------------------------------------------------------------------
?>
```

実行コマンド

```bash
./a4_max.pdf > out01.pdf
```
Python > ExcelのシートからCの配列を作る

```txt:動作環境
ideone (Python 3.5)
```

### Cのテスト用データ

- 動作テスト用データがcsv形式である
- `{0, 3, 0}, {100, 3, 0},...`のような形式にしたい
- 組込みCのソースにて使いたい

手作業で上記のフォーマットを作っていくと時間がかかる。

### Pythonスクリプト

Note: **2018年4月18日現在、ideoneのエラーが頻発する**

https://ideone.com/yN0wSe

```py
# change [NUM_COLUMN]
NUM_COLUMN = 3
# paste from Excel sheet
data="""0	3	0
100	3	0
200	3	0
300	3	0
400	3	0
500	3	0
"""

for aline in data.split('\n'):
    elem = aline.split('\t')
    if len(elem) < NUM_COLUMN:
        break
    print("{%s,%s,%s}," % (elem[0], elem[1], elem[2]), end='')

```

```txt:run
{0,3,0},{100,3,0},{200,3,0},{300,3,0},{400,3,0},{500,3,0},
```
Pythonのpipをupgradeしたら "Fatal error in launcher: Unable to create process using..."と言われてしまう

WindowsにPythonをインストールしてpip動かすと

```
python -m pip install --upgrade pip
```

と言われるのでそのまま実行すると

```
C:\WINDOWS\system32>pip
Fatal error in launcher: Unable to create process using '""c:\program files\python36\python.exe"  "C:\Program Files\Python36\Scripts\pip.exe" '
```

となって困った。```python -m pip```では正常に実行できる。

いろいろ調べてまわって動かなかったが、[Stack Overflow](https://stackoverflow.com/questions/37220055/pip-fatal-error-in-launcher-unable-to-create-process-using)の回答に従ったら治ったのでメモ。

```
python -m pip uninstall pip
easy_install pip
```

要するにpipはUpgradeしないでeasy_installで入れればよいらしい。
Pythonに詳しい方に解説してもらえるとうれしいです。
小さなRailsアプリをHerokuにデプロイするメモ

# 前提
- railsはgemでインストール済（アプリはこれから）
- herokuアカウント作成済み、heroku cliインストール済、ログイン済み


# メモ
## Railsアプリ作成

デフォルトのまま作成する

```zsh
$ rails new herokusample -d postgresql
$ vim public/index.html ★
```

★public/index.htmlじゃなくてもFQDNでアクセスしたときに表示されるページがあればいいはずであるが、こういったものが無いと下記画像のようなエラーが出る


![FireShot Capture 10 - The page you were looking for d_ - https___obscure-cliffs-87417.herokuapp.com_.png](https://qiita-image-store.s3.amazonaws.com/0/50690/853a51a0-b64e-a217-6eaf-2ae18000593c.png)

## デプロイ

```
% git init
% git add .
% git commit -m "first"
% heroku create xxxxx
★この時点で.git/configのリモートリポジトリに[heroku]が追加される。Heroku上にアプリが作られる。
% git push heroku master
```

## 参考

railsのherokuへの展開でつまずいた話 - saj_kzの日記 http://saj-kz.hatenablog.com/entry/2014/04/06/231941
アプリケーションの仕様決定の手順1/2

授業でした内容を自分のメモとして書き残します。

---

売上管理アプリケーションの目的・画面、動作などの詳細な設計をまとめながら、アプリケーションの仕様を設計するための基本を学習

---

#１．アプリケーションの定義#

##1 - 1 アプリケーションの目的を定義する##


**ポイント**
『 開発者とユーザーの意思の疎通 』
⇒会話や文章だけで要件を定義するのではなく、イメージを記述した資料やメモなどの**「対象物」**の提示
※実際、対象物を置き去りにして直接会話してしまっている場面も多く見られる。

##1 - 2 各要件の詳細を定義する##
**ポイント**
『 上記に準じた詳細な部分についてを確認 』
『 将来を見据えて定義する 』

#２．画面イメージの定義#

##2 - 1 アプリケーションの画面構成##
前節の要件に基づくと、売上管理アプリケーションでは少なくとも２つの画面が必要であることがわかる。

- 集計画面（メイン画面）
- 一覧画面

前節の要件で明確になっていない編集画面についても定義する。
⇒必要に応じてユーザーに確認しながら不明な部分を定義していく

これにより、売上管理アプリケーションの画面構成は、次の３つの画面が必要であるとわかる。

- 集計画面（メイン画面）
- 一覧画面
- 編集画面

###2 - 1 - 1 集計画面（メイン画面）の定義###
⇒画面イメージは、前節で要件を定義した際に使用したイメージに基づいて定義する

###2 - 1 - 2 一覧画面の定義###
※一覧画面は、メイン画面で選択されている項目と集計表に対応した売上情報の一覧を閲覧できる画面である。

⇒画面イメージは、前節で要件を定義した際に使用したイメージに基づいて定義する

###2 - 1 - 3 編集画面の定義###
編集画面は、ユーザーが入力した値を検証しなければならない点で他の画面と少し違っている。

**ポイント**
『 使用するコントロールはユーザーが入力しやすいもの、間違った値を入力しにくいものを選択する 』
⇒入力された値が有効でない場合などに**エラーメッセージを表示させる**

---

長くなるので、次に続きます。
RedisのKeyを全て削除する

RedisのKeyを全て削除する方法は、`flushall`と`flushdb`がある。`flushall`は全てのDBの全てのKeyを削除し、`flushdb`は選択されているDB内のKeyを全て削除する。

## flushall

現在選択されているデータベースだけでなく、既存のすべてのデータベースのすべてのキーを削除します。このコマンドは決して失敗しません。

この操作の時間計算量(time-complexity)はO(N)です。Nは既存のすべてのデータベースのキー数です。

```
flushall
```

## flushdb

現在選択されているDBのすべてのキーを削除します。このコマンドは決して失敗しません。
この操作の時間計算量(time-complexity)はO(N)です。Nはデータベース内のキーの数です。

```
flushdb
```

## asyncオプション

Redis 4.0以降では、サーバーをブロックすることなく、別のスレッドでバックグラウンドでキーを削除できるようになりました。 FLUSHALLおよびFLUSHDBにASYNCオプションが追加され、データセット全体または単一のデータベースを非同期に解放できるようになりました。

## 参考

* [FLUSHALL - Redis](https://redis.io/commands/flushall)
* [FLUSHDB - Redis](https://redis.io/commands/flushdb)
Expoで開発しているReactNativeアプリにTypeScriptを導入する

Cookpad社がReactNative開発でTypeScriptを使っているとのことだったので、自分もTSでReactNativeを書いていこうという意識が高まりました。
そこで、Expoで開発しているReactNativeアプリにTypeScriptを入れてみた時の手順です。

参考
[React Native アプリの開発基盤構築 - クックパッド開発者ブログ](http://techlife.cookpad.com/entry/2018/04/17/090000)

ExpoでTypeScriptを使うには以下の4ステップでOK
1. Typescriptをinstallしてtsconfig.jsonを作成する
2. tsconfig.jsonを書き換えてreact-native用の記述を追加
3. react-native-typescript-transformerをインストール
4. app.json（Expoのconfig）をいじってTSを動かせるようにする

動作確認をした時のExpoのバージョンは26.0.0です。

## 1. Typescriptをinstallしてtsconfig.jsonを作成する
```bash
$ npm install typescript
$ npm install -g typescript
$ tsc --init
```

## 2. tsconfig.jsonを書き換えてreact-native用の記述を追加
この設定がよく使われてそう。`jsx: "react-native"`が重要。
一部JSを残している場合は`allowJs: true`を追記する。

```json:tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "module": "es2015",
    "outDir": "build/dist",
    "sourceMap": true,
    "experimentalDecorators": true,
    "jsx": "react-native",
    "lib": ["dom", "es2015", "es2016"],
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "moduleResolution": "node",
    "noEmitHelpers": true,
    "importHelpers": true,
    "strict": true,
    "noImplicitReturns": true
  }
}

```

## 3. react-native-typescript-transformerをインストール

```bash
$ npm install react-native-typescript-transformer
```

## 4. app.json（Expoのconfig）を編集してTSを動かせるようにする
```json:app.json
{
  "expo": {
    "sdkVersion": "26.0.0",
    "packagerOpts": {
      "sourceExts": ["ts", "tsx"],
      "transformer": "node_modules/react-native-typescript-transformer/index.js"
    }
  }
}
```

---

後は既存のJSをTSに書き換えて`npm run start`すればOK。
RAD Studio IDE でデフォルトの文字コードを UTF-8 にする

# RAD Studio IDE の文字コード
昔から連綿と使われてきたからなのかデフォルトの文字コードが延々と Shift JIS (ANSI) のままなんですよね！ 
で Git とかに上げるとコミットログ上の日本語が読めなくなったりするわけです。
そこで、デフォルトを UTF-8 にできないかなあと思って居たのですが、簡単に変更できる技を見つけました。

レジストリに下記の値を書き込むだけ！

```text
[HKEY_CURRENT_USER\Software\Embarcadero\BDS\19.0\Editor]
"DefaultFileFilter"="Borland.FileFilter.UTF8ToUTF8"
```

こんなに簡単な事だったとは…
しかも、2004 年に[公式ブログ](https://community.embarcadero.com/blogs/entry/more-ide-secrets--utf8-and-the-editor-284)で公開されていたとは…

[新規作成]→[Unit] を選んで作った Unit
![new.png](https://qiita-image-store.s3.amazonaws.com/0/12977/7397a81e-6f1d-0a19-9195-b6892efaa4c3.png)



[[出典元] Stackoverflor: How can I set the default file format in the Delphi IDE to UTF8?](https://stackoverflow.com/questions/1736102/how-can-i-set-the-default-file-format-in-the-delphi-ide-to-utf8)