OmniAICreator/Qiita-1.07M huggingface dataset:
Google Apps Scriptの基本メソッドまとめ

私がよく使用するGASのメソッドをまとめました。使用頻度の高いものを選抜しています。


# スプレッドシートの操作

## スプレッドシートを取得

```javascript
const spreadSheet = SpreadsheetApp.getActiveSpreadsheet()
```

## シートを取得

```javascript
const sheet = spreadSheet.getSheetByName('Sheet Name')
```

## シートを追加

```javascript
const newSheet = spreadSheet.insertSheet()
```

## シート名を変更

```javascript
sheet.setName('New Sheet Name')
```

## セルの範囲を指定

```javascript
// 行番号, 列番号
sheet.getRange(1, 1)

// 行番号, 列番号, 行数, 列数
sheet.getRange(1, 1, 3, 2)

// R1C1形式
sheet.getRange('C1')

// R1C1形式
sheet.getRange('C1:D3')
```

## 最終行・最終列を取得

```javascript
// 最終行を取得
const lastRow = sheet.getLastRow()

// 最終列を取得
const lastColumn = sheet.getLastColumn()
```

## 値を取得

```javascript
const value = sheet.getRange(1, 1).getValue()
const values = sheet.getRange(1, 1, 3, 2).getValues()
const value = sheet.getRange('C1').getValue()
const values = sheet.getRange('C1:D3').getValues()
```

## 値を入力

```javascript
sheet.getRange(1, 1).setValue('foo')
sheet.getRange(1, 1, 3, 2).setValues([['foo', 10], ['bar', 20], ['baz', 30]])
sheet.getRange('C1').setValue('hoge')
sheet.getRange('C1:D3').setValues([['hoge', 10], ['fuga', 20], ['piyo', 30]])
```

## 最終行に値を入力

```javascript
sheet.appendRow(['foo', 10])
```

## 色を設定

```javascript
// 文字色を設定
sheet.getRange(1, 1).setFontColor('#ff0000')

// 背景色を設定
sheet.getRange(1, 1).setBackground('yellow')
```

# Logger

## ログを出力
```javascript
Logger.log('Hello, World!')
```

# Utilities

## 日付のフォーマット
```javascript
const date = Utilities.formatDate(new Date(), 'JST', 'yyyy-MM-dd HH:mm:ss')
```

## スリープ

```javascript
Utilities.sleep(1000)
```

# UrlFetchApp

## GET APIリクエスト

```javascript
const content = UrlFetchApp.fetch(url).getContentText()
```

## POST APIリクエスト

```javascript
const response = UrlFetchApp.fetch(url, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  payload: JSON.stringify(data)
})
```

# まとめ

他にも多くの機能が提供されているので、公式ドキュメントなどから探してみてください。

# 参考サイト

https://developers.google.com/apps-script/reference?hl=ja

https://zenn.dev/d0ne1s/articles/a4663b9cd3dce7


# 最後に
### GoQSystemでは一緒に働いてくれる仲間を募集中です！

ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site?qiita=449ece2ca2178cff1fa7
AWS環境からOCIリソースのAPI操作

## 概要
AWS EC2からPythonを使用してOCIリソースのAPI操作を行います。
今回はOCI上のComputeに対して開始操作を行います。

