OmniAICreator/Qiita-1.07M huggingface dataset:
Happiness Chainを卒業した話。

## はじめに
私はHappiness Chainというスクールで学習をして
現在副業でRailsエンジニアとして働いています。（Reactも触ります。）

https://happiness-chain.vercel.app/


まだできて１年も経ってない新しいスクールですが、
なんでHappiness Chainに入学して学習を始めたのか、
何を習えたのか等、、自分の学習記録も含め語ってみたいと思います。

## 自己紹介

韓国人で、32歳。日本住まい５年目です。
理系の大卒ですが、プログラミングの経験はなかったです。
本業は冷凍機器開発者として3D設計を主にやっております。
ものづくりがすぎで、プログラミングの勉強を始めました。

## Happiness Chainで習ったこと
まず、ウェブ業界の**現実ってどうなのかを現職者から聞ける**のが非常に良かったです。
入学前に一人で独学しましたが、難しそうなのは今後使うかもわからないから諦めてました。（docker,ターミナルでのgit等）

卒業した今考えると、そのまま独学してたら、何年経っても転職はできなかったと思いますね、、gitも難しくて、**pushせずにgithubにそのままアップロードしていました**ので、、かなりやばかったです。

そして、**現職者から厳しいコードレビューをしていただく**ことで、すごく成長できたと思います。
毎朝プルリクに溜まっている先生からのご指摘を読むともう、、すごい楽しくなったりしましたね、、（笑）

スクールで習ったおかげで今できる技術スペックとしては下記になります。
- Git 
- Docker
- Javascript
- React.js
- Next.js
- Ruby on Rails
- Github actions

副業先からご連絡いただいたのも、上記の項目を学習してアウトプットすることで、
未経験でも実務に投入できると認めていただいたおかげだと思います。

※Awsは後ほど学習予定。 

