OmniAICreator/Qiita-1.07M huggingface dataset:
1行4MB超えレコードについて

# はじめに

AWS のRedshiftには、COPY というS3上のデータファイルから、
テーブルにデータをロードするコマンドがありますが、
このコマンドには、単一の入力行の最大サイズは 4 MBという制限があります。 
この制限を超えるレコードがあった場合に対象行を見つける方法を備忘のためメモ

# 方法

S3上のファイル内容を直接確認する方法は、思いつかないので
一旦ローカルのLinuxサーバにダウンロード(Sample.csv.gzとする)
容量に問題なければ、ローカルで解凍してもよいですが、
zcat で直接内容を標準出力し、gawkで行長（4,000,000byte以上のレコードを）をチェックします。

# 例

```console
> zcat Sample.csv.gz
111111111,123456789
222222222
333333333
444444444
555555555,555555555,555555555,４MB超え
666666666,666666666,666666666,66666666666,４MB超え
777777777,
888888888,888888888,888888888,88888888888,４MB超え
```
カンマ区切りで５，６，８行目が４MB超えのレコードの行とします。

```console
> LANG=C; zcat Sample.csv.gz | gawk 'BEGIN{ FS = "," }{ len=length($0) ; if(len >= 4000000 ) print NR "," $1 "," len }'
5,555555555,4000030
6,666666666,4000040
8,888888888,4000040
```
※結果として、行数、1カラム目、対象行のバイト数を表示させました。
※「LANG=C;」は、レコードに全角文字が含まれる場合を想定して付けています。
　gawkのlength が、byte数ではなく、文字数返したので付けました。
　別の環境でawkを試したら、バイト数返したので、環境により違いがあると思うので
　使用する環境で想定通りの動きをするかチェックしてください。

# 参考
[COPY - Amazon Redshift](https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_COPY.html)
npm http-server とDockerで無料HTTPS化

#はじめに
無料でHTTPSを立てたかったので、立て方をここに残します。（備忘録）

