OmniAICreator/Qiita-1.07M huggingface dataset:
Implement Roll-Up Summary Fields



# We created an account with one opportunity. We expected the account's 'Potential_Value__c' field to show the amount of that one opportunity, but it didn't.

+ [Challenge not yet completed in formulas Playground We create an account with an opportunity. We expected the “Potential_Value__c” field in the account to show the value of this opportunity, but it did not.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007I5ejb)

:::note
Did you check the Debug Logs? As that can suggest the underlying issue (which might be due to some other configuration done in the org / playground)

In case you are unable to check, then please ensure that the objects do not have any Required Custom Field or any validation rules or automations that are not part of this challenge.

Else switching to a brand new playground can help

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000IRcUBSA1
:::


+ [Create rollup summary field](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007IeKEm)

:::note
switched to the other playground I created and that worked, challenge completed.
:::


+ [Implement Roll-Up Summary; Amount not showing](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000BqMnA)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d01354dc-5171-249d-322e-60ed5e207d41.png)

:::note
We see the issue was due to the existing automations in your playground and I'm glad that your issue has been resolved in the new playground. 
:::


+ [Hoping someone can help. I am attempting to complete this hands on challenge, but keep getting an error message.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PmcoQ)

:::note
Did you check the Debug Logs? As that can suggest the underlying issue (which might be due to some other configuration done in the org / playground)

In case you are unable to check, then please ensure that the objects do not have any Required Custom Field or any validation rules or automations that are not part of this challenge.

Else switching to a brand new playground can help

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000IRcUBSA1
:::




# 【未解決】We created an account with one opportunity. We expected the account's 'Potential_Value__c' field to show the amount of that one opportunity, but it didn't.

+ [Implement Roll-Up Summary Fields - Error](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Hjngb)


# We created an account with one opportunity. We expected the account's 'Potential_Value' field to show the amount of that one opportunity, but it didn't.
[Implement Roll-Up Summary; Amount not showing](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000BqMnASAV)

:::note
I think the problem is due to the existing automation of the playground. Deactivate it or use a new playground.
:::
UnityでSafe Modeに誘導されたけどエラーを解決できなかった話

# はじめに
この記事は **「エラー解決を諦める過程、そしてその結果」** についてです。
同様の問題にぶち当たってここにたどり着いた貴方は、どうにか諦めずに別のサイトで道を探し続けてください。
そして、もし解決策が見つかった時にこの記事の存在を覚えていたら、その時には助けていただけると嬉しいです。

___


![サフェモデちゃん](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3047497/7d552e58-31a1-3351-972d-2ba07feeaf8a.png)
久しぶりにUnityで遊んでみたくなり、最新LTSの**2022.3.9f1**と**Visual Studio Community 2022 Ver17.7.4**をインストールして新規プロジェクトを作ってみたところ、Safe Modeで入るように促された。
特に無視する理由もないので言う通りにすると
___
<img width="550" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3047497/a07085ca-d25f-b5f1-18cd-a596afde726f.png">

な、なんかエラーがたくさん出てる！？
___
## "The process cannot access the file because it is being used by another process."<br>日本語で言うと<br>「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」
落ち着いて見てみれば全部同じ文章だし、こういうのはとりあえずコピペしてChatGPT先生にぶん投げれば上手くいく。
いくつか対処法を挙げてくれたので実際にやってみた。

1.  **Unityの再起動**
上手くいかなかったが、まあこれで直るならつまらない

2.  **プロジェクトフォルダの移動**　&　**プロジェクトフォルダの再作成**
プロジェクトフォルダの保存先を**C:\Users\（ユーザー)** から、**C:** 直下に変更して新規作成してみたが、これもまた上手くいかない。
Microsoftのアカウント名が日本語だったため、それが何か悪さをしてると思ったが英字に変えても違った。

3. **ファイルロックの解除**
何を言っているのか分からないので無視した。

4. **Unityの再インストール**
どうせインストールするなら新しい方が良いだろうと思い、プレリリースの**2023.2.0b9**beta版で新規プロジェクトを作成してみたが同じエラーに遭遇した。

5. **アンチウイルスソフトウェアを一時停止する**
「ウイルス対策ソフトがウイルスみたいな動き方をする」というのは既に経験済みだったので、その時に動作が狂っているソフトはアンインストールしていた。
そこで、唯一生き残って動作していた**Windowsセキュリティ**も無効化した。効果はなかったのですぐに元通り有効化した。

一応**Process Explorer**というソフトを使い、ファイルにアクセスしているという "別のプロセス"とやらを暴いてやろうとも思ったが、怪しげなソフトは検出されなかった。

…じゃあどないせいっちゅうんじゃあ！！

