OmniAICreator/Qiita-1.07M huggingface dataset:
[勉強会メモ] Originless ってなんじゃ？

`Originless` という聞き慣れない単語に興味を持ち、NRI ネットコムさん主催の勉強会に参加したのでメモ。

# 参加した勉強会
- Origin 負荷軽減の観点で見る CloudFront - オプション機能から Originless 設計まで -
  https://nrinetcom.connpass.com/event/307324/

# CloudFront の構成
```mermaid
flowchart LR
  Viewer --> EL[Edge location]
  EL --> RE[Regional edge cache]
  RE --> OS["Origin Shield (任意)"]
  OS --> Origin
```

# 活用ケース
- [Origin Shield](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/origin-shield.html)
  - Origin への全リクエストが Origin Shield を通る
  - スパイクアクセスがあったときに大量の同時リクエストはひとつにまとめて Origin に届ける
  - Origin がオンプレとかにあって帯域制限があるときとか効果的
- Edge 関数
  - CloudFront functions 特徴
    - 関数サイズ 10KB 以下
    - ミリ秒未満の軽量な処理のみ
    - 低コスト & デプロイ取り回し高速
    - Viewer フェーズのみ適用可能
  - Lambda@Edge 特徴
    - 関数サイズ 128MB 以下
    - 5..30s の実行時間
    - Viewer, Origin フェーズどちらも適用可能
  - Edge 関数の典型的利用例
    - リダイレクト, Sorry サーバ
    - Visitor Prioritization (visitor の優先順位付け)
      ググると [AWS のサンプル](https://aws.amazon.com/jp/blogs/networking-and-content-delivery/visitor-prioritization-on-e-commerce-websites-with-cloudfront-and-lambdaedge/) が出てくる。
      サーバ側の状態は DynamoDB で持ったり S3 に置く(弾力性に優れたリソース)。
      ユーザの識別には Cookie。
      ・・・特別なことは何も無かった。
- Edge 関数による Originless
  - Edge 関数からレスポンス返すこと。
  - [Hono (炎)](https://hono.dev/) という軽量ライブラリがある。
    minify すると 14KB 以下。Router とか JSX 使えるそれなりの環境が整う。
    - 参考) https://qiita.com/watany/items/b86c2304832126de76e0
  - スロットリングに注意

# 要するに Originless とは
文字通りの意味で、Edge でレスポンスを返して完結させること。
そのまんまでした。


# 所感
Origin Shield、 Visitor Prioritization、 Hono については収穫だった。

エッジコンピューティングを検討するほどシビアな性能が要求されるような経験は無いので、ふーんという感じだった。(小並感。。。すんません)
以前 Lambda@Edge を使ったときは npm package 使うとサイズで即アウト、Lambda Layer も使用不可で、こりゃ大したことできないなと泣く泣く Vanilla JS でちょろっと書いた程度だったけど。進化してるんだなあ。

勉強会運営された方、ありがとうございました & お疲れさまでした。
掲示板削除アクションのルーティングエラー解消


エンジニア目指してプログラミングスクールでRuby,Rails勉強しながら奮闘中。
掲示板作成アプリ制作を通してつまづいた削除アクションのルーティングについてまとめる。

# 環境
ruby 3.14
rails 7.0.3.1
mac OS Sonoma 14.2.1
docker 24.0.7
docker compose v2.23.3-desktop.2

# したいこと
作成した掲示板を削除して、掲示板一覧画面にリダイレクトしたい。

# 今回のポイント
* destroyメソッドなどの必ず成功するべきメソッドには、!を付ける。
* PUTやPOSTリクエスト後はリダイレクトのオプションでsee:otherを付けてステータスコード303を返す。

# やってみたこと
boards_controllerでdestroyアクションを作成し、各行で以下を実現しようとした。
* params[:id]を使ってboardsテーブルから該当のデータを取得
* destroyメソッドを実行
* 掲示板を削除しました。というフラッシュメッセージを表示
* 掲示板一覧へリダイレクト
```ruby:boards_controller.rb
  def destroy
    board = current_user.boards.find(params[:id])
    board.destroy!
    flash[:success] = t('defaults.flash_message.destroyed', item: t('activerecord.models.board'))
    redirect_to boards_path
  end

  private

  # ストロングパラメータ
  def board_params
    params.require(:board).permit(:title, :body, :user_id, :board_image)
  end
end
```

# どんなエラー？
```ruby:docker-compose
Started DELETE "/boards/33" for 192.168.65.1 at 2024-01-30 20:04:11 +0900
Processing by BoardsController#destroy as HTML
Parameters: {"id"=>"33"}

###中略####

# ここでdestroyアクションは成功しているっぽい。
Completed 302 Found in 32ms (ActiveRecord: 4.6ms | Allocations: 17375)

# なんかここで今度はDELETEメソッドを呼ぼうとしてる？
Started DELETE "/boards" for 192.168.x.x at 2024-01-28 20:10:56 +0900
# cannot render console?
Cannot render console from 192.168.x.x! Allowed networks: 127.0.0.0/127.255.255.255, ::1
# RoutingErrorが出ている。
ActionController::RoutingError (No route matches [DELETE] "/boards"):

Started GET "/boards" for 192.168.x.x at 2024-01-28 20:10:56 +0900
# cannot render console?
Cannot render console from 192.168.x.x! Allowed networks: 127.0.0.0/127.255.255.255, ::1
Processing by BoardsController#index as HTML

```
# どうやって解決した？
## ルーティングエラーになった件。
destroyメソッド完了後、同じ画面に戻ってこようとしているため、二重送信が行われてもう一度DELETEメソッドが呼ばれたのではないかと考察。二重送信時には掲示板のidが入っていないのでルーティングエラーになっている。

`解決法` 
POSTメソッドの結果としてリダイレクトする際は
`:see_other`を付け加えることで **別画面としてリダイレクトする** 303レスポンスにする。
```
redirect_to boards_path :see_other
```

## cannot render consoleが出ちゃう。

`解決法` 
これは参考にさせていただいた記事の通りに、
`config/environment/development.rb`に以下ホワイトリストを追記した。
```
Rails.application.configure do
...略
  config.web_console.whitelisted_ips = '198.168.x.x' #追記
...略
end
```


# 結果
エラーなし！ やったぜ。
```ruby:docker-compose
Completed 303 See Other in 32ms (ActiveRecord: 12.8ms | Allocations: 10421)
 
 
Started GET "/boards" for 192.168.x.x at 2024-01-30 20:04:11 +0900
Processing by BoardsController#index as HTML
```


# 参考にさせていただいたサイト
https://railsguides.jp/getting_started.html#%E8%A8%98%E4%BA%8B%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B

https://find-a.jp/seotimes/glossary/303-see-other/

https://qiita.com/terufumi1122/items/73da039e6fc90ee0a63f
insert_all について

## insert_all とは
複数のレコードを登録(bulk insert)できる
データベースアクセスが多くなりがちなループ処理などで有効
ただし、バリデーションなどのチェックを無視して登録する点に注意

## 使用例
```
user_names.each { |user_name| User.create(name: user_name) }
 
 →上記ではuser_namesの数が増えれば増えるほどDBアクセスが多くなる
  ただし、正常にバリデーションが各insertに行われる

user_attributes = user_names.map { |user_name| {name: user_name} }
User.insert_all(user_attributes)

 →上記では、一括でDB登録が行える
  ただし、前述の通りバリデーションなどを無視し、またinsertに失敗した要素があったとしても例外は発生させない
```

## 使い分け
insert対象が多くなりそうな場合は、insert_allが良さそう
ただ、エラーハンドリングやトランザクションはしっかりしないといけない
find_or_create_by について

## find_or_create_by とは
ActiveRecordが用意しているメソッド
存在チェックをしながら、登録ができる
また、該当のレコードが見つかった場合は、該当のレコードが戻り値として返ってくる

```
user = User.find_or_create_by!(name: "Alice")
 →nameカラムがAliceのレコードを検索し、該当するものがなかった場合登録をする
```

## find_or_create_by と find_or_create_by! の違い
find_or_create_by は登録ができなかった場合はnilを返し、例外は発生しない
find_or_create_by! は登録ができなかった場合は、例外を発生させる
DS検定リテラシーレベルを受けてみよう！の回

初投稿です。
kinchです。Twitter(旧:X)にて僕の名前を調べるとアカウントが出てきますが
それも僕です。

追記：3/17に受験が決まりました！(多分)

今回は3月に行われるDS検定を受験してみようと~~だいぶ前~~に決めていたのですが
備忘録も兼ねてQiitaで体験記なり、自分の知識なりをまとめていこうと思っています。

その前に自己紹介として

|名前|kinch|
|:-:|:-:|
|在住|尾張国|
|年齢|ピチピチってギリギリ言える年齢|
|職業|人材サービス業|
|現在|現職にFA宣言し交渉期間中<br>なお、宣言残留は認められてない模様|
|目指している業界|データサイエンティスト|
|取得済み資格|基本情報<br>統計2級<br>Python3認定エンジニア基礎|

まぁ、ここまでみたら分かると思いますが、かなりの野球好きです。~~野球やったことないけど~~
データサイエンティスト自体は働いている中知った職業ですが、埼玉にあるサウナドームを経営している球団がデータサイエンティストを募集してるのをみて
「野球やったことない俺でも野球に携わることできるんじゃね？」と思い始めたのが
データサイエンティストを目指したきっかけです。

そんなこんなありバタバタしていますが、日々の学習記録は以下のStudy Plusでまとめていこうと思いますのでよかたら確認してみてください〜

[Study Plus](https://app.studyplus.jp/users/47eeda9804c84676af7af810bf6fc572)

ではまたいつか〜
いずれかは読みやすくしたいと思います〜
「Unixという考え方」を読んだ際の個人的メモ

# この記事について
「[Unixという考え方](https://www.ohmsha.co.jp/book/9784274064067/)」を読んだ際、個人的に印象に残った考え方を。メモしたものです。

# スモール・イズ・ビューティフル
- 忠実に、解決したい問題だけを解決するプログラムを組む。そこに余計なものはいらないという考え方。言い換えれば、一つのプログラムには一つのことをうまくやらせよう。
  例えばファイルをコピーするプログラムを作ろうと考えているなら、ファイルをコピーするロジックだけを提供すれば良い。そこにエラー処理とかをいっぱい載せたくなるのを我慢すること。そうすれば必然的に小さなプログラムとなる。
 　　
- そして小さなプログラム単独で行えることは大したことなくても、「組み合わせる」ことで大きな力を発揮する。
  また、小さなプログラムはわかりやすく、保守しやすく、そしてシステムリソースにも優しい。
 　　
- 巨大で複雑、リッチで強力なプログラムは便利とされているが、「現状のあらゆる不測の事態に対応できるように」作られたものは、果たして将来の技術の進歩と、それに伴うインタフェースの実装作業に耐えられるのだろうか。
対して、複数の小さなプログラムで構成された一つの仕事をこなすプログラムは、(はじめから)細かなモジュール化がされているため、部品(小さなプログラム)を少し取り替えたり変更するだけで、新しいインタフェースが必要になっても対応可能になる。

# 効率より移植性
- 効率の良いプログラムを書こうと思うと、ハードウェアの持つ特殊な機能を利用して、そのマシンに最適化された、他のマシンとは互換性の無い方法で実現しようとする。効率の良い書き方は往々にしてこうなりがちだ。
　　
- しかし、特定のアーキテクチャでしか動作しないソフトウェアはやがて淘汰されてしまう。なぜなら次に登場するハードウェアは今までよりもっと高速だからだ。そして次に登場するハードウェアは更に高速だろう。つまりプログラムの移植が容易であるほど、そのずっと先のマシンでも生き残り続けることができる。反対にマシンに依存したプログラムを書いていると、移植する際に多大な努力を必要としてしまい、そのうち誰もそのプログラムを移植しようだなんて考えなくなる。
　　
- つまり、プログラムを速くすることには時間をかけないほうが良い。プログラムが低効率でも次の年にはハードウェアの高性能化で気にならなくなるよ。
  それに、できることならシェルスクリプトで書いたほうが移植性は高い。

# ソフトウェアの梃子を有効に活用する
- 偉大なプログラマはよいコードを借りてくる。すでに同じ問題を解決する方法が先人によって提供されているなら、それを取り込むべきであり、これはコードを書く時間やアプリケーションへの投資を少なく抑えることができる。大事なのはそのソフトウェアが仕事をこなせるかどうかであり、他人の仕事を借りた結果かどうかではない。
　　
- ソフトウェアの梃子を効率的に利用する方法の一つは、全てを自動化することであり、自動化できそうなタスクはソフトウェアの梃子を利用して自動化を勧めてしまおう。これは余計な作業時間を減らし、生産性を飛躍的に向上させるだろう。
　　
- シェルスクリプトにはおそろしいほどの梃子の効果がある。シェルスクリプトは数千、数万行ものC言語のソースコードからコンパイルされており、自分で書いたものではない。それを組み合わせて各コマンドを実行させるだけでも、何百万行以上ものコードの実行結果を自分のものにできる。
  
- シェルスクリプトはC言語よりも移植性が高いので、シェルスクリプトをC言語で書き直したいという誘惑には負けてはいけない。なぜならC言語のプログラムはヘッダファイルの定義や、マシンアーキテクチャサイズ、その他UNIX実装の持つ移植不能な様々な原因から、その移植性は低いからだ。

# 個人的な感想
特に「小さなプログラムを組み合わせる」という考え方には感動を覚えました。小さくて一つの仕事をきっちりこなせるプログラムを、一つの構成要素として他のプログラムと組み合わせ、巨大なストラクチャを形作るというのは、様々な面において合理的な考え方だと感じました。
【Phaser]既存プロジェクトにViteを導入する

# メリット
- ファイルの変更が即座にブラウザに反映されます
- ビルドが自動で最適化されます

# Viteのインストール
既存のプロジェクトのルートディレクトリで、以下のコマンドを実行してViteをインストールします。

```
npm install vite --save-dev
```

# Vite設定ファイルの作成
プロジェクトのルートに vite.config.js または vite.config.ts ファイルを作成します。基本的な設定は以下のようになりますが、プロジェクトに応じてカスタマイズが必要です。

```
// vite.config.js
import { defineConfig } from 'vite';

export default defineConfig({
  // ここにViteの設定を記述
});
```

# index.html の更新
Viteは index.html をエントリーポイントとして使用します。既存のHTMLファイルをViteが読み込めるように更新する必要があります。例えば、スクリプトタグを以下のように書き換えます。

```
<script type="module" src="/path/to/your/entrypoint.js"></script>
```

# パッケージの移行
プロジェクトで使用している外部ライブラリや依存関係があれば、package.json を更新し、必要に応じて再インストールします。

# 開発サーバーの起動

Vite開発サーバーを起動するために、package.json のスクリプトセクションに以下を追加します。

```
"scripts": {
  "dev": "vite",
  "build": "vite build",
  "serve": "vite preview"
}
```

その後、以下のコマンドで開発サーバーを起動します。

```
npm run dev
```

# ビルドと本番環境のテスト
プロジェクトをビルドして、本番環境での動作をテストします。
```
npm run build
npm run serve
```
MacOsのWiresharkでHTTPトラフィックを見る方法　 How to decode TLS traffic on Wireshark

## マックによる通信プログラムを作成したい
　前回記事からかなりブランクが空いた。最近 MacBookを買ってそれにXcodeを入れて遊んでいる。コードはもちろんSwiftだ。Windowsではネットワークプログラムをいくつか作っていたが、マックででも作ろうかと思い始めて、今猛勉強している。そこでマックにWiresharkを入れてHTTPトラフィックを見ようとしたが、デフォルトの環境ではTLS通信で暗号化されGETもPOSTも内容が見れない仕様だ。そこで簡単なHTTPの見方を説明する。

## HTTPトラフィックの暗号化
　通常、TLS通信ではパスワードなどをPOSTする時に暗号化されて、相手に送信される。例えば、悪人がトラフィックを盗み見ようとしても暗号化されていては全く解読できない。これが世界的にSSL/TSL通信が主流になった要因だ。

## マックでHTTPのやりとりを解読する
　マックOS上でWiresharkによる自クライアントとサーバーの監視方法は以下の手順で行うが、Wiresharkとグーグルクロームがインストールされていることが前提となるので、インストールしていない場合はあらかじめマックに入れておく必要がある。

１、Wiresharkを起動し、Wireshark->Preferences->protocols->TLS->(pre)-Master-Secret log filenameに``/tmp/tmp-google/.ssl-key.log``をいれOKを押す。 
 ２、ターミナルを開く
 ３、``SSLKEYLOGFILE=/tmp/tmp-google/.ssl-key.log /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --user-data-dir=/tmp/tmp-google``
と入力しエンターを押す。
４、Chromeが自動起動するのでそこから対象のサイトを開く。WiresharkのフィルターにHTTPまたはHTTTP２を入れ、HTTPトラフィックが表示されているのを確認する。

## その他の方法
　　HTTPトラフィックを見る上で最も簡単なのはFiddlerというソフトを使うことだが、macOSでは使用できなかった。WindowsでFiddlerを使用し、マックでコードを書くという手間がかかるが、非常に楽な作業になるのは間違いない。その他マックOSに対応したHTTP監視ソフトもあるが、有料となりまた動作も安定しないためお勧め出来ない。
sqlで大量データを更新する方法

# 前置き
最近、とある製品のテーブルの200万近いレコードに対して、部品コードのカラムをを新しい部品コードのカラムに更新する機会があった。
ここまで大きなレコードを操作するのは初めての機会だったので私感含め、記しておく。

# 問題にぶち当たる
業務内容としては33000件程度の旧部品コードと新部品コードのcsvファイルから対応する新部品コードを取り出し、バッチのphpファイルを動かしDBを更新する、難しくない内容だった。
当初、バルクアップデートの概念を知らなかった私は普通にUPDATE文をループ内で実行した。
しかし、処理が止まってしまう。
原因を半日ぐらい探った結果、**UPDATE文が1億回以上実行されるプログラム**になっていた事に気づいた。(ヒットする件数が5000件以上あった)

# 対処した
先輩からバルクアップデートやってみたらと言われ調べてみる。
ざっくりこんな感じ。
カラム名は架空です。

```bulk_update.sql
UPDATE 'table_name' 
SET parts_name=ELT(FIELD(parts_name,$proto_name_list),$change_name_list)
WHERE parts_name IN($proto_name_list)
```
結果、2時間程度でテーブルの更新を実現することができました。
構造の説明をします。
ELTは第一引数に数値、第二引数以降に任意の要素を取り、第一引数と一致する第二引数以降の要素を返します。
FIELDは第一引数に検索要素、第2引数以降に被検索要素を取り、第一引数と一致する第二引数以降のキーを返します。
この2つを組みわせることで旧部品コードに対応する新部品コードへの更新を実現しています。

# 感想
処理がDBを触る回数の意識は改めて大事だと感じた。
また上のSQLのIN文にも40000件手前ぐらいにrange_optimizer_max_memsizeの制限があり、それを超えると全件検索になり遅くなるなど調べていていろいろな情報が出てきて面白かった。
今年はもう少しDBについて詳しくなりたいと思う。

# 参考書籍及びURL
https://qiita.com/maxima/items/ee87d9bea31eddf667e0

https://developers.freee.co.jp/entry/large-in-clouse-length-cause-full-scan
AWSのアクセス制限について

## AWSのアクセス制限について

### 概要
AWSのアクセス制限について、色々なところで制限がかけられるので原因箇所を素早く見つけられるようまとめてみる

----
### 制限を掛けられる場所の一覧
- WEBなどのユーザーアクセスの場合
    - AWS WAF&Sheild
    - Cloudfront
    - SecurityGroup
        - ALB
        - ECS
        - EC2
        - RDSなどなど
    - インスタンスやコンテナの中
- 管理者がSSHなどで接続する場合
    - SecurityGroup
    - インスタンスやコンテナの中
- LambdaなどAPIへのアクセスの場合
    - APIGateway
    - AWS WAF&Sheild
----

### 雑な図解
- WEBなどのユーザーアクセスの場合(AWSサービスでの設定)
![スクリーンショット 2024-01-30 182814.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233507/51945414-5b9a-b0d5-e151-83bb842b7992.png)
    - 補足
        - AWS WAFで許可or拒否するIPsetsを反映したルールを割り当てて制限を行う
            - Cloudfrontに適用する場合はグローバルリージョン
            - ALBに適用する場合はローカルのリージョンを指定
        - RDS/Elasticacheなどの場合
            - EC2やECSなどのアクセス元に設定したセキュリティグループを送信元に設定するとセキュア
            - 複数のセキュリティグループがアクセス元になる場合は、サブネットのレンジを指定するなど

----

- WEBなどのユーザーアクセスの場合(OS以上のレイヤーでの設定)
![スクリーンショット 2024-01-30 185117.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233507/f683c0e8-80eb-fa1e-f666-54e9075d1679.png)

----

- LambdaなどAPIへのアクセスの場合
![スクリーンショット 2024-01-30 190535.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233507/2cdb32ba-e639-ea15-b220-553a0713796c.png)
    - 補足
        - AWS WAFで許可or拒否するIPsetsを反映したルールを割り当てて制限を行う
            - APIGatewayのリージョンを指定

----

アクセスができないとなった場合、確認する箇所はざっくりこのあたりかと思います :cold_sweat:
自己紹介とアウトプットについて[初投稿]

# はじめに

学んで理解したことをアウトプットする機会として、Qiita を始めることにしました。
初投稿ということで、何について書くか悩みました。
その末、自己紹介とアウトプットの重要性について記述できたらと思います。

# 自己紹介

改めまして、社会人1年目のエンジニア、ブンガク📖です。

社会人１年目の未熟者のため、業務に慣れていくことに精いっぱいの毎日です💦
しかし、プログラムしてシステムを製造することの楽しさを感じる日々を送ることができています。
いつもお世話になっている方々に感謝の気持ちしかありません！

ちなみに、扱ったことがある言語は以下の通りです。
- HTML
- CSS
- JavaScript
- C
- C#
- Java

扱ったことがあるだけで理解度はまちまちです。
これから極めていきたいでと思います！！！
皆様、どうぞよろしくお願いいたします。

# アウトプットすることの重要性について

さて、本題です。
そもそも、アウトプットとは具体的に何でしょうか？
辞書（ [goo国語辞書](https://dictionary.goo.ne.jp/) ) で調べると次のように出てきます。

>［名］(スル)出力。特にコンピューターで、データを画面に表示したり、印字などで取り出したりすること。

今回述べたいのは、そういうことではありませんね...
意味合いとしてはこちらについて述べたいです。

> 知識・経験など自分が得たものを何らかの形で活かしたり発信したりすることを表現すること

機械的な無機質な意味合いから、人間的な日本語になりました。
アウトプットと聞いて意味を答えろと聞かれたら、後者の意味を思い浮かべる方が多いのではないでしょうか？
それだけアウトプットが大切だと様々な方々が言っているということですね、きっと。

では、そのように大切だと言われるアウトプットを行うと、どのようなメリットが実際あるのでしょうか？
端的に、以下にまとめます。

- 学んだ内容が頭に定着しやすくなる。
- インプットの効率が上がる。
- 体系的に知識を付けることができる。

これらのメリットが関連して、仕事の成果につながったり、アウトプットした内容が誰かの知識になったりいいことづくめです。
ここで、何人の方はこう思ったのではないでしょうか。
「 いや、大切さは理解しているけれど、実際に行うことができないし、難しいんだよ 」
わかります。実際、今私が実際に思っていることです。
そんな方に少し朗報です。アウトプットについて難しく考えすぎなくてよいようです。
アウトプットの方法としては、レポートにまとめたり、ブログを書いたりと少し大変な方法があります。しかし、もっと簡単な方法として、誰かに話したり、質問したりするだけでもアウトプットの機会となるそうです。
私のようなズボラな方々は、日常会話で少しずつでも始めるとよいかもしれません。

https://schoo.jp/matome/article/1755

# 最後に

今回、アウトプットの重要性についてアウトプットした形になりました。
アウトプットの大切さについて学んだからには、今後も頑張っていきたいと思います！
また、今回は何について書くか悩んだ末このような内容になりましたが、今後はもっと実益のあるような内容を書いていけたらよいなと思います。
/usr/share/localeディレクトリ

# 無駄なファイルを削除する
/usrディレクトリが4.3Gをディスクを使用していることがわかった。

その中で/usr/shareが4.3G,/usr/varが1.7G,/usr/tmp/が1.4Gを使用している。
とりあえず/usr/shareを探る
```
du -s /usr/share/* | sort -rn | head -10
```
すると/usr/share/locale/が520Mを使用している。
早速localeディレクトリを調べてみる。

# localeディレクトリとは？
LC_TIME,LC_MESSAGEファイルがあった。

## LC_TIME 
現在の時間表記を、24時間表記または12時間表記に変更します。
## 出典
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-keyboard_configuration#:~:text=LC_TIME,%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

## LC_MESSAGE
標準エラー出力に書き出される診断メッセージに使用されるロケールを決定します。
## 出典
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-keyboard_configuration#:~:text=%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-,LC_MESSAGES,%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AB%E4%BD%BF%E7%94%A8%E3%81%95%E3%82%8C%E3%82%8B%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB%E3%82%92%E6%B1%BA%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82,-2.1.1.%20%E7%8F%BE%E5%9C%A8

# 出典
https://www.ibm.com/docs/ja/integration-bus/9.0.0?topic=locales-changing-your-locale-linux-unix-systems

# 感想
/usr/share/locale/はエラーメッセージが書かれているから使わない言語のエラーメッセージや時間は消しても大丈夫そう。

ファイルの名前をしっかり見て検索して、内容を把握することを気をつけよう。
【Reactアプリ100本ノック】10 Navigate

![navigate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/af48aea4-9874-8ae7-cecc-7707493be1ae.png)

# はじめに

<h3>こんにちは！！ Watanabe Jin (@Sicut_study)です！</h3>

https://qiita.com/Sicut_study/items/78910cd8d103b8d45a73

こちらの記事が嬉しいことに多くの方に見ていただきました。
そこで**React**が多くの初心者の方に注目されているんだなということを実感させられました。

私の記事では何度も言っている通り

<font color="red"><h4>最速で学ぶならとにかく何か作る</h4></font>

というのが大事になってきます。そこで **「Reactアプリ100本ノック」** というのに挑戦していこうかと思います。徐々に難易度を挙げていってどこまでお題を作りきれるかの腕試しでやっていただければと思います。

今回はUIに関するコンポーネントの実装に挑戦していきます

# 前回のお題

https://qiita.com/Sicut_study/items/a27e5789a1b23438d77c

# Reactアプリ100本ノックルール

- 主要なライブラリやフレームワークはReactである必要がありますが、その他のツールやライブラリ（例: Redux, Next.js, Styled Componentsなど）を組み合わせて使用することは自由
- TypeScriptを利用する
- 要件をみたせばデザインなどは自由

# 10. Navigation

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/e181b45f-eaf0-dd3c-03c1-ab5531fb7752.png)


## 問題

タブナビゲーションを作成します

## 目的

タブナビゲーションでコンポーネントを切り替える仕組みを考え、デザイン性のあるインタラクティブなコンポーネントの作成に挑戦します

## 達成条件

- タブナビゲーションがある
- タブをクリックすると表示している内容が切り替わる
(例えばHomeならHomeコンポーネントの内容を表示する)


## 実際に解いてみた

![Peek 2023-12-03 20-48.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/24804977-fa91-90a9-8ca3-43601520085d.gif)

### 利用技術

- React
- TypeScript
- Vite
- Framer Motion

解答時間 : 2時間

今回はインタラクティブなUIにしたかったので**FramerMotion**を利用しました

https://www.framer.com/motion/

実際にサンプルに同じようなタブナビゲーションがあったので真似て実装しています
すでに便利なコンポーネントなどがある場合は利用してすぐに実現するのも大切だと思います

1から作るのも良いですが、今回はアニメーションのあるリッチなものを簡単に作ることができました

# 次のお題

https://qiita.com/Sicut_study/items/cbf1a15fa31727a74514

# おわりに

React100本ノックの記事を地道に上げていこうと思いますので、一緒に挑戦したい方は @Sicut_study をフォローいただけるととてもうれしく思います。
ここまで読んでいただけた方は**いいね**と**ストック**よろしくお願いします。

今週もプログラミング頑張りましょう！

![jisou-banner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/217ea52d-8130-3266-0619-990fa968408a.png)

# おすすめ記事

https://qiita.com/Sicut_study/items/a4ba0592142b76223aa0

# About Me

Webエンジニア転身して1年間本気で勉強
転職ドラフトで高額オファーを複数獲得
そこでの経験からアウトプットやマインドセットの発信に強みがある
エンジニアをやりながら、起業に挑戦中
アイデア作りやパブリックスピーキングを得意としてる

■ Twitter
https://twitter.com/Sicut_study
■ Instagram
https://www.instagram.com/himariajin
■ Youtube
https://www.youtube.com/channel/UCBFrGAJhPuuaoLwUIHBILsA
■ TikTok
https://www.tiktok.com/@sicut_study
■ プログラミングコーチングJISOU
https://projisou.jp
■ 登壇依頼などご依頼はこちらから
himaria.jin.watanabe@gmail.com


# 参考

https://www.framer.com/motion/
データサイエンティストのための（最低限の）リーダブルコード

# はじめに
この記事では、データサイエンティストが最低限意識した方が良さそうなコードの書き方について紹介します。

お恥ずかしながら、自分は「運用するわけじゃないし、動けばいいでしょ～」精神でコーディングをしていました。しかし、上司にコードレビューをしていただく機会があり、最低限の可読性・保守性のあるコードの大切さとそんなコードを書くためのポイントについて教えていただきました。

この記事では、この上司のレビューからの学びや、コーディングをしている中で感じ取ったコツのエッセンスを共有していきたいと思います。エンジニアの方からすると初歩中の初歩のようなことだとは思いますが、コーディングがへたくそなデータサイエンティストのメモと思っていただければ幸いです。

## そもそもデータサイエンティストにとって可読性の高いコードが必要なのはなぜか
これはずばり、**分析業務で発生しがちな突然の変更・引継ぎや、分析レベルから運用への移行に簡単かつ迅速に対応できるようにするためです！**

データサイエンティストにとってプログラミングはあくまで手段であり、かけられる時間もそこまで多くないこと、コードもnotebookで管理することが多いことから、可読性・保守性の高いコーディングはそこまで求められていないという事実があると思います。

しかし、データサイエンティストが携わる分析業務では、業務の引継ぎや業務内容がそのまま運用レベルに移行するようなことがそう少なくない頻度で起こるため、自分の作ったコードが人に見られる機会は少なくありません。そんな時、読みにくいコードが残されていた場合は理解や改修に大きな時間がかかってしまう一方で、読みやすいコードが残されていればスムーズに対応ができます。つまり、**読みやすいコードを書くことは業務の効率化に直結するのです。** そのため、データサイエンティストにとっても可読性・保守性の高いコーディング技術は必要不可欠と言えます。

# リーダブルコードのすすめ
## 1. 関数の作成
### 1-1. 機能ごとに関数化
まず最初にやるべきは、「この関数はこの機能」と一言で説明できるような1機能だけを備えた関数を作ることです。これにより、**仮にプログラムに対して細かい変更があったとしてもひとつの関数を書き換えるだけで対応できることが多くなり、業務の効率が上がります。**

### 1-2. 小さな関数を組み合わせ、大きな関数を作っていく
1-1で述べたような「1機能だけを持つ関数」が作れたら、これらの小さな関数を使った処理を複数行う「より大きな関数」を作っていきましょう。これを繰り返し、一つのプログラムができていくイメージとなります。


### 1-3. 重複した機能を持つ関数はなるべく一つに統一
分岐のある処理などを扱う際、「重複した処理はあるけど微妙に違うことをしなければならない…」ということが多々あります。このような場合、**重複した処理はなるべく一つの関数に統合し、分岐の数を減らしましょう！** こうすることで、把握すべき関数の数が減り、読みやすいコードとなります。自然と分岐が少なくなるので、コードを書く側の負担も減ります。

## 2. コメントを残そう
簡潔で良いので、処理の理由や関数の機能を要約するようなコメントを残しましょう（処理そのものを直訳するより、要約するイメージで行うと良いでしょう）。

**「どんな処理・挙動をするのか」を分かってコードを読むのと、何も事前知識がない状態でコードを読むのには大きな違いがあります。**
## 3. 定数の入力について
### 3-1. なるべく手動入力を避ける
データのインプットなど、どうしても手動で入力が必要になる箇所を除き、できるだけ自動で定数を取得するような仕様を意識しましょう。これにより、変更対応に強い（= 保守性の高い）コードとなります。

### 3-2.notebookの場合は定数の入力箇所を一か所にまとめる
「定数定義」のようなセルを作ってしまい、全定数を一か所に集約してしまいましょう。後程定数の変更が必要になった際、変更箇所が一目で分かるので、効率的に作業が進みます。

## 4. （Pandasを使う場合）簡潔なカラム処理を心がける
### 4-1. カラム単位での一括処理はapplyを使用
やむを得ない場合を除き、カラムに対して一括処理をかける場合はfor文ではなくapply文を使用しましょう。apply文の方が行数が少なく済むことが多いので読みやすく、処理速度も速いです。

### 4-2. カラム削除やカラム改名は最低限に
コードの途中でカラムが増減したり、名前が変わったりすることを繰り返すと読みにくいコードになってしまいます。テーブル（DataFrame）間の結合の仕方や、使用するカラムの処理を工夫することでできるだけカラムの役割や名前が変わらないようにしましょう。

### 4-3. notebookの場合、df.head()でDataFrameを確認するセルを作成する
処理の結果を確認するため、作業中のDataFrameをhead()で表示するセルを用意しても良いでしょう。複雑な処理をした場合など、可視化できる場所を用意しておくと親切です。ただ、この可視化操作は不要という考えの方もいるので、少し注意です。。

## Appendix 
もっと知りたい！という方は、ぜひかの有名な書籍「[リーダブルコード](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655)」も読んでみてください。この記事では触れなかったものの、業務に役立つ大切なポイントが分かりやすくまとまっています。

# まとめ
自分自身まだまだ未熟な点が多いですが、今後も読みやすい・変更しやすいコード作成を意識していきたいと思います。参考になれば幸いです。
「Efficient Linux コマンドライン」を読んだ際の個人的メモ

# この記事について
「[Efficient Linux コマンドライン](https://www.oreilly.co.jp//books/9784814400485/)」を読んだ際、学びになったことについて自分用に整理しておきます。

個人的には[CDPATH](#cdpath)と[BashのTab補完を利用する](#bashのtab補完を利用する)が面白かったので、聞いたことがない人はぜひご覧ください。


# 入力と出力のリダイレクト
記法|説明
-|-
1> | stdoutのリダイレクト
2> | stderrのリダイレクト
&> | 両方をリダイレクト

以下例
```c:test.c
#include <stdio.h>
int main(void) {
    printf("stdout\n");
    fprintf(stderr, "stderr\n");
    return 0;
}
```
```bash:bash
$ ./test 1> stdout.txt
$ ./test 2> stderr.txt
```

# 評価を無効にする
記法|説明
-|-
'' | 範囲内の全てを文字として扱う
"" | いくつかの記号を除いて範囲内の全てを文字として扱う
\ | バックスラッシュの次にある文字を文字通りに扱う

例えば「$HOME」はシングルクオートでは文字列として表示され、ダブルクオートではホームディレクトリとしてシェルに展開されます。

例
```bash:bash
$ echo "$HOME"
/home/user

$ echo '$HOME'
$HOME
```
# CDPATH
(追記: @ko1nksm さんより`export`は不要とのご指摘を頂きまして、修正しました。)

.bashrcかなんかに環境変数としてCDPATHを追記することで、普段使いする深いディレクトリへと簡単に移動ができます。個人的にはこれがとても面白く、GitHubにある.bash_personalとgcdp(ホームディレクトリ配下のディレクトリと、ホーム上のディレクトリを絶対パスとして文字列で返すシェルスクリプト)なども参考にしてみてください。

```bash:.bashrc
#.bashrcなどへ追加するスクリプト
CDPATH=行きたいディレクトリへの絶対パス
```

例えばあなたが
/home/user
にいるとして、その配下にある
/home/user/dir1/dir2/dir3 ぐらいに進みたいとしたら
愚直にパスを手打ちするのではなく、
```bash:.bashrc
CDPATH=/home/user/dir1/dir2/dir3
```
と.bashrcに追記して読み込ませることで
```bash:bash
$ pwd
/home/user

$ cd dir3
$ pwd
/home/user/dir1/dir2/dir3
```
こう出来るのです。

# 効率よくディレクトリへ戻る
記法|説明
-|-
cd -| 移動する直前のディレクトリへ戻る
pushd | 現在いるディレクトリをスタックへプッシュし、指定したディレクトリへ移動する
popd | スタックからディレクトリをポップし、かつそこへ移動する
dirs | ディレクトリのスタックを見る

例
```bash:bash
$ pwd 
/home/user

$ pushd /home/user/dir1/
~/home/user/dir1/ ~/home/user

$ dirs
 0 ~/home/user/dir1
 1 ~/home/user

$ popd
~/home/user
```

# リストに関するテクニック
記法|説明
-|-
&& | ２つ目のコマンドの実行は１つ目のコマンドに依存している
\|\| | 1番目のコマンドが失敗したら、2つ目のコマンドを実行する
; | 単に順番に実行する

例

```bash:bash
# dir1への移動が成功したらnew.txtを生成する
$ cd dir1 && touch new.txt

# dir1への移動が失敗したらエラーを吐く
$ cd dir1 || echo "failed to change dir"

# 単にnew.txtを生成した後に、helloを表示させる
touch new.txt ; echo "hello"
```

# プロセス置換
記法 | 説明
-|-
<() | ()の中にコマンドを記述することで、そのコマンドの実行結果(stdin)がファイルのように扱える

例

```bash:bash
# diffはファイルを要求するのでこう書ける
# 結果は何もない(文字列が同じなので)
# あるプログラムの実行結果をファイルに書き込んでdiffするより、echoの部分をあるプログラムに置き換えると便利
$ diff <(echo "Hello") <(echo "Hello")
```

# プロセス制御に関するテクニック
記法|説明
-|-
& | 実行するプログラムの最後につけると、標準出力がプロンプトへ出力されなくなる(バックグラウンドで動く)
bg | &をつけたプログラムはctrl+zで一時停止可能。そしてbgで再開できる
fg | バックグラウンドで動いているプログラムをフォアグラウンドへ戻す(標準出力が出てくるようになる)

例

```bash:bash
# GUIなアプリケーションをコマンドから起動すると、そのコマンドに入力できなくなるため、その解決などに使用する。
# keepassxcはただの例
$ keepassxc &
```
# BashのTab補完を利用する
簡単に言えば、.bashrc内の関数やその他シェルスクリプトへの補完を有効化することで、実行時にTabによる入力の補完を行うことができるというものです。有効化するには`complete`コマンドを使用するよう、シェルの起動時に確実に読み込まれるファイル(.bashrcなど)へ追記しておく必要があります。
詳しくは[GitHubにあるページ](https://github.com/figaro-san/unix_toolsets/blob/main/.bash_personal)も参考にしてみてください。

# 最後に
- 間違えていた場合にはご指摘ください。
- 他にも様々なテクニックが記されていましたが、個人的にためになったというかすぐ使えて面白かったものだけを書きました。
- 実は他にもgrepや正規表現、awkやsedなどの基本にも触れられていたのですが、こちらはこれらをより深く扱った書籍などを参考にするべきだとのことです。
【Phaser】ゲーム開始時に星を特定の配置パターンの中からランダムで降らせる

# 星の出現パターンをランダムにするやり方

## 解説
```
create() {
    // 星の配置パターンを配列で定義
    this.starPatterns = [
        // 様々な星の配置パターンを定義
        [{ x: 50, y: 0 }, { x: 150, y: 0 }, { x: 250, y: 0 }, /* ... */],
        [{ x: 70, y: 0 }, { x: 190, y: 0 }, { x: 310, y: 0 }, /* ... */],
        // 必要に応じてさらにパターンを追加
    ];

    // 星を格納するためのグループを作成
    this.stars = this.physics.add.group();

    // ランダムにパターンを選択
    let selectedPattern = Phaser.Utils.Array.GetRandom(this.starPatterns);

    // 選択されたパターンに基づいて星を作成し、グループに追加
    selectedPattern.forEach(pos => {
        let star = this.stars.create(pos.x, pos.y, 'star');
        star.setVelocityY(100); // 必要に応じて速度を調整
    });
}
```

- 星の配置パターンの定義: this.starPatterns に複数の星の配置パターンを配列として定義しています。各パターンは、星のX座標とY座標をオブジェクトとして含んでいます。
- 星のグループの作成: this.stars に this.physics.add.group() を使って星を格納するグループを作成します。これにより、後で一括で星に対する操作を行うことができます。
- パターンのランダム選択: Phaser.Utils.Array.GetRandom メソッドを使って、定義されたパターンの中からランダムに一つを選択します。
- 星の作成とグループへの追加: 選択されたパターンに基づいて、forEach ループを使って各星を作成します。this.stars.create を使って星を作成し、その位置をパターンに基づいて設定します。作成された星に対して、setVelocityY メソッドを使ってY軸方向の速度を設定します。



## 課題

#### 星の速度の調整
setVelocityY メソッドを使用して、星の下降速度を変更してみてください。

```
function getRandomInt(max) {
  return Math.floor(Math.random() * max);
}
```
to_charとto_date

よく忘れるのでメモ

・基本的にto_charはSELECTするときに表示形式を指定
・to_date は、where句などにおいて日付で絞りたいときに指定

例）
select username from dba_users where PASSWORD_CHANGE_DATE < to_date('2020/07/07','YYYY/MM/DD');

select to_char(created, 'YYYY/MM/DD hh24:MI:SS') from dba_users where account_status='OPEN';
自宅DX SwitchBot実装(物理)

ラズパイ等以前のおはなしです。

## 背景
・休日の朝一にAmazonさん等のインターホンで飛び起きて、寝起きで慌てて2段ベッドから降りることが度々あるが、滑って転んで頚椎損傷して四肢麻痺になったら人生が詰む
・実際、もこもこ靴下を履いた状態の時に上記内容をやり、梯子で足を滑らせかけるという赤チン事案を発生させた

## 誓約
・再発防止のためインターホンにもSwitchBotを実装する

## 制約
・賃貸なので壁を傷付けられない
・DIY初心者なので工作スキルがちいかわ

## 初期状態
ごく一般的なもの
![IMG_0032.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661209/22665642-8a34-e287-8546-af8e31c84f4a.jpeg)

## 実装案検討(物理)
単4電池が2段になっているパックがインターホン下の台としてちょうど良いことを確認
![IMG_0034.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661209/f24370f5-1df2-2125-d94d-46a9ea89bad4.jpeg)
酷いビジュアル

## 実装案
3Dプリンタがあればやりたい放題なのでは？と思いながら、CADとかで描いてみたかった
![IMG_0042.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661209/242c0320-e006-2eb5-9ad7-2b74b6cc1655.jpeg)

## 材料
feasibilityと作業工数を優先で、高級100円ショップにてその場で使えそうなものを選定
お香立てはのこぎり切断の練習用
![IMG_0078.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661209/267597cf-5b1c-1b25-70fe-7ad0bb2f3e95.jpeg)

## メイキング
![IMG_0080.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661209/a0492b3c-1692-4109-b9ee-1e00da304fde.jpeg)
他の家具にも使った水性塗料で二度塗り、ツヤありの濃い色は切断面の粗さを誤魔化してくれるので神

## 実際にできたもの
劇的BeforeAfter、匠降臨ッ！
![IMG_0084.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661209/fb8b10dc-765d-9c69-7fde-842abfe57f34.jpeg)

![IMG_0086.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661209/e11aabb6-59e1-ca49-b660-6e25857c648e.jpeg)

## 解錠ッ！
![IMG_0249.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3661209/b901811b-4528-e0c0-b6da-335eb60cd6e5.jpeg)


## 反省点
・のこぎりでのくり抜きが予想以上に難しく、錐でブチ抜こうとしたら、背面の断面がバリバリになりかけた
・「四角形のくり抜きは、角の4点を電ドリで貫通させる」ということを何も知らずにやって苦戦したが、後日大物を作る前の練習も兼ねていたので、自分がどんなやらかしをするかを知れたのでヨシ
・インターホン下のエアコンのリモコンを動かせなくなったが、SwitchBot実装が優先なのでヨシ
・SwitchBotでイメージ通り解錠できるようになったものの、解錠の度にSwitchBot側の可動部分のパワーに負けて、ちょっと動いて微妙に壁面から浮くがまあヨシ
・自分の気質として、案を考えるのは好きだが見通しが甘く途中で投げ出したくなるので実行力が弱い傾向があるが、DIYは「腹を括ってできるまでやり続ける」が最重要ポイントらしいなと学んだ



これで、救急車を呼んだ時も2段ベッドの上からインターホンを解錠することが可能になりました。

安全はすべてに優先する！今日も一日ご安全に！
sympyで「Heaviside step function(ヘヴィサイドの階段関数)」を使ってみた

# plot (2024/02/15 追加)

```python
from sympy.plotting import plot
var('x',real=True)
y0=x*2-Heaviside(x-3,H0=0)*x*2+Heaviside(x-3,H0=0)*(6+(x-3)*3)
y1=x*2-Heaviside(x-3,H0=1)*x*2+Heaviside(x-3,H0=1)*(6+(x-3)*3)
print('#',y0)
print('#',y1)
plot(y0,y1,(x,0,6))
# -2*x*Heaviside(x - 3, 0) + 2*x + (3*x - 3)*Heaviside(x - 3, 0)
# -2*x*Heaviside(x - 3, 1) + 2*x + (3*x - 3)*Heaviside(x - 3, 1)

print("#",y0.subs({x:3}))
print("#",y1.subs({x:3}))
# 6
# 6
```

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/9e724eab-caed-115c-1b34-4d470f361eef.png)

# Doc
Heaviside step function.

https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.delta_functions.Heaviside

# wikipedia

https://en.wikipedia.org/wiki/Heaviside_step_function

https://ja.wikipedia.org/wiki/ヘヴィサイドの階段関数

# sympyで
#### 参考
数学入試問題 様
＞２次関数の応用問題
・点Qが点Cから点Oへ移動します。

https://kamelink.com/blog/2024/01/18/1-4-24-kyotsutest-honshiken-i-3-2%e3%83%bbia-2-1/

相互リンクです。

https://qiita.com/mrrclb48z/items/2dcb37bb1909f9acf9c5

・ver0.2
```python
# ver0.2
from sympy import *
var('Px,Qy,t,x',real=True)
OC =6
Qsp=2
t3 =Rational(OC,Qsp)
Qy_CO=OC        -Qsp*t*Heaviside(t- 0,H0=0) #;print("# Qy_CO=",Qy_CO)
Qy_OC=Qsp*(t-t3)      *Heaviside(t-t3,H0=0) #;print("# Qy_OC=",Qy_OC)
Qy   =Qy_CO+Qy_OC*2                          ;print("# Qy   =",Qy  )
Qy_0 =Qy.subs({t:0})                         ;print("# Qy_0 =",Qy_0)
Qy_1 =Qy.subs({t:1})                         ;print("# Qy_1 =",Qy_1)
Qy_2 =Qy.subs({t:2})                         ;print("# Qy_2 =",Qy_2)
Qy_3 =Qy.subs({t:3})                         ;print("# Qy_3 =",Qy_3)
Qy_4 =Qy.subs({t:4})                         ;print("# Qy_4 =",Qy_4)
Qy_5 =Qy.subs({t:5})                         ;print("# Qy_5 =",Qy_5)
Qy_6 =Qy.subs({t:6})                         ;print("# Qy_6 =",Qy_6)
# 
# Qy   = -2*t*Heaviside(t, 0) + 2*(2*t - 6)*Heaviside(t - 3, 0) + 6
# Qy_0 = 6
# Qy_1 = 4
# Qy_2 = 2
# Qy_3 = 0
# Qy_4 = 2
# Qy_5 = 4
# Qy_6 = 6
```

・ver0.1
```python
# ver0.1
from sympy import *
var('Px,Qy,t,x',real=True)
Qy_CO=6-2*t*Heaviside(t-0,H0=0)   ;print("# Qy_CO=",Qy_CO)
Qy_0 =Qy_CO.subs({t:0})           ;print("# Qy_0 =",Qy_0)
Qy_1 =Qy_CO.subs({t:1})           ;print("# Qy_1 =",Qy_1)
Qy_2 =Qy_CO.subs({t:2})           ;print("# Qy_2 =",Qy_2)
Qy_3 =Qy_CO.subs({t:3})           ;print("# Qy_3 =",Qy_3)
# 
Qy_OC=2*(t-3)*Heaviside(t-3,H0=0) ;print("# Qy_OC=",Qy_OC)
Qy_4 =Qy_OC.subs({t:4})           ;print("# Qy_4 =",Qy_4)
Qy_5 =Qy_OC.subs({t:5})           ;print("# Qy_5 =",Qy_5)
Qy_6 =Qy_OC.subs({t:6})           ;print("# Qy_6 =",Qy_6)
# Qy_CO= -2*t*Heaviside(t, 0) + 6
# Qy_0 = 6
# Qy_1 = 4
# Qy_2 = 2
# Qy_3 = 0
# Qy_OC= (2*t - 6)*Heaviside(t - 3, 0)
# Qy_4 = 2
# Qy_5 = 4
# Qy_6 = 6
```

# 参考

https://www.google.com/search?q=%E3%83%98%E3%83%B4%E3%82%A3%E3%82%B5%E3%82%A4%E3%83%89+%E9%96%A2%E6%95%B0&rlz=1CAUHAM_enJP1089&oq=%E3%83%98%E3%83%B4%E3%82%A3%E3%82%B5%E3%82%A4%E3%83%89+%E9%96%A2%E6%95%B0&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIKCAEQABiABBiiBDIKCAIQABiABBiiBDIGCAMQRRg80gEINDc3MGowajeoAgCwAgA&sourceid=chrome&ie=UTF-8

#  参考文献
【ST言語ことはじめ】自己保持を実装する方法


## はじめに

自己保持は、プログラマブルロジックコントローラー（PLC）プログラムで広く使用される重要な概念です。本記事では、自己保持の概要と実装方法について解説します。

## 使用機材

|   |機種など   |
|:---:|------|
|PLC  |Q02CPU, QX41, QY41P, Q62P, Q38B    |
|アプリ  |GX Works 2    |

I/O割り付けはこちらを[参照](https://qiita.com/so2/items/0f0cab2e324179718b89 "I/O割り付け表")

## 自己保持とは何か

自己保持は、ある条件が成立した場合に、その条件が解除されるまで特定の状態を維持する仕組みです。例えば、モーターを起動する条件が成立した場合、モーターが停止する条件が発生するまで、モーターを起動し続けることができます。

## 自己保持の実装方法

自己保持を実装するためには、以下の手順を参考にしてください。

1. **条件の設定**: 自己保持を行う条件を設定します。これは、PLCの入力信号や内部変数の値に基づいて定義されます。
2. **出力の設定**: 条件が成立した場合に自己保持する出力を設定します。これは、PLCの出力信号や内部変数の値に対する設定です。
3. **自己保持の実装**: 条件が成立した場合、出力を設定し、条件が解除されるまで出力を維持します。

## 自己保持の例

以下は、簡単な自己保持の例です。

```ST
IF X001 THEN
    M001 := TRUE;
END_IF;
(* ボタン1を押した時にM001をON *)
(* ボタン1を離しても特に処理をしないことで保持とする *)

IF X002 THEN
    M001 := FALSE;
END_IF;
(* ボタン２を押した時に保持を解除 *)

Y071 := M001;
(* M001の状態によってランプの点灯を制御 *)
```

## まとめ

本記事では、自己保持の概要と実装方法について解説しました。自己保持は、PLCプログラムで頻繁に使用される重要な概念であり、正確な制御を実現するために理解しておく必要があります。

以上が自己保持を実装する方法に関する内容です。PLCプログラミングにおいて、自己保持の活用により効率的な制御プログラムを開発してください。
PowerAutomate：子フローの作成

PowerAutomateでフローをたくさん作ると、同じような処理を個別に作るのが面倒になります。
サブルーチン化できないか調べたところ、マイフローでは作れないけど、ソリューションでは作れるという情報を得たのでメモを残します。

#### マイフローの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/5f14e17b-5104-ed2e-4a2f-5e2e630aae9b.png)
  * 組み込みに「フロー」が出てこない
  * 組み込みの「Flow button for mobile」には「子フローの実行」がない

### ソリューションの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/e19aa8a5-fa07-f66b-bb32-9f01b5af64b8.png)
  * 組み込みに「フロー」が出てくる
  * 組み込みの「フロー」「Flow button for mobile」を選択すると「子フローの実行」が出てくる
  * 「子フローの実行」を選択すると、所定ルールに従って作成したフローが選択できる
  * 子フローには引数を渡したり、返り値を受け取ったりできる

# ソリューションの作成

1. 左メニュー「ソリューション」を選択し、上部メニュー「＋新しいソリューション」を選択
2. 表示名、名前、公開元、バージョンを入力して作成
3. 初めてソリューション作成する場合は「＋新しい公開元」を選択し、表示目、名前、接頭辞を入力して保存

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/5b3886f1-4b15-e75a-d033-27f2046c5f20.png)

# 子フローの作成

1. 左メニュー「ソリューション」から、作成したソリューションを選択し、左メニュー「ソリューション」、上部メニュー「＋新規→自動化→クラウドフロー→すぐに」を選択
2. フロー名：「Child」とし、「フローを手動でトリガする」を選択して作成ボタンを押下
3. 「手動でフローをトリガーします」にテキスト入力項目を追加
4. 「PowerApp または Flow に応答する」を追加し、応答値として文字列結合を行う以下項目を追加（この値が呼び出し元に返す値になります）

| タイトル | 値(式) |
|:-----------|:------------|
| output       | concat('===',triggerBody()['text'],'===')|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/c3584b22-fd50-3585-ef18-87f5c74ae740.png)


# 別フローから作成した子フロー呼び出し

1. 左メニュー「ソリューション」から、作成したソリューションを選択し、左メニュー「ソリューション」、上部メニュー「＋新規→自動化→クラウドフロー→すぐに」を選択
2. フロー名：「Parent」とし、「フローを手動でトリガする」を選択して作成ボタンを押下
3. 子フローに文字列「hoge」を渡すフローを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/cf1bd5ab-2b66-4f2d-51cf-711e6b1ccf60.png)

実行すると親フローの作成で無事、子フローの文字列結合処理結果を取得できました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3681410/0eaad80b-bb11-4a55-af05-95ee5938db9f.png)
Sinatra の使い方

Ruby のフレームワーク　Sinatra の使い方です。

## ライブラリーのインストール

```bash
gem install sinatra
gem install sinatra-reloader
gem install rackup
```

## プログラム

```rb:myapp.rb
require 'sinatra'
require 'sinatra/reloader'
 
get '/' do
    "Hello World!"
end
```

## サーバーの起動

```bash
ruby myapp.rb -o 0.0.0.0
```

```text
$ ruby myapp.rb -o 0.0.0.0
== Sinatra (v4.0.0) has taken the stage on 4567 for development with backup from Puma
Puma starting in single mode...
* Puma version: 6.4.2 (ruby 3.2.2-p53) ("The Eagle of Durango")
*  Min threads: 0
*  Max threads: 5
*  Environment: development
*          PID: 11116
* Listening on http://0.0.0.0:4567
Use Ctrl-C to stop
```

ブラウザーでアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/944429cc-b36f-b5ac-3316-04164cd8824a.png)

