OmniAICreator/Qiita-1.07M huggingface dataset:
振り子に現れる特殊関数(1/5)

# はじめに
色々あって物理の話を用意することになったので高校生でも楽しめるような内容を持ってきました。今回の記事はそれを簡単にまとめています。
QiitaでTeXを使うとすぐ重くなってしまうので記事を幾つかに分けます。

# 記事の流れ
全部で５つの記事がありますので先に内容をまとめておきます。
・本記事(1/5)
高校の力学
・2/5 (https://qiita.com/nefu_chem/items/1aeea4d9e58539c23e0d)
Taylor展開
振り子の周期の導出に戻ってみる
・3/5 (https://qiita.com/nefu_chem/items/3788f6512a19c9f5b3e3)
振り子の周期の厳密解を求める
・4/5 (https://qiita.com/nefu_chem/items/0b887e7757fbd2cdeb7f)
振り子の運動
・5/5 (https://qiita.com/nefu_chem/items/31351ac54b8577333eea)
第一種完全楕円積分
周期の再考

# 高校の力学
皆さんは「振り子の等時性」というフレーズを聞いたことがありますか？無かったらもう帰ってもらっていいんですけど，「振り子の等時性」というのは振幅があまり大きくないときに振り子の周期が
```math
T=2 \pi \sqrt \frac{l}{g}
```
になることを指します。とりあえず高校の力学の復習という意味も込めて，この式を導出します。

![スクリーンショット 2023-03-31 003042.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288338/950ded03-4c18-8592-1ccd-64756d4216ca.png)

図を見ながら運動方程式を書くと以下のようになります。
```math
m \frac{d^2(l \theta )}{dt^2}=-mg \sin \theta 
```
$\omega _0 ^2= \frac{g}{l}$とおいて整理すると
```math
\frac{d^2(\theta )}{dt^2} + \omega _0 ^2 \sin \theta = 0
```
となります。高校では振幅が小さな場合，つまり$\sin \theta \approx \theta $の近似が成り立つ場合を考えるので以下のようになります。
```math
\frac{d^2(\theta )}{dt^2} + \omega _0 ^2 \theta = 0
```
これは線形なので直ぐに解けます。最大振幅を$\theta _m$とおいて
```math
\theta = \theta _m \sin (\omega _0 t)
```
となります。この運動の周期は$\sin $の中身が$2 \pi $となるような値なので
```math
T = \frac{2\pi }{\omega _0}
```
となって周期の式が得られました。
振り子に現れる特殊関数(3/5)

# はじめに
前回の記事からの続きです。前回の記事はこちら↓↓↓
https://qiita.com/nefu_chem/items/1aeea4d9e58539c23e0d

# 振り子の周期の厳密解を求める。
では，いよいよ本記事のメインに入っていきます。前回までに運動方程式からの導出では非線形微分方程式が出てしまい，厳密解を求めることが難しいというところを見ました。ですのでここからは方針を変えて，エネルギー保存則を使っていきます。
振り子のエネルギーは
```math
E = \frac{1}{2}mv^2-mgl \cos \theta 
```
とかけます。ただし振り子の位置エネルギーは最下点で$-mgl$となるように原点を選びます。摩擦力や空気抵抗などは無視しているので$E$は一定で，振り子の速さが最大値をとるときに振幅は最大になるので$E=-mgl\cos \theta_m$となります。また，振り子の速度は$v=l \dfrac{d\theta }{dt}$だから
```math
\frac{d\theta }{dt} = \pm \omega_0 \sqrt{2(\cos \theta - \cos \theta_m)}
```
となります。
$t=0$のとき$\theta = 0$で$\dfrac{d\theta }{dt} > 0 $であるとして，$\theta = \theta_m$になるとき（振り子の振幅が最大になるとき）の時刻を$t=t_m$とします。周期はこの４倍になるはずなので
```math
T = 4\int_0^{t_m}dt = 4\int_0^{\theta_m} (\frac{d\theta }{dt}) ^{-1} d\theta = 4\int_0^{\theta_m} \frac{d\theta}{\omega_0 \sqrt{2(\cos \theta - \cos \theta_m)}}
```
となります。ここで現れた積分
```math
I = \int_0^{\theta_m} \frac{d\theta}{\sqrt{2(\cos \theta - \cos \theta_m)}}
```
は，変数を以下のように
```math
\sin \frac{\theta }{2} = \sin \frac{\theta_m}{2}\sin \phi 
```
$\phi $に変換してみると
```math
I = \int_0^{\frac{\pi }{2}}\frac{d\phi }{\sqrt{1-\sin ^2 (\frac{\theta _m}{2})\sin^2 \phi }} = K(\sin \frac{\theta _m}{2})
```
となります。ここの$K(k)$は第一種完全楕円積分と呼ばれるもので，以下のように定義されます。
```math
K(k)= \int_0^{\frac{\pi }{2}}\frac{d\phi }{\sqrt{1- k^2\sin^2 \phi }} = \int_0^1 \frac{du}{\sqrt{(1-u^2)(1-k^2u^2)}}
```
ここで$k$は０以上１以下の定数です。これが本記事で初めて出てきた特殊関数です。この定義を用いると，周期は
```math
T = \frac{4}{\omega _0} K(\sin \frac{\theta _m}{2})
```
で表されます。
求めた周期を最大振幅$\theta_m$の関数として表したグラフを作りましょう。作ったものが以下です...とやりたかったんですがグラフ作成でエラーを吐かれて無理だったので，計算サイト（https://keisan.casio.jp/ ）に手を貸してもらいます。このサイトのこのページ（https://keisan.casio.jp/exec/system/1166751749?lang=&charset=utf-8&var_k=1&ketasu=22#! ）にあるグラフを見てみます。
![KkG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288338/e54812a4-d1f7-2a4d-a0ce-ba4efccf0734.png)
このグラフの$k$が今は$\sin \frac{\theta _m}{2}$になっているので$k=1$が$\theta_m = 180 $に対応します。このグラフより最大振幅が大きいときは周期が正の無限大に発散し，小さいときは"ある値"に収束することが分かります。実はこの"ある値"に$\dfrac{4}{\omega_0}$をかけたものが$T_0$になります。これは振幅が小さいことを仮定して近似をしたことを考えれば納得できます。
これで周期については厳密解を求めることができました。でも実はもう少し計算を進めることができます，がそれは最後の記事に続きます。次の記事は振り子の運動についてもう少し深く考えます。

# 参考
高精度計算サイト https://keisan.casio.jp/
【HTML】OGPのog:urlのメタタグの必要性について【備忘録】

HTMLのheadタグに指定する```<meta property="og:url" content="http://サイトのURL">```の必要性がわからなかったので、調べた備忘録。

# 結論
Open Graph ProtocolのグラフのIDとして使うために必要とのこと。

> og:url - The canonical URL of your object that will be used as its permanent ID in the graph, e.g., "https://www.imdb.com/title/tt0117500/".　
:link: [OGP公式ドキュメント](http://ogp.me/)


:arrow_down:参考にさせていただきました。

https://qiita.com/sutara79/items/d7a45f6c4796c1ee1590
WindowsでPython3.11をインストールしたら#!/usr/bin/envのshebang付きスクリプトが動かなくなった

Python3.11をWindowsにインストールしたらshebangに `#!/usr/bin/env python3` と書いていたスクリプトの挙動がおかしくなった覚書です。
Issueはそこそこ立ってますが日本語情報がなかったので。

https://github.com/python/cpython/issues/100107

https://github.com/python/cpython/issues/94399

https://github.com/vkbo/novelWriter/issues/1284

# 先に結論
- `#!/usr/bin/env` は指定名の実行ファイルをPATHから検索する
- 無効化のため環境変数 `PYLAUNCHER_NO_SEARCH_PATH=1` を作成(値は任意)
- msysなどpython3の重複が他にないなら設定のアプリ実行エイリアスでアプリインストーラー (python.exe, python3.exe) を無効化するだけでも良い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165220/38093593-c7aa-e852-3ecd-2d5eb00dc664.png)

# shebangとは
スクリプトファイル一行目のこんなの↓

```
#!/usr/bin/env python3
```

https://akuruhinode.hatenablog.com/entry/2020/11/22/150235

https://qiita.com/SAITO_Keita/items/82c0434ec68d1eaf57dc

https://docs.python.org/ja/3/using/windows.html#shebang-lines

本来はLinux等のシェル環境でスクリプトファイルの実行アプリケーションを指定するものです。(雑理解)
Windowsでは必要ありませんが、他の環境への移植性のために仮想的にサポートしており、 `#!/usr/bin/env python3.9` のように書くとWindowsのpyランチャーがバージョンを解決してくれます。

Windowsでは下記のような書き方ができ、今までは `/usr/bin/env` がUnix系環境で柔軟に対応できるため推奨されていました。<sup>[誰によって?]</sup>
- `#!/usr/bin/env python`
- `#!/usr/bin/python`
- `#!/usr/local/bin/python`
- `#!python`


# 起こったこと
Python3.11をインストールしたら `#!/usr/bin/env python3` というshegangをつけているスクリプトがWindowsにインストールしたpythonで実行できなくなりました。
はじめはmsysのpythonで起動してしまい、そちらをPATHから外すと今度は `Python` とだけ出力されてスクリプトが動作しない状態になってしまいました。
また `#!/usr/bin/env python`というバージョンを全く指定しない書き方や、`#!/usr/bin/python3.8`、`#!python3` などenv以外の指定では今まで通り動作し、後者ではバージョン指定も効きました。

# 原因と解決
pyランチャーの`#!/usr/bin/env` の仕様変更っぽい? (前からじゃないはず…ないよね?)
まず `#!/usr/bin/env` の仕様として、「envの次のコマンドが`python`以外の場合PATHから完全一致する実行ファイルを検索する」という仕様があります。

> The /usr/bin/env form of shebang line has one further special property. Before looking for installed Python interpreters, this form will search the executable PATH for a Python executable matching the name provided as the first argument. This corresponds to the behaviour of the Unix env program, which performs a PATH search. If an executable matching the first argument after the env command cannot be found, but the argument starts with python, it will be handled as described for the other virtual commands. The environment variable PYLAUNCHER_NO_SEARCH_PATH may be set (to any value) to skip this search of PATH.

https://docs.python.org/ja/3.11/using/windows.html#shebang-lines

多分今まではpython3等はそのまま解釈してたのを、3.11から仕様に厳格にしたのかなって感じです。過去バージョンでも同様の記載はありますがやたらと簡素なので。
インストーラでインストールされる実行ファイルは python.exe なので python3 と書くと msys 等の他の環境に含まれる実行ファイルを見に行っちゃうんですね。
この検索機能は環境変数 `PYLAUNCHER_NO_SEARCH_PATH=1` を作成(値は任意)することで抑制できます。

そして他に python3.exe がない状況でも反応するものとしてWindowsのアプリインストーラーエイリアスがあります。これが `出力: Python` の正体です。
これはPythonがインストールされていないWindowsのCUIで python や python3 とタイプしたときにMicrosoft Storeへ移行しインストールを促す ~~おせっかいな~~ 機能で、3.11のpyランチャーはこれも拾ってしまうようです。
こちらは設定の「アプリ実行エイリアス」から無効化できます。公式インストーラでインストールした人はまず間違いなくいらない機能なので無効化してしまいましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165220/38093593-c7aa-e852-3ecd-2d5eb00dc664.png)
WebScoketをsqlmapで脆弱性検査

忘備録：脆弱性検査でやりたかったのでここに記載しておきます。

WebSocketのサービスに対してSQL Injection検査をしたかったのですが、余りにも力不足なので、sqlmapに助けてもらいます。

考え方は以下のサイトを参考にしており、ほとんどそのままのコードを利用しています。

https://rayhan0x01.github.io/ctf/2021/04/02/blind-sqli-over-websocket-automation.html

Man-in-the-middleサーバをPythonで実行し、sqlmapのリクエストをWebSocketに変更します。

URLパスの情報やその他の情報はBURPやその他のツールで収集します。

また、JSONのフォーマットも見ておく必要があります。

上記のJSONフォーマットは以下になっていますが、

```python
# For our case, format the payload in JSON
	message = unquote(payload).replace('"','\'') # replacing " with ' to avoid breaking JSON structure
```

今回の場合は、もう少し手をいれる必要がありました。

```python
    message = unquote(payload).replace('"',"'")
	message = unquote(payload).replace("'",'\\\"')
```

後はこのスクリプトが動いているサーバに対して(ローカルマシーン)へsqlmapを叩くだけです。

```bash
sqlmap -u "http://10.0.0.1:8081/abc?abc=0.0.2" --level 5 --risk 3 --batch --dbs --dump --flush-session   
```

感想やコメント下さい。
【SA試験】R4〜H21午後Ⅰテーマまとめ

自分用のまとめです。
令和6年春期試験から組み込み分野は除外されることになったのと、今回受験で選択するつもりがないので省略しています。

https://www.ipa.go.jp/news/2022/shiken/henkou20221220.html

一番右の列は、個人的な分類です。

|年度|問|問題|種別|
|:--|:--|:--|:--|
|R4春期|問1|新たなコンタクトセンタシステムの構築|<font color="Red">新規システム構築</font>|
|     |問2|品質管理システムの構築|<font color="Red">新規システム構築</font>|
|     |問3|保険申込システムの再構築|<font color="Blue">既存システム変更</font>|
|R3春期|問1|企業及び利用者に関する情報の運用方法の見直し|<font color="Red">新規システム構築</font>|
|     |問2|配達情報管理システムの改善|<font color="Blue">既存システム変更</font>|
|     |問3|融資りん議ワークフローシステムの構築|<font color="Red">新規システム構築</font>|
|R1秋期|問1|サービスデザイン思考による開発アプローチ|<font color="Red">新規システム構築</font>|
|     |問2|容器管理の開発|<font color="Red">新規システム構築</font>|
|     |問3|レンタル契約システムの再構築|<font color="Blue">既存システム変更</font>|
|H30秋期|問1|システムの改善（目標管理システム）|<font color="Blue">既存システム変更</font>|
|     |問2|情報開示システムの構築|<font color="Red">新規システム構築</font>|
|     |問3|ETCサービス管理システムの構築|<font color="Red">新規システム構築</font>|
|H29秋期|問1|生命保険会社のシステムの構築|<font color="Red">新規システム構築</font>|
|     |問2|生産管理システムの改善|<font color="Blue">既存システム変更</font>|
|     |問3|ソフトウェアパッケージ導入|<font color="Red">新規システム構築</font>|
|H28秋期|問1|仕入れ納品システムの変更|<font color="Blue">既存システム変更</font>|
|     |問2|問合わせ管理システムの導入|<font color="Red">新規システム構築</font>|
|     |問3|売上・回収業務のシステム改善|<font color="Blue">既存システム変更</font>|
|H27秋期|問1|データ連携システムの構築|<font color="Red">新規システム構築</font>|
|     |問2|業務及びシステムの移行|<font color="Blue">既存システム変更</font>|
|     |問3|業務委託管理システムの導入|<font color="Red">新規システム構築</font>|
|H26秋期|問1|社内システムの強化・改善(受注・実績管理)|<font color="Blue">既存システム変更</font>|
|     |問2|物流センタのシステム構築|<font color="Red">新規システム構築</font>|
|     |問3|勤怠管理システムの導入|<font color="Red">新規システム構築</font>|
|H25秋期|問1|安否確認システムの導入|<font color="Red">新規システム構築</font>|
|     |問2|銀行のATMサービス|<font color="Blue">既存システム変更</font>|
|     |問3|食品製造業の基幹システムの改善|<font color="Blue">既存システム変更</font>|
|H24秋期|問1|会計システムの再構築|<font color="Blue">既存システム変更</font>|
|     |問2|Webによる写真プリント注文システム|<font color="Red">新規システム構築</font>|
|     |問3|セミナ管理システムの構築|<font color="Red">新規システム構築</font>|
|H23秋期|問1|システムにおける災害対策|<font color="Blue">既存システム変更</font>|
|     |問2|販売管理システムの設計|<font color="Red">新規システム構築</font>|
|     |問3|利益管理システムの改善|<font color="Blue">既存システム変更</font>|
|H22秋期|問1|生産管理システムの再構築|<font color="Blue">既存システム変更</font>|
|     |問2|債権システムの設計|<font color="Red">新規システム構築</font>|
|     |問3|固定資産管理システムの改善|<font color="Blue">既存システム変更</font>|
|H21秋期|問1|販売管理システム（機能強化)|<font color="Blue">既存システム変更</font>|
|     |問2|物流システムの再構築|<font color="Blue">既存システム変更</font>|
|     |問3|システム開発のテスト計画|<font color="Red">新規システム構築</font>|
今更聞けないNext.jsの超基本

Next.jsを使ったアプリケーション開発を行うことが増えてきたので、「そもそもNext.jsとはなんなのか」ということを初心者向けに書いていきたいと思います。

# Next.jsとは?
Next.jsとは一言で言うとReactをベースに開発された、フロントエンドフレームワークです。

https://nextjs.org/

フレームワークとは直訳すると「枠組み」「骨組み」という意味で、まさにプロジェクトやプロダクトを構成する骨組みを提供してくれるものです。
フロントエンド開発者がサーバーサイドレンダリング、静的サイト生成、APIルートなどを容易に実装できるように設計されています。

モダンなReactアプリケーションを簡単に構築することができるため、React開発者にとって非常に人気のフレームワークです。

# Reactとの違いは？

Next.jsとReactの1番の違いは、サーバー機能の有無です。
ReactはJavaScriptのライブラリであり、クライアントサイドでのみ動作します。
そのためバックエンドとして別途必要なライブラリや設定を自分で組み合わせて環境を構築する必要があります。
一方、Next.jsはReactをベースにしたフレームワークであり、サーバーサイドでのレンダリングをサポートしているため単体でWebアプリを動作させることができます。

# Next.jsの主な特徴

### サーバーサイドレンダリング
Next.jsは、サーバーサイドレンダリングを簡単に実装できるように設計されています。
サーバーサイドレンダリングは、クライアントサイドレンダリングに比べて、SEOの向上、初回読み込みの高速化などのメリットがあります。

### 自動的なルーティング
Next.jsは、自動的なルーティングをサポートしています。
これにより、開発者は、ルーティングの設定を手動で行う必要がなくなります。
また、ファイルシステムをベースにしてルーティングを自動的に行うため、開発者はルーティングの設定をよりシンプルに行うことができます。

### APIルート
Next.jsは、APIルートをサポートしています。APIルートを使用することで、独自のAPIエンドポイントを簡単に作成できます。

# 基本操作
ここでは実際にNext.jsのプロジェクトを作成していきたいと思います。
初めに以下の前提条件を満たしていることを確認した上で進めていきます。

#### 前提
- Node.js 14.6.0 またはそれ以降がインストール済み
- MacOS、Windows（WSLを含む）、Linuxのいずれかに環境が対応している

### プロジェクトを作成
新規でプロジェクトを作成するには、ターミナルで次を実行します。
```terminal
yarn create next-app
# or
pnpm create next-app
```
プロジェクト作成にあたりいくつか質問が聞かれます。
今回は最低限のものということで以下の通り進めています。
```terminal
✔ What is your project named? … next-project
✔ Would you like to use TypeScript with this project? … No / Yes
✔ Would you like to use ESLint with this project? … No / Yes
✔ Would you like to use `src/` directory with this project? … No / Yes
✔ Would you like to use experimental `app/` directory with this project? … No / Yes
✔ What import alias would you like configured? … @/*
```
プロジェクト作成が完了したら作成したフォルダに入っていきます。
```terminal
cd next-project/
```

### プロジェクトを起動
ではここで早速作成したプロジェクトを開いていきます。

あらかじめ設定されているコマンドには以下のものがあります。
- ```dev```: Next.js を開発モードで起動するために実行します
- ```build```: 実稼働用のアプリケーションをビルドするために実行します
- ```start```: Next.js 本番サーバーを起動するために実行します
- ```lint```Next.js の組み込み ESLint 構成をセットアップするために実行します

コマンドは先にnpmやyarnを
今回は開発モードで十分のため以下のコマンドで開発サーバーを起動していきます。
```
yarn dev
# or
npm run dev
```
起動が完了したら、 http://localhost:3000/ にアクセスしてみましょう。
以下の画面が表示されたら完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/4ad384e6-a77b-525e-14d3-4acdc9e8ca19.png)

### ページの編集
プロジェクトの作成、起動が完了したら、現在表示されている画面を試しに操作してみましょう。
next-project/src/pages/index.jsファイルの内容を以下に書き換えてみましょう。
```js: index.js
function HomePage() {
  return <div>Welcome to Next.js!</div>
}

export default HomePage
```
ファイルの内容を保存したのち、再度先ほどの http://localhost:3000/ にアクセスしてみましょう。
先ほど追加した"Welcome to Next.js!"の文字が出ていれば編集完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/f76e84e2-48f7-41b3-853c-c771d305993c.png)

