OmniAICreator/Qiita-1.07M huggingface dataset:
rex0220 計算式プラグイン (株)を株式会社に自動変換

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)を使って、「(株)」と「株式会社」でバラバラになりがちな会社名を「株式会社」に統一してみます。
編集画面で入力時に自動変換、および会社名をCSV で読み込み後に一覧画面で一括変換が可能です。
自動変換でいろいろ応用が出来ますよ。

# 編集画面操作例

編集画面で「（株）」を入力後に、自動的に「株式会社」に変換されます。

![2019-02-27_14h44_05.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/b0598d1c-4f34-ef38-281e-a0f1b5563477.gif)


# 一覧画面での一括変換

CSV でデータを読み込み後、一覧画面で一括変換する操作例です。

![2019-02-27_15h19_57.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/4d963e5b-f7ab-033c-2451-0ea889071e00.gif)



# 計算式プラグイン設定

対象アプリに計算式プラグインを追加し、計算式を設定します。


<img width="590" alt="2019-02-27_15h08_04.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/35a12b12-68ae-0667-d534-3f1b2057614c.png">


## 計算式の設定

項目の「会社名」と「会社名２」にそれぞれ別の計算式を設定しています。
用途に合わせて、使いましょう。

- 「循環参照を許可」をチェック ※本当に循環させないように気をつけましょう
- 入力可能にするため、「編集」をチェック

<img width="981" alt="2019-02-27_14h48_27.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/8c55aa47-5895-acde-14c4-36fc69577c23.png">

計算式は異なりますが、どちらも"(株)","（株）"を"株式会社"に変換します。

- 会社名：<br>REPLACE(REPLACE(会社名,"(株)","株式会社"),"（株）","株式会社")
    - REPLACE 関数を使った例です。変換元の種類が多いとREPLACE の入れ子が多くなります。


- 会社名２:<br>REPLACERE(会社名２,"\\(株\\)|（株）","株式会社")
    - REPLACERE 関数を使った例です。[正規表現](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions)を使った置換が出来ます。
    - 正規表現を使うと複雑な置換が可能になります。


## ボタン設定

「ボタン設定」をクリックし、ボタン名を「一括変換」に設定します。

<img width="989" alt="2019-02-27_15h25_08.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/059651e5-e467-40c7-371a-0a3d321c1eb4.png">


## 一覧別設定

「一覧別設定」をクリックして、一括変換できる一覧を指定します。
「すべての一覧で有効」を選択すると、LIST タイプの一覧画面で有効になります。

<img width="981" alt="2019-02-27_15h26_17.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/ac453b55-1bd7-e5c9-d303-1fdc62efdf18.png">
Google Cloud Composer の構成要素

## はじめに

- この構成は当稿執筆当時、beta 機能を利用した composer-1.5.0-airflow-1.10.1 である
- https://cloud.google.com/composer/docs/concepts/versioning/composer-versions?hl=ja

## 構成要素

- airflow-scheduler
- airflow-sqlproxy (Connect to mysql)
- airflow-worker
- airflow-redis (StatefulSet)
- kubernetes (apiserver)
- composer-fluentd-daemon (DaemonSet)

- mysql は Tenant project resource https://cloud.google.com/composer/docs/concepts/overview?hl=en#tenant_project_resources

## 抜き出した設定ファイル

https://gist.github.com/kysnm/1fe8c23ec9cefd17c3a8289e15e888db
メモリ8GでDockerを頑張る

# 環境
- MacBook Pro 2018
- メモリ8G
- macOS Mojave

# これだといける
でもdocker内が重くなってきたら厳しいかも
<img width="509" alt="Screen Shot 2019-02-13 at 21.44.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/68213/6d9feb6a-2000-9042-5efd-f7f3ba50d825.png">
mrubyとgccのオプション

mruby on YABMのRTL8198のポート作業のついでに確認してみました。

gcc version 4.4.5-1.5.5p4 (GCC) 

|オプション|fib(32)|
|:--|:--|
|-O2|13秒|
|無し|13秒|
|-Os|14秒|
|-Os -mips16|21秒|

ずっと-Os -mips16でビルドしてて、なんか遅いなと思ってました。

-marchを間違えて指定していたら、31秒くらいになってました。でなんかおかしいと思ってちゃんと調べてみました。

RTL8196Eではほとんど変わらなかったので、上記の数字はあまりさんこうにならないかもしれません。

いろいろ試してみるとO2よりOsの方が早かったり、marchの設定を正しくすると遅くなったり、なんだかよく分からないことがあるようです。

オプションではないのですが、bcmbm-mrubyをgcc 4.2.3から4.9.2に代えてみたところfib(32)が102秒からから51秒になりました。mrubyのバージョンが変わっているので、すべてがgccによるものかは分かりませんが、かなり影響があることは確かだと思います。gcc4の時代はかなり長かった印象があるので、最適化が進んだのかもしれません。

FreeBSD/mipsでサイズを比べてみました。mrubyは3.2です。

|オプション|mrubyサイズ|
|:--|:--|
|無し|1266148|
|-Os|1034056|
AzureDatabricksをDatadogでモニタリングする

# AzureDatabricksをDatadogでモニタリングする

Azure DatabricksのMetricsを取るにはDatadog一択のようです。（※）以下の手順を使ってやってみたのですが上手くいかなかったのでDatadogのマニュアルを見ながら解消してみました。

https://docs.azuredatabricks.net/user-guide/clusters/metrics.html

※ DatabricksにはGangriaが選択肢としてあります。

## Datadogの設定

Datadogを申し込んでください。ただ見るだけならFreeプランで大丈夫ですがメトリクスが1日しか保存されないことや、アラートが飛ばせませんので運用で利用するときには購入を検討しましょう。

使える状態になったらIntegrationsを選択し、Spark Integrationを利用できるようにしておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57686/c1776b31-fc6b-caff-e725-f892266cc75d.png)

Datadogのエージェント起動スクリプトで利用するAPIKeysをコピーしておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57686/e13c2472-066c-d0e5-c8d1-18bfb117aeb0.png)

## Datadogのagentをインストールするshを保存する

適当なNotebookを開き、以下のスクリプトを実行します。

* <init-script-folder>は好きな場所を指定してください。
* <your-api-key>はDatadogの画面でコピーしたものを指定してください。

**ポイント([MSのユーザガイドとの違い](https://docs.azuredatabricks.net/user-guide/clusters/metrics.html))**

* Datadogの設定でresourcemanager_uriは使えません。spark_uriにする必要があります。
* echo "init_config:の後に階層が入っているとうまく動きません


```python

%python 

dbutils.fs.put("dbfs:/<init-script-folder>/datadog-install-driver-only.sh","""
#!/bin/bash

echo "Running on the driver? $DB_IS_DRIVER"
echo "Driver ip: $DB_DRIVER_IP"

cat <<EOF >> /tmp/start_datadog.sh
#!/bin/bash

if [ \$DB_IS_DRIVER ]; then
  echo "On the driver. Installing Datadog ..."
  
  # install the Datadog agent
  DD_API_KEY=<your-api-key> bash -c "\$(curl -L https://raw.githubusercontent.com/DataDog/datadog-agent/master/cmd/agent/install_script.sh)"
  
  # WAITING UNTIL MASTER PARAMS ARE LOADED, THEN GRABBING IP AND PORT
  while [ -z \$gotparams ]; do
    if [ -e "/tmp/master-params" ]; then
      DB_DRIVER_PORT=\$(cat /tmp/master-params | cut -d' ' -f2)
      gotparams=TRUE
    fi
    sleep 2
  done

  current=\$(hostname -I | xargs)  
  
  # WRITING SPARK CONFIG FILE FOR STREAMING SPARK METRICS
  echo "init_config:
instances:
  - spark_url: http://\$DB_DRIVER_IP:\$DB_DRIVER_PORT
    spark_cluster_mode: spark_standalone_mode
    cluster_name: \$current" > /etc/datadog-agent/conf.d/spark.yaml

  # RESTARTING AGENT
  sudo service datadog-agent restart

fi
EOF

# CLEANING UP
if [ \$DB_IS_DRIVER ]; then
  chmod a+x /tmp/start_datadog.sh
  /tmp/start_datadog.sh >> /tmp/datadog_start.log 2>&1 & disown
fi
""", True)
```

## クラスタを起動する

クラスタの起動オプションに先ほど保存したshを指定してから起動します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57686/76a335f7-e438-0576-102d-8f58a601d2cd.png)

## たしかめる

notebookでコマンドを実行してください

```
%sh sudo datadog-agent status
```

下記が出力されていれば成功です。

```
    spark (1.5.0)
    -------------
      Instance ID: spark:8f21fc664e907eaa [OK]
      Total Runs: 74
      Metric Samples: Last Run: 278, Total: 6,127
      Events: Last Run: 0, Total: 0
      Service Checks: Last Run: 3, Total: 222
      Average Execution Time : 41ms
```

少しするとDatadogにも反映されていることが確認できるはずです

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57686/e3f66578-61cb-4f42-0610-1baf08ea4d46.png)
Ruby on Rails 開発メモ

