OmniAICreator/Qiita-1.07M huggingface dataset:
Simple Data Integrator (SDI) 実践入門：SDIインストール

# SDI 動作環境　事前確認

||動作環境|
|:--|:--|
|OS|Windows 2019 / 2016 / 2012 R2 / 2012  <br /> Windows 11 / 10 / 8.1 <br />※64bit版のみサポート、32bit版は動作しません。|
|.NET|Microsoft .NET Framework 4.7.2 以上|
|CPU|特に条件なし、上記のOS動作するなら問題ない|
|メモリ|4GB 以上|
|ディスプレイ|画面解像度 1280* 800 以上|

動作環境参考資料：
https://ja.sdi.ricct.com/userguide/systemarchitecture/#_3


# 1. SDIインストールファイルダウンロード
下記のURL
https://ja.sdi.ricct.com/start/setupsdi/
STEP１を参照します。

`Simple Data Integrator *.*.****.*` をダウンロード、ダウンロードしたファイルを解凍します。
※最新バージョンダウンロードできます、過去のバージョン必要な場合サポートに連絡する必要があります。

# 2. インストール
上記のSTEPで解凍した`SimpleDataIntegratorSetup.msi`　を実行します。

## ウィザード画面
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/e6a9eda2-9a68-af1a-ce4b-f9a847df2186.png" width="500">

## インストールフォルダー選択、対象ユーザーを設定

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/3b9b7a98-ff54-c5e6-f0f1-731a92c316ae.png" width="500">

## インストール確認画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/9e07c70f-3789-682d-843a-341d6a3befac.png)

## インストール完了画面

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/4f5732f2-9223-a809-0650-be1026130d75.png" width="500">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/9e8899f5-f5d8-fad8-f951-cb68e41e273d.png" width="500">


##  ワーカーエージェントのWindowsサービスをインストール　(Windowsサービス名：`SimpleDataIntegratorWorker`)
※SDIのエージェントはWindows Serviceとして動作しています。
管理者権限でコマンドプロンプトを起動します。
下記のコマンドを実行してワーカーエージェントのWindowsサービスを作成します。

```
sc create "SimpleDataIntegratorWorker" binPath="C:\Program Files\RiCCT\SimpleDataIntegrator\DataIntegratorService.exe" DisplayName="SimpleDataIntegratorWorker" start=delayed-auto
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/6b250d97-93b5-6eec-e01e-05e3a54dd534.png)

実行結果は　`[SC] CreateService SUCCESS`　になれば成功です。 

# 3. 確認

## SDI Studio
デスクトップに下記のアイコン作成されます。ダブルクリックすればSDI Studio起動されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/479615c2-26b4-1aad-9b9e-4a8447bfc953.png)

## SDI ワーカーエージェント
SDI Studioを起動します、ワーカータブをクリックして、エージェントのステータスを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/b4293e10-76f9-3584-31d9-554d848af394.png)

初回インストール完了した時点、サービスは起動されていません、
サービス管理ツールを開いて起動します。
※サービスはデフォルト自動起動になっています、Windows再起動の際起動する必要がありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/dd9133ef-fac5-dfd0-aa87-2e4aa4aaa90a.png)

エージェントのWindowsサービス`SimpleDataIntegratorWorker`起動されたら、エージェントとWindowsサービスのステータスは正常になっていること確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560129/328e3d7c-7618-b1dd-2658-a42205ce87bd.png)

以上です。

[Simple Data Integrator (SDI) 実践入門](https://qiita.com/RiCCT/items/3dc109ff82546459a8b0 "Simple Data Integrator (SDI) 実践入門")

# 参考資料
[SDI日本語公式サイト](https://ja.sdi.ricct.com/ "SDI日本語公式サイト")
[SDI English Official Website](https://sdi.ricct.com/ "SDI English Official Website")
[SDIインストールドキュメント](https://ja.sdi.ricct.com/start/setupsdi/ "SDIインストールドキュメント")
<備忘録>Railsでslickを使って簡単にカルーセルデザイン

こんにちは。

今日はrailsアプリにslickを導入して
スライダーを実装していこうと思います。

# 環境
* macOS      Monterey 12.３.1
* Ruby       3.1.2
* Bundler    2.3.10
* Rails      6.1.4.7

# 流れ
1.　jQueryインストール
2.　slickの設定
3.　デザイン

# 1. jQueryインストール
rails6系はjQueryをwebpackを使ってインストール済み。

# 2.　slickの設定
公式サイト
http://kenwheeler.github.io/slick/

まずslickを導入するためにCDNのコードを
application.html.erbに貼り付けます。
CDNのコードは公式サイトに載っています。

```html: application.html.erb
 //下記2行をhead内に記述
 <link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css"/>
 <script type="text/javascript" src="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>
```
好きなスライダーをサイトの「demos」のコードを
html内もしくは
app/javascriptにjsファイルを作って貼り付けます。

```: 例
$('.multiple-items').slick({
  infinite: true,
  slidesToShow: 3,
  slidesToScroll: 3
});
```


# 3. デザイン
公式サイトのCDNコードが記載されている上に
「Download now」があるのでクリックすると
slickフォルダーがダウンロードされます。

ダウンロードされた中の
「slick.scss」と「slick-theme.scss」は「app/assets/stylesheets」に、
「slick.min.js」は「app/javascript」に配置します。

「slick.scss」と「slick-theme.scss」を
application.scssに読み込ませます。

``` :application.scss
　//下記2行を追加
  @import "slick-theme";
  @import "slick"; 
```

あとはcssで見た目を整えれば終了です。


### 参考

https://techtechmedia.com/slick-raills/
【考察】Oracle Clientを何度もインストールするとどこのtnsnames.oraを使っているかわからなくなるという話

# はじめに
Oracleクライアント（ODP.NET）のバージョン違いを複数クライアントPCにインストールした際、どのOracle Homeにあるtnsnames.oraを使ってサービス名を解決しているのかが分からなく場合がある。
この記事では、どのtnsnames.oraが利用されているかを、各種設定情報を頼りに読み解く方法を解説しようと思う。
ただし、記事の内容は経験則で書かれているため、公式資料に基づいた内容ではない。その点は留意しておいてほしい。

# Oracleクライアントをインストールした時のOracle Homeとレジストリの状態
初めてPC上にOracleクライアントをインストールした場合、デフォルトではCドライブ直下に以下のようなOralce Homeのフォルダが作製される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484026/349df05a-3dab-cfc4-66cb-e3a4197557bd.png)

同時にレジストリにもOracleの設定情報が書き込まれていることが確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484026/568dc3c0-aa33-9814-775c-1e0792169dda.png)

# Oracleクライアントを複数回インストールするとどうなるか
既にOracleクライアントがインストールされている環境に新しくOracleクライアントをインストールすると、フォルダ構成は以下のような状態になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484026/0ab76889-64fa-098b-b971-777cf2a78f16.png)
レジストリにも新しく、Oracle Homeが追加されていることがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484026/24df49a7-239f-3c36-fd56-9516eeb28284.png)

# DLLはどこを指定しているか？
複数のOracle Homeが存在する状態でも、レジストリにはひとつのODP.NETしか登録されていない。
この配下にある.NET Framework 4+の構成(4.122.19.1)に**DllPath**というキーが存在している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484026/94b7042c-999c-6c97-cc6d-1ce355da2511.png)

この値は"依存する非管理Oracle Clientバイナリのロード元を指定"を指定しているが、ここでいずれかのOracle Homeのbinフォルダが指定されているはずである。
binフォルダにはOracle.Keyというファイルが存在しているが、その中身は以下ような内容である。
```text:Oracle.Key
SOFTWARE\ORACLE\KEY_OraClient19Home2
```
つまり、レジストリに定義されているどのOracle Homeを見に行くべきかが書かれていて、その配下のtnsnames.oraファイルを用いてサービス名を解決しているようである。
実際に以前試したところでは、この値をもう一つのOracle Homeの値に変更すると、そちらのtnsnames.oraが優先されることが確認できた。

# 環境変数で強制的に指定する方法
ここまで、どのtnsnames.oraを見ているのかを確認する方法を書いてきたが、実は強制的に見に行くtnsnames.oraを指定する方法がある。
その環境変数は**TNS_ADMIN**である。TNS_ADMIN環境変数の値に、利用したいtnsnames.oraファイルの存在するフォルダパスを定義することで、レジストリの値に関わらずそのファイルを利用するように指定することできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484026/3e34ac21-ac5d-f717-0f5a-2679071f6581.png)

# 参考サイト
https://www.shift-the-oracle.com/oracle-net/tnsnames.html
http://www.dba-oracle.com/t_windows_tnsnames.ora_file_location.htm
https://winofsql.jp/VA003334/infoboard_page.php?mid=oracle&id=040205003135
BrainFuckで使えそうな短文（関数?）集

# なにがしたいの？？？
[Wikipedia](https://ja.wikipedia.org/wiki/Brainfuck)によるとどうやらBrainFuckはチューリング完全で計算能力的にはC言語と同等らしい（ほんまに？）ので、簡単なC言語をBrainfuckに直したい！！！あくまで自分のための記録用。

# 用語
 ~~単語を調べるのが面倒で自分で言葉を作っているかもしれないので~~ここでしか使われていない可能性のある単語を一応羅列します（必要があればさらに追加します）
- セル
    Brainfuckで使われるバイト列の一つ一つのマス。セル0から始まってセル1, セル2,,,という感じで数えます。
- 右/左
    Brainfuckのバイト列の正/負の方向

# 注意点
断りのない限り各セルは最初に0に初期化され、ポインタはセル0を指しているものとします。
全てのセルは非負整数であるとして、負の数を取らないようにしますし、負の数が扱われることはないという前提で進みます。負の値を入れた場合の処理は現段階では保証しません。やる気が出たら考えます。
# 短文（関数?）集
### セルのコピー
セル0に予めなんらかの値を与えます。
```
[->+>+<<]
```
実行後はセル0の内容がセル1とセル2に書き込まれます。ただし、セル0自身は0になり、ポインタはセル0を指します。

### セルの移動
セル1に予めなんらかの値を与えます。最初ポインタはセル1を指しています。
```
[->+<]    #右移動
[-<+>]    #左移動
```
実行後、右移動ではセル1にあった内容がセル2に書き込まれ、セル1は0になります。左移動ではセル1にあった内容がセル0に書き込まれ、セル1は0になります。ポインタはセル1（最初の位置）を指します。上のセルのコピーはこれの応用です。

### 回数指定の繰り返し
セル0に繰り返し回数を指定します。これには複数の書き方がありますが、そのうち一つを紹介します。
```
[->(some process)<]
```
(some process)の最初と最後でポインタの位置が同じでないといけません。実行後は(some process)がセル0の数字の回数だけ繰り返されたあとセル0が0になって、ポインタがセル0を指します。

### 掛け算
セル0とセル1に予めなんらかの値を与えます。
```
[->[->+>+<<]>>[-<<+>>]<<<]
```
実行後はセル0とセル1の積がセル2に書き込まれ、セル0が0、セル1は変化せず残ります。ポインタはセル0を指します。セル1がそのまま残って汚いですね。

### ゼロ初期化
セル0に何らかの値を入れます。
```
[-]
```
実行後、セル0は0になります。

# さいごに
思いつき次第いくらでも追記します。
【Laravel8】App\Models\User::isAdmin must return a relationship instance. の解決策

`App\Models\User::isAdmin must return a relationship instance.`
のエラーが出たので対処法を覚書。

エラーが出た時の実際のコード

```php:app/Providers/AuthServiceProvider.php
    public function boot()
    {
        $this->registerPolicies();

        Gate::define('admin', function ($user) {
            return $user->isAdmin;
        });
    }
