OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】リストのコピー

# リストのコピー
```Python:
>>> x = [1, 2, 3]
>>> y = x.copy() # リストのコピー
>>> y
[1, 2, 3]
>>> y[0] = 4
>>> y
[4, 2, 3]
>>> x
[1, 2, 3]

""" 注意 """
>>> x = [1, 2, 3]
>>> y = x # これじゃ駄目
>>> y
[1, 2, 3]
>>> y[0] = 4
>>> y
[4, 2, 3]
>>> x
[4, 2, 3]
```
※Python 3.7.1 で確認
正規表現  ～入門編～

正規表現は*Regex(regular expression)*とも言われる、さまざまな文字列を1つの形式で表現する表記法です。
コードなどから情報を抜き出すのにとても役に立ちます。
私は正規表現の基本を*Regex One*で学びました。
ここでは、その学んだことをもとに基本の正規表現を解説します。
<br>
例えば、次の文字列を考えます。
*ban, can, fan, man, pan,ran*
このうち、
*fan, man, ran*
だけを取り出したいとします。この時は、

```
[cmf]an
```
または、

```
[^drp]an
```
とします。
[]は指定した文字のどれかを含む、という意味です。
逆に、[^]は指定した文字をいずれも含まない、という意味です。

<br>
次の文字列はこちらです。
*haa,haaaaaa,haaaaaaaaa*
連続文字の指定方法ですね。
aが5個以上続いている文字列を指定したい時は、

```
a{5}
```
とします。
{}の中には文字の連続回数を入れます。

<br>
次に、この正規表現は何を指定しているか分かりますか？

```
\d\.\s+abc
```

これは、
*(数字).(1個以上の空白)abc*
を引っ張ってきます。
例えば、
*243.   vghr39
1948. fhraeui*
などです。

*\d*は数字
*\s*は空白
*+*は1個以上
を表します。

ちなみに、
*\w*は英数字
*\n*は改行
を表します。

ここで紹介したのは基本中の基本なので、もっともっと勉強しましょう！
Galaxyと外部Viewer連携でのデータの表示


# Galaxyに登録したファイルはGalaxyの外部のViewerを利用して表示できる
##外部Viewerでのデータの表示
ヒストリーペインに登録したデータファイルに適切なDatabase(データベース)を設定しておく事で外部のViewerを利用してデータを表示する事ができる
表示可能なファイルフォマットとしては、bam, bed, fasta, off, gtf, interval, vcf等

#display機能の利用
ヒストリーペイン上で各データファイルのファイル名をクリックして、データの詳細を表示