## プログラムを改造

```rb:myapp.rb
require 'sinatra'
require 'sinatra/reloader'

get '/' do
    "Hello World!<br />" +
    "Good Morning!<br />" +
    "Good Afternoon!<br />" +
    "こんにちは!<br />" 
end
```

ブラウザーでアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/1adb03bf-6f1b-767d-d0dc-65c8de3e85b2.png)

## 確認したバージョン

```text
$ ruby --version
ruby 3.2.2 (2023-03-30 revision e51014f9c0) [aarch64-linux]

$ gem list sinatra

*** LOCAL GEMS ***

sinatra (4.0.0)
sinatra-contrib (4.0.0)
sinatra-reloader (1.0)
```
ST言語ことはじめ

## はじめに

ST（Structured Text）言語は、プログラマブルロジックコントローラー（PLC）で広く使用されるプログラミング言語の一つです。本記事では、三菱電機のQシリーズPLCおよびそのプログラミングソフトウェアであるGX Works 2を使用したST言語の基本について解説します。

## 使用機材

|   |機種など   |
|:---:|------|
|PLC  |Q02CPU, QX41, QY41P, Q62P, Q38B    |
|アプリ  |GX Works 2    |

I/O割り付けはこちらを[参照](https://qiita.com/so2/items/0f0cab2e324179718b89 "I/O割り付け表")

## ST言語とは何か

ST言語は、プログラマブルコントローラーのプログラムを記述するためのテキストベースのプログラミング言語です。C言語やPascalに似た構文を持ち、複雑な制御アルゴリズムを実装するのに適しています。

## GX Works 2の基本操作

GX Works 2は、三菱電機のPLCをプログラミングするための統合開発環境（IDE）です。以下は、GX Works 2の基本操作です。

### プロジェクトの作成

1. GX Works 2を起動します。
1. 「新規プロジェクトの作成」を選択します。
1. プロジェクト種別はシンプルプロジェクトを選択します。
1. 「ラベルを使う」にチェックします。
1. プログラム言語はSTを選択します。
1. 「OK」をクリックします。

## とても簡単なサンプルプログラム

ボタンを操作するとランプがついたり消えたりするプログラムです。

```ST
Y071 := X001;

(* Y071 / ランプ01, X001 / ボタン01 *)
```

### ラダー図

同じ動作をするプログラムをラダー図で書くと以下のようになります。

```batch:ラダー図
(+)                                               (-)
|    X001                                  Y071     |
+----| |----------------------------------(    )----+
|                                                   |
```

## まとめ

本記事では、三菱電機のQシリーズPLCとGX Works 2を使用したST言語の基本について紹介しました。ST言語は、プログラミング初心者から上級者まで幅広く活用される言語であり、正確で効率的な制御プログラムを開発するための重要なツールです。

以上がST言語入門の基本的な内容です。これを参考にして、PLCプログラミングのスキルを向上させてください。

## 関連記事一覧

- [自己保持を実装する方法](https://qiita.com/so2/items/9f15117c795d926234dd)
- [タイマーを利用したプログラム例](https://qiita.com/so2/items/d0c4221c7d815757e9e3)
- [GX Works 2で使える命令文の一覧](https://qiita.com/so2/items/3fef83fe3e3b876e2306)
- [オルタネートについて](https://qiita.com/so2/items/ef4115c199c59dcce1dc)
- [カウントを利用したランプの点灯制御](https://qiita.com/so2/items/b808ceae20256efb2938)
- [カウンタの数値をDPLに表示する](https://qiita.com/so2/items/5b41b83a3745d627d085)
- [パルス処理をPLSを使わずに実装してみた【箸休め】](https://qiita.com/so2/items/9616cef49be146e147ce)
- [マスターコントロールを使ってみる](https://qiita.com/so2/items/2643e63f353c8f688a0a)
- [タイマーを利用したランプの点灯制御](https://qiita.com/so2/items/ff96970a43c83e644d09)
- [タイマーとカウンタの挙動について](https://qiita.com/so2/items/9afcc8ec55ba0c8df55d)
- [特殊リレーを使ってみる](https://qiita.com/so2/items/227e99076ebb002a1261)
- [ワードデバイスのアドレス指定](https://qiita.com/so2/items/74328479aa4497c40cfc)
- [ビットデバイスをCASEで使ってみる【箸休め】](https://qiita.com/so2/items/23b4e98aff0c5124e7a8)
- [CASEでフラグ管理っぽいことをしてみた【箸休め】](https://qiita.com/so2/items/95c31c02935989ada519)
- [インデックス装飾とループで効率化](https://qiita.com/so2/items/ec52efc0e1cebc3030be)
- [シリンダ制御のサンプルプログラム](https://qiita.com/so2/items/363f5fbf37e2c43199df)
Pythonのunittestでデコレータを使ってmockする

# 背景
- 以前mockの使い方をまとめました

https://qiita.com/munaita_/items/ed25de04372796250efa

- "クラスをモックする場合"　では `with patch('domain.Class', return_value=None) as mock:` を使ったが、デコレータを使うほうがわかりやすそうななのでメモしておきます


# ドキュメント

https://docs.python.org/ja/3/library/unittest.mock-examples.html#patch-decorators


> Mock を使ってパッチしたい場合は、 patch() を1引数で (または patch.object() を2引数で) 使うことができます。mock が自動で生成され、テスト関数/メソッドに渡されます:

```py
class MyTest(unittest.TestCase):
    # SomeClassクラスのstatic_methodをモック化し、test_something()に引数で渡している
    @patch.object(SomeClass, 'static_method')
    def test_something(self, mock_method):
        SomeClass.static_method()
        mock_method.assert_called_with()

MyTest('test_something').test_something()
```

> 次のパターンのように patch デコレータを重ねることができます:

```py
class MyTest(unittest.TestCase):
    @patch('package.module.ClassName1')
    @patch('package.module.ClassName2')
    def test_something(self, MockClass2, MockClass1):
        self.assertIs(package.module.ClassName1, MockClass1)
        self.assertIs(package.module.ClassName2, MockClass2)

MyTest('test_something').test_something()
```

> デコレータをネストした際、モックは (デコレータを適用する Python の通常の) 順に適用されます。つまり **引数は下から上の順になり、よって上記の例では test_module.ClassName2 が先になります。**


# 実装

```py
from domain import Onemore
import unittest
import requests
from unittest.mock import patch

class Hoge():
    def request_api(self, content: str):
        r = requests.post(URL, data=content, headers={"Content-Type": "application/json"})
        if r.status_code == 200:
            print(r.text)
        else:
            raise Exception(r.text)


class TestHoge(unittest.TestCase):

    # @patchデコレータでrequests.postをモック化し、テストの第一引数で渡せる
    @patch('requests.post')
    def test_request_api(self, mock_post):
        # mock_postが指定したmock_responseを返すように設定していく
        mock_response = requests.Response()
        mock_response.status_code = 500
        mock_response._content = b'Server Error'
        mock_post.return_value = mock_response
        with self.assertRaises(Exception) as context:
            Onemore().request_api("テストテキスト")

if __name__ == '__main__':
    unittest.main()
```
ST言語ことはじめで使用しているI/O割り付け

# はじめに
PLCの学習でつなげている機器と端子番号の対応表です。このI/O割り付けに基づいて実習を進めています。

# 入力機器
| 端子番号 | 機器名称 || 端子番号 | 機器名称 |
|:--:|---|-|:--:|---|
|X000 | ボタン0 ||X090 | シリンダー1 前進端検出センサ |
|X001 | ボタン1 ||X091 | シリンダー1 後退端検出センサ |
|X002 | ボタン2 ||X092 | シリンダー2 前進端検出センサ |
|X003 | ボタン3 ||X093 | シリンダー2 後退端検出センサ |
|X004 | ボタン4 |
|X005 | ボタン5 |
|X006 | ボタン6 |
|X007 | ボタン7 |

# 出力機器
| 端子番号 | 機器名称 || 端子番号 | 機器名称 |
|:--:|---|-|:--:|---|
| Y040 | DPL1-1ビット目 || Y070 | ランプ0 |
| Y041 | DPL1-2ビット目 || Y071 | ランプ1 |
| Y042 | DPL1-3ビット目 || Y072 | ランプ2 |
| Y043 | DPL1-4ビット目 || Y073 | ランプ3 |
| Y044 | DPL2-1ビット目 || Y074 | ランプ4 |
| Y045 | DPL2-2ビット目 || Y075 | ランプ5 |
| Y046 | DPL2-3ビット目 || Y076 | ランプ6 |
| Y047 | DPL2-4ビット目 || Y077 | ランプ7 |
| Y048 | DPL3-1ビット目 |
| Y049 | DPL3-2ビット目 |
| Y04A | DPL3-3ビット目 |
| Y04B | DPL3-4ビット目 |
| Y04C | DPL4-1ビット目 |
| Y04D | DPL4-2ビット目 |
| Y04E | DPL4-3ビット目 |
| Y04F | DPL4-4ビット目 |

DPL:7セグメント表示器 0-Fまで表示可能

| 端子番号 | 機器名称 |
|:--:|---|
| Y0A0 | シリンダ１ シングルソレノイドバルブ |
| Y0A1 | シリンダ２ シングルソレノイドバルブ |
STYLY社内ハッカソンでSTYLYモバイルをFaceTrackingに対応させてみた。

## 株式会社STYLY社内ハッカソン
2023年1月10日から11日にかけて、株式会社STYLYでは社内ハッカソンが開催されました。「なんでもOK！」というお題の下、自分は「Face Tracking」に挑戦することにしました。

### なぜFace Trackingに挑戦したのか？

そうみんな大好き。FaceTracking
TikTokやSnapAR、InstagramなどいろんなSNSで使えるFace Tracking。

![スクリーンショット 2024-01-30 12.50.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705249/d701bcf5-4a62-e280-73d8-bccff82b45e6.png)

FaceTrackingはいわば、人間の顔をベースとしたARなんですねぇ。
__ARを扱う「STYLY」アプリならFace Trackingやっておきたい！__

ということで、STYLYアプリにFace Trackingを対応させてみました。

## Face Trackingへ対応する
STYLYアプリの内部仕様は全て省略した形で対応方法を書いていきます。

### 前提条件
今回はAR FoundationのAR Face Managerを使用します。
https://developers.google.com/ar/develop/unity-arf/augmented-faces/developer-guide?hl=ja
|  |  |
|:-:|:-:|
| Unity Version  | Unity 2019.4.40f1  |
| AR foundation  | 4.1.7 |
|ARKit Face Tracking|4.1.7|
|ARKit XR Plugin|4.1.7|

### 実装したこと
既存のSTYLYアプリのAR機能を拡張する形で実装を行いました。
詳しい部分は割愛します。
既存のAR sceneのサンプルにFace Trackingを入れる気持ちで見てください。

#### 1.AR Face Managerをアタッチ
![スクリーンショット 2024-01-30 17.14.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705249/61ec455b-258f-d973-c024-a6ca62cf7c49.png)
AR Session OriginがアタッチされているGameObjectに　__AR Face Manager__　をアタッチします
 
 AR Face Manager
 * Face Prefab
     * この中に入れたGameObjectが顔認識した時に、表示されます。
     * 今回のアプリではSTYLY Studioで設置されたモデルを表示してます。
 * Maximum Face Count
     * この値が同時に認識する顔の数になります。

#### 2.AR Camera ManagerのFacing DirectionをFaceに変更
![スクリーンショット 2024-01-30 17.32.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705249/bcdb2a90-f1dc-b619-f478-aca99adebf2c.png)
これで内カメラを使うようになります。

#### 完成！！
これでARアプリのFace Tracking対応は完了です。

## 作ったものまとめ
### STYLY StudioでARシーンを作る
![スクリーンショット 2024-01-30 17.34.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705249/0a3de8a7-4987-631f-0a73-8a307741b653.png)
今回の実装では、[FaceTracking]という名前から始まるオブジェクトが顔の周りに出ます。
 __※特殊なSTYLYシーンを使用しています。__ 

### 再生してみる
![スクリーンショット 2024-01-30 17.36.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705249/e911a6af-dacd-4bf8-4b11-704eb802c003.png)
 __※開発版STYLYアプリを使用しています。現行のアプリでは動きません。__ 

## 転んだところ
上記のアプリをAndroidビルドでは正常に動いたのですが
iOSだと動きませんでした…

なぜかと調べてみると、[Player Settings]の[XR Plug-in Management]の項目の設定が足りてないみたいでした。
ARKitにチェックを入れて、その下の[ARKit]メニューの[Face Tracking]にもチェックを入れると
iOSビルドでも動くようになりました。
![スクリーンショット 2024-01-30 17.45.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705249/b403695a-fe08-acc9-021e-ee80e8f9d88e.png)

## QAエンジニアとしての挑戦
私はQAエンジニアなので、普段Unityのコードを直接触る機会はほとんどありません。
しかし、このハッカソンではSTYLYアプリの実装を行うという挑戦をしてみました。
結果として実装がうまくいきました。

__STYLYではこのように職務に関わらずいろんなことに挑戦することができます！__


## 宣伝
株式会社STYLYではUnityエンジニア・サーバーサイドエンジニアを募集しています！！ご応募お待ちしています！！

https://www.wantedly.com/projects/1360135

https://www.wantedly.com/projects/1360123
SpringBoot3.2+ AzureADでログインさせるSecurityFilterChainの書き方

## 対象
- SpringBoot3.2でEntra ID（旧AzureAD）でログインを実装している
- なんか公式の通りに書くとDeprecatedって言われて気持ち悪い

## 結論の先出し
Webアプリへのログインの実装について、例によって[公式のドキュメントが古い書式でコードを提示](https://learn.microsoft.com/ja-jp/azure/developer/java/spring-framework/spring-boot-starter-for-azure-active-directory-developer-guide?tabs=SpringCloudAzure5x#tabpanel_1_SpringCloudAzure5x)しています。

`HttpSecurity.aplly(C configurer)`や`HttpSecurity.and()`は非推奨となっていますので、代替の`with(C configurer, Customizer<C> customizer)`と`.authorizeHttpRequests()`を使用する必要があります。

## 公式のサンプルコードをSpringBoot3.2の書式で書き直し
```java:
@Configuration(proxyBeanMethods = false)
@EnableWebSecurity
@EnableMethodSecurity
public class AadOAuth2LoginSecurityConfig {

   /**
    * Add configuration logic as needed.
    */
   @Bean
   SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.with(AadWebApplicationHttpSecurityConfigurer.aadWebApplication(),
                Customizer.withDefaults())
            .authorizeHttpRequests(requests -> requests
                .anyRequest().authenticated());
           // Do some custom configuration.
       return http.build();
   }
}
```
`with()`の第1引数に`AadWebApplicationHttpSecurityConfigurer.aadWebApplication()`で生成したConfigurerを渡して、第2引数で何も変更しないCustomizerを渡します。
その他はラムダ式で書くこと以外は変更なしです。

私の環境ではこの書き方で問題なく動作しているように思いますので、今のうちに新しい書式へ変更しましょう。
何か問題が発生したときは教えていただけると私も助かると思います。おためしください。

## 参考文書
Microsoftのドキュメント-[Spring Security の Spring Cloud Azure サポート](https://learn.microsoft.com/ja-jp/azure/developer/java/spring-framework/spring-security-support?tabs=SpringCloudAzure4x)
Microsoftのドキュメント-[Microsoft Entra アカウントを使用したサインインを Spring Web アプリに追加します](https://learn.microsoft.com/ja-jp/azure/developer/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-active-directory)
以前に書いたSpring Security + Azure AD(Entra ID)のログインについてもう少し詳しい記事-[Spring Boot(MVC) + Spring Security + Azure ADでのログインの実装がとても簡単になった件](https://qiita.com/talesleaves/items/fed1f39dfca9ae8efa3e)
ubuntuサーバーにscpでファイルを転送出来ない時の対処法

# WSL(ubuntu22.04) からubuntu22.04にscpでファイル転送できない？
```bash
scp -r -vvv  source_dir/ user@ip_adress:/distination_dir
```
上記を実行しても `debug1: Exit status -1`で終了してしまう。

# 対処法: サーバーの.bashrcを編集する
自分の場合、IntelOneAPI用の環境設定のためのshell scriptをで実行するよう、下記のようなコマンドがサーバー側の.bashrcに書き込まれている
```bash
source /opt/intel/oneapi/setvars.sh
```

### コメントアウトを外すところ
下記のcase ~~~~ esacのコメントアウトを外しらうまくいくようになった。
```bash
# If not running interactively, don't do anything
# case $- in
#     *i*) ;;
#       *) return;;
# esac
```
上記を有効化することで、シェルが対話型モード(interactive)で実行されていない場合(scpやrsyncコマンドはコレ)、何も実行しないようできるらしい。

このようにしなければいけない理由は、ChatGPT4さんによると、下記のような感じらしいです:
> サーバーの .bashrc ファイルを確認すると、最後の部分に source /opt/intel/oneapi/setvars.sh という行があります。これは Intel OneAPI の環境変数を設定するためのスクリプトを実行しています。これがSSHセッションやrsyncセッションの際に実行されると、予期しない出力が発生し、非インタラクティブセッションの実行に影響を与える可能性があります。


参考にしたサイトにもbashrc に echo コマンドがあると scp の挙動がおかしくなるとあります。

# 感想
linux初心者な自分にとっては「はぇ～」という感じでした。
勉強になりました。

# 参考にしたサイト
- https://unix.stackexchange.com/questions/715807/what-does-if-not-running-interactively-dont-do-anything-in-the-bashrc-file
- https://bugzilla.redhat.com/show_bug.cgi?id=20527
Raspberry Pi ZeroのPythonバージョンを変える

先日作成したRaspberry Pi Zero W用RaspbianのPythonバージョンは3.9。
諸事情により、ここにPython 3.5を追加しました。その時のメモです。

#### 使用環境：
- Windows10
- Raspberry Pi Zero W
- Raspberry Pi OS 11(Bullseye)

※ SSH接続して作業しているためWindowsと記載していますが、ラズパイのターミナルで直接作業してもOK

#### 作業：
① 取り込むバージョンを探す
② 取り込む

---
##### ① 取り込むバージョンを探す
python.orgのサイト( https://www.python.org/downloads/source/ )を見て、取り込むバージョンを決めます。
今回は3.5を入れたいので、Stable版の最新(3.5の最終というべき？)3.5.10にします。

##### ② 取り込む
以下のコマンドで取り込みます
※ バージョン番号のところは適宜変更してください。
※ 作業全体で約1時間ほどかかりました。
```
wget https://www.python.org/ftp/python/3.5.10/Python-3.5.10.tar.xz
tar -xvf Python-3.5.10.tar.xz
cd Python-3.5.10
./configure --enable-optimizations
make
sudo make altinstall
```

インストール先を調べる
```
which python3.5
```
(実行結果)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/7292ab35-ae1a-e72e-b9b1-75e091f2f507.png" width=70%>

念のため既存のPython(3.9)に影響がないことを確認しておく
```
$ python -V
$ python3.5 -V
```
(実行結果)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/f8eaf249-5db5-2ed2-1221-da59c5d87cc5.png" width=60%>

---
#### 補足
もし「python」と打って3.5の方を使いたい場合はalternativesを使うとラクです。(自分が使っているバージョンを意識するため明示的にバージョンを打つ派の方は以下は無視してください。)

補足手順①：各pythonバージョンの位置を確認
```
which python
```

(実行結果) 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/91f9e93f-ace9-6d44-8a1f-bc3e54552b46.png" width=50%>

補足手順②：python3.5を追加し、結果を表示する
```
sudo update-alternatives --install <link> <name> <path> <priority>
update-alternatives --list python
```

(実行結果)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/f050856f-9b03-8a4d-9abc-e65d7ba81f62.png" width=90%>

(実行結果(python3.9処理時))
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/8f397e57-8822-2b26-aa2c-3d0b309a250d.png" width=90%>

補足手順③：python3.5を紐づける
```
sudo update-alternatives --config python
```
上記コマンドでコンフィギュレーション画面を開くと、紐づける番号(Selection欄)を聞かれるので、該当pythonバージョンが記載されている番号を入力(今回の場合は2を入力)する。

(実行結果)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/3b766a96-0541-dd3b-37fb-b2fd66bd2cbc.png" width=90%>

補足手順④：python -Vでバージョンを確認する

(実行結果)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703624/0c3cf741-162e-d84a-2d19-098f617af0e8.png" width=40%>
Android GoolePlayのinAppReviewがエンタープライズアカウントだとテストできない

### 事象
+ GoolePlayのinAppReviewで内部テストができない

### 原因
+ 内部テストで利用していたアカウントが原因
+ 下記公開ドキュメントのトラブルシューティングに記載のある通り、エンタープライズなどで保護されているアカウントではアプリ内レビューをテストする事ができません
+ 普段内部テストに利用するアカウントは会社で発行したアカウントなので、この制限に引っかかっていた.


https://developer.android.com/guide/playcore/in-app-review/test?hl=ja

:::note warn
担当者曰く、エラーログに該当の制限に引っかかった旨も出力されないので、何が原因かログからは判別がつかない。
:::


### 解決策

+ 内部テストに利用するアカウントを会社アカウントから個人アカウントに切り替えてテストを実施
+ 内部テストグループに登録する必要があるので、グループ管理をしている方とは応相談