OmniAICreator/Qiita-1.07M huggingface dataset:
SPSS Statisticsによる生存分析①生命表

[SPSS Statisticsによる生存分析①生命表](https://qiita.com/Makimaki2020/items/bae6c577cd8b20a37163)
[SPSS Statisticsによる生存分析②Kaplan-Meier](https://qiita.com/Makimaki2020/items/5a7222a845b6ee796093)
[SPSS Statisticsによる生存分析③Cox回帰](https://qiita.com/Makimaki2020/items/6e4af9157fcf520cfa92)
[SPSS Statisticsによる生存分析④時間依存のCox回帰](https://qiita.com/Makimaki2020/items/9b7fcb0fba5168dae66d)
# はじめに
■環境
Windows 10
SPSS Statistics 28.0.1
SPSS Advanced Statisticsオプション

■データ
製品同梱サンプルファイル pain_medical.sav

# SPSS Statisticsの生存分析
生存分析とは、ある事象(イベント)が起こるまでの時間の長さに対する分析です。たとえば、患者の治療時間や生存期間、登録会員が退会するまでの期間、機械、システム、製品、部品の故障までの時間や寿命の長さ、またローン審査にかかる時間など分析することができます。これらのデータの特徴は時間の経過に伴い分析の対象が減少していく点にあります。患者の治療時間を扱う場合、治療完了のステータスになるとその患者のデータはその時点から対象から除かれます。また、何らかの事情で途中で治療を取りやめてしまった場合にもその患者のデータはその時点から対象から除かれます。このような「打ち切り」を含むデータを生存分析では扱うことができます。

生存分析分析のメニューは次の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/e244129f-5a65-4865-5d68-af2f79b46f68.png)
それぞれのメニューの主な目的と概要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/37691edf-f6a3-3c45-a9d6-b926826a6120.png)


# 生命表
ここでは、生命表を取り上げます。
このメニューの主な目的は、イベント発生までの時間変数を要約することです。
手順は、[分析]メニュー＞[生存分析]＞[生命表]を選択します。
　①　時間変数を[時刻]に指定します。
　②　時間変数の最大値より大きい値を指定します。
　③　時間の間隔を指定します。
　④　状況や状態などを表す変数を[状態変数]に指定します。
　⑤　[事象の定義]ボタンをクリックします。
　⑥　[状態変数]の事象(イベント)を表すコードを指定します。
　番外　[オプション]ボタンでは、様々な作図が選択できます。[因子]変数を指定すると因子変数内の群間の比較や検定が行えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/17fe5f21-8b6b-89be-dc17-24cfaf587880.png)
実行して出力された生命表です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/10c0913a-1b9c-f6e6-e18a-0b14849c2fdd.png)
時間の経過とともに[区間の最後の生存率]は減少します。[ハザード比]からどの区間が事象が発生する確率が高いかを見つけることができます。
次に、先ほどの設定に[因子]変数に治療(新薬：０と既存薬：１)追加して比較をしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/44763b36-77a4-9f90-3a30-dbf2474efd1f.png)

[オプション]ボタンの[作図]で[生存分析]を選択し、[１次因子レベルの比較]で[全体]を選択します。今回は２群(新薬と既存薬)の比較なので、[ペアごと]を選択しても結果は同じです。群が３つ以上の場合に因子全体で有意差を見たいのか、それともどの群間に有意差があるか見たいのかによって使い分けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/6ecd7c16-9594-ec5e-8f40-dfb7fb091497.png)

実行すると[生命表]が１つのテーブル内で[新薬]と[既存薬]に分割されています。
[中央値の生存時間]テーブルから、新薬の方が時間の中央値が短い、つまり薬の効き目(効果)が早いことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/eebd7eae-bd5d-6840-9b8e-5a952626ab22.png)
生存関数(生存率曲線)グラフでは、視覚的に新薬と既存薬の効き目を[効果までの時間]単位で比較することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/c1e68db8-654c-a273-51bc-db7aaf40be7e.png)
新薬と既存薬の効き目の時間に有意な差があるかを検定した結果がWlicoxonの有意確率です。ここでは、有意確率0.387で、統計的に有意な差は見られませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855260/51e440c7-afd8-a1df-5e48-4966b9f1fb0d.png)

# まとめ
SPSS Statistics生存分析の生命表の主な機能を紹介しました。

## 参考
https://www.ibm.com/blogs/solutions/jp-ja/spss-stats-tips-08/
Azure Service Bus って何？

# プロローグ

**ほげ君**：ねえねえ、 Azure Service Bus って知ってる？
**ふが君**：何それ？知らない。
**ほげ君**：僕も知らないんでよね！どんなものなのか教えてよ、 Microsoft 公式ドキュメント君！
**公式ドキュメント君**：分かりました。





# Service Bus 概要
**ほげ君**：Bus ってことは乗客的な何かが乗ったり下りたりするのかな？
**ふが君**：どうなんだろう？

**公式ドキュメント君**：Azure Service Bus は、メッセージ キューとパブリッシュとサブスクライブ トピックを (名前空間内に) 備えたフル マネージド エンタープライズ統合メッセージ ブローカーです。 

**ほげ君**：相変わらず、意味わからん。
**ふが君**：これはひどいね。んー、メッセージを受け渡しするのかな？

**公式ドキュメント君**：Service Bus は、アプリケーションとサービスを相互に分離するために使用され、次のような利点があります：
・競合する worker 間での作業の負荷分散
・サービスやアプリケーションの境界を越えたデータと制御の安全なルーティングおよび転送
・高い信頼性を必要とするトランザクション作業の調整

**ほげ君**：やっぱ意味わからん。メッセージングサービスが何なのかも分からんし、なんでこんな利点があるのかもわからん。
**ふが君**：ん－、これはちょっと他に聞いたほうがよさそうだね。メッセージングサービスについて教えてよ、グーグル先生！

**グーグル先生**：メッセージングサービスを一言でいうと、「システムAがメッセージを送信し、それを別のシステムBで受信できるようにする仕組み」を提供するサービスです。

**ほげ君**：なるほど。これは分かりやすいが、この機能を使う意味ってなんだ？
**ふが君**：メッセージの受け渡しができると嬉しい理由についても教えてよ。

**グーグル先生**：現在、様々なITシステムは、オープン系といい、数台～数十台のサーバが連携しあって1つのシステムを構築しています。それぞれのサーバの、様々なプログラムが複雑に連携することで、大規模なシステムの処理が成り立っています。そのような場合、1つのプログラムに問題が発生すると他のプログラムの処理も止まってしまい、場合によってはシステム全体が停止してしまう、ということも珍しくありません。

**ほげ君**：みんなで一つの仕事を一緒にこなしているから、一人でも倒れたら仕事ができなくなるってことか。
**ふが君**：確かにこれは問題だね。どうやってこの問題を解決するの？

**グーグル先生**：そのようなことを防ぐために、システムの複雑さを切り離す必要があります（疎結合化といいます）。それによって、システムやプログラムの安定稼働を支えます。プログラム同士の疎結合化を実現するのが、メッセージングサービスの役割です。

**ほげ君**：えーと、どういうことだ？
**ふが君**：みんなでこなしてた一つの仕事を小分けして、各自の担当を決めて、お互いどれぐらい進んだかをメッセージングサービスで伝えるって感じかな？
**ほげ君**：もう少し具体的にメッセージングサービスの使いどころを教えてくれ。

**グーグル先生**：例えば、電話とメールを考えてみます。電話は、相手が同時に応答しないと”メッセージを送る”が成立しません。一方でメールは、相手が同時にメールを見ていなくても、”メッセージを送る”ということが可能です。電話のように、相手の応答を待つような処理のことを”同期処理”、相手の応答を待たないでいい処理を、”非同期処理”といいます。メッセージングサービスは、プログラム間の非同期処理化をおこなうことができます。

**ほげ君**：なるほど。書き残しみたいなもんか。
**ふが君**：非同期処理以外はどんな使い方があるの？

**グーグル先生**：メッセージングサービスは、データを連携するために特化したシステムであるため、データ連携をより安全に行うための様々な仕組みが用意されています。たとえば、クレジットカードなどの決済情報を通信している際に、クレジットカードシステム側の障害等でデータが消失してしまうと、利用者やカード会社は困ります。このように、安全なデータ連携を行いたい場合はメッセージングサービスを使うといいでしょう。

**ほげ君**：えーと、どういうことだ？
**ふが君**：多分大事なデータを正確に、確実に届けることができるってことじゃない？消えたり、間違えたりしないような仕組みが組み込まれているってことだよ。
**ほげ君**：なるほどな。メッセージングサービスの意味が分かったよ。
**ふが君**：じゃあ本題に戻ろうか。Service Bus とは何か、もう一度教えてよ、公式ドキュメント君。

**公式ドキュメント君**：Azure Service Bus は、メッセージ キューとパブリッシュとサブスクライブ トピックを (名前空間内に) 備えたフル マネージド エンタープライズ統合メッセージ ブローカーです。

