OmniAICreator/Qiita-1.07M huggingface dataset:
ABC174

AtCorder Beginner Contest 174 に参加しました。 
ABDの3問ACでした。 
Python3を使用しています。

# A問題
ifで条件分岐させます。

```python
import sys
def input():
    return sys.stdin.readline()[:-1]


def main():
    s=int(input())
    if s >= 30:
        print("Yes")
    else:
        print("No") 

    
if __name__ == "__main__":
    main()
```
# B問題
i番目の点と中心からの距離の2乗の値を、リストL[i]に入れます。
これがDの2乗より大きいかifで判定します。

```python
import sys
def input():
    return sys.stdin.readline()[:-1]


def main():
    N, D = map(int,input().split())
    X = [0] * N
    Y = [0] * N
    L = [0] * N
    ans = 0
    for i in range(N):
        X[i], Y[i] = map(int, input().split())
        L[i] = X[i] ** 2 + Y[i] ** 2
        if L[i] <= D ** 2:
            ans += 1
    print(ans)


    
if __name__ == "__main__":
    main()
```


# C問題
$7、77、777、…$となる数列に$K$で割った余りが$0$となる数を求めます。 
数列は$70、700、7000…$と増えるため、$K$と$10$が互いに素である場合のみしか成り立たない。 
(この数列が$7$の倍数のため、$70$でなく$10$としている) 
<br>
まずKが$2$の倍数または$5$の倍数のとき、数列にKの倍数は現れないので場合分けをします。 
次に$7、77、777、…$となる数列を作り、それがKで割った余りが$0$となるまでwhile文で繰り返します。
$ x = (x * 10 + 7) % K $ではなく$ x = (x + 7 * 10 ** i) % K $
とすると$ 7 $ * $ 10 $ ** $ i $を計算するのに時間がかかるため、TLEとなりました。(2020/08/04編集しました)
下記は時間が終わってからACになった回答です。

```python
import sys
def input():
    return sys.stdin.readline()[:-1]


def main():
    K = int(input())
    x = 0
    i = 0
    if K % 2 == 0 or K % 5 ==  0:
        print(-1)
        exit()
    
    while True:
        x = (x * 10 + 7) % K
        i += 1
        if x == 0:
            print(i)
            break


if __name__ == "__main__":
    main()
```

# D問題
左から右に並べられたN個の石を、左側にR右側にWとなるように並べます。 
問題文を読むと、2つの石を入れ替える操作と1つの石の色を変える操作があります。 
しかし、最小回数の操作で並べることを考えると、2つの石を入れ替える操作のみ行えば良いことが分かります。
<br>
まず石の並び順を文字列として読み込み、白い石の数ｗを求めます。 
左から0～w番目は白い石であるべきなので、この範囲にある赤い石の数を求めます。 
これが操作を行うべき数となり、答えです。 

```python
import sys
def input():
    return sys.stdin.readline()[:-1]


def main():
    N = int(input())
    c = list(input())
    w = c.count("R")
    hidari = c[:w]
    ans = 0
    for i in hidari:
        if i == "W":
            ans += 1
    print(ans)

    
if __name__ == "__main__":
    main()
```
asciiコード