```

```php:app/Models/User.php
    public function isAdmin()
    {
        return $this->role === self::ROLE_ADMIN;
    }
```

結論
```php:app/Providers/AuthServiceProvider.php
    public function boot()
    {
        $this->registerPolicies();

        Gate::define('admin', function ($user) {
            return $user->isAdmin(); // ここの()がなかった
        });
    }
```

isAdminの`()` がないだけでした。
KaliにTerminatorを入れたら超快適だった

![active_window.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/5228ccff-7d94-bc2a-fa15-843bed23dca7.png)

Kali LinuxのデフォルトターミナルとしてTerminatorを使用することにしました。

QTerminal等デフォルトのターミナルエミュレータはtmuxの表示が崩れるし、Mate Terminalは背景の透過に難あるし、XTermは設定がダルいし…。

tmuxについても、わざわざスクロールするためにコピーモードにしなきゃいけないし、コピーする際も分割した他の領域まで選択してしまうし。

Terminatorはそんな俺を救ってくれた。

（自分のKaliの言語設定が日本語のままなのでお使いのそれが英語の方は適宜訳してください。）

https://terminator-gtk3.readthedocs.io/en/latest/index.html

# Terminatorのインストール
```
sudo apt-get install terminator
```

何かしらのエラーがでたら以下を実行して再度インストールしてみる：

```
sudo add-apt-repository ppa:gnome-terminator
sudo apt-get update
```

# Terminatorをデフォルトにする

KaliのデフォルトターミナルをTerminatorにするには、

設定 > デフォルトアプリケーション > ユーティリティ

で、ターミナルエミュレータをTerminatorに設定する。
![DefaultApp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/ced72a4a-f5ea-c093-b793-46e5ca0d3dea.png)

# Terminatorの各種設定

Terminatorを開いてその上で右クリックすると設定の項目が出てくる。

フォント、背景の透過は設定の「プロファイル」というところ。
![profile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/9a869167-5c23-9b1c-40d5-7e65d6758f35.png)

設定 > プロファイル > 色

と進み、「システムテーマを使う」のチェックを外すと、ターミナルのカラーリングを変更できる。
![orange_black.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/9b3de80b-92e9-1b65-b171-20d1a68e65cc.png)

いや、ターミナルの「文字と背景の色」じゃなくて、「パレット」の方だ。

そっちを変えると各部分の文字色とかが変わっていい感じになる。

<br><br>

Terminatorのウィンドウを最大化の状態で立ち上げたい場合は、

設定 > 一般 > Window state

と進みMaximised（最大化）を選択する。

<br><br>


スクロールバーが邪魔な人は

設定 > プロファイル > スクロール > スクロールバー

と進み「無効」を選択。

# Terminatorのショートカットキー

| 操作 | キー |
|:-:|:-:|
|水平に分割|Ctrl + Shift + o|
|垂直に分割|Ctrl + Shift + e|
|分割した一個分削除|Ctrl + Shift + w|
|分割した間の移動（+Shiftで逆方向）|Ctrl + Tab|
|その分割した中で検索|Ctrl + Shift + f|
|Next（検索）|Enter|
|分割した一個の縦横幅を調節|Ctrl + Shift + 矢印キー|
|新規ウィンドウ|Ctrl + Shift + i|
|新規タブ|Ctrl + Shift + t|
|左のタブに移動|Ctrl + PgUp|
|右のタブに移動|Ctrl + PgDn|
|全ウィンドウを一気に削除|Ctrl + Shift + q|

分割した中で検索する際、「Wrap」とか「Match Case」とか「x（バツぼたん）」とかへは、`Tab`キーでそこへ移ることができる。

その他のショートカットキーは[公式ページ](https://terminator-gtk3.readthedocs.io/en/latest/gettingstarted.html#layout-shortcuts)で。

# 最後に

なんでもっと早くTerminator入れなかったんだろう😑。

アホみたいにその他のターミナルエミュレータの設定で無駄に労力割いてたわ。

「kali linux best terminal」で検索したらトップに出た記事で、”美学たるTerminatorで問題が発生することは決して無い”、”GNOME向け”みたいにベタ褒めされてたから即決しました。
【Laravel8.x ~ 】 @jsonディレクティブの改良版、@jsディレクティブが誕生していた

# <span>@</span>jsonディレクティブ
javaScript内でphpの変数をjson形式で渡したい場合、今までこう書いてたと思います
```php
$data = ['name' => 'hoge','age' => 99 ];
```
```javascript
console.log(@json($data));
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/ad213cf8-1606-3250-9d80-1937af4ff85c.png)

# JS::from()
そのまま展開出来るようになります。
```php
use Illuminate\Support\Js;

$data = ['name' => 'hoge','age' => 99 ];
$data = Js::from($data);
```

```javascript
console.log({{$data}});
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/9a233c1a-0e74-56ee-37f0-0f8046dad76b.png)


# JS::from()の後に出来た<span>@</span>Jsディレクティブ
```php
$data = ['name' => 'hoge','age' => 99 ];
```

```javascript
console.log(@js($data));
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/bb79a89a-dc15-e260-9973-38af3787ee35.png)

<span>@</span>jsonと変わんねえじゃねえかよ！と思うかもしれません。
何やら<span>@</span>jsonはBladeComponentに引き渡した場合にコンパイルされないという問題があったらしく、
その問題点を改良したのが<span>@</span>jsディレクティブだそうです。

なのでLaravel8.x ~ の人は<strong><span>@</span>js</strong>か<strong>JS::from()</strong>使いましょう
文章が下手なワイが、技術記事を書くときにやっていること

# 文字での説明、むずい
> 「対面で説明するのは得意だけど、文章を分かりやすく書くのは、なんか難しい・・・」

そんなことってありませんか？
私はあります。

小学生のときの作文は、オカンに書かせていました。

担任の先生は、

> 先生「やめ太郎の作文、面白いから」
> 先生「オレ、楽しみにしてるんだよな〜！」

と言っていました。

# コツが分からない

読みやすい説明文を書くコツが、イマイチ分かりません。
そのため、なんか読みにくい文章を書いてしまいます。

例えば、

> 動的型付き言語でのプログラミングに慣れきった人が静的型付き言語に学びの足を伸ばそうとしたときに考え方の違いから強い違和感を覚えてしまい学習がなかなか捗らない現象が起きることがあります。

