OmniAICreator/Qiita-1.07M huggingface dataset:
pyenvのlistが更新されない時

brewで入れたpyenvで3.5系のpythonの最新を使いたい時
 - brew upgrade pyenv
 - pyenv update
 しても `pyenv insall -l`の更新がされない時、

公式の[ここ](https://github.com/pyenv/pyenv#upgrading)を実行したら`plugins` の階層も更新されて3.5系のpythonも入った。

```
MacBookPro:~ $ cd $(pyenv root)
MacBookPro:.pyenv $ git pull
```
```bash:bash_profile
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"

# Setting PATH for Python 3.5
# The orginal version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.5/bin:${PATH}"
export PATH
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

# Setting PATH for Python 3.6
# The original version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.6/bin:${PATH}"
export PATH
eval "$(pyenv init -)"
```
インスタンス変数のスコープ~undefined method `method' for nil:NilClass~

※rails初心者です。何か誤りや判りにくい点などがあればご指摘ください。

グループチャット機能のあるwebアプリケーションを開発しています。現在ビューの投稿フォームに入力された値をテーブルに保存する機能を実装しています。コントローラーは以下の通り。

<strong>app/controllers/message_controller.rb

```
class MessagesController < ApplicationController

  before_action :authenticate_user!

  def index
    @messages = Message.find(params[:group_id])
    @group = Group.find(params[:group_id])
    @message = Message.new
  end

  def create
    @message = @group.messages.new(message_params)
    if @message.save
      redirect_to group_messages_path(params[:group_id]), notice: "メッセージ送信成功"
    else
      flash.now[:alert] = "メッセェ〜ジを入力してください！"
      render "index"
    end
  end

  private
  def message_params
    params.require(:message).permit(:body, :image).merge(user_id: current_user.id)
  end
end
```

createアクションで新規インスタンスを生成してそれを保存したいのですがエラーが出てしまいます。エラー文は以下の通り。

<strong>エラー文

```
NoMethodError in MessagesController#create  undefined method `messages' for nil:NilClass

Extracted source (around line #12):
  def create
    @message = @group.message.new(message_params)
    if @message.save
      redirect_to group_messages_path(params[:group_id]), notice: "メッセージ送信成功"
    else
```

おそらくcreateメソッド内で新規インスタンスを生成する際に問題があるんですが、何が悪いのやら。

<strong>app/models/group.rb

```
class Group < ApplicationRecord
  has_many :messages
  has_many :members
  has_many :users, through: :members
  validates :name, presence: :true
end
```

モデルでもちゃんとアソシエーションを定義しています。なのに何故っ！！と思っていましたが、実はこれインスタンス変数のスコープが問題なんです。僕はindexメソッド内で定義した@groupはcreateメソッド内でも有効だと思っていました。しかし実際は<strong>indexメソッド内で定義した3つのインスタンス変数のスコープはindexアクションが実行終了するまで</strong>なんです。なので別のアクションが動作するときに再びインスタンス変数を定義しないとダメだったんです。つまりcreateメソッド内で@groupの定義がなされていないためにmessagesがnillになっていいたんです。

そこで以下の点を修正しました。

@groupの定義はコントローラー内の２つのアクションで必要なのでbefore_actionを使って２つのアクションが動作する前に@groupを定義したメソッドを呼び出すようにしました。

<strong>app/controllers/message_controller.rb

```
class MessagesController < ApplicationController

  before_action :authenticate_user!
  before_action :set_group, only: [:index, :create]

  def index
    @messages = Message.find(params[:group_id])
    @message = Message.new
  end

  def create
    @message = @group.messages.new(message_params)
    if @message.save
      redirect_to group_messages_path(params[:group_id]), notice: "メッセージ送信成功"
    else
      flash.now[:alert] = "メッセェ〜ジを入力してください！"
      render "index"
    end
  end

  private
  def message_params
    params.require(:message).permit(:body, :image).merge(user_id: current_user.id)
  end

  def set_group
    @group = Group.find(params[:group_id])
  end

end
```

ちゃんと動作しました。めでたしめでたし。
Cognos TM1 Architect から TM1 Serverに接続できない

##内容
久しぶりにCognos TM1 Architectから、TM1 Serverに接続できないという事象にめぐり合い、すっかり忘れていた知識を掘り起こしました。

TM1 Architectは、ユーザー端末に導入していて、本番環境のTM1 Serverとの間にはFirewallがあります。

当然ながら、TM1で使用するポートの穴あけが必要なのですが、ポート一覧が何かと問い合わせると、以下のTechnoteのガイドになります。

**What are the TCP/IP ports used by TM1?**
https://www-304.ibm.com/support/docview.wss?uid=swg21459257&wv=1

しかしながら、実際の環境でN/Wトレース等で解析してみると、**NetBIOSの137番ポート**を呼びに行って、ブロックされて接続できない状況になっている事がありました。

このNetBIOSのポートも穴あけする必要があるのですが、また自分でも忘れてしまう事が懸念されますので、自分のためにも投稿しておきます。
the_posts_pagination()を使う際のテンプレート


今までWordPressにてページネーション機能を使いたい場合には、独自にfunctionとして組み込むか、WP-Pagenaviなどといったプラグインを利用するかのどちらかでした。

しかし、WordPress側では既にページネーションを出力する関数を用意してありました。全然知りませんでしたのでメモしておきます。

#the_posts_pagination()

公式にはこちらに記載があります。

>参照：[関数リファレンス/the posts pagination](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/the_posts_pagination)

```
<?php the_posts_pagination(
	array(
		'base'               => '%_%', // ちょっと良く分からない
		'format'             => '?page=%#%', // ページネーションのパーマリンク構造
		'total'              => '1', // 総ページ数
		'current'            => '0', // 現在のページ番号
		'show_all'           => 'false', // 全てのページを表示する。falseの場合は以下end_size, mid_sizeで指定
		'end_size'           => '1', // ページ番号リストの両端に表示するページ数
		'mid_size'           => '1', // 現在のページの両端に表示するページ数
		'prev_next'          => true, // リスト内に「前へ」「後へ」のリンクを表示するかどうか。表示する場合はprev_text, next_textで指定
		'prev_text'          => __( 'previous page', 'textdmain' ), // 前のページへ送るリンクテキスト
		'next_text'          => __( 'next page', 'textdmain' ), // 後のページへ送るリンクテキスト
		'type'               => 'plain', // 戻り値の指定 plain or list
		'add_args'           => false, // 追加のクエリ引数の配列
		'add_fragment'       => false, // リンクに付け加えるテキスト
		'before_page_number' => '', // 各ページ番号の前に入れるテキスト
		'after_page_number'  => '', // 各ページ番号の後に入れるテキスト
		'screen_reader_text' => __( 'Post Navigation', 'textdmain' ), // スクリーンリーダー用のテキスト
	)
); ?>
```

引数に色々な情報を渡してあげることもできます。ちなみに引数は[pagenate_links関数](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/paginate_links)と同じです。

用途や好みによってプラグインと使い分けていくのも良いですね。

>参照：[WordPressにページネーションを出力できるthe_posts_pagination()とget_the_posts_pagination()](http://www.youngflavor.net/2015/01/2936/)
Travis-CIの新機能「ビルドステージ(Build Stages)」とは何か

先々月、Travisのブログに次の記事が上がった。

[The Travis CI Blog: Gain more control over your delivery process with Build Stages](https://blog.travis-ci.com/2017-05-11-introducing-build-stages?utm_source=broadcast&utm_medium=notification)

この記事で紹介されているBuild Stagesについて日本語の言及が殆ど無いので重要な部分のみ抜き出して翻訳する。

## What is Build Stages ?

> in the simplest and most common use case, you can now make one job run only if several other, parallel jobs have completed successfully.

> 最もシンプルかつ最も一般的なケースでは、他の幾つかの並列なジョブが正常に完了した時のみあるジョブを実行することができるようになりました。

> What could this look like in practice? Let’s say you want to test a library like a Ruby gem or an npm package against various runtime (Ruby or Node.js) versions in parallel (we have supported this parallelization with our build matrix feature from the beginning). And you want to release your gem or package only if all tests have passed and completed successfully. Build stages already make this very basic and common workflow possible.

> これによりどんなことが実践ではできるようになるでしょう？
> あなたがRubyGemもしくはnpmパッケージのようなあるライブラリを様々なランタイムバージョン(Ruby or Node.js)で並列に実行したいとします(私達はビルドマトリックス機能により当初からこの並行実行をサポートしていました)。
> そしてあなたはすべてのテストが通り正常に終了したときのみあなたのgemもしくはパッケージをリリースしたいとします。
> ビルドステージはこれを非常に簡単かつ一般的なワークフローで可能にします。

## How to use ?

```yaml
jobs:
  include:
    - stage: test
      script: ./test 1
    - # stage name not required, will continue to use `test`
      script: ./test 2
    - stage: deploy
      script: ./deploy
```

## For more information

とりあえず[元のブログ記事](https://blog.travis-ci.com/2017-05-11-introducing-build-stages?utm_source=broadcast&utm_medium=notification)を読みましょう。
Qiita | UI > タグ補間候補の表示が速くなった > 5sec -> 300msec

Qiitaのタグ候補表示は以前は以下のような感じでした。

1. タグの一部を入力する
2. **5sec程度待つ**
3. 候補が表示される
4. 候補を選択する

2017年7月10日現在、上記の2の待ちが大幅に減少したようです (300msec以内)。

こちらの環境が変わったのか、Qiitaの実装が変わったのかは分かりません。

分かっていることは、長い間(半年以上）待っていたUIの問題が一つなくなったこと。
（一時的な解消かは不明)。

これで、タグ入力間違いと間違いタグの増殖が減ると良いと思います。

<hr>
(追記 2017/07/10)

```txt:動作環境
Windows 7 Pro (32bit)
Google Chrome バージョン: 59.0.3071.115
```
【備忘録】display:tableで見出し作ったら結構良かった

CSS勉強中です。
ブログ本文中の見出しを作っていたのですが、背景にマークを書きたくなりまして。

![SnapCrab_NoName_2017-7-10_11-56-4_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/47220/a3189519-fd7c-9088-d304-f0715ab19dd4.png)
こういう感じにしたくなったので、

```html
<body>
  <h1>なにかものすごい見出し</h1>
</body>
```

```css
h1 {
    display: inline-block;
    position: relative;
    margin: 75px 5px;
    z-index: 0;
}

h1::before {
    content: "";
    position: absolute;
    background: #a0e7ff;
    width: 150px;
    height: 150px;
    border-radius: 50%;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    z-index: -1;
}

```

こんな風にしました。

結果は上の画像の通りになったので、早速使おうと思ったのですが……

![SnapCrab_NoName_2017-7-10_11-57-45_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/47220/6e2c55df-4447-6156-2c0a-d01540afaa96.png)

まぁ、当然inline-blockでインラインにしてあるので、前後に文章があるとこうなっちゃうわけですよ。
でも見出しなので前後に改行を設けてほしかったのです。
かと言ってdisplay:block要素にしてしまうと幅が100％になってしまうので、後ろの円が文字の見出し文の真ん中ではなくて画面の真ん中に来てしまうんですよね。
見出し文は不定なので、あらかじめwidthを指定することもできず…。

つまり、**幅がコンテンツに合わせて変形し、かつブロックのような要素**がほしいわけです。
必死にinline-blockの前後に改行を挟む方法などを調べましたがよくわかりませんでした。
しかし、**display:table**というスタイルを見つけました。
これを指定すると、インライン要素のように幅はコンテンツに合わせますが、ブロック要素のように前後に改行されるようになります（だいぶ適当な説明）です。
本来はテーブルのようなレイアウトを作るときに使いますが、今回の目的にぴったりだったので使用してみました。
さきほどのCSSのdisplayを`display: table`に変更します。
すると
![SnapCrab_NoName_2017-7-10_12-4-59_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/47220/4a6f0774-b4b9-5647-4015-696a767dab65.png)

おお、イメージ通りになりました。
ありがとう、**display:table**。

つ、つかれた……もっと簡単にできる方法があったら教えてほしい……
Digdagからsh>でEmbulk起動時にプラグインバージョンを固定(ローカルgemあり版 ver.2)

[以前に書いた記事](http://qiita.com/pilot/items/78b15cc98d6fd88d8896) の改良版

基本的な考え方
=
Embulkが提供しているbundle機能を使う
ローカルgem展開ディレクトリをGemfileの:pathで指定する
bundleディレクトリもローカルgem展開ディレクトリもサーバ間でNFS共有する → [理由](http://qiita.com/pilot/items/2c4bc45adafa17030f37#nfs%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E7%90%86%E7%94%B1)

前準備
=
digdagサーバにpushするプロジェクトディレクトリ内にローカルgemを持っておく

```
[vagrant@digcl proj1]$ embulk --version
embulk 0.8.26
[vagrant@digcl proj1]$ digdag version
2017-07-10 11:27:57 +0900: Digdag v0.9.12
Client version: 0.9.12
Server version: 0.9.12
[vagrant@digcl proj1]$ ls -F
embulk/  embulk_local_gems/  params/  proj1.dig  scripts/
[vagrant@digcl proj1]$ ls -F embulk_local_gems/
embulk-input-XXX-0.2.0.gem
```

各ファイルの内容
=

## proj1.dig

```
+embulk_gem_install:
  sh>: scripts/embulk_gem_install.sh

+task1:
  sh>: scripts/embulk_run.sh embulk/task1.yml.liquid
```

## scripts/embulk_gem_install.sh

```
#!/bin/bash

# エラー処理
function error() {
  exit 1
}

# ローカルgemを展開
gem unpack embulk_local_gems/* --target=<NFS>/proj1/embulk_local_gems || error

# embulk mkbundle実行
if [ ! -e ${embulk_bundle_dir} ]; then
  embulk mkbundle <NFS>/proj1/embulk_bundle || error
fi

# Gemfile上書き
cp -f params/embulk/Gemfile <NFS>/proj1/embulk_bundle || error

# embulk bundle実行
cd <NFS>/proj1/embulk_bundle || error
embulk bundle || error

exit 0
```

毎回やるのは無駄な内容ではあるが許容する

## params/embulk/Gemfile

```
source 'https://rubygems.org/'
gem 'embulk',            '~> 0.8.0'
gem 'embulk-output-td',  '=  0.4.0'
gem 'embulk-input-XXX',  '=  0.2.0', :path => '../embulk_local_gems/embulk-input-XXX-0.2.0'
```

ローカルgemは:pathで展開ディレクトリを指定(相対パス可)
展開ディレクトリの内容がbundleディレクトリにコピーされたりはしない(embulk run時に展開ディレクトリを参照する)

## scripts/embulk_run.sh

```
#!/bin/bash

if [ $# -ne 1 ]; then
  echo "Usage: $0 embulk_file" 1>&2
  exit 1
fi

embulk run --bundle <NFS>/proj1/embulk_bundle $1
exit $?
```

以上
投稿フォームに入力された値以外のキーもパラメーターに保存する

※rails初心者です。何か誤りなどがあればご指摘下さい。

# ユーザーが投稿フォームで送信した値以外のキーもストロングパラメーターを介して取得したい。

グループチャット機能のあるwebアプリケーションを開発中です。現在ビューでユーザーが投稿フォームに入力したメッセージ若しくは画像ファイルをテーブルに保存するという機能を実装しています。

<strong>app/views/messages/_footer.html.haml</strong>

```
.footer
  = form_for [@group, @message] do |f|
    = f.text_field :body
      = f.file_field :image
    = f.submit "SEND"
```

⚠︎見易くするために記述を簡略化しています。

<strong>app/controllers/messages_controller.rb

```
class MessagesController < ApplicationController

  before_action :authenticate_user!

  def index
    @messages = Message.find(params[:group_id])
    @group = Group.find(params[:group_id])
    @message = Message.new
  end

  def create
    @message = Message.new(message_params)
    if @message.save
      redirect_to group_messages_path(params[:group_id]), notice: "メッセージ送信成功"
    else
      flash.now[:alert] = "メッセェ〜ジを入力してください！"
      render "index"
    end

  end

  private
  def message_params
  end
end
```

<strong>app/models/message.rb

```
class Message < ApplicationRecord
  belongs_to :user
  belongs_to :group
  validates :group_id, presence: true
  validates :user_id, presence: true
  validates :body_or_image, presence: true
  private
  def body_or_image
    body.presence or image.presence
  end
end`
```

ユーザーの投稿時に、メッセージ本文も画像もない投稿がされるのを避けるため（何も入力されていない状態で送信ボタンを押すと空のレコードが保存されてしまう。）どちらか一方がないと保存されないようにバリデーションをかけます。さらに送信された値がどのグループのどのユーザーが送信したものなのか識別できる必要があるのでgroup_idとuser_idとの両方にそれぞれバリデーションをかけます。しかしここで問題が発生。送信された値をストロングパラメーターを介して保存したいのですが、基本的にパラメーターは入力された値のキーしか持たないのです。つまりgroup_idとuser_idの2つはパラメーターのキーとして存在しないのです。（この2つはユーザーが投稿フォームに入力する値ではないので。）なので

<strong>app/controllers/messages_controller.rb

```
~省略~

  private
  def message_params
    binding.pry
    params.require(:message).permit(:body, :image, :user_id, :group_id)
  end
```

↑こう書きたいですけど機能しません。

そこで使うのが<strong>mergeメソッド</strong>です。このメソッドを使うことでパラメーターに新たなキーを統合することができます。

<strong>app/controllers/messages_controller.rb

```
~省略~

  private
  def message_params
    binding.pry
    params.require(:message).permit(:body, :image).merge(user_id: current_user.id, group_id: params[:group_id])
  end
```

↑このように記述することで、ユーザーが投稿フォームで送信する２つのキーを持ったパラメーターに新たなキーを加えることができます。そして投稿フォームに入力しない値もストロングパラメーターを介して保存できるようになります。めでたしめでたし。
TerminalやMacVimでEsc (or ^[)キーで日本語IMEを英数に切り替える(Karabiner-Elementsによる設定)

[Karabiner-Elements](https://github.com/tekezo/Karabiner-Elements)がVersion 0.91.6となって、待望の「アプリケーション毎のキーバインディング」が[サポート](https://github.com/tekezo/Karabiner-Elements/commit/795fe1f049f3ebdb8e6baa21f976052ed0643406)されました。

macOS SierraでKarabinerが使えなくなって以来、私のようなVimユーザにとって「ESCキーで日本語入力をOFFにする」設定が何かと不便で困っていましたが、今回のKarabiner-ElementsのアップデートでなんとかKarabiner時代と同様の設定が可能となりました。有り難し！


# 設定方法

* 最新版のKarabiner-Elementsをインストール。https://pqrs.org/latest/karabiner-elements-latest.dmg
* Karabiner-Elementsを起動
* 設定ファイルの作成

```shell-session
$ vim ~/.config/karabiner/assets/complex_modifications/FromEscapeToJapanese_eisuu.json
```
この`FromEscapeToJapanese_eisuu.json`ファイルに次の内容を記述して保存。[^1]

[^1]: ここでは、TerminalアプリとVimアプリの起動時のみ有効になるように設定しています。他のアプリのbundle identifiersを調べたい場合は、Karabiner-ElementsのメインメニューからEventViewerを起動して"Frontmost Application"から調べることができます。

```json:FromEscapeToJapanese_eisuu.json
{
  "title": "Terminal等でESCあるいは^[で日本語入力を英数に",
  "rules": [
    {
      "description": "TerminalまたはMacVimでESCあるいは^[を押したときに日本語入力を英数に切り替える。",
      "manipulators": [
        {
          "type": "basic",
          "from": { "key_code": "escape", "modifiers": { "optional": [ "any" ] } },
          "to": [ { "key_code": "japanese_eisuu" }, { "key_code": "escape" } ],
          "conditions": [ { "type": "frontmost_application_if", "bundle_identifiers": [ "^com\\.apple\\.Terminal$", "^org\\.vim\\." ] } ]
        },
        {
          "type": "basic",
          "from": { "key_code": "open_bracket", "modifiers": { "mandatory": ["left_control"] } },
          "to": [ { "key_code": "japanese_eisuu" }, { "key_code": "escape" } ],
          "conditions": [ { "type": "frontmost_application_if", "bundle_identifiers": [ "^com\\.apple\\.Terminal$", "^org\\.vim\\." ] } ]
        }
      ]
    }
  ]
}
```

* Karabiner-Elements PreferencesウィンドウでComplex Modificationsメニューを開く

![Screenshot 2017-07-10 11.22.50.png](https://qiita-image-store.s3.amazonaws.com/0/177131/9d919fbb-e3a8-6bda-f835-4f98be98be3a.png)

* 左下の"Add rule"をクリックすると次のような設定可能なルールの一覧が表示される。

![Screenshot 2017-07-10 11.26.22.png](https://qiita-image-store.s3.amazonaws.com/0/177131/17a97569-c2c8-4765-1912-22fbb10af43c.png)

* "ESCを押したときに日本語入力を英数に切り替える。"の右にある"Enable"をクリックする。
![Screenshot 2017-07-10 11.27.48.png](https://qiita-image-store.s3.amazonaws.com/0/177131/df809f6e-c552-53d9-a560-4f4eb33a2418.png)

* "Complex Modifications"ウィンドウで当該ルールが追加されていることを確認。
![Screenshot 2017-07-10 11.28.17.png](https://qiita-image-store.s3.amazonaws.com/0/177131/b359fcc7-a753-b662-a17e-9c783826eeb8.png)

以上で設定は終わりです。

---
pushのエラー対処memo。

pullは作業前忘れずに。
pusでエラーでたとき、
``git commit``して
でpullしてくる。

kaienoMacBook-Pro:ace-co 名前$ git status -s
kaienoMacBook-Pro:ace-co 名前$ git pull 名前 master
error: You have not concluded your merge (MERGE_HEAD exists).
hint: Please, commit your changes before merging.
fatal: Exiting because of unfinished merge.
kaienoMacBook-Pro:ace-co 名前$ git commit -m "updated"
[master 94a5ee5] updated
kaienoMacBook-Pro:ace-co 名前$ git pull origin master
React Nativeでrun-androidしたときにNo connected devices!になる

## はじめに

React NativeではCLIからシミュレータを起動してアプリの動作確認ができます。
iso,androidそれぞれに対応しているのですが、android側で下記のエラーが発生しました。
解決は簡単だったのですが一応備忘として記載。

```
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:installDebug'.
> com.android.builder.testing.api.DeviceException: No connected devices!
```

## エラー解決

結論から言うとシミュレータを起動した状態で`react-native run-android`を実行すればエラーなくシミュレータにアプリがインストールされます。

run-iosの方はコマンドを実行すると勝手にシミュレータを立ち上げてくれるのですが、androidの方は事前にシミュレータを立ち上げておかないといけないようです。

React NativeのGithubのissueにも同様の質問が上がっており、対応策も同じでした。

[Failed run android simulator : No connected devices!](https://github.com/facebook/react-native/issues/3091)

## androidシミュレータの起動方法

こちらのサイトが画像付きで分かりやすかったので参考にさせていただきました。
[[Android] エミュレータ AVD Manager の設定](https://akira-watson.com/android/avd-manager.html)
Androidで標準以外のフォントを使用する

## はじめに
TextViewに標準以外のフォントを指定する場合、iOSのようにXcodeでフォントを指定する…といったことができません。
※ Android Oからは利用可能になるようです。

しかし、ライブラリを使うことで簡単に好きなフォントを利用することができます。

## 手順
1. フォントファイルの準備
2. プロジェクトへの追加
3. ライブラリの準備と導入

## 1. フォントファイルの準備
好きなフォントを準備してください。例えばNoto Sansは以下から取得します。

- [Google Noto Fonts](https://www.google.com/get/noto/#sans-java)

## 2. プロジェクトへの追加
Android StudioのプロジェクトウインドウをProjectビューに切り替えます。`app/src/main`配下に`assets`ディレクトリを作成します。さらに`fonts`ディレクトリを作成し、その中に準備したフォントを追加します。

![screenshot_2017-06-27_18.46.06.png](https://qiita-image-store.s3.amazonaws.com/0/185323/ee9d3038-4b56-586d-7204-4eb00ee74f49.png "screenshot_2017-06-27_18.46.06.png")


## 3. ライブラリの準備と導入
ライブラリは以下を利用します。
[chrisjenx/Calligraphy: Custom fonts in Android the easy way...](https://github.com/chrisjenx/Calligraphy)

具体的な導入はREADME.mdにありますが、簡単に記載します。

### ライブラリのインポート
`app/build.gradle`に以下を追記します。

```gradle:app/build.gradle
dependencies {
    compile 'uk.co.chrisjenx:calligraphy:2.3.0'
}
```

### 初期化
利用するアクティビティで以下を追記します。

```java:SampleActivity.java
@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
```

### TextViewへの指定
```xml:layout/sample_text_style.xml
<TextView
    fontPath="fonts/HelveticaNeue.ttf"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="あいうえおあいうえおあいうえおあいうえお"
    />
```

赤い波線が出てエラーと言われますがDisable Inspectionsしてください。

## イメージ
![Screenshot_1498564543.png](https://qiita-image-store.s3.amazonaws.com/0/185323/949fe69d-a4f0-d1dc-de75-b82472d322e5.png "Screenshot_1498564543.png")


## 参考
- [Android O の機能と API | Android Developers](https://developer.android.com/preview/api-overview.html#wwf)
- [Calligraphy/README.md at master · chrisjenx/Calligraphy](https://github.com/chrisjenx/Calligraphy/blob/master/README.md)
FlutterでiOS風タブUI

**(2018/02/02 追記)** 現在の Flutter では [CupertinoTabScaffold](https://docs.flutter.io/flutter/cupertino/CupertinoTabScaffold-class.html) に書いてあるサンプルコードのように、CupertinoTabScaffold, CupertinoTabBar, CupertinoTabView を使うようにすることで、iOS風タブUIを問題なく実装できます。

CupertinoTabScaffold 内で、この記事中にある Offstage と TickerMode の処理をし、CupertinoTabView が内部で Navigator を持っているのでナビゲーション・スタックも問題ありません。

----

iOSのUITabControllerのような、複数のタブを完全に切り替えて表示するUIをFlutterで実装する方法についてです。

FlutterのTabBar、TabBarViewあたりは横にページが並んでいる形式のタブUIです。Androidの世界でよく見るタブで、iOSだとUIPageViewControllerに近いものです。

さて、iOS風の下タブUIとしては、BottomNavigationBarというクラスが提供されています。

まず単純に実装すると以下のようになります。

```dart
int index = 0;

@override
Widget build(BuildContext context) {
  return new Scaffold(
    body: index == 0 ? new Text("Left") : new Text("Right"),
    bottomNavigationBar: new BottomNavigationBar(
      currentIndex: index,
      onTap: (int index) { setState((){ this.index = index; }); },
      items: <BottomNavigationBarItem>[
        new BottomNavigationBarItem(
          icon: new Icon(Icons.home),
          title: new Text("Left"),
        ),
        new BottomNavigationBarItem(
          icon: new Icon(Icons.search),
          title: new Text("Right"),
        ),
      ],
    ),
  );
}
```

ScaffoldのbottomNavigationBarを設定することで下タブが表示されます。onTapで選択されたタブのインデックスを変更するようにハンドラを実装し、そのインデックスに応じたページ内容をbodyにセットしています。

このサンプルは単純なので問題なく動作しますが、画面から非表示になったWidgetは解放されてしまいます。bodyの内部にStatefulWidgetを使ったり、そこからさらに別の画面を表示するような場合は工夫が必要です。

そこで、画面から取り除かないように、Stackで画面を重ねておきます。また表示されていないほうは、Offstageで非アクティブにしたり、TickerModeでアニメーションを停止したりしておきます。こうすることで、Widgetツリーには残っているのでStateが保持されつつ、表示されない画面を実現できます。

```dart
new Scaffold(
  ...
  body: new Stack(
    children: <Widget>[
      new Offstage(
        offstage: index != 0,
        child: new TickerMode(
          enabled: index == 0,
          child: new Text("Left"),
        ),
      ),
      new Offstage(
        offstage: index != 1,
        child: new TickerMode(
          enabled: index == 1,
          child: new Text("Right"),
        ),
      ),
    ],
  ),
  ...
```

さて、Stateが保持されるようにはできましたが、さらに画面遷移をする場合は、タブごとに別のナビゲーションスタックを持つようにする必要があります。

このためには、各タブ画面をMaterialApp(もしくはWidgetsAppやNavigator)にします。

```dart
new Scaffold(
  ...
  body: new Stack(
    children: <Widget>[
      new Offstage(
        offstage: index != 0,
        child: new TickerMode(
          enabled: index == 0,
          child: new MaterialApp(home: new YourLeftPage()),
        ),
      ),
      new Offstage(
        offstage: index != 1,
        child: new TickerMode(
          enabled: index == 1,
          child: new MaterialApp(home: new YourRightPage()),
        ),
      ),
    ],
  ),
  ...
```

----

この記事ではやりませんでしたが、最初に各タブのページすべてを生成せず、最初に表示に表示されるタイミングで生成するようにしたほうが、パフォーマンス上もよさそうですね。

このあたりの処理は CupertinoScaffold.tabbed あたりを見ると似たような実装をしていますので、参考になると思います。
https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/cupertino/scaffold.dart
Digdagのshオペレータで複数コマンド

必要性
=

複数コマンドをDigdagサーバの同じ号機で実行したい

結論
=

案1 - 複数コマンドを一つの*.shに押し込み、それをshオペレータで実行する
案2 - 以下のように1つのshオペレータに「;」区切りでコマンドを複数書く

```
+task1:
  sh>: >-
    command1 param1 param2;
    command2 param1 param2
```

背景
=

困ったこと
-
Digdagサーバ1号機2号機でNFS共有しているディレクトリがある
そこにmkdirするタスクとそれを参照するタスクを作った(いずれもshオペレータ)
しかし後者のタスクでno such file or directoryになることがある

仮説
-
mkdirと参照が別号機から行われており、mkdir結果がNFS経由で相手号機に伝わるのが遅れているのではないか
(NFSの遅延というか、NFSをDigdagが追い越したというか)

別号機で行われていることの確認
-
NFSディレクトリに吐くように設定しているタスクログディレクトリを見てみた
圧縮ファイル名にタスク名とホスト名がついているので当該タスクがどちらの号機で実行されているのかがわかる
事象発生時、mkdirタスクと参照タスクは別号機から行われていた

対応策
-
同じshオペレータ内でmkdirと参照を両方行うことで同じ号機で行われるようにした

追記
=

案2の方法はドキュメントにないように思うが将来使えなくなったりするだろうか

タスクがどちらの号機で実行されたのかがdigdag logでわかると助かるのだが
(logback.xmlとかでログフォーマットを変更してホスト名を出したい)
Netlifyならgitのブランチ分けるだけでSplitテストができるよ

以前[別の記事](http://qiita.com/kiida/items/bfb7844312c0539d4928)で使って以降[Netlify](https://www.netlify.com/)に注目してるんですが、先日[gitのブランチを分けるだけでSplitテストができる機能](https://www.netlify.com/docs/split-testing/)がリリースされたので簡単に紹介してみます。

# 手順

## プラン変更

![netlify-legacy.png](https://qiita-image-store.s3.amazonaws.com/0/36003/cf903be7-6d10-2eb8-ba46-ac0332e1f500.png)

今までのプランはLegacyプランと呼ばれて使えなくなってたので、プランを変更します。単にキャンセルするだけでオッケーでした。まだ過渡期だからなのかよく分からないですが、キャンセルしたあと別の有料プランに変更しなくても前回紹介したPrerenderingが使えました。そして今回のメインであるSplit Testingも無料プランでできるようです。

## ブランチを作ってpushする

適当にブランチ作って、Netlifyでビルド対象にしてあるリモートレポジトリにプッシュするだけです。

[前回](http://qiita.com/kiida/items/c757dc6674f7e213fa64)のコードにbranch-aとbranch-bを作って、以下のようにテキストだけ変えてみました。

### branch-a
```
git checkout -b 'branch-a'
```
```Home.js
    <h2>Home of Branch A</h2>
```
```About.js
    <h2>About of Branch A</h2>
```
### branch-b
```
git checkout -b 'branch-b'
```
```Home.js
    <h2>Home of Branch B</h2>
```
```About.js
    <h2>About of Branch B</h2>
```

## Split Testingを有効にする

![netlify-split-testing.png](https://qiita-image-store.s3.amazonaws.com/0/36003/8e80d862-661b-1481-e6b3-f3cc076b5e3e.png)

Netlifyの設定画面で変更するだけです。ブランチごとに何％表示させるかを設定できます。3ブランチ以上も設定できますが、3ブランチ以上にするとボリュームバーみたいなやつの動きがトリッキーでした。2つの場合は1つ変更すると合わせて100%になるように逆側が自動で変更されますが、3つ以上だとランダムで1つが変更されます...見た目と違ってあんまり直感的じゃないですね。

## 確認

リロードしたり別タブで開いてみたりするとそれぞれのブランチのページがランダムで表示されます。統計取ってないですが、設定した通り大体均等に表示されているようでした。(ただ不具合なのかたまにブランクページが表示されることがありました。原因究明したら追記します。)

![Screenshot from 2017-07-09 17-13-49.png](https://qiita-image-store.s3.amazonaws.com/0/36003/447d1e87-df1f-4ada-e861-65ff25e0f4d6.png)
![Screenshot from 2017-07-09 17-13-24.png](https://qiita-image-store.s3.amazonaws.com/0/36003/28cfc120-f23e-fad8-cecc-ae5adda2d969.png)
![Screenshot from 2017-07-09 17-13-40.png](https://qiita-image-store.s3.amazonaws.com/0/36003/94a2684f-bc40-cf1c-a6b1-8bfad786f65d.png)


## ブランチの情報を取得する

これまた公式ページに紹介されている通りですが、ブランチの情報を動的に取得することができます。

たとえばReactだと`process.env.BRANCH`でアクセスできます。

静的サイトジェネレータのHugoを使っている場合には以下のようにすることでブランチの情報をGoogle Analyticsに渡すことなどもできるようです。

```
<script>
<!-- install Google Analytics' JS tracker before using this code -->
<!-- https://developers.google.com/analytics/devguides/collection/analyticsjs/ -->
ga('send', 'pageview', {
  'Branch':  '{{ getenv "BRANCH" }}'
});
</script>
```

# 最後に

設定も簡単だし、コンバージョンレートの低かったブランチを潰して別のSplitテストするのも簡単です。エンジニア的にも普段の開発フローに簡単に組み込めるのは良いですね。

まだランダムな条件でのテストのみですが、ユーザ属性等に応じてテストできるようになるとさらに強力になりそうです。

ということで簡単な紹介ですが、Netlify広まって欲しいので記事にしてみました。
Scikit-learn DecisionTreeClassifier with datetime type values


I've been struggling for almost an hour to solve the error when running DecisionTreeClassifier.

```
TypeError                                 Traceback (most recent call last)
<ipython-input-42-dbd33597c073> in <module>()
      7 learner = DecisionTreeClassifier(random_state = 2)
----> 8 learner = learner.fit(features_train[:int(sample_size)], outcome_train[:int(sample_size)])
********* omitted **********
TypeError: float() argument must be a string or a number
```

Some people say that is because of NaN value so I checked but there were no NaN value.
https://stackoverflow.com/questions/43709854/python-naive-bayes-fit-function-gives-typeerror-float-argument-must-be-a-str

```
print features_train.isnull().values.any()
 -> False
```

Is there anything wrong in the code lines where values are converted to datetime? But it seems right.

```
features_train['date_x'] = pd.to_datetime(features_train['date_x'], format='%Y-%m-%d')
```

Then, finally I found the link says you just need to datetime into categorical vaue.
https://stackoverflow.com/questions/16453644/regression-with-date-variable-using-scikit-learn
I just intentionally didn't convert datetime into categorical date when encoding the data set because I was not sure if it is mathematically right. 

After including date columns in data encording process, DecisionTreeClassifier worked as expected and returned its prediction.

```
columns = ['activity_category', 'people_id', 'activity_id', 'date_x', 
****** omitted *****
          ]

#Set concoder
encoder = LabelEncoder()

#Encode data frame
encoded_people_act_train_df = people_act_train_df.copy()
for col in columns:
    encoded_people_act_train_df[col]=  encoder.fit_transform(people_act_train_df[col])
```
ebiten でキーが押された初回のみを判定する

### 2018/03/03 更新
表題の機能が [ebiten/inpututil](https://godoc.org/github.com/hajimehoshi/ebiten/inpututil) に実装されましたので、この記事のようなコードを自前実装する必要はなくなりました。
今後は `inpututil` を使いましょう。

----

[ebiten](https://github.com/hajimehoshi/ebiten) にはキーボードが押下されているかを判定する [IsKeyPressed関数](https://godoc.org/github.com/hajimehoshi/ebiten#IsKeyPressed) がありますが、この関数は押下されている間は常に `true` を返します。

大抵は問題ないかもしれませんが、場合によっては不便になることがあります。
例えば2D格闘ゲームを作ろうとしたとき、押下時に常に `true` が返ると、ボタンを押しっぱなしにするだけで百烈張り手やエレクトリックサンダーが出せてしまいます。
やはりこういった必殺技は、ボタン連打操作で発生するようにしたいです。

そこで、ボタンを押下した初回のみ `true` を返す関数を実装してみます。

## ソースコード

- 全体の差分は以下
	- https://github.com/zenwerk/go-pixelman3/commit/09d1f1568cfc5226ab53dc3a566971e9796dbf47

```golang
type BaseSprite struct {
	Images     []*ebiten.Image     // アニメーションさせる画像の配列
	ImageNum   int                 // 総イメージ数
	CurrentNum int                 // 現在何枚目の画像が表示されているか
	Position   Position            // 現在表示されている位置
	count      int                 // フレーム数のカウンター
	keyPressed map[ebiten.Key]bool // 現在なんのキーが押されているか
}

func NewSprite(images []*ebiten.Image) *BaseSprite {
	return &BaseSprite{
		Images:     images,
		ImageNum:   len(images),
		keyPressed: make(map[ebiten.Key]bool),
	}
}

// IsKeyPressed は指定したキーが現在押下されているか判断し返す
func (s *BaseSprite) IsKeyPressed(key ebiten.Key) bool {
	pressed := ebiten.IsKeyPressed(key)
	if pressed {
		s.keyPressed[key] = true
	}
	return pressed
}

// IsKeyReleased は指定されたキーが現在押下されていないか判断し返す
func (s *BaseSprite) IsKeyReleased(key ebiten.Key) bool {
	// キーは押されていると記録されていたが, 実際にはキーは押されていない -> キーがリリースされた
	if s.keyPressed[key] && !ebiten.IsKeyPressed(key) {
		s.keyPressed[key] = false
		return true
	}
	return false
}

// IsKeyPressedOneTime はキーが押下された初回のみ true を返す
func (s *BaseSprite) IsKeyPressedOneTime(key ebiten.Key) bool {
	pressed := s.keyPressed[key]
	// キーが押下されているが, リリースはされていない -> キーが押されっぱなし
	if pressed && !s.IsKeyReleased(key) {
		return false
	}
	return s.IsKeyPressed(key)
}
```

`keyPressed map[ebiten.Key]bool` のような map を作って現在押下されているキーの状態を保存します。
保存した状態を、自作の `IsKeyPressed` や `IsKeyReleased` のような関数から参照し、現在のキーの状態を取得できるようにします。

キーが押下さているか、押下されていないか、という2つの状態が判断できるようになれば、あとは `IsKeyPressedOneTime` のように押下時のみ `true` を返す関数が作れるようになります。

## まとめ
簡単に作れるかと思ったら、意外とややこしかった。
EBS 最適化インスタンスのパフォーマンス

# 概要

AWS で提供している EBS (Elastic Block Store) はいくつかタイプがあり、それぞれパフォーマンス特性が違うことが分かった。そして、同じボリュームサイズであってもインスタンス毎に最大帯域幅が異なるため、 EBS のタイプと性能だけの理解で性能評価すると想定外の結果となる。その例を実際手を動かして確認してみたいと思う。

# EBS 性能においての想定例
インスタンスタイプ c4.large で、220GiB の gp2 EBSを作成して、ディスクに 220GiB 分書き込みすると、以下の計算式で約23分くらい終わるであろう。

EBS gp2 ボリュームの最大スループットは、160 MiB/秒 なので、
想定所要時間 = 220 * 1000 (MB換算) / 160 / 60 （分換算） で大体 23 分くだいだろう。

# インスタンスタイプ c4.large で、220GiB の gp2 EBSを作成し、パフォーマンス測定する

- マネジメントコンソールにて、c4.large インスタンスを作成
- ボリューム（/dev/sdb）を追加する
- ssh で該当 EC2 へ接続する
- ボリュームに、ファイルシステムを作成する

 ```console
 $ mkfs -t ext4 /dev/sdb
 ```

- fstab にマウント設定する内容を追記し、マウントする
 
 ```console
 $ mkdir -p /mnt/source /mnt/dest
 $ echo '/dev/sdb /mnt/source ext4 defaults,nofail 0 2' >>/etc/fstab
 $ mount -a
 $ chown ec2-user:ec2-user /mnt/*
 ```

- 220MB 書き込みする

 ```console
 $ dd if=/dev/urandom of=/mnt/source/test bs=1M count=220K
 * * *
 dd: error writing ‘/mnt/source/test’: No space left on device
 221543+0 records in
 221542+0 records out
 232303771648 bytes (232 GB) copied, 3763.15 s, 61.7 MB/s
 ```

# 予想した所要時間と実際の所要時間の乖離について

実際、約 62分 かかった。想定した所要時間、約23分 とかけ離れている。理由は、インスタンスタイプ「c4.large」は最大帯域幅が 500Mbps、予想スループット（MB/秒）が 62.5 MiB/s なため、正しい所要時間の計算式は以下となり、約 59 分 かかると予想するのが正しい。

```
220 * 1000 (MiB換算） / 62.6 
```

実施は62分かかっているので、3分くらい誤差があったが概ね予想時間は正しい。

参考ドキュメント「Amazon EBS 最適化インスタンス」から、最初に想定した、23分以上のパフォーマンスを出すためには、インスタンスタイプ c4.4xlarge が必要な計算となる

```
220 * 1000 (MiB換算） / 250 
```

# インスタンスタイプ c4.4xlarge、220GiB の gp2 EBSを作成し、でパフォーマンス測定してみる

- 作成手順は、インスタンスタイプ c4.large と同様で、インスタンスタイプを 「c4.4xlarge」で作成する

```console
$ dd if=/dev/urandom of=/mnt/source/test bs=1M count=220K
dd: error writing ‘/mnt/source/test’: No space left on device
221543+0 records in
221542+0 records out
232303767552 bytes (232 GB) copied, 1354.88 s, 171 MB/s  
```
232 GB が 約 22 分で完了していることが分かる 

# 参考ドキュメント

- Amazon EBS ボリュームの種類 
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/EBSVolumeTypes.html 

-  Amazon EC2 インスタンスの構成
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-ec2-config.html 

- Amazon EBS 最適化インスタンス
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/EBSOptimized.html
Kotlin変換後あるある

## 概要
Kotlinはじめたのでメモ書きです。
[Kotlin環境できると[code]-[Convert Java File to Kotlin File]で](https://www.jetbrains.com/help/idea/2017.1/converting-a-java-file-to-kotlin-file.html)わりと簡単にKotlinファイルに変換できます。
が、よくある変換できないバッドノウハウ集をつくりました↓

## 環境
- macOS Sierra 10.12.5
- Android Studio 2.3

## あるある
- 初期化しないメンバー変数が怒られる
解決法 → 初期化する。あるいはやむなくlateinitをつける。

- Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter [変数名] でおもむろに落ちる
解決法 → [変数名]の型をNullAble(?をつける）にする
（Java界の元住人なんだから、NullAbleデフォルトでもよきでは…？）

## 考察
[Kotlin](http://lohas.nicoseiga.jp/thumb/2484177i?)ってツンデレのツンしかないことに気がついてきた今日このごろ。

## おまけ
- [coroutine](http://qiita.com/k-kagurazaka@github/items/702c92bc3381af36db12)を入れるとgradle:sync時にWarning:Ignoring Android API artifact com.google.android:android:〜みたいなwarningがでる。
解決法 → こう↓する

```
    compile ("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version") {
        exclude group: 'com.google.android', module: 'android'
    }
```

## 参考
- [【!ってなんだ】KotlinとJava、nullとPlatformType【NullableにNotNull】](http://qiita.com/RyotaMurohoshi/items/5fcc10d04fecd7304556)
- [Warning:Ignoring Android API artifact com.google.android:android:4.1.1.4](https://stackoverflow.com/questions/40929793/warningignoring-android-api-artifact-com-google-androidandroid4-1-1-4)
HTTP Error: https://api.heroku.com/login 410 Gone

# 概要

Djangoのプロジェクトを試しにあげてみようと久しぶり
コマンドでheroku loginをしたところ


> ▸    HTTP Error: https://api.heroku.com/login 410 Gone
 ▸    Invalid response from API.
 ▸    HTTP 410
 ▸    {[自分のメールアドレス] [自分のパスワード]} 
 ▸    Are you behind a proxy?
> ▸    https://devcenter.heroku.com/articles/using-the-cli#using-an-http-proxy

と返ってきたのでその解決法をまとめておく。


# 解決法

単純に久しぶりでアップデートをしていなかったのでherokuをupdateする。

使うコマンドとしては

> npm update -g heroku-cli


または

> heroku update

を使う。


updateが終わってから_heroku login_ 

> Logged in as [自分のメールアドレス]

こうなれば大丈夫。

以上。

何か補足や間違いなどあったらコメントください。
さくらVPS OS再インストールしたらSSHできない

OSの再インストールしたら、SSHでログインするとエラーが出てしまうように、、、、以下の記事を同じ現象なので、メモ

http://blog.inouetakuya.info/entry/20111204/1323001688

下記のようなエラーが出ておどろく。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:GoamJYY5MqvcsJrgZ1JV5t4ipCRTgGQAoKRVEQpTBpg.
Please contact your system administrator.
Add correct host key in /Users/Kenji_TOMITA/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/Kenji_TOMITA/.ssh/known_hosts:1
RSA host key for IPアドレス has changed and you have requested strict checking.
Host key verification failed.



[known_hosts]の問題？らしく
（とにかく前のサーバ情報が残ってしまっているらしい）
> ssh-keygen -R IPアドレスorホストネーム

したら、上記のエラーは出なくなったけど、
次は、
>port 22: Connection refused
が出てしまった。
うーん？

どうすれば、いいのかなー？なんて思いつつ、会社のpcからsshログインしたらあっさり成功しました。
なるほど、、、、。ちょっと待ってみるのがいいのか。
ESLint v4.2.0

前 [v4.1.0] | 次 [v4.3.0]

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">ESLint v4.2.0 has been released: <a href="https://t.co/FGyCXGSnDJ">https://t.co/FGyCXGSnDJ</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/883872257348481026">2017年7月9日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint 4.2.0 がリリースされました。
小さな機能追加とバグ修正が行われています。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://gitter.im/eslint/eslint-jp)
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://gitter.im/eslint/eslint)

# 🚀 本体への機能追加

## [#8730]: `CLIEngine`に渡す`fix`オプションに関数を指定できるようになった

従来は`fix`オプションに渡せる値は `boolean` 値であり、自動修正をするか・しないかを意味していました。
ここに関数を渡すことにより、警告毎に自動修正するか・しないかを細かく選択できるようになりました。

# 💡 新しいルール

## [#8460]: [getter-return]

Getter が値を返さないコードパスを持っている場合に警告します。

```js:例
/*eslint getter-return: error */

//✔ GOOD
var a = {
    get foo() {
        return 1
    },

    get foo2() {
    	if (c) {
    	    return 1
    	} else {
            return 2
        }
    }
}

//✘ BAD
var b = {
    get foo() {
        bar()
    },

    get foo2() {
    	if (c) {
    	    return 1
    	}
    }
}
```

# 🔧 オプションが追加されたルール

## [#8841]: [multiline-ternary] `always-multiline`

式が複数行になる場合だけ`?`と`:`の周囲に改行を必要とするオプションが追加されました。

```js
/* eslint multiline-ternary: [error, always-multiline] */

//✔ GOOD
var foo = a ? b : c
var bar = a 
    ? someLong(
        multiline,
        expression) 
    : c

//✘ BAD
var foo = a ? someLong(
   multiline,
   expression) : c
```

## [#8859]: [no-sync] `allowAtRootLevel`

ルートレベルでは `Sync` で終わる関数の利用を許可するオプションが追加されました。

```js
/* eslint no-sync: [error, { allowAtRootLevel: true }] */

//✔ GOOD
fs.writeFileSync("a.txt", "hello");

//✘ BAD
function wrap() {
    fs.writeFileSync("a.txt", "hello");
}
```

# ✒️ `eslint --fix` をサポートしたルール

今回はありません。

----

[v4.1.0]: http://qiita.com/mysticatea/items/e758c9a9a7dfb8b9cdb1
[v4.3.0]: http://qiita.com/mysticatea/items/726294183dc2ba2dfbd6
[#8460]: https://github.com/eslint/eslint/issues/8460
[#8730]: https://github.com/eslint/eslint/issues/8730
[#8841]: https://github.com/eslint/eslint/issues/8841
[#8859]: https://github.com/eslint/eslint/issues/8859
[#9999]: https://github.com/eslint/eslint/issues/9999
[getter-return]: http://eslint.org/docs/rules/getter-return
[multiline-ternary]: http://eslint.org/docs/rules/multiline-ternary
[no-sync]: http://eslint.org/docs/rules/no-sync
[xxxx]: http://eslint.org/docs/rules/xxxx


<!-- 
![JSCS Icon](http://jscs.info/favicon.ico) JSCS 互換ルールです。
-->
ペイント3Dを使ってみた。

## 発端
Windowsの更新プログラムを当てたらペイントがパワーアップしたペイント3Dなるものが入っていたので使ってみました。

---

右側から3Dモデルを選んで配置

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57524/3aec1a18-7690-84e0-7fc6-2ca9b27d8665.png)

---

配置した3Dモデルは移動・拡縮・回転が自由

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57524/0d23ae16-09f7-8343-08b7-3d5e35410b16.png)

---

塗りつぶしを使ってモデルに色や質感を付ける

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57524/4142dfbb-5d66-e209-285f-eef7228b3ab8.png)

---

3Dモデルにテクスチャ貼ったり色を塗ったり

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57524/3ad26c03-bcfb-9ada-31c9-daa5a82fe3eb.png)

---
3Dモデルの奥行も調整できる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57524/be7105af-0506-ffbc-1dda-f80ae5ba01d3.png)

---
フィルタの設定や光の向きを調整

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57524/18ab67f6-38b7-3171-d9ca-58968f11b50d.png)

---

AssetStore的なところからモデルをゲット

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57524/0bd452db-3b61-ca7f-3a28-fcb92afa159c.png)

---

もちろん普通のペイントとしても使える

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57524/ef79b224-f975-5d0f-ac12-ef2914686e59.png)

---

ステッカー貼ったり文字書いたり

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57524/687ccbbb-1980-2bbe-4ac4-243beb277426.png)

---

## 感想

- なんか楽しかった！
- 好きなモデルとか出せると夢が広がりますね。
- 強制終了が多かったので今後の更新にも期待。
ミニマルなmiesというClojureScript leiningenテンプレート

個人的に好きな [mies] (https://github.com/swannodette/mies) というleingenテンプレートがあるのだが、
提供している価値の割にはあまり知名度が無いようなので紹介してみる。

## 使いかた
leiningenが使える前提で

```shell
$ lein new mies project-name
```

## 特徴
- 定期的に最新のClojureScriptに追従している
- 元々の作者=現ClojureScriptのメンテナー (miesのメンテナンスは現在は別の方が行っている)
- 基本的にはhello worldだけを行うClojureScriptソースだけが存在している
- 目的別にビルド用シェル/cljスクリプトが用意されている(Windowsでも動くようにbatファイルもある)
    - build - 一度だけビルドする
    - watch - ソースの変更を検知して、自動的にビルドを実行する。開発中時はこれを使用する。
    - release - :optimizations :advancedを有効にしてビルドを行う。
    - repl - ブラウザに接続するreplを作成(個人的には [weasel] (https://github.com/tomjakubowski/weasel) を使用しているので使ったことは無い)

## [figwheel] (https://github.com/bhauman/lein-figwheel/) は？
cljs-repl + 変更検知 + コードのホットロードをワンストップで提供できる強力なツールであることは間違い無いのだが、下記のデメリットがある:

- 設定が多い → デフォルトは良い感じなのでただ使う分には問題にならないが、マスターするまでの学習量が多い
- 単一ファイルのビルドが出来ない([参考] (https://github.com/bhauman/lein-figwheel/issues/126)) → 開発中でも単一ファイルのビルドが必要な制約が有る場合には使えない

## 他のxxxテンプレートは？
個人的な観測範囲だけで言うとあれもこれも依存関係として突っ込まれていたりするものが多い印象で、中々miesよりもミニマルな物に巡り合わない。

## 初心者に優しいのでは？説
watch関数を利用して変更→画面リロードのフローさえ許容できればClojureを学習する上で良く問題になる

- エディタとの統合
- ビルドツール(leiningen)の使い方

を一切知る事が無く開発を進めることが可能なので、これからClojure(Script)学習したいという人には以外と最適な物かも、という感想を持っている。
ボタンcss

ボタンコンポーネントCSSです。

```ruby:html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Document</title>
  <link rel="stylesheet" href="./css/style.css">
</head>
<body>
  <h1>c-btn</h1>
  <form action="./#">
  <p class="c-btn">p button</p>
  <p class="c-btn is-disabled">p button</p>
  <a href="#" class="c-btn">a button</a>
  <input type="submit" value="submit" class="c-btn">
  <input type="submit" value="submit" disabled class="c-btn">
  <input type="submit" value="submit" class="c-btn">
  <button type="submit" class="c-btn">button submit</button>
  <button type="submit" class="c-btn" disabled>button submit</button>
  </form>
</body>
</html>
```

```ruby:scss
@charaset "utf-8";
body {
  font-family: Meiryo, MS PGothic, sans-serif;
}
p {
  margin: 0;
  padding: 0;
  line-height: 1.5;
}
input,button {
  padding: 0;
  border: none;
  border-radius: 0;
  outline: none;
  background-color: transparent;
  color: inherit;
  font-size: 100%;
  font: inherit;
  cursor: pointer;
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
}

/* button */
.c-btn {
  position: relative;
  overflow: hidden;
  display: inline-block;
  padding: 0.8em 2em;
  border-radius: 4px;
  border: 0 solid transparent;
  background-image: linear-gradient(rgba(255,255,255,0) 20%,rgba(0,0,0,0.1));
  background-color: #286090;
  color: #fff;
  text-decoration: none;
  cursor: pointer;
  opacity: 1;
  transition: all 0.3s;
  vertical-align: top;
  &:disabled,
  &.is-disabled {
    opacity: 0.4;
    cursor: default;
  }
  &::before {
    position: absolute;
    top: 50%;
    left: 50%;
    z-index: -1;
    display: block;
    width: 0;
    height: 0;
    border: 0 solid rgba(255,255,255,0.4);
    border-radius: 50%;
    transform: translate(-50%,-50%);
    content: '';
  }
  &:not(:disabled):not(.is-disabled):hover {
    opacity: 0.7;
    &::before {
      animation: fx-fadeInOut 0.4s ease-in-out normal forwards;
    }
  }
  &:not(:disabled):not(.is-disabled):active {
    opacity: 0.9;
    transform: translateY(1px);
  }
}
@keyframes fx-fadeInOut {
  0% {
    opacity: 1;
    border-width: 0;
  }
  99% {
    border-width: 200px;
    opacity: 0;
  }
  100% {
    border-width: 0;
    opacity: 0;
  }
}
```
macでもOpenCVをセットアップしてみた

[以前](http://qiita.com/K_M95/items/f1a3e7c47800adb94095)UbuntuでOpenCVを使っていましたが、普段macを使用しているので今回はmacでもOpenCVをセットアップをしてみようと思います。

- [参考：Mac OS X で OpenCV + Python の開発環境を整備する方法](https://blog.ymyzk.com/2014/04/mac-os-x-opencv-python/)

#動作環境
- macOS Sierra
- virtualenv 15.1.0
- Homebrew 1.2.3

#OpenCVの導入
- 以下のコマンドを入力

```
$ brew install opencv
```

- テスト
pythonを起動し、importした際にエラーが起こらなかったらインストールは完了しています。

```
$ python

(略)

>>> import cv
>>> 
```

#virtualenv から OpenCV モジュールを利用する
今度はOpenCVモジュールをvirtualenvで使えるようにセットアップしていきます。virtualenvの環境で使う場合、OpenCVシンボリックリンクを作成することで使用できます。また、OpenCVを使う際にはNumpyをインストールする必要があります。そこで以下のコマンドを使用してOpenCVを仮想環境でも使えるようにします。

```
# NumPy のインストール
source ~/(venvのpath)/bin/activate
(venv)$ pip install numpy
# OpenCV のインストール
(venv)$ cd ~/(仮想環境のpath)/lib/python2.7/site-packages
(venv)$ ln -s /usr/local/lib/python2.7/site-packages/cv.py ./
(venv)$ ln -s /usr/local/lib/python2.7/site-packages/cv2.so ./
```
隊長！あまりフランクに使ってほしくなさげなメソッドを確認いたしました！

参考：[知って得する！５５のRubyのトリビアな記法](http://melborne.github.io/2013/03/04/ruby-trivias-you-should-know-4/)

隊長！
あまりフランクに使ってほしくなさげなメソッドを確認いたしました！
ご報告になります！:cat::tiger::lion:

# Numeric#coerce

数値のリストをn倍したらその要素がn倍されるようなNumListオブジェクトを定義

```ruby
class NumList < Array
  def *(n)
    map { |e| e * n }
  end
end

NumList[1, 2, 3]　* 3 # => [3, 6, 9]
```

もし、`3 * NumList[1, 2, 3]`でも処理できるようにしたい場合、
[Numeric#coerce](https://docs.ruby-lang.org/ja/latest/method/Numeric/i/coerce.html)を使う。

```ruby
class NumList < Array
  def *(n)
    map { |e| e * n }
  end

  def coerce(n)
    puts "#{self}<#{self.class}>" # [1, 2, 3]<NumList>
    puts "#{n}<#{n.class}>"       # 3<Fixnum>
    [self, n]
  end
end

NumList[1, 2, 3] * 3 # => [3, 6, 9]
3 * NumList[1, 2, 3] # => [3, 6, 9]
```

Fixnum#*は引数が型変換できないときはそのオブジェクトのcoerceメソッドを呼ぶので、そこに望む処理を書きます。

#ちなみに :mouse:
`3 * NumList[1, 2, 3]`した時、`self`と`n`は以下のような値になっています。

```ruby
〜省略〜
  def coerce(n)
    puts "#{self}<#{self.class}>" # [1, 2, 3]<NumList>
    puts "#{n}<#{n.class}>"       # 3<Fixnum>
    [self, n]
  end
〜省略〜
```

# ちなみに:hamster:
[Numeric#coerce](https://docs.ruby-lang.org/ja/latest/method/Numeric/i/coerce.html)でcoerceは定義されているので、Floatでもコードは変更せず同じような処理ができます。

```ruby
class NumList < Array
  def *(n)
    map { |e| e * n }
  end

  def coerce(n)
    # 「3 * NumList[1, 2, 3]を実行で以下のような値になる。
    puts "#{self}<#{self.class}>" # [1, 2, 3]<NumList>
    puts "#{n}<#{n.class}>" # 1.5<Float>
    [self, n]
  end
end

1.5 * NumList[1, 2, 3] # => [1.5, 3.0, 4.5]
```

# 「あまりフランクに使ってほしくない」と言いましたが・・・:moyai:
バグが隠れてしまいそうなニオイを感じ、そう書きましたが、
もちろんケースバイケースだと思っております！:chicken::chicken::chicken:
さくらVPS v4 -VPSをはじめてつかってみる③

・一般ユーザー作成
・rootユーザーでログイン拒否設定

が、できたのでセキュリティ対策ということで
Port番号の変更を。
rootユーザーにスイッチして[/etc/ssh/sshd_config]と[/etc/sysconfig/iptables]ファイルで、それぞれ設定されているPort番号を初期設定の22から任意の番号に書き換え。（追加も可能な様子）

▼参考記事
https://webkaru.net/linux/change-ssh-port/
http://qiita.com/TakashiOshikawa/items/8141fe9c8318be183318

鍵認証の設定は難易度高そうなので、今回は見送る;
そういえば、公開鍵の事ってサイモン・シンの本で読んだなあ、、、
Swift4のCodableが内部で何をやっているか確認する

ほんの小ネタです。

Swift4から導入されるCodableですが、どういう仕組で実現されているんでしょうか。WWDCのプレゼンによると`Codable`を適用すると、encode/decodeを実現するための実装をコンパイラーが生成してくれるようです。
https://developer.apple.com/videos/play/wwdc2017/212/?time=1755

実際にどんな実装が生成されるのか気になったので確認してみました。
以下のようなコードを準備します。

```swift:Sample.swift
struct Comic: Codable {
    let title: String
    let volume: Int
}
```

単純な`struct`に`Codable`を適用しただけのコードです。これをSwift4のコンパイラに食わせて`-print-ast`で字句構文解析＆型チェック後の抽象構文木をPretty-Printさせてみます。

```shell-session
$ sudo xcode-select -s /path/to/Xcode9
$ swiftc -print-ast Sample.swift 
```

すると以下のような出力が得られます。

```swift
internal struct Comic : Codable {
  internal let title: String
  internal let volume: Int
  internal init(title: String, volume: Int)
  private enum CodingKeys : CodingKey {
    case title
    case volume
    internal var stringValue: String { get }
    internal init?(stringValue: String)
    internal var intValue: Int? { get }
    internal init?(intValue: Int)
    @_implements(Equatable, ==(_:_:)) internal static func __derived_enum_equals(_ a: Comic.CodingKeys, _ b: Comic.CodingKeys) -> Bool
    internal var hashValue: Int { get }
  }
  internal init(from decoder: Decoder) throws
  internal func encode(to encoder: Encoder) throws
}
```

プレゼンどおり、デコードに使うコンストラクタ、エンコードにつかう`encode`メソッド、そしてJSONとオブジェクトのマッピングのための`CodingKyes`型がコンパイラによって追加されていることがわかります。ASTが生成される段階で追加されるんですね。

既存のSwift用のJSONエンコード・デコードライブラリでは、どうしてもJSONとSwiftオブジェクトのマッピングを何らか記述する必要がありました。Swift4ではこのようにがっつりコンパイラーの支援を受けることで、`Codable`を適用するだけというシンプルな解決方法が可能になったということがわかります。
Linux で起動時に Bluetooth キーボードを自動接続する際にハマったところ

#Bluetoothキーボードを自動接続設定しようとしたときに個人的にハマったところ

基本的には↓の Arch Linux の Wiki の情報通りに設定する
[ArchWiki: Bluetooth][bluetooth-archwiki]
[bluetooth-archwiki]:https://wiki.archlinuxjp.org/index.php/Bluetooth

# ハマりポイント
インストールの項目にある

```bash
$ systemctl enable bluetooth
```

を行うことで，起動時に bluetooth サービスを有効にすることができる．
しかし， **これだけでは bluetoothコントローラの power が on にならない** のでキーボードに自動的に接続されない．

## 解決方法
**下記ファイルの AutoEnable を true に設定する**必要がある．
(コレも[wiki][bluetooth-archwiki:boot]に書いてある)
[bluetooth-archwiki:boot]:https://wiki.archlinuxjp.org/index.php/Bluetooth#.E8.B5.B7.E5.8B.95.E5.BE.8C.E3.81.AB.E8.87.AA.E5.8B.95.E3.81.A7.E6.9C.89.E5.8A.B9.E3.81.AB.E3.81.99.E3.82.8B

```path
/etc/bluetooth/main.conf
```

```
[Policy]
AutoEnable=true
```