# 7bit ASCII code
|      |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |  9   |   A   |   B   |  C   |  D   |  E   |  F   |
| :--: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :--: | :---: | :---: | :--: | :--: | :--: | :--: |
| **0** | *NUL* | *SOH* | *STX* | *ETX* | *EOT* | *ENQ* | *ACK* | *BEL* | *BS*  | *HT* | *LF*  | *VT*  | *FF* | *CR* | *SO* | *SI* |
| **1** | *DLE* | *DC1* | *DC2* | *DC3* | *DC4* | *NAK* | *SYN* | *ETB* | *CAN* | *EM* | *SUB* | *ESC* | *FS* | *GS* | *RS* | *US* |
| **2** | *SP*  |   !   |   ”   |   #   |   $   |   %   |   ＆   |   ’   |   (   |  )   |   *   |   +   |  ,   |  -   |  .   |  /   |
| **3** |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |  9   |   :   |   ;   |  ＜   |  =   |  ＞   |  ?   |
| **4** |   @   |   A   |   B   |   C   |   D   |   E   |   F   |   G   |   H   |  I   |   J   |   K   |  L   |  M   |  N   |  O   |
| **5** |   P   |   Q   |   R   |   S   |   T   |   U   |   V   |   W   |   X   |  Y   |   Z   |   [   |  \\   |  ]   |  ^   |  _   |
| **6** |   `   |   a   |   b   |   c   |   d   |   e   |   f   |   g   |   h   |  i   |   j   |   k   |  l   |  m   |  n   |  o   |
| **7** |   p   |   q   |   r   |   s   |   t   |   u   |   v   |   w   |   x   |  y   |   z   |   {   |  ｜  |  }   |  ~   | *DEL*  |

#メモ

Uは、0x55
CRは、13
LFは、10
空白は、32
0は、48
Aは、65
aは、97
fは、102
sは、115
dは、100
gは、103
a-zは、26文字    
9とaの差は、39


以上。
Ubuntu 20.04LTSでmodelsimを動かす。

#前提
-ubuntu 20.04、
-Intel Quartus prime liteインストール済み

#経緯
```bash
~/intelFPGA_lite/20.1/modelsim_ase/bin$ ./vsim
```
で起動しようとするが下記のエラー。

```bash
./../linux/vish: error while loading shared libraries: libXft.so.2: cannot open shared object file: No such file or directory
```

エラーの内容を調べるとlibXft.so.2の32bit版が無いというエラー。
下記コマンドでインストールする。

```bash
sudo apt-get install libxft2:i386
```

再度./vsimを試すと無事起動。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274587/a6841847-47ff-45c1-e1d3-b2040993e3c8.png)
rails　本番環境に開発環境の変更を反映させる





##この記事について
リポジトリから本番環境にpullをすれば変更が反映されると思ってたけど、どうやら違っていたようなので備忘録メモとして投稿！！！


##なぜpullしても反映されないのか？
自動反映の仕組みはパフォーマンスに影響を与えるのでdevelopment以外ではデフォルトではオフになってるみたい。
**cache_classes**という設定値があって、自動反映の仕組みは毎回リクエストが来るタイミングでソースコードを都度読むことで実現している(逆にproductionなどでは一度読み込んだコードをメモリ上に保持することでリクエストごとに発生していたファイル読み込みのステップが不要になり早くなる) 



##変更を反映させるには？
アプリケーションサーバーをkillしてもう一度立ち上げてあげるか、rails restratコマンドで変更を反映してあげるとよい。
【iOS13】UIActivityViewControllerの不具合とそのワークアラウンド

# 共有を完了したときに起こる不具合

テキストやファイルなどを共有するときに使用するUIActivityViewControllerですが、iOS13の環境では共有が終了したタイミングでUIActivityViewControllerを表示した親のUIViewControllerまでdismissしてしまう不具合があるようです。

参考: [iOS 13 UIActivityViewController automatically present previous VC after image saving](https://stackoverflow.com/questions/56903030/ios-13-uiactivityviewcontroller-automatically-present-previous-vc-after-image-sa/61032571#61032571)

# 発生条件は曖昧？

上記のstack overflowの記事では特に言及がないようですが、僕が遭遇した不具合の発生条件は以下でした。

発生条件
1. iPadでのみ起こる
2. キャンセル時にのみ発生（共有シートの外をタップしたり、ファイルに保存 > キャンセルを選択するなど）

不具合
1. 親のUIViewControllerのdismissメソッドが勝手に呼ばれる
2. 実際にはdismissしない（dismissメソッドをオーバーライドして別の処理を追加していたため不具合が顕在化した）


# ワークアラウンド

上記のstack overflowの記事の回答をひとつを参考にしました。

透明のUIViewControllerを生成して、その上にUIActivityViewControllerを表示します。そして、UIActivityViewControllerの完了ハンドラ内で透明のUIViewControllerをdismissします。

完了ハンドラ内でdismissするだけでほとんどのケースは問題なかったのですが、なぜか「マークアップ > PDFを削除」のフローの場合だけ、dismissを呼んでも残り続けたので、さらにdismissの完了ハンドラ内でdismissを呼んでいます。

```swift
func onGeneratedPDF(at url: URL) {
    let transparentVC = UIViewController()
    transparentVC.modalPresentationStyle = .overFullScreen

    let acv = UIActivityViewController(activityItems: [url], applicationActivities: nil)
    acv.completionWithItemsHandler = { [weak transparentVC] _, _, _, _ in
        transparentVC?.dismiss(animated: false, completion: { [weak self] in
            if let transparentVC = transparentVC,
                transparentVC.presentingViewController == self {
                // 「マークアップ > PDFを削除」のフローの場合、ここに来てもVCが残っているので、もう一度呼ぶ
                transparentVC.dismiss(animated: false, completon: nil)
            }
         })
    }

    present(transparentVC, animated: false, completion: {
        let v = transparentVC.view!
        acv.popoverPresentationController?.sourceView = v
        acv.popoverPresentationController?.sourceRect =
            .init(origin: v.bounds.size.toPoint().half, size: .square(0))
        transparentVC.present(acv, animated: true, completion: nil)
    })
}
```
VMWare NSX-T 3.0デモ環境構築 その４

[前回](https://qiita.com/yoshiono/items/e9c6ce01aea93dde58dc)からの続きです。

#2. 構築作業
以下の作業になります。Varun氏の記事のPhase 2: Build Logical Network Topologyです。

[Step 13 – Create T1 (Tier-1) Gateway](https://shuttletitan.com/nsx-t/nsx-t-installation-series/nsx-t-installation-series-step-13-create-t1-tier-1-gateway/)
・ "T1-GW-A-11"という名前のTier-1ゲートウェイを作成します。この時点では、名前のみで他との関連付けはありません。

[Step 14 – Create Overlay Segments](https://shuttletitan.com/nsx-t/nsx-t-installation-series/nsx-t-installation-series-step-14-create-overlay-segments/)
・Tier-1ゲートウェイが管理するセグメント(=Overlayセグメント)を作成します。
・NSX-T 3.0のスクリーンショットは以下です。サブネットとして指定した値が、そのまま、そのセグメントのゲートウェイになるようです。
![19 Tier-1-gateway-segment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104507/c6e75089-abde-8529-c6c7-64c883c1bc28.png)

[Step 15 (Option 1) – Migrate VM(s) from vDS to N-VDS](https://shuttletitan.com/nsx-t/nsx-t-installation-series/nsx-t-installation-series-step-15-option-1-migrate-vms-from-vds-to-n-vds/)
・VMを、Tier-1ゲートウェイのセグメントに移行しています。
・Step 14で作成したセグメントは、ESXiホスト(esxi70-nsxt-a-11/12、ホストトランスポートノードとしてOverlayネットワークを構成済み)から見えるようになっているので、vCenterのVMの"設定の編集"で、ネットワークの接続先に指定することが可能になっています。

[Step 16 – Create VLAN Segments](https://shuttletitan.com/nsx-t/nsx-t-installation-series/nsx-t-installation-series-step-16-create-vlan-segments/)
・"接続"でTier-1ゲートウェイはブランク、トランスポートゾーン(TZ-STD-VLAN-TOR-A-11/12)のみを指定します。この時点では、他のオブジェクトとの関連はありません。
・ポートグループPG-ToR-A-11/12には、Physical Router(VyOS01、割り当てられたIPアドレスはPG-ToR-A-11が192.168.110.1/24、PG-ToR-A-12が192.168.120.1/24)とEdgeトランスポートノード(ESG-NSXt-A-11/12)が接続します。Edgeトランスポートノードには明示的にはIPアドレスは割り当てられませんが、次のStep 17でTier-0ゲートウェイを作成するとService Router(ESG-NSXt-A-11/12)のアドレスとして、192.168.110.3/24と192.168.120.3/24が割り当てられます。
・このStepで作成されるVLANセグメント(ToR-A-11/12)は、次のStep 17のTier-0ゲートウェイで呼び出され、Physical Router(VyOS01)との通信のためのポートグループPG-ToR-A-11/12に関連付けられます。
・NSX-T 3.0のスクリーンショットは以下です。
![20 VLAN-segment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104507/d442a168-369a-879e-24b7-5935c54dc606.png)

続きます。
OS標準のテキスト エディタを使ったHTMLの編集方法

## 拡張子とは？

ファイルには様々な種類があります。その種類を区分しているのものと捉えてください。
ファイルの種類は写真や音楽や書類のカテゴリがありさらに写真は jpg、png。音楽にはmp3、wav。書類にはtextやdoc等に枝分かれします。

そのようにファイルと用途が紐付いてる事もあり、ファイルをクリックすると対応したアプリケーションで開くことができるようになっています。

この動画で解説するホームページを作成するHTMLは拡張子もhtmlになります
HTMLの詳しい解説は別の資料で行うので、割愛させていだだきます。
拡張子は慣習で多くは小文字で表記します。

またコンピュータの世界では漢字やひらがな、カタカナなど通常の日本語の文字を表現する全角文字列とアルファベット等を表現する半角があります。
ファイル名はどちらでも問題ありませんが拡張子は半角のアルファベットで書くようにして下さい。

また、プログラミングにおいては基本的に半角アルファベットでフォルダ名、ファイル名を使うのが慣習になっております。
ホームページ内の文字列の表現等を除いて全角文字列はエラーの原因になるので注意してください。

## テキスト エディタとは
文字列を編集するアプリケーションです。Windowsでは「メモ帳」Macintoshではテキストエディットになります。

## IDEとは

ソースコードを記述したり、そこからプログラムを起動させたりする機能が含まれたプログラミングの専用のエディタです。
正式名称はIntegrated Development Environmentで日本語では統合開発環境になります。

IDEを利用する場合はWinでもMacでも無料で利用できるMicrosoftが開発したVisual Studio Codeを推薦してますが、別途解説を用意予定です。

## ショートカットとは

文字列のコピーや貼り付け、上書き保存等の定番の作業をマウスのクリック処理では無く、キーボードの特定のキーの組み合わせで実現させる仕組みです。

### 代表的ショートカット

Winの場合はコントロール、Macの場合はコマンドをキーボードの左下のキーと組み合わせた下記です

- コントロール(コマンド) + c
    - コピー
- コントロール(コマンド) + v
    - 貼り付け
- コントロール(コマンド) + x
    - 切り取り
- コントロール(コマンド) + z
    - やり直し
- コントロール(コマンド) + s
    - 保存

覚えるコツはキーボードの左下に主に使う「cvxz」が横並びになってる事を意識する事です

```
コピーは「copy」の頭文字のc
その右隣のvで貼り付け
切り取りはハサミのx
やり直しはアルファベット最後のz
```

と覚えましょう

# 今回動作確認に使うソース

ファイル名：index.html

「index」は見出しという意味ですが、プログラムでは頻出する用語です。
この場合はトップページという意味合いで使われます。

```
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>HTMLチャレンジ</title>
  </head>
  <body>
    初めてHTMLでホームページ作ったよ

    <h1>初めてHTMLでホームページ作ったよ</h1>
    <h2>段落分けで文書構造を表現してくよ</h2>
    <h3>リストを作るよ</h3>
    <h4>画像も表示するよ</h4>
    <h5>HTMLらしく、ハイパーリンクも設定するよ</h5>
  </body>
</html>
```

作業中
composer requireで"Allowed memory size of 1610612736 bytes exhausted"エラーが出た場合の対処法


# 問題

ローカル環境でパッケージをインストールしようとして、`composer require`をした際に、以下のようなエラーが出ました。

```
Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes)
```

# 対処法

根本解決するには、何やらメモリ割当？などの設定を弄らないと駄目な感じですが、とりあえず以下のコマンドで対処療法できました。

```
$ COMPOSER_MEMORY_LIMIT=-1 composer require xxxx/xxxx
```

※xxxx/xxxxの部分は、インストールするパッケージに合わせて書き換えてください

`COMPOSER_MEMORY_LIMIT=-1`でメモリの制限を無しにして、`composer require`を走らせます。


再度、別のパッケージをインストールした際にも同じエラーが出たので、設定を書き換えるわけではなく、あくまでもその場限りでメモリ制限を解除しているのだと思います。

以上、自分用メモ。
【Laravel】MySQL設定メモ

# MySQLにデータベースを作成する

```terminal:ターミナル
$ mysql -u root  

mysql > CREATE DATABASE アプリケーション名;
```

# laravelファイルの.envを修正する　

```php:.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=[アプリケーション名]
DB_USERNAME=root
DB_PASSWORD=
```
SOSL/SOQLで変数を使いたい

結論、`:`を変数の前につければOKです。

以下TrailHeadの例題を解いたときのサンプルです。

```java
public class ContactAndLeadSearch {
    public static List<List<SObject>> searchContactsAndLeads(String name){
        List<List<SObject>> searchList = [FIND :name IN NAME FIELDS RETURNING Contact,Lead];
        return searchList;
    }
}
```

```java
public class ContactSearch {
    public static List<Contact> searchForContacts(String lastName , String mailingPostalCode){
        Contact[] cts = [SELECT Id,Name FROM Contact 
                 WHERE LastName=:lastName AND MailingPostalCode=:mailingPostalCode];
        List<Contact> contactList = new List<Contact>(cts);
        return contactList;
    }
}
```
Ubuntu 20.04 の xrdp 使用中の問題と解決策

## Xubuntu 20.04 の xrdp が認証の後、真っ黒で接続できない場合

* すでにログインsessionが起動しているのが原因。

```
# xfce4の場合
pkill xfce4-session

