OmniAICreator/Qiita-1.07M huggingface dataset:
【Project Euler】Problem 10: 素数の合計

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 10． 素数の合計

原文 [Problem 10: Summation of primes](https://projecteuler.net/problem=10)

**問題の要約：$2*10^6$未満の素数の合計を求めよ**

安易ですが。sympyのprimerangeはこの手の問題を解くときに便利なので。

```python
from sympy import primerange

plist = list(primerange(1,2*10**6))
print(f"Answer : {sum(plist)}")
```

### Lucy DPを用いて高速化

このアルゴリズム詳細は[素数の個数や和を高速に計算できるLucy DPをやさしく説明](https://qiita.com/masa0599/items/2704047579eaafb2a322)で解説しています。

```python 
N = 10**6
r = int(N**0.5)
V = [N//i for i in range(1,r+1)]
V += list(range(V[-1]-1,0,-1))
S = {i:i*(i+1)//2-1 for i in V}
for p in range(2,r+1):
    if S[p] == S[p-1]: continue # p is not prime
    sp = S[p-1]  # sum of primes < p
    for v in V:
      if v < p**2: break
      S[v] -= p*(S[v//p] - sp)
print(f"# Answer : {S[N]}")
```
### 計算時間の比較

| N |$10^2$ |$10^6$ |$10^{8}$ |$10^{10}$ |$10^{12}$ |
|:---:|:---:|:---:|:---:|:---:|:---:|
|primerange|0.01s |2.13s | 195s| - | - |
|Lucy DP |0.01s |0.03s | 0.91s|13.72s|380s|

（開発環境：Google Colab）
Google Colabで処理装置の種類を変更する（CPU⇨GPU）

Pythonのコードを実行する際にとても便利な「GoogleColaboratory」
初期設定だと処理装置はCPUですがそれの種類の変更の仕方になります。
○変更方法
編集⇨ノートブックの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/fe704016-cb8f-a928-a5b2-9b0839488314.png)

ハードウェア アクセラレータを選択⇨保存
※設定を変更すると初期化されるため再度ライブラリのダウンロードなどが必要になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633008/5fe87b35-5257-07a8-0df0-a3aa8111f0c1.png)

変更内容を確認したい場合は以下のコマンドを実行する

```
# 設定の確認をする
from tensorflow.python.client import device_lib
device_lib.list_local_devices()

結果（例）
[name: "/device:CPU:0"
 device_type: "CPU"
 memory_limit: 268435456
 locality {
 }
 incarnation: 1146994390282370417
 xla_global_id: -1, name: "/device:GPU:0"
 device_type: "GPU"
 memory_limit: 11320098816
 locality {
   bus_id: 1
   links {
   }
 }
 incarnation: 5354265423235303347
 physical_device_desc: "device: 0, name: Tesla K80, pci bus id: 0000:00:04.0, compute capability: 3.7"
 xla_global_id: 416903419]
```

○ちなみにGPUの他に設定可能なTPUとは何か
TPUは、ディープラーニングを高速化するため、Googleが開発したプロセッサです。
詳しいことは分かりませんが、演算精度を抑えて高速にディープラーニングができるようにしたものようです。

私はまだそこまで負荷がかかる処理を実行した時はないため使用しておりませんが、ディープラーニングをされる方は是非試して見てください。
※より便利に使うための有料のプランもあるようです
Pandasで複数列をまとめてdatetime型に変更する方法

# 複数列をまとめてdatetime型に変更したい
日付データはdateime型にしておくと何かと便利
一つの列のみなら、pd.to_datetimeでかんたんに変換できるが、
複数列をまとめて処理したい場合の方法

使用データ

```python
import pandas as pd

df = pd.read_csv('/sample.csv')

print(df)
>reg_date	start_date	end_date	id
>0	2007/05/20 18:47:28	2021/10/31 08:03:39	2021/11/07 08:03:39	AAA
>1	2007/05/20 19:30:51	2021/11/23 10:34:24	2021/11/23 10:36:12	BBB
>2	2007/05/20 22:54:15	2021/11/21 10:44:37	2021/11/21 10:45:23	CCC

df.dtypes
>reg_date           object
>start_date         object
>end_date           object
```

## pd.to_datetime()での変換

pandas.to_datetime()関数を使うと、pandas.Seriesに対してdatetime64[ns]型に変換できる。

```python
import pandas as pd
import datetime

pd.to_datetime(df['reg_date'])
>0         2007-05-20 18:47:28
>1         2007-05-20 19:30:51
>2         2007-05-20 22:54:15
>Name: reg_date, Length: 3, dtype: datetime64[ns]
```


## 複数列まとめてto_datetime()で変換
argにDataFrameを指定して利用する必要があり、
df['x'].to_datetime()という利用の仕方はできない


```python
import pandas as pd
import datetime

df['reg_date'].to_datetime()
>AttributeError: 'Series' object has no attribute 'to_datetime'

```


当然複数列を対象としてもNG

```python
import pandas as pd
import datetime

df.iloc[:,0:4].to_datetime()
>AttributeError: 'Series' object has no attribute 'to_datetime'

```

apply関数を利用することで複数列まとめて処理が可能

```python
import pandas as pd
import datetime

df.iloc[:,0:4].apply(pd.to_datetime)
>	reg_date	start_date	end_date
>0	2007-05-20 18:47:28	2021-10-31 08:03:39	2021-11-07 08:03:39
>1	2007-05-20 19:30:51	2021-11-23 10:34:24	2021-11-23 10:36:12
>2	2007-05-20 22:54:15	2021-11-21 10:44:37	2021-11-21 10:45:23

df.iloc[:,0:4]apply(pd.to_datetime).dtypes
>reg_date      datetime64[ns]
>start_date    datetime64[ns]
>end_date      datetime64[ns]

```



以上
AndroiderのiOS奮闘記~UIKitとは~

#この記事は
iOSのキャッチアップを余儀なくされた生粋のAndroiderの奮闘日記です。
単発の記事になりますが、ご容赦ください。

#UIKitとは
ドキュメント読んでいきます。
>Construct and manage a graphical, event-driven user interface for your iOS or tvOS app.

iOSとtvOS用に作られたもので、イベント駆動なインターフェースを提供してくれるフレームワークのようです。
iOSシステムとのインタラクティブを管理してくれるようです。

全然知らなかったけど、Apple社はテレビ用のOSも出してるんや。

注意書きとして、UIKitのクラスはメインスレッドのみで使用するのがルールみたいです。

#SwiftUIとの違いは
SwiftUIもiOSでUIを描画するためのフレームワークですが、新しいものみたいです。
ただ、一つのプロジェクトに両者をブリッジできるようなので、組み合わせて使える。

AndroidでもJetpackComposeを既存のものに組み込めるので、それと同じかなと。

#まとめ
とりあえず、UIKitというのはUI描画のフレームワークであると。


#参考
https://developer.apple.com/documentation/uikit
[Error] Could not find generator 'devise:install' .  rails g:devise install

### 発生したError
```
$ rails g:devise install

Running via Spring preloader in process 26089
Could not find generator 'devise:install'. 
Run `rails generate --help` for more options
```

### 解決した方法

開発中に何度も実行するようなrailsなどのコマンドを素早く実行することができるようになるrailsのプリローダであるspringを停止してからInstallするようにした。

#### １.springの起動を確認

```
$ bin/spring status

 8465 spring server | techpitgram | started 11 hours ago
 8467 ruby -I /home/ubuntu/.rvm/gems/ruby-2.6.3/gems/spring-2.1.1/lib -e require 'spring/application/boot'
```

#### ２.springを停止

```
$ bin/spring stop

Spring stopped.
```

#### 3.deviseをGemで再インストール
>Gemfile

```
gem 'devise'
```
> terminal

```
$ bundle install

Using devise 4.8.1
```

#### 4. devise install

```
$ rails g devise:install 

     create  config/initializers/devise.rb
      create  config/locales/devise.en.yml
===============================================================================

Depending on your application's configuration some manual setup may be required:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

     In production, :host should be set to the actual host of your application.

     * Required for all applications. *

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root to: "home#index"
     
     * Not required for API-only Applications *

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

     * Not required for API-only Applications *

  4. You can copy Devise views (for customization) to your app by running:

       rails g devise:views
       
     * Not required *

===============================================================================
```

### 参考にしたもの

https://github.com/heartcombo/devise/issues/4594

https://qiita.com/residenti/items/937d9fa3e98eaa498ff6

### まとめ
おそらく立ち上げた状態で操作したので上記のようなErrorが発生したのかな？？
railsコマンドがうまく動作しなかった時はspringを止めることも今後試したい。
負荷テストモニタリング

## メモ

OCIのモニタリングを確認したい
特にNWで制限かかってるときとかどんなグラフになるのか知りたい
とりあえずNWはないが、他のリソースは下記を参考にやってみる
https://4thsight.xyz/15051
対象はwindows 2019 server

E4.flex
1 ocpu
8 GB memory
47 GB boot volume

### cpu

平均
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94267/7d8badb4-e9ff-30e2-9938-671d626fd190.png)

