OmniAICreator/Qiita-1.07M huggingface dataset:
【競プロ/Swift】AtCoder Beginner Contest 292

# 注意事項
本記事は復習のための日記的なものであり、丁寧な解説を求めている方には不十分かと思われますので、ご了承のほどお願いいたします。

# 正解済み問題
## A - CAPS LOCK
**問題文**
[こちら問題ページ](https://atcoder.jp/contests/abc292/tasks/abc292_a)

**解答**
入力値を大文字で出力するだけ。

```swift
let S = readLine()!

print(S.uppercased())
```

## B - Yellow and Red Card
**問題文**
[こちら問題ページ](https://atcoder.jp/contests/abc292/tasks/abc292_b)

**解答**
与えられる指示に対する処理をfor分で回して、順次switch分で該当の処理を実行していく。

```swift
let NQ = readLine()!.split(separator: " ").map{Int($0)!}
var nArray = Array(1...NQ[0]).map{[$0, 0]}

for _ in 0..<NQ[1] {
    let event = readLine()!.split(separator: " ").map{Int($0)!}
    switch event[0] {
    case 1: if nArray[event[1] - 1][1] < 2 { nArray[event[1] - 1][1] += 1 }
    case 2: if nArray[event[1] - 1][1] < 2 { nArray[event[1] - 1][1] = 2 }
    case 3: print(nArray[event[1] - 1][1] == 2 ? "Yes" : "No")
    default: break
    }
}
```

# 誤答及び、未解答問題
## C - Four Variables
**問題文**
[こちら問題ページ](https://atcoder.jp/contests/abc292/tasks/abc292_c)

**誤答**
C問題から一気に難易度上がりすぎ笑
今回も実行時間制限超過でクリアならず。。。

dividorsメソッドで引数で与えられた値から、その値を生成する乗算の組み合わせを返す。
例えば引数４なら
[[1, 4],[2, 2], [4, 1]]
を返す。

そのdividorでiからなる配列とn - iからなる配列の個数を掛け合わして、足していくことでパターン総数を出力する処理。

出力は合ってると思うけど、色々無駄な処理が多いぽくて、実行時間超過エラーに。

```swift
import Foundation

func divisors(value: Int) -> Set<[Int]> {
    var divisors: Set<[Int]> = []
    if value == 1 { return [[1, 1]]}
    
    for num in 1...value where value % num == 0 {
        divisors.insert([num, value / num])
    }
    return divisors
}

let N = Int(readLine()!)!
var counter = 0

for num in 1..<N {
    let divisors1 = divisors(value: num)
    let divisors2 = divisors(value: N - num)
    counter += divisors1.count * divisors2.count
}

print(counter)
```
**正答**
１つ目のfor文でAB+CD=NのABとCDのパターン集計していく。
2つ目のfor文でABのパターン数xCDのパターン数で、その組み合わせの総パターン数を集計していく。

```swift
let n = Int(readLine()!)!

var counter: [Int: Int] = [:]

for i in 1..<n {
    for j in i..<n {
        let x = i * j
        if x >= n { break }
        counter[x, default: 0] += i == j ? 1 : 2
    }
}

var ans = 0
for i in 1..<n {
    let leftValue = counter[i] ?? 0
    let rightValue = counter[n - i] ?? 0
    
    if leftValue > 0, rightValue > 0 {
        ans += leftValue * rightValue
    }
}

print(ans)
```
# 参考
https://atcoder.jp/contests/abc292
コマンドでmp3ファイルの再生時間を取得・集計する(ffprobe)

## 動機
複数ある音声ファイルの総再生時間を集計したい。
手でひとつひとつ打ち込むのは面倒なので、テキストで一気に。

## 環境

- macOS Darwin 22.3.0
- Homebrew導入済

## 方法
ffprobeコマンドを使用して音声ファイルのメタデータを取得する。

ffmpegをインストールするとffprobeコマンドが使用できるようになる。

```bash
$ brew install ffmpeg
$ which ffprobe
/usr/local/bin/ffprobe
```
ffprobeコマンドの引数に音声ファイルを与えるとメタデータが表示される。
このうち 'Duration'が再生時間であるようだ。(1秒未満なのはダミーデータだから)

```bash
$ ffprobe hello.mp3
ffprobe version 5.1.2 Copyright (c) 2007-2022 the FFmpeg developers
(中略)
Input #0, mp3, from 'hello.mp3':
  Metadata:
    encoder         : Lavf59.27.100
  Duration: 00:00:00.65, start: 0.050113, bitrate: 34 kb/s
  Stream #0:0: Audio: mp3, 22050 Hz, mono, fltp, 32 kb/s
```
ただ、このままパイプにつないで絞り込めない。
```bash
$ ffprobe hello.mp3 | grep Duration
(同じ出力になる)
```
標準エラー出力に出ていた。リダイレクトする。
```bash
$ ffprobe hello.mp3  2>&1 | grep Duration
  Duration: 00:00:00.65, start: 0.050113, bitrate: 34 kb/s
```
絞り込めた。あとはAWKで
```bash
$ ffprobe hello.mp3  2>&1 | grep Duration | awk -F, '{print $1}' | awk '{print $2}'
00:00:00.65
```
目的であった再生時間が取得できた。
現在ディレクトリの複数ファイルに対してはたとえば次のように。

```bash
$ ls | xargs -I% ffprobe % 2>&1 | grep Duration |  awk -F, '{print $1}' | awk '{print $2}'
00:00:00.65
00:00:00.81
(以下略)
```
以上で目的が達成できた。
文系による因果推論・因果探索超入門


　今回は因果推論について、ご紹介をしたいと思います。私も、初学者として勉強中のため誤り等がある可能性があります。その際は、ご指摘いただけますと幸いです。

　近年、日本でも流行りつつある因果推論ですが、まだまだ日本語の出版物等が少ないため、色々としらべました。自分が躓いたポイントや文系の私にとって理解しずらかったポイントなどを纏めながら記事を作りたいと思います。


　突然ですが、私が大学生となったばかりの頃、統計学の講義を取った際、最初の授業で面白い問題が出されました。（有名な問題ですが、もし初見であれば皆さんも一度考えてみてください。）

◇問題内容◇
アメリカのある州では、アイスクリームが売れる日は凶悪犯罪がよく起こる。それはなぜか。

　当時の私は統計に関する知識が全くなかったため、頭の中では次の様な妄想が膨らんでいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3239279/687f2142-1545-8496-3ac2-8c6d41004ee0.png)
　真面目に働いていたサラリーマンが、アイスクリームを食べると、突然世紀末の様な風貌に変身を遂げてしまうのか・・・、あるいは、アイスクリームにドラッグなどが入っていて、人格を変えてしまったのか・・・。（想像力が豊かですね(笑)）

　これは、有名な疑似相関の問題です。実は、アイスクリームがよく売れる日と言うのは、暑い夏の日のことを指しています。次のグラフをご覧ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3239279/daa59b69-c260-c600-f534-ce6d93042f52.png)
ICBS Everywhere "The Logic of Causal Conclusions: How we know that fire burns, fertilizer helps plants grow, and vaccines prevent disease",October 1, 2014,
http://icbseverywhere.com/blog/2014/10/the-logic-of-causal-conclusions/

　横軸は一年間の月を表しています。赤色のラインはアイスクリーム販売量、黄色のラインは犯罪数を表しています。
　確かに、アイスクリームがよく売れる日は夏真っ盛りであることは納得できます。また、諸説ありますが、夏に犯罪数が増加する理由は、夏は薄着で外出することが多く、その女性が犯罪に巻き込まれてしまうためや、暑さによってイライラするためと考えられています。日本ではあまりピンとこないかもしれませんが、実際のデータからそのような相関関係があると認識できます。
　
　上記の例は、因果関係を表したものではありません。アイスクリーム屋さんの販売を停止し、アイスクリームの販売量を下げたとしても、おそらく犯罪数が減少することはないでしょう。それどころか、よりイライラしてしまい、犯罪が増加してしまう可能性も考えられます。

　因果推論の第一人者でもあるジューディア・パールによると、今までの古典的な統計学は、相関関係のみを取り扱っており、原因や因果は全く考慮にいれていないとの事です。それに比べて、因果推論という新しい道具を使うことによって、「原因とそれによって生じる結果の関係」という因果関係を推定することができます。

　もう少し具体的な例を考えてみます。現在、私は銀行に勤めていますので、実際に金融営業で起こり得そうなケースを考えてみます。
　ここでは、広告効果について考えてみたいと思います。架空の銀行の一場面ですが、サービスインした新しい投資信託商品の売れ行きが乏しかったため、インターネット等に広告を打ち出すことにしました。すると投資信託の売れ行きは上昇しましたが、インターネット広告を打ち出した同時期に、専門の投資信託販売員の人員強化も行っていました。同時期に色々な施策を行っていると、何が原因で投資信託の販売量が増えたのか分かりません。そのような際に役立つのが、因果推論・因果探索というツールです。

　次回以降の記事で、実際のpythonにおけるコード等を解説したいと思います。

◇参考にした文献
【１】「つくりながら学ぶ! Pythonによる因果分析 ~因果推論・因果探索の実践入門」
　→　かなり初心者向けにかかれている書籍です。数式等も理解しやすく、文系でもなんとかくらいつけそうです。

【２】因果推論の科学 「なぜ?」の問いにどう答えるか
　→　ジューディア・パールによる入門書。数式等は一切でてこない。歴史書のようなもの。

【３】入門 統計的因果推論
　→　数式ばかりで、因果推論を勉強する初めの書籍としては高難易度。
EC2にgolangをデプロイする

ローカル環境で開発したGoアプリをEC2へデプロイを試みる。

使用ツールは以下
・EC2(t2.micro)
・RDS(MYSQL db.t3.micro)
・Apache
・CodePipeline
・Git
・Linux

# 1.環境作り
・EC2(t2.micro)
・RDS(MYSQL db.t3.micro)
をコンソールで作成する。
次にAWSを使いCI/CD環境の構築を試みる。
サービスはCodePipelineを使った。
CodePipelineとは？:
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/welcome.html

今回はGithubアカウントと連携して、
CodeCommitでGithubプッシュを確認→
CodeBuildでコードをビルド→
S3へ保存→
S3から保存したコードをデプロイ
という流れのCI/CD。
※CodeBuildでコードをビルドするにはbuildspec.ymlファイル、CodeDeployにはappspec.ymlのファイルが該当のソースコードのルート先に必要なようです。

### 詰まったとこ
最低限の設定でコミットからデプロイまで試したが、buildspec.ymlファイルをビルドコマンドだけ用意した
```
version: 0.2
phases:
  build:
    commands:
      - GOOS=linux GOARCH=amd64 go build  main.go
```
これで試してもデプロイ段階でエラーがでてしまった。

```
version: 0.2
phases:
  build:
    commands:
      - GOOS=linux GOARCH=amd64 go build  main.go
artifacts:
    files:
        - '**/*'
```

artifactsの部分でビルドしたコードの出力先を指定しているらしい。この場合既存のS3バゲットへしっかり保存された。

これでGithubのプッシュからデプロイまで自動化された。


# 2.サーバへデプロイ
ひとまずCodeDeployによってビルドされたコードが/var/www/html下に展開された。

環境構築を一通り
EC2へssh接続→
各種インストール(Apache,MySQL,go,etc...)→
MySQLコマンドでDB、ユーザ作成＆ローカルからインポート


### 詰まったとこ

 ひとまずビルドされた/var/www/html下にあるバイナリファイル(main)をコマンドラインから実行
```
./main
接続成功
```
このままIPアドレスへアクセスしても、Apacheのテストページが表示される。。
/etc/httpd/confにあるhttpd.confを編集する必要がありそう。

```
<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyRequests Off
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
</VirtualHost>
```
webアプリはFastCGIサーバーとして起動する必要があるようで、ApacheのVirtualHost設定で、FastCGIサーバーにアクセスするためのプロキシ設定を上記のように追加。

Apacheを再起動して再びパブリックIPへアクセスすると→
アプリのトップ画面が表示！
マークダウン入門【基本記法】

# マークダウンとは
マークダウン（Markdown）は、文書を記述するための軽量マークアップ言語の一つです。

## 見出し
# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6

```
# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6
```

## コード書き出し
```php:index.php
echo "Hello world!!";
```
~~~
```php:index.php
echo "Hello world!!";
```
~~~

## リスト（番号なし）
- リスト1
- リスト2
- リスト3
```
- リスト1
- リスト2
- リスト3
```

## リスト（番号あり）
1. リスト1
2. リスト2
3. リスト3
```
1. リスト1
2. リスト2
3. リスト3
```

## リンク
```
[Google](https://www.google.com/)
```

## テーブル
|  ID  |  名前  |  年齢  |
| --- | --- | --- |
| 001 |  山田  |  20  |
| 002 |  田中  |  30  |
| 003 |  佐藤  |  25  |
```
|  ID  |  名前  |  年齢  |
| --- | --- | --- |
| 001 |  山田  |  20  |
| 002 |  田中  |  30  |
| 003 |  佐藤  |  25  |
```

## 画像の挿入
![アイコン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2836142/20fc8be4-b080-2ab8-1de9-19c51a0c148c.png)
```
![アイコン](https://example.com/logo.png)
```

## 引用
> これは引用文です。
```
> これは引用文です。
```

## 水平線
---
```
---
```

## 打ち消し線
~~打ち消し線~~
```
~~打ち消し線~~
```

## 斜体
*斜体*
```
*斜体*
```

## 太字
```
**太字**
```


## 絵文字
:heart:
```
:heart:
```
【UE4 , UE5】ベジェ曲線を使って空に弧を描く

# 0. 最初
こんにちは、皆さんはペペロンチーノ食べていらっしゃいますか？
今回は、BPを使って空に2次ベジェ曲線を描きたいと思います。

# 1. 完成形
完成形はこちら
紫の弧がベジェ曲線になっています

![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/81f4908d-a01a-f029-81b1-1057fffebf20.gif)

完成ノードはこちら
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/64e73989-8fbf-e804-8a9d-2e2ddb71b84f.png)
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/f0ee8ed7-c4a8-bd13-cbc8-40d147f9cbd5.png)



