OmniAICreator/Qiita-1.07M huggingface dataset:
Databricksのプロジェクトdbignite：患者分析における相互運用性

[Project dbignite: Interoperability for Patient Analytics \- The Databricks Blog](https://www.databricks.com/blog/2022/10/20/project-dbignite-interoperability-patient-analytics.html)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

Centers for Medicaid & Medicare Services (CMS)によって制定された相互運用性のポリシーは、2021年にアメリカで効力を発揮し始めており、支払者、医療提供者、患者間において医療情報や管理情報がどの様に交換されるのかに変化を引き起こしました。

このポリシーにおいて、CMSは非営利のANSI認証の標準である[Health Level Seven \(HL7\) International](https://info.hl7.org/learn-more?utm_term=hl7%20international&utm_campaign=HL7+Fall+2021+Main+Campaign&utm_source=adwords&utm_medium=ppc&hsa_acc=9336606441&hsa_cam=15232757183&hsa_grp=132594963834&hsa_ad=560613873088&hsa_src=g&hsa_tgt=kwd-1463875076530&hsa_kw=hl7%20international&hsa_mt=p&hsa_net=adwords&hsa_ver=3&gclid=Cj0KCQjw94WZBhDtARIsAKxWG-8SGBwpLbMJf1teggAsOsmVMdGmOMB3fiD5ElIbPrnnY3ZcyrCc-6MaAnouEALw_wcB)標準を導入し、電子健康情報の交換、インテグレーション、共有、収集のための包括的なフレームワークや関連標準を提供することに特化している組織を進展させています。最近のポリシーにおけるこれらの標準の最も重要な点は、FHIR(「fire」と発音します)としてよく知られている[Fast Healthcare Interoperability Resources](https://fhir.org/)です。FHIRは比較的新しい仕様であり、診察、管理、財務の様なドメインにまたがるリソースの上に構築されています[^1]。FHIRバンドルやリソースのコレクションは、患者の経年記録を表現することができます。

CMSが進むに従い、商用のヘルスプランもそれに追従しています。さらに、FHIRは多くの国や医療機関が導入したグローバルの標準となっています。この結果、ヘルスケア組織の間で、これまで以上に多くのデータが共有される様になっています。業界としては、これまで以上に患者の360度のビューを得られる様になりました。そして、これらのデータをアクション可能な分析に翻訳するにはまだ遠い道のりが存在しています。それはなぜでしょうか？

FHIRはヘルスケア情報を交換するための標準フォーマットの確立に関する課題を解決しましたが、これは分析のために設計されたものではありませんでした。

FHIRバンドルを操作する際には以下の課題が存在しています。

1. 経年分析のためにFHIR(多くの場合JSONフォーマットでシリアライズされます)をテーブルに変換
1. 患者の健康状態に対する動的な特性を反映させるための、ストリーミング、リアルタイムデータのサポート
1. FHIRと非構造化データ、その他の構造化データモデル、これらのバンドル外の一般的なデータモデルとの結合
1. 高度な分析や機械学習ツールとデータの接続

Databricksのプロジェクトdbigniteは、これらの課題に対応するために開発されたオープンソースのツールキットであり、レイクハウスを用いることで効率的にトランザクションのバンドルを大規模な患者分析に変換します。

このライブラリは、これらのバンドルからリソースを容易に抽出し、結果のテーブルを以下の動画で示している様にすぐにシンプルなSQL文でクエリーができるDatabricks SQLのデータベースに格納する様に設計されています。

[^1]: https://www.hl7.org/fhir/overview.html

**以下のリンクをクリックすると別タブで動画が再生されます**

https://player.vimeo.com/video/760040439?h=69bce6ad75&version=hd1080

FHIRバンドルからの情報は、事前承認の自動化や予測ケア管理に至るユースケースをサポートすることができます。

dbigniteによるFHIRの相互運用性に関してすぐに[チェック](https://github.com/databrickslabs/dbignite)してみてください！

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
【Django】CSSが適用されない問題

# 起こったこと
viewsやurlsなどを設定し終わり、ローカル環境でいざアプリを起動してみたところ、何故かCSSだけが適用されていない状態に…。キャッシュ削除、cssのurlパスがおかしくないかいじったり、一通りは試したものの解決しなかった。

# 原因
settngs.pyで設定されていた`DEBUG`が**False**になっていた。どうやら`DEBUG=False`だとstaticとmediaに配置した画像やファイルが読み込めなくなるらしい。

## ローカル環境のみでDEBUGをTrueにしたい
しかしsettings.pyで直接`DEBUG=True`にすると、本番環境に移行後もデバッグモードになってしまう。
そこでlocal_settings.pyを別に作り、そちらにローカル環境におけるDEBUGの記述を書いてからsettings.pyに適用する。

#### 手順
* local_settings.pyに以下を追記。
```
DEBUG = True #ローカルでDebug
```
* settings.pyの一番下の行に以下を追記（デフォルトで書かれている`DEBUG=False`の記述は消さない）
```
# ローカル環境の場合DebugがTrueになるように設定
try:
    from .local_settings import *
except ImportError:
    pass
```

# まとめ
cssに関するエラーも特に発生せず、ただ読み込まれない状態だったため原因の特定に時間をとても使用してしまいました…涙 

# 参考サイト
https://rurukblog.com/post/Django-debug-false/
【Exchange Online】メールフロールールの「スパムフィルターをバイパスする」の動作について(MDO含む)

## はじめに
今回はメールフロールールにて「スパムフィルターをバイパスする」ルール指定時の、それ以降のフィルターをどのようにバイパスするのか説明したいと思います。
## メールフローの位置
そもそもメールフローとはまずどこに位置するものなのかを把握しましょう。
自分が把握する限り以下の場所に位置するので、例えばメールフローより前にマルウェア対策等で拒否等がされてしまえば、メールフローにメールが来ることすらありません。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879925/b7b68b4b-3ec6-9f03-964f-40f7f176cf71.png)

## メールフロールール内のルールの位置
では次にメールフロー内でのルールの位置を確認しましょう。
「スパムフィルターをバイパスする」ルールに、メールの条件が一致したとしても、他に拒否のルールがあった場合は送信すらされません。
また前のルールで「以降のルールを処理しない」が選択されている場合、条件が一致していても、バイパスするルールが処理されない可能性があります。
例として、以下画像のように、スパムフィルターをバイパスするルールの上下にこのようなルールが存在した場合に、処理がされません。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879925/7a02225a-79ff-e47a-b1ba-33f5a8a2e9ca.png)

## スパムフィルターをバイパスするルールの動作
次にメールフローを出た後の動作(水色矢印)を説明します。
メールフローを出た後は、迷惑メール対策(一部を除く)、フィッシング対策をバイパスします。
迷惑メール対策内でも、「高確度フィッシングメッセージ」と認識されてしまったものは検疫されます。
=スパムメッセージ、高確度スパムメッセージ、フィッシングメッセージと認識されたものの処理はバイパスされます。
高確度フィッシングメッセージとは、MSが「ほぼ確実に危険」と判断したものになるため、マルウェア同様、メールフローによるバイパスはできません。
迷惑メール対策とは別のフィッシング対策についても、処理はバイパスされます。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1879925/322c7736-e99d-499f-dd47-ddc9892e7305.png)
※MDO Plan1,2のライセンスがある場合、安全な添付ファイル、安全なリンクポリシーも存在しますが、
それらの処理はバイパスされません。
安全な添付ファイルのスキャン、リンクの書き換え等は引き続き行われます。

## 安全な添付ファイル・安全なリンクの処理をバイパスしたい場合(MDO Plan1,2)
もし、安全な添付ファイル、安全なリンクの処理をバイパスしたい場合は、
別のメールヘッダーを変更する以下の特殊なメールフロールールの作成が必要です。

```:安全なリンクをバイパスする処理
メッセージプロパティの変更>メッセージヘッダーの設定
メッセージヘッダー'X-MS-Exchange-Organization-SkipSafeLinksProcessing'を'1'にします。
```

```:安全な添付ファイルをバイパスする処理
メッセージプロパティの変更>メッセージヘッダーの設定
メッセージヘッダー'X-MS-Exchange-Organization-SkipSafeAttachmentProcessing'を'1'にします。
```
【CSS】独自のジャンプ率を設定する

