OmniAICreator/Qiita-1.07M huggingface dataset:
Railsの前段階としてRubyをつくりながら学ぶ

# Railsの前にRuby

　Railsを個人開発で使っていくにあたり、その前段階としてRubyがあった。とにかくRubyのコードを少しはかけるようにならないとどうしようもない。そういうわけで、Rubyで簡単なゲームを作った。

https://qiita.com/kyokucho1989/items/fea6ad610d411e008224

https://github.com/kyokucho1989/ruby-game

　チンチロゲームだ。サイコロを回しながら、プレイヤーとディーラーで点数のやりとりをする。簡単な四則演算はどの言語でも問題なく学習は進むと思う。ただ、クラスとかオブジェクトとか、そういった概念の話になると途端に迷う。

　私もよくわからなかった。チェリー本で例題を解きながらやっていくもいまひとつ実感が持てない。しっくりくるものがない。それは多分、言語化ができていなかったからだ。

　そんなことがあって、自分で教材をつくった。

https://zenn.dev/kyokucho1989/books/93888412a4cb49af4cf3

　Rubyでオリジナルプログラムをつくるための教材だ。はじめにユーザーの入力から数値のやりとりをして出力するゲームの作り方を書いた。その後に、オブジェクト指向を紹介して、競馬ゲームの作り方を書いた。

　コードを解説すると、やっと学んだことが血や肉になってきた感じがしてきた。この感覚が必要なのだろう。

# おわり

　どこかで、一番効率の良い学習方法は人に教えること、と聞いた。たしかにその通りだ。頭の中にあることを文章にすることで、知識は明確になる。これでRubyの文法はある程度理解したのでRailsに入ることができた。

　個人開発をやっていこう。
MathWorks か IEEE かどっち NaN だい！？～ atan2 の定義域を巡って（2022/12/18追記）

[<B>MATLAB/Simulink Advent Calendar 2022</B>](https://qiita.com/advent-calendar/2022/matlab)に参加しました。


・使用ツール
<dt>　MATLAB</dt>
<br>

<H4><a href="https://note.com/leftbank/n/n883216b862f6"</a> [<B>note</B>]にUpしました。</H4>

「C でも NaN は返さない」辺り、「Simulink モデル実行結果」でしかちゃんと示していなかったので、文章でも追加しました。（2022/12/18）
【超簡単】Excel・スプレッドシート 項目ごとにその数を算出する方法

# はじめに
名簿から項目ごとに、その項目に該当する人が何人いるか把握したくなることってありませんか！？

今回は私と同じような思いをお持ちになった方に向けて、そのやり方を伝授します！

# 完成形
以下の写真のように、名簿から出身大学別の人数を導き出せたら完成です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/0a142a18-ab53-fc63-978c-f0942e707b0b.png)


※ こちらの名簿は以下のサイトからお借りしました。

http://mw211.com/tekito/tekito01.htm

また実際の完成形スプレッドシートも以下に載せておくのでぜひご確認ください！

https://docs.google.com/spreadsheets/d/1mwXMG8534N31__e-K-ygA28RKHl2Ly3-1li6d75bsx0/edit#gid=1103384671

# 実装方法
① 以下のスプレッドシートをコピーしてください

https://docs.google.com/spreadsheets/d/1mwXMG8534N31__e-K-ygA28RKHl2Ly3-1li6d75bsx0/edit#gid=1103384671

ファイル→コピーを作成 で作成できます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/9214ef90-c443-a90d-18c8-c8dd7b0e0af9.png)

コピーを作成できたら、シートの一番下に以下のシートがあることを確認してください！


② 新たなシートを作成してください
左下のプラスボタンを押すと何かしらのシートが作成されたことが確認できればOKです！


③ ユニークな出身大学を抽出する
A1セルに以下の関数を記述しましょう！
```
=UNIQUE('名簿'!H:H)
```
これで名簿から出身大学がユニークで抽出されました！

※ ユニークとは一意という意味です！

以下のようになっていたら成功です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/4485bb29-755f-07e5-d738-1f9dd0477d56.png)


④ B1セルに項目を記入！
B1セルに「出身者数」と記入しよう！

⑤ A列にある大学出身者数をcountifで判定！
以下の関数をB2に埋め込みましょう！
```
=COUNTIF('名簿'!B:B,A2)
```
解説
```
countif(カウントしたい範囲,カウントしたい値)
```
今回は、名簿シートのH列から、作成中のシートのA列にある大学出身者数をカウントします！


⑤ 全ての大学での出身者数をカウントしよう！
以下の関数をB2に埋め込みましょう！
```
=ARRAYFORMULA(COUNTIF('名簿'!H:H,A2:A8))
```

以下のようになっていれば成功です！
![スクリーンショット 2022-12-14 5.28.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/16af40a7-3271-0ecc-9368-158266ebc4c3.png)



# 最後に
スプレッドシートでできることはほかにもたくさんあります！
関数を勉強してみてたくさん組み合わせて、自分が作りたいものを実装できるようになるまで練習しましょう！
ReactHooksについてまとめる（State Hooks）


# 概要
Stateはコンポーネントがユーザ入力のような情報を「記録」することを可能にします。　例えば、フォームコンポーネントがは入力値を保存するためにStateを使用したりします。

```jsx
function FormComponent() {
    const [text, setText] = useState("");
    // ...
```

コンポーネントにStateを追加するには以下のどちらかのHooksを使用します。

## useState
useStateはコンポーネントのトップレベルで宣言され、`[<current state>, <set function>]`のような配列で命名されます。`useState`の引数にはそのstateの初期値が与えられます。

```js
const [age, setAge] = useState(42);
```

set関数で新たにstateが更新されても、その実行関数内では更新される前の値になることに注意です。
更新される値を使用するには再レンダリング後でないといけません。

```js
function handleClick() {
    setCount(count + 1);
    console.log(count) // ← initial Stateが0の場合 0が出力される
  }
```


useStateを使った例

https://codesandbox.io/embed/trusting-mopsa-e52bbn?autoresize=1&fontsize=14&hidenavigation=1&theme=dark


## useReducer
useReducerはコンポーネントのトップレベルで宣言され、reducerで状態を管理します。
useReducerは2つの項目の配列を返却します。1つ目は現在の状態を表すstate, 2つ目はstateを更新するためのdispatchメソッドです。
stateの更新をするにはアクションと呼ばれる、ユーザが行ったことを表すオブジェクトでdispatchメソッドを呼び出します。

```js
function reducer(state, action) {
  // ...
}

function MyComponent() {
  const [state, dispatch] = useReducer(reducer, { age: 42 });

  function handleClick() {
      dispatch({ type: 'incremented_age' });
  }
  // ...
```

useReducerはuseStateとよく似ていますが、イベントハンドラーからコンポーネントの外部にある単一の関数に状態更新のロジックを移動させることができます。


useReducerを使った例

https://codesandbox.io/embed/sad-wildflower-fjrfuh?fontsize=14&hidenavigation=1&theme=dark

# useStateとUseReducerの使い分け
https://beta.reactjs.org/learn/extracting-state-logic-into-a-reducer#comparing-usestate-and-usereducer

- Code size （コードサイズ）
useStateを使用すると最初に書くコードが少なくなる
useReducerを使用すると reducer関数とdispatchアクションの両方を書かなければならないので、記述量は多くなるが同じようなstate更新がある場合は共通化ができる。

- Readability （読みやすさ）
useStateは、状態の更新が単純であれば読みやすいが、複雑な更新になるとコンポーネントのコードが複雑になり可読性が低くなる場合がある。
useReducerは更新ロジックと何のイベントなのかのイベントハンドラーがキレイに分離できるため可読性が高い。

- Debugging （デバッグ）
useStateで不具合が発生した場合、どこで間違った状態になったのかをデバッグするのが難しい。
useReducerでは、reducerにコンソールログ等を追加して、すべてのステートの更新とその理由（どのアクションによるものなのか）が確認できます。しかし、useStateより多くのコードを書くことになります。

- Testing （テスト）
reducerは純粋な関数なので、コンポーネントに依存しないテストを書くことができます。つまりreducer単体でexportさせて単体テストを書くことができます。

コンポーネントが正しく更新されないことが頻繁に発生する場合にはreducerを使うことが推奨されています。




# 参考
https://beta.reactjs.org/apis/react

https://beta.reactjs.org/apis/react/useState

https://beta.reactjs.org/apis/react/useReducer
デスクトップ版Neo4jのインストールの仕方