速度は意味わからん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94267/b6f97cf3-dc44-4e06-f264-51cf875db0e5.png)

合計も600とかなので不適切
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94267/2b38b71e-6213-14b3-782e-86e865585704.png)

数もダメ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94267/e1fd3f40-bc39-0b16-3b53-97dd24f28bff.png)

あとはまぁ使えそうか

### memory
https://docs.microsoft.com/ja-jp/sysinternals/downloads/testlimit#download

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94267/c8212f13-888d-1361-8d9f-c8424ce5cab9.png)

利用可能は5.8GB
C:\Users\opc\Downloads\Testlimit>TestLimit64.exe -d -c 5000

5GB確保してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94267/51b6aac3-a0ac-75c1-b699-42dd22ab463f.png)

モニターでみると平均だと50％ぐらい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94267/b417456b-4ac5-28af-3bc8-05e38c4b8ade.png)

最大でも50％弱
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94267/5620c851-211e-f89a-839d-d94793ad1522.png)

最小も変わらない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94267/05a7dadb-d166-311c-219f-9664d2278a9c.png)

OC上では87％ぐらい使ってるのに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94267/2abb3513-81ef-4783-cc94-6d21b87a04f2.png)

試しに10GBでやってみる
リモートデスクトップが落ちた。。
再度入れるようになったので入った
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94267/6722942f-2a01-9aea-6777-a9b4fbd42334.png)

一瞬測定できなくなって80％弱を記録。100%はさすがにないのか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94267/906b1772-f39c-c3db-e892-8a3e81335bd1.png)

速度、合計、数の数値は相変わらず意味不明

### disk

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94267/ef7bb991-1b36-47b7-232f-eb78d3356d61.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94267/8d9b74e7-be7e-418a-b0ac-132d506da338.png)

disk I/Oは速度を見るほうがよさそう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94267/0f42a7a1-b16e-c3fa-e6bf-72af92230c7c.png)
Vuetifyの便利なCSSのクラス集

Vuetifyではルールに従ったクラス名を設定するとCSSを書かなくてもスタイルが適用されることを知りました。
そんな便利なCSSのクラスを書き溜めていきます。

# 文字