# どうしたい？
h1, h2要素のデフォルト文字サイズがデカすぎるので、地の文に対する見出しの文字サイズ比率(ジャンプ率)をこちらで設定してしまいたい。
具体的には

+ h1: 2倍
+ h2: 1.5倍
+ h3: 1.25倍

にします。

# CSSを編集する

```css:stylesheet.css
html {
  font-size: 1rem;
  h1 {
    font-size: 2em;
  }
  h2 {
    font-size: 1.5em;
  }
  h3 {
    font-size: 1.2em;
  }
}

@media screen and (max-width:576px) {
  html {
    font-size: 0.63rem;
  }
}
```

# 解説

## html要素でfont-sizeを指定する
まずは地の文のサイズを設定します。
地の文の文字サイズを指定するときは`rem`を使用します。
`1rem`とすることでhtmlのデフォルトフォントサイズである16pxを指定することができます。
この値に対する文字サイズの比を下で設定します。

## 見出し要素でジャンプ率を指定する
html要素にネストしたh1~h3要素の`font-size`を指定します。
このとき、文字サイズを指定するのに`em`を使用することで親要素であるhtml要素に指定した値に対する比率を設定できます。

## (おまけ)SPサイズのfont-sizeを指定する
SPサイズでの地の文のフォントサイズを指定します。
今回は10pxにしたいので、10/16=0.625から0.63remとしました。
（16*0.63=10.08なので大体こんなもんでしょう。）
見出しサイズは上で指定しているので、ジャンプ率を保ったままとなります。

# 参考