## なぜ入ったのか。
私が入学するときは、生徒1人でした。
当時、独学で半年ぐらい独学したけど、全く成果がなかったので、非常に悩んでしまた。
そのとき、**未経験から転職できた経験を持っていろ**[先生](https://twitter.com/yudai_on_rails)がツイッターでIT業界の現実等をありのままツイートしているのをみて、あ！この人なら俺のことをなんとかしてくれるでしょう！と思ってDMして、3時間ほど相談して入学することになりました。


## 入学前
そうですね、上でも述べましたが、PHPとJavascriptだけ6ヶ月間独学していまして、正直時間を無駄にしたなとすごく後悔しています。
なんの教材がいいのかが全くわからず、、時間だけ注いでて、うつ病の手前状態でしたね、、

## 入学してから
先生から習った良かったのは下記になります。
- 毎日日報を書く。
- 学習にお金をかけることを怖がらない。
- 先生が検証してくれた教材で学習できる。（ロードマップ有）
- エンジニアとして働くためには何を勉強すべきか。
- インプットしたものはしっかりアウトプットする。

未経験から転職した先生だからこそ、試行錯誤を重ねてきたので、その中で発見した教材を教えてくれるので、
もう、、時間の無駄がないですね。ロードマップ通りやるだけで、勝手に成長していきますね、、
そして、やはりエンジニアになるためにはたくさんのインプットをしないといけないので、そこでケチってしまうと、、だめでしょうね。
そこから早速本を5冊、udemyの講座を10本ぐらい買って、学習スタートしました。このとき買った教材は、今も有効活用しています。

課題も非常に難しくて、
自分でdockerfileを作成して環境構築してみるとか、

https://qiita.com/parkon_hhs/items/7a37b4f2a3083be07988

Ruby on Railsからではなく、Rubyだけでミニサービスを作るなど、、
基礎から学習ができましたね、、
Ruby on Railsの課題はその中でも難しくて、先生の厳しいコードレビューで非常に苦労しました。
Ruby　on Railsの課題だけに230時間かけましたね。
その分ガッツリRuby on Railsに慣れて、副業を始めてからもすぐに仕事ができたと思います。

https://qiita.com/parkon_hhs/items/98304bc5112f0e0f6faf



## 卒業

Ruby on Railsのqiitaの記事を読んでいただいた副業先から働いてほしいとご連絡を受けまして、
その仕事を受けることで、卒業になりまいた。
課題を記事としてアウトプットしただけで、お仕事をいただいたのでびっくりしました！
卒用当時は600時間ぐらい学習してました。
もう、学習する習慣が身についたので、今後も学習をし続けていく自信があります。


## 卒業後

現在は副業を始めて3ヶ月ぐらい経って、
時間の余裕ができたら、スクールのロードマップを参考にして、学習を続けています。
Reactもガッツリ学習しておいたおかげで、副業先から簡単ですが、Reactの仕事もいただいているので、
このスクールで学習して本当に良かったと思います。

今後Ruby on Railsの実務に慣れて、
Happiness Chainで提供しているGo言語のプランも受けたいと思います。


## 最後に

本当にこのスクールを発見して良かったと思います。
もう、、人生変わりましたね。努力してできないことはないと感じたし、
その努力の方向性を確実に決めるためには、絶対に先生が必要だということもわかりました。
副業しながらも空いた時間に学習をしている自分に気づいてびっくりしましたね。もう、、このスクールで習慣まで変わった。。。と。

先生がいつもおっしゃている言葉を最後におわりにしたいと思います。
**エンジニアになるために近道はない、最低1000時間かけてください。**

読んでいただき、ありがとうございました。
HOC(Higher Order Component)を簡単な例としてやってみる

<h2>HOCとは</h2>
高階コンポーネントは、コンポーネントロジックを再利用するためのReactの高度なテクノロジーです！<br>
Reactの機能の一部ではなく、Reactの構成的な特性から出るパターンです。<br>
具体的には、<b>高階コンポーネントはコンポーネントを取得し、新しいコンポーネントを返す関数です。</b><br>
パラメータでコンポーネントを受け取り、リターン値で新しいコンポーネントをリターンします。<br>
これにより共通した機能を具現し、再利用する。

<h2>簡単な例</h2>

以下は、３秒間ローディングしてからコンポーネントがロードされるロジックです。
ロジックからわかる共通的な部分は
①３秒間ローディング
②ローディングが完了したらコンポーネントがロードされる
になります。これらをHOCを使って、共通的な部分は再利用できるように抜き出すことができます。
```react:(HOCなし)button.jsx
import React, { useState } from 'react'
import { useEffect } from 'react';

export default function Button() {
    const [loading, setLoading] = useState(true);
    useEffect(() => {
        const timer = setTimeout(
            () => setLoading(false)
            , 3000);
        return () => clearInterval(timer);
    })
    return loading ? <p>Loading...</p> : <button>Button</button>;
}
```
```react:(HOCなし)Input.jsx
import React, { useState } from 'react'
import { useEffect } from 'react';

export default function Input() {
    const [loading, setLoading] = useState(true);
    useEffect(() => {
        const timer = setTimeout(
            () => setLoading(false)
            , 3000);
        return () => clearInterval(timer);
    })
    return loading ? <p>Loading...</p> : <input defaultValue={"Input"} />;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3097775/4f474c44-480e-9dd6-cddc-ee12a8c91e3f.png)
　↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3097775/d0446c15-efc0-ce61-2c5a-a873046e58ca.png)

！以下からはHOCを導入した例！
```react:(HOCあり)button.jsx
import React, { useState } from 'react'
import { useEffect } from 'react';
import withLoading from './withLoading';

function Button() {
    return <button>Button</button>
}
    export default withLoading(Button); // HOCからcomponentをリターンしてもらう
```
```react:(HOCあり)Input.jsx
import React, { useState } from 'react'
import { useEffect } from 'react';
import withLoading from './withLoading';

export default function Input() {
    return <input defaultValue={"Input"} />;
}
export default withLoading(Input); // HOCからcomponentをリターンしてもらう
```
ButtonコンポーネントとInputコンポーネントで、共通のロジックは全部省かれました。
その代わりに、最後にHOCを呼び出すロジックが追加されました。
最初に話した通りに、HOCはパラメータとしてコンポーネントを渡してリターン値がコンポーネントでありため、
export default {HOCコンポーネント(コンポーネント)}　と記載しています。
```react:（HOC）withLoading.jsx
import React, { useState } from 'react'
import { useEffect } from 'react';

export default function withLoading(Compomnent) {
    const WithLoadingComponent = (props) => {
        const [loading, setLoading] = useState(true);
        useEffect(() => {
            const timer = setTimeout(
                () => setLoading(false)
                , 3000);
            return () => clearInterval(timer);
        })
        return loading ? <p>Loading...</p> : <Compomnent {...props}/>;
    }
    return WithLoadngComponent;
}
```
上は、HOCです。ロジックからも分かるように、高階コンポーネントは、パラメータとして受け取ったコンポーネントを修正しません。

受け取ったコンポーネントで梱包して、受け取ったのコンポーネントの各各のpropsにてレンダリングすることができます。
そして、高階コンポーネントはSide Effectのない純粋関数でもあリます(withLoadingが小文字で始まる理由！)。純粋関数の中でComponentを作成し、そのままリターンする構造を持っています。

HOC命名ルールはwith〜〜になります。
書く技術・伝える技術

https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E6%96%B0%E7%89%88-%E6%9B%B8%E3%81%8F%E6%8A%80%E8%A1%93%E3%83%BB%E4%BC%9D%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-%E5%80%89%E5%B3%B6-%E4%BF%9D%E7%BE%8E/dp/4866671483/ref=asc_df_4866671483/?tag=jpgo-22&linkCode=df0&hvadid=417872669906&hvpos=&hvnetw=g&hvrand=7046987038044244650&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009255&hvtargid=pla-882116904198&psc=1&th=1&psc=1&tag=&ref=&adgrpid=102683584748&hvpone=&hvptwo=&hvadid=417872669906&hvpos=&hvnetw=g&hvrand=7046987038044244650&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009255&hvtargid=pla-882116904198

背景
会社の業務で外部向け記事を書くことになり、文章の基本を学びたい観点から本書を手に取りました。

本書のテーマ
論理的な文章を書けるようになること。

個人的なポイント
１，
管理職には30秒で伝えられる文章を書く。それくらい管理職は時間がない。

２，
書く技術は文章をたくさん書いていれば身につくものではない。しっかり学び、その上で文章を書くことで身についていく。

３，
総論ではそこだけ読めば詳しい情報がわかるほど詳細に書く。

４，
要約文を書くことで話がそれづらくなる。前のようやくとつなげる、一つのトピックを一つの文に書く、具体的に書く、完結に書く、文頭にキーワードを書く。

５，
既知から未知を意識する。未知から文章を書こうとすると意味が通らなくなる。

１番心に残ったこと
いろんな人の文章の悪い点を痛烈に批判しているので、そこそこ衝撃を受けました。でもここまで自分の意志を持って文章を読み、悪い点を指摘している。
それに加えて、どう書けば良くなるかまで書いてあるので、かなり参考になる。
そして、どんな有名な人も基本を守っていない文章を書いているんだなというのは励みになる。

やること
文章を書くとき、迷うことがあったらこの本に立ち返る。

まとめ
文章を書くときの辞書的な役割でこの本を読むのがいいと思う。
「「９マス」で悩まず書ける文章術」という本は、かなりラフな内容だったが、「書く技術・伝える技術」はとても堅苦しい内容になっている。
こんな内容を学校では教えてくれないので、文章で書く人ならぜひこの一冊は読んでおいていいのではないかと思った。
nginx.conf locationの記述に正規表現を使用する

# やりたいこと
nginx経由でJupyterlabへアクセスしたい。(Kubernetes環境）
Jupyterlabが稼働するPodは、ユーザーがリクエストしたタイミングで自動で生成される仕組みになっている。
Podは最大で150個程度まで増える想定である。


# 悩んだこと
nginx.confのlocationの記述方法。

Podが新規に作成されたタイミングで、nginx.confにlocationを一つ追加するのってどうやるんだろう？？
動的に追加するのは難しそうだから、事前に150個分書いておくか？
と悩んでいました。
実際当初は、150個分書いて運用していました・・・（補足参照）

なお、URIのパス、転送先のパスは、いずれも jupyterlab-XXX というように、XXXの部分がプロジェクトのID（1〜150）になるルールです。


# 結論
正規表現を使うと解決できました。（locationは1つで良い）

記述例
`location ~ ^/(?<path>jupyterlab-[0-9]*) {`
`proxy_pass http://$path.namespace.svc.cluster.local:8888;`
中略
}


# 補足
転送先が起動していない（名前解決できない）とnginxはエラーとなり起動しません。
これについての対応方法は別途記事にする予定です。

2023/2/2 記事にしました。
https://qiita.com/Yohko_Tanaka/items/0f9cb1c98eff3cc87962



# 参考記事
https://qiita.com/usagi/items/b90b7fb3e9aa5f528ffc
DDD（ドメイン駆動設計）で具体的なコードが欲しいと言われると？？？が浮かぶ・・・

# はじめに

ただのポエムです。

# このタイトルはどういう意味か？

DDDは設計の話なので、まぁ具体的なコードまで表出することは稀かなと思っています。

DDDの話や記事を書いているのに「具体的なコードや〇〇言語で例が無いからこの話や記事はちょっと・・・」と言われるとなんかモヤモヤします。

いや、これがプログラミング初心者や設計初学者であればまだいいんです。
中級者以上の人たちからもこのような意見が上がると「え？今は設計の話をしているんだけどな・・・？？？」となります。

という話です。

# 似た感情

「この感情、何かに似ているな」と思ったんですが、アルゴリズムの話でした。

"アルゴリズムとは、解が定まっている「計算可能」問題に対して、その解を正しく求める手続きをさす"
[Wikipedia アルゴリズム](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0) から引用

アルゴリズムの話をしている時、あくまで解を求める手続きの話をしているわけです。
手順が分かったのなら、後は自分の得意な言語で書き下せばいいと思うのです。

「このアルゴリズムには〇〇言語の例がないから、〇〇言語では実装できないんだ」とはならないですよね？（ですよね？）

# DDDでも同じ

DDDでも同じです。
DDDとは、ドメインエキスパートが知っている知識を厳密に構成し抽象化（ドメインモデル）して、ソフトウェアプロダクトを成功させるための設計思想や哲学なわけで、当然そこに〇〇言語のコードのような具体的なものは無いはず（正確には〇〇言語に限定するような制限はないはず）と考えています。

とは言え「〇〇言語でDDDのXXな概念をうまく表すためにはYY（カプセル化、モジュール化、DI等）というテクニックが使えるよね」はあると思います。

# 本記事はDDDの実装例を否定するものではない

例えばDDDを〇〇言語で実装する話等は、全然ありだと思います。

その言語に備わっている機能を用いて、DDDの概念をどのように実装するかはとてもテクニカルな内容で面白いと思います。

# ミスリーディングを避けたい

どういうことかと言うと、例えば具体的なコードを示した際に聞き手が「〇〇言語でXXを表現するにはYYだ！」のように言い切ってしまう・思いこんでしまう（そのような思い込みが流布される）のは避けたいですね～。

# まとめ

* ただのポエムです
* 具体的にどうする？は別の話（だと思います）
* アルゴリズムの授業とか受けて先生に「〇〇言語で表現するとどうなりますか？」って聞かないでしょ？（聞くのかな？）
* 実装例を否定するものではありません
* 実装例はあくまで例なんですよ！
フォームのプルダウンで検索結果を保持する方法

## プルダウンでの検索結果保持について
テキストフォームみたいに検索の内容をそのまま持ってくる方法は簡単ですが、プルダウンはselectedで検索結果を保持する必要があるので同じ方法とはいかないです。しかし三項演算子を使うことによってそれなりに簡単に実装ができるようです。今回はLaravelで実装した場合の手順になります。

検索機能の実装については下記の投稿が参考になれば幸いです。

https://qiita.com/rentarouclass/items/23393b172f564290224f

## 手順
今回サンプルで作ったプルダウンの検索フォームです。ファッションのタイプで検索するフォームの想定です。
```php:show.blade.php
商品管理システム
<form action="{{route('item.show')}}" method="get">
<select name="search3" id='type'>
    <option value="">選択してください</option>
    <option value="0">カジュアル</option>
    <option value="1">モード</option>
    <option value="2">キレイめ</option>
    <option value="3">ナチュラル</option>
    <option value="4">コンサバ</option>
</select>
<button type="submit">検索</button>
</form>

```
一覧を表示する画面です
```php:show.blade.php
<table>
<tr>
    <th>ID</th>
    <th>名前</th>
    <th>種別</th>
    <th>詳細</th>
</tr>
@foreach ($items as $item )
<tr>
   <td>{{$item->id}}</td>
   <td>{{$item->name}}</td>
   <td>{{$item->type}}</td> 
   <td>{{ Str::limit($item->detail, 30, '...') }}</td>
   <td><a href="{{route('item.store',$item->id)}}">詳細</a></td>
   <td><a href="{{route('item.edit',$item->id)}}">更新</a></td>
   <td><a href="{{route('item.destroy',$item->id)}}">削除</a></td>
</tr>
@endforeach
</table>

```
現状のままだと検索をかけてもControllerから戻ってくる値がフォームのプルダウンに反映されないので検索をかけても保持されず、「選択してください」の文字がデフォルトで表示されます。なのでフォームに以下のように記述を加えます。

```php:show.blade.php
商品管理システム
<form action="{{route('item.show')}}" method="get">
<select name="search3" id='type'>
    <option value="">選択してください</option>
    <option value="0" {{request()->search3 =='0'? "selected" : "";}}>カジュアル</option>
    <option value="1" {{request()->search3 =='1'? "selected" : "";}}>モード</option>
    <option value="2" {{request()->search3 =='2'? "selected" : "";}}>キレイめ</option>
    <option value="3" {{request()->search3 =='3'? "selected" : "";}}>ナチュラル</option>
    <option value="4" {{request()->search3 =='4'? "selected" : "";}}>コンサバ</option>
</select>
<button type="submit">検索</button>
</form>

```

`{{request()->search3 =='0'? "selected" : "";}}`の中身を説明します。
プルダウンに入力した文字はController側からrequest()->search3に入ってきます。
上記のコードだと、それぞれプルダウンで入力した値が帰ってくるのですが、それを、`'0'? "selected" : ""`（プルダウンの値が0だった場合、selectedを返す、なければ空を返す）という形にしてあげます。これをoptionの数だけ生成することでプルダウンの検索結果を保持することができます。
CentOS7でさくっとansibleインストール&動作確認

# はじめに
小難しいこと抜きでさくっとやる

# コマンド

```
yum -y install epel-release
yum -y install ansible
```

できた。ansible2.9インストール完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/702800b2-13b2-444e-6146-31d21e3c458f.png)

