OmniAICreator/Qiita-1.07M huggingface dataset:
Power BI カスタムビジュアル開発 目次


<img src="https://msdnshared.blob.core.windows.net/media/2017/01/powerbi.png" width="300px" align="middle">

このシリーズでは、Power BI をより自分好みに変えましょうということで、カスタムビジュアルを開発してみます。
※この目次は随時更新予定です。お気に入りにでも入れておいてください。

情報元: [GitHub: PowerBI-visuals](https://github.com/Microsoft/powerbi-visuals) 他。

# カスタムビジュアルとは

Power BI で利用できるビジュアルには既定のものや、マーケットプレースで入手できるものなど様々ありますが、たまに「痒いところに手が届かない！」となります。そこで無いものは自分で作ってしまおうというのがカスタムビジュアルです。

# カスタムビジュアル開発入門

このセクションでは、順を追ってカスタムビジュアルが作れるようにしていきます。

[事前準備編](https://qiita.com/kenakamu/items/41ae97b59a47333fe40e)
[プロジェクトの理解とグラフの追加](https://qiita.com/kenakamu/items/76c4169657122aa7878e)
[インタラクションの追加](https://qiita.com/kenakamu/items/cf4acb91d8ea366bc45c)
[フィールド書式のカスタマイズ](https://qiita.com/kenakamu/items/6465e757c0d2e52183e0)
[ツールティップと多言語サポート](https://qiita.com/kenakamu/items/e20f8adac01976c03b5c)
[カスタムビジュアルのデバッグとパッケージ化](https://qiita.com/kenakamu/items/3284f480adc71ec80782)

# 高度なビジュアル開発のために capabilities.json を極める

このセクションでは、より高度な開発で必要となる情報を紹介します。

[Capabilities の 概要と DataRoles を詳しく見る](https://qiita.com/kenakamu/items/46ae6e419c49284c75ed)
[Capabilities の DataViewMappings を詳しく見る](https://qiita.com/kenakamu/items/32d83de4f525ecad4435)
[Capabilities の Objects を詳しく見る](https://qiita.com/kenakamu/items/3eaf0cb8ada9c3c41074)
[Capabilities の Sorting、SupportsHighlight、AdvancedEditModeSupport を詳しく見る](https://qiita.com/kenakamu/items/308b1d28ec97a21741b6)
[Capabilities の Drilldown を詳しく見る](https://qiita.com/kenakamu/items/69ac2f90a5b54d4fc6cb)

# カスタムビジュアル開発: 積み上げ棒グラフ

[プロジェクト作成とデータの定義](https://qiita.com/kenakamu/items/3d49de5736a665450602)
[グラフの描画](https://qiita.com/kenakamu/items/040d80f1bf8724b3c68d)
[X、Y 軸および凡例の描画](https://qiita.com/kenakamu/items/9d08502431187fae5796)
[動的な文字列長計算と書式設定](https://qiita.com/kenakamu/items/071662bc2a49afb9bd36)

# 各種ユーティリティの紹介
このセクションでは、カスタムビジュアル開発に便利なユーティリティの紹介をします。多くのサンプルでも利用されているため、サンプルを読むためのスキルとしても重要です。

[DataViewUtils で DataView の各種オブジェクトをパースする](https://qiita.com/kenakamu/items/915ef37c0f7f52828021)
[TypeUtils でカスタムビジュアルに重要なタイプをより簡単に扱う](https://qiita.com/kenakamu/items/2c013e4ac89e69db29a2)
[ColorUtils で色の管理をする](https://qiita.com/kenakamu/items/4820c7eb105de146cd30)
[TooltipUtils でツールティップを活用する](https://qiita.com/kenakamu/items/a5e8aa9abb2fb110824c)
[InteractivityUtils でビジュアルのクロス選択とクロスフィルターを実施する](https://qiita.com/kenakamu/items/5120204e9b0af1cc8cae)
[ChartUtils でチャートや凡例、ラベルを描写する](https://qiita.com/kenakamu/items/acd3a0855ac0652ea4d6)
[FormattingUtils で値をフォーマットする](https://qiita.com/kenakamu/items/015e2533c85312f2e8b8)
[SVGUtils で SVG を扱う](https://qiita.com/kenakamu/items/e57960912a0bc9812331)
[TestUtils でユニットテストを行う - その 1 環境構築](https://qiita.com/kenakamu/items/7a5d6319acbc86dc39ce)
[TestUtils でユニットテストを行う - その 2 テストコードの詳細](https://qiita.com/kenakamu/items/07863b51e8f131165307)

# 参考
[v3 へのアップグレードで参考になるサンプル](https://github.com/microsoft/powerbi-visuals-mekkochart)
[Power BI](https://powerbi.microsoft.com/ja-jp/)
[GitHub:PowerBI-visuals](https://github.com/Microsoft/PowerBI-visuals)
[Power BI Custom Visual Development Fundamentals (英語動画)](https://www.youtube.com/watch?v=fMDxGopxpjs&list=PL6z9i4iVbl8C2mtjFlH3ECb3q00eFDLAG)
USB-PD対応シガーアダプタ GOPPA E10301A1CWHTレビュー

9V2A急速充電デバイスの配備に備えて，クルマ用の充電器を探してみたところ，唯一この製品がヒットしました．

<TABLE ALIGN=CENTER>
  <TR>
    <TD>
      <A HREF="https://www.yodobashi.com/product/100000001003783798/" TARGET="_blank"><strong>GOPPA E10301A1CWHT [USB PD正規認証品 TYPE-C＋TYPE-A シガーアダプタ 30W(ホワイト) 90cm 認証品 ケーブルSET]</strong></a>
      <br>
      www.yodobashicamera.com
    </TD>
    <TD>
      <IMG STYLE="float:left;margin-right:.5em;" src="http://capture.heartrails.com/200x200/cool?https://www.yodobashi.com/product/100000001003783798/" ALT=""  />
    </TD>
  </TR>
</TABLE>

# 開封の儀

ヨドバシで速攻買ったのでレビューします．

- 外箱はこんな感じで，質感もいい感じです．
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3130383831322f36313434373166312d323337652d326635622d613433612d3530626165386234306161652e6a706567.jpg](https://qiita-image-store.s3.amazonaws.com/0/108812/d105cc09-b899-f9ca-8829-f6e3dbc8a4d3.jpeg)
<br />

- サポートはIO DATAのようです
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3130383831322f39653836623633322d353866392d373234632d643130322d3362366138356538336164642e6a706567.jpg](https://qiita-image-store.s3.amazonaws.com/0/108812/a8b6a871-66bd-19c7-29be-a4b2f2627783.jpeg)
<br />

- 90cmのUSB-C to USB-Cのケーブルが付属します
![IMG_20180603_093816.jpg](https://qiita-image-store.s3.amazonaws.com/0/108812/78cf8e2e-3a02-b161-3e8e-86c180018698.jpeg)
<br />

- 今回私が購入したモデルはUSB-C + USB-Aの2口モデルです
![IMG_20180603_093838.jpg](https://qiita-image-store.s3.amazonaws.com/0/108812/e1c3ec7a-ab3f-b673-976d-96f8ff96c230.jpeg)

# 使ってみて
MPV LY3Pのシガーソケットに3口のアダプタを噛まして本製品を取り付けました．
9V2A急速充電に対応しているHuawei Mate10をつないだところ，問題なく「急速充電」状態となってくれました．
4,000円超えとちとお値段張りますが，作りもしっかりしていて，充電もちゃんとできているので，対応デバイスをお持ちの方にはいいんじゃないでしょうか．

# このあとは…
USB-PD対応のノートパソコンであるThinkPad X1 Carbon 2017でも充電できるか確認予定です．
GitBash(mingw)の色変更

自分の環境を少しでも使いやすくするためのメモです。

今の作業場所ではWindows7を使っているので、GitBashを入れました。使いづらいところもあるから、少し手を入れましたが、また今度別のマシンを使うかもしれないし、忘れそうなので一応メモしておきます。

何もしていない前に、lsコマンドを打つと、こんな状態

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186671/92ff4228-b340-1d17-f257-a2262e74ad5c.png)

こんな黒い背景に青い文字が見れるものか？少なくても私には無理ですね。

早速探してみたら、[この記事](http://oki2a24.com/2018/01/14/set-git-bash-color-theme-to-solarized/)発見,記事通りやって見れば、今度は


![image.png](https://qiita-image-store.s3.amazonaws.com/0/186671/ab504122-bf56-b589-1262-ed0999c4d195.png)

変更する前よりも見づらくない？また探そう、今度は[これ](http://orangeclover.hatenablog.com/entry/20120922/1348261855)が見つかりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186671/4d05b82f-414b-110a-098a-0f04770f1a6b.png)

うん、やっとフォルダが見えるようになりました。もちろんもっと色を調整してもいいのですが、今のところはこれぐらいしておきましょう。
Python。logistic regression

Pythonでlogistic regressionをやりたかったが、つまづく。
欠損値があるとエラーがかえってきてしまう。参考サイトをメモ。


参考サイトは以下。美しいページ。
http://www.tsjshg.info/udemy/Lec76-79.html

欠損について。
https://noumenon-th.net/programming/2016/04/27/logisticregression/

欠損補完はSklearnでもできるみたい。
https://qiita.com/klis/items/5061b1717b5205fa43c1

欠損値の補完、pandas
http://otoha0510.hatenablog.com/entry/2017/11/04/000213
https://note.nkmk.me/python-pandas-nan-dropna-fillna/
Flutterでダイアログを閉じる


## ダイアログを閉じる方法

```dart
Navigator.pop(context);
```

で閉じれます。


## サンプル


```dart
            var alert = new AlertDialog(
              title: new Text("グループを作成する"),
              actions: <Widget>[
                new FlatButton(onPressed: () {
                  Navigator.pop(context);
                  return Navigator.pushNamed(context, "/create_group");
                }, child: new Text("作成する")),
              ],
            );
            showDialog(
                context: context,
                builder: (BuildContext context) {
                  return alert;
                });
```

このパターンだと「作成する」ボタンをタップしたときに画面遷移して戻って来たときにはダイアログは閉じられているようになります。
[Rails→fog→CarrierWave→AWS S3] bundle installでコケた話


## 経緯
fogを使ってawsに画像をUploadしようとしたらコケた。
調べたらCarrierWaveの公式に書かれていたが、覚書としてまとめておく。
https://github.com/carrierwaveuploader/carrierwave#using-amazon-s3

## TL;DR
Ralisでfog、CarrierWave経由でAWS-S3に画像をアップロードさせる場合は、`fog`ではなく`fog-aws`を使う。
これに伴い設定に一行追加する。

## 詳細

```ruby:gemfile
gem 'fog-aws'
# gem 'fog'はいらない
```
```ruby:Carrierwave.rb
CarrierWave.configure do |config|
  config.storage :fog
  config.fog_provider = 'fog/aws' # 追加
  config.fog_credentials = {
    provider: 'AWS',
    aws_access_key_id: Rails.application.secrets.aws_access_key_id,
    aws_secret_access_key: Rails.application.secrets.aws_secret_access_key,
    region: '任意の値'
  }

  config.fog_directory  = '任意の値'
  config.asset_host = '任意の値'
  end

end
```
Firebase Dynamic LinksをGASで実装する

GoogleのURL短縮サービスが終了することを受けて、Firebase Dynamic Linksに差し替えることにしました。
https://goo.gl/

具体的には、こちらで実装したものをFirebase Dynamic Linksで置き換えます。
[GASから短縮URL付きで自動ツイートする](https://qiita.com/mkosuke/items/2b4c8ad171344acb778b)


先に最終的なコードを紹介しておきます。

```js
API_KEY = 'xxxxxxxxxxxx';
DOMAIN = 'XXXX.app.goo.gl;
ANDROID_PACKAGE = 'com.hoge.xxxx;
IOS_BUNDLE_ID = 'com.hoge.xxxx;

function urlShortener(url) {
  var apiUrl  = 'https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key='+API_KEY;
  var payload = { dynamicLinkInfo: {
    dynamicLinkDomain: DOMAIN,
    link: url,
    androidInfo: {
      androidPackageName: ANDROID_PACKAGE,
      androidFallbackLink: XXXX,
      androidMinPackageVersionCode: '10',
      androidLink: XXXXX
    },
    iosInfo: {
     iosBundleId: IOS_BUNDLE_ID,
     iosFallbackLink: XXXX,
     iosCustomScheme: XXXX,
     iosIpadFallbackLink: XXXX,
     iosIpadBundleId: XXXX,
     iosAppStoreId: XXXX
    }
  }};

  var options = {
        method: 'POST',
        contentType: 'application/json',
        payload: JSON.stringify(payload),
        muteHttpExceptions: true
      }
  var response = UrlFetchApp.fetch(apiUrl, options);
  if (response.getResponseCode() !== 200) {
    throw new Error('cannot shorten url.');
  } else {
    return JSON.parse(response).shortLink;
  }
}
```

[公式ドキュメントはこちら](https://firebase.google.com/docs/reference/dynamic-links/link-shortener)
以下で各パラメータを解説していきます。

### API KEY
API_KEYは以下の手順で作成できます。
https://console.cloud.google.com/apis/credentials
「認証情報」タブ＞「認証情報を作成」ボタン＞「APIキー」から作成
作成済みの場合は認証情報タブにAPIキーとして記載されていると思います。

### Dynamic Link Domain
DOMAINはconsoleを開くと下記のようにDynamic Link Domainが表示されているので、これを指定してください。（コードにはhttps://以降を記載してください。）
![スクリーンショット 2018-06-04 13.42.07.png](https://qiita-image-store.s3.amazonaws.com/0/202533/d340092d-2a02-f251-90ea-234d0daf893f.png)

### androidPackageName / androidLink
AndroidのDeep Linkで使用するパラメータです。packageNameは、アプリを持っていない場合にストアのリンクへ遷移させるためにも使用されます。

### iosBundleId / iosCustomScheme
iOSのDeep Linkで使用するパラメータです

### iosAppStoreId
iosアプリを持っていない場合、ストアに遷移させる際に使用されるIDです。

### android/ios/iosIpadFallbackLink
アプリがinstallされていなかった場合のランディングページを指定します。普通はストアページで問題ないと思いますが、アプリ専用のページにランディングさせたい場合はこちらを指定すると、アプリ非インストール時にこちらに遷移します。

### androidMinPackageVersionCode
バージョンで挙動を振り分けたい場合はこちらを指定します。OSではなく、アプリバージョンとなります。


## 返却値
GASから投げると以下のような返却値が得られます。
基本的にはshortLinkをそのまま短縮URLとして使えば問題ありません。
注意点としては、既存のGoogle短縮URLよりは長くなってしまいますが、その分DeepLinkなどできることは増えています。

```json
{
  "shortLink": "https://(ドメイン名)/(短縮URL)",
  "previewLink": "https://(ドメイン名)/(短縮URL)?d=1"
}
```

また、previewLinkを開くとこのような絵がみれます。
<img width="774" alt="スクリーンショット 2018-06-04 13.51.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/202533/8a8108d7-6f01-854b-20d9-8e163d654e35.png">
ユーザの条件に応じてどのリンクが開かれるのかなどが視覚的に見えるので便利そうです。Firebase Dynamic Linksの後ろに`?d=1`を付与することでリンクでもpreviewLinkを確認することができます。
AndroidがAppVersionで分岐しているのは、GAS上で`androidMinPackageVersionCode: 10` と指定したためです。
MIPS-32のレジスタ一覧

#レジスタ一覧
|名前|番号|用途|
|---|---|---|
|zero|$0|常に0で書き込み不可|
|at|$1|擬似命令に使用(ex.Move命令)|
|v0~v1|\$2~$3|手続き戻り値用|
|a0`~`a3|\$4~$7|手続き引数用|
|t0`~`t7|\$8~$15|一時変数|
|s0`~`s7|\$16~$23|待避用変数|
|t8`~`t9|\$24~$25|一時変数|
|k0`~`k1|\$26~$27|os用|
|gp|$28|グローバルポインタ|
|sp|$29|スタックポインタ|
|fp|$30|フレームポインタ|
|ra|$31|戻りアドレス用|

#MIPS-32のレジスタについてメモ
- MIPS-32のレジスタは上の表の通り、32本用意されており、全て32bit幅である
- raレジスタは関数呼び出し時に戻り先のアドレスが自動的に入れられる
- MIPSでは演算の対象となるデータはレジスタに収めなければならない。必要となるデータがある時はその度にメモリからロードしてくる。(だいたいriscはそう)
- 遅延スロットがあり関数のreturn直後に注意





#参考
[コンピュータの構成と設計 第5版 上](https://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AE%E6%A7%8B%E6%88%90%E3%81%A8%E8%A8%AD%E8%A8%88-%E7%AC%AC5%E7%89%88-%E4%B8%8A-%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%BBL-%E3%83%98%E3%83%8D%E3%82%B7%E3%83%BC/dp/4822298426/ref=sr_1_1?ie=UTF8&qid=1528085619&sr=8-1&keywords=%E3%83%91%E3%82%BF%E3%83%98%E3%83%8D)
aws-cli 1.14.28 で ImportError: No module named history

## aws-cli 1.14.28 で ImportError: No module named history

CentOSを7.5にアップデートした際、aws-cliのバージョンが変わり、
ImportError: No module named historyが出るようになってしまいました。

CentOSのリリースノートには、既知の問題としてこのような注意が追加されています。

~~~
AWSユーザーは、更新する前に問題に注意する必要があります。RHEL-7.5にawscliのバージョンが追加されました。
これは、現在EPELで利用可能なバージョンからのアップグレードです。
それは、python-s3transferの前提条件を持っています。
ここで、EPELコピーにはpython2-s3transferが必要です。
python2-s3transferを削除せずにawscliを更新し、python-s3transferをインストールすると、awscliはスタックトレースで終了します。
yum swap python2-s3transfer python-s3transferを使って2つのパッケージを交換し、ベースリポジトリからawscliを実行することができます。
~~~

現時点での対処法がCentOSのコミュニティで出ていましたので記載します。
https://www.centos.org/forums/viewtopic.php?t=67020

### 発生環境
CentOS 7.5.1804
aws-cli/1.14.28 Python/2.7.5 Linux/3.10.0-862.2.3.el7.x86_64 botocore/1.8.35

### 事象
aws-cliをアップデート後、aws --versionなどで、ImportError: No module named historyが出力される。

### 対処法

python2-s3transferを削除してpython-s3transferに変更する。

~~~
yum swap python2-s3transfer python-s3transfer
~~~

python2-s3transferｎの依存でインストールされたEPELリポジトリの依存関係を削除する。

~~~
yum remove python2-botocore python2-futures python2-jmespath
~~~

追記：python-s3transfer-0.1.10-8.el7.noarchでは以下の対応が必要でしたが、python-s3transfer-0.1.10-8.el8.noarchからは対応されています

~~s3へのアップロードなどを行わないなら、ここまででaws --versionが実行できれば完了です。~~

~~s3へのアップロードも行う場合、python-s3transferで必要なバージョンが0.1.12ですが、現時点でCentOSは0.1.10が入る為、
手動でパッチを当ててあげなければいけません。
以下のパッチを当ててあげてください。
https://bugzilla.redhat.com/show_bug.cgi?id=1578083t~~
【codility】Lesson 3: Time Complexity FrogJmp

#subject
X:現在地, Y:目的地, D:ジャンプ幅としたときに、XからYまで同距離もしくはそれ以上の距離になるのは、ジャンプを何回したときか。
例）
`X=10, Y = 85, D = 30`と与えられた場合は、`3`を返す。
`X + D*3 => 85`となるためである。
#submit
一発score100!とても気持ち良い。
![L03_frogJmp.png](https://qiita-image-store.s3.amazonaws.com/0/237869/9e98551d-ea5b-800d-dcd1-9bbe4fc6da33.png)
#program
**point:割り算の商と余りが出せる「div」を使ってみた**
余りを出すには「%」を使えばよいけれど、今回は商も重要だったので良い方法がないか探してみたら、<stdlib.h>の中にあるdivが使えることが分かった。とっても便利。

```c++:frogJmp.cpp
#include<iostream>
#include <stdlib.h>
using namespace std;

int solution(int X, int Y, int D) {
	div_t times = div(Y-X, D);
	if (times.rem != 0)
		return (times.quot + 1);
	return times.quot;
}
```
MacにおけるRoBoHoNへのapkインストール方法覚書

MacにおけるRoBoHoNへのrelease版apkインストール方法覚書です。
（ロボホンではなくタブレットにapkをインストールしたいならapkをタブレットの内部ストレージに配置したあと、ファイルマネージャでapkをタップしてインストールする方が手っ取り早いです、と念のため）

#前提条件
・MacにAndroidStudioがインストールされていること
・転送用のUSBケーブルがあること

# RoBoHoNへのapkインストール方法
## RoBoHoN側準備
※AndroidStudioにて開発/デバッグ実行しているRoBoHoNは以下の手続きはすでに実行済み（なはず）の為不要です。
①MacとRoBoHoNをUSBケーブルで接続します。
②ロボホン背面メニューの「設定」アイコンをタップして設定画面を起動します。
③「その他」→「開発者オプション」を表示し、開発者オプションをONにします。
④「USBデバッグ」にチェックを入れ、USBデバッグの許可に関する手続きを行います。

以上です。
RoBoHoNの通知バーのところを確認して、「MTPモードで接続」状態になっていたら、処理が完了しています。

##bash_profileにSDKのパスを通す
①ターミナルを起動し、以下を入力しエンター。
`vi ~/.bash_profile`
②ターミナル下部に`[O]pen Read-Only, [E]dit anyway, 〜〜〜`と表示されたら、<b>[E]キー</b>を入力する。
③<b>[i]キー</b>または<b>[a]キー</b>を押して入力モードに入る。
④「export PATH=」の部分に以下を入力する。
`export PATH=$PATH:/Users/(ユーザ名)/Library/Android/sdk/platform-tools`
⑤<b>[esc]キー</B>で入力モードを抜け、<b>「:wq」</b>を入力してエンター。保存してターミナルに戻る。
⑥ターミナルに以下を入力してエンター。
`source ~/.bash_profile`

以上です。
ターミナル上でadbと入力してエンターを押したとき、説明が出てきたら手順が完了しているかと思います。

##apkファイルのインストール
①MacとRoBoHoNをUSBケーブルで接続します。
②Macのターミナルで、以下のコマンドを入力してエンターを押します。
apkファイルの欄は、apkファイルまでのパスを入力します。
(「cd　~~」コマンドでファイルのある場所まで移動して実行しても大丈夫です。)
`adb install (apkファイル名).apk`

以上です。
Successが表示されたらインストールが完了します。


# apk作成方法
以下手順は「Keystore」が存在しない前提の手順になります。
①AndroidStudioのメニューバーから「Build」→「Generate Sined APK...」を選択する。
②Module:は「apk」（デフォルト状態）のまま「Next」ボタンを押す。
③「Create new...」ボタンを押す。
④「Key store path」に、キーストアを配置するフォルダとパスを入力する。
（「/Users/（ユーザー名）/（アプリ名）/keystore/（キーストア名）.jks」など）
⑤「Key store path」の直ぐ下の、「Password」欄にパスワードを入力し、「Confirm」欄に再度同じパスワードを入力する。
⑥「Key」項目内、「Alias」の下の「Password」欄にパスワードを入力し、「Confirm」欄に再度同じパスワードを入力する。
⑦「First and Last Name」に名前を入力する。
⑧「OK」ボタンを押し、もとの画面に戻る。
⑨先程作成したKeystoreの、Key store password、Key alias、Key passwordをそれぞれ入力する。
⑩「Next」ボタンを押す。
⑪appを作成するフォルダを選択し、build typeを「release」に設定する。
⑫Sigature Versionsの「V1」※にチェックを入れ、「Finish」ボタンを押す。
以上です。
成功していれば⑪にて設定したフォルダに、apkが作成されています。
※Android7以降の端末は「V2」にもチェック推奨のようです。

#参照リンク
[MacターミナルからAPKファイルをAndroidの実機端末にインストール](http://blog.a1yama.com/entry/2016/02/02/170449)
【codility】Lesson 3: Time Complexity PermMissingElem

#subject
Lesson 3: Time Complexity PermMissingElem
N個の異なる整数配列が渡されたとき、抜けている番号を返す問題。
例）
配列が、`A = {2,3,1,5}`であった場合は、 `4`を返す。

#submit
1回でscore100にいけなかった。
・コーナーケースを考えることが必要
　・配列が空であった時のケース
　・一番最後の数字が抜けているケースなど

![L03_PermMissionElem.png](https://qiita-image-store.s3.amazonaws.com/0/237869/364a2449-20a4-8b58-3c0a-70f74e84e631.png)

#program
**point:1~N+1までの和と、配列Aの中の要素の和を引いて求める**
1～N+1までのすべての数字は必ず1回現れるので、1つ1つの数字を比較するのではなく、差分を見ることで足りない数字を導き出した。
最初は1つ1つ比較しようとしてたが、Lesson2での教訓から少し視点を変えて考えることができた。

```cpp:permMissingElem.cpp

#include<iostream>
#include<vector>
using namespace std;

int solution(vector<int> &A) {
	int sum = 0;
	int totalSum = 0;
	int A_length = (int)A.size();
    if(!A.empty()){
    	for (int i = 0; i < A_length; ++i) {
    		sum = sum + A[i];
    		totalSum += i + 1;
    	}
    	totalSum += A_length+1;
    	return (totalSum - sum);
    }
    return 1;
}
```
Dockerコンテナ内のJVMをVisualVMでプロファイリングするための設定


### コンテナのJMX接続用portを開ける

docker-compose.ymlの一部

```
ports:
  - '9010:9010'
```

### JVM起動オプションを指定する

重要なのはDjava, Dcom.*のオプション

```
java -jar  -Djava.rmi.server.hostname=0.0.0.0 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 target/scala-2.12/api-assembly-1.0.jar &
```

### VisualVMのUIから接続情報を追加

Add JMX Connectionで追加
`localhost:9010`

これでCPUとかThreadとか確認できるようになる
Javaでテキストをアスキーアートで表示する (jfiglet)


# jfiglet
簡単にテキストをアスキーアートに変換してくれる。
github : https://github.com/lalyos/jfiglet

```
  _   _          _   _         
 | | | |   ___  | | | |   ___  
 | |_| |  / _ \ | | | |  / _ \ 
 |  _  | |  __/ | | | | | (_) |
 |_| |_|  \___| |_| |_|  \___/ 
                               
```

## maven
```
<dependency>
	<groupId>com.github.lalyos</groupId>
	<artifactId>jfiglet</artifactId>
	<version>0.0.8</version>
</dependency>
```

## 使い方
```
String asciiArt= FigletFont.convertOneLine("Hello");
System.out.println(asciiArt);
```

## 出力
```
  _   _          _   _         
 | | | |   ___  | | | |   ___  
 | |_| |  / _ \ | | | |  / _ \ 
 |  _  | |  __/ | | | | | (_) |
 |_| |_|  \___| |_| |_|  \___/ 
                               
```
HTML5.2のdl要素について誤解していたこと

`<dl>`要素の新しい定義と配置のルールについて誤解していた点があったので備忘録として書きます。
`<dl>`要素は2014年10月28日のHTML5.0勧告でその定義が、2017年12月14日にW3C勧告となったHTML5.2でその配置のルールが[変わりました](https://www.w3.org/TR/html52/changes.html)。
## `<dl>`要素の定義変更について
<dl>
<dt>HTML4までの&lt;dl&gt;要素の定義</dt>
<dd>definition list</dd>
<dd>日本語訳: 定義リスト</dd>
<dt>HTML5からの&lt;dl&gt;要素の定義</dt>
<dd>term-description groups (W3C) / Name-value groups (WHATWG)</dd>
<dd>日本語訳: 説明リスト(MDN)</dd>
</dl>
「説明リスト」ってなんだよみたいな。
よくわからないので原文を見ます。
W3CとWHATWGの説明をそれぞれ翻訳すると、**呼称=説明が対になったグループ**、**名前=値が対になったグループ**となります。直訳するとなんとなく理解できますね。

## 配置のルールに注意
### `<dl>`要素直下に入れられる要素について

- × `<dl>`要素直下に入れられる要素は`<dt>`要素`<dd>`要素だけ
- ◯  `<dl>`要素直下に入れられる要素は`<dt>`要素`<dd>`要素と`<div>`要素

HTML5.2では`<dl>`要素直下での`<div>`要素の使用が許容されました。

### 「`<div>`要素が許容される」の意味

- × `<dt>`要素、`<dd>`要素は今後`<div>`要素で囲めばよく、`<dl>`要素で囲む必要はない
- ◯ `<dt>`要素、`<dd>`要素は`<div>`要素でグルーピングすることが許容されたが、あくまでも`<dl>`要素で囲む必要がある

`<dl>`要素直下での`<div>`要素の使用が許容されたとはいえ、`<div>`要素はグルーピング目的に限られ、`<dl>`要素を代替できるようになったわけではありません。




```html:これはOK!
<dl>
  <div>
    <dt>Name</dt>
    <dd>Ohtani</dd>
  </div>
  <div>
    <dt>Born</dt>
    <dd>1994</dd>
  </div>
  <div>
    <dt>Birthplace</dt>
    <dd>Iwate</dd>
  </div>
</dl>
```

```html:これはNG
<div>
  <dt>Name</dt>
  <dd>Ohtani</dd>
</div>
```
```html:これもNG
<dl>
  <div>Name</div>
  <dd>Ohtani</dd>
</dl>
```

というわけで、さようなら定義リスト。こんにちは説明リスト。
この呼称まだモヤモヤする。

## 参考
- [4.4.9. The dl element - HTML 5.2
W3C Recommendation, 14 December 2017](https://www.w3.org/TR/html52/grouping-content.html#the-dl-element)
- [4.4.9 The dl element - HTML
Living Standard](https://html.spec.whatwg.org/multipage/grouping-content.html#the-dl-element)
- [説明リスト要素 -MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/dl)
- [僕らが定義リストと呼んでいたモノについて -ABROLLER.TECH](https://abroller.tech/2017/11/18/bokuraga-dl/)
Windows10 で WSL を（割とかっこよく）使う方法

# Windows 10 で WSL を（割とかっこよく）使う方法

## 前提や使用するソフトウェア等

- Windows10 Version 1709 以降
- cmder (Terminal)

## 準備

1. WSL (Windows Subsystem for Linux) を有効にする

    1. Windowsの機能の有効化または無効化 をクリック ![2018-06-04 (1).png](https://qiita-image-store.s3.amazonaws.com/0/112497/b9064c21-ef75-6c8b-ac9e-b71fe53dcdbe.png)
    2. Windows Subsystem for Linux の チェックボックスを オン ![2018-06-04 (2).png](https://qiita-image-store.s3.amazonaws.com/0/112497/d9b91e78-60e6-532a-c1a1-71c5ded6eebb.png)

## 導入

### ubuntu のインストール

1. Windows ストアから ubuntu をインストール ![2018-06-04 (3).png](https://qiita-image-store.s3.amazonaws.com/0/112497/8ee29f4f-82aa-7578-2a32-86fce893c0ac.png) _メモ： ubuntu 18.04 をインストールしたら yum upgrade でエラー出てよくわからなかったのでこちらにしておきました_

2. ubuntu を起動して初期設定をする
_メモ： Windowsのユーザー名と違ってても問題ないです。パスワードは忘れたりしないように。_

3. ubuntu をアップデートする

```bash

sudo apt update && sudo apt upgrade -y
```

### cmder の設定

1. cmder-mini をダウンロード、展開
[cmder]http://cmder.net/
メモ：Fullにしちゃうとgitとか付いて来るので。gitは今回導入するubuntuの中のものを使います

2. フォントなどの外観を変更（お好みで）
*メモ：割とかっこよく使うために必要な措置です*

3. スタートアップの変更 
Choose your startup task or ... のところを **WSL::bash** にします
![2018-06-04 (4).png](https://qiita-image-store.s3.amazonaws.com/0/112497/7381e008-9b5b-1943-462a-0eab4eb92884.png)

4. cmderを再起動

以上です。
golang mysql driverで `this user requires mysql native password authentication.`

`v1.4.0` のリリースでmysql8対応などなどで変わったよう。
https://github.com/go-sql-driver/mysql/blob/master/CHANGELOG.md
https://github.com/go-sql-driver/mysql/pull/644/files

`AllowNativePasswords`を`true`にしたらつながります。

```golang
	c := mysql.Config{
		Addr:                 "localhost:3306",
		Net:                  "tcp",
		User:                 "xxxxx",
		DBName:               "yyyyy",
		ParseTime:            true,
		AllowNativePasswords: true, # <- これ
	}
	log.Println(c.FormatDSN())
```
RubyKaigi 2018でLuaJITとmrubyについて発表してきた

とりあえず資料です:
https://speakerdeck.com/takecheeze/luajit-as-a-ruby-backend

<script async class="speakerdeck-embed" data-id="628dfabc5bd841bebc73421e5af6073d" data-ratio="1.33333333333333" src="//speakerdeck.com/assets/embed.js"></script>

[発表のページ](http://rubykaigi.org/2018/presentations/take-cheeze.html#jun02)にもそのうち色々上がるのではないかと思います。今回は資料をGoogle Docsで作ったのでコメントとかあれば[コメント可能な共有リンク](https://docs.google.com/presentation/d/18E52IoucOgZJedT02WhapJrS6aCE5_Lg3xGUTtA6ZkU/edit?usp=sharing)を作ったのでなんかツッコミとかあればどうぞ。

## 感想とか
若干小学生っぽいポエミーな感じではありますが、感想をいくつか書こうかと思います。
まずは行く前とかについてで、あんまりにもトピックとしては異端なかなーと思ってCFP書いたんですが、他のmrubyちゃんとやってるCFPを押しのけてこいつが通ってしまったので、なかなか苦労しつつ資料を作っていました。

本当はもっと実装をガリガリ作りたかったのですが、CFP通ったあとの時間の制約とかで、コードを読んだ読書感想文とか自由研究っぽくて発表の本番が近づくほど、夏休みの終わりみたいな気分を味わっていました。

他の人の発表を見ていると、技術として習得できる部分は積極的に盗みたいなと思いました。決して全部できるわけじゃないし時間の制約もありますが、発表について感想もらう度に恥ずかしがりつつ嬉しかったのでもっとできることがあるならできるようにしていきたいです。

ちょいちょいRubyのネタは入れたんですが比重として、LuaJITが高くなってしまっているので、RubyKaigiの懐の深さを感じました。

## 内容とか
発表で全部言うべきだと思うのであんまり触れないほうがいい ~~（書くのめんどくさい）~~ ので特にないです。資料とか発表でわかりづらいところあったらなるべく回答させてもらいます。

## 謝辞
まず、RubyKaigiに行くにあたって、諸々支援をしてくださった[会社](https://fusic.co.jp/)に感謝です。
遠征になるとそれなりに費用がかかるので、与えてもらえるものに感謝を忘れてはいけないなーと遠征させてもらう度に思います。ありがとうございました。今回は、一個枠をもらって発表させてもらうとのことで、弊社の広報担当に[ブログ記事](https://fusic.co.jp/news/382)を書いてもらったりと去年行ったときにはなかったことをしてもらいました。

運営スタッフの方々にも、発表だったり会場でだったりでお世話になりました。ありがとうございました。

最後に発表を聞きに来てくださった方々ありがとうございました。
autoprefixer 基本


## 概要

* 対象ブラウザを設定しておくと、必要/不要なベンダープリフィックスを付加/削除してくれる
* CSSを処理。Sassを使う場合は変換後に使用
* [PostCSS](https://github.com/postcss) の一機能として動作


## 導入

gulp で Sass と併用するサンプル

### インストール

`npm install gulp gulp-sass gulp-postcss autoprefixer --save-dev`

### gulp

```gulpfile.babel.js
import gulp from 'gulp';
import sass from 'gulp-sass';
import postcss from 'gulp-postcss';
import autoprefixer from 'autoprefixer';
// import cssMqpacker from 'css-mqpacker'; // Post-css の他パッケージを使う場合

const paths = {
  css: {
    src: '/src/style.scss', // ソースファイル
    dest: '../' // 出力ファイル
  }
};

export function css() {
  return gulp.src(paths.css.src)
    .pipe(sass({outputStyle: 'compressed'}))
    .pipe(postcss([
      autoprefixer({ grid: true }), // CSS-Grid を使うなら
      // cssMqpacker() // PostCSS の他の処理があれば追記
    ]))
    .pipe(gulp.dest(paths.css.dest));
}
css.description = '変換：SCSS → CSS'; // npx gulp --tasks で注釈を表示
```



### 対象ブラウザの設定

.browserslistrc、または package.json に記述する。
(対象ブラウザの抽出は Browserslist で実装されている)

gulpfile.babel.js と同じ場所に .browserslistrc を作成し、対象ブラウザを書く。
書き方は [browserslist/browserslist](https://github.com/browserslist/browserslist) を参照。

```.browserslistrc
> 0.5% in JP
Firefox ESR
```

[browserl.ist](http://browserl.ist/) でテストでき、記述に対して該当するプラウザの一覧をチェックできる。
![browserlist](https://docs.google.com/drawings/d/e/2PACX-1vSkclxPUT04WOEjwqkh7iPJ1X-i9lWlzP_nhlEeRkF1O4VwiOlNzlMLS_VEFZVterS0d6Oq4kZpRQ1A/pub?w=960&h=720)

 .browserslistrc の編集。なければ作成する。  
autoprefixer 等を使っていれば、すでにあるはず。
[browserl.ist](http://browserl.ist/) でチェックできる

```.browserslistrc
> 0.5% in JP
Firefox ESR
```

ちなみに上の設定だと、以下のブラウザをサポート。
日本で 94.43% をカバーしている。

* Chrome6725.38%
* Chrome6613.68%
* Chrome490.41%
* Edge170.55%
* Edge160.27%
* Firefox602.62%
* IE110.63%
* Safari11.10.77%
* Safari10.10.11%
* Firefox603.24%
* Firefox52
* Chrome for Android6737.51% (以下モバイル)
* Android Browser4.40.75%
* iOS Safari11.3-11.43.92%
* iOS Safari11.0-11.20.93%
* iOS Safari10.30.41%
* iOS Safari10.0-10.20.18%
* iOS Safari9.3


## Tips

### チェック

`npx autoprefixer --info`
現在の設定での対象ブラウザやプロパティ等を表示

### IE を CSS-Grid に対応させたい場合

デフォルトではオフになっているので有効化する
`autoprefixer({ grid: true })`

grid-gap も対応してくれ、位置設定も適切に変換してくれる grid-template-areas で書くのが良さげ。
参考：[CSS Grid Layout Module（IE対応) | CodeCode](https://codecodeweb.com/blog/365)

### 特定の箇所には autoprefixer を通したくない場合

* `/* autoprefixer: off */` で、次のブロックが無視される  
  Sass との併用時は、'compressed' にしている時に Sassがコメントを消さないよう `/*! autoprefixer: off */` とエクスクラメーションマークを付けとくと良い
* `/* autoprefixer: ignore next */` で、次の行が無視される


## 参考記事

* [autoprefixer - npm](https://www.npmjs.com/package/autoprefixer)
* [browserslist/browserslist: 🦔 Share target browsers between different front-end tools, like Autoprefixer, Stylelint and babel-preset-env](https://github.com/browserslist/browserslist)
* [CSS Grid Layout Module（IE対応) | CodeCode](https://codecodeweb.com/blog/365)
Google Apps Scriptでグラフを操作するときは、Google Chartsを調べればよい / 一部系列を右側にし2軸グラフ(Y軸2つ)にする

# 結論

* GASの(日本語)検索はノイズがキツめ
* チャート操作は実質Chart APIのラッパー
* なのでGoogle Chartとしてやりたいことを調べ、GASの書き方に変換してやると目的を達成しやすかった。

[Charts  |  Google Developers](https://developers.google.com/chart/)

***

3つ目のデータ列を右軸にする場合は

```js
  var chart = logSheet.newChart().addRange(range)
  .setOption("series", {
//             0: {targetAxisIndex:0}, // 第1系列は左のY軸を使用
             2: {targetAxisIndex:1}, // 第3系列は右のY軸を使用
         })
```

と`series`オプションを操作してやる

# やりたかったこと

1. 4桁の数字と2桁の数字をまとめて一つのグラフにしたかった。
2. スケールが一つだと4桁の方に合わせられ、2桁のグラフが低空飛行になり分かりづらい。
3. 低スケールの右軸を新設して少ないほうはそちらでグラフ化したい。

実現方法は結論の通り。

before

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62354/991576ff-65e3-72f5-5f1e-886851530295.png)


after(投稿数も右にした)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62354/e6a59e9d-d776-d977-711c-4aafd663961b.png)


# 参考

* [Google Chartsを使って，2つのy軸にプロットする - Qiita](https://qiita.com/aion/items/8c5b536ce64e89d0af28)  
  ドンピシャ
* [GAS（Google Apps Script）でグラフ（Google Chart Toolsで）をメールに埋め込んで送信する - Qiita](https://qiita.com/Humangas/items/e4c82e712963647ffcc7)  

>GASからグラフ（Chart）を触れるAPIはありますが、APIリファレンスによると、実際にはGASから「Google Chart Tools」を利用しているみたいです。

* [グラフ｜Google Apps Script入門](https://excel-ubara.com/apps_script1/GAS032.html)  

>setOption(option,value) 	このグラフの詳細オプションを設定します。
optionは、
チャートAPIのグラフギャラリーの利用可能なオプションのリストです。
DebianでVNCの解像度変更

#Before
XもしくはVNCのサーバ起動時にCUIで設定するもんだと思ってました。

# 解決策
KDEなら、左下のKアイコンをクリック、System Settingを選択

HardwareにDisplay and Monitorが有るので選択

Displaysの下の方に、Resolutionがあって、そこで変更できた。
Softmax Cross Entropyを計算する

### ニューラルネットワークによく使われているロス関数Softmax-Cross-Entropyを簡単な例からイメージを掴もう。
### まずは式

** **
Softmax 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/182933/62a684dc-248d-8c23-a4df-85dd43c033fe.png)
** **
Cross-Entropy
![image.png](https://qiita-image-store.s3.amazonaws.com/0/182933/44db74f8-a6fc-41c0-cc4b-c834d6d1d790.png) 

pは真の分布、qは推定分布
** **
例：全結合層の出力が
  [1,2,3,4]
Softmax関数を取るには、まず指数を取る
[2.718, 7.389, 20.085, 54.598]
そして合計を計算してから各値割合を計算
[0.033, 0.087, 0.236, 0.644] <- 推定分布

次にcross-entropyを計算
q -> [0.033, 0.087, 0.236, 0.644]
ケース1： p <- [0,0,0,1] 真の結果がクラス4の場合
H(p,q) = - log(0.644) = 0.44

ケース2： p <- [0,0,1,0] 真の結果がクラス3の場合
H(p,q) = -log(0.236) = 1.44

明らかにうまく予測できたケース(ケース1)の誤差が小さいことがわかった。

soft-cross-entropy誤差を最小化にしたら、予測結果が真に近く。
`script`コマンド内で矢印キーが効かない(`^[[D`みたいに文字化けする)


`script`コマンドで環境構築ログを作ろうとしたところ、矢印キーを押すと 左矢印キーの場合`^[[D`のようにタイプされてしまい、カーソルの移動ができなくなってしまいました。
他の矢印や ctrl+Hとかも同様です。
流石にカーソル移動できないとしんどいので調べてみたら、 `script`コマンドのオプションにはコマンドを指定できる`-c`オプションがありました。

そこでそれを利用して `script -c /bin/bash` で開始することで正常に矢印キーなどが動作するようになりました。
扱うオブジェクトは同じだけどレイアウトが違う時のカスタムCellの作り方

#概要

Twitterとかのタイムラインを作るときに、オブジェクト自体は共通で画像があるなしやRTなどによってレイアウトを変えたい場合
共通の処理がある場合はBaseクラスでもいいと思いますが
共通の処理がないけどInterfaceが共通な場合はBaseクラスを作らず
protocolを使ったほうがいいと思ったのでまとめました。

# 前提条件
- 共通の処理はない
- 扱う側は同じInterfaceで扱いたい
- レイアウト毎に配置してるアウトレットが異なる


# Baseクラス
```swift:Baseクラス系
struct Model {}

class BaseCell: UITableViewCell {
    func setup(model: Model) {
        fatalError("need override")
    }
}

class TypeACell: BaseCell {
    override func setup(model: Model) {

    }
}

class TypeBCell: BaseCell {
    override func setup(model: Model) {
    }
}

class Datasource: UITableViewDataSource {
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell: BaseCell
            if type {
                cell = TypeACell()
            } else {
                cell = TypeBCell()
            }

            cell.setup(model: Model())

            return cell
        }
    }
}
```

# プロトコル
```swift:プロトコル系
struct Model {}

protocol TypeCellProtocol {
    func setup(model: Model)
}

typealias TypeCell = UITableViewCell & TypeCellProtocol

class TypeACell: TypeCell {
    func setup(model: Model) {
        
    }
}

class TypeBCell: TypeCell {
    func setup(model: Model) {
        
    }
}

class Datasource: UITableViewDataSource {
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell: TypeCell
            if type {
                cell = TypeACell()
            } else {
                cell = TypeBCell()
            }

            cell.setup(model: Model)

            return cell
        }
    }
}
```

# メリット
- オーバーライドし忘れることがない。

# デメリット
- タイプエイリアスを書かないとダメ
firebase storage rules の注意点 (削除時)

(※2018/10/9 `delete` は用意されている旨ご指摘頂きました。そのためこの記事は参考にならないかと思います。)

firebase storage のセキュリティルールでハマったので書いておきます。

firebase storage の rule は firestore と違いオペレーションが `read` `write` のみで `create` `update` `delete` 等は用意されていません。そのため、注意しなくてはいけないケースがあります。

例えば、画像の書き込みを 500KB 以下に制限したい場合、次のように書くと思います。

```
match /abc/{abcID}/image/{image} {
  allow read: if request.auth != null;
  allow write: if (request.auth != null &&
               request.resource.size < 500 * 1024 &&
               request.resource.contentType.matches('image/.*'));
}
```

一見良さそうですが、このままだと削除ができなくなります。理由は削除時 `request.resource.size` の値が `null` になるためです。そのため削除させたい場合、次のように書きます。

```
match /abc/{abcID}/image/{image} {
  allow read: if request.auth != null;
  allow write: if (request.auth != null && request.resource == null)
               || (request.auth != null &&
               request.resource.size < 500 * 1024 &&
               request.resource.contentType.matches('image/.*'));
}
```

下記の条件を追加している点がポイントです。

**request.resource == null**

これで削除もできるようになります。

参考
https://stackoverflow.com/questions/38922124/firebase-storage-post-rules-apply-to-delete-rules

ドキュメントに明示的には書いてないような気がします。
LaTeXからワードファイルを出力する

# はじめに
+ 文章作成：tex形式
 + 論文入稿時の要請 
 + 個人的な好み
+ 共著者とのやりとり: docx形式
 + コメント・変更履歴が残しやすい

__tex形式からdocx形式への変換を楽にするには？__...という覚書

# 基本方針
+ pandocやAdobe Acrobatを使えば良い
 + ただし，数式や画像(pdfやeps)が乱れる事しばしば
 + 行・ページ番号があると，さらにグダグダに

そこで，基本的には既存のサービスを使いつつも

+ 数式や画像は後から(画像として)貼り付け
+ 共著者チェック時は，行・ページ番号を未記載 (あるいは，ワードの機能で再表示)

という抜け穴を使って，変換してみる

# 実装
## プリアンブル
    \newif\ifoutpdf
    \outpdftrue  % pdf形式で出力
    \outpdffalse % docx形式で出力
    \ifoutpdf
      % 行番号の適切な表示*****始まり
      % このブロックがないと，数式前後で行番号が乱れる
      \newcommand*\patchAmsMathEnvironmentForLineno[1]{%
      \expandafter\let\csname old#1\expandafter\endcsname\csname #1\endcsname
      \expandafter\let\csname oldend#1\expandafter\endcsname\csname end#1\endcsname
      \renewenvironment{#1}%
         {\linenomath\csname old#1\endcsname}%
         {\csname oldend#1\endcsname\endlinenomath}}% 
      \newcommand*\patchBothAmsMathEnvironmentsForLineno[1]{%
      \patchAmsMathEnvironmentForLineno{#1}%
      \patchAmsMathEnvironmentForLineno{#1*}}%
      \AtBeginDocument{%
      \patchBothAmsMathEnvironmentsForLineno{equation}%
      \patchBothAmsMathEnvironmentsForLineno{align}%
      \patchBothAmsMathEnvironmentsForLineno{flalign}%
      \patchBothAmsMathEnvironmentsForLineno{alignat}%
      \patchBothAmsMathEnvironmentsForLineno{gather}%
      \patchBothAmsMathEnvironmentsForLineno{multline}%
      % 行番号の適切な表示*****終わり
    }
    \else
      % ハイフネーションの禁止
      \hyphenpenalty=10000\relax
      \exhyphenpenalty=10000\relax
      \sloppy
      % ページ番号未表示
      \pagestyle{empty}
    \fi

## 本文
#### 数式
##### 数式が１行の場合
    \begin{align}
      \ifoutpdf
        % 数式本文
        \label{eq:**}
      \fi
    \end{align} 
##### 数式が複数行の場合
    \ifoutpdf
      \begin{align}
        % 数式本文
        \label{eq:**}
      \end{align}
    \else
      \begin{align}
        temp
        \label{eq:**}
      \end{align}
    \fi
### 図表
    \begin{figure}[p]
      \centering
      \ifoutpdf
        \includegraphics{**} 
      \fi
      \caption{
        % キャプション
      }
      \label{fig:**}
    \end{figure}

# docx形式への出力手順
1. `\outpdffalse`を指定
 + ページ・行番号は出力されない
 + 図表・数式は出力されない
 + 図表・数式番号，及びキャプションは出力される
2. docx形式へ出力
 + dvipdfxで処理 (pdf形式で出力)→Adobe Acrobatを用い，docxとして出力
 + あるいは，pandocで処理 
3. 図表・数式の差込
 + 数式に関しては，Word機能を使って再入力しても良い
 + が，面倒なのでpdfで出力したものをキャプチャーし，画像として貼り付ければ用は足りる

# 問題点
+ 数式の再入力 (あるいはキャプチャーからの画像貼付)が，やはり面倒
 + なんとかしてここも自動化できないか．．．
MyBatis3のキャッシュを無効する

MyBatisを使って検索を行う場合、デフォルトの動作として、同一トランザクション内に同じパラメータで呼び出すと、2回目以降はSQLを発行せずに、キャッシュされているインスタンスが返却される仕組みになっています。

[MyBatis3設定](http://http://www.mybatis.org/mybatis-3/ja/configuration.html)
>
MyBatis は循環参照の解決やネストされたクエリのスピード向上のためにローカルキャッシュを使用します。 デフォルト（SESSION）では同一セッション内の全てのクエリ結果がキャッシュされます。localCacheScope に STATEMENT を設定した場合、ローカルキャッシュはステートメントごとに適用されます。言い換えると、同一 SqlSession に対する複数の呼び出しでデータが共有されることはありません。

##キャッシュを無効にする
以下のように設定すると、ローカルキャッシュをステートメント単位で管理するように変更できます。 ステートメント単位で管理する場合、MyBatisは毎回SQLを実行して最新のEntityを取得します。

```application.properties
mybatis.config-location=classpath:/mybatis/mybatis-config.xml
```

```mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<settings>
		<setting name="localCacheScope" value="STATEMENT" />
	</settings>
</configuration>
```
BotmanStudio v2 に slack driver をインストールする

2018/06/04現在、 `botman/botman 2.0` に slack driver を追加すると依存関係でエラーになってしまう。

```
$ php artisan botman:install-driver slack
Installing driver "Slack"
Using version ^2.1 for botman/driver-slack

./composer.json has been updated

Loading composer repositories with package information

Updating dependencies (including require-dev)

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Conclusion: don't install botman/driver-slack 2.1.3
    - Conclusion: don't install botman/driver-slack 2.1.2
    - Conclusion: don't install botman/driver-slack 2.1.1
    - Installation request for botman/driver-slack ^2.1 -> satisfiable by botman/driver-slack[2.1.0, 2.1.1, 2.1.2, 2.1.3].
    - Conclusion: don't install react/event-loop v0.5.2
    - botman/driver-slack 2.1.0 requires mpociot/slack-client ~1.0 -> satisfiable by mpociot/slack-client[1.0].
    - mpociot/slack-client 1.0 requires react/event-loop ^0.4.1 -> satisfiable by react/event-loop[v0.4.1, v0.4.2, v0.4.3].
    - mpociot/slack-client 1.0 requires react/event-loop ^0.4.1 -> satisfiable by react/event-loop[v0.4.1, v0.4.2, v0.4.3].
    - Can only install one of: react/event-loop[v0.4.1, v0.5.2].
    - Can only install one of: react/event-loop[v0.4.2, v0.5.2].
    - Can only install one of: react/event-loop[v0.4.3, v0.5.2].
    - Can only install one of: react/event-loop[v0.5.2, v0.4.1].
    - Installation request for react/event-loop (locked at v0.5.2) -> satisfiable by react/event-loop[v0.5.2].



Installation failed, reverting ./composer.json to its original content.

Error installing driver "Slack"
```

`composer.json` に定義されている `react/event-loop` のバージョンを下げてやるとインストールすることができた。

```
    "require": {
        "php": ">=7.1.3",
        "botman/botman": "~2.0",
        "botman/driver-slack": "2.0",
        "botman/driver-web": "~1.0",
        "botman/studio-addons": "~1.2.1",
        "botman/tinker": "~1.0",
        "fideloper/proxy": "~4.0",
        "laravel/framework": "5.6.*",
        "laravel/tinker": "~1.0",
        "react/event-loop": "v0.4.1"
    },
```
RSpec で PowerAssert を使うもっとも簡単な方法

次のように `expect_with :test_unit` を追加します。

```a.rb
RSpec.configure do |config|
  config.expect_with :test_unit
end

describe do
  it do
    assert { 1 + 2 == 3 * 4 }
  end
end
```

実行

```shell
% rspec a.rb
F

Failures:

  1) 
     Failure/Error: assert { 1 + 2 == 3 * 4 }
     
     Test::Unit::AssertionFailedError:
           assert { 1 + 2 == 3 * 4 }
                      |   |    |
                      |   |    12
                      |   false
                      3
     # ./a.rb:7:in `block (2 levels) in <top (required)>'

Finished in 0.0131 seconds (files took 0.10485 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./a.rb:6 # 
```

# rspec-rails を使っている場合

その場合は、悲しいことに上記のようにしても動きません。
rspec-rails 側が assert 関連を定義してカオスなことになっています。
なので rspec-rails を使っている場合は素直にこちらを使わせてもらいましょう。

RSpecでpower_assertを使うためのrspec-power_assertを作ってみた
https://qiita.com/joker1007/items/88077d6b2affeb42aa1c

Rails で rspec-power_assert を assert の名前で使う方法
https://qiita.com/akicho8/items/2bfca644fa1a84f4cacc
※ rspec-rails の assert を取り除けば test-unit の assert が使えるかもしれません (未検証)
JavaScriptのオブジェクト指向

JavaScript本格入門の内容を自分用にメモ

#JavaScriptは「クラス」ではなく「プロトタイプ」
JavaScriptはオブジェクト指向言語だが、JavaやC++といったオブジェクト指向言語とは根本的な違いがある。
それは、インスタンス化という概念はあるが、いわゆる「クラス」がなく、「プロトタイプ」という概念だけが存在する点。
プロトタイプとは、「あるオブジェクトの元となるオブジェクト」のこと。JavaScriptではクラスの代わりにプロトタイプを利用して新たなオブジェクトを生成していく。

#シンプルなプロトタイプ(いわゆるクラス)を定義してみる
```js
# 空のプロトタイプを定義
var Member = function() {};
# new演算子でインスタンス化
var mem = new Member();
```
変数Memberに対して空の関数リテラルを代入しているだけのように見えるが、これがJavaScriptのプロトタイプ(いわゆるクラス)。
つまり、

**JavaScriptでは関数(Functionオブジェクト)にクラスとしての役割を与えている**

これは、「プロトタイプ」 = 「あるオブジェクトの元のオブジェクト」の定義から考えると、JavaScriptではFunctionオブジェクトを元にオブジェクトが作成されていると解釈できるので、プロトタイプの理解がしやすい。
ボタン長押しでプレイヤー移動

プレイヤー移動に使えるTipsです。キーボードではなく、画面上のボタンを長押しする場合について書いていきたいと思います。

#準備
動かしたいプレイヤーと移動ボタンを作ります。
プレイヤーは
Hierarchy > Create > 3D Object or 2D Object
名前は「player」としておきます

ボタンは
Hierarchy > Create > UI > Button 
今回は左右に動かしたいのでボタンは2つ作り、それぞれ「right」「left」とします。
下のようになればokです
![スクリーンショット 2018-06-04 9.05.56.png](https://qiita-image-store.s3.amazonaws.com/0/160446/829d59f6-a93d-9d6e-52d9-f63c2d42b1a0.png)
配置はこんな感じにしました
![スクリーンショット 2018-06-04 9.34.25.png](https://qiita-image-store.s3.amazonaws.com/0/160446/1addf252-34a0-de32-d803-84552dbd78cb.png)


#長押し機能を作る
ボタンに長押し機能を付けます。
ボタンのInspector  > Add Component > Event Trigger > Add New Event Type > Pointer Down と Pointer Up を選択
あとでスクリプトと関連づけていきます。方法としてはOn Click とあまり変わりありません。

#コードを書く
Project > Create > C# Script
名前は「move」にしてみました
中身は以下の通り

```c#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
//UIを使うときのおまじない、忘れずに書く

public class move : MonoBehaviour {

	GameObject player;
//	動かしたいプレイヤー
	bool right = false;
//	右ボタンを押しているかの真偽値
	bool left = false;
//	左ボタンを押しているかの真偽値


	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		if (right) {
			goright ();
//			右に動かすためのメソッドを呼び出す
		}else if (left) {
			goleft ();
//			左に動かすためのメソッドを呼び出す
		} else {
//			ボタンを押していない時
			transform.rotation = Quaternion.Euler (0, 0, 0);
//			プレイヤーを元の角度に戻す
		}
	}

	public void rPushDown(){
//		右ボタンを押している間
		right = true;
	}

	public void rPushUp(){
//		右ボタンを押すのをやめた時
		right = false;
	}

	public void lPushDown(){
//		左ボタンを押している間
		left = true;
	}

	public void lPushUp(){
//		左ボタンを押すのをやめた時
		left = false;
	}

	public void goright(){
		if (transform.position.x <= 5.0f) {
//			プレイヤーの位置が5.0f以下の時
//			↑画面からはみ出さないための条件
			transform.position += new Vector3 (5.0f * Time.deltaTime, 0, 0);
//			プレイヤーをx軸方向に秒速5.0fで動かす
			transform.rotation = Quaternion.Euler (0, -20, -10);
//			プレイヤーの角度をy軸周りに-20度、z軸周りに-10度回転させる
//			↑プレイヤーがグッと肩を入れて移動してる感を出す、この一文は無くても問題なし


		}
	}

	public void goleft(){
		if (transform.position.x >= -5.0f) {
//			プレイヤーの位置が-5.0f以上の時
//			↑画面からはみ出さないための条件
			transform.position += new Vector3 (-5.0f * Time.deltaTime, 0, 0);
//			プレイヤーをx軸方向に秒速-5.0fで動かす
			transform.rotation = Quaternion.Euler (0, 20, 10);
//			プレイヤーの角度をy軸周りに20度、z軸周りに10度回転させる
//			↑プレイヤーがグッと肩を入れて移動してる感を出す、この一文は無くても問題なし
		}
	}


}	
```

#ボタンとスクリプトの関連付け
ボタンのInspector > Event Trigger で関連付けします
右ボタンが
![スクリーンショット 2018-06-04 9.52.01.png](https://qiita-image-store.s3.amazonaws.com/0/160446/3a43b268-11bd-fa8f-d785-340bb52a3be6.png)
左ボタンが
![スクリーンショット 2018-06-04 9.52.44.png](https://qiita-image-store.s3.amazonaws.com/0/160446/c2546820-b2d8-9bfa-db93-15d69ebe0545.png)
となれば完了です。

#実行
![move.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/160446/f9d29376-e173-212b-b9ac-02ca026c5da9.gif)
完成です！

#OnClickじゃだめなの？
OnClickの場合、クリックしたその瞬間にしかメソッドが実行されません。
つまり、OnClickは「ボタンを押して、離した時」にイベントを発生させているのです。この点Event Trigger の　Pointer Down は「ボタンを押した時」、Pointer Up は「ボタンを離した時」のそれぞれを司っています。よって長押しなど、イベントの発生タイミングを細かく設定したいときはEvent Triggerコンポーネントを使った方がいいでしょう。
Synchronize time in a Docker container

This article is translated from 
https://qiita.com/kawasaki/items/e024f1bafe73f851a089 .
***

# Conclusion
- Use the time provided by the host who is responsible for synchronizing the right time

# Why
It is no doubt important to keep the right time in your service. So, let’s introduce a NPT server in your container…. WAIT! 
If you do it, it’s against the best practice of running just one process for one Docker container. Time is one of basic functions provided by a host and you should depend on it. In a cloud service, the provider will take care of it, in contrast to the environment under your control in which you should maintain the right time by yourself.
fcitxで作るWSL日本語開発環境

やっぱり本命はこっち

[PhpStorm]:https://www.jetbrains.com/phpstorm/
[Jetbrains IDEA]:https://www.jetbrains.com/idea/
[Debian GNU/Linux]:(https://www.microsoft.com/ja-jp/store/p/debian-gnu-linux/9msvkqc78pk6)
[VcXsrv]:https://sourceforge.net/projects/vcxsrv/
[scoop]:http://scoop.sh/

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

 関連記事
* [Scoopで作るLinux on Windows開発環境](https://qiita.com/dozo/items/a6f63aa1b03d1773b8ec)
* [Windows Subsystem for Linux(旧bash on windows)からPhpStormを動かす](https://qiita.com/dozo/items/9bf3965614075f6319f9)
* [Bash on Ubuntu on Windowsを使う(1)](https://qiita.com/dozo/items/07ae85ab3937d2ed675a)
* [Bash on Ubuntu on Windowsを使う(2)：初期設定](https://qiita.com/dozo/items/6cbedf3fd057b50d0ada)
* [Bash on Ubuntu on Windowsを使う(3)：WindowsからLinuxを使う](https://qiita.com/dozo/items/ff41ece3771affda8845)


----
------------------- ↓ 余談はここから ↓-------------------
以前、[scoop]を使ってLinux開発環境を構築した。
ただ、やはりLinux開発環境といえばWSLでいきたいところ。
IDEも含めて全部Linuxにできればと、
[Windows Subsystem for Linux(旧bash on windows)からPhpStormを動かす](https://qiita.com/dozo/items/9bf3965614075f6319f9)

で実現できることは確認できた。
あとは、GUIや日本語入力がどうにかできれば、
開発環境は完璧といった具合だろう。

ということでWSL上でIDEを動かし、
日本語入力できる状態まで持っていく方法を探る。

----
------------------- ↓ 本題はここから ↓-------------------
## fcitxのインストール

### windowsフォントのインストール

```shell-session
$ sudo apt -y install fontconfig
$ sudo ln -s /mnt/c/Windows/Fonts /usr/share/fonts/windows
$ sudo fc-cache -fv
```

### fcitxのインストール
WindowsでいうIMEにあたるものがLinuxでは
「日本語変換エンジン」と「入力インタフェース」に分かれており、
エンジンにはGoogle製のmozc（モズク）を、
インタフェースにはfcitxを使う。

```shell-session
$ sudo apt -y install fcitx-mozc dbus-x11 x11-xserver-utils # 結構長いです
$ dbus-uuidgen > /var/lib/dbus/machine-id
```

### fcitxの設定

```shell-session
$ set -o noclobber # 念のため
$ cat << EOS >> .profile
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS="@im=fcitx"
export DefaultIMModule=fcitx
xset -r 49 # 半角全角点滅防止
EOS
$ source .profile
```

### xアプリで実験

Windows上で[VcXsrv]を起動しておく。

```shell-session
$ sudo apt -y install lxterminal
$ lxterminal &
```

ターミナル上でCtrl+Space

![xwindow_fcitx02.PNG](https://qiita-image-store.s3.amazonaws.com/0/40697/ee5c6c9c-cb7b-b8e4-43ab-7ca9faf1a836.png)


これで日本語環境もバッチリ。

[前回の記事](https://qiita.com/dozo/items/9bf3965614075f6319f9)のようにphpstorm起動すると、
日本語入力できることが確認できた。

----
------------------- ↓ 後書はここから ↓-------------------

### 半角/全角キー点滅問題

インストール完了してfcitxを起動するため、
半角全角キーを押すと点滅した状態になる。
LinuxとWindowsとのやり取りの問題だと思うが、
理由ははっきりしない。
ただ、以下の設定をすれば回避できる模様。

```
$ xset -r 49
```

### fcitx-autostart問題

使うたびに実行する必要があるfcitx-autostart。
起動時に自動で発動するようにしておきたい。
ただ、初期起動でログをガンガン吐き出す変態仕様。

いろいろ考えて、
ログをもみ消す形で決着。

```bash:.profile
if [ $SHLVL = 1 ] ; then
  xset -r 49  > /dev/null 2&>1
  (fcitx-autostart > /dev/null 2&>1 &)
fi
```
うーん。微妙。。。
シェルはよーわからん。
【Ubuntu16.04】AnsibleでPython3.6のvenv環境を構築する

## はじめに
Ansibleを使ってPythonをインストールしたら3.5系が入ってしまった。
3.6系を入れたい。

```bash
$ python -V
Python 3.5.2
```

## 実行環境
- Ubuntu16.04 LTS
- Ansible2.5.3

## 参考情報
- [Ubuntu環境のPython](https://www.python.jp/install/ubuntu/index.html)
- [apt_repository - Add and remove APT repositories](http://docs.ansible.com/ansible/latest/modules/apt_repository_module.html)
- [apt - Manages apt-packages
](http://docs.ansible.com/ansible/latest/modules/apt_module.html?highlight=apt)

## リポジトリを追加
公式ページの手順に従いリポジトリを追加する。

```yml
- name: Add Python3.6 repository from PPA
  apt_repository:
    repo: 'ppa:jonathonf/python-3.6'
```

## apt-update
```yml
- name: Run the equivalent of "apt-get update" as a separate step
  become: yes
  apt:
    update_cache: yes
```

## 仮想環境のインストール
`python3-venv`ではなく、`python3.6-venv`なので注意。

```yml
- name: install python36-virtualenv
  become: yes
  apt:
    name: python3.6-venv
    state: latest
```

## apt-installする
明示的に`python3.6`、`python3.6-dev`を指定する。

```yml
- name: Install the packages
  become: yes
  apt:
    name:
      - python-dev
      - python-pip
      - libxml2-dev
      - libxslt1-dev
      - zlib1g-dev
      - libffi-dev
      - libssl-dev
      - python3.6
      - python3.6-dev
    state: present
```

## 仮想環境の作成
`venv_name`は任意の名称を入れる。

```yml
- name: create virtualenv
  shell: python3.6 -m venv venv_name
  args:
    chdir: /home/vagrant
```

## 最終的なplaybook
```yml
- hosts: all

  tasks:

  - name: Add Python3.6 repository from PPA
    apt_repository:
      repo: 'ppa:jonathonf/python-3.6'

  - name: Update all packages to the latest version
    become: yes
    apt:
      upgrade: dist

  - name: Run the equivalent of "apt-get update" as a separate step
    become: yes
    apt:
      update_cache: yes

  - name: Install the packages
    become: yes
    apt:
      name:
        - python-dev
        - python-pip
        - libxml2-dev
        - libxslt1-dev
        - zlib1g-dev
        - libffi-dev
        - libssl-dev
        - python3.6
        - python3.6-dev
      state: present

  - name: install python36-virtualenv
    become: yes
    apt:
      name: python3.6-venv
      state: latest

  - name: create virtualenv
    shell: python3.6 -m venv venv_name
    args:
      chdir: /home/vagrant
```

## 実行結果確認
無事にvenv環境でPython3.6の環境ができました！

```bash
$ . venv_name/bin/activate
(venv_name) $ python -V
Python 3.5.2
(venv_name) $ python3.6 -V
Python 3.6.5
```