OmniAICreator/Qiita-1.07M huggingface dataset:
オブジェクト指向を理解するために、プログラミング言語の歴史を整理する

:::note
オブジェクト指向言語は、それ以前のものと全く異なる新しい開発技術ではなく、**それ以前のプログラミング技術を基礎として、その欠点を補うための技術**。

プログラミング技術の工夫と改良の歴史の中で、必然性を持って登場した技術。
:::

## 機械語でプログラムを書いていた黎明期
```
<!--
機械語によるプログラム例
-->
A10010
8B160210
01D0
A10410
```
コンピュータが初めて登場した1940年代の頃はプログラマ自身が上記のような機械語を使って、1行1行プログラムを書く必要があった。

コンピュータの黎明期はこうした機械語を使いこなせる、ごく限られたスーパープログラマだけがコンピュータを操れる時代だったようです。

*※当時のコンピュータは真空管を使って作られており、あまりにも巨大なため、コンピュータを作る前にそれを収納する建物の建設から始めたという話もあり、そんな時代だからこそ、機械語で地道にプログラムを書いても間に合ったのかもしれません。*

## プログラミング言語としての最初の一歩であるアセンブリ言語
```
<!--
アセンブリ言語によるプログラム例
-->
MOV AX, X
MOV DX, Y
ADD AX, DX
MOV Z, AX
```
#### アセンブリ言語の特徴

* 無機質な機械語を人間が分かりやすい記号に置き換えて表現
* **アセンブラ**と呼ばれる別のプログラムに読み込ませてコンパイルすることで機械語を生成する
* アセンブリ言語の登場のおかげで、プログラムが格段に分かりやすくなった

#### アセンブリ言語の課題

* 命令をほんの一つでも間違えるとプログラムは暴走してしまう
* 実行命令を一つ一つ指定するのは煩わしい

## より人間に親しみやすい高級言語
```fortran
<!--
高級言語であるFORTANによるプログラム例
-->

Z=X+Y
```
#### 高級言語の特徴
* より人間に分かりやすい「高級な」形式で表現
* 1957年にFORTAN、1960年にCOBOLが登場

#### 高級言語の課題
* 高級言語の登場により生産性や品質は大きく向上したが、それ以上にコンピュータの普及と発展が爆発的に進み、生産性向上に対するニーズは収まらなかった

※*「ソフトウェア危機」：「20世紀末には世界総人口がプログラマになっても、増大するソフトウェアへの需要に追いつかない」と1960年代後半にNATOで宣言された。*

## 分かりやすさを重視した構造化プログラミング
#### 構造化プログラミングとは
* オランダ人学者エドガー・ダイクストラ氏によって提唱
* 「*正しく動作するプログラムを作成するためには、分かりやすい構造にすることが重要である*」という基本的な考え方
* 具体的な方法として、プログラムを分かりづらくしている元凶である**GOTO文**を廃止して、ロジックを順次進行、条件分岐、繰り返しの3つの構造だけで表現することを提唱

時代が進み、ハードウェア能力が進歩したことから、わずかな実効効率の改善は、システム全体から見れば無駄な努力となり、それよりも分かりやすいプログラムを書くことのほうが重要な課題になっていった。

## 構造化言語の登場
#### 構造化言語とは
* 構造化プログラミング理論に基づくプログラミング言語
* 代表的なものとして、ALGOL、Pascal、C言語がある
* 基本三構造（順次進行、条件分岐、繰り返し）を明示的に記述が可能
* 変数定義を局所化するローカル変数や引数の値渡し機能を提供
* 現在広く使われているJavaやC＋+、C#などは直径の子孫であり、多くの性質を受け継いでいる

## 保守性と再利用性を重視したプログラミング言語の進化の歴史
#### 人間に親しみやすいプログラムを書く
機械語〜アセンブリ言語〜高級言語の進化の歴史では、
プログラミング言語の**表現力向上**、つまり、「コンピュータにやらせたい仕事を、いかに簡単に、かつ人間に親しみやすい方法で表現するか」を追求した進化。

人間に親しみやすいプログラムを書くという目的は、この時代にほぼ達成できた。
一方でそれだけではソフトウェア危機を救うことができなかった。

#### プログラムの寿命
コンピュータが登場した当初は、毎回0からプログラムを作り直していた。しかしソフトウェアに対する要求が膨れ上がり、毎回全てを作り直していては間に合わなくなっていった。

このため出来上がったプログラムに修正を加えながら対応するケースが増えていった。

その結果プログラムの寿命が伸び、プログラミング言語に求められる機能も変化していった。つまり、プログラムを理解するための機能（**保守性向上**）や、複雑さを避け間違いを起こさないようにする機能（**品質向上**）を重視するようになっていった。

また実績のあるプログラムを使い回して全体の生産性を上げること(**再利用促進**)も重要になっていった。

---

参照

https://bookplus.nikkei.com/atcl/catalog/21/S00180/
PhonePricePrediction-Review

# 【第34回_Beginner限定コンペ】携帯電話の機能データからの価格帯分類

# 問題概要
SIGNATE主催のBeginner限定コンペで、下から3段階目のIntermediateに昇格するためのコンペティション

# 結果
個人参加で、246人投稿中30位であった。
Public LBで一定のスコアを達成することが昇段条件であった為、達成を確認後クローズとした。

# 入出力
携帯電話の特徴量（計20個）から価格帯を0から3の間で予測する。
評価指標はF1スコアであり、recallとprecisionの調和平均である。
目的変数が序数であることから自然な評価指標に思える。

入出力のファイルはすべてCSVで、構成としては以下の通り。
- train.csv
- test.csv

目的変数を含めた特徴量を以下の表に示す。

| 列番号 | 列名            | データ型      | 説明                                        |
|-------|----------------|------------|----------------------------------------------|
| 0     | id             | int        | インデックス（識別子として使用）                  |
| 1     | battery_power  | int        | バッテリーの一充電での合計エネルギー容量（mAh）     |
| 2     | blue           | int        | Bluetoothの利用可能性（利用可能な場合は1）        |
| 3     | clock_speed    | float      | クロック速度                                   |
| 4     | dual_sim       | int        | Dual SIMサポートの利用可能性(利用可能な場合は1)    |
| 5     | fc             | int        | フロントカメラのメガピクセル数                    |
| 6     | four_g         | int        | 4Gサポートの利用可能性(利用可能な場合は1)          |
| 7     | int_memory     | int        | 内部メモリ(GB)                                 |
| 8     | m_dep          | float      | モバイルの奥行き(cm)                            |
| 9     | mobile_wt      | int        | 重量                                          |
| 10    | n_cores        | int        | コア数                                        |
| 11    | pc             | int        | プライマリカメラのメガピクセル数                  |
| 12    | px_height      | int        | ピクセル解像度の高さ                            |
| 13    | px_width       | int        | ピクセル解像度の幅                              |
| 14    | ram            | int        | ランダムアクセスメモリ（MB）                     |
| 15    | sc_h           | int        | モバイルの画面高さ（cm）                        |
| 16    | sc_w           | int        | モバイルの画面幅（cm）                          |
| 17    | talk_time      | int        | 連続通話時間                                   |
| 18    | three_g        | int        | 3Gサポートの利用可能性（利用可能な場合は1）        |
| 19    | touch_screen   | int        | タッチスクリーンの利用可能性                     |
| 20    | wifi           | int        | Wi-Fiの利用可能性（利用可能な場合は1）            |
| 21    | price_range    | int        | 価格帯：ターゲット0（低価格）、3（非常に高価格）    |

# データ分析
- データ数の確認：訓練データが1200、テストデータが800
- 欠損の有無：なし
- 分布のヒストグラムの確認

# 使用したモデル
モデルには、LightGBMを使用した。
LightGBMとは、Kaggleで人気の決定木ベースの勾配ブースティングアルゴリズムである。

他にも精度は奮わなかったが、全結合ニューラルネットワーク、最近傍法も実装した。

# 工夫した点
実験を効率的に行う為に、ディレクトリ構成を工夫した。
具体的には、
- 前処理、モデルのモジュール化
- 実験はすべてrun.pyで行うように設計した
- configファイルを実装し、ハイパーパラメータの制御を行う
- 実験結果はログ・モデル・提出ファイルをresultファイルに出力する


# 他参加者から吸収したこと
ディレクトリ構成の考案、昇段することが目的であったためコンペティション終了後のトレース等は行っていない。
そもそもBeginner限定コンペで下から3段階目のIntermediateに昇格するためのコンペティションであり、他解放がそこまで参考になるとも思えなかった。

# ソースコード

https://github.com/rakawanegan/phonepriceprediction_portfolio
【TailwindCSS】:has()を使用する方法

以下のように記述することで`:has()`擬似クラスを使用することができます。

```html

<div class="[&:has(p)]:bg-black">
  <p></p>
</div>

```

## `v3.4.0`以降では

`v3.4.0`以降では`has-[*]`で同様のことが実現できます。

```html

<div class="has-[p]:bg-black">
  <p></p>
</div>

```

https://tailwindcss.com/blog/tailwindcss-v3-4#new-has-variant
【圏論入門】関手の定義と例

# 初めに

　本記事は体系的に圏論を勉強するには不十分です。仕事そっちのけで絶賛圏論勉強中エンジニアが細々と書いているだけです。他に良記事はたくさんあります。そっと戻るボタンを押してください。
 
　前回、圏の定義に関する記事を書きました。

https://qiita.com/oiz-y/items/8147761a99e81403e518

　圏の定義について振り返ります。圏とは

- 対象
- 対象間の射と呼ばれる矢印
- 射の合成と呼ばれる射
- 恒等射

