OmniAICreator/Qiita-1.07M huggingface dataset:
JCLdicを使ってpythonで企業名抽出器をつくる

# TL;DR
Japanese Company Lexiconを使って形態素解析(MeCab)ベースの企業名抽出器をpythonで作ります。
環境は以下を想定しています。

```
macOS Catalina
Homebrew 2.7.1
python 3.9
```

# 事前準備
## JCLdicのダウンロード
https://github.com/chakki-works/Japanese-Company-Lexicon

READMEからJCL_mediumのMeCab Dicをダウンロードして解凍してください。
`jcl_medium_mecab.dic` が必要なファイルです。

## MeCabインストール
mecab入ってない場合はインストールしてください。
今回はbrewでinstallします。
辞書にmecab-ipadicを使います。

```
brew install mecab
brew install mecab-ipadic
```

## MeCabのuserdict設定
MeCabのuserdict設定のためdicファイルを置くために、任意の場所にディレクトリ作成します。
今回は`/usr/local/lib/mecab/dic/user_dict`に作成しました。
解凍したmecab dict　`jcl_medium_mecab.dic`　を作成したディレクトリ配下に移動します。

```
mkdir /usr/local/lib/mecab/dic/user_dict
mv jcl_slim_mecab.dic /usr/local/lib/mecab/dic/user_dict
```

## mecabrcの変更
userdictを準備したら、mecabの辞書情報を変更するためにMeCabの設定ファイルであるmecabrcを登録します。
mecabrcは、install方法によって場所が変わるかもしれませんが、brewでinstallした場合`/usr/local/etc/mecabrc`にあります。

`;` でコメントになっている`;userdic = <file path>` を↑でおいたファイルのパスに変更します。

```
userdic = /usr/local/lib/mecab/dic/user_dict/jcl_slim_mecab.dic
```

## 動作確認
まずはconsoleで辞書が反映されているか確認しましょう。

```
>>> echo "ビザスクで働いています。" | mecab
ビザスク	名詞,固有名詞,組織,*,*,*,株式会社ビザスク,*,*
で	助詞,格助詞,一般,*,*,*,で,デ,デ
働い	動詞,自立,*,*,五段・カ行イ音便,連用タ接続,働く,ハタライ,ハタライ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
い	動詞,非自立,*,*,一段,連用形,いる,イ,イ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。	記号,句点,*,*,*,*,。,。,。
EOS
```

ビザスクが`名詞,固有名詞,組織,*,*,*,株式会社ビザスク,*,*`と表示してされているのでOKです。

# python
次にpythonでMeCabを使う準備をします。

## library install
まずpython用のライブラリをinstallします。

```
pip install mecab-python3
```

これで準備は完了です。

## code
以下のcodeで企業名を抽出します。

```
import unicodedata
import MeCab

# MeCabの設定
tagger =  MeCab.Tagger('-r /usr/local/etc/mecabrc')

def extract_company(text):
    # textのnormalize
    text = unicodedata.normalize('NFKC', text) 
    node = tagger.parseToNode(text)
    result = []
    while node:
　　　　　# node feature: 品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
        features = node.feature.split(',')
        if features[2] == '組織':
            result.append(
                (node.surface, features[6])
            )
        node = node.next
    return result
```

ポイントは２つです。

１つ目は、MeCab.Taggerの引数に参照するmecabrcを-rオプションで指定しすることです。
2つ目は、テキストをparseする前に正規化することです。
JCLdicは辞書サイズと検索速度とのトレードオフの結果、全角を使わず半角のみ使っているようなのでパースするテキストを半角に正規化しておく必要があります。

JCLdicでは、原型に株式会社ビザスクのような正式名称が入っているので原型を抽出することで、企業の正式名称を抽出することができます。

# 出力
```
texts = [
    "ビザスクでエンジニアとして働いています。",
    "三菱UFJモルガンスタンレー証券とガーディアンアドバイザーズでの経歴",
    "キャノン株式会社で経営監理を5年経験しました。",
]

for text in texts:
    companies = extract_company(text)
    print("text: ", text)
    for company in companies:
        print("キーワード: {},  正式名称: {}".format(company[0], company[1]))
```

```
text:  ビザスクでエンジニアとして働いています。
キーワード: ビザスク,  正式名称: 株式会社ビザスク
キーワード: エンジニア,  正式名称: 株式会社エンジニア

text:  三菱UFJモルガンスタンレー証券とガーディアンアドバイザーズでの経歴
キーワード: 三菱UFJモルガンスタンレー証券,  正式名称: 三菱UFJモルガン・スタンレー証券株式会社
キーワード: ガーディアンアドバイザーズ,  正式名称: ガーディアン・アドバイザーズ株式会社

text:  キャノン株式会社で経営監理を5年経験しました。
キーワード: キャノン株式会社,  正式名称: キヤノン株式会社
キーワード: 経営監理,  正式名称: 有限会社経営監理
```

日本の会社名が多く収録されている辞書なので、一般名詞の会社名がでてくるため用途によっては使いにくいかもしれません。
その際は、抽出したくないキーワードをstopwordとして扱い、`node.surface`がstopwordだった場合スキップする処理を入れるなどの工夫が必要です。
【水文学・灌漑排水・土壌物理】学生がつまづきやすい用語まとめ

#移転のお知らせ
こちらの記事は下記のサイトに移転しました。

