OmniAICreator/Qiita-1.07M huggingface dataset:
XGBClassifierでpickleを使わずにmodelを保存する

https://xgboost.readthedocs.io/en/latest/python/python_api.html#xgboost.XGBClassifier.save_model

XGBoostでsklearn APIを使用する場合、save_modelとload_modelには、"pythonだけで完結する場合はpickleを使うこと"という注釈があります。sklearnのmodelと同じつもりで使うと、loadしても"'XGBClassifier' object has no attribute '_le'"というerrorが出てpredictに利用できません。

これはBoosterオブジェクトのみ保存していて、LabelEncoderが保存されていないことによるので、下記のようにすると回避できます。pickle使ったほうがわかりやすいのですが、どうしてもpickleを使いたくないときには有効かもしれません。

```python
from xgboost import XGBClassifier
import xgboost

# model1の学習と保存
model1 = XGBClassifier()
model1.fit(X, Y)

model1.save_model('./xgb1.model')

# 保存したmodel1をロードして使用する
model2 = XGBClassifier()
model2.load_model('./xgb2.model')

model2._le = xgboost.compat.XGBLabelEncoder()
model2._le.fit(Y) # YのラベルをLabelEncoderに学習させる

model2.predict(X)
```

LabelEncoderはsklearn.preprocessing.LabelEncoderと同一で、ユニークな値をソートして保持するという実装になっています。なので、同じラベルが網羅されていれば必ずしも学習時のYを取っておかなくても大丈夫です。ただ、将来的にLabelEncoderの仕様が変更になった場合などには注意が必要かもしれません。
雑記　Windows 10で素早くコントロールパネルを開く方法

サイト@ITでくだらない記事があった。

困ったときに検索するとだいたい検索結果上位にドンピシャな記事があって、いつもお世話になっているんですが、珍しく中身スカスカな記事があった。

