OmniAICreator/Qiita-1.07M huggingface dataset:
JavascriptとCSSのfixedでヘッダーを固定しつつ横スクロールさせた話とAWSでデプロイした話

# AWSのデプロイした話から

昨日めでたく実務で初デプロイをしてきました。めでたい！
ちょこっとした修正ですが、引き継ぎでもらったコードだったので、
読むの疲れた、、、

ってことで、デプロイの流れを。

# まずはデプロイ用のブランチを最新に
gitの管理はソースツリーを使っております。
他のツールでも大体一緒なはず。


デプロイ用のブランチとdevブランチをマージで統合

→リモートリポジトリへプッシュ

→AWSのEC2インスタンスにSSH接続
※インスタンスに入るときは、.sshディレクトリに入ってからね。ここに鍵になるpemファイルが入ってないとだめ。
私はホームディレクトリからやって繋がんなくてちょと焦った。

→AWS内でさっき最新にしたデプロイ用のブランチをgit pull！
これで完了。

Laravelのマイグレーションファイルを作ってたり、DBのカラムを作成していたら、
本番環境のDBの更新も忘れずに行います。

# これでデプロイ完了！めでたい！
ビールを飲んで完了です。

# Javascriptでの横スクロールとCSSのfixedでヘッダーを固定しつつ横スクロールを実装した話
ということで、タイトルの話を。

ここで詰まったきっかけは、
CSSのposition:stickyとoverflow:xyが打ち消しあってしまい。
Gridは縦横スクロールしながら、ヘッダーは横スクロール、縦スクロール時は固定
という挙動が実装できなかったのです。

# 結論から
ヘッダーの固定は、position:fixed
ヘッダーの横移動はJSのscroll使ってデータテーブルのスクロールの値を取得、
同様の動きをヘッダーがする様にstyleのleft値を変更する関数を使う。

という形になりました。

ひっじょーに参考になった記事がありましたので、共有。
参考 https://tech.arms-soft.co.jp/entry/2022/04/20/090000

```Javascript
const element = document.querySelector('.js-scroll-x')
//要素を指定
  
window.addEventListener('scroll', () => {
  element.style.left = -window.pageXOffset + 'px'
})
//windowのスクロール距離を取得して、指定した要素のstyleに距離をマイナスでpx単位で追加
```

神、、、

自分のコードに合わせてちょっと変えたらできた。
スクロールするのが、windowではなく、tableだったので、

tableのスクロール距離を変数に格納して、
window.pageXOffsetの代わりに変数を入れた。

うーん。いい感じ。
まだ仕上げは残ってるけど、まあ実質おわりじゃろ！
完成したらコミケ行くんだ、、、！

ってことでチューハイ飲んで寝まっす！


おわり。
せんせー、グリーンテクノロジーってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、グリーンテクノロジーってなに？

# グリーンテクノロジーとは

グリーンテクノロジーとは、地球や自然を守るための特別な技術のことです。

たとえば、君がお部屋でお絵かきをするとき、使い終わった紙は捨てずに裏返して再利用したり、
色鉛筆のかけらを大切に使ったりするよね。これは、物を無駄にしないためと、自然を守るためですよね。

グリーンテクノロジーも同じで、地球や自然を守るために、
エネルギーを節約したり、ゴミを減らしたり、きれいな空気を保ったりするための特別な方法や機械を考え出します。

例えば、太陽の光を電気に変える「ソーラーパネル」や、
風力を利用して電気を作る「風力発電」などがあるんです。
また、雨水を集めて使ったり、ゴミからエネルギーを作ったりする方法もグリーンテクノロジーの一部なんです。

このような技術を使うことで、地球や自然を大切に守り、私たちがより良い環境で生活できるようにするんだ。
だから、「グリーン（緑）」テクノロジーと呼ばれているんです。

# まとめ

グリーンテクノロジーとは、地球や自然を守るための特別な技術のこと
Git 過去のコミットメッセージを変更する

# 概要

- push前の過去のコミットメッセージを変更する方法を簡単にまとめる。

# 方法

1. 下記コマンドを実行してコミットメッセージを修正したいコミットが現在から何個前なのかを確認する。

    ```shell
    git log --stat
    ```

1. 下記コマンドを実行してviを開く。

    ```shell
    git rebase -i HEAD~「何個前」の数値、2個前なら「2」になる
    ```

1. 修正したいコミットの「pick」を「edit」に変更する。
1. 保存する。
1. 下記コマンドを実行してコミットを修正する。

    ```shell
    git commit --amend
    ```

1. コミットメッセージの変更を行う
1. 下記を実行して歴史をもとに戻す。

    ```shell
    git rebase --continue
    ```
curlでQiitaOrganizationのユーザー一覧を取得する方法

# やりたいこと
Organizationの「メンバー」ページで見られるユーザー名の一覧が欲しい。
たったこれだけ、しかも「たまぁに」一覧が欲しいだけ。

