OmniAICreator/Qiita-1.07M huggingface dataset:
ソフトウェア設計について考える2

`この記事には、ソフトウェア開発を経験した中で得たこと・感じたことを備忘録として残す。`
`読みやすい文書でもないし、正解が書いているわけではない。`

## 設計（デザイン）についてもう少し考える
### 日々の悩み
ソフトウェア開発というのは、とても金のかかる仕事である。

金がかかるといえば、人生においての最大の買い物は住宅購入…は、異論が少なかろう。
例えば注文住宅の建築を依頼した場合、ピンキリではあろうが「3千万円くらいじゃね？」あたりが一般的だろうか。

さて、3千万円とはどんな金額だろう？
これまたピンキリではあるのだが、システム開発事業者に月単価100万円で準委任契約で業務委託したとしよう。
（感覚的にはそこそこいい値段であるので、そこそこ優秀なエンジニアを期待できる）
3千万円あれば、30人月規模で開発出来そうである。

早速ググってみた。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127005/7aeec82d-4461-4104-976a-ff26f1a79f19.png)
（引用: IPA/SEC ソフトウェア開発データ白書（2016-2017）https://www.ipa.go.jp/files/000057877.pdf ）

30人月≒5000人時として見てみよう。
（1日8時間、土日はしっかり休んでもらうとして8時間20日×30人月＝4800人時。まぁ1日2～30分の残業には目をつむって5000人時）
相当大雑把だが、ざっくり5～50KLOCくらいの範囲だろうか。

中規模程度のシステム開発をやる金があれば、家が建つということだ。
（ちなみに人件費以外のもろもろの経費を無視しているので、本当はもっとかかる）

何が言いたいかというと、**とにかく無駄な作業にコストを使いたくない**のだ。

###文書作成にかかる労力
ソフトウェア開発は、どうにも文書作成との戦いになりがちだ。
なぜか。
もちろん書物となった仕様や設計は、エンジニアの道しるべとなり、議論の材料となり、将来保守担当者の拠り所となる場合が多い。
その重要性は否定しない。

だが、どうだろう。
**エンジニアの低い技術力からくる顧客・マネジメントの不信感を避けるため、しぶしぶ書いている文書はないだろうか？**

価値のある文書はウェルカムなのだが、価値のなさそうな文書をよく見る。
この傾向は、V字下側の文書（詳細設計書、単体試験仕様書）で顕著だ。
こと詳細設計については、良い文書と悪い文書がはっきり分かれるので、プロジェクトとしてしっかりと方針を決めておきたい。

### デザインの語源
[先日投稿した記事](https://qiita.com/narusekaoru/items/1d1ed7c737e8069e1e12)でも行ったが、外の世界からソフトウェアの世界を見てみると、新たな発見があって良い。
今回は、設計＝Designの語源を考えてみようと思う。

デザインという言葉をWikiで調べると、すぐに語源が分かった。
>デザインの語源はデッサン(dessin)と同じく、“計画を記号に表す”という意味のラテン語designareである。
（引用:  フリー百科事典ウィキペディア（Wikipedia）https://ja.wikipedia.org/wiki/デザイン ）

なるほど、計画とはとても複雑で、記号に表さないと整理がつかない。
例えば人生計画を立てようとしたら、原稿用紙100枚に文章を書きなぐったりはしないだろう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127005/0789f19d-396b-218e-8307-c04745ec9cdc.png)

Wikiには次のようにも書いてある。
>また、デザインとは具体的な問題を解き明かすために思考・概念の組み立てを行い、それを様々な媒体に応じて表現することと解される。
（引用:  フリー百科事典ウィキペディア（Wikipedia）https://ja.wikipedia.org/wiki/デザイン ）

これはしっくりくる。
本日は以下をまとめにしようと思う。

**ソフトウェア設計＝目的（問題解決）に対する手段（ソフトウェア）の組み立ておよび表現**

書いてみたら、普通の事だった。
当たり前のことを、当たり前のように腹落ちしている状態は、きっと良いことなのだろう。

`眠くなったので本日はここまで`
GCPはじめ

# はじめてのGCP（書きかけです）

## はじめに
この記事ははじめてGCPを触った際のメモ代わりです。
ゴールはプロジェクトの作成をすることです。

### GCPのアカウント作成
googleのアカウントを作成した上で、GCPのアカウントを作成します。
初めてGCPのアカウントを作成する際は12ヶ月のトライアルが使えるのでこちらを利用します。

### プロジェクトの作成
プロジェクトを作成していきます。

#### GCPアカウント作成後
以下のようなダッシュボードが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66506/980d668f-2c29-5e5c-be05-c528a39f1383.png)

ここから新規にプロジェクトを作成していきます。

#### プロジェクトの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66506/0e57786c-51f1-9ad9-d782-33f89d5786db.png)
jupyter + SQLite

python初めて1年半の見習いです。
最近jupyter + SQLiteの組み合わせを使い始めて非常に
便利です。
ですがipython-sqlの導入時にちょっと苦労したのでその辺
を共有してみます。
自分のような初心者の助けになれば。

■自分の環境
・OS:Windows10
・Minicondaインストール済み（jupyter notebook使用可）
・データの分析で数M〜数十Mのcsvファイルを扱うので
　Excelじゃツライ
・毎回read_csvするのもツライ。csvファイルがたくさん
　あってファイルの管理もツライ
・かといってMySQLやPostgreSQL立てるのはちょっとアレ

■インストールするもの
・DB Browser for SQLite
・ipython-sql

■自分的結論
・データはSQLiteにまとめる
・データのSQLiteへの取り込みと簡単な内容チェックは
　DB Browser for SQLiteでする
・データをガチャガチャやるときはjupyter notebookで
　やる

■インストール
・DB Browser for SQLiteをインストール
　（この辺はネットに情報が充実しているので省略）
・ipython-sqlのインストール
　UbuntuならTerminalでpipすればさらっとインストール完了
　するんですが、Windowsだとコマンドプロンプトでpip
　できなかったので少し悩みました。
　答えとしては、jupyter notebookで
　　!pip install ipython-sql
　を実行しました。
![Screenshot from 2019-06-19 23-11-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284553/84c3c9e7-42c1-a099-aeaa-3c0242b781b9.png)


■データの取り込み、テーブルの作成
・DB Browser for SQLiteでSQLiteファイルを開いてcsvを
　インポートするのが楽と思います。
　この辺も詳しい手順は省略。

■jupyterからSQLiteへの接続
PostgreやMySQLへの接続方法はネットに充実してたんですが、
SQLiteへの接続の情報はなかなかわかりづらくて苦労しました。

・前提条件
　C:直下でjupyter notebookを開いてる
　C:直下にデータを保存した「sample.sqlite3」がある
　（要はnotebookと同じフォルダ内にsqliteファイルがある）

上記のような状態で下記を実行します
![Screenshot from 2019-06-19 23-13-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284553/0e3172bc-f6e8-4fda-109c-e86e134b8827.png)
ポイントは「%sql sqlite:」の後はスラッシュ3本+カレント
ディレクトリにあるSQLiteファイル名。
これでsample.sqlite3に接続できました。

■データの取り出し
これでもうデータの取り出しはスイスイです。
自分の場合はデータ取り出しと同時にpandasのデータフレーム
にしてしまいます。
なのでpandasもインポートしておきます。

例：テーブル「member」からデータ取り出し
![Screenshot from 2019-06-19 23-37-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284553/6d2768ab-3c97-c30e-e733-bdfb93851ad5.png)


あとはガチャガチャやるだけです。
State Hash その２追記

# はじめに

[State Hash その２ 要素が1つだけの場合のsubCacheMerkleRootsの計算](https://qiita.com/planethouki/items/a905c543829dba2331d3)の追記です。

# RocksDBにはまだあった

元の記事で[FastNoSQL](https://fastonosql.com/)のスクショをあげていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/05a26477-6bd4-642d-afde-2897052a3aa0.png)

このとき、DBにはdefaultしか表示されてませんでしたが、まだありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/c4459276-e27e-9d69-77b9-476d706cc3ef.png)

height_groupingとpatricia_treeというDBがありました。

これらについては、実はslackの方で教えてもらっていたのですが、GUI上には出てこなかったのでスルーしてました。

# 表示する

Load databaseをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/39522fc1-4ee2-a7ec-4586-f195e3d37d0a.png)

赤くなってるやつを右クリックしてLoad content of databaseをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/09a20893-12af-e735-d116-7f493d34715a.png)

赤くなってないやつを右クリックしてset defaultをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/3f2b644f-ddac-cb19-8e78-02eb29561085.png)

赤いやつを右クリックしてLoad content of databaseをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/33971690-2219-5b44-5987-1bda2fe43ad3.png)

# みてみる

## height_grouping

height_groupingには0レコード。これは確か有限期間のモザイクを指定していた場合にレコードができていたような気がします。

Jaguar0625さんに教えてもらった言葉を引用します。

>"height_grouping" (key: height, value: list-of-mosaic-ids-expiring-at-height): this is secondary index (can be computed from 1)

## patricia_tree

Jaguar0625さんに教えてもらった言葉を引用します。

>"patricia_tree" (key: hashed-mosaic-id, value: hashed-mosaic-entry) OR (key: hashed-tree-node, value: tree-node): the tree nodes composing the patricia tree (can be computed from 1)

patricia_treeは2レコード。

rootレコードにはsubCacheMerkleRootが入っていました。

```
key: root
value: 5d8eead5907130d297c322698f3d201a78d629cac87487a0f4f890c1277b250c
```

もう一つのレコードはleaf node。