これがコントロールノードになる。

# ターゲットノードへ疎通できるようにする
コントロールノードでsshキーペアを作成して、公開鍵をターゲットノード(nbfr000)へ保管してやろう

```
ssh-keygen
```

実行結果がこちら。
$HOME/.ssh/id_rsa.pubが公開鍵になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/96ea83a0-3335-6a3e-f0d2-aa517c2136f8.png)

公開鍵をターゲットノード(nbfr000)へ保管してssh接続できるようにする。
やり方は単純で、id_rsa.pubの内容をcatで出力して、
ターゲットノードの$HOME/.ssh/authorized_keys　の末尾に追記するだけ

これを・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/bd8977c0-823d-defe-aac2-8063e540bb66.png)

こんな感じで追記してやる。超力業だけどさくっとやりたいのでこれでOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/a9235583-f123-8895-f7a1-03a2a5143975.png)

## 接続確認
コントロールノード(nbfr151v)からターゲットノード(nbfr000)へssh接続する。
ちなみにターゲットノード(nbfr000)のプライベートIPは10.0.0.9とする

```
ssh azureuser@10.0.0.9
```

こんな感じで接続成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/889b7022-8866-363d-7b54-2a4a64c0f407.png)

# プレイブック作って動作確認
コントロールノード側でプレイブックを作って動かそう。

こんな構成で。ansible.cfgとhostsはデフォルトだと/etc/ansible/配下に同名のファイルがあってそちらを参照するけど
ansible-playbookを実行したときのカレントディレクトリ配下に同名のファイルがあればそれを優先するので
こっちに置くことにした。
~/playbook
|–ansible.cfg
|–hosts
|–test.yml

```:test.yml
- name: test
  hosts: test_servers
  remote_user: azureuser
  become: yes
  become_user: root
  tasks:
  - name: ping pong check
    ping:
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/d93f7be4-e72c-8db0-2d58-2f6480b5cae0.png)

実行したいときはコレ

```
ansible-playbook -i hosts test.yml
```

これでansibleが一通り動く。

～おしまい～
Xdebug の PECL 拡張モジュールを任意の PHP バージョン用にコンパイルする




## やりたいこと
今パスが通ってるバージョンと異なるバージョンの PHP 用に Xdebug の PECL 拡張モジュールがほしい  
が、インストールコマンドを叩くと、すでにインストール済みと出て失敗する。  
```bash
$ pecl install xdebug
pecl/xdebug is already installed and is the same as the released version 3.2.0
install failed
```

## 前提条件
該当の PHP 本体はインストール済みの想定です。  
今回は Homebrew でインストールした 8.1 用にコンパイルしました。  
※パスを通しているのは 8.0 でした

## Xdebug 本体をダウンロード
以下の URL からほしい Xdebug のバージョンをダウンロードします。  
https://pecl.php.net/package/xdebug  
今回は記事作成時点で最新の 3.2.0 を使用しました。  

## コンパイル
ダウンロードした圧縮ファイルを展開して、そのディレクトリ内に移動します。
そのディレクトリ内で、ほしいバージョンの phpize コマンドを実行します。  
※試してないのですが、フルパスで指定しないと現在パスの通っている PHP のバージョンで実行されてしまうと思いますので注意
```
$ ~/Downloads/xdebug-3.2.0/xdebug-3.2.0# /opt/homebrew/Cellar/php/8.1.11/bin/phpize
```

`--with-php-config`オプションでほしいバージョンの`php-config`を指定して`configure`を実行します。
```
$ ~/Downloads/xdebug-3.2.0/xdebug-3.2.0# ./configure --with-php-config=/opt/homebrew/Cellar/php/8.1.11/bin/php-config
```
※参考：https://www.php.net/manual/ja/install.pecl.phpize.php#82914

最後に`make`コマンドでコンパイルが実行されます。
```
$ ~/Downloads/xdebug-3.2.0/xdebug-3.2.0# make
```

以下のようにモジュールが作成されたディレクトリを教えてくれるので、その中にある`xdebug.so`をコピーします。  
今回の場合は作業していたディレクトリの中の modules のようでした。
```
(コンパイル中の出力が大量に出ますが省力しています)
----------------------------------------------------------------------
Libraries have been installed in:
   /Users/hoge/Downloads/xdebug-3.2.0/xdebug-3.2.0/modules <= ここ!!!

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `DYLD_LIBRARY_PATH' environment variable
     during execution

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
```

## モジュールのコピー先
任意のバージョンの`php.ini`にモジュールの参照先が記載されていますので、そのディレクトリにモジュールをコピーします。  
```php.ini
extension_dir = "/opt/homebrew/lib/php/pecl/20210902"
```
今回は`/opt/homebrew/lib/php/pecl/20210902`なのでそこにコピーしました。  
※ PHP のバージョンによって違うようです

## php.ini に使用するモジュールを追記する
`php.ini`の先頭に使用するモジュールを追加します。
```php.ini
zend_extension="xdebug.so"
```
※`pecl install`コマンドでインストールした場合、自動で先頭に追記されたのでそれに倣っています

## インストール確認
インストールしたバージョンの php コマンドに以下のオプションをつけて xdebug がインストールされていればOK
```
$ /opt/homebrew/Cellar/php/8.1.11/bin# ./php -m | grep xdebug
xdebug <= うまくインストールできていれば出る
```

## 補足
### コンパイルしたバージョンが異なる場合のエラー
無理やり別の PHP バージョンのモジュールを参照するように php.ini を書き換えたところ読み込めない旨のエラーが出ました。  
なので手動でコンパイル、配置するという今回の手段に至りました。
```
# pecl list
PHP Warning:  Failed loading Zend extension 'xdebug.so' (tried: /opt/homebrew/lib/php/pecl/20200930/xdebug.so (dlopen(/opt/homebrew/lib/php/pecl/20200930/xdebug.so, 0x0009): tried: '/opt/homebrew/lib/php/pecl/20200930/xdebug.so' (no such file)), 
```

### 今使っている PHP のバージョンで Xdebug をインストールしたい人向け
通常は以下のコマンドでインストールできるので、おそらく一時的にパスに通す PHP のバージョンを切り替えればこのコマンドで通ったような気もします！（試してないです）
```
$ pecl install xdebug
```

