OmniAICreator/Qiita-1.07M huggingface dataset:
第4回　今週のRPA関連ニュース  8/3(月)〜8/7(金)

こんにちは！
Peaceful morning社でインターンをしている川内です。

普段RPA HACKでは、Twitterアカウント(https://twitter.com/NewsRpa)
にて、毎日RPAのニュースを紹介しています！

そこで先週に引き続き今週も川内が気になった**RPA関連ニュース**を独断で紹介いたします！この記事を見ていただければ、この1週間でおきたRPAの周りでおこった主な出来事がサクッと理解できます！

**第1回目はこちら↓**
https://qiita.com/RPAHACK/items/e63242fd9604a9908cd8

**第2回目はこちら↓**
https://qiita.com/RPAHACK/items/33e9177d9cef29e76d17

**第3回目はこちら↓**
https://qiita.com/RPAHACK/items/386889c10625e357713c


記事の形式としては、**「記事の題名」「記事のリンク」「記事の要約」**を各曜日で順に書いていきます。

##月曜日  8/3
###RPAテクノロジーズ「BizRobo! mini」利用を全面支援 「BizRobo! mini チャットサポートサービス」を2020年8月3日より提供開始

https://prtimes.jp/main/html/rd/p/000000148.000011515.html

RPAホールディングス株式会社の子会社で、RPAのベーステクノロジーを提供するRPAテクノロジーズ株式会社は、RPAツール「BizRobo! mini」利用者へ、無料トライアル期間中からスムーズに活用できるための支援も含め、使用方法、トラブルシュート、ロボット開発等、多岐にわたる相談に速やかに対応するための「BizRobo! mini チャットサポートサービス」を2020年8月3日より開始した。

##火曜日　8/4
###Blue Prism、ガートナー社のマジック・クアドラントのRPA分野において「リーダー」に再選出

https://prtimes.jp/main/html/rd/p/000000093.000028912.html

 Blue Prism社 は、ガートナー社が発行する「Magic Quadrant for Robotic Process Automation (RPA)」 レポートにおいて、リーダーのクアドラントに位置付けられたことを発表した。リーダーに位置付けられる企業は、市場の進化の方向性を理解しようとする際に、注目すべき存在となる。リーダーに位置付けられる企業は通常、市場規模と比較して大規模で満足度の高い顧客基盤を有しており、市場内での高い知名度を享受している。

##水曜日　8/5
###AI-OCRとRPAを活用した「経費申請Auto Operator」の導入で 経費精算BPOサービスの生産性を向上

https://prtimes.jp/main/html/rd/p/000000284.000022656.html

SB C&S株式会社は、経費精算BPOサービスを支援する法人向けプラットフォーム「経費申請 Auto Operator」の提供を、2020年8月5日から開始した。「経費申請 Auto Operator」は、経費精算申請業務における領収書データの入力を自動化するために、AI-OCRとRPAを連携させる管理プラットフォームである。AI-OCRで画像処理し、テキストデータ化した領収書データを経費精算システムへRPAで自動入力することが可能になる。「経費申請 Auto Operator」の導入により、申請代行のBPO業務において、従来の労働集約型と比較してコスト及び要員数とも大幅削減を実現する。

##木曜日　8/6
###1,200時間以上の削減実績を誇る「メール転送・周知業務代行ロボット」をNTTデータと協業しWinActor®を用いて開発

https://prtimes.jp/main/html/rd/p/000000004.000062579.html

RPAの導入コンサルティングやサポートを手がけるロボフィス株式会社は、株式会社エヌ・ティ・ティ・データと共同で、国内シェア1位のRPAツール「WinActor®」を用いた「メール転送・周知業務代行ロボット」を開発した。NTTデータ「コロナ対策応援プロジェクト」を通じ、NTTデータのWinActor特約店350社と共に、「メール転送・周知業務代行ロボット」を無償で提供する。

この記事を読んでWinactorについての知識をつけたいとお考えの方にむけて、こちらの記事をおすすめします。

**WinActorがさらに進化！ WinActor Ver.7を解説**
https://rpahack.com/winactor_ver7

**純国産RPA『WinActor®』とは？歴史～特徴まで完全ガイド**
https://rpahack.com/winactor
##金曜日　8/7
###RPAテクノロジーズ、RPAツール「BizRobo!」とAI-OCRサービス「DX Suite」を連携させるロボットを提供
https://cloud.watch.impress.co.jp/docs/news/1270082.html

RPAテクノロジーズ株式会社は6日、自社のRPAソリューション「BizRobo!」において、AI inside株式会社のAI-OCRサービス「DX Suite」と連携するソフトウェアロボットを提供開始すると発表した。「アップロード・OCR結果出力ロボット」と「レポーティングロボット」の2つを提供する。　1つ目の「アップロード・OCR結果出力ロボット」は、DX Suiteへの帳票アップロード／ダウンロードを効率化するためのもの。一方の「レポーティングロボット」では、ロボットがDX Suiteの処理量を監視し、利用料がオーバーしそうな場合に、アラートの通知メールを送ることができる。


##RPA HACKについて
RPA HACKではRPA・AI・Power Automateに関する記事が100本以上掲載されています！すべて無料でご覧いただけます！

RPAのツールを触ってみたい！という方におすすめ↓
・UiPath StudioXの基本をマスター！～画面構成/カード/アクション
https://rpahack.com/uipath_studiox_1

RPAエンジニアとして働いてみたいという方におすすめ↓
・事務職から転職したRPAエンジニアが語る仕事の2つの魅力
https://rpahack.com/attraction-of-rpa

Power Automateの使い方を学んで見たい方におすすめ↓
・Power Automateの便利な使い方をカテゴリーごとに紹介
https://rpahack.com/powerautomate-2

RPA HACKのtwitterのフォローもよろしくお願いします！
(URL：https://twitter.com/home)
PYNQ > DMA tutorial: DMA to streamed interfaces  > 1. PS to PL, 2. PL to PS のBlock Designの確認

```txt:動作環境
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent) (以下、PYNQと表記)
PYNQ v2.5 Image
Vivado v2019.1 (64-bit)
```

### 概要

- FIFOを使うDMAの実装を整理する
- PS to PLのデータの流れ
- PL to PSのデータの流れ


### 関連

- [PYNQ > FIFO loopbackを含むDMA転送のBlock Design (Vivado v2019.1) > v2017.2の方法から変更](https://qiita.com/7of9/items/de3f3b62bac9eda99352)
- [PYNQ > DMA tutorial: DMA to streamed interfacesを試した > 提供されたbitstream | tclから生成されるBlock Design](https://qiita.com/7of9/items/660cf7819e1b54b385a3)
- [PYNQ > DMA tutorial: DMA to streamed interfaces > Block design > 動作しないtclをsourceで読むと動作するようになった](https://qiita.com/7of9/items/f0e1343445800d972e03)


## Block Design

Block Design全体については下記を参照。
https://qiita.com/7of9/items/660cf7819e1b54b385a3

### FIFO周辺のBlock Design

左側中段にFIFOのIPがある。
二つのAXI Direct Memory Accessと二つのAXI SmartConnectがつながる。

![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/a9cec032-05a9-3a45-931e-c11516e907be.png)

### PS to PL

PSからPLへのデータの流れに関するconnectionをオレンジ色にした。

![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/14e50592-a096-cf29-0197-ac563e0ef953.png)


### PL to PS

PLからPSへのデータの流れに関するconnectionをオレンジ色にした。

![スライド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/e3288b80-b390-ce1a-5f65-a045ae7c1f4b.png)
仮想記憶管理におけるページ置換えアルゴリズム　LRU、LFU、FIFO

平成31年春期 午前問題19


仮想記憶管理におけるページ置換えアルゴリズムとしてLRU方式を採用する。主記憶のページ枠が，4000，5000，6000，7000番地(いずれも16進数)の4ページ分で，プログラムが参照するページ番号の順が，1→2→3→4→2→5→3→1→6→5→4のとき，最後の参照ページ4は何番地にページインされているか。ここで，最初の1→2→3→4の参照で，それぞれのページは4000，5000，6000，7000番地にページインされるものとする。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/9d3d133b-3414-bde5-40d9-d3d714242f24.png)

1->4(1)とは、ページ１が4000を参照するとすると、流れとアクセス順は下記となります：

1->4(1)
2->5(2)
3->6(3)
4->7(4)
2->  5(2)  7(4)6(3)4(1)
5->  4(5)  5(2)7(4)6(3)
3->  6(3)  4(5)5(2)7(4)
1->  7(1)  6(3)4(5)5(2)
6->  5(6)  7(1)6(3)4(5)
5->  4(5)  5(6)7(1)6(3)
4->  6(4)

１、LRU(Least Recently Used)
最近で最も長い間使用されていないページを置き換え対象とするアルゴリズムです。

２、LFU(Least Frequently Used)
各ページに参照フラグと変更フラグを付加して管理し，参照なしかつ変更なしのページを優先して置き換える

３、FIFO(First In First Out)
最も長い間主記憶にあったページを置き換える


・ページングでは固定長の単位で行われるため、フラグメンテーション(メモリの断片化)は発生しません。
・ページフォールトが発生した場合は，置換え対象を決定した後、ページアウト／ページインが行われます。

・**ページフォールト**とは、
ページング方式の仮想記憶（仮想メモリ）において、プログラム（プロセス）がアクセスしようとした仮想メモリ領域（ページ）が物理メモリ上に無く、ストレージに退避していることが分かったときに発生する例外あるいは割り込み処理。

・フラグメンテーションとは、
破片、断片、砕ける、断片化する、などの意味を持つ英単語。ITの分野では、まとまったデータや記憶領域などを小さな単位に分割したり、意図せず小さな断片に分断されてしまうこと（および、そのような状態になったデータや領域自体のこと）などを意味する。
長時間コンピュータを起動して様々なプログラムを使用していると、メモリ領域についてにも似たような現象が起きることがあり、これを「メモリフラグメンテーション」という。

参考：
https://www.ap-siken.com/kakomon/20_haru/q23.html

https://www.fe-siken.com/kakomon/25_haru/q20.html
Nuxt.jsで作ったサイトにPWA設定をする方法【@nuxtjs/pwaを使用】

Nuxt.jsで作ったサイトにPWA設定をする方法になります。
[@nuxtjs/pwa](https://pwa.nuxtjs.org)を使用します。

## @nuxtjs/pwaをインストール
まずは、`@nuxtjs/pwa`をインストールします。

```
#yarn
yarn add @nuxtjs/pwa

#npm
npm install --save @nuxtjs/pwa
```

## nuxt.config.jsで読み込む

```js:nuxt.config.js
export default {
  modules: [
    '@nuxtjs/pwa'
  ],
}
```
## iconをstaticディレクトリに配置する
PWA用のiconをstaticディレクトリに配置します。
ファイル名は`icon.png`に設定する必要があります。


```
├─ static
│  ├─ icon.png
```
ちなみに、PWAのアイコンサイズは、512x512～700x700ピクセルが推奨とされています。 

## manifestを設定
`nuxt.config.js`でPWA用の`manifest`を設定します。

```js:nuxt.config.js
export default {
  modules: [
    '@nuxtjs/pwa'
  ],
  /*
   ** @nuxtjs/pwa Configuration
   ** https://github.com/nuxt-community/pwa-module
   */
  manifest: {
    name: 'demo',
    lang: 'ja',
    short_name: 'demo',
    title: 'demo',
    'og:title': 'demo',
    description: 'demoサイトです',
    'og:description': 'demoサイトです',
    theme_color: '#212121',
    background_color: '#212121'
  },
}
```
上記の設定をすることで、Nuxt.jsで作ったサイトをPWA化することができます。

## キャッシュの設定例など

https://qiita.com/TK-C/items/56fd03de8f463e938d9f

## 最後に

他にも色々な設定をすることができるので、下記公式サイトが参考になります。

https://pwa.nuxtjs.org
h:commandButtonで確認ダイアログでOKの時だけaction属性の処理を実行する方法

- 環境
    - CentOS Linux release 7.8.2003 (Core)
    - Eclipse IDE for Enterprise Java Developers.Version: 2020-03 (4.15.0)
    - openjdk version "11.0.7" 2020-04-14 LTS
    - JSF 2.3.9

# やりたいこと
1. ボタンを押下すると確認ダイアログを表示する
1. 確認ダイアログで[OK]ボタンを押下するとaction属性のビジネスロジックを実行する
2. 確認ダイアログで[キャンセル]ボタンを押下するとなにもしない


# 確認ダイアログでOKの時だけaction属性の処理を実行する方法
※. `html`タグ、`next.xhtml`は省略
確認ダイアログは、[window.confirm](https://developer.mozilla.org/ja/docs/Web/API/Window/confirm)を利用

```xml:base.xhtml
<h:head>
  <title>ponsukeのQiita用</title>
  <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
  <h:outputScript library="js" name="base.js"/>
</h:head>
<h:body>
<h3>ここはA画面</h3>
<h:form id="formId">
  <div>
    <h:commandButton value="画面遷移"
      onclick="return confirmMessage();"
      action="#{sampleBean.showNextPage()}" />
  </div>
</h:form>
</h:body>
```

```javascript:base.js
/**
 * 確認ダイアログを表示する.
 * @return {boolean} 確認ダイアログでの選択結果 true:OKボタン押下.
 */
function confirmMessage() {
    return window.confirm('画面遷移していい？');
}
```

```java:SampleBean.java
package brans;

import javax.faces.view.ViewScoped;
import javax.inject.Named;

@Named
@ViewScoped
public class SampleBean implements Serializable {
    /** serialVersionUID. */
    private static final long serialVersionUID = -6782548672735889274L;
    /**
     * 次のページを表示する.
     * @return 次のページ.
     */
    public String showNextPage() {
        return "next.xhtml";
    }
}
```

# 失敗事例 : onclick属性でreturnしない
base.jsで`return`しているんだから、もうよくね？と思ってしょっちゅう失敗する。
確認ダイアログの結果にかかわらずaction属性の処理が実行される。
理由をだれか説明してほしい・・・。

```xml:base.xhtml
<!--省略-->
    <h:commandButton value="画面遷移"
      onclick="confirmMessage();"
      action="#{sampleBean.showNextPage()}" />
<!--省略-->
```

```xml:こうやって書くのはボタンごとにちゃんと動作する
    <h:commandButton value="画面遷移"
      onclick="return window.confirm('画面遷移していい？');"
      action="#{sampleBean.showNextPage()}" />
```
【初心者が悩む】RubyとPHPとPythonどれが良いのか？

# まずはじめに
プログラミングをやってみようとしてまず考える事が「どのプログラミング言語から初めよう？」というところではないでしょうか。

そしてググっていくとRubyというプログラミング言語が真っ先に情報として入ってくるのではないでしょうか？

Rubyが真っ先に初心者に引っかかる理由は何と言っても「プログラミングスクールの殆どがRubyを激推ししているから」に尽きます。

ちなみに更にググってみるとRubyと似た言語にPHPとPythonがあるのです。

一体どの言語を勉強すれば良いのでしょうか？

## RubyとPHPとPythonのイメージ

まず、殆ど知識が無い状態の私が持っていたイメージ。

* Ruby - 初めて耳にする。
* PHP - 古臭い。
* Python - 初めて耳にする。

結果、なんとなくPHPは聞いたことがある...という程度です。私の場合は、ワードプレスでブログ運営していた時期が少しばかりあったのでPHPというプログラミング言語の存在は知っていました。

PHPは古臭いと書きましたが、ググってみると、

* Ruby - 1993年2月24日生まれ(1995年12月発表)
* PHP - 1994年生まれ(1995年6月8日発表)
* Python - 1990年生まれ(1991年発表)

PHPがこの３つのプログラミング言語の中で新しいことが分かりました。イメージだけで、古臭いと決め付けていたPHPに謝りたいです。

## PHPだけ少し違う！？
比較されるには何か理由がある訳ですが、この３つのプログラミング言語は、サーバーサイドでとても使われている言語です。

そして、記述の方法がとてもよく似ています。

例えばシンプルにHello world!を３つの言語で使用してみましょう！

```ruby:Ruby
print "Hello World!"
```

```php:PHP
<?php 
echo "Hello World!"; 
?>
```

```python:Python
print("Hello world!")
```

......
....
..


気づきましたか！？
RubyとPythonは書き方が似ていますが、PHPだけ少しゴチャっとしていますよね。先ほどは、記述方法がよく似ていると書きましたが、実はよくよく見てみるとPHPだけどこか違います。

なぜ、PHPだけ少しゴチャっとしているのかは[PHPのWikipedia](https://ja.wikipedia.org/wiki/PHP_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))に下記のような記載を見つけましたが、これが答えなのではないでしょうか？
>元々PHPはプログラミング言語と言えるものではなく、単にテンプレート的な処理を行うだけであったが、度重なる機能追加やコードの書き直しにより、2017年現在リリースされているPHP 5やPHP 7は目的によらず汎用的に使うことの出来るスクリプト言語となっている。

要するに
__PHPは元々、プログラミング言語とは違うものだった。__
推測ですが、それが答えだと思います。

## RubyとPHPとPythonはなぜ比較されるのか？
ここでは大きく考えられる２つの要因について書きます。
### フレームワークが凄い
フレームワークは、アプリケーションを作るときに開発工程を大幅に短縮することのできるソフトウェアのことで、この__フレームワークが充実している＝凄い機能のアプリを短期間で作成することのできる。__使える人が使えば、魔法のアイテムのようなものですが、今回紹介したRubyとPHPとPythonには、

* Ruby - Ruby on Rails
* PHP - Laravel
* Python - Django

上記のような素晴らしいフレームワークが揃っています。

### 近年伸びているメジャーサイトが利用している
やっぱりここに尽きるのではないでしょうか？

* Ruby - Twitter, Hulu etc...
* PHP - Wikipedia, Facebook etc...
* Python - Googleの検索エンジン, YouTube etc...

どのプログラミング言語も甲乙付け難い一流企業が利用しています。

## 結局どの言語を学べばいいのか？
興味を持った言語を学べば良いと言ったらそれで済む話ですが、

趣味ではなく就職や転職の為に学んでいるのならば単純に求人数だけを見てみると、
PHP>=Ruby>Python
の傾向なので、PHPが一番なのかもしれません。
あくまで、求人数だけでの話ですが...。

参考: [【PHP/Python/Rubyを比べてみた】言語のメリットとデメリット、特徴まとめ | Workship MAGAZINE(ワークシップマガジン)](https://goworkship.com/magazine/battle-of-webprogramming-languages/)
Anaconda環境でのSSLモジュールエラーの解決方法

# はじめに
皆様こんにちは。Pythonお勉強中のノンプログラマーのむーです。
最近PC新調してちゃんとPythonやるぞ！と思いとりあえずメール送信をやろうとしたら
いきなりのエラー。。。
解決に至るまで思ったよりも日本語情報見つけられなかったので経緯と対処を備忘録に残しておきます。


# 環境
Anaconda3.8
Python3.8
Windows10 64bit


#起こったこと
```
import ssl
```
実際には色々書いたコードでしたが絞っていくと上記importで下記エラーが発生していました。

*import _ssl             # if we can't import it, let the error propagate*
*ImportError: DLL load failed while importing _ssl: 指定されたモジュールが見つかりません。*


# 解決方法
原因はDLLエラーだったので、Anacondaインストールフォルダ以下Libraryフォルダ内にある以下2ファイルを
DLLフォルダにコピーしたところ無事エラーが解消されました。

**格納元**
　Anaconda\Library\bin\ 
**格納先**
　Anaconda\DLLs\

**DLLファイル**
　libssl-1_1-x64.dll
　libcrypto-1_1-x64.dll


# 所感
終わってみれば何をこんなことを、という感じですが初心者には最初なかなか焦る状況でした。
途中でpipで別手段試みた時にもSSLエラー出たのでそちらも同影響あったのかな。
もし同じような状況になった方はぜひ一度対象DLLの存在チェックをしてみてください。


#参考サイト
https://stackoverflow.com/questions/54175042/python-3-7-anaconda-environment-import-ssl-dll-load-fail-error
Rxメモ

## Reactive宣言
https://www.reactivemanifesto.org/ja

## メリット・デメリット
[Rx時代の先にあるもの](https://blog.fenrir-inc.com/jp/2017/12/rx-earth.html)

## 解説記事
* [リアクティブシステムが注目を集める理由](https://thinkit.co.jp/article/9185)  
周辺要素を踏まえており、わかりやすい。

* [RxJS5で始めるRx入門@erukiti](https://qiita.com/erukiti/items/5794c71ff438628d2b04)
* [Conceptual Contexture](https://pokarim.hatenadiary.org/search?q=%E3%83%AA%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96)
リアクティブプログラミングに関する記事多し。

### スライド
* [なぜリアクティブは重要か](https://www.slideshare.net/okapies/scalamatsuri-58141520)

## 歴史
[RxJava Night振り返り（Reactive Extensionsの歴史）](http://neue.cc/2014/10/29_481.html)

## 採用事例
### クックパッド
https://techlife.cookpad.com/entry/2015/06/25/093507

明確に価値を認めているような記述はなし。

## 類似技術
### React
ご存知至高のライブラリ。

### WebSocketのPub/Subモデル
仮想通貨取引所のAPIで、WebSocket APIがあるが、これはリアクティブだと思われる。
[bitFlyer Realtime API](https://bf-lightning-api.readme.io/docs/endpoint-socket-io)

### JavaFX Observable
[Observable Javadoc](https://docs.oracle.com/javase/jp/8/javafx/api/javafx/beans/Observable.html)

### Akka
https://akka.io/
HP見ると、分かるが、商用採用事例多し。


## Qiita記事
https://qiita.com/hiruberuto/items/39e4126f470d8b84b291

## 個人的な理解
そもそもデザインパターンとしてのオブザーバーである。
GUIライブラリであるJavaFXのObserverインタフェースなどはとても分かりやすいかと思う。

プログラミングパラダイムとしてのオブザーバーという立て付けは無理があるのでは？
もちろん、有用な適用箇所は確実にあると思われる。

### 有用と思われる適用箇所
* 非同期処理
 * ネットワークを介するAPI
 * イベント駆動型API
 * GUI

あとは、調べていて適用箇所を明らかに間違っているものがあった。
Cognitoメモ

> 自分で調べた範囲内のことを記載しております。
間違い等ありましたらご指摘いただければ幸いです。

# Cognito
認証、許可、ユーザー管理を提供。

## User Pool
* ユーザ管理
 * [OIDCに準拠したユーザ情報](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-settings-attributes.html)管理  
一応、[カスタム属性](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-settings-attributes.html#user-pool-settings-custom-attributes)も作れるが、検索できるAPIはなさそう。
 * [ユーザのインポート](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pools-import-users.html)
     * パスワードは不可（インポートしたユーザはRESET_REQUIREDになる）
 * ユーザグループによるグループ管理
     * グループごとにロールを持たせることが可能

* ユーザ認証
 * ID×パスワード認証  
     * [パスワード要件](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-settings-policies.html)  
6文字未満はNG。
 * 多要素認証の提供
 * カスタム認証
 * ホストされたUIとして、認証ページが用意されている（英語版）


## ID Pool
* ID Providerへの連携
ID Providerとしては、以下が使える。

  * Amazon
  * Facebook
  * Google
  * Apple
  * Cognito User Pool
  * Open ID Connect Provider
  * SAML ID Provider
  * 開発者が認証したID
* ID Poolに対するAWSロール設定
以下の分類でロールを設定する。
  * 認証されたID
  * 認証されていないID
* AWSロールによるAWS機能への認可
クリーンアーキテクチャメモ

# 解説記事
[クリーンアーキテクチャ(The Clean Architecture翻訳)](https://blog.tai2.net/the_clean_architecture.html)

# 批判的記事
## 
https://www.kabuku.co.jp/developers/clean-architecture-inconsistency
こちらの記事では矛盾していて作れない、という結論になっている。
アプリ道場サロンの課題チャレンジPart1

iOSアプリ開発をテーマとしたオンラインサロンに入っています。
https://community.camp-fire.jp/projects/view/281055

その中で課題があって、やってみたい人は自由に課題にチャレンジする事ができます。
やった課題は、サロン主からフィードバックがもらえます。

## 課題
最初の課題は数字を足し算するアプリです。
https://www.youtube.com/watch?v=ICsj-14nhBc&list=PLQ5rERkGSxF-fsdBNQu70r5r0OPwSVygO&index=2&t=0s

この課題で調べものをしたのは下記です。

・キーボードの閉じ方
https://qiita.com/jumpyoshim/items/4b8b5f2297910d7f3d1b

・ストーリーボードで並んでいるViewを配列として扱うやり方（StackView）
https://qiita.com/yucovin/items/ff58fcbd60ca81de77cb


## 結果
下記のようなアプリを作れました。
<img width="430" alt="screenshot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215739/a984f8d1-6918-1dff-58c5-d85a5459472a.png">
記憶領域のスタックとヒープ

平成31年春期 午前問題17

プログラムの実行時に利用される記憶領域にスタック領域とヒープ領域がある。それらの領域に関する記述のうち，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/67cd31ba-0b5f-ad61-7cd4-689bfb124e63.png)

１、スタック
一般にコールスタック・制御スタックと呼ばれている。LIFO方式で構成されプログラムの実行中サブルーチンの情報を記憶しておくメモリ領域。
サブルーチン終了後の戻りアドレスや局所変数などを保持する。

２、ヒープ
多くの場合、2つのラベルを持つ双方向リスト(リンク構造)で構成されプログラム上から動的(任意)に確保できるメモリ領域。
動的にメモリ取得・解放を繰り返すことによりメモリ上にどこからも参照されない領域(ガベージ)が発生する。

ヒープの初期状態は「未使用」状態であり、メモリの動的確保によって「使用」領域と「未使用」領域に分かれていきます。

ヒープとスタック領域の役割は異なるため、予備領域ではありません。



参考：
https://www.ap-siken.com/kakomon/21_haru/q18.html
React Hooks inputのコンポーネントの作り方

色々とコンポーネント化していくと(inputのtypeを変更できる汎用性を持った)テキスト入力だけのコンポーネントをも欲しくなった。  
しかしそうなると親で値を管理したいはずなので面倒だなぁって思っていましたが意外と楽だった。

## 概要
親から子に値を渡してもReadしかできないので親のuseStateの値更新する関数をそのまま子コンポーネント に渡す。

## 子コンポーネント 
...`any`使っちゃいました。  

```tsx
import styles from './FormText.module.scss'
import { useState } from 'react'

export const FormText = ({
  className,
  type,
  label,
  onChange,
}: {
  className?: string
  label: string
  type: string
  onChange: (e) => void
}) => {
  const [name, setName] = useState('')
  const handleSetName = (e: React.ChangeEvent<HTMLInputElement> | any) => {
    if (onChange) {
      onChange(e.target.value)
    }
    setName(e.target.value)
  }
  return (
    <>
      <div className="form_text">
        <label htmlFor="">{label}</label>
        <input type={type} value={name} onChange={handleSetName} />
        {name}
      </div>
    </>
  )
}
```

## 親コンポーネント
親コンポーネントでは通常のinputを使っているのと変わらないような感じでonChangeのとこにuseStateの値をセットする関数をいれる。

これでtypeがtextとpassword別々で値を管理できる🎉

```tsx
import { useState } from 'react'
import Head from 'next/head'
import Layout, { siteTitle } from '../components/layout'
import { getSortedPostsData } from '../lib/posts'
import { GetStaticProps } from 'next'
import { Section } from '../components/Section'
import { Sheet } from '../components/Sheet/Sheet'
import { FormText } from '../components/FormText/FormText'

export default function Home({
  allPostsData,
}: {
  allPostsData: {
    title: string
  }[]
}) {
  const [name, setName] = useState('')
  const [passWord, setPassWord] = useState('')

  return (
    <Layout home>
      <main>
        <Section>
          <Sheet>
            <FormText label="text" type="text" onChange={setName} />
            <FormText label="text" type="password" onChange={setPassWord} />
          </Sheet>
        </Section>
      </main>
    </Layout>
  )
}

export const getStaticProps: GetStaticProps = async () => {
  const allPostsData = getSortedPostsData()
  return {
    props: {
      allPostsData,
    },
  }
}

```

## ひとこと
いつもevent系で型の解がわからないです...。
わかる人がいれば教えていただきたいです。
僕がよくやるVueでWebアプリ作成のための準備

# はじめに

webアプリ作って、自分なりのいいやり方が固まってきたので、ここで公開しておきます。
参考になれば幸いです。

# 準備

```shell
mkdir hoge
cd hoge
yarn init
```

まずはディレクトリを作って、コードを書く場所を準備します。
yarnの質問は適当に答えておいてください。
めんどくさい場合は、改行連打でOKです。

```shell
yarn add --dev parcel
```

parcel入れます。
依存関係はすべてparcelにおまかせ。
parcel最高です。

```shell
mkdir src
```

コードを管理するディレクトリを作ります。
なくても大丈夫ですが、整理整頓のために準備します。

# コード

```pug:index.pug
doctype html
html
    head
        meta(charset="UTF-8")
        meta(name="viewport" content="width=device-width, initial-scale=1.0")
        title スターターキット
    body
        div#app
    script(src="index.ts")
```

```typescript:index.ts
import Vue from 'vue'
import App from './App.vue'

import Buefy from 'buefy'
import 'buefy/dist/buefy.css'

Vue.use(Buefy)

new Vue({
    el: '#app',
    render: h => h(App)
})
```

```vue:App.vue
<template lang='pug'>
  div.hero.is-fullheight
    div.hero-body
      div.container.has-text-centered
        h1.title オレオレスターターキット
        h2.subtitle それっぽいでしょ

        div.container
          a.link-stylus(href="https://buefy.org/") buefyはスッキリかけて、僕は好きです。

    div.hero-foot
      div.container.has-text-centered
        span &copy; 2020
        a(href="https://twitter.com/nucosenpai" target="_blank")
          span ぬこ先輩

</template>

<script lang='ts'>
  import {Component, Vue} from "vue-property-decorator"

  @Component
  export default class App extends Vue {
  }
</script>

<style lang="stylus" scoped>

.link-stylus
  border: 1px solid

</style>
```

srcディレクトリに上の3つのファイルを準備します。
templateにpugを使ってることで、かなり見やすくなっていると思います。
見た目のために僕はbuefyを使いましたが、ここはお好みで。

```shell
yarn parcel src/index.pug --open
```

yarnが自動的に依存関係を調べてくれて、必要なモジュールをすべてインストールしてくれます。
hot reloadにも対応してますので、動作を確認しながら開発ができます。

# おわりに

できたアプリはvercelで公開してみるといいと思います。

```shell
vercel
vercel --prod
```

僕が最近作ったアプリはマンダラチャートが書けて、画像として保存できます。
[mandara](https://mandara.vercel.app/)
目標設定などに使ってみてください。
PYNQ > DMA tutorial: DMA to streamed interfaces > Block design > 動作しないtclをsourceで読むと動作するようになった

```txt:動作環境
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent) (以下、PYNQと表記)
PYNQ v2.5 Image
Vivado v2019.1 (64-bit)
秀丸エディタ Version 8.9.1
```

### 関連

- [PYNQ > DMA tutorial: DMA to streamed interfacesを試した > 提供されたbitstream | tclから生成されるBlock Design](https://qiita.com/7of9/items/660cf7819e1b54b385a3)

### 概要

- DMA tutorial: DMA to streamed interfacesのtclファイルからBlock Designを生成し、bitstream生成
    - => DMA転送できる
- DMA tutorial: DMA to streamed interfacesを参考にBlock Designを作成
    - => DMA転送できない
- DMA tutorialと作成したBlock designのtclファイルから相違を確認して、Vivadoデザインで修正
    - => DMA転送できない
- 修正したtclファイルをsourceコマンドで読みなおしBlock Design自体を再作成
    - => DMA転送できた


### Pythonスクリプト

作成したbitstreamに対しては、以下のPythonスクリプトを試した。

https://github.com/Xilinx/PYNQ_Workshop/blob/master/Session_4/6_dma_tutorial.ipynb

### 成功: DMA tutorial: DMA to streamed interfacesのtclファイルからBlock Designを生成し、bitstream生成

https://github.com/Xilinx/PYNQ_Workshop/tree/master/Session_4/bitstream
にある`dma_tutorial.tcl`をVivado上にて

```
source dma_tutorial.tcl
```
 
作成されたBlock Designからbitstreamを作成して、Pythonスクリプトを試した。
DMA転送ができた。


### 失敗: DMA tutorial: DMA to streamed interfacesを参考にBlock Designを作成

学習のため、上記で作成されたBlock DesignをVivado上で自分で作成してみた。

bitstreamを作成してPythonスクリプトを試した。
DMA転送に失敗した。


### 失敗: DMA tutorialと作成したBlock designのtclファイルから相違を確認して、Vivadoデザインで修正

次に、元になったtclファイルと自分で作成したtclファイルの相違を秀丸エディタで確認した。
ここで各種の名前の相違などが見つかり、Vivadoのデザイン画面にてそれらの名前の修正を行った。

その上でさらに相違を確認すると、axi_smc_2のM00_AXIとM01_AXIの接続を反対にしていたことに気づいた。
この修正をVivadoのデザイン画面にて修正した上でbitstreamを作成した。

DMA転送に失敗した。


### 成功: 修正したtclファイルをsourceコマンドで読みなおしBlock Design自体を再作成

ふと、「作成したBlock designのtclファイルからBlock designを自動生成するとどうか」と思った。
実行したところ、作成したbitstreamにてDMA転送が正常に実行されるようになった。


### まとめ

Block designが期待通り動作しない場合、いったんtclファイルからBlock Designを生成しなおすと、不整合がなくなるのかもしれない。
マイページ（自分の投稿だけ見える）実装

備忘録アウトプット

投稿機能が先日実装できたので、次は自分の投稿だけ見えるようにするマイページ実装を行いました。
試行錯誤し下記コードに到達

```header.html.haml
.header
  = link_to "Answer", root_path ,class: "header__title" 
  -if user_signed_in?
    = link_to "投稿", '/top_page/new' , class: "header__post"
    = link_to "マイページ", '/users/#{current_user.id}', class: "header__mypage"
    .header__search
      検索 
  -else
    .header__search
    .header__search
    .header__search
    .header__search
    .header__search
    .header__search
      検索 
```

```ruby:qiita.rb
class UsersController < ApplicationController
  def index
  end

  def edit
  end

  def update
  end

  def show
    @responses = current_user.top_pages
  end
end
```


```users>show.html.haml
.top
  %ul.top__side
    ジャンル
    %li.top__side__love
      恋愛
    %li.top__side__work
      仕事
    %li.top__side__money
      お金
    %li.top__side__friend
      友人
    %li.top__side__school
      学校
    %li.top__side__other
      その他
  .top__consultation
    .top__consultation__title
      お悩み一覧
    - @responses.each do |responses|
      .top__consultation__text
        = link_to responses.contents, "/user/#{responses.id}", method: :get
        .top__consultation__text__main
          .top__consultation__text__main__name
            = responses.user.name
          .top__consultation__text__main__time
            = responses.created_at
```
するとこんな感じに
<img width="1434" alt="a0664f72d2380a27a88030132e0698e6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653208/70542547-374d-e1e3-aa30-34eb03b96bbd.png">

エラーは覚悟していたが、まさかのルーティング。え？と思いながらrouteを確認しても間違いらしきものは見つからず。
ふとマイページのURLが目に入ったのですがこんな感じに。
http://localhost:3000/users/#{current_user.id}

ログインユーザーを識別するコードを書いたのですが、何故文字列のままになっているんだ？？
と疑問を感じつつリンクに繋がるコードを確認しました。（ファイルで言うところのheader.html.hamlですね)
で、原因はこれ

```
    = link_to "マイページ", '/users/#{current_user.id}', class: "header__mypage"
```
正直書いたときから、違和感はありました（言い訳）
これはダブルクォーテーションですね！！

というか使い方もよくわかっていなかったので改めて調べました。

シングルクォーテーションは文字列にする場合
ダブルクォーテーションは変数や計算式などが付与される場合
で使い分けるそうです、ざっくばらんですけど。

であればこれシングをわざわざ使う事ってあるんですかね？
よくわかりません。全部ダブルでよくない？　可読性とか？
知ってるかたいたら教えてください。

まぁとりあえずここをダブルに直したら表示はされましたとさ。
ロジックアナライザを試すその２（I2C）

# I2Cをロジックアナライザで確認
[こちら](https://qiita.com/infinite1oop/items/508873f660812e52f324)の続き。ただし、今回はMacでトライ。用いたロジックアナライザも[同じ](https://www.switch-science.com/catalog/5194/)。

## PulseViewをMacにインストール
[ここ](https://sigrok.org/wiki/Downloads)にある「Stable release builds」をインストールする。[こちら](https://sigrok.org/wiki/Mac_OS_X)の「Downloads」にあるものは私のMacでは動作せず。

## PulseViewでの設定
### はじめに
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/6f3ca3d4-10d1-0050-fb16-3e559bdb4cdc.png", width=65%>
「fx2lafw」->「USB」->「Scan」->「Saleae」を選択。すると、次のようになるが、ここでは、D0（SDAを接続）とD2（SCLを接続）のみ使用するので、それ以外は右クリックして「Disable」する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/b8b12a70-4d41-3f38-57ec-10315ba5065d.png", width=70%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/8340ab18-5ced-10d7-06e0-e0283fe7b627.png", width=25%>

### I2C設定
下記赤枠のマークをクリックすると、プロトコル選択画面が表示されるので、I2Cを選択する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/86b11d70-7fdc-f8ce-505f-0810d818e274.png", width=80%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/a4a6f41c-a9dd-1f53-9e77-cb3b55819072.png", width=50%>
選択後、次のように表示される。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/92fb2d82-8a59-b5e0-0e20-c20e143c7e75.png", width=90%>
ここで、次のようにSDAをD0に、SCLをD2に割り当てる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/3ccaeeaa-c271-2597-af71-845e78283458.png", width=90%>

## I2C通信の構成
I2Cコマンドレスポンスが明示的に見えるよう、[MacからI2C制御](https://qiita.com/infinite1oop/items/df0e90480a20e9c6ffd5)で用いた構成である、USB-to-I2Cボード、I2Cデバイス（光センサー）、ソフトウェア（Coolterm）を用いる。配線は次の写真。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/96e9e372-2156-ab58-b3d3-7e274ad4cefd.jpeg", width=80%>
ここでは、ロジックアナライザに接続するためにI2Cハブ（右の方に見えるもの）を用いている。

## 実験
### I2Cアドレス確認
光センサーのI2Cアドレスは「0x29」（7bit表記）。1バイトのデータ「0x00」を書き、1バイトのデータを読み込んでみる。詳細は、[MacからI2C制御](https://qiita.com/infinite1oop/items/df0e90480a20e9c6ffd5)。以下、同様。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/da4a101f-ebdc-e287-195c-046962431cea.png", width=110%>
I2Cアドレスおよびデータ「0x00」の「AW:29」（Address Write:0x29）および「AR:29」（Address Read:0x29）がデコードされているのがわかる。

### センサーON
光センサーをONするには、Controlレジスタ「0x80」にデータ「0x03」を書き込む。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/de449e3a-c33a-87c5-0ad8-1272a00ee194.png", width=110%>
同じくデコードされているのがわかる。

### データ取得
光センサーデータData0LOWを取得する。レジスタは「0x8C」。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/90b73bc8-f7ef-defe-92b2-2a2b2838a22d.png", width=110%>
データ「0x9E」がCoolterm上で取得できていると同時に、ロジアナ上でもそのデータを見ることができる。

### 接続されていないI2Cアドレスにコマンドを送ってみる
例えば7bit表記で0x03に、1バイトのデータ「0x00」を書き、1バイトのデータを読み込んでみるが、、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/6f40223d-e9f5-f475-0725-ad2015a1f52e.png", width=75%>
レスポンスなし。

## 終わりに
実験成功。その次はSPIにトライしてみる。
vistaでquartus その23

#概要

vistaでquartusやってみた。
modelsimとiverilogで動くtestbench書いてみた。

#写真
modelsim
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/be394f9c-2214-de62-3267-a54597f9accc.png)

iverilog
![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/fac8554e-526d-ca3e-80fb-7f02e7837af8.png)

#サンプルコード

lチカ
![CIMG2956.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/f6f99ad4-b8cc-b692-fcd3-210c85950fcb.jpeg)



```
module test2(input clk, input rst, output led5, led4, led2);
	reg [26:0] cnt;
	assign led5 = ~cnt[24];
	assign led4 = ~cnt[25];
	assign led2 = ~cnt[26];
	always @(posedge clk, negedge rst)
	begin
		if (~rst)
			cnt <= 'b0;
		else
			cnt <= cnt + 1;
	end
endmodule
```

#testbench


```
module test;
	reg clk,
		rst;
	test2 t(.clk(clk), .rst(rst), .led5(led5), .led4(led4), .led2(led2));
	initial
	begin
		clk = 0;
		rst = 1;
		#2
			rst = 0;
		#2
			rst = 1;
		#20000
			$finish;
	end
	always
		#1
			clk = ~clk;
	initial
	begin
		$dumpfile("test.vcd");
		$dumpvars(0, test);
	end
endmodule
```


以上。
【Python】decoratorとmetaclassでclass変数をいじる方法

デコレーターを用いてハンドリング処理などを簡潔に書きたい時に、metaclassを使うけれど、やりかたをいつも忘れるのでメモ

```python3
from types import MethodType, FunctionType, LambdaType

class MetaClass(type):
    def __new__(cls, name, bases, attr):
        def is_excutable(v):
            return isinstance(v, (MethodType, FunctionType, LambdaType))

        target = attr['target']

        for k, v in attr.items():
            if is_excutable(v) and getattr(v, '__flag', False):
                target.append((getattr(v, '__command'), v))

        klass = type.__new__(cls, name, bases, attr)
        klass.target = target
        return klass


def decorator(command=''):
    def decorate(func):
        setattr(func, '__flag', True)
        setattr(func, '__command', command)
        return func
    return decorate

class Klass(metaclass=MetaClass):
    target = []

    @decorator('command_name')
    def test_method(self):
        pass

print('Klass.target:', Klass.target)
```
GitでCommitする粒度について

Gitでバージョン管理をするのはフロントエンド、バックエンドエンジニアだけでなく、インフラエンジニアにもコードを必要がある昨今だが、大規模のプロジェクトでGitを使ったことがなかった。
自分の経験を踏まえてGitでCommitする粒度について残しておく

# 対象読者
- Gitを使ったことない人
- Gitの操作はわかるけど使いどころがわからない人
- 駆け出しエンジニア（笑）

※ 個人の経験にもとづいているので注意。

GithubだろうとGitlabだろうと何でも考え方は同じだろう。

# 最適なコミットの粒度とは？
結論はずばり私の”**粒度は細かれば細かいほど良い**”である。
では理由をつらつらと書いていこうと思います。

今回は**お問い合わせForm機能の追加**と言う例を用いて説明しようと思う。
私ならば以下のようなタスクになるだろう。
1.HTMLの作成
2.CSSの作成
3.JavaScriptでValidationを追加
４.サーバサイドのプログラム作成（Ruby、PHP、Pythonなど）

# 戻し作業が楽になる

細かくコミットをすることで
- どこまで動いていたのか？
- どこからバグったのか？
が仕組みでわかるようになり、バグった時の戻しが楽になります。

Gitがバージョン管理ツールである以上、これが大きな理由だろう。
上の１〜4の作業を1つのコミットに入れてしまうと、バグってしまった時の切り分けが難しくなる。
特に３、４のプログラムを組見切った後にバグが発生すると、大変なことになります。

# タスクをサブタスク化して整理しやすくなる。ToDoに落とし込める

コミットを細かくすることでタスクをサブタスク化することになります。
つまり**ToDo**に落とし込めることになります。

上の例のJavaScriptのValidationで考えてみましょう。
Validationだけだと、何するのかフワッとしています。
メールアドレスを入力するFormのValidationを行う場合は、

- メールアドレスの形式があっているか？
- 全角文字が入っていない？
- RFCに準拠しているか？

など1つのFormに対してもいくつも実装しなければいけない機能があります。
細かくすることで〇〇の機能を実装する、〇〇と〇〇の機能を結合させると言った具合にタスクをToDoレベルに落とし込むことができます。
これにより、タスクで何をしなければいけないのか？いう作業に時間を使うのではなく、実装にパワーを使うことができます。

また上司やクライアントのレポートラインに対して何がどこまで終わっているのか？が明確になります。

# 誰かに引き継ぎしやすくなる。

**タスクをサブタスク化して整理しやすくなる。ToDoに落とし込める**と似ていますが、これもメリットです。
どこまで終わって、何をやらなければいけないか整理されていたら、引き継ぎのコストは下がります。
また引き継がれた人は実装だけにパワーを使うので余計な手戻りのリスクが下がります。
自分が忙しくて手が回らなくなっても、誰かに仕事をお願いできるのはメリットだと思います。



以上、私が考えるメリットです。何かありましたコメントお願いします。
PHP Simple HTML DOM Parserを使ってスクレイピングする

#前提
php-simple-html-dom-parserはcookie設定の情報がネット上にあったため、これを使用することにしました

#phpQueryとの比較
[PHPでスクレイピング。phpQueryとphp-simple-html-dom-parserの比較と設置方法](https://blog.s-giken.net/441.html)

#使い方全般
[PHPのスクレイピングライブラリ「PHP Simple HTML DOM Parser」の使い方](https://blog.s-giken.net/442.html)

#cookie設定
[スクレイピングをしてみよう 認証・リダイレクト回避編](http://www.lesson5.info/?p=203)

#findの検出個数のサンプル
[Simple HTML DOM Parserのサンプル](https://tips.recatnap.info/sample_simple_html_dom_parser/)

#foreachのサンプル
[PHP Simple HTML DOM Parser](https://so-zou.jp/web-app/tech/programming/php/library/simplehtmldom/)

#マニュアル
[PHP Simple HTML DOM Parser Manual](https://simplehtmldom.sourceforge.io/manual.htm)
ローカルにdockerを使ってHTTPS環境を立ち上げるスニペット

皆さん良いWEBライフ送れていますか？
今回はいつも困るローカルでのSSL環境構築です。

内容を見ていただけたらわかりますが、基本mkcertに頼りっぱなしになっています。一度mkcertで設定してしまえば、opensslコマンドで証明書を作る際に面倒なオレオレ認証局署名やSSL証明書自体のインストールの手間が省けるので、今の所採用しています。

## 目次

1. コード全貌
    1. ファイル構成
    1. docker-compose.yml
    1. ssl.conf
1. 手順
1. 解説
    1. docker-compose.yml
    1. ssl.conf
1. まとめ

## 1. コード全般

### 1-1. ファイル構成

```yaml
project-root:
    - docker-compose.yml
    docker:
        - ssl.conf
        ssl:
            - example.com-key.pem
            - example.com.pem
    public:
        - index.html
```

### 1-2. docker-compose.yml

```yaml
version: '3'
services:
  web:
    image: nginx:latest
    container_name: 'ssl_web'
    ports:
      - '4430:443'
    volumes:
      - ./docker/ssl:/etc/nginx/ssl
      - ./docker/ssl.conf:/etc/nginx/conf.d/default.conf
      - ./public:/var/www/html
```

### 1-3 ssl.conf

```conf
server {
  listen              443 ssl;
  server_name         localhost;
  root                /var/www/html;
  index               index.html;
  ssl_certificate     /etc/nginx/ssl/example.com.pem;     # SSL証明書
  ssl_certificate_key /etc/nginx/ssl/example.com-key.pem; # 秘密鍵
}
```

※ 証明書のファイル名は適宜変更してください

## 2. 手順

```bash
brew install mkcert
mkcert -install
cd project-root/docker/ssl
# ここで証明書ファイルを作っています。
mkcert example.com
cd ../../
docker-compose up -d
```

### アクセス方法

- PCの場合: `https://127.0.0.1:4330`
- スマホの場合: `https://{ifconfigなどで表示されたローカルIP}:4330`

※ localhostだとdockerがうまく解釈できないのでIP指定にしています。

## 3. 解説

### 3-1. docker-compose.yml

```yaml
image: nginx:latest
```

confがnginxのフォーマットなのでnginxにしていますが、confさえWEBサーバーにあったものを書ければapacheでも動くと思います。

```yaml
ports:
  - '4430:443'
```

自分でも理解しきれていませんがハマったポイントです。
`443:443`といったlocalhostの443ポートをdockerの443ポートに繋げる記述でも動くと思っていましたが、`4430:443`とlocalhost側のポートは通常のSSLポートと変えてあげる必要があるようです。

```
volumes:
  - ./docker/ssl:/etc/nginx/ssl
  - ./docker/ssl.conf:/etc/nginx/conf.d/default.conf
  - ./public:/var/www/html
```

ローカルのディレクトリ、ファイルをdockerにマウントしています。

```yaml
- ./docker/ssl:/etc/nginx/ssl
```
sslディレクトリに関しては証明書ファイルをマウントしているだけです。

```yaml
- ./docker/ssl.conf:/etc/nginx/conf.d/default.conf
```
ssl.confはnginxイメージのデフォルトの設定ファイルを上書きする設定にしています。default.confを指定して上書きしないとややこしかったのでこうしています。

```yaml
- ./public:/var/www/html
```
publicディレクトリ以下のhtmlファイルなどをnginxのドキュメントルート以下にマウントしています。
nginxのデフォルトルートのままだと、index.htmlがすでに存在していてシンプルにマウント出来なかったので、あえて別ディレクトリをドキュメントルートに設定しています。

### 3-2. ssl.conf

```conf
ssl_certificate     /etc/nginx/ssl/example.com.pem;     # SSL証明書
ssl_certificate_key /etc/nginx/ssl/example.com-key.pem; # 秘密鍵
```

特に解説することもないですが、上記でdockerにマウントした証明書や鍵を読み込んでいます。

## 4. まとめ

mkcertを使うことでとても簡易にSSL環境が構築できると思います。
dockerで出来るというのも環境を汚さなくて良いですね。

良いWEBライフを！
SDファイルに分子名を入力

#分子名が表示されない原因
SDファイルの先頭行が空行となっているSDファイルをGUI（MaestroやMOE等）で読み込むと、分子名が表示されない。

```
[空行] ←これが原因
  SciTegic08072009022D

  6  6  0  0  0  0            999 V2000
    6.2278   -6.1276    0.0000 C   0  0
    8.2701   -6.1271    0.0000 C   0  0
    7.2509   -5.5373    0.0000 C   0  0
    8.2701   -7.3085    0.0000 C   0  0
    6.2278   -7.3138    0.0000 C   0  0
    7.2534   -7.8981    0.0000 C   0  0
  6  4  1  0
  5  6  2  0
  2  3  1  0
  1  5  1  0
  4  2  2  0
  3  1  2  0
M  END
> <ID>
1

> <data>
benzene

$$$$

```

#PPを用いた解決法
「data」プロパティに分子名が入力されていることを想定した対応。
**1. PilotScriptで代入**
PilotScriptでdataプロパティをNameプロパティに代入する。
Name := data
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335742/8b6ec80d-d277-e4f1-3ad5-697aa4ef10a5.png)

**2.SD WriterのAdditional Optionsで設定**
Additional Options>Nameにdataを指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335742/caab4f65-def6-7701-06e8-d72162d7cda9.png)

#※SDファイル参考資料
https://funatsu-lab.github.io/open-course-ware/molecular-design/file-format#molsdf
コマンド操作でスペースを含むPathを動かす方法

無駄にはまってしまったので自分へのメモ
[Program Files]とかの事例

解決法は最下部の事例

# コマンドでスペースを含むPathの指定をしたい
試した事
 1. だめもとで普通にパスを指定してみる
 2. Pathをダブルコーテで囲ってみる
 3. コマンドすべてをダブルコーテで囲ってみる
 4. フォルダ名毎にダブルコーテで囲ってみる


### だめもとで普通にパスを指定してみる

```
C:\>cmd.exe /k C:\xampp\mysql space\bin\mysqldump ~~~~
'C:\xampp\mysql' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

ディレクトリPathをスペースで分割されて
意図したディレクトリを参照してくれない。

### Pathをダブルコーテで囲ってみる
cmd.exe /k "C:\xampp\mysql space\bin\mysqldump"

```
C:\>cmd.exe /k "C:\xampp\mysql space\bin\mysqldump" ~~~~
'C:\xampp\mysql' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

ググッそう書いてあるのになぜ・・？
※上記のパターンで動く人もいます。駄目元試してみてください。

### コマンドすべてをダブルコーテで囲ってみる


```
C:\>"cmd.exe /k C:\xampp\mysql space\bin\mysqldump"
ファイル名、ディレクトリ名、またはボリューム　ラベルの構文が間違っています。
```

ですよね・・

### フォルダ名毎にダブルコーテで囲ってみる


```
C:\>cmd.exe /k C:\"xampp"\"mysql space"\"bin"\"mysqldump"
```
これでうまくいきました！
Andorid Native + Flutterのビルドに便利なDocker Imageを作る

Androidアプリのビルドによう使うツールをインストールしたDocker Imageの作り方を説明する(Android SDK, Flutter SDK, GCloud, Bundler, Firebase tools)。
Dockerを使ったことはあるが、実用的なDocker Imageを作ったことはない人向けの説明。

## Docker Imageを作る手順
### 1. Dockerfileを記述する

```Dockerfile:Dockerfile
# BaseはCircle CIのものにする。android sdk, gcloudが既に入っているので楽。
FROM circleci/android:api-29-node

# Install firebase tools
RUN sudo curl -sL https://firebase.tools | bash

# Install tools for easylauncher
RUN sudo apt-get update && sudo apt-get install -y fontconfig ttf-dejavu

# Install Flutter SDK
# ほぼ以下のファイルのコピペ。flutter_verisonの初期化とprecacheの部分は独自。
# https://github.com/cirruslabs/docker-images-flutter/blob/master/sdk/Dockerfile
ARG flutter_version=1.20.1

ENV FLUTTER_HOME=${HOME}/sdks/flutter \
    FLUTTER_VERSION=$flutter_version
ENV FLUTTER_ROOT=$FLUTTER_HOME

ENV PATH ${PATH}:${FLUTTER_HOME}/bin:${FLUTTER_HOME}/bin/cache/dart-sdk/bin

RUN git clone --branch ${FLUTTER_VERSION} https://github.com/flutter/flutter.git ${FLUTTER_HOME}

RUN flutter precache

RUN yes | flutter doctor --android-licenses && flutter doctor
```

### 2. Docker Imageをビルドする
上記のDockerfileと同じディレクトリで以下のコマンドを実行する。

```
docker build -t kamikazezirou/android:1.0 .
```

「kamikazezirou/android」の部分はImage名。
「:1.0」は、ImageのTag。
適宜変更すること。

### 3. Docker ImageをDocker Hubにpushする

```
docker push kamikazezirou/android:1.0
```

※docker loginでDocker Hubにログインしておくこと。アカウントも必要。


### 4. CIから使う(Cirlce CIでの例)

```yml
jobs:
  build:
    working_directory: ~/code
    docker:
      - image: kamikazezirou/android:1.0
...
```

### 補足
Dockerfileを編集してGitHubにpushするだけで、Docker HubにImageをビルドさせることも可能。

1. GitHubのリポジトリを作り、Dockerfileをトップに置く
2. DockerHubリポジトリを作る際、リポジトリ名をGitHubのリポジトリ名と同じにして、「Build Setting」でGitHubにConnectする

## 背景

仕事で開発しているアプリで、Android Native onlyのアプリにFlutterモジュールを組み込むことになった。
仕事のAndroidアプリ開発ではCirlce CIを使っているが、その設定をしていて、ビルドツール全部入りのDocker Imageが必要になった。

CIのワークフローはは、デバッグapkのビルド -> Firebase Test Lab実行 -> リリースビルドというような流れにしている。最初は、ビルドのDocker Imageには「cirrusci/flutter:1.17.5」を使い、Firebase Test Labの実行のDocker Imageには「circleci/android:api-28-node」を使う、といった形にしようとした(前者はFlutter SDK有り かつ GCloudなし。後者はFlutter SDKなし かつ GCloudあり)。

この方式だと2つ問題があった。

1. 依存ライブラリのキャッシュの復元時にエラーが発生した(2つのDocker Imageのhomeディレクトリが違うことが原因)
2. この2つのDocker Imageに含まれないビルドツールがあり、それらを毎回インストールする必要があった(→ビルド時間が遅くなる、ビルドスクリプトが雑然とする)

この2つの問題を解決するために、ビルドツール全部入りのDocker Imageを作ろうと思い立った。
1つのDocker Imageであればhomeディレクトリは常に同じであり、ビルドツールのインストール処理も不要。

## 参考：作ったDocker Image
https://hub.docker.com/repository/docker/kamikazezirou/android
module 'tensorflow' has no attribute '〇〇'　の対処法

<img width="103" alt="スクリーンショット 2020-08-08 2.22.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/c9fb603e-f0ea-0fda-3ca0-0546a87a238e.png">

TensorFlowのバージョンの問題なことが多いです。
TensorFlowはバージョンアップが頻繁で、
**バージョンアップでattributeの名前も変わったりしています。**
**必要なバージョンをドキュメントで調べてインストールしましょう。**

```shell
pip uninstall -y tensorflow
pip install tensorflow==1.14 //必要なversion 
```

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[MLBoysチャンネル]
(https://www.youtube.com/channel/UCbHff-wfjTnB3rtXIP6y0xg)
[Medium](https://medium.com/@rockyshikoku)

[相棒](https://twitter.com/oka_yuuji)
[note](https://note.com/oka_yuuji)
Discord の投稿を翻訳して返すBot

# 概要

　Discord 上で発言を翻訳して返してくれるBotを書いてみたので共有します。サンプルコード的で平易なつくりです。似たような事をされたい方は、スニペットとしてご自由にご引用ください。

* リポジトリ: https://github.com/coleyon/disco-bilingual

# しくみ

　python で書いており、[discord.py](https://discordpy.readthedocs.io/ja/latest/) を利用しています。Dockerコンテナとしてデプロイできる構成にもしています。発言内容は Google の Cloud Translation API で翻訳されます。APIは [google-cloud-translate](https://pypi.org/project/google-cloud-translate/) を用いて利用されます。

　Cloud Translation API は GCP 内の一サービスであり、試用期間内であれば無料ですが、一定量または期間経過後の利用が有料になる点にご注意ください。本サンプルは、ある程度統制や管理が必要なケースにも応用・転用できるよう、はじめから有償契約環境を使う前提で書いてます。無償を前提にしたつくりにされたい場合は [Google Translate Ajax API](https://translate.google.com/) を [googletrans](https://pypi.org/project/googletrans/) を介して利用する手段もあります。

# どうなるの

こうなります。構文はリポジトリの readme をご覧ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157638/21ca3d7f-3b26-b57f-8163-fd7ad29ffb8e.png)


# クイックスタート

[readme.md](https://github.com/coleyon/disco-bilingual/blob/master/README.md) に書いてしまっているので、書いてないDockerコンテナの起動の仕方を記述します。

```bash
$ git clone https://github.com/coleyon/disco-bilingual
$ cd disco-bilingual
### ここで、サービスアカウントJSON形式のキーファイルをコピーして `./sa-key.json` に配置し
### `docker-compose.yml` の `GOOGLE_APPLICATION_CREDENTIALS` や `DISCORD_BOT_TOKEN` をセットする。
$ docker-compose build
$ docker-compose up -d
```

# 小話

　[Discord](https://discord.com/) が[資金調達](https://jp.techcrunch.com/2020/07/14/2020-06-30-discord-now-has-a-3-5b-valuation-and-100m-for-a-sales-pitch-lighter-on-the-gaming/)をして、ゲーマー向けからより広いユーザー向けに成長しようとしています。また、今更な話題ですがチャットのリモートワーク利用が増えてきました。こういった流れを受けて、DiscordはBotの安全性を高めるために、[このような規約や仕組みの強化を通知](https://note.com/discord_pro/n/nd4ce3db61044)しました。

　これからBotを開発される方、広く展開される方は、開発者向けの規約に目を通されるとよいと思います。

# 良かった情報源

DiscordのBotを書くときに、参考になる度が高かった記事を紹介します。

* [情報量と実例が多い2本立ての記事](https://qiita.com/sizumita/items/9d44ae7d1ce007391699)
* [discord.py のdocs](https://discordpy.readthedocs.io/ja/latest/#)
* [Discord DEVELOPER PORTAL](https://discord.com/developers/docs/intro)
node.js x express.js x mysql x TablePlusでCRUD処理

#node.jsで基本のCURDをしてみた
参考にしたサイト
https://reffect.co.jp/node-js/express-js-connect-mysql#MySQL-3
こちらのサイトがとても解説が丁寧でわかりやすかった。

##作成結果
![ezgif.com-resize.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/77ce0f01-bfd1-3fe3-3302-3dca03fefa6e.gif)

![スクリーンショット 2020-08-08 1.55.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/5a126ffc-de84-f5ef-ce05-86f9229ef231.png)


実装方法は上記記事を参照
やってみて分かったことは感想に記述

###【感想】
・node.jsのCRUDはphpと動きが似ている
・mysqlのDBとtableはjsファイル内で記述してサーバーが更新されると自動で作成される。
その後も更新のたびに新しく同じDBとtableを作成しようとしてエラーになるので、一度作ったDBとtableのjsファイル内の記述はコメントオフか削除が必要でした。
・table plusはやはり便利

#TablePlus使い方
参考
https://reffect.co.jp/windows/tableplus-connect-mysql-sqlite


初期設定のパスワードやuserはmysqlのことなので、自分のユーザー名やパスワードではなく、
user:root（mysqlの場合）
パスワード:なし（mysqlの場合）
記述の保存は基本comand + s
基本クリックして登録、更新、削除をする
Data:データの登録、更新、削除
Structure: VARCHARやIDなどの編集
VisualforceでQRコード作成してみた その２

![QR.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394418/3470809a-56fa-250b-b133-a2d866ff1881.gif)
↑のGifは見づらいと思うので、[こちら](https://twitter.com/adevofacompany/status/1291778347362484224?s=20)で動画を公開しています。

今回は、前回の記事[VisualforceでQRコード作成してみた](https://qiita.com/bigyoujdb/items/2f6dbf5216f3267136f9)の続編です。

取引先責任者の画面でボタンクリックで、表示されているレコードの添付ファイルに保存しております。

取引先責任者の関連リストに表示するために、↑のGifでは画面リロードを行っています。

処理の手順としては
1.JavaScriptでQRコード作成
2.QRコードのバイナリデータをApexに渡す
3.ApexでContentDocument作成
となっております。

そのうちソースコードも公開すると思います。

# 使用事例
　作ってみたはいいものの、良い使用事例が思い浮かびませんでした。
というのも、例えば「イベントの出席確認用のQRコードを作成するためには、出席者すべてのレコードページでボタンクリックをしなければならず実用的ではないと思ったからです。ただし、LWCの[Scan Barcodes](https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.use_barcodescanner)と合わせて、Salesforceのみで実装を完結できるところに将来性を感じるような気がします。
　良い使用事例が思いついた方は、コメント等頂けると幸いです。

# まとめ
　他サービスと連携しなくても、Slaesforceだけで様々なことが出来るようになっていますね。次はLWCのScan Barcodesか上記の課題であるQRコード添付ファイルの一括作成に取り組んでみようかなと思います。
ゲームパッドなどの十字キーでASCIIで文字入力

## 概要

ゲームパッドなどの十字キーでASCIIで文字入力する仕様とその実装。D-pad ASCII Input。

![dpad_ascii_input.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136875/ccc12020-2f1d-773e-0550-a851b58370a8.gif)

## 動機、目的、特徴

* 入力キーが少ないデバイスで入力できる
* ASCIIの英数字記号を全て入力できる
* 仕様がシンプル
* 実装がシンプル
* 実用的な速度で入力できる
* 画面を見なくても入力できる
* 画面を見れば覚えていなくても入力できる
* 入力仕様に規則性があり習得しやすい

## 仕様

* 十字キーを4回入力し、各2bitを合わせて1Byteにし、それをASCIIの文字コードとして文字入力する
* ↑、←、→、↓がそれぞれ0、1、2、3になる
* そのキーを押した場合の残り候補となる文字群が画面に表示される
* 入力途中のbitが存在する場合、Backspaceで2ビットずつ取り消せる

## 例

* Hello World

| 文字 | 入力 |
|---|---|
| H | ←↑→↑ |
| e | ←→←← |
| l | ←→↓↑ |
| l | ←→↓↑ |
| o | ←→↓↓ |
| Space | ↑→↑↑ |
| W | ←←←↓ |
| o | ←→↓↓ |
| r | ←↓↑→ |
| l | ←→↓↑ |
| d | ←→←↑ |

## 動作するサンプル

Web上で動作するサンプル。（Windows、Chrome84、Firefox79、XBox360 Controllerで動作確認）
キーボードでは矢印キーが十字キーに対応、BackspaceキーがBackspaceに対応する。
Gamepad APIによるゲームパッドにも対応。
0軸、1軸、12～15ボタンが十字キーに対応、0ボタンがBackspaceに対応する。
WPM、CPMを計測できる。

* https://htsnul.github.io/dpad_ascii_input/

## 入力の工夫

以下のように入力すると速く入力できる。

| 文字 | 入力 | 工夫した入力 |
| --- | --- | --- |
| a | ←→↑← | ←→↗↑↖ |
| b | ←→↑→ | ←→↑↗ |
| t | ←↓←↑ | ←↓↙←↖ |
| x | ←↓→↑ | ←↙↓↘→↗ |

## どれだけの速度が出るか？

30分の練習を3回に分けて行ったところ、
およそ15WPMまで出るようになった。（所々詰まったり間違えたりする状態）
一般的な平均タイピング速度は、38～40WPMとのこと。

なので、最終的には、一般的な平均タイピングの半分程度の性能が出ることが予想される。

## 一覧

| 入力 | 分類 |
|---|---|
| Tab | ↑↑→← |
| Enter | ↑↑→→ |
| Space | ↑→↑↑ |
| ! | ↑→↑← |
| " | ↑→↑→ |
| # | ↑→↑↓ |
| $ | ↑→←↑ |
| % | ↑→←← |
| & | ↑→←← |
| ' | ↑→←↓ |
| ( | ↑→→↑ |
| ) | ↑→→← |
| * | ↑→→→ |
| + | ↑→→↓ |
| , | ↑→↓↑ |
| - | ↑→↓← |
| . | ↑→↓→ |
| / | ↑→↓↓ |
| 0 | ↑↓↑↑ |
| 1 | ↑↓↑← |
| 2 | ↑↓↑→ |
| 3 | ↑↓↑↓ |
| 4 | ↑↓←↑ |
| 5 | ↑↓←← |
| 6 | ↑↓←→ |
| 7 | ↑↓←↓ |
| 8 | ↑↓→↑ |
| 9 | ↑↓→← |
| : | ↑↓→→ |
| ; | ↑↓→↓ |
| < | ↑↓↓↑ |
| = | ↑↓↓← |
| > | ↑↓↓→ |
| ? | ↑↓↓↓ |
| @ | ←↑↑↑ |
| A | ←↑↑← |
| B | ←↑↑→ |
| C | ←↑↑↓ |
| D | ←↑←↑ |
| E | ←↑←← |
| F | ←↑←→ |
| G | ←↑←↓ |
| H | ←↑→↑ |
| I | ←↑→← |
| J | ←↑→→ |
| K | ←↑→↓ |
| L | ←↑↓↑ |
| M | ←↑↓← |
| N | ←↑↓→ |
| O | ←↑↓↓ |
| P | ←←↑↑ |
| Q | ←←↑← |
| R | ←←↑→ |
| S | ←←↑↓ |
| T | ←←←↑ |
| U | ←←←← |
| V | ←←←→ |
| W | ←←←↓ |
| X | ←←→↑ |
| Y | ←←→← |
| Z | ←←→→ |
| [ | ←←→↓ |
| \ | ←←↓↑ |
| ] | ←←↓← |
| ^ | ←←↓→ |
| _ | ←←↓↓ |
| ` | ←→↑↑ |
| a | ←→↑← |
| b | ←→↑→ |
| c | ←→↑↓ |
| d | ←→←↑ |
| e | ←→←← |
| f | ←→←→ |
| g | ←→←↓ |
| h | ←→→↑ |
| i | ←→→← |
| j | ←→→→ |
| k | ←→→↓ |
| l | ←→↓↑ |
| m | ←→↓← |
| n | ←→↓→ |
| o | ←→↓↓ |
| p | ←↓↑↑ |
| q | ←↓↑← |
| r | ←↓↑→ |
| s | ←↓↑↓ |
| t | ←↓←↑ |
| u | ←↓←← |
| v | ←↓←→ |
| w | ←↓←↓ |
| x | ←↓→↑ |
| y | ←↓→← |
| z | ←↓→→ |
| { | ←↓→↓ |
| Vertical bar | ←↓↓↑ |
| } | ←↓↓← |
| ^ | ←↓↓→ |
【GoネットワークプログラムでIPv6対応させる】自分のグローバルアドレスを知る方法


# 理由
ネットワークプログラムで、自身のグローバルIPアドレスを知る必要がある場合がある。その場合のコード例をメモしておく


# 参考コード

```golang:main.go
package main

import (
	"fmt"
	"github.com/skubota/extip"
)

func main() {
	addr,err := extip.GetIP()
	if err != nil {
		fmt.Errorf("Address cannot get : %s\n", err)
	}else{
		fmt.Printf("Adress : %s\n",addr) 
	}
}
```

- 結果(IPv6/IPv4対応クライアント)

```
Adress : 2xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
```

- 結果(IPv4のみ対応クライアント)

```
Adress : 2xx.xxx.xxx.xxx
```


## 解説
標準パッケージではないが、「skubota/extip」というIPv6対応のSTUNで通信のあったソースIPアドレスを知ることができます。

# アンチパターン
あまり、これがアンチパターンだというものはないかと思いますが、IPv4のみの返答しかできないHTTPサーバやDNSサーバを使ったライブラリやコードがあるので注意が必要です。

# まとめ
IPv6対応のパッケージ・コードとなっているか確認しよう
【GoネットワークプログラムでIPv6対応させる】アドレス＋ポート組み合わせの作り方


# 理由
「IPアドレス：ポート番号」の文字列はいろいろな箇所で意味を持った使われ方をするので、よく利用する記法ではあるが、
Goで書かれたネットワークプログラムをIPv6に対応させるためには少し考慮する必要がある。その場合のコード例をメモしておく


# 参考コード
 - https://play.golang.org/p/4e5y1PHj9co

```golang:main.go
package main

import (
	"fmt"
	"net"
)

func main() {
	// 対象のアドレスをスライスに入れる
	addrs := []string{"2001:db8::1", "192.168.0.1", "2001:db8:0:0:1:0:0:1", "::1", "2001:db8:aaaa:bbbb:cccc:dddd:eeee:AaAa", "2001:db8::aaaa:0:0:1", "::192.0.2.1"}

	// スライスを１つづつチェック
	for i, v := range addrs {
		// 例として:80を付加していく
		ip := net.ParseIP(v)
		fmt.Printf("%d: %s = %s\n", i, v, net.JoinHostPort(ip.String(), "80"))
	}
}
```

- 結果

```
0: 2001:db8::1 = [2001:db8::1]:80
1: 192.168.0.1 = 192.168.0.1:80
2: 2001:db8:0:0:1:0:0:1 = [2001:db8::1:0:0:1]:80
3: ::1 = [::1]:80
4: 2001:db8:aaaa:bbbb:cccc:dddd:eeee:AaAa = [2001:db8:aaaa:bbbb:cccc:dddd:eeee:aaaa]:80
5: 2001:db8::aaaa:0:0:1 = [2001:db8::aaaa:0:0:1]:80
6: ::192.0.2.1 = [::c000:201]:80
```


## 解説
net.JoinHostPortで結合をするだけ
なぜこのような処理にしなければいけないかは、アンチパターンを見てみましょう

# アンチパターン
やってしまいがちなアンチパターンはそのまま文字列処理してしまうこと。
"too many colons in address" と言われちゃいますよ

```golang:main.go
package main

import (
	"fmt"
)

func main() {
	// 対象のアドレスをスライスに入れる
	addrs := []string{"2001:db8::1", "192.168.0.1", "2001:db8:0:0:1:0:0:1", "::1", "2001:db8:aaaa:bbbb:cccc:dddd:eeee:AaAa", "2001:db8::aaaa:0:0:1", "::192.0.2.1"}

	// スライスを１つづつチェック
	for i, v := range addrs {
		// 例として:80を付加していく
		fmt.Printf("%d: %s = %s:%d\n", i, v, v,80)
	}
}
```

結果は以下の通りとなります
 - https://play.golang.org/p/oHWvhw303lF

```
0: 2001:db8::1 = 2001:db8::1:80
1: 192.168.0.1 = 192.168.0.1:80
2: 2001:db8:0:0:1:0:0:1 = 2001:db8:0:0:1:0:0:1:80
3: ::1 = ::1:80
4: 2001:db8:aaaa:bbbb:cccc:dddd:eeee:AaAa = 2001:db8:aaaa:bbbb:cccc:dddd:eeee:AaAa:80
5: 2001:db8::aaaa:0:0:1 = 2001:db8::aaaa:0:0:1:80
6: ::192.0.2.1 = ::192.0.2.1:80
```
IPv6アドレスの場合のアドレスリテラル表記で処理しないことが問題となります

# まとめ
IPv6アドレスをそのまま文字列結合するのはNG。