下記のそれぞれのリンクをクリックする事で、各種のビューワー上でデータを確認できる大変便利な機能
ファイルのフォーマットによって利用できるViewerは異なるがヒトゲノムにマップしたBamファイルの場合は下記の4種類のViewerが利用可能
**ここではhg38にマップしたbamのデータファイルを公共のGalaxyサーバー上に登録して利用している**
![Screen Shot 2019-01-07 at 16.52.49.png](https://qiita-image-store.s3.amazonaws.com/0/213053/9412471a-30e1-353c-e148-1130f1a9a369.png)

- "display at UCSC": UCSC Genome Browser<img width="1414" alt="Screen Shot 2019-01-07 at 17.01.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/213053/532fa14e-985b-8549-d013-2f2876d9a3b7.png">
- "display with IGV": IGV (手元のコンピューターにIGVをインストールして事前に起動しておく)<img width="1078" alt="Screen Shot 2019-01-07 at 16.59.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/213053/e2bcd0de-8b0d-b171-db53-f6884bffad53.png">
- "display in IGB": (手元のコンピューターにIGBをインストールして事前に起動しておく)<img width="1277" alt="Screen Shot 2019-01-07 at 16.58.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/213053/b57cf5ec-5302-6c80-d064-0b1e3036d4cc.png">
- "display at bam.iobio": bam.iobio.io<img width="1216" alt="Screen Shot 2019-01-07 at 16.57.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/213053/ef36ce66-a462-d8d9-2323-5f6acecf5821.png">

しかし、この機能は残念ながら手元のコンピューターのDocker上で起動したGalaxyではIGVを除いて利用できない
たとえば　UCSC Genome Browserでは下記のようなエラーが発生する
<img width="1390" alt="Screen Shot 2019-01-07 at 17.17.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/213053/ad0c9f10-771e-1c81-d094-264e703bc8a0.png">

外部Viewerとの連携時には、利用しているGalaxyのサーバーに外部から直接アクセスできる必要がある
Dockerを利用して起動したGalaxyサーバーに外部から直接アクセスはできないので、この機能はIGVを除いて利用できない事に留意が必要

今回はここまで:smile:
【機械学習】マシンラーニングの転移学習

##はじめに
皆さん、新年あけましておめでとうございます。2019年もよろしくお願いします。さて2019年の初投稿として何がいいのかと思ったところ今回は転移学習について紹介させて頂きたいと思います。

##転移学習とは
転移学習について説明する前にこれから出て来る用語やそもそもAIの分野に知識なない方もいらっしゃると思いますのでこちらを参考にして下さい。
[【AI】AIと機械学習そして深層学習(ディープラーニング)](https://qiita.com/wb_seo/items/5921f669e4e10fb9997a)

以下はウィキペディアからの定義です。
>Transfer learning is a research problem in machine learning that focuses on storing knowledge gained while solving one problem and applying it to a different but related problem.[1] For example, knowledge gained while learning to recognize cars could apply when trying to recognize trucks. This area of research bears some relation to the long history of psychological literature on transfer of learning, although formal ties between the two fields are limited.

簡単に言うとある領域のデータで学習したモデルを似ている別の領域の対象にも適用ができるっていうことです。一つ例を作って見てみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/309361/dc41d710-0ebf-3e83-3361-b6e982f1d788.png)
転移学習をしない場合はそれぞれのデータに対する前処理と学習を行う必要があります。完全に別の領域のデータであれば左の図のパターンが正しいですが例のように車とトラックは似ているのでわざわざ2回の学習を行う必要はありません。ここで転移学習を行い最初車を学習させたモデルでトラックの識別も可能になります。

##転移学習のドメイン
転移学習をする際にはある領域のデータで学習を行います。それのためまずドメインを定義する必要があります。<b>ドメイン＝学習させるある領域</b>で分かれば大丈夫です。上記の例の場合だと<b>車</b>というのが<b>ドメイン</b>になりますね

##転移学習のメリット
分かった通りに転移学習は一度学習させたモデルで別の領域への適用もできますので<b>少ない量で高い精度を得られる</b>のができます。全体的に考えるとデータの量が少ないですが、<b>実際学習する際には多くのデータの量が必要になり</b>ますのでそれに注意する必要があります。

##まとめに
ここでは転移学習の本当基礎的な部分しか載せてないです。皆さんに情報共有が目的でありますけれどもブログを専門にする者ではないのでメモレベルになります。本当申し訳ございません。でも個人的にお願いしているのはまずここで簡単に分かった上で皆さん自分からもっと深く勉強できたらいいなっていう風に思っております。もし情報が足りないですとか情報が間違えましたとかコメント残して下さればすぐ編集するのでよろしくお願いします
ECSでバイナリを実行する方法

# 概要

ECSのtask-definitionで直接コマンドを実行する際、バイナリが実行できなくて困ったので調べた
厳密にはpipeしてほかのコマンドを実行したかった

# 公式情報

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html

commandは

```
"command": ["string", ...]
```

と文字列の配列で渡すことを求められる。

中身は

https://docs.docker.com/engine/reference/builder/#cmd

を見ろとのこと。

```
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
```

の指定ができるらしい。

# 試したことと結果

```
["sh", "/hoge/hoge.sh && echo 'success'"]
```

あたりをしたかった。

しかし、

```
/bin/sh: /bin/sh: cannot execute binary file
```

といわれてだめ

# 原因

色々調べると、ENTRYPOINTに/bin/bashが指定されているらしい。（一応ECSのコンパネでみると指定されていないけど、うちの環境原因だったらごめんなさい）

# 対策

```
["-c", "sh '/hoge/hoge.sh && echo 'success'"]
```

これで通った。

パラメータを分割しない方法の功罪はあると思いますが取り急ぎ。
【学習記録④】PHPの説明 -チームラボオンラインスキルアップ課題

# やること
[PHPの説明 -チームラボオンラインスキルアップ課題](https://team-lab.github.io/skillup/step1/05-php.html)

# まとめ
## PHPの特徴
* 静的(HTML/CSS) ⇔ 動的(PHP/Ruby/Python/Java)
* HTMLの中に組み込んで書く
* <?php～?>までがPHPのプログラム本体
* 変数は先頭に$をつける決まり
* PHPの関数の例
    * date…日付を文字列で返す
    * print…内容を表示する
    * print-r…変数の構造と内容を全て書き出す
	
## 基本構文
* 制御構造
    * if文
    * for文
* 関数
    * 関数の定義<br>
	`function [関数名] (引数){ 処理スクリプト }`

    * 配列
		* 配列<br>
             `$date = array(引数1,引数2,引数3)`
		* 連想配列<br>
	       `$date = array("添え字1" => "文字列1","添え字2" => "添え字2", "ｷｰ3" =>"文字列3")`
	* 正規表現
	
# よくあるエラー・バグと対処法
* プログラムがそのまま表示される<br>
	`<?php～?>で囲んだ範囲のみがPHPのプログラムとして認識される`
<br>
* Parse error<br>
	`構文エラー、セミコロンの忘れや、変数名に$を付け忘れている場合など`<br>
* 文字列の結合結果がおかしい<br>
	`文字列の結合は.(ドット)演算子で行う`<br>
* その他何かがおかしい<br>
	`デバッグ…var_dump関数で変数の情報を表示する`<br>

# 参照
[PHP マニュアル](http://php.net/manual/ja/index.php)

[第2版 PHP逆引きレシピ](https://www.amazon.co.jp/PHP%E9%80%86%E5%BC%95%E3%81%8D%E3%83%AC%E3%82%B7%E3%83%94-%E7%AC%AC2%E7%89%88-PROGRAMMER%E2%80%99S-RECiPE-%E9%88%B4%E6%9C%A8/dp/4798119873)
※理解の補足に使用

# 次回やること

[STEP1-6.PHPでGET,POSTを受け取る]
(https://team-lab.github.io/skillup/step1/06-get-post.html)
分散型取引所作成プロトコルである0x上に創る分散型取引所の戦略

#TL;DR
分散型取引所を構築するためのプロトコルである0x Protocolを用いて分散型取引所を創ることができます。その分散型取引所の戦略は大きく分けて、**Matching**, **Open Orderbook**, **Quote Provider**, **Reserve Manager** の4つがあります。実際に分散化取引所を創る際には、製作者がどの戦略を取るべきかを検討しなければなりません。本稿ではそれらのメリット、デメリットを解説します。ちなみに僕自身が作っている分散型取引所では**Open Orderbookを採用しています。** ご意見、改善点などあれば[Twitter](https://twitter.com/WatanabeSota)でご連絡ください。

## Matching
[前項](https://qiita.com/SotaWatanabe/items/b0749acffdee0707a950)でも書きましたが、オーダーを出す人（Maker）はオーダーのフォーマット内のパラメーターである`Taker`を指定することにより、特定の人（Taker）しか受け取れないようにすることが可能です。Matching戦略では、Makerがリレイヤーのアドレスを`Taker`パラメーター内に指定をすることによってリレイヤーしか受け取れないようにします。

※ リレイヤーに関してはindivさんの[こちら](https://individua1.net/0x-protocol-what-is-relayer/)の記事を参考にしてください。

複数のオーダーをうけとったリレイヤーが需要と供給のマッチするオーダーを見つけ`batchFillOrders`もしくは `batchFillOrKillOrders`コマンドを実行することによって両者のトークンが交換されます。

###例
1. Aliceが「1WETH 売って、1000ZRXほしい」というorderAをリレーヤーCharlieに送る。
2. Bobは「1000ZRX 売って、1WETHほしい」とリレーヤーCharlieに送る。
3. Charlieは `batchFillOrKillOrders(orderA, 1000, orderB, 1)`をcallし、Aliceの1WETHとBobの1000ZRXが交換される。

###メリット
* リレイヤーのみが交換のコマンドを実行できるので、複数のTakerが同時に同じオーダーを署名するコンフリクトが起こることがない。
* リレイヤーはいつオーダーが実行されるかをしることができるので、オーダーブックのアップデートがより早くでき、リアルタイムトレードがよりスムーズに可能になる。
* gasコストをリレイヤーが持つことになるので、トレーダー視点ではよいUXとなる。

###デメリット
* 多少の集権性が残る。リレイヤーはオーダーをマッチングすることを強制されていないので、手数料によってのみインセンティブ付されている。
* 成り行きの注文をすることがむずかしい。
* オーダーがスマートコントラクトによって生成されていないので、0x上のDAppsや他のリレイヤーと流動性が共有できない。

## Open Orderbook
リレイヤーは`Taker`のパラメーターが`0x0000000000000000000000000000000000000000`となっているオーダーを受けつけブロードキャストします。トレーダーはローカルの環境でそのオーダーに署名をしてEthereum Nodeに送ります。

###例
1. Aliceが「1WETH 売って、1000ZRXほしい」というorderAをリレーヤーCharlieに送る。
2. Bobがそのオーダーを、Charlieのオーダーブックの中から見つけて、Bobが「fillOrder(orderA, 1000)」をコールする。Bobの1000ZRXは1WETHと交換。

###メリット
* 安いかつ、最もトラストレスな取引。3rdパーティーがオーダーブックにアクセスしやすい。
    * オーダーが他のリレイヤーをシェアできる。
    * 外部のdAppsがオーダーの流動性を使える。
    * 外部のおスマートコントラクトと連携できる。
* リレイヤーにとってはgasがユーザー持ちなので負担にならない。

###デメリット
* トレーディングの量が多くなると、同じオーダーをfillしたり衝突が多くなる。衝突を狙った攻撃が多くなる。

##Quote provider
リレイヤーが流動性を提供するパターンです。トレーダーが署名をしたオーダーをリレイヤーに送ることでリレイヤーが自身で確保しているトークンもしくは外部の流動性を用いてfillをします。

###例
1. リレーヤーCharlieは 1000ZRX / 1WETHのレートで買いたいと表明する。
2. Aliceが 10000ZRX売って、10WETHを買うオーダーAをリレーヤーCharlieに送る。
3. CharlieはfillOrder(orderA, 10000)をコールし、10WETHとAliceの10000ZRXが交換される。

###メリット
* トレーダーとレート交渉を署名前にオフチェーンで行うことができる。
* オーダーが署名された後にリレイヤーは外部の流動性を使うオプションがある。

###デメリット
* トレーダーの署名後、リレイヤーのfillが義務ではない。（これはMatchingの時と一緒。）
* [アトミックマッチング機能](https://github.com/0xProject/ZEIPs/issues/2)が追加されるまではリレイヤーはトークンのリザーブが必要であったが、この機能は実装済み。

##Reserve manager
リレイヤーが独自で流動性を確保する方法です。`taker`のパラメーターを`0x0000000000000000000000000000000000000000`に設定したオーダーの有効期限を短くして頻繁にブロードキャストする方法です。これはOpen Orderboookと併用して使うことができ、自分のプロダクトでも採用を検討しています。

###例
1. リレーヤーのAliceが「100WETH売りたい、100000ZRXほしい」というorderAを45秒の有効期限でブロードキャストする。
2. BobがfillOrder(orderA, 1000)をコール
3. Bobの1000ZRXとリレーヤーAliceの1 WETHを交換する。
4. 別件で、CharlieはfillOrder(orderA, 2000)をコール
5. Charlieの2000ZRXと、2WETHを交換する。

###メリット
* トレーダーへオーダーの流動性を確保するために有効な手段。
* ブロードキャストはoff-cahinでできるので負担は大きくない。

###デメリット
* Open Order Bookと同様の課題が有る。
* リザーブ用に大量のトークンを保有しておく必要がある。

##ネクストステップ
それぞれの戦略における法的見解（持論）を書きたいと思っています。専門家の方ともぜひ議論させていただきたいです。

##参考
* [0x doc](https://0x.org/wiki#Quote-Provider)
バーチャルキャストの config.json にメモを書きたい

# 概要
というタイトルの要望をもらったので、なにかできないか考えてみることにしました。
まず json というフォーマットはコメントを書くことができません。
調べてみると、既に作成ツールなど [^1] がいくつかあるのですが、今回はちょっとメモしたいだけなので
[Hjson](https://hjson.org/) というものを利用して、自分で環境を作ってみることにします。
Hjson は json にコメントが書けるフォーマットです。

# 環境構築
色々とインストールしますが初回だけなので。

1. [Node.js](https://nodejs.org/ja/) をインストールします
    - ここではリンク先の推奨版をインストールしました
2. コマンドプロンプトを開きます
    - Windows キー + R で「ファイル名を指定して実行」が出るので、そこに「cmd」と入れるのが楽です
3. [hjson-js](https://www.npmjs.com/package/hjson) を npm 経由でインストールします
    - コマンドプロンプトに `npm i -g hjson` と入力し実行します

ちゃんとインストールされたかは以下のコマンドで確認できます。

```dos
> node --version
v10.15.0
> npm --version
6.4.1
> hjson --version
Hjson.js 3.1.2
```

さらに「VirtualCast.exe」があるフォルダに「config.hjson」（※拡張子は **hjson** ）を作成します。
内容は「config.json」そのままで大丈夫です。パラメータはこのあたり [^2] [^3] を参考に。

最後に「VirtualCastRun.bat」を用意します。これは以下の内容をコピーしてファイルを作成してください。
ファイルの場所は「config.hjson」と同じ場所です。

```dos:VirtualCastRun.bat
@echo off

rem hjson から json に変換後 VirtualCast を起動する
hjson -j ./config.hjson > ./config.json && call VirtualCast.exe
```

# 使い方
おおまかな使い方は以下のとおりです。

1. 「config.hjson」を編集して保存します
2. 「VirtualCastRun.bat」を実行します

以上。

これで元々「config.json」を編集してた時と同じ感じで利用できます。やったー！
…だけだと説明不足ですね。
「VirtualCastRun.bat」で何をしているのかといいますと hjson から json への変換をしてます。

```json:config.hjson
{
  "niconico": {
    "character_models": [
      // デフォルト
      32797, // ニコニ立体ちゃん, https://3d.nicovideo.jp/works/td32797
      // 追加したもの
      34492, // ピコラボ, https://3d.nicovideo.jp/works/td34492
    ],
    "background_models": [
      //43907, // 【サンプル】オータムガーデン, https://3d.nicovideo.jp/works/td43907
      43367, // 【サンプル】あいえるらいぶ　スタジオ, https://3d.nicovideo.jp/works/td43367
    ],
  },
}
```

↓↓↓　変換　↓↓↓

```json:config.json
{
  "niconico": {
    "character_models": [
      32797,
      34492
    ],
    "background_models": [
      43367
    ],
  },
}
```

という具合に、赤線が引かれてエラーになっているコメント部分がすべて除去されています。
また、コンマ（,）なども適切に取り除いてくれています。便利。

# まとめ
Hjson も基本的にコメントを書ける json なので、今後バーチャルキャスト側で
パラメータが増えたりしても、そのまま追記すれば普通に使えます。
モデルを色々試したいけど、どれがどれか分からない…やいっぱい追加して初回起動に時間がかかる…
などのお悩みがあれば、コメントアウトを付けると少しだけ幸せになります。

[hjson-cs](https://github.com/hjson/hjson-cs) もあるのでバーチャルキャスト側で対応されるととても素敵。

# 参考
* https://co.bsnws.net/article/131

[^1]: https://virtualcast.jp/link/ 「config.jsonを作るのに便利」
[^2]: https://qiita.com/miyumiyu/items/d029e3cdd498aa263cfe
[^3]: https://www.infiniteloop.co.jp/blog/2018/11/virtualcast-142c-release/
Cloud Security Command Center（Cloud SCC）を有効にする

30分ほどで検出まで試したかったけど、すぐには検出されなかったので、まずは有効にするまで。
追記：検出された例を追加。

公式ドキュメント
https://cloud.google.com/security-command-center/docs/

コンソール（Marketplace）
https://console.cloud.google.com/marketplace/details/google-cloud-platform/cloud-security-command-center

※注意：操作するユーザに、組織管理者とセキュリティセンター管理者の両方のIAMの役割が必要

セキュリティコマンドセンターに移動。
<img width="1220" alt="スクリーンショット 2019-01-07 16.12.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/175280/3e08c4e0-da23-904b-7b0c-fc5e80c1817c.png">

組織に移動。
<img width="1150" alt="スクリーンショット 2019-01-07 16.12.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/175280/f8a986bb-266d-5243-0044-2670eca3e24b.png">

次へ。
<img width="851" alt="スクリーンショット 2019-01-07 16.12.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/175280/83a22b61-2fb6-0ea5-8d50-7cdcefa1f713.png">
もしIAMで組織管理者とセキュリティ センター管理者の役割が付いていないと、「エラーが発生しました。」と表示されて進めなくなるので注意。

有効にするとTOPページが出る。
<img width="1154" alt="スクリーンショット 2019-01-07 16.45.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/175280/b5d79cb5-4ff7-58e6-6a37-35087b89dd10.png">

セキュリティソースをそれぞれ有効にしてみる。
<img width="990" alt="スクリーンショット 2019-01-07 16.45.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/175280/e7ee46a8-43fa-f8fe-7b3a-42286e32b7ed.png">

有効にした結果。
<img width="1429" alt="スクリーンショット 2019-01-07 16.56.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/175280/6f3e6570-8e17-370e-60a8-bca6a3ef5e49.png">

知見の枠に表示されるソースが増えた。
<img width="1423" alt="スクリーンショット 2019-01-07 16.55.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/175280/cc158d7f-36b2-aecf-fb73-4a4cc347fc52.png">

追記
検知した場合は赤色となり、詳細へリンクされる。
![スクリーンショット 2019-08-07 10.00.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175280/c3f288ef-b104-9cca-6472-5df8a8df3964.png)

リンクを辿って行くと、イベント時刻や詳細が確認できる。
![スクリーンショット 2019-08-07 10.00.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175280/09fd0735-fc7c-6367-74e7-eb9d12c237d5.png)
![スクリーンショット 2019-08-07 10.01.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175280/793096e1-cc80-34aa-69a3-53486fd4642f.png)
gitlabの使い方

gitlabを使って、ソフトウェアのいくつかの研究を実施予定。

# wiki
今日、gitlabのWikiにMacでExcelと Wordのファイルを貼り付けた。
コピペ。ファイルをドラッグアンドドロップ。

```gitlab:t201904.docx
[T201904.docx](uploads/6baf693e54a65633662d276caa2d3887/T201904.docx)
```

Windowsでみようとして保存すると、Zipファイルとして保存される。

手順に間違いがあるのかもしれないし、
操作の途中でやることをすっとばしているのかもしれない。

仕方なく、SDカードでコピーした。

gitコマンドでやり取りすればいいのかもしれない。

gitlabでも公開の研究をして、そこで使い方を覚えよう。

閉じたグループだけで作業していると技能も閉じてしまうのかも。

# issue
自分では、ついつい、issueばかりあげて、closeするのをさぼる癖がある。

issueをあげずに、わからないことや、調べ中のことがあるよりはいいかもしれない。

３つあげたら、１つはcloseすることを自分規則とすることにした。

openのものがcloseのものより少なくするのが努力目標。

週次の会議の時に、打ち合わせながらcloseをするようにしている。


#文書履歴
ver. 0.01 初稿 20190107 午後
ver. 0.02 issue追記 20190107 夕
redashでユーザのパスワードがわからなくなってしまった場合の対処法

# はじめに
BIツールのredashを利用している際にユーザのパスワードがわからなくなってしまった場合の対処法です。
`万が一の手順です。検証環境等でのトラブル時に利用してください。`

# 対象
* redashサーバにSSHでのアクセスが可能
* sudoが利用可能

# 手順
* redashサーバへのアクセス

```
ssh [user]@[hostname]
```

* パスワードを強制変更

```
cd /opt/redash/current
sudo -u redash bin/run ./manage.py users password {user's email} {new password}
```

* パスワード変更後、redashを再起動することで新たなパスワードを適用される。

```
# 再起動
sudo supervisorctl restart all
```
Galaxyの公共サーバ（微生物 microbe 以外）

Galaxyの公共サーバの[（概要）](https://qiita.com/haruosuz/items/f5c2e5c4212246e80d60)と[（微生物解析用）](https://qiita.com/haruosuz/items/d95de2fa3e5c39e5f35b)をご紹介しました。今回は、他の公共サーバ（リピート配列、化学、融合転写物、コドン、系統解析、RDFに関連）をご紹介します。

### [kmer-SVM](https://galaxyproject.org/public-galaxy-servers/kmer-svm/)
サポートベクターマシン（SVM）の特徴量としてDNA配列のオリゴマー（kmer）を用いた転写因子結合部位の予測

- Public server: [kmer-SVM server](http://kmersvm.beerlab.org/)
- チュートリアル [A tutorial on using the web server](http://kmersvm.beerlab.org/tutorial/)
- 論文 [Fletez-Brant et al. Nucleic Acids Res. 2013 "kmer-SVM: a web server for identifying predictive regulatory sequence features in genomic data sets."](https://www.ncbi.nlm.nih.gov/pubmed/23771147)

![](https://galaxyproject.org/use/kmer-svm/kmer-svm.png)

## [Langille Lab](https://galaxyproject.org/use/langille-lab/)
PICRUStのサーバ。マーカー遺伝子（例えば、16S rRNA）と全ゲノムからメタゲノムの機能を予測するバイオインフォマティクス・ソフトウェア・パッケージである。

- Public server: [Langille Lab PICRUSt server](http://galaxy.morganlangille.com/)
- ドキュメンテーション [PICRUSt Documentation](http://picrust.github.io/picrust/index.html)
- 論文 [Langille et al. Nat Biotechnol. 2013 "Predictive functional profiling of microbial communities using 16S rRNA marker gene sequences."](https://www.ncbi.nlm.nih.gov/pubmed/23975157)

![](https://galaxyproject.org/use/langille-lab/picrust-workflow-450.jpg)

### [MGEScan](https://galaxyproject.org/use/mgescan/)
真核生物ゲノム配列中の[レトロトランスポゾン](https://ja.wikipedia.org/wiki/レトロトランスポゾン)を同定

- Public server: [Langille Lab PICRUSt server](http://galaxy.morganlangille.com/)
- User Support
  - チュートリアル [MGEScan on Galaxy QuickStart Tutorial](https://mgescan.readthedocs.io/en/latest/tutorial.html)
  - ドキュメンテーション [MGEScan documentation](https://mgescan.readthedocs.io/en/latest/)
- 論文 [Lee et al. Bioinformatics. 2016 "MGEScan: a Galaxy-based system for identifying retrotransposons in genomes."](https://www.ncbi.nlm.nih.gov/pubmed/27153595)

![](https://galaxyproject.org/use/mgescan/mgescan-video-start.png)
SPSS Modelerグラフ加工：度数の棒グラフの並び順を変えたい

例えば、下記のようなグラフで、度数の多い順(その他の例だと売り上げの高い順など)に並べ替えたいとします。

【Before】
![棒グラフ1.JPG](https://qiita-image-store.s3.amazonaws.com/0/305774/a8070882-212f-966b-976b-a99a186a74cf.jpeg)
【After】
![棒グラフ2.JPG](https://qiita-image-store.s3.amazonaws.com/0/305774/44f8f92e-0d80-1700-33ca-4c4743a16dbf.jpeg)

1. 「表示」→「編集モード」と「カテゴリ」にチェックを入れます。
![棒グラフ3.JPG](https://qiita-image-store.s3.amazonaws.com/0/305774/a5335f1a-20af-b4d3-97fa-321624b239cc.jpeg)

2. グラフ上の並べ替えたい項目を選択します。(今回だと、グラフ横軸の「えび、なし、牛乳、、、」の部分全体)


3. グラフの左側にカテゴリ編集画面が追加されるので、度数の多い順の場合は「統計」を選択し、「▽」(降順で並べ替え)をクリックします。
「統計」で並べ替える以外に、「名前」で昇順・降順に並べ替えたり、任意の順番に設定できます。任意の順番に設定したい場合は、「ユーザー指定」を選択して、個別に「↑」や「↓」で項目名を移動させます。
![棒グラフ4.JPG](https://qiita-image-store.s3.amazonaws.com/0/305774/910a6b25-5583-a4ac-f70d-3d77500b5dac.jpeg)

## 試した環境

Modeler 18.1.1
Windows 7
MacBook Air 11-inch,Early2014 がある日突然、画面が真っ黒になり 動作しなくなりました。

MacBook Air 11-inch,Early2014 がある日突然、画面が真っ黒になり
動作しなくなりました。


そこで、まずは検索してみたところ、再起動や、SMCクリアなど
色々と試してみました。

まずは、下記のブログの通りにしてみました。

[MacBookAirのディスプレイが真っ黒で映らない！PRAMクリアで復活する方法](http://yoshizo.hatenablog.com/entry/how-to-restore-the-macintosh-that-not-reflected-display)


結果、何も変化なしでした。

他に解決方法はないかと思い、HDMLケーブルに繋ぐ方法がありました。
[HDMLケーブルを使ってモニターに繋ぐ](https://doronkoasobi.xyz/entry/mac-trouble-screen-blackout/#HDML%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC%E3%81%AB%E7%B9%8B%E3%81%90)


結果、何も映りません。


万策尽きました。

と、画面を放置していると、真っ黒の画面に「？」が表示されていました。
放置時間は、概ね10分程度でした。
![s_IMG-2517.JPG](https://qiita-image-store.s3.amazonaws.com/0/293164/ab4e9507-a9c2-8b78-7132-c099a86dd996.jpeg)



調べてみると、オペレーティングシステムが入っていないとのこと。

つまりは、オペレーティングシステムが入っているSSDへのアクセスが出来ていないということになる。

アクセス出来ない原因としては
１　マザーボード側の不具合
２　SSD側の不具合
のどちらかである。

一時的な現象であれば、接触不良であろうが、何度再起動行っても、「？」が出る状況ならば
SSDが壊れている可能性が高いと私は判断しました。

そこで、SSDの交換をと思い検索してみたところ、専用SSDの金額が25000円ほどしたため、一旦、購入を考えることにしました。
もし、SSDが壊れているのではなく、マザーボード側の損傷ならば、SSDを交換したところで、解決にはいたりませんし、ましてや、OSのインストールすらできない可能性があります。

そこで、まずは、OSの再インストールを試みることにしました。

Mac の電源を入れた直後に、キーボードの「command (⌘) + R」キーを押します。
appleのサポートページでは、appleロゴまたは、地球儀が表示されるまでそのまま押し続けると書いていますが
airの場合は、LANが無線であるため、そもそも地球儀はでません。

私の場合は、さらに押し続けなくても、10分程度放置していれば、wifiの選択画面が出てきました。
画面に従い、WIFIの設定を行うと、地球儀がグルグル回転し始めました。
![s_IMG-2518.JPG](https://qiita-image-store.s3.amazonaws.com/0/293164/f8391c9f-cdff-368c-bfb1-b3fc053dc2d8.jpeg)


その後、下記の画面が表示されます。
![](https://support.apple.com/library/content/dam/edam/applecare/images/ja_JP/macos/highsierra/macos-high-sierra-recovery-mode-reinstall.jpg)


再インストールを選択しましたが、インストールするディスクが存在しないと表示されます。
従いまして、手元にあったSDカード（６４GB）を接続してみると、ディスクを認識したようです。
とりあえず、SDカードにインストールという、なんとも怪しい方法ではありますが、何が故障しているか未だに不明なため
無駄な出費を抑えて、SDカードにてインストール開始しました。

が、即座に怒られました。
フォーマット形式が正しくないようです。
ディスクユーティリティを使用して、パーティションを2つ以上に分けてフォーマットする必要があるようです。
http://qa.elecom.co.jp/faq_detail.html?id=4078

フォーマットを完了させると、再度、OSインストール画面へ進みます。
インストールが開始されます。
が、しかし、インストール先がSDカードであるがゆえに、速度が異常に遅いです。
ですが、ここで分かったことは、私のMACの内蔵SSDは動いていないということが明確になり
USB経由でディスクを持たせれば、OSをインストールできるということが判明しました。

よって、SDカードへのインストールは途中で取りやめて
意を決して、ヨドバシカメラさんに外付けSSD128を購入してきました。

手順は、
１　Mac の電源を入れた直後に、キーボードの「command (⌘) + R」キーを押します。
２　wifiの選択画面が出てきましたので、wifiの設定を行います。
　　地球儀がグルグル回る
３　ディスクユーティリティを選択してパーテションを２つに分けてフォーマットします。
４　OSインストールを選択してOSをインストールします。

あとは、通常のOSのインストールと同じ流れで、無事MACが起動できるようになりました。
因みに、外付けSSDがUSBの口を占有している状態となりますが、安価な方法ではありますが、MACを復活させることができました。
Visual Studio2017でnode.exeを停止する

# 概要

Visual Studio 2017でASP.NET Coreを使っていて、node.exeがやたらメモリを食って動作が重くなることがあります。
そもそもサーバサイドJavaScript使ってないのに…という場合は、以下の手順で重たいnode.exeを止めてしまいましょう。


#手順

## 重たいnode.exeを止める前の状態

![pre-process.png](https://qiita-image-store.s3.amazonaws.com/0/19629/19dd3c34-4104-cc46-bb2d-63b4dd062d61.png)

node.exeが395MBもメモリを食っています。
デバッグも動かしておらず、ASP.NET Coreのプロジェクトをロードしただけでこの有様です。


## 設定変更
ツール>オプション>テキストエディタ> JavaScript / TypeScript>言語サービス で、以下のように設定してVisual Studio を再起動します。
(なんでテキストエディタの設定の中に…)

- OFFにする : 新しい JavaScript Launguage Serviceを有効化します。
- ONにする: 専用の構文処理を無効にします(再起動が必要)。

![VS2017-option.png](https://qiita-image-store.s3.amazonaws.com/0/19629/874b8212-06f7-2c69-f10d-255abd497f59.png)

## 重たいnode.exeが止まった状態

下記のように、メモリ食いのnode.exeか起動しなくなりました。
![post-process.png](https://qiita-image-store.s3.amazonaws.com/0/19629/f5df4578-4353-093a-d473-0f9303143a48.png)


# 補足
- よくみると全部のnode.exeが止まるわけでは無いようですが、一番メモリ食ってるnode.exeは上記で止まってくれます。
- インテリセンスが効かなくなるとかいううわさもありますが、手元では特に問題なく使えている感じがします(あいまい)。


# 参考
- [asp.net mvc - Visual Studio 2017 - Node.JSサーバープロセス - オフにしますか？ - スタックオーバーフロー](https://stackoverflow.com/questions/42769106/visual-studio-2017-node-js-server-process-turn-off)
毎度同じ雛形のCellClassをShellで生成して楽してみた

# はじめに
この記事を書いた理由は一つ・・・
**毎度同じ雛形(importするライブラリ、継承、準拠するClassとProtocolがわかってる場合)**毎度書くのめんどくさい
そんな問題を解決出来ないか？と考えた結果試してみて良さそうだったので記事にしてみました。
例は限定的で汎用性高くないのは課題ですが、解決方法の一例としてみてもらえるとmm


# 内容
shellで変える必要があるところだけ引数で変えてしまう

```generateCell.sh
#! bin/sh
NAME=$1

cat << EOL > ${NAME}Cell.swift

import UIKit
import Instantiate
class ${NAME}Cell: UITableViewCell, Reusable, NibType {

    struct Dependency {}
    func inject(_ dependency: ${NAME}Cell.Dependency) {}

    override func awakeFromNib() {
        super.awakeFromNib()
    }
}
```

# 実行
`sh generateCell.sh Profile`

# おわりに
もっと良き方法はあるなと思ってるので自分でも模索してみよう！

うちではこんな感じでファイルの自動生成やってるよ！ってあればコメントいただけると嬉しいです！
Jasper Report 簡易帳票出力 （Java 実装）

#  JasperReport出力（Java側）

## はじめに

JasperReportsは、Jaspersoft Studioで帳票テンプレートを作成後、テンプレートファイルを読み込んで帳票出力を行う。
デザイナーツールの使い方は多いが、デザイナーで作成したファイルを実装に組み込む方法が少なかったため、忘備で記載する。


## 構成

- DataSourceのセット（デザイナーで作成したxml ファイルをセットするイメージ）
- 帳票出力マネージャーの実行

## データソース 

※　データソースごとに利用するクラスが異なる。

### CSV

```java
	JRDataSource data = new JRCsvDataSource(inputPath);
	// 1行目はヘッダーとみなす
	((JRCsvDataSource) data).setUseFirstRowAsHeader(true);

```

## 帳票出力

※　出力ファイルごとに実行メソッドが異なる

### PDF

```java

// parametersはMap<String, Object> 型			JasperRunManager.runReportToPdfFile(this.templatefilePath, this.outputFilePath, this.parameters,
					this.dataSource);

```

### Excel

```java
			// Excel フォーマットの変換
			JRXlsxExporter xlsxExporter = new JRXlsxExporter();

			// 読み込みデータ
			xlsxExporter.setExporterInput(new SimpleExporterInput(
					JasperFillManager.fillReport(this.templatefilePath, this.parameters, this.dataSource)));
			// 出力先を決定
			xlsxExporter.setExporterOutput(new SimpleOutputStreamExporterOutput(this.outputFilePath));

			// Excel フォーマット設定はなし
			xlsxExporter.exportReport();

```

※ xlsの場合はJRXlsExporterを利用する。
サーバーレスアプリケーションを構築する

# 概要

昨年、一念発起してエンジニアに転職しました。
業務的には慣れてきたのですが、何をすれば良いかわからないから、
とりあえず面白そうだなと思ったことのチュートリアルとかをやりつつ見識を広めていきたいと思います。

↓今回はこれをやるだけです。
https://aws.amazon.com/jp/getting-started/tutorials/build-serverless-app-codestar-cloud9/?trk=gs_card

↓ざっくり
「AWS CodeStar　と　AWS Cloud9 を使用した
Node.jsのサーバーレスアプリケーションの開発、構築、デプロイ」

# 実践

* AWSのアカウントは作成済み
* mac os

という状況から始めます。
で、まず東京リージョンで始めるとCloud9が対応してなくてチュートリアルどうりに進めません。
ここで詰みます。

なので、
シンガポールリージョンで始めました。

## 構築

### CodeStarにてアプリケーションを作成

テンプレートには、Node.js + AWS Lambdaの物を選択します。
※ Node.jsを用いたテンプレートがいくつかあるので注意
(というか、テンプレートとても豊富ですね。他も試したい)

ここから先は特に迷うことなくアプリケーション作成まで行けました。

>
プロジェクト名：「nodejs-serverless-project」
IDE:「AWS Cloud9」 ←　これが東京に対応してないやつ
※ Cloud9のインスタンスタイプ：「t2-micro」無料利用枠のやつ

数分待つとプロジェクトとIDEがセットアップされた旨のメッセージが表示されます。

## 開発

まず「アプリケーションのエンドポイント」という欄がCodeStarダッシュボード上にあるので、
そこのリンクをクリックすると作っているTOPページが開きます。

また、CodeStarに戻り上部にある「コーディングの開始」をクリックすると、
Cloud9が開きます。

index.htmlを探してきて、なんか変更を加えます。(とりあえずチュートリアルと同じようにする)

```index.html
        <!-- 58行目あたり -->
        <div class="message">
            <a class="twitter-link" href="http://twitter.com/home/?status=I%20created%20a%20project%20with%20AWS%20CodeStar!%20%23AWS%20%23AWSCodeStar%20https%3A%2F%2Faws.amazon.com%2Fcodestar"><img src="assets/img/tweet.svg" /></a>
            <div class="text">
                <h1>Congratulations!</h1>
                <!-- <h2>You just created a Node.js web application</h2> -->
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　<!-- なんてことはなく、末尾に「!」を3つ付けるだけ-->
                <h2>You just created a Node.js web application！！！</h2>
            </div>
        </div>
```

* 編集を終えたら「コマンド + s」で保存します。

## デプロイ
開発パートの続きです。

上記で修正した内容を、Cloud9下部のterminal上でgit add, git commitします。
※ nanoエディタ初めて触ったので保存できなくて焦りました。(control + x)で保存なんですね。

そして、git pushしたらすかさずCodeStarダッシュボードに戻りましょう。
「継続的デプロイメント」という項目に動きがあるはず！

最終的には、以下のように「Source, Build, Deploy」の各項目が「成功」という表示に変わります。

<img width="416" alt="screenshot 2019-01-07 15.32.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/46053/44eb1473-f619-6ae4-0d1d-8c429a138fae.png">

再度、先ほどのTOPページをリロードすると、変更が反映されています。

# あとがき

* CodeStarのダッシュボードが見やすくてとても良い。
wikiを残せたり、コミット履歴を表示してたり、デプロイ状況がみれたり、CloudWatchの画面が出てたり
サーバーレスアプリケーションである必要は全く皆無だったけど、これは簡単ですね。。

* Cloud9に関しては、環境の問題もあるかもしれないけどちょっとカクツクイメージがあったり
Chrome内にあるのでファイルのタブ移動に手間取ったりですが環境作らなくて良いのは便利でした。

(↑チュートリアルで触った程度なのでファーストインプレッションとしてですが)
[2019年1月版]WSL + Ubuntu + Docker で Portainer

# WSLでPortainerしたい。

こちら([”[2019年1月版]WSL + Ubuntu で Docker が動くっ！動くぞコイツッ！”](https://qiita.com/koinori/items/78a946fc74452af9afba))の手順で Windows10のWSLでDockerが動作することは確認できました。
続いてdockerのは簡単管理コンソールでお気に入りのPortiainerをWSL+dockerの環境で動かしてみたいわけです。
例によって最新版のイメージでは動かず、いくつかのバージョンを総当たりでトライしました。
今回はトライした手順は省略しますが、Portainerのバージョン1.13.6でとりあえず起動は確認しました。
よって起動のコマンドは以下のようになります。

```shell
$ docker volume create portainer_data
~$ docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer:1.13.6
```

コンテナが動いているのにブラウザ(http://localhost:9000)が応答しない場合はカスペなどのアンチウイルスソフトが9000番を遮断していないか、確認してください。
また、dockerサービスの再起動(例によって wsl.exeの再起動も)すると動く、ということもあると思います。(Ubuntu起動時に管理者権限で立ち上げることも忘れずに！)
何回かdockerサービスの起動、Portainerの起動を試してみましたが一発でうまく立ち上がる場合とコンテナ立ち上がるけどブラウザで応答しない場合などありました。
ここら辺の不安定さはやはり旧バージョンを無理やり動かしてるもんね。。。感があります。

## ただし Portainer 1.13.6 です。

imageやTemplateの取得先などのURLが違っているようで画面からダイナミックにイメージを取り込んでコンテナを起動などはできませんでした。
ローカルや社内のdockerサーバーのすでに起動しているコンテナをリモート管理するような感じですかね。
MacをMojaveにアップデートしたらJenkinsが起動しなくなった対応

ビルドマシンをMovaveにアップデートしたら、Jenkinsが起動してない

```
$ launchctl list | grep jenkins
-	78	ci.jenkins
```

OSアップデートのいつものことだが、権限まわりが自動でアップデートされているっぽい


設定によるがjenkinsユーザで起動の場合

```
$sudo chown jenkins /var/log/jenkins
```
で

```
$launchctl unload Library/LaunchAgents/ci.jenkins.plist
$launchctl load Library/LaunchAgents/ci.jenkins.plist
```
で起動した
MySQL用ADO.NETでConnectorと付く物は2つある

色々調べていて混乱したのでまとめておきます。
同じように混乱した方の参考になれば幸いです。

.NETでMySQLに接続するためのライブラリ（要はADO.NET）で
Connectorと名前が付く物は2つあります。

#Connector/NET
MySQL（Oracle社）公式のライブラリ。正式名称は「Connector/NET」のようです。
https://dev.mysql.com/downloads/connector/net/8.0.html
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149348/480103b2-ec2a-eacf-256f-e7a847a13ca2.png)

#MySqlConnector
こちらは正式名称が「MySqlConnector」https://mysql-net.github.io/MySqlConnector/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149348/13bf2d68-bb05-5807-b200-8efcab858780.png)

MySQL公式（Oracle社）とは関係のない純粋なOSSのライブラリ。
Oracle社のものをベースにしておらず、MySQLのプロトコルを純粋に再実装している旨の記載あり。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149348/bbb86500-0985-b052-dce7-0f0025a9ed9d.png)

#比較
MySqlConnectorのページに比較が載っていますが、MySqlConnectorは非同期処理に完全に対応していることが特徴のようです。
また、Connector/NETはGPLですがMySqlConnectorはMITライセンスです。
https://mysql-net.github.io/MySqlConnector/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149348/e3bc1e4f-51cd-68b5-ce90-81c359b1f03e.png)

#どちらがポピュラー？
nugetのダウンロード数で比較すると
純粋にADO.NETのライブラリとしてはConnector/NET ＞ MySqlConnector
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149348/aa609679-54d8-1257-e112-0244abeb73cd.png)
ただし、Entity Frameworkとしてダウンロードされているものは
Pomelo.EntityFrameworkCore.MySql(MySqlConnectorを使用したEF) ＞ Connector/NET
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149348/9e06ba6c-2103-ca22-58bd-e95c41333fd2.png)

#どっちを使う？
MySqlConnectorの方はConnector/NETと比較して以下の制限がありますが、
私が使っている範囲ではこの制限に該当する実装をする場面はありません。
私はOracle社があまり好きではないのでMySqlConnectorを使っています。
（なので、MySQLではなくMariaDBを使っている）
https://mysql-net.github.io/MySqlConnector/overview/known-issues/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149348/2f004fe2-513c-53d4-ecbd-0677a4113ed5.png)
JSでレンダリングした要素にaddEventListenerする方法


JQueryを使わず、JSでレンダリングした要素に対してイベントを付与する方法について調べた際のメモです。自分のような脱JQuery中のJS初学者向けです。　以下の例では「JSでレンダリングした要素にclickイベントを付与する」　ケースを想定しています。

# idを起点にイベントを付与

```js

document.addEventListener('click', (e) => {
    if (e.target.id === 'id名')) {
        //　イベント発生時に生じさせたい処理 
    }
})

```

# classを起点にイベントを付与
```js

document.addEventListener('click', (e) => {
    if (e.target.classList.contains('クラス名')) {
        //　イベント発生時に生じさせたい処理 
    }
})

```

# やっていること

ざっくり言うと、

**何かしらがクリックされたら、それが処理を行いたい要素なのかをチェックする**

ということを行なっています。``e.target``にはクリックされた要素が入っていますので、その要素が目的とするclassやidを持っているのかを判断して条件分岐させています。
monacoin-cliのコマンドgetwalletinfoの中身をのぞいてみる

#目的
monacoin-cliにあるgetwalletinfoっていうwallet残高出してくれるコマンドの中身を知りたい。
#方針
Virtual Boxに作ったlinuxにソースコード落として、そっからgetwalletinfoでfindしてみる。(Linux,Virtual Boxの操作のお勉強含む)
#Linux環境構築
下記URLに沿ってCentOS7を入れる
https://qiita.com/tamago3keran/items/260899458959d3214dcf
インターネットに接続できるようにする為には、下記ファイルのONBOOT=yesとしてあげればOK


```
/etc/sysconfig/network-script/ifcfg-enp03s
ONBOOT=yes
```

参考
https://www.shookuro.com/entry/2018/02/10/172724

###ホームディレクトリを英語化する
下記コマンドを実行

```
LANG=C xdg-user-dirs-gtk-update
```

###gitcloneするフォルダを用意
とりあえずDocuments直下にフォルダ作って777にする

```
cd Documents/
mkdir mona
chmod 777 mona
```
###gitcloneする
```
git clone https://github.com/monacoinproject/monacoin.git
```

#getwalletinfoを探す
srcフォルダの下だろうとあたりをつけてfind

```
cd monacoin/src
find ./ -type f -print | xargs grep 'getwalletinfo'
```
findは下記参考
http://kawatama.net/web/1141

結果は下記。<img width="839" alt="Screen Shot 2019-01-07 at 16.24.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/149169/ad1a8028-f89c-348c-b22a-5a4789bf6ca8.png">

rpcwallet.cppというファイルに中身書かれていそうなので見に行く

```
less wallet/rpcwallet.cpp
/getwalletinfo
```
結果
<img width="993" alt="Screen Shot 2019-01-07 at 16.28.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/149169/dafc2456-8418-ea78-911a-a2a2efd6ebc6.png">

なんかぽいところ発見。とりあえずgetwalletinfoの中身をのぞくところまでは成功

これを読み解くにはRPC勉強しなきゃなのかな。。。

RPCお勉強の際の参考（備忘)

https://bc-2.jp/archive/season1/materials/0202_RPC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%A7%A6%E3%82%8D%E3%81%86-na.pdf
C++ Builder XE4 > TeeChart > 横軸のラベル右側が表示しきれない > MarginRightを変更する

```txt:動作環境
C++ Builder XE4
```

### 状況

- 横軸のラベル右側が表示しきれない

対応としては、グラフの表示枠を狭くしてラベル右側のスペースを増やす

### 実装

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <DateUtils.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
	Chart1->Series[0]->XValues->DateTime = true;
	Chart1->BottomAxis->DateTimeFormat = L"hh:nn:ss";
	Chart1->Legend->Visible = false;

    TDateTime dt;

    dt = Now();

    double yval;
    for (int idx=0; idx < 10; idx++) {
        yval = (1+ idx) % 2;
        Series1->AddXY(dt, yval, "", clRed);
        dt = IncSecond(dt, 1);
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_defaultClick(TObject *Sender)
{
	Chart1->MarginRight = 3;
}
void __fastcall TForm1::B_narrowerClick(TObject *Sender)
{
	Chart1->MarginRight = 10;  // (初期値は 3 )
}
//---------------------------------------------------------------------------
```

### 動作例

ソフト起動後、横軸の表示位置を左右にずらした
=> 横軸のラベル右側が表示しきれない状況の再現
![2019-01-07_16h04_41.png](https://qiita-image-store.s3.amazonaws.com/0/32870/bcd82de7-79a2-9bb3-92f3-a1922c8646e4.png)

B_narrowerを押下後
=> 横軸のラベル右側が表示されるようになった
![2019-01-07_16h04_55.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b4e2b141-f192-06c7-6c1e-6080896f9978.png)
SQLServer: レプリケーション遅延のトラブルシューティング事例

レプリケーション遅延に関するトラブルシューティング事例を一つご紹介します。

レプリケーションの遅延では、主にパブリッシャとディストリビュータ間の遅延と、ディストリビュータとサブスクライバ間の遅延とに原因が分類されます。

今回は、遅延は事前にディストリビュータとサブスクライバ間での何かが原因であることが、レプリケーションモニタから分かっていました。

# 1. サブスクライバ側でのレプリ適用に時間がかかっているクエリを抽出

レプリケーションは、内部的にはサブスクライバDBに対して各テーブルのレコード単位でのinsert/update/deleteの反映という形で行われます。

このストアドはレプリケーションが作成されると自動的に一緒に作成されます。（正確にはスナップショットレプリ適用時だった気もしますが、、）

名前はすべて[sp_MSins_dboテーブル名]のような構成になっているため、それらのストアドの実行時間を調査するために以下のクエリを実行します。

```sql
set transaction isolation level read uncommitted

select top 100 DB_NAME(qt.dbid) as database_name
	--query text
	,qt.text as parent_query
	,SUBSTRING(qt.text, qs.statement_start_offset / 2, (case when qs.statement_end_offset = - 1 then LEN(CONVERT(nvarchar(MAX), qt.text)) * 2 else qs.statement_end_offset end - qs.statement_start_offset) / 2) as statement
	-- average
	,total_worker_time / qs.execution_count / 1000 as average_CPU_time_ms
	,total_elapsed_time / qs.execution_count / 1000 as average_duration_ms
	,total_physical_reads / qs.execution_count / 1000 as average_physical_reads
	-- execution count
	,qs.execution_count as execution_count
	-- creation / execution time
	,last_execution_time
	,creation_time
	-- total
	,total_worker_time / 1000 as total_CPU_time_ms
	,total_elapsed_time / 1000 as total_duration_ms
	,total_physical_reads / 1000 as total_physical_reads
	,qp.query_plan
from sys.dm_exec_query_stats qs
outer apply sys.dm_exec_sql_text(qs.sql_handle) as qt -- クエリテキスト用
outer apply sys.dm_exec_query_plan(plan_handle) as qp -- プランプラン用
where qt.text like '%sp_msins%' --insert
or qt.text like '%sp_msdel%' --delete
or qt.text like '%sp_msupd%' --update
order by average_duration_ms desc
```

# 2. 原因特定→対応を実施
今回は、特定のテーブルに対するsp_MSupd***ストアドプロシージャの実行時間が他のテーブルよりも大きくなっていることが確認できました。
このテーブルにはインデックスが多数張られており、それが原因で1レコードあたりの更新時間が長くなっていると想定しました。

そのため、該当テーブルのインデックスを削除できないか調査するため、以下のクエリを実行して各インデックスの使用状況をチェックしました。

```sql
DECLARE @TableName varchar(300)
set @TableName = 'テーブル名'

SELECT
    o.name AS table_name
  , i.name AS index_name
  , s.user_seeks    -- Index Seek 数
  , s.user_scans    -- Index Scan 数
  , s.user_updates  -- UPDATE 数
  , s.user_lookups  -- lookup 数
  , last_user_seek
  , last_user_scan
  , last_user_lookup
  , last_user_update
FROM
sys.objects o
 INNER JOIN sys.indexes i
   ON o.object_id = i.object_id
 INNER JOIN sys.dm_db_index_usage_stats s 
   ON i.index_id = s.index_id
WHERE o.type = 'U'
 AND database_id = DB_ID()
 AND s.object_id = OBJECT_ID(@TableName)
 AND o.name = @TableName
ORDER BY
 s.user_seeks+s.user_scans desc
```

その結果、ほぼすべてのインデックスを使っていなかったため、未使用のインデックスを全てDROPしました。
これにより1レコードあたりの更新速度が上がり、結果的にレプリ速度が5倍ほど高速化されました。

# 最後に
レプリに関するトラブルシューティング事例を1つご紹介しました。レプリ遅延に関する原因は様々なものがあるので今回の調査手法が汎用的に使えるわけではありませんが、原因の1つとして、「大量更新＋1レコードあたりのサブスクライバ側への適用速度が少しだけ遅い＝大幅な遅延につながる」というのは頭に入れておくといいかもしれません。
Pesterのアサーションオぺレーターにおける入力配列の扱い

[Pester](https://github.com/pester/Pester)によるテストコードは

```powershell
$actual | Should -<Operator>
```

と書かれるが、*$actual*が配列だった場合に、1要素ずつアサーションを実行するのか、配列全体を受け取ってアサーションするかどうかは、オペレーターごとに定義されている。

まとまったドキュメントが見つからなかったので、ソース(Functions/Assertions/*.ps1)から拾い上げた。
下表の**array supported**が*true* の場合、配列全体を受け取るオペレータ、*false*の場合、1要素ずつ受け取るオペレータ。

| operator | array supported |
|----------|-----------------|
| Be | **true** [^1] |
| BeExactly | **true** [^1] | 
| BeGreaterThan | false |
| BeLessOrEqual | false |
| BeIn | false |
| BeLessThan | false |
| BeGreaterOrEqual | false |
| BeLike | false |
| BeLikeExactly | false |
| BeNullOrEmpty | **true** | 
| BeOfType | false |
| BeTrue | false |
| BeFalse | false |
| Contain | **true** | 
| Exist | false |
| FileContentMatch | false |
| FileContentMatchExactly | false |
| FileContentMatchMultiline | false |
| HaveCount | **true** | 
| Match | false |
| MatchExactly | false |
| Throw | false |

[^1]: 内部で、配列の要素単位でアサーションを実行しているため、実質*false*と同等。入れ子になった配列を扱うために*true*になっている模様
基本的なSQL文まとめ

データベースを操作するには、データベースに対する命令文(SQL文)を書けることが必要不可欠です。
そこで、基本的なSQL文をまとめました。
ここでは、SQLの分かりやすい勉強サイト「SQL bolt」を参考に紹介します。
<br>
次のテーブル「student」をいじっていきます。

|id|name|club|
|:-:|:-:|:-:|
|0121|Tanaka|baseball|
|0122|Kato|soccer|
|0123|Kato|street dance|

例えば、名前がKから始まる人の情報を引っ張ってきたいとしましょう。
その時は次のように書きます。

```
SELECT *
FROM student
WHERE name LIKE "T%"; 
```
このSQL文の意味は「studentテーブルから(FROM)、すべての行を選び(SELECT)、名前がTから始まる人を選ぶ(WHERE)」です。
T%は前方一致を表します。
%tだと最後がtのものを選んできます。
%t%だと、tを含むものすべてを選んできます。

SQL文は大文字と小文字を区別しないので、意識しなくてもOKです。

<br>

次に、もう1つのテーブル「information」を追加します。

|number|height|weight|
|:-:|:-:|:-:|
|0121|168|72|
|0122|191|88|
|0123|170|55|

ここで、studentとinformationをくっつけてみます。
それぞれのテーブルは作成者が異なるため、idとnumberは同じ値ですが、違う列(カラム)名を与えてしまいました。
この場合、次のようにすれば、テーブルをくっつけられます。

```
SELECT *
FROM student
JOIN　information
ON id=number;
```
こうすれば、次の表になります。

|id|name|club|height|weight|
|:-:|:-:|:-:|:-:|:-:|
|  0121 |Tanaka   | baseball  | 168  |  72 |
| 0122  |  Kato | soccer  |  191 | 88  |
|  0123 |  Kato |  street dance |  170 |55|

こうすれば、後はデータを整理していきましょう。
身長の平均を出す時は、

```
SELECT id, AVG(height) AS Average_height
FROM employees;
```
AVGの所をSUMすれば合計、COUNTにすればデータ数、MAXにすれば最大値を出してくれます。
SQL文は、まだまだたくさんあるので勉強してみてください。
tslearnのpipインストールで"LINK : fatal error LNK1158: 'rc.exe' を実行できません。"が出た時の対処

時系列データのクラスタリングに使えるtslearnライブラリなるものがあると知ってインストールを試みたところちょっと詰まったので備忘録を残す。

##実行環境

- Python (>3.x) with Jupyter
- Visual Studio Build Tools 2017 -15.9.4
    - Windows 10 SDK (10.0.17763.0)
    - CMakeのVisual C++ ツール
    - ツールのコア機能のテスト-ビルドツール
    - x86用とx64用のVisual C++ ATL
    - x86用とx64用のVisual C++ MFC
    - Windows 10 SDK (10.0.17134.0)
    - デスクトップ用VC++ 2015.3 v14.00 (v140) ツールセット
 
因みにBuild Toolsをそもそも入れていなかったために、最初に遭遇したエラーは「VC++ (14.00)がインストールされていません」であった。

##エラーと対処

入れるものは入れたので `pip install tslearn` を実行したところ以下のエラー

`LINK : fatal error LNK1158: 'rc.exe' を実行できません。`

RC.EXEはMicrosoft SDKの標準リソースコンパイラのコマンドライン版とのこと。
[RC.EXE - Microsoft SDK リソース コンパイラ](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/RC.EXE_-_Microsoft_SDK_%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9_%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)

更に調べてみるとどうもフォルダ構成がおかしいことが原因と分かった。[このサイト](https://www.xlsoft.com/jp/blog/intel/2017/07/03/visual-studio-2017-%E7%B5%B1%E5%90%88%E7%92%B0%E5%A2%83%E3%81%A7-rc-exe-%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93-%E3%81%AE%E5%AF%BE%E5%BF%9C/)を参考にして`C:\Program Files (x86)\Windows Kits\10\bin\x86`を確認したところ空フォルダであった。

そこで同サイトに従って
1.`C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86`をコピー（参考サイトでは15063だが、最新のものでOK）
2.`C:\Program Files (x86)\Windows Kits\10\bin\x86`に貼り付け
3.`C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64`をコピー
4.`C:\Program Files (x86)\Windows Kits\10\bin\x64`に貼り付け
をやってから再度`pip install tslearn`を実行。

無事インストール完了！
さて本題の時系列クラスタリングに着手するぞ～
PythonでBigQueryのテーブルをGCPリソースだけを使って洗い替える方法

_◎20190121情報追記：最新のPython3.7系だとExceptionが発生しないようです。Python3.6系だと以下のコードで動作します。_

`pandas.io.gbq`は複雑な認証が不要で、プロジェクトIDだけでGoogle BigQuery(以下、BQと略します)を操作できます。  
本ページでは、Pythonの`pandas.io.gbq.read_gbq`を使ってBQのテーブルを洗い替る方法を説明します。
なお「洗い替え」は、**DELETE実行後にSELECT結果をINSERTすること**と定義します。  
`pandas.io.gbq`の標準的な使い方は以下に詳しくまとめられていると思います。
[Python使いのためのBigQuery連携](https://qiita.com/hik0107/items/3944ccea04371331c3b4)

## なぜデータアップロード用のpandas.io.gbq.to_gbqを使わないのか？
そもそも`read_gbq`はSELECT結果を`pandas.DataFrame`に格納するメソッドであって、BQにデータをappendしたいならば`to_gbq`を使えば良いではないかと思われるかもしれません。  
しかしこの場合だと、洗い替えするためにはBQから`read_gbq`を使ってデータを`DataFrame`に変換・保持した後に、`to_gbq`でBQに`DataFrame`をappendすることになります。  
1万行に満たないような少量のレコード数ならばこれでも問題ありませんが、1000万行を超えた場合にはread_gbqでBQからデータを取得して```DataFrame```変換するのにかなり時間がかかってしまいます。
![qiita.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/337794/0ad34625-6c5a-4f1f-24b4-da682c952588.jpeg)

ここでヒントになるのが、**read_gbqの実装ロジックが、BQのwebコンソール画面でのクエリ実行とほぼ同じということ**です。  
ためしに、BQのwebコンソール上でSELECT結果をINSERTするクエリを実行すると高速に処理できるのがわかると思います。  
いちいちBQからのデータ取得結果を`DataFrame`に変換・保持することなく、`read_gbq`を使って擬似的にwebコンソール上でのクエリ実行と同じ動きをさせようと試みました。  

## 実装アイディア
`pandas.DataFrame`を介することなく`read_gbq`を使ってBQを洗い替えます。  
`read_gbq`を本来とは異なる用途で使用するためエラーが発生しますが、今回の実装では特定のエラーをキャッチした場合に正常処理がされたと想定します。
### DELETE実行
`read_gbq`のクエリにDELETE文をセットします。  
以下のようなエラーが吐かれるので、例外処理でエラーをキャッチして処理を続行させます。

	<class 'KeyError'>, KeyError('totalRows',), <traceback object at 0x10ed4dd08>
### SELECT結果のINSERT実行
`read_gbq`のクエリに`INSERT xxxx SELECT yyyy`をセットします。  
以下のようなエラーが吐かれるので、例外処理でエラーをキャッチして強制終了させます。

	<class 'KeyError'>, KeyError('totalRows',), <traceback object at 0x10ed4dd08>

## 実装例

```python:sample.py
# coding:utf-8
import pandas as pd
import sys


####################
# 対象テーブル
####################
# Google BigQueryプロジェクトID
PROJECT_ID = '**********'
# スキーマ名
SCHEMA = '**********'
# 対象テーブルをcsvから取り込む
TARGET_TABLE = '**********'


####################
# クエリ定義
####################
# DELETE文作成
query_delete = '''
delete from {schema}.{table_nm} where 1=1
'''.format(
	schema=SCHEMA,
	table_nm=TARGET_TABLE
	)
# SELECT~INSERT文作成
query_select_insert = '''
#standardSQL
insert {schema}.{table_nm} (col1,col2,...)
select * from xxxxxxxxxx.yyyyyyyyyy
'''.format(
	schema=SCHEMA
	, table_nm=TARGET_TABLE
	)
try:
	# DELETE文の実行
	df = pd.read_gbq(
		query_delete
		, PROJECT_ID
		, dialect='standard'
		)
except KeyError:
	try:
		# SELECT~INSERT文の実行
		df = pd.read_gbq(
			query_select_insert
			, PROJECT_ID
			, dialect='standard'
			)
	except KeyError:
		# システムを強制終了
		sys.exit()
```
VBA_組み合わせ出力プログラム(二次元配列)


#1.概要
VBAで二次元配列の組み合わせをDebugPrintするサンプルプログラム。
以下のような配列でa,b,cから1つずつ選ぶ全組み合わせを出力する。
　(配列は予めセルに入力しSelectionしておく)
a1  a2  a3  a4
b1  b2  b3  b4
c1  c2  c3  c4
![2019-01-07.png](https://qiita-image-store.s3.amazonaws.com/0/336212/f94d32c6-cec3-51f6-4a8d-1299ffbea2c7.png)


#2.ソースコード
```vb

Option Explicit


Sub 組み合わせ()

'---------1.元データ格納処理----------

'以下のような配列でa,b,cから1つずつ選ぶ全組み合わせを出力
'(配列は予めセルに入力しSelectionしておく)
'a1  a2  a3  a4
'b1  b2  b3  b4
'c1  c2  c3  c4

    'Selectionを格納する配列
    Dim rg_selection As Range
    Set rg_selection = Selection
         
    'SelectionのValueを格納、要素数はSelectionを基にRedim
    Dim str_array() As String
    ReDim str_array(rg_selection.Rows.Count - 1, rg_selection.Columns.Count - 1)

    Dim rg As Range    'ForEach用
    Dim i, j As Long
    
    For Each rg In rg_selection
        i = rg.Row - rg_selection.Row
        j = rg.Column - rg_selection.Column
        
        str_array(i, j) = rg.Value
'        Debug.Print str_array(i, j)
    Next
    
'---------2.組み合わせ生成---------

    Dim m As Long '行方向のカウンタ
    Dim n_a, n_b, n_c '列方向のカウンタ
'   Dim n_d As Long '要素dを追加する場合
    
    
    
    
    Dim Buf_() As String '生成した組み合わせのバッファ
    ReDim Buf_(UBound(str_array, 2))
    
'組み合わせ生成ループ
    For n_a = 0 To UBound(str_array, 2)
        m = 0 '0行目を対象
        Buf_(m) = str_array(m, n_a)
                
        For n_b = 0 To UBound(str_array, 2)
            m = 1 '1行目を対象
            Buf_(m) = str_array(m, n_b)
            
            For n_c = 0 To UBound(str_array, 2)
                m = 2 '2行目を対象
                Buf_(m) = str_array(m, n_c)
                Call DebugPrintArray(Buf_)

'要素dを追加する場合
'                For n_d = 0 To UBound(str_array, 2)
'                    m = 3 '3行目を対象
'                        Buf_(m) = str_array(m, n_d)
'                    Call DebugPrintArray(Buf_)
'
'                Next
            Next
        Next
    Next
 
End Sub

'配列のDebugPrint
Function DebugPrintArray(var As Variant)
    
    Dim hoge As Variant
    
    '改行無し、各要素間はスペース
    For Each hoge In var
        Debug.Print hoge + " ";
    Next
    
    '改行する
    Debug.Print
    
End Function



```

#3.実行結果
a1 b1 c1  
a1 b1 c2  
a1 b1 c3  
a1 b1 c4  
a1 b2 c1  
a1 b2 c2  
a1 b2 c3  
a1 b2 c4  
a1 b3 c1  
a1 b3 c2  
a1 b3 c3  
a1 b3 c4  
a1 b4 c1  
a1 b4 c2  
a1 b4 c3  
a1 b4 c4  
a2 b1 c1  
a2 b1 c2  
a2 b1 c3  
a2 b1 c4  
a2 b2 c1  
a2 b2 c2  
a2 b2 c3  
a2 b2 c4  
a2 b3 c1  
a2 b3 c2  
a2 b3 c3  
a2 b3 c4  
a2 b4 c1  
a2 b4 c2  
a2 b4 c3  
a2 b4 c4  
a3 b1 c1  
a3 b1 c2  
a3 b1 c3  
a3 b1 c4  
a3 b2 c1  
a3 b2 c2  
a3 b2 c3  
a3 b2 c4  
a3 b3 c1  
a3 b3 c2  
a3 b3 c3  
a3 b3 c4  
a3 b4 c1  
a3 b4 c2  
a3 b4 c3  
a3 b4 c4  
a4 b1 c1  
a4 b1 c2  
a4 b1 c3  
a4 b1 c4  
a4 b2 c1  
a4 b2 c2  
a4 b2 c3  
a4 b2 c4  
a4 b3 c1  
a4 b3 c2  
a4 b3 c3  
a4 b3 c4  
a4 b4 c1  
a4 b4 c2  
a4 b4 c3  
a4 b4 c4
文字列を暖簾にする

プロ野球において、曰くつきの抑えが登板した時に欠かせない(？)暖簾を生成するスクリプト。
初心者なりにPythonで何か小さなものを作ってみようという取り組みです。

```Python:noren.py
print("暖簾にしたい文字列を入力してください")
keyword = input(">> ")
noren = ""
for i in list(keyword):
    noren = noren + "|　" + i + "　"
norenAll = "￣" + noren + "|￣"
print(norenAll)
```
[Android] BottomNavigationViewのレイアウトをいじる

## 概要
Androidで下タブとして使えるBottomNavigationですが、各Itemのタイトルが長すぎたりすると末尾がカットされて全体が表示されなかったりします。基本的にはタイトルを適切な長さにすべきですが、どうしても長めのタイトル全体を表示したいといった時、下記のようにBottomNavigationItemViewのレイアウトにアクセスして変更を加えることが可能です。

## 例
```kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        fixBottomNavigationViewLayout(findViewById(R.id.bottom_navigation))
    }
}

private fun fixBottomNavigationViewLayout(view: BottomNavigationView) {
    try {
        val menuView = view.getChildAt(0) as BottomNavigationMenuView

        // BottomNavigationの各Itemにアクセス
        for (i in 0 until menuView.childCount) {
            val itemView = menuView.getChildAt(i) as BottomNavigationItemView

            // smallLabel(非選択時のTextView)を取得し、文字サイズを変更
            itemView.findViewById<TextView>(R.id.smallLabel).apply {
                textSize = 10F
            }

            // largeLabel（選択時のTextView)を取得し、Paddingや文字サイズ等を変更
            itemView.findViewById<TextView>(R.id.largeLabel).apply {
                setPadding(0, 0, 0, 0)
                ellipsize = TextUtils.TruncateAt.END
                textSize = 10F
            }
        }
    } catch (e: Exception) {
        Logger.e(e.localizedMessage)
    }
}
```




## 参考
https://github.com/material-components/material-components-android/issues/139
https://github.com/material-components/material-components-android/blob/master/lib/java/com/google/android/material/bottomnavigation/res/layout/design_bottom_navigation_item.xml#L45
Optunaでrandomのseedを固定する方法

# はじめに
おしっこちびる便利さのOptunaですが、実行するたびに結果が変わるのがどうしても気持ち悪く、固定する方法を載せている記事が見当たらなかったので調べて書きました。

## code
[公式のチュートリアル](https://optuna.readthedocs.io/en/stable/tutorial/first.html)では、下記の通りになっております。

```python
def objective(trial):
    x = trial.suggest_uniform('x', -10, 10)
    return (x - 2) ** 2

study = optuna.create_study()
study.optimize(objective, n_trials=100)
```
この`study`をインスタンス化する部分(5行目)を、

```python
study = optuna.create_study(sampler=optuna.samplers.RandomSampler(seed=123))
```

このように書き換えると、無事seedが固定され結果が毎度同じになります。


[APIドキュメント](https://optuna.readthedocs.io/en/stable/index.html)


<br>
以上です。
ありがとうございました。