OmniAICreator/Qiita-1.07M huggingface dataset:
ext3/ext4のジャーナリングのモード

ext3/ext4のジャーナリングには3つのモードがある。
ファイルの読み書き操作のパフォーマンスやファイル復旧時に違いが出る。
### journal
**メタデータ（iノード情報など）と実際のデータの両方**がジャーナリングの対象。
メインファイルシステムより前に、全てのデータがジャーナルに記録される。
データの整合性が高くなる反面、すべての操作がジャーナリングの対象となるため、
ディスクへの書き込み速度は遅くなる。
### ordered
**メタデータのみ**がジャーナリングの対象。（**デフォルト**）
実際のデータをディスク上に書込んだ後、メタデータをジャーナルに記録するように、
書き込み順序を保証する。メタデータが不正なデータを指すことはない。
メタデータはジャーナリングされているため、不正なシャットダウン後にもメタデータは正しく修復される。
よってほぼ、データの整合性が保たれる。
ただし、メタデータの書き込みは、実際のデータを書き込むまで待たされることになるため、ディスクへの書き込み速度はやや遅い。
### writeback
**メタデータのみ**がジャーナリングの対象。
メタデータがジャーナルに記録された後、実際のデータがディスク上に書き込まれる。
メタデータの整合性は保証されるが、クラッシュ後のリカバリでファイルの内容が以前に戻ることがある。
ディスクへの書き込みは任意のタイミングで行われるため、orderedモードに比べて高速。
多言語FizzBuzzチャレンジ19日目:Haskell

## これまでのまとめ
https://qiita.com/tenteko/private/fc52f7aec63ba5f67854

https://qiita.com/tenteko/private/ca9813f0982370d0c901

https://qiita.com/tenteko/private/bc808ba59f6993019045

https://qiita.com/tenteko/private/74aa4c422196cb5cdeac

https://qiita.com/tenteko/private/ea22bd19360333f9ca85

https://qiita.com/tenteko/private/ec2f7c2f99229a55a7aa

https://qiita.com/tenteko/private/237556777f5c5546af6e

https://qiita.com/tenteko/private/264e4aca8a2ee6761a6c

https://qiita.com/tenteko/private/6e86fa0eeed9d24805ab

https://qiita.com/tenteko/private/f32baaf43fe0217b7fc7

https://qiita.com/tenteko/private/b44e1e5bfc91f6f3a52f

https://qiita.com/tenteko/private/333b9697c03561fb6158

https://qiita.com/tenteko/private/667f5f69eda60f221912

https://qiita.com/tenteko/private/eff296000ecbc7b43f07

https://qiita.com/tenteko/private/f5ea89c185b14a5952f3

https://qiita.com/tenteko/private/64a5814d35f73972bde9

https://qiita.com/tenteko/private/7981389372c7f6bdc073

https://qiita.com/tenteko/private/f6814b2e192e23298da8

## 本日のお品書き
今回が個人的に一番キツかったです…。Haskell。
公式のチュートリアルがとても充実していてありがたいのですが、FizzBuzzしようと思うと、どうやって標準出力に出すんや？みたいなところで躓きました。

## FizzBuzz
```haskell
module Main where

fizzbuzz :: Int -> String
fizzbuzz n
  | n `mod` 15 == 0 = "FizzBuzz" -- guardを使ってすっきり書く
  | n `mod` 3  == 0 = "Fizz"
  | n `mod` 5  == 0 = "Buzz"
  | otherwise = show n -- otherwiseはTrueのエイリアス. show: Int -> String

main :: IO() -- ターミナルとのIOが許可されているのはmainのみ
-- mapM_/2 : リストの各要素に順番に処理を行う
-- map/2: リストの各要素に順番に処理を行ってリストを返す
main = mapM_ putStrLn (map fizzbuzz [1..100])
-- 関数の合成として次も等価
-- mapM_ putStrLn $ map fizzbuzz [1.100]
```

## おまけ：実行方法
Onlineのplaygroundはあるのですが、関数を定義したり、標準出力したりする方法がわからなかったのでDockerで環境を構築し、スクリプトファイルを実行するようにしました。

```Dockerfile
FROM haskell:latest
COPY ./fizzbuzz.hs /
RUN ghc -o fizzbuzz fizzbuzz.hs
CMD ["./fizzbuzz"]
```

```shell
docker build -t haskell:fizzbuzz .
docker run --rm haskell:fizzbuzz
```
[AIX] NIM(Network Installation Manager) の学習、トラブル・シューティングの参考リンク

##### はじめに

NIM(Network Installation Manager) は AIX で古くから現在までもよく使用されている技術要素です。


最近、AIX 初学者やトラブル対応のお問合せで NIM について聞かれることがありましたので、学習及びトラブル・シューティングの参考文書を記載します。

個人視点ではありますが、この辺りを見ておいたら理解が早いかもしれませんのでご参考まで。


---

##### ネットワーク・インストール・マネージャー（NIM）とは？

https://www.ibm.com/support/pages/node/1137322

----


#####  設定手順の参考

https://ibm.ent.box.com/s/llsotz4w9akcrssh9qlm76utz85zskgd

https://ibm.ent.box.com/s/c4v0i2aqftk0h6bn41l1cqt8vrzb6fup

https://ibm.ent.box.com/s/jyfppmztohmng0uifmgcg5qot3vvjj09


technote:

https://www.ibm.com/support/pages/nim-setup-guide

---

https://qiita.com/c_u/items/51ca941f4aaa164936e7

https://qiita.com/c_u/items/564b4ac0d063fabc4efe

---



#####  AIX マニュアル

https://www.ibm.com/docs/ja/aix/7.3?topic=installing-network-installation-management

---


#####  FAQ集


https://www.ibm.com/support/pages/power-systems-aix-faq%E9%9B%86-nim

---

##### ファイアウォール環境の考慮事項

NIM が必要とするポート、ファイアウォール設定はしばしば案内する内容です。

https://www.ibm.com/support/pages/nim-communication-within-firewall-environment



---

#####  IBM Redbooks