## 参考
[phpize で共有 PECL 拡張モジュールをコンパイルする方法](https://www.php.net/manual/ja/install.pecl.phpize.php)  
ほぼこちらの公式ドキュメント通りだったのでやはり公式ドキュメントは偉大
そろそろ引越しだから賃貸を選ぶのは機械学習に任せよう

# 悩み
そろそろ引越しをするんですが、今回も賃貸を選ぶのに後悔が残りそうです。

何とかどこかの工程を自動化できないものか…と思いついたのが、賃貸サイトをWebスクレイピングして情報収集し機械学習で判断してもらうことです。

# お得な賃貸を探そう
どういった条件で賃貸物件を探すかは人それぞれですが、お得であればあるほどいいというは誰でもそうですよね？

**機械学習を使うと賃料を予測することが可能です**。それなので、機械学習を使って賃料の予測価格を算出し、実際価格と比較しようという魂胆です。言い換えると**実際価格が予測価格よりも低ければ、お得な賃貸**ということが言えます。

それを目指して、機械学習のフローをやってみます。

# 結果から
まずは結果から示します。

某賃貸サイトを解析すると前処理によって次のデータを得られました。一部分だけ記載します。

※1. 本記事は具体的な土地情報は伏せて、番号で記載しています。
※2. なお、今回特徴量は**間取り(部屋数でDK, K , L , Sがない場合はワンルーム)、間取り、築年数、建物高さ、階、専有面積、敷金と礼金**です。駅からの近さ、立地も入れたほうがいいのでは？という疑問が残りますが、暫定的にこれらを特徴量としました。

|番号|間取り|間取りDK|間取りK|間取りL|間取りS|築年数|建物高さ|階|専有面積|賃料+管理費|敷/礼|路線1|駅1|徒歩1|賃料|管理費|敷金|礼金|予測価格|test-predict|ratio[%]|
|:----|:----|:----|:----|:----|:----|:----|:----|:----|:----|:----|:----|:----|:----|:----|:----|:----|:----|:----|:----|:----|:----|
|1|1|1|0|1|0|24|10|4|36|145000|290000|ＪＲ総武線|御茶ノ水駅|4|145000|0|145000|145000|145000|0|0.0|
|2|1|0|0|0|0|8|10|6|25|121000|109000|ＪＲ中央線|水道橋駅|2|109000|12000|0|109000|121000|0|0.0|
|3|3|1|0|1|0|24|8|7|90|278300|542600|東京メトロ日比谷線|小伝馬町駅|4|271300|7000|271300|271300|290000|-11700|4.2|
|4|1|0|0|0|0|42|11|11|22|70000|128000|ＪＲ総武線快速|馬喰町駅|3|64000|6000|64000|64000|95000|-25000|35.7|
|5|1|0|0|0|0|17|14|2|25|110000|100000|東京メトロ東西線|九段下駅|1|100000|10000|100000|0|110000|0|0.0|

予測価格の列がランダムフォレストで算出した価格、test-predict列が実際の価格から予測価格を引いた値です。test-predict < 0になっていればお得な物件というのがわかります。最後にratio[%]は(test-predict)/(実際の価格)×100 の値です。この値が高ければ高いほどお得です。

この中だと、4番の物件がratioが高く、お得という結果が出ました。
築年数は44年ですが、ワンルーム、賃料+管理費が70,000円です。東京都ならあり得そうですが、私はド田舎者なので残念ながら価格感がありません…。

# 設計の概要
全体の処理の流れは次のようになります。
![flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607561/907c78d0-e2c1-0671-8eba-13a407898c3d.png)

賃貸サイトからHTMLの情報を取得し解析します。そして、機械学習が読めるようにデータを整形し、価格を予測。最後に"(実際価格) - (予測価格) < 0"になれば、その物件はお得であることがわかります。

# 実際のコード
この記事では、アイデアと設計を提供します。コードを解説すると、煩雑な記事になってしまうと思ったため、コードはGithubに公開することにしました。

先人もいますので、詳しくはそちらにお任せします。

実際に実行したい、または実装の参考にしたいという方はGithubをご覧ください。

[【Github】【Webスクレイピングと前処理】賃貸サイトからお得な賃貸を機械学習で選定する](https://github.com/OkamotoDaiki/Rent_PreprocessingMachineLearning)

[【Github】【機械学習】賃貸サイトからお得な賃貸を機械学習で選定する](https://github.com/OkamotoDaiki/Rent_MachineLearning.git)

# まとめ
機械学習で賃貸の賃料を予測し、価格差でお得な物件を探してみました。

機械学習に任せると無限にある物件でも、お得な物件を絞ることができました。これで時間の節約ができます。

我々エンジニアには賃貸を優雅に見る余裕はありません。全工程を自動化していきたい。
komposeを用いて、簡単にwebサービスをKubernetesに移行する

# 概要
既にdocker-compose.yamlが用意されているようなプロジェクトであれば、komposeというツールを用いることで割と簡単にkubernetesにサービスを移行することができます。業務でAWSからGCPのGKEへの移行を最近頻繁に経験したので、簡単に手順をここにメモしておきます。

# 初めに
以下のものをインストール
- docker
- [minikube](https://minikube.sigs.k8s.io/docs/start/)
- [kompose](https://kompose.io/installation/#macos)

# komposeを用いた移行
## サンプルアプリ
[リンクはこちら](https://github.com/KMimura/kompose_example)。
以下のコマンドで動くことを確認します
- `cd sample-web`
- `docker-compose up`
- `GET http://localhost/item`でレスポンスが見れる

## kubernetes用の設定ファイル作成
sample-webディレクトリで、以下のコマンドを叩き、docker-compose.yamlをkubernetes用の設定ファイルに変換します。
```bash
kompose convert
```
`sample-api-deployment.yaml`と`sample-api-service.yaml`というファイルができると思います。前者が、[podの状態を宣言的に記述する](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/)ための設定ファイルで、後者が[ネットワークサービスとして動くkubernetes内のアプリケーション](https://kubernetes.io/docs/concepts/services-networking/service/)の設定ファイルです。

もし本サンプルのように外部からのアクセスを受け付けるapiのようなものでなく、単独で動くジョブのようなものであれば、komposeは前者のみを作り後者は作られないはずです。

## ローカルのminikubeへのデプロイ
まずは最初に、minikubeを起動します。

```
minikube start
```

そして、minikube上へdockerアプリをデプロイできるよう設定をします。（いろいろなやり方があるのですが、これはそのうちの一つです。[興味ある方はこちらを見てください](https://minikube.sigs.k8s.io/docs/handbook/pushing/#1-pushing-directly-to-the-in-cluster-docker-daemon-docker-env)）
```
eval $(minikube docker-env)
```

dockerイメージのビルドをします。dockerコマンドでなくminikubeコマンドでビルドすることで、minikubeでも見れる場所にビルドされます。
```
minikube image build -f Dockerfile
```
上でkomposeで作成した設定ファイルから、minikube上へデプロイをします。minikubeをローカルで起動していれば、`kubectl`コマンドは自動でminikubeを見ます。
```
kubectl apply -f ./sample-api-deployment.yaml -f ./sample-api-service.yaml
```
デプロイがちゃんとできていれば、以下のコマンドで動作確認ができます。
```
minikube service sample-api
```

開いたページの`/item`にアクセスすれば、正常なレスポンスが出たはずです。
【SQL】PIVOT句の基本的な使い方

# PIVOT句
テーブルの中にあるレコード(行)をカラム(列)に変換

# 基本的な構文
```sql
 1  SELECT
 2    グループ化対象列の値1,
 3    グループ化対象列の値2,
 4    ・・・
 5  FROM テーブル名
 6  PIVOT (
 7    集計関数(集計対象列)
 8    FOR グループ化対象列
 9    IN (グループ化対象列の値1, グループ化対象列の値2, ・・・)
10  ) AS 別名
```

# PIVOT句を使ってみよう
1 テーブルの作成
```sql
CREATE TABLE grades
(
    name       varchar(20)
    ,subject   varchar(20)
    ,score     int
);
```
2 テストデータの準備
```sql
INSERT INTO grades VALUES ('生徒A', '国語',  60 ) ;
INSERT INTO grades VALUES ('生徒A', '理科',  70 ) ;
INSERT INTO grades VALUES ('生徒A', '数学',  55 ) ;
INSERT INTO grades VALUES ('生徒A', '社会',  90 ) ;
INSERT INTO grades VALUES ('生徒B', '数学',  80 ) ;
INSERT INTO grades VALUES ('生徒B', '国語',  80 ) ;
INSERT INTO grades VALUES ('生徒B', '理科',  90 ) ;
INSERT INTO grades VALUES ('生徒B', '社会',  50 ) ;
INSERT INTO grades VALUES ('生徒C', '国語',  65 ) ;
INSERT INTO grades VALUES ('生徒C', '数学',  70 ) ;
INSERT INTO grades VALUES ('生徒C', '理科',  75 ) ;
INSERT INTO grades VALUES ('生徒C', '社会',  80 ) ;
```
3 pivotで生徒毎にに各教科の点数を集計
```sql
SELECT   
	a.name as 生徒
	,a.英語
	,a.国語
	,a.数学
	,a.理科
	,a.社会
FROM  
    grades 
PIVOT  
(  
    sum(score)  
FOR   
    subject
    IN ( 英語,国語,数学,理科,社会)
) AS a  
order by name
```

4 実行結果
| 生徒 | 国語 | 理科 | 数学 | 社会 |
| :--- | :--- | :--- | :--- | :--- |
| 生徒A | 60 | 70 | 55 | 90 |
| 生徒B | 80 | 90 | 80| 50 |
| 生徒C | 65 | 75 | 70 | 80 |

# まとめ
注意点としてはPIVOTに指定する集計カラム（今回の場合は「score）は集約することが必要です。
※SUM関数を外すとエラーになります。
【VSCode】マークダウンをプレビューしながら書く

# はじめに
私はiOS開発者なのでXcodeをインストールしています。
READMEを編集しようとすると標準で開くのがXcodeです。
いままではXcodeでREADMEを編集してました。
しかし、書いている途中にどんな見た目になっているかを確認したくてもできません。

VSCodeではマークダウンをプレビューしながら書けるらしいので試してみました。

[AppleSystemStatusMenuBar](https://github.com/SNQ-2001/apple-system-status-menubar)のマークダウンを例にやってみます。

# こんな感じ
<img width="1372" alt="スクリーンショット 2023-01-30 21 23 43" src="https://user-images.githubusercontent.com/84154073/215475958-d74efe19-490e-44f4-bc67-39530cc20d14.png">

# やりかた
① ファイル名のところを右クリックします
<img width="1260" alt="スクリーンショット 2023-01-30 21 27 36" src="https://user-images.githubusercontent.com/84154073/215476962-a8387865-c663-4d25-85f1-b824bace9dcd.png">

② 「左に分割」を選択します
<img width="1260" alt="スクリーンショット 2023-01-30 21 29 24" src="https://user-images.githubusercontent.com/84154073/215477351-7bc45025-f57d-42c7-8fb5-a365b5faa66d.png">

③ 左側にあるファイル名をタップします
<img width="1260" alt="スクリーンショット 2023-01-30 21 30 57" src="https://user-images.githubusercontent.com/84154073/215477676-8281d3f6-9caf-4d5f-b440-796053f6aa98.png">

④ `Command` + `Shift`を押しながら`V`を押します

⑤ 左側のREADMEを削除します
<img width="1260" alt="スクリーンショット 2023-01-30 21 34 22" src="https://user-images.githubusercontent.com/84154073/215478562-03951eb9-924b-4218-a30a-96db09160014.png">

# おわり
VSCode便利ですねー
マークダウン書く時はVSCodeを使うようにします。
SSH のポート番号を変更したサーバーに対して Ansible を実行する

セキュリティのために、通常 22番ポートの SSH を別のポート番号にすることってありますよね。

SSH のポート番号を変更したサーバーに対して、 ansible-playbook をかけようとしてハマったのでメモ。
--ssh-extra-agrs を使います。

例えば、SSH のポートが 8888 のサーバーに対して実行する場合は以下のような感じ。

```shell:Sample
ansible-playbook --ssh-extra-args '-p 8888'　〜それ以外のパラメーター〜
```
SolanaのPDAについて整理

## まえがき
solanaの重要な技術要素の一つ、PDAについて腹落ちしていなかったので自身の理解のためも含め解説記事を書いてみた。
情報が少なすぎるせいか聞ける人がいないので、間違いや修正補足についてコメントや編集リクエスト大歓迎です。

## 読む前の前提知識
solanaのAccount、Program、Instractionをざっくり理解していること

## PDA(Programm derived address)とは
直訳するとプログラム派生アドレス、文字通りProgram IDと、任意のseed値を基に生成されるハッシュである。

PDAは一見すると公開鍵のように見えるアドレスであるが、これらは生成段階においてオフカーブ[^オフカーブ]であることを確認するため、紐づく秘密鍵が存在しない。

なお、ProgramIdとSeedの組み合わせによっては、ed25519楕円曲線上の正しい公開鍵が生成されてしまうため、その際にはseedにbumpと呼ばれる値を追加し生成を行う。オフカーブな値が生成されるまでこれを繰り返す。

[^オフカーブ]:ed25519楕円曲線上に存在しないハッシュのこと。solanaではed25519を用いたキーペアを利用しており、これはPDAではない通常の公開鍵がed25519楕円曲線上にあるということ(対応する秘密鍵がある)を意味する。

PDA自体には「オフカーブである公開鍵っぽい文字列である」これ以上の特徴はない。

## PDAが解決すること

PDAがないとどうなるのか？前提として、
・solanaではアカウントはすべてアドレスをもち、これは公開鍵が設定される。
・アカウントの情報は、すべて公開されている。
・アカウントの状態を変更するためには、その公開鍵に対応する秘密鍵をっていることを証明する(署名する)必要がある。

つまり、アカウントの数だけ秘密鍵が必要になってしまう。
当然、すべてのアカウントの情報が公開されている場合において、秘密鍵をオンチェーン上のどこかに保管するなどはご法度である。

これを解決するために、PDAが登場する。
solanaにおけるPDAは下記の二つを可能にする。

1. Programが、秘密鍵を必要とせずに特定のアドレスにプログラムで署名できる。(つまり、トークンの送信などの実行が可能)
2. CPI(Cross-Program Invocation)において、プログラム同士を相互に呼び出し可能する。

## PDAを利用するユースケース
それでは、どういうケースで有用なのか。

トークンをA,B間で交換する場合、各々が自分のアカウントから送金する必要があるが、
相手が送ってこない場合を考えるととりっぱぐれのリスクがある。
たとえば、オークション、別々のものを順番に送りあい交換する、二者間で賭けをし勝者が掛け金を受け取る、のようなケースである。

その際、とりっぱぐれ無いよう下記のような流れで取引を行う必要がある。
1. Aは信頼できる第三者(escrow)に資産を預け、Bから期待する額を設定する。
2. BはAに送金し、それが正しい額であれば、同時にescrowは1.で預かった資産をBに送金する。

この場合、escrowがトランザクションを実行できる必要があるため、
PDAを生成し、それが所有する一時的なアカウント(escrow)の権限を割り当てる。
AがもつトークンX、Bが持つトークンYをそれぞれ交換するケースでの、PDAの生成と権限の委譲は下記のような形。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317088/a30d4b3f-6974-b4ba-911b-0e5eb761865e.png)

プログラムは公開されていて変更できず、solanaのトランザクションは一つ失敗すると全体が失敗する仕組みになっているので、
Aが送金を済ませ、あとはBが送金しさえすれば受け取れる状況を作り出すことができる。

## その他知っておくといいかもしれないこと

- PDAは「署名」ができるが、暗号技術的に署名をしているわけではない
    - ランタイムが渡されたSeedと実行元のProgramIdを見てPDAが生成できるか試し、一致すれば署名済みとしてマークする
- PDAを探す処理はオフチェーンでも可能。計算能力的にも推奨

## 参考

https://paulx.dev/blog/2021/01/14/programming-on-solana-an-introduction/#processor-part-2-pdas-part-2-cpis-part-1

https://efficacious-flat-24a.notion.site/Program-Derived-Address-8537ebca002245639beb531842f87f2c
【Java】参照の自動型変換

Javaの継承関係にあるクラスではサブクラスのインスタンスには必ずスーパークラスのインスタンスに相当する部分が含まれており、スーパークラスのメソッドなどを使用することができる。

この特徴を利用すれば、サブクラスのインスタンスを、スーパークラスのインスタンスとして使用することができる。

ParentHumanクラスを継承するChildHumanクラスがあったとする。


``` ParentHuman.java

public class ParentHuman {
	
	private String name;
	
	private int age;
	
	private String gender;
	
	public ParentHuman() {
		
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	@Override
	public String toString() {
		return "ParentHuman [name=" + name + ", age=" + age + ", gender=" + gender + "]";
	}
	
	
}

```


``` ChildHuman.java
import java.time.LocalDate;

public class ChildHuman extends ParentHuman{

	private LocalDate birthday;
	
	public ChildHuman(String name, int age, String gender, LocalDate birthday) {
		super(name, age, gender);
		this.birthday = birthday;
	}

	public LocalDate getBirthday() {
		return birthday;
	}

	public void setBirthday(LocalDate birthday) {
		this.birthday = birthday;
	}

	@Override
	public String toString() {
		return "ChildHuman [birthday=" + birthday + "]";
	}
	
	
}

```


サブクラスのインスタンスを生成後、生成したインスタンスをスーパークラスの変数に代入することができる。

``` sample.java
import java.time.LocalDate;

public class Sample {

	public static void main(String[] args) {
		ChildHuman ch = new ChildHuman("mr.child", 10, "male", LocalDate.of(2000, 2, 4));
        // スーパークラスに代入
		ParentHuman ph = ch;
	}
}
```


左右で型が異なるが、サブクラスからスーパークラスのへの代入であれば自動型変換される。

インスタンスを生成したときにインスタンスがヒープ領域のどこにあるのかという情報で参照が代入されるが、ChildHumanの参照からParentHumanの参照に自動変換されるイメージ。

スーパークラスの変数に代入するとスーパークラス型の範囲内でしか、インスタンスにアクセスできなくなる。


``` sample.java
import java.time.LocalDate;

public class Sample {

	public static void main(String[] args) {
		ChildHuman ch = new ChildHuman("mr.child", 10, "male", LocalDate.of(2000, 2, 4));
		ParentHuman ph = ch;

		System.out.println(ph.getName());
		System.out.println(ph.getAge());
		System.out.println(ph.getGender());
		System.out.println(ph.getBirthday()); // コンパイルエラー
	}
}
```

上記のようにParentHumanで定義されているゲッターにはアクセスできるが、ChildHumanのgetBirthdayにアクセスしようとするとコンパイルエラーが発生する。
git管理を始めよう

新しいプロジェクトを始めて、git管理せずに始めてしまい、後々公開する日々。
（なぜかとりあえず処理を書き始めてしまう）

しかも毎回「git 始め方」と調べるので、ここを見ればわかるようにしておきます。

# ローカルリポジトリの作成
ローカルリポジトリ作成済みの場合はスキップ
```terminal
git init
```

`.git`ディレクトリが作成される。

## ステージエリアにファイルを追加
```
git add .
```
カレントディレクトリ配下の全てを対象にステージエリアに上げる。
最初はこれで良さそう。
# リモートリポジトリを作成
右上のNew repositoryをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416489/da0de210-4f68-5a7a-ed63-17d821452d38.png)

1. 適当なRepository nameを入力
1. PublicかPrivateか選択
1. create Repositoryをクリック

次の画面真ん中あたりに、
…or push an existing repository from the command line
という項目があるので、そちらを参考にする。

コマンドが３行書かれているので、コピーして上から実行していく。

```terminal
git remote add origin git@github.com:XXXXX/YYYYY.git  //リモートリポジトリのURL
git branch -M main
git push -u origin main 
```

終わったっぽいコメントが出てきたら、githubのページを更新。
git管理されているリポジトリが表示されていたら成功！
C#で文字列の中に変数を埋め込む

# 1. はじめに
* C# 6.0から使用できるようになった文字列補間式を使用したい

* 追記
* C# 10からは補間文字列($"")をAppendFormattedやAppendLiteralメソッドに展開するようになっています。詳細は以下記事を参照。（@junerさんよりご教授いただいた）

https://ufcpp.net/study/csharp/start/improvedinterpolatedstring/#handler-pattern



# 2. 文字列補間式とは
* C# 5.0まではstring.Formatで指定した変数の埋め込みを文字列保管式```$```を使って簡易的に記述できる


# 3. 文字列保管式の書き方
## 3.1. 文字列補間式 使用前
```csharp:C#
var param = "pen";
Debup.Print("This is a {0}.", parm);
```

## 3.2. 文字列補間式 使用後
```csharp:C#
var param = "pen";
Debup.Print($"This is a {data}.");
```

# 4. 文字列補間式の特徴
## 4.1. コンパイルエラーとして検知できる
* string.Formatでは気づけない実行時エラーをコンパイルエラーとして検知できる

## 4.2. 書式が設定できる
* string.Formatと同様に書式が設定できる
```csharp:C#
var now = DateTime.Now;
Console.WriteLine($"{now:yyyy年MM月dd日}");  // "2018年04月01日"

var today = DateTime.Today;
Console.WriteLine($"{today.Year}年{today.Month,2}月{today.Day,2}");   // "2018年 4月 1日"

var num1 = 1234567890;
Console.WriteLine($"{num1:#,0}");   // "1,234,567,890"

var num2 = 123;
Console.WriteLine($"{num2:00000}");  // "00123"
```
   
## 4.3. エスケープもできる
* ```{```を出力したい場合は```{{```と記述する
```csharp:C#
var framework = "Angular";
Console.WriteLine($"{framework}のデータバインドは{{{{}}}}と書きます");
    // "Angularのデータバインドは{{}}と書きます"
```

# 5. 参考文献

https://blog.hiros-dot.net/?p=6407

https://qiita.com/Nossa/items/c2226232b31d7665267f
No.2 相互作用で絞り込む／絞り込ませない

# 相互作用とは
これまでのセッションでビジュアルを作成してきた皆さんは既にお気づきかもしれませんが、実はPower BIのビジュアルはグラフを選択する事で、他のビジュアルも連動して表示を変更する事ができます（相互作用）
![作成1ezgif-5-0192cef433.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/044c0934-1731-446d-c3c9-9ca2fd7371d4.gif)

ただ、表示しているビジュアルによっては一緒に絞り込みをされたくないケースもあると思います。
そのため相互作用から除外される方法を紹介したいと思います。

# 相互作用の編集
**1.値を変動させずに固定したいカードを最初に作ります（わかりやすくタイトルもつけました）**
![スクリーンショット 2023-01-30 20.51.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/29259429-f6dc-9290-6a2b-11632b78404c.png)

**2.右上のアイコンから相互作用を編集するをONに変更します**
**3.絞り込みに使用するビジュアルを選択すると、他のビジュアルでアイコンが出てきます**
![作成2ezgif-5-2b61718446.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/5e6d741d-b768-0fc1-0a06-791805bf5a00.gif)
・相互作用の編集をONにする。相互作用を外したいビジュアルに移動
![スクリーンショット 2023-01-30 20.49.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/863f3f91-c76d-0484-e46a-64ba73e3297f.png)
・対象のグラフから相互作用を外す（なし、をクリック）
![スクリーンショット 2023-01-30 20.50.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/7d3d9fe4-ea8c-ee08-d2e1-01e1b967703b.png)

**4.絞り込みをしても指定のビジュアルの値は影響を受けない事を確認**
![作成3ezgif-5-28f83566d8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/295c40c6-fa22-49b7-e767-5073250083af.gif)

こちらのセッションは以上です。
[→ Power BI サービス練習帳に戻る](https://qiita.com/shinyasasaki/items/391d50c2508794e8fcfd)
setodaNoteCTF - Digdig 200 

# 問題

https://ctf.setodanote.net/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/47e993e3-495b-bdd0-13e4-d0c297e90464.png)

# 解いてみた

ファイルを開くと全部DNSでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/fb3d4efb-5601-f86c-e80f-03dc214a61e0.png)

DNSの内容を見てみると.setodanote.netより前の部分が怪しい感じがあります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/201c59e1-ca8e-b47e-6563-2eeb312ce3f0.png)


とりあえずresponseで絞ってみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/524f0851-74f5-f251-4556-dc624676ae49.png)

AとAAAAが混ざってるのでAAAAだけにしてみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/913c2829-d759-f3bb-f2c3-3350d6eafe56.png)

サブドメインの文字数が違う上3つは無視するとしてサブドメインの部分をcyberchefに入れてみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/dea8d257-9f47-2527-9784-03d1b40af650.png)

若干文字になっています。先頭の005aa0は全部同じなので削除してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/05eac0b4-a848-f019-9b6c-e5b2ec7d15d8.png)

惜しいところまではいってる気がします。いろいろ考えると先頭2バイトが順番を示している気がしたので並び替えてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/85869d92-5d31-2c2f-a0bb-e6f0b2851f6c.png)

何個かflag{～}の形になったので答えに入れてみると正解がありました。
64Bit版Excel VBAとSAPの連携方法

# はじめに

SAPとExcel VBAの連携方法を検索すると、64Bit版Excelは未対応というような古い記事をよく見かけます。
SAP GUI760まではRFCコントロールが32Bit版しか存在せず面倒な方法が必要でしたが、SAP GUI770で64BitのRFCコントロールがリリースされており、これを使用することで64Bit版Excelも問題なく使えるようになりました。
※参考：[2796898 - SAP GUI for Windows 7.70 の新機能および変更された機能](https://launchpad.support.sap.com/#/notes/2796898) ※要S-User ID

以下のとおり、SAP GUIのインストールオプションに「64Bit RFC Controls」が追加されています。
![スクリーンショット_20230121_131940.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117447/87e69973-f8ac-8d56-aeab-201296ee31d4.png)

# 使用方法
以下のリンク先にBAPI実行ツールのExcelマクロを置いています。受注伝票登録のサンプルデータも入れていますのでご参照ください。

https://github.com/saka-y/ExcelBapiTool/


# 関連記事
https://qiita.com/lenore/items/cf405497c8bd5065575b
GitHub CodespacesにMySQLをインストール

```bash
sudo apt update \
  && sudo apt install -y mysql-server \
  && sudo service mysql start \
  && echo "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY ''" | sudo mysql \
  && sudo service --status-all \
  && mysql -h127.0.0.1 -uroot
```

PHPから触るには？

https://github.com/orgs/community/discussions/58212

https://github.com/orgs/community/discussions/45444

```bash
sudo apt install -y php-mysql
```

もしくは

Laravelの場合

```bash
sudo apt update
sudo apt install software-properties-common ca-certificates lsb-release apt-transport-https
LC_ALL=C.UTF-8 sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install -y php8.2 php8.2-mysql php8.2-mbstring php8.2-xml php8.2-curl
echo APP_URL=https://$CODESPACE_NAME-8000.app.github.dev >> .env
php8.2 artisan serve
```
C#でnull合体代入(??=)を使う

# 1. はじめに
* C# 8.0から使えるようになったnull合体代入(??=)の意味を理解して使いたい

# 2. null合体代入(??=)とは
* null許可参照型を宣言した場合に使用する
* nullの判定と、有効な値に差し替えが同時にできる
* ```(左辺) ??= (右辺)```
    * 左辺がnullの場合、右辺の値を代入する
    * 左辺がnull以外の場合、左辺の値を使用する

# 3. null合体代入(??=)の書き方
## 3.1. null合体代入 使用前
```csharp:
int? val1 = null;
int val2 = 100;
if(val1 == null)
{
    // val1に100を代入
    val1 = val2;
}
```

## 3.2. null合体代入 使用後
```csharp:
int? val1 = null;
int val2 = 100;
val1 ?? = val2;
```

# 4. 参考文献
https://www.ipentec.com/document/charp-expressions-question-mark-question-mark-equal
数弱の弱弱高校生が50回かけて入茶した話

# はじめに
　こんにちは。[Sapph（さふ）](https://twitter.com/Sapph_cpp)といいます。先月 AtCoder にて入茶したことにより自分語りする権利を得たので、グダグダ書こうと思います。宜しくお願いします。

# お前誰
　改めまして、Sapph です。高校2年生です。2021年6月に AtCoder で競技プログラミングを始めました。言語は基本的に C++ を使っていますが、ごくまれに Ruby も使っています。

# 本題

### 入茶したぞ～～～～～～わ～～～～～い！！！！！！！！！！
https://twitter.com/Sapph_cpp/status/1604267029489676288?s=20&t=8i4pgSKOHAQ9Pz1ClsQnlw

　名前が茶色になりました。可愛いですね。
　しかしながら、入茶するのに53回、期間にして約1年半もかかってしまいました。なぜなら私は極度の数弱だからです。ついこの間まで「アルゴリズムってなんだよそれ美味しいの？」となっているくらい、情報科学についての知識もありませんでした。そんな私が入茶に向けて取り組んだことなどを紹介します。

- いっぱい問題を解く
　経験値がないのでたくさんコンテストに出てたくさん問題を解きましょう。[AtCoder Problems](https://kenkoooo.com/atcoder/#/table/) や AOJ の [Introduction To Programming I](https://judge.u-aizu.ac.jp/onlinejudge/finder.jsp?course=ITP1)、yukicoder の[タグ一覧](https://yukicoder.me/statistics/tags)などからいろんな問題を漁っていろんな問題に触れましょう。[アルゴ式](https://algo-method.com) も初心者向けの問題が多く用意されていておすすめです。

- 速解き2完をできるようにする
　C問題以降の問題はたとえ灰 diff だろうと太刀打ちできないことが多々あるので、その分B問題までを速く解けるようにしてパフォーマンスを稼ぎましょう。一桁分で2完 ＋ C 問題 AC とかすればだいたい茶パフォ出るので、コンスタントに続ければだんだん上がっていきます。

- JOI のセミナーに参加する
　高校生向けに JOI がセミナーを開催してくれます。競プロ界の猛者たちがとても分かりやすくて面白い講義をしてくださる上、わからないことがあったら都度個別でも対応してくださいます。また、レクリエーションも用意されていて、Twitter 等での繋がりも広げることができます。初級・中級と分かれていますが初級の内容を基本だけでも理解している人は勇気を出して中級に行くことをお勧めします。私は中級に行ったおかげでかなり実力が伸びました。もしコースを変えたくなっても都度変更が効くので大丈夫です。

- 書籍も利用する
　競技プログラミングやアルゴリズムに関する書籍は多数出版されています。初心者におすすめなのは鹿本、鉄則本、E8本です。また、けんちょん本はマジで名著なので実力のレベルを問わずおすすめです。

- 人に頼る
　わからないことがあったらさっさと調べるなり人に聞くなりしましょう。遠慮は不要です。人のスネはかじってなんぼです。AtCoder の Twitter コミュニティに質問を投げるとほぼ必ず誰かが答えてくれるのでお勧めです。

- コンテストに出続ける
　私は実力が伸びなさ過ぎて一時期コンテストに出ていませんでしたが、よほどのことがない限りは出ましょう。コンテストこそ最良の成長の場です。

# おわりに
　数学が苦手、なんなら嫌いまであった私でも茶色になれたのですから、皆さんでもなれるはずです。ぜひ茶色になって可愛くなりましょう。

　それでは、可愛いといえば **Kawaii Future Bass** ということで、競プロ界隈恒例のおすすめ曲紹介コーナーをして終わりにしたいと思います。

### picco - Tokyo Future Girl feat.中村さんそ [Cover]
https://open.spotify.com/track/5JfY5UbMz8y2ik2cpnIwLg?si=27a1f2979a614a61

　picco さんの名曲を中村さんそさんがカバーしたやつです。かわいい×かわいいは最強です。

### Snail's House - Candy Spaceship
https://open.spotify.com/track/78p176BJL3xzguWxrgXBdP?si=7309a761d9324a5c

　Kawaii Future Bass の生みの親 Snail's House さんの曲です。かわいい。

### Krizin - Super Peace
https://open.spotify.com/track/7cozBoDwt7LOHklgmJfd3P?si=98b12f3d95b248f0

　効果音の使い方がおしゃれ。聴いてて気持ちいいです。かわいい。

### KUWAGO - Dream
https://open.spotify.com/track/0I7tGcC5FUZrHsPdMFGbkY?si=ef90b0c8b62840b6

　氏の曲は軒並みコード進行とベースがマジでエモいです。全曲聴きましょう。かわいい。

　それでは、私のよくわからない自分語りを最後まで読んでくださった方、ありがとうございました。
No.1 スライサーを使って絞り込む

# スライサーを追加
**1．ビルドから「スライサー」を選択
2．テーブルを展開し、スライサーで表示したい項目を選択する（月（期間）を追加）**
**3．表示されたビジュアルを確認する**
![作成1ezgif-5-f74210c96a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/4722ca4a-ca32-838b-0808-0a7c60439621.gif)
・期間毎の売上として絞り込む（スライサーを操作）
![作成2ezgif-5-0b92a05b09.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/5f3caa6d-9509-533f-e8f5-7823ba4e1d91.gif)

**4．更にスライサーを追加（商品を追加）**
![作成3ezgif-5-d6a72891b1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/35da1776-f0f6-842f-2490-24d8e5a0f6f7.gif)
・商品毎の売上として絞り込む
![作成4ezgif-5-1eeac6a284.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/2fd57bb1-ee4a-790b-34f9-7293c7611284.gif)
・複数の商品を選択する場合は「Ctrl」を押して選択
![スクリーンショット 2023-01-30 20.24.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/189798b4-d9c0-c801-d78c-e4d23d8aba15.png)

**5．追加した2つのスライサーを使って「期間✕商品」で絞り込む**
![作成5ezgif-5-01b4d54d46.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/a9e060c1-072f-b0d0-0343-504ba8b60ece.gif)


# スライサーの編集
**1．ビジュアルの書式設定を選択
2．フィルタリング方法を選択。今回はドロップダウンリストを選択**
![編集ezgif-5-574bd176c8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/2fadae8f-84c4-0225-7b0f-c1bd68244361.gif)
ドロップダウンリストにする事でビジュアルを小さくする事ができました。

# スライサーの利用シーン
・データ量が多く、細かいデータを見たい場合
・特定の期間内の傾向を見たい場合
・決まった観点（フィルタリング）で見るべきレポートについては、スライサーを設定しておくと初めてレポートを見る人／使う人にも何を確認すべきかが伝わりやすい

ex.)　「Direct manager(担当者)」のスライサーが用意されているので（続く）
![スクリーンショット 2023-01-30 19.33.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/cb0cbea9-51da-5c25-ee0d-12418dcd62e8.png)
（続き）担当者毎に売上結果を確認していけば良さそうだというのが分かる
![スクリーンショット 2023-01-30 19.36.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2943951/3a68c02c-267c-ffa4-fde2-93ed7c5c3a30.png)
**シンプルですが非常に重要です。**
他人が作ったレポートは何をどういった観点から確認すべきかが伝わらない事が多いので、事前に何を絞り込むべきかを定義しておきましょう。

こちらのセッションは以上です。
[→ Power BI サービス練習帳に戻る](https://qiita.com/shinyasasaki/items/391d50c2508794e8fcfd)
windows11にdocker desktop入れたけどAccess Deniedって言われて立ち上がらない

# 概要
職場のwindows11のPCにdocker desktop入れたけど立ち上げようとしたら「Access Denied」というエラーが出て立ち上がらない。

原因はそのwindowsアカウントがdocker-usersグループに入ってなかったから。

# 修正方法
大体の方針は[参考1の記事](https://qiita.com/toro_ponz/items/d75706a3039f00ba1205)どおり。

アカウント名とはwindowsキー -> 左下の方にある自分の名前 -> 「アカウント設定の変更」をクリックしたとき表示される画面で名前の下に表示されてるやつです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261800/65a7178a-c9a4-a2e4-2bed-1cce084e8356.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261800/d175d80d-7f76-2b0a-44d8-a16108c1edad.png)


これをdocker-usersのプロパティ -> 追加 -> 「選択するオブジェクト名を入力してください」の入力欄に記入し「名前の確認」を押下するといい感じになるはず。

## 問題発生：弊アカウント存在せんが？
「名前の確認」を押しても「名前が見つかりません」と言われ弾かれる。
場所が間違っとるのかと思い「場所の指定」を変更しようにも今いるところしか存在しない。

## 原因
弊アカウントが（恐らく）Azure ADで管理されておりローカルになかった。
「場所の指定」で候補に出てこなかった理由は謎。

## 対処法
管理者権限で立ち上げたコマンドプロンプトからなら設定できた。

以下のコマンドで成功しました。
```
net localgroup docker-users "DOMAIN\アカウント名" /ADD
```


# 参考
- [Docker for Windowsで起動時に「Docker for Windows - Access denied」と表示される場合の対処法](https://qiita.com/toro_ponz/items/d75706a3039f00ba1205)
- [Windows 11 - ローカルアカウントを作成・追加する方法](https://pc-karuma.net/how-to-create-offline-local-user-account-on-windows-11/)
- [Microsoftアカウントは省略できない？職場や学校？Windows10で複雑になったアカウント管理について解説（３）](https://yutech.co.jp/?page_id=8073)
- [Docker: How do I add myself to the docker-users group on windows 10 home?
](https://stackoverflow.com/questions/61530874/docker-how-do-i-add-myself-to-the-docker-users-group-on-windows-10-home)
Ruby8

# 問題
次のif文をunlessというメソッドを用いて書き換えてください。

```Ruby
if a + b > 0
  puts "計算結果は0より大きいです"
end
```

### 💡ヒント💡
<b>unless</b>
unlessとはifとは逆で、条件式がfalseの場合に処理が実行されます。

```Ruby:ifの場合
if 条件式
  条件式がtrueの時に実行する処理
else
  条件式がfalseの時に実行する処理
end
```

```Ruby:unlessの場合
unless 条件式
  条件式がfalseの時に実行する処理
else
  条件式がtrueの時に実行する処理
end
```

<br>
<br>
<br>

# 模範解答

```Ruby:模範解答
unless a + b <= 0
  puts "計算結果は0より大きいです"
end
```

# 【解説】
a + b > 0という式は、「a + b が0より大きいとき」にtrueとなります。
その結果endまでの処理が実行され文字列が表示されます。

```Ruby
if a + b > 0
  puts "計算結果は0より大きいです"
end
```

```Ruby:ifをunlessに変更
unless a + b > 0
  puts "計算結果は0より大きいです"
end
```

この場合、「a + b が0より大きい」という条件式がfalseの時に文字列が表示されます。
つまり、「a + b が0より大きくないとき」に文字列が表示されてしまいます。

```Ruby:演算子を>から<に変更
unless a + b < 0
  puts "計算結果は0より大きいです"
end
```

この場合は、「a + b が0より小さい」という条件式がfalseの時、つまり「a + b が0より小さくないとき」に文字列が表示されます。
しかしa + bが0の場合でも、「a + b が0より小さい」という条件式がfalseとなるため文字列が表示されてしまいます。

a + bが0の際に文字列を表示させないようにするには「a + b が0以上のとき」にfalseになる条件式に変更します。

```Ruby
unless a + b <= 0
  puts "計算結果は0より大きいです"
end
```

<br>
<br>
<br>

逆を考えるところまでは正解でしたが、演算子（<=）が出ませんでした。
改めて解説を理解しながら学ぶと発見があります。
Visual Studio Codeの便利な設定と拡張機能(自分用メモ)

# はじめに
Visual Studio Code(以下VSCode)を使いこなすための自分用のメモです。
随時更新したいです。

# 標準機能の設定

## VSCode起動時に前回開いていたファイルやワークスペースを開かない
複数のワークスペースを使用しており、勝手に前回と同じものを開かれたくない場合に便利です。
```JSON:settings.json
    "window.restoreWindows": "none"
```

## ファイルをVSCodeで開く時に新しいウィンドウで開く
意図せずワークスペースで関係無いファイルを開いてしまうのが嫌な場合。
```JSON:settings.json
    "window.openFilesInNewWindow": "on"
```

## エディターで空白文字を表示する
空白文字を表示します。ただ、ダークモードだとそんなに見えやすくないです。
```JSON:settings.json
    "editor.renderWhitespace": "all",
```


# 拡張機能

## 共通編

### Whitespace+
空白文字などを強調表示できます。設定の自由度が高いです。

https://marketplace.visualstudio.com/items?itemName=davidhouchin.whitespace-plus

### code-eol
改行コードを可視化してくれます。（標準で無いのは何故……）

https://marketplace.visualstudio.com/items?itemName=sohamkamani.code-eol

### GitLens — Git supercharged
Git関連の操作が便利になります。コードを誰がいつ書いたのかが行の横に表示される機能がとても快適です。

https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens

## マークアップ言語編
### XML
XMLの静的解析ツールです。

https://marketplace.visualstudio.com/items?itemName=redhat.vscode-xml

## YAML
YAMLの静的解析ツールです。

https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml

### markdownlint
Markdownの静的解析ツールです。書き方が合ってないと指摘してくれます。

https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint

## Markdown All in One
プレビュー機能などMarkdownの編集を支援します。

https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one

## Markdown Preview Mermaid Support
Mermaidのプレビューを提供します。

https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid

## Java編
以下の6つのパックです。
- Language Support for Java(TM) by Red Hat
- Debugger for Java
- Test Runner for Java
- Maven for Java
- Project Manager for Java
- IntelliCode

https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack

###  Gradle for Java
Gradleの拡張機能です。

https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-gradle


## Spring編
### Spring Boot Extension Pack
以下の3つのパックです。
- Spring Boot Tools
- Spring Boot Dashboard
- Spring Boot Dashboard

https://marketplace.visualstudio.com/items?itemName=Pivotal.vscode-boot-dev-pack

## JavaScript編
### ESLint
JavaScriptの静的解析ツールです。

https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint

## Kotlin編
### Kotlin Language
Kotlinのシンタックスサポートです。

https://marketplace.visualstudio.com/items?itemName=mathiasfrohlich.Kotlin
[Ruby] ifとunlessの考え方の違い

<h2>ifとunlessの違いがわかっていませんでしたので、自分なりに纏めてみました。<br>
</h2>

```ruby 
#if ~ end
if A == B 
 puts C
end
#unless ~ end
unless A == B
 puts C
end
```
どちらもtrueで処理が実行されていくのは一緒です。
ですが、trueになる条件が違います。

①ifの場合、真がtrueとなり、処理が実行される。
```ruby 
#if ~ end
if A == B 
 puts C
end
```
②unlessの場合、偽がtrueとなり、処理が実行される。
```ruby
#unless ~ end
unless A == B
 puts C
end
```
勘違いしやすいですが、処理される条件を理解してメソッドを使用しましょう。
Blazor学習メモ①　Blazorの種類

※Blazorに関して自分で学んだ内容を投稿します。
あくまで自分用メモなのでミスがあるかもしれません。

## Blazorの種類

### Blazor server

サーバー側で動作するアプリ

webサーバーで動くのでサーバーが動くとアプリも止まる

### Blazor webassembly

ブラウザ内で.NETコードが動く

クライアント側でダウンロードして動くのでwebサーバーの用意はいらない

### Blazor PWA

　ウェブサイトをブラウザから見るのではなくアプリを立ち上げるように見ることができる

オフラインでもウェブサイトを見ることができる

### Blazor Hybrid

1つのソースコードでデスクトップアプリとwebアプリの両方を実現できる(.Net6.0以降)

### Blazor Native

htmlでなく独自のタグで実装できる


パターンごとの使い分けに関してはまだわかっていないが、今の自分はBlazorServerを主に使うことになりそう。
Python for文まとめ

# 0 はじめに　

## この記事について

殆どのプログラミング言語にはfor文なるものが存在します。
for文には、その言語の熟練度と言っても過言ではない程、色々な使い方が存在するものです。

この記事ではPythonでのfor文の用法をまとめてみました。
私の知る限りの用法をまとめましたので、参考にして頂けますと幸いです。

Pythonを少しでもわかる方が対象です。

## for文とは

for文は次のような事ができます。
①ある操作を指定した回数繰り返す
②イテレータの要素を1つずつ見ていく

イテレータとは簡単に言えば「何かが集まったもの」です。
文字列や配列などがイテレータに該当します。

又、①も実は②に含まれると言うことができます。
発展的な話題なのでそれについては後述します。

# 1 基本

## 1-0 カウント変数

for文にはカウント変数というものが存在します。
カウント変数はfor文を回すごとに指定した通りに変化していきます。

`for (カウント変数) in (なんか)`という形が基本です。

## 1-1 for i in range(N)

これが最も有名でしょう。

`for i in range(N)`で、`i`は`0`から`N-1`まで`1`ずつ増えていきます。
(`1`から`N`までとはならないことに注意して下さい。)

なので、

```py
for i in range(6):
  print(i)
```

これを実行すると、出力は

```py
0
1
2
3
4
5
```

となります。

## 1-2 for i in range(A,B)

`for i in range(A,B)`で、`i`は`A`から`B-1`まで変化します。
`B`は含まれません。

なので、

```py
for i in range(-1,3):
  print(i)
```

を実行すると出力は

```py
-1
0
1
2
```

となります。

## 1-3 for i in range(A,B,C)

`for i in range(A,B,C)`で、`i`は`B`を過ぎるまで`A`は`C`ずつ増えてきます。

なので、

```py
for i in range(2,8,3):
  print(i)
```

これを実行すると
```py
2
5
```
となりますし、(8を過ぎるまで、2から3ずつ増やしていくと2→5となります)

```py
for i in range(6,2,-1):
  print(i)
```

これを実行すると
```py
6
5
4
3
```
となります。(2を過ぎるまで6から1ずつ減らしていくと6→5→4→3となります)

...

実は、`1-1`と`1-2`で紹介した用法は、`1-3`で`B`と`C`の引数を省略した形なのです。
厳密に言えば`range(N)`は`range(0,N,1)`、`range(A,B)`は`range(A,B,1)`と同義です。

## 1-4 for文の中断・スキップ

`break`で、処理中のfor文を終了し、`continue`でfor文の処理をスキップできます。
又、for文を`break`したかは`else`で判定できます。

具体的には、

```py
for i in range(5):
  print(i)
  if i==3:
    break
```

を実行すると、

```py
0
1
2
3
```
のように、`i=3`の時にfor文は終了し、


```py
for i in range(6):
  if i%2==0:
    continue
  print(i)
```
を実行すると、
```py
1
3
5
```
のように、`i%2==0`、即ち`i`が偶数の時にfor文の処理がスキップされます。

そして、
```py
for i in range(5):
  print(i)
  if i==3:
    break
else:
  print("for文が終了されました")
```
とすると、
```py
0
1
2
3
for文が終了されました
```
のように、for文が`break`で終了された時に限り`else`以下の処理が行われます。

# 2 イテレータの要素を見ていく用法

## 2-1 for i in (イテレータ)

`for i in (イテレータ)`で、`i`がイテレータの要素を1つずつ移っていきます。

つまり、

```py
S="abcd"
for i in S:
  print(i)
```

を実行すると

```py
a
b
c
d
```
となります。

又、
```py
L=[4,2,5,3]
for i in L:
  print(i)
```

を実行すると
```py
4
2
5
3
```
となります。

## 2-2 for i,n in enumerate(L)

```py
for i,n in enumerate(L):
  print(i,n)
```
は、
```py
for i in range(N):
  print(i,L[i])
```
と同義です。

即ち、`for i,n in enumerate(L)`とすると、`i`は`0`から`Lの長さ-1`まで変化、`n`は`L`の要素を1つずつ移っていきます。
割とよく使うので覚えておくとよいでしょう。

## 2-3 辞書型の要素を見ていく用法

辞書型については次を参照してください。[辞書型についての記事](https://www.sejuku.net/blog/24122)

`D`を辞書型の変数とすると、`D.keys()`で`D`のkey、`D.values()`で`D`のvalue、`D.items()`で`D`のkeyとvalueの組の配列を得られます。(実際には型は配列ではないです)

なので、
```py
D={1:"a",2:"c",3:"d",4:"b"}
for n,a in D.items():
  print(n,a)
```
を実行すると
```py
1 a
2 c
3 d
4 b
```
となります。
(出て来る順番はkeyでソートされているっぽいです)

# 3 おわりに

以上です。
小一時間で適当に書いた記事なので分かりにくい点があると思いますが、不明点等ございましたらコメント欄にてお願いします。
他にもPythonに関する記事を出す予定なのでその際にはお読み頂けますと光栄です。