OmniAICreator/Qiita-1.07M huggingface dataset:
【Keras】エラー 'str' object has no attribute 'decode'について

2020年11月の中頃あたりから機械学習を行う際にTensorflowバックエンドのKerasを用いると掲題のエラーが発生するようになった。備忘録も兼ねて以下に記していく。

<img width="600" alt="gazou.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/e6781861-1c88-491e-1806-65aff1cf0ec1.png">


## 発生箇所
どうやら推論時に学習モデルをロードする際に当該のエラーが発生している。
モデルは`.h5`形式をロードしている。

KerasやTensorflowはインストール時にライブラリのバージョンを指定してインストールしているので
特に問題ないはずと考え、他の依存性のありそうなライブラリを調査した。
ちなみにKeras・Tensorflowは以下のバージョンを使用している際にエラーが発生している。

* Keras:2.3.1
* Tensorflow:1.14

上記が最新ではないため発生していることも考えられるが、今回は上記バージョンでの利用を前提とし、エラー解消に臨む。

## 対処
案の定モデルをロードする際に利用するライブラリのバージョンが問題だった。
`h5py`というライブラリの`最新バージョン3.1.0`がインストールされており、それが利用されることでエラーが発生している。
Googlecolabなどで標準に使用されているのは現状では`2.10.0`である。

h5pyはKerasのインストール時に付随して最新版がインストールされてしまうため、Kerasより先にh5pyだけバージョン指定してインストールするか、h5pyをアンインストール後バージョンを指定して再インストールすればよい。


## インストール

コマンドでのインストール
(以下ではpip3を用いているが環境によってコマンドは変更する)

~~~
# まずはバージョン確認
pip3 show h5py

# アンインストール
sudo pip3 uninstall h5py

# バージョン指定インストール
sudo pip3 install h5py==2.10.0
~~~

新規にインストールするのみの場合はKerasやTensorflowのインストールより先にh5pyを個別にバージョン指定してインストールしてやるのが良いだろう。

## 記事紹介
以下にて実機ロボットを使った機械学習を行っています。よろしければご参照ください。

[LEGO Mindstorms×AI　機械学習その1　環境構築編](https://qiita.com/Hiroki-Fujimoto/items/6ce278411ca151fee750)
[LEGO Mindstorms×AI　機械学習その2　線形回帰編](https://qiita.com/Hiroki-Fujimoto/items/6dae8c407e56a38625cf)
[LEGO Mindstorms×AI　機械学習その3　分類編](https://qiita.com/Hiroki-Fujimoto/items/f4ff6e68455152c54bc4)
アナログ回路 その21

# 概要

circuit sandboxをplunkerでホスティングした。
アナログ回路をシュミレーションで、説明してみる。

# オペアンプ・減算回路

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d5537d7b-2564-de1f-4105-0fd2c0fcf1ca.jpeg)


# 結果

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/de3c29a8-6e01-08d7-8d14-7584a5bbeaa6.jpeg)


# 説明

２V－１Vで１Vが出力です。

# 成果物

https://embed.plnkr.co/plunk/JCKzJp8cdLO6KCm1


以上。
マークダウンの書き方

 Qiitaに投稿しようとした際にいきなりマークダウンを使うことになって困惑したので忘備録兼みなさまの助けになればと。
この記事で使ったものはすぐ下にコードを書いていこうと思います。  

```markdown
◯◯ ←空白2回で改行 こんな感じで使ったものを逐一説明したいです。
```

まあマークダウンの使い方だけでいえば、投稿するページのすぐ横にリンクあるんですけれども...
ここでは実際の記事にするとこんな感じです的な紹介と思って頂ければ。

## **見出しについて**



記事を書くうえで見出しは必要だと思います。見出しの使い方は` # `を使えばそのまま見出しになり、#の数が増えれるほど文字が小さくなります。基本的に、文章を書いているときの見出しは` ## `のナンバーサイン×2で書くことになると思います。  

```markdown
ちなみに # のハイライトは
`文字`でできます
```

個人的には、  

```markdown
**文字**
```

を使って見出しを太字にするのが綺麗だと思います

### マークダウンの注意点

マークダウンを書くうえでルールがいくつかありまして（まぁ守らなくても問題ないのだけれど）、例えば改行を2回以上してはいけないとか、見出しを使うときは前後に空白を開けないとか、ルールというか美学やマナーに近いものだと思います。
>詳しくはこの方の記事を参照ください
<https://qiita.com/antk/items/e11cac45f9da343e7bf0>  

```markdown
>で参照
<で囲むとリンク>
```

## コードの挿入について

コードの挿入は  

\`\`\`ruby
puts 'hello world'
\`\`\`

と ``` で囲んで頂ければできます。

## **まとめ**

いかがでしたでしょうか？
今回使用頻度が高いと思うものをご紹介させていただきました。おそらくここら辺を押さえていれば、記事を書くうえでは困らないと思います。
私自身まだ勉強中のため Qiita を使ってアウトプットしながら成長していきたいと思います。
ご指摘ありましたら、ぜひお願いします。
>参考文献
<https://qiita.com/antk/items/e11cac45f9da343e7bf0>
<https://qiita.com/Qiita/items/c686397e4a0f4f11683d>
<https://qiita.com/kamorits/items/6f342da395ad57468ae3>
ROSについてまとめてみる #5

この記事は、[ROSについてまとめてみる #4](https://qiita.com/hatt_takumi/items/8deec6c8abda602fcc78)の続きです。
＊重複している部分もありますが、ひとまずこのまま公開します。
＊この記事の記載内容はROS1に関するものです。

#コミュニティレベル
コミュニティレベルとは、ネット上でのROSに関する知識やソースコードなど、情報を共有するための枠組みです。
以下の要素からなります。

 - ディストリビューション
 - リポジトリ
 - wiki
  - バグチケット
 - メーリングリスト

##ディストリビューション
有用なツールとライブラリを有する、コアとなるROSシステムは定期的にROSディストリビューションとしてリリースされています。
ディストリビューションはLinuxにもある概念で、ROSではパッケージの配布形態を指します。
主なUbuntuのバージョンと、対応するROSのディストリビューションは以下です。

| Ubuntu          |ROS            |
|:----------------|--------------:|
| 12.04 LTS       | Groovy        |
| 14.04 LTS       | Indigo        |
| 16.04 LTS       | Kinetic       |
| 18.04 LTS       | Melodic       |
| 20.04 LTS       | Noetic        |

http://wiki.ros.org/Distributions
私の肌感ですが、Hydroぐらいまでは、今でも時々耳にするかなぁと思います。
wikiなどの文献を読んでいると突如単語として出てくるので、一通り見ておくほうが良いです。
indigoあたりから、やっと日本語書籍などが登場して、日本でも少しづつ普及してきた印象です。

##リポジトリ
ROSのパッケージが置かれている場所。
通常はGitHubを用います。
https://kazuyamashi.github.io/ros_lecture/ros_packrelease.html

##Wiki
ROSの情報が文書化されて置かれているところ。
アカウント作成が自由で、ドキュメントやパッケージのアップデートなどを行う。

http://wiki.ros.org/ja

##デバッグチケット
ROSのソフトウェアに問題を見つけた場合、または機能をリクエストしたい場合は、チケットを提出して開発チームに連絡することができます。
http://wiki.ros.org/Tickets

##メーリングリスト
質問、雑談、不具合報告、新機能のリクエストなど、何でも話せるメーリングリスト。
こちらから登録できます(英語)
http://lists.ros.org/mailman/listinfo/ros-users




\#6へつづく
#参考
ROS
http://wiki.ros.org/

プログラミングROS(O'Reilly Japan)
https://www.oreilly.co.jp/books/9784873118093/

ROSプログラミング(森北出版株式会社)
https://www.morikita.co.jp/books/book/3010
自分用メモ　AWS概要


流行りのAWSに関わる事になるとは・・・。
まず概念理解が難しい。

相変わらず自分用メモ

###■概要について
[小ネタ] Athena のテーブル, データカタログなどの概念がわからなかったのでまとめた
https://dev.classmethod.jp/articles/athena-table-datacatalog-etc-summary/

AWS Glueの概要を図と用語で整理する
https://qiita.com/sot528/items/1c56bb95ac3060772634


###■パフォーマンチューニング
公式によるヒント 10項目
https://aws.amazon.com/jp/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/

１．データをバケット化
   　→S3の機能の１つ。
　　　　格納先そのものをオブジェクトとして認識できる。

２．データを分割（Hiveでのパーティショニング）
　　　パーティション作成の際、(Key=Value)を設定し、 Where句で利用することにより、
　　　限定したデータ走査が可能となる。
　　　逆をいえばパーティションとして指定したカラムをWhere句で利用しない場合、
　　　パーティションを切ってようが、テーブルとして読み込む際に全ファイルを走査となる。

　 　→バケットの特性を生かし、正規表現マッチングによる
　　　　カラムの指定とrow_nuber関数使いましょうというお話。

####３．圧縮を使用する
   データを圧縮するとクエリを大幅に高速化できる。
   データサイズが小さいほど、S3からAthenaへのトラフィックが減少。
   
   | アルゴリズム　　| 分割可能 |　圧縮比　 |　圧縮+解凍速度
   +-------------------+-----------+-----------+--------------
   | Gzip（DEFLATE）| 番号　　 | 高い　　　 | 　中
   | bzip2　　　　　| 可能　　　| とても高い | スロー
   | LZO　　　　　　| 番号　　　| 低　　　　| 速い
   |スナッピー　　　| 番号　　　| 低　　 　　| とても早い


####4.ファイルサイズの最適化
　データの読み取りを並列化できる場合、クエリはより効率的に実行される。
　ただし、実行エンジンの起動(準備)時間が長い為、ファイルが小さすぎる場合（通常、128 MB未満）効率が落ちる。
　
　ex.)テキスト形式で保存された7GBのデータを１つのファイルで格納した場合、5000個のファイルで格納した場合の比較データ
　
　| クエリ	　　　　　　|ファイル数　   　　 |　実行時間
  +--------------------------+-------------------+------------
　| SELECT count（*）～　|　5000ファイル　|	8.4秒
　| SELECT count（*）～　   |　1ファイル　　  |	2.31秒

####5.列指向データストアの生成を最適化する
  Parquet＝列指向データストア。ブロックサイズ＝最大行数で分割可能。

  列データとして見ると、はデータ型が異なっている事が多い為、列ごとの圧縮、エンコーディングが異なる。
  しかし、列での分割により圧縮、エンコーディングの処理速度を上げることが可能。
 
※検証記事によると、実際にはCSVファイルの方が早いケースが多いという結果
（データ数75004739レコード）

Amazon Athena: カラムナフォーマット『Parquet』でクエリを試してみた 
https://dev.classmethod.jp/articles/amazon-athena-using-parquet/

　 Parquet の利点：データスキャンの大幅削減
　　　　　　　　　　データ転送量の抑制
　　　　　　　　　　コスト削減


###■Glue　ブックマーク機能について
読込み完了しているデータは処理スキップし、追加データのみ処理実施する機能

便利そうに見えてその実結構処理時間を取られることが判明。

###■仕様
パーティションの作成タイムスタンプ＞JOB最終実行時間の場合既存データの取り込み取込み処理をスキップする。

具体的には、パーティション毎にフィルター処理を実行しており、
1prefixの処理時間は100msと短時間だが、すべてのprefixに対してフィルター処理を行う。
【フィルター】
After initial job bookmarks filter：前回読み込んだパーティションに追加/変更となったファイルを特定する。
After final job bookmarks filter：対象のファイルを処理する

その為、InputDataにパーティション設定がないほうがブックマーク機能の処理が短くなる。

この辺を考慮した設計が必要となりそう。
アナログ回路 その20

# 概要

circuit sandboxをplunkerでホスティングした。
アナログ回路をシュミレーションで、説明してみる。

# オペアンプ・加算回路

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/890688f2-0e6d-1b81-0e33-fa415d52e9c6.jpeg)


# 結果

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8b37cf24-8503-48be-89b4-3c72c0bd824e.jpeg)