↑こんな感じです。
めっちゃ読む気を奪ってくる文章ですよね。

なので、「分かりやすい文章の書き方」をネットで検索してみたこともあります。

どうやら、

- 長い文を、複数の短い文に分割する
- 無駄な表現を削る
- 読点（`、`）を入れる
- かっこ（`「」`）を使う
- 対となる「主語」と「述語」を近づける
- 対となる「修飾語」と「被修飾語」を近づける

↑こういうことをすれば読みやすくなるらしいです。

# やってみた

さっきの文章を分かりやすくできるか、ネットで調べたコツを使って試してみました。

### 元の文章
> 動的型付き言語でのプログラミングに慣れきった人が静的型付き言語に学びの足を伸ばそうとしたときに考え方の違いから強い違和感を覚えてしまい学習がなかなか捗らない現象が起きることがあります。

### 直した文章

> 静的型付き言語を学ぼうとしたときに「学習がなかなか捗らない現象」が起きることがあります。
それは、動的型付き言語でのプログラミングに慣れきった人に起きがちです。
文化の違いから、強い違和感を覚えてしまうためです。

# 読みやすくはなったが、面倒くさい

元々の文より読みやすくなった気はしますが、頭が疲れました。

文章の「配置変換」みたいな行為が、脳のエネルギーを奪い尽くします。
できればやりたくありません。

もっと、対面で喋ってる時の感じでサクサク書きたいです。

# なぜ対面では伝えやすいのか

なぜワイは、対面で説明することはできるのに、
分かりにくい文章を書いてしまうのでしょうか。

テキストにはなくて、対面での説明にはあるもの、それはなんでしょうか。

- 喋りの「間」
- 声の強弱
  - イントネーション
  - アクセント
- ボディランゲージ

↑このあたりだと思います。

対面の場合だと、例えば・・・

> 「あのぉ」
> 「動的型付き言語でのプログラミングに慣れきった人がぁ」
> 「静的型付き言語に学びの足を伸ばそうとしたときにぃ」
> 「考え方の違いからぁ」
> 「**強い違和感**を覚えてしまってぇ」
> 「**学習がなかなか捗らない現象**が起きることがあるやないですかぁ」

↑こんな感じで、殆ど思いついたままに喋っても、文章より伝わりやすいんですよね。

その原因としては、

- 喋りの「間」があるため、自動的に読点（`、`）が入った感じになる
- 声で**アクセント**をつけられるため、強調したいワードが分かる

↑といったところだと思います。

あとは、途中で「伝わりましたか？」って聞いたりできますもんね。

やっぱ対面での説明、強いと思います。

# もう、対面っぽく書いちゃえ

ということで私は、ほぼ全てのQiita記事を**会話調**で書いています。

> ワイ「あのな」
> ワイ「動的型付き言語でのプログラミングに慣れきった人がな」
> ワイ「静的型付き言語に学びの足を伸ばそうとしたときにな」
> ワイ「考え方の違いから、**強い違和感**を覚えてしもうてな」
> ワイ「**学習がなかなか捗らない現象**が起きることがあんねん」
>
> 娘「そうなんだ」

↑こんな感じです。

声のアクセントを表現したい箇所には**太字**を使います。

これを徹底した結果、2020年に年間Contribution数で1位になれたので、一定の効果はあると思います。
（好き嫌いはあると思いますが・・・）

# 他にも

他にも、マークダウンの記法を活用することで「対面っぽさ」や「ボディランゲージっぽさ」を表現します。

---

### 例

ワイ「こないだ社長がな」

> 社長「社会人に大事なのは、この3つや！」
> 社長「よく聞け！」

ワイ「って言うてたんや」
ワイ「その3つというのは」

- 報告
- 連絡
- 相談

ワイ「↑これなんや」

---

↑こんな感じです。
**引用**や**箇条書き**などを使います。

**引用**は「これは、誰かが言っていたことやで」ということを表現するときに使います。
**箇条書き**は「この三つは、同列に並ぶものやで」ということを表現するときに使います。

# 読者が疑問に思いそうな部分は・・・

特に説明が難しい部分や、誤解が生じやすい部分などは、

> 娘「パパ、それって〇〇ってこと？」
>
> ワイ「いや、そうやなくて、△△なんや」

↑こんな感じで「読者が疑問に思いそうな部分」をあらかじめ説明したりします。
（これは@uhyoさんがワイ記法で書くときにやっていたので、逆輸入しました）

# なんか楽に書ける
私は、プログラミングを勉強し始めてから5年間、一つも技術記事を書くことができませんでした。
でも「会話調でいっか」と考えだしてから、たくさん書けるようになりました。


# まとめ

- 分かりやすい文章を書くコツがあるらしい
- しかしワイには難しかった
- もう、対面の感じで書いてしまいたい

皆さんも、よかったらやってみてください。

**〜おしまい〜**

# 新しい記事も読んでみてくださいやで