# Gnomeの場合
pkill gnome-session
```

また、以下も必要かも

```diff:/etc/xrdp/xrdp.ini
- max_bpp=32
+ max_bpp=24
```

## thinclient_drives がすごく遅い問題

```
sudo umount thinclient_drives
```

```diff:/etc/xrdp/sesman.ini
- FuseMountName=thinclient_drives
+ FuseMountName=.thinclient_drives
```

## 暗号化通信の有効化

`xrdp` ユーザーを `ssl-cert`グループに追加すれば解決。

/etc/xrdp/key.pem の実体の
/etc/ssl/private/ にアクセスができないため。


## dockerで動作させたxrdpでクリップボードを使う

* https://github.com/neutrinolabs/xrdp/issues/1658

コンテナから `/dev/fuse` を使えるようにする。

```yaml:docker-compose.yml
volumes:
  - /dev/fuse:/dev/fuse
```
CORS問題の対応の仕方をミスってた話

フロントエンドとサーバサイドプログラムの連携をRestっぽい感じでやるようになって久しいが
ここに来て結構なポカミスをやったので備忘録として。

フロントには固定値のjsonを返すだけのダミーAPIを作って実装を進めてもらい
バックエンドはprod用としてそのダミーが動的なものになるように実装、最終的にダミーと差し替え
みたいな流れで制作をしている。

で、バックエンドはphpを使うが色々ごちゃごちゃやった後に

```php:test.php
色々やる〜
header('Content-Type: application/json');
echo $json;
exit;
```

としてjsonを出力するのがセオリーである。
フロントはtest.phpをエンドポイントとしてjsとかで実行するわけだが
大体いつも問題になるのがCORSである。

セキュリティリスクを追々考えなければと思いつつApache側で

```apache
Header set Access-Control-Allow-Origin *
```

レスポンスヘッダに全てのドメインからアクセスOK!!を付けている。
で、それをすっかり忘れてphpの方にも記載したのがまずかった。

```php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin *');
echo $json;
exit;
```

```shell
Access to XMLHttpRequest at 'https://xxxxx.jp/api/test' from origin 
'null' has been blocked by CORS policy: 
The 'Access-Control-Allow-Origin' header contains multiple values '*, *', 
but only one is allowed.
```

エラーメッセージの冒頭だけ見てOriginの設定してるはずなのにな〜って思ってたが
よく見るとAccess-Control-Allow-Originヘッダが複数設定されてるよってエラーだった。

どっちか消して解消、というかまぁこの場合はphpの方で良いと思うが。
分かってるんだけど気付かないパターンのミスが一番怖い。

**おわり。**
WASとWeb Serverは何でしょう？

# Web Server
- クライアントからサーバーにページのリクエストを投げるとリクエストを受け取って静的コンテンツ（.html、.png、.cssなど）を提供するサーバーのこと
- クライアントからのリクエストがあったら一番先端でリクエストの処理を行う。

### ※プロセス
リクエストを分析します。

1. 静的コンテンツの場合、私が提供できるよ！！=> .html、.pngなどのレスポンスを返す。
2. 静的コンテンツではない場合、私が処理できないね。。WASに処理をお願いするね！！  
=> WASが処理を行ったコンテンツを受け取り、レスポンスを返す。


### ※代表的に
Apache、nginxがあります。

# WAS（Web Application Server）
- 動的コンテンツを提供するために利用されるアプリケーションサーバー（DB照会、ロジック処理が必要なコンテンツ）
- JSP、Servletを実行できる環境を提供
- コンテナ、ウェブコンテナ、サーブレットコンテナとも呼ばれる。
    - JSP、Servletを実行できるソフトウェア = コンテナ

### ※プロセス
1. Web Serverからリクエストがある場合、コンテナが受け取って処理を行う。
2. コンテナはweb.xmlを参照して該当サーブレットのスレッドを生成します。それからhttpServletRequestと httpServletResponseのオブジェクトを生成して渡します。
3. コンテナはサーブレッドを呼び出します。
4. 呼び出されたサーブレッドの作業を担当することになったスレッド（2番で生成されたスレッド）はdoPost()またはdoGet()を呼び出します。
5. 呼び出されたdoPost(), doGet()メソッドは生成された動的ページをレスポンスに入れてコンテナに渡します。
6. コンテナは渡されたレスポンスをHTTPResponse形に変えてWeb Serverに渡してから生成されたスレッドを終了させ、httpServletRequest, httpServletResponseのオブジェクトを消滅させます。

### ※代表的に
Tomcat, Jeus, JBossがあります。


# Web ServerとWASの違い
- 動的コンテンツの処理が可能なのか
    - WASは静的、動的コンテンツどちらも処理が可能ですが、静的コンテンツ処理までWASがすることになると負荷が多いので、良くないらしいです。
-  Web Serverは動的コンテンツの処理ができない。

※Tomcat5.5以上からはhttpdのnativeモジュールを利用し、静的コンテンツの処理機能を提供していますが、これはapacheのHttpdだけを使うのと性能的に低くないらしいですね。
それでも分けられている利用を考えてみると、phpアプリケーションやJavaアプリケーションを一緒に使ったり、httpdサーバーを簡単なロードバランシングのために使わなけれなならないとき必要らしいですね。
今時の C++ で連想配列を扱う

[ブログ記事](https://secret-garden.hatenablog.com/entry/2020/08/01/195533)からの転載です。


今時と書いたんですがあんまり今時の C++ は知らないのでもっといい書き方ってありますかね？

* 元ネタ：[いろいろな言語の連想配列系リテラル記法を比較してみた｜TechRacho（テックラッチョ）〜エンジニアの「？」を「！」に〜｜BPS株式会社](https://techracho.bpsinc.jp/hachi8833/2020_07_31/95098)

C++ の例が載っていなかったので簡単にかいてみました
一応 C++17 で動作するコードとなっています


```cpp
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>

int
main(){
    using namespace std::literals;

    // 出力用関数
    auto output = [](auto hash) {
        std::cout << "---" << std::endl;
        for(auto [key, value] : hash){
            std::cout << "key = " << key << ", value = " << value << std::endl;
        }
    };

    // 連想配列の定義
    std::unordered_map hash{
        std::pair{ "apple"s, "りんご"s },
        std::pair{ "peach"s, "もも"s }
    };
    // 明示的に型を定義する場合
    // std::unordered_map<std::string, std::string> hash{
    //    // std::pair は不要
    //    { "apple"s, "りんご"s },
    //    { "peach"s, "もも"s }
    // };

    // 参照
    auto a = hash["apple"s];
    std::cout << hash["apple"s] << std::endl;

    // 更新
    hash["apple"s] = "林檎";
    output(hash);

    // 追加
    hash["pear"s] = "なし"s;
    output(hash);

    // 削除
    hash.erase("pear");
    output(hash);

    return 0;
}
// output
// りんご
// ---
// key = peach, value = もも
// key = apple, value = 林檎
// ---
// key = apple, value = 林檎
// key = pear, value = なし
// key = peach, value = もも
// ---
// key = apple, value = 林檎
// key = peach, value = もも
```


C++17 でも連想配列専用のリテラルはないんですが、上記のように書くことで割と簡単に定義することができますね 
どうせなら `{}` に対してユーザ定義リテラルとか定義できるようにならないですかね… 
ちなみに C++11 で標準ライブラリに `<unordered_map>` が追加されましたが C++ 以前でも標準ライブラリには `<map>` があるのでそちらを利用することもできます
Yubinbango.jsの住所入力をボタンクリック時に変更する

大変お世話になっている[Yubinbango.js](https://github.com/yubinbango/yubinbango)ライブラリなのですが、
標準では`.p-postal-code`のkeyupイベントで住所入力が行われる挙動となっています。

大体のWebデザイナーさんは郵便番号入力欄の横に「住所を入力する」ボタンをつけてしまうので、対応する処理を作りました。

通常の挙動である郵便番号入力欄のkeyupを大雑把にキャンセルをして、「住所を入力する」ボタンを押したときにJSで代行してkeyupを発火します。

※ページ内に`.h-adr`が1つしかない想定のものです。
複数あるときは https://github.com/yubinbango/yubinbango/blob/gh-pages/yubinbango.ts の`hadrloop()`を参考に。

```html:想定HTML
<form class="h-adr">
  <!-- 略 -->
    <input type="text" class="p-postal-code" placeholder="000-0000">
    <button type="button" class="postal-search">住所を検索する</button>
  <!-- 略 -->
