OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonで最大部分配列問題(maximum subarray problem)を解く

<h2>はじめに</h2>
<p>皆さん初めまして。ryuichi69と申します。</p>
<p>本日はアルゴリズムの勉強したもののアウトプットをここに書こうと思います。本日は<b>最大部分配列問題(maximum subarray problem)</b>というアルゴリズムを扱います。説明の分かりにくい部分、要件漏れ等がありましたらコメントにてご連絡下さい。</p>

<h2>最大部分配列問題(maximum subarray problem)とは？</h2>
<p>さて本題です。最大部分和問題とは、「<b>各要素に整数が入った配列があり、そのうちいくつか選んだ時、その選んだものの合計の最大値を求めよ</b>」と言う問題です。</p>
<h2>問題</h2>
<p>nを0以上の整数とします。このとき、n個の要素からなる数列(配列)a[k]が以下の条件をみたしています。</p>
<ol><li>a[0],a[1],.....a[n-1]は整数</li><li>数列aの各要素は降順に並んでいるものとします。1≦i≦(n-1)を満たすすべての自然数iに対し、a[i] > a[i+1]をみたします。</li></ol>
<p>さらに、kを1≦k≦nを満たす自然数とします。数列a[n]の要素のうち、任意のk個を選ぶ。このとき選んだものの内、その和が最大となるものをS[k]とするプログラムを作成してください。</p>

<h5>制約</h5>
<ol><li>1≦n≦10</li><li>1≦k≦10</li><li>-10≦a[k]≦10</li></ol>
<P>＊アルゴリズムの練習なので、計算量などは考慮しません。</p>
<h5>入力1</h5>
<p>a = [7,9,-1,1,-4]<br>
k = 4<br>
＊上記のようにa = [7,9,-1,1]と配列の要素が降順でない場合は、配列の要素を降順にソートして集計して下さい。<br>
</p>

<h5>出力1</h5><P>17</p>

<h5>入力2</h5>
<p>a = [-1,-2,-3,-4]<br>
k = 3<br>
＊要素が全て負の整数の場合は足し合わせません。
</p>
<h5>出力2</h5><P>0 </p>

