OmniAICreator/Qiita-1.07M huggingface dataset:
PonP（Proxmox on Proxmox）で評価環境を構築しよう！

## TL;DR

- LTでしゃべった内容のQiita版
- PVE 上に3つ仮想マシンを構築し、その上にPVEを構築する


## 概要
以下の勉強会のLTのQiita版です。
※Qiitaでも簡単に公開できるようMarpで書いておいてよかった。

https://jpmoxs.connpass.com/event/312769/




---
## PonPで評価環境を構築しよう！

- PVEの評価（特にクラスタとか）をしたいけど物理で複数ノードを調達するのは厳しい…
- なので、PonP(Proxmox on Proxmox)でPVE上に仮想マシンを３つ作成し、その上にPVE構築し、クラスタを組みます。
- 大きくは以下3ステップ。


1. PVE上で仮想マシンを構築
1. 仮想マシンの複製
1. クラスタの構築



### 1.PVE上で仮想マシンを構築

#### デフォルトである2つのストレージ
デフォルトで以下２つのストレージが用意されている。
仮想マシン構築のために必要なコンテンツタイプ（太字箇所）が設定されているので、いきなり仮想マシンの構築が可能。

- `local`
 - **ISOイメージ**
 - コンテナテンプレート
 - バックアップ（vzdump）
- `Local-lvm`
 - **ディスクイメージ**
 - コンテナ


#### 手順
- ISOイメージをアップロード
  - `pve`-`local`-`ISOイメージ`-`アップロード`からProxmoxのISOイメージをアップロード。

![iso.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/d3af432a-7f66-ac4e-586c-63cd0cdabdba.png)




- `pve`を左クリック or 右上の`VMを作成`から作成

![vm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/be67e09d-b436-9b40-fecc-b8e10bae783e.png)



- `OS`でアップロードしたISOイメージを指定
- その他の設定はデフォルトで作成

![os.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/d0abd633-aa6f-1213-f7f2-e102f2fb9ae7.png)


- 起動した仮想マシン`pve1`-`コンソール`から仮想マシンにアクセス
- ProxmoxのGUIインストールに従いインストール

![console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/c6e098fd-fdcf-0368-4169-b4abcf750004.png)


---


### 2.仮想マシンの複製
複製方法はいろいろあるが、ぱっと思いつくのは以下の通り。
今回は太字の方法で作成。

- 新規構築を繰り返す
- **クローンしてIP・ホスト名を修正する**
- Cloud-Initでまとめて構築する
  - Cloud-Initについては、勉強会のLT2でもお話あったので、気になる人はそちらも参照。



#### 完全クローンとリンクされたクローン
- 完全クローン
  - クローン元から独立
  - 別のストレージにも作成可能
- リンクされたクローン
  - Copy-On-Write（変更された箇所だけ書き込み）を利用
    - 高速なクローン
    - 省サイズ
  - 同じストレージにのみ作成可能

#### テンプレート
- 仮想マシンをクローン用のテンプレートとすることが可能。
- **テンプレートにすると仮想マシンにはもどせない！**
  - が、テンプレートから完全なクローンは可能。
- テンプレートからクローンすることでリンクされたクローンも利用可能
  - 仮想マシンからクローンする場合は完全クローンのみ。


#### 手順
テンプレートとから完全クローンを複製後、各仮想マシンで以下を修正。
また、設定ファイルを直接修正してもOKですが、`hostnamectl`を利用したほうがスマートです。
※ribbonさん当日コメントありがとうございます。

- PVE（OS）の設定変更
  - IPアドレスとホスト名を変更
  - `/etc/hosts`
  - `/etc/hostname`
  - `/etc/network/interface`



### 3.クラスタの構築

#### 手順

- 新規クラスタの構築
  - `データセンター`-`クラスタを作成`から新規クラスタを作成
- 既存クラスタへの参加
  - 新規クラスタを構築したPVEの`Join情報`をコピー。
  - 参加したいPVEの`クラスタに参加`から張り付け。


![cluseter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/58be9290-ee42-bcc2-d18c-371f2cdbd61b.png)



- クラスタの構築ができました！

![cluster2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/334bda3b-c1ed-058a-363f-c60291341fde.png)



## 最後に
これでクラスタはできたので、HAやらレプリケーションやらの検証が出来るようになりました！





## 参考

https://jpmoxs.connpass.com/event/312769/

https://pve.proxmox.com/pve-docs/chapter-pvesm.html#chapter_storage


https://pve.proxmox.com/pve-docs/pve-admin-guide.html#qm_copy_and_clone

https://pve.proxmox.com/pve-docs/pve-admin-guide.html#qm_templates
GASを使って自動でGooglegroupの招待メール

## 目的
サークルの新歓に向けて、新入会者をGooglegroupに自動追加するものを作りたい。
## 方法
1. Googleフォームでgmailのアドレスを入力してもらう。
2. フォームの回答をスプシにエクスポート
3. GASを用いて、スプシからgmailのデータを取り出す。
4. 取り出したアドレス宛にグループの招待のURLを送る。(メッセージ付き)なお、送るのはグループにまだ参加してない人のみ

# 妥協したこと
<dt> 自動化 </dt>
<dd> GoogleWorkspaceもしくは、AWSやGCPなどを使う必要があるみたいで、お金がかかるから <br>
<strong> 代替案 </strong> :スプシに送信ボタンを作りボタンを押すことで実行するようにした。 </dd>

# 結果
### フォーム
![スクリーンショット 2024-03-27 1.30.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/a204cc8b-22d1-3a0e-9ae5-cfeca741bdf7.png)

### スプシ
![スプシ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/26bf1734-de34-f11f-a600-6d233fca8813.png)

### コード
```
function inviteMember() {
  // 送信者情報
  const senderEmail = "";  // 実際の送信者メールアドレス

  // Google スプレッドシートのシートを取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  // メンバー登録を行う列のデータを取得
  var data = sheet.getDataRange().getValues();

  // グループ情報
  const groupName = "グループ名";

  // メッセージ
  const subject = "メール件名";
  const message = `
**${groupName}への招待**

${groupName}へようこそ！

このグループは、〜に関する情報を共有するためのものです。

グループに参加するには、以下のリンクをクリックしてください。

https://groups.google.com/forum/subscribe?token="グループのトークン"
//groupの招待メールのurlをコピーした。

**ご質問**

ご質問は、${senderEmail}までご連絡ください。

よろしくお願いいたします。

**${groupName}運営**
`;

  // 最初の行をヘッダーとして扱うから、1 から始める。
  for (var i = 1; i < data.length; i++) {
    var emailAddress = data[i][5]; 
    var already = data[i][8];

    // メール送信
    if (already == false) {
      MailApp.sendEmail(emailAddress, subject, message, {
        from: senderEmail,
        bcc: senderEmail,
      });
    }
  }
}
```

# 参考文献
https://atmarkit.itmedia.co.jp/ait/articles/1708/14/news011.html
UGの初回勉強会を主催したらめっちゃ集まって大変だった件。



## TL;DR

- 軽い気持ちでUGの初回勉強会を主催したら、めっちゃ参加申し込みがきて大変だった！
- 事前準備はもちろん、事後対応もいっぱいあった。
- 今後の課題など。

## 概要
https://qiita.com/oishi-d/items/04e70fb5f0d7a08f1cf2

上記の記事でJPmoxsというProxmoxのUGを作りました。
そして3/22に以下の通り初回勉強会を主催しました。
その感想文です。

https://jpmoxs.connpass.com/event/312769/


## 事前準備期間
### 想定の100倍ぐらい来てしまう参加申し込み。

イベントページを作成したときにはグループメンバーが一桁だったので、集まっても3,4人かな…でもとりあえずやるか！
と見切り発車感満載で開催したらこの通り。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/6ae085b7-cf99-fb61-1e02-60905ff28d90.png)






…いやどんだけ！？



### 参加枠を増やすためZoomのライセンスを購入


前述のとおり想定以上に集まったのですが、こんなに集まらないでしょ…で参加者枠を50人にしていました。
ですが二日で以下の通り。

https://twitter.com/naa0yama/status/1766110967212253217/


Zoom開催予定だったのですが、プロライセンスの上限100名を超過しています。
そのため、以下のいずれかの購入が必要でした。

- ビジネス
- **大規模ミーティング**
- ウェビナー

主催者・登壇者からの一方通行ではなく、参加者含めて双方向コミュニケーションができれば思い、大規模ミーティングを追加購入しました。
これにより、参加者上限を500名まで増やしました。

この大規模ミーティングライセンスは既存で持っているプロライセンスにオプションとして１か月だけ購入しているので、次回以降も100名を超える申し込みがあったら追加購入、という形になりそうです。




### 参加者との連絡方法の確立を急ぐ
勉強会のページ作成時点では参加者・登壇者との連絡方法など、何も考えていませんでした。
前述の参加枠拡張の周知等、したいと思ってもする場所がない！
というわけで以下を作成。

