OmniAICreator/Qiita-1.07M huggingface dataset:
ラスボス系後輩ヒロインAIチャットボットを作りたい・環境の構築〜Pythonの基礎

## 前哨戦・VagrantにPython環境を作る

```bash
$ vagrant init
$ vi Vagrantfile
```

[Vagrantfile](https://gist.github.com/perpouh/9af2c825caddcf6236a89fbcf3bc0108)
※埋め込みもコードシンタックスもできなかったので（<<-SHELLのあたりでおかしくなる）gistのリンクだけ張っておきます。

これで `vagrant up` 一発でpython環境ができるはずだったのですが、pyenvインストールの途中、PATH書き込みのあたりでコケてるっぽくて何だろうな……？　コピペすると動くのでちょっとよくわからない。

でもまあとりあえずpython作業用環境が発生しました。やったね。
少なくとも今回はフォルダ共有は使わないと思ってそのように設定しました。vbguest調子悪いし。

```bash
$ python --version
Python 3.6.5
```

## 本戦・Python入門

昼休みに本屋に行って[入門Python3](https://www.oreilly.co.jp/books/9784873117386/)買ってきたんですけど想像してた倍くらいの厚みがあってビビりました。500ページオーバー……鈍器……

### 四則演算

|演算子|意味|例|結果|
|---|---|---|---|
|+|加算|1 + 2|3|
|-|減算|1 - 2|-1|
|\*|乗算|1 \* 2|2|
|/|浮動小数点数の除算|1 / 2|0.5|
|//|整数の除算（切り捨て）|1 // 2|0|
|%|剰余|1 % 2|1|
|\**|指数|1 \** 2|1|

### 基数
基本的な基数は10であるが、2, 8, 16なども使用できる。

```
>>> 0b10
2
>>> 0o10
8
>>> 0x10
16
```

この表現なんかすごく久し振りに見た気がすると思って調べ直したところ、Javaすらこの記法ではないからC言語以来じつに十年ぶりの邂逅でした（OCとかC++とか履修してないので）。ぐええ。JavaScriptもこの記法ですけど使った覚えはないな……
longは無く、intは **任意のサイズ** である。`10**100**2` すら格納できる。強い。

### 文字列の連結

文字列の連結は `+` で行う。ただし **リテラル文字列の場合は並べるだけでも連結できる** 。

```
>>> "Hello" + "World"
'HelloWorld'
>>> "Hello" "World"
'HelloWorld'
```
※シングルクォートが出力されているのはインタプリタ自動エコーのため。横着して `print()` を使っていないせいです。以下同じ。

さらに `*` 演算子によって **文字列を繰り返すことができる** 。

```
>>> "Ya"*7
'YaYaYaYaYaYaYa'
```

何に使うんだろうこれ……:thinking_face:

### 文字列のスライス

文字列からの文字の抽出はこれもRubyと同じく `[]` を使用する。末尾の表現は `[-1]` となる。

```
>>> str = "入門Python3"
>>> str[1]
'門'
>>> str[-1]
'3'
```

`[start:end:step]` によるスライス

```
>>> str = "入門Python3"
>>> str[1:8:2]
'門yhn'
```

 - `[:]` は文字列の先頭から末尾まですべてを取り出す（やる意味がわからない）  
 - `[start:]` はstartから文字列の末尾までを取り出す。  
 - `[:end]` は文字列の先頭からend **の前** までを取り出す。10と指定した場合9まで。
 - ステップに負の値を設定すると逆にステップしていく。

```
>>> str = "abcdefghijklmnopqrstuvwxyz"
>>> str[-1::-1]
'zyxwvutsrqponmlkjihgfedcba'
>>> str[-1:0:-1]
'zyxwvutsrqponmlkjihgfedcb'
```

なるほどendの手前までだから逆ステップでaまで遡るにはendを省略することになるのか。

### splitとjoin

このあたりはこともなし。PHPからRubyに行ったときはぎょっとしたけどRubyやってからだと違和感がない。

```
>>> "a,b,c".split(',')
['a', 'b', 'c']
>>> ','.join(['a','b','c'])
'a,b,c'
```

### 大文字と小文字の区別、配置
```
>>> str = "Come, woo me, woo me, for now I am in a holiday humor."
>>> str.strip('.')
'Come, woo me, woo me, for now I am in a holiday humor'
>>> str.capitalize()
'Come, woo me, woo me, for now i am in a holiday humor.'
>>> str.title()
'Come, Woo Me, Woo Me, For Now I Am In A Holiday Humor.'
>>> str.upper()
'COME, WOO ME, WOO ME, FOR NOW I AM IN A HOLIDAY HUMOR.'
>>> str.lower()
'come, woo me, woo me, for now i am in a holiday humor.'
>>> str.swapcase()
'cOME, WOO ME, WOO ME, FOR NOW i AM IN A HOLIDAY HUMOR.'
```
文章はシェイクスピア「お気に召すまま(As You Like It)」より。
ちなみに

```
>>> str = "あいうえお"
>>> str.lower()
'あいうえお'
```
そりゃそうか。これで「ぁぃぅぇぉ」とか出されたらびっくりするところだった（そもそもそれはlowercaseとは言わない）

二章の終わりまで来たので一旦ここで区切ります。存外伸びてしまった。
四章のコード構造までは最低限行かなきゃいけないとして、あと二日くらい。ページ数にして100ページ弱なので多少コードいじって遊んでも収まるでしょう。
Udemyの講座の目次を参考に予定立ててたんですけど、あの講座、44分半で何をどこまでやるつもりだったのか……？

初日感想。Pythonたのしい！好きな言語の好きなところが詰め込んである感。新鮮なのにストレスはない。すごい。手に馴染んだ書式にプラス便利なものが積んであるという感触。
入門Python3もまず読み物としてとても読みやすい、面白いです。翻訳もいいのだろうな。良きスタートになりました。
nodejsのサンプルページをherokuで公開する

・模索しながら書くぞ 
・環境はubuntu、バージョンはわからないが多分最新
・言葉の使い方がわかっていない
・Glitchというサイトが使いやすかったが、socket.ioが使えないためherokuでやることに。ここに備忘としてメモ。

参考にしたページ、無断リンクだけど
https://developer.salesforce.com/events/webinars/nodejs_heroku_0525/
http://tacamy.hatenablog.com/entry/2013/02/16/235127
https://devcenter.heroku.com/articles/heroku-cli
https://qiita.com/chihiro/items/5c3ff400f6cb99deb945
https://qiita.com/yoh-nak/items/80e51197410c7f956ccd
https://qiita.com/sayama0402/items/e2c9e65786259dc55e11


やったこと

1, herokuに登録

2, gitに登録（githubに登録すればgitに登録したことになるの？過去に色々やってわからなくなってしまった）

3, gitをインストール

```
$sudo apt-get install git-all
```

4, herokuのtoolbeltをインストール
（わからなければ、https://devcenter.heroku.com/articles/heroku-cli にアクセスするとなんかうまく行く）
つまり、このページの言うとおりに、

```
$ sudo snap install --classic heroku
```
を実行

(もしいろいろやって入ってるかどうか分からなくなっちゃったら

```
$ heroku -v
```
でOK）

5, それから下記を実行、ブラウザに飛ばされてログインする

```
$ heroku login
```

6, プロジェクトを作る
プロジェクトがあるディレクトリにcdで移動してから、

```
$ heroku create [任意の名前]
```

でプロジェクトができる。$ heroku apps とかherokuホームページのマイページみたいなところでプロジェクトの一覧を確認できる

ここから手探り、すでにあるアプリのディレクトリ内で作業しているがそれが正しいのか？
それから

7, git リポジトリを初期化

```
$ git init

$ git status
```
8, それからProcfileを作成

```ruby:Procfile
web: node bin/www
```

9, それからgitの操作

```
$ git add Procfile *.js *.json public views routes bin
  //これが先にできた

$ git config --global user.email "[任意のメアド]"
　//ログインをここでした

$ git commit -m "[任意のコメント]"
  //コミットをした
```
最後のをすると、コマンドにこんなのが出る

```
[master (root-commit) ea77c2d] 2/28にコミット
 10 files changed,  180 insertions(+)
 create mode 100644 Procfile
 create mode 100644 app.js
 create mode 100755 bin/www
 create mode 100644 package.json
 create mode 100644 public/stylesheets/style.css
 create mode 100644 routes/index.js
 create mode 100644 routes/users.js
 create mode 100644 views/error.jade
 create mode 100644 views/index.jade
 create mode 100644 views/layout.jade
```

多分うまく行っている


10, それから、「.gitignore」という名前のファイルを作り、中に

```ruby:.gitignore
node_modules
```
とだけ書く。.から始まるファイルは隠しファイルなので、デフォルトでは表示されていない。

11, gitにリモートリポジトリを作成

```
$ git remote add heroku git@heroku.com:[プロジェクトの名前].git
```
※[プロジェクトの名前]のところには、heroku create []でいれたやつを入れる

実行しても何も応答がないのでやや怖い

（以下でリモートリポジトリ削除

```
git remote remove heroku
```
）

（以下のように出たら
```
fatal: 'heroku' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```
、11をすれば良い）

.git/configもうまく行っているっぽいのを確認し、気を取り直して、

12, gitにpush

```
$ git push heroku master
```
を実行

13, それから

```
$ heroku start
```
を実行。startではなくrestartだと怒られたが知らんしどっちでもいい

・そしてheroku createのときに返されたurl（herokuapp.comで終わるやつ）にアクセスすると

・うまくいった！！

・更新する

・以下の３つを実行

```
$ git add .

$ git commit -m "message"

$ git push heroku master
```


うまくいかない
sshkeyが無いせいかと思い
https://qiita.com/SomeyaNaoki/items/fbd359b20c1b479692f9
に則って操作
Vueで画像を遅延読み込みするライブラリ v-lazy-image

先日書いた表示速度改善の続きで、画像の遅延読み込みをするために、ライブラリを探してみたところ、[v-lazy-image](https://github.com/alexjoverm/v-lazy-image)が良い感じだったので紹介。

#導入
```bash
$ npm install v-lazy-image --save
```

#使い方
App.vueとかでプラグインとして読み込む場合

```javascript
import Vue from "vue";
import { VLazyImagePlugin } from "v-lazy-image";

Vue.use(VLazyImagePlugin);
```

必要な箇所で個別に使う場合

```javascript
import VLazyImage from "v-lazy-image";

export default {
  components: {
    VLazyImage
  }
};
```

あとは公式にある通り、`v-lazy-image`タグを使ってやれば良い。

```vuejs

<template>
    <v-lazy-image src="http://lorempixel.com/400/200/" />
</template>
```

もちろん、propsやdataの値を渡すこともできる。

```vuejs

<template>
    <v-lazy-image :src="imageURL" />
</template>

<script>
import VLazyImage from "v-lazy-image";
export default {
    components: {
        VLazyImage
    },
    props: {
        imageURL: {
            type: String,
            default: null
        }
    }
}
</script>
```

あとは、出力されるimgタグに`v-lazy-image`と`v-lazy-image-loaded`のclassが付与されるので、こんな感じでアニメーションをつけることができる。

```vuejs

<style scoped>
.v-lazy-image {
  filter: blur(10px);
  transition: filter 0.7s;
}
.v-lazy-image-loaded {
  filter: blur(0);
}
</style>
```

最初は[vue-lazyload](https://github.com/hilongjw/vue-lazyload)を使おうかと思ってたけど、画像の遅延読み込みのためだけならv-lazy-imageの方が軽くて良い感じ。
メタゲノム解析のパイプラインに関するメモ

# これは何
メタゲノム初心者のバイオインフォマティシャンがメタゲノム解析に入門するのにいくつかパイプラインを漁ったメモ

- モチベーション
    - とにかく手元にいっぱいfastqファイルがあるからまずざっくり functional profiling をして注目する遺伝子機能を絞り込んだりしたい
    - MiSeqとHiSeqのデータ合わせて数百サンプルと、結構データ量が多いので軽ければ軽いほどいい

## MOCAT2 (2016)
https://academic.oup.com/bioinformatics/article/32/16/2520/1743334

- `コマンドライン一発でとにかく全部できるやつ`。クオリティコントロール、アセンブル、eggnogを用いたfunctional profiling、mOTU profilingなどとにかく機能がリッチ。
- しかし2018年の4月以降開発が止まっているようで、マニュアルとかHPの情報とか色々不完全な部分が多くて辛かったす。
- 断念した一番の理由はスケジューラ絡みで、僕の環境(NQSII)だとうまく走りませんでした。SGEとかなら対応してるっぽい。
- 単なるperlのラッパースクリプトなので自分でmodifyを試みたのですが、メインのモジュールの最初にグローバル変数がめちゃくちゃ羅列してあったりコード追うの困難で結局断念 :innocent:
- 今思えばqsubモードを使わずに動かすshell scriptをqsubで投げればいけるような気もする？ :thinking:
- MOCAT使ってる論文、解析手法の記述がめちゃくちゃ短くてすごいなと思いました(だいたいMOCAT2使いましたで終わる)。

## NG-meta-profiler (2018)
https://www.biorxiv.org/content/10.1101/367755v1

- NGLessというomix解析専用のドメイン固有言語のメタゲノム拡張版みたいなやつ
- 文法はpythonっぽいらしいのでbiopythonとか使う感覚でいけるのだろうか( `pythonesque` は初めて見た表現だったのですが `モンティパイソンっぽい` という意味の単語だそうです)

```
Basic Properties
The syntax is a pythonesque syntax with Ruby-like blocks.
The types are statically and strictly.
Types are implicit, but limited language allows for type inference and checking.
Quality control is implicit and mandatory (you get it for free)
Types are domain types (biological).
```
- MOCAT2と同じチームが作っていて、こっちに移行してるっぽい雰囲気
- まだプレプリントで引用ゼロ件の段階で、それなりに習得コストが高そうな言語を使うのはややリスキー？仕様変更とか怖いですし。
- しかしドメイン固有言語でomix解析の辛さを減らすという発想は良さそうだし、天下のPeer Borkラボが作っているので今後エコシステムが広がるといいなとは思う

## FMAP (2016)
https://bmcbioinformatics.biomedcentral.com/articles/10.1186/s12859-016-1278-0

- MOCAT2と似たようなパイプライン構築ツール。
- Functional profilingに特化しており、MOCAT2より設計がだいぶミニマム。やりたいことごとにperlのmoduleが分かれているのも良い
- 依存関係のあるツールを一つずつインストールしなければいけないが、それさえやれば動かすのは簡単だった
- uniplotからBacteria、Archaea、Fungiのデータのみを抜き出し、さらにKEGGのorthologyに当たる配列のみを抽出したsubsetを作っていて、そこにdiamondでsearchをかけるので爆速。機能わからん遺伝子に当たってもしょうがなくない？という思想は結構アリだな。
- BMTaggerでhuman由来の配列の除去とlow-quality readsの除去はやってくれるっぽいが、phixの除去とかadaptorの除去とかは自前でやる必要あり

# 僕の選択

- TrimGalore(アダプター除去)
- Flash(ペアエンドマージ)
- bowtie2(remove phix)
- prinseq(remove low complexity reads)
- FMAP(functional profiling)

結局この流れでやることにして、luigiでパイプラインを組みました。

# 所感

とりあえずざっくりとメタゲノムデータのfunctional profilingまでしたいのであれば

  - eggnog を使いたい -> `NG-meta-profiler`(動くならMOCAT2でも)
  - KEGG module に当てたい -> `FMAP`

という感じでしょうか。あと数年待てば`NG-meta-profiler`がいい感じになっていくのかもしれません。`QIIME/mothur`のような感じで`NG-meta-profiler`が使われるようなところまでいけば、業界的にはハッピーな気がします。
correspondence analysis

以下サイトを参考にしました。二つ目のコードです。（URL：https://ncss-wpengine.netdna-ssl.com/wp-content/themes/ncss/pdf/Procedures/NCSS/Correspondence_Analysis.pdf ）

```{r}

library(dplyr)

n=10

data=data.frame(n1=c(rpois(n/2,lambda=5),rpois(n/2,lambda=10)),n2=rpois(n,5),n3=rpois(n,8),n4=rpois(n,12))

ave_col=apply(data,2,sum);ave_row=apply(data,1,sum)

c_ij=(as.matrix(data)-mean(ave_col)[1])/sqrt(mean(ave_col)/sum(ave_col))

mat=array(0,dim=c(nrow(data),ncol(data)))

for(i in 1:nrow(data)){
for(j in 1:ncol(data)){
  
mat[i,j]=(ifelse(i==j,1,0)-mean(ave_col)[1]/sum(ave_col))/sqrt(mean(ave_col)/sum(ave_col))
 
}
}  

eigen(cor(c_ij))

eigen(cor(mat))

```

```{r}

#correspondence analysis

library(dplyr)

n=10

data=data.frame(n1=c(rpois(n/2,lambda=5),rpois(n/2,lambda=10)),n2=rpois(n,5),n3=rpois(n,8),n4=rpois(n,12))

K=as.matrix(data)

P=K/sum(K);c=apply(P,2,sum);r=apply(P,1,sum)

D_r=sqrt(solve(diag(r)))

D_c=sqrt(solve(diag(c)))

A=D_r%*%P%*%D_c

mat=svd(A)

B=mat$u;W=diag(mat$d);C=mat$v

f=D_r%*%B%*%W

g=D_c%*%C%*%W

V=(W%*%W)

eigen_values=diag(V)

row_d=c();col_d=c()

for(i in 1:nrow(P)){
  
row_d=c(row_d,sum((P[i,]/apply(P,1,sum)[i]-apply(P,2,sum))^2/apply(P,2,sum)) ) 
  
}

for(j in 1:ncol(P)){
  
col_d=c(col_d,sum((P[,j]/apply(P,2,sum)[j]-apply(P,1,sum))^2/apply(P,1,sum)))  
  
}

Inertia_r=r*row_d^2/sum((r*row_d)^2)

Inertia_c=c*col_d^2/sum((c*col_d)^2)

row_d^2

col_d^2

```
Oracleのインストーラを再実行する

Oracleの製品を再インストール時に下記のようなエラーが表示された際の対処方法

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32408/4a074a0c-a7ab-b608-8fc1-31b25d6415a7.png)

参考URL) http://dba-story.blogspot.com/2014/04/ins-32025-chosen-installation-conflicts.html

## インストールが完了している場合は...
`$ORACLE_HOME/deinstall/deinstall` コマンドでアンインストールできます。

## /etc/oraInst.loc ファイルの内容を確認

```
$ cat /etc/oraInst.loc 
inventory_loc=/home/oracle/oraInventory
inst_group=oinstall
```

## inventory_locディレクトリ配下のディレクトリに移動
(Windows環境では「C:\Program Files\Oracle\Inventory\ContentsXML」らしい)

```
$ cd <inventory_loc>/ContentsXML
```

## inventory.xmlをエディタで編集する
インストールしようとしていた ORACLE Home に関する行を削除する

```
$ vi inventory.xml
：
<HOME NAME="Ora11g_gridinfrahome1" LOC="/u01/app/11.2.0/grid" TYPE="O" IDX="3">  #この行から
   <NODE_LIST>
      <NODE NAME="node1"/>
      <NODE NAME="node2"/>
      <NODE NAME="node3"/>
      <NODE NAME="node4"/>
   </NODE_LIST>
</HOME>  #この行までが削除対象
：
```

## インストーラを再度実行する
インストーラ実行中の場合は、念の為一旦終了してインストーラを再度起動する。

```
$ runInstaller
```
gitのリモートブランチをローカルに持ってくるコマンド〜毎回忘れるやつ〜

# 何これ？
* gitでリモートに作ったブランチ(dev-branch)をローカルに持ってきて開発したい
* そのコマンドを毎回忘れる
* 個人メモですが需要あればどうぞ

# コマンド
* git fetch
* git checkout -b dev-branch origin/dev-branch

あ、これだけか。こんだけでした。

# なぜ毎回忘れるのか
「なんか色々しないといけなかったような気がした」。
そんなことなかったですね。
go-smtp-sourceを使ってみた話

仕事でメールサーバを触ることが多く、SMTPの動作を見るためにsmtp-sourceをよく使ってます。  
先日STARTTLSで負荷をかける必要があり、STARTTLS未対応のsmtp-sourceに代わる方法がないか探したところgo-smtp-sourceで解決できたっていうお話です。

# go-smtp-source
- smtp-sourceをGoで再実装してSTARTTLSに対応したのだとか
- HDEの方がGitHubで公開している

http://blog.hde.co.jp/entry/2015/02/16/163257
https://github.com/nabeken/go-smtp-source

# smtp-source
- メールを送信するツール、負荷試験で使ったりする
- Postfixに含まれている

# 使い方
- GitHub(または同梱のREADME.md)にあります
- 基本的にはsmtp-sourceと同じ模様 (Goでの再実装ですし)
- TLSで使いたい場合はSMTPサーバの前に`-tls`を指定すればいいらしい (README.mdより)

# 導入して使ってみた
手順とは言ってもGitHubから取得、展開して実行するだけです。

1. ダウンロード
   今回はCentOSサーバ上で作業するのでLinux向けのビルドをwgetで取ってきました。
   v20180914170157は作業当時のLatest releaseです。

    ```sh
    wget https://github.com/nabeken/go-smtp-source/releases/download/v20180914170157/go-smtp-source_linux_amd64.tar.gz
    ```

2. 展開
   任意のディレクトリに配置してついでに移動しときます。

    ```sh
    tar zxvf go-smtp-source_linux_amd64.tar.gz -C <EXT_DIR>

    cd <EXT_DIR>/go-smtp-source_linux_amd64
    # <EXT_DIR>: 展開先ディレクトリのパス
    ```

3. 実行
   STARTTLSで送信可能なことを確認するためにPort 25目掛けてover TLSで10通送ってみます。

    ```sh
    ./go-smtp-source -s 1 -l 1024 -m 10 -f sender@example.com -t dst@example.com -tls <DST_IP>:25
    # <DST_IP>: 送信先SMTPサーバのIPアドレス
    ```

この後SMTPサーバのログを確認したところ、無事にSTARTTLLSで配送されていました。
[SerializeField] 属性をつけていると、CS0649警告が出るようになった。消したい。

* 環境 2018.3.5f1

Unity 2018.3 にアップグレードしたら、
.NET 3.5 (deprecated) ということで、.NET 4.x にしました。

そしたら、とてもたくさんの・・・
１００個以上たくさんの、、Warning が表示される
`xxx.cs(23,37): warning CS0649: Field 'xxx.obj' is never assigned to, and will always have its default value null`

邪魔すぎるので、消す方法を調べる。

[Warning CS0649 not suppressed properly when field is marked as [SerializeField] - Unity Forum](https://forum.unity.com/threads/warning-cs0649-not-suppressed-properly-when-field-is-marked-as-serializefield.556009/)

before `[SerializeField] GameObject obj;`


## 方法1  [SerializeField]を忘れて、すべてを 'public'にする


```
public GameObject obj;
```

## 方法2 #pragma warning disable 649


```
#pragma warning disable 649
[SerializeField] GameObject obj;
#pragma warning restore 649
```

## 方法3 '-nowarn：0649'を含むcsc.rspファイル

Assets直下に、「csc.rsp」というファイルを作成する

```:csc.rsp
-nowarn:0649
```

## 方法4 デフォルト値で初期化する


```
[SerializeField] GameObject obj = default;
```

検索：`\[SerializeField\]([^=]+?);`
置換：`[SerializeField]$1 = default;`

Visual Studio for Mac だと、
Command + Shift + F キー
[フォルダーを指定して検索]/[フォルダーを指定して置換]

<!--<img width="552" alt="スクリーンショット 2019-02-28 16.38.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/365269/aae813b9-cf7a-4760-6fc4-4e68a81919e8.png">-->

![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/365269/aae813b9-cf7a-4760-6fc4-4e68a81919e8.png)


方法1だけは無いなと思うし、個人的には方法4が
この中ではお気に入りです。

おわり
StatusBar や AppBar を透過にする

StatusBar や AppBar を透過したいなと思ったときに毎回調べてはハマったりしているので自分用にメモとして残したいと思います。

## 前提

`~.NoActionBar` を継承したスタイルはどこかで設定して自前で ActionBar を実装している前提です。

## StatusBar

AndroidManifest にある該当の Activity の `theme` に以下を設定します。

```xml
<style name="TranslucentStatusBar">
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>
```

v23 以降はコレを設定します。

```xml
<style name="TranslucentStatusBar">
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="android:windowLightStatusBar">true</item>
</style>
```

[Y.A.M の 雑記帳: StatusBar 透明化の正しい方法](http://y-anz-m.blogspot.com/2016/02/statusbar.html) にとても詳しく書かれています。ちゃんと理解したい人はみてください。

## AppBar

`AppBarLayout` の `theme` として以下を設定します。

```xml
<style name="TranslucentAppBar">
    <item name="colorPrimary">@android:color/transparent</item>
    <item name="android:windowActionBarOverlay">true</item>
    <item name="windowActionBarOverlay">true</item>
</style>
```

おそらく `elevation` が残るので、レイアウトに直接 `app:elevaiton="0dp"` を設定します。

## 戻るボタン

 `Toolbar` に以下を `theme` として設定します。もしかしたら他にいい方法あるかもしれないので知っている人は教えてください :pray:

```xml
<style name="ToolBar">
    <item name="navigationIcon">@drawable/ic_close_white</item>
</style>
```
[Swift]配列からユニーク値を取り出す時の速度比較

# 動機
あるプロジェクトで楽曲一覧を表示する時、ユニークなリストの生成があまりにも遅かったので、色々速度比較をしてみました。

# 実験
以下の方法で100回繰り返してみます。
(`array`は0から1000のランダムな配列です。)

### 方法1
オーソドックスに`for`で回してみます。

```swift
var uniqueArray = [Int]()
for i in array{
    if !uniqueArray.contains(i) {
            uniqueArray.append(i)
    }
}
```

### 方法2

Array::reduceを使ってみます。

```swift
array.reduce(into: [Int]()) {a,b in
    a.contains(b) ? () : a.append(b)
}
```

### 方法3

標準ライブラリの`Set`を使ってみます。

```swift
Array(Set(array))
```

# 結果

| `for`方式        |`Array::reduce`方式 |`Set`方式           |
|:-----------------|:------------------|:-------------------|
| 7.37(sec)        | 7.58(sec)         | 0.03(sec)        |


Setがあまりにも早く誤差が大きそうなので
同じ配列でもう一度 `for`、`reduce`は100回、`Set`は1000回、回してみます。

| `for`方式        |`Array::reduce`方式 |`Set`方式           |
|:-----------------|:------------------|:-------------------|
| 77.56(sec)        | 75.81(sec)         | 0.30(sec)        |

`for`と`Array::reduce`はほぼ同速
`Set`が250倍ほど早いですね。

# 結論

ここまで違うとは思っていませんでした。
`Swift`でユニークな配列を作るときは間違いなく`Set`を使ったほうが良さそうです。
pyenv のインストールと version の切り替え

mac に ansible を入れようとしたら pip が依存している python の version に言及があった。

```sh
$ sudo pip install ansible

DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
The directory '/Users/<あなたのお名前>/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/Users/<あなたのお名前>/Library/Caches/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
```

バージョンを上げれば解決しそうだが、pyenv を入れたほうが良さそうである。
https://github.com/pyenv/pyenv

# install

```sh
$ brew update
$ brew install pyenv
```

### お好きな python の version をインストール

```sh
$ pyenv install --list

$ pyenv install 2.7.15
```

### バージョンが変わったか確認

```sh
$ pyenv global 3.7.2
  system
* 3.7.2 (set by /Users/<あなたのお名前>/.pyenv/version)

$ python --version
Python 2.7.10 
```

変わっとらんがな😫😫😫

### 環境変数PATHを修正

`$PATH` に pyenv の作業ディレクトリの shims へのパスを通す必要がある。
https://github.com/pyenv/pyenv#understanding-path

> Understanding Shims
> pyenv works by inserting a directory of shims at the front of your PATH:
> $(pyenv root)/shims:/usr/local/bin:/usr/bin:/bin

ということで、 `~/.config/fishconfig.fish` に下記を追加。

```sh
# pyenv
set -x PATH (pyenv root)/shims $PATH
```

リロード

```sh
$ source ~/.config/fish/config.fish
```

再度確認

```sh
$ python --version
Python 3.7.2

$ which python
/Users/<あなたのお名前>/.pyenv/shims/python
```

うぇーい😺😺😺

# おわり
多次元配列をINFや-INFで初期化するテク

競技プログラミングをやっていると多次元配列をINFや-INFで初期化したいことはよくあるかと思います。
ここではmemsetを利用した初期化の方法について解説します。
memsetは1byteごとに指定した値(memsetの第二引数の値)で埋めていきます。
ということはmemsetの第二引数の値は1byte以下の値で十分だということがわかります。
1byteは8bitなので、16進数だと2桁分になります(16進数では1桁が4bitに相当します)。
たとえばint型の配列nについて考えてみましょう。
int型はたいてい4byteです。
ということはmemsetの第二引数で1byte分の値を設定すると、それが4回繰り返された値が配列の一要素の値となります。
つまりint型の配列nに対して

```c++
memset(n,0xff3f,sizeof(n));
```

と

```c++
memset(n,0x3f,sizeof(n));
```

は同じで、どちらも配列nの各要素を1061109567(=0x3f3f3f3f)で初期化します(intは4byteなので32bit、つまり16進数だと8桁になります)。
つまり、memsetの第二引数で16進数で値を設定するときは下位2桁で十分で下位2桁以外は無意味となります。
先の例でいうと0xff3fのffの部分は無意味です。
では、8bitで最大の値と最小の値はいくつでしょうか。
なお、ここでは、8bitで最大の値をINF、8bitで最小の値を-INFと考えたいと思います。
2の補数表現だということを考慮するとMSB(最上位bit)が1だと負整数になるので、
8bitにおける最大の値は2進数で表現すると01111111、16進数で表現すると0x7fとなります。
また、8bitにおける最小の値は2進数で表現すると10000000、16進数で表現すると0x80となります。

## まとめ
INF(=2139062143)で初期化したいときは

```cpp
memset(n,0x7f,sizeof(n));
```

-INF(=-2139062144)で初期化したいときは

```cpp
memset(n,0x80,sizeof(n));
```

とするのがよさそうです。
配列nの要素がINFかどうか判定するときは
int型の場合は0x7f7f7f7fと比較
long型の場合は0x7f7f7f7f7f7f7f7fと比較
と比較することになります。

もしINFや-INFの値を厳密に設定したいときは
最初の次元数がNのint型の配列n(たとえばint n[N][N+1][N+2])に対して

```cpp
fill((int*)n,(int*)(n+N),INF);
```
で初期化することもできます。
Xcodeの警告の「-pie being ignored. It is only used when linking a main executable」はなんぞや


## 対処法
無視する

## 筆者のバージョン
Xcode: 10.1
Cocoapods: 1.6.1

## 概要
-pieとは、位置に依存しない実行ファイルを生成したいときにつけるコンパイルオプション
実行ファイルを生成する以外の状況で、これを指定しても無視される。
無視されたさいに```-pie being ignored. It is only used when linking a main executable```という警告が出る。

Xcode上にて、通常のBuildでは発生しない。
ただし、InterfaceBuilderのPreviewのために行われるBuildのときに出る模様。(Xcodeでcmd+9を押したときに出る画面で確認できる。)[^1]

Cocoapodsを使うと出るという情報が多いがCarthage使っていても出るし、手動でFrameworkをインストールしても出る。

- Project
    - 「BuildSettings」
        - 「Linking」
            - 「Generate Position-Dependent Executable」
        - 「Apple Clang - Code Generation」
            - 「Generate Position-DependentCode」

この設定値がNoになっていると思われる。
Projectを新規作成したときのデフォルト値がNoであるようだ。
Cocoapodsで生成したxcworkspaceから見えるPodsプロジェクトの設定値もNo[^2]

試しにこれらをYESにしたら、警告は消える。
だがそれは、本来デフォルトで位置に依存しない実行ファイルを作るところを、位置に依存する実行ファイルを作るように変更することなので、いろいろ怖い。

本当は、InterfaceBuilderにおいてのみこれをYESに設定したいところだが、Xcodeにはそんな機能はない。

よって無視すべきと言う結論に達した。

[^1]: これにより、CleanをしてXcodeを再起動すれば解決するという人もいるが、単にそれはInterfaceBuilder用のBuildがClean後に初めて行われる間警告が出ないというだけの話である。Storyboardを選択し、Rebuildが走ると復活する。

[^2]: Cocoapodsを最新化し、xcworkspaceを生成し直したら問題が解決されるかもしれないと言っている人がいるが、1.6.1時点で治りはしない。
Heroku Connect CLI

```
heroku plugins:install heroku-connect-plugin
heroku connect:info
heroku connect:export
heroku connect:import ＜ファイル名＞
```

アプリAでexportしたファイルを、アプリB(Salesforce・Postgresへの接続は設定済)に読み込ませることでMapping設定を同じにできる
ただしエラーになっていないか実行後にログを良く確認すること(エラーになるとPostgresに当該テーブルが作られない)
Railsでaccets_nested_attributes_forを使わずに複数子レコードを同時保存

（下書き）
ここで議論がされてて、
https://stackoverflow.com/questions/17634661/alternative-for-accepts-nested-attributes-for-maybe-virtus

ここにやり方が書いてある
https://coderwall.com/p/kvsbfa/nested-forms-with-activemodel-model-objects
Markdownからpdfを生成する方法

## 使うもの

Markdownのエディタ兼pdf変換器として__Visual Studio Code__を使用します。


## 方法

1. Visual Studio Codeの拡張機能から`Markdown PDF`と検索し、こちらをインストールします
2. 変換したいMarkdownファイルをVisual Studio Codeで開きます
3. 文章内で右クリックすると、メニューに`Markdown PDF: Export (pdf)`とあるのでそれをクリックしてください
4. Markdownファイルと同じディレクトリに、変換されたpdfファイルが出力されています


## まとめ

1～2年前に使った時はあまりきれいに出力されなかった記憶がありましたが、
本記事記述時のバージョンではとてもきれいに出力されるようになっていたのでぜひお試しください。
またこの`Markdown PDF`を使うとpdf以外にも、`html`、`png`、`jpeg`も出力できるので
それらが必要な方もお試しください。
FlickrAPIでの画像取得

#はじめに
deep learningで画像識別を使用と思ったので学習用の画像をFlickrAPIを使って画像を集めるときのメモです。
使用したpythonのバージョンは3.6です。

#FlickrAPIライブラリのインストール
pythonでFlickrAPIを使うためのライブラリをpipを使ってインストールします。

```
pip install flickrapi
```

#コード
あらかじめ、APIの公開鍵と秘密鍵を入手しておいてください。
また、最後に`time.sleep()`などで少し時間をおいて画像を保存するようにすると、サーバーに負荷が軽減されるのでいいです。

```download.py
from flickrapi import FlickrAPI
from urllib.request import urlretrieve
from pprint import pprint
import os,time,sys

#キーの作成
key = "公開鍵の番号"
secret = "秘密鍵の番号"
wait_time = 1
#コマンドラインで保存先と検索する名前を指定する
AnimalName = sys.argv[1]
#保存先の指定
SaveDir = "./" + AnimalName
#APIキーの作成
flickrapi = FlickrAPI(key,secret,format='parsed-json')
#検索する
result = flickrapi.photos.search(
    text = AnimalName,
    per_page = 400,
    media = 'photos',
    sort = 'relevance',
    safe_search=1,
    extras = 'url_q,licence'
)
#結果の表示
photos = result['photos']
#pprint(photos)

for i ,photos in enumerate(photos['photo']):
    url_q = photos['url_q']
    filepath = SaveDir + '/' + photos['id'] + '.jpg'
    if os.path.exists(filepath):continue
    urlretrieve(url_q,filepath)
    time.sleep(wait_time)
```

このプログラムは第一引数に保存先を指定しているのでこのファイルの保存先と同じ名前のディレクトリをあらかじめ作っておく必要があります。
たとえば、牛の画像を保存するときに`cow`と第一引数に指定するときにディレクトリ構成は以下のようにしておく必要があります。

```
root/
 ├─download.py
 └─cow
```
[Swift]Observable(RxSwift) - Promise(PromiseKit)相互変換

この記事ではSwiftで非同期な処理を扱う際に便利なライブラリであるRxSwiftとPromiseKitをプロジェクト内で両方導入している際に連携を取る方法について説明します。
導入するにしても大抵は片方しか使わないですが、両者が混在するプロジェクトに向き合わなければならない局面は人生においてあったりなかったりします。
使用ライブラリとバージョンは以下になります。

https://github.com/ReactiveX/RxSwift (4.3.1)
https://github.com/mxcl/PromiseKit (6.8.3)

ライブラリのインストール手順等については他の方の記事を参照という次第でよろしくおねがいします。

# Observable->Promise変換
ObservableをPromiseで使える。Promiseの都合上結果は1度しか受け取れないのでそのようになっています

```swift

import PromiseKit
import RxSwift

extension Observable {
    func toPromise() -> Promise<Element> {
        var disposable: Disposable?
        return Promise { resolver in
            disposable = take(1)
                .subscribe(
                    onNext: { value in resolver.fulfill(value) },
                    onError: { resolver.reject($0) },
                    onCompleted: { disposable?.dispose() }
            )
        }
    }
}
```

# Promise->Observable変換
この変換方式では1度値が流れるとonCompletedを発するので、RxSwiftで継続して値を受け取るにはflatMap等でラップする必要があります

```swift
import PromiseKit
import RxSwift

extension Promise {
    func toObservable() -> Observable<T> {
        return Observable.create { observer -> Disposable in
            self.done { observer.onNext($0) }
                .catch { observer.onError($0) }
                .finally { observer.onCompleted() }
            return Disposables.create()
        }
    }
}
```
FileMaker // 同じフィールドに複数の検索条件を入れるには

###よく使うわりによく忘れるのでメモ
```FileMaker:複数条件で絞り込むスクリプト
検索モードに切り替え [ 一時停止: オフ ] 
フィールド設定 [ (フィールド名) ; (検索条件１) ] 
新規レコード/検索条件
フィールド設定 [ (フィールド名) ; (検索条件2) ] 
対象レコードの絞り込み [] 
```
検索モードにおける「新規検索条件」をスクリプトで実行しようとするとこうなる
PythonでDiscordボットを作る時のFAQ

(2019/04/09)discord.pyが正式リリースされました。
（※rewrite版と呼ばれていたものがdiscord.pyになりました）

PythonでDiscordボットを作る時に引っかかりやすい罠や、Discordのpythonjpでよくやり取りされる質問、ネットでの参考になる記事等をゆるくまとめていこうと思います。

初心者が対象です。

※注意
PythonやDiscordは活発に更新されていきます。情報がどんどん古くなっていきます。ここに書かれている情報が古くなっている可能性もありますので注意してください。

# 全般
##### Q: ボット作成の大まかな流れを知りたいんだけど？
A: [PythonでDiscordのボットサンプルを作成（rewrite版）](https://qiita.com/Karaf/items/f1032ef9806a10ba161e)
A: [Pythonで簡単なDiscord Botの作り方（async版）](https://qiita.com/PinappleHunter/items/af4ccdbb04727437477f)
A: [discord.pyとherokuでDiscordBot](https://qiita.com/3894eye/items/4b4d5cda958c11069229)
A: 【VOICEROID解説】Python環境でDiscord Botを作る。 Part1 前準備編　discord.py rewrite 修正版
https://www.youtube.com/watch?v=31HPbI2LPc4
（discord.pyのrewrite版を使う場合、Pythonは3.7.? 以降を導入してください）
（discord.pyのasync版を使う場合、Pythonは3.6.? を導入してください）

# 開発環境
##### Q: 開発環境は何をインストールしたらいいの？
A: 好きなエディタとかIDEで構いません。PyCharmとかVSCodeが多数派かな。
（☓Windowsのメモ帳はダメです。BOM付きUTF-8という形式で保存されてしまう為 → 「Windows 10 19H1」で改善の予定があります）
PyCharm:
https://www.jetbrains.com/pycharm/
VSCode:
https://code.visualstudio.com/

# Python
##### Q: Pythonの何から学べばいいの？チュートリアルないの？
A: https://docs.python.org/ja/3/tutorial/index.html

##### Q: python3.7でボット作ったのに動かないんだけど？
A: [discord.pyのasync/rewriteとは何なのか](https://qiita.com/1ntegrale9/items/f4c47a6a69ecf23fc5db)
A: http://nao-y.hatenablog.com/entry/2018/08/22/202616

##### Q: コルーチンって何なの？
A: https://ekulabo.com/whats-coroutine#outline__2
（↑ Unityの中での説明ですが分かりやすいです）

##### Q: asyncとかawaitって何なの？
https://qiita.com/matsui-k20xx/items/4d1c00c4eefd60ba635b
（↑ リンク先にさらにリンクがあります）
（asyncやawaitはボットを作る上で頻出しますので大事ですよー）

## pip
##### Q: 仮想環境内でpipでパッケージをインストールしたのに認識されない！
A: Pythonが複数インストールされている環境では、pipコマンドを直接使うとかならず事故が発生します。
`python -m pip install` を使用してください。

## Bot commands framework
##### Q: コード内にcommands.Botとか書いてあるけどこれ何なの？
A: https://starnak.hatenablog.com/#Bot-commands-framework%E3%81%A8%E3%81%AF

# Discord
## discord.py
##### Q: async版とかrewrite版って何なの？
A: https://qiita.com/1ntegrale9/items/f4c47a6a69ecf23fc5db
※（2019/03/03時点）いま、ゼロから覚えるのならば新しい方であるrewrite版をオススメします。（ネットでの情報は少ないですが）
async版はDiscordのカテゴリー関連の機能が貧弱だからです。

# Heroku
##### Q: ボットを24時間無料で動かしたいんだけど？
A: Herokuという所で動かすことができます
・Herokuの無料プラン、クレカ登録無し → 550時間まで（一ヶ月は無理です。31日*24時間=744時間だから）
・Herokuの無料プラン、クレカ登録有り → 550時間+450時間=1000時間（一ヶ月連続稼働OK）
（条件がコロコロ変わるみたいなので[公式サイト](https://jp.heroku.com/)で確認してください）

##### Q: Herokuでデプロイ成功したのに動かないんだけど？
A: Herokuの管理画面「Resources」→ 自分のアプリの右側のスイッチがONになってるか確認してください。（初めて使う場合はOFFになってます）
![heroku_on.png](https://qiita-image-store.s3.amazonaws.com/0/369375/8339c032-4200-4349-299a-19e4edf99236.png)

# その他
##### Q: コード書いたけどエラー出て全然動かん！助けて！
A: Discord の Python.jpサーバで質問することできますよ。
Discord Python.jpサーバに参加
https://www.python.jp/pages/pythonjp_discord.html
（入ったら「必ずお読みください」を一読してくださいね。質問の仕方が載ってます）

# リンク
Discord Python.jpサーバに参加
https://www.python.jp/pages/pythonjp_discord.html

Shun Tannai （PythonでDiscordボットを作る時に大変参考になりました）
https://qiita.com/1ntegrale9

Python 3.7.2 ドキュメント
https://docs.python.org/ja/3/

discord.py rewrite版 API Reference
https://discordpy.readthedocs.io/en/rewrite/api.html

heroku
https://jp.heroku.com/
AppleDeveloperProgramでAccount Holder(旧Agent)のあなた！今日から 2 ファクタ認証必須ですよ。

# 2ファクタ認証必須メールが来た
はい、来ました。
> 今日から**Account Holder**のあなたは2ファクタ認証必須だよ

<img width="673" alt="mail.png" src="https://qiita-image-store.s3.amazonaws.com/0/60630/42895071-2d28-d48c-74f4-173d58056ce7.png">

# Apple Developerにサインイン
2ファクタ認証を未設定まま、Account Holderアカウントを使用してApple Developerでサインインすると...

はい、怒られました。
> 　サインインしたきゃ、パスワードと信用できるデバイスを用意しな！

<img width="1077" alt="DropShadow___スクリーンショット_2019-02-28_9_46_31.png" src="https://qiita-image-store.s3.amazonaws.com/0/60630/5b0874d0-bc11-59df-2d9a-1340d913293c.png">


この後、Macで2ファクタ認証の設定手順を説明しますが、役割が**Admmin**や**Developer**の方は必須ではないので、この記事を**Account Holder**に人に教えて自分の仕事に戻りましょう。

# Macで2ファクタ認証の設定
この記事では、Mac（mojave）を2ファクタ認証のデバイス(信用できるデバイス)とし設定していきます。もし認証のデバイスをiPhoneにしたい方は。こちらの公式[Apple ID の 2 ファクタ認証](https://support.apple.com/ja-jp/HT204915)を参考にiPhoneで設定してください。

## iCloudにサインイン
Appleメニュー>「システム環境設定」>「iCloud」の順に選択し、Account Holderアカウントとパスワードを入力して、「次へ」をクリックします。既にAccount Holderアカウント以外でサインインしている方は、サインアウトしてからAccount Holderアカウントでサインインしてください。

<img width="685" alt="icloud2.png" src="https://qiita-image-store.s3.amazonaws.com/0/60630/ec6e5990-0a97-8dd2-0ee1-42aeb33b3316.png">

## 2ファクタ認証を設定
iCloudにサインインするとそのまま、2ファクタ認証を設定に移りますので「続ける」をクリックします。この画面が出ない方は「アカウントの詳細」の「セキュリティ」をから「2ファクタ認証を有効にする」をクリックするといけます。
<img width="686" alt="icloud3.png" src="https://qiita-image-store.s3.amazonaws.com/0/60630/f254ef15-1c73-5802-b9d8-9f53bc050351.png">


有効な電話番号を入力して確認方法（今回はSMS）を選択して「続ける」をクリックします。
<img width="698" alt="icloud4.png" src="https://qiita-image-store.s3.amazonaws.com/0/60630/f3e14778-82c3-926b-793a-df3dfb59f24a.png">

SMSで受け取った確認コードを入力します。
![スクリーンショット_2019-02-28_10_46_00.png](https://qiita-image-store.s3.amazonaws.com/0/60630/542e79eb-fd4c-21ba-263e-1225bc4ef7c3.png)

パスワードを要求されるので入力します。
<img width="1390" alt="DropShadow___スクリーンショット_2019-02-28_15_30_19.png" src="https://qiita-image-store.s3.amazonaws.com/0/60630/3017f687-f57d-bd16-6910-b97f41441109.png">

これで、2ファクタ認証設定（信用できるデバイスの用意）は完了です。

# 再度Apple Developerにサインイン
この状態で、Account Holderアカウントを使用してApple Developerで再度サインインすると..
はい、出ました。
<img width="1222" alt="DropShadow ~ スクリーンショット 2019-02-28 15.35.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/60630/d3e9f941-fca6-e9cb-75f3-a872111eb013.png">

Mac（信用できるデバイス）側にサインイン許可のダイアログが出ているので「許可する」をクリックします。 
<img width="495" alt="login.png" src="https://qiita-image-store.s3.amazonaws.com/0/60630/8572f867-26ed-22a2-a157-981235a1f9bd.png">

許可すると、確認コードが発行されるので、この確認コードを入力します。
<img width="1040" alt="login2.png" src="https://qiita-image-store.s3.amazonaws.com/0/60630/e3551eeb-11e4-c5f3-dba2-e601b9ae66df.png">

2ファクタ認証が完了すると、以下の画面が表示されます。「信頼する」を選択すると今後、このMacからのサインインする際に確認コード無しでApple Developerにサインインきます。 

<img width="598" alt="DropShadow ~ スクリーンショット 2019-02-28 15.31.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/60630/cf2abd8d-68df-c52d-b2de-1d3b93a0ff58.png">

これで、2ファクタ認証必須対応は完了です。お疲れ様でした。
<img width="1134" alt="DropShadow___スクリーンショット_2019-02-28_15_31_55.png" src="https://qiita-image-store.s3.amazonaws.com/0/60630/50332b7b-f5e0-0287-0788-5ff177f25435.png">

#　参考
[Apple ID の 2 ファクタ認証](https://support.apple.com/ja-jp/HT204915)
bundle installのmysql2 のエラー解決方法

【環境】
macOS Mojava
バージョン10.14.3

・ruby -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin18]

・rbenv versions
  system
  2.2.2
  2.3.0
  2.3.1
* 2.3.3 (set by /Users/ユーザー名/サイト名/.ruby-version)
  2.4.1
  2.5.3

mysql --version
/usr/local/opt/mysql@5.7/bin/mysql  Ver 14.14 Distrib 5.7.25, for osx10.14 (x86_64) using  EditLine wrapper
-------------------------------------------------------------------------------
vi ~/.bash_profile

PATH=/usr/local/mysql/bin:$PATH
export PATH
export PATH="~/.rbenv/shims:/usr/local/bin:$PATH"
eval "$(rbenv init -)"
------------------------------------------------------------------------------------------------------------------------
vi ~/.bashrc

alias mysql=/usr/local/opt/mysql@5.7/bin/mysql
alias mysqladmin=/usr/local/opt/mysql@5.7/bin/mysqladmin
-----------------------------------------
【エラー内容】
-------------------------------------------------------------------------------
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
------------------------------------------------------------------------------------------------------------------------
Gem files will remain installed in
/Users/ユーザー名/サイト名/vendor/bundle/ruby/2.3.0/gems/mysql2-0.4.5 for
inspection.
Results logged to
/Users/ユーザー名/サイト名/vendor/bundle/ruby/2.3.0/extensions/x86_64-darwin-18/2.3.0-static/mysql2-0.4.5/gem_make.out

An error occurred while installing mysql2 (0.4.5), and Bundler cannot
continue.
Make sure that `gem install mysql2 -v '0.4.5' --source 'https://rubygems.org/'`
succeeds before bundling.

In Gemfile:
  mysql2

------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------

【試した事】
------------------------------------------------------------------------------------------------------------------------
・パスを通す
https://nekonenene.hatenablog.com/entry/2016/10/31/061350
の解決方法①

bundle config build.mysql2 --with-opt-lib=/usr/local/opt/openssl/lib --with-opt-include=-I/usr/local/opt/openssl/include
------------------------------------------------------------------------------------------------------------------------
・インストール実行
gem install mysql2 -v '0.4.5' --source 'https://rubygems.org/'

▼エラー内容
ERROR:  Error installing mysql2:
	ERROR: Failed to build gem native extension.

------------------------------------------------------------------------------------------------------------------------
・gemfileのtherubyracerをコメントアウト
#gem 'therubyracer'
------------------------------------------------------------------------------------------------------------------------
・Xcodeの再インストール
xcode-select --install

▼エラー内容(インストール済)
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
------------------------------------------------------------------------------------------------------------------------
Cognosのラジオボタンのプロンプトの選択肢を横並びに表示する

#はじめに

Cognosのレポートで、値のプロンプトをラジオボタン形式で表示した際に、通常、選択肢は縦に並びますが、HTMLアイテムを配置してスタイルタグを追加するだけで簡単に横並びに表示させることができたのでご紹介します。


#完成イメージ
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/e7ebd78b-b8a2-9ba6-edfd-e286735a12fa.jpeg)


#実装方法
実装方法は非常に簡単で、選択肢を横並びにしたいラジオボタンのプロンプトをHTMLアイテムが囲います。それぞれのHTMLアイテムの中身は下記の通りです。
![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/eaffe791-1d4b-19e7-32d3-762b24551975.jpeg)

```HTML:左側のHTMLアイテムの中身
<STYLE>
#radio Div.clsCheckBoxRow{
display:inline;
whiteSpace:noWrap;
}
</STYLE>
<div id="radio" >
```

```HTML:右側のHTMLアイテムの中身
</div>
```

#ポイント
・簡単なサンプルレポートなのでSTYLEタグをあわせて記述していますが、切り離して別の場所に配置することも可能です。
・横並びにするラジオボタンが複数ある場合は、id属性ではなくclass属性を使用してください。

class属性を使用した際のHTMLアイテムの記述は下記になります。

```HTML:class属性を使用した際のHTMLアイテムの記述
<STYLE>
.radio Div.clsCheckBoxRow{
display:inline;
whiteSpace:noWrap;
}
</STYLE>
<div class="radio" >
```




以上になります。
オフショアは難しい

社内でシステム開発の経験がない、プログラミングを知らない、業務フローを明確化・簡略化できない――などが重なると開発は滞るか頓挫する恐れがあります。
その開発先が海外の場合、その確率は非常に上がる事となります。
なぜ、難しいのか。それを実体験をもとにしてまとめたいと思います。

- オフショアとは
- 難しい原因は？
- 対策はどうするのか

の順で話をしていきます。


##オフショア開発とは
 Wikipediaより引用すると下記の通りです。

>オフショアリングは一つの国を拠点としていた営利事業を別の国に移転する経済行為と定義される。主な動機は既存の事業拠点より低額の人件費、税制度などであるが、近年、自国で足りていない専門家を補完するために他国の人材を活用する手段として注目されている。アウトソーシングとオフショアリングは類似した意味を保持するため度々対比されるが、同一国内での委託はオフショアではなくアウトソーシングを指す。逆に海外への業務の委託はアウトソーシングではなく、オフショアリングと定義される。
参照：Wikipedia [オフショアリング](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%95%E3%82%B7%E3%83%A7%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0)

 同一国内ではアウトソーシング――言わば、外注と呼ばれる事を海外へ委託する事ですね。

##難しい原因は？
 では、なぜ海外であると難しくなるのか――。
それは文化や常識の違いが一番だと感じます。

ここで一つ実験をしてみましょう。
皆さん、りんごをイメージしてください。

頭に思い浮かべましたか？
では、それは何色ですか？　形はどのような形ですか？

人によって、そのりんごの色は赤だったり緑だったりするでしょう。
形は丸い形をしているかもしれません。でも、それはサッカーボールのような丸い形ではないですね。
人によってはカットされている状態だったかもしれません。
このように「りんご」ひとつにしても色々な事を思い浮かべる事ができます。

では、システム開発する上で話をしている中で、仕様書にかかれていない部分についてどのようになるのでしょうか？
結果は簡単で、お互いの常識がすれ違うのでできるイメージが両者で異なります。
依頼する側は「やってくれるだろう」と思っていても、相手側は「知らないよ」となってしまいます。
または、全く異なる仕様で出てくる場合もあります。

##対策はどうするのか
 まずは仕様を揃える事です。
打ち合わせから納品まで仕様書、というものが存在しておらず（結果的に僕が作成しています）
何もかもが曖昧でした。
そこを正して、1つずつ違う所を指摘したり、仕様を修正するよう指示したりしています。
そうして、少しずつまともに動くものへと前進していきます。
口頭のみでは決してダメで、仕様書や図示等を出してそれらを合わせながら打ち合わせをする方が何倍も効果的であり、手戻りは減ります。

ただ、僕の場合について言えば、手戻りは減ったのですが、システムを理解すればするほど、バグを見つけてしまっているので何とも言えないのですが――。
なぜ、入力できなくなった！
とか。それについて、教えて貰ったのを参考に自分なりでやってきている事をまたまとめます。
TypeScriptベースなRequestの共通化

## 前置き

- App: ionic
- Web: Angular
- API: Nest.js

僕たちのチームのフレームワーク採用はこんな感じで全部Angularベース。
API Docはapi blueprintあたりを採用。
「でもこれ、フロントエンド/バックエンドで同じような実装するじゃん...無駄じゃね」
と思いはじめて実験的に取り組んでみてる構成を紹介します。


## Requestクラスを共通化する

Requestクラスを別リポジトリに分けて、git moduleとして扱っちゃう作戦です。
構成とコマンドは以下のような感じ。
今回はUser追加のリクエストを共通化する例です。

```sh:ディレクトリ構成
├── app
│　　　├── tsconfig.json
│　　　├── package.json
│　　　└── src
│　　　　　　　└── common (submodule: common)
├── api
│　　　├── tsconfig.json
│　　　├── package.json
│　　　└── src
│　　　　　　　└── common (submodule: common)
└── common
　　　　├── tsconfig.json
　　　　├── package.json
　　　　└── Requests
　　　　　　　　└── AddUserRequest.ts
```

```sh:サブモジュールの追加
$ git submodule add ./src/common
$ npm i ./src/common
```


### RequestClass

class-validatorにしたがって以下のようにすると楽ちんです。

```ts:BaseRequest.ts
import { validate } from "class-validator";

export class BaseRequest {
    async validate(): Promise<boolean> {
        const errors = await validate(this);

        if (errors.length > 0) {
            throw new Error(errors.toString());
        } else {
            return true;
        }
    }
}
```

```ts:AddUserRequest.ts
import * as v from "class-validator"

export class AddUserRequest extends BaseRequest{
    @v.IsNotEmpty()
    id: string;

    @v.IsDate()
    @v.IsOptional()
    birthday: Date;
}
```

こうしておくことでNest.js側では通常通りにValidationがかかります。

```ts
@Post("/user")
@HttpCode(200)
async create(@Body() params: AddUserRequest) {
    // 処理
}
```

Angularやionic側ではclass-transformerを使ってvalidateが可能です

```ts
import { plainToClass } from "class-transformer";

const req: AddUserRequest = plainToClass(request);

if (await req.validate()) {
    // 処理
}
```
Laravel 5.8 アップデートメモ

全く追いかけていなかったので、Upgradeやらを見ながらメモ書き。

[Laravel 5.8 Release](https://laravel-news.com/laravel-5-8) おめでとうございます。

というわけで、新機能と、5.7 → 5.8 のアップデートメモ

皆に影響がある部分として、下記の４つがあるそうです。

1. [Cache TTL Change](#Cache TTL Change)
2. [Cache Lock Safety Improvements](https://laravel.com/docs/5.8/upgrade#cache-lock-safety-improvements)
3. [MarkDown File Directory Change](MarkDown File Directory Name Change)
4. [Nexmo / Slack Notification Channels](Mexmo / Slack Notification Change)

## PHP DotEnv 3.0

複数行の値が使えるようになった。

```php
DOT_ENV_KEY="DOT
ENV
VALUE"
```

## Carbon v2.0

[Carbon V2](https://carbon.nesbot.com/docs/#api-carbon-2) にアップデートされます。

see: [Carbon Update Coming Laravel 5.8](https://laravel-news.com/carbon-2-laravel)

## Cache TTL Change

Cacheを使っている時に有効時間（分）をしていたのを、明確に期限切れを指定する形になります。

```php
<?php

# ~5.7
\Cache::reminder('active-posts', 5, function(){ return Post::active()->get(); });

# 5.8~
\Cache::reminder('active-posts', now()->addMinute(5), function(){ return Post::active()->get(); });
```

see: [Cache TTL Change Coming to Laravel 5.8](https://laravel-news.com/cache-ttl-change-coming-to-laravel-5-8)


## Deprecates String and Array Helpers

関数で存在していた `array_add($array, $key, $value)` が非推奨になります。代わりに `Arr::add($array, $key, $value)` を使ってください。

`Illuminate/Support/helpers.php` に `@deprecated <method> ~~` と書かれているので、それを参考にしながら変えていくのがいいと思います。

see: [Laravel 5.8 Deprecates String and Array Helpers](https://laravel-news.com/laravel-5-8-deprecates-string-and-array-helpers)

## Automatic Policy Resolution is Coming to Laravel 5.8

今まで `AuthServicePovider` に `protected $policy = [ 'Model' => 'Policy' ]` と書いていた部分が、動的に変えられるようになったっぽい。

see: [Automatic Policy Resolution is Coming to Laravel 5.8](https://laravel-news.com/automatic-policy-resolution-laravel-5-8)


## Blade Template File Path

Blade を使っていると、ファイル名がハッシュ値になりどのテンプレでエラーが起きたのかわかりにくかったです。

このバージョンから Blade のコンパイルしたテンプレートファイルの先頭行に、テンプレートのファイルパスが PHP のコメントアウトして記述されます。

see: [Blade Template File Path](https://laravel-news.com/laravel-5-8-blade-template-file-path)

## Nexmo / Slack Notification Change

Mexmo / Slack の Notification がパッケージ分離されました。

使用している場合は別途インストールが必要です。

(何で分離されたんだろ？)

```
composer require laravel/nexmo-notification-channel
composer require laravel/slack-notification-channel
```

see: [Upgrade notification](https://laravel.com/docs/5.8/upgrade#nexmo-slack-notification-channels)

## MarkDown File Directory Name Change

Markdown ファイルは `/resources/views/vendor/mail/markdown` でしたが、このバージョンからは `/resources/views/vendor/mail/text` になりました。

see: [Markdown File Directory Change](https://laravel.com/docs/5.8/upgrade#markdown-file-directory-change)

## Testing

PHPUnit 8 が使われるようになりました。これに伴い、 `setUp()` および　`tearDown()` に返り型を指定する事が必須になりました。

具体的にはこんな感じ

```
<?php

protected function setUp(): void
{
	...
}

protected function tearDown(): void
{
	...
}
```
リポジトリのURLって？ 

Gitにpushしたリポジトリを他の人へ共有したい時｡
リポジトリのURLを送って！と言われますね(^^)

リポジトリのURLはどこで分かるのだろう？？とGitをポチポチしていて
分かったのでメモです｡

まずは
Gitの自分のリポジトリ(your repositories)画面に移動します｡
URLを知りたいリポジトリを選んでください｡リポジトリをクリックすると､
<img width="492" alt="スクリーンショット 2019-02-28 14.32.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/333998/c7c56741-25e3-c354-fb65-e52c152144db.png">

｢Clone or download｣という緑のボタンが画面右の方に有るので
そのボタンをクリックしてください｡

---

クリックするとなにかアドレスが出てきますが､今回はHTTPSの方のURLが欲しいので
Use HTTPSをクリックすると､
いつものhttpsから始まる見慣れたURLが出てきます(^o^)ホッ
URL右横のコピーボタンを押せばコピーできます｡


<img width="459" alt="スクリーンショット 2019-02-28 14.41.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/333998/8ba01d23-5657-070f-977a-0511298f508c.png">

<img width="456" alt="スクリーンショット 2019-02-28 14.58.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/333998/125c5543-bcc0-da52-ac5a-2c0e43153a36.png">

---
---
その後､困ったことがありました汗
今回の操作により､gitにpushする時の使用が変わってしまっていたようで､push時にパスワード聞かれるようになってしまいました｡
HTTPSに変更した方は､SSHに戻しましょう｡

(参考https://qiita.com/rorensu2236/items/df7d4c2cf621eeddd468)
ビット演算でデータを圧縮しよう

注）この記事ではC#を使って説明します

# ビットについてのお話
## 圧縮で通信最適化
### 通信量を減らすメリットとは
- 貧弱な回線でも通信量が減ることでラグが少なくできる
- サーバーに優しい
- 使用者に優しい

## ビット演算について
### まずビットって何？って人のために
コンピュータにつまっているフラグのこと
よく見かける0！1！みたいなやつ
ビットが8個集まるとバイトに進化する

### まずビット演算って何？って人のために
ビットに対して0と1を切り替えたりすること

### ビット演算って何が便利なの？という人のために
ビットで20を表すと`0001 0100`となる
ビットで10を表すと`0000 1010`となる
ビットを05を表すと`0000 0101`となる
つまりビットを一つずらすことで2倍、1/2倍ができる！（しかも速い）

# やってみよう
## ビットにデータを埋めてみる
今回は`2 8 10 15`をデータに埋めてみる
まずそれぞれをビットで表すと・・・
`02 -> 0010`
`08 -> 1000`
`10 -> 1010`
`15 -> 1111`
のようになる
合計で16ビットなので、ushort(符号なし16ビット整数)にまとめてみる

```c#
ushort data = 2 | (8 << 4) | (10 << 8) | (15 << 12); 
```
OR演算子とビットシフトを使うことで
`2 = 0010`
`8 << 4 = 1000 0000`
`10 << 8 = 1010 0000 0000`
`15 << 12 = 1111 0000 0000 0000`
の4つのデータを組み合わせた・・・
`1111 1010 1000 0010`という`15 10 8 2`のデータが完成する！

## ビットからデータを取ってみる
欲しいデータは`2 8 10 15`
さきほど作ったデータは`1111 1010 1000 0010`となっている
まずは右端の4ビットを取り出したい
つまり`1111 1010 1000 0010`と`0000 0000 0000 1111`で同じ数値の場所(`0010`)を取得すれば良い

```c#
var data1 = data & 0b1111;
```
これで`0010`(`2`)が取れた！

ではこれで右端の4ビットがいらなくなった
なので4ビットを消して再度右端の4ビットを確認する

```c#
var data2 = (data >> 4) & 0b1111;
```
これで・・・`1000`(`8`)を取得できた！

あとは同じように8,12とビットをずらして右端を取得していくだけ
とても簡単！

## 全体のソース
```c#
ushort data = 2 | (8 << 4) | (10 << 8) | (15 << 12);

var data1 = data & 0b1111;
var data2 = (data >> 4) & 0b1111;
var data3 = (data >> 8) & 0b1111;
var data4 = (data >> 12) & 0b1111;

var text = string.Format("{0}\n{1} : {2} : {3} : {4}", data, data1, data2, data3, data4);
Console.WriteLine(text);
```

# 実際に使ってみよう
## 必要なビット数を調べる
>[Player] 最大値一覧
>体力:500 MP:250
>攻撃力:99
>転生回数:10
>ランクアップ済み判定:1

それぞれの最大値分だけビットを確保する
`500 -> 1 1111 0100(9bit)`
`250 -> 1111 1010(8bit)`
`99 -> 110 0011(7bit)`
`10 -> 1010(4bit)`
`1 -> 1(1bit)`
合計で29ビットになる
なので今回はint(符号付き32ビット)に埋める

## 調べたビットを元にデータを埋めていく
上で説明した手順と同じようにデータを埋めていく
そして確認で取得まで

```c#
//元データ
var hp = 500;
var mp = 250;
var attack = 99;
var reincarnation = 10;
var rankup = 1;
//intに全て埋める
int data = hp | (mp << 9) | (attack << 17) | (reincarnation << 24) | (rankup << 28);
//埋めたデータの確認
Console.WriteLine("HP:" + (data & 0b111111111));				//dataの末尾9bitを抜き出す
Console.WriteLine("MP:" + ((data >> 9) & 0b11111111));			//dataの末尾8bitを抜き出す
Console.WriteLine("Attack:" + ((data >> 17) & 0b1111111));		//dataの末尾7bitを抜き出す
Console.WriteLine("Reincarnation:" + ((data >> 24) & 0b1111));	//dataの末尾4bitを抜き出す
Console.WriteLine("RankUp:" + ((data >> 28) & 0b1));			//dataの末尾1bitを抜き出す
```
しっかりと1つのintに全てのデータを埋めることができた！
元々のデータを全てintで送っていた場合と比較すると`160 - 32 = 128`で128ビットの節約に成功！これはすごい！

# まとめ
ビットってすごい
PHPで日本語の曜日を使いたい

共通関数とか独自実装してるのをよく見るけどダサい　継承すれば透過的に使えてかっこいい

```php
class MyDateTime extends \DateTime
{
    public function format ($f) {
        $s = parent::format($f);
        $daynames = ['日', '月', '火', '水', '木', '金', '土'];
        $dayname = $daynames[parent::format('w')];
        return str_replace('x', $dayname, $s);
    }
}
```

```php
print (new MyDateTime())->format('Ymd(x)');
```

簡単だけどコードがぐっとシンプルになってとても便利なのでよく使う
多言語対応も簡単

```php
class MyDateTime extends \DateTime
{
    const DAYNAME_SET = [
        'ja' => ['日', '月', '火', '水', '木', '金', '土'],
        'ru' => ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб']
    ];

    public function format ($f, $lang = 'ja') {
        $s = parent::format($f);
        $daynames = self::DAYNAME_SET[$lang];
        $dayname = $daynames[parent::format('w')];
        return str_replace('x', $dayname, $s);
    }
}
```
Windows Server2016 RemoteAppのアプリ単位とデスクトップ単位のrdpファイル生成方法メモ

・ブラウザでリモートデスクトップWebアクセス(https:// FQDN 名/RDWEB)を開くとRemoteAppで公開しているアプリが表示される。
これをクリックするとrdpファイルがダウンロードできる。

・セッションコレクションを作成した直後の状態（RemoteAppのアプリが未登録）の場合はデスクトップ接続のrdpのみが表示され、クリックするとダウンロードできる。
会社をまたいで使いたいchrome拡張ツール

## Holmes
ブックマーク検索が可能 これがないと生きていけない
https://chrome.google.com/webstore/detail/holmes/gokficnebmomagijbakglkcmhdbchbhn?hl=ja

## ABP
広告ブロック たまたまエッチな広告が出てセクハラ担ったりするの怖くない？
https://chrome.google.com/webstore/detail/adblock-plus-free-ad-bloc/cfhdojbkjhnklbpkdaibdccddilifddb?hl=ja

## SearchPreview
クローム検索一覧にリンク先内のファーストビューを表示する。
「こんな見た目のサイトだったんだが、開かないとわからない」
「クソみたいなサイト開きたくない」場合に使える
https://chrome.google.com/webstore/detail/searchpreview/hcjdanpjacpeeppdjkppebobilhaglfo?hl=ja

## Black Menu for Google
サブウィンドウ内で検索が可能。 わざわざ新しいタブを作るまでもないことを検索する時用
https://chrome.google.com/webstore/detail/black-menu-for-google/eignhdfgaldabilaaegmdfbajngjmoke/related?hl=ja

## The QR Code Extension
サイトのQRコードを生成してくれる。　別端末で同じサイトを開きたいときに利用
https://chrome.google.com/webstore/detail/the-qr-code-extension/oijdcdmnjjgnnhgljmhkjlablaejfeeb?hl=ja
PHP5.4でセッションデータが保存されない問題

##環境
- CentOS7
- php5.4

##現象
[session_name()](http://php.net/manual/ja/function.session-name.php)でセッション名を指定したのちに、[session_start()](http://php.net/manual/ja/function.session-start.php)をしてセッションを開始しページを遷移したら、遷移後の画面でセッションデータが取り出せない


##原因と対処方法
###原因
session_name()の仕様を見てみると、以下のことが記述されている。
>name
>セッションの名前を参照します。これは、クッキーや URL (例: PHPSESSID) で使われます。 セッション名は英数字のみで構成されている必要があり、また、 短く、その内容が分かるようなものである必要があります (これは、クッキー警告を有効にしているユーザー用です)。

セッション名は英数字のみで構成されていなければならないが、今回指定していたsession_nameは"foo_bar"のように記号が含まれていた。

###対処方法
セッション名を指定する時の文字列は半角英数のみに変更することで無事にセッションが維持されるようになった。
ただし、PHP7.1ではセッション名に記号が入っていても問題がなかったので、php5系の問題かもしれません。
AWS Glue Job から MySQL を読み込む

awsglue が標準で提供している DynamicFrame の機能を使うなら簡単？

glue 内で spark の JDBC read で MySQL 読もうとすると JDBC が見つからないと言われる。

そんな時は↓

```
sc._jvm.Class.forName("com.mysql.jdbc.Driver").newInstance()
```