**ほげ君**：…切れていいか？
**ふが君**：まあまあ。多分 Service Bus はマイクロソフトが出してるメッセージングサービスの一種なんだよ。それより詳しいことはまた今度でいいかな？
**ほげ君**：もうそれで十分だわ。イライラするし美味い海鮮丼食いに行こうぜ。
**ふが君**：いいよ。
Laravel Adminで日本語が文字化けして四苦八苦した話

自分で書いたLaravelは問題ないのに、Laravel Admin で日本語をpostすると文字化けされることを確認。
最初はDBに保存されるときに、文字化けされるものと探っていたが、Laravel Admin処理内で request -> all() をdumpしたところ、この段階で文字化けが発生している模様。

結果的には　mbstring.http_input　が　auto　になっていたため、変に変換されているものと思われた。
passにしたところ、正常に表示された。
Visual Studio CodeでGoのフォーマッターが動作しなかった

# はじめに
　Visual Studio CodeでGoプログラムを書くとき、フォーマッターが動作しなかった。動作をさせるまでに行った方法、調べた記事を記載する。
　様々な方法を試した結果、動作するようにはなったが、何が原因で動かなあったのかわからなかった。
　個人の作業記録として記事を残します。

# 実施したこと
1. Visual Studio Codeのsetting.jsonにgoのフォーマッタを設定。
これだけでは動かなかった。
```
  "[go]": {
    "editor.defaultFormatter": "golang.go"
  },
```

参考記事
[vscodeでgolangが自動整形されない問題](https://zenn.dev/t_morooka/articles/24ce28f4844895
)

2.Visual Studio CodeのGoの拡張機能をアンインストール、再度インストースし直した。
直らなかった。
3.GoがUbuntuにダウンロードされているか、WSLを起動して以下コマンドを叩くことで再度確認した。
```
 go version
 go env
```
4.GO111MODULE=""だったため、GO111MODULE="ON"に設定。直らなかった。
5.Visual Studio CodeのGoの拡張機能を再度インストール。
何度実施してもVSCodeが拡張機能を認識していないことに気がついた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735531/416276c7-5927-cf32-1f3c-3fe70850b116.png)


以下は試行錯誤してどの時点でフォーマッターが動作するようになったかわかりません。