[NIM A to Z in AIX](https://www.redbooks.ibm.com/redbooks/pdfs/sg247296.pdf)

特に以下の図はNIM の挙動の理解に役立ちます。

・How NIM installation works (p.17)
![スクリーンショット 2022-11-01 18.24.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/b124ec0d-407f-f0fd-24b4-a5b4b67841a8.png)

---


##### Trouble Shooting

NIMでトラブルが発生した際のツリー・チャートは何をする必要があるかに役立ちます。

[NIM A to Z in AIX](https://www.redbooks.ibm.com/redbooks/pdfs/sg247296.pdf)

・Troubleshooting a network boot problem (p.567)
![スクリーンショット 2022-11-01 18.26.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/c548ca93-761a-d10c-cbeb-d5e935a04247.png)


・Troubleshooting inetd flowchart (p.570)
![スクリーンショット 2022-11-01 18.26.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/97888753-6421-4ee0-2273-ed380333be08.png)

・Troubleshooting tftp  (p.574)
![スクリーンショット 2022-11-01 18.26.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/32683f47-1e84-afdb-8bf3-398ec053e818.png)

・Troubleshooting NIM LED hangs

https://www.ibm.com/support/pages/troubleshooting-nim-led-hangs


---

##### Technote

・[Migration a NIM Master using NIM](https://www.ibm.com/support/pages/migration-nim-master-using-nim)

・[Moving your NIM to new location via backup/restore of the NIMdb](https://www.ibm.com/support/pages/node/6496793)

・[Using NIM Alternate Disk Migration (NIMADM)](https://www.ibm.com/support/pages/using-nim-alternate-disk-migration-nimadm)

・[Changing the CPUID of NIM Master and NIM Clients after LPM. ](https://www.ibm.com/support/pages/node/6430695)

・[How to take mksysb of client from NIM ?](https://www.ibm.com/support/pages/node/6515196)

・[How to set up NIM for VIOS installation?](https://www.ibm.com/support/pages/node/6829921)

・[How to update VIOS from NIM?](https://www.ibm.com/support/pages/node/6524732)

・[NIM installation and backup of the VIO server using traditional NIM methods](https://www.ibm.com/support/pages/node/670271)

---

後は使用されている環境の設計書で定義されている内容などを読んで理解することが早いと思います。


以上です。
【投稿練習】中途研修を受けながら改善提案してみた

:::note warn
こちらの記事はQiitaへの投稿の練習を兼ねて、社内向けに書いた記事になります。
身内感の強い内容となっておりますので、ご注意ください。
:::

# <font color="#cc0000">想定する読者</font>
* 弊社の新卒入社者
* 弊社の中途入社者
* 弊社の研修担当者

# <font color="#cc0000">概要</font>
被研修者である私が、「次回以降の研修内容改善提案活動」を実施したことについてのまとめです。
この活動は以下のようなメリットがあると考えています。

#### <font color="#1155cc">被研修者のメリット</font>
* 未経験者も貢献しやすい
* 受け身になりがちな研修期間でも能動的に活動できる
* コミュニケーションを生みやすい

#### <font color="#1155cc">研修担当者のメリット</font>
* 被研修者視点でのフィードバックを得ることができる
* 研修に関する新しいアイディアを得られる可能性がある

# <font color="#cc0000">研修の内容おさらい</font>
私が入社した2022/10/1の中途入社者のうち、開発に配属された6名で受けた研修は以下のような内容です。

#### <font color="#1155cc">課題がクエスト形式</font>
WBS形式で課題が列挙されているのですが、1つ1つの課題は
```
クエスト27-3
メンターと1on1をしよう。
```
などと表現されており、被研修者はゲームをクリアするような感覚で楽しく課題を実施できる工夫がなされていました。
ゲーミフィケーションという手法に近いと思われます。

#### <font color="#1155cc">おおまかなクエストの内容</font>
* 入社後の諸手続き系
* ITの基礎(情報処理技術者試験など)
* プログラミング関係
* 社内ツール関係
* 自己研鑽関係
* 自社製品理解系

#### <font color="#1155cc">期間</font>
研修期間は人によってばらばらであり、最短1か月、最長2か月でした。
理由としては、「早く配属させたい」という部署側からの要望や、本人のスキルが研修内容よりも高い場合などは、早めに配属させるためのようです。

# <font color="#cc0000">実施したこと</font>
#### <font color="#1155cc">協力者の呼びかけ
被研修者との朝会で、以下の説明をしました。

* 研修を達成するだけでは、普通の評価しかもらえない
* みんなで協力して「研修の達成 + 次回以降の研修の改善提案」でプラス評価を狙おう

そして大雑把な進め方の想定を示しました。

1. まずはアイディアをブレスト
1. あがったアイディアについて議論
1. 自身が担当したいアイディアを選択
1. 週次のMTGで進捗確認

上記の説明をしたところ、被研修者6名全員が参加してくれることになりました。

#### <font color="#1155cc">1. まずはアイディアをブレスト</font>
「研修の内容を改善する案を、なんでもいいからとにかくたくさん出してください。」ということを指示しました。
ブレストでは、質より量が大事らしいです。なぜなら、「もう思いつかない…」という状態で絞り出したアイディアは、普通の頭では思いつかないようなアイディアになるから、とのこと。

![jamboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958265/aca82400-dbc1-eaa5-4d4f-74572be7f748.png)
▲Google Jamboardを使ってブレストをしました。(※画像はイメージです。)

#### <font color="#1155cc">2. あがったアイディアについて議論</font>
ブレストで出てきたアイディアについて、グルーピングしたり質問しあったりします。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958265/5866d5ac-abbc-7b5a-6193-253fcdae2220.png">
▲グルーピングはアイディアが多いと結構大変なので、しっかり時間をかけたほうが良いです。

#### <font color="#1155cc">3. 自身が担当したいアイディアを選択</font>
議論ののち、残ったアイディアを表にまとめます。
そして各々で着手したいアイディアを選択します。
![sheet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958265/e2e5b854-0651-21a2-bf92-6b35a05ebfde.png)
▲Google JamboardからGoogleスプレッドシートに場所を移しました。

#### <font color="#1155cc">4. 週次のMTGで進捗確認</font>
週次のMTGを開催し、毎回参加者に進捗を発表してもらいます。
基本的には毎週なんらかの成果物が残るように活動をする方針としました。
また、ある程度着手して方針が固まったら、なるべく早く「明確なゴール」を決めてもらうようお願いしました。
(最終成果物がどうなるか、など)

# <font color="#cc0000">実施する予定のこと</font>

最後の週次MTG時には、研修担当者に各タスクの最終成果物を譲渡するつもりです。
また、次の入社者にもこの活動を共有し、引き継いでもらったり、また新たな活動をしてもらえたらと思っています。
【Unity】プログラミングパターンのデモを勉強した

# はじめに
Unityが出してるサンプルを勉強し、それぞれのパターンを利用した時のメリットやデメリットを考えました。

それぞれのパターンの説明は調べれば山ほど出てくるので省略し、個人的に感じたことを書きます。

https://github.com/Unity-Technologies/game-programming-patterns-demo

# 1.単一責任の原則
### メリット
* 1クラス1機能にすることで整理しやすくなる。
* バグが起きた時にどこの機能でバグが起きたのかわかりやすい
* コンポーネントを使いまわせれる

### デメリット
* クラスが増える

### 感想
* コンポーネントを使いまわせれるのはすごく便利だと思う。
* どれぐらいの機能のサイズで分けるべきか悩んだ経験がある

# 2.オープン・クローズドの原則
### メリット
* 拡張がしやすく、そして修正が少ない
* 同じような処理を多く書かなくてもよくなる

### デメリット
* 特にない気がする

### 感想
* これを意識して作ればアップデートに強いものが作れそう

# 3.リスコフの置換原則
### メリット
* 基底クラスと派生クラスの関係をしっかりと整理できる
* 派生クラスを書く場合に基底クラスを把握していないと書けないという事態を防げる
### デメリット
* 特にない気がする
### 感想
* サンプルの`Vehicle`では継承が使われておらず、どんな移動ができるのか理解するために一通り目を通さないといけないのに対し、`Train`,`Car`はどんな移動をするのかわかりやすい。
* うまく使えばサンプルのように作りたい車に合わせて機能を制限してプログラミングがしやすそうだと感じた
* 想定されてない機能が付いてしまってる事態を防いだりすることができると感じた

# 4.インターフェース分離の原則
### メリット
* 機能ごとに分けることで同じ処理を使いまわすことができる
* 付けたい機能のインターフェースを付けることで無駄な機能に依存してしまうことが減る
### デメリット
* なるべく細かい機能で分けないと使わないメソッドを書くことを強制されてしまって逆に不便になる
### 感想
* 使いまわす時に本当に共通処理なのか考えないと例外的なケースがあった場合に特別なインターフェースが生まれたりしたことを経験したことがあるので使いまわしを前提として作るときは注意が必要な気がする。

# 5.依存性の逆転
### メリット
* クラスへの直接参照を回避できる
* 上位モジュールが下位モジュールに依存してしまう問題を解決できる
* 複数のものを同時に扱いたいときに全部に参照するのではなく、インターフェースを参考するだけで動かすことができる
* 直接参照しなくなるのでモックなどが作りやすい
### デメリット
* 特にない気がする
### 感想
うまく利用すればテスト環境などを構築しやすそうだと感じた。

# 6.ファクトリーパターン
### メリット
* 共通のメソッドから様々なものを作れる
* 生成物のその後の動きの流れは決められているが細かい内容はそれぞれ自由にできる
### デメリット
* 考え中
### 感想
* ゲームでの装備品だったり、敵のスポーンなど幅広いところで利用ができそうだと感じた

# 7.オブジェクトプール
### メリット
* 新しくインスタンスを生成、古いものを破棄することなく使いまわすことで生成、破棄での負荷を下げれる
### デメリット
* 足りなくなってインスタンスをどうしても生成しなくてはならない状況になった場合にFPSが変動してしまう可能性がある
* 逆に使わないのにインスタンスを無駄に確保してしまう可能性もある
### 感想
* シューテングゲームを作る際によく使うパターンなので有名で簡単な気がした
* 使わない時にインスタンスを無駄に確保してしまうのはどうすれば最適になるのか考える必要がありそう
# 8.シングルトン
### メリット
* インスタンスが一つだけなのが保証される
* どこからでもアクセス可能
### デメリット
* どこからでもアクセス可能なため、変数などを置くと勝手にいろんな場所で書き換えられて大変なことになる
### 感想
* サンプルのようにサウンドを再生するような様々な場所で使い変数の更新がないものに使うのはいいが変数の変更をするような場所でシングルトンを使用するのは勝手に書き換えが起きる危険性があるので回避したい

# 9.Commandパターン
### メリット
* ロジックごとStackに入れることでプレイヤーの場所だけではなく、通った道のオブジェクトを元に戻したりができるようになる
* `ICommand`を継承していれば移動以外もUndoができるようになるので汎用性が高い
### デメリット
* 考え中
### 感想
* プレイヤーの入力を記録して再現をすることや、ツール類のRedo、Undoに使えそう

# 10.Stateパターン
### メリット
* ステートごとにクラスを作るので一つのクラスに長々と行動を書かなくてよくなる
* サンプルではそれぞれのステートに`入った時` `ステートにいるとき` `出た時`でメソッドがあるのでその時の特別な動きなどがしやすそう
### デメリット
* 一つのステートにしかなれない。例としてはジャンプ攻撃など
### 感想
* よく使うパターン。プレイヤーでもエネミーでも使うことができて使う機会は多い気がする。

# 11.Observerパターン
### メリット
* 通知する方は何も知らなくても機能するようになる
### デメリット
* 監視側がDestroyされたときに購読を消し忘れるとメモリを圧迫してしまう
### 感想
* 購読解除を忘れた経験があるのでそこは最も注意する点だと思っている

# 12.MVPパターン
### メリット
* 演出面のプログラムとデータのプログラムが分かれてるためバグが探しやすい
* 演出面だけを誰かに頼むことができるかもしれない
* 同じような演出をするのならばViewを再利用することができる
### デメリット
* 一つのUIを作るのにクラスが2～3個づつ増える
### 感想
* 描画とデータで分かれてるのでプログラミングがとてもしやすい
* 演出面のバグならView、数値のバグならModelとバグが探しやすくなる

# まとめ
12個の設計を勉強して考えるのは大変でした。
まだ考えてみて足りないところがあればどんどん追記する予定です。
Next.jsのセットアップからVercelへのデプロイまで

# Next.jsのセットアップ
```
yarn create next-app
```
その後プロジェクト名を設定し、successと出たら、
```
cd プロジェクト名
yarn dev
```
ローカルホストで立ち上がったことを確認し、URLをChromeで表示

## yarnが使えないときは
```
brew install -g yarn

//yarnがインストールされていることを確認(バージョンが表示される)
yarn -v
```
# ProjectをVSCodeで開く
package.jsonのスクリプトを見ると、**dev,build,start**がある
## devとbuildしてstartした時の違い
buildしてstartした時は、本番環境用にコードを圧縮して最適化されるので、devと比べて圧倒的に速度が速い
一方で、devの時は、開発のときに最適化されていて、コードの変更があったときに、ブラウザに自動的に反映される
# プロジェクトをGitHubにアップし、vercelと連携させてデプロイする
## Githubにアップ
Githubで新たにリポジトリを作成し、ターミナルで以下のコマンドを叩く
```
git remote add origin <URL>
git branch -M main
git push -u origin main
```
その後、GitHubのページを更新すると反映されていることが確認できる
# Vercelと連携
https://vercel.com/

Vercelを開いて、New Projectをクリックし、連携させたいプロジェクト名を選択し、Deployすると、本番環境のURLが割り振られる
Google UXデザイン：ワイヤーフレームの基本的な描き方

# はじめに

わたしが[Google UX Design Crtificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/1ed400d1-bbdf-302d-70be-3175620c3912.png" width="800">

# ワイヤーフレームの描き方

ワイヤーフレームは、次のコンポーネントで構成されます。
- ***<font color="MediumVioletRed">線</font>***
- ***<font color="MediumVioletRed">四角や丸などの図形</font>***
- ***<font color="MediumVioletRed">テキスト</font>***

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/8efb84be-d718-700e-a293-06d0147e5b27.png" width="200">

この例を見てください。一見複雑に見えますが、使っているのは線と基本的な図形、そしてテキストだけです。

# サンプル

:::note info
携帯電話の中のアプリを示すワイヤーフレームを描きます。
:::

#### ステップ1
まず、携帯電話のフレームを作成します。これは単純な長方形でかまいません。中に描画できるような大きさにしてください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/a55c93ba-f216-72ce-d6cb-9657e823134f.png" width="500">


#### ステップ2
次に、上部にバーを追加します。このバーは、現在の画面に関連する情報やアクションを表示する場所です。この長方形のバーは、アプリの上部のほぼ全幅に渡っています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/b3f55df0-ecff-9595-a8b0-d796a6e07df8.png" width="500">

#### ステップ3
トップバーの下には、3つのディバイダーがあります。デバイダーは、リストやレイアウトのコンテンツをグループ化するための細い線です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/4b227f27-205d-3ab6-5e1f-9236fa30da0c.png" width="500">

#### ステップ4
トップバーでナビゲーションメニューのアイコンを描きます。左上の3本の水平線があるアイコンがそれです。ナビゲーションメニューのアイコンは、トップバーの中にあるはずです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/df78add8-a352-f8bb-f073-6819d2e37418.png" width="500">

#### ステップ5
アバターを追加します。これは、大きな丸に、人の頭と棒状の体のアイコンがついたものです。アバターは、トップバーの右上に追加します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/d00850ee-d709-6a1e-66b2-aa427f171d02.png" width="500">


#### ステップ6
仕切りでできたそれぞれの長方形の中に、円を追加します。円は長方形の左側に描きます。円の大きさはすべて同じにするつもりですが、多少乱雑でもかまいません。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/74da9122-f687-fa59-5f44-b8f2950e3d79.png" width="500">

#### ステップ7
この丸は画像を示すものにしたいので、それぞれの丸にXを描きます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/da3023eb-73d6-5130-9d7b-62ba755aca0e.png" width="500">

#### ステップ8
次に、枠の右下にプラス記号の入った丸を追加します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/49778332-b34f-4d01-148a-e44728ebc404.png" width="500">


#### ステップ9
最後に、各円の右側にテキストを示す水平線を描きます。この例では、線は長方形の真ん中だけで、端から端まで引いてはいけません。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/95a1a301-0fff-e522-5938-9381c24c6511.png" width="500">

これで、ワイヤーフレームができました。

# 業界標準

ワイヤーフレームをシンプルでわかりやすいものにするために、業界標準を設けています。

- ***テキスト***
    - 水平線で表現する
- ***画像・写真・イラスト・アイコン***
    - 丸とそれぞれの丸に重なるXで表現する
- ***アクション***
    - 長方形や丸で表現する
paiza.ioでelixir その51

# 概要
paiza.ioでelixirやってみた。
Stream使ってみた。

# サンプルコード

```
stream = Stream.chunk_by([1, 2, 2, 3, 4, 4, 6, 7, 7], &(rem(&1, 2) == 1))
Enum.to_list(stream)
|> IO.inspect

Stream.chunk_every([1, 2, 3, 4, 5, 6], 2) 
|> Enum.to_list()
|> IO.inspect

stream = Stream.concat([1..3, 4..6, 7..9])
Enum.to_list(stream)
|> IO.inspect

stream = Stream.cycle([1, 2, 3])
Enum.take(stream, 5)
|> IO.inspect

Stream.dedup([1, 2, 3, 3, 2, 1]) 
|> Enum.to_list()
|> IO.inspect

stream = Stream.drop(1..10, 5)
Enum.to_list(stream)
|> IO.inspect

stream = Stream.filter([1, 2, 3], fn x -> 
	rem(x, 2) == 0 
end)
Enum.to_list(stream)
|> IO.inspect

stream = Stream.flat_map([1, 2, 3], fn x -> 
	[[x]] 
end)
Enum.to_list(stream)
|> IO.inspect

Stream.intersperse([1, 2, 3], 0) 
|> Enum.to_list()
|> IO.inspect

Stream.interval(10) 
|> Enum.take(10)
|> IO.inspect

Stream.iterate(0, &(&1 + 1)) 
|> Enum.take(5)
|> IO.inspect

stream = Stream.map([1, 2, 3], fn x -> 
	x * 2 
end)
Enum.to_list(stream)
|> IO.inspect

stream = Stream.map_every(1..10, 2, fn x -> 
	x * 2 
end)
Enum.to_list(stream)
|> IO.inspect

stream = Stream.reject([1, 2, 3], fn x -> 
	rem(x, 2) == 0 
end)
Enum.to_list(stream)
|> IO.inspect

Stream.repeatedly(&:rand.uniform/0) 
|> Enum.take(3)
|> IO.inspect

stream = Stream.scan(1..5, &(&1 + &2))
Enum.to_list(stream)
|> IO.inspect

stream = Stream.take(1..100, 5)
Enum.to_list(stream)
|> IO.inspect

stream = Stream.take_every(1..10, 2)
Enum.to_list(stream)
|> IO.inspect

stream = Stream.take_while(1..100, &(&1 <= 5))
Enum.to_list(stream)
|> IO.inspect

Stream.timer(10) 
|> Enum.to_list()
|> IO.inspect

enum = 1001..9999
n = 3
stream = Stream.transform(enum, 0, fn i, acc ->
	if acc < n, do: {[i], acc + 1}, else: {:halt, acc}
end)
Enum.to_list(stream)
|> IO.inspect

Stream.unfold(5, fn
	0 -> nil
	n -> {n, n - 1}
end) |> Enum.to_list()
|> IO.inspect

Stream.uniq([1, 2, 3, 3, 2, 1]) 
|> Enum.to_list()
|> IO.inspect

Stream.uniq_by([{1, :x}, {2, :y}, {1, :z}], fn {x, _} -> 
	x 
end) 
|> Enum.to_list()
|> IO.inspect

stream = Stream.with_index([1, 2, 3])
Enum.to_list(stream)
|> IO.inspect

concat = Stream.concat(1..3, 4..6)
cycle = Stream.cycle(["foo", "bar", "baz"])
Stream.zip([concat, [:a, :b, :c], cycle]) 
|> Enum.to_list()
|> IO.inspect

concat = Stream.concat(1..3, 4..6)
Stream.zip_with([concat, concat], fn [a, b] -> 
	a + b 
end) 
|> Enum.to_list()
|> IO.inspect



```

# 実行結果

```
[[1], [2, 2], [3], [4, 4, 6], '\a\a']
[[1, 2], [3, 4], [5, 6]]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 1, 2]
[1, 2, 3, 2, 1]
[6, 7, 8, 9, 10]
[2]
[[1], [2], [3]]
[1, 0, 2, 0, 3]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4]
[2, 4, 6]
[2, 2, 6, 4, 10, 6, 14, 8, 18, 10]
[1, 3]
[0.29093681512387826, 0.23805665492554406, 0.3631628956357238]
[1, 3, 6, 10, 15]
[1, 2, 3, 4, 5]
[1, 3, 5, 7, 9]
[1, 2, 3, 4, 5]
[0]
[1001, 1002, 1003]
[5, 4, 3, 2, 1]
[1, 2, 3]
[{1, :x}, {2, :y}]
[{1, 0}, {2, 1}, {3, 2}]
[{1, :a, "foo"}, {2, :b, "bar"}, {3, :c, "baz"}]
[2, 4, 6, 8, 10, 12]

```

# 成果物

https://paiza.io/projects/yMg7xFcxeohcURq5JffaGA?language=elixir


以上。
[Swift UI]List上部の空白を消す


ListでViewを作っているときに赤線部分が消えず、、、

<img width="250" alt="スクリーンショット 2022-11-08 16.46.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494487/9f8b4179-0870-275f-295f-f8735009f2c2.png">

### 結論

どうやらタイトルを表示するためのスペースを確保されているらしい

下記を追加

    .listStyle(PlainListStyle())　

例

    List() {
        //中身必要ないので省略
    }
    .listStyle(PlainListStyle())　


<img width="250" alt="スクリーンショット 2022-11-08 16.56.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494487/79557b7f-c8c2-9024-add8-33a6275154a7.png">

無事に上の余白を取れました

横の余白も取りたいし上の余白も取りたいなんて方はこちらを採用してみてもいいかもです

ではまた。

参考

https://webtopi.biz/archives/31647440832122
【備忘録】error:0308010C:digital envelope routines::unsupported

### エラー内容
NuxtJSのプロジェクトを作成し、`npm run dev`すると下記のエラーが出る場合があります。

```shell
error:0308010C:digital envelope routines::unsupported
```

### 解決策
下記コマンドを実行すればとりあえず解決するはずです。環境はmacです。
```
$ export NODE_OPTIONS=--openssl-legacy-provider
```
このエラーについては、Node.jsのバージョンによるものです。具体的にはOpenSSLの互換性の問題のようです。
Node.js v17からOpenSSL v3.0が使用されるようになりました。上記のコマンドのように古いOpenSSLを使うよう環境変数を変更することで対応することが可能です。








### 参考文献
https://stackoverflow.com/questions/69692842/error-message-error0308010cdigital-envelope-routinesunsupported

https://forest.watch.impress.co.jp/docs/news/1360367.html
【Python】if x: と if x==True: が異なる場合について

# 概要

普通、後者のように書くと linter に怒られるし、こいつコード書けないやつだと思われるリスクをはらんでいる。
しかし Python は演算オーバーロードの機能を持つので、厳密には両者は異なる。
実用上そんなことするか、と思われるかもしれないが、著者は実際に SymPy を使ったコードで観測した。ここでは単純化したコード例を記す。

# コード例

```python
class Foo:
    def __bool__(self):
        return False
    def __eq__(self, other):
        return True

x = Foo()
```

上のように定義すると、

```python
if x:
    print(1)
else:
    print(0)
```

を評価すると

```text:result
0
```

となる。一方、

```python
if x==True:
    print(1)
else:
    print(0)
```

を評価すると

```text:result
1
```

となる。

# 説明

- `if M: ...` を評価する場合、まず `M` を評価して `v` を得る。つぎに `bool(v)` を評価して `w` を得る。この値によって if 文が分岐する。
  - `v` において特殊メソッド `__bool__` が定義されている場合、`bool(v)` は `v.__bool__()` として評価される。
- 一方、`if M==True: ...` を評価する場合、`M` を評価して `v` を得る。次に `v==True` が評価されて `w` を得る。
  - `v` において特殊メソッド `__eq__` が定義されている場合、`v==True` は `v.__eq__(True)` として評価される。

これらのルールにより、`__bool__` と `__eq__` が異なる振る舞いをするときには `if x:` と `if x==True:` は等価ではない。
個人的にNim言語の素晴らしいところ6選

# 概要

こんにちは。

普段業務ではScalaをメインに書いているものですが、
ちょっとした調査スクリプトを書いたり、雑なスクリプトを作りたい時は、Pythonやシェルスクリプトを採用することが多いです。

しかしながら、
普段Scalaを書いている身としましては、
Pythonは、`list.map(???).filter(???)`...のようにメソッドチェーンでコレクション処理をやりずらかったり、ラムダ式を定義するのに`lambda`キーワードをタイピングしたりと、若干の煩わしさを感じることもあります。

そこで、現在、Nimのような新しめの言語を使って、雑なスクリプトを作れないかと検討していまして、
その過程で見つけたNim言語の素晴らしいところを6個共有できればと思います m(_ _)m

# 1. map, filter, foldlが使いやすい！

以下のコードは、NimのmapIt, filterIt, foldlの使用例です。
`mapIt`, `filterIt`については、単に引数`it`を使う式を丸括弧の中に書いてやるだけで、
ラムダ式を渡すことができます。

```nim:map, filter, foldl
import sequtils
import sugar

echo [1, 2, 3, 4, 5, 6].mapIt(it * 2) # @[2, 4, 6, 8, 10, 12]
echo [1, 2, 3, 4, 5, 6].filterIt(it %% 2 == 0) # @[2, 4, 6]
echo [1, 1, 1].foldl(a + b) # 3

echo [1, 2, 3, 4, 5, 6].map(x => x * 2) # @[2, 4, 6, 8, 10, 12]
echo [1, 2, 3, 4, 5, 6].filter(x => x %% 2 == 0) # @[2, 4, 6]
```

# 2. ドット演算子で関数を呼び出す
[UFCS](https://ja.wikipedia.org/wiki/Uniform_Function_Call_Syntax)をサポートしているので、オブジェクト指向言語におけるメソッドのように関数に値を渡すことが可能です。

```nim
proc addOne(num: int): int =
    num + 1

echo 10.addOne # 11
echo addOne(10) # 11（普通に呼び出した場合）
```

# 3. 変数再代入禁止

`let`で変数を定義すると再代入を禁止することができます。
`var`で定義すると再代入可能です。

```nim
var x = 1
x = 10
echo x

let y = 2
y = 10 # コンパイルエラーに..
echo y
```

# 4. タプルが便利

タプルの各要素に名前をつけることができます。

```nim
type
  Person = tuple
    name: string
    age: int

let person: Person = (name: "あああ", age: 20)
echo person.name # あああ
echo person.age # 20
```

# 5. 文字列のjoin

Pythonですと、`"-".join([1, 2, 3, ...])`のような若干トリッキーなjoinを書くことになりますが、
Nimですと、自然に`join`することができます。

```nim
import strutils

echo [1, 2, 3, 4, 5, 6].join("-") # 1-2-3-4-5-6
```

# 6. importが直感的

多くのプログラミング言語ですと`.`繋ぎでimportしますが、Nimですと、`/`で階層を繋いでいます。
地味に分かりやすいです。

```nim
import std/json
```
Kubernetes まとめ

```shell
 $ kubectl get node　：readyなnodeが表示される
 $ kubectl apply -f pod.yaml　　：podのデプロイ
 $ kubectl get pod　　：podの確認
 $ kubectl exec -it nginx-pod -- bash 　：コンテナにアタッチする
```
コンテナリソース　例
-
```yaml 
code:pod.yaml
  apiVersion: v1
  kind: Pod
  metadata:
  	name: nginx-pod
  spec:
  	containers:
    - name: nginx
  		image: nginx:1.20
      resources:
  			requests:
  				cpu: 1000m
  				memory: 256Mi
  			limits:
  				cpu: 1000m
  				memory: 256
```

```shell
  $ kubectl delete -f pod-with-securitycontext.yaml   ：podの削除
  $ kubectl get [リソース種別] ([名前]) … 指定したリソースの情報を取得する (名前が指定された場合は該当するものを取得する)
  $ kubectl describe [リソース種別] ([名前]) … 指定したリソースの情報を詳細取得する (名前が指定された場合は該当するものを取得する)
  $ kubectl apply -f [ファイル名] … ファイル名で示されるファイルで定義されたリソースを適用する
  $ kubectl logs [Pod名] … 指定した Pod において出力されたログを取得する
  $ kubectl exec -it [Pod名] -- [コマンド] … 指定した Pod において指定したコマンドを実行する
  $ kubectl get pod -A　　：クラスタ内のすべてのPodの取得
```
サービスマネジメント

# サービスマネジメントシステム（SMS)
```ITサービスを効率的に運用・管理```していく活動のこと。サービスの利用者とサービスの提供者の間では、締結した```SLA(ITサービス範囲と品質を明確にした合意書)```に基づき、PDCA(計画:Plan、実行:Do、点検:Check、処置:Act)```マネジメントサイクルによってサービスを維持、向上を図る```。また、SLAやプロセスは常に見直しを行っていく。

# SMSの主なプロセス
### サービスの計画
サービスの```要求事項を決定し、文書化を行う```。また利用可能な資源を考慮して、```変更要求```及び```新規サービス、サービス変更の提案```について、```優先度付け```を行っていく。

### サービスカタログ管理
サービスカタログ（顧客に提供するサービスを文書化した情報)を作成し、顧客や利用者に対して、```適切な部分はのアクセス手段の提供```を行う。

### 構成管理
ハードウェア、ソフトウェア、ドキュメントなどの```構成品目(CI: Confuguration Item)```に関する情報を特定し、正確な構成情報やバージョンの記録・追跡・報告および検証、構成品目について```CMDB(構成管理データベース)```による情報管理を行う。

### サービスレベル管理(SLM: Service Level Management)
ITサービスレベル合意書(SLA)を```作成、締結し、その内容を実現し、維持、改善する。
ための活動を行う。また、監視結果に応じて、```SLAやプロセスの見直しを図っていく```。

### 変更管理
```サービス要求の優先度を決定し、リスク、事業利益、財務への影響などを考慮して承認```。
 
### サービスの設計および移行
ニーズやSLAを考慮してサービス設計書を作成。また、構築した新サービスの評価基準となるSAC(Service Acceptance Criteria):サービス受入基準)や```運用サービス基準```などを用意する。移行に際しては、```移行計画を作成し、移行を実施する```。

### インシデント管理（障害管理）
インシデント(incident)とは、```サービス品質を阻害、低下させるものを指す。```障害などの予期せぬサービスの中断（インシデント）に際して、記録、分類⇨優先度付け⇨必要に応じた段階的取り扱い（エスカレーション）⇨解決→終了といった手順を行う。発生したインシデントは、既知の要因として特定できるよう```記録として残しておく```。インシデント管理は現時点でのインシデンに対処する活動であり、```根本原因の解決は問題管理```で行う。

### サービス要求管理
サービス要求に対し、記録・分類を行い、優先順位や緊急度を含む、```定められた手順に従って実現```していく。

### 問題管理
問題の根本原因を突き止め、```インシデントの発生または再発防止への解決策を決めていく```。問題への対応は、記録・分類→優先度付け→必要に応じた段階的取り扱い（エスカレーション)→可能なら解決→終了の手順で行う。根本原因となる問題が解決できない場合は、```サービスへの影響を低減または除去するための処理を決定```する。これらは```「既知の誤り」として記録し、参照できるようにしておく```。

### サービス可用性管理
サービスの利用者が利用したいときに確実にサービスを利用できるよう（可用性の確保）```監視・記録、サービス要求事項および目標との比較```を行っていく。可用性が失われた場合は、```原因を調査して必要な処置```をとる。

### サービス継続管理
顧客と合意したサービス継続に基づいて、サービス継続計画を作成を作成し、実施・維持を行なっていく。サービス継続計画については、RTO(目標復旧時間＝```障害発生後に、どのくらいの時間で復旧できれば良いか）、RPO(目標復旧時点=```どの時点までデータが復旧できればよいか```）を設定し、コールドスタンバイ、ホットスタンバイ、ウォームスタンバイなどの手立てを用意しておく。

### 情報セキュリティ管理
情報資産の機密性、完全性、アクセス性の保つため、```情報セキュリティ方針、情報セキュリティ管理策```を作成し、情報セキュリティインシデントに関する事項を実施していく。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
GoogleAppsScriptで大量メール送信　第2回Google制限

## はじめに
第1回では、経緯と仕様についてお伝えしました。
https://qiita.com/AbridgeOkinawa/items/2fe5881cb2274144bd91

第2回はGoogle Workspace制限について記事にします。

## Gmail制限とGAS制限
GASには業務効率化に役立つツールですが、有料・無料に関わらず利用にあたっては様々な制限事項があります。
私自身、不正利用などを考慮してかなと考えていますが、ここまであるのかとビックリしました。

全ての制限については、公式サイトをご確認頂くこととして、当記事では、今回考慮する必要があった制限についてご紹介します。

https://support.google.com/a/answer/166852?hl=ja

https://developers.google.com/apps-script/guides/services/quotas#current_limitations


### Gmail制限
- 送信制限
   Gmailにおいて24時間以内に送信できる件数が決まっています。制限に達してしまうと、メール送信不可となり、解消は24時間後になってしまっています。

| 種別 | 制限 |
|:-:|:-:|
|  個人アカウント(無料) | 100通 |
| 無料試用アカウント  |  500通 |
| 有料アカウント  |  2.000通 |

※今回は、個人アカウント(無料)で実装しました。他サイトでは500通で送信不可と紹介されているようですが、私の場合、100通程度で送信不可となりました:cry:

もし、100通以上のメール送信するのであれば、Google Workspaceと呼ばれる、企業向けのクラウドツールを利用すると上限を引き上げることができます。

ただ、容易に有料アカウントにすることはできないことに注意したいです。
まず、試用期間(14日)があり、その期間は有料アカウントに変更することはできません。(2022年11月時点)

試用期間終了して2,000通メール送信できる！ではなく・・・

ドメインに対する請求額が100米ドルに達成且つ、その請求額に達してから60日以上経過しなければ上限を引き上げしないそうです。(2022年11月時点)

つまり、直ぐに2,000通を送るためには、早くても60日後です。
(何とも厳しい。)

https://support.google.com/a/answer/166852?hl=ja#zippy=%2C%E7%84%A1%E6%96%99%E8%A9%A6%E7%94%A8%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E5%88%B6%E9%99%90%2C%E6%9C%89%E6%96%99%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AB%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%2C%E6%9C%89%E6%96%99%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E4%B8%8A%E9%99%90%E3%81%AE%E5%BC%95%E3%81%8D%E4%B8%8A%E3%81%92


### GASスクリプト制限
6分の壁をご存知でしょうか？
GASには、スクリプトの実行時間が6分という制限があり、これは、個人ユーザーや有料アカウントに関わらず6分です。
そのため、6分以上になるとタイムアウトエラーが発生して、強制終了します。

6分以内で実行できたら良いのですが、今回の大量メール送信では無理と判断して、トリガーを発行する方法で6分の壁に挑戦することにしました。


| 特徴 | 個人アカウント | 有料アカウント |
|:-:|:-:|:-:|
| スクリプト実行時間  | 6分/実行  | 6分/実行  |
| トリガー  | 20ユーザー/スクリプト  | 20ユーザー/スクリプト  |

## おわり
第2回はへぇーって内容でスミマセン:sweat_smile:
GoldenLayoutマルチウインドウライブラリ

# 背景
実装中のUIは、
ブラウザ画面内に複数のウインドウを並べて操作できる
ものになっています。

公式に例でいうとこんな感じ
![スクリーンショット 2022-11-08 15.39.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360072/69d2cf83-c976-f26f-275b-7786a5731b13.png)

# 使用ライブラリ
そこでGoldenLayoutというJavaScriptライブラリを使用しています。
https://golden-layout.com/

ちなみにVue.jsには対応していません。辛い。
ただJavaScriptライブラリなので無理やりVueコンポーネントに導入して
使用することはできています。

この記事はVue.jsで使用することを前提に記述していきます。
Reactの例は公式ドキュメントにあります。

# 気をつけたこと

通常のシングルページアプリケーションと大きく違うのは、
ページ遷移でなく、
ウインドウを出すか出さないか、消すか
という動きになるところです。

意識する点として、
重複したウインドウは出すのか、
新たに同じウインドウを出そうとした場合中身を更新するのか、
ウインドウからウインドウに遷移する際に値を渡す際は
どう伝達するか、などが挙げられます。

ちなみに私は[pinia](https://pinia.vuejs.org/)(状態管理ライブラリ)
を使用して別ウインドウへの情報伝達を行っています。

# ディレクトリ構成
主なもののみのディレクトリ構成を下記に示します。
```
.
├── src
│   ├── layouts
│   ├── panes
│   ├── components
│   └── stores
└── test
```

特徴としては`panes`(ペイン)ディレクトリがあることです。
ペイン(ウインドウ)単位ごとにコンポーネントを作成し、
`panes`ディレクトリに配置することにより、
呼び出されるペインとその他に使われているコンポーネントを区分しています。

GoldenLayoutを導入した親コンポーネントでは、
`/panes`配下に置いたコンポーネントを探索して表示するよう
処理を記述しています。

# まとめ
ページ遷移ではなくウィンドウ形式のUIにしたい場合は
GoldenLayoutの使用を検討してみましょう。
MySQLが起動できなくなった時の対処法｜XAMPP

XAMPPからApache起動、そしてMySQLを起動しようにもエラーが出て起動できない。

![スクリーンショット 2022-11-08 150901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192496/51a8c4be-2ab8-0bdb-6bc6-4077f80fcf63.png)


:::note alert
Error: MySQL shutdown unexpectedly.
This may be due to a blocked port, missing dependencies, 
improper privileges, a crash, or a shutdown by another method.
Press the Logs button to view error logs and check
the Windows Event Viewer for more clues
If you need more help, copy and post this
entire log window on the forums
:::


ある日突然、(XAMPP)MySQLが起動しなくなった。


原因は「**ファイルが壊れている**」か「**ポートが重複している**」のどれか。

（前回PCをシャットダウンするときに、MySQLを落とさなかったのが原因だと踏んでいます）

その時の対処法（復旧方法）を書き留めておきます。

# 1.MySQLのデータをバックアップする

エクスプローラからXAMPP>mysqlとたどります。

![スクリーンショット 2022-11-08 151638.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192496/2a56ac7f-5336-075c-63fe-73f6e5d88af6.png)

その中に「data」フォルダがあるので、これをどこかへバックアップしておきます。

# 2.現在のフォルダやファイルを削除する

「data」フォルダをバックアップしたので、心置きなくXAMPP>mysqlの「data」の中のフォルダやファイルを削除していきます。


エクスプローラからXAMPP>mysqlとたどり「data」フォルダの中へ行きます。

必要なデータベースフォルダのみを残し、他のフォルダやファイルはすべて削除していきます。
（今回は「local」というデータベースフォルダだけ残します）

![スクリーンショット 2022-11-08 152859.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192496/35db3add-cb0a-fd97-bc28-21c25c0bae86.png)


# 3.初期データファルダやファイルをコピーする

エクスプローラからXAMPP>mysqlとたどると、「backup」フォルダがあると思います。

![スクリーンショット 2022-11-08 153405.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192496/5873e77b-4e0d-41a7-ce35-7c062bbc7213.png)

この **「backup」フォルダの中身を、全部「data」フォルダの中にコピー** します。

以下は「backup」フォルダの中身
![スクリーンショット 2022-11-08 153456.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192496/dc9a2868-a45e-bd67-b13f-b12621d0d835.png)


# 4.バックアップフォルダから

「1.MySQLのデータをバックアップする」でバックアップした「data」フォルダの中を見てみましょう。
するとこの中に「**ibdata1**」というファイルがあります。

![スクリーンショット 2022-11-08 155405.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192496/dc47e758-836f-1aec-0091-209e4a9ae720.png)


この「ibdata1」をXAMPP>mysqlの中の「data」の中にコピーします。


これでDBの復旧は完了です。
Apacheの起動、そしてMySQLの起動をやってみてください。
起動できればOKです。
paiza.ioでelixir その50

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
マルチタスクを実装せよ。

# サンプルコード

```
defmodule Tsk0 do
	def tick(agent, interval \\ 50) do
		cast(agent)
		:timer.sleep(interval)
		tick(agent, interval)
	end
	def start(agent) do
		Agent.start(fn -> 
			[0] 
		end, name: agent)
	end
	def cast(agent) do
		Agent.update(agent, __MODULE__.succ())
		IO.puts("task0")
	end
	def get(agent) do
		Agent.get(agent, &(&1))
	end
	def succ() do
		fn(l) -> 
			[hd(l) + 1 | l] 
		end
	end
end
defmodule Tsk1 do
	def tick(agent, interval \\ 100) do
		cast(agent)
		:timer.sleep(interval)
		tick(agent, interval)
	end
	def start(agent) do
		Agent.start(fn -> 
			[0] 
		end, name: agent)
	end
	def cast(agent) do
		Agent.update(agent, __MODULE__.succ())
		IO.puts("task1")
	end
	def get(agent) do
		Agent.get(agent, &(&1))
	end
	def succ() do
		fn(l) -> 
			[hd(l) + 1 | l] 
		end
	end
end
defmodule Tsk2 do
	def tick(agent, interval \\ 200) do
		cast(agent)
		:timer.sleep(interval)
		tick(agent, interval)
	end
	def start(agent) do
		Agent.start(fn -> 
			[0] 
		end, name: agent)
	end
	def cast(agent) do
		Agent.update(agent, __MODULE__.succ())
		IO.puts("task2")
	end
	def get(agent) do
		Agent.get(agent, &(&1))
	end
	def succ() do
		fn(l) -> 
			[hd(l) + 1 | l] 
		end
	end
end

Tsk0.start(Foo) 
|> IO.inspect
Tsk1.start(Foo1) 
|> IO.inspect
Tsk2.start(Foo2) 
|> IO.inspect
Task.async(fn -> 
	Tsk0.tick(Foo) 
end) 
Task.async(fn -> 
	Tsk1.tick(Foo1) 
end) 
Task.async(fn -> 
	Tsk2.tick(Foo2) 
end) 
:timer.sleep(300)


```

# 実行結果

```
{:ok, #PID<0.101.0>}
{:ok, #PID<0.102.0>}
{:ok, #PID<0.103.0>}
task0
task1
task2
task0
task1
task0
task0
task2
task1
task0
task0
task1
task0
```

# 

https://paiza.io/projects/PEFpcABIF8e9UfAsINQSgg?language=elixir

以上。
【cmake】最新版CMakeをapt installする方法【Ubuntu】

# apt-add-repository でCMake公式サーバーを登録する

2024年12月27日、Ubuntu22.04で動作確認, 3.31.2が入りました。

以下を順番に実行して下さい。ソースからコンパイルしないため一番楽だと思われます。

```
$ cmake --version  # まず今のバージョンを確認。恐らく3.20とか。

$ wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null

$ sudo apt-add-repository "deb https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main"

$ sudo apt update
$ sudo apt install cmake

$ cmake --version   # バージョンが上がっていれば成功！
```
とりあえずこれが一番安定して動きます。
(実はkeyfileを/etc/apt/trusted.gpg.d内に保存するのは非推奨らしいですが…)

---

もし途中で `The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6AF7F09730B3F0A4`というエラーが発生した場合には、
```
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6AF7F09730B3F0A4
```
を打って、改めて`apt update`すれば直ります。

Ubuntu18.04 (+ROS melodic)で動作確認済みです。
$(lsb_release -cs)を使っているので、16.04と20.04でも動くはずです。
ダメだったらコメント下さい。


## 解説

「apt install cmake」 でググると、例えば
https://qiita.com/hyasuda/items/16c21458f0ecd08db857
や
https://askubuntu.com/questions/829310/how-to-upgrade-cmake-in-ubuntu#comment1492832_829311

が最初にヒットしました。
しかし最初の記事はソースから手動ビルドしており、2番目の記事はバイナリファイルを直接ダウンロード+シンボリックリンク経由で呼び出しています。

これだとaptシステムを経由していないため、自動更新できない上に、ROSのcatkin_makeやcatkin buildのcmake依存を壊しかねない危険性があります。
ある程度UbuntuやROS、C++の経験がある人なら「できるだけaptに統一したい」という願望に至りますよね。

本記事が最初に記したコマンドなら、__apt add repositoryでcmakeの公式PPA__ (Personal Package Archive,つまり配布サーバー) __を登録している__ ので依存関係も安心です。
将来的にはsudo apt update & upgradeで自動更新もできちゃいます！

自分が(英語で)ググっても全然情報が出なかった + 日本語の記事が無かった + 研究室の後輩からも定期的に聞かれるので日本語で投稿しました。
ほぼ自分用メモですが、もしご参考になれば幸いです。

---

##### 参考記事
kitware公式

https://apt.kitware.com/

https://gitlab.kitware.com/cmake/cmake/-/issues/22245

askubuntu.com

https://askubuntu.com/questions/355565/how-do-i-install-the-latest-version-of-cmake-from-the-command-line

https://askubuntu.com/questions/1389758/apt-get-update-fails-due-to-no-pubkey-6af7f09730b3f0a4
【Rails】bundle install Your Ruby version is 3.0.2, but your Gemfile specified 3.0.4の対処法

<h2>症状</h2>
DockerでGemfileのrubyバージョンを変更した後、ローカルでサーバーを実行したとき、下記のエラーが発生しました
Gemfileのバージョンが違うと怒られているようです。
ただ、Docker側でバージョンが3.0.4で使っているので、できればGemfileのバージョンを変えたくない・・・。

```terminal:error
Your Ruby version is 3.0.2, but your Gemfile specified 3.0.4
```

```ruby:Gemfile
ruby '3.0.4'
```

```ruby:Gemfile.lock
RUBY VERSION
   ruby 3.0.4p107
```

<h2>解決策</h2>
以下のサイトにアクセスして、ローカル環境に該当のバージョンのrubyを入れて、解決しました。

https://rubyinstaller.org/downloads/


<h2>参考</h2>

https://rubyinstaller.org/downloads/
Azure Fundamentals(AZ-900)：Azure の基礎: Azureの管理とガバナンスについて説明する「Azure Arc」

Microsoft Learnを用いたMicrosoft Azure Fundamentals(AZ-900)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始める方の参考になれば幸いです。

## 今回の学習内容
**◆「Azure Arc」**
◇対応するMicrosoft Learn ラーニングパス
[Azure の基礎: Azureの管理とガバナンスについて説明する](https://learn.microsoft.com/ja-jp/training/paths/describe-azure-management-governance/)
◇対応するモジュール
[Azure Arc の目的について説明する](https://learn.microsoft.com/ja-jp/training/modules/describe-features-tools-manage-deploy-azure-resources/3-describe-purpose-of-azure-arc)

※前回の投稿は下記から確認できます。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azureの管理とガバナンスについて説明する「Azureと対話するためのツール」](https://qiita.com/fsd-jume/items/2bcd6f47f14553d4c4b0)

## Azure Arc
**Azure外にあるリソースをAzureで一元管理可能にする方法を提供**
⇒マルチクラウドやオンプレミス環境の統一的なガバナンスと管理が簡素化

### Azure Arcで可能な内容
・既存のAzure以外のリソースをARMに投影することで、環境全体を一元管理
・あたかもAzure内で実行されているかのようにVM、Kubernetesクラスタ、データベースを管理
・Azureのサービスや管理機能を、Azure外のリソースに使用可能
・従来のIT運用(ITOps：IT Operations)を引き続き利用しながら、DevOpsプラクティスを導入し、自分の環境で新しくクラウドを活用可能
・カスタムの場所を、Azure Arc対応Kubernetesクラスタ、クラスタ拡張機能の上の抽象化レイヤーとして構成
⇒カスタムの場所はAzureサービスインスタンスをデプロイするためのターゲットの場所として使用

### Azure Arcで管理できるAzure外のリソース
・サーバ
・Kubernetesクラスタ
・Azureデータサービス
・SQL Server
・VM(プレビュー：正式公開前の試験的な評価期間)

## 次の学習内容
**◆Azure Resource ManagerとAzure ARMテンプレート**

https://qiita.com/fsd-jume/items/44a553236cd061eecc93

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8
SERUMをGarageBandで起動する方法

macで使用

シンセサイザーが気になって使ってみたくなった。

調べたらSERUMというソフトがメージャーらしい。

有料だが、体験版があるらしいので使ってみるためにダウンロードした。

公式サイトからpkgをダウンロードし、インストールした。

その他のソフトと同じようにlanchpadから起動できると思ったら、見つからなかった。

調べてみるとDAWというような作曲するソフトから起動する必要があるらしい。

SERUMというソフトはDAWのパワーアップ部品のような形のソフトらしい。

DAWは何をダウンロードしたらいいか調べた。

MACには元からガレッジバンドというDAWソフトが入っているらしい。

ガレッジバンドを開いてみたが、どこからSERUMを起動するかわからない。

「SERUM GsrageBand　起動」など検索したがあまり出てこなかった。

いろいろ探したら見つかったので、メモしておく

↓ここにあった。

![スクリーンショット 2022-11-08 15.24.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197731/17fc7d9e-0703-4e28-0232-433fae44a326.png)


画面下の「トラック」の中の「プラグイン」の一番上のところをクリックして
「AU Instruments」の中のXfer RecordsのなかのSerum
EC2にファイル転送

privateサブネットにあるEC2サーバーにssh接続する際に
publicにあるEC2サーバーにssh鍵を置く必要がある。

そのために秘密鍵を転送する必要がある。

調べたら出てくるが、一応そのメモ。

## コマンド
```
$ scp -i 'EC2秘密鍵' 'ローカルの転送したいファイル' 'EC2ユーザー名@IPアドレス:ファイル配置先
```
今回はローカルにある秘密鍵を
publicサブネットにあるEC2に転送する

### 転送先を確認します
- ユーザー名:ec2-user
- ホストip:99.999.999.999
- 転送先:/home/ec2-user/.ssh

### 転送するファイルを確認します
```
$ cd ~/.ssh
$ ls
hoge.pem
```

### 転送します
```
$ scp -i hoge.pem hoge.pem ec2-user@99.999.999.999:/home/ec2-user/.ssh
```

### 送られているか確認します
publicサブネットのEC2にログインして
ファイルがあればok
```
$ ls /home/ec2-user/.ssh
hoge.pem
```

## privateなEC2にsshログイン
```
$ cd /home/ec2-user/.ssh
$ ssh -i "hoge.pem" ec2-user@プライベートip

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
```

ok。終わり。
jQuery クラス名を指定して要素を取得する

# 概要

- クラス名を指定して要素を取得する方法をまとめる。

# 方法

- html

    ```foo.html
    <input class="foo">
    <\input>
    ```

- js

    ```foo.js
    $('.foo')
    ```

# メモ

- クラス名を使った要素の取得にはjQueryの`$()`メソッドを用いる。
- `$()`メソッドの引数としてクラス名を渡すが、先頭に`.`をつけることを忘れずに

# 参考文献

https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Selectors

https://js.studio-kingdom.com/jquery/core/jquery
C# delegateを使ってみようと考える局面

# はじめに

C#を教科書で学ぶと豊富な機能があることがわかるが、UWPやWPFで単機能のシンプルなアプリを開発しているうちは、あまり出番のないものもある。

ところが、アプリの機能が増え、複雑になってくると、出番が出てくる。一例として、`delegate`を使ってみようと考える局面を書き出してみる。

# 例示するアプリの状況

画像を編集するアプリで、ピクセル(画素)毎の明度と彩度の変更を行う。ピクセルに対する変更処理は、明度の増加、明度の減少、彩度の増加、彩度の減少、等々、複数種ある。しかし、画像を最初のピクセルから最後のピクセルまで走査して、変更処理を適用するという流れは変わらない。

当初、複数種の変更処理に対し、それぞれピクセル走査処理を記述したが、ほぼ同じコード部分が複数発生した。この状態は、見通しが悪く、一部の変更を複数箇所に適用する必要が生じるなど管理性が低下した。

また、別のやり方として、一つのピクセル走査処理の中で複数種の変更処理を条件判定で切り替える方法もある。こちらも、処理種が増えると条件判定処理が複雑になり、コードの見通しを悪くする。

これらに対し、変更処理自体を引数として、ピクセル走査処理に渡すことができれば、コードの重複や複雑化を抑えることできる。ここで、`delegate`の使用が思いつく。

# delegateの使用

## delegateの定義

```C#:delegateの定義
private delegate BGRA8Point Del(BGRA8Point p, float param);
```

引数渡しするMethodの形を定義する。ここでは、`Del`。
- 戻り値の型：ここでは`BGRA8Point`(BGRAで定義するピクセルを表現するクラス)
- 引数：ここでは`BGRA8Point`と`float`の2つ

:::note
BGRA:Blue,Green,Red,Alphaの4つで色を表現する仕組み
:::

## 引数で渡すMethodの定義

```C#:引数で渡すMethodの定義
private BGRA8Point CallAdjustLightness(BGRA8Point p, float delta)
{
    return p.AdjustLightness(delta);
}

private BGRA8Point CallAdjustSaturation(BGRA8Point p, float delta)
{
    return p.AdjustSaturation(delta);
}

private BGRA8Point CallCompressLightness(BGRA8Point p, float ratio)
{
    return p.CompressLightness(LMean, ratio);
}

private BGRA8Point CallCompressSaturation(BGRA8Point p, float ratio)
{
    return p.CompressSaturation(SMean, ratio);
}
```

`delegate`の定義に則ったMethodの定義。ここでは、4つを列挙。
- 明度の調整：第2引数に変分を渡す。
- 彩度の調整：第2引数に変分を渡す。
- 明度の圧縮：第2引数に圧縮率を渡す。
- 彩度の圧縮：第2引数に圧縮率を渡す。
第2引数はMethodにより異なるが、`delegate`の定義と型が合っていればよい。

## Methodの引数渡しの実際

```C#:Methodの引数渡しの実際
public override async Task IncrementLightness()
{
    float d = LightnessAdjustDeltaList.Items[SelectedLightnessAdjustDeltaIdx].Diff;
    await ApplyEachPixel(CallAdjustLightness, d);
}

public override async Task DecrementLightness()
{
    float d = LightnessAdjustDeltaList.Items[SelectedLightnessAdjustDeltaIdx].Diff;
    await ApplyEachPixel(CallAdjustLightness, d * -1.0f);
}
```

実際に引数としてMethodを渡す例。渡し先は、画像のピクセル走査処理`ApplyEachPixel`。ここでは、2つを列挙。
- 明度の増加：第1引数は明度の調整のMethod、第2引数は正の変分。
- 明度の減少：第1引数は明度の調整のMethod、第2引数は負の変分。

:::note
Method定義に`override`がついているのは、親クラスである`abstract class`で`abstract`で定義したMethodであるため。delegateとは関係ない。
:::

## 引数で渡されたMethodの呼び出し

```C#:引数で渡されたMethodの呼び出し
private async Task ApplyEachPixel(Del pxlfunc, float param)
{
    ...
    int npxls = SourceNPxls;
    byte[] tgt = new byte[SrcImg.Length];
    for (int i = 0; i < npxls; i++)
    {
        int idx = i * 4;
        BGRA8Point p = new BGRA8Point(SrcImg[idx], SrcImg[idx + 1], SrcImg[idx + 2], SrcImg[idx + 3]);

        // 引数で渡されたMethodの呼び出し
        BGRA8Point q = pxlfunc(p, param);

        tgt[idx + 0] = q.BGRA8[0];
        tgt[idx + 1] = q.BGRA8[1];
        tgt[idx + 2] = q.BGRA8[2];
        tgt[idx + 3] = q.BGRA8[3];
    }
    ...
}
```

Method定義の第1引数で、型`Del`の`pxlfunc`を受け取る。
`for`文の内側で、ソース画像のピクセル毎に、`pxlfunc`を呼び出す。

これにより、一つのピクセル走査処理で、複数種の変更処理を呼び出すことができた。また、複数種の切替に条件分岐を用いずに済んだ。

# おわりに

`delegate`を用いることで、コードの重複を抑え、見通しをよくすると共に管理性を向上することができた。今後、さらに別の処理を加える際も最小限のコード記述で済ませることができる。

:::note
手順がそれなりに煩瑣なのは、Cの関数のポインタ渡しの危うさを知っていれば止むなし、なのかなと。
:::
jsファイルからGETでControllerに値を渡す

## 環境
Rails5.2
Slim

## はじめに
以前、「link_toでViewからControllerに値を渡す」という題で記事を書いたことがあります。この記事の内容は、Controllerへ受け渡すパラメータを、link_toで直接指定するといったものでした。

https://qiita.com/pyon_kiti_jp/items/545b391b3e101298c712


今回の記事は、link_toではなく、jsファイルにパラメータを指定してControllerへ渡すといった方法になります。jsファイルでパラメータを指定できれば、Viewで作成した画面項目に入力した値を、GETを使って、Controllerへ受け渡すといったことが可能になります。

## 事前準備
SeikyusControllerクラスの中に、testというメソッドを作成しました。
```seikyus_controller.rb
class SeikyusController < ApplicationController
	def index
	end
	def test
	    redirect_to seikyus_url
	end
end
```

SeikyusControllerクラスのtestメソッドへのルート情報を設定します。
```routes.rb
resources :seikyus do, only: [:index]
    get  :test,   on: :collection
end
```

## やったこと
Viewの中に、testメソッドへのリンクを作成します。
```index.html.slim
= link_to "テスト", test_seikyus_path, id: 'lnk_test'
```

app/assets/apjavascripts/seikyu.jsを新規作成します。application.jsからseikyu.jsが読み込まれるため、下記の記述があることを確認します。デフォルトでは作成されているはずです。
```application.js
//= require_tree .
```

seikyu.jsに、リンクでクリックイベントが発生したときの処理の雛形を作成します。まずは、リンクをクリックして、コンソールに「OK」が表示されるところまでを確認します。
```seikyu.js
document.addEventListener('turbolinks:load', function() {
    document.getElementById('lnk_test').addEventListener('click', function() {
        test_get();
    })
}, false)

function test_get() {
    console.log("OK");
}
```

リンクをクリックして遷移するURLの末尾に、URLパラメータを付加します。URLパラメータの書き方には決まった型があります。型が外れていてもGETで送信することはできます。しかし、サーバー側で正しく値を取得することができなくなります。

URLパラメータは、先頭１文字には必ず「？」を指定します。その後に「キー=値」の形でします。「キー=値」が複数ある場合は、「&」を使って連結します。

下記例では、「aa」、「bb」、「cc」という３つのキーに、「1」、「2」、「あいう」という値をそれぞれセットしています。
```seikyu.js
function test_get() {
    let lnk_test = document.getElementById('lnk_test');
    let param    = "?aa=1&bb=2&cc=あいう";
    lnk_test.setAttribute('href', lnk_test.href + param);
}
```

URLパラメータは、Railsの中で、paramsというハッシュ型の変数にセットされます。Controllerの中から、paramsの中身を確認することができます。paramsの中身を取得して、URLパラメータの内容が正しく取得できていることを確認します。
```seikyus_controller.rb
def test
    @debug = Rails.application.config.pri_logger
    @debug.error(params)
    @debug.error(params[:aa])
    @debug.error(params[:bb])
    @debug.error(params[:cc])
    
    redirect_to seikyus_url
end
```

ログを確認すると、確かに、URLパラメータが取得できていました。
```debug.log
: <ActionController::Parameters {"aa"=>"1", "bb"=>"2", "cc"=>"あいう", "controller"=>"seikyus", "action"=>"test"} permitted: false>
: 1
: 2
: あいう
```

## 補足（その１）

画面のテキスト項目で入力した値や、ラジオボタンで設定した値を取得して、URLパラメータとして受け渡すこともできます。
```seikyu.js
function test_get() {

    var kbn;
    if (document.getElementById('chk_seikyus_kbn').checked){
        kbn = 1;
    }else{
        kbn = 2;
    }
    let txt = document.getElementById('txt_seikyus_ym').value;

    let param    = "?aa=" + kbn + "&bb=" + txt;
    lnk_test.setAttribute('href', lnk_test.href + param);
}
```

paramsの中身を見ると、画面に入力した値を正しく取得できていることが確認できます。
```debug.log
<ActionController::Parameters {"aa"=>"1", "bb"=>"2022-11", "controller"=>"seikyus", "action"=>"test"} permitted: false>
```

## 補足（その２）

ログファイルは、次のように設定しています。
```development.rb
config.pri_logger = Logger.new(Rails.root.join('log/debug.log'))
```
分類問題の基礎知識

# 0. データセット
MNISTのデータセットを準備して2クラスだけのデータセットを作成する。

- [MNISTの使い方まとめ](https://kakedashi-engineer.appspot.com/2020/02/10/mnist/)
- [MNISTで1だけ取り出す](https://kagglenote.com/ml-tips/mnist_only_1/)

# 1. データセットの分割

- [scikit-learnでデータを訓練用とテスト用に分割する](https://note.nkmk.me/python-sklearn-train-test-split/)
- [k-fold cross validation](https://axa.biopapyrus.jp/machine-learning/model-evaluation/k-fold-cross-validation.html)
- [k-Fold Cross Validation(交差検証)を解説する](https://datawokagaku.com/kfoldcv/)

# 2. データセットの生成

- [ブートストラップサンプリング（Bootstrap Sampling）法とそのscikit-learnを用いた実行](https://qiita.com/tjmnmn/items/3aed6fb85f75446f74ca)

# 3. out-of-sample-performance
- [1. Pythonで学ぶ統計学　2. 確率分布[scipy.stats徹底理解]](https://qiita.com/y_itoh/items/c388ff82360906240daf)

# 4. 分類問題の性能評価

- [Scikit-learnで分類問題の性能評価指標](https://di-acc2.com/programming/python/6589/)
- [機械学習で使用する評価関数のまとめ](https://qiita.com/ttabata/items/2cedb249256d573a5a99)
Ubuntu バージョンアップ (20.04 LTS to 22.04 LTS)

## バージョンを確認

```
cat /etc/os-release
```

## アップグレード可能バージョンを確認

```
sudo do-release-upgrade -c
# New release '22.04.1 LTS' available.
# Run 'do-release-upgrade' to upgrade to it.
```

## アップグレード実行

```
sudo do-release-upgrade
Please install all available updates for your release before upgrading.
```
とでたので、モジュール群をアップデート。

```
sudo apt update
・・・
```

## 再実行
```
sudo do-release-upgrade
```

## 確認

```
cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.1 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
```
Material UI の sx prop の利用方法

# sx propとは
sx prop とは, Material-uiのcomponentに対してスタイルを指定できるものです.
プレーンなhtmlでのインラインCSSのような感覚で使用できます.

https://mui.com/system/getting-started/the-sx-prop/

# 利用方法

sx propsに対応しているcomponentに対して、sx要素で指定します.


```react:例
<Box sx={{ bgcolor:"#777" }}>
    Hello
</Box>
```

# 利用可能プロパティ
sxで利用できるプロパティの一例を記載します.

## border
指定コンポーネントの周りに囲い線をつけます.

```react:例
<Box sx={{ border: 1 }} >
    Hello
</Box>
```


## display
表示/非表示を設定します.
```react:例
<Box sx={{ display: 'none' }} >
    Hello
</Box>
```

## size
縦幅および横幅を設定します.

### 横幅
```react:例
<Box sx={{ width: 200 }} >
    Hello
</Box>
```

### 縦幅
```react:例
<Box sx={{ height: '250' }} >
    Hello
</Box>
```

指定には0-1の小数値が使え、その場合は自動的に%扱いとなります.
また、%表記も可能です.
```react:例
<Box sx={{ width: 0.5 }} >
    Hello
</Box>
<Box sx={{ width: '50%' }} >
    Hello
</Box>

```
アカウント移行のお知らせ

こんにちは、私はMARCHに通う、生物学科の3年生です。

独学でrailsを学び、ポートフォリオが先週完成しました！

Twitterアカウントに紐づいたこちらのQiitaアカウントを今後利用していきます。

よろしくお願いします～

旧アカウントはこちらになります。
https://qiita.com/chasumaru
アカウント移行(chasumaru)


こんにちは、私はMARCHに通う、生物学科の3年生です。

独学でrailsを学び、ポートフォリオが先週完成しました！

Twitterアカウントに紐づいたこちらのQiitaアカウントを今後利用していきます。

よろしくお願いします～

旧アカウントはこちらになります。
https://qiita.com/chasumaru
ストロングパラメーターとParamsの復習

#### ストロングパラメーターとは

まずパラメーターとは、渡される情報のことです。
ストロングパラメーターとは、指定したキーを持つパラメーターのみを受け取るように
制限をかけたものです。
つまり「指定した情報のみちょうだいね」と制限をかけてくれます。

なぜこのストロングパラメーターが必要なのかというと、
以前のRailsは、送られてきたデータを全て保存することが実装によってはできたらしいです。
つまり改ざんされたデータを送信した場合も保存されてしまいます。
現在はストロングパラメーターを用いることで、許可していない不正な情報を
ブロックすることができるようになっています。

以下のコードを参照ください。

```ruby:controllers/book_controller.rb
private
  # ストロングパラメータ
  def book_params①
    params①.require②(:book).permit③(:title, :body)
  end
end
```
###### ①paramsメソッド

シンプルに言えば、「送られてきた値を受け取るためのメソッド」です。
formから送られてくる情報やデータはこのparamsの中に入っています。
つまりparamsとは、送られてくるデータを入れてる箱のようなものです。
formで送信されたパラメーター（=データ）は、paramsという箱の中に入れられ、
そのデータをコントローラーで受け取ります。

###### ②requireメソッド

送られてきたデータの中からモデル名(ここでは:book)を指定することで、データを絞り込みます。
params内にはたくさんの情報、データが存在するので、その中からモデルに対応するキーを
取得してくれるのがrequireメソッドの役割です。

###### ③permitメソッド

permit=その名の通り許可するメソッドです。
何を許可してくれるかというと、先ほどのrequireで絞り込んだデータの中から、
保存を許可するカラムを指定します。つまりpermitで指定されたキーのみが保存ができます。
これで誰かが悪意ある改ざんデートを送りこもうとしても、制限をかけているので防ぐことができます。
今回だとtitleとbodyしか受け取りませんよ、と指定していることになります。


上記をシンプルにまとめると
①paramsに格納されて情報が送られてくる→②requireメソッドでモデルに対応するキーを取り出す→
③その中から許可したデータのみpermitメソッドでゲットする
このような流れでストロングパラメーターがはたらくことによって、
book_params内で保存したいデータの絞り込みが行われるわけですね！


#### privateってなに？

ストロングパラメータの上に記述してあるprivateとは。
privateメソッドは一種の境界線で、「ここから下はコントローラーの中でしか呼び出せないよ」
という意味があります。
privateの下に記述することで、メソッドの呼び出しに制限をかけることができます。
private以下に定義されたメソッドは、アクションとして認識されなくなり、URLと対応
できなくなります。

逆にindexやshowなどの通常の７つのアクションをprivate以下に記述してしまうと、
indexアクション=/books/indexというURLとの紐付けに対応できなくなり、
エラーが発生してしまうので記述位置に注意してください。

```ruby:controllers/book_controller.rb
:
:
  private
:
end
```

他のアクション(indexやshowなど)を巻き込まないように
privateは一番下のendの上に記述しましょう。