# 3.解説

【 使用する変数 】
・Start Point (開始位置)
・Target Point(到着位置)
・Half Point(中間位置)
・Start to Half Point(開始と中間位置の変化)
・Half to Target Point(中間と到着位置の変化)
・ベジュ値(Bezier Velocity)
・変化量(Alpha)今回は「0.05」

# 3.2 初期化
最初の開始位置、中間位置、目的位置を初期化
（ここの位置は変更しません　固定です）

「Start to Half Point」 を「Start Point」で初期化
「Half to Target Point」を「Half Point」で初期化
「Bezier Velocity」を「Start to Half Point」で初期化
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/5b64d835-a58b-7b01-d6b3-7f08a5e91d00.png)



# 3.3 開始地点から中間地点まで補間
「Start to Half Point」 と 「Half Point」で補間
Alphaピンに変数「Alpha」を接続してください
![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/bb92cdd3-2b3c-9a89-269c-1916295c913a.gif)



# 3.4 中間地点から到着地点まで補間
「Half to Target Point」 と 「Target Point」で補間
Alphaピンに変数「Alpha」を接続してください
![3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/bc7fa372-631f-de9e-936e-1dd13cef5111.gif)

# 3.5　「開始から中間の点」と「中間から到着の点」を補間 
「 Bezier Velocity」と「Half to Target Point」で補間
Alphaピンに変数「Alpha」を接続してください
![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/81b6a133-3764-5f6f-a882-16e67085e0b4.gif)

# 4. 最後
お疲れ様でした
久しぶりに数式を読んで大変でしたら意外と何とかなりました！！

これからもUEの記事を書いていきますのでよろしくお願いいたします！

# 5．参考サイト
・ベジェ曲線を使ってキャラクターを滑らかに移動する理屈
https://www.youtube.com/watch?v=Cn4xU_j3pa4&ab_channel=D.IKUSHIMA

・【Unity】ベジェ曲線を求めて放物線を描く
https://www.karvan1230.com/entry/2021/07/20/195534
Juliaと関数型プログラミング

# はじめに

Juliaで関数型 (Clojure式) プログラミングをしたいと思い調べたパッケージを、ここにメモする。パッケージ名の後の数字は、Githubでのスター数と、最終更新月。

どれもまともにメンテされておらず、機能的にも、表面的な記法を弄るものが多いように思われた。劇的にコードが見やすくなったり、コード量が短くなったりするようなものはない。

しばらくは、素のJuliaと自作関数でやっていこうと思う。

# [`Lazy.jl`](https://github.com/MikeInnes/Lazy.jl) (446/2020-07)
名前の通り、遅延評価用のパッケージ。しばらくメンテされていない。

# [`Underscore.jl`](https://github.com/c42f/Underscores.jl) (76/2021-05)
Clojureの`%`を`_`で利用できるようにするパッケージ。
> `@_ map(_+1, xs) means map(x->x+1, xs)`

# [`Chain.jl`](https://github.com/jkrumbiegel/Chain.jl) (315/2022-06)
```julia
# Normal
df |>
  dropmissing |>
  x -> filter(:id => >(6), x) |>
  x -> groupby(x, :group) |>
  x -> combine(x, :age => sum)

# Chain.jl
@chain df begin
  dropmissing
  filter(:id => >(6), _)
  groupby(:group)
  combine(:age => sum)
end
```

# [`IterTools.jl`](https://github.com/JuliaCollections/IterTools.jl) 125/2021-07
中身は調べていない。