# 説明

１V　＋　１Vで２Vが出力です。

# 成果物

https://embed.plnkr.co/plunk/PHotCwu1DGdO2guv



以上。
【IQ Bot】正規表現を使ったカスタムロジックの備忘録

IQ Botのカスタムロジックで正規表現を使うケースがぼちぼち出てきました。

そんなわけで、仕事で使った正規表現のカスタムロジックを備忘がわりにメモっておきます。

（体系立ててまとめられれば一番いいのですが、ないよりマシということで。。。）

##英語の大文字と数字だけを取り出したいとき

数字と英語の大文字の組み合わせでできた申込番号を取り出すときに使いました。

```python:英語の大文字と数字だけを取り出したいとき
import re
field_value = re.sub(r"[^0-9A-Z]","",field_value)
```

ちょこっとコード解説をすると、正規表現の`[0-9]`は数字、`[A-Z]`は英語の大文字を表します。
「数字と英語の大文字」は`[0-9A-Z]`のように表現します。

で、コード例についている`^`はその否定。
つまり、`[^0-9A-Z]`は「数字でも英語の大文字でもない文字」ですね。

`"[^0-9A-Z]"`の前についている`r`は、「これは正規表現だよ」の合図です。

したがって、`re.sub(r"[^0-9A-Z]","",field_value)`は、

「`field_value`の中の数字でも英語の大文字でもない文字を空の文字列(`""`)に置き換えてね」

イコール

「`field_value`の中の数字でも英語の大文字でもない文字を除外してね」

イコール

「`field_value`の中から数字と英語の大文字だけを取り出してね」

という意味になります。
Rails：deviseを含めたバリデーションメッセージを日本語化

# 最初に

**カレンダー企画2020の22日目**
プログラミングの勉強を始めて3ヵ月程経ったので学んだことのメモをアウトプットとして記事に残します。
これからプログラミングの世界に入る人の手助けになれたら嬉しい限りです。
間違っていたり、言葉が違っていたり、誤解されるような言葉があったら教えてください^^
言葉を長々と読みづらかったら申し訳ありません。少しずつなれてがんばります。

## deviseを含めたバリデーションメッセージを日本語化にする

日本人の使用を想定するものであればアプリケーション内は日本語にする方が良いですよね！
そんなわけで日本語化に取り組んだ内容をメモしておきます。

## やること

1. config/application.rbに記述をする。
2. config/locales下に「ja.yml」「devise.ja.yml」を新規作成する
3. 新規作成したファイルの中身は先人の力をお借りしてコピペする。
4. カラム名になるところはおそらくまだ英語なので、ここは自力でja.ymlに記述する。

以上

## 1. config/application.rbに記述をする

```ruby:config/application.rb

config.i18n.default_locale = ja
```

ファイル内に記述をしてください。


## 2. config/locales下に「ja.yml」「devise.ja.yml」を新規作成する

こんな感じ

![スクリーンショット 2020-12-22 10.56.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838465/266b961f-1d29-7ba0-8bb8-3c6441f2a883.png)

（en.ymlはいらないのだろうけど怖くて消してないです^^; 一発でdevise.ja.ymlを作成する事もできるみたいですので興味のある方調べて見てください。）


## 3. 新規作成したファイルの中身は先人の力をお借りしてコピペする

先人の方に感謝を伝えながら拝借^^