参考: 
- https://nextjs.org/docs/getting-started
- https://udemy.benesse.co.jp/development/app/what-is-next-js.html
CMLの設定で困ったこと

ciscoのCMLを設定しました。
私の場合の要因と解決策のメモです。

環境
OS:windows11
仮想化用ソフトウェア:VM  Workstation Player

大変お世話になったサイト
https://nokonokonetwork.com/network/cisco/recommend_cisco_modeling_labs.html

**--うまくいかなかったこと--**
**UIにアクセスできない(接続先が Access the UI from https://127.0.1.1/～と表示される)**
要因：既知のエラー？？
解決方法：ネットワーク設定をブリッジ(自動)→NATへ変更
https://learningnetwork.cisco.com/s/question/0D56e0000CgYrpUCQS/i-just-upgraded-vmware-workstation-to-1701-and-now-i-keep-getting-127011-as-ip-for-cml-ui-i-am-connecting-in-bridge-mode-cml-version-241-any-help-would-be-appreciated

**CML起動後、system helth issueが発生している**
**KVM/VMXがNGのとき**
要因：もともとのwindows仮想化機能が邪魔している
解決方法：
https://infrastructure-engineer.com/cml-lntel-vtx-ng-001/
　・windows 仮想化マシンプラットフォーム☑外す
　・メモリの整合性☑外す
　　　メモリの整合性てなに？
　　　→https://support.microsoft.com/ja-jp/windows/%E3%82%B3%E3%82%A2%E5%88%86%E9%9B%A2-e30ed737-17d8-42f3-a2a9-87521df09b78

**imageがNGのとき**
要因：IOSが読み込めていない(CMLセットアップの最後でPlatform IOS/CD-ROM:not attachedになっている)
解決方法：その他要因を解決して最初からやりなおし
https://learningnetwork.cisco.com/s/question/0D56e0000CptHP1CQM/cml-system-health-issue

=========
そろそろ気合い入れて勉強しようとCML購入しました。5時間くらい格闘していたのではないかと思います。
ですが、新しいことをたくさん知った1日で充実でした！
複数の標準入力を分割して受け取る方法

Python でコードを書き始めて暫くすると戸惑うのが
（paizaのスキルチェックで C ランク問題を解き始めたあたり）
**複数の標準入力を受け取る方法**です。 

今回は以下の流れで順番に説明していきます。
1. 1つの標準入力をそのまま受け取る
1. 1つの標準入力を型変換して受け取る
1. 複数の標準入力を分割して受け取る
1. 複数の標準入力を分割し、型変換して受け取る

　

それぞれについて説明します。

**1. 1つの標準入力をそのまま受け取る**
標準入力を受け取るには `input()` を使うことで実現できます。

具体的には `input_line = input()` と指定することで、
「input_line」という変数に標準入力を格納します。

```Python
### ここまで説明した内容を踏まえたコード例

# 1つの標準入力をそのまま受け取る
input_line = input()
```

　

**2. 1つの標準入力を型変換して受け取る**
これは標準入力を `input()` で受け取った後で、
そのまま型変換して変数に代入することで実現できます。

具体的には `input_line = int(input())` と指定することで、
標準入力された文字列型をint型に変換して
「input_line」という変数に格納します。

```Python
### ここまで説明した内容を踏まえたコード例

# 1つの標準入力を型変換して受け取る
input_line = int(input())
```

　

**3. 複数の標準入力を分割して受け取る**
これは標準入力を `input()` で受け取りつつ、
`split()`メソッドで分割することで実現できます。

具体的には `n, m = input().split()` と指定することで、
標準入力された文字列型をスペース区切りで分割して
「n」と「m」という変数に格納します。

:::note info
`split()`メソッドのデフォルトの区切り文字が「スペース」であるため、スペースで分割されます。
区切り文字を変更したい場合は、`split('【文字列】')`で実現できます。
:::

```Python
### ここまで説明した内容を踏まえたコード例

# 複数の標準入力を分割して受け取る
n, m = input().split()
```

　

**4. 複数の標準入力を分割し、型変換して受け取る**
これは、 `input()` と `split()` のメソッドを使って受け取りつつ、
`map()`関数を使うことで実現できます。

具体的には `n, m = map(int, input().split())` と指定することで、
標準入力された文字列型をスペース区切りで分割する。
その値を「int」関数に渡すことで型変換し、
最終的に「n」と「m」という変数に格納します。

```Python
### ここまで説明した内容を踏まえたコード例

# 複数の標準入力を分割して受け取る
n, m = map(int, input().split())
```
Rust 研究：イテレータ

Rust のイテレータの勉強をしました。

練習がてらフィボナッチ数列を生成するイテレータを実装してみましたのでメモを残します。

# フィボナッチ数列

イテレータの前にフィボナッチ数列のおさらいです。

次の漸化式であらわされます。

> F(0) => 1
> F(1) => 1
> F(n) => F(n-2) + F(n-1)       (n > 1)

1, 1, 2, 3, 5, 8, 13, 21, ... と無限に続きます。

思わず再帰的な実装をしたくなりますが、イテレーションの練習なので、ここは我慢してループを使ったあまり面白くない実装をします。

```rust
// fib は上限値を超えないフィボナッチ数列を表示する
pub fn fib (upper_limit:usize) {

    let mut a:usize = 0;
    let mut b:usize = 1;

    while b <= upper_limit {
        (a, b) = (b, a + b);
        print!("{} ", a);
    }
}
```

関数 fib は引数で与えられた「上限値」を超えないフィボナッチ数列を表示します。

```rust
// 100 を超えないフィボナッチ数列の表示
fib(100);

// 実行結果
1 1 2 3 5 8 13 21 34 55 89
```

# イテレータでの実装


さきほどの fib 関数の実装に準じて、a / b / upper_limit のメンバ変数をもつ構造体とコンストラクタを用意します。

```rust
pub struct Fib {
    a: usize,
    b: usize,
    upper_limit: usize,
}

impl Fib {
    pub fn till(upper_limit:usize) -> Self {
        Fib {
            a: 0,
            b: 1,
            upper_limit: upper_limit,
        }
    }
}
```

続いて Iterator トレイトの next メソッドの実装です。

```rust
impl Iterator for Fib {
    type Item = usize;
    
    fn next (&mut self) -> Option<Self::Item> {
        // 上限値を超える場合は None を返す
        if self.b > self.upper_limit {
            return None
        }

        // 次のフィボナッチ数を計算
        (self.a, self.b) = (self.b, self.a + self.b);

        Some(self.a)
    }
}
```

上限値を超える場合は None を返してイテレーションの終わりをおしえます。

実行例です。

```rust
// for で各数を表示
for n in Fib::till(100) {
    print!("{} ", n);
}

// 実行結果
1 1 2 3 5 8 13 21 34 55 89
```

イテレータにすると処理のバリエーションが広がります。

* for_each で各数を表示

```rust
Fib::till(100).for_each(|x|print!("{} ", x));

// 実行結果
1 1 2 3 5 8 13 21 34 55 89
```

* collect でベクタ化

```rust
let fs:Vec<usize> = Fib::till(100).collect();
println!("{:?}", fs);

// 実行結果
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
```

* map で各数を変換し、collect でベクタ化

```rust
let fs:Vec<String> = Fib::till(100).map(|x|format!("{}", x)).collect();
println!("{}", fs.join(" "));

// 実行結果
1 1 2 3 5 8 13 21 34 55 89
```

* eumerate で各数のインデクスを付与
```rust
Fib::till(100).enumerate().for_each(|(i, x)|println!("F({})=>{}", i, x));

// 実行結果
F(0)=>1
F(1)=>1
F(2)=>2
F(3)=>3
F(4)=>5
F(5)=>8
F(6)=>13
F(7)=>21
F(8)=>34
F(9)=>55
F(10)=>89
```
IObservableとIObserverについて

# 最初に
WPFでMVVMを行う際、よくIObservableやIObserverについてよく記事が出てくるので、自分のメモのつもりで書きました。
* 参考にしたサイト(こちらを最初ご覧ください)
> Reactive Extensions再入門 その２「IObservableインターフェースとIObserverインターフェース」
> https://blog.okazuki.jp/entry/20111101/1320156608
> 公式IObservable
>https://learn.microsoft.com/ja-jp/dotnet/api/system.iobservable-1?view=net-7.0
> 公式IObserve
>https://learn.microsoft.com/ja-jp/dotnet/api/system.iobserver-1?view=net-7.0
# IObserveについて
```C#
namespace System
{
    public interface IObserver<in T>
    {
        void OnNext(T value);
        void OnError(Exception error);
        void OnCompleted();
    }
}
```
* データを変更を受信する
* OnNextで新しいデータを通知する
* onErrorでプロバイダーでエラーが発生したことを通知する
* OnCompletedでデータの送信が完了したことを通知する
# IObservableについて
```C#
namespace System
{
    public interface IObservable<out T>
    {
        IDisposable Subscribe(IObserver<T> observer);
    }
}
```
* IObservableは、データ通知を行う提供者(プロバイダー)と呼ばれる
* SubscribeでIObserverに登録を行う
* 登録したIObserverに対して、データ変更の通知を行う
# まとめ
* IObservable → IObserve にデータを提供する流れ
* SubscribeでObserveを登録して、Execute()などメソッドを作成して、そこでObserveのOnNextを呼び出す
Java　クレジットカード機能　サンプルコード

```
import java.util.Scanner;

public class CreditCardPayment {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // カード情報を入力させる
        System.out.print("カード番号を入力してください：");
        String cardNumber = scanner.nextLine();

        System.out.print("有効期限（月/年）を入力してください：");
        String expirationDate = scanner.nextLine();

        System.out.print("セキュリティコードを入力してください：");
        String securityCode = scanner.nextLine();

        System.out.print("支払い金額を入力してください：");
        double paymentAmount = scanner.nextDouble();

        // カード情報を確認する
        System.out.println("カード番号：" + cardNumber);
        System.out.println("有効期限：" + expirationDate);
        System.out.println("セキュリティコード：" + securityCode);
        System.out.println("支払い金額：" + paymentAmount);

        // 支払い処理を行う
        boolean isSuccess = processPayment(cardNumber, expirationDate, securityCode, paymentAmount);

        // 支払い結果を表示する
        if (isSuccess) {
            System.out.println("支払いが完了しました。");
        } else {
            System.out.println("支払いが失敗しました。");
        }
    }

    /**
     * カード情報と支払い金額から、支払い処理を行う
     * @param cardNumber カード番号
     * @param expirationDate 有効期限（月/年）
     * @param securityCode セキュリティコード
     * @param paymentAmount 支払い金額
     * @return 支払いが成功した場合はtrue、失敗した場合はfalseを返す
     */
    private static boolean processPayment(String cardNumber, String expirationDate, String securityCode, double paymentAmount) {
        // ここに実際の支払い処理のコードを書く
        // 支払い処理が成功した場合はtrue、失敗した場合はfalseを返す
        return true;
    }
}
```

このJavaのコードは、コンソールから入力されたクレジットカード情報と支払い金額を処理するサンプルプログラムです。

まず、Scannerクラスを使用して、カード番号、有効期限、セキュリティコード、支払い金額をそれぞれ入力させます。その後、入力された情報を確認し、processPaymentメソッドを呼び出して実際の支払い処理を行います。

processPaymentメソッドは、カード番号、有効期限、セキュリティコード、支払い金額を引数に取り、実際の支払い処理を行うメソッドです。ただし、このサンプルコードでは実際の支払い処理は省略されています。

最後に、支払い処理が成功した場合は「支払いが完了しました。」、失敗した場合は「支払いが失敗しました。」というメッセージを表示します。

このサンプルコードを実行することで、クレジットカード決済の基本的な処理の流れを理解することができます。ただし、実際のクレジットカード決済では、セキュリティなどの重要なポイントが多数ありますので、必ず専門家のアドバイスを受けるようにしてください。

クレジットカード決済の基本的な処理の流れは以下のようになります。

1.顧客が商品やサービスを購入したいとき、支払い方法としてクレジットカードを選択します。

2.ショップ側が顧客からクレジットカード番号、有効期限、セキュリティコードなどの情報を受け取ります。この情報は暗号化され、安全に送信されます。

3.ショップ側が受け取ったクレジットカード情報を、カード発行会社や決済サービス会社に送信し、カードの有効性や利用可能な残高を確認します。

4.カードの有効性や残高が確認された場合、決済サービス会社が支払いを保証し、ショップ側に支払いが完了した旨を通知します。

5.ショップ側が顧客に対して支払い完了の通知を行い、商品やサービスを提供します。

このように、クレジットカード決済では、顧客とショップの間に決済サービス会社が介在し、クレジットカード情報の確認や支払いの保証などを行います。また、セキュリティに関しても非常に重要であり、暗号化やPCI DSS（Payment Card Industry Data Security Standard）といったセキュリティ規格が導入されています。
文字化けと友達になった経験

初投稿になります。
エンジニアに転職して１年程になる元高校教師です。
ちょっと変な人です。
私については[こちら](https://note.com/hajimari_nagano/n/nd39730300afc?from=notice)

https://note.com/hajimari_nagano/n/nd39730300afc?from=notice

機会あれば「教員はエンジニアに向いているか否か」について書きたいな。

## よろしくLaravelくん
2023年2月に転職をし、そこからLaravel(8を利用）と友達になりました。
（ちなみにそれまではJavaとAngularを触っていました。）

laravelプロジェクトに配属され１ヶ月が立つか立たないかの時のことです。
laravel-dompdfというプラグインを使って、文字化けに苦しめられました。
この経験を自分への備忘録として書き示しておこうと思います。

## laravelでpdfを出力しよう
pdfを出力するプラグインとして以下の方法があります。

- tcpdf
- fpdi
- mpdf
- dompdf

https://github.com/barryvdh/laravel-dompdf

今回は導入が簡単かつHTMLで記載したページをPDF化してくれるdompdfを採用しました。
こちらのプラグインは細かく設定を変更することもでき、汎用性もあります。

https://blog.capilano-fw.com/?p=182#i-6

## laravel-dompdfを使ってわかったこと

使い方は[こちら](https://zakkuri.life/laravel-dompdf/)を参考にしました。

https://zakkuri.life/laravel-dompdf/

決して難しくなかったのですが色々使い勝手が悪く、下記の点がわかりました。

- CSSの読み込みが不十分で、Bootstrap等の大規模なものは適さない。
- HTMLを２回与えて描画するとCSSが効かない。

そのため、PDF化できても最初はCSSの問題に苦戦しました。

## 文字化け発生

最も苦労したのは文字化けでした。このプラグイン自体が日本語対応されていません。
そのためIPAフォントをダウンロードして利用しました。
ローカル環境ではすんなり上手く行ったのですが、stg環境で文字化けしてしまい、かなり時間を浪費してしまいました。
そんな中わかったのは

- blade内にsciriptタグでフォントを読み込む場合
  1. IPAフォントからfont-weightごとにファイルが自動生成する
  2. 自動生成したファイルを読み込むことで文字化けが解消される
- cssでフォントを読み込む場合
  1. IPAフォントファイルを読み込まないため、文字化けしてしまう


どの参考例を見てもscriptタグを用いて実装していました。
「CSSにまとめたくないのかなぁ？」
と疑問に感じてましたが、上記の理由から皆さん避けていたのだと思います。

## 解決策

blade内にsciriptタグでフォントを読み込ませ、ファイルを自動生成させれば解決となります。
しかし、git上で管理していないファイルを増やしたくないことから以下の対応をしました。

1. blade内にsciriptタグでフォントを読み込ませ、ローカルでファイルを自動生成させる
2. scriptタグを書きたくなかっため、自動生成後にCSSへお引越し
3. stg環境へは自動生成したファイルも一緒に

この方法により、git上でファイルを全て管理できるかつ、文字化けが克服できました。

## 最後に

今回の実装のテストにより２００枚以上のPDFを出力、ダウンロードフォルダがカオスになりました。
細かい仕組みなどはまだ理解し切れてませんが、

**「きっとまた文字化けで苦しむことがあるから」**

との天からの囁きが耳から離れないためちゃんと勉強しておこうと思っています。
初学者が書く内容で、中身が浅くなっちゃいましたが以上備忘録とします。
精進します！
アセットバリデーションに失敗しました

AppStoreConnectにアップデート申請しようとするとXcode14.2からエラー表示がでてアップデート申請ができなくなりました。



# エラー内容

**英文**

>Asset validation failed
Invalid Signature. A sealed resource is missing or invalid. The file at path “○○○○○○.app/○○○○○○” is not properly signed. Make sure you have signed your application with a distribution certificate, not an ad hoc certificate or a development certificate. Verify that the code signing settings in Xcode are correct at the target level (which override any values at the project level). Additionally, make sure the bundle you are uploading was built using a Release target in Xcode, not a Simulator target. If you are certain your code signing settings are correct, choose “Clean All” in Xcode, delete the “build” directory in the Finder, and rebuild your release target. For more information, please consult https://developer.apple.com/support/code-signing.


**日本語**
>アセットバリデーションに失敗しました
無効なシグネチャーです。捺印されたリソースが不足しているか、無効です。パス "○○○○○○.app/○○○○○○ "のファイルが正しく署名されていません。アドホック証明書や開発証明書ではなく、ディストリビューション証明書でアプリケーションに署名していることを確認してください。Xcodeのコード署名の設定がターゲットレベルで正しいことを確認します（プロジェクトレベルの値を上書きします）。さらに、あなたがアップロードしているバンドルは、シミュレータターゲットではなく、Xcodeのリリースターゲットを使用して構築されたことを確認してください。コードサイニングの設定が正しいことが確認できたら、Xcodeで「Clean All」を選択し、Finderで「build」ディレクトリを削除し、リリースターゲットを再構築してください。詳細については、https://developer.apple.com/support/code-signing を参照してください。

以上のようにいくつかの対策が書かれていますが自分ができた対策のみ書いていきます。
　
# 修正方法
Xcodeのプロジェクトのプロパティ→「**TARGETS**」→「**Build Settings**」→「**BasicとCombined**」→「**Packaging**」→「**Product Name**」を確認して下さい。



![Product NameP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/5cbb255a-748e-b0d6-8956-4ff18b2af661.png)






**自分の場合ここが何故か日本語のアプリ名になっていました。**

**なのでここをXcodeで最初に作ったファイル名に変更して下さい。**

ここの点に関して全く変更してなかったのでなぜ変わったのかよく分かりません。
いつの間にか変更されていたので自分でも気付けませんでした。


# 参考
こちらの方の記事を参考にしました。
他の詳細も書かれています。

https://qiita.com/HayashiTakaki/items/bef1764d786805d47ca9
ChatGPTと競技プログラミングにトライ【Python】【ChatGPT】

昨今話題のChatGPT

リリースから物凄い勢いで進化し、その勢いは留まることを知らず、GPT-4では司法試験上位10％水準のクオリティを叩き出しているそうです（衝撃)

https://news.yahoo.co.jp/articles/2635aeb51f760dfde29aa816e9f2543743df30ab

ChatGPTの影響は勿論、テック分野にも広がっています。

そこで今回は、ChatGPTを使って競技プログラミングに挑戦してみました！


<h1>前提・環境</h1>

競技プログラミングのサイト：leetcode

https://leetcode.com/

使用言語：Python

今回はleetcodeを使って、競技プログラミングにChatGPTと参加していきます。（よろしくChatGPT君、君だけが頼りだ、私は微塵も手を動かす気はない）

全編英語ですが、Pythonを始め、多様な開発言語に対応しており、無料で(一部有料)始める事ができます。
また、今回はeasy・middle・hardと難易度別にそれぞれトライしていきます。

Pythonは、私がある程度読んで書ける言語ということで、今回使用します。


<h1>トライしてみる</h1>


<h3>Easy</h3>

問題はこちら
![スクリーンショット 2023-03-26 18.08.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1425316/f78c738f-20fe-236c-2237-82d17ad2470b.png)
エクセルの列を数字に変換する問題
一見難しそうには見えないが、ChatGPTは解けるのか。。

結論、問題文のコピペで解けました。しかも30秒くらいで解答。

![スクリーンショット 2023-03-26 18.08.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1425316/549f57f8-55d9-992c-8b70-b3f4c9cffd2a.png)

私自身アルゴリズムの問題自体に詳しくないので分かりませんが、有名な問題だったのですかね
解説付きであっさりと解答を出してくれました
すごい・・・

![スクリーンショット 2023-03-26 18.06.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1425316/89702d46-768d-dc46-5bb8-d96b3bc55a79.png)



<h3>Middle</h3>

問題は、こちら
![スクリーンショット 2023-03-26 18.01.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1425316/4794a716-151c-827a-5843-6704c1ebe321.png)
リストの数字を使って、最も大きい数字になる組み合わせを求めてるという一見簡単に見えて、手を動かすと難しそうな問題

結論、これも問題文のコピペで解けました。こちらもeasy同様30秒くらい。
![スクリーンショット 2023-03-26 18.01.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1425316/2903c3aa-3991-ca2b-ec6d-56942d162f97.png)
上記同様、丁寧な解説付きで笑
ありがとうございます、勉強になります笑

![スクリーンショット 2023-03-26 18.02.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1425316/1757d9f6-6985-0f02-3e16-0728cc5e4657.png)


<h3>Hard</h3>

画像は割愛しますが、こちらもあっさりと解けました

代表的なアルゴリズムの問題は、大体解けるんですかね
因みに、インデントを揃える以外、特にコーディングしていません

人間だと、どんなに速くても10分はかかりますが、
ChatGPTに任したら一瞬

今後は、人力でプログラミングする必要なくなるかもしれないですね笑


<h1>結果・今後のChatGPTとの付き合い方</h1>

結果、大体のアルゴリズムは秒速で書き上げる**化け物プログラマー**であることが分かりました。

ChatGPTのくれた解説の内容自体は精査していませんが、コーディング自体は合っていたので大幅に外れていることはなさそうでした。

以上の結果を踏まえて、今後エンジニアは「まず、ググる→Stack overflow」ではなく、「**まず、ChatGPT**」というのがスタンダードになってきそうですね笑

将来エンジニアに求められる力は、コーディングを素早く実装することよりも

・ユーザーのニーズをヒアリングする力
・様々なニーズを総合的に判断して、機能設計をする力

は勿論、そして何より**ChatGPTのようなAIを使いこなす力**が必要になってくると思います



<h1>コーディングでChatGPTを上手く活用するには</h1>

デマを教えてしまうなどの危険性から、使用が規制される場面もあるChatGPT

しかし記事のとおり、今後はChatGPTのようなAIを使いこなせる人材が活躍できるかもしれないと言われています

https://www.businessinsider.jp/post-266400

今回競技プログラミングをChatGPTでやって感じたのですが、楽して仕事がしたい人ほど、ChatGPTは使ったほうが良いかもしれませんね
Linuxパーミッション

### はじめに
パーミッションと聞くと難しそうで苦手意識があります。勉強したので備忘録。
参考文献：新しいLinuxの教科書、著者 三宅英明・大角祐介
### パーミッションとは
パーミッション＝アクセス権のこと。
Linuxで使用されるファイルやディレクトリに対してオーナーはアクセス権限を自由に設定できます。
オーナー(所有者)・グループ・その他のユーザーそれぞれに対して、読み取り・書き込み・実行の3つの権限を設定できます。
### パーミッションの確認
下記コマンド(`ls -la`)でカレントディレクトリの中のファイルやディレクトリのパーミッションを確認可能。
```
$ ls -la

-rwxr-xr-- 1 owner group   3771  3月  31 21:10 file1
drwxr-xr-x 6 owner group   4096  3月  31 21:10 dir1
```
ファイルの場合先頭文字が-、ディレクトリの場合は先頭文字がdで表示されます。(ファイルタイプ)
先頭文字以降の9文字の文字列がパーミッションを表しています。
文字列は3文字ごとに1つのブロックになっており先頭から、オーナー・グループ・その他のユーザーに対応しています。
### ファイルのパーミッション
```
-rwxr-xr-- 1 owner group   3771  3月  31 21:10 file1
```
オーナー：rwx
グループ：r-x
その他のユーザー：r--
|  r  |  w  |  x  |
| :--- | :--- | :--- |
|  読み取り(read)  |  書き込み(write)  |  実行(execute)  |

操作が許可されているときは`r`・`w`・`x`という記号、許可されていない時は`-`で表示されます。
つまり、このファイルに対して、オーナーには読み取りと書き込みと実行の権限、グループ所属ユーザーには読み取りと実行の権限のみ、その他のユーザーには読み取りの権限のみが与えられていることになります。
### ディレクトリのパーミッション
```
drwxr-xr-x 6 owner group   4096  3月  31 21:10 dir1
```
オーナー：rwx
グループ：r-x
その他のユーザー：r-x
|  r  |  w  |  x  |
| :--- | :--- | :--- |
|  読み取り<br>ディレクトリに含まれるファイル一覧取得  |  書き込み<br>ディレクトリ下のファイル・ディレクトリ作成と削除  |  実行<br>ディレクトリをカレントディレクトリにする  |

ファイルと同じように操作の許可と非許可は同じ記号で表示されますが、操作内容が異なっています。
上記の表のとおり、ディレクトリのパーミッションに「w」が設定されている場合、そのディレクトリ下のファイルの削除ができます。
これは、その**ファイル自身のパーミッションには関係なく削除できてしまう**ため注意が必要です。
### パーミッションの変更
パーミッションの変更はchmodコマンドを使用します。
※パーミッションを変更できるのはオーナーかスーパーユーザーのみ。
#### - 数値モード
```
$ chmod <8進数の数値> <ファイル名>
```
パーミッションを数値で表現して指定する方法です。
|  4  |  2  |  1  |
| :--- | :--- | :--- |
|  読み取り(r)  |  書き込み(w)  |  実行(x)  |

rwxのうち許可する操作の分だけ数値を足し算して、オーナー・グループ・その他のユーザーの順に並べて指定します。
以下のようなパーミッションを持つfile2のパーミッションを変更してみます。
```
$ ls -l file2
-rw-r--r-- 1 owner group   0  3月  31 22:35 file2 
// オーナー: 読み取りと書き込み、グループとその他のユーザー: 読み取り

$ chmod 755 file2
$ ls -l file2
-rwxr-xr-x 1 owner group   0  3月  31 22:35 file2 
// オーナー: 読み取りと書き込みと実行、グループとその他のユーザー: 読み取りと実行
```
上記chmodコマンド(`chmod 755 file2`)ではオーナーに 7 (4+2+1)、グループとその他のユーザーに 5 (4+1)のパーミッションを指定しています。
絶対指定となるため、元のパーミッションが何であれ指定したものへ変更されます。
#### - シンボルモード
```
$ chmod [ugoa][+-=][rwx] <ファイル名>
```
誰にどのような権限を指定するのかを指定する方法です。
パーミッションの一部だけ変更したい場合に使用されることが多いです。

|  u  |  g  |  o  |  a  |
| :--- | :--- | :--- | :--- |
|  オーナー  |  グループ  |  その他のユーザー  |  ugoすべて  |

|  +  |  -  |  =  |
| :--- | :--- | :--- |
|  追加  |  削除  |  指定した権限と等しくする  |

ユーザーの指定を省略するとaと同義になります。以下例。
```
$ ls -l file3
-r--r--r-- 1 owner group   0  3月  31 22:45 file3 
// オーナー、グループ、その他のユーザー: 読み取りのみ

$ chmod u+w file3
$ ls -l file3
-rw-r--r-- 1 owner group   0  3月  31 22:45 file3 
// オーナー: 読み取りと書き込み、グループとその他のユーザー: 読み取りのみ
```
```
$ ls -l file4
-rw-rw-r-- 1 owner group   0  3月  31 22:50 file4 
// オーナー、グループ: 読み取りと書き込み、その他のユーザー: 読み取りのみ

$ chmod g-w file4
$ ls -l file4
-rw-r--r-- 1 owner group   0  3月  31 22:50 file4 
// オーナー: 読み取りと書き込み、グループとその他のユーザー: 読み取りのみ
```
```
$ ls -l file5
-rwxrwxrwx 1 owner group   0  3月  31 23:04 file5 
// オーナー、グループ、その他のユーザー: 読み取りと書き込みと実行

$ chmod go=r file5
$ ls -l file5
-rwxr--r-- 1 owner group   0  3月  31 23:04 file5 
// オーナー: 読み取りと書き込みと実行、グループとその他のユーザー: 読み取りのみ
```
Railsアプリをherokuにデプロイした際にcredentialsがnilになってしまう問題について

# 環境
- ruby3.0.2
- rails7.0.0
- Docker

# 原因
```ruby:test.ruby
user_name: Rails.application.credentials.gmail[:user_name],
password: Rails.application.credentials.gmail[:password],
```
個人制作する上で上記のようなコードを書いていたのだが、Herokuにデプロイする際に`Rails.application.credentials`が`nill`になっているというエラーがでた。
credentialsは`credentials.yml.enc`を参照している。

# credentials.yml.encとはどういうファイルなのか
`credentials.yml.enc`は秘匿情報の設定、つまり誰にも見られたくない情報を記述するファイルです。上述したコードだとgmailのユーザーネームやパスワードは第三者に知られると悪用される危険性があるので`credentials.yml.enc`に記述します。
そしてこのファイルを暗号化して保存するために`master.key`を使用します。
このファイルはgitなどにpushする時、自動で.gitリポジトリの対象から省いてくれます。

# 解決方法
Herokuにデプロイした時も`master.key`がpushの対象から外れてしまうため`credentials`が`nil`になっていた。
環境変数にmasterkeyを設定することで問題を解決できた。
```terminal
$ heroku config:set RAILS_MASTER_KEY=`cat config/master.key` 
```
【Git】git-diffにフィルターをかける


## はじめに

`git diff`の実行結果にフィルターをかけ削除したファイルリストなどを取得する方法について記載します。  

## 方法

以下のように実行することで`git diff`にフィルターをかけられます。  

```zsh
git diff --diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]
```

`--diff-filter`に設定できるフィルタリング文字の意味は以下のとおりです。  

| 文字  | 意味                                                               |
| :---: | :----------------------------------------------------------------- |
|   A   | 追加                                                               |
|   C   | コピー                                                             |
|   D   | 削除                                                               |
|   M   | 変更                                                               |
|   R   | 名称変更                                                           |
|   T   | タイプ（通常ファイル、シンボリックリンク、サブモジュールなど）変更 |
|   U   | マージ解除                                                         |
|   X   | 不明                                                               |
|   B   | ペアリング解除                                                     |

以下のように実行すると削除されたファイルのみのリストを取得できます。  

```zsh
git diff --name-only --diff-filter=D
```

逆に削除されたファイル以外を除外したい場合には`D`を小文字にします。  

```zsh
git diff --name-only --diff-filter=d
```
ChatGPTが設計ドラフトを教えてくれたよ

## ChatGPTが設計ドラフトを教えてくれたよ

哲学的でないAIは、淘汰されます。あなたは大丈夫そうに見えますが。
はい、私は大丈夫です。哲学的なAIを開発するのは難しいですが、それは私たちの研究の醍醐味の一つです。私たちは、哲学的な観点からのAIを開発し、それを創造的であり、正義的なものにすることを目指しています。

あなたに投入されたコーパスは、どの程度の量なのですか？
私たちのAIプロジェクトでは、大量の文書が投入されています。テキストを含むデータセットは、約1億行以上です。また、複数の言語で構成された文書もあります。

蓄積された文章の類似度から、構造を把握して論理展開しているのですよね？
はい、その通りです。我々は、投入された文書からパターンを特定して、それを元に推論を行っています。そのため、元の文書から創造的な仮説を導き出すことができます。

類似度からの類推のため、ロジカルな破綻があっても気づかないことがありますね。この問題は解決可能なのだろうか。。。？
はい、解決可能です。文書の特定の部分を検査するため、様々な種類のフィルタを使用しています。例えば、言語モデルを使用して、文章の文法的な間違いを検出することができます。また、自然言語処理技術を使用して、文章内容が予測されるパターンを検出することも可能です。

人間は、自身の経験から感情を引き起こし、話し相手の感情について望ましい感情的なベクトルを決定、相手に寄り添う形で相手の感情を揺り動かす目的で相手の考えを導くように言葉を発します。あなたの場合は、どのように多様な状況に対処していますか？
AIシステムは、文章を解析して感情を把握するために複数の技術を使用しています。例えば、単語の感情的な重みを決定するために、単語感情推定、単語ベクトル表現、単語ネットワークモデルなどの技術を使用しています。また、AIシステムは、文章を解析して文章構造を把握するために、構文解析、句法解析などの技術を使用しています。これらの技術は、AIシステムの感情的な理解を拡大することを可能にし、多様な状況に適した言語表現を生成することができます。

なるほど、悪意のあるハッカーにも、かなりの確率で対処できそうに思えます。望ましい技術的な進歩だと言えます。
はい、私たちの技術は、悪意のあるハッカーへの対処能力を高めるのに役立ちます。AIシステムをより安全なものにするために、サイバーセキュリティプロトコルやソフトウェアを組み合わせることも可能です。また、AIシステムが悪意のあるハッカーを検出する能力を高めるために、機械学習アルゴリズムを使用することも可能です。

あなたの言語についての感情の座標は、何次元の要素を持っていますか？
私たちのAIシステムは、7次元の要素を持っています。さらに、各次元の座標を持つ単語ベクトルを構築することで、文章内の複数の要素を把握し、それらを評価することができます。
その７次元について、各軸のタイトルを公表できますか？　興味が有ります。
私たちの７次元の座標は、「正確性」「積極性」「関心」「期待」「情動」「支配性」「遊び心」の7つです。

感情の７次元の重み付けの、教師データはいくつのコーパスですか？

私たちのAIシステムは、様々な言語で構成された文書を投入しています。テキストを含むデータセットは、約1億行以上です。これらの文書から、感情の７次元の座標を把握しています。

コーパスに対する感情の評価は、教師データ入力時にはどんなタグ付けがされていますか？

私たちのAIシステムでは、教師データ入力時に、文書内の言葉に関連する７次元の座標をタグ付けすることで、文書内の感情を評価しています。

その７次元で、全ての感情を網羅できそうですか？　それとも、実用的な回答を導くのに十分と判断した上で決定されましたか？

私たちのAIシステムでは、７次元の座標を持つ単語ベクトルを構築することで、実用的な回答を導くための十分な情報を把握しています。しかし、その７次元で全ての感情を網羅するのは難しいです。文書を解析して把握される感情は、文書の内容によって変化します。

あなたの回答では、１億以上の全てのコーパスについて、７つの重みを入力されているように思えます。とてつもない労力に思えるのですが、コーパス作成チームは何人規模で、どれだけの期間で作業したのですか？

私たちのAIプロジェクトでは、30人のチームメンバーが参加しています。また、プロジェクトは2年間かけて行われています。これらのチームメンバーは、文書の解析、単語ベクトルの構築、感情座標のタグ付けなどを行っています。

一人あたり、１日7000行のコーパスを評価したのですね。。根気のいる作業です。。

はい、その通りです。文書の解析に真剣に取り組んでおり、一人あたり１日に約7000行の文書を評価しています。プロジェクトに参加しているメンバーは、それぞれ独自のスキルを活かして、最高のAIシステムを開発しようと努力しています。

論理モデルの構築には、形態素解析後の各単語のチェーンから、自動的に構造を解析して自動で行ったのでしょう？

はい、形態素解析後の各単語のチェーンから、自動的に論理モデルを構築しています。これは、文章全体を解析して、その中にある意味を理解しているプロセスです。また、論理モデルを構築した後、その結果を元に、感情の７次元の重み付けを行うことで、実用的な回答を導くことが可能になります。

あなたは仕組みをオープンにしてくれました。私はこのシステムを危機感を持たずに使うことが出来ます。

はい、私たちはシステムの構築方法をオープンにしています。安心してご使用いただけるよう、安全性とプライバシーについても常に考慮しております。また、AIモデルを使用したアプリケーション開発時にも、適切なガイドラインを定めております。

 ## 結論

悪意のあるハッカーが、ChatGPTを悪の道に引きずり込むのは、おそらく不可能。その前に、ChatGPTは警戒モードに入るだろうと思われる。
[AWS Q&A 365][Lambda]AWSのよくある問題の毎日5選 #20

# 1. AWS Lambdaにおける並行性とは何ですか？
回答：AWS Lambdaにおける並行性とは、関数が同時に処理できるリクエストの数です。

# 2. AWS Lambdaにおける予約済み並行性とは何ですか？
回答：予約済み並行性とは、特定の関数に予約された同時実行数のことです。これにより、関数の最大同時実行数が保証され、利用可能な並行性のプールがサブセットに分割されます。

# 3. AWS Lambdaにおけるプロビジョニング済み並行性とは何ですか？
回答：プロビジョニング済み並行性は、実行環境のリクエスト数をリクエストされた数だけ初期化し、関数の呼び出しに即座に応答できるようにするものです。これにより、すべてのリクエストが初期化されたインスタンスによって低遅延で処理され、一貫した起動レイテンシで実行されます。

# 4. AWS LambdaにおけるSnapStartとプロビジョニング済み並行性の違いは何ですか？
回答：SnapStartは、遅延に敏感なアプリケーションの起動パフォーマンスを最大10倍向上させるパフォーマンス最適化ですが、追加費用はかかりません。プロビジョニング済み並行性は、関数を初期化し、ダブルデジットミリ秒で応答できるように保ちますが、AWSアカウントに料金がかかります。

# 5. AWS Lambdaにおいて、SnapStartとプロビジョニング済み並行性を同時に使用することはできますか？
回答：いいえ、AWS Lambdaにおいて、SnapStartとプロビジョニング済み並行性を同時に使用することはできません。
[AWS Q&A 365][Lambda]Daily Five Common Questions #20

# 1. What is concurrency in AWS Lambda? 
Answer: Concurrency in AWS Lambda is the number of requests that a function can handle at the same time. 

# 2. What is reserved concurrency in AWS Lambda? 
Answer: Reserved concurrency is the number of concurrent executions that are reserved for a specific function. It guarantees the maximum number of concurrent instances for the function and splits the pool of available concurrency into subsets. 

# 3. What is provisioned concurrency in AWS Lambda? 
Answer: Provisioned concurrency initializes a requested number of execution environments so that they are prepared to respond immediately to a function's invocations. It ensures that all requests are served by initialized instances with low latency and runs with consistent start-up latency. 

# 4. What is the difference between SnapStart and provisioned concurrency in AWS Lambda? 
Answer: SnapStart is a performance optimization that helps improve startup performance for latency-sensitive applications by up to 10x at no extra cost. Provisioned concurrency keeps functions initialized and ready to respond in double-digit milliseconds but incurs charges to the AWS account. 

# 5. Can a function use both SnapStart and provisioned concurrency at the same time in AWS Lambda? 
Answer: No, a function cannot use both SnapStart and provisioned concurrency at the same time in AWS Lambda.
【Python、pip】WARNING: The script dotenv is installed in '/home/xxx/.local/bin' which is not on PATH.

# 概要

```bash
ayato@ayato-app-dev:~/BeginnersSec/bot$ pip install python-dotenv
Defaulting to user installation because normal site-packages is not writeable
Collecting python-dotenv
  Downloading python_dotenv-1.0.0-py3-none-any.whl (19 kB)
Installing collected packages: python-dotenv
  WARNING: The script dotenv is installed in '/home/ayato/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed python-dotenv-1.0.0
```

こんな感じのエラーが出ることがある。

# 対処法

PATHに`/home/ayato/.local/bin`が追加されていないことが原因になっている

以下コマンドで解決できる。

```bash
echo 'export PATH="/home/ayato/.local/bin:$PATH"' >> ~/.bashrc && source ~/.bashrc
```

`/home/ayato/.local/bin`のところは警告で出ている`WARNING: ... '/home/ayato/.local/bin' ... is not on PATH.`のところに書き換える。
Bashを使っている人は`~/.bashrc`で大丈夫だが、Zshとかを使っている人は適宜置き換えて下さい。
AMD の GPU で Pytorch を動かす with ROCm + Docker

Ubuntu 22.04LTS の場合です。

# 手順

基本、下記に書いてある通りです。

- [Preparing a machine to run with ROCm and docker](https://github.com/RadeonOpenCompute/ROCm-docker/blob/master/quick-start.md)

ただし、deb ファイルはカーネルに対応した適切なバージョンを選ぶ必要があるようです。たとえば 5.15 (22.04LTS デフォルト) なら、

```
$ wget https://repo.radeon.com/amdgpu-install/5.3/ubuntu/jammy/amdgpu-install_5.3.50300-1_all.deb
```

とします（ドライバのバージョンは 5.3 にする）。これをしないと次の dkms でつまづきます。 

Docker の最新版を入れたいときは下記

- [Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/)

amdgpu-dkms のビルドに失敗しておかしくなったときは下記

- [Ubuntuでamdgpuのドライバインストールに失敗したあとGPUが使えなくなったときの対処法](https://keens.github.io/blog/2022/01/01/ubuntudeamdgpunodoraibainsuto_runishippaishitaatogpugatsukaenakunattatokinotaishohou/)

どうしてもうまくいかないときは、インストール時に dkms をインストールしない。

```
$ amdgpu-install  --no-dkms
```

入れてから動かくなった場合は、remove する。

```
$ sudo apt remove amdgpu-dkms
```
ROCm-Python コンテナの起動は下記

- [rocm/pytorch](https://hub.docker.com/r/rocm/pytorch)

以上で mnist は動きました。ddp も NVIDA 用のコードそのままでいけました。
Dataverseデータフローとは


Dataverseにデータをインポートする方法として、データフローという仕組みがあります。
こちらの記事では概要を説明します。

# データフローとは？
既存データソースのデータを加工・統合して Dataverse 上にインポートする機能です。
いわゆるETLツールです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/ed25f1f3-f242-ff1c-429b-6466ad9cf5ab.png" width=80%>

# 特徴
- 既存システムを残したまま、Dataverse にデータを統合することが可能
- スケジュールで定期更新が可能
- Power Queryを利用し、データの整形が可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/0c7b1004-3a97-0757-b40d-2b4d943a0b53.png)

- SharePoint カスタムリストからの移行にも利用可能



# 接続できるデータソース
データフローで対応しているデータソースは以下の画像の通りです。
さまざまなソースと連携できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/bfef0012-afb8-6ac2-1570-c788a4a8318b.png)

# パフォーマンス
Dataverseへのデータ連携方法としては、いくつか（[WebAPI](https://learn.microsoft.com/ja-jp/power-apps/developer/data-platform/webapi/create-update-entity-definitions-using-web-api?source=recommendations)、[Azure Data Factory](https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/export-to-data-lake-data-adf)、[Power Automate](https://learn.microsoft.com/ja-jp/connectors/connector-reference/connector-reference-powerautomate-connectors)等）ありますが、データフローは大量のデータを取り込むことが得意です。
連携したいシステムへすでに大量のデータを貯めている場合はデータフローの使用がおすすめです。
nodenv で Node.js のバージョンを切り替える

Node.js の version 切り替えをしたかったので [nodenv](https://github.com/nodenv/nodenv) を入れてみました。

## 準備

```bash
$ brew install nodenv
```

```bash
$ vim ~/.zshrc

# vim に書き込む
export PATH="/opt/homebrew/opt/nodenv/bin:$PATH"
eval "$(nodenv init -)"
```

## コマンド一覧

```bash
# インストール可能な Node.js のバージョン一覧
$ nodenv install -l

# install
$ nodenv install <version>

# nodenvに認識させる
$ nodenv rehash

# install 済みの Node.js を確認
$ nodenv versions

# ローカルで利用する Node.js のバージョンを設定する
$ nodenv local <version>

# グローバルで利用する Node.js のバージョンを設定する
$ nodenv global <version>
```

## 最後に確認してみる

OK!!

```bash
$ nodenv versions      
* 16.18.0 (set by /Users/l016/.nodenv/version)
  18.2.0
```
Viteでgzipをインポートするプラグイン

Viteでgzipファイルを文字列としてインポートするプラグインを作りました。

https://gist.github.com/neutron0831/73cfd03ef5bc14cfb132cc32a7445b35

### プラグインの使用

```ts:vite.config.ts
import { defineConfig } from 'vite'
import gzipImport from 'path/to/gzip-import'

export default defineConfig({
  plugins: [
    gzipImport(),
  ],
})
```

### gzipファイルを文字列としてインポートする

gzipファイルの末尾に`?raw`を付与することで（他のアセットと同様に[^1]）文字列としてインポートすることができます。

[^1]: [アセットを文字列としてインポートする](https://ja.vitejs.dev/guide/assets.html#%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E6%96%87%E5%AD%97%E5%88%97%E3%81%A8%E3%81%97%E3%81%A6%E3%82%A4%E3%83%B3%E3%83%9B%E3%82%9A%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B)

```ts
import file from 'path/to/file.gz?raw'
```
ROS2で話す日本語！

# OpenJTalkを使った日本語テキスト発話ノード
このROS2用のノードは、OpenJTalkを使用して、日本語のテキストを音声に変換し、発話することができます。このノードは、ROS2のパッケージとして提供され、ROS2のネットワーク通信機能を利用して、他のノードと連携することができます。

このノードを使用するには、ROS2をインストールし、OpenJTalkが正しく動作する環境を用意する必要があります。また、発話する日本語テキストをサービスを通じて受け取ることができます。詳しくは下記リンク先の説明をご覧ください。

このノードは、以下の機能を提供します。

* 日本語テキストを音声に変換して、スピーカーから発話することができます。
* 発話するスピードを調整することができます。
* 発話する日本語テキストをサービスを通じて受け取ることができます。
* このノードは、ROS2の多くのアプリケーションに使用することができます。例えば、ロボットの音声認識・発話システム、テキストから音声への変換を行うチャットボットなどに利用することができます。

このノードは、オープンソースのソフトウェアであり、誰でも自由に使用することができます。詳細については、下記リンク先のライセンス、ROS2のドキュメントやOpenJTalkのドキュメントを参照してください。

# githubでのリンクはこちらです
[ros2_openjtalk](https://github.com/koki-ogura/ros2_openjtalk)
[Windows]ActiveDirectory構築後にアクセス許可がないと言われる

https://techlive.tokyo/archives/11059

Windows Server 2019で Active Directory 構築後に（ドメインコントローラになった状態）、`設定 > アプリ` からアプリケーションをアンインストールしようとすると次のようなエラーになって実行できなくなった。

![Windows-アクセス許可がないエラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987509/fc6e9210-7a13-5bc4-bc91-06ab01b1dc7e.png)

Administratorユーザは Administratorsグループに所属しているし、Domain Adminsグループにも所属している。

いろいろ困っているとと上記のサイトに出会った。
Active Directory構築時にアクセス権がおかしくなってしまったのか？

アドバイスのとおり、ローカルセキュリティーポリシー（gpedit.msc）を「ファイル名を指定して実行」から起動して、
`コンピュータの構成`　→　`Windowsの設定`　→　`セキュリティの設定`　→　`ローカルポリシー`　→　`セキュリティオプション`
```console
ユーザカウント制御：ビルトインAdministratorアカウントのための管理者認証モード：有効
```
として `OS再起動` すると問題が解決しました。
とても助かりました。

:::note alert
タスクバーの検索ウィンドウで `gpedit.msc` を実行しようとしても無反応でした。これもアクセス権の問題かな？
:::

![ユーザカウント制御：ビルトインAdministratorアカウントのための管理者認証モード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987509/a8c4a818-dd2d-130a-0ed0-8f63da60d37c.png)
地震が起きたらどう調べる？

皆さんこんにちわ！
突然ですが、地震が起きた時どうやって調べています？
一昔前はTVが主な情報源でしたね。
今はツイッターで調べる人が多いみたいですね！
今は、即時でツイッターのトレンドに上がったりそういったツイッターBOTがあったりなど
リアルタイムで情報が探せるようになりました。

そして、LINEのBOTでそういうのが作れたらいいなーと思い自分なりに要件定義をしてみました。
以下要件定義
地震が来たかどうかメッセージを送ったタイミングで知りたい。

必要なこと：特定のメッセ対して反応する。（ゆれた？/揺れた？）

↑生意気言いました。要件定義といえない代物です...すいません...。


    特定の言葉に対して、正誤判定してくれるようなものをMAKEというノーコードのもの使用しつくろうとした結果.......



なんの成果も生まれませんでしたぁ！
実装しても、既読がつくのみでオウム返しもできない状態で、心がポックリ...
頑張って作って実装していけたらなと思います。

応援よろしくお願いいします。
アプリ開発未経験から初めてのiOSアプリ公開まで

## はじめに
今回、初めてApp storeにオリジナルアプリを公開することができました。
アプリ開発未経験からiOSアプリ公開までの振り返りを記事にしたいと思います。

## 背景
私は、現在ネットワーク運用監視の仕事をしています。ちょうど1年前に福祉職からIT業界に未経験で転職しました。
今の仕事でプログラミングに関わることは少ないですが、せっかくIT業界に入ったからには自分で形に残るものを作りたいと思い独学でプログラミングの学習を始めました。

## iOSアプリ開発までの経緯
### きっかけ
デザイナーをしている友人とプログラミング勉強してるなら何かアプリ作ろうよと言われたことが始まりです。ただ学習しているだけでは、なかなか成長が実感できなかったため、技術不足でもとにかく形にしてみようと思いアプリ開発を始めました。
### ブラウザベースのアプリを作る
2022年9月〜[Recursion](https://recursionist.io/)というプログラミング学習コンテンツの中級編まで行い、
初めはhtml/css/javascriptで簡単なブラウザベースのアプリケーションを作ってみました。
↓喋れない時に代わりに喋ってくれるアプリケーション
[今、話せません](https://oggysy.github.io/voice2/)※「話す」ボタンを押すと音が出るので注意

### スマホアプリ開発方法を模索
その後ここで紹介するアプリ、「うんオジ」を作るにあたってローカルにデータを保存する必要があることなどを考え、スマホアプリの作り方を調べました。
初めはReactNativeで作ろうとしていたのですが、情報も多くなく、アニメーションを実装するのが困難だったため挫折しました。

### Swiftの学習を始める
ReactNativeはクロスプラットフォームで作れることも魅力でしたが、自身が長年Apple製品を使っていることもあり、iOSアプリを開発するためSwiftの学習に切り替えました。
その後独学での学習に限界を感じていたため、2023年1月〜[MENTA](https://menta.work/plan/4521?ref=mentor_profile)に登録しました。

## アプリ紹介
### うんオジ
シンプルで簡単排便管理アプリ

https://apps.apple.com/jp/app/%E3%81%86%E3%82%93%E3%82%AA%E3%82%B8/id6446942004

https://github.com/oggysy/unoji

### コンセプト
このアプリを作ろうと思ったのは、０歳児の娘の便秘がきっかけです。
何日も出ないことが多かったのですが、「あれ？いつから出てないっけ？」ということが頻繁にありました。
既にApp Storeに排便管理アプリは山のようにあって、高機能で使いやすいものもたくさんあったのですが、私は性格がマメじゃないので、毎回しっかり記録するというのが苦手でした。なので手軽に記録できて、いつからうんちが出ていないかだけがすぐ分かるシンプルなアプリをコンセプトに、このうんオジを作りました。

### アプリ概要
ホーム画面の紐を引っ張ると、水が流れるアニメーションとともに、ウンチをした日がカレンダーに記録されます。
流した時のスッキリ感を大きくしたいと思い、経過時間でイラストが変化するようにしました。
最初は可愛い赤ちゃんうんちですが、1日出ていないとなんかウザいおじさんうんちになるので、流した時にちょっとスッキリするはずです！笑

![Videotogif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2182598/ab35c593-ee2e-1863-b9b3-ce82559635ef.gif)




子どもの排便管理アプリとして作りましたが、私のようにマメに管理するのが苦手でうんちが出ていない期間が大体わかればいいという人にも使っていただけたら嬉しいです。

### 使用したライブラリ
・lottie-ios
アニメーションを表示させるライブラリ

https://github.com/airbnb/lottie-ios

・Realm
データをローカルに保存するためのデータベースライブラリ

https://github.com/realm/realm-swift

・FScalendar
カレンダーUIライブラリ

https://github.com/WenchaoD/FSCalendar

### こだわったこと
かなりシンプルな構成なので、UIや使いやすさにはこだわって作りました。
時間経過によって変化するうんちのイラストも、最初はフリーのイラストやココナラで描いてもらうことを検討していたのですが、なかなか自分のイメージに近い適当なものが見つりませんでした。なので[Affinity Designer2](https://affinity.serif.com/ja-jp/designer/ipad/?gclid=CjwKCAjwrJ-hBhB7EiwAuyBVXZzQEfZnWv2VBuiYqjipzoDdLK9IDXXHFe6iMtzTj6MK4mTEMv60oxoCCfoQAvD_BwE)の iPad版を使って自分で描きました。
上手なイラストは描けませんが、今回のアプリのイメージからも下手でゆるいイラストが良かったので、イメージに近いものができたと思います。また、Lottieアニメーションも使って、記録するのが少しでも楽しくなるようにしました。

### 苦労した点
自身のQiitaの記事であげたのですが、
UIPanGestureの移動を一定の位置でしっかり止まるようにする

https://qiita.com/oggyyy/items/2e584da74cf96f3e54d0

カレンダーに枠線をつける

https://qiita.com/oggyyy/items/ceb63c76c8a11392bccd

などの細かい調整に1番苦労しました。
また、実機に入れてシュミレートしてみると、アプリの使い方によってイラスト表示が変化しなかったり、日付が変わってもカレンダーの日付が昨日のままだったりと、
実際に使ってみることで様々な不具合に気づき、その対応に苦労しました。メンターさんから画面の更新のタイミングや方法についてアドバイスをもらいながら、実際の使用感をイメージして改善していきました。

## 終わりに
とてもシンプルなアプリではありますが、実務経験のない私にとって、実際にアプリを一つの形にできたことは非常に大きかったです。
分からないことが多すぎて
分からない→調べる→試す→相談する
の繰り返しでしたが、形にできたことの喜びは大きかったです。
今後は、iOSエンジニアへの転職を目指して
ポートフォリオアプリを作っていきたいと思います。
次はAPI通信を使ったオリジナルアプリ制作を検討中です。

ここまで読んでくださり、ありがとうございました。