___
# Google先生に相談
エラーメッセージと"Unity"で検索かけた。
この不具合は色々な場面で発生するようで、[このフォーラム](https://forum.unity.com/threads/error-the-process-cannot-access-the-file-because-it-is-being-used-by-another-process.1174166/)ではスクリプトを作った際に時々発生しているらしい。
OneDriveがファイルの変更を記録してるからこれを消せ、プロジェクトファイル内のLibraryフォルダを消してみろ、などとある。

たぶん「別のプロセスが使用中です。」がこのエラーの真実でそれ以上でもそれ以下でもないから、プロジェクトファイルにアクセスしてそうなソフトを片っ端から停止しろということらしい。
Process Explorerに検出されてない時点でかなり容疑は薄いけど、ファイル検索ソフトの**Everything**や音量ミキサーの**EarTrumpet**、腹いせに**Linux用Windowsサブシステム**、ついでに便利機能の詰め合わせな**PowerToys**…

タスクを片っ端から処刑してる間に何だかすべてが面倒になってきた。

# エラーなんか無視してしまえ
これは勇気の撤退である。
問題を抱えたまま進むことでいつの日か致命的な事態が発生することは避けられない。
だが私にはこれを解決できる気がしない。
ならば、ここでいつまでもグダグダと止まっているよりはひたすら進み続けたほうがより生産的である。
**人間にはエラーを無視する権利があり、幸いなことに私にはその自由もある。**
Safe Modeに入らなければいいだけだ。

これより、プロジェクトを続行する。

# 結果
![全く心当たりのないエラーウィンドウ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3047497/d87a9398-f701-9f19-de40-a511fc9200ed.png)
"Make sure that there are no compile errors"？
心当たりのない子ですね。

スクリプト貼り付けられないので詰みです。投了です。対ありでした。
AWS認定 SysOpsアドミニストレーター アソシエイト 受験記録

# まずは結果

無事合格。
大体80%くらいの正答率だったっぽい。

# なぜチャレンジしたのか
業務の中でAWSを使っているので、自己研鑽のために。
あとは去年ソリューションアーキテクトを取得してから期間があいたので、自己学習のモチベーションのために受験した。
https://pages.awscloud.com/jp-traincert-certification-challenge-associate-2023-terms-and-conditions.html

# 受験前のAWS関連スキル

業務でも取り扱っていることもありAWSインフラの構築はでき、サーバーやデータベースサービスは日ごろ取り扱っている。
ただそれだけだと十分ではなく、AWSには運用のサービスもたくさんある。それらの使い方もマスターしておかなければいけないだろうと考えていた。
また、実際に運用を行っている人との会話も増えてきているので、その人たちがどのようなことをやっているかについても知っておきたいという気持ち。


# 勉強方法について

基本的に参考書を読む → ひたすら問題集を解く。
参考書はずっとにらめっこしていても時間がもったいないので、軽く全体をさらった後は辞書的なものとして使っている。
[AWS認定資格試験テキスト AWS認定SysOpsアドミニストレーター - アソシエイト AWS認定資格試験テキスト](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9ASysOps%E3%82%A2%E3%83%89%E3%83%9F%E3%83%8B%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/481560908X)


勉強期間は大体1か月くらい。毎日1～2時間程度なので、時間にすると40時間前後といったところ。
もともと業務でAWSを扱っていたのと、ソリューションアーキテクトのときの記憶があったりしたので、それほど不安もなく試験日当日を迎えられた。

# 所感

業務でもAWSを取り扱っているのもあってか、初めてAWSのアソシエイトレベルを受験したときよりも苦労はなかった。そのため、日ごろの活動が自分の力になっているのを感じた。
残りアソシエイトレベルの資格としてはデベロッパーが残っているため、そちらにも引き続き挑戦していこうと思う。
pythonで平均値の定理のグラフを描画するコード

# 環境
jupyter notebookで使用してください。
# 使うパッケージ
```python
import sympy as sym
import numpy as np
```
# 平均値の定理のグラフを描画するコード
```python
def creat_graph_mean_value_theorem(xmin, xmax, function):
    x = sym.Symbol("x") #変数の設定
    f = sym.simplify(function) #関数を単純な形にする
    
    c = sym.Symbol("c") #変数の設定
    a = float(xmin) # floatにする
    b = float(xmax)
    #平均値の定理の式
    equation = sym.Eq(f.diff(x).subs(x, c), (f.subs(x, b) - f.subs(x, a)) / (b - a)) 
    
    #平均値の定理をcについて解く。
    solution = sym.solve(equation, c)

    #求めたcのうち、xmin<c<xmaxとなるものを取ってくる。
    solution_arr= np.array(solution)
    c_answer =solution_arr[(solution_arr < b)&(a < solution_arr)]
    print("c=",c_answer)
    
    #端点を結んだ直線の傾きと切片を求める
    slope = (f.subs(x, b) - f.subs(x, a)) / (b - a)
    intercept_edge = f.subs(x, a) - slope*a
    
    #平均値の定理から導かれる直線の傾きと切片を求める。傾きは上と同じなのでそれを流用。
    intercept_mean = f.subs(x,c_answer[0]) - slope*c_answer[0]
    slope_mean = f.diff(x).subs(x, c_answer[0])
    print(slope,slope_mean)
    
    sym.plot((f,(x,a,b)),
         (slope*x + intercept_edge, (x,a-1,b+1)),
         (slope_mean*x + intercept_mean, (x,a-1,b+1)))
```
# 関数の使い方
`xmin`、`xmax`それぞれ平均値の定理の定義域の下限、上限です。`function`には`x`を変数とした関数を入れてください。

# コードの詳しい（？）解説
`sym.Eq(a, b)`：a=b。
`f.diff(x)`：変数$x$で`sympy`での関数`f`を微分する。$\frac{d}{dx}f(x)$。
`f.subs(x, y)`：関数の変数$x$に$y$を代入する。$f(x=y)$。
`sym.solve(equation, c)`：方程式をcについて解く。
`sym.plot((function,(x,a,b))`：`function`はプロットする関数。$f(x)$を打ち込む。`(x,a,b)`は定義域。$a\leqq x \leqq b$ 。plotの引数の中に`,(function_1, (x,a_1,b_1)`を入れると定義域をそれぞれ設定できる。

途中で`numpy.array`にしているのは条件$x_\text{min}<c<x_\text{max}$を満たす$c$をとってくるため。
Aivenは、eFishery社のソフトウェア・エンジニアの創造性を支援し、インドネシアの養殖業を変革します。

<font color="Grey">*[Aiven helps Software Engineers at eFishery to be Creative and Transform Indonesian Aquaculture](https://aiven.io/blog/aiven-helps-software-engineers-at-efishery)の翻訳です。*</font>

2023年9月12日

# Aiven、eFishery社のソフトウェア・エンジニアの創造性を支援し、インドネシアの養殖業を変革する

eFisheryのテクニカル・リード兼シニア・ソフトウェア・エンジニアであるアリフ・ラカム氏が、自身のキャリアパスとクリエイティブな技術チームをどのように築き上げたかについて語ります。

ソフトウェア・エンジニアリングは芸術か科学か？eFisheryのエンタープライズ・プラットフォーム・チームでテクニカル・リード兼シニア・ソフトウェア・エンジニアを務めるアリフ・ラカムは、その両方であると確信している。「もちろん、エンジニアリングとコンピュータ・サイエンスに根ざしていますが、有用なものを構築するには創造性が必要です」と、彼は最近ジャカルタで開催されたAivenオープンソース・データ・インフラストラクチャ・ミーティングで説明した。


役に立つものを作るというのは、まさにeFisheryの仕事です。イー・フィッシャリーは、インドネシアのエビと魚の養殖事業に持続可能で統合されたバリューチェーンを構築し、世界の食料安全保障を強化することを使命とする、急成長中の技術系ユニコーン企業だ。


イー・フィッシャリーは、モノのインターネット技術に基づく自動給餌システムを開発したほか、養殖業者向けの魚やエビの飼料、B2B消費者向けの鮮魚やエビ製品、養殖業者向けの金融商品を販売するマーケットプレイスを含む企業向けプラットフォームを展開している。


![ソーシャルバナー eFishery Arif](https://cdn.sanity.io/images/sczeoy4w/production/401adbba6f0e53ec4d6470325609a44b55aa81fa-1200x628.png?q=80&fit=min&auto=format&dpr=1.5)


## オープンソースへの情熱


理想主義者であり、テクノロジーとオープンソースの価値を熱心に推進するアリフにとって、eFishery は創造性を発揮し、ソフトウェア設計、分散システム、PostgreSQL® や Apache Kafka® などのオープンソース技術に関する深い知識を活用するのに最適な場所でした。


アリフのこれまでのキャリアの軌跡は印象的だ。オラクル・データベース・アドミニストレーターとして2年間勤務したほか、民間企業や公的機関でソフトウェア・エンジニアリングの職務を歴任。2023年初めにeFisheryに入社し、現在はエンジニアチームのリーダーを担当している。


彼のチームはeFishery社内で使用する高品質なツールやライブラリを設計、開発、保守しています。社内の同僚と緊密に連携し、チームが開発するソリューションが当面のニーズを満たすと同時に、会社の技術ロードマップと長期的な目標に沿ったものであることを確認している。


イー・フィッシャリーは野心的な会社であり、将来への大きなビジョンを持っている。「私たちは技術的なビジョンを推進し、エンタープライズ・プラットフォームが成長し続ける方向性を形成しています。「私たちは常に新しいことに取り組んでいます。


## 新しいソリューションの開発


例えば、アリフはeFisheryのリスク・不正防止チーム向けの新しいソリューションを特に誇りに思っている。このサービスは、リスク・チームが取引を分析し、不正行為を検知するのに役立つ。このような分析はリアルタイムで行われる必要があります。不正行為を防止するだけでなく、顧客体験を可能な限り円滑に保つためにも必要なのです。


「リスク・不正防止サービスのように、ダウンタイムが発生すると顧客にとって、そして私たちにとっても非常にまずいシステムやソリューションがたくさんあります」とアリフ氏は言う。「例えば、トランザクション・ロギングにはOdooを使っています。財務プロセスに関わるものはすべて、超高信頼性が必要です。絶対的な信頼が必要なのです。


これが、アリフのチームがAivenを使ってPostgreSQLとApache Kafkaの管理を代行している理由のひとつだ。


## 創造的な技術チームの構築


「PostgreSQLとKafkaは素晴らしいオープンソース技術です。PostgreSQLは、私が最初に取り組んだオープンソースデータベースの1つで、前職では、仮想アカウントジェネレーターの銀行ユースケースを処理するスタックを選択しなければならなかったとき、私はPostgreSQLとNodeJSを選択しました。また、サービス・プラットフォームをウェブからモバイル・アプリに移行する際にも使いました。しかし、eFisheryではクリエイティブな技術チームを作っています。私のチームがeFisheryが必要とするアプリケーションの開発に集中できるよう、データ・インフラを稼働させ、最新の状態に保つためには、Aivenのようなベンダーが必要なのです」と彼は言う。


大きな想像力と独創的な思考への渇望を持つアリフは、新しいアイデアを生み出す破壊的なテクノロジーを常に探し求めている。「私は最新のジェネレーティブAIに興奮していて、それがソフトウェア開発を根本的に変えると思っています。「私は、ユーザーの生活を楽にするAIを搭載したアプリを作りたいのです」。


彼のこれまでのキャリアと、創造性とロジックを融合させる能力を観察していると、間違いなくそれはすぐにでも実現するだろう。



Aivenと私たちのサービスに関する最新ニュースや、オープンソースに関する様々な情報を入手するには、[月刊ニュースレターを購読](https://aiven.io/newsletter)してください！Aivenに関する日々のニュースは、[LinkedIn](https://www.linkedin.com/company/aiven/)と[Twitter](https://twitter.com/aiven_io)のフィードでご覧いただけます。


サービスのアップデート情報を知りたい方は、[変更履歴](https://aiven.io/changelog)をご覧ください。
Nodeのバージョン管理できていますか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779963/6b203e5e-646b-e281-0730-774be0cceaff.png)


# はじめに
この記事ではNodeのバージョン管理にVoltaをお勧めする記事です。

私は普段フロントエンド開発が多く、特にNuxtを業務で扱うことが多いです。
Nuxt2系プロジェクトや古いプロジェクトを触るときに、「何も触ってないのに急にアプリが立ち上がらなくなった！」ということがよくあります。また、Github Actions上でCIでも急にエラーになるということもたまにあります。
この原因で一番多いのがNodeのバージョン違いによるビルドエラーで、ここのマネジメントを行なってビルドエラーによるロスタイムを減らそうという記事です。


# 具体的に何が問題なのか
執筆現在、Node.jsのLTSは18.17.1です。対して最新版は20.6.1です。
[リリース状況](https://nodejs.org/ja/download/releases)をみると、メジャーアップデートが半年に一度あり、メジャーバージョンが偶数のものがLTSとなっています。LTSの期間は約2年で、バージョン18のLTSは[2025-04-30](https://github.com/nodejs/release#release-schedule)となっています。

基本的にLTSバージョンを採用することが多いので、プロジェクトによってはNode.jsを14や16、18を使っているを使っていたりということはよくあると思います。

そんな時に、古いバージョンで14までしか対応していないパッケージが含まれていると、16,18のバージョンで動かそうとするとビルドなどでエラーが起きてしまいます。

これを自動的に解決していく方法を今回は2つ考えてみます。

# 解決方法
今回は、以下2つの解消法を紹介します。
- `.node-version`ファイルの作成
- Voltaの導入


## `.node-version`ファイルの作成
`.node-version`ファイルはNode.js のプロジェクトで使用する Node.js のバージョンを指定するためのファイルです。

```zsh:zsh
node --version > .node-version
```
例えば、プロジェクトが Node.js のバージョン 14.15.1 を必要とする場合、`.node-version` ファイルに以下のように記述します。
```zsh:.node-version
14.15.1
```

[対応状況](https://github.com/shadowspawn/node-version-usage#compatibility-testing)が広く、他のNode.js のバージョン管理ツール(nvm, nodeenv, n)でも使用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779963/0f687d10-9028-2b60-5ce0-c1664fcfacaf.png)

ただし、適用タイミングが自動的なものもあれば手動のものもあり、余分にファイルが増えてしまうというのがちょっと微妙です。

そこで自動的に適用かつファイルも増やさずに対応できる次の方法をお勧めします。

## Voltaの導入

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779963/2060cccc-fb37-5e76-bf12-17746666766f.png)


# Voltaとは
Voltaは、Rust製のNode.js のバージョン管理ツールです。
https://volta.sh/

# 何がいいか
いかにざっとあげてみます
- `node`のバージョン固定がコマンド1つでできる
- `package.json`に記載されるため余計なファイルを増やさない
- インストールが簡単
- MacでもWindowsでも利用可能
- 早い！

### `node`のバージョン固定がコマンド1つでできる
プロジェクトのディレクトリでお使いのパッケージマネージャーに合わせて`volta pin`コマンドを打つだけで設定完了です。
これで、該当プロジェクトに移動すると自動的にバージョンが切り替わってくれます！
```zsh:zsh
volta pin node@12.20
volta pin yarn@1.19
```

### `package.json`に記載されるため余計なファイルを増やさない
`pin`コマンドを打つと、`package.json`に以下のセクションが追記されます。
`.node-version`のように新規で作成する必要はありません。
```json:package.json
"volta": {
  "node": "12.20.2",
  "yarn": "1.19.2"
}
```

### インストールが簡単
Macの方はhomebrewなら以下コマンド叩くだけです。パスも自動的に通してくれます。
```zsh:zsh
brew install volta
```

Windowsの方も以下リンクからインストーラーをダウンロードします。
https://docs.volta.sh/guide/getting-started


### 減点ポイント
パッケージマネージャーの`pnpm`の対応状況がまだ実験的であるところです。
以下、公式です。一応使えるっぽいです。
https://docs.volta.sh/advanced/pnpm

## 最後に
Voltaのススメでした。
使い方もシンプルで、公式ドキュメントもさっと読める文量なのでぜひ使ってみてください！
モジュールのパスについて

# 概要

Raspberry Pi Pico W上でMicroPythonを使って開発する場合に、自作モジュールをmain.pyでimportすることはよくある。


```python:main.py
from wifi import connect

ip = connect()
```

上記の場合、wifi.pyがmain.pyと同じルートに配置されているか、libフォルダ内に配置されている場合はimportすることができる。

```python:REPL
>>> import sys
>>> sys.path
['', '.frozen', '/lib']
```

任意のフォルダをモジュールの検索パスに含めたい場合は、以下のようにsys.pathに追加する必要がある。

```python: main.py
import sys
sys.path.append('/libs') # モジュールの検索パスに含めたいフォルダを指定する
```
2023/9/19主にITとかセキュリティの記事

顔画像の消去、国・地方に要請　体温測定カメラで個人情報委(9/15)
https://news.infoseek.co.jp/article/kyodo_1075370145911980559/

サイバー攻撃、大手クラウド悪用6倍 4～6月　アマゾンやグーグル経由(9/17)
https://www.nikkei.com/article/DGKKZO74526040W3A910C2EA5000/

マツダ、不正アクセスで個人情報10万件超が流出の可能性(9/17)
https://carview.yahoo.co.jp/news/detail/ce985a221886d85d1bcea0f19a79ec6d58768946/?mode=short

「生成AI」活用を模索する神戸市、打ち出した指針と全国に先駆けた条例改正の中身(9/14)
https://active.nikkeibp.co.jp/atcl/act/19/00340/082400009/

衝撃の臓器狩り犠牲者“ダイイング・メッセージ”…公開後、過去最大のサイバー攻撃(9/17)
https://www.epochtimes.jp/2023/09/174313.html

週刊まとめ｜アーサー相場予想に注目集まる、ガンダムメタバースが期間限定でオープンへなど(9/17)
https://coinpost.jp/?p=482262

「基本情報は受けてもムダ」は本当？　受験して感じた応用情報との違い(9/16)
https://kn.itmedia.co.jp/kn/articles/2309/16/news043.html

「どの脆弱性を優先して対応するべきか」をスコア化してくれる「EPSSモデル」とはいったいどんな仕組みなのか(9/16)
https://gigazine.net/news/20230916-epss/

マルウェア含むFree Download Manager3年間配布される、利用者は確認を(9/17)
https://news.mynavi.jp/techplus/article/20230917-2772562/

パスワードがハッシュ値で保存されているサイトのSQLインジェクションによる認証回避の練習問題(9/18)
https://qiita.com/ockeghem/items/787f74801a24e1fc6960
[Swift] 文字の大きさと間隔

#文字の大きさ指定

```swift
VStack{
    Text("Large Title").font(.largeTitle)
    Text("Title").font(.title)
    Text("Headline").font(.headline)
    Text("Subheadline").font(.subheadline)
    Text("Body").font(.body)
    Text("Callout").font(.callout)
    Text("Caption").font(.caption)
    Text("Small").font(.footnote)
}
```
下記のように表示される
![スクリーンショット 2023-09-19 2.38.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1238764/545ec404-a6c5-75cf-9127-86b8eb82d21d.png)

#文字の間隔設定

```swift
 VStack(spacing: 30.0){
                    Text("文字だよ")
                    //文字のサイズ指定
                        .font(.largeTitle)
                }
```

spacing:000←ここの数字を変えると文字と文字との幅が指定される。
Javaで「対数を取得する」の動作を確認してみた

# 概要

Javaで「対数を取得する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/math/index6.html

# 実装

以下のファイルを作成しました。
```JSample6_1.java
class JSample6_1{
  public static void main(String[] args){
    System.out.println(Math.log(10));
    System.out.println(Math.log(1));
    System.out.println(Math.log(Math.E));

    System.out.println("-- --");

    System.out.println(Math.log10(100));
    System.out.println(Math.log10(10));
    System.out.println(Math.log10(1));

    System.out.println("-- --");

    System.out.println(Math.log1p(10));
    System.out.println(Math.log1p(1));
    System.out.println(Math.log1p(0));
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample6_1.java 
$ java JSample6_1 
2.302585092994046
0.0
1.0
-- --
2.0
1.0
0.0
-- --
2.3978952727983707
0.6931471805599453
0.0
```

# まとめ
何かの役に立てばと。
せんせー、ストレスタンパク質解析ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、ストレスタンパク質解析ってなに？

# ストレスタンパク質解析とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## ストレスタンパク質解析って何？

ねえ、みんな！体の中には、とても小さな部品がたくさんあって、それが私たちの体を動かしているんだよ。ストレスタンパク質解析は、その中でも特に「ストレスを感じる時に活躍する小さな部品」を見つける探偵のような仕事なんだ。

## どういうこと？

体がストレスを感じると、その小さな部品（タンパク質と言うんだよ）が動き出すんだ。その動きをよく見ることで、どうしてストレスが起きるのか、どうやって体がそれに反応するのかを理解できるんだよ。

## どうしてそれがすごいの？

それがすごいのは、この探偵のような仕事をすることで、私たちがストレスからくる病気を予防したり、治したりする方法を見つける手がかりになるからなんだ。つまり、健康になれるように助けてくれるんだよ。

## だから、ストレスタンパク質解析ってなに？

それは、ストレスを感じる時に体の中で活躍する小さな部品を見つけるための探偵のような仕事なんだよ。

# まとめ

ストレスタンパク質解析は、ストレスを感じる時に体の中でどういうことが起こるのかを理解するために、とても小さな部品を研究する探偵のような仕事なんだ。そして、それを知ることで、私たちが健康でいられるように助けてくれるんだよ。
せんせー、ダイナミックネットワーク分析ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、ダイナミックネットワーク分析ってなに？

# ダイナミックネットワーク分析とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## ダイナミックネットワーク分析って何？

みんな、大きな蜘蛛の巣を見たことあるかな？「ダイナミックネットワーク分析」ってのは、そんな蜘蛛の巣のようなものを使って、色んな情報や物の関係を見て理解する方法なんだよ。

## どういうこと？

これは、大人がどのように友達や家族と関わっているか、またはどのように色々な物が互いに関係しているかを見るために使う道具なんだ。蜘蛛の巣のように、線で繋がった点からなる図を使って見ると、どの点がどの点とどんな関係があるかわかるんだよ。

## どうしてそれがすごいの？

これがすごいのは、大人たちが大切な決定をするときや、新しいものを作るときに、どの情報が一番重要なのかを知るために使えるからだよ。つまり、すごい物を作る時の助けになるんだ。

## だから、ダイナミックネットワーク分析ってなに？

ダイナミックネットワーク分析は、蜘蛛の巣のような図を使って、物や情報の関係を見る方法なんだよ。

# まとめ

蜘蛛の巣のような図を作って、物や情報の関係を見る方法を「ダイナミックネットワーク分析」と言うんだよ。これで、大人たちは重要な情報を見つけて、すごいものを作る助けになるんだよ。
JSONを使用してHTTP通信

```swift
import SwiftUI

struct ContentView: View {
    @State private var jsonData: [String: Any] = [:]

    var body: some View {
        VStack {
            Text("JSON Response:")
                .font(.headline)
                .padding()

            Text("\(jsonData)")
                .padding()

            Button("Fetch JSON") {
                fetchDataFromAPI()
            }
            .padding()
        }
    }

    func fetchDataFromAPI() {
        guard let url = URL(string: "https://example.com/api/data") else {
            return
        }

        URLSession.shared.dataTask(with: url) { (data, response, error) in
            if let error = error {
                print("Error: \(error)")
                return
            }

            guard let data = data else {
                print("No data received")
                return
            }

            do {
                let json = try JSONSerialization.jsonObject(with: data, options: [])
                if let jsonDictionary = json as? [String: Any] {
                    DispatchQueue.main.async {
                        self.jsonData = jsonDictionary
                    }
                }
            } catch {
                print("JSON parsing error: \(error)")
            }
        }.resume()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

```
Swaggerの読み方

# この記事の目的
Swaggerが読めるようになること。

# 目次
1. Swaggerとは
2. Swagger Editor
3. Swaggerの単語説明

# Swaggerとは
OpenAIの仕様で記述されたAPIドキュメント。
jsonとyamlで記述できる。
以下公式ドキュメント。
[Swagger](https://swagger.io/specification/)

# Swagger Editor
Swaggerをより視覚的に見やすくするためのツール。
freeで使えるのは以下3つ。
1. Swagger Editor
2. Swagger Codegen
3. Swagger UI

今回はSwagger Editorを使用。
[Swagger](https://editor.swagger.io/)が提供しているものもあるが、以下でローカルに落として実行も可能。

```
git clone https://github.com/swagger-api/swagger-editor.git
npm run start
```
http://localhost:3200 にアクセス。
ブラウザ上で確認が可能。

# Swaggerの単語説明

**OpenAPI Object**
ルートとなるカテゴリ。openapiとinfoは必須。
```
openapi: 
info:
externalDocs:
servers:
tags:
paths:
components:
```

**Paths Object**
/{path}
　APIエンドポイントへの相対パス。絶対パスはservers/url/{path}になる。

**Paths Item Object・Operation Object**
単一のパスにアクセスしたときの操作を記載されている。
以下のsampleは、
・/pet/{petId}にgetでアクセスした場合。
・IDでpetを検索し、そのpetの情報を返す。
・パラメータは、petIdと定義し、クエリーパラメータ。
　クエリーパラメータは必須で、integer型で符号付で64bitまで
・レスポンス
　200 → 成功。application/jsonで返す。response bodyは/components/schemas/Petに記載のもの。
　400 → 失敗。IDが不正。
　404 → 失敗。IDに紐づくPet情報がない。


```
paths:
  /pet/{petId}:
    get:
      tags:
        - pet
      summary: Find pet by ID
      description: Returns a single pet
      operationId: getPetById
      parameters:
        - name: petId
          in: path
          description: ID of pet to return
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Pet'          
            application/xml:
              schema:
                $ref: '#/components/schemas/Pet'
        '400':
          description: Invalid ID supplied
        '404':
          description: Pet not found
```

**Schema Object**
入出力の項目やデータ型を定義している。
以下のsampleは、
・Petスキーマには、id,name,category,photoUrls,tags,statusの項目を持っている。

```
components:
  schemas:
    Pet:
      required:
        - name
        - photoUrls
      type: object
      properties:
        id:
          type: integer
          format: int64
          example: 10
        name:
          type: string
          example: doggie
        category:
          $ref: '#/components/schemas/Category'
        photoUrls:
          type: array
          xml:
            wrapped: true
          items:
            type: string
            xml:
              name: photoUrl
        tags:
          type: array
          xml:
            wrapped: true
          items:
            $ref: '#/components/schemas/Tag'
        status:
          type: string
          description: pet status in the store
          enum:
            - available
            - pending
            - sold
      xml:
        name: pet
```
Gatsby Starter BlogにAmazonアフィリエイトを使う

## Gatsby Starter BlogにAmazonアフィリエイトを張り付ける方法

 Gatsbyにアマゾンリンクを埋め込めるプラグインを使っていたが、商品リンクの数が増えるとページ出力が遅くなった。なのでPA-APIで先に商品情報を取得してからjsonをGatsbyに読み込ませた。
例えば下のようなプラグインなどがある。

https://www.gatsbyjs.com/plugins/gatsby-remark-amazon-link/

ブログにマークダウンで書かれた文章内にタグを入れることでアマゾンの商品リンクを作る。

```
<Amazon asin="B01EJ7AK5O" />
```

初めはmdを使っていたが途中からMDXにすることでcomponentを呼び出す形にした。
```
import Amazon from "../../../src/components/amazon"
```

受け取り側のcomponentはasinを受け取り、jsonファイルからasinで検索して商品情報をhtmlで返す。

マークダウンからASINを抽出、PA-APIでASINから商品情報を取得してJSONファイルに、JSONファイルをGatsbyに渡すという形に落ち着いた。

componentでasinを受け取り、jsonをgraphqlから取得してasinでフィルタリングする

i/src/components/Amazon.js
```
import * as React from "react"
import { useStaticQuery, graphql } from "gatsby"

const Amazon = ({ asin }) => {
  const data = useStaticQuery(graphql`
query MyQuery {
  allJson {
    edges {
      node {
        Asin
        Booktype
        Category
        Contributor
        ImageURL
        Points
        Price
        Publisher
        Title
        URL
      }
    }
  }
}
  `)
  const book = data.allJson.edges

 var file = book.filter(word => asin.includes(word.node.Asin));

```
完成したブログ

https://kyukyunyorituryo.github.io/i/

コード

https://github.com/kyukyunyorituryo/i/tree/main


PA-APIでのアマゾンアソシエイトjsonの取得方法


https://qiita.com/99nyorituryo/items/e337e6a75c361521f297

GatsbyでJSONの利用

https://qiita.com/99nyorituryo/items/66470c77cb98e32eb074

参考

https://bel-itigo.com/gatsby-migrate-from-markdown-to-mdx/
ナビゲーションリンク使ったら値渡せる

値を渡すといえば、SwiftUIでは基本となるのが@Binding（varやletでも渡すことが可能）
```swift
struct ParentView: View {
    @State private var value = 42

    var body: some View {
        ChildView(value: $value)
    }
}

struct ChildView: View {
    @Binding var value: Int

    var body: some View {
        Text("Value: \(value)")
    }
}

```



ナビゲーションリンクで値を渡す際はこのように書く

```swift
import SwiftUI

struct ContentView: View {
    @State private var valueToPass = "Hello, World!"

    var body: some View {
        NavigationView {
            NavigationLink(destination: DetailView(passedValue: valueToPass)) {
                Text("Go to Detail View")
            }
        }
    }
}

struct DetailView: View {
    var passedValue: String

    var body: some View {
        Text("Passed Value: \(passedValue)")
    }
}
```

でも最近ナビゲーションリンクじゃなくてナビゲーションマネージャー使うようになったからこれもつかわなくなってきた。

以上。

9/21　記事訂正済み
macOS で ROS 2をビルドする

## はじめに
dockerもvmも何も使いません。

## テスト環境
- M1 Max 64GB MacBook Pro
- macOS 14.1.1 (23B81)

## 依存関係のインストール

1. brew インストール
    ```bash
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    ```
2. **ここでbrewインストールの最後に言われたコマンドを実行する** 
    この手順はbrewのバージョンによって異なるので言われた通りに実行してください。
    ```bash
    # 例
    echo 'eval $(/opt/homebrew/bin/brew shellenv)' >> /Users/hoge/.zprofile
    eval $(/opt/homebrew/bin/brew shellenv)
    ```

3. brewを使って依存関係のインストール
    ```bash
    brew install \
        asio assimp bison bullet cmake console_bridge cppcheck \
        cunit eigen freetype graphviz opencv openssl orocos-kdl pcre poco \
        pyqt5 python qt@5 sip spdlog tinyxml tinyxml2 wget
    ```
4. 不要なパッケージのアンインストール
    Python3.12が勝手にインストールされるので削除します
    ```bash
    brew uninstall --ignore-dependencies python@3.12
    ```
5. pipを使って依存関係のインストール
    ```bash
    python3 -m pip install -U pip
    python3 -m pip install --global-option=build_ext \
           --global-option="-I$(brew --prefix graphviz)/include/" \
           --global-option="-L$(brew --prefix graphviz)/lib/" \
           pygraphviz
    python3 -m pip install -U \
          argcomplete catkin_pkg colcon-common-extensions coverage \
          cryptography empy flake8 flake8-blind-except==0.1.1 flake8-builtins \
          flake8-class-newline flake8-comprehensions flake8-deprecated \
          flake8-docstrings flake8-import-order flake8-quotes \
          importlib-metadata lark==1.1.1 lxml matplotlib mock mypy==0.931 netifaces \
          nose pep8 psutil pydocstyle pydot pygraphviz pyparsing==2.4.7 \
          pytest-mock rosdep rosdistro setuptools==59.6.0 vcstool
    ```

## ビルド
1. ソースの用意
    ```bash
    git clone https://github.com/TakanoTaiga/ros2_m1_native.git
    cd ros2_m1_native
    mkdir src
    vcs import src < ros2.repos
    ```

2. ビルド
    ```bash
    colcon build --symlink-install --merge-install --cmake-args \
                -DBUILD_TESTING=OFF \
                -DTHIRDPARTY=FORCE \
                -DCMAKE_BUILD_TYPE=Release
    ```

## .zshrcに書き込むもの
```
source ~/Documents/ros2_m1_native/install/setup.zsh
export ROS_VERSION=2
export ROS_PYTHON_VERSION=3
export ROS_DISTRO=humble
```

`source ~/Documents/ros2_m1_native/install/setup.zsh`これはDocument配下で`git clone`した場合の例。home配下だと`source ~/ros2_m1_native/以下略`になる。

## テスト
ターミナルを再起動して以下を実行。
```
# terminal 1
ros2 run demo_nodes_cpp talker
```
```
# terminal 2
ros2 run demo_nodes_py listener
```


## 最後に
トラブルがあればこちらにIssueを投げて頂ければと思います。

https://github.com/TakanoTaiga/ros2_m1_native
Pumaについて深掘りしてみた

## Pumaとは
:::note
Railsを動かすためのアプリケーションサーバーのことで、Webサーバーの役割も兼ねることができブラウザからのリクエストを元にレスポンスも返す。Rails6はデフォルトでPumaが採用されている。
:::

##### その他のRails用のアプリケーションサーバー
* Unicorn
* Mongrel
* Thin
* Rainbows
など。それぞれに異なる長所があり、異なる設計思想を持っている。


## Pumaの仕組み
##### マルチスレッド
１プロセスの中で複数の処理を同時に扱うマルチスレッドで動作する。マルチスレッドによって大量のアクセスを効率的に処理することができる。

##### Ruby/Rackアプリケーション
>Puma is a simple, fast, multi-threaded, and highly parallel HTTP 1.1 server for Ruby/Rack applications.

Puma は、シンプル、高速、マルチスレッドで多数の並列処理を実現できる Ruby/Rack アプリケーションの HTTP 1.1 サーバーである。
Rackは、Rubyにおけるサーバーとアプリケーション・フレームワーク間のインターフェースの役割を果たすライブラリのこと。

>rails serverコマンドは、Rack::Serverのオブジェクトを作成し、Webサーバーを起動している。

1. HTTPリクエストをWebサーバーであるNginxやApacheで受けとる
1. NginxはそのリクエストをPumaにSocket通信で渡す
1. PumaはそのリクエストをRack::Serverに渡す
1. 最終的にRailsのRouterに渡される



## Pumaの特徴
##### Webサーバーとの連携
PumaはWebサーバーとしての機能を兼ねることもできますが、通常の本番運用ではPumaはアプリケーションサーバーとしての機能に特化させて、NginxやApache等のWebサーバーと連携させた構成にすることが多い。

##### Unicornとの比較
Unicornはマルチプロセスで動く。プロセスごとに通信処理を行うので、重たい通信があった場合そこでブロックされて全体が重くなる。これを捌けるようにするには、UnicornのWorker数を増やす必要があるが、CPUのコア数による処理制限があるため無闇に増やせない。

Unicornで動かす場合は、マルチプロセスなのでスレッドセーフは保証されている。

||Puma|Unicorn|
|:-|:-|:-|
|概要|スレッドベース|プロセスベース|
|メリット|スレッドが2つあったら、2つのリクエストを同時に処理できる。マルチプロセス＋マルチスレッドで動かすので、workerプロセスが2つ✖スレッドが2つある場合、4つのリクエストを同時に処理できる。|workerプロセスが2つある場合、2つのリクエストを同時に処理できる。スレッドセーフなコードを意識しなくて良い。|

## Pumaの設定
PumaはRailsの場合、`config/puma.rb`で詳細な設定をすることができる。

##### threads_count
Pumaサーバーがワーカープロセスごとに持つことができるスレッドの数を指定する。これによって1つのワーカープロセスが同時に処理するリクエストの数を制御できる。

```ruby:config/puma.rb
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i
threads threads_count, threads_count
```

##### port
Pumaサーバーが待機するポート番号を指定する。外部からのリクエストを受け取るためには、特定のポート番号で待機する必要があります。

```ruby:config/puma.rb
port ENV.fetch("PORT") { 3000 } # Pumaに3000番ポートで待機させる例 
```

##### pidfile
PumaプロセスのPIDを保存するファイルのパスを指定する。PIDファイルはデーモンとして実行されているプロセスの情報を追跡するために使用される。

```ruby:config/puma.rb
pidfile 'tmp/pids/puma.pid'
```


---
参考ページ一覧
https://nekorails.hatenablog.com/entry/2018/10/12/101011
https://github.com/puma/puma
https://serip39.hatenablog.com/entry/2020/12/23/235700
https://qiita.com/jnchito/items/3884f9a2ccc057f8f3a3
https://qiita.com/redrabbit1104/items/9292b5891dc46eb64f3a
【Next.js】middlewareでcookieを設定する方法

## 設定方法

以下のように記述するとcookieを追加できます。


```middleware.js
let response = NextResponse.next()
response.cookies.set('show-banner', 'false')
return response
```

また、以下のように記述するとcookieの詳細な設定ができます。

```middleware.js
let response = NextResponse.next()
response.cookies.set({      
    name: 'show-banner',
    value: 'false',
    path: '/',})
return response

```
サイトをSSL化する（最終決戦）

## 失敗編
https://qiita.com/K4715959155160/items/cc43b25cdc3cb0036f76

## 背景
失敗編に掲載したが、元々はLet's encryptでSSLサーバー証明書を発行してサイトをSSL化したかったわけである。しかし、使用しているサーバー元がLet's encryptに対応していないとのことで、別のSSLサーバー証明書を発行してくれる事業者を探した。

## 本論
今回はNetowlさんを使わせてもらった。

https://www.netowl.jp/

そこのSSL BOXからいろんなサービスがあるので、そこから選びました。

https://www.sslbox.jp/

サイトをSSL化させるために行う手順として、
1. 契約手続きと支払い完了確認用メールアドレスの設定
1. 届いたメールアドレスに記載されたSSL証明書をサーバーに貼り付け
1. 中間証明書は自身が決めた暗号手法に応じて、2.と同様にサーバーに貼り付け

以下が、見事サイトが暗号化された様子である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476751/c23d0964-1e36-ffd1-4d6e-f6cd119d2793.png)

ここから、Google Search Consoleにサイトを登録して、検索窓から適当なキーワードを入力してサイトが出力されるように考えます。
NiceGUIでFastAPIのRequestオブジェクトを取得する

[NiceGUI](https://nicegui.io/)では、[FastAPI](https://fastapi.tiangolo.com/ja/)のリクエストオブジェクトを取得できます。

## 実行環境
- Python 3.10
- NiceGUI 1.3.13

## コード

```python
from fastapi import Request
from nicegui import ui

@ui.page('/')
def main_page(request: Request):
    # リクエストオブジェクトを使った処理
    ui.label(f'Hello {request.client.host}!')

ui.run()
```

このコードのポイントは、引数に`request: Request`とFastAPIの型注釈付きで指定している点です。ここは内部的にPydanticでチェックされているようで、引数名や型が違うと正常に動作しません。

## 参考
- [nicegui/main\.py at 5662357fe57f246d2e5ae9275c5c56e4ed39c8c4 · zauberzeug/nicegui](https://github.com/zauberzeug/nicegui/blob/5662357fe57f246d2e5ae9275c5c56e4ed39c8c4/main.py#L53)
- [Using the Request Directly \- FastAPI](https://fastapi.tiangolo.com/ja/advanced/using-request-directly/)
- [Requests \- Starlette](https://www.starlette.io/requests/)
アプリをリリース・アップデート時にGitHub 上に Releases を作成しておこう！

# GitHub 上に Releases を作成するメリット
1. リリースしたバージョンのソースコードを特定することができる！
2. アップデート版のリリースでどんな修正や更新があったか分かりやすくする！

上記のようなメリットがあります。確かに今までライブラリーを使用する際にReleaseをよく見ていましたが、分かりやすいですよね！
# GitHub 上に Releasesを作成しよう！
gitコマンドやGUI上からTagを打って作成する方法もあるみたいですが、GitHub上で作成する方法が最もシンプルで分かりやすそうだったので紹介します。
1.Releasesをクリックする！
![ccb9e3977a66daf657368e95c064b82b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/c2fbe117-7d78-ac9b-b047-152453e9e2ef.png)
２. 右側のDraft a new release(新しいリリースの下書き)をクリックする！
![f8957b6289e314aa8ce51a3fe4525c9a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/ee9d15f3-31ce-b68e-1ef2-9e89a44dbfee.png)
3. Choose a tag(タグを選択)を押す！
![cfd4a22ad659300d16cc327066280fcc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/3cbc7fb9-fbf8-6e25-202e-122e2402b3d2.png)
4.作成したいバージョンを入力し、Create new tagを押す！
![66d58a8f92939643544f98499e9ecde8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/5c765aa0-17db-79a7-f190-45765f3a89aa.png)
 5.Release titleにバージョンを入力する！
 6.Writeにアップデートした情報を入力する！
 ７. Set as the latest release(最新リリースとして設定する)にチェックが入っていること確認する！
 8. Publish release(リリースの公開)を押す！
![df6900eb2e283492902280976828077e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/684de009-6ea6-19a1-515c-5ed63e14e1a7.png)
 9.最新のアプリのバージョンがReleasesに無事表示されました！
![d256b3c4f23c2ee38293892877fc9076.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/1925460e-83e0-344f-a59b-4dc134cc65e1.png)
### 10.このように後から見返した際にどのようなアップデートをしたかが、とても分かりやすいですね！

![d21a1ff123940cbac5d4e4b859cc68fa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/a2f37005-b99f-8dcc-31df-2acc27dade60.png)
# 番外編： バージョン番号の付け方
v 1.0.0の次ってバージョン番号をどうつければいいん？:cry:
ってなりました。そこで調べた内容をまとめてみました。
## パッチバージョン
### v1.0.0からv1.0.1にアップデートする場合、
軽微なバグを見つけて修正した。後方互換性を伴うバグ修正をした場合、こちらのバージョンを上げる！

## マイナーバージョン
### v1.0.0からv1.1.0にアップデートする場合、
修正だけではなく、新機能を追加した。後方互換性があり機能性を追加した場合、こちらのバージョンを上げる！
マイナーアップデートを行った際は、パッチバージョンを0にリセットする。
例：　v1.0.1 → v1.1.0

今回の私の場合、修正と新機能追加どちらも行ったので、こちらのバージョンを上げました。
## メジャーバージョン
### v1.0.0からv2.0.0にアップデートする場合、
新機能追加だけでは止まらず、アプリが新たに生まれ変わる。APIの変更に互換性のない場合、一つ以上の破壊的な変更を含む場合、こちらのバージョンを上げる！
メジャーアップデートを行った際は、マイナーバージョンとパッチバージョンを0にリセットする。
例：　v1.1.1 → v2.0.0

## 参考文献

https://docs.github.com/ja/repositories/releasing-projects-on-github/managing-releases-in-a-repository

https://qiita.com/tommy_aka_jps/items/5b39e4b27364c759aa53

https://dev.classmethod.jp/articles/versoning-with-pictures/
【備忘録】セキュリティエンジニアになってから参考にした本やドキュメント

- 随時追記予定
- 基本的にWeb脆弱性診断学習時の情報が多め
- 資格や、資格学習時に使用した参考書なども載せていく予定


# HTML5について学ぶ
1. HTML5プロフェッショナル認定試験 レベル1について（Ver2.5）
    https://html5exam.jp/outline/lv1.html

1. HTML の学習: ガイドとチュートリアル
    https://developer.mozilla.org/ja/docs/Learn/HTML
 
# 脆弱性概要について学ぶ
1. 安全なウェブサイトの作り方(0ヵ月目)
    https://www.ipa.go.jp/security/vuln/websecurity/about.html

1. 体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践(0ヵ月目)
    https://amzn.asia/d/bveDuix

1. Webアプリケーション脆弱性診断ガイドライン 第1.2版(0ヵ月目)
    https://github.com/WebAppPentestGuidelines/WebAppPentestGuidelines
    ※ここに「ガイドラインを使いこなすためのリンク集」が記載されているので、そちらのリンクも覗く

1. SQL Injection Cheat Sheet
    https://www.invicti.com/blog/web-security/sql-injection-cheat-sheet/

# OWASP関連
1. OWASP Cheat Sheet Series
    https://cheatsheetseries.owasp.org/

1. WSTG - Stable
    https://owasp.org/www-project-web-security-testing-guide/stable/

1. OWASP Juice Shop
    https://owasp.org/www-project-juice-shop/

# セキュリティ資格関連
1. Security Certification Roadmap
    https://pauljerimy.com/security-certification-roadmap/

# Qiita
1. [サイバーセキュリティ領域で生き抜くためのキャリア論 Noriaki Hayashi](https://qiita.com/v_avenger/items/f1eb91f4c5395bc3945a)

# 番外編
1. PC遠隔操作事件
    https://amzn.asia/d/7Emsy62
    - 過去に実際に起こった事件について、当時ジャーナリストとして取材していた著者視点で執筆された本
    - 犯罪者が事件を起こすに至った背景や動機、警察の捜査の問題点などが詳細に書かれている
    - 業務に役に立つとかではないが、サイバー犯罪のリアルを知れるとともに、読み物としても面白いので記載

1. すべてがFになる
    https://amzn.asia/d/g7hhf3k
    - こちらも読み物として面白いので記載

----
# 購入予定・これから目を通す予定
(SNSでセキュリティエンジニアさんが読んでいたり、おすすめ頂いたものを羅列していく予定)

- Wizard Bible事件から考えるサイバーセキュリティ
    https://peaks.cc/books/wizard_bible_security
戻り値returnは何のためにあるの？


# 初学者向け｜戻り値returnについて

whileを使ったループ処理を書くとき、必ず出てくるのが戻り値”return”。

リターンは **「関数が行った仕事の結果」** を教えてくれるものです。

と言っても意味わかんないですよね。

# 3つの目的
設計にもよりますが、平たく言えば、次の目的で使われることが多いです。

#### 1、答えを教えてくれる
例：「2 + 3は何？」と聞いた時の「5」という答え。

#### 2、情報を教えてくれる
例：「今日の天気は？」と聞いた時の「晴れ」という答え。

#### 3、うまくいったか、ダメだったかを教えてくれる
例：ゲームで宝箱を開けるとき、「鍵が必要だよ」というメッセージが表示される場合。これは「ダメだった」という結果の一種です。

いずれも、 **答えを表示してくれないと何もわかりませんよね。**

# まとめ
要するに、関数の戻り値は、私たちが関数に頼んだ仕事の結果や答えを教えてくれるものなのです。
運用保守でいろんな現場で働いた時の心がけについて

運用保守メインでたくさんの現場で働きました。
ストレス耐性を付けるために個人的に心がけていることを記事にしました。
参考程度にしてください。


## 年下の上司が出来ても役割だと割り切る
年功序列がなくなり、私よりも若い上司が出来る場合があります。
現場ごとに柔軟に対応する事が大事です。
リーダは役割の一つ。年下のリーダーの場合は不慣れな部分がある可能性があるため、
メンバーの役割としてこまめに進捗報告を行いマネジメントしやすくする。
また、技術的なフォローも行う。

## 自分の将来のキャリアプランを考える
現職だけではなく将来どうなりたいか長期的なキャリアプランを考える
今の環境は成長するための通過点と思うことで多少はきつくても耐えられます。

## 毎日20分は有酸素運動をする
ディスクワークだと運動不足になるため、毎日20分は有酸素運動をする
時間がなくて運動できない場合は階段を使ったり可能な限り運動をする・
リモートワークは出勤している時に比べて運動不足になり体調に影響が出るため
日々の有酸素運動は必須です。

## 休む時は仕事が忙しくても調整して休みを取る。
仕事が忙しくても仕事を調整して休みを取るときは取るようにする。
仕事のためにプライベートを後回しにすると仕事優先になります。

## 可能な限り決まった時間に食事をとる
どんなに忙しくても可能な限り決まった時間に夕食と昼食を済ませる様にする。
あまり夜遅く食事をすると体調不良に繋がります。

## 仕事は一人で抱え込まない
仕事量が多くなったり、不明点が多く業務が上手くいかない時は一人でお仕事を抱え込まない様にする。
困ったら早めにチームの方にエスカレーションする。
上司が丸投げで教えてくれない環境もありましたが、進捗が悪くなると結局上司が困ります。

## 今よりもより高い要望が出る場合は、期待されているからだと思うようにする。
今のよりも高い要望が出る様になったら、今の仕事が出来ているから期待値が高くなった可能性があります。
私には伸びしろがあると思うようにする

## 失敗は自分の中で実務のナレッジが積み上がります。
失敗した経験はどこの現場でも役に立つ可能性があります。
失敗した経験が自分の中のナレッジとして積み上げることで実務に深みが付きます。


# 働く環境について
運用保守メインで9年間いろんな現場で働きました。
一番きつかったのが構築の現場は忙しくて月60時間働いたことがあります。何よりきつかったのが分からないのが原因で残業していて納期だけが迫ってきて焦る日々でした。
運用の現場も確認者不足で月平均50時間働いていました。休日出勤などもありましたが最初はきつかったですが、今では環境の耐性がつきました。
定時で帰れる現場もあればそうでない現場もあります。残業量は現場によって変わります。
Dataform on Big Query, Federated Query, Cloud SQL, Connection error: Access Denied 

When you execute workflow that uses federated query on dataform, fail:

```
reason:"invalidQuery" location:"query" message:"Access Denied: Connection 'your_conn': User does not have bigquery.connections.use permission for connection 'your_conn'. 
```

What's confusing most is when you run `*.sqlx` indivisually from editor right side above, does NOT cause error but run correctly and can get data.

This happens following this official instruction.
https://cloud.google.com/dataform/docs/required-access#grant_required_roles_to_a_service_account_used_in

They said you need to give these roles for Dataform Service Account.
- BigQuery Job User
- BigQuery Data Editor
- BigQuery Data Viewer

However, if you want to access Cloud SQL using federated query, Another role needed.
- bigquery.connections.use

It is written here.
https://cloud.google.com/bigquery/docs/cloud-sql-federated-queries


cf.
https://zenn.dev/snagasawa/articles/9d4d0d7369880f#%E5%A4%96%E9%83%A8%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9

あまり日本語英語ともに情報がなかったので、英語で書きました。いつか検索に引っかかって誰かのためになりますように。
Angularの練習ということで船橋市の人口推移グラフを作ってみた

# 経緯

現在関わっているプロジェクトでAngularを使うのが決定しており、何も知らないのはアカンと思い手軽に作れるアプリケーションを探していた。

たまたまQiitaとgithubを漁っていたら[こちらが参考になる](https://github.com/limoza/population_change_graph)と感じ、練習も兼ねてWebアプリを作成した。

# 作成したもの

船橋市の人口推移グラフ
Github : https://github.com/Suntory-Y-Water/funabashi-population-trends
URL : https://funabashi-population-trends.vercel.app/

# 使用技術

フロントエンド : Angular
ホスティング : Vercel

# 感想

## 難しかったところ

- Chart.jsとng2-chartsを理解するのに時間がかかった
- ChatGPTに終始頼りきりだった
    - 特にService, TypeScriptの文法…
- レスポンシブデザイン、いまだにちゃんと分かってない

**💡ブルーベリー本あるのでもう一周しましょうね！**

## 個人的に良かったところ

- UIはデジタル庁を参考にしたけど、結構楽しい
- Angular…ｺﾜｲがなくなったこと
- 可視化すると人気な町とほどほどな町が一瞬で分かって楽しい
    - 老人も減っている町は先が心配だなと

# その他

工数（要件定義 ~ 簡単なテスト迄）: 17時間
シェルスクリプトでcurlからSwithBotのAPI v1.1を呼ぶ

# 概要
1年前にリリースされた、新バージョンv1.1のSwitchBot APIに、シェルスクリプトでアクセスしたい。
リクエストに署名を付加する要件が追加されたため、ちょっと手順が増えたのでそのまとめ。

# 準備
SwitchBotアプリからトークンとシークレットを入手。iOSアプリの場合、「プロフィール」→「⚙️設定」から「アプリバージョン」を10回タップすると「開発者向けオプション」が現れるので、そこから入手可能。

# 公式情報
* ブログ記事
    * 【API】新バージョンAPI v1.1を公開しました
    * https://blog.switchbot.jp/announcement/api-v1-1/
* 仕様とサンプル
    * https://github.com/OpenWonderLabs/SwitchBotAPI

# 手順

```bash:switchbot_api_v11.sh
#!/bin/bash

token="<トークン>"
secret="<シークレット>"
t=$(date +%s%3N)
nonce=$(uuidgen -r)
sign=$(echo -n ${token}${t}${nonce} | openssl dgst -sha256 -hmac ${secret} -binary | base64)

result=$(
    curl -s "https://api.switch-bot.com/v1.1/devices" \
      --header "Authorization: ${token}" \
      --header "sign: ${sign}" \
      --header "t: ${t}" \
      --header "nonce: ${nonce}" \
      --header "Content-Type: application/json; charset=utf8")

echo $result
```

* `date +%s%3N`
    * ミリ秒のunixtimeを取得。仕様では13桁のunixtimeを送ることになっています。
* `uuidgen`
    * UUIDを生成するコマンド。`-r`はランダム生成
    * コマンドがない場合は、別途インストール
        * `sudo apt install uuid-runtime`
        * `sudo yum install util-linux`

なお、`curl`で取得したJSONを`jq`につないで、必要な情報だけ選び、配列として変数に格納すると、その後の処理に便利です。

例えば温湿度計の状態を取得する場合、

```bash
result=($(
    curl -s "https://api.switch-bot.com/v1.1/devices/<device_id>/status" \
      --header "Authorization: ${token}" \
      --header "sign: ${sign}" \
      --header "t: ${t}" \
      --header "nonce: ${nonce}" \
      --header "Content-Type: application/json; charset=utf8" \
    | jq ".body.humidity, .body.temperature"
))
```

とすると、`${result[0]}`に湿度が、`${result[1]}`に温度が入ります。

以上です。
栽培ロボットをブロックプログラミングでコントロール


# 基本構成

左が水タンク、右に4つのプランターがあります。

栽培ロボットには給水ポンプ、排水ポンプ、バルブ1〜4があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/acffec97-1a0d-836c-322c-2d267177f2a3.png)



バルブ1をON→給水ポンプON  でプランター1に給水。

そのままだとあふれるので、センサ連動か、タイマーで給水ポンプを止める必要があります。



給排水の1単位。センサとパイプを手動で位置を決めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/eadfdf6c-47f6-aaeb-dd05-7454b7ee23a2.png)


バルブ1をON→排水ポンプON でプランター1から排水、水タンクに戻します。



# ワークショップ


プログラムワークショップをやってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/9eb8bc82-066e-cd81-015f-87a5551360d2.png)

プログラム例です。
まず、ブザーを鳴らしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/355897b2-7a13-85a4-dc33-33b18ef271b5.png)

次に、ブザーを鳴らしたり止めたりするプログラムです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/fb941301-2f58-75ee-1d74-df150bd73398.png)

ブザーをバルブとポンプに変えて、給排水してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/b891f49c-d3bd-98c3-f35e-660d1d81b7ec.png)


センサ連動の例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/3eda7f88-b06a-4c75-69cf-dd36215f84f0.png)


# 設定する

必要なもの

- Arduino 開発環境
- ESP32開発環境
- ドライバインストール
- 栽培ロボット版 ArduBlock

## Arduino 開発環境


動作確認は Ver.1系で行っています。

2023/09/18 現在の最新のVer.1系は、Arduino IDE 1.8.19 となります。

## ESP32開発環境


## ドライバインストール

使用している ESP32 DevKit の USB シリアルドライバをインストールします。

USBシリアルチップは CP210x または CH341 となります。

OS標準ドライバーで動作しない場合は、以下からドライバーをダウンロードし、インストールします。

CP210X
https://jp.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tab=downloads

CH341
https://www.wch-ic.com/downloads/CH341SER_ZIP.html

Ubuntu22.04 の場合は、ドライバはOSに入ってますが設定が必要となります。以下を参照して設定してください。
「USBシリアルモジュールを Ubuntu22.04 で使用する」
https://qiita.com/nanbuwks/items/dd251aab3a8047a47a50


## 栽培ロボット版 ArduBlock

ardublock-all.jar をこちらからダウンロードします。

https://gitlab.com/akbrobot/ardublock_akbone/-/blob/main/target/ardublock-all.jar

Arduinoのスケッチなどを保存するディレクトリ( Ubuntuでは ~/Arduino/ ) に、
`./tools/ArduBlockTool/tool`
というフォルダを作ります。
そのフォルダに

ardublock-all.jar をコピーします。

Arduino IDE から、「ツール」-「ArduBlock」で起動します。



# CUI で制御するには?

IO割当が以下のようになります。

||||
|:---:|:---:|:---:|
|バルブ1|GPIO27|High で 開(デフォルト閉)|
|バルブ2|GPIO14|High で 開(デフォルト開!!)|
|バルブ3|GPIO13|High で 開(デフォルト閉)|
|バルブ4|GPIO21|High で 開(デフォルト閉)|
|ポンプ1(給水ポンプ)|GPIO25|High で給水(デフォルト停止)|
|ポンプ2(排水ポンプ)|GPIO26|High で排水(デフォルト停止)
|リレー1|GPIO12|High で J20-Pin1Pin2間に12V(デフォルトインアクティブ)|
|リレー2|GPIO13|High で J20-Pin3Pin4間に12V(デフォルトインアクティブ)|
|水位センサ1|GPIO34|水検出でLow(デフォルトHigh)|
|水位センサ2|GPIO35|水検出でLow(デフォルトHigh)|
|水位センサ3|GPIO32|水検出でLow(デフォルトHigh)|
|水位センサ4|GPIO15|水検出でLow(デフォルトHigh)|
|ブザー|GPIO2|High で鳴動(デフォルトLow)
|GROVE1|GPIO22|NeoPixel用|
|GROVE2|VN|センサ入力用|
|スイッチ入力・サーミスタ入力|VP|(サーミスタ未接続時)LowでSWプッシュ(デフォルトHigh)|
|スイッチ入力・サーミスタ入力|VP|(サーミスタ接続時)サーミスタアナログ分圧入力(R1とぶんあt)|
Vueの勉強⑥

本日もVueの勉強をメモしていきたいと思います。
component(コンポーネント)
基本的な HTML 要素を拡張して再利用可能なコードのカプセル化を助けます
基本的な機能の一つらしく使い回しに使うそう。
なかなか便利な機能です。

props(プロップス)
子コンポーネントに親コンポーネントの影響や読み込みを行う

emit(エミット)
子コンポーネントから親コンポーネントに影響や読み込みを行う

プロップスとエミットは対象的な働きがある。

slot(スロット)
タグの中にセレクトタグを入れる
セレクトタグの中にデータを入れていたら、出力先に何もない時に表示されるようになる機能があるらしい。
```
 :style="{ :  }"><slot>No Title</slot>
```

今参考にさせてもらっているサイトの紹介がここまでですのでとりあえず基本はできたのかなと思います。
まだまだ覚えるべき事はありますが、そこはおいおいと言う事で実践としてWEBアプリを作っていきたいと思います。

また更新があればメモを増やしていきます。
Chrome Extensionとポップアップ表示

今回は、Google Chrome Extensionの画面表示について実装してみたので、内容を掲載したと思います。
ブロックチェーンのウォレットの動作に興味があり、以前からMetaMaskや各種ウォレットなどを使用していました。
多くのWebページでは、メイン画面のボタンをクリックするとGoogle Chrome Extensionウォレットの画面がポップアップ表示されるという挙動をしていました。
今回は、そのような挙動をするポップアップ画面の実装方法について紹介したいと思います。

## やること
* メイン画面を実装します。このメイン画面にGoogle Chrome Extensionの画面表示するボタンを設置します。
* Google Chrome Extension画面の実装をします。
* Google Chrome Extension画面ポップアップは、ブラウザの右上に表示します。
* HTMLおよびJavaScriptでの実装をします。UI関連のフレームワークは使用しません。

## ソースコード
今回、実装しましたソースコードをこちらに公開していますので、なにかの参考にしていただければ幸いです。

https://github.com/qiita-mobileapps/ChromeExtensionSimplePopup

## 必要なツールとライブラリ
* Google Chrome
* Microsoft Visual Studio Code
* Live Server。Visual Studio コード拡張機能用のライブ サーバー

## 実行方法
* https://github.com/qiita-mobileapps/ChromeExtensionSimplePopupを任意のフォルダにcloneします。
```Dos
> cd <Your dir>
> git clone https://github.com/qiita-mobileapps/ChromeExtensionSimplePopup.git
> cd ChromeExtensionSimplePopup
```
* Visual Studio Code を起動し、Live Server を実行して、ブラウザーでindex.htmlを開きます。
* Google Chrome を起動し、「extension」ディレクトリを Chrome 拡張機能として追加します。
* Index.html内の「拡張機能ポップアップを開く」ボタンをクリックすると、ポップアップ画面が表示されます。

### Live Serverのインストールについて
1. メニューから「拡張機能」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/c82e604a-24a8-b6a2-61fa-875817c5e20d.png)

2. 「LiveServer」を検索してインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/d39e799c-c158-50e7-2b6a-59e21ed68d79.png)

3. 画面下部の「Go Live」をクリックするとWebサーバーが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/eff89b07-9ceb-a09a-0152-3ea878ef375a.png)

### Chrome拡張機能への簡易ポップアップアプリのインストールについて
1. Google Chromeを起動します。
2. Chrome のアドレス バーに「chrome://extensions/」と入力し、Enter キーを押します。これにより、3. Chrome 拡張機能ページが開きます。
4. 通常は右上隅にある「開発者モード」トグル スイッチがオンになっていることを確認します。これにより、解凍された拡張機能をロードできるようになります。
5. 「Load unpacked」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/d8649425-8687-e304-732b-145220fd4031.png)

6. 表示されるファイルダイアログで、Chrome 拡張機能ファイルを含む「extension」ディレクトリに移動して選択します。ここで、「extension」ディレクトリ（https://github.com/qiita-mobileapps/ChromeExtensionSimplePopup/tree/main/extension）を選択します。
7. 「開く」または「フォルダーを選択」ボタンをクリックして拡張機能を Chrome に追加します。

## 動作結果（ポップアップ画像）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/280e80a3-636d-97ea-7b3e-1ab3f2585451.png)

[アニメーション](https://github.com/qiita-mobileapps/ChromeExtensionSimplePopup/blob/main/git_image/LJC-mobileapps.gif)で確認する場合はこちらを参照ください。

## 次回は
今回は、Google Chrome Extensionのポップアップ画面の実装と表示機能を実装してみました。
今後は、Google Chrome Extensionを使用した認証機能を実装していきたいと思います。Hyperledger Fabricのゲートウェイとして使用できるようなウォレットを作成したいと思います。
Vimの基本

# はじめに
エンジニアなら使えるようになりたい**Vim**について初学者向けにまとめてみました。

## モード
vimには4つのモードがあります。
| モード | コマンド | 機能 |
|:-:|:-:|:-:|
|ノーマルモード|`esc`|移動、貼付、削除|
|入力モード|`i`,`a`|テキスト編集、追加|
|ビジュアルモード|`v`|範囲選択|
|コマンドモード|`:`|変更の保存、終了|

## 保存、終了
| コマンド | 機能 |
|:-:|:-:|
|:w|上書き保存|
|:w ファイル名|名前をつけて保存|
|:q|編集終了|
|:q!|保存しないで編集終了|
|:wp|保存して編集終了|

## 移動
| コマンド | 動き |
|:-:|:-:|
|j|下に移動|
|k|上に移動|
|l|右に移動|
|h|左に移動|
|gg|ファイルの一番上に移動|
|G|ファイルの一番下に移動|
|0|行の先頭に移動|
|$|行の末尾に移動|

## 削除
| コマンド | 動き |
|:-:|:-:|
|x|一文字削除|
|dd|一行削除|
|dw|単語削除|
|数値 dd|数値に応じた分の行を削除|

## コピー&ペースト
| コマンド | 動き |
|:-:|:-:|
|y|選択した範囲のコピー|
|yy|一行コピー|
|p(小文字)|現在いる行の下にペースト|
|P(大文字)|現在いる行にペースト|
|数値yy|数値に応じてコピー| 

## 戻す
| コマンド | 動き|
|:-:|:-:|
|u|変更前に戻る|
|ctrl+r|変更前に戻した箇所をもう一度戻す|

## 終わりに
今回は、vimのコマンドのほんの一部をまとめてみました。
他にもたくさんコマンドがあるので、興味のある方は調べてみてください。

## 参照
[知識0からはじめるVim講座](https://qiita.com/JpnLavender/items/fabcc79b4ab0d52e1f6d)