[ja.yml](https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml)
[devise.ja.yml](https://github.com/tigrish/devise-i18n/blob/master/rails/locales/ja.yml)

## 4. カラム名になるところはおそらくまだ英語なので、ここは自力でja.ymlに記述する

```ruby:config/locales/ja.yml

ja:
  activerecord:
    models:
      member: "メンバー"
      post: "投稿"
    attributes:
      member:
        first_name: "姓"
        last_name: "名"
        email: "メールアドレス"
        encrypted_password: "パスワード"
      post:
        title: "タイトル"
        body: "内容"

```

私はこんな感じで追記をしました。

## 最後に

すべてのカラムをやっても良いと思うのですが、エラー文で使うところなど表示されるものだけを行いました。

あと、model用のja.ymlを分けている人もいました。そっちの方が管理しやすかったな〜〜〜って作り終わってから思いました。


[参考サイト](https://qiita.com/Ushinji/items/242bfba84df7a5a67d5b)こんな感じにやると管理しやすいかもしれないです。まだ私はやってないので今度やってみようと思います。
mix credoでTODOコメントがあってもCIを落とさない。


`.credo.exs`の`Credo.Check.Design.TagTODO`の行の値を`false`にする。

```elixir

{Credo.Check.Design.TagTODO, false},
```


また、`.credo.exs`は下記のコマンドで作成される。

```
mix credo.gen.config
```
【Swift】非同期処理ってなにもの？

#非同期処理 とは？
非同期処理とは、**実行中に別の処理を止めない処理のことを指します。**

非同期処理を利用すれば、ある処理を行っている間に
その処理の終了を待たずに別の処理を実行できるので、
**結果的に処理の高速化やレスポンシブなGUIの実現に繋がります。**

Swiftでは、スレッドを利用して非同期処理を実現しています。

スレッドは、CPU利用の仮想的な実行単位です。
処理を行う専用の機関というイメージです！

通常、プログラムはメインスレッドという単一のスレッドから開始します。
**そこから別のスレッドを作成しそこで処理を行うこともできます。**

別スレッドで行われる処理は、メインスレッドの処理とは並列に実行されます。

このように複数のスレッドを使用して処理を行うことを**マルチスレッド処理**と言います。

しかし、マルチスレッドは正しく実装しなければ、
下記のような深刻な問題を招く可能性があります。

**・スレッドの過度な仕様によりメモリが枯渇する
・複数のスレッドから同一のデータを更新しようとして不整合が発生する
・スレッドが互いに待合を行うデッドロックが発生する**

こうした問題が発生しないように、
プログラマはスレッドを把握＆管理しないといけません。

なのでとても便利ですが、その分難しい手法となります。

非同期処理を行う方法は次の３つの方法があります。
**・GCDを用いる方法
・Operation、OperationQueueクラスを用いる方法
・Threadクラスを用いる方法**

これらの方法についてが別記事でまとめていますのでそちらをご覧ください。
・【Swift】非同期処理「GCD」について
・【Swift】非同期処理「Operationクラス」について
・【Swift】非同期処理「Threadクラス」について

以上、非同期処理についての説明は終了したいと思います。

思い処理を行う際にユーザに待ち時間を与えてしまうことを防ぐことができるので、
かなり使える機能かと思います。

その分使い方に注意しなければならないので、
しっかりと理解し使えるようになりましょう！

最後までご覧いただきありがとうございました。
ダブル配列のゲーム作った

本記事は「[データ構造とアルゴリズム Advent Calendar 2020](https://qiita.com/advent-calendar/2020/str)」の22日目の記事です。

突然ですけど、Typescript+PIXI.jsでダブル配列のゲームを作りました。
https://kampersanda.github.io/xchecker/app/
![Playing.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170428/b34a3d3e-26f7-9131-2f08-2500fb20b63d.gif)
ゲーム名はXChecker[^1]っていいます。与えられたトライ木から隙間なく要素を配置してダブル配列を構築する（たぶんパズル）ゲームです。[^5]

[^1]: 論文内で、配列の空いた要素を探す関数がXCHECKと名付けられていることに由来します。
[^5]: 2020/12/21現在、ChromeとSafariでしか動作確認していません。

ちょっとフロントエンドな何かを作って遊んでみたくなったのが動機で、なぜダブル配列？と聞かれると宗教上の理由です。

ところで、トライ木やダブル配列に関しては素晴らしい解説がたくさん存在してます。今年のアドカレでも[10日目](https://zenn.dev/naughie/books/fb2d718b6df670)に@Naughieさんが非常に詳しい解説を書いてくださってます。他にも調べたら出てくると思います。

ということで、本記事ではトライ木やダブル配列について改めて解説したりはせず、ゲームの説明に終始します。このアドカレの趣旨に沿わなかったらごめんなさい。

でもゲームのルール自体がダブル配列のデータ構造なので、ゲームがクリアできた人はダブル配列を完全に理解したと自称してもいいんじゃないんでしょうか（自己責任）

以降では、トライ木やダブル配列は知っていただいているものとして、ゲームを簡単に説明します。ただゲーム自体はものすごくシンプルなので、読まなくてもダブル配列を知らなくても遊べると思います。

# ゲーム説明

「与えられたトライ木からダブル配列を構築すること」は、すなわち「ノードを BASE & CHECK 配列に配置すること」です。XCheckerはランダムに生成されたトライ木を幅優先で辿り、衝突しないようにノードを配置していくゲームです。ただし、最終的に空き要素がないことがクリア条件です。[^2]

[^2]: ダブル配列というデータ構造が空き要素を許容しないというわけではなく、あくまでこのゲーム内での条件です。また、少なくとも一通りはそういう配置ができるトライ木が与えられます。

下の図を見てください。ゲームは BASE & CHECK の先頭の要素に根ノードが配置されているところから始まり、その子ノードが配置できる要素を探します。このとき、枝ラベルの有無を表す配列が与えられます。図では文字 {a,b} をラベルに持つので、a と b に ✔︎ が入った配列が与えられます。そして ✔︎ が入った要素が衝突しないような BASE & CHECK の位置を探します。[^3]
![スクリーンショット 2020-12-20 23.48.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170428/6d9dfc0e-8d6e-6180-fd2b-426f1dc77cdc.png)
とりあえず、枝ラベル配列の先頭が要素 1 にくるように右に一つズラすことで ✔︎ が衝突しなくなるので、そこで下キーを押すと下図のようにノードを配置できます。a の子は要素 1 に、b の子は要素 2 に配置されているのが分かります。**ただし、枝ラベル配列は BASE & CHECK 配列の内側しか移動できないので注意してください。**

続いて a の子に移動し、同じように空き要素を探してノードを配置していきます。
![スクリーンショット 2020-12-20 23.52.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170428/83a9aea9-7ec6-cb0f-7557-a0d867cbcc4d.png)
うまく全てを配置できれば、以下のような結果になります（この一通りではないです）。
![Screen Shot 2020-12-21 at 21.24.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170428/53a6bd5d-5168-6c73-957c-ef586c65f825.png)
空き要素を生まないように配置できなければゲームオーバーです。また、時間に応じてスコアがでます。上は時間がかかりすぎてるので「まるで二乗時間」です。

3秒以内に配置できれば「まるで定数時間」です。定数時間出せたらすごいです。
![Screen Shot 2020-12-14 at 22.31.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170428/9dba949b-8df3-3655-6655-079d098ace0b.png)
あとHardモードも用意してます。これの定数時間は多分無理です。

[^3]: この辺りのお気持ちは、[情報系修士にもわかるダブル配列](https://takeda25.hatenablog.jp/entry/20120219/1329634865)がとても詳しいです。

# 感想

何か新しい言語やツールに入門するのはやっぱり楽しいです。

ただこのゲームについては、結局いい感じのトライ木が与えられるのを待つ運ゲーになってしまった感じです。でもダブル配列ってそういうものなのかもしれません。[^6]

[^6]: 実際には優れた素晴らしいデータ構造だと言う意味です。

あとキーの操作性があまりよくないです。深く押し込むタイプのキーボードではちょっとストレスです。ソースもすごく汚いので、いつか整理したい（しない）

# 参考にしたサイト

- Learning Pixi: https://github.com/kittykatattack/learningPixi
- 初心者による超初心者のためのPixiJS入門: https://qiita.com/chiisanwo/items/f22caabc89ed8a6c41de
さくらのセキュアモバイルコネクト SIMカード登録

さくらのセキュアモバイルコネクトのテストを開始するにあたり、SIMカードの登録が必要となります。
セキュアモバイルSIMカードの管理は sakura.io のコントロールパネルではなく、さくらのクラウドのコントロールパネルで行います。
さくらのクラウドのアカウントが必要となりますのでご注意下さい。

さくらのクラウドのページはこちら

さくらのクラウドのコントロールパネルにログインすると次のような画面になるので [セキュアモバイルコネクト] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/239e1e51-731e-f0fb-f42b-59d91ef76327.png)


セキュアモバイル SIM のページの [+追加] をクリックして SIMカードを登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/230ab364-6fc4-252b-8128-6bfe08c3228a.png)

SIMカードが登録されるとSIM一覧に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/79bfc395-b196-da08-f69f-efcb4a5a7217.png)

さくらのセキュアモバイルコネクトではSIMカードを登録しただけではまだ通信が出来ません。
モバイルゲートウェイの作成とモバイルゲートウェイとSIMカードの紐付けが必要となります。
モバイルゲートウェイ作成にあたり注意事項があります。
モバイルゲートウェイ1つに対して毎月4400円の料金がかかります。
モバイルゲートウェイのページの [+追加] をクリックしてモバイルゲートウェイを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/0b9474dc-ffed-7bd1-0382-885705f7d7ca.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/a49b1afc-90d4-ebe6-bc6b-616765d83586.png)

モバイルゲートウェイも登録されると一覧に表示されます。

登録が終わったらモバイルゲートウェイの詳細を表示して

インターネット接続が ON になっているのを確認して下さい。
ONになっていないとインターネット網への接続が出来ません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/bbfcf216-7d55-46fb-5a84-406fa60998eb.png)

以上で セキュアモバイルコネクト を利用する準備が出来ました。

なお、今回は簡単にしか説明しませんでしたのでより詳細をお知りになりたい方は

こちらのページを御覧ください。
https://www.sakura.ad.jp/services/sim/
【最速15分】google AppScriptで構築するLineBot！！

■用語の説明

①LineBotとは
　LINEで動くチャットボットのことです。
　LINE上でユーザの発言に対して自動応答することができます。

②Google　Apps Script(GAS)とは
　Googleのツールやサービスを連携して利用するためのプログラム言語です。

■必要なもの
　①googleアカウント
　②LINE developersアカウント

■全体の流れ

①LINE Developerコンソールへのログイン(環境：LINEコンソール)
　※個人のLINEアカウントでログインできます。
②新規プロバイダー・チャンネル作成（環境：LINEコンソール）
③Massaging API設定（環境：LINEコンソール）
④チャンネルトークンの発行（環境：LINEコンソール）
⑤GASの設定(環境：GAS)
⑥GASコード作成(環境：GAS)
⑦プログラム公開（環境：GAS）
⑧URL登録（環境：LINEコンソール）
⑨LINEからテスト（環境：スマホ）

■実装手順
①LINE Developerコンソールへのログイン(環境：LINEコンソール)
![①Lineログイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922854/c0eeefb5-cd31-fae7-d3c4-5e4f9da5c4ad.png)


②新規プロバイダー・チャンネル作成（環境：LINEコンソール）
　1.新規プロバイダーをクリック
　2.プロバイダ名を入力⇒作成
![②プロバイダ作成b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922854/0edcbbe8-84f0-7d61-a7d6-4dae489a2aa0.png)

　3.Massaging APIをクリック
![④プロバイダ作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922854/7d879c3a-5139-e437-208a-c9267642da39.png)

　4.チャンネル名など必須項目を入力⇒作成
![⑤プロバイダ作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922854/8c7fdfb4-a38d-bc81-6182-39231cd10664.png)


③Massaging API設定（環境：LINEコンソール）
　1.応答メッセージの編集をクリック
　2.下記を設定
　　あいさつメッセージ：OFF
　　応答メッセージ：OFF
　　Webhook：OFF

④チャンネルトークンの発行（環境：LINEコンソール）
　1.チャンネルアクセストークンの発行をクリック
  ※GASでコードを書く際に利用

⑤GASの設定(環境：GAS)
　1.GoogleDRIVEを開く
　2.新規タブ⇒その他⇒Google Apps Script