</form>
```

```js:&lt;/body&gt;の前あたりで読み込むためのスクリプト
(function() {
	//該当フォーム
	var hadr = document.querySelector(".h-adr"), 
		cancelFlag = true;

	//イベントをキャンセルするリスナ
	var onKeyupCanceller = function(e) {
		if(cancelFlag){
			e.stopImmediatePropagation();
		}
		return false;
	};

	// 郵便番号の入力欄
	var postalcode = hadr.querySelectorAll(".p-postal-code"),
		postalField = postalcode[postalcode.length - 1];

	//通常の挙動をキャンセルできるようにイベントを追加
	postalField.addEventListener("keyup", onKeyupCanceller, false);

	//ボタンクリック時
	var btn = hadr.querySelector(".postal-search");
	btn.addEventListener("click", function(e) {
		//キャンセルを解除
		cancelFlag = false;

		//発火
		let event;
		if (typeof Event === "function") {
			event = new Event("keyup");
		} else {
			event = document.createEvent("Event");
			event.initEvent("keyup", true, true);
		}
		postalField.dispatchEvent(event);

		//キャンセルを戻す
		cancelFlag = true;
	});
})();
```
ArduinoからRaspberryPiなどにシリアル通信でデータを送信する

# Arduinoからシリアル通信でデータを送信する

IoTのシステムを作ってるとarduinoでセンサからのデータを受信してそれをraspberrypiなどに送信したい場合があると思います。
そこで今回はarduinoからのシリアル通信についてまとめていきたいと思います。
特に今回はデータをJSON形式で送ってあげることで受信側で処理しやすくしています。

## システムの部分
今回は受信側にJetson Xavier NXを用いています。
受信側はpython環境があればなんでも大丈夫です。USBで直接arduinoと受信側をつないでいる形になります。
![aa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/07ec1116-0913-ee43-ef3b-b0b64505b2dd.jpeg)

センサは今回は溶存酸素センサをを用いていますが特になんでも大丈夫です。

## Arduinoの実装
Arduino側ではデータの送信を行います。
データの送信と言っても単純にシリアルボードに表示させているだけなので特に難しいことはありません。

```
Serial.println(data);
```
dataに送りたいデータが入っています。
ポイントとなるのはprintlnを用いている部分になるかと思います。
println関数を用いることでデータの最後に改行コードが挿入されます。
そうすることで後の受信側のコードでデータ１つあたりの区切りとして認識することが可能になります。

### JSON形式で送る場合
　データを受信した際に処理をしやすくするためにJSON形式で送ってあげたい場合もあるかと思います。
　そのような場合はArduino公式がだしているArduinoJsonが非常に便利です。
#### ツール=>ライブラリを管理を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/b1c72106-daa9-3ece-15c8-d24221557998.png)
#### Arduino_Jsonを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/9aade1bb-4655-b0dc-9270-1ac1561f0729.png)

###Jsonの作成
まずライブラリのインポートします

```
#include <Arduino_JSON.h>　
```

次にJson用に変数docを用意します。これはsetup関数の前で宣言しておきます。

```
JSONVar doc;
```
docに対してキーを指定して入れることでJSONの完成です

```
doc["DO"] = do_data; //センサの値を辞書に登録
Serial.println(doc);　//Jsonが出力される
```

forで繰り返しデータを取得し、表示している例になります。うまくJSONになってくれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/10593c9d-089c-d52f-2f30-710da8827cce.png)

## 受信側

受信側はpythonで実装しています。
pythonにはpyserialという便利なライブラリがあるので利用します。

pip3でインストールを行います。

```
pip3 install pyserial
```
コードの実装はこのようになります。

```
import serial
import time

ser = serial.Serial('/dev/ttyACM0', 9600)
time.sleep(5)

while True:
    String_data = ser.readline()
    #print(String_data)
    print(String_data.strip().decode())
ser.close()
```

ポイントとしてはrealline関数でデータを受信する部分になります。
改行コードがあるまでを1行として認識して読み取りを行っています。

そのままでは改行コードが残ってしまうためstrip関数で除去し、最後にバイト列からデコードをして文字列に変換しています。

### 最後に

シリアル通信は非常に簡単に実装できると思いました
JSONで送ってるのでセンサが増えても受信側で問題なく対応できると思います！
Amazon Cognitoの認証情報をAmazon API Gateway+AWS Lambdaで取得

Goで取得してみます。

APIGatewayの統合リクエストで **Lambdaプロキシ統合の使用** にチェックを入れてください。

Go側では、``` github.com/aws/aws-lambda-go/events ``` の ``` events.APIGatewayProxyRequest ``` で受け取ります。
下記のように取れます。

```go
func handler(ctx context.Context, req events.APIGatewayProxyRequest) (*events.APIGatewayProxyResponse, error) {
	claims := req.RequestContext.Authorizer["claims"].(map[string]interface{})
	res := &events.APIGatewayProxyResponse{
		StatusCode: 200,
		Body:       claims["cognito:username"].(string),
	}
	return res, nil
}

func main() {
	lambda.Start(handler)
}

```
【Python】module 'datetime' has no attribute 'date'のエラーにハマった時のこと。


初めてdatetimeモジュールを使った時に、
想定外のエラーでハマったので共有します。

#実行したかった事
ただ、今日の日付を表示したかった。。。

```
import datetime

today = datetime.date.today()
print(today.strftime('%Y%m%d'))
```
これで表示できるはずなのに、
なぜか「module 'datetime' has no attribute 'date'」とエラーになってしまう。。

文法が違うのか、スペルミスか、
いやいやコピペしているんだからそんなわけない・・・

1時間ほどの時間を費やし、やっと原因判明しました。

#原因
原因は、ファイル名を"datetime.py"としていたことでした。
Pythonではファイル名をモジュールと同じ名前にすると、
うまく実行できなくなるようです。
docker レシピ  vscode remote-conatainer + live share

vscode remote-development, vscode remote-container, docker, レシピ, live share

vscode remote-conatainerを使うときにlive shareでhostしようと思ったら、remote-container内にlive share extensionを入れなければなりません。しかもcontainerに依存するパッケージを導入する必要もあります。

以下のレシピを切り貼りして、自分の開発コンテナにlive share環境を導入しましょう！


```json-doc:.devconteinar/.devcontainer.json
// 略
	"extensions": [
		"ms-vsliveshare.vsliveshare"
	]
}
```

```dockerfile:Dockerfile
FROM debian # or ubuntu

# live share dependencies
# via: https://docs.microsoft.com/en-us/visualstudio/liveshare/reference/linux#debian--ubuntu
RUN apt-get update && apt-get install -y \
  libssl1.1 \
  libkrb5-3 \
  zlib1g \
  libicu[0-9][0-9] \
  gnome-keyring \
  libsecret-1-0 \
  desktop-file-utils \
  x11-utils \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
```

他のOSの場合: https://docs.microsoft.com/en-us/visualstudio/liveshare/reference/linux

残念ながら現在のbaseのrecommendedであるalpineでのそのもののコマンドは掲載されていない。
(やり方緩募)
TypeScriptのnever型について


## never型って？

typeScriptにおける`bottom`型です。

### bottom型って何よ
>型理論、数理論理学において値を持たない型のことである

↑wikiからの抜粋です。
**値を持たない型**, これだけだと???となりそうですが、

>戻り値の型がボトム型である関数は、いかなる値も返さない。

こちらの説明だと少しわかりやすいかと思います。

つまり、

```ts
const foo = () => {
 while(true){}
}

```

上記のように`while(true)`で戻り値がない場合(= returnが絶対に走らない場合)などは、関数`foo`の戻り値の型は`never`と言えます。

<img width="645" alt="スクリーンショット 2020-08-02 11.27.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441432/028d6bb2-bcfb-5849-28f6-09fb6259738b.png">

### 特徴
`never`は値のない型なので、値を入れるとエラーになります。

```typescript
let foo:never

foo = 'test' // コンパイルerror
```


## 実際に戻り値がneverとなる例
上記でwhileの例を上げましたが、他の例とも合わせて再掲します。

```ts
// 無限ループする場合
const foo = () => {
 while(true){}
}

// errorをthrowする場合
const bar = () => {
    throw new Error("これはエラーです")
}

```

## `void`と`never`の違いは？
これは実際にコードを見てもらった方がわかりやすいです。

```typescript
const foo = () => {
}

const bar = () => {
    return 
}

const baz = () => {
    while(true){}
}


let fooVar:never = foo() // error
let barVar:never = bar() // error
let bazVar:never = baz() //ok!
```
上記では `baz`のみ戻り値が`never型`で、 `foo`と`bar`の戻り値は`void型`です。

JSに置いて`return文`を省略された場合は`undefined`が返る仕様なので、
`foo`と`bar`は実質的に同じです。

voidはreturnでの戻り値なし!の型なのに対して
**neverはそもそもreturnしない**。　
似ているようで全然違っています。

## 実際での使用例
[値を入れることができない](#特徴) という部分が生きてきます。

下記のような型がそれぞれあったとします。

```ts
interface Neko {
    type: "neko"
}

interface Inu {
    type: "inu"
    name: number
}
interface Other {
    type: "other"
}

type Animal = Neko | Inu | Other
```
上記Animal型を使う上で、`type`によってそれぞれ別の処理をさせたい場合、
下記のようなコードになるかと思います。

```ts
function intro(s: Animal) {
    if (s.type === "neko") {
        return `吾輩は猫である。名前はまだない`
    }
    else if (s.type === "inu") {
        return `${name}は犬のお廻りです。`
    }
}
```

上記では`Neko` `Inu`　の型しか想定されていません。
`Other`型, またそれ以外でも想定しない型が渡ってきた場合にerrorを返す仕組みがあれば便利です。
そこで、予期しない型が渡ってきた場合は`never`に代入することでコンパイルエラーを出し、
網羅漏れに気づくことができます。
(全て網羅できていれば、 `_exhaustiveCheck`はnever型となります。)

```typescript