```
key: 5d8eead5907130d297c322698f3d201a78d629cac87487a0f4f890c1277b250c
value: ff4014979a1134c38c8a5c7c7e3669ce7aa98c2d46225f77645a1fc6e7a30ff5c5dab6bcae57d970e08bc94701a8333f081b633554fe5282ab2d841d17f9b93e9b2d
```

このPatricia Treeはただひとつのleaf nodeをもっているので、そのkeyがsubCacheMerkleRootと一致しています。

valueを分解します。

```
ff		// ffならleaf node, 00ならbranch node
40		// 後に続くnibbleの数 0x40 = 64nibble = 32byte
14979a1134c38c8a5c7c7e3669ce7aa98c2d46225f77645a1fc6e7a30ff5c5da	// hashed mosaic id
b6bcae57d970e08bc94701a8333f081b633554fe5282ab2d841d17f9b93e9b2d	// hashed mosaic entry
```

このような情報が入っていました。

このleaf nodeのhashは以下の計算式で求められます。これは、keyと一致します。

```
sha3(20 + hashed mosaic id + hashed mosaic entry)
  (= 5d8eead5907130d297c322698f3d201a78d629cac87487a0f4f890c1277b250c)
```
# おわりに

頭が混乱してきました。

# シリーズ

[State Hash その１ subCacheMerkleRootsからstateHashの計算](https://qiita.com/planethouki/items/4e411a9b157e723327ee)

[State Hash その２ 要素が1つだけの場合のsubCacheMerkleRootsの計算](https://qiita.com/planethouki/items/a905c543829dba2331d3)

[State Hash その２追記](https://qiita.com/planethouki/items/03cc5ac3b655f7bd1f45)

[State Hash その３ 要素が2つの場合のPatricia Tree](https://qiita.com/planethouki/items/3f7a235de3fb347bcb4d)
「iOS アプリ開発デザインパターン入門」を読んでの備忘録

[こちらの本](http://urx2.nu/ZGoE)を読んで分からなかった内容を調べた(これから調べる)際のメモ

#1. <span>@</span>objc func ~~~ の <span>@</span>objc って何ぞや？
__答え__
<span>@</span>objc を付けるとObjective-C側から呼び出す事ができる

__詳細__
1. Objective-Cではメソッドをコンパイルすると2つの隠し引数(`self`と`cmd`)を持った関数が生成される 
2. Swiftでは1つのを隠し引数(オブジェクト自身)を持った関数が生成される
3. 隠し引数の数の違いによって相互利用が出来なくなってしまう
4. <span>@</span>objc を付けることでコンパイル時に2つの隠し引数を持ったメソッドが生成できる

__補足__
プロパティにも <span>@</span>objc をつけることができるみたい

__参考__
[[Swift] @objcの話 [Objective-C]](https://qiita.com/masakihori/items/4a715f28fc7f18d1a625)

#2. <span>@</span>escaping って何ぞや？
__答え__
@escaping を付けるとクロージャをスコープ外で保持できる

```Swift
class A {
    private let storedClosure: () -> ()
    // escapingを付けないとエラーになる
    init(closure: @escaping () -> ()) { 
        storedClosure = closure
    }
}
```

__補足__
1. <span>@</span>escaping したクロージャ内でフィールド変数を参照する場合には `self` を付ける
2. 循環参照に気を付ける

```Swift
class A {
    private let storedClosure: () -> ()
    // escapingを付けないとエラーになる
    init(closure: @escaping () -> ()) { 
        storedClosure = closure
    }
}

class B {
    private var a: A?
    private var count = 0

    func doSomething() {
        // (2) 循環参照を避けるためにselfを弱参照する
        a = A(closure: { [weak self] in 
            // (1) フィールド変数のcountにアクセスするためにselfを付ける
            self?.count += 1
        })
    }
}

do {
    let b = B()
    b.doSomething()
}
```


__参考__
・[Swiftの @escaping と weak/unowned の理解](https://qiita.com/ottijp/items/e45b65263c53037af1ee)
・[Swift 3 の @escaping とは何か](https://qiita.com/mishimay/items/1232dbfe8208e77ed10e)

#3. fileprivate って何ぞや？
__答え__
同一ファイル内であればアクセスできる修飾子
(名前の通りそのままですね)

__private修飾子との違い__

```Swift:Hello.swift
class A {
    private var hoge = "hoge"
    fileprivate var fuga = "fuga"
}

let a = A()
print(a.hoge) // 'hoge' is inaccessible due to 'private' protection level
print(a.fuga) // fuga
```

#最後に
初めての投稿で「@」が謎のリンクになっていたので、そちらの解決方法もメモしておきます

__答え__
@を`<span>`タグで囲う
`@arusu0629` → @arusu0629
`<span>@</span>arusu0629` → <span>@</span>arusu0629

__参考__
[Qiitaのマークダウンで @（アットマーク）リンクの無効化に苦戦](https://qiita.com/xsgk/items/b41262553cbc10544c2e)
今日の学習

##やったこと
###・atom のエディターをオートセーブに設定。
###・メソッドについて

##学んだこと
###・atom のエディターをオートセーブに設定やり方
→atom →Preference→Packagesで「autosave」を検索、[Settings]でEnabledにチェックを入れる。

###・メソッドについて
・メソッド

メソッドはユーザーが独自に定義するいことができる関数のこと。メソッドを定義することにより、共通した処理をひとまとめにし、メソッドを呼び戻すことで何度でも使うことができる。
Rubyのメソッドは始まりにdefを指定して、終わりをendを記述し、その中に実行する処理を記述する。
↓
def メソッド名
    実行する処理
end

メソッドの使い方

ex  say と言うメソッドを定義する場合
↓
def say
puts "YOLO" #You Only Live Once(人生は一度きり)
end
 
say

実行結果→YOLO

またメソッドにあらかじめ引数を設定することができる。

ex  goodbyeという引数付きのメソッドを定義する場合。

def goodbye(name)
puts "Goodbye #{name}"
end
 
goodbye("World!")

実行結果→Goodbye World!

文字列の中で、メソッドで渡した値を使用したい時、#{}で変数を囲む必要がある。
今回はnameが引数のため#{name}となる。

メソッドの呼び出し

通常メソッドというのは全てクラスに定義されている。
→(あるクラスを継承した)オブジェクト.メソッド名(第1引数、第2引数、…)){ブロック}
例えば、rubyのなかの文字列オブジェクトのクラスはstringであるため、stringクラスのメソッドを使うことができる。

１　name = "Samurai" #文字列オブジェクトnameを定義
２　 
３　"Samurai".class #クラスを確認→Stringクラスだった
４
５　　p name #=> "Samurai" #中身が侍であることを確認
６ 
７　　name.replace("Bushi") #Stringクラスからreplaceメソッドを呼び出す(文字列SamuraiをBushiに入れ替える)
８ 
９　　p name #=> "Bushi" #ちゃんと入れ替わった
１０

この場合、継承したオブジェクトはnameでメソッドはreplaceである。
そしてreplaceの第一引数はBushiである。

トップレベルにメソッドが定義されてた場合はオブジェクトの省略をしてメソッドを呼び出すことができる。
先ほどの
→def goodbye(name)
puts "Goodbye #{name}"
end
goodbye("World!")

また、{ブロック}を渡す場合は例えば配列の場合だと
→a = [1,2,3]
a.each{|content| p content}

実行結果
→[実行結果]
1　１
2　２　
3　３


{|content| p content}の部分がブロックを渡している部分。

###補足、追加
変数の使い方https://www.sejuku.net/blog/12879
defを使ってメソッドを定義するhttps://www.sejuku.net/blog/19275
クラスメソッドの使いかたhttps://www.sejuku.net/blog/19208
Mozilla SSL Config Generatorの主な変更点メモ

### moz://a SSL Config Generator 

mozillaが推奨するTLSサーバ設定を久々に更新したので主な注意点を確認。
原則2019/7時点のInteemdiate configについて。

#### TLSv1.2 TLSv1.3

だいぶ前からTLS1.0/1.1を完全にドロップしている。
古いAndroid4.3、IE10やJava7はハンドシェイク時点で切り捨てられる。

#### CBCのドロップ

CBCをドロップしてGCMとCHACHA20に限定された。CCMはまだ入っていない。
これにより、Safari8とそれ以前や、Windows Phone8.1との互換性が失われる。

正確にはECDSA-GCMで接続できるはずだが、現状証明書はほぼRSAなので選択されない。
Let's encryptなどECDSA対応したCAから別途証明書を取得する必要があり、またRSAを維持しようとすれば複数証明書をサポートするサーバ実装(nginx 1.15など)が必要。

openssl cipherに明示指定しなくても、TLSv1.3を選択した時点でTLSv1.3で導入されたKx/Au=Anyな3つのcipherは選択される。


#### ssl_prefer_server_ciphers off

以前のconfigでは3des/rc4など比較的安全でないcipherを含めている古いブラウザを想定していたため、優先順はサーバ指定で回避していた。
サポート対象のブラウザが絞られ、サポートcipherがすべて問題の無い妥当な順序に改善されたため優先順指定をする必要はなくなった。クライアント側で最も性能の出るものを使うことができる。

サーバの命令セットで性能向上するAESGCMを優先したければonでも構わないが、その場合は指定順序を管理する必要がある。

#### RFC 7919 ffdhe2048

Ephemeral DH用のパラメータにRFC 7919で推奨される既知のパラメータを使用する。
https://qiita.com/n-i-e/items/fac121aa5b2a3d16a632

1024bitなど弱いパラメータを使うことは避けるべきとされていたが、現状破れていないと考えられる2048bitなら共通であること自体に問題は無い。
むしろ、生成手順がわかっていて安全性下限を評価できる既知パラメータを使うほうが、安全性が評価できないランダムパラメータに依存するよりも望ましいということだろう。

また、将来既知のパラメータがそのサイズ（推奨例では2048bit）で安全でなくなったと考えられる場合、実装側でそのサイズのDHパラメータは拒否されるかDHが無効化され、ランダム生成であろうとなかろうとビット数を増やすかECに移行する必要がある。結局移行が必要となるのは変わらない。

実装のサポートが必要になるが、TLSハンドシェイクのECサポート曲線を示すelliptic_curves拡張と同様に、クライアントが安全と考える既知のDHパラメータを申告することで、DHパラメータに関する互換性問題を回避できる。複数のDHパラメータから合意可能なものを選択するといったことも可能になる。
ブラウザが対応するよりDHが廃止されてECDHへ完全移行するほうが早そう……。

個人的にセキュリティレベルがだいたい対称鍵128bit相当なECDH secp257あたりと同じffdhe3072にしてしまいたいところ。
そうするとDH<=2048bitまで対応なjava6あたりが死ぬのでold config
[PHP]ヘッダーの上に隙間が空く問題

##はじめに
PHPファイルでヘッダーをつくっていて、上に隙間が空いたので解消方法を探った。


##わかったこと
❶ キャッシュが溜まっている可能性
❷ phpの`include(['hoge']);`関数が影響を及ぼしてる可能性
❸ 単純にcssで`top: 0;`をあててみる

##メモ
###環境
- PHPファイルにHTMLとCSSを使用している。

###解消方法の検証

###❶ キャッシュが溜まっている可能性
　　キャッシュを一週間分消したが効果なし



###❷ phpの`include(['hoge']);`関数が影響を及ぼしてる可能性
　　文字種類を`UTF-8`から`UTF-8N`に変更することで解消できるとのことだったが効果なし


###❸ 単純にcssで`top: 0;`をあててみる
　　隙間が解消されて解決に至った。


###気づき

- 単純にcssで消すことができた。
    - `include(['hoge'])`が影響を及ぼしていたのは間違いないようだった。



### 参考サイト
https://okwave.jp/qa/q8630179.html
http://kagan.hatenablog.com/entry/2014/08/09/190812
【pugのコメント】HTML方式のコメントとスラッシュの使い分け

## pugのコメントにはHTML方式のコメントではなくスラッシュを使おう
pugのコメントにはHTMLのコメントの
`<!-- コメント -->`
のような形と、
`// コメント`
というスラッシュを使ったコメントがあります。

使い分けについてです。
`// コメント`を使うと、その行の階層以下のpugもコメントとなります。
つまり、`// コメント`はその行の階層以下もコメントにしたいときに使うと良いです。一時的にコメントアウトしたい場合がよく当てはまると思います。

`<!-- コメント -->`はより柔軟に使えます。

この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
【#PowerApps】フォームの中にギャラリーを入れる方法

# 概要

1. フォームコントロールの中にギャラリーコントロールを入れる方法
2. ギャラリーコントロールの中にギャラリーコントロールを入れる方法
3. スクロールスクリーンの中にギャラリーを入れる方法


# 結論

すべて可能(2019/07/09時点)

# やり方

## 1 フォームコントロールの中にギャラリーコントロールを入れる

普通に挿入するのでは不可能なので

手順
1. フィールドプロパティのロックを解除
2. ギャラリーをスクリーンに対して配置
3. 配置したギャラリーを コピー or 切り取り
4. 配置したいデータカードを選択して貼り付け

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/662234f9-7d96-c9cf-beb0-dada95ce5162.png)


## 2 ギャラリーコントロールの中にギャラリーコントロールを入れる

普通に挿入してください。
ただし、ギャラリーの中のコントロールを指定した状態でないと入りません。

## 3 スクロールスクリーンの中にギャラリーを入れる方法

フォームと同じでコピー＆貼り付けで可能です
手順
1. ギャラリーをスクリーンに対して配置
2. 配置したギャラリーを コピー or 切り取り
3. 配置したいデータカードを選択して貼り付け

![2019-07-09-001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/5ac5960e-06be-1962-5fb9-21215b7c48c1.png)


# まとめ

1. **入らなかったら基本はコピー＆貼り付け**
2. ギャラリーは２階層まで可能（ただし、条件次第で１階層しかできない場合もあります。試してください。）

[こちらではサンプリアプリも公開しています](https://www.powerplatform.work/blog/2019/07/09/PowerApps%E3%81%A7%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E4%B8%AD%E3%81%AB%E3%82%AE%E3%83%A3%E3%83%A9%E3%83%AA%E3%83%BC%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B%E3%81%AB%E3%81%AF/)
Pythonのappendをよりはやく

## これはなに
Pythonのlistのメソッドの一つであるappendをはやくする話です．
私は "Hello World ﾁｮｯﾄﾃﾞｷﾙ" 程度なのでよく知られた事実かもしれません．

## 実行環境
* Python 3.6.7
* OS: Windows 10 Home 64bit 1903
* CPU: Pentium Gold G5400 (2C 4T)
* RAM: 8GB

## 実際にやってみる

### いつもの

```python:append_test.py
numbers = []

for n in range(10 ** 8):
    numbers.append(n)

# 15.14177393913269[sec]
```

```python
numbers = []

for n in range(10 ** 7):
    numbers.append(n)

# 1.565068006515503[sec]
```

### はやくする

```python:append_test_opt.py
numbers = []
numbers_append = numbers.append

for n in range(10 ** 8):
    numbers_append(n)

# 11.622382164001465[sec]
```

```python
numbers = []
numbers_append = numbers.append

for n in range(10 ** 7):
    numbers_append(n)

# 1.0725383758544922[sec]
```

揺らぎが大きいものの，はやくなります．

## なぜはやくなるのか
**ご存じの方ぜひご教授頂けると嬉しいです。**

**【追記】**
>`numbers.append(n)` は、変数辞書から `numbers` を捜し、`numbers`オブジェクトの中から `append`メソッドを取り出し、呼び出します。
`numbers_append(n)` は、変数辞書から `numbers_append` を探し出し、呼び出します。
参考： https://wiki.python.org/moin/PythonSpeed/PerformanceTips#Avoiding_dots...

とコメントにて教えていただきました．ありがとうございます．
railsアプリの始め＋チュートリアル1章

これからのrailsチュートリアルの記事は、チュートリアル2週目の方やある程度基礎は覚えた人向けに、
爆速でチュートリアルを終わらせるためのものになります。

簡単な解説とコードのみでチュートリアルを終わらせることができますので、
ほぼコピペをしながら復習ができるというものになっています。（私がそういう物があれば良いと思ったので自分で作ってる）
※ちなみに私は1週目はテスト無しでとりあえず仕組みだけ覚えて、2週目からテストともう一度仕組みを覚える事を前提でやっている

では、やっていきましょうー！

--------------------------------------------
※環境構築等はご自身で行ってください。リポジトリの作成から始めます。

手順
githubでリポジトリを作成する。
URLをコピーして
ubuntuで

```ruby:ubuntu
git clone git@github.com~~~~~~
cd (クローンしたリポジトリ）
rails _5.1.6_ new .
```

必要なGemを追加

```ruby:Gemfile

gem 'rails',        '5.1.6'
gem 'puma',         '3.9.1'
gem 'sass-rails',   '5.0.6'
gem 'uglifier',     '3.2.0'
gem 'coffee-rails', '4.2.2'
gem 'jquery-rails', '4.3.1'
gem 'turbolinks',   '5.0.1'
gem 'jbuilder',     '2.7.0'

group :development, :test do
  gem 'sqlite3', '1.3.13'
  gem 'byebug',  '9.0.6', platform: :mri
end

group :development do
  gem 'web-console',           '3.5.1'
  gem 'listen',                '3.1.5'
  gem 'spring',                '2.0.2'
  gem 'spring-watcher-listen', '2.0.1'
end

group :test do
  gem 'rails-controller-testing', '1.0.2'
  gem 'minitest',                 '5.10.3'
  gem 'minitest-reporters',       '1.1.14'
  gem 'guard',                    '2.13.0'
  gem 'guard-minitest',           '2.4.4'
end

# Windows環境ではtzinfo-dataというgemを含める必要があります
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

```
追加後、bundle installする

```ruby:ubuntu
bundle install

#怒られた場合,以下の順番で
bundle update
bundle install
```
herokuを使えるようにgemfileに

```ruby:Gemfile
group :production do
  gem 'pg', '0.20.0'
end
```
を追加して

```ruby:ubuntu
bundle install --without production
```
これは本番環境でのみ適用させるためのオプション

herokuのセットアップ

```ruby:ubuntu
git add -A
git commit -m "heroku setup"
heroku --version
heroku login --interactive
heroku keys:add
heroku create
git push heroku master


#名前を変えたい場合（URLに表示される所）
heroku rename ○○○
```
AIdemyのブロックチェーン発展Ⅰで学んだこと&講義内容の補足

# 前提

* この記事は2019/7/9にAIdemyのブロックチェーン発展Ⅰを受講した後、学んだことと理解に時間がかかったところ（個人的ハマりポイント）の備忘録です。
* 筆者はブロックチェーン勉強始めたばかりなので誤りがあるかもしれません。気がつけばすぐに修正します。
* AIdemyのリンク先
https://aidemy.net/courses

# 以下、学んだこととハマりポイント
## 公開鍵暗号方式の概要
公開鍵暗号方式の流れは以下の通り
 1. 受信者は送信者に対して公開鍵を送信する(公開する)。
 2. 送信者は公開鍵を使用して暗号文を作成する。
 3. 受信者に対して暗号文を送信する。
 4. 受信者は秘密鍵を使用して暗号文を復号する。

## 秘密鍵、公開鍵、ビットコインアドレスの生成

生成順は以下の通り

#### 1. 秘密鍵を"暗号学的に安全な方法で"ランダムに生成する

* 秘密鍵とはランダムな数字の並びのこと

* 言語に用意されている乱数器ではダメ。ビットコインでは、osの乱数器を用いて人由来のランダム性を用いて初期化される
 
#### 2. 公開鍵を秘密鍵から生成する

* secp256k1と呼ばれる楕円曲線暗号を用いてスカラー倍算により生成する

* 公開鍵は楕円曲線上の、ある点の座標のことである（つまりx=??,y=??という形）

* 公開鍵から秘密鍵を特定することは現実的な時間では困難

ハマりポイント①
講義の中で楕円曲線の式と図が出てきて、あたかもその式が下の図を表したもののように見える（筆者には見えた）が、実は違う。
問題の箇所↓
<img width="802" alt="スクリーンショット 2019-07-09 22.16.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402061/6fc3d075-4260-d487-32a4-71d949ee3a6a.png">
↑数学に強い人なら式と図が対応していないことは見た瞬間違うと分かるだろうし、実際微分とかしてみれば確かめられるのだが、筆者は「なんかおかしいよなー？？」という状態で30分も時間を消費してしまった。
※結局、以下のサイトの解説がとても分かり易かった↓
https://gaiax-blockchain.com/elliptic-curve-cryptography

#### 3. 公開鍵からビットコインアドレスを生成する

* 公開鍵から公開鍵ハッシュという20byteの数字を作り出し、次にその公開鍵ハッシュをBase58Checkと呼ばれる形にエンコードすることでビットコインアドレスが得られる

* 公開鍵ハッシュを生成する際は、２回ハッシュ関数にかける

* ２回ハッシュ関数かけることを「ダブルハッシュ」と呼び、ビットコインではあらゆる場面で用いられる

* Base58Checkという方式を用いてエンコード(一定の規則に従って符号に変換)することでビットコインアドレスを作成する

ハマりポイント②
ここで、いきなり初めて聞く「RIPEMD-160」が登場し、何のために使うのか解説もなく当たり前のように使おうとするので、「何それ？？」と戸惑った。
調べた結果、RIPEMD-160は「ライプエムディー160」と呼び、SHA-256と同じハッシュ関数である。SHA-256とRIPEMD-160違いは以下の通り

|  | SHA-256 | RIPEMD-160 |
|:-----------|------------|------------|
| 得られるハッシュ値の長さ | 64文字（256bit） | 40文字（160bit） |
| 開発元 | NSA（米国標準技術局） | オープンな学術コミュニティ |

ビットコインアドレスなどの短いハッシュ値を得たいときに、SHA-256からのRIPEMD-160というダブルハッシュが用いられる。ビットコインにおいては、その他基本的にはSHA-256を２回ともかけるダブルハッシュが用いられる。
※SHA-256とRIPEMD-160については以下のサイトでより詳しく解説されている↓
https://gaiax-blockchain.com/ripemd-160

## ウォレットの実装
ここからはまだ講義を受けていないので、受け次第更新する。（数日のうちに）
LeetCode / Palindrome Number

（[ブログ記事](https://mhiro216.hatenablog.com/entry/2019/07/09/231053)からの転載）

https://leetcode.com/problems/palindrome-number/

Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward.

Example 1:

Input: 121
Output: true
Example 2:

Input: -121
Output: false
Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.
Example 3:

Input: 10
Output: false
Explanation: Reads 01 from right to left. Therefore it is not a palindrome.

Follow up:

Coud you solve it without converting the integer to a string?

数値が回文になっているか判定する問題です。
Follow upにあるように、integerをstring型にして回文か判定する手法"以外"を探せ、と言われています。

#### 回答・解説

##### 解法1
とはいえまずは、integerをstringに変換し回文かどうか判定するコードを示しておきます。

```python
class Solution:
    def isPalindrome(self, x: int) -> bool:
        return str(x) == str(x)[::-1]
```

これは簡単なので、どれだけ短く書けるかが勝負ですね。問題はstringを使わない方法です。

##### 解法2
stringを使わずintegerのまま判定する際、全桁を比較してしまうとオーバーフローが起こり得ます。
そこで、上X桁と下X桁だけを比較して判定しよう、というのが2つ目のアイデアです。
つまり、"1221"であれば上2桁の"12"と"21"だけを取り出して判定し、
"121"などと桁数が奇数であれば、真ん中の桁は除いて判定します。

```python
class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x < 0 or (x % 10 == 0 and x != 0):
            return False
        revN = 0
        while x > revN:
            revN = revN * 10 + x % 10
            x //= 10
            print(x, revN)
        return x == revN or x == revN//10
```

上記では、負の値や下1桁が0の正の値といった回文にならないものは先にfalseと判定した上で、
xで上X桁を、revNで下X桁（をひっくり返した値）を計算します。
while loopをxの桁数がrevNの桁数を上回る間だけ回します。
上X桁は、x //= 10 と元の値を10で割った商を求めることで計算できます。
下X桁をひっくり返した値は、revN = revN * 10 + x % 10 と元の値を10で割った余りを出しながら、loopで10を掛けることで計算できます。
最後に、元の値の桁数が偶数の場合はx == revNで判定し、奇数の場合はx == revN//10で真ん中の桁は除いて判定します。

正直解法1の方が処理時間も明らかに短いし、stringを使わない動機は？なんですが、オーバーフローを避けるため桁を分けて判定するアイデアはいつか役に立つかも？しれません。
HTML&CSS：Ｗｅｂページ作成で詰まったところと解決策

未来電子テクノロジーでインターンをしている宮﨑です。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#はじめに
一から自己紹介ページを作るという課題のもと、さっそく作成をしていたのですが中々うまくいかず試行錯誤を繰り返し…
ということで、今回その試行錯誤で得た問題と私が行った解決法についてまとめてみます。
（解決策はあくまでも一例に過ぎず、他にも方法はあります）

#親要素のheightがヘン！
問題：要素が認識されずに高さが縮まってしまった
原因：floatしている要素は中身だと認識されない
解決策：floatした要素の親要素の最後に空のdiv要素を作り、そこにclearプロパティを使う

floatは文字通り要素を「浮かせる」プロパティです。
そのため親要素には中身として認識されず、背景とうまくかみ合わずにレイアウトが崩れることがあります。
clearを使うことでfloatが解除されます。


#＜a＞タグで上下のwidthやheightが調節できない
原因：インライン要素のままになっている
解決策：インラインブロック要素に変える

インライン要素では、widthやheight、paddingの上下などを指定できません。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450384/2b5af79e-4928-8118-4850-f3a125a96ef8.png" >



を書くことでそれらが指定できるようになります。

#自分が撮った写真の貼り付け方がわからない!
解決策：①写真をhtmlやcssと同じ階層のファイルに移動させる
　　　　②htmlのimgタグでsrcの" "の間に画像の情報(~.jpegや~pngなど)を入れる
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450384/da3f9ef3-6608-ba1d-7f5b-32d190d25bcb.png" >


#まとめ
自分で一から作ると、わかっていた気になっていただけのことがたくさん出てきました。
焦らずに基本的なことからしっかり理解していきたいです。
Optionalを含んだクロージャ引数があるSwiftメソッドをObjective-Cから使おうとしたらエラーが出たので回避した

nilかそうでないかで処理を分けるために、クロージャの引数をOptionalにしたSwiftのメソッドがあったのですが、
Objective-Cから使用するために@objc属性を付加したら、エラーが出て使えませんでした。
## エラー内容
>Method cannot be marked @objc because the type of the parameter 4 cannot be represented in Objective-C

## 🙅‍♂️エラーが出たメソッド定義
```swift:ViewController.swift
@objc public func go(completion: (SomeType?) -> ())
```

## 🙆‍♂️エラー回避のための代替策
### 引数と戻り値を囲み、クロージャ自体をOptionalにする
```swift:ViewController.swift
@objc public func go(completion: ((SomeType) -> ())?)
```

### 引数をOptionalにすることを諦める
```swift:ViewController.swift
@objc public func go(completion: (SomeType) -> ())
```

## この時の選んだ回避策
実際に行った回避策としては、クロージャを2つに分けました。

```swift:ViewController.swift
@objc public func go(success: (SomeType) -> (), failure: (SomeType) -> ())
```
あまり、遭遇機会もないかと思いますが、備忘録として書き残しておきます。
MaterializecssのCarouselを使用して、不特定多数の＠変数sをeachで表現する

# 概要
TECH::EXPERTのカリキュラムでオリジナルのミニアプリを作成する機会があり、
その一部のページでMaterializecssのCarouselを使用し、users_controller.rb
で定義した@usersをそれぞれ"carousel-item"で表現したので紹介します。
## MaterializecssのCarouselとは
画像をくるくると回せる機能です。
[![Image from Gyazo](https://i.gyazo.com/0b1f06c9caade35f10835a6572fb5407.png)](https://gyazo.com/0b1f06c9caade35f10835a6572fb5407)
https://materializecss.com/carousel.html
##自分が作成したページ紹介
[![Image from Gyazo](https://i.gyazo.com/156569060c479b9fd5be7cb8e16223d3.gif)](https://gyazo.com/156569060c479b9fd5be7cb8e16223d3)
画像が自動で切り替わる方法は
[こちら](https://qiita.com/drafts/1853b62416e2d21d3d4b/edit)を参照していただけば幸甚です（ついでにイイね:yum:)
##作成する前提
MaterializecssがCDNで読み込めている

##編集するファイル
・コントローラーファイル
・ビューファイル
###コントローラーファイル
```ruby:user_contoroller.rb
    def show
　　　　　user=User.find(params[:id])
       @users=User.where(training: user.training)
    end
```
上の例では、表示しているuserページのuserのtrainingと同じtrainingを持っている人を
@usersで定義してます。
###ビューファイル
```erb:show.html.erb
 <div class="card">
    <h6>この人と同じトレーニングが好きな人</h6>
      <div class="carousel #fafafa grey lighten-5" id="recommend_user" >
        <% users.each do |user| %>
          <a class="carousel-item" href= "/users/<%= user.id %>" data-id ="<%=user.id %>" >
            <%=user.nickname%>
            <img src="">
            <%= image_tag  image(user),class:'circle' %>
          </a>
        <%end%>
      </div>
 </div>
```
eachメソッドで"carousel-item"ごと表現しています。
名前とプロフ画像を描画してます。
変わらないReact VDOMをBabelで最適化

不思議なもので、少し前に悩んでいたことを解決するためのBabelプラグインにちょうどめぐりあうことができました。

## JSXの中身

Reactを書くときに使うJSXですが、実際にJavaScriptとして処理する際には`React.createElement`という関数（[リファレンス](https://ja.reactjs.org/docs/react-api.html#createelement)）に変換されます。

```jsx
// before

(<p>
  文章
  <a href="https://qiita.com/">Qiita</a>
</p>)

// after

React.createElement("p", null, 
  "文章", 
  React.createElement("a", { href: "https://qiita.com/" }, 
    "Qiita"
  )
);
```

`<br />`のような表記を見ればリテラルのようにも思えますが、実態としては関数呼び出しになっています。さらに、`React.createElement`の中身は引数チェックをして、与えられた引数をオブジェクトに詰め込む程度のシンプルなもので、特に**キャッシュなどはなされない**ので、`<br />`のようなごくシンプルなVDOMエレメントであっても、呼び出すたびに新しいものが作られます。

## 毎回生成するデメリット

もちろん、`React.createElement`は、本物のDOMの生成と比べれば、ずっと軽い処理です。とはいえ、全く同じ仮想DOMを何度も生成すると、以下のような点で無駄が発生します。

* `React.createElement`の実行時間
* 各回ごとに別なオブジェクトが生成するので、
 * メモリを消費し、ガベージコレクタにより負荷をかける
 * 比較しても一致しないので、そのVDOMを別なコンポーネントの引数にした場合に`React.memo`が効かなくなる

自分が[少し前にした投稿](https://qiita.com/jkr_2255/items/2e40f7c9ecf300e8d945#children%E3%81%A8reactmemo)では、最後のデメリットが気になったのでした。

## Babelで解決

何気なくBabelのChangeLogを読んでいたところ、[`@babel/plugin-transform-react-constant-elements`](https://babeljs.io/docs/en/babel-plugin-transform-react-constant-elements)というプラグインの存在を知りました。これは、JSXが同じスコープ内の変数を使っていない場合に。できるだけ上位のスコープ（完全に何も変わらない場合はトップスコープ）まで引き上げる、というものです、

```js:書かれていた例
// before
const Hr = () => {
  return <hr className="hr" />;
};

// after
const _ref = <hr className="hr" />;

const Hr = () => {
  return _ref;
};
```

手動でこのような作業をやっていたので、喜び勇んで`yarn add`したところで、望み通りの結果が得られるようになりました。ただ、（もちろん有害になることではなさそうとはいえ）`children`の中身の一部で変化しないエレメントも外側にくくりだされていて、けっこう積極的に処理しているんだなと感じた次第でした。
RyzenでのAVDでつまづいた話

Xamarin.Formsで初めてモバイルアプリ開発をしようとした矢先、いきなり大量のエラーメッセージが...![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457784/8068d481-3bf1-45bc-fa40-02321970e5e8.png)

Android Studioはどうだ？？と試してみてもエラーメッセージの嵐...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457784/96a0a9a4-820a-8edb-789b-8a9c3edebff0.png)
初めてのモバイル開発がこんなスタートだったら萎えますね。このエラーを治すために2日間ハマってしまいました...
##環境
CPU:Ryzen1700
OS:Windows10 Pro-バージョン1903
##問題
Xamarin.Forms,Android Studioでエミュレーターでのデバッグができない...
##解決
この問題はRyzenシリーズを使っているWindows10バージョン1903に起こるバグらしいです。解決策は単純。前のバージョンに戻す、またはWindows Insider Previewに登録するかです。
僕の場合、バージョン1903にしてから10日以上たっていてバージョンダウンできなかったので泣く泣くInsider Previewに...
プレリリースのバージョンなので不安定だけど、とりあえず無事(?)にAVDができるようになりました。
![スクリーンショット (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457784/dd0bf97e-c855-f46e-5e47-73dd7690cf14.png)
早くWindows公式バージョンでもこのバグ直してほしいですね....Microsoftさん頼みます！
(追記有)gitコマンドを拡張して複数のアカウント管理を楽にしたかった

## 追記
同僚からこんなものを教えていただいたので、今度からはこれでもいけそう。

https://github.com/github/hub
https://hub.github.com/hub-init.1.html

追記おわり。

---

めちゃしょぼいけど今まで知らなかった事なので備忘がてら。
## 出典
[gitコマンドの拡張 | hokaccha memo](https://hokaccha.hatenablog.com/entry/20110808/1312780876)
[Extend Git with Custom Commands](https://coderwall.com/p/bt93ia/extend-git-with-custom-commands)

## やりたかったこと
端的に言えば、プライベートで利用しているGithubに公開する為のリポジトリを作成する際、必要な設定をコマンド一発でできるようにしたかったのです。

私は現在勤めている職場で利用しているBitbucketのアカウントと、
プライベートで利用しているGithubのアカウントを、業務用に貸与されたPCで併用しています。

この時問題になるのが、新しいリポジトリを作成した場合にユーザー名、メールアドレスの設定がそれぞれで異なり、リポジトリを作成するたびに以下のようにちょこちょこと設定をしていかなければいけませんでした。(と思っていました)

```
hoge$ git init
Initialized empty Git repository in .../hoge/.git/
hoge$ git config --local user.name i-whammy
hoge$ git config --local user.email example@example.com
hoge$ git config --list
...
user.name=i-whammy
user.email=example@example.com
```

まあめんどくさいし、たまに忘れてGithub上に自分の仕事用のアドレスやら名前やらが公開されてしまって慌ててリポジトリを消して、などしたりしておりました。

## やったこと
- pathの通ってる場所(`/usr/local/bin`等)に以下のようなファイルを作成

`git-whammy`  

```
#/bin/sh

git init
git config --local user.name i-whammy
git config --local user.email example@example.com
```

- `chmod +x git-whammy`で実行権限付与

上記の手順で、自分のマシンで`git whammy`コマンドを叩くだけで、
プライベート用のGithubアカウントの設定がされた新しいリポジトリを作ることができるようになりました。

`git-XXX`という名称の実行可能なファイルをパスが通ったディレクトリに配置しておくことで、
`git XXX`というサブコマンドとして実行することができるようになるよ、というお話でした。

めでたしめでたし。
Postgresql 役立つコマンド メモ（1）

# 前提
仮想マシーンで作業する

# psqlで、クエリ結果を既存ファイルにエクスポート

```vim
¥o hoge.txt
select * frome xxxx;
¥q

```
> これをマウントされてるディレクトリ等でやると、クエリ結果をテキスト保存できる

# データベース接続
```vim
  psql -h ホスト名 -p ポート番号 -U ロール名 -d データベース名

  または

  psql -U xxx
```

# テーブル

### テーブル一覧の表示
```vim
¥dt;
```

### テーブル構造の表示
```vim
¥d テーブル名;
```

### テーブル内のデータを一覧
```vim
select * from テーブル名;
```

### 指定したカラムの内容を小さい順に表示
```vim
select * from テーブル名 order by カラム;
```

### 指定したカラムの内容を大きい順に表示
```vim
select * from テーブル名 order by カラム desc;
```

### 表示数指定
```vim
select * from テーブル名 limit 数;
```

### 表示の開始位置指定
```vim
select * from テーブル名 offset 数;
```

### カラム内の任意の文字を表示
```vim
select distinct カラム名 from テーブル名;
```

### カラム内の合計値
```vim
select sum(カラム名) from テーブル名;
```

### カラム内の最大値
```vim
select max(カラム名) from テーブル名;
```

### カラム内の最小値
```vim
select min(カラム名) from テーブル名;
```

### カラム内の平均値
```vim
select avg(カラム名) from テーブル名;
```

### データの更新
```vim
update テーブル名 set 更新内容;
```

### データの削除
```vim
delete from テーブル名 where 条件;
```

### テーブルのオーナーの変更
```vim
alter table テーブル名 owner to オーナー名;
```

# 参考
[https://qiita.com/H-A-L/items/fe8cb0e0ee0041ff3ceb](https://qiita.com/H-A-L/items/fe8cb0e0ee0041ff3ceb)
ナビゲーションドローワーのUIテスト

EspressoでUIテストを実施していて、ふと、ナビゲーションドローワーがある場合はどうなるんだろうと思い、やってみました。

####dependencyの追加

ナビゲーションドローワーのアクションは`espresso-contrib`のライブラリに入っているので追加しました。
その時、バージョン違いでコンフリクトが起こったので、重複しているものは除外します。

```kotlin:build.gradle(app)
androidTestImplementation ('com.android.support.test.espresso:espresso-contrib:3.0.2') {
        exclude group: 'com.android.support', module: 'support-annotations'
        exclude group: 'com.android.support', module: 'support-v4'
        exclude group: 'com.android.support', module: 'recyclerview-v7'
        exclude group: 'com.android.support', module: 'appcompat-v7'
        exclude group: 'com.android.support', module: 'design'
        exclude group: 'com.android.support', module: 'support-compat'
        exclude group: 'com.android.support', module: 'support-core-utils'
    }
```

これでボタンクリックと同じようにナビゲーションドローワーを開くアクションが使えるようになります。

####テストの記載

NavigatinViewは下記になります。

```kotlin:activity_main.xml
<android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />
```

```kotlin:MainActivityTest
    @Test
    fun navigationMenu_updatetime_exist() {
        onView(ViewMatchers.withId(R.id.drawer_layout)).perform(DrawerActions.open())
        Thread.sleep(1500)
        onView(withId(R.id.nav_view)).perform(NavigationViewActions.navigateTo(R.id.nav_slideshow))
        Thread.sleep(1500)
        onView(ViewMatchers.withId(R.id.updateTimeLabel)).check(matches(not(doesNotExist())))
    }
```

ナビゲーションドローワーを開くアクションは`DrawerActions.open()`になります。
開いたら、`NavigationViewActions.navigateTo(R.id.nav_slideshow)`の部分で、開いたドローワーに存在するメニューをタップしています。

実際にテストしてみて、思ったより画面の操作は担保できるなあと感じました。

####参照
[[Espresso] NavigationViewをNavigationViewActionsで操作してみようの話](https://qiita.com/operandoOS/items/05f650e7b7fe7e5189c2)
MySQLの基本

こんにちは。

記事を閲覧いただきありがとうございます。

プログラミングの勉強を始めてしばらく経ちましたが、SQLについてまともに学習したことがなかったため、復習がてら記事にしていきたいと思います。

学習に関してはドットインストールで行いました。

<h1>MySQLとは</h1>

○ オープンソースのデータベースシステム。

<h1>MySQLへ接続</h1>

○ MySQLの動作確認

```
$ sudo service mysql status
```

○ 以下のように表示で操作中

```
mysqld (pid  17137) を実行中...
```


○ rootユーザーでログイン

```
$ mysql -u root
```

○ 接続を終了

```
$ quit;
```

<h1>データベースの操作</h1>

○ データベースの作成

```
$ create database 'データベース名'
```

○ データベースの削除

```
$ drop database 'データベース名'
```

○ データベースの表示

```
$ show databases;
```

○ 操作対象のデータベース確認

```
select databese();
```

○ データベースを操作対象にする

```
$ use 'データベース名'；
```

<h1>作業用ユーザーの作成</h1>

```
○ まずルートユーザーでログイン

$ mysql -u root

以下コマンドで作業用ユーザー作成

＄　create user 'ユーザーネーム'@'どこからアクセスしてくるか？'　identified by 'パスワード';

全権限を与える

$ grant all on 'データベース名'.* to '作成したユーザー';

ルートユーザーから抜けて作業用ユーザーでログイン

$ mysql -u '作成したユーザー名'　-p

パスワード入力を求められるので入力すると接続できる

ユーザーの削除

$ drop user 'ユーザー名';
```

<h1>外部ファイルの実行</h1>

○ sqlファイルを作成

```
myapp.sql:

#該当のデータベースがあれば削除
drop database if exists 'データベース名';

#データベース作成
create database 'データベース名';

＃権限付与＆作業用ユーザーの作成
grant all on 'データベース名'.* '作成する作業用ユーザー'　identified by 'パスワード';
```


○ ファイルの実行
実行の方法は二つある

```
リダイレクションを使う方法

$ mysql -u root < 'ファイル名'

mySQLサーバにログインして行う方法
rootでログイン
source もしくは \. を使う

$ source ./'ファイル名'
```

<h1>テーブルの作成</h1>

○ 外部ファイルを作成

```
create_table.sql:

#テーブルの作成
create table 'テーブル名' (
  #'カラム名' 'データ型',
  id int unsigned,  　
  name varchar(20),　 
  score float,
);
```

○ データ型について

```
number ー 数値
  int           #整数
  float         #浮動小数点
  double        #浮動小数点より精度の高いデータ型
  int unsigned  # ＋ のみ使用

string ー 文字列
  char('文字数')　　 #固定長
  varchar（'文字数'）　#可変長　データによって長さが変わるもの
  text　　　　　　　  #可変長　どれくらいの長さになるかわからないもの

date/time ー 日時
  date
  time
  datatime

true/false ー 真偽値
  true = 1
  false = 0
```

<h1>テーブルにデータを挿入</h1>

```
テーブルにデータを挿入
insert into 'テーブル名' ('カラム名1','カラム名2') value ('値１',''値２)

テーブルの確認
＄ select * from 'テーブル名';


○ カラムに入力制限をかける

not null  #NUllを許さない
default   #デフォルトの値を指定
primary key #重複しない値にする　auto_incrementを付けると連番になる

例）
create table users (
  id int unsigned primary key auto_increment,
  name varchar(20) unique,
  score float default 0.0
);

結果：
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20)      | YES  | UNI | NULL    |                |
| score | float            | NO   |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+
```
```
○ カラムを後から追加

alter table 'テーブル名' add colmun '追加するカラム名' '型';

○ カラムの削除

alter table drop colmun 'カラム名';

○ 型の変更

alter table chage 'カラム名' '新しいカラム名' '型'；
```


<h1>まとめ</h1>
基本中の基本ですがSQLは覚えておく必要があるので引き続き勉強します！
ローカルの環境からRDSにデータベースを移行する

## ローカルの環境からRDSにデータベースを移行する

※自分用メモ

**mysqlからエクスポート**

    $ mysqldump -u ユーザー名 -p -h ホスト名 データベース名 > 追加するファイル名

エクスポートができたらアップロードを行う

 **FTPソフトなどを使ってアップロードする**

 **RDSにインポート**

    $ mysql -u RDSユーザー名 -p -h データベースのエンドポイント -P ポート番号 インポート先のデータベース名 < export.sql

 **mysqlに接続**

インポートが完了したら、mysqlに接続する

    $ mysql -u RDSで登録したユーザー名 -p -h データベースのエンドポイント -P ポート番号

パスワードが聞かれるので、入力してmysql内でデータベースが取り込めているか確認する
【CentOS】nmtuiコマンドにて変更したIPアドレスが反映されない場合の対処法

## nmtuiコマンドとは
Network Manager Text User Interfaceの略。
IPアドレスやデフォルトゲートウェイなどのネットワーク情報をGUIにて変更することが出来るコマンドのこと。

## 今回の事象
nmtuiコマンドを実行し、IPアドレス、デフォルトゲートウェイ変更後、
```# systemctl restart NetworkManager``` を実施したが、変更が反映されなかった。

## 環境
- CentOS Linux release 7.6.1810 (Core)

## 対処法
nmtuiコマンドを実行し、IPアドレス、デフォルトゲートウェイ変更後、以下のコマンドを実行することで解決。
``` # nmcli c down eth0; nmcli c up eth0 ``` 

## 解説
①ネットワークアダプタ(eth0)を停止する。
```# nmcli c down eth0```

②ネットワークアダプタ(eth0)を開始する。
```# nmcli c up eth0```

## 参考にした記事
https://server-setting.info/centos/network-config-c7.html#network-config-c7_1
HTML の 文字 の サイズ を 設定する ～CSS font-size: ピクセル数;～

# 目的
- HTMLファイルの文字のサイズを設定する方法をまとめる

# 押さえるポイント
- 文字のサイズを変更したい要素をCSSで指定してサイズを設定する。
- font-sizeプロパティを使用する。
- ピクセル数を用いて指定する。

# 書き方の例(CSS)

``` css
要素の名前かクラス名{
    font-size: ピクセル数;
}
```

# より具体的な例
〜サンプルコード〜
- 下記にHTMLファイルの内容を記載する。

``` html
<h1>おはようございます。</h1>
```

- CSSで上記のHTMLファイルのh1要素の文字の大きさを30pxにする設定を行う。
- 下記にCSSファイルの内容を記載する。

``` css
h1 {
    font-size: 30px;
}
```
[Swift 5]TabBarのボタン(TabBarItem)をタップで画面をModal表示する簡単な方法

TabBarControllerで実装したボトムタブを選択すると、通常は画面が切り替わります。
今回は、特殊なボタンとして画面をModal（下から上へ出現）表示させたい時の実装です。

（真ん中のボタンが丸く縁取られているアプリに多いと思います）

Modalで開きたい画面クラスが`TargetViewController`と仮定して解説していきます。
## ソースコード
```TabBarController.swift
import UIKit

final class TabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        delegate = self // UITabBarControllerDelegate
    }
}

// MARK: - UITabBarControllerDelegateに適合
extension TabBarController: UITabBarControllerDelegate {
    // TabBarItemが選択された時に呼ばれる
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        // TabBarItemタップでModal表示をする画面を指定して実装
        if viewController is TargetViewController {
            if let newVC = UIStoryboard(name: "Target", bundle: nil).instantiateInitialViewController() {
                tabBarController.present(newVC, animated: true, completion: nil)
                return false
            }
        }
        return true
    }
}
```
## 実装手順
1. `delegate = self`を書くのを忘れない
2. `extention`で`UITabBarControllerDelegate`に適合する
3. `tabBarController(_:shouldSelect:)->Bool`メソッドを実装
4. 開かれるViewControllerが対象のものだったら、という条件でif分岐
5. あとは、ViewControllerをインスタンス化し、`present(_:animated:completion)`メソッドで画面をModal表示させればOKです！

## NavigationControllerを使用している場合
TargetViewControllerでNavigationItemを使いたい等の理由でNavigationControllerを使用する場合

```TabBarController.swift
if viewController.children.first is TargetViewController {
```

というようにすればNavigationControllerが間にあっても判定可能です。

もし、もっと簡単な方法があればぜひ教えてください。
Chefにて改行コードを\r\nに変換するレシピ

#\nを\r\nに変換する。


以下の様なレシピで可能と思える。

```ruby
file '/tmp/abc' do
  content lazy {
    File.read(path).gsub(/\r?\n/, "\r\n")
  }
end

```

##想定使用ケース
gitでは改行コードとして\nを用い、そのファイルをWindowsなどにcookbook_fileを用いて配布する場合などに、合わせて使用することを想定。

##考慮事項

- マルチバイト文字中に\nがあった場合は考慮していない。(\nが文字中に現れることはありえるのだろうか。。)
- ?を用いて冪等性を担保。
- OhaiよりWindows環境なら実行などの条件があればbetterか。

##検討事項
- FileEditに行を分割させればマルチバイトでも大丈夫か？
- 対象システムにnkfが入っているor入れても良いならnkf -Lwなども使えそう。
- each_lineやFile.readlines("foo").each { |line| ... } などは\r\nをどう扱うのか要確認。
HTML の ひな型 の 記載方法

# 目的
- HTMLファイルのひな型の記載方法をまとめる。

# この記事のターゲット
- HTMLファイルの最初の記載方法がわからない方
- HTMLを書きたいが最初に何をすれば良いかわからない方
- HTMLファイルのひな型を知りたい方
- HTMLひな型を一から学んでいて嫌になってしまった方
- ひな型のテンプレートをコピーしたい方

# 押さえておきたいポイント
1. HTMLファイルを書くにはひな型が必要になる
1. HTMLファイルのひな型とは、HTMLファイルが正常に表示されるようにする設定のこと
1. ひな型はテンプレートのようなものなのでHTMLファイルを作成したら最初に記載する

# ひな型の書き方
ひな型本体の説明は後述する。

- 「ページタイトル」には任意のタイトル(ブラウザのタブ表示される文字)を記入する。
- 「CSSファイルまでのパスとファイル名」はひな型を書くHTMLファイルからCSSファイルまでのファイルパスを相対パスで記載する。  
※HTMLファイルとCSSファイル同じフォルダ階層に設置している場合はCSSファイル名のみの指定でOK
※ひな型が必要な方は下記をそのままコピーして上記の必要箇所を記入すれば使用できます。

``` html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>ページタイトル</title>
    <link rel="stylesheet" href="CSSファイルまでのパスとファイル名">
  </head>
  <body>
    <header>
    </header>
    <div class="main">
    </div>
    <footer>
    </footer>
  </body>
</html>
```

# ひな型の内容の説明
下記のひな型の番号にリンクした説明を下記に記す。
- ①
文章の解釈に使用するDTD(Document Type Definition)と呼ばれる文書の型を宣言している。
宣言したHTMLのバージョンで使用する要素(タグ)や属性の名前などの情報が定義される。
- ②
htmlタグで囲まれた文書がHTML文書で記載することを指定している。
※ちなみにHTMLは「Hyper Text Markup Language」の頭文字を取ったもの
- ③
headタグの中に本HTMLファイルの設定を記載する。
設定する最低限の内容は下記の3つ
   
   1. 文字コード
   1. ブラウザタブに表示されるページタイトル
   1. リンクするCSSファイルのファイルパスかファイル名

※設定の記載内容は下記で詳しく説明する。
- ④
metaタグのcharset属性で文字コードを指定する。
文字コードは特に意図がない場合utf-8を指定する。
- ⑤
titleタグでページのタイトルを指定する。
titleタグ囲んだ文字がページのタイトルとなり、ブラウザのタブに表示される。
- ⑥
linkタグのrel属性でstylesheetを与えることによりCSSファイルを読み込む設定をする。
linkタグのhref属性でCSSのファイルパスかファイル名を与えることによりCSSファイルを読み込む。
※CSSファイルの場所による記載方法の違いは本記事に後述する。
- ⑦
bodyタグを作成しHTMLで実際に表示させたい内容を記載していく。
bodyタグ内に作成する要素の基本は下記の3つ  
※この部分は好みなので鵜呑みにしなくてOK！

   1. headerタグ
   1. divタグ(クラス名はmain)
   1. footerタグ

- ⑧  
headerタグを作成する。  
表示させる内容のheaderに当たる部分を記載する。
- ⑨  
クラス名を mainとしたdivタグを作成する。  
表示させる内容のmainに当たる部分を記載する。
- ⑩  
footerタグを作成する。  
表示させる内容のfooterに当たる部分を記載する。  

``` html
<!-- ① -->
<!DOCTYPE html>

<!-- ② -->
<html>

  <!-- ③ -->
  <head>

    <!-- ④ -->
    <meta charset="utf-8">

    <!-- ⑤ -->
    <title>ページタイトル</title>

    <!-- ⑥ -->
    <link rel="stylesheet" href="CSSファイルまでのパスとファイル名">

  </head>

  <!-- ⑦ -->
  <body>

    <!-- ⑧ -->
    <header>
    </header>

    <!-- ⑨ -->
    <div class="main">
    </div>

    <!-- ⑩ -->
    <footer>
    </footer>
  </body>
</html>
```

# CSSの設置場所の違いによる指定方法時の違い

具体的な例を用いてhead内でのCSSファイルの読み込み指定方法の違いをまとめる。
また、HTMLファイル名は「tropical_fish.html」とし、CSSファイル名は「preference_file.css」とする。

### CSSファイルがHTMLファイルと同じフォルダ階層に存在するとき
フォルダ階層を下記に記載する。

``` 
# HTMLファイルが設置してあるフォルダ内の構成

tropical_fish.html
preference_file.css
```

上記のファイル構成の場合はtropical_fish.htmlのheadのlinkにて下記のようにCSSファイルを指定する。

``` html
<link rel="stylesheet" href="preference_file.css">
```

### CSSファイルがHTMLファイルの一つ下のフォルダ「LOVE_CSS」の中に存在するとき
※本来CSSファイルを格納するフォルダはわかりやすい名前にするべきです。
フォルダ階層を下記に記載する。

```
tropical_fish.html
LOVE_CSSフォルダ
    ┗preference_file.css
```

上記のファイル構成の場合はtropical_fish.htmlのheadのlinkにて下記のようにCSSファイルを指定する。

``` html
<link rel="stylesheet" href="./LOVE_CSS/preference_file.css">
```

# まとめ
- HTMLファイルのひな型の記載をまとめた。
- CSSファイルの設定にはHTMLファイルとの位置関係を意識する。

# 超重要な追記(2019/07/09)
※下記の内容はVisual Studio Codeエディタを使用して
日付範囲で集計しデータ件数を取得・集計する

# 日付範囲にあるデータ件数を取得・集計する

## モデル

* 集計要素
 - start_date/end_date：開始日、終了日をもつ

* 分類するための属性
 - item_type：タイプ
 - genre_cd:種別

## 最終的な目標 表のイメージ

日付を縦軸に、その日付が開始日・終了日に含まれているレコード件数
締め切りとその件数のようなイメージ

締め切り| 件数 
-------+-------
7/1 |10件
7/2 |4件
7/3 |1件
7/4 |0件


## --　１）テーブル作成
```
create table item(
    item_no serial primary key,
    item_type integer not null,
    genre_cd integer not null,
    start_date date,
    end_date date,
    start_time time
);
```
## サンプル投入

insert into item (item_type,genre_cd,start_date,end_date) values
  (1,100,'2019-07-01','2019-07-03'),
  (1,100,'2019-07-01','2019-07-02'),
  (1,100,'2019-07-02','2019-07-02'),
  (1,100,'2019-07-03','2019-07-03'),
  (1,100,'2019-07-05','2019-07-05'),
  (1,102,'2019-07-11','2019-07-12'),
  (1,102,'2019-07-12','2019-07-12'),
  (1,102,'2019-07-14','2019-07-14'),
  (1,102,'2019-07-14','2019-07-15'),
  (1,102,'2019-07-15','2019-07-16')
;


## 縦軸になる日付
- 範囲＝最小値/最大値から求める。
- GENERATE_SERIESが便利

```

SELECT GENERATE_SERIES(
      (select cast(min(start_date) as date) from item as X) 
    , (select cast(max(end_date) as date) from item as Y)
    ,'1 day'
);
```


## 小計・集計 表示

```

select
    CZ.axis
    ,count(CZ.item_no)

from
    (
    SELECT
        TO_DATE(TO_CHAR(X.axis, 'YYYY/MM/DD'),'YYYY/MM/DD') as axis
        ,CX.item_no
        ,CX.item_type
        ,CX.genre_cd
        ,CX.start_date
        ,CX.end_date
    from
        ( SELECT GENERATE_SERIES(
              (select cast(min(start_date) as date) from item  as X) 
            , (select cast(max(end_date) as date) from item  as Y)
            ,'1 day'
        )as axis
    ) as X
    LEFT JOIN
        item as CX
    ON
        (CX.start_date<= X.axis and CX.end_date>=X.axis)
    where
        item_no <> 0
    order by
        X.axis
    ) as CZ
group by
    CZ.axis
order by
    CZ.axis
;
```


## 結果
    axis    | count
------------+-------
 2019-07-01 |     2
 2019-07-02 |     3
 2019-07-03 |     2
 2019-07-05 |     1
 2019-07-11 |     1
 2019-07-12 |     2
 2019-07-14 |     2
 2019-07-15 |     2
 2019-07-16 |     1
(9 行)
Excelショートカット(Win Mac)

## 概要
+ 個人的によく使うものを記載してあります。
+ 今年からMac版Excelも使うようになったのでMac用のショートカットも載せてあります。

## Windows(10で確認)
|コマンド|用途|
|:--|:--|
|Alt + shift + カーソル左|グループ化|
|Alt + shift + カーソル右|グループ解除|
|Alt + O + H + R|シート名変更|
|Alt + O + D|条件付き書式設定|
|shift + F11|シート追加|
|Alt + E + L|シート削除|
|Alt + O + C + A|列幅を調整|
|ctrl + 5|取り消し線をつける|
|Alt + F11|VBAエディタ起動|

## Mac(High Sierraで確認)
|コマンド|用途|
|:--|:--|
|ctrl + U|セル内フォーカスイン※F2と同様|
|command +shift + +|行追加|
|command + -|行削除|
|shift + F11|シート追加</br>※自環境だと失敗することが多い。</br>システム環境設定からF11に割り当たっているMission Controlを解除する必要がある。|
|command + )|行非表示|
|command + shift + (|行再表示|
|option + Enter|セル内改行|
SQLアンチパターン-7章 マルチカラムアトリビュート-まとめ


テーブルを設計する際に、属性の値が複数ある場合はどうしましょうか。
Wordpressを例にしてみます。
記事には複数のカテゴリ、タグがつける事ができますよね。
DB上ではそれらをどうやって表現するのでしょうか。

下記のようなテーブル設計はアンチパターンとなります。

|post_id|title|category_1|category_2|category_3|
|:--:|:--:|:--:|:--:|:--:|
|1|今日は晴れ|日常|お出かけ|家族|
|2|今日は曇り|日常|||
|3|今日は雨|日常|家事||

### テーブル定義の更新する時
この場合、カテゴリーが増えたらどうなるでしょう。
テーブル定義を更新しなければなりません。
また、NULL値も入ってしまうので、無駄な列が存在してしまいます。
更新する時はテーブルをロックする必要が出てくるかもしれません。

### 検索する時
複数の列からある値を元に検索する場合、下記のようなSQLになります。

```sql
SELECT * FROM Posts
WHERE (category_1 = "日常" OR category_2 = "日常" OR category_3 = "日常") 
AND 
WHERE (category_1 = "家族" OR category_2 = "家族" OR category_3 = "家族") 
```
このような検索クエリは冗長です。


### 更新を行う時
値の上書きを防ぐためには、まず ` SELECT`文で値が入っていないかを確かめ
次に`UPDATE`文を発行することになります。


### 値の一意性
`category_1` `category_2` `category_3` それぞれに対して
値が重複しないようにするためには手間がかかります。


### このアンチパターンが許されるケース
- `category_hogehoge` が増えないという事
- `category_hogehoge` のそれぞれがそれぞれの意味を個別に持っているという事

以上に当てはまる場合はこのアンチパターンを用いても大丈夫かもしれません。


## 解決策

### 従属テーブル
今回の例では、`post_id` を外部キーとして持つCategoryテーブルを作成すれば良いでしょう。
あるカテゴリが紐づけられている記事にどのようなものがあるか、検索する事が容易になります。

必要な数だけカテゴリを記事に対して紐づける事ができます。
また、`PRIMARY KEY`制約 もしくは `UNIQUE `制約を利用する事で、同じカテゴリが記事に結びつけられるといった事も防ぐ事ができます。
論文arxiv1302.5843 実装その２

#1. 本記事の概要

NPな色々な問題に対してIsingで定式化した論文arxiv1302.5843があります。
D-waveの勉強がてら、それを実装してみようというもの。

https://arxiv.org/abs/1302.5843

#2. 本記事の想定読者

- 最適化がなんとなくわかっている
- 理屈はいいから使えればいいや
- Pythonなんとなくわかる

レベルの人

#3. 対象の問題
「2.2. Graph Partitioning」を対象とする。

頂点の数 $N=|V|$が偶数である無向グラフ $ G=(V,E) $ において、頂点数が同数の$N/2$ となるようグラフを分割した際に、エッジ数（辺）が最小となる分割方法は？

#4. Ising式

論文を見ると2つのパーツに分かれていますね。頂点が同数となるような制限事項$H_A$と辺のCut方法$H_B$からなるようです。
すなわち、
$$ H_A = A(\sum_{n=1}^N s_i)^2 　$$

$$ H_B = B(\sum_{(uv) \in E} \frac{1-s_us_v}{2}) 　$$

だそうです。（Qiitaはきれいな数式が書けるので気持ちいですね！）

さて、グダグダ言わず、実装に移りましょう。（ほんと、Pyqubo超絶便利です。というか私、Pyquboなくしては何もできないんですが、いいのか！？）

```python:問題生成

%matplotlib inline
import matplotlib.pyplot as plt
import networkx as nx
import numpy as np
import random
from pyqubo import Placeholder,Array,Constraint,Sum,solve_qubo

SIZE = 8
G = nx.Graph()

#サイズ分のVertixを作成し、適当にEdgeをつなぐ
for i in range(SIZE):
    G.add_node(i)
    if i != 0:
        for j in range(random.randint(1,6)):
            New_line = random.randint(0,i-1)
            if (G.get_edge_data(i,New_line) == None):
                G.add_edge(i,New_line,W=1)

#グラフの出来具合を確認する
pos = nx.spring_layout(G, k=5.,seed=0)
nx.draw_networkx(G,pos)
plt.rcParams['figure.figsize'] = (7.0, 7.0)
plt.show()
```

今回生成された問題は以下のようなもの。

![SnapCrab_NoName_2019-7-9_21-55-6_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121950/f2fc1649-79c2-f501-6de0-94712067411f.png)

```python:SAで解を確認
#ハミルトニアンを構成
A = Placeholder("A")
B = Placeholder("B")

x = Array.create('x',SIZE,'SPIN')

H_A = Constraint(Sum(0,SIZE, lambda i:x[i])**2,label="H_A")

H_B = 0.0
for i in range(SIZE):
    for j in range(SIZE):
        if (G.get_edge_data(i,j) != None):
            H_B = H_B + (1.0 - x[i] * x[j]) / 2.0
            
H = A * H_A + B * H_B


# モデルをコンパイル
model = H.compile()
# QUBOを作成
feed_dict = {'A': 0.2,'B':0.1}
qubo, offset = model.to_qubo(feed_dict=feed_dict)

#PyquboのSAで解いてみる
sol = solve_qubo(qubo)
#結果表示
pos = nx.spring_layout(G, k=5.,seed=0)
nx.draw_networkx(G,pos,node_color=list(sol.values()))
plt.rcParams['figure.figsize'] = (7.0, 7.0)
plt.show()
```


![SnapCrab_NoName_2019-7-9_21-58-38_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121950/2d96496d-03d0-a56b-e366-b16d69fd651c.png)


次にD-waveで試します。

```python:D-WAVEで実行
from dwave.system.samplers import DWaveSampler
from dwave.system.composites import EmbeddingComposite
import dimod

sampler = EmbeddingComposite(DWaveSampler(solver='DW_2000Q_VFYC_5'))
response = sampler.sample_qubo(qubo, num_reads=100)

result = []
result = model.decode_dimod_response(response,feed_dict=feed_dict)

pos = nx.spring_layout(G, k=5.,seed=0)
nx.draw_networkx(G,pos,node_color=list(result[0][0]['x'].values()))
plt.rcParams['figure.figsize'] = (7.0, 7.0)
plt.show()

```

![SnapCrab_NoName_2019-7-9_22-2-0_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121950/0041fc13-eafb-6bf4-aa11-cf361ec73fb3.png)

お、無事いい感じの答えが出ました！

めでたしめでたし
HTMLメール配信、表示できない端末はどうするの？

# メール受信側の表示について

①TEXTメール
　⇒表示可能

②HTMLメール
　・HTML認識可能アプリ
　　⇒表示可能
　・キャリア用にカスタマイズされたHTML認識可能アプリ
　　⇒表示可能（一部デザイン崩れ）
　・HTML認識不可アプリ（ＭＭＳ含む）
　　⇒表示不可 or デザイン崩れで表示

　※MMSとは、Eメールをラインのように表示するアプリ

# HTMLメールを使用する場合に、どのような対応をすればよいか
①マルチパート配信を行う。
　（TEXTとHTMLメールを同時に送り、受け取り側で表示可能な方が表示される）
　⇒調べてみたが、メール配信大手は基本的にこの対応

②メールアドレスのドメインでTEXTメールを送信するか、
　HTMLメールを送信するか切り替える
　⇒一部のドメインは判定できるかもしれないが、完ぺきではない。
　　また、メール配信大手が行っていないことから現実的ではないのだろう。

③ユーザーがメールアドレスを登録する際にHTMLメールを受け取るか、
　TEXTメールを受け取るか登録させる。　

④HTMLメールの本文に「デザインが崩れる場合はこちら」とＵＲＬ表示
　デザインが崩れる場合に、ウェブページへ誘導する。
　（もちろん、メールと同内容のウェブページを事前作成する必要あり）