- [経営者目線を持ったエンジニアになるために](https://qiita.com/Yametaro/items/bfa11a001aa8982cd8f1)
- [「なんのために作るか分からへん」と愚痴っていたらPMさんが救ってくれた話](https://qiita.com/Yametaro/items/46e31a9aa6257eb900ae)
【備忘録】ZipFileのopenメソッドとwritestrメソッド

# 背景
- ZipFileのopenメソッドを使ったwriteとwritestrメソッドを使った書き込みの確認

# 考えたこと
- openメソッドのdefault modeはreadで、基本的には書き込みにはwritestr使えば良さそう。
- https://docs.python.org/ja/3/library/zipfile.html?highlight=zipfile#zipfile.ZipFile.open

# コード
```python
import zipfile

content = 'content'

def zip_file_open():
    zipfilename = 'open.zip'
    with zipfile.ZipFile(zipfilename, mode="w") as zip_file:
        with zip_file.open('open.csv', 'w') as f:
            f.write(content.encode())

def zip_file_writestr():
    zipfilename = 'writestr.zip'
    with zipfile.ZipFile(zipfilename, mode="w") as zip_file:
        zip_file.writestr('writestr.csv', content)
```
AtCoderでの入力，出力（Python, C++）

# はじめに
最近，AtCoderを始めたので，それぞれの言語の入力について，自分用にまとめておく．
PythonとC++でプログラムを書くことが多いので，2つの場合をメモしておく．

参考にした記事

https://qiita.com/jamjamjam/items/e066b8c7bc85487c0785


# Python
Pythonの入出力についてまとめる．
Pythonの出力はprintでできる．
## 1入力
入力形式
> N（文字列または数字）

入力例
> 4

```
% 文字列
N = input()
% 整数
N = int(input())
% 小数
N = float(input())
```

## 1行N列入力
入力形式
> A B C

入力例
> Alice Bob Charlie

> 1 2

```
% 文字列 or 文字列+数字(数字は後でintかfloatにする)
A, B, C = map(str, input().split()) % 1つずつ受け取る
l = list(map(str, input().split())) % リストで受け取る

print(A)
>> Alice
print(l)
>> ['Alice', 'Bob', 'Charlie']

% 数字
A, B = map(int, input().split())
l = list(map(int, input().split()))

print(A)
>> 1
print(l)
>> [1, 2]
```

## N行1列入力
入力形式
>N M
$A_1$
$A_2$
:
$A_N$

入力例
>3 4
1
2
3

```
N, M = map(int, input().split())

% リストでappend
A = []
for _ in range(N):
    A.append(int(input()))

% 内包表記
B = [int(input()) for _ in range(N)]

print(A)
>> [1, 2, 3]
print(B)
>> [1, 2, 3]
```

## N行M列入力
入力形式
>N
$x_1$ $x_2$ $x_3$ .. $x_N$
$y_1$ $y_2$ $y_3$ .. $y_N$

入力例
>4
1 2 3 4
5 6 7 8
```
n = input()
x = list(map(int, input().split()))
y = list(map(int, input().split()))
```

# C++
C++の入出力についてまとめる．
```
#include <bits/stdc++.h>
using namespace std;
int main(){
  % ここに入出力のやつを書く
}
```

## 1入力
入力形式
> N（文字列または数字）

入力例
> 4

```
% 文字列
string a;
cin >> a;
% 整数
int a;
cin >> a;
% 小数
float a;
cin >> a;
```

## 1行N列入力
入力形式
> A B C

入力例
> Alice Bob Charlie

> 1 2

```
% 文字列 or 文字列+数字(数字は後でintかfloatにする)
string A,B,C;
cin >> A >> B >> C;

% 数字をベクトルに格納したいとき
vector<int> vec(N);
for (int i = 0; i < N; i++) {
  cin >> vec.at(i);
}
```
## 出力
### 1出力
数字もしくは文字列を改行つきで出力する．
```
cout << A << endl;
```

### 複数出力
数字もしくは文字列を1行ずつ出力する．
```
for(auto v: vec){
  cout << v << endl;
}
```

要素の間に空白を入れて出力する．
```
for (int i = 0; i < vec.size()-1; i ++){
  cout << vec.at(i) << " ";
}
cout << vec.back() << endl;
```

# おわりに
他にもあったら随時更新する．
Web3.0検証(11)-MeteorでDapp開発(環境準備)

##### [前回] [Web3.0検証(10)-Blockchainのデータ構造](https://qiita.com/mingchun_zhao/items/19cc407c49e69f920178)

## はじめに

今回は、分散型アプリケーションの開発フレームワークMeteorを勉強します。

## Meteorとは

- オープンソースのWebアプリケーション・フレームワーク
- Webブラウザ、iOS、Andoroidで動作するアプリケーションを開発可能
- 開発生産性を高める機能が数多く備わっている

## Meteorの特徴

- UNIVERSAL JAVASCRIPT
    - クライアント側とサーバ側のコード両方をJavascript言語で記述
    - コードの統一管理が可能になり、開発及び保守コストを軽減
- Realtime & Reactive
    - Webアプリケーションのサーバ側データ更新が、リアルタイムに全てのユーザーに伝搬
    - 再読み込み操作不要で、画面に自動的に反映される
    - リアルタイムかつリアクティブなWebアプリケーションの開発を可能に
- Develop to Deploy
    - 開発だけでなくアプリケーション公開も可能
    - アプリケーション公開用プラットフォームで、コマンド一つでWeb上に公開可能

- Dapp開発を支援するパッケージを提供
    - パッケージを使用し、P2Pネットワーク上で動作するDapp開発が可能

## 検証環境
```
CPU: Intel(R) Core(TM) 3.30GHz(4コア8スレッド)
メモリ: 16 GB
OS: Ubuntu 20.04 LTS
Geth: 1.10.18
```

ちなみに、Ubuntuは、Windows 10で以下のように管理者権限で導入しました。
```
> wsl --install -d Ubuntu-20.04
```

## Meteorのインストール

- 端末を開き、以下コマンド実行
```
$ curl https://install.meteor.com | sh
```

- バージョン情報を表示
```
$ meteor --version
```

## 最初の分散型アプリケーションを作成

- 以下コマンドで、アプリケーション`myfirstapp`を作成
```
$ meteor create myfirstapp
```
アプリケーションのひな形として、`myfirstapp`ディレクトリが自動作成される。

- Webアプリケーションを実行
```
$ cd myfirstapp
$ meteor
[[[[[ ~/meteor/myfirstapp ]]]]]

=> Started proxy.
=> Started HMR server.
=> Started MongoDB.
=> Started your app.

=> App running at: http://localhost:3000/
```

- Webブラウザで`http://localhost:3000/`にアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/74e1e927-fa2d-d0b1-8516-8fd3cf9c093a.png)


## おわりに

Meteorを用いて、簡単な分散型アプリケーションを作成しました。
次回から、Blockchainプライベートネットワーク上で動作するDapp開発です。
お楽しみに。

##### [次回] [Web3.0検証(12)-MeteorでTODO管理アプリの開発(基本機能)](https://qiita.com/mingchun_zhao/items/9c4cd4cf91d5bbc88e1e)
STM32G031のI2Cの速度を変える


I2C
目的
高速、低速のI2Cデバイスを使いたい

![o_con419.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/fe5d404f-d72d-263f-384d-f11084e60230.jpeg)



https://qiita.com/caa45040/items/5032e6905c9425f41495


プログラム


```c++


//I2C_0_031_1

#include <Arduino.h>
#include <Wire.h>

//STM32G031J6M6 i2cピンの定義
#define sdaPin PA12    // ArduinoA4
#define sclPin PA11    // ArduinoA5

#define LED_P     PB7     // 1pin

#define ADDR1  0x40

//初期化
void setup() {

  delay(3000); //not Delete

  //GPIOの初期化
  pinMode(LED_P, OUTPUT);

  //i2cの初期化
  Wire.begin(sdaPin, sclPin); //STM32G031J6M6
  Wire.setClock(20000);       //速度の変更

}//setup

//メインループ
void loop() {

  digitalWrite(LED_P, 1); //LED ON debug

  //I2Cに送信
  Wire.beginTransmission(ADDR1);
  Wire.write('0');
  Wire.endTransmission();

  delay(500);//0.5秒待つ


  digitalWrite(LED_P, 0); //LED OFF debug
  delay(500);//0.5秒待つ

}//loop



```
Next.jsとReactの関係


## Next.js と React の関係
**結論：Next.jsはReactのフレームワークである。**
※ フレームワーク：より使いやすい形に変更したもの(進化系)

もう少し詳しくいうと、下の図のようなフレームワークの関係になっている。
![IMG_0831.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2660273/272d7bea-8c54-308b-4116-d1b679f1bd54.jpeg)



## Next.jsとReactの違い
Next.jsはReactのフレームワーク(進化系)というくらいなので、もちろんNext.jsの方が使いやすい。

- **作成するwebサイトの規模感の違い**
    - Reactはページ数の少ない小規模なwebサイトの作成に向いている
    - Next.jsはECサイト（amazonのページ)やSNS(Twitter)などの大規模なページ制作に向いている。
 
- **読み込み速度の違い**
    - ReactはhtmlとJavaScriptが同時に読み込まれるので、読み込み速度が遅くなる
    - Next.jsは先にhtmlが出力され、その後必要に応じてJavaScriptが読み込まれる**プリレンダリング方式**なので、読み込み速度が速い。
![IMG_0832.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2660273/c974bdab-c74a-13fb-9cfe-72e72676d205.jpeg)

- **SEO対策**
    - 先の説明の通り、Next.jsは初回読み込み時にhtmlが出力されるため、SEO対策になる。

- **ローカル環境のスペックへの依存**
    - Reactはローカル環境でレンダリングを完結するため、ローカル環境のスペックに依存してしまう。
        - CSRと言われるレンダリング方式
    - Next.jsはサーバー側でレンダリングが完結するため、ローカル環境のスペックに依存しない。（つまり、ローカル環境のせいで読み込みが遅くなることがない）
        - SSGもしくはSSRのいずれかのレンダリング方式（SSGとSSRの違いは次の記事に記載する)
![IMG_0833 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2660273/b8aada0c-a446-bd12-98e1-fcdd1ee4094d.jpeg)
- **設計の特徴**
    - Next.jsは直感的なルーティング設計ができる。

## まとめ
Next.jsはReactの進化系である。進化内容はこのようになっている。
- **大規模Webサイト**の作成に向いている。
- **読み込み速度**が速い
- **SEO対策**
- ローカル環境に**依存しない**
- **直感的**な設計が可能
![IMG_0830.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2660273/433eaee2-cc11-18e7-40fe-45155a7f88cb.jpeg)


次は、Next.jsの２つのレンダリング手法、**SSG**(Static Site Generation:静的生成)と**SSR**(Sever Side Rendering)の違いについての記事を書く。
基本情報技術者試験 合格体験記 【文系・IT未経験】

北海道をこよなく愛するピーターです。
取得から時間が経っておりますが感想を共有したい思いに駆られたので体験記を書きたいと思います。

# 取得日
2022年11月に受験をして、令和3年度下期に合格しました。
したがって、この記事は、半年前の記憶を呼び起こしながら書いた記事になります。ご了承ください。


# 僕のスペック
・文系
・プログラミングを初めて2ヶ月(受験当時)
・前職は営業