からなり、射が結合法則と単位法則を満たすものをいいました。

　今回は関手について書きます。関手は圏と圏の対応に関する概念です。今回も『[哲学者のための圏論入門](https://choreographlife.jp/pdf/intro.pdf)』を参考に関手の背景について紹介します。また『[ベーシック圏論](https://www.amazon.co.jp/dp/4621300709)』も参考にしています。

 # 関手とは何か

　関手の導入部分を『[哲学者のための圏論入門](https://choreographlife.jp/pdf/intro.pdf)』から引用します。

> ここまではずっと、ひとつの圏 $\textbf{C}$ を固定してその中でいろいろと新しい対象を定義してきたわけですが、今度は一段視野を拡げて、圏と圏の間の関係性、さらには圏と圏の間の関係性の間の関係性を記述する言葉を用意するわけです。それが、関手（functor）であり自然変換（natural transformation）です。

圏と圏の間の関係性を記述するものが関手です。『[ベーシック圏論](https://www.amazon.co.jp/dp/4621300709)』からも関手について引用します。

> 圏論の一つの教訓は、新しい数学的対象に出くわすたび、それらの間の理にかなった「射」の概念が存在するかをつねに問うてみるべきだということである。これを圏そのものについて適用してみよう。その答えは肯定的で、圏の間の射は関手と呼ばれている。

それらの間の理にかなった「射」の概念が存在するかをつねに問うてみる、と述べられている通り、圏論では矢印が主役です。

 # 関手の定義

:::note
**定義（関手）**
　$\mathscr{A},\ \mathscr{B}$ を圏とします。関手 $F:\mathscr{A}\to \mathscr{B}$ とは、次のような対応を備えています。

 - $\mathscr{A}$ の対象 $A$ を $\mathscr{B}$ の対象 $F(A)$ にうつす対応
 - $\mathscr{A}$ の対象 $A,\ A'$ に対して、射 $f:A\to B$ を $\mathscr{B}$ の射 $F(f):F(A)\to F(B)$ にうつす対応

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/95e4fbcd-6a0d-9d79-7a03-55af7076bb0c.png)

この $F$ は次を満たします。

- $\mathscr{A}$ の対象 $A,\ A',\ A''$ と射 $f:A\to A',\ f':A'\to A''$ に対して $$F(f'\circ f) = F(f')\circ F(f)$$

- $\mathscr{A}$ の対象 $A$ に対して $F(1_A) = 1_F(A)$

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/34544d0b-398b-8e7d-1ae3-8623b54cf37f.png)
:::

## 関手の例

　関手の例を挙げてみたいと思います。

### 例 1

　$k\in \mathbb{N}$ を 1 つ固定します。任意の $i\in \mathbb{N}$ に対して、$A_i := \lbrace i\rbrace,\ B_i := \lbrace i^k\rbrace$ と定めます。$A_i,\ A_j$ の間の射を $f_{ij}:A_i\to A_j$、$B_i,\ B_j$ の間の射を $g_{ij}:B_i\to B_j$ とします。$\mathscr{A}$ を $A_i$ を対象とする圏、$\mathscr{B}$ を $B_i$ を対象とする圏とします。$F:\mathscr{A}\to \mathscr{B}$ を
$$F(A_i):=B_i,\ F(f_{ij}):=g_{ij}$$ と定めることで $F$ は関手となります。このことを確認します。
$$F(f_{jk}\circ f_{ij}) = F(f_{ik}) = g_{ik} = g_{jk}\circ g_{ik} = F(f_{jk})\circ F(f_{ij})$$ となります。また
$$F(1_{A_i}) = F(f_{ii}) = g_{ii} = 1_{B_i} = 1_{F(A_i)}$$ となります。したがって $F:\mathscr{A}\to \mathscr{B}$ は関手です。

### 例 2

　例 1 では対象が集合であり、射が写像になっているので、internal な視点に立っている感じがします。そこで次のように external な視点に立ってみます。

　任意の $i\in \mathbb{N}$ に対して、$\mathscr{A}$ を $A_i$ を対象とする圏、$\mathscr{B}$ を $B_i$ を対象とする圏とします。$A_i,\ A_j$ の間の射を $f_{ij}:A_i\to A_j$、$B_i,\ B_j$ の間の射を $g_{ij}:B_i\to B_j$ とします。$F:\mathscr{A}\to \mathscr{B}$ を
$$F(A_i):=B_i,\ F(f_{ij}):=g_{ij}$$ と定めることで $F$ は関手となります。このことの確認は例1と同様です。

　この例では、$A_i, B_i$ は集合である必要はないし、$f_{ij}$ は写像である必要はありません。

### 例 3


　例 2 において、添え字だけに着目します。すなわち、$\mathscr{A}$ の対象 $A_i$ を $i$、$\mathscr{B}$ の対象 $B_i$ を $i$、射を $i\to j$ と考えます。すると、$\mathscr{A}$ と $\mathscr{B}$ はそれぞれ $\mathbb{N}$ になり、$F$ は $\mathbb{N}$ から $\mathbb{N}$ への関手となります。さらに
$$F(i) = i,\ F(i\to j) = i\to j$$ となります。自明な関手になりました。『[圏と関手入門](https://www.math.nagoya-u.ac.jp/~hasimoto/paper/class/cat10.pdf)』によると、これを恒等関手と呼ぶそうです。
【AWS - IAM】DescribeInstancesアクションを特定のリソースに対して設定する


## やったこと

AWSのIAMでEC2のDescribeInstancesアクションを特定のリソースに対して設定した。

```
"Action": "ec2:DescribeInstances",
"Resource": "arn:aws:ec2:xxxxxx:xxxxx:*"
```

## エラー内容

This policy defines some actions, resources, or conditions that do not provide permissions. To grant access, policies must have an action that has an applicable resource or condition.

## 原因

DescribeInstancesは特定のリソースに対してのみ実行するということができない。


## 解決法

全てのリソースを指定する。

```
"Action": "ec2:DescribeInstances",
"Resource": "*"
```


## 参考

- [特定の EC2 インスタンスのみを表示させる IAM ポリシーの権限設定は可能ですか？](https://dev.classmethod.jp/articles/tsnote-restrict-describe-ec2-iam/)
【Django】「...doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS」エラーについて

# エラー内容
DjangoでDBからデータ取得するモジュールを実行させたら、以下のエラーになりました。

```
RuntimeError: Model class sample.models.Sample doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
```

# 原因と解決策
`Sample`モデルがDjangoアプリケーションに正しく登録されていないか、`app_label`が指定されていない、と言われています。アプリケーションの登録は`settings.py`の`INSTALLED_APPS`で行いますが、ここには記載済みでした。

`app_label`というのをモデルに明示的に記載することで解決した、という記事もあったので、参考にしてみたら解決しました。

通常、Djangoはモデルの所属アプリケーションを自動的に判断してくれますが、一部の状況では自動判断できない場合があります。例えば、今回私はアプリケーションディレクトリの外で、データ取得のコマンドを叩くモジュールを試験的に置いていました。そのため、Djangoがどのアプリケーションに属するかを正確に判断できなかったのでしょう。

ということで、以下のように`app_label`を追記。

```models.py
from django.db import models

class Sample(models.Model):

    class Meta:
        app_label = 'sample'　# ここを追加
        db_table = 'sample'
```

`app_label`の値は、`INSTALLED_APPS`内のDjangoアプリケーション名と一致する必要があります。
フロントエンド勉強会資料

フロントエンド勉強会資料です。

全体を通しての資料

- [jsprimer](https://jsprimer.net/)
- [サバイバルTypeScript](https://typescriptbook.jp/)
- [MDN JavaScript](https://developer.mozilla.org/ja/docs/Web/JavaScript)
- [MDN HTML](https://developer.mozilla.org/ja/docs/Learn/HTML)

# 一覧

1. [TypeScript基礎](https://qiita.com/masayasviel/private/1140a6b31acdd5f4d3e3)
    - [Objectのプロパティ定義方法](https://qiita.com/masayasviel/items/2ffe7c342400d53522be)
2. [DOM操作](https://qiita.com/masayasviel/private/216bf3d06e59597b0fcc)
3. [タイピングゲームを作成](https://qiita.com/masayasviel/items/d30d19af7ba77ed9a316)
4. [ToDoアプリを作成](https://qiita.com/masayasviel/private/577020381900c529a1cc)
5. [Vue.jsハンズオン](https://qiita.com/masayasviel/private/c0b8f1bff98aba2dd91e)
6. [Vue.jsでToDoアプリを作成](https://qiita.com/masayasviel/private/6012d37f71ae40cb6141)
7. [storybookでのコンポーネント管理](https://qiita.com/masayasviel/private/588cc06aa88071b1caa1)
データベース(DB)とは何か?

### 1. データベース(DB)とは何か？

データベースとは、決まった情報を集めて整理し、保存してあるものです。必要な時に効率的に検索や更新を行うためのシステムや技術の事を指します。

【具体例】
- スマートフォンのアドレス帳や写真フォルダ
- 銀行の顧客管理情報
- ウェブサイトのユーザーアカウント情報の保存

上記のように私たちの周りにデータベースはたくさんあります。

【特徴や概要について】

- 整理されたデータの保存: データベースは、情報を整理して一元的に保存する場所です。

- 検索と更新: 必要な情報をすばやく検索したり、データを更新・削除したりすることができます。

- 同時アクセス: 複数のユーザーが同時にデータベースにアクセスし、情報を読み取ったり変更したりすることができます。

- 安全性: データベースは、不正アクセスやデータの喪失から情報を守る機能を持っています。

- 持続性: 電気が切れたり、システムに障害が発生しても、データベースに保存された情報は失われることはありません。

実際にデータベースを操作する時は「データベース管理システム(DBMS)」というソフトウェアを利用します。
このDBMSを使って、データの追加、検索、更新などの操作を行います。

人気のあるDBMSには、MySQL、PostgreSQL、Oracle、SQL serverなどがあります。

### 💡 データとは … 事実や数値、文字、画像、音などの形で表現された情報のこと

【具体的なデータの例】

-  数値データ: 温度、身長、重量、販売数などの数値。

-  テキストデータ: 文書、メールの内容、コメントなどの文字情報。

-  画像データ: 写真、スキャンしたドキュメント、X線写真などのビジュアル情報。

-  音声データ: 会話の録音、音楽、アラーム音などのオーディオ情報。

-  動画データ: 動画クリップ、ライブストリーミング、監視カメラの映像など。

-  センサーデータ: 気圧、湿度、位置情報（GPS）など、特定のセンサーで取得されるデータ。

## データベースには５つの種類に分類される

データベースはその構造や使用目的によっていくつかのタイプに分類されます。以下は、データベースの代表的な5つのタイプです。

1. 階層型データベース
1. リレーショナルデーターベース
3. オブジェクト指向データベース
3. XMLデータベース
3. NoSQLデータベース


適切なデータベースの選択は、アプリケーションの性質や要件に基づいて行う必要があります。
抑えておこう！　基本の「き」

　　　ハイ〜　ZeRO 000です〜
　　　ハイ〜　やすこじゃないです〜
　　　イイネ0えもんです　　ハイ〜
　　　そんなこんなで、皆さんに是非是非抑
     えて貰いたいwebの基本がはっじ　　
   　　　ま　　　　　る　　　　よ！？　
     
        [ webの仕組み(1)]
　　　webページとは、インターネット上の文章のこと(html,  css,  JS, 画像で構成される )

　　　HTML  → 文章やcss,  JS, 画像のリンクが記載されている

　　　CSS  → レイアウトするための情報が記載されている。

　　　JS  → 画面に動きをつける

　　　　　  サイトにアクセス　＝　HTML頂戴

　　　　　  Apache : ウェブサーバーと呼ばれるアプリケーションのこと（銀行の窓口）

                                    dockerのベースとなるimageに Apacheが入れられている

　　　　　　　　　   ブラウザからのリクエストに応じてHTMLファイルを返す

                                    現状のdockerのappコンテナ内にインストールされていて起動している

　　　　　　　PHP : HTMLファイルを用意する処理を行う(窓口の後ろで作業する作業員)

　　　　　　　ブラウザが客

　　　　　　　CMDがコンテナを起動時に Apache を実行させている

![Untitled](https://prod-files-secure.s3.us-west-2.amazonaws.com/688f319d-48b4-442e-8a22-be4ffb6e5465/0f98d2af-06ae-4569-99f8-d8409711c1ad/Untitled.png)

　　　　　　　**[PHP,  webサービス]**

- 設計の前に先ず、仕様を決める。　PHPでロジックの処理を行う。

- 設計(今回なら、データベース設計)

![Untitled](https://prod-files-secure.s3.us-west-2.amazonaws.com/688f319d-48b4-442e-8a22-be4ffb6e5465/efa36940-9f9e-4a34-a42d-2cf886322489/Untitled.png)

出典：独学エンジニア
【GitHubActions】Botにコミットさせる

# はじめに
突然こんなことがやりたくなって、触ったことのないGitHubActionsに入門することになりました

https://x.com/SNQ2001/status/1716399816539066458

作る過程でBotにコミットさせる必要があったのでやり方を記録しておきます。

上記のツイートの完成形は以下のリポジトリです

https://github.com/SNQ-2001/AutoVersionIncrementWithGitHubAction

# やりかた
```yml
name: # ...

on: # ...

# ここでワークフローに書き込み権限を与える
# https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs
permissions:
  contents: write

jobs:
  commit_bot:
    name: 実行

    runs-on: ubuntu-latest

    steps:
      - name: コミット & プッシュ
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          git config --local user.email "github-actions[bot]@users.noreply.github.com"
          git config --local user.name "github-actions[bot]"
          git add .
          git commit -m "Botによるコミット"
          git push origin main
```

# コミット履歴
このように`github-actions[bot]`がコミットしたことになります
![スクリーンショット 2023-10-30 22.33.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/79d4d998-62d5-cb45-2036-a6175efeee24.png)


# おわり
permissions関係で詰まりました
【Golang】gormでレコードを1件取得する際の関数及びエラーハンドリングについて

gormの公式に記載があるが、レコードを1件取得する関数及びエラーハンドリングについて備忘録として残す。

## 用意されている関数
* First()
* Last()
* Take()

### First()関数について
```go
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;
```
条件に合致するレコードを「id」で昇順ソートし、ソートされた最初の1件を取得する。


### Last()関数について
```go
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;
```
条件に合致するレコードを「id」で降順ソートし、ソートされた最初の1件を取得する


### Take()関数について
```go
db.Take(&user)
// SELECT * FROM users LIMIT 1;
```
順序指定なしで1件のレコードを取得する

## レコードが見つからなかった場合
First()、Take()、Last()関数で取得するレコードがなかった場合、`ErrRecordNotFound`を返却する
エラーハンドリングの例
```go
if err != nil {
    if err == gorm.ErrRecordNotFound {
        fmt.Println("レコードが見つかりません")
    }

    fmt.Println("エラーが発生しました。")
}
```

## まとめ
First()、Last()では`ErrRecordNotFound`が発生するが、Find()などのメソッドではレコードがなくてもエラーが発生しないため、違いを把握した上でしっかりとエラーハンドリングできるようにしたい。
【PHP】億単位の数値を綺麗にする。一部漢字表示を使う

# コード
```PHP
<?php
foreach ([120000001, 20000000, 20020000, 1020000, 120000,12000, 1001] as $number){
    $oku = floor($number / 100000000);
    $man = floor(($number % 100000000) / 10000);
    $sen = ($number % 10000);
    $result = implode('', array_filter([
        ($oku > 0 ? number_format($oku). '億' : ''),
        ($man > 0 ? number_format($man). '万' : ''),
        ($sen > 0 ? number_format($sen)       : '')
    ])) ?: '0';
    echo $result.PHP_EOL;
}

```

# 結果
```javascript
1億2,000万1
2,000万
2,002万
102万
12万
1万2,000
1,001
```
claude.aiつかってみた

## 初投稿

Qiita初投稿になります。
皆様、よろしくお願いいたします。

## 概要

X(旧Twitter)でChatGPTに似た「claude.ai」という情報をキャッチした。

そのサイトは以下になる。
https://claude.ai/

## 使い方(ログイン)

まずはお試し。

サインアップする方はサインアップ。
サインアップ済みの人はサインインしてください。

![ログイン画面](https://raw.githubusercontent.com/kojikawazu/qiita-article-kk/main/resources/01/01-01.png)

![ログイン後](https://raw.githubusercontent.com/kojikawazu/qiita-article-kk/main/resources/01/01-02.png)

## 使い方(サンプル)

ChatGPTで質問するように投げかけてみる。

![お試し](https://raw.githubusercontent.com/kojikawazu/qiita-article-kk/main/resources/01/01-03.png)

## 使い方(サンプル)

サンプルコードを作成してみる。

![サンプル１](https://raw.githubusercontent.com/kojikawazu/qiita-article-kk/main/resources/01/01-04.png)

![サンプル２](https://raw.githubusercontent.com/kojikawazu/qiita-article-kk/main/resources/01/01-05.png)

## まとめ

今回は無料版のみ軽くお試ししてみた。
こちらでも使えそうな予感が。

今後は有料版や他の機能もある為、これからどんどん触っていく。

---

最後までお読みいただきありがとうございました！
アウトプットとシェアを重視した書籍アプリ（Yommy）を作った話

## **この記事の概要**

本稿では、アプリ「Yommy」についての紹介をいたします。

[Yommy公式サイト](https://yommy-books.com/)

詳細な技術やアプリの構成に関する情報は、別の記事で詳しく解説する予定です。

こちらでは、Yommyの全体像、特色ある機能、現在の課題、そして今後の展望について述べてまいります。

少しのお時間をいただければ幸いです。

## **開発の背景**

本を読み返す際、前回の読書体験や感想を振り返るため、私自身はメモを付ける習慣があります。しかし、このようなメモを取るためのアプリが見当たらなかったことが、Yommyの開発のきっかけとなりました。

確かに、Kindleを使用して電子書籍を読む場合、ハイライト機能でメモを残すことはできます。ですが、紙の書籍にはそのような機能は存在しません。紙の本では付箋を使ったり、ページに直接書き込みをすることはできますが、「メモした部分だけを効率的に読み返したい」というニーズには応えられません。

私は紙の本を読むことが好きなので、このニーズに答えるためにYommyを開発しました。

## **Yommyとは**

Yommyは、アウトプットとシェアに特化したアプリケーションです。
特にアウトプット（記録・メモ）が重要です。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551316/0e87bad2-9039-7dc1-ae4c-8f328819e5ca.png)

書籍への「メモの付与」を主軸に、そのメモを多角的に活用することを考えて作りました。

### **メモの活用方法**

1.**マイページのタイムライン**

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551316/ed3b8857-c9b2-cb76-8ed0-97e374b236d9.png)

ユーザーのマイページには、フォロワーからのメモがタイムライン形式で表示されます。これにより、フォロワーの読書の歩みや感想を日々チェックすることができます。

2.**書籍詳細ページ**

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551316/6833f1b0-3f8f-3fba-ee1d-a57bcc231ddc.png)

各書籍の詳細ページでは、その書籍に関するメモが一覧で確認できます。これにより、「他の人はこの書籍をどう捉えているのか？」という疑問に答えることができます。ユーザーが新しい視点や気づきを得られることを目的としています。

――このように、Yommyの基本的なコンセプトは、メモを通して読書の体験を豊かにすることです。

続いて、Yommyの他の特徴についても紹介していきます。

## **Yommyの３つの主要な特徴**

Yommyには、主に3つの特徴があると思っています。

1. **読書記録の強化**
2. **日々の活動を可視化**
3. **SNS感覚での書籍シェア**

### **1. 読書記録の強化**

Yommyでは、書籍へのメモの重要性を強調しています。このメモ取りは単なる記録でなく、読者にとっての「アウトプット」の一形態としても位置づけられています。

読書時に適時アウトプットすることで、情報の定着がより効果的になると私たちは考えています。また、これらの記録はAI機能に活用していこうとも考えています。

### **2. 日々の活動を可視化**

![activity.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551316/d562eac7-16a1-9080-eeda-2dd34edc144b.jpeg)

Yommyでは、ユーザーの日々の活動を可視化することで、頑張りを直観的にしています。

従来のチャート形式よりも、GitHubのコントリビューション風のデザインのほうが継続的に頑張れると思い、採用しました。

これらの記録は、ユーザーが積極的にメモを追加することで、色付けがされていきます。

### **3. SNS感覚で書籍をシェア**

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551316/ccff04df-b149-d21c-4eab-ff9fa532131d.png)

[Javaを勉強するときに使った本](https://yommy-books.com/selection/d021381b-b475-4402-9b4b-32377261fc63/ )

Yommyのもう一つの特徴は、書籍のシェア機能です。

ユーザーは自分のお気に入りの書籍セレクションを作成し、それを他のユーザーとシェアすることができます。

また、このセレクションは非公開にすることも可能なので、自分だけのリストとして活用することもできます。

## **Yommyの課題と今後の展開**

私が認識しているYommyの課題は主に3点です。

1. **検索機能**
2. **スマホアプリの不在**
3. **メモ取りの実用性**

### **1. 検索機能**

現在、YommyはGoogleBooksAPIを使用しているため、書籍データの取得はそのAPIの内容に依存しています。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551316/bd3dae28-2a76-4464-d28d-e1f87c78bc87.png)


結果、海外書籍が主に英語表記となってしまう問題が生じています。この制約は現状の技術では避けられないため、手動での修正を検討しています。

### **2. スマホアプリの不在**

YommyはWEBベースでの開発が主であるため、スマホ専用のアプリは存在していません。

メモの取りやすさ的に、やはりスマホアプリは作りたいところです。

### **3. メモ取りの実用性**

読書中に頻繁にメモを取ることの実際のニーズについても疑問を感じています。この点は、利用者のフィードバックを踏まえつつ、色々考えていこうと思います。

## **今後の展開**

Yommyでは、次のような新機能の導入を予定しています。

- **セレクション機能のAI化**: ユーザーの本棚の内容を元に、AIがおすすめの書籍を自動的に提案する機能を開発中です。
- **書籍応援機能**: トップページにユーザーからの応援を受けた書籍を表示する機能を導入予定です。この機能を通じて、日常的なアプリ利用を促進したいと考えています。

## **まとめ**

Yommyの現状と今後の展開をご紹介しました。皆様からのフィードバックをお待ちしております。コメントやお問い合わせを通じて、ご意見をお寄せください。
strings , grep , tr

<!--
2023/11/5
-->
[picoCTF][Forensics][Enhance!]

## Writeup
* 文字列を抽出してみた。
`strings drawing.flag.svg`
* 長い文字列にフラグが含まれていそうな感じ。
`strings -n 40 drawing.flag.svg`
![screenshot 14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/ab3b9d10-afc2-6bef-1642-57d0cb4e8e6e.png)
<br>

* 邪魔な文字列を消してみよう。
`strings -n 40 drawing.flag.svg | grep -oP '(?=>).*?(?=<)'`
![screenshot 15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/7ab0e2cd-bad1-9e7c-ec41-a44cd14fda24.png)
<br>

* 繋げてみたらフラグになりました。
`strings -n 40 drawing.flag.svg | grep -oP '(?=>).*?(?=<)' | tr -d '>\n '`
![screenshot 16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/e46ad4a3-46d3-7e28-afa0-665b788b3ccc.png)
<br>

* 以上です。
テックキャンプ受講中

# 初です
初の投稿になります。
テックキャンプで受講中です。
いままでほとんど発信の形でアウトプットしてきませんでしたが、受講も最終課題を完了し、これから約1か月間オリジナルアプリ作成をする過程をアウトプットできればと思いました。
なるべく内容のある発信をしたいと思います。見ていただければ幸いです。
# 最終課題を終えた感想
いきなりテックキャンプ受講経験者や受講を検討されいている方以外には興味ない話でスミマセン。せっかく最終課題を終えたので感想です。
## 良かった点
カリキュラムの中で繰り返しRailsアプリを作り続け、最終課題をこなしてくなかで、RailsのMVCがどのように読み込まれ、実行されていくのか説明できるようになりました。100%理解しましたとは言えませんが、Railsアプリを作る上で理解しなければいけない基本的な構造が、人に説明できるレベルで理解することができました。
## 苦労した点
JavaScriptは最後まで苦労しました。RailsのTurboもなかなか理解できず、キャッシュのリセットもうまくいかなかったりと、JavaScriptファイルが読み込まれたり読み込めなかったりと、大変苦労しました。JavaScriptはまだまだ量をこなさなければ理解できないと思いました。
# これからの開発に向けて
最終課題前にやること(AWSへのデプロイ等)を早く終われせて、オリジナルアプリ作成に早く入り、たくさん壁にぶち当たりながら発信していきたいと思います。
JIS配列から憧れのUS配列になるための冒険譚

# US配列が気になっている方へ

## 背景
「monkeytype」のスコアを上げたい。
→ スコアが上がってきたら、コーディングも高速に打てるようになりたい。
→ 「Python写経タッチタイプゲーム」で記号と改行がしにくいなぁ
→ あれ、JIS配列ってenterキーが遠いなぁ...
→ じゃあUS配列を試してみるか

https://monkeytype.com/

https://www.saycon.co.jp/touchtypePY/


## US配列ってさぁ...
US配列のキーボードの個人的なメリット・デメリットは以下の通り。

### メリット
- enterキーが近くて押しやすい。
- 「'」や「=」が1つのボタンで押せる。
- 記号全般の配列が合理的。（Shift推しながら「'」を押すと「"」になるなど）

### デメリット
- 記号の位置を覚え直さないといけない→そもそもあんまり覚えていなかった。
- enterキーが小さい→意外と慣れます。
- 変換・無変換キーがない→これがUS配列を使いたくなかった原因。

この「変換・無変換キーがない」はなかなか致命的で、いろんなブログでも「Alt + space」で変更するや「Altキーに割り当てる」などで対応している方が散見された。
しかし、できる限りJIS配列の時の状態を維持しながら、US配列の良い部分を享受したいという希望を胸にキーボードを探したのだ。（実は3年程前にキーボード探しで挫折したことがある）

## 挫折1: 変換・無変換キーってやっぱりないのね。
まずは家電量販店で良さげなキーボードを探してみる。

https://www.amazon.co.jp/dp/B0B82NXN83?ref_=cm_sw_r_cp_ud_dp_3XV9BAXCPDHCC0X0KJ0H

このキーボードは見た中で一番スペース左横のキーがCキーの半分くらいのところに位置している。
JIS配列はCキーの直下にあるので、近い感覚でそこまで窮屈なく押せる。
個人的には赤軸が押し心地が良くよかった。ただし、右Altが遠いので、保留。

次に、Amazonで調べてみる。

https://www.amazon.co.jp/ARCHISS-%E3%83%A1%E3%82%AB%E3%83%8B%E3%82%AB%E3%83%AB%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89-%E9%9D%99%E9%9B%BB%E5%AE%B9%E9%87%8F%E5%BC%8F%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF-AS-KBQ89-TGBWP/dp/B0972DC97Q/ref=sr_1_19?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1DEU9W2IHC3NU&keywords=tkl&qid=1681226092&s=electronics&sprefix=tkl%2Celectronics%2C228&sr=1-19&th=1

これだ！と思ったが、ポッチがあるじゃないか。
JIS配列と同じ位置に謎のL-ButtonとR-Buttonがある。thinkpadと同じく丸ぽっちが存在し、それらのクリックをするための左/右クリックボタンとのこと。まぁ使わないからキーバインドしても問題なかろう。

## 挫折2: MacBook AirでUS配列が認識されない
このキーボード、MacOSをサポートしていないのだが、問題なく使えるというブログがあったので、とりあえず購入。早速繋いでみると、US配列のキーボードの認識がされない。JIS配列のままである。
システム設定の「キーボードの種類を変更」にて再認識させても状況は変わらず。
やはり、対応OSでないからダメなのか？と思い、別のUS配列キーボードを繋いでみたが、同様にJIS配列と認識された。ひとまず、キーボードが問題ではないと。

→ とりあえず、PRAMリセットやOSアップデートしたりしたが、変わらず。
→ 「キーボードの種類を変更」にてJISで認識させてから、もう一度設定してANSIを選択したらちゃんと認識した。（「JIS配列なのにUS配列と認識してしまう」の記事しかないから結構困った）

## 挫折3: キーバインドできない。
MacにはKarabina-Elementsという有名なキーマップツールがある。
これにて「L-ButtonとR-Buttonを変換・無変換キーにしようじゃないか」とKarabina-Elements-Viewerで見てみると、button1/button2というので認識されているじゃまいか。
プリセットでbutton2はあってもbutton1はない。どうしよう。

→ Karabiner-Elements complex_modifications rulesに設定があった。神。
→ しかし、「L-Button/R-Buttonを英数/かなへ代替」をEnableにしても変化がない！なぜ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275996/9571f660-93c7-47ad-283e-4369baa8d5f7.png)

→ こやつのModify eventsをONにするといけました。

## ついに、US配列で変換・無変換キーを手に入れた。
いやぁここまで長かった。ここ最近嬉しかったことの一つですね。
US配列で変換・無変換キーの個人的な最適解が出せてよかった。意外とこの結論のブログとか見つからなかったので、誰かの参考にでもなればと思います。
（ちなみに、このキーボードの丸ぽっちが邪魔なのはご愛嬌です...）

## と思ったが、結局普通にUS配列のキーボードを買い直しました。
丸ぽっちが、うっおとしいぜッ！！
タイピングしていると邪魔で仕方がないッ！!
ホームポジションでマウス操作などしないッ！！

そんな時に敬愛するRebuild.fmのhakさんがキーボードを買ったと聞くじゃありませんか。
https://sanyoshop.jp/products/halo75
→ すぐ買いました。

そして、変換・無変換キー問題については、これでいけました。
結構有名なものらしい...私の検索力とは...

https://ei-kana.appspot.com/
【VB.NET】外部のリソースファイルを読み込む方法

## リソースファイルを作成する
プロジェクトタブ > 新しい項目の追加　をクリックする。
ウィンドウが出たら、リソースファイルを選択して追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/b5fc7da4-74b6-2864-62b3-5619b7dc76c2.png)

## リソースを追加する
ソリューションエクスプローラーでリソースファイルをダブルクリックすると、編集ができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/1d9d8be4-72fd-36d2-23d7-9bc7fed2d691.png)

## リソースを読み込む
ソースに以下を追加する。
```vb
Imports System.Resources
':
Dim asm As System.Reflection.Assembly
asm = System.Reflection.Assembly.GetExecutingAssembly()    ' コンパイル済みのコード群(アセンブリ)を取得
Dim rm As New ResourceManager("manageBusinessCardApp.ResourceLogin", asm)

' リソースの取得
dim strResx as String = rm.GetObject("リソースの名前")
```
### `Dim rm As New ResourceManager()`
第1引数：プロジェクトのデフォルトの名前空間.リソースファイル名
何を書いたらいいかわからない場合、リソースのデザイナーファイルにResourceManager変数を定義している部分があるので、それを参考にして書く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/2d87b6d1-db82-8046-31f4-7eda7b78f9eb.png)

第2引数：現在実行中のアセンブリ。

### GetObject("リソースの名前")
"リソースの名前"は、リソースを追加した時の名前を記述する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/87a9bd4c-1efa-8509-42eb-05f7f63bdbf5.png)


## 参考サイト
https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/220resources3/resources3.html

https://techinfoofmicrosofttech.osscons.jp/index.php?%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB#iafdc4e0
Ionic Vueを使う時に気を付けるライフサイクルのこと

普段vueを書いていると、`onMounted`でコンポーネントの初期設定をしたくなると思います。
しかし、Ionic Vueを使う時は注意が必要です。

私が試した範囲では`onMounted`を通らない時がありました。
コンポーネントを表示する度に必ず実行したい処理があるなら`ionViewWillEnter`が良いかもしれません。
その他のライフサイクルについても紹介します。

### ionViewWillEnter
Swiftでいう`viewWillAppear`

### ionViewDidEnter
Swiftでいう`viewDidAppear`

### ionViewWillLeave
Swiftでいう`viewWillDisappear`

### ionViewDidLeave
Swiftでいう`viewDidDisappear`


## 参考リンク
https://ionicframework.com/docs/ja/vue/lifecycle
Windows PE をカスタマイズしてisoファイルに書き出すバッチファイル

# はじめに
Windows PE のメディアを作成するときに、一緒にアプリケーションを含める場合は、一度マウントしてコミットする必要があるので、その操作を自動で行えるように、バッチファイルのコードを作成しました。

含めるアプリケーションは自由に入れれるので、`Customize` のところで、アプリケーションのコピーなどのコマンドを記述しておくと、自動で`Windows PE`の`iso`を作成できます。

# Code

```batchfile
@echo off
setlocal

net session >nul 2>&1
if errorlevel 1 (
    powerShell -Command "Start-Process -Verb RunAs -FilePath '%0'"
    exit /b
)

set ADK_PATH=C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\
set ADK_DEV_TOOLS_DIR=%ADK_PATH%Deployment Tools\
set ADK_WIN_PE_DIR=%ADK_PATH%Windows Preinstallation Environment\
set ADK_DEV_TOOLS_ENV_PATH=%ADK_DEV_TOOLS_DIR%DandISetEnv.bat

set PE_OUT_DIR=%~dp0.out\
set PE_TMP_DIR=%PE_OUT_DIR%win-pe\

: https://learn.microsoft.com/en-us/windows-hardware/get-started/adk-install
: 
: "Download the Windows ADK" for Windows 11, version 22H2 (updated September 2023)
: "Download the Windows PE add-on" for the Windows ADK for Windows 11, version 22H2 (updated September 2023)
: 
: "Download the Windows ADK" Enable Developer Tools

if not exist "%ADK_DEV_TOOLS_DIR%" (
    echo Developer Tools is not installed.
    goto :EXIT
)
if not exist "%ADK_WIN_PE_DIR%" (
    echo Windows PE Addon is not installed.
    goto :EXIT
)

echo Initialize...

Dism /Unmount-Image /MountDir:%PE_TMP_DIR%mount /Discard >nul 2>&1
if exist "%PE_OUT_DIR%" ( rmdir /s /q "%PE_OUT_DIR%" )
mkdir "%PE_OUT_DIR%"

call "%ADK_DEV_TOOLS_ENV_PATH%"
call copype amd64 "%PE_TMP_DIR%" 
Dism /mount-image /ImageFile:%PE_TMP_DIR%media\sources\boot.wim /Index:1 /MountDir:%PE_TMP_DIR%mount

echo ------------------------ Customize ------------------------

: ここにアプリケーションの移動やらを記述
: .out\win-pe\mountの中に入れることで、PE起動時に含まれるようにすることができる

echo -----------------------------------------------------------

Dism /Unmount-Image /MountDir:%PE_TMP_DIR%mount /Commit
call MakeWinPEMedia /ISO %PE_TMP_DIR% %PE_OUT_DIR%windows_pe_amd64.iso

endlocal
:EXIT
pause
```

# Reference

https://learn.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/winpe-create-usb-bootable-drive?view=windows-11
Rustで教育用プログラミング言語を作ってみた

# 前置き
私がかねてより開発している教育用プログラミング言語「Simple」がある程度安定して来たので、ここで開発経緯をまとめてみたいと思います。
プログラミング教育や自作言語に興味がある方への参考になれば幸いです。

# Simpleプログラミング言語

https://github.com/KajizukaTaichi/Simple-Programing-Language

#### 概要
コンピュータの動作原理を学ぶ事を目的とした教育用プログラミング言語で、実行過程やロジックなどを表示しているので、コンピュータがどういう風に動いているのかが理解できる様になっている。
アルゴリズムを学ばせる為、最低限のシンプルな機能だけで実装するという設計哲学がある。

#### 分類
インタプリタ式、手続き型、動的型付け

#### 開発言語/環境
Rust / Windows

#### 影響を受けた言語
- Ruby （自由な文法）
- C 言語 （ポインタ）
- Visual Basic （文法） 

# 開発の道のり
私がSimpleプログラミング言語を開発した道のりを紹介します。

https://github.com/KajizukaTaichi/Simple-Programing-Language/commits/main/

## そうだ！言語を作ろう（9月始め）
私は現状の教育用プログラミング言語に強い不満が抱えていました。子ども向けに優しくしすぎてコンピュータの動作原理を学ぶことができないからです。
そこで、全く新しい教育用プログラミング言語を作ればいいんだ！と思い、以前に作った逆ポーランド記法計算機にログ表示と変数の機能をつけて教育用プログラミング言語Simpleとしました。

## 制御構文の実装(9月中盤～後半)
コンピュータの動作原理を学ぶをする為には制御構文が必須なので実装を始めました。その前に条件の評価の為に論理演算子が必要になるのでまずそれを開発し、if文やfor文、while文、else文を実装しました。さらに関数も実装しました（引数がなしでサブルーチンみたいなものですが）。

Simpleを私が通っている電気通信大学プログラミング教室で発表しました。
Githubに公開したのもこの頃からです。
文字列型を実装しようと思い、NCodelaboを始めました。

## リファクタリング(10月始め～中盤)
NCodeLaboの先生に度重なる仕様拡大でぐちゃぐちゃになったコードを指摘され、リファクタリングして改善することにしました。それまで関数だったのが構造体で実行を管理できるようになりました。

## 関数やポインタ、文字列型の実装（10月後半)
次に関数の引数の開発を始めました。引数と戻り値を実装し、ポインタも参照の概念を教えるために実装しました。ハロウィンの日、風邪に苦しめられながらも頑張って文字列型を実装しました。

## オンライン実行環境の開発（11月初め）
https://github.com/KajizukaTaichi/Simple-OXE/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952107/a2348513-653c-17a5-2b4e-d86a340a889b.png)

Web版のオンライン実行環境の開発に取り掛かりました。サーバーの開発言語はPythonで、Simpleプログラミング言語のインタプリタと連携して実行しています。

## リスト型の実装（11月中盤）
リスト型を実装し、複数のデータをまとめて扱える様になりました。
更に文字列もリストと同様にシーケンス型にしてスライスで指定できる様にしました。

https://kajizukataichi.github.io/simple

Simpleプログラミング言語の公式ホームページをGithubPageに公開しました。

## 仮想マシンの開発(11月後半)

https://github.com/KajizukaTaichi/Simple-VM

コンピュータの動作原理をより深く学ぶため、スタック指向の仮想マシンを開発しました。
アセンブリでプログラムを開発する事で、コンピュータの動作原理を深く学ぶ事ができます。

## エラー処理の実装（12月）

これまではエラーが起きたらデフォルト値で続行していましたが、
エラー処理の`try`～`catch`文を実装しました。

https://github.com/KajizukaTaichi/Simple-Programing-Language/commit/d6019d982e51c9799806fbefd380ae218888a9b1

## これから
Simpleの知名度と実績を高める為、応募してみることにしました。

https://www.obunsha.co.jp/pr/award_4/2023_1/


# まとめ
今回はSimpleプログラミング言語の開発経緯をまとめてみました。
もし何かアイデアがあれば是非、Simpleプログラミング言語に貢献して頂けると幸いです。
認定オムニスタジオ開発者試験ダンプ |望む結果を達成する

最近セールスフォース試験を完了し、満点でセールスフォース認定資格を取得した場合は、達成おめでとうございます。あなたの献身と努力は明らかに報われており、この情報は同様の認定資格の取得を目指す人にとって確かに貴重です。この記事では、<a href="https://www.pass4future.com/questions/salesforce/omnistudio-developer">認定オムニスタジオ開発者試験ダンプ</a> を使用して認定試験の準備を支援するパス4フューチャー の役割について説明します。

パス4フューチャー:信頼できる認定試験準備パートナー
パス4フューチャーは、認定試験準備の世界で信頼できる名前です。実際の試験問題によく似た質問と回答を含む試験ダンプなど、さまざまな試験準備資料が提供されています。品質と精度に対する彼らのこだわりは、これらの素材を作成する専門家を慎重に選択していることからも明らかです。
認定試験の準備にパス4フューチャー を選ぶ理由?
•	信頼性: パス4フューチャー のテストダンプは、実際の試験問題の形式と内容を模倣するように設計されており、本物の試験体験を提供します。
•	正確性: これらの質問に対する回答は徹底的に調査および検証され、正確かつ最新であることが保証されます。
•	定期的な更新: パス4フューチャーは、最新の試験内容に合わせて教材を継続的に更新し、最新の質問や課題に対する十分な準備ができていることを保証します。
•	さまざまな認証: パス4フューチャー は、単一の認証プロバイダーに限定されません。フォーティネット、マイクロソフト、シスコ、セールスフォース、コンプティア  などの有名ベンダーの認定試験ダンプを提供しています。 
•	ユーザーフレンドリーな形式: これらの試験準備資料は使いやすい形式で提供されているため、さまざまなデバイスやプラットフォームでの学習に便利です。

試験準備に便利な 2 つの形式

1. 電子模擬テスト エンジン: この形式は、有効なインターネット接続にアクセスできる受験者に最適です。質問のカスタマイズ、時間管理、進捗状況の追跡、自動結果ページ、準備を強化するための無料アップデートなどの独自の機能を提供します。
2. PDF ファイル: 外出中のユーザーのために、パス4フューチャー は柔軟性が高く、さまざまなデバイスと互換性のある PDF ファイルを提供します。この形式を使用すると、いつでもどこでも好きなときに認定試験の準備をすることができます。
機会均等への取り組み
パス4フューチャー  の使命は、IT キャリアで成功するための平等な機会をすべての人に提供することです。本物の試験の問題と回答に関する信頼できる専門的なリソースを提供することで個人を支援し、認定取得への取り組みで優れた成果を上げることができるようにします。
結論
認証済み オムニスタジオ開発者 試験やその他の認定資格の受験を計画している場合、<a href="https://www.pass4future.com">パス4フューチャー試験ダンプ</a> は試験準備の信頼できるパートナーとなります。ユーザーフレンドリーなフォーマットとともに、信頼性、正確さ、最新の資料への取り組みにより、希望する結果を達成するための十分な準備が整っています。最近、セールスフォース認定資格を取得することに成功したことは、セールスフォース のリソースの有効性を証明するものです。今後の認定取得に向けて頑張ってください。
Vue3 + Vite + Storybook の環境を作る

自分用の備忘録に書きました！

- [Vue](https://ja.vuejs.org/)
- [Vite](https://ja.vitejs.dev/)
- [Storybook](https://storybook.js.org/)

:::note info
2023/10/30 現在の latest を使っています

Vue@`3.3.4`
Vite@`4.4.5`
Storybook@`7.5.2`
:::

Node.js は 18 系以上をお使いください。

# Vue3 + Vite の環境構築

```sh
npm create vite@latest
> Project name: my-project
> Select a framework: Vue
> Select a variant: TypeScript
```

# Storybook の環境構築

```sh
cd my-project
npm i --save-dev storybook@latest
npm i --save-dev @storybook/vue3-vite@latest
```

`.storybook/main.ts` に以下を書く

```ts:.storybook/main.ts
import { StorybookConfig } from "@storybook/vue3-vite";

const config: StorybookConfig = {
  framework: "@storybook/vue3-vite",
  stories: ["../src/**/*.stories.@(js|ts)"],
};

export default config;
```

`package.json` に以下を追記する

```diff:package.json
{
  "name": "storybook-test",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
+   "storybook": "storybook dev --port 6006",
    "build": "vue-tsc && vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "vue": "^3.3.4"
  },
  "devDependencies": {
    "@storybook/vue3-vite": "^7.5.2",
    "@vitejs/plugin-vue": "^4.2.3",
    "storybook": "^7.5.2",
    "typescript": "^5.0.2",
    "vite": "^4.4.5",
    "vue-tsc": "^1.8.5"
  }
}
```

:::note warn
port の番号が他とかぶらないように注意です
:::

stories.ts ファイルを作る

```ts:src/components/HelloWorld.stories.ts
import HelloWorld from "./HelloWorld.vue";
import type { Meta, StoryObj } from "@storybook/vue3";

type Story = StoryObj<typeof HelloWorld>;

const meta: Meta<typeof HelloWorld> = {
  title: "HelloWorld",
  component: HelloWorld,
};

export const Default: Story = {
  render: () => ({
    components: { HelloWorld },
    template: "<HelloWorld msg='Vite + Vue' />",
  }),
};

export default meta;
```

# 実行する

```sh
npm run storybook
```

こうなれば成功です。自動でブラウザが開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748702/a5a78e22-2f78-b2e5-8c7d-158def0e8124.png)

起動した Storybook です。CSS が効いていないのは仕様です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748702/fb34b63d-84d2-17ab-615b-7d6d02159e88.png)
grep , sed , tr, ROT13

<!--
2023/11/4
-->
[picoCTF][Cryptography][credstuff]

## Writeup
* `grep`で指定のユーザ名を検索した。
`grep -n cultiris usernames.txt`
![screenshot 11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/4c9c36e0-079d-5897-2a44-573acff12bf0.png)
<br>

*  `sed`で指定の行数の文字列を表示した。
`sed -n 378p passwords.txt`
![screenshot 12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/6dcabcec-96aa-e9bb-0892-6e0edefb6c89.png)
<br>

* ROTっぽい文字列が出たので、Bashで解いてみた。
`sed -n 378p passwords.txt | tr 'A-Za-z' 'N-ZA-Mn-za-m'`
ROT13で当たりでした。
![screenshot 13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/2e92b985-9f08-3f28-8914-a3d6d01fdcd5.png)
```
sed -n 378p passwords.txt | tr 'A-Za-z' 'N-ZA-Mn-za-m'
```

* 以上です。
ｖｂｎ

Do While keyBaseRow <= UBound(keyData, 1)
    ' すでに合計が計算されたkeyはスキップ
    If IsEmpty(keyData(keyBaseRow, 1)) Then
        Dim groupSumValue As Long
        groupSumValue = rowSum(keyBaseRow)
        
        keyChkRow = keyBaseRow + 1 ' keyBaseRowより次の行から比較を開始

        ' まず、合計値を計算
        Do While keyChkRow <= UBound(keyData, 1)
            If keyData(keyBaseRow, 0) = keyData(keyChkRow, 0) Then
                groupSumValue = groupSumValue + rowSum(keyChkRow)
            End If
            keyChkRow = keyChkRow + 1
        Loop

        ' 次に、一致する全ての行に合計値を保存
        keyChkRow = keyBaseRow ' keyBaseRowより次の行から比較を開始
        Do While keyChkRow <= UBound(keyData, 1)
            If keyData(keyBaseRow, 0) = keyData(keyChkRow, 0) Then
                keyData(keyChkRow, 1) = groupSumValue
            End If
            keyChkRow = keyChkRow + 1
        Loop

        ' keyBaseRow行目にも合計値を保存
        keyData(keyBaseRow, 1) = groupSumValue
    End If
    keyBaseRow = keyBaseRow + 1
Loop
Pythonで「raw文字列の利用」の動作を確認してみた

# 概要

Pythonで「raw文字列の利用」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/string/index4.html

# 実装

以下のファイルを作成しました。
```sample.py
print("インストール先は c:\\code\\python\\bin です")
print(r"インストール先は c:\code\python\bin です")
print(R"名前は\"ABC\"です")
print(R'名前は"ABC"です')
print(R"年齢は30歳です" + "\\")
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
インストール先は c:\code\python\bin です
インストール先は c:\code\python\bin です
名前は\"ABC\"です
名前は"ABC"です
年齢は30歳です\
```

# まとめ

何かの役に立てばと。
laravel makeコマンドで引数を渡す

## 概要

- Makefileに定義されたmakeコマンドでローカル環境の構築をする場面や、開発をちょっと楽にするmakeコマンドを定義する事がある。
- そんなmakeコマンドに引数を渡す方法を簡単にまとめる。

## 前提

- 今回はホストPCからPHPコンテナ内でphp artisan コマンドを実行できるようにするmakeコマンドを主軸に説明をする。

## 方法

- 下記のような内容をMakefileに記載する。

    ```Makefile
    # phpコンテナ内でartisanコマンドを実行
    .PHONY: php.exec.artisan.command
    php.exec.artisan.command:
    	docker compose exec php php artisan $(COMMAND)
    ```

- makeコマンドを実行する際に下記の様に呼び出せば引数を渡すことができる。（引数が一語だけならおそらく`''`で囲まなくて良いが、特殊文字などで変に受け取られても困るので`''`で必ず括るで良いと思った。）

    ```bash
    make php.exec.artisan.command COMMAND='list'
    ```
SPIRAL v1の「マイエリア」エラーページ

スパイラル株式会社（旧：株式会社パイプドビッツ）のローコード開発プラットフォーム「SPIRAL® ver.1」を利用した開発のハック（工夫）。
https://www.pi-pe.co.jp/spiral-series/spiral-suite/

SPIRALでは一部ページはPHP 7.4で実装が可能。
「マイエリア」Webオブジェクトでは①ログイン画面、②エラー画面、③カスタムページなどが設定できるのだが、
②のエラー画面が曲者で、 **エラー画面はPHPが利用できない静的ページ** で、一部Javaサーブレット差替えキーワードによって置換されるのみとなる。
且つ、「ログインエラー」「ログインロック（連続PW誤り）」「セッションエラー」など複数のエラー画面に分かれていて「同じ文言を繰り返し記述」する必要がありヒューマンエラーを誘発する作りとなっている。
実装したからには確認・テストが必要で、複数の設定は修正漏れ等も発生しやすいため、極力まとめてしまうのが一番でシンプル化を推進したい。

よって、対策として、以下のように「ログインページのURLにPOSTリダイレクト」して、ログイン画面側で「ログインに関するエラーメッセージ文言を表示」すれば良い。

## エラー画面部実装.
```
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
  <title>redirect</title>
</head>
<body onLoad="document.forms[0].submit()">
<form action="https://area00.smp.ne.jp/area/p/abcdefghijklmnopq0/123ABc/login.html" method="post">
<input type="hidden" name="error_code" value="%val:error:code%">
<input type="hidden" name="error_msg" value="%val:error:msg%">
</form>
</body>
</html>
```

## PHP部の実装（ログイン画面、エラー文言を表示する箇所に配置）
```
<?php
if (isset($_POST['error_code'])) {
  echo '<!-- '.htmlspecialchars(nl2br($_POST['error_code'])).' -->';
}
if (isset($_POST['error_msg'])) {
  echo htmlspecialchars(nl2br($_POST['error_msg']));
}
?>
```

以上。
// チラ裏：PHPで開発するんならローコードよりLaravelで開発した方が楽しいわ…。
macOS で定期的なメンテとして行っている brew upgrade 後に エラー dyld[51818]: Library not loaded: /usr/local/opt/libavif/lib/libavif.15.dylib 発生。


試行錯誤した時の対処方法をメモリます。

`brew upgrade` した後に、自分の mac の PHP が動かなくなって焦りました。

```
$ php -v
dyld[51818]: Library not loaded: /usr/local/opt/libavif/lib/libavif.15.dylib
  Referenced from: <XXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX> /usr/local/Cellar/gd/2.3.3_5/lib/libgd.3.dylib
  Reason: tried: '/usr/local/opt/libavif/lib/libavif.15.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/usr/local/opt/libavif/lib/libavif.15.dylib' (no such file), '/usr/local/opt/libavif/lib/libavif.15.dylib' (no such file), '/usr/local/lib/libavif.15.dylib' (no such file), '/usr/lib/libavif.15.dylib' (no such file, not in dyld cache), '/usr/local/Cellar/libavif/1.0.1/lib/libavif.15.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/usr/local/Cellar/libavif/1.0.1/lib/libavif.15.dylib' (no such file), '/usr/local/Cellar/libavif/1.0.1/lib/libavif.15.dylib' (no such file), '/usr/local/lib/libavif.15.dylib' (no such file), '/usr/lib/libavif.15.dylib' (no such file, not in dyld cache)
zsh: abort      php -v
```

よくエラーを見てみると `libavif` ライブラリが見つからないとのこと。
そして、それは、`/usr/local/Cellar/gd/2.3.3_5/lib/libgd.3.dylib` と、GD ライブラリから参照されているとのこと。

ということで、画像処理に使われる、GD ライブラリがうまくアップデートされていなかったようなので、手動で、GD ライブラリを再インストールします。

```
$ brew reinstall gd
```

これでうまく治りました。

ちなみに、この問題で数日間悩みました。

ググると、検索結果に [icu4c](https://www.gaji.jp/blog/2022/08/03/10687/) ライブラリがぶっ壊れたりするブログ記事を先に見つけてしまい、そちらの対処を先にしてしまいました。

**エラー文をよく読みましょう**。

壊れているライブラリが違う場合があります。僕の場合は GD ライブラリでした。(icu4c ライブラリだと思い込んじゃってハマりました。)

繰り返します。面倒だけれど、エラー文を読んで、どのライブラリが壊れているか、見てから対処しましょう！


## 参考: 

- [dyld[45923]: Library not loaded: /usr/local/opt/libavif/lib/libavif.15.dylib](https://stackoverflow.com/questions/77219126/dyld45923-library-not-loaded-usr-local-opt-libavif-lib-libavif-15-dylib)
【Rails】テーブルを一意に保つ方法

## この記事の内容
- いいね機能など、レコードを一意にしたい
- 本番環境でダブルクリックしたら、同じレコードが2つ入ってしまった。

というのを防ぐための内容です。

僕自身、掲示板アプリでいいね機能をつけました。
それ自体は良かったんですが、Hotwireで画面だけ更新するとダブルクリックができてしまいました。

そうなれば、ダブルクリックでいいねが2個つけれちゃうんですよね。
「これはよろしくない！！」ということで修正することに...

しかし、
- フロントでダブルクリック防止→できず
- 楽観的ロックで防止→できず
- デバウンス関数で対処→できず

という感じで、できなかったのですが、簡単にできたのでその方法を共有したいと思います。

また、Vue.jsやReactなどを学んでいる方は、ダブルクリックを一つにまとめることもできるそうなので、それをしたいのですが、とりあえずRailsで対処っと...

## レコードを一意にする方法
具体例として、掲示板アプリで解説しますね。

### 前提条件(user,post,likeの関係)
userモデルとpostモデルがあり。いいねはlikeモデルで実装します。
また、userとpostは多対多の関係にあります。

つまり、userはたくさんの投稿にいいねできるし、
postもたくさんのユーザからいいねされるということです。

## データベース
以下のようなマイグレーションファイルを作成して`rails db:migrate`をしてください。
```ruby: マイグレーションファイル
class CreateLikes < ActiveRecord::Migration[7.0]
  def change
    create_table :likes do |t|
      t.references :user, null: false, foreign_key: true
      t.references :post, null: false, foreign_key: true

      t.timestamps
    end
    add_index :likes, [:user_id, :post_id], unique: true #これがポイント
  end
end
```
このadd_indexを追加することで、以下のようなメリットがあります
- 高速化
- 一意性（`unique: true`が関係している）
- 整合性

## モデルに記述
そうすれば、Likeモデルに以下のように記述しましょう。
```ruby: models/like.rb
class Like < ApplicationRecord
  belongs_to :user
  belongs_to :post

  validates :user_id, uniqueness: { scope: :post_id }
end
```
これで、データベースの一意性が保たれました。おめでとうございます！！

## まとめ
いかがでしたか？こうもあっさりなので、僕が逆に悲しくなりました。
とはいえ、まずは初心に立ち返って基本的なRailsの使い方を学んでいきましょう。

この記事があなたの役に立てば嬉しいです。
終わり！

参考になった記事（ありがとうございます！！）↓

https://qiita.com/shungo_m/items/c00200706c7b579c7984
[Swift] 配列から特定のプロパティの重複を削除する方法

配列から特定のプロパティの値が重複している要素を削除したい時があったので備忘録として残します。

実装
---------------

```swift
public extension Sequence where Element: Equatable {
    func removeDuplicates<T: Hashable>(keyPath: KeyPath<Element, T>) -> [Element] {
        var seen = Set<T>()
        return filter { (element) -> Bool in
            guard !seen.contains(element[keyPath: keyPath]) else { 
                return false 
            }
            seen.insert(element[keyPath: keyPath])
            return true
        }
    }
}
```
重複を削除したい対象のプロパティの`KeyPath`を引数に指定できます。

使用方法
-----------

```swift
struct Person {
    let id: Int
    let name: String
}

let people = [
    Person(id: 1, name: "John"),
    Person(id: 2, name: "Doe"),
    Person(id: 1, name: "John")
]
```
`people`には`id`が重複している要素が含まれているので、これを削除してみます。

```swift
let uniquePeople = people.removeDuplicates(keyPath: \.id)
print(uniquePeople)  
// 出力: [Person(id: 1, name: "John"), Person(id: 2, name: "Doe")]
```

このコードを実行すると、このように`id`プロパティが重複している要素が削除されます。
【Rails】ビューでrenderの引数を渡す注意点

## 陥ったエラー内容
```erb:
<%= render partial: "posts/like", like: @like %>
```
というコードで部分テンプレートを呼び出そうとしたら、NameError（変数やメソッドが定義されていない）というエラーが出てきました。

ん？なんで？と思ったので、皆さんに共有しておこうと思います。

## エラーの解決策
結論、以下のコードに変更したら直りました。
```erb:
<%= render partial: "posts/like", locals: {like: @like} %>
```
調べてみると以下のことがわかりました。
- partial: を使って部分テンプレートを呼び出している場合は、locals:{}を使う
- partial: はそもそも省略可能で、基本省略している

そんなこと知らずに、今までrenderを使っていたのですからびっくりです。

皆さんも通称「locals:の沼」に落ちないようにしてくださいね。

## そもそも僕がエラーを起こした原因
僕はrenderで引数が渡せるということをそもそも理解していませんでした。

具体的にはrenderで引数を渡す行為はしていたのですが、どういう理由で、このコードを書いているのか？という理解が足りていませんでした。

なので、renderで引数が渡せると知った時にはわっしょいわっしょいで、勢いのまま使ったらエラーです。

要するに、伝えたいことは「コードを理解して使おう」ということです。
コピペでも動くことは多々ありますが、数学と同じでなにっをしているのか理解しとかないとなぁと...

この記事が皆さんの役に立てば嬉しいです。
終わり！

参考になった記事↓（ありがとうございます）

https://mikamisan.hatenablog.com/entry/2016/02/23/135019
WordVBA汎用関数 (画像操作、文字列操作、テーブル操作)

# WordVBA汎用関数 
##### ※以下全てのdoc変数はWord.Document

## 画像操作:
### 1.画像をワードに適用する関数
```rb
Public Function Applyimg(ByVal imgPath As String, ByRef shpPlace As Object) As Object
    Dim shp As Object
    Set shp = shpPlace.AddPicture(imgPath)
    Set Applyimg = shp
End Function
```
キーポイント: 引数shpPlaceを用いて、画像挿入の位置を指定する。

### 2.画像の掲載位置を設定する関数
```rb
Public Function ApplyImgPlace(ByRef shp As Object, ByVal setPlace As String)
    shp.WrapFormat.Type = wdWrapInline
    shp.Anchor.ParagraphFormat.Alignment = setPlace
End Function
```
キーポイント：setPlace(0左寄せ　1中央　2右寄せ)

## 文字列操作:
### 1.特定の文字列を書き換える関数
```rb
Public Function ConvertWords(ByVal isChangeAll As Boolean, ByVal wordsBeChange As String, ByVal wordsToChange As String)
    If isChangeAll = False Then
            doc.Content.Find.Execute FindText:=wordsBeChange, ReplaceWith:=wordsToChange, Replace:=wdReplaceOne
    Else
            doc.Content.Find.Execute FindText:=wordsBeChange, ReplaceWith:=wordsToChange, Replace:=wdReplaceAll
    End If
End Function
```
キーポイント:変数isChangeがTrueの場合はFindした全ての対象を書き換える。Falseの場合は最初の一個を書き換える。

### 2.全体文字列スタイルを適用する関数
```rb
Public Function ApplyFontSetting(ByVal fontStyle As String)
    doc.Content.Font.name = fontStyle
End Function
```

## テーブル操作:
### 1.行削除
```rb
Public Function DeleteRow(ByVal tableName As String, ByVal rowNum As String)
    Dim i As Integer
    For i = 1 To doc.Tables.Count
    If doc.Content.Tables(i).title = tableName Then
        doc.Content.Tables(i).Rows(rowNum).Delete
    End If
    Next i
 End Function
 ```
キーポイント:Wordのテーブルにタイトルを付けることで、特定のテーブルを取得する。

## 2.セル分割
```rb
Public Function SplitCell( _
 ByVal tableName As String, ByVal cellRow As String, _
 ByVal celCol As String, ByVal spRow As String, ByVal spNum As String _
 )
    Dim i As Integer
    For i = 1 To doc.Tables.Count
    If doc.Content.Tables(i).title = tableName Then
        doc.Content.Tables(i).cell(cellRow,cellCol).Split NumRows:=spRow, NumColumns:=spNum
    End If
    Next i
 End Function
 ```
キーポイント:Splitメソッドでセルを分割する。NumRowsとNumColumnsパラメータで分割したいセルの行数と列数を指定する。
小道具：CountTrailingZeros (CTZ)

整数の下位ビットから連続した "0" を数えます。

```python:
def CTZ(n: int) -> int:
    return (n & -n).bit_length() - 1
```

"0" のときは "-1" を返します。これは

- Intel x86 プロセッサでは BSF 命令
  - 0 のときは不定
- C++ 言語では [std::countr_zero(x)](https://cpprefjp.github.io/reference/bit/countr_zero.html)
  - 0 のときは x のビット幅

に相当します。２進数とCTZの関係は以下の通り

| ２進数 | CTZ |
|--:|--:|
| ???? 1 | 0 |
| ??? 10 | 1 |
| ?? 100 | 2 |
| ? 1000 | 3 |
| ... | ... |


### 参考資料

https://qiita.com/ikiuo/items/41b2df2e1db35a7b2bab
【Rails】renderで部分テンプレートが表示されない時（対処法）

## この記事で書くこと
- renderメソッドで部分テンプレートを描画したいのになぜかできないよ...
- renderで詰まっている

という人に見て欲しい内容です。

僕はrenderメソッドはコントローラでばっかり使っていました。
いざ、viewで使ってみるとなぜかできない（表示されない）

ファイルのパスが間違っているのか？と思ってもどうやらそうじゃないみたい...
と思ったら、全然初歩的なことで躓いていたので共有したいと思います。

## 僕がハマったエラーとそのコード
僕はviewで部分テンプレートを呼び出そうとしていました。
しかし、正しくファイルのパスを指定しても、なぜか表示されないのです。

エラーの画面になったとかではなく、真っ白でした。
その時のコードが以下のような感じです。

```erb: index.html.erb
...
<% render 'like',like: like %>
...
```
お気づきでしょうか？この違和感に。以下で解決策を提示します。

## エラー（バグ）の解決法
結論、エラーを解消したコードは
```erb: index.html.erb
...
<%= render 'like',like: like %>
...
```
と<%=にしただけです。調べると、renderの結果は自動的には反映されないとのこと。
このことを今まで知らずびっくりしました。

まぁ大したことないエラーでしたね笑
ですが、こういった積み重ねがプロの道なのかなぁと思います。

この記事が皆さんの役に立てば嬉しいです。
終わり！
【C言語】1分でわかる！ポインタ【初学者向け】

C言語初学者の最初のつまづきポイント、ポインタ。
意外と難しくないので、簡単かつ簡潔に解説しようと思う。

## ポインタは単なるアドレス格納箱

例えば、
```C
int a;

a = 10;
```
これは、aというint型(=4byte分)メモリを確保し、そこに整数10を代入していることになる。
これと同様に、
```C
int *ptr;

ptr = &a;
```
これは、prtというint*型、すなわちint型メモリのアドレスを入れるためのメモリ(~~ポインタは型によらず4byte分~~)を確保し、そこにa(=int型メモリ)のアドレスを代入している。

(追記[11/13]ポインタに割り当てられるメモリの大きさについて、[ポインタ変数のサイズ](http://rainbow.pc.uec.ac.jp/edu/program/b1/Ex4-1.htm#:~:text=%E5%AE%9F%E8%A1%8C%E7%B5%90%E6%9E%9C%E3%81%8B%E3%82%89%E3%80%81%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%A4%89%E6%95%B0,%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E5%88%86%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)　を参考にし、4byteと記してしまったが、正しくはOS依存でした。[日々、コレ勉強](https://www.khstasaba.com/?p=841)コメントにてご指摘ありがとうございます。)

また、ポインタに*をつけることで、そのメモリに入っているアドレスにあるデータを指すことができる。
すなわち、以下の二つは同じ結果を出力する。
```C
printf("%d\n", a);
printf("%d\n", *ptr);
```
(追記[11/13]*についての説明を追加いたしました。ご指摘ありがとうございます。)

まあ、ここまでで理解できたという方は天才であろう。
図を用いて具体的に見ていく。

## ポインタを図解
以下のようなコードがあったとする。
```C
// ④
void hoge(int* c){
	printf("%p\n", c);
	printf("%d\n", *c);
}

int main(){
	// ①
	int a;
	int *b;
	
	// ②
	a = 10;
	b = &a;

	// ③
	hoge(b); // アドレスを渡している！

	//⑤
	printf("%p\n", &b); // 0xa1
	printf("%p\n", b); // 0x01
	printf("%d\n", *b); // 10
}
```
以下の図と対応している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3521160/44f28b52-184f-8d97-40b1-c39601d6de11.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3521160/da2e395b-dc61-573d-b0d5-1f80a42e07e2.png)

ちょっとだるいけど頑張って見てください。きっと理解できるはず。

何か質問・ご指摘等あればコメントください。

追記：ご指摘ありがとうございます。単純な間違いについては訂正いたしました。