⑥GASコード作成(環境：GAS)
　1.初期に書いてある function myFunction() {} 削除
　2.下記のコードを必要箇所を編集して記載

＜サンプルコード＞
var CHANNEL_ACCESS_TOKEN = '④で発行したトークン';

function doPost(e) {
 var post_json = JSON.parse(e.postData.contents);
 var reply_token = post_json.events[0].replyToken;
 if (typeof reply_token === 'undefined') {
   return;
 }
 var message = post_json.events[0].message.text;
 var url = 'https://api.line.me/v2/bot/message/reply';
 
 UrlFetchApp.fetch(url, {
   'headers': {
     'Content-Type': 'application/json; charset=UTF-8',
     'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
   },
   'method': 'post',
   'payload': JSON.stringify({
     'replyToken': reply_token,
     'messages': [{
       'type': 'text',
       'text': message,
     }],
   }),
 });
 return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}
＜-------------------------＞


⑦プログラム公開（環境：GAS）
　1.公開ボタン⇒ウェブアプリケーションとして導入
　2.Project Nameを記入（好きな名前）⇒OK
　3.ファイルの保存設定を入力
　　Projectversion:new
　　Who has access to the app: Anyone, even anonymous
　4.認証が必要と出たら⇒許可の確認
　5.詳細⇒安全ではないページへの移動⇒許可
　6.URLをコピー

⑧URL登録（環境：LINEコンソール）
　1.Webhook設定の編集
　2.先ほどコピーしたURLを貼り付け
　3.検証ボタン⇒OKであれば次にすすむ
　※OKでなかった場合は、チャンネルトークンの設定、URLが合っているのか確認する

⑨LINEからテスト（環境：スマホ）
　1.LINEコンソール画面のQRコードで友達登録を行う
　2.登録後にコメントを入力してみて返信が返ってきたらOK
  ※もし返信が返ってこない場合は、下記を再度確認
　　・あいさつメッセージがオフになっているか
　　・応答メッセージがオフになっているか
　　・発行したチャンネルトークンがコードに正しく記載されているか

■まとめ・感想
今回、他の方が実装された際のサイトを見ながら実際に実装してみましたが意外と簡単にできました。PC上、スマホ側からのテストと実際にやってみると達成感がありました。
普段コミュニケーションツールとして使用しているLINE上で自分の作ったbotが動くので、友達に実際に使ってももらって感想をもらえるなど便利だなと思いました。

最後まで読んでいただきありがとうございました。
さくらのセキュアモバイルコネクトSIM

SIMCOM社のLTEモジュールでさくらのセキュアモバイルコネクトSIMカードを使っての通信を確認しました。
なお検証したのは PING疎通確認 のみです。

### 動作を確認出来たジュール
|モジュール|通信方式|
|:-----------|------------:|
|SIM7080G|LTE cat.M1|
|SIM7000JC|LTE cat.M1|
|SIM7500JC|LTE cat.1|
|SIM7600JC-H|LTE cat.4|
次回以降各モジュールでのテストの状況を報告します。

一連の検証を行うにあたりこちらのブログを参考にさせていただきました。
https://sakura.io/blog/category/secure-connect/
第七回



# 条件多岐文


## if-elseの記入法

```ruby
if (conditional expression No.1) then
 process No.1

elsif (conditional expression No.2) then
 process No.2

else
 process No.3

end
```


## caseの記入法

```ruby
case X
when Alpha then
 process No.1

when Beta then
 process No.2

else
 process No.3

end

```


## Theme 1  閏年を判定するプログラム


### 閏年の判定方法

    1. 閏年は4で割り切れる数の年
    2. 1の条件を満たし，且，100で割り切れる年は閏年ではない．
    3. 1の条件を満たし，且，400で割り切れる年は閏年である．
    
    2004, 1999, 1900, 2000で試した場合，結果は
    true, false, false, true と出力される


### プログラム

if-else文を用いたものは以下のようになる．

```ruby:uruu.rb

p year = ARGV[0].to_i
if year % 4 == 0 then

  if year % 400 ==0 then
    p true

  elsif year % 100 ==0 then
    p false

  else
    p true
  end

else
  p false

end

```

実行結果

    C:\Users\nobua\M1>ruby uruu.rb 2004
    2004
    true
    
    C:\Users\nobua\M1>ruby uruu.rb 1999
    1999
    false
    
    C:\Users\nobua\M1>ruby uruu.rb 1900
    1900
    false
    
    C:\Users\nobua\M1>ruby uruu.rb 2000
    2000
    true

続いてはcaseを用いたものを示す．

```ruby:uruu2.rb
def leap(year)
  case
  when year % 400 ==0 ; return true
  when year % 100 ==0 ; return false
  when year % 4 ==0 ;   return true
  else ;                 return false
  end
end

year1=2004
year2=1999
year3=1900
year4=2000

p year1
p year2
p year3
p year4

p leap(year1)
p leap(year2)
p leap(year3)
p leap(year4)

```

実行結果

    C:\Users\nobua\M1>ruby uruu2.rb
    2004
    1999
    1900
    2000
    true
    false
    false
    true


# array,each


# 参考文献

<https://qiita.com/daddygongon/items/a550bde1ed6bff5217d8#case%E3%81%A7>



------
 - **source** ~/grad_members_20f/members/NobuakiMori/L07_if_else.org
IEでアクセスしたサイトを強制的にEdgeで開かせる裏技

## Microsoft 公式の方法でこんなことができる