>[NNテックブログ](https://nnhiroba.xsrv.jp/nnTechBlog/Article/Article?ID=50)
コマンドプロンプト　強制的にディレクトリーごとファイルコピー

目的：
テスト用のファイル等ほぼ同じファイル構成で複数用意しなくてはいけない時に便利

サンプル：
・ディレクトリーごと
xcopy /ye copyTarget renameCopyFolder¥

・ファイルのみ
copy /y copyTargetFile copyDirectly¥
※copyDirectlyは予め作成しておくこと(mkdir copyDirectly)

解説：
xcopy /ye [コピー元ディレクトリ] [コピー先ディレクトリ]¥ 　

補足：
xcopy　：ファイルやフォルダをコピーする時に使う（ファイルのみの場合はcopy）
/y     :同名ファイルが存在する場合上書き確認を行わない
/e     :ファイルが存在しなくてもディレクトリーごとコピー
最後の¥ :これが無いとコピー先がファイルかディレクトリーか聞かれて面倒くさい
【AWS】Amazon WorkSpaces 立ち上げから費用まで

## 立ち上げ方
こちらのリンクが参考になりました。
・[初心者でも簡単! はじめてのAmazon WorkSpaces ~ Quick Setupでの立ち上げ編~](https://recipe.kc-cloud.jp/archives/9307)
## よくある質問
[よくある質問](https://aws.amazon.com/jp/workspaces/faqs/)
[あれ？WorkSpaces作成時のメールがユーザに届かないぞ？って思った時に確認すること](https://dev.classmethod.jp/articles/workspaces_users_did_not_receive_invitation_email/)

私はメールが届かなくて困っていたのですが、そもそも[WorkSpaces]がPENDDING状態だとメールが来ません。
[ディレクトリ]がACTIVE状態になったら起動しているのだと誤認していました。ややこしい・・・
ちなみに私はWorkSpaces起動完了後のメールが迷惑メールフォルダに入ってました。。。

## 料金
[Amazon WorkSpaces の料金](https://aws.amazon.com/jp/workspaces/pricing/)
🩰yawacom - 🐭どんな値がデータベースに入るのか

2021/01/27現在編集中

# どんな値がデータベースに入るのか
アプリ内でどんな値が必要なのか，その値はどんな状態であるべきなのかをmiroに書き出しました．
![スクリーンショット 2021-01-27 14.57.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149433/fdcb562c-6bba-e0b6-7b1f-fde2c834c0ae.png)

テーブルは

* ユーザ情報の格納：userテーブル
* やわらかさの格納：yawarakasaテーブル
* アクセストークンの格納：access tokenテーブル

の3つを用意します．
access tokenはログイン状態の保持のために作成しています．

# 準備
まずログインしてからデータベースを作ります．

```
$ mysql -uroot    # rootでログイン
```

```sql
mysql> create database yawarakasa;
```

これでyawarakasaという名前のデータベースが作られました．
確認してみましょう．

```sql
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| yawarakasa         |
+--------------------+
```

どのデータベースを使うのかを指定します．

```sql
mysql> use yawarakasa
```

# テーブル作成
テーブルをMySQLで作って行きます．
まずユーザテーブルです．

```sql:create_table.sql
use yawarakasa;

create table user(
  # auto_incrementは連番を自動で入れてくれるやつ
  # primary keyにはすでにユニーク制約が入っとる
  id int(255) not null primary key auto_increment,
  user_name varchar(255) not null,
  password varchar(255) not null,
  sex char(1) not null,
  unique(user_name)
);
```

次はやわらかさテーブルです．このファイルに追記で書いていきます．

```sql:create_table.sql
create table yawarakasa(
  # yawarakasaとしてのプライマリーキーもあるとべんり
  # primary keyは１行目に書かないとシンタックスエラー
  id int(255) not null primary key auto_increment,
  user_id int(255) not null references user(id),
  yawarakasa int(255) not null,
  year int(4) not null,
  month int(2) not null,
  day int(2) not null
);
```

最後にアクセストークンテーブルです．これもファイルに追記で買いていきます．

```sql:create_table.sql
create table access_token(
  user_id int(255) not null references user(id),
  access_token varchar(255) not null,
  # 古いアクセストークンでアクセスできなくするために最新トークン以外消すとかするといいかも？
  # デフォルトで現在時刻入れとく
  created_at datetime default current_timestamp not null
);
```

以上のSQLをファイル実行してテーブルを作成します．ファイル名は`create_table.sql`にしました．
下記コマンドを行うことでファイルのSQL文を実行できます．

```sql
mysql> source create_table.sql
もしくは
mysql> \. create_table.sql
```

作られたかどうかを確認します．

```sql
mysql> show tables;
+----------------------+
| Tables_in_yawarakasa |
+----------------------+
| access_token         |
| user                 |
| yawarakasa           |
+----------------------+
```

テーブルが3つ作成されました！🎉
【rails】font-awesomeでformにアイコンを使った時のメモ

下の画像の<font color="red">『ファイルを選択』をカメラアイコンに</font>した時のメモです！
補足などありましたらお願いします_:(´ཀ`」 ∠):

![form基礎画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711992/4e0d639d-ab4a-5df7-0168-ea576a987275.png)

##font-awesome(フォントオーサム)を使う！
【font-awesomeへの初回認識】
1.awesomeをずっとアウェサムと読んでいたww(意外と多い？多くない？)
2.初回railsで検索したのでRuby On Rails用だと考えていた。

検索した際にrailsで検索したのでrails専用の物だと勘違いしていましたが、違いますよね？（多分）

aplication.scssに以下の項目を記載しようとしたら間違えてactiontext.scssに記述しましたが動きました。

```ruby:actiontext.scss
 $fa-font-path: '@fortawesome/fontawesome-free/webfonts';
@import '@fortawesome/fontawesome-free/scss/fontawesome';
@import '@fortawesome/fontawesome-free/scss/solid';
@import '@fortawesome/fontawesome-free/scss/regular';
@import '@fortawesome/fontawesome-free/scss/brands';
@import '@fortawesome/fontawesome-free/scss/v4-shims';
```

動くんだろうけどこうした方が良いとかありましたら教えていただけると幸いです。
以下も記載します。

```ruby:javascript>packs>application.js
import '@font-awesome/fontawesome-free/js/all';
```

##font-awesomeのサイトで無料登録をする！
タイトル通り無料登録します！
無料でもかなりのアイコンが使えるのはありがたいですね(*´∇｀*)

1.登録が完了したらログインします。
2.『How to Use』の場所にある『Add Your Kit's Code to a Project』を確認！
3.『Copy Kit Code!』でコピーして貼り付けます！

```ruby:application.html.erb
<script src="https://kit.fontawesome.com/2f8d319b58.js" crossorigin="anonymous"></script>
```
これで準備完了です(o^^o)

##アイコンを使おう！
それではアイコンを書いていきます!
![camera.icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/711992/6cfde652-833c-cc3d-564f-a04ea7ba7bad.png)

ちょっと見にくいかもですが、コードは画像の真上にあります。

```ruby
<i class="fas fa-camera"></i>
```

この記述でアイコンが設置できます。
あとはcssで見た目を整えるととりあえず完成です。

ですが、このアイコンをクリックすると動くようにしたいですよね？

##formオブジェクトのfile_fieldにアイコンを付けたい！

ここからが個人的にどうするんだろうとずっと頭を悩ませましたww

最終的には以下のようになりました(*´∇｀*)

```ruby
 <%= f.label :image, class:"form-image-label" do %>
   <i class="fas fa-camera"></i>
     <%= f.file_field :image, class:"message-hidden" %>
 <% end %>
```

1.<%= f.label〜do%>でブロックを作成。
2.その中にアイコンのhtmlとfile_fieldを書いてあげたら完成！！

labelの使い方、ブロックの使い方をよくわかっていなかったので長々と苦戦しましたが上手く動いてくれて良かったです！！

内容的に理解不足、雑などあると思いますがメモ帳代わりなのでもし見た方は許してください。
よく使うコマンドプロンプト　コマンド一覧

type:ファイルの内容を表示する
テキストファイルなどの内容を画面表示する。ワイルドカードの使用もできる。

コマンド例
type text1.txt	text1.txtの内容を表示する
type *.txt	すべてのテキストファイル（拡張子：txt）を表示する

ファイル作成
コマンド例
type null > text1.txt ファイル作成

cd（chdir）：ディレクトリの移動、カレントディレクトリの表示
現在のカレンディレクトリ（作業フォルダ）を表示することができるコマンドです。
「cdパス」を入力すれば、カレンディレクトリを変更することもできます。

dir：ファイル、ディレクトリの一覧表示
カレンディレクトリのファイルやフォルダを一覧で表示できるコマンドです。
「dirパス」を入力すれば、指定したパスのファイルのみを表示することができます。

tree：ディレクトリ構造のツリー形式表示
指定したディレクトリをツリーで表示するコマンドです。
「treeパス」を入力すれば指定したディレクトリの情報のみが表示されます。

ren：ファイル名の変更
ファイル名を変更するコマンドです。
「ren 対象ファイル名 新しいファイル名」と入力することで変更ができます。

move：ファイルやディレクトリの移動、名称変更
ファイルを移動する際、もしくはディレクトリ名を変更する際に使用するコマンドです。
「move 移動するファイル名 移動先パス」もしくは「move 変更前ディレクトリ 変更後ディレクトリ」と入力します。

copy：ファイルのコピー
ファイルをコピーする際に使用するコマンドです。
「copy コピー元 コピー先」と入力します。

del：ファイルの削除
ファイルやフォルダを削除するコマンドです。
「del ファイル名」と入力すると、そのファイルが削除されます。

help：コマンドのヘルプ表示
コマンドの使い方を確認することができる便利なコマンドです。
「help コマンド名」と入力すると、そのコマンドの意味や使い方が表示されます。

cls：コンソールのクリア
画面を消去するコマンドです。入力すると、コマンドプロンプトの画面に表示されていた内容を全て消すことができます。

md（mkdir）：ディレクトリの作成
新しいディレクトリを作成できるコマンドです。パス付きで入力すればそのパスに、ディレクトリ名だけを入力すればカレントディレクトに作成することができます。

rd（rmdir）：ディレクトリの削除
ディレクトリを削除するコマンドです。パス付きで入力すればそのパスの、ディレクトリ名だけを入力すればカレントディレクトリの指定ディレクトリを削除することができます。

type：テキストファイルの中身表示
指定したファイルの内容を表示するコマンドです。パス付きで入力すればファイルを指定することができます。

more：テキストの内容を1画面ごとに表示
指定したファイルの内容を少しずつ表示するコマンドです。エンターキーを押すごとに1画面ずつ表示されます。

ipconfig/all：ネットワークの設定確認
コンピュータのIPアドレスやネットワークの設定を確認できるコマンドです。

exit：コマンドプロンプトを終了する
VSCode で def や if 等のスニペットが出なくなったら (Python)


VSCode で Python 拡張機能 (Microsoft) を有効にしている場合、def や if, for, try などの文でスニペットによる入力補完(サジェスト)が効くのですが、この機能が 2021年1月21日のバージョンで削除されました。

公式ページ (github) のリリースノートには、「コードスニペットは削除したので、もし必要なら自分で追加してね」という旨の記述があります。

> 1. Remove code snippets (you can copy the old snippets and use them as your own snippets).  
― [Releases · microsoft/vscode-python](https://github.com/microsoft/vscode-python/releases)


# スニペットの追加方法

Python 拡張で提供されていたスニペットをユーザースニペットとして追加すると、入力補完機能を復元できます。
手順は次の通りです。

1. コマンドパレット (`Ctrl+Shift+P`) に `snippet` と入力し、「基本設定: ユーザースニペットの構成」を選択。
2. `python` と入力し、"python.json" を選択。
3. エディタで "python.json" が開かれるので、下記 URL のスニペットをコピペする等して追加する。  
― [vscode-python/python.json at 2020.12.424452561 · microsoft/vscode-python](https://github.com/microsoft/vscode-python/blob/2020.12.424452561/snippets/python.json)


# スニペットを修正

お好みで、あまり使わないコードスニペットをコメントアウトすると、より快適になります。
また、一部のスニペットは Python 3 では若干使いにくいので、これらに少し手を加えます。

## def の修正と追加

"def(class method)" という名前のスニペットは Python の `@classmethod` ではなく、[Python 公式](https://docs.python.org/ja/3/reference/datamodel.html#the-standard-type-hierarchy)の表現に従えばインスタンスメソッドにあたります。
そこで、これらを解りやすいように名前変更し、`@classmethod` の def を追加します。

元の "def(class method)" と "def(static class method)" の部分を次のように書き換えます。

```json
    "def(instance method)": {
        "prefix": "def(instance method)",
        "body": ["def ${1:funcname}(self, ${2:parameter_list}):", "\t\"\"\"", "\t${3:docstring}", "\t\"\"\"", "\t${4:pass}"],
        "description": "a instance method"
    },
    "def(class method)": {
        "prefix": "def(class method)",
        "body": ["@classmethod", "def ${1:funcname}(cls, ${2:parameter_list}):", "\t\"\"\"", "\t${3:docstring}", "\t\"\"\"", "\t${4:pass}"],
        "description": "a class method"
    },
    "def(static method)": {
        "prefix": "def(static method)",
        "body": ["@staticmethod", "def ${1:funcname}(${2:parameter_list}):", "\t\"\"\"", "\t${3:docstring}", "\t\"\"\"", "\t${4:pass}"],
        "description": "a static method"
    },
```

## class の修正

class は object を明示的に継承しなくても定義できる為、object を消去します。
下記の例では継承も考慮して () は残してありますが、こちらも削除したほうが使いやすいかもしれません。

```json
    "class": {
        "prefix": "class",
        "body": ["class ${1:classname}(${2:}):", "\t\"\"\"", "\t${3:docstring}", "\t\"\"\"", "\t${4:pass}"],
        "description": "a class definition"
    },
```

<small>※ この記事は自身のブログに[掲載](https://itpc.blog.fc2.com/blog-entry-229.html)したものと同じ内容です。</small>
Ubuntu20.04 MySQL5へ接続できない

Ubuntu20.04 MySQL5へ接続できない

```
mysql-client-core-8.0 
```

だと接続できない。。。
削除して、

```bash
sudo apt remove mysql-client-core-8.0
sudo apt autoremove
```

mariadbで！

```bash
sudo apt install mariadb-client-core-10.3
sudo apt-get install libmariadb-dev
```
Pythonで学ぶアルゴリズム　第22弾：並べ替え（ソート方法の比較）

# #Pythonで学ぶアルゴリズム< ソート方法の比較 >

##はじめに
基本的なアルゴリズムをPythonで実装し，アルゴリズムの理解を深める．
その第22弾として今まで学んできたソートアルゴリズムの処理能力の比較および安定ソートを扱う．

##ソートアルゴリズムの比較
#####計算量での比較
表1に示すのは，各ソート方法におけるオーダー記法での処理速度である．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/0037cf99-2e6d-f1cc-bd77-fff969162370.png)


大前提として，**「すべてにおいて最適」というような処理は存在しない**．それぞれの処理に特徴がある．
例えば，表1において，下段３つのソート方法は同じ平均計算時間となっているが，ヒープソートは並列化できないことなどが理由で，あまり使われていない．マージソートは並列処理は可能だが，大量のデータをソートする際には大容量のメモリが必要となる．

利用する際には，**個々の処理の違いを理解し，比べられる判断力が求められる**．


#####実データでの比較
表2では，大きな実データ(10,000~30,000)を使って，各ソート方法の処理時間を比較している．ただし，表2における値は参考文献の著者の手元にあった環境での結果である．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/5a948cdd-4649-3c2b-8d36-81cb25ea261f.png)
Pythonで標準で用意されているsortは，内部でC言語のプログラムが動いているため，大幅に高速な処理が実現できている．
表2から得られる大事なことは，**「たとえオーダー記法が同じであっても，処理時間は同じにはならない」**ということである．オーダー記法を学んだ一番初めに戻ると，確かに定数倍を省略してきていたことを思い出せる．オーダー記法において違いがあれば，定数倍の影響は小さく無視できるというものであったが，同じオーダー記法であるならば，その定数倍というのも大きな影響を持ち得ることは容易に理解できる．ゆえに，例えばバブルソートが選択・挿入ソートよりもかなり遅くなるということが起きている．


##安定ソート
ソート方法を比較するときに知っておきたいキーワードらしい．．．
**安定ソート**: 同じ値をもつデータにおけるソート前の順序がソート後も保持されていること

例えば，名前の五十音順で並べられた学生のテスト結果を，点数で並べ替える場面を考える．
そのイメージ図を次に示す．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/3b1705d0-de99-a15e-e5c3-4bf358f4f374.png)
点数の高い順に並べ替えられている．上図において赤で囲んだ部分に着目すると，同じ点数である．しかし，出席番号を見ると，小さいものが上になっている．つまり，「ごうだ」と「ほねかわ」の並びの前後関係はソート前と同じである．
これが安定ソートの定義が意味していることである．
なお，今まで触れてきたソート方法の中では，**「挿入ソート」「バブルソート」「マージソート」**が該当する．

##感想
「オーダー記法が同じでも処理時間は異なる」
今まで，当たり前のようにオーダー記法において定数を省略してきていたため，忘れかけていた．ここで改めて思い出せてよかった．また，安定ソートは聞いたことなかったが，理解できた．次回は並べ替えアルゴリズムシリーズの最後の「ビンソート」である．

##参考文献
Pythonで始めるアルゴリズム入門　伝統的なアルゴリズムで学ぶ定石と計算量
　　　　　　　　　　　　　　　　　　　　　　　　 増井 敏克　著　　翔泳社
DOMContentLoadedについて

<h1>※ただのメモです</h1>


javascriptとかで使われる「DOMContentLoaded」と言うイベントは、最初の HTML 文書の読み込みと解析が完了したとき、スタイルシート、画像、サブフレームの読み込みが完了するのを待たずに発生するやつ

つまり画面をロードされる前に実行されるイベントになる。
以下の記述はHTML文書の読み込みと解析が完了したとき「123」の数値をコンソールに出力する簡単なコード


```javascript
document.addEventListener('DOMContentLoaded',function (){
  console.log(123);
});
```

<br></br>
<br></br>
<br></br>

これと似たやつが「load」になる。以下コード

```javascript
window.addEventListener('load',function (){
  console.log(123);
});
```


参考記事

https://developer.mozilla.org/ja/docs/Web/API/Window/DOMContentLoaded_event
日本語マークダウン案

日本語入力に適したマークダウンを考える。

思いついたことをメモしていくが、完成までの道のりは遠い。


## 目標

- 書きやすい
- 読みやすい
- 覚えやすい
- 解析しやすい

## ブロック要素

```
＃見出し1

＃＃見出し2

＃＃＃見出し3


１順序リスト
２順序リスト
３順序リスト

・順不同リスト
・順不同リスト

・複合リスト
  １複合リスト
  ２複合リスト
・複合リスト

｜＃テーブルヘッダ｜＃テーブルヘッダ｜
｜テーブルセル｜テーブルセル｜


＞引用です

‘‘‘
整形済みテキスト
‘‘‘

🖼http://example.jp/sample.jpg width:300 height:200


；コメント  HTMLには反映しない

上記以外はパラグラフ。
改行も反映される

```

ブロック要素は空行が来たら終了とする。
トップレベルはブロック要素のみ。


## インライン要素

考え中...

```
＃リンク

【サイト名：http://example.com/】
【http://example.com/】
【Wikiリンク】

＃文字装飾

「装飾したい文字：太い」

```
Androidアプリが対応しているディープリングを簡単に確認できる方法

# 事柄の背景
ネット上でディープリングについて調べてみたら、実装方法とディープリングについての解説の記事が圧倒的に多く、端末にインストール済みのアプリがどのディープリングに対応しているかを調べる方法の記事がほぼ皆無で、あってもその調べ方が難しすぎて、汎用性が乏しいです。

そのため、Androidアプリが対応しているディープリングを簡単に確認できる方法の記事を書こうと思います。

# 確認方法

確認方法は非常に簡単です。まず、端末の

[設定] -> [アプリ] -> 調べたいアプリ

を開きます。そこに[既定で開く]項目が表示されます。

<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/f7ec1241-9036-2852-9275-bfe236a6b996.png">

[既定で開く]項目を選ぶと、アプリリンクという項目が表示されます。

<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/d386bef3-d9aa-dab7-3888-2497201bc2a7.png">

そこで対応リンクを開くと、そのアプリが対応しているディープリンク一覧が表示されます。

<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/b20d9035-8dad-2a93-9014-0a4d32caecbc.png">

# この調べ方についての考察

### メリット
- 時短、手軽、すぐ調べられる
- 外部アプリやソフトウェアが不要
- Android知識やAdb知識が不要
- プログラミング力が不要

### デメリット
- ディープリンクのスキーマがわからない。ホストしか取得できない

### 利用場面
<b>ディープリンクの競合を避ける場面</b>
自社サービスがアプリのディープリンク機能を提供するときに、そのディープリンクがほかのアプリで開かれてしまう可能性があるかどうかの調査に、役に立つと思います。
cakephp3 命名規則

#cakephp3 命名規則
[規約リンク](https://book.cakephp.org/3/ja/intro/conventions.html)

###データベース
命名は**複数形**にする
データベースのテーブルの名前（単語単数か複数形か）によって以下で記述のコントローラー、ビュー、モデルの命名も変わる。

####例）テーブル名(その場合のコントローラー名）
**単数：tests(TestsController.php)**
**複数：test_ones(TestOnesController.php)**
**複数：test_two_threes(TestTwoThrees.php)**

上記の規約の為、テーブル名を作成するときは単数もしくは複数単語使用する場合「_」で繋げる必要がある。

####コントローラー
コントローラーのクラス名は**複数形**で**パスカルケース**で、**最後にControllerが付く**
```TestsController.php```（複数形）

####アクションのURL
TestsControllerのviewアクションの場合
**tests/view**
UsersControllerのindexアクションの場合
**users/index**

####ビュー
テーブル名複数形の名称のフォルダをTemplateフォルダの直下に作成し、その中にコントローラーで記述したアクションに必要なテンプレートファイルを作成していく。
アクション全てに対しテンプレートファイルが必要ではなく、描画する必要のあるアクションに対して作成する。
```Template/Tests/view.ctp```
```Template/Tests/index.ctp```
など
**ビューのテンプレートファイルは**、それを表示するコントローラーの関数に合わせた、 **アンダースコア記法**で命名されるのでコントローラー側の関数名が
viewAll()のように複数単語のキャメルケースであれば
```view_all.ctp```となる。


####モデル
**テーブル**
```TestsTable.php```（複数形）

**エンティティー**
```Test.php```(単数形）


##まとめ

各部分を CakePHP の規約に合わせて命名しておくことで、混乱を招く面倒な設定をしなくても 機能的に動作するようになる。以下が最後の規約に合った命名の例

データベースのテーブル: **"articles"**

Table クラス: ArticlesTable の場所は **src/Model/Table/ArticlesTable.php**

Entity クラス: Article の場所は **src/Model/Entity/Article.php**

Controller クラス: ArticlesController は **src/Controller/ArticlesController.php**

ビューテンプレートの場所は **src/Template/Articles/index.ctp**

これらの規約により、CakePHP は、 example.com/articles へのリクエストを、 ArticlesController の index() 関数にマップする。
裏でTensorflow2が動いているKerasで学習したモデルをプロトコルバッファ形式(.pb)で保存する方法

# はじめに
現在主流のDeep Learningフレームワークとしては

- Tensorflow2
- PyTorch
- Keras
- etc...

といろいろありますが、作成した学習済みモデルの保存形式は以下表のとおりフレームワークごとに異なります。

|  フレームワーク  |  保存形式  | 備考 |
| ---- | ---- | ---- |
|  Tensorflow2  |  .pb  | tf2onnxを使うことでonnx形式も可能っぽい |
|  PyTorch  | .pt, .onnx  | - |
|  Keras  | .h5  | keras2onnxを使うことでonnx形式も可能 |

私個人としては以下の悩みがあり、

- 個人的にKerasに慣れているのでKerasで学習したいけど、保存形式は.pbにしたい。
- .pbで保存する方法をネットで検索しても出てくる方法はTensorflowがver1の時の方法なので使えない。

上で挙げた私の悩みを皆さんもお持ちのようなので、現状私の環境で成功したコードを置いておきます。
ただ、残念なことに私自身Tensorflowに詳しくないため、質問をしていただいてもたぶん適切な回答は出来ないと思います...

# 環境

このエントリを書いている私の環境は以下です。

- OS : Windows10 Pro x64 20H2
- CPU : Intel
- Python3 : 3.7.9
  - Keras : 2.4.3
  - tendorflow : 2.3.0
  - tensorflow-gpu : 2.3.0

# コード

``` Python
import tensorflow as tf
from tensorflow import keras
from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2
    
#path of the directory where you want to save your model
frozen_out_path = ''

# Convert Keras model to ConcreteFunction
full_model = tf.function(lambda x: model(x))
full_model = full_model.get_concrete_function(
	tf.TensorSpec(model.inputs[0].shape, model.inputs[0].dtype))
# Get frozen ConcreteFunction
frozen_func = convert_variables_to_constants_v2(full_model)
frozen_func.graph.as_graph_def()
layers = [op.name for op in frozen_func.graph.get_operations()]

# Save frozen graph to disk
tf.io.write_graph(graph_or_graph_def=frozen_func.graph,
					logdir=frozen_out_path,
					name="mnist.pb",
					as_text=False)
# Save its text representation
tf.io.write_graph(graph_or_graph_def=frozen_func.graph,
					logdir=frozen_out_path,
					name="mnist.pbtxt",
					as_text=True)
```

# おわりに
私が.pbで保存したい理由は 学習済みモデルをOpenVINOで使いたかったからです。
そちらはもうそろそろ記事にしますので、この記事と一緒に見ていただけると嬉しいです。

誤字、脱字、認識間違いなどあればご指摘をお願い致します。
【備忘】kubectlインストール

```bash
sudo apt update && sudo apt install -y apt-transport-https gnupg2
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubectl
echo 'source <(kubectl completion bash)' >>~/.bashrc
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -F __start_kubectl k' >>~/.bashrc
source ~/.bashrc
```

# 参考
* https://kubernetes.io/docs/tasks/tools/install-kubectl/
C++のreturn文で複数の戻り値を得る方法 【なんちゃって編】

## 概要 
* iOSアプリ開発で使用されるSwiftは戻り値が複数指定できるなんて聞いたことが無いでしょうか？
* C++はできないとか言われていますね。
* でも、自前でなんちゃってで作れるんですよ。
* 今回はそれについて記事にします。

## 方法
準備
    1. 自前のStructure(構造体)を作る。
    2. 構造体のメンバ変数は、戻り値で必要なものにする。

簡単です。これだけです。
あとは、メソッドの戻り値を自前の構造体にするだけ。
こんな簡素な説明じゃわからないよって方に、サンプルソースを記載します。

## サンプル
```
// 1. 自前のStructure(構造体)を作る。
typedef struct myresult {
    // 2. 構造体のメンバ変数は、戻り値で必要なものにする。
	std::wstring sString;    // 文字列
	int          iValue;     // 整数
	double       dValue      // 小数点
} MyResult;
```

後は、適当に自分が使うメソッドの戻り値にこの構造体を設定するだけです。

```
class MyClass
{
public:
	MyClass();
	~MyClass();
	MyResult　MyMethod();
}

// ★戻り値の型が自前の構造体だよ。
MyResult MyClass::MyMethod()
{
	// 何か処理をする
	auto result = XXXXXXXX();
	if(0 == result){
		return {  L"成功したよ～", 0, 0.0 };
	}else{
		return {  L"残念でした", -1, 9.9 };
	}
}

// Main関数
void main()
{
	auto myclass = new MyClass();
	auto myresult = myclass->MyMethod()
	// これでなんちゃって複数戻り値を作れる。
	printf("%s\n", myresult.sString().c_str());
	printf("%d\n", myresult.iValue);
	printf("%f\n", myresult.dValue);
	delete myclass;
}
```
JavaScript復習④

<a href="https://qiita.com/SOH_engineer/items/aceb041f976ed30d65b0">JavaScript復習③</a>からの続きです。

<h1>コンストラクタのオーバーライド</h1>

```JavaScript:JavaScriptファイル
class 子クラス extends 親クラス {
  constructor() {
    super() //1行目にsuper()の記述が必要
　　// 子クラスのコンストラクタの処理
  }
}
```

<h1>export</h1>

```JavaScript:JavaScriptファイル
class Animal {
  .
  .
}
export default Animal; //Animalクラスを他のファイルでも使用できるようにする設定
```

<h1>import</h1>
```JavaScript:JavaScriptファイル
import Animal from "./[Animalクラスを定義したコードを記述しているファイル名](.jsは省略できる)"
//　↑先頭に記述する
```

<h1>値のエクスポート</h1>

```JavaScript:sample1.js
const text = "Hello World";
export default text;
```

```JavaScript:sample2.js
const text from "./sample1";
console.log(text);
```

```:コンソール
Hello World
```

<h1>デフォルトエクスポート</h1>
デフォルトエクスポートは1ファイル1つの値のみ使える。そのファイルがインポートされると自動的に、
「export default 値」の値がインポートされる。
→エクスポート時の値の名前と、インポート時の値の名前に違いがあっても問題ない

<h1>名前付きエクスポート</h1>

```JavaScript:dogData.js
const dog1 = new Dog("タロウ", 20, "柴犬");
export {dog1};
```

```JavaScript:script.js
import {dog1} from "./dogData";
dog1.info();
```

名前付きエクスポートはデフォルトエクスポートと異なり、
複数の定数やクラスを指定してエクスポートすることができる

```JavaScript:dogData.js
const dog1 = new Dog("タロウ", 20, "柴犬");
const dog2 = new Dog("ハナコ", 8, "ブルドッグ");
export {dog1, dog2};
```

```JavaScript:script.js
import {dog1, dog2} from "./dogData";
```

<h1>相対パス</h1>

<h4>同じディレクトリのファイル指定</h4>

```JavaScript:JavaScriptファイル
import {dog1, dog2} from "./dogData";
```

<h4>異なるディレクトリのファイル指定</h4>

```JavaScript:JavaScriptファイル
import {dog1, dog2} from "./data/dogData";
// ./dataで同じディレクトリ内のdataディレクトリに移動、 /dogDataでdogData.jsを指定
```

<h4>一つ上の階層に戻る</h4>

```JavaScript:JavaScriptファイル
import Dog from "../class/dog";
// ..で一つ上の階層に移動、 /classでclassディレクトリに移動、 /dogでdog.jsを指定
```

<h1>パッケージのimport</h1>

```JavaScript:JavaScriptファイル
import 定数名 from "パッケージ名";
```

<h4>chalkパッケージの使い方</h4>

```JavaScript:JavaScriptファイル
import chalk from "chalk";
console.log(chalk.yellow("Hello World"));
console.log(chalk.bgCyan("Hello World")); //文字列を囲むことができる
```

<h4>readline-syncの使い方</h4>

```JavaScript:JavaScriptファイル
import readlineSync from "readline-sync";
readlineSync.question("名前を入力してください:");
```

```:コンソール
名前を入力してください:

// 質問文が出力されると、一旦処理が止まり、
// コンソールに値が入力されると次の処理に進む
```

<h5>続きは<a href="https://qiita.com/SOH_engineer/items/400b092b7ad0af144850">JavaScript復習⑤</a>へ</h5>
JavaScript復習③

<a href="https://qiita.com/SOH_engineer/items/e6c71a2ef16f8bc1b25a">JavaScript復習②</a>からの続きです。

<h1>様々な戻り値</h1>

```JavaScript:JavaScriptファイル

const check = (number)=> {
  return number % 2 === 0;
};
console.log(check(6));
console.log(check(7));
```

```:コンソール
true
false
```

<h1>オブジェクトと関数</h1>

```JavaScript:JavaScriptファイル
const user = {
  name: "たろう"
  greet: ()=> {
    console.log("こんにちは！");
  }
};
user.greet(); //関数の呼び出し
```

```:コンソール
こんにちは！
```

<h1>インスタンス</h1>

```JavaScript:JavaScriptファイル
class Animal {
}
const animal = new Animal();
console.log(animal);
```

```:コンソール
Animal{ } //空のオブジェクト
```

<h1>コンストラクタ</h1>

```JavaScript:JavaScriptファイル
class Animal {
  constructor() {
    console.log("こんにちは！");
  }
}
const animal1 = new Animal();
const animal2 = new Animal();
```

```:コンソール
こんにちは！
こんにちは！
```

<h1>インスタンスとプロパティ</h1>

```JavaScript:JavaScriptファイル
class Animal {
  constructor() {
    this.name = "タロウ";
  }
}
const animal = new Animal();
console.log(animal.name);
```

```:コンソール
タロウ
```

<h1>コンストラクタの引数</h1>

```JavaScript:JavaScriptファイル
class Animal {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}
const.animal = new Animal("タロウ", 20);
```

<h1>メソッド</h1>

```JavaScript:JavaScriptファイル
class Animal {]
  constructor(name, age) {
       .
       .
  }
  info() {
    console.log(`名前は${this.name}です`);
  }
}
const animal = new Animal("タロウ", 20);
animal.info();
```

```:コンソール
名前はタロウです
```

<h1>メソッド内でメソッドを使う</h1>

```JavaScript:JavaScriptファイル
class Animal {
  greet() {
    console.log("こんにちは");
  }
  info() {
    this.greet();  //同じクラスのメソッドを実行
        .
        .
  }
}
```

<h1>継承</h1>

```JavaScript:JavaScriptファイル
// Animalクラスを継承
class Dog extends Animal {
}
```

<h1>メソッドの戻り値</h1>

```JavaScript:JavaScriptファイル
class Dog extends Animal {
  getHumanAge() {
    return this.age * 7;
  }
}
const dog = new Dog("タロウ", 20);
const humanAge = dog.getHumanAge();
console.log(humanAge);
```

```:コンソール
140
```

<h1>子クラスのメソッド</h1>
子クラスで定義した独自のメソッドは親クラスから呼び出すことはできない

<h1>オーバーライド</h1>
親クラスと同じ名前のメソッドを子クラスに定義すると、子クラスのメソッドが優先して使用される。
(子クラスのメソッドが親クラスのメソッドを上書きしている)
→オーバーライドという

<h5>続きは<a href="https://qiita.com/SOH_engineer/items/b109f16e31aff13bab51">JavaScript復習④</a>へ</h5>
JavaScript復習②

<a href="https://qiita.com/SOH_engineer/items/fcbed94b03b796920238">JavaScript復習①</a>からの続きです。

<h1>配列とfor文、length</h1>

```JavaScript:JavaScriptファイル
const fruits = ["apple", "banana", "orange"];
for (let i = 0; i < 3 ; i ++) {
  console.log(fruits[i]);
}
```

```:コンソール
apple
banana
orange
```

```JavaScript:JavaScriptファイル
const fruits = ["apple", "banana", "orange"];
console.log(fruits.length);

for (let i = 0; i < fruits.length ; i ++) {
  console.log(fruits[i]);
}
```

```:コンソール
3

apple
banana
orange
// 一つ上のファイルの条件式の箇所を i < 3 から i < fruits.length に変更してもコンソールの出力は同じである。
```

<h1>オブジェクト</h1>

```JavaScript:JavaScriptファイル
//　オブジェクト
{プロパティ1: 値1, プロパティ2: 値2}
{name: "チョコ", price: 150}
//上の例だとname がプロパティで、"チョコ"が値

const item = {name: "チョコ", price: 150};
console.log(item);
console.log(item.name);
```

```:コンソール
{name: "チョコ", price: 150}
チョコ
```

<h4>オブジェクトの値の更新</h4>

```JavaScript:JavaScriptファイル

const item = {name: "チョコ", price: 150};
item.price = 1,000;
console.log(item.price);
```

```:コンソール
1,000
```

<h1>オブジェクトを要素に持つ配列</h1>

```JavaScript:JavaScriptファイル

const items = [
  {name: "チョコ", price: 150},
  {name: "ビスケット", price: 300}
];
console.log(items[1]);
console.log(items[1].price);
// 配列の中のオブジェクトのインデックス番号はそれぞれ、
// {name: "チョコ", price: 150}が0、{name: "ビスケット", price: 300}が1である。
```

```:コンソール
{name: "ビスケット", price: 300}
300
```

<h1>undefined</h1>
配列の存在しないインデックス番号の要素やオブジェクトの存在しないプロパティの要素を取得しようとすると、
undefinedと出力される

<h1>複雑なオブジェクトを扱う</h1>

```JavaScript:JavaScriptファイル

const character = {
  name: "たろう",
  age: 20,
  favorite: {
    food: "すし",
    sports: "野球",
    color: "赤色"
  }
};

console.log(character.favorite);
console.log(character.favorite.food);
```

```:コンソール
{food: "すし", sports: "野球", color: "赤色"}
すし
```

<h1>関数の定義</h1>

```JavaScript:JavaScriptファイル
const 定義名 = function() {
  // まとめたい処理
};
```

```JavaScript:JavaScriptファイル
const introduce = function() {
  console.log("こんにちは");
  console.log("私はたろうです");
};
introduce(); //関数の呼び出し
```

```:コンソール
こんにちは
私はたろうです
```

<h1>アロー関数</h1>

```JavaScript:JavaScriptファイル
const introduce = ()=> {
  console.log("こんにちは");
  console.log("私はたろうです");
};
introduce(); //関数の呼び出し
```

```:コンソール
こんにちは
私はたろうです
```

<h1>関数内で引数を使用する</h1>

```JavaScript:JavaScriptファイル

const introduce = (name)=> {
  console.log("こんにちは");
  console.log(`私は${name}です`);
};
introduce("たろう"); //関数の呼び出し
introduce("はなこ"); //関数の呼び出し
```

```:コンソール
こんにちは
私はたろうです
こんにちは
私ははなこです
```

<h1>関数 引数のデフォルト値を設定する</h1>

```JavaScript:JavaScriptファイル
// 引数のデフォルト値を設定することができる
function showAd(message = 'Ad'){
  console.log('----------');
  console.log(`---${message}---`);
  console.log('----------');
}
.
.
.
```

<h1>複数の引数を受け取る関数の呼び出し</h1>

```JavaScript:JavaScriptファイル

const introduce = (name, age)=> {
  console.log(`私は${name}です`);
  console.log(`私は${age}歳です`);
};
introduce("たろう", 20);
```

```:コンソール
私はたろうです
私は20歳です
```

<h1>戻り値</h1>

```JavaScript:JavaScriptファイル

const add = (a,b)=> {
  return a + b;
};
const sum = add(1,3); //関数呼び出し部分
console.log(sum); 
```

```:コンソール
4
```

<h5>続きは<a href="https://qiita.com/SOH_engineer/items/aceb041f976ed30d65b0">JavaScript復習③</a>へ</h5>
How SaaS Can Be a Game Changer for Small Businesses

Introduction to Cloud Computing and Business

The term Cloud often refers to a centralized location on the Internet, which is used for storing data, making it accessible anytime and anywhere from a connected device. Small businesses have been embracing the benefits that Cloud computing offers. The number of benefits that Cloud computing offers to small businesses is endless. Cloud computing can help businesses to save on time and money by offering enhanced productivity, improved collaboration, and promoted innovations.

Businesses have been using Cloud computing to access the information anywhere using any compatible device. Instead of storing information on computers, Cloud computing offers the storage of data over the Internet. Cloud computing makes the information available from a central web-based hub giving the proper credentials to anyone who has an active Internet connection. Cloud computing works by syncing the data from all the devices that are connected to the Cloud, thus, keeping them updated with real-time information.

The Cloud environment enables users to access all kinds of files, use office-based applications and even collaborate remotely while working on the same project. The data present on the Cloud is always updated and available whenever and wherever needed.

Benefits of SaaS for Small Business

    The low initial costs of the SaaS applications can be attractive for small businesses and there is no large outflow of the capital for setting up an application on the computer systems that are used by these small companies. SaaS applications are usually based on pay per user basis and the additional costs are charged when the businesses use extra resources such as- storage and bandwidth usage. Thus, the businesses end up paying only for the actual use by the employees.

    SaaS applications can be used on any device which can be connected to the Internet and there is no dependency on the storage devices present on each device. There is a low learning curve involved where the employees are already working on the Internet.

    The updates and patches of the SaaS applications are carried out by the SaaS provider and these are done on an almost daily basis. These updates are made available to all users at all times. Thus, there is no downtime of the systems that are frequently associated with such upgrades.

    Most of the SaaS applications can be easily integrated into any existing software being used by the businesses. It is easy to expand the capabilities for catering any increased usage within the organization once the minimal hardware has been set up in the company.

Cloud Computing for Small Business

Cloud offers many opportunities for the small businesses segment, providing them the capability for massive information processing tasks for companies of all sizes. The diverse ways in which companies have been using Cloud technology’s potential justifies the versatility that the technology offers to this business segment.

For more information visit us at: https://www.esds.co.in/blog/how-saas-can-be-a-game-changer-for-small-businesses/
[GitHub] １人で２つアカウントを持っている状態,　remote: Permission to ~ [Error]

#前提
GitHubアカウントを２つ持っており、
アカウント１（前アカウント）からアカウント２（現アカウント）に切り替えて作業しているという状況です。
#エラー概要
% git push origin feature/ブランチ名
ローカルブランチをGitHubに公開しようとしたら、下記エラーが発生しました。

```:ターミナル
remote: Permission to アカウント2/リポジトリ名.git denied to アカウント1.
fatal: unable to access 'https://github.com/アカウント2/リポジトリ名.git/': The requested URL returned error: 403
```

訳：
アカウント１ に アカウント２/リポジトリ名.git への許可が拒否されました。
fatal: 'https://github.com/アカウント２/リポジトリ名.git/' にアクセスできません。要求された URL はエラーを返しました。403



#解決した方法
結論： Collaboratorsとしてアカウント１のユーザーを追加すればOKです。
　　　 Collaboratorsにはpush権限が付与されます。

方法：下記記事を参考してください。
<a href="https://reasonable-code.com/github-collaborators/#:~:text=%E4%BB%A5%E4%B8%8B%E3%80%81%E3%81%9D%E3%81%AE%E6%89%8B%E9%A0%86%E3%81%A7%E3%81%99%E3%80%82,%E6%8B%9B%E5%BE%85%E3%81%99%E3%82%8C%E3%81%B0OK%E3%81%A7%E3%81%99%E3%80%82">GitHubで特定のリポジトリを複数人で共有する方法</a>

#補足説明
**ユーザーアカウントリポジトリのアクセス許可レベル**
ユーザーアカウントが所有するリポジトリには、リポジトリの所有者と共同編集者の2つの権限レベルがあります。

ユーザーアカウントが所有するリポジトリには、1人の所有者がいます。所有権のアクセス許可を別のユーザーアカウントと共有することはできません。

個人リポジトリの共同作業者は、リポジトリのコンテンツをプル（読み取り）し、変更をリポジトリにプッシュ（書き込み）できます。

**ざっくり推測**
GitHubアカウントにはアクセス権限、「ここまでならしていいよ」という範囲がユーザーの立場ごとに決まっていて、その範囲を広げたことで解決したというのが一連の流れの概要。

つまり
今回だったらアカウント２へのアクセス許可を持っている人はアカウント１になっていた。
ことになるので、「権限の変更」が正しい解決方法かもしれません。
詳しい方がいらっしゃいましたら、ご指摘いただけますと幸いです。

参照：<a href="https://docs.github.com/en/github/setting-up-and-managing-your-github-user-account/permission-levels-for-a-user-account-repository">GitHub Docs</a>
結合テストで画像を添付する

#### 参考にした記事
+ [Rails RSpec による画像添付結合テスト](https://qiita.com/masaway-t10801606/items/ba87c8a01f09c2574647)

## 結合テストで画像を添付する方法

オリジナルアプリの新規投稿の結合テストコードを実装しようとしたときに添付のやり方がわからなかったので調べました。

```ruby:books_spec.rb
 image_path = Rails.root.join('public/images/test.png')
 attach_file('book[image]',image_path, make_visible: true)

```

image_pathという変数にテスト用の画像を添付します。相対パスで指定をするみたいです。
attach_fileメソッドはアップロードのinput要素にテスト用画像を添付することができます。
第1引数：アップロードするinput
要素のname属性の値
第２引数：アップロードする画像のパス
第３引数：オプション（make_visible: trueで一時的に表示）

## 添付したテスト用画像が表示されているかの確認方法

添付した画像が表示されているかの確認方法です。

```ruby:books_spec.rb
 expect(page).to have_selector("img[src$='test.png']")

```

have_selectorで要素があるか判断をします。


あとは必要な他のコードを記述して問題なく実行できたのでOKでした。
ほぼ参考にさせていただいた記事の記述でいけました。
Nodeで、SJISで、かつ、行ごとに列数が変動するcsvを読み込んでみた

Nodeにて、SJISで、かつ列数が行ごとに変動するcsvを読み込んで使う必要があったため、
試行錯誤して実装できたコードを残しておきます。

いろいろな参考コードがネットにありましたが、
要件そのままのものは見つからず、
結構試行錯誤しました。
どなたかの参考になれば幸いにて。

```js
const csv = require('csv')
const fs = require('fs')
const iconv = require('iconv-lite')

const csvFilePath = './path/to/csv_file.csv'

/**
 * csvデータの取得（SJISのファイル）
 */
const getCsv = async function() {
  return new Promise(resolve => {
    fs.readFile(csvFilePath, function (err, data) {//非同期処理なのでreadFileSyncではなくreadFile
      if (err) throw err
      const buf = Buffer.from(data, 'binary')//new BufferはdeprecatedなのでBuffer.fromを使う
      const ret = iconv.decode(buf, 'Shift_JIS')
      const ret2 = iconv.encode(ret, 'UTF-8')
      csv.parse(ret2, {relax_column_count: true},//列数変動ファイルの読込オプション
        function (err, output) {
          resolve(output)
        })
    })
  })
}

async function main() {
  const data = await getCsv()//非同期読込
  console.log(data)
  console.log(data.length)
}

main()

```

それにしてもNode.jsって便利で面白いですね。

参考：[オプション設定で参考になったページ](https://www.kwbtblog.com/entry/2020/01/20/194415)
[csv parser本家ページ](https://csv.js.org/parse/)
Vimを使ってみる

# Vimを使おうと思った理由
理由は興味がある意外にありません。
効率化とゆう言葉が好きなのでそんなふうに紹介されれば対外興味を持ちます。
# 準備
僕はVScodeを使っているのでそちらにVimを導入しました。
参考にした記事がありますので導入はこちらをみていただければ…。

https://qiita.com/jintz/items/d357478271179c90ffab
# Vimの基本
### モード

Vimには`モード`と呼ばれる概念があります。とりあえず下記の4つがあるということだけ覚えておいてください。

- 通常モード（ノーマルモード）
- 挿入モード
- ビジュアルモード
- コマンドモード

# コマンド表
### ノーマルモード

#### カーソル移動
| コマンド | 説明 |
|:------:|:-----:|
| h |左にカーソル移動 |
|j |下にカーソル移動 |
|k |上にカーソル移動 |
|l|右にカーソル移動|

### 挿入モード

| コマンド | 説明 |
|:------:|:-----:|
|i|カーソルの左から挿入モード |
|a |カーソルの右から挿入モード |
|I |行の先頭から挿入モード |
|A|行の末端から挿入モード|
|ESC|ノーマルモードへ戻る |

#### ビジュアルモード

| コマンド | 説明 |
|:-:|---|
| u | アンドゥ （元に戻す）|
| Ctrl-r | リドゥ（やり直す） |
| x | 一文字削除 |
| dd | 一行削除 |
| yy | 一行コピー |
| p | カーソルの右(下)に貼り付け |
| P | カーソルの左(上)に貼り付け |

#### コマンドモード

| コマンド | 説明 |
|:-:|---|
| :q | ファイルを閉じる |
| :q! | 保存せずに閉じる |
| :w | 上書き |
| :w! | 強制的に上書き |
| :wq | 上書きして閉じる |
| :wq! | 強制的に上書きして閉じる |
#### 便利なコマンド

| コマンド | 説明 |
|:-:|---|
| w | 次の単語の頭へジャンプ |
| e | 次の単語の末尾へジャンプ |
| b | 前の単語の頭へジャンプ |
| ge | 前の単語の末尾へジャンプ |
| W | 記号を無視して次の単語の頭へジャンプ |
| E | 記号を無視して次の単語の末尾へジャンプ |
| B | 記号を無視して前の単語の頭へジャンプ |
| gE | 記号を無視して前の単語の末尾へジャンプ |

| コマンド | 説明 |
|:-:|---|
| f{文字} | 右方向で最初の{文字}にジャンプ |
| t{文字} | 右方向で最初の{文字}の手前にジャンプ |
| F{文字} | 左方向で最初の{文字}にジャンプ |
| T{文字} | 左方向で最初の{文字}の手前にジャンプ |

| コマンド | 説明 |
|:-:|---|
| 0 | 行の先頭へジャンプ |
| ^ | 空白を除く行の先頭へジャンプ |
| $ | 行の末尾へジャンプ |

| コマンド | 説明 |
|:-:|---|
| Ctrl-u | 上に画面半分だけ移動 |
| Ctrl-d | 下に画面半分だけ移動 |
| {数字}G | ｛数字｝行へ移動 |
| gg | ファイルの始端まで移動 |
| G | ファイルの末端まで移動 |

| コマンド | 説明 |
|:-:|---|
| H | 画面に表示されている一番上の行へ移動 |
| M | 画面に表示されている中央の行へ移動 |
| L | 画面に表示されている一番下の行へ移動 |

#### ビジュアルモードの操作

| コマンド | 説明 |
|:-:|---|
| v | ビジュアルモードへ/通常モードへ |
| V | カーソル行を全選択してビジュアルモードへ |
| （ビジュアルモードで）d | 選択範囲を削除して通常モードへ |
| （ビジュアルモードで）c | 選択範囲を削除して挿入モードへ |
| （ビジュアルモードで）y | 選択範囲をコピーして通常モードへ |

#### 便利な編集コマンド

| コマンド | 説明 |
|:-:|---|
| o | カーソルの下に空行を挿入して挿入モードへ |
| O | カーソル行に空行を挿入して挿入モードへ |
| s | カーソルの下の文字を削除して挿入モードへ |
| S | カーソル行を削除して挿入モードへ |
| D | カーソルから右側を削除 |
| C | カーソルから右側を削除して挿入モードへ |
| ci" | カーソルがいる""の中身を削除して挿入モードへ |
| cw | カーソルの下の文字から次の単語の手前まで削除して挿入モードへ |
| r{文字} | カーソルの下の文字を書き換え |

#### 繰り返しコマンド

| コマンド | 説明 |
|:-:|---|
| {数字}{コマンド} | {コマンド}を{数字}回繰り返す |
| . | 直前の編集系操作を繰り返す |
| ; | 直前の検索系操作を繰り返す |

# 参考
https://qiita.com/jintz/items/d357478271179c90ffab
ほぼこちらから抜粋。使いこなしたいコマンドを中心に取り出しました。
bulletml.jsの研究 その4

#概要

bulletml.jsの研究です。
技を調査。

#自機狙い

```
<bulletml>
	<action label="top">
		<repeat>
			<times>222</times>
			<action>
 				<fire>
  				<direction type="sequence">23</direction>
	  			<bullet>
						<action>
 							<wait>20 + $rand * 50</wait>
 							<changeDirection>
  							　　　<direction type="aim">0</direction>
  							　　　<term>10</term>
 							</changeDirection>
						</action>
					</bullet>
 				</fire>
 				<wait>1</wait>
			</action>
		</repeat>
	</action>
</bulletml>
```

#説明

自機の位置を狙ってくる弾です。
弾幕パターンの基本中の基本と言えるでしょう。

大量に出現するザコ敵は、この攻撃を行うのが一般的です。

発射方向を微妙にずらして撃つ場合もあります。
特に、プレイヤーが回避する移動先に撃つなどすると面白いでしょう。

#成果物

https://embed.plnkr.co/plunk/9P8WLf4RAfR2J3bY

以上。
Linux環境にZip, Unzipをインストールする

* WSL (Windows System Linux) にて確認。

## インストール手順
* インストールコマンド

```
$sudo apt-get install zip unzip
```

## 確認方法
* オプション -h でヘルプが表示されればOK！

```
$zip -h
$unzip -h
```

* オプション -v でバージョン確認でもOK！

```
$zip -v
$unzip -v
```
【kintone】人毎、時系列の折れ線グラフを描く

前回は、他人事、時系列の棒グラフをかきました。
前回：[【kintone】人毎、時系列の棒グラフを描く](https://qiita.com/juri_don/items/a3bc69ba90de4af9464d)

今回は、人毎、時系列の折れ線グラフを作成します。
前回のグラフの設定を変えながら、どんなグラフになるのか観察したいと思います。

※↓こんな、折れ線グラフをかく！というのが目標です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/ec60e179-4f4b-c908-b4f6-605f55443f81.png)

結果だけ知りたい方はまとめをどうぞ。

# グラフの種類の変更
前回作成した棒グラフです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/90c8bf6e-2f1b-6a84-ab11-d7a8bf7386b3.png)

グラフの種類のみ「折れ線グラフ」に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/9dada4d5-8475-5310-316f-01fea1c8d4fd.png)

↓すると、確かに折れ線グラフにはなりますが、何だか違います。人毎にはなってるけど、これは時系列でしょうか？？コレジャナイ感があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/30767325-cfe6-2f88-5ff9-a7d2810c28ca.png)

これだと、人がたろう、はなこ、じろうと変化する時の金額の変化がわかるという謎グラフで、
時間の経過による変化が見えにくいです。
棒グラフと折れ線グラフでは、同じデータの集まりでも、グラフを見やすくするための設定が異なるようです。

# 折れ線グラフの設定
棒グラフと折れ線グラフでは設定項目が違う！？
設定をいじってみた様子をダイジェスト？でお送りします。

## 大項目
折れ線グラフで時系列の変化を見たい場合は、「大項目」に日付（日付、時間系）のフィールドを設定するのが良いようです。
大項目に設定しているフィールドを基準とした変化が分かりやすいような折れ線グラフになります。

※大項目に「日付（年）」を設定した場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/f77d25b1-175a-0239-429d-5c13a212670d.png)

※大項目に「名前」を設定した場合は、名前の変化による金額の変化になってしまいます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/3a07bedd-7c0e-e8ff-9443-0393b791e581.png)

大項目には「どのフィールドを値の変化の基準としてグラフを描きたいのか」を設定するようです。
その後に、必要があれば中項目、小項目を設定しましょう。

## 中項目
中項目を設定すると、折れ線が「中項目」で色分けされます。「凡例」が「中項目」になります。
※ソートの設定に、大項目昇順と、中項目の昇順を加えておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/ef382000-657d-147b-7d4a-13c20846169d.png)

中項目までの設定で、人毎、時系列の折れ線グラフができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/4b3b126b-f2aa-e1fa-c950-61e47ad83ec4.png)


他にもグラフの設定項目があるので見ていきましょう。

## 小項目

小項目を設定すると、グラフの横軸が大項目+中項目　となり、凡例が小項目となります。

「日単位」を設定してしまうと、お金を使ってない日もあるので「0円の日」が混ざってしまって。何が何だか分からないグラフになってしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/a279fbe6-97e2-16f5-ba48-8576e49bbc99.png)

## 集計方法

グラフ自体は更にゴチャッとしてしまい、今回のデータではグラフとしての役目を果たさないのですが、
色々とやってみてわかったことがあります。

集計方法を追加して２つ以上にすると、大項目、中項目、小項目がグラフの横軸となり、集計方法が凡例になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/4e652914-914f-fe68-0ec4-1c4e3ecf217e.png)

# まとめ

棒グラフと折れ線グラフでは、見やすくするための設定が異なる。ということが分かりました。

今日のグラフの見やすい設定はこちら↓

| 設定項目 |棒グラフの設定|折れ線グラフの設定 |備考|
|:-:|:-:|:-:|:-:|
| 分類する項目　大項目  |名前| 日付（年）  |棒と折れ線では逆|
| 分類する項目　中項目  |日付（年） |名前  |棒と折れ線では逆|
| 集計方法  | 合計（使ったお金）| 合計（使ったお金）  ||
| ソート1  | 大項目（昇順） | 大項目（昇順）  ||
| ソート2  |中項目（昇順）| 中項目（昇順）  ||

また、

* 集計方法が1つのときは、分類する項目の一番小さい項目が凡例になる
* 集計方法が2つ以上のときは分類する項目が横軸に、集計方法が凡例になる

ということも分かりました。なんだか良いグラフが作れそうな気がします。
というわけで、次回はクロス集計表を作ってみたいと思います。ﾉｼﾉｼﾉｼ
# Unity始めて1週間で最初のゲーム作ったら完全理解した

Unityってこんな概念で作るのか、が分かる程度ですが。

## 作ったもの
こちらからPCのブラウザで遊べます
https://unityroom.com/games/spaceexplorer
![スクリーンショット 2021-01-27 14.03.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/7a0419c8-5f76-e465-e45b-3355b1b4081e.png)


## 基本的にUdemyのコースに沿って学習/作成
学習にはこちらのコースを使っており、同様のゲームを作成しながら学べます。
[Complete C# Unity Game Developer 3D](https://www.udemy.com/course/unitycourse2/learn/lecture/8400846#overview)

## 一本目のゲームを作るのに必要だった要素技術
### Unityエディタ上でのオブジェクトの配置操作
Unityは非常に優れた3Dエディタを有しており、小規模なゲームであればGUI上で3D空間を作れます。
ただ慣れないとどこをどういじっていいのか分からないため、1つゲーム画面を作ってみると感覚が掴めます。

### オブジェクトにスクリプトを付与して動かすという考え方
Unityを触るまでは、多数の3Dオブジェクトがお互い作用する処理をどう書くのか検討もつきませんでした。
が、実際作ってみると非常にシンプルで、

 - オブジェクトを配置する
 - **オブジェクトにスクリプトを付与する**
 - スクリプトに基づいてオブジェクトが振る舞い、オブジェクト同士で相互作用する
 
というだけでした。

どのメソッドがどのタイミングで呼ばれるのか理解すれば、その中に処理を書くだけでその通りに動いてくれます。

### 処理のトリガー
スクリプトの処理を走らせるに当たって、


 - ゲームが始まったら
 - ゴールしたら
 - 衝突したら
 - キー入力があったら

あたりが自分でできるようになると、ゲーム内でおきる一般的な事象に対してスクリプトを動かして処理出来るようになります。

### シーンという構成単位
 - ゲームのトップ画面
 - 複数ステージ
などを作りたくなった場合に、シーンという単位で個々に作る必要があります。
シーン間の遷移の実装方法が分かると、複数画面のゲームでも自在に作れるようになります。

### Unity Asset storeとの仲良くしかた
無料で良い感じのアセットが沢山あります。すごい。
Unity触るまではいっぱい公開されているんだなーくらいにしか思ってアセット等が、自分のゲームにどう使うかを考えながらみることが出来ます。楽しい。

#### その他ゲームの構成要素
 - 音を出す/止める
 - 光を当てる
 - エフェクトを出す

 など、個別に調べてそれ通りにすれば比較的簡単に出来ました。

## 終わりに
とりあえず1本ゲーム作ってみると、Unityのイメージが湧いてとても楽しいです。
MicroPython開発環境（紹介編）

# MicroPythonの動くハード、増加中

MicroPythonが動くハードは、Pyboardにはじまり、Pyboard互換品であるElecrowのCrow Pyboard、STM32(ARM Cortex-M)、ESP8266、ESP32、micro:bitなどなど拡がりつつあります。
**さらに、ここに来て、ラズパイPico登場。一気に注目度が上がると思われます。**
[Raspberry Pi Pico 登場！ RP2040関連リソースまとめ](https://qiita.com/naohiro2g/items/c9f0b0d4485db7e776e3)

# MicroPythonの開発環境の紹介
一応、Macで、ESP32が中心ですが、それほど特殊性はありません。WindowsでラズパイPico、でもほぼ同じ。ラズパイPico対応は急速に進むはず。

まず、やりたいことベースで分解。

1. 有線（USBーシリアル）接続
1. 無線（WiFi / Bluetooth）接続
1. REPLでコード実行（ターミナルアプリ、コマンド）
1. REPLでコード実行（JupyterNotebookのカーネル）
1. エディターでファイル編集
1. ファイル編集時の入力補完、アシスト
1. ファイル実行
1. デバッガー実行
1. ファイルマネジメント（リスト、アップロード／ダウンロード）

まぁ、最低限で考えると、(1)有線でつないで、(3)ターミナルコマンドでREPL実行、(9)ツールでファイルのアップロードがとりあえずできれば。
これは以前、記事に書きました。[MacでESP32のLチカ（MicroPython/ターミナル版）](https://qiita.com/naohiro2g/items/588548c6b1ad8d7545f4)

調べてみると、色々な手法があり、どんどん便利になっています。リモート開発全体が進化しているので、その流れですね。

上述の機能を満たすものとして、こんな材料があります。

- iterm(iterm2) + screenコマンド
 -     有線接続
 -     unixアプリ／コマンド
- VS Code
 -     コード編集、入力補完
 -     Microsoft製、統合開発環境
- pyMakr
 -     有線接続、~~無線接続~~、REPL実行
 -     VS Codeの拡張機能、javascript、nodejs 6.9.5以上が必要。
 -     https://marketplace.visualstudio.com/items?itemName=pycom.Pymakr
 -     https://github.com/pycom/pymakr-vsc

- JupyterNotebookのMicroPythonカーネル jupyter_upydevice_kernel
 -     有線接続、無線接続、REPL実行
 -     Python製
 -     https://github.com/Carglglz/jupyter_upydevice_kernel
- micropy-cli
 -     VS Code用、コード入力補完の環境整備
 -     Python製
 -     https://github.com/BradenM/micropy-cli
- Adafruit ampy
 -     有線接続、ファイルマネジメント
 -     Python製ツール（古い）
 -     https://pypi.org/project/adafruit-ampy/
- rshell
 -     有線接続、ファイルマネジメント
 -     REPL、ファイル編集（外部）
 -     Python製ツール
 -     https://github.com/dhylands/rshell
- uPyFile
 -     有線接続、ファイルマネジメント
 -     Python製ツール（新しい、けどまだ実験中）
 -     https://github.com/AwesomeCronk/uPyFile
- uPydev
 -     無線接続、ファイルマネジメント
 -     Python製ツール
 -     https://github.com/Carglglz/upydev
- Thonny
 -     Pythonビギナー向け統合開発環境
 -     有線接続、ファイルマネジメント、コード編集、入力補完、コード実行
 -     無線接続(webREPLは実験中）
 -     Mac, Linux, Winアプリ、オープンソース
 -     https://thonny.org
- mu-editor
 -     最近、アップデートが遅い。
 -     micro:bitモード、ESP32モードが有る。けど、使い勝手悪し。 

# で、どれがオススメ？？

Thonnyだと、単体で完結します。ラズパイPicoでも正式ツールとして対応済みなので、今後の見込みあり。

ですが、オススメは、VS Code + pyMakr + micropy-cli
（+ jupyter_upydevice_kernelでJupyter Notebook）
（+ ターミナル窓でampy、uPydev、esp-tool.pyなど）

VS CodeがJupyterサーバーを内蔵したのでとても良い感じです。

追って詳細記事を上げます。
Worning:require()、Fatal error:require()の解決方法

Dockerをよく理解できていないために今回のエラーが起きました。
このおかげで少し理解できたので備忘録のため記事にします。

## さてコード書くぞ、アプリ立ち上げるぞと思ったら

![スクリーンショット 2021-01-27 13.23.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/ccd4efd9-be97-cb5c-94bc-906825f23ab0.png)

え...
昨日までできてたのに？
コード何もいじってないのに？
なんで？

と泣きそうでした。

### いや、そういえばGitHubDeskTopで管理したいからリモートリポジトリからローカルにcloneしたな

最初はリモートだけで管理してたんですけど
ブランチとかコメントとかGUIで手軽に操作したいから[このやり方](https://docs.github.com/ja/desktop/contributing-and-collaborating-using-github-desktop/cloning-a-repository-from-github-to-github-desktop)でcloneしたのです。

そうしたらローカルのディレクトリがが2つになってしまったのでcloneした方ではない方を削除したのです。
つまりこのcloneした段階ではエラーにある通りのファイルが存在しないというエラーでした。

## 解決方法

また[こちら](https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4#docker%E7%92%B0%E5%A2%83%E3%81%AE%E5%86%8D%E6%A7%8B%E7%AF%89)の神記事参考にしました。
お世話になりすぎ...

```PHP:ターミナル
docker-compose exec app bash
```

上記コマンドでターミナルに入り

```PHP:コンテナ
composer install
```

コンテナ内で上記コマンドをうちます。

これだけだと`500 | Server Error`となるので

```PHP:コンテナ
cp .env.example .env
```

上記コマンドでenvの環境変数を.env.exampleを元にコピーします。

```PHP:コンテナ
php artisan key:generate
```

上記コマンドでアプリケーションキーを生成します。

```PHP:コンテナ
php artisan migrate
```

最後に上記のコマンドでマイグレーションして成功すれば無事に元に戻りました。
Raspberry pi zero w に node.js をインストール

# はじめに
Raspberry pi zero w に node.js をインストールしたくなった。Raspberry pi zero w をサーバーにし、React.jsでアプリケーションを作ってLAN内の別端末から利用したい、というのがその理由だ。気を遣う部分は、今回の対象が、「Raspberry pi zero である」という点である。RaspberryPi3や4とはCPUが違うのだ。Raspberry pi zero に使われているCPUはArmv6, RaspberryPi3や4はArmv7だそうで・・・。あと、Rasberry pi OS は 32bitOS ですよね。

# 準備
Raspberry pi zero w を Raspberry pi OS lite でセットアップし、まずはインターネットにつながっているLANまでの接続は行った。apt のアップデートができれば、準備オッケーというところではないだろうか。
（この下準備については、[前回記事](https://qiita.com/tomofu74/items/82f367ace7317f0b1ced)等が参考になるはず・・・。ちないに今回の案件は、前回の4GBディスクとは別のSDカードでRaspberry Pi zero をセットアップ。）

# node.js インストール
いつものごとく、諸先輩方の知見を参照する。

　　【Node.js】Raspberry Pi Zeroに最新のNode.jsをインストールする
　　https://www.taneyats.com/entry/install-nodejs-on-raspberrypi-zero

上述先輩の記録資料を真似して、OS,CPUに合うソースファイルを公式から取得することにする。


### ファイルの取得
見てみると、node-v12 以降は、Armv6のファイルが無いようだ・・・（2021年1月時点）。また、node-v11だと、あとでeslint-typescriptライブラリをインストールできない（[create-react-appでReact環境構築について](https://teratail.com/questions/312103)）。そこで、次のとおりファイルを取得する。

```
# まずは任意のディレクトリを作成（取得ソース展開用）
$ mkdir node_src

$ cd node_src
$ wget https://nodejs.org/dist/latest-v10.x/node-v10.23.2-linux-armv6l.tar.gz
$ tar -zxf node-v10.23.2-linux-armv6l.tar.gz
```

### インストール
先達に倣って、/usr/local にディレクトリ丸ごとコピーして使えるようにする。

```
$ cd node-v10.23.2-linux-armv6l
$ rm CHANGELOG.md LICENSE README.md
$ sudo cp -R * /usr/local/
```
### 確認
コマンドのバージョンを確認してみる。

```
$ node -v
v10.23.2
```

npm のバージョンを上げておく。

```
$ sudo npm install -g npm

$ npm -v
6.14.10
```

### 備考
yarn コマンドをインストールする。

```
$ sudo npm install -g yarn
```

# おわりに
 Raspberry pi zero w に node.js をセットアップした。作業時間は１時間くらい。通信量もさほどなく、コンパイル等も不要だったため、コマンドを打って待つ時間もさほどなかった。