OmniAICreator/Qiita-1.07M huggingface dataset:
postgresqlのチューニングメモ by PGTune

## 概要

[PGTune](https://pgtune.leopard.in.ua/)を使って、postgresqlのチューニングをしたときの作業メモです。

## 手順

### 設定値を自動生成する

[PGTune](https://pgtune.leopard.in.ua/)を使って設定値を自動生成します。

### 現在の設定値を確認する。

psqlから以下をたたきます。PGTuneが出力した設定と見比べて問題がないか確認します。

```sql
SHOW max_connections; SHOW shared_buffers; SHOW effective_cache_size; SHOW maintenance_work_mem; SHOW checkpoint_completion_target; SHOW wal_buffers; SHOW default_statistics_target; SHOW random_page_cost; SHOW effective_io_concurrency; SHOW work_mem; SHOW min_wal_size; SHOW max_wal_size; SHOW max_worker_processes; SHOW max_parallel_workers_per_gather; SHOW max_parallel_workers;
```

### 設定を反映する

psqlからPGTuneのAlter Systemにあるコマンドをたたきます。
これを実行すると、postgresql.auto.confに設定値が書き込まれるので、次回起動時には設定が反映されますが、そのままだと現在のプロセスに設定が反映されません。```SHOW max_connections;```などを実行してみると、反映されていないことが分かると思います。

なので、postgresqlを再起動するか、pg_reload_conf()、pg_ctl reload、SIGHUPで現在のプロセスを再起動せずに設定を反映させます。

詳細は以下を参照
https://www.postgresql.jp/document/9.6/html/sql-altersystem.html

```sql
# DB Version: 10
# OS Type: linux
# DB Type: web
# Total Memory (RAM): 8 GB
# CPUs num: 8
# Connections num: 100
# Data Storage: ssd

ALTER SYSTEM SET
 max_connections = '100';
ALTER SYSTEM SET
 shared_buffers = '2GB';
ALTER SYSTEM SET
 effective_cache_size = '6GB';
ALTER SYSTEM SET
 maintenance_work_mem = '512MB';
ALTER SYSTEM SET
 checkpoint_completion_target = '0.7';
ALTER SYSTEM SET
 wal_buffers = '16MB';
ALTER SYSTEM SET
 default_statistics_target = '100';
ALTER SYSTEM SET
 random_page_cost = '1.1';
ALTER SYSTEM SET
 effective_io_concurrency = '200';
ALTER SYSTEM SET
 work_mem = '5242kB';
ALTER SYSTEM SET
 min_wal_size = '1GB';
ALTER SYSTEM SET
 max_wal_size = '2GB';
ALTER SYSTEM SET
 max_worker_processes = '8';
ALTER SYSTEM SET
 max_parallel_workers_per_gather = '4';
ALTER SYSTEM SET
 max_parallel_workers = '8';
```

### pg_reload_confで設定を反映

```sql
SELECT pg_reload_conf();
```

### pg_ctl reloadで設定を反映

調べていません。pg_reload_confで十分だと思います。

### SIGHUPで設定を反映

postgresの親プロセスを探す

```bash
ps axuf | grep postgres
```

SIGHUPを送る

```bash
kill -HUP [postgresのpid]
```
OTAアップデートに失敗して文鎮化(Softbrick)したHuawei P9を復旧した話

先日、Huawei P9が何もしてないのに壊れました。~~充電を忘れたままOTAアップデートを走らせた僕が完全に悪いんですけど~~

既存の記事に純正ROMのものはなかったので、一応復旧できたよってメモしておきます。
なお、**この方法を実行するとデータは全て消えます！**
**自己責任**で行ってください。どうなっても筆者は責任取れません。
そもそもカスタムしてないならHuaweiに修理してもらうのが一番確実です(僕の愛機は中古品だったのでめんどくさかった)。

# 環境

Huawei P9(EVA-L09)
root化なし
TWRP未導入
EMUI5.0 + Android7.0
バージョンはメモってないけど多分2018年5月のアップデート

8GB以上の空きがあるmicroSDカードと、それに書き込みできる環境が必要です。

# 結論

[ここ](https://consumer.huawei.com/jp/support/phones/p9/)よりAndroid 6.0にダウングレードしたら直った。

# 文鎮化時の状態

電源をつけると次のような文面が現れます。

```
Your device has failed verification and may not work properly.

To learn more, visit:
http://zh.ui.vmall.com/emotiondownload.php?mod=restore

(1) Press Power key to continue.
(2) Press Volume Up key up to 3 seconds to enter eRecovery to restore your device
(3) Your device will stop start, if there is no operation.
```

URLにアクセスしても www.emui.com にリダイレクトされるだけ。どうやらリンク切れらしいです:angry:
(1)を押してもループするだけなので、(2)に進むとHuawei eRecoveryが起動します。

eRecoveryはインターネットに接続して最新のROMをダウンロードして復旧してくれる~~けど大体使えないぽんこつ~~すごいやつです。
他にも工場出荷時の状態に戻したりとかに使いますが、まとめてくださっている方がいらっしゃいますので[こちらの記事](http://hermit.rosx.net/blog/?p=4894)をご参照ください(機種はM3ですが大体一緒です)。

さて、そのeRecovery画面で`Download latest version and recovery`を選択するとWi-Fi接続して本来なら復旧までしてくれるらしいです。失敗でしたけど。

さて、自動でやってくれないなら手動で行いたいところですが、日本版P9最新ROMは配布していないみたいです。

どん詰まり状態でしたが幸いにもAndroid6.0のROMは配布されていて助かりました。

# 手順

https://consumer.huawei.com/jp/support/phones/p9/
こちらのダウンロードページに日本語のダウングレードマニュアルPDFがあるので詳細はそれ読んでください。

一応簡単に説明します。

## 1. 中継パッケージにアップデート

中継パッケージEVA-L09C900B300にアップデートします。
公式サイトから中継パッケージのUPDATE.APP(90MBくらい)をダウンロードし、SDカードのルートディレクトリにあるdloadフォルダにコピーしてください。dloadフォルダがなければ作ってください。
そしたら+,-,電源ボタンを同時に長押しして起動し、強制アップデートを行ってください。

このとき1回失敗したんですけど、リトライしたら成功しました。

## 2. Android6.0にアップデート

多分まだ起動はしないと思うので、6.0にアップデート(ダウングレード)します。
UPDATE.APPをダウンロードして1.と同様にアップデートを行ってください。
ちなみに1.74GBあります。

## 3. 復活

おめでとう！あとは存分にアップデートかけてください。

# おわりに

自分はこの方法で復活できたってだけなので、他にも方法はあるかもしれません。
とりあえず常日頃からバックアップは取っておくようにしましょう。

# 参考記事
http://tak-droid-diary.techblog.jp/archives/15560034.html
League of Legendsの試合データから勝敗を判別する機械学習①

#はじめに
機械学習の勉強をしてみよう。と思い身近な何かをデータで用いたいと考え、データ量が豊富で、かつAPIでやれることが豊富なLeague of Legendsというゲーム[(公式サイト)](https://jp.leagueoflegends.com/ja/)を題材にしてみようと考えました。

内容としては、試合の戦績データから一部を抽出し、それらをデータセットとして用意し、戦績データから勝敗を見分けるというものです。
また、本記事では

#使うもの
本ゲームの運営が用意しているものに、RiotAIPというAPIがあるのですが、それを使いやすくしたriotwatcherというモジュールがあるため、そちらを使います。[GitHub](https://github.com/pseudonym117/Riot-Watcher)

#戦績データの確認
まずは、戦績データにどのような情報が入っているかを確認してみます。

事前にriotwatcherのインストール

```shell
pip install riotwatcher
```

戦績データの取得は

```python
from riotwatcher import RiotWatcher

watcher = RiotWatcher("{APIキー}")

region = "jp1" #サーバーの選択 日本鯖はjp1
name = "{サモナーネーム}" #サモナーネームの入力

summoner = watcher.summoner.by_name(region, name)
 #プレイヤーデータの取得
ranked_state = watcher.league.positions_by_summoner(region, summoner["id"])
 #プレイヤーのランクデータ
recentmatchlists = watcher.match.matchlist_by_account(region,summoner["accountId"])
 #直近20試合のデータのリストを取得
matches = recentmatchlists['matches']

match_data = watcher.match.by_id(region, matches[0]['gameId'])
print(match_data)
```
としました。

まず、モジュールを読み込んだあと

```python
watcher = RiotWatcher("{APIキー}")
```
でAPIキーの　入力を行います。このAPIキーは[こちら](https://developer.riotgames.com/)で取得することができます。
次に

```python
region = "jp1" #サーバーの選択 日本鯖はjp1
name = "{サモナーネーム}" #サモナーネームの入力

summoner = watcher.summoner.by_name(region, name)
 #プレイヤーデータの取得
ranked_state = watcher.league.positions_by_summoner(region, summoner["id"])
 #プレイヤーのランクデータ
recentmatchlists = watcher.match.matchlist_by_account(region,summoner["accountId"])
 #直近20試合のデータのリストを取得
matches = recentmatchlists['matches']

match_data = watcher.match.by_id(region, matches[0]['gameId'])
print(match_data)
```
では、最初に調べたいプレイヤーのサモナーネーム、またそのプレイヤーの選択しているサーバーを設定します。
また、試合データを見る際、直近20試合のデータをリストで取得するため、match_dataに代入するときは、インデックスは０にしました。理由としては、今回は戦績データの中身がどのようになっているかの確認のため、1試合分だけ欲しかったためです。これで最新の試合データを取得できます。

これを出力すると、最新の試合データがみれるのですが、あまりにも情報量が多く、1試合なのにも関わらず文字数にすると約3万文字にもなりましたので、一部分を画像で表示すると
![loldata.png](https://qiita-image-store.s3.amazonaws.com/0/278834/5a28669e-4532-aac0-3ebd-a26748779af4.png)
となります

#まとめ
これで試合データの中身を確認することが出来ました。
次はこの中から一部分のデータを取得し、さらにそれを複数試合のデータを取得したいと思います。

プログラミング初心者の拙い文章ではありますが、最後まで見ていただきありがとうございました。

League of League of Legendsの試合データから勝敗を判別する機械学習②は[こちら](https://qiita.com/hyo_07/private/fb501e985f4dec6d2810)
OpenSearch を有効活用しよう (1/3)

⇒ OpenSearch を有効活用しよう (1/3)
[　 OpenSearch を有効活用しよう (2/3)](https://qiita.com/ctrlzr/items/9b2f6623a0192d7515cd)
[　 OpenSearch を有効活用しよう (3/3)](https://qiita.com/ctrlzr/items/33cd533606d427708a56)


#OpenSearch

OpenSearchはシンジケーションとアグリゲーションに適する形式で検索結果を発行することを可能にする技術群である。これはウェブサイトと検索エンジンが標準的でアクセス可能な形式で検索結果を発行する方法である。[wiki](https://ja.wikipedia.org/wiki/OpenSearch)

![理解不能](https://ctrlzr.sakura.ne.jp/img/ameblo/rikaifuno.gif) 
しげちーの言うとおりさっぱり解かりませんが、とりあえずOpenSearchを始めてみましょう。

### 準備は簡単。用意するファイルは2つ

- linkタグ
htmlのヘッダ部に追加します。
`<link href="/opensearch.xml" rel="search" title="Qiita" type="application/opensearchdescription+xml">`

- opensearch.xml
linkタグのhrefで指定したファイル名で保存します。
ポイントは**ShortName**と**ドメイン**と**Url**。他の検索エンジンと被らない短い名称を付けます。サブドメインで構わないので、他の検索エンジンと被らない名称を取得します。
Urlはルートにします。`https://qiita.com/honya/search?q={searchTerms}`ではダメです。

```ruby:opensearch.xml
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" xmlns:moz="http://www.mozilla.org/2006/browser/search/">
<ShortName>Qiita</ShortName>
<Description>Search Qiita</Description>
<InputEncoding>UTF-8</InputEncoding>
<Image height="16" type="image/x-icon" width="16">/assets/favicons/public/production.ico</Image>
<Url method="get" template="https://qiita.com/search?q={searchTerms}" type="text/html"/>
<moz:SearchForm>https://qiita.com/search</moz:SearchForm>
</OpenSearchDescription>
```

1回目はここまで
第二回　Programing夏期講座　LESS 

#LESS

LESSはCSSをより使いやすくするための言語。
Leaner CSSの略。leanは「無駄のない」「効率的な」の意味。

##特徴

- 変数を扱うことができる
- 入れ子構造で、宣言を簡単に書ける
- スタイルをクラスで一括に格納しておくことができる

##使い方

###呼び出し方
大抵のブラウザは、Lessを直接翻訳することとができないため、サーバーサイドでCSSに変換する必要がある。

####クライアントサイド変換方式

速度はサーバーサイド変換方式よりも劣るが、非常に手軽。
Lessのファイルを読み込んだ後に、less.jsを読み込む必要がある。
less.jsは下記からダウンロード可。
(Lessはjavascriptで組まれている)

> http://lesscss.org/

```html
<link rel="stylesheet/less" type="text/css" href="style.less">
<script src="http://cdnjs.cloudflare.com/ajax/libs/less.js/2.5.1/less.min.js"></script>
```

また、chromeの起動オプションに書きを追加する必要がある。

```html
"C:\Program Files\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files
```

URLの最後に#!watchを追加することで、lessファイルの更新を、リアルタイムに反映することができる。

####サーバーサイド変換方式

Lessコンパイラは、Node.jsのパッケージマネージャnpmを用いて下記のようにインストールする。(windowsならpower shellで実行可能)

▶ コンパイラとは
簡単に言うと、翻訳者。
ソースコードを、コンピューターが実行可能なオブジェクトコード（形式）に変換する作業を行うためのプログラム。
その過程自体を**コンパイル**という。
Lessにおいて言うなら、CSSに変換する作業。

```html
$ npm install -g less
```

Lessコンパイラ(lessc)を用いて、Lessファイルをコンパイルする。

下記の例は、style.lessファイルをstyle.cssファイルにコンパイルしている。

```html
$ lessc style.less style.css
```

--clean-cssオプションは、縮小（minified）されたcssファイルを作成することができる。
プラグインがインストールされていない場合は、npmでless-plugin-clean-cssプラグインをインストールする。

```html
$ lessc --clean-css styles.less styles.min.css
```
コンパイルすると//を用いたコメントは削除される。

##変数
lessでは変数を扱うことができる。

ex).

```css
@mycolor:blue;

h1{
 fontcolor:@mycolor;
}
```

また、変数名を"___",'___'といった形で使用する場合、セレクタやプロパティ名を変数定義した場合には、
@{変数名}といった形で使用する。

```css
@headers:h1,h2,h3,h4;
@property:color;
@{headers}{
  @{property:block;}
}
```
また、画像データなどを挿入するために、urlを挿入する際に、ファイルの場所が変わっても対応できるように、変数を使って以下のような書き方もできる。

```css
@dir:../img;

h1{
background:url("@{dir}/big.png");
}
```

##ミックスイン
ミックスインは、継承用に利用されるクラス定義。

```css
.mybox{
border:1px solid #999;
}
h4{
color: #366;
.mybox;
}
```

引数を受け取るミックスインも定義可

```css
.mybox(@width; @color){
 border:@width solid @color;
}
h1{
 .mybox(1px; #666);
}
```

引数にマッチする条件によって適用するミックスインを変更できる機能もある。

##ネストルール

lessの良さとして、階層的に書くことができるという良さがある。

例えば、

```html
<div class="A1">
<h1>未来電子</h1>
<p>インターン</p>
</div>
```

という内容のhtmlがあったとすると、これに対して、

```css
.A1{width:500px;
    margin: 0 auto;
h1{
  font-size:@{h3-size};
p{
  font-size:@{a-size};
  backgroud:url("@{dir}/test.png");
}
}
}
```

のような指定の仕方ができる。
curlパッケージにはlibcurl4-gnutls-devが必要

Stackで依存関係の一部として`curl`パッケージをインストールしようとしたところ、次のようなエラーメッセージが表示されました。

```
Configuring curl-1.3.8...
setup: Missing dependency on a foreign library:
* Missing (or bad) C library: curl
This problem can usually be solved by installing the system package that
provides this library (you may need the "-dev" version)..
```
`apt`で`curl`を探してみると、`libcurl4`は既に入っているし他に`libcurl3`もあるしでよく分からない状態。そこで検索したところ、この`Missing C libarary`とは`libcurl4-gnutls-dev`を指すのだということが分かりました。

[Make libcurl4-gnutls-dev dependency more obvious · Issue #2813 · commercialhaskell/stack](https://github.com/commercialhaskell/stack/issues/2813)
コマンドラインでよく使うコマンドと基礎

# LinuxまたはMacでよく使うコマンドを中心に紹介します

---

### 目次

- 移動・表示・作成・削除(基本)
- ネットワーク
- エディタ
- 障害対応のときとか
- パイプ
- シェル

---

# 移動・表示・作成・削除

---

- cd → 移動。チェンジディレクトリ
- pwd (-P)→ カレントディレクトリのパスを表示
- ls (-la)→ ディレクトリ内のファイル表示
- cat → ファイルの内容を標準出力
- less → ファイルの中身を表示

---

- echo → 引数で指定した内容を標準出力
- time → コマンドの実行時間を表示
- tail (-f)→ ファイルの末端の10行を表示
- mkdir → ディレクトリ作成
- touch → 空のファイル作成。ファイルを指定するとタイムスタンプが変更される

---

- mv → ファイルの移動・リネーム
- rm (-r)→ ファイル・ディレクトリの削除
- cp → ファイルのコピー
- man → コマンドのマニュアルを表示
- find → ファイルを検索
- grep → ファイル内の文字列を検索

---

- diff → ファイルとファイルの差分を表示
- ps aux → 現在実行されているプロセスの表示
- ln -s → シンボリックリンクを作成
- chmod → 実行権限を変更
- chown → 実行ユーザーを変更

---

# ネットワーク

---

- ssh → リモートサーバーにアクセスするために使う
- whois → ドメイン情報を表示
- dig, nslookup → ドメイン名からIPアドレスを調べる
- curl → CLIからHTTPリクエストを送信
- scp → リモート・ローカルでファイル転送

---

# エディタ

---

- vi, vim
- emacs(入ってれば)
- nano(殆ど使わないと思うけどDockerで触るかも)
- code(vscode入ってれば)
- atom(atom入ってれば)

emacsとかcodeとかatomとかはLinuxには普通入ってないけど一応載せておいた

---

# 障害対応のときとか

---

- top (-a) → 実行中のプロセスをリアルタイムでcpuやメモリ順にソート
- du, df → ディスク容量確認

すでに出てきたコマンドもよく使う。これらはサーバーに入らなくても表示できるよう、監視を整備しておいたほうが楽

---

# パイプ

---

`|` を使って、コマンドの実行結果を次のコマンドに渡すことができる

---

### 例

```
# ファイルに'foobar'という文字列を追記
$ echo 'foobar' >> buzz.txt

# ファイルの内容を標準出力に出しその内容をgrepすると
# foobarという文字列が結果として出る
$ cat buzz.txt | grep bar
foobar
```

---

## awk, sed, perlなんかを使うともっと高度ことが出来る(今回は割愛)

---

# シェル

---

これまで紹介したコマンドをコンピュータ(カーネル)に伝えるためのプログラム

---

- bash
- zsh
- fish

各々CLIでの操作が便利になるようカスタマイズできる。最近だとfishが良いという噂。

---

# まとめ

---

- 基本のコマンドは抑えよう
- helpやmanで使い方・便利オプションをチェックしよう
- パイプは積極的に使おう
- 合わせて「UNIXという考え方」という本も読んでおくとベスト
- シェルの設定もやってみよう
PC-88 z80asmでセミグラフィック

```sample.asm
; z88dk / 8801
; z80asm -b -l sample.asm

        org     $b000
start:
        call    crtset
        call    cls

        ld      hl, data
        ld      b, 160
        ld      c, 0            ; x
.loop
        push    hl
        push    bc
        ld      a, 50           ; y = 50 - (hl)
        sub     (hl)
        ld      b, a
        ld      a, (hl)
        add     a, a
        call    line
        pop     bc
        pop     hl
        inc     hl
        inc     c
        djnz    loop
.exit
        di
        halt

crtset:
        ld      hl, $e6b4
        ld      (hl), $98       ; アトリビュート
        inc     hl
        inc     hl
        inc     hl
        inc     hl
        ld      (hl), $00       ; ファンクション・キー表示スイッチ
        inc     hl
        ld      (hl), $ff       ; カラー／白黒スイッチ
        ld      b, 80
        ld      c, 25
        call    $6f6b           ; CRTSET
        ret

cls:
        xor     a
        ld      hl, $f3c8
        ld      de, 40          ; アトリビュート長さ
        ld      c, 25
.clsy
        ld      b, 80
.clsx
        ld      (hl), a
        inc     hl
        djnz    clsx
        add     hl, de
        dec     c
        jr      nz, clsy
        ret

; b=y c=x a=高さ
line:
        dec     a
        ret     m
        push    af
        push    bc
        call    pset
        pop     bc
        pop     af
        inc     b
        jp      line

; b=y c=x
pset:
        ld      a, b            ; de = y & $fc
        and     a, $fc
        ld      e, a
        ld      d, 0

        ld      hl, 0           ; hl = de * 30
        add     hl, de
        add     hl, hl
        add     hl, de
        add     hl, hl
        add     hl, de
        add     hl, hl
        add     hl, de
        add     hl, hl          ; %11110=30倍

        ld      e, c            ; hl += x / 2
        srl     e
        add     hl, de

        ld      a, b            ; a = ((x&1) ? $10 : $01) << (y&3)
        and     a, $03
        ld      b, a
        ld      a, c
        and     1
        ld      a, $01
        jr      z, pset1
        ld      a, $10
.pset1
        dec     b
        jp      m, pset2
        add     a, a
        jr      pset1
.pset2

        ld      de, $f3c8       ; *($f3c8+hl) |= a
        add     hl, de
        or      (hl)
        ld      (hl), a
        ret

data:
        defb    05,05,05,05,05,05,05,05,13,13,13,13,13,13,13,13,13,21,21,21
        defb    21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22
        defb    22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23
        defb    23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23
        defb    23,23,23,23,23,23,23,25,25,25,25,25,25,25,25,25,25,25,25,25
        defb    25,25,25,25,25,25,25,25,25,25,25,25,25,23,23,23,23,22,22,22
        defb    21,21,20,20,19,19,19,18,17,17,04,04,04,04,04,04,04,04,04,04
        defb    03,03,03,03,03,03,03,00,00,00,00,00,00,00,00,00,00,05,05,05
```

`bin2t88 SAMPLE b000 sample.bin`

`mon`
`h]r`
`h]gb000`

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/257554/38723a95-8480-4cf8-aece-1054c8ab3992.png)
Swiftでフレーム毎にアニメーションさせる

どうも、はぐっです・ω・♪

# Swiftでアニメーションを行う

## アニメーションの方法は様々

- UIView.animate
- CABasicAnimation
- AutoLayoutとlayoutIfNeeded

とかとか。
その中で今回は、フレーム毎に値を計算してアニメーションさせる方法を紹介。

## 実装

早速、実装どーん！

```swift
private func setupLoop() {
    self.displayLink = CADisplayLink(target: self, selector: #selector(self.update))
    self.displayLink.preferredFramesPerSecond = 60 // 60fps
    self.displayLink.add(to: .current, forMode: .commonModes)
    self.displayLink.isPaused = false // ループスタート
}

@objc
private func update(displayLink: CADisplayLink) {
    // ここでアニメーション処理
}
    
```

アニメーションの手順

- setupLoopでループ始める前に現在時刻を取得する
- updateに入ってきた時の時刻との差で進捗状況を計算する
- アニメーション対象のプロパティ(transform,opacity等)に、進捗状況に応じた値を入れる

こんな感じ！
進捗状況の計算にEasing使ったりすると、いい感じのアニメーションが作れるよ！

で、このままやと一生ループが走るから、止めたいタイミングで

```swift
self.displayLink.isPaused = true
```

として、ループを止めます。

いじょっ！

## 終わりに
今回はもろもろ割愛しますが、今回のような形のアニメーションにはTimerとかよりもCADisplayLinkの方が優秀かと。

めっちゃわたくしごとですが、jQueryではなく生のJavaScriptでアニメーションを実装したときもこんな形で実装していたので、とっつきやすかったですねー！
OculusGoで起動時のスプラッシュ画像(unityロゴ)を差し替える方法

VRアプリケーションは起動時に表示されるスプラッシュの扱いが特殊で、スプラッシュ画像を指定する箇所が少し通常と違っている。

環境: Unity 2018.1.5f1 (64-bit) Personal / OculusUtilities(1.26.0 2018/06/20)

## 設定場所

Edit→ProjectSettings→Playerで以下のインスペクタを表示させて、「Virtual Reality Splash Image」に画像を設定することで、起動時のスプラッシュ画像をunityロゴから指定した画像に差し替えることができる。

- 背景は黒固定のようなので、背景黒の画像を設定するのがよさそう。
- VRスプラッシュは、unityロゴ画像をまるごと置き換える設定しか無いようでpersonal版でも"made with Unity"の表示を無くすことができた。

![sp.png](https://qiita-image-store.s3.amazonaws.com/0/92354/f30c5013-4dda-e1e6-c044-c640029aaa10.png)
styled-componentsとhue-rotateで1枚の画像を怠惰にカラフルにする


何らかのMockを作るときなど、アバターアイコンを色々配色させたいことがある。
Twitterの昔あった卵アイコンみたいなやつ。
styled-componentsとcssのhue-rotateを利用すると雑にpng一枚用意するだけで出来る。

↓こんな感じにできる。
<img width="662" alt="React_App.png" src="https://qiita-image-store.s3.amazonaws.com/0/7307/84abae81-0029-22e3-705b-e06d7e01cd45.png">


「SVGでやったほうがいいんだけどちょっとだるい」みたいなときにおすすめ。
実装とか色々考えると圧倒的にsvgとかでやったほうがいいので繋ぎの手段としてどうぞ。

あと今回はstyled-componentsでやっているが、CSSの機能なのでsassとかでも出来るはず。
styled-components使うことで動的に処理できるという点が旨味

# 実装
例えばこんな画像を用意する
![icon.png](https://qiita-image-store.s3.amazonaws.com/0/7307/10d589c7-bc46-f61a-442d-f609f58fdf3e.png)

で、こんな具合に実装。

```js
import React, { Component } from "react";
import icon from "./icon.png";
import styled from "styled-components";

const randomAngle = () => {
  const num = 7; // ランダムに出したい色数
  return (Math.ceil(Math.random() * num) * 360) / num;
};

// ここでhue-rotate使う
const MockAvater = styled.img`
  filter: hue-rotate(${() => `${randomAngle()}deg`});
`;

class App extends Component {
  render() {
    return (
      <div className="App">
        <MockAvater src={icon} width="80" />
      </div>
    );
  }
}
```

もし「色数は変数を渡したい」みたいな場合であればこんな感じ


```js
const getAngle = (idx, max) => {
  console.log(idx);
  return (360 * idx) / max;
};
const MockAvaterManual = styled.img`
  filter: hue-rotate(${({ idx, max }) => `${getAngle(idx, max)}deg`});
`;

class App extends Component {
  render() {
    return (
      <MockAvaterManual src={icon} width="80" max={8} idx={0} />
    )
  }
}
```
LESSとは？ホームページを効率的に書く言語の1つ！

#LESSについて！
簡単にLESSという言語についてまとめた記事です。

##そもそもLESSとは？
LESSとは、CSSメタ言語というページのスタイルを規定するための言語の1つです。

___
・「CSSメタ言語」
スタイルを規定するCSSの再利用性や保守性を上げるために、様々な追加の関数や文法を加えたもの。
進化したCSS言語と言える。
____
とても簡単にいうと、

**「LESS」=「効率的なCSSをかくツール」**

ということができる。

##LESSに必要な環境
LESSは、「Node.js」の「npm」によって提供されています。
つまり「npm」のインストールは必須です。
下記のURLからインストールできます。
https://nodejs.org/en/

##LESSの概念
ここでは、どのようにしてLESSでスタイルをの規定できるのか見ていきましょう。

基本的な流れは以下の通りです。

➀LESSを用いてコードをかく。
➁コンパイルするためのコマンド入力。
➂先ほどのLESSがCSSに変わる。

つまり
「LESSファイル➡コマンド入力➡CSSファイル」
ということです。

##LESSの書き方
**・「変換コマンド」**
LESSのファイルをCSSファイルに変換する時のコードです。

```
lessc (A) (B)

(A):変換元のファイル
(B):変換先のファイル
``` 


**・「変数」**
LESSでは、変数を作って、そこに属性の値を入れることができます。

```
変数なし

h1{
  font-size : 10px;
  color : bule
}

h2{
  font-size; 33px
  color : blue
}
```

```
変数あり
@color: blue

h1{
  font-size : 10px;
  color : @color
}

h2{
  font-size; 33px
  color : @color
}
```


**・「関数」**
LESSには、いくつかの関数が存在します。
今回は色についての関数をご紹介します。

```
h1の色よりh2の色を20％暗くしたい場合→darken
```
```
@h1-color: blue;
@h2-color: darken(@h1-color, 20%)

```

**・「階層」**
CSSにおいて一見複雑になりがちな「階層」をシンプルに書くことができます。

```
階層が複雑

header {
    font-size: 30px;
}

header a {
    color: blue;
}
```
```
階層を単純化

header {
  font-size: 30px;
}
header a {
  color: blue;
}
```

**・「ミックスイン」**
LESSには、ミックスインという考え方があります。
ミックスインとは、「特定の情報を1つの倉庫に管理する」という考え方です。

```
ミックスインなし

h1 {
  font-size: 58px;
  border: 10px solid red;
  padding: 10px;
}
h2 {
  font-size: 30px;
  border: 10px solid red;
  padding: 10px;
}

```
```
ミックスインあり

.h-information{
  border: 10px solid red;
  padding: 10px;
}

h1 {
  font-size: 58px;
  .h-information;
}
h2 {
  font-size: 30px;
  .h-information;
}

```
Kerasでmodule 'tensorflow.python.framework.ops' has no attribute '_TensorLike'のエラー

Kerasを使っている時に、エラーが出て実行ができません。Kerasを使い慣れている方、ご教授ください。よろしくお願いいたします。
### 発生している問題・エラーメッセージ
jupyter notebookを使っていて、以下が入力コードです。
> from keras.models import Sequential
> from keras.layers import Dense
> 
> model = Sequential()
> model.add(Dense(64, activation='relu', input_dim=784))

上記のコードを実行すると、以下のようなエラーメッセージが出ます。

> AttributeError: module 'tensorflow.python.framework.ops' has no attribute '_TensorLike'

Kerasやtensorflowもインポートできているみたいなのですが、エラーが出て先に進めません。「input_dim=784」を入れるとこのエラーが出るみたいです。
### 試したこと

英語でエラーを調べても、まだ同じような質問に回答がなく、日本語だとダイレクトに答えている回答はありませんでした。

### 補足情報（FW/ツールのバージョンなど）

・Macbook Pro 10.12.6（品質の良い中古品）
・echo $PATH
/anaconda3/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

・.bash_profile
###### export PYENV_ROOT="$HOME/.pyenv"
###### export PATH="$PYENV_ROOT/bin:$PATH"
###### eval "$(pyenv init -)"
###### export PATH="/anaconda3/bin:$PATH"

・Python 3.6.1
・tensorflow                        0.10.0 
・Keras                             2.2.2
ネイティブアメリカン goodman usa グッドマンはすぐに電話08562806220

![goodman usa.jpg](https://qiita-image-store.s3.amazonaws.com/0/278852/0883423e-f851-2c7f-b9d1-66a546b2afa1.jpeg)

グッドマンの米国原薬は100％実質であることが証明されています。グッドマン・ハーバルは医師の拡大鏡です。アメリカ製P永久人工は比較的短いと効果的に陰茎のサイズを増加させることができました。グッドマンの薬はMr.世界で最も有名なP.グッドマンUSAのオリジナルは現在拡大製品氏の男を選ぶ際に最有力候補となっていますPは正しい信頼できる品質です。

今では市場の今すぐ右に登場する多くのDRUG VimaxのFROM SELECTIONSをだということだからだから、陰茎も強壮良い人ではアメリカで発明や研究ザ・メディカルから作成薬、それは、<a href="http://khasiathammer.com/jual-obat-goodman-usa-original-terpercaya/">goodman usa</a>すべての中のWHEREディ医薬品庁不可欠なツール男性常設良い男ピルを作成します。カプセルヤンDiは男のほかVimaxのいい男USA薬セイ当局不可欠なツールでも大ロング不可欠なツール男性サイズを大きくする特殊オススメ、そうすることができます。

拡大鏡ツールバイタル男性常設いい男USA主にアメリカで世界全体のすべてのManyarakat（USA）の中に熱心で今プレンティ、良い人の丸薬は、このような材料は、から構成され、100％ナチュラルで安全、素材善人物質で作られていますVimaxのヤンDiはより効果的な結果のために再度リセットし、有効性を改善し、薬物VimaxのグッドマンUSAより良い場合は薬が締結できる場所それはだから、シャークCarhiageペルー人参（根）でハーブ成分を増やすこと。

より魅力的な様々な製品もご用意しており、<a href="http://khasiathammer.com/penirum-kapsul-asli-obat-pembesar-alat-vital-herbal/">すぐに上記</a>の連絡先に連絡してください
VSCode で 言語ごとに文字コードを指定する

## ぼく）はー Powershell のスクリプト作るとき、つい UTF8 で作って文字化けするんじゃー

言語ごとに文字コードとか設定できたらいいのになあ…。

```json:settings.json
{
    "[powershell]":{
        "files.encoding": "utf8bom"
    }
}
```


ﾄﾞｺﾄﾞｺ┗(^o^)┛ﾄﾞｺﾄﾞｺ┏(^o^)┓ﾄﾞｺﾄﾞｺ┗(^o^)┛ﾄﾞｺﾄﾞｺ┏(^o^)┓ﾄﾞｺﾄﾞｺ┗(^o^)┛ﾄﾞｺﾄﾞｺ┏(^o^)┓

参考： https://github.com/Microsoft/vscode/issues/4891
Ransackでのデータベース検索機能実装

## ransackとは
ransackはrails用の検索機能を実装するためのgemです。このgemを利用することにより、高機能なキーワード検索を実装できるようになります。例えば、検索キーワードが入力された場合には、そのキーワードに紐づいたデータを取得し、検索キーワードが入力されていない場合には全件検索を行う、といった柔軟な検索機能が実装できるようになります。

以下のgemを追加

```ruby
gem 'ransack'
```

```
bundle install
```

データを登録するためのデータベースを作成します。まずは、modelを作成しましょう。modelの名前はuserにしてください。

```
rails g model user
```

作成されたマイグレーションファイルを以下のように編集しましょう。

```ruby
class CreateUser < ActiveRecord::Migration[5.0]
  def change
    create_table :user do |t|
      t.string :name
      t.integer :age
      t.timestamps
    end
  end
end
```

マイグレーションファイルを編集したらマイグレートを実行し、テーブルを作成しましょう。

```
bundle exec rake db:migrate
```

次に、検索用のデータを投入します。今回は、`seed`の機能を利用してサンプルデータを作成します。以下のコードを`db/seeds.rb`に記入しましょう。

```
User.create(name: '斉藤', age: 35)
User.create(name: '田中', age: 21)
User.create(name: '佐藤', age: 32)
User.create(name: '山岸', age: 33)
User.create(name: '平', age: 26)
User.create(name: '加藤', age: 25)
```

`seeds.rb`に用意したデータをUsersテーブルへ投入します。以下のコマンドを実行しましょう。

```
bundle exec rake db:seed
```

データを投入したら、検索メソッドを実装するためのモデルを作成しましょう。今回作成するモデルのファイル名は`user_search.rb`です。`user_search.rb`ファイルの作成が終わったら、そのファイルに`UserSearch`クラスを定義し、`UserSearch`クラスに検索用の`execute`メソッドを定義しましょう。その際、`search_name`と`search_age`のインスタンス変数を定義します。その`execute`メソッドの中で、`ransack`の機能を利用します。

※`user`モデルに検索用のメソッドを実装する場合、インスタンス変数の名前がテーブルのカラム名と同じ値になると、データが登録できない状態になるので注意が必要です

```ruby
class UserSearch
  include ActiveModel::Model

  attr_accessor :search_name, :search_age

  def execute
    User.ransack(name_eq: @search_name, age_eq: @search_age).result
  end
end
```

モデルの編集が終わったら、次にルートを設定しましょう。`routes.rb`に以下のコードを追記してください。

```ruby
get '/users/search', to: 'users#search'
```

ルートの設定が終わったら、`users`コントローラに対応するアクションを記述します。そのため、まずは`users`コントローラを作成しましょう。以下のコマンドを実行してください。

```
rails g controller users
```

`users`コントローラが作成できたら、`search`アクションを追加しましょう。検索フォームから送信された`params`は`params_user_search`メソッドから受け取るようにします。

```ruby
def search
    user_search = UserSearch.new(params_user_search)
    @users = user_search.execute
end

private

def params_user_search
  params.permit(:search_name, :search_age)
end

```

`users`コントローラのアクションが定義できたら、次は画面の作成に移ります。検索機能を実装するには、検索ワードを入力するための画面が必要なので、次に、検索用の入力画面を作成しましょう。`users`ディレクトリに`search.html.erb`を作成し、以下のコードを記述しましょう。

```
<%= form_tag('/users/search', method: :get) do %>
  <%= label_tag :名前 %>
  <%= text_field_tag :search_name %>
  <%= label_tag :年齢 %>
  <%= text_field_tag :search_age %>
  <%= submit_tag '検索' %>
<% end %>
<table>
  <tbody>
    <thead>
      <tr>
        <th>名前</th>
        <th>年齢</th>
      </tr>
    </thead>
    <% @users.each do |user| %>
      <tr>
        <td><%= user.name %></td>
        <td><%= user.age %></td>
      </tr>
    <% end %>
  </tbody>
</table>
```

それでは、検索画面にアクセスし、動作確認をしましょう。サーバーを立ち上げた後、[http://localhost:3000/users/search](http://localhost:3000/users/search)にアクセスし、検索ワードを入力し、検索ボタンを押してみて下さい。

以上で検索機能の実装は終わりです。きちんとユーザーが検索できるか確かめて見ましょう。
複数のWebMvcConfigurerの登録

あまり機会は無いがspringで複数の```WebMvcConfigurer```を登録する方法について。

といっても```WebMvcConfigurer```の実装クラスを二つ用意するだけ。読込順序に関しては```@Order```や```@DependsOn```で制御する。

### pom.xml

```xml:pom.xml
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.4.RELEASE</version>
	</parent>
```

### Configuration

```java
import java.util.List;

import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@Order(1)
public class FirstConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        System.out.println("first");
    }
}

```

```java
@Configuration
@Order(2)
public class SecondConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        System.out.println("second");
    }
}
```

特に深い意味はないが、適当なメソッドをオーバーライドして読込順序確認用の出力をしている。

実行すると以下のように表示される。

```
first
second
```
Android 9 PieのBluetooth周りの変更点


## はじめに
Android 9 PieでのBluetooth周りの変更点について、AOSPのコミットログを参考にしてまとめてみました。
このバージョンでは久しぶりにClassic Bluetoothへの機能追加が行われています。対してLow Energyのほうは
リファクタリングや不具合修正がメインのようです。


## 注意事項
- 2018/07/19時点のAOSPのコミットログを参考にしています。
- 最新の情報と異なる可能性がありますのでご注意ください。
- 公式発表された情報ではありません。正確な情報はAndroidの公式ページを御覧ください。

## Bluetooth補聴器対応(Hearing Aid)
iOSでは既に対応済みでしたが、AndroidでもBluetooth補聴器が使えるようになるようです。
補聴器とBluetooth接続し設定を変更したり、補聴器で直接電話を受けたり音楽を聞いたり。
といった用途が想定されます。

## Bluetooth HIDデバイス対応
Android Oreoまでは、Android端末をホストとしてキーボードやマウスをBluetooth接続することができました。
Android 9 PieではAndroid端末自身をBluetoothキーボードやマウス、トラックパッドとして使うことができるようになるようです。

## Bluetoothオーディオ機器のボリューム記憶
Bluetoothオーディオ機器のボリュームを記憶しておいて、次回接続時はそのボリュームで音声が再生されるようになります。
初めて接続したBluetoothオーディオ機器は初期値50%のボリュームで再生されます。

この対応により、いきなり爆音で再生されてびっくりするといったことが無くなりそうです。

## Bluetoothオーディオ機器の同時接続と切り替え
複数のBluetoothオーディオ機器と同時に接続した時に、音声の出力先を切り替えることができるようになります。
複数のオーディオ機器で同時に再生する、というわけではなくてあくまでも切り替えられるだけのようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/102273/c2e7d8a0-9ba6-167b-35d9-aa1b7c1f6806.png)

## Bluetooth未接続時のBluetoothアイコン非表示
Bluetooth機器が何も接続されていない時はBluetoothアイコンが表示されなくなります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102273/11037b3f-e5a3-30be-6670-9d85f095013b.png)

## その他
Android 9 PieのBluetooth周りは、Oreoに引き続き不具合修正とリファクタリングを継続しているようです。
AOSPのコミットログを見ると以下の内容のコミットが多い印象でした。

- 不具合の修正
- リファクタリング
- ログ出力の整理
- 単体テストの追加

## AOSPのコミット
普段はアプリ側のソースしか見ませんが、Androidの中のソースも見てみると色々と参考になって面白いです。
以下は、Bluetooth周りで気になったコミットのリンクの一部です。

- [BTオフオン時のデッドロック修正](https://android-review.googlesource.com/c/platform/packages/apps/Bluetooth/+/712088)

- [新しくペアリングしたデバイスの音量は50%にする] (https://android-review.googlesource.com/c/platform/packages/apps/Bluetooth/+/704445)

- [機内モードオン・オフ時のクラッシュを修正(AVRCP,HID)](https://android-review.googlesource.com/c/platform/packages/apps/Bluetooth/+/692603)

- [GATTサーバー リファクタリング](https://android-review.googlesource.com/c/platform/packages/apps/Bluetooth/+/212322)

- [SMP_Encryptのリファクタリング](https://android-review.googlesource.com/c/platform/system/bt/+/705409)

- [アドバタイズ開始時にクラッシュする不具合を修正](https://android-review.googlesource.com/c/platform/system/bt/+/546019)
AmazonSESから携帯キャリアメールに届く確率を上げる

この記事は
===

* とあるサービスを運営しています
* そのサービスでは、（よくある動きですが）一度ユーザ仮登録メールを送ってリンクをクリックして本登録画面に遷移するような動きをします
* AmazonSESからこのメールを送信しているのですが、携帯キャリアのメールアドレス（特にdocomoとau）の大半が本登録リンクをクリックしていない事象が発生しました
* どうやらそもそもメールが到着していないようです
* この記事はこの問題へ対処するにあたり色々調べたのでそのメモです

よくあるワークアラウンド
===

* エンジニアの守備範囲としては「mydomain.netからのメールが到着するように許可してください」という注意書きを入れてお茶を濁してもいいのですが、はっきり言ってそんな設定してくれる人は一握りなので、もっと効果的な対処をしたかったです


結論からいうと
===

* あまりに当たり前みたいな結論ですが、```DNSに自サイトのドメインのSPFのTEXTレコードを入れる```というのが結論です
* なんだSPF設定してない情弱か！で終わりそうですがちょっと待って！「AmazonSESはそれ自体がSPF対応しているから個別には入れないでOK」という理解をしている人が（以前の自分も含めて）多いのです
* だってGMail含む「普通のメール」では普通にSPFチェック通って到着するんですから

前提として(メールのFrom）
===

Fromの種類
---

* そもそもの前提知識ですが、メールのFromには下記の２種類あります
    * （１）エンベロープFrom
    * （２）ヘッダFrom
* （１）はバウンスを処理するような場合などに利用される「システムが利用するアドレス」的な役割です
* （２）はメーラでFromとして表示される「人間が利用するアドレス」的な役割です
* メールファイルをテキストエディタで開くとどちらも書いてあります

SESで送った場合
---

* SESでメールを送信すると、各Fromには下記のように指定されます
    * （１）・・・xxxxx.smtp-out.us-west-2.amazonses.com
    * （２）・・・xxxx@yourdomain.net
        * 自サービスのドメイン

普通のメールサーバのSPF確認
===

* 普通のメールサーバ（例えばGMailなど）は基本的にSPFは上記の（１）エンベロープFromのドメインのみチェックします
    * つまり、上記の例でいうと、```amazonses.com```ドメインを管轄しているDNSにSPFの問い合わせをかけるわけです
    * この場合、おそらくAmazon自らが管理しているDNSサーバに、SPFレコードが元々登録されていると思われます
    * これが、SESはSPF設定不要説の根拠だと思われます
* 逆に（２）ヘッダFromはチェックしません
    * だから、mydomain.netのDNSにSPFレコードの設定をしなくても問題ないわけです

携帯キャリアのメールサーバのSPF確認
===

* 一方、携帯キャリアのメールサーバについては下記の記載があり、要するに設定によってヘッダFromをチェックすると書いてあるのですが、よくよく仕様を付き合わせると、標準的なオススメ設定（かんたん設定）で強度を高めに指定するとほとんどのケースでヘッダFromをチェックすることになります
* （これが情報が散っていて非常にわかりづらいのですが・・・）

au
---

* https://www.au.com/mobile/service/attention/spf-record/

> ※お客さまが迷惑メールフィルターの「なりすまし規制 (高)」をご利用になる場合、エンベロープFromに加えてPRAに記述されているドメインを使用したSPFレコードの確認を行い、SPFレコードが無い場合はメールを拒否します。
PRAとして以下の順にヘッダをチェックします。
> Resent-Sender → Resent-From → Sender → From

* このPRAというのが表現は異なりますがヘッダFromのことです
* さらにいうと、auの「オススメ設定」にすると、「なりすまし規制 (高)」が自動的に付いてくるので、多くのauユーザはヘッダFromのSPFチェックが走るわけです

docomo
---

* https://www.nttdocomo.co.jp/service/imode_mail/notice/sender_id/

> したがいまして、お客様が、「全て拒否する」と設定された場合には、DNSサーバに必要な対処を行っていないISP事業者様や企業様などからのメールは認証ができないため受信できません。
> ...
> SPF（TXT）レコードの確認には、メールヘッダのFROMフィールドを使用します。なお、メールヘッダのFROMフィールドが存在しない場合はエンベロープFROMを使用します。

* こちらは直接ヘッダという表現がでてきました
* さらにいうと、docomoについては「かんたん設定（強）」に設定すると自動的に「なりすましメールの拒否設定（パソコンなど） = 全て拒否する」に設定されます
* なので、こちらについても、やはり多くのdocomoユーザはヘッダFromのSPFチェックが走ります

softbank
---

* https://www.softbank.jp/mobile/info/personal/news/service/060328/
* ヘッダFromを見るとは書いていません
* 実際、Softbankのキャリアメールにはほとんどの場合SESから送信しても到着しています

というわけで
===

* 様々な情報を組み合わせると、結論として携帯キャリアメールに到達させるためには、自ドメインのSPFレコードを自ドメインを管理しているRoute53なりから設定してやる必要があります
* ちなみに、上記キャリア公式にも書いてありますが、ほんとのSPFレコードには対応していないので、TEXTレコードで追加する必要がありますので注意

結果
===

* 実際、これを設定する前は、auとdocomoのおよそ60%のメールが到達していなかったようなのですが、設定したところほぼ100%到達するようになったようです

終わりに
===

* キャリアメール爆発しろ！
ASTERIA 2次元配列をどうつくる？？

ASTERIAで2次元配列を作りたいのですが, 
結論からいいますとできませんでした.
2次元配列が作れる方がいらっしゃいましたら,ご教示お願いします.


# もとデータ
データはここね.[夏の甲子園の出場校](https://www.nikkansports.com/baseball/highschool/sensyuken/2018/school/)をCSVとして保存

```dummy.csv
北北海道,旭川大高,９年ぶり８回目
南北海道,北照,５年ぶり４回目
青森,八戸学院光星,２年ぶり９回目
...
```


# なぜ2次元配列を作りたいか
HTMLでTableを作るときやGASでデータを渡すときに
ASTERIAから2次元配列として受取,
2次元配列のままHTMLで加工するのが, 当然ですが一番楽です.

しかも, この作業の頻度が多いです.

# JSONEncodeをそのまま渡す
そのままJSONEncodeコンポーネントに渡すと

![qiita_20180806_1.png](https://qiita-image-store.s3.amazonaws.com/0/180419/7f857271-fb30-88ef-32e2-6e6a3f34c1c6.png)



これだとHTML側のJSで連想配列を2次元配列に直す過程が生まれる.
問題は"地区","代表校","出場歴"の順番はHTML側で受け取るときに
文字コード順になるので, 必ず"地区","代表校","出場歴"にはならない.
よって, JS側で関数を作っても, 順番は毎回毎回指定しなおさないといけない.

```js

function covertFromObjToD2Array(obj){
  var recordArr = obj.record;

  var tagArr = ['地区','代表校','出場歴']; 
  // for(key in obj)だと並び順がずれる可能性があるので
  // tagArrを毎回変更することを求められる
  
  var resultD2Arr = [];
  for(var i = 0; i < recordArr.length; i++){
    var recordObj = recordArr[i];
   
    var resultArr =[];
    for(var j=0; j < tagArr.length; j++){
      resultArr[j] = recordObj[tagArr[j]];
    }
    resultD2Arr.push(resultArr);
  }
  return resultD2Arr;  
}


/* resultD2Arr　そもそもこの形をASTERIAで作りたい
[
[北北海道, 旭川大高, ９年ぶり８回目], 
[南北海道, 北照, ５年ぶり４回目], 
[青森, 八戸学院光星, ２年ぶり９回目],
.......
]
*/

```



# ASTERIAで実現できないのか？
そもそもこのcovertFromObjToD2Array関数自体いらないように,
ASTERIAで実現させたいです.

ParameterListの配列(=String[])を使えば, 1次元配列を作ることはできるのですが
2次元配列になると私の力量ではできませんでした.

このやり方をご存知の方がいらっしゃいましたら, ご教示お願いします.
【自分用メモ】WindowsServer2016で、日本語表示がおかしい時の対応メモ

# 事象
WindowsServer2016の仮想サーバインスタンス(IaaS)を作成したら、初期設定が英語だった

# 対応したこと
以下の設定を行った

1. コントロールパネル(Control Panel)⇒時計、言語、および地域(Clock Language and region)⇒言語の追加(Add a language)にて「日本語」を追加
2. コントロールパネル⇒地域⇒場所タブおよび管理タブにて日本および日本語設定
Azureとは？　〜登録・リソース作成・インスタンス内でpython環境構築〜

#**Microsoft Azureとは**
**Microsoftの提供するクラウドサービスです**

クラウドサービス側がPaaS(Platform as a Service)とIaaS(Infrastructure as a Service)を提供してくれる。これによって自身で環境を構築したり、使うアプリケーションソフトウェアを設定することによって安価にVM環境が作れます。
「クラウド」とは、ネットワーク、サーバ、ストレージ、アプリケーション、など各種サービスの利用をいつでも開始・停止ができ、また利用料に応じて課金される仕組みです。

#**登録〜リソース作成まで**
基本的にはここを参照しました
https://qiita.com/F-ridge/items/018d5a3690b2ba110784
補足程度に進めていきます！

##①https://azure.microsoft.com/ja-jp/ にアクセス→アカウントを作る→右上の「ポータル」をクリックしてログイン

※私はここでログインエラーが出てしまい、「Hmm... なんたらかんたら〜」みたいにでできてtry againを押せと書いてあり、押したのですがログインできませんでした…
　safariではなくgooglechromeからログインしたらいけました！！

##②リソースの作成をクリック→Ubuntu Server 16.04 LTSを選択して「作成」クリック→色々な情報を打ち込む

###※「SSH 公開キー」にしてSSH公開鍵を登録というのがわからなかったのでまとめます
```ssh-keygen -t rsa -b 2048
```と打つと対話形式で公開鍵秘密鍵が作れ、それらのファイルの作成場所（指定しない場合は空白でenter）、パスワードの設定（決めない場合は空白でenter）を入力し作成できます。
```cat '公開鍵のファイル場所'```
で公開鍵の内容を表示しコピーすればオッケーです。その際は、自身のユーザ名は省く必要があります。

###※リソースグループもわからなかったのでまとめます
活動している団体ごとにリソースをグループ化し，ユーザーと関連付けたものだそうです（曖昧…）
自分は既存のものに招待してもらい右上の自分のアカウントをクリックしディレクトリの変更で招待されたものへと切り替えました

###※プロトコル設定みたいなところはsshにはチェックを入れておきましょう
基本的には参考にしたものの通りやっていけばできます

##③リソース作成完了→可用性セット、仮想ネットワーク、ストレージ　アカウントなどのリソースができる

仮想マシンは開始状態で作成されるため切り忘れないようにしましょう！

##④Azureにsshでログインできるようにする
Windowsの場合は参考にしたリンクの通り行ってください。
###・私はmac環境で行ったのでその補足をします。
作成した仮想マシンをクリックし、開始→接続の順でクリックし、一番下のコードをコピーしシェルに打ち込めば接続完了です！！

##⑤python環境作成
ここではpython3をpythonの標準設定にしてjupyternotebookや様々なpytohnのモジュールのインストールまでを行います
###・python3.6.6のインストール
https://qiita.com/YumaInaura/items/00437e6ab14d96adb71f を参考にしました。pyenvのインストールから始めました。homebrewは使わずとも　
`git clone https://github.com/pyenv/pyenv.git ~/.pyenv`
でインストールできました。あとはpythonの最新版を指定してインストールすれば完了。
###・pip install 〜で完了
activeadminのフォームでbaseエラーを表示する

activeadmin便利ですよね。
ただ、ちょっとなにか特別なことをしようとすると困ることが多々あります :sweat_smile: 

今回、モデルに以下のような独自バリデーションを入れたとき、エラー時にフォームでエラー表示がされず困ったのでメモ。

```rb:app/models/article.rb
class Article < ApplicationRecord
  validate :custom_validate

  def custom_validate
    if condition
      errors.add(:base, 'XXXなのでダメです。')
    end
  end
end
```

```rb:app/admin/article.rb
ActiveAdmin.register Article do

  ...

  form do |f|
    f.inputs do
      f.input :title
      f.input :text
    end
    f.actions
  end
  # => このままだと:baseエラーが表示されない...
end
```

結論
---

`semantic_errors`を使えばOK :ok_hand: 

```rb
ActiveAdmin.register Article do

  ...

  form do |f|
    f.semantic_errors
    f.inputs do
      f.input :title
      f.input :text
    end
    f.actions
  end
end
```

以上です。

参考
---
- [Display semantic errors after overriding controller · Issue #4826 · activeadmin/activeadmin](https://github.com/activeadmin/activeadmin/issues/4826)
ipaのインストール方法をまとめました mac/windows

# ipaのインストール方法をまとめました

ipaとは
> IPAは、 iOS上で動作するアプリケーションを含むアーカイブファイルの一種である。IPAファイルはARMアーキテクチャ向けのバイナリを格納しており、iOSデバイスにのみインストールすることが可能となっている。

## 事前準備
- パソコン：mac or windows
- ipa
- iOS Provisioning Profilesに登録済みの端末

## macの場合
1. App StoreからApple Configurator 2をインストールする

- https://itunes.apple.com/us/app/apple-configurator-2/id1037126344?mt=12


2.端末を接続して、Apple Configurator 2を開く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165424/f307c117-3aef-07f3-eca2-2822f4c980fb.png )
3. インストールしたい端末を選択
4. 追加ボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165424/6872dce0-1549-5d9e-4258-618043e39a0a.png)
5. appを選択 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/165424/cda1f71a-f612-73f0-bef1-b20df91b071c.png)
6. 「自分のMACから選択」をクリックして、ダウンロードしたipaを選択すれば、後でipaがよしなにインストールされる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/165424/ba87ed3d-16b1-e07a-b504-1814ad3e5170.png)


## windowsの場合
1. iTunesのバージョンをチェックする12.6以上なら、12.6をインストールする。
 64-bit
https://secure-appldnld.apple.com/itunes12/091-33626-20170922-F51D3530-A003-11E7-8324-03D19A97A551/iTunes64Setup.exe

2. ipaファイルをAppsにドラッグ
3. デバイスをパソコンに接続して、選択する
4. appsの中でapp名を検索してインストールする
5. 完了を押すとipaがインストールされる。

**windowsの画像が提供してくれる人がほしいーーー**
iOSアプリ開発において、効率的に実現したい機能に関する情報を集める方法

#効率的な情報収集法

※自分用のメモです。

###下記の手順で情報を集める

1. 「[Apple Developer](https://developer.apple.com/)」　で検索
2. 「[Apple Developer Forums](https://developer.apple.com/devforums/)」やその他外部サイト、書籍などで調べる
3. APIリファレンスで、より性格で詳細な情報を手に入れる
【TableauServerLinux】Tableauワークブック形式のダウンロードができないときの対応

# 環境
- TableauServerLinux 2018.1.2
- AWS EC2
- OS: RHEL 7.5

# 事象
ビューからの「ダウンロード」で「Tableauワークブック」が選択できるが、リンク切れのエラーになってしまう。

# 原因
TableauServerLinuxでは`/var/opt/tableau`がデフォルトのインストールパスになっている。
インストール時、このディレクトリを「シンボリックリンクで」別ディスクに飛ばしていることが原因だった模様。

```
/var/opt/tableau -> /my/another/dir
```
ファイルシステム上はリンクされても、各ミドルウェアがそれを追ってくれるかは別問題であり、安易にシンボリックリンクで張るのは確かに迂闊だった。

# 対応
- このインストール領域はTableauデータ領域にもなるため、root領域とは切り離しておきたい。
- すでに多数のワークブックをアップロードしてある状態のため、再作成は避けたい。（インストールパスを変えたくない）
- バックアップ＆リストアも手順はあるが、かなり容量が大きく時間が読めない。

という状況のため、以下の手順で対応を試みる。

```bash:設定手順
### TableauServer停止
$ tsm stop
### シンボリックリンクを削除
$ sudo rm /var/opt/tableau
### インストールパスの実ディレクトリを作成
$ sudo mkdir -p /var/opt/tableau
### --bindオプション付きmountで、ディレクトリtoディレクトリでマウントする
sudo mount --bind /my/another/dir /var/opt/tableau
### TableauServer起動
$ tsm start
```

シンボリックリンクとは異なり、あくまでmountなので再起動でフラッシュされる。/etc/fstabにも設定が必要

```bash:/etc/fstab
##### for tableauServer
/my/another/dir /var/opt/tableau none bind 0 0
```

また、そのmount後にTableauServerが起動するよう、systemd設定を変えておくのがよさそう（未検証！！！）

```bash:/etc/systemd/system/user@XXX.service
[Unit]
RequiresMountsFor=/var/opt/tableau
```

# 結果
ダウンロードできた！
xcode9で多言語対応（Localization）した後、単語を追加した時の話

# え、未だに多言語対応xcode側で面倒見てくれないの？(´・ω・｀)
baseを英語で作成→あとで日本語対応すりゃいいね(´・ω・｀)b
こんな感じで作成していたが、日本語化対応後baseに追加した奴は日本語化用のファイルに勝手に同期してくれるなんてことはなかった。

# で、どうしたか
https://itunes.apple.com/lv/app/xlifftool/id1074282695?mt=12
こいつを使いました。

# 手順
1. プロジェクトをxcodeで開きます
2. EditorからExport For Localization...を開き、どこかにファイルを保存します
3. xlifftoolでExportしたファイルを開く
4. 翻訳対応できていない差分が表示されるので、翻訳する
5. EditorからImport Localizations...を開き、翻訳したファイルをぶちこみます

割と使いやすいツールでした。
スクリプト入れて云々ってのもぐぐったら出てきたけど、あんま余計なの入れたくないなーって思って今回はこれにしました。

しかし、未だにこの辺やってくれないのか・・・

2018/09/18追記
プロジェクト自体を開いている状態じゃ無いとExport For...が出てこないので注意
10分ぐらい探してしまった・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/38677/f128ca69-d3b0-97dd-7d6b-40cd61aae193.png)
↑の画面

2019/01/16追記
結局R.Swiftに移行しました　〜fin〜
VSCodeのターミナルでAnacondaの仮想環境が利用できないとき(Windows10)

#問題
Anaconda NavigaterからVSCodeを起動した場合、ターミナルを自動で仮想環境を有効にした状態にしてくれるのですが、ターミナルが**PowerShell**だと上手く動かないことがあるようです。
##解決策
PowerShellの代わりに**コマンドプロンプト**を使用する。

VSCodeでsettings.json(ウィンドウ上部にあるメニューのファイル→基本設定→設定から開けます)を開き、
`"terminal.integrated.shell.windows": "コマンドプロンプトの実行ファイルのパス",`
を追加する。

##例
```json:settings.json
{
    "terminal.integrated.shell.windows": "コマンドプロンプトの実行ファイルのパス",
}
```
Android8.0でもAdaptive Iconのアニメーションが反映されない

こんにちは。私です。

本日はAndroid8.0から搭載されたAdaptive Icon(アダプティブアイコン)についてです。

##Adaptive Iconについて
こちら調べたら私より詳しい方がまとめてらっしゃいます。
[3分で分かる？Android OのAdaptive Iconに対応しよう](https://qiita.com/takahirom/items/696fb5ecaa230fa8f755)

調べたらAdaptive Iconでアイコンのデザイン(形)が変更できたり
アニメーションがついてるよって説明が多く見受けられますね。

##設定通り作ったけど端末でアニメーションが動かないよ！
私がまんまとハマったところです。

```xml:anydpi-v26/ic_lancher.xml
<application
    android:icon="@mipmap/ic_launcher"
    android:roundIcon=“@mipmap/ic_launcher_round”
```
って書いたのに実機で確認しても、大きさ、形は統一されてるがアニメーションが動かない…
**なんで！**

##まずはMinSDKを確認してみよう！
[Adaptive Iconにとりあえず対応する方法](https://backport.net/blog/2018/02/17/adaptive_icon/)
こちらの記事で紹介されている通り、API levelが26以上の場合はAdaptive iconに対応していると見なされるようなので、API levelが26以上になるよう設定を変更しましょう。

API levelの変更の仕方はこちらを参考にさせていただきました。
[Android StudioでAPIレベルを変更する](https://hkitago.com/2016/02/android-studio%E3%81%A7api%E3%83%AC%E3%83%99%E3%83%AB%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B/)

##それでもできないよ！
MinSDKを修正してもアニメーションは動かない…。
さらに調べたところ、
　[【まとめ】Android 8.0 Oreoの新機能、特徴、レビュー、変更点、不具合](https://wakajps.com/blog/matome-android-8-0-oreo/)
こちらで「**この機能はPixelシリーズのみ対応。**」との記載が！！
ここでは「デザインの統一( 円、四角、小円、フリーフォームのアイコン)を選択することができる」と書かれてました…。

##ではアニメーションはなぜできないの？
アニメーションもPixelシリーズだけなの？と思いましたが明確な記載がない…
なぜ…なぜアニメーションも動かないのだ…


…調べてくれてる方いらっしゃった。
[Oreoの新機能について ユーザー エクスペリエンス編](https://qiita.com/yst_i/items/a9b291ddb35a5bd01aed)
こちらの記事によると、
>アニメーションを試しましたが、Homeアプリ (サンプル)に依存するようで、Xperia X Compatの「Xperia Home」、Nexus 5Xの「Google Nowランチャー」（どちらもOreoインストール済み）では動きませんでした。Nova Launcherでは動きました。思っていたよりも対応機種が少ない気がします。

とのこと。

##結論：アニメーションは確認できないのか
　Q:どうして実機でアイコンのアニメーションが確認できないの？
　A:Homeアプリが対応してないから。
が結論となりました。
現状(2018/08)ではGoogle標準のランチャーは非対応になっているそうです。
Pixelランチャーは対応しているらしいです…(Pixelシリーズは日本では販売してない？)
確認する手段として、**Nova Launcher**を使うとアニメーションが機能してるか確認できます！

##おしまい
Google標準のランチャーではAdaptive Iconのアニメーションが対応してないので動かない。
確認したい場合はNova Lancherを使うと確認できる！
とのことでした。

いろんなページを彷徨うと答えにたどり着いたのですが、まとめられていないので
勝手にまとめさせてもらいました…。どなたかの役に立ちますよう…。。

それではみなさま、良いAndroid8.0ライフを！
エックスサーバー OpenCVのインストール絡みの雑なメモ

#個人用メモ & エックスサーバーにOpenCVインストールする勇者様用の町人情報
素人が叩いたコマンドを羅列してますので、勇者様まとめてください。

pipからはインストールはできない(共有サーバー故権限がなさげ)
AnacondaからはopenCVのインストールは可能だが、標準のpythonのライブラリとしては読ませられない（パスが通っていない？謎）
Anacondaに仮想環境を作り、pythonをインストールし、そこにOpenCVを入れると動くが、この環境をsource Activate を維持し続け方がわからない。またこの仮想環境で構築したものをサーバー


```shell

ssh

#pyenvのインストール
git clone git://github.com/yyuu/pyenv.git ~/.pyenv

vi .zshrc
#----- pyenv
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
   export PATH=${PYENV_ROOT}/bin:$PATH
   eval "$(pyenv init -)"
fi
```


```shell

#Anacondaのインストール
pyenv install anaconda3-5.1.0
vi ~/.bashrc
で下記2行を追加し、パスを通す。
#anaconda
export PATH=$PATH:$HOME/.pyenv/versions/anaconda3-5.1.0/bin
export PATH=$HOME/bin:$PATH

pyenv local anaconda3-5.1.0 #なんだっけ？
```


```shell

#anacondaによるOpenCVのインストール
anaconda search opencv
conda install -c https://conda.binstar.org/menpo opencv3 #大事かも

conda info -e
# conda environments:
#
base                  *  /home/account_name/.pyenv/versions/anaconda3-5.1.0

source $PYENV_ROOT/versions/anaconda3-5.1.0/bin/activate base


##仮想環境切替？ 不要
#activate競合問題 PYENVとAnacondaがぶつかるらしいのでフルパスで環境を切り替える
#conda create -n py27 python=2.7 anaconda
#source $PYENV_ROOT/versions/anaconda3-5.1.0/bin/activate py27
#conda install -c conda-forge opencv
#conda install -c conda-forge opencv3

python
>>>
import sys
sys.path
#標準
['', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages']

#Anaconda標準(OpenCVがインストールされている)
['', '/home/account_name/.pyenv/versions/anaconda3-5.1.0/lib/python36.zip', '/home/account_name/.pyenv/versions/anaconda3-5.1.0/lib/python3.6', '/home/account_name/.pyenv/versions/anaconda3-5.1.0/lib/python3.6/lib-dynload', '/home/account_name/.pyenv/versions/anaconda3-5.1.0/lib/python3.6/site-packages']

#Anaconda仮想 python2.7インストールベース
#['', '/home/account_name/.pyenv/versions/anaconda3-5.1.0/envs/py27/lib/python27.zip', '/home/account_name/.pyenv/versions/anaconda3-5.1.0/envs/py27/lib/python2.7', '/home/account_name/.pyenv/versions/anaconda3-5.1.0/envs/py27/lib/python2.7/plat-linux2', '/home/account_name/.pyenv/versions/anaconda3-5.1.0/envs/py27/lib/python2.7/lib-tk', '/home/account_name/.pyenv/versions/anaconda3-5.1.0/envs/py27/lib/python2.7/lib-old', '/home/account_name/.pyenv/versions/anaconda3-5.1.0/envs/py27/lib/python2.7/lib-dynload', '/home/account_name/.pyenv/versions/anaconda3-5.1.0/envs/py27/lib/python2.7/site-packages']

```

`/home/account_name/.pyenv/versions/anaconda3-5.1.0/envs/py27/lib/python2.7/site-packages`
これがAnacondaにインストールした際のパッケージのパス

後は、プログラムに

```python
# anaconda経由ライブラリ
sys.path.append('/home/account_name/.pyenv/versions/anaconda3-5.1.0/envs/py27/lib/python2.7/site-packages')
import cv2
```

で、エックスサーバーでとりあえず、OpenCV動いた！

ちなみに、私は素人でインフラとかpythonとかさっぱりわからないので、アドバイスは大歓迎ですが難しいこと簡単なこと、みんなわかりません。
Galaxy Training "Introduction to Genomics and Galaxy" を補足してみる

「Galaxy」のチュートリアル「Introduction to Genomics and Galaxy」の[日本語版](https://github.com/A-Asai/training-material/blob/master/topics/introduction/tutorials/galaxy-intro-strands/tutorial_ja_notag.md)を作成したときに、

「分かりにくいなあ」
「チュートリアル通りにならないよ！」

となる気がしたので、追加で説明します。
#**チュートリアル中の定義について**
チュートリアルにある用語の定義をまとめておきます。

> * **ゲノム**：生物に固有なすべてのDNAのまとまり。<br><br>
* **染色体**：生物におけるDNAの最大単位。ヒトは23本の染色体を2対持っています。<br><br>
* **ストランド**：染色体は二本鎖であり、この「鎖」のことを指します。1本はファワード鎖で、もう1本はリバース鎖です。<br><br>
* **遺伝子**：このチュートリアルでは、染色体上にある、生物が使用する分子を作るDNAの部分のことを指します。<br><br>
* **リファレンスゲノム**：徹底的に研究して調べ上げた単一個体のゲノムで、DNAの大部分が正確に解明されているゲノムを指します。参照となるゲノムです。リファレンスゲノムはその生物を研究している研究者によってゲノムマップという形で共有されています。リファレンスゲノムは定期的に更新されます。<br><br>
* **シークエンス（配列）**：A C T G（単一ヌクレオチド）のレベルまでそれぞれの存在する正確な位置を含むゲノム中のDNAを指します。<br><br>
* **ゲノム/遺伝子 アノテーション**：シークエンス（配列）ではどのようなDNAがどこにあるかが分かりますが、それらのDNAの機能については分かりません。アノテーションは遺伝子やプロモーター、セントロメアといった特定のゲノム領域がどこであるかを示す追加の情報を持っています。<br><br>
* **ゲノム範囲（genomic interval）**：このチュートリアルではゲノム範囲は染色体の一部にまたがるものを指します。例えば遺伝子や染色体もゲノム範囲になります。<br><br>
* **エキソン**：分子を作ることができるDNAの部分を指します。

#**このチュートリアルは何をやっているのか**
まずは染色体二本鎖上に存在する遺伝子の何%が二本鎖で重なっているのかを調べ、その後にエキソン部分のみのデータでエキソンの何%が二本鎖で重なっているのかを解析で導いています。<br>
<img width="899" alt="EE1DDB1A-E111-44E5-9B2D-03BD68BCB7D8.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/222524/e69d0863-500e-a8c5-0353-d517bf829923.jpeg"> <br>
上図にある、赤色の斜線領域のように重なっているエキソンが、どのくらいの割合で存在しているのかを最終的に調べています。

本チュートリアルの大まかな流れとしては、

**データのインポート**（UCMC Main ツールを使用）
↓
インポートしたデータを**フォワード鎖とリバース鎖のデータセットに分割する**（Filter ツールを2回使用）
↓
染色体二本鎖間での**遺伝子の重なりをチェックする**（Intersect ツールを2回使用）
↓
フォワード鎖とリバース鎖の重なっていた遺伝子の**データセットを1つにまとめる**（Concatenate datasets ツールを使用）
↓
ゲノムブラウザーで**データを表示する**
↓
**ワークフローを作成する**
↓
新しいヒストリーを作成して**データを現在のヒストリーから移動する**
↓
**エキソンのデータを取得する**
↓
作成した**ワークフローを実行**

という風になっています。

最終的に下図のような28のエキソンのデータが表示されたらチュートリアル完了です。

![strandsfinal.png](https://qiita-image-store.s3.amazonaws.com/0/222524/c1e2b7b8-cb05-edd3-3652-60d9fde31dd2.png)

#**Intersect ツールをなぜ2回実行するのか**
重複部分をチェックする際に Intersect ツールを2回使うのは、重複した部分が下図のように結果として出てきます。（Galaxy のツールをクリックしても似たような図が出てきます）

<img width="905" alt="B7F3A0F8-AF87-4119-815F-2E33C9EA6978.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/222524/01a823c8-49e2-5653-e28a-970887644f9c.jpeg">

上図のように、このツールの今回の設定では、2つ目のデータセットに重複している**1つ目のデータセットを抽出しています**。

なので、1回目の Intersect ツールでは**リバース鎖の遺伝子と重なっているフォワード鎖の遺伝子を抽出し**、2回目の Intersect ツールでは**フォワード鎖の遺伝子と重なっているリバース鎖の遺伝子を抽出しています**。

*****
以上で Introduction to Genomics and Galaxy の補足説明を終わりにします。
ほかに分からないことがあればコメントか、[Galaxy のセミナー](https://pitagora.connpass.com/)に参加して私にお尋ねください。

### リンクなど
* Introduction to Genomics and Galaxy の原文<br>（http://galaxyproject.github.io/training-material/topics/introduction/tutorials/galaxy-intro-strands/tutorial.html ）
* Introduction to Genomics and Galaxy 日本語版<br>（https://github.com/A-Asai/training-material/blob/master/topics/introduction/tutorials/galaxy-intro-strands/tutorial_ja_notag.md ）
* Galaxy<br>（https://usegalaxy.org/ ）
* Galaxy Seminar<br>（https://pitagora.connpass.com/ ）