OmniAICreator/Qiita-1.07M huggingface dataset:
タイルサーバーを作りたい

# ドローンの航空写真からタイル画像を作成するサーバーを作りたい

OpenArerial Mapで十分利用可能だが、自分専用のタイルサーバが欲しくなったので、DRONEBIRD専用のタイルサーバを作ってみようと思う。
他にも、オープンデータで公開された自治体の航空写真を取り込むことによりWebでの二次利用ができればと思っています。

## タイル画像とは

ズームレベルごとに地球を分割。各タイルを256x256pixcelに分割しブラウザで地図を見るときの通信量を絞る機能
詳しい内容は、説明URLを参考に [正方形タイルによる地図の表現:TrailNote](https://www.trail-note.net/tech/tile/)

## どうやって作るのか

### QGISを使う場合

QGISのプラグインのQMetaTileツールを使って作成

### GDALツールを使う場合

GDALのgdal2tilesを使って作成 [gdal2tiles](https://gdal.org/programs/gdal2tiles.html)

```plaintext

gdal2tiles.py [-p profile] [-r resampling] [-s srs] [-z zoom]
              [-e] [-a nodata] [-v] [-q] [-h] [-k] [-n] [-u url]
              [-w webviewer] [-t title] [-c copyright]
              [--processes=NB_PROCESSES]
              [-g googlekey] [-b bingkey] input_file [output_dir]
```

## なんちゃってOpenAerialMapを目指して

### いままで作った作品

毎年2月に実際される杉戸町の防災訓練にてドローンを飛ばしてQGISでタイルを作ってからディレクトリごとSFTPにてサーバーにアップしてました。この手業にて作成したのが下記のサイトです。

　[杉戸町防災訓練](http://sugito.code4saitama.org/)

## どういう機能が必要なのか
h
### まず作るもの

* GeoTIFFのアップロード
    * GeoTIFFから情報を取得（測地系、投影、緯度経度情報等）
    * タイル画像にタイトルを付与
    * 切り出すタイルのズーム指定
    * タイルのライセンスを指定


* タイルの切り出し
    * タイルの切り出しディレクトリを作成
    * タイルの切り出し処理
    * タイルのURLを作成
* タイルのURLを表示し閲覧可能にする
    * タイル外の画像に対する処理
        * mod_rewriteによる処理
    * タイルURLを外部から使えるようにする
    * OSMでの編集リンクの作成　iDのみ
    * もとのGeoTIFFをダウンロードできるようにする

* LeafletもしくはMapboxにてタイルのレイヤーを閲覧できるようにする


### 現時点で作らない機能

* アカウント処理（一律で公開します。個別対応しません）
* 削除機能（消したかったら僕が連絡後、直接サーバーで対処します。）

### 使用する言語やサーバー環境など

#### 開発環境

* Virtualbox(CentOS 7系)

* インフラ側
    * apache (リバースプロキシーとして）
    * Django + Geo拡張
    * Postgresql + PostGIS (GdalはPostGISに同梱されるものを使用）

* フロント側
    * Python 3.7
    * Leaflet
    * Javascript 

など

##### geotiffの情報取得

[gdalinfo](https://gdal.org/programs/gdalinfo.html)

```text

gdalinfo ~/openev/utm.tif
Driver: GTiff/GeoTIFF
Size is 512, 512
Coordinate System is:
PROJCS["NAD27 / UTM zone 11N",
    GEOGCS["NAD27",
        DATUM["North_American_Datum_1927",
            SPHEROID["Clarke 1866",6378206.4,294.978698213901]],
        PRIMEM["Greenwich",0],
        UNIT["degree",0.0174532925199433]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",-117],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",0],
    UNIT["metre",1]]
Origin = (440720.000000,3751320.000000)
Pixel Size = (60.000000,-60.000000)
Corner Coordinates:
Upper Left  (  440720.000, 3751320.000) (117d38'28.21"W, 33d54'8.47"N)
Lower Left  (  440720.000, 3720600.000) (117d38'20.79"W, 33d37'31.04"N)
Upper Right (  471440.000, 3751320.000) (117d18'32.07"W, 33d54'13.08"N)
Lower Right (  471440.000, 3720600.000) (117d18'28.50"W, 33d37'35.61"N)
Center      (  456080.000, 3735960.000) (117d28'27.39"W, 33d45'52.46"N)
Band 1 Block=512x16 Type=Byte, ColorInterp=Gray

```

取得して必要なのは、測地系、中心位置、地図の範囲です


##### iDでのリンクの作り方 

```text
http://www.openstreetmap.org/edit?editor=id#map={zoom}/{中心緯度}/{中心経度}&background=custom:https://example.com/path/to/{z}/{x}/{y}.png

のリンクを作成
```


### 作ったものをGitHubにて公開


## 今後やりたいこと
 * 大容量ファイルのアップロードの工夫
 * アプリのDocker版の作成
 * DB連携
【Git Bash】ローカルへのコミットからリモートへのプッシュまでをバッチ処理するシェルスクリプトを作成

#1.この記事について
###こんなケースを想定。
《ある程度定型的なコミット-プッシュ処理をバッチ的にまとめて処理したい》
《コミットのコメントをいちいち打つのが面倒なので自動的に差分内容を反映させたい》

これを使えばちょっとは楽になるかもしれない。

#2.やりたいこと
・add,commit,pushまでのバッチ処理
・コメントの自動挿入（日付＋差分内容）
・上記内容を網羅したシェルスクリプトの作成

#3.使用したツール・環境
・Windows10
・git version 2.23.0.windows.1
・GitBash

#4.作成したコード

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

#例外処理
#参考URL:https://cloudpack.media/532
set -e
trap 'echo NG' ERR

#バージョン管理しているフォルダに移動
cd /c/Users/username/versionControlDirectory

git add -N .

git add .

#コメント内容作成
#現在時刻格納
foo=$(date "+%Y%m%d_%H%M")

#前回のコミットに対する差分格納
bar=$(git diff HEAD --stat)

#文字列として連結
foobar="${foo} __ ${bar}"

git commit . -m "$foobar"

git push origin master

```

上記に作成したshファイルを
下に格納します（環境によってしまう場所が違うかも。gitbashのパス変数の管理下ならどこでもいいかもしれない）。
C:\Program Files\Git\usr\bin

→パスが通ってるので
GitBashのコンソールでタブキーで補完可能になる。

<br>
実際に実行すると下のGithubのようにプッシュできた。
[https://github.com/dede-20191130/MyExcelVBA/blob/master/GitBash%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%83%86%E3%82%B9%E3%83%88/test.txt](https://github.com/dede-20191130/MyExcelVBA/blob/master/GitBash%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%83%86%E3%82%B9%E3%83%88/test.txt)

#5.コードの解説

fooとbarに載せたいコメントを格納して、
連結したfoobarを-mの引数として取る。

例外処理は下記のサイトをご参考させていただいた。
[https://cloudpack.media/532](https://cloudpack.media/532)


#5.5.Powershellスクリプトでも同じようなものを作成してみた
PycharmのターミナルエミュレータをわたしはPowershellにしているので、
Pycharmでの定型的なプッシュを楽にするために、
以下のようにスクリプトを組んでみました。

```powershell:easyPush.ps1
Param( $selectedPath)

try
{
    
    $selectedAbsPath = (Resolve-Path $selectedPath).Path
    $currentDir = (Resolve-Path .).Path

    Write-Host $selectedAbsPath + 'に対してバッチ処理します。'

    cd $selectedAbsPath
        
    git add -N .

    git add .

    #現在時刻格納
    $foo = Get-Date -Format 'yyyyMMdd_HHmm'

    #前回のコミットに対する差分格納
    $bar=$(git diff HEAD --stat)

    #文字列として連結
    $foobar = $foo + '__' + $bar

    git commit . -m $foobar

    git push origin master

    Write-Host '正常終了'

}
catch [System.Exception]
{
    Write-Host "エラーが発生しました。"
}

finally
{
    Write-Host "プログラムを終了します。"
    #元の階層に戻る
    cd $currentDir
}
```

#6.終わりに

コーディングは下の便利なサイトを利用しました
（Pycharmも買ったんだけれどプロジェクト切り替えがめんどくさい）
[https://www.jdoodle.com/test-bash-shell-script-online/](https://www.jdoodle.com/test-bash-shell-script-online/)

なにか補足がありましたらコメントください。
Raspberry Pi ZeroWにROSをインストールする

# 目的

Raspberry Pi Zero W(H)にROSをインストールする。

ROSのインストールなんてaptで簡単だろうと思っていたが、思いのほか大変なことになったので、これだけで独立してメモ。
意外と時間がかかってしまった。

# OSインストールがんばる

どうも、UbuntuはZeroに対応していないようなので、Raspbianをインストールする。
バージョンは、リリース日2019-09-26のSeptember 2019のRaspbian Buster Liteを使った。
ディスプレイとキーボードを必要としないやり方で設定してみる。参考にしたサイトは、[こちら](https://qiita.com/hishi/items/8bdfd9d72fa8fe2e7573)
ただし、Windowsだともう一つ手順が必要で、[こちら](https://chigusa-web.com/ラズパイzeroをモニターなしでセットアップ/)と[こちら](https://caron.ws/diy-cartes-microcontroleurs/raspberrypi/pi-zero-otg-ethernet/)も参考にした。
Windows用のドライバを入れなおすところ。
もちろん、インストールしたらapt updateとapt upgradeはやっておく。

# ROSインストール

単純にパッケージをaptで入れようとしてもうまくいかない。パッケージが壊れてる的なことを言われるので、ソースからインストール。
[ここ](http://asukiaaa.blogspot.com/2018/06/raspberry-pi-raspbianstretchrosmelodic.html)を参考に、パッケージインストールとコンパイルを順番に実行していく。

ROSのベースだけ入れたいので、ros_commのインストール手順に従ってやっていく。

リンク先の記事で問題になっていたros_graphの問題は、ros_comm対象だったからか、なんらか修正がはいっているかで、特に問題なし。

tinyxml2とpython-opencvのバージョンも以下の通りで、問題ないよう。

```
pi@raspberrypi:~/ros_catkin_ws $ apt-cache show libtinyxml2-dev | grep Version
Version: 7.0.0+dfsg-1
pi@raspberrypi:~/ros_catkin_ws $ apt-cache show python-opencv | grep Version
Version: 3.2.0+dfsg-6
```

手順としてはそのままで、無事roscoreが動いた。

```
pi@raspberrypi:~/ros_catkin_ws $ roscore
... logging to /home/pi/.ros/log/5f885066-1b78-11ea-a9b7-8aadcc980d4d/roslaunch-raspberrypi-17595.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://raspberrypi:35035/
ros_comm version 1.14.3


SUMMARY
========

PARAMETERS
 * /rosdistro: melodic
 * /rosversion: 1.14.3

NODES

auto-starting new master
process[master]: started with pid [17605]
ROS_MASTER_URI=http://raspberrypi:11311/

setting /run_id to 5f885066-1b78-11ea-a9b7-8aadcc980d4d
process[rosout-1]: started with pid [17616]
started core service [/rosout]
```
Pythonでファイルを並列に読み込む

#これはなに
備忘録です。
#更新記録
2020/5/21 python3.8に関する記述を追記
#環境
- Python 3.6.3
- MacOS Mojave 10.14.6

#やりたいこと

```sample.py
import os

def hoge(filename):
  #ファイルを読み込んで、なにかしらの処理をする。
  return data

data = [hoge(filename) for filename in os.listdir(".")]
```

というような処理をしたいのですが、このコードをそのまま回すと、コアを1つしか使ってくれないので、時間が非常にもったいないです。
並列でやりたい。

#並列処理

```sample.py
from multiprocessing import Pool
import os

def hoge(filename):
  #ファイルを読み込んで、なにかしらの処理をする。
  #この関数はそのままでよい
  return data

with Pool() as p:
    data = p.map(hoge, os.listdir("."))
```

で並列に動きます。

#ついでにプログレスバーも

```sample.py
from tqdm import tqdm
from multiprocessing import Pool
import os

with Pool() as p:
    imap = p.imap(hoge, os.listdir("."))
    data = list(tqdm(imap, total=len(os.listdir("."))))
```

#Python3.8について
なんでだか動かなくなっています。暫定的な対応ですが、

```sample.py

from multiprocessing import Pool
import os

def hoge(filename):
  #ファイルを読み込んで、なにかしらの処理をする。
  #この関数はそのままでよい
  return data

if __name__=="__main__":
    with Pool() as p:
        data = p.map(hoge, os.listdir("."))
```
とすることで動くみたいです。ただし、せっかく作った```data```変数は```if __name__=="__main__"```のスコープ内でないと参照できないようです。

また、以前はJupyter上でも並列実行が可能でしたが、Python3.8では不可能になっています。
自作キーボードでマウスを操作する取り組みについて

この記事は [キーボード #1 Advent Calendar 2019](https://adventar.org/calendars/4117) の11日の記事です。

## 前置き 〜私のキーボードとマウス事情〜
私は普段仕事では[Corne Chocolate](https://yushakobo.jp/shop/corne-chocolate/)をMacBook Proに乗せて使っています。
ほとんどのマウス操作はキーボードで行いますが、一部ピンチ操作が必要になる場面でMacBook Proのトラックパッドを使うというスタイルです。

MacBook Proのトラックパッドは様々な操作がシンプルに統合された画期的な入力デバイスで、多くのインスピレーションをもらっていますが、自分の場合は下記のような問題があります。

* `コーディング中に手に汗をかいていて、トラックパッドの反応が悪くなってしまう`
* `手の甲がタッチパッドに当たって誤操作してしまう`
* `MacBook Proの上に置いてもトラックパッドまで親指を伸ばすとちょっと遠い` (これはキーボードとトラックパッドの位置の最適化で解消する余地はありそうですが:sweat_smile:)

マウス操作もキーボードでできたら快適に操作できそうだ、と思いましたので
マウスの操作性を重視しながらファームウェアをカスタマイズしています。

なお、QMKの`Mouse Keys`の機能はデフォルトの動きだと操作性があまり快適に感じられなかったので、[マウスポインタを質点とみなし、物理シミュレーションでなめらかにマウスを動かせるようする](https://github.com/nemolize/qmk_firmware/commit/4eee1d2cd6933a6910353cd588516f6dd292c484)みたいな変更を入れてカスタマイズしています。(取り急ぎコミットのリンクだけ恐縮ですが、いずれQMK本家にPR出したいと思っています:smile:）

## キーでマウスを操作する際の問題点

さて、キーボードだけでポインティングデバイスをエミュレートする場合、いくつかの問題があります。

### 問題1. レイヤーとキーを消費する
これは当然なのですが、ざっと考えただけでも、一般的なマウスのオペレーションをする上で、下記のキーが必要になります。

#### 移動
* `KC_MS_UP`
* `KC_MS_DOWN`
* `KC_MS_LEFT`
* `KC_MS_RIGHT`

#### スクロール
* `KC_MS_WH_UP`
* `KC_MS_WH_DOWN`
* `KC_MS_WH_LEFT`
* `KC_MS_WH_RIGHT`

#### クリックボタン
* `KC_MS_BTN1` (左クリック)
* `KC_MS_BTN2` (右クリック)
* `KC_MS_BTN3` (中クリック)

移動とスクロールは、別のレイヤーにしつつ、それぞれ同じ物理キー（例: `ASDW`, `ESDF` や `HJKL`など）を使うということも可能ですが、ボタンはドラッグ操作を可能にするのに、マウス移動と同時に押せる位置であることが求められます。

このように、マウス機能が消費する物理キーは決して少なくないため、
その分レイヤーと物理キーの組み合わせの選択肢が減ってしまうことになります。

### 問題2. マウスカーソル動かすたびにキーがカチャカチャなる
キーを押してマウス操作をする以上、これはある意味仕方ないのですが
騒音の問題もありますし、できれば静かな方がいいですよね

### 問題3. ファームウェアサイズやソースの可読性の問題
秒間60Hz, あるいは144Hzのスピードでマウスカーソルの質点力学シミュレーションを行うには、それなりに高精度な数値計算が必要になります。
そのため`float`もしくは`固定小数点数`を使う必要がありますが
`float`を使うとファームウェアのサイズが肥大化したり、ProMicroの`ATmega32U4`はFPUを持っていないため、処理速度の懸念もあります。
また、固定小数点数の場合は、サイズや速度の懸念は少ないものの、範囲外の値で容易に計算精度が破綻したり、値の変換処理が必要となるため、ソースが煩雑になるという問題が伴います（自分のソースがこれですね。頑張って解決したいです…！）

## そこで、キーボードにポインティングデバイスを搭載
上記の問題を解消するために、自分もポインティングデバイス搭載のキーボードを設計して作ってみたいと思っています。

その上で、先人の方のポインティングデバイス内蔵の試みの記事が大変参考になったので、
いくつか紹介させていただきたいと思います。

[自作キーボードHelixにトラックポイントを付ける その1](https://tech.buty4649.net/entry/2018/03/27/124755)
[自作キーボードHelixにトラックポイントを付ける その2](https://tech.buty4649.net/entry/2018/12/07/115407)
[自作キーボードHelixにトラックポイントを付ける その3](https://tech.buty4649.net/entry/2018/04/17/122112)
Helix KeyboardにThinkPadのトラックポイント部品を移植するという内容です。
リセット回路の制作が必要だったり、既存のトラックポイント部品を使うと
何かとワークアラウンドが必要のようですね。
入手性の問題はありますが、トラックポイントはすごい使いやすそうですよね・・・！

[Helixの親指拡張を作った](https://yskoht.hatenablog.com/entry/2018/05/01/011027)
Helix Keyboardに、モジュールとしてジョイスティックを追加するというアプローチがスマートですね！
ちゃんとフォームに名前入れたのに、Mysql2::Error: Field 'nickname' doesn't have a default value: INSERT INTO 言われた

#前置き
deviseを導入して、rails g devise:installで設定ファイルをrailsアプリケーションに作成。

```ruby:ターミナル
rails g devise:install
```

その後rails g devise userでdeviseのuserモデルを作成。

```ruby:ターミナル
rails g devise user
```

これでuser.rbやマイグレーションファイルなどができるので、nicknameカラムをnull: falseで追加。そしてrake db:migrate。

```ruby:XXXXXXXXXXXXX_devise_create_users.rb
t.string :nickname, null: false

```


```ruby:ターミナル
rake db:migrate
```
元々emailカラムとencrypted_passwordカラムが入ったdeviseのuserテーブルにnicknameカラムの入ったものが出来上がったので次に移る。




rails g devise:viewsでdeviseのviewを作成した後に、下記のようにnicknameのフォームを追加して、名前、email、パスワードをテーブルに新規登録するするフォームが出来上がった。

```ruby:ターミナル
rails g devise:views
```

```new.html.erb
<div class="field">
    <%= f.label :nickname %><br />
    <%= f.text_field :nickname, autofocus: true %>
</div>
```


#ここから本題
前置きが長くなってしまったけれど、詰まったところはここから。
全てのフォームに情報を入力し、signupを押すと、、
**Field 'nickname' doesn't have a default value**というエラーに。

※エラー画像はうまく画像が表示されないので割愛。


#原因
調べたら、nicknameが空だと言っていると判明。
ちゃんとデータとんでいるのになんで？
と思って調べたら、deviseのコントローラはデフォルトで入っているemailとパスワードのみを受け取るストロングパラメータが設定されているらしい。。ので、

```ruby:application_controller
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :configre_permitted_parameters, if: :devise_controller?

  def configre_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname])
  end
end
```

これでなんとかエラーは解消。usersテーブルにもデータ入ってるのを確認。

#まとめ
前半、書くこと忘れてdeviseの導入手順みたいになってしまったけど、必要なところは本題だけかなと。エラー画像Gyazo使って載せようとしたけれどなぜか載せれず。それを調べる気力がなくなってしまったので寝
Raspberry Pi Zero W へのDockerインストール

以前購入したRaspberry Pi Zero W を活用したいと思い、コンテナ環境を構築するためにDockerをインストールしました。その際の手順を備忘録として記載します。

本手順は公式ドキュメントを参考にしています。
[Get Docker Engine - Community for Debian](https://docs.docker.com/install/linux/docker-ce/debian/)

# 環境
- ハードウェア：Raspberry Pi Zero W

|項目 |値|
|---|---|
|CPU|シングルコア(1GHz)|
|メモリ |512MB RAM |
|ストレージ|8GB|
|ネットワーク|802.11 b/g/n|

- OS:Raspbian GNU/Linux 10
- Docker:
 
# 手順
### 古いバージョンの削除

```古いバージョンの削除.
$ sudo apt-get remove docker docker-engine docker.io containerd runc
```
>
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
パッケージ 'docker-engine' はインストールされていないため削除もされません
E: パッケージ containerd が見つかりません



### Docker Engine - Community　インストール

![Image 051.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543197/d19619a3-647c-eed3-a440-0aa657e6ee74.png)
Raspbianはリポジトリからのインストールに対応していないみたいですが、スクリプトが用意されているようです。
[Install using the convenience script
](https://docs.docker.com/install/linux/docker-ce/debian/#install-using-the-convenience-script)

```dockerのインストール.
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
```
インストールが完了すると下記のメッセージが表示されます。
非ルートユーザでDockerを使用する場合「docker」グループに追加する必要があるようです。
>
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:
>
  sudo usermod -aG docker your-user
>
Remember that you will have to log out and back in for this to take effect!

```dockerグループへの追加.
$ sudo usermod -aG docker pi
$ sudo reboot
```

```dockerバージョン確認.
$ docker version
Client: Docker Engine - Community
 Version:           19.03.5
 API version:       1.40
 Go version:        go1.12.12
 Git commit:        633a0ea
 Built:             Wed Nov 13 07:37:22 2019
 OS/Arch:           linux/arm
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.5
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.12
  Git commit:       633a0ea
  Built:            Wed Nov 13 07:31:17 2019
  OS/Arch:          linux/arm
  Experimental:     false
 containerd:
  Version:          1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

```

無事Dockerがインストールできました。
初期設定の覚書 git + Angular8 + AWS Amplify

# 要旨

タイトルのとおりです！

git + Angular 8 + AWS Amplify の環境構築に毎回悩むので自分用メモです。

# 適用順番

忘れないように、適宜 commit しながら。
それぞれ、インターネットから大量のファイルをダウンロードするので、やり直すのがめんどくさいです。

## 0. 初期設定
コマンド類　`ng` とか `amplify` が使えるようになっている想定です。
ng コマンドがインストールされていないとかは自分で解決を。

## 1. git Repository の作成

まずは、Repository を Web から作成します。

注意
`README.md` と `.gitignore` ファイルは、後で Angularによって作成されるので、ここでは作成しない。

## 2. git clone

`git clone https://github.com/****.git` コマンドで、ローカルリポジトリを作成して、ディレクトリに移動します。

`README.md` と `.gitignore` がある場合、削除しておきます。

## 3. Angular 8

`ng new` コマンドで、 Angular を 初期設定します。

自分自身のディレクトリにインストールするため
`ng new your-project-name --directory ./` でインストールします。


See also
https://angular.io/cli/new
https://github.com/angular/angular-cli/issues/5431

メモ
VS code の管理ファイルで `.editorconfig` ファイルが作成されますが、 `.gitignore` にないので追加。

## 4. AWS Amplify

AWS Amplify の 初期化を行います。

See also
https://aws-amplify.github.io/docs/cli-toolchain/quickstart#environments-and-teams

『Environments and Teams』を見る限り、 Amplify の environment name は git の branch 名と合わせるのが良さそう。

この段階で、 `develop` ブランチにチェックアウトしておきます。

`git checkout -b develop`

`amplify init`


完了後、 amplify 関係の `.gitignore` が追加されています。

なので、 `.gitignore` の更新。

注意
`The file will have its original line endings in your working directory`
どうやら、Amplify の追加する改行コードが不一致するみたいなので、改行コードを CRLF -> LF と修正することで、LFに統一。

`git add .gitignore`
`git commit`

## 備考：AWS を GitHubで安全に使うために。

github経由でシークレットキーを漏洩しないために、 `git-secrets` をインストールしておきます。

See also
https://github.com/awslabs/git-secrets
https://qiita.com/jqtype/items/9196e047eddb53d07a91

Windows でも問題なく動作します。
注意点としては、PATHを通すために、インストール後に再起動が必要。

使い方は、
`git secrets --install`
`git secrets --register-aws`

以上
機械学習のデータ（テキストor画像）前処理手法一覧 - 備忘録

# テキストデータ

* 特徴量選択
    * 手動
        * 類似する列項目の削除
        * 関連性の低い列項目の削除
    * 統計量ベース
        * データの統計量を確認し、ラベルごとのデータ数の乖離を小さくする
    * モデルベース
        * RFE
* 日付データの処理
    * 日付データをある時点からの経過時間のデータに変更する
    * 例：2019/1/2, 2019/1/3, 2019/1/4というデータがある場合、20191/2を基準値として1とし、左から順に1,2,3とする
* カテゴリ変数のフラグ化
    * one-hotエンコーディング
* 次元圧縮
    * 多次元配列構造のデータの次元削減
* データの分散の変換(http://ailaby.com/scaler/)
    * 標準化
        * 列方向を基準に「平均が0、標準偏差が1」になるように変換
    * 正規化
        * 列方向を基準に「最低が0、最高が1」になるように変換
* 欠損値処理
    * 欠損値補完
        * 平均値で補完
        * 中央値で補完
    * 欠損値を含む行の削除
* 不均衡データへの対応
    * オーバーサンプリング
    * アンダーサンプリング
    * SMOTE

# 画像データ

* 画像選択
    * 画像全体に対して被写体の占める割合が低い画像の排除
    * 被写体の分類ごとの全体に占める割合の調整（Weightの調整で対応することも可能だが、極端に差が出ないように調整する）
        * 例1: 分類において、データセット全体の画像枚数に対する各ラベルの画像枚数の割合
        * 例2: セグメンテーションにおいて、全体のピクセル数に対する各ラベルのピクセル数の占める割合
* ヒストグラム平坦化
* 次元圧縮
    * 二値化
* 枚数の増幅
    * 反転画像の作成
    * 回転画像の作成
    * 色相変換画像の作成
    * 縮尺変換画像の作成
* 平滑化
BitVisor のコードリーディングに使う Tool & Tips 


## はじめに
BitVisor のような低レイヤのコードを含むシステムソフトウェアのソースコードを読み解いて理解するのは中々骨が折れるものです．
しかしながら，このようなソフトウェアをベースとした研究開発を行う上ではコードを読むことは避けては通れないと思います．
そこで，今回は僕が BitVisor のソースコードを読むときに使っているツールやtips をご紹介します．

## CLI コマンド

### find-grep
王道だと思いますが，find コマンドと grep コマンドの組み合わせです．

カレントディレクトリ以下の `*.c* と `*.h` ファイルから特定のキーワードを探すときは以下のような感じ．

```bash
find . -name '*.[ch]' | xargs grep 'hoge'
```

カレントディレクトリ以下のテキストファイルから特定のキーワードを探すときは以下のような感じ．
```bash
find . -type f | xargs grep -I 'hoge'
```
オプションの解説
- `find . -type f` でファイルのパスを全て返す
- `grep` の `-I` オプションはバイナリを検索対象としないというもの


検索結果が多いし色付きで結果が見たいというときは，以下のようにすると色付きで
`less` コマンドで眺められます．
```bash
find . -type f | xargs grep I --color=always 'hoge' | less -R
```
オプションの解説
- `grep` の `--color=always` はパイプで出力を渡すときでも色情報を付けるオプショ
  ン
- `less` の `-R` は色情報を受け取って色を付けて表示するオプション

### *tags ソフトウェア
僕はセットアップが面倒であまり使っていませんが，ctags, etags, gtags, rtags な
どのソフトウェアと専用のCLI コマンドもしくはエディタを組み合わせることでタグジャ
ンプ(変数が使われている部分から変数の定義にジャンプする etc.) ができます．
BitVisor に対して rtags を使ってみた記事は[こちら](https://qiita.com/deep_tkkn/items/eb24cb2f0713c7fc4162)．


## Web UI
Web ブラウザでコードを読めればタブレットやスマフォですきま時間に BitVisor のソー
スコードが読めて便利です．
### GNU Global
https://bitvisor.org/bitvisor/HTML/

あまり知られていないのではないかと思いますが，実は上記 URL にあるページでソースコードを読めます．
しかもシンボルがリンクになっていて，そこからをシンボルの定義 <--> 参照を行き来できます．
これは，[GNU Global](https://www.gnu.org/software/global/) (gtags と htags コマンド)で生成されたページになっています．
おそらくですが，常に最新のコードが見れるようになっていると思います．

### Bitbucket/Github
Bitbucket や Github の Web UI からもソースコードが読めます．
こちらはシンボルのジャンプなどはできませんが，シンタックスハイライトが効いているのでそれなりに読めると思います．
- Bitbucket: https://bitbucket.org/bitvisor/bitvisor/src/default/
- Github (非公式ミラー?) https://github.com/matsu/bitvisor

スマフォなどで Bitbucket の WebUI でソースコードを見る場合は，Annotate ビュー が見やすい．
(`Edit` ボタンの右にある `・・・` をタップして `Annotate` を選択すると見れる画面です)


## Word で読む
この記事で一番書きたかったものです．
皆さん書類を作るときなどに MS Word などを使うかもしれませんが，それを使ってコードを読むというものです (MS Word でなくても Libre Office などでも大丈夫です)
僕は腰を据えて複雑なコードを理解したい時にはこの方法でコードを読みます．

どうやるかというと，
1. エディタや Web UI から読みたいコードを Word にコピペする．(大体は関数単位でコピペしています)
2. 読みたい関数の仮引数，ローカル変数，グローバル変数にそれぞれ別の色を付ける．たまに戻り値には別の色を付ける．
3. コメントなどを付けながら読み進める
という感じです．

画面としてはこんな感じになります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59503/0b87697c-765f-e0ad-f0ac-a5eb97f71951.png)


この方法の利点はエディタと違って背景色を変える，線を引くなどもできてメモ書きの自由度が高い点です．
感覚としては，コードを紙に印刷してペンで色々メモ書きしながら読み進めるのに似ています．
それに加えて検索もできますし，読んだメモはそのまま電子データとして残せるのでよいかと思います．
最近だと iPad や Surface などを使ってペンを使いながらやるともっとやりやすいかもしれません．

また，処理の中で混在する仮引数，戻り値，グローバル変数，ローカル変数を視覚的に区別しやすくすると，コードの見通しがかなりよくなります．

## 他のソフトウェアのコードを参考にする
デバイスドライバの処理や vt-x の機能の使い方などを知りたい時には他のソフトウェアのコードを読んで理解することも有用です．
僕が主に参考にするのは，FreeBSD や NetBSD です．
理解するという観点では Linux でもいいのですが，GPL が気になる立場の人は BSD ライセンスの FreeBSD や NetBSD を読むとよいかと思います．

手軽に上記のコードを読みたい場合は，http://fxr.watson.org/ が便利です．
例えば FreeBSD 12 STABLE だと 
- VMM のコード は`sys/amd64/vmm/` (http://fxr.watson.org/fxr/source/amd64/vmm/?v=FREEBSD-12-STABLE)
- Realtek は `sys/dev/re/if_re.c` は (http://fxr.watson.org/fxr/source/dev/re/if_re.c?v=FREEBSD-12-STABLE)
にコードがあります．

## おわりに
BitVisor のソースコードを読むためのツールや tips をご紹介しました．
GNU Global で生成された Web ページや Word で読む方法は個人的なおススメです．
他にいいツールやテクニックがあるよ，という方はコメントくださるとありがたいです 🙇‍♂️
2020年はねずみ年！画面にねずみが侵略してくるブックマークレットを作った！

クソアプリ2カレンダー11日目担当、[@issy_s16](https://twitter.com/issy_s16)です！
自称ほっこり箸休め担当、よろしくお願いします！

# 🧀 ねずみが侵略！ブックマークレット
[![Image from Gyazo](https://i.gyazo.com/c1d0bdb5062bb4e50273131173f0ac8b.gif)](https://gyazo.com/c1d0bdb5062bb4e50273131173f0ac8b)

今年ももう終わりますね、、2020年は**ねずみ年**です。
ということで！今回は **画面にねずみが侵略してくるブックマークレット** を作りました！


# 👾 遊び方
##### 1️⃣ 以下の画像の参考にソースコードをURLとしてお気に入りに追加してください！

[![Image from Gyazo](https://i.gyazo.com/b5c665e9e1f3158327b82c53b08f9dbd.gif)](https://gyazo.com/b5c665e9e1f3158327b82c53b08f9dbd)

```javascript:bookmarklet.js
javascript:(function(a){var b=document.createElement("script");b.src="//ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js";b.onload=function(){a(jQuery.noConflict(true))};document.body.appendChild(b)})(function(a){a("img").attr("src","https://bit.ly/3gWFv6g").hover(function(){var e=Math.floor(Math.random()*2);for(var c=0;c<=e;c++){a("body").after('<img src="https://bit.ly/3zWboTR" class="mouse" style="position: absolute; width:70px; top: -50px; left:-50px; z-index: 99999;">')}var f=a(this).offset();var b=a(this).height();var d=a(this).width();a(".mouse").each(function(g,k){var j=f.top+Math.floor(Math.random()*b);var h=f.left+Math.floor(Math.random()*d);a(k).animate({top:j,left:h},Math.random()*800+200,"swing")})})});
```

##### 2️⃣ 好きなサイトを開いた状態で、お気に入り登録したブックマークレットを開いてください！
##### 3️⃣ すると、画面上のimgタグが全てチーズに置き換わりますので、チーズにマウスオーバーすることでねずみ（マウス）がわらわら追っかけてきます！
ねずみだけにマウスオーバーっていうただのオヤジギャグです。

# 📑 圧縮してないソースコード
```javascript:bookmarklet.js
(function(func) {
    var scr = document.createElement("script");
    scr.src = "//ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js";
    scr.onload = function() {
        func(jQuery.noConflict(true));
    };
    document.body.appendChild(scr);
})(function($) {
    $('img')
        .attr('src', 'https://bit.ly/3gWFv6g')
        .hover(function(){
            var rand = Math.floor( Math.random()*2);
            for (var i = 0; i<=rand; i++) {
                $('body').after('<img src="https://bit.ly/3zWboTR" class="mouse" style="position: absolute; width:70px; top: -50px; left:-50px; z-index: 99999;">');
            }

            var offset = $(this).offset();
            var height = $(this).height();
            var width = $(this).width();

            $('.mouse').each(function(i, elm){
                var top = offset.top + Math.floor( Math.random()*height);
                var left = offset.left + Math.floor( Math.random()*width);
                $(elm).animate({top: top, left: left}, Math.random()*800+200, 'swing');
            })
        });
});
```

https://github.com/issy-s16/2020-cheese-transformer

# 💪 こだわった点
ねずみには1体ごとにそれぞれ違うアニメーションタイムで動くように設定してます！
また、アニメーションのeasingにswingを設定、対象のチーズの要素の大きさを取得した上でランダム配置、
そして、あえてイベントをストップせず残すことでわらわら感を演出しました！

# 👏 感想
アプリでもブックマークレットってそんなに使う機会は多くないですよね:thinking:
でもこんな風に簡単にJSを動かすことができるので、改めてブックマークレットの**便利さ**や**面白さ**を再認識する良い機会になりました！

プライベートでも仕事でも、使える技術は使って自動化していきたいものですね！

来年も良い年になりますように！

# ☺️ スペシャルサンクス
いつもありがとうございます [いらすとや](https://www.irasutoya.com/)さん！
【備忘録】Anaconda3インストール手順

##はじめに
[前記事](https://qiita.com/petite-etoile/items/6eae991fdb6b20ed9572)で綺麗にアンインストールしたので、改めて入れます。

##手順

[ここ](https://www.anaconda.com/distribution/)でAnacondaのインストーラをダウンロードします

したらインストーラ起動してそのまま従ってるとインストール完了します

ターミナルで以下のコマンドを打ってみます

```
conda --version
```


`zsh: command not found: conda`
こうなってるならなにかが狂っているので

```
vi ~/.bash_profile
```

して見ましょう

```
# added by Anaconda3 2019.10 installer
# >>> conda init >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$(CONDA_REPORT_ERRORS=false '/Users/!$!"#/opt/anaconda3/bin/conda' shell.bash hook 2> /dev/null)"
if [ $? -eq 0 ]; then
    \eval "$__conda_setup"
else
    if [ -f "/Users/(%#$/opt/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/Users/t$#%#/opt/anaconda3/etc/profile.d/conda.sh"
        CONDA_CHANGEPS1=false conda activate base
    else
        \export PATH="/Users/!$%#/opt/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda init <<<
```

こんな感じのが複数あったら最新のもの以外を消します。
(一番上の行の日付を見ると良いです)

また、zshを使っている人は

```
vi ~/.zprofile
```

をしてここにペーストします

##おわり
はい。
【GKE×CloudSQL】ExpressとPostgreSQLのローカル環境のAPIサーバーをGKEとCloudSQLに移植する

#やること
**【Node.js×PostgreSQL】ExpressとPostgreSQLでローカル環境のAPIサーバーを構築する**
https://qiita.com/Yoshimizu-Yuuki/private/77d16390b3ea1bac63e1

前回の記事で作った開発環境を、
今回はGKEとCloudSQLに載せて、APIを作成する。



#手順確認
1.CloudSQLを登録する
2.GKEにクラスタを作成しコンテナをデプロイする
3.接続出来るかどうかを確認する


#1.CloudSQLを登録する
GCPからCloudSQLのPostgresのインスタンスを生成します。
この時、プライベートIP接続にもチェックをいれておきます。（後から接続の箇所から変更することもできます。）
インスタンスをPostgreSQLで作成します。

作成後は、インスタンスに接続して前回作ったSQL文を流し込みます。
接続する際には、接続元のグローバルIPアドレスを許可するように設定しておきましょう。


#2.GKEにクラスタを作成しコンテナをデプロイする
まず、API用のDockerFileを作成します。
apiフォルダに関しては、前述の**やりたいこと**に貼ってある前回の記事を参照してください。

```Dockerfile:Dockerfile
FROM node:12-alpine

WORKDIR /api

COPY ./ /api

RUN npm install

CMD npm run start
```

このDockerfileの入っているAPIフォルダをgitのリポジトリに上げます！
そして、GCPのShellでgit cloneをして拾ってきます。

あとは以下の公式に書いてある通りにコマンドを進めていくと、コンテナをデプロイすることができます。途中のクラスタ作成は、公式に書いてあるコマンドではうまくいかなかったので、GCPのコンソールからクラスタを作成しました。
ポート番号は適宜必要に応じて設定しましょう。

https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app?hl=ja


#3接続できるかどうかを確認する

接続するために、まず、index.jsのconnectionStringの接続詞のアドレスをプライベートIPアドレスに書き換えます。

```js:index.js
const express = require('express')
const app = express()

const { Pool, Client } = require('pg')

//ここのXX.XX.XX.XXにプライベートIPアドレスを設定します
const connectionString = 'postgres://postgres:postgres@XX.XX.XX.XX:5432/postgres'

const pool = new Pool({
  connectionString: connectionString,
})
pool.query('SELECT NOW()', (err, res) => {
  console.log(err, res)
  pool.end()
})


/*
URL設計
/company⇒Companyの全件取得
/company/:id⇒Companyテーブルのidに応じたレコードの取得
*/

app.get('/company',(req, res) => 
{
    const client = new Client({
        connectionString: connectionString,
      })
      client.connect()
      client.query('SELECT * FROM Company', (err, result) => {
        res.send(result.rows);
        client.end()
    })
});


app.get('/company/:id',(req, res) => 
{
    const client = new Client({
        connectionString: connectionString,
      })
      client.connect()

      //idを使ってクエリ
      client.query({
        name: 'fetch-user',
        text: 'SELECT * FROM Company WHERE id = $1',
        values: [req.param('id')]
      }, (err, result) => {
        res.send(result.rows);
        client.end()
    })
});

app.listen(3000, () => console.log('Example app listening on port 3000!'))
```

GKEクラスタのグローバルIPアドレス（XX.XX.XX.XX）にアクセスして、XX.XX.XX.XX:3000/Companyでアクセスしてみましょう。

そこで、Companyテーブルのレコードが取得できていれば、GKEとCloudSQLの接続完了です！！
CentOS8 - Install - Django

## 仮想環境を作らずインストール
### Djangoインストール
~~~
sudo pip3 install django

WARNING: Running pip install with root privileges is generally not a good idea.
Try `pip3 install --user` instead.
Collecting Django
（略）
Successfully installed Django-3.0 asgiref-3.2.3 sqlparse-0.3.0
~~~

### インストール確認
~~~
// Python起動
python

// インタプリタで入力
>>> import django
>>> print(django.get_version())
3.0
~~~

- 本当は、仮想環境を作り、その中にパッケージをインストールするのが良いらしい。
- そうすることで、パッケージ導入ごとの環境を独立させることができるそうな。
- ということで、推奨手順は以下の通り。
    1. Pythonインストール
    2. 仮想環境構築
    3. Djangoインストール

### アンインストール（必要なら）
~~~
sudo pip3 uninstall django
~~~

## 仮想環境を作りインストール
### 仮想環境作成
~~~
// ディレクトリ名：django（本当は、ディレクトリ名もvenvが良いという話もあり）
python -m venv django
~~~

### アクティベート（仮想環境の有効化）
~~~
source venv/bin/activate
~~~

### Djangoインストール
~~~
(django) [**********]$ pip3 install django
~~~

### インストール確認
~~~
// パッケージ確認
(django) [**********]$ pip3 freeze
asgiref==3.2.3
Django==3.0
pytz==2019.3
sqlparse==0.3.0

// Python起動
(django) [**********]$ python
Python 3.6.8 (default, Oct  7 2019, 17:58:22) 
[GCC 8.2.1 20180905 (Red Hat 8.2.1-3)] on linux
Type "help", "copyright", "credits" or "license" for more information.

// インタプリタで入力
>>> import django
>>> print(django.get_version())
3.0
~~~

### アンアクティベイト
~~~
(django) [**********]$ deactivate
~~~
PHP7.4の新機能を追う/PHPの謎仕様/ソースコード共有サービス/PHPの歴史【Web x PHP TechCafe 1杯目】

# PHP × Web Tech Cafe

『Web×PHP TechCafe』は、WebやPHPに関わるITエンジニアがスキルアップのために開発や勉強、LTをするコミュニティです。オフィスをスキルアップの場としてご提供します。

今回は PHP × Web Tech Cafe 11月の内容をまとめてお伝えします！！

# Lightning Talks

参加者の方にLTを行っていただきました！

* Javaエンジニアが怖いと思うPHPの仕様
* ソースコード共有サービス emoscode (エモすこ)
* The World of PHP

## Javaエンジニアが怖いと思うPHPの仕様
by soachr さん


Java を3年半使っていたsoachrさんから見た、PHPの不思議なところを紹介いただきました。
PHP初学者のあるあるがたくさん含まれていました。

* ifの中で代入する場合の挙動 → Javaならエラーなので違和感あり
* 空文字をifの条件に入れる → 型がないので普通に実行できてしまう
* 第二引数がない関数 → エラーにならない

→ PHPは ゆるふわ！！

## ソースコード共有サービス emoscode (エモすこ)
by ともたこ さん

ともたこさんが作成したソース共有サービス「エモすこ」を紹介いただきました！
テーマは 「**エモ**いコードに**すこ**を加える」だそうです！

* ソースコード共有サービス
* ソースコード上にコメントを貼り付けられる
* SNSでのシェアも可能

技術要素

* フレームワーク：bottle-breaker
* フロント：JS→TypeScript
* ホスティング：Heroku
* etc...


今後の展望

* 現在はコードのアップロードのみ → 編集、削除ができるようにしたい！
* 誤解するようなUIを修正 



## The World of PHP
by @kawanamiyuu さん

PHPとは

* さまざまな目的で使える 
* 特にWebで使える 
* 十分早い
* 実用的 

PHPは何の略？
→ PHP: Hypertext Preprocessor

PHPの歴史

* 1995年に誕生（このときは personal Home Page tool の略だった）
* レガシーとモダン（5.2と5.3で変わる）
    * 名前空間の導入 
    * 自動読み込み 
    * Composer(依存管理ツール) 
    * 型定義 

PHPのいいところ

* 十分に高速 
* webサイトを構築するのに最も使われている言語である 
* よく知ってるサービスで使用されている 
* 公式マニュアルが充実 
* Hello world が異常に簡単 
* コミュニティも活発 

まとめ 〜PHPとは〜
Rasmus Lerdorf の言葉

* PHPは歯ブラシ : 日常で使うあくまで便利な道具である
* PHPは話し言葉のように進化してきた : 新しい言葉が追加され、古い言葉は使われなくなっていく




# ディスカッション議事録

今回は、もくもく学習だけでなく、PHPについてのテーマに基づいたディスカッションを行いました！

## 今回のテーマ
- PHP7.4の新機能をRFCを見ながら「何が嬉しいのか、どういう時に使うのか」などを参加者同士でお話しする。

### RFC
https://wiki.php.net/rfc#php_74
### Migration
https://www.php.net/manual/en/migration74.php

---
## 今日のディスカッション対象

## Typed Properties
- プロパティ型指定
- https://wiki.php.net/rfc/typed_properties_v2
- ディスカッション内容

クラスのプロパティに型を指定できる。

* 違う型を指定しようとするとエラー
* モードで使えるかどうかを指定できる
* クラスも指定できる → オブジェクト指向の実装がやりやすい
* 新しいコードから使用していく
* 型指定があるプロパティとないものの混在も可能
* NULL許容演算子でNULLを許すかどうか制御できるのが嬉しい
* コードを読むときに見当がつけやすくなる
* 変数名の$~~**Str**が無くせる！
* ジェネリクスがあったらいいのに...
  * RFCはあった： [PHP: rfc:generics](https://wiki.php.net/rfc/generics)
* 連想配列の型指定も欲しい




## Foreign Function Interface
- FFI
- https://wiki.php.net/rfc/ffi
- ディスカッション内容

PHPから他の言語を呼び出せます。

* 24 vs 15 で可決された
    * そもそものRFCのあり方のディスカッションにもなった
* 他の言語でも同様のことはできるので世の中の流れ的には納得感ある
* 文字列で書く仕様はいかがなものか…
* 記述内容をコンパイルして利用する
    * コンパイル済みの実行ファイル置いておけばいいのでは？
    * 使いようによってはコンパイルした結果をキャッシュすることができる
* PHPの拡張機能を使うことを想定している？
* 速度改善が目的？
* すでに存在するCのコードを生かすため？

参考

* [PHP7\.4 の FFIを試した \- Qiita](https://qiita.com/nishimura/items/70a8ee420cb4cbb1e251)
* [PHPエクステンションをRustで作る \| POSTD](https://postd.cc/creating-a-php-extension-in-rust/)


## Null Coalescing Assignment Operator
- NULL合体演算子
- https://wiki.php.net/rfc/null_coalesce_equal_operator

- ディスカッション内容

Nullかどうかを確認する演算子をさらに省略系にする

* 書くのは楽になる
* 読みにくくはならないか？
    * 短いことは読みやすいことである？
    * `??`を見たときにコードの意図はすぐ理解できる
* リクエストパラメータのデフォルト値設定とかに使いやすそう
* シングルトンパターンのインスタンス存在判定に使えそう


## PHPの亜種たちはどこいった？？

### P++とは？

もっとPHPを厳密化して使いましょうといった言語。
話題になったが提案だけで移行動きがない

参考： [P\+\+: 銀河に平和をもたらすための奇策と決着 \- Qiita](https://qiita.com/tadsan/items/80cd844ee612c6cadabf)

### Hack

Facebookが作成していたPHPを拡張して使おうとしていたもの。


## Arrow functions
- アロー関数
- https://wiki.php.net/rfc/arrow_functions_v2
UnityのScriptable Render Pipeline(SRP)でライトの情報を取り出すメモ

前回、SRPの最初の導入を行ってみました。
https://qiita.com/Shibash/items/d6bdfc956859138ad6ff

前回の結果画面を見てみると、のっぺりしていて立体感がありません。
なので、立体感を出すために、簡単にライティングをしてみます。

Unityが用意しているUniversalRPは、いつも通りSpotLightやDirectionalLightを利用することが出来ます。

同じように、UnityのDirecitonal Lightの情報を使うようにして、ライティングを行わせるには
どうすれば良いかメモ書きです。

Unityバージョンは2019.3.0b6
com.unity.render-pipelines.core 7.1.1
com.unity.render-pipelines.lightweight 7.1.1
com.unity.render-pipelines.universal 7.1.1
#### シェーダの改良
ライティングを行うために、前回のシェーダの改良を行います。
長くなるので内容は割愛しますが、少なくともシェーダにライトが持つ方向などのパラメータを渡す必要があります。

#### コードを確認
#####・ライトの情報をシェーダに渡している箇所はどこなのか？
ForwardLightsクラスのSetupMainLightConstants関数がその処理を行っていそうです

    Vector4 lightPos, lightColor, lightAttenuation, lightSpotDir, lightOcclusionChannel;
    InitializeLightConstants(lightData.visibleLights, lightData.mainLightIndex, out lightPos, out lightColor, out 
    lightAttenuation, out lightSpotDir, out lightOcclusionChannel);
    cmd.SetGlobalVector(LightConstantBuffer._MainLightPosition, lightPos);
    cmd.SetGlobalVector(LightConstantBuffer._MainLightColor, lightColor);

cmdはCommandBufferで、このクラスを通してシェーダの変数を渡すことが出来ます。
CommandBufferPoolというクラスに、CommandBufferの管理を行わせていて
プールして使いまわすようにしているようです。

#####・ライトの情報を取得しているところはどこなのか？
LightData構造体が、VisibleLightという構造体を持っています。
UniversalPipelineのInitializeRenderingDataで受け取っていて<b>CullingResults</b>から取り出せるようです。

    var visibleLights = cullResults.visibleLights;

これは前回の記事で行った、カリング結果にデータが入ってきています。
https://qiita.com/Shibash/items/d6bdfc956859138ad6ff


ライティングの方向はShadowUtilsのSetupShadowCasterConstantBuffer関数で渡しているようです。
行列の内部に含まれるデータの扱いは、以下の記事が参考になります。
http://marupeke296.sakura.ne.jp/DXG_No39_WorldMatrixInformation.html
   
    Vector3 lightDirection = -shadowLight.localToWorldMatrix.GetColumn(2);
    cmd.SetGlobalVector("_ShadowBias", shadowBias);
    cmd.SetGlobalVector("_LightDirection", new Vector4(lightDirection.x, lightDirection.y, lightDirection.z, 0.0f));

### まとめ
以下の２つを押さえておけば、ライトの情報を取り出してシェーダに渡すことが出来ました。
・CommandBufferを使って、シェーダのグローバル変数を渡すことが出来る。
・ライト情報はCullingResultが持っている。

Directionalライト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12340/4e023cff-cf9c-4000-a04b-a7388a29a7d4.png)
Directional、Spot、Pointライト
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12340/e23b1f4f-dc38-c11e-c236-5a0be2ae0033.png" width=60%>


#####参考サイト
ほぼほぼ自分メモになってしまいましたが
以下に、SRPを利用したライティングがしっかりまとめられているので、こちらを読めば色々出来ると思います。
https://catlikecoding.com/unity/tutorials/scriptable-render-pipeline/lights/

↓ちょっと新しい版
https://catlikecoding.com/unity/tutorials/custom-srp/directional-lights/
【備忘録】anaconda3アンインストールした話

##Catalinaさん・・・
勝手にanacondaのディレクトリ移動されてたりデフォルトの解凍ソフトが上手く動かなかったりアプデで被害が大きいですね。

ターミナルで`conda`と打っても

```
zsh: /Users/takaki/anaconda3/bin/conda: bad interpreter: /Users/Shared/Relocated\: no such file or directory
```

こんなんになったり、matplotlibが使えなくなったり

```
This application failed to start because it could not find or load the Qt platform plugin "cocoa"
in "".
```

で大変になったので色々いじってたんですがどうしても上手く行かなかったのでアンインストールすることにしました
(condaは実行できるところまで行きましたがそれでもmatplotlibが使えなかった)

##手順

```
conda install anaconda-clean
```

`Proceed ([y]/n)? `って聞かれるのでy押します

`Downloading and Extracting Packages
conda-4.7.12         | 3.0 MB    | ##################################### | 100% 
anaconda-clean-1.1.0 | 7 KB      | ##################################### | 100% 
conda-package-handli | 1.4 MB    | ##################################### | 100% 
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
`

クリーナinstall出来ましたので実行します

```
anaconda-clean
```

`Delete .ipython? (y/n): 
Delete .jupyter? (y/n): 
Delete .matplotlib? (y/n): 
`

全部yおします

```
 rm -r /Users/[UserName]/anaconda3 
```

(UserNameは自分のあれです)

他にもあるかもしれません↓勝手に移動されたanacondaさん

```
rm -r /Users/Shared/Relocated\ Items/Security/anaconda3
```

`rm: /Users/Shared/Relocated Items/Security/anaconda3: Permission denied`

怒られます。権限を使って消しましょう

```
sudo rm -r /Users/Shared/Relocated\ Items/Security/anaconda3
```

##おわり
はい。
勘弁してほしいですねAppleさん。。
スマホ対応のインクリメンタルサーチを発火させる時

# はじめに
某スクールでインクリメンタルサーチを学んだ際、keyupの時に発火するように
コードを組んでいたが、レスポンシブ対応の自作アプリを作っている時に
変換や予測変換ではサーチが実行されないことに気づき、どう対応させたかの
備忘録です。

# 対策
compositionendを使います。

```javascript:使いかた
$(".input_form").on("keyup　compositionend", function () {

  //インクリメンタルサーチの内容

});

```

# 説明
keyupでカバーできないところを、conpositionendでカバーするようにしています。
keyupとcompositionendの間を半角スペースで区切ることで、orのような扱いになり
どちらかを満たせばインクリメンタルサーチが発火します。

参考にした記事では０文字の時にイベントが起きないようにしていますが
私の場合は０文字の時はまた別の処理を行なっているので今回のような記述にしました。


# 参考
https://qiita.com/bgn_nakazato/items/3bc7af52e0e0025c9cc2
CentOS8 - Install - Python3

### Python3.6インストール
~~~
sudo yum install python36
~~~
~~~
python3 --version
Python 3.6.8

pip3 --version
pip 9.0.3 from /usr/lib/python3.6/site-packages (python 3.6)
~~~
- 恐らく、デフォルトでインストール済み

### pythonコマンドでの呼び出し
~~~
sudo alternatives --config python

2 プログラムがあり 'python' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/libexec/no-python
   2           /usr/bin/python3

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2
~~~
1. alternatives コマンド入力
2. インストール済みの Python 一覧表示
3. 一覧から Python3 の左側にある番号を選択

~~~
python --version
~~~
- python コマンドで呼び出し可能
AtCoder参加記録（ABC147）

# AtCoder 初参加
AtCoder Beginner Contest 147 に初参加しました。
以後、参加したものとその記録をつけていきます。

AtCoder Beginner Contest 147 （以下、ABC 147）は、AからFまでの6問があり、徐々に難しくなっていく模様。
各問題を解いた際のコードの記載と、解けなかった問題の解き直しを行っていきます。
改善点などあればお気軽にご指摘ください。
## ABC147はこちら
https://atcoder.jp/contests/abc147

### ABC147 A - Blackjack
```python
a, b, c = map(int, input().split())
 
if a+b+c > 21:
    print('bust')
elif a+b+c <= 21:
    print('win')
```
解説では、最後のところが単純にelseでしたね。

### ABC147 B - Palindrome-philia
```python
s = input()
l = len(s)
count = 0

for i in range(l//2):
    if s[i:i+1] != s[l-1-i:l-i]:
        count += 1
print(count)
```

if文の条件節は、もちっとシンプルにできたのかもしれない。

C以降の問題はできませんでした。
今後の課題ですね。
Neovim の Terminal で画像表示や動画再生

##はじめに

libsixel の登場以来、ターミナルに画像を表示する Sixel Graphics はかなり簡単に扱えるようになりました。

直接表示するだけではなく、DRCS と呼ばれる機能の Sixel 拡張が使用できる端末を用いる事により、その上で動作する Neovim が備えるターミナル上でも sixel での画像表示が可能です。
DRCS のSixel 拡張については @arakiken さんが[こちらの記事](https://qiita.com/arakiken/items/626b02cd857d20c12fbc)で詳細に解説してくださっていますが、この記事上で少し触れられている、Neovim の DRCS-Sixel 対応を試してみようと思います。

Neovim の "floating windows" 機能を使えばバッファ上の任意の場所にサイズ指定したウィンドウが開けて、なおかつその上でターミナルが動作するので、DRCS-Sixel 化により好きな場所で画像を表示したり動画を再生したりする事が可能になります。

##環境について
* OS : Ubuntu 20.04 LTS
* ターミナルエミュレータ : mlterm version 3.9.0

RLogin や mlterm 等、DRCS-Sixel を使えるターミナルエミュレータを使用してください。

##libsixel のインストール
今は大抵ディストリビューションのパッケージに含まれているのでサクッとインストールしましょう。

```
~% sudo apt-get install libsixel-bin libsixel-dev
```

##libvterm のインストール
neovim や vim の `:terminal` 機能で使われるライブラリです。 
「DRCSのSixel拡張について」で紹介されている libvterm は[こちらのリポジトリ]
(https://bitbucket.org/arakiken/libvterm/src/default/)から落としてきてビルド及びインストールが可能ですが、現状の Neovim では libvterm のバージョン0.1以上を要求する為、下記の手順でソースコードを入手・展開しましょう。

```
~% wget http://www.leonerd.org.uk/code/libvterm/libvterm-0.1.3.tar.gz
~% tar xvzf libvterm-0.1.3.tar.gz
```
DRCS-Sixel 対応の為の diff は下記です。
https://github.com/neovim/libvterm/compare/nvim...arakiken:sixel
私は今回は手動で差分を適用してみました。ソース修正後ビルドしてインストールします。

```
~% make
~% sudo make install
```

##Neovim のインストール
今の Neovim はビルドの過程で libvterm をダウンロードして来て自らに組み込む様な形でターミナルを実装する仕組みになっている様ですが、make の際に下記オプションを指定することでこのバンドル版ではなく、OS にインストール済みの libvterm を使用させる様にします。

```
~% sudo apt-get install ninja-build gettext libtool libtool-bin autoconf automake cmake g++ pkg-config unzip
~% git clone https://github.com/neovim/neovim.git
~% cd neovim
~% make DEPS_CMAKE_FLAGS='-DUSE_BUNDLED_LIBVTERM=OFF'
~% sudo make install
```
以上で DRCS-Sixel 対応された Neovim のインストールは完了です。

##画像表示してみる

画像表示には libsixel に含まれる `img2sixel` というコマンドが使えます。gif アニメもイケますが、中々綺麗に再生されなかったので、[Sixel Graphicsを活用したアプリケーションの御紹介] (https://qiita.com/arakiken/items/3e4bc9a6e43af0198e46) の記事中にある `FFmpeg-sixel` を使い、mpeg4の動画を使う事にしました。

floating windows を使用するにあたっては、下記の記事を参考にさせて頂きました。
[【Neovim】半透明色のウィンドウが開けるようになりました](https://qiita.com/delphinus/items/a202d0724a388f6cdbc3)

`miku.mp4` という動画を用意した上で、Neovim の設定ファイルに下記を追記します。

```$HOME/.config/nvim/init.vim
command! Miku call s:miku()

function! s:miku()
    " 空のバッファを作る
    :let buf = nvim_create_buf(v:false, v:true)
    " そのバッファを使って floating windows を開く
    :call nvim_open_win(buf, v:true, {'relative': 'win', 'height': 30, 'width': 40, 'col': 44, 'row': 14})
    " 透明にする
    :set winblend=100
　  " ターミナルを開いてコマンドを実行
    :terminal /usr/local/bin/ffmpeg2 -i ~/Desktop/images/miku.mp4 -f sixel -loglevel quiet -pix_fmt rgb24 -s 240x400 -
endfunction
```

この状態で Neovimを起動し、`:miku` とコマンドを打つと

![mikumiku.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13048/3c1d8dcd-34bb-3680-c181-31d4de2924f2.gif)




この様に動画が再生されます（すいません、gif動画が非常にモッサリしてますが実際は[こんな感じで](https://twitter.com/rattcv/status/1152826477408210945?s=20)もっとスムーズに再生されます）。
この仕組みを使えば、以前 Twitter で流行った「一定時間サボるとメンターが出て来て激励するエディタ」に近いものも実現出来ちゃいますよね笑


他にも色々面白い使い方があると思うので、是非試してみてください！
open3dで円筒を作る＋STLファイル出力

open3dのインストール
`pip install open3d`

```python:o3d_cylinder.py
import open3d as o3d
# 1つめ
mesh1 = o3d.geometry.TriangleMesh.create_cylinder()
mesh1.compute_vertex_normals()
# 2つめ
mesh2 = o3d.geometry.TriangleMesh.create_cylinder()
mesh2.compute_vertex_normals()
# (相対)移動
mesh2.translate([0,10,10]) 
# STLで出力
o3d.io.write_triangle_mesh("sample.stl", mesh1+mesh2)
```

参考
http://www.open3d.org/docs/release/tutorial/Basic/visualization.html
なんかききづらいんだけどさっきから言ってる GitHub って何【2019 アドカレ】

## GitHub 愛好家による概要

GitHub 愛好家です。プログラミングをはじめてみたい友だちに、「この GitHub っていうサイトにわいの書いたプログラムがあるから見てええで! きみのプログラムもここにアップしたらコメントとかするで!」と言ってたら「なるほどわからん」となったのでイラストつきで自分なりの解説をしてみます。

## GitHub 愛好家による説明

↓あなたです。プログラムを書きます。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270842/156b22de-2c15-f291-997d-3d4bb69a6b32.png)

↓あなたの友だちです。あなたのプログラムに興味があります。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270842/e4a50f3f-387d-e18a-1fe0-2ca9321a6e0b.png)

↓GitHub というウェブサイトがあります。あなたはそこに自分のアカウントを作ります。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270842/ec89a006-364e-58b6-047b-0f268651471f.png)

↓GitHub へあなたのプログラムをアップロードします。この行為を push と呼ぶこともあります。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270842/8202fb37-909c-083f-ee72-3f865aad977f.png)

↓すると友だちはあなたのプログラムを閲覧したり、ダウンロードすることができます。この行為は pull と呼ぶこともあります。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270842/c4bdb2ee-466b-429c-4ac1-7b68bf20cc95.png)

↓さらに、「こうしたほうがいいよ」「これはどうかな?」とコメントやレビュー、ひいてはプログラムの修正をすることもできます。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270842/7001af9b-8719-b5ce-bae8-d8b9be589b30.png)

↓もちろんあなたもそれに加わることができます。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270842/6bb81a9e-e106-fae9-358c-d55141af0efa.png)

↓その結果、みんなの力で磨き抜かれた神のプログラムが生まれ全員が幸福になります。

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270842/21f747cd-bf7f-0e54-3458-c88bd13b32cd.png)

これらのやり取りはすべて各々の GitHub ページに残り、あなたのプログラミングの成果、あなたの功績がネットに刻まれます。このプログラムの持ち主はあなたですが、友だちの名もプログラムの貢献者としてしっかり残され、みんなとの間に絆が生まれます。 GitHub が**「プログラマの SNS」**と呼ばれる所以ですね。

[さあ、アカウントを作ってみましょう!](https://github.com/)

## 具体的な話

GitHub アカウントを作るところはまあ簡単なのですが、実際に GitHub へプログラムをアップロード(push)するのはちょっと手間がかかってしまいます。サイト上の「あっぷろーど」ボタンを押して、自分のぱそこのデスクトップのプログラムをダブルクリックすればアップロードできる、というようなものではないのです。 Git というソフトウェアを使っていくつかコマンドを打ったりなんなりしなければなりません。その説明もしたいところですが、あまり記事が膨らむのもいやなので、具体的な手法は割愛します。「github push やり方」あたりでググればいいのかなとぼんやり思います。

## GitHub 愛好家による結び

ネット上に五万とあるような内容ですが、友だちのためにヴィジュアライズな説明をしたかったので、投稿しました。がんばりましたが結局よくわからない初心者にはよくわからない記事になってしまっているような不安もあります……。

私はもともと GitLab 愛好家なのですが(?!)、1年半くらい使ううち、フォロー機能とプロジェクトのピン留め機能を使いたい気持ちがむらむらと湧き上がり GitHub にやってきました。新参者ですがよろしくお願いします。
【Python】総和Σ(シグマ)と総乗Π(パイ)はループ文だったんだ！

#はじめに
この記事は、僕が高校数学の復習をしているときに気づいた学習メモです。
高校数学が苦手のままエンジニアになり、
数学記号・数式から遠ざけてきた人間が学んだ中で得た小さな感動を誰かに伝えたくて書きました。

#この記事を読んでほしい方
* Pythonの基礎文法が分かる人(Progateクリアレベル)
* Σがいまいちピンとこない人
* 数学が苦手な方

上記の方の一助となれば幸いです。


#総和 Σ

```math
\sum_{i=1}^n i
```
Pythonで書くと、こんな形になる。

```python:
def total(start,end,step):
    temp =0
    for i in range(start,end+1,step):
        temp += i
    return temp
```


#総乗 Π

```math
\prod_{i=1}^n i
```
Pythonで書くと、こんな形になる。

```python:総乗Π
def product(start,end,step):
    temp=start
    for i in range(start,end+1,step):
        temp *= i
    return temp
```
[UE4]NiagaraScriptModuleに関連しているパラメータの表示

Niagara楽しんでますかー？
Niagaraは様々なモジュールを積み重ねて(スタック型)バリエーション豊かなVFXを作成することができます。
それぞれのモジュールが関連性を持って動作するのですが、
どのモジュールがどのモジュールに影響を受けるのか最初はよくわからないこともあると思います。
最終的にはNiagaraModuleScriptを読むのがもっとも正確なのですが、
その前にNiagaraEditor上でもその理解をちょっぴり助けてくれるオプションを紹介します。

# `Show Linked Script Inputs`と`Show Outputs`

例としてSpriteSizeScaleByVelocityモジュールを見てみます。
エミッターに追加して個別に選択してみるとこのような画面になると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/721f78a1-58d3-461e-60fd-d9480ea5b17a.png)
右上に目玉のアイコンがあるのでそれをクリックして`Show Linked Script Inputs`と`Show Outputs`にチェックを入れてみます。
すると以下の様にモジュール表示の上部と下部に追加のパラメータが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/09b9c302-e7d7-1215-b028-47cfbd091575.png)

上部のLinkedScriptInputsがこのモジュールが参照しているパラメータです。
`SpriteSizeScaleByVelocity.Velocity Threshould` のようにモジュール自体の名前がついているパラメータは **モジュールインプットパラメータ** です 
モジュールインプットパラメータは表示オプションにチェックを入れる前から、モジュール詳細ビューのInputsに並んでいたプロパティ達で、
NiagaraModuleScriptの中では`Module.Velocity Threshould`という形でModuleというカテゴリ内に配置されます。

モジュール名を冠していないパラメータ(例えば *Particles.Velocity*)はこのモジュールの前に実行されて値がセットされていればそちらを読みだして使います。

モジュール下部のOutputsにはそのモジュールが出力しているパラメータが表示されています。
今回のモジュールは `Local.SpriteSizeScaleByVelocity.NormalizedVelocityRange` と `Particles.SpriteSize` の二つが出力されているということを示しています。
NiagaraModuleScriptの中をのぞいてみると *Map.Set* につながっているのが確認できます。

*Particles.SpriteSize* は最終的に *SpriteRenderer* の入力として使われます。

以上です。
Fortran備忘録


メモ
https://amanotk.github.io/fortran-resume-public/chap09.html
https://www.mk-mode.com/blog/2019/09/20/fortran95-sample-object-oriented/#

# 変数の宣言
## `optional`
```fortran
Subroutine calc(a,b,c,nmax)
  real(8), intent(in) :: a,b
  real(8), intent(out) :: c
  integer, optional :: nmax
```
とすると、`nmax`は省略可能な引数となる。
省略の有無は`present(nmax)`のTrue/Falseで確認できる。

# Module
## Submodule

[FORTRANのModernizeに使えるいくつかの機能 - Qiita](https://qiita.com/implicit_none/items/55c47407aa376277a531)

# Type

# Interface

# Block

[FORTRANのModernizeに使えるいくつかの機能 - Qiita](https://qiita.com/implicit_none/items/55c47407aa376277a531)

# References
[9. モジュールと構造型 &#8212; Fortran演習(地球惑星物理学演習)](https://amanotk.github.io/fortran-resume-public/chap09.html)
[Fortran 90 骨の髄まで 4-1 構造型の宣言](http://jjoo.sakura.ne.jp/tips/f90/declare_type.html)
ブロックチェーンゲームを題材にしたPythonの初心者講座を考えてみた

## プログラミングをはじめたいという人が増えてきた

僕はブロックチェーン界隈で活動をしている。

特にNFT(Non Fungible Token)のあたりが得意分野だ。Qiitaとは異なりプログラマーは少ない。もちろんゲーム開発メーカー側にはプログラマーは多いが、プレイヤーには一定のプログラミングができる人がいるが圧倒的にすくないのが現状だ。

そんな界隈でもよくプログラミングがてきたらな。やってみたいなという言葉を聞く。

# やればいいんじゃないだろうか

きっとここにいる多くの方たちが思うことだろう。僕もそうだが、気がついたらプログラミングの虜になったのがQiitaにいる人たちの大半ではないだろうか。でも、1年くらい少しばかりのコメントをしながらみていたが、プログラミングを初めて何かを作り始めるか方は２−３人に止まった。それでも素晴らしいのだがやはり割合としては少ない。

progateを何個かクリアするところで終わってしまうことが大半だ


## プログラミング初心者に向けた講座のアイディア

僕はこの現状について考えた。progateはパズルみたいで面白いようである程度タスククリアの楽しさでつづけていくのだけどそこで終わってしまう。うーん。どうしたらやりたい人増えるかな？

**あっ。その人の興味があることに絡めればいいのか？**

ということで作ってみました。


![スライド1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286932/92260753-fe45-f2e6-4164-29382809a598.jpeg)


この教材は

１、[無料のYouTUbe](https://www.youtube.com/watch?v=unQVkrZkCl4)
２、[有料のサポート付きノート](https://note.com/rami0/n/nfbd89ded809c)

で構成されています。コンテンツはPythonを使ってゲームのAPIを叩いて情報を取り出してグラフにすることまで、初めてPythonをさわる方でもできるようにゆっくりと説明と実践をしてもらっています。

環境については、PC上にインストールしてもらうリスクをさけて結局Google　Colabratory をつかいました。

すでに用意された環境はやはり初心者の方にも好評で本当にGoogle様ありがとうという気持ちであった。ほんとに助かりますね。

##こんな内容
結構超基本のレベルまで掘ったと思います。でも多分リアル初心者のわからないポイントはもはやおもいだせないので積み残しもあるかもしれないですが。

![スライド6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286932/99f6b077-42a9-133f-5667-659e5e842d22.png)

![スライド28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286932/5624a878-3712-b2f6-d09a-3e7750672f86.png)

![スライド34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286932/c098804f-7448-d6a5-48a6-ed5f5c5b1fdd.png)



##　さてプログラミングの楽しさは知ってもらえたのか

楽しかった。わかりやすかったというコメントをいくつかいただきとてもうれしかった。これがきっかけになってプログラミングを一人でも多く輩出したいと思っている。

APIというツールが気軽に使えるようになり、Hello Worldから実践的なProgramingの間の距離は今までになく短くなっています。この辺りをこれからも攻めていきたいと思っています。しばらくはブロックチェーン関係で攻めていこうかなと思っています。


## まとめ

自分がFlutterの情報を集めていた時、無料の動画がないかなとYouTubeを漁っていたらとても多くのコンテンツがでてきました。まだまだ、日本で個別のプログラムの詳細講座はYouTubeにはでていません。このQiitaで活躍の方にもぜに日本から発信のYouTubeにも挑戦してほしいなとおもいました。

そしたらほら。僕含めて情報を探している人もらくちんに情報を得られるではないですか。いやあ。たのしみですねそんな世界。


もしよかったらツイッターフォローお願いします。

[はるか先生](https://twitter.com/harukatarotaro)と言います。

ではでは