#やり方
## 用意するもの
下記のものがインストールされた`linux`サーバ
・`npm`
[<参考>Ubuntuに最新のNode.jsを難なくインストールする](https://qiita.com/seibe/items/36cef7df85fe2cefa3ea)
・`docker` and `docker-compose`
[<参考>Ubuntu に docker と docker-compose を入れる](https://qiita.com/mochizukikotaro/items/ae7ae1461ea4bf495bd0)
・`domain`
[<参考>freenomでドメインの取得](https://qiita.com/hanbaga324/items/da0c4f6fa8d365db10c9)

## 手順
### 1,`domain`の設定
用意した`linux`サーバのグローバルIPを設定してあげます。
私のは`さくらインターネット`で購入したので下記のようなイメージで設定しました。
<img width="508" alt="スクリーンショット 2019-08-18 3.49.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/9929ab2b-f06b-8783-3615-845d1a663643.png">

### 2,各種インストール
#### httpサーバソフト：`http-server`
下記のコマンドでインストールしてください。

```sh
$ sudo npm install -g http-server
```


#### ジョブ管理ソフト：`cron`
ubuntu等の場合は最初から入っているかと思いますが、centosなどでは入っていない場合もあるようなので、下記のようにインストールしてください。

```sh:centos
$ sudo yum -y install crontabs
```

#### ファイヤーウォール管理ソフト：`ufw`

下記のコマンドでインストールしてください。

```sh:ubuntu
$ sudo apt -y install ufw
```

*centos系はこちらを参照ください。[<参考>ufwをcentosにインストール](https://qiita.com/soramugi/items/d0514895340fc8fa3430)

### 2,`crontab`への登録
これを実行する事により、サーバが再起動した場合も自動的に再実行されます。
下記のコマンドを実行してください。

```sh
$ sudo crontab -e
```
コマンドを実行すると編集画面が表示されますので、下記の行を追加し保存してください。

```crontab:crontab
@reboot sudo ufw allow 80;sudo ufw allow 443
@reboot sudo http-server /{対象フォルダ} &
```
*{対象フォルダ}はhttpサーバで表示する`index.html`などが存在するフォルダを指定してください。

## 3,`docker-compose.yml`の作成
下記のコマンドを実行し、ファイル編集を開始してください。（例ではEditorを`nano`で利用しています）

``` sh
$ sudo nano docker-compose.yml
```

新規ファイル内容は下記としてください

```yml:docker-compose.yml
version: "3"
services:
  https-portal:
    image: steveltn/https-portal:1
    ports:
      - 80:80
      - 443:443
    environment:
      DOMAINS: '{ドメイン名} -> http://dockerhost:8080'
      STAGE: production
    volumes:
      - ./org-chimata-ssl-certs:/var/lib/https-portal
    restart: always
```
*{ドメイン名}は用意されているドメイン名を利用ください。


## 4,`docker-compose.yml`の実行
最初に念の為、ファイヤーウォールに穴を開けます。

```sh
$ sudo ufw allow 80;sudo ufw allow 443
```

`http-server`を立ち上げます

```sh
$ sudo http-server /{対象フォルダ} &
```


下記のコマンドで`https-portal`を起動

```sh
$ sudo docker-compose up -d
```

これで、正常に立ち上がるはずです。

# 問題がある場合
まずもってログを確認していただいたほうが良いかと思います。

## dockerのログの見方
### 1,下記のコマンドで`docker`のコンテナIDを取得
```sh
$ sudo docker ps
> CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS              PORTS                                      NAMES
> {コンテナID}        steveltn/https-portal:1   "/init"             2 days ago          Up 2 days           0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   {user name}_https-portal_1
```

### 2,下記のコマンドでコンテナのログを取得

```sh
$ sudo docker logs {コンテナID}
```

そして、エラーっぽいところの行をコピーしてググる！！

## 他の可能性
可能性としては…
・`http-server`は2回目以降は別ポートで起動します。→多重起動していないか確認
・`http-server`が立ち上がっているか？→`curl`などで`get`して確認
・ネットワーク全体で`80/443`PORTは許可されているか？→外部から`telnet`などで確認
・`STAGE: production`で何度も作成していないか？→`Let's Encrypt`に回数などの制限があるようです。
[Oracle Cloud] Oracle DB マネージドサービスを、Enterprise Manager Expressでモニタリングする

# 初めに

**この記事は古くなったので、[こちら](https://qiita.com/sugimount/items/94347b189c1c7f247480)を参照してください**

Oracle Cloud Infrastructure では、Oracle DB のマネージドサービス(以下DBaaS)が提供されています。
DBaaS インスタンスで、リソース消費やSQLのモニタリングをする上で、Enterprise Manager Express を利用することが出来ます。
Enterprise Manager Express はデフォルトでは無効化されているので、有効にする手順と、どのようなデータが見れるのか画面キャプチャを載せます。



# Enterprise Manager Express を有効化

DBaaS インスタンスに SSHして、Oracle ユーザーにスイッチ後、sqlplus で接続

```
[oracle@sugihostname01 ~]$ sqlplus / as sysdba 

SQL*Plus: Release 18.0.0.0.0 - Production on Sat Aug 17 17:23:12 2019 
Version 18.6.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.


Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production 
Version 18.6.0.0.0

SQL> 
```



Port 5500 を有効化

```
SQL> exec DBMS_XDB_CONFIG.SETHTTPSPORT(5500); 

PL/SQL procedure successfully completed.

SQL> 
```



確認

```
SQL> select dbms_xdb_config.getHttpsPort() from dual;  

DBMS_XDB_CONFIG.GETHTTPSPORT()
------------------------------
                          5500

SQL> 
```



設定

```
SQL> exec dbms_xdb_config.SetGlobalPortEnabled(TRUE); 

PL/SQL procedure successfully completed.

SQL> 
```



OSに戻り、5500Portの設定が正しく入れられているか確認

```
[oracle@sugihostname01 ~]$ lsnrctl status | grep HTTP 
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=sugihostname01.priv01.vcn.oraclevcn.com)(PORT=5500))(Security=(my_wallet_directory=/u01/app/oracle/product/18.0.0.0/dbhome_1/admin/suginm01_nrt1mv/xdb_wallet))(Presentation=HTTP)(Session=RAW))
```



iptables を無効にします。再起動時にも起動してこないようにします (Network Security Group でセキュリティを担保することが出来るため)

```
service iptables stop
chkconfig iptables off
```



# Enterprise Manager Express で見れる内容

DBaaS インスタンスに接続します
https://IPaddress:5500/em

Flash が必要になります。ブラウザで適宜設定を行い、Flash を有効にします。

以下のアカウントを入力して、Loginを行います

- ユーザー名 : sys
- パスワード : DBaaS インスタンスを作成したときに指定したパスワード

![1566064844077.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/1fbf6106-1fe5-ceff-d011-1f897092fee5.png)



トップページが表示されます。CPUやメモリのリソース消費量、SQL監視が表示されています。

![1566064942023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/106e763a-b06b-879e-b54e-6d0e8c7883a3.png)



構成 - リソース管理 メニューを開くと、リソースの詳細画面を表示することが出来ます。

<img width="955" alt="1566065101889.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/9007daff-cc32-184a-dca8-a1f5ffe3e7ab.png">



パフォーマンス・ハブ

![1566065333922.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/37f272be-93df-e1df-729f-874a6465f141.png)



パフォーマンス・ハブ配下のワークロードタブ

![1566065454597.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/3c8c1a94-b579-2761-e085-09586435a0b8.png)



# 参考URL

https://qiita.com/o_nohike/items/c38ca0feba5e18750734
Raspberry PiをTime Capsuleにする(2019年8月編）

#はじめに
Time Capsule作ろうと思ったのですが情報が古かったりしてかなりハマったので新しく書き記すことにしました。
こんなのを作る方法として今回のNetatalkを使う方法と、Sambaを使う方法の2種類があり、将来性のことを考えたら後者の方がいいかなーと思いましたが、残念ながら私の環境では動きませんでした。誰か成功したらやり方教えて下さい。

#環境
- Raspbian Buster
- macOS Mojave 
- netatalk 3.1.12

#HDDの準備
HDDをMac OS拡張(HFS＋)でフォーマットします。
Macが起動しなくなってバックアップから戻す時、バックアップしたHDDを直接つないで読み込ませる必要があるのでこの作業が必要です。
ext4だと泣くことになります。泣きました。
Macに一旦つないでディスクユーティリティからフォーマットしましょう。
フォーマット後、デスクトップにあるHDDのアイコンを右クリックし、「情報を見る」からeveryoneにR/Wの権限を与えましょう。
後述するhfsprogsが既にRaspberry Piに入ってる人はGParted等からフォーマットする事も出来ます。

#先ずはおまじない
念のためやっておきましょう

```
sudo apt update
sudo apt upgrade
```


#Netatalkとかのインストール
ここも他のサイトでは大量のパッケージを入れてビルドしてみたいなことをやってますが、シンプルに

```
sudo apt install netatalk 
sudo apt install avahi-daemon
```

で問題ありません。

#HFS+を扱うための諸々のインストール

```
sudo apt install hfsprogs hfsplus
```

#自動マウントとfstabの編集
マウント先のフォルダをまず作ります。私は`/media/tm`にマウントしたので

```
sudo mkdir /media/tm
sudo chown pi:pi /media/tm
sudo chmod 777 /media/tm
```

次に、フォーマット済みのHDDを接続して

```
sudo blkid
```

でUUIDを調べます。`TYPE="hfsplus"`がついてるやつがそれです。
UUIDをコピーしたら、

```
sudo nano /etc/fstab 
```

でfstabを開いて

```fstab
UUID=[PUT YOUR UUID] /media/tm hfsplus force,rw,user,auto,nofail 0 0
```

を追記します。
ここまで完了したら`sudo mount /media/tm`で特にエラーも出ずマウントされればオッケーです。

#Netatalk等の設定
こっから下は情報が錯乱してて私も動くまで色々試行錯誤したので、もしかしたらおかしいところがあるかもしれないのですが、最低限これで大丈夫なんじゃないだろうかってのを書き記します。
動かなかったら報告ください...

ひとまずこれは絶対必要そうな`afp.conf`の設定です。

```
sudo nano /etc/netatalk/afp.conf
```
で設定ファイルを開いて

```afp.conf
[Global]
  mimic model = TimeCapsule6,106
  mac charset = MAC_JAPANESE

[TimeMachine]
  path = /media/tm
  time machine = yes
```
に変更します。

続いて、

```
sudo nano /etc/nsswitch.conf
```
で設定ファイルを開いて
hostsの部分を

```nsswitch.conf
files mdns4_minimal [NOTFOUND=return] dns mdns4 mdns
```
に書き換えます。

そんでもって

```
 sudo nano /etc/avahi/services/afpd.service
```
に

```xml:afpd.service
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
    <name replace-wildcards="yes">%h</name>
    <service>
        <type>_afpovertcp._tcp</type>
        <port>548</port>
    </service>
    <service>
        <type>_device-info._tcp</type>
        <port>0</port>
        <txt-record>model=TimeCapsule</txt-record>
    </service>
</service-group>
```
って書いてやります。
ここまでやったら

```
sudo service avahi-daemon start
sudo service netatalk start
sudo systemctl enable avahi-daemon
sudo systemctl enable netatalk
```
とすればMacのシステム環境設定→TimeMachine→ディスク選択に出てくると思います。多分


#これでダメだったら...

```
sudo nano /etc/nsswitch.conf
```
をまた開いて

```nsswitch.conf
passwd:         compat
group:          compat
shadow:         compat
```
にしてみてください

また、`afp.conf`の場所も

```
sudo nano /etc/netatalk/afp.conf
```
ではなく、

```
 sudo nano /usr/local/etc/afp.conf
```
かもしれません。

# 再起動して書き込めなくなったら
これで治る

```
sudo fsck.hfsplus -f /dev/sdb1
sudo mount -a
```
FlutterのinitState()内で非同期処理の完了を待ちたい時の対応

# 背景
初期化処理内で非同期処理の完了を待ちたかったため、`void initState() async {...}`としたところ以下のようなエラーが発生した。どうやら`initState()`は`async`にできないらしい。

```
State.initState() must be a void method without an `async` keyword.
Rather than awaiting on asynchronous work directly inside of initState,
call a separate method to do this work without awaiting it.
```

# 環境
- Dart 2.4.0
- Flutter 1.7.8

# 対応
今回は、非同期処理が完了しないとウィジェットのbuildが失敗するというのが、初期化処理内で非同期処理完了を待ちたかった背景であった。
そのため、以下のどちらかを利用し、非同期処理の完了を待ってからウィジェットをbuildさせる。

- StreamBuilder
    - 非同期処理の更新する変数が変化する度にウィジェットをbuildし直すBuilder
- FutureBuilder
    - 指定した非同期処理の完了を待つBuilder


今回は、初期化処理以外でも変数を更新する必要があるため、StreamBuilderを利用する。

```
  //  StreamControllerの指定
  StreamController<int> _controller = StreamController<int>.broadcast();
  ...

  Widget build(BuildContext context) {
    return Scaffold(
      ...
      body: StreamBuilder(
        stream: _controller.stream,
        builder: (context, snapshot) {
          if (snapshot.data == null) {
          ...
          } else {
          ...
          }
        }
      ),
    );
  }

  //  変数をウォッチしたい非同期処理
  Future hoge() async {
    value = ...
    _controller.add(value);
  }
```
xibで(から)起動する(Storyboardではなく)[Swift]

# Storyboardとxib
Storyboardでの開発は人によって流派が分かれており
**・1Storyboardに１画面**
**・1Storyboardに複数画面**→`UITabController`とかに使われがち？

`Storyboard`じゃなくて`xib`でよくね？
→**`conflict`が起きにくいから**
なんてのもあるんだとか。

# やり方
`xib`から起動させる際の**やり方と注意点**をまとめました
#### AppDelegateをいじる
・`hogViewController.xib` , `hogViewController.swift`の場合を書きます

```AppDelegate.swift
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
//1: この４行か(navigationControllerつけたい場合はこちら)
        self.window = UIWindow(frame: UIScreen.main.bounds)
        let navigationController =  UINavigationController(rootViewController: hogeViewController())
        self.window?.rootViewController = navigationController
        self.window?.makeKeyAndVisible() //signal SIGABRT, Console(libc++abi.dylib: terminating with uncaught exception of type NSException)
//2: この3行を追加します
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.rootViewController = hogeViewController(nibName: "hogeViewController", bundle: nil)
        window?.makeKeyAndVisible()
        
        return true
    }
```

#### xib側の設定
・`view`を`IBOutlet`みたいな方式で繋ぎます(**ただし左クリック**)
→`Placeholders`
![スクリーンショット 2019-08-18 0.59.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427937/5e098b94-8ff7-5f19-9426-147bc837fa51.png)

これやらないと`AppDelegate`のclassの行のところで`signal SIGABRT`でクラッシュします

#### xcode側の設定(注意点)
・`プロジェクト名.xcodeproj`→`TARGETS`→`Deployment Info`→`Main Interface`まで移動します
ここが僕がつまづいたところなんですが、自作の`Storyboard`作成した時と同じように
気を利かせて`hogeViewController.xib`を選択すると`AppDelegate`のclassの行のところで`signal SIGABRT`でクラッシュします
(**一応選択できてしまうのが落とし穴すぎる。。。w**)
![スクリーンショット 2019-08-18 0.37.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427937/0b7f8758-a91c-073b-da14-4b8695957bf1.png)

**以上の３点をクリアしてビルドするとこんなふうにちゃんとできてると思います**(画像はnavigationControllerの方を書いた場合です)
→`Storyboard`や`xib`が他にあったとしてもこのやり方でいけました
<img width="375" alt="Simulator Screen Shot - iPhone 7 - 2019-08-18 at 02.28.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427937/deac012d-b7b2-292d-a4ed-aa9dca279464.png">

お疲れ様でした


# 参考
**・[【Swift4】アプリの初回起動画面を storyboard ではなく xib にする - 3時のKAIHATSU](https://3jino-oyatsu.com/blog/131/)**
AutoLayoutを使って画面のViewを編集する方法

##はじめに
今回はこんな人達に向けて記事を書いてみました。

* AutoLayoutを初めて使う人
* ボタンの意味や使い方がいまいちわからない人
* 複数のViewを編集したい人。

AutoLayoutの使い方を備忘録的にまとめてみました。

##AutoLayoutとは

>AutoLayoutとは**「制約」**と呼ばれるものをLabelやButtonなどにつけることによって画面サイズの違う端末に同じアプリケーションの画面を作る事ができる機能のことです。

<img width="915" alt="スクリーンショット 2019-08-17 23.01.52 2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/10449a33-ad69-5c48-70cc-f42b5b7e2c36.png">


上の画像のように制約をつけないと端末が変わったときにボタンの位置がおかしなところに表示されたりする。

###制約をつけるとどうなるか


![スクリーンショット 2019-08-17 23.23.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/69b018e3-07da-66b7-3616-96207d9e06e8.png)


##AutoLayoutの使い方

制約の種類

制約の種類は大きく分けて2種類あります。
1つ目はAlign2つ目はPinと呼ばれる制約です。

![AlignとPen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/7b97d4d7-7ccf-7168-1455-10572a1fa0e9.png)

###制約1　Alignについて

Alignは
簡単に説明すると、**wordで言う右揃え中央揃えみたいなもの**でそれぞれの部品を右に揃えたり中央に揃えたりといった制約です。

![Main.storyboard — Edited 2019-08-18 00-39-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/1760d8e9-1b98-c0aa-5532-2c0b6cd56e8d.png)


上の画像はLeadingEdgesをしたときの画像です。
このように2個以上の部品を選択して行うことで左揃えになりました。

####よく使うのは青枠で囲まれているもの
下の青枠で囲まれているものは水平方向の中心に部品を持ってくるものと鉛直方向の中心に部品を持ってくるものです。これらは1つの部品だけを選択して制約をかけることができます。



###制約2　Pinについて

Pinは
簡単に説明すると部品を格納しているものからどのくらいの余白をあけるかを設定する制約です。HTMLなどを書かれている方はmarginやpaddingを想像してもらえればわかりやすいと思います。

####注意点
実際のアプリケーションには複数のViewから成り立っていて階層が一番下のViewとその上に配置されているViewがあったらどちらかのViewからどのくらい余白をあけるかを設定することになります。ここが最初は分かりづらいですが、

前回私の書いた[[Swift]ストーリーボートでオブジェクトが重なってしまって編集できない時の解決方法](https://qiita.com/techiromen0/items/38b21c2332544864cf5b)の
ドキュメントアウトラインについて読んでもらえればなんとなくわかると思います。

**部品の配置は階層になっていて下から上に部品を載せて行くイメージでした。**


<img width="640" alt="Main.storyboard — Edited 2019-08-18 01-14-40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/1317ae5d-b3df-d747-6f6a-89c6470347b9.png">

* textArea
* Button
をsubViewの中に入れる。

####Pinを入れてみる。
<img width="1304" alt="Main.storyboard — Edited 2019-08-18 01-25-01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/bd012513-e809-0735-678d-8276aff16dde.png">


するとsubViewは画面いっぱいに大きくなったと思います。
このようにして制約を入れていけば思い通りにViewやButtonなどの部品を配置することができます。

ここまでが基本的な使い方です。

###中級者向け　入れ子になった制約

私がPinのところで注意点としてあげた複数のViewがあった場合どちらのViewから制約をかけるかという問題ですが、
これは簡単に解決することができます。

先程の続きを使いますが
<img width="500" alt="Main.storyboard — Edited 2019-08-18 01-46-45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/c3034043-631a-06f3-6019-88410b703ad6.png">

次にTextAreaをsubViewの中で編集してみたいと思います。

下の制約をsubView
から30px余白を開けてみます。
先程と同じようにTextAreaを選択した状態でPinを編集していくのだが、今回2つの選択画面が出てきた。
![スクリーンショット 2019-08-18 2.02.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/c8786891-3d80-b522-c1f2-0e67c973b68f.png)


これはTextAreaがView(subView)とButtonの2箇所からの余白が選択できるためこのような画面になった。

したがって上や左右のPinでは表示されない。あくまでもどこを参照して余白を作るかだけを見ている。

ここはあまりAutoLayoutを使用しない人は思考停止してしまうポイントだと思う。

##最後に

AutoLayoutはInterfaceBuilderで編集が可能でプログラミングを一切行わなくても設定が可能です。
したがって、プログラミングを行わなくても良い点では非常に便利だと思うので積極的にAutoLayoutを使っていきましょう！

ではまた！
ウェブサービスを作ってみる（2、技術選定・計画）

# はじめに

前の投稿
https://qiita.com/tsnb/items/90dccfce370190e11012

今回は、ウェブサービスを作るためにざっくり技術選定とフェーズごとの計画をする。
この投稿の情報量はゼロなので読もうとしている人は去った方がいいです！
道のり長すぎてはげそう。

# 参考にする情報

https://github.com/kamranahmedse/developer-roadmap
https://employment.en-japan.com/engineerhub/entry/2019/06/07/103000


# 考慮事項

- セキュリティが大事なので、後々は力を入れるがまずは簡単な方法をとる
- 個人開発でリソースがないのでインフラは最小限で始める
- 外部APIを呼んで必要なデータを取ってくる予定だが、まずはダミーデータを自分たちで作って開発を進める
- できるだけ課金しない
- 機械学習できる必要がある
- フロントでプログラムを書いて、バックエンドで処理する機能が必要

# フェーズ0

Firebase Cloud Function、Authentication、Hosting、Firestoneなどをまずは使う。
フロントエンドの知識がないのでまずはjavascriptをベタで使ってログインできるようにする。
Firestoreにダミーデータを入れる。
Cloud Function（golang）でテスト用のAPIを実装する。
フロントエンドからAPIを叩いてデータを取得してグラフ表示する。
見栄えは無視。

### 利用ツール
- Firebase様
- javascript
- golang

# フェーズ1

サービス的に大規模なデータに対してデータ処理や分析が必要になる。
フェーズ0でAPI内で実装していた加工などの処理をBQでできるようにしたい。
firestoreからBQにデータを送る。
DataflowでBQのテーブル内のデータ加工を行ってBQにデータを再び格納する。

まずは無料枠で頑張って、無料枠が終わったらAlways freeの範囲で使ってみる。多少の課金は許容する。

### 利用ツール
- BQ
- Dataflow

# フェーズ2

必要な機能とAPIを作っていく。
javascriptで作り込んだものをReact+Typescriptに置き換えていく。
見栄えにもこだわりだす。

### 利用ツール
- React
- Typescript

# フェーズ3

サービス的にプログラムを投稿できる機能が必要なので、GKEなどでプログラム処理用のインスタンスを管理する必要がありそう。
dockerでtensorflowなどが入ったjupyterlabを起動してフロントに渡せれば実装コストが下がりそう。
負荷の高い処理を実行されないように制限とかできるのかな。

### 利用ツール
- GKE
- Stackdriver
他にもありそうだが一旦無視

# フェーズ4

二要素認証を取り入れてセキュリティレベルを高める。
脆弱性診断とペネトレーションテストの導入。
アクセスログ解析、監視・バックアップや非機能要件を検討する。

# 今後の予定

今後は、フェーズ0を実施する。
「Integromat」を使ってSlackからツイート

#動機
ツイッターへのアクセスがブロックされている職場にて、どうしてもデスクから離れずして、かつ周りにばれないようにツイートを敢行したい！
#Integromatを用いる理由
- Slackから直接のツイートを実現している記事が見つからなかった
- IFTTTではWebhookの形式が合わなかった
- Integromatを初めて使う題材としてちょうどよかった
- 連携サービス以外の手段とくらべて比較的簡単

#準備！
まずは下記からintegromatへサインアップ（登録）を行なってください
https://www.integromat.com/
登録が完了したら、Dashboardが表示されると思いますが、画面右上の「Create a new scenario」ボタンを押下してください。
「What services do you want to integrate?」と書かれた画面が表示されたら、テキストボックスに
「Webhooks」と入力、出てきたアイコンをクリック
「Twitter」と入力、出てきたアイコンをクリックし、右上のContinueをクリックしてください。
下記のような画面になりましたでしょうか？
<img width="1440" alt="スクリーンショット 2019-08-17 20.06.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396608/5d3e331f-b7fa-d381-7aca-5becd6041761.png">

ここまででいったんIntegromatの準備は完了です！

#Integromat側
中央の「？」をクリック→「Webhooks」→「Custom Webhook」をクリックすると？の部分がWebhookのアイコンに変化します。
さらにそのアイコンをクリック→Addをクリックすると
<img width="1093" alt="スクリーンショット 2019-08-17 21.12.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396608/f2c5320d-b098-72af-26ba-fbfd9c2b62f4.png">
このような状態になると思います。Webhook nameは適当に決めていただいて、Save。
するとピンクのウインドウのコンボボックスの下にURLが表示されます。「Copy address to clipboard」を押すことでコピーし、どこかにメモっといてください。

次に、Webhookの右側の出っ張りをクリックしましょう。すると右側に新たな？が出現します。
先ほどのようにクリックし、次は「Twitter」→「Create a tweet」を選択してください。
<img width="1038" alt="スクリーンショット 2019-08-17 21.38.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396608/b656252b-c96c-c8f7-b526-eacb2f84bc61.png">
こんな感じになりましたでしょうか？
なりましたらAddをクリックしてください。
<img width="404" alt="スクリーンショット 2019-08-17 21.41.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396608/a51f92cd-2ca2-7932-6389-9a0ca15abb9e.png">
「Connection name」に適当に入力して、名前をつけていただいて、チェックボックスを外してからContinueを押してください。すると見慣れたTwitter連携の画面が別ウインドウで開くと思うので、連携しちゃってください！

#Slack側
アプリ追加にてOutgoing Webhookを追加してください。
設定にて、URLに先ほどメモしたWebhookのURLを記入し、「チャンネル」「引き金となる言葉」その他説明やカスタマイズをお好みにした上で設定を保存してください。

#再度Integromat側
SlackからどんなWebhookが送られてくるかをIntegromatで把握するために、一度設定が完了したSlack側からテストとして、設定したチャンネルから（もし引き金も設定していたらそのワードも含めた上で）チャットを送信してみましょう。すると
<img width="396" alt="スクリーンショット 2019-08-18 1.46.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396608/4be3ab09-32a0-d5d9-5082-ea86fdd6de0d.png">
IntegromatのWebhook設定画面に「Re-determine data structure」と表示されていれば、Webhookのデータ構造を取得できています。
そうしたら、今度はTwitterの設定画面の「Status」のテキストボックスをクリックしてください。textという項目があるはずなので選択してくださると
<img width="395" alt="スクリーンショット 2019-08-18 1.49.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396608/636c3b81-61aa-1779-157e-8fb36bb5dd49.png">
となるはずです。

ここまでで設定完了です。

正常に送信できるかテストしてみてください。

#さいごに
Integromatとツイッターの相性がかなり良いので、少々複雑になりますが、ふぁぼったツイートに添付された画像を全件保存するなどの処理を作ることもできます。
IFTTTのみではこの処理を実装しようとすると１ツイートにつき１件しか保存できなかったりします。
需要があれば画像保存のスクリプトの組み方なども紹介したいと思います。
Sassのおさらい（基礎知識まとめ）

※友人からのレクチャーをノートにまとめてあった内容を自分用に転記

# [Sass](https://sass-lang.com/)が必要な理由
- レスポンシブが主流（SEO的なことで）
- CSSアニメーションの方がJavascriptより早い
- CSSの記述が長くなってしまうのをSassでまとめる
- CSSはプログラミング言語として機能しきれていない

# Sassを導入すると
- CSSより少ないコード
- コードの再利用性アップ
- メンテナンス性アップ（整理しやすい）

# 抑えておくべき用語
## CSSプリプロセッサ（CSSメタ言語）
- Sassは「CSSプリプロセッサ」である。CSSを使いやすくするためのもの
- 他に[Less](http://lesscss.org/)、[PostCSS](https://postcss.org/)等の種類がある。人気どころはSassだが、機能的にとくに差異はない

## ベンダープレフィックス
- ブラウザ毎のクセを解しようとすること

## コンパイル
- SassファイルをCSSファイルに変換すること
-  `.scss`→`.css`というように拡張子が変わる

## コンパイラ
- コンパイルしてくれるソフトフェア
- [Codepen](https://codepen.io/)、[Koala](http://koala-app.com/)、[gulp-sass](https://www.npmjs.com/package/gulp-sass)+[Gulp.js](https://gulpjs.com/)などがある

## ネスト
- 同じ記述を繰り返さない
- 関係が可視化
- `@media`をセレクタより内側に書ける
- 複雑なルールも短く書ける
- やりすぎ注意（チームのルールに則ること）

```sass:likethis.sass
.contents {
 h1 { font-size: 32px; }
 h2 { font-size: 28px; }
 p { 
  span { font-weight: bold; }
 }
}
```

## 変数
- 値に名前をつけて流用できる。`$theme-color: #333;`というように
- 入れ子にも書いてOK（入れ子でしか流用できない）
- 同じ変数に複数回値が入った場合、その変数が使われている場所で最新の値が適用される
- 変数名の頭に数字を入れない

```sass:likethis.sass
// サイトのテーマカラー
$theme-color-text: #333;
$theme-color-link: #00f;

h1 { color: $theme-color-text; }
h2 { color: $theme-color-text; }
a { color: $theme-color-link; }
```

### 良い使い方
- サイト全体で使うものは初めに宣言
- 長めの名前で被り防止
- ある場所でしか使わない時は入れ子内で短い名前で

## 演算
- 同じ単位同士での四則計算が可能
- 小数点、変数も使える

```sass:likethis.sass
// 画面幅の1/3
.contents { width: 100% / 3; }
```

# 基本機能
## `@import`
- 別のSassファイルを呼び出す呪文

```sass:likethis.sass
@import "_common.scss";
```

## `@mixin`
- スタイリングに名前をつけてプリセット化して使いまわせる呪文
- 引数（パラメータ）が使える

```sass:likethis.sass
// プリセットを指定
@mixin my-pattern ( $line-height, $font-family, $font-size ) {
 line-height: $line-height;
 font-family: $font-family;
 font-size: $font-size;
}

// プリセットを利用
.contents { 
 @include my-pattern ( 1.5, Roboto, 16px );
}
```
↓コンパイル後

```sass:likethis.css
.contents { 
 line-height:　1.5;
 font-family: Roboto;
 font-size: 16px;
}
```

# 補足
- SASS記法はRuby風、SCSS記法はCSS風

# 参考（教材）
http://book.scss.jp/
Fakerでダミーデータ作成

Fakerというライブラリを利用してRubyでダミーデータを扱います。

Faker [https://github.com/stympy/faker](https://github.com/stympy/faker)

生成してくれるデータは名前、住所以外にもメールアドレスなど多岐に渡ります。
インストールはいつものようにgem install fakerしてください。

以下のようなサンプルを用意して実行してみます。

```ruby:sample.rb
#coding utf-8

require 'faker'
require 'Set'

puts Faker::Code.ean #=> EANコード
puts Faker::Name.name #=> 氏名
puts Faker::Lorem.sentence #=> loremな文章
```

今回は商品識別コードであるEANコード（日本のJANコードみたいなやつ）、氏名とLorem ipsum（一種のダミーテキスト）を出力してみます。
これを実行してみるとこんな感じになります。

```bash
$ ruby sample.rb 
8227509485998
Osvaldo Trantow
Nihil voluptatem voluptatem ut.
```

Fakerは便利なことに多言語対応していてロケールを切り替えれば各ロケール固有のフェイクデータを作成できます。
例えば日本にセットすれば日本名の姓名が生成されます。これは単にlib/localesにあるメッセージファイルに記載しているだけなのでここに追加すればバリエーションを増やすことも可能だと思われます。

```rb:lib/locales
Faker::Config.locale = :ja

puts Faker::Name.name #=> 日本語氏名
puts Faker::Address.name #=> 住所
```

生成できるデータの種類は多岐に渡り、インターネット関連だとメールアドレス、ドメイン、URLなどもあります。それ以外にも各種住所関連、クレジットカード番号とか電話番号が生成できたりします。
加えてそれぞれ結構細かい単位で生成することもできて痒いところに手が届く感じなので、テストコードなんかでダミーのパラメータを用意するときとか地味に面倒なのですごく役に立つかと。
ソートアルゴリズム、これだけおさえとく

##ソートアルゴリズム習得のPOINT
・ソートにはいろいろなアルゴリズムがあることを知る
・アルゴリズムの実装が必要になったときに調べる、暗記は不要
・アルゴリズムにより効率には天と地ほどの差があることを知る
・アルゴリズム採用時にはワーストケースを考える
・その高速化は本当に意味があるのか、必要なのか考える
・先人の知恵を有効活用する

##ソートとは
配列などのデータを何らかの順に並べ変えること。
以下に代表的なソートアルゴリズムを紹介します。
なお、ここではソート対象の要素を左から右へ向かって昇順にソートすることにします。
昇順とは右に行くに従ってだんだん要素の値が大きくなっていくという意味です。

###バブルソート
最初の2要素に注目し、左＞右ならひっくり返す、
次は1個ずれた2要素に注目し、左＞右ならひっくり返す・・・を延々と繰り返すと最大の要素が右端に移動。あとは残りの配列に対して同じことを繰り返せばソートが終了します。
小さな値が泡のように左側に移動してくるのが名前の由来みたいです。計算量はO(N^2)。
例) 配列A[6]={3, 2, 5, 4, 1} でソートの動作を確認
→2 3 4 1 ⑤
→2 3 1 ④ ⑤
→2 1 ③ ④ ⑤
→1 ② ③ ④ ⑤
→① ② ③ ④ ⑤
※丸数字はソート完了の意味


###シェーカーソート(双方向バブルソート)
バブルソートの改良版。左から右に走査した後、次は右から左に走査。これを繰り返す。
しかしシェーカーソートによって得られる高速化は大したことなく、プログラムは結構複雑になるので実用的ではない。
例) 配列A[6]={3, 2, 5, 4, 1} でソートの動作を確認
→2 3 4 1 ⑤
→① 2 3 4 ⑤
→① 2 3 ④ ⑤
→① ② 3 ④ ⑤
→① ② ③ ④ ⑤
※丸数字はソート完了の意味

###(単純)選択ソート
全体でもっとも小さなものを選んで、それを左端にもっていく。
左端に持って行った値はソート済み扱いとする。
未ソートの中でこれを繰り返してすべての数字がソート済みになるまで実行する。
例) 配列A[6]={3, 2, 5, 4, 1} でソートの動作を確認
→① 3 2 5 4
→① ② 3 5 4
→① ② ③ 5 4
→① ② ③ ④ 5
→① ② ③ ④ ⑤
※丸数字はソート完了の意味

###挿入ソート
最初は左端の値を一つの要素とみなします。まず、要素全体をソート済みの部分と未ソートの部分に分けます。あとはそのソート済み配列の適切な個所に、未ソートの部分の要素を順次挿入していきます。
例) 配列A[6]={3, 2, 5, 4, 1} でソートの動作を確認
→③ 2 5 4 1
→② ③ 5 4 1
→② ③ ⑤ 4 1
→② ③ ④ ⑤ 1
→① ② ③ ④ ⑤
※丸数字はソート完了の意味


###ヒープソート
ヒープ構造の特徴である「根(配列の先頭、N[0])に必ず最大値が来る」という点を利用する｡
続きはWebで。

###クイックソート
現在もっとも高速と言われているソート法です。
対象とする配列の中からまず、ピボットと呼ばれる値をひとつ選択します。
そして配列をピボットより小さな要素の配列と大きな要素の配列に分離する。
これを再帰的に繰り返す。計算量はO(Nlog2N)
手順は下記。
1.左端からピボットより大きなデータがないか検索する
2.右端からピボットより小さなデータがないか検索する
3.双方ともに見つかればその2者を交換する
4.上記の操作を左端から検索している添字と右端から検索している添字が衝突するまで繰り返す

###マージソート
クイックソートが大きな配列を徐々に分割しながらソートをするのに対し、
マージソートは**小さなソート済みの配列を併合しながらソートする**方法です。
続きはWebで。



##どのソートが一番速いのか
今回紹介するソートについて50000件の
ランダムなデータをソートするのに要した時間が下表です。

| アルゴリズム     |       所要時間(ms) |   
|:-----------------|------------------:|:------------------:|
| バブルソート      |              13,262|        This        |
| シェーカーソート           |            9,513 |       column       |
| 選択ソート             |              5,242 |        will        |
| 挿入ソート               |                5,192|         be         |
| ヒープソート            |             40 |       center       |
| クイックソート          |           24|      aligned       |
| マージソート    |           46|      aligned       |

**POINT**
・アルゴリズムにより処理効率に天と地ほどの差がある
・クイックソートでも使い方次第では遅くなることもある（元々ソートされて、かつピボットの選択が左端など）

##C言語ではqsort()が用意されてる
数回しか使わないプログラムの処理時間を1分縮めるために何か月もかけた（しかも完成できなかった）という逸話があるみたいです。
また、プログラムを最初に書いている段階では高速化のために凝ったアルゴリズムを採用するより、実装の簡単なアルゴリズムでとにかく書いてしまうことが重要な場合も多いと思います。
ここではそんなときのためにqsortの使用例を紹介します。

```
void qsort(void *base, size_t num, size_t size, 
           int (*compare)(const void*, const void*))

#include <stdlib.h>

int compare_int(const void *a, const void *b)
{
    return *(int*)a - *(int*)b;// ★b-aにすると降順
}

int main(void)
{
    int data[] = {4, 2, 3, 6, 3, 2, 1, 3, 5, 7};
    int i;
    qsort(data, 10, sizeof(int), compare_int);
    for (i = 0; i < 10; i++) {
        printf("%3d", data[i]);
    }
    printf("\n");
    return 0;
}

実行結果
  1  2  2  3  3  3  4  5  6  7
```
備忘碌　mysql-connector-python　を利用したレコード取得

# 概要
機械学習の為、SQLを利用して在る期間のレコードを取得する　ソースを作成したが、pandasで代用出来るとの事で不要となった
備忘録も兼ねてソースを記載する。

## import 

```
import mysql.connector
```

## palam
```
toDB = '【database name】'
toTable_1H = '【table name】'
sql_usr = '【mysql user】'
sql_pass = r"【mysql user password】"
sql_host = '【database server host name】'
sql_port = '【port】'
sql_char = '【charset】'
```

## class

```
def get_vol(tables,start_time,end_time):
    sql_query = "select * from " + toTable_1H + " where date(date) >= '" + start_time +"' and date(date) <= '" + end_time + "'"
    cur.execute(sql_query)
    res = cur.fetchall()
    return res

```

## connection 
```
conn = mysql.connector.connect(
    host=sql_host,
    port=sql_port,
    user=sql_usr,
    password=sql_pass,
    database=toDB
)

# connection DB from ping check
conn.ping(reconnect=True)

# DB pointer maked
cur = conn.cursor(buffered=True)
```

## get volume

```
res = get_vol(toTable_1H,'2018-3-22','2018-3-24')
```

## disconnection database
```
cur.close()
conn.close()
```
TP-LINK Archer T2U Nano をRaspberry Pi2 で使う

# Raspberry Pi2の無線LANについて
Raspberry Pi2には無線LANインタフェースが搭載されていない。夏休みの宿題としてRaspberry Pi2を使った作業のついでにUSBの2.4GHz/5GHz無線LANアダプタを設定したけれども意外に手こずったので、記録を残しておきます。

# 2020.6.14 追記修正
Raspberry Pi OS のリリーズ10にアップグレードし、再コンパイルが必要になって確認したところ、少し変更点がありました。

- rtl8812au.gitのブランチは、5.7.0です。

```ruby:
git clone -b v5.7.0 https://github.com/aircrack-ng/rtl8812au.git
```
- airmon-ngはなくなりました。


# TP-LINK Archer T2U Nano ドライバ
2019年8月15日現在、Respberry Pi2 の最新モジュールは 4.19.58-v7+ になっています。ネットにいくつかのドライバーソースがありますが、最新モジュールではうまくコンパイルが進みませんでした。
結局、ドライバーの情報については、[WikiDevi TP-LINK Archer T2U Nano](https://wikidevi.com/wiki/TP-LINK_Archer_T2U_Nano)の右側のProbable Linux driver欄にある情報が正しいです。
（2024/03/12追記：現在上記のwikiサイトに到達できません。代わりのアーカイブサイトは[インターネットアーカイブ](https://web.archive.org/web/20191003035149/https://wikidevi.com/wiki/TP-LINK_Archer_T2U_Nano)にあります。）

GitHubの[aircrack-ng/rtl8812au](https://github.com/aircrack-ng/rtl8812au)にある通りにダウンロードとコンパイルを行います。
## コンパイル手順
コンパイルは dmksと通常のmakeの２つが準備されていますが、makeを使用しました。
Readme.mdにあるとおり、Raspberry Piのカーネルヘッダファイルをインストールします。

```ruby:
git clone -b v5.7.0 https://github.com/aircrack-ng/rtl8812au.git
cd rtl8812au
sudo apt-get install bc raspberrypi-kernel-headers
```

_ブランチをv5.3.4からv5.7.0に変更しました。_

Makefile内のパラメータを書き換えます。

```ruby:Makefile
CONFIG_PLATFORM_I386_PC = n
CONFIG_PLATFORM_ARM_RPI = y
```

Raspberry Pi3 の場合は次の通りです。

```ruby:Makefile
CONFIG_PLATFORM_I386_PC = n
CONFIG_PLATFORM_ARM64_RPI = y
```

コンパイルを実行し、インストールを行います。

```ruby:
make clean
make
make install
```

インストール後、WiFiのモニターモードを設定します。

```ruby:
airmon-ng check kill
sudo ip link set wlan0 down
sudo iw dev wlan0 set type monitor
sudo ip link set wlan0 up
```
_Raspberry Pi OS 10 と v5.7.0のドライバの場合、airmon-ngインストールされないので、上記処理は必要なくなったと思われます。_


# なぜT2U Nanoつかっちゃったのか
USBの2.4GHz/5GHz無線LANアダプタは多くの種類が発売されていて、近所の電気屋さんで手に入るもので一番速そうなT2U Nanoを選んでみました（無知とは怖いものです）
T2U NanoはRealTek8812auを使用しており、Raspberry Pi2でドライバをインストールする記事はいくつかありましたが、記載が古く現在のカーネルにはソースコードが対応てきていなかったり、かなり手を入れてもコンパイルできなかったりでした。（涙）
最終的に、ここに記載されたソースと、rtl8812AU_8821AU_linuxというソースがあり、先にrtl8812AU_8821AU_linuxを試したのですが、5GHzを拾えなかったので再度色々と調べた結果、このソースにたどり着きました。
このドライバーですが、初期設定では、TX出力は低めに設定されています。使用環境によっては、SSIDを洗濯してもアクセスポイントに接続できない場合があり、TX出力を上げる必要があるかもしれません。

```ruby:
sudo iw wlan0 set txpower fixed 3000
```

で解決できるかもしれません。
eachとmapの違い


# 結論

`each`が**元の配列**
`map`が**処理後の配列**

を返します。

#具体例

例として、`1〜3`にそれぞれ`1`を足すとします。

eachの場合、返り値は**元の配列**になるので、`[1, 2, 3]`になります。 
処理結果を取得する場合、eachブロック外で変数を定義（num = []）し、ブロック内で保存する必要があります。

```Ruby
num = [] 
[1, 2, 3].each do |i|
 # ブロック内で保存
 num <<  i + 1
end

# =>[2, 3, 4]
```

一方mapの場合、返り値は**処理結果の配列**となります。
そのまま使用することができるので、以下の場合は`[2, 3, 4]`となります。

```Ruby
[1, 2, 3].map do |i|
  i + 1
end

# =>[2, 3, 4]
```
Asanaを使おう！

Asanaの無料プランの簡単な使い方と使ってよかったところ、知っておくと便利なことを新しく使用する方に向けてまとめます。
#Asanaって?
Facebookの共同創業者が作ったプロジェクト管理ツールです。
シンプルできれいなUIで、直感的に操作でき、快適に少ない労力で仕事の効率化が図れます。
動作が軽く、ショートカットも充実しているので、操作感の気持ち良さ、無料で結構なところまで使えるのもすごいところです。

#基本的な使い方
1. タスクを登録
2. 優先度ごとに整理
3. タスクが終わったら完了をマーク
  
というのが基本的な使い方です。
タスクには、__いつまでにやるかの日程__と__担当者__を設定でき、簡単にタスクを書き出して見える化して管理できます。

操作も軽快で▼ショートカットを使うとこんな感じでさくさく使えます
![2019-08-15 22.17.07.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92494/53033bf4-2d46-4924-227c-672fdc0ee1fe.gif)
（操作：3つのタスクを登録、task01は「Today」に、task02は「Upcoming」に、task03は「Later」に振り分け、task01を完了に）

タスク作成時、タスク名入力後Enterで入力の決定と次のタスク作成が一緒に行われるので、改行で区切りながら文字入力していくだけでタスクが作れるのが地味に心地いいです。

#Asanaを使うと何がいいのか
- 簡単にタスクを確認できる（自分のも、他の人のも）
    - タスクを作ったら、先のタスクは忘れて今やるタスクに集中できる
        - “忘れないようにしている”ということにも労力がかかっているので思いの外、楽…！
    - 社内で誰がなにをしているかが互いに把握できるようになる
    - 新しい案件を受けたらデカめの案件を忘れていて手が回らなくなるというありがちのパターンを防げる
- タスクに関わる情報が確認しやすくなる
    - チャットツールでは少し経つと投稿が流れていってしまい、後から情報を探す時に大変になるが、タスクごとに分けて扱えるので、関連する情報を見つけやすい
    - 手助けを頼む時に説明が簡単になる（説明する余裕がなくて断念…しなくていい）

#使い方のポイント

###優先度
優先度に応じて整理することで、複数案件を同時進行していると複雑になりがちなタスクも、今するべきことの判断がしやすくなり、進めやすくなります。

優先度の基準には次の3種類が用意されています。
__Today__：今日行うこと（Tab + Y）
__Upcoming__：すぐでなくていいけど近いうちにやる必要のあること（Tab + U）
__Later__：すぐ行う必要のないこと・そのうちやること（Tab + L）

###プロジェクト
複数のタスクからなる作業をまとめられる入れ物のようなものがプロジェクトで、管理と共有に便利です。
実際の業務では「〇〇パッケージデザイン」「〇〇社ウェブサイト制作」など一定の作業のまとまりで作るとわかりやすいです。

###アサイン
そのタスクの担当者を指定することをアサインといいます。
アサインされたタスクはそのユーザの__My Tasks__に表示されるので、複数のプロジェクトに担当タスクが点在していても、自分のMy Tasksを見れば全てのタスクが確認できます。

#知っておくとちょっと便利なこと
###ショートカット
⌘ + / でショートカットの一覧が表示されるので何かと押しましょう（閉じるのはesc）

###日本語にする
英語表記が苦手な方は日本語に設定変更しましょう。
__「My Profile Settings...」 > 「Display」 > 「Language」（日本語を選択） > 「Reload to apply changes」__
（ただ、タスクの優先度の表記が、Today=今日、Upcoming=近日、Later=後日となり、ちょっとテンションが下がってしまうので個人的には英語表記がおすすめです）

###他の人のタスクを確認する
Teamのメンバーを選択、もしくは検索窓にメールアドレスや名前を入力して検索・選択でその人のMy Tasksを確認できます。
ユーザ名右にある星を選択して、「Add to Favorites」すると、左のメニュー「Favorites」から選択できるようになり、確認しやすくなります。


###組織内の全てのタスクを確認する（無料で使用の場合）
__Favorite > ( Show more > ) All Items__
完了したタスクも含めて表示されるのでちょっと不便。
（終わったプロジェクトは削除するルールで運用するならありかも。）

###デスクトップ通知
__My Profile Settings > Hacks > Browser Notifications__をオンに
(因みにに犬派でなければ気分転換用に一緒に出てる__Tab+B__をonに ※僕はoff)

###お祝いの表示
タスクを完了するとお祝いが表示されるようになります。どうでもいいけどちょっと楽しい。
__My Profile Settings > Display > Show occasional celebrations upon task completion__にチェック
vue.js とは

# vue.js
Vueはユーザーインターフェイスを構築するためのプログレッシブフレームワークです。
            一枚板のフレームワークとは異なり、Vueは少しずつ適用していけるように設計されています。
            中核となるライブラリはview層だけに焦点を当てています。そのため、使い始めるのも、他のライブラリや既存のプロジェクトに統合するもの、とても簡単です。

#Hello Vue!

```html
<!DOCTYPE html>
<html>
    <head>
        <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    </head>
    <body>
        <div id="app">
            {{ message }}
        </div>

        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    message: 'Hello Vue! ' + new Date().toLocaleDateString()
                }
            })
        </script>
    </body>
</html>
```

#参考
https://jp.vuejs.org/v2/guide/index.html
TSF (Text Services Framework) サンプルを実行

# サンプル集

https://github.com/microsoft/Windows-classic-samples に TSF や IME のサンプルが幾つかあります。幾つかどころか、結構あります。

```plaintext
Samples\Win7Samples\winui\input\tsf\textservice\extentmonitor
Samples\Win7Samples\winui\input\tsf\textservice\propertymonitor
Samples\Win7Samples\winui\input\tsf\textservice\propertytextservice
Samples\Win7Samples\winui\input\tsf\textservice\textservice-step01
Samples\Win7Samples\winui\input\tsf\textservice\textservice-step02
Samples\Win7Samples\winui\input\tsf\textservice\textservice-step03
Samples\Win7Samples\winui\input\tsf\textservice\textservice-step04
Samples\Win7Samples\winui\input\tsf\textservice\textservice-step05
Samples\Win7Samples\winui\input\tsf\textservice\textservice-step06
Samples\Win7Samples\winui\input\tsf\textservice\textservice-step06-1
Samples\Win7Samples\winui\input\tsf\textservice\textservice-step06-2
Samples\Win7Samples\winui\input\tsf\textservice\textservice-step06-3
Samples\Win7Samples\winui\input\tsf\textservice\uilessmode

Samples\Win7Samples\winui\input\tsf\tsfapps\immpad-interim
Samples\Win7Samples\winui\input\tsf\tsfapps\immpad-level1
Samples\Win7Samples\winui\input\tsf\tsfapps\immpad-level2
Samples\Win7Samples\winui\input\tsf\tsfapps\immpad-level3
Samples\Win7Samples\winui\input\tsf\tsfapps\immpad-level3-step2
Samples\Win7Samples\winui\input\tsf\tsfapps\immpad-level3-step3
Samples\Win7Samples\winui\input\tsf\tsfapps\tsfpad-hybrid
Samples\Win7Samples\winui\input\tsf\tsfapps\tsfpad-step1
Samples\Win7Samples\winui\input\tsf\tsfapps\tsfpad-step2
Samples\Win7Samples\winui\input\tsf\tsfapps\tsfpad-step3
Samples\Win7Samples\winui\input\tsf\tsfapps\tsfpad-step4

Samples\Win7Samples\winui\tsf\tsfapp
Samples\Win7Samples\winui\tsf\tsfcase
Samples\Win7Samples\winui\tsf\tsfcompart
Samples\Win7Samples\winui\tsf\tsfmark
```

## tsfapp

参考: [TSF を使う (2) - tsfapp](https://nyaruru.hatenablog.com/entry/20070310/p1)

## tsfcase

アプリ側で実装する TextStore を TSF から操作するとはどういうことか、について、わかりやすく伝えてくれるサンプルでした。

![tsfcase.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/3dcb025e-46f9-4ba2-d4b3-5621adfb5c07.gif)

## tsfmark

プロパティーに関するサンプルのようですが、使い道が良く分かりませんでした。

![tsfmark.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/da180491-192d-2c62-06ec-8132657d2cf9.gif)

## tsfpad-step4

この TSF アプリサンプルで実現されていることの特徴

- on the spot 変換
 - 文章の途中でタイプすると、割り込んで入力できる。
 - 漢字変換中でも変換枠を出てカーソルを移動できる。
- IMM でいう document feed 活用による文脈を意識した変換。`危機` のうしろで `いっぱつ` を変換すると `一髪` になる。`一発` にはならない。

![tsfpad-step4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/1379d569-47c0-5ded-e4ec-83c747e6576a.gif)
Ruby on Rails6正式版を試す(macOS Mojave)

# はじめに
　普段は**sinatra**や**padrino**を使っているのですが、**Action Mailbox**を試してみたくて**Rails6**をインストールしました。その際、リリースされて間もない為か、これといったインストール手順の記事が見当たらなかったので、備忘も兼ねて書いてみます。なお、既存の環境への影響を抑える為、公式ドキュメント等より煩雑な手順となっております。

# 前提
- **Homebrew**を利用可能であること
    + 参考: [MacにHomebrewを導入する](https://qiita.com/ENIX/items/39664c2936ea3cf9c13d)

    ```shell
    $ brew -v
    Homebrew 2.1.10
    ```

- 2.6系の**ruby**を利用可能であること(**6.0.0**は2.5系もサポートしてます)

    ```shell:インストール例
    $ brew install rbenv ruby-build
    $ echo "export PATH=~/.rbenv/bin:$PATH" >> ~/.bash_profile
    $ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
    $ source ~/.bash_profile
    $ rbenv install 2.6.3
    $ rbenv rehash
    $ rbenv global 2.6.3
    $ ruby -v
    ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin18]
    ```

- **MySQL**を使う場合、**MySQL**が利用可能であること

    ```shell
    $ mysql --version
    mysql  Ver 8.0.16 for osx10.14 on x86_64 (Homebrew)
    ```

# 環境
|   | バージョン |
|---|----------|
| OS | macOS 10.14.6 |
| Ruby  | 2.6.3 |
| Rails | 6.0.0 |
| Node.js | 12.8.1 |
| yarn    | 1.17.3 |
| MySQL   | 8.0.16(参考) |

# 前準備
- 事前に**Rails6**が必要とするプロダクトをインストールします
- 後述する**手順4**の**Webpacker**インストール時に必要となります
- **Node.js**と**yarn**をインストール済みの方は読み飛ばしてください

1. **nodebrew**をインストールします。任意の**Node.js**を利用する為に使用します

    ```shell
    $ brew install nodebrew
    $ nodebrew -v
    nodebrew 1.0.1
    ```

2. **nodebrew**から、**Node.js**をインストールします

    ```shell
    $ nodebrew install stable
    $ nodebrew use stable
    use v12.8.1
    $ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
    $ source ~/.bash_profile
    ```

3. **yarn**をインストールします。**Node.js**を**nodebrew**経由でインストールしている為、**--ignore-dependencies**オプションを指定し、**brew**が**Node.js**を重複インストールしないようにします

    ```shell
    $ brew install yarn --ignore-dependencies
    $ yarn -v
    1.17.3
    ```

# 手順
1. アプリケーション用に、ディレクトリを用意します
    ```shell
    $ mkdir -p rails6_sample
    $ cd rails6_sample
    ```
    <br>
1. 用意したディレクトリに、**Rails6**をインストールします
    ```shell
    $ echo 'source "https://rubygems.org"' >> Gemfile
    $ echo 'gem "rails"' >> Gemfile
    $ bundle install --path vendor/bundle
    ```
    <br>
1. アプリケーションの雛形を生成します。「**Gemfile**を上書きしてもよいか？」と表示されたら、**y**を押してください
    ```shell:SQLite版
    $ bundle exec rails new .
    ```
    ```shell:MySQL版
    # mysql2 0.5.2用
    $ bundle config --global build.mysql2 --with-opt-dir=/usr/local/opt/openssl
    $ bundle exec rails new . -d mysql
    ```
    - **MySQL**を利用する場合、上記手順後にデータベース設定ファイルを、自環境のMySQLに接続できるよう書き換えてください。とりあえず、**development(開発環境用)**だけ設定すれば起動します(未設定の場合、**手順5**でエラーが発生します)
        ```shell
        $ vi config/database.yml
        ```
        <br>
1. 必須コンポーネントの**Webpacker**をインストールします
    ```shell
    $ bundle exec rails webpacker:install
    ```
    <br>
1. **Rails**を起動します。起動後、Webブラウザで `http://localhost:3000` にアクセスして「**Yay! You’re on Rails!**」と表示されたら、インストール成功です

    ```shell
    $ bundle exec rails s
    ```
質問です。

以下[このサイト](http://t-juniors.mimoza.jp)のhtml, cssについての質問です.

####サイトをiPhone（またはpcのchromeのデベロッパー）で表示したときにflexboxが作用しない. (解決済み)

![スクリーンショット 2019-08-17 23.46.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479915/24530458-8030-9479-3b56-189f653bfc71.png)
(chromeで表示したiPhoneの画面)


iPhone上では右のブロック要素が左のブロック要素の下に来る予定です. 
そのために以下のコードを使っています. 
>@media screen and (max-width: 768px) {.flexbox {
display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -ms-flex-direction: column;
    flex-direction: column;
  }
 
しかし, デベロッパで確認したところpcのウィンドウのサイズを変えたときには作用したのですがchromeでiPhoneの画面を再現したところウィンドウのサイズを変えても上のスクリーンショットのpaddingの中の数字がwidthが980のままです. 何か解決策はないでしょうか.
[メモ]TypeScriptのClassのコンストラクタの引数にオブジェクトを指定 (Generics使用)

・Genericsでオブジェクト型をextendsしたTを指定した場合、T['プロパティ名']で特定プロパティの型を指定出来る。

```typescript
// 引数に渡すオブジェクトの型 (interface)
interface PersonProps {
    name: string
    age: number
    gender: 'male' | 'female' | 'other'
}

// 引数の型をGenericsで指定し、PersonPropsをextendsして制約を設ける
class Person<T extends PersonProps>
{
    // T['name']でTの特定のプロパティの型を指定出来る
    private name: T['name']
    private age: T['age']
    private gender: T['gender']
    constructor (props: T) {
        this.name = props.name
        this.age = props.age
        this.gender = props.gender
    }

    public getName () {
        return this.name
    }

    public getAge () {
        return this.age
    }

    public getGender () {
        return this.gender
    }
}

// personPropsを定義
const personProps: PersonProps = {
    name: '俺やで',
    age: 23,
    gender: 'male'
}

const person = new Person(personProps)

console.log(uniquePerson2.getName()) // 俺やで
console.log(uniquePerson2.getAge()) // 23
console.log(uniquePerson2.getGender()) // male
```
ウェブサービスを作ってみる（1、下準備）

# はじめに

本投稿では、ウェブサービスを学びつつ作る過程を投稿していきます。
より良い方法などあれば教えてもらえるとありがたいです。
細かいコードなどを公開はあまりしないかもしれない。
更新が止まっていたら察してください><

投稿の目的は備忘録的に手順を残すことにあります。


# 動機

知り合いが作りたいサービスがある、と言っており、
そのアイデアを実現するために今回頑張ってみます。
知り合いAさんと二人で開発します〜

# 開発のスコープ

ブラウザ用のウェブサービスを作る。
どういうものを作るかは内緒です。
アプリは一旦スコープ外とす。
インフラはGCPの予定。

# 下準備

プロダクションレベルのサービスにしたいのでいきなり作り始めてもダメだろう。
ということで、きちんとした開発環境を作る。

- メール（メンバー全員に通知できるもの）
- GitHub
- slack
- タスク管理
- ドキュメント管理
- 設計周りのツール

## メール

google groupを設定した。メールを全員に飛ばすため。
ABC@googlegroups.comでAさんと共用のメールアドレスを取得した。
以降のサービス登録はこのメールアドレスで行う。

## GitHub

新しくアカウントを作成して、開発用のリポジトリを作成してとりあえずREADMEまで作った。

```
# コンポーネント

株取引のXXXXサービスのメインコンポーネント！


## コンポーネント名

説明

## Set up

TBD（To Be Determined）
```

## コミュニケーションツール

slackを使う！chatworkとかFu○○！！！！！自粛
slackのチャンネル構成（随時更新）

|番号|チャンネル名|利用用途|備考や設定方法について|更新日|
|:--|:--|:--|:--|:--|
|1|メインチャンネル|開発相談用|-|2019/08/17|
|2|github|github連携用、issueに関しての変更などを通知|[設定](https://get.slack.help/hc/ja/articles/232289568-GitHub-と-Slack-を連携させる)|2019/08/17|
|3|mail|mail通知用|-|2019/08/17|


### 番号2
slackでのslashコマンドで以下を連携したgithubチャンネルで打つとissueの変更などを通知してくれる
/github subscribe owner/repository

### 番号3
https://automate.io
slackの無料プランだとメールをslackに送る機能を使えないので、automate.ioというサービスを使ってslack通知させた。
使い方の動画を見ればすぐに設定できて便利！

## タスク管理

色々ツールあるが導入めんどくさいのでgithubで完結させる。
githubのProject機能を使う。

## ドキュメント管理

### 詳細仕様など
自分の名前とか個人情報を含んだドキュメントをpublicで扱いたくないので、
泣く泣くgitlabアカウントを作成してwiki機能のみ使うことにした。
（markdown使えるプライベートなドキュメントサービスあったら教えて欲しい）

（2019/08/18追記）
=> URL知られると見れるけどprivate gistでいいかも。

### その他
google spread sheetとdocsを利用する

## 設計周りのツール（随時更新）

### ERD

https://dbdiagram.io/home
別にplantumlでもいいんですけど、見栄えがいいし更新が楽そうなので導入。

### API
swagger

### CI/CD
https://jp.techcrunch.com/2019/08/09/2019-08-08-github-actions-is-now-a-ci-cd-service/
circleciが公開リポジトリなら無料で使えるようになったらしい！
githubアカウントでログインするだけ。
https://circleci.com


ここまでの下準備で4時間は使った。。

# 今後の予定

今後は、技術選定、資金調達（可能なら）、などを実施する。
書籍批評：有限要素法のつくり方！(4)

　続いて1．3.4節に入る。この部分は文章でグダグダ書いているが、要するに三角形一次要素の要素剛性の式

```math
K_e=\int_v \mathbf B^T\mathbf D\mathbf B^TdV\mathbf
=\int_v \mathbf B^T\mathbf D\mathbf Btdxdy
```

の各項目が定数なので、この式はそのまま

```math
K_e= t\Delta \mathbf B^T\mathbf D\mathbf B
```

となることを言っているに過ぎない。この式に出てくる$\Delta$は三角形要素の面積である。

ここで、

```math
dV=tdxdy
```


の関係を使っているが$t$は板厚である。$dV=dxdydz$となるが、$dz$は面外方向を表しており、これは板厚をかけるだけで十分である。なお、板厚が有効なのは平面応力状態だけで、平面ひずみの場合通常1.0としておく。軸対称問題を処理するときは1.0か$2\pi$を用いるが、計算上は単純化のため1.0を用いることが多い。この場合、角度の単位はラジアンを用いる。
　この後にも吹き出しがあるが、この内容を式(1.45)の後に続け、出来上がった連立方程式を解くとでも書けばいいだろう。

　冗長過ぎる。
vim-multiple-cursors中はALEを無効にして速くする

vimでマルチカーソルできるプラグイン[terryma/vim-multiple-cursors](https://github.com/terryma/vim-multiple-cursors)
とても便利なのですがデフォルト設定だと、複数選択してinsertモードにすると
ALEによるシンタックスチェックが走ってしまうため物凄く遅くなります。

[Interaction with other plugins](https://github.com/terryma/vim-multiple-cursors#interactions-with-other-plugins)を参考にしてALEとLSPのCoCをON/OFFすると補完もシンタックスチェックも実行されなくなるので非常に軽快になります。


``` viml
function! s:multiple_cursors_before()
    if exists(':ALEDisableBuffer')==2
        exe 'ALEDisableBuffer'
    endif
    if exists(':CocDisable')==2
        exe 'CocDisable'
    endif
endfunction

function! s:multiple_cursors_after()
    if exists(':ALEEnableBuffer')==2
        exe 'ALEEnableBuffer'
    endif
    if exists(':CocEnable')==2
        exe 'CocEnable'
    endif
endfunction

augroup multiple_cursors
    autocmd User MultipleCursorsPre  call s:multiple_cursors_before()
    autocmd User MultipleCursorsPost call s:multiple_cursors_after()
augroup END
```
初心者がBasicTexをmacにインストールする(2019年)

## BasicTexとは
LaTeX文書を作成するための最低限のものという感じでしょうか。

>BasicTeX は TeX Live のサブセットで，macOS 専用の TeX ディストリビューションです。 BasicTeX は TeX Live の scheme-small に対応し，LaTeX の文書作成に必要な最低限のパッケージと pdfTeX，LuaTeX，XeTeX などが含まれています。 BasicTeX には e-pTeX や e-upTeX が含まれていませんので，日本語の LaTeX 文書を作成するためには別途 collection-langjapanese をインストールします。 collection-langjapanese をインストールすれば，jsclasses や OTF，BXjscls，jlreq も利用可能になります。([BasicTexをインストール](https://texwiki.texjp.org/?BasicTeX#q65e25e8)より)

とりあえずmacでTeXを用いてPDFを作成するためには、最低限このBasicTexのインストールが必要です。

また、日本語で文書を作成するためにはさらに追加パッケージ`collection-langjapanese`が必要なようです。

## BasicTexをインストール
今回はHomebrewを用いてインストールしました。ここはTeX Wikiの通りです。

> $ brew cask install basictex
$ sudo tlmgr update --self --all
$ sudo tlmgr paper a4
$ sudo tlmgr install collection-langjapanese

### tlmgrとは
ここで出てくる、`tlmgr`とは`TeX Live`のパッケージ管理ツールだそうです。
[tlmgrについて(TeX Wiki)](https://texwiki.texjp.org/?tlmgr)

また、`TeX Live`とは TeX のいちばん有名なディストリビューションだそうです。

先程のコマンドは`tlmgr`を用いて、TeXの設定と日本語文書用パッケージをインストールしています。

## PATHを通す
`/usr/local/texlive/2019basic/bin/x86_64-darwin`
(パス内の西暦はおそらくインストール時期によって変わると想うので適宜変更してください)

ここに実行ファイルがたくさん入っているので、パスを通します、と書いてあるのを見かけましたが、もしかすると設定の段階で自動的に追加されているかもしれません。

ターミナルで`echo $PATH`と打ってみて、TeXの文字列が見えたのなら、おそらくすでに追加済みです。

#### PATHが通せていない場合
PATHが通せていないとターミナルで`latex`などと打ってもそんなコマンドはないなどと怒られてしまいます。
その時は、ホームディレクトリ内の`.bash_profile`に
`export PATH="/usr/local/texlive/2019basic/bin/x86_64-darwin:$PATH"`を追記しましょう。

(ちなみに`:$PATH`がないとPATHが追加ではなく上書きになってしまい、せっかく他で通したPATHが無効になってしまいますのでご注意ください。)

## latexmkをインストール
`latexmk`とは、TeXからPDFを作成する複雑な手順を一括でやってくれるパッケージだそうです。この`latexmk`がもしかするとバージョンによる違いなのかもしれませんが、自分の環境だと、デフォルトで入っていなかったので追加でインストールします。

やり方はかんたんで、`tlmgr`を用いてインストールするだけです。
ターミナルで`tlmgr install latexmk`と打ち込めば完成です。

## おわりに
これで`.tex`ファイルを作成して`latexmk`を実行することで簡単にきれいな文書を作成することができます。

現在ではVScode上で簡単にTeXから文書を作成することが可能なので、よかったらぜひそちらもやってみてください。
Debian／UbuntuベースのDockerイメージに最速(？)でDockerをインストールする

CI用にcloud-sdk環境イメージを作ろうと思ったら、オフィシャルっぽいリポジトリを見つけDockerfileを確認。そこでのDockerのインストール方法が今まで見た中で一番簡単だったので、紹介したいと思います。

[google/cloud-sdk](https://hub.docker.com/r/google/cloud-sdk/dockerfile)

↑ たぶん、公式リポジトリで間違いないかと思います。一応、リンクをたどって行ったところ、githubリポジトリの一つがGoogle Cloudの公式ドキュメント内のサンプル用リポジトリのURLと一致していました。

※ 「違うぞ！」という場合は、コメントで教えて頂けるとありがたいです。

# Dockerの簡単インストール
[google/cloud-sdk](https://hub.docker.com/r/google/cloud-sdk/dockerfile)のDockerfileからDockerのインストール部分だけを抜粋すると以下の通り

```Dockerfile
FROM docker:17.12.0-ce as static-docker-source

FROM debian:stretch

COPY --from=static-docker-source /usr/local/bin/docker /usr/local/bin/docker
```

これでDocker付きDebianの完成です。

Ubuntu+最新(19.03.1)Dockerでも確認したところ、問題なく動作しました。

```Dockerfile
FROM docker as static-docker-source

FROM ubuntu

COPY --from=static-docker-source /usr/local/bin/docker /usr/local/bin/docker
```

# 雑感
FROM２つとかできるんですね。

マルチステージビルドという機能らしく、あるステージの生成物を他のステージにコピーすることができるという事です。

マルチステージビルドについては、以下を参照してください。

* [Dockerのマルチステージビルドを使う](https://qiita.com/carimatics/items/01663d32bf9983cfbcfe)
Ruby 2.6 ドキュメントまとめ

主に公式 (または公式に準ずる) ドキュメントへのリンクをまとめる。

## 日本語ドキュメント

- [プログラミング言語 Ruby リファレンスマニュアル](https://docs.ruby-lang.org/ja/)
  - [オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル \(Ruby 2\.6\.0\)](https://docs.ruby-lang.org/ja/2.6.0/doc/)

## 英語ドキュメント

- [Documentation for Ruby (Generated by RDoc)](https://docs.ruby-lang.org/en/)
  - [Documentation for Ruby 2\.6\.0](https://docs.ruby-lang.org/en/2.6.0/)

- [Ruby\-Doc\.org: Documenting the Ruby Language](https://ruby-doc.org/)
  - [Core API docs for Ruby 2.6.3](https://ruby-doc.org/core-2.6.3/)
  - [Ruby 2\.6\.3 Standard Library Documentation](https://ruby-doc.org/stdlib-2.6.3/)

## リリースのお知らせ

- [Ruby 2\.6\.0 Released](https://www.ruby-lang.org/ja/news/2018/12/25/ruby-2-6-0-released/)
- [Ruby 2\.6\.1 リリース](https://www.ruby-lang.org/ja/news/2019/01/30/ruby-2-6-1-released/)
- [Ruby 2\.6\.2 リリース](https://www.ruby-lang.org/ja/news/2019/03/13/ruby-2-6-2-released/)
- [Ruby 2\.6\.3 リリース](https://www.ruby-lang.org/ja/news/2019/04/17/ruby-2-6-3-released/)

## その他

- [オブジェクト指向スクリプト言語 Ruby](https://www.ruby-lang.org/ja/)
  - [ドキュメント](https://www.ruby-lang.org/ja/documentation/)
- [RubyDoc\.info: Documenting RubyGems, Stdlib, and GitHub Projects](https://www.rubydoc.info/)
【PHP】オブジェクト演算子(->)ってなんだろう？

PHP 開発中に`$hoge->id`を見て、なにをしてるんだろうと疑問に思ったので自分のメモために記載する。

これ（`->`） をオブジェクト演算子と呼ぶらしい。
（C言語ではアロー演算子とも呼ぶらしい）
#オブジェクト演算子とは？
https://www.php.net/manual/ja/language.oop5.properties.php
クラスメソッドから静的でないプロパティにアクセスするために使用する関数らしい。

#オブジェクトってなに？
（ここでいうオブジェクトとはオブジェクト変数のことを言います）
決まったものが入っているもの。
すでに代入されたオブジェクト変数にあたらしくkey,valueをあたらしく追加できない。



#どうやって使っていく？
ぶっちゃけぼくにはどちらも似たように見えるので

配列場合
`echo $hoge['id'];`

オブジェクト変数の場合
`echo $hoge->id;`

のように使い分けていけば読みやすいコードにつながっていくはず！