<font color="red">(トークンベース認証方法から通常のAPI認証に変更しました）</font>

## 構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730992/1c29e7ca-f145-fec3-f82a-ab9e204da0d6.png)

## 設定手順
* OCI資格情報取得
[コマンドライン(CLI)でOCIを操作する](https://oracle-japan.github.io/ocitutorials/intermediates/using-cli/)

* OCI Compute OCID取得
OCIコンソールにログインしてCompute>Instanceから対象のInstanceを選択してOCIDを入手します

* Python実行可能なEC2の準備
EC2にPythonをインストールします。

* ociライブラリ追加
ociライブラリを使用するのでPython実行可能なEC2にpip installコマンドを実行します
```
pip3 install oci
```

* oci config,鍵情報の配置
以下のOCI資格情報(config, oci_api_key.pem)をEC2にコピーします。
今回は以下のフォルダに配置しています。
~/.oci/config 
```config
[DEFAULT]
user=【UserIDのOCID】
fingerprint=【fingerprint】
tenancy=【テナンシOCID】
region=【リージョン】東京の場合ap-tokyo-1
key_file=/home/ec2-user/.oci/oci_api_key.pem
```
~/.oci/oci_api_key.pem
```oci_api_key.pem
-----BEGIN PRIVATE KEY-----
** 略 **
-----END PRIVATE KEY-----
```
* Pythonコード
```pythonコード.py
import oci

# Create a default config using DEFAULT profile in default location
# Refer to
# https://docs.cloud.oracle.com/en-us/iaas/Content/API/Concepts/sdkconfig.htm#SDK_and_CLI_Configuration_File
# for more info
config = oci.config.from_file("/home/ec2-user/.oci/config")

# Initialize service client with default config file
core_client = oci.core.ComputeClient(config, service_endpoint='https://iaas.【リージョン】.oraclecloud.com')

# Send the request to service, some parameters are not required, see API
# doc for more info
instance_action_response = core_client.instance_action(
    instance_id="【開始するComputeのOCID】",
    action="START")
# Get the data from response
print(instance_action_response.data)

```
## 実行結果
成功すれば以下のようなレスポンスが返ってきます。
また、OCIコンソールで該当Computeを確認すると開始に成功しています。
```
$ python3 pythonコード.py
{
  略
  "display_name": "開始するComputeのインスタンス名",
  "id": "開始するComputeのOCID",
  略
  "lifecycle_state": "STARTING",
  略
}
```
Gnuplotでヒストグラムをつくる

# はじめに
gnuplotを用いてヒストグラムを作成する際の様々な調整をするコードを備忘録的に書き留める。

# 動機
卒論関係でヒストグラムを作る必要性が生じたが、Excelでは作業が非常に煩雑だしラボの先輩が使っているRは難しそうという理由で前々から気になっていたgnuplotを触ってみることにした。

# 本題
使ったコードを説明を交えながら羅列する。必要に応じて追加したり飛ばしたりして思い描いた通りのヒストグラムにする。

```
set style fill solid 0.2
```
「fill solid number」で塗りつぶしを指定する。0だと背景色と同じで1だと全て塗りつぶす。個人的には0.2でやってみたらちょうど良かったので0.2としてある。
 solidの他にpatternやemptyを指定することができる。　
```
filter(x,y)=floor(x/y)*y
```
よく分かっていないがこれをするとうまくいく。解説は参考文献に譲る。
[gnuplotでヒストグラムをつくる](https://qiita.com/harple/items/3a1d809d7073a07672b0)

```
set xlabel "length"
set ylabel "number"
set xrange [0:14]
set yrange [0:10]
```
X軸,Y軸の説明とX軸,Y軸の表示範囲
```
set boxwidth 0.5 absolute
```
　軸の太さ。下で0.5刻みでヒストグラムを作るようにしているが軸の太さが1のままだとヒストグラム同士が重なって非常に見づらい。そのためヒストグラム同士が接するように0.5に設定した。
　absoluteのところをrelativeにすることもできる。relativeにするとどうやら度数によって軸の太さが変わるようだ。
```
plot "hoge.txt" u (filter($1,0.5)):(1) smooth frequency with boxes
```
ヒストグラムをつくりたいデータを持ってきて描画する。u以下は参考文献に詳しく書かれている。[gnuplotでヒストグラムをつくる](https://qiita.com/harple/items/3a1d809d7073a07672b0)

# 
これである程度使えるレベルのヒストグラムにはなった。

# その他
gnuplotの精義という本に色々載っていた。便利
今後も使うと思う。
AWS Skill Builder で無料でAWSを勉強する

AWSについてのオンラインレッスンが受けられる『[AWS Skill Builder](https://skillbuilder.aws/jp)』を始めてみました。
無料アカウントでも300以上（英語版は600以上）のコースが受講できます。

https://skillbuilder.aws/jp

AWSアカウントとは別物のAmazonアカウントで登録するなど、少しややこしかったので、登録の仕方からコースの選び方までをまとめます。

# 無料アカウントを作成
AWSのアカウントでログインしようとすると、「このEメールアドレスを持つアカウントが見つかりません」と怒られて、最初からつまづきます。
『AWS Skill Builder』には、AWSアカウントではなく、Amazonアカウントでログインする必要があります。Amazonアカウントを持っていなければ、作成しましょう。
![スクリーンショット 2023-09-15 17.47.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556627/7626c4d6-3142-964a-cdf4-d4d145419645.png)

# 日本語表記に変更する
最初から英語なので、英語が苦手な人は迷わず日本語に変更しましょう。
![スクリーンショット 2023-09-15 17.52.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556627/8726a467-8a82-50c3-04b0-14d6755c41c9.png)

# ログインできたら再度、日本語表記に
ログインすると、また英語なので、日本語に変更します。

メニューアイコン（User menu）をクリックして開き、「My account」の設定ページへ行きます。
![スクリーンショット 2023-09-15 18.03.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556627/37382ee0-bf91-973e-1991-a9f32797d8a7.png)

「Preferences」の設定を開き、「Languages」を日本語に変更して、「SAVE CHANGES」ボタンをクリックすると、日本語表記に変更されます。
![スクリーンショット 2023-09-15 18.03.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556627/3df4b588-eaf5-0632-498c-c5ecca09bc48.png)


# サブスクリプションは一旦無視
1 か月あたり 29 USD でサブスクリプションに登録できます。
今回は、”無料” でAWSを勉強するため、一旦無視します。

## もし、サブスクリプションに登録すると…
『AWS Builder Labs』が利用できたり、『AWS Cloud Quest（英語のみ）』などの面白そうなコースも受講できます。

### AWS Builder Labs
125 を超えるセルフペース型の AWS マネジメントコンソールサンドボックスです。
料金のかからない AWS マネジメントコンソールで実践的にクラウドスキルを学べます。

https://aws.amazon.com/jp/training/digital/aws-builder-labs/

### AWS Cloud Quest （英語のみ）
ロールプレイングゲームを進めながら勉強ができます。
課題をクリアしてデジタルバッジを獲得し、仮想都市を構築しましょう。
「AWS Cloud Quert: Cloud Practitioner」は無料アカウントでも受講できます。
![スクリーンショット 2023-09-15 18.38.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556627/6591303c-7513-6201-4cbd-2f9e1260aa34.png)

# 無料コースを選ぶ
コースが沢山あるので、フィルターを利用して、日本語の無料コースを探します。

- 「価格」 → 「無料」を選択
- 「言語」 → 「その他のオプションを見る」を開き「日本語」を選択

さらに、検索窓で勉強したいことに関するキーワードを入れると、対象のコースが見つけやすいです。

![スクリーンショット 2023-09-15 18.49.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556627/a1c59c4d-ee13-24ef-3595-c04aa3d64601.png)

# 無料コースを受講してみた感想
まだ始めたばかりなので、1コースしか受講していませんが、無料とはいえ、レッスンの内容は濃く充実している印象です。
知りたいことを調べるだけだと全体を知らないままになりますが、受講したレッスンでは、全体から入って詳細を学んでいける流れでした。「なんとなく知っている」から「きちんと理解している」レベルになれると思います。
勉強を進めることでAWS認定試験の勉強にもなります。
なんといっても無料なのが素晴らしいです。
Middlewareについて

今回は[前章](https://qiita.com/wc_sangen/private/a32012693458719deb17)からの続きで``zio-http``のMiddlewareについて見ていきます。

# ``zio-http``のMiddleware

今回は既存の``ApplicationServiceImpl.scala``の``getCookie``関数、``postApi``関数の末尾に付与されている文字化け対策のためのヘッダ付与処理を共通化し、個々の関数毎にこのようなヘッダ付与処理を加える必要がなくなるようにMiddlewareを利用していきます。

Middlewareは上記のように複数のパスについて共通するような処理を共通化するなどといった目的のために使います。

今回のような単純なレスポンスヘッダの付与以外にもベーシック認証、ロギング、様々な認証処理のために利用できます。

# 具体的な利用例

Middlewareの使い方について詳しく見ていきます。
まず以下の様にコードを修正します。

```scala:ApplicationServiceImpl.scala
case class ApplicationServiceImpl(client: Client) extends ApplicationService {
(中略)

  override def getCookie(request: Request): ZIO[Any, Throwable, Response] = for {
(中略)
  } yield Response.text(cookie)
(中略)

  override def postApi(param:String): ZIO[Any, Throwable, Response] = for{
(中略)
  } yield Response.text(s"http://localhost:8080/postTest:$data")
}

```

``getCookie``関数、``postApi``関数の末尾から``.setHeaders(Headers("Content-Type", "text/plain;charset=UTF-8")) // 文字化け対策をしています``を削除しています。

``MainApp``について以下のように修正します。

```scala:MainApp.scala
object MainApp extends ZIOAppDefault {

  override val run: ZIO[Any, Throwable, Nothing] =
    Server
      .serve((TestController() @@ HttpAppMiddleware.addHeader("Content-Type", "text/html;charset=UTF-8")).catchAllCauseZIO { _ =>
        // エラー処理
        ZIO.succeed(Response(status = Status.InternalServerError))
      })
      .provide(
        Server.default,
        ApplicationServiceImpl.layer,
        Client.default
      )
}
```

修正後、実行し、例えば``http://localhost:8080/postApi/test``にアクセスすると以下の出力が文字化けすることなく得られます。

```shell
http://localhost:8080/postTest:あなたの名前はtestです。
```

また、レスポンスヘッダに対しても``Content-Type:text/html;charset=UTF-8``が設定されていることが確認できるかと思います。
さらに例えば``http://localhost:8080/text``

## Middleware利用部分

今回削除した``.setHeaders(Headers("Content-Type", "text/plain;charset=UTF-8"))``という処理を別の場所で代わりに行うために``MainApp``を修正しています。
以下の部分になります。
```scala:MainApp.scala
TestController() @@ HttpAppMiddleware.addHeader("Content-Type", "text/html;charset=UTF-8")
```

レスポンスヘッダを付加するMiddlewareは``HttpAppMiddleware.addHeader``になりますので、それを使っています。
そして、そのMiddlewareを``@@``関数でコントローラに対して登録しています。

# 終わりに

今回はレスポンスヘッダをMiddlewareを使い付与する例を見てきました。
その他にもベーシック認証については以下の様に追加することができますので、ご確認頂ければと思います。

https://zio.dev/zio-http/examples/advanced/middleware-basic-authentication

次回は単体テストについて見ていきます。

前章:[外部Web APIアクセス](https://qiita.com/wc_sangen/private/a32012693458719deb17)
次章:[単体テスト](https://qiita.com/wc_sangen/private/0a7ae5ebbdaded369bdc)

# 演習

1. 今回のレスポンスヘッダ付与の例について実際に動かし、挙動を確かめてください。
    - 解答例は以下になります。
https://github.com/hatuda/zio-practice/tree/CHAPTER8
PythonプログラムでWordに画像を挿入する方法

Wordドキュメントを作成する際、必要な位置に画像を挿入することは良い選択肢です。これにより、文書の内容が豊かになるだけでなく、優れた視覚効果によって読者の関心を引くこともできます。では、この機能をプログラムでどのように実現するかを見てみましょう。以下に関連するメソッドとコードの紹介があります。

## ツール
* Visual Studio Code
* [Spire.Doc for Python](https://www.e-iceblue.com/Introduce/doc-for-python.html)

このプロフェッショナル ライブラリは、[Word ドキュメントの作成](https://www.e-iceblue.com/Tutorials/Python/Spire.Doc-for-Python/Program-Guide/Document-Operation/Python-Create-Read-or-Update-a-Word-Document.html)、[Word から PDF への変換](https://www.e-iceblue.com/Tutorials/Python/Spire.Doc-for-Python/Program-Guide/Conversion/Python-Convert-Word-to-PDF.html)など、Python プラットフォームでの Word ドキュメントの処理をサポートします。

## インストール方法
* まず、[Pythonをダウンロードしてインストール](https://www.python.org/downloads/)します。
* VS Code で「Extensions」をクリックし、「Python」を検索してインストールします。
* 「Explorer」-「NO FOLRDER OPENED」-「Open Folder」をクリックします。
* 既存のフォルダーをワークスペースとして選択するか、新しいフォルダーを作成することもできます。
* そのフォルダーに「.py」 ファイルを追加し、任意の名前を付けます。
* 「Terminal」-「New Terminal」をクリックします。
* 次のコマンドを入力して、[Spire.Doc for Python](https://www.e-iceblue.com/Introduce/doc-for-python.html) と plum-dispatch v1.7.4 をインストールします。
```python
pip install Spire.Doc
```

## コード：
```python
from spire.doc import *
from spire.doc.common import *

#Documentオブジェクトを作成する
doc = Document()

#セクションを追加する
section = doc.AddSection()

#セクションに段落を追加する
paragraph = section.AddParagraph()

#段落にテキストを追加する
paragraph.AppendText("Wordドキュメントに画像を挿入します。")
paragraph.ApplyStyle(BuiltinStyle.Heading2)

#段落に画像を追加する
picture = paragraph.AppendPicture("image.png")

#画像の位置を設定する
picture.HorizontalPosition = 150.0
picture.VerticalPosition = 60.0

#画像のサイズを設定する
picture.Width = 120.0
picture.Height = 140.0

#画像にテキストの折り返しスタイルを設定する
picture.TextWrappingStyle = TextWrappingStyle.Through

#結果文書の保存
doc.SaveToFile("WordImage.docx", FileFormat.Docx)
doc.Close()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/31af36c8-970e-4569-4701-d46c514f2d6f.png)
上記のコードでは、AppendPicture()メソッドを使用して指定した画像を追加した段落に挿入しています。そして、プロパティを設定して、画像の位置、サイズ、およびテキストの折り返しスタイルを調整します。
manjaro linux インストール後にする事

Manjaro Linux MATEを使ってます。


# ミラーサーバ

```bash
sudo pacman-mirrors -c Japan
```

# 更新

```bash
sudo pacman -Syyu
```

# 日本語入力環境

```bash
sudo pacman -S fcitx-im fcitx-mozc
```
~/.xprofile (無ければ作成)
```bash
export LANG="ja_JP.UTF-8"
export XMODIFIERS="@im=fcitx"
export XMODIFIER="@im=fcitx"
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export DefaultIMModule=fcitx
```
# ディレクトリ名を英語

```bash
sudo pacman -S xdg-user-dirs-gtk
LANG=C xdg-user-dirs-gtk-update
```
# 日本語フォントをインストール

```bash
pamac install ipa-fonts ttf-sazanami noto-fonts-cjk noto-fonts-extra
```
# ビルド関連バッケージのインストール

```bash
sudo pacman -S --needed base-devel
sudo pacman -S --needed make m4 gcc patch ed pkg-config file git cmake
```
# yay の導入

```bash
sudo pacman -S yay
```

# SSD環境でのTRIM

```bash
sudo systemctl enable fstrim.timer
sudo systemctl start fstrim.timer
```
# chrome, vscode ...

```bash
yay -S google-chrome
yay -S visual-studio-code-bin
```
絵文字等のサロゲートペアを含んだ文字列からランダムに文字を取得する方法

# 結論

[コメント](https://qiita.com/ryo2020/items/81f7502e0efcc1dfc80f#comment-181731f3482063d7535f)で有益なご指摘を頂いております。ご参考に。

```js:

// 16 文字
const str = "😀A😁B😂C😃D😄E😅F😆G😇H";

const surrogate = [...str];
const length = surrogate.length; // 16
const max = length - 1; // 15
const index = Math.floor(Math.random() * max); // [0-15]

const char = surrogate[index];

console.log(char);
```

了
OpenShiftにInstanaを導入しアプリのパフォーマンス監視を行う（２）- アプリのデプロイ編

# 前回のおさらい
前回はホストにInstanaエージェントを導入するところまで行いました。今回はS2I(Source to Image)というOpenShiftの機能を使い、監視対象となるアプリケーションをデプロイします。

前回の記事はこちら

https://qiita.com/Sung-backyard-arson/private/12f8202f9c5c9b0b77d6


# 必要なもの
+ OpenShiftクラスター
+ GitHubアカウント
+ デプロイするアプリケーション
    今回は[こちら](https://github.com/Sung-backyard-arson/django-ex)のアプリケーションを使用します。これは、[Exmample Health](https://github.com/osonoi/node-build-config-openshift)というNode.jsアプリケーションを、Djangoを使って書き換えたものになります。


# OpenShitに監視対象のアプリをデプロイ
デプロイの手順は[openshift-s2i-lab](https://github.com/IBMDeveloperTokyo/openshift-s2i-lab)のREADMEが非常に参考になりますので、手順に沿って進めてください。ただし、デプロイするアプリケーションの違いにより内容が異なる部分がありますので、見出しごとに以下で説明します。

### 2.2 リポジトリーのFork
+ Fork元のリポジトリは https://github.com/Sung-backyard-arson/django-ex になります。

### 3.3 デプロイするアプリケーションのソースコードを指定
+ GitリポジトリーURLは https://github.com/Sung-backyard-arson/django-ex.git になります。
+ コンテキストディレクトリーの設定はデフォルトのままで大丈夫です。
![ImportFromGit_edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556016/06b640cf-f4cc-25f5-1a56-1ec5a251bdca.png)

### 3.4 デプロイするアプリケーションのタイプを選択
+ 今回はDjnagoに書き換えたので、下の画像のようにPythonになっていればOKです。
![BuilderImage_edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556016/fe16654d-f287-0631-b6fb-a448d2a4196a.png)

### 5.1 ソースコードの修正
+ index.html は django-ex/welcome/templates/test/site/public 下にあります。
+ 「Example Health」を日本語の「医療管理」に変更する行は25行目になります。
![SouceCodeEdit_edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556016/0485fca9-0aef-0206-c8f4-a400bf3e4da2.png)


無事にデプロイできたでしょうか。
次はデプロしたアプリケーションに意図的にエラーを起こして、その様子をInstanaで監視していきます。（３つ目の記事は今しばらくお待ちください...）
プログラミング学習ロードマップ

# プログラミング学習ロードマップ

2023/09/22現在

学習開始後、3ヶ月が経過しました。
プロゲート、kindleUnlimited、YouTubeを主な教材とし、独学ですすめています。
現在、Pythonの学習に入ったところです。
プログラミングを学習したいけれど、何から手をつければいいのか分からないという方は、参考にどうぞ。
網羅的なロードマップですが、すべての言語をやる必要はないです。
やってみて面白いとか、専門にしたい言語がみつかったらその言語を深く学んでいってください。

## 2023/06/14学習開始

- [x] プロゲート初級講座  --2023/07/01学習完了

- [x] VSCode導入
- [x] MarkDown記法

## KindleUnlimited,YouTubeでの学習

- [x] HTML,CSS
- [x] JavaScript
- [x] Git,GitHub
- [x] PowerShell
- [x] 正規表現
- [x] ローカル環境構築(XAMPP)
- [x] PHP
- [x] Laravel
- [x] SQL
- [x] Kotlin
- [x] Python
- [ ] Node.js
- [ ] JQuery
- [ ] React
- [ ] Sass
- [ ] Docker
- [ ] Swift
- [ ] Objective-C
CircleShapeとRoundedCornerShape(50)、どちらが良いのか

こういう角丸にしたいときに使うやつ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53293/849b438e-fe8a-375d-358c-e615ff6db3c4.png)


## 結論

実装としては、どっちでも同じです。

```kotlin
/**
 * Circular [Shape] with all the corners sized as the 50 percent of the shape size.
 */
val CircleShape = RoundedCornerShape(50)
```

https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/shape/RoundedCornerShape.kt;l=116;drc=3ccd16a5c435fc57c6e1931241c91dd4bf10ea93

## その他

material3では`CircleShape`を使用しているようです。
https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Shapes.kt;l=176;drc=e058f29fc93d5ab6e9489b3a2eb8246599f2704e
iOSDC Japan 2023に参加しました！

# はじめに
iOSDC Japan 2023に今年も参加しました。
今年は、初のオフライン参加＆企業ブース参加でした！
残念ながらDay2は参加できなかったのですが、前夜祭から少しずつタイムシフトを見ています。
去年と引き続き、全体的な感想と印象に残ったトークの感想を書いていきます。

イベントの詳細については、[公式サイト](https://iosdc.jp/2023/)をご覧ください。
※トークの動画については後日Youtubeにアップロードされるそうです。

https://youtube.com/playlist?list=PLod2oSGQp3W50gC5c3NxWMWuRKFfTWRj2&feature=shared

# 全体的な参加の感想
初めてのオフライン参加でしたが、オフラインチケットも完売しており、参加者も多かったです。
トークだけでなく、企業ブースやポスターセッションも非常に賑わっていました。
最寄りのコンビニまで距離があったので、お菓子や軽食、飲み物が提供されていたのはとても良かったです。

当日の会場の様子は運営さんが写真を上げていますのでそちらをご覧いただければと思います。

https://photos.google.com/share/AF1QipNFYcoT0g9XcxuTm8rsNZp7i4JrBKj10iTzj4abxZfTfwTIEzHPF0OSow6P4ClskA?key=VmVfLTU1aWExX1BRX21KMDJhajZqRktmZngzWmt3

# 前夜祭
## Appleにおけるプライバシーの全容を把握する
プライバシー関連の概要情報がまとまった発表で開発に役立つ情報が盛りだくさんでした。

プライバシー関連のリクエストは、Webの情報からなんとなく設定しがちの部分でした。改めて目的文字列の書き方や審査の観点を理解できたのはとても良かったなと思いました。
iOS14からは写真の取得に関しては、PHPickerViewControlerを利用すれば、許可がなくとも写真の読み書きができるという情報は収穫でした。今後の開発に活かせそうです。

最新のトピックとして、PrivacyManifestやRequiredReasonAPIの対応が必須になる点についても触れられていて情報としてとても助かりました。
UserDefaultsも対応の範囲に含まれているため、他のAPIと合わせて早めの調査・対応が必要そうです。

[Appleにおけるプライバシーの全容を把握する by akatsuki174 | トーク | iOSDC Japan 2023 #iosdc - fortee.jp](https://fortee.jp/iosdc-japan-2023/proposal/c9247098-377a-4288-be71-5e210d330042)

## UIKit ベースの Custom UIContentConfiguration API を用いた複雑なカスタムセルの作り方
Configurationを利用してカスタムセルを作成するメリットや実装方法、注意点などについて詳しく学ぶことができました！

Configurationの仕組みとして、Viewを使い回しても描画時にリセットされるというのは非常に便利だなと感じました。
ContentConfigurationは別種類のセル同士で使い回しができるというのも助かる仕組みだと感じました。今までヘッダーと中身でカスタムセルを分けるといったことをしていましたが、そういった手間がなくなるのは大きいなと思います。

[UIKit ベースの Custom UIContentConfiguration API を用いた複雑なカスタムセルの作り方 by shimastripe | トーク | iOSDC Japan 2023 #iosdc - fortee.jp](https://fortee.jp/iosdc-japan-2023/proposal/e0cf0ad8-5334-49bf-bb13-04286c5e21d7)

# Day1
## 基礎から理解する！来年春までに対応すべきプライバシーの変更点
プライバシーに関して復習編、予習編と２段構成のトークでした。

前夜祭の「[Appleにおけるプライバシーの全容を把握する](https://fortee.jp/iosdc-japan-2023/proposal/c9247098-377a-4288-be71-5e210d330042)」よりも深掘りした内容で非常に参考になりました。
PrivacyManifest、コード署名で具体的に設定する内容について触れられており、対応のイメージが湧いて良かったです。
UserDefaultsについてもRequiredResonAPIに指定されている理由が把握できていなかったのですが、フィンガープリントの防止という説明があり、納得できました。

[基礎から理解する！来年春までに対応すべきプライバシーの変更点 by kamimi / かみみ | トーク | iOSDC Japan 2023 #iosdc - fortee.jp](https://fortee.jp/iosdc-japan-2023/proposal/d88b8692-7b99-4e2b-bdea-55d94b2c9952)
半年でGoogle Cloud全資格制覇!? 社会人2年目の資格体験記

みなさん、こんにちは！
今回は、社会人2年目(2022年新卒)の私が、Google Cloudの認定資格を半年間で10資格取得した経験をお伝えしたいと思います！
私は、Google Cloud認定資格全11資格のうち10資格を取得しています！ 
Google Cloud未経験だが興味はあるといった方や、資格取得を目指している方にお読みいただけると嬉しいです。

## 経歴
・2022年入社(新卒2年目)
・初期配属から現在まで、ずっとGoogle Cloud案件を担当
・Google Cloud以外のパブリッククラウドはあまり触ったことがない(AWSのみ1資格取得)

## きっかけ:Google Cloudの知識不足による危機感

2022年秋の初期配属からずっとGoogle Cloud案件を担当していましたが、2023年春、突然直属の上司が案件から抜けることになりました。
それまでGoogle Cloud資格を1つも取得していなかった私は、上司の不在で「Google Cloudの知識を更に深めなければ！」という危機感を強く感じました。この危機感が、私を資格取得へと導いてくれました。

## 資格取得への道のり:半年で10資格を取得！

2023年4月4日、私は最初の認定試験に挑戦しました。そして、それからわずか半年間で10資格を取得することができました！
幸いなことに、これまで1度も不合格になることはなく、順調に取得することができました。
各資格の取得日は以下の通りです。4月4日から9月16日までに、Professional Cloud DevOps Engineerを除く、全10資格を取得しました。
![スクリーンショット 2023-09-19 23.57.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3560545/a6438fbd-d9e8-ed1f-29d9-477d801c54c4.png)
 
 

## 4つの勉強法

以下の4つの方法で学習を進めました。

1. **基礎固め**: まず、["図解即戦力 Google Cloudのしくみと技術がこれ1冊でしっかりわかる教科書"](https://gihyo.jp/book/2021/978-4-297-12301-7)という書籍で、Google Cloud全体の特徴や仕組みを1から学びました。

2. **試験対策方針を立てる**: 次に[「株式会社G-genの社員さんが投稿されている試験対策マニュアル」](https://blog.g-gen.co.jp/archive/author/ggen-sugimura)を参照しました。このブログでは、出題内容や勉強方法などを資格別にまとめてくれているので、学習の方針を立てやすかったです。

3. **公式ドキュメントで理解を深める**: Google Cloudの公式ドキュメントを読むことで、機能ごとの理解を更に深めました。

4. **問題集で総仕上げ**: Udemyの問題集を利用して試験対策を行いました。何度も問題を解き、最終的に8-9割正解するまで続けました。問題と回答の意味を根本的に理解し(分からないことがあれば、その都度調べる)、どのような出題方法でも解くことができるよう対策しました。どうしても分からなければ、諦めて丸暗記することもしていました！


## 実戦経験も強い味方

実際の業務でGoogle Cloudを利用していたので、資格勉強でハンズオンを徹底して行う必要はありませんでした。しかし、Google Cloudが提供するクイックスタートやチュートリアルなどのハンズオン形式の問題は、基本的な理解を深めるために少し行いました。

## 最後に
資格勉強を通して、案件で実際に使用しているサービス以外のことを学び、Google Cloud全体を学ぶ良い機会になりました。私は初めてのパブリッククラウドがGoogle Cloudで、非常に面白いと感じたので、初心者の方はぜひGoogle Cloudから始めてみてください！
Professional Cloud DevOps Engineerの取得が残っているので、引き続き頑張りたいと思います！


各資格の対策や受験体験記は改めて投稿したいと思っていますので、またぜひ読んでください！

【2023/10追記】
(2023年9月末に、「Professional Cloud DevOps Engineer」を取得し、全冠することができました！)
PowerVS IBM i 日記(55): 2023/9 の Release notes より．Power®10 S1022 利用可能, IBM i 7.3 延長サービス費用追加


まだ日本語翻訳が出ていませんが、Power VS の Release note に 2023/9 の更新情報が追記されました。

* [September 2023](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-release-notes&locale=en#sep-2023)

:::note info
2023/09/27 追記
2023/09/27 に確認したところ、日本語訳が提供されていました。
* [September 2023](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-release-notes&locale=ja#sep-2023)
:::


二つのトッピックが記載されています。

* Power®10 S1022 利用可能
* IBM i 7.3 延長サービス費用追加

# Power®10 S1022 利用可能

> **Introduction of Power Systems Virtual Server S1022 processor** : The Power®10 S1022 (9105-22A) is now available in WDC07 data center. As we progress, additional data centers will be made available.

Power®10 S1022 が利用可能になりました。現在はまだ WDC07 だけですが、今後、他の DC でも利用可能になります。

## WDC07 の選択

日本語設定でワークスペースを作成しようとすると「ワシントンDC」が3つならんで、どれが WDC07 なのか判別がつきません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/5abadde5-5f7c-22af-5908-c1077e274dbe.png)

IBM Cloud ポータルではブラウザー言語の設定を更新毎に確認します。
ブラウザー言語の言語設定を「英語」にして、ページをリロードしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/9565b2c7-311c-c04b-8e42-790385977f61.png)

WDC07 が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/df4c7a92-d130-6280-cb29-f1fb264aabfa.png)

## S1022 の選択

S1022 を選択するためには、イメージが Power 10 サーバーに対応している必要があります。
AIX は 7.1 以降で対応していますが、**IBM i は 7.3 以降で対応**になります。
IBM i 7.2 以前を選択していると、マシン・タイプに S1022 はリストされません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/0f86e6f5-5713-ca26-e492-68eb4b215b57.png)

# IBM i 7.3 延長サービス費用追加

> **IBM i 7.3 service extension pricing** : Effective 1 October 2023, IBM i 7.3 on Power Systems Virtual Server is at end of normal support and will be in service extension. Service extension pricing will be automatically added to the IBM i charge for IBM i 7.3 usage.

IBM i のバージョン毎の EOS は下記で確認可能です。
IBM i 7.3 は 2023/09/30 で EOS を迎えます。

* [Release life cycle](https://www.ibm.com/support/pages/release-life-cycle)

EOS 後にもサポートを受けられる形でご利用いただくために、延長サービス(service extension)の費用が2023/10 分より自動的に追加されます。

なお、すでに EOS を迎えている IBM i 7.1/7.2 には延長サービス(service extension)の費用が追加されています。

---
当日記のIndexは[こちら](https://qiita.com/6onoda/items/f146c78c0c1bbe905a42)です。

---
許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
AWS CDKもまずは環境構築から

AWS CDKを使ってみよう！と意気込んだものの、利用するための環境がなければどうしようもありません。
Cloud9を使うのも一つの手ですが、今回はWSL2（Ubuntu）を使って環境を整えていきます。

## バージョン管理ツールの導入

バージョン管理にはasdfを利用します。
細かい手順や別環境への導入はasdfのガイドを見ながら行うのが良いかと思います。
https://asdf-vm.com/guide/getting-started.html
~~~
apt install curl git
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.13.1
~~~

~/.bashrcの末尾に以下の2行を追加します。
~~~
. "$HOME/.asdf/asdf.sh"
. "$HOME/.asdf/completions/asdf.bash"
~~~

asdfの導入はこれで完了です🎉

## aws-cdkのインストール

記事を書いているときのAWS CDKのプライマリ言語はTypeScriptとなっているので、TypeScriptを利用します。
TypeScriptを利用するためには、Node.jsが必要となりますのでNode.jsのインストールから進めていきます。

### Node.jsのインストール

まずは、どのようなバージョンがあるかを確認します。
~~~
asdf list all nodejs
~~~

ずらっと出てきますが、今回は18.18.0を導入します。
~~~
asdf install nodejs 18.18.0
asdf global nodejs 18.18.0
~~~

グローバルバージョンは ~/.tool-versionsに記載されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533080/908643a8-e06b-6d4d-4509-a1ec4f0ce8fd.png)

余談ですが、Node.js 14を導入していた環境でaws-cdkを利用しようとしたところ、
バージョンが古いから16以降にあげろとエラーで怒られたことがありました。
今回はその反省も踏まえて、LTSである18.18.0を選択しています。
導入時にはぜひその時のLTSを確認して導入してください。

### TypeScriptのインストール

npmを使ってインストールしていきます。
~~~
npm install -g typescript
~~~
typescriptのバージョンの確認は以下のコマンドで利用できます。
~~~
npm show typescript version
~~~

### aws-cdkのインストール

公式リファレンスを参照しています。
https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/getting_started.html

npmを使ってインストールしていきます。
~~~
npm install aws-cdk-lib
~~~

'cdk'というコマンドを利用できるように、エイリアスの設定をしておきます。
~~~
alias cdk="npx aws-cdk"
~~~

## プロジェクトの作成

以下の公式リファレンスを参照しています。
https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/work-with-cdk-typescript.html

作業ディレクトリを作成し、移動して、プロジェクトの初期化を行います。
~~~
mkdir aws-cdk
cd aws-cdk
cdk init app --language typescript
~~~

初期化が完了すると、依存関係も含めてインストールされた状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533080/76bc6c93-83f5-59c3-5fbf-7cd44a8c64b7.png)

以上で完了です！🎉　おつかれさまでした
iOS URLのQueryに使うvalueをパーセントエンコーディングする

# まとめ
URLのQueryのvalue用のCharacterSetを作成して、`addingPercentEncoding`を使ってパーセントエンコーディングを行います。

# はじめに

例えば、パーセントエンコーディングしたいクエリを含んだURLを生成したいと思います。
今回はURLComponentsでURLを組み立ててみることにします。
クエリはパーセントエンコーディングしたいので、`addingPercentEncoding`で`urlQueryAllowed`を設定してURLを生成してみました。

```swift
var c = URLComponents()
c.scheme = "https"
c.host = "example.com"
c.path = "/book"
c.query = "title=独習C++".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)

let myUrl: URL = c.url!

print(myUrl) // https://example.com/book?title=%25E7%258B%25AC%25E7%25BF%2592C++
```
一見日本語の部分がパーセントエンコーディングされているのでうまくいっているように見えますが、titleに含まれている`+`がエンコーディングされていません。

Queryのパーセントエンコーディングに必要な文字の参考として
[WikipediaのQuery string](https://en.wikipedia.org/wiki/Query_string#URL_encoding)を参考にしています。

> - SPACE is encoded as '+' or '%20'
> - Letters (A–Z and a–z), numbers (0–9) and the characters '~','-','.' and '_' are left as-is
> - '+' is encoded by %2B

ですが、CharacterSet.urlQueryAllowedには`+`が含まれているため、addingPercentEncodingでは+のエンコーディングが除外されます。

CharacterSetに含まれている文字は以下のようなコードで確かめられます。
参考: https://stackoverflow.com/questions/43322441/is-there-any-reasonable-way-to-access-the-contents-of-a-characterset/51200984#51200984

```swift
var offset = 0
for ( var i, w ) in CharacterSet.urlQueryAllowed.bitmapRepresentation.enumerated() {
    if i % 8193 == 8192 {
        offset += 1
        continue
    }
    i -= offset
    if w != 0 {
        for j in 0 ..< 8 {
            if w & ( 1 << j ) != 0 {
                if let unicodeScalar = Unicode.Scalar(i * 8 + j) {
                    print(unicodeScalar)
                }
            }
        }
    }
}
```

urlQueryAllowedは個別のクエリのvalueためのものではなく、クエリ全体のテキストに対するAPIの想定かと思われます。

https://developer.apple.com/documentation/foundation/nscharacterset/1416698-urlqueryallowed

> For example, in the URL http://www.example.com/index.php?key1=value1#jumpLink, the query component is key1=value1.

ですので、クエリのvalue用のCharacterSetを作成することでクエリのvalueに対応します。

# クエリのvalue用のCharacterSetを作成
前出のQuery stringのURL encodingの条件、英数字と一部記号を含めたCharacterSetを`urlQueryValueAllowed`として用意します。

```swift
extension CharacterSet {
    static var urlQueryValueAllowed: CharacterSet {
        .alphanumerics.union(.init(charactersIn: "~-._"))
    }
}
```

addingPercentEncodingを行ってみます。
```swift
var c = URLComponents()
c.scheme = "https"
c.host = "example.com"
c.path = "/book"
c.queryItems = [.init(name: "title", value: "独習C++".addingPercentEncoding(withAllowedCharacters: .urlQueryValueAllowed))]

let myUrl: URL = c.url!

print(myUrl) // https://example.com/book?title=%25E7%258B%25AC%25E7%25BF%2592C%252B%252B
```

無事、日本語や+も含めたパーセントエンコーディングが成功しました。
Express+SQLite3備忘録1

WebアプリにてJavascriptオンリーで、データベースへの接続が手できれば便利だなと思い、試してみました。手軽さを求め、WebサーバーはNode.js+Expressで、データベースはSQLite3を利用しています。

node.jsとsqlite3がインストールされている前提とします。
Expressの使い方については、[こちら](https://qiita.com/watmot/items/90e304eba121a1bed352)でも使い方の例を載せています。

# 準備
プロジェクト用のフォルダを作成し、そのフォルダに移動して初期化処理を行います。
```terminal
npm init -y
```
Expressとejsとsqlite3をインストールします。
```terminal
npm install express
npm install ejs
npm install sqlite3
```

# SQLite3にてデータベースの作成
プロジェクト内のフォルダにてSQLite3のデータベースファイル「sample_data.db」を用意し、テーブル名「bbteams」として、以下のようなテーブルを作成しておきます（Windows環境であればPupSQLiteを利用するとGUIで対応できます）。

```sql
CREATE TABLE "bbteams" (
[id] INTEGER,
[team] TEXT,
[place] TEXT,
PRIMARY KEY([id])
);
```

|id|team|place|
|:-|:---|:----|
|1|タイガース|兵庫
|2|カープ|広島
|3|ベイスターズ|横浜
|4|ジャイアンツ|東京
|5|スワローズ|東京
|6|ドラゴンズ|名古屋

# ファイルの配置
ejsファイルをプロジェクト内のviewsというフォルダ内に作成します（デフォルトでviewsフォルダを参照します）。ここではindex.ejsというファイル名で作成しています。
```配置について.
・プロジェクトフォルダ
・index.js
・viewsフォルダ
　　・index.ejs
```

# コード例
上記のデータベースよりチーム名が「ズ」で終わるチームを出力させています。

```index.js
let port = 3000;    //ポート番号
let express = require("express");
let app = express();
app.set("view engine", "ejs");  //テンプレートエンジンの指定
let sqlite3 = require("sqlite3");   //sqlite3
let db = new sqlite3.Database("./sample_data.db");
let bb_dat = {dat:null};    //ejs転送用オブジェクト
let pl = "%ズ"; //SQLプレースホルダー用変数
//データベースに接続しSQL文の実行
db.all("select * from bbteams where team like ? ", pl, function(err,rows){
    bb_dat.dat = rows;
});
//ルートにアクセス時index.ejsにbb_datを渡し、応答する
app.get("/",function(req,res){
    res.render("index.ejs",bb_dat); 
    console.log(bb_dat.dat);
});
//ポート番号を指定してWebサーバーとして起動
let listener = app.listen(port,function(){
    console.log("ブラウザにてlocalhost:" + port + "にアクセスしてください");
});
```

```index.ejs
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <h1>データベースからの取得</h1>
        <ul>
        <% for(let e of dat){ %>
            <li><%= e.team %></li>
        <% } %>
        </ui>
        <script>
            console.log("@ejs");
        </script>
    </body>
</html>
```
サーバー起動します。
```terminal
node index.js
```
ブラウザにてlocalhost:3000にアクセスします。データベースよりデータを取得できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536745/fe8d773a-f034-182d-e1c1-d758473ad219.png)

次の記事で、検索ができるよう紹介しています。

https://qiita.com/watmot/items/b2e9b08122b1861909b6
【HTML】inputタグにinputmodeを設定してみよう！

🌻inputmodeを設定してみよう！
✨スマホユーザーのユーザビリティ向上✨

💡電話番号のフォームをタップしたら
　　数字キーボードを表示したい！

💡いちいちひらがなから数字キーボードに
　　変更するのがめんどくさい！

そんな方はぜひ！

📼Youtube
https://youtu.be/M9IAaXvtJP4

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525847/6342054b-6a0a-3525-cb34-83fba3f768f2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525847/2b623a61-f9c0-5263-33fd-b506514984fe.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525847/c636e46e-916a-b15b-3f3d-d9ae0b63b4d4.png)
Lravel10 livewire3 Alpine でjsエラーになってしまう場合の対処法

Laravelでは、VueやReactも利用可能ですが、Livewire、Alpineの利用が勧められています。
スターターキットの一般的な会員登録機能が含まれた Laravel Breeze もLivewireとAlpineJSによって構築されています。

LaravelでAlpineを使用する際は、resources/js/app.js に

```js:app.js
import Alpine from 'alpinejs';

window.Alpine = Alpine;

Alpine.start();
```

を追記することで、AlpineJSが利用可能になるのですが、Livewire3からはAlpineが既に組み込まれており、事前設定済みの状態のため、app.jsに同様の記載がある場合、競合が発生し、Javascriptのエラーが発生します。
一見、動作ができてしまう場合もあるためわかりづらいですが、動作がおかしい場合はこちらが原因となる場合も多いかと思います。

また、Livewireを利用せず、AlpineJS だけを利用したい場合には、そのままではAlpineが動作しないため、Alpineのみ利用したいページでは、viewファイル上に

@livewireScripts

の記載が必要になります。
【初心者】LINEBotを使った電話帳　小売業会社員の奮闘録

小売業でレジやら商品出しやら、夜間業務やらと色々手広くしている会社員です。
これから年末に向け大変な時期になりますね…。
体が１つじゃ足りないと日々嘆いております。

そんなデジタル未経験の私が作った試作機がこちら

試作機
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">試作機 <a href="https://t.co/cLEgD1s3n0">pic.twitter.com/cLEgD1s3n0</a></p>&mdash; ぐーじん (@Gujin_75qq5q) <a href="https://twitter.com/Gujin_75qq5q/status/1705080550720172308?ref_src=twsrc%5Etfw">September 22, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


__使用したツール達__
・[Make](https://www.make.com/en)
・LINE
・Googleスプレットシート
・[SSSAPI](https://sssapi.app/)

__Make__
構造は先輩のを~~パ・・~~ 参考にして作成しました。
ただ、中の処理を理解していないとあれなので、一つ一つ理解しながら作りました。
![メイク全体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3539432/d2136d7b-595d-62e8-fbfd-f9cb48f867cc.png)

最初は複雑な構造は自分には高度すぎるので簡単な構造で作れればなと思いました。

__HTTPの処理__
![http.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3539432/578ee16b-885d-74b6-7121-fae14b212dbb.png)

::: note 赤線引いてますが、
フィルター＿もって来る列の名前＿完全一致
日本語で書くとこんな感じですが…
filter__連絡先__exact
この処理にたどり着くまで沼ってました。
:::

色々な呼び出し方法があるのでそれは下記を参照
[呼び出し方法](https://sssapi.app/help/api_call)

__APIの中__
![api.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3539432/4277485d-ceda-fed0-a343-1199310a2b2c.png)

__JSON__
![json.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3539432/ab20a01e-5144-f876-8639-b572039e6c18.png)

連絡先という名前のスプレッドシートになります。

__LINE__

![line右.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3539432/e161d022-1b19-d7c5-be88-7aa43ce0e173.png)

呼び出したい内容は連絡先と電話番号なんのでこの二つとも呼び出す処理です。
ちなみに？電話番号だけを呼び出したい場合は左の連絡先を消して電話番号だけにすると、
電話番号だけ返ってくる処理になります。

:::note info 
途中返事が返ってこないだの、LINEでエラーが出るだのと沼に沼を重ねて沼地獄に陥りましたが、そこは他の人に聞いて聞いて聞き倒して作っていきました。
:::
## 開発の経緯はこちら ##
店舗で必要な連絡先を教えてくれる、電話帳Bot
本部に電話すれど、その内容はこっちです。と
たらい回しであったりと連絡先一覧が欲しい。
そして、緊急の場合もどこに連絡したらいいのか…。
24時間営業ならではの深夜帯の従業員さんもにもそのような連絡があったりなかったり…。

そんな負をほんの少しでも解消できればと思いこんなの作ってみようかと思うんだと同僚に話したら・・・
「あったら絶対使う！」「探すの手間やから」とお声をいただきなら
__作ってやろうじゃないか！！探すのめんどくさいもんね！！！__
いう気持ちで作成に取り掛かりました。

まずは第一段階と思っており、これからもっと難しい処理や違う内容での処理ができればなと思っております。
この週はいつもよりタバコが増えて睡眠時間が短くなるという状況でしたがとても充実していました。

最後までお読みいただきありがとうございます！！
Jmeter で localhost にリクエストする

特に特別なことはせずにlocahost宛にリクエストできた

# ThreadsGroup を作る

<img width="775" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/21779257-cbd5-4ead-b612-e11285a732bb">

# Http Request


作成した ThreadsGroup を右クリックして Add -> Sampler  -> HttpRequest を選ぶ



 <img width="1141" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/dce20500-ec0e-4a27-90ab-9e5f4c6d9ca3">

必要な情報を入力する

<img width="796" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/ab70a4d8-2b56-4f72-8b90-faac0e4e2a22">

Command + S などでの保存を忘れずに

# 実行する

再生ボタンを押す

# 結果の確認

Thread Group で Add > Listner > View Reuslt Tree

を作っておくと結果確認できる

<img width="1143" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/0a92a2d5-37ff-4a7b-96a8-951aa2fd6a19">

<img width="1148" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/d2045fc5-0ff8-4254-bebe-d736c3e5a79c">

# 実行できない場合

再生ボタンを押しても画面上では、直接結果ダイアログなどが開くわけではないので何も起きていないように見えるかもしれない

あといちど、このHttpRequestの部分が何故か薄字になっておりうまく設定できていないようだったので、いちど削除してまた作り直した

<img width="289" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/26b1dde3-cf44-47d1-8241-a6ea7e9e4d44">



# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
国土交通省が公開しているハザードマップをLeaflet上に表示する

# はじめに

今年も異常気象で各地で大雨による水害等が発生していますが、私も[大雨が降ると水没するイオン](https://umiwaka.com/archives/4162)があるような地域に住んでいるので、どの場所が冠水するのかという情報は常に気になっています。
というわけで、今回は国土交通省が公開しているハザードマップをLeaflet上に表示させて水没しやすい地域を視覚化してみました。

# Step1 Leafletに地理院タイルを表示する
まずはLeafletのチュートリアルを参考に地理院タイルを表示させてみます。
今回、地理院タイルはハザードマップが見やすくなるように淡色地図を選んでみました。

https://maps.gsi.go.jp/development/ichiran.html#pale

``` html
<!DOCTYPE html>
<html>
  <head>
    <title>Leaflet</title>
  	<meta charset="utf-8">
  	<meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin=""/>
    <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script>
    <style type="text/css">
    <!--
      #map { height: 800px;}
    -->
    </style>
  </head>
  <body>
    <div id="map"></div>
    <script>
    	var map = L.map('map').setView([33.40874793564865, 130.5637869912768], 15);
            L.tileLayer('https://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png', {
            attribution: 'Shoreline data is derived from: United States. National Imagery and Mapping Agency. "Vector Map Level 0 (VMAP0)." Bethesda, MD: Denver, CO: The Agency; USGS Information Services, 1997.'
    	}).addTo(map);
    </script>
  </body>
</html>
```

![Leaflet - Google Chrome 2023_09_21 9_01_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72890/5b618529-8595-ed35-5ad8-31414f523691.png)


# Step2 ハザードマップを重ねる

https://disaportal.gsi.go.jp/

ハザードマップポータルサイトが公開している[オープンデータ](https://disaportal.gsi.go.jp/hazardmapportal/hazardmap/copyright/opendata.html)を取得してLeaflet上のレイヤーとして重ねて表示させてみます。
オープンデータにも色々種類があるのですが、ここでは「洪水浸水想定区域（想定最大規模）」を取得してみます。

やり方は地理院タイルとほぼ同じです。URLさえ指定すれば後はLeafletが勝手にタイルを取得して表示してくれます。あと不透明度を50%にしています。

``` javascript
L.tileLayer('https://disaportaldata.gsi.go.jp/raster/01_flood_l2_shinsuishin_kuni_data/{z}/{x}/{y}.png', {
    opacity: 0.5
}).addTo(map);
```

![Leaflet - Google Chrome 2023_09_21 9_01_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72890/48bed7b1-c83e-a774-d02d-b7592bf2449a.png)

地図上に洪水浸水想定区域が重なって表示されるようになります。

こうやって見ると、思った以上に広範囲がまっ赤に染まってヤバい地域だということが分かりますね。
Laravel10 ViteをEC2上で自動更新するための設定

Larvel10では、フロントエンド・ビルドツールとして、Viteが採用されています。
Mixへ戻すことも可能ですが、Viteはビルドも早く、利用していても快適ですので、是非利用をお勧めします。

ただし、AWSのEC2上で開発を行う際など、そのままの設定では、

```
$ npm run dev 
```
を利用した自動更新のコマンドで失敗します。

この自動更新が正常に行うようにするためには vite.config を以下のように修正する必要があります。

```js:vite.config.js

import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';

export default defineConfig({
    plugins: [
        laravel({
            input: ['resources/css/app.css', 'resources/js/app.js'],
            refresh: true,
        }),
    ],
    server: {
        host: true,
        hmr: {
            host: 'laravel.example.com（開発環境として利用しているドメイン）'
        }
    },
});

```

serverの項目を追加し、hostの項目を trueに、hmrのhostに開発環境として利用しているドメインを設定します。

また、AWSのセキュリティグループの設定で、5173ポートを自身の環境のIPからアクセス可能なようにしておく必要があります。
Laravel10 Cacheに ElastiCache for Redisのクラスターモードを利用する際の設定


Laravelで、CacheにRedisを利用する場合、config/database.phpに設定を書き込むのですが、ElastiCache for Redisのクラスターモードを有効にした場合、記述内容が変更になります。
クラスターモードは、エンドポイントを共通にできるなどメリットも多いので、利用してみると良いとか思います。

下記のようにconfig/database.phpにデフォルトでは記述されていない、clustersを追加する必要があります。


```php:config/database.php
'redis' => [

    'client' => env('REDIS_CLIENT', 'phpredis'),
        
    'options' => [
        'cluster' => 'redis',
    ],
    'clusters' => [
        'cache' => [
            [
                'host' => env('REDIS_HOST', '127.0.0.1'),
                'password' => env('REDIS_PASSWORD', null),
                'port' => env('REDIS_PORT', 6379),
                'database' => 0,
                'read_write_timeout' => env('REDIS_READ_WRITE_TIMEOUT', 60),
            ]
        ],
    ],
];
```
実際の値については、.envファイルに記述しますが、

REDIS_CLIENT には、predisを利用している場合は、predisを指定します。

REDIS_HOST には、設定エンドポイントを指定します。
sshでGCEインスタンスに簡単にアクセスする小ネタ

# 執筆の経緯
現在フリーランスで活動しています。この度新しい案件に参画することが決まったので、現在の現場で使っていた便利な小ネタなどをメモしておきたいと思い、この記事を書きます。

# やること
GCEのインスタンスにアクセスするとき、sshコマンドで以下のようなコマンドを実行します。
```shell
ssh {ユーザー名}@{外部ipアドレス}
```

具体的には以下。
```shell
ssh sekine@111.111.111.111
```

ただし、アクセスするごとに外部ipアドレスをコピペするのは手間です。なので、インスタンスに名前をつけて、
```shell
ssh gpu_server
```
のような簡単なコマンドでアクセスできるようにします。

# 実行環境
- zsh
- MakBook Pro, Apple M1

# やったこと
以下のようなファイルを作りました。

```~/.ssh/config
#User sekine
#IdentityFile ~/.ssh/id_rsa

Host gpu_server
    HostName        111.111.111.111
    User            sekine
    IdentityFile    ~/.ssh/id_rsa

Host cpu_server
    HostName        222.222.222.222
    User            sekine
    IdentityFile    ~/.ssh/id_rsa
```

秘密鍵、公開鍵を作る時に`.ssh`ディレクトリを作成するかと思います。その`.ssh`ディレクトリ内に`config`というファイルを作り、上のような内容を記載します。

パラメータは下のようになります。

| パラメータ | 説明 |
| :- | :- |
| HostName | アクセスしたいインスタンスの外部ipアドレス<br>エフェメラルの場合起動するたびにコピペします |
| User | アクセスするユーザーの名前 |
| IdentityFile | 秘密鍵のファイルパス |

このファイルを設定することで、一度`HostName`を設定しておけば、以下のコマンドで何度でも簡単にインスタンスにアクセスできるようになります。
```shell
ssh gpu_server
```

# 備考
このファイルを設定した当時はこのやり方が簡単そうで採用しましたが、より簡単にインスタンスへアクセスする方法がありましたら教えてください！
PL-400 受験記

# プロフィール
私はMicrosoft関係では以下の資格を保有しています。
- PL-900 Power Platform Fundamentals
- PL-100 Power Platform App Maker
- MB-910 Microsoft Dynamics 365 Fundamentals (CRM)
- MB-920 Dynamicd365 Fundamentals(ERP)
- AZ-900 Azure Fundamentals

社内外の業務改善を行っていきたいと考えており、Power Platformを3年程度学習しています。
基本的にはPower Automateを活用してプチ業務改善のようなことを実践しています。

今回は、先日のMicrosoft Learn Cloud Skills Challengeで対象資格となっていた[PL-400: Microsoft Power Platform Developer](https://learn.microsoft.com/ja-jp/credentials/certifications/exams/pl-400/)を受験しました。

# Power Platform Developperってどういう資格？
PL-100のApp Maker、PL-200の業務コンサルタントのように、Power Platformを用いて、お客様の課題解決を行っていくために必要なスキルがあるか、を確認するための資格ですが、
Java Scriptを書いたり、Power Appsのコンポーネントを独自に作成したりするような、より一層開発者向けの資格となります。

勉強する中で、「Power Platformって、こんなにコード書けるんだ」という学びがありました。

# 受験日（合格日）
2023/09/22

# どうやって勉強した？
mstepが提供しているPL-400の受験対策セミナーを受講しました。
mstepでは、PL-400だけではなく、PL-200、DP-200などのコースも提供されています。
[mstep 受験対策トレーニングコース一覧](https://partner.microsoft.com/ja-jp/training/mstep-mcp)

はじめて受講したのですが、今までなんとなくしか理解していなかったDataverseや、D365との関係性などを理解することができました。
Microsoft Cloud Partner Programへの登録が必要ですが、他にも色々勉強するためのコンテンツが無料で提供されているので、とてもオススメです！

400分のウェビナーですが、2倍速で見たので、実際は200分強（3時間～4時間くらい）が学習時間です。
設問の解説部分は問題を読むために停止したり、戻したり、試験当日は設問部分だけ見返したりしました。

# 感想
- D365の各サービスの名前と概要くらいは知っていたほうが良さそう
- Azureも基本的なサービスくらいは知っていたほうが良さそう
- 問題はケーススタディと、普通の4択だったり並べ替え等を行うようなものと、Yes/Noで答えるもので構成されており、いつものMicrosoftの試験という感じ
- 実際にいくつかPower Appsのコンポーネント作ったりしたほうが絶対に良い

# 次の資格は？
[PL-500 Microsoft Power Automate RPA Developer](https://learn.microsoft.com/ja-jp/credentials/certifications/exams/pl-500/)を以前受験したら惨敗だったので、リベンジしたいと思っています。
現状、社内の業務改善ではPower Appsを作成するよりも、Power BIで可視化したり、Power Automateで自動化したりするケースがほとんどです。
そのため、Power Automateをより一層活用できるようになりたいと考えています。

ゆくゆくは[PL-600 Microsoft Power Platform Solution Architect](https://learn.microsoft.com/en-us/credentials/certifications/exams/pl-600/)の取得も目指したいです。

# 余談
資格一覧眺めてたら、PL-100がちょうど1年前に受かっていました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/7aefc21b-c092-8764-b9a2-58e659191551.png)
【AzureCLI トラブルシューティング】Code: LinkedInvalidPropertyId

# AzureCLI トラブルシューティング
```shell
ACR1Id=$(az acr show --name acr1 --query 'id' --output tsv)
az network private-endpoint create --name endpoint1 --resource-group resourcegroup1 --vnet-name vnet1 --subnet subnet1 --connection-name connection1 --private-connection-resource-id $ACR1Id --group-ids registry
```
を実行したとき、下記エラーが出た。
```shell
' at path 'properties.privateLinkServiceConnections[0].properties.privateLinkServiceId' is invalid. Expect fully qualified resource Id that start with '/subscriptions/{subscriptionId}' or '/providers/{resourceProviderNamespace}/'.
Code: LinkedInvalidPropertyId
```
# 原因
コマンドに`--debug`を付けて原因を特定した。
変数の値の末尾に`\r`が付いていた。
```shell
Command arguments: ['network', 'private-endpoint', 'create', '--name', 'endpoint1', '--resource-group', 'resourcegroup1', '--vnet-name', 'vnet1', '--subnet', 'subnet1', '--connection-name', 'connection1', '--private-connection-resource-id', '/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resourcegroup1/providers/Microsoft.ContainerRegistry/registries/acr1\r', '--group-ids', 'registry', '--debug']
```
変数代入時にtrコマンドで`\r`を除去して`az network private-endpoint create`に成功した。
```shell
ACR1Id=$(az acr show --name $ACR1Name --query 'id' --output tsv | tr -d '\r')
```
DataGripでBigQueryのクエリ料金を取得する

# やりたいこと
BigQueryのコンソール画面で表示される処理バイト数を、DataGrip上で確認できるようにしたい！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182296/1eef6baa-5bc4-5dd7-0328-558111f29116.png)

# 前提
Windows11
DataGrip 20232.1

DataGripからBigQueryへの接続設定が完了しており、クエリが実行できる

# 手順
1. DataGripのPluginsからBigQuery query size estimatorをインストール
https://plugins.jetbrains.com/plugin/15884-bigquery-query-size-estimator
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182296/80393b55-0852-cf76-483b-a9fcf735f8bd.png)

1. Tools > BigQuery Estimator Settingsを開き、GCP key pathを設定し、ApplicaitonDefault SEttingsにチェックを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182296/eb0a8190-12ee-974b-d5d2-5b0154d0d25f.png)

GCP key pathはGoogle Cloud CLI上で `gcloud auth application-default login`を実行すると生成されるファイルです。
Windowsかつ著者の環境では以下に出力されてました。
```
C:\Users\{UserName}\AppData\Roaming\gcloud\application_default_credentials.json
```
もし見つからなければ、`gcloud auth application-default login`をもう一度実行してもいいかもしれません。
（上記設定ファイルを取得するコマンドがあれば教えてください！）

# 使い方
エディター上で右クリック> BigQuery Estimateを選択すると、通知ポップアップが表示され、課金バイト数と金額が表示されます。
金額はユーロで表示されます（変更もできない）。料金改定があった場合も反映されるのか不明なのであくまで参考程度にしたほうがいいかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182296/4a8d03a7-47aa-d5c1-bcd7-6552017a75ce.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182296/5116a5c8-b972-e9f9-7803-28cd041af2e8.png)

私は右クリックからの選択が面倒だったので、ctrl + @にショートカットを設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182296/a38cb41a-98c2-1029-25d5-4efba0c48d19.png)
Databricks Assistant にて Scala で記述されている Bloom filter indexes の一覧を表示するコードを python への書き換える方法

## 概要

Databricks Assistant によて Scala で記述されている Bloom filter indexes の一覧を表示するコードを python への書き換えに成功したため、共有します。ドキュメントにて Scala のコードしか記載されておらず困っていたのですが、Databricks Assistant が python に書き換えてくれました。本記事ではプロンプトとその出力結果を共有します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6a1a5c31-3bee-d395-3890-850a5de10635.png)

引用元：[ブルーム フィルターのインデックス - Azure Databricks | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/databricks/optimizations/bloom-filters#display-the-list-of-bloom-filter-indexes)

## 実行結果

### 事前準備

```sql
%sql
CREATE SCHEMA IF NOT EXISTS hive_metastore.uc_migration_01;
CREATE OR REPLACE TABLE hive_metastore.uc_migration_01.nation_02
(
  N_NATIONKEY integer
  ,N_NAME string
  ,N_REGIONKEY integer
  ,N_COMMENT string
);
CREATE BLOOMFILTER INDEX ON TABLE hive_metastore.uc_migration_01.nation_02 
  FOR COLUMNS(
    N_NAME OPTIONS (
      fpp = 0.1,
      numItems = 50000000
    )
  )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0002ea71-b774-35a3-3c99-07ea5f7c80f5.png)


### Databricks Assitant への質問と回答

````text
次の Scala のコードを python に書き換えて

```scala
spark.table("<table-with-indexes>").schema.foreach(field => println(s"${field.name}: metadata=${field.metadata}"))
```

````

````text
次のようにPythonでコードを書き換えることができます。

```python
for field in spark.table("<table-with-indexes>").schema:
    print(f"{field.name}: metadata={field.metadata}")
```

Scala では、spark.table() function の呼び出しによってDataFrameが返され、.schema Property が使用されます。 Python では同じ syntax でDataFrameを取得できます。for ループにより各フィールドの名前と metadata が表示されます。 f-string syntax (Python 3.6以降) が使用され、Stringの Interpolation が行われています。
````

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/13416210-0f4c-a144-b2e8-41fabda17fbb.png)

### Databricks 上での実行結果

```python
for field in spark.table("hive_metastore.uc_migration_01.nation_02").schema:
    print(f"{field.name}: metadata={field.metadata}")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4158c0a9-16a4-1899-765c-8d8ad6c398dc.png)