① IE11で [apple.com](https://www.apple.com/) のサイトを開こうとする

② ↓ このような画面が出る

　　![IEリダイレクト](https://user-images.githubusercontent.com/7469495/102837503-3e131b00-443f-11eb-904f-a3a225c8c57b.png)

③ Edge が自動的に起動し、apple.com が表示される



## なぜ？

[Need Microsoft Edge list](https://edge.microsoft.com/neededge/v1)

というリストを Microsoft が公式に管理していて

ここにサイトのドメインが追加されると、上記のような挙動になる

## どうやって追加するか

[こちらのページ](https://docs.microsoft.com/en-us/microsoft-edge/web-platform/ie-to-microsoft-edge-redirection) の手順通りに、 Microsoft にメールを送ればOK

メール例）

```
Dear Microsoft staff.

—————

*Owner name

 [Name]
 
*Corporate title
 
 [役職]

*Email address

 hogehoge@gmail.com

*Company name

 ABC Company Inc.

*Street address

 ... Tokyo Japan

*Website address

 https://sample.com

——————

Regards.

```

試しに送ってみたところ

約1週間でリストに追加されました🎉


## IE11のサポート期限は？

一般ユーザーが使う(LTSB/LTSC以外) Windows 10 の場合、 **2025年10月** まで Microsoft のサポート対象になっている

意外とまだ先だった・・

※ LTSB/LTSC (Long Term Service Branch) とは、機能更新を行わないモデルで医療機関の業務システムや銀行のATMなどに使われているもの

![wi-1608eol_ie_client01](https://user-images.githubusercontent.com/7469495/102838095-aa424e80-4440-11eb-9e1c-696b522c48f3.png)


## まとめ

[Need Microsoft Edge list](https://edge.microsoft.com/neededge/v1) にサイトを追加して、 

Microsoft 公式の方法で、Edgeへの導線が確保できることをクライアントに説明した上で、

SLA から IE を外しましょう！

## 参考

https://www.atmarkit.co.jp/ait/articles/1503/11/news134.html
TDにアップロードしたいが、Embulkのymlファイルがないので作るとき

## information_schemaからこうやってやるメモっす

既にTDのTableに入ってるんだけど、embulkのファイルがないーこれをコネクターで取りたい―とかWFで取りたい―とかの場合
（今回は同一ファイルのIF元が変わるーんだけどembulkのymlが手元にない。先方は現行保障してs3にputするのでwfで取得してね。って言われたパターン）

information_schemaからordinal_position順に書き出せば、すぐにembulkのymlにできそう。(guessできないときの話)

```sql
SELECT
    ordinal_position,
    column_name,
    data_type,
    '  - {name: '||column_name||', type: '||case data_type
      when 'varchar' then 'string'
      when 'bigint' then 'long'
      else data_type
    end||'}' as col
FROM
    information_schema.columns
WHERE
    table_schema = '（DB_NAME）'  -- DB名
AND
    table_name = '（Table_NAME）'  -- テーブル名
AND
    column_name != 'time'  -- timeカラムは除外
order by ordinal_position -- 入ってる順番にソート
```

## 参考
information schemaから引ける項目
https://dev.mysql.com/doc/refman/5.6/ja/information-schema-columns-table.html
Laravel Unitテストでエラーが発生した

# 目的

- Unitテストを実行したらエラーが発生したので解決方法とこのエラーの原因をまとめておく

# エラーまでの経緯

1. アプリ名ディレクトリで下記コマンドを実行してテストクラスのファイルを作成した。

    ```terminal
    $ php artisan make:test UserServiceTest --unit
    ```
1. テストコードを記載後、アプリ名ディレクトリで下記コマンドを実行してテストを実行した。

    ```terminal
    $ vendor/bin/phpunit tests/Unit/UserServiceTest.php
    ```

# エラー

- Unitテストを実行したら下記のようなエラーが出た

    ```terminal
    Error: Call to a member function connection() on null
    ```

# 解決までの経緯

1. 問題のテストコードを下記に記載する。

    ```アプリ名ディレクトリ/tests/Unit/Service/
    <?php
    
    namespace Tests\Unit\Service;
    
    use PHPUnit\Framework\TestCase;
    
    class UserServiceTest extends TestCase
    {
        /**
         * A basic unit test example.
         *
         * @return void
         */
        public function testExample()
        {
            $this->assertTrue(true);
        }
    
        /**
         * getUserInfoByUserIdメソッドのテスト
         *
         * @return void
         */
        public function testGetUserInfoByUserId()
        {
            // テストコード
        }
    }
    
    ```

- 下記で回避できた。TestCaseはPHPUnit直下ではなくTests直下のものを見てもらう。

```アプリ名ディレクトリ/tests/Unit/Service/
<?php

namespace Tests\Unit\Service;

// 下記を修正
use Tests\TestCase;

class UserServiceTest extends TestCase
{
    /**
     * A basic unit test example.
     *
     * @return void
     */
    public function testExample()
    {
        $this->assertTrue(true);
    }

    /**
     * getUserInfoByUserIdメソッドのテスト
     *
     * @return void
     */
    public function testGetUserInfoByUserId()
    {
        // テストコード
    }
}

```

# 参考文献

- [https://architect.slowcat.net/php/phpunit-dbtest-connection-null/](https://architect.slowcat.net/php/phpunit-dbtest-connection-null/)
Tableauの呼吸！初心者の型！！躓き回避！！！


#**:shamrock:はじめに:shamrock:**

IT未経験の初心者が業務でTableauを使用しレポート作成するという
大冒険の中、よく躓きがちな部分をまとめてみました！！:relaxed::point_up:

#:girl_tone1:自己紹介:boy_tone1:
株式会社シー・エー・アドバンス技術統括本部所属の
入社7ヶ月の渡嘉敷（トカシキ）と3ヶ月野中（ノナカ）です！
入社歴も浅く、『Tableau？何それ？』だった私たちが、
躓き易いポイントを押さえてみました！！
本当に本当に初心者向けなので、
生温かい目で見て下さるとありがたいです！:angel::angel_tone3:


#<font color="#008899">➀データベースの見方が分からない・・・〔担当：渡嘉敷〕</font>
e-learningを終えると私たちのチームでは、
実際に業務で使うデータベースを使って研修を行うのですが、
とにかくデータの量が多い！
そしてラベルも沢山・・・
![advent2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869208/2cc6170e-3a06-36ce-4eb9-ea46eb049363.png)
$\small{※渡嘉敷が急いで作った雑なダミーデータです(笑)}$


ラベルにある英語・・・
直訳すると大体の意味はわかります・・・が！
私達が躓いたのは、日付・・・:frowning2::frowning2:
ラベルの意味と照らし合わせてもどれをどういうデータとして扱えば良いか、
分かりませんでした・・・
ここでTableauのe-learningで使っていたサンプルスーパーストアが
いかに整頓され、使いやすいデータだったかが分かります（絶望でした）

そこで今回は、
ダミーのデータを何かのアプリの利用数だと仮定して、
日付データが複数ある場合の一つの考え方を書いていこうと思います！！

まずデータを見ると、
日付のある列が３つありますね・・・
![advent3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869208/8a6fe7e2-3432-7c13-33a6-8e9134446b0b.png)

赤に入っている時間帯は全て同じ時間
緑に入っている時間はバラバラ・・・
ここで『ん？？』と思いました。
ユーザーが全員一気に同じ時間に何かするはずがない！！
とゆうか不可能！！
ユーザーが何かしたデータじゃないならなんだろう？？
で、ラベルを見ると・・・
【System update at】【created at】となっています。
<B>【System update at】</B>・・・システムでデータをアップロードだったり取得した時間かな？？
<B>【created at】</B>・・・このデータを作成した日かな？？
こんな風に考えていくと、
【user first touch at】も、
まぁ直訳なので簡単ですが(何故なら渡嘉敷が作ったから)
ユーザーが初めてこのアプリに触った時間なんだなって事が分かります。

このラベル毎に入っているデータをきちんと読み解いておかないと、
データ結合する時うまく出来なかったり、
可視化した時に数値が正確ではなかったりして、
ゴミの様なレポートが出来上がります！
私も未だにデータを読み解くのは苦手ですが、
ここが出来ないと話にならないと思っていますので
苦手でも頑張りましょう！！！笑

#<font color="#028760">➁パッと見るとわからない用語〔担当：野中〕</front>
e-learning中や実際にレポートを作成している時、ふと参考書やHPを見た時に
よく出てくる［シェルフ］や［Viz］といった単語、当初はこれを見ただけで余計に混乱しました。（ペインって何なん！？痛み？となっていました）
単語をそのまま検索しても微妙に意味が異なったりするので、よく出てくる単語を下記にまとめてみました！これから始める方に参考になったら嬉しいです（笑）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869208/ef2e9bbf-d172-48ec-4585-280db19a2532.png)

![advent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869208/af1408fa-eaec-93f2-cca6-af7be3e67f78.png)

#終わりに・・・
Tableauはアップデートがかなり頻繁にあり、
知らない間にしれっと変わっていたり仕様が大幅に変わることも・・・
(仕様が変わって作成中のレポートが消えた方も同じチームにいたりします:skull:)
e-learningで使ってるTableauは大分前のバージョンなのでe-learnig通りにやっても上手くグラフが出来なかったり、
凄く悩むかもしれません・・・

でも、ネット上にはバージョンが更新されると、
変更点を解説付きで上げてくれるとても親切な方も沢山います:blush:
なので、Tableauがバージョンアップされた後上手くできない事があったら、
是非一度変更点を調べてみる事をおすすめします:bulb::bulb:
ソフトウェア開発における当たり前を教わることがない件

僕はふと思いました。
「ソフトウェア開発現場で当たり前に行われているバージョン管理やCIについて先輩などから教わることってほとんど無くない？」
現代では当たり前に使われているgitやCircleCIなどの使い方は教えてもらっても、どんな目的で存在していて、何に気を付けて活用すればよいかを説明してくれる場が少ないと思ったのです。

かく言う僕も、「git使ってるから使えるようになってください」とか「リポジトリにpushしたらJob動くんで覚えておいてね」で済まされてきたため、なんとなくこれらのツール使っていました。

僕はこれらの意義や誕生した経緯を[t-wadaさんの「動作するきれいなコード」](https://t-wada.hatenablog.jp/entry/clean-code-that-works)という公演で、恥ずかしながら初めて意識するようになりました。ので、この記事では自戒の念も込めて覚書しておきます。

# バージョン管理・テスティング・自動化
t-wadaさんは、現代のソフトウェア開発においてなくてはならない技術的な柱としてこれら3つを挙げています。
確かにどこの現場でも、しっかり運用できているかは別として必ず上がっている要素だと思います。

これら3つは、あれば優位なわけではなく、無ければ話にならないという要素です。

# バージョン管理
バージョン管理は人間の**記憶力**を補います。
実装から半年も経てばどんな変更を実施したのかなど忘れてしまいます。僕みたいなポンコツは1か月後には完全にゼロに戻っています。
そこで、コードのどこをどのように変更したのかや誰が実施したのか、何のために変更したのかをバージョン管理システムが歴史としてしっかりと記憶してくれます。
このような目的を改めて理解すると、
* コミットメッセージを「fix」で済ます
* カジュアルな歴史改変
のようなことをしなくなりますよね。

また、開発時にもいろいろ変更を加えた挙句、「一旦ゼロに戻したいなぁ」ということが`git reset`や`git checkout `のようなコマンドで簡単にできます。
これも歴史のチェックポイントをバージョン管理システムが覚えていてくれるからこそ成せる業ですよね。

# テスティング
テスティングによって、人間の**把握力**を補います。
テストを書き続けて、継続的に実行することで、膨大なコード量になっても「想定通り正しく動作しているか」を判断することができます。
想定通り正しく動作しているかをテストの成功失敗をもって明確にわかることで、次のコード改修も安心して実施することができます。

実装当時のように仕様がバッチリ頭の中にあるわけではないけれども、その当時考えていた通りに動作しているかどうかがわかれば、変更の細部はバージョン管理システムに問い合わせれば教えてもらえます。

個人的経験もありこれはかなり意識するようになりました。ほぼメンテされていないintegration testを1発たたいて、気持ち的に少し安心感を得るだけで本番デプロイしていた時期があり、精神衛生上とても良くないと思った経験がありましたもので。

# 自動化
自動化は人間の**忍耐力**を補います。個人的には**注意力**も補ってくれていると思います。まぁ一緒でしょうかね。
開発にあたって、コーディングだけをしていればよいわけではなく、当然テスト実行やそのレポート出力、ビルド、パッケージングなどの周辺作業が伴います。
これを手順書化して人間が逐一実行するのはちょっとイケてないです。
このような単純作業を変更のたびに繰り返すのは、つまらなくて飽きますし、何よりもミスする可能性があります。その点で機械はミスなく言われたとおりに実行し続けることができます。

そうであるならば、手順書からスクリプトやパイプラインを作成してやらせればよいです。これによって人間が作業することで起こるケアレスミスもなくなり、開発サイクルのスピードも速くなります。

また、変更の有無にかかわらず定期的にビルドやテストを実行することがあります。これにより、失敗したときに素早く知れるとともに、「何もしていないのに壊れた」状態を検知することができます。

# おわりに
僕はテスト駆動開発という本を読んで、それをきっかけにt-wadaさんの講演にたどり着きました。
テスト駆動開発についての講演でしたが、それに限らず界隈の方にはぜひとも1度触れてほしい講演です。

# 参考文献
動作するきれいなコード: SeleniumConf Tokyo 2019 基調講演文字起こし+α
https://t-wada.hatenablog.jp/entry/clean-code-that-works
tmuxをMyPCに導入してみた。

この記事は、<a href="https://adventar.org/calendars/5535">ITRCアドベントカレンダー2020</a>の22日目です。

前日は<a href="https://adventar.org/users/32583"> Tatsumi Gamou </a>さんの「<a href="https://blog.gamou-tatsumi.com/post/tech/neovim-init-lua">Neovimでinit.luaを使う」</a>です。

明日は未定...

#はじめに
お疲れ様です。 @koseiinfratopです。自分は開発をするときに作業フォルダまでターミナルで移動し、`code .`を入力し、vscodeの起動・dockerコンテナを立ち上げる場合はその後`docker-compose up -d` => `docker-compose exec サービス名 /bin/sh` を行います。
しかし、、、、
この順序をよく間違えてしまいます。どのように間違えるかというと
1. ターミナルで作業フォルダまで移動
2. `docker-compose up -d`
3. `docker-compose exec ....`
4. `code .` .....

>あ、、、もうdockerコンテナの中に入ってしまったから`exit`してからcode .しなきゃいけねぇじゃん。。。

=> めんどくさい！！！！。
　　１画面で複数のターミナルを開きたい。。。。
   tmuxっていうのがそれを実現できるみたい。。。。
ということでtmuxをインストールしてみました。

#導入
``` 
brew install tmux
```

# 使い方
prefix == `Ctrl + b` とキーボードのなんらかの文字を打つことによりいろいろできるみたい。
>参考資料
<a href="https://qiita.com/nmrmsys/items/03f97f5eabec18a3a18b">tmuxチートシート</a>


。。。。これじゃ手間がかかる。。。。。作業画面を１発で構築するコマンドを作るか！！！！

# カスタマイズ
#### 作業画面を１発で構築するコマンドを作る。
```:~/.scripts/Tmux.sh
#!/bin/zsh

# set tmux panes for original Tmux


if [ "$#" -eq 0 ]; then   #! 引数の数が０の場合
 tmux split-window -v    # ウインドウを上下ペインへ水平分割
 tmux resize-pane -D 7 　# 下部ペインのサイズ変更
 tmux select-pane -t 0 　# アクティブなペインの移動
 clear
else
 case $1 in
  1)
   tmux split-window -v
   tmux split-window -h　# ウインドウを左右ペインへ垂直分割
   tmux resize-pane -D 7 
   tmux select-pane -t 1
   clear
   ;;
  2)
   tmux split-window -h
   tmux split-window -v
   tmux select-pane -t 1
   clear
   ;;
  docker)　
   cd ~/`dockerフォルダへのパス`
   tmux split-window -v
   tmux split-window -h
   tmux resize-pane -D 7 
   tmux select-pane -t 0 
   clear
   ;;
   vagrant)
    cd ~/`vagrantフォルダへのパス`
    tmux split-window -v
    tmux split-window -h
    tmux resize-pane -D 7
    tmux select-pane -t 0
    clear
    ;;
  *)
   echo [ERROR] no setting "$1"...
   ;;
 esac
fi  
```
ポイント：自分はよくvagrant, dockerフォルダを使用するので引数により複数のペイン上でフォルダ移動できるようにした。


##### aliasの設定
```:.zshrc
 alias Tmux="~/.scripts/Tmux.sh"
```
# 完成！！！
![スクリーンショット 2020-12-22 10.23.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541740/2a103b95-6aba-b4bd-ba86-5f8b20fc5cf0.png)

これで少しはストレスがたまらずに開発できそう！！！

>その他の参考資料
<a href="https://dev.classmethod.jp/articles/tmux_create_devenv_display/">【shell】tmuxの作業画面を一発で構築するコマンドを作ってみた</a>
（↑これを９割方パクらせていただきました。ありがとうございます。)

> <a href="https://qiita.com/zwirky/items/adbf22abad7d7822456b">tmuxで快適なターミナル生活を送ろう</a>
> https://tanakatarou.tech/25/
> https://sssslide.com/speakerdeck.com/chocoby/tmux
【CSS】超簡単!!　スクロールに追従する要素を作る

#はじめに
スクロールすると動きに合わせて追従してくる方法の紹介です。

追従自体はfixedでできるのですが、指定の場所で追従が終了して欲しい事があると思います。
JSしたり範囲したりする事で可能ではありますが、この記事では「特定の要素の範囲内で追従が終わる」様にする事で超簡単に実装できる方法を紹介します。


![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769854/3e14a5f4-b063-34c5-fc5b-3d11e6a996b5.gif)

#開発環境
HTML 5

#実装
以下の記述で、追従する要素は`form`内でのみ画面上で追従してくる様になります。

```html:html
<div class="form">
  <div class="form-item">
    追従する要素
  </div>
</div>
```
CSSの記述は`position: sticky;`のみです。

```css:css
.form-item {
  position: sticky;
  top: 0;
}
```
これで完成です。
非常に簡単に実装できるので、よかったら参考にしてください。


#参考
https://www.miso.blog/css-position-sticky/
ネイティブ開発・Flutter開発を通じて感じた事。

## はじめに。
筆者は最近異業種からエンジニアに転職したばかりで業務歴は三ヶ月程初学者です。
初学者なりにネイティブ開発とFlutter開発を通して感じたことを書いてみました。
コードベースの解説と言うよりは感想が主になりますので、
Flutterのコード解説がみたい方は
[KBOYのFlutter大学 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/kboyflutteruniv)
こちらの他の記事の方が参考になるかと思われます。



## Flutterのメリット・ネイティブ開発のメリット

### Flutterのメリット

* 一度の開発でAndroid, iOS 2つのアプリをリリースする事ができる。
* Android, iOSで共通の見た目のアプリを開発することができる。
* ViewをDartコードで完結して開発できる(storyboardやxmlを使わずに済む)
* 宣言的UIフレームワークで直感的にViewを書くことができる。
* ホットリロードと呼ばれる機能を使う事で、コードを更新しても再ビルドせず挙動を確認する事ができる。
* 公式ドキュメントが充実していてわかりやすく、初学者でも開発がしやすい。



### ネイティブ開発のメリット

* 環境構築などの必要はなく、Android StudioやXcodeを導入すれば即開発する事ができる。
* 各ネイティブにマッチしたView開発を行う事ができる。
* Kotlin・SwiftがDartに比べてイケている。
* 歴史があり、ドキュメントが豊富である。
* 最新機能をいち早く使用して開発する事ができる。



## Flutterのデメリット

* 環境構築が通常のネイティブ開発に比べて難しい。
* ネイティブ開発に比べて、アプリサイズが大きくなってしまう。
* ドキュメントは日本語ではなく、基本的に英語である。
* 公式ドキュメントが充実しているものの、少し変わったことを調べようとすると歴史が浅いため、記事が見つからない場合がある。
* 端末に依存した機能を使う場合は、ネイティブのコードを書く必要がある。


ざっくりではありますが、上記のようなものが挙げられます。

ではFlutterはダメなのか？と疑問に思う方もいらっしゃるかと思いますが、

これに関しては**全くそんなことはない**と言えます。



## Flutterはなぜ良いのか。

最初に述べたことの重複になりがちではありますが、
やはり一度の開発で各ネイティブ向けアプリを作成できるというのは大きく、
二回開発する事に比べ、**大きく時間を短縮する事ができます。**

そしてホットリロード機能により、
毎回**再ビルドせずとも挙動確認ができる**ので、
とても快適に開発する事ができます。

私自身アプリ開発をしてみたいと思い、
一番最初にAndroidネイティブから勉強を始めたのですが、
ビルドが重たくネイティブアプリ開発がwebアプリ開発に比べ、
楽しく開発することが出来なかったなどの様々な理由で**早々に挫折しました。**

その後Flutterに出会い、改めてアプリ開発を学ぶ事になるのですが、
Flutterは宣言的UIフレームワークのおかげで直感的にViewを記述する事ができることや、ホットリロードのおかげで**楽しく開発を行う事ができました。**

今では**Flutterで開発をした経験を活かしてネイティブ開発を行うこともできる**ようになったので、初学者の方には本当にオススメです。

ネイティブ依存機能対応に関してですが、
逆に言えばネイティブ依存以外**全て共通のコードで実行する事ができる**ので、あまり気にする必要はないかと思います。

ドキュメントは基本英語になるという事に関しても私の肌感ではありますが、
Androidネイティブも日本語の記事がそこまで記事が充実しているとは思えず、
少し変わったことを調べる場合はやはり英語ドキュメントを探す事になりがちで、ここに関しては誤差かと思います。
エンジニアになる以上、**英語からは逃げられない**みたいなところもありますので。



## まとめ

### Flutter

* スタートアップ企業や個人でアプリをリリースしたい方にオススメ
* 公式ドキュメントが充実しているので初学者も学びやすい。
* ホットリロードが凄い！！！



### ネイティブ開発

* 会社として大きく、Android, iOS両エンジニアを雇う余裕があり、UIを共通化する事に重きを置いておらず、各ネイティブに最適化された見た目の凝ったUIを作りたい場合
* ネイティブに大きく依存した機能のアプリを作りたい場合
* 最先端の機能をいち早く使いたい場合



## 最後に。

環境構築が難しかったりドキュメントが英語ベースのFlutterですが、

[KBOYのFlutter大学](https://www.youtube.com/channel/UCReuARgZI-BFjioA8KBpjsw)なら環境構築やアプリ開発の解説等を**無料で見る事ができます。**

更に詳しく質問等をしたい方は[サロン](https://kboyflutteruniv.com/)に入会する事で直接回答をしてもらう事ができますし、同じFlutterを学ぶ仲間を作る事もでき、最近では**サロン生同士による共同開発も積極的に行われています。**

興味のある方は以下から是非ご参加下さい！！

KBOYのFlutter大学：https://www.youtube.com/channel/UCReuARgZI-BFjioA8KBpjsw

KBOYのFlutter大学オンラインサロン：https://kboyflutteruniv.com/

<br>

<br>

ここまで読んで頂き、ありがとうございました。
UFTのGUIテストのパフォーマンスを向上するための4つのポイント

UFT Oneで作成したGUIテストのパフォーマンスを向上させるためのポイントをまとめてみました。

#ポイント１：UFT起動時に、必要なアドインのみロードする
UFT起動時に、ロードするアドインを選択することができます。
「もしかしたら必要になるかもしれない・・・」とつい余計なアドインもロードしてしまうこともあるかもしれませんが、思い切ってチェックを外してみましょう。
※あとからロードするアドインを追加することができますのでご安心を。

ロードするアドインが少なくなればなるほど、オブジェクトの学習と実行セッションの両方が高速化されます。

#ポイント２：テスト実行の実行モードを高速に設定する
テスト実行の実行モードには、「標準」と「高速」の2種類が存在します。
高速に設定することで、各ステップの実行矢印を表示せずにテストまたはコンポーネントを実行するようになり、テストまたはコンポーネントをより高速に実行できるようになります。

#ポイント３：スクリーンショットを取得するタイミングを制限する
スクリーンショットを取得するタイミングをエラーが発生した場合に限定する、またはスクリーンショットを取得しないようにすることで、ディスク容量を削減し、テストの実行時間を改善することができます。
スクリーンショットを常に取得する設定をしている場合、容量もそれなりになってしまい、レポート表示にも時間がかかってしまう場合があります。

#ポイント４：テストのアクションの数を減らす
UFTは、一つのテストに複数のアクションを作成できます。
このアクションを多く作成してしまうと、UFTからテストを読み込んだ場合や、テストコードを修正して保存した際に、UFTが重くなってしまいます。
数十を超えるアクションは使用しないようにし、再利用可能アクションではなく、関数ライブラリに保存することで、パフォーマンスを向上することができます。

#さいごに
GUIテストのパフォーマンスを向上するポイントをいくつか紹介しました。
ポイント１～３については、テスト実行に関するポイント
ポイント４については、テスト作成に関するポイント
となっています。

なにかのヒントになれば幸いです。
【Python】学校の課題はPythonに投げ込もう【効率化】

#はじめに
現在自分は高校1年で、
コロナ禍で暇になった自分はPythonを勉強し尽くし、
夜通しでJavaや、Elixirの勉強をしはじめた為学校の宿題が...
やっぱり効率化のPythonということで、学校の宿題もなげこもうと思いました。
コードの効率性、速度の面で違和感を持つかもしれませんが、温かい目で見ていて頂けるとありがたいです。


#作文

**テーマ:あなたにとって美術とは**
これはPythonに書かせるべきだなって思った。
自然言語処理も多少勉強していたため、Mecabを使って分かち書きをして、
複数のモデル文章からマルコフ連鎖によって新しい文章を生産した
Pythonには便利なことにmarkovifyというモジュールが存在し、
分かち書きした文章を処理するのに用いた。

```python

import MeCab
import markovify 
text = ''
parse_text = MeCab.Tagger('-Owakati').parse(text)

text2 = ''
parse_text2 = MeCab.Tagger('-Owakati').parse(text2)

text_model = markovify.Text(parse_text)
text_model2 = markovify.Text(parse_text2)

comb_model = markovify.combine([text_model,text_model2],[1,1])
 
for _ in range(8):
    print(comb_model.make_sentence())

```

これで生産した文章が

```
美術は自分の感性で作り上げることに意義があるのであり、学校で教える美術ではない。
```
と喧嘩を売る内容になってしまい、成績は案の定3/10だった。
![122DE3D7-2F1E-488C-8B21-B37B05CCBC1F.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600026/e03ae935-efa8-909e-d359-17234bff5336.jpeg)


#一言で表しづらい英語の課題
###課題内容
とあるアプリを使って、読まれた日本語を英語に翻訳して読み上げる
または、英語をそのまま読み上げるものがある。
###プログラムのロジックを考える
まずは音声認識をするプログラムを構築して、
英語で読み上げる時、日本語で読み上げる時での処理を書かなきゃいけない。

```python
import pyaudio
import wave
import speech_recognition
from playsound import playsound
from googletrans import Translator
from gtts import gTTS
translator = Translator()

def rcd():
    audio = pyaudio.PyAudio()
    stream = audio.open(format=pyaudio.paInt16,channels=1,rate=44100,input=True,input_device_index=0,frames_per_buffer=2**11)

    frames = []
    for i in range(0, int(44100 / 2**11 * 10)):
        data = stream.read(2**11)
        frames.append(data)

    stream.stop_stream()
    stream.close()
    audio.terminate()

    sFile = wave.open(sound.wav, 'wb')
    sFile.setnchannels(1)
    sFile.setsampwidth(audio.get_sample_size(pyaudio.paInt16))
    sFile.setframerate(44100)
    sFile.writeframes(b''.join(frames))
    sFile.close()

def to_text():
    r = speech_recognition.Recognizer()
    with speech_recognition.AudioFile(sound.wav) as src:
        audio = r.record(src)
    text = r.recognize_google(audio,key='Mykey',language='en-US')
    return text

def read_english():
    play_sound(‘sound.wav’)

def to_jp():
    text_data = to_text()
    trans_ja = translator.translate(text_data,src='en',dest='ja')
    return trans_ja

def read_ja():
    text_data = to_jp()
    tts = gTTS(text=text_data, lang='ja')
    tts.save('jp.mp3')
    play_sound('jp.mp3')

def main_jp():
    rcd()
    read_ja()

def main_en():
    rcd()
    read_english()

if __name__ =='__main__':
    mode = input('mode:')
    if mode == 'ja':
        main_jp()
    elif mode =='en':
        main_en()
    else:
        pass

```

これで課題を提出したところ
![DFD7C828-421C-4334-A48B-4A05813B4FB4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600026/f6d577cd-2f28-84f8-d6a3-403f9611ba76.png)
1/15しかパス出来なかった(T . T)
当然成績もズタボロでした。

#最後に
学校の宿題の自動化にはやはりモジュールの多さに優れているPythonが適していると思う。
もちろんこのことは担任から色々とお話しを聞かされたが、
これをきっかけにテストの成績もそこまで良くない自分にAO入試を薦めてくれた。
将来的に紙が使われなくなってきて、より電子機器の需要が高まれば、それに比例してプログラムの需要も高まるため、
Pythonは早いうちにやって損することはないなと感じました。b
emotionの書き方色々

## emotionとは？
[emotion-Introduction](https://emotion.sh/docs/introduction)
CSS in JSをするためのライブラリ
### 基本的な書き方
```vuejs
<style>
.hoge{
  color: red;
}
</style>
```

```tsx
import { css } from 'emotion'

const hoge = css`
  color: red;
`
```

### 疑似クラスを置き換える
```vuejs
<style>
.hoge{
  color: red;
}
.hoge:hover{
  color:green;
}
</style>
```

```tsx
import { css, cx } from 'emotion'

const hoge = css`
  color: red;
  &:hover {
    color:green;
  }
`
```
### 疑似要素を置き換える
```vuejs
<style>
.hoge{
  color: red;
}
.hoge::before{
  color:green;
}
</style>
```

```tsx
import { css, cx } from 'emotion'

const hoge = css`
  color: red;
  &::before{
    color:green;
  }
`
```
### composesを置き換える
```vuejs
<style>
.hoge{
  margin: auto;
  padding: 0;
}
.hogehoge{
  composes: hoge;
  padding-bottom: 10px;
}
</style>
```

```tsx
import { css, cx } from 'emotion'

const hoge = css`
  margin: auto;
  padding: 0;
`
const hogehoge = cx(hoge, css`
  padding-bottom: 10px;
`)
```

### keyframeを置き換える
```vuejs
<style>
.square {
  animation: loader 2s infinite ease;
}
@keyframes loader {
  0% {
    transform: rotate(0deg);
  }
  50% {
    transform: rotate(180deg);
  }
  100% {
    transform: rotate(360deg);
  }
}
</style>
```

```tsx
import { css, keyframes } from 'emotion'

const loader = keyframes`
  0% {
    transform: rotate(0deg);
  }
  50% {
    transform: rotate(180deg);
  }
  100% {
    transform: rotate(360deg);
  }
`
const square = css`
  animation: ${loader} 2s infinite ease;
`
```
### Modernizrを使っている場合

```vuejs
<style>
.hoge{
  background-image: url('~assets/img/hoge.webp');
}
.no-webp .hoge{
  background-image: url('~assets/img/hoge.png');
}
</style>
```

```tsx
import { css } from 'emotion'
const hoge = css`
  background-image: url('~assets/img/hoge.webp');
  .no-webp & {
    background-image: url(${require('~/assets/img/hoge.png')});
  }
`
```
【備忘録】タイタニック号のデータを完璧に前処理したい

## 目的

Python初心者でタイタニック号の生死判定の宿題が出ましたので
前処理を完璧にするにはどうしたらいいんだろう・・・？という
自己満足の備忘録です。

## 与えられたデータ
元のデータをDataFrameに入れるとこんな感じです。

| PassengerId |Survived |Pclass |Name |Sex |Age |SibSp |Parch |Ticket |Fare |Cabin |Embarked|
|:-:|:-:|:-:|:-----:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|1 |0 |3 |Braund, Mr. Owen Harris |male |22.0 |1 |0 |A/5 21171 |7.2500 |NaN |S|
|... |... |... |... |... |... |... |... |... |... |... |... |
|891 |0 |3 |Dooley, Mr. Patrick |male |32.0 |0 |0 |370376 |7.7500 |NaN |Q|

ちょっと書くのめんどくさいんで最初と最後だけ。
皆が知ってるタイタニック号の学習用データです。
df.info()で情報を見ます。

```
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 10  Cabin        204 non-null    object 
 11  Embarked     889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
```
全データは12×891、Age,Cabin,Embarkedで欠損があるのと、
Name,Sex,Cabin,EmbarkedはObject（文字列）なのでこのままでは使えません。

## SexとEmbarkedをObjectから数値に
たぶん全員やってるであろう処理です。
今回はこれをやってからランダムフォレストにかけて、それを基準にしたいと思います。

```python
# Sex を数値化
df['Sex'] = df['Sex'].map({'male':0, 'female':1})
# Embarked を数値化
df['Embarked'] = df['Embarked'].map({'S':0, 'C':1, 'Q':2})
# Age は欠損値を埋めるため、とりあえずを平均値で補完 
df['Age'] = df['Age'].fillna(df['Age'].mean())
# Embarked はとりあえず一番多いS(0)で補完
df['Embarked'] = df['Embarked'].fillna(0)

# ObjectのままのName,Ticket,Cabinはとりあえずなしでデータを作成
df_data = df[['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']]
df_label = df[['Survived']]

(train_data, test_data, train_label, test_label) = tts(df_data, df_label, test_size=0.3, random_state=0)
# train_test_split=ttsとしてます

clf = RFC()　# RandomForestClassifier=RFCとしてます
clf.fit(train_data, train_label)
clf.score(test_data, test_label)
```

今回データの前処理だけのビフォーアフターが見たいので
パラメータとかはdefaultのままです。

結果は・・・
>0.8134328358208955

ちょっと基準が高かったです。。
これ以上高みを目指せるのでしょうか。。。

## Ageの欠損値を埋めたい
年齢で生死が分かれるかというとそうじゃないと信じたいですが
とりあえず何かのデータで大体の年齢がわかったら嬉しいなと思いました。

##### まず既知のAgeとの相関関係を見てみる
dropnaでAgeの欠損値を抜いたものを、df.corr()で相関係数を見てみる。

| | PassengerId |Survived |Pclass |Sex |Age |SibSp |Parch |Fare |Embarked|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|Age |0.033207 |-0.069809 |-0.331339 |-0.084153 |1.000000 |-0.232625 |-0.179191 |0.091566 |0.007461|

こう見るとPclass,SibSp,Parchが相関高そう。


途中まで・・・


##### 感想
・記事の書き方もプログラマ仕様というか、Wordのような簡単なものではなかったので
　まず書き方を調べるところから始めた。
・コードは普段自分が適当に書いていたりするので、わかりやすいコード記述というのが結構難しかった。
・M-1優勝嬉しい。

## 追記(2020/12/24)
クリスマスイブだけど！
続きを書きました！[→続き←](https://qiita.com/hamco/items/29287c55f00c6e0567c3)
SSHキーを指定してgit clone する

# 結論
以下のコマンドで利用するSSHキーを指定してgit cloneできる

```
GIT_SSH_COMMAND="ssh -i ~/.ssh/deploy.key" git clone git@xxxxxx
```

# シチュエーション
サーバーにgitからソースを持ってこようとして、すでにあったssh鍵を、githubのリポジトリにDeployKeyとして登録しようとしていたが、なぜかすでに他のリポジトリにDeployKeyとして登録してあったらしく保存できなかった。
仕方がないので、別にSSH鍵を作成しDeployKeyとして登録したものの、当然それだけではgit cloneする際に鍵が切り替わらないので↑の方法で解決。

いろんな経緯で、すでにあるサーバーをそのまま利用するハメになったので上のような変な状況になったが、通常は必要ないんじゃないかな。
githubで草が生えない時の忘備録

こちらは自分のための忘備録となっております。
あまり参考にならないので申し訳ございません。

1自分の登録されてるメールアドレスの確認

```
git config user.email
```
2githubのメールアドレスの登録

```
git config user.email xxxx.@xxx.com
```
以上です。
契約書を読みやすくする君 を作りました。(甲→僕、乙→君)

## 契約書を読みやすくする君

* [作ったもの](https://tukiyo.github.io//program/2020-12-22_kimitoboku/)
    * サーバーに結果を保存しないのでお気軽にご利用ください。

## 使い方

* 上の文章は自由に書き換えてご利用ください。
* 「元」を押すとそのまま出力します。
* 「変換」を押すと置換されて出力されます。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/d516beef-94ae-05e7-4abf-765342fd05b9.png)



## 技術的なこと。

### JavaScript での改行付きヒアドキュメント

```js
var heredoc = function() {/*
改行つきの
文章を
ここに
書いて。
*/}.toString().split(/\/\*|\*\//)[1];
heredoc = heredoc.replace(/\r\n|\n|\r/g, '<br>');
var txt = document.getElementById("txt");
txt.innerHTML = heredoc;
```

### 編集可能なエリア

初めはtextareaにしていたが、WEBページからのコピペだと改行が消えたので以下の方法にしました。

* contentEditable=true
* overflow:scroll

```html
<div id="txt" contentEditable=true style="overflow:scroll;" ></div>
```

### css

見栄えについて、[newcss](https://newcss.net/)というのが良さそうだったので使ってみました。


----

## きっかけ

* 以下を見て感動したため。
    * [契約書の「甲・乙」を「僕・君」に変換したら… やれやれ。 村上春樹を感じる文書になったよ！/ライフ/社会総合/デイリースポーツ online](https://www.daily.co.jp/society/life/2019/07/30/0012562853.shtml) 
* サンプルは以下から拝借しました。ありがとうございました。
    * [コンサルティング契約書のひな型　【無料・商用利用可能】｜竹永　大 / 契約書のひな型と解説｜note](https://note.com/takecyan/n/nd3dc7a6412c3)
20世紀的視点のgithubのメモ

コロナウィルス関係のオープンデータがgithubで公開されているので、それを使うためのメモ


## オープンデータ
|名称  |URL  |
|---|---|
|Johns Hopkins CCSE| https://github.com/beoutbreakprepared/nCoV2019|
|東京都 新型コロナウイルス感染症対策サイト|https://github.com/tokyo-metropolitan-gov/covid19|
|東洋経済オンライン 国内感染状況|https://github.com/kaz-ogiwara/covid19|


## リポジトリをcloneする

- [「.git」ディレクトリを別の場所に指定して複製する](https://www.atmarkit.co.jp/ait/articles/2003/06/news019.html)


```
git clone remote_url [Directory name]
```

## git pull

　リモートリポジトリの変更内容を取り込むには、作業ディレクトリ（.gitの親ディレクトリ）で、「git pull」を実行します


# リファレンス

- [今日からはじめるGitHub 〜 初心者がGitをインストールして、プルリクできるようになるまでを解説](https://employment.en-japan.com/engineerhub/entry/2017/01/31/110000)
- [Githubに接続できない時の対処法](https://qiita.com/nyanchu/items/32d65c4c36315b876d38)
-
デジタルフォトフレーム　


写真の展示で動画を一緒に展示したかったので、フォトフレームを調査。

https://my-best.com/841

Onlydroid
7インチ デジタルフォトフレーム
デジイチの写真が美しく映える
アスペクト比16：9で、デジタル一眼レフの写真がとても美しく映える商品です。普段、写真はデジイチで撮影しているという方には非常におすすめ。人感センサーを搭載しており、人の動きを感知したときだけ電源オンとなるため、無駄なく使えてとっても便利です。


[FamBrow デジタルフォトフレーム 10インチ 1920*1080高解像度 IPS視野角 写真/動画/音楽再生 時計/カレンダー/アラーム/スライドショー機能付き USBメモリー/SDカード 遠隔操作 リモコン付き 日本語取扱説明書 PSE認証済み](https://www.amazon.co.jp/FamBrow-%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB-%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A01920-1080-%E3%83%90%E3%83%83%E3%82%AF%E3%83%A9%E3%82%A4%E3%83%88/dp/B07V3SPT84/ref=psdc_675721011_t2_B087F2FWZB)