OmniAICreator/Qiita-1.07M huggingface dataset:
部分テンプレートの実装

##部分テンプレートとは
同じHTML構造の部分を共通化することによって、無駄なくビューファイルを作成することができます。この共通化された部分を、 部分テンプレートといいます。

部分テンプレートを使用した場合、そのHTML構造を他のビューでも使いまわすことができるという利点も存在します。

また、部分テンプレートのファイル名は必ずアンダーバー「_」から始まります。

##部分テンプレートを使用したい場所を切り取る
例えば、以下のeach文の中身を切り取る（command+x）。

```app/views/posts/index.html.erb
<% @posts.each do |post| %>
  <div class="content">
    <div class="content__left">
      <div class="content__left--image"></div>
    </div>
    <div class="content__right">
      <div class="content__right__top">
        <%= link_to post.title, post_path(post.id), class: "content__right__top--title" %>
      </div>
      <div class="content__right__bottom">
        <div class="content__right__bottom--userName">
          <%= link_to post.user.nickname, user_path(post.user), class: "content__right__bottom--userName--btn" %>
        </div>
        <div class="content__right__bottom--date">
          <%= post.created_at %>
        </div>
      </div>
    </div>
  </div>
<% end %>
```
##部分テンプレート用のファイルを作成
app/views/postsディレクトリに、部分テンプレート用のファイル_post.html.erbを作成します。

```app/views/posts/_post.html.erb
<div class="content">
  <div class="content__left">
    <div class="content__left--image"></div>
  </div>
  <div class="content__right">
    <div class="content__right__top">
      <%= link_to post.title, post_path(post.id), class: "content__right__top--title" %>
    </div>
    <div class="content__right__bottom">
      <div class="content__right__bottom--userName">
        <%= link_to post.user.nickname, user_path(post.user), class: "content__right__bottom--userName--btn" %>
      </div>
      <div class="content__right__bottom--date">
        <%= post.created_at %>
      </div>
    </div>
  </div>
</div>
```
##部分テンプレートを呼び出す
続いて、こちらの部分テンプレートを呼び出します。そのためには、renderメソッドを利用します。

厳密にいうと、renderメソッドにpartialオプションとlocalsオプションを加えて利用する。
##partialオプションとは
renderメソッドで使用できるオプションです。 partialというオプションを付けることで、明示的に部分テンプレート名を指定し、部分テンプレートを表示することができます。
下の例では、_sample.html.erbという部分テンプレートを呼び出しています。

【例】

```
<% render partial: "sample", locals: { post: "hello!" } %>
```
##localsオプションとは
renderメソッドで使用できるオプションです。 localsというオプションを付けることで、部分テンプレート内でその変数を使えるようになります。

【例】

```
<% render partial: "sample", locals: { post: "hello!" } %>
```
これで部分テンプレート内においてhello!という文字列の代入されたpostという変数が使えるようになります。

##実装
```app/views/posts/index.html.erb
<% @posts.each do |post| %>
  <%= render partial: "post", locals: { post: post } %>
<% end %>
```
ここでのrenderメソッドのlocalsオプションに注目してみます。{ post: post }の右側のpostはeachメソッドのブロックパラメータのpostで、Postのインスタンスを示しています。一方、左側のpostは部分テンプレート内での変数の名前を表しています。

以上！
【Ruby】複数の文字を置換したい場合

#gsubメソッド
複数の文字を置換したいときは`gsub`を使えば、指定した通りに置換する事が出来ます。
@scivolaさんからコメントを頂いて記事を修正させて頂きました。@scivolaさんご丁寧にありがとうございます！

##gsub【置換したい部分をすべて置換】
以下例

```ruby
x = "TOKYO"
y = x.gsub(/[TOKY]/, "T" => "5", "O" => "3", "K" => "6", "Y" => "1")
puts y
=> 53613
```
該当したものを一字ずつ置換してくれます
また、置換時には文字列化されるので、5と書いても"5"と書いても結果は変わりません。

##String#trメソッド
また、1 文字を 1 文字に置き換える「換え字」なら，gsub を使うより専用メソッド String#tr を使ったほうが簡潔で高速みたいです！

```ruby
y = x.tr("TOKY", "5361")
```
【rails5】DBにカラムを追加/削除したい場合

#結論
マイグレーションファイルを作成し、db:migrateを実行する
#対応

##追加する場合

```bash:bash
rails g migration AddUseridToArticles user_id:integer
```
クラス名はAddXXXToYYYまたはRemoveXXXFromYYYとする。
YYYにはテーブル名を指定。
XXXには追加又は削除するカラム名を指定するが違う文字列でも構わない。
(複数のカラムを同時に追加する場合などは指定できないので)


##削除したい場合

```bash:bash
rails generate migration RemoveAuthorFromTitles author:string
```


