OmniAICreator/Qiita-1.07M huggingface dataset:
ハッシュテーブル(HashSet, HashMap)の実装

## 概要
ハッシュテーブル（hash table）とは、キーを持つデータの集合に対して要素の追加や検索を効率的に行うためのデータ構造の一種です。その実体は一定数の要素を格納できる配列と、データが格納される配列の位置を出力するハッシュ関数から構成されています。本記事では単純なハッシュ関数を用いてHashSetとHashMapを実装する手法を紹介します。

<img width="317" alt="Screen Shot 2019-10-14 at 11.14.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122091/515190fe-a0ae-963e-51aa-947ca6ea52c4.png">


## 実装例
### HashSet
```python
class MyHashSet(object):
    def __init__(self):
        # データを格納する配列を用意する
        self.hashset = [None] * 10000

    # keyを10000で割った剰余を配列の添え字として返すハッシュ関数
    def hash(self, key):
        return key % 10000

    def add(self, key):
        if self.contains(key):
            return
        idx = self.hash(key)
        if self.hashset[idx] is None:
            # 同じ位置に別のデータが保存される可能性があるため、配列として格納しておく
            self.hashset[idx] = [key]
        else:
            # すでに同じ位置に別のキーが格納されている場合、末尾に追加する
            self.hashset[idx].append(key)

    def remove(self, key):
        if not self.contains(key):
            return        
        idx = self.hash(key)
        if self.hashset[idx] is not None:
            arr = self.hashset[idx]
            del arr[arr.index(key)]

    def contains(self, key):
        idx = self.hash(key)
        if self.hashset[idx] is None:
            return None
        else:
            arr = self.hashset[idx]
            return any(val == key for val in arr)
```
### HashMap
```python
class MyHashMap(object):
    def __init__(self):
        self.hashmap = [None] * 10000

    def hash(self, key):
        return key % 10000

    # key, valueをタプルとして保存する
    def put(self, key, value):
        idx = self.hash(key)
        if self.hashmap[idx] is None:
            self.hashmap[idx] = [(key, value)]
        else:
            arr = self.hashmap[idx]
            for i in range(len(arr)):
                pair = arr[i]
                if pair[0] == key:
                    del arr[i]
                    break
            arr.append((key, value))

    # keyに対応するvalueを返す。見つからなければ-1を返す
    def get(self, key):
        idx = self.hash(key)
        if self.hashmap[idx] is None:
            return -1
        else:
            arr = self.hashmap[idx]
            for pair in arr:
                if pair[0] == key:
                    return pair[1]
            return -1

    def remove(self, key):
        if not self.contains(key):
            return

        idx = self.hash(key)
        arr = self.hashmap[idx]
        for i in range(len(arr)):
            pair = arr[i]
            if pair[0] == key:
                del arr[i]
                break

    def contains(self, key):
        idx = self.hash(key)
        if self.hashmap[idx] is None:
            return None
        else:
            arr = self.hashmap[idx]
            for pair in arr:
                if pair[0] == key:
                    return True
            return False
```

## 補足
格納される要素の数が配列のサイズを超えると衝突が起きるため、チェイン法やオープンアドレス法等により衝突を回避する必要があります。チェイン法では配列の要素をLinkedListで管理することで衝突を回避しますが、本記事では簡略化のため配列の配列という形でハッシュテーブルを実装しています。

## 参考
https://ja.wikipedia.org/wiki/ハッシュテーブル
仙台CTF2017 [For02] 不審USBメモリ 100

#問題

http://sendaictf.ddns.net/2017/challenges

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/213b72f2-82cc-4f32-d089-6ab84f8f4fd5.png)

#解いてみた

問題のファイルを解凍するとsetupapi.logとレジストリのsystemが入ってました。
setupapi.logとは初めてUSBを接続したときにドライバインストールとかのログが残るログファイルです。

問題文で正規のUSBのシリアル番号は分かっているので、それでsetupapi.logを検索してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/1f63fd9d-1aaf-5c7d-c1a7-de7ef28bfe64.png)

これと同じような別のシリアル番号のUSBがあるはずなので、それを検索してみます。
「デバイス インストールは正しく終了」でgrepしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/2a9ddb55-e638-5db8-2d0e-ad9b85650842.png)

答えがありました。
GPSカー その17

#概要

GPSで自動走行する、コンテストがある。
実機を作ってみた。
プログラムを検討する。

#目標の設定

static const double Lat0 = 37.913867, Lon0 = 140.143194;
static const double Lat1 = 37.913888, Lon1 = 140.143312;
static const double Lat2 = 37.913867, Lon2 = 140.143314;
static const double Lat3 = 37.913888, Lon3 = 140.143076;
static const double Lat4 = 37.913867, Lon4 = 140.143074;

#写真


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/262b5755-1c1b-4fdc-db96-bf532527a6c9.png)

#考察

中心から端まで、10.6ｍ
左端間、2.3ｍ　この間隔、狭いと思う。倍の4mを使おう。




以上。
vimのlua有効化

## vimにneocompleteを導入しようと思った
この記事を参考にいくつかのNeoBundleを導入していた
<a href="https://qiita.com/ahiruman5/items/4f3c845500c172a02935#-neocompleteneosnippetneosnippet-snippetsコードの自動補完">【詳解】モテたいVimmer必見　快適にコーディングするためのvimrc解説</a>

>neocompleteプラグインはVimのlua機能によって動作しています。
lua機能が有効になっていないと使えないVimプラグインになります。

と、書かれていて自分のvimを確認したらluaが有効化されていなかった。
有効化する方法を2、3時間ほど探して見つかったのがvimを再インストールする程度、、、

###結論から言うと、OSがHighSierraでXcodeも9.xのままだったことが原因だと思われる。

HighSierraで問題なく使えていて、Xcodeも使う機会がなくアップデートしていなかったのだ。
luaのことは諦めてOSをMojaveに、Xcodeも11.1にアップデートしたら勝手にluaが有効化されていて解決した。。。
再利用のための名前空間設計

#はじめに#
オブジェクト指向設計の目的の一つとして再利用性が挙げられますが、実際のところなかなか上手くいかないですよね。
上手くいかない原因は色々あるかと思いますが、本記事では名前空間設計をテーマに、再利用性を高めるための方法について考えていきたいと思います。
＃私はWindowsに囲われた悲しきSIerなので、用語は.Net Frameworkに準拠します。ご了承ください。
＃本記事の内容は私個人の経験則です。有用な文献等ありましたら、コメントでご指摘頂けると助かります。

#名前空間とは#
名前空間とはクラスなどのプログラム部品を整理、分類するものです。
NameSpace、パッケージ、スキーマなど色々な呼び方があります。
フォルダでソースコードファイルを物理的に分類することとは違い、**空間**を分けることで、本来はブログラム内に共存できない同じ名前のクラスが共存できるようになります。

#名前空間設計のガイドラインってあるの？#
色々ググってみたのですが、コレといって設計のガイドラインは見当たりませんでした。
名前の付け方についてはMicrosoftが下記のガイドラインを掲げています。
[名前空間の名前｜Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/standard/design-guidelines/names-of-namespaces)
実態としては、会社ごとのコーディング規約で定義されるか、または設計者 or 開発者のセンスに任されているというところかと思います。

#再利用を困難にする名前空間設計#
名前空間設計でよく見かけるのが、クラスの種類ごとに分ける形です。
例えば、Interfaceクラス、UIクラス、Domainクラスのような塊で名前空間を付ける形。
あるいは、MVCモデルでViewクラス、Controlerクラス、Modelクラスの塊で名前空間を付ける形。
これらの形は再利用性が悪いので、避けたほうがいいと考えています。

下記のケースで考えてみましょう。
ソフト内に２つの機能A、Bがあり、それぞれのMVC要素ごとに名前空間を付けている、とします。
![Sample1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506949/72471d3f-6f6e-73fd-ea44-d4eb1c4e9919.png)


ここから機能Aを再利用するため、ライブラリとして分離したくなったとします。
必要なのはViewAクラス、ControllerAクラス、ModelAクラスですが、それぞれ名前空間内で機能Bとくっついているため、分離できなくなっています。
もちろん内部設計を丁寧に追って機能Aと機能Bに依存関係が無いことを確認すれば分離可能ですが、機能が多ければ確認も大変でコストのかかる作業になってしまいます。
再利用はなによりもコスト削減が目的なので、名前空間単位で概観して分離可能と分かるようになっているべきです。

