OmniAICreator/Qiita-1.07M huggingface dataset:
GO言語でリダイレクトのテスト

# リダイレクトのテスト
書くほどのことでもないですが、リダイレクトのテストの記事がなかったので、書いてみました  

```go
func TestAuthLogin_Success(t *testing.T) {
	router := newAuthTestHandler()

	req, _ := http.NewRequest("POST", "/auth/login", nil)
	rr := httptest.NewRecorder()

	router.ServeHTTP(rr, req)
	assert.Equal(t, http.StatusFound, rr.Code) // ステータスコードの検証
	assert.Equal(t, "/", rr.HeaderMap.Get("Location")) //リダイレクト先の検証
}
```
下の2行でステータスとリダイレクト先の検証を行なっています。
以上です！
【備忘録：jQuery】$(function()って何をしているか覚えていたほうがいいよね？

# $(function() {・・・・});って何をしているか
結論としては、
**・ページが読み込み完了し、DOMの構築が完了した時点でfunction()内が実行される。**
ということです。
## $(function() {・・・・});を素のjsで書くと
```javascript:hoge.js
document.addEventListener('DOMContentLoaded', () => {
ここに処理
});
```
このような感じになります。

また、以下のようにも書けます。

```javascript:hoge2.js
window.addEventListener('load', () => {
ここに処理
});
```
## DOMContentLoadedとloadの違いは？
### DOMContentLoaded
これは**「DOMの読み込み完了時に発火」**ということで、jQueryの**$(function() {・・・・});**と同等の動きになります。
### load
これは**「DOMの読み込み完了＋ページ内のリソース（画像等）の読み込み完了時に発火」**ということになります。
## DOMContentLoadedとloadの使い分けは？
DOMContentLoadedは「DOMの読み込み完了時に発火」なので、**ページ表示時、HTML要素に何かをしたければ**使用する。
loadは「DOMの読み込み完了＋ページ内のリソース（画像等）の読み込み完了時に」なので、**ページ表示時、画像などに何かをしたければ**使用する。
と言った使い分けになります。
## まとめ
$(function() {・・・・});やDOMContentLoaded、loadは用途により使い分けが必要ですが、基本的には決り文句として覚えておくのが良いかと思います。
## appendix
jsファイルに$(function() {・・・・});を書かず、head内でjsファイルを読み込んでいたら、

```html:hoge.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="/assets/js/common.js"></script>
  <title>Document</title>
</head>
<body>

</body>
</html>
```
html構築より早くjsファイルが読み込まれるのでjsが動かないです。
asyncio を利用して非同期http通信を実現する

## 背景
例えばエッジ端末で物体検知を行い続け、処理結果をサーバに送信したいとする.
detectionのループ処理中の間にHTTP POST処理を挟むと、レスポンスが帰ってくるまで処理が止まってしまう。
python標準のasync/awaitを利用することで、非同期通信が実現できる。その使い方をまとめる。


## 参考サイト
* http://iuk.hateblo.jp/entry/2017/01/27/173449
* https://qiita.com/meznat/items/c34fad95dab593f9bffa
* https://qiita.com/icoxfog417/items/07cbf5110ca82629aca0
* https://note.crohaco.net/2019/python-asyncio/
* https://docs.aiohttp.org/en/stable/client_quickstart.html#json-request
* https://docs.python.org/ja/3/library/asyncio-future.html#asyncio.Future.add_done_callback

## 環境

* python3.7.3


## 処理の流れ

```python
import asyncio
import aiohttp

def say_something(future):    # 5
    print(future.result())
    return 'hello!'


async def nested(counter):
    return counter


async def test():
    await asyncio.sleep(2)    # 3
    return'aaaaaaaaaaaaaaaaaaaa'


async def main():
    rep = 0
    counter = 0
    while True:

        if (counter % 100 == 0) and (counter != 0):
            http_req = asyncio.create_task(test())    # 2
            http_req.add_done_callback(say_something)    # 4
            counter = 0
            print(f'rep: {rep}')
            rep += 1

        task = asyncio.create_task(nested(counter))

        print(await task)

        counter += 1


asyncio.run(main())    # 1

```


### async とは

コルーチン(coroutin)を定義するための宣言。  
コルーチンはサブルーチンのより一般的な形で、エントリポイントを複数個もつことができる。つまり、処理を中断してその場所から再開することができる。

### イベントループとは
タスクスケジューラーのようなイメージで良い。イベントループに対してコルーチンを登録することで、実行・停止・再処理を自動で行ってくれる。

### 処理の中身
1. asyncio.runでイベントループにmainコルーチンを登録する。
1. mainコルーチンの内部では、特定条件の時にさらに別のコルーチンtest()をイベントループに登録する。test()は登録と同時に並列で処理が開始される。
1. test()内部では、await asyncio.sleep(2)によって「2秒間待つ」という処理が行われる。
1. main()の処理は止まらないが、今登録したtest()=http_reqが終了した際に実行するコールバック関数を定義する。
1. コールバック関数は、futureオブジェクト（http_reqの実体みたいなもの）の結果を標準出力に表示する。  
※ asyncio.create_task()の返り値はfutureオブジェクトで、これは処理が完了した時にその返り値を自動的に自身に登録する。.result()で呼び出せる。
1. 特定条件下にない時も同様にイベントループに処理を登録して、実行する。で、whileループが継続する。

## 実装時の注意点
httpリクエストはrequestsライブラリを使わず、aiohttpというライブラリを使った。

```
$ pip install aiohttp
```

以下のような形でHTTPリクエストをコルーチンとして登録できる。

```python
async def process_http_request(data):
    async with aiohttp.ClientSession() as session:
        async with session.post(URL, json=data) as response:
            return await response.text()

```
もっと気持ち悪く switch を関数化したい

元ネタ:[4歳娘「パパ、constしか使わないで？」](https://qiita.com/Yametaro/items/17f5a0434afa9b88c3b1)

メソッドチェインは関数合成なんだから、関数合成しまくったらどうにかなるだろうというゴリ押し実装。

* 2020/4/23編集 : Elm の Either を意識した感を出すためにコードを整理

```switchf.js
// 代数的データ型を関数に、
// パターンマッチを関数適用に見立てる宣言
const caseOf = match => adt => adt(match);

// Elm の Either を意識した何か
const Left = x => ({Left}) => Left(x);

const Right = x => ({Right}) => Right(x);

const andThen = Right => caseOf({
  Left,
  Right
});

const fromLeft = v => caseOf({
  Left: x => x,
  Right: _ => v
});

// switchの代替関数の作成用
const switchf = Right;

const caseIf = p => v => andThen(x => p(x) ? Left(v) : Right(x));

const caseEq = c => caseIf(x => x === c);

const caseDefault = fromLeft;

const compose = fs => fs.reduce((g, f) => x => f(g(x)), x => x);

// 使用例
const dayMessage = compose([
  switchf,
  caseEq(0)(() => "日曜日やで！ゆっくり休んでや！"),
  caseEq(1)(() => "月曜日やで！今週も頑張ろうな！"),
  caseEq(2)(() => "火曜日やで！"),
  caseEq(3)(() => "水曜日やで！"),
  caseEq(4)(() => "木曜日やで！"),
  caseEq(5)(() => "金曜日やで！もう少しで休みや！"),
  caseEq(6)(() => "土曜日やで！明日も休みやで！"),
  caseDefault(() => "曜日番号がおかしいで！"),
  lazy => lazy()
]);

// case の拡張例
const caseRange = (start, end) => caseIf(x => start <= x && x <= end);

const caseIn = arr => caseIf(x => arr.includes(x));

const dayMessage2 = compose([
  switchf,
  caseRange(1, 5)("平日やで"),
  caseIn([0, 6])("休日やで"),
  caseDefault("曜日番号がおかしいで！")
]);
```
Git(ターミナル編)について

# 背景
ターミナルでのGit操作方法を記してみた。

## 手順

※最初に、brew install gitでGitをインストールしておく。

1.git initを実行する。
（Gitを使う準備）

2.git add ファイル名
（共有したいファイルを選択する）

3.git commit -m “メッセージ “
(記録をコミットする)

4.git remote add origin リモートのURL
（リモートのURLを登録）
※一回やれば良い※

5.git push origin master
(リモートにファイルをアップロード)

6.git pull origin master
（リモートのファイルをダウンロード）



```ruby

$ git init

$ git add .                              # 「.」で全ファイルを選択できる

$ git commit -m “initial message“

$ git remote add origin リモートのURL

$ git push origin master

$ git pull origin master

```
RHEL8にPodman とpodman-composeを入れる方法 (備忘録)

##はじめに
RHEL7入れようと思ったらRHEL8でした...
まぁ、仕方がないのでdocekr入れようとしたら

「RHEL8ではdockerパッケージの廃止」

.....まじか。
その代わりにpodmanというのを使えばdockerとほぼ同じように使えるとのことです。

公式
(https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/building_running_and_managing_containers/index)

ということで入れていきます!

##1.podmanのインストール

```
$ yum module install -y container-tools
```

##2.podma-composeのインストール
podman-composeを入れるためにpip3を使うのでインストール

```
$ sudo dnf install python36 
```

podman-compsoeのインストール

```
$ pip3 install podman-compose
```

終わり！

##おわりに
たった3コマンドで入ってしまいました...
新しい技術は日本語の記事が少なくて大変ですが、それを凌駕するほどに便利ですね！

#参考
https://qiita.com/HOBO0222/items/37941306c33c67a75c0f
https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=4038
【iOS13】BackgroundでPush通知を受け取ってもdidReceiveRemoteNotificationが呼び出しされない

Firebase Cloud Messagingを用いて開発した際、躓いたポイントだったので備忘録として書きます。

# Push通知受信後、バックグラウンドで処理を行う
Remote notificationでは、Push通知を送信する際に、送信側リクエストボディに

```
 "content_available" : true
```
を付与することで、バックグラウンド状態でPush通知を受信した際に``didReceiveRemoteNotification``メソッドが呼び出されバックグラウンドで最大30秒程度処理を行うことができます。
30秒程度と記述しているのは、OS側で処理時間を短くする場合があるためです。そのため本メソッドでは、重い処理を行わずアプリがフォアグラウンドになった際に情報を更新するためのトリガー実行のフラグを立てるような簡単な処理を行うことが適しています。

# iOS13.0 ~ iOS13.3.1までのiOSでは、動かない
iOS11,iOS12でのテスト時にアプリがバックグラウンドになっていても、``didReceiveRemoteNotification``メソッドが正しく呼び出すことが出来ました。
しかし、テストを進める中でiOS13.0〜iOS13.3.1までのOSでバックグラウンド状態で、``didReceiveRemoteNotification``メソッドが呼び出されないことがわかりました。
アプリをバックグラウンドにした直後にFCMから通知を送ると稀に``didReceiveRemoteNotification``メソッドが呼び出されることもありログを追跡した結果、下記のエラーが表示前であれば``didReceiveRemoteNotification``メソッドを正しく呼び出すことができることがわかりました。

```
Can’t end BackgroundTask: no background task exists with identifier 1 (0x1), or it may have already been ended. Break in UIApplicationEndBackgroundTaskError() to debug.
```

本エラー自体は、iOS13.4以降で解消されておりiOS13.4.1をインストールした実機に対して通知を送付して確認しましたが、アプリバックグラウンド時に通知受信後に``didReceiveRemoteNotification``メソッドが正しく呼び出されることを確認しています。

## 呼び出せないことで生じる問題
通知受信後、ユーザーがアプリアイコンをタップまたは、マルチタスク画面から起動中のアプリを選択し、フォアグラウンド状態に戻したときに**通知を受け取ったフラグが取得できない**という問題が生じます。
これは、バックグラウンド時に``didReceiveRemoteNotification``メソッドが呼び出されないため通知に含まれるUserInfoの情報から更新する情報を取得したり受信フラグをアプリ側で保持する処理が行えないため生じる問題になります。
iOS13.4以降では本問題は、解決しているもののiOS13~iOS13.3.1のそれぞれのマイナーバージョンのユーザーはまだ多く残っていると考えられるため、何らかのフォローを行う必要があります。

# 代替手段
バックグラウンド時に通知受信時に受信フラグを立てるのではなく、アプリがアクティブに切り替わったタイミングで受信済みの通知から受信フラグを立てるような方法で今回解決に至りました。

```swift
func applicationDidBecomeActive(_ application: UIApplication) {
        UNUserNotificationCenter.current().getDeliveredNotifications(
            completionHandler: { deliveredNotifications in
                deliveredNotifications.forEach({ notification in
                    let userInfo = notification.request.content.userInfo
                    // 以下で、配信済みの通知のUserInfoをもとに
                    // 各通知に対しての処理を行う
                })
        })
    }
```

アプリがアクティブになる際に``AppDelegate``の``applicationDidBecomeActive``呼び出されます。
``applicationDidBecomeActive``メソッド内で、通知センターに表示されている通知の一覧を取得する``UNUserNotificationCenter``の``getDeliveredNotifications``メソッドを呼びます。

``getDeliveredNotifications``は非同期で実行され処理完了後、handlerの引数にUNNotificationの配列が渡されるので、取得したUNNotificationの中から処理をUserInfoを抽出し、受信済みの各通知に対しての処理を行うことで受信フラグを立てることでアプリアイコン経由での起動でも取りこぼしを少なくすることが出来ています。

## 代替手段の問題点
本来、``didReceiveRemoteNotification``はアプリがバックグラウンド時であっても通知をもとにアプリのステータスを**アプリがバックグラウンド時**でも変更できるものです。アプリがバックグラウンドの状態でもステータスを切り替えることで、ユーザーが次にアプリをフォアグラウンドにしたときに直ぐにユーザーに対してイベントを伝えることが可能でした。
今回の代替手段では、アプリがアクティブになったときに配信済みの通知から何らかの処理を介してアプリのステータスを変更し、ユーザーにイベントを伝えるまでを行うため、処理内容によっては起動して直ぐにユーザーにイベントを伝えることができず若干のタイムラグとなってしまうことが問題点だと感じています。
しかし、現状これ以外の打開策が検討した以外では思いつかず、ユーザーへのフォローも考えた結果、本代替手段による対応が良いと判断したため採用することしました。

一番いいのはiOSの動きが、想定通りであることなのですが...

# おわりに
ちょっとトリッキーなやり方ではありますが、ユーザーに対して最大の価値を提供するために選んだ1つの手段として参考にしていただければ幸いです。
調べた中で誤った知識などもあるかもしれません。もしよければ指摘いただけますと幸いです。
sessionとは

#sessionの説明とphpでの使用の仕方
sessionを使用することで画面遷移した時も、そのユーザーのための画面を表示できる

session_start()でsession_idがサーバー側で作成される。session_idはサーバー内とブラウザのcookiesに保存される。
⬇️
session_idを持つことで、$_SESSIONを扱えるようになり、formで送られてきた内容とDBにある内容が同じであれば、$_SESSIONの中にログインに必要な情報を入れて、サーバー側で管理する。
⬇️
次回からsession_idを持ってサーバにリクエストすると、そのsession_idによって前回作られた$_SESSIONの中身を得て、ログインを許可する

しかし$_SESSIONの中身をサーバーに保存することは少なく、メインのDBに保存する。この理由はアプリが複数のサーバーをもち、ロードバランサーによって処理を分散している場合、一つのサーバーに$_SESSIONの中身を置くべきではないからである。
[rails]カートの商品を注文商品として保存する方法

前提として、、
今回はカートモデルは持たず、カートの商品を中間テーブルとして、商品とユーザーを関連付けています。
注文に関しては、注文モデルと注文商品のモデルを作り、１：nで関連付けさせています。

```ruby:schema.rb（注文商品のモデル）
create_table "order_items", force: :cascade do |t|
    t.integer "order_id"
    t.integer "item_id"
    t.string "name"
    t.integer "price"
    t.integer "quantity"
    t.integer "production_status"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
```

```ruby:orders_controller.rb
def create
　　@order = current_user.orders.new(order_params)
　　@order.save
end
```

カート商品の注文商品への移行は、orders_controller内でできました。
流れとしては、空の@order_itemsを作成し、 order_idとitem_idにそれぞれ、OrderモデルのidとItemモデルのidを代入するという流れになります。
まずは、orderを作成する必要があります。でないと、order_idがないので。

```ruby:orders_controller.rb
def create
   @order = current_user.orders.new(order_params)
   @order.save
   @cart_items = current_user.cart_items.all
     @cart_items.each do |cart_item|
        @order_items = @order.order_items.new
        @order_items.item_id = cart_item.item.id
        @order_items.name = cart_item.item.name
        @order_items.price = cart_item.item.price
        @order_items.quantity = cart_item.quantity
        @order_items.save
     end
end
```
次に、ログインしているユーザーのすべての注文商品をeach分で回し、その中でカラムに一つずつ代入していきます。
気をつけるのは、@order_items.newと@order_items.saveもeach文の中ですることかなと。でないとcart_itemの数だけデータを保存するということができないです。

```ruby:orders_controller.rb
def create
   @order = current_user.orders.new(order_params)
   @order.save
   @cart_items = current_user.cart_items.all
     @cart_items.each do |cart_item|
        @order_items = @order.order_items.new
        @order_items.item_id = cart_item.item.id
        @order_items.name = cart_item.item.name
        @order_items.price = cart_item.item.price
        @order_items.quantity = cart_item.quantity
        @order_items.save
　　　　 current_user.cart_items.destroy_all
     end
end
```
最後に、注文後はカートが空になる様にしてあげるのも忘れずに。
以上です。初学者なのでまだまだ無駄のあるコードかもしれませんが、参考になればと思います。
もっといい方法があれば、是非教えてください！
ここで記事を書く目的

#備忘録として
　日頃苦労して設計実装した内容も数か月するとすっかり忘れてしまい、後で聞かれた時に正しく答えられないということがあると思います。
　しかしレポートとしてまとめるほどの新規性・特許性の内容でもない場合、ノートにメモはしていたが後で自分で見てもなんだかよくわからない、という自分で書いていて恥ずかしくなる経験があります。
　Qiitaにそういった自分にとっては大事な内容を備忘録として残しておくのは良いと考えました。

#皆様との情報交換
　長年設計実装に携わり中年から老年の入口に差し掛かってくると気軽に聞いたり相談できる相手が少なくなってきてしまいました。そうなると情報を社外に求める他ないのですが、Qiitaの記事は日頃から大変お世話になっております。
　そこで私が所持している機密情報では無いような設計実装の情報をここで公開し、皆様と情報交換することは良いことと考えております。
　なるべくプログラミングに寄った内容を書こうと思いますが、組み込み屋ですので多分に組み込みの内容も含まれると思います。ご容赦ください。

　間違った情報を書かないように心がけますが、色々とご迷惑をお掛けすることがあるかもしれませんが、よろしくお願いいたします。

#ここからは記事投稿のテストです
　ここから下は単なるテストになります。

```
hoge::hoge()
{
}
```

[Test:Apple](http://www.apple.com)
もっとカラースキーム作成のお手伝いをしたくてプラグインを調整している話

[この話の前エントリ](https://qiita.com/astrorobot110/items/1c2772408e434305113d)

[リポジトリ](https://github.com/astrorobot110/technicolor)

まず、前のエントリで困っている話として「何を想定していいかわからない」と言っていたものを再度列挙します。

- コマンド名は `hi` か `highlight` か？
- 引数間の空白は `<space>` か `<Tab>` か？
- じゃあそもそも `&tabstop` はいくつか？
- 引数の順番は？
- そもそも全グループの記述に同じ順番使ってるの？
- **そもそも整形化されたカラースキームを編集中なの？**

…じゃあどうすればいいんですか（逆ギレ）

実際この辺を何とかするために、どこまでも構造化しようとしたんです。で、すればするほど想定外が生まれ続けてどんどん訳がわからなくなってきたので、考え方を変えます。

そもそも整形せんで前の引数の状態だけチェックすればいいのでは？

というわけで、現在のスクリプトは挿入モード中に `technicolor#main()` を起動して、現在のカーソルの直前の引数をチェックして、引数が '=' で終わっていれば対応する引数から値を持ってくるようにして、そうじゃなければ前の引数の次にあるだろう引数をクラス `Technicolor` の `Technicolor.order` から判定して追加します。

まずはそこだけ実装して、テンプレート行の取得などは後回しにしています。なにかいい案が欲しいです。単純にスクリプトのインデントが整形されていて、次の引数がうまく想定できないのでここから手の付け方を考えている状態です。
aws-cliとyq3系のあるDockerイメージが欲しかっただけ


# 結論

パッケージマネージャーからyqをインストールするのが超大変でよく分からなかったので、バイナリを直接落としています。
これCPUのアーキテクチャが違うと困りますね...

```Dockerfile
FROM amazon/aws-cli:2.0.8

RUN yum update;\
    yum install -y sudo wget jq;\
    wget -O yq https://github.com/mikefarah/yq/releases/download/2.1.2/yq_linux_386;\
    chmod a+x ./yq;\
    mv ./yq /usr/bin/yq

ENTRYPOINT [ "/bin/bash" ]
```

# 没案

公式のガイド通り、 `snap` でインストールしようとしました。
https://github.com/mikefarah/yq

ところが、 `selinux-policy-base` というライブラリのバージョンが snapをインストールするためには不足しているようです。ちょっと解決方法が分からないので `snap` 経由のインストールは諦めました。

```
bash-4.2# sudo yum -y install snapd
......
--> Processing Dependency: selinux-policy-base >= 3.13.1-252.el7_7.6 for package: snapd-selinux-2.43.3-1.el7.noarch
--> Finished Dependency Resolution
Error: Package: snapd-selinux-2.43.3-1.el7.noarch (epel)
           Requires: selinux-policy-base >= 3.13.1-252.el7_7.6
           Available: selinux-policy-minimum-3.13.1-166.amzn2.5.noarch (amzn2-core)
               selinux-policy-base = 3.13.1-166.amzn2.5
           Available: selinux-policy-minimum-3.13.1-166.amzn2.9.noarch (amzn2-core)
               selinux-policy-base = 3.13.1-166.amzn2.9
           Available: selinux-policy-minimum-3.13.1-192.amzn2.6.noarch (amzn2-core)
               selinux-policy-base = 3.13.1-192.amzn2.6
           Available: selinux-policy-mls-3.13.1-166.amzn2.5.noarch (amzn2-core)
               selinux-policy-base = 3.13.1-166.amzn2.5
           Available: selinux-policy-mls-3.13.1-166.amzn2.9.noarch (amzn2-core)
               selinux-policy-base = 3.13.1-166.amzn2.9
           Available: selinux-policy-mls-3.13.1-192.amzn2.6.noarch (amzn2-core)
               selinux-policy-base = 3.13.1-192.amzn2.6
           Available: selinux-policy-targeted-3.13.1-166.amzn2.5.noarch (amzn2-core)
               selinux-policy-base = 3.13.1-166.amzn2.5
           Available: selinux-policy-targeted-3.13.1-166.amzn2.9.noarch (amzn2-core)
               selinux-policy-base = 3.13.1-166.amzn2.9
           Available: selinux-policy-targeted-3.13.1-192.amzn2.6.noarch (amzn2-core)
               selinux-policy-base = 3.13.1-192.amzn2.6
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest
```
TouchDesignerでの状態管理の方法について

TouchDesignerでの状態管理について、フォーラムに投稿されている以下の質問と全く同じ理由ではまりました。
[Setting CHOP Channels with Python \- General TouchDesigner Discussion \- TouchDesigner forum](https://forum.derivative.ca/t/setting-chop-channels-with-python/6948)

で、それに対する回答としてTouchDesignerで状態を管理する方法について箇条書きで回答されていました。

> - store the state in a Table DAT (access state via row name: op(‘table1’)[‘state1’,1] = 1)
> - store the state in storage (ie parent().store(‘state1’,1))
> - utilize the Timer CHOP as a state machine (my favorite, use segments as states and switch through the segments)
> - in the case of the video playback, why not use the info CHOP on Moviefilein TOP, it already gives you the states
> - use radio or exclusive buttons to store the states (op(‘state1’).click())
> - write your own state machine using extensions

訳すとこんな感じです。

- Table DATで状態を管理する (行名で状態にアクセスする: op('table1')['state1', 1]=1)
- Storageで状態をを管理する (つまり parent().store('state1', 1))
- Timer CHOPを状態機械として使う (私のお気に入り、segmentsを状態として使い、segmentsを通じて切り替える)
- 映像再生の場合はMoviefilein TOPに対してInfo CHOPを使うべき、これにより状態を取得できる
- ラジオボタンまたは排他ボタンを状態を管理するために使う (op('state1').click())
- Extensionsを使って専用の状態機械を書く

この記事ではそれぞれの手法を試してみます。
(Extensionsを使う方法は試しません、Extensionsよくわかってないので...。)

# Table DATを使う方法

Table DATでkey-valueのペアとして値を管理する方法です。Table DAT内の値はスクリプトで更新することができます。
以下の例では`slider`を操作すると`chopexec`内の`onValueChange`メソッドが実行され、`state_table`の`value`キーに対応した値が更新されます。
![use_table_dat.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/2693cbf0-8e85-ce23-fa8c-6481caa6455f.png)


# Storageを使う方法

オペレーターが持つ[Storage](https://docs.derivative.ca/Storage)の機能を使用する方法です。以下の例はさきほどと同じようにCHOP Execute DATでスライダーを監視して、値が変わると`onValueChange`メソッドでStorage内の値を更新します。状態を管理するコンポーネントはどの種類のコンポーネントでもいいのですが、Storageを使用する以外の機能は不要なのでBase COMPを使用しています。Examine DATを使用するとコンポーネントからStorageの値を取得することができます。
![use_storage.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/b30f015b-5caf-0794-0a9f-089e9ade9043.png)


# Timer CHOPを使う方法

Timer CHOPは一定時間の経過を計るCHOPです。一定時間ごとに値が切り替わるような状態を管理するのに使うのだと思います。
以下のようにTimer CHOPの`segments`タブ内の`Columns to Custom Channels`を使用することで、時間経過に応じて任意の値を変更することができます。`Custom Channel Interpolation`で補間方法を変更することができます。
![use_timer.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/3bb27065-2cbc-d19f-f35e-98b54e46fa78.png)
Timer CHOPはOperator Snippetsが充実しているので、Timer CHOPの使い方はそちらを見ると参考になると思います。今回の場合は`segment interpolate`が対応しています。

# Moviefilein TOP + Info CHOPを使う方法

Moviefilein TOPの映像再生の情報をInfo CHOPで取得することができます。
![use_moviefilein_info.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/c5d918e2-2afd-3554-ac7c-da870b5266c7.png)

# ラジオボタンまたは排他ボタンを使う方法

ボタンを複数配置して`Button Type`を`Radio Down`などのラジオボタンにします。この状態でPanel CHOPを配置すると`radio` channelで現在選択しているボタンの状態を取得することができます。ボタンの選択状態は`text1`に書いてあるようなスクリプトでも変更することができます。

![use_buttons.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/68f34648-ea2e-7830-6e98-203845043aad.png)
Android, iOSでダイアログが表示されているか確認する方法

# Android

アプリがフォアグランドにいる時にActivityのフォーカスが失われたら、ダイアログが表示されたと判断する

```kotlin
class MainActivity : AppCompatActivity() {

    var isDialogVisible = false

    override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)
        if (hasFocus) {
            isDialogVisible = false
        } else {
            if (lifecycle.currentState == Lifecycle.State.RESUMED) {
                // アプリがフォアグランドにいる時にフォーカスが失われたら、ダイアログが表示されたと判断する
                isDialogVisible = true
            }
        }
    }
```

# iOS

最前面のViewControllerが UIAlertControllerであれば、ダイアログが表示されていると判断する

```AppDelegate.swift

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var isDialogVisible: Bool {
        guard let topVC = UIApplication.topViewController() else { return false }
        if topVC is UIAlertController {
            return true
        }
        return false
    }
}
```

```UIApplication+.swift

import UIKit

extension UIApplication {

    class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let navigationController = controller as? UINavigationController {
            return topViewController(controller: navigationController.visibleViewController)
        }
        if let tabController = controller as? UITabBarController {
            if let selected = tabController.selectedViewController {
                return topViewController(controller: selected)
            }
        }
        if let presented = controller?.presentedViewController {
            return topViewController(controller: presented)
        }
        return controller
    }
}
```
setTimeoutをloopしたときのvarとletの挙動の違いについて

## varのとき
```js:js
var messages = ["foo", "bar", "hoge"];

for (var i = 0; i < messages.length; i++) {
  setTimeout(function() {
    console.log(messages[i], i);
  }, i * 100);
}

// undefined 3
// undefined 3
// undefined 3
```


## letのとき
```js:js
const messages = ["foo", "bar", "hoge"];

for (let i = 0; i < messages.length; i++) {
  setTimeout(function() {
    console.log(messages[i]);
  }, i * 100);
}

// 'foo'
// 'bar'
// 'hoge'
```

## 挙動の違いについて
varを使用したほうの問題点は、iの値がすべて「3」になっている点です。
これには理由が2つあります、

### 1. varはブロックスコープを無視する
varはブロックスコープを無視して、もっとも近い関数スコープの直下に宣言部分が巻き上げられます。今回のfor文でも同様に、loop内でスコープを持っておらず、毎度iの値を上書きしてしまっていることになります。

### 2. for文の処理が完了後にcallback関数が発火される。
setTimeout内の関数は0ms,100ms,200ms後に発火するようにcallbackタスクキュー内に入り、その後に関数が発火します。関数が発火するタイミングでは、varの値がloop後の値になってしまい、結果iの値が3の状態ですべての関数が発火するので、undefinedが返ることになる。

## letでは問題ない理由
letの場合、ブロックスコープを持ちます。for文でループが回るたびにスコープをもつことになるため、callback関数が参照するiの値もsetTimeoutで登録されたときの値になります。結果、意図した挙動になります。
Kali Linuxの共有フォルダの権限を変更する【Kali Linux 2020.1】

## GUI上から共有フォルダにアクセスできるようにしたい。

Kali Linuxは2019年12月以降、デフォルトのrootユーザーを廃止し、ユーザー権限しかもたないkaliというアカウントをデフォルトとしました。そのため、VirtualBoxのファイル共有機能でフォルダを構築しただけではアクセスできません。
一応、Terminalなどから、sudoを付加したり、suに昇格してからアクセスすることはできますが、今回はGUIのファイラ上からアクセスすることを目指します。

↓GUIからだと、アクセスできない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462467/27d21745-d316-98cb-5621-69bdc1c7bc78.png)

### 手順

sf_vmshareの存在するディレクトリまで移動し、以下のコマンドを実行して、指定したユーザーをvboxsfグループに追加します。今回はkaliアカウントを追加しました。

> kali@kali:~$ cd /media
> kali@kali:/media$ sudo gpasswd --add kali vboxsf

「Adding user kali to group vboxsf」と表示されたら、追加されたと思います。
一度再起動をしてから、フォルダにアクセスできるかを確認します。

今回はエラーが出ることなく、アクセスできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462467/a8620a5a-f05e-7ac1-fa21-7c97cedcbcb8.png)
Swift Firebase 匿名認証（anonymously Authentication）

# 概要
 - iOSアプリを開発している
 - Firebaseを使いたい
 - ユーザーを識別したい
 - 気軽に利用できるアプリにしたい
 - 無駄にセキュリティ情報を保持したくない（メールアドレスは管理したくない）

# 説明
現在開発中のアプリ（クイズのオンライン対戦）でユーザーの識別が必要となりました。
概要のとおり、個人アプリを開発時に良くあるケースですが、
Qiitaなどでサンプルコードがすぐに見つからないので共有しておきます。
（Firebase Storageによる画像の登録は次回共有します）

# 要件
 - アプリ起動時に匿名認証する
    - ユーザーが存在する場合
        - NavigationBarにユーザーが設定したアイコンとニックネームを表示
    - ユーザーが存在しない場合
        - NavigationBarにdefaultアイコンとニックネーム（未設定）を表示

# 結果
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117784/765724a0-2056-b056-ddcf-641c50e86383.png" width="400">

# サンプルコード
```swift
import UIKit
import Firebase

class TopViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        signInAnonymously()
    }
    
    private func signInAnonymously() {
        Auth.auth().signInAnonymously { [weak self] (authResult, error) in
            guard let user = authResult?.user else { return }
            self?.configureNavigationBar(user: user)
        }
    }
    
    private func configureNavigationBar(user: User) {
        let nickName = user.displayName ?? "未設定"
        let button = UIButton(type: .system)
        button.setTitle(" \(nickName)", for: .normal)
        button.setTitleColor(UIColor.black, for: .normal)
        button.contentMode = .scaleAspectFit
        button.imageView?.layer.cornerRadius = 20
        button.imageView?.layer.borderWidth = 0.5
        button.imageView?.layer.borderColor = UIColor.lightGray.cgColor
        button.imageView?.clipsToBounds = true
        let imageRef = Storage.storage().reference().child("images/\(user.uid).jpg")
        imageRef.getData(maxSize: 1024 * 1024) { [weak self] data, error in
            guard let self = self else { return }
            let image: UIImage?
            if let _ = error {
                image = UIImage(named: "default")
            } else {
                image = UIImage(data: data!)?.reSizeImage(reSize: CGSize(width: 40, height: 40))
            }
            button.setImage(image?.withRenderingMode(.alwaysOriginal), for: .normal)
            self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: button)
        }
    }
}


```
MacのZoomでVtuberっぽく．


# 概要

MacでZoomでVtuber的なアバターをつけたい．

![](https://paper-attachments.dropbox.com/s_AD78BA5FB9EB716010316A555BC6E44063464925933D9EA4865703C3B79EA45D_1587552919405_image.png)

# ひとこと
- Zoom（ver. 4.6.12）に仮想カメラを認識させる，というのが一番の難関でした．
- ManyCam路線は簡単だが低機能．OBS路線の場合，OBS-mac-virtualcamの周りに難関あり．具体的には，(i) OBS-mac-virtualcamのインストラクションだとOBSがビルドできない， (ii) OBSのメニューバーをクリックしても反応しない．


# 必要なもの・こと
- 自分を認識してアバターを動かしてくれるもの 
    → https://facevtuber.com
- 上の環境で動かせるアバター 
    → 上のサイトのリンク・ニコニコ立体（https://3d.nicovideo.jp/works/td31884 ）
- 自分に合わせて動いてくれるアバターを仮想カメラに出力するソフトウェア
    - ManyCam または以下の二つ
   - OBS studio (https://obsproject.com/ja/download; ここからダウンロードする必要なし)
   - obs-mac-virtualcam (https://github.com/johnboiles/obs-mac-virtualcam)

- Zoomに仮想カメラを認識させる


# 手続き

ManyCam路線なら「Zoomに仮想カメラを認識させる」以外は素直にやればできる．OBS路線は，obs-mac-virtualcam導入がやや手間．

### ManyCam路線
以下を参考に．この場合，簡単だが（無料プランだと多分）少し機能が低い．

https://note.com/d_v_osorezan/n/nd9130e2012dd


### OBS路線
TerminalやGitHubが少し登場する．

**1. Githubからobs-mac-virtualcamを用意**
GitHub: https://github.com/johnboiles/obs-mac-virtualcam

Buildingの部分のインストランクションに従ってやるが，**初めの部分は従わない**．

この際，注意点．

- インストラクションのOBSをビルドする部分（”# Clone this repo”の手前まで）がうまくいかなかった．ここの部分は，OBS本家（https://github.com/obsproject/obs-studio/wiki/Install-Instructions ）のビルド手順に従う．
- それ以降は，obs-mac-virtualcamにある部分を使ってOK．
- 実行ファイルは``obs-studio/build/rundir/RelWithDebInfo/bin/``にある．


**2. OBS-mac-virtualcamにあるとおり，ToolバーからVirtual cameraを起動**
この際メニューバーが反応しない場合は，一旦別のアプリケーションに切り替えてOBSに戻ると直る．


## Zoomに仮想カメラを認識させる
最後の難関，

![](https://paper-attachments.dropbox.com/s_AD78BA5FB9EB716010316A555BC6E44063464925933D9EA4865703C3B79EA45D_1587552984391_image.png)

ターミナルからXcodeをインストールして（自分はインストールされてた），Zoomを落とした上で，Terminalで以下．

    $ codesign --remove-signature /Applications/zoom.us.app/

参考：https://forum.manycam.com/t/virtual-webcam-no-longer-works/1806/6

きっと終わり．
Visual Studio for Macでコンソールの日本語が文字化け(?表示)する場合の対処

# 環境
OS : macOS Catalina
Visual studio: Visual Studio 2019 for Mac Community

# 日本語文字化け
Visual Studio for Macの.NET、コンソールプロジェクトでコンソールに文字列を出力する際に、日本語が**??**で表示されます。

```c#
using System;
namespace Test {
    class MainClass {
        public static void Main(string[] args) {
            Console.WriteLine("ペンギン");
        }
    }
}
```

```
????

Press any key to continue...
```

# 対処
環境変数を追加します。

```
vim .bash_profile
```

```bash:.bash_profile
export LANG=ja_JP.UTF-8
```

再起動して、Visual Studio for Macのコンソールで日本語が正常に表示されることを確認します。

# システム終了後、日本語が文字化けする場合
Visual Studio for Macでコンソールを表示する前に、ターミナルを起動すると、文字化けが直ります。
PDFの表からデータを取り出すtabulizerパッケージ

PDFの表からデータを取り出す`tabulizer`パッケージです。下記のTwitter記事を参考にしました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">PDFに埋まっているテーブルデータを開放してあげるには、Rを使えば以下の4行でできちゃいます！<br><br>library(tabulizer)<br>library(purrr)<br><br>df_list &lt;- tabulizer::extract_tables(&quot;file.pdf&quot;) %&gt;%<br> purrr::map_dfr(<a href="https://t.co/Bz4BWtBUrJ">https://t.co/Bz4BWtBUrJ</a>.frame) <a href="https://t.co/k9kYelorDj">pic.twitter.com/k9kYelorDj</a></p>&mdash; Kan Nishida (@KanAugust) <a href="https://twitter.com/KanAugust/status/1252494240413708288?ref_src=twsrc%5Etfw">April 21, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


# パッケージ読み込み

```{r}
library(tidyverse)
library(tabulizer)
```

あつかう表はこのような形式。北海道庁が公開しているコロナウィルス感染症のPDFデータです。
![01pdf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/a8cb5837-5a7b-8222-0d25-97f34293f280.png)

説明すべきことはあまりありません。`map_dfr()`は`apply`系の関数です。初めて使用しましたが、便利です。

```{r}
tb <- 
  tabulizer::extract_tables("0421.pdf") %>%  # pdfデータを読み込み
  purrr::map_dfr(as.data.frame) %>%  # data.frame形式に変換
  as_tibble() %>%  # tibble形式に変換（やらなくても良いけど）
  filter(V2 !="(公表)" , V2 !="公表日" )  # データとして読み込まれたヘッダ行を削除
# カラム名をrename
colnames(tb) <-
  c("No","公表日","年代","性別","居住地","周囲の患者の発生", "濃厚接触者の状況")  
# csv書き出し
tb %>% 
  write_csv("0421.csv")
```
無事に全てのデータが書き出されました。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/ed08dea4-5e99-55b9-20c5-95c6fdc93828.png)
Gitの脆弱性について

こちらの記事に掲載されていた内容についてです。
[セキュリティネクスト](http://www.security-next.com/114201)（2020年4月17日時点）

内容はと言いますと、「Gitに深刻な脆弱性が含まれていることがわかった」と。
アップデートがリリースされているみたい。

どういった脆弱性かと言いますと、

～記事より一部抜粋〜
『**credential helper**において改行を含む細工したURLを用いることで、Gitクライアントより認証情報を任意のホストに送信させることが可能となる脆弱性「CVE-2020-5260」が明らかとなった』

という内容。。。

変なURLを踏むと、**Gitの認証情報を別のサーバーに取られちゃう**みたい。。
恐怖に駆られたので調べを進めてみます。

CVE-2020-5260って何じゃ！

検索して確認してみます　↓
[CVE/一般的な脆弱性と露出](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-5260)
<img width="718" alt="スクリーンショット 2020-04-22 18.58.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580388/10bb382a-cbb5-a890-cc11-15ec8f8067e3.png">
[Github公式](https://github.com/git/git/security/advisories/GHSA-qm7j-c969-7j4q)
<img width="960" alt="スクリーンショット 2020-04-22 20.12.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580388/9ea09641-c732-d8ef-af34-3426bd5697c3.png">


噛み砕くとバージョンによっては危ないらしい、、、

とりあえず回避策を取った上で、石橋をバスーカで破壊してからヘリコプターで渡る勢いで、
該当していないか自身のGitバージョンを確認してみる。



```terminal
$ git --version 
```

```terminal
git version 2.23.0
```

該当しちょる...

バージョンアップしなきゃ！（汗

ということで、
最新版をインストールしてHomebrewで管理

```terminal
$ brew install git
```
Gitにパスを通していなければ

```terminal
$ echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
```
アップグレード

```terminal
$ brew upgrade git
```

```terminal
git version 2.23.0
```
あれ、更新されない。。

Gitの参照先を確認してみる

```terminal
$ which git
```

```terminal
/usr/local/bin/git
```

Homebrewからインストールしたパッケージも確認してみる

```terminal
$ brew ls | grep git
```
```terminal
git
```
ある。

HomebrewでインストールしたGitの本体がある場所も確認

```terminal
brew list git
```

```terminal
/usr/local/Cellar/git/2.26.2/bin/git
```
ある。

ん？エラー出てる？
もう一度実行して内容を確認してみる

```terminal
$ brew upgrade git
```

```terminal
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink bin/git
Target /usr/local/bin/git
already exists. You may want to remove it:
  rm '/usr/local/bin/git'

To force the link and overwrite all conflicting files:
  brew link --overwrite git
```

おお、エラーあった。
/usr/local/bin/git に対してgitコマンドのシンボリックリンク（ショートカットのようなもの）を作成しようとしたけど対象がすでに存在するため、エラーになってシンボリックリンク作れなかったみたいでした。
削除するか上書きを選べと。。

『リンクを強制してすべての競合するファイルを上書きするには「brew link --overwrite git」をしろ』とあるので上書きしてみましょう。

オーバーライトを実施してみる

```terminal
$ brew link --overwrite git
```

その後、再度バージョン確認（どきどき。。）

```terminal
git version 2.26.1
```

おお！最新にアップグレードされました :santa::santa::santa:✨
とりあえず安心:angel_tone2:
【随時更新】Railsのgenerateコマンド集【Scaffoldもあるよ！】

## はじめに
`Scaffold`を使用する機会があったのですが、基本的な`rails g scaffold`しか使用したことがなかったなと思い、特に使えそうなコマンドを調べ、コマンド集として纏めてみました。
折角なので、合わせて`generate`コマンドも纏めてみました。
こんなコマンドもある、このコマンドは違う、などあればコメントにてご教示いただけますと嬉しいです。

## コマンド一覧
※`generate`は全て省略して`g`と書いています。

### 基本的なgenerateコマンド

#### Modelの作成
- `Model`、`Migration`ファイルを作成する

```sh
$ rails g model [Model名] [columns / name:string state:referencesなど]
```

#### Controllerの作成
- `Controller`と`View`を作成する
- `scaffold_controller`（後述）と異なり、`REST`を意識していない
- `Controller名`で指定した名称がそのまま使用されるので注意が必要（リソースを扱う`Contoller`で複数形にする必要がある場合は`s`を最初から書いておかないとダメ）

```sh
$ rails g controller [Controller名] [オプション（アクション名）]
```

#### Migrationファイルの作成

```sh
$ rails g migration [Class名] [columns]
```
[rails generate migrationコマンドまとめ](https://qiita.com/zaru/items/cde2c46b6126867a1a64)によると

> クラス名は何でもOKだけど「アクション+テーブル名」とかが慣例っぽいです。

らしいです。

#### アセットファイルを生成する

```sh
$ rails g assets [Model名]
```

#### スペックファイルを生成する

```sh
$ rails g rspec:model [Model名]
```

#### generateを取り消したい場合

```sh
$ rails destroy [作成した対象/controllerとか] [Model名]
```

### Scaffold系

#### 基本的なScaffold

- `Model`、`Controller`、`View`、`Routing`、`Assets`を作成する

```sh
$ rails g scaffold [モデル名（スネークケース）] [各種カラム]
```

#### ScaffoldでControllerとViewのみ作成する
- 既にモデルを作成済の場合は以下のコマンドで`Controller`と`View`を作成する(`RESTful`なコントローラが作成される)
- このコマンドでは`Routing`は行ってくれないため、別途手動で定義が必要

```sh
$ rails g scaffold_controller [Model名] [カラム名]
# 指定したカラムのフィールドがViewに定義される
```

#### 作成済みModelがある状況で`Scaffold`で作成される`Controller`や`View`が欲しい時
既に`Model`を作成済みの場合は、以下の作業を行えば `rails g scaffold [Model] [column]`を実行した場合と同じ状況になります。

- 以下のコマンドを実行
 
```sh
$ rails g scaffold_controller [作成済Model名] [定義されているcolumn / name:stringなど]

$ rails g assets [作成済Model名]
```

- `config/routes.rb`を修正

```ruby:config/routes.rb
 Rails.application.routes.draw do
  resources :model_name # 作成済みModel名を記述
end
```

## 最後に
調べてみたら、 `generate`も`Scaffold`も思っていた以上にレパートリーがあって驚きました。
`generate`コマンドや`Scaffold`について、使ったことがないものや知らなかったものがあったのでこの記事を定期的に確認して定着させようと思います。


## 参考記事
- [実はこんなにある rails generate](https://techracho.bpsinc.jp/shibuya/2014_07_24/18388)
- [rails generate migrationコマンドまとめ](https://qiita.com/zaru/items/cde2c46b6126867a1a64)
【micro:bit】micro:bit入門

#####記事一旦全削除しました。
>
>>2020/08/08追記しました。
本の作者さんの@mathrax-sさんが解決策教えて下さいました。以下に訂正するようです。

<img width="436" alt="a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611776/a3494a1f-3b5c-ff2e-9d96-0ad10de9ecb2.png">


##【micro:bit】micro:bit入門
参考書籍のサンプルコードを打ってみたのですが…音が鳴りません。OSCで連携が出来ないので困っています…。いつか「あっ！」とわかる日がくるかもしれないのでアウトプットしておきます。

##環境構築
パソコンとUSBケーブルとmicro:bitを用意し[makecodeエディター](https://makecode.microbit.org/#)を使ってマイコンボードを動かしました。また、[Processing](https://processing.org/download/)と[SonicPi](https://sonic-pi.net/)をインストールしました。



##疑問点
micro:bit ＋ Processing + SonicPi の連携に挑戦してみましたが挫折しています。参考文献の「プログラム×工作でつくるmicro:bit」のサンプルコードを引用しました。
1. ProcessingのContributionManagerからにOscP5ライブラリをインストールしました。
2. [sonicPi](https://sonic-pi.net/)の MSI Installerをインストールしました。バージョンはSonic Pi v3.2.2の現時点では最新です。（sonic3.0以降でOSCに対応しています）
3. Processingのバージョンも最新の3.5.4 (17 January 2020)です。
4. SonicPiのOSCサーバの有効もチェックされています。
5. SonicPi側でOSCを受けて音を生成するプログラムを実行しました（次項参照）
6. SonicPiにOSCを送出するProcessingのプログラムを実行しました（次項参照）
7. ピアノの鍵盤の画面が表示されキーボードから入力しました。
8. あれSonicPiから楽器のような音が聞こえてくるはずなのに聞こえてきません。
9. 音が鳴らない…しょんぼり

### サンプルコードは削除させて頂きました 2023/10/12



##参考文献
この記事は以下の情報を参考にして執筆しました。1.[fms_sound171220.pdf](https://drive.google.com/file/d/1d_pxnewVn-9AE9IUd1OlAGAB-w5DY8Kx/view)　　2.[「プログラム×工作でつくるmicro:bit」](https://www.ohmsha.co.jp/book/9784274222894/)
algorithmicxでLineのrefが機能しないとき


# はじめに

LaTeXの`algorithmicx`パッケージを使っているときに
擬似コード内の\labelに対して　\refが反応せずすべて「1」と表示される事がありました．

# 問題のあったコード

```tex
\begin{algorithm}
    \begin{algorithmic}[1]
        \caption{helloworld}  
        \label{alg:hello} 
        \Function{hello\_world}{$S$}
            \State Hello  \label{code:hello}
            \State World, $S$
        \EndFunction
    \end{algorithmic}
\end{algorithm}
```

上記に対して，`\ref{alg:hello}`などを行ってもすべて「１」と表示されていました．

# 解決法

http://mirror.ox.ac.uk/sites/ctan.org/macros/latex/contrib/algorithmicx/algorithmicx.pdf

公式リファレンスを見ます．

```tex
\begin{algorithm}
    \caption{helloworld}  
    \label{alg:hello} 
    \begin{algorithmic}[1]  
        \Function{hello\_world}{$S$}
            \State Hello  \label{code:hello}
            \State World, $S$
        \EndFunction
    \end{algorithmic}
\end{algorithm}
```

caption, labelの位置が違いました･･･
工事完了です･･･
Amazon Polly でSSMLなどをテストするためのツール

PollyでSSMLを喋らせるとどうなるか確認するツールです。
https://github.com/hexaforce/PollyTester

使い方によっては正しい英語の発音などの学習にも使えます。
<img width="602" alt="スクリーンショット 2020-04-22 18.51.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117164/383b78f1-379e-e05f-4ac2-d3eb1adbd866.png">
Docker-composeでOpneModelicaの開発環境を構築（Mac）

#はじめに
DockerでOpenModelicaの開発および計算環境を構築する方法をメモしておく．

これらの内容はgithub上で公開しているので，参考にしてもらいたい．
https://github.com/matsubaraDaisuke/openmodelica-docker-start

# 環境
dockerとdocker-composeはインストール済みとする．

docker version  19.03.4
docker-compose version 1.24.1
MacOS Catalina 10.15.4

# 構成
ディレクトリ構成は以下のものとします．

``` 
project
├ docker-compose.yml
├ docker
|　 └ openmodelica
| 　　　└ Dockerfile
└ om-develop(このディレクトリ内で開発する)
```


# Mac上の環境構築

XQuartzを事前にインストールして起動してください。

リポジトリのクローン

``` terminal
$ git clone https://github.com/matsubaraDaisuke/openmodelica-docker-start.git
```

ローカルのIPアドレスの取得

``` terminal
$ make IP
>> IP address: 192.168.x.xx　// e.g. 192.168.12.1
```

X サーバへの接続が許可されるホスト名とユーザ名をリストに追加

``` terminal
$ xhost +192.168.x.xx // e.g. $xhost +192.168.12.1
```

docker-compose.ymlの環境変数(environment)を修正します

``` docker-compose.yml
services:
    openmodelica:
      container_name: openmodelica
      build: ./docker/openmodelica
      #tty: true
      environment:
        - DISPLAY=192.168.x.xx:0.0 <- HERE Edit! e.g. - DISPLAY=192.168.12.1:0.0
      volumes:
        - ./om-develop:/home/openmodelica
        - /tmp/.X11-unix:/tmp/.X11-unix 
```

ビルドと起動

``` terminal
$ docker-compose up --build
```

``` terminal
$ docker-compose run openmodelica /bin/bash
```

OMEditの起動

``` terminal
# OMEdit 
```

![OMEdit](https://user-images.githubusercontent.com/25544286/79966782-e778ca00-84c8-11ea-9a98-7306802c2664.png)

計算用のデータは、ホスト：**om-develop**ディレクトリ、コンテナ：**/home/openmodelica**でマウントされているので編集、保存が可能になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132299/e4c76e03-df76-798e-b24b-febdbeadd00b.png)

# 終わりに
もう少し、自動化は可能でしょうが、サボってます。
うまくいかない人は、したのコメントに適当に書いてください。
wslにdiagramsをinstall 

# 概要
wslでdiagramsをサクっとインストールできなかったので手順をまとめてみました。

```bash

$ sudo apt install graphviz
$ pip install diagrams
```

上記でインストールできた場合は問題ないですが、エラーがでて何がなんだかよくわからん。そんなとき、インストール完了までに実行した手順です。


## pip install diagram -vvv

```bash
$ pip install diagrams
ERROR: Could not find a version that satisfies the requirement diagrams (from versions: none)
…
```
上記のエラーで何が原因か不明でしたが、"-vvv"オプション付きで実行したところ、メッセージからpython3.6以上が求められていました。

## pyenv インストール

今後困らないように pyenv をインストールします。(環境によって.bash_profileなど変更してください)

```bash
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv \
 && echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc \
 && echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc \
 && echo 'eval "$(pyenv init -)"' >> ~/.bashrc

$ source ~/.bashrc
```

## pyenv3.8.2 インストール

現時点(2020/4/22)で最新の3.8.2をインストールしました。が、環境が整っていないとビルドに失敗します。
ビルド環境が不明なら、以下のコマンドを実行し環境を整えましょう。その後python3.8.2のインストールと設定です。

```bash
$ sudo apt-get install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
$ pyenv install 3.8.2
$ pyenv global 3.8.2
```

## pip install diagrams

最後に diagrams をインストールです。無事インストールできれば再実行したときに、以下のようなメッセージが表示されます。お疲れさまでした。

```bash
$ pip install diagrams

$ pip install diagrams
Requirement already satisfied: diagrams in ./.pyenv/versions/3.8.2/lib/python3.8/site-packages (0.8.2)
Requirement already satisfied: graphviz<0.14.0,>=0.13.2 in ./.pyenv/versions/3.8.2/lib/python3.8/site-packages (from diagrams) (0.13.2)
Requirement already satisfied: jinja2<3.0,>=2.10 in ./.pyenv/versions/3.8.2/lib/python3.8/site-packages (from diagrams) (2.11.2)
Requirement already satisfied: MarkupSafe>=0.23 in ./.pyenv/versions/3.8.2/lib/python3.8/site-packages (from jinja2<3.0,>=2.10->diagrams) (1.1.1)
```
【小ネタ】自前で deep_dup -> 結論、ちょっとやり過ぎ

# 何でもかんでも `deep_dup`
ActiveSupport との違い。

* インスタンス変数も漏れなく `deep_dup` します。
* Array の場合も自身を `dup` して、レシーバが Array の子クラスなら、そのクラスのオブジェクトを返します。
* Hash のキーを `dup` することは考えていません。
* Struct にも対応しました。

```ruby
module DeepDup
  refine Object do
    def deep_dup
      return self if private_methods(false).include?(:dup)

      dup.tap do |copy|
        copy.instance_variables.each do |var|
          val = copy.instance_variable_get(var)
          copy.instance_variable_set(var, val.deep_dup)
        end
      end
    end
  end

  refine Array do
    def deep_dup
      dup.tap { |ary| ary.map!(&:deep_dup) }
    end
  end

  refine Hash do
    def deep_dup
      dup.tap do |hash|
        hash.each { |key, val| hash[key] = val.deep_dup }
      end
    end
  end

  refine Struct do
    def deep_dup
      dup.tap do |struct|
        struct.each_pair { |key, val| struct[key] = val.deep_dup }
      end
    end
  end
end
```

# 考察
ActiveSupport は、どうしてインスタンス変数を `deep_dup` しないのだろう。

何でもかんでも `dup` するのはやり過ぎなので、`dup` が必要なインスタンス変数に限って、`initialize_dup` （`dup` の挙動だけ変更する。）や `initialize_copy`（`dup` と `clone` どちらの挙動も変更する。）で `dup` なり、`deep_dup` するようにして、オブジェクト本体の `dup` の挙動を変更するようにした方が、柔軟な設計が可能だからなのだろうか。

例としては、

```ruby
class Foo
  def initialize
    @ary = []
  end

  def initialize_copy(orig)
    @ary = orig.instance_variable_get(:@ary).deep_dup
  end
end
```

こんな感じ。よくよく考えると、なんでもかんでも `deep_dup` すると、循環連結リストの処理がいつまでも終わらないことに気付いた。

拙い表現ではあるが、ActiveSupport では、インスタンス変数を持たない Array や Hash に関しては `deep_dup` すること自体が眼目であるのに対し、Object で `deep_dup` を定義しているのは、`dup` が禁止されているオブジェクトかどうかを見極めることが主要な目的だということなのだろうか。

# 結論
インスタンス変数を何でもかんでも `deep_dup` するのは、やり過ぎでした。
[Azure] サービスプリンシパル 有効期限が切れてしまったときの更新手順

Azure サービスプリンシパルのクライアントシークレットには有効期限があります。
CLI ベースでサービスプリンシパルを作成すると、デフォルトで1年の有効期限が設定されますが、期限の存在に気づかず以下のようなエラーに遭遇した方もいるのではないでしょうか。

~~~
ERROR: Get Token request returned http error: 401 and server response: {"error": "invalid_client",
"error_description":"AADSTS7000222: The provided client secret keys are expired. ...
~~~

有効期限が切れそうな (もしくは切れてしまった!!) ときは、以下の方法で更新できます。


#### 1. Azure Active Directry で [アプリの登録] を選択する。
<img width="368" alt="2020-04-21_12h24_25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423135/a286cedf-6011-7991-2bca-52cad2b2f7e7.png">


#### 2. 更新したいサービスプリンシパルを選択する。
<img width="824" alt="2020-04-21_09h53_35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423135/c318f668-bf85-c081-9d6d-cf4d7a527a66.png">

#### 3. [証明書とシークレット] を選択し、 [+ 新しいクライアント シークレット] を押下する。
<img width="759" alt="2020-04-21_18h24_36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423135/f43e5b7f-ddb7-ecd3-a559-4b29e10e5ac0.png">


#### 4. 任意の [説明] と [有効期限] を設定し、追加する。
<img width="192" alt="2020-04-21_09h57_58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423135/f31270ba-46b6-52a6-65d0-e3e9a7cc5f28.png">

#### 5. 更新完了！
更新後、キー値は一度だけしか表示されません！ 必ず画面遷移前に、値をコピーしておきます。
期限切れのシークレットは、ゴミ箱マーク押下で削除できます。
<img width="532" alt="2020-04-21_09h59_53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423135/3a3cc391-4a4c-2a42-e954-c614f08f518d.png">
【Ruby, sinatra】textareaの改行がうまく表示できない

textareaに改行ありのテキストを入力して、画面に表示しようとしたら見事に大失敗しました。
やろうとしていることは・・・

1. textareaに改行ありのテキストを入力
2. mysqlに保存
3. Rubyでmysqlからテキストを取り出して、改行ありの状態で画面に表示

です。

# 環境
- Windows10(ローカルOS)
- CentOS7(リモートOS)
- Oracle VM VirtualBox 6.1(仮想マシン)
- Ruby 2.7.1p83
- mysql

# 修正前の状態
|![markdown-mark.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/462187a9-d1f8-0d19-5d5c-2d0f35b98632.png)|
|:-:|

これで投稿を押すと

|![markdown-mark.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/c680c914-a84c-e2a2-dd0f-f6181314c211.png)|
|:-:|
このように改行が無視されています


# データベースの状態
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/0eee9457-632a-6dcb-5f1d-2c26dea63e37.png)

# Rubyファイルとhtmlファイル
## Rubyファイル
```app.rb
require "sinatra"
require "mysql2"

client = Mysql2::Client.new(host: "localhost", username: "root", password: "mysql接続時のパスワード")

post "/" do
 name = params[:name]
 comment = params[:comment]

 query = %Q{insert into training.chat(name, comment) values('#{name}', '#{comment}')}
 client.query(query)

 query = %q{select * from training.chat}
 @results = client.query(query)

 erb :index
end
```
他にも`require`や`get "/" do~end`の記述もありますが、今回のテーマに直接関係ないので省かせていただきます。

## htmlファイル
```html:index.erb
<html>
  <head>
    <meta charset="UTF-8">
  </head>

  <body>
    〜〜〜〜〜中略〜〜〜〜〜
 
    <% @results.each do |row| %>
      <% row.each do |key, value| %>
        <%= value.gsub(/\n/, '<br/>') %>
      <% end %>
    <% end %>

    〜〜〜〜〜中略〜〜〜〜〜
  </body>
</html>
```

# 結論
```html:index.erb
<%= value.gsub(/\n/, '<br/>') %>
```
改行を反映させたい値に対して`.gsub(/\n/, '<br/>')`をつけると改行が正常に表示されます。
【参考記事】
[Sinatraでお問い合わせフォーム](http://aoyagikouhei.blog8.fc2.com/blog-entry-198.html)

|![markdown-mark.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480714/12f74a97-1d53-a58b-e934-5b74a9873e04.png)|
|:-:|
TypeORMの設定ファイルが読み込めない

TypeORMの設定ファイル（ormconfig.json）を読み込めない！！
みたいな困りごとがあったので、解決策をメモしておきます



# 結論
TypeORMは「.env」「ormconfig.env」「ormconfig.xxx」の優先度で設定値を読み込む。今回はdotenv使っていたのでormconfig.jsonが読み込まれていなかった

[ドキュメント](https://github.com/typeorm/typeorm/blob/master/docs/using-ormconfig.md#which-configuration-file-is-used-by-typeorm)

抜粋

```
From the environment variables. Typeorm will attempt to load the .env file using dotEnv if it exists. If the environment variables TYPEORM_CONNECTION or TYPEORM_URL are set, Typeorm will use this method.
From the ormconfig.env.
From the other ormconfig.[format] files, in this order: [js, ts, json, yml, yaml, xml].
```


## 状況を再現してみる
実験用ディレクトリを作ります

```
npm init
npx typeorm init
```

こんなプロジェクトができるはず

```
.
├── README.md
├── node_modules
├── ormconfig.json
├── package-lock.json
├── package.json
├── src
└── tsconfig.json
```

ormconfig.jsonを開いてみます

```
{
   "type": "mysql",
   "host": "localhost",
   "port": 3306, <-- ここに注目
   "username": "test",
   "password": "test",
   "database": "test",
   "synchronize": true,
   "logging": false,
   "entities": [
      "src/entity/**/*.ts"
   ],
   "migrations": [
      "src/migration/**/*.ts"
   ],
   "subscribers": [
      "src/subscriber/**/*.ts"
   ],
   "cli": {
      "entitiesDir": "src/entity",
      "migrationsDir": "src/migration",
      "subscribersDir": "src/subscriber"
   }
}
```

ポート3306を指定したので、この状態で `npm start` すれば...

```
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 3306, <-- ここに注目
  fatal: true
```

ちゃんと3306を目指します。

## dotenvを使っている場合
が、仮にあなたのプロジェクトがdotenvを使って環境変数を管理していて、こんな.envファイルがルートに置いてあるとしましょう


```
TYPEORM_PORT=4000
TYPEORM_CONNECTION=mysql
```

この状態で `npm start` してみます

```
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 4000, <-- ここに注目
  fatal: true
```

ormconfig.jsonは無視されて.envが優先されました


この仕様を見落としていたため、今回僕はormconfig.jsonが無視されて困っていたワケです



### ちなみに

#### .envの中身に左右されます
TYPEORM_CONNECTION、もしくはTYPEORM_URLのいずれかが.envに指定されている場合のみ、.envが優先されます。
なので試しにTYPEORM_CONNECTIONを外してみましょう

```
TYPEORM_PORT=4000
TYPEORM_CONNECTION=mysql <-- コイツを削除してみる
```

```
TYPEORM_PORT=4000
```

この状態で起動すると

```
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 3306, <-- ここに注目
```

.envではなく、ormconfig.jsonが優先されて3306に向かっていますね。



#### dotenvの有無は関係ねぇ！

dotenvをプロジェクト自身が使っていなくても、.envファイルが転がっていると、そちらormconfig.jsonより優先されます。
`node_modules/typeorm/package.json` を覗いてみると

```
  "dependencies": {
    "app-root-path": "^3.0.0",
    "buffer": "^5.1.0",
    "chalk": "^2.4.2",
    "cli-highlight": "^2.0.0",
    "debug": "^4.1.1",
    "dotenv": "^6.2.0", <-- いた！
    "glob": "^7.1.2",
    "js-yaml": "^3.13.1",
```

はい、dotenvが居りますね。
なので自分自身がdotenvを入れていなくても注意しましょう。


## 教訓
今後はドキュメントをちゃんと読むようにします...


## 関係ありそうなエラーメッセージ

`Cannot find connection xxx because its not defined in any orm configuration files.`
- ormconfig.jsonの中でconnectionの名前とか指定していた場合、.envが優先されてormconfig.jsonは無視されるので、名前付きconnectionが見つからず、こんなエラーが出る事があります

`No migrations pending`
- マイグレーション対象のDBをormconfig.jsonで定義していた場合、.envが優先されてormconfig.jsonは無視されるので、マイグレーション済みの別DBを参照して、こんなエラーが出る事があります
【Vue.js】Component template requires a root element, rather than just text.

# 書いたコード概要とエラー

私が開発していた箇所では、HTML内のテンプレート・コンポーネントを作成するJavascriptに分けてVueコンポーネントのコードを記述していました。

## HTML

```html
<script id="someComponent" type="text/x-template">
  <div>
    ...
  </div>
</script>
```

## Javascript

```javascript
Vue.component('some-component', {
  // ...
  template: 'someComponent'
});
```

前例に倣ったつもりでこのように書いたところ、該当のコンポーネントを表示させる処理を実行した時、想定していた要素が表示されず、代わりにコンソールにエラーが出力されました。

## エラー

```
[Vue warn]: Error compiling template:
someComponent
- Component template requires a root element, rather than just text.
```

# 原因
エラーメッセージだけ見て不可解に思っていましたが、処理的には`id="someComponent"`となっている要素を読み込むのではなく、`someComponent`という文字列をテンプレートとして解釈しようとしていたことが分かりました。気づいてみれば当然といえば当然ですね……。

# 修正後

## Javascript

```javascript
Vue.component('some-component', {
  // ...
  template: '#someComponent'
});
```

このように書くことで、無事`id="someComponent"`となっている要素の内容をコンポーネントとして読み出し、表示することができました。
zip形式は何が良いか問題 - 個人的にはgz

zip形式何が良いんだろうと迷った方向けの記事（滅多にいないか・・）

### gzipを使った方が良いわけ

`Linux系の圧縮形式。標準的な圧縮方式。`

これに尽きる。

AWSやさくらなどで、サーバ立ち上げたりするときに使用するOSは基本Linuxだし、汎用性高いしおすすめ。

### 使い方
refs: https://webkaru.net/linux/gzip-command/
#### 圧縮
`$ gzip ${file}`
#### 解答
`$ gzip -d ${file}`

簡単。以上。