#参考
[Ruby on Rails カラムの追加と削除](https://qiita.com/azusanakano/items/a2847e4e582b9a627e3a#%E3%82%AB%E3%83%A9%E3%83%A0%E3%81%AE%E8%BF%BD%E5%8A%A0%E3%81%A8%E5%89%8A%E9%99%A4)
kintone アップした画像を表示するには？(初心者向け)

###はじめに
この記事はkintoneで添付ファイルフィールドに登録した写真を一覧画面に画像を表示したい、または詳細画面でスペースフィールドを使用して表示したいけど、どうしたらよいか分からない方向けです。

###どうやって表示するの？
表示手順は以下になります。
１、filekeyを取得
２、XMLHttpRequestでfilekeyを使用してAPIリクエストし、正式なURLを取得し、表示


#### **・ステップ1、filekeyを取得**
一覧画面なら「record[i].フィールドコード.vlaue.filekey」
詳細画面なら「record.フィールドコード.vlaue.filekey」で取得する。

参考URL
https://developer.cybozu.io/hc/ja/articles/202166180-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89

#### **・ステップ2、XMLHttpRequestでfilekeyを使用してAPIリクエストし、画像を表示するための正式なURLを取得し、表示**

以下がURLを取得し、表示するコード(例)です。

    const apiurl = kintone.api.urlForGet('/k/v1/file', { fileKey: filekey }, true);

    const xhr = new XMLHttpRequest();
    xhr.open('GET', apiurl);
    xhr.setRequestHeader('X-Requested-With' , 'XMLHttpRequest');//これが無いとIE,FFがNG
    xhr.responseType = "blob";

    xhr.onload = function() {
      const blob = xhr.response;
      const url = window.URL || window.webkitURL;
      const image = url.createObjectURL(blob);
      $(`<img src=${image} width="120px" height="120px" /><br>`).appendTo(element);
    xhr.send();

画像を使用してSwiper.jsでスライダーを実装することも可能です。
ただし、スライダーの実装にはPromiseの使用が必須になります。
MLflowで前処理・機械学習・予測API、らくらくMLライフサイクル管理

MLflow で実験のパラメータ、メトリックや学習済みモデルの記録については、情報が豊富に見つかりますが、しかし前処理と学習・予測を一連の処理としてパイプライン化する、分かりやすい簡単なサンプルが見つからなかったので、作ってみました。

よって、このサンプルでは、前処理と学習・予測のパイプライン化に重点を置きます。
また、MLflowで簡単に予測サービス(REST)を立ち上げられることについても少し触れます。

ソースコードはこちら
https://github.com/vochicong/h2o_mlflow


# 概要

* データ: [タイタニック号乗客の生存](https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv)
* [Pandas](https://pandas.pydata.org/)で前処理
* [H2O AutoML](http://docs.h2o.ai/h2o/latest-stable/h2o-docs/automl.html?highlight=automl)で機械学習
* [MLflow custom model](https://mlflow.org/docs/latest/models.html#example-saving-an-xgboost-model-in-mlflow-format)で前処理と学習・予測をつなげる :notes:
* [MLflow models serve](https://mlflow.org/docs/latest/models.html#deploy-mlflow-models)で予測RESTサービス


# 開発環境の準備

[Conda](https://docs.conda.io/en/latest/miniconda.html)で環境作成

``` bash
conda env update -f conda-dev.yml
conda env update -f h2o/conda.yaml

conda activate h2o_mlflow
python --version # Python 3.8.5 など
java -version # openjdk version "1.8.0_152-release" など
```


# コード

`main.py` にコードが全部入っています。

* Preproc: データ前処理のクラス
  + Age, Fareの Min-Maxスケーリング
  + Pandas DataFrame から H2OFrame への変換　
* Learner: 機械学習のクラス
* Predictor: 予測専用のクラス

前処理・機械学習・テスト予測の実行

``` bash
mlflow run h2o
```


# 予測APIサービスの起動

`mlflow run` コマンドが数分で終わると、予測APIの起動コマンド例が出力されるので、コピーして使えます。デフォルトで5000番ポートが使われます。

``` bash
MODEL=/var/folders/j5/1fzcsqzd2_j1s3_5d3qm447h0000gn/T/tmpu_840dh5/main.model

mlflow models serve -m $MODEL
```

## 予測API用Dockerイメージ

簡単に作れます

``` bash
mlflow models build-docker -m $MODEL
```


# 予測APIテスト

``` bash
pytest h2o/test_api.py
```

同じテストデータに対して、APIを使って予測させる場合と、
`main.py` でモデルを直接ロードして予測させる場合とを比較して、
同じ予測結果になることを確認します


# 参考）APIのJSON形式

Request

``` json
{ "columns": [ "x1", "x2", "x3" ],
  "data": [
               [ 3,    2,    5 ],
               [ 1,    4,    8 ] ] }
```

Response（分類問題）

``` json
[ { "predict": 0, "p0": 0.7, "p1": 0.3 },
  { "predict": 1, "p0": 0.6, "p1": 0.4 } ]
```
Laravelでプログラムを作ろう

## Laravelでプログラムを作ろう

###Composerのインストール
Composer公式サイト
https://getcomposer.org/

まずComposerのインストールします。

```
brew install composer
```
インストールが完了したら正常にインストールされたことを確認します。

```
% composer -V
Composer version 1.10.10 2020-08-03 11:35:19
```

###Laravelインストーラーをダウンロード
Composerを使用してLaravelインストーラーをダウンロードします。

```
composer create-project laravel/laravel your-project-name --prefer-dist
```

このコマンドでLaravelの最新パッケージがダウンロードされ、現在のディレクトリーの中の、新しいyour-project-nameフォルダーにインストールされます。

```
composer install
```

手動で作成したディレクトリーのルートで、composer installコマンドを実行してください。このコマンドによりフレームワークに必要な依存パッケージがインストールされます


###laravelコマンドをどこからでも使用できるようにする
```
export PATH="$PATH:$HOME/.composer/vendor/bin/"
```

###Laravelのサーバー
HTTPサーバーはデフォルトで8000ポートをリッスンします。しかし、既に使用済みであるか、この方法で複数のサーバーを建てたい場合は、対象のポート番号を指定します。--port引数を使うだけです。

```
php artisan serve --port=8080
```

###Laravelプロジェクトのインストール
backend ディレクトリに既にLaravelがインストール済みの場合はこちらの方法になります。

```
[mac] $ git clone git@github.com:ucan-lab/docker-laravel.git
[mac] $ cd docker-laravel/infrastructure
[mac] $ make init
```

###Laravel7 ログイン画面作成
laravel/uiをインストール

```
#laravel7の場合
composer require laravel/ui
```

###LOGIN機能＆テーブル作成

```
php artisan ui vue --auth

php artisan migrate
```
###FrontEndに必要なPackageをインストール
（Node/npmの使用が必要）

```
npm install
```

###CSS/JSを作成ビルド

```
npm run dev
```
###確認
ブラウザから http://127.0.0.1:8000 にアクセスします。
画面に右上に、「LOGIN」と「REGISTER」が表示されるようになります
$ git clone で取得したLaravelアプリのローカルサーバの起動に失敗する

# 目的

- 記事名のエラーを解決した話をまとめる

# 補足情報

- 本記事は一年以上前に記載した物が下書きボックスに眠っていた内容である。供養の意味も含めて一応記事にする。

# 問題発生までの経緯

1. GitHubのリモートリポジトリを`$ git clone`コマンドを用いて取得した。
1. .envファイルを作成、自分の環境にあった内容を記載した。
1. Laravelアプリ名ディレクトリで下記コマンドを実行してローカル開発環境用のサーバを起動した。

    ```terminal
    $ php artisan serve
    ```

# 問題

- コマンド`$ php artisan serve`を実行後、下記のエラーが出力された。

    ```terminal
    php artisan serve
    PHP Warning:  require(/Users/ookawashun/workspace/work/laravel/calculation_drill_app/vendor/autoload.php): failed to open stream: No such file or directory in /Users/ookawashun/workspace/work/laravel/calculation_drill_app/artisan on line 18
    
    Warning: require(/Users/ookawashun/workspace/work/laravel/calculation_drill_app/vendor/autoload.php): failed to open stream: No such file or directory in /Users/ookawashun/workspace/work/laravel/calculation_drill_app/artisan on line 18
    PHP Fatal error:  require(): Failed opening required '/Users/ookawashun/workspace/work/laravel/calculation_drill_app/vendor/autoload.php' (include_path='.:/usr/local/Cellar/php/7.4.3/share/php/pear') in /Users/ookawashun/workspace/work/laravel/calculation_drill_app/artisan on line 18
    
    Fatal error: require(): Failed opening required '/Users/ookawashun/workspace/work/laravel/calculation_drill_app/vendor/autoload.php' (include_path='.:/usr/local/Cellar/php/7.4.3/share/php/pear') in /Users/ookawashun/workspace/work/laravel/calculation_drill_app/artisan on line 18
    ```

# 問題解決までの経緯

1. アプリ名ディレクトリで下記コマンドを実行してcomposerのパッケージインストールを行った。

    ```terminal
    $ composer install
    ```
1. 再度ローカルサーバを起動するコマンドを実行したら正常にローカルサーバが起動した。
delegateの設定、dismiss　備忘録


遷移前の変数、配列を遷移後のコードでも使用したい場合、delegateまたはシングルトンを使うといい

delegateの使い方

```swift
//遷移前コード
let vc = R.storyboard.storyboard.menuView()!
vc.delegate = self
self.present(vc, animated: true, completion: nil)
```


```Swift
//遷移後コード
var delegate : ViewController?

//自分自身を閉じる（破棄する）
self.dismiss(animated: true, completion: {
//クロージャー　
//self.delegate?.遷移前の実行したい関数
})

let vc = R.storyboard.main.main()!
self.present(vc, animated: true, completion: nil)

```
AWS CLIで出力される文字列のダブルクォートを外す方法

`--output text` をつければ外れます。

```つけない場合.sh
$ aws lambda get-function \
  --function-name $NAME \
  --query "Configuration.FunctionArn"
> "arn:aws:lambda:ap-northeast-1:1234567890:hoge"
```
```つけた場合.sh
$ aws lambda get-function \
  --function-name $NAME \
  --query "Configuration.FunctionArn" \
  --output text
> arn:aws:lambda:ap-northeast-1:1234567890:hoge
```
参照: [Convert to plain text](https://claudiajs.com/tutorials/aws-cli-tricks.html#convert-to-plain-text)

デフォルトのJSON形式は常にダブルクォートに囲まれているため、前のコマンドで出力された値を次のコマンドにパイプするには不都合です。
`--output text` をつけることで出力内容がJSONからテキストに変更され、ダブルクォートが外れます。
gcloudが壊れた時のメモ

# gcloudが壊れた
何を打っても

```
ERROR:root:code for hash md5 was not found.
```
と出る

## 原因
gcloudがpython2.7を見ていた

## 回復
brewでpython3.xがインストールされていることを確認

```
$ which python3
```
でpython3の場所を確認し、

```
$ export CLOUDSDK_PYTHON=$(python3)
```
で解決した。
ウルトラワイドなディスプレイを作業環境にする

この記事は「[マイスター・ギルド：暑中見舞！夏のアドベントカレンダー2020](https://note.com/meisterguild/n/n09826f484617)」7日目の記事です。

***

ウルトラワイドサイズの言葉の定義としては16:9より横長なものを指すようです。動画編集をはじめとするコンテンツ制作系での利用や、没入感を求めるゲームでの利用で利点があるとされています。
在宅勤務の割合が高くなって数か月、オフィスではFHDディスプレイ2枚+ノートPC(FHD）の3画面で作業していましたが、自宅のウルトラワイドサイズ1画面で作業する事が多くなりました。どちらが作業効率が良いかと言うと、ざっくりとはどちらも変わらないという所です（細かい使用感はもちろん変わってきますが）。
私が使用しているウルトラワイドは32:9のサイズで、軽く湾曲したタイプです。OSはWindowsです。行う作業としては主にコーディングです。
ちなみにうちの代表が過去に[4Kディスプレイで作業するとどうか](https://m-gild.com/blog/119)というブログ記事を書いています。

# そのままは厳しい

残念ながら世の中の多くのものはまだ16:9以下向けに作られていて、少なくともコーディング作業中にウルトラワイドサイズがそのまま生かせる場面はあまりありません（ちょっと横に長いログファイルが見やすいくらいでしょうか）。とりあえず各ウィンドウは、従来サイズに留めて利用していくことになります。全画面ボタンを押せないのが寂しいですね。

Windowsでは、ウィンドウを画面の横端に持っていくと自動で画面の半分のサイズにしてくれるので、これを利用すると私の場合16:9のウィンドウを画面に2枚並べることができます。しかし画面の中央にウィンドウの端が来ることになるので、これはやりたくありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177194/c2c3c859-524a-0844-d749-15870774d6b0.png)
画面の中央にコーディングの画面を持ってきたいです。その左右にサブ的なウィンドウを並べられれば理想です。OS標準でそれを自動化することは、どうも難しいようです。

もう1つ中央に持ってきたいものとして、タスクバーに表示するアプリアイコンがあります。左寄せで嬉しいことは1つもありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177194/4fb6d7e0-e010-1edc-621b-c04f2452de34.png)

ちなみにウルトラワイドなディスプレイには大抵2本以上の入力端子を接続して、PBP/PIP表示が可能です。3入力でPBP表示をすれば、それはもうマルチディスプレイと変わらないことになるのですが、それは一旦置いておきます。PCからディスプレイに接続するケーブルは1本とします。

# PowerToysのFancyZonesで画面分割

1つ目の理想を実現するために[PowerToys](https://github.com/microsoft/PowerToys)というツールをインストールします。GitHubのMicrosoftのリポジトリにある、Windowsをちょっと便利にするツール群です。2020年8月時点でv0.20で、2020年9月にv1.0となる予定です。これに含まれるFancyZonesで画面を任意に分割し、そこにウィンドウを収めることができるようになります。この手のツールは他にも色々あったのですが、自分の要望を満たすものがこれでした。
これを使えば、ウルトラワイドを以下のように3分割できます。ちょうど左から 8:9、16:9、8:9のサイズになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177194/fc47140e-c089-7c37-49b1-b5f3d3a0ea99.png)
これはデスクトップが仮想的に分割されるというわけではないので、ウィンドウの全画面ボタンを押すと1～3にまたがったウィンドウになってしまいます。全画面ボタンは封印ですね。その代わり、ウィンドウをShiftを押しながらドラッグするとゾーンが現れ、ドラッグをやめた位置のゾーンにピタッとウィンドウサイズが収まるようになってくれます。これの使用感がなかなかいい感じです。

これでブラウザで動作確認しながら、中央画面で16:9サイズで広々コードを書きながら、Slackを追うことを1画面でできるようになりました。Slackを表示しているゾーンをさらに縦分割して別のアプリを表示するということもできます。FancyZonesは自由に画面構成を変えることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177194/d52a7a87-f42c-fe15-21a8-81c5abde8696.png)

# TaskbarXでタスクバーのアプリを中央に

もう1つのやりたいことはタスクバーのアプリを中央に寄せることです。これは[TaskbarX](https://github.com/ChrisAnd1998/TaskbarX)を使います。インストールして起動すれば、デフォルトでタスクバーのアプリが中央寄せになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177194/d6f3bf25-1bc9-865c-16d7-590ac98038d5.png)

# 作業環境としてのウルトラワイド

コーディング作業で16:9以上のサイズが役立つ場面は、ちょっと横に長いログを見るときくらいです。基本的には仮想的なマルチディスプレイの使い方になると思います。
もっと積極的にウルトラワイドを活用することを考えてみました。思いついたところでは、クラス定義はウルトラワイドを縦にした画面内に収まるようにすることを1つの指標にするとかでしょうか。制限された中でコードを視覚的にとらえると、キャンバス内に絵を描くことや、基板内にモジュールを配置するような作業に近いような、そんなイメージのコーディングになるんじゃないか、という気がしました。

# マルチとウルトラワイド

最後に簡単に両者を比較します。マルチディスプレイとウルトラワイドとでは、ウルトラワイドの方が首の移動量が少なく、目への負担も少ない気がします（これはまあ、マルチディスプレイの配置の頑張り次第）。ほかにはケーブルと机に乗る足の数が1セットだけで済むというメリットがあるでしょうか。逆にウルトラワイドのデメリットは、今のところ価格です。そこさえクリアできれば、ディスプレイは1台で十分と思わせてくれます。
にいがた食堂　作成2日目の１

にいがた食堂　作成2日目の１

1日目のコードが複雑すぎるのでkana本を参考に作成しなおした。

・横の幅と中央揃いをするための```wrapper```をどう記述するか迷ったが、ほかの箇所でも流用するため```ly_wrapper```というCSSを作成して、各コンテンツのクラスの2つ目として加えることにした。
・ナビのリストスタイル```list-style:none```は```ul```に入れる（```li```ではない…）
・ビッグフォト内の文字のスタイルをどう記述するか迷った→結果、ここでしか使わないので```hp_```という接頭語のCSSにした。

```
<div class="ly_bigPhoto">
    <header class="ly_header ly_wrapper">
      <h1><a href="index.html"><img src="img/logo.png" alt="にいがた食堂"class="el_logo"></a></h1>
      <nav>
        <ul class="bl_nav">
          <li><a href="#">当サイトについて</a></li>
          <li><a href="#">お問い合わせ</a></li>
        </ul>
      </nav>
    </header>
    <!-- /.ly_header -->
    <div class="ly_photoCont">
      <h2 class="hp_photoCont_h2">町の定食屋を動画でのぞき見</h2>
      <p class="hp_photoCont_p">入ってみたいけど中々入る勇気の持てない町の定食屋を動画覗いてみよう</p>
    </div>
    <!-- /.ly_photoCont -->
  </div>
  <!-- /.ly_bigPhoto -->
```

```
@charset "UTF-8";

/*ベース
==============================================-*/

body{
  color:#222;
  font-family: sans-serif;
  line-height: 1.5;
}

a{
  color:#804040;
  text-decoration: none;
}

img{
  max-width: 100%;
  vertical-align: top;
}

/*レイアウト
==============================================-*/

.ly_wrapper{
  width: 1230px;
  margin: 0 auto;
  padding:0 4%;
}

.ly_bigPhoto{ /*トップの背景画像のためだけ*/
  background-image: url(../img/mainphoto.jpg);
  background-size: 100%;
  min-height: 100vh;
  }

.ly_header{
  display: flex;
  justify-content: space-between;
}

.ly_photoCont{
  text-align: center;
  margin-top: 10%;
}

/*ブロック
==============================================-*/
.bl_nav{
  display: flex;
  list-style: none;
  margin-top: 20px;
}

.bl_nav > li{
  margin-left: 30px;
}

.bl_nav a:hover{
  color:#222;
}


/*エレメント
==============================================-*/

.el_logo{
  width:210px;
  margin-top: 14px;
}

/*ヘルパー
==============================================-*/

.hp_photoCont_h2{
  font-size: 3rem;
}

.hp_photoCont_p{
  margin:10px 0 42px;
}

```
![にいがた食堂.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166762/610d548b-7dac-f9f5-3dad-d13267d888a5.png)
マークダウン

#表題SpringMvc

####Di
http://www.code-magagine.com/?p=2585

#スペースであける
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
 
    @Configuration
    @ComponentScan
    public class BeanConfig {
 
	@Bean
	public TestBean configBean(){
		return new TestBean("Hello World!");
	}	
 
    }

#前後につける”```”

```
class Hoge
    def hoge
        print 'hoge'
    end
end
```
sssss
アプリアイコンを作るには何がいいの？

平凡な大学生ながらこの度「誕生日Book」というアプリを開発しました。
その中で少し迷ったIOSアプリのiconの作成方法について記事です。
「比べる」とかではないのです。ですが、圧倒的に使いやすく、感動しました。
迷うであろう人のために私が代わりに迷ったのでどうぞお読みください笑

**使ったもの**
sketchです！メリットとデメリットを紹介しようと思います。

**メリット**

アプリを開き、「テンプレート」を押すと、まずこのような画面が表示されます。
![スクリーンショット 2020-08-17 8.41.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668136/4bdea29a-3250-dd3b-de9c-c2b090662a2f.png)
![スクリーンショット 2020-08-17 8.44.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668136/5db76f64-ee39-168b-cad9-06a8e34e6a8e.png)
IOS App Iconを選択すると上のような四角が出て、ここにデザインし、exportをするだけで勝手に下のx-codeのアプリアイコンのところの全ての大きさがアップロードされます。（デザイン以外にも多少の操作は必要です）
![スクリーンショット 2020-08-17 8.43.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668136/aca83395-7715-edca-6431-6e10cbe3cdaa.png)
はい、これほどイージーゲームになります。

**デメリット**

お金がかかります。1万円を超えます。ここで私は躊躇して他の方法を考えました。
今となっては逆にこんなに安くていいの？って感じになりますのでご安心ください笑

そしてもう一つはわずかながら技術が必要です。技術というのは高性能ゆえの問題で、「どこを押せばどう操作されるのか」がとても多いです。最初は必ず迷うことでしょう。ですがアプリを作ってきた人たちならこのくらいの難しさで挫折することなどまずないでしょう。ネットで調べれば技術は大抵出てきます。

**まとめ**
私はsketchしか使ったことがないので他はわかりません。ですが自信を持ってオススメすることができます。そしてもちろんアプリicon以外にも使えます。
以上です！共にいいアプリを作っていきましょう！幸あれ！
Qiitaを書き始めて思ったこと

#この記事について
僕がQiitaを書き始めて約7ヶ月
どのように変わったかを書いていきます。ほとんど自己満です。

#プロフィール
- 22歳男性
- Webエンジニア
- Qiita投稿歴7ヶ月（当時学生）

#Qiitaに投稿しようと思った理由
当時学生だった僕と同じグループだった子がQiita投稿してるのをみて「カッケェ・・・」って言う浅い理由

#初めの１記事目
<a href="https://qiita.com/sonimaru/items/1ad95ce7d5df2fcd7e41">タスク管理ツール「ZenHub」を導入したお話</a>
この頃は正直、技術系の自信はなかった（今もない）から非技術的なことを書こうと思いました。

#初めての技術系記事
<a href="https://qiita.com/sonimaru/items/ea8a8ea65fce58e2c743">Vuejsのcomputedでsliceを使う方法</a>
タイトルが分かりづらい。
まあそれは置いておいて、技術系のブログだから正直めっちゃ緊張した。めっちゃ調べたし、投稿した後も自分の記事めっちゃみた。
けど、世間は思ったより自分に関心が低いみたいなのでコメントがつくどころかLGTMすらこなかった。

#約7ヶ月でどう変わったか
書く前は正直、「敷居が高い」とか「僕みたいな技術力ヨワヨワエンジニアが書くなんて烏滸がましい」とかって思いました。
しかし、書くたびその考えは薄れていって、
<b>誰かに教える</b>ではなくて<b>自分の備忘録</b>として使おうと思った。で、その影で<b>誰かの役に立てたらな</b>と思うようになりました。

#書こうかなって思ってる皆様へ
とりあえず、書いてみて！後から記事の削除できるし、別に失踪してもいいし・・・
本当に備忘録として使っていいと思います。敷居は高くないし、別に技術力がヨワヨワだからと言っても聞けばユーザは必ず教えてくれます。多分。多分ね・・・。責任押し付けないで
そして、あわよくばVue+Laravelの記事を増やして僕の仕事のお手伝いして。
Flutter で文字から空白文字をすべて削除

# はじめに

文字の前後から空白文字を削除するのは簡単です

```dart
String text = ' text ';

// 前後の空白文字削除
print(text.trim());

// 前の空白文字削除
print(text.trimLeft());

// 後の空白文字削除
print(text.trimRight());
```

ですが、これでは文字の中に入っている空白文字を削除することができません

Dart でも正規表現使います :sunglasses: 

## 環境

- macOS Catalina バージョン 10.15.6
- Android Studio 4.0

```
flutter --version
```

```
Flutter 1.20.1 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 2ae34518b8 (10 days ago) • 2020-08-05 19:53:19 -0700
Engine • revision c8e3b94853
Tools • Dart 2.9.0
```

前提条件

- Flutter のセットアップ済み
- Flutter プロジェクト作成済み

# いざ正規表現

以下を利用します

- [replaceAll](https://api.flutter.dev/flutter/dart-core/String/replaceAll.html)
- [RegExp](https://api.flutter.dev/flutter/dart-core/RegExp-class.html)

```dart
String text = '　te xt ';
print(text.replaceAll(RegExp(r'\s'), ''));
```

## 正規表現について

Dart は空白について、 Unicode White_Space プロパティ（バージョン6.2以降）と BOM 文字によって定義されているようなので、 `\s` は、以下の文字にもマッチします

| Name | Code point |
| --- | --- |
| CHARACTER TABULATION | U+0009 |	
| LINE FEED | U+000A |
| LINE TABULATION | U+000B |
| FORM FEED | U+000C |
| CARRIAGE RETURN | U+000D |
| SPACE | U+0020 |	
| NEXT LINE | U+0085 |
| NO-BREAK SPACE | U+00A0 |	 	
| OGHAM SPACE MARK | U+1680 |	
| EN QUAD | U+2000 |
| EM QUAD | U+2001 |
| EN SPACE | U+2002 |
| EM SPACE | U+2003 |
| THREE-PER-EM SPACE | U+2004 |
| FOUR-PER-EM SPACE | U+2005 |
| SIX-PER-EM SPACE | U+2006 |
| FIGURE SPACE | U+2007 |
| PUNCTUATION SPACE | U+2008 |
| THIN SPACE | U+2009 |
| HAIR SPACE | U+200A |
| LINE SEPARATOR | U+2028 |
| PARAGRAPH SEPARATOR | U+2029 |
| NARROW NO-BREAK SPACE | U+202F |
| MEDIUM MATHEMATICAL SPACE | U+205F |
| IDEOGRAPHIC SPACE | U+3000 |

実際に試してみると以下のようになります

```dart

final text = 'te\u0009\u000A\u000B\u000C\u000D\u0020\u0085\u00A0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFFxt'.replaceAll(RegExp(r'\s'), '');

print(text);

// 以下のような感じで出力されるはず
// flutter: text

// ただ、Unicode のバージョンによっては空白文字に U+0085 が含まれていないものがあるため
// その場合は以下のように表示されます（自分のiOSシミュレーターだったらこうなりました）
// flutter: te xt

```

## 参考

- [trim method](https://api.dart.dev/stable/2.9.1/dart-core/String/trim.html)
- [Whitespace character](https://en.wikipedia.org/wiki/Whitespace_character#Whitespace_and_digital_typography)

# おわりに

Dart でも正規表現使えて良いですね！
（正規表現何も分からない笑）
JavaScriptにおけるfunction(e)の「e」とは何なのか？

##事前知識

###イベント
Javascriptにおけるイベントとは、Webページ上で起こるあらゆるアクションの総称。例えば、ボタンのクリック、フォームへの入力、ページの読み込みなど、すべて「イベント」と呼ぶ。

###イベントハンドラー
ハンドラとは、英語でhandlerであり、動詞でいうhandle（扱う）に由来している。日本語にすると、「イベントを扱う」的な感じ。
実際、イベントハンドラーは様々なイベント（アクション全般）の発生時、それに紐づかせた処理を実行させることができる。
具体的に言うと、イベントハンドラーを登録することで、**「あるイベントA（クリックなど）が発生したとき、ある処理B（ページの色を変更させるなど）を実行させる」という自動的な流れを作ることができる**。それがイベントハンドラー。

###イベントリスナー
上で書いたイベントハンドラーとほとんど同じだが、１つだけ大きく異なる部分がある。それは、**「イベントハンドラーは一つのイベントに対して、１つの処理しか設定できない」**ということ。しかし、**「イベントリスナーは一つのイベントに対して、複数の処理を設定できる」**ということ。（イベントハンドラーに複数の処理を登録しようとすると、後の処理が優先され前の処理は上書きされる）

###コールバック関数
そもそもコールバックとは、簡単に言うと、関数の引数に別の関数をセットすること。
つまり、コールバック関数とは、そのセットされた関数を指す。
これによって何のメリットがるのかというと、例えばAという関数があり、その関数の引数にBという関数をセットしていたとする。すると、**「関数Aの処理が終わった後に、関数Bの処理を実行させる」**ということが可能になる。
よく使われるケースは、サーバーからデータを取得したあとに何らかの処理を実行するときなど。サーバーからのデータの取得を待たずに次の関数が実行されてしまうと不具合が生じる。

##本題　function(e)の「e」とは？
eventの略。イベントオブジェクトのこと。**イベントオブジェクトとは、発生したイベントに関する様々な情報を提供するオブジェクトのこと。**これは**そのイベントと紐づくイベントハンドラーやイベントリスナーで設定されたコールバック関数の引数として自動的に渡される。**加えて引数として渡されるこの**イベントオブジェクトは省略可能**なので注意。

###イベントオブジェクトにセットされている主なプロパティ一覧

|プロパティ|内容
|:---|:---|:---
|type|発生したイベントの型を返す|
|target|イベントの発生元であるオブジェクトを返す|
|timestamp|イベントの発生時間|
|pageX|クリックされたX座標|
etc...
Spring Boot のRest APIで空白文字列の削除(Jackson)

## 概要

Spring bootの全リクエスト共通で空白文字列を削除する時に、よくinitBinderを利用してtrim()処理を入れる記事などはある。しかしRest APIの場合はJacksonの設定を上書きし、jsonをデシリアライズする前に処理を入れる事によって実現が可能である。

- Spring boot 2.1.5
- Kotlin 1.3

### 試行錯誤

Spring bootの全リクエスト共通でtrim処理を入れたい時に、よくinitBinderを利用して全リクエスト共通で処理を入れる記事がある。
試したところRest APIでは利用できないようだ。([こちら](https://sites.google.com/site/soracane/home/springnitsuite/spring-mvc/04-ji-ben-gai-nian-controllerno-chu-lifuro)の 記事をみているあたりinitBinderはModelAttributeメソッドを利用する時のみ実行される?)

で次に試したのが該当のメンバ変数のsetterに `@JsonDeserialize` をつける方法だ。
https://stackoverflow.com/questions/6852213/can-jackson-be-configured-to-trim-leading-trailing-whitespace-from-all-string-pr
Kotlinではgetter/setterが自動で作成される為、カスタムsetterを作成するのも難儀なので断念。

で今回紹介するのはJacksonのModule作成機能を利用する方法です。


## デシリアライザの作成と登録

SimpleModuleを継承したクラスを作成し、デシリアライザを作成する。
今回はStringクラスのみ対象とし、when文で対象のプロパティのみtrim()する。

https://fasterxml.github.io/jackson-databind/javadoc/2.4/com/fasterxml/jackson/databind/module/SimpleModule.html

```kotlin
@Component
class StringTrimModule : SimpleModule() {
    init {
        this.addDeserializer(String::class.java, object : StdScalarDeserializer<String>(String::class.java) {
            override fun deserialize(p: JsonParser?, ctxt: DeserializationContext?): String? {
                val stringValue = p?.valueAsString
                return when (p?.currentName) {
                    "username", "mail_address" -> {
                        stringValue?.trim()
                    }
                    else -> {
                        stringValue
                    }
                }
            }
        })
    }
}

```

(参考)
https://gist.github.com/goeh/b542c7c02462ff4a7a8c
https://sites.google.com/site/soracane/home/springnitsuite/spring-mvc/04-ji-ben-gai-nian-controllerno-chu-lifuro
AtCoderProblemsのTrainingをPython3でやる Easy編

[ここ](https://kenkoooo.com/atcoder/#/training/Boot%20camp%20for%20Beginners)のEasy100のことです。
@tnodino さんの[この記事](https://qiita.com/tnodino/items/e4c1caef800e87464093)をみて「面白そうだなー」と思ったので勝手にパクりましたごめんなさい。
10個やるたびにあーだこーだ書いて公開するプランです。
提出したコードと、解いたときの考えと、解説を見て思ったことを書こうと思います。

[1-10](https://qiita.com/hortensia/private/31d7982f6d7481c8a8e1)
[11-20](https://qiita.com/hortensia/items/658ea99b8485f7e0fca4)
[21-30](https://qiita.com/hortensia/items/08c6d7cc1fc8ebd6dbea)
[31-40](https://qiita.com/hortensia/items/c77f7c046d1292d9617b)

ここからまだやってない

41-50
51-60
61-70
71-80
81-90
91-100
Mbed ボード GR-MANGO用Wi-Fi/Bluetooth Lora アダプタを作ったよ

GR-MANGOには、無線LANが搭載されていません。
今回は無線LANが使えるようにアダプターボードを製作しました。
##ボード概要
GR-MANGOはRaspberry Piと同じフォームファクタになりました。
ピンも同じ40ピンかつ、似たようなピンアサインだそうです。
(量産版は仕様が異なります）

今回のアダプタボードは、ESP32とLora用にRAK811を使用できるようにしました。

![GR-MANGOとWi-Fi/BLE Lora アダプタ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/672550b6-7b25-f31d-f55c-a8ccc596187c.jpeg)
![Wi-Fi/BLE Lora アダプタ　裏面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/62b0daf4-7690-bb37-b0b2-d71f6e446d72.jpeg)
##ボード仕様
ESP32とRAK811を40ピンのExConnectorで接続します。
GR-MANGOは、3.3V出力がしっかりしており、ESP32を使用しても全く問題なく使用できるようになっています。（5V→ 3.3V Max:3A）
これは、量産版にも引き継がれました。
ただし、万が一を考慮して5Vのレギュレータも使用できるようにしました。

ちなみに、試作品は、UARTの端子を間違えて配線してしまったために、ファームウェアを修正していましたが
Mbedのピンアサインを変更すれば問題が無いので、元に戻しています。

ピンソケットはピンソケット　２×２０（４０Ｐ）　ラズパイ用スタッキングコネクタを使用しています。
http://akizukidenshi.com/catalog/g/gC-10702/
これで、さらにスタック可能です。
##プログラム
プログラムは加藤 大樹さんのものを使用します。
WiFiのプログラムはこちら
https://github.com/d-kato/RZ_A2M_WebCamera_MIPI
BLEのプログラムはこちらを使用しています。
https://github.com/d-kato/RZ_A2M_BLE_sample
ESP32のATコマンドのファームウェアはこちらを参照して書き込みます。
https://github.com/d-kato/esp32-at-ble-stack
###接続画面
こんな感じで接続されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/512dacf8-cb3a-d293-218f-4be8fea7f21e.png" alt="" width="200" height="" border="0" />
Jenkinsfileをローカル環境で動作確認する方法

## 概要

[jenkinsfile-runner](https://github.com/jenkinsci/jenkinsfile-runner)を利用して、ローカル環境でJenkinsfileを動作確認する方法を紹介します。jenkinsfile-runnerはホストOS上でも実行させることが可能ですが、今回はDockerイメージを利用して実行する方法を紹介します。

## jenkinsfile-runnerの利用方法

### 基本的な実行方法

* 以下のコマンドを実行します。

`docker run --rm -v %Jenkinsfileを配置しているホストOSのディレクトリパス%:/workspace/ jenkins/jenkinsfile-runner`

* Jenkinsfileが実行され、Dockerのプロセスが完了します。

### サンドボックス環境を解除して実行する方法

* -ns (--no-sandbox)オプションを付与します。

`docker run --rm -v %Jenkinsfileを配置しているホストOSのディレクトリパス%:/workspace/ jenkins/jenkinsfile-runner -ns`
Railsでワクワク個人開発 　第2回:画面遷移図とログイン実装

# 画面遷移図を書こう

　人の記憶は儚いもので、各所に散らされたコードを見てもなんら思い出せることがない。githubのコミット履歴には確実に残っているが、そのときの私の思いはどこにあるのだろう。個人開発の記録を少しずつ記していく。

　画面遷移図を書いた。drawioという便利なソフトがあった。vscodeの拡張機能としても利用できたので大変ありがたい。
　この記事にとても詳しく書かれている。
　https://qiita.com/riku-shiru/items/5ab7c5aecdfea323ec4e

　![スクリーンショット 2020-08-11 22.58.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104211/9b335231-c27e-3cbb-77aa-5ab0b196ece1.png)
　drawioの操作感はわりと優れている。さっさと好きな絵がかける。githubにも図形がそのまま反映されるといいな。なにか方法があるはずだ。

　とりあえず風呂敷は広げるべきだ。まだ実装できないところもとりあえず書いておく。そうすれば後々いい思い出になるはず。


# ログイン機能の実装 
　さっそくログイン機能を作ろう。これはdeviseというgemをつかう。`Gemfile` に`gem 'devise'`　を追加してコマンドラインで`bundle install`を行う。
あとの詳しい設定はこちらの記事にある。
https://qiita.com/salvage0707/items/d3ddc889458ac186e62e

いろいろ書いてあるが、「4, viewファイルの生成」まで行えば問題ない。　（私はモデル作成のコマンドを　`rails g devise user`　とした。）

　htmlの表示を変更しよう。`app/views/layouts/application.html.erb`　を変更する。

```erb
<!-- 略 -->
   <body>
    <% if user_signed_in? %>
      <%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
    <% else %>
      <%= link_to "ログイン", new_user_session_path %>
      <%= link_to "新規登録", new_user_registration_path %>
    <% end %>
    <%= yield %>
  </body>
<!-- 略 -->
```
　よく調べていないが、このapplication.html.erbというのは全てのビューファイルの根幹になるものらしい。手打ちでHTMLをやっていたころにフレームページをつくったがそれに似ている。上記の `<%= yield %>` に各ファイルの内容が表示されるようだ。

　`<% if user_signed_in? %>` という文を書くことで、ログインしているかどうかで表示を変更できるようにしている。

　link_to記法はよく使われるものなので勉強したい。

```erb
<%= link_to 'link', パス名 %>
```

　linkが表示される文字、パス名に行き先を設定する。パス名はコマンドラインで`rails routes`とやると現在設定されているパスの一覧が表示されるので、それを参考にして欲しい。

　↓ rails guideに詳しい記述があった。

https://railsguides.jp/getting_started.html#%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AE%E8%BF%BD%E5%8A%A0


# おわり
　ちょっとずつ記憶が掘り起こされてきた感がある。これでログイン/ログアウトができるようになったので、ちょっとユーザーのサンプルデータをつくってみよう。seed.rbとかいうファイルに設定すればいい。それが終わったら今度はモデルの関連付けをする。これが曲者だった。
Overleafで画像挿入がうまくいかない時は

# TL;DR
JPGファイルのEXIF情報を消すとうまくいくかもしれません。

# 環境
[Overleaf](overleaf.com)を使用。
パッケージは下記の通り。

```
\usepackage{graphicx}
\usepackage{wrapfig}
\usepackage{makeidx}
\usepackage{fancyhdr}
\usepackage{setspace}
\usepackage{url}
```

`latexmkrc`は[こちら](https://ja.overleaf.com/learn/latex/Questions/Does_Overleaf_support_pTeX%3F)のものをコピペ。

# 経緯

使いたい画像がPDFファイルに埋め込まれていたため、[Adobe Acrobat Pro DC](https://acrobat.adobe.com/jp/ja/acrobat.html)を用いて抽出したのち、[ImageMagick](http://www.imagemagick.org/)を用いて縮小[^1]。

[^1]: 長辺が800pxになる

```
convert large_img.jpg -resize 800x800 small_img.jpg
```

縮小した後の画像サイズは800x600であった。
Overleafの編集画面で以下の記述をし、画像をアップロード。

```
\includegraphics[scale=0.5,bb=0 0 800 600]{small_img.jpg}
```

`bb`により埋め込まれる画像ファイル（not表示される画像）の大きさは指定されているはず[^2]。しかしサイズ指定がうまくいかないのか、妙に小さく表示される。

[^2]: `natwidth=800,natwidth=600`でもよい

色々と検索するうちに、[EPSファイルの表示時にメタデータが悪さをする](https://oku.edu.mie-u.ac.jp/tex/mod/forum/discuss.php?d=1595)ことがあると知った。表示したいのはEPSではなくJPGであるが、JPGにもメタデータがあったような……？

[こちら](https://qiita.com/hori@github/items/b67e8fd5662dc3d77655)を参考に`exiftool`をインストールし、以下のコマンドを実行する。

```
exiftool -all= small_img.jpg
```

このコマンドでEXIF情報を消去したものをアップロードしたら、うまく表示された。

たぶんバッドノウハウだと思うので、グッドノウハウをご存じの方はお知らせください。
Unity2020からTransformの回転値インスペクタでクォータニオンのコピーが出来るようになっていた

Unity2020からは**インスペクタ上でクォータニオンの値をコピーできる**ようになった、という地味な新機能紹介です。

![CopyQuaternion.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/7440526c-e106-0b1d-6241-132d4e48df1a.gif)
`Rotation`文字部分で右クリックするとコンテキストメニューが表示されるようになりました。
オイラー角(50, 30, -10)を`Copy Quaternion`すると、以下のコードがペーストされます。

```cs
// クォータニオンのペースト
Quaternion(0.386220366,0.269255698,-0.185263887,0.862561643)
```

とても便利です。  
上記の動画でも分かる通り**オイラー角**もVector3型でコピーできるようになりました。以下のようにペーストされます。

```cs
// オイラー角のペースト
Vector3(50.0000038,30.0000038,350)
```

同様に**Position、ScaleもVector3型でコピーできる**ようになっています。




----

今回紹介したTipsはUnityの安原さんの動画でさらっと紹介されています。
[納涼クォータニオン夏祭り - Unityステーション](https://www.youtube.com/watch?v=HCTQNJu8OhE)
逆離散フーリエ変換(IDFT)と実物理量

今、一般的に周波数$f_k$の振幅と位相を$c_k \in Z$としよう。そんな連続時間信号は以下で表される。

```math
x(t)= c_k e^{j 2 \pi f_k t }
```

これをいろいろな周波数$f_k$について足してみよう。

```math
x(t)= \sum_k c_k e^{j 2 \pi f_k t }
```

次に離散化された系を考えてみよう。周波数$f_k$はある間隔($\Delta f$)の定数$k$倍とする。また時間領域は$\Delta t$で一定間隔でサンプリングする。よって、$f_k = k\Delta f$, $ t=n \Delta t$になるだろう。これを上式に代入する。

```math
x(n \Delta t) \equiv x[n] = \sum_k c_k e^{j 2 \pi k \Delta f n \Delta t }
```

徐々にDFTの式に近づいてきた。$\Delta f, \Delta t$は任意の値として導入したものであるのだが、もう少し制約を設けてみよう。$k=1$, つまり周波数が$f = 1 \Delta f$の時、周期は$T_1 =1/\Delta f$になるが、$\Delta t$は, $T_1$を$N$分割した値と決めてみよう。つまり、

```math
\Delta t = \frac{T_1}{N} = \frac{1}{\Delta f N}
```

これを代入してみよう。

```math
x(n \Delta t) \equiv x[n] = \sum_k c_k e^{ \frac{j 2 \pi k n}{N} }
```
$\Delta f, \Delta t$は消えてしまったね。ほぼほぼIDFTの式だよね。

$k, n$の範囲には特に制限は設けていなかったけど、範囲の制限について考えてみよう。

FFT, IFFTでは周期的な関数を考えるから、$k=1$の一周期$T_1$におさまる範囲だけを考えよう。そうすると $n=0 ... N-1$の範囲に限定されるね。

$k$には制約があるかな？無限大の周波数 ($k=\infty$) まで行ける？ $n=1$の時(つまりサンプル0の次のサンプル)での位相を考えみよう。$n=1$では位相は $2 \pi k / N $だ。$k=N$ とすると、１サンプル後に位相が$2\pi$進むから、一個前のサンプルと同じ値になるよね。これじゃ意味ないわ。ということで、$k=0...N-1$とするのが良さそう。（感覚的説明なのであしからず・・・。ちゃんとした理論はサンプリング定理等をみるべきだと思う）。

ということで、

```math
x(n \Delta t) \equiv x[n] = \sum_{k=0}^{N-1} c_k e^{ \frac{j 2 \pi k n}{N} }, n=0...N-1
```

そして、物理量(時間$t$, 周波数$f$)と結びつけるのは、

```math
\Delta t =  \frac{1}{\Delta f N}, ただし \Delta t > 0, \Delta f > 0, N : 自然数
```

の関係だね。上記のうち登場する量は3つだけど、式は一つ。つまり、3つの量のうち、2つは任意に決められて、残り1つは他の2つから決まる、という関係と条件だね。

- $N=1000$, $\Delta f=100$Hzとするなら$\Delta t=1/100000$sec = 10us. 
- $N=100$, $\Delta t=1$msecとするなら$\Delta t=10$Hz
- $\Delta t=10$msec, $\Delta f=10$Hzとするなら、$N=10$.

通常コンピュータでの計算はIFFT等は無次元量で計算されるんだけど、それを実物理量に結びつける時には、上記の関係を使うよ。
next js に firebase の firestore を組み込む方法（firebase の初期化は一度だけ）

# 概要
next js で firestore を扱うときのメモです。

# 方法
基本下記の記事通りにコードを記述すればできるのですが、
（db.js を作るか都度 firestore のインスタンスを作成するかは好みだと思います）
[【Next.js】Cloud FirestoreをNext.jsに組み込みデータ取得](https://nekorokkekun.hatenablog.com/entry/2019/09/21/172416)

`lib/db.js` のコードにおいて、`db` を呼び出す度に firebase インスタンスを初期化してしまいエラーになってしまうので、**初期化は一度だけ行うように変更してください**。下記のコードは参考記事から抜粋した例なので、自身の好きなように書いてください。

```javascript
!firebase.apps.length
   ? firebase.initializeApp(firebaseConfig)
   : firebase.app()
```
参考: [Next.js + VercelでJAMstackなサイト作った話。](https://note.com/yamam00s/n/n82a3e8120a45)
S3のアクセスを特定のサービスロールに制限する

# 概要
AWSのS3に設定するバケットポリシーのお話です。
2パターン用意したので好きな方使うとよいです。

# 特定のサービスロールのみを許可する方法

```json
{
    "Version": "2012-10-17",
    "Id": "{POLICY_ID}",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::{ACCOUNT_ID}:role/{ROLE_NAME}"
                ]
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::{REPOSITORY_NAME}/*"
        }
    ]
}
```


# 特定のAWSアカウントからのサービスロールを全て許可する方法

```json
{
    "Version": "2012-10-17",
    "Id": "{POLICY_ID}",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "*"
                ]
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::{REPOSITORY_NAME}/*",
            "Condition": {
                "ArnLike": {
                    "aws:PrincipalArn": [
                        "arn:aws:iam::{ACCOUNT_ID}:role/*"
                    ]
                }
            }
        }
    ]
}
```

## 備考
1個目で`{ROLE_NAME}`にワイルドカード設定すればいけそうなもんだけどダメでした。
CentOS7でmoduleコマンドでエラーになる場合の対策

CentOS7でmoduleコマンドでエラーになる場合の対策

```
-bash: module: command not found
```
moduleコマンドが使えなくなったenvironment-modules.x86_64の代替
Lmodをyumでインストール

```
#cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)

#yum install Lmod
```

サーバを必ず再起動、後にmoduleコマンドが実行できることを確認

```
# module avail

---------------------------------------------------- /usr/share/lmod/lmod/modulefiles/Core -----------------------------------------------------
   lmod    settarg

Use "module spider" to find all possible modules and extensions.
Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys".

```
下記サイトを参考。
https://qiita.com/7of9/items/824191342a04a785be1b
【.NET】 私、 [対象プラットフォーム] は [Any CPU] でって言ったよね!

# 記事のタイトルに深い意味はありません。
そんな感じのタイトルの作品があったなぁと思って。

# 概要
先日C#で簡単なツールを作っていたら、``WOW64`` の ``ファイル システム リダイレクト`` がかかっていた。 ``Any CPU`` でコンパイルしているはずなのに、とタスク マネージャーを見たら、おいおい ``32bit プロセス`` で動いているじゃねぇかFxxxxxck!


# 設定
プロジェクトの  ``プロパティ`` の ``ビルド`` より ``32bitを選ぶ`` のチェックを外す。
(Visual Studo 20019の場合)

![Visual Studo 20019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/c49e9038-1638-7dd8-d25f-96f2c6230a00.png)


# 効果
言わずもがな、**Java** や **CLR** などのVM型実行環境って そもそも ``Any CPU`` にこそ真価が有ると思うのだが。。。

* **Any CPUで動く。**  
   * x86版 Windows では32bitで動く。
   * **x86_64版 Windows では64bitで動く。**  
     ⇒ フォルダ リダイレクトがかからなくる。  
     ⇒ 無計画に ``P/Invoke`` すると ``BadImageException`` で死にやすい。  
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(無計画が悪い。。。:sweat_smile:)




# これ何のための設定？
* ``対象プラットフォーム`` には ``Any CPU`` でビルドしてるのに、  
  ``x86_64版 Windows`` 上でも  ``32bit プログラム`` として動かしたいってこと？　なんで？？？？:thinking:
* ``x86_64版 Windows`` でも ``x86_64 モード`` より ``x86 モード`` のプログラムの方が早い事が多いとか、そんな話？:thinking:  
  ( ``x86_64`` CPU には 実行モードを切り替える ``コンテキスト スイッチ`` があり、 Windowsではプロセス単位で切り替えに対応し、 **ネイティブ コード** で実行させていたと思った。)
* ``AArch64`` にも **32bit モード**があるらしいので、 ``ARM CPU`` も見据えた設定？ :thinking:

Visual Studio 20013から設定はあった様だけど、とりあえず全然意味が分からない。。。

# (追記)

* -platform (C# コンパイラ オプション) | Microsoft Docs  
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-options/platform-compiler-option

![matrix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72257/c15745ea-b416-c45a-3e21-1a48f0000f8a.png)


こういうこと？
arm版やia64版なんて持っていないからわからないけど。
(x86_64のx86モードを良しとするなら、ia64版やarm版 Windowsのx86エミューレーションも効いたりするのかな？)
``platform:anycpu32bitpreferred`` のARMがやっぱポイントなのかな？

# 参考
* -platform (C# コンパイラ オプション) | Microsoft Docs
  https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-options/platform-compiler-option

*  .net — Visual Studioの "Any CPU"ターゲットとはどういう意味ですか？
  https://www.it-swarm.dev/ja/.net/visual-studio%E3%81%AE-any-cpu%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E3%81%A8%E3%81%AF%E3%81%A9%E3%81%86%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/958269106/

* CLR via C# - Jeffrey Richter - Google ブックス
  https://books.google.co.uk/books?id=36tCAwAAQBAJ&pg=PT38#v=onepage&q&f=false

* Visual Studioの[32ビット優先]設定の目的は何ですか、また実際にはどのように機能しますか？
  https://qastack.jp/programming/12066638/what-is-the-purpose-of-the-prefer-32-bit-setting-in-visual-studio-and-how-does

* What AnyCPU Really Means As Of .NET 4.5 and Visual Studio 11 - DZone IoT
  https://dzone.com/articles/what-anycpu-really-means-net
* Visual Studio 11 と .NET 4.5 で Microsoft が AnyCPU を再定義
  https://www.infoq.com/jp/news/2012/04/anycpu_vs11/
[VSCode]Pythonのデバッガが標準入力を受け付けなくなった

# 概要
いつも通りPythonのコードを書き，バグったのでF5を押してデバックをしてみたが，動かなかった．
色々なコードを試した結果，標準入力（私はinput()で止まった）があるとそこで止まってしまう．

# 結論(うまく直せた)
VSCodeのPython拡張機能(ms-python.python)が悪さをしているっぽい．
この拡張機能のバージョンを落とすとこの問題は解決できる．
修正前: 2020.8.101144 (12 August 2020)
修正後: 2020.7.1 (22 July 2020)

# 詳細
## 何が起きたのか
f5キーを押してデバッグすると標準入力（input()）で入力（下の図であれ「a」）を受け付けてくれずフリーズした．
本来であれば「ba」と表示され９行目のブレークポイントで止まるはずだが...
![なにが起きたのか.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287974/c5c3fa01-114a-c03b-814d-f7cbfd235d94.png)

## 実行環境
### PC 
```

MacBook Air (13-inch, 2017)
Catalina 10.15.3
```
### VSCode

```
バージョン: 1.48.0
コミット: db40434f562994116e5b21c24015a2e40b2504e6
日付: 2020-08-13T08:03:27.059Z (3 日前)
Electron: 7.3.2
Chrome: 78.0.3904.130
Node.js: 12.8.1
V8: 7.8.279.23-electron.0
OS: Darwin x64 19.3.0
```
## 試したこと
私の場合は拡張機能が悪さしていたが参考のために試したことを残しておく

- 拡張機能のバージョンダウン

- launch.jsonのconsole部分の変更（今回は関係なかった）

### 拡張機能のバージョンダウン
![version_down_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287974/6d5e2c15-8805-1a02-8091-2016353fef53.png)

私は2020.7.96456を選択した
![version_down_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287974/3d840e0c-3af3-507e-e3e1-3cb16ea15abe.png)

### launch.jsonの変更

![launch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287974/416b62fd-8d21-1feb-23a0-df89235db1c9.png)

最終的は私の設定はこんな感じ

```
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
    
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            
        }
    ]
}
```
### なぜ拡張機能のバージョンを落とすに至ったか
今回VSCodeのデバッガがうまく動かなくなった際に色々調べたが，拡張機能に触れているものはなかった．なぜ私が拡張機能のバージョンを落とそうとしたかといえば，VSCodeの更新があった際に表示されるレポートがあったからだ．これのおかげでそういえば最近Python周りでアップデートがあったなと気がつくことができ，拡張機能の変更Logを見て，Debug周りに変更がありまさかと思い，バージョンダウンをした．

## まとめ
デバッグはよく使う機能のでとりあえず動くようになってよかった．
今回vscodeを開くと出てくる更新があった場合レポートを表示する設定にしてあったことが幸いした．
今回はその場しのぎでバージョンを下げたが，拡張機能の更新Logを見るとDebug機能周りだと，
「Added "pythonArgs" to debugpy launch.json schema. 」とかかれているのでここの設定をいじって上げるといいかもしれない．拡張機能の最新版で動くようになったらまた記事を更新しようと思う．
MySQL④


#後から一意制約を付ける alter table テーブル名 add unique unique_name(カラム);

例えば、usersテーブルのnameフィールドをuniqueにしたい、という場合には以下のようにしてあげるといいでしょう（unique_nameはインデックスの名前なので適当につけてあげればOKです）。

mysql> alter table users add unique unique_name(name);

#後から一位制約を外す　alter table テーブル名 drop index unique_name;
またこのunique制約を外したい場合は、うえで付けたインデックスの名前を使って次のようにしてあげればOKです。

alter table users drop index unique_name;





#テーブルの構造を変える

####カラムを追加する 　alter table テーブル名 add column カラム名 データ型;
alter table users add column email varchar(255);

####追加する場所を指定する
nameカラム のあとに追加したかった場合には

alter table users add column email varchar(255) after name;

####カラムを削除する　alter table テーブル名 drop column カラム名;

alter table users drop column score;

####カラムを変更する　alter table テーブル名 change 元カラム名 新カラム名 データ型 オプション;
alter table users change name user_name varchar(80) default 'nobody';

####テーブルの構造を確認する
desc users


####テーブル名を変える　alter table 元テーブル名 rename 新テーブル名;
alter table users rename persons;
MagicLeapでTextMeshProのSpriteAssetが片目が描画されないときに確認したいこと

とりあえず対症療法だけどメモ

ProjectSettings > XR Plug-in Management > MagicLeapSettings にあるForceMultipassにチェックを入れることでとりあえず描画できる

![Settings.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212999/185ecc6a-a340-3767-6447-954feff47316.jpeg)

ただSinglepassStereoRendeeringのほうがパフォーマンス的にはよいのでできればTextMeshProで利用しているマテリアルをSinglepassに対応したものに差し替えたほうが良いかも
多重継承

カンマで区切る事で複数継承することができる

```python:qiita.py
class Person(object):
    def talk(self):
        print('talk')

class Car(object):
    def run(self):
        print('run')

class PersonCarRobot(Person,Car):
    def fly(self):
        print('fly')

person_car_robot = PersonCarRobot()
person_car_robot.run()
#run
person_car_robot.talk()
#talk
person_car_robot.fly()
#fly
```

##同じメソッドが存在する場合
継承する順番で優先度が定まる

```python:qiita.py
class Person(object):
    def talk(self):
        print('talk')

    def run(self):
        print('person_run')

class Car(object):
    def run(self):
        print('run')

class PersonCarRobot(Person,Car):
    def fly(self):
        print('fly')

person_car_robot = PersonCarRobot()
person_car_robot.run()
#peroson_run
```
WindowsのVSCodeでDocker / Remote - Containersプラグインを使う(公式DDW・DTB・WSL2無しで)

## 概要

公式で配布されている[DDW(Docker Desktop for Windows)](https://www.docker.com/products/docker-desktop)・[DTB(Docker ToolBox on windows)](https://docs.docker.com/toolbox/toolbox_install_windows/)、そしてDocker対応のWSL2も使わず、
WindowsのVSCodeからDockerプラグイン、Remote - Containersプラグインを使ってコンテナ操作をするためのメモです。

## Linux側の設定

まず、Linux側で外部のDockerクライアントの要求に対応できるようにしないと使えませんので設定しておく必要があります。

/etc/docker/daemon.jsonで以下のように設定します。ファイルが存在しなければ新規に作成します。2375の部分は任意のポート番号に設定できます

```/etc/docker/daemon.json
{"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]}
```

Docker本体にはユーザー制御的なものは存在しないようなので、ファイアウォールや接続ipの限定でアクセス制限をしないと外部からやりたい放題されるリスクがあります。

同一マシンの仮想PCの場合、通常はWindowsファイアウォールで許可しない限りは外部から接続できませんが、不安なら仮想化ソフトのポートフォワーディング設定でホスト側の対象のアドレスをlocalhostに制限すれば外部からの接続を遮断できます。

## Docker CLI / Docker-Composeのダウンロード

Windows側に[Docker CLI](https://github.com/docker/cli)、[Docker-Compose](https://github.com/docker/compose)をダウンロードします。

Docker CLIは公式では[自身でビルドする必要がある](https://dev.classmethod.jp/articles/using-docker-cli-for-windows/)ようなので、面倒なら[ビルド済みバイナリ](https://github.com/StefanScherer/docker-cli-builder/releases)を公開している人がいるのでそこからdocker.exeをダウンロードします

Docker-Composeは[公式でバイナリ配布](https://github.com/docker/compose/releases/)されているので、そこからdocker-compose-Windows-x86_64.exeをダウンロードしてdocker-compose.exeにリネームしておきます。


## コマンドラインから使ってみる

ダウンロード(ビルド)したdocker.exe、docker-compose.exeがあるフォルダにパスを通します。

DOCKER_HOST環境変数で接続先のDockerのアドレスとポートを設定します。同一マシン内の仮想PCのDockerに接続する場合は次のようにします。

```bat
set DOCKER_HOST=localhost:2375
```

設定に問題なければこれで使えるようになっているはずです。```docker ps```してみたり```docker run hello-world```してみたりしてください。

## VSCodeのDockerプラグインを使う

Linux側のDockerが起動しており、PATHとDOCKER_HOST環境変数が適切に設定されていればプラグインをインストールするだけで使えるようになるはずです。

バッチファイルやWindowsの設定で環境変数を設定せず、VSCode内で完結させたい場合は前項のDOCKER_HOSTと同じ内容(localhost:2375)をVSCode設定のdocker.hostに、Docker.exeがあるフォルダを[terminal.integrated.env.windows](https://qiita.com/mysticatea/items/063b1a5ce5f49eb12cd2)に設定しておきます。

## VSCodeのRemote - Containersプラグインを使う

Remote - Containersプラグインはどうもdocker.exeにパスが通っていても実行しないようなので、remote.containers.dockerPathにdocker.exeのフルパスを設定する必要があります。

Dockerプラグインが正常に動作している場合は設定されているはずですが、使わない場合はDOCKER_HOST環境変数またはVSCode設定のdocker.hostに接続先のアドレスとポートを指定しておく必要があります。

## 感想

今のところ個人的にはWindowsからDocker環境を整えるメリットはVSCodeのRemote - ContainersプラグインでWindowsからリモートコンテナ開発ができることくらいだと思います。

コマンドラインはSSH接続で直接Linuxから実行すればいいわけですし、GUIツールも特別必要な機能がなければ導入がdockerコマンド2行で済みWebブラウザで操作できる[portainer](https://www.portainer.io/installation/)なんかで十分だと思います。

コンテナにSSHサーバーを入れてSSH接続できるようにすればRemote - SSHプラグインで同じことができるのですが、リモート開発したいコンテナが複数に渡ると対象のコンテナ全てにSSHサーバーを入れてポートを割り当てないといけないのでSSHサーバーを都度コンテナに導入する手間とWindowsにDocker環境を整える手間のどっちが少ないかの問題になるんじゃないかと思います。
３秒で理解する async/await関数 の並列実行

async/awaitによる非同期処理を、いくつかまとめて並列実行したい場合のやり方です。
多くの資料が、返り値を利用しない場合のやり方しかまとめられておらず、
返り値を利用したい場合にどうすればいいかわからなかったので、調べてまとめました。

### 1. 関数の返り値を利用したい場合

```JavaScript
async function 関数() {

  //実行するときにはawaitをつけず
  const 変数A = 非同期関数A();
  const 変数B = 非同期関数B();

  //利用するときにawaitをつける。
  console.log([
    await 変数A,
    await 変数B,
  ]);

}
```

### 2. 関数の返り値を利用しない場合

```JavaScript
async function 関数() {

  //await Promise.All()の引数（配列）に関数をいれて実行することで、並列実行してくれる。
  await Promise.All([
    非同期関数A(),
    非同期関数B(),
  ]);

}
```

**P.S.**
間違っていたら教えてくださいm(_ _)m
macで環境変数を設定＆呼び出す方法


slackbotなどを作るときに、TOKENを直接プログラム内に記述すると、情報漏れて危ない為、osの環境変数に設定することが推奨されています。

意外と、設定方法だけ書いてある記事が少なかったので、メモ。


```python

export API_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxx (→取得したTOKENを指定)
```

これで環境変数が設定完了

環境変数を呼び出すときは、

```python

$API_TOKEN
```

pythonから環境変数を呼び出すときは、

```python

import os
os.environ["API_TOKEN"]
```

## 注意点
上記の環境変数ですが、基本的にサーバーをログアウトすると消えてしまいますので一時対応となります。

もしサーバーにアプリをリリースして、運用したいといった場合は、**~/.bash_profileと~/.bashrcに環境変数の設定を保存しておく**必要があります。

[対応手順詳細はこちらの記事](https://it-ojisan.tokyo/mac-bash/)が参考になります。
Ublox ZED-F9P RTK-GNSS 基準局の構築

Ublox ZED-F9P RTK-GNSSをu-center、RTKLIBで構築します。

# 使用環境
- Ubuntu 18.04
- Qt Creator 4.12.4
- QT 5.12.5 GCC 64bit
- RTKLIB 2.4.3 b33
- Ublox ZED-F9P (GNSS受信器)
- Ntripサーバー (www.rtk2go.com)

# 使用パッケージ

- [RTKLIB](https://github.com/tomojitakasu/RTKLIB)

Ublox ZED-F9Pの基準局情報をNtripサーバーに発信する。

# 1. RTKLIBを使ってUblox ZED-F9Pから基準局情報RTCM3を発信

- RTKLIBからソースをダウンロードしてビルド

[RTKLIB 2.4.3 b33](https://github.com/tomojitakasu/RTKLIB)

```
git clone -b rtklib_2.4.3 https://github.com/tomojitakasu/RTKLIB.git
cd RTKLIB/lib/iers/gcc/
make   
cd RTKLIB/app/consapp
make  
```

注：RTKLIB GUI版のインストールは、[RTKLIB 2.4.3 CLI版 GUI版 をUbuntu18.04にインストール](https://qiita.com/k-koh/items/3cf612eb7428375ef2cf)参考します。

- Ublox ZED-F9Pの基準局のserial portから取得した基準局情報RTCM3をNtripサーバーに発信

```console
cd str2str/gcc
./str2str -in serial://ttyACM0:230400#rtcm3 -out ntrips://:YOUR_PASSWORD@rtk2go.com:2101/[基準局のMountPoint]
```

str2str の実行ログ

```console
stream server start
2020/08/16 16:24:32 [CW---]          0 B       0 bps (0) /dev/ttyACM0 (1) connecting... 
2020/08/16 16:24:37 [CC---]      31079 B   42057 bps (0) /dev/ttyACM0 (1) rtk2go.com/[基準局のMountPoint]
```

ttyACM0は、PCに挿した基準局ZED-F9Pのシリアルポート
:YOUR_PASSWORDは、rtk2go.comに送信でユーザID無し(:の前)、パスワード(:の後)のみ必要
230400は、u-centerで基準局ZED-F9Pのserial baud rateの設定値


(注：RTKLIB GUI版のSTRSVR-QTでも同じ機能を実行できます。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386259/5528ff52-6e11-235f-6763-9441856d3543.png)


# 2. 基準局と移動局は、ローカルネットワークで運用

基準局と移動局は、ローカルネットワークで運用する場合、基準局情報RTCM3をローカルネットワークに発信できます。

## 基準局側

- Ublox ZED-F9Pの基準局のserial portから取得した基準局情報RTCM3をローカルネットワークに発信

```console
cd str2str/gcc
./str2str -in serial://ttyACM0:230400#rtcm3 -out tcpsvr://192.168.11.6:2101
```

str2str の実行ログ

```console
stream server start
2020/08/17 01:45:34 [CW---]          0 B       0 bps (0) /dev/ttyACM0 (1) waiting... 
2020/08/17 01:45:39 [CC---]      38679 B   43551 bps (0) /dev/ttyACM0 (1) 192.168.11.6
```

ttyACM0は、PCに挿した基準局ZED-F9Pのシリアルポート
基準局PCのIPは、192.168.11.6
230400は、u-centerで基準局ZED-F9Pのserial baud rateの設定値
TCPポートは、2101


## 移動局側

- ローカルネットワークから基準局情報RTCM3を受信して移動局のシリアルポートに入力

```console
cd str2str/gcc
./str2str -in tcpcli://192.168.11.6:2101#rtcm3 -out serial://ttyACM1:230400
```

str2str の実行ログ

```console
stream server start
2020/08/17 01:45:37 [CC---]          0 B       0 bps (0) 192.168.11.6 (1) /dev/ttyACM1 
2020/08/17 01:45:42 [CC---]      33223 B   42435 bps (0) 192.168.11.6 (1) /dev/ttyACM1
```

ttyACM1は、PCに挿した移動局ZED-F9Pのシリアルポート
移動局PCのIPは、192.168.11.6
230400は、u-centerで移動局ZED-F9Pのserial baud rateの設定値
TCPポートは、2101