<h2>やり方(Kadane's algorithm)</h2>
<p>配列1個1個に対し、<b>0番から順々に足して行く。そして足した合計値が足す前より大きくなる場合、その値をS_kとして採用</b>します。具体的には、</p>
<ol><li>配列を降順にソートする</li><li>整数a,bの大きい方を返す関数max(a,b)を作る</li><li>kを1ずつ増やして行って、和の最大値s[k-1]にa[k]を足し合わせる場合、足しわせない場合をそれぞれ考え、値の大きい方をs[k]として配列にメモ(格納)していきます(動的計画法)。式に表すと、<ul><li>s[0] = max(a[0],0)</li><li>s[k] = max(s[k-1] + a[k],s[k-1])</li></ul></li></ol>

<h2>Pythonプログラム</h2>
```Python:solve.php
# a[i]の各要素を降順にならべるため、
# 一旦配列をバブルソートする
def bsort(arr):

    # 入れ替え用の
    temp = 0

    # 2重ループさせます{計算量はO(n^2)}
    for i in range(0,len(arr)-1):
        for j in range(0,len(arr)-1):
            # 今回は降順なので、一つ後の要素が現在の要素より
            # 大きい場合のみ入れ替えを行います
            if(arr[j] < arr[j+1]):
                temp = arr[j]
                arr[j] = arr[j+1]
                arr[j+1] = temp
    return arr

# 2つの整数a,bのうち、大きいものを返します
def max(a,b):
    if a > b:
        return a
    return b

def solve(arr,k):

    #　まず配列を降順にソートします
    b = bsort(arr)

    #　動的計画法(dp)より、各段階の合計値をメモします
    dp = [0] * len(arr)

    # dpを計算します{計算量はO(n)}
    for i in range(0,len(b)):
        # dp[0](初期値)を決定します
        if i == 0:
            # 配列の要素が0より大きい整数ならばb[0]
            # 配列の要素が0より小さい整数ならば0をdp[0]に採用します
            # バブルソートにより降順にソートされているので、b[0] < 0ならば
            # 以後全ての和dp[i]が0となります
            dp[0] = max(b[0],0)
        else:
            # dp[i-1]+b[i]>dp[i-1]の場合のみ、dp[i]に採用
            # それ以外の場合はdp[i-1]をdp[i]に採用
　　　　　　　# すみません。訂正しました(2019.12.29)
            dp[i] = max(dp[i-1]+b[i],dp[i-1])

    #　第二引数に対応するdp[k]を返す
    return dp[k-1]

#　テスト用
if __name__ == "__main__":
    a = [7,9,-1,1,-4]
    print(solve(a,4))

    b = [-1,-2,-3,-4]
    print(solve(b,3))
```
<h2>参考</h2>
<a href="https://ark4rk.hatenablog.com/entry/2018/01/08/002508">Ark's Blog | Kadane’s Algorithm | 最大部分配列 問題</a>
<a href="https://qiita.com/pizyumi/items/c78daf4a25cf36765c50">Qiita | C#でアルゴリズムとデータ構造1 ～最大部分配列問題～</a>
Zephyr > microSD + FatFs > SPI > Analog Discovery 2によるSPIロジックのキャプチャ結果

```txt:動作環境
Ubuntu 18.04 LTS
ボード: STM32L476 Nucleo_64 (以下、STM32L476)
ボード: STM32F769 Discovery Kit (以下、STM32F769)
Zephyr 2.1.0-rc1
microSDモジュール: CK-40 (サンハヤト)
ロジック確認: Analog Discovery 2 (以下、AD2)
```

### 状況

- `samples/subsys/fs/fat_fs`にあるサンプルを試している
- A. STM32L476 + SPI1: 成功
- B. STM32L476 + SPI2: 成功
- C. STM32F769 + SPI2: 失敗

Cに関して、どこで失敗をしているのかを知るために、Bの成功例のキャプチャをここに残しておく。

### 接続

接続は以下に掲載したものと同じにしている。

- [SPI2接続 @ Zephyr > STM32L476 > SPI2を使う > `<BOARD>.overlay`に記載追加してwest build](https://qiita.com/7of9/items/63c24b749dadbce0ef6b#spi2%E6%8E%A5%E7%B6%9A)

### AD2の設定

- [Analog Discovery 2 (AD2) > SPI取込み > 希望のものをとりこぼす > Mode:Recordにする (Samples:4096 -> 1M)](https://qiita.com/7of9/items/7c78ddd2a1286ffe2893)

`Mode:Record`にすることでとりこぼしをしないようにしておく。

### サンプルプロジェクト

`zephyr/samples/subsys/fs/fat_fs`に対して、main.cの69行目 fs_mount()の結果確認でブレークポイントを設定した。

```main.c
	if (res == FR_OK) {
```

resはfs_mount()の結果。
正常なら0となる。


### キャプチャ > 文字

キャプチャした結果を文字におこした。

- 1. 80クロック (8 x 10)
- 2. 
    - MOSI: 0x40 0x00 0x00 0x00 0x00 0x94 0xFF 0xFF 0xFF
    - MISO: 0x7F 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x01 0xFF
- 3. 
    - MOSI: 0x48 0x00 0x00 0x01 0xAA 0x86 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
    - MISO: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x01 0x00 0x00 0x01 0xAA 0xFF
- 4.
    - MOSI: 0x7B 0x00 0x00 0x00 0x01 0x82 0xFF 0xFF 0xFF
    - MISO: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x01 0xFF
- 5.
    - MOSI: 0x77 0x00 0x00 0x00 0x00 0x64 0xFF 0xFF 0xFF
    - MISO: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x01 0xFF
- 6.
    - MOSI: 0x69 0x40 0x00 0x00 0x00 0x76 0xFF 0xFF 0xFF 0x77
    - MISO: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x01 0xFF 0xFF


### キャプチャ > 画像

80クロック
![Screenshot from 2019-12-29 10-32-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/2a9fa20f-9400-f0de-b57a-5db5c4d02a36.png)


0x40コマンド
![Screenshot from 2019-12-29 10-28-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/080f0847-b460-3373-d380-f73351d9ef68.png)


0x48コマンド
![Screenshot from 2019-12-29 10-28-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/1807dbfb-8755-fb92-b1b1-bdc9c15b1471.png)


0x7Bコマンド
![Screenshot from 2019-12-29 10-29-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/d363769c-5197-8348-1e3a-fc9afede4928.png)


0x77コマンド
![Screenshot from 2019-12-29 10-29-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/2439c9eb-152a-4e3a-c380-391dd3820f3f.png)


0x69コマンド
![Screenshot from 2019-12-29 10-29-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/2c7028e0-1948-8c70-cda8-413434af05ba.png)


### 関連

- [Zephyr + STM32L476 > microSD(SPIモード接続) + FAT](https://qiita.com/7of9/items/19a0a90ae30265879bf3)
- [Zephyr > microSD(SPIモード接続) + FAT > STM32L476で成功、STM32F769で失敗 > ロジックのモニタ](https://qiita.com/7of9/items/bdc3cb24867fc0d0b78c)
- [Zephyr > microSD (SPIモード接続) + FAT > STM32L476 > CMD0のパラメータが異なる (0x94と0x95)](https://qiita.com/7of9/items/5ae95f2cd1ef559bfb04)
- [Zephyr > west build時 > STM32F769:SPI2で成功, STM32L476:SPI2で失敗 > device treeファイルの定義に違いがある](https://qiita.com/7of9/items/80b8b56a84ffc76c9ee0)
バックアップは三重に(書きかけ)

サーバ系のシステムのバックアップは三重にする。

あるクラウド上のデータは、そのクラウド上でバックアップを取ると同時に、別のクラウド上にバックアップを取る。
しかし、ネットワークが切れてしまっては、どちらにも繋がらないかもしれない。
三つめのバックアップは、CD-R(容量によってはDVD-R, BD-R)に保存する。

サーバシステムの最小構成は、CD-R, DVD-R, BD-Rから起動できる状態で保存する。
もし、乗っ取られたり、壊れたりしたら、CD-R, DVD-R, BD-Rで起動だけできるように。

動的な処理は、現在稼働していませんというnomove.htmlに飛んぶように書き換えるか、
動的な処理に飛ぶ記述のところのリンクをnomove.htmlに変更してから保存する。


```html:nomove.html
<!DOCTYPE html><html><head><meta charset="utf-8" /><title>Qiita</title></head><body>このページをご利用いただきありがとうございます。現在この表示のみで、他の機能を提供していません。緊急のご用事があれば、下記までご連絡ください。　連絡先メールアドレス等</body></html>
```

動的なサーバから静的なサーバに加工する手順

```
1. <script>から</script>を削除する。


```
Raspberry Pi 4 (w/ Raspbian Buster) に docker をインストールする 

*この記事は、[OpenChain Japan WG Advent Calendar 2019](https://qiita.com/advent-calendar/2019/openchainjapanswg) の [12/24公開記事](https://qiita.com/TakashiNinjouji/items/04316e62ab056bce1572)の番外編の第2部です*

# 概要
タイトルにある通りで、Raspberry Pi 4 (w/ Raspbian Buster) で Docker 環境を作る。

# とうとつですが、Disclaimer... みたいな

この記事はどちらかというと備忘録に近い。手っ取り早く docker 環境を構築しようと適当にやってしまったので、正確に挙動を把握しながら作業をしたい人は、他の識者の記事などをみるのが良いです...


# 実施環境

- Raspberry Pi 4 Model B, 4GB (以下、"RPi4")
- microSDHC 32GB (Trabscend Premium 400x, TS32GUSDCU1, UHS-I, CLASS 10. 以下、"microSD")
- この作業は、VNC経由で RPi4 にアクセスして実施している。準備方法は別記事「[Raspberry Pi 4 に Raspbian Buster の環境をつくる](https://qiita.com/TakashiNinjouji/items/1240c644f5c560e60f48)」を参照のこと。

# Docker のインストール

執筆時点では、スクリプト一発で終了。

```shell-session:docker_install_script
$ curl https://get.docker.com | sh
```

利用したいユーザアカウントで sudo 無しで docker コマンドを操作したいので、docker グループアカウントに入れる。

1. group アカウントに docker があるかどうか確認する。
  - なければ、作成する。次の実施例では省略しているが、作成できたかどうかを念のために確認しておくこと。
2. 利用したいユーザアカウントが docker グループに入っているかどうか確認する。
  - 入っていない場合、または先の手順で docker グループを作った場合、追加する。パラメータの my_user は自分の利用したいユーザアカウント。実施例では作成後の確認を省略している。

```shell-session:docker_account
$ grep docker /etc/group 
$ sudo groupadd docker
$ groups
$ sudo usermod -aG docker my_user
```

再ログイン後に、次を確認する。

```shell-session:docker_run_hello-world
$ docker -v
Docker version 19.03.5, build 633a0ea
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1eda109e4da: Pull complete 
Digest: sha256:4fe721ccc2e8dc7362278a29dc660d833570ec2682f4e4194f4ee23e415e1064
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm32v7)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

$ 
```

あっさりと動く。

# おまけ

docker-compose をインストール出来たら、追記する予定。
次のコンポーネントの追加でできると思ったのだけど、なぜか、いくつかのモジュールのインストールがみつからなさげ...

2019.12.29 11:30 am 追記
時間切れなので、年越し案件になりそう。docoker-composer は手元でビルドするのが早いかも知れない...

```shell-session:docker_composer_install
$sudo apt-get install libffi-dev libssl-dev
$sudo apt-get install -y python python-pip
$sudo pip install docker-compose
```
Lispの広い普及を願って

#はじめに
私はLispからは引退、老兵は去るべきと思っていました。カレンダーも満杯となっているのを見て安堵していました。しかし、なぜか1日分だけ未投稿のまま残ってしまっています。どうも放置できずにしゃしゃり出ることにしました。

#親しみやすいLispを目指して
![2019-12-29_9-03-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/48539573-50f2-999b-baf1-c9d50a53cfe3.png)

まつもとさんに悪気はないのでしょう。単なる例だと思います。しかし、Lispがマイナーな状況にあることは認めざるを得ません。多くの人に知ってもらい親しみを感じてもらうこと、そして若い新規ユーザー数が増加していく必要があるように思います。中学生、高校生くらいの人たちにLispの面白さを知ってもらうのが近道だろうと考えました。そしてラズパイに注目しています。安価ですのでお小遣いでも買うことができます。2016年から開発を継続しているEasy-ISLispはラズパイをメインと考えています。

#簡単なインストール
Easy-ISLispはOSSでありGitHubにて公開しています。先日、Reddit/LispにYoutube動画とともに紹介文を投稿してみました。動画はラズパイにインストールする様子を収録したものです。予想に反してけっこうなリプライがありました。面白がってもらえたようです。
https://www.youtube.com/watch?v=KfrRyKMcTw8
![2019-12-29_9-38-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/92a14420-dcb0-5f15-67bf-cfdcc53b6c7e.png)


#簡易なCUIエディタ
Easy－ISLispのLinux版にはCUIエディタが付属しています。多くのLispユーザーは開発環境としてEmacsを使っているものと思います。とても高機能であり投稿に返信をいただいた方もEmacsを愛する方のようです。しかし、一方でその方はCUIエディタが付属していることに興味をもってくれました。動画に対して下記のメッセージをいただきました。

```
This is very nice! I am impressed that you bothered to implement
your own editor and REPL with syntax highlighting.
```


中学生や高校生の人がLispに興味をもってくれたとして、動かすためにEmacsの詳細な設定をしていると、Lispを始めようとする熱が冷めてしまうように思います。CUIエディタはとても単純なもので何の設定もなしに呼び出せます。オートインデントやシンタックスハイライティング、カッコ対応表示など最低限のものは備えています。また、アドヴァイスを受けてEmacsキーバインディングも基本的なものは取り込んでいます。

#型推論による軽快なコンパイルコード
ラズパイは安価ですからCPUのパワーはデスクトップの1/10程度です。そのラズパイでも軽快に動作する必要があります。Easy-ISLispのコンパイラには型推論を搭載してあります。単純なものですと効率の良いCコードに変換、動的リンクが可能です。下記はラズパイで竹内関数、アッカーマン関数、フィボナッチ数を実行した様子です。

![2019-12-29_9-45-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/71c24053-aea4-df79-edb8-0c068bb85997.png)




#終わりに
Lispの世界は良くも悪くもマニアックなところがあります。その悪い部分が敷居を高くしてしまい、初心者の参入を阻んでいるような気もします。気楽に楽しめるLisp環境が必要だろうと思います。そんな思いでEasy-ISLispの開発を継続しています。ISLisp検証システムを全てパスしましたので、少なくともインタプリタの方は規格準拠といっていいだろうと思っています。


GitHubにて公開しています。
https://github.com/sasagawa888/eisl
Atomを起動するとA JavaScript error occured in the main processと出る

#問題
Windows10でatomが起動しない。

#エラー内容
```
A JavaScript error occured in the main process
Uncaught Exception:
Error: The specified module cannot be found.
\\?\C:\ProgramData\MyUserName\atom\app-1.35.1\resources\app.asar.unpacked\nod...\nslog.node
	at process.module.(anonymous function) [as dlopen] (ELECTRON_ASAR.js:166:20)
	at Object.Module._extensions..node (module.js:671:18)
	at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:180:18)
	at Module.load (module.js:561:32)
	at tryModuleLoad (module.js:504:12)
	at Function.Module._load (module.js:496:3)
	at Module.require (module.js:586:17)
	at require (internal/module.js:11:18)
	at Object.<anonymous>
(C:\ProgramData\MyUserName\atom\app-1.35.1\resources\app.asar\node_modules\nslog\lib\...:11)
	at Object.<anonymous>
(C:\ProgramData\MyUserName\atom\app-1.35.1\resources\app.asar\node_modules\nslog\lib\n...:4)
```

#解決
解決前
\atom\atom.exe
exeでatomを起動していた。

解決後
\atom\bin\atom.cmd
コマンドプロンプトからatomを起動したらうまくいった。

#原因
不明
今まではexeでファイルを起動できたのになぜできなくなったのか。

わからるかたは教えてください。
Analog Discovery 2 (AD2) > SPI取込み > 希望のものをとりこぼす > Mode:Recordにする (Samples:4096 -> 1M)

```txt:動作環境
Ubuntu 18.04 LTS
ボード: STM32L476 Nucleo_64 (以下、STM32L476)
ボード: STM32F769 Discovery Kit (以下、STM32F769)
Zephyr 2.1.0-rc1
microSDモジュール: CK-40 (サンハヤト)
ロジック確認: Analog Discovery 2 (AD2)
```

### 状況

- STM32L476のSPIロジックをキャプチャしようとしている
- 74クロックの後にCMD0などの送信がある
- うまくキャプチャできない
    - 希望のものがページ切替でとりこぼす

### 変更

- 変更前
    - Mode: Repeated
        - Samples:4096まで?
- 変更後
    - Mode: Record
        - Samples: 1M

### キャプチャできた

上記の設定により自分が希望するロジックのキャプチャができるようになった。
AD2はまだまだ使いこなせていない。

74クロック?
![Screenshot from 2019-12-29 09-43-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/77a7ca81-c17c-734c-1263-4ab4b1a11a3f.png)

CMD0?
![Screenshot from 2019-12-29 09-43-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/3842b1a8-c7ec-6a2d-ec61-8ed492399fdb.png)

CMD0の後のコマンド?
![Screenshot from 2019-12-29 09-43-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/e22eb932-05a3-a4b4-aa1c-f42f08df2586.png)


### 関連

- [Zephyr > STM32L476 > SPI2を使う > `<BOARD>.overlay`に記載追加してwest build](https://qiita.com/7of9/items/63c24b749dadbce0ef6b)
- [Zephyr > microSD (SPIモード接続) + FAT > STM32L476 > CMD0のパラメータが異なる (0x94と0x95)](https://qiita.com/7of9/items/5ae95f2cd1ef559bfb04)
Raspberry Pi 4 に Raspbian Buster の環境をつくる


*この記事は、[OpenChain Japan WG Advent Calendar 2019](https://qiita.com/advent-calendar/2019/openchainjapanswg) の [12/24公開記事](https://qiita.com/TakashiNinjouji/items/04316e62ab056bce1572)の番外編の第1部です*


#概要
Raspberry Pi 4 に 32GBの microSDHC を使って NOOBS Lite 経由で Raspbian Buster (September 2019)（以下Buster） が動作する環境を作る。

# 実施環境
* Raspberry Pi 4 Model B, 4GB (以下、"RPi4")
* microSDHC 32GB (Trabscend Premium 400x, TS32GUSDCU1, UHS-I, CLASS 10. 以下、"microSD")
* microSDXC対応 USB接続 カードリーダー (Transcend. 以下、"カードリーダー")
* iMac (Late 2009, macOS High Sierra (10.13.6). 以下、"Mac") 
* [NOOBS lite] (https://www.raspberrypi.org/downloads/noobs/) (v3.2)
* [SD Card Formatter 4.0](https://www.sdcard.org/downloads/formatter_4/) (SD Association が提供している)
* Mac 側には、maｃOS 用の RealVNC VNC Viewer を導入済み
* RPi4 は、 USB で キーボード と マウス、HDMI でディスプレイ（というかリビングのTV）、有線で LAN に接続。用途に応じてメモリーカードの選定に留意することもあるだろうが、今回は動作検証なので microSD は手元にあったものを流用。


# 手順


## microSD の下準備
Mac に カードリーダーを使って microSD を接続し、 SD Card Formatter で フォーマットして、正常に動作するか確認してみた。参考までに容量が 64GB 以上のカードを exFAT でフォーマットすると NOOBS Lite を使うには不適なので注意。

## SDHC を FAT32 でフォーマット
ディスクユーティリティ.app で パーティション作成に MS-DOS 形式を選ぶと、FAT32 でフォーマットできる。
/* 以下は macos Sierra の時のメモ：
microSD の動作を確認できたら、Terminal で diskutil コマンドを使って FAT32 でフォーマットすることもできる。microSDXC など 64GB の時はこの方法を使うことになるだろう。次は microSD の device disk が /dev/disk1 として認識されているのを確認し、それに対して操作した場合の例。コマンドの 'MISC' は \<volume name\> なので、識別できるように適当に決めてよい。

```shell-session:dislutil
$ diskutil list
$ diskutil partitionDisk /dev/disk1 1 MBRFormat "MS-DOS FAT32" MISC 100%
```
ここまで */

## NOOBS Lite メディアの作成
NOOBS Lite の zip アーカイブを展開し、その中身を microSD にコピーする。

## NOOBS Lite から Buster をインストール
* microSD を RPi4 に接続し、RPi4 を起動する。メニューから Raspbian を選択してインストール。

* 再起動時に、ディスプレイ(TV) に何も映らない場合は、microSD へのアクセスランプが灯っていない時間が十分に継続したことを確認してから、電源を抜いて、microSD の /boot/config.txt を編集する。その後、起動させてみる。ちなみに、primary の HDMI コネクタは電源コネクタの隣である。

```shell-session:/boot/config.txt
hdmi_safe=1
```


* 起動後は、IP アドレスを固定にする。

```shell-session:/etc/dhcpcd.conf
interface eth0
static ip_address=192.168.x.y/24
static routers=192.168.x.z
static domain_name_servers=192.168.x.1
```

* SSH と VNC とを有効にする。

```shell-session:raspi-config
$ sudo raspi-config
```

* "sudo reboot" で再起動して、先に設定した IP アドレス宛に SSH と VNC のそれぞれでログイン出来たら、ひとまず準備は整ったことになる。これで、リビングの TV を解放して、家族に気兼ねすることなく、母艦(Mac)から作業できる...

# おまけ
Raspberry Pi Foundation のサイトにある documentation の "[CONFIG-TXT](https://www.raspberrypi.org/documentation/configuration/config-txt/)"
 ページに、起動時設定ファイルのパラメータの説明があるので、読んでおくと吉だと思う。
ITILファンデーションを受けてみた

# はじめに

ITILファンデーションを目指して勉強したメモです。
勉強期間は1週間、勉強時間は5,6時間程度で32/40の正答率で合格しました。

# 概要

ITILとはITサービスの運用管理のベストプラクティスをまとめたものです。ITILファンデーションはITILの知識を試す資格試験のエントリーレベルとなっています。    
2019年現在、最新のITILのバージョンは4ですが、試験はシラバス2011が対象となっています。


## サービスライフサイクル

ITILでの大カテゴリ。
サービスをライフサイクルでマネジメントする。

- サービスストラテジ
- サービスデザイン
- サービストランジション
- サービスオペレーション
- 継続的サービス改善

# サービスストラテジ

## 構成要素

- ITサービス財務管理プロセス
- 需要管理プロセス
- サービス・ポートフォリオ管理プロセス
- 事業関係管理プロセス

## キーワード

- ビジネス・ケース
  - 支出の説明となる情報
- サービス・ポートフォリオ
    - サービス・パイプライン
    - サービス・カタログ
    - 廃止済みサービス
- PBA
    - Pattern of Business Activity
    - 事業活動パターン
- TCU
- BRM

# サービスデザイン

## 構成要素

- デザイン・コーディネーション
- サービス・カタログ管理
- サービスレベル管理
- キャパシティ管理
- 可用性管理
- ITサービス継続性管理
- 情報セキュリティ管理
- サプライヤ管理

## キーワード

- SLA
    - Service Level Agreement
- OLA
  - Operational Level Agreement
- UC
  - Underpinning Contract
  - 外部サプライヤとの間の契約
- SIP
  - Service Improvement Plan
- BCP
  - Business Continuity Plan
  - 事業継続性計画
- RA
  - Risk Analysis
  - リスク分析
- 4P
  - People
  - Product
  - Partner
  - Process
- 5つの側面
  - サービス・ソリューション
  - サービス・ポートフォリオ
  - 技術・管理アーキテクチャ
  - プロセス
 - 測定方法・基準
- デザイン・コーディネーション
  - デザインの調整
- サービス・カタログ管理
  - サービス・カタログを正確・最新にメンテナンスする

# サービストランジション

## 構成要素

- 以降の計画立案およびサポート
- リリース管理および展開管理
- サービスの妥当性確認及びテスト
- 変更評価
- 変更管理
- サービス資産管理および構成管理
- ナレッジ管理

## キーワード

- CAB
  - Change Advisory Board
  - 変更諮問委員会
- CMS
  - Configuration Management System
  - 構成管理システム
- DIKW
  - Data:整理されていない事実の集まり
  - Infomation:データを整理したもの
  - Knowledge:分析した傾向
  - Wisdom:活用し、意思決定する能力
- RFC
  - Request For Change
- 変更要求
- 標準的な変更
- 緊急の変更
- 通常の変更
- 変更管理の7R
  - Raised
  - Reason
  - Return
  - Risk
  - Resource
  - Responsible
  - Relationship
- SKMS
  - サービス・ナレッジ管理システム
  - CMSだけでなく、様々な項目を管理
  

# サービスオペレーション

## 構成要素

- イベント管理
- インシデント管理
- 問題管理
- 要求実現
- アクセス管理
- サービスデスク
- IT運用管理
- 技術管理
- アプリケーション管理

## キーワード
- ワークアラウンド
  - まだ完全な解決策が存在しないインシデントや問題のインパクトを低減、排除する。
- イベント
  - 情報
  - 警告
  - 例外
- エスカレーション
  - 機能的エスカレーション
  - 階層的エスカレーション


# 継続的サービス改善

## キーワード

- デミング・サイクル
  - Plan
  - Do
  - Check
  - Action
- 測定基準
  - 技術測定基準
  - プロセス測定基準
  - サービス測定基準
- SMART
  - Specific:具体的な
  - Measurable:測定可能な
  - Achievable:達成可能な
  - Relevant:適切な
  - Time-bound:今取り組むべきな
- CSI管理表
  - 改善の機会を記録、管理するデータベース
  - SKMSの一部



# おわりに

ファンデーションレベルだと用語の理解（言葉遊び）で終わってしまっているようにも思いました。
現在、試験価格が高騰しているのもマイナス要素です。
Jupyter NotebookのフォントをCSSからカスタマイズする

# はじめに
Windows 環境ではデフォルトでコードのフォントがMSゴシックになるのが嫌だったので変えてみたメモ。

# 方法

```
C:\Users\ユーザー名\.jupyter\custom
```
の中にある `custom.css` ファイルの中身を書き換えて、`font-family` を指定するだけ。
以下は例。

```css
/* 左の In [1]: とかの部分 */
.prompt {
    font-family: "Ricty Diminished";
}
/* コードの入力エリア */
.CodeMirror {
    font-family: "Ricty Diminished";
}
/* 結果の出力エリア */
code, kbd, pre, samp {
    font-family: "Ricty Diminished";
}
```
ここではフォントを Ricty Diminished にしているが、使うには別途 Windows にインストールが必要。
クラス名は、Jupyter Notebook をブラウザで開き開発ツールを表示（ `Ctrl + Shift + i` ）させて愚直に探しただけなので、他のエリアのフォントを変えるときは同じように探せばいいと思う。
#Rails + MySQL で timestamps のマイグレーションを忘れていたので後から created_at / updated_at  カラムを追加する

# points

- null を許可してカラムを追加する。
- 全てのレコードに値を入れる。
- null を不許可に変える。

# warning 

カラム1個を追加する場合は timestams でもなく timestamp でもなくて datetime を指定することに注意。

( あなたの Rails の t.timestamps は datetime 型のカラムを MySQL に追加しているか？ 環境によるかもしれない。確認してほしい )


# migration

```rb
class AddCreatedAtToUser < ActiveRecord::Migration[5.2]
  def up
    add_column :users, :created_at, :datetime, null: true

    User.update_all(created_at: Time.current)

    change_column :users, :created_at, :datetime, null: false
  end

  def down
    remove_column :users, :created_at
  end
end
```

既存レコードを作った上で

```rb
bundle exec rails db:migrate
bundle exec rails db:rollback
```

などを実行して試してみよう。

#  null を許可せずにカラム追加した場合

null を許可しない場合、既存レコードがあるとエラーでmigrationがキャンセルされてしまう。

```rb
class AddCreatedAtToUser < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :created_at, :datetime, null: false
  end
end
```

```
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Incorrect datetime value: '0000-00-00 00:00:00' for column 'created_at' at row 1: ALTER TABLE `users` ADD `created_at` datetime NOT NULL

...

Caused by:
ActiveRecord::StatementInvalid: Mysql2::Error: Incorrect datetime value: '0000-00-00 00:00:00' for column 'created_at' at row 1: ALTER TABLE `users` ADD `created_at` datetime NOT NULL
```

# デフォルトを指定した場合

```rb
class AddCreatedAtToUser < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :created_at, :datetime, null: false, default: -> { 'NOW()' }
  end
end
```

migrationは出来るがカラムに default値が設定されてしまい、 テーブル作成時に t.timestamps を指定した状態とは違ってしまう。

```
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
```

# デフォルト値を指定し、後から削除しようとした場合

サーバー設定のせいかうまく行かなかった。

```rb
class AddCreatedAtToUser < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :created_at, :datetime, null: false, default: -> { 'NOW()' }
    change_column :users, :created_at, :datetime, null: false, default: ''
  end
end
```

```
rails aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Invalid default value for 'created_at': ALTER TABLE `users` CHANGE `created_at` `created_at` datetime DEFAULT NULL NOT NULL
...

Caused by:
ActiveRecord::StatementInvalid: Mysql2::Error: Invalid default value for 'created_at': ALTER TABLE `users` CHANGE `created_at` `created_at` datetime DEFAULT NULL NOT NULL
```


Ref

mysqlにカラムを追加しようとしたらInvalid default value for エラー - Qiita
https://qiita.com/rh_/items/be798e69a8f9000c56b1

Setting MySQL DATETIME column defaults in Rails
https://www.mikeperham.com/2014/05/17/setting-mysql-datetime-column-defaults-in-rails/

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2883








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
はがきデザインキットの「Adobe AIR.framework は壊れているため開けません」を修復して使う

１年ぶりに「はがきデザインキット」を起動しようとすると数々の障害がありました。年末に慌てて起動したらエラーがおきて困っている方（自分）のためにメモを公開しておきます。

Adobe Airで同様のエラーが出る場合にも対応できるかと思います。

# 環境

- macOS Catalina (10.15.2)
- はがきデザインキット2020

# はがきデザインキット

https://yu-bin.jp/create/design_kit/install/

## Adobe Airのインストール

SafariでFlashプラグインが取り除かれ、いろいろパーミッションが増えた関係上、ブラウザーから「いますぐダウンロード」でインストールをしようと思ってもうまくいきません。Flashダウンロード、Safari機能拡張のパーミッション、安全なソフトとして実行等いろいろ変更してみたのですが、自分の環境ではうまくダウンロードできませんでした。

そこで、別の方法（個別ダウンロード）で行います。

「 はがきデザインキット2020 ＞ インストール版 ＞ 別の方法でのインストール」
https://yu-bin.jp/create/design_kit/install/another.html

Adobe AIRラインタイムをダウンロードし、インストールします。

「はがきデザインキット」をダウンロードすると、design_kit.airファイルがダウンロードされます。これをクリックすると動く...はずなのですが動きません。

## Adobe AIR.framework は壊れているため開けません

.airファイルを実行しようとすると「Adobe AIR.framework は壊れているため開けません」と出て実行できません。

<img width="532" alt="スクリーンショット 2019-12-29 8.56.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/3f64e5dd-25a7-372f-3c93-235dddb6d856.png">

これまでか...と思われたのですが、以下のコマンドを実行後に使うことがでるようになりました。

```
cd /Library/Frameworks
sudo xattr -r -d com.apple.quarantine ./Adobe\ AIR.framework
```

拡張属性「quarantine」の削除です。ダウンロード後、セキュリティで「隔離」された状態なので「許可」してやる必要があるのですが、frameworkのためか解除ダイアログが出てこずコマンドライン以外からではこの属性をはずすことができないようです。

# ぶつぶつ

解消する方法は作った後に発見したため、今年は[ラベル屋さん](https://www.labelyasan.com) を使いました。こちらはElectronベースのソフトになっているようです。年賀状面を作るにはテンプレートや画像が少ないのが欠点ですが、普通に画像取り込みに対応しています。Adobe AIRやFlashを宗教的に入れたくない方はこちらも選択肢かと思います。

<img width="1043" alt="スクリーンショット 2019-12-29 10.44.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/1a06e4ba-3314-7007-1ca9-45271c825d99.png">

最近はセキュリティの関係もありますが、OSなど基盤部分のバージョンアップが頻繁にあるため継続的に対応できるような開発体制をとっておかないと、ソフトがどんどん時代遅れになってしまいますね。

# 参考

Adobe Air error message - macOSX Catalina
https://community.adobe.com/t5/air/adobe-air-error-message-macosx-catalina/m-p/10683302?profile.language=ja
JS_JavaScript_現在の日付を取得するブックマークレット(現在日付をYYYY/MM/DD形式の文字列で取得する)

卒業研究の中間報告書が提出できてホッとしたので,Qiita記事書いて行こうと思います.

latexで@ miscを書く際に閲覧日を示す必要があります.
そこで,日付を取得するブックマークレットが欲しいなと思いました.

jsで現在の日付を取得するブックマークレットを作りました.

```js
javascript:function getNowYMD(){
  var dt = new Date();
  var y = dt.getFullYear();
  var m = ('00' + (dt.getMonth()+1)).slice(-2);
  var d = ('00' + dt.getDate()).slice(-2);
  var result = y + "/" + m + "/" + d;
  prompt('getNowYMD',result);
};getNowYMD();
```

奥村さんの[［改訂第7版］LaTeX2ε美文書作成入門 | 奥村晴彦, 黒木裕介 | 工学 | Kindleストア | Amazon]
(https://www.amazon.co.jp/dp/B01NAW5V3E/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
では,日付の形式がDD/MM/YYYYだった気がしますが,原本を研究室に置き忘れたので後で確認します.

ブックマークレットはコピペしやすいようにalertではなくpromptにしました.

参考
[[JavaScript] 現在日付をYYYY/MM/DD形式の文字列で取得する | コピペで使える JavaScript逆引きリファレンス]
(https://javascript.programmer-reference.com/js-date-format-yyyymmdd/)
>
```js
function getNowYMD(){
  var dt = new Date();
  var y = dt.getFullYear();
  var m = ("00" + (dt.getMonth()+1)).slice(-2);
  var d = ("00" + dt.getDate()).slice(-2);
  var result = y + "/" + m + "/" + d;
  return result;
}
```

[LaTeXでbibtexを使う方法 - Qiita]
(https://qiita.com/ta_b0_/items/69a5e72baacaf08ba79e)
>
```
@misc{webpage_label,
    Author = "Qiita",
    Title = "{LaTeXでbibtexを使う方法}",
    note = "\url{https://www.qiita.com} (参照 2019-01-01)"
}
```

次は締切日から現在の日付の差分を取るブックマークレットでも作ろうかしら…
#Rails migration singlar "timestamp" method without args do nothing. maybe is it a plural "timestamps" method? ( created_at / updated_at not created why ))

x `timestamp`
o `timestamps` 

```rb
class CreateUser < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :name, null: true

     # binding.pry
      t.timestamp
    end
  end
end
```

```rb
t.class
# => ActiveRecord::ConnectionAdapters::MySQL::TableDefinition
```

```rb
t.timestamp
=> []
```

pry doc 

```rb
[4] pry(#<CreateUser>)> $ t.timestamp

From: /usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/schema_definitions.rb @ line 231:
Owner: ActiveRecord::ConnectionAdapters::ColumnMethods
Visibility: public
Number of lines: 3

def #{column_type}(*args, **options)
  args.each { |name| column(name, :#{column_type}, options) }
end
```

```rb
[4] pry(#<CreateUser>)> $ t.timestamps

From: /usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/schema_definitions.rb @ line 395:
Owner: ActiveRecord::ConnectionAdapters::TableDefinition
Visibility: public
Number of lines: 6

def timestamps(**options)
  options[:null] = false if options[:null].nil?

  column(:created_at, :datetime, options)
  column(:updated_at, :datetime, options)
end
```

correct use case singular "timestamp"

```
t.timestamp :occured_at
```

ah please raise error Rails without args "timestamp" 

Oh Mr Rails ...

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2882








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Zephyr > STM32L476 > SPI2を使う > `<BOARD>.overlay`に記載追加してwest build

```txt:動作環境
Ubuntu 18.04 LTS
ボード: STM32L476 Nucleo_64 (以下、STM32L476)
ボード: STM32F769 Discovery Kit (以下、STM32F769)
Zephyr 2.1.0-rc1
```

### 前回

- [Zephyr > west build時 > STM32F769:SPI2で成功, STM32L476:SPI2で失敗 > device treeファイルの定義に違いがある](https://qiita.com/7of9/items/80b8b56a84ffc76c9ee0)

STM32L476でSPI2の使用に失敗していた。

### フォーラムでの質問と回答

公式フォーラムに質問して回答をすぐに得ることが出来た。
感謝。

- [SPI2 definition is not found for STM32L476 device tree. How to add?](https://lists.zephyrproject.org/g/users/topic/spi2_definition_is_not_found/69284710?p=,,,20,0,0,0::recentpostdate%2Fsticky,,,20,2,0,69284710)

overlayファイルに&spi2の記述を足せば良いとのこと。


### オーバレイファイル

spi2の記載を足して、SDHC関連の記載もそこに追加した。

```nucleo_l476rg.overlay
/*
2019-12-28 yasokada
	- modified for STM32L476 SPI2 
2019-12-15 yasokada
branched from [nrf52840_blip.overlay]
*/

/*
 * Copyright (c) 2019 Tavish Naruka <tavishnaruka@gmail.com>
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/*
&spi1 {
        status = "okay";
        cs-gpios = <&gpioc 7 0>;
        sdhc0: sdhc@0 {
                compatible = "zephyr,mmc-spi-slot";
                reg = <0>;
                status = "okay";
                label = "SDHC0";
                spi-max-frequency = <24000000>;
        };
};
*/

&spi2 {
	    status = "okay";	    
        cs-gpios = <&gpiob 12 0>;
        sdhc0: sdhc@0 {
                compatible = "zephyr,mmc-spi-slot";
                reg = <0>;
                status = "okay";
                label = "SDHC0";
                spi-max-frequency = <24000000>;
        };
};
```


### SPI2接続

- [ST Nucleo L476RG @ 公式ドキュメント](https://docs.zephyrproject.org/latest/boards/arm/nucleo_l476rg/doc/index.html)

接続は以下のようにした。

- microSD <-> STM32L476, ケーブル色
    - DAT0/DO ----------- (PB14) CN10:28, 青
    - VSS --------------- GND CN5:7, 緑
    - CLK --------------- (PB13) CN10:30, 黄
    - VDD --------------- 3V3 CN6:4, 赤
    - CMD/DI ------------ (PB15) CN10:26, 赤
    - CS ---- 4.7k ------ (PB12) CN10:16, 白

4.7k: VDDに接続してプルアップとしている。


### ビルドと実行

```
$ west build -p auto -b nucleo_l476rg samples/subsys/fs/fat_fs/
```

```
$ west flash
$ west flash
```

west flashは一回目に失敗する場合があり、二回すると成功する。
USB接続直後などに起きやすい気はする。

```
$ west debug
...
(gdb) break main.c:69
c
69		if (res == FR_OK) {
(gdb) p res
$1 = 0
```

resが0となり、67行目の`	int res = fs_mount(&mp);`が成功していることが分かる。
vimでemmet-vimを使うための設定

## はじめに
普段はVSCodeを使っていますが、ちょっとしたコードを書くときやメモを書くときにVimを使っています。その際にemmetが使えないと速度も落ちるので今回この記事をメモ代わりに書きました。

## vimでemmetを使うためにすること

### .vimrcでの設定
.vimrcを開き下記を記述

```
(略)

NeoBundle 'mattn/emmet-vim'
let g:user_emmet_leader_key = '<C-f>'

(略)
```

上記の記述ではNeoBundleというプラグインを使ってemmet-vimを使えるようにしています。
emmet-vimは通常「Control+y+,」でemmetを使えますが、自分が使いやすいように「Control+f+,」にしています。

### 上記を反映

上記の記述後
コマンドラインモードでNeoBundleのインストールを行います

```
:NeoBundleInstall
```

これでemmetをvim上で使えるようになります。
#Rails のマイグレーションで timestamp を指定しているのに created_at / updated_at が生成されないのだが？ それ複数形の timestamps の間違えじゃない？

`timestamp`

単数形で書いてた。何これっていう。こう書くと何も起こらない模様。

`timestamps` が正しい。

```rb
class CreateUser < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :name, null: true

     # binding.pry
      t.timestamp
    end
  end
end
```

t は MYSQL のテーブル定義クラスだ

```rb
t.class
# => ActiveRecord::ConnectionAdapters::MySQL::TableDefinition
```

中身は空の配列だ

```rb
t.timestamp
=> []
```

pry doc で違いを確認

```rb
[4] pry(#<CreateUser>)> $ t.timestamp

From: /usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/schema_definitions.rb @ line 231:
Owner: ActiveRecord::ConnectionAdapters::ColumnMethods
Visibility: public
Number of lines: 3

def #{column_type}(*args, **options)
  args.each { |name| column(name, :#{column_type}, options) }
end
```

```rb
[4] pry(#<CreateUser>)> $ t.timestamps

From: /usr/local/bundle/gems/activerecord-5.2.3/lib/active_record/connection_adapters/abstract/schema_definitions.rb @ line 395:
Owner: ActiveRecord::ConnectionAdapters::TableDefinition
Visibility: public
Number of lines: 6

def timestamps(**options)
  options[:null] = false if options[:null].nil?

  column(:created_at, :datetime, options)
  column(:updated_at, :datetime, options)
end
```

`t.string` `t.datetime` などと同じで、カラム名を指定して扱うものだと後から気づいた。

```
t.timestamp :occured_at
```

名前を渡さなかったらエラーにしてくれよっていう...Railsさん。


 # datetime VS timestamp

- t.timestamps は datetime型でカラムを作る
- t.timestamp は timestamp型でカラムを作る
- t.datetime は datetime型でカラムを作る

後から気づいたが、こんな分かりにくい状況になっているようだ。
Rails version と DB Adapter ( MySQLなど ) の組み合わせによるだろうが。

MySQLのDATETIME型とTIMESTAMP型の違いを検証してみた - Qiita
https://qiita.com/ykawakami/items/2449a24e3b82ff0cbab6

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2881








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
make コマンドから docker コンテナ上の MySQL にログインする

## 背景

makeコマンドからdockerコンテナ上のMySQLに接続したかったのですが、固定文字列ではなくサーバー環境変数を使いたかったのでやり方を調べてみました。

## 環境

- MySQL 8.0.17

## docker-compose.yml

dbコンテナを用意します。

```yaml:docker-compose.yml
version: "3"
services:
  db:
    image: mysql:8.0
    environment:
      - MYSQL_DATABASE=homestead
      - MYSQL_USER=homestead
      - MYSQL_PASSWORD=secret
      - MYSQL_ROOT_PASSWORD=secret
      - TZ=Asia/Tokyo
```

dbコンテナをビルドして起動します。

```shell-session
$ docker-compose up -d --build
```

## Makefile

```makefile:Makefile
mysql:
	docker-compose exec db bash -c 'mysql -u $$MYSQL_USER -p$$MYSQL_PASSWORD $$MYSQL_DATABASE'
```

- bash の `-c` オプションで文字列としてコンテナに渡してコマンドを実行できます。
- `$$` 続けるとエスケープされてサーバー環境変数を文字列として渡せる。

```shell-session
$ make mysql
docker-compose exec db bash -c 'mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.17 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

## 参考

- [Makefile ことはじめ](https://qiita.com/kasei-san/items/ad25df63260e86c5cc71)
- [bash - コマンド (プログラム) の説明 - Linux コマンド集 一覧表](https://kazmax.zpp.jp/cmd/b/bash.1.html)
- [How do I properly escape data for a Makefile?](https://stackoverflow.com/questions/7654386/how-do-i-properly-escape-data-for-a-makefile)
Simulink API (2) 基本コマンド

# Simulink API を使い倒すための基本API

「[Simulink API (1) find_system 第1回](https://qiita.com/stozaki/items/55d941a2017f3267309f)」にて、モデル内の特定のブロック種別をリストする方法をご紹介しましたが、
もう少し基礎の話をします。

|       関数名       |   意味    |    取得対象    |
|:--------------------:|:------------------:|:------------------:|
| gcs              |  get current system |        現在のシステムパス名|
| gcb              |  get current block |       現在のブロック名|
| gcbh             |  get current block handle |        現在のブロックハンドル|
| gcbp             |  get current block path     | 現在のブロックパスオブジェクト(R2019a以降で使用可能)|
| gsl              |  get selected line |       現在のラインハンドル|
| sfgco            |  Steteflow get current object |      現在のSteteflowオブジェクト|]
| sfroot           |  Steteflow root |      Steteflow階層の最上位オブジェクトのハンドル|
| bdroot           |  block diagram root|      現在のシステムの最上位モデル|

使用例
![part2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324583/07f88674-62f1-d692-6d62-f5bdec8431af.png)
Simulink API (1) find_system

#Simulink API (1) find_system 第1回

**Simulink APIを基本から少しずつまとめていきます。**

"BlockType"でモデル内の特定のブロック種別をリストする : find_system()

![part1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324583/6e388ad8-70f2-3c92-70a9-b93acaeb7749.png)


```matlab:qiita.matlab
lst = find_system('myModel','BlockType','Constant')

lst =
  3×1 の cell 配列
    {'myModel/C1'}
    {'myModel/C2'}
    {'myModel/C3'}
```
こたつでもデスクトップPCを操作する方法

# はじめに
最近、デスクトップPCを使う機会が非常に少なく感じている。
触るための場所が限定されてしまうからではと考え、家の中のどこでも（こたつとかでも！）扱えたらなと思っており、その方法を模索した。

```plaintext:動作環境
desktop-PC
・ Ubuntu18.04LTS
laptop-PC
・ MacOSX Catalina
```

```plaintext:＜手段＞
1. SSH (Secure Shell)する
2. VNC (Virtual Network Computing)する
```

# 1. SSHする
最も簡単な方法である。ターミナルだけつなぐため、軽量である。何をするかにもよるが、コマンドの実行等であればSSHが一番おすすめである。
普段からtmux&vimを使っている私にとっては、コーディングもこれで十分である。

```plaintext:＜手順＞
1. デスクトップPCで`$ sudo apt install openssh-server`
2. macで`$ ssh <username>@<machine-name>.local`を実行
```

# 2. VNCする
画面ごとつなげることができる。画面そのものを遠隔操作するため、動作は少しモタつく。(ネットワーク環境にもよる？）
GUIアプリも使うことができるので、状況によっては重宝する。macだとVNCクライアントはインストール無しでSafari上で起動できるとのことなので、便利である。

```plaintext:＜手順＞
1. デスクトップPCで`$ sudo apt install x11vnc`
2. デスクトップPCで`$ x11vnc -storepasswd`
3. デスクトップPCで`$ x11vnc -usepw`
4. macのsafariのURL欄に`vnc://<username>@<machine-name>.local`と入力して実行
5. 先ほど設定したパスワードを入力
```

# 参考
- https://thishosting.rocks/how-to-enable-ssh-on-ubuntu/
    - SSHサーバのインストール
- https://www.youtube.com/watch?v=r-lQ1VjY02s
    - VNCのセットアップ

# おわりに
今回は簡単にできる方法を探してみました。ほかにも良い方法があれば教えてもらえると幸いです。
blueqat で量子位相推定

## この記事に関して
ここではpythonライブラリのblueqatを用いて量子プログラミングを行っていこうと思います。
内容は[公式のチュートリアル](https://github.com/Blueqat/Blueqat-tutorials/tree/master/tutorial-ja)を元に作成しています。
今回は量子位相推定(Quantum phase estimation)を実装していきます。

## 量子位相推定
詳しい理論は[ここ](https://qiita.com/KeiichiroHiga/items/acee41426809f3ad1257)に述べています。

ユニタリ行列の固有値を求めるアルゴリズムです。
ユニタリ行列を $U$ 固有ベクトルを $\left|u\right>$ とおくと、

``` math
U\left|u\right> = e^{2\pi i0.j_1\cdots j_n}\left|u\right> \\
\left(0.j_1\cdots j_n = \frac{j_1}{2^1} + \cdots + \frac{j_n}{2^n}\right)
```
となります。

ここで以下の状態を考えると逆量子フーリエ変換で $j_1\cdots j_n$ を求めることができます。
量子フーリエ変換については[ここ](https://qiita.com/KeiichiroHiga/items/7fae38f8c2004dfcd246)に述べています。

``` math
\frac{1}{\sqrt2}\left(\left|0\right> + e^{2\pi i0.j_1\cdots j_n}\left|1\right>\right)\otimes \frac{1}{\sqrt2}\left(\left|0\right> + e^{2\pi i0.j_2\cdots j_n}\left|1\right>\right)\otimes \cdots\otimes \frac{1}{\sqrt2}\left(\left|0\right> + e^{2\pi i0.j_n}\left|1\right>\right)  \xrightarrow{QFT^{-1}} j \\
(j = j_1\cdots j_n)
```
j は２進数表示です。

### 回路の作成
以下のような回路で実装できます。

``` math
\begin{array}{cc}
\left|0\right>&-&H&-&*&-&\cdots&-&-&-&|&&|&-&←j_1 \\
\left|0\right>&-&H&-&|&*&\cdots&-&-&-&|&&|&-&←j_2 \\
\vdots&&\vdots&&\vdots&\vdots&&&&&\vdots&\Large{QFT^{-1}}&|&\vdots&\vdots \\
\left|0\right>&-&H&-&|&|&\cdots&*&-&-&|&&|&-&←j_{n-1} \\
\left|0\right>&-&H&-&|&|&\cdots&|&*&-&|&&|&-&←j_n \\
&&&&|&|&&|&|\\
\left|u\right>&-&-&-&U&U^2&\cdots&U^{2^{n-2}}&U^{2^{n-1}}&-&-&-&-&- \\
\end{array}
```

#### 実装
今回は $U = U_1(\lambda)$ を考えます。

固有値は $1, e^{i\lambda}$ となり、今回は $e^{i\lambda}$ を求めようと思います。
このとき固有ベクトルは ${}^t(0,1)$ なので、$\left|u\right>$ は

``` math
\left|u\right> = \left(\begin{array}{c}0\\1\end{array}\right) = \left|1\right> = X\left|0\right>
```
と Xゲートで作れます。

$\lambda = \pi/4$ を考えます。
$\pi/4 = 2\pi 0.001$ より 3量子ビット使います。

今回の回路は以下のようになります。

``` math
\begin{array}{cc}
\left|0\right>&-&H&-&*&-&-&-&-&-&-&R_3^{\dagger}&R_2^{\dagger}&H&-&←j_1 \\
\left|0\right>&-&H&-&|&*&-&-&-&R_2^{\dagger}&H&|&*&-&-&←j_2 \\
\left|0\right>&-&H&-&|&|&*&-&H&*&-&*&-&-&-&←j_3 \\
&&&&|&|&|&\\
\left|1\right>&-&-&-&U&U^2&U^4&-&-&-&-&-&-&-&- \\
\end{array}
```
後半は QFT^-1 となります。
$R_n^{\dagger}$ については

``` math
R_n^{\dagger} = \left(\begin{array}{cc} 1&0\\ 0&e^{-\frac{2\pi i}{2^n}}\end{array}\right)
```
となります。

これを実装します。

``` python:sample.ipynb
from blueqat import Circuit
import math

# 前半の回路の作成
c = Circuit().h[0,1,2].x[3] # 重ね合わせ & u の作成
c.cu1(math.pi/4)[0,3] # U^1
c.cu1(math.pi/4)[1,3].cu1(math.pi/4)[1,3] # U^2
c.cu1(math.pi/4)[2,3].cu1(math.pi/4)[2,3].cu1(math.pi/4)[2,3].cu1(math.pi/4)[2,3] # U^4

# QFT^-1
qft_inverse = Circuit().h[2]
qft_inverse.cu1(-math.pi/2)[2,1].h[1]
qft_inverse.cu1(-math.pi/4)[2,0].cu1(-math.pi/2)[1,0].h[0]

# 回路の結合
c = c+qft_inverse

# 観測
c.m[:].run(shots=1000)

結果
Counter({'0011': 1000})
```
0011 が取れたので $j_1 = 0,\ j_2 = 0,\ j_3 = 1$ から 0.001 が求められました。

## まとめ
今回はblueqatを用いて量子位相推定を実装しました。
次回はVQEをblueqatで実装してみます。
numpy-sigmoid学習

#numpy-sigmoid学習
自己学習の備忘。
numpy-sigmoidを理解するために図と学習用コードを並べる
![ニューラルネットワークの全体像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357717/eaa7b66d-07f4-9f49-36d1-e605fb42a3c1.jpeg)

**活性化関数にシグモイド関数を使った場合に以下のようになる**

```python:python

import numpy as np


# シグモイド関数の定義
def sigmoid(a):
    return 1 / (1 + np.exp(-a))


# 一層目
x1 = np.array([[1], [2]])
w1 = np.array([[0.4, 0.3], [0.7, 0.6]])
a1 = w1.dot(x1)

# 二層目
x2 = sigmoid(a1)
w2 = np.array([[0.2, 0.3], [1, 0.7]])
a2 = w2.dot(x2)

# 出力値と正解値
y = sigmoid(a2)
t = np.array([[1], [0]])
print(y)

# 入力値、パラメーター、合算値を配列化
X = [x1, x2]
A = [a1, a2]
W = [w1, w2]

# パラメーターが何層あるかのサイズの取得
max_layer = len(X)


# 活性化関数の微分
def f(a):
    return (1 - sigmoid(a)) * sigmoid(a)


# 更新式の公式gの実装
def g(l, j):
    if max_layer == l:
        return (y[j] - t[j]) * f(A[l - 1][j])
    else:
        output = 0
        m = A[l - 1].shape[0]
        for i in range(m):
            output += g(l + 1, i) * W[l][j, i] * f(A[l - 1][j])
        return output


# パラメーターwによる誤差関数の微分
def diff(j, k, l):
    return g(l, j) * X[l - 1][k]


# パラメーターを100回学習
for _ in range(100):
    for l in range(len(X)):
        for j in range(W[l].shape[0]):
            for k in range(W[l].shape[1]):
                W[l][j, k] = W[l][j, k] - diff(j, k, l + 1)
    A[0] = W[0].dot(X[0])
    X[1] = sigmoid(A[0])
    A[1] = W[1].dot(X[1])
    y = sigmoid(A[1])

print(y)
```
[[0.60041131]
 [0.79248709]]
[[0.91175343]
 [0.08878309]]

shapeを調べた件

```python:python
#range.shapeを理解する　shapeは行と桁を返すようだ
import numpy as np
a = np.array([[1,2,3],[4,5,6],[4,5,6],[4,5,6]])
a.shape
```
(4, 3)

要するに配列の大きさです。この結果は4*3（4行3列）の配列であることを表します。
a.shape[0]はこの例なら4になります。a.shape[1]なら3
Pythonでbit全探索

## bit全探索　とは　2^n通りの全探索

例題　[ARC061](https://atcoder.jp/contests/arc061/tasks/arc061_a)：たくさんの数式

>1 以上 9 以下の数字のみからなる文字列 S が与えられます。 この文字列の中で、あなたはこれら文字と文字の間のうち、いくつかの場所に + を入れることができます。 一つも入れなくてもかまいません。 ただし、+ が連続してはいけません。このようにして出来る全ての文字列を数式とみなし、和を計算することができます。ありうる全ての数式の値を計算し、その合計を出力してください。
>制約
・ 1≤|S|≤10
・ S に含まれる文字は全て 1 〜 9 の数字

入力出力例

```
[in]  125
[out] 176
#  125、1+25、12+5、1+2+5 の４パターンが考えられる。
```

## 考え方
125だったら"+"を入れられる場所は2箇所(1 {a} 2 {b} 5)ですので2^2=4通りの数式が考えられるわけです。abそれそれ"+"を入れるか入れないかの二択が二回。
そしてbitというくらいですのでbitが立っている箇所を探します。イメージとしては以下のような感じ。


|index|a|b|
|---|---|---|
|0|0|0|
|1|0|1|
|2|1|0|
|3|1|1|

全部で４パターンあるのがわかりますね。

## pythonでの実装
pythonのビット演算子 右シフト「>>」 bitAND「&」　を使います。
ビット演算子の詳細は[こちら](https://www.javadrive.jp/python/num/index4.html)がとても参考になりました。

- 右シフト >>

11を1ビット右にシフトしてみます。一番右の1が消え一番左に0が挿入されます。
1011  = 11
0101  = 5

- bitAND &

10 & 12のbitANDを取ってみます。(位ごとに両方１になっているところだけ１を残します。)
1010  = 10
1100  = 12
1000  = 08



```python
# 入力：１２５
s = ["1", "2", "5"]
n = len(s)

for i in range(2 ** (n-1)):
    tmp = [False] * (n-1)
    for j in range(n-1):
        if i >> j & 1:
            tmp[j] = True
    pattern.append(tmp)

print(pattern)
```

```
[[False, False], [True, False], [False, True], [True, True]]
```

bit全探索でパターンを全て見つけることができました。
ちなみに僕が解いた例題の解答は[こんな感じ](https://atcoder.jp/contests/arc061/submissions/8776239)です。(コード汚いしもっとスマートな解き方があるはずですが）

## 簡潔な書き方

コメントでいただいた簡潔なコードの書き方です。
上記のコードはbit全探索を理解するという意味では良いかもしれませんが、毎回書くのは億劫になので、コンテスト中は以下の書き方がベストでしょう。

```python
from itertools import product

list(product([False, True], repeat=3))#2^3通り
```

```python
[(False, False, False), (False, False, True), (False, True, False), (False, True, True),
 (True, False, False), (True, False, True), (True, True, False), (True, True, True)]
```
【Rails】Mongoidでembeds_manyの子要素の一部だけを追加・変更・削除する

## 概要
RailsでMongoDBを使用する際、埋め込み型のリレーション（embeds_many）の子要素をピンポイントで変更する方法を記載します。

## RailsでMongoDBを使うにあたって
MongoDBを使う際のORマッパーは、Mongoidを使用します。Mongoidのリレーションについては@kkyouheiさんの[Mongoのリレーションについてまとめてみた](https://qiita.com/kkyouhei/items/99efc8eb357f2a4c2348)を参照ください。

## サンプル例題
親要素はブログ記事、子要素はコメントとして、ブログ記事にコメントの配列を持たせるようなイメージになります。

```article.rb
class Article
  include Mongoid::Document
  field :_id, type: String
  field :title, type: String
  field :contents, type: String
  embeds_many :comments
end
```

```comment.rb
class Comment
  include Mongoid::Document
  field :user_id, type: String
  field :post_comment, type: String
  embedded_in :article
end
```

## 対応方法
対象のドキュメントを親要素から全子要素を取得して置き換える方法も考えられますが、今回はMongoDBのクエリを発行できる[Moped](https://mongoid.github.io/old/en/mongoid/docs/querying.html)を使って、ドキュメントを取得せずにクエリ一発で変更する方法を紹介します。

## 実装サンプル
### クエリ発行のためのコレクションの取得
```sample.rb
db = Mongoid::Clients.default
# DB上で保存されるコレクションは親要素
articleCollection= db[:article]
```

### 追加
articleの_idを指定して、対象のarticleコレクションへcommentを追加する。

```sample.rb
articleCollection.update_one(
  { "_id" => _id },
  { "$push" => { 
      "comments" => {
        "user_id" => userId,
        "post_comment" => postComment
      }
  }}
)
```

### 変更
artccleの_idと、commentのuser_idを指定して、commentを変更する。

```sample.rb
articleCollection.update_one(
  { "_id" => _id, "comments.user_id" => userId },
  { "$set" => {
      "comments.$.post_comment": postComment
     }
  }
)
```

### 削除
artccleの_idと、commentのuser_idを指定して、commentを削除する。

```sample.rb
articleCollection.update_one(
  { "_id" => _id, "comments.user_id" => userId },
  { "$pull" => { "comments" => { "user_id" => userId } } }
)
```
CaImAnの一連のパイプラインを動かす

前の記事(https://qiita.com/takeajioka/items/96effe312ac80f808d9e )では、
MATLAB版CaImAnの内部アルゴリズム(細胞抽出とデコンボリューション)について書きましたが、CaImAnの機能はそれだけではありません。
論文を読むと、Motion Correction機能や大規模データに対応するメモリマッピング機能も存在します。
wikiを見たところ、run_pipeline.mで全ての機能を使用することができるようです。
https://github.com/flatironinstitute/CaImAn-MATLAB/wiki/Complete-analysis-pipeline

##run_pipeline.m動かしてみる
Motion Correction機能を使うには「CaImAn」とは別に「NoRMCorre」もダウンロードする必要があります。(https://github.com/flatironinstitute/NoRMCorre)
3行目に

```
addpath(genpath('../NoRMCorre'));    
```
とありましたので、「NoRMCorre-master」フォルダを「NoRMCorre」に名前を変更し、CaImAnのフォルダの親フォルダにおきます。

入力画像は複数の画像ファイルに対応しています。
これにより、同じ日に連続で取った画像など**同じ場所を数回に分けて撮影した画像**を一気に解析できます。
解析したい一連の画像ファイルを一つのフォルダにまとめて入れて、そのフォルダのパスを6行目のfoldernameで指定します。

```
foldername = '<画像が入っているファルダのパス>';
```
そうすれば後は実行するだけです。(パラメータは適宜調整)

```
run_pipeline
```
motion correction, source extraction, activity deconvolutionの全てが一気に行われました。
複数ファイルをまとめたROIが表示されました。
変数のA_keepにROIの情報、C_fullにトレースの情報が入っています。デコンボリューションされた結果はC_decです。
以下のコマンドで可視化できます。
ROI情報

```
plotControl.Cn=Cn;
plotControl.thr=0.95;
plotControl.option=1;
d1=options.d1;
d2=options.d2;
[coor, contourInfo] = plotROIContour( A_keep, d1, d2, plotControl );
```

トレースの情報

```
plotControl2.frameRate=6.7468;
plotControl2.normalization=1;   plotControl2.sep=1.2;   plotControl2.displayLabel=1;  plotControl2.rollingView=1;
plotControl2.plotInferred=1;    plotControl2.plotFiltered=1;   plotControl2.plotRaw=0;
plotActivityTrace(C_full, C_full, C_full, plotControl2 );
```

デコンボリューションの結果の情報

```
plotControl2.frameRate=6.7468;
plotControl2.normalization=1;   plotControl2.sep=1.2;   plotControl2.displayLabel=1;  plotControl2.rollingView=1;
plotControl2.plotInferred=1;    plotControl2.plotFiltered=1;   plotControl2.plotRaw=0;
plotActivityTrace(C_dec, C_dec, C_dec, plotControl2 );
```

これでカルシウムイメージングの解析がかなり自動できます。
##その他
異なる日で取った場合などで、撮影した条件が異なる場合にはrun_pipeline.mがうまく機能しない場合があります。その場合はregister_ROIs.mによって、同一細胞を見つけることができるようです。wikiにも書いてありました。
https://github.com/flatironinstitute/CaImAn-MATLAB/wiki/Registering-ROIs-across-different-sessions-%5C--days

他にはdemo_GUI.mで、GUIを用いた解析ができるようです。
Windows側のブラウザでWSL emacsに表示されたurlリンクを開く


- [Windows 10 WSL (Windows Subsystem for Linux) 上のUbuntuからemacsを起動する](https://qiita.com/liamst19/items/6b96c50850e6a302b93f)
- [うっとおしいビープ音を何とかしたい一心で、initファイルの設定をOSで条件分岐する](https://qiita.com/liamst19/items/ee6573a321f1d9186aab)

前回の手順だけでは、orgファイルなどに表示されたurlリンクが、NTEmacsのようにブラウザで開かない。おそらくWSLのシステム内にウェブブラウザをインストールしていないからだと思うのだけれど、普段使っているWindows版のブラウザの方で開けた方が都合が良い。

解決方を検索してみたところ、Windowsシステムのcmdを介するよう以下をinit fileに記入すると良いようだった:

```elisp
(let ((cmd-exe "/mnt/c/Windows/System32/cmd.exe")
      (cmd-args '("/c" "start")))
    (when (file-exists-p cmd-exe)
      (setq browse-url-generic-program  cmd-exe
            browse-url-generic-args     cmd-args
            browse-url-browser-function 'browse-url-generic)))
```
(参考：[Emacs in WSL and opening links - Various Musings](https://adam.kruszewski.name/2017/09/emacs-in-wsl-and-opening-links/))