# [`Trancducers.jl`](https://github.com/JuliaFolds/Transducers.jl) (371/2022-11)
Clojureのシーケンス処理を模倣する[パッケージ](https://juliafolds.github.io/Transducers.jl/dev/)。`Partition`, `Drop`, `MapCat`等があるのだが、少しクセが強そう。

下記の例だと、`Map(copy) |> collect`が直感的でないように思えるし、(Vectorではなく) Matrixを扱えないっぽい。
```julia
julia> 1:8 |> Partition(3) |> Map(copy) |> collect
2-element Vector{Vector{Int64}}:
 [1, 2, 3]
 [4, 5, 6]
```

# [`LispSyntax.jl`](https://github.com/swadey/LispSyntax.jl) (212/2020-02)
JuliaのREPLでLispができるっぽい。
```julia
jλ> (* 2 (reduce + (: 1 6)))
42
jλ> (defn fib [a] 
      (if (< a 2) 
        a 
        (+ (fib (- a 1)) (fib (- a 2)))))
fib (generic function with 1 method)
jλ> (fib 10)
55
```

# [`Pipe.jl`](https://github.com/oxinabox/Pipe.jl) (140/2020-12)
多分、Julia純正のパイプとほぼ同じ。

# 参考 (英語)
- [Functional programming in Julia](https://discourse.julialang.org/t/functional-programming-in-julia/55548/6)
- [Functional Programming Jargon](https://github.com/hemanth/functional-programming-jargon)
- [Functional Programming Packages](https://juliapackages.com/c/functional-programming)
Pug入門【環境構築と基本的な書き方】

## Pugとは
Pugは、HTMLを生成するためのテンプレートエンジンです。Pugを使うことで、HTMLを簡単かつ効率的に生成することができます。


## 基本コマンド
### pugのインストール
```sh
$ npm i pug-cli -g
```

### pugのバージョン確認
```sh
$ pug -V
```

### pug変換
```sh
$ npx pug index.pug
```

### pug変換(改行あり)
```sh
$ npx pug index.pug --pretty
```

## Pugの基本的な書き方
### 変換前のPug
```pug:index.pug
doctype html
html(lang="ja")
  head
    title Pug確認
  body
    include include/_header
    main 
      section 
        h1 見出し
        p 段落
      section 
        h1 見出し
        p
          | 段落
          br
          | 段落
    include include/_footer
```

```pug:include/_header.pug
header
  h1
    a(href="./")
      img(src="logo.png", alt="")
  nav
    ul
      li
        a(href="./") リンク1
      li
        a(href="./") リンク2
      li
        a(href="./") リンク3
```

```pug:include/_footer.pug
footer
  small (c) テストサイト
```
### 変換後のHTML
```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <title>Pug確認</title>
  </head>
  <body>
    <header>
      <h1><a href="./"><img src="logo.png" alt=""></a></h1>
      <nav>
        <ul>
          <li><a href="./">リンク1</a></li>
          <li><a href="./">リンク2</a></li>
          <li><a href="./">リンク3</a></li>
        </ul>
      </nav>
    </header>
    <main> 
      <section> 
        <h1>見出し</h1>
        <p>段落</p>
      </section>
      <section> 
        <h1>見出し</h1>
        <p>段落<br>段落</p>
      </section>
    </main>
    <footer><small>(c) テストサイト</small></footer>
  </body>
</html>
```
css focus-visibleの動作を比べてみた！

## focus-visible? focusと何が違うの？

### focus-visible
> :focus-visible 擬似クラスは、要素が :focus 擬似クラスに一致している時で、ユーザーエージェントが要素にフォーカスを明示するべきであると推測的に判断した場合に適用されます (多くのブラウザーではこの場合、既定で「フォーカスリング」を表示します)。
このセレクターは、ユーザーの入力方法 (マウスなのかキーボードなのか) によって異なるフォーカス表示を提供したい場合に便利です。

キーボード操作でTABを押してブラウザを操作する時に反応します。

### focus
> :focus は CSS の擬似クラスで、フォーカスを持っている (フォームの input のような) 要素を表します。普通はユーザーが要素をクリックやタップをしたり、キーボードの Tab キーで選択したりしたときです。

キーボード操作でTABを押してブラウザを操作する時に加え、マウスでクリックした時も反応します。



:::note info
focus-visibleは、
キーボードを使用しているユーザーにだけfocusされた箇所を目立つようにしたい！
という時に便利です。
:::

やってみます。

<p class="codepen" data-height="600" data-default-tab="html,result" data-slug-hash="MWqEoev" data-user="TTTMMMM" style="height: 600px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/TTTMMMM/pen/MWqEoev">
  focus sample</a> by TM (<a href="https://codepen.io/TTTMMMM">@TTTMMMM</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

buttonタグ、aタグ、divタグ、spanタグを用意しました。
*divとspanはlabelで囲ってみました。

## まずは要素をクリックしてみてください！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129861/8c3391ba-5e89-18b5-86c9-ddff665a8931.gif" width="200">

focusが当たっている箇所は、 `周りが反応しました!!`
それに比べ、 focus-visible はクリックしても周りは反応しません。 なるほど。
divとspanは無反応。。。

## 続いてtabキーで選択してみてください。

この辺りの何もない箇所をクリックしてから、tabキーを押し始めるのが良いかと思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129861/1c487b97-bcf3-2ae0-a9b1-44233abeb41f.png" width="200">

<br>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129861/1ea39844-76e1-a091-ed37-b6c207ff8994.gif" width="300">

focusが当たっている箇所、focus-visible共に、`周りが反応しました!!`
divとspanはやっぱり無反応。。。


## まとめ

focus-visibleとfocusの違いを確認していきました。
divやspanのfocusの当たらなさも確認いただけたかと思います。

何らかの理由でマウスを使うことができないユーザーはたくさんいます。
アクセシビリティの高いサイトを作れるよう、学びを続けましょ！



---

参考
focus-visible
focus

https://developer.mozilla.org/ja/docs/Web/CSS/:focus-visible

https://developer.mozilla.org/ja/docs/Web/CSS/:focus
colab で pip install openai が失敗する問題の対処


# 問題
以下のエラーが出て `pip install openai` が失敗する。
```shell
!pip install openai

Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Collecting openai
  Downloading openai-0.27.1.tar.gz (57 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 57.3/57.3 KB 1.9 MB/s eta 0:00:00
  Installing build dependencies ... done
  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─> See above for output.
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  Getting requirements to build wheel ... error
error: subprocess-exited-with-error

× Getting requirements to build wheel did not run successfully.
│ exit code: 1
╰─> See above for output.

note: This error originates from a subprocess, and is likely not a problem with pip.
```

# 解決法
`pip install openai` を以下に置き換えれば OK
```
!pip install --upgrade pip
!pip install setuptools wheel
!pip install openai
```
Next.js とmui/Material-UIのLinkを併用する

# Next.js とmui/Material-UIのLinkを併用する

## Next.jsとmuiのLinkが上手くいかない

```tsx
import NextLink, { LinkProps } from 'next/link'
import { Link as MuiLink } from '@mui/material'

import React, { ReactNode } from 'react'

type Props = {
  linkProps: LinkProps
  children?: ReactNode
  target?: string
  rel?: string
}

const Link: React.FC<Props> = ({ linkProps, children, target, rel }) => {
  return (
    <NextLink href={linkProps.href} passHref>
      <MuiLink
        target={target}
        rel={rel}
      >
        {children}
      </MuiLink>
    </NextLink>
  )
}

export default Link
```

このようにNextLinkの子要素としてMuiLinkをしようとすると下記のようなエラーが発生すると思います。
`
Warning: validateDOMNesting(...): <a> cannot appear as a descendant of <a>.
`
このエラーはaタグの子要素としてaタグがあるのダメだよっていうエラーです。


なぜそうなるかというと`next/link`がいつかのアップデートにより子要素をaタグでラップするといった仕様になったからなのです！

そのため、現在ではこの書き方に追加して、`legacyBehavior`プロパティを追加してあげる必要があります。[next公式](https://nextjs.org/docs/api-reference/next/link#if-the-child-is-a-tag)

##  Next.jsとmuiのLinkが上手くいく
```diff_tsx
import NextLink, { LinkProps } from 'next/link'
import { Link as MuiLink } from '@mui/material'

import React, { ReactNode } from 'react'

type Props = {
  linkProps: LinkProps
  children?: ReactNode
  target?: string
  rel?: string
}

const Link: React.FC<Props> = ({ linkProps, children, target, rel }) => {
  return (
-    <NextLink href={linkProps.href} passHref>
+    <NextLink href={linkProps.href} passHref legacyBehavior>
      <MuiLink
        underline='none'
        target={target}
        rel={rel}
      >
        {children}
      </MuiLink>
    </NextLink>
  )
}

export default Link
```

### おまけ
このlinkコンポーネントの使用方法

```tsx
 <Link linkProps={{ href: '/' }}>ホーム</Link>
//別タブでの表示
 <Link linkProps={{ href: '/' }} target='_blank' rel='noopener noreferrer'>ホーム</Link>

```
Reactのプロジェクト作成の所で実行が無効と出た...解決法

---
React(v18)でプロジェクトを作成しようとしたら「のシステムではスクリプトの実行が無効に。。。」の解決法
---

こんにちはchihiroです。
Reactで初めてプロジェクトの作成を行うためにwindowsのターミナルで >create-react-app reactProject と実行しましたがターミナルに怒られる事態となりなした。

今回このようなエラーのケースは初めてなので質問にお答えするのは難しいかもしれませんが、私が解決できた方法を以下に記していきますので、同じ状況の方のお役に立てれば幸いです。

----

vscodeのターミナルでプロジェクト実行すると以下の
様なエラーが出現。

```
create-react-app : このシステムではスクリプトの実行が無効になっているため、ファイ 
ル C:\Users\NCh\AppData\Roaming\npm\create-react-app.ps1 を読み込むことができま 
せん。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlin 
k/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ create-react-app reactProject
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException   
    + FullyQualifiedErrorId : UnauthorizedAccess
```

ググって解決法を調べてみると、Set-ExecutionPolicyというコマンドで>Set-ExecutionPolicy RemoteSignedと実行させると実行ポリシー(?)というものが変更されて、プロジェクトが問題なく作成されるという風に書いてありました。
Set-ExecutionPolicy、私は聞いたこともないド素人だったので、間違いがないように実行ポリシーについてのMicrosoftドキュメントを貼っておきます。
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.3

> Set-ExecutionPolicy RemoteSigned 

しかし、上記を実行させるとまた新しいエラーが出現しました。これを実行させたら解決した方もいると思います。

```
rShell\1\ShellIds\Microsoft.PowerShell' へのアクセスが拒否されました。 既定 (Loca 
lMachine) のスコープの実行ポリシーを変更するには、[管理者として実行] オプションを 
使用して Windows PowerShell を起動してください。現在のユーザーの実行ポリシーを変  
更するには、"Set-ExecutionPolicy -Scope CurrentUser" を実行してください。
発生場所 行:1 文字:1
+ Set-ExecutionPolicy RemoteSigned
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (:) [Set-ExecutionPolicy], Unaut  
   horizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.Power  
   Shell.Commands.SetExecutionPolicyCommand
```

エラーの説明を見ると、PowerShellでExecutionPolicyの変更をしてくださいという様に書かれているため、管理者として実行を押してPowerShellを起動しました。

もう一つエラー文では「"Set-ExecutionPolicy -Scope CurrentUser" を実行してください。」と書かれていたため、PowerShellでこれを実行したところ、次に値を指定するよう指示されました。ここにRemoteSignedと打ち実行。

```
コマンド パイプライン位置 1 のコマンドレット Set-ExecutionPolicy
次のパラメーターに値を指定してください:
ExecutionPolicy: RemoteSigned
```

次に実行ポリシーを変更するか否かの確認が出てきました。ここでYを打ちEnterを押す。

特にエラー文が出てこず処理が完了したようなので、
vscodeの方のターミナルに戻り再び> create-react-app sample-reactを実行してみる

```
Creating a new React app in C:\Users\NCh\ReactLesson\react-guide-material\react-guide-material\reactSample

Installing packages. This might take a couple of minutes.
Installing react, react-dom, and react-scripts with cra-template...
```

プロジェクト作成中と出ているため成功したようですね！
最後に`Happy hacking!`とターミナルに出れば、問題なくReactのプロジェクトが作成された状態だと思います。

---
以上がReactのプロジェクト作成の際のエラーの解決法でした。
[Ruby]nil.to_sがfrozen stringを返すので、対策を色々考えてみる

Rubyで`nil.to_s`と叩くといわゆる空文字(`""`)が返却されます。
しかし、Ruby 2.6以前と2.7以降では微妙に扱いが違い、2.7以降ではfrozen stringが返るようになりました。

これは[Ruby2.7のリリースノート](
https://www.ruby-lang.org/ja/news/2019/12/25/ruby-2-7-0-released/)にも書かれています。

>Module#name, true.to_s, false.to_s nil.to_s は常にfrozenな文字列を返すようになりました。返された文字列は常に同じオブジェクトとなります。 [Experimental] [Feature #16150]

なので、下記のようなコードの場合、変数`s`はnilが入るとエラーになります。

```ruby
def gsub_hoge_fuga(s)
  s.to_s.gsub!('hoge', 'fuga') # s = nilだと can't modify frozen String: "" (FrozenError)
end
```

では、どのようにしてエラーを回避するかを上記の例をもとに考えてみましょう。

## そもそもnilのときに関数を呼ばないようにする

これは単純ですね。

```ruby
replaced_string = gsub_hoge_fuga(s) unless s.nil? # ActiveSupportが入ってるならblank?をとかempty?とかでもいいかも

def gsub_hoge_fuga(s)
  s.to_s.gsub!('hoge', 'fuga') # s = nilだと can't modify frozen String: "" (FrozenError)
end
```

`nilの時エラーが起きるとわかっているなら、nil入れなければいいじゃない`というストロングスタイルです。
自分も一人で趣味開発してる時は、何も考えずにこうしてしまうかもしれません。
書いているコードの用途にもよりますが、他の人がこの関数を使おうとした時にnilが混入するリスクを減らすために、yardを書いてあげるなどの動きをしておくともっと良いかもしれません。

## dupを使う

```ruby
def gsub_hoge_fuga(s)
  s = s.to_s.dup
  s.gsub!('hoge', 'fuga')
end
```

dupはオブジェクトの参照値をコピーして新しくオブジェクトを作成するメソッドですが、dupで生成されたオブジェクトはfreezeされていません。
なのでdupで生成されたオブジェクトには心置きなくgsub!をすることができます。

```ruby
irb(main):025:0> s = nil.to_s
=> ""
irb(main):026:0> s.frozen?
=> true
irb(main):027:0> t = s.dup
=> ""
irb(main):028:0> t.frozen?
=> false
```

## そもそもgsub!ではなくgsubを使う

```ruby
def gsub_hoge_fuga(s)
  s.to_s.gsub('hoge', 'fuga')
end
```

そもそも今回のケースだと、置換して終わりなので破壊的メソッドであるgsub!を無理に使わなくてもgsubで事足りる場合も多いでしょう。
gsubとgsub!の違いを理解して使いわけをするようにしましょう。

## early returnする

```ruby
def gsub_hoge_fuga(s)
  return '' if s.nil?
  s.to_s.gsub!('hoge', 'fuga')
end
```

このケースだとnilだけ例外処理を挟んでしまうのもいいでしょう。gsubしても置換は起きないので、`''`を返すことでRuby2.6以前の動作になります。

## +@を使う

```ruby
def gsub_hoge_fuga(s)
  (+s.to_s).gsub!('hoge', 'fuga')
end
```

+以降に記載されたオブジェクト(上記の例だと`s.to_s`)がfreezeされているかを検査し、freezeされている場合、複製を返してくれます。
カッコがないと、`s.to_s.gsub!`まで実行されてからfreezeかどうかを判定する、という処理になりエラーになるので注意しましょう。

https://docs.ruby-lang.org/ja/latest/method/String/i/=2b=40.html

## まとめ
この記事を書いたきっかけは[ruboty-slack_rtm](https://github.com/rosylilly/ruboty-slack_rtm)というgemに、同様のエラーでひっかかって[パッチを送った](https://github.com/rosylilly/ruboty-slack_rtm/pull/48)ことでした。
一つのエラーを解決するためにサッと並べただけでもこれだけの解決方法があるあたり、Rubyは相当柔軟な言語だなと感じました。
また、上にあげた方法以外にもあると思うので、その時その時でベストエフォートを考えるようにしたいです。
Raspberry PiでSANE対応ドキュメントスキャナをAirScan対応にする

# 目的
[AirSane](https://github.com/SimulPiscator/AirSane) を使用し、SANE対応スキャナをApple AirScan (eSCL)対応にして、Apple製品はもちろんの事、WindowsやLinux、ChromeOSやAndroidクライアント等からLAN内で共有できるようにした。
(従来の、Sane + xinetd ではChromeOSからアクセスができない)
なお簡易的なWebUIもある。

## 前提条件・必要な物
* Raspberry Pi (or Linuxが動く適当なSBC。今回はRaspberry Pi3 でRaspberry Pi OS 64bitを使用)
* SANE対応スキャナ (今回はCanon MP490を使用)
* 適当なSSHクライアント(Optional)

## 手順
1. Raspberry Piをインストールする (既に多数の記事があるので割愛)
1. SANEのセットアップ
    1. まずは `$ sudo apt install sane sane-utils ` でSANEとsane-utilsをインストール
    1. 一旦ここでラズパイにスキャナを接続して、スキャナが正常に認識され、動作しているか確認する
    ```shell-session
    $ scanimage -L                               #認識しているか確認
    $ scanimage --format=png > test.png          #正常にスキャン出来るか確認
    ```
1. [AirSane](https://github.com/SimulPiscator/AirSane) のダウンロード & ビルド (公式文書の手順を多少整理)
```shell-session
$ sudo apt-get install libsane-dev libjpeg-dev libpng-dev \         #依存関係とビルドに必要な物一式のインストール
  avahi-daemon libavahi-client-dev libusb-1.*-dev \
  git cmake g++

$ git clone https://github.com/SimulPiscator/AirSane.git            #ソースコードの取得
$ mkdir AirSane-build && cd AirSane-build
$ cmake ../AirSane
$ make && sudo make install

$ sudo systemctl start airsaned                                     #airsanedの開始
(ここで各々のクライアントから正常に接続出来て、スキャン出来るかを確かめる.)
(適当なブラウザから http://らずぱいのIPアドレス:8090/ にアクセスできることも確かめる)

$ sudo systemctl enable airsaned                                    #airsanedサービスを有効にする
```

# 参考
* [AirSane](https://github.com/SimulPiscator/AirSane) :ガンマ値の調整やscanbdとの併用方法、トラブルシュートについても記載されているので一読を推奨。
Vuetifyでフォント設定したら死んだ話

# 症状
Vuetifyでフォントを設定したらiOSでの表示がおかしくなりました．
WindowsでもAndroidでも何ならMacでも大丈夫でした．
iOSの場合にブラウザにかかわらず何度も再読み込みしたり動作がすごく遅くなったりしました．

# 原因
不明です
誰か突き止めてください
めちゃめちゃに悩んだので記事にしました

# 環境等
こんな感じ

Windows11
"nuxt": "^2.16.2",
"vue": "^2.7.14",
"vuetify": "^2.6.12"

# 解決法
通常Vuetifyでフォントを変更する場合「variables.scss」にこんな感じで書くと思います．

```scss
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400&display=swap');
$body-font-family: 'Noto Sans JP';
```

でもこの書き方をするとiOSでおかしくなりました
で，「nuxt.config.js」でこんな感じで読み込んで解決しました．

```javascript
 link: [
    {rel: 'preconnect', href: `https://fonts.googleapis.com`},
    {rel: 'preconnect', href: `https://fonts.gstatic.com`, crossorigin: true},
    {
        rel: 'stylesheet',
        href: `https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@400&display=swap`
    },
]
```

# 考察
普通に謎です．
そもそもほぼ完成してから気付き，どうせ原因はライブラリだろ，と思っていたのでびっくりしました．

で，気になる箇所はこの辺かな

```javascript
vuetify: {
    customVariables: ['~/assets/variables.scss'],
    treeShake: true,
    ...
}
```

詳しくはないので適当書きますが，cssが非同期読み込みなのに対し，importは同期的に読み込む？のかな？
で，Vuetifyで「treeShake: true」にするとどうやら使わないコンポーネントなどを排除してくれるらしい
ですが
例えばこのフォント使ってねえな，いらんな，と排除していたのにフォントを使いだしたら，あるはずのフォントがなかったら，バグる？又は毎回フォントを呼びに行く？

ページがめちゃめちゃ重くなるので呼びに行ってる説はあるのだろうか
「treeShake: true」がフォントの1文字1文字を見ている気はしないし，そもそもフォントが見つからなければ代価を使うだけだと思うけども

取り合えず大変に苦労したので謎だらけだけど共有しました．

未だにVue2系を使ってるのは，仕事なのと思想からです

以上
MySQLで稼働するRuby on Rails で Ransack を使った全文検索(fulltext search)の実装

# やりたいこと
会社 `Corporation` を会社名 `name` というフィールドで全文検索したい


# やるべきこと

## 1.全文検索インデックスを貼る

```ruby:db/migrate/00000000000000_add_index_to_corporations.rb
class AddIndexToCorporations < ActiveRecord::Migration[7.0]
  def up
    execute 'CREATE FULLTEXT INDEX `index_corporations_on_name` ON corporations  (name) WITH PARSER ngram'
  end

  def down
    execute 'ALTER TABLE corporations DROP INDEX `index_corporations_on_name`'
  end
end
```

`WITH PARSER ngram`を指定する必要があるので`add_index :corporations, :name, type: :fulltext`ではダメです。

## 2. Ransackの条件を定義します

下記のように`name_cont`を検索条件としています。
```
        = search_form_for @query, url: search_corporations_path do |f|
          = f.input :name_cont, label: false,placeholder: '社名で検索'
```

以下のようにモデルにScopeを追加して`ransackable_scopes`を使いRansackに渡してください。

```ruby:models/corporation.rb
  scope :name_cont, ->(name) { where('match (`name`) against (?)', name) }

  def self.ransackable_scopes(_auth_object = nil)
    %i[name_cont]
  end
```
指定の範囲で、指定の個数のランダムな数字をPython One Linerで生成する

# What's?

タイトルどおりということで、メモ。

# 環境

```shell
$ python3 -V
Python 3.10.6
```

# やり方

`random`と`for`の組み合わせで。

https://docs.python.org/ja/3.10/library/random.html

```shell
$ python3 -c 'from random import randint; [ print (randint([最小], [最大])) for num in range([個数])]'
```

例、10から30までの範囲で、20個の数字を出力。

```shell
$ python3 -c 'from random import randint; [ print (randint(10, 30)) for num in range(20)]'
14
30
10
24
16
30
10
24
15
18
29
22
19
12
27
27
28
16
26
20
```

ユニーク性は考えてません。
ChatGPT+FastAPIによる簡易問い合わせAPI 作成

* ChatGPTとFastAPIを使って簡単な問い合わせAPIを作成したのでメモする。



## 事前準備

* ChatGPT APIキー取得

  * [OpenAI](https://openai.com/blog/openai-api)アカウントを作成し、APIキーを取得する

* Python OpenAI、FastAPI系ライブラリをインストールする

  ```shell
  pip install openai fastapi uvicorn
  ```



## コード

* `main.py`

  リクエストボディに指定された質問文をChatGPTライブラリに渡し、回答をレスポンスとして返却する

  ```python
  from pydantic import BaseModel
  from fastapi import FastAPI
  import openai
  
  openai.api_key = "{取得したAPIキーをセットする}"
  
  app = FastAPI()
  
  
  # リクエストボディ定義
  class Question(BaseModel):
      content: str
  
  
  
  @app.post("/question")
  def question(question: Question):
      response = openai.ChatCompletion.create(
          model="gpt-3.5-turbo",
          messages=[
              {"role": "user", "content": question.content},
          ],
      )
      return {"answer": response.choices[0]["message"]["content"].strip()}
  
  ```

  



## 動作確認

* API起動

  ```shell
  uvicorn main:app --reload --port 8091
  ```

* リクエスト

  ```http
  POST /question HTTP/1.1
  Host: localhost:8091
  Content-Type: application/json
  Content-Length: 39
  
  {
      "content":"メジャーリーグは何チームありますか"
  }
  ```

* レスポンス

  ```json
  {
      "answer": "現在、メジャーリーグには30チームあります。15チームがアメリカンリーグに属し、残りの15チームがナショナルリーグに属しています。"
  }
  ```

  

## 参考情報

* https://platform.openai.com/docs/guides/chat
データベースを基本からまとめてみた【SQL入門】

## データベースとは？
- データベースを一言で表現するならデータの貯蔵庫です。
- データベースは常に変化する。どのように処理をするかと言うアルゴリズムの部分は、Javaなどのアプリケーションにデータの部分はデータベースにそれぞれ切り分けて管理する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/e2fe455b-c863-55ba-d45a-40c72036f9ac.png)

## クエリとは？
データベースに対する命令文のこと。

```
①SELECT この列（項目から取り出す）
②FROM この表（テーブル）から
③WHERE この条件で
;(最後はセミコロンで締める)

※② ⇨ ③ → ① の順序で目を通す
```
## JOINとは？
２つのテーブルを結合すること

```
JOIN句：結合条件に当てはまるものだけをリストアップ（当てはまらないものを除外する）

SELECT この列（項目から取り出す）
FROM テーブル名（表A）
JOIN 繋げるテーブル名（表B）
ON 繋げる条件
```


## テーブル
- データベース内は複数の表のようなもので構成されていて、この表のようなものを『テーブル』と言い、意味的なまとまりを持ったデータを整理・管理する。

- テーブルにおける行のことを『レコード』、列のことを『カラム』、1つ1つのデータのことを『フィールド』と言う。

- データベースで管理するデータはプログラミング同様に型を持つ。型はカラムごとに設定可能で、以下のようなものがある。
○ 整数型　INT、BIGINTなど
○ 小数点数型 DOBULE,FLOAT
○ 文字列型　CHAR VARCHAR
○ 日時系　DATE TIMESTAMP

- 型以外にもカラムごとに設定できる代表的なもの
○ 主キー(PRIMARY KEY)・・・データの整合性を守るための制約。カラム内でデータの重複とNULL（データなし）を認めない。
○ NOT NULL・・・カラム内でNULL（データなし）を認めない。

## 主キー(PRIMARY KEY)の重要性
- レコードを一意に識別可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/7ddbaa99-6727-60a2-e721-7a4b0225162e.png)

## データベース管理システム（DBMS） 
- データベースの管理を専門で行うソフトウェアを『データベース管理システム（DBMS：Database Management System）』と言う。データを最適な状態に保つ、Javaなどのアプリケーションからのアクセスに応える等の役割を担う。
○ データ操作<br/>アプリケーションから要求されたデータ操作（検索・挿入・更新・削除）を実行
○ データの整合性の維持<br/>不正なデータやデータ同士の関係性が崩れないようにチェックする。
○ 復旧障害<br/>データベースに障害が発生した時に回復処理を行う
○ 機密保護<br/>セキュリティを設けることで不正アクセスやデータの破壊を防ぐ
○ 同時実行制御<br/>複数のユーザーが同時に同じデータにアクセスすることを防ぐことでデータに矛盾が生じることを未然に防ぐ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939638/5bc6424b-59f8-266f-0475-e002ca2bf6b5.png)

## RDBMS
- テーブルを繋いだデータ同士の結び付きのことをリレーションシップと言う。またこのリレーションシップを保持することで、複数のテーブル同士を関連付けて管理するDBMSのことを『RDBMS(Relational DataBase Management System)と言う。

- オープンソースで一般的なRDBMSとしてMySQLやPostgreSQLが挙げられ、小規模なアプリで頻繁に使用される。
※ 無料で使用可能だが、別料金を支払えばサポートも受けられる

## RDBMSの構築と利用
- RDBMSにおいて複数のテーブルを管理する領域を『スキーマ』といい、データベースの構築はスキーマを作るところから始まる






## 参考サイト
[【SQL】未経験者もこれ一本でOK！MySQLで学ぶ「SQL」「データベース基礎」講座【プログラミング初心者向け】](https://www.udemy.com/course/uz-sql-kiso/)
[データベースの用語を理解しよう 「テーブル」「レコード」「カラム」「フィールド」とは？](https://academy.gmocloud.com/know/20160425/2259)
[データベースの構造はどうなっているの？](https://xtech.nikkei.com/it/article/COLUMN/20130416/471169/)
vueでdomの変更を検知する

# 状況
言語選択モーダルを作っていてselectされている初期値を取得したかったのだが、外部ツールで挟んでいるため、class=selectedが描画後に追加されるので、domを監視して変更があったらそのvalueを取得したかった。
dom入れてwatchしても取れなかった。理由わからず。
template
```html
<li v-for="(lang, index) in languages" :value="lang.code"
    :ref="'lang' + index">
```
script
```vuejs
        
<script>
  mounted() {
    // 自分でdom変更して検知されるか
    watchEffect(()=>{
      console.log(this.$refs['lang0'])
    })
  },
</script>
```

# 解決策
MutationObserverという便利なものがあった。
https://developer.mozilla.org/ja/docs/Web/API/MutationObserver
```vuejs
<template>
    <div>{{selectedLang}}</div>
    <div>
      <ul ref="languageList">
        <li class="languageSwtich" v-for="lang in languages" :value="lang.code">
          <span @click="switchLang(lang.code)">{{ lang.name }}</span>
        </li>
      </ul>
    </div>
</template>

<script>
import { ref, onMounted, reactive } from "vue";

export default {
  setup() {
    const languages = reactive([
      { name: '日本語', code: 'ja' },
      { name: 'English', code: 'en' },
      { name: '中国語', code: 'zh'}
    ])

    const selectedLang = ref('日本語')
    const languageList = ref(null)

    onMouned(()=>{
    const observer = new MutationObserver((mutationsList, observer) => {
      for (let mutation of mutationsList) {
        if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
            let code = languageList.value.querySelector('.languageSwitch.selected').attributes['value'] 
            switchLang(code)
        }
      }
    })
    // オプションchildList,subtreeをつけると子要素、孫要素まで検知できる
    observer.observe(languageList.value, { attributes: true, childList: true, subtree: true})
    })
    const switchLang = function (code) => {
        const result = languages
            .filter((item) => item.code === code)
            .map((item) => item.name);
        selectedLang.value = result.length > 0 ? result[0] : null;
    }
    return {
      languages,
      selectedLang,
      languageList,
      switchLang,
    }
  }
}

</script>
```

# 感想

なまじ変更の検知はwatchEffectという固定観念があったせいで、無駄に時間がかかってしまった。
chatGPTに大雑把に「vueで取得したDomの中のクラスが書き換わった時にイベントを発火したい時はどうしたらいい？」と聞いたらこいつを教えてくれた、ありがとうGPT。

※追記
コメントを元に修正
gcloud configの設定を簡易的に切り替える方法

# 概要

今回は`Google Cloud`で使用するCLIの`gcloud`コマンドについて先日学びがあったのでアウトプットしたいと思います。

先日、`Google Cloud`の複数のプロジェクトに対してデプロイ作業を行なっていました。

その際に私は何も考えず、`gcloud config set ~`コマンドを使用して`account`と`project`を都度設定していました。

しかし、その作業が非常に面倒だったので何かいい方法はないかと調査したところいい方法を発見しました。

それは`gcloud`コマンドを使用してあらかじめ設定しておけば、**コマンド1つで設定環境を変更できる**ということです。

# 前提

今回使用する`gcloud`のバージョンは`v392.0.0`です。

# 設定方法

## STEP1 設定環境の作成

まずは設定環境を作成していきます。

下記コマンドで環境名を命名し作成します。今回は`sample1`を命名していますが**任意の命名**をしてください。

```terminal
gcloud config configurations create　sample1
```

実行して下記のようにターミナルで出力されれば作成成功です。

```terminal
Created [sample1].
Activated [sample1].
```

次に環境の`account`と`project`の設定を行なっていきます。

リージョンやゾーンも設定できますが今回は割愛します。

下記コマンドで設定します。

`アカウント名`と`プロジェクト名`は設定したい値を入力してください。

```terminal
gcloud config set account sample1@sample.com
gcloud config set project sample1-project
```

上記コマンドで設定後`gcloud config list`を実行して下記のように`account`と`project`の値が設定した値になっていればOKです。

```terminal
$ gcloud config list

[accessibility]
screen_reader = True
[core]
account = sample1@sample.com
disable_usage_reporting = False
project = sample1-project

Your active configuration is: [sample1]
```

ここまでの工程を作成したい環境分行います。

## 設定環境変更方法

割愛しますが、`sample2`という設定環境も作成したとします。

`gcloud config configurations list`を実行すると下記のような情報が出力されます。

```terminal
$ gcloud config configurations list

NAME: sample1
IS_ACTIVE: True
ACCOUNT: sample1@sample.com
PROJECT: sample1-project
COMPUTE_DEFAULT_ZONE: 
COMPUTE_DEFAULT_REGION:

NAME: sample2
IS_ACTIVE: False
ACCOUNT: sample2@sample.com
PROJECT: sample2-project
COMPUTE_DEFAULT_ZONE: 
COMPUTE_DEFAULT_REGION:
```

`IS_ACTIVE`が`True`なものが現在いる環境です。

なので現在は先ほど作成した`sample1`という環境配下にいることになります。

`sample2`の環境に設定を移行させたい場合は`gcloud config configurations activate <対象の環境名>`を入力します。

```terminal
$ gcloud config configurations activate sample2

Activated [sample2].
```

もう一度`gcloud config configurations list`で環境のリストを表示させてみると

```terminal
$ gcloud config configurations list

NAME: sample1
IS_ACTIVE: False
ACCOUNT: sample1@sample.com
PROJECT: sample1-project
COMPUTE_DEFAULT_ZONE: 
COMPUTE_DEFAULT_REGION:

NAME: sample2
IS_ACTIVE: True
ACCOUNT: sample2@sample.com
PROJECT: sample2-project
COMPUTE_DEFAULT_ZONE: 
COMPUTE_DEFAULT_REGION:
```

`sample2`の`IS_ACTIVE`の値が`True`になっていることが確認できると思います。

これで設定環境の移行完了です。

あとは設定環境を変更したい場合は

`gcloud config configurations activate <対象の環境名>`を実行してあげるだけで変更できます。

# まとめ

いかがだったでしょうか。

正直、いちいち`account`と`project`を設定するのは面倒なのでそれが解決できて楽になりました。

みなさんも是非試してみてください。

最後まで読んでいただいてありがとうございました！
💪 JSChallengerで自分の実力を試してみた

:::note warn
この記事は、2022年11月24日にあった社内勉強会で発表した内容を必要に応じてリライトした内容です
:::

## JS Challenger
https://www.jschallenger.com/

## What this site ?
無料でJavascriptの演習ができるオンライン学習サイト
初級〜上級までのレベルがあるが、ほとんどの上級演習は有料プランへの登録が必要かも（料金プランについては次項に続く）
淡々と演習をこなしていく感じなので、暇つぶしにもってこいだと思う

## JS Callengerを歩いてみる
### ダッシュボード
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/dc0dc22e-827e-4695-43db-283c6508cc18.png)
自分の進捗状況や、演習のピックアップ、みんながよくチャレンジしている演習、みんながハマりやすい演習が一画面に集約されている
マンネリ化してきたらピックアップ演習やハマりやすい演習にチャレンジしたりしてもいいかも

### 料金プラン
無料とはいえすべてではなく、一部有料プランでないとできない演習などがある

有料プランの料金は $10／月
ちょっと強気な値段設定だとは思う（ドル建てだから変動あるし）

<details><summary>有料プランでできること</summary>

- 進捗状況の永久保持
    - たぶん無料プランはcookieで進捗保存しているんだと思う
- すべての演習へのチャレンジができる
- 無制限のヒント
- 解答のカンニング
- 広告なし
</details>

## 💪 実力試し
実際に少しやってみました！
セクションは、

- 変数
- 比較演算子
- 文字列操作
- 条件文
- 関数
- 配列操作
- ループ
- オブジェクト
- 日付操作
- DOM操作

で分かれていて、セクションごとに10問以上演習問題があるという感じ
1セクション半分無料、半分有料っぽい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/389cd02a-72f6-35cb-acc2-9a8acb473084.png)
上記のように、問題文とそのまま実行するとエラー文もしくは期待値以外の結果が出るコードが出てくるので、そのコードを期待値が出るように修正していくという演習

コードを修正して「Run Code」をクリックして、期待値が出たら…👇
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690270/ab547764-d48b-cd74-0d70-75ea95ecd6bd.png)
上記のポップアップが出てきて、他にこんな解答があるよという例を出してくれる
「Next Challenge」をクリックすると、次の演習が出てきて…の繰り返し

## 💪 結果
**上級問題をくれ！（有料プランに課金不可避）**

初級〜中級はわりかし簡単なものが多かった印象、おそらくスクラッチで書かないからかも？
けど、無料でできるボリュームが多いということなのでメリットだと思う

初級演習から順番にやっていくと、中級までの問題の量が多いので少し飽きがちになってしまいそうだけど、「Random Challenge」というのもあるので（級ごちゃまぜ演習）、

    初心者：順番に演習問題
    中級者以上：Random Challengeで淡々と

という遊び方がいいのかなあという感想でした
これからも暇潰しで進めていって、いつかJavascript **"チョットデキル"** になりたいです👩‍💻

https://togetter.com/li/1268851
エンジニア文化祭2023に参加した感想

3/3 [エンジニア文化祭](https://forkwell.connpass.com/event/272596/)という社外イベントに現地させてもらった。

印象に残った話を記録しておこうと思う。

**価値を素早く届けるための改善**

- 時間が出来たらやろうは一生できない。

　　→強制的に立ち止まって改善する習慣をつける。

- 機能が多いだけでは幸福度が上がるとは限らない。
- 開発チーム内で、依存関係を減らすべき。全員が全行程をできるようにするべき。

　→自分の仕事だけをやるのではない。

- マルチタスクをやろうとすると、生産性が下がる。
- 複数プロジェクト兼任は悪影響
- ベテランができるから、と言って人に依存してしまうと、短期的には成果が出るがメンバーが育たない。
- 非難文化をどう改善するか。
- 頼まれた仕事にNoというスキルも必要。

**自動テスト**

- 学習用テストを書く

　@lerning等のタグをつける。

- 疑問をテストにする

　例：異なるタイムテーブルだが同じタイミングの場合どうなるか。

- 開発者主体で受け入れテストを作成・管理し、手元の開発環境で再現できることが大事。
- 自動テストは信頼性が大切。
- テストコードがテストを成していない場合がある。

　ロジックが同じだと、結果が同じになる可能性。

**interface設計**

- interfaceを使うと分岐が劇的に低減し、コードがシンプルになる。
- 要点1：目的単位で抽象化すること
- 要点2：「作る」と「使う」を分けること
- 目的が分かれば課題が分かる

　防犯システムの例：侵入検知目的、通知目的、映像分析目的

- 良くないロジックは、「何を使うかを判断する分岐」と「実行するロジック」が混在している。
- 作って完成されたものを使う、という発想が重要

**感想**

現地参加して凄く刺激になった。多くのエンジニアが参加されていて、実際の熱気や学ぶ姿勢を肌で感じた。

また、日常業務の生産性を上げるためにどうすれば良いか考えなおすきっかけにもなった。

講演の内容としては、難しくイメージを掴めない話もあったが、自分が少しでも携わったことのある領域は理解できることも多く、勉強になった。

これからは、普段の業務だけでなくもっと幅広い視野を持って、学び続けたいと思った。
【SwiftUI】Sliderをカスタマイズする

# はじめに
UIKitでスライダーを触った時にかなり自由度の高くてびっくりしたので、SwiftUIでもできないのか試してみたらできたので記録しておきます。

# 実装
### つまみを変更する
```swift
import SwiftUI

struct ContentView: View {
    @State var value: CGFloat = 50

    init() {
        UISlider.appearance().setThumbImage(UIImage(systemName: "play.fill"), for: .normal)
    }

    var body: some View {
        Slider(value: $value, in: 0...100)
            .padding(20)
    }
}
```
![simulator_screenshot_CABDABA3-6BDA-48CE-9B2E-05404875A488.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/976412ca-81b6-477b-4beb-5790b6c8f78d.png)

### つまみを消す
```swift
import SwiftUI

struct ContentView: View {
    @State var value: CGFloat = 50

    init() {
        UISlider.appearance().setThumbImage(UIImage(), for: .normal)
    }

    var body: some View {
        Slider(value: $value, in: 0...100)
            .padding(20)
    }
}
```

![simulator_screenshot_7464E88F-878E-4C55-B329-F5769C9AF186.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/276056dc-2df3-3d10-e87f-63bf80ae5522.png)

### つまみの色を変える
```swift
import SwiftUI

struct ContentView: View {
    @State var value: CGFloat = 50

    init() {
        UISlider.appearance().thumbTintColor = .red
    }

    var body: some View {
        Slider(value: $value, in: 0...100)
            .padding(20)
    }
}
```
![simulator_screenshot_DA85668E-C80B-438B-90E4-514781DEBBB0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/3eeea666-0272-776d-21bc-85414b14de3a.png)

### つまみの左側の色を変える
```swift
import SwiftUI

struct ContentView: View {
    @State var value: CGFloat = 50
    var body: some View {
        Slider(value: $value, in: 0...100)
            .tint(.red)
            .padding(20)
    }
}
```
![simulator_screenshot_1950B3B7-22A2-4E72-A9C2-A5C87308FF1C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/6c5c1876-1b1f-bc14-47d9-23fe18c984cf.png)

### つまみの右側の色を変える
```swift
import SwiftUI

struct ContentView: View {
    @State var value: CGFloat = 50

    init() {
        UISlider.appearance().maximumTrackTintColor = .red
    }

    var body: some View {
        Slider(value: $value, in: 0...100)
            .padding(20)
    }
}
```
![simulator_screenshot_BD170954-F914-4909-9BF7-0CD163992968.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/3329de1f-6a4a-e11b-7587-7cb89435526d.png)

# おわり
UIKitを使うことで案外自由に見た目をカスタマイズすることができました。
しかし、副作用が起きる可能性があるのでちゃんと調査してから使うことが必要だと思います。
早くSwiftUIの標準モディファイアで設定できるようになって欲しいです。
SwiftのTestとUITestとは

SwiftのTestとUITestは、iOSアプリケーションの自動化テストのためのフレームワークです。

Testは、単体テストを実行するためのフレームワークです。開発者は、コードの特定の部分を単体テストし、その機能が期待通りに動作しているかどうかを確認することができます。Xcodeには、Test Navigatorと呼ばれるビューがあり、ここでテストを管理し、実行することができます。Testフレームワークには、XCTestというAPIが含まれており、XCTestによってテストの記述、実行、レポートの生成を行うことができます。

UITestは、ユーザーインターフェースの自動化テストを実行するためのフレームワークです。UITestを使用すると、開発者はアプリケーションのインターフェースに関するテストを自動化し、ユーザーの行動をシミュレートすることができます。UITestには、XCUIElementQueryやXCUIElementなどのAPIが含まれており、これらのAPIを使用して、UI要素を検索し、タップしたり、入力したりすることができます。Xcodeには、UI Test Navigatorと呼ばれるビューがあり、ここでUITestを管理し、実行することができます。

これらのフレームワークを使用することで、アプリケーションの品質を向上させ、開発者が新しい機能を追加するたびに手動でテストを実行する必要性を減らすことができます。
仮想環境の違い　まとめ

※2024/08/18 追記
# 仮想環境ってそもそも何？
ロボット開発やプログラミングにはよくUbuntuが使われます．その理由は，使い勝手の良さとか色々あるらしい．しかし，UbuntuはLinux OS上でしか動作しない！

では，UbuntuをWindowsユーザが利用したいときはPCを2台持ちするしかないのか？Windows一台でどうにかするための方法が**仮想環境**です．

仮想環境には以下の3種類あり，それぞれに利点と欠点があります．私はそれを知らずに適当に選んだ結果，途中で使えないことが判明して再構築...3種類全てを経験してしまいました．
* VirtualBox
* WSL
* Docker

ここでは，その反省を踏まえ，私の独断と偏見に基づき各環境の違いを説明していきます．「やりたいことはあるけど，どの環境を使えばいいのかな...？」と悩んでいる人の記念すべき第一歩の助けとなれば幸いです．

# Virtual Box
使用しているPCに仮想環境を構築して、他のOSをインストールすることができる仮想化ソフト．たとえばWindows環境でMacやLinuxなど複数のOSを切り替えて使用することが可能となる．

<table>
  <tr>
    <td> <b>メリット</b> </td>
    <td>
      <ul>
        <li>一度インストールすれば，
            好きなOSを好きなだけ入れることができる</li>
     </ul>
    </td>
  </tr>
  <tr>
    <td> <b>デメリット</b> </td>
    <td>
      <ul>
        <li>仮想環境作成時にCPUとメモリ量を割り当てるので，たくさんの仮想環境を作れば作るほど，PCの動作が重くなる．</li>
        <li>仮想環境が一つでも，使っていくうちに使用メモリがいっぱいになったりして，仮想環境の動作が重くなることがある．</li>
     </ul>
    </td>
  </tr>
</table>

# WSL（Windows Subststem for Linux）
Microsoftが提供するWindows上でLinuxを利用できる機能．LinuxからのシステムコールをWindows APIに変換して使う．

<table>
  <tr>
    <td> <b>メリット</b> </td>
    <td>
      <ul>
        <li>普段のPCとメモリやCPUは共用なので，仮想環境でも普段のPCでも，そのPCの性能を最大限使える（動作が軽い）</li>
     </ul>
    </td>
  </tr>
  <tr>
    <td> <b>デメリット</b> </td>
    <td>
      <ul>
        <li>Microsoft StoreからOSをインストールするので，そこにない種類のOSやバージョンだと使えない．</li>
        <li>CUIメインなので，GUI対応にするのがちょっと面倒くさい 
            >>> wslgの出現により結構楽になった！</li>
        <li>（sshするための）Wifi接続・（センサなどとの）USB接続が少し面倒くさい</li>
     </ul>
    </td>
  </tr>
</table>


# Docker
Virtual boxとWSLとは異なるシステム構成から成るシステム（難しいことは割愛）．Chromeなどのウェブアプリケーションを使って起動することで，CUIもGUIも簡単に利用できる．WSLとコラボするやり方もある．

<table>
  <tr>
    <td> <b>メリット</b> </td>
    <td>
      <ul>
        <li>他二つとはシステムの構成が異なるので，その分動作が軽い</li>
        <li>コンテナと呼ばれるデータに環境情報を保存するので，それさえあれば簡単に色々な人と同じ環境を共有できる</li>
     </ul>
    </td>
  </tr>
  <tr>
    <td> <b>デメリット</b> </td>
    <td>
      <ul>
        <li>ウェブアプリケーションを使うことが多い，オフラインでは使えない</li>
        <li>GUIにするのが難しいらしい．普通はCUI専用．目的のOSのGUIバージョンがネット上にあればGUIでも使える（あるいは自分で作る）</li>
        <li>（sshするための）Wifi接続・（センサなどとの）USB接続が<b>できない</b> 
        >>> その後，特定のUSBカメラは読み込めるようになったが，まだ限定的</li>
     </ul>
    </td>
  </tr>
</table>

# まとめ
どれにも一長一短あるが，実際にロボットを動かしたい！のなら，VirtualBox>>WSL．
Dockerはセンサ接続やssh接続が出来ないので，シミュレーションやコーディング，プログラミング勉強など，実機を動かさないときに使うべき！（初期設定地獄が避けられるので，初心者には非常におすすめ）


# 一覧記事
[ロボット開発のために色々やったこと一覧](https://qiita.com/Karin-Sugi/items/8c930276605a6a39ad2e)
NONLINEAR TIME SERIES ANALYSIS--Method And Applications       Cees Diks     World Scientific

```r

#p.52
#マルコフ連鎖のTime-Reversibleにおける不偏推定量の計算
#確率速度muに対し, H0:mu=P%*%mu の検定

mu0=c(0.1,0.2,0.15,0.15,0.4)
mu0=c(1,0,0,0,0)
P=matrix(c(0.3,0.3,0,0,0,0.2,0.2,0.3,0,0,0.5,0.5,0.2,0.3,0,0,0,0.5,0.2,0.3,0,0,0,0.5,0.7),nrow=5)
d=1
N=100


g=function(r,s){
return(2*(exp(-sum((r-s)^2)/(2*d^2))-exp(-sum((r-P%*%s)^2)/(2*d^2))))  
}


ite=50
mu=mu0
mu_mat=array(0,dim=c(length(mu),ite))
for(i in 1:ite){
mu_mat[,i]=mu
mu=mu%*%P
}


#X=c(X1,X2,X3,X4,X5)
#Xi=sum(ifelse(Xij==i,1,0))/n

#乱数作成
I=10
n=10000
mu=mu_mat[,ite]
mu_sub=mu_mat[,I]
Q=c()
Q_sub=c()
for(i in 1:(N-1)){
for(j in (i+1):N){
vec1=sample(c(1:5),n,prob=mu,replace=T)
vec2=sample(c(1:5),n,prob=mu,replace=T)
vec1=c(vec1,c(1:5))
vec2=c(vec2,c(1:5))
v1=c(table(vec1)/n)-1/n
v2=c(table(vec2)/n)-1/n
Q=c(Q,g(v1,v2))
vec1=sample(c(1:5),n,prob=mu_sub,replace=T)
vec2=sample(c(1:5),n,prob=mu_sub,replace=T)
vec1=c(vec1,c(1:5))
vec2=c(vec2,c(1:5))
v1=c(table(vec1)/n)-1/n
v2=c(table(vec2)/n)-1/n
Q_sub=c(Q_sub,g(v1,v2))
}  
}




hist(Q,col="red" , xlim=c(min(Q),max(Q)), main="stationary_distribution", xlab="Q")
hist(Q_sub, col="blue", xlim=c(min(Q_sub),max(Q_sub)), main="Non_stationary", xlab="Q_sub")

Q=round(Q*10000)/10000

#Q_hat is a Unbiased Estimator
Q_hat=2*sum(Q_sub)/(N*(N-1))

Qdf=data.frame(table(Q))
Qdf=data.frame(Qdf,rate=Qdf$Freq/sum(Qdf$Freq),distribute=cumsum(Qdf$Freq/sum(Qdf$Freq)))



```
M1 mac で"ゼロからのOS自作入門"をdockerで環境構築するにあたって、QEMUでの起動ができない

# ゼロからのOS自作入門の環境構築で詰まった

M1 macでこれをしようと思ったのだが、環境構築でだいぶ詰まった。その際、この方の記事を参考にdockerを使った。

https://www.hamlet-engineer.com/posts/mikanos_00.html

ただ、dockerで起動確認をしようとしたのだが、最後のコマンド
```
qemu-system-x86_64 -drive if=pflash,format=raw,file=$HOME/osbook/devenv/OVMF_CODE.fd -drive if=pflash,format=raw,file=$HOME/osbook/devenv/OVMF_VARS.fd -drive file=disk.img,format=raw,index=0,media=disk
```
で次のエラーが出て、起動できなかった。

```
Unable to init server: Could not connect: Connection refused
gtk initialization failed
```

## 解決方法
docker起動時に、dockerコンテナとホストマシンとのネットワークを共有するように設定する必要があった。具体的には、

.devcontainer/devcontainer.jsonの30~32行目を次のように変えた。
```
	"remoteUser": "vscode",

	"runArgs": [
		"--privileged", "--net=host"
	]
```
つまり、オプションに"--net=host"を加えた。

これで動作確認できた。めでたしめでたし。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733597/0e79e450-8e71-2b40-578b-ac11f9026a38.png)


## 備考
docker以外にも色んなやり方をやってて、これも無理、あれも無理と言っているうちに、気付いたら1日を溶かしていた。1日かけてようやく起動確認できた。ここまで「Hello, world!」の文字列に喜んだのは初めて。
5分で紹介「リーダブルコード」

# はじめに
この記事は
 **「リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック」** を
５分で**この本の魅力や大まかな内容**を理解することを目的とした記事です。

この記事で少しでも興味を持ってこの本を読むきっかけになれば幸いです。

<img width="300" alt="名称未設定のアートワーク 2 (1).jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921163/e2cb194c-22b0-1d84-d205-a335b54f9c7a.jpeg">

# 目次
**・概要
・個人的な感想
・引用**

# 概要
この本は**全237ページ**、**4部12章**の構成になっています。

この本のテーマは「**読みやすいコード**」であり、
目的は「**君のコードをよくすること**」とされています。

内容はテーマや目的に沿った内容になっていて、
一貫して各章で**読みやすいコードをかく方法や、
テクニックを習得する内容**になっています。

読む時間は**１～２週間**が推奨されています。

章立ては難易度の順番になっているが各章は独立していて、
**どの章からでも読み進めることができるようになっています。**

各章には**サンプルコード**が記載されていたり、
**ユニークな挿絵**が入っているなど読みやすくなるような工夫がされています。

説明には**C++,Python,JavaScript,Java**などのプログラミング言語使われているが、
**応用的な機能は使われてない**ので初心者でも読みやすくなっています。


# 個人的な感想
この本を読んでこの本は**プログラミング初心者の人**におすすめできる本だと思いました。

理由は以下の通りです。

**・1~2週間で読むことができる
・理解することが難しい内容が少ない
・読みやすいコードの書き方がわかる
・コードの書き方を矯正できる**

初心者の方のほかにはプログラミングをする際に
**複数人でコードをよくかく方**にもおすすめできる本だと思いました。

なぜなら自分だけが理解しやすいコードではなく、
他の人が見ても理解しやすいようなコードをかくことができれば、
**ミスやトラブルの防止**につながるからです。


# 引用
>リーダブルコード より良いコードを書くためのシンプルで実践的なテクニック
著　DustinBoswell　TrevorFoucher　訳　角征典
2012/6/23

https://store.shopping.yahoo.co.jp/bookfan/bk-4873115655.html?sc_i=shp_pc_search_itemlist_shsrg_title