function intro(s: Animal) {
    if (s.type === "neko") {
        return `吾輩は猫である。名前はまだない`
    }
    else if (s.type === "inu") {
        return `${name}は犬のお廻りです。`
    }
    else {
        // Otherが渡ってきた場合、neverの特徴によってerrorが出て気づくことができる。
        const _exhaustiveCheck: never = s;
    }
}
```

上記の手法は`switch`のdefault文に置いても有効ですね。

## 参考文献
[TypeScript Deep Dive 日本語版](https://typescript-jp.gitbook.io/deep-dive/type-system/never)
[Use the never type to avoid code with dead ends using TypeScript](https://egghead.io/lessons/typescript-use-the-never-type-to-avoid-code-with-dead-ends-using-typescript)
[TypeScriptの型入門](https://qiita.com/uhyo/items/e2fdef2d3236b9bfe74a)

[wiki ボトム型](https://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%88%E3%83%A0%E5%9E%8B)
tfenv listで "Version could not be resolved" が発生する 

# はじめに
Terraformの環境構築で躓いたので簡単に備忘として残す。

# 環境
* Mac OS X 10.14.1 x86_64

```terminal
$ tfenv --version
tfenv 2.0.0
```

# こんな感じのエラーが出る
`tfenv install` を使って複数のバージョンをインストール後、 `tfenv list` しようとしたら以下のエラー

```terminal
$ tfenv list
cat: /usr/local/Cellar/tfenv/2.0.0/version: No such file or directory
Version could not be resolved (set by /usr/local/Cellar/tfenv/2.0.0/version or tfenv use <version>)
tfenv-version-name failed
```

## 対応内容
ログを見る限り `version` というファイルがないみたい。 
 
`tfenv use <version>` とあるので、実行してから再度 `tfenv list` したら上手くいきました。

```terminal
$ tfenv use 0.12.29
Switching default version to v0.12.29
Switching completed

$ tfenv list
* 0.12.29 (set by /usr/local/Cellar/tfenv/2.0.0/version)
  0.12.5
  0.12.4
```

## メモ
デフォルトで最後にインストールされたものが選択され、 `version` ファイルが作成されているのかと思ったが、そうではなかったよう。 

以下の順でやる。

* `tfenv install [任意のバージョン]`
* `tfenv use [任意のバージョン]`
* `tfenv list` 
 
```
$ pwd
/usr/local/Cellar/tfenv/2.0.0
$ ls
CHANGELOG.md		LICENSE			bin			libexec			version
INSTALL_RECEIPT.json	README.md		lib			share			versions
$ cat version
0.12.29

$ cd versions/
$ ls
0.12.29	0.12.4	0.12.5
```
FuelPHPにおいてtimestampで範囲を指定して取得するとき注意点

#概要
`created_at` や `updated_at` などに使われる `timestamp` 型は非常に便利で、不等号で簡単に比較ができるのですが、気を付けないとうまく動いてくれません。すごく基本的なことですが、場合によっては適当に書いても正常に動いてしまうことがあるので意外と気づきにくい部分だと思います。

#本題
デフォルトの `unixtime` で扱っている場合
e.g.)`1596447140` など
はそのまま使えて、

```unixtime.php
$query = \DB::select()
->from('table_name')
->where('created_at', '>', strtotime('-1 week'))
->execute();
```

のように書くだけで比較ができます。この場合は1週間前よりあとに作られたレコードだけ取得します。

一方、違うフォーマットで扱っている場合
e.g.)`2020-08-03 18:32:20` など
は注意が必要で、フォーマットも合わせてあげる必要があります。例の場合は、

```anyformat.php
$query = \DB::select()
->from('table_name')
->where('created_at', '>', date('Y-m-d h:i:s', strtotime('-1 week')))
->execute();
```

と書くと同様の動きをしてくれます。

#まとめ
しっかり使えば非常に便利なtimestamp。一つのサービスで使うtimestampのフォーマットは合わせた方が良いですね。
余談ですが、`'Y-m-d h:i:s'`と書くべきところを`'Y-m-s h:i:s'`と書いていて、更新するたびに取得されるレコードが違うということになったりもしました。さすがに気づきましたけど（30分ほど苦戦して上司に聞いて）。
【Unity / Xcode】Unity で生成したプロジェクトが Xcode でのアーカイブ作成時に失敗する


Unity で作成したプロジェクトを iOS 向けにビルドする必要があったのですが、Xcode でのアーカイブ作成に失敗したので、その対処法を書きます。

## 環境

- Xcode 11.6
- Unity 2019.4.5f1

## 症状

iPhone を繋いでの実機デバッグはできるのですが、アーカイブを作成しようとするとエラーを吐きビルドに失敗します。
エラー内容としては、`Undefined symbol: _UnityPluginLoad` のような文言がひたすら並んでいます。
<img width="441" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105756/9eede78d-83d4-752e-2d7d-152c38599e6c.png">

## 解決策

Unity 側で iOS の最低バージョンを `11.0` に変えるで解決しました。

`Project Settings` > `Player` > `Other Settings` 内の `Target minimum iOS Version` を `10.0` から `11.0` に変更。

<img width="426" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105756/d2b50d01-8e68-51e1-42e6-95adb07fd7a9.png">

再度 Unity でビルドし、生成された `.xcodeproj` ファイルを開き、アーカイブを実行したところ無事成功しました。

似たような症状を探していたところ、以下のフォーラムを見つけました。
[Linker Errors on Vuforia 8.1 Unity 2018.3.0f2 | Vuforia Developer Portal](https://developer.vuforia.com/forum/unity/linker-errors-vuforia-81-unity-201830f2)

「iOS 9、iOS 10 と 32ビットのサポートは無くなるため、最低リリースを iOS 11 にアップデートしないといけない」というような記述を見つけたため、試したところうまくいきました。
Laravelでデータの作成、削除 save() create() delete()



####save：テーブルを保存

```php3
$user = new App\User //モデルUserクラスのオブジェクト$userを作成
$user->name = "toto" //$user->nameプロパティに "toto"を代入
$user->save() //saveでDB内Userテーブルに新規保存できる。
```

####create：テーブル作成

マスアサイメント対策(次項目でで説明)
をmodelに記入する
app/User.php

```php3
protected $fillable = ["name","body"];
```
と記入し、リクエストから変更できるカラムをname,bodyのみに制限する。

```php3
//DB内にUserを直接作成
App\User::create(["name"=>"piyo", "address"=>"tokyo"]);
```
マスアサイメントを忘れていると、<font color=red>MassAssignmentException</font>エラーが起こる。


####マスアサイメントとは
説明：
ユーザーからリクエストされたデータに応じて、サーバ側はDB内のデータを変更する。
しかし、悪意のあるユーザや、バグにより、想定外のリクエストが行われ、
DB内の操作されたくないデータが操作されてしまう問題。

具体例：
DB内に、name address admin_modeのデータがあるとしたとき
入力フォームのnameの部分を、検証ツール等で書き換えを行い、
nameではなく、admin_modeで送る。
すると、admin_modeの変更リクエストをユーザが送ることができてしまう。
結果、一般ユーザーが管理者権限を持つことができてしまう。

補足：railsだとstrong parameterがマスアサイメント対策に該当する.



####delete：テーブル削除

```php3
$user = App\User::find(1); //Userテーブル内id=1のデータを$userとして指定
$user->delete(); //$userに該当するUserテーブルデータを削除
```
.NET Standardプロジェクトを.NET FrameworkのテストプロジェクトでUTを作成した場合に認識されないときの対応方法

## はじめに

情報がなく、かなり困ったので備忘録として残す。

## 現象

「.NET Standard 2.0」を対象のフレームワークとして指定したプロジェクトを「.NET Framework 4.6.2」を対象のフレームワークとしたテストプロジェクトでUTを実装していた。途中までは問題なく動作していたが、実現したい機能の都合上、.NET Standard 2.0でMicrosoft.Win32.Registryのnugetパッケージをインストールしたところ、テストプロジェクトで実装したUTがひとつも認識されなくなってしまった。（白抜きのひし形に水色の"！"が入った記号が表示される）

## 解決策

この[StackOverFlowの回答](https://stackoverflow.com/questions/57318034/error-could-not-load-file-or-assembly-microsoft-win32registry-from-net-stand)をヒントに、以下の通り対応したら動作した。

- MSTest.TestFramework, MSTest.TestAdapterを最新にする
- Microsoft.Net.Test.SDKをnugetでインストールする

## おわりに

裏は取れていないが、おそらくWin32APIを利用するようなAPIを持つnugetパッケージをインストールした時に起きると思われる。
Windows OS専用の仕組みを利用するnugetパッケージを利用する場合は注意が必要。
Pythonで地理院地図タイルを敷き詰める

# 背景

「地図を背景に路線図を作りたい」という場合、これまで自分の手作業で地理院地図タイル画像Excel方眼紙にコピペして敷き詰めていましたが、たいへん面倒な作業ですのでPythonにやらせることにしました。

# 地理院地図タイルとは

詳しいことは[こちら](https://maps.gsi.go.jp/development/ichiran.html)に記載されていますが、要するに国土地理院が作成した地形図をタイル画像で利用できますよということです。
タイル画像には座標値があって、今回はそれを指定することで、欲しい領域の地図を取得することにしています。
その座標値は国土地理院の[タイル座標確認ページ](https://maps.gsi.go.jp/development/tileCoordCheck.html#5/35.362/138.731)でご確認ください。

# タイル画像を取得する

まず必要なライブラリをimportしておきます。
必要に応じてinstallしておいてください。
(`pip install requests`など)

```python:chiriinMap.py
import cv2
import numpy as np
import os
import requests
```

タイル画像を取得し、保存する関数を次のように定義します。
下記ではカレントディレクトリに`tile`というフォルダを用意して保存しています。
ちなみに1枚分だけなので、
![15_28250_13142.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621109/9c57d566-7d5d-548b-7f96-be4d8a3e5ce5.jpeg)
こんな感じです。

```python:chiriinMap.py
def get_tile(z, x, y):
    """
    今回は標準地図を取得するとしてURLを指定する。
    与えられた座標に対応する地理院地図タイル画像を保存する。
    """
    url = "https://cyberjapandata.gsi.go.jp/xyz/std/{}/{}/{}.png".format(z, x, y)
    file_name = "tile/{}_{}_{}.jpg".format(z, x, y)
    
    response = requests.get(url)
    image = response.content
    
    with open(file_name, "wb") as aaa:
        aaa.write(image)