- JPmoxs用のGoogle アカウント
- [JPmoxs用のTwitter（X）のアカウント](https://twitter.com/JPmoxs)


## 開催期間（開催1週間前ぐらい）
### 繁忙期に開催したことを後悔

3月中に開催したい一心でエイヤで日付を決めたのですが、よりによって年度末だし、自身も来期から新しいことに取り組まなければならない身で、まさに繁忙期という状況。
4月中とか、落ち着いたころに開催すればよかったかも…と後悔。




### オマケに体調も壊れる
全需の通り稼働しすぎて、19日ぐらいから風邪ひきました。
鼻水とくしゃみがすごいが、発熱もあまりしなかったので発熱外来行くのか微妙…という状態のまま当日に突入しました。
※今はほぼほぼ体調戻りました。

## 当日

### 開催直前の準備
19時開催でしたが、その30分ぐらい前から登壇者とのZoom等環境のテスト。
自身の環境整備したりとか、登壇者を参加者一覧から見つけて共同ホストを渡すとか、そこそこやることはあるので、余裕を持ったほうがいいと思いました。

今回はまだ共同主催者がいなかったので、会社の人が手伝ってくれました。とても助かりました。




### めっちゃ盛り上がった
以下のハッシュタグだけでなく、Zoomでもコメントたくさんいただけてました。


https://twitter.com/hashtag/JPmoxs?src=hashtag_click

## 事後対応期間
イベント終わってからも結構やることありました。



### 登壇資料のアップロード
今回は登壇者が自身でアップロードしたり、こちらに送付してくれたのでスムーズでしたが、場合によっては依頼が必要かも？

### ご意見の確認
ハッシュタグだったり、メールだったりで色々とご意見もらえました。
※運営への協力希望もありました！

次回以降の開催に向けてのご意見を確認して整理するのですが、色々な場所に情報が散らばってしまったので整理が大変でした。
アンケートのような形（Connpassの機能の奴とか）を使って収集したほうがいいかも？



### 今後の課題
いただいた意見などをもとに、今後の課題と思うもの。

#### 申込者数と実際の参加者数の差
参加者数は300超だったのですが、実際は160超で、だいたい半分でした。
次回以降、100人ちょっとぐらいの参加者数だった場合に、Zoomライセンスを購入するかちょっと迷います。


#### コミュニケーションの場所・方法
Discordとフォーラムを準備中ですが、コミュニケーションの場所が定まってないので、方々からコンタクトがあったりしてちょっと大変。
TwitterとかDiscordなどはアカウントがすでにある人は簡単に利用できるのですが、そうでない方もいるので、フォーラムがいいのかなと思ったり。

#### 懇親会
全然余裕がなくて考えられてませんでしたが、ぜひしたいなと思います。
特にLTとかだと情報が一方通行になりがちなので、他の参加者の方から色々と知見を得たい気持ちが強いです。

ただ、オフラインの懇親会はイメージつくのですが、オンラインだとどんな感じ？というのはあります。


#### 録画
完全に失念してました。すいません…
録画するなら、公開する場所としてYouTubeとかも準備必要だなと。


#### 質問タイム
今回は一方通行で実施するだけでいっぱいいっぱいだったのですが、次回以降ぜひやりたいです。
ただ、質問はどこで求めるのがいいのだろう？とは思いました。
※タイミング（LTごと、終わりに）や、集める媒体（Zoom、Twitterなど）


## 次回について
まずはコミュニケーションを取りやすくするためにDiscord・コミュニティフォーラムの準備を急ぎます。
また次回開催はZoomの大規模ミーティングライセンスが期限切れになる4/22までにできれば…と思っています！



## 参考
https://jpmoxs.connpass.com/event/312769/

https://zoom.us/ja/pricing

https://twitter.com/hashtag/JPmoxs?src=hashtag_click
GooglePlayConsole｜Androidアプリ開発｜アプリステータス公開・非公開の設定方法

# アプリの公開・非公開の設定方法
対象アプリの詳細設定である「アプリの公開状況」に関する手順です。

1. Google Play Consoleのトップ画面にアクセスします。
2. 対象となるアプリの「アプリを表示」を選択し、そのアプリの概要ページに移動します。
3. 左側に表示されているナビゲーションメニューから「設定」を選択します。
4. 「詳細設定」のセクションに移動し、そこから「アプリの公開状況」を選択します。
5. アプリの公開状態を切り替えるための画面に移動します。そこで、公開または非公開のオプションを選択できます。
5. 公開状況を変更した後は、左側のナビゲーションメニューから「公開の概要」を選択します。
6. その後、変更申請を行います。変更の審査が承認されると、アプリの公開状況が変更されます。 

この手順に従うことで、対象アプリの公開状況を設定することができます。

![12345.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724310/cc7961f2-e33d-b0fc-02d3-83f6b59baedd.jpeg)

# 本番申請に合格後のアプリステータスについて
GooglePlayConsoleにて製品版の本番申請を行い、審査に合格後、アプリは初期状態で「非公開」に設定されています。そのため、アプリを一般公開するには、公開状況を「公開」に変更する必要があります。この設定変更後、対象アプリはGooglePlayに公開されます。
ルートアカウントのアクセスキーを発行するのが危険な理由

# はじめに
- クラウドプラクティショナーの資格勉強をしていると、APIキー（アクセスキーとシークレットキー）の管理に関する注意が出てきました。
- ルートアカウントで、発行するのがとても危険ということで、その意味が全く分からなかったので調べてみました。

## 具体的なアクセスキーの使い方
まずは、APIキーをどう使うのかを調べてみました。
- IAMグループで、ポリシーを付与(例えば、S3のフル権限とした場合)
- このグループにIAMユーザーを追加
- IAMユーザーに対して、アクセスキーとシークレットキーを発行
- つまり、このIAMユーザーはS3に対して、このキーを利用しS3を操作できる


## つまりアクセスキーとは何か
- IAMユーザーに対して発行される
- そのIAMユーザーが持つすべての権限を、このキーを用いて利用することができる


## ルートアカウントのAPIキーを発行するのが危険な理由

- これが良くないのは、すべての権限を持つIAMユーザーに対して、アクセスキーとシークレットキーを発行してしまった場合、このキーですべての操作が可能になってしまうということ。
FlaskでPUTしてみた

### 背景

いままで、app.postやapp.getを実装していましたが、
app.putもできるよねとChatGPTに聞いてみたが、サポートしていませんと一点張り
しかし、できるんですよね。これが、
へへへ、ChatGPTに勝っている気になってきた。

```py
from flask import Flask
app = Flask(__name__)

@app.get('/')
def index():
    return 'Index Page'

@app.put('/test/<id>')
def put_test(id):
    print(id)
    return 'OK',200


if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0')
```
プログラミングは超簡単なやつ

これでできました！

```terminal
127.0.0.1 - - [27/Mar/2024 00:50:27] "GET / HTTP/1.1" 200 -
1000
127.0.0.1 - - [27/Mar/2024 00:50:31] "PUT /test/1000 HTTP/1.1" 200 -
1000
127.0.0.1 - - [27/Mar/2024 00:50:41] "PUT /test/1000 HTTP/1.1" 200 -
```
但し、ブラウザだと簡単に実行できないので、POSTMANを使用しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576081/d70b5c33-20f1-785e-849b-b5b93f5cc714.png)

これからプログラムでPUTになりそうなものは、PUTで行こうと思います。

### 実際のプロジェクトで使てみた。

まずは、受ける側
```py
@app.put("/finish_tv")
@flask_login.login_required
def finish_tv():
    # 受け取り側でjsonで受け取る
    Movie_info.update_movie_flag(request.json["id"])
    return "", 200
```

putする側
```javascript
// tv終了用
function finish_tv(id, name) {
    var xhr = new XMLHttpRequest();
    xhr.open('PUT', '/finish_tv');
    xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
    xhr.onload = function() {
        if (xhr.status === 200) {
            window.location.href = '/thanks/2/' + name;
        }
    };
    xhr.send(JSON.stringify({
        "id": id,
        "name": name
    }));
}
```
DB側の変更は必要なし

```
127.0.0.1 - - [27/Mar/2024 00:59:50] "PUT /finish_tv HTTP/1.1" 200 -
```
よーーし。

GET/POST/PUTを分けることによる役割が分かりやすい。

### HTML側で対応していない問題

```html
<!DOCTYPE html>
<html lang="jp">
<head>
    <meta charset="UTF-8">
   <title>test_flask</title>
</head>
<body >
    <h1>12345</h1>
    <form method="post" action="/test2">
        <input type="hidden" name="_method" value="PUT">

        <button type="submit" value="100">submit</button>
    </form>
</body>
</html>
```

```py
from flask import Flask, render_template, request
app = Flask(__name__)

@app.get('/')
def index():

    return render_template('index.html')


@app.put('/test/<id>')
def put_test(id):
    print(id)
    return 'OK',200

@app.route('/test2', methods=['POST'])
def put_002():
    res = request.form.get("_method")
    if res == 'PUT':
        print('PUT TEST OK')

    return 'OK',200

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0')
```
結局はこうなる。

PUTはJavaScriptのみ実現可能となっております。
以上。。。。。
Apply to eachのConcurrency制御の変数問題対応

# 問題説明
下表のようなデータがあって**col1列**の一意の値("I", "II", "III")ごとにグループ化して**col2列**の文字列を結合したい場合を考える。
|col1|col2|
|:-:|:-:|
|I|あ|
|I|い|
|I|う|
|II|a|
|II|b|
|II|c|
|III|α|
|III|β|
|III|γ|

欲しい結果は、次の通り。
I： あいう
II： abc
III： αβγ