# 学習期間
プログラミングを始める前から、換言するとアークエルに転職をするため前準備として、入社前から勉強をしていました。
それを含めると3ヶ月くらいだと思います。
これまた[AWS SAA を取得したとき](https://qiita.com/ryuta_0309/items/21c360f07822cdf541fb)と同様に適当に勉強してしまっていたので正確な期間はわかりません。
ただ、試験前1週間でうおー!と頑張った記憶があります。

# 学習方法
キタミ式と過去問道場を反復しました。
[キタミ式](https://www.amazon.co.jp/dp/B09MYGL7B5/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
[過去問道場](https://www.fe-siken.com/fekakomon.php)

心がけていたことは、同じ問題を「2回以上」「時間を空けて」解くことです。
## 2回以上
理解したつもりになることを避けるためです。必ずもう一度解くように心がけました。
## 時間を空けて
かの有名な[エビングハウスの忘却曲線](https://the-owner.jp/archives/6006)を意識した取り組みです。
僕なりの理解を述べると、記憶を定着させるためには、覚えたことを一度忘れる必要があるということです。脳は不思議ですね。このメカニズムを使うために、時間を空けて取り組みました。忘れた頃にもう一度解くのが効果的です。
具体的には1日くらいです。1日あれば人間すぐに忘れます。[画像元](https://mana-brain.com/post-302/)
![d6ec6d272b4999a33c067fbf0f7f46ec.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2575928/027066d8-8e01-91a7-ad17-f99fce22c8ab.jpeg)



# 午前試験の対策
午前試験に関しては、ただ問題を解いていればそれで受かると感じました。なぜなら、ほとんど過去問から出題されるからです。
過去問の問題数を見ると多いように感じますが、1問にかかる時間はさほど多くないので、問題数にしては時間はかからない印象です。
過去5年分くらい解けば十分だと思います。

# 午後試験の対策 ~アルゴリズムにフォーカスを当てて
なんといってもアルゴリズムが鬼門です。午後試験は選択問題ですが、アルゴリズムは必須選択です。避けては通れません。
なぜ鬼門かというと、時間がかかることに加え、コンピュータがやる計算を自分の脳で行わなければならないからです。

後者の理由について、具体的には変数を自分で管理する必要があるということです。
とある処理を5回繰り返すとします。その処理の中でiという変数の値は毎回異なります。これが問題に出題される時、
「3回目のiの値はなんですか」といった形で問われます。これがなかなか骨が折れます。[実際の出題(参考)](https://www.fe-siken.com/kakomon/27_haru/pm08.html)

アルゴリズム対策としては3つ挙げられます。

## アルゴリズムの考え方を事前に知っておく 初見にしない
基本情報で出題されるアルゴリズムは基本的なものです。バブルソート、クイックソートなどです。これらはキタミ式にも書いてあります。
これらを、出題されたときに初見とせず、「ああ、これはこのアルゴリズムだな」と思えるようにしておきます。そうすれば、脳に負担がかかりません。解きやすいはずです、時間もかからないはずです。

## 脳内だけではなく紙に書いてみる
アルゴリズムの分野はなかなか脳内だけでは解けないものです。アルゴリズムを上から読んでいって、変数が現れたら紙に落としましょう。コンピュータがメモリを消費して変数を管理するのなら、僕たち人間は紙を消費して変数を管理しましょう。

## ビビらない
メンタル的な対策ですが、重要だと思います。アルゴリズムは難しいから解けないなんて先入観を捨てます。解くしかないのだから解けないなんて考えは切り捨てましょう。
1つ目の対策をしていれば、未知のアルゴリズムにも対応できるはずです。ここがコンピュータと人間の違いです。言われたことしかできないコンピュータに一矢報いるためには、臨機応変さを見せつけるしかありません。頑張りましょう。

アルゴリズムさえ解ければ、他の選択科目は参考書を眺めたときの知識で乗り越えられるはずです。


# 終わりに
IT初心者でもなんとか合格できました。やればできる。
Arduino UNOのI2Cの速度を変える


目的
高速、低速のI2Cデバイスを使いたい

![o_con417.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/369d7f5c-310a-9bc6-dea4-547e9ea65835.jpeg)


![o_con418.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f0c1d997-f825-feae-abd6-3cf23f14485c.jpeg)


https://qiita.com/caa45040/items/5032e6905c9425f41495



資料


https://elchika.com/article/baebfc34-dc91-4146-82ee-50a5714af578/


プログラム


```c++


//I2C_0_UNO_1

#include <Arduino.h>
#include <Wire.h>


//初期化
void setup() {

  //GPIOの初期化
  pinMode(LED_BUILTIN, OUTPUT);

  //i2cの初期化
  Wire.begin(); //UNO
  Wire.setClock(20000); //速度の変更

}//setup

//メインループ
void loop() {

  digitalWrite(LED_BUILTIN, 1); //LED ON debug

  //I2Cに送信
  Wire.beginTransmission(0x40);
  Wire.write('0');
  Wire.endTransmission();

  delay(500);//0.5秒待つ

  digitalWrite(LED_BUILTIN, 0); //LED OFF debug
  delay(500);//0.5秒待つ

}//loop



```
[2022年05月時点] [対策] GitHub-Actionでgit pushを実行すると、「The requested URL returned error: 403」が発生してPushに失敗する


GitHub Action を使って、次のようにリポジトリ上の a.txt を更新して push を試みると、
エラー「`The requested URL returned error: 403`」が発生し、Push に失敗する.

このときの対策方法が見つけ難かったので、書き出しておく.


## エラー発生時の状況

#### 実行環境

```
GitHub-hosted runner
```

#### .github/workflows/gitpush.yml

```yaml
name: push text file
on: push 
jobs:
  push_a:
    runs-on: ubuntu-latest
    steps:
      - name: Push a.txt
        run: |
          git init
          git remote add origin "https://$GITHUB_ACTOR:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY.git"
          git config --global user.email "mybot@example.com"
          git config --global user.name "mybot"
          git fetch
          git checkout master
          git branch --set-upstream-to=origin/master
          git pull
          date >> a.txt
          git add -A
          git commit -m "update a.txt"
          git push
```

#### Action 実行結果

```
git push origin master
remote: Permission to xxxx/yyyy.git denied to github-actions[bot].
fatal: unable to access 'https://github.com/xxxx/yyyy.git/': (見易さのために改行する)
The requested URL returned error: 403🛑
Error: Process completed with exit code 128.
```

 

　

## 対策

次の行頭「+」行のように追加してやると、Push に成功した.

#### .github/workflows/gitpush.yml

```diff
  (略)
  push_a:
+   permissions:
+     actions: write
+     checks: write
+     contents: write
+     deployments: write
+     issues: write
+     packages: write
+     pull-requests: write
+     repository-projects: write
+     security-events: write
+     statuses: write
    runs-on: ubuntu-latest
    steps:
      - name: Push a.txt
  (略)
```

　

## 該当ドキュメント

[https://docs.github.com/ja/actions/using-jobs/assigning-permissions-to-jobs](https://docs.github.com/ja/actions/using-jobs/assigning-permissions-to-jobs)

　

以上
【Flutter】Error解決: CocoaPods could not find compatible versions

## Error内容

```
    [!] CocoaPods could not find compatible versions for pod "Firebase/RemoteConfig":
      In snapshot (Podfile.lock):
        Firebase/RemoteConfig (= 8.7.0)

      In Podfile:
        firebase_remote_config (from `.symlinks/plugins/firebase_remote_config/ios`) was resolved to 0.11.0-1, which depends on
          Firebase/RemoteConfig (= 8.11.0)
```

## 解決方法

1. `podfile.lock`を削除

2. run
```
flutter run
```
上記コマンドを叩く。

## 参考文献

https://www.codegrepper.com/code-examples/whatever/cocoapods+could+not+find+compatible+versions+for+pod+firebase+core+flutter
Kali Linuxで両方にパネルを表示させる方法

Kaliが入ったノートpcにHDMIでモニタを接続。

すなわちノートpcとモニタの二画面を使用しています。

「**パネル**」とは、上部のバー。開いてるアプリや日付、ログアウトボタン等が並んで表示される部分のことです。
![kali_screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/6df369ec-ed74-451d-90e7-c22deb8ac031.png)

# 今の状況

ノートpcの方にはパネルがあるのに、もう一方のモニタの方にはパネルが表示されない。

以降、この状況下でモニタの方にもパネルを追加して開いてるアプリ一覧を表示させる方法について解説します。


# おおまかなパネル設定の流れ

パネル2の追加 → アイテム → 「ウィンドウボタン(Windows Button)」を追加

これでパネルが表示されなかった方の画面にも、今開いてるアプリ一覧が表示されます。

# 具体的にパネルを設定

まず設定から「パネルの設定」を開く。

①「＋」マークを押してパネル2を追加する。

② 今回の状況ではこのパネル2をモニタ側のパネルとするため、出力として「HDMI-1」とする。（必要に応じて長さを100%にする）
![panel2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/9ab76582-15aa-cce3-3c71-dd9278f6937e.png)

③ アイテム(M)において、「ウィンドウボタン(Windows Button)」を選択して「追加(A)」を押せば完了。
![windowsbottun.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/b4abe6ef-2ac5-bc7d-bb47-25ccd942b28e.png)

# アイテムを右端に寄せる

時計とか、ログアウトボタンをパネルの右端に寄せたい場合は、そこに「セパレーター」を追加して「拡張する（E）」にチェックを入れる。
![separator_expansion.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/964bf36f-35cd-a44c-5d20-f65b70e577e5.jpeg)
【Flutter】Error解決: CocoaPods not installed.

## Error 内容
CocoaPodsがインストールされていないというエラーが突然発生。

```
Warning: CocoaPods not installed. Skipping pod install.
 CocoaPods is used to retrieve the iOS and macOS platform side's plugin code that          responds to your plugin usage on the Dart side.
 Without CocoaPods, plugins will not work on iOS or macOS.
 For more info, see https://flutter.dev/platform-plugins
 To install see https://guides.cocoapods.org/using/getting-  started.html#installation for instructions.
```

## 解決方法
Android Studioをターミナルから下記のコマンドを利用し、開く。

```
open /Applications/Android\ Studio.app 
```

## 参考文献

https://exerror.com/warning-cocoapods-not-installed-skipping-pod-install

https://guides.cocoapods.org/using/getting-started.html#installation
Stripe Billingで作成したサブスクリプションに説明文をつけて、Customer Portalで判別しやすくする

Stripeでは、Customer Portal(Billing Portal)を利用することで、請求履歴や支払い方法・サブスクリプションの管理をローコード化できます。

```js
      const billingPortal = await stripe.billingPortal.sessions.create({
        customer: 'cus_Lxxxx',
        return_url: 'https://example.com'
      })
```

![スクリーンショット 2022-05-06 18.53.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/c4cfcc35-7694-eeb6-8fb8-1c97481aad78.png)

## 同じ商品のサブスクリプションを複数管理したいケースで起きること

ウェブサイトのホスティングなどでは、同じ商品・料金のサブスクリプションを複数作成するケースが発生します。

```js
      // For example.com
      const subscription1 = await stripe.subscriptions.create({
        customer: 'cus_xxx',
        items: [{
          price: 'price_aaa',
          quantity: 1
        }]
      })
      // For members.example.com
      const subscription2 = await stripe.subscriptions.create({
        customer: 'cus_xxx',
        items: [{
          price: 'price_aaa',
          quantity: 1
        }]
      })
```

しかしこの実装ですと、Customer Portal上ではどのサブスクリプションがどのサイトのものかの判別が困難です。

![スクリーンショット 2022-05-06 18.57.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/6f43929e-8475-1b48-5dfb-c13963485b26.png)


## サブスクリプションにDescriptionを設定する

このようなケースでは、サブスクリプションを作成する際に`description`を設定しましょう。

```js
      // For example.com
      const subscription1 = await stripe.subscriptions.create({
        customer: 'cus_xxx',
        items: [{
          price: 'price_aaa',
          quantity: 1
        }],
        description: 'example.com',
      })
      // For members.example.com
      const subscription2 = await stripe.subscriptions.create({
        customer: 'cus_xxx',
        items: [{
          price: 'price_aaa',
          quantity: 1
        }],
        description: 'members.example.com',
      })
```

これで、Customer Portal上でも判別がしやすくなりました。

![スクリーンショット 2022-05-06 19.01.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/d60607f4-a68f-341e-26af-6918ee07de17.png)

## 既存のサブスクリプションに`description`を設定する

この機能がリリースされる前に作成したサブスクリプションに、後から設定することもできます。

`update`のAPIを呼び出して`description`だけ更新しましょう。

```js
       await stripe.subscriptions.update('sub_xxxxx', {
        description: 'members.example.com'
      })
```

## Stripe Checkoutを利用する場合

Checkoutでサブスクリプションを契約させたい場合は、`subscription_data.description`で設定できます。

```js
      const session = await stripe.checkout.sessions.create({
        customer: 'cus_xxxx',
        success_url: 'https://example.com/success',
        cancel_url: 'https://example.com/cancel',
        line_items: [
          {price: 'price_xxxxx', quantity: 2},
        ],
        mode: 'subscription',
        subscription_data: {
          description: 'members.example.com'
        }
      })
```

## 関連ドキュメント

https://stripe.com/docs/api/checkout/sessions/create?lang=node

https://stripe.com/docs/api/subscriptions/create

# [PR] Stripe開発者向け情報をQiitaにて配信中！

- [Stripe Updates]：開発者向けStripeアップデート紹介・解説
- ユースケース別のStripe製品や実装サンプルの紹介
- Stripeと外部サービス・OSSとの連携方法やTipsの紹介
- 初心者向けのチュートリアル(予定)

など、Stripeを利用してオンラインビジネスを始める方法について週に２〜３本ペースで更新中です。

-> [Stripe Organizationsをフォローして最新情報をQiitaで受け取る](https://qiita.com/organizations/stripe)
Visualizer V9で各デバイス（Web,Mobile,Tablet etc..）メニューが表示されない

## 目次
1. はじめに
2. 解消方法
2. 原因
3. 最後に


## はじめに
Visualizer Version9を使って、新規でプロジェクトを作成した場合、
Version8の場合にはデフォルトで表示されていた、各デバイスのメニューが表示されない場合があります。

![スクリーンショット 0004-05-10 11.29.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/71d87364-67b2-c09f-10a7-1d865bdb92e7.png)
意外と知らないポイントなので、解消方法について紹介していきます！

## 解消方法
他デバイスのメニューを表示したい場合、
表示するメニューにフィルタリングがかかっている可能性がありますので、
下記手順で解消することができます。

1. ハンバーガーメニューをクリックし、「Filter」をクリックします。
![スクリーンショット 0004-05-10 11.08.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/b0b4f6d7-8018-c028-ca87-ef4d94d9c02f.png)


2. Project Filterが表示されるので、
表示したいデバイスにチェックをつけましょう。
![スクリーンショット 0004-05-10 10.36.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/26926c7c-c80e-38b2-059e-3cd4d224270f.png)

「Micro Apps」のプルダウンで、
`All`を選択すると、全てのプロジェクトでフィルタリングが適用され、
`特定のプロジェクト名`を選択すると、そのプロジェクトのみでフィルタリングが適用されます。

3.「Save」を押すと設定が保存され、
チェックをつけたメニューが表示されるようになります。
![スクリーンショット 0004-05-10 11.32.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/1f5d3df5-fee2-f04f-82cd-160e1a16d719.png)

【補足】
上記の設定とは逆に、表示したくないメニューがある場合、
チェックを外すと表示されなくなるので適宜設定を変更することもできます。


## 原因
Visualizer V9をダウンロード後、
初めてProject->New Projectから、MobileかWebアプリを選択し、
新しいプロジェクトを作成すると、デフォルトで選択したデバイスのみ表示するように
フィルタリングが設定されてしまうようです。

Native Appを選択すると..
![スクリーンショット 0004-05-10 11.14.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/9bb0738d-22d2-e1f9-4346-6b9bfaa4d604.png)

↓
Mobileのみのメニューが表示され、WebやTabletが表示されない
![スクリーンショット 0004-05-10 10.36.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/67c6f747-5f63-4bdb-258d-060a625eeecf.png)

今回のフィルター設定は、「Micro Apps」のプルダウンで、`All`を選択していれば、
また新しくプロジェクトを作成した時も、フィルター設定が適用されるので、
自分好みの設定に変えてみてくださいね！


## 最後に
意外とつまづいたポイントだったので、同じように困った人がいたら
参考にしてみてくださいね！
React Queryのページネーションがとても良かった

## はじめに
結論から言うと`keepPreviousData`というオプションが非常に良かったです。

https://react-query.tanstack.com/guides/paginated-queries

> - The data from the last successful fetch available while new data is being requested, even though the query key has changed.
> - When the new data arrives, the previous data is seamlessly swapped to show the new data.
> - isPreviousData is made available to know what data the query is currently providing you

クエリが変わっても、最後に取得したデータは新しいデータが要求されている間に利用可能で、新しいデータの取得が完了すると以前のデータはシームレスに入れ替わり、新しいデータが表示されます。


検証に使用したサンプルコードを置いておきます。
※検証ではreact-queryとtailwindcssを使用してますので、下記サンプルを実際に使用するには設定が必要です。
```
$ npm i react-query
```

https://react-query.tanstack.com/quick-start

https://tailwindcss.com/docs/guides/create-react-app

```tsx
import { useState } from 'react'
import { useQuery } from 'react-query'

type Post = {
  usedId: number
  id: string
  title: string
  body: string
}

const Paginate = () => {
  const [page, setPage] = useState(1)

  const fetchProjects = (page = 1) =>
    fetch(
      `https://jsonplaceholder.typicode.com/posts?_page=${page}&_limit=10`
    ).then((res) => res.json())

  const { isLoading, isError, error, data, isFetching, isPreviousData } =
    useQuery<Post[], Error>(['projects', page], () => fetchPosts(page), {
      keepPreviousData: true,
    })

  return (
    <div className="flex min-h-screen w-screen flex-1 flex-col items-center justify-center">
      {isLoading ? (
        <div>Loading...</div>
      ) : isError ? (
        <div>Error: {error.message}</div>
      ) : (
        <div>
          {data?.map((post) => (
            <p key={post.id}>
              {post.id}. {post.title}
            </p>
          ))}
        </div>
      )}
      <span className="pt-12">Current Page: {page}</span>
      <div className="py-12">
        <button
          className="rounded-md bg-blue-300  p-2 text-white"
          onClick={() => setPage((old) => Math.max(old - 1, 0))}
          disabled={page === 1}
        >
          Previous Page
        </button>
        <button
          className="ml-4 rounded-md bg-red-300  p-2 text-white"
          onClick={() => {
            if (!isPreviousData && data) {
              setPage((old) => old + 1)
            }
          }}
          disabled={isPreviousData || !data}
        >
          Next Page
        </button>
      </div>
      {isFetching ? <span> Loading...</span> : null}
    </div>
  )
}

export default Paginate
```
## `keepPreviousData:false`の場合（デフォルト）

![画面収録_2022-05-10_10_32_45_AdobeCreativeCloudExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610773/a2dc95f8-a0c4-d285-e67a-b386394bfbc8.gif)

このようにページが切り替わる度にローディングが発生しています。

## `keepPreviousData:true`の場合

![画面収録_2022-05-10_10_33_45_AdobeCreativeCloudExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610773/bb540c51-f428-a17a-207b-b871de449b5d.gif)

このように新しいデータの取得ができるまで、以前のデータを表示し、取得が完了すると切り替わるというような挙動になります。


## さいごに
以上になります。
すごく細部までごだわっている感じがいいなあと思いました（小並感）
Adobe Analyticsでのコンテンツマーケティングサイトの計測と分析を実施する方法

コンテンツマーケティングを行っていくうえでどう分析をしていくか？コンテンツマーケティングをただPVだけで評価せずに、データを利用し改善に繋げていく。これをAdobe Analyticsで分析をしていく場合のアプローチ方法とその実装を2つほど整理してみました。

# その1：ページ回遊を促しているコンテンツとは？
特定のコンテンツを見た結果、他のページ閲覧も実施したというのは結構重要なコンテンツを評価するポイントです。これが分かることで、単純なPVや訪問（セッション）といった確認だけでなく、サイトのKPIに紐付けたコンテンツの評価を行い、アクションを行うことができるようになります。

Adobe Analyticsではこれはコンテンツベロシティといったりもします。SiteCatalyst時代は実装が必要だったこの評価方法も、現在ではデフォルトの設定のみで実施が可能になっています。
## 基本的な考え方
コンテンツベロシティの指標では、ページビューと違い、ページビューが発生した場合にそのセッション中に閲覧していた過去のコンテンツに指標が計上されることになります。

これにより下の図では、入口ページとなったページAがその後コンテンツが閲覧されたことにより多くの指標が計上されることになります。
![ページビュー貢献度分析](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608794/0226da56-7a6a-99c6-fd71-ed62cb583145.png)

これをページビューや入口数などと比較をしていくことで評価が可能になります。例えばコンテンツのトラフィックが多かったとしても、閲覧を促していないのであれば、サイトとしては残念な結果となってしまっている可能性があります。

そういった意味で、下記のような形でトラフィックとベロシティを利用しコンテンツをマッピングしていくことでその評価をしていくことが可能になります。
![ページビュー貢献度分析](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608794/df547672-754d-dc7b-6c91-f1060acda33f.png)
## 具体的な操作
いたって簡単ではありますが、動画を作成しましたのでこちらをご参考ください。
[Adobe Analytics Tips \#40 : コンテンツベロシティの活用](https://www.youtube.com/watch?v=wVbumFm7524&feature=youtu.be)

# その2：どんな種類のコンテンツが閲覧されているか？
どのコンテンツが閲覧されていることも分析として理解することが重要なのは然る事ながら、一方で、それをページ単位で分析するとなるとかなり大変です。分析で概要を把握するために、ある程度グルーピングされた情報で分析することも重要です。

どんなカテゴリのものが閲覧されているかを知ることが出来れば、ページ単位ではなく、よりコンテクストを把握しやすくなり次のコンテンツの検討やパーソナライズなど具体的なアクションに繋げやすくなります。

ということでここでページに設定されたタグ情報を集計し分析に利用できる方法をご紹介したいと思います。

### コンテンツに設定されたタグを計測する

通常、コンテンツにタグ設定がされている場合複数設定されていることがほとんどです。そしてそれらはページごとに2つだったり、3つだったり、と設定されている数に規定はありません。これが解析ツールで計測する場合に面倒になってしまうところです。

Adobe Analyticsではトラフィック変数（prop）のオプション設定を利用することで、このようなタグを綺麗に分割した状態で集計することが可能です。

例えば Web Analytics, IA, Site Map などと設定されている場合も下記のように分割された状態でレポートを作成することが可能です。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608794/36efbe51-009f-4dc8-894a-c9785632b34a.png)

### 実装方法
この計測にはトラフィック変数（prop）のオプション機能を利用します。List propと呼ばれるもので、Adobe Analyticsの管理者用の変数設定より設定を行います。トラフィック変数の設定で「リストのサポート」の部分を有効にして、区切り文字を設定することで活用が出来るようになります。

![Cursor_と_Adobe_Analytics.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608794/39671422-e556-c1e9-55d6-355aafa51f0e.png)

送る側では、管理画面上で設定されたデリミタ（区切り文字）を利用して複数の単語を設定するだです。下記は、デリミタをカンマ（,）にした場合の設定例です。

```jsx
s.propN = "Web Analytics,IA,Site Map"
```

これだけで1PV（1回のコール）でAdobe Analyticsのレポート画面上では先ほどご紹介したような形で分割されて集計されることになります。

注意点としてリストのサポートをしたprop変数については、いくつか他にも設定可能なpropのカスタム設定が使えなくなります。また、Datawarehouse機能を利用する場合は、送った時の文字列での結果となりますので、条件指定をする際にご注意ください。詳細はヘルプも参照して頂ければと思います。[prop \| Adobe Analytics](https://experienceleague.adobe.com/docs/analytics/implementation/vars/page-vars/prop.html?lang=ja#%E3%83%AA%E3%82%B9%E3%83%88-prop)

また、こちらについても動画による説明もありますのでこちらも合わせてご覧ください。
[Adobe Analytics Tips #27 : タグ情報の計測（List propの活用）](https://youtu.be/6pFsMoWc24c)
# まとめ
今回は簡単に実施できるAdobe Analyticsでのコンテンツマーケティングサイトの分析方法とその実装について触れてみました。セグメント機能と組み合わせて分析をしていただくことで、非常にさまざまな示唆が得られる分析方法ですので、ぜひご活用いただければと思います。
WSL Ubuntu 20.04.4 にMySQLをインストールしてみる

# はじめに
インストールの手順と、その際起こったエラーについて記述していきます。
簡単にできるだろうと高をくくっていたのですが、結構つまづきました。

## 環境
WSL Ubuntu 20.04.4
## ダウンロードするMySQLのバージョン
mysql  Ver 8.0.29-0ubuntu0.20.04.3 for Linux on x86_64 ((Ubuntu))


# 手順1 MySQLをインストールする
```
sudo apt update
```
インストールする前に、アップデートをします
```
sudo apt install mysql-server
```
次に、mysqlをインストールします。

# 手順2 MySQLの設定をする

```
sudo mysql_secure_installation
```
これにより、一連のプロンプトが開かれて、設定が出来るみたいなのですが、
rootのパスワードを入力して下さいと表示がされ、入力してエンターを
押したらこんなエラーメッセージが出力されました
### Error: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

```
Securing the MySQL server deployment.

Enter password for user root: 
Error: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
```
ソケット経由でローカル接続が出来ないとのことです。はて、ソケットって何だ・・？
調べたら、こんな意味でした。
そういえば学習初期に見た覚えがあります笑　忘れちゃうものですね・・
https://e-words.jp/w/%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88.html
より、

ソケット 【socket】
ソケットとは、受け口、軸受け、接合部、穴、へこみなどの意味を持つ英単語。ITの分野では物理的な接続端子を指す場合と、ソフトウェア間で通信する仕組みを指す場合がある。

ソケットの意味は分かった！けど、どう影響してるの・・？とりあえずエラーメッセージをコピペして検索をかけたら、原因が分かりました。

#### サービスの起動確認
```
$sudo service mysql status
* MySQL is stopped.
```
そもそも起動してなくて、止まっているらしい。
じゃあ起動させればいいのね！

#### System has not been booted with systemd as init system (PID 1). Can't operate.Failed to connect to bus: Host is down
```
$systemctl start mysql
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
```
はい！またエラーメッセージが出てきました。
エラー文を見るに、PIDが何やら影響しているそう・・？
調べたら、systemctlコマンドの、systemedがPID1、つまり一番目のプロセスに設定していないがために起こるエラーメッセージだそうです。

https://snowsystem.net/other/windows/wsl2-ubuntu-systemctl/?msclkid=b557105acffd11ecb5db051697f5105a
PID1に設定する方法が載っていますので、こちらを参考にしてください。

# MySQL起動ととグイン
```
$systemctl start mysql
$sudo mysql -u root
```

これでやっとログインできました・・・。
細かい設定方法は下記URLが参考になりましたので、こちらを参照してください。
https://qiita.com/houtarou/items/a44ce783d09201fc28f5


# おわりに
WSLからMySQLをインストールしようとしたがために、手こずってしまったのでしょうか・・。
このエラーを解決するために二時間も要してしまったので、同じようなエラーに直面している方の手助けになれたら幸いです。
【Laravel】VSCodeでvendorやIlluminate配下のファイルにジャンプできるようにする

##　やりたかったこと
LoginControllerの中で使われているトレイトの中身、メソッドなどを確認したい！！
なのに`Command + クリック`したけど、何も反応しない。

## 原因
VSCodeの設定で、.gitignoreでGit管理されていないファイルは検索対象から除外される。

## 対策
設定を変更する。
参考サイト
https://prograshi.com/framework/laravel/vscode-find-vendor-illuminate/
最高です！ありがとうございます！！

手順は以下になります。
### 設定手順
Mac使用を前提とします。

1. `Command + Shift + P`でコマンドパレットを開く
1. `user settings`を検索する
1. `gitignore`を検索する
1. `Search: Use Ignore Files`のチェックを外す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/73dcaaee-5789-9974-bf07-cd1bc0119b01.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/5f988384-da23-e366-d169-4c5fba699c54.png)

### ジャンプできるか確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/b5a57ca0-0fef-a085-23c0-cf622cf18ee9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668402/1a208bfe-e82e-1e05-5456-f44e3e499f43.png)
Javaで PDF をグレースケールに変換する方法

場合によっては、ドキュメントを圧縮するために、カラー PDF をグレースケールあるいは無彩色のページのドキュメントに変換する必要があります。この記事では、[Spire.PDF for Java](https://jp.e-iceblue.com/introduce/spire-pdf-for-java.html)を使用して、JavaでPDF ドキュメントをグレースケールに変換する方法について説明します。

## Spire.PDF for Javaを追加する
まず、Spire. PDF for JavaをJavaプロジェクトに追加する必要があります。JAR ファイルは、[このリンク](https://jp.e-iceblue.com/download/spire-pdf-for-java.html)からダウンロードできます。Mavenを使用する場合は、次のコードをプロジェクトの pom.xmlファイルに追加する必要があります。
```
repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url> https://repo.e-iceblue.com/nexus/content/groups/public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf</artifactId>
        <version>5.3.1</version>
    </dependency>
</dependencies>
```

## PDF をグレースケールに変換する
主な手順は次のとおりです。

PdfGrayConverter クラスのインスタンスを作成し、PDF サンプルドキュメントをロードします。
PdfGrayConverter.toGrayPdf() メソッドをコールして、グレースケール PDF を変換します。
## Javaコード一覧
```
import com.spire.pdf.conversion.*;

public class ToGrayPDF {
    public static void main(String[] args) {
        // PdfGrayConverter インスタンスを作成し、PDF ドキュメントをロードする
        PdfGrayConverter converter = new PdfGrayConverter("sample.pdf");

        //カラー PDF をグレースケールに変換する
        converter.toGrayPdf("ToGray.pdf");
        converter.dispose();
    }
}
```
## スクリーンショット一覧
入力したPDFドキュメント
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/fd626812-486b-e532-311c-73480d566c99.png)
 
変換されたグレースケールドキュメント
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/2fe2fd90-8b47-643c-a765-1479a3011aee.png)

今回のSpire.PDF for Javaを使用して、JavaでPDF ドキュメントをグレースケールに変換する方法は以上でした。最後まで読んでいただきありがとうございました。
TypeScriptを基本からまとめてみた【3】【TypeScript入門】

## TypeScriptとは

- JavaScriptにコンパイルされる静的型システムがついたJavaScriptの上位集合
- JavaScriptの仕様をベースに拡張したプログラミング言語
⇨ 新しい機能と利便性をJavaScriptに追加

## 大きな欠点
#####  JavaScriptの環境で実行できない。
#####  ブラウザでTypeScriptを直接実行できない。


- JavaScriptにコンパイルされる静的型システム
⇨ TypeScriptは型検査に通るように書く必要がある
⇨ 新しい機能をJavaScriptコードに変換する　+ 潜在的なエラーのチェック（型チェック）


※ TypeScriptで書いたものをJavaScriptに変換するツール

[TypeScript](https://nxxm.github.io/cppcon2018/demo/00-typescript/index.html)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/93d99d6e-a794-af3c-69b3-ef29cf4baf54.png)

## なぜTypeScriptか？

- ドキュメントとしての側面を利用するため

⇨ 半自動的に関数の使い方がわかる

コードを今まで書いていた人　→　本当にそのコードが合っているのか定かではないが
『TypeScript』はエラーが出るため信頼できるドキュメントになる


```sample.ts
function add(a:number, b:number):number {
  return a + b;
}
```

- Linterとしての側面を利用するため

⇨　Linterとは、実行する前にそのコードが正しいかどうかを検証するツール

膨大な量のコードの場合、エラーに気づきにくいが『TypeScript』はコンパイラーが自動的にコードを読んでエラーを見つけてくれる

- ES5へのコンパイラとしての側面を利用するため

⇨ ES6でコードを書いてもブラウザが追いつかない

ES5までは主要なブラウザが対応して、最新の書き方で書いてもダウングレードできる

## TypeScriptをインストール

```
$ npm install -g typescript
```

## TypeScriptで書いたコードをJavaScriptに変換する

```
$ mkdir <プロジェクト名> //フォルダを作成
$ touch　<プロジェクト名> //ファイルを作成

$ tsc <プロジェクト名>//コンパイルすると同じ名前のJavaScriptのファイルができる
$ node <プロジェクト名> //実行する
```

## TypeScriptの概要

#### TypeScriptが追加しているもの

##### 1. 型　
① 型を利用することにより、無駄なエラーや予想外の問題を防げる
② Vscodeのようなモダンな開発環境であれば型があることにより非常に便利なコードの自動保管を利用できる
③ コンパイルすることなくソースコード上に直接エラーを表示してくれる

##### 2. 新しい世代のJavaScriptの機能
① 新しいJavaScriptの機能をTypeScriptで利用できる
② Babelのようなもの

##### ※ Babelとは
新しいバージョンのJavaScript（ES6以降）を古いバージョンでも動くように
変換(コンパイル)するツールのこと

##### 3. JavaScriptに存在しない新機能(インターフェイスやジェネリクス等)


##### 4. メタプログラミングの機能(デコレータ等)

##### 5. 豊富なオプション(高いカスタマイズ性)

## 参考サイト
[超TypeScript入門完全パック- TypeScriptでアプリを作りたい方必見！](https://www.youtube.com/watch?v=F9vzRz6jyRk&t=5194s)
[TypeScript概要](https://zenn.dev/monstera/articles/a660cc049929b2)
定数について

# const
constは変数の中身を変えたくないときに使います。
使用例として、ループの試行回数とか、固定型のキャラクターのパラメーターがあります。
そこで使うのが定数です。
enum文も定数になります。
定数を宣言すると、後から中身を変更することができません。
他のプログラマーが誤って変更しないように予防できます。
数字を直接入れるマジックナンバーがありますが、コード上読みづらくなるため避けましょう。
```cpp:Explanation.cpp
    int a = 10; //変数
	const int loop_max = 5; //定数
	int result = 0;
	for (int i = 0; i < loop_max; i++)
	{
		result += a;
	}
    loop_max = 10; //エラー 定数なので変更できない。
```
# マクロについて
定数をマクロで宣言することができます。
簡単に長所と短所に分けてまとめました。

* 長所
メモリを圧迫しない
グローバルに扱うことが出来るので、別ファイルで共有しやすい。

* 短所
多少定義がめちゃくちゃでも、エラーや警告にならない。
グローバルスコープなので名前衝突のリスクがあり、
気づかなかった時にバグが起きやすい原因。

```cpp:Explanation.cpp
#define loop_max 5
#define NUM 1.5f
```

# constexprについて
定数には2種類あります。
* コンパイル時定数
コンパイル時に値が決定します。
固定長配列のサイズやテンプレート引数に指定できます。

* 実行時定数
通常は実行時に計算されます。

つまりconstexprやマクロ定数はコンパイル時に値が計算されるので、
実行時の計算速度が速くなります。
しかし、問題点があってconstexprにすると、クラスに定義できなくなります。
解決策でconstexprを静的なデータメンバにします。
C++11以上なら、staticをつけることでinline変数として扱うことができます。
```cpp:Explanation.cpp
class Test
{
private:
	constexpr int size = 5; //エラー
	constexpr static int size = 5; //inline constexpr ～と同じ
};
```
# char*型について
文字リテラルを代入するにはcosnt char[]として
扱われるconst char* が適切です。
constexpr char* やstatic constexpr char* は禁止されています。


# おわり
使う用途ごとに定数の定義方法を変えると良いと思います。
Data Import Batch Process Stalled 画面がスタックしている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c4a00b00-f891-8815-0323-d5a6c6bbb4ea.png)



回答
[Gift Entry Batches with Batch Failures or Aborted Batches Remain in a Perpetually Processing State](
https://trailblazer.salesforce.com/issues_view?id=a1p4V000002dl9wQAA)

質問
[Data Import Batch Process Stalled](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HChUL)
ROS2 GAZEBOアッカーマン型フロントステアリングロボット

# はじめに

ROS2 Navigation2を勉強していくに当たり、GAZEBO空間でのシミュレーションが非常に役に立ちます。

2輪差動駆動型ロボットのGAZEBOシミュレーションは
Turtlebot3が存在するので、簡単にお試しできるのですが、
アッカーマン型フロントステアリングロボットのGAZEBOシミュレーションはあまり存在しないため、気軽に試せないことが学習のネックになります。
そこで今回は、アッカーマン型フロントステアリングロボットのGAZEBOシミュレーションを紹介したいと思います。

# AUTOCARROS2

https://github.com/winstxnhdw/AutoCarROS2

# DEMO

![Peek 2022-05-10 10-31.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93168/e9e6b9b9-e198-65e3-a7c3-7257b76e5441.gif)



次回はこのモデルを使ってNavigation2を実行してみようと思います。