```

# 領域を指定してタイル画像を取得する

先の`get_tile`関数では地図タイル1枚分しか取得できませんので、領域まるごと取得するようにします。
将来に備えて、欲しい画像がすでに存在している場合はスキップさせています。
ただし、前回の取得からあまりにも時間が経過している場合、地図が更新されている場合もあるので、そういった場合は画像を削除するといいと思います。
次節で複数のタイル画像を1枚にまとめるので、個別の画像はその都度消してしまってもいいかもしれません。
そのあたりは皆さんにおまかせします。

```python:chiriinMap.py
def get_tile_area(north_west, south_east):
    """
    北西端・南東端のタイル座標を指定した上で、タイル画像を取得する。
    """
    assert north_west[0] == south_east[0], "ズームレベルzを確認してください。"
    zoom = north_west[0]
    im_v_lst = []
    for i in range(south_east[1]-north_west[1]+1):
        for j in range(south_east[2]-north_west[2]+1):
            filepath = path = "tile/{}_{}_{}.jpg".format(zoom, i+north_west[1], j+north_west[2])
            if os.path.exists(filepath) == True:
                continue
            get_tile(zoom, i+north_west[1], j+north_west[2])
```

# 領域内のタイル画像を1枚の画像にまとめる

膨大な時間を費やしていた敷き詰め作業は次のようにして克服します。
最後の画像の名前は自由に変更してください。

```python:chiriinMap.py
def cat_tile(north_west, south_east):
    zoom = north_west[0]
    im_v_lst = []
    for i in range(south_east[2]-north_west[2]+1):
        im_h_lst = []
        for j in range(south_east[1]-north_west[1]+1):
            path = "tile/{}_{}_{}.jpg".format(zoom, j+north_west[1], i+north_west[2])
            im1 = cv2.imread(path,-1)
            im_h_lst.append(im1)
        im_h = cv2.hconcat(im_h_lst)
        im_v_lst.append(im_h)
    im_v = cv2.vconcat(im_v_lst)
    cv2.imwrite("tile/tile.png", im_v)
```

# やってみる

やってみます。

```python:chiriinMap.py
north_west = (15, 28223, 13124)
south_east = (15, 28244, 13144)
get_tile_area(north_west, south_east)
cat_tile(north_west, south_east)
```

![tile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621109/0eeef693-bce1-9b99-3541-8948b8785ff3.png)

こんな感じです。福岡県の糸島半島です。
手作業だと何時間かかることか…
これで楽できますね。ちなみに、この画像そのままだと30MBくらいあります。
画質を落としてもいい場合は、サイズダウンしたほうがいいかもしれません。

# 出典
地図画像：国土地理院
シンボリックリンクの生成で相対パスを指定すると危険だった話

08/04追記
コメントにて補足や訂正を頂いたので、適宜修正をしていきます。

# はじめに

シェルコマンドを学習しているとき、シンボリックリンクに関して沼にハマってしまったので、備忘録を残します。
~~これがベストプラクティスかどうかは知らないが、シンボリックリンクの生成はなるべく絶対パスを使おう。~~

> これは時と場合によるので、ベストプラクティスとは言えません。
リンク元のファイル・リンクをまとめて管理したい場合、設置場所変更に弱くなるためです。
※Webページのリンク ( ハイパーリファレンス ) を絶対URLで書くか、相対URLで書くかと同じ問題
@angel_p_57 

# シンボリックリンクとは

> シンボリックリンクとは、オペレーティングシステム（OS）のファイルシステムの機能の一つで、特定のファイルやディレクトリを指し示す別のファイルを作成し、それを通じて本体を参照できるようにする仕組み。
IT用語辞典 e-Words

Linuxにおけるシンボリックリンクは、Windowsでいうところのショートカットのようなものだと認識しています。

> 目的は似ていますが、実態は大分違います。加えて、Windowsにも ( リパース・ポイントという機能を利用した ) シンボリックリンクが存在します。
ショートカットは、指定のファイルをアプリで開くための情報を持ったランチャーに過ぎませんが、シンボリックリンクは指定のファイルの代替として使えるファイルです。
@angel_p_57 



# シンボリックリンクの作成

シンボリックリンクの作成に用いるコマンドは以下です。
hoge.jpgは任意のファイル名、fugaは任意のディレクトリ名です。
ここではhoge.jpgというファイルのシンボリックリンクを、fugaディレクトリに生成します。


```shell

$ ln -s hoge.jpg fuga
```


補足：このケースでは『既にfugaディレクトリが存在していれば』意図どおりに正常に実行されます。
fugaディレクトリがなければ、同一ディレクトリにfugaという名前のシンボリックリンクが生成されてしまいます。

`$ ln -s hoge.jpg fuga/`　とすれば、ディレクトリが存在していれば実行するコマンドになります。
（頂いたコメントを参考にしました）

# やりたいこと

~/Picture/konosuba.jpg のシンボリックリンクを、
~/Picture/foobar に生成したい。

# やってみたこと

## 相対パスで指定した場合(failed)

カレントディレクトリが ~/Pictureだとする。


```shell

~/Picture $ ln -s konosuba.jpg foobar

```

foobarディレクトリに konosuba.jpgは いちおう生成されるが、
先にいっておくと、これは間違い。

カレントディレクトリ内に存在する konosuba.jpgのシンボリックリンクが、相対パスとして指定したfoobarフォルダ内に生成される・・・**というわけではない。**

foobarディレクトリに生成されたシンボリックリンク konosuba.jpgは、
自身から見た相対パス konosuba.jpg　つまり同ディレクトリ内のkonosuba.jpgを参照しにいく、と考えよう。

つまり、自身を参照するシンボリックリンクという謎のファイルを生成してしまう。

（これは、シェルコマンドの第一引数である"konosuba.jpg"を、シンボリックリンク自身の位置を基準とした相対パスとして読み取ってしまうため）

## 相対パスで指定した場合(successed)

カレントディレクトリが ~/Pictureだとする。

```shell

~/Picture $ ln -s ../konosuba1.jpg foobar
```

foobarディレクトリに konosuba.jpgが生成される。
こいつは正解。
foobar ディレクトリに生成されたシンボリックリンクkonosuba.jpg は、
自身の位置から見て "../konosuba1.jpg"を参照するリンクとして生成される。

慣れると問題ないのかもしれないが、正直僕にはややこしく感じました。


> その場合は、-r ( --relative ) というオプションを使います。相対位置はコマンドが自動的に判断してくれますから。
ln -s hoge.jpg fuga/ だと、作成されるシンボリックリンク fuga/hoge.jpg は循環参照を起こして役に立ちませんが、ln -s -r hoge.jpg fuga/ とすれば、fuga/hoge.jpg -> ../hoge.jpg という適切なリンクを作成してくれます。
@angel_p_57 

## 絶対パスで書く

```shell