#再利用のための名前空間設計#
ではどのような名前空間設計が良いのか？
（すでに多くの人が辿り着いているでしょうが）**機能の塊で名前空間を付ける形が良い**と考えています。
先ほどのケースを機能ごとの名前空間に変えてみました。
![Sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506949/1a91cd07-5aac-6252-e3b5-a94d68f21e22.png)

機能Aと機能Bに依存関係が無く、分離可能だと一目で分かりますね。:grinning:
クラスにAやBといった修飾子を付ける必要もないので、読みやすくもなっています。

#再利用の敵#
さて、名前空間を機能ごとに分けたとしても、再利用には別の敵が立ちはだかります。
###グローバル変数###
悪名高きグローバル変数です。ちなみに、グローバル変数と同じ位置づけのSingletonクラスも同様です。
再利用したクラスがグローバル変数を参照していた場合、再利用先のソフトでわざわざグローバル変数を用意してあげなければならない、なんてことになってしまいます。
また、グローバル変数が嫌われる最大の理由は、どこで誰が状態を変更したか分かりづらいことにあります。
先ほどの例で機能Aと機能Bが同じグローバル変数を参照していたら、どうなるでしょう？
もしかしたら、機能Bがグローバル変数に何かを設定しないと機能Aが正しく動かないかもしれません。
そんなリスクを回避するためにも、グローバル変数は敵として排除しておきましょう。

###神クラス###
無計画に機能が追加され、なんでも出来るように膨張してしまったクラスを神クラスと呼びます。
多機能である代わりに、多くのデータを設定しないと動かないという特徴があります。
再利用したクラスが神クラスを参照していた場合、再利用クラス自身には必要のないデータを、神クラスのためにわざわざ設定してあげる、なんてことになります。
これは無駄ですね。役に立つはずの再利用クラスが、逆に再利用先に迷惑をかけてしまいます。
神クラスは排除し、名前空間では必要最小限のデータのみ持つようにしましょう。

#パッケージ図を描こう#
※名前空間図よりパッケージ図の方が一般的なので、ここだけパッケージと表記します。
パッケージ図を描くことで、システムの全体像が見通しやすくなり、依存関係が一目で分かるようになります。
勢いで設計していると見落としがちなパッケージ間の相互依存や、責務の偏りなどにも気づくことができます。
また、再利用のみならず、長期的な保守性、拡張性の向上にも役立ちます。
![クラス図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506949/7d194840-45d8-d64e-f71f-ef728ce3b84a.png)


#まとめ#
・名前空間は機能ごとに分割することで再利用しやすくなる
・グローバル変数、神クラスは再利用の敵、排除すべし
「クラス設計は勘とセンスやで！」という方も、ちょっと立ち止まって、名前空間設計を意識してみては如何でしょうか？

お読み頂き、ありがとうございました！
[Oracle Cloud] テナント上のリソース一覧をテキストで出力してみる

# やったこと

テナント上のリソース一覧をテキスト形式で出力してみた。
作成されてるリソースの一覧が欲しい、エビデンス用途、OCIDの一覧が欲しいとか、そういった用途に。

