OmniAICreator/Qiita-1.07M huggingface dataset:
GitLab Mattermostを有効化してみた

# 環境
CentOS 7.4
GitLab Community Edition 9.5.5


# 作業開始

公式ドキュメントはこちら
https://docs.gitlab.com/omnibus/gitlab-mattermost/

GitLabはインストール済み。

## Mattermost用のURLを用意する

以下のようにgitLabと同ドメインでポートで分けたい。
gitLabのURL: http://gitlab.example.com/
MattermostのURL: http://gitlab.example.com:999/

ポートを開ける。

```
$ firewall-cmd --zone=public --add-port=999/tcp --permanent
$ firewall-cmd –-reload
```

確認

```
$ firewall-cmd --list-all
```
ports: 999/tcp　が追加されてたのでOK

## Mattermostを有効化

コメントを外してURL指定→reconfigure

```ruby:/etc/gitlab/gitlab.rb
mattermost_external_url 'http://gitlab.example.com:999/'
```

```
$ gitlab-ctl reconfigure
```

これだけで http://gitlab.example.com:999/ にアクセスするとサインイン画面が表示されました

## サインインしようと思ったら…

エラー
`Client authentication failed due to unknown client, no client authentication included, or unsupported authentication method.`

[このあたり](https://gitlab.com/gitlab-org/gitlab-mattermost/issues/34#note_2586798)を参考にして設定を見てみる

```ruby:/etc/gitlab/gitlab-secrets.json
	"mattermost": {
	# 省略
	    "gitlab_secret": "xxxxx",
	    "gitlab_id": "xxxxxx",
	# 省略
	  }
```
管理画面(http://gitlab.example.com/admin/applications) を見ると、
「GitLab Mattermost」という名前で自動的にapplicationが作成されていたのですが、
gitlab_secretとgitlab_idの値が違っている。

どうやら、そのまえにいろいろいじくって設定していたgitlab_idとgitlab_secretが
`gitlab-secrets.json` にそのまま残っちゃってたみたいです。

/etc/gitlab/gitlab-secrets.json の方を直接編集し、再度reconfigure

```
$ vi /etc/gitlab/gitlab-secrets.json
$ gitlab-ctl reconfigure
```

無事にサインインできました:v:


`gitlab-secrets.json` を直接編集せずに、`gitlab.rb` の `mattermost['gitlab_id']` と`mattermost['gitlab_secret']` を
設定してもうまくいきそうなかんじですが（未確認）、
`gitlab.rb` をできるだけデフォ状態にしておきたかったので直接編集しました。
jQueryを使用しないでDOM構築後に実行    

jQueryの

```js
$(function(){});
```

に頼り過ぎててjQueryを使用しないで対応する方法を考えたことも無かったのでメモ

HTML5なら何も考えずに以下でOKだそうです

```js
document.addEventListener("DOMContentLoaded", function() {
    console.log("DOM構築完了");
});
```
run-asでAndroidのSharedPreferencesファイルを覗く

# 前提
- Mac
- adbインストール & PATH設定済み
- run-asが通る端末である（自分はNexus6使用）
- アプリのパッケージ名を my.app.package だとする。
- アプリのSharedPreferencesで保存するファイル名は common となっている

# コマンド

```bash
$ adb shell run-as my.app.package cat shared_prefs/common.xml
```

# 結果
このように表示された。

```
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="temp_item">abcabcabc12341234</string>
    <int name="temp_count" value="1" />
    <boolean name="push" value="true" />
</map>
```

# 注意
Galaxy系の端末だとrun-asコマンドが動かないという情報もあったので、実行できない環境もあるようだ。

Nexus6では余裕で動いたので、開発中のデバッグに役立っている。
CircleCI 2.0でGlide管理のGoをGAEにデプロイする

# Dockerイメージの用意
GitHubで以下のDockerfileを上げて、Docker Hubと連携するなどしてコンテナをダウンロードできる状態にしてください。

```Dockerfile:Dockerfile
FROM golang:1.9.0
ENV _HOME=/root

RUN apt-get update
RUN apt-get install -y unzip

RUN curl https://glide.sh/get | sh

RUN mkdir $_HOME/download
RUN curl -o $_HOME/download/go_appengine_sdk_1.9.58.zip https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-1.9.58.zip
RUN unzip -q -d $_HOME $_HOME/download/go_appengine_sdk_1.9.58.zip
ENV PATH=$_HOME/go_appengine:$PATH

RUN curl -sSL https://sdk.cloud.google.com | bash -s -- --disable-prompts
ENV PATH=$_HOME/google-cloud-sdk/bin:$PATH
```



# サービス アカウント キーの取得
- 場所
    - `ツールとサービス` → `APIとサービス` → `認証情報` → `認証情報を作成` → `サービス アカウント キー
- 役割
    - `App Engine` → `App Engine デプロイ担当者`
- キーのタイプ
    - JSON

gcloudコマンドで上記で取得したJSONキーファイルを使って認証し、そこから取得できるアクセストークンを使ってgo_appengine_sdkでビルドします。
プロジェクトルートに`service_account_keys`フォルダを作成しそこに適宜名前をつけて保存してください。
<font color="red">※公開リポジトリでは必ず下記の作業を行なってください。</font>

- [鍵ファイルの暗号化と復号化用のスクリプトの用意 - CircleCIでService Account使ってGAE/goへdeployする](https://qiita.com/koki_cheese/items/ee25795bcd85ef72889c#鍵ファイルの暗号化と復号化用のスクリプトの用意)



# CircleCI設定ファイル作成
プロジェクトルートに.`circleci`フォルダを作成し、その中に`config.yml`を作成します。

- `docker_hub_namespace`/`docker_hub_repository_name`はDocker Hubで作成したリポジトリ情報を入れてください
    - Docker Hubでプライベートなリポジトリの場合は、`auth`で`username`、`password`を設定することでDockerイメージを取得できます(<font color="red">※GitHubの公開リポジトリには絶対上げない</font>)
- `project_name`には、チェックアウトするソースのプロジェクト名を指定してください
- `appcfg.py`コマンドの最後の引数には、`app.yaml`があるディレクトリを指定してください

```yaml:.circleci/config.yml
version: 2

jobs:
  build:

    docker:
      - image: docker_hub_namespace/docker_hub_repository_name
        auth: # Case Private Repository
          username: username
          password: password

    working_directory: /go/src/project_name

    steps:
      - checkout

      - run: glide i

      - deploy:
          command: |
            if [ "${CIRCLE_BRANCH}" == "develop" ]; then
              gcloud auth activate-service-account --key-file ./service_account_keys/develop.json
              appcfg.py update --oauth2_access_token $(gcloud auth print-access-token) app
            elif [ "${CIRCLE_BRANCH}" == "master" ]; then
              gcloud auth activate-service-account --key-file ./service_account_keys/master.json
              appcfg.py update --oauth2_access_token $(gcloud auth print-access-token) app
            fi
```

# 参考: プロジェクトツリー
```
project_name
　├─.circleci
　│　└─config.yml
　├─app
　│　├─app.yaml
　│　└─index.go
　├─server
　│　├─index.go
　│　├─foo.go
　│　└─bar.go
　├─glide.lock
　└─glide.yaml
```



# 参考文献
- [CircleCI 2.0 が正式リリースされたので早速移行しました - SmartHR Tech Blog](http://tech.smarthr.jp/tech/705)
- [CircleCI2.0でGoをCIする - GitHubGist](https://gist.github.com/k-hoshina/3193afdbee67fef7faa7c5586c5311e8)
- [CircleCIでService Account使ってGAE/goへdeployする - Qiita](https://qiita.com/koki_cheese/items/ee25795bcd85ef72889c)
mrubyをマイコンボードGR-PEACHで使ってみる

mrubyを使ってみたいけど、直ぐ試せるマイコンボードがないからなぁとお悩みのあなたに、ルネサス製マイコンボードGR-PEACH用のmrubyがひっそりと公開されてましたので試してみました。
![Smomomruby03.png](https://qiita-image-store.s3.amazonaws.com/0/34169/2ac78f92-f1ec-8c65-e23a-eaf27d33facd.png)


momo-mrubyという名前のこのmrubyは最新のmrubyバージョン1.3.0に対応（2017.9現在）、IoT向けのコード自動生成フレームワーク　mruby IoT　フレームワークPlatoにも対応というすぐれものです。
mrubyフレームワークPlatoのサイトは[こちら](http://plato.click)

#momo-mrubyのダウンロード

momo-mrubyは[Github](https://github.com/mimaki/momo-mruby-bin/)、またはmrubyをサポートしている軽量Rubyフォーラム（Matzが理事長です！）の[HP](http://forum.mruby.org/download/index6.html)からダウンロードできます。バイナリで配布なんであっというまに試せます。Windows版、Mac版がありますのでWindows10で試しました。

#ここでちょっとGR-PEACHの説明
GR-PEACHはルネサスエレクトロニクス社製のマイコンボードでMPUにARM Coretex-A9 RZ/A1H 400MHzを搭載、10MBの大容量内蔵RAM、カメラ入力/グラフィックス出力/オーディオやEthernetのNW機能がついてます。ホビーだけでなく、製品の試作、本番にまで使えそうなパワーです。世界初のmbedOS対応マイコンボードとのこと。Amazonや秋月電子で購入可能です。ちなみにFullとNormalがあってNormalはFullからEhernetとAruduino互換ピンを省いたものなのでFullが扱いやすいです。Fullは1万円くらいで手に入ります。

###### GR-PEACHの化粧箱は舞妓さん
![SFullSizeRender.jpg](https://qiita-image-store.s3.amazonaws.com/0/34169/7af546b2-51a6-220f-b23e-1cebedb288da.jpeg)

#ダウンロードしたmomo-mrubyをGR-PEACHに導入
Zipファイルをダンロードして解凍します。できるディレクトリはこんな感じ。

momo-mruby-1.0.0-win/
  +-- bin/
  |  　 +-- momo-mruby.bin (momo-mrubyファームウェア)
  |  　 +-- mrbc.exe (Macの場合はmrbc)
  +-- sample/
  |  　 +-- led.rb
  +-- README.md

binファイルがmomo-mruby本体、mrbcはmruby用のコンパイラーです。
sampleディレクトリにled.rbというサンプルファイルがあります。これはGR-PEACH上に載っているRGB LEDを点滅させるサンプルファイルです。

##momo-mruby導入
momo-mrubyをGR-PEACHに書き込むのは非常に簡単。
用意するのは
・USBケーブル (A-MicroB)
・microSDカード
ともにGR-PEACHには付属していませんので別途用意しておきます。SDカードは自分で作成したmrubyアプリケーションのロードに使います。

GR-PEACHをUSBでPCにつなぐとMBEDというドライブで認識されます。そこへmomo-mruby.binをコピーするだけ。少し待っているとmomo-mrubyがロードされます。

![SFullSizeRender (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/34169/ffe64aec-50a1-89ea-87e8-2510c6361044.jpeg)

###### USBからGR-PEACHに給電するには写真のように外側のUSBにつなぎます。
青く光っているのが3色LED

#早速サンプルプログラムを動かしてみる
先のGithubのページにも丁寧な説明がありますがこちらにもさくっと載せておきます。

付属のサンプルプログラムはGR-PEACH上のRGB LEDを順番に点滅させます。
ここですることは
1.　led.rbはRubyプログラム、これをコンパイルしてmrubyアプリケーションにします
2.　コンパイルの際にGR-PEACHで起動時にアプリケーションを読み込ませるためにautorun.mrbという名前にします。
3.　SDカードにautorun.mrbをコピーして電源入れ直します。正常にロードされるとLEDが3色で点滅します。

コンパイルするにはmrbc.exeを使います。コマンドは下記のようになります。パスについてはご自分の環境にあわせてください。

`>mrbc -o autorun.mrb led.rb`

出来上がったautorun.mrbをmicroSDカードのルートディレクトリにコピーして、GR-PEACHのmicroSDスロットに装着します。GR-PEACHをUSB接続して電源投入すると、momo-mrubyが起動し、mrubyアプリケーション(autorun.mrb)が実行されます。

#対話モードmirbを使ってみる
mrubyには対話モードがあります。ターミナルなどでGR-PEACHに接続してダイレクトにmrubyコマンドの実行が可能です。
ターミナルソフトウェアにはCoolTermがおすすめです。
またWindowsの場合、シリアルポートドライバをインストールする必要があります。ここは先のGithubのページを参照してください。
CooleTermの設定も変更します。特にメニューのオプションのTerminalの”Line mode"設定は忘れずに。

![mirb01.png](https://qiita-image-store.s3.amazonaws.com/0/34169/49689fe2-d55c-7f14-96c5-bea29c940fc8.png)

下のライン内にmrubyコマンドを入力することで対話的に遊べます。
図ではMRUBY_VERSION　を入力しています。
複数の行からなるアプリも1行ずつ入力することが可能です。

 >def top3(ary)
   p ary.sort.reverse[0..2]
 end
 => :top3
> top3( ["Led Zeppelin", "Jeff Beck", "Miles Davis", "Weather Report"] )
["Weather Report", "Miles Davis", "Led Zeppelin"]
 => ["Weather Report", "Miles Davis", "Led Zeppelin"]
> 

mrubyが動作するリファレンスボードとしてGR-PEACHはなかなか使えそうです。
お試しくださーい。
OpenZeppelin 1.2→1.3へのバージョンアップ内容

一番大きいのはCrowdsaleクラスの下記の変更。

* 開始ブロック
* 終了ブロック
* ICO開始Timestamp

だったのが

* 開始Timestamp
* 終了Timestamp

に変更されたことだと思う。
これでdifficulty bombなどの影響を受けづらくなるのではないでしょうか。
計画通りのICOを実現しやすくなるかと。

個人的にはプライベートネットとかでテストしやすくなるのが大きいようにも思う。

その他、下記のような変更なども加わっています。

・BurnableTokenクラスが追加され、トークンをBurnする機能が簡単に作れるようになった
・PausableTokenの仕組みでapprove承認処理フローに変更されてセキュリティ強化
・SafeERC20クラスが追加され、オーバーフロー対策の強化

以上、簡単な自分のメモがわりです。
pythonのnumpy.arrayの統計量一覧を表示するワンライナー

[Rのsummary関数](https://www.rdocumentation.org/packages/base/versions/3.4.1/topics/summary)のように、arrayの統計量を一覧にして表示させる方法。

# 1. ワンライナーのコード
```python
import pandas as pd
pd.DataFrame(pd.Series(arr.ravel()).describe()).transpose()
```

これだけで、numpy.arrayの

 - サイズ
 - 平均値
 - 標準偏差
 - 最小値
 - 第一四分位
 - 中央値
 - 第三四分位
 - 最大値

を表示してくれる。

# 2. 活用例

```python:コード
import numpy as np
import pandas as pd

arr = np.random.randn(100,100)
pd.DataFrame(pd.Series(arr.ravel()).describe()).transpose()
```

```:出力
     count      mean       std       min       25%       50%       75%       max
0  10000.0  0.000254  1.007792 -4.234695 -0.676233  0.004269  0.676998  3.633816
```

Jupyterだとさらに綺麗な表示になる。
![Screenshot from 2017-09-27 12-46-39.png](https://qiita-image-store.s3.amazonaws.com/0/88804/b67a695a-f637-31f8-e575-7675c133abfd.png)


# 3. 関数化
上記のコードをただ関数化しただけ。さらに便利に使いたい場合はこれを用いると良い。

```python
import pandas as pd

def summary(arr):
    return pd.DataFrame(pd.Series(arr.ravel()).describe()).transpose()
```

# 4. コードの解説
## ravel
arrayが2次元以上の時、このままだとpd.Series(arr)の部分が上手く動かないので、このravelによって1次元配列に変換する。

参照 : [https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ravel.html](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ravel.html)

## describe
統計量を計算する。

参照 : [https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.describe.html](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.describe.html)

## transpose
デフォルトだと、統計量が縦に並んでやや見づらい。
そのためこのtransposeメソッドを使うことによって行と列を入れ替え、統計量を見やすくする。

参照 : [https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.transpose.html](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.transpose.html)
Mistをプライベートネットで接続する方法

Macの場合のみです。
コンソールから起動して、下記のようなオプションを指定。

`Mist.app/Contents/MacOS/Mist --rpc http://localhost:8545 --swarmurl="http://swarm-gateways.net"`

--rpcオプションで起動中のgethクライアントを指定しましょう。

--swarmurlオプションは、ちゃんとswarm用のポートを開けたりした方が良いのでしょうが、
不要な場合はとりあえず上記で動くのでこれで良いかと。


参考：https://github.com/ethereum/mist/issues/2959
`display:inline-block;` が微妙に下にずれる問題の解決方法

同じ HTML 要素に `vertical-align:top;` を設定すれば良い。
原因はインライン要素のデフォルトがベースライン合わせだからっぽい。

```css
div {
    display: inline-block;
    vertical-align: top;
}
```
Windows10 自動更新で VirtualBox ネットワーク設定が壊れた

Windows10 自動更新後に VirtualBox 仮想マシンが起動しなくなった．
エラーメッセージは以下のとおり．

---
仮想マシン"xxx"のセッションを開けませんでした。

Interface ('VirtualBox Host-Only Ethernet Adapter') is not a Host-Only Adapter interface (VERR_INTERNAL_ERROR).

終了コード : E_FAIL (0x80004005)
コンポーネント: ConsoleWrap
インターフェース: IConsole {872da645-4a9b-1727-bee2-5585105b9eed}

---

既存の事例から確認．

アダプター2 のホストオンリーアダプターの設定がなくなっていたので再割り当て．
VirtualBox NDIS6 Bridged Network Driver にはチェックは入っていた（自分の設定ではブリッジアダプターは使っていないので，こちらは無関係と思われる）
https://blogs.yahoo.co.jp/xnmxb976/32292056.html

最終的には同僚の助言で
「VirtualBox 再インストール」
and/or
「ホストオンリーアダプターの無効化→有効化」で解決．

VirtualBox アンインストールに先立ち，仮想マシンはエクスポートしておいたが，再インストール後にも既存仮想マシンは残っていた．ただし仮想マシンが起動できない問題はまだ解決しておらず，
「ホストオンリーアダプターの無効化→有効化」で起動するようになった．

手探りでいろいろ行いながら，都度の検証や記録はしなかったので，どのステップで何が変わったか，結果的にどのステップが必須だったか等，曖昧になってしまった．仮説だが，「ホストオンリーアダプターの無効化→有効化」により，以下の英文記事の最後にある MAC Address の更新と同等のことを行ったのではないか？それが根本的な解決要因ではないかと思われる。
https://jameshuangsj.wordpress.com/2016/09/21/interface-virtualbox-host-only-ethernet-adapter-is-not-a-host-only-adapter-interface-verr_internal_error/
API ConnectのCLIで、APIのオンライン/オフラインを制御する方法


## やりたいこと
API Connectでは、APIを製品という単位でグルーピングして公開することができます。公開した後、特定のAPIだけをアクセスを停止したい場合は、APIマネージャーの画面上で、特定のAPIをオフラインにすることができます。
このAPI単位でのオフライン/オンラインの制御を、API Connectの開発ツールとして提供されている、Developer Toolkitに含まれるCLIから実行することができます。
今回は、このDeveloper ToolkitのCLIを使って、公開しているAPIのオンライン/オフラインを制御をしてみたいと思います。

## 参考マニュアル
+ [IBM API Connect v5.0 Knowledge Center : Toolkit コマンドの要約](https://www.ibm.com/support/knowledgecenter/ja/SSMNED_5.0.0/com.ibm.apic.toolkit.doc/rapim_cli_command_summary.html)


## 実行

### Developrt ToolkitのCLIからAPIをオフラインにする

まずCLIからログインを行います。


```ログイン
$ apic login --username <ユーザー名> --password <パスワード> --server <APIマネージャーのアドレス>

```

ログインを行なった後、特定のAPIのオンライン/オフラインは以下のコマンドで行います。プロバイダー組織に属するユーザー情報を指定する必要があります。

```コマンド
$ apic apis:set <API名>:<APIのバージョン> --status <offline | online> --catalog <カタログ名> --organization <プロバイダー組織名> --server <APIマネージャーのアドレス>
```

以下は、「test-provider」というプロバイダー組織「test」カタログ上の、「loan」APIのバージョン1.0.0をオフラインにする例です。

```実行例
$ apic apis:set loan:1.0.0 --status offline --catalog test --organization test-provider --server manager.apic.com
test-provider:test の loan:1.0.0 が更新されました (状況: offline)
```

APIマネージャーのカタログの製品一覧の画面上で確認して見ると、以下のようにオフラインになっています。
![product-status.jpeg](https://qiita-image-store.s3.amazonaws.com/0/122053/d2ec52b5-4212-0e9c-af74-330d46bb6462.jpeg "product-status.jpeg")



実際にオフラインにしたAPIにリクエストしてみると、呼び出しができずに応答が返ってこないことが確認できます。

同じ手順で、オフラインに変更することもできます。





以上、Developer ToolkitのCLIを使って、公開しているAPIのオンライン/オフラインを制御する方法でした。
Developer Toolkitでは、CLIでいろいろなことができるので、運用管理も便利に使えそうです。
macOS High Sierra / Mojave / Catalina で 日本語モード時に スペース <-> 半角 入れ替え

```
csrutil status
System Integrity Protection status: enabled.
```

command+R起動してからTerminal

```
csrutil disable
reboot
```

Catalinaの場合はこれも必要
どうも Catalina はシステム領域をSIP+R/Oでマウントしているようだ

```
sudo mount -uw /
```

```
sudo vi "/System/Library/Input Methods/JapaneseIM.app/Contents/PlugIns/JapaneseIM.appex/Contents/Resources/KeySetting_Default.plist"
```

```diff
--- /System/Library/Input Methods/JapaneseIM.app/Contents/PlugIns/JapaneseIM.appex/Contents/Resources/KeySetting_Default.plist.orig	2017-09-26 10:34:40.000000000 +0900
+++ /System/Library/Input Methods/JapaneseIM.app/Contents/PlugIns/JapaneseIM.appex/Contents/Resources/KeySetting_Default.plist	2017-09-26 10:38:30.000000000 +0900
@@ -11,12 +11,16 @@
 			<key>&apos; &apos;</key>
 			<dict>
 				<key>command</key>
-				<string>contextual_space</string>
+				<string>direct_input</string>
+				<key>character</key>
+				<string> </string>
 			</dict>
 			<key>shift+&apos; &apos;</key>
 			<dict>
 				<key>command</key>
-				<string>contextual_space_reverse</string>
+				<string>direct_input</string>
+				<key>character</key>
+				<string>　</string>
 			</dict>
 			<key>delete:</key>
 			<dict>
```

```
killall JapaneseIM
```

入力をどこでもいいのので望み通りの動きか確かめて再起動


command+R起動してからTerminal

```
csrutil enable
reboot
```


contextual_space_reverse / contextual_space を有効活用したかったが、スペース連打すると半角スペース -> 全角スペース と交互に繰り返したりでうまくいかなかったのでベタ書き

Mojaveでも手順は一緒でした
lsでサブディレクトリ中のファイルもlsする

lsでファイルの一覧だけでなく、カレント以下のディレクトリとその中のファイル一覧も同時に出力する。

```
ls *$x
```

### 実際のディレクトリ構造 ###
```
qiita
|
├ file1
├ file2
|
├ dir1
│　　├　file3
│　　└ file4
|
└　 dir2
 　　└　　dile5
```

### 実行結果 ###
<img width="839" alt="スクリーンショット 2017-09-27 12.23.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/175434/d5e42b60-83b9-db14-521a-6595fb99237d.png">
Javaのメモリ管理とGCViewerの見方

JVMのメモリが足りなくなってOOMKillerにころされてたアプリケーションの調査をした時のログです。
GCViewerを使ってGCのログファイルを確認してメモリ使用量の推移を見ました。

その前にJavaのメモリ管理の概要についても整理し直したので記載しています。

## Javaのメモリ管理の概要

GCViewerを見るときにはJavaのメモリ管理の前提知識が必要になります。

こちらの記事が大変参考になりました。ありがとうございます。
http://qiita.com/opengl-8080/items/64152ee9965441f7667b

> ![java memory](https://camo.qiitausercontent.com/01d13b56d6c8ab32b51ba3e973e952d2e996ca43/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f32383330322f37363634633561372d353231642d626162622d323333322d3062336136376165356639392e6a706567)
> 超ざっくりとした、メモリ構造を表した図。
> おおきく、ヒープ（Heap）領域とネイティブ（Native）領域の２つの領域がある。
> ヒープは Java プログラムが使う領域で、プログラム上で生成したオブジェクトは、このヒープ領域に配置される。
> 一方、ネイティブ領域は JVM が動くのに必要なメモリやスレッドのスタックを管理するのに使用される。

(引用元　http://qiita.com/opengl-8080/items/64152ee9965441f7667b#java-%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E7%AE%A1%E7%90%86　)


上記からヒープの中にもYoung(New)とOld(Tenurd)がある事がわかります。

GCの流れは下記のようになっているみたいです。

- 新しく作成されたオブジェクトはYoung領域のEden領域に保存される
- EdenがいっぱいになるとNew領域のGC（Scavenge GCと呼ばれる。ちょくちょく実行される）が走り、ここで破棄されなかったオブジェクトはEdenからSurvivor領域にオブジェクトが移動される
- 次にScavenge GCが走るとEdenからSurvivorへの移動は同じで、Survivor領域にいたオブジェクトで破棄されなかったものはもう一方のSurvivor領域に移動される
- これを繰り返し、異動の回数がしきい値を超えるとそのオブジェクトはOld領域に移動される
- Old領域もいっぱいになるとFull GCが走るが、これは処理に時間がかかるためこの回数は減らすべき

### 参考ページ

http://qiita.com/taisho6339/items/a6a7954bd473e16706bd
http://blog.pepese.com/entry/20120508/1336467306
http://www.whitemark.co.jp/tec/java/javagc.html

## 以上を踏まえてGCViewerを使ってみる

https://github.com/chewiebug/GCViewer/wiki/Changelog
上記がアプリケーションダウンロードのURLです。

### 使い方

ダウンロードしたアプリケーションを開いてGCのログファイルをドラッグ＆ドロップするだけです。簡単でした。

### 見方

<img width="1423" alt="Screen Shot 2017-08-30 at 16.22.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/20045/17d16d06-60c7-96f3-b51d-30827b8cfc58.png">


最初はたくさん線や領域が表示されているのですが、Viewの設定から必要なものだけに絞りました。
表示している領域と先は以下のとおりです。

- ピンクがOld領域
- 黄色がYoung領域
- ピンクの中にあるピンクの線がOld領域のヒープの使用量
- 黄色の中にある灰色の線がNew領域のヒープの使用量
- 青い線が全体のヒープ領域の使用量
- 黒い線がFullGCが走ったとき


上記から、一番右の黒い線が密集してる部分でメモリが足りなくなってOOMKillerが走ったと推測できました。

## おまけ

メモリを増やした後のGCViewerの出力です。

<img width="1430" alt="Screen Shot 2017-08-30 at 19.30.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/20045/ae02e083-728e-eb55-82b6-946f57f9bd0e.png">

安定してました。

以上です。
EclipseのJavaとGithubを紐付ける設定方法 / 2017年9月

#はじめに
表題の簡単な設定メモになります。
随時更新させていただきますので、何かございましたらご教示いただけますと幸いでございます。

ではEclipseとGithubを開いて進めていきます。
#セキュアストレージを確認する

>Windowボタンを押す
▼設定
▼セキュリティー
▼セキュアストレージ
▼内容
▼デフォルトセキュアストレージ
▼Org.eclipse.core.net.proxy.auth

『-GIT』が表示されているかどうか
なければGitを紐付ける必要があるので下記設定を進めていきます。

#チーム構成をみる（Git）
>Window
▼設定
▼チーム
▼Git
▼構成

Gitに繋ぎこむ値があるかどうか
なければ直接書き込んでいきます。

| キー | 値 | 
|:-----------:|:------------:|
| email      | (---@--.com) |
| name       | (---gitname) |

閉じる


Githubの何らかのリポジトリURLをコピーして控えておきます
https://github.com/xxxxx/xxxxx

#GithubリポジトリーとEclipseフォルダーを紐付ける

>Gitとの紐付けのボタン（右上のJavaボタンの左に表みたいなボタン）
▼Git
▼適用
閉じる


>リポジトリーソースの選択（[-]から３番目）というボタン
▼URIの複製ロケーションのURIに、先ほどのGitURLを貼り付ける
▼次へ
＊masterが出ればoK
▼次へ
完了

ここまでの流れで、Githubリポジトリーとフォルダーが紐付けされました。

>作成されているフォルダを右クリック
▼プロジェクトのインポート
▼一般的なプロジェクトとしてインポート
▼次へ
完了


＊ここで上手くできなかったら
>Window
▼設定
▼パースペクティブのリセット


[○○○○ master]のフォルダが現れるのでGithubと連携されていることがわかります。


#eclipseで作ったgithub.txtをGithubにアップロードする

>[master]フォルダを右クリック
▼新規
▼ファイル
▼今回はファイル名をここでは「github.txt」にする
入力して完了


>リポジトリフォルダーを右クリック
▼チーム
▼プル

>▼チーム
▼コミット
（コミットメッセージを書く）
コミット及びプッシュ

<img width="983" alt="スクリーンショット 2017-09-27 10.55.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/200922/94c1356d-2aaa-13a6-9efd-c5ab25abc154.png">


>Githubに入る時のユーザー名、パスワードを入力
（チェックボックスはつけない）
OK


ここまでがGithubに紐付けてアップロードになります。
[Perl]連結したリストはスカラコンテキストで直感に反する返り値をとる

こらもう絶対バグだと思った挙動が仕様だったので共有します。

## 問題のコード

```
use Moose::Role;
has zero => ( is => 'ro', isa => 'Num', default => 0 );
has num => ( is => 'ro', isa => 'ArrayRef[Num]', default =>sub {[1..9]} );
requires 'list';
```

という前提で、このロールを継承したモジュールの中で、

```
sub list {
    my $self = shift;
    ( $self->zero(), @{ $self->num() } );
}
```

と

```
sub list {
    my $self = shift;
    my @list = ( $self->zero(), @{ $self->num() } );
}
```

というように定義した場合、スカラコンテキストでの挙動に違いがあるという話です。
実は、リストコンテキストでは同じなのですが、**前者をスカラコンテキストで評価すると`@{ $self->num() }`の値のみ返します**。

## 悲しいけどこれ仕様なのよね

[perldocによると](http://perldoc.perl.org/perlop.html#Comma-Operator),

    Comma Operator

    Binary "," is the comma operator. In scalar context it evaluates its left
    argument, throws that value away, then evaluates its right argument and\
    returns that value.
    This is just like C's comma operator. In list context, it's just the list
    argument separator, and inserts both its arguments into the list.
    These arguments are also evaluated from left to right.

つまり`( $self->zero(), @{ $self->num() } )`もしくは`return ( $self->zero(), @{ $self->num() } )`などと明示的にリストを`return`するように記載をしても、カンマで区切られた返り値は`；`区切りに解釈され、**スカラコンテキストでは**

```
$self->zero();
@{ $self->num() };
````

の評価（要するに**後者の値のみ**）を返します。（リストコンテキストでは両方を連結したリストを返すので問題ありません）

調べてみてわかったのですが、これにはMooseは関係ありません。簡潔に記すと、

```
my $zero = 0;
my $num = [1..9];

sub list {
    return( $zero, @$num );
}

my ($x) = list();
my $y = scalar list();
```
という定義の下で、perlの仕様で、`$x`には`0`（リストの最初の値）が、`$y`には`9`（@$numの要素数）が代入されるということです。`10`にならないんです。直感に反しますよね？

[ご指摘を受けた](#comment-f06106e5ade99db4dd5f)のでさらに掘り下げると、サブルーチンすら関係ありません。

```
my $zero = 0;
my $num = [1..9];

my ($x) = ( $zero, @$num );
my $y = scalar( $zero, @$num );
```

としても同様です。なんじゃこりゃ[^1]

## 妥当な解決策
- 一度配列に代入する

        my @return = $self->zero(), @{ $self->num() };

- 一度無名配列を作りデリファレンスを返す

        @{ [ $self->zero(), @{ $self->num() } ] };

- `map`関数を使う

        map {$_} $self->zero(), @{ $self->num() };

サブルーチン内では、`return`はつけてもつけなくても一緒です。
`sub{}`の中の最後の評価値を自動的に`return`するのがPerlの仕様です。

## 個人的な意見

- 明示的に()付きで書き添えた場合には()内を一つのリストと見傚して欲しいです。

- または`scalar( $zero, @$num )`のように、リストを`CORE::scalar()`に与えたときに警告を発しても良いんじゃないかと。[^2]


## SEE ALSO
- 先ほど詳細を[GitHub](https://github.com/worthmine/ArrayTest)にまとめましたので追試等はこちらからどうぞ。
- [Why do I get the last value in a list in scalar context in perl? - stackoverflow](https://stackoverflow.com/questions/19689393/why-do-i-get-the-last-value-in-a-list-in-scalar-context-in-perl?newreg=b76291905c824a95a0fabaf5a539d0e0)
- [Comma-Operator in perlop](http://perldoc.perl.org/perlop.html#Comma-Operator)

[^1]: C言語からの影響とのこと
[^2]: リンク先には"Because it's useful."とありますけどね。
MacにVagrantでNFSサーバを作成する

## 実施環境

* OS: macOS Sierra (10.12.6)
* Vagrant: 2.0.0
* Virtualbox: 5.1.28 r117968
* Ansible: 2.4.0.0

## 今回のゴール
`vagrant up`だけでNFSサーバを作成する

## 今回の成果物
こちらに置いてあります
[negibouze/vagrant-nfs](https://github.com/negibouze/vagrant-nfs)

## 1. 各ツールの準備（インストール済みの場合不要）
#### step1. Homebrewをインストールする
ターミナルで下記を実行

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

#### step2. Homebrew Caskをインストールする

```
$ brew install caskroom/cask/brew-cask
```

#### step3. VirtualBoxをインストールする

```
$ brew cask install virtualbox
```

#### step4. Vagrantをインストールする

```
$ brew cask install vagrant
```

#### step5. Vagrant-vbguest pluginをインストールする

```
$ vagrant plugin install vagrant-vbguest
```

#### step6. Vagrant-hostmanager pluginをインストールする

```
$ vagrant plugin install vagrant-hostmanager
```

#### step7. Ansibleをインストールする

```
$ brew install ansible
```

## 2. Vagrantfileの作成
#### step1. 対象ディレクトリ配下で下記を実行

```
$ vagrant init
```

#### step2. vm.boxを設定
今回はpuppetlabsのCentOS 6.6(64-bit)を使用
！Puppetは使わないので「nocm」

```
config.vm.box = "puppetlabs/centos-6.6-64-nocm"
# boxがない場合、インストール
config.vm.box_url = "https://vagrantcloud.com/puppetlabs/boxes/centos-6.6-64-nocm/versions/1.0.2/providers/virtualbox.box"
```

#### step3. hostmanagerを追記

```
config.hostmanager.enabled = true
config.hostmanager.manage_host = true
```

#### step4. provisionを追記

```
host.vm.provision "ansible" do |ansible|
  ansible.playbook = "provisioning/servers.yml"
  ansible.inventory_path = "provisioning/hosts"
  ansible.limit = 'all'
end
```

## 3. Ansibleのファイルを作成 
#### step1. hosts

```
[servers]
192.168.34.212
```

#### step2. Playbook
```yaml:servers.yml
---
- hosts: servers
  become: true
  roles:
    - common
    - nfslayer
``` 

```yaml:nfslayer/tasks/main.yaml
---
# install nfs-utils
- name: install nfs-utils
  yum: name=nfs-utils state=present
# copy configurations
- name: copy idmapd.conf
  copy: src=../files/idmapd.conf dest=/etc/idmapd.conf
- name: copy exports
  copy: src=../files/exports dest=/etc/exports
# create nfs directory
- stat: path=/data/nfs
  register: dir
- name: create target directory
  file: path=/data/nfs state=directory mode=0777
  when: not dir.stat.exists
# reload exports
- name: reload NFS exports
  command: exportfs -ra
# start servieces
- name: start rpcbind
  service:
    name: rpcbind
    state: started
- name: start nfs-server
  service:
    name: nfs
    state: started
- name: enable rpcbind
  service:
    name: rpcbind
    enabled: yes
- name: enable nfs-server
  service:
    name: nfs
    enabled: yes
```

## 4. 動作確認
#### step1. 仮想マシンを作成する

```
$ vagrant up
```

#### step2. 接続確認
FileZilla等で接続してみる

![filezilla.png](https://qiita-image-store.s3.amazonaws.com/0/37319/330e5b94-0804-66e8-435b-31cc4d563680.png)

Host: Vagrantfileの「hostname」
Protocol: SFTP
Logon Type: Key file
User: vagrant
Key file: [WORK_DIR]/.vagrant/machines/[VM_NAME]/virtualbox/private_key

## 5. 参考にしたサイト

https://www.server-world.info/query?os=CentOS_6&p=nfs
GASを使ってGoogle Drive内にあるファイルのダウンロードURLからコンテンツを取得したい

# 概要
Google Apps Script（GAS）を使ってGoogle Drive内にあるファイルのダウンロードURLからコンテンツを取得するための方法について記載します。

# 問題点
Googleの拡張サービス``Drive.Files.get()``を使用した際の``exportLinks``や、DriveAppでの``getDownloadUrl()``で得られるURLはGoogleにログインしている状態でアクセスすることでファイルのダウンロードができます。しかし、GASを使って``UrlFetchApp.fetch(url)``によりそれらのURLからファイルをダウンロードしようとすると、下記のようにファイルそのものではなくHTMLが取得されたり、あるいはエラーが発生してしまいます。

## Drive.Files.get()の場合
例えばGoogle DocsをダウンロードしてそのBlobを取得しようと以下のようなスクリプトを用いると、ファイルは作成されますが、中身はHTMLになってしまいます。

~~~javascript
var url = Drive.Files.get("### file ID ###").exportLinks["application/pdf"];
var blob = UrlFetchApp.fetch(url, {muteHttpExceptions: true}).getBlob();
DriveApp.createFile(blob.setName("sample"));
~~~

この作成されたHTMLを開いてみると、ログイン画面がダウンロードされていたことが分かります。（下図）

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/133383/552182b9-39a3-6eba-7686-03565e4ed176.png)


## DriveApp.getFileById()の場合
Google Docs以外であれば下記のようなスクリプトでもダウンロードURLを取得することができます。

~~~javascript
var url = DriveApp.getFileById("### file ID ###").getDownloadUrl();
var res = UrlFetchApp.fetch(url).getBlob(); // ← ここでエラーが発生する
DriveApp.createFile(blob.setName("sample"));
~~~

この場合、下記のようなエラーが発生します。

> https://doc-04-2k-docs.googleusercontent.com/docs/securesc/#####?e=download&gd=true に対するリクエストが失敗し、コード 401 が返されました


**上記はいずれもスクリプト実行時に認証をしていないために目的のコンテンツが取得できないと考えられます。**

# 解決方法
そこで、スクリプト実行時、すなわち、``UrlFetchApp.fetch()``を実行する際に認証できるようにします。

**アクセストークンをクエリパラメータとしてダウンロードURLに追加します。**

実際は``"&access_token=" + ScriptApp.getOAuthToken()``をダウンロードURLに追加します。内容は``ScriptApp.getOAuthToken()``を使ってアクセストークンを発行し、``access_token``をキーとして追加します。アクセストークンを発行する``ScriptApp.getOAuthToken()``はなかなか便利で、一般的なスコープを自動で割り当ててくれます。これによりスクリプト実行時に認証が行われ、ダウンロードURLを使ってGoogle Drive内にあるコンテンツをダウンロードすることができるようになり、スクリプトでダウンロードしたコンテンツをBlobとして扱うことができるようになります。いろいろな応用が期待できます。

上記問題点で使用したサンプルスクリプトを修正したものは下記の通りです。

## サンプル 1
~~~javascript
var url = Drive.Files.get("### file ID ###").exportLinks["application/pdf"] + "&access_token=" + ScriptApp.getOAuthToken();
var blob = UrlFetchApp.fetch(url, {muteHttpExceptions: true}).getBlob();
DriveApp.createFile(blob.setName("sample"));
~~~

## サンプル 2
~~~javascript
var url = DriveApp.getFileById("### file ID ###").getDownloadUrl() + "&access_token=" + ScriptApp.getOAuthToken();
var res = UrlFetchApp.fetch(url).getBlob();
DriveApp.createFile(blob.setName("sample"));
~~~

これらのサンプルスクリプトは、ダウンロードURLから取得したコンテンツのBlobを使ってファイルが作成されます。

Stackoverflowでもいくつか上記に関する質問がありましたので、こちらでもその解決方法について掲載させていただきました。お役に立てましたら幸いです。
Jupyter Notebookで黒画面（テーマの変更）

## はじめに
ここのところPythonのプログラミングにJypyter Notebookを使っていますが，黒画面にしたくなりました．そこでその方法をメモ．

使用マシンは，MacBook Pro (Retina, 13-inch, Mid 2014)　です．
使っているPythonのバージョンは，Python 3.6.2　です． 

## テーマのインストール

```
pip3 install jypyterthemes
```

## 使用可能なテーマの表示

```
~$jt -l
Available Themes: 
   chesterish
   grade3
   gruvboxd
   gruvboxl
   monokai
   oceans16
   onedork
   solarizedd
   solarizedl
```
## テーマ使用のコマンド

```
jt -t oceans16 -N -T
```

## 結果
結果は以下のような感じ．私はoceans16を使っています．なぜか私の環境では，monokaiは使えませんでした．

<img width="1280" alt="Screenshot 2017-09-27 10.50.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/129300/b3c14880-1a35-cd10-ebd0-592f870640d9.png">

下の写真はグラフの部分を表示したものですが，何かおかしい．そう，軸の部分が見えない．
<img width="1280" alt="Screenshot 2017-09-27 10.51.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/129300/32521c45-87f5-c637-6a62-7769dab49ae1.png">

これを解決する，最も簡単な方法は，Python matplotlibのプログラム内で，
`facecolor='w'`を明確に宣言すること．

```
fig=figure(facecolor='w')
```

これで，グラフ全体が軸を含めて表示されます．
<img width="1280" alt="Screenshot 2017-09-27 11.11.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/129300/0f062cda-8efd-eafa-c949-f627a72b9e3e.png">

ちなみにMacでスクリーンショット（画面全体）を撮るには，以下のコマンドを使います．

```
shift + command + 3
```


## 参考サイト
[http://futurismo.biz/archives/6306](http://futurismo.biz/archives/6306)
[http://www.lisz-works.com/entry/jupyter-theme](http://www.lisz-works.com/entry/jupyter-theme)
[http://www.procrasist.com/entry/2017/09/18/130300](http://www.procrasist.com/entry/2017/09/18/130300)

以　上
MySQLのインデックスの使い方とメリットデメリット

# MySqlのインデックスについて
インデックスってレコードに対して情報が追加されてちょっと早くなるやつってくらいの認識だったので、
インデックスが適用される条件など調べてみる

テーブルあたりの最大インデックス数とインデックスの最大長は、ストレージエンジンごとに定義されます。  
(MySqlはinnoDBというデータベースエンジン)

## メリットとデメリット
WHERE句によるレコードの絞り込みが早くなる。
SELECTに限らず更新や、削除処理で対象のレコードを見つける(WHEREで絞り込む)速度が速くなる。
が、更新削除処理そのものは遅くなる。  

INSERT, UPDATE ,DELETEのコストが増える
また、インデックスによる速度低下の影響を受けないor少なくすることも出来る  

- UPDATE  
 - インデックスが張られているカラムを更新した際に、インデックスも更新されるので遅くなる
 - 速度は、更新するデータ量とインデックス数に影響する
 - データの変更のないインデックスは更新されない（のでインデックスによる速度の低下の影響はない)
- DELETE
 - レコードの削除に伴いテーブル全体のインデックスの更新が行われるため遅い
 - 削除に必要な時間は、インデックスの数に正確に比例する
- INSERT
 - レコードの挿入時にインデックスの挿入の動作も増えるため遅くなる
 - 1つのINSERT分で複数のVALUESリストを用いてまとめて挿入処理を実行することで早くなる。
   - 個別で単一のINSERT分を複数実行するより大幅に早くなる(場合によっては数倍)


# インデックスの種類と使い方
## プレフィックスインデックス
```
// インデックス追加
ALTER TABLE HOGE ADD INDEX idx_hoge(first_name(5));
```
インデックスの指定する際に[col_name(4)]のように指定することで、
文字列カラムの先頭から指定した文字のみを使用するインデックスを作成でき、インデックスファイルを小さくすることができる。
BlobやTextカラムにインデックスを指定する場合はプレフィックス長を指定する必要があるとのこと。

## ユニークインデックス
```
// 単一ユニークインデックス追加
ALTER TABLE hoge ADD UNIQUE (first_name);
// 複合ユニークインデックス追加
ALTER TABLE hoge ADD UNIQUE (first_name, last_name);
```
一意制約付きのインデックスです。
指定したカラム、または複数のカラムの組み合わせで一意となり、データの重複ができないようになる。  

## マルチカラム(複合)インデックス
```
// 複合インデックス追加
ALTER TABLE hoge ADD INDEX idx_huga (first_name, last_name, age);
```
- 複合インデックスが働くパターンは複数ある
(複合インデックスに指定したカラムを全て検索条件にいれないと動かないと思っていた)
 - 指定したカラムのプレフィックスの一番左から順に検索条件に含まれていればインデックスが活用される

例:(fist_name, last_name, age)と3つのカラムを指定し複合インデックスを設定した場合

```
1. select * from where first_name = 'hoge'
2. select * from where first_name = 'hoge' AND last_name = 'huga'
3. select * from where first_name = 'hoge' AND last_name = 'huga' and age = 30
```

## インデックスが使用される条件
- 対象のカラムと定数を比較するとき
 - 比較演算子[=、>、>=、<、<=]
 - BETWEEN句や、IN句もあてはまる
 - LIKEに関しては、先頭がワイルドカード文字から始まらない定数文字列であること
- JOINするとき
 - WHERE a.hoge = b.hoge
- 他にもたくさんあります。。。

## インデックスが使用されない場合
- ORDER BY
 - ASCとDESCを混在させる etc..
- MySqlがフルテーブルスキャンをしたほうが早いと判断したとき
 - テーブル全体のレコード数の30%以上をフェッチするとき等
- LIKEの比較の頭にワイルドカードが使われたとき
- 他にも...

以上です。
基本的に[MySQL 5.6 リファレンスマニュアル](https://dev.mysql.com/doc/refman/5.6/ja/)を参考にしました。

---
参考
[MySQL 5.6 リファレンスマニュアル  /  最適化  /  最適化とインデックス](https://dev.mysql.com/doc/refman/5.6/ja/optimization-indexes.html)
[MySQL 5.6 リファレンスマニュアル  /  最適化  /  SQL ステートメントの最適化](https://dev.mysql.com/doc/refman/5.6/ja/statement-optimization.html)
numeronym (数略語)のまとめ -- I18n、L10n、M17n、etc.

こういう

```
[a-zA-Z][0-9]+[a-zA-Z]
```

な略語をnumeronym (ヌメロニム、数略語)というそうです。
-zation、-bilityで名詞化して長くなった単語を略す時のアレですね。

### numeronym (数略語)リスト

- I18n、I18N、i18n : internationalization
国際化

- L10n、L10N、l10n : localization
ローカライズ、地域化

- L12y、L12Y、l12y : localizability
ローカライズ、地域化。いまいちL10Nとの違いはわからない

- M17n、M17N、m17n : multilingalization
多言語化。I18n+L10nの状態

- G11n、G11N、g11n : globalization
グローバル化。多言語化とほぼ同義

- A12n、A12N、a12n : administration
管理、行政

- A11y、A11Y、a11y : accessibility
アクセシビリティ、「利用しやすさ」

- V12n、V12N、v12n : virtualization
仮想化

- C14n、C14N、c14n : canonicalization
カノニカライズ、正規化

- S13n、S13N、s13n : standardization
標準化

- P13n、P13N、p13n : personalization
パーソナライズ、個人化、「個々人向けにカスタマイズすること」

- D11n、D11N、d11n : documentation
ドキュメンテーション、文書化

- E13n、E13N、e13n : europeanization
ヨーロッパ化、欧州化

- S9y、S9Y、s9y : serendipity
セレンディピティ、「なにか素敵なものを発見すること」

- N11n、N11N、n11n : normalization
ノーマリゼーション、ノーマライゼーション。情報の分野と福祉の分野で意味合いが違う

- N7m、N7M、n7m : *numeronym*

まだまだありそう。

(追加)

- D10e、d10e : decentralize
非中央集権化する。仮想通貨・ブロックチェーンの文脈でよく聞く

- D14n、d14n : decentralization
非中央集権。d10eの名詞形。


### 参考：
- 「ヌメロニム」(Wikipedia/Ja)
https://ja.wikipedia.org/wiki/%E3%83%8C%E3%83%A1%E3%83%AD%E3%83%8B%E3%83%A0

- "Numeronym" (Wikipedia/En)
https://en.wikipedia.org/wiki/Numeronym

- ほか
ConEmuの起動オプションメモ

メニューから「Help」→「About/Help」または`ConEmu64.exe -h`でヘルプを開いて「ConEmu /?」を見ると起動オプションが載っていた。
https://conemu.github.io/en/ConEmuArgs.html のほうが見やすかった。

よく使いそうなのをメモ

### 起動するShellを選ぶ

`-run {Shells}`
これだとダイアログが表示されて面倒。
コマンドプロンプトなら`-run {Shells::cmd}`、PowerShellなら`-run {Shells::PowerShell}`で開ける。
`{}`内に指定するのは「Settings」→「Tasks」(StartUp内)と対応している。

### 多重起動しない

`-Simgle`
たくさんウィンドウが開くのは嫌いだし、そもそもタブがあるので。

### 起動時のディレクトリを指定

`-Dir "開きたいパス"`

## 実際使ってみる

ランチャやファイラに登録するなどしていい感じに使う。

### ランチャ(CraftLaunch2)から起動

- `ConEmu64.exe -Single -run {Shells::cmd (Admin)}`
- `ConEmu64.exe -Single -run {Shells::PowerShell (Admin)}`

### ファイラ(あふｗ)から起動

- `ConEmu64.exe -Single -run "{Shells::cmd (Admin)}" -Dir "$P"`
- `ConEmu64.exe -Single -run "{Shells::PowerShell (Admin)}" -Dir "$P"`
C++ Builder XE4, 10.2 Tokyo > String > 行末のCRLFを削除する方法 > Trim() or StringReplace()

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)
```

### 実装内容

```cpp
String withCRLF = L"Hellow World\r\n";
```

のような文字列からCR,LFを削除したい。

StringReplace()を使う方法を従来使っていたが、Trim()でも可能とのこと。

https://stackoverflow.com/questions/6424510/removing-a-from-delphi-string
> answered Jun 9 '16 at 10:12
jcfaria

### code

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String withCRLF = L"Hellow World\r\n";

	// 1.
	Memo1->Lines->Add(L"===with CRLF");
	Memo1->Lines->Add(withCRLF);
	Memo1->Lines->Add(withCRLF);

	// 2.
	Memo1->Lines->Add(L"===without CRLF using Trim()");
	String woCRLF = Trim(withCRLF);
	Memo1->Lines->Add(woCRLF);
	Memo1->Lines->Add(woCRLF);

	// 3.
	Memo1->Lines->Add(L"===without CRLF using StringReplace");
	String wrk = StringReplace(withCRLF, L"\r\n", L"", TReplaceFlags()<<rfReplaceAll);
	Memo1->Lines->Add(wrk);
	Memo1->Lines->Add(wrk);
}
//---------------------------------------------------------------------------
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/62f20828-d223-3ace-4c2a-59733d0b9892.png)

### Trim

ビルトインヘルプによると

> System.UnicodeString.Trim
> ...
> 説明
> 新しい UnicodeString を、前後のスペースおよび制御文字を除いて返します。 

制御文字であるCR, LFを除くことができる。

### Trim() or StringReplace()?

- Trim()
    - 簡潔ではある
    - ソースを読んだ時に「意図」が分かりにくい
        - 前後のスペースを消したいのか
        - CR, LFを消したいのか
- StringReplace()
    - 簡潔でない
    - ソースを読んだ時に「意図」が分かる
        - CR, LFを消す

Trim()を使う場合は、コメントと合わせて使う方が良いように思う。

```
String wrk = Trim(srcStr); // 行末の<CR><LF>を削除
```

コメントなしの場合、意図が分からずに間違った実装に気づかない。

別途、「前後の空白が削除される」ことが意図に反するかどうかも注意点である。

1つの関数で2種類の内容を実行している関数は、意図が分かりにくいために失敗を誘発する。
また、関数のコール文においての可読性が低下する。
LogDNAを使ってみる

## 試した環境

```bash
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="17.04 (Zesty Zapus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 17.04"
VERSION_ID="17.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=zesty
UBUNTU_CODENAME=zesty
```

## LogDNA

https://logdna.com/

```bash
$ wget -qO /tmp/logdna-cli.deb http://repo.logdna.com/linux/logdna-cli.deb && sudo dpkg -i /tmp/logdna-cli.deb
$ logdna login
Email: xxxxx@gmail.com
Password: *************
Logged in successfully as:xxxxx@gmail.com. Saving credentials to local config.

$ logdna install deb #これすると以下のように出てくるので従う
echo "deb http://repo.logdna.com stable main" | sudo tee /etc/apt/sources.list.d/logdna.list
wget -O- https://s3.amazonaws.com/repo.logdna.com/logdna.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install logdna-agent < "/dev/null"
# ブラウザからSettings>Organization>Ingestion Keyを取得
sudo logdna-agent -k xxxxxxxxxxxxxxxxxxxxxxxx # this is your unique Ingestion Key
sudo logdna-agent -d /path/to/log/folders
sudo update-rc.d logdna-agent defaults
sudo /etc/init.d/logdna-agent start
```

* ``logdna-agent -d``で追加したディレクトリ・ファイルは/etc/logdna.confに追記される
* 設定の変更は``/etc/init.d/logdna-agent restart``で適用される

## まとめ

* ブラウザのLIVE機能で集約されたログをtailできる
* ``logdna tail``でローカルなどからブラウザLIVEと同じようにtailできる
* 検索が充実している(正規表現や複数条件など)
* 特定ワードでの絞り込み、ハイライト
* グラフから該当日のログ位置に飛べる
* ブラウザLIVEで日本語の検索が効かない？(``logdna tail``ではできた)
* 安い、1ユーザーならホスト・データ転送量無制限
作った Directive が有効にならない


自作 Directive の ngAfterViewInit() が発火しない。
それどころか、constructor() も動いてないっぽい。
良く見たら directive 効いてない。


## 構成

使いたい Page は、PageModule にまとめてあって、PageModule を AppModule で import (`@NgModule({imports:[page.module]})`) してます。

![module.imports1.png](https://qiita-image-store.s3.amazonaws.com/0/16860/b3a68c2d-90d5-91a7-8a68-27ec5c3593ce.png "module.imports1.png")


## 困った事

作った Directive は AppModule で declaration せよという事で AppModule の declarations に入れてます。(いちおう exports にも入れた)

そうすると、page.component のテンプレートで使用していても、my.directive の constructor() も ngAfterViewInit() も発火しないし directive 動いてない。

page.module で declaration すれば、エラーも出ず、page.component で使えるのですが、別の page.module に属する page では directive が使えず。


## directive 用に module を起こす

my.directive を登録する用の my.directive.module を作成して、directive を使いたいページと app.module で my.directive.module を import します。

![module.imports2.png](https://qiita-image-store.s3.amazonaws.com/0/16860/28de37c2-6feb-6b1d-125a-e537f3ebcc22.png "module.imports2.png")

directive を使いたい page.component が所属している page.module に直接 my.directive.module を import すれば declaration が動きます。


## 環境

ちょい古環境を固定してるので...

```
global packages:

    @ionic/cli-utils : 1.4.0
    Cordova CLI      : 7.0.1
    Ionic CLI        : 3.4.0

local packages:

    @ionic/app-scripts              : 2.0.1
    @ionic/cli-plugin-cordova       : 1.4.1
    @ionic/cli-plugin-ionic-angular : 1.3.2
    Cordova Platforms               : ios 4.4.0
    Ionic Framework                 : ionic-angular 3.5.0

System:

    Node       : v6.11.1
    OS         : macOS Sierra
    Xcode      : Xcode 8.3.3 Build version 8E3004b
    ios-deploy : 1.9.1
    ios-sim    : 6.0.0
    npm        : 3.10.10
```
Core ML を使ってみた

Core ML の基本部分を使ってみたので公開します。

# Core ML とは

まず Core ML は WWDC 2017 で発表されたフレームワークです。
このフレームワークを使うことで、学習済みの機械学習モデルを macOS / iOS / watchOS / tvOS で簡単に利用できるようになります。
すでに学習済みのモデルを使用するためサーバーへのアクセスは不要で、デバイスのスタンドアロンで使えて、かつプライバシも守られるというのがメリットです。

対応している機械学習ライブラリも、 Caffe / Keras / XGBoost / scikit learn / turi / LIBSVM など様々です。


## 実装サンプル

Xcode9 beta が必要になりますので、インストールします。(要 Developer 登録)
Xcode9 でモデルを組み込みたいプロジェクトを開いて、すでにある学習済みモデル(.mlmodelファイル)を Xcode 上へのドラッグ&ドロップでプロジェクトに追加します。
(モデルのサンプルが開発者向けのサイトで4つ公開されています。いずれも画像解析用のモデルです。※2017/6/21時点)

この時点で、Xcode が .mlmodel ファイルを解釈して、モデルを使うためのクラスを自動生成してくれます。
あとはこのクラスを使うだけです。

使い方をコードで説明します。

```swift:swift
let model = Resnet50() // モデルを使うためのクラスを生成
 
func prediction(image: UIImage) {
    // モデルへの入力形式に変換
    guard let buffer = buffer(from: image) else { return }

    // image をモデルに入力して結果を受け取る
    guard let scene = try? model.prediction(image: buffer) else {
        fatalError("Unexpected runtime error.")
    }
     
    // ラベルに出力
    resultLabel.text = scene.classLabel
}
```

まずは、モデルを使うためのクラスを生成、インスタンス化します。
このモデルが受け取る形式が CVPixelBuffer なので、UIImage をこの形式に変換します。
( buffer() は別途定義しているメソッド)

あとは、変換した CVPixelBuffer を model に食わせてあげると、結果が受け取れます。
最後に結果を出力します。

モデルによって出力と入力の型が違うので、多少実装に差は出てきますが、大まかな流れはこんな感じです。
本当に簡単に機械学習モデルを使うことができました。


## .mlmodel ファイルの生成

.mlmodel ファイルを生成するために「Core ML Tools」というものが提供されています。
これは python 製のオープンソースソフトウェアで前記した機械学習ライブラリのファイルから、.mlmodel ファイルを生成するものです。

Appel のセッションでデモされていましたが、こちらも数行のコードを書くだけで動作していました。


# 所感

いままでも、iOSデバイスなどで機械学習モデルを利用することはできたのですが、
Core ML の発表で、iOS Developer にとっても機械学習がグッと身近なものになっていくと思います。

iOS11 以降で iPhone での体験がより良いものになっていく予感を感じました。
Xcode の Debug Memory Graph が便利

Xcode のデバッグ時に使う機能である、「Debug Memory Graph」を紹介します。
Debug Memory Graph はデバッグ中にメモリの状況を可視化する機能です。
画面は Xcode8.3.3 です。

# 使い方
まず起動方法ですが、プロジェクトをデバッグ実行した上で、エディタの下にあるこのボタンをクリックします。
すると Debug Memory Graph が起動します。

![スクリーンショット_2017-09-27_11_07_31.png](https://qiita-image-store.s3.amazonaws.com/0/26659/537bbd64-f3dc-37c4-0eff-0a972ff442e0.png)




起動すると、下の画像のようにメモリの参照関係が可視化された状態で表示されます。
これだけでいろいろ参考になるのですが、左のペイン下にあるボタンをクリックすることでリークしてるメモリだけを表示することもできます。
リークしてる場合は参照が循環していたりします。

![スクリーンショット_2017-09-27_11_08_26.png](https://qiita-image-store.s3.amazonaws.com/0/26659/ee960ef7-97c6-052a-7666-cc72d3bf5e23.png)


また、エディタ部分の上をクリックすると生存しているオブジェクトがすべて表示されます。
これがけっこう便利で、本来1つだけ生存してるべきオブジェクトが複数確認できるとどこかでリークしている可能性があるなど、
色々な判断に使えます。

![スクリーンショット_2017-09-27_11_09_09.png](https://qiita-image-store.s3.amazonaws.com/0/26659/8f294ca1-ca6b-ba9b-8600-22996d236772.png)

基本的な使い方は以上です。
原因不明に落ちるなど、メモリリークが疑われる場合はかなり役立つ機能だと思います。
他にも便利な使い方などあれば、コメントいただけると幸いです。
nodejsでsvgをpngに変換する

svgexportというモジュールを使います．

npm install -g svgexport
でインストールできます．

```js:svg_to_png.js
var svgexport = require('svgexport');

var input = [{
  "input": ["./input.svg"],
  "output": [["./output.png",]]
}]

svgexport.render(input, function (result) {
  console.log("done", result);
});
```


$node svg_to_png.js
で，同じ階層にあるinput.svgファイルをoutput.pngに変換できます．
FacebookのオープンソースなライブラリのMIT化がスタートしてた

# なにしてんの？

FacebookによるオープンソースのライブラリのライセンスがBSD+PATENTSからMITライセンスに変更されはじめています。

# なんで？

Facebookによるオープンソースのライブラリは、BSD3+PATENTSで出されていて、
そのPATENTSによってかんたんに言うとFacebookを訴えたら使うことができない状態になっていました。
ほんでそれが問題になり、企業で社内利用禁止になったり、更にはApache Software FoundationからNOを突きつけらていました。
それでもFacebookは一度、変えるつもりはなさそうなことを言っていたのですが、結局まずいと思ったのかMITに変更するようです。（細かい経緯も知りたい）

# 変更してるやつ

変更がかかってて私が気にしてるやつ

* [React](https://github.com/facebook/react)
    * MIT化から少し立ってv16になりました。 
    * [fbjs](https://github.com/facebook/fbjs/tree/master/packages/fbjs)
* [Prop-types](https://github.com/facebook/prop-types)
    * MITになった
* [Flow](https://github.com/facebook/flow)
    * MITになった
    * PATENTSが残ってね？
        * 突っ込んだら [commit](https://github.com/facebook/flow/issues/4985) してれたよ
     * PATENTS消えました
* [Jest](https://github.com/facebook/jest)
    * MITになった
* [Immutable.js](https://github.com/facebook/immutable-js)
    * これから？ https://github.com/facebook/immutable-js/issues/1309
* [React-native](https://github.com/facebook/react-native)
    * new!
    * MITになった

# TODO

* なんか変な条件が残ってないか見とく
* この話の流れを確認できるリンクを書く

# 追記(2/20)

* React-nativeもMITになったそうです。
    * [commit](https://github.com/facebook/react-native/commit/26684cf3adf4094eb6c405d345a75bf8c7c0bf88)
Javascriptのfilterメソッド、mapメソッドについて

#filterメソッド
###**条件に一致したものだけを抽出できる**

```js

var numbers = [3, 2, 4, 6, 1, 8, 6];

var result = numbers.filter(value => value < 3)

console.log(result);


//=> [2, 1]
```

### filterメソッドは3つの引数を受け取ることができる
| コールバックの引数|定義|
|:-----------------|:-----------------------------|
| value            | 配列の要素の値                  |
| index            |  配列要素の数値インデックス       |
| array            | 要素を格納している配列オブジェクト |


```js

var numbers = [配列データ];

numbers.filter( function(value, index, array) {})
```

### 第２引数のオブジェクトについて

```js

var stationeries = {
  'pencil': 100,
  'notebook': 80,
  'scissors': 250,
  'sticker': 150 
};

var tools = ['notebook', 'eraser', 'sticker', 'screw', 'paint'];

var result = tools.filter( function(value, index) {
  for (var stationery in this) {
    if (stationery === value) return value;
  }
}, stationeries) //第2引数にオブジェクトを指定

console.log(result);


//=> ["notebook", "sticker"]
```
第2引数にオブジェクトを指定すると、コールバック関数内のthisは呼び出しオブジェクトを参照する



#mapメソッド
###**配列の順番通りに、各要素に対して一度ずつ呼び出して新しい配列を作る**

```js

var numbers = [1, 2, 3, 4];
var result = numbers.map(value => 2 * value)
console.log(result);


//=> [2, 4, 6, 8]
```
### mapメソッドは3つの引数を受け取ることができる
| コールバックの引数|定義|
|:-----------------|:-----------------------------|
| value            | 配列の要素の値                  |
| index            |  配列要素の数値インデックス       |
| array            | 要素を格納している配列オブジェクト |


```js

var numbers = [配列データ];

numbers.map( function(value, index, array) {})
```
### 第２引数のオブジェクトについて
```js

var stationeries = {
  'pencil': 100,
  'notebook': 80,
  'scissors': 250,
  'sticker': 150 
};

var tools = ['notebook', 'sticker'];

var result = tools.map( function(value, index) {
  for (var stationery in this) {
    if (stationery === value) return this[value];
  }
}, stationeries) //第2引数にオブジェクトを指定

console.log(result);


 //=> [80, 150]
```
第2引数にオブジェクトを指定すると、コールバック関数内のthisは呼び出しオブジェクトを参照する
ATOM エラー原因となる文字化けを可視化。


最近、MacのATOMでコーディングをしていると、不可視文字が入力されてしまいエラーでるようになりました。
slackでも文字化け対象になる豆腐文字によるものだと思われます。
ATOMで特定の文字をハイライトしたいというのが今回の目的になります。  

下の方法でエラーの原因の文字を可視化出来るようにしました。

不可視文字を可視化するためのプラグインをインストール
---
[show-ideographic-space](https://atom.io/packages/show-ideographic-space)をインストール。
(全角スペースを可視化してくれるためのプラグイン。とても便利。)
こちらのプラグインの中身を加筆して豆腐文字を可視化していきます。
※修正ファイルのバックアップは各自とるようにしてください。

プラグイン内のファイルを修正。
---
修正ファイルは2つです。

```~/.atom/packages/show-ideographic-space/lib/show-ideographic-space.coffee
'':
  type: 'highlight'
  class: 'tofu'
```
show-ideographic-space.coffeeの10行目あたりの文字charMapの中身に上記を追加します。
''の中にエラーの対象となる文字を貼り付けてください。

```~/.atom/packages/show-ideographic-space/styles/show-ideographic-space.less
atom-text-editor, atom-text-editor::shadow {
  .highlight.tofu {
    .region:after {
      color: #800000;
      content: 'X';
      background-color: #CCCCCC;
    }
  }
}
```
最下部に上記を追記します。

Atomを再起動することによって、豆腐文字がハイライト及びXという文字が入るようになっています。
Atom上ではこのような見た目になります。
---
<img width="249" alt="SS 2017-09-27 10.22.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/140048/5f547bea-1c35-99a4-3ccb-e271982b26d2.png">


以上になります。
そのうちATOM側で修正されるかと思いますが暫時対応として参考になれば。

参考記事
https://teratail.com/questions/39267