|スタイル|クラス名の書き方|例|参考リンク|
|:--|:--|:--|:--|
|文字色|{色名}--text|red--text|[カラーネーム一覧](http://w-d-l.net/css__color_name/)|
|濃さ|text--{lighten｜darken}-{n}|text--lighten-1|[マテリアルカラーパレット — Vuetify](https://vuetifyjs.com/ja/styles/colors/#section-30af30e930b9)|


# Display

|設定したいこと|クラス名の書き方|例|参考リンク|
|:--|:--|:--|:--|
|画面用|d-{breakpoint(省略可)}-{value}|d-lg-none|[Display helpers — Vuetify](https://vuetifyjs.com/ja/styles/display/)|
|印刷用|d-print-{value}|d-print-table-row||
|||||
|||||

# Flexbox

|設定したいこと|クラス名の書き方|例|参考リンク|
|:--|:--|:--|:--|
|コンテナの幅|d-{breakpoint(省略可)}-{flex｜inline-flex}|d-sm-flex|[FlexBoxの使い方（４）〜display:inline-flexについて（動画あり）｜IT工房｜AI入門とWeb開発](https://itstudio.co/2016/09/15/6209/)|
|方向<br/>(flex-direction)|flex-{breakpoint(省略可)}-{row｜column}-{reverse(省略可)}|flex-column-reverse|[CSS Flex helpers — Vuetify](https://vuetifyjs.com/ja/styles/flex/)|
|横方向の寄せ<br/>(justify-content)|justify-{breakpoint(省略可)}-{start｜end｜center｜space-between｜space-around}|justify-sm-start|[【CSS】Flexboxの各プロパティの挙動を確認してみる｜KuzLog](https://kuzlog.com/2017/01/18/495/)|
|縦方向の揃え<br/>(align-items)|align-{breakpoint(省略可)}-{start｜end｜center｜baseline｜stretch}|align-sm-start||
|折返し<br/>(flex-wrap)|flex-{breakpoint(省略可)}-{nowrap｜wrap}-{reverse(省略可)}|flex-wrap-reverse||
|順番<br/>(order)|order-{breakpoint(省略可)}-{first｜last｜{n(1~12)}}|order-md-first||

# marginとpadding

|設定したいこと|クラス名の書き方|例|参考リンク|
|:--|:--|:--|:--|
|margin|m{direction}-{breakpoint(省略可)}-{size｜auto}|ma-auto|[CSS スペーシング・ヘルパー — Vuetify](https://vuetifyjs.com/ja/styles/spacing/)|
|padding|p{direction}-{breakpoint(省略可)}-{size｜auto}|pa-md-4|[Vue.js】Vuetify初心者が知っておきたい便利な知識5選｜まさきのエンジニア図書館](https://masa-enjoy.com/vuetify-beginner)|

- size
    - 4px毎に増えて、0~16まで指定可能
    - nをつけると負の値になる
- direction : 適用対象の位置指定
    - 凡例) o:適用される  x:適用されない

|direction|上|下|左|右|
|:--|:--|:--|:--|:--|
|t|o|x|x|x|
|b|x|o|x|x|
|l|x|x|o|x|
|r|x|x|x|o|
|x|x|x|o|o|
|y|o|o|x|x|
|a|o|o|o|o|
enumとは

簡単にいうと型です。
列挙型と呼ばれるものになります。

    enum Name {
        case akiyama, shiina, katou
    }

###上記は何をしてるのか

要はこんな感じです。

    enum Name {
        let akiyama: Name
        let shiina: Name
        let katou: Name
    }

複数の定数（列挙子）を一つの型で統一して管理できます※変数は不可

###型を指定しない場合

型の名前は　Nameという型で表示されます

##テキスト表示したいなら型を指定する必要がある

例えば上記の場合だとラベルとかに表示する時hashValueと呼ばれるものでしか表示ができません。

その場合、hashValueの型はIntなので謎の数字で答えが返ってきます。

なので、もし上記をラベルなどで表示したいとかそういう場合はenumの型をString型などに変える必要があります。

    enum Name: String {
        case akiyama, shiina, katou
    }

##呼び出し方

    print(Name.akiyama.rawValue)

##型を調べたいかた

    print(type(of: Name.akiyama.rawValue))

理解力が微妙なので、引き続き修正していくと思います
TortoiseGit をコマンドラインから直接制御する

# TortoiseGit をコマンドラインから直接制御する

## 概要

TortoiseGit のコア機能は TortoiseGitProc.exe というコマンドで実現されており、このプログラムにコマンドラインパラメータを指定して起動することにより直接各種機能を呼び出すことができる。 TortoiseGitProc.exe の使い方をいくつか紹介する。

## 参考資料

https://tortoisegit.org/docs/tortoisegit/tgit-automation.html

## この記事で紹介するコマンド一覧

|説明                  |コマンド|
|---|---|
|差分比較              |`TortoiseGitProc.exe /command:showcompare /path:"path_to_folder" /revision1:xxx /revision2:yyy` |
|リポジトリブラウザ表示| `TortoiseGitProc.exe /command:repobrowser /path:"path_to_folder" /rev:xxx`                      |
|リビジョングラフ表示  | `TortoiseGitProc.exe /command:revisiongraph /path:"path_to_folder"`                             |
|リビジョングラフファイル出力|`TortoiseGitProc.exe /command:revisiongraph /path:"path_to_folder" /output:"file_to_out"`       |

## コミット間差分

`/command:showcompare` というコマンドを使うことにより、指定した二つのコミット間の差分を表示することができる。
`/path:` でリポジトリの場所を指定できる。省略した場合はカレントディレクトリに対して実行する。

### 指定する形式

```
TortoiseGitProc.exe /command:showcompare  /path:"path_to_folder" /revision1:xxx /revision2:yyy
```

### 具体例

#### カレントディレクトリが対象リポジトリ外のとき

```
TortoiseGitProc.exe /command:showcompare /path:"D:\gitwork\tortoisegit" /revision1:HEAD~ /revision2:HEAD
```

#### カレントディレクトリが対象リポジトリ内のとき (`/path:` 指定を省略可能)

```
TortoiseGitProc.exe /command:showcompare /revision1:HEAD~ /revision2:HEAD
```


## リポジトリブラウザ表示

`/command:repobrowser` というコマンドを使うことにより、リポジトリブラウザを開くことができる。
`/path:` でリポジトリの場所を指定できる。省略した場合はカレントディレクトリに対して実行する。
`/rev:` で選択するリビジョンを指定できる。省略した場合は `HEAD` とみなす。

### 指定する形式

```
TortoiseGitProc.exe /command:repobrowser  /path:"path_to_folder" /rev:xxx
```

### 具体例

#### カレントディレクトリが対象リポジトリ外のときで `HEAD~` を選択する場合

```
TortoiseGitProc.exe /command:repobrowser /path:"D:\gitwork\tortoisegit" /rev:HEAD~
```

#### カレントディレクトリが対象リポジトリ内のときで `HEAD` を選択する場合

```
TortoiseGitProc.exe /command:repobrowser
```


## リビジョングラフ

`/command:revisiongraph` というコマンドを使うことにより、リビジョングラフを開くことができる。
`/path:` でリポジトリの場所を指定できる。省略した場合はカレントディレクトリに対して実行する。

### 指定する形式 (リビジョングラフを表示)

```
TortoiseGitProc.exe /command:revisiongraph  /path:"path_to_folder"
```

### 指定する形式 (リビジョングラフの画像をファイルに出力。ウィンドウは表示されない。)

```
TortoiseGitProc.exe /command:revisiongraph  /path:"path_to_folder" /output:"file_to_out"
```


### 具体例

#### カレントディレクトリが対象リポジトリ外のとき (リビジョングラフを表示)

```
TortoiseGitProc.exe /command:revisiongraph /path:"D:\gitwork\tortoisegit"
```

#### カレントディレクトリが対象リポジトリ内のとき (リビジョングラフを表示)

```
TortoiseGitProc.exe /command:revisiongraph
```

#### カレントディレクトリが対象リポジトリ外のとき (リビジョングラフをファイルに保存。ウィンドウは表示されない。) 

```
TortoiseGitProc.exe /command:revisiongraph /path:"D:\gitwork\tortoisegit" /output:"rev-graph.png"
```

`rev-graph.png` は `/path:` で指定した `D:\gitwork\tortoisegit` からの相対パスで保存される模様。
絶対パスで指定すれば自分の好きな場所に出力可能。

## 参考

`TortoiseSVN` にも `TortoiseProc.exe` というプログラムがあり、コマンドラインから制御できる。

https://tortoisesvn.net/docs/release/TortoiseSVN_ja/tsvn-automation.html


https://tortoisegit.org/docs/tortoisegit/tgit-intro-history.html
Pandas read_csvで読み込みエラーになる場合の対処

# read_csvでtokenizing errorがでるケース

sepで区切り文字を指定した際、元データが行によって列数が異なる場合にエラーになる

以下のようなデータを読み込む場合

```sample.tsv
AA\tAA\tAA
BB\tBB\tBB\tBB
CC\tCC\tCC\tCC
DD\tDD\tDD\tDD
EE\tEE\tEE\tEE
```

エラー例

```python
import pandas as pd

df = pd.read_csv('data/src/sample.tsv', sep='\t, header=None)

Error tokenizing data. C error: Expected 4 fields in line 2, saw 11
```

# 原因
エラー内容の通り、行によって列数にばらつきがあると期待どおりでないとエラーになる

# 対処

## 1. read_csvのskiprowsを使う

列数が異なるデータが何行目にあるかわかっており、
かつ不要であれば読み飛ばせば良い

```sample.tsv
A\tA\tA
B\tB\tB\tB
C\tC\tC\tC
D\tD\tD\tD
E\tE\tE\tE
```
```python
import pandas as pd

df = pd.read_csv('data/src/sample.tsv', sep='\t, header=None, skiprows=[0])
print(df)
# 0  BB  BB  BB  BB
# 1  CC  CC  CC  CC
# 2  DD  DD  DD  DD
# 3  EE  EE  EE  EE
```

## 2.read_csvでは対処せず、読み込後に処理を行う

列数が異なるデータの行も利用したい場合は、
一度区切りを使わずに読み込んでからstr.splitで処理する

```sample.tsv
AA\tAA\tAA\tAA
BB\tBB\tBB\tBB
CC\tCC\tCC
DD\tDD\tDD\tDD
EE\tEE\tEE\tEE
```

```python
import pandas as pd

df = pd.read_csv('data/src/sample.tsv', header=None)
print(df)
# 0  AA\tAA\tAA\tAA
# 1  BB\tBB\tBB\tBB
# 2  CC\tCC\tCC
# 3  EE\tEE\tEE\tEE

df = df[0].str.split('\t', expand=True)
print(df)
# 0  AA  AA  AA  AA
# 0  BB  BB  BB  BB
# 1  CC  CC  CC  NaN
# 2  DD  DD  DD  DD
# 3  EE  EE  EE  EE

```

expand=Trueにすることで、データフレームの列として拡張される。


個人的に2番の方法試す前に、read_csvでなんとかできないか色々試してハマって取り急ぎの対処。
read_csvでもなんとかできる方法はありそう。

以上。
[Unity]Odinのライセンスについて

#概要
複数人で行っているUnityプロジェクトにOdinが導入されたのですが、その時こういうポップアップが表示されました。
![スクリーンショット 2022-01-08 7.23.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/cc127d5f-2cbd-9303-085e-629befbceba7.png)

OdinはAssetStoreで＄60.50ぐらいで販売されています。
それに加えて、収益によっては追加料金を払わなくてはいけないようです。
#ポップアップの翻訳
オーディンEULA
Odin Personalを使用するには、Odin Personal EULAを読んで同意する必要があります！

最も注目すべきことに、EULAは、過去12か月間に＄200000を超える資金調達の収入がある人々または団体によるOdin Personalライセンスの使用を制限しています。

EULAの全文を読む

EULA契約が必要

EULA、およびOdinPersonalの使用に適用される制限を読んで理解しました

私または私が働いている事業体は、過去12か月間に＄200000未満の収益または資金を持っていました
#本文
つまり、今Personalバージョンが導入されましたが年間収益が＄200,000を超えたら追加料金を払ってEnterpriseバージョンを使ってね！この条件に同意するなら同意ボタンを押してね！という意味のポップアップのようです。
(プロジェクトに参加している個人個人にこのポップアップが表示されるのは、Enterpriseのライセンス料が個人ごとに発生するからでしょうか？)
#参考にさせていただいたサイトのリンク
UnityエディターでOdinが含まれるプロジェクトに取り組んでいる人ごとにライセンスが必要である（Odin Enterpriseの説明）
https://unity.com/ja/products/odin

過去12ヶ月間の収益または資金が＄200,000を超えているプロジェクトはOdin Enterpriseライセンスを使用する必要があり、年間＄250/シートの使用料が必要になります。
https://zenn.dev/tenonno/articles/81ab92a339f6f9

公式文章(Odin Personal)
https://odininspector.com/eula

EULA[End-User License Agreement] = 使用許諾契約 / 利用許諾契約
https://e-words.jp/w/EULA.html

#補足
この記事は2022年1月8日時点に書きました。この情報は将来変更になる可能性もあります。
正確な情報が必要な方は公式HPなどで確認をお願いします。
MATLABコマンドに変数の値を組み込む

evalコマンドを使うと実現できます。
https://www.mathworks.com/help/matlab/ref/eval.html

これを使うと、変数に格納された名前の変数を新たに作ることができます。
例えば、変数nameに格納された名前の変数を新しく作りたいときは、下のコマンドを打ちます。

```
eval(name + " = 1");
```

また、変数model_nameのモデルをアクセラレータモードでコンパイルしたいときは、下のコマンドを打つと実現できます。

```
eval("accelbuild " + model_name);
```
数式の練習③二次ローパス・フィルタ

　数式の練習です。

#二次ローパス・フィルタ
|　　　　　　   　　　 二次ローパス・フィルタ　回路図　　   　　　　　 |
|:------------:|
|<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/6906970d-ef28-2013-ac4c-72cfd7972f30.png">|
|　　**伝達関数**　　　|
|　　　　　$T(s)=\LARGE \frac{1}{1+s\frac{1}{Qω_0} + s^2\frac{1}{ω_0^2}} = \frac{1}{1+s\frac{2ζ}{ω_0} + s^2\frac{1}{ω_0^2}} = \frac{ω_0^2}{ω_0^2 + 2sζω_0 + s^2}$　　　　|
|　$(  s はラプラス変数。  jω はsとする。 ω_0は角周波数(角振動数?)。 $  $ζは減衰係数。Q はフィルタのクオリティ・ファクタ。ζ = \frac{2}{Q}) $|
|　　　　　**TeXの記述**　　　|
|　　　　　``$T(s)=\LARGE \frac{1}{1+s\frac{1}{Qω_0} + s^2\frac{1}{ω_0^2}} = \frac{1}{1+s\frac{2ζ}{ω_0} + s^2\frac{1}{ω_0^2}} = \frac{ω_0^2}{ω_0^2 + 2sζω_0 + s^2}$``　　　　|


　$Q$の取る値によって、フィルタの特性は大きく変わります。$Q$が0.707より大きいと、フィルタ応答にピーキングが生じ、$Q$が0.707 より小さいと、カットオフ周波数$F_0$ でのロールオフが大きくなり、その勾配は緩やかなものとなり、早めに下がり始めます。

| $Q$ | ${\frac{{1}}{{2}}}$以下 | ${\frac{{1}}{{2}}}$ | ... | ${\frac{{1}}{{\sqrt{2}}}}$ =...0.707| $ {\frac{{1}}{{\sqrt{2}}}}$以上 |
|:------------:|:------------:|:------------:|:------------:|:------------:|:------------:|
|ピーク|	なし|なし|なし|なし|	あり|


###matlab

```matlab
time_constant = 0.16;  % 時定数
natural_freq = 1 / time_constant;  % 固有角振動数 ωn
damping_ratio = 1.0  % ζ（ゼータ）減衰係数（ダンピング比）。１＞；実数解、1；実数解、・・・1/√2；複素数解、1/√2＜；複素数解、ピークあり
G = tf([0, 0, natural_freq^2], [1, 2 * damping_ratio * natural_freq, natural_freq^2])

h = bodeplot(G);
p = getoptions(h);
p.FreqUnits = 'Hz';
setoptions(h,p);
grid on


hold on
damping_ratio = 0.15 % ζ（ゼータ）減衰係数。１＞；実数解、1；実数解、・・・1/√2；複素数解、1/√2＜；複素数解、ピークあり
G2 = tf([0, 0, natural_freq^2], [1, 2 * damping_ratio * natural_freq, natural_freq^2])

h = bodeplot(G2);
p = getoptions(h);
p.FreqUnits = 'Hz';
setoptions(h,p);

hold off
nyquistplot(G);
hold on
nyquistplot(G2);
grid on
```
　実行例です。

![2022-01-07 (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/f5b2ba41-81a9-7a03-8b16-8bc1d04142bc.png)



###LTspice

<img width="600" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/098074ed-015a-dfc2-e74c-1742898e80bf.png">

V1の設定；
![filter101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/4aadd166-554f-d175-90e5-4c04c97db7aa.png)
E1の設定；
![2022-01-07 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/44002666-33d4-10b1-f4ba-237b50265ab9.png)

E2の設定；
![2022-01-07 (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407635/6c6c18db-7378-f8a8-5dab-85d3b85ee892.png)




####参考文献
https://qiita.com/ttabata/items/92a4a72b042e6a2dbbad

https://kobaweb.ei.st.gunma-u.ac.jp/lecture/12th_20190121.pdf

http://sim.okawa-denshi.jp/RLCbpkeisan.htm

https://qiita.com/eisoku9618/items/85292db2fb77af071bbc

http://ayumi.cava.jp/audio/ac/node8.html

https://www.analog.com/jp/education/education-library/landing-pages/003/e-book/thankyou_pages/jp_Linear_c_d_hb_thankyou.html
　第8章


https://www.analog.com/jp/technical-articles/model-transfer-functions-by-applying-the-laplace-transform-in-ltspice.html





####環境
matlab　R2021b update1（ホームライセンス）、tr関数はControl System Toolboxが必要。ラプラス関数のSymbolic Math Toolboxはホームライセンスでは購入できない。
Model-View-Contoroller(MVC)メモ

#アクション名とアプリケーションネームは同じ名前にする
していないとプレビューで
The action 'hello' could not be found for ApplicationController
と表示される。


```application_controller.rb
class ApplicationController < ActionController::Base

  def hello #ここ
    render html: "hello, world!"
  end
end
```

```routes.rb
Rails.application.routes.draw do
  # For details on the DSL available within this file,
  # see https://guides.rubyonrails.org/routing.html
  root 'application#hello' #ここ
end
```

これによってapplication_controllerのhelloアクションにルーティングされる。
Laravel 起動時の "No input file specified." を解決する

<h3>開発環境</h3>
・windows10
・virtual box 6.1.22
・Vagrant  2.2.9
（最新版だとうまくいかなかったのでどちらもバージョンを下げています。）

環境構築は[Laravel公式ページ](https://readouble.com/laravel/8.x/ja/homestead.html)を参考にしました。


<h3>1 Homestead.yamlファイルの確認</h3>
yamlファイルの to: が以下のようになっていることを確認します。

```
sites:
    - map: homestead.test
      to: /home/vagrant/code/{自分のアプリ名}/public
```

※公式サイトの手順通りに環境構築した場合以下のようになっているので注意が必要です。

```
sites:
    - map: homestead.test
      to: /home/vagrant/code/public　 <---ここがダメ
```

<h3>2 vagrant up --provision の実行</h3>
```
vagrant up
```
または

```
vagrant reload
```

を実行してもうまくいかない。

再起動するだけではだめで
プロビジョニングすることで編集したファイルの修正を行ってくれるみたいです。


```
vagrant up --provision
```

を実行することでLaravelが表示されました！

Laravelの環境構築に２日かかってしまいました。
社会人１年目貪欲に頑張ります。

<h4>参考文献</h4>
[HomesteadでLaravel起動時の「No input file specified.」の対処法](https://androidroid.info/homestead-err/)
make コマンドで環境ごとに Google Cloud Run をデプロイする (docker build に引数を渡す)

以下の例は、環境をプロジェクトで別けていて、`develop` / `production` といったサフィックスを持っているという想定です。
環境の変数名は適当に `PROJECT_ENV` にしてます。

まず、`Dockerfile` に以下を追記します。

```Dockerfile:Dockerfile
# ...略...

# PROJECT_ENV　という引数を受け取れるようにする
ARG PROJECT_ENV 

# 環境変数 PROJECT_ENV に 引数で受け取った値を横流しする
# 環境変数として使う必要がなければ不要
ENV PROJECT_ENV $PROJECT_ENV 

# ...略...
```

`cloudbuild.yaml` を用意します。
`gcloud builds submit` コマンドで完結させたかったんですが、どうやらできないようです。

```yaml:cloudbuild.yaml
steps:
  - name: 'gcr.io/cloud-builders/docker'
    args:
      [
        'build',
        '--build-arg',
        'PROJECT_ENV=$_PROJECT_ENV', # substitutions に指定されている変数を `docker build`　に横流しする
        '-t',
        'gcr.io/your-project-${_PROJECT_ENV}/your-service-name',
        '.'
      ]
substitutions:
  _PROJECT_ENV: develop # 変数のデフォルトの値を指定
images: ['gcr.io/your-project-${_PROJECT_ENV}/your-service-name']
```

ビルド関連の準備が整ったので、`Makefile` を書きます。

```Makefile:Makefile
# 環境変数のデフォルトの値を指定
PROJECT_ENV=develop 

pre:
# e という arg を受け取っていたらその文字列を代入
# - 実際に運用するときは develop / production など、
#   特定の文字列しか受け取れないようにする処理とかを入れたほうがいいかも
ifdef e
PROJECT_ENV=${e}
endif

deploy-setup: pre
	gcloud config set project your-project-${PROJECT_ENV} ;

deploy: pre
	@make deploy-setup ;\
	cd ./path/to/your-app ;\
	gcloud builds submit --config=cloudbuild.yaml \ # 用意しておいた yaml を使って build する
        --substitutions=_PROJECT_ENV="${PROJECT_ENV}" ;\ # substitutions の _PROJECT_ENV に値を横流しする
	gcloud run deploy your-service-name \
		--image gcr.io/your-project-${PROJECT_ENV}/your-service-name \
		--platform managed \
		--region asia-northeast1 ; # region はテキトー
```

これで、

```bash
$ make deploy
```

で develop 環境へのデプロイ、

```bash
$ make deploy -e=production
```
で production 環境へのデプロイが可能になります。



　　終
制作・著作
━━━━━
　ⓁⓈⓅ
【備忘録】Macでtensorflowの環境構築

##前提
備忘録です。
あまり理解していないので自分がやったことを書いています。
詳しくは参考文献を見ていただきたいです。

##参考
__[ここ](https://atmarkit.itmedia.co.jp/ait/articles/1804/19/news136_2.html "第2回　TensorFlow環境の構築：TensorFlow入門（2/2 ページ） - ＠IT")__を参考にしました。

##環境
・macOS Monterey : 12.0.1
・anaconda-navigator

##環境構築
###1. フォルダを作成
今回は書籍（documents）にフォルダを作った。

```
conda create -n tensorflow pip python=2.7 (or python=3.3)
```

```
conda activate tensorflow
```
promptが  (tensorflow)$ になればとりあえず良い。

###2. jupyterのインストール
```
conda install jupyter
```
###3. tensorflowのインストール
```
pip --no-cache-dir install -I -U tensorflow
```
###4. jupyter notebookの起動
```
jupyter notebook
```

##コメント
備忘録として書いたので、全く解説しておりません。。。（あまり理解できていません。）
新卒エンジニア、学び続けて頑張ります。
【JavaScript】条件分岐と繰り返し処理

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点等について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## JavaScriptの条件分岐と繰り返し処理

### `if()`
```.js
// 条件式が１つ
 if(条件1){
   処理1
 }
// 条件1を満たすときは、処理1を実行


// 条件式が１つで処理を２つに分ける
 if(条件1){
   処理1
 } else{
   処理2
 }
// 条件1を満たすときは処理1、満たさないときは処理2を実行


// 条件式が2つで処理を分ける
 if(条件1){
   処理1
 } else if(条件2){
   処理2
 } else{
   処理3
 }
// 条件1を満たすときは処理1、条件2を満たすときは処理2、どちらも満たさないときは処理3を実行	

```

### `while()`,`do...while()`,`for()`

```.js
// while()
 while(条件){
  処理
 }
// 引数の条件がtrueの間、波括弧内部の処理が繰り返される


// do...while()
 do{
   最低1回は行われる処理
 }while(条件式);
// true,falseに関わらず最低１回は処理が実行される


// for()
 for ( 初期値; 条件式; 増減値 ){
   繰り返し処理
 }
// 回数を決めて繰り返す際に使用

```
4年目エンジニアから学生エンジニア(過去の自分)へ

# はじめに
こんにちは。
最近全然投稿していませんが、今年でエンジニア歴が約4年目のになります。
新しいキーボードを買って、文字が打ちたくなってきたので久しぶりに投稿します。
投稿したいことがあまり思い浮かばないので、とりあえず駆け出しの時しておけよという内容を過去の自分宛に書こうと思います。
あくまでも自分の主観になります。

# 1つ目
1つ目は、**「なんでもいいからプログラミング言語をマスターしろよ」**です。
駆け出しエンジニアの方には多いのですが、HTML,CSSなどのマークアップ言語をしている方が多い印象です。
webのフロントエンドには必須のスキルなのですが、正直いうとマークアップ言語だけで仕事をするのは厳しいです。
htmlコーダという職種は確かにあるのですが、コーダさんは今の市場を見るにたくさんいます。
しかし、Ruby,PHP,JavaScriptなどのプログラミング言語を使ってweb開発する人材はまだ全然足りないです。(特にJavaScript)
なので、マークアップ言語だけで満足するのではなく、プラス何かのプログラミング言語をマスターするようにした方が良いです。

# 2つ目
2つ目は、**「英語に慣れておけよ」**です。
いろんな方もおっしゃっているのですが、やはり英語にはある程度慣れておいた方が良いです。
エラーが出た場合、日本語で検索してもいい情報がない場合は英語で検索すればいい情報にヒットすることが多いです。
英語を読めるようになる必要はないですが、英語のwebサイトでも情報を閲覧できるように慣れておいたら今後役立ちます。
翻訳はgoogle翻訳に丸投げでOKです笑

# 3つ目
3つ目は、**「自分に合ったエディタを使おうよ」**です。
世の中いろんなエディタがありそれぞれいいところ、悪いところがあります。
会社によっては使用するエディタに制限があるところがありますが、自分に合ったエディタだと仕事のスピードが段違いです。
是非、駆け出しの頃に自分に合ったエディタを見つけてください。
ちなみに、自分は前まではsublime textを使っていましたが、今はvscodeを使っています。


# 4つ目
4つ目は、**「使うものは妥協しないで」**です。
ここでいう使うものはキーボードやマウスのことです。
自分も最近までは何も考えずにキーボードを打っていたのですが、新しいキーボードを買って、感動しています。
今HHKBという高いキーボードを使っているのですが、めちゃくちゃ文字が打ちやすいし、文字を打つのが楽しく、モチベーションも上がっています。
仕事で長時間タイピングする時でも、全然疲れないです。
合わないキーボードだと腱鞘炎になる人もいるので、早いうちにいいキーボードに巡り会った方が良いです。

# 終わり
4つほど書きましたが、まだまだたくさんあります笑
時間がある時にでも続きを書こうと思います。

では、ありがとうございました。
SAPGuiのSAP SSO（＋AzureAD）のアーキテクチャの考察

SAP SSO3.0について、調べたので、結果を残す。

まず、SAP SSOは有償の製品です。以下のコンポーネントがあります。
①Secure　Login　＜secure login client：クライアント側/server：認証サーバ＞
②Identity Federation <SAML2.0 identity provider/STS>
③Single Sign-On Extension Library　　＜Kerberos constrained delegation＞
④One-Time Password Authentication
⑤Policy Scripts　＜TOTPLoginModule/IdP＞
⑥Password　Manager

AzureADと連携するには、以下のリンクにあるとおり、SAMLを通して、
SAP　Netweaver,HANA,FioriにSSO設定ができます。

Azure Active Directory Single sign-on (SSO) integration with SAP NetWeaver
https://docs.microsoft.com/en-us/azure/active-directory/saas-apps/sap-netweaver-tutorial

Azure Active Directory integration with SAP HANA
https://docs.microsoft.com/en-us/azure/active-directory/saas-apps/saphana-tutorial
※XSA　管理インタフェースが必要

Azure Active Directory single sign-on (SSO) integration with SAP Fiori
https://docs.microsoft.com/en-us/azure/active-directory/saas-apps/sap-fiori-tutorial

一方、SAPGUIはSAMLを利用できないので、
X509とKeroberos認証しかできないです。

以下2パターンは考えられます。
①Keroberos認証を利用する。　
※SecureLogonClientが必要です。
②SAML+X509を利用する。
※SecureLogonClient＋SecureLogonServerが必要です。

今回は①で実施する見込みです。
検証できたらまた報告いたします。
Apple Developer Program 登録の道のり

# 背景
iOSアプリで通知を実装したが、実動作のためにはApple Developer Programへ登録しななければ動かせないらしい。Appleにお布施を払うのが嫌だったのでずっと登録していなかったが、これを機に登録を行うことにした。
さらっとはいかなくAppleに問い合わせる必要があったため、メモをのこしておく。

# Apple Developer Program
https://developer.apple.com/programs/
>Join the Apple Developer Program to reach customers around the world on the App Store for iPhone, iPad, Mac, Apple Watch, Apple TV, and iMessage. Membership includes all the tools, resources, and support you need to develop and distribute apps, including access to beta software, app services, testing tools, app analytics, and more.

>Enrolling as an Individual
If you are an individual or sole proprietor/single person business, get started by signing in with your Apple ID with two-factor authentication turned on. You’ll need to provide basic personal information, including your legal name and address.

アプリの配布と、ベータ版ソフトの提供が受けられる。
個人開発者の場合、AppleIDの２段階認証を有効にして、住所・電話番号などの個人情報を提供する必要がある。
**年会費 $99/year...**

# 登録手続きを進めるには、Appleまでお問い合わせださい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663620/8ee101f5-c8e8-b2ef-e91d-aeac7f419094.png)
住所・電話番号を入力したところで、登録処理が止まる。
「問い合わせろ」と書きつつ、下では「審査中」となっていて、待ったらいいのか、問い合わせたらいいのかわからない文面。
３日様子見したが、進展がなかったため、リンクから問い合わせを行う。

# 問い合わせの返答
> この度は、登録に関して Apple Developer Program Support へお問い合わせ頂き、誠にありがとうございます。
> こちらの登録を継続するには、政府が発行したご登録者の身分証明書のコピー (期限の切れていない有効なもの。（例：運転免許証もしくはパスポート ) を弊社が送られた下記のメールが送られて来ますので、そこからアップローダーよりご提出ください。
> ※恐れ入りますが、健康保険証は身分証明書として承る事が出来ない旨、ご了承下さい。
> をいただき次第、ご依頼を処理させていただきます。別途、AppleSupport@email.apple.com から安全に書類をアップロードできるリンクをお送り致します。
> 書類のアップロード後に、このメールに返信してお知らせください。ご返信をもってリクエストの処理を進めさせていただきます。

問い合わせから１日後に返信あり。（一部、文章がおかしいですが、送られてきた文面そのままです。）

 * 身分証明書のアップロードが必要
 * アップロードリンクは別メールにてお知らせする
 * アップロード後、本メールへ返信することにより、登録処理をすすめることができる

つまり、問い合わせしないと、一生先に進まなかったみたい。さっさと問い合わせるべきでした。

# その後

１． 身分証明書アップロード
２． アップロードした旨をAppleへ返信
３． Appleから身元確認が取れた旨の返信
WEBページにアクセスすると、支払画面が表示され無事お布施ができました。

Googleには何度か問い合わせをしていますが、Appleのレスポンスの良さには驚きました。いずれの返信も丸１日以内でしたし、登録が無事終了したあとにも、問い合わせに対するリプライの形でフォローのメールが送られてきました。
シェルとは？

#はじめに
学んだことをqiitaに投稿という形でアウトプットするため、また備忘録として記事を作成しました。

#シェルとは？
Linuxの操作はコマンドでする
シェルはコマンドを操作する場所
LinuxのCLIを提供するソフトウェア
カーネルとユーザの橋渡しをしているのがシェル、インターフェース

シェルの画面
ユーザ名、ホスト名、プロンプトが表示されている
・ユーザ名
ログインしているユーザ

・ホスト名はコンピュータなどの機器を人間が識別しやすいようにつけた名前、コンピュータの名前やIPアドレスが入っている

・プロンプト
「コマンド入力を待っているから、コマンドを入力してね」と待っている記号

###シェルの仕組み
１、ユーザがプロンプトにコマンドを打つ
２、シェルが入力された名前のコマンドを探す
３、Linuxカーネルが見つかったコマンドを実行
４、シェルが実行されたコマンドを画面に表示

※macではターミナルを立ち上げてコマンドを入力するが,
ターミナルは入出力の画面を提供するソフトウェア
シェルはコマンドを解釈するソフトウェア
ターミナルの中でシェルが動いている
別物なので注意
なぜ別れているかというとLinuxにはひとつのプログラムにはひとつの機能をやらせる、色々な機能を出来るだけ細かく切り分ける設計思想がある。
機能が別れていることでお互いに影響を与えることなく柔軟に開発することが出来る、この設計思想は非常に有用で身につけるべき

###シェルの種類
・sh　
もっとも古い
ほぼ全てのUnixで使用可能
機能は少ない

・bash
shを基本として機能を拡張してシェル
Linux環境でデフォルトのログインシェル
学習で使うならbashがおすすめ

・zsh
bashの機能を取り込み、独自の拡張も追加
機能が豊富

###まとめ
シェルはLinuxのCLIを提供するソフトウェア
プロンプトは入力待ちの記号
ターミナル、シェルは別物
シェルは３種類、sh,bash,zsh
ひとつのプログラムにはひとつの機能をやらせる、色々な機能を出来るだけ細かく切り分ける設計思想がある
wsl の Ubuntu で catkin_make / catkin build が失敗する (bad variable name)

# 何の記事なの？

wsl 1 の Ubuntu で ROS 1 を使っていて，

```
mkdir -p ~/catkin_ws/src
cd catkin_ws
catkin_make
```

しただけなのに，エラーが出て困っている人のための記事（というか，解決していないです）．

多分，以下の人に起こります．
- wsl 1 の Ubuntuで ROS 1 を使っている人
- wsl 1 で 複数の Ubuntu ディストリビューションを使っている人（wsl --export で吐き出したimageを --import で読み込んで使っている人）
- Windows Terminal から wsl コマンドで wsl を立ち上げている人

注：3時間ほど溶かしてそれっぽい記事にたどり着いたので，情報共有を目的として記載（下リンク先の要約）

https://askubuntu.com/questions/1354999/bad-variable-name-error-on-wsl

# 現象

```
mkdir -p ~/catkin_ws/src
cd catkin_ws
catkin_make
```

とすると，以下のエラーが発生する．
(catkin build でも同じ原因でエラーが出ますが，以下 catkin_make の話として)

- PowerShell 5.1（Windows Terminal インストール時）からwslコマンドで立ち上げた場合

```
-- BUILD_SHARED_LIBS is on
/home/k-kame/rosws_test3/devel/env.sh: 4: export: (x86)/Common: bad variable name
```

- PowerShell 7.2.1　から wsl コマンドで立ち上げた場合

```
-- BUILD_SHARED_LIBS is on
/home/k-kame/rosws_test3/devel/env.sh: 4: export: Files/PowerShell/7:/mnt/c/Program: bad variable name
```

- Ubuntu マークのアイコンから立ち上げた場合には，上のエラーは起こらない．

# 原因

Windows のパスを wsl 側で解釈した際の，フォルダ名の空白など．

# 解決法（[参照元](https://docs.microsoft.com/ja-jp/windows/wsl/wsl-config)）

/etc/wsl.conf に以下を追記

```
[interop]
appendWindowsPath=false
```

-注：catkin_make はできるようになるが，```code``` で vs code が起動できなくなる（windowsのパスを参照しなくなるため）．他にも問題があるかもしれないが未確認．

## 運用でカバー

`catkin_make` しなけりゃ問題ないので，普段は`appendWindowsPath=true`にしておいて，「catkin_make しよー」と思って立ち上げる時だけ，Windows から`appendWindowsPath=false`にする．

ただし，上記書き換え後に wsl を終了させ，立ち上げなおす必要がある（powershell で以下を実行）．

```
wsl --shutdown
```

元記事には「スクリプトを直せ」と書いてあるけど，さてどうしたものか（分かったら追記します．うまい方法をご存じの方がいたら教えてください・・・）．
Linuxについて

#はじめに
学んだことをqiitaに投稿という形でアウトプットするため、また備忘録として記事を作成しました。
背景を確認してから、勉強することで便利さを確認。使う意味を理解する。そして実際に手を動かしながらハンズオンで学び体に染み込ませる

#Linuxとは？
OSの一種でコンピュータを動かすための基本ソフトウェア、これがないとコンピュータは動かない
Windows,macOS,Android等

_背景_
1970年頃にUnixというOSが誕生
これはライセンス縛りがあり、有料
ソースコードは公開されていたので、様々なUnixの派生が誕生
しかし、ライセンス料がかかるので当時大学生のリーナス・トーバルズがLinuxを開発し、オープンソース化、無償で提供

オープンソースの文化の発展とともに育っていった。
無償で提供しているのでキャラツイフローサービス？（検索しても出てこなかった）という物が無い、なのでオープンソースを使うには、自分で調べたり、工夫したり自助努力が必要。そうやって問題解決したらインターネットで困っている人を助けてあげようと、お互いに助け合いながら開発。こうして育ってきたのがオープンソースの文化です。

###どこで使われているか？
サーバー、組み込み、デスクトップ
サーバーのOSがLinuxだと操作ができないという状態に

特徴と欠点
特徴
・信頼性が高い、サーバのOSとして広く普及。
・自動化の仕組みがあり、サーバの運用が行いやすい。

欠点
・商用アプリケーションがあまりない
ーマイクロソフトオフィスが動作しない
ー画像、音楽、動画などマルチメディア系の編集が苦手
・日本語対応していない

まとめ
LinuxとはOSの一種
１９９１年にリーナス・トーバルズがUnixをベースに開発、リリース
幅広い用途で使われている

#なぜLiuxを学ぶのか？
・幅広いところで使われている
サーバ用
ーweb系では９０％以上のサーバがLinuxを使っている
組み込み機用

・長年使われている
ー多くのユーザに検証されていてこれから大きく仕様が変わることはない
ー技術が枯れている
ー一度習得すれば何年も使える、自分の基礎力として身に付く

#Linuxディストリビューションとは？
###カーネルとディストリビューション
カーネルはOSの中核となるソフトウェア、狭義での意味でのLinuxとも呼べる。機能が少ないため実用的ではない
ここに基本のコマンドやアプリケーションを付け加えてユーザがそのまま仕様出来るようにしてものをLinuxディストリビューションという。
一般的にLinuxと言ったら、このディストリビューションのことを指す
ディストリビューションは1000種類以上がある。
Red Hat系とDebian系が主流
Red Hat系のCentOSが無償で
対してカーネルは一つ

まとめ
カーネルはOSの中核にソフトウェア
ディストリビューションはカーネルに様々なソフトウェアを加えて使い易くしたもの
ディストリビューションは1000種類以上あり、独自のコミュニティが開発している
RedHat系とDebian系が主流
StarterとPlayerとManager

#警告
この記事は極めて微妙な問題を含むので、以下の方は読まないように。

- 相容れない考えが許せない人
- 気に入らない主張に物申さずにはいられない人

#さて
準備はいいか？ここから先は冷酷な現実だ。
IT業界によくあるケースとして、新規参画者の問題がある。
例えば

- 経験者の（技術は持っている）人間を中途採用した
- SESから不足人員を補充した

などという場合のことだ。ここでは便宜上

- Starter：補充人員
- Player：既存のプロジェクト従事者
- Manager：プロジェクト管理者

という前提で話をさせてもらう。
#陥りがちなやってはいけないこと
PlayerやManagerはStarterと同等以上の技術を持っている上に
プロジェクト固有の事情や、それに付随ずる設計上のメリットや
デメリットも十分に承知している（はずである）。
しかしStarterは技術を持っているだけで、プロジェクトの事情には無知だ。
この点をよくよく理解しないとチームの生産性を大きく損ねることになる。
#一番やってはいけない「放置」
人員が足りない。Starterを補充した。ここまではいい。だがStarterに
「資料はここ、ソースのリポジトリはここ、ドキュメントはここです。」
という情報を与えただけでは**絶対に戦力としては育たない**。
これだけは断言してもいい。プロジェクト固有の事情は教育必須である。
#ではどうすればいいのか？
Playerが毎日ルーティンでこなしている作業をStarterと同伴実行するのだ。
はっきり言って手間だ。Playerの生産性を落とす。Starterが期待するほどの
成長をする保証もない。だがやらなければStarterの成長は期待できないのだ。
これは中長期的なチームの生産性が伸びるか伸びないかを左右する。
#ありがちなNG事例
Starterに、ある処理単位の仕事を担当させて、進捗を確認したとする。

- まだそこですか？
- なんで質問しないんですか？

こういうことをStarterに投げかけるPlayerがいる場合、Managerは即座に
対策を考えなければならない。こういう言葉を投げかける以前の問題として
PlayerがStarterに対して（ある意味手取り足取り）教える必要があるのだ。
教える手間を惜しんで「なんでわからないんですか」は甘えである。

加えて言うと、あまりこういうことは言いたくないのだが、上記のようなこと
をStarterに投げるPlayerというのは、本人が意識するかしないかを別にして
**ハラスメントにあたる**ということを十分に意識しなければならない。

- Starterの質問に「前に説明しましたよね？」「以前も説明しましたけど」

いやそんなことはわかっている。Starterだって以前に説明されたことくらいは
覚えているだろう。だが人の記憶は不完全なものだ。目と耳で受けた情報でも、
極めてvolatileなものだから、せいぜい５割くらいしか覚えていない。
同じ質問に対して、嫌な顔をせず、嫌みも言わず、何度でも答えるのが重要だ。
どんなにバカでも同じことを３回聞けば、質問の内容を変えてくるものだ。

- なんで失敗したんですか？

それはStarter本人が聞きたいことだ。道を歩いていて障害物につまずいた場合
「なんで転んだんですか？」と聞かれても「知っていれば転んでいないわ！」と
答えるのが普通の人間の反応であろう。失敗を責めてはいけない。失敗は失敗と
して、次からはどうすべきかを教えるべきなのだ。失敗した理由は本人が一番
よくわかっている（はずだ）。そんなことを追求してもまったく意味がない。
それどころか質問意欲を喪失させ、失敗を隠蔽され、進捗の遅延を招く。

- 質問攻め

Player　なんでこうしたんですか？
Starter　それはその時に～と思って～だったので～しようと思ったからです
Player　なんでその時まわりの人に聞かなかったんですか？
Starter　いやそれはその・・・

この流れの大きな問題がわかる人はいるだろうか。この会話における問題は、
**Playerの質問が結果論**なことである。どんなにバカでも結果論で相手を責める
ことくらいはできるのだ。だがその行為は意味がないどころか有害である。
プロジェクトについての知識が足りないStarterに対して、こういう結果論の
質問を投げ続けていると

- 質問しても無駄だ
- どうせまた結果論で上げ足を取られる
- 今まで聞いたことのメモと資料を元に何とかしよう
- 解決に時間がかかっても嫌みを言われるよりましだ

という負の感情が加速して、結果的に進捗が出ず、言い訳もできず、揚げ足取り
の質問ばかり受け、Starterの就業意欲や生産性を大幅に下げる。場合によっては
ハラスメントに当たるケースすらありうる。
#人を育てるには
ここからは自分の信条を並べることにする。なので人それぞれだと考えてほしい。
たとえ違うと思っても、思想信条は人それぞれ尊重されると日本国憲法においても
定められている。飲み込んでほしい。

- 同じ質問だとわかっていても何度でも答える

人の記憶はvolatileなものだ。一度説明した程度で理解されると思わないでほしい。
目で見て、耳で聞いて、手でメモを取りながら説明を受けたとしても、その内容は
せいぜい５割程度しか理解されないと思うべきだ。だから何度でも同じことを説明
する姿勢が大切だ。同じことを３度聞けば、３度めには質問内容を変えてくる。

- 結果論を持ち出さない

「なんでその時に～しなかったんですか？」はご法度である。それがわかっていれば
最初からそうするように動いたはずだ。結果論で相手を責める人間は、責めている
自覚が薄い場合が多い。いわゆるハラスメントにあたることがほとんどだと思う。
「技術はあってもプロジェクトには無知」であることを十分に意識して、質問される
ことに対して「ありがたい」と思うくらいでちょうどいいのである。

- 質問意欲を最大化することに注力する

StarterがPlayerやManagerに対して「これって何ですか？」と聞いた時に、不愉快な
反応をされたら質問する意欲が減退する。それではだめなのだ。いつ何を聞いても、
同じ質問でも、快く答えてくれるという信頼関係がなければStarterは育たない。
相手の立場や心情や理解度を鑑みつつ、何度聞かれても快く答える精神的な安定性が
なければ、Starterは絶対に育たないのである。
#まあわかっているよ
この記事を快く思わない人が一部にいることはわかっている。
そのあなたのプロジェクトが順調に進むことを祈って止まない。
PHPで日付時刻を取得するならCarbon型が便利

# 背景  
テストコードを書く時にさっと日付を戻したり進めたりする時にすごい便利だったので使い方をメモします。  
# Carbon型とは  
PHPのDateTimeクラスを継承して拡張された日時操作ライブラリのことです。  
# 導入方法  
Composerでインストールすればすぐに使えます。
  
```
composer require nesbot/carbon
```
# 使い方 
```
<?php
  use Carbon\Carbon;
  echo Carbon::now(); // 現在の日時を取得(2022-01-01 00:00:00)
  echo Carbon::today()->toDateString(); // 日付のみ取得(2022-01-01)
  $carbon = Carbon::create(2022, 1, 1, 10, 20, 30); // 引数で時刻を設定
  echo $carbon->year; // 2022
  echo $carbon->format('Y年m月d日'); // フォーマットを指定できます(2022年01月01日)
```

# CarbonImutable型
* Carbon型の他にCarbonImutable型というのがあります。
* CarbonImutable型は一度オブジェクトが作成された後にメソッドを呼んでも内部状態が変わらない性質があります。  

具体的な違いを以下の例で説明します。  

```
// 現在時刻を操作
\Carbon\Carbon::setTestNow('2020-01-01T00:00:00');
// 現在時刻を取得
$now = \Carbon\Carbon::now();
// 翌日の時刻を取得
$tomorrow = $now->addDay();
```
上記のように実装した場合、それぞれの出力結果は以下のようになります。  

```
now: '2020-01-02T00:00:00'
tomorrow: '2020-01-02T00:00:00'
```  
`$now`の値も変わってしまいます。
これは`$now`と`$tomorrow`が同一のオブジェクトであることが原因です。
`$now`の中身を変えないようにするには`copy()`を使用します。  

```
// 現在時刻を取得
$now = \Carbon\Carbon::now();
// 翌日の時刻を取得
$tomorrow = $now->copy()->addDay();

// 出力結果
now: '2020-01-01T00:00:00'
tomorrow: '2020-01-02T00:00:00'
```
CarbonImutable型を使えば`copy()`を使わなくても大丈夫です。

```
\Carbon\CarbonImmutable::setTestNow('2022-01-01T00:00:00');
$now = \Carbon\CarbonImmutable::now();
$tomorrow = $nowImm->addDay();

// 出力結果
now: '2020-01-01T00:00:00'
tomorrow: '2020-01-02T00:00:00'
```

状況に応じて使い分ける必要はありますが、時刻操作をする際はかなり便利なので覚えておくと良さそうです。
Jenkins をアップデートしたら SSH Build Agents で登録していたエージェントがつながらなくなった。プラグインアップデートしたら直った。

# はじめに

タイトルがほぼすべてです。
以下は体系的ではないトラブルシューティングのメモです。

記事後ろに Jenkins アップデートのトピックを加えています。

# 状況とトラブルシューティング

## 前もって小さな個人の Jenkins をアップデートした

年始なので個人の Jenkins を最新のバージョンにアップデートした。数日動かしたが問題はなかった。
個人の Jenkins はエージェントを利用していなかった。

## 軽率にチームの Jenkins をアップデートした

チームの Jenkins を 2.276 -> 2.328 にアップデートした。
再起動直後に各 SSH Build Agent Plugin を使っていた各エージェントにアクセスができなくなっていた。

エージェントへの SSH アクセスに成功するが、 remoting.jar のコピーに失敗していた。

```
 [...] [SSH] Copying latest remoting.jar... java.io.IOException: Could not copy remoting.jar into '/home/jenkins/workspace' on agent 
at hudson.plugins.sshslaves.SSHLauncher.copyAgentJar(SSHLauncher.java:717) 
...
 Caused by: java.lang.IllegalArgumentException: invalid len argument 
at com.trilead.ssh2.SFTPv3Client.read(SFTPv3Client.java:1232)
... 7 more 
```

## 関連 issue を見つけた

「`jenkins invalid len argument`」で検索した。
エラーログや Jenkins バージョンがほぼ一致する issue があった。

- Could not copy remoting.jar - Jenkins Jira : https://issues.jenkins.io/browse/JENKINS-67258

根本解決はされておらず、途方に暮れた。

## 「えいやっ」とアップデートした

SSH Build Agents の関連というのは issue でも自分のエラーログでも共通なので、一縷の望みをかけて SSH Build Agents とその依存のプラグインだけアップデートした。
SSH Build Agents を 1.31.2 -> 1.33.0 にアップデートして Jenkins 再起動した。
直った:tada:

## めでたしめでたし

規模が小さな Jenkins で問題がなかったからって、チームの Jenkins で軽率に対応しないようにしよう。
ロールバック用のバックアップはあったので安心して軽率になっていたのはある。

# 上記以外の Jenkins アップデートのトピック

## ダッシュボードの見た目がよくなった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/90c002ed-0217-a51f-62e9-bd5c3f6cd685.png)

Before はないですが、今回はとくにビューの選択部分がだいぶ変わった印象です。
Jenkins はここ数年見た目がどんどんよくなっている印象です。アップデートの楽しみの1つです。

## Jenkins の名前マイグレーションが入った

以前 Jenkins では master, slave（マスター, スレーブ）という単語が利用されていた。
マスターはジョブを管理するマシン、スレーブはジョブを実行するマシンのそれぞれの呼び名だった。

数年前からプログラミング界隈で攻撃的な表現を含む単語の利用をやめようというムーブメントがある。
奴隷と主人を元にした言葉である master, slave という単語はそれぞれ Controller, Agent という単語に置き換わりました。

master, マスター -> Controller, コントローラー
slave, スレーブ -> Agent, エージェント

https://www.jenkins.io/blog/2020/06/18/terminology-update/

変化の一部が今回のアップデート（2.276 -> 2.328）にも含まれていました。
コントローラー自体のジョブ実行エージェントの名前を "master node" から "built-in node" に名前マイグレーションできます。管理画面で変更するかどうかの通知があります。

https://www.jenkins.io/doc/book/managing/built-in-node-migration/

アップデートによる強制的な変更はないので安心です。
Raspberry piにSORACOM CLIをインストールする

# はじめに
ラズパイからSORACOMのAPIを叩くにはCLIを使うのが便利ですが，[公式ドキュメント](https://users.soracom.io/ja-jp/tools/cli/getting-started/)に書かれているインストール用のコマンドラインはラズパイ向けになっていないので，備忘録としてラズパイ用のインストールコマンドを残しておきます。

# 実行環境
機種: Raspberry pi 4 Model B
OS: raspbian 10.10
CPU: ARMv7 (32bit)

# コード
```get_soracom_cli.sh
#!/bin/bash
case "$(getconf LONG_BIT)" in
  "32" ) suffix="" ;;
  "64" ) suffix="64" ;;
esac

# ダウンロードURL
url=$(curl -s https://api.github.com/repos/soracom/soracom-cli/releases/latest \
    | grep browser_download_url \
    | grep "linux_arm${suffix}.tar.gz" \
    | cut -d'"' -f4)
# ダウンロードするファイル名
archive=$(curl -s https://api.github.com/repos/soracom/soracom-cli/releases/latest \
    | grep name \
    | grep "linux_arm${suffix}.tar.gz" \
    | cut -d'"' -f4)
# 解凍先ディレクトリ名
dir_name=$(echo $archive | cut -d'.' -f1-3)

echo "Download URL is ${url}"
echo "Archive file name is ${archive}"

wget $url
tar xvf ./${archive}
sudo cp ./${dir_name}/soracom /usr/local/bin/
sudo chmod 755 /usr/local/bin/soracom
which soracom
```
GitHubのAPIでCLIの最新バージョンを取得しているので，いちいちReleasesページを見に行かなくても最新版をインストールできるようになっています。

[Releases - GitHub Docs](https://docs.github.com/en/rest/reference/releases#get-the-latest-release)

ラズパイのCPUは基本ARMなので，32bitか64bitかだけ気にすればいいはずです。`getconf`コマンドを使うことでCPUの情報を取得することができます。

[Linuxでの32bit/64bitの確認方法(CPU、カーネルのBit数) | ぱーくん plus idea](https://web.plus-idea.net/2014/11/linux-32bit-64bit-cpu-bit/)

# 実行結果
```
pi@raspberrypi:~/Documents $ bash get_soracom_cli.sh 
Download URL is https://github.com/soracom/soracom-cli/releases/download/v0.10.4/soracom_0.10.4_linux_arm.tar.gz
Archive file name is soracom_0.10.4_linux_arm.tar.gz
(中略)
2022-01-07 23:35:51 (59.2 KB/s) - `soracom_0.10.4_linux_arm.tar.gz' へ保存完了 [5321245/5321245]

soracom_0.10.4_linux_arm/soracom
/usr/local/bin/soracom
```

お役立てください。
FreePascalがDelphiと違うところ

FreePascal(FPC)には、Delphi互換モードがあるので便利。

拙作の、[テキスト音楽「サクラ」](https://sakuramml.com)は、Delphi7に加えて、FPCでもコンパイルできるようになっている。

それで、[日本語プログラミング言語「なでしこv1」](https://nadesi.com)もFPCでコンパイルできるようにしようと思っているのだが、なかなか難しい。

試している中で分かったことを以下にメモする。

# コンパイルコマンド

以下のように、-Mdelphiを指定して、fpcコマンドを実行する。すると、Delphi互換モードになる。

```
$ fpc -Mdelphi -g -gv -dFPC -vewh ファイル名.dpr
```


# SysUtils.LeadBytes問題

SJISの1文字目をSysUtils.LeadBytesで判定したのだが、これがうまく設定されない。そのため、以下のようなSJISLeadBytesを定義して、SJISの1文字目を判定する。そもそも、SJIS使わないようにすれば良いのだが、Delphi7で書いた多くのプログラムはSJISである。


```sjis.pas
type
  TChars = set of AnsiChar;
const SJISLeadBytes: TChars = [#$81..#$9F,#$E0..#$FC];
```

> 2024/03/09 --- 上記値が間違っていたので修正。


# ZeroMemory がないので FillByte を使う

パラメータが若干違うけど、単純に置換可能。

https://www.freepascal.org/docs-html/rtl/system/fillbyte.html

ただし、第一引数には、ポインタではなく、ポインタが指す値を指定する必要があり、利用には注意。
Power Automate: Office Scripts から直接 JSON 取得出来るようになってますね。

# 背景
以前は、以下のように文字列化する必要があったんですが、return については不要になってるみたいだったので調査記録

> JSON.stringify(retreiveData)

# 結論
- 引数を渡さずに、取得するだけなら、JSON 取得は可能
- 引数については未対応どころか、Return に JSON 指定すると使えなくなります 😅
- 故に、引数を利用したい場合は、従来通り string で利用する必要あり

さて・・そのうちまた対応されることを期待して待つだけですかね。

:::note warn
2022/1/9 追記
object 型で JSON の受け渡しは出来るようになってるけれど、今回の記事同様に Return に object 指定すると引数が使えなくなりますね。
:::

# 実装例
```typescript:OfficeScripts
function main(
  workbook: ExcelScript.Workbook
): JSON {

  const retreiveData: JSON = <JSON><unknown>{
    "response": "取得",
    "value": "値"
  };
  return retreiveData;
}

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/b62c237f-d6e4-bb15-5aa6-ffab37e51c56.png)

こんな感じで、使いやすくなってますよね。

```json:Automateでの取得結果
{
  "result": {
    "response": "取得",
    "value": "値"
  },
  "logs": []
}
```
```json:stringでの取得結果
{
  "result": "{\"response\":\"取得\",\"value\":\"値\"}",
  "logs": []
}
```

## 返り値の説明
Document によると、JSON の対応は特に明記されてるようには見えない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/34310142-8933-5709-44db-29647f480351.png)

https://docs.microsoft.com/en-us/office/dev/scripts/develop/power-automate-integration#return-data-from-a-script

# Argument/Return を各種型で試してみた結果

|Argument type|return type|Automate での Argument<br>動的コンテンツでの表示|Automate での Return|
|-|-|-|-|
|Nothing|**JSON**|-|JSON<br>今回の記事|
|object|**JSON**|表示されない|動作エラー status 429 後に Retry で成功|
|object|Nothing|OK as object|-|
|string|**JSON**|表示されない|動作エラー status 429 後に Retry で成功|
|string|string|OK as string|OK as string|
|**JSON**|**JSON**|表示されない|動作エラー status 429 後に Retry で成功|
|**JSON**|Nothing|表示されない|-|
status 429 ってことで、恐らくArgument がない為の無限ループかな・・。
ただ、何故か Retry 後には正常取得は可能。
とはいえ、5分ほど必要になるので、正直使えないと思った方がよさそう

# 参考資料
https://docs.microsoft.com/ja-jp/office/dev/scripts/develop/power-automate-integration

# keyword
retruning as JSON in office scripts is comming?
Qiitaの投稿画像は非参照状態でも時間経過では削除されない

いつもの、最近会社で聞かれて答えたことをまとめてみた、わけではありません。

# 事の発端

先日、記事を作成する際に誤った画像をアップロードしてしまいました。消しておきたいレベルの誤りでした。記事からも下書きからも参照されていなければ、画像は時間経過で削除されるのではないか。そのように考えて24時間経過しましたが、なかなか削除されません。検索するも、直接的な答えには辿り着けませんでした。

* [Qiitaの画像アップロード上限について](https://qiita.com/hideto2112/items/4d10343d151249c50fa5)
* [Qiitaの記事に埋め込んだ画像の開放タイミングについて](http://satoru-takeuchi.hatenablog.com/entry/2017/03/03/090041)

# 問い合わせた結果

[Qiitaに問い合わせた](https://support.qiita.com/hc/ja/requests/new)ところ、参照されない状態であっても時間経過では削除されない、依頼すれば削除してもらえる、という回答でした。上に挙げたブログに書かれている"参照カウンタが0になったら"のような実装を想像していたのですが、そうではなかったようです。

そのときは画像URLを書き留めていたので、削除したい画像URLを示して削除していただきました。画像URLなしの依頼で削除できるかは確認していません。

# まとめ

投稿コンテンツのコントロールという観点で考えると気になるところです。しかし、今のところは気を付けるしかないようです。もし誤ってアップロードしたことに気づいたら、まずは画像URLを書き留めておくことが大切かもしれません。