$ ln -s ~/Picture/konosuba.jpg ~/Picture/foobar
```

絶対パスなら参照元が意図と異なるリスクをぐっと減らせる。
ディレクトリ構造がややこしくなると、とんでもないことになりそうな気もするが、とりあえず間違えることはなくなるはずだ・・

# おわりに
なんだかうまく書けた気がしないので、適宜変更を加えていこうと思う・・

# 参考文献

Linuxコマンドライン入門
[Ubuntu Manuals](http://manpages.ubuntu.com/manpages/bionic/man1/ln.1.html)
ローカルからSAP CloudPlatform CF環境へデプロイする

(2020/08/28 追記)
Cloud MTA Build Toolのダウンロード方法について修正しました。

# はじめに
今回ローカル環境でFiori開発をしましたので、
その際に行っていたCloud Foundry環境へのデプロイ方法を備忘録として記載します。

今回はMacで行いましたが、基本的にはWindowsも同様です。

# 必要なツール
## Cloud MTA Build Tool
MTAプロジェクトのビルドを行うために必要
ダウンロード方法：~~https://sap.github.io/cloud-mta-build-tool/download/~~

・Windowsの場合
https://sap.github.io/cloud-mta-build-tool/makefile/

・macの場合
https://sap.github.io/cloud-mta-build-tool/troubleshooting/

## Cloud Foundry Command Line Interface (CLI)
SAP Cloud Platform Cloud Foundry環境へ接続するために必要
ダウンロード手順：https://developers.sap.com/tutorials/cp-cf-download-cli.html

# デプロイ手順
## 1.ビルドを行う
以下のコマンドを実行してビルドを行う。

```
mbt build
```

## 2.SAP Cloud Platform Cloud Foundryへログインする
以下のコマンドを実行してCloud Foundryへログインする。
メールアドレスとパスワードを入力し、デプロイを行いたい環境を指定する。

```
cf login
```

## 3.指定した環境へ.mtarファイルをデプロイする
以下のコマンドを実行してデプロイを行う。
1.を実行した際に、mta_archivesディレクトリ内に.mtarファイルが作成されるので
そのファイルを指定する。

```
cf deploy mta_archives/xxxxxxxxxx.mtar 
```
Rails + postgres で jsonb の中の Array をクエリする方法

難しかったのでメモ

### データの形
こんな感じのが jsonb のカラムの中に保存されている。

```json
{
  hoge: String,
  items: String[]
}
```

### やりたいことと解決策
それでやりたいのは `items` の中に特定の文字列 `["a", "b", "c"]` のいずれかが含まれているものをクエリすること。

結論としては次のようなコードでいけた。

```ruby
items_to_query = ["a", "b", "c"]
Model.where("jsonbColumnName -> 'items' @> ?", items_to_query.to_json)
```

### 参考
https://stackoverflow.com/questions/35737931/rails-postgres-query-with-jsonb-array
https://www.postgresql.org/docs/9.4/functions-json.html
【Nuxt.js】プラグイン導入【node_modulesで管理している場合】

#参考対象者
- 外部ライブラリをNuxt.jsに導入したい方
- npmでプラグイン等を管理している方


#環境

```package.json
{
  "name": "nuxt-proj",
  "version": "1.0.0",
  "private": true,
  "scripts": {
    "dev": "nuxt",
    "build": "nuxt build",
    "start": "nuxt start",
    "generate": "nuxt generate"
  },
  "dependencies": {
    "nuxt": "^2.14.0"
  },
  "devDependencies": {}
}

```

#状況

外部ライブラリの```vue-flag-icon```を導入したいが、SyntaxErrorになってしまう。

```
SyntaxError
Cannot use import statement outside a module
```

#エラーにならない、プラグイン導入方法（node_modulesで管理）

1. プラグインをnpmで、インストール
2. pluginsディレクトリに、プラグインをimportするファイルを作成
3. nuxt.config.jsファイルに、importファイルを読み込む設定をする
4. サーバーの再起動


##プラグインをnpmで、インストール

まずは、今回のプラグインである```vue-flag-icon```をインストールしていきます。

```
$ npm i vue-flag-icon@latest
```

すると自動でpackage.jsonにも記述されますね。

```package.json
"dependencies": {
    "nuxt": "^2.14.0",
    "vue-flag-icon": "^1.0.6"
  },
```

##pluginsディレクトリに、プラグインをimportするファイルを作成

プラグイン公式（https://github.com/vikkio88/vue-flag-icon)
にもあるように、必要な記述を設定していきます。

そしてその設定は、どのファイルからでもライブラリを読み込めるように、pluginディレクトリというVue.jsをインスタンス化する前に読み込んでくれるJSファイルの置き場所に、新規ファイルでしていく。

```plugins/flag-icon.js
import Vue from 'vue';                  //Vueを定義するために、Vueをimport
import FlagIcon from 'vue-flag-icon';
Vue.use(FlagIcon);
```

##nuxt.config.jsファイルに、importファイルを読み込む設定をする

あとは、先ほど設定したimportファイルを、Nuxt.js自体の設定ファイルに読み込む記述をする。

```nuxt.config.js
export default {
  //省略
  plugins: [
    '@/plugins/flag-icon',
  ],
  //省略
}
```

ただ、これだけだとエラーになってしまう。
原因は、今回のライブラリの管理方法がnpmなので、さらに**専用の設定**が必要なため。

とは言っても、あと1行だけ追記すればいいのだが、

```nuxt.config.js
export default {
  //省略
  build: {
    transpile: ['vue-flag-icon']
  }
}
```
これにて、ライブラリが使えるようになる。

##サーバーの再起動

と、よく忘れますが、```nuxt.config.js```ファイルに変更を加えた場合、サーバーの再起動をする必要があるので、

```
$ npm run dev
```

して実際に使ってみましょう！！

#実際に、使ってみる

どのVueファイルでも良いので、```<flag iso="jp" />```を追加してみると、

```pages/index.vue
<template>
  <div>
    //省略
    <flag iso="jp" />    
  </div>
</template>
```

我らが日本の国旗が、表示されるであろう！

#参考

>Nuxt.js公式様
>https://ja.nuxtjs.org/guide/plugins/

>@fj_yohei様
>https://qiita.com/fj_yohei/items/cddf267a94fa30ecb0b8
Twilioを使って、ブラウザで電話を受け取れるようにする

# やること

[Twilio](https://www.twilio.com/ja/)のライブラリを利用して、電話の着信機能を作成します。
Twilioへの登録と、電話番号の取得が必要です。
以下がTwilio側とブラウザ側の処理の流れです。

## :telephone_receiver:Twilio側の流れ

1. Twilioが通話を受け取る
2. Twilioが自動応答のシナリオ(TwiML)を返すAPIを呼び出す
3. TwilioがTwiMLを読み取って、クライアント(ブラウザの着信者)を呼び出す

## :desktop:ブラウザ側の流れ

1. twilio-clientライブラリを使って、着信時の挙動を設定する
2. クライアントのトークンを作成するAPIを呼び出す
3. トークンを使って、着信を受け取れるようにする


# APIのコードをかく:muscle:
今回はnode.js + typescript + expressで書きます。前もってtwilioパッケージをインストールしときましょう
`npm i twilio`

以下の２つのAPIを作ります

- TwiMLを返すAPI
- クライアントのトークンを作って返すAPI


```typescript
import {jwt, twiml} from 'twilio';
import express = require('express');
import {json} from 'express';

const app = express();
app.use(json());

/**
 * TwiMLを返すAPI
 */
app.route('/incoming').post((req, res) => {
  const voice = new twiml.VoiceResponse(); // ここに設定していく
  voice.say('hello'); // 音声を再生
  voice.say({voice: 'Polly.Mizuki', language: 'ja-JP'}, '日本語でおk'); // 日本語で再生(voiceなどは設定可能)
  voice.pause({length: 1}); // 1秒待つ

  // クライアント名を指定して電話をかける
  voice
    .dial({callerId: req.body.From || '', ringTone: 'jp'}) // オプション
    .client('[クライアント名]');

  const response = voice.toString(); // TwiML(XML)を作成

  res.type('text/xml');
  res.send(response); // レスポンスを返す
});

/**
 * クライアントのトークンを作って返すAPI
 */
app.route('/token').get((_, res) => {
  // capabilityに能力を足していく
  const capability = new jwt.ClientCapability({
    accountSid: 'TwilioアカウントのSID',
    authToken: 'Twilioアカウントのトークン',
    ttl: 600, // トークンの有効期限。最大24H(86400)らしい
  });
  capability.addScope(
    new jwt.ClientCapability.IncomingClientScope('[クライアント名]')
  );

  // 今は使わないが、外にかけるときに使う
  // capability.addScope(
  //   new jwt.ClientCapability.OutgoingClientScope({
  //     applicationSid: "TwilioAppのSID",
  //   })
  // );

  const token = capability.toJwt(); // これを返す
  res.send({ok: true, token: token});
});

app.listen(3000); // 3000番ポートでリッスン
```

簡単に試す場合は、このコードをts-nodeなどで実行しましょう:desktop:
`http://localhost:3000/token`にGETリクエストを送ると、tokenが帰ってくると思います:pray:



# TwilioコンソールでAPIを登録する:two_men_holding_hands:
↓コンソールはこれです
https://jp.twilio.com/console/