**col1列**がグループ名で**col2列**がメールアドレスでグループ別にメール送信したい場合等、いろいろな要件で遭遇するケース。

下図のような変数を用いたフローでは**Apply to eachのConcurrency ControlをOnにしなければ問題なく動作する**が、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/3392d65d-b09e-8e0e-0ff2-c63e82b3a37d.png)


**Concurrency ControlをOnにすると下記のようにランダムでぐちゃぐちゃ**に。
I: あaいbう
II: αβcγ
III： (空)

# 対応策
変数を使わず`Select`と`Join`アクションを使えばConcurrency ControlをOnにしてもOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/e77efd90-258e-c83e-868f-d0708f6d07ba.png)

下記ブログを参考にさせていただきました。ありがとうございます！
https://mizusibuki.com/pa-how-to-use-concurrency-control/
EXPLAINコマンドでSQLの実行計画を取得する:SQLチューニング#4

### 実行計画とは

DBMSがSQLを実行するための手順書。
テーブルの結合順序や想定される実行コストが記述されている。

### EXPLAINコマンドとは

実行計画を確認するためのコマンド。以下の構文で使用する。

```
EXPLAIN [オプション] SQL文
```
### EXPLAINのオプションには何が記述されるか
6種類の記述をすることができます。

1.ANALIZE
実行計画を作成するだけでなく、SQLを実際に実行する。

2.VERBOSE
実行計画についての追加情報を出力する。

3.COSTS
各計画の推定起動コストと総コスト、推定行数などに関する情報を含める

4.BUFEERS
バッファの使用状況に関する情報を含める

5.TIMING
実際のスタートアップ時間とノードで費やされた時間が追加表示される

6.FORMAT
出力形式を指定する。 TEXT、XML、JSON、YAMLを指定可能

### 実際にEXPLAINを使ってみるとどうなるか

![使ってみた.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/4da9bbd5-1897-447c-bec0-95473229bf2a.png)

SQLの実行も行うANALIZEオプションを使用して、実行計画を表示させてみました。

この実行計画の意味、有効な使い方についても今後詳しく調べて使いこなすことが、SQLチューニングにつながりそうです。

ここまで読んで頂きありがとうございました。
GPSのデータを拾ってみた話

人生の旅路にもgpsが欲しかった