## 困ったこと
「ブラウザでページを表示して１つ１つコピペ」は面倒くさくてやりたくない。
Qiita Apiを使おうと思って[Qiita API v2ドキュメント - Qiita Developer](https://qiita.com/api/v2/docs)をみると・・・Organaizationの情報を取得できるAPIがない・・・。
ググると「Pythonでスクレイピング」というのもいくつか見かけたけれど、ただユーザーを取得したいだけなのでもっと気軽にパッとやりたい。

# Organizationのユーザー一覧を取得する方法
1. (なければ)[jqコマンドをインストールする](https://qiita.com/ponsuke0531/items/aa405a0f897cd0a78a8c)
1. 以下の「{OrganizationのURLになる部分}」を設定してからコマンドで取得する

```bash
$ curl https://qiita.com/organizations/{OrganizationのURLになる部分}/members | grep -o '{"organization":{"paginatedMemberships.*\/script' | sed -e 's/\<\/script//g' | jq '.organization.memberships.edges[].node.user.urlName'
```

[株式会社オープントーンのOrganization](https://qiita.com/organizations/opentone)の場合はこんな感じ。

```bash
$ curl https://qiita.com/organizations/opentone/members | grep -o '{"organization":{"paginatedMemberships.*\/script' | sed -e 's/\<\/script//g' | jq '.organization.memberships.edges[].node.user.urlName'
"ot_RikuOta"
"TakayukiHatanaka"
"SJJ"
"chovin"
....
```

:::note warn
注意
Organizationのページ構成が変更になると、上記では対応できない可能性がある。
:::


## コマンドでやっていること
### 1. Organizationの「メンバー」ページのHTMLを取得する
`curl {「メンバー」ページのURL}`でまずはHTMLを取得する

### 2. JSONを抜き出す
「メンバー」ページには以下のようなJSONがある
```html:HTMLの一部分
<script type="application/json" class="js-react-on-rails-component" data-component-name="OrganizationMembershipsIndexPage" data-dom-id="...">
    {"organization":{...}}
</script>
```

このJSONを抜くためにHTMLから「`{"organization":{"paginatedMemberships`」から「`/script>`」までを以下で抜き出す。

```bash
grep -o '{"organization":{"paginatedMemberships.*\/script'
```

そうすると以下のような文字列が抜ける。
```json
{"organization":{"paginatedMemberships":...}}</script
```

最後にくっついている余計な`</script`を以下で削除する。
```bash
sed -e 's/\<\/script//g'
```

そうするとJSON形式の文字列になる。

### 3. jqコマンドでJSONを加工する
「organization」の中の「memberships」の中の「edges」配列ないから「user」の中の「urlName」を取得する。

```json:JSONの大まかな構成
{
  "organization": {
    // ...省略...
    "paginatedMemberships": {...},
    // ...省略...
    "memberships": {
        "edges": [
            {
                "node": {
                    "user": {
                        "urlName": "ここにユーザー名がある",
    // ...省略...
```

jqコマンドだとこんな感じで書く
```bash
jq '.organization.memberships.edges[].node.user.urlName'
```

:::note info
「paginatedMemberships」にもユーザー情報が格納されているものの、1ページ分の情報しかない。
ユーザー名さえ抜ければ良かったので今回は「memberships」をつかったものの
「paginatedMemberships」のほうが投稿記事数などもあって得られる情報は多い。
:::

# さいごに
「気軽にパッとやりたい」からはじまって、途中からほぼ意地で取得した。
Organizationの情報は、APIでは取得できないけれど

1. OrganizationページのHTMLをじっとみつめる
1. `type="application/json"`を探す
1. 欲しい情報を持っているJSONを根性で見つける
1. jqコマンドで抜く

というやり方で取得することが可能であることを知った。
せんせー、スマートシティ技術ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、スマートシティ技術ってなに？

# スマートシティ技術とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/754ad1db-cf66-be94-8f33-137d3e28f1cc.png)

スマートシティ技術っていうのは、街をもっと便利で快適にするための特別な技術のことです。

君がお家で遊ぶときに、おもちゃの町を作って遊んだことがありますか？
そこに車や家や人々がいて、それぞれが役割を持って動いているんです。
でも、想像してみてください。
もし、そのおもちゃの人々や車が自分で考えたり、自分で動けたりしたら、
もっと楽しくて面白い町になるかもしれないですよね。

スマートシティ技術とは、それを現実の街で実現しようとする技術のことなんです。
例えば、信号が自動で調整して交通渋滞を少なくしたり、街灯が必要なときだけ点灯して節電に貢献したり、
ゴミ箱がいっぱいになると自動で知らせたりするんです。

それに、スマートシティでは、公園の木々や花々がどれだけ水が必要か自分で知らせてくれたり、
病院が患者さんが来る前にどんな手当てが必要かを知ったりもします。

これらすべてが、街をもっと良く、もっと賢く、そしてもっと「スマート」にするんです。
だから、それを「スマートシティ技術」と呼んでいるんです。
君が大きくなったら、もっとたくさんのスマートシティがあるかもしれないですね。

# まとめ

スマートシティ技術っていうのは、街をもっと便利で快適にするための特別な技術のこと
せんせー、エッジコンピューティングってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、エッジコンピューティングってなに？

# エッジコンピューティングとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/754ad1db-cf66-be94-8f33-137d3e28f1cc.png)

エッジコンピューティングというのは、ちょっと難しいけれど、すごく便利な仕組みなんだよ。

君がおもちゃの箱を使って遊ぶとき、全部のおもちゃを一つの箱に入れて、
毎回その箱からおもちゃを取り出すと、時間がかかるよね。
でも、よく使うおもちゃは手元の小さな箱に入れておくと、すぐに遊べるよね。
エッジコンピューティングもそんな感じの仕組みです。

コンピューターの世界では、たくさんの情報があるんだけど、
そのすべてを遠くの大きな箱（これを「クラウド」といって、大量の情報を保存したり処理したりするコンピューターのことを指すよ）に頼ると、情報を取り出すのに時間がかかったり、
遠くのコンピューターが忙しいときはなかなか使えなかったりすることがあるんです。

だから、よく使う情報や、すぐに必要な情報は、
手元の小さな箱（これが「エッジ」のコンピューターだよ）に入れておきます。
そうすると、すぐに情報を取り出したり、新しい情報を入れたりすることができます。
これがエッジコンピューティングの基本的な考え方です。

でも、エッジコンピューティングは、コンピューターの専門家が使うものです。

# まとめ

エッジコンピューティングは手元の小さな箱に入れておくと、すぐに遊べる。そんな感じの仕組み
Outsystems Comsume REST API ステータスコード取得

# Comsume REST APIでステータスコード取得

OutsystemsでRest APIでは、通常だとレスポンスからはBody情報しか受け取れない。
さらに、ステータスコードが400以上だと例外を発生させるため、その処理を書かないといけない。
なので、取得元のレスポンスがステータスコードで判断する場合、例外ハンドリングを書かないといけないため少々面倒。。。

[RESTエラー処理](https://success.outsystems.com/ja-jp/documentation/11/extensibility_and_integration/rest/consume_rest_apis/handling_rest_errors/)


呼び出し元でステータスコードの判断をしたい場合は、コールバックであるOnAfterResponseを使って以下処理を追加する必要がある。
1. レスポンスbodyにステータスコードを設定・・これを呼び出し元で判断
2. ステータスコードを200に設定・・これにより、REST APIで例外スローを抑止することができる。

はぁ、普通に判断させてくれよ。。

少なくとも、例外処理からメインフローに合流させてくれ！
せんせー、サイバーセキュリティーってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、サイバーセキュリティーってなに？

# サイバーセキュリティーとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/754ad1db-cf66-be94-8f33-137d3e28f1cc.png)

サイバーセキュリティっていうのは、インターネットの世界で私たちを守るためのものです。

君が自転車に乗るときにヘルメットをつけるのと同じで、
コンピューターやスマートフォンを使うときにも、
悪い人や悪いプログラムから守るための"ヘルメット"のようなものだと思っでください。

悪い人たちは、君の大切な情報を取ったり、
君の使っているコンピューターやスマートフォンを壊したりしようとすることがあるんです。
だから、それを防ぐために、サイバーセキュリティというのが必要なんです。

例えば、自分の名前や住所、パスワードなどを他人に教えないようにすることや、
知らない人から来たメールを開かないようにすることなどが、サイバーセキュリティの一部なんです。

大切なことは、コンピューターやインターネットを使うときには、
いつも注意して、自分の情報を守ることです。
そして、分からないことがあったら、すぐに大人に聞くことが大切です。


# まとめ

サイバーセキュリティっていうのは、インターネットの世界で私たちを守るためのもの
データ取り込み機能の違い（update set/import set/XML抜き出し/手作業）

ServiceNowで環境ごとのデータ移行には様々な手段があります。以下に代表的なものを示します。
1.Update Set
2.Import Set
3.XML抜き出し
4.手作業
それらの違いのざっくりとした肌感。
1.Update Setは機能改修・追加
2.Import Setは大量データの取り込み
3.XMLは小規模データの取り込み。目視できるのと、渡しやすいのがメリット
4.手作業はレポートなど、一部Update Setには乗らないものをやむを得ないので行う

基本的には1＞2＞3＞4の使用頻度で移行手順は作成されるべきと考えます。理由は手作業は容易にミスオペに繋がるからです。
レポート表示で項目（カラム）を結合させるMultiple datasetの設定と限界数

ServiceNowのレポートは運用でよく使う機能です。その中で棒グラフや折れ線グラフを表示すると思いますが、その時に個別の項目を、一定だけ結合させたいという場面もあると思います。
その時に活用するのはMultiple Datasetです。一つのレポートに複数のテーブルから情報を参照させることで上記を実現します。詳細はDocumentsにあるので割愛です。

そのMultiple Datasetですが、無尽蔵にデータセットを指定できるわけではなく最大数は5です。サポートに問い合わせてもその回答でしたので、限界数を超えることはできないです。最大5という気づきのメモです。
せんせー、ドローン技術ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、ドローン技術ってなに？

# ドローン技術技術とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/754ad1db-cf66-be94-8f33-137d3e28f1cc.png)

ドローンは、リモコンで操作する小さな飛行機のようなものです。
僕たちが公園で遊ぶラジコン飛行機と似ているんだけど、ドローンはもっと賢いんです。

ドローンは、リモコンで前後左右に動かしたり、高く飛ばしたり、地面に近づけたりすることができます。
そして、ドローンにはカメラがついていて、ドローンが飛んでいる場所の映像を見ることができるんです。

例えば、
ドローンを使って高い場所から下を見たり、遠くの景色を見たりすることができます。
また、人間が行きにくい場所にドローンを飛ばすことで、人間が安全にその場所を確認することもできます。

ドローンは、ただ遊ぶだけでなく、たとえば山火事の現場を確認したり、
農作物を見るために使ったり、荷物を運んだりするのにも使われているんです。
これからもどんどん色んな使い方が増えていくと思います。

でも、ドローンを飛ばすときは、飛ばしてはいけない場所や、
人に迷惑をかけるようなことはしないように、大人と一緒に遊ぶことが大切です。

せんせーはバイトを3つ掛け持ちして、法律変わって飛ばせなくなった例をしっています。

https://youtu.be/dNvoXJEMbg4

# まとめ

ドローンは、リモコンで操作する小さな飛行機のようなもの
Railsで画像を表示する方法、Bootstrapのスタイルの当て方

Railsでアプリを作成時、探し出すのに苦労したのでここに残します。

### Railsで画像を表示させたいとき

Railsでは、HTML方式も使えるし、Rubyも使えるので迷いがち画像を表示させようと、<img src="">を使用すると、うまく画像が表示させられない。
そんなとき、画像はimage_tagを使うべし!
assets/imagesフォルダに画像を入れ下記のように記述で表示できる。
```
 <%= image_tag 'star.png' %>
```
　※ <%= image_tag 'ファイル名' %>

サイズを変えたければ,size: 変えたいサイズで可能
```
 <%= image_tag 'star.png', size:'80x80' %>
```
　※<%= image_tag 'ファイル名', size:'変えたいサイズ' %>

cssで変えたい場合は、下記のようにすればクラスが当てられる。
```
<%= image_tag 'star.png', class:"logo" %>
```
通常通りcssでクラス別に変更できる。
```
.logo　{
  width:80px;
  height:80px;
}
```

### RailsでBootstrapを使用する際のスタイルの当て方が特殊なので注意が必要

HTMLで使うタグ、例えばh1タグでは、通常のBootstrap形式でスタイルを当てることができるが。

```
<h1 class="shadow p-3 mb-5 bg-white rounded display-1">Sign up</h1>
```
 　※`<h1 class="当てたいスタイル">記述</h1>`

Railsの<%= %>では、下記のように、後方につけ、なおかつ、class=ではエラーになるので、**class:**　にする必要性がある
```
<%= f.text_field :name, class: "form-control form-control-lg col-sm-4" %>
```
　※`<%= 記述 class:"あてたいスタイル"　%>`

Railsに初Bootstrap導入時、うまくスタイルが当てられなくて苦労したので、参考程度にどうぞ。
【SwiftUI】Viewに丸角背景を追加する

# はじめに
Viewの背景に色をつける方法は様々あります。
ただ、どれがベストな方法かわからないのでコメントで教えていただきたいです

# 作りたいUI
![Simulator Screenshot - iPhone 14 Pro - 2023-08-04 at 22.27.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/42dfb30d-8e2c-3212-e15f-fd842d03beeb.png)

# 実装
### 良さそう
```swift
Text("テキスト")
    .frame(width: 120, height: 60)
    .background(Color.cyan, in: RoundedRectangle(cornerRadius: 10))
```

### これも良さそう
```swift
Text("テキスト")
    .frame(width: 120, height: 60)
    .background(Color.cyan)
    .cornerRadius(10)
```

### たぶん良くない
```swift
ZStack {
    RoundedRectangle(cornerRadius: 10)
        .frame(width: 120, height: 60)
        .foregroundStyle(.cyan)
    
    Text("テキスト")
}
```

### これも良くさなそう
```swift
RoundedRectangle(cornerRadius: 10)
    .frame(width: 120, height: 60)
    .foregroundStyle(.cyan)
    .overlay(Text("テキスト"))
```

# おわり
これは好き嫌いの問題？
IOSのbuild時のアップロード先とbranch運用・CICDを考えてみる

## 背景
普段、flutterで開発をしていて、Iosのbuildをする時に
、`ProvisioningProfileとp12ファイルとcertificateとIdentifiers(バンドルID)が必要`になるが、これに付け加えて、`開発環境と、本番環境を区別してアプリをbuild`しないといけない。用語が出てきてかなり初見だとかなりわかりづらいのでまとめる。

swift開発者にも通じる部分はあるのかなと思いましてあえて、flutterとtitleには入れていません。


## Identifiers(バンドルID)・ProvisioningProfile・p12ファイル・certificateのロードマップ

![空白の図(4).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/89fa3d5d-e77d-3069-3fa3-ceab461e0bdd.jpeg)

アプリをbuildするとき、`.ipa`を得るときに鍵を作って、署名が必要になる。その鍵を作る過程で用語が出てくるのとかなり戸惑うので、一旦何を行わなければならないのかを記す。

buildで署名をするときに使うのは、`ProvisioingProfile`と`.p12`を使う。
この`ProvisioningProfile`を作るまでの過程は大きく3つしないといけないことがある。 

![空白の図(5).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/f32ade5a-807b-00e2-93da-087a74aeb528.jpeg)

1. certificateと`.p12`ファイルを作る。(キーチェーンアクセスから作成する)
2. バンドルIDを作る。
3. 1.と2.を紐付けて`ProvisioingProfile`を作る

これができたら、CI/CDを組みます。

https://zenn.dev/pressedkonbu/articles/254ca2fc3cd1ab

ここまでは、単に1つのアプリを作るまでの基礎知識です。

## 開発環境と本番環境の区別した時に、ストア側のアプリはどのように分ければよいか?
おそらく要望が、いくつか出てくると思われる

### [要望その1]：BackEndのAPIが本番環境と開発環境分かれてる
以下のようにそれぞれBackendのendpointが分かれてる可能性がある。
```shell
https://api.hoge.com # production環境
https://api.dev.hoge.com # development環境
```

### [要望その2]: TestFlightで開発環境、本番環境ともに確認したい。

### [要望その3]: CI/CDでbuildして本番環境、開発環境確認したい。
本番環境、開発環境それぞれで開発して確認したい。

## これを満たすworkflow

![空白の図(2).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/a2406a64-749d-4a55-b419-eaff0d60874c.jpeg)

#### ルール
1. 実際のアプリを、開発環境と本番環境で分けておく。
アプリレベルで分けておく

![スクリーンショット 2023-08-04 22.15.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466470/b179238d-622e-4103-b61e-cec967771337.png)
2. bundleIDも、以下のように分けておくが、certificateは、同一のものを使用する。
```
com.company.appName #production環境用
com.company.appName.dev #development環境用
```
3.本番環境と開発環境のBackendのAPIドメインは分ける

```shell
https://api.hoge.com # production環境
https://api.dev.hoge.com # development環境
```

4.環境わけのロールは以下の通り
```
開発環境の内部テスト #development環境
本番環境の内部テスト #staging-development環境

↓経営陣や限定されたclientが見る↓
本番環境の外部テスト #staging-production環境
ストアに流す        #production環境
```


##### ※xcrunをの-uと-pを設定するには、下記から作成できる。
```
xcrun altool --upload-app -t ios -f "build/ios/ipa/preview.ipa" -u "${{ secrets.APPLE_ID }}" -p "${{ secrets.APPLE_APP_PASS }}"
```

https://appleid.apple.com/account/manage
【Vue】v-if による条件分岐

Vueを使った案件に関わるようになりましたので、少しずつアウトプットしようと思います。
これまで、実務で触るのは初めてなので、初歩からやっていきます。

曜日と時間帯での表示分岐をやりましたので、書いておきます。

## v-if で、表示をわける

v-ifは、trueかfalseに基いて、条件的に描画したいときに使います。

今回は、曜日と日時によって、trueかfalseを、変数に保持することで、表示を切り替えます。

まずは、条件の真偽を分けるコードを書きます。

```
data() {
　 return {
 　 displayHour: false,
　 };
},

const now = new Date();
const hour = now.getHours();
const day = now.getDay();
//日曜から土曜日を0から6の整数で取得する

if(day === 0) {　//日曜の〇〇時
 this.displayHour = hour >= 〇〇 || hour < 〇〇;
} else {　//平日の〇〇時
 this.displayHour = hour >= 〇〇 || hour < 〇〇;
}
```
上記の条件分岐に当てはまったら、trueが返ってきます。

テンプレート内で、表示を分ける。
```
<div v-if="displayHour">
  必要な描画
</div>
```

以上になります。
システム形態

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/bbe4fc44-a360-b641-899b-2640a72e4c87.png)
３層クライアントサーバシステム
　クライアントサーバシステムの一形態に３層クライアントサーバシステムがあります。３層アーキテクチャと呼ぶこともあります。この形態の例として、オンラインショッピングサイトに代表されるウェブアプリケーションシステムがあります。

①第１層：プレゼンテーション層
　データ入力、結果の出力など、ユーザインタフェースに関わる処理。

②第２層：ファンクション層
　業務ロジックやデータ加工

③第３層：データ層
　データベースへのアクセス処理

※試験の出題の例：「３層クライアントサーバシステム構成で実現したWebシステムの特徴」は「業務処理はサーバ側で実行し、クライアントソフトはHTMLの記述に従って、その結果を画面に表示する」。
AttributeError: partially initialized module '〇〇' has no attribute '_private' (most likely due to a circular import)

# この記事の目的
「AttributeError: partially initialized module '○○' has no attribute '_private' (most likely due to a circular import)」というエラーが出た時の対処

# 解決法

#### インポートするライブラリと同じ名前をファイル名にするな
ということでした。
めちゃくちゃ初歩的なミスをしてました。
作業ファイルやその周辺のディレクトリ内のファイルの名前がライブラリと同じ名前になってないか確認すればいいみたいです。
つい癖で、「○○使ったテストコード書くから、わかりやすいように○○って名前にしとこ」って感じで名前を付けますが、ファイル名はきちんと考えた方がいいですね。
変数名だけでなく、ファイル名も意味のある命名を心掛けます。

終わり
【Linux】シェル環境のカスタマイズと使用（その２）

### bashにおける環境設定ファイル
・ログインシェル起動時に「/etc/profile」を最初に読み込む。
・「~/.bash_profile」をログイン時に読み込む。
・「~/.bash_profile」が無い場合は次に「~/.bash_login」を読み込む。
・　「~/.profile」は、「~/.bash_profile」ファイルと 「~/.bash_login」ファイルがない場合にログイン時に読み込まれる。
・「~/.bashrc」は　bash起動時に実行される。
・「~/.bash_logout」は　ログアウト時に実行される。

### aliasコマンド
aliasは、UNIXベースのオペレーティングシステム（例：Linux、macOSなど）やコマンドラインシェル（例：bash、zshなど）で使用されるコマンド。aliasコマンドを使って、他のコマンドやコマンド列に別名（エイリアス）を割り当てることができる。

一般的な使い方は以下の通り

```bash:bash
alias [エイリアス名]='コマンドまたはコマンド列'

# lsコマンドのエイリアスを作成する：
alias ll='ls -l'
#これにより、llと入力するとls -lが実行されるようになる。

# 複数のコマンドを組み合わせたエイリアスを作成する：
alias update='sudo apt-get update && sudo apt-get upgrade'
# これにより、updateと入力すると、sudo apt-get updateとsudo apt-get upgradeが順番に実行される。

#エイリアスを表示する：
alias
#このコマンドは、現在定義されているすべてのエイリアスを表示する。
```

エイリアスは、シェルのセッションが終了すると消えるため、再起動後には再定義する必要がある。また、永続的なエイリアスを使用する場合は、~/.bashrc（または~/.zshrcなど）などの設定ファイルにエイリアスの定義を記述する。これにより、シェルが起動するたびにエイリアスが読み込まれ、使えるようになる。

### set -f コマンド
パス名のワイルドカードによる展開（*や?）を無効にする方法は、シェルのオプションを設定することで行う。具体的には、set -fコマンドを使用する。これにより、ワイルドカードが無効になる。

```bash:bash
# ワイルドカード展開を無効にする（２通り示す）
set -f
set -o noglob

# ワイルドカードを含むコマンドを実行
echo *

# ワイルドカードを含むコマンドを実行
echo file*

# ワイルドカードを含むコマンドを実行
echo ?ile

# ワイルドカード展開を有効にする（globbing on）
set +f
```

### ignoreeof(オプション)
 キーボード操作による「Ctrl + D」でのログアウトを一時的に無効にする。これにより、シェルが「Ctrl + D」をログアウトのシグナルとして認識しなくなる。
以下のコマンドを実行することで、「Ctrl + D」によるログアウトを無効にできる。

```bash:bash
set -o ignoreeof
```

ログアウトの無効化を終了し、通常通り「Ctrl + D」でログアウトできるようにするには、以下のようにset +oを使用してignoreeofオプションを無効化する。

```bash:bash
set +o ignoreeof
```

### env コマンド
　指定した環境変数の値を一時的に削除してコマンドを実行する
具体的には、以下のようにenvコマンドを使用する。

```bash:bash
env -u 環境変数名 コマンド
```

ここで、-uオプションは指定した環境変数を無効化（アンセット）するために使用する。環境変数名には無効化したい環境変数の名前を指定し、コマンドにはその環境を一時的に適用したいコマンドを指定する。

### set コマンド
設定されている全てのシェル変数を一覧表示する。

```bash:bash
# シェルオプションを一覧表示。
set -o
# 環境変数を一覧表示。
set -a
# 配列変数を一覧表示。
set -A
```
cookie vs localStorage vs sessionStorage

```javascript:main.js
    // localStorage
    localStorage.clear();
    localStorage.setItem("name", "mario");
    console.log(localStorage.getItem("name"));
    localStorage.removeItem("name");
    console.log(localStorage.getItem("name"));
    
    // sessionStorage
    sessionStorage.setItem("name", "luigi");
    console.log(sessionStorage.getItem("name"));
    sessionStorage.removeItem("name");
    console.log(sessionStorage.getItem("name"));
    
    // cookie
    document.cookie = "name=luigi; expires=" + new Date(2023, 7, 5).toUTCString();
    document.cookie =
      "lastName=Smith; expires=" + new Date(2023, 7, 5).toUTCString();
    console.log(document.cookie);

```
【AWS-RDS-Aurora】エンドポイント

## Aurora
通常のAurora と
Aurora serverless がある
データベースを簡単に負荷分散できる
(DBをクラスタ化してくれる)
Auroraを使わない場合、MySQL、PostgreSQLをただたてるだけになる

## エンドポイント

1. **エンドポイント (Endpoint):**
   - エンドポイントはデータベースクラスターに接続するための識別子で、データベースのアドレスとポート番号を指します。エンドポイントを使用してアプリケーションやクライアントがデータベースにアクセスします。

2. **クラスターエンドポイント (Cluster Endpoint):**
   - クラスターエンドポイントはAuroraクラスター全体に対するエンドポイントです。読み取りおよび書き込みのトラフィックを処理し、クラスター内の各リーダーおよびライターインスタンスへの接続を管理します。

3. **リーダーエンドポイント (Reader Endpoint):**
   - リーダーエンドポイントは読み取り専用のエンドポイントで、クラスター内の読み取りリプリカへの接続に使用されます。読み取りクエリをリーダーエンドポイントに送信することで、負荷分散や読み取りの最適化が可能です。

4. **インスタンスエンドポイント (Instance Endpoint):**
   - インスタンスエンドポイントは個々のデータベースインスタンスに対するエンドポイントです。これを使用して、クラスター内の特定のインスタンスに直接アクセスできます。

5. **カスタムエンドポイント (Custom Endpoint):**
   - カスタムエンドポイントは、データベースクラスターに対して独自のDNS名を設定するオプションです。これにより、アプリケーションが特定のDNS名を使用してデータベースにアクセスできます。
   - 自分で作れるエンドポイントはこれだけ
例えば、リーダーエンドポイントの一部を弱いインスタンスにしておいて、
そこだけのカスタムエンドポイントを作っておいて、
それを内部の管理画面から使うようにする
強いインスタンスはユーザーが使えるようにする、など
Aurora serverlessでは使えない
リレーションでnullしか取得できない

例えば以下のようにリレーションが設定されていたとします。

```php
public function user(): BelongsTo
{
    return $this->belongsTo(User::class);
}
```

以下は

```php
DB::table('users')->find($post->user_id)
```

正しく`User`オブジェクトが取得できるのに

以下は

```php
$post->user
```

nullにしかならないということがありました。

原因はGlobal Scopeでした。

私はアホで以下のようにScopeを設定していたので

```php
static::addGlobalScope('adult', function (Builder $builder) {
    $builder->where('age', '>', 20);
});

static::addGlobalScope('teen', function (Builder $builder) {
    $builder->whereBetween('age', [13, 19]);
});
```

大人かつティーン、つまりそんなユーザはありえなかったわけです。
機械学習エンジニア就職までのロードマップ


1年3ヶ月会社員SESを経て、5ヶ月間フリーランスをしている私の経験から、機械学習エンジニアのなり方をまとめます。

# 目次
[エンジニアになるまでのロードマップ](#エンジニアになるまでのロードマップ)
[機械学習エンジニアの仕事内容](#機械学習エンジニアの仕事内容) 
[どんな勉強をすればいいか](#どんな勉強をすればいいか)


## エンジニアになるまでのロードマップ
理想的なロードマップを書きました。
とはいえ、ここまでできるひとは少ないと思います。
私はpytho基礎と機械学習の基本モデルが作れるくらいで拾ってもらいました。

-pythonの基礎を学ぶ
　　python基礎：https://prog-8.com/
　　　　まずはこちらで基礎を10時間
　　pandas:https://qiita.com/kunishou/items/bd5fad9a334f4f5be51c
　　　　pandasというライブラリを10時間
　　　　これをやってみて楽しいと思えるならかなりプログラマーの素質があります。
-簡単な練習問題でモデルを作る
　　lightGBM:https://qiita.com/sey323/items/a5b70943005d15771981
　　　　lightGBMは、大会でもよく使われる万能モデルです。
　　　　試してみたい分析があればこちらを試してみるのがおすすめ。
-練習問題で作ったモデルについてプレゼン資料を作る
　　説明するスキルはすぐに求められるので、就活の段階からアピールできたら高得点です。
-過去の機械学習コンペで少し難しい課題に挑戦する
-コンペで共有されているナレッジから他の人のやり方を学ぶ
-コンペでの作成モデルでプレゼン資料を作成する
-企業との面接でこれらをアピールする

勉強するのにはgoogle-colabが便利！
環境構築などせずに使えます。
https://colab.research.google.com/?hl=ja

 ## 機械学習エンジニアの仕事内容
メジャーなところを紹介します。

・機械学習モデルの作成
　　王道の仕事。作成自体は難しくないので、初心者でもアサインされる。
　　automlとか環境が整っていればさらに楽。
　　精度向上とかモデル評価は経験が必要なので、高難易度。ここはPLがやります。　　
・PoC
　　企画案がうまくいくか短い期間で確かめる仕事。
・データ分析
　　アンケート分析が多い印象
・自動化
　　例えば、機械学習の結果をエクセルでまとめてクライアントに渡すのでそれを自動化をする。


## どんな勉強をすればいいか
pythonで以下のライブラリが扱えればSESの採用には引っかかると思います。

・pandas
　　データフレーム（エクセルの表のようなもの）を扱うライブラリ。
　　pythonでエクセル的な操作を便利に行うためのもの。

・matplotlib
　　可視化のライブラリ。
　　機械学習モデルやPoCの結果報告や、データ分析業務で多く使う。
　　他にもSeaborn, plotlyなど色々なライブラリがある。

・各モデルのライブラリ
　　基本的な10個くらいのライブラリは触ってみるといい。
　　まずはlightGBMから。
　　scikitlearnなどの前処理ライブラリもここで学べる。







## 就活の時のtips
・linux
　　使えるかよく聞かれるところですが、現場に行かないと習得が難しい。
　　基本的なコマンド10種類くらいを覚えて、”一応できます”にしとくのがベター。
　　環境構築やDockerを使う時に必要になるが、必要になってから覚えればいい。
・SQL
　　機械学習前にデータを持ち出すのに使う。
　　これも環境を作るのが面倒でとっつきづらい。
　　bigqueryで勉強できる本を一冊買って、3日くらい勉強すると”一応できます”になる。

## ・その他の分野
テーブルデータ以外にもこんな分野があります。
・自然言語処理
https://qiita.com/fY9pFc4W1I8uoa0/items/a5e3b7706b8e8f68fabc
・画像認識
https://qiita.com/AxrossRecipe_SB/items/d758ac95b2f3d1fbb7e6
【Vue.js】xxx/undefinedでInternal Server Error 500エラーになってしまった場合の原因と解決方法

# 概要
Vue.jsで`api/v1/properties/files/undefined`というエラーがDevツールのコンソールに表示されて、`Internal Server Error 500`になってしまいました。本記事ではこのエラーの原因と解決方法を記載します。

# エラーの原因

原因は以下の箇所にありました。

```vuejs
:src="url+'api/v1/properties/files/'+property?.image"
```

`property?.image`が`undefined`のとき、`api/v1/properties/files/undefined`という不正なURLになってしまったのです。

`property?.image`は、Vue.jsのセーフナビゲーション演算子（optional chaining operator）を使用していますが、これは`property`オブジェクトが存在しない場合にプロパティに安全にアクセスするための方法です。

ちなみに、`property?.image`という表記は以下のように動作します。
・もし`property`オブジェクトが存在する場合、その`image`プロパティの値が返される
・もし`property`オブジェクトが存在しない場合、`undefined`が返される


## 解決方法

以下のようにすると解決します。

```
:src="url+'api/v1/properties/files/'+property?.image" v-if="property?.image">
```

これにより、`property`オブジェクトが存在しない場合には`<img>`要素（または他の要素）自体がDOMに挿入されないため、不正なURLを回避できます。

このコードでは、プロパティ（`property`）オブジェクトの`image`プロパティが存在する場合にのみ、`v-if`ディレクティブが評価されます。

`v-if`ディレクティブは、Vue.js において特定の条件が真の場合に、要素を描画するかどうかを制御するためのディレクティブ。その条件が真（存在する場合）の場合にのみ、親要素にバインドされた属性が有効になります。

つまり、プロパティオブジェクトに`image`が存在しない場合、この要素はDOMに含まれないことになります。
これによって`undefined`のエラーが解決できました。
【Python】サブシーケンスの検証

# 作るもの
　与えられた array が与えられた sequence の有効なサブシーケンス（subsequence）であるかを判定する関数 isValidSubsequence を作る。関数はブール値を返す。True を返す場合、array は sequence の有効なサブシーケンスであることを示す。False を返す場合、array は sequence の有効なサブシーケンスではないことを示す。

# 実装
```python:validate_subsequence.py
def isValidSubsequence(array, sequence):
    # インデックス変数を初期化する
    arrIdx = 0  # arrayのインデックスを表す変数
    seqIdx = 0  # sequenceのインデックスを表す変数

    # arrayとsequenceの要素を比較しながらサブシーケンスを検証する
    while arrIdx < len(array) and seqIdx < len(sequence):
        # array[arrIdx]とsequence[seqIdx]が等しい場合、次のsequence要素を検索する
        if array[arrIdx] == sequence[seqIdx]:
            seqIdx += 1  # sequenceのインデックスを次に進める
        arrIdx += 1  # arrayのインデックスを次に進める

    # サブシーケンスの検証結果を返す
    return seqIdx == len(sequence)

# テスト
if __name__ == "__main__":
    array = [5, 1, 22, 25, 6, -1, 8, 10]
    sequence = [22, 25, 6]
    print(isValidSubsequence(array, sequence))
```
PF作成：4日目

４日目。今日はメンターさんに質問できない日で進捗具合はあまりよくない。理解しにくいところをどうやって調べたらいいのかわからない弱点がはっきりわかった気がする。これから身につけていけるように努力していこう。

## 進捗
- ワイヤーフレームの必要最低限部分の作成
- 画面遷移図の必要最低限部分作成


## 苦労したポイント
- ワイヤーフレーム、画面遷移図ともに神社仏閣が存在しなかった場合の御朱印の投稿処理のページ作成が難しく、疑問点がたくさん出てきた。
- 作成に慣れていないので一つ一つの作成にとても時間がかかった。だけどこれらをやったおかげで疑問点が出てきて、整理がついた気がする。


## 明日の予定
今日は特に目ぼしいことはなかった。明日から午後一からメンターさんに質問ができるので、午前中はアプリケーション実装の基礎を取り組んで、午後はメンターさんに質問して今日の疑問点を整理していこうと思う。この土日は一気に作業を進めたい。
Windowsで git clone ができないの なぁぜなぁぜ？

# 参考サイト
以下のサイトから引用しております。
https://ios-docs.dev/20210813support-for-password

# git cloneがエラーになる

Windows環境でgitリポジトリからHTTPS接続のCloneコードをコピーして、git cloneコマンドを実行するとエラーになりクローンできない。
```Git Bash.
$ git clone [リポジトリパス]
```

# エラー原因
2021年8月13日からめ、ローカルからGithubにアクセスする際にパスワードではなく、個人アクセストークンが必要になったらしい。

# 解決方法
個人用アクセストークンを取得する

１．githubにアクセス

２．Settingsを開く
右上のアイコンからメニューを開き、Settingsを選択

３．Developer settingsを開く
Developer settingsをクリック

４．Personal access tokensを開く
Personal access tokensをクリック

５．トークンを新しく作成する
Generate new tokenをクリック
パスワードが聞かれたらパスワードを入力する

６．名前をつける
わかりやすい名前をつける。
自分は今回、MyToken+日付にした。

７．Scopesを指定する
「repo」と「admin:repo_hook」と「delete_repo」にチェックを入れる

８．トークン作成
Generate tokenをクリック

９．トークンをコピー

# git cloneする

以下を実行するとgithubのユーザーネームと
先ほど取得したトークンを聞かれるので入力するとクローン完了する。

```Git Bash.
$ git clone [リポジトリパス]
```
screenコマンドがssh切断後killされる問題

# 起きたこと
最近、ワークステーションにManjaroをインストール後しました。
ssh接続で設定を行い、Dockerプロセスをscreenで起動し、
自宅に戻って確認しようとしたら、プロセスが終了されていた。


```bash:bash
> screen -S test # screenセッションを起動
> Ctrl-A + D # screenからデタッチ

> screen -ls # 起動中のscreenプロセス一覧
There is a screen on:
	4469.test	(Detached)
1 Socket in /run/screens/S-user. 
# ↑ssh再ログイン後もこうなってほしい。

> exit # sshセッションを切る

> ssh user@host # 再ログイン
> screen -ls # 起動中のscreenプロセス一覧
No Sockets found in /run/screens/S-user.
# ↑なぜか終了してる...
```



suspend機能なども疑ったが、調べてみると`screen`コマンド側に問題があるようなので、
解決法をメモしておきます。


# 解決策

```bash:bash
sudo loginctl enable-linger $USER

# screenコマンドを以下で代用
systemd-run --scope --user screen

# もしくは、~/.zshrc or ~/.bashrcに以下を追加
alias screen="systemd-run --scope --user screen"
```

`loginctl`は初めて見たので、正直、あまり良くわかっていないが....
今まで使ってきたDebian系では起きたことが無かったので、調べてみようと思います。

# 参考
[https://github.com/NixOS/nixpkgs/issues/15798](https://github.com/NixOS/nixpkgs/issues/15798)
レゴブロックで作ったエレベーターの組立図 書いてみた　その４　昇降編

# 昇降編
## 全体
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/f4e8bba8-b676-879c-46d6-403f22423e90.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/0435a196-1f8e-d94b-fd72-2a20c30e4546.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/32abca74-379d-70d0-cd89-6235841c4df5.png)



## 詳細

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/a6fa9378-d7a6-0118-c39f-6620511941bf.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3010655/622f80aa-df2d-c653-11ff-2ead54af8d42.png)


## 最後に

部品名等が小さ過ぎるためこの冊子には記載しておりませんが、
「秋葉原ロボット部」のサイトにて公開したいと思います。
詳細はこちら　https://akbrobot.gitlab.io/blockelevator/
Bashでコマンドの同時実行数を制御して一定時間実行を維持する

# はじめに
Bashでコマンドの同時実行数を一定時間中維持したいということがあり作成したところ、
汎用性がありそうだったので備忘録として残します。

# 方法について

以下の二通りのコードを作成しました。

```bash:コマンドの終了時間が同じ場合
#! /bin/bash

# 同時実行数
concurrent_commands=10
# 実行時間
duration_seconds=10
# 実行するコマンド
command="sleep 1"

run_command() {
    $command &
}

concurrent_run() {
    # 現在時刻をエポック秒で取得し、指定された秒数を加算
    end=$(( $(date +%s) + duration_seconds ))
    (
        # 一定時間中ループを繰り返す
        while [ "$(date +%s)" -lt $end ]; do
            # 指定された同時実行数のコマンドを一斉に実行
            for ((i=0; i<concurrent_commands; i++)); do
                run_command
            done
            # 実行されたコマンドの終了を待機
            wait
        done
    ) &
    # 強制終了された時にバッググラウンドの処理を終了
    local pid=$!
    trap 'kill $pid; exit 1'  1 2 3 15
    wait
}

concurrent_run
```

```bash:コマンドの終了時間がバラバラな場合
concurrent_commands=10
duration_seconds=10
command="sleep"

run_command() {
    $command $(( RANDOM % 10 + 1 )) &
}

concurrent_run() {
    # 現在時刻をエポック秒で取得し、指定された秒数を加算
    end=$(( $(date +%s) + duration_seconds ))
    (
        # 指定された同時実行数のコマンドを一斉に実行
        for ((i=0; i<concurrent_commands; i++)); do
            run_command
        done
        # 一定時間中ループを繰り返す
        while [ "$(date +%s)" -lt $end ]; do
            # 現在の実行数を取得
            running_jobs=$(jobs -p | wc -l)
            # 現在の実行数が指定された同時実行数を下回っていたらコマンドを実行
            if [ "$running_jobs" -lt "$concurrent_commands" ]; then
                run_command
            fi
            sleep 0.1
        done
    ) &
    local pid=$!
    trap 'kill $pid; exit 1'  1 2 3 15
    wait
}

concurrent_run
```

例として`sleep`を使っていますが、実行したい任意のコマンドに変更してください。

以上です。

# さいごに
誰かのお役にたてれば幸いです。
【GAS】QQEnglishの予約メールからGoogleカレンダーに自動登録する

# はじめに
- 最近オンライン英会話にハマっており、毎日レッスンを受けています。日によって受講時間が異なるため、毎回予約完了後に手入力でGoogleカレンダーに登録していましたが、面倒くさい…
- 予約完了メールが毎回送られてくるので、それをトリガーに登録できれば完全に自動化できそうです。ということで先人の知恵を拝借しつつ初めてのGoogleAppScriptに挑戦してみました
- こちらの記事を参考に作成しました、ありがとうございます→[DMM英会話の予定をGoogleカレンダーに自動登録する方法](https://designoma.com/dmm-eikaiwa-google-calendar/)

# コード
```js
const CRITERIA = "from:noreply@notify.qqeng.com subject:【QQEnglish】レッスン予約完了のお知らせ is:unread ";

function main() {
  eachMessage(CRITERIA, function (message) {
    const cal = CalendarApp.getDefaultCalendar();
    const body = message.getBody();    
    const subject = message.getSubject()
    const [startDateString] = subject.match(/\d{4}\-\d{2}\-\d{2} \d{2}\:\d{2}/g)
    const curriculum = body.match(/(?<=カリキュラム： )(.*)/g);
    Logger.log(curriculum)

    const title = `QQ/${curriculum}`;
    const startTime = new Date(startDateString);
    const endTime = new Date(startTime.getTime() + 30 * 60000);

    cal.createEvent(title, startTime, endTime);
  });
}

function eachMessage(CRITERIA, callback) {
  GmailApp.search(CRITERIA).forEach(function(thread) {
    thread.getMessages().forEach(function(message) {
      callback(message);
      message.markRead(); 
    });
  });
}

```
# 処理の流れ
1. 条件にあてはまるメールを抽出（送信元アドレス、タイトル、未読である）
1. メールタイトルから受講日時を正規表現で抽出
1. メール本文からカリキュラム名を正規表現で抽出
1. GoogleカレンダーAPIのcreateEvent関数でカレンダーに登録
1. カレンダー登録済みメールをmarkRead関数で既読にする

# GmailMessageクラスについて
- 今回は3つの関数を使用しました

| 関数名 | 説明 |
|:-:|:-:|
| getSubject()  | メールのSubject(タイトル)を取得  |
| getBody()  | メールのBody(中身)を取得  |
| markRead()  | メールを既読にする  |
- 使用できる関数の一覧についてはこちらのGoogleのページにて確認可能です

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


# トリガーの設定方法
- 左のメニューからトリガー→トリガーを追加→分ベースのタイマー→15分おき(時間はお好みで)
- 実行時間、実行回数、トリガー数の制限はありますが、今のところ15分おきの実行で問題なく動いています

# おわりに
- GoogleAppScript、お手軽で楽しいですね！個人開発でもっと活用してみたいと思います
- このコードを流用することであらゆる予約メールをGoogleカレンダーに登録することができると思いますので、ぜひ参考にしてください
- （ちなみに）QQEnglishのカリキュラムではカランレッスンとR.E.M.Sを受講していますが、筋トレのような爽快感を得られておすすめです^^
EC2からProxy設定を回避してS3へアクセスする方法


## 問題の背景

シェル（bashなど）の環境変数にProxy設定をしている場合、その設定は一般的にそのシェルで実行される全てのコマンドに影響します。これにより、`aws s3`コマンドでS3へアクセスする際に、意図せずProxyを経由することがあり、一部の環境ではProxy設定が原因で問題が発生することがあります。そこで、今回は`.bashrc`で設定されたProxy設定を回避して、AWS S3にアクセスする方法を解説します。


## 実行環境
OS : AlmaLinux
Version : 9.2 (Turquoise Kodkod)

EC2インスタンスはVPCプライベートネットワーク下にあり、S3へのアクセス口としてVPC Gateway Endpointsを立てています。

また、EC2サーバーから対象のS3バケットへの正しい権限設定などを行ない、アクセスが可能になっていることが前提となります。

## 解決方法

`NO_PROXY`環境変数を設定することで、特定のS3バケットやエンドポイントに対してProxyを経由せずに接続するようになります。この環境変数には、Proxyを経由せずに直接接続するホスト名をカンマ区切りで指定できます。

東京リージョン（ap-northeast-1）のS3バケットに対してProxyを経由せずに接続したい場合、以下のように環境変数を設定します。

```bash
export NO_PROXY=s3-ap-northeast-1.amazonaws.com
```

また、aws cliのコマンド実行時には、コマンドラインオプションの`--endpoint-url`を試用して接続先のs3エンドポイントを明示的に指定します。
例えば、`aws s3 cp`コマンドでs3バケットからファイルをダウンロードする場合は、以下のようになります。

```bash
aws s3 cp s3://hoge/fuga.txt ./ --endpoint-url https://s3-ap-northeast-1.amazonaws.com
```

これにより、`aws s3 cp`コマンドは`.bashrc`のProxy設定を無視して、指定したエンドポイントへ直接接続し、ファイルをダウンロードすることが出来ます。


## 参照
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-options.html


https://qiita.com/mochizuki875/items/4884d03a9bf0cb927c82
ラズパイに入れたUbuntuとsshしたい

#　まえおき
公開鍵をぶん投げるためにパスワード認証方式で繋ごうとしたら沼りました。~~raspi-configとか使いやがって…~~


# 環境
<メインPC>
windows11

<ラズパイ>
raspberrypi3B+
ubuntu23.04

# 手順
## IPアドレス確認
```
<ラズパイ側>
ip addr
```
wlan0のinetあたりがそれっぽい

参照文献
https://lotti.info/raspi-ssh/

## ssh有効化
winPCから接続しようとしたら弾かれたので有効化設定します。
```
<ラズパイ側>
sudo apt update
sudo apt install openssh-server
```

参照文献
[Ubuntu 20.04 で SSH を有効にする方法](https://codepre.com/ja/how-to-enable-ssh-on-ubuntu-20-04.html#:~:text=Ubuntu%20%E3%81%A7%20SSH%20%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%201%20Ctrl%20%2B%20Alt,%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%8C%E5%AE%8C%E4%BA%86%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81SSH%20%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%8C%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E9%96%8B%E5%A7%8B%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%20...%203%20Ubuntu%20%E3%81%AB%E3%81%AF%E3%80%81UFW%20%E3%81%A8%E5%91%BC%E3%81%B0%E3%82%8C%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB%E8%A8%AD%E5%AE%9A%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3%E3%81%8C%E4%BB%98%E5%B1%9E%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%20)

## 接続
```
<winPC側>
ssh ユーザー名@IPアドレス
```
これでつながると思います。

~~なんでこうも環境構築という奴はエラーばかり吐くのか~~
型安全を徹底する！TypeScriptの型ガード入門


## 目次
1. [はじめに](#introduction)
2. [型ガードとは？](#what-is-type-guard)
3. [基本的な型ケガードの使い方](#how-to-use-type-guard)
4. [自分で定義する型ガード](#custom-type-guards)
5. [型ガードのメリット](#benefits-of-type-guards)
6. [まとめ](#conclusion)

<a id="introduction"></a>
## 1. はじめに
TypeScriptを使用して開発を行っている皆さん、JavaScriptから移行した皆さん、こんにちは！TypeScriptの強力な型システムには、多くの機能があります。その中でも特に「型ガード」は非常に便利な機能の一つです。本記事では、この型ガードについて詳しく解説し、具体的な使い方やそのメリットを説明します。

<a id="what-is-type-guard"></a>
## 2. 型ガードとは？
型ガードは、ある変数が特定の型を持っていることをチェックし、その範囲で型を制約するための方法です。つまり、型ガードはコードの特定の部分で変数が特定の型を持っていると保証します。

<a id="how-to-use-type-guard"></a>
## 3. 基本的な型ケガードの使い方
以下に、型ガードの基本的な使用方法の例を示します：

```typescript
function padLeft(value: string, padding: string | number) {
  if (typeof padding === "number") {
    return Array(padding + 1).join(" ") + value;
  }
  if (typeof padding === "string") {
    return padding + value;
  }
  throw new Error(`Expected string or number, got '${padding}'.`);
}

padLeft("Hello world", 4); // returns "    Hello world"
```

この例では、`padLeft`関数は`value`と`padding`という2つのパラメータを取ります。`padding`は`string`または`number`の型を持つことができます。`typeof`演算子は、ここでの型ガードとして使用されています。

<a id="custom-type-guards"></a>
## 4. 自分で定義する型ガード
型ガードは以下のような形で自分で定義することも可能です：

```typescript
interface Fish {
  swim: Function;
}

interface Bird {
  fly: Function;
}

function isFish(pet: Fish | Bird): pet is Fish {
  return (pet as Fish).swim !== undefined;
}
```

この例では、`isFish`関数は型ガードとして機能します。引数`pet`が`Fish`型である場合に`true`を返します。つまり、この関数が`true`を返す場合、その後のコードでは`pet`が`Fish`型であることが保証されます。

<a id="benefits-of-type-guards"></a>
## 5. 型ガードのメリット
TypeScriptの型ガードがもたらす主なメリットは以下の通りです：

- **型安全性の向上**：実行時の型エラーを防ぐことができます。
- **コードの可読性と保守性の向上**：どの型のデータを操作しているかを明示的に示すことができます。
- **強力な型推論**：TypeScriptの型推論エンジンは、型ガードを通じて得られる情報を使用して、変数の型をより正確に推定することができます。
- **エラーチェック**：型ガードを使用すると、コンパイラは型に関するエラーを検出し、開発者がそれらを修正するのに役立つ情報を提供することができます。

<a id="conclusion"></a>
## 6. まとめ
以上、TypeScriptの型ガードについての基本的な説明とその使用方法について説明しました。型ガードは、TypeScriptの強力な型システムをフルに活用するための重要なツールの一つです。ぜひ積極的に使って、より堅牢で安全なコードを書いていきましょう！

以上、読んでいただきありがとうございました！本記事があなたのTypeScriptライフに役立つことを願っています。もし何か質問があれば、お気軽にコメントしてください。
Laravel バリデーションエラーメッセージを日本語翻訳する

## 手順

```
$ composer require --dev laravel-lang/lang laravel-lang/publisher
$ php artisan lang:add ja
$ composer remove --dev laravel-lang/lang laravel-lang/publisher
```

`config/app.php` を書き換えます。

```config/app.php
    'locale' => 'ja',
```

## 翻訳

https://readouble.com/laravel/10.x/ja/localization.html

## 参考

https://qiita.com/ucan-lab/items/8eab84e37421f907dea0

ここから切り出した記事です。
Go言語向けNCMB SDKの使い方（データストアの更新と削除）

NCMBはモバイル向けのBaaS（mobile Backend as a Service）ですが、サーバー側のデータとNCMB上のデータを連係させたいというニーズは良くあります。

そんなときには各言語向けのSDKがあると便利です。サーバー向けにはRuby、Python、PHP、Java、C#のSDKがあります（すべて公式サポート対象外の、コミュニティSDKという位置づけです）。

新しくGo言語向けのSDK開発をはじめたので、その使い方を紹介します。今回はデータストアの更新と削除について解説します。

## ソースコード

ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseになります。

[NCMBMania/ncmb\_go](https://github.com/NCMBMania/ncmb_go)

## インストール

SDKのインストールは下記コマンドで行います。

```bash
go get -u github.com/NCMBMania/ncmb_go
```

## インポート

続けてSDKをインポートします。

```go
import (
    "github.com/NCMBMania/ncmb_go"
)
```

## 初期化

NCMBより取得したアプリケーションキー、クライアントキーを使って初期化します。

```go
ncmb := NCMB.Initialize("YOUR_APPLICATION_KEY", "YOUR_CLIENT_KEY")
```

### データの新規作成

`Item` メソッドで新規データのインスタンスを作ります。引数はクラス名です。

```go
item := ncmb.Item("Hello")
```

### データの適用

アイテムに対して、データをセットします。利用できる型は `string` `int` `float64` `time.Time` `bool` 配列、Mapなどになります。今後、NCMB独自の型（ポインターやデータストア、位置情報など）も使えるようにします。

```go
item.Set("msg1", "Hello").Set("msg2", "World")
item.Set("num", 100)      // Int
item.Set("float", 1.23)   // Float
```

キーチェーンにも対応していますが、Go言語は改行が使えないので、多用すると見づらくなりそうです。

### データの保存

保存は `Save` メソッドで行います。保存がうまくいっていれば、 `bol = true` になります。

```go
bol, err := item.Save()

```

### データの更新

データの更新も `Save` メソッドで行います。

```go
item.Set("msg1", "New Message")
item.Set("num", 200.000)
bol, err := item.Save()
```

### データの削除

データの削除は `Delete` メソッドで行います。

```go
bol, err := item.Delete()
```

## まとめ

まだ基本的な機能しかありませんが、徐々にバージョンアップしていきます。

Go言語を使ってWebアプリケーションを開発している方は、そのデータ保存先としてNCMBを利用してみてください。

[mBaaSでサーバー開発不要！ \| ニフクラ mobile backend](https://mbaas.nifcloud.com/)
PHP Docker GD ライブラリのインストール

## 環境

https://github.com/ucan-lab/docker-laravel/blob/main/infra/docker/php/Dockerfile

- PHP: 8.2.8

## Dockerfile(差分だけ)

```Dockerfile
RUN apt-get update \
  && apt-get -y install --no-install-recommends \
    libpng-dev libjpeg-dev \
  && docker-php-ext-configure gd --with-jpeg \
  && docker-php-ext-install \
    -j$(nproc) gd
```

`--with-png` オプションはデフォルトで組み込まれたから廃止されたそうです(詳しくないです)
`--with-jpeg` jpegを使うためにはこのオプションが必要でした。
`-j$(nproc)` nprocコマンドはCPUコア数が返り、-jオプションは指定したCPUコア数で並列ビルドを行うための設定になるようです。

## 参考

https://tech.kurojica.com/archives/27414/
https://github.com/docker-library/php/issues/912
jiraでのスクラムの始め方

### jira or プロジェクトの管理者権限があるか確認
csvインポート機能が使えないとだいぶしんどいのでそれを確認。

### jiraの権限種類
以下3つがあり、自分がどの権限かを確認する。
jira 管理者
↓
プロジェクト管理者
↓
ユーザー

### 権限を見れる画面
以下ユーザー画面は権限がないと見れないので注意
![スクリーンショット 2023-08-03 17.31.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/ce1d46e7-e7c8-ae9b-dd71-aa30b5b82b7a.png)

### jiraのプロジェクトが何の管理対象か確認する

プロジェクトが
****チーム管理対象プロジェクト****
か
****企業管理対象プロジェクト****
を確認する


企業管理対象プロジェクトの場合、プロジェクト管理者ではなかなかできることが少なく、
jira管理者でないと、ワークフローや課題のフィールドの変更などできないので、必要な情報
（初期見積もり時間など）
以下のプロジェクト一覧画面で確認可能
![スクリーンショット 2023-08-03 17.27.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/3d0b89ae-b997-86fc-8ae1-afb76e77b5a3.png)


### jiraでの権限確認方法
以下情報の通り、前提として管理者しか見ることができない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/bbd2d864-1fe7-820e-ac04-9d39ea6bc805.png)


### jira 管理者権限がない場合は。こんなふうにjiraの画面右上に表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/1242bb29-5540-6584-0c29-7b249b51e1dd.png)


### 少なくとも最初に見るのは以下画像の赤枠を見ること

注意：
・課題タイプで初期見積もりが入れられるようになっているか
・ワークフローを設定できるようになっているか
で権限があるかを判断できる。
メンバーやプロジェクトの管理者止まりの場合、以下の課題タイプ画面にすらいけない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/2d6fd09e-2f8c-c321-7f35-9b33efa0cf85.png)

## csvインポート
jiraにはcsvインポート機能が2つある
管理者用のインポート機能と、ユーザー用のインポート機能
今回実施していくのはユーザー用のインポート機能をテストしていく。

以下を選択
![スクリーンショット 2023-08-03 10.53.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/229850b1-45b3-0612-59bd-4f37bed181d2.png)

以下を選択
![スクリーンショット 2023-08-03 15.24.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/3e92e4af-fa54-f3cc-ca6e-d9ff3218577f.png)


### import csv ファイルサンプル
※カラム名が細かく違っても後でjiraの画面上でマッピングできるので気にしないこと
```
Summary, Assignee, Reporter, Issue Type, Description, Priority, Parents-key
"Test issue", hoge@hoge.co.jp, hoge@hoge.co.jp, Sub-Task, testDescription, , TEST-56
"Test issue2", hoge@hoge.co.jp, hoge@hoge.co.jp, Sub-Task, testDescription2, , TEST-55
```

### csvインポート機能で初期見積もりを入れられるようにする改造
以下情報を参考に設定する（要は普通にPBI作成時に項目として見えてる必要がある）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/fafad75f-22d6-6a9e-1e54-dfd1ad939171.png)


### jiraのデータ読み込みアドオン操作方法
![スクリーンショット 2023-08-03 16.09.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/81cbc346-caba-796e-94d0-edde51c0353b.png)


### jiraから情報取得言語サンプル
例えば、以下パラメータだと以下のようなスクリプトになる（正直インテリセンスも充実しているので簡単）
プロジェクト名 testboard				
type		Story		
Sprint		HOGEスプリント1		

```						
example						
project="testboard" AND type=Story AND Sprint="HOGEスプリント1"
```



### jiraでの自動化（Automation）
以下のように設定を行う。
例では、サブタスクが完了したら残り時間を0にする処理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206781/e3646138-a44d-7c60-9409-a5535012cbc0.png)
Go言語向けNCMB SDKの使い方（データストアの取り出し方）

NCMBはモバイル向けのBaaS（mobile Backend as a Service）ですが、サーバー側のデータとNCMB上のデータを連係させたいというニーズは良くあります。

そんなときには各言語向けのSDKがあると便利です。サーバー向けにはRuby、Python、PHP、Java、C#のSDKがあります（すべて公式サポート対象外の、コミュニティSDKという位置づけです）。

新しくGo言語向けのSDK開発をはじめたので、その使い方を紹介します。今回はデータの取得方法を解説します。

## ソースコード

ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseになります。

[NCMBMania/ncmb\_go](https://github.com/NCMBMania/ncmb_go)

## インストール

SDKのインストールは下記コマンドで行います。

```bash
go get -u github.com/NCMBMania/ncmb_go
```

## インポート

続けてSDKをインポートします。

```go
import (
    "github.com/NCMBMania/ncmb_go"
)
```

## 初期化

NCMBより取得したアプリケーションキー、クライアントキーを使って初期化します。

```go
ncmb := NCMB.Initialize("YOUR_APPLICATION_KEY", "YOUR_CLIENT_KEY")
```

### データの新規作成

`Item` メソッドで新規データのインスタンスを作ります。引数はクラス名です。

```go
item := ncmb.Item("Hello")
```

### データの適用

アイテムに対して、データをセットします。利用できる型は `string` `int` `float64` `time.Time` `bool` 配列、Mapなどになります。位置情報を扱うためのGeoPoint型もあります。

今後、NCMB独自の型（ポインターやデータストア）も使えるようにします。

```go
hello.Set("string", "Hello, World!").Set("string2", "こんにちは")
hello.Set("number", 139.77421902)
hello.Set("boolean", true)
hello.Set("array", []interface{}{"a", "b", "c"})
hello.Set("object", map[string]string{"key": "value", "key2": "value2"})
hello.Set("null", nil)
hello.Set("date", time.Now())
geo := ncmb.GeoPoint(35.698683, 139.77421902)
hello.Set("geo", geo)
```

キーチェーンにも対応していますが、Go言語は改行が使えないので、多用すると見づらくなりそうです。

### データの保存

保存は `Save` メソッドで行います。保存がうまくいっていれば、 `bol = true` になります。

```go
bol, err := item.Save()
```

## データの取り出し方

データは `Get` または `Get〜` といったメソッドを使って取り出します。Getの場合は `interface{}` になるので、自分でキャストする必要があります。用意しているメソッドは次の通りです。

- GetString(key string, defaultValue ...string) (string, error)
- GetDate(key string, defaultValue ...time.Time) (time.Time, error) {
- GetArray(key string, defaultValue ...[]interface{}) ([]interface{}, error)
- GetMap(key string, defaultValue ...map[string]interface{}) (map[string]interface{}, error)
- GetBool(key string, defaultValue ...bool) (bool, error)
- GetGeoPoint(key string, defaultValue ...GeoPoint) (GeoPoint, error)
- GetNumber(key string, defaultValue ...float64) (float64, error)

以下のように使います。

```go
str, err := hello.GetString("string")
num, err := hello.GetNumber("number")
bol, err = hello.GetBool("boolean")
arr, err := hello.GetArray("array")
date, err := hello.GetDate("date")
geo, err = hello.GetGeoPoint("geo")
```

2つ目の引数はデフォルト値です。もし、該当するフィールドがなかったり、その値が入っていない時には、2つ目の引数を返します。2つ目の引数を指定しておけば、 `err`のチェックが不要になる場合はありそうです（型が違っている場合もあるので、チェック不要かと言われると難しいですが）。

```go
str, _ := hello.GetString("noField", "なし") // -> "なし"
```

`null` の場合は `Get` を使ってください。

```go
val, err := hello.Get("null")
fmt.Println(val == nil) // true
```

## 注意点

数値はすべて float64 で返ってきます。intで入れても float64 になるので注意してください。

## まとめ

まだ基本的な機能しかありませんが、徐々にバージョンアップしていきます。

Go言語を使ってWebアプリケーションを開発している方は、そのデータ保存先としてNCMBを利用してみてください。

[mBaaSでサーバー開発不要！ \| ニフクラ mobile backend](https://mbaas.nifcloud.com/)
Kotlin(Quarkus)で外部APIのレスポンスをJacksonでバインドするとエラーになる

# はじめに

Quarkusで外部APIを叩いたあとに返ってきたJsonをバインドするのに困ったのでまとめます

# 問題

以下のようなAPIを叩くDriverを用意しました

```kt:Driver.kt
    fun find(request: Map<String, Any?>): TodoJson =
        ApiClient.find(
                request["id"]?.toString() ?: null,
            )
}

interface ApiClient {
    @GET
    @Path("/v1/todo")
    fun getfind(@QueryParam("id") id: String): TodoJson
}

data class TodoJson(val name: String, val done: Boolean)
```

ここで返却する値はモックサーバーを用意して以下のようにしました

```
"response": {
    "status": 200,
    "jsonBody": {
      "todo": {
        name: "test",
        done: true
      }
    }
 }
```

しかしなぜかバインドがうまくいきませんでした
カラム名や型もただしく謎でした

# 解決方法

モックサーバーのヘッダーに`Content-Type: "application/json"`を入れることで解決できました
これをJacksonでは認識してバインドしてくれているようです

```
"response": {
    "status": 200,
    "jsonBody": {
      "todo": {
        name: "test",
        done: true
      }
    },
    "headers": {
      "Content-Type": "application/json"
    }
 }
```

# おわりに

すでに動いていたテストデータを確認して気づくことができました
デバックも難しいので気づけてよかったです
Reactアプリのパフォーマンスを飛躍的に改善！React.lazyとSuspenseの使い方


目次：

1. [はじめに](#introduction)
2. [React.lazyとは](#whatisreactlazy)
3. [React.lazyの基本的な使用方法](#howtousereactlazy)
4. [React.lazyとSuspenseを組み合わせる](#usingreactlazywithsuspense)
5. [まとめ](#conclusion)

---

## <a name="introduction"></a>1. はじめに

こんにちは、Reactを使ってウェブアプリケーションを開発している皆さん！大規模なアプリケーションを作っていると、パフォーマンスが頭を悩ませることがありますよね。そんなときに役立つのが、React.lazyとSuspenseです。この記事では、React.lazyとSuspenseの使い方を紹介します。

## <a name="whatisreactlazy"></a>2. React.lazyとは

React.lazyは、Reactの機能の一つで、コンポーネントの読み込みを遅らせる（遅延させる）ことができます。これにより、初期ロード時のパフォーマンスを大幅に向上させることが可能になります。

## <a name="howtousereactlazy"></a>3. React.lazyの基本的な使用方法

React.lazyの基本的な使用方法は非常に簡単です。以下に、具体的なコードを示します。

```jsx
// 遅延読み込みを行うコンポーネント
const OtherComponent = React.lazy(() => import('./OtherComponent'));

function MyComponent() {
  return (
    <div>
      <OtherComponent />
    </div>
  );
}
```

上記のコードでは、`OtherComponent`はReact.lazyを用いて遅延読み込みされます。つまり、`OtherComponent`が表示される必要があるときだけ読み込まれます。

## <a name="usingreactlazywithsuspense"></a>4. React.lazyとSuspenseを組み合わせる

さらに、React.lazyはSuspenseという機能と組み合わせて使用することができます。これにより、コンポーネントが読み込まれるまでの間に、別のコンテンツ（ローディング画面など）を表示することができます。

```jsx
// 遅延読み込みを行うコンポーネント
const OtherComponent = React.lazy(() => import('./OtherComponent'));

function MyComponent() {
  return (
    <div>
      <React.Suspense fallback={<div>Loading...</div>}>
        <OtherComponent />
      </React.Suspense>
    </div>
  );
}
```

上記のコードでは、`OtherComponent`が読み込まれるまでの間、「Loading...」と表示されます。`OtherComponent`の読み込みが完了すると、`OtherComponent`が表示されます。

## <a name="conclusion"></a>5. まとめ

React.lazyとSuspenseを使うことで、Reactアプリのパフォーマンスを大幅に改善することが可能になります。大規模なアプリケーションを開発している方はぜひ、この機能を活用してみてください。

---

これでReact.lazyとSuspenseの基本的な使い方についての説明は終わりです。他に疑問点があれば、コメント欄からどんどん質問してください。そして、この記事が役に立ったら「いいね」を押してくださいね。次回も、皆さんのReact開発がより楽しく、より生産的になるような情報をお届けします。Happy coding！
言葉の壁を打破！最新AI同時通訳アプリ「Felo瞬訳」がビジネスと観光をサポート

外国人とのコミュニケーションに困っていませんか？「Felo瞬訳」で解決！

Felo瞬訳（Felo Translator）は、言語の壁を超え、まるで通訳がいるかのように、リアルタイムの同時通訳を可能にします。
![スクリーンショット 2023-08-04 17.17.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526330/61bf0f6f-10a1-d7d7-e483-67dd58615b70.png)

新型コロナウイルスの収束に伴い、日本への旅行やショッピングを楽しむ外国人の数が増加しています。しかし、言葉の壁により、レストランオーナーや販売員、タクシードライバーなど、外国人とのコミュニケーションに困難を感じ、多くの商機を逃してしまっている方も少なくありません。


そこで、言葉の壁を打ち破って、新たな体験を提供できる「Felo瞬訳」が登場します。このアプリをスマートフォンにインストールするだけで、まるで高度な同時通訳者を持っているかのような体験が可能です。瞬訳日本語、瞬訳英語、瞬訳中国語、瞬訳スペイン語、瞬訳ドイツ語、瞬訳フランス語、瞬訳イタリア語、瞬訳ロシア語、瞬訳韓国語、瞬訳印尼語、瞬訳広東語、瞬訳チェコ語などの言語を自由に相互変換できます。


例えば、タクシードライバーとして働いている場合、中国の旅行者に出会った際に、Felo瞬訳を起動し、日本語で目的地を尋ねます。すると、アプリがその言葉を瞬時に中国語に翻訳し、自動的に音声で再生します。乗客が中国語で回答すれば、Felo瞬訳がその言葉を日本語に翻訳し、あなたに伝えます。このようにして、円滑なコミュニケーションが可能となります。


さらに、海外旅行においてもFelo瞬訳は非常に便利です。例えば、お盆休みにフランスへの旅行を計画し、フランスの空港に到着した際に、周囲はフランス語の放送に包まれ、何が言われているのか全く分からないという経験はありませんか？しかし、Felo瞬訳を使用すれば、フランス語の音声を迅速に翻訳し、意味を理解することができます。安心感抜群です！



Felo瞬訳は、日本と世界をつなぐ新たなコミュニケーション革命となることでしょう。ビジネスや旅行において、言葉の壁を取り払い、より広い世界を楽しむことができます。ぜひ、Felo瞬訳の魅力を体験してみてください。
製品に関する詳細やダウンロード方法については、以下のリンクをご覧ください。

https://apps.apple.com/jp/app/felo-translator/id6447256759
QuarkusとIntellijでデバック起動を行う

# はじめに

E2EのテストをしているときにQuarkusアプリケーションのでバックがしたくなったのですが、Applicationを呼び出すファイルがなくIntellijのUIからデバック起動ができなかったので書きます

# 問題

はじめにに書いたとおりですが、`Intellij`で`Quarkus`を**デバックモード**で起動したいと思いました
しかし起動は以下のコマンドでしています

```
$ quarkus dev
```

これではデバックモードで起動ができません。
`Application`ファイルもないためIntellijからの起動もできませんでした

# 解決方法

Quarkusはデバック用のPort`5005`を`quaruks dev`で開いているので、そこをIntelijからデバックとして設定することでうまく行きました

Intellijの実行構成から+ボタンで新しく`5005番ポート`の実行構成を作ります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/c706e42d-2f73-6faa-287c-50df2db3c48e.png)

そしてこの構成をデバックモードで起動することでQuarkusでもデバック機能が利用できました

# おわりに

チームのメンバーがすごすぎて沼らずに解決しました
JVMの経験がなかなかないので自分では解決できなかった気がします

# 参考

https://access.redhat.com/documentation/en-us/red_hat_build_of_quarkus/1.3/html/developing_and_compiling_your_quarkus_applications_with_apache_maven/proc-debugging-your-quarkus-project_quarkus-maven