[電話番号 / 番号の管理 / アクティブな電話番号 /](https://jp.twilio.com/console/phone-numbers/)の「A CALL COMES IN」にTwiMLを返すAPIを指定します。

# クライアント側のコードをかく:muscle:

js(typescript)で書きます。JSフレームワークは好きなの選択。

前もって`twilio-client`をインストールしときましょう
(間違って`npm i twilio`をしないように気をつけてください。こっちはサーバ向けです)

デバイスのセットアップ方法を、ざっくり書きます。


```typescript
import { Device, Connection } from "twilio-client";

const device = new Device(); // ここに処理をのっける

device.on("incoming", (connection: Connection) => {
  const onAccept = () => {
    connection.accept(); // 受け取る
  };
  const onReject = () => {
    connection.reject(); // 拒否る
  };

  openIncomingCallModal(onAccept, onReject); // Viewの部分はお任せ
});
```

その後、前に作った「クライアントのトークンを作って返すAPI」を呼び出して、トークンを取得します(コード略)。
トークンを受け取ったら、それを使ってデバイスをセットアップ。

```typescript
device.setup(jwt);
```

これでOK:ok_hand:


ちなみに、こちらから通話を切るときは`disconnectAll()`を呼びます。

```typescript
device.disconnectAll();
```

まだ機能が少ないので、[ドキュメント](https://jp.twilio.com/docs/voice/client/javascript/device)をみて、諸々の機能を足していくといいかもしれません。
Graphql-rubyでのエラーハンドリング

# はじめに
最近、graphql-rubyでAPIを実装しています。
そこで、graphqlでのエラーハンドリングについて、ベストプラクティスを模索してみました。
まだ始めたばかりなので、もっといい方法あるよ！っていうコメント募集中です。
# エラーの分類
エラーハンドリングの実装に移る前にエラーにはいくつか種類があるので、紹介します。
以下の記事が非常にわかりやすく、まとまっていたので参考にしています。

[Railsアプリケーションにおけるエラー処理（例外設計）の考え方](https://qiita.com/jnchito/items/3ef95ea144ed15df3637)

ここでは、以下のように異常系と準異常系の２つに分類します。

- 異常系：nwエラーや、プログラムのエラー(システムエラー)
- 準異常系：作り手が予期できるエラー(業務エラー)

この2種類のエラーに対して、以下のような要件があります。

- 異常系：フロント側でテンプレートメッセージを表示 & 開発者に通知
- 準異常系：エラー内容や回避方法をフロント側（この辺りは要件によって変わってくるかもしれません)

肝となるのは、異常系は決まったテンプレートのメッセージを表示するが、準異常系はAPIからメッセージを送るというところです。この要件をどのように実装させるかが本題となります。

# Graphql-rubyの仕様
graphql-rubyでは、エラーの場合以下のようなerrorsをkeyにしたjsonが返ってきます。

```
"errors": [
    {
      "message": "error message",
      "locations": [],
      "extensions": {
        "code": "ERROR_CODE"
      }
    }
  ]
```
このエラーメッセージは、主にインターフェイスでバグがあったりすると発生します。
例えばフロント側で渡す引数にnullが入ってるとき等です。

上のようなエラーは以下のように直接コードを書いて発生させることもできます。

```sample.ruby
raise GraphQL::ExecutionError.new('error message', extensions: {code: "ERROR_CODE"})
```

#  実装
上記の仕様から異常系のエラーはerrorsが戻り値で返ってくることがわかります。
では準異常系はどうでしょうか？準異常系の要件は以下です。

- 画面に表示するエラーメッセージを渡す
- フロントが準異常系エラーと判断できる

まず１つ目の要件は上記のgraphqlエラーをraiseする方法でエラーメッセージを渡せるのでokです。しかし、そのままではフロント側で異常系のエラーと区別ができません。

そこで以下のようにjsonをカスタマイズすることにしました。

```sample.ruby
raise GraphQL::ExecutionError.new('error message', extensions: {customCode: "ERROR_CODE"})
```
code->customCodeとなっています。フロント側ではcustomCodeがkeyとして存在すれば、そのままerror messageを表示。それ以外はテンプレートのメッセージを表示させることで、異常系と準異常系の処理を切り分けることができます。

# 参考資料
[graphql-ruby公式](https://graphql-ruby.org/errors/overview.html)
[GraphQLにおけるエラーハンドリングの仕方](https://techblog.zozo.com/entry/graphql_error_handling)
続・ルータのWAN側IPアドレスを取得してみる(STUNサーバ編)

#ルータのWAN側アドレスを知りたい

[以前の記事](https://qiita.com/maron2000/items/0669bbd1df79a1273cd2)で、ルータにログインしてWAN側IPアドレスを取得する方法を紹介したが、よくよく考えたらSTUNサーバを利用すればいいんじゃ？と思ったので、スクリプトを作ってみた。

#STUNサーバからWAN側IPアドレスを取得するスクリプト
以下の例ではgoogleのSTUNサーバを使っているが、ポートが標準の3478ではない(19302)のため、
指定する必要がある。
STUNクライアントがインストールされていない場合は、以下を実行する。
`sudo apt-get install stun-client`

```shell
#!/bin/bash

STUN_SERVER="stun.l.google.com"
STUN_PORT="19302"

for i in {1..10} 
do
	STUN_RESULT=$(stun $STUN_SERVER:$STUN_PORT -v 2>&1)
	EXTERNAL_IP=$(echo "$STUN_RESULT" |& grep -m 1 "Mapped" | \
		grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')

	if [ -n "$EXTERNAL_IP" ]; then
		echo "EXTERNAL_IP = $EXTERNAL_IP"
		break	
	fi
	sleep 1s
done
if [ -z $EXTERNAL_IP ]; then 
	echo "Failed to designate EXTERNAL_IP"
	echo "$STUN_RESULT"	
	exit 1
fi
```

上記を実行すると以下のようになる。

```shell-session
EXTERNAL_IP = XX.XX.XX.XX
```
proxy環境下でWindows版Dockerでapk updateが失敗する件

# 現象：alpineでapk updateすると失敗する

proxy環境下では、環境変数でhttp_proxy等を設定する必要がありますが、
なぜかapk updateが失敗する時があり、alpineだけは駄目だったみたいな記事にぶち当たります。
しかもその解決方法がちゃんと書いて無いので困りました。

# 環境
Windows10
Docker Desktop for Windows Version 2.2.0.3(42716)です。

# 結論と解決策

Docker Desktopの設定項目でproxyを設定してある場合
Dockerの環境変数にproxyを設定すると何故かproxyが参照できなくなる。
当時のバージョンのバグかもしれませんが、同じネタにハマったら参考にしてください。

http_proxyを再設定(unsetしてからexport)するとうまくいく
という報告を見つけてRUNコマンドの先頭でunsetを試すと確かに動作しました。

適宜proxyの設定を除外すると繋がるようになります。
今回のケースではWindows Desktopの
Settings＞Resources＞PROXYIESの設定のみ実施すれば大丈夫でした。

# 調査内容

以下に調査した内容を記述します。
同じようなことに困った場合に参考にしてください。

## 失敗ケース：設定ファイル

HTTP_PROXYとhttp_proxy両方設定しているのは、
コマンドによって大文字小文字どちらかを参照するケースがあり、
ワークアラウンドとして両方設定を推奨する事前情報を参考にしたものです。
envとargs両方に設定してあるのは片方が駄目だったので足してる途中だからです。

```docker-compose.yml
version: '3.5'
services:
  alp:
    build: 
      context: .
      args: 
        HTTP_PROXY: ${HTTP_PROXY}
        http_proxy: ${http_proxy}
        HTTPS_PROXY: ${HTTPS_PROXY}
        https_proxy: ${https_proxy}
    tty: true
    stdin_open: true
    working_dir: /app
    env_file: .env
```

```Dockerfile:Dockerfile
FROM python:3.7-alpine

RUN apk update \
 && apk add --no-cache nodejs npm git
```

```.env:.env
#proxy
http_proxy="http://proxy-host:proxy-port/"
https_proxy="https://proxy-host:proxy-port/"
HTTP_proxy="http://proxy-host:proxy-port/"
HTTPS_proxy="https://proxy-host:proxy-port/"
```

## 失敗ケース：動作ログ

```terminal:terminal(PowerShell)
PS C:\Docker\sls> docker-compose build --no-cache
Building serverless
Step 1/3 : FROM python:3.7-alpine
 ---> a5d195bb2a63
Step 2/3 : RUN apk update  && apk add --no-cache nodejs npm git
 ---> Running in 973765ea344f
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/community/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.11/main: IO ERROR
WARNING: Ignoring APKINDEX.70f61090.tar.gz: No such file or directory
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.11/community: IO ERROR
WARNING: Ignoring APKINDEX.ca2fea5b.tar.gz: No such file or directory
2 errors; 35 distinct packages available
ERROR: Service 'serverless' failed to build: The command '/bin/sh -c apk update  && apk add --no-cache nodejs npm git' returned a non-zero code: 2
```