[ノンデザイナーなら押さえたい！デザインの基本「ジャンプ率」～デザインを大切にするマーケティング担当者へ～](https://genesiscom.jp/jump-rate/)

[【CSS】em単位の特徴と使い方！rem・px・%との違いも解説](https://web-camp.io/magazine/archives/102270)

[Text (テキスト) - Bootstrap公式リファレンス](https://getbootstrap.jp/docs/5.0/utilities/text/)
Python,Ruby,PHP,Java,JavaScript,Perlの比較演算子の比較 | プログラミング言語比較


<a href="https://qiita.com/yuki_kimoto/items/f9c2454e7f9130ddb003">Qiita > プログラミング言語の比較</a>

プログラミング言語Python,Ruby,PHP,Java,JavaScript,Perlの比較演算子の比較

# Python

https://qiita.com/G-Rape/items/cd3f2f284ba990164564

# Ruby

https://qiita.com/yusuke_blog1026/items/ab33bdfa495597d04f0b

# PHP

https://qiita.com/yukachin0414/items/cfb02cbbdd31a52902e8

# Java

https://qiita.com/takahirocook/items/748990882f2de7a630a1

# JavaScript

https://qiita.com/miriwo/items/e9ca0a2779ed2c8117c3

# Perl

https://perlzemi.com/blog/20080318120585.html
EclipseでJavadoc生成時のauthorを変更する

何回か調べた内容なのでメモとして残しておきます。

# やりたいこと
Eclipseでクラス名にJavadocコメントを生成する際に表示される`author`（作成者）をデフォルトから変更します。

デフォルトではOSにログインしているユーザ名が自動で入力されます。
職場や案件などによっては入力名に決まりがあり、その都度変更していましたがデフォルトの設定を変更することができます。

:::note info
Javadocコメントの生成ショートカット
クラス名やメソッド名の上の行で「/**」+ Enter
:::
こんな感じで表示されます。
![スクリーンショット 2022-10-22 5.43.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517594/9843c99b-7a1f-7b6e-d04c-65628b2a4347.png)
今回はauthorを`default`から`katao`に変更していきます。

# 設定方法

Eclipseの環境設定を開きます。

:::note info
環境変数のショートカットキー
command + ,
:::
```
Java → コード・スタイル → コード・テンプレート
```
「プロジェクト固有の設定の構成」をクリック
![スクリーンショット 2022-10-22 5.55.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517594/024889b6-e12b-5491-448c-c603eecd5693.png)

設定するプロジェクトを選択して「OK」をクリック
![スクリーンショット 2022-10-22 6.05.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517594/23fe3bdd-e464-cd24-a1db-e721169816b3.png)
「プロジェクト固有の設定を可能にする」にチェックを入れ、
```json
コメント → タイプ
```
を選択して「編集」をクリック
![スクリーンショット 2022-10-22 6.08.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517594/58b22ed6-089a-0a20-ac0f-96b91661f601.png)
`${user}` のところを変更したい名前に変更して「OK」をクリックします。
![スクリーンショット 2022-10-22 6.13.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517594/5808bf06-0d7d-1c0f-b66d-f4b1a8d4e9f1.png)
　↓↓↓
![スクリーンショット 2022-10-22 6.13.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517594/a409edab-70c9-07f9-fa56-1501d4ec4fde.png)
「適用して閉じる」をクリックしていくと設定は完了です。

設定変更後にクラス名でJavadocコメントを使用すると設定した名前に変わっています。
![スクリーンショット 2022-10-22 6.19.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517594/cdb60717-c9ea-636c-3ecf-a83a02adb44a.png)

# 参考記事
[Eclipse - エディタ関連 - author を変更する](http://freebsd.sing.ne.jp/tool/07/05/21.html)
Excel業務(無駄)を自動化したい　part3 番外編１代入できるのは文字だけ？

# はじめに
このサイトでは、社会人なりたての私が無駄を省くための戦いをまとめています。
今回のテーマは、pythonのライブラリを用いて、Excelをいじっていきます。
ライブラリ名は、openpyxlです。

# 実行環境
Windows10
Python 3.10.5

# openpyxlとは？
openpyxlはExcelファイル(`.xlsx`)を読み書きできるツールです。
公式ドキュメント　[openpyxl/openpyxl-Bitbucket](https://bitbucket.org/openpyxl/openpyxl/src/master/)
詳しくは[こちら！](https://note.nkmk.me/python-openpyxl-usage/)
**今回はExcelファイル内のデータを読み込んで、分析するのではなく、
代入したいだけなので、pandasではなくopenpyxlを使用しています！**

# Excelに値を代入！
Excelに値を代入する方法は以前触れたので、今回はどんな値を代入できるのかについて
書いていきます。
参考資料　　[Excel業務(無駄)を自動化したい　part1 Excelに値を代入しよう](https://qiita.com/caffeine1202/items/2c2f2eb3382cd9098e23)

どんな値を代入できるのか調べたところ、**文字列のみ**代入できることが分かりました。
これで終了ではなく、ここからが問題で、
Excelには**文字列であればなんでも**代入することができます。

## 代入できるもの
分かりやすいものは、単純な文字列、数値などがあります。
プラスしてExcelに**数式(関数)**を代入することができます。
```python:数式を代入    
str = "代入OK！"
ws['A1'].value = str
ws['A3'].value = "=A1"

print(ws['A3'].value)
# "=A1"
```
文字列として代入することで、数式を無理やり代入することができます。
出力結果が以下の画像です。
![スクリーンショット 2022-10-19 192651.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433191/408c0091-dc91-c3be-0b34-1762b3c6ce9f.png)

誰得かわかりませんが、pythonを用いたマクロみたいなものを作ることができます。
数式に関しては、Excelで使えるものはすべて代入できるはず…です。

# 終わりに
見つけたすぐのタイミングのときは大発見だと喜びましたが、よくよく考えたら、全部pythonでよくね？という感想が出てきたので、使いたい人は使ってみてください。私は、マクロの勉強したくないので、もう少し使っていこうと思います。
Windows10でUbuntu22.04+Github+VSCodeの開発環境を構築する

# WSLのインストール
PowerShellを管理者権限で開いてwslをインストール
```
wsl --install
```
インストール完了後OS再起動

# Ubuntu22.04のインストール
Microsoft StoreからUbuntu22.04をダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582097/48f141b0-9933-8908-c5d3-00900390ab26.png)

ダウンロード完了後、開くとインストールが勝手に開始される
表示される手順に従って、ユーザ名やパスワードを入力していく

# VSCodeのインストール
下記リンクからダウンロードしてインストール

https://code.visualstudio.com/download

# VSCodeに拡張機能を追加
日本語化の拡張機能を追加(画像一番上のやつ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582097/908e32f4-6704-5bd5-30e7-f0c106230de4.png)


wslの拡張機能を追加(画像一番上のやつ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582097/5e272e0b-9afb-b26f-d8b7-9de39f42f9da.png)

# VSCodeからwsl環境のUbuntuに接続
VSCode左下の緑色のボタンからリモートウィンドウを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582097/a749bfeb-3839-5e4f-980b-d4b114b04aef.png)
ディストリビューションを使用した新しいWSLウィンドウ -> Ubuntu-22.04

これで接続される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582097/53267c14-275b-2ad7-8592-959722449a60.png)

# GithubにSSH接続できるようにする
VSCodeでターミナルを開く
ターミナル -> 新しいターミナル

以下コマンドを実行
```
# apt更新
sudo apt update
sudo apt upgrade

# gitインストール
sudo apt install git

# git configを設定
git config --global user.name ${githubのユーザ名}
git config --global user.email ${githubに登録しているメールアドレス}

# ssh-key作成（なんか色々聞かれるけどとりあえずエンターキー連打でおｋ）
ssh-keygen -t rsa

# 作成した公開鍵を確認
cat ~/.ssh/id_rsa.pub
```

ブラウザからGithubのSettingsを開き、ssh-keyの登録をする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582097/54fd27f4-480d-eebb-d0da-7a3389b10fdc.png)

Titleは`wsl-key`など適当につける
Keyはさっき確認した公開鍵をコピペして貼り付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582097/1cf1df35-6ba1-6e83-e68e-9694e8a38f87.png)
Add SSH KeyでSSHの公開鍵登録を完了する

VSCodeのターミナルに戻り、SSH接続ができるか確認する
```
# 初回接続時はなんか聞かれるけどyesでおｋ
ssh -T git@github.com
```
数値を含む文字列のリストを昇順に並べ替える

# 綺麗に並べたい
globしたファイルの読み取り時など、ファイル名順に読み取りたかったりします。

# 二桁以上は注意

sortedをそのまま使うと、桁が上がった時に、昇順になりません。

```python
files = ['11.jpg','7.jpg', '5.jpg', '9.jpg', '2.jpg', '6.jpg', '10.jpg', '1.jpg', '8.jpg', '4.jpg',  '3.jpg', '12.jpg']

sorted(files)
```

>['1.jpg',
 '10.jpg',
 '11.jpg',
 '12.jpg',
 '2.jpg',
 '3.jpg',
 '4.jpg',
 '5.jpg',
 '6.jpg',
 '7.jpg',
 '8.jpg',
 '9.jpg']

# 解決法

```python
import re
def atoi(text):
    return int(text) if text.isdigit() else text

def natural_keys(text):
    return [ atoi(c) for c in re.split(r'(\d+)', text) ]

sorted_files = sorted(files,key=natural_keys)
sorted_files
```

>['1.jpg',
 '2.jpg',
 '3.jpg',
 '4.jpg',
 '5.jpg',
 '6.jpg',
 '7.jpg',
 '8.jpg',
 '9.jpg',
 '10.jpg',
 '11.jpg',
 '12.jpg']

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

機械学習、ARアプリ（Web/iOS）を作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
サブスクリプションについて

●Azure を利用するには

サブスクリプションを取得ｓルウ必要がある。

●サブスクリプションの種類
・Azureダイレクト（従量課金）
・Azure EA（エンタープライズ契約）
・Azure インオープン
・CSP(クラウドソリューションプロバイダー)

●サブスクリプションに必様なアカウント
・Microsoftアカウント
・Azure IDアカウント

※無料アカウントの期限は１ヶ月、または$200クレジットを超えた場合サービスの利用が制限される。

●複数サブスクリプションを持つメリット
・請求書の分割
・リソースに対するアクセス権の分離
・クォータの回避とクォータ管理の分離
MIDサーバーについて（★初心者です）

## 取り扱うこと
ServiceNowで使用するMIDサーバーの機能概要と有効化までの手順
ECCキュー、Probe、AMBといった詳細なアーキテクチャは他参照のこと


![FireShot Capture 008 - 技術語り-Tech Blog[JP]_ MIDサーバーについて - tech-software-tokyo.blogspot.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/efd2d35f-a1b4-0bb2-692f-38c9eea69b16.png)

## 参考
以下の自分のブログにて不定期にServiceNow情報を記載していきます。
[技術語り](https://tech-software-tokyo.blogspot.com/2022/10/mid.html)
良ければご確認ください。
Flash Magicで遊ぶ(書き込み)(LPC812)


x LPC812には、C4以外もあるらしい

目的

秋月で売っているLPC812で遊ぶ
書き込む為にFlash Magicが必要


手順

1. Flash Magic起動
2. LPC812を接続。　当然、P0_12をGNDに落とす。
3. マイコンの選択
4. ファイルの選択
5. 書き込む
6. LPC812を切り離し。　当然、P0_12をオープン
7. LPC812を再接続。


![o_cop170.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/808e20c4-6f18-c724-a16a-81d090871d6b.jpeg)

![o_cop171.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4fdd5434-6edd-0bfe-be6b-d4ec473537b9.jpeg)

![o_cop172.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/97002941-0ad9-40e7-a8ed-e573c7c1cf81.jpeg)

![o_cop173.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8948d960-aac5-ca5d-34ef-108375b5d447.jpeg)

![o_cop174.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/cb298709-6c0f-d567-67e1-eb4e4decc30f.jpeg)

![o_cop175.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9ebcf58c-2bc1-f2ed-8897-2199d60def7c.jpeg)

![o_cop176.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0be9e59c-29fe-5ce0-705d-7f0c3e1f4f9e.jpeg)

![o_cop177.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c87f6054-1880-dd54-f65f-780a402a0852.jpeg)

![o_cop178.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f9e6a65f-1bc5-c887-4156-15548606edc7.jpeg)

![o_cop179.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/974b487d-a291-1f14-3f98-4c1bab6a1e97.jpeg)
vue3 sfc vue-chartjs


https://www.chartjs.org/
https://vue-chartjs.org/

"chart.js": "3.9.1",
"vue": "3.2.36",
"vue-chartjs": "4.1.2"

```
<script setup>
import {Bar, Pie} from 'vue-chartjs'
import {Chart as ChartJS, Title, Tooltip, Legend, BarElement, CategoryScale, LinearScale, ArcElement} from 'chart.js'

ChartJS.register(Title, Tooltip, Legend, BarElement, CategoryScale, LinearScale, ArcElement);

const chartOptions1 = {responsive: true};
const chartData1 = {
    labels: ['1月', '2月', '3月'],
    datasets: [
        {
            label: '2021年',
            backgroundColor: ['#f7fcf0', '#e0f3db', '#ccebc5'],
            data: [30, 20, 12]
        },
        {
            label: '2022年',
            backgroundColor: ['#f7fcf0', '#e0f3db', '#ccebc5'],
            data: [10, 25, 22]
        }

    ]
};
const chartId1 = 'bar-chart';

const chartOptions2 = {responsive: true, maintainAspectRatio: false}
const chartData2 = {
    labels: ['その1', 'その2', 'その3', 'その4'],
    datasets: [
        {
            backgroundColor: ['#f7fcf0', '#e0f3db', '#ccebc5', '#a8ddb5', '#7bccc4'],
            data: [40, 20, 80, 10]
        }
    ]
}
const chartId2 = 'pie-chart';

const width = 400;
const height = 400;
</script>

<template>
    <Bar
        :chart-options="chartOptions1"
        :chart-data="chartData1"
        :chart-id="chartId1"
        :width="width"
        :height="height"
    />
    <hr>
    <Pie
        :chart-options="chartOptions2"
        :chart-data="chartData2"
        :chart-id="chartId2"
        :width="width"
        :height="height"
    />
</template>
```
useStateの初期化ができなくて２時間潰した俺みたいになるな

Reactを触ってかれこれ１年以上経つのに、useStateの初期化ができなくて2時間以上潰しました。
結果、原因はuseStateの初期化は最初の１度のみ行われるということがわかっていなかったことでした。

# useStateの初期化は最初の１度のみ

``` App.jsx
import { useState } from "react";
import "./styles.css";

const InitValUI = (props) => {
  const { val } = props;
  const [initVal] = useState(val ? val : ""); ← valが初期値として設定されない
  return <h1>{initVal}</h1>;
};

export default function App() {
  const [val, setVal] = useState();

  const onClickBtn = (val) => {
    setVal(val);
  };
  return (
    <div className="App">
      <button onClick={() => onClickBtn("コーラ")}>
        押された時に初期値が設定されるよ
      </button>
      <InitValUI val={val} />
    </div>
  );
}

```
あまり実用的なコードではありませんが、上記のコードはボタンが押されたらvalが設定され、``props``で``InitValUI``に渡り、``useState``の初期値に設定され画面に表示されるということを期待しています。しかしボタンを押しても``val``は初期値として設定されません。

冒頭でも言いましたが、ずばり原因は**useStateの初期化は最初のレンダリング時に一度しか設定されないから**です

上記のコードでは特に制御をしていないため、``InitValUI``も最初に画面を開いた時にレンダリングされます。
そして最初のレンダリング時にはvalには値が設定されていないため、``useState``の初期値には空文字``""``が設定されます。以降は``useState``の初期化はされないため``val``設定されないということです。

そのため、初期化したい値が設定されない間はレンダリングしない処理を追加してあげれば正しく値が設定されます。
上記のコードの場合以下のように修正すると``val``が設定されます。

```diff_jsx
- <InitValUI val={val} />
+ {val && <InitValUI val={val} />}
```
cmakeでdll作る

# 導入
visualstudioとc++でゲームエンジンを作っていて、ユーザの作るカスタムスクリプトからdllを作って、エンジンとくっつけたい。そういう思いからcmakeでdllを作る方法を調べた。

# 実例
以下のリポジトリで公開。
dllはリンク先のままのlibフォルダを見ればok。

https://github.com/heller77/cmake_dll_sample/tree/main/lib
## ファイル構造

以下の様なファイル構造。
CMakeLists.txtとheaderフォルダとsrcフォルダにそれぞれ.hファイルと.cppファイルが入っています
```
D:.
│  CMakeLists.txt
│
├─header
│      Enemy.h
│      goodafternoon.h
│      hello.h
│
└─src
        Enemy.cpp
        goodafternoon.cpp
        hello.cpp
```
CMakeLists.txtの内容は以下。
それぞれの行にコメントを書いているので、それを見て欲しい。
```cmake
# cmakeのバージョン
cmake_minimum_required(VERSION 3.1)

# プロジェクト名指定
project(oreorelib CXX)

# srcフォルダー以下のcppファイル一覧をcppfilesという変数に格納
file(GLOB_RECURSE cppfiles RELATIVE ${PROJECT_SOURCE_DIR} ./src/*.cpp)

# dllでビルドすると指定
add_library(oreorelib SHARED ${cppfiles})

# c++11
target_compile_features(oreorelib PRIVATE cxx_std_11)

# include ディレクトリ指定
target_include_directories(oreorelib INTERFACE ./header)
```

# 実行コマンド
実際にビルドするときのコマンドの例を以下に示す。
```
mkdir build
cd build 
cmake ../ -G"Visual Studio 16 2019"
cmake --build .
```

#　注意
dllの場合は、以下の様に関数にexportするよ的な記述がないと、外部から使用できないので注意。
exportするシンボルがないと、dllファイルと一緒に出来るlibファイルが出来ないので注意。
```cpp
extern "C" __declspec(dllexport) void hello();
```
# 参考
https://kamino.hatenablog.com/entry/cmake_tutorial1

https://qiita.com/mrk_21/items/5e7ca775b463a4141a58
[java] 配列の指定された文字列の出現回数を数える

# 初めに

javaに限らず、ある文字列の出現回数を求めたいときがあると思う。多くのプログラミング言語では関数を使えば簡単に実装できるが、簡単に実装する。

# 実装
List型引数を持ち、Map<String,Integer>を返り値に持つgetWordCountMap関数を実装した。

```csharp
public static Map<String,Integer> getWordCountMap(List<String> wordList){
        Map<String,Integer> count = new HashMap<>();
        String[] count1 = new String[wordList.size()];
        int check=0;

        for(String s:wordList){
        check = 0;
          for(String key : count.keySet()){
                if(s.equals(key)){
                    check = 1;
                }
            }
            if(check == 0){
                count.put(s,1);
            }
            else{
                count.replace(s,count.get(s)+1);
            }
         }
        return count;
    }
AWS SSMセッションマネージャー経由でSSH（プロキシ下、EC2自動起動）

AWS Systems Manager（SSM）セッションマネージャー経由でEC2インスタンスにSSH接続します。プロキシ環境下での接続方法や、SSH接続時にインスタンスを自動起動する方法も示します。

## EC2インスタンスを準備する

SSH接続先のEC2インスタンスを作成します。例えば以下のようにします。

1. VPCなどのネットワークとEC2インスタンスを作成します。（※料金を安くしたいときは、停止・再開できるスポットインスタンスを使用します）
1. 料金を安くしたいので、毎日深夜にインスタンスを停止するようにします。EventBridgeの「EC2 StopInstances API 呼び出し」を使うのが簡単だと思います。
1. SSMの前提条件を満たしていることを確認します。
    1. SSMエージェントがインストールされていること。（※Amazon Linux 2などにはプリインストール済み）
    1. `AmazonSSMManagedInstanceCore` ポリシーを含むIAMロールがインスタンスにアタッチされていること。
    1. インターネット（またはSSMサービス）へのアウトバウンド通信経路があること。

## ローカル側の準備をする

Windows想定で記載します。

1. AWS CLIをインストールします。
1. `aws configure` などでAWS CLIをセットアップします。
1. AWS CLI Session Manager Pluginをインストールします。
1. `%USERPROFILE%\.ssh\config` に以下を追記します。

   ```txt:.ssh\config
   Host remote
       User ec2-user
       HostName i-xxx
       IdentityFile <秘密鍵のパス>
       ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "$env:HTTPS_PROXY = 'http://proxy.example.com:8080'; $env:AWS_PROFILE = '<AWSプロファイル名>'; (aws sts get-caller-identity) -or (aws sso login); aws ec2 start-instances --instance-ids %h; aws ec2 wait instance-running --instance-ids %h; aws ssm start-session --target %h --document-name AWS-StartSSHSession"
   ```

### クソ長ProxyCommandの解説

まず、公式ガイドでは、セッションマネージャー経由でSSH接続するには `.ssh\config` に以下のように追記するよう案内されています。

```txt
# SSH over Session Manager
host i-* mi-*
    ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p"
```

https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html#ssh-connections-enable

これをベースに、いろいろ追加して `ProxyCommand` を以下のようにしました。皆さんの環境に応じてコマンドを取捨選択・変更してください。

```powershell
# プロキシ環境下の場合は、環境変数でプロキシを設定します。
$env:HTTPS_PROXY = 'http://proxy.example.com:8080'

# 毎回 `--profile <AWSプロファイル名>` と書くと長いので、環境変数で設定します。
$env:AWS_PROFILE = '<AWSプロファイル名>'

# 私はAWS SSOを使っているので、ログインできていない場合はログインします。
(aws sts get-caller-identity) -or (aws sso login)

# 普段インスタンスを停止しているので、起動します。
aws ec2 start-instances --instance-ids %h

# インスタンスの起動を待ちます。
aws ec2 wait instance-running --instance-ids %h

# SSHセッションを開始します。
aws ssm start-session --target %h --document-name AWS-StartSSHSession
```

スマートな方法なのか分かりませんが、これで期待どおり動きました。

## SSH接続する

PowerShellで `ssh <Host名>` で接続します。

```powershell
ssh remote
```

インスタンスの起動が入る場合は、接続するまでに30秒ほど掛かります。

## リモート開発する

もちろん、Visual Studio Codeでリモート開発することもできます。詳細は、以下の参考ページなどをご覧ください。

https://blog.logical.co.jp/entry/2021/12/27/133000

SSH接続時にインスタンスの起動が入る場合は、接続確立後もインスタンスのVisual Studio Codeサーバーが起動するまで（？）うまく動かないため,ご注意ください。
Raspberry Pi 4 model Bで仮想環境をつくる

# 1. 概要

https://zenn.dev/tokoroteen/articles/113ed90c5eefb6

こちらの続き
普段MacでAnacondaを使っているので、ラズパイでもcondaを使えるようにしようと思いましたが、Raspberry Pi 4でMinicondaは上手く動かないみたいです。
参考：https://qiita.com/hanaata/items/39ada844c7c292d2fef1#python

ラズパイ用にberrycondaというものもあるようですが、こちらも
>This project is no longer active
https://github.com/jjhelmus/berryconda

と書いてあるので、使わない方がいいかなと思いました。

venvが使えそうなのでそちらで環境構築していきます。

https://nagolab.com/keijiban/2018/08/06/%E2%80%BB%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/
https://peislab.com/programming/python/install_py37/



# 2. 仮想環境をつくる
```
$ python -V
Python 3.9.2
```
python 3.9が入っていました。

仮想環境は
```
$ python3.9 -m venv (環境名)
$　source homeru/bin/activate
(環境名)$
```
となり、環境構築成功しました！
試しに
```
(環境名)$　pip install numpy
Successfully installed numpy-1.23.4
```
となり、numpyをインストールできました。

```
(環境名)$　pip list
numpy         1.23.4
pip           20.3.4
pkg-resources 0.0.0
setuptools    44.1.1
```

ちなみに
```
$ deactivate
```
で仮想環境から抜けられます。
Lambdaから外部APIへの接続方法（Python）

# 概要
  Lambdaから外部のAPIに接続するPythonコードを紹介します。

# 前提条件
  - RequestsをLambdaのレイヤーに設定していること
    - ダウンロード：https://pypi.org/project/requests/
    - レイヤー設定方法：https://qiita.com/t_okkan/items/394a15577bd1aad46ec3
  - LambdaのIPが固定化されていること
    - 参考：https://qiita.com/Annoske/items/3770c166c7dc5d8d1f24
  - 必要なIAM権限が付与されていること

# コード
  ```python
    import requests
    import json

    ip = <接続先のアドレス>

    def lambda_handler(event, context):
        url = "http://{}".format(ip)
        headers = {'content-type': 'application/json; charset=UTF-8'}
        payload = {<送りたい値>}
        
        res = requests.post(
            url,
            data=json.dumps(payload), 
            headers=headers
        )

        return res.json()
  ```

# おまけ
  認証情報をAPIに送りたい場合は、下記のようにheadersにAuthorizationを記述します。
  ```python
    import requests
    import json

    ip = <接続先のアドレス>
    token = <アクセストークン情報>

    def lambda_handler(event, context):
        url = "http://{}".format(ip)
        headers = {'Authorization': 'Bearer {}'.format(token)}
        payload = {<送りたい値>}
        
        res = requests.post(
            url,
            data=json.dumps(payload), 
            headers=headers
        )

        return res.json()
  ```

# おわりに
  リクエストで仮に404などエラーが返ってきた場合、上記のコードでは、Lambdaは正常に終了します。

  そのため、エラー時の処理を書きたい場合は、返ってきた値によってエラーを出すよう記述する必要があります。
マラソン　Javascript　電卓

今回はjavascriptの使い方を復習するために、簡単な計算ツールを作成しました。
具体的には、マラソンのペースの計算しきです。

今回学べる事は6つぐらいで、Javascript初心者向けの記事になります。
11/10（一回目）
コード

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>marathon</title>
</head>

<style>
    .f30 {
        font-size: 30px;
    }

    .red {
        font-size: 40px;
        font-style: italic;
        color: red;
        text-align: center;
    }

</style>
<body>
    
    <select class="time1a f30">      <!-- 1 -->
        <option>2</option>
        <option>3</option>
        <option>4</option>
        <option>5</option>
        <option>6</option>
    </select>
    時間 

    <select class="time2a f30">
        <option>00</option>
        <option>15</option>
        <option>30</option>
        <option>45</option>
    </select>
    分

    <button id="calc_time" class="f30">計算</button>

    <div class="time3a f30">10分→</div>
    <div class="time4a red">""</div>
    <div class="time3a f30">1km→</div>
    <div class="time5a red">""</div>
    <div class="time3a f30">10km→</div>
    <div class="time6a red">""</div>

</body>

<script>
   let time4a = document.querySelector('.time4a') // ・・・2
   let time5a = document.querySelector('.time5a') 
   let time6a = document.querySelector('.time6a')
   let calc = document.querySelector('#calc_time') //・・・3

    calc.addEventListener("click",() => { //・・・4
        time1a = document.querySelector('.time1a').value
        time2a = document.querySelector('.time2a').value
        
        time1b = time1a * 3600 + time2a * 60 //１時間１分を3660秒にする計算
        time1c = 42.195 / time1b * 600 // 42㎞の秒側に600秒（10分）をかけた値
        time1d = time1b *  1 / 42.195 // 目標タイムの秒数÷42で　(秒/km) 

        console.log(time1c)
        console.log(time1d)

        time4a.innerHTML = Math.floor(time1c * 10) / 10 + "km" //・・・5

        time5a.innerHTML = Math.floor(time1d/60)  + "分" + Math.floor(time1d % 60 ) + "秒" //・・・6,7
        time6a.innerHTML = Math.floor(time1d/6)  + "分" 

        })

</script>
</html>
```

#### 1　selectタグについて
これはHTMLのみで実現できるドロップダウンリストです。そのままコピペです。
classも付与したら文字が大きくなって便利でした。
https://www.javadrive.jp/javascript/form/index5.html
こちらの記事を参考にしました。

#### 2　document.querySelector（#---）
Document.getElementById()の代用　簡単に言うと「任意の要素を呼び出すことができます」
#### 3　document.querySelector（.---）
Document.getElementsByClassName()の代用　詳しく言うと「任意のHTMLタグで指定したクラスにマッチするドキュメント要素を取得するメソッド」
https://www.sejuku.net/blog/27019

#### 4　addEventListener("click",() =>｛｝）
ボタンをクリックしたときに以下の関数やメソッドを実行するもの。
速度の計算とドロップダウンの数値の取得などが行われています。

#### 5　innerHTML
HTML要素の中身を変更するときに使われるプロパティ
JavaScriptでの処理の結果を画面に表示するときに、HTMLのタグも含めて書き換えることができる。

#### 6　Math.floor
 Math.floor は対象の値の小数点以下を切り捨てます。
const num = 12.2627;
小数第二位以下を切り捨て
(Math.floor(num * 10)) / 10)
 12.2
Math.floorだけだと12に整数になるので、126にしてから10でわると12.2になる

まとめ
「電卓アプリ作成」で検索してヒットした記事を参考に作成しました。
こちらのサイトです。

https://nyanblog2222.com/programming/javascript/4496/
参考サイトは後程url記載します。
LambdaでDynamoDBのトランザクション処理をおこなう（Python）

# 概要
  DynamoDBへのトランザクション処理をPythonで書く方法を紹介します。

# 前提条件
  - DynamoDBのテーブルが用意されていること

# 環境
  - Lambda
    - ランタイム：Python3.9
    - リージョン：ap-northeast-1

# コード
```python
import boto3

dynamoDB = boto3.resource("dynamodb")
table_name = <DynamoDBのテーブル名>
table = dynamoDB.Table(table_name)
client = boto3.client('dynamodb', region_name='ap-northeast-1')

def lambda_handler(event, context):
    id1 = <更新するデータの主キー>
    id2 = <更新するデータの主キー>
    column1 = <更新する値のカラム名>
    column2 = <更新する値のカラム名>
    data1 = <更新する値>
    data2 = <更新する値>

    # トランザクション処理
    client.transact_write_items(
        TransactItems=[
            {
                'Update': {
                    'TableName': table_name,
                    'Key': {
                        'id': {'S': id1}
                    },
                    'UpdateExpression': 'SET #s=:s',
                    'ExpressionAttributeNames': {
                        '#s' : column1
                    },
                    'ExpressionAttributeValues': {
                        ':s' : {'S': data1}
                    }
                }
            },
            {
                'Update': {
                    'TableName': table_name,
                    'Key': {
                        'id': {'S': id2}
                    },
                    'UpdateExpression': 'SET #s=:s',
                    'ExpressionAttributeNames': {
                        '#s' : column2
                    },
                    'ExpressionAttributeValues': {
                        ':s' : {'S': data2}
                    }
                }
            }
        ]
    )
    
    return "Success"
```

# おわりに
  今回は、同一テーブルの別レコードを同時に更新する処理を紹介しました。
  値を変えれば、同じレコード内や同一カラムの更新等も可能です。
  ぜひ参考にしてください。
js.Objectのすべてのproperty表示する方法。

js.Objectのすべてのproperty表示する方法。
　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/5e1ce93f-bce4-ef35-ff32-02b9d73e9ad5.png)
　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/3e2febbe-c605-24b5-72af-81bb24e99d4e.png)

js this 関して。
　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/eae237de-f835-bce3-5075-14cf26c46fd0.png)
　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/171d90ba-2e64-1ed9-705a-f0dc6ab2354b.png)

js Object 宣言方法。
　　　①：
　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/82b30528-b976-9f47-5780-9b8476592fb9.png)
　　　②：
　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/3d6164ea-16c4-12fa-8561-24eef5a6420e.png)
　　　③：
　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/54eb706d-f7f2-246e-a720-146acbcae395.png)
　　　④：
　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/f7a0530d-0ce6-bc3f-6397-6babc505a5ea.png)

js sort 序列
　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/19abc71b-54cc-0925-3205-455bfa8456e2.png)
　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/9dfb435f-3c30-d683-aaee-993d68e35648.png)


js join() 配列をStringに。
　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/3ed684cf-3f98-69e0-4e6f-60202de3ab0a.png)
　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/a342d0bb-cbd5-42fd-63bd-64c375a984f2.png)

js String カット。
　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/98ee73fc-b6b8-ad45-b9de-7d203c2f0f26.png)
　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/067f6862-230c-ab96-4016-adbf79eced3c.png)
Javaで何か作ってみる(2022/11/10 Day21)

## 今日やった事
- [**GitHub**](https://github.com/takamatsuryota3)を整理した。
## 参考にしたもの
- [gitリポジトリの統合 - Qiita](https://qiita.com/CORNER/items/2e608f1091f305794f0a)
- [【Git】2つのGitリポジトリを履歴を保持して統合したい - Qiita](https://qiita.com/no_kawai/items/5efe8e47e54ebccd0bf8)
- [Git リモート URL を削除する方法 | Delft スタック](https://www.delftstack.com/ja/howto/git/how-to-remove-a-git-remote-url/)
## 所感
- やっと、GitHubの整理が終わった。
- READMEとかはつける必要があるけど、それは追い追いやろう。
- 最終的には以下のようになった。  
```
|-PHP
|  |-App
|  |-Study
|-Java
|  |-App
|  |-Study
|-Python
|  |-App
|  |-Study
|-CSharp
|-Other
```
&rarr; 言語毎に、リポジトリを作成し、その中で、StudyとAppというディレクトリを切った。  
&rarr; Studyは、勉強がてら書いたサンプルなどを格納し、Appには作成したアプリを格納する。
&rarr; どの言語にも該当しないものは、Otherに格納する。
&rarr; CSharpリポジトリについては、masterどdevelopで差分があるので、またの機会に整理する。
&rarr; 今後、複数言語使ってアプリを作成する場合は、状況見て判断する。
## 明日の予定
- Javaの勉強を再開する。
Dockerを使用したAWS CLIの使い方（セッションマネージャーでインスタンスにアクセス）

# 背景
個人的な用途のサーバとして、AWSのパブリックサブネット上にいるインスタンスが1台います。
コストかかってもしょうがないので踏み台サーバは用意せず、sshは自宅のipアドレスのみ許可する運用でやってました。
ただ最近外出先からちょくちょくサーバにアクセスしたいと思う機会があり、そろそろセッションマネージャーを検討しようかなと思い始めました。
ただセッションマネージャーを使用するにはAWS CLIが必要です。外出時に使用している比較的買ったばかりのPCを汚したくないため、AWS CLIをWSL上のDockerで用意しようと思い、今回使用できるようになったので記載します。


# ゴール
- 外出時にAWS上のインスタンスにWindowsターミナルからアクセスできるようにする
- クライアントPCは環境をなるべく汚したくないため、WSL上のDockerで環境を用意する


# 前提
- WSLにDockerインストール済み
- セッションマネージャーで管理するインスタンスにセッションマネージャーに必要なIAMロールをアタッチ済み ~~（私はAdministrator権限付与してしまってます）~~
- AWS CLI実行用のユーザを作成してアクセスキーを発行済み（readonlyのAWS管理ポリシーしていたら、あとはssmのStartSession, TerminateSessionの二つだけ追加すれば大丈夫でした）


# 環境準備

## WSL準備
まずはdockerを使用できるようにするため、WindowsターミナルからWSLの立ち上げとdockerサービスを起動します。
```powershell
PS C:\Users\horonium> wsl
horonium@<host>:~$ sudo /etc/init.d/docker start
[sudo] password for horonium:
 * Starting Docker: docker
```

## Dockerfile, コンテナイメージ作成

```dockerfile:Dockerfile
FROM amazon/aws-cli
WORKDIR /tmp
RUN curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm" \
 && yum install -y session-manager-plugin.rpm \
 && rm session-manager-plugin.rpm
WORKDIR /root
```
コンテナイメージは以下公式リファレンスにある情報から`amazon/aws-cli`を使用します。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-docker.html

またsession-managerを使用するにはプラグインをインストールしないといけないので、インストールする処理を記載しました。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html

これからイメージを作成します。
```bash
docker build . -t awscli:latest
```

# AWS CLI実行準備
AWS CLIを実行するには`aws configure`で使用するリージョンやIAMユーザのアクセスキーの情報を設定する必要があります。
実際に設定したファイルは、~/.awsディレクトリ配下にconfigとcredentialsとして用意されるので、それをWSL上のディレクトリに用意して、`docker run`する際にマウントしてあげます。

- 東京リージョンの例
```:~/.aws/config
[default]
output = json
region = ap-northeast-1
```
- アクセスキー情報
```:~/.aws/credentials
[default]
aws_access_key_id = <accessKey>
aws_secret_access_key = <secretAccess>
```


# SSMのStartSession実行
ではいよいよ実行します。コンテナイメージは作成済みなので、あとは`docker run`を実行すればよいです。
上記記載済みの通りですが、.awsをマウントしてあげるのを忘れずに。
```bash
docker run --rm -it -v ~/.aws/:/root/.aws awscli ssm start-session --target "<instanceID>"

Starting session with SessionId: readonly-xxxxxxxxxxxxxxxxx
sh-4.2$
```
これでWSL上のDockerを使用して、AWS上のインスタンスにアクセスできるようになりました。
アクセスキーを誤って公開してしまうようなことをしなければ、これで安全にどこからでもAWS上のインスタンスを管理できますね！

あとは毎回上記コマンドを入力するのも面倒なので、エイリアスの設定を.bashrcなどに記載すれば`aws ～`でWSL上からすぐ実行できます。


# いずれ
[ここを参考に](https://dev.classmethod.jp/articles/session-manager-launches-tunneling-support-for-ssh-and-scp/#toc-6)、ほんとはsshのconfigにProxyCommandとかを設定して、scpとかもできるようになりたいのですが以下エラーでうまくいかず、、、
正直コンテナを使用しているからの気がします。
```bash
$ ssh <hostName>
kex_exchange_identification: Connection closed by remote host
Connection closed by UNKNOWN port 65535
```

自分に合った管理方法をもう少し試行錯誤することになりそうですが、今日はここまで。
Javaで何か作ってみる(2022/11/09 Day20)

## 今日やった事
- [**PHP**](https://github.com/takamatsuryota3/PHP)というリポジトリに、**Calendar_Project**を統合した。
## 参考にしたもの
- [gitリポジトリの統合 - Qiita](https://qiita.com/CORNER/items/2e608f1091f305794f0a)
- [【Git】2つのGitリポジトリを履歴を保持して統合したい - Qiita](https://qiita.com/no_kawai/items/5efe8e47e54ebccd0bf8)
- [Git リモート URL を削除する方法 | Delft スタック](https://www.delftstack.com/ja/howto/git/how-to-remove-a-git-remote-url/)
## 所感
- 細かなところは参照する必要があるが、統合の流れはつかめてきた。
## 明日の予定
- 明日でGitHubの整理終わらせる！
多言語FizzBuzzチャレンジ23日目:Perl

## これまでのまとめ
https://qiita.com/tenteko/private/fc52f7aec63ba5f67854

https://qiita.com/tenteko/private/ca9813f0982370d0c901

https://qiita.com/tenteko/private/bc808ba59f6993019045

https://qiita.com/tenteko/private/74aa4c422196cb5cdeac

https://qiita.com/tenteko/private/ea22bd19360333f9ca85

https://qiita.com/tenteko/private/ec2f7c2f99229a55a7aa

https://qiita.com/tenteko/private/237556777f5c5546af6e

https://qiita.com/tenteko/private/264e4aca8a2ee6761a6c

https://qiita.com/tenteko/private/6e86fa0eeed9d24805ab

https://qiita.com/tenteko/private/f32baaf43fe0217b7fc7

https://qiita.com/tenteko/private/b44e1e5bfc91f6f3a52f

https://qiita.com/tenteko/private/333b9697c03561fb6158

https://qiita.com/tenteko/private/667f5f69eda60f221912

https://qiita.com/tenteko/private/eff296000ecbc7b43f07

https://qiita.com/tenteko/private/f5ea89c185b14a5952f3

https://qiita.com/tenteko/private/64a5814d35f73972bde9

https://qiita.com/tenteko/private/7981389372c7f6bdc073

https://qiita.com/tenteko/private/f6814b2e192e23298da8

https://qiita.com/tenteko/private/e3e498be93b847139a7d

https://qiita.com/tenteko/private/70f6a6588bc72acf27cf

https://qiita.com/tenteko/private/0d384ab42091434edb88

https://qiita.com/tenteko/private/a6ef98f964083d96e443

## 本日のお品書き
二日続けて手続型言語です。さくさくいきたいですね。

## FizzBuzz
```perl:fizzbuzz.pl
foreach $i ((1..100)) {
  if ($i % 15 == 0) {
    print "FizzBuzz\n";
  } elsif($i % 3 == 0) {
    print "Fizz\n";
  } elsif($i % 5 == 0) {
    print "Buzz\n";
  } else {
    print "$i\n";
  }
}
```

## おまけ；実行方法
```shell
perl fizzbuzz.pl
```
Railsで検索機能実装

## 初めに
今回は実際にindexのページに検索機能を搭載していきたいと思います。


## routes.rbにsearchを設定

```routes.rb
get 'searches' => 'courses#search'
```

## controllerに追加
```app/controllers/courses_controller.rb
def search
  @courses = Course.search(params[:keyword])
  @keyword = params[:keyword]
  render "index"
end
```

## viewページに実際に記述

```app/views/courses/index.html
<div class="container mt-5">
   <div class="row">
 　  <%= form_with url: searches_path, method: :get, local: true do |f| %>
      <%= f.text_field :keyword, value: @keyword %>
      <%= f.submit "検索" %>
    <% end %>
   </div>
 </div>
```

## モデルに記述

```course.rb

def self.search(keyword)
  where(["title like? OR body like? OR address like?", "%#{keyword}%", "%#{keyword}%", "%#{keyword}%"])
end
```
titleやbodyやaddressのように検索にヒットさせたいカラムをそれぞれ追加してあげる事で複数検索出来ると思います。

これで検索機能の実装は出来ると思います。
Code Warsでトレーニングしてみた

## Javascript編
### toString()でバイナリに変換できる！

if文の複数条件で、||のOR演算子を使うとエラーになり、完全にハマった。
腹が減ったのでタイムアップとした。

![Screen Shot 2022-11-10 at 18.24.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602730/e641b299-5100-1038-820a-e891c3e95991.png)

自分の回答↓

```javascript
function addBinary(a,b) {
  let sum = a + b;
  console.log(sum + "this is sum");

  sum = 2;
  console.log(sum + "Currently number");
  for(sum; sum !== 1;){
    
    console.log(sum + "for 1 statement is activating");
  }
```
律儀に10進数を2進数に変換する処理を作ろうとしてたが、10進数を 2進数に変換する関数があった。(そりゃあるよな...)

模範回答↓
```javascript
function addBinary(a,b){
  return (a+b).toString(2)
}
```
### メソッドチェーンはめっちゃ使える
なんかふわっとしか知らなかったメソッドチェーンだけど、案外使える。

### 良く使うjavascriptメソッド

注意点：　関数じゃないので下記のように変数に格納しないとエラーになる。

```
var 変数 = aaa.method();
```

toString()
10進数を2進数や16進数に変換できる

```javascript
	var number = 3;
	var binaly = number.toString(2);
	// [resault] -> 11
```

数字をstring型に変換できる
```javascript
	var number = 123;
	console.log(number);
	console.log("This data type is -> " + typeof number);
	// This data type is -> number.
	var str = number.toString();
	console.log(str);
	console.log("This data type is -> " + typeof str);
	// This data type is -> string.
```

reverse()
配列の要素を反転させる
```javascript
var array = ["apple","banana","orange"];
	var reversedArray = array.reverse();
	// [result] -> "orange","banana","apple"
```
replace()
stringを置換する。

```javascript
var str = "This is an sentense."
var replaceStr str.replace( /an/g , "a")
// [result] -> This is a sentense.
```
match()

sort()
配列の数値の並べ替えをしたい時に使える
```javascript
	var numbers = [1,4,2,3,5];
	console.log(numbers);
	var sortedNumbers = numbers.sort(function compareNumbers(a,b){ return a - b });
	// 降順にしたい場合は、 return b - a
	console.log(sortedNumbers);
	// [1,2,3,4,5]
```

typeof
データ型を調べられる便利なやつ
```javascript
	var str = "Hey";
	console.log("This data type is -> " + typeof str);
	// This data type is -> string
```
みたいな感じで良く使う
さらに、条件内にも使える!
```javascript
    // データ型がstringだったら
    if(typeof value === "string")
```
Pythonのスライス操作~基本操作のみ~


## 使用環境
- macOS
- Python3.9.12


## スライスとは
文字列やリストのインデックスを[インデックス:]と指定することで要素を取り出せる操作のことです。

## 使用例

- [インデックス:]と指定した場合、指定したインデックスから最後までの要素が取得できます。

※インデックスは0から始まります。'あいう' だとあ→０、い→1、う→2となります。


```python:slice.py
x = 'これはスライス文です'
y = ['a','b','c','d','e']

print(x[5:])
print(y[3:])
```

```python:出力結果
イス文です
['d', 'e']
```
xでは5番以降の要素、yでは3番以降の要素が取得できました。

次に、[:インデックス]とすると指定した場合は、インデックスより手前の要素が取得できます。
```python:slice.py
x = 'これはスライス文です'
y = ['a','b','c','d','e']

print(x[:5])
print(y[:3])
```

```python:出力結果
これはスラ
['a', 'b', 'c']
```
xでは５番目より前の要素、yでは3番目より前の要素が取得できました。
先ほどと少し違い、インデックスを除外した部分の要素を取得できます。

次は[インデックス:インデックス]の形です。

```python:slice.py
x = 'これはスライス文です'
y = ['a','b','c','d','e']

print(x[2:5])
print(y[0:3])
```

```python:出力結果
はスラ
['a', 'b', 'c']
```
xでは、2番目以降5番目未満の要素を取得しています。
yでは0番以降3番目未満の要素を取得しています。

続いては、[-インデックス:]、[:-インデックス]と、インデックスをマイナスで指定した場合です。
マイナスで指定したときは、'あいう'が、あ→-3、い→-2、う→-1となり最初は0ではありません。

```python:slice.py
x = 'これはスライス文です'
y = ['a','b','c','d','e']

print(x[-5:])
print(y[:-1])
```

```python:出力結果
イス文です
['a', 'b', 'c', 'd']
```
プラスの時と同じで、インデックスが:の左にあるときは、指定インデックスを含んだ要素が取得でき、
:の右にあるときは指定インデックスを除外した要素を取得できます。

次は[-インデックス:-インデックス]の時です。
```python:slice.py
x = 'これはスライス文です'
y = ['a','b','c','d','e']

print(x[-4:-1])
print(y[-3:-1])
```

```
ス文で
['c', 'd']
```
これもプラスの時と同じで、左のインデックスを含み、右のインデックスを除外した要素が取得できます。

最後にステップという操作についてです。
ステップは[インデックス:インデックス:数値]という形になります。
指定したインデックス内でスタートから＋数値ずつした番号の要素を取得する操作です

```python:slice.py
x = 'これはスライス文です'
y = ['a','b','c','d','e']

print(x[0:7:2])
print(y[1:4:1])
```

```python:出力結果
こはラス
['b', 'c', 'd']
```
xでは、0番から7番未満の要素で、0番から+2ずつした番号の要素を取得しています。
yでは、1番から4番未満の要素で、1番から+1ずつした番号の要素を取得しています。

最初から最後までをステップ操作したいときは、
[::数値]で出来ます。

```python:slice.py
x = 'これはスライス文です'
print(x[::2])
```

```python:出力結果
こはラスで
```
ちなみに
[::-1]とすると要素を逆順で取得できます。

```python:slice.py
x = 'これはスライス文です'
print(x[::-1])
```
```python:出力結果
すで文スイラスはれこ
```

## まとめ
技術ブログを書きたいと思っており、言語処理の勉強中に学んだことを復習のつもりでまとめました。
ここまで見てくださりありがとうございました。
多言語FizzBuzzチャレンジ22日目:PHP

## これまでのまとめ
https://qiita.com/tenteko/private/fc52f7aec63ba5f67854

https://qiita.com/tenteko/private/ca9813f0982370d0c901

https://qiita.com/tenteko/private/bc808ba59f6993019045

https://qiita.com/tenteko/private/74aa4c422196cb5cdeac

https://qiita.com/tenteko/private/ea22bd19360333f9ca85

https://qiita.com/tenteko/private/ec2f7c2f99229a55a7aa

https://qiita.com/tenteko/private/237556777f5c5546af6e

https://qiita.com/tenteko/private/264e4aca8a2ee6761a6c

https://qiita.com/tenteko/private/6e86fa0eeed9d24805ab

https://qiita.com/tenteko/private/f32baaf43fe0217b7fc7

https://qiita.com/tenteko/private/b44e1e5bfc91f6f3a52f

https://qiita.com/tenteko/private/333b9697c03561fb6158

https://qiita.com/tenteko/private/667f5f69eda60f221912

https://qiita.com/tenteko/private/eff296000ecbc7b43f07

https://qiita.com/tenteko/private/f5ea89c185b14a5952f3

https://qiita.com/tenteko/private/64a5814d35f73972bde9

https://qiita.com/tenteko/private/7981389372c7f6bdc073

https://qiita.com/tenteko/private/f6814b2e192e23298da8

https://qiita.com/tenteko/private/e3e498be93b847139a7d

https://qiita.com/tenteko/private/70f6a6588bc72acf27cf

https://qiita.com/tenteko/private/0d384ab42091434edb88

## 本日のお品書き
PHP! 久々の手続型言語でホッとしますね…。

## FizzBuzz
```php:fizzbuzz.php
#!/usr/bin/php
<?php
for ($i = 1; $i < 101; $i++) {
    if ($i % 15 == 0) {
        echo "FizzBuzz\n";
    } else if ($i % 3 == 0) {
        echo "Fizz\n";
    } else if ($i % 5 == 0) {
        echo "Buzz\n";
    } else {
        echo ($i)."\n";
    }
}
?>
```

## おまけ：実行方法

```shell
php fizzbuzz.php
```
４０代おっさんFastAPIを勉強する②

## 本記事について

この記事はプログラミング初学者の私が学んでいく中でわからない単語や概要を分かりやすくまとめたものです。
もし不正などありましたらコメントにてお知らせいただければ幸いです。

## postメソッド

Pydantic は、Python の型アノテーションを利用して、実行時における型ヒントを提供したり、データのバリデーション時のエラー設定を簡単に提供してくれるためのライブラリです。

```python
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel


class Item(BaseModel): # BaseModelを継承してItemを作る
    # データの構造を定義
    name: str
    description: Optional[str] = None
    price: int
    tex: Optional[float] = None

app = FastAPI()

@app.post("/item/")
async def create_item(item: Item): # 商品追加の関数 Itemで型アノテーションしている
    return {f"{item.name}は、税込み価格{int(item.price*item.tex)}円です。"}
```

`/docs`で確認するとドキュメントが見れることができる。

そこで`Try it out`を押すと
値を入れることができるので、そこでテストが出来ます。

## 作成したAPIをpythonで叩いてみる

test_api.pyファイルを作り、そこから動かす

```python
import json
import requests


def main():
    url = 'http://127.0.0.1:8000/item/' # エンドポイント
    # 辞書型（jsonではない）
    body = {
        "name": "としきライダー",
        "description": "仮面ライダー",
        "price": 3000,
        "tex": 1.1
    }

    # json.dumps(body) 辞書型をjsonの文字列にする。
    res = requests.post(url, json.dumps(body))
    print(res.json())

if __name__ == "__main__":
    main()
```

ターミナルで
`python3 .\test_api.py`を実行

['としきライダーは、税込み価格3300円です。']

こちらが帰ってきました。成功です。

## 入れ子構造になっているリクエストボディ

データ構造

```json
{
    "shop_info": {
        "name": "利樹のお店",
        "location": "北海道"
    },
    "items": [
        {
            "name": "としきライダー",
            "description": "仮面ライダー",
            "price": 3000,
            "tex": 1.1
        },
        {
            "name": "アッキーライダー",
            "description": "仮面ライダー2号",
            "price": 5000,
            "tex": 1.1
        }
    ]
}
```

```python
from typing import Optional, List # Listを追加
from fastapi import FastAPI
from pydantic import BaseModel

class ShopInfo(BaseModel):
    name: str
    location: str

class Item(BaseModel): # BaseModelを継承してItemを作る
    # データの構造を定義
    name: str
    description: Optional[str] = None
    price: int
    tex: Optional[float] = None

class Data(BaseModel):
    shop_info: Optional[ShopInfo] = None
    items: List[Item] # リスト形式でデータがあったため

app = FastAPI()

@app.post("/")
async def index(data: Data):
    return {"data": data}
```

`/docs`にて検証を行うことできます。

## バリデーション

```python
from typing import Optional, List 
from fastapi import FastAPI
from pydantic import BaseModel, Field # Fieldを追加

class ShopInfo(BaseModel):
    name: str
    location: str

class Item(BaseModel):
    # データの構造を定義
    name: str = Field(min_length=4, max_length=12) # 文字数を制限できる
    description: Optional[str] = None
    price: int
    tex: Optional[float] = None

class Data(BaseModel):
    shop_info: Optional[ShopInfo] = None
    items: List[Item]

app = FastAPI()

@app.post("/")
async def index(data: Data):
    return {"data": data}
```

## 参考

https://www.udemy.com/course/python-fastapi
HTMLでテキストに異なる装飾を重ねたいときに困った話

## はじめに（困ったこと）
こういうHTMLがあったとして、

```html
<span class="underline">
  undeline
  <span class="bold">bold and underline</span>
  bold
</span>
```

本当はこのように表示されてほしいのですが、
![expected.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26422/a8f136fd-7179-f506-89ce-ae80cd82b83c.png)

実際には、下記のようになってしまいます。
![unexpected.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26422/971f40ba-cc2b-83ec-9641-20833323c501.png)

末尾の `bold` は下線なしで太字になってほしいのですが、`</span>` が `<span class="underline">` の終了なのか、`<span class="bold">` の終了なのか判断できないせいか、期待どおりに表示されません。

## 回避策
下記のように、`span`タグだけで区別せず、タグを分けます。

```html
<u class="underline">
  undeline
  <b class="bold">bold and underline</u>
  bold
</b>
```

すると、下記のように期待どおり表示されます。
![expected.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26422/a8f136fd-7179-f506-89ce-ae80cd82b83c.png)

## おわりに
そもそも上記のように開始タグと終了タグがたがい違いになるHTML的にOKなのか？という疑問はありますが、リッチエディタみたいにテキストに装飾を重ねるのは、普通にありえますし、直感的に操作することを考えれば、むしろ自然なことに思えます。
そんなときは、区別したい単位でタグを変えてあげればいいよ、という短い話でした。

ではでは。