6.再度VSCodeでのGoの設定を見直す。
[Qiita](https://qiita.com/Masaki7251/items/0940edb4a4cacb2252e2)
[Go 開発用に Visual Studio Code を構成する](https://docs.microsoft.com/ja-jp/azure/developer/go/configure-visual-studio-code)

7.Remote Development Extentionをダウンロード
[Visual Studio Code + WSL2でGo開発環境構築](https://qiita.com/whim0321/items/1aa2c4d0e3caaecf8a65)

8..vscode/settings.jsonにGOPATHを追加。
https://github.com/microsoft/vscode/issues/61287

9.どうしようもなくなりVSCodeをアンインストールし、再度インストールした。
[Visual Studio Codeを完全にアンインストールする(Windows)](https://dianxnao.com/visual-studio-code%E3%82%92%E5%AE%8C%E5%85%A8%E3%81%AB%E3%82%A2%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8Bwindows/)

10.gcc-5 not in PATHとエラーがでたため以下のサイトを参考に解決。
https://stackoverflow.com/questions/59227456/go-1-13-gcc-5-not-in-path

11.どこかのタイミングでVisual Studio Codeのsetting.jsonに以下の設定を追加した。
```
  "go.toolsEnvVars": {
    "GO111MODULE": "on"
  },
  "gopls": {
    "experimentalWorkspaceModule": true
  },
```

# まとめ
いつのまにかフォーマッタが動作するようになっていた。
拡張機能を入れた後などは一度VScodeを閉じる必要があると感じた。
randとshuffleメソッドを使って運勢を表示するプログラムを作る

問題
誕生日を入力すると、今日の運勢を表示してくれるプログラムを作る。
占い結果については、以下のアルゴリズムにて判定する。
必ず、メソッドを作成しそれを呼び出すように記述。

・引数として誕生日の数字を受け取る(例：4月3日なら403、11月15日なら1115と入力)
・誕生日の数字に、乱数で生成された0 ~ 9の数字のいずれかを掛け算し、その後4で割った時の余りを算出
・シャッフルした占い結果を格納した配列から、上記の数値の順番の値を取り出す
　["凶","中吉","吉", "大吉"]

自分の答え
```ruby
def divination(birthday)
    `num = rand(10)` 
calc = birthday*num%4
results=["凶","中吉","吉", "大吉"].shuffle
puts results(calc)
end

birthday=gets.to_i
divination(birth_day)
```
模範解答
```ruby
def result_of_uranai(birthday)
  results = ["凶", "中吉", "吉", "大吉"].shuffle
  num = birthday * rand(10) % 4
  puts "今日のあなたの運勢は、#{results[num]}だよ！"
end

puts "誕生日を入力してください！"

birthday = gets.to_i
result_of_uranai(birthday)
```

模範解答を確認すると、式は一つで完結しており、num = rand(10)と代入は不要。
定義する事に集中して、『puts "誕生日を入力してください！"』や、puts 『"今日のあなたの運勢は、#{results[num]}だよ！"』の文字列が不足している。

rand
指定された範囲でランダムに数値を生成することができる。
リファレンスマニュアル（https://docs.ruby-lang.org/ja/latest/method/Kernel/m/rand.html）

shuffle
配列の要素をランダムシャッフルして、その結果を配列として返す。
リファレンスマニュアル（https://docs.ruby-lang.org/ja/latest/method/Array/i/shuffle.html）
UiPath 「ワークフローファイルを呼び出し」アクティビティでxamlファイルの呼び出しが遅い

## UiPathの「ワークフローファイルを呼び出し」アクティビティでxamlファイル呼び出しを繰り返すともの凄い時間がかかる

繰り返し処理中に「ワークフローファイルを呼び出し」アクティビティでxamlファイルを呼び出すことって沢山ありますよね。
今回、この呼び出しにはすごい時間がかかることが判明し記事にしました。（UiPath 2021.10.7）
インタプリタで実行しているだろうから、多少は時間かかるのかなと想像しましたが、、、かかり過ぎです。


## ２つの繰り返し処理と実行時間

１．「ワークフローファイルを呼び出し」アクティビティを使用しない繰り返し処理
![ワークフローを呼ばないxaml.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005333/caeb0f79-7eca-5da6-8321-cff6224186a3.png)

　実行時間
　![ワークフローを呼ばない.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005333/f239d778-cede-0dee-741c-c3dc6c4e22bf.png)


２．「ワークフローファイルを呼び出し」アクティビティを使用する繰り返し処理
![ワークフローを呼び出すxaml.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005333/badcf4c0-cbf9-a0a7-0502-0a2ac4455c81.png)

　実行時間
　![ワークフローを呼び出す.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005333/d4cb21fe-3dc5-def7-33fd-116f3d4f88b1.png)


３．「ワークフローファイルを呼び出し」アクティビティで呼び出すxamlファイル
![呼び出し先のxaml.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2005333/922569f6-b851-df22-45af-400c391c46be.png)

※実行時間にかなりの差があることが分かると思います。


## 実行時間の改善

「ワークフローファイルを呼び出し」アクティビティで、xamlファイルを呼び出す回数を減らす工夫が必要かなと思いました。

例えば、引数で品番を定義したxamlファイルがあったとします。
xamlファイルでは、引数の品番に入力された社外品番を社内品番に変換し呼び出し元に返します。

一般的なプログラムではよくある実装だと思いますが、UiPathではxamlファイルの引数に配列やリストなどを定義し、呼び出されるxamlファイル側でまとめて処理するほうが良さそうです。



:::note 

 【今回のコメント】

 ・ 当初は「VBAを呼び出し」アクティビティを使用し、既存のマクロファイルで品番を一括変換するメソッドを呼び出していました。それを、繰り返し処理中に（１件だけ）品番を変換するxamlファイルを呼び出す実装に変更した際、「前のほうが早かったじゃん」ということに気づき調査してみました。

 ・ 実行時間削減の参考になれば幸いです。

:::
SONY Spresense用 6軸IMU BMI270センサーボードをSPRESENSE SDKで制御してみました

Next Step社製の **「Sony Spresense 用 6軸 加速度計・ジャイロスコープセンサ (BMI270) Addon ボード」** をVisual Studio CodeベースのSPRESENSE開発環境「SPRESENSE SDK」から制御してみました。X軸方向（SPRESENSE横方向）の傾きに合わせてSPRESENSE Main Board上のLEDが左右に揺れます。6軸IMUなので、XYZ軸方向の加速度値と、XYZ軸を中心とした回転角速度を計測できます。

![IMG_4111のコピー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2595184/0ceb4868-654e-c435-a0e9-cf531c344300.jpeg)


### 今回購入したデバイス
https://nextstep.official.ec/items/66165025

### 関連するコミット
https://github.com/shino-ixy/spresense/commit/b29d10dc26144285329810a95740e45df640aa2a

<iframe width="560" height="315" src="https://www.youtube.com/embed/VfulPr4Iz5M" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# ビルド方法

SDKコンフィグを開き「Examples」にある「bmi270_no_scu」を選択してください。SCU機能が有効の場合は正しく機能しないため、同居させるアプリケーションにご注意ください。

![スクリーンショット 2022-09-13 14.45.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2595184/1c0c1b22-4031-7cac-0329-5a083db17b00.png)
![スクリーンショット 2022-09-13 14.46.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2595184/8859a042-b4b2-d406-9f3d-ac448ccd392c.png)

# プログラムの構造

SPRESENSE SDKでは、NuttXというRTOS（リアルタイムOS）が、ハードウェアを制御してくれます。SPRESENSE Main Board上のI2Cポートは「/dev/i2c0」というファイルで表現されます。このファイルをopenしてioctlコマンドを使ってI2C通信を行い、BMI270を制御します。

### 初期化方法＆計測開始方法

BMI270の初期化方法＆計測開始方法はデータシートに記載されています。 まず、CHIPIDレジスタにアクセスし、対象のデバイスがBMI270であるかを確認します。BMI270であることが確認できた後、初期状態が不明であるため、CMDレジスタに0xB6を書き込んで、SoftResetします。このSoftResetに対してはNAKが返るため、エラーチェックは不要です。

SoftReset後、PWR_CONFレジスタに0x00を書き込みます。次に、INIT_CTRLレジスタに0x00を書き込みconfig file書き込みモードにします。config fileとはBMI270を提供するBosch社が定めた8KBのテーブルです。このテーブルデータをINIT_DATAレジスタにBurst Writeしてください。テーブルデータを書き込んだ後に、INIT_CTRLレジスタに0x01を書き込むと、テーブルデータを使ってデバイスの初期化が行われます。初期化に成功するとINTERNAL_STATUSレジスタが0x01を返します。

続いて、PWR_CTRLレジスタ、ACC_CONFレジスタ、GYR_CONFレジスタ、PWR_CONFレジスタに適切な値を代入し（データシート記載）、計測を開始します。最後に、FIFO_CONFIG_1レジスタとFIFO_CONFIG_０レジスタを使って、計測値がFIFOに蓄えられるようにすれば、計測開始です。

### 計測データの収集

BMI270のFIFOには「加速度値」と「回転角速度値」の他に「制御データ」が保存されます。また、「加速度値」と「回転角速度値」を生成するデータレート（ODR:Output-Data-Rate)を不一致にすることができるため、ある時は加速度値のみがEnqueueされ、またある時は回転角速度値がEnqueueされ、その両方が同時にEnqueueされることもある、という仕様になっています。そのため、FIFOからデータを読み出す場合は、制御データや計測データのフラグを確認しながらデータを分解する必要があります。

![スクリーンショット 2022-09-13 16.21.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2595184/54ae4417-762e-8ed7-bfad-aa429d68b970.png)

本プログラムでは、FIFOから取得したデータを分析した後、「加速度値」「回転角速度値」それぞれを格納する独立したテーブルに代入しています。最新の値が欲しい場合は、テーブル終端の値が対象の値となります。

![スクリーンショット 2022-09-13 14.19.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2595184/6d63eb53-86bd-6603-ba77-52be2bc40702.png)

# 動作の様子

水平を示すSPRESENSE Main Board上のLED（中央が点灯）。シリアルターミナルには加速度値と回転角速度値が表示されます。512回計測の後にプログラムが停止します。

![IMG_4112.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2595184/676889a7-d487-cd30-2186-fb53981c2f8c.jpeg)

是非、お試しください！
Blazor WebAssemblyでRestSharpを使ってみる（その1）

## はじめに
* 「REST API」をC#から操作するためのライブラリです。
* 「Blazor WebAssembly」では、HttpClient・HttpClientFactoryでそのまま開発もできますけど、今回は、「RestSharp」を使用します。
    * HttpClientFactoryについては、[こちら](https://blog.nnasaki.com/entry/2019/10/04/143936)の記事を確認いただけたらと思います。
 
## RestSharp
* [RestSharp](https://github.com/restsharp/RestSharp)

> 注意！！
> v107以降で記述方法が大分変更となっています。
> 現在は、V108です。

* そのため、Postmanで表示されるコードは、使用できません。
    * たぶん、Postmanの変換機能はしばらく対応されないかなぁと？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90597/747a7127-867a-6ecf-311e-5dad66fdb000.png)

## 開発環境
- Visual Studio 2022 (C#)
- [MudBlazor 6.0.9](https://github.com/MudBlazor/MudBlazor/)
- [MudBlazor/Template](https://github.com/MudBlazor/Templates)
- [RestSharp v108](https://github.com/restsharp/RestSharp)

## プロジェクト作成
* 前回の「[BlazorでApexChartsを使ってみる](https://qiita.com/HAGITAKO/items/02c6d2e38aa817e90d64)」で作成したプロジェクトを使用します。

## RestSharpの適用
* **.Client**を右クリックして、Nugetパッケージの管理 を選択
    * **RestSharp**と入力、その際、プレリリースを含めるのチェックボックスは**オフ**にする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90597/9319d31f-cb91-93db-f2b6-c725024d6b6f.png)

* 変更のプレビューは、とりあえずOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90597/40997276-2373-33ef-193e-16f45ae956a1.png)

* Program.csにRestSharpを追加
    * Blazorの場合は、**AddSingleton**の記述が必要のようです。

```diff_c_sharp:Program.cs

using ApexChartsSample.Client;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using MudBlazor.Services;
+ using RestSharp;

var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
builder.RootComponents.Add<HeadOutlet>("head::after");

builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
builder.Services.AddMudServices();
+ builder.Services.AddSingleton(new RestClient(new HttpClient()));

await builder.Build().RunAsync();
```

* 一旦、デモページのデータでRestSharpを使用するにあたって、事前設定
    * `@using RestSharp` と `@inject RestClient _restClient;` を追加します。
    * `@inject HttpClient Http` は、逆に不要となるので削除します。
    * `@inject NavigationManager _navigationManager`を追加します。

```diff_c_sharp:FetchData.razor
@page "/fetchdata"
- @inject HttpClient Http
@using ApexChartsSample.Shared

+ @using RestSharp
+ @inject RestClient _restClient
+ @inject NavigationManager _navigationManager

<PageTitle>Weather forecast</PageTitle>
```

* RestSharpは、アドレスがフルパスが必要となるので、`NavigationManager` を使って、BaseUriを取得します。

```diff_c_sharp:FetchData.razor
@code {
    private WeatherForecast[]? forecasts;

～～省略～～

    protected override async Task OnInitializedAsync()
    {
-         //forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast");
+         var url = _navigationManager.BaseUri + "WeatherForecast";
+         forecasts = await _restClient.GetJsonAsync<WeatherForecast[]>(url);

～～省略～～
    }
}
```

* HttpClientからRestSharpの取得へ変更した部分が無事、データ取得できるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90597/2636e80c-542f-f382-15a8-c2210cd6a561.png)

## 補足
* 上のままでは、あまり「使ってみる」って感じでもないので、別投稿で具体的なGetとPostの例を記載するようにします。
LinodeでCockpitを使うために、ファイアウォールの設定をしてみた

## はじめに
Linode上で構築したLinuxサーバーを可視化するために、Cockpitを使いはじめました。Cookpitは可視化の機能だけでなく、GUIでサーバーを管理できるので、初心者でも簡単にサーバー管理を始められます。Linodeはパブリックなクラウドサービスであり、インターネットを経由するため、ファイアウォールの設定もしました。

# Cockpitのインストール
LinodeのUbuntu 20.04.5 LTSにPackageからCockpitをインストールします。
```
# sudo apt update
# sudo apt install cockpit 
```
インストール完了後Cockpit を起動
```
# sudo systemctl start cockpit
# sudo systemctl status cockpit
● cockpit.service - Cockpit Web Service
     Loaded: loaded (/lib/systemd/system/cockpit.service; static; vendor preset: enabled)
     Active: active (running) since Tue 2022-09-13 05:40:26 UTC; 22s ago
TriggeredBy: ● cockpit.socket
       Docs: man:cockpit-ws(8)
    Process: 3564087 ExecStartPre=/usr/sbin/remotectl certificate --ensure --user=root --group=cockpit-ws --selinux-type= (code=exited, status=0/SUCCESS)
   Main PID: 3564090 (cockpit-tls)
      Tasks: 1 (limit: 4606)
     Memory: 1.0M
     CGroup: /system.slice/cockpit.service
             └─3564090 /usr/lib/cockpit/cockpit-tls
```
# Cockpitへのアクセス
ブラウザからhttps://example.com:9090/ 

以下はCockpitのログイン画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820036/4511e190-e3ca-49ef-9210-2729b706521d.png)


システムの状態確認、ユーザー管理、ターミナルの実行まですべて可視化できます。
![Cockpit-vis.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820036/25f0abcf-cf58-c9ea-96c0-e818c50d84be.png)

Cockpitについて詳細はCockpit公式サイトを参照してください。
https://cockpit-project.org/

### Firewallを使った管理用アクセスの制限
インターネットを経由してCockpitを利用するのはセキュリティの懸念があるので、ファイアウォールの設定をします。

固定IPアドレスからインターネット経由で利用する場合はファイアーウォールで接続元のIPを制限することが可能です。以下は、Ubuntuでデフォルト利用可能なufw（Uncomplicated Firewall）コマンドを利用したアクセスの許可です。
Cockpitはデフォルトで9090ポートを利用するので、接続元のIPから9090ポートを許可します
```
# ufw allow from xxx.xxx.xxx.xxx to any port 9090
```

LinodeはCloud Firewallを無料で利用できます。Cloud FirewallはGUIなので直感的に設定できます。複数台のLinodeインスタンスに同じファイアウォールルールを適用する際にも便利です。
https://www.linode.com/docs/products/networking/cloud-firewall/get-started/

Linodeにログイン後、「Firewalls」から設定します
![FW-Linode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820036/7b1a7398-cc23-0b0e-f96a-59e759dc478a.png)

Cockpitを利用する接続元のIP、9090ポートを許可
![linode-fw-cockpit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820036/bb27e238-eb06-3e74-44b6-935b5652a093.png)


## まとめ
Linode上でCockpitを使うことで、負荷状況の確認・サーバーの管理を実現できました。Cockpitは可視化ツールとしても活用できるので、関係者に情報共有する際にも便利です。
Linodeでは、サーバーのシステムデータをグラフ化し可視化することができる「Longview」というサービスも提供していますので、システムの負荷状況を可視化するだけであれば、Longviewを利用するのもいいと思います。

[Linode Longviewを利用してサーバーの負荷状況を可視化しよう](https://qiita.com/isss802/items/294f1b589e4882075488)


# Linodeとは

Linode (https://www.linode.com/) は Akamaiが提供するIaaS (Infrastructure as a Service) プラットフォームプロバイダーのサービスです。リノードと発音します。
Akamaiは2022年2月にLinode社の買収を発表しました。
https://www.akamai.com/ja/newsroom/press-release/akamai-to-acquire-linode
クラウドコンピューティングをよりシンプルに、手頃な価格で、誰もが利用できるようにすることで、イノベーションを加速することができます。
https://www.linode.com/ja/alternative-cloud-provider/

## 関連記事

アカマイ・テクノロジーズ合同会社のQiitaではLinode関連など開発者向けの記事を記載しております。

https://qiita.com/organizations/Akamai
pythonのsleep関数の仕様について

pythonのsleep関数の実装を行っている以下のファイルを見ると、nanosleepやclock_nanosleep関数を用いて停止を行っていることがわかります。
ここで、nanosleepやclock_nanosleep関数はC言語のtime.hにおいて定義されている関数であり、UNIXシステムコールです。

https://github.com/python/cpython/blob/main/Modules/timemodule.c

nanosleepやclock_nanosleepなどのsleep関連のシステムコールを呼び出すとはどういうことなのかを理解するために、OSのやっていることについて少し説明します。

OSの重要な仕事はスレッドにCPUをわりあてることですが、ここでOSがCPUを各スレッドに「うまく」割り当てるために、OSはスレッドの3つの状態を区別します。その3つの状態とは、
+ 実行中(Running)
+ 実行可能(Runnable,active)
+ 中断中(blocked,suspended)
です。
htopコマンドなどでスレッドの状態を確認してみるとわかりやすいです。以下の写真では、一つのスレッドがR(実行中 or 実行可能)で、他のスレッドはS(中断中)になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700770/ffc7b2e7-9143-4932-36ad-0a0021f6767e.png)

ここでsleep関連システムコールの話に戻りますが、これらのシステムコールは「呼び出したスレッドの実行をn秒間停止する」というのが基本になります。
(一応シグナル割り込みとかその他の例外の話もあるらしいですが、まだそこまで理解してないのでここでは触れません)
スレッドが停止している間は上で触れたsuspended状態になり、そのスレッドは実行されません。(CPUを使用しない)

ということは、pythonのtime.sleep関数はこのシステムコールを呼んでいるだけですので、
```
sleep(n)
```
とすると、n秒間の間そのpythonスレッドは停止状態になり、CPUは使用しない、という動作になります。

なお、システムコールの話でsleepとnanosleepというものがでてきて少し紛らわしいのですが、sleep関数は引数にintをとるため整数秒停止させます。それに対しnanosleepでは引数にtimespecというデータ型をとり、ナノ秒刻みの時間停止を行うことができます。pythonのsleep関数ではnanosleep系のシステムコールを呼んでいるため、sleep(0.01)で0.01秒止める、みたいなことも可能になります。

https://linuxjm.osdn.jp/html/LDP_man-pages/man3/sleep.3.html

https://linuxjm.osdn.jp/html/LDP_man-pages/man2/nanosleep.2.html

### 参考
http://blogs.wankuma.com/jitta/archive/2010/05/08/188819.aspx
CI/CDでS3 Hostingへ自動デプロイする


# 背景
* [CDK Pipelinesのmodern APIを使ってCDKアプリケーションをデプロイする](https://aws.amazon.com/jp/blogs/news/deploying-a-cdk-application-using-the-cdk-pipelines-modern-api/)
* AWS CDK v2がリリースされて、簡単にPipelineを実装できた
* V2とV1の変更は以下の通り
    * https://github.com/aws/aws-cdk/blob/v1-main/packages/@aws-cdk/pipelines/ORIGINAL_API.md

# ソースコードと説明

```
export class PipeLineStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const repo = Repository.fromRepositoryName(this, 'XXX', "repo_specification")

    const pipeline = new CodePipeline(this, 'DeployPipeline', {
      pipelineName: 'DeployPipeline',
      selfMutation: false,
      synth: new ShellStep('Synth', {
        input: CodePipelineSource.codeCommit(repo, 'main'),
        commands: ['cd cdk', 'npm ci', 'npm run build', 'npx cdk synth'],
        primaryOutputDirectory: 'cdk/cdk.out'
      }),
      codeBuildDefaults: {
        rolePolicy: [
          new PolicyStatement({
            actions: [
              "S3:PutObject"
            ],
            resources: ['*'],
          }),
        ],
      },
    });
 
    pipeline.addStage(new S3HostingStage(this, "S3HostingStage", WebsiteDomainName), {
      post: [
        new cdk.pipelines.ShellStep('CreateHtmlUpToS3', {
          commands: ['chmod +x build.sh', `./build.sh ${WebsiteDomainName}`]
        })
      ]
    });
  }
}
```

### CodePipeLine
* pipelineの基本設定は、このクラスに設定する
* 例えば、repositoryの導入とか


### PipeLineの自分アップデート
* cdk deployを使わなくて、デフォルトでpipelineが自分で更新できる
* selfMutation: flaseに設定して自動更新をキャンセルできる

### Synth
* 指定されるソースコードより、cloudformationのtemplate.ymlをS3へアップロードとか、codebuild準備とかをやる
* primaryOutputDirectoryでcdk.outのパスを指定できる

### codeBuildDefaultsのポリシー
* pipelineのポリシー設定は、CodePipelineのroleが
* codebuildのポリシーは、codeBuildDefaultsに設定する

### codebuild(commands)
* commands == build実行
Blazor WASM のサイズを削減してみる

# はじめに
Blazor WASM のサイズ削減に関して、手順が公式 doc でまとめられていたので、少し前に作った Blazor WASM アプリケーションが実際どうなるのかを試してみました。

# 対象としたアプリケーション
Azure の Cognitive Service をたたいてその結果を表示するだけの簡単なアプリケーションです
System.drawing ではなくて SixLabors.ImageSharpを使っていたりしますが、ほぼほぼ Blazor WASM のテンプレートプロジェクトベースのお遊びアプリです
なお、.NET は 6 です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/f4f0b29f-18b9-964b-3068-1f428b1d6c3d.png" width=70%>
※画像は Stabe Diffusion で生成したものです。ありがとうAI。

# 削減結果
もともと何もしていない素の状態だと、ブラウザ上で確認したところ、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/077151a0-ffd8-a431-714f-0ee0369448d1.png)
**3.9 MB** の転送量が発生していました。

これが、設定を少しいれるだけで、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/063921d3-9bb3-d108-58d7-d3c12855075e.png)
**3.2 MB** の転送量まで減りました。

だいたい **18%** くらいの削減ですね。正直もう少し削減できるかなと思いましたが、まぁ設定いれただけなので、標準の状態がある程度優秀ということですかね。
ただ利用シナリオによっては有意義な結果にもなりそうなので、検討して損はない感じでしょうか

# 削減ステップ
基本的に公式 doc の [Minimize app download size](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/performance?view=aspnetcore-6.0#minimize-app-download-size) を参考に以下のステップで実施しました。
※2022/9/13時点での doc を見てやりました。更新されていくと思うのでご注意を

1. ランタイムの再リンク
1. トリマーを構成する
1. ~~Lazy load assemblies~~ (サイズには関係ないので未実施)
1. ~~Compression~~ (デフォルトでやってくれるので未実施)
1. Disable unused features

以下それぞれ何をしたかのメモです。なお、リリースフォルダ自体の容量は、何もしていない場合 **97.0 MB (リリースフォルダ全体)** でした。これには各種圧縮ファイルなどが含まれていたりするのであんまり意味のない容量ですが、これがどう変わっていくかも記載します

## 1. ランタイムの再リンク
[.NET WebAssembly ビルドツール](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/tooling?view=aspnetcore-6.0&pivots=windows#net-webassembly-build-tools)をいれるだけで、やってくれます。

やったところ…
**97.0 MB (リリースフォルダ全体)** になりました。実は微増しちゃいました…残念

併せて Globalization を OFF にすると効果があるとのことなので、[インバリアントグローバリゼージョン](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/globalization-localization?view=aspnetcore-6.0&pivots=server#invariant-globalization)をみて、グローバリゼーションは不要なので、.csproj の \<PropertyGroup> に以下を追加
```XML
<InvariantGlobalization>true</InvariantGlobalization>
```
やったところ…
**84.9 MB (リリースフォルダ全体)** に。ちょっと減りましたね。

## 2. トリマーを構成する
次に[トリマーを構成する](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/host-and-deploy/configure-trimmer?view=aspnetcore-6.0)を確認して、トリミングしてみます。
これ色々と設定でいじれたりしますが、一旦は素の状態でやります。

.csproj の \<PropertyGroup> に以下を追加
```XML
<PublishTrimmed>true</PublishTrimmed>
```

やったところ…
**78.0 MB (リリースフォルダ全体)** に。これもちょっと減りました。

## 5. Disable unused features

最後に[使用しない機能を無効にする](https://docs.microsoft.com/ja-jp/aspnet/core/blazor/performance?view=aspnetcore-6.0#disable-unused-features)を見ながら、タイムゾーンも使っていないので、

.csproj の \<PropertyGroup> に以下を追加
```XML
<BlazorEnableTimeZoneSupport>false</BlazorEnableTimeZoneSupport>
```

これをしたところ…
**76.8 MB (リリースフォルダ全体)** になりました。本当に少しですが削れましたね。

# おわりに
とりあえず公式 doc に従って、特に調整せずにやった結果、3行追加するだけで、サイズ容量は 3.9 -> 3.2 MB になりました。
```XML
<PublishTrimmed>true</PublishTrimmed>
<InvariantGlobalization>true</InvariantGlobalization>
<BlazorEnableTimeZoneSupport>false</BlazorEnableTimeZoneSupport>
```
もっと削れるところをゴリゴリやることもできそうですが、お手軽にできる3行だけでもそれなりの削減効果にはなったのかなぁと。ただグローバリゼーションとかタイムゾーンとか使ってたら要注意ですが。

Blazor の WASM は WASM としてとっても開発しやすいので、これが .NET7 とかで今後さらにサイズが減っていくと良いなぁ
SQL Serve 2019 で廃止された機能 #MSSQL #SQLServer2019

# SQL Serve 2019 で廃止された機能

## SQL Server 2019 (15.x) で廃止された機能
* 参考URL
  * https://docs.microsoft.com/ja-jp/sql/database-engine/discontinued-database-engine-functionality-in-sql-server?view=sql-server-ver16#discontinued-features-in--1
### 内容
* 次のデータベース スコープの構成オプションは廃止されました。
```
DISABLE_BATCH_MODE_ADAPTIVE_JOIN
DISABLE_BATCH_MODE_MEMORY_GRANT_FEEDBACK
DISABLE_INTERLEAVED_EXECUTION_TVF
```

## SQL Server 2019 (15.x) で廃止されたデータベース エンジン機能
* 参考URL
  * https://docs.microsoft.com/ja-jp/sql/database-engine/deprecated-database-engine-features-in-sql-server-2019?view=sql-server-ver16
### 内容
* 新しく非推奨に加わった機能はありません。

## SQL Server 2019 (15.x) のデータベース エンジンへの重大な変更
* 参考URL
  * https://docs.microsoft.com/ja-jp/sql/database-engine/breaking-changes-to-database-engine-features-in-sql-server-2019?view=sql-server-ver16

### 内容
* 重大な変更は導入されていません。
英語を作る４つの要素

英文は、主語+動詞+目的語or補語の順序で組み立てられている。

# 英文の要素
## 主語
```
　I play the guitar.
```
```I```が主語にあたる。
```〜は```、```〜が```にあたる語が主語です。

## 動詞
```
You have many books.
You are busy.
```
日本語にしたときに〜するや＝にあたる
```have　持っている```　、```are　「＝」```にあたる語が動詞

## 目的語
```
I play the guitar.
You have many books.
```
```~を```、```~に```にあたる語（語句)が目的語
```the guitar ギターを```、```many books たくさんの本を```がそれにあたる。

## 補語
```
She is beautiful.
```
```動詞を挟んで主語とイコール```になる語が補語。

# 文の要素に対応する品詞
```
I play the guitar.
```
左から主語(I)、動詞(play)、目的語(the guitar)の品詞に分けることができる。

この品詞をまだ分解できる。

代名詞（I)、動詞(play)、冠詞(the)、名詞（guitar)
に分けることができる。

```I```は文の要素では主語になるが、```単語の品詞では代名詞```になる。

目的語も冠詞と名詞に分けることができる。

# 気づき
今までの知識で知っている。
しかし要素という言葉は知らなかった。
これから英語のテキストを使う上で要素や品詞のことを知っていることは無駄じゃないと思うのであえて勉強した。

# 出典　

https://kanki-pub.co.jp/pub/book/details/9784761230227
ビルゲイツの本を読んで

# はじめに

### [ビル・ゲイツの思考哲学](https://www.amazon.co.jp/THINK-LIKE-Bill-Gates-%E3%83%93%E3%83%AB%E3%83%BB%E3%82%B2%E3%82%A4%E3%83%84%E3%81%AE%E6%80%9D%E8%80%83%E5%93%B2%E5%AD%A6/dp/4866515414)
[![book_cover.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/858c693e-000c-8b66-024d-f7dd7b19d146.jpeg)](https://www.amazon.co.jp/THINK-LIKE-Bill-Gates-%E3%83%93%E3%83%AB%E3%83%BB%E3%82%B2%E3%82%A4%E3%83%84%E3%81%AE%E6%80%9D%E8%80%83%E5%93%B2%E5%AD%A6/dp/4866515414)

世界的に有名なIT企業の創業者はどのような思考なのだろうと興味を持ち、この本を読んだ。
どんな本だったか、自分のキャリアや人生にどう活かせるかを述べていく。

# 本の内容

ビルゲイツがどういう人物で、どういう思考回路なのかが書かれている。

#### 生い立ち
* 好奇心が旺盛で何事にも興味を示す
* 戦略的なゲーム(トランプ/チェス/囲碁)が好きで、些細なことでも勝ちにこだわる

#### 学生時代
* 興味のある分野は優秀だが、興味のない分野は授業をさぼる
* 自分の能力を補うパートナーと手を組む
* 学生のうちから金を稼ぐ方法を模索する
* 事業に専念するためハーバード大学を中退する

#### ビジネス
* 新しく壮大な挑戦を続ける
* 物事の判断時は徹底的に思慮するが、判断後は再び思慮を行わない
* 時には既存のアイディアを改良する

#### その他
* 異業種の人と関わりを持つ
* 膨大な富を得た後は慈善活動にも力を入れる

# 読み終えて感じたこと
自分が一番印象深かった点は、好奇心旺盛であるというところ。
現在の私は、興味のあることを我慢し、興味のないことに時間を費やすことが多くなっていた。
今後は、**好奇心を殺さない**ことを心にとどめながら生活して生きたい。
Railsのsendメソッドを使うとどう便利になるのか

## 環境
Rails 5.2
Ruby 2.6
Ubuntu 20.4

## 記事
テーブルのカラム名を引用するとき、Railsのsendメソッドを使うとシンプルに記述することができます。
```user_controller.rb
	@user = User.all
	User.test(@user)
```

sendメソッドを使わないときの書き方です。全カラムの先頭に、userを付ける必要があります。userの記述が冗長で、カラムの数が多くなる程、煩わしくなってきます。
```user.rb
def test(user)
	user.each do |user|
        ary = []
        ary << user.id
        ary << user.name
        ary << user.addr
        puts ary
    end
end
```

処理結果です。
```
[1, "tan", "米原市"]
[2, "pon", "長浜市"]
[3, "mii", "近江八幡市"]
```

sendメソッドを使ったときの書き方です。userはsendの先頭に１個つけるだけです。これで冗長さを軽減させることができました。
```user.rb
def test(user)
	user.each do |user|
        ary = ["id", "name", "addr"].map { |var| user.send(var) }
        puts ary
    end
end
```

sendを使うとカラムの配列を別メソッドにして、独立して記述することもできます。カラムの数が多い場合、別メソッドにした方が、後からカラムが増えた場合、メンテナンス性が増すかと思います。また、別の処理に流用することもできるといった利点もあります。別の処理に流用できると、カラムが増えた場合、１か所を変更しただけで済むということになります。
```user.rb
def attributes
     ["id", "name", "addr"]
end

def test(user)
	user.each do |user|
        ary = attributes.map { |var| user.send(var) }
        puts ary
    end
end
```
【UE5】そのUObjectがCDOかどうかを調べる

:::note info
確認したバージョンはUE5.0.3です。
:::

よく忘れる上に、ググってもなかなか出てこないので自分メモ。

```C++
UMyActorComponent::UMyActorComponent(const FObjectInitializer& InObjectInitializer)
    : Super(InObjectInitializer)
{
    // CDOじゃない場合だけデリゲートを追加する (例)
    if (/*not*/!HasAnyFlags(RF_ClassDefaultObject))
    {
        OnComponentActivated.AddUObject(this, &UMyActorComponent::OnActivated);
        // 注：これはあくまでもサンプル。
        // デリゲートを追加するなら、コンストラクタより InitializeComponent()などでやるべき。
    }

    // RF_ArchtypeObjectとのORで判定している例もある
    if (/*not*/!HasAnyFlags(RF_ClassDefaultObject | RF_ArchetypeObject))
    {
        // 省略
    }
}
```

以下、[公式ドキュメントのEObjectFlags](https://docs.unrealengine.com/4.27/en-US/API/Runtime/CoreUObject/UObject/EObjectFlags/)より

<dl>
<dt>RF_ClassDefaultObject</dt>
<dd>このオブジェクトはクラスデフォルトオブジェクト(CDO)である。</dd>
<dt>RF_ArchetypeObject</dt>
<dd>このクラスオブジェクトは他のオブジェクトのためのテンプレートである。CDOのように取り扱われる。
</dl>

:::note warn
【2023/08/07 追記】UObjectBaseUtility::IsTemplate()を使うと一発で判定できる。
```C++
    // HasAnyFlags(RF_ClassDefaultObject | RF_ArchetypeObject)とほぼ同じ
    if (/*not*/!IsTemplate())
    {
        // 省略
    }
```
:::
Laravel環境構築

# はじめに
この記事は、Cloud9でLaravelを用いてwebアプリを開発するためにLaravelの環境構築の方法を書いたものです。

# Composerのインストール
ComposerとはPHPのプロジェクトが必要とするライブラリやパッケージを管理する「ライブラリ依存管理ツール」です。Composerの便利な点としては必要なパッケージを列挙すると自動でインストールしてくれる上に、パッケージ間の依存関係を解決してくれます。
それでは早速Composerをインストールしていきましょう。
```
# Composerのインストーラーをインターネットから取得と実行
$ curl -sS https://getcomposer.org/installer | php
→ Composer (version 2.4.1) successfully installed to: /home/ec2-user/environment/composer.phar
この文が表示されていたらOK

# インストーラー実行により作成されたComposer本体をコマンドとして認識させるために特定のディレクトリに移動
$ sudo mv composer.phar /usr/local/bin/composer

# 動作確認
$ Composer
```
![スクリーンショット 2022-09-13 14.35.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821384/c8b19397-688b-6406-0090-877f13d3220a.png)
このような表示がされれば正しくインストールできています。

# Laravelプロジェクト作成
先ほどインストールしたComposerを使ってlaravelをインストールしましょう。
```
# Composerコマンドでdevディレクトリ内にlaravelプロジェクト作成
$ composer create-project laravel/laravel --prefer-dist blog "6.*"
→ 今回はlaravelのバージョン6を使用する。(コマンド最後の数字を変えることでバージョンを変更可)

# プロジェクトのバージョン確認
$ cd dev/
$ php artisan --version
```
# Laravelアプリケーションの動作確認
ここまででLaravelの環境構築は終了したので、アプリケーションを実行してみましょう。
```
$ cd dev/
$ php artisan serve --port=8080
```
このような画面が表示されれば大丈夫です。
![スクリーンショット 2022-09-13 15.08.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821384/a4dc61dd-ecc6-f70b-5982-2f48ade07328.png)
(C言語)『関数へのポインタ』と『typedefを使った，関数へのポインタ定義』を解説！

(修正) 関数の引数を空白からvoidにしました！
ご指摘していただきありがとうございます．


# 前書き

[12 ステップで作る組込みOS自作入門　(著者：坂井 弘亮, 発行年：2010年, 出版社：カットシステム)](http://www.cutt.co.jp/book/978-4-87783-239-1.html)を読ませていただいてます．
この本の7章で，**関数へのポインタ**という技術が使用されました．
私は，ここで初めて**関数へのポインタ**というものを知り，調べることになりました．
調べてみて，得た知識を共有したいと思い，この記事を投稿させていただきます．

# 概要

この記事では，C言語における，
・ [関数へのポインタ](#関数へのポインタ)
・ [typedefを使った，関数へのポインタ定義](#typedefを使った，関数へのポインタ定義)

の2つを解説，使い方を紹介しています．

サンプルコードがございますので，
実際に動かしてみて理解を深めていただけると幸いです．

また，この記事に誤植がある場合，
お手数ですがコメントで指摘していただけると幸いです．

# 対象読者

・ 関数へのポインタ
・ typedefを使った，関数へのポインタ定義

について学びたい人．

・C言語の変数のポインタについてある程度理解している人
(変数のポインタがわからないとかなり難しいかも...)

# 関数へのポインタ

関数へのポインタは，変数へのポインタと同じようなものです．

<br>

`関数へのポインタf`を定義したいなら，
```c:
void (*f)(void); //返り値なし，引数なし
```
となります．[^1]
[^1]:コメントのご指摘の通り，
引数をvoidにすることで，コンパイラに引数はないことを教えてあげないといけません．
引数が空白の場合，関数呼び出し時に値を渡しても，コンパイルはエラーを出してはくれません！
引数がvoidなら，コンパイルはちゃんとエラーを出してくれます！



`関数へのポインタf`は，返り値なし，引数なしなので，
返り値なし，引数なしの関数を受け取ることができます．
**返り値と引数は一致していないといけません．** [^2]

[^2]: 試してみたところ，
引数は一致してないとコンパイルエラーになりましたが，
返り値は一致してなくてもコンパイルエラーになりませんでした．
しかし警告は出たので，やはり一致させなくてはいけないと思います．

わかりにくいので，実際にプログラムを見てみましょう．
使い方は以下のようになります．

```c:main.c
#include "stdio.h"

// 関数ポインタfに渡す関数
void show(void) // 返り値なし，引数なし
{
    printf("Hello, World\n");
}

// 関数ポインタfを定義
void (*f)(void); //返り値なし，引数なし

int main(void)
{
    //関数ポインタfに，show関数のポインタを渡す
    //返り値なし，引数なしが一致している．
    f = show;
    f(); //関数ポインタfを使うとshow関数と同じ動作をする

    return 0;
}
```

実行すると，このような結果になります．

```
Hello, World
```

# typedefを使った，関数へのポインタ定義

```c:
typedef void (*func)(void);
func f;
```
このような書き方をした場合，
1行目で，`func型`は返り値なし，引数なしの関数型と定義されます．
2行目で，`func型`の`関数へのポインタf`が宣言されます．

わかりにくいので，実際にプログラムを見てみましょう．
以下のプログラムを見てください．

```c:main.c
#include "stdio.h"

// 関数ポインタfに渡す関数
void show(void) // 返り値なし，引数なし
{
    printf("Hello, World\n");
}

// 関数ポインタ型funcをtypedef定義
typedef void (*func)(void); //返り値なし，引数なし

int main(void)
{
    //関数ポインタ型funcから関数ポインタfを定義する．
    func f;
    //関数ポインタfにshow関数のポインタを渡す．
    //返り値なし，引数なしが一致している．
    f = show;
    f(); //関数ポインタfを使うとshow関数の動作をする

    return 0;
}

```

# 応用例

せっかくなので，
返り値がint型，引数が2個で両方ともint型の
サンプルプログラムを載せます．<br>

このときもやはり，引数と返り値を一致させなくてはいけません．[^2]

```c:main.c
#include "stdio.h"

// 関数ポインタfに渡す関数
int add(int a, int b) // 返り値int，引数int, int
{
    return a+b;
}

// 関数ポインタ型funcをtypedef定義
typedef int (*func)(int, int); // 返り値int，引数int, int

int main(void)
{    
    int a = 3, b = 5;

    //関数ポインタ型funcから関数ポインタfを定義する．
    func f;
    //関数ポインタfにadd関数のポインタを渡す．
    f = add;

    // 関数ポインタfをadd関数のように使う．
    printf("%d+%d=%d\n", a, b, f(a, b));

    return 0;
}

```

# 最後に

ここまで見てくださりありがとうございました！
コピペでスクレイピング① selenium でページソースを取得 

# はじめに

WEBサイトをスクレイピングするとき、selenium(Python)でよく使っているもののメモ
動作環境：Windows11 Python3.8
モジュール: selenium, webdriver-manager(ver3.5.4)

# 指定したURLのページソース全体を取得する

```python
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
# seleniumをヘッドレスで起動、webdriverは自動取得、ブラウザはGoogleChrome
# 引数はURL、返り値はページソース

def source_code_get(url):
    # オプション設定
    options = webdriver.ChromeOptions()
    
    # ↓　ヘッドレスモードで起動するオプション
    options.add_argument("--headless")
    # webdriverの自動更新
    driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
    
    # 暗黙的待機
    driver.implicitly_wait(60)
    
    driver.get(url)
    source_code = driver.page_source
    driver.quit()
    return source_code



# 【動作テスト】
if __name__ == '__main__':
    # キーワードでURLクエリ生成
    keyword = 'python'
    url = f'https://www.google.co.jp/search?q={keyword}'
    # ページソース抽出
    source_code = source_code_get(url)
    print(source_code)
```
seleniumでスクレイピングを行うガイドには良くChromedriverをインストールして
ドライバーのpathを指定し、ブラウザを操作するような使用法が紹介されていますが、
その方法を使うと、ブラウザのバージョンがアップデートされると利用できなくなるため、Chromedriverは自動的にアップデートされるようにするのが合理的です。
そこでwibdriver-namegerというモジュールを導入し、自動アップデートを実現します。
```python
# ↓　ヘッドレスモードで起動するオプション
    options.add_argument("--headless")
```
・ブラウザのヘッドレス起動
オプションを”--headress”に指定することにより、ブラウザ画面が開かずに動作させることができます。
ブラウザが起動した状態にしたい場合は、コメントアウトするだけでOKです。

・暗黙的待機
指定したページソースが読み込まれるまで次の動作を待機します。
すぐに読み込まれれば次の動作へ移行します。パラメーターが60になっているので最大60秒待機します。



### webdriver-manager インストール
```python
pip install webdriver-manager == 3.5.4
```
webdriver-managerをインポートすることにより、この場合、Chromedriverを自身でダウンロードして配置しなくても自動でインストールとアップデートによる更新を自動で行ってくれます。


【ハマったとこ】
Pythonのバージョンによっては、最新のwevdriver-managerをインストールするとエラーは出ないのに動かない現象がありました。その場合はバージョンを過去分に戻してみるといいです。
上記のバージョンも自分の環境で使用できた過去のバージョンを敢えて使っています。

# 関数化
```python
if __name__ == '__main__':
    # キーワードでURLクエリ生成
    keyword = 'python'
    url = f'https://www.google.co.jp/search?q={keyword}'
    # ページソース抽出
    source_code = source_code_get(url)
    print(source_code)
```
関数化して手早くソースコードが取得できるようにします。
上記コードの場合、google検索にキーワードを入れ、ターゲットとするURLを作成、
出来たURLを作った関数の引数に代入するとソースコードが取り出せます。

取り出せたコードはそのままBeautifulsoupなどで要素を取り出せます。
ここまではどのスクレイピングでも行う事ですので関数化しておくと便利です。


次回、[コピペでスクレイピング② クラウドワークスの新着情報を収集](https://qiita.com/Gen2423/items/6a300adb5867970c9f77)　へ続きます
【Rails チュートリアル】AWS Cloud9でRails Serverが起動できないときの対処法【個人的なメモ】

# やりたいこと

・AWS Cloud9で「Rails Server」を起動したい

# エラー内容

ターミナルでRails Serverを実行したが下記のエラーが出てサーバーが起動しなかった。

```ruby
Cannot render console from 000.000.00.000! Allowed networks: 127.0.0.0/127.255.255.255, ::1
```
※「000.000.00.000」はIPアドレス

# 調査

・「Rills Cannot render console from」で検索した

・config/environments/development.rb に下記を追加した


```ruby
Rails.application.configure do

config.web_console.permissions = '000.000.00.000’

end
```
※「000.000.00.000」はIPアドレスなのでターミナルのエラー文で出たアドレスをコピーする

結果として「Cannot render console from~」は消えたがRails Serverは起動しなかった。

参考：
**[解決済み] Railsで「Cannot Render Console from...」を無効化する方法**
[https://www.binarydevelop.com/article/railscannot-render-console-from-65742](https://www.binarydevelop.com/article/railscannot-render-console-from-65742)

# 原因

ブラウザのCookieをすべて無効化していた。
![20220913_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2844306/c5aa3d0b-b505-633d-f3bd-ce5489ef148e.jpeg)
※Brave


参考：
**AWS Cloud9における「Oops VFS connection does not exist」というエラーと解決策について**
[https://qiita.com/okjkit/items/94e71c927c19028fb5f7](https://qiita.com/okjkit/items/94e71c927c19028fb5f7)

# 解決策

ブラウザのCookieを有効化すると問題なくRails Serverが起動できた。
![20220913_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2844306/a1dba3a3-1841-c622-7f2c-ac4eff55c7d8.jpeg)
↓
![20220913.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2844306/ab462bd9-d2ae-cacd-36f0-94165c2c87f1.jpeg)
Asciidocから変換されるHTMLをS3 Hostingに自動デプロイする

# 背景
* プロジェクトリリース前に、色々なユーザガイドなどを公開しないといけない
* wordを書いてPDFに変更することが面倒
* PDFの読むことはダウンロードの前提になってしまう

# 概要
* 標準ドキュメントAsciidocを作って、PDFやHTMLへ簡単に変換できる
* AWS S3 Hosting機能を利用して速めにドキュメントを公開できる

# 詳細
## Asciidocとは
* [AsciiDoc](https://ja.wikipedia.org/wiki/AsciiDoc)
* [Asciidoctor 文法クイックリファレンス\(日本語訳\)](https://takumon.github.io/asciidoc-syntax-quick-reference-japanese-translation/)


## AsciidocからPDFやHTMLへ変換する方法
* asciidoc gem packageをインストールして簡単に変換できる

```
gem install asciidoctor
gem install asciidoctor-pdf
```

```
asciidoctor procedure/document_source.adoc -o dest/document_dest.html
```

## openapi yamlファイルからHTMLへ変換する方法
* openapi-generator-cliでopenapi yamlファイルからAsciidocへ変換できる

```
openapi-generator-cli generate -i api/document_source.yaml -g asciidoc -o temp
asciidoctor temp/index.adoc -o dest/document_dest.html
```

## S3 Hosting作成
* template.ymlで速めに作成できる

```
# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------# 
Parameters:
  WebsiteDomainName:
    Type: String

Resources:
# ------------------------------------------------------------#
#  S3 Bucket
# ------------------------------------------------------------#        
# Bucket
  Bucket:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: !Ref WebsiteDomainName
      AccessControl: PublicRead
      WebsiteConfiguration:
        IndexDocument: index.html

  BucketPolicy:
    Type: "AWS::S3::BucketPolicy"
    Properties:
      Bucket: !Ref Bucket
      PolicyDocument:
        Statement:
        - Action: "s3:GetObject"
          Effect: Allow
          Resource: !Sub "arn:aws:s3:::${Bucket}/*"
          Principal: '*'
          Condition: 
            IpAddress: 
              "aws:SourceIp": 
                - "xxx.xxx.xxx.xxx/xx"
```


## codebuildでデプロイする

```
 version: 0.2
	 
 phases:
   install:
     on-failure: ABORT
     runtime-versions:
       nodejs: latest
       ruby: latest
     commands:
       - npm install @openapitools/openapi-generator-cli -g
       - gem install asciidoctor
       - gem install asciidoctor-pdf
 
   build:
     commands:
       - openapi-generator-cli generate -i api/document_source.yaml -g asciidoc -o temp
       - asciidoctor temp/index.adoc -o dest/document_dest.html
       - asciidoctor procedure/document_source.adoc -o dest/document_dest.html
       - cp -rp procedure/images/. dest/images/.
 
   post_build:
     commands:
       - aws s3 sync --exact-timestamps ./dest/ s3://WebsiteDomainName/ --exclude ".*"
```
VSCodeでインポート文を保存時に自動整形する

VSCodeで右クリックから`sort import`を選択しなくても保存時に自動で整形する設定方法。

## 結論

設定ファイル（JSON）に以下を追加。

```json
"editor.codeActionsOnSave": {
		"source.organizeImports": true
	}
```
【Xcode】一括リネームする方法

# はじめに
私はいままでリネームをする際に1つ1つ手動で変えていました。
一括でリネームする方法があると教えていただいたのでやり方を記録しておきます。

# 方法
リネームの対象を選択します。
![スクリーンショット 2022-09-13 14.18.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/0db35fa1-b905-d8e4-95ee-da5f44010793.png)

右クリックでメニューを表示させます。
「Refactor」の中の「Rename...」を選択します。
![スクリーンショット 2022-09-13 14.31.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/52bdf04a-d57c-ac7f-d234-d6a943d35d56.png)

変更が完了したら右上の「Rename」を選択します。
![スクリーンショット 2022-09-13 14.33.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/455a4e48-ff5f-5c6b-46e4-3335702ea2a9.png)

おわり！！！！

# おわり
Xcodeの機能をうまく使うことで時短できますね！
WordPress Certified by Bitnami and Automattic でのSSHユーザーの注意点

WordPressをEC2で構築する際にMarketplaceにて
WordPress Certified by Bitnami and Automatticを使用した。

通常のEC2を起動し、sshする際はec2-userにてデフォルトでsshすることになるが、WordPress Certified by Bitnami and Automatticのマシーンイメージを使用した際はデフォルトでbitnamiユーザにてsshすることになる。

**コマンド**
```
ssh -i XXXXXXX.pem(鍵指定) bitnami@XXX.XXX.XXX.XXX
```


いつも通りec2-userにてsshしようと試行し少し悩んだ。
メールを転送してAsanaのタスクに変換

## Email tasks to Asana
タスクをプロジェクトボードにメールで送信する
メールを送信して、任意の Asana プロジェクトで直接タスクを作成できます。

Asanaのすべてのプロジェクトには、そのプロジェクトでタスクを作成するために使用できる一意のメール アドレスがあります。
![Screen Shot 2022-09-13 at 13.28.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475245/26fd270e-28f1-fe87-f32b-39701c3996e5.png)

#### プロジェクトのメール アドレスを見つける
* プロジェクト名の横にあるドロップダウン矢印をクリックする

* [インポート] をクリックし、[メール] を選択する
* import->Email -> こんな感じもメールアドレスが表示されます。

```
x+projectID@mail.asana.com
```
例：x+123@mail.asana.com

## GmailからAsanaへメールの自動転送設定・実際のタスク追加確認

Gmailの設定画面の　→　Filters and blocked addresses　タブをから全部設定できます！
* 画面の一番下からにある、「Create a new filter」新規メールフィルターを作成する
![Screen Shot 2022-09-13 at 13.48.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475245/b15dde6e-3020-f5b6-3dd6-3994136656a9.png)

* キャッチアップしたい情報を上記↑フィルター作成とき入れて、Create filter押す
* 次の画面で自動メール転送のメールアドレスを選択して、create filterを押して完了です。
![Screen Shot 2022-09-13 at 13.54.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475245/8f9f7646-85a9-e55f-270d-42765138b478.png)
* メール転送一覧にAsanaのアドレス表示されない場合、右側に出ているAdd forwarding addressから追加できます。

* GmailからAsanaへの自動タスク追加の確認
上記の設定終わったら、作成したメールフィルターの内容にヒットしたメールAsanaのタスクに追加されます。
Asana PJのボードに入ってタスク追加などを確認できます！

あとは、Asanaのカスタムルールを色々いじって、Slackに自動送信、チャネルなどに通知することも可能です。
![combine_images.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475245/b51fdbf3-6697-177c-ad73-21505cc6b0de.png)



#### 参考：
official Asana  Guide↓
[Email tasks to Asana](https://asana.com/guide/help/email/email-to-asana#gl-forwarding)
gnuplot: 円、塗りつぶし

本稿は「gnuplotで、塗りつぶされた円を描きたい」人用である。
目標は下図のような感じ。
![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743363/0cf47c47-8d7e-169a-88fa-027e5238a990.png "例")

# 結論
```
set obj circle at x座標,y座標 fc rgb "色" size 描画する座標系での半径 fs solid
```
を使う。実際には、
```
set obj circle at 1,1 fc rgb "black" size 1 fs solid
```
という感じ。この場合、(1,1)に半径1の黒塗りの円が描ける。
プログラム中で下側にあるほど上位に来るため、円を重ねることができる（重なってしまう）。

## 詳細
fc: "fillcolor"
fs: "fillstyle"、solidなら塗りつぶし


# 参考
http://takeno.iee.niit.ac.jp/~foo/gp-jman/data/20150106/gnuplot-ja-div/node271.html

http://takeno.iee.niit.ac.jp/~foo/gp-jman/data/20161012/gnuplot-ja-div/node278.html

http://takeno.iee.niit.ac.jp/~foo/gp-jman/data/20160223/gnuplot-ja-div/node319.html

# おまけ
先程の図は以下のコードで書ける。
```
set output "aaa.png"
set term png
set xlabel "x"
set ylabel "y"
set xrange [-5:5]
set yrange [-5:5]
set size ratio 1
set xlabel font ",20" offset 0,-1.3
set ylabel font ",25" offset -1.3,0
set xtics font ",20" offset 0,-0.4
set ytics font ",20"
set key font ",18"
set bmargin 5
unset key

###ここが大事
set obj circle at 1,1 fc rgb "black" size 1 fs solid
set obj circle at 1,3 fc rgb "blue" size 0.6 fs solid
set obj circle at -1.3,3 fc rgb "black" size 1 fs solid
set obj circle at 1,3 fc rgb "green" size 0.3 fs solid

f(x)=x**3
plot f(x) t "y=x^3"
```
.htaccessのリダイレクトと除外条件でドツボにハマった話（備忘録）

## きっかけ
お客様から、サイトの閉鎖にともなうリダイレクトの設定の要望があった。
要件は閉鎖するサイトAのすべてのページへのアクセスをサイトBのトップページにリダイレクトする。というもの。
ただし、これには隠れ要件があって、一部のディレクトリへのアクセスを除外しなくてはいけない。
サーバ周り初心者の私にはこれが結構曲者でした。

### まずは
.htaccessを使ったリダイレクトは該当サイトで結構やっていて、「まあ今回も RedirectMatch　～　って書けばいけるやろ」と思っていた。最初は。
なので、該当ディレクトリ直下の.htacccessにこんな感じに書いてみたものの、思うように動作しない。

```
RewriteCond %{REQUEST_URI} !(^/除外するディレクトリパス/)
RedirectMatch permanent ^(.*)$ https://testsite/
```
リダイレクト自体は成功しているものの、除外条件がうまく動作せず、すべてのアクセスがサイトBにリダイレクトされてしまう。
色々試行錯誤してみたものの、何回試してもRewriteCondがうまく働いてないっぽい。

そもそもこれ本当にリダイレクトになってる？？？？
…大変疑わしくなってきた。

そこでこんな記事を見つけて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670069/6d0a8861-b706-b7e8-5a80-2546dc0357a5.png)


そこで該当ディレクトリ直下の.htacccessには最終的にこんな形で冒頭部に追記。
なんとかかんとか要望通りの挙動を実現することができました。

```
RewriteEngine On
RewriteCond %{REQUEST_URI} !(^/除外するディレクトリパス/)
RewriteRule ^(.*)$ https://testsite/ [R=302,L]
```


参考
https://www.javadrive.jp/apache/htaccess/index4.html#section1_4
Kotlinのメリット

# はじめに
個人的にKotlinが便利に感じる点を紹介。他言語にも存在する点もあるが、それに関しては割愛。

Kotlinのメリットの概要に関しては、ここに書いてある。

https://developer.android.com/kotlin

# メソッドが豊富
Kotlinには便利なメソッドがたくさんあるが、ここでは一例を紹介。

#### 型変換が簡単
主に使うのは`toString` `toInt` `toFloat` `toList` `toArray`など。
```Kotlin
val a = 1.toString()
```

#### リストの扱いが簡単
リストの順序を`reversed`で簡単に逆転できる。
```Kotlin
val list = listOf(1, 2, 3).reversed()
```
`map`を使えば`Int`リストを`String`リストに簡単にできる。
```Kotlin
val list = listOf(1, 2, 3).map { it.toString() }
```
他にも`forEach` `first` `last` `contains`など、よく使うリスト関連のメソッドはたくさんある。

# 式中で条件分岐ができる
式中で条件分岐ができるので、余計な変数を定義しなくて済む。

`if`の例
```Kotlin
val b = true
val a = 1 + if(b) 2 else 3
```

`when`の例
```Kotlin
val pos = "left"
val num = 2 + when(pos){
    "left" -> -1
    "right" -> 1
    else -> 0
}
```

# エラーが起こりにくい
`null`の扱いが厳密なので、エラーが発生しにくくなっている。変数定義時、`?`がついていたらnull許容。
使い分けの例として、任意項目はnull許容、必須項目はnull許容しないようにする。

```Kotlin
var a: Int? = 0  //null許容
var b: Int = 0   //null許容しない
```

メソッドの引数、戻り値にもnull許容指定が可能。
```Kotlin
/**
 * @param a null許容しない
 * @param b null許容
 */
fun sample(a: Int, b: Int?) {
}
```

# おわりに
KotlinはC++やJavaよりも書きやすく感じた。