# 参考にしたもの
[Oracle Cloud Infrastructure Documentation - Querying Resources](https://docs.cloud.oracle.com/iaas/Content/Search/Tasks/queryingresources.htm)
[Oracle Cloud Infrastructure Documentation - Sample Queries](https://docs.cloud.oracle.com/iaas/Content/Search/Concepts/samplequeries.htm)


# 準備
## oci cliの導入
[Oracle Cloud 用の oci cli を導入](https://qiita.com/sugimount/items/63a8cfe1163030ae8804)を参考にoci cliを導入

## jqの導入
```
# yum install -y jq
```
# 内容
## コマンドライン
以下のコマンドを実行すると、すべてのリソースをJSON形式で出力できる。(出力される範囲は、実行しているアカウントの権限による)

```
# oci search resource structured-search --query-text 'query all resources'
…
      },
      {
        "availability-domain": null,
        "compartment-id": "xxxxxxxxxxxxxx",
        "defined-tags": {},
        "display-name": "xxxxxxxxxxxxxx",
        "freeform-tags": {},
        "identifier": "xxxxxxxxxxxxxx",
        "lifecycle-state": "ACTIVE",
        "resource-type": "User",
        "search-context": null,
        "time-created": "2019-04-15T11:05:46.555000+00:00"
      }
    ]
  }
}

```

コンパートメント単位で出力したい場合は、where句で絞ることもできる

```
# COMPARTMENT_ID="コンパートメントのOCID"
# oci search resource structured-search --query-text 'query all resources where compartmentId = "'"${COMPARTMENT_ID}"'"'
```

JSON形式だと見づらいので、以下項目を抽出してCSV形式で出力してみる。( jqの使い方はいまいちわかっていない )

* "compartment-id"
* "resource-type"
* "display-name"
* "lifecycle-state"
* "identifier"
* "time-created"

```
#  oci search resource structured-search --query-text 'query all resources' |jq -r '."data"."items"' |jq -r '["compartment-id","resource-type","display-name","lifecycle-state","identifier","time-created"],(. [] |[."compartment-id",."resource-type",."display-name",."lifecycle-state",."identifier",."time-created"]) |@csv' |sort -t , -k 1,2
…
"ocid1.tenancy.oc1..xxxxxxxxxx","User","xxxxxxxxxx","ACTIVE","ocid1.user.oc1..xxxxxxxxxx","2019-09-25T02:38:23.891000+00:00"
"ocid1.tenancy.oc1..xxxxxxxxxx","Vcn","xxxxxxxxxx","AVAILABLE","ocid1.vcn.oc1.xxxxxxxxxx","2019-06-24T12:25:38.400000+00:00"

```
このクエリだけでは、リソースの詳細は出力できないので、詳細も出力したい場合は、リソースごとにoci xxx list コマンドも実行しないといけない


## コンソール (おまけ)
このクエリ、コンソールからも実行できる。

>In the Console, if you are not already there, append "/a/query" to the end of your base Console URL. For example, https://console.us-ashburn-1.oraclecloud.com/a/query.

マニュアルにあるとおり、コンソールURLの最後に/a/queryを入力すると以下の画面に遷移する。ドロップダウンリストからサンプルクエリを表示させて、修正して実行することができる。

![query.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/c2bf50a9-2cb1-ebfe-ca01-732d6db5583e.png)

コンパートメント単位でリソース一覧を、コンソールから見たい場合は、コンパートメント・エクスプローラのほうが一覧性があって使いやすいかもしれない

メニュー→[ガバナンス]→[コンパートメント・エクスプローラ]
![query02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/383dabea-e3ff-fac9-f29c-8e583f3ea7d3.png)
Next.js + Apollo でssrできなくてハマった(next.js ver9.1.1)

### 現象
exampleの[with-apollo](https://github.com/zeit/next.js/tree/canary/examples/with-apollo)の実装を真似て作ったのに、なぜかssrするときにgraphqlのapiを叩いてくれない。どうも`getInitialProps`が呼ばれていないみたい。

### 経緯
お、`getDataFromTree`を`_app.tsx`で呼ばなくてもpage componentで呼び出せばいいようになったらしい！？＼(^o^)／
てことは、Automatic Static Optimization対応できるじゃん！って思ってやってみた。(以前は`_app.tsx` でやる必要があったので、apiを叩かないページでもAutomatic Static Optimizationの恩恵がなかった)

### 原因
自分の`_app.tsx`はこのように、functional componentで書いていた。

```tsx
import {ThemeProvider as EmotionThemeProvider} from 'emotion-theming';
import {NextComponentType} from 'next';
import {AppContext, AppProps} from 'next/app';
import * as React from 'react';

import {theme} from 'STYLE/theme';

const App: NextComponentType<AppContext, {}, AppProps> = (props) => {
  const {Component, pageProps} = props;
  return (
    <EmotionThemeProvider theme={theme}>
      <Component {...pageProps} />
    </EmotionThemeProvider>
  );
};

export default App;
```
emotionでラップしてるだけです。
なぜfunctional componentにしたかというと、「これfunctional componentでもかけるんじゃね？」と思ってやってみたからで **あまり深い意味はない**。これで動いてるぽいときは、自己満足に浸っていた。
![そのときのわい](https://media.giphy.com/media/QyKwWQzeOSl9e/source.gif)
しかし、この自己満足が原因だった。

### class componentに変えたら動くようになった
ドキュメントにも他のexampleにもclassコンポーネントの例しかなかったのでclass Componentでやってみるときちんと動きました。

```tsx
import {ThemeProvider as EmotionThemeProvider} from 'emotion-theming';
import App from 'next/app';
import * as React from 'react';

import {theme} from 'STYLE/theme';

export default class MyApp extends App {
  render() {
    const {Component, pageProps} = this.props;
    return (
      <EmotionThemeProvider theme={theme}>
        <Component {...pageProps} />
      </EmotionThemeProvider>
    );
  }
}
```

よくよく考えたら、Appの中でいろいろやってくれてるはずなので勝手にドキュメントと違うことをしてた自分が馬鹿でした。
#docker で #AWS コマンドを実行する ( AWS CLI を使いたい )

# xueshanf/awscli

https://github.com/xueshanf/docker-awscli
https://hub.docker.com/r/xueshanf/awscli

- DockerhubでのDL数 10M超え
- bashが使える ( つまり wait-for-it.sh も使える )

```
$ docker run xueshanf/awscli aws
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help
aws: error: too few arguments
```

# mesosphere/aws-cli


https://hub.docker.com/r/mesosphere/aws-cli/dockerfile

- DockerhubでのDL数 10M超え
- bashが使えず sh しか使えない ( つまり wait-for-it.sh が使えない )
- docker aws cli でGoogle検索したら1位で出てきた
- あんまメンテされてなさそう
- entrypoint が aws コマンドなので aws って打たずに使える

```
$ docker run mesosphere/aws-cli
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help
aws: error: too few arguments
```

# localstack

https://github.com/localstack/localstack
https://hub.docker.com/r/localstack/localstack/

- AWSサーバーをlocalに構築するためのもので、awsコマンド実行用というわけではない
- 管理されてそうで安心感がある (たぶん)
- AWSサーバー起動用のイメージだが aws コマンドも実行できる
- エントリーポイントが AWS サーバー起動なので、これを実行しないようにして aws コマンドを使う必要がある

```
$ docker run --entrypoint= localstack/localstack aws
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help
aws: error: too few arguments
```

# ちなみに wait-for-it.sh とは

dockerおすすめスクリプト。
portを通して 他のコンテナの起動を待ったりできるっぽい。
最低限 bash が必要。


- https://docs.docker.com/compose/startup-order/
- https://github.com/vishnubob/wait-for-it

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2592








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
bashのaliasの簡潔な設定方法

## 目的
毎回alias追加しようとしたときに忘れるので、簡潔に備忘録としてまとめて書く。
個人的にはclipy使うより2文字ぐらいのaliasでパパッと書くほうが早い気がするのでaliasはよく使ってます。

## 設定の流れ
#### 1 . `vi ~/.bashrc`で下記のようにエイリアスを設定して、保存する。

```.sh
# alias <設定したいalias>='<元のコマンド>'
alias dc='docker-compose'
alias ch='git checkout'
alias br='git branch'
```

#### 2 . `vi ~/.bash_profile`実行後、下記のように設定を追加し、保存する。
```.sh
# .bash_profile はターミナル起動時に読み込まれるファイルなので、 .bashrc をここから読み込むように設定しておく
source ~/.bashrc
```
#### 3. `source ~/.bash_profile`実行で`.bashrc`の編集内容を読み込む。
terminalを再起動してもOK

### alias追加時は1, 3のみでOK

以上。
GPSカー その16

#概要

GPSで自動走行する、コンテストがある。
実機を作ってみた。
回路図、書いてみた。

#回路図

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a8757ee6-283b-16d6-80f2-7935b95cd088.png)


#詳細

マイコンは、wemos d1。
モータードライバーは、L298.
GPSは、neo6m.アンテナは、少し大きい。
電池は、コンビニ、アルカリ、6本。
モーターは2個。DCモーター
前進用は、on-offのみ。前進のみ。
操舵用は、右、直進、左の3位置のみ。


以上。
plunkerでassembler-simulator その5

#概要

plunkerでassembler-simulatorやってみた。
練習問題やってみた。

#練習問題

1から98まで、印字せよ。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3c9b8492-7e06-b304-d2f5-3fc6b7f3ae61.png)


#サンプルコード


```
;1-98 print
start:
	MOV 	A, 1
loop:
	CALL	print
	INC 	A
	CMP 	A, 99
	JNZ 	loop
	HLT
print:
	PUSH	A
	MOV		B, A
	CMP		A, 10
	JNC		jmp2
lop1:	
	ADD		A, 48
	MOV		C, 49
	MOV		[254], A
	MOV		[255], C
	MOV		D, 32
	MOV		[254], D
	MOV		[255], C
	jmp		pre1
jmp2:
	DIV		10	
	MOV		D, A
	ADD		D, 48
	MOV		C, 49
	MOV		[254], D
	MOV		[255], C
	MUL		10
	MOV		C, A
	MOV		A, B
	SUB		A, C
	JMP		lop1
pre1:	
	POP		A
	RET
```

以上。
asp.net core 3.0 でメールを送ってみる

#MailKit
SmtpClient Classは使えなくなっている

MailKit(https://github.com/jstedfast/MailKit)を使えばいいらしいんだが、検索してみると
ここがヒット
https://showylee.qrunch.io/entries/7fMcZM53WUZFTTvd
ここのサンプルコードでほぼほぼ動作する
あ、私がコピペした段階では多少問題ありでしたが
少し手を入れました

'''

    public interface IMailSendLogic
    {
        void SendMailAsync(string to, string from, string subject, string text);
    }

    public class MailSendLogic : IMailSendLogic
    {
        private string SmtpHost = "";
        private int SmtpPort = 587;
        private string User = "";
        private string Pass = "";
        public async void SendMailAsync(string to, string from, string subject, string text)
        {
            var message = new MimeKit.MimeMessage();
            // 送り元情報  
            message.From.Add(new MimeKit.MailboxAddress("<送信者名>", from));
            // 宛先情報  
            message.To.Add(new MimeKit.MailboxAddress("<宛名>", to));
            // 表題  
            message.Subject = subject;
            // 内容  
            var textPart = new MimeKit.TextPart(MimeKit.Text.TextFormat.Plain);
            textPart.Text = text;
            message.Body = textPart;

            using (var client = new MailKit.Net.Smtp.SmtpClient())
            {
                try
                {
                    // SMTPサーバに接続  
                    await client.ConnectAsync(SmtpHost, SmtpPort);
                    Debug.WriteLine("接続完了");

                    // SMTPサーバ認証（あれば）  
                    await client.AuthenticateAsync(User, Pass);

                    // 送信  
                    await client.SendAsync(message);

                    // 切断  
                    await client.DisconnectAsync(true);

                }
                catch (Exception e)
                {
                    Debug.WriteLine("{0} Exception caught.", e);
                }
            }
        }
    }
'''

nugetから取得します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148788/60f179cd-f169-f693-292e-3f3891dc809f.png)

core 3.0で確認しました。

Githubにも上げました

https://github.com/ueahiman/MailKitExample
RockyLinux/AlmaLinux 9にGoogle Chromeをインストールする

今回は、RPMをダウンロードして、依存関係だけをdnfを使ってインストールする方法を紹介します。

## Google Chromeのダウンロード

デフォルトでインストールされたFireFoxを開き、Google Chromeのページに行きます。

https://www.google.com/intl/ja_jp/chrome/
から、ChromeのRPMをダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85495/a86216ff-fb79-4b6c-0908-d360d6015670.png)

Chromeのダウンロードをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85495/302842a2-e527-67a8-f5f2-4bd0bfa26a1b.png)

64ビット .rpm (Fedora/openSUSE用）をダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85495/7958314f-1277-620d-e51c-fbfed929cb92.png)
「Save File」でファイルを保存します。

## Chromeのインストール
ダウンロードしたファイルは、デフォルトではHomeディレクトリの「ダウンロード」ディレクリ配下に保存されます。

ダウンロード先のディレクトリに行き、dnfコマンドでrpmの依存関係で必要なライブラリと共にChromeをインストールします

```
cd ~/ダウンロード
dnf localinstall google-chrome-stable_current_x86_64.rpm
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85495/fbe95d7e-1b3a-97af-8d1b-8b3798db0a3d.png)


あとは、ウィザードに従い、「y」を入力しインストールを実行します。

## インストール完了
インストールが完了すると、アクティビティのメニューでGoogle Chromeのアイコンが存在していることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85495/d4ffcb02-ee08-7976-ab74-32d90b501d48.png)


## root権限でchromeを利用するには

```
vi /opt/google/chrome/google-chrome
```

最下部の「exec -a ～」から始まる部分に「--no-sandobox」と「--user-data-dir=~」を追加する

```
exec -a "$0" "$HERRE/chrome" "$@" --no-sandbox --user-data-dir=~
```
Go言語で構造体をコピーするときに気をつけること

### 構造体のフィールドにマップがある場合の挙動

構造体のフィールドにマップがある場合、構造体s1を代入でs2にコピーしたときに同じポインタを参照してしまうことへの対処法。（ホントは別々の構造体として扱いたい場合）

### Go言語のマップは参照型

Go言語で構造体をコピーするとき、マップは参照型なので代入するとポインタがコピーされてしまう。
マップｓ２.mpをいじると元のマップs1.mpの値も書き換わってしまします。
(同じものを見ているからそれはそう）

```golang
package main

import (
	"fmt"
)

type st struct {
	i  int
	s  string
	b  bool
	sl []int
	mp map[int]string
}

func main() {
	s1 := st{i: 1,
		s:  "Go",
		b:  true,
		sl: []int{1, 2, 3},
		mp: map[int]string{1: "Go", 2: "Java", 3: "C#"},
	}
	fmt.Println(s1)
	s2 := s1
	s2.i = 10
	s2.s = "Python"
	s2.b = false
	s2.sl = append(s2.sl, 10)
	s2.mp[4] = "Haskell"

	fmt.Println(s1)
	fmt.Println(s2)

}
```

[playground](https://play.golang.org/p/qmTwaW3rXRk)

下記のようにs1.mp[4]にHaskellが入ってしまう。

```実行結果
{1 Go true [1 2 3] map[1:Go 2:Java 3:C#]}
{1 Go true [1 2 3] map[1:Go 2:Java 3:C# 4:Haskell]}
{10 Python false [1 2 3 10] map[1:Go 2:Java 3:C# 4:Haskell]}
```

## 解決策

別のポインタを確保して、loopで値を入れ直す。

```golang

package main

import (
	"fmt"
)

type st struct {
	i  int
	s  string
	b  bool
	sl []int
	mp map[int]string
}

func (ss st) copy() st {
	newS := ss
	newS.mp = make(map[int]string)
	for k, v := range ss.mp {
		newS.mp[k] = v
	}
	return newS
}

func main() {
	s1 := st{i: 1,
		s:  "Go",
		b:  true,
		sl: []int{1, 2, 3},
		mp: map[int]string{1: "Go", 2: "Java", 3: "C#"},
	}
	fmt.Println(s1)

	s2 := s1.copy()
	s2.i = 10
	s2.s = "Python"
	s2.b = false
	s2.sl = append(s2.sl, 10)
	s2.mp[4] = "Haskell"

	fmt.Println(s1)
	fmt.Println(s2)

}
```


[playground](https://play.golang.org/p/A64Rn0l7gXw)

```実行結果
{1 Go true [1 2 3] map[1:Go 2:Java 3:C#]}
{1 Go true [1 2 3] map[1:Go 2:Java 3:C#]}
{10 Python false [1 2 3 10] map[1:Go 2:Java 3:C# 4:Haskell]}
```

## なぜスライスでは発生しないのか？

調べてみるとスライスもマップと同じ**参照型**。
なのになぜ同じように元の値が変わらないか。

https://play.golang.org/

[この記事](https://qiita.com/Kashiwara/items/e621a4ad8ec00974f025)に答えがありました。

> Go言語は、容量オーバしたスライスに対して新しくメモリ領域を確保してコピーします。
> appendした際に容量オーバしたので、ar1とar2は、それぞれ別の領域を参照していることになります。

ということはスライスの容量確保によっては同じ現象が起きることになる。
のでスライスはcopyを使うか、空スライスにappendするのが無難。
どちらがベストプラクティスなのか分かっていないので誰かご教えて下さい！

[公式wiki](https://github.com/golang/go/wiki/SliceTricks#copy)に書いてあると教えていただきました。

スライスも新しいスライスを作成してappendするのが一例だそうです！
[ここまでのまとめplayground](https://play.golang.org/p/e6OkOsSdQ40)
令和元年台風第19号【災害救助法適用市町村】の一覧をスプレッドシートで公開します

## 公開の経緯

私の関与しているレンタルサブスクのサービスで、対象地域のお客様の対応を検討するために、対象者数の調査に使用しました。

私の住んでいる地域は、警告が出ていたものの被害はありませんでしたが、もしこのデータが他の方に役立つことがあれば幸いです。

## データ

出典：[内閣府防災情報のページ](http://www.bousai.go.jp/taisaku/kyuujo/kyuujo_tekiyou.html)

令和元年10月16日現在、公開されている[データ（令和元年台風第19号に伴う災害にかかる災害救助法の適用について【第13報】）](http://www.bousai.go.jp/pdf/r1typhoon19_relief13.pdf)はPDFで、そのままだと加工しにくいので、住所のみをスプレッドシートに転記しました。エクセルやCSVでダウンロードすることも可能です。

http://bit.ly/2plqXoo

**※ 最新のデータを追従するように心がけますが、念の為上記出典より確認してください。**

### After

![スクリーンショット 2019-10-14 10.54.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25283/02f18501-0dd5-83ac-3a67-e219faf29eb3.png)

### Before

![スクリーンショット 2019-10-14 11.02.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25283/083b821d-c098-8395-388b-009c71dae403.png)


### データ抽出方法について

時間がなかったので、PDF を Word に変換し、テーブル部分をコピー、スプレッドシートに貼り付けたテキストを正規表現で置換しました。作業時間としては5分もかかっていないと思います。

今後、使った正規表現の紹介、自動化やテストを書けたらと思います。

## 最後に

台風被害に遭われた皆様には、心よりお見舞いを申し上げます。一日も早い復旧をお祈り申し上げます。
ggplotの積み重ね棒グラフで、ラベルを中心に置く


# 目的

+ ggplotの積み重ね棒グラフで、ラベルを各々の積み重ねの中心に置く
+ 日本語での検索に引っかかるようにする

# 内容

+ geom_text()を使用
+ position = position_stack(vjust = 0.5)で位置調整
+ groupの使用しないと場所がずれる
+ geom_col()を使えば、geom_bar()でのstat = "identity"は不要

# プログラム例

```r

library(tidyverse)

Year      <- c(rep(c("2006-07", "2007-08", "2008-09", "2009-10"), each = 4))
Category  <- c(rep(c("A", "B", "C", "D"), times = 4))
Frequency <- c(168, 259, 226, 340, 216, 431, 319, 368, 423, 645, 234, 685, 166, 467, 274, 251)
Data      <- tibble(Year, Category, Frequency)

Data %>% 
  ggplot(aes(x = Year, y = Frequency)) +
  geom_col(aes(fill = Category), color = "black") +
  geom_text(aes(label = Frequency, group = Category),
            size = 6,
            position = position_stack(vjust = 0.5))

```

# グラフ例

![Rplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285482/2d8ec199-2044-f9f4-feb7-9be5fc07e197.png)


# 参考

+ https://stackoverflow.com/questions/6644997/showing-data-values-on-stacked-bar-chart-in-ggplot2

+ https://stackoverflow.com/questions/40724142/position-geom-text-in-the-middle-of-each-bar-segment-in-a-geom-col-stacked-barch

+  https://ggplot2.tidyverse.org/reference/aes_group_order.html![Rplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285482/4a32d2db-08f0-3751-2d5c-a09afc24f268.png)
python でクローリング ~ zipでくれ！ ~

# 概要
Pythonで 画像を収集する際のTipsをまとめます（久々にやったので備忘メモです）。

以下のようなシチュエーションを想定します：

- 画像一覧ページ: `http://example.com/pageID=12345`
- 画像URL一覧は上記ページをパースして取得
- 出力は 1zip ファイルに、登録順に格納

Python3を使っておおむね以下の技術要素を使います:

- 不完全なHTMLファイルのパース (モジュール名: `bs4`in BeautifulSoup)
- User-Agent偽装 (モジュール名: `urllib`)
- クッキーの利用 (モジュール名: `http.cookiejar`)
- リファラの設定 (モジュール名: `urllib`)
- zipファイルに保存 (モジュール名: `zipfile`)

# 1. ブラウザ挙動の偽装
画像を載せるようなサイトは、通常のブラウザでないと アクセスできないことが多いです。多くの場合、**User-Agentがブラックリストに入っていないか？** と **クッキーハンドリングができるか？** と **HTTPリダイレクションにフォローしているか？** に対応できていればOKです。それを実現するためのコード片はこうです:

```python3
import urllib.request
import http.cookiejar

UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100"
cj = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
opener.addheaders = [('User-agent', UA)]
```

`opener.open()`を使ってWebサイトにアクセスします。以降これを、`urllib.request.urlopen`の代替として使います:

```使用例.py
print (opener.open("http://example.com").read())
```

# 2. 画像ファイルの取得
通常、画像や動画というようなリソースは、いわゆる **直リン禁止** が設定されています。具体的には、**Refererヘッダのチェック**や、**クッキーの有無**で確認されることが多いようです。後者はさっきの設定で自動でなされるので、前者をどうするかを、以下のコード片で確認しましょう。Refererヘッダには、画像のリンク元のURLを入れます。冒頭の例では`http://example.com/pageID=12345`です:

```py
req = urllib.request.Request(url)
req.add_header('Referer', target)
opener.open(req)
```

なお、認証が必要なサイトでは、認証情報がクッキー（を使ったセッション管理）やトークンを使うような場合があります。前者の場合は、まず認証ページに、上記の`opener` を使って認証を済ませればOKです。後者の場合では、トークンをURLに埋め込んだりヘッダに埋め込んだりする必要があります（ここまでで紹介した方法で突破できるはずです, hint: add_header）。

# 3. zip で保存
pythonを使っていればすごく簡単です。ファイル名があまり意味をなさない場合(マンガとか？)`enumerate`を使って連番にしてしまうのも一つの手です。以下のコード片を参考にしてください:

```py
with zipfile.ZipFile(zipname, 'w') as z:
  for i, url in enumerate(urls): 
    req = urllib.request.Request(url)
    req.add_header('Referer', target)
    fname = "{:02d}.{}".format(i, url.split(".")[-1]) # NN.jpg
    with opener.open(req) as res:
      z.writestr(fname, res.read())
```

# 4. リンク抽出
順番が前後になってしまいますが、一覧ページから、画像URLの一覧を取得する方法を記載しておきます。`pip install beautifulsoup4` で導入できる BeautifulSoup と呼ばれるサードパーティ製モジュールは、Pythonクローリング界におけるパースのデファクトスタンダードでした（私の知識が3年くらい前で止まっているので今はどうかしりません）

前述の `opener.open()` で作成したオブジェクトを `bs4.BeautifulSoup` にフィードすれば、あとは通常通りの手順でパースができるので、必要なURLを抽出します（BeautifulSoupに関しては別の記事を参考ください）


```例.py
import bs4

url = "http://example.com"
soup = bs4.BeautifulSoup(opener.open(url))
# soup で色々やる
```

# 5. 最後に

- クローリング自体は、良識/マナーが問われる行為なので、クロール対象の規約は読んでおきましょう。
- 近年はSPAが増えてきたのでこのような old-style な方法が使えないことも結構あります。そのような場合 Puppeteerなどが候補に挙がります
- ChromeのF12で出る奴（開発者向けコンソール）における パス抽出機能は便利です。
- 質問等あればコメントください。
Webページのデザイン　要素を横並びにする方法

　プログラミングスクールに通い始めて、１ヶ月ほど経ち、簡単なwebページの制作技術がついてきてので、こちらにまとめていきます:writing_hand:
　分かりにくい点や説明に不備があれば、ご指摘ください。

　今回はwebページ製作における要素を横並びに配置する方法をご紹介します。以下に作成したサンプルページを載せておきます。

- Webページ　サンプル
<img width="1439" alt="スクリーンショット 2019-10-13 16.36.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490676/18f33803-f645-bd5e-b37e-94633289d22e.png">

要素の横並びにしているのはヘッダーとフォーム、サイドコンテンツとメインコンテンツの部分です。
<img width="1439" alt="webページサンプル　ヘッダーとフォーム.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490676/fcbb954d-557b-4ec8-eade-f5330c258fd8.png">

# 1.ヘッダーのアイコンを横並びにする方法
HTML

``` html
  <div class = header>
    <div class = icons>
      <div class = icons__icon>
        <p><i class="fas fa-trash fa-3x fa-fw"></i></p>
      </div>
      <div class = icons__icon>
        <p><i class="fas fa-cog fa-3x fa-fw"></i></p>
      </div>
      <div class = icons__icon>
        <p><i class="fas fa-plus fa-3x fa-fw"></i></p>
      </div>
    </div>
  </div>
```

SCSS

```scss
.header{
  height: 100px;
  padding: 0 40px;
  background-color: blue;
}
.icons{
  color: white;
  text-align: right;
  &__icon{
    display:inline-block;
    height: 40px;
    line-height: 40px;
    padding: 0 20px;
    margin-top: 30px;
  }
}
//※リセットCSSとしてress.cssを使用
```

　headerの中にアイコンの入れ物としてdivタグを並べ、その中にiconを設置。クラス名は※BEMに基づき設定しました。各アイコンはfontawesomeを使用しています。

本題の横並び方法についてですが、ここではインライン要素に対して有効なtext-alignを活用しています。icons__iconはブロック要素divであるため、そのままではtext-alignが効きません。そこで、display:inline-blockとすることでインラインブロック要素に変化し、横並びを実現しています。

※BEM
　BEM（Block Element Modifier）は、独特な命名規則（MindBEMding）で有名な設計思想。
3つの要素をBlock__Element--Modifierのように結合してclass名を決める。公式では、Elementはアンダースコア2つ（__）で結合、Modifierはハイフン2つ（--）で結合する規則になっている。

命名規則　参考
https://qiita.com/buchiya4th/items/127282088f5a9ad56152
https://qiita.com/yuta_web/items/6f2aa6b69e70b0b9f86c
http://getbem.com/

参考
https://saruwakakun.com/html-css/basic/relative-absolute-fixed
https://qiita.com/nezurika/items/5b278c1e134056157164


次回、サイドコンテンツとメインコンテンツに対する横並びの方法を記載します。
Qiitaメアド認証失敗の解決策：「無効な認証キーです」と出て進まない場合

#一番最初に送られてきた認証メールで再チャレンジしてみよう！#

認証がうまくいかない結果何度も認証メール送信ボタンを押しまくって大量の「メールアドレスのご確認」メールがQiitaから届いている場合。

あえて、一番初めに送られてきた（つまり日時が一番古い）認証メールを開いて、
下に小さく書いてある「上記のリンクが開けない場合は～」に続いて書かれているURLからQiitaにアクセスしてみてください。

私はこの方法でうまくいきました！
二分探索木におけるノードの削除

*Deletion in Binary Search Tree*
## 方針
二分探索木からあるノードを削除したい場合、下記の3つのパターンに分けて考えます。

1. 削除対象のノードが子を持たない
2. 削除対象のノードが1つの子を持つ
3. 削除対象のノードが2つの子を持つ

<img width="837" alt="Screen Shot 2019-10-14 at 10.48.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122091/09dc2070-31b9-42aa-097f-72866935e932.png">


1の場合は単純に削除対象のノードをnullで置き換えればよく、2の場合は削除対象のノードをその子で置き換えてやればよいです。3の場合は処理がやや複雑になり、削除対象のノードを中間順配列(in-order)で次に来るノード(successor)の値で上書きした上で、元のsuccessorを削除する必要があります。具体的な実装例を下記に示します。

## 実装例
```python
    # 二分木のノードを表すクラス
    class TreeNode:
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None

    # 二分探索木rootからkeyの値を持つノードを削除する
    def deleteNode(self, root, key):
        if root is None:
            return None

        if key < root.val:
            # 削除対象が自身より小さければ、左部分木から削除する
            root.left = self.deleteNode(root.left, key)
        elif key > root.val:
            # 削除対象が自身より大きければ、右部分木から削除する
            root.right = self.deleteNode(root.right, key)
        # 削除対象が自身と等しければ、自身を削除する
        else:
            # 子を持たない場合、自身をnullで置き換える
            if root.left is None and root.right is None:
                root = None
            # 1つの子を持つ場合、自身をその子で置き換える
            elif root.left is None or root.right is None:
                root = root.left or root.right            
            else:
                # 2つの子を持つ場合、自身をそのsuccessorの値で上書きし、元のsuccessorを削除する
                root.val = self.successor(root)
                root.right = self.deleteNode(root.right, root.val)

        return root

    # nodeの右部分木からsuccessorの値を返す
    def successor(self, node):
        node = node.right
        while node.left:
            node = node.left
        return node.val
```

## 補足
中間順配列(in-order)における自身のsuccessorは、自身が右部分木を持つ場合は必ずその右部分木内に存在します。実装例内のsuccessorメソッドは、引数のnodeが右部分木を持つ場合にのみ使われることを想定しています。

## 参考
https://ja.wikipedia.org/wiki/二分探索木
Typescript で スプレッド演算子を使った　いわゆる mapping(copy) した時の注意点

### 結論
見てもらったほうが速いので
実行環境をを示します。

[実行環境はこちら](https://www.typescriptlang.org/play/?ts=3.7-Beta&ssl=1&ssc=1&pln=21&pc=17#code/PTAEk4ghYAoBLA7ALgUwE4DMCGBjZoDKAFrAA6gDeMo1osAJjQFyjwCuAtgEZpU3ybtkzAM6JUCAOa9q2TCUajx8KdAC+MGAhQYceAILwA9okJoipCtNoNqzNlx7QaLAXhFjJMddBjZD8UVBhQ1RMdFZ4IQJiMgBeSycaemYARgAaK35BZgAiYKNwyJyMxJk5RhzDdkxkHK8NaD8AxFBq+VADY1NUcziKUAA6IeDQwrxvX39ggBtkAenDCQAKNoBKIA)

Typescriptを使って型mappingしたら　思っていた意図と違う結果が返ってきました。

型 Shipから　型　AnotherShip　に内容をマッピングするという
単純なコードです


### コード
```Sorahune.ts
// 船
interface Ship {
    id   : number
    name: string
    cap: string
    member: string
}

interface AnotherShip {
    id   : number
    name: string
    member:string
}

const sorafune: Ship = {
    id: 1,
    name: "sonofune",
    cap: "omae",
    member:"TOKIO",
}

const map: AnotherShip = { ...sorafune }


//期待としては　capというプロパティははなくなっていてほしい
console.log(map)

```


### 結果
javascriptにコンパイルされた結果は以下のようになってます。

[Object.assainメソッド[mozilla]](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
を見ていただければわかるように、Objectを丸ごとコピーしており、
capプロパティは削除されていません。

```Sorahune.js
"use strict";
const sorafune = {
    id: 1,
    name: "sonofune",
    cap: "omae",
    member: "TOKIO",
};
const map = Object.assign({}, sorafune);
console.log(map);
```

実際のコンソール画面です。

![](https://i.imgur.com/n7LEYiM.png)


当たり前ですが、仮にmapping先(AnotherShip)に
Shipにないプロパティが存在していた場合、そこでコンパイルエラーになります。

ではでは。
Talendを使ってみる 番外編

[Talendを使ってみる その２](https://qiita.com/nanaki11/items/5e4ed69d64a39eef05c1)の続きではない話
今回はTalend使いませんｗ

#複製したデータをマージできない問題
Talendは１つのソースデータを複製したりしたあとデータ加工してまたマージ（合わせる）ことができません。
つまりなにか区分ごとに分けて並列処理させたり、大量データを分散処理させたりが難しいです。
#解決策
##最初からデータを分割しておく（中間ファイルを作成する）
ETLの流れの中で分割して合わせて～とやるとNGらしいので最初から分割したデータを用意しておく方法
※分割後加工して別ファイルで保存する方法もほぼ同じ
懸念点としては
・前処理としてデータ分割の時間がかかること（中間ファイルの場合は後処理でマージ）
・分割前データも必要な場合、置き場所が別に必要になること（ストレージが余分に必要になる）
・I/Oアクセスのリソースも必要になること

上記の懸念点はなにかテキストファイルに出力する想定で記載していますが、DBにテンポラリーテーブルを作成しても同じような問題は起こるかと思います。

###ファイルに追加オプションを使う
ETLの処理の中で中間ファイルを作成する場合はファイル名を同じにして追加オプションにチェックを入れておけば別でマージ処理をする必要はありません
その場合も同時に１つのファイルにアクセスは出来ないので順番に書き込みをしていかないといけないですね
（DBの場合はトランザクション制御が必要）

##ハッシュ保存する
ハッシュコンポーネントを使用してメモリーにデータ保存する方法
懸念点としては
・処理データでメモリが専有されてしまう

マシンのメモリを大量に積まなくてはいけなくなります
またデータ量次第ではそもそもメモリーに持ちきれない可能性があります（大量データを分散処理させている場合などは特に）

#まとめ
今回の話はTalendの人から聞いた話をもとにしています。
解決策として書いた2つの方法は個人的にはいまいちだなと思っています。
Talendのよいところは無料で使えてJavaで動いているのでJavaエンジニアならなかを見ることで理解しやすい点だと思うので今回のようなケース含め大量データをさばくのは難しいのかなと思いました。
※
数十万件～数百万件くらいはなんとかなるかもしれませんが、数千～数億くらいになるとアウトだと思います。
あまり日本のETL案件でそこで大量データを対象にすることはないのかもしれませんが、直近でそういうお仕事をしていたので気になってしまいました。
VisualStudio2019で複数プラットフォームをビルドしたい

# 複数プラットフォームをビルドしたい
VisualStudio2019にて複数プラットフォームのビルドを一括でしたい場合は、構成マネージャでビルドをしたい構成を作成したのち、バッチビルドを行う。

## 構成マネージャでの構成の追加方法
(1)[ビルド]→[構成マネージャー]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/cc99e59b-2acb-2bb6-6812-5461e626ee65.png)

(2)アクティブソリューションプラットフォームのドロップダウンにて「新規作成」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/17cfc639-f208-c783-f87b-e2a14206fe9a.png)

(3)新しいプラットフォームダイアログにてプラットフォームを選択してOKを押す
今回はx64とx86の両方を新規作成で追加した
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/127c7991-0d10-04e1-d312-a5ee52d43c90.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/746ff7a3-8f2c-45c7-2ce6-48d147a754a7.png)

(4)構成マネージャーで追加したプラットフォームが選択可能になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/1d254ab7-7d35-431a-aa3c-fa90cdc998dc.png)

(5)メインメニューのツールバーでも追加したプラットフォームが選択可能になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/9f67c11d-eb48-606a-fb6a-fb4d6e1e514d.png)

## バッチビルドの方法
(1)[ビルド]→[バッチビルド]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/eccd7dde-a1d7-9e81-e0b1-acc472c0b61b.png)

(2)ビルドしたい構成にチェックを付けて「ビルド」または「リビルド」を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/367adf7b-3ac0-4974-a89a-ec88a284b3cc.png)

(3)既定では以下のようなディレクトリにファイルが出力がされる。

```
├─x64
│  └─Release
└─x86
    └─Release
```

※出力先を変更したい場合は以下をいじる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/89524924-567a-4277-c6e4-0ab1c84e0abf.png)
なおC#の場合、C++と違い$(SolutionDir)とかの環境変数を使用するとエスケープ処理がされるようなので、直接プロジェクトファイルを開いて直す必要がある模様。
https://social.msdn.microsoft.com/Forums/vstudio/en-US/b0eb3746-285f-4ec6-9658-154f427cdb80/c-project-setting-output-directory-to-solution-dir?forum=msbuild

### バッチビルドのメニューがない場合
バージョンによってはバッチビルドのメニューがないこともある。その場合は下記を参考にメニューのカスタマイズでバッチビルドのメニューを追加する

**VisualStdio2012でバッチビルドを行う方法**
https://needtec.exblog.jp/21564296/

以上
第１次～３次のAIブームをコンピューター将棋の歴史で語ってみる

# 1.はじめに
ディープラーニング協会のG検定2019#2を受験し何とか合格させていただきました。学習の中で第１次～第３次のAIブームの内容が真っ先に出てきます。概念はあるのですが実例と紐づいていない本が多く、とっつきにくいかと思います。
ちなみに私は過去にコンピューター将棋の解説番組を視聴していてその内容を紐づけることで理解できたと思っています。そのため自身の整理も含めて将棋ソフトとAIブームを紐づけることで理解の助けになればと思っています。

##1.1 注意事項
コンピューター将棋については私自身製作に関わったことも製作者に知人もおりません。
あくまで過去の番組を見た記憶のみで記載しています（リンク参照）。また古い番組ですのでなかなか再放送やペイパービューもないため記憶違い等があるかもしれません。また紐づけは私の主観であり、間違いがあったらどんどん突っ込んでください。

#2.第1次AIブーム
探索と推論の時代  
これは将棋でいうなら詰将棋になります。
「詰みという状態が明確なゴール」を目指して力任せを効率的に行います。

#3.第2次AIブーム
エキスパートシステムの時代
これはBonanza以前のソフトと言えます（詰みモード以外）。
古くは内藤國雄９段の将棋、森田将棋など。
詰将棋ではゴールが明確ですし、詰む/詰まないも明確です。
しかし、詰みがない状態であればどうすればいい方向に向かうのか定義するのは難しいのです。一つの手法として駒得もありますが陣形の差だってありますし、多少駒損でも敵陣にと金がいっぱいあって勝勢ということもあります。

そのためこの当時はアマチュア有段のような将棋が強い人が
＜駒の価値＞
・飛車：500点、角：480点、金：400点・・・歩：1点
＜陣形の価値＞
・王が８八にいれは200点、金が７八にいれば180点
　王が７八にいれば180点・・・・
といったことを手で設定していました。いわゆる評価関数です。
まさにアマチュア有段者という「エキスパート」な人たちがその知識をシステムにしようとしていた時代といえます。

#4.第3次AIブーム
機械学習、深層学習
これはBonanza以降の将棋ソフトです。
将棋の棋譜を機械学習させ、評価関数を高めるようにします。
Bonanzaは将棋の駒の配置の三角形（８八王-７八金-７七銀など）を
実際の将棋の棋譜に近付けるよう学習させたそうです。
いわゆるプロの棋譜という教師あり学習です。
最近ではロボット同士で戦わせて強化していく強化学習を使っているようです。

#5.リンク
[将棋スペシャル「第25回 世界コンピュータ将棋選手権」](https://www.igoshogi.net/shogi/special/25computer_shogi.html)
[第24回世界コンピュータ将棋選手権](https://www.igoshogi.net/shogi/special/wcsc.html)
※もっと古いものも見ていたはずなのですがリンクが見つかりませんでした。
[180215 Ponanzaにおける強化学習、ディープラーニングとその先(slideshare)](https://www.slideshare.net/HEROZ-JAPAN/180215-ponanza)
plunkerでassembler-simulator その4

#概要

plunkerでassembler-simulatorやってみた。
出力のメモリマップドを変更してみた。

#詳細

メモリの232番地から255番地が表示される。
24桁しかない。
254番地に、キーコード、255番地に49を出力すると
textareaに、表示されるようにした。

#サンプルコード

Hello World!を、出力。

```
start:
	MOV 	C, hello
	MOV 	D, 49
	MOV 	B, 0
loop:
	MOV 	A, [C]
	MOV 	[254], A
	MOV 	[255], D
	INC 	C
	CMP 	B, [C]
	JNZ 	loop
	HLT

hello:
	DB 		"Hello World!"
	DB 		0
```

#成果物

https://embed.plnkr.co/haUQHr0kBJSea5pPw1jE/

以上。
コンバージェンスとは

# コンバージェンス(convergence)
- ランディングページ作成におけるコンバージェンスとは、問い合わせ・資料請求・注文のこと。不特定多数のユーザに、氏名や連絡先を記入してもらい、特定できる状態に転換(conversion)するということ。
TypeScript:覚えた知識を日々書き留める#3

#TS2069エラーを解決した方法メモ

新しいプロジェクトを作り、必要なものをインストールして
Promiseを使おうとするとTS2069エラーに。

tsconfig.jsonのtargetをes2015に変更すると、エラーが消えた。

targetとは、トランスパイル後のECMAScriptのターゲットバージョン。
トランスパイルとは、ソースコードからソースコードへのコンパイルを行う事。

調べたとおりに修正すれば問題は解決するけど、理解が曖昧なまま
とりあえず直すのが気持ち悪い。
…設定周り、まだまだ勉強しなければ；
nuxtでfirestoreにform送信

# この記事でやること

nuxtでform送信を行う

# nuxtでform送信行う際の流れ

* v-modelからdataに値を送信
* submitの@clickでmethodsを発火
* methodsでfirestoreへの送信を記述

# v-modelからdataに値を送信


```javascript
<script>
import firebase from '@/plugins/firebase'

export default {
  data: function () {
    return {
      room_title: '',
      story_name: ''
    }
  },
}
</script>
```

dataを準備。ここに格納していく

# submitの@clickでmethodsを発火

formで囲ってv-modelをまとめて送信する

```javascript
      <form>
        <v-text-field
          v-model="room_title"
        ></v-text-field>
        <v-text-field
          v-model="story_name"
        ></v-text-field>
        <v-btn color="primary" @click="makeroom">
          部屋作成
        </v-btn>
      </form>
```

# methodsでfirestoreへの送信を記述

```javascript

  methods: {
    makeroom: function () {
      var db = firebase.firestore()
      db.collection('room').doc().set({
        room_title: this.room_title,
        user_id: this.$store.state.uid,
        story_name: this.story_name
      })
      .then(function (docRef) {
        console.log('Document written with ID: ', docRef.id)
      })
      .catch(function (error) {
        console.error('Error adding document: ', error)
      })
    }
  }
```

thisでdataの値を引っ張ってきてfirestoreに送る
初心者によるプログラミング学習ログ 125日目

# 100日チャレンジの125日目

Twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

125日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>125日目<br><br>UdemyとドットインストールでVue.js学習<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアとつながりたい</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1182041751613108224?ref_src=twsrc%5Etfw">October 9, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

# 学習したことの一部

・複数インスタンスの書き方

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="main.css">
    <title>Document</title>
   
</head>
<body>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <div id="app1">
   <p>{{message}}</p>
  </div>
  <div id="app2">
    <P>{{message}}</P>
    <button @click="changeMessage1">インスタンス1のmessageを変更</button>
  </div>
 <script>
   var vm1 = new Vue ({
     el: '#app1',
     data: { 
       message: 'インスタンス1'
     }
   })
   var vm2 = new Vue({
     el: '#app2',
     data: {
       message: 'インスタンス2'
     },
     methods: {
       changeMessage1: function() {
         vm1.message = 'インスタンス2から変更'
       }
     }
   })
  </script>
 </body>
</html>
```

new Vueでの複数インスタンスの書き方。

基本的には、同インスタンス内で処理するのがセオリー。

こういう書き方もできる、という一例。
windows版curlでjsonをPOSTする

## 環境
Windows 7
curl 7.66.0

## 自分がハマったところ
windows版curlではjsonを書くときの引用符の書き方がちょっとめんどくさい。

```
> curl -X POST -d '{"key":"value"}' <URI>
```
としたいところだが、windowsでは`"`を`\`でエスケープする必要があるので、

```
> curl -X POST -d "{\"key\":\"value\"}" <URI>
```
とする。
docker run / exec でコマンドが実行できない場合は entrypoint を上書き or 削除してみる  ( #docker )

# なぜか echo ok が実行できない


```
$ docker run mesosphere/aws-cli echo ok
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:
...
```

# 元のDockerfileを確認する

ENTRYPOINTが指定されている。

https://hub.docker.com/r/mesosphere/aws-cli/dockerfile

![image](https://user-images.githubusercontent.com/13635059/66723521-0846cf80-ee55-11e9-8046-1265357bce1f.png)

# entrypoint を削除して コマンドを実行する例

```
$ docker run --entrypoint= mesosphere/aws-cli echo ok
ok
```

# entrypoint を上書きする例

```
$ docker run --entrypoint='hostname' mesosphere/aws-cli
e2ff1cabebf0
```

# ところで entrypoint のコマンドには引数を渡せないっぽい？

command との違いはなんだろうと思っていたけれど、引数のないコマンド一個だけを実行するということだろうか。なるほど。その名の通りエントリーポイント。

```
$ docker run --entrypoint='echo ok' mesosphere/aws-cli
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"echo ok\": executable file not found in $PATH": unknown.
ERRO[0001] error waiting for container: context canceled
```

# Dockerfileでは

```
ENTRYPOINT []
```

[docker - How to remove entrypoint from parent Image on Dockerfile - Stack Overflow](https://stackoverflow.com/questions/40122152/how-to-remove-entrypoint-from-parent-image-on-dockerfile/40122359)

# docker-compose では

こうかな。

```
entrypoint: []
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2591








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Octave 5.1.0の 引数なしの pause 関数が正常に動作しない

注意: 本現象については、本質的な解決まではしていません。

引数無しで pause 関数を呼び出すと、「処理が一時停止し、何かしらのキー入力を受け付けると、処理が再開される」という仕様になっています。

しかし、Octave 5.1.0 では、何かしらのキーを入力しても、処理が再開されません。
以下のようなバグが報告されています。

bug #55029: pause() with no arguments does not return like kbhit() with glibc 2.28
https://savannah.gnu.org/bugs/?55029

> Correct, this bug is fixed on the Octave stable branch after 5.1.0 was already tagged, it will be part of version 5.2.0.

5.2.0 では解決される予定のようです。
(2019年10月現在では、Octave の Stable は 5.1.0)

はじめに記載したとおり、本現象の原因についての理解や本質的な解決はしていません。ひとまず pause を使わないようにするという対処療法を取りました。
Bookmarkletを作る際に便利なWebツールやソフトウェア



#はじめに
Bookmarkletはとても便利で、日常的に使っていますし、また、ちょっとした作業をする際にサクっと作れると、
単純作業の繰り返しなどがある場合にだいぶ時簡短縮できます。
そんなBookmarkletを作る際に普段使っているWebツールやソフトウェアをまとめてみました。
もっといいやり方あるよ！等、もしあればぜひ教えてください。

#Bookmarkletって何？
そもそもBookmarkletって何なの？という方は使い方も含めて下記をご一読ください。
[ブックマークレットの登録方法 - Qiita](https://qiita.com/aqril_1132/items/b5f9040ccb8cbc705d04)

一から作ってみる場合、以下のページが分かりやすいかもしれません。
[ブックマークレット／Bookmarkletの作り方 - catch.jp-wiki](https://www.catch.jp/wiki/?Bookmarklet%A4%CE%BA%EE%A4%EA%CA%FD)

#注意事項
Web上のツールについては、善意で運営されているものの、外部システムに情報を渡すことになるため、
利用する際には、コードに社外・組織外に出してはいけない情報が含まれないようにしてください。

#開発の流れ
1. 目的に近いサンプルBookmarkletやJavascriptのコードを探す
2. コードを[Online JavaScript beautifier](https://beautifier.io/)で人間が見やすいフォーマットに変換する。
3. コードをテキストエディタに貼り付け。（私の場合はNotepad++）
4. 貼りつけたコードを編集する。
5. [bookmarklet maker](http://userjs.up.seesaa.net/js/bookmarklet.html)にコードを貼りつけて動作テスト。
6. 4-5の繰り返し。
7. コードの編集完了。
8. [bookmarklet maker](http://userjs.up.seesaa.net/js/bookmarklet.html)の最下部に生成されるBookmarkletをブラウザのブックマークバーにドラッグアンドドロップで挿入する。
9. 完成！


#開発時に使うツール

[bookmarklet maker](https://userjs.up.seesaa.net/js/bookmarklet.html)
その名の通り、書いたJavascriptのコードからBookmarkletを生成してくれるもの。改行とスペースを削除してくれる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/b1976b54-6a76-14b7-4335-1d9a16828954.png" width=50%>

[Online JavaScript beautifier](https://beautifier.io/)
元々はJavaScriptのコードの体裁を整えてくれるものですが、Bookmarkletのコードを再び読みやすいフォーマットに戻すのにも使えます。

[テキストエディタ「Notepad++」の使い⽅ 【初⼼者向け】 | TechAcademyマガジン](https://techacademy.jp/magazine/4724)
JavaScriptなどのコードを色分けして見やすくしてくれる他、様々な機能で楽に開発することが出来ます。
正規表現を試したりするのに、TextFXというプラグインがとても便利です。

[Regexper](https://regexper.com/)
正規表現の可視化ツール。
Bookmarkletを作成する際、割と正規表現を良く使いますが、頭が疲れていて正規表現で煮詰まったり、考えたくないときに、
作った正規表現をとりあえず放り込むと、構造を可視化してくれて、理解が進みます。

[正規表現チェッカー PHP: preg_match() / JavaScript: match()](https://okumocchi.jp/php/re.php)
テキストエディタでもできますが、こういう形式のツールを使ったほうが楽なことがあります。

[URL エンコード/デコードフォーム 2](https://home.kendomo.net/board/decode/decode2.php)
Bookmarkletで扱う文字列などにあえてスペースを入れたい場合などに使用。
※Bookmarkletの場合、Bookmarklet Makerによってスペースが削除されたり、実際呼び出すときにスペースが無視されるので、
スペースを%20といったURLエンコーディングされた形式に変換して扱う必要がある。

#リファレンス
慣れてくるとあまり見なくなるかもしれませんが、参考になるサイトの一例。
###ブックマークレット集

[Hatena::Let](https://let.hatelabo.jp/)


###正規表現サンプル集
[便利な正規表現 | Shinta's Site](https://www.gadgety.net/shin/tips/unix/regexp.html)
[正規表現サンプル集](https://www.megasoft.co.jp/mifes/seiki/)

###正規表現の早見表 
そのうち更新予定

#おまけ
例えばGoogle Chromeの場合、Bookmarkletの開発をするときに使うツールを一つのフォルダにまとめて入れておいて、
そのフォルダを右クリックして「すべてを開く」とすると、良く使うツールを一気に開けて、開発時の段取りが一瞬で終わり便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/15034292-e7ad-084f-3128-1c367790fcf0.png)
【データ・サイエンティストPython 小ネタ帳】メモ

# データ・サイエンティストで必須となる技術で、これを知ってるとちょっと便利という小ネタを集めてみます。




Numpy

```Python:
np.arange(10)
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

np.arange(0,20,2)
# array([0, 2, 4, 6, 8, 10, 12, 14, 16, 18])

np.arange(1,10).reshape((3,3))
# array([[1, 2, 3],
#        [4, 5, 6],
#        [7, 8, 9]])
```
これは１次元リスト(list)から配列(array)へ変更の常套手段。


###リスト内包表記

```Python:
base = [1,2,3,4]
new = [i*2 for i in base]
print(new)

[2, 4, 6, 8]
```




#Ref.

https://note.nkmk.me/python-list-array-numpy-ndarray/
https://tanuhack.com/create-ndarray/
https://qiita.com/kaeruair/items/e7f1c08915839ce3c9b4
https://qiita.com/okkn/items/54e81346d8f35733ab5e
Pandas; drop();
https://note.nkmk.me/python-pandas-drop/