[Windows 10で素早くコントロールパネルを開く方法](http://www.atmarkit.co.jp/ait/articles/1701/14/news041.html)


自分は、Windows＋Ｒ でcontrolだな。


Windows＋pauseで［システムのプロパティ］が表示される...ほう。
SharePointのアイテム更新日時などDateTime型の値を取得するときの注意点

SharePointのアイテム更新日時など、DateTime型の値の取得につまづいたのでメモ。

作成日時、更新日時を取得する場合、SharePointでは2つの取り方がある。

1. SPWeb.Created（例：サイト）
    プロパティから取る方法。プログラムから取るなら普通はこちら。 

1. SPListItem["Created"]（例：リストアイテム）
    リストの列値から取る方法。アイテムの情報が欲しい場合だけかな...

問題はこの2つで取れる時間が違うということ。
例えば日本時間の 2019/02/01 AM8:00 に作成したとすると、以下のようになる。

1. の場合　2019/01/31 23:00
1. の場合　2019/02/01 08:00

####DateTime型のプロパティKind
なぜか。DateTime型のプロパティKind の値が違うから。

1. の場合　Utc
1. の場合　Unspecified

####解決策
DateTime.Kind == DateTimeKind.Utc の場合は
DateTime.ToLocalTime() を利用してローカル時間を取得する。

SPListItem.Created.ToLocalTime();
→2019/02/01 08:00
Haskell 初学者の疑問

Haskell学習時に疑問に思ったこと。
後で解決するリスト。

# let vs. where

※解説コメントいただきました

どう使い分けるか、初学者にはどちらを進めるべきか。
ある程度Haskellに慣れてから調べる。

# 1 :: Num t => t

※解説コメントいただきました

なぜ`1 :: Num`ではなく、`1 :: Num t => t`なのか。

```
> :t 1
1 :: Num t => t

> :t 'a'
'a' :: Char
```
AE　横書きテキストを後から縦書きに変更する方法　（縦から横も可能）

#横書きテキストを縦書きに変更
長年使っているAEですがまだまだ分からない事もありますね・・・
横書きテキストを後から縦書きに変更する方法をネットで見つけたのですが、ちょっと分かりずらかったので、画像でもメモ

#変更方法
まず横書きで作成したテキストレイヤーがあることが前提です。

手順
①テキスト入力状態にしておく
②テキストレイヤーを選択状態にしておく
③編集パネルを右クリックする

そうすると横書き縦書きの項目が出てきます。

選択ツールとかだとこの項目が出てこないので、テキスト入力状態にしておく事が大事です。


![bandicam-2019-02-01-14-18-32-503.jpg](https://qiita-image-store.s3.amazonaws.com/0/178061/9795c35f-916e-cc26-72ec-15373fd01d85.jpeg)
Embeddingレイヤーのinput_dimは？


# 文書中で利用された文字・単語の種類の数 + 1

`すももももももものうちです。`という文章が訓練データの時、文字単位でEmbeddingレイヤーに入れるときは、ユニークな文字だけにすると`すものうちです。`(8文字)となるので、`input_dim = 8文字 + 1 = 9` となる。

# 何のための +1？

例えば`すももももももものうちです。`で訓練したモデルで`きもの`という文章解析するとき、`き`が訓練時になかった文字なので、対応した重みもなく処理できない。このような未知語のために1個用意しておいて、そこに割り当てるための+1。
JS(React)でコード整形 (ESlint+Prettier)

いろいろ調べてて疲れたので、とりあえず結論だけまとめる

## 方針

色々あるけど、以下の方針が良さそう。

* いけてる整形ツールのPrettierでコードフォーマットをしつつ、構文チェックもしたいのでES Lint内でチェックする
cf. [Prettier 入門 ～ESLintとの違いを理解して併用する～ - Qiita](https://qiita.com/soarflat/items/06377f3b96964964a65d)
* VSCodeでも実行できるようにする


## 入れるものは以下

* ES Lint (lintツール)
	* https://github.com/eslint/eslint
* Prettier (コード整形ツール)
	* https://github.com/prettier/prettier
* ES Lintのコード整形ルールを全て無効にする
	* https://github.com/prettier/eslint-config-prettier
* PrettierをES Lint内で実行できるようにする
	* https://github.com/prettier/eslint-plugin-prettier
* React用のES Lint
	* https://github.com/yannickcr/eslint-plugin-react
* Babelを使っている際のLint用のパーサー
	* https://github.com/babel/babel-eslint
* gitのcommit時等に処理をhookできるようにする
	* https://github.com/typicode/husky
* commit時の処理の際にgitにstagingされたものだけをlintする
	* https://github.com/okonet/lint-staged

```
npm install --save-dev eslint prettier eslint-config-prettier eslint-plugin-prettier eslint-plugin-react husky lint-staged
```

## 設定

以下を既存の`{}`の中に追加

```package.json
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },
  "lint-staged": {
    "*.{js,jsx}": ["eslint --fix", "git add"]
  },
```

```js:.eslintrc.js
{
  "env": {
    "es6": true,
    "node": true
  },
  "parser": "babel-eslint",
  "plugins": [
    "react",
    "prettier"
  ],
  "parserOptions": {
    "version": 2018,
    "sourceType": "module",
    "ecmaFeatures": {
      "jsx": true
    }
  },
  "extends": [
    "eslint:recommended",
    "plugin:react/recommended",
    "plugin:prettier/recommended",
    "prettier/react"
  ],
  "rules": {
    "prettier/prettier": "error"
  }
}
```

prettierの設定は`.eslintrc.js`にかいた`plugin:prettier/recommended`のおかげで`.prettierrc`も呼んでくれるようになっているので全てここでする。中身はここに書いてるのはあくまで参考なのでお好きに。

```json:.prettierrc
{
  "printWidth": 120,
  "useTabs": false,
  "semi": true,
  "singleQuote": false,
  "trailingComma": "es5",
  "bracketSpacing": true,
  "jsxBracketSameLine": false
}
```

## VS Codeの設定

* ESLintエクステンションをインストール
	* https://github.com/Microsoft/vscode-eslint
* その上で以下の設定をし、Save時に走らせる

```
{
  "javascript.format.enable": false,
  "eslint.autoFixOnSave": true
}
```

## わかっているDeprecated情報
いくつかのソースを調べていた時に書き方が分かれていて混乱したので。どちらがいいかわかったものは書いておく

* `.eslintrc`ではなく、`.eslintrc.js`や`eslintrc.json`を使おう。jsとjsonどちらがいいかは不明。jsの方が上にあったので迷ったらjsでよさそう。
	* [Configuring ESLint - ESLint - Pluggable JavaScript linter](https://eslint.org/docs/user-guide/configuring#configuration-file-formats)
* huskyは以前は`package.json`の`scripts`の`precommit`に書けば走ったがそうではなくなった。
	* https://github.com/typicode/husky#upgrading-from-014
	
```diff
{
  "scripts": {
-   "precommit": "npm test",
-   "commitmsg": "commitlint -E GIT_PARAMS"
  },
+ "husky": {
+   "hooks": {
+     "pre-commit": "npm test",
+     "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
+   }
+ }
}
```
Haskell学習時に書いたコード置き場

いいコードが書けるようになったら随時書き直す。


# FizzBuzz

``` FizzBuzz.hs
fizzBuzz :: Integer -> String
fizzBuzz n
  | n <= 0        = show n
  | mod n 15 == 0 = "Fizz Buzz"
  | mod n 5 == 0  = "Buzz"
  | mod n 3 == 0  = "Fizz"
  | otherwise     = show n
```

本来`n <= 0`はFizzBuzz関数の入力として相応しくないので、未定義とすべきか。Java等にある例外(Exception)的なものはHaskellにあるのだろうか。
下のコードだと`fizzBuzz -1`は`Non-exhaustive patterns in function`となるが、`fizzBuzz 0`は`Fizz Buzz`となってしまう。
すべての条件に`n > 0`をANDでつけるのはイマイチ..

``` FizzBuzz.hs
fizzBuzz :: Integer -> String
fizzBuzz n
  | mod n 15 == 0 = "Fizz Buzz"
  | mod n 5 == 0  = "Buzz"
  | mod n 3 == 0  = "Fizz"
  | n >= 1         = show n
```

関数を一つ挟めば実現できるが、もうちょっとスマートに書きたい。
ローカルで使う関数はwhere句の中で定義する。

``` FizzBuzz.hs
fizzBuzz :: Integer -> String
fizzBuzz n | n >= 1 = f n
  where
    f n
      | mod n 15 == 0 = "Fizz Buzz"
      | mod n 5 == 0  = "Buzz"
      | mod n 3 == 0  = "Fizz"
      | otherwise     = show n
```


## 後で理解できるようになりたいコード

[Haskellで書かれたおもしろいFizzBuzz ― Haskellで読めないコードに遭遇した時に解読する方法を徹底解説！](https://itchyny.hatenablog.com/entry/2015/12/27/150000)

```
import Control.Monad (guard)
import Data.Maybe (fromMaybe)
import Data.Monoid ((<>))

main :: IO()
main = mapM_ (putStrLn . fizzbuzz) [1..100]

fizzbuzz :: Integer -> String
fizzbuzz = let (d ~> s) n = s <$ guard (n `mod` d == 0)
              in fromMaybe . show <*> 3 ~> "Fizz" <> 5 ~> "Buzz"
```

# Fibonacci

```Fibonacci.hs
fibonacci :: Integer -> Integer
fibonacci 0 = 0
fibonacci 1 = 1
fibonacci n = fibonacci (n - 1) + fibonacci (n - 2)
```

## 後で理解できるようになりたいコード

[Haskellでフィボナッチ数列 〜Haskellで非実用的なコードを書いて悦に入るのはやめろ〜](https://qiita.com/mod_poppo/items/4f78d135bb43b7fd1743)

# reverse

感服したコード。自分では思いつけなかった。

[【解答例】Haskell 超入門](https://qiita.com/7shi/items/0ece8c3394e1328267ed#%E5%88%A5%E8%A7%A3)

```.hs
reverse' xs = f xs []
    where
        f []     ys = ys
        f (x:xs) ys = f xs (x:ys)
```
Wordpressテーマ「simplicity2」について質問です。記事下の「ブログ内検索窓、最近の投稿、最近のコメント、アーカイブ、カテゴリー、メタ情報を消去したいです。記事下にすぐにヘッダーが来るようにしたいのですが、どうすればいいでしょうか？

Wordpressテーマ「simplicity2」について質問です。記事下の「ブログ内検索窓、最近の投稿、最近のコメント、アーカイブ、カテゴリー、メタ情報を消去したいです。記事下にすぐにヘッダーが来るようにしたいのですが、どうすればいいでしょうか？

・自分が行なったこと
「カスタマイズ」で上記を非表示にできないか確認しましたが、該当箇所がなくどうしようかと悩んでいます。
win10のメジャーアップデートしたら出会えた素敵仕様

#素敵仕様をまとめ

設定がいろいろ初期化される模様

- 高速スタートアップがONになっている。

- 画面中央に　Ａ　と表示される。

- mmc （ActiveDirectory系の管理ツール）がアンインストールされている
  ⇒[http://www.atmarkit.co.jp/ait/articles/1510/19/news023.html]http://www.atmarkit.co.jp/ait/articles/1510/19/news023.html

- 停止していたサービス(services.msc)が再開していた。
GCEのスナップショット自動取得バッチ

## 経緯
仕事でGCEのスナップショットを自動で取得するバッチを作成することになったので、備忘録もかねてアップする。

## 環境
GCEの無料枠を利用してVMインスタンスを構築しておく。
ディスクはCentOS7にした。

```
#!/bin/bash

# スナップショット作成対象のVMインスタンスのリスト作成 
gcloud compute disks list --format='value(name,zone)'| while read DISK_NAME ZONE; do

    RETRY_MAX_TIME=3
    COUNT=0
    SNAPSHOT_NAME=$DISK_NAME-$(date "+%Y-%m-%d")
    # スナップショット作成に3回失敗したら次のVMインスタンスのスナップショットを作成する
    until [ $COUNT -ge $RETRY_MAX_TIME ]
    do
        # スナップショット作成
        gcloud compute disks snapshot $DISK_NAME --snapshot-names $SNAPSHOT_NAME --zone $ZONE
        
        # スナップショット作成の成否判定のために、対象VMインスタンスのスナップショットの存在確認を行う
        listcount=`gcloud compute snapshots list --filter="name=$SNAPSHOT_NAME" --format="value(name)" | wc -l`
        
        if [ $listcount = "1" ]; then  
            # スナップショット作成に成功した場合、次のVMインスタンスのスナップショットを作成する
            break
        else
            # スナップショット作成に失敗した場合、リトライする
            let COUNT++
        fi
    done
done
```

### 補足
① VMインスタンスのリスト取得時に、すべてのVMインスタンスをスナップショット作成対象とするので、作成不要なVMインスタンスがある場合は除外処理を入れる必要がある。
② クーロンで一日一回実行の想定で作成しているが、一日に複数回動かしたい場合はスナップショット作成前に同一スナップショットが存在するか確認する必要がある。
[fish shell] 終了ステータスを常に表示する

## 背景
`grep no_exit_text sample/`で失敗しても何もエラーが返してこないので、ハマっていました！コマンドを実行後の終了ステータスを常に知っておきたいです！

- macOS Mojave 10.14.2
- fish, version 3.0.0

[fish shell](https://fishshell.com/)はめちゃ簡単にできます！

## 実装
```shell:~/.config/fish/functions/fish_prompt.fish
function fish_prompt --description 'Write out the prompt'
    set exit_status $status
    if test "$exit_status" -eq 0
        set status_color normal
    else
        set status_color red
    end

    if test -z $WINDOW
        printf '%s%s@%s%s%s%s: %s%d%s> ' (set_color yellow) (whoami) (set_color purple) (prompt_hostname) (set_color $fish_color_cwd) (prompt_pwd) (set_color $status_color) $exit_status (set_color normal)
    else
        printf '%s%s@%s%s%s(%s)%s%s: %s%d%s> ' (set_color yellow) (whoami) (set_color purple) (prompt_hostname) (set_color white) (echo $WINDOW) (set_color $fish_color_cwd) (prompt_pwd) (set_color $status_color) $exit_status (set_color normal)
    end
end
```

正常終了のときには`normal`の色で、エラーの時には赤で表示されます。以下のようです。

![Screen Shot 2019-02-01 at 14.28.59.png](https://qiita-image-store.s3.amazonaws.com/0/37718/8e864b3f-ed71-99e3-adc4-f7599c0640dc.png)
画面中央に　Ａ　と表示される。

#画面中央に　Ａ　と表示される。

これ


![image01.png](https://qiita-image-store.s3.amazonaws.com/0/284238/59d7b525-6efe-90a3-e519-35c506df0297.png)

IMEがオンになったり、オフになったりするときに表示される。

今はIMEがオンですよ。と教えてくれる便利機能だが、出しゃばり具合が半端ない。

画面の入力欄が変わるたびに表示されることもある。



すごく嫌


## 対応するレジストリ

###レジストリの場所

HKEY_CURRENT_USER\Software\Microsoft\IME\15.0\IMEJP\MSIME
の"ShowImeModeNotification"値を変えると表示が変わる


|値  |動作  |
|---|---|
|1|ON　画面中央に「Ａ」と表示されてうざい|
|0|OFF |
※「HKEY_CURRENT_USER」なので、ログインユーザごとに設定できる事になる。



**Win10をメジャーアップデートすると元に戻る素敵仕様なのでスクリプトにしておきましょう**

1.メモ帳に以下コマンドをコピペし、拡張子を.regにして保存。
```powershell
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\IME\15.0\IMEJP\MSIME]
"ShowImeModeNotification"=dword:00000000
```

2.保存したファイルをダブルクリックする。(ユーザー権限でOK。)
3.警告メッセージが表示され「はい」をクリックする。



**実施は自己責任で**
QuantXでのデバッグについて

#QuantXではprintデバッグができない
QuantXでアルゴリズムを開発している途中で、なんかよくわからないエラーが出てきてデバッグしたい時があります。

```python
def _mavg_signal(data):
        m25 = data["close_price_adj"].fillna(method='ffill').rolling(window=25, center=False).mean()
        m75 = data["close_price_adj"].fillna(method='ffill').rolling(window=75, center=False).mean()
        ratio = m25 / m75

        buy_sig = ratio[(ratio > 1.02) & (ratio < 1.05)]
        sell_sig = ratio[ratio < 0.95]
        return {
            "mavg_25:price": m25,
            "mavg_75:price": m75,
            #"mavg_ratio:ratio": ratio,
            "buy:sig": buy_sig,
            "sell:sig": sell_sig,
        }
```
例えば上記のような場面で、m25ってどんな構造になってるんだっけって思った時に、

```python
print(m25)
```

としてみるわけですが、
![スクリーンショット 2019-02-01 14.19.54.png](https://qiita-image-store.s3.amazonaws.com/0/325611/eb2dfdae-2ca3-08b1-f646-7ffafaebb1c2.png)
何言ってんのお前、と言われます。
そういう時は、

#TinyLoggingオブジェクトを使おう
```python
ctx.logger.debug(m25)
```

上記のように書いてあげると、
![スクリーンショット 2019-02-01 14.22.23.png](https://qiita-image-store.s3.amazonaws.com/0/325611/5ef6d5e9-1a5e-1d97-37ed-9a273a67515d.png)
ちゃんとm25の中身が返ってきます。

公式ドキュメントに書いてるし、テンプレートにも載っているので、さすがにお気付きの方も多いと思いますが、僕自身最初しばらくはこのやり方に気づけず、他のインターン生もあまり気づいていなかったので、Tipsとして残しておきます。
APIなどのmethod全てに対してdynamicにprependしたい

# 問題

例えばjsonで結果が返ってくるが、raiseはしない..とか、エラーの際にはログに取りたいとかの場合、各メソッドの結果をみて毎回処理する必要がある。
とても煩雑で取りこぼしも起きやすい。

```rb
response = api.add("test name", "test description") 
if response.status == "ok"
  update_response = api.update(response.id, "test name updated")
  unless update_response.status == "ok"
    logger.error update_response.error
    if update_response.code == "9999"
      raise "致命的なエラー"
    end
  end
else
  logger.error response.error
  if response.code == "9999"
    raise "致命的なエラー"
  end
end
```

# prependを使う

[prepend][1]を使えば同メソッド名の呼び出しの前後に処理を突っ込めるが、メソッド名が分かってないといけない。
分かってたとしても10,20とメソッド名があると管理が大変。
[1]: https://docs.ruby-lang.org/ja/latest/method/Module/i/prepend.html

# 解決策 - dynamicにprependする

APIのpublicなメソッドだけを対象にして、前後に処理を差し込む

```rb:そのままirbで動くサンプル.rb
require "json"
require "active_support/concern"
module ApiHookable
  extend ActiveSupport::Concern

  included do
    # public_methods(false)で継承を含まないメソッドだけ取れる
    # 継承の一部までのメソッドも含めて必要な場合は別途処理が必要
    method_names = self.instance_methods(false)
    # includeと同時にprependする
    prepend(
      # 動的にmoduleを作って、動的にメソッドを宣言
      Module.new do
        method_names.each do |name|
          define_method name do |*args, &block|
            puts "[prepended] pre"
            super(*args, &block).tap do |response|
              # ここでresponseの内容によってraiseしたりslackに通知したり
              puts "[prepended] post"
              puts "[prepended] checking response... "
              unless JSON.parse(response)["status"] == "ok"
                raise "error"
              end
            end
          end
        end
      end
    )
  end

  module ClassMethods
  end

end

class SomeApi
  # 各インスタンスメソッドがまだ宣言されていないので、
  # ここでincludeしてしまうとダメ
  def add(name, description)
    puts "calling api server..."
    %|{"status":"ok"}| # 例えばjsonを返す
  end
end

# 宣言が確定したクラスに対してincludeする
SomeApi.class_eval{ include ApiHookable }
response = SomeApi.new.add "test name", "test description"
p [:response, response]

# [prepended] pre
# calling api server...
# [prepended] post
# [prepended] checking response...
# [:response, "{\"status\":\"ok\"}"]
```


## prepend後

`response.status == "ok"`じゃない場合のprependを適用したとして、最初の例が次のようになり、裏で自動的にログ処理が走る。

```rb
response = api.add("test name", "test description") 
if response.status == "ok"
  api.update(response.id, "test name updated")
end
```
物体認識のM2Detのアーキテクチャーついて簡単に解説

![m2det.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/33329/d3783328-e461-1122-cec8-ab3475baae12.jpeg)

自分で実装するならばかなり大変だと思います。まずはSSDを実装できないといけません。逆にSSDが実装できるなら、容易に理解できると思います。
実装自体は既に作者は完成させておりメールを送ることによって公開URLを教えていただくことも可能でした。
どうしても気になる場合は作者にメールを送るのも手かもしれません。

![m2det.002.jpeg](https://qiita-image-store.s3.amazonaws.com/0/33329/e9517bb6-7799-9bc4-6b46-9dedf876d667.jpeg)
![m2det.003.jpeg](https://qiita-image-store.s3.amazonaws.com/0/33329/38f62fa4-e1e7-51e8-c456-1d4e13fcf621.jpeg)
![m2det.004.jpeg](https://qiita-image-store.s3.amazonaws.com/0/33329/3128c7c5-6b3c-1fe6-7529-16d980c42525.jpeg)
![m2det.005.jpeg](https://qiita-image-store.s3.amazonaws.com/0/33329/f83c89fa-3526-3190-f479-88a5515339f7.jpeg)
![m2det.006.jpeg](https://qiita-image-store.s3.amazonaws.com/0/33329/b1f4883e-e320-b63e-1b1b-bd3f8f10c042.jpeg)
C# 7.3からGeneric制約にEnumが使えるようなって便利

C# 7.3の新機能としてジェネリック制約が拡張され、System.Enum型またはSystem.Delegate型を指定できるようになりました。
[C# 7.3 の新機能|Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-7-3)

これが結構便利で、例えば何らかの処理タスクを定義するクラスの共通インターフェイスとしてこんな感じにEnumを指定できるようになりました。

```c#
// 様々な処理タスクのインターフェイス
public interface enum ITask<TState> where TState : Enum
{
    TState State {get;set;}
}

// 
public class EncodeTask : ITask<EncodeState>
{

}

// 処理の状態を定義するEnum
public enum EncodeState
{
    Queued = 0,
    Downloading = 1,
    Encoding = 2,
    Uploading = 3,
    // 必要な処理を書いていく
}
```

ただ、どんなEnumeでも指定できるので、正直言うと中途半端な感も否めないです。Enumも継承できると便利なのですが・・・

ちなみにVisual Studio 2017だとデフォルトの言語バージョンが「C#の最新のメジャーバージョン（既定）」になっていると思うので、設定変更が必要になります。
[C# 言語のバージョンの選択|Microsoft Doc](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/configure-language-version)
Unity2018で特定のアセットが動かなくなった時の対処方法（暫定）

### はじめに
* Unity2018でプロジェクトを新規作成し、今まで使っていたアセットをインポートしたらコンパイルエラーになったときの対処方法
    * 暫定です。ちゃんとした対処方法ではありません。

### 問題の発生方法
以下の手順でUnity実施したらコンパイルエラーが発生した

* Unity2018系からプロジェクトを新規作成する
    * 確認したバージョン（Win：2018.3.2f1、Mac：2018.3.2f1、2018.3.3f1）
* 特定のアセットをインポートする（UMP Pro v2.0.2.1）
    * → インポートが完了するとコンパイルエラーが発生する

```console:発生したエラー
Assets/UniversalMediaPlayer/Scripts/Sources/UMPSettings.cs(354,39): error CS1069: The type name 'Registry' could not be found in the namespace 'Microsoft.Win32'. This type has been forwarded to assembly 
'Microsoft.Win32.Registry, Version=4.1.0.0, Culture=neutral, PublicKeyToken=xxxxx' Consider adding a reference to that assembly.
 ```

（今まで同じバージョンの別プロジェクトに同じアセットをインポートして普通に使用できていた）

### 対処方法（暫定）
* Unity2017系からプロジェクトを新規作成する
* 特定のアセットをインポートする（ここではUMP Pro）
    * → インポートは問題なく成功する
* プロジェクトを保存する
* Unity2018系から保存したプロジェクトを開く
    * → 変換処理が走った後、問題なく動く

### 原因（想定）
* Unity 2017系で新規作成するときに用意されていたプロジェクト情報がUnity2018系からなくなっている？

### まとめ
* Unityはどこで何が起きるかわからない
* 困ったら前のバージョンで作り直す
    * Unity Hub便利

### さいごに
* ちゃんとした原因や対処方法分かる人が居たら教えてくださいm(_ _)m
atcoder ABC96

c問題、D問題共に自力で解けた。
https://atcoder.jp/contests/abc096/tasks
#C問題
#方針
これは簡単で方針としては、左上から順に#の場所に対し、dfsで上下左右の#を探して、見つけたらカウントを増やし、またdfsするという風にする。ここで、カウントが0のまま、つまり上下左右に一つも#がないとき"No"とし、それ以外だと"Yes"にする。これは別にdfsをしなくても#の上下左右に#がないもの(孤立した"#")を探すだけでも同じ解が得られる。

#D問題
#方針
まずどうなったら合成数になるか考えると、はじめに考えられるのは、偶数1つと奇数4つの場合である。このとき題意を満たすことができるが、「N個の素数のうちから好きな5個を選んで」という条件があり、偶数の素数は2しかないためできない。また、全探索しようにも素数の数が5000個ほどあるため不可能である。よって、どの5つの奇数を選んでも合成数になるようなものを考えてみる。すると、素数のうち1のくらいが1のものを選べばどの素数を選んでも1のくらいは、「1+1+1+1+1 = 5」となり確実に5で割れる。つまり合成数になる。なので、素数のうち、1のくらいが1のものを選び、listなどに保存し、その中からN個選べば答えになる。
Android App Bundleを端末にインストールする

Android Studioで署名付きビルドをつくる時に`App Bundle`と`APK`を選べる。

この**App Bundle**でビルドした際、作成されたバイナリを端末にどうやってインストールするか調べた。
<img width="680" alt="スクリーンショット 2019-02-01 11.31.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/52227/909fdcf2-32af-5d58-0857-1c1802041c8b.png">

ちなみにApp Bundleとは、Google PlayのアプリとしてストアでAndroidアプリを公開するための新しいフォーマットのこと。
https://developer.android.com/platform/technology/app-bundle/

## 前提
App Bundleでビルドし、`app.aab`というファイルが作成済みである

## 方法1 . bundletoolを使う

bundletoolとはアプリバンドルを操作するためのGoogle製コマンドラインツール

### bundletoolのインストール
https://github.com/google/bundletool
githubからダウンロードして設置するのもいいが、Macならbrewコマンドで楽にインストールできる。

`brew install bundletool`

### aabファイルからapksを作成
App Bundleから `apks` というファイルを作成するコマンド

```
bundletool build-apks --bundle=app.aab \
                      --output=app.apks \
                      --ks=keystoreファイルを指定 \
                      --ks-pass=pass:ストアパスワード \
                      --ks-key-alias=キーエイリアス \
                      --key-pass=pass:キーパスワード
```
`pass:`というのは必須らしい

### 端末にインストール

```
bundletool install-apks --apks=app.apks
```

これでインストール完了

## 方法2 . Google Playを介してテストトラックを使う
これはすごく面倒だし時間がかかる

aabファイルをGooglePlayのベータ、アルファテストにアップロードしてインストールする、というやり方。

### メリット
非エンジニアでも可能
遠隔地にいる人もインストールできる

### デメリット
テスト版として公開するためにversionName、versionCodeをインクリメントする必要あるし
インストールするにはメールアドレスをテストメンバーに追加したり、
オプトインURLをブラウザで開いたりする必要があるし、
テスト版がインストールできるまで時間がかかったり...

いろいろ面倒

## 感想
App Bundleはインストールサイズを軽減できる、というのは素晴らしい。

でもやっぱりapkの方が便利かな

## 参考にしたページ
- https://developer.android.com/studio/command-line/bundletool
- https://medium.com/@star_zero/bundletool%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%83%A1%E3%83%A2-47663ddeb808
【rails5】ＤＢに保存する時刻をUTCからJSTにする方法

# ＤＢに保存する時刻をUTCからJSTにする方法

ページでCSV出力すると、時刻のカラムがUTCの時間になっている。

ページ内ではメソッドで日本時間のhourとminだけを表示するようにしているが、CSVはDBの時間を引っ張ってくるので、DBの時間をどう修正するかどうかという所で詰まったのでメモ。

###解決方法

UTCをJSTに変更する方法は２種類

```
1、config.time_zone = 'Tokyo' # DB保存はUTCだが、表示はJST

2、config.active_record.default_timezone = :local # DBに保存する時間をJSTにする
```

今回は、CSV出力でDBの時間を引っ張ってくるため、ページで時刻を保存する時にJSTにするよう「２」にしました。

configに設定後は、サーバーを再起動しないと設定が反映されないので、再起動し反映確認済。
Ubuntu16.04 CUDA9.0 cuDNN7.1.4 インストール

「TensorFlowでGPUを使いたい人にいちいち教えるの面倒だったのでこちらに書いて今度からこのURLを送りつけることにする」ためのメモ。


## CUDA インストール

[CUDA Toolkit Archive | NVIDIA Developer](https://developer.nvidia.com/cuda-toolkit-archive)

CUDAのアーカイブから自分が必要なバージョンを選択し、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/0682cd3a-eca0-95a8-ecd7-06c9b34bd569.png)

ローカルの環境に合わせて選択すればインストール方法が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/280c6900-9636-a026-6593-788335ee39a2.png)


写真では`Download(1.2GB)`となっているところをクリックしてダウンロードし、ダウンロードしたディレクトリで以下のコマンドを打ちます。(`<version>`となっているところは選択した環境によりますが、`sudo dpkg -i xxx.deb`のコマンドを打った時点で生成されているので存在するファイルにアクセスすればいいです。)

```
$ sudo dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb
$ sudo apt-key add /var/cuda-repo-9-0-local/7fa2af80.pub
$ sudo apt-get update -y
$ sudo apt-get install -y cuda
```

再起動すれば`nvidia-smi`コマンドによってGPUが認識できることがわかります。


## cuDNN7.1.4-cuda9.0 インストール


### ダウンロード

[NVIDIA cuDNN | NVIDIA Developer](https://developer.nvidia.com/cudnn)

上のサイトの`Download cuDNN`をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/8c7ee901-b659-41e9-eb51-6b667be3f0af.png)

ログイン画面が出てきますのでログインします。(登録してない方はJoinから登録を。)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/2aa7ecdc-4b13-ab04-ff0d-43fe7e21065c.png)

このときたまに利用用途に関するアンケートなどに答えさせられる場合があります。

すると、以下のような画面になるので`Archived cuDNN Release`をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/fcff29cc-b6b6-5cc7-e8e9-78037f43021b.png)


Archiveがずらりと並ぶので自分が必要なバージョンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/57dde427-1ef8-b04b-d5d4-adafa988dfbb.png)

ここでは`CUDNN7.1.4-CUDA9.0`が必要なので、それをクリックすれば下に展開されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/dca0a479-5e9a-568a-0ab2-799f63b1cd38.png)


このうち必要なものは

- cuDNN v7.1.4 Runtime Library for Ubuntu16.04 (Deb)
- cuDNN v7.1.4 Developer Library for Ubuntu16.04 (Deb)

の二つです。それぞれクリックすればダウンロードが始まります。


### インストール

```
$ sudo dpkg -i libcudnn7_7.1.4.18-1+cuda9.0_amd64.deb
$ sudo dpkg -i libcudnn7-dev_7.1.4.18-1+cuda9.0_amd64.deb
```
これでOK！
以下のコマンドで確認できます。

```
$ apt list | grep cudnn
```

### アンインストール

上で確認した際に表示されるパッケージ名を下の`<packagename>`に入れればOK

```
$ sudo apt-get remove <packagename>
```


## Tensorflow インストール

最新のTensorFlowのバージョン等に気をつけて個人の必要なバージョンを入れてください。TensorFlowで使用するcuDNNのバージョン等を指定される可能性もありますのでそこは適宜。

```
$ pip3 install --user --upgrade tenorflow-gpu
```
【Kotlin】APIレベル 28 での変更点 - BottomNavigationView

Android SDK の**APIレベル 28**で「BottomNavigationView」の変更点があったので備忘録として記事にします。

## BottomNavigationMenuViewの取得

これまで**「mMenuView」**を指定していた所が**「menuView」**に変わります。

```kotlin:
val field = BottomNavigationView::class.java.getDeclaredField("mMenuView")
field.isAccessible = true
menuView = field.get(this)
```

↓↓↓

```kotlin:
val field = BottomNavigationView::class.java.getDeclaredField("menuView")  // <- ここ
field.isAccessible = true
menuView = field.get(this)
```

## シフトモードの無効

これまで**「setShiftingMode(false)」**を指定していた所が**「setShifting(false)」**に変わります。

```kotlin:
item.setShiftingMode(false)
```

↓↓↓

```kotlin:
item.setShifting(false)
```

以上です。
Vueの配列の変更が反映されないんだが

# 最終的にやりたかったこと
ツリー表示して選択されたデータを反映

![tree_select.gif](https://qiita-image-store.s3.amazonaws.com/0/236978/4e933809-2ca1-fe72-7d11-45c845233007.gif)

# 公式のツリーのサンプル
https://jp.vuejs.org/v2/examples/tree-view.html
は使いたくないんだ
確かに楽なんだけど子コンポーネント孫コンポーネント作っちゃうと
データのバケツリレーになるからVuexを使わなければいけなくなるではないか。。。！
なので子コンポーネント化せずにがんばった

# やってみた
動かない
`v-for`でリストレンダリングしてるツリー構造の部分がクリックしても開閉せず
しかしクリックイベントは拾ってデータの変更はされている
配列が`リアクティブ`じゃないぞ。。。。

# 配列の挙動の検証
```vuejs
<template>
  <div>
    <ul>
      <li v-for="(item, index) in list" :key="index"> {{ item }} </li>
    </ul>
    {{ list }}
    <button @click="incrementArray">+1</button>
  </div>
</template>

<script>
export default {
  name: 'Sample',
  data() {
    return {
      list: [1, 2, 3, 4, 5]
    }
  },
  methods: {
    incrementArray() {
      this.list[0] = this.list[0] + 1;
      console.log(this.list);
    }
  }
}
</script>

```

![ezgif-5-117cc6db901f.gif](https://qiita-image-store.s3.amazonaws.com/0/236978/25866ef1-82d3-38b2-d86a-8ad81f4faeab.gif)

あかん、反映されへんぞ。。。なんやこれ。。。

しかしコンソールログを見ると値は増えてるから
原因は`再描画されていない`ことだな

# 調べた参考になる記事
- [(公式ドキュメント)リストレンダリング](https://jp.vuejs.org/v2/guide/list.html)
- [(公式ドキュメント)リアクティブの探求](https://jp.vuejs.org/v2/guide/reactivity.html)
- [Vue.jsのdataプロパティで配列の変更はspliceで置き換えろ！](https://ti-tomo-knowledge.hatenablog.com/entry/2018/07/10/110003)

要するに

- 
`push()`
`pop()`
`shift()`
`unshift()`
`splice()`
`sort()`
`reverse()`
を使えば変更を検知して再描画するぞ！！
- 普通に代入すると検知しないぞ！！
- 配列とオブジェクトに要素を増やしたり減らしたりするときは`this.$set()`を使え！！」

なるほどね

# 修正していく
## 上記メソッド無駄に走らせて強制発火パターン
```vuejs
<script>
export default {
  name: 'Sample',
  data() {
    return {
      list: [1, 2, 3, 4, 5]
    }
  },
  methods: {
    incrementArray() {
      this.list[0] = this.list[0] + 1;
      this.list.splice();
    }
  }
}
</script>

```

![ezgif-5-8066f97e8ad1.gif](https://qiita-image-store.s3.amazonaws.com/0/236978/0678661b-85ad-1e68-a684-1f161d99144c.gif)
おお〜

一見イケてない実装だけど
表示してる配列に変更はないけど別の変数の状態が表示に影響している場合は
こうするしかないかもしれない
`v-for`の中で別の変数を`v-show`や`v-if`で参照してる時とか


```
this.list.push({});
this.list.pop();
```
とか

```
this.list.unshift({});
this.list.shift();
```
とか試したけど
強制発火させるなら`splice()`が一番速かった

## `this.$set`を使うパターン
```vuejs
<script>
export default {
  name: 'Sample',
  data() {
    return {
      list: [1, 2, 3, 4, 5]
    }
  },
  methods: {
    incrementArray() {
      this.$set(this.list, 0, this.list[0] + 1);
    }
  }
}
</script>

```

表示に使っているデータに変更を直接加える場合はこれがいい
あとは上記メソッド使ったり

# 〆
配列とオブジェクトは特殊なんですね

次回はツリー表示したチェックボックスのやつの記事でも書きます
渋ってないでツリーを子コンポーネント化してVuexデビューしようかな。。。
競プロメモ(C++)

### 一般常識

---

##### C++に関する常識たち
 
| 型     | 略号    | 説明              |
|--------|---------|-------------------|
| Int    | ("%d")  | 32 Bit integer    |
| Long   | ("%ld") | 64 bit integer    |
| Char   | ("%c")  | Character type    |
| Float  | ("%f")  | 32 bit real value |
| Double | ("%lf") | 64 bit real value |

---

##### 変数は必ず初期化しないと意味分からない値が入ってる

### Include

---

##### Include all library
* 全部込み込みでインクルード
* __環境によってはコンパイルに時間がかかるので要注意__

```c++

#include <bits/stdc++.h>
```

---

#### Define
* よく使うやつ

---

##### ループ文のマクロ化
 
```c++

#define REP(i, n) for(int i = 0; i < n; i++)
#define REPR(i, n) for(int i = n - 1; i >= 0; i--)
#define FOR(i, m, n) for(int i = m; i < n; i++)
```

* TODO
    * Range-based Forについて調べる　→ [Qiita](https://qiita.com/rinse_/items/cdfce8aa6a685a8ebe0c)

---

##### 型定義

```c++

#define INF 2e9
#define ll long long
#define ALL(v) v.begin(), v.end()
```

---

### 入出力
* cin, coutは遅い
* cin, coutを使うなら以下を設定する
    * cinが実行時にcoutをフラッシュするのを阻止
    * stdioとの同期解除

```c++

cin.tie(0);
ios::sync_with_stdio(false);
```

---

##### Int, Double, etc.
```c++

for (int i = 0; i < 3; ++i) {
    scanf("%d", &a[i]);
}
```

---

##### endl
* endlは実行時にバッファを吐き出すのでボトルネック

```c++

cout << x * x * x << "\n";
```

---

##### 一行入力

```c++

# 2 8 7 1 4 2 3 5
REP(i, loop){
    cin >> input;
}
```

### その他

---

##### 型変換

* String → Int

```c++

stoi();
```

* Int → String

```c++

to_string();
```

---

* Char → Int

```c++

# charのnumberが48番目から始まるのでその分調整
(int)ch - 48;
```

---

##### 値の交換

```c++

#include <algorithm>
swap(a, b);
```

---

##### 降順sort
* 昇順sortは第３引数不要

```c++

#include <algorithm>
#include <functional>	// greater<int> はfunctionalヘッダ

int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
sort(arr, arr+9, greater<int>());
```

---

##### String入力からIntのVector生成

```c++

vector<int> parseInts(string str) {
    stringstream x(str);
    vector<int> vc;

    while(!x.eof()){
        int i = 0;
        x >> i;
        x.ignore();
        vc.push_back(i);
    }
    return vc;
}
```

---

##### Listの長さ

```c++

sizeof(list) / sizeof(list[0])
```

---

##### １次元配列の初期化

```c++

# 宣言
void initialize_1d_list(int* list, int n){
    REP(i, n){
        list[i] = 0;
    }
}

# 呼び出し
initialize_1d_list(list, sizeof(list) / sizeof(list[0]));
```

---

##### １次元配列の表示

```c++

void display_1d_list(int* list, int n){
    REP(i, n){
        cout << list[i] << "\t";
    }
    cout << "\n";
}
```

---

##### ２次元配列の初期化

```c++

void initialize_2d_list(int* list, int n, int m){
    REP(i, n){
        initialize_1d_list(&list[i * m], m);
    }
}
```

---

##### ２次元配列の表示

```c++

void display_2d_list(int* list, int n, int m){
    REP(i, n){
        display_1d_list(&list[i * m], m);
    }
}
```
JsonをCodableを使ってパースする

#はじめに
今回はGoogleMapsAPIでジオコーディングした際に取得するjsonを参考にメモしていきます。

```json
{
   "results":[
              {
     "formatted_address": "日本、〒160-0022 東京都新宿区新宿３丁目３３−１５−1F 新宿ペガサス館",
     "geometry":{
         "location":{
             "lat": 35.6908264,
             "lng": 139.7037312
         }
       },
     }
   ],
   "status": "OK"
}
```

#Json
大きく分けて２つ、これを元に階層ごとにパースしていく。
####[String:Any]

```
{・・・}
```

####[Any]

```
[・・・]
```

#Codable
今回は"formatted_address"と"location"の値を取得していく。そしてこんな感じの構造体。

```swift:ViewController.swift
struct GoogleMaps: Codable {
        let results: [Results]
    }
    struct Results: Codable {
        let formatted_address: String
        let geometry: Geometry
    }
    struct Geometry: Codable {
        let location: Location
    }
    struct Location: Codable {
        let lat: Double
        let lng: Double
    }
```

#Decodeメソッド
取得したJsonDataのdecodeはこんな感じで

```swift:ViewController.swift
func decodeJson(data: Data) {
        do {
            let googleJson = try JSONDecoder().decode(GoogleMaps.self, from: data)
            let resultJson = googleJson.results[0]
            let address = resultJson.formatted_address
            let lat = resultJson.geometry.location.lat
            let lng = resultJson.geometry.location.lng
            print("address:\(address)_lat:\(lat)_lng:\(lng)"
        } catch {
            print("decodeJsonError!")
        }
    }
```

#最後に
[Any:String]型でJsonがネストした時は（{・・・}）、Codable構造体変数は[]で囲まないことを忘れて少しハマりました。Jsonが[Any]型でネストした時に[]で配列宣言する。
終わり。
ハードウェア 応用情報技術者試験 対策日記@13

#ハードウェア
##1.電子・電気回路
[回路記号](http://www.eonet.ne.jp/~imagawa/denki_kiso/ronrikairo.html)を覚えましょう。
NAND回路だけで全ての論理回路を作ることができる。
1ビットの情報を記憶することができる論理回路を**フリップフロップ**という。

##2.半導体素子の構成部品
###IC
Integrated Circuit(集積回路)の略。
利用者が要求する特定の用途に特化したものをカスタムICといい、製造するときに回路設計を決定するものを**ASIC(Application Specific IC)**、製造後に回路を変更できるものを**FPGA(Field-Programmable Gate Array)**と呼ぶ。

###LSI
Large Scale Integration(大規模集積回路)の略。
組み込みシステム製品の電子回路を1チップに集約した製品をシステムLSIといい、その設計方法は**SoC(System on a Chip)**と呼ばれる。

###MEMS
Micro Electro Mechanical Systemsの略。
センサー、アクチュアエータなどや電子回路を一つのシリコン基板に集積化したデバイスのこと。

##3.半導体の故障メカニズム
静電気放電によるESD破壊や、意図しない位置にトランジスタやサイリスタができてしまうことによる**ラッチアップ**などがある。


##4.タイマ
一定間隔でCPUに対して割り込みを発生させるインターバルタイマ、コンピュータの正常動作を確認するために一定間隔でOSがクリアを行う**ウォッチドッグタイマ**、内部に保持し日付や時刻を管理するRTCなどがある。

------
[ホームへ](https://qiita.com/k-y/items/dc2c9a3a8425712253e8)
AWS Systems Manager セッションマネージャーを使ってみたが、うまくいかなくてサポートを頼った話

# これをやった経緯
以前に社内で管理されているシステムの外形監視をあるSaaSを利用して対応したのですが、その際に下記の要件があって、外向けの共有インスタンスを１つたてたのですが、
社内システムであるために監視ツールからのIPのみを許可する必要があり、セキュリティグループでどうにか対応したのですが、監視対象のシステムにより担当者が異なるため、
「共有インスタンスのSSHキーの管理どうするかなー」と悩んでいました。。。 :sweat_drops: 

そんなとき、セッションマネージャーの機能がリリースされたとのことで、使ってみよう！ということで対応してみました。
参考サイトは下記です。

- [最新 – AWS Systems Manager セッションマネージャーで EC2 インスタンスへのシェルアクセスを実現 | Amazon Web Services ブログ](https://aws.amazon.com/jp/blogs/news/new-session-manager/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+aws%2Fjp-blog-news+%28Amazon+Web+Services+%E3%83%96%E3%83%AD%E3%82%B0%29)
- [SSH不要時代がくるか!?AWS Systems Manager セッションマネージャーがリリースされました! ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/ssm-session-manager-release/)

# うまくできなかったってどうなったの？
上記サイトの手順通り進めたのですが、「セッションの開始」を押して、コマンドを打てるコンソールまでは開いたのですが、、、
**画面上にプロンプトが出ない！？** という事象に悩まされまして、、、、下記を試したんですが、うまくいきませんでしばらく放置していました。 :sweat_smile: 

- Amazon Linux 2にしてみる
- 自分のIAMユーザに権限を追加
- サーバ再起動

全てやってもできないので、指定されたエラーログなどを共有してサポートに聞いてみると、、、

```
Encryption validation failed, err: We couldn't start the session because encryption is not set up on the selected CloudWatch Logs log group. Either encrypt the log group or choose an option to enable logging without encryption.
```

>このエラーメッセージは、セッションマネージャーのログの出力先として設定されている CloudWatch Logs のロググループが存在しない場合や、ロググループでのログデータの暗号化の設定が行われていない場合に記録されます。

とのこと、、、エラーメッセージでもその通り言ってますね。
勝手に作成してくれると思ってたのは大間違いだったようです　:scream:
ちゃんと参考サイトを読んでないのがバレましたね・・・ :sweat_smile: 

>    ログの出力先となるロググループ名: /aws/ssm/session_logs
>    ログデータの暗号化 : true

ということで、上記のロググループを作成して、再度「セッションを開始」したところ、問題なくプロンプトも表示され、
ちゃんとコマンドを打つことができるようになりました。
めでたしめでたし :christmas_tree:
JavaScriptで10桁のISBNを13桁に変換する

**ISBN** は、International Standard Book Numberの略で、
世界共通で使える、書籍を特定する為の番号。

昔は10桁だったが、番号が枯渇しそうになったらしく、今は13桁に拡張されている。
下位互換のため、過去に発番された10桁の番号を13桁に変換する方法が策定されている。

# 10桁を13桁に変換する方法
[**477414813X**](https://www.amazon.co.jp/dp/477414813X) を例に。

1. 先頭に`978`を足して、末尾の1桁を除く
  - `978477414813`
  - ※フランス、韓国、イタリアの場合、979を使ったりもする
2. 先頭の桁から順に1、3、1、3…を掛けて合計する
  - `9*1 + 7*3 + 8*1 + 4*3 + 7*1 + 7*3 + 4*1 + 1*3 + 4*1 + 8*3 + 1*1 + 3*3 = 123`
3. 合計を10で割った余りを10から引く
  - `10 - (123 % 10) = 7`
  - ※引き算の結果が10の時は0とする
4. 1.の末尾に3.の値を添えて出来上がり
  - `9784774148137`

# 10桁を13桁に変換するコード
```javascript
const toISBN13 = (isbn10) => {
  // 1. 先頭に`978`を足して、末尾の1桁を除く
  const src = `978${isbn10.slice(0, 9)}`;

  // 2. 先頭の桁から順に1、3、1、3…を掛けて合計する
  const sum = src.split('').map(s => parseInt(s))
      .reduce((p, c, i) => p + ((i % 2 === 0) ? c : c * 3));

  // 3. 合計を10で割った余りを10から引く（※引き算の結果が10の時は0とする）
  const rem = 10 - sum % 10;
  const checkdigit = rem === 10 ? 0 : rem;

  // 1.の末尾に3.の値を添えて出来上がり
  return `${src}${checkdigit}`;
};
```
【Swift】スクロールするとある位置に固定されるツールバー

#記事を移動しました。
https://zenn.dev/dd_sho/articles/0d630906e868cb
今後は上記の記事で更新します。（2021/10/03）

下図のように一定量スクロールすると固定されるツールバー（緑色のバー）を実装してみたので備忘録として記事にします。
実現する方法はたくさんあると思いますが個人的に**一番楽**なんじゃないかと思った方法です。

**動作イメージ↓↓**

![スクロールツールバー.gif](https://qiita-image-store.s3.amazonaws.com/0/139470/dbc71c6b-01c7-45ee-49f9-59fdd9980461.gif)

## 開発環境
Xcode 10.0
Swift 4.2

## 実装イメージ

ソースコードはこちら（後でアップします）
![実装イメージ.png](https://qiita-image-store.s3.amazonaws.com/0/139470/ac5f7c05-38cf-0b0c-36fa-192c1b901e8b.png)

## 関連箇所の抜粋

以下は一定量スクロールすると固定されるツールバーの実装に関係する箇所の抜粋です。

### ①TableHeaderViewの設定

```swift:SampleViewController.swift
// viewDidLoadで下記のメソッドを呼ぶ
private func setupSampleHeaderView() {
    // 自作したtableHeaderView用のView
    sampleHeaderView.frame = CGRect(x: 0,
                                    y: 0,
                                    width: UIScreen.main.bounds.width,
                                    height: HEADER_HEIGHT)
    sampleTableView.tableHeaderView = sampleHeaderView
}
```
### ②SectionHeaderViewの設定

```swift:SampleViewController.swift
// MARK: - UITableViewDelegate
extension SampleViewController: UITableViewDelegate {
    
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        
        let sectionView = SampleSectionView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 52))

        // sectionView内のボタンをタップした時の処理
        sectionView.tabButtonPressedBlock = {
            print("Did tap button")
        }
        return sectionView
    }
    
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        // 適当な高さ
        return 52.0
    }
}
```

いつものTableViewの実装に加えて、①②を実装すれば実現できます。

## まとめ

思っていたよりも簡単に実装できました。TableViewのsectionをツールバーとして見立てて実装する所がポイントかなぁと思います。
是非試してみてください。
Paizacloudを使ってWebサービスを作成してみた

# 自己紹介
paizacloudでLaravelを入門した初心者です。
ロクに活動してない時期も含めて、だいたい３ヶ月ぐらいで作成しました。

# 目的
- paizacloudをメインにして開発し、Webサービスを公開する
- Laravelの学習をする

アンケートの作成ができる。
投票すると円グラフで結果を確認できる。
**アンケートは公開制で、「どのアンケートに誰がどう回答したか」、は公開される。**
**また、アンケートに前提を加える事ができる。**
**コンセプトは「前提条件から検索できるアンケート」**

サービス名のenkiは、アンケートのスペルenquêteからもじった。
あとメソポタミア神話の知識と魔法の神エンキ。

### 投票前
<img width="725" alt="スクリーンショット 2019-02-01 1.03.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/132034/3e9227b6-f8b5-31ca-c1c5-3a1372d83a6c.png">

### 投票後
<img width="731" alt="スクリーンショット 2019-02-01 1.05.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/132034/1180ec87-5d8b-1a34-e846-883e94d90059.png">

###　アンケートに前提を加えたとき
<img width="771" alt="スクリーンショット 2019-02-01 4.44.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/132034/869489d9-3c1a-6bb6-588e-99bfeb8117b2.png">



# 使ったもの
- paizacloud(開発環境兼本番環境)
 - laravel 5.7
 - Socialite(twitterログイン) 
 - Chart.js(円グラフの表示)
 - fontawesome(twitterアイコンの表示)
- Cloudflare(SSL)
- お名前.com(独自ドメインの取得)

# 所感
### 良いところ
- 今まで完成、公開までさせた事がなかったので大きな練習になった。
- paizacloudで作成、公開までするとかなり労力を削減できる事がわかった　

### 悪いところ
- アンケートに答えるまでが面倒臭い(ログイン必要)
- 全て行き当たりばったりで作ったので、デザインがダメ
- 無駄な機能を実装する事に躍起になってたりした
- スケジューリングの下手さを露呈した
- 「前提条件から検索できるアンケート」がコンセプトだが、そもそもそれに意味が（ry


#（おまけ）paizacloudでの開発について
paizacloudはクラウドIDEという事で、オンライン開発環境です。
自宅以外の環境からすぐに続きをしたりできます。ネットとPCさえあれば。
~~私は不良社員なので職場で趣味の開発をコッソリやってたりしてます。~~
~~そういう時にいつでも開発環境にアクセスできるクラウドIDEが便利なんだよなァ〜と思いました。~~
QuantXでROCを実装してみた

#今回やったこと
投資アルゴリズム開発プラットフォーム「QuantX」で、ROCを実装してみました。

#ROCとは
ROCとは、モメンタムを改良したオシレーター系のテクニカル指標であり、一定の周期で値動きするレンジ相場を分析することで、相場の強弱や勢い、転換を見極めるために使われます。

モメンタムは単純に値動きの幅を取ったものなので、株価の高低によって値が大きく変わってしまいます。ROCはこの点を改良したもので、株価の高低にかかわらず使うことができます。

$$ROC = \frac{現在の株価 - 過去の株価}{過去の株価} × 100$$
ROCは上式で表され、過去の株価から見た現在の株価の値上がりを意味します。
一般的には、15日、20日、25日などが計算期間として使われるそうです。

#アルゴリズム
今回書いたアルゴリズムは[こちら](https://factory.quantx.io/developer/ef281ed227ec4d228b501763b0067dec)

```python
import pandas as pd
import numpy as np 
import talib as ta

def initialize(ctx):
    # 設定
    ctx.logger.debug("initialize() called")
    ctx.configure(
      channels={          # 利用チャンネル
        "jp.stock": {
          "symbols": [
            "jp.stock.1305",
            "jp.stock.9984",
            "jp.stock.9983",
            "jp.stock.7201",
            "jp.stock.9201",
            "jp.stock.9202",
            "jp.stock.7203"
          ],
          "columns": [
            #"open_price_adj",    # 始値(株式分割調整後)
            #"high_price_adj",    # 高値(株式分割調整後)
            #"low_price_adj",     # 安値(株式分割調整後)
            #"volume_adj",         # 出来高
            #"txn_volume",         # 売買代金
            "close_price",        # 終値
            "close_price_adj",    # 終値(株式分割調整後) 
          ]
        }
      }
    )

    def _my_signal(data):
      cp = data['close_price_adj'].fillna(method ='ffill')
      roc = pd.DataFrame(0, index = cp.index, columns = cp.columns)
      for (sym,val) in cp.items():
        roc[sym] = ta.ROC(cp[sym], 10)
      
      buy_sig = roc[(roc > 0) & (roc.shift(1) < 0) ]
      sell_sig = roc[(roc < 0) & (roc.shift(1) > 0)]
      
      return {
        'buy:sig':buy_sig,
        'sell:sig':sell_sig,
        'roc:g2':roc
      }

    # シグナル登録
    ctx.regist_signal("my_signal", _my_signal)

def handle_signals(ctx, date, current):
    '''
    current: pd.DataFrame
    '''

    done_syms = set([])
    for (sym,val) in ctx.portfolio.positions.items():
        returns = val["returns"]
        if returns < -0.03:
          sec = ctx.getSecurity(sym)
          sec.order(-val["amount"], comment="損切り(%f)" % returns)
          done_syms.add(sym)
        elif returns > 0.05:
          sec = ctx.getSecurity(sym)
          sec.order(-val["amount"], comment="利益確定売(%f)" % returns)
          done_syms.add(sym)


    buy = current["buy:sig"].dropna()
    for (sym,val) in buy.items():
        if sym in done_syms:
          continue
        
        sec = ctx.getSecurity(sym)
        sec.order(sec.unit() * 1, comment="SIGNAL BUY")
        ctx.logger.debug("BUY: %s,  %f" % (sec.code(), val))
        pass

    sell = current["sell:sig"].dropna()
    for (sym,val) in sell.items():
        if sym in done_syms:
          continue
    
        sec = ctx.getSecurity(sym)
        sec.order(sec.unit() * -1, comment="SIGNAL SELL")
        ctx.logger.debug("SELL: %s,  %f" % (sec.code(), val))
        pass
```

ROCの算出はta-libに関数が用意されているので簡単ですね。
今回は、ROCがゼロラインを上抜けしたら買い、下抜けしたら売りとしてシグナルを出しています。
NumPyで共変テンソル・反変テンソルの変換

テンソル代数の共変・反変の変換をNumPyでやる方法のメモ。

[NumPyでテンソル代数（共変・反変）](https://qiita.com/MTNakata/items/c23b221fcafa23a095eb)の続き。

問題は、[テンソル解析（田代嘉宏・著）](https://www.amazon.co.jp/%E3%83%86%E3%83%B3%E3%82%BD%E3%83%AB%E8%A7%A3%E6%9E%90-%E5%9F%BA%E7%A4%8E%E6%95%B0%E5%AD%A6%E9%81%B8%E6%9B%B8-23-%E7%94%B0%E4%BB%A3-%E5%98%89%E5%AE%8F/dp/4785311258) p163 問題1 参照。

基底$Σ${$e_1,e_2,e_3$},$Σ'${$e'_1,e'_2,e'_3$}の双対基底の変換式は前回と同じです。

```math
e_1 = e_1' + 2e_2' + 3e_3' \\
e_2 = 2e_1' - e_2' +2e_3' \\
e_3 = -4e_1' + 2e_2' - 5e_3'
```

基底の変換行列Aは双対基底の変換式より

```math
A =
\begin{pmatrix}
1 & 2 & -4\\
2 & -1 & 2\\
3 & 2 & -5
\end{pmatrix}
```

Aの逆行列は

```math
A^{-1} =
\begin{pmatrix}
0.2 && 0.4 && 0 \\
3.2 && 1.4 && -2 \\
1.4 && 0.8 && -1
\end{pmatrix}
```

NumPyで書くと以下の通り。

```python
import numpy as np

A = np.array([[1,2,-4],[2,-1,2],[3,2,-5]])
print(A)

#出力
#[[ 1  2 -4]
#[ 2 -1  2]
#[ 3  2 -5]]

A_1 = np.linalg.inv(A).round(decimals=1)
print(A_1)

#出力
#[[ 0.2  0.4  0. ]
#[ 3.2  1.4 -2. ]
#[ 1.4  0.8 -1. ]]
```

## 共変テンソルの変換

以下の共変テンソル

```math
T =
\begin{pmatrix}
2 && 1 && -4 \\
1 && 0 && 2 \\
1 && -3 && 1
\end{pmatrix}
```

を変換します。

共変テンソルの変換式は以下の通り。

```math
T_{ab} = \bar{{}^t\!A^a\,_i} \; T_{ij} \; \bar{A^j\,_b}
```

$\bar{A^i\,_a}$は$A^a\,_i$の逆行列を表します。

前回と同様、`.dot()`を使います。

```python
T = np.array([[2,1,-4],[1,0,2],[1,-3,1]]) #共変テンソル
T_ab = A_1.T.dot(T.dot(A_1)).round()
print(T_ab)

#出力
#[[-2.  2.  1.]
#[-3.  0.  2.]
#[ 2. -1. -1.]]
```

## 反変テンソルの変換

以下の反変テンソル

```math
H =
\begin{pmatrix}
3 && 2 && 1 \\
2 && -1 && 3 \\
1 && 3 && 1
\end{pmatrix}
```

を変換します。

反変テンソルの変換式は以下の通り。

```math
H^{ab} = A^a\,_i \; H^{ij} \; {}^t\!A^j\,_b
```

```python
H = np.array([[3,2,1],[2,-1,3],[1,3,1]]) #反変テンソル
H_ab = A.dot(H.dot(A.T))
print(H_ab)

#出力
#[[-33  24 -30]
#[ 24   3  35]
#[-30  35 -18]]
```

## 混合テンソルの変換

以下の混合テンソル

```math
P =
\begin{pmatrix}
3 && 1 && 3 \\
-5 && 3 && 1 \\
-4 && 2 && 1
\end{pmatrix}
```

を変換します。

反変テンソルの変換式は以下の通り。

```math
P^a\,_b = A^a\,_i \; P^i\,_j \; \bar{A^j\,_b}
```

```python
P = np.array([[3,1,3],[-5,3,1],[-4,2,1]]) #混合テンソル
P_ab = A.dot(P.dot(A_1)).round()
print(P_ab)

#出力
#[[  0.   3.   1.]
#[ 20.  11. -13.]
#[  9.  11.  -4.]]
```
昔どこかで見たJavaScriptでゼロパディングするカッコよさげな関数

# 自己紹介
ファットなトントンです。よろしくおねがいします。
技術系の話題を真面目に書くのは初めてなので、体裁とか内容の必要十分性とかそういうのは大目に見てください。

# ゼロパディングいろいろ
考え方はいろいろあると思いますが、大方この二つの考え方かと思います。

a. 「とにかくたくさんくっつけて、ひつようなとこだけちょんぎっちゃえ」方式
書いたとおりですが
  「'0000000000000000'とかくっつけた上で、slice()とかsubstr()とかで必要な桁数切っちゃえばいいじゃん」
という考え方。

b. 「いっこずつくっつけてけば、そのうちほしいものになるよ」方式
ループですね。繰り返しと判定処理だったらなんでもいいです。

```js
var a = '123' //文字列型の数字
var c = 10    //桁数
while(true){
  if(a.length===c){
    // 無限ループからぬけるよ!
    break;
  }
  a = '0'+a // 桁を1つくっつけるよ!
}
```
みたいなことをやるわけです。

# じゃあどんな書き方が良いの?
評価基準によるわけですが、大まかに考えるならばQCD(Quality, Cost, Delivery)のいずれに優れているかで判断すると思います。
例えば
        1. 長くても良いよ。誰でもぱっと見で理解できるのが一番
        2. 短いコードは良いコードだ。バグも少なくわかりやすい
        3. 速さとフットプリントが一番。可読性?そんなものは捨てた
みたいな感じでしょうか。
1.の評価基準だと、a. b.のやり方どちらでもよいでしょうが、2.の評価基準でb.みたいなコードを提出するとぶっ飛ばされます。
3.の評価基準でa.のコードを提出しても「このメモリー富豪がっ!」みたいな感じでいい顔はされないでしょう。

# そんな中で昔見つけたやり方
```js
/**
 * @function
 * @name ゼロパディング関数.
 * @summary 入力された値に'0'を追加して、指定された桁数の値を返します.
 * @param {int} 桁数.
 * @param {string} 基となる値の文字列.
 * @returns {string} ゼロパディングされた値の文字列.
 */
function paddingZero(digit, value) {
  return value.length === digit -0 ? value : paddingZero(digit, '0'+value);
}
```
結論から言うならば再帰処理です。JavaScriptの再帰処理性能とかは真面目に調べたことないので分からないですが、基本的には繰り返し処理と同じくらいの計算量だと思えば良いのではないでしょうか。

# 結論
いろいろあるけど評価基準の中でしっくりくるコードを書けば良いのではと思います。
あとカッコイイとかの感覚は大事だと思う。
教科書データを用いた日本語テキストの可読性評価

# 始めに
論文を英語の時間に読まなきゃいけなくなったが、どうにもモチベーションが……。
じゃあどうするか.
公開する気になったらちょっとは気乗りする気もしたので自分の言葉でもう一度構成しなおしてみる。(著作権的にもアレだし)
英弱が書いているの「ん？」ってなったら論文に行ってください。僕が間違っています(訂正リクエストお願いします。)

今回読むのはこれ
https://pdfs.semanticscholar.org/1324/80de063eeb5b39c1ed2f240b11dbfdcf455d.pdf
「Automatic Assessment of Japanese Text Readability Based on a Textbook Corpus」
論文というより正確にはカンファレンスの資料です。うちの教員の記事です。

簡単にではありますがまとめていくので、お付き合いください。

# Readability 可読性に無頓着な日本
日本語はガラパゴス言語なので英語に比べていろいろ研究が遅れている（それはそう）。論文では"Readability"、可読性と翻訳しますがどのくらい読みやすいかというのを定量化しようぜって話。
英語にはいろんな可読性の指標があるのですが、日本語ではそういうことに無頓着らしく発展していない。ここでは英語の指標は省くが、Tateisi氏が提唱した式は以下。

$$RS = -0.12ls-1.37la+7.4lh-23.18lc-5.4lk-4.67cp+115.79$$

- $ls$ 1文に含まれる平均文字数
- $la$ ローマ字または記号の平均数
- $lh$ ひらがなの文字数の平均
- $lc$ 漢字の文字数の平均
- $lk$ カタカナの文字数の平均
- $cp$ 句読点の比率

# 使用したデータ
日本語において最もその可読性の評価がなされているのは教科書ではないか。子供の成長に合わせて厚生労働省と出版社ががんばっているに違いない。
ということで教科書を文書データとして用いた。これが小学校6年、中学校3年、高校3年の12段階になった。学年をそのまま答えとして用いる。
高校までだとそれはそれで問題なので大学の教科書も13段階目として、各大学で使われている教科書を学習データとして利用した。もちろん前の12段階とは質が異なることは忘れてはいけない。

# 学習
さて、ここで問題となるのが学習の仕方だ。英語の何が良いかというと単語ごとにスペースで区切られていることだ。日本語はどこからどこまでが単語なのか判別ができない。近年ではmecabをはじめとする日本語を単語に分割してくれるツールも発展してきた。しかしながら完全とはいいがたい。
そこで彼らが考えたのが、

「一文字ずつ区切ればいいんじゃね？」

そもそも日本語には素晴らしいことに表意文字である漢字が存在する。漢字に意味があるのなら、それそのまま単語みたいに扱ってしまおうというやや強引なやり方をつかった。

# 結果
これが上手くいく。正答率は0.9程度でRMSEもそこそこ良好。

|Case|学習データ|有効サンプル数|出力範囲|R|RMSE|
|:--:|:-----------:|:--------:|:---------:|----:|----:|
|Case1|13-grade|1167|gr. 1-13|0.899|1.514|
|Case2|13-grade|1167|gr. 1-12|0.907|1.440|
|Normal leave-one-out|12-grade|1167|gr. 1-12|0.905|1.800|

一般的に文章が長くなれば可読性は悪くなる傾向にある為、文章が短くても正答率が出るようにしたい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/263565/19305dc6-0523-0e52-eedb-b50f73f2402f.png)

文字数が減ると正答率は下がるが、致命的までいかない。さすがに5文字しかなければ0.636でもよい方だと個人的に思う。

# これがあそべるドン！！
これをツール化してwebページに上がっている。
http://kotoba.nuee.nagoya-u.ac.jp/sc/obi3/
結構楽しい。
自分の文章がどれくらいの学年なら読めるかの目安にもなる。
学校の先生とかであれば、国語の問題に使う文章を選定したりすることができるかもしれない。
PowerShellだけでパーティションを拡張する


#目的

ディスクに1個だけパーティションがあって、
それを目一杯拡張したい！

こんな感じのパーティションを...
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164582/a3c62965-6acd-25b6-a4db-3a1bde267a6b.png)

PowerShellだけでこのようにするのが目的です
![image.png](https://qiita-image-store.s3.amazonaws.com/0/164582/362aaaee-4330-1c7a-cbdc-83bb7fd76501.png)

#条件など
以下の環境で動作確認しました。
Windows Server 2016
PowerShell5.1

#ソース
ドライブレターを指定して拡張するようにしてあります。
エラー処理が入ってないので適宜追加しましょう。
パーティションが1個でなくても末尾であれば拡張できます。

```powershell:DiskExpand.ps1
param (
  [parameter(mandatory = $true, Position = 0)]
  [string]
  $DriveLetter
)

$Partition = Get-Partition | Where-Object -Property 'DriveLetter' -Value $DriveLetter -EQ
if ($Partition) {
    $PartitionSupportedSize = $Partition | Get-PartitionSupportedSize
    if ($PartitionSupportedSize.SizeMax -lt $Partition.Size) {
        Resize-Partition -DiskNumber $Partition.DiskNumber -PartitionNumber $Partition.PartitionNumber -Size $PartitionSupportedSize.SizeMax
    }
}

```

#使い方
この例ではEドライブを拡張します。

```powershell

DiskExpand.ps1 -DriveLetter 'E'
```


#参考
https://docs.microsoft.com/en-us/powershell/module/storage/resize-partition?view=win10-ps
多次元配列をキーを維持して flatten

表題の件です。査収ください。

```php
$d = [
  0=>[
    1=>[
      2=>'a', 
      3=>'b'
    ],
   'a'=>'x'
  ]
];

function flt($values, &$ret, $keys = [], $key = null){
  if($key !== null) $keys[] = $key;
  if(!is_array($values)) $ret[implode('.', $keys)] = $values;
  else foreach($values as $k=>$v){ flt($v, $ret, $keys, $k);}
}

flt($d, $ret);
print_r($ret);
/*
array [
  "0.1.2" => "a"
  "0.1.3" => "b"
  "0.a" => "x"
]
*/

```
rex0220 自動補完プラグイン

kintone 追加・編集画面において、文字の入力補完をするプラグインです。
既存のレコードから文字を補完してくれます。

- 追加・編集・一覧編集画面で、指定項目を文字の入力補完
- プラグイン設定のダウンロード＆アップロード機能
- ３ヶ国語対応（日英中）
- 無償公開します

※テーブル内の項目は対象外
※動作環境は、PCです。

[rex0220 stores](https://rex0220.stores.jp/)で、公開中です。

# 自動補完の操作例

![2019-02-01_11h27_55.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/b99d9809-94aa-6cb3-a12b-2308eb027477.gif)


# 追加編集画面

<img width="720" alt="2019-02-01_10h47_42.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/82be911b-5c7f-6436-9b47-63949507fd86.png">

# 一覧編集画面


<img width="545" alt="2019-02-01_11h32_16.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/97324c53-3ac1-9bb6-2434-4618cb872d68.png">


# 自動補完プラグインの設定手順

## プラグインの追加

- 「kintone システム管理 > プラグイン」で追加します。
- 「アプリの設定 > プラグイン」で、アプリに追加します。

<img width="1062" alt="2019-02-01_10h53_10.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/a090e9f4-b948-c605-8765-1baa22da9a72.png">


## プラグインの設定

自動補完にする項目をチェックして、「保存」します。

<img width="794" alt="2019-02-01_11h09_25.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/45e54038-3922-2a35-7feb-0325e65ee7d4.png">

# 注意事項

- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。

# 参考リンク

下記記事のプラグイン化です。
[cybozu developer network 過去のレコード値を用いてAutocomplete](https://developer.cybozu.io/hc/ja/community/posts/360040177771-過去のレコード値を用いてAutocomplete)