開発中のメモを備忘録程度にまとめます。（随時更新）

##メイラーに2つの引数を渡す
controller

``` 
  def create
    @contact = Contact.new(contact_params)
    @user = current_user.email
    if @contact.save
      ContactMailer.contact_mail(@contact, @user).deliver
      redirect_to blogs_path, notice: 'Contact was successfully created.'
    else
      render :new
    end
  end
```

mailer

```
class ContactMailer < ApplicationMailer
  def contact_mail(contact, user)
   @contact = contact
   @user = user

   mail to: @user, subject: "お問い合わせの確認メール"
  end
end
```
VMD(Visual Molecular Dynamics)でMDシミュレーションの綺麗なスナップショットを作る


# VMD：分子動力学シミュレーションの可視化ツール

## VMDとは

Visual Molecular Dynamics（VMD）は、分子モデリングと可視化のためのコンピュータプログラムです。主に分子動力学シミュレーションの結果を閲覧・解析するために開発されましたが、容積データや配列データ、任意のグラフィックオブジェクトを扱うための機能も備えています。

**簡潔に言えば、シミュレーション結果を美しく可視化できるツールです。**

しかし、VMDのデフォルト設定では画像が全体的に暗く見づらくなりがちです。この記事では、ミーティング資料やプレゼンテーションで使える高品質なスナップショットを作成するためのTipsをご紹介します。

本記事ではLinux環境での利用を想定していますが、他のOSでも同様の設定が可能です。

## 動作環境

| 項目 | 仕様 |
|:-----|:-----|
| VMDバージョン | VMD for LINUXAMD64, version 1.9.2 (December 29, 2014) |
| グラフィックス | NVIDIA Corporation GM107GL Quadro K620 (rev a2) |

## 想定している系

- 水-脂質膜のような系
  - 注意：高分子鎖などの系では、この方法だと暗くなってしまう可能性があります

## 高品質な可視化のための設定手順

### 1. 背景色の変更

背景を白色に設定することで、印刷物やスライドでの視認性が向上します。

1. `Graphics` → `Colors...` を選択
2. 以下の設定を適用：

| カテゴリ | 名前 | 色 |
|:--------:|:----:|:---:|
| Display | Background | 8 White |

※ディスプレイ上での閲覧時は黒背景の方が見やすい場合もありますが、印刷物やスライドでは白背景が推奨されます。

### 2. 分子表現の設定

`Graphics` → `Representations...` から分子の表示方法を詳細に設定できます。

#### 2.1 分子種ごとの表示分け

1. `Create Rep` ボタンを押して、表示したい分子種の数だけ項目を作成
2. `Selected Atoms` で分子種を指定

**指定例：**
- `resname DMPC` - 分子名がDMPCのものすべて
- `same residue as resname DMPC and z > 10` - z座標が10より大きい位置にあるDMPC分子のみ
- `water` - 水分子すべて

#### 2.2 色の指定

`Coloring Method` で分子の色を指定できます。様々な指定方法がありますが、`ColorID` を選択して右隣のリストから直接色を指定するのが最も美しい結果になります。時間がない場合は `Name` のままでも問題ありません。

#### 2.3 マテリアル（材質）の指定

`Material` 欄で描画素材を変更できます。

**おすすめ設定：**
- `AOShiny` - 光沢のある美しい表現
- `Edgy` - 明るすぎると感じる場合の代替オプション

#### 2.4 描画タイプの指定

`Drawing Method` で分子の表示形式を指定できます。

**おすすめ設定：**
- `Licorice` - デフォルトの `Lines` より太く見やすい表現
- `VDW` - 特に注目したい分子に使用（多用すると画面が煩雑になるため注意）

#### 2.5 水分子の特別設定

系に水が含まれる場合は、以下の設定が視認性向上に効果的です：

| 項目 | 設定値 |
|:----:|:------:|
| Coloring Method | colorID (10 cyan または 22 cyan3 がおすすめ) |
| Drawing Method | QuickSurf |
| Material | Transparent |
| Resolution | 1.60 |
| Radius Scale | 1.6 |
| Density Isovalue | 3.7 |
| Grid | 0.8 |
| Surface | Max |

### 3. ディスプレイ設定の最適化

以下の設定を適用することで、より洗練された表示が可能になります：

| 設定項目 | 推奨値 |
|:---------|:-------|
| Perspective | `Orthographic` に変更 |
| Depth Cueing | チェックを外す |
| Axes | Off（軸を非表示） |
| Rendermode | GLSL |

**Display Settings の詳細設定：**

| 設定項目 | 推奨値 |
|:---------|:-------|
| Shadows | On |
| Amb. Occl. | On |
| AO Ambient | 0.90 |
| AO Direct | 0.60 |

### 4. コンソールコマンドの活用

`Extensions` → `Tk console` から、VMD上で使えるコンソールにアクセスできます。

**よく使うコマンド例：**
- `pbc box -center origin` - 周期境界の箱を表示
- `color Display Background white` - 背景を白色に設定
- `rotate x by 90` - x軸周りに90°回転

詳細なコマンドリストは公式サイトをご参照ください。

### 5. 画像ファイルとしての保存

`File` → `Render` から、以下の設定で高品質な画像を出力できます：

| 項目 | 設定値 |
|:----:|:------:|
| Render the current scene using: | Tachylon |
| Filename | 任意のファイル名 |
| Render Command: | コマンドのどこかに `-res 2000` を追加 |

`Start Rendering` をクリックすると画像の書き出しが始まります。生成される画像は `.tga` 形式なので、必要に応じて以下のコマンドで変換してください：

```bash
convert -density 1000 vmd.tga vmd.png
```

## 完成例

以下は、上記の設定を適用して作成したDMPC-コレステロールの平面二重膜系のスナップショットです（コレステロールはオレンジ色で表示）：