# はじめに
Neo4jをブラウザ版で操作しながら学んでいましたが、[とあるチュートリアル](https://neo4j.com/developer/graph-data-science/applied-graph-embeddings/)を進めていく上で、デスクトップ版Neo4jのインストールをする必要が出てきたので備忘録としてデスクトップ版Neo4jの基本的なことについて記事にしようと思います。

この記事がどなたかのお役に立つ日が来れば嬉しいです😆
※初学者なりに理解した内容ですので温かい目で見守ってください。
# 目次
- Neo4jとは
- インストールしていく
- 基本的な使い方
- まとめ

# デスクトップ版Neo4jとは
[Neo4j](https://neo4j.com/)とは・・・
オープンソースのGraphDBのDBMS(データベース管理システム)です。
SQLライクなCypherという独自のクエリ言語を使います。

Neo4jを使うにはブラウザやローカル環境でもできますが、今回はデスクトップ版をインストールしていきます。

# インストールしていく
## ダウンロード
[ダウンロードページ](https://neo4j.com/download/)
![pic001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2340557/9f652244-0575-9fe4-1b18-3579cf2d8728.png)

## 必要事項の入力
![pic003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2340557/e60a7c2f-d687-caf4-01f4-0dd993e0054f.png)
入力したらインストールしたアプリをapplicationに入れればダウンロードは完了です。

# インストールしたら
## 起動
アプリを起動したら、左上の＋マークを押してCreate projectを押します。
![pic003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2340557/aff01441-8970-0fd9-0573-459c95c3adb1.png)

これで最低限の準備は完了です。

# まとめ
これでデスクトップ版Neo4jのインストールは完了です。
次は[チュートリアル](https://neo4j.com/developer/graph-data-science/applied-graph-embeddings/)を頑張ります！
2022/12/14主にITとかセキュリティの記事

Fortinet製品のSSL VPN機能に脆弱性 - すでに悪用、侵害調査を
https://www.security-next.com/142121

「FortiOS」の脆弱性で国内外セキュリティ機関が注意喚起
https://www.security-next.com/142130

F5の「BIG-IP」に複数の脆弱性 - ホットフィクスで修正
https://www.security-next.com/142117

ランサムウェアによるサイバー攻撃で被害 - ボランティア団体
https://www.security-next.com/142143

「Avast」「AVG」に権限昇格が可能となる脆弱性 - 最新版の利用を
https://www.security-next.com/142113

日本に必要なのは「セキュリティ統合」　チェックポイントが2023年のサイバーセキュリティ予測を発表(12/12)
https://enterprisezine.jp/news/detail/17097

チェック・ポイント、2023年のサイバーセキュリティに関する予測を発表　サイバー人材の不足は現在の340万人規模からさらに拡大する見通し(12/12)
https://japan.cnet.com/release/30810890/?ref=rss

職業としてのセキュリティ--世界で急増しているセキュリティ人材(12/12)
https://japan.zdnet.com/article/35197023/

なぜ企業のITセキュリティは「ゼロトラスト」を目指す必要があるのか(12/12)
https://news.mynavi.jp/techplus/article/tecproc-6/

（最終回）　PHPの脆弱性～型混同～(12/12)
https://gihyo.jp/article/2022/12/prevent-vulnerability-0005?utm_source=feed

東海国立大学機構がランサム被害 - ログに総当り攻撃の痕跡
https://www.security-next.com/141573

国際協力で制御システムを守れ――「サイバーセキュリティウィーク」レポート(12/12)
https://monoist.itmedia.co.jp/mn/articles/2212/12/news010.html

半導体工場で求められるセキュリティ対策、重要なのはサプライチェーンとしての考え方(12/12)
https://news.mynavi.jp/techplus/article/20221212-2534140/

バッファローの複数ネットワーク製品に脆弱性、ファームウェアの更新を(12/12)
https://news.mynavi.jp/techplus/article/20221212-2535740/

Trellix、「セキュリティ担当者と経営層の意識調査レポート 2022」を発表(12/12)
https://securityinsight.jp/news/13-inbrief/5253-221212-1

Dfinity財団、ICPとビットコイン（BTC）ネットワークの統合完了を発表(12/12)
https://www.neweconomy.jp/posts/282443

DXPの概要やメリットについて解説｜顧客体験を向上させるために必要なこととは？(12/12)
https://www.digital-transformation-real.com/blog/explain-overview-and-benefits-of-dxp

大日本印刷、約4万人の東京都全職員に向けた職層別サイバーセキュリティ人材育成を支援(12/12)
https://securityinsight.jp/news/13-inbrief/5254-221212-2

Cisco IP Phoneに重要な脆弱性、アップデートを(12/12)
https://news.mynavi.jp/techplus/article/20221212-2534470/

ランサムウェアを政治目的でワイパーマルウェアに変える事例が増加(12/12)
https://news.mynavi.jp/techplus/article/20221212-2532190/

仮想通貨詐欺師の巧妙化にMicrosoftが新たな脅威について警告(12/12)
https://nextmoney.jp/?p=55334

キャッシュによるRubyの正規表現のマッチングの高速化の紹介(12/12)
https://techlife.cookpad.com/entry/2022/12/12/162023

バイナンスで異常なアルトコイン取引発覚=公正な市場行動とジャオCEO(12/12)
https://nextmoney.jp/?p=55322

5万台以上のAndroidデバイスが「Xenomorph」バンキング型トロイの木馬に感染(12/12)
https://news.mynavi.jp/techplus/article/20221212-2535258/

「官民によるサイバー対策を」　新風賞の松原実穂子氏が講演(12/12)
https://www.sankei.com/article/20221212-CUGR5H7DAZKDXHFYHYRU4UKE7A/

IT人材が戦争を指導する時代(12/12)
https://agora-web.jp/archives/221210230025.html

有明コロシアムの図面などが流出か、都立スポーツ施設の工事業者にサイバー攻撃(12/13)
https://xtech.nikkei.com/atcl/nxt/column/18/00598/070100194/

尼崎市USB紛失でBIPROGYも調査報告書、「役職員のコンプライアンス意識が低い」(12/12)
https://xtech.nikkei.com/atcl/nxt/news/18/14302/
【GMC-4】自販機風？LED点灯

学研の4ビットマイコン GMC-4 で、LEDを以下のように点灯させる。

1. 左から右に1個流れていく。
2. 右端に着いたら、そこで止まってまた新しい光が左から来る。
3. 新しい光は既にある光の1個前で止まる。さらに新しい光が左から来る。
4. 全ての枠が埋まったら、右の光から順に1個ずつ右にはけていく。

このようなパターンで光っている自動販売機があったかなあ。

# プログラム

以下のプログラムは、[MikeAssembler](https://mikecat.github.io/mike_assembler/) でアセンブルできる。

```
target gmc4

start:
	; メモリに右端の位置を記録する
	TIA 0
	TIY 4 ; 記録するメモリの位置 兼 1回の待ち時間
	AM
	CY
	CAL TIMR
loop1_1:
	; 左端を点灯する
	TIY 6
	CAL SETR
loop1_2:
	CAL TIMR
	; 右端か判定する
	CY
	M-
	CIA 0
	JUMP loop1_continue
	; 右端に着いたので、右端を1個左にして左端から再開する
	TIA 1
	M+
	AM
	CY
	CIY 7
	JUMP loop1_1
	; 右端が一番左の時まで終わったので、後半へ
	; ここにJUMP命令を置いて後半に飛ばすかわりに、ここに直接後半のコードを書く
	; メモリに左端の位置を記録する
	CY
	TIA 0
	AM
	CY
loop2:
	CAL TIMR
	; 消灯し、それが右端かを判定する
	CAL RSTR
	AIY -1
	JUMP loop2_continue
	; 右端だったので、左端を1個左にして左端から再開する
	CY
	TIA 1
	M+
	AM
	CY
	CIY 7
	JUMP loop2
	; 左端が一番左の時まで終わったので、前半へ
	CAL TIMR
	JUMP start
loop2_continue:
	; 右端じゃなかったので、点灯する位置を1個右にずらす
	CAL SETR
	JUMP loop2

	; 前半のコードの続き
loop1_continue:
	M-
	CY
	; 点灯する位置を右に1個ずらす
	CAL RSTR
	AIY -1
	CAL SETR
	JUMP loop1_2
```

以下は、このプログラムの機械語表現である。

```
  | 0 1 2 3  4 5 6 7  8 9 A B  C D E F
--+-----------------------------------
0 | 8 0 A 4  4 3 E C  A 6 E 1  E C 3 7
1 | C 0 F 4  2 8 1 6  4 3 D 7  F 0 8 3
2 | 8 0 4 3  E C E 2  B F F 3  D 3 8 1
3 | 6 4 3 D  7 F 2 4  E C F 0  0 E 1 F
4 | 2 4 7 3  E 2 B F  E 1 F 0  C
```

# 実行結果

<iframe width="560" height="315" src="https://www.youtube.com/embed/d9_8005BXg4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
PILでパレットモードの画像の色ごとにpngを生成する

## １.きっかけ
semantic segmentationのモデルを作成する際に出力結果のセグメンテーションごとに画像を分ける必要があった。

#### 元画像の例
![segmentation_mask.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3066359/1a8a596a-77c3-20b5-6697-0a13b5825526.png)



## ２.実装

```python
from PIL import Image
import numpy as np
# 画像ファイルを読み込む
img = Image.open("hoge.png")

# パレットモードかどうか判定する
if img.mode != "P":
    print("画像がパレットモードではありません")
    exit()
img_rgb = img.copy()
palette = img.getpalette()
img_rgb = Image.new("RGBA",size=img.size)

w, h = img.size
colors = set()
#　画像内の色を抽出する
for y in range(h):
    for x in range(w):
        colors.add(img.getpixel((x,y)))

# 色ごとにその色以外を透過させた画像を生成
for color in colors:
    for y in range(h):
        for x in range(w):
            color_pixel = img.getpixel((x, y))
            if color_pixel != color:
                r = img.getpixel((x,y))
                img_rgb.putpixel((x,y),(palette[r*3],palette[r*3+1],palette[r*3+2],0))
            if color_pixel == color:
                r = img.getpixel((x,y))
                img_rgb.putpixel((x,y),(palette[r*3],palette[r*3+1],palette[r*3+2],255))

    img_rgb.save(f"sample_{color}.png")

```
このコードではまずImage.newでRGBAの画像を新たに生成している。
その後、画像に使われているパレットのインデックスを全て取得し、そのインデックス以外の色を透過させる画像をインデックスの数だけ生成している。

#### 出力結果
![sample_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3066359/d684ff65-ccfc-459a-60e1-2eac998a4460.png)
![sample_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3066359/82addcdf-67d6-3ca4-8967-888f6fd3ee88.png)
![sample_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3066359/3d33740f-37e2-6907-1563-01d34c6f8341.png)
![sample_255.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3066359/7546ee78-6136-807d-dae3-f90e2b2a281c.png)


次回はセマンティックセグメンテーションで示されたオブジェクトを元画像から抽出するコードを書きたい。

※追記　やった(https://qiita.com/ksmkzs/items/79e6b0a34a21e182ccad)
Software development

# Develepment processes

## Scrum development

- Sprint
- Story points
- Fibonacci sequence

https://www.scrum.org/resources/what-is-scrum

### Scrum meeting

- Sprint Planning
- Daily scrum
- Sprint review
- Sprint retrospective

https://www.productplan.com/glossary/scrum-meeting/

### Scrum artifacts

- Product backlog
- Sprint backlog
- Increments

## Waterfall model

- Obsoleted
- Analysis
- Design
- Coding
- Testing
- Operations

## Code review

- Two reviewers or more
- As soon as quickly
- Build check
- Compile warning
- Impact

### Review points

- Coding style
- Robust
- Consistency

https://docs.kernel.org/maintainer/maintainer-entry-profile.html

https://docs.kernel.org/maintainer/index.html

https://docs.kernel.org/process/submit-checklist.html

## Branches

- Mainline
- Maintenance branches
- Release branches
- Development branches

### Sub modules

## Roles

- Maintainer
- Reviewer
- Developer
- Tester
- Product owner

 ***

## Coding style

https://docs.kernel.org/process/coding-style.html

https://www.kernel.org/doc/html/v4.10/process/coding-style.html

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/coding-style.rst

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/.clang-format

```
find . -iname "*.c" | xargs clang-format -i
```

## Programing languages

- C
- C++
- Java
- Python
- Perl
- HSP

# Tools

- Redmine
- Jira
- GitHub
- GitLab
- MediaWiki
- clang-format
- Git
- Hidemaru
- Tera Term
- Stacked Git
- gcc
- clang
- Font

https://github.com/adobe-fonts/source-han-code-jp

 ***

# Broken window

https://en.wikipedia.org/wiki/Broken_windows_theory

https://ja.wikipedia.org/wiki/割れ窓理論

https://www.santuon.com/broken-windows-in-code/

https://betterprogramming.pub/apply-broken-windows-theory-to-the-software-design-9477cef9bdce

https://medium.com/@learnstuff.io/broken-window-theory-in-software-development-bef627a1ce99

https://www.linkedin.com/pulse/broken-window-theory-software-development-leon-lahoud/

https://codeahoy.com/2016/05/02/software-rot-entropy-and-the-broken-window-theory/
Ubuntu Personal Command Collection

# 【Ubuntu】個人的によく使うコマンド集
- OS環境: Ubuntu 20.04

### 目次
[ターミナル上でのコピー&ペースト](#ターミナル上でのコピーペースト)
[ターミナル上で選択範囲を指定](#ターミナル上で選択範囲を指定)
[フォルダ内閲覧 ls](#フォルダ内閲覧)
[フォルダ移動 cd](#フォルダ移動)
[ディレクトリ削除 rm](#ディレクトリ削除)
[ディレクトリ移動 mv](#ディレクトリ移動)
[実行中の動作キャンセル](#実行中の動作キャンセル)
[[Tab]キーを使って予測入力](#tabキーを使って予測入力)
[ファイルを作成 touch](#ファイルを作成)
[ターミナル内ファイル編集 nano](#ターミナル内ファイル編集)
[別ウィンドウファイル編集 gedit](#別ウィンドウファイル編集)
[2つ以上のコマンドを併記 &&](#2つ以上のコマンドを併記)
[フォルダ構成閲覧 tree](#フォルダ構成閲覧)
[ファイル圧縮 zip](#ファイル圧縮)
[zipファイル解凍 unzip](#zipファイル解凍)
[スクリーンショット](#スクリーンショット)
[画面録画](#画面録画)

## ターミナル上でのコピー&ペースト
WindowsNo場合
`Ctrl` + `Shft` + `C`
`Ctrl` + `Shft` + `V`
Macの場合
`Command` + `C`
`Command` + `V`

## ターミナル上で選択範囲を指定
`shift + home`を押したあと選択範囲の最初の行をクリックする。そして、
`shift + end`を押した後`shift`を押しながら選択範囲の最後の文字をクリックする。

## フォルダ内閲覧
```
ls
```
## フォルダ移動

ホームにあるフォルダにアクセスする場合、ホームという意味の`~/`をつけることが多いがなくても移動できる。
```
cd ~/foldername
cd foldername
```
フォルダを1つ戻る場合は
```
cd ..
```
今いるフォルダからホームに移動する場合は
```
cd
```

## ディレクトリ削除
```
rm -rf  ディレクトリ名
```

## ディレクトリ移動
フォルダ1の中身全てをフォルダ2に移動
```
mv folder1/* folder2/
```

## 実行中の動作キャンセル
`Ctrl` + `C`

## [Tab]キーを使って予測入力
フォルダ名やファイル名が長い場合、コマンドの後に名前の最初の文字を打ち込んで`[Tab]キー`を押すとその文字から始まるフォルダ名やファイル名が予測入力される。
似た名前のフォルダが複数ある場合は重複部分まで予測入力される。
```
$ls
aiueo_ws kakikukeko_ws
$cd k[Tab]
    ↓
$cd kakikukeko_ws
```
## ファイルを作成
```
touch filename.cpp
touch filename.py
```

## ターミナル内ファイル編集
```
nano filename.cpp
```
ターミナル上にファイルの中身が表示される。
```
#include <iostream>

using namespace std;
int main(){
  cout << "Hello world." << endl;
  return 0;
}

^G Get Help  ^O Write Out ^W Where Is  ^K Cut Text  ^J Justify   ^C Cur Pos
^X Exit      ^R Read File ^\ Replace   ^U Paste Text^T To Spell  ^_ Go To Line

```
`[Ctrl]+[特定のアルファベット]`で操作ができる。
例えば、nano表示を抜ける場合は`[Ctrl]+X`。

## 別ウィンドウファイル編集
```
gedit filename.cpp
```
## 2つ以上のコマンドを併記
`&&`は「かつ」という意味。
```
cd foldername && gedit filename.cpp
```
## フォルダ構成閲覧
インストールが必要。
```
tree filename
```
```
$ tree a_ws
a_ws
├── b
│   └── x
└── c

3 directories, 0 files
```
## ファイル圧縮
```
zip -r {圧縮後のzipファイル名.zip} {圧縮したいフォルダ名}
```
[詳しくはこちら](https://qiita.com/supersaiakujin/items/c6b54e9add21d375161f)

## zipファイル解凍
```
unzip filename.zip
```
[詳しくはこちら](https://qiita.com/supersaiakujin/items/c6b54e9add21d375161f)

## スクリーンショット
実行した瞬間に撮影。
```
gnome-screenshot
```

## 画面録画
[Alt+Ctrl+Shift+R]
を同時に押すことで録画開始と録画終了ができる。録画開始すると右上に録画中の表示ボタンが出る。
しかし、標準の録画時間は最大30秒である。また、保存形式はwebmファイルであり、このファイル形式でもパワーポイントに貼り付けることができる。

最大録画時間を1時間にするには以下を実行。
```
gsettings set org.gnome.settings-daemon.plugins.media-keys max-screencast-length 3600
```
mp4ファイルとして保存したい場合はSimpleScreenRecorderを使用する。インストール方法は割愛。
[参考元](https://freepc.jp/post-43215)

---
<font color="yellowgreen">**QiitaLink**</font>
<font color="black">**Designed by RENOX**</font>
paizaラーニング「【配列の検索】何個ある? Boss Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__search_count_boss
#### 私の解答
```Python3
N, M = map(int,input().split())
li = [int(x) for x in input().split()]
print(li.count(N))
```
#### 解答例1
```Python3
values = input().split()
N = int(values[0])
M = int(values[1])

A = [0] * M
values = input().split()
for i in range(M):
    A[i] = int(values[i])

ans = 0
for a in A:
    if a == N:
        ans += 1

print(ans)
```
#### 解答例2
```Python3
N, M = map(int, input().split())
A = [int(x) for x in input().split()]

print(A.count(N))
```
paizaラーニング「何個ある? 2 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__search_count_step2
#### 私の解答
```Python3
n =  int(input())
li = [1, 2, 5, 1, 4, 3, 2, 5, 1, 4]
print(li.count(n))
```
#### 解答例1
```Python3
N = int(input())
li = [1, 2, 5, 1, 4, 3, 2, 5, 1, 4]

ans = 0
for ele in li:
    if ele == N:
        ans += 1

print(ans)
```
#### 解答例2
```Python3
N = int(input())
li = [1, 2, 5, 1, 4, 3, 2, 5, 1, 4]

print(li.count(N))
```
ソフトウェア・アーキテクチャ・ハードパーツを読みたい

# ソフトウェア・アーキテクチャ・ハードパーツを読みたい

https://www.oreilly.co.jp/books/9784814400065/

タイトルどおり、まだ読んでませんが、アーキテクトに関わっているので触りのところだけ読んでも面白そう。

本書ですが、[ソフトウェア・アーキテクチャの基礎](https://www.oreilly.co.jp/books/9784873119823/)がベースになっています。
「ソフトウェア・アーキテクチャの基礎」を読んでいないといけないわけではなく、どちらかというと入門編、本書は実践編というような位置づけだという感じだと思います。


## ざっくりいうと

#### ソフトウェアアーキテクチャは堅い（ハード）
* ソフトウェアアーキテクチャとは、ソフトウェアのソフトな部分の土台となるハードな部分
* ソフトウェアアーキテクチャとは後から変更するのが難しいお部分のことである。

#### ソフトウェアアーキテクチャ上の決定は困難（ハード）
* アーキテクトが直面するのは事業や組織的な環境に長期的に影響を与え、相互にも影響を与え合う困難な問題
* アーキテクチャとは、Googleで答えを見つけられないものだ

## ソフトウェア・アーキテクチャーの第一法則
**ソフトウェアアーキテクチャはトレードオフがすべて**

”アーキテクチャのあらゆる問いに共通する答えは「場合による」のだ。
答えはデプロイ環境やビジネスドライバー、企業文化、予算、期間、開発者のスキルセットその他の多くの要因に依存する。環境や状況、問題点はそれぞれに異なるものだ。だからアーキテクチャは難しい。”


### 本書の概要
１つの具体的なコンテキストに沿って、アーキテクチャの議論をすすめる作りになっている。


#### 具体的なコンテキスト

**Sysops Squadサーガと呼ばれる具体的なモノリシックなシステムを分散的アーキテクチャへ移行する架空の物語**

##### 問題を多く抱えたレガシーで大規模なモノリシックなシステムの問題をどう解決するか？

後から変えるのが難しい硬い部分（ハードパーツ）をどう変えていくか
→モノリシックなシステムをどう分解していくか

##### 決定するのが難しい問題（ハードパーツ）をどう決めていくか？
→分散システムで直面する難しい問題をどう決定していくか？

##### 各章の大きな分類

##### モノリシックなシステムをどう分解するか？
2章 ソフトウェアアーキテクチャにおける結合の見つけ方
3章 ソフトぅエアアーキテクチャのモジュール化
4章 アーキテクチャの分解
5章 コンポーネントベース分解パターン
6章 業務データの分解
7章 サービスの粒度

##### 分散システムの実現で直面するさまざまな力とトレードオフ
8章 再利用パターン
9章 データの所有権と分散トランザクション
10章 分散データアクセス
11章 分散ワークフローの管理
12章 トランザクショナルサーガ
13章 コントラクト
14章 分析データの管理


#### モノリシックなシステムをどう分解するか？

エンジニアの会話

**アディソン オースティン**：「アプリケーションが大きすぎてどこから手を付けいいかわかりません！」

**ローガン**：「アプリケーション全体を捉えた上で、戦術的フォークかコンポーネントベース分解を適用するのがよいやり方です。」

**アディソン オースティン**：「私達はどちらを使えばいいのでしょうか？」


#### モノリシックアプリケーションの分解アプローチ

##### 戦術的フォーク
コードベースをコピーして別サービスを作り、不要な部分を削除することでモノリシックアプリケーションを分解する。

##### コンポーネントベース分解
正当方なやりかた。モノリシックなシステムを機能ごとに分解してサービスを構築しなおす。

##### ADR アーキテクチャ・デジジョン・レコード
どのようにアーキテクチャが決定されていった履歴を残すことで、どんな思想や条件、トレードオフなどで、設計が決まったか？などを記録。


### モノリシックなシステムをどう分解するか？ (2章から７章）
#### コード的アプローチ
* モノリスからの分解アプローチ
* 戦術的フォーク
* コンポーネント分解

#### データ的アップローチ
* データベースを分解する５段階のプロセス

#### 分散システムで直面する難題を決定していく際の難しさ (８章から14章）

”アーキテクトが直面する最も困難な課題の一つは、分散アーキテクチャに作用するさまざまな力とトレードオフを解きほぐすことだ”

”ソフトウェアアーキテクチャはさまざまな力が相互作用し合う多次元的な問題を生み出す。トレードオフ分析を行うには、まずトレードオフの関係にある力を把握しなければならない。”

#### 分散システムの実現で直面するさまざまな力とトレードオフ

* サービスの適切な粒度をどう見つけるか？
* データ所有権をどう割り当てるか？
* ワークフローをどう実現するのか
* サービス間通信の方式をどうするのか？
* 共通的なコードをどう扱うか？
* 所有していないデータにどうアクセスするのか？
* データ整合性をどう確保するのか？

##### サービスの粒度

エンジニアの会話

**テイレン**：「ドメインサービスを小さなサービスに分解したほうがいいのでは？ マイクロサービスとしては粗すぎる」

**ローガン**：「すべてのサービスをマイクロにしようとするのは勝手ですよ。サービスを小さくしたい理由はなんですか？」

**テイレン**：「単一責任の原則ですよ」

**ローガン**「単一の責任が何を指すかは主観的なものです。サービスの粒度を正しく把握するには、**粒度分解要因**と**粒度結合要因**を使ってトレードオフを客観的に分析し、サービスを分割するかどうかの確固たる根拠を形成するのが重要です。」



##### 粒度分解要因
どのような場合にサービスを小さく分解することを検討すべきか？

* サービスの範囲と機能
* コード変動率
* スケーラビリティとスループット
* 拡張性
* 耐障害性
* セキュリティ

#### 粒度結合要因
* データベーストランザクション
* ワークフローとコレオグラフィ
* 共有コード
* データ関係



触りとしてはここまでなのですが、実際の現場でもどんな粒度でサービスを分解するかは非常に難しい問題です。
こういった分析要素として、まとめるというのは非常にわかりやすいと思います。

ぜひ、読もうと思います（苦笑


参考サイト
[ソフトウェアアーキテクチャー・ハードパーツ - Forkwell Library #12](https://www.youtube.com/watch?v=6eCiC8oISYc&t=4731s)
paizaラーニング「何個ある? 1 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__search_count_step1
#### 私の解答
```Python3
li = [1, 2, 2, 1, 2, 1, 2, 1, 1, 1]
ans = 0
for i in range(len(li)):
    if li[i] ==1:
        ans += 1
print(ans)
```
#### 解答例1
```Python1
li = [1, 2, 2, 1, 2, 1, 2, 1, 1, 1]

ans = 0
for ele in li:
    if ele == 1:
        ans += 1

print(ans)
```
#### 解答例2
```Python3
li = [1, 2, 2, 1, 2, 1, 2, 1, 1, 1]
print(li.count(1))
```
paizaラーニング「何番目にある? 3 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__search_i-th_step3
#### 私の解答
```Python3
values = input().split()
N = int(values[0])
M = int(values[1])
li = [int(x) for x in input().split()]
for i in range(M):
    if li[i] == N:
        print(i + 1)
```
#### 解答例1
```Python3
values = input().split()
N = int(values[0])
M = int(values[1])

A = [0] * M
values = input().split()
for i in range(M):
    A[i] = int(values[i])

for i in range(M):
    if A[i] == N:
        print(i + 1)
```
#### 解答例2
```Python3
N, M = map(int, input().split())
A = [int(x) for x in input().split()]

for i, ele in enumerate(A):
    if ele == N:
        print(i + 1)
```
#### 解答例3
```Python3
N, M = map(int, input().split())
A = [int(x) for x in input().split()]

print(A.index(N) + 1)
```
paizaラーニング「何番目にある? 2 Python3編」

https://paiza.jp/works/mondai/array_primer/array_primer__search_i-th_step2
#### 私の解答
```Python3
n = int(input())
li = [1, 5, 9, 7, 3, 2, 4, 8, 6, 10]
for i in range(len(li)):
    if li[i] == n:
        print(i + 1)
```
#### 解答例
```Python3
N = int(input())
li = [1, 5, 9, 7, 3, 2, 4, 8, 6, 10]

for i in range(len(li)):
    if li[i] == N:
        print(i + 1)
```
Jump設定のメモ


# AnimationBlueprintのEventGraph

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/2e60664b-fd07-5637-df8d-7470fbac4911.png)

IsJumpを宣言
EventBlueprintUpdateAnimationにて
OwnerのPawnからCharacterMovementのIsFallingをセット

# AnimGraphのStateMachineでJumpを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/96ac1a1f-3101-1fdd-43d3-ef7419b92af6.png)

JogからIsJump中遷移するように修正


# Jump StateでJumpのアニメーションシーケンスを設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/516ede27-7d3f-8f2c-04dd-4f236e015ac0.png)


LoopAnimationをtrueにしておく

# CharacterのBlueprintにてJumpのパラメータを調整する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/cb67c260-03c8-3a2d-d547-b811351bbb12.png)

Jump z Velocity 高さ
JumpMaxHoldTime　押している時間中上昇
「たのしいRuby」繰り返し処理 times, for, while, until, each, break, next

Rubyの本、買ってきた。「たのしいRuby」勉強しながらtwitterに投稿した文を加筆訂正してQiitaに投稿する。繰り返し処理。
Twitter、Green_helmet@bethlehem4099
Qiita、@dosaidon
## 参考文献
この記事は以下の情報を参考にして執筆しました。
-[たのしいRuby、高橋征義、後藤裕蔵著、 まつもとゆきひろ監修、SBクリエイティブ株式会社、第6版2019年](https://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby-%E7%AC%AC6%E7%89%88-%E9%AB%98%E6%A9%8B-%E5%BE%81%E7%BE%A9-ebook/dp/B07PNN3TYF/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1671278506&sr=8-1)
-[『たのしいRuby 第6版』サポートページ、ソースコード](https://tanoshiiruby.github.io/6/index.html)

つぎ、繰り返し処理。まず、1から10までの和を計算してみた、なお答えは55。
そのほか、リストから文字列を順番に取り出す方法のサンプルも。
Rubyでは呆れるぐらい色々な方法で繰り返し処理できる。ここに書いてない方法もある。Pythonではforだけど、Rubyではとりあえずtimesだけあれば用は足りる気がする。あと、forよりtimesの方を推薦しているみたいだ。
***Green_helmet@bethlehem4099·7月15日***
## times
~~~ruby:times.rb
sum = 0
10.times do |i|
    sum += ( i + 1 )
end
puts "\n",sum
~~~
~~~command_line:command_line
~ % ruby times.rb
55
~~~
timesは駐車場ではなく回の意味だろう。つまり駐車場が10個ではなく、10回timesからendまでの間を繰り返す。+=は右辺の値を左辺に足し算する。変数iには0から9が自動的に入る。1足しているので1から10になる。
変数iは変数nに変えても結果は同じだった。あとdo,　endは{}に置き換えても良い。
~~~ruby:times2.rb
sum = 0
10.times { |n| sum += (n + 1) }
puts sum
~~~
~~~command_line:command_line
~ % ruby times2.rb
55
~~~
***Green_helmet@bethlehem4099·7月15日***
## for
~~~ruby:for.rb
sum = 0
for i in 1..10 do
    sum += i
end
puts sum
~~~
~~~command_line:command_line
~ % ruby for.rb
55
~~~
まあ、普通。stepは無いのか？

***Green_helmet@bethlehem4099·7月15日***
## forでリストからデータを取り出す
Pythonにも同じ構文がある。
~~~ruby:for_names.rb
# for_names.rb
names=["光源氏","桐壺更衣","藤壺"]
for name in names do
    puts name
end
~~~

~~~console_command:console_command
~ % ruby names.rb
光源氏
桐壺更衣
藤壺
~~~
まあ、まあよく出来ている
***Green_helmet@bethlehem4099·7月15日***
## while
***Green_helmet@bethlehem4099·7月16日***
~~~ruby:while3.rb
i = 0
sum = 0
while sum<55
    i += 1
    sum += i
end
print "i=", i, "\n"
print "sum=", sum, "\n"
~~~
~~~command_line:command_line
~ % ruby while3.rb
i=10
sum=55
~~~
ごく標準的
Green_helmet@bethlehem4099·7月16日
## until
~~~ruby:until.rb
i = 0
sum = 0
until sum>=55
    i += 1 
    sum += i
end
print "i=",i,"\n"
print "sum=",sum,"\n"
~~~
~~~command_line:command_line
~ % ruby until.rb
i=10
sum=55
~~~
う〜ん、untilは過剰なような…
Green_helmet@bethlehem4099·7月16日

## loop
~~~ruby:loop.rb
loop do
    puts "loop"
end
~~~
~~~command_line:command_line
~ % ruby loop.rb
loop
loop^Cloop.rb:3:in `write`: Interrupt
from loop.rb:3:in `puts`
from loop.rb:3:in `puts`
from loop.rb:3:in `block in <main>`
from loop.rb:2:in `loop`
from loop.rb:2:in `<main>`
~~~
controlとCを同時押しで強制終了した
さすがにwhileがあればloopは要らないだろう
***Green_helmet@bethlehem4099·7月17日***
## つぎ、break
~~~ruby:break.rb
i=0
["Perl","Python","Ruby","Scheme"].each do |lang|
    i += 1
    if i == 3
        break
    end
    p [i,lang]
end
~~~
~~~command_line:command_line
~ % ruby break.rb
[1, "Perl"]
[2, "Python"]
~~~
breakで終了、はい
***Green_helmet@bethlehem4099·7月17日***
## つぎ、next
~~~ruby:next.rb
i=0
["Perl","Python","Ruby","Scheme"].each do |lang|
    i += 1
    if i == 3
        next
    end
    p [i,lang]
end
~~~
~~~command_line:command_line
~ % ruby next.rb
[1, "Perl"]
[2, "Python"]
[4, "Scheme"]
~~~
nextで次へ行く、はい
***Green_helmet@bethlehem4099·7月17日***
繰り返し処理はこれでおしまい、どっとはらい。
Testmodeller.ioというツールを触ってみた


## はじめに
最近個人的に（会社的にも）ホットな技術がモデルベースドテスト（MBT）で、関連ツールがあれば触るようにしています。
Curiosityという会社から[Testmodeller.io](https://testmodeller.io/)というツールが出ているので、ちょっと調べてみました。名前的にはtest modellerなのでMBTどまんなかですね。

## Testmodeller.ioの概要
Webサイトでは以下が書かれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529567/a7c1941e-7675-92e3-629b-7657eae46b83.png)

- フローチャートからテストの自動生成ができて
- それを使うことでバグの早期検知ができて
- みんなでコラボレーションしながらよいシステムを作れる

みたいな感じでしょうか。
フローチャートをモデルと考えるとモデルベースドテストですね。あとはスプリントやら毎回リリースやらの言葉から基本的にアジャイルを想定していることがうかがえます。コラボレーションに価値を置いているのも共感できる点ですね。

## Testmodeller.ioのツールチェーン
下図のように、入力としてはテスト実行記録やBDDシナリオ、そしてBPMNダイアグラムが使えるようです。
Testsはテスト管理でしょうか。
テストデータ入力としてエクセルを含めたDBが使え、テスト実行では主要なテスト自動実行ツールをカバーしているようです。
MBTと銘打っていることから、BPMNをメインの入力にし、テストデータの入力を加えることでテスト自動実行までつなげる、というのがこのツールの根幹だと思われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529567/0402b5e7-7b5e-0ba6-89f7-6f0169bdaafd.png)

## 実際の使用感
上述のメインの流れを少し試してみます。

まずはモデルのインポートです。エクセルで書かれたモデルも対応しているようです。
また、ツールのGUI上でモデリングをすることも可能です。
基本的にはBPMNを主要なモデルとしているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529567/af6056b7-ed67-3c73-2577-8f0f15edfa26.png)

次にテストシナリオの生成です。
BPMNからテストシナリオを自動生成できます。カバレッジについては指定が可能です。
生成ロジックについては特別なものはないように見えます。
フロー系のモデルに基づいた一般的なテスト生成ロジック、だと思ってよさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529567/a99cd6fd-fa28-d8f5-f1e2-362e6bf1b2ee.png)

最後にテスト実行ツールに渡すテストコードを生成して、メインの流れ完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529567/22449de1-48d1-feec-80a3-34747468f6a3.png)

## 感想
### これはいい
- モデルからテスト実行までつながる感じはすごく良い
- テストケースとモデルの部品が対応付けされて可視化される
- 対応モデルを絞って、使いやすさに振り切った感じ。スピードが要求される場面でモデルを使う、という文脈では使い道がありそう

### もっとこうなるといいのにな
- 対応モデルが限定的
- モデルとコードの距離が近い（詳細度が高いモデルである）ため、コードベースのテストとの使い分けが難しい？
- 汎用ツールの常だが、テスト生成ロジックはもう少し複雑なものがあってもいいな

というところです。MBT関連のツール、もっと知りたい。
arhive.orgで色々調べる

# URLから削除されたページを調べる
多分一番最初に思い付く方法です。
URLを入れるだけでそのサイトのアーカイブを閲覧することが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/0b8217b9-d13e-9a92-40b5-1c64771db842.png)
アーカイブされていなくて、ページが存在する場合はアーカイブする事を提案されます。

# アーカイブされたURL一覧を取得する
上の写真では
`https://archive.org/`
が指定されていますが、これを
`https://archive.org/*`
にするとその部分のURL一覧を閲覧できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/a829c0e9-b711-0088-1f0d-5f17f929fca7.png)

# 全てのアーカイブされたURLとサブドメインを調べる
直接サブドメインの一覧を表示する機能はありませんが、
`http://web.archive.org/cdx/search/cdx?url=*.qiita.com/*&output=json`
のように調べることでサブドメインを含めたアーカイブの一覧を取得できます。

# ウェブサイトの変更点を調べる
`https://web.archive.org/web/diff/20211014104138/20210519130426/https://qiita.com/`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/fe631f47-85ee-15e0-57e7-149e5cfe346c.png)

# ユーザーがアップロードしたデータを調べる
archive.orgはWEBサイトをアーカイブするだけでなく、利用者がファイルをアップロードすることが出来ます。
`https://archive.org/search.php?query=qiita&sin=`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/4b5f4e0f-a3dc-9b47-b198-e48b283d8f52.png)
ただ、結構法的に危ないファイルもあるので利用する場合は気を付けましょう。
【めんどくなってTODO管理が続かない人向け】Slackのブックマーク機能で優勝する

こんにちは、kudomaです。
この記事は、[アイスタイル Advent Calendar 2022](https://qiita.com/advent-calendar/2022/istyle)、16日目の記事です。

# 最初に
:::note warn
注意
この記事は、Slackで仕事のコミュニケーションを取ってる前提です。
:::


いきなりですが、みなさんって仕事をやり忘れたことありますか？
うんうん、ありますよね～

ちなみに、TODO管理ってしたことあります？
うんうん、ありますよね～

では、今も続けてる方っていたりします？
うんうん、半分くらいは続いてそうですね。

まぁ調子乗って質問してる僕は、挫折を何度も繰り返している民です...
俗に言う、三日坊主です。
変にこだわったり、わざわざ確認するのがめんどくなったりして、途中でTODO管理をやめてしまうんですよね...

ですが、実は半年前くらいに最強のTODO管理法を見つけて、それからずっとTODO管理を続けることができてます。
是非アドカレを機会にみんなにオススメしたいと思ったので、今キーボードを叩いてます。

# 挫折した原因
- 変に見た目とかこだわる⇒TODO管理に時間がかかる⇒あーもうめんどい仕事しようってなる
- 開くのめんどくなる
- 目的がTODOを管理することになってしまう

# 僕にとって本当に必要だったTODO管理の要件
- すぐTODOを追加・削除できる
- すぐTODOを確認できる

# オススメのTODO管理法
これはズバリ、**Slackのブックマーク機能を使って、TODOとして扱いたいメッセージをポチポチしていく**だけです。

https://slack.com/intl/ja-jp/help/articles/360042650274-%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%AB%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B-

この管理法だと、TODOをすぐ追加・削除、確認できます。

# 実際にどうやってTODO管理してるか
## すぐTODOを追加できる
### 一瞬でTODOを追加できる例
以下のような場合は一瞬で追加できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738621/c699ae23-e5f9-ccc8-d506-da7878f70ee4.png)

メッセージをホバーすると右上にバーが出てくると思います。
その中にある「ブックマークに追加する」という吹き出しが出ているアイコンをクリックするだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738621/4b95c49d-aa3e-9f1b-8cec-c6841a6f911d.png)

### ちょっと作業が必要だけど、ほぼ一瞬で追加できる例
先程の例では、日付がメッセージに含まれていました。
**もし日付など自分が残しておきたい情報がメッセージに含まれていない場合は、自分のDM宛にTODOにしたいリンクを貼り、日付などの情報を付加します。**
以下のようなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738621/6e479b00-9119-17e1-0b2f-93d364e319ae.png)

そしてこのメッセージをブックマークに登録します。

## すぐTODOを削除できる
登録しているメッセージを表示して、登録時にクリックしたアイコンを再度クリックしたら、登録が解除されるので、TODOから削除された状態になります。

## すぐTODOを確認できる
WEBサービスを使用してTODO管理している場合は、まず朝一でTODO管理しているWEBサービスを開くことから始まると思います。
でもSlack上で管理していたら、開くのめんどいが発生しません。

サイドバーにある「ブックマーク」から、追加したTODOをいつでも確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/738621/936928b0-7ebd-cb2e-ad33-d65fd76f85af.png)

# さいごに
TODO管理続かん...って方々のお力になれたら幸いです。
必要以上に凝らないTODOの最先端だと思ってますので、是非試していただきたいです。
じゃあ、仕事に戻ります！最後までお付き合いいただきありがとうございました！

# 参考文献
- [メッセージやファイルをブックマークに登録する | Slack help center](https://slack.com/intl/ja-jp/help/articles/360042650274-%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%AB%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B-)
コードをきれいにしたい

## これは何？
javascriptのコードが解析されていい感じに整形されるようにします。
- リンター(解析): ESLint
- フォーマッター(整形): prettier

## ESLint
```
    npm init @eslint/config
```
インストールすると、設定に関する質問がいくつかあるのでそれに答えます。

```style guide```は```Airbnb```が1番人気のようです。
```Airbnb```の設定は日本語にも訳されていて、わかりやすいと思います。

https://github.com/mitsuruog/javascript-style-guide

↓ ```Google```、```Airbnb```、```Standard```の大まかな違いは以下の記事にまとめられています。

https://betterprogramming.pub/comparing-the-top-three-style-guides-and-setting-them-up-with-eslint-98ea0d2fc5b7

```.eslintrc```が```js```もしくは```json```もしくは```yml```で作成されるので、そこで自分好みの設定をすることができます。
>"off" or 0 - turn the rule off
"warn" or 1 - turn the rule on as a warning (doesn’t affect exit code)
"error" or 2 - turn the rule on as an error (exit code will be 1)

- ```"off"``` => 指定したルールは無視される
- ```"warn"```ルールに反している場合,注意をされる
- ```"error"```ルールに反している場合、ガチギレされる
```.eslintrc.json
    "rules": {
            "no-unused-vars": "off",
            "indent": ["warn", 2],
            "semi": "error",
        }
```
例えば上記のように設定した場合、```使われていない変数があっても警告は表示されない```、```インデントが2出なかった場合、注意をされる```、```セミコロンがなかった場合、ガチギレされる```になります。
※ [設定できるruleの一覧](https://eslint.org/docs/latest/rules/)

設定時に```style guide```を選んだ場合は、デフォルトでその```style guide```のruleが適用されていて、```.eslintrc```でオーバーライドする形になります。

以下のコマンドでリンターを走らせることができます。
```
    npx eslint 解析したいファイルまたはディレクトリ
```

## prettier
ESLintでコードを解析して、prettierでコードをよりprettyにする(整形する)ことができます。
```
    npm install --save-dev --save-exact prettier
    echo {}> .prettierrc.json
```
```.prettierrc.json```にprettierの設定を書きます。
```.prettier.json
    {
        "singleQuote": true,
        "semi": false
    }
```
例えば上記のように設定すると、```ダブルクォートがシングルクォートに変換```され、```末尾のセミコロンがある場合は削除```されます。
※ [追加できるオプション](https://prettier.io/docs/en/options.html)

以下のコマンドでprettierを走らせることができます。
```
    npx prettier --write 対象のファイルまたはディレクトリ
```
対象外にしたいファイルやディレクトリがある場合は```.prettierignore```を作成し、追加することで対象外にできます。

## ESLintとprettierを同時に使う
```package.json```に```ESLint```で解析するのと同時に```prettier```で整形できるようにコマンドを設定します。
```package.json
    "scripts": {
        "clean": "npx prettier --write src && npx eslint --fix src"
    }
```
上記のように設定すると、```npm run clean```によって```ESLint```と```prettier```が走るようになります。

```ESLint```側と```prettier側```で設定が違うとコンフリクトしてしまうので、擦り合わせをする必要があります。

https://prettier.io/docs/en/integrating-with-linters.html

- [eslint-config-prettier](https://github.com/prettier/eslint-config-prettier)
- [stylelint-config-prettier](https://github.com/prettier/stylelint-config-prettier)

↑ どちらもconflictするruleをESLint側でoffにするものなのでどちらを使ってもいいと思います。

```eslint-config-prettier```を使ってみます。
```
    npm install --save-dev eslint-config-prettier
```
```.eslintrc.json
    {
      "extends": [
        "some-other-config-you-use",
        "prettier"         // <= 追加
      ]
    }
```
conflictがあるかどうかの確認は以下のコマンド(ディレクトリではなくファイル指定)
```
    npx eslint-config-prettier 対象のファイル
```
- conflictがあった場合
```
    The following rules are unnecessary or might conflict with Prettier:
    
    - indent
```
- conflictがなかった場合
```
    No rules that are unnecessary or conflict with Prettier were found.
```
埋め込んだiframeで全画面表示(fullscreen)をする

# はじめに
ページに埋め込んだiframe要素に対し、全画面表示をする必要が有りました。実装の際に学んだ事をここに記します。

# この記事の対象者
- ページ内にiframeを埋め込む人
- 埋め込んだiframeを全画面表示したい人
- 埋め込んだiframeが全画面表示されない人

# iframeを全画面表示する

## iframeを埋め込む親ページの設定
### 全画面表示を可能にする
allowfullscreen属性もしくはallow属性を指定します。
```js
<iframe src="埋め込むiframeページURL" allowfullscreen/>
```
もしくは
```js
<iframe src="埋め込むiframeページURL" allow="fullscreen"/>
```
以上の指定でiframe上での全画面表示を可能にします。
### 全画面表示を禁止する
逆に全画面表示を禁止する場合は以下のように設定します。
```js
<iframe src="埋め込むiframeページURL" allow="fullscreen 'none'"/>
```
## iframe側の設定
### 全画面表示する処理
iframe側では全画面表示を実行する為のメソッドを記述します。
```js
const openFullScreen = () => {
    document.documentElement.requestFullscreen();
}
```
以上のメソッドを呼び出すことで全画面表示が実行されます。注意して欲しいのはrequestFullscreen()は要素に対して実行出来るので、`document.requestFullscreen()`では実行出来ないので注意して下さい。

また、**ブラウザによってメソッド名が異なる**という厄介な問題があります。私の知る限り以下の4つのメソッドがrequestFullscreen()と同様のメソッドです。
```js
document.documentElement.requestFullscreen();
document.documentElement.webkitRequestFullScreen();
document.documentElement.mozRequestFullScreen();
document.documentElement.msRequestFullscreen();
```
困りますね…私は以下のような実装をしました。

```js
const requestFullscreens = [
    "requestFullscreen",
    "webkitRequestFullScreen",
    "mozRequestFullScreen",
    "msRequestFullscreen",
];

for (let i = 0; i < requestFullscreens.length; i++) {
    if (document.documentElement[requestFullscreens[i]]) {
        document.documentElement[requestFullscreens[i]]();
        break;
    }
}
```
メソッド名を配列にまとめて、for文で回してdocumentElementにメソッドが存在するかをチェックして、存在する場合はメソッドを実行してfor文をbreakする実装にしました。

### 全画面解除する処理
```js
const closeFullScreen = () => {
    document.exitFullscreen();
}
```
以上のメソッドを呼び出すことで全画面表示が解除されます。`requestFullscreen()`とは異なりdocumentオブジェクトに対して実行します。

また、`requestFullscreen()`と同様に**ブラウザによって実行可能なメソッド名が異なります。**

```js
document.exitFullscreen;
document.webkitExitFullscreen;
document.mozCancelFullScreen;
document.msExitFullscreen;
```
こちらも同様に以下のような処理で対策を行いました。

```js
const exitFullscreens = [
    "exitFullscreen",
    "webkitExitFullscreen",
    "mozCancelFullScreen",
    "msExitFullscreen",
];

for (let i = 0; i < exitFullscreens.length; i++) {
    if (document[exitFullscreens[i]]) {
        document[exitFullscreens[i]]();
        break;
    }
}
```

## 全画面表示可能かどうかを判断する
ブラウザによって全画面表示させるメソッドが異なる場合がありましたが、ブラウザや環境によっては全画面表示が実行不可能な場合があります。その場合は全画面表示関連の挙動は制御する必要があります。

判断の方法は以下のようになります。
```js
if (document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled) {
    // 全画面表示ボタンを非表示にする処理
}
```

以上のいずれかのプロパティがtrueで返らなかった場合は全画面表示は実行不可能ですので、全画面表示関連の処理や見た目を制御するようにすれば対応完了です。

## fullscreen関連のエラーメッセージ
```bash
Uncaught (in promise) TypeError: fullscreen error
```
全画面表示可能かどうかを判断せずに`requestFullscreen()`を実行した際、全画面表示が実行不可能な環境の場合は以上のメッセージが表示されます。

その原因として考えられるのは私が調べた限り[親ページで全画面表示を禁止している](#全画面表示を可能にする)場合が考えられます。もしくはfullscreenに対する[ブラウザの互換性](https://developer.mozilla.org/ja/docs/Web/API/Document/documentElement#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%BC%E3%81%AE%E4%BA%92%E6%8F%9B%E6%80%A7)が対応出来ていない場合があります。

他にも原因があるのであればコメントで教えていただければと思います。

---
[Twitter](https://twitter.com/manzoku_bukuro)もやってます。
コンピュータも計算を間違える！？

# はじめに
本記事はコンピュータで数値計算を行うときに、計算誤差により意図しない結果となることがあるよというお話です。
ある文系大学生（青色coder）に、PythonのNumPyが行列計算に便利だと力説しているときに、逆行列の話になりました。そして、試しに逆行列を求めてるとなぜか値がおかしい。原因がよくわかわない。あせる私。このままでは、理系大学院生としてどうなのかと思うので考察します。
# 問題点
適当に以下のコードで行列を作成して、逆行列を計算すると
```python
import numpy as np
A = np.arange(9).reshape(3, 3)
print(A@np.linalg.inv(A))
#---> LinAlgError: Singular matrix
```
```python
print(np.linalg.det(A))
#---> 0.0
```
となり、正則行列（逆行列が定義できる行列のこと）ではないので逆行列を計算できない。そこで、以下のコードを実行すると
```python
A = np.arange(1,10).reshape(3, 3)
print(A@np.linalg.inv(A))
#--->
# [[ 0.  1.  0.]
#  [ 0.  2.  0.]
#  [-4.  3.  2.]]
```
なぜか単位行列とかけ離れた行列になります。
# 考察
行列式を計算すると
```python
print(np.linalg.det(A))
#---> -9.51619735392994e-16
```
となり、正則行列ではありますが、とても小さな値となっています。
条件数の逆数rcondを計算すると、
```python
print(1/np.linalg.cond(A))
#---> 1.9793046108741972e-17
```
となり、とても小さく特異性が高い行列だとわかります[^2]。（特異性が高いというのは逆行列が存在しない特異行列に近いとということ）
特異性が高い行列だと、逆行列が正しく求められないみたいです。
対角成分に微小値を足すと近似的に求められます。

```python
A = np.arange(1,10).reshape(3, 3)
A = A + 1e-8*np.eye(3)
print(A@np.linalg.inv(A))
#--->
#[[ 1.00000000e+00  7.10542736e-15  3.55271368e-15]
# [-7.10542736e-15  1.00000000e+00  7.10542736e-15]
# [-4.83857773e-15 -2.79601156e-14  1.00000000e+00]]
print(np.round(A@np.linalg.inv(A)))
#--->
#[[1.00000000e+00 0.00000000e+00 0.00000000e+00]
# [0.00000000e+00 1.00000000e+00 0.00000000e+00]
# [4.13602329e-09 1.88513379e-08 1.00000001e+00]]
```
となり、単位行列となります。
特異性が高い行列だと逆行列の精度は低くなるみたいです。気づかないとこわいですね。
ちなみに、[MATLAB](https://ja.wikipedia.org/wiki/MATLAB)(数値解析ソフトウェアで、配列のインデックスがなぜか1から始まる謎言語[^2])だと、
「警告: 行列は、特異行列に近いか、正しくスケーリングされていません。結果は不正確になる可
能性があります。RCOND =  9.251859e-18。 」
と警告が出ます。助かります。
# まとめ
逆行列を計算するときは、特異性に気をつけないといけません。
コンピュータでも計算誤差は生じます。
# おまけ
予想外の結果が出るものを書いておきます。計算誤差ではなく、仕様のものもあります。
### 1.
True or False
```python
print((0.1+0.2)==0.3)
```
### 2.
```python
print(round(0.5))
```
### 3.
```python
print(round(2.675, 2))
print(round(2.665, 2))
```
### 4.
```python
import numpy as np
A = np.ones(1)
# --> [1]
B = A
A[0] = 2
print(A)
print(B)
```
結果と考察は時間の都合上後で追記します。
# 注釈
[^1]: あああ

[^2]:
行列の特異性を見るにはdetではなくrcondを見る必要があります。
以下反例
【VB.NET】Record型の応用例

# はじめに
これは、[Visual Basic Advent Calendar 2022](https://qiita.com/advent-calendar/2022/vb)の14日目の記事となります。

前記事にて、NuGetでRecGenパッケージをインストールして、VB.NETにレコード型を追加しました。

https://qiita.com/yaju/items/ebe2fc1e7d9d53695dba

レコード型の応用例として、C#でDictionryのキーにレコード型を使うという記事を見つけました。

https://note.com/potato_d/n/n99cf0d9edb23

これをVB.NETでも試してみると、同じキーなのに例外エラーにならずに追加されてしまいました。

# 確認
## ソースコード
```vb:PersonRecord.rec
Public Record PersonRecord (
    FirstName As String = "",
    LastName As String = ""
)
```

```vb:Program.vb
Module Program
    Sub Main(args As String())
        Dim obj1 As PersonRecord = New PersonRecord("Joe", "Blow")
        Dim obj2 As PersonRecord = New PersonRecord("Joe", "Blow")
        Try
            Dim dict As New Dictionary(Of PersonRecord, String) From
            {
                {obj1, "sample1"},
                {obj2, "sample2"}
            }
            Console.WriteLine(dict.Count)  ' result 2
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try

        Console.ReadKey()
    End Sub
End Module
```

## 結果
Console.WriteLine(dict.Count)の`2`が出力されます。

# 修正版
## issueを書いた
RecGenの作者にissueを書きました。GetHashCodeが足りないですよってね。

https://github.com/VBAndCs/VB-Record-Source-Generator/issues/1

最初に作者に上手く意図が伝わらず修正される前に危うく閉じられそうになったが、Microsoftに8年勤めVBの開発に関わった方が現れて、それはバグだ(This is definitely a bug in RecGen.)と指摘してくれて修正されました。
Equals を生成する場合、GetHashCode を生成する必要があります。[microsoft documented.](https://learn.microsoft.com/en-us/dotnet/api/system.object.gethashcode?view=net-7.0#remarks)

## バージョン更新
RecGenのバージョンが2.1から2.2にアップデートされました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/dd0583db-f3ae-0a43-d917-38636341c8c6.png)

## 最終結果
Console.WriteLine(ex.Message)となり、「An item with the same key has already been added. Key: PersonRecord { FirstName = Joe, LastName = Blow }」が出力されました。

# 最後に
これで、ちゃんとしたレコード型が使えるようになりました。

下記は助けてくれた方のブログで、ModVBを開発している。
ModVBはVB.NETに新しい機能を追加するためのコンパイラのようです。mod の意味には、修正版 (modified)、modern (modern)、modulo operation (modulo) が含まれます。別途記事にしようと思います。

https://anthonydgreen.net/2022/08/20/introducing-modvb/
DoctrineとEloqunet比較大全13: UNIONクエリ

day13(?)の今日はUNIONクエリを実行する方法を見ていきます。

## Doctrine

```php
<?php

declare(strict_types=1);

use App\Entity\Author;
use App\Entity\Book;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Query\ResultSetMapping;

require __DIR__.'/../vendor/autoload.php';

/** @var EntityManagerInterface $entityManager */
$entityManager = require __DIR__.'/bootstrap.php';

/** @var array<array{id: int, name: string}> $rows */
$rows = $entityManager->getConnection()->fetchAllAssociative('SELECT id, name FROM authors UNION SELECT id, title FROM books');

```
<https://github.com/77web/doctrine-vs-eloquent/blob/f0d09756df151554c96f04b6f18bb716e7ee553f/Doctrine/Usecase/filter_with_union.php>

- 複数のテーブルにまたがるunionの場合はエンティティにマップしてもしょうがないのでDBALを使ってarrayを取得します。
- 単一のテーブルで異なる条件のSQL同士をUNIONしたい場合はNativeQueryを使ってエンティティにマップすることもできます。


## Eloquent

```php
<?php

declare(strict_types=1);

use App\Models\Author;
use App\Models\Book;
use Illuminate\Database\Eloquent\Collection;

require __DIR__.'/../vendor/autoload.php';

/** @var Collection<Author> $authors */
$authors = Author::query()
    ->select('id', 'name')
    ->union(Book::query()->select('id', 'title'))
    ->get()
;
// $authorsにはid, nameのみを持つAuthorモデルのインスタンスと、booksテーブルのid, title(nameという名前で収納される）を持つAuthorモデルのインスタンスが混在したコレクション
```
<https://github.com/77web/doctrine-vs-eloquent/blob/f0d09756df151554c96f04b6f18bb716e7ee553f/Eloquent/Usecase/filter_with_union.php>

- Eloquentのunion機能を使った場合、BookモデルのデータであってもAuthorモデルにマップされます。（ちょっと気持ち悪いですね :sweat_smile: ）
- `DB::statement()` を使うことで生SQLのUNIONクエリを実行し、arrayの形でレコードを得ることもできます。
エンジニア向け英語5文型講座

人の振り見て我が振り直せなどと申しますが、私は今、英語の５文型を改めて学び直す必要があると、ひしひしと感じています。

プログラムを書くときに5文型を意識すると命名規則(特にbooleanの)などが頭に入ってきやすいということで、中学や高校で習う5文型について学び直した内容を大雑把にまとめてみます。

私は慣習的な命名規則を理解するためには基本的にはインスタンスとメソッドを意識することが大事だと思っていますので、オブジェクト指向(もっというとサブジェクト指向)的な考え方を念頭に文型と絡めて解説を入れていきます。


以下、5文型に登場する略語は以下の通りです。
S: 主語
V: 動詞
O: 目的語
C: 補語

## 第１文型 SV
主語と動詞で文として完成してしまう型です。Vには自動詞が入ります。
例)`exist`, `live`, `agree`, `go`

booleanを返すメソッドの命名などで`exists`はよく使われるワードですね。

```
if (someInstance.exists()) {
  // do something
}
```

1行目が`if someInstance exists`となり、英語として意味が伝わる文になるためこのような命名が使われるのだと思います。existは自動詞なので目的語は取りませんし、isExistにもなりません。
副詞であれば続くことができるので、`existsInXXX`みたいな命名はありだと思います。


## 第２文型 SVC
主語+動詞+補語の型です。代表例は`be動詞`です。
S = Cという関係になるとかよく説明されてますね。Cは形容詞だったり、名詞だったりします。
プログラミングの文脈でもこの`S = C`という理解は重要です。なぜならこれまたbooleanの命名でisXXXという使われ方をするのがあるあるだからです。

```
if (someInstance.isC()) {
  // do something
}
```
メソッドなどの場合は`クラスのインスタンス = C`であるかどうかの判定をしてbooleanを返すような作りになるはずです。それ以外のものをCと比較してたらそれは文法的に言ってることとやってることが違うと気付きましょう。


## 第３文型 SVO
主語+動詞+目的語の文型です。SがOをVすると覚えましょう。
例) `get`, `create`, `read`, `update`, `delete`
ここだけRestAPIなどの例になりますが、HTTPメソッドは大体Oをとる動詞なので、URLをリソース、つまり目的語として動詞+目的語の形になるような設計思想となっています。
```http
GET https://example.com/users HTTP/1.1
```

また、1文型でも登場した、be動詞ではない動詞で始まるbooleanパターンも存在します。このパターン、体感的にはhasとかcontainとかincludeとか所有系の3文型動詞が多い気がしますね。
```
if (someInstance.contains(specificItem)) {
  // do something
}
```

## 第4文型 SVOO
主語+動詞+目的語1+目的語2の文型です。`give me chocolate`ってやつですね。
例) give, send
何かに何かを渡す系の動詞でよく使われる印象です。

```
someInstance.give(object1, object2)
```
同じクラスから生成された2つのインスタンス間で何かを渡すような場面だとこのようなメソッドの設計になると思われます。ユーザ同士がアイテムを送り合うようなソーシャルゲームなど。


## 第5文型 SVOC
主語+動詞+目的語+補語の文型です。
例) `make`, `call`, `name`
重要なのは、`O = C`の関係が成り立つこと。

あまり使うことはなさそうですが、デザイン次第ではあるクラスのインスタンスが別のクラスのインスタンスの状態を変えるようなときに使えるかもしれません。(その場合も状態を表現するプロパティにsetすればいい気もしますが)
```
classAInstance.make(classBInstance, complement)
```


## 最後に

以上となります。
我が振りを直すための学び直し記事なのでツッコミなど大歓迎です！！