# はじめに
- M5Stackの[Atom用GPSユニット](https://docs.m5stack.com/ja/atom/atomicgps)を購入したので、データを拾ってみた。
- M5AtomS3でも、データの吸い出し自体は出来るけど、Bluetoothシリアルでデータを飛ばすなら、[無印Atom](https://docs.m5stack.com/ja/core/ATOM%20Lite)か[matrix](https://docs.m5stack.com/ja/core/ATOM%20Matrix)が必要。たぶん、[Echo](https://docs.m5stack.com/ja/atom/atomecho)でもいけそうな気がするけど、持ってないから分からない。

# 書いたコード
```cpp
    #include <M5Atom.h>
    #include <BluetoothSerial.h>
     
    BluetoothSerial SerialBT;
     
    void setup() {
      Serial.begin(115200);
      M5.begin(true,false,true);  
      Serial1.begin(9600,SERIAL_8N1,22,-1);//GPSユニットとの接続設定はこれだけ
      SerialBT.begin("AtomGPS");
    }
     
    void loop() {
      if (Serial1.available()) {
        char c = Serial1.read();
        Serial.write(c);
        SerialBT.write(c);
      }
    }
```

# コードの解説
- 短いコードだから、見て貰えば分かるけど、22番ピンからgpsデータを吸い取ってるだけ。
![IMG_20240326_194449970_HDR.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733720/90e8af79-1b5a-8728-c22c-5f1060570669.jpeg)


# 吸い出されたGPSデータの例
- 室内だから、ほとんど受信出来てないけど、データの雰囲気はつかめると思う。
```
20:03:40.092 -> $GNRMC,110341.00,V,,,,,,,260324,,,N*64
20:03:40.125 -> $GNVTG,,,,,,,,,N*2E
20:03:40.157 -> $GNGGA,110341.00,,,,,0,00,99.99,,,,,,*7E
20:03:40.157 -> $GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E
20:03:40.189 -> $GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E
20:03:40.189 -> $GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E
20:03:40.221 -> $GPGSV,1,1,01,05,,,26*79
20:03:40.253 -> $GAGSV,1,1,00*68
20:03:40.253 -> $GBGSV,1,1,00*6B
20:03:40.253 -> $GNGLL,,,,,110341.00,V,N*52
```
- データのフォーマット(NMEA0183)は[こちら](https://ja.wikipedia.org/wiki/NMEA_0183)を参照。

# GPSデータの利用方法
- 上記のデータの羅列をPCでシリアルモニタに表示させてもあまり使い道もないけど、Bluetoothシリアルでスマホに飛ばして、[こんなアプリ](https://www.bizstation.jp/ja/drogger/gps_index.html?tab=app)に連携すれば、このgpsユニットのデータを元にした現在地表示が出来る。
- このアプリを利用するためには、androidの開発者向けオプションでの設定が必要だけど、下記を参照にして欲しい。

https://www.rinya.maff.go.jp/j/hogo/higai/attach/pdf/matukui_R3-14.pdf

- また、このユニットに入ってるチップ(BN-200)は簡単に設定変更が可能で、[このサイト](https://www.u-blox.com/en/product/u-center)のu-centerというアプリを使って、自分は日本のみちびきを受信可能な設定に書き換えて、ボーレートも9600から19200に引き上げた。詳しいやり方は、「u-center m8030 m5stack」で検索すれば出てくると思う。

# さいごに
-　こんな簡単なコードでgpsデータを使えて感動したけど、sdカードスロットが全く使えてない。
-　そのうち、もう少し高度なことに挑戦してみようと思う。
【プロジェクトマネジメント】Coursera Google Project Management Certificateを修了した感想とこれから



### **Google Project Management Certificate**
を修了したので、受講した感想を備忘録として記録します。
プロジェクトマネジメントの学習に悩む方の参考になれば幸いです。

## この記事はこんな人におすすめ
* プロジェクトマネジメント初学者の方
* 体系化されたプロジェクトマネジメントを学習したい方
* PMPの取得を考えている方

## コースの概要
Googleが作成した初学者向けの包括的なプロジェクトマネジメントを学ぶコースです。
コースは以下の6つの構成で、ウォーターフォールからアジャイル、チームマネジメントなど幅広く知識を習得できます。


1. Foundations of Project Management
1. Project Initiation: Starting a Successful Project
1. Project Planning: Putting It All Together
1. Project Execution: Running the Project
1. Agile Project Management
1. Capstone: Applying Project Management in the Real World


https://www.coursera.org/professional-certificates/google-project-management


コースは基本的に全て英語となるので、英語に苦手意識のある方には少し大変かもしれません。
私は英語に対して得意でも不得意でもない普通の英語力の持ち主です。Google翻訳の拡張機能の画面翻訳に助けられながら、無事やり遂げることができました。文章もとてもわかりやすく作られているので**ぶっちゃけ余裕** です。

## 受講費用
月額で¥7,281の費用がかかります。(2024/3月時点)
サブスク契約なので、短期集中で取り組めば、その分費用を抑えることができます。
私は途中で一度中断してしまいましたが、通算すると100時間ほどで完了できました。

## 受講した感想
結論から言うと、
### **受講してよかったです!!!** 

#### このコースは
* ビデオによる説明
* ビデオのラップアップを行うドキュメントの確認
* シナリオ問題を用いたドキュメントの作成
* 知識チェック

が基本的な構成となっており、知識の定着がスムーズだった気がします。
コースが進むにつれて理解が深まっていく感覚があり、難易度が高まっていくことも相まって、実力がついてるという実感もありました。

#### 講義は全て英語
なのですが、個人的には **英語でよかった** とも感じています。
* ビデオは英語でヒアリング
* ほとんどわからないので、翻訳した日本語文を見る

ことになるので、結果的に
”世界で標準の英語表現”と”日本語での表現”を両方同時に知ることができました。
後から検索したいとき、英語でも検索できるのがいいですね。


## 修了すると、PMPの割引コードがもらえる！ PMPと相性が良い！
これは私にとって嬉しい情報だったのですが、コースを終了すると、申請することでPMPの試験費用を10%OFFしてくれる割引クーポンが入手できます。(2024/3月時点)

おそらく、Google社としてはこのプロジェクトマネジメントコース終了のネクストステップはPMPと考えられているのだと思います。
私個人も次の段階にPMP受験を想定していたため、嬉しい誤算でした。（PMPは受験料めちゃくちゃ高いので、割引があるのは嬉しい。。。）


現在PMPの取得に向けて勉強中です。このコースでの学習はPMPのシナリオ問題と相性が良く、実際のプロジェクトをイメージするのに役立っています。（海外思考も含めて勉強になった気がします。）
PMPの資格を取りたいがためにこのコースを受講するのは、少しコスパが悪い気もしますが、
**これからもPMとしてのキャリアを歩みたい！**　
という方にはとてもおすすめのコースだと思いました！

## 結論
プロジェクトマネジメントを学ぶファーストステップとしておすすめできます！
その後のPMP取得とも相性が良く、キャリアアップもイメージしやすいと感じました。
IPAのプロジェクトマネージャ試験は技術的な知識も多く求められるのに対し、このコースやPMPはプロジェクトマネジメントに特化した認定・資格であることが大きい気がします。



この記事がプロジェクトマネジメントの学習に悩む方の参考になれば幸いです。
ご拝読ありがとうございました！
【ReactNative】初めてのネイティブアプリをReactNativeで作ろうとした Part1

# 初めに
第2弾として、ネイティブアプリアプリを作ってみました。 …が環境構築に超苦戦したのでVer1として環境構築備忘録を残そうと思います。

## ネイティブアプリを作ろうとした経緯
大学の実習内で  
(某企業)「この機能、ネイティブアプリで作った方がいいんじゃない？作ってみて！」  
(我ら)「ハイ！(苦笑)」  
という流れで、ネイティブアプリを作ることになりました。  
ただし私たちのチームには Webアプリケーション系のエンジニアしかいなかったので勉強会でネイティブアプリを使ってみようとしました。

## ReactNativeを選んだ理由
一番大きいのは ~~「Javaを触りたくｎ…」~~ 「フロントエンドの技術がそのまま生かせそう」という理由です。 

# 本題 ～環境構築～
御託はここまで。  

## 環境
今回は Mac2人 Windows2人でしたが、私がWindowsユーザーなのでWindowsでの環境構築を記載します。  
- OS： Windows 11 Pro  
- Node.js： 20.11.1
- Java ：  19.0.2
- Android Studio

## 環境構築で困ったこと

基本的には[こちらの](https://port365.jp/react-native/)記事を参考にしましたが、いくつか困ったことがありました。

```bash
error Failed to install the app. Command failed with exit code 1: gradlew.bat app:installDebug -PreactNativeDevServerPort=8081 FAILURE: Build failed with an exception.
```
といったエラーを一生吐き続けられてしまったのです。  
原因を探っていると、[Gradleのドキュメント](https://docs.gradle.org/current/userguide/compatibility.html)に以下のような画像がありました。
![Gradle-Java_Compatibility.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120740/f46400fe-7d58-9ef5-fc26-b39795026b87.png)
これを見るとJava22以降はサポートされてないとのこと。 これに気が付くのに2時間くらいかかりました… ~~Dockerは偉大…~~  

もし同じようなエラーに悩まされている方がいれば、一度JavaとNodeのバージョンを確認してみてください。

# おわりに
久々にDockerを使わない環境での環境構築だったのですごく時間がかかりました。4人全員終わるまでに4時間くらいかかったかな…  
次回はやっとネイティブアプリの作成に取り掛かかります。
【Rails API】rack-corsでレスポンスヘッダーにアクセスできるようにする方法

`rack-cors`をインストールして`config/initializers/cors.rb`の`expose`を記述することでJavaScriptからレスポンスヘッダーにアクセスできるようになります。


```rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'localhost:3000'

    resource "*",
             headers: :any,
             methods: %i[get post put patch delete options head],
             expose: %w[X-Sample],
             credentials: true
  end
end
```

上記の場合には`X-Sample`にアクセス可能になります。

https://github.com/cyu/rack-cors
Flutter　〜様々なボタンの表示 ElevatedButton,TextButton, OutlinedButton, IconButton, FloatingActionButton〜

Columで各ボタンウィジェットを縦に並べてみる。
上から
ElevatedButton
TextButton
OutlinedButton
IconButton
FloatingActionButton

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3743467/9bdfc455-2004-89d7-3948-c0457bf7e930.png)


```
import 'package:flutter/material.dart';

void main() {
  // デバッグ用の関数。ボタンがクリックされたときにコンソールにメッセージを表示します。
  debugFunction() {
    debugPrint('ボタンがクリックされました');
  }

  // 背景色が緑のElevatedButtonを作成します。
  final button1 = ElevatedButton(
    onPressed: debugFunction,
    child: Text('ElavatedButton'),
    style: ElevatedButton.styleFrom(backgroundColor: Colors.green),
  );

  // TextButtonを作成します。
  final button2 =
      TextButton(onPressed: debugFunction, child: Text('TextButton'));

  // OutlinedButtonを作成します。
  final button3 =
      OutlinedButton(onPressed: debugFunction, child: Text('OutlinedButton'));

  // アイコン付きのIconButtonを作成します。
  final button4 = IconButton(
    onPressed: debugFunction,
    icon: Icon(Icons.control_point),
  );

  final button5 =
      FloatingActionButton(onPressed: debugFunction, child: Text('FAB'));

  // MaterialAppウィジェットを使用して、アプリのルートを定義します。
  final app = MaterialApp(
    home: Scaffold(
      // Scaffoldウィジェットを使用して、基本的なマテリアルデザインのレイアウトを提供します。
      body: Center(
        // Columnウィジェットを使用して、ボタンを垂直に並べます。
        child: Column(mainAxisSize: MainAxisSize.min, children: [
          button1,
          button2,
          button3,
          button4,
          button5,
        ]),
      ),
    ),
  );

  // アプリケーションを起動します。
  runApp(app);
}
```
#4 Viewを使って図案を組み合わせる

今回の課題は、ビュー（view）の重ね合わせの特徴を活用して図案を描くことでした。私が選んだテーマは、『ハウルの動く城』に登場するキャラクター「カルシファー」です。以下に私の作品を展示します。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3703986/a83312f7-c231-c273-f266-f39217bce079.png)

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3703986/d29b9b2e-0d4c-eee5-1e24-693f6aa6bd1d.png)


成品は原画と見た目が異なり、似ていないように見えるかもしれませんですけど（笑）
もう一度挑戦する機会があれば、もっと細かいグリッドを加えて、原始的な画像に近づけたいと思います。
CloudFormation・OpsWorks・Elastic Beanstalkの違い

皆さん、こんにちは！　ITエンジニアのSkyfoxです！
今回は、自己学習用のメモを以下に書いています。
もし活用できる部分があれば、読んでくださると嬉しいです！

## 1.CloudFormation
- AWSで環境を構築するときに、リソースの設定やプロビジョニングをコード化したテンプレートを作成できる。
    ＝他案件でも一部使える
- ほとんど全てのAWSのリソース構築や設定を行えるため、自由度が高いサービス。
- 環境のみ構築するため、その上に立てるアプリ・ツールは関係ない。
	
	<font color="IndianRed">**メリット**</font>
	・インフラの管理や制御が簡単になる
	・テンプレートができることで、同じ・似た構成の環境を素早く簡単に再現でき、開発期間を短縮できる
	・CloudFormation自体は無料
	
	<font color="LightSkyBlue">**デメリット**</font>
	・テンプレートからスタックを作成・適用する必要があるため、修正に時間がかかる
	・スタックの作成・削除を繰り返すと、AWSのリソース作成上限に達する可能性がある


## 2.OpsWorks
- Chef や Puppet のマネージド型インスタンスを利用できるようになる構成管理サービス。
    ＝サーバの構成を管理・デプロイするサービス
- Chef や Puppet を使用して、Amazon EC2 インスタンスやオンプレミスのコンピューティング環境でのサーバーの設定、デプロイ、管理を自動化できる。

	<font color="IndianRed">**メリット**</font>
	・インスタンスやアプリの動的な構成変 更に容易に対応可能
	・アプリケーションのデプロイのサイクルを自動化する ことで、ビジネスニーズの変化にいち早く対応可能
	・サーバーのパッチ適用、アップデート、バックアップの自動化
	
	<font color="LightSkyBlue">**デメリット**</font>
	・CloudFormationよりコアな部分を扱い、自由度が低い
	　（ex. ELB、RDS、WebAPの3層だけ作成）


## 3.Elastic Beanstalk
- 定番構成の構築、アプリケーションデプロイの自動化サービス。
- 複数の環境で、負荷分散、監視、容量設定、ミドルウェアのインストール、アプリケーションのデプロイを自動的に実施することが可能。
	
	<font color="IndianRed">**メリット**</font>
	・自動化により効率良くアプリケーションの実行ができる
	・使用料金がインスタンスが稼働している時間に応じて決まるため、APIによってはBeanstalkの方が安い
	
	<font color="LightSkyBlue">**デメリット**</font>
	・デプロイメントの信頼性が低い
	・Lambdaに比べてインスタンスの起動とスケーリングが遅い


## 4.CloudFormation・OpsWorks・Elastic Beanstalkの違い
 ＝カバー範囲
	
- 含まれる範囲
	CloudFormation＞OpsWorks＞Elastic Beanstalk
	
	・CloudFormationを覚えれば、OpsWorksも含まれる
	・CloudFormationは1から環境を構築するが、
	　OpsWorksはCloudFormationより狭い基本的な環境のみカバー。
	　Elastic Beanstalkに関しては、開発したアプリを渡すだけで自動で環境を
	　構築してくれる。
初心者が個人的にとても使えると思ったデザイン参考サイト【第二弾】

こんばんは！
今回はポートフォリオ作成中にいいなと思ったデザインサイトを載せます！
前回よりバージョンアップしてます(たぶん)

## 動きのある機能やボタン

### ボタンジェネレーター、Front-end Tools

https://front-end-tools.com/generateButton/

https://front-end-tools.com/

Front-end Toolsというサイトには紹介で載せたボタンジェネレータ―以外にも、グラデーションやアニメーションなどの様々なジェネレーターが存在し、ソースコードをコピペするだけで簡単に凝った見た目のサイトが出来上がります！個人的にはグラデーションジェネレーターが好きです。

### 動くWebデザインアイデア帳 

https://coco-factory.jp/ugokuweb/

ハンバーガーメニューやスクロールトップ、スライドショー、ギャラリーなど様々な動きのあるデザインが載っています。なんとこちらは書籍もあり、今年(2024年)の8月までしかwebの無料版は公開されないらしいので、参考にする場合はお早めに！それ以降は書籍購入者のみ見れるそうです。

## カラーなど
### color-wheel(Adobe Color)

https://color.adobe.com/ja/create/color-wheel

color-wheelでは1つの色に対して、ハイライトに使えそうなトライアドや類似色、シェードなどを提案してくれる優れものです！この色に似た色だけど少しパターンが欲しい、この色に対する差し色でいい色がないか探したいというときにピッタリです！

## ページデザイン参考
### SANKOU!

https://sankoudesign.com/

このサイトでは世の中にある素敵なサイトをたくさん紹介しています。レイアウトに行き詰ったときはおすすめです！！

## フォント
### Roboto

https://fonts.google.com/specimen/Roboto

ページ左上のfontsから様々な言語の無料フォントを検索できます。
個人的に英語のフォントはRalewayが好きです。Wの表示が可愛くておすすめです！

## おわり
以上が初心者の私が使えると思ったデザイン参考サイトでした！
デザインを考える際に参考にしていただければなと思います。
第一弾にはロゴのデザインなどもあるので、そちらもよければ。
VScodeで急にEmmetが使えなくなったときの対処法まとめ

# はじめに
　EmmetとはHTMLやCSSを省略記法で入力できるプラグインで，VScodeには標準搭載されています．非常に便利なプラグインなだけに突然使用できなくなるとかなりイライラします．この記事では，Emmetが突然使用できなくなったときの対処法を備忘録としてここに記します．

# 対処法1：プラグインが有効かどうか確認
　私の場合は，Emmetのプラグインがなぜか無効になっていて使用できなくなっていたというケースが最も多かったです．
### 1.1：左のバーの「拡張機能」→「・・・」→「表示」→「無効」を選択
![スクリーンショット 2024-03-26 23.20.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561867/62c91170-fe92-6adf-6591-04345e7448c7.png)

「無効」にEmmetがある場合はこれが原因で使えなくなっている．

### 1.2：Emmetを有効にする
![スクリーンショット 2024-03-26 23.23.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561867/640cc9a3-a5e9-52a7-4e9b-66a944f803b0.png)

# 対処法2：設定の確認
### 2.1：画面左下の歯車をクリックして，設定を選択
![スクリーンショット 2024-03-26 22.59.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561867/f240322a-1214-4d80-2c7b-ab6ebba13327.png)

### 2.2：検索窓に`emmet`と入力して，「Trigger Expansion On Tab」　にチェックを入れる
![スクリーンショット 2024-03-26 23.07.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3561867/9910bcc6-72ee-2714-30b6-1ae346bb909e.png)

# 対処法3：VScodeをインストールし直す
　読んで字の如く，VScodeをアンインストールして最新バージョンのVScodeをインストールし直す．再インストール後もEmmetが有効になっているか"対処法2"の方法でチェックする．

# おわりに
Emmet使用できるようになりましたでしょうか？この記事が皆さんの役に立つことを願ってます！
[Xcode] firebaseui-ios導入時のPackage Resolution Failedの対処法

# 発生した問題

`https://github.com/firebase/FirebaseUI-iOS.git` を Swift Package Manager でインストールする際に、以下のように表示されて失敗しました。

> **Package Resolution Failed**
FirebaseUI-iOS.git could not be resolved:

![その内容が表示されたXcodeスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566752/8d09b3b0-ae3e-06b3-80ea-7863bbd45ff6.jpeg)


# 対処法

Dependency Rule を `Branch` に変更し、その右側に `main` と入力することで、正常にインストールできました。

![説明用Xcodeスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566752/e21b5c86-ea9f-b661-1f7a-83c847c07abd.jpeg)
【Typescript】ユーザー定義型ガードisについて



## isとは
型推論を補強するもので、型の絞り込みをすることができる関数です。

isを使用しないパターンと使用するパターンの例を出して、isの便利さを説明できればと思います。

### isを使用しないパターン
```typescript
type Hoge = string | number;
const isNumber = (arg: Hoge): boolean => {
  return typeof arg === "number";
};

const baigaeshi = (arg: Hoge) => {
  if (isNumber(arg)) {
    console.log(arg * 2);
    // -------- ~~~ エラー
    // number型だと分かりきってはいるが、コンパイラはあくまで
    // Hoge型と推論しているので、stringかnumberかどちらかわからずエラーとなる
  }
};
baigaeshi(10);
```

### isを使用するパターン
```typescript
type Hoge = string | number;
const isNumber = (arg: Hoge): arg is number => {
// isを使うことで、返り値がtrueの場合、
// 返り値はnumber型であると、コンパイラに教えることができる。
  return typeof arg === "number";
};

const baigaeshi = (arg: Hoge) => {
  if (isNumber(arg)) {
    console.log(arg * 2);
    //コンパイラはnumber型であると教えてもらっているので、エラーとならない。
  } else {
    console.log(Number(arg) * 2)
  }
};
baigaeshi(5);
//[LOG]: 10 
```


## 参考
https://typescript-jp.gitbook.io/deep-dive/type-system/typeguard#yznotype-guard
【Unity】GetComponent を使わずに低負荷でコンポーネントを取得する方法を思いついたが間違っていた話

# はじめに

この記事は GetComponent より Dictionary の方が速い前提で書きました。
しかし下記の記事で逆だと知りました。

https://qiita.com/divideby_zero/items/959e6d73d4ec4c6c98bc

この記事は二の鉄を踏もうとした方が検索で見つけられるように残そうと思います。
ちなみに、頻繁に GetComponent するものは上に配置すると僅かに速くなるようです。

https://qiita.com/Gok/items/d2096c1369bb890ebbff

これより先は、先頭の記事を見つける前に私が書いた記事になります。

# 背景
私はヴァンサバライクなゲームを作る際、OnTriggerEnter 等で衝突した Collider から目的のコンポーネントを取得するために TryGetComponent（GetComponent）を使っていました。
しかし [GetComponent は重めの処理](https://qiita.com/uminohiyoko/items/1dfeae592402697be025#gameobject%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E6%93%8D%E4%BD%9C)なので、弾幕や無双ゲームといった大量の物体を扱うゲームでは利用頻度を減らしたいと思いました。
そこで私は、シングルトンな Dictionary\<GameObject, Component\> を用意して目的のコンポーネントを追加しておけば、GameObject をキーとして目的のコンポーネントを簡単かつ低負荷で取得できると考え、それを実現する **GetComponentDictionary** クラスを作りました。

# コード

https://github.com/yamara-mh/GenericCodes/blob/main/Codes/GetComponentDictionary.cs

```Enter Play Mode```で```Reload Domain```を無効にしても利用できます。

UniTask/UniRx がインポートされたプロジェクトで1行目/2行目をコメントアウトすると、Add() で追加されたコンポーネントの GameObject が破壊される際に自動で Remove() が呼ばれます。Component だけ破棄する際は Component の OnDestroy() に Remove() を追加し Add() の第二引数を false にしてください。

# 使い方

プレイヤーの弾が敵に当たり、敵がダメージを受けるといった具合の実装例です。

``` Enemy.cs
public class Enemy : MonoBehaviour
{
    [SerializeField] public int Hp;

    private void Start()
    {
        GetComponentDictionary<Enemy>.Add(this);
    }
    public void ReceiveDamage(int damage)
    {
        Hp -= damage;
    }
}
```

``` PlayerBullet.cs
using Generic;
using UnityEngine;

public class PlayerBullet : MonoBehaviour
{
    [SerializeField] private int damage;

    private void OnTriggerEnter(Collider other)
    {
        if (GetComponentDictionary<Enemy>.TryGetValue(other.gameObject, out var enemy))
        {
            enemy.ReceiveDamage(damage);
        }
    }
}
```
どうしてもPowerShellにhook関数を実装したかった

# はじめに
自宅のWindowsで作業するとき常にSSHに潜っていたのでローカルのShellを気にせずに生活していた。  
最近になり、ローカル環境で作業するに連れてPowerShellに愛着が湧いてきてこいつにもhook関数とか実装できるのか？と思い立った日に死に目を見た話をする。  

# hook関数とは
hook関数とは、bashやzshなどUnix系OSではお馴染みの、イベント関数のようなもの。  
特に、zshでのhook関数については[この記事](https://qiita.com/mollifier/items/558712f1a93ee07e22e2)がめっちゃ詳しく解説しているのでここでは解説しない。  

# なにがしたかったか？
とにかくキショプロンプトが好き。  
一文字プロンプトや、改行する度に文字の色が虹色に変わるプロンプトを見てニチャアとしている。  
そんな中、クソながプロンプトがプリントされていく姿を見て、流石に横転しそうになった。  

普段は、chpwd関数を使って、cdしたあとにカレントディレクトリを表示している。  

これによってプロンプトにディレクトリを含まなくても迷子にならないようにしている。
また、迷子になったらpwdやlsをするという運用をしている。  

これをWindowsでもやりたかった。
ただ、公式ドキュメント読みづらい。バージョンによって実装が変わっている。そもそも使っている人が存在しないなど様々な要因からとても苦戦した。
そのため、この世に存在するかもしれないPowerShellに住むシェル芸オタクのために、まとめることにした。

# 環境構築
今回、PowerShell 5.Xで行った。
バージョンは以下で確認できる。

```
echo $PSVersionTable
```

まず、profile.ps1というものを置く。
場所は環境に依存するので確認する。

```
echo $PROFILE
```

Microsoft.PowerShell_profile.ps1とプリントされているかもしれないが、ファイル名に禁忌とも言えるキモい文字が入っているのでprofile.ps1で作成した。
profile.ps1をprofileとして読むように設定する必要があるが省略。

一応、すべてが面倒臭い人向けに、これで動く。
```
notepad $PROFILE
```

# 実装
一応、chpwdという名前でhook関数っぽく実装する。
```PowerShellスクリプト:cdの簡易的再実装とpwd
function chpwd {
  if $($args[0] -eq $null) {
    Set-Location $HOME
  }else{
    Set-Location $args[0]
  }
  
  pwd
}
```

Set-LocationというのはPowerShellのコマンドレットというもの。
```
alias cd
```
とすると確認できるが、cdはSet-Locationへのエイリアスとなっている。
名前と対応が取れていないが、chpwdからの引数をそのままSet-Locationに渡すことでワーキングディレクトリを移動するという仕組みとした。  

最後に、pwdすることで、cdしたあとのワーキングディレクトリを表示して終わり。

これをaliasとして登録するだけなのだが、バージョンによってaliasの登録方法が異なる。

少なくとも5.X系では、
```PowerShellスクリプト:5.X系
Remove-Item Alias:cd
New-Alias cd chpwd
```
で動作した。

6以降では、
```PowerShellスクリプト:6以降
Remove-Alias -name cd
Set-Alias cd chpwd
```
とすることで動作するかもしれない。  

## あぶない！
cdのエイリアスを書き換えるということで結構危険なshell芸になる。  
もし、タイポなどで失敗してわけがわからなくなってしまった場合は
```
PowerShell -NoProfile
```
と打つことでプロファイルを読み込まずに起動することができる。

筆者は
```
vim profile.ps1
PowerShell
```
とすることでインスタントにprofileの書き換えを確認しているがnodepadを使う方法が無難だと思う。

`exit`がめんどくさいし。

## 仕上げ
```
function prompt{
  "YUKI.N>"
}

echo "YUKI.N>見えてる？"
```

プロンプトをオタクにして完成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92730/b42d0c43-7fa1-1730-8167-42f16882f640.png)

どうやら、ダメそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92730/4a0ed611-3972-f54b-cf73-88e8b4f251d3.png)

# おわりに
Windows PowerShellのダサいフォントと最悪なUXと共存するために、延々と電波なことを言い続ける異星人を住まわすことにしました。  
皆さんも、PowerShellの中の異星人をかわいがってあげてください。  
それでは。
Starshipが遅いときにやること

[starship](https://starship.rs)はあらゆるシェルを可愛くデコれる優れものです。
しかし、新しいPCを買ったら何故かプロンプトが目で認識できるくらいに遅くなった。古いPCとバージョンやら何やら比較するも、理由がわからず...
そんなとき、`starship timings`というコマンドを発見しました。これは、プロンプト出力の所要時間を計測してくれるコマンドです。これを叩いてみたところ

```sh
⌚ 22:54:10 ~\Desktop <base> took 9s
❯❯❯ starship timings

 Here are the timings of modules in your prompt (>=1ms or output):
 battery     -  284ms  -   ""
 directory   -   <1ms  -   "~\Desktop "
 conda       -   <1ms  -   "<base> "
 line_break  -   <1ms  -   "\n"
 character   -   <1ms  -   "❯❯❯ "
 time        -   <1ms  -   "⌚ 22:54:19 "
```

のような出力が得られました。どうやら、"battery"で時間を食っているようです。デフォルトでPCのバッテリーが少ないときに教えてくれる機能ですね。このときバッテリーは十分にあったので出力が`""`になっています。`starship config`でconfigファイルを開いて以下のように編集しました。

```
[battery]
disabled = true
```

そしたら解決しました。

多分新しいPCのOSかハードの方でバッテリーの数値取得が遅くなったとかそういう理由ですかね..
ARC175回答メモ

# 0.はじめに
　最近ARCの調子も上がらない感じですが、まぁ、一回さぼると
 さぼり続けそうなので参戦。
 AがさっぱりでBを見たところ、意外と行けそうだったので
 何回か再提出を繰り返しつつもAC達成。
 そのかいあってレートも+27の943と最盛期に近づけました。


# 1.A - Spoon Taking Problem
　右手左手に順番と円状と、コンテスト時はとっかかりすらつかめず
 お手上げでした。
　解説を見て、スプーンの取り方は、全員右を取るパターンと
 全員左を取るパターンしかないと分かり、まずそこに気づかないと
 解けないんだなーっとわかりました。
 逆に、そこさえ気づけば、右回りパターンと左回りパターンの
 合計で算出できました。 

　https://atcoder.jp/contests/arc175/submissions/51659825


# 2.B - Parenthesis Arrangement
　アットコーダーにありがちなかっこの組みあわせ問題。
 いろいろ試行錯誤の上3回WAを出しながらも解けました。
 【考え方】
  文字列Sから、すでに向きあっている括弧を省き
  組み合わせがない右かっこの数をRC、左かっこの数をLとする

  最小コストで正しい括弧列に操作するパターンは以下の３つ

  (1)全部コストAの操作で正しい括弧列にする
  　LとRCがそれぞれ3個ある場合、コストAの操作2回で
  　正しい括弧列にすることができる。
  
 １２３４５６
 ）））（（（
  ↓１と６を入れ替える
 １２３４５６
 （））（（）
   ↓３と４を入れ替える
 １２３４５６
 （）（）（）

 (2)LとRCの小さい方のうち偶数分だけコストAの操作、
 　残りをBの操作で正しい括弧列にする（LとRCの小さい方が奇数の時のみ可能）
   LとRCがそれぞれ3個ある場合、コストAの操作1回とコストBの操作2回で
  　正しい括弧列にすることができる。
  
 １２３４５６
 ）））（（（
  ↓１と６を入れ替える
 １２３４５６
 （））（（）
   ↓３と４を入れ替える
 １２３４５６
 （）（）（）

  (3)全部コストBの操作で正しい括弧列にする
  　LとRCがそれぞれ3個ある場合、コストBの操作6回で
  　正しい括弧列にすることができる。
 
 １２３４５６
 ）））（（（
 ↓１～６を入れ替える
 １２３４５６
 （（（）））

　上記3パターンをすべて計算して、一番小さい数を
 出力することでACとなりました。
 解説と若干違うのかな。（解説の内容をあまり理解できていない）

　https://atcoder.jp/contests/arc175/submissions/51651993


以上
【OCI】資格取得した

##【OCI】資格取得した
OCI無償資格取得プログラム対象資格試験に参加
https://www.oracle.com/jp/education/race2cert_97206-ja.html

##取得した資格一覧
Oracle Cloud Infrastructure 2023 Certified Architect Associate
Oracle Cloud Data Management 2023 Certified Foundations Associate
Oracle Cloud Infrastructure 2023 Certified Foundations Associate
Oracle Cloud Infrastructure 2023 AI Certified Foundations Associate

##学習方法
・MyLean
・ExamTopics

##感想
何度も落ちて、やっと4つ合格できた。
4つ併せた学習時間は、平日2時間の2カ月(40日)だから80時間以上は学習したと思う。
次はAZ-900の合格を目指す。
【初心者向け】自分用メモ


## はじめに
よく使うコードをコピペで使うために、まとめていきます！

:::note warn
この記事では詳しい説明は省きます。
言語関係なくメモしていくので使う際はしっかり確認すること。
:::

## BEM記法
Block__Element--Modifier

- bkock : 大枠となる独立した要素
- Element : Block内の要素
- Modifier : ちょっとした違いを表現する

※英単語をつなげるときは" - "１つ

例 : " header__nav-item--contact "


## HTML

### headタグ追加用
```html:headタグ
    <!-- ディスクプション１２０文字から１６０文字 -->
    <meta name="description" content="ページの内容を表す文章">
    
    <!-- OGP -->
    <meta property="og:site_name" content="サイト名">
    <meta property="og:type" content="ページのタイプ">
    <meta property="og:url" content="ページのURL">
    <meta property="og:title" content="ページのタイトル">
    <meta property="og:description" content="ページの説明">
    <meta property="og:locale" content="ja_JP">
    <meta property="og:image" content="画像のURL">
    <meta name="twitter:card" content="summary">

    <!-- stylesheet -->
    <link rel="stylesheet" href="css/reset.css">
    <link rel="stylesheet" href="css/style.css">
```

### タグの使い分け
<dl>
  <dt>header</dt>
  <dd>・headrを構成するタグ</dd>
  <dd>・単体で使用</dd>
  
  <dt>footer</dt>
  <dd>・footerを構成するタグ</dd>
  <dd>・単体で使用</dd>
  
  <dt>nav</dt>
  <dd>・ナビゲーションを構成するタグ</dd>
  <dd>・単体か、header・footerの入れ子として使用</dd>
  
  <dt>main</dt>
  <dd>・メインコンテンツを構成するタグ</dd>
  <dd>・1ページに1回使用</dd>
  
  <dt>article</dt>
  <dd>・単独で成り立つコンテンツに使用</dd>
  
  <dt>aside</dt>
  <dd>・メインとの関係性の薄いコンテンツに使用</dd>
  <dd>・サイドバーや広告など</dd>
  
  <dt>section</dt>
  <dd>・章を構成するタグ</dd>
  <dd>・mainやarticle内で使用することが多い</dd>
</dl>


## CSS

### 共通スタイル
```css:style.css
/* common */
body {
  color: #434343;
  background-color: #f8f8f8;
}

img {
  width: 100%;
}

a:hover {
  opacity: .7;
}
```

### フォントファミリー
```css:style.css
/* ゴシック */
.gothic {
    font-family: "Helvetica Neue", "Helvetica", "Hiragino Sans", "Hiragino Kaku Gothic ProN", "Arial", "Yu Gothic", "Meiryo", sans-serif;
}

/* 明朝 */
.mincho {
    font-family: "Times New Roman", "YuMincho", "Hiragino Mincho ProN", "Yu Mincho", "MS PMincho", serif;
}
```

https://fonts.google.com/


### レスポンシブデザイン
```css:style.css
/*****************
responsive
******************/
@media screen and (max-width: 768px) {


}
```

## JavaScript

```haml:index.html
<head>
    <!-- jQuery用のstylesheetがある場合は、reset.cssとstyle.cssの間に書く -->
</head>

<body>

  <!-- jQuery -->
  <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>

  <!-- jQuery用のファイルがある場合は、この間に書く -->
    
  <!-- original js -->
  <script src="js/main.js"></script>
</body>
```

https://jquery.com/

https://swiperjs.com/

https://github.com/wanakijiji/hamburger-menu

https://github.com/ajayy004/accordion






## さいごに
必要に応じて更新していきます。
【HTML,CSS】HTML,CSSのみで青看板を作る #2

# はじめに
こんにちは! 中学2年生のWardHamamatsu67です! 少し遅れましたが、青看板Part2やりたいと思います。
今回も神奈川県にある青看板を作っていきたいと思います。
一番左に矢印がある青看板です。
# HTMLのコード
```html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8"/>
        <title>青看板</title>
    </head>
    <link rel="stylesheet" href="blue1.css">
    <body>
        <div class="outer">
            <div class="box" id="one" style="text-align:center;">横浜 32km
            <br>Yokohama<br>
            </div>
        </div>
        <div class="outer1">
        <div class="box1" id="one1" style="text-align:left;">海老名 9km
            <br>Ebina<br>
        </div>
        </div>
        <div class="outer2">
            <div class="box2" id="one2" style="text-align:left;">↑</div>
        </div>
    </body>
</html>
```
前回同様、説明は省きます。
# CSSのコード
```css
* {
    box-sizing: border-box;
  }
  
  .box {
    width: 500px;
    height: 300px;
    background: red;
    color: white;
    font-size: 30px;
  }
  
  #one {
    position: fixed;
    top: 80px;
    left: 10px;
    background: blue;
  }
  
  .outer {
    width: 500px;
    height: 300px;
    padding-left: 150px;
  }
  * {
    box-sizing: border-box;
  }
  
  .box1 {
    width: 250px;
    height: 160px;
    background: red;
    color: white;
    font-size: 30px;
  }
  
  #one1 {
    position: fixed;
    top: 216px;
    left: 216px;
    background: blue;
  }
  
  .outer1 {
    width: 500px;
    height: 80px;
    padding-left: 150px;
  }
  * {
    box-sizing: border-box;
  }
  
  .box2 {
    width: 70px;
    height: 100px;
    background: red;
    color: white;
    font-size: 180px;
  }
  
  #one2 {
    position: fixed;
    top: 100px;
    left: 16px;
    background: blue;
  }
  
  .outer2 {
    width: 500px;
    height: 80px;
    padding-left: 150px;
  }
```
「海老名 9km」の文字が入った青看板は横に長くするとよいかもです。
# 完成図
![スクリーンショット 2024-03-26 225124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749972/b4e4edaa-4e13-9c04-d7a7-f63a04f4d9af.png)
「横浜」の文字を中央に寄せたため、と「海老名」が少しずれていますが、何とかできました。
# おわりに
今回作った青看板は前回作ったものと比べてもとても簡単でした。もしHTML,CSSのみで青看板を作りたい人がいれば、こちらから作るのをお勧めします。
この記事が良いと思った方はいいねとフォローをしてくれると嬉しいです。
【Typescript】便利だけどたまにしか使わない忘れがちなユーティリティ型

## ユーティリティ型
そもそもユーティリティ型がなにかと言うと、型を別の型に変換してくれる型のことです。
たくさんありますが、私が最近よく遭遇したものを挙げてみます。

### Record
Record<Keys, Type>はプロパティのキーがKeysであり、プロパティの値がTypeであるオブジェクトの型を作るユーティリティ型です。
```typescript
type Person = Record<"firstName" | "middleName" | "lastName", string>;
const person: Person = {
  firstName: "Robert",
  middleName: "Cecil",
  lastName: "Martin",
};
```
https://typescriptbook.jp/reference/type-reuse/utility-types/record

### Exclude
Exclude<T, U>は、ユニオン型TからUで指定した型を取り除いたユニオン型を返すユーティリティ型です。
名前通り、除外することができます。

```typescript
type Grade = "A" | "B" | "C" | "D" | "E";
type PassGrade = Exclude<Grade, "E">;

// 上のPassGradeは次の型と同じになります。

type PassGrade = "A" | "B" | "C" | "D";
```
https://typescriptbook.jp/reference/type-reuse/utility-types/exclude

### Extract
Extract<T, U>は、ユニオン型TからUで指定した型だけを抽出した型を返すユーティリティ型です。
`Exclude`とは逆ですね。名前が似ていてどっちがどっちかややこしいです。

```typescript
type Grade = "A" | "B" | "C" | "D" | "E";
type FailGrade = Extract<Grade, "D" | "E">;
        
// type FailGrade = "D" | "E"
```

https://typescriptbook.jp/reference/type-reuse/utility-types/extract

## 参考
https://zenn.dev/oreo2990/articles/9cda9a47c771ae
named-pipe-wrapper .NET8

# Changes in NamedPipeWrapper Project

[Ver 2.0 Master History](https://github.com/mikihiro-t/named-pipe-wrapper/commit/f657658ed260852fc02f949e251cc355ae0ab064)

To port from .NET Framework 4.0 to .NET 8, change the following files.

#### Modify 3 files
- NamedPipeServer.cs
- PipeStreamWriter.cs
- PipeStreamReader.cs

#### Add 1 file
- Globals.cs
---

#### NamedPipeServer.cs

Before
```csharp
public static NamedPipeServerStream CreatePipe(string pipeName, PipeSecurity pipeSecurity)
{
    return new NamedPipeServerStream(pipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous | PipeOptions.WriteThrough, 0, 0, pipeSecurity);
}
```

After
```csharp
public static NamedPipeServerStream CreatePipe(string pipeName, PipeSecurity pipeSecurity)
{
    var stream = new NamedPipeServerStream(pipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous | PipeOptions.WriteThrough, 0, 0);
    if (pipeSecurity is not null) stream.SetAccessControl(pipeSecurity); //Windows Only
    return stream;
}
```

#### PipeStreamWriter.cs

Before
```csharp
private readonly BinaryFormatter _binaryFormatter = new BinaryFormatter();

try
{
    using (var memoryStream = new MemoryStream())
    {
        _binaryFormatter.Serialize(memoryStream, obj);
        return memoryStream.ToArray();
    }
}
```

After
```csharp
try
{
    var byteArray = JsonSerializer.SerializeToUtf8Bytes(obj, Globals.JsonOptions);
    return byteArray;
}
```

#### PipeStreamReader.cs

Before
```csharp
private readonly BinaryFormatter _binaryFormatter = new BinaryFormatter();

using (var memoryStream = new MemoryStream(data))
{
    return (T) _binaryFormatter.Deserialize(memoryStream);
}
```
After
```csharp
using (var memoryStream = new MemoryStream(data))
{
    var obj = JsonSerializer.Deserialize<T>(memoryStream, Globals.JsonOptions);
    return obj;
}    
```

#### Globals.cs

Add Globals
```csharp
namespace NamedPipeWrapper
{
    public static class Globals
    {
        public static readonly JsonSerializerOptions JsonOptions = new()
        {
            ReferenceHandler = ReferenceHandler.Preserve,  //cyclical references OK
        };
    }
}
```
【UiPath】オフラインで利用できるOCR

# はじめに

- 本記事では、オフラインで利用可能なOCRを扱います。
- 記事の内容は、個人の見解または確認結果であり、UiPath の公式見解ではありません。
- 製品仕様や参考画像は 23.10 バージョンのもので構成しています。

# オフラインで利用できるOCR

|OCR| 備考|
|:---:|:---:|
| Tesseract OCR | 日本語 〇（言語データを取得し、所定のパスに配置する必要あり）　／　参考：https://forum.uipath.com/t/tessdateocr-jpn/421517 |
| OmniPage OCR | 日本語 〇　／　UiPath.OmniPage.Bundle.Extended のインストールが必要 |
| UiPath Document OCR | 日本語 ×（半角英数字 〇）　／　UiPath.DocumentUnderstanding.OCR.LocalServer のインストールが必要 |

本記事では次の画像（JPEG）をもとに精度の参考情報を記載します。

![オフラインOCR.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/37093088-97f3-f0b5-68e2-638c481dad16.jpeg)

- 動作確認に利用するパッケージバージョンはこちら↓↓
"UiPath.DocumentUnderstanding.Activities": "[2.4.1]",
"UiPath.DocumentUnderstanding.OCR.LocalServer": "[1.5.1]",
"UiPath.IntelligentOCR.Activities": "[6.14.1]",
"UiPath.OmniPage.Activities": "[1.13.0]",
"UiPath.OmniPage.Bundle.Extended": "[1.3.1]",
"UiPath.System.Activities": "[23.10.5]",
"UiPath.UIAutomation.Activities": "[23.10.7]"

## Tesseract OCR

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/70912071-8d3d-fa20-b0d6-5406f4744eb9.png)

■利用方法
1. 次のリンクより言語ファイル（jpn.traineddata）を取得
https://github.com/tesseract-ocr/tessdata/raw/4.00/jpn.traineddata
1. C:\Users\{ご自身のアカウント}\AppData\Local\Programs\UiPath\Studio\tessdata 以下に上で取得した言語ファイルを配置
1. 「ドキュメントをデジタル化」アクティビティに「Tesseract OCR」を配置し、プロパティに次を指定します。画像用のプロファイル：「Scan」　単語抽出：ON　言語：jpn

![オフラインOCR2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/d4f1aab6-e79e-ad8a-4ec0-44302339fd74.jpeg)

## OmniPage OCR

![オフラインOCR_Omni.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/f444f81f-9035-9db4-591e-614766008929.jpeg)

■利用方法
1. パッケージを管理より UiPath.OmniPage.Bundle.Extended をインストール
1. 「ドキュメントをデジタル化」アクティビティに「OmniPage OCR」を配置し、プロパティに次を指定します。画像用のプロファイル：「Scan」　単語抽出：ON　手書きテキストを抽出：ON　言語：jpn

![オフラインOCR3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/192f9a00-1767-22ae-943b-8c0784794e1f.jpeg)

## UiPath Document OCR

![オフラインOCR_UiPathドキュメントOCR.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/a10a5b2c-09e2-8b55-867a-5b7a43cd7485.jpeg)

■利用方法
1. パッケージを管理より UiPath.DocumentUnderstanding.OCR.LocalServer をインストール
1. 「ドキュメントをデジタル化」アクティビティに「UiPath ドキュメント OCR」を配置し、プロパティに次を指定します。ローカルサーバーを使用：True

![オフラインOCR4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/6c5ad629-15d5-dc8c-5349-bcd5554043f7.jpeg)

## おまけ（オンライン×有償のCJK-OCRの例）

![オフラインOCR_CJK-OCR.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301444/86774a1b-bea1-75c0-a818-f7549623b3c7.jpeg)

# さいごに

いかがでしたでしょうか。簡単なサンプルの紹介のみなので、どれが優れているといった結論等は書きません。
OCRは文字のサイズや太さ、周辺の罫線の影響を敏感に受けます。
筆者の少ない経験値からであてにはなりませんが、***10～20pt 程度で細い字、周辺に罫線がないケースであれば有償OCRはほぼ読めます。***
今回紹介した***オフライン（無償）の OmniPage や Tesseract OCR でもある程度は読めます。***
読み取れたときだけでも何かのチェックで役に立つならオフラインのOCRも役に立ちます。
身近な業務で目視チェックが発生しているものがあれば利用を検討してみてはいかがでしょう。
最後までお読みいただきありがとうございます(・ω・)ノ
【HTML】HTMLのページにGoogle Mapの地図を埋め込む方法

# はじめに
こんにちは! 中学2年生のWardHamamatsu67です! 前回に引き続き、青看板をつくろうと思っていたのですが、少し気分転換で楽な記事を投稿しようと思います。
今回はHTMLにおける、地図の埋め込みです。結構簡単にできます。
# 手順
①ページで紹介したい場所をクリック(ここでは茨城県土浦市の霞ケ浦総合公園)
![スクリーンショット 2024-03-26 215059.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749972/8b2153cb-16f7-34e0-ddb8-3270822abbf9.png)
②「共有」をクリック
![スクリーンショット 2024-03-26 215240.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749972/05e504f8-507e-2297-a7bd-98a05e37fdf5.png)
③右側の「地図を埋め込む」をクリック
④「HTMLをコピー」をクリックしてコードをコピーする
![スクリーンショット 2024-03-26 215421.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749972/2ed5c1bb-3cc5-9e19-9ad5-0297610dbec1.png)
⑤コピーしたHTMLコードをHTMLファイルの好きなところに貼り付ける
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<p>
<br>&lt;霞ヶ浦総合公園の位置&gt;<br>
</p>
<br>
<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3225.2440441387134!2d140.21818016622757!3d36.0631511643635!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x60226d1c3b8f5c1f:0x42a048c0e5b6c6d4!2z6Zye44O25rWm57eP5ZCI5YWs5ZyS!5e0!3m2!1sja!2sjp!4v1669964797359!5m2!1sja!2sjp"
width="600" height="450" style="border:0;" allowfullscreen="" loading="lazy"
referrerpolicy="no-referrer-when-downgrade"
></iframe>
<br>
</body>
</html>
```
# おわりに
以上です。
図を用いたため結構長くなりましたが、いざやってみるととても簡単にできるので皆さんもぜひやってみてください!
この記事が良いと思った方はいいねとフォローをしてくれると嬉しいです。
【IICS】Oracleから"invalid character"を含むデータを取得する方法

　IICSのCDIを使って、Oracle DBからテーブル名が英語ではなく日本語のものを取得する際に、エラーが発生しました。
 　エラーコードとそのエラーの解消方法をまとめます。

# エラーコード
```
RR_4035 SQL Error [ FnName: Execute -- [Informatica][ODBC 20101 driver][Oracle]ORA-00911: invalid character]. 
```

# 解消方法
　結論から言えば、ランタイム環境の設定を変更することになります。

 手順1:管理者画面から、利用するランタイム環境を選択
 手順2:利用するSecure Agentを選択、「編集」を押下
 手順3:「カスタム構成の詳細」に以下のパラメータを新規に追加する
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2777094/87a600cd-4e3e-d901-d025-fa7a70150522.png)
　サービス：Data Integration Server
　タイプ：DTM
　名前：UseCustomSessionConfig
　値：yes
 手順4:手順3までで変更した設定を「保存」
 手順5:data integration serviceが再稼働するまで待つ

# 参考
　本記事は、以下のInformaticaのKBを参考にしました。本記事に挙げたエラーとその解消方法は私が調べた限りでは以下のKBしかなく、日本語によるTipsは見つかりませんでした。IICSを扱う日本人のユーザの参考になれば幸いです。

https://knowledge.informatica.com/s/article/000186468?language=en_US
AppleDeveloperProgramの自動更新をアプリで行う

## AppleDeveloperアプリを使用した自動更新の方法
AppleDeveloperProgramはWebで行うと手動更新で値段が高いですが、Apple Developerアプリから登録や更新を行うと年間の料金が安くなり自動更新になります。

<br>

個人的に便利だと思うのですが、まだまだ知らない人も多いみたいなので以前個人ブログで書いた方法を転載しておきます。

https://sunny10side.com/difference-in-fees-depending-on-how-you-register-appledeveloperprogram/
Pythonで「先読みと後読みを使ったパターンの記述」の動作を確認してみた

# 概要

Pythonで「先読みと後読みを使ったパターンの記述」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/regex/index16.html

# 実装

以下のファイルを作成しました。
```sample.py
import re
pattern = re.compile(r'smart(?=phone)')
print(bool(pattern.search('smart')))
print(bool(pattern.search('smartphone')))
print(bool(pattern.search('smartwatch')))
result = pattern.search('smartphone')
print(result.group(0))

import re
pattern = re.compile(r'smart(?!phone)')
print(bool(pattern.search('smart')))
print(bool(pattern.search('smartphone')))
print(bool(pattern.search('smartwatch')))
result = pattern.search('smartwatch')
print(result.group(0))

import re
pattern = re.compile(r'(?<=digital)camera')
print(bool(pattern.search('camera')))
print(bool(pattern.search('digitalcamera')))
print(bool(pattern.search('analogcamera')))
result = pattern.search('digitalcamera')
print(result.group(0))

import re
pattern = re.compile(r'(?<!digital)camera')
print(bool(pattern.search('camera')))
print(bool(pattern.search('digitalcamera')))
print(bool(pattern.search('analogcamera')))
result = pattern.search('analogcamera')
print(result.group(0))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
False
True
False
smart
True
False
True
smart
False
True
False
camera
True
False
True
camera
```

# まとめ

何かの役に立てばと。