![vmd.png](https://qiita-image-store.s3.amazonaws.com/0/300054/dcea8982-5e33-9ae7-3586-578c2d683290.png)

この設定を活用することで、プレゼンテーションや論文に適した高品質な分子可視化画像を簡単に作成できます。VMDの機能をさらに探求して、あなた独自の表現スタイルを見つけてみてください。
最短であってほしい Julia の FizzBuzz 

科学技術計算で最近流行りの [Julia](https://julialang.org/)。FizzBuzz で練習しました。使用バージョンは 1.1.0。


# 普通のやつ (131 byte)
```julia
for i in 1:100
    if i % 3 == 0 && i % 5 == 0
        println("FizzBuzz")
    elseif i % 3 == 0
        println("Fizz")
    elseif i % 5 == 0
        println("Buzz")
    else
        println(i)
    end
end
```

余計な空白をなくして長さを計算すると**137 byte**。

# 文字列結合パターン（92 byte）
　Fizz も Buzz も2回ずつ登場しているのが8byteの無駄です。`println`文も一度で良いでしょう。そこで，最終的に出力する文字列のために変数を1つ用意することにした黄金パターン。この方針で短くしていきます。

```julia
for i in 1:100
    s = ""
    if i % 3 == 0
        s = "Fizz"
    end
    if i % 5 == 0
        s *= "Buzz"
    end
        println(s == "" ? i : s)
end
```

# if 文なし （87 byte）
　if 文は `end` で結ぶ必要があるので無駄です。Julia には三項演算子があるのでそちらを用います。しかし，実は三項演算子のスペースが削れない関係で，そこまで短くできない……

```julia
for i in 1:100
    s  = i % 3 == 0 ? "Fizz" : ""
    s *= i % 5 == 0 ? "Buzz" : ""
    println(s == "" ? i : s)
end
```

# 代入は一回で（82 byte）
　三項演算子を用いた代入が2回あるのが無駄に見えます。要は，Fizz・Buzz のあるなしを区別できれば良いので，文字列の繰り返しや結合を駆使します。
　Julia では，多くの言語と少し変わって，文字列の結合は`*`[^1]，繰り返しは`^`を使います。

[^1]: 余談 ：[Why does Julia use * for string concatenation? Why not + or something else?](https://docs.julialang.org/en/v1/manual/faq/#Why-does-Julia-use-*-for-string-concatenation?-Why-not-or-something-else?-1)

```julia
for i in 1:100
    println((s = "Fizz"^((2 - i % 3) ÷ 2) * "Buzz"^((4 - i % 5) ÷ 4))=="" ? i : s)
end

```
　文字列の繰り返しを1回にしたり0回にしたりすることで Fizz, Buzz の出力をコントロールしている感じです。Julia の `÷` は整数へと切り捨てる割り算になります（Python3 の `//`相当）。

# 最後の切り詰め（69 byte）
　Julia に詳しい人たちにアドバイスをもらい，

- `for` の代わりに ブロードキャストを使った繰り返し（`map`を使うよりも短い）。
- `x=...==""`の部分を`x=...>""`とする
- `(2 - i % 3) ÷ 2`の部分で，インデックスを1ずらすことにより`i % 3 ÷ 2`でできるように

という工夫の結果，**69 byte**まで短縮しました。

```julia
(i->println((x="Fizz"^(i%3÷2)*"Buzz"^(i%5÷4))>"" ? x : i+1)).(0:99)
```




# 最後に
ゴルフ向きの Perl には敵わないとしても，Python3 で 49 byte とか出ているみたいなので，せめて 60 台には載せたかったです。みなさまのご協力お待ちしております。
Macでvueを使おうとするとnot foundになる問題の解決

インストールはできているのに、vueを使おうとするとnot foundになる現象が起きたのでメモです。
「パスを通す」ことで解決できました。

## 手順
### １：vue-cliのインストール
```
$ npm install --global vue-cli
```

これをすると

```
$ npm install --global vue-cli
npm WARN deprecated coffee-script@1.12.7: CoffeeScript on NPM has moved to "coffeescript" (no hyphen)
/Users/＊＊＊/.npm-global/bin/vue-init -> /Users/＊＊＊/.npm-global/lib/node_modules/vue-cli/bin/vue-init
/Users/＊＊＊/.npm-global/bin/vue -> /Users/＊＊＊/.npm-global/lib/node_modules/vue-cli/bin/vue
/Users/＊＊＊/.npm-global/bin/vue-list -> /Users/＊＊＊/.npm-global/lib/node_modules/vue-cli/bin/vue-list
```

こういう画面が出てくるのでメモするか消さずに残しておきます。

### ２：.bash_profileの書き換え
`ユーザ　＞　＊＊＊（それぞれの環境参照）　＞　.bash_profile`というものがあるのでそれをテキストエディタで開いて
手順１で出て来た`/Users/＊＊＊/.npm-global/lib/node_modules/vue-cli/bin`を含めた

```
export PATH="/Users/＊＊＊/.npm-global/lib/node_modules/vue-cli/bin:$PATH"
```
を書いて保存します。

### ３：ターミナルで操作
再びターミナルで手順２の更新を反映させます。

```
$ source ~/.bash_profile
```

これで`$ vue -V`をするとNot foundにならなくなり、インストールされているバージョンが表示されるようになります。
(Vは大文字です）
「mruby on EV3RT + TECS」 rubyアプリケーションをLCD上に一覧表示させ選択実行。さらに、Bluetooth受信モードに切り替え可能。

「[mruby on EV3RT + TECS](https://www.toppers.jp/tecs.html)」で
- わざわざ何度もSDを抜き差ししなくても複数のrubyアプリケーションを実行したい。
- Bluetoothで飛んできたバイトコードは保存して次回以降も使用したい。

という要望があったので以下の３つのモードを持つアプリを作成しました。

1. [Run] SDに保存されたバイトコードをLCD上で選択し実行
1. [Delete] SDに保存されたバイトコードをLCD上で選択し削除
1. [Bluetooh] Bluetooth経由で飛んできたバイトコードを実行し、保存

以下に使い方をまとめます。

# ０．EV3RT+TECSのダウンロードや環境構築

[このGithubレポジトリ](https://github.com/seito-zoso/my-ev3rt-tecs.git)のmasterブランチをGitクローンしてください。

    % git clone https://github.com/seito-zoso/my-ev3rt-tecs.git

初期環境構築等の方法については doc/mruby_on_ev3rt+tecs_build.pdf を参考にしてください。
（本家「mruby on EV3RT+TECS」はここからダウンロードできます[[ダウンロード](https://www.toppers.jp/tecs.html)]）

# １．前準備

## 1-1. アプリをEV3に取り込む。
cygwinで hr_tecs/workspace/menu+bluetooth ディレクトリに移動してください。そこで

    % make tecs

と打ち込んでください。GNU Makeがtecsgenを実行し、TECSコンポーネント記述言語（CDLファイル）に基づいたインターフェースコードなどを作成してくれます。
次に

    % make

でアプリケーションを選択実行するためのアプリがSDカードに取り込まれます。
エラーとなる場合はSDの指定ディレクトリが間違っている可能性があります。hr_tecs/workspace/menu+BT/Makefileにおいて以下の「e」の部分を自身のSDのドライブ名に変更してください。

    # SDのドライブ文字を指定
    SD_DIR = /cygdrive/e

## 1-2. mrubyバイトコード（.mrb）をSDに保存する
次にrubyコードをSDに保存する方法を紹介します。
hr_tecs/workspace/cp_mrb_app/ にrubyコードを作成し保存してください（作成しなくても最初からいくつかサンプルコードが用意されています）。
コメントアウト（＃）を用いてMakefileでアプリケーションの指定をしてください。rubyコードを自分で作成した場合はファイル名をここに追加します。（※ファイル名は拡張子を除いて８文字以内にしてください。）

    \#  mrubyのアプリケーションファイル名
    \# APP_NAME = battery.rb
    APP_NAME = button.rb
    \# APP_NAME = menu.rb
    \# APP_NAME = color.rb
    \# APP_NAME = color2.rb
    \# APP_NAME = color3.rb
    \# APP_NAME = ev3way.rb

Makefileの準備ができたら

    % make

バイトコード（.mrb）の作成とSDへのコピーが実行されます。ここでもSDの指定ディレクトリに注意してください。
その他にも実行したいアプリがあれば同様にしてSDにコピーしておいてください。


# ２．実行
各モードの切り替えはEV3の左右ボタンで行います。

## 2-1. Runモード
保存されたバイトコードを実行します。
hr_tecs/workspace/cp_mrb_app/での make によりSDに保存されたバイトコードがLCD上に一覧で表示されます。
上下ボタンで実行したいアプリを選択してください。

## 2-2. Deleteモード
保存されたバイトコードを削除します。
削除対象を選択し、確認画面でYesを押してください。

## 2-3．Bluetoothモード
Bluetooth 経由でバイトコードを受信します。
doc/mruby_on_ev3rt+tecs_build.pdf の手順に従ってEV3をPCに接続してからEnterを押下します。
TeraTermからバイトコードの転送を行えばアプリケーションの実行が可能です。
また転送されたバイトコードは「recv#.mrb」として保存され、再起動時LCD上で選択実行可能です。
（#には１から順に使用されていないファイル名の番号が入ります）

    　例：SDにrecv1、recv3が保存されている場合recv2が作成されます
ラグランジュ補間公式

# はじめに（Introduction）

閾値（しきいち：threshold）に使うので、ラグランジュ補間公式について記します。

## ラグランジュ補間公式

$(n+1)\ $点$\ (x_0,y_0),\ldots ,(x_n,y_n)\ $（ただし、$x_k\ 0\le k\le n$は互いに異なる）が与えられたら、
$n$次関数は__一意__に定まり次の式で表す事ができる。

```math
\begin{align*}
& \ell_k(x) := \prod_{\substack{j = 0 \\ j\ne k}}^{n}\frac{x-x_j}{x_k-x_j} \\
& L(x) := \sum_{k=0}^{n} y_k \ell_k(x)
\end{align*}
```

まとめて、一つの式にすると

```math
\begin{align*}
L(x) := \sum_{k=0}^{n}\left(y_k \prod_{\substack{j=0 \\ j\ne k}}^{n}\frac{x-x_j}{x_k-x_j} \right)
\end{align*}
```
#### 例

3点$(1,20),(2,22),(3,32)$から2次関数を求めてみます。

```math
\begin{align*}
L(x)&=20\frac{(x-2)(x-3)}{(1-2)(1-3)}+22\frac{(x-1)(x-3)}{(2-1)(2-3)}+32\frac{(x-1)(x-2)}{(3-1)(3-2)} \\
&=20\frac{(x-2)(x-3)}{2}+22\frac{(x-1)(x-3)}{-1}+32\frac{(x-1)(x-2)}{2} \\
&=10(x-2)(x-3)-22(x-1)(x-3)+16(x-1)(x-2) \\
&=10(x^2-5x+6)-22(x^2-4x+3)+16(x^2-3x+2) \\
&=(10-22+16)x^2+(10\cdot-5+-22\cdot-4+16\cdot-3)x + 10\cdot6-22\cdot3+16\cdot2 \\
&=4x^2-10x+26
\end{align*}
```
#### 直感的に

$x$が互いに異なる3点$(x_0,y_0),(x_1,y_1),(x_2,y_2)$から2次関数を求める式をみてみます。

```math
\begin{align*}
L(x)&=y_0\frac{(x-x_1)(x-x_2)}{(x_0-x_1)(x_0-x_2)}+y_1\frac{(x-x_0)(x-x_2)}{(x_1-x_0)(x_1-x_2)}+y_2\frac{(x-x_0)(x-x_1)}{(x_2-x_0)(x_2-x_1)} \\
\end{align*}
```

最初の項$\ y_0\frac{(x-x_1)(x-x_2)}{(x_0-x_1)(x_0-x_2)}$をみると、$x_0$を$x$に代入すると、分母と分子が同じになり$y_0$だけが残ります。また、$x_1,x_2$を代入すると分子が$0$となりこの項は$0$となります。
他の項も同じになるので、3点を満たす（通る）関数を導く事ができます。
$x$は互いに異なるので、分母が$0$になることはありません。

## 証明

式が求められることは直感的にわかりましたが__一意__に定まることが必要です。

### 因数定理

多項式$f(x)$が$(x-a)$を因数にもつ$\iff f(a)=0$

#### 因数定理の証明

多項式$f(x)$を$(x-a)$で割った商を$g(x)$、あまりを$r$としたとき、$f(x)=(x-a)g(x)+r$となります。
$x$に$a$を代入すると、$f(a)=r$となり、$f(x)$が$(x-a)\ $を因数（$\ f(x)=(x-a)g(x)\ $）にもつ場合$\ r=0$が必要十分条件となります。

#### 一意の証明

$(n+1)\ $点$\ (x_0,y_0),\ldots ,(x_n,y_n)\ $（ただし、$x_k\ 0\le k\le n$は互いに異なる）
を満たす（通る）$n$次式の関数$f(x),g(x)$を考えます。
$h(x)=f(x)-g(x)$とすると、$h(x_k)=0\ (0\le k\le n)$となります。
したがって、因数定理より$\ f(x)-g(x)=a(x-x_0)\cdots (x-x_n)\ $となります。
（各点は、$f(x)-g(x)$の因数となるためです。）
$(x-x_0)\cdots (x-x_n)\ $は$(n+1)$次関数となるなるので、$a=0$でなければなりません。
したがって、$f(x)-g(x)=0$となり、$f(x)=g(x)$となります。
これにより、__一意__となることがわかります。

# さいごに

直感的にわかりやすい公式だと思います。
これを使って、閾値（しきいち）署名に適用していこうと思います。

# 参考（Reference）

- [ラグランジュ補間 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%B0%E3%83%A9%E3%83%B3%E3%82%B8%E3%83%A5%E8%A3%9C%E9%96%93)
- [Lagrange polynomial - Wikipedia](https://en.wikipedia.org/wiki/Lagrange_polynomial)
- [ラグランジュの補間公式とその応用例 | 高校数学の美しい物語](https://mathtrain.jp/hokan)
- [因数定理とその重解バージョンの証明 | 高校数学の美しい物語](https://mathtrain.jp/factortheorem)
- [ラグランジュ補間とは？   - 例題 (二次補間・三次補間) と証明 - 理数アラカルト -](https://risalc.info/src/lagrange-interpolation.html)
Cloud Functions を使って Firestore の定期バックアップ

# Motivation
Firestore のバックアップを Cloud Scheduler と Cloud Functions で完全サーバーレス的に実行したい。 もちろん、既に先人達が実装済み。

https://tech.ginco.io/post/cloud_scheduler/
https://qiita.com/Kasanomo/items/566191f0c106b4669f22

が、サービスアカウントの秘密鍵を使うようなサンプルになっている。
折角 Cloud Functions 自体が既に権限を持っているのだから、別口で秘密鍵をアップロードする事なくできないだろうかと思って調べてみた。

## 下準備
コード書く前に環境設定

### GCSバケット
まずバックアップ先であるバケットを作成する。 ここでは `gs://foo` とする。 不特定多数からアクセスされる訳じゃないので `Regional` でいいだろう。 注意すべきなのは、Firebase のプロジェクト作成時に選択したリージョンと同じにしておくこと。 じゃないと、あとでこける。

### IAM
Firebase で Cloud Functions 作った場合のデフォルト権限である `<PROJECT_NAME>@appspot.gserviceaccount.com` は、Project Editor にもかかわらず、実は十分な権限がついてない。 ということで、`Cloud Datastore Import Export Admin` のロールを付与する。

## Cloud Functions で PubSub トリガーを作る
PubSubの `backup-firestore` トピックへのメッセージのトリガーにする。

実際のバックアップは `googleapis` パッケージを使って REST API 呼び出し。 ちなみに、なんだかクセの強いライブラリで、使い方、コード追わないとよくわからんかった。

```js
exports.onFirestoreBackup = functions.pubsub
  .topic('backup-firestore')
  .onPublish(async message => {
    const { google } = require('googleapis')
    const { GCP_PROJECT } = process.env

    const auth = await google.auth.getClient({
      scopes: [
        'https://www.googleapis.com/auth/datastore',
        'https://www.googleapis.com/auth/cloud-platform',
        'https://www.googleapis.com/auth/compute'
      ]
    })

    await google.firestore('v1').projects.databases.exportDocuments({
      name: `projects/${GCP_PROJECT}/databases/${GCP_PROJECT}`,
      requestBody: { outputUriPrefix: 'gs://foo' },
      auth
    })
  })
```

これで、`gs://foo` 以下に、`2019-02-26T10:10:35_84272/` みたいなディレクトリがバックアップの度に生成されるようになる。 ちなみに `outputUriPrefix` にバケットを指定する際にバケット名の先（`gs://foo/bar`）まで指定すると、タイムスタンプのディレクトリが作られず、そのディレクトリ直下にファイルが置かれる仕様っぽい。

謎に `https://www.googleapis.com/auth/compute` を追加してあげる必要があった。なぜかはよくわからない。きっと内部の話なんだろう。


## Cloud Scheduler
GCPコンソールからさらっと設定。 任意のタイミングで `backup-firestore` トピックへメッセージを投げる。 メッセージの中身は読まないのでなんでもいい。 空メッセージは送れなかったような気がしなくもないので `{}` とかにした。本当に空でもいいのかもしれない。

設定できたら `Run Now` で手動実行。

## 結果
普通にできた。Cloud Functions のログを確認。

リストアするには CLI から
`gcloud alpha firestore import gs://[BUCKET_NAME]/[EXPORT_PREFIX]/`


これで、また一つ秘密鍵の管理が減った。嬉しい。

## 追記
Cloud Functions にスケジュール実行機能が追加されてるようだ。 ↑の PubSub / Cloud Scheduler を使う必要がなくなって、より簡単に実装できるようになっている。
https://firebase.google.com/docs/functions/schedule-functions?hl=ja
CakePHP3で一つのクエリ結果をネストループさせるときに注意すること

CakePHP3で実装する際に、find()した結果をforeachでネストループさせる時に、
想定外の挙動をしてハマりましたので、tipsとして記録します。

## 背景
Usersテーブルに入っているユーザそれぞれに対して、
そのユーザとその他のユーザの類似度を計算したかった。

そのため、Usersテーブルの中身を2重ループするような実装をした。

```
$users = $this->Users->find()->all();

echo "*START\n";
foreach ($users as $outerUser) {
    echo "OUTER: {$outerUser->id}\n";

    foreach ($users as $innerUser) {
        echo "INNER: {$innerUser->id}\n";
    }
}
echo "*END\n";
```

## 問題となる結果
なぜか外側のループが最後まで回らず1回目で終了した。

```
*START
OUTER: 1
INNER: 1
INNER: 2
INNER: 3
INNER: 4
INNER: 5
*END
```

## 解決策
`toArray()`をつかって配列にすることで問題は起きなくなった。
が、ポピュラーで割とやりがちな実装だと思うので要注意だと思いました。

```
$users = $this->Users->find()->toArray();
```

## ソース
issueを上げて確認したところ、そういった仕様という認識で良い模様。
https://github.com/cakephp/cakephp/issues/13021
【C#】wavファイルを鳴らす

###表題のまんまなのでいきなり本文
```
using System.Media;

namespace app
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            string path = @"D:\exe\visualstudiocommunity\hogefuga\music.wav";
            SountPlayer music = new SoundPlayer(path);
            music.Play();
        }
    }
}
```

visual studio communityでF5を押下してビルドすると音楽が鳴ります。
勿論pathの部分は自分の環境にあったものを入れてください。

前回unityでゲーム作ろう！って記事を書いたのですが、そもそもC#なんぞやという状態だったので、まず素のC#で何か作ってみようと思いました。。
物理演算とかしないなら普通に作れますよね。まあunity使う気なら最初からunityで作ってもいいと思うのですが、覚えることが多そうなので先にプログラムだけ学ぼうと思います。
OpenVR-InputEmulatorでDevice Modeを変更しようとするとUnknown errorになる

# OpenVR-InputEmulatorでDevice Modeを変更しようとするとUnknown errorになる

OpenVR InputEmulatorはSteamVRの入力系を拡張するツールです。

この度、VIVEトラッカーの動きをVIVEコントローラーに割り当てようとしたところ、エラーが発生しました。

まず、SteamVRの **OpenVR-InputEmulator** の設定ページを開きます。
<img width="600" src="https://qiita-image-store.s3.amazonaws.com/0/221845/6ca4fec6-c259-2b8b-bf10-95138aab7bf0.png" />
ここで、 **Device Mode** を **Swap with** にして、 **Apply** をクリックすると、以下のようになります！
<img width="600" src="https://qiita-image-store.s3.amazonaws.com/0/221845/ca42ff30-4b19-e23a-ebc6-2d52f687cbc1.png" />
以下のように書かれています。

```
Set Device Mode
Could not set device mode: Unknown error
```

# 動作環境

エラーが発生した時の動作環境は以下の通りです。

- Windows 10 64bit
- SteamVR 1.2.10
- OpenVR Input Emulator 1.3


# 調査

こちらに同じ症状の報告を見つけました。
https://github.com/matzman666/OpenVR-InputEmulator/issues/134

リンクをたどると、こちらのプルリクに行きつきます。
https://github.com/matzman666/OpenVR-InputEmulator/pull/130

どうやら、有志が作ってくれたパッチをSteamVRに充てることで対応できるようです。
※パッチはWindows10 64bit専用のようです。


# 対処法
## SteamVRを停止する
**まず、SteamVRが起動中なら停止します！**
これが一番大事です！！

## SteamVRにパッチを充てる
次に、プルリクの会話内に登場する **driver_vrinputemulator_release_hopefully.zip** をダウンロードし、解凍します。

中に **driver_vrinputemulator** というフォルダがありますので、
それを `C:\Program Files (x86)\Steam\steamapps\common\SteamVR\drivers\driver_vrinputemulator` に配置します。

※SteamVRのインストール先をデフォルトから変更している場合は、それに合わせて、配置先も変えてください。

もし、 `00vrinputemulator` というフォルダが  `drivers` 直下にある場合は、削除した方がよいそうです。（念のため、バックアップはしてください。）

## セーフモードを無効化する
そして、SteamVRを起動します。
私はここで、以下のアラートが出ました。

```
SteamVR in Safe Mode
Due to a recent crash, SteamVR is currently operating in safe mode. In this mode it will only load trusted drivers to avoid compatibility issues.
```
「最近クラッシュしたからセーフモードで起動したよ！互換性の問題を避けるために信頼できるドライバーのみをロードしたよ！」
みたいなことが書かれています。

このままでは、先ほど配置した **driver_vrinputemulator** も正しく読み込まれないようですので、セーフモードを無効化します。

ダイアログの **Disable Safe Mode** をクリックすればよいです。
SteamVRが再起動します。

以上で、作業終了です！


# ここまでやってもうまくいかなかったら・・・

OpenVR-InputEmulatorが正しくインストールされていない可能性があります。
私のPCでは、SteamVRを起動したまま、OpenVR-InputEmulatorをインストールしたため、正常に動作しませんでした。

OpenVR-InputEmulatorをアンインストールしてから、PCを再起動し、SteamVRを停止した状態で、OpenVR-InputEmulatorを再度インストールしたところ、私のPCではうまくいきました。

# さいごに
有志がパッチを作ってくれたおかげで、助かりました。
/xl/drawings/drawing1.xml が壊れたので、なんとかした話

# TL;DR

`/xl/drawings/drawing1.xml` の中身はXMLなので、壊れた要素を特定して取り除くことで開けるようになるよ。
図が絵がたくさんあるファイルだったので、１つずつ順番に取り除いたファイルを生成するプログラムをRubyで書いたよ。

# あらすじ
せっせと作ったExcelファイル。完成して他の人に送ったら「開けないんですけど」との連絡が。
そんなわけあるかい、、と思い、手元のオリジナルを開くと、「一部に問題が見つかりました。」とのこと。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/193460/53e66d48-235d-f3e2-706e-b10958d2fc44.png)

可能な限り内容を修復してほしいので、「はい（Y)」を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193460/6d80a6a8-a842-1a86-caf4-4b66a7ba282a.png)

図形や画像ファイルが綺麗さっぱり消えていました。

こんなに悲しいことがあるだろうか。（いや、ない）

なので、紆余曲折の後、イカれたメンバーを特定してくれるやつを作成したのであった。

# 調査

しばらくインターネットの海を漂うと、同じ問題に直面した人がいるということが分かった。

### OpenOfficeを試す

[Excel2010で壊れた図形を復活させてみた](http://harikofu.blog.fc2.com/blog-entry-376.html)を参考にOpenOfficeで開き直すと、確かに開くことができた。

ただ、図の矢印や画像のアスペクト比がぐちゃくちゃになっていて、とても、完全復活といえる代物ではなかった。
テキストベースのexcelなら、この方法で復活させて完了で良い気もするが、今回は図や絵がふんだんに使われていたのでPass。

ちなみに、OpenOfficeではxlsx形式で保存することができず、xls形式で保存することになるため注意が必要。

### drawing1.xmlから壊れている図を特定する
[エクセルが開かない](https://www.excellence-blog.com/2017/03/01/%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB%E3%81%8C%E9%96%8B%E3%81%8B%E3%81%AA%E3%81%84/)を読むと

* xlsxの実態はzipファイルで、拡張子を変更すると解凍することができるらしい
* /xl/drawings/drawing1.xml というファイルの中にある`<xdr:twoCellAnchor>`という要素で図や絵を表現しているらしい
* 壊れた`<xdr:twoCellAnchor>`を取り除くことで、壊れていない部分は復旧させることが可能

ということらしい。ふむふむ。

てことは、例えば、`<xdr:twoCellAnchor>`要素を半分に分けて、エラーが起こるかどうかを確認する、発生したら発生した方を更に半分にして、、、みたいに、二分探索していけばいつかはたどり着くんだろうけど、、、

1. 拡張子をxlsxからzipに変更
2. 解凍
3. フォルダ内のdrawing1.xmlを編集 <= インデントや改行が無いので、ツールが無いと結構しんどい
4. 圧縮
5. 拡張子をzipからxlsxに変更
6. excelで開いてみる
7. 壊れていれば、再び3から
8. (ﾟдﾟ)ｳﾏｰ

という手順を黙々と行う必要がある。

今回は、170個ぐらい図や絵が貼ってあるExcelファイルだったので、[log_2 170] + 1 = 8 で 最大8回繰り返せば破損箇所が特定できそうだ。

ただ、こんな地道な作業8回もやりたくない、、、
ということで、イカれたメンバーを特定してくれるやつを作ることにしました。

# イカれたメンバーを特定してくれるやつ

[イカれたメンバーを特定してくれるやつ](https://github.com/satougashi/excel_rebuild)を作りました。

結果的に線形探索になりました。
急いでいたので、Rubyで書きました。
が、Rubyの記述力に私の実力が追いついていないため、冗長です。え？リファクタリング？できたらする。

### やっていること
`<xdr:twoCellAnchor>`、もしくは`<xdr:oneCellAnchor>`要素をdrawing1.xmlに1つ追加しては、その都度rebuild_[連番].xlsxを生成する

### 使い方
1. RubyのインストールされたOSを準備する
2. ``gem install rubyzip``する
3. githubから[イカれたメンバーを特定してくれるやつ](https://github.com/satougashi/excel_rebuild)を取得する
4. targetフォルダにxlsxファイルをzipにして解凍したファイルの中身を配置する
5. ``$ ruby　./src/rebuild_excel_book.rb``する
6. resultフォルダに生成されたExcelファイルを上から叩いて、イカれたメンバーを特定するぜ

# 感想
* `<xdr:twoCellAnchor>`だけでなく、`<xdr:oneCellAnchor>`も存在するようだ。更なる調査が必要
* xmlは改行が入っていても問題ないので、``(</xdr:oneCellAnchor)``や``(</xdr:twoCellAnchor)``を``\r\n$1``で置換してしまえば読みやすくなる
* xmlは``<!-- -->``でコメントアウトできるので、drawing1.xmlの内容が少なければ、手作業で怪しい箇所をコメントアウトして確認しても大した手間じゃないかも（というか、要素1つ1つをコメントアウトしていって、開くことができるファイルを探すほうが賢かったかも）
* `<xdr:twoCellAnchor>`の子要素に一意となるid的な属性を持っていることに後から気付いた。rebuildするファイルのファイル名をidにすると、特定した後、壊れた要素を削除するのが楽になるかも
* Excelがdrawing1.xmlを読み込むモジュールが分かれば、エラーが発生するかどうかの判定ができそうなので、該当箇所の特定と削除を1つのプログラムで完結できそう（となるとVBSかC#が適しているかな）
Office 2016 不要アプリをアンインストール

Windows7、８
Office 365 （2016）で使える

おやぢチップス（27）：Office 2016 不要アプリをアンインストール - 北の窓から（芦田っち）
https://blog.goo.ne.jp/ashm314/e/f4dcf2c002de4cf87dab9dee8a79701a

Microsoft Office 2016 を選択インストールする - Qiita
https://qiita.com/bezeklik/items/a27bd8265e170122b0fb

#1.前提条件

Office 365 （2016）アカウント

#2.Office Deployment Toolのダウンロード

Download Office Deployment Tool from Official Microsoft Download Center
https://www.microsoft.com/en-us/download/details.aspx?id=49117

#３．変更点


```configuration.xml
<Configuration>

  <Add OfficeClientEdition="32" Channel="Current">
    <Product ID="O365ProPlusRetail">
      <Language ID="ja-jp" />
      <ExcludeApp ID="Access" />
      <ExcludeApp ID="InfoPath" />
      <ExcludeApp ID="Lync" />
      <ExcludeApp ID="Groove" />
      <ExcludeApp ID="OneNote" />
      <ExcludeApp ID="Outlook" />
      <ExcludeApp ID="Publisher" />
      <ExcludeApp ID="SharePointDesigner" />
      <ExcludeApp ID="Visio" />
    </Product>
  </Add>

</Configuration>
```

コマンド・プロンプトで管理者で以下を実行
「cd C:\Users\xxxxxxx\Documents\Office 2016 Deployment Tool」
「setup.exe /configure configuration.xml 」

#３．確認。

word excel powerpointだけになった。

以上
MindSphereアプリケーションにSSH接続する方法


# SSHで接続する
SSHでアプリケーションにアクセスする方法は２つあります。コマンドプロンプトやターミナルなどからCF CLIを使用してアクセスする方法と、Puttyからアクセスする方法です。
(Putty以外のリモートログオンクライアント、例えばTeraTermやWin SCPで実験してみましたが、こちはアクセスできませんでした)

比較的簡単でオススメなのはCF CLIからのアクセスです。Puttyからアクセスしようとすると、ワンタイムパスワードをいちいち取得する必要があるので、個人的には面倒だと思います。
今回はCF CLIでアクセスする方法を紹介します。

## SSHを有効化させる

今回は例えば「sample」という名前のスペースで「sampleApp」という名前のアプリケーションが既に作成済みとします。
まず以下のコマンドでスペースでSSHが有効になるように設定します

```bash
cf allow-space-ssh sample
```

以下のコマンドでSSHが有効化されたか確認します

```bash
cf space-ssh-allowed sample
```


## アプリケーションのSSHを有効化する
以下のコマンドでアプリケーションのSSHを有効化する

```bash
cf enable-ssh sampleApp
```

SSHが有効化されたかどうか、以下のコマンドで確認します

```bash
cf ssh-enabled sampleApp
```

## SSHで接続
以下のコマンドでSSH接続ができるようになります。

```bash
cf ssh sampleApp
```

このコマンドで少しだけ時間を置いてから以下のようなプロンプトが表示されれば成功です。

```bash
vcap@xxxac933-xxx-xxxx-xxxx-d8c5:~$
```

## うまくできない場合
以下のような場合はうまく繋げない場合があります。
ひとまず少し時間を置いてからアクセスすればたいていOKです。

### アプリを作ったばかり
過去にありましたが、アプリを作ったばかりの場合はすぐにアクセスできないことがあります。しばらくしてからアクセスしてみてください。

### SSHを有効にしたばかり
enable-sshコマンドを使用しても、すぐにはアクセス可能になるわけではないようです。
数十分待ってからアクセスしてみてください。


# 終わりに
比較的簡単ですね。
ただできることはそれほど多くないかもしれませんが……
Windowsで4画面表示したときに隣のウィンドウに移動するショートカット

# 背景
Windowsでも、「Windowsキー」+（「↑ or ↓ or → or ←」」）を活用すれば以下のように4画面で運用できますね。情報密度を上げたい人にはたまりませんね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/6463/1461345b-f9d7-01d2-9ccf-3894e3949970.png)

この時「Alt」+「Tab」で移動するのが移動が厳しい場合がありますよね。
もっとシームレスに隣のウィンドウに移動したい！そういうことができないか調査しました。

ということで移動がしやすくなるショートカットです。
標準機能でできました。

# 結論

「Windowsキー」＋「数字」でアクティブなウィンドウを切り替えることができます。

数字は、以下のようにウィンドウの並び順版のようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/6463/45d4d7a2-dfd1-37d2-b765-78b12befcf21.png)

というわけで最初の画面でいうと、「Windows+1」でブラウザに、「Windows+2」でコマンドプロンプトに移動できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/6463/8e98d3b6-6ec7-f7e2-8a39-cb217c395af9.png)

# 制約

* Chromeのタブを複数ウィンドウに並べられると、ウィンドウが束ねられるので「Windows+数字」で移動できなくなります。（この場合は ctl+tabですかね..）
* アクティブなウィンドウを「Windowsキー+数字」で指定した場合、ウィンドウが最小化されてしまいますので、操作に慣れが求められます
* 「Windowsキー」を押す都合上、タスクバーが起動します。ちょっとノイジーです


# まとめ

Macでできることと同様の動きをWindowsでできないかの挑戦でした。
みなさん、良いWindows開発ライフを！
Laravelのマイグレーションではtimestamp型のchangeが出来ない

# エラー内容

Laravelのマイグレーションでtimestamp型のカラムに変更を加えようとすると以下のようなエラーが出る。

```
Unknown column type "timestamp" requested. Any Doctrine type that you use has to be registered with \  
  Doctrine\DBAL\Types\Type::addType(). You can get a list of all the known types with \Doctrine\DBAL\Ty  
  pes\Type::getTypesMap(). If this error occurs during database introspection then you might have forgo  
  tten to register all database types for a Doctrine Type. Use AbstractPlatform#registerDoctrineTypeMap  
  ping() or have your custom types implement Type#getMappedDatabaseTypes(). If the type name is empty y  
  ou might have a problem with the cache or forgot some mapping information.
```

# 理由
Laravel内で利用しているDoctrineというライブラリが対応していないから。ちなみに対応の予定もなさそう。
https://github.com/doctrine/dbal/issues/2558

理由としてはtimestamp型はMySQL固有の型だから特定のDBサービス用の型はサポートしないよということ。

ちなみにLaravelのchangeで変更できるカラムの種類は以下に限られている

```
bigInteger
binary
boolean
date
dateTime
dateTimeTz
decimal
integer
json
longText
mediumText
smallInteger
string
text
time
unsignedBigInteger
unsignedInteger
unsignedSmallInteger
```

# 解決策
DBファサードを使って生のSQLを発行する
MySQLのバージョンは5.7.25です。

```php

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        DB::statement('ALTER TABLE `テーブル名` MODIFY COLUMN `カラム名` TIMESTAMP NULL;');
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        DB::statement('ALTER TABLE `テーブル名` MODIFY COLUMN `カラム名` TIMESTAMP NOT NULL;');
    }
```
RevPi Core3とAlexaの連携デモ（動画） 

##RevPi Core 3とAI スピーカーAlexaをNode-REDで連携しLEDランプをON/OFF
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ハーティングは2/21に開催されたCC-Link協会主催のCC-Linkユーザーセミナーにて、産業用ラズベリーパイのデモ展示とプレゼンテーションを行いました。<br>デモ内容（動画）：産業用ラズパイ RevPi Core3とAIスピーカー(Alexa)をNode-REDで連携し、リモートI/Ｏに接続したLEDランプをON/OFFします。<a href="https://twitter.com/hashtag/RevPi?src=hash&amp;ref_src=twsrc%5Etfw">#RevPi</a> <a href="https://t.co/hMQjrdAjzl">pic.twitter.com/hMQjrdAjzl</a></p>&mdash; HARTING K.K. (@HARTING_JP) <a href="https://twitter.com/HARTING_JP/status/1100599335710937088?ref_src=twsrc%5Etfw">2019年2月27日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##デモで行った操作
・AlexaアプリのNode-REDスキルによるスマートフォンからの操作
・ブラウザ上のNode-RED Web UIを使った操作
・Alexaで音声入力による操作
C#のコンソールアプリで、特定のキーが押されているか調べる

# 概要
C#のコンソールアプリケーションで、無限ループ中に特定のキーが押されたら終了処理をしてアプリケーションを終わる…という処理がしたかったが、ググっても、ググっても、ウインドウアプリでのやり方しか出てこなかったので、出来るようになった方法をポエムにまとめておく。

※コメント欄にて、もっと簡単な方法を教えて貰った。

# 前提
クラス宣言の直後にDLL読み込みを記述しておく。

```C#
class Program {
  [System.Runtime.InteropServices.DllImport("user32.dll")]
  private static extern short GetKeyState(int nVirtKey);
　　・
　　・
　　・
```

# キー押下判断

```C#
while (GetKeyState(0x51) == 0) {
  // なにかしらの処理
}
```

これで、「Q」が押されるまでwhileループを廻り続ける。
RSpecの導入

#はじめに
[RSpec](https://github.com/rspec/rspec-rails)をインストールしたのでその手順をメモします。

＊環境
ruby   : 2.5.1
rails  : 5.2.2

#導入手順
###1. gemのインストール
```ruby:Gemnfile
group :development, :test do
  # 省略
  gem 'rspec-rails'
end
```
bundle installします。

###2. RSpecの設定
`rails generate rspec:install`すると結果は以下。

```ruby
Running via Spring preloader in process 93674
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
```
次にRSpecの出力形式を設定します。形式の種類については[Project: RSpec Core 2.6 --format option](https://relishapp.com/rspec/rspec-core/v/2-6/docs/command-line/format-option)を参照ください。
今回はドキュメント形式にします。

```ruby:/rspec
--require spec_helper
--format documentation  # この一行を追加
```

###3. springを使ってRSpecの起動時間を速くする
```ruby:Gemnfile
group :development do
  # 省略
  gem 'spring-commands-rspec'
end
```
bundle installし、次に`bundle exec spring binstub rspec`をするとbinディレクトリにrspecファイルが生成されます。

```ruby:bin/rspec
#!/usr/bin/env ruby
begin
  load File.expand_path('../spring', __FILE__)
rescue LoadError => e
  raise unless e.message.include?('spring')
end
require 'bundler/setup'
load Gem.bin_path('rspec-core', 'rspec')
```

`bin/rspec`もしくは`bundle exec rspec`を実行して以下の通り結果がでればrspecは正常にインストールされています。

```
Running via Spring preloader in process 93755
No examples found.


Finished in 0.00079 seconds (files took 0.2886 seconds to load)
0 examples, 0 failures
```

###4. ジェネレーターを（お好み）設定
rails gコマンドを実行した際に自動生成されるファイルについて、生成の要否を各自お好みで設定します。

```ruby:config/application.rb
# 省略
module アプリ名
  class Application < Rails::Application
    
    # 省略

    config.generators.test_framework      = :rspec
    config.generators.system_tests        = false
    config.generators.stylesheets         = false
    config.generators.javascripts         = false
    config.generators.helper              = false
    config.generators.helper_specs        = false
    config.generators.view_specs          = false
    config.generators.controller_specs    = false
  end
end
```

#その他
###[Factory Bot](https://github.com/thoughtbot/factory_bot)のインストール
テスト用のデータを簡単に作成できるFactory Botを導入します。

```ruby:Gemnfile
group :development, :test do
  # 省略
  gem 'factory_bot_rails'
end
```
```ruby:/spec/rails_helper.rb
RSpec.configure do |config|
  # 省略
  config.include FactoryBot::Syntax::Methods
end
```
ファクトリを作成するには`bin/rails g factory/bot:model モデル名`を実行します。

###[Capybara](https://github.com/teamcapybara/capybara)の設定
Capybaraを導入することで、Webアプリのブラウザ操作をシミュレーションすることができます。
Rails5.1からデフォルトで同梱されていますが、RSpecでCapybaraを扱えるようにするために以下の一行を追加する必要があります。

```ruby:/spec/rails_helper.rb
# This file is copied to spec/ when you run 'rails generate rspec:install'
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
# Prevent database truncation if the environment is production
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
# Add additional requires below this line. Rails is not loaded until this point!
require 'capybara/rspec'  # この一行を追加
end
```
CocoaPods でビルド済みバイナリを使う

iOS アプリ開発でサードパーティライブラリを導入する場合、[CocoaPods](https://cocoapods.org) か [Carthage](https://github.com/Carthage/Carthage) かのどちらかを使うのが定番です。

CocoaPods は、ライブラリのソースコードをワークスペースに組み込んで Xcode でビルドを行う仕組みです。このため、アプリのビルド時にライブラリのビルドが始まってしまうことがあります。これにより、ビルド時間が増加するため、開発効率が落ちるという問題があります。この問題は、先にライブラリをビルドしてバイナリを使う Carthage に比べて、CocoaPods が劣る点のひとつです。

しかし実は、CocoaPods でもビルド済みバイナリを使うことが可能です。以下、その方法を述べます。

# cocoapods-binary プラグイン

[cocoapods-binary](https://github.com/leavez/cocoapods-binary) プラグインは、先にライブラリをビルドして Xcode でビルド済みバイナリを使うようにする、CocoaPods のプラグインです。サードパーティ製のプラグインですが、CocoaPods のドキュメントで紹介されています（[Pre-compiling dependencies](http://guides.cocoapods.org/plugins/pre-compiling-dependencies.html)）。

`pod install` のとき、cocoapods-binary はライブラリのソースコードをダウンロードしてビルドします。そして、ビルドしたバイナリをワークスペースに組み込みます。したがって、Xcode はビルド済みバイナリを使います。

これにより、ビルド時間を短縮でき、開発効率が上がります。

# プラグインの使い方

cocoapods-binary は RubyGems で提供されています。CocoaPods と同様に `gem install` や `bundle install` でインストールします。

次に、`Podfile` の先頭に以下を追加します。

```
plugin 'cocoapods-binary'
```

そして、どの pod でバイナリを使うか指定します。

```
pod "ExpectoPatronum", :binary => true
```

または、次のように書けば全ての pod でバイナリを使います。

```
all_binary!
```

この場合、バイナリを使いたくない pod を `:binary => false` で指定することもできます。

# 注意事項

このプラグインを使う場合、`use_frameworks!` 指定が必要になります。この指定は Dynamic framework を使う指定です。

現在の Xcode や CocoaPods は Static framework に対応しており、Static を使うほうが Dynamic に比べて起動時間が早いなどのメリットがありますが、このプラグインとの併用はできないようです。

# バイナリ指定すると何が起こるか

`pod install` を行うと、バイナリ指定していない場合は、`Pods` ディレクトリに各ライブラリのソースコードが配置されます。一方、バイナリ指定した場合は、 `Pods` ディレクトリに各ライブラリのバイナリが配置されます。

より正確には、`Pods/_Prebuild` ディレクトリ以下に各ライブラリのバイナリが配置され、各ライブラリのディレクトリ `Pods/ExpectoPatronum` には `_Prebuild` へのシンボリックリンクが作成されます。

# オプション

バイナリ指定すると、`Pods` ディレクトリにはバイナリのみが置かれ、ソースコードは置かれなくなります。ただ、それは `pod install` の際に毎回ソースコードをダウンロードしてくるということでもあります。`pod install` の時間を短縮したい場合は、`keep_source_code_for_prebuilt_frameworks!` を指定すれば、ソースコードも置いておくようにできます。

また、bitcode が必要な場合は `enable_bitcode_for_prebuilt_frameworks!` を指定します。

# まとめ

CocoaPods でビルド済みバイナリを使う方法を紹介しました。CocoaPods でビルドを早くしたい方は一度試してみると良いと思います。

なお、詳細は [cocoapods-binary](https://github.com/leavez/cocoapods-binary) のページを参照してください。
[Groovy]Groovyを触ってみよう

# なんで？
今までJenkinsではshしか使用してこなかったのだが、私好みにカスタマイズしたいと思いGroovyを触ろうかと。
あくまでも備忘録として残すだけなので、超適当。

# 環境構築
## 使用環境
```Hardware:

    Hardware Overview:

      Model Name: MacBook Pro
      Model Identifier: MacBookPro15,2
      Processor Name: Intel Core i7
      Processor Speed: 2.7 GHz
      Number of Processors: 1
      Total Number of Cores: 4
      L2 Cache (per Core): 256 KB
      L3 Cache: 8 MB
      Memory: 16 GB
```
## JDK install
JDK install済みの場合はskip

```console
$ java -version
```
installされていない場合は警告が表示されるはず。
install方法は[公式サイト](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)参照

## JAVA_HOME setting
```console
$ vi ~/.bash_profile

~~edit start~~

export JAVA_HOME=$(/usr/libexec/java_home)

~~edit end~~

$ source ~/.bash_profile
```
java Versionを指定したい場合はオプションを付与すればOK。

```sh
export JAVA_HOME=$(/usr/libexec/java_home -v ○○○)
```
## SDKMAN install
```console
$ curl -s "https://get.sdkman.io" | bash
```
[公式サイト](https://sdkman.io/)参照

## Groovy install
```console
$ sdk install groovy
```

# Hello World
GroovyConsoleを起動

```console
$ groovyConsole &
```
コンソールが立ち上がるので、Consoleに下記コード入力

```groovy
println "Hello World"
```

そして実行。（<kbd>⌘ + Enter</kbd>）

下記のように出力されればOK

```groovy
groovy> println "Hello World" 
 
Hello World
```

# Jenkinsを改造しよう
作成中
.NET4.5でMS Accessのアクションクエリやマクロを実行するときの備忘録

#1.事の背景
Accessを使ってデータを加工する処理をVB.NETで書いていますが、.net3.5で動かしていたプログラムの
動作が重いと感じ、.net4.5でコンパイルしなおしたところ、手で動かしても落ちないところで、落ちるようになった。

#2.考えたこと
##①DBの最適化を細かく差し込んだ
正直パフォーマンスは低下したが、ほぼリコンパイルしても動くようになったが、最適化をかけまくるとプロセスに
大量のAccessプロセスが残るる場合があり、そうなると落ちてしまう。
ただ、大量にDelete処理を入れた時は、最適化をかけないと次の処理で落ちてしまうので、そこには最適化が必要。
##②クエリの間に微小なWaitを入れる
.netからの応答にAccessが耐えられない状況が出てくる模様で、数ミリ秒のWaitを入れてあげることで、
改善

#3.Waitのコード例
    Public Sub AccessCompaction(ByVal dbPath As String, ByVal dbName As String)
        '最適化元のMDBファイル名
        Dim strWorkingAccess As String
        '最適化先のMDBファイル名
        Dim strTempDb As String

        ' 必要な変数を宣言する
        Dim dtNow As DateTime = DateTime.Now

        ' 指定した書式で日付を文字列に変換する
        Dim stPrompt1 As String = dtNow.ToString("yyyyMMddHHmmss")

        Dim dbe As Dao._DBEngine = Nothing

        '最適化元のMDBファイルのフルパスを設定
        strWorkingAccess = dbPath & dbName
        '最適化先の一時MDBファイルのフルパスを設定
        strTempDb = dbPath & "~tmp" & stPrompt1 & dbName

        Log4Logs.Info("Access最適化：元DB：" & strWorkingAccess)
        Log4Logs.Info("Access最適化TempDB：" & strTempDb)

        Try


            '修復の実行
            '_mAccessApp.DBEngine.RepairDatabase(strWorkingAccess)

            '最適化の実行
            _mAccessApp = New Access.Application()
            _mAccessApp.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityLow  'マクロを有効にして開くように設定
            _mAccessApp.DBEngine.CompactDatabase(strWorkingAccess, strTempDb)

            System.Threading.Thread.Sleep(500)

            '最適化元のファイルを削除
            Kill(strWorkingAccess)

            System.Threading.Thread.Sleep(500)

            '最適化先のファイル名を最適化元のファイル名にリネーム
            File.Move(strTempDb, strWorkingAccess)
            Log4Logs.Info("Access最適化完了")


        Catch ex As Exception
            Console.WriteLine((ex.GetType().FullName & vbCrLf & ex.Message.ToString), MsgBoxStyle.Exclamation)
        Finally
            Log4Logs.Info("一時停止")
            System.Threading.Thread.Sleep(60000)

            Console.WriteLine("最適化完了")
        End Try

    End Sub
JavaScriptでカウントダウンを作る

業務でカウントダウン機能を作る機会があったので備忘録的に。


#完成物

![ダウンロード.gif](https://qiita-image-store.s3.amazonaws.com/0/200547/b0f9bc7b-2ae4-60c8-a2a3-7a92b1fa63a0.gif)


##html側の設定

```index.html
<!DOCTYPE html>
<html>
    <head>
       
    </head>
    <body>
        <p>東京オリンピックまであと</p>
        <div id="result"></div>
        <script src="countdown.js"></script>
    </body>
</html>
```
これだけ。
bodyの最後でjsを読み込んでいるのは、後述するが、getElementByIdでresultを読み込むため。

##JavaScript側の設定

```countdown.js

var endDate = new Date('2020/07/24 00:00:00');
var interval = 1000;


function countdownTimer(){
  var nowDate = new Date();
  var period = endDate - nowDate ;
  var addZero = function(n){return('0'+n).slice(-2);}
  var addZeroDay = function(n){return('0'+n).slice(-3);}
  if(period >= 0) {
  var day = Math.floor(period / (1000 * 60 * 60 * 24));
  period -=  (day　*(1000 * 60 * 60 * 24));
  var hour = Math.floor(period / (1000 * 60 * 60));
  period -= (hour *(1000 * 60 * 60));
  var minutes =  Math.floor(period / (1000 * 60));
  period -= (minutes * (1000 * 60));
  var second = Math.floor(period / 1000);
  var insert = "";
  insert += '<span class="h">' + addZeroDay(day) +'日' + '</span>';
  insert += '<span class="h">' + addZero(hour) + '時'+'</span>';
  insert +=  '<span class="m">' + addZero(minutes) +'分' + '</span>';
  insert += '<span class="s">' + addZero(second)+ '秒'+ '</span>';
  document.getElementById('result').innerHTML = insert;
  setTimeout(countdownTimer,10);
  }
  else{
    var insert = "";
    var number = 0;
    insert += '<span class="h">' + number + number + '</span>';
    insert +=  '<span class="m">' + number + number + '</span>';
    insert += '<span class="s">' + number + number + '</span>';
    document.getElementById('result').innerHTML = insert;
  }
}

countdownTimer();
```

少し解説。

**endDate**に目標となる日付を与え、それを**nowDate**と引き算してあげることで目標の日付までの差分を出す。しかしこれだけじゃうまく日や時間、分などに別れていないため、それぞれ分けてあげる。

```countdown.js
  var day = Math.floor(period / (1000 * 60 * 60 * 24));
  period -=  (day　*(1000 * 60 * 60 * 24));
  var hour = Math.floor(period / (1000 * 60 * 60));
  period -= (hour *(1000 * 60 * 60));
  var minutes =  Math.floor(period / (1000 * 60));
  period -= (minutes * (1000 * 60));
  var second = Math.floor(period / 1000);
```
ここらへんは、periodをそれぞれの単位に合わせている。

```countdown.js
var insert = "";
  insert += '<span class="h">' + addZeroDay(day) +'日' + '</span>';
  insert += '<span class="h">' + addZero(hour) + '時'+'</span>';
  insert +=  '<span class="m">' + addZero(minutes) +'分' + '</span>';
  insert += '<span class="s">' + addZero(second)+ '秒'+ '</span>';
  document.getElementById('result').innerHTML = insert;
```
変数にそれぞれの単位を格納した後は、実際に表示させるためにinsertに入れていく。
spanにそれぞれの値を挟むことで、数字の装飾が出来るようになっている。

しかし、そのままの変数で表示しようとすると、1桁の数字の時にサイズが変わって、レイアウトが崩れてしまう。そこでaddZeroを使っている。

```countdown.js
  var addZero = function(n){return('0'+n).slice(-2);}
  var addZeroDay = function(n){return('0'+n).slice(-3);}
```
addZeroDayは、addZeroだけだと3桁の表示の時にレイアウトが崩れてしまうと思ったので、3桁を表示することがあるdayだけに適用している。

書きなぐっただけなので、適宜わかりやすく書き直します....
Perlにおける真偽値の概念は複雑だ

@yukikimoto さんの[ツイート](https://twitter.com/perlzemi/status/1091117018781179904)を発端に色々調べることになった件をまとめますが、このまとめ自体へ方々からツッコミが入ると思います。

__編集リクエスト、コメント大歓迎__。皆さんの知識を借りて有用な記事にしたいと思います。

#Perlにおける真値とは？

代表的な値として`1`が挙げられますが、これは正確ではありません。Perlでは、__偽値でないあらゆる値が真値__です。偽値の定義が複雑なのでもはやこう表現するほかありません。

#Perlにおける偽値とは？

他言語との比較でよくある誤解として`false`という文字列があげられますが、これは真値です。`false`という関数も（作らなければ）ありません。

とりあえず列挙。

- `0`と`'0'`や`"0"`
- 空の文字列（`''`や`""`)
- 空のリストや配列'`()`'　
- `undef`
- 「真偽値コンテキストでの偽値」としか言い表せれない値[^1]（　`!1`など）

[^1]: [perldoc.jpの真偽値の項目](http://perldoc.jp/docs/perl/5.24.1/perlsyn.pod#Truth32and32Falsehood)参照

次に、一つ一つ見ていきましょう。

##`0`と`'0'`や`"0"`
数学的に`0`と等価な値、および計算結果は数値型である限り偽です。[^2]

[^2]: @xtetsuji さんの[ご指摘](https://qiita.com/xtetsuji/items/e584b819d3cd1604a91f)を受けて編集

例：`0.00`, `0x0`,`0e0`, `3-2-1`, `sin(0)`など
ただし、これらが[文字列だった場合、`'0'`や`"0"`を除いて真となります](https://gist.github.com/worthmine/f51a5c693362ca7c9dd4aea64f73ebb4)。

##空の文字列

`length`が`0`になる文字列は偽です。`''`,`""`しかないはずです。

##空のリスト

`$#array名`が`-1`になるリストや配列は偽です。`()`しかないはずです。
機序について[詳しい記事はこちら](https://qiita.com/xtetsuji/items/e584b819d3cd1604a91f#%E7%A9%BA%E9%85%8D%E5%88%97%E3%81%A8%E7%A9%BA%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E5%81%BD%E5%80%A4%E8%A9%95%E4%BE%A1%E3%81%AE%E6%B5%81%E3%82%8C%E3%81%AE%E9%81%95%E3%81%84)
なお、空のハッシュは空の配列と区別がつかない[^3]ので省略します。

[^3]: 内部的に違うかもしれないが、Perlでの表現はともに`()`である

##`undef`

`undef`は文字列コンテキスト、リストコンテキストで空になり、数値コンテキストで`0`になるので結果的に常に偽です。が、`use warnings`支配下では警告の原因になるので使わない方が良いかもしれないですね。

##真偽値コンテキストでの偽値

例えば、__`!`で反転した任意の真値は偽__です。
他には比較演算子の結果が偽だった時の返値などが該当します。
私はこれが`undef`と等価だと勘違いをしていましたが、仕様上は別とのこと。[^4]

[^4]: [ルモーリンさんの検証ツイート](https://twitter.com/lemorin_jp/status/1091448819428945921)


###どの辺が`undef`と違うの？

- `defined`で真
- なので、`use warnings`支配下で警告が出ない。

#まとめ

Perlが直感的に正しいように設計されてるからこんなこと考えずに真偽判定できるけど、詳しく調べると深かった。積極的に区別して使いたいですね。

> ひとことで言うと、文字列に変換したときに''か'0'にならなければ真です。

[akajiroさんのツイート](https://twitter.com/akajiro/status/1101317048368476160)より
なるほどね。