OmniAICreator/Qiita-1.07M huggingface dataset:
Android Studio3 スマホで自作のアプリを動かそう

##前書き
今回は、Android端末（スマホ）をUSBでつないで、アプリを実行させるところまで書いていきます。（ほぼ備忘録…）
前回の予告で、アプリ開発も予定しておりましたが、ちょっとスマホの接続設定が長くなってしまったので、
アプリ開発は、次回に持ち越します。
##スマホをUSB経由でPCに接続
ここで扱うスマホは『Xperia Z5』 となりますので、機種によっては手順が異なるかもしれません。
##スマホの設定で、開発者モードを有効にする
![android-3-01-2.png](https://qiita-image-store.s3.amazonaws.com/0/184036/a7f28f40-21d5-b395-83b3-4e129545e8e5.png)
[設定] -> [端末情報] -> [ビルド番号]を連続タップ
「あなたは今開発者になりました！」が表示されればOKです。
##スマホの設定で「USBデバッグ」を有効にする
![android-3-02-2.png](https://qiita-image-store.s3.amazonaws.com/0/184036/ed513ee0-d0e8-9d30-f8ea-61a592ac452f.png)
[設定] -> [開発者向けオプション] -> [USBデバッグ] On
「USBデバッグを許可しますか？」が表示されたら、[OK] をクリック
##スマホをUSBでPCに接続
![android-3-03-2.png](https://qiita-image-store.s3.amazonaws.com/0/184036/ebb0cbf3-73df-e329-48ab-d5ebb7c62f39.png)
スマホ側に「USB接続の用途」画面が表示されるので「ファイルを転送する」を選択
*今までは、この時点で、スマホ用のドライバやXperia Companionをインストールする必要がありましたが、Windows10ではもはや不要になった様子。*
##サポートする「API Level」を修正する
今回使うスマホは「Android 7.0 (API Level 24)」なので、このバージョンが含まれるように build.gradle を修正します。
なるべくいろいろな端末で動くようにするには、下記OS別シェアを確認して、最低API Levelを設定します。
[Android OS別シェア](https://developer.android.com/about/dashboards/index.html?hl=ja)
今回は、Lollipop(Level 21) でかなり改修されたのと、Lollipop 以降で80%程度のシェアがあるので、最低レベルの設定となるminSdkVersionを「21」とします。
![android-3-04-2.png](https://qiita-image-store.s3.amazonaws.com/0/184036/9cb3f5ea-c9f3-add8-7a07-11e9296f0241.png)

```モジュールのbuild.gralde(app/build.gradle)
compileSdkVersion 26  //コンパイル時に使うAndroid SDKのバージョン（最新推奨）
minSdkVersion 21     //Lollipop以降を指定
targetSdkVersion 26  //ターゲットとするSDKバージョン（最新でよい）
```
右上の[Sync Now]をクリック
##スマホでアプリを動かしてみる
![android-3-05-2.png](https://qiita-image-store.s3.amazonaws.com/0/184036/6673e366-8540-5813-6ce8-4697bb814744.png)
ひとまず、[Run] -> [Run 'App']でアプリを実行させます。

![android-3-06-3.png](https://qiita-image-store.s3.amazonaws.com/0/184036/40b06c18-4e86-9cee-ebc6-284382cfff39.png)
実行するデバイスの選択画面が表示され、上部にスマホが出てきます。
コメント「Press 'OK' in the 'Allow USB Debugging' dialog on your device」に従い、スマホ側で「USBデバッグ」を許可します。
![android-3-07-3.png](https://qiita-image-store.s3.amazonaws.com/0/184036/cb635135-14a9-850c-9235-e07a4286906f.png)
スマホ側に「USBデバッグを許可しますか？」と出るので、「このパソコンからのUSBデバッグを常に許可する」をチェックして[OK]をタップ

![android-3-08-2.png](https://qiita-image-store.s3.amazonaws.com/0/184036/d3dcebc1-637c-6adf-46c1-698e9a7b57ef.png)
[Connected Devices]の欄に、スマホのバージョンが表示されました。
[Sony SOV32(Android 7.0, API 24)]を選択して[OK]をクリック

![android-3-09-2.png](https://qiita-image-store.s3.amazonaws.com/0/184036/dd9070db-96ec-5bb6-51d0-881db3122fbf.png)
せっかくなので、[Install and Continue]をクリックしてインスタントランしてみましょう！

![android-3-10-2.png](https://qiita-image-store.s3.amazonaws.com/0/184036/cabaea45-dece-b73a-17df-835e5af9698c.png)
おなじみの[Component Installer]画面。[Done]が表示されたら[Finish]をクリック

![android-3-11-2.png](https://qiita-image-store.s3.amazonaws.com/0/184036/24b8a78f-4c55-db80-df82-0dcb13f6baf6.png)
スマホに「POC App」アプリが起動され、中央に「Hello World!」が表示されれば大成功です。

スマホで自作アプリを動かすことができました！
##アプリ終了
![android-3-12-2.png](https://qiita-image-store.s3.amazonaws.com/0/184036/f5568443-69e9-c435-5b3c-1e91f923186d.png)
Android Studio側からアプリを終了するには、右上の四角ボタンをクリック（または、ショートカット「Ctrl + F2」でもOK）
##次回予告
次回、ようやく開発に入りますよ。最初の開発は、OkHttp3を使って、簡単にPOST/GETするアプリです。こうご期待！
Webpackerのメモ

Webpacker周りのメモを書いていく。

##environmentのデフォルトの中身
```
Environment {
  loaders:
    Map {
      'babel' => { 
        test: /\.(js|jsx)?(\.erb)?$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: [Object]
      },
      'coffee' => {
        test: /\.coffee(\.erb)?$/, loader: 'coffee-loader'
      },
      'elm' => {
        test: /\.elm(\.erb)?$/,
        exclude: [Array],
        loader: 'elm-hot-loader!elm-webpack-loader?cwd=/Users/eijiosakabe/Documents/data/my_pg/my_project/idol_calendar&pathToMake=/Users/eijiosakabe/Documents/data/my_pg/my_project/idol_calendar/node_modules/.bin/elm-make&verbose=true&warn=true&debug=true'
      },
      'erb' => {
        test: /\.erb$/,
        enforce: 'pre',
        exclude: /node_modules/,
        loader: 'rails-erb-loader',
        options: [Object]
      },
      'file' => {
        test: /\.(jpg|jpeg|png|gif|svg|eot|otf|ttf|woff|woff2)$/i,
        use: [Array]
      },
      'style' => {
        test: /\.(scss|sass|css)$/i, use: [Array]
      },
      'typescript' => {
        test: /\.(ts|tsx)?(\.erb)?$/, loader: 'ts-loader'
      },
      'vue' => {
        test: /\.vue(\.erb)?$/,
        loader: 'vue-loader',
        options: [Object]
      }
    },
  plugins:
    Map {
      'Environment' => EnvironmentPlugin { keys: [Array], defaultValues: [Object] },
      'ExtractText' => ExtractTextPlugin { filename: '[name]-[contenthash].css', id: 1, options: {} },
      'Manifest' => ManifestPlugin { opts: [Object] }
    }
}
```

##public/assets以下の静的ファイルが404になる
おそらくwebpackerとasset pipelineを同時に使おうとしている場合になるぽい。
正確な原因はわからなかったが、解決策はwebpackerのoutput_pathとasset pipelineのoutput_pathが同じ"assets"であったため。
webpackerの方を"packs"に変えたら問題なくファイルを返すようになった。
cpeNamesをpseudoで検査しよう

cpeNamesをvulsに登録することで、パッケージ以外のミドルウェア等を検査する。
; 既に出ているネタですが、~~エントリ水増し~~復習として。

# cpeNameを特定する

[go-cpe-dictionary](https://github.com/kotakanbe/go-cpe-dictionary)のデータべエースを利用して、cpeNameを特定する。

```
$ sqlite3 ./cpe.db 'select name from cpes' | grep cisco | grep ios:15.6
cpe:/o:cisco:ios:15.6%280.17%29t
cpe:/o:cisco:ios:15.6%281%29t0a
cpe:/o:cisco:ios:15.6%282%29sn
cpe:/o:cisco:ios:15.6%282%29sp
cpe:/o:cisco:ios:15.6%282%29sp1
cpe:/o:cisco:ios:15.6%283%29m
cpe:/o:cisco:ios:15.6%283%29m1b
cpe:/o:cisco:ios:15.6%283%29m2
cpe:/o:cisco:ios:15.6%283%29m2a
cpe:/o:cisco:ios:15.6%283%29m3
$
```

`15.6%283%29m3`は`15.6(3)m3`のような感じなので、適当に正しそうなものを選択する。

- 該当しそうなベンダ名で探してみる。
- ルータ等であれば、ベンダと型番で調べてみる
    - `cpe:o:yamaha:rtx1200:バージョン`とか
- 脆弱性更新ではないものは、バージョンとして登録されていな場合がある
- そもそもNVDのCVEほど高頻度の更新ではないかもしれない

多分、他の方がcpeNamesの見つけ方等を書いてくれるはず。

# config.tomlに登録して、スキャンする

こんな感じでconfig.tomlに登録する

```
[servers.network]
type="pseudo"
cpeNames = [
  "cpe:/o:cisco:ios:15.5t",
  "cpe:/o:yamaha:rtx1200:10.01.22",
  "cpe:/o:yamaha:rtx1100:8.03.83",
]
```

あとはいつもどおりスキャンするだけ。
pythonで画像のアスペクト比を維持したままサイズ変更して余白を埋める

##やりたいこと
###540x700の画像を16:9の1920x1080に変更したい(比率は変えず)

1. 1920x1080サイズ時まで拡大した際のサイズを求める
2. 横、縦それぞれに掛ける倍率を出す
3. 540x700と縦の700の方が大きいので700を基準に計算
4. 1080 / 700 = 約1.5 で約1.5倍
5. (縦のサイズ)700 x 1.5 = 1050
6. (横のサイズ)540 x 1.5 = 810
7. 540x700の画像は1920x1080の16:9の比率で拡大をすると810x1050となる
8. そしたら1920x1080まで余白を黒くする

微妙な30の隙間の埋め方がわからないので、誰か教えてくれると嬉しいです。

以下コード

```py3:image_aspect.py
# -*- coding: utf-8 -*-
from PIL import Image

class image_aspect():

    def __init__(self, image_file, aspect_width, aspect_height):
        self.img = Image.open(image_file)
        self.aspect_width = aspect_width
        self.aspect_height = aspect_height
        self.result_image = None

    def change_aspect_rate(self):

        img_width = self.img.size[0]
        img_height = self.img.size[1]

        if img_width > img_height:
            rate = self.aspect_width / img_width
        else:
            rate = self.aspect_height / img_height

        rate = round(rate, 1)
        self.img = self.img.resize((int(img_width * rate), int(img_height * rate)))
        return self

    def past_background(self):
        self.result_image = Image.new("RGB", [self.aspect_width, self.aspect_height], (0, 0, 0, 255))
        self.result_image.paste(self.img, (int((self.aspect_width - self.img.size[0]) / 2), int((self.aspect_height - self.img.size[1]) / 2)))
        return self

    def save_result(self, file_name):
        self.result_image.save(file_name)

# example
if __name__ == "__main__":
    image_aspect('./test_dir/test.jpg', 1920, 1080)\
        .change_aspect_rate()\
        .past_background()\
        .save_result('result.jpg')
```
P2Pネットワークとは

今回はブロックチェーンを支える**P2Pネットワーク**について紹介します。
できる限り「Short & Simple」を心がけます。
なお、私もブロックチェーン初学者なので、内容に誤り等ありましたらご指摘いただけると幸いです。

## P2Pネットワークとは
P2P（peer-to-peer）ネットワークとは、以下のような条件を満たすネットワークのことを指す。

- ネットワークに参加しているノード（コンピュータ）がすべて同等の立場である
- 特別なノードがない
- すべてのノードがサービスを提供する負荷を分担している

以上より、P2Pネットワークでは「サーバ」や「ネットワーク内の階層」は存在しない。
P2P技術を用いたサービス例としては、winnyなどの「ファイル共有サービス」が挙げられる。

## 長所
- 一部のノードが故障や停止しても全体は影響を受けない（ゼロダウンタイムの実現）
- 規模が大きくなればなるほど対象外性に優れていく

## 短所
- 規模が大きくなればなるほど全体性能は悪くなる
- システムを止めたくても簡単には止められない
- 悪意のあるノードも参加できる

## ブロックチェーンでの応用
ブロックチェーンはP2Pネットワーク上のシステムであり、参加しているノードすべてが同じブロックチェーンのデータを保持する。なお、同じデータを参照していることを保証・検証するために、ハッシュ関数が用いられている。
参加者全体でブロックチェーン（取引データ）を監視することで、改ざんや不正使用を困難なものとしている。

## 参考文献
- [いちばんやさしいブロックチェーンの教本](https://www.amazon.co.jp/いちばんやさしいブロックチェーンの教本-人気講師が教えるビットコインを支える仕組み-「いちばんやさしい教本」シリーズ-杉井靖典-ebook/dp/B075CFG2TY/ref=sr_1_1?ie=UTF8&qid=1511787155&sr=8-1&keywords=いちばんやさしいブロックチェーンの教本)
- [Mastering Bitcoin](https://www.amazon.co.jp/ビットコインとブロックチェーン-アンドレアス・Ｍ・アントノプロス-ebook/dp/B072JJL66R/ref=sr_1_2?s=digital-text&ie=UTF8&qid=1511787188&sr=1-2&keywords=mastering+bitcoin)
Hammerspoonを使ってキーボードでマウスを操作するf

# はじめに

Hammerspoonを使って、キーボードを使ってマウス操作を行うことを目的としている。
いかに、ホームポジションを崩さずにMacを操作するかにこだわると、ここまで手を加えておくべきかと。
実際に手に馴染むかは不明...

# ざっくりの手段

調べた感じ2つ便利なプラグインがあるので、どっちかを使えば良さそう
お好みに合わせてどうぞ、です。

* FnMate
http://www.hammerspoon.org/Spoons/FnMate.html
「Fn」キーを使ってうまいことやろうってやつ


* Hammerspoon Vi Mouse
https://github.com/tweekmonster/hammerspoon-vimouse
Viのキーバインドでマウスカーソル操作しちゃおうってやつ。
※ ライセンスに関して何も記載されていなく、作者の方のレスポンスもなしの状態のため利用するのは自己判断で。

# ドキュメント

ソースコードいじってみたくなったときは、公式ドキュメントでAPIを確認しながら
http://www.hammerspoon.org/docs/index.html
VimからApexのLanguage Serverを使う

## はじめに

この記事は [チームスピリット Advent Calendar 2017](https://adventar.org/calendars/2207) の5日目です。
VimからApexのプロジェクトを扱う方法を探していたところ、ApexのLSP実装 [^1] があるらしいです。わくてかわくてか。

[forcedotcom/salesforcedx-vscode: Salesforce Extensions for VS Code](https://github.com/forcedotcom/salesforcedx-vscode)
VSCode のプラグインに内包しちゃってますね。スタンドアロンじゃないのかよ。そんなわけで今回は言語サーバーを立ち上げているJARをプラグインから抜いてきてVimで使います。

[^1]: タグジャンプや補完、構文チェックなどの各種言語機能を提供するサーバーの通信プロトコルのこと。 [Microsoft/language-server-protocol: Defines a common protocol for language servers.](https://github.com/Microsoft/language-server-protocol)

## サーバーJARを落としてくる

```shell-session
$ wget 'https://github.com/forcedotcom/salesforcedx-vscode/blob/develop/packages/salesforcedx-vscode-apex/out/apex-jorje-lsp.jar?raw=true'
```

JARをダウンロードし、呼び出しやすいファイル名にリネームしておきます。

## 起動確認

```shell-session
$ java -cp apex-jorje-lsp.jar -Ddebug.internal.errors=true -Ddebug.semantic.errors=false apex.jorje.lsp.ApexLanguageServerLauncher
```

一旦シェル上で起動することを確認してみます。引数はデバッグオプションがない場合にプラグイン内部で使われるコマンドをそのまま使っています。
標準入力でリクエストを受け付けるので、入力待ちの状態でプロセスが待機状態になれば成功。

## Vim の下準備

まず、VimがApexファイルであることを判別するためにApexの言語プラグインが必要です。

* [ejholmes/vim-forcedotcom: Force.com syntax highlighting in vim.](https://github.com/ejholmes/vim-forcedotcom)
    正規表現を使った構文ハイライトのみが含まれます。

* [neowit/vim-force.com: Vim plugin for force.com](https://github.com/neowit/vim-force.com)
    補完やデプロイ機能などApexのプロジェクト管理機能も豊富ですが、Language Serverと競合する場合があるかもしれません。
    正規表現を使った構文ハイライトを含み、オートインデントはJavaのものを流用しています。依存している `channel` のAPIの仕様がVimとNeovimで異なるため、Neovimでは一部の機能が利用できません。

次に、Vim側にLanguage Serverのクライアントとなるプラグインが必要です。Neovimであれば
* [autozimu/LanguageClient-neovim: Language Server Protocol support for neovim and vim.](https://github.com/autozimu/LanguageClient-neovim)
が実績もありおすすめです。(というか他をあまり知らない)

## Vim の設定

先程のサーバー起動コマンドをVimのクライアントプラグインに設定して、Apexのファイルを開いた時にサーバーが起動されるようにします。
上記で上げたクライアントプラグインを前提としたサンプルコードです。

```vim
let g:LanguageClient_serverCommands = {
      \ 'apex': ['java', '-cp', expand('/path/to/apex-jorje-lsp.jar'), '-Ddebug.internal.errors=true', '-Ddebug.semantic.errors=false', 'apex.jorje.lsp.ApexLanguageServerLauncher'],
      \ }
```

`/path/to` はJARの保存場所に適宜書き換えておいてください。

## じゃじゃーん!!

取っておいたスクリーンショットが会社製品のソースコードを丸々含んでいたのでupしませんでした。
後日upしますのでお手元で試して見てください。

## 使ってみた感想

* VSCode版と比較もしたい(クライアントの実装状況に差があるため)が、VSCode版を使っていないので断念。
* 補完の精度の検証もしたいが、そもそもApexの言語仕様をよく分かっていないので断念。
* 正規表現ベースの構文ハイライトが時々おかしいのはLanguage Serverではどうしようもない。
* テスト/デプロイなどの機能はない。これはLSPの仕様にないため、他のプラグインで補うしかない。
* 途中まで文字を入力 -> 補完をした場合に、入力された文字を無視した補完候補を出すのだが、これはクライアント側の仕様? VSCode版使っている人がいたら教えてください。
env コマンド

# env

この記事は [Linux コマンド 全部オレ Advent Calendar 2017](https://adventar.org/calendars/2630) の5日目の記事です。

```
NAME
       env - run a program in a modified environment

SYNOPSIS
       env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]

DESCRIPTION
       Set each NAME to VALUE in the environment and run COMMAND.
```

## よく使いそうな使い方

引数なしで実行すると、設定されている環境変数を表示する（`printenv` と同じ）

```
[sinsengumi ~]$ env
HOSTNAME=test
SHELL=/bin/bash
TERM=xterm-256color
HISTSIZE=500
SSH_CLIENT=10.129.153.39 49392 22
SSH_TTY=/dev/pts/86
HISTFILESIZE=100
USER=sinsnegumi
LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lz=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.bz=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.rar=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:
TMOUT=32400
PATH=/usr/kerberos/bin/:/sbin/:/bin/:/usr/bin/:/usr/local/bin/::/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/opt/dell/srvadmin/bin:/home/sinsnegumi/bin
MAIL=/var/spool/mail/sinsnegumi
INPUTRC=/etc/inputrc
PWD=/home/sinsnegumi
LANG=en_US.UTF-8
HOME=/home/sinsnegumi
SHLVL=2
LOGNAME=sinsnegumi
CVS_RSH=ssh
SSH_CONNECTION=10.129.153.39 49392 10.128.188.156 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/bin/env
```

`-i` で一時的に環境変数を無効化したりできるがあまり使わなそう。
非エンジニアによる、ほどよいSQLライフについて

　「Livesense Advent Calendar 2017-学- 6日目」に失礼します。
#自己紹介
　はじめまして、こんにちは。新卒1年目のtomoharu33と申します。
　会社では営業職を半年間ほど経験し、つい先日からマーケターのお仕事をしています。もちろん非エンジニアで、大学時代は地理学専攻、会社では村長と呼ばれているような男です（ちなみにまだ23才です、念のため）。
　そんなある日、とあるエンジニアの先輩に「ちょっとこの[URL](https://qiita.com/advent-calendar/2017/livesense-gaku)開いてくれる？」と言われたが最後、気付いたらLivesense Advent Calendarに参加する~~羽目に~~ことになりました。本当にありがたい気持ちでいっぱいです。この機会に、非エンジニア新卒としてリブセンスに入社してからの、ほどよいSQLライフについてお話できればと思います。
　お時間ある方はぜひ最後までお付き合いください。

#営業職もクエリをたたく
　リブセンスには、"Business & Engineeing"というカルチャーがあります。営業職はただ足を動かして販売だけすればよい、というわけではなく、[必要なデータは基本的には自分でクエリを書いて抽出](https://www.slideshare.net/livesense/150225-sql-foreveryone-45695818)し、自分で分析を行い、それを自分でクライアントに説明する、という包括的な仕事が求められます。
　例えば、あるクライアントのアルバイト求人への応募数が突然減ってしまったとします（注.アルバイト求人サイト「[マッハバイト](https://j-sen.jp/)」を運営しています）。その場合、流入元に大きな変化はないか、競合他社に応募が流れているのではないか、はたまた単なる季節要因なのではないか、などと仮説を立てて、その検証に必要なデータをSQLを書いて取ってきます。「セレクト、フロム、ウェア、グループ・バイ！」は営業チームの合言葉です(ヤバイ会社ではありません)。
　そんな文化に魅力を感じ、弊社に入社させていただきました~~（人事に言えと脅されたわけではありません、いや本当に）~~。なかなか営業職でSQLや数値分析ができる会社も多くはないと思うので、本当に素晴らしい文化だなあと思います。とはいえ、まだまだ知らないテーブルやカラムだらけなので、今行なっている分析も氷山の一角に過ぎないと思いますが…。
　「大切なことはすべてデータが教えてくれる」 、そのモノトーンなデータに色をつけること、客観的な指標をわかりやすく説明すること、それがリブセンスの営業の使命だと考えています。

#非エンジニアも参加可能な勉強会の多さ
　他の会社でどれくらい勉強会が行われているかがわからないので確証はありませんが、非エンジニアも気軽に参加できる勉強会や催し物が多い気がします。
#### 1. SQL道場
　営業職向けの「[SQL道場](https://japan.zdnet.com/article/35099445/2/)」では、まず基礎的なクエリの読み書きから始まります。WHEREの意味を学んだり、INNER JOINやLEFT JOINについて学んだりします。そして卒業試験では、実際の社内DBのデータを分析してクライアントに響く提案を考えるなど、かなり高度な内容を扱います。講師が満足のいく内容でなければ留年です(平均2週間くらい留年します)。もちろん、教えてくれる講師も非エンジニアの先輩です(たまにインフラのやばい人も来ます)。
####2. LA night
　@myn さんも[Advent Calendarに書いていました](https://qiita.com/myn/items/0bbe824afa4613f6a3e1)が、リブセンスでは[LAという分析基盤を自社で用意しています](https://speakerdeck.com/livesense/ribusensufalsedetafen-xi-ji-pan-falsequan-mao)。その活用事例やエピソードなどを共有する「LA night」では、エンジニア・非エンジニア関係なく、様々な職種の社員が登壇して、おもしろおかしく武勇伝を繰り広げています。この間のLA nightで学んだ実行計画(EXPLAIN)は業務でもよく使っています。今回のAdvent Calendarでもそれについて書こうと思いましたが(EXPLAINを解読してみた！的な)、ちょっと諦めました(すみません)。
####3. 0x64物語reboot
　技術系のトピックを共有する社内LT会「[0x64物語reboot](http://sssslide.com/speakerdeck.com/livesense/wen-hua-falserihuakutaringu)」も、職種問わず参加することができます。さすがに専門性が高く~~何言ってるかよくわからない~~ので、いつも美味しくビールをいただいています。エンジニアはアルコール類へのこだわりが強いので(偏見)、聞いたこともないようなビールがたくさん並んでいます。ちゃんと話も聞いてますよ。


他にも、ロジカルシンキングやWebマーケティングなどを学べる「[鉄人講座](https://www.wantedly.com/companies/livesense/post_articles/78193)」(@asuciiさんが[書いています](https://qiita.com/asucii/items/cf55007e65cf49e470c2)) や、Excelがメモ帳から表計算ソフトに変わるExcel勉強会など、技術系に限らず様々な勉強会が行われています。しかもだいたいドキュメントが残っているので、いつでも復習可能。素晴らしい環境じゃありませんか。

#おわりに
　以上、つらつらと日常を書いてみました。エンジニアでなくても、技術に興味のある人・技術を学びたい人はどこの会社にも一定数存在するんじゃないかなと思います。けど非エンジニアにとっては、「非エンジニア歓迎！」とか「営業職向け」とか書いていないと、なかなか参加しづらいものです(僕だけかもしれませんが…)。
　SQLの面白さを知ったので、今度はプログラミングにも挑戦してみたいです。誰か一緒に勉強会やりましょう(できればPHPかRails希望です)。来年のAdvent Calendarではきっと、Go言語の素晴らしさとかについて書いてるんでしょうね。そうなってたらいいな。
【Swift4.0】JSON型からData型へ, Data型からJSON型へ【SwiftyJSON】


メモ

前提：SwiftyJSONを使用

```swift
import SwiftyJSON
```

Data -> JSON

```swift

    /**
     dataToJSON
     Data型オブジェクトをJSONに

     params
     data:Data型オブジェクト
     return JSON or nil
     */

    func dataToJSON(data: Data) -> JSON? {

         return JSON(data)

    }
```

JSON -> Data

```swift

    /**
     jsonToData
     JSON型オブジェクトをDataに

     params
     jsonObject:JSON型オブジェクト
     return Data or nil
     */

    func jsonToData(jsonObject: JSON) -> Data? {
        
        do {

             return try JSON(jsonObject.dictionaryObject as Any).rawData()

        } catch SwiftyJSONError.invalidJSON {

            print("Invalid JSON Error")

        } catch {

            print("Undefined Error")
        }

        return nil

    }
```
PowerShell に疑似 which コマンドレットを定義

諸事情で小ネタを書きます．既出かどうか確認していません．

Unix 系における which コマンドのようなことをする方法が以下の記事に書かれていました．
[PowerShellでwhichコマンド](https://qiita.com/Hiraku/items/e42bc5756157949a9742)

これをコマンドレットとして定義します．

```bash
# quasi-which
function which($arg) {
  gcm $arg | fl
}
```

上記コードを `$profile` に追記すると使えるようになります．

## （追記）よりよい定義

よりシンプルかつ本来の which に近い定義は以下のとおりです（Thanks, @KyoPeeee ）：

```bash
# quasi-which
function which($arg) {
  (gcm $arg).Definition
}
```

本文で書いた Format-List (fl) によるものは， Definition 以外の色々な情報も合わせて吐き出します．
どちらかというと bash の `type` をリッチにしたようなものかもしれません．（参考：[Linux基本コマンドTips（13）：【 type 】コマンド――シェルがどのコマンドを起動しているかを知る - ＠IT](http://www.atmarkit.co.jp/ait/articles/1605/20/news017.html)）
Rubyでエクセルを操る方法（roo、roo-xls）


Rubyでエクセルを操作するには、色々なgemがあるそうです。
私が今回使ったのは`roo`というgem

# 準備
```ruby
irb> require 'roo'
=> true

irb> Roo::Spreadsheet.open("2.xlsx")
```

これだけ！！

# 使い方
```ruby
# シート名取得
irb> file.sheets
=> ["112", "113"]

# 112シートの1行目
irb> file.sheet('112').row(1)

# 112シートの1行目の1列目
irb> file.sheet('112').row(1)[0]

# シートで繰り返し
irb> file.each_with_pagename do |name, sheet|
irb>  name # シート名
irb>  sheet.row(1)[0] # 対象のシートの1行目の1列目
irb> end
```

# 落とし穴1（.xlsは使えない）

で、ここまで来て落とし穴がありまして`.xls`ファイルだと上手くいかない。

```ruby
irb> file = Roo::Spreadsheet.open("1.xls")

ArgumentError: Can't detect the type of 1.xls - please use the :extension option to declare its type.
```

オプション付けろ！みたいな感じだから、色々調べると

```ruby
irb> file = Roo::Spreadsheet.open('1.xls', extension: :xls)

ArgumentError: Can't detect the type of 1.xls - please use the :extension option to declare its type.
```

あーよくわからないけど、ダメじゃこりゃってなった。
けど、よくよく調べると`roo-xls`ってのがある

```ruby
irb> require 'roo-xls'
=> true

irb> file = Roo::Spreadsheet.open("1.xls", extension: :xls)

=> <#Roo::Excel:1775230432073564 @filename @workbook @options @cell @cell_type @cells_read @first_row @last_row @first_column @last_column @header_line @formula @fonts>

irb> file.sheets
=> ["112", "113"]

irb> file.sheet(0).row(0)
=> [”あ”, ”い”]
```

使い方は、今の所全く同じでいけそうだ。

# 落とし穴2（型がおかしくなる）- 未解決！
ただし！　なんか変な動きするので共有しておく

## 日付がセルによって数値になる
```ruby
# 2014/12/31
irb> file.sheet(1).row(1)[0]
=> #<Date: 2014-12-31 ((2457023j,0s,0n),+0s,2299161j)>
irb > file.sheet(1).row(1)[0].class
=> Date

# 2014/12/01
> file.sheet(1).row(2)[0]
=> 41974.0
> file.sheet(1).row(2)[0].class
=> Float
```


## 数値がセルによって`Float`になる
```
# 112
> file.sheet(1).row(3)[0]
=> 112.0
> file.sheet(1).row(3)[0]
=> Float
```

困っております...
組合せ最適化でタイルペイントを解く

Advent Calendar 5日目の記事 [組合せ最適化でステンドグラスを解く](https://qiita.com/SaitoTsutomu/items/12b2562d13543a4180a3)
Advent Calendar 7日目の記事 [組合せ最適化で因子の部屋を解く](https://qiita.com/SaitoTsutomu/items/bf825e14c686e2393c1e)

## これなに

**タイルペイント**を、Pythonで[組合せ最適化](https://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)モデルを作って解きます。
解く楽しみは、モデル化を工夫することになります。

自分でも試してみたい人は、下記を参考にしてください。

- [数独を通して組合せ最適化を学ぼう](https://qiita.com/SaitoTsutomu/items/bd09190d8a02432b3f16)

## 問題

- 盤面上にある、太線で区切られた部分（タイルと呼ぶ）のいくつかを黒く塗ります。
- 盤面の数字は、その右あるいは下の、1行あるいは1列のうちで、黒く塗られるマスの数を表します。
- どのタイルも、全てのマスを塗るか全てのマスを塗らずにおくかのどちらかとし、タイルの一部のマスだけを塗ってはいけません。

左が問題で、右が答えです。

![](https://raw.githubusercontent.com/SaitoTsutomu/opt4puzzle/master/pic/tile.png)

Pythonでは、`data`（タイルのグループの文字）、`hint_v`（各行の合計）`hint_h`（各列の合計）、を使うことにします。

```py3:python
import pandas as pd, matplotlib.pyplot as plt
from pulp import LpProblem, lpSum, value
from ortoolpy import addbinvars
data = """\
ABCD
EBFF
GHHI
JKLI
""".splitlines()
hint_v,hint_h = [1,2,3,2],[1,4,1,2]
```

## 変数表

下記のような変数表を作成します。各行の変数(Var)は0または1をとります。
変数の値が1ならば、該当行 該当列のマスを黒く塗ります。
`字`は、該当マスの属するタイルのグループです。

<table><tr><th></th><th>行</th><th>列</th><th>字</th><th>Var</th></tr>
<tr><th>0</th><td>0</td><td>0</td><td>A</td><td>v000001</td></tr>
<tr><th>1</th><td>0</td><td>1</td><td>B</td><td>v000002</td></tr>
<tr><th>...</th><td>...</td><td>...</td><td>...</td><td>...</td></tr>
</table>

```py3:python
ni, nj = len(data), len(data[0])
a = pd.DataFrame([(i,j,data[i][j]) for i in range(ni)
    for j in range(ni)], columns=list('行列字'))
a['Var'] = addbinvars(len(a))
a[:2]
```


## 数理モデルを作り解く

変数表ができたので、タイルペイントの解になるように、制約条件を追加し数理モデルを作成し、解きましょう。

- 各行の合計が指定された数に等しい。
- 各列の合計が指定された数に等しい。
- 各タイル内は全て塗るか塗らないか。

```py3:python
m = LpProblem()
for i in range(ni):
    m += lpSum(a[a.行==i].Var) == hint_v[i]
for j in range(nj):
    m += lpSum(a[a.列==j].Var) == hint_h[j]
for _,v in a.groupby('字'):
    for vi, vj in zip(v.Var, v.Var[1:]):
        m += vi == vj
m.solve()
```

### 結果の表示

```py3:python
a['Val'] = a.Var.apply(value)
plt.imshow((a.Val<0.5).values.reshape(ni,nj), cmap='gray', interpolation='none')
plt.show()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13955/55aa346d-4db1-b6de-6a6f-fada3f9f9ce2.png)

解けていることが確認できます。

以上
Herokuで環境変数を設定する方法

この記事は、「岩手県立大学 Advent Calendar 2017」の4日目の記事です。
https://qiita.com/advent-calendar/2017/ipu

本日は、Herokuで環境変数を設定する方法を書きたいと思います。
開発をしているとAPIキーやパスワードなど、ステージング環境や本番環境などで異なる環境変数を設定したい時が出てくるかと思います。
そのような時、Herokuを使っているユーザは、`heroku`コマンド一発で簡単に環境変数を設定する事ができます。
その手順を、下記に記載したいと思います。

# Heroku CLIをインストールする
まず準備として、Heroku CLIをインストールします。
ターミナル上で`heroku`コマンドを利用するために必要な手順です。

```zsh
$ brew install heroku/brew/heroku
```

`brew`コマンドで簡単にインストールする事ができます。
正常にインストールされているから、バージョンを確認してみましょう。

```zsh
$ heroku --version
heroku-cli/6.14.36-15f8a25 (darwin-x64) node-v8.7.0
```
バージョンが確認できました。`heroku`コマンドが正常にインストールされていますね。

# 環境変数を設定する
環境変数関連のコマンドを下記に記載します。

## 環境変数を設定する
```zsh
$ heroku config:set ENV_VAR="環境変数を指定" --app "アプリ名を指定"
```

## 環境変数を取得する
```zsh
$ heroku config:get ENV_VAR
```

## 環境変数を削除する
```zsh
$ heroku config:unset ENV_VAR
```

以上、備忘録でした！
「E382: 'buftype'オプションが設定されているので書き込めません」の解決策



neovimを使ってterminalモードでgit commitすると、設定によっては以下エラーが出てcommitできないことがあります。

```
E382: 'buftype'オプションが設定されているので書き込めません
```

エラーの原因はこれみたいです。

```
tnoremap <silent> <ESC> <C-\><C-n>
tnoremap <silent> jj <C-\><C-n>
```

上記を削除するとエラーを回避できます。

[Fablic.vim](https://fablicvim.connpass.com/)にて、凄腕vimmerに教えて頂きました。
Webpackの出力をZopfliで圧縮する

Webpackの出力をZopfliで縮小しようとしたところ、（過去の話ですが）妙なところでつまずいてしまいました。

# Zopfliって？

以前に[記事を書いた](https://qiita.com/jkr_2255/items/f3dfdf08267f2a8b590a)ので詳細はそちらに譲りますが、

* Googleが開発した圧縮アルゴリズム
* Deflate（zip/gzip/PNGなどなど）互換
* 圧縮率は通常のDeflateに対して数%向上、圧縮時間は数倍以上

こんな圧縮アルゴリズムです。Webpackで生成するようなアセットは、一度生成すれば一定の期間使うようなものなので、デプロイの過程にZopfli圧縮を入れれば、単なるgzip転送よりさらにコンパクトにできます（[Sprocketsに仕込んでみた例](https://qiita.com/jkr_2255/items/62e1aecadfcf7b4e24fc)）。

# プラグインの設定が…できない！？

Webpackでよく使われる圧縮プラグインとして[compression-webpack-plugin](https://github.com/webpack-contrib/compression-webpack-plugin)がありますが、説明ページを見ていると、設定の`algorithm`として`zopfli`を選べる…ように書いてありました。

で、そのとおりに仕掛けてみたのですが、一向に動きません。悪戦苦闘しつつも調べてみれば、（入れようとした当時の）少し前のバージョンでZopfli対応は別なパッケージに切り出され、**説明だけ放置されていた**という驚愕の事実が判明してしまいました（もちろん、今では[修正されています](https://github.com/webpack-contrib/compression-webpack-plugin/issues/76)）。

# Zopfli版を入れる

このようなとんでもない現実に直面するも、正しいパッケージがわかったので、気を取り直して[zopfli-webpack-plugin](https://github.com/webpack-contrib/zopfli-webpack-plugin)を入れることにしました。とはいえ、このプラグインも内部で[node-zopfli](https://github.com/pierreinglebert/node-zopfli)という、C言語のZopfliコードをそのまま利用するパッケージを入れているので、ビルドにはいくつか必要なものがあります。

* npmの`node-gyp`、`node-pre-gyp`パッケージ（グローバルに必要っぽい）
* Python 2系列
* C/C++コンパイラ

あっという間にヤクの毛まみれになりますが、用意するのは最初1回だけですし、Linux系では最初からあるものも多いので、まあ何とかなる範囲です。

インストールが完了すれば、あとの引数は`compression-webpack-plugin`と同じ形なので、そのまま`require`を置き換えるだけで、Zopfliに入れ替えることができます。

# 教訓

公式の解説すら、ときに間違える
Seleniumで新規タブを開く

クリックをして新規タブで開く（Macの場合のキーバインドと同様の指示を書く）

```
element.send_keys(:command, :enter)
```

新規の空タブを開いて用意して、そこに指定したURLを開く
selenium上で任意のjavascriptを実行するexecute_scriptメソッドを使用

```
driver.execute_script("window.open()")
new_window = driver.window_handles.last
driver.switch_to.window(new_window)
driver.get('新規タブで開きたいURL')
```
新卒ENGが出くわした頻出IT用語集

[株式会社オズビジョン](http://www.oz-vision.co.jp/)の@h_kamadaです。

私は今年4月に新卒として入社した新米エンジニアです。特段スキルが高いわけでもなく、日々エンジニアリングについて学んでいる真っ只中です。学ぶことが多い中で、入社当初のエンジニアを苦しめたもの、それがIT用語（ビジネス用語）でした。要するに横文字・カタカナ文字です。私がIT業界に入って出くわしたIT用語をまとめてみます。「◯◯ってどういう意味？」「業界違うけどなんか気になる」「将来のために予習しておきたい」といった方々の助けに少しでもなれたら嬉しく思います。
※私自身のなぐり書きメモのため「定義広すぎない？」「間違ってない？」という箇所も存在するかと思いますが（コメントでご指摘もらえれば喜びます）、あくまで参考程度にご覧いただければ幸いです。


# エンジニア関連
## SDK
Software Development Kit。アプリを作るときの道具セット。
## IDE
総合開発環境。開発するときに使うと便利。XcodeとかEclipseが有名。AWS Cloud9期待してます。
## デプロイ
システムを使える状態にすること。
## アジェンダ
議題。
## 恒久対策
一度起こった問題がまた起こらないように考えて対処する。
## リダイレクト
Aページにアクセスした人をBページに移動させる機能。
## httpレスポンス
httpリクエストが正常に完了したかを表すコード。200, 403, 500など。いっぱいあるのでググってみてください。
## fix
確定する。例）明日のスケジュールってfixですか？
## WAF
Web Application Firewall。Webサイトを攻撃から守ってくれる頼れる相棒。
## エンコード
簡単に読めないように加工する。符号化。
## デコード
エンコードされたものをもとの状態にもどす。複合化。
## 閾値
しきい値。境目のことで、超えたらエラーを出すときなどに用いられる。
## ブラックボックステスト
システムの中身は見ず、外見からテストケースを作るテスト方式。
## ホワイトボックステスト
システムの構造を意識してテストケースを作るテスト方式。
## マイグレーション
新しいシステムやプラットフォームへの引っ越し作業。
## レガシーコード
読みにくいコード、雑なコード、テストがないコードなど定義が様々。
## モンキーテスト
その場の思いつきで操作して動作確認するテスト。非エンジニアでも実施しやすい。
## バリデーション
入力した内容の形式などがルール通り書かれているかを確認する作業。


# ビジネス関連
## ASP
Affiliate Service Provider。アフィリエイターと広告主を仲介業者のこと。インターネット上の広告代理店のようなもの。
## NPS
Net Promoter Score。顧客ロイヤリティを数値化する指標。
顧客ロイヤリティ：顧客があるブランドや商品、またはサービスに対して感じる「信頼」や「愛着」のこと。
参考：https://www.emotion-tech.co.jp/resource/2016/customer-loyalty)
## HR
Human Resources。日本企業でいう人事に近い役割。
## KGI
Kay Goal Indicator。最重要目標達成指数。
## KPI
Kay Performance Indicator。最重要業績評価指数。
## R&D
研究開発。
## ピボット
事業の「方向転換」や「路線変更」を表す用語。
## SEO
検索エンジン最適化。ググったときに一番上に表示されるように対策すること。
## UX
User Experience。ユーザーがある製品やシステムを使ったときに得られる経験。ユーザ体験。
## 仮説キャンバス
事業を整理し、検証するためのツール。
## チャネル
製品を消費者まで届けるための流通経路。
## コンバージョン
定義した成果。企業・業界によって成果の定義はまちまち。例として、会員登録、商品購入などの行動を指す。
## エビデンス
証拠や根拠のこと。システムが仕様書通りに動作したことを証明するための書類やデータなど。
## eNPS
従業員ネットプロモータースコア。従業員に対して、友人・知人が就職・転職をするとしたとき、「自社への入社をどの程度推奨するか」を聞くもの。
## インプレッション
Web上に広告が表示された回数。
## シンギュラリティ
技術特異点。人工知能が人間の能力を超えることで起こる出来事。
## インセプションデッキ
プロジェクトの全体像(目的、背景、優先順位、方向性等)を端的に伝えるためのドキュメント。
## lp
Landing Page。伝えたい情報を縦長の1ページに集約して、特定のユーザに最適化する。キャンペーンなどを行うときに用意されることが多い。
## ctr
Click Through Rate。インターネット広告が表示された回数のうち、クリックされた数の割合を表す。クリック率。
## MTG
ミーティング。
## BMC
ビジネスモデルキャンパス。組織活動を9つの要素に分類し、それぞれがどのように関わり合っているかを描き出すフレームワーク。
## DMU
Decision Making Unit。顧客の意思決定関与者。
## OKR
Objective and Key Result。チームや個人の目標を明確化する仕組み。
## KPT
Keep Problem Try。振り返り手法の一つ。今後も続けていきたいこと・問題点・次やることを書き出す。



# まとめ
横文字多すぎる。でもどれも重要だし覚えて損はない。

# 終わりに
次回の更新は弊社サービスでフロントエンド開発のリードエンジニアを務める@noukaからReact.jsについて共有してもらいます。学び続ける姿勢を忘れない、尊敬できるエンジニアです。私よりも技術的な内容になると思うのでぜひお楽しみに！
Unity5.6で、「InvalidOperationException: Operation is not valid due to the current state of the object System.Collections.Stack.Pop () (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections/Stack.cs:329)」

久々Unity5.5のAndroidアプリを、Unity5.6で、アップデートとしてひらくと
下記エラーでPC上でも実行できない。

```
InvalidOperationException: Operation is not valid due to the current state of the object
System.Collections.Stack.Pop () (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections/Stack.cs:329)
```

プラットフォームがPCになっているかなとおもって、AndroiｄにSwitchPlatformしても、
かわらず。

ググルっていくつかひっかかるも、わからず、、
そういえばUnity2017で、fabricのSDKが動かないくなったのが怪しいとおもって、
**Crashlytics(fabric)SDKのUnitypackageを入れ直したら**、
**動いた**。。！

（泣）

Unity版CrashlyticsSDKはここからダウンロードしました。
https://docs.fabric.io/unity/fabric/overview.html
意味的類似性の定量化：WordNetについてNO.1

少し勉強したことを備忘録程度にまとめました。

### Semantic Similarityとは
* `意味的な類似性`のこと
* 意味が似ている単語が存在する。`馬⇔ロバ`と`馬⇔人間`。どっちの組み合わせの方がより似ているだろうか。たぶん前者。
* 意味的な類似性を定量的に把握したくなってくる。

### どんな時に定量的に把握したいか
1. 意味的に似た単語同士をクラスタリングしたい
2. テキスト含意認識（textual entailment）
    * 2つの文章が同じ意味合いを含んでいるかを判定する。
    * 検索すると、NECさんのサイトが上位に出てくる
        * http://jpn.nec.com/ai/analyze/text.html
    * `Recognizing Textual Entailment(RTE)`で検索するとたくさん出てくる。

### WordNetとは
WordNetとは、`似たもの同士の関係性によって相互リンクされた意味的な単語辞書`のこと。単語間の関係性の辞書が無料で利用できる。
含まれる情報の例としては、以下のようなものがある。

* part of speech(品詞)
* synonyms(同義語/別名)
* hypernyms/hyponyms（上位語/下位語）
    * 例えば、哺乳類(上位)-人間(下位)みたい
        
WordNetは階層構造で組織されている。多くの類似性の測定にこれらの階層が利用される。また、品詞ごとに異なる階層を保持。

日本語のWordNetは以下のサイトをご覧ください。国立研究開発法人情報通信研究機構（NICT）が、大規模&誰でも入手できる日本語の意味辞書開発を目的に、2006年から日本語wordnetの開発を進めている。

* http://compling.hss.ntu.edu.sg/wnja/


例えば、日本語のWordNetをもとに、試しに「人間」というキーワードを検索してみる。すると、いくつか計5個の[検索結果](http://compling.hss.ntu.edu.sg/wnja/)が出た。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/3ce1c783-e938-e65e-222c-923a4d2d96e3.png)

今回は一番上位にヒットした結果をみてみると、以下のように記載。日本語と英語それぞれで意味的に同質（=類似性が高い=同義語）な単語のクラスタがヒットする。

```
ヒト, ホモ, ヒト属, 人, 人間
man, human being, human, homo
```

これらのさらに詳細情報へ[遷移](http://compling.hss.ntu.edu.sg/omw/cgi-bin/wn-gridx.cgi?usrname=&gridmode=wnja&synset=02472293-n&lang=jpn&lang2=eng)する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/fc499d9f-afa2-ac74-06c2-c36482dfc685.png)


以下のような詳細情報が記載されている。

* Definition(`人間`の定義)
    * Japanease
    * English

* Relations(`人間`の関連情報)
    * Hyponym（上位概念語）
    * Hypernym（下位概念語）
    * Meronym–Part（部分/一部を示す語）
    * Holonym–Member（ある語の部分/一部）
    * In Domain–Category
        * 誰か教えてください。
    * Semantic Field（意味的なフィールド）


これらを次回はPython使っていい感じにimportします。（English）
独学なので間違っていたら指摘ください。
Androidの英字キーボードの確定でafterTextChangedが発火しない件

こんにちは、僕の記事はこれで今年最後となります。
[ニジボックス](https://nijibox.jp)で球拾いをしています、tack.saitoです。
「エンジニア」と、胸を張って言えなくなりつつあるので記事を書いて心を保ってます。


## 要件
- 文字を入れて、確定したタイミングでAPIを叩きたい

ほうほう、簡単だわ。ぐーぐる先生ー。

## 実装

```xml:activity_main.xml
        <EditText
            android:id="@+id/search_edit_text"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:maxLines="1"
            android:inputType="text"
            android:imeOptions="actionSearch"
            android:hint="テキスト..." />
```

```java:MainActivity.java
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText editText = findViewById(R.id.search_edit_text);
        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                //未入力はダメ。
                if (TextUtils.isEmpty(s.toString())) {
                    return;
                }
                //確定されたかのチェック
                boolean unfixed = false;
                Object[] spanned = s.getSpans(0, s.length(), Object.class);
                if (spanned != null) {
                    for (Object object : spanned) {
                        if ((s.getSpanFlags(object) & Spanned.SPAN_COMPOSING) == Spanned.SPAN_COMPOSING) {
                            unfixed = true;
                        }
                    }
                }
                if (unfixed) {
                    return;
                }

                //なんか処理を。
                Toast.makeText(MainActivity.this, "確定したよ", Toast.LENGTH_SHORT).show();
            }
        });
    }
```

へへ、[いろんな所](https://qiita.com/amay077/items/73da05ab80d23e28703a)に書いてあったぜ！
ありがとうございます〜〜〜！！！
余裕だぜ〜〜 (昨日の俺)

## 問題発生
- **英字キーボードだと、確定しても検索しないんだけど？？**

そんなバナナ。ってか英字キーボードってなんだなんだ〜？

## 原因
英字キーボードだと、確定したタイミングでafterTextChangedが発火しないことがあるっぽい。
サジェストされた中から選択なら発火するみたい。(変化していれば)
「the」って打って、サジェストされた 「the」を選択しても発火しない模様。
まぁそっか。
日本語に慣れてるから、確定ってTextChanged!!って感じするけど、まぁそりゃそっか。

## 改修
```java:MainActivity.java
        editText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                    // なんか処理
                    Toast.makeText(MainActivity.this, "確定したよ", Toast.LENGTH_SHORT).show();
                }
                return false;
            }
        });
```
ってわけで、
`onTextChanged`や`afterTextChanged`に頼らず、
SEARCHボタンを押したら発火するようにしました。(最初っからそれはやっておけって感じですね)

実際は、Toast部分は共通処理で空かチェックしたりして、API叩くような感じにするのかなーと。
いやはや、英字キーボードは触らなかったから気がつかなかったなー。
nativeBase deckSwiper onSwipeRight/onSwipeLeftで現在のカードの情報を取得する。

2017/12/5

```
import React, { Component } from 'react';
import { Image } from 'react-native';
import { Container, Header, View, DeckSwiper, Card, CardItem, Thumbnail, Text, Left, Body, Icon } from 'native-base';
const cards = [
  {
    text: 'Card One',
    name: 'One',
    image: require('./img/swiper-1.png'),
  },
　{
    text: 'Card Two',
    name: 'Two',
    image: require('./img/swiper-2.png'),
  },
  .  .  .// 繰り返しの意
];
export default class DeckSwiperExample extends Component {
  render() {
    return (
      <Container>
        <Header />
        <View>
          <DeckSwiper
            dataSource={cards}
            // この行にさっきの行を挿入する
            renderItem={item =>
              <Card style={{ elevation: 3 }}>
                <CardItem>
                  <Left>
                    <Thumbnail source={item.image} />
                    <Body>
                      <Text>{item.text}</Text>
                      <Text note>NativeBase</Text>
                    </Body>
                  </Left>
                </CardItem>
                <CardItem cardBody>
                  <Image style={{ height: 300, flex: 1 }} source={item.image} />
                </CardItem>
                <CardItem>
                  <Icon name="heart" style={{ color: '#ED4A6A' }} />
                  <Text>{item.name}</Text>
                </CardItem>
              </Card>
            }```
          />
        </View>
      </Container>
    );
  }
}
```

```
onSwipeRight={() => Alert.alert('Hi!')}
```
で、右にスワイプすると、アラートでHi

```
onSwipeRight={item => Alert.alert(item.text)}
```
で、右にスワイプすると、アラートで、今のページのタイトルが表示される。
またconst cardsの中に、description: 'Awesome'などと入れると、
item.descriptionなどと参照できる。
これさえ分かれば、大体のことは出来る。

また25枚以上デッキを増やせないようで、nativeBaseの問題でなく、
paginationの問題らしい。
(nativeBaseはviewのみ扱う)（今どうなってるかはわからない）
マニュアル翻訳の訳語について

Juliaのマニュアルの翻訳に参加している内田といいます。
別に、主催者でも何でもなくて、翻訳サイト
(https://hshindo.github.io/julia-doc-ja-v0.6/)
を見つけたので勝手に参加している感じです。
もうすぐver1.0の仕様も凍結されようかという時期ですが
(https://discourse.julialang.org/t/1-0-feature-freeze-dec-15th/7209)
まだver0.6の半分も翻訳されていないのに、アクティブに翻訳している人が少ない状況なので、
手のあいている方は、参加されるといいんじゃないでしょうか。
手順としては、
https://github.com/hshindo/julia-doc-ja-v0.6/
をforkして
https://github.com/hshindo/julia-doc-ja-v0.6/tree/master/doc/src/manual
以下のmdファイルを翻訳して、pull requestをだしたら
https://hshindo.github.io/julia-doc-ja-v0.6/
に取り込まれて公開されるという流れですね。
翻訳がダブらないように、どこを翻訳するかという宣言もかねて、先にpull requestを出しておいたほうがいいと思います。

現在、マニュアルは「モジュール」まで、翻訳されているんですが、僕自身は「関数」から「モジュール」までを翻訳しました。が、もっちゃりした感じの翻訳になりがちなので、特に「メソッド」あたりは、修正が必要だなと思っています。翻訳の質も量もまだまだですが、本番は1.0だと思って、試行錯誤しながら翻訳している状況です。
訳語に関してもそうで、"TranslationTable.md"という対訳表もあるのですが、参考にしつつも、別の語のほうがいいんじゃないかと、必ずしも従わずに翻訳を進めています。
特に型や多重ディスパッチ関連は、Juliaに独特なものが多いので、今時点でこれがいいんじゃないかと思う訳語をあげていきたいと思います。
マニュアルの中にはintuitiveって言葉が結構出てきいて、僕は「直感」ではなく「直観」と訳しています。ちょっと哲学っぽくて難解な感じがいまいちだと思いますが、辞書によると、「直感」は感覚に訴えかけるもので、「直観」は先入観・世界観に逆らわずに受け取れることのようです。人それぞれ、価値観が違うと思いますが、すんなりと頭に入ってくる用語を目指したつもりです。


- 型に関するもの

|英語        |日本語       |
|:----------:|:----------:|
|abstract type|抽象型|
|concrete type|具象型|
|primitive type|原始型|
|composite type|複合型|
|type unions|合併型|
|declared type|宣言型|
|umbrella type|包括型|
|parametric type|パラメトリック型|
|union-all type|全合併型|
|supertype|スーパータイプ|
|subtype|サブタイプ|

まず、型に関する用語は"parametric"とくっつけて複合語として使われるものが多く、しかもパラメトリックにいい訳語を思いつかなかったので、ほかの言葉は、できるだけ、漢字の訳語をあてました。
中国語のサイト(https://github.com/JuliaCN/julia_zh_cn/blob/master/manual/types.rst)
もみましたが、ちょっと古くてあんまり参考になりませんでした。
(型に関する用語はver0.5→ver0.6でだいぶ替わっているので)
"type unions"は中国語では共用体型ですが、合併型と訳しました。
ver0.6から"composite type"は"struct"を使って宣言するようになったので、共用体、構造体でお揃いになるんですけど、あまりC言語自体とはかかわりなさそうなので、やめました。
あと、具象型は、具体型という訳も考えたんですけど、Haskellや型理論の界隈では「inhabited type」の訳語として定着しているようなので、避けてみました。
"supertype","subtype"は「スーパータイプ」「サブタイプ」と訳してみました。
オブジェクト指向になじみのある人は「スーパークラス」「サブクラス」からの類推でわかりやすいかとおもったのですが、いっそのこと「上位型」「下位型」としたほうがいいのかなあという気もします。


- 多重ディスパッチに関するもの
 
|英語        |日本語       |
|:----------:|:----------:|
|generic|汎化|
|specific|特化|
|catch-all|全捕捉|

"generic" と "specific"を「汎化」と「特化」でそろえてみました。
特に、"generic"は「総称型」とか「総称関数」のように「総称」という訳語がそれなりに定着しています。しかし、Juliaではできるだけ一般的な型を推論によって特定して、より効率的な最適化をおこないコンパイルする、という「汎化」から「特化」へという標語がふさわしい言語だと思うので、個人的にこの訳語を押していきたいです。

- その他

|英語        |日本語       |
|:----------:|:----------:|
|built-in|標準装備の|
|assertion|表明|
|type annotation|型注釈|
|iterable|イテラブル|

"built-in"に対して「標準装備の」というのは、強引な訳かと思いますが、"primitive"との違いを強調する訳語として使ってみました。標準装備というのは、ライブラリのようなもので、一番原始的なものではないというニュアンスのつもりです。
アサーションとアノテーションは漢字の言葉に訳してみましたがカタカナとどちらがいいのかわかりません。
「イテラブル」はpythonの本([fluent python][入門 Python 3])でもこのままでした。訳しづらい。

以上、中途半端ですが、いろいろ訳語を選んだ理由など、書きましたがどうだったでしょうか。
ご意見を頂ければ参考にしたいと思います。
Firebaseを使ってリアルタイムにみんなでyoutubeを視聴するwebアプリを作ってみた

## とりあえずこんな感じです

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">test <a href="https://t.co/bSUltsrwTF">pic.twitter.com/bSUltsrwTF</a></p>&mdash; seiya (@sk1121) <a href="https://twitter.com/sk1121/status/937992624031416320?ref_src=twsrc%5Etfw">2017年12月5日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

夜会社でモクモクしてる際に、みんなイヤホンをしてますが、
その時に同じ曲聴きながら仕事できたら素敵やんということで、遊び感覚で作ってみました。
(そしたら、思いの外デザイナーの方も巻き込みマジに作り込んでしまったのはここだけの話)

## できること
- フリーテキストでのYoutube検索
- キュー機能
- 動画再生
- コメント機能

## 主な利用技術
- [Firebase Realtime Database](https://firebase.google.com/docs/database/?hl=ja)
- [Youtube API](https://developers.google.com/youtube/v3/getting-started?hl=ja)

## 基本的にやってること
### Firebase Realtime Database
以下の値を管理し、各クライアントからその情報を参照しています。

- 再生されているyoutubeの動画ID
- 再生しているか一時停止しているか
- 選択されている動画リスト
- コメント

Firebase Realtime Databaeに関して、以前[ざっくりまとめ](https://qiita.com/seiya1121/items/1436fde30752843daa47)たので、
こちらを参照してください。

### Youtube API
以下のAPIを取得しています。

- [キーワード検索](https://developers.google.com/youtube/v3/docs/search?hl=ja)

### React
各APIの操作と、ビューの描画はReactで行っています。
しれっとサービス上でルームとかも作れたりするので、ちゃっかり[React Router](https://github.com/ReactTraining/react-router)も使ってます。

## まとめ
FirebaseとYoutube APIを組み合わせるだけで、思いの外面白いアプリができました。
しかも、工数全然かからず機能の実装ができました。
というか、google様さま過ぎるw(8割firebaseのおかげと言っても過言ではない)
せっかくならビューはangularにすれば良かったw

Youtubeの規約の問題で再生できない動画があったり、
バグがあったり、パフォーマンスが著しく下がる時がたまにありますが、
興味あるからいましたら是非、ぽちぽちしてみてくださいw
(気が向いたら改修しますw)

https://session-now.herokuapp.com

## ちなみに...
[Atrae](https://www.green-japan.com/company/172?job_offer_id=34785)では、モノづくりに熱中できる仲間を全力で[探しております！](https://www.green-japan.com/job/51812?jo=blur_pc)
最近、会社の技術ポートフォリオも多様化してきており、
サービスのフェーズや性質、時代にあった技術を自分発信で導入してくださる方大歓迎です!w
さあ、何でもDBに持っていくのやめよ

# はじめに
どうも。1年経ってもMacに慣れない@Ntdoyです:relaxed:
今日は若手エンジニア向けにシステム設計のお話でも。

みなさん、パフォーマンスを意識した設計はされてますか？
ボトルネックは昔から変わりません。そう、データベースです！！

# なぜデータベースがボトルネックになるのか
クエリがイケてない？クエリ投げすぎ？インデックスが効いてない？
そもそもテーブル設計が…うん、あるある。でもそれは作りの話。
根本的な問題は**DBは負荷分散がしにくい**ということ。
DBはその強固なデータ一貫性を維持するために関連するデータを１箇所で持つ必要があるからね。
アプリケーションサーバーはPaaSの発展によりスケールアウトが容易になりました。
ただしDBだけはスケールアウト（出来るけど）出来ないと思っていた方がよいです。
（より上を目指す方は「クラスタリング」とか「パーティション」とか「シャーディング」で調べてみてください。）

# じゃあどうする
**本当にそのデータがDBに存在する必要があるかどうか見極めることが重要**
下記の条件に当てはまるような場合はRDBが向いていると言えるでしょう。
・柔軟に検索条件を指定出来るような検索処理が必要である
・データの集計、並び替えが必要である
・データの更新、削除が頻繁に発生する
・データの一貫性が重要である（一時的にもデータの不整合（ダーティリードと呼びます）が許されない）
特に「データの一貫性が重要である」は本当に？と自問自答してみてください。
実は少々遅れても構わないケース結構あります。

上記に当てはまらない場合は積極的にDBから逃しましょう。ファイルでもNoSQLでも何でもいいです。
DBを捨てれなくても部分的に逃がすだけでも効果はあります。DBは貴重な資源と心得ること！

# 最後に
なーんて、こんなこと書いといて昔DBに持つ必要のないデータをDBに持ってしまって苦労した私でした:wink:
まぁそれでこれ書こうと思ったのですけど。では、また来年お会いしましょう。
全俺がビックリ JavaScriptに「else if」構文は存在しなかった！

# はじめに
[JavaScript Advent Calendar 2017 \- Qiita](https://qiita.com/advent-calendar/2017/javascript)の12日目の記事です。

なぜか間違えて一週間早く投稿しちゃっていますね。なんででしょうね？

# 導入
今日も軽快に``else if``してますか？:champagne:
日常的に何気なく使っているJavascriptの``else if``ですが、
実はそんな構文存在しなかったんです！！:hatching_chick:


# else ifいつも使ってるよって
ええ、僕も使ってますよ。こんな風にね。

```js

// パターンA
if(gender === '男性'){
  console.log('興味がありません');
}else if(gender === '女性'){
  console.log('大好きです');
}else{
  console.log('仲良くなってみたいです');
}

// パターンB
if(gender === '男性')
  console.log('興味がありません');
else if(gender === '女性')
  console.log('大好きです');
else
  console.log('仲良くなってみたいです');


```
でも実際は``else``と``if``のネストで生成されていたんです。

# 「else if」は「else」と「if」の合わせ技
このことは公式にリファレンスにも記述されています。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/if...else

上記のソースが適切にインデントされていたらこんな感じです。

```js
// パターンA
if(gender === '男性'){
  console.log('興味がありません');
}else 
  if(gender === '女性'){
    console.log('大好きです');
  }else{
    console.log('仲良くなってみたいです');
  }

// パターンB
if(gender === '男性')
  console.log('興味がありません');
else 
  if(gender === '女性')
    console.log('大好きです');
  else
    console.log('仲良くなってみたいです');
  
```

# 最後に
まとめてみるとかなり短くなってしまいましたね。
でも僕自身この事実を知った時に「な...なんだってー」となったので共有したいなと思いました。
知らないだけでこう言ったことって多いんですかね...
カレンダーの予定に連動してSlackのステータスを自動変更できるようにした話

[ヴァル研究所 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/val)の９日目は、[昨日の内容](https://qiita.com/valitoh/items/d5b8bd36407d76bd763b)の応用編です。

##忙しい方向け[今北産業](http://dic.nicovideo.jp/a/%E4%BB%8A%E5%8C%97%E7%94%A3%E6%A5%AD) 
- 社内で日常的にSlackを利用しているため、このステータスをリアルタイムな状態と合わせたい
- ステータスの手動変更は忘れることもあるし面倒なので自動化したい
- カレンダーの予定に連動してirucaの更新ができるなら、Slackのステータスでもできるのではと考えやってみた

##背景とやりたい事
弊社では業務上のコミュニケーションツールとして日常的にSlackを利用しています。
Slackのステータスで在席や外出などの状況を表している社員も多いため、一声かける前にカレンダーかSlackのステータスを見るということがよくあります。

Slackのステータスを正として扱えればいいのですが、手動で変更していては忘れることもありますし、毎度変更するのも面倒です。そこで、カレンダーの予定の状態に連動して、Slackのステータスを以下のように変更させたいと思います。

- 社内や外出での打ち合わせ中は「取込中」に
- 社内の打ち合わせが終わったら「在席」に
- 外出移動中は「移動中」に

##仕組み
カレンダーから予定の状態を検知して、Slackのステータスを変更する仕組みは、ほぼ[Auto iruca Powered by RODEM Ver.2.0](https://qiita.com/valitoh/private/d5b8bd36407d76bd763b)の流用で、[IFTTT](https://ifttt.com/discover)上で構築しています。

- 予定の開始は、Googleカレンダーの「Event from search starts(特定のキーワードを含む予定の開始時に反応)」トリガーを使用して、社内外の打ち合わせや移動の開始を検知します
<img width="200" alt="スクリーンショット_2017-12-05_19_25_11.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/152460/8b9f61e4-fec6-4f66-be8b-f2985b6a365c.jpeg">

    - Which calendar? ``参照したいカレンダー(アカウント)の指定``
    - Keyword or phrase ``どんなキーワードの入った予定に反応させたいか``
    - Time before event starts ``イベント(予定)開始の何分前に通知を出したいか``
<br>
<br>
- 予定の終了は、Googleカレンダーの「New event from search ends(特定のキーワードを含む予定の終了時に反応)」トリガーを使用して、社内打ち合わせの終了を検知します
<img width="200" alt="スクリーンショット_2017-12-07_20_08_30.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/152460/d8dee996-eae5-0ee9-d468-c1cb1d21af9b.jpeg">
    - Which calendar? ``参照したいカレンダー(アカウント)の指定``
    - Keyword or phrase ``どんなキーワードの入った予定に反応させたいか``
<br>
<br>
- Slackのステータス変更はwebhookトリガーを使用
<img width="200" alt="スクリーンショット_2017-12-04_17_49_49.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/152460/33412477-9f82-66f0-ff0b-bdc5e386cc90.jpeg">
    - URL ``https://slack.com/api/users.profile.set``
    - Method ``POST``
    - Content Type ``application/x-www-form-urlencoded``
    - Body ``token=トークン&profile={"status_text":"テキスト","status_emoji":":絵文字コード:"}``
        - トークンは[こちら](https://api.slack.com/custom-integrations/legacy-tokens)でgenerateできます
        - 絵文字コードは[チートシート](https://www.webpagefx.com/tools/emoji-cheat-sheet/)からお好きなものを
<br>
<br>
- ステータスには絵文字も入れておくと、タイムライン上でもわかりやすいかと思います
    - 在席 :office: `` "status_text":"在席","status_emoji":":office:"``
    - 取込中 :two_men_holding_hands:`` "status_text":"取込中","status_emoji":":two_men_holding_hands:"``
    - 移動中 :rocket: `` "status_text":"移動中","status_emoji":":rocket:"``

<img width="500" alt="スクリーンショット 2017-12-07 19.19.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/152460/28232fbd-cf1d-8848-2121-6344563a4476.png">

##まとめ
・Slackのステータスもカレンダーの予定に連動するようになりました
・カレンダーに予定さえ入れていればステータスが自動変更されるので、変更し忘れを防いだり、手間を減らすこともできる

##参考にした記事
Slackのステータス変更APIの仕組みは下記を参考にさせていただきました
[オフィスにいる間は、Slackのステータスを自動で会社の絵文字にする](https://www.tam-tam.co.jp/tipsnote/tool/post13583.html)
Kafkaのtopic操作コマンド

# Kafkaのtopic操作コマンド

とにかく良く忘れるのでまとめる

## 前提条件

Kafkaバージョン： 0.11
Zookeeperの稼働場所：localhost:2181

コマンド実行場所はKafkaの展開ディレクトリとします

## コマンド郡

### topic作成
```txt:コマンド
./bin/kafka-topics.sh --zookeeper localhost:2181 --create --replication-factor 1 --partitions 1 --topic sample1
```

```txt:結果
Created topic "sample1".
```

replication-factor : ざっくり言うとメッセージの複製数
paprtitions : topic内のパーティション数

パラメータについてはKafkaの構成やtopicについてのドキュメントを一読しておくのが望ましいでしょう

### tpic一覧表示
```txt:コマンド
./bin/kafka-topics.sh --zookeeper localhost:2181 --list
```

```txt:結果
sample1
````

### topic詳細確認
```txt:コマンド
./bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic sample1
```

```txt:結果
Topic:sample1	PartitionCount:1	ReplicationFactor:1	Configs:
	Topic: sample1	Partition: 0	Leader: 1	Replicas: 1	Isr: 1
```

### topic修正
```txt:コマンド
./bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic sample1 --config max.message.bytes=128000
```

```txt:結果
WARNING: Altering topic configuration from this script has been deprecated and may be removed in future releases.
         Going forward, please use kafka-configs.sh for this functionality
Updated config for topic "sample1".
```

WARNING出るけど実行出来てるみたい。configについては様々なパラメータがあるのでドキュメントを一読のこと..


### topic削除
```txt:コマンド
./bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic sample1
```

```txt:結果
Note: This will have no impact if delete.topic.enable is not set to true.
```

Kafkaの起動時のパラメータで(デフォルトではconfig/server.properties) `delete.topic.enable=true` を指定していないと削除出来ない
OpenFOAMでのゼロに近い値を表す変数

# ゼロ除算
数値計算ではゼロ除算を防止するために，分数の分母にゼロに限りなく近い小さい値(0.000001など)を足すことがよくある．OpenFOAMでコードをカスタマイズするときに，直にこのような数値をコード中に書いてしまいがちであるが，OpenFOAMでは`SMALL`などのスカラー変数があらかじめ用意されている．

# SMALL, VSMALL, GREAT, VGREAT, etc.

[CFD-ONLINE](https://www.cfd-online.com/Forums/openfoam-solving/120990-small-great-rootvsmall-what.html)で質問している人がすでにいて，以下のスカラー変数が使える．

```
GREAT = 1.0e+6;
VGREAT = 1.0e+37;
ROOTVGREAT = 1.0e+18;
SMALL = 1.0e-6;
VSMALL = 1.0e-37;
ROOTVSMALL = 1.0e-18;
```
ただしこれは`float`型の場合で，`double`型の場合は，

```
GREAT = 1.0e+15;
VGREAT = 1.0e+300;
ROOTVGREAT = 1.0e+150;
SMALL = 1.0e-15;
VSMALL = 1.0e-300;
ROOTVSMALL = 1.0e-150;
```
である．これらの値が定義されているのは，`$FOAM_SRC/OpenFOAM/primitives/Scalar/scalar/scalar.H`や`$FOAM_SRC/OpenFOAM/primitives/Scalar/floatScalar/floatScalar.H`を参照すればすぐにわかる．

# 実例: 非ニュートン流体での粘性係数計算

通常の分数除算では`SMALL`で十分かと思うが，非ニュートン流体での粘性係数の計算などはべき乗が使われるので`VSMALL`を使うようである．例えば，power law流体の粘性係数は物理式で書くと，
$$
  \eta = \max (\eta_{\min}, \min (\eta_{\max}, k\dot\gamma^{n-1})) 
$$
で計算されるが，ソース(`$FOAM_SRC/transportModels/incompressible/viscosityModels/powerLaw/powerLaw.C`)では以下のようになっている．

```
Foam::viscosityModels::powerLaw::calcNu() const
{
    return max
    (
        nuMin_,
        min
        (
            nuMax_,
            k_*pow
            (
                max
                (
                    dimensionedScalar("one", dimTime, 1.0)*strainRate(),
                    dimensionedScalar("VSMALL", dimless, VSMALL)
                ),
                n_.value() - scalar(1.0)
            )
        )
    );
}
```
中ほどの`max`関数の引数のところで`VSMALL`が使われており，`strainRate()`がゼロになるときは，`VSMALL`の方が大きいのでこの値が利用されることがわかる．

# まとめ
特別な数値を表す変数の名前についてはコード(ソフトウェア)によって異なるので，OpenFOAMでもあったような，と頭の片隅に入れておくぐらいでいいのかもしれない．

# 参考文献
1. [勉強会の活動を通した非ニュートン流体モデルカスタマイズの取組](http://www.opencae.or.jp/wp-content/uploads/2016/01/OpenCAESymposium2015_GP18_Presentation.pdf)