OmniAICreator/Qiita-1.07M huggingface dataset:
Android PからのSystem TracingとPerfettoを使ってパフォーマンスを確認しよう

traceがいい感じに使えるようになっていたのでシェアです。
これはAndroid Dev Summitで紹介されています。
https://www.youtube.com/watch?v=9kNhB_z704I
PerfettoはUIが改善されたSystraceのUIです。Chromeをクラッシュさせずに、しかもかなり快適に動きます！

# 事前準備

開発者向けオプションからSystem Tracingを有効にしてShow Quick Settings tileを有効にします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/d069e0cf-6c4c-3706-71f1-76912a51a822.png)

# trace方法

こんな感じのActivityがあったとします。

```kotlin
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Trace.beginSection("MySession")
        Thread.sleep(1000L)
        Trace.endSection()
    }
```

こんな感じでtraceファイルを保存することができます。

![trace.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/3f427ca5-b2ed-976b-1a4c-0dff575cb5d1.gif)
シェアしてファイルをGoogle Driveに共有しても良いですが、以下でtraceしたデータを取得できます。

```
adb pull /data/local/traces
```

(以下のようにしてコマンドからもtraceが取れそうだったのですが、うまく取得できませんでした :sweat:  とりあえずUIから取っています。)

```
adb shell perfetto --time 3s --buffer 32mb --out - > out.proto
```

# traceの確認方法
以下を開いて、"Open trace file"を押してファイルを選択します。
https://ui.perfetto.dev/#!/viewer

こんな感じで見ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/5aa9f365-0021-7147-81f9-f6d4de6a8392.png)
そして左側から自分のパッケージのアプリを選択して、クリックして展開します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/a76ad1a8-6897-3bee-bdc8-8453224389e3.png)

右下に設定したMySessionがでています。
その部分を拡大して、表示することで、inflateにかかった時間や、`Trace.beginSection("MySession")`がいい感じに見れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27388/1c3fd847-d454-927d-8d3a-4ca5a0852414.png)

そして`activityStart`はアプリの起動を示すところのようです。
querySelectorAllをmapする

# スクレイピング時に手軽にリストを展開したいとき
`querySelectorAll`は`Array`ではないのでforEachはありますがmapはありません
中のコンテンツを取り出したいときにforEach+pushだと煩わしさがあるのでmapでなんとかしたいと思うでしょう。

以下の方法でmapすることができます

## サンプルコード
```js
const data = [...document.querySelectorAll('.list li')].map((node) => {
  return node.textContent
})
```
【vue.js】チェックボックスでチェックされているときとチェックされていないときでそれぞれ値を送る方法

#はじめに
最近、Rails+Vue.jsの組み合わせで使う必要があり、備忘録的につまったところを残していこうと思います。
今回はタイトルにもある通り、チェックされているときとチェックされていないときにそれぞれ値を送る方法についてまとめました。
もっと良い感じに書けるなどありましたら、コメントいただけると嬉しいです。。

#実装してみる
##erbの場合
`erb`の場合、下記で実現できます。

```erb
<%= f.check_box :is_mon_monthly_contract, {checked: child_fee.plan.is_mon_monthly_contract_target?}, :target, :non_target %>
```

これでチェックされている場合は`target`、チェックされていない場合は`non_target`が送られます。
ちなみにinput要素のチェックボックス自体にチェックされていない場合の値を指定する方法はないようです。
でも、erbでは実現できているじゃないか。。と思い調べてみたところhiddenを使用することで実現しているようです。
[Railsでオフの状態のcheck_boxの値が送信される仕組み](https://ikm.hatenablog.jp/entry/2013/12/04/185957)

上記のコードから下記のようなhtmlが展開されます。

```html
<input name="child_fee[plan_attributes][is_mon_monthly_contract]" type="hidden" value="non_target" />
<input type="checkbox" value="target" checked="checked" name="child_fee[plan_attributes][is_mon_monthly_contract]" id="child_fee_plan_attributes_is_mon_monthly_contract" />
<label for="child_fee_plan_attributes_is_mon_monthly_contract">月</label>
```

よく見ると、チェックボックスと`name`が同じ`hidden要素`があり、`value`には`non_target`とあります。
そのため、チェックされているときとチェックされていないときの処理は下記のようになります。
**チェックされていない場合**
`hidden`で設定されている`non_target`が送られる

**チェックされている場合**
`hidden`で設定されている値を上書きしてチェックボックスに設定されている`target`が送られる。

##vue.jsの場合
これをvue.jsでやる場合は下記になります。

```vue
<input v-model='child_fee.plan_attributes.is_mon_monthly_contract' id='is_mon_monthly_contract' type='checkbox' true-value='target' false-value='non_target'>
<label for="is_mon_monthly_contract">月</label>
```

[公式のドキュメント](https://jp.vuejs.org/v2/guide/forms.html#%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9-1)によると、チェックされているときの値を`true-value`に、チェックされていないときの値を`false-value`に設定すると実現できるようです。
便利。。

#終わりに
他にも便利なオプションがあったので、上手く使っていきたいです！
今後も何か気づきがあれば記事を投稿していこうと思います！

#参考にしたサイト
・[Railsでオフの状態のcheck_boxの値が送信される仕組み](https://ikm.hatenablog.jp/entry/2013/12/04/185957)
・[フォーム入力バインディング](https://jp.vuejs.org/v2/guide/forms.html#%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9-1)
[UE4] Tickについて

無駄にTickをしているActorが大きな最適化の問題の一つです。

親クラスがTickが使わなかったら、
デフォールトでTickをさせないことが良いです。

注意：
bCanEverTick=trueが設定されたネイティブC++クラスから派生したブループリントは常にティック可能です。
AActorまたはUActorComponentから厳密に派生したブループリントは常にティック可能です。
それ以外は親にmeta =（ChildCannotTick）が設定されていなくて、bCanBlueprintsTickByDefaultがtrue、または親にmeta=（ChildCanTick）が設定されている限りティック可能です。

![2019-11-21_11h06_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369484/46d57bb5-054f-575f-2b70-08eeca9aec7f.png)

そしてどうしてもTickしなきゃいけないActorの中で、Set Actor Tick Intervalを設定することがおすすめです。
![2019-11-21_11h22_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369484/ec6de465-9ed1-3da6-4082-44cd60a75117.png)


Joyeux Noël !
Xcode11でCould not hardlink copyってエラーが出る

## 環境
- Mac OS 10.15.1
- Xcode 11.1

## 事象
件名の通り。
いつエラーが出るかというと、

- コード書く
- Run
- iOS Simulator内にアプリをインストール
- アプリが起動する
- コード修正する
- iOS Simulator内のアプリをアップデート　←　ここでエラー

要は、初回のインストールはエラーが出ませんが、
2度目のRun実行でアプリを上書きしようとするとエラーが出るようです。

## 原因
原因はどうやら `Display Name` に日本語を入れてしまっていたため。
`Display Name` を英語にしたら事象の発生はなくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920/82ec9b5f-42fb-f8ef-c139-d194b7ae8779.png)

どうやらXcode11の画像の部分は、 `Display Name` ではなく `Product Name` のようですね。
ここを変更すると、　`Build Settings` にある `Product Name` が変更されます。
パッケージングされるファイル名も、 `サンプル.app` のように日本語になってしまってました。
日本語ファイル名だとうまくコピーする処理ができないのでしょうか・・・？
`Info.plist` にも `CFBundleDisplayName` の記述はありません。

## 日本語入れたい場合はどうするの

`Info.plist` の `CFBundleDisplayName` を設定しましょう。

```
	<key>CFBundleDisplayName</key>
	<string>サンプル</string>
```

## 参考
https://stackoverflow.com/questions/44649039/xcode-8-3-2-could-not-hardlink-copy
cookieとセッションとは

SMS認証に関する機能実装時に、セッションとCookieについて少し勉強したので備忘録としてメモ。

## Cookieとは

- CookieとはWebサーバとクライアント間でユーザーの状態などを維持・管理するためのHTTPの仕組み。

HTTPは本来、“状態”を持たないプロトコルであり、セッションという概念を持っていない。
そのため、例えば同じGET要求に対して（同じURLの表示要求に対して）、ログイン前とログイン後で表示する内容を変えたいとしても困難である。
このような問題を解決するために導入されたのがCookieの機能。
最初にWebサーバ側からクライアントへ小さな“データ片”（これをコンピュータの分野では「クッキー」と呼ぶ）を渡し、以後のやりとりでは必ずそのデータをクライアント側からサーバ側へ戻してもらうようにする。
かつ、それにはクライアントやユーザーごとにユニークなデータを含めるようにする。




## セッションとは

- セッションとは接続を確立してから切断するまでの一連の通信のこと。

セッションに保存された内容は、Webブラウザを閉じるまでWebサーバーにファイルとして保存されており、リンクなどを張ってページを移動しても内容を保持することができる。
ユーザーのWebブラウザにはセッションID(無作為な英数字)がCookieに記録される。
セッションIDとWebサーバー上のファイルが照合されてセッション内容を取り出す。




自分なりに解釈してまとめると、セッションはユーザーの通信情報を保持しており、webブラウザを閉じるまでWebサーバーにファイルとして保存。セッションIDはユーザーのWebブラウザでCookieに記録されており、セッションIDとWebサーバー上のファイルが照合されてセッション内容を取り出す。


参考URL
https://qiita.com/hththt/items/07136ad74127999df271
https://www.atmarkit.co.jp/ait/articles/1704/20/news024.html
LaravelでVue.jsからのFormData(multipart/form-data)のPUTを受け取れるようにする

# 問題
Vue.jsから`put`で`FormData`を送った際にLaravelで`$request->all()`が空となってしまいました。

## Vue.jsのコード
``` .js
edit () {
  const formData = new FormData()
  formData.appned('photo', this.photo)

  axios.put(`/api/photos/${this.$route.params.photoId}`, formData)
   .then(res => {
     console.log(res)
   })
   .catch(err => {
     console.log(err)
   })
}
```

``Request Headers``の``Content-Type``は``multipart/form-data; boundary=XXXXX``のようになっています。

## Laravelのコード
``` .php
public function update(Request $request, $id)
{
    dd($request->all());
    // []
}
```
``$request->all()``が空でした。

## Laravelの問題？
issueでありました。(https://github.com/laravel/framework/issues/13457)
~~Laravelの問題何でしょうか？~~
コメントで教えていただきました。すみません。issueをちゃんと読んでいませんでした。
PHPの問題のようです。(https://github.com/laravel/framework/issues/13457#issuecomment-341973180)

# 対処法
`axios.post`とし、`Request Headers`に`'X-HTTP-Method-Override': 'PUT'`と追記しました。
`POST`で送って`PUT`に変換すると受け取ることができました。

``` .js
edit () {
  const formData = new FormData()
  formData.appned('photo', this.photo)
  
  // ↓ POSTで送る
  axios.post(`/api/photos/${this.$route.params.photoId}`, formData, {
    // ↓ headersを追記
    headers: {
      'X-HTTP-Method-Override': 'PUT'
    }
  })
   .then(res => {
     console.log(res)
   })
   .catch(err => {
     console.log(err)
   })
}
```

# 参考
[axiosを使ってfile属性をPUTで投稿](https://qiita.com/bonobono555/items/dfc7b38db579c27a72b3)

# 感想
自己解決能力が上がってきていてうれしいです。
ProgateでPython(辞書、while文、break、continue)

#python progate 学習コースⅡ
##辞書
*辞書のリストの要素取り出し方*
for文を用いてリストを取り出し処理を行う
**for 変数名 in 辞書:**
ここで変数に要素のキーが一つずつ代入され、要素の値はキーが代入された変数を用いて取り出せる。
##while文
*while文の書き方*
ある条件に当てはまる間繰り返し処理
**while 条件式:**
変数の値を更新し処理の前にチェック
Falseであれば処理終了
無限ループにならないように注意、特にインデントに気をつける
###break
繰り返し処理を強制終了させる、if文などの条件分岐、while文などに用いる

numbers = [1,3,5,7,9]
for number in numbers:
  print(number)
  if number == 5:
    break

console
1
3
5

###continue
breakとは違いその週の処理だけをスキップする

numbers = [1,2,3,4]
for number in numbers:
  if number % 2 == 0:
    continue
  print(number)
    

console
1
3
python で虹色の6桁カラーコードを生成

# 動機
グラフを描く時、カラフルに点や線の色を変えたくなったのですが、グラフ描画ツールの色パレットには数種類しか色が用意されていなかったりします。
そこで、虹色のカラーコードを自分で生成できるようにしました。

#コード
```python
import colorsys

HSV_tuples = [(x*1.0/N, 1.0, 1.0) for x in range(N)]
RGB_tuples = ['#%02x%02x%02x' % (int(x[0]*255), int(x[1]*255), int(x[2]*255)) for x in list(map(lambda x: colorsys.hsv_to_rgb(*x), HSV_tuples))]
```

## 生成結果
N=24で生成した結果

```
['#ff0000', '#ff3f00', '#ff7f00', '#ffbf00', '#ffff00', '#bfff00', '#7fff00', '#3fff00', '#00ff00', '#00ff3f', '#00ff7f', '#00ffbf', '#00ffff', '#00bfff', '#007fff', '#003fff', '#0000ff', '#3f00ff', '#7f00ff', '#bf00ff', '#ff00ff', '#ff00bf', '#ff007f', '#ff003f']
```
![bokeh_plot (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397748/7c654c0b-1e3e-bb8e-d277-80d56eb3d74c.png)
aws-session-token を取得して環境変数に入れるシェルスクリプト

# aws-session-token を取得して環境変数に入れるシェルスクリプト
## 経緯
AWS のIAMでは設定で[MFA認証を強制させるポリシー](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_users-self-manage-mfa-and-creds.html#tutorial_mfa_step1)を作成することができます。
AWS CLIから利用する際にはコンソールから発行できるアクセスキー（アクセスキーとシークレットキー）を`~/.aws/credentials` に発行されたキーを登録して利用します。しかし、MFAを設定している場合には、このアクセスキーを利用して[一時的なトークンを取得](https://aws.amazon.com/jp/premiumsupport/knowledge-center/authenticate-mfa-cli/)し、これを利用してCLIを利用することになります。

いちいち取得した変数を登録するのが面倒だったため関数を作成してbashrcに追加しておくことで、その作業を楽にしました。

## 設定
1.まず、自分のMFAデバイスのarnを取得します（`MFA デバイスの割り当て` のARNです）。IAMのユーザの項目から探すことができます。
  ![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250213/5ef41032-6eb2-54a5-89f6-a89f157f10db.png)
2.`~/.aws/confing` に`mfa-device`を追記します。

```
[profile hogehoge]
region = ap-northeast-1
output = json
mfa-device = arn:aws:iam::************:mfa/user #この行
``` 

3.bashrc に以下を追記します。

```
set-awssession-token() {
	profile_name=$1
	code=$2
	
	mfa_device=$(cat ~/.aws/config | grep -A 4 $profile_name | grep mfa-device | cut -f 3 -d " ")
	session_token=$(aws sts get-session-token --serial-number $mfa_device --token-code $code --profile $profile_name)
	export AWS_ACCESS_KEY_ID=$(echo $session_token | jq -r .Credentials.AccessKeyId)
	export AWS_SECRET_ACCESS_KEY=$(echo $session_token | jq -r .Credentials.SecretAccessKey)
	export AWS_SESSION_TOKEN=$(echo $session_token | jq -r .Credentials.SessionToken)
}

release-awssession-token() {
	export -n AWS_ACCESS_KEY_ID
	export -n AWS_SECRET_ACCESS_KEY
	export -n AWS_SESSION_TOKEN
}
```

4.設定が完了しました。

```
source ~/.bashrc
set-awssession-token hogehoge {{ MFA_CODE }}
```
  とすることで一時的なトークンが環境変数にセットされるので心置きなくCLIが叩けるようになります。
for文で繰り返し ❏Ruby❏


第三段はforさんです。

#使い方

```ruby
for 変数 in 配列またはハッシュ
  処理
end
```

#配列の場合

```ruby
fruits = ["バナナ","リンゴ","パイナップル","キウイ","イチゴ","モモ"]

for fruit in fruits
  puts fruit
end
```

これですべてのフルーツが出力されます。

#ハッシュの場合

```ruby
banana = {name: "バナナ", price: 100}

for key, value in banana
  puts "#{key}は#{value}です。"
end
```

出力結果
`nameはバナナです。
 priceは100です。`

#数字の範囲の場合

ここからここまでという指定もできます。

```ruby
for num in 1..100
  puts num
end
```

1..100
で1から100までという意味です。

a..zとかもできます。


<br>
ではまた！
[UE4] 全ブループリントで検索

プロジェクトのあるブループリントでCTRL+Fを押して、検索したい関数か変数の名前を入れてたら、右にあるゴーグルをクリックしたら、プロジェクトの全てのブループリントで検索できるようになります。
![2019-11-21_10h48_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369484/f8006eb3-8542-df3f-a8ef-396b8c95be22.png)
![2019-11-21_10h49_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369484/b85b1309-c68e-8028-8242-791d27027e5e.png)
nuxt

```vuejs:index.vue
<template>
<div>
  <input type="text" @input="updateItem" :value="item"/>
  <div> {{item}}</div>
</div>
</template><script>
import { mapState } from 'vuex'export default {
  computed: {
	  ...mapState({
	    item: state => state.item
	  })
	},
  methods: {
    updateItem: function (e) {
      this.$store.commit('updateItem', e.target.value);
    }
  }
}
</script>
```

```javascript:store/index.js
export const state = () => ({
  item: '',
})
export const mutations = {
  updateItem(state, item) {
    state.item = item;
  }
}
```
/etc/selinux/configについて

#/etc/selinux/configとは？
SELinuxについて設定するファイル

##SELinuxとは？
OS管理下のリソースへアクセスすることを監視・制御するところ
なので、/etc/selinux/configとは、OSリソースへアクセスすることを制御するところを指します。

##確認するには？
###getenforceコマンドの利用
現在のSELinuxの状態が表示されます。

```
# getenforce
Permissive
```
| 表示               |  説明　　　　       　　　　　　　　　　　　　　　　   |
|:------------------|:----------------------------------------------------|
| Enforcing | SELinuxのポリシールールが強制されている状態  　　     　|
| Permissive | SELinuxのポリシールールが強制されておらず、 DACルールのみ利用されている状態　 |
| Disabled | SELinuxが無効状態        |


###sestatusコマンドの利用
現在の状態と合わせて設定ファイルの状態も出力されます。

```
# sestatus
 SELinux status:                 enabled
 SELinuxfs mount:                   /sys/fs/selinux
 SELinux root directory:         /etc/selinux
 Loaded policy name:             targeted
 Current mode:                   permissive
 Mode from config file:          error (Success)
 Policy MLS status:              enabled
 Policy deny_unknown status:     allowed
 Max kernel policy version:      31
```



##引用

エンジニアの入り口　SELinuxとは
>https://eng-entrance.com/linux-selinux

RedHat 公式：SELinuxの無効化および有効化
>https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/security-enhanced_linux/sect-security-enhanced_linux-working_with_selinux-enabling_and_disabling_selinux

【図解/初心者向け】SELinuxとは？
>https://milestone-of-se.nesuke.com/sv-advanced/selinux/selinux-summary/

SELinuxの状態を理解する
>http://2done.org/72.html

以上がSELinuxについてでした。
最後までお読みいただきありがとうございました！
A-FRAME: 物理演算でボーリングっぽい動きを実現してみる１（ボールの速度）

A-Frameをつかって物理演算ができるようにしてみます。
個々の設定値がどういう意味で、何をどう設定したらどんな効果があるのかを検証していきます。
最終的にはボーリングっぽい振る舞いをさせる為の設定値を見出すことを目標にします。

今回はボールに与える速度を検証します。

レーンとピンとボールをシーンに用意します。
ボールに速度を与えます。
速度を変更した例を以下に掲載します。

### 例１）z方向に-20

ひとまず-20で設定してみます。
手前から奥に行ってもらう為にz軸にマイナスの力を与えます。
![velocity1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/730d79db-362c-470a-e85b-912c7d34502e.gif)
[demo](https://k38.github.io/aframe/physics-system/velocity_1.html)
ボールがピンに押し返されています。
たまにこういう人もいますが、ちょっと弱いですね。

### 例２）z方向に-200

先ほどは弱すぎたので、とりあえず10倍ぐらいにしてみましょう。
![velocity3-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/07108282-6db6-fbbb-ebfb-1fba235e86ff.gif)
[demo](https://k38.github.io/aframe/physics-system/velocity_30.html)
やりすぎました。

### 例３）z方向に-80

このぐらいでしょうか。
![velocity2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/f87eedaa-6805-336b-c8ec-f8ca5179406c.gif)
[demo](https://k38.github.io/aframe/physics-system/velocity_10.html)
いい感じです。

## まとめ

速度としては-80ぐらいで検証を進めることにします。
今後の課題としてはこれらをなんとかしたいなと思います。

- ボーリング場にくらべてボールの減速がはやい気がする
- ピンが倒れても起き上がるのがなんとも言えない気持ちになる

## 参考

- [利用した物理演算ライブラリ](https://github.com/donmccurdy/aframe-physics-system)
- [ピンのモデル - Bowling Pin, MSerdar Tekin](https://sketchfab.com/3d-models/bowling-pin-028ccb945012460aa9056ffda5b53e20)
pugのbug（else）

今日はpugの話。
bugではないかもしれないですが、ちょっとハマったので備忘録。
else 文がうまく動かないときがある。(ifだけなら動いた)

```pug
table
  - for (var parent = 0; parent < 2; parent++)
    - for (var child = 0; child < 2; child++)
      tr
        //- こっちは普通に動く
        - if(child == 0)
          if(parent == 0)
            td(rowspan='2') hoge
          else
            td(rowspan='2') fuga
        
        //- ここに不要な1文を入れないとなぜかバグる（if(true)）
        - if(true)
          if(child == 0)
            td foo
            td bar
          //- 最後の行
          else
            td baz
            td qux
```

|こういう|表を|作りたかった|
|---|---|---|
|hoge|foo|bar|
|(hoge)|baz|qux|
|fuga|foo|bar|
|(fuga)|baz|quz|

---

pugのbug。（言いたかっただけ）
複数コマンドの実行

#選択実行(ANDとOR)
１つのコマンド実行単位が成功したときに後続する文を実行するときは、&&で文を実行する。
最初の文の実行が失敗した時のみ後続する文を実行するときは||で文を接続する。

```zsh

$command1 && command2  #1が成功した時のみ2が実行される。
$command1 || command2  #1が失敗した時のみ2が実行される。
```
また、３つ以上繋げられているとき、&&と||に優先順位はなく、左から順に評価される。ただ、（）でくくったらそれが先に評価される。

#連続実行
最初の文の実行終了後（その終了値に関わらず）、次の文を実行するには`;`で文を接続する。

#バックグラウンド実行
文末に`&`をつけて実行した文はバックグランド実行される。

####参考文献
- 『zshの本』p302~
Sass Mapで同じスタイルの繰り返し記述を省略する


```app.scss

.footer {
  padding: 70px 0;

  @mixin btn($color) {
    display: block;
    padding: 20px 30px;
    color: #fff;
    border-radius: 6px;
    cursor: pointer;
    background-color: $color;
    text: {
      decoration: none;
      align: center;
    }
  }

  $map: (
    facebook: #4668b3,
    google: #de5745,
    twitter: #2fbbed,
    pinterest: #d94348,
    behance: #3079ff,
    dribbble: #eb6397
  );

  &__sns {
  	&__list {
  	  display: flex;
  	  justify-content: space-between;
  	  flex-wrap: wrap;

  	  & > li {
  	    width: 32%;
  	    &:nth-child(n+4){
  	  	  margin-top: 20px;
  	    }
  	  }
  	}

  	&__btn {
  	  @each $class, $color in $map {
     	&.is-#{$class}{ // ★
      @include btn(map-get($map, $class));
  	  	}
  	  }
  	}
  }
}

```
:star: ここをハッシュで書く理由。

&.is-#{$class}
:fist_tone3: Sassは補完を行うための構文として#{}を用意している。
変数に入った文字列は通常は値として認識されてエラーが出てしまうので、そのままだとプロパティの値にしか使用できませんが、 シャープ記号を前に置いた波括弧 #{}と組み合わせることでセレクタやプロパティ名にも使うことができるようになります。


`map-get();`  `$map`の中から`$key`に対応した値を取得する。

map操作関数について詳しくは以下 :point_down_tone4:
[Sassのmap操作をおさらいする+便利な関数をいくつか](https://blog.wadackel.me/2016/sass-map-functions/)


### 参考

[Sassを使うメリットとよく使う機能を５つだけ厳選！](https://haniwaman.com/sass/)
機械学習のデータの拡張(Data Augmentation)の参考になるサイトの私的まとめ

##データの拡張にはオンライン拡張とオフライン拡張がある。
https://nanonets.com/blog/data-augmentation-how-to-use-deep-learning-when-you-have-limited-data-part-2/
##オンライン拡張とオフライン拡張の仕組みは？
https://www.pyimagesearch.com/2019/07/08/keras-imagedatagenerator-and-data-augmentation/
##オンライン拡張とオフライン拡張のメリットデメリットは？
https://www.kaggle.com/c/datasciencebowl/discussion/12597
cross で Rust のクロスコンパイル

Rust のクロスコンパイルツール [cross](https://github.com/rust-embedded/cross) を使って Linux で windows 向けにクロスコンパイルする。
Docker関連でエラーがでたので対処法。

# 環境
Docker version 19.03.4-ce, build 9013bf583a
cross 0.1.16
cargo 1.37.0 (9edd08916 2019-08-02)
Arch Linux

# やったこと

```terminal
$ cargo install cross
$ sudo systemctl start docker
$ cross build --release --target x86_64-pc-windows-gnu
```

# エラー
Dockerのバージョンが取得できないようです。

```terminal
thread 'main' panicked at 'Unable to obtain Docker version: Error(Msg("`\"docker\" \"version\" \"--format={{.Server.APIVersion}}\"` failed with exit code: Some(1)"), State { next_error: None, backtrace: InternalBacktrace { backtrace: None } })', src/libcore/result.rs:999:5
 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
```

issueがあがっていました。
といってもバグではありません。
https://github.com/rust-embedded/cross/issues/185
単にroot権限がないから実行できないようです。
Linux の場合、 Docker コマンドを実行するには root 権限が必要であるために発生しています。
( rootless docker がすでにリリースされているようなので、今後はセキュリティ的にもそちらを使うほうがいいみたいです。)

# こうする
`cross` を実行するユーザーが root 権限なしで docker コマンドを実行できるようにすればよいようです。
Docker のドキュメントに従います。
[Manage Docker as a non-root user](https://docs.docker.com/install/linux/linux-postinstall/)

```terminal
# docker ユーザーがない場合はつくる
$ sudo groupadd docker

# docker グループにログインユーザーを追加する
$ sudo usermod -aG docker $USER

# 設定を有効化する
$ newgrp docker 
```


これで問題なくビルドすることができ、windows での動作も確認できました。


# 参考
https://github.com/rust-embedded/cross
エイリアスコマンドの使い方

#エイリアスの作成
```
alias [-option] NEWCOMMAND='OLDCOMMAND'
```

#エイリアスの確認
```
alias
```

#エイリアスの消去
```
unalias [aliascommand]
```
#エイリアスの回避
エイリアスの前に`＝`か`\`をつける。
ただし、`\`などがエイリアスの含まれているときは、回避できない。

##設定しておくべきエイリアス
```
alias ls='ls -F'
alias ll='ls -lF'
```
Internal Link Building 日本語対応化

登録したキーワードに対して自動的にURLのリンクを付けてくれるWordpressのプラグイン 「Internal Link Building」ですが、最新版では日本語の検索ができなくなってしまいました。

原因を探っていたら、この一行を旧バージョンに戻すだけで日本語対応ができるようになりました。

対象のファイルは
`wordpressのインストールフォルダ/wp-content/plugins/internal-link-building-plugin/internal_link_building.php`
です。


```php:修正前(179行目)
$needle ='@()('.$before.$name.'\b'.$after.')()@';
```
```php:修正後(179行目)
$needle ='@()('.$before.$name.$after.')()@';
```

`\b`は正規表現の単語区切り。PHPでは日本語を区切ってくれないようです。
CaboChaをMATLABからコールして係り受け解析できるか試してみた


# はじめに
係り受け解析ツールとして有名な[CaboCha](https://taku910.github.io/cabocha/)で最近係り受け解析を始めたのですが、コマンドプロンプトだと何故かうまくいかない（下図参照）、そして、それ以外のテキスト解析はMATLABのもので使い慣れているので、MATLABで一元的にすべて解析できたらなと思ってやってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/b64e5b6c-249f-a2f4-453d-a0f56e328c47.png)

↑表示の設定の問題だけな気もするんですがうまく直せず。。コマンドプロンプトではこんな状態でも、MATLABから動かしたらちゃんと解析できたのでご安心ください。


# 環境
Windows 10
MATLAB R2019b

# セットアップ

CaboChaを使うためにはMeCabも必要なので、順番にインストールしていきます。

①[MeCabの公式サイト](http://taku910.github.io/mecab/)からmecab-0.996.exeをダウンロード
Windows版の上記のファイルには辞書も一緒に入っているので、これだけダウンロードすればOKです。

②ダウンロードしたexeファイルを右クリックで「管理者として実行」し、セットアップを進める。途中、辞書の文字コードの選択画面が出てきますが、ここは**SHIFT-JIS**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/ff88e05c-9a34-a29a-1c20-dd50f122434d.png)

③[CaboCha](https://taku910.github.io/cabocha/)をダウンロード
私は最新のcabocha-0.69を取ってきました。

④②と同様に「管理者として実行」し、セットアップを進める。こちらも、文字コードは**SHIFT-JIS**を選択します。

⑤パスの設定
コントロールパネル→システムとセキュリティ→システム→システムの詳細設定の順に選択し、「詳細設定」タブの下の方にある「環境変数」をクリック。システム環境変数のPathを選択して「編集」ボタンを押しMeCabとCaboChaのパスを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/00d4ef01-18ad-07f4-142f-e39d0e343137.png)

こんな感じでパスが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/68fdb38c-4776-67ed-7936-762f24052461.png)

# MATLABからコールしてみる

先に申し上げますと、MATLABからシステムコマンドをたたいているだけなので、何ら難しいことはしていません。
「私は大きなグラスで冷たいコーヒーを飲みます」という文を係り受け解析してみましょう。

```matlab
[~,cmdout] = system('echo 私は大きなグラスで冷たいコーヒーを飲みます | cabocha','-echo');
```
```
      私は---------D 
      大きな-D     | 
      グラスで-----D 
          冷たい-D | 
        コーヒーを-D 
            飲みます 
EOS 
```

上でとってきたcmdoutの中には係り受け解析の結果が入っているので結果の保存なんかもできそうです。

```matlab
>> cmdout
cmdout =
    '      私は---------D
           大きな-D     |
           グラスで-----D
               冷たい-D |
             コーヒーを-D
                 飲みます
     EOS
     '
```

ということで下記のstrに解析したい文字列を入れていけばOK。エクセルファイルから読み込んだり、Webから取ってきたりしたものを入れても良いと思います。

```matlab

str = '私は今からここに書かれている文書を解析したいです。';
cmdin = ['echo ' str ' | cabocha'];
[~,cmdout] = system(cmdin,'-echo');
save('Result','cmdout'); % Result.matという名前で出力結果を保存
```

Live Scriptで実行すると、こんな感じで結果が返ってきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/68f128e6-f371-5322-53f1-c26117155add.png)

ひとまず今日はここまで。
# おまけ

セットアップの途中でこんなエラーが出たのですが

```
morph.cpp(187) [charset() == decode_charset(dinfo->charset)] Incompatible charset: MeCab charset is SHIFT-JIS, Your charset is UTF8
```
WindowsのスタートボタンからSHIFT-JISモデルにリコンパイルしたり、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521542/fc12f19c-ede0-f6d2-2305-da99cbd522e0.png)

[CaboChaをインストールしたディレクトリ]\CaboCha\model
にあるcharset-fileをUTF-8からSHIFT-JISに書き換えたりすることで、対処することができました。
[OCaml] MetaOCaml で IDE (Merlin) を使う方法と簡単な紹介

MetaOCaml で merlin を使う方法について。(TL;DR) やり方は最後にあります。

# スクリーンショット
こんな感じで MetaOCaml を使ってもモダンな感じで開発できるようになります。

![Screen Shot 2019-11-21 at 9.05.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8163/ee14db82-18d0-4460-009a-34c2995b74e9.png)

# Merlin: OCaml のための IDE基盤

[Merlin](https://github.com/ocaml/merlin) (ocamlmerlin) は OCaml にモダンな IDE 機能を追加するインフラで、Emacs, Vim, Visual Studio Code など多くのエディタに対応しています。
エディタ上で型チェックしたり、コード補完、定義へのジャンプなど、ストレスなく OCaml でモダンに開発するための機能がひととおり揃っています。


# MetaOCaml

[MetaOCaml](http://okmij.org/ftp/ML/MetaOCaml.html) は多段階計算のための OCaml の拡張で、簡単にいえば OCaml でマクロを安全に(型付きかつ清潔に(hygiene)) 扱えるようになるような感じです。

インストール方法やイントロダクションはこちらの記事で詳しく解説されています:　

* [BER MetaOCamlで始めるメタプログラミング(MSP)](https://qiita.com/moatom/items/1ceaa0758f5b87d89404)

また、[Qiita などで](https://www.google.com/search?q=metaocaml&lr=lang_ja) 日本の技術者界隈でも度々取り上げられている(?)ほか、プログラミング言語系の学会でも面白そうなお話が度々出てきています：

* [高レベルLLVMマクロとしてのMetaOCaml (pdf)](http://jssst.or.jp/files/user/taikai/2014/PPL/PPL6-3.pdf) 高島, キセリョーヴ,　亀山, JSSST 2014
* [MetaOCaml を使った自己反映言語のコンパイル](http://pllab.is.ocha.ac.jp/~asai/jpapers/ppl/asai14.pdf) 浅井, PPL 2014
* [MetaOCamlによるGPGPUプログラミング](https://www.researchgate.net/publication/315383555_MetaOCamlniyoruGPGPUpuroguramingu) 廣原, キセリョーヴ, PPL 2017 ポスター

研究のお話としては、ほかにトップレベルカンファレンス POPL 2017 で [Strymonas Streams: stream fusion, to completeness](https://strymonas.github.io/) という多段階計算を使った高速なインメモリストリーム処理が MetaOCaml や Scala のライブラリとして実装されています。

MetaOCaml が OCaml 本体に取り込まれる流れ ([リンク](https://discuss.ocaml.org/t/future-of-metaocaml/2120)) もあるようで、今後が注目される OCaml 処理系のひとつです。

# MetaOCaml + Merlin のインストール

[こちらの記事](https://qiita.com/moatom/items/1ceaa0758f5b87d89404) で紹介されているように OPAM で MetaOCaml の環境に切り替えて、さらに

```
opam install merlin
```

で Merlin をインストールできます。しかし、そのままでは `.< ... >.` や `~.( ... )` などの MetaOCaml 構文が構文エラーになってしまい、使えません。

```
Unbound value >.
```

```
Syntax error after unclosed struct, expecting expr
```

# Merlin で MetaOCaml 拡張を有効化

幸い、Merlin には MetaOCaml 拡張があます。 現時点で最新の `4.07.1+BER` の場合、 **.merlin ファイル**に

```
EXT meta
FLG -open Trx
```

を書いておけば普通に使えるようになります (他のバージョンだと FLG は要らないかもしれません)。 やった！

[.merlin の詳しい書き方はこちら](https://github.com/ocaml/merlin/wiki/project-configuration)。

また、Dune で使えるようにする方法は [ここ](https://discuss.ocaml.org/t/bracket-notation-in-metaocaml/4509) で議論されている方法でいけるのではないでしょうか。

それでは、ハッピー MetaOCaml ライフを！
(以上)
YAMAHA Router 各種のログインパスワード失念時にゴニョゴニョする

#大前提
シリアルコンソール接続でログイン出来る事。
config に以下の設定がなされている事。

```text
security class [1-3] on [off-on] [off-on]
```
注：1～3 と off-on は適宜使用環境に合わせる

＃肝心のパスワードは🤓
[4.10 セキュリティクラスの設定](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/setup/security_class.html)
***悪用厳禁!***
AngularでRouterModule使ってるときに新しいページを追加する方法

個人メモです。


module と componentを追加して

```
$ ng generate module users
$ ng generate component users
```

pathを追加する

```
const routes: Routes = [
  { path: 'books', component: SomeComponent },
  { path: 'users', component: UsersComponent}
];
```
今年のACLの注目単語をWordCloudで可視化してみた


# はじめに

- 最近「WordCloudで可視化してみた」という記事が結構公開されているので、自分も最近作ったWordCloudを記事にしてみました。
- この記事でのACLは自然言語処理のトップカンファレンスの１つを指しており、サッカーとは一切関係ありません。

# 可視化の意義

*学生時代のとある１日*

教授　「君、今年のACLの論文、何か面白い論文あった？」

私　「（えっ？公開されたの昨晩なんですけど？！）・・・いえ、まだ見てないです・・・」

教授　「じゃあ、来週、今年の傾向と面白そうな論文１本紹介してね。」

私　「・・・はい」

可視化しようがしまいが、結局ある程度の論文には目を通すことになるのですが、**今年の傾向**を把握するために、計算＆可視化プログラムを使って（主観だけでなく）定量的な確証を得よう、ということです。


# やりたいこと

- ある年のあるカンファレンスの注目キーワードを可視化する

ポイントは「**他の年やカンファレンスと比較して相対的にピックアップされているキーワードを抽出したい**」という点です。

そのために、WordCloudで可視化するときのスコアに、単なる頻度ではなく、TFIDFを計算して採用しました。

※ ここでのD(ドキュメント)の単位は開催年別のカンファレンスに相当し、たとえば、ACL2019がドキュメント１つ、NLP2018が１つ、・・・EMNLP2019が１つ、・・・のように扱いました。

# 手法

といっても、やっていることはレガシーな自然言語処理で、かつ記事上に公開するようなコードではないため、要点を箇条書きで記述するにとどめます。

プログラム詳細を知りたい方はGithubを参照してください。 https://github.com/kazuaki-i/acl_statistics


やっていることは以下の４ステップです。

1. [ACLアンソロジー](https://www.aclweb.org/anthology/)のメインカンファレンスのタイトルをスクレイピングする
2. IFIDFを計算するために、タイトル中に含まれる単語の出現頻度をカウントする
3. (2)でカウントした頻度を使用して、TFIDFを計算する
4. 計算したTFIDFをスコアとして、WordCloudで可視化する


気をつけた点としては、

- スクレイピングの時に、各学会のメインカンファレンスのタイトルのみを抽出するための条件の設定（ACLアンソロジーのページがスクレイピングに優しくなかった）
- 単語の頻度をカウントするときに**ステミング**する（単語を原型に戻す処理。今回はsnowballstemmerを利用した）

日本語と異なる点として、英語では単語がスペースで区切られているため、Mecabとかでやる形態素解析の処理は必要ありませんが、過去形や複数形などで変化している単語を原型に戻す「ステミング」の処理が必要です（日本語ではMecabとかが形態素解析のついでにやってくれます）。

このステミングや単語分割はもっと頑張ることができると思いますが、今回は妥協して簡単な処理のみにとどめました。

# 結果

ACL2019を可視化してみました。

![wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395743/5d6e60c7-8791-db45-f560-6420eff5a2f4.png)

Bertの影響だと思いますが、self-・・・という語が目につきます。
また、医療系のワークショップが開かれていた影響か、健康関連の単語もそこそこの大きさで存在します。

なお、2015年の結果は次のとおりです。

![wordcloud.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395743/704d1cbf-e074-677d-9b56-fb442c237490.png)

LSTMが流行りだしたころですね。はっきりとshort-termなどのそれっぽい言葉が目に付きます


ちなみにACL2019の公式？のWordCloudはこんな感じ。
![https://pbs.twimg.com/media/EA0YnFJXsAAcxUp.jpg](https://pbs.twimg.com/media/EA0YnFJXsAAcxUp.jpg)

まあ、NLP業界で当たり前に使われる語ばかりで、少なくとも2019年の特色を捉えているとは言えないでしょう（そもそもそういう目的で作ったWordCloudではないと思いますが）。


# まとめ

- この記事では、ACLアンソロジーで公開されている論文のカンファレンス・年別の特徴を定量的に把握するために、タイトルに含まれている語をTFIDFでスコアリングしてWordCloudで可視化しました。
- 大した処理はしていませんが、なにかの役に立てば幸いです。
[Blender]shape_keyをスクリプトで設定する方法

Cube.001と、Cubeの間でshape keyを設定する。
後で指定した名前の方にshape keyが挿入されます。
このサンプルの場合だと、Cube側に挿入される。

```
import bpy

objectToSelect = bpy.data.objects["Cube.001"]
objectToSelect.select_set(True)
objectToSelect = bpy.data.objects["Cube"]
objectToSelect.select_set(True)

bpy.context.view_layer.objects.active = objectToSelect

bpy.ops.object.join_shapes()
```

Blender2.8 自分用メモ
AmazonConnectのチャット機能をテストしてみた

# はじめに
先日(2019年11月)に追加されたAmazonConnect のチャットをテストしてみました。
[こちらの記事](https://pages.awscloud.com/NAMER-aware-T1-Amazon-Connect-Chat-2019-learn.html)の内容です。

仕様や応用などはまだ調査中ですが、動かすことができたので投稿します。

# 事前準備
## ルーティングプロファイルの編集
チャットするAgentのルーティングプロファイルで[Chat] にチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339600/152647dd-707e-91cc-237c-40deec1ba262.png)

 
## セキュリティプロファイルの編集
[Agent] の [数字とフロー] > [Chat test mode] > [すべて]にチェック 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339600/f9e5248f-190b-4bb9-99cb-f71f9ade3513.png)

# チャットをテストしてみる
①[ダッシュボート] から [チャットをテスト]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339600/af3b5ca6-2a10-aea7-7a67-15a260421a7b.png)


②[テスト設定]を選択し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339600/a29bfb6e-3797-2b93-6225-4e7f114774b6.png)


③ [問い合わせフロー]を任意で選択
（今回はキューに転送するだけの簡単なフローを選択）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339600/74628420-abb6-0074-0ff0-6b4416c255d2.png)


④吹き出しのキャラクターをクリックする
（事前にチャットするAgentのCPPをAvailableにしておく）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339600/5f14b5e5-e0f7-5592-f216-4f763d6073df.png)


⑤チャットが繋がって
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339600/80201711-9232-e0d6-5bc3-6e350fdf9dc2.png)


⑥やりとりできました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339600/b38c4a07-5a6e-d934-8121-c224d97465c6.png)

# 追記(2019/12)
[こちら](https://qiita.com/jkr4869/items/7cbb39c58fb35521b96e)にてサンプルコードの動かし方を記載しました。
vue 単一ファイルコンポーネントで、文字列配列を表示

templateでString arrayを表示するメモ。
v-forのindexを:keyとして使う。これがベストかは不明。。

``` vue
<template>
  <div>
    <li class="greeting" v-for="(item, index) in greetings" :key="index">{{ item }}</li>
    <button v-on:click="add">timestamp</button>
  </div>
</template>
<script>
export default {
  name: "Time",
  data: function() {
    return {
      greetings: []
    };
  },
  methods:{
    add: function(){
      this.greetings.push(new Date());
      if(this.greetings.length > 3){
        this.greetings.shift()
      }
    }
  }
};
</script>

```
Scratch3 でポケミクを歌わせる

[先の投稿](https://qiita.com/UchiwaFuujinn/items/cf455acf2aecd6e024a9)でポケミクに使えない？というコメントをいただき、Scratch3でポケミクに歌詞を送信するExtensionを作成しました。

学研「[歌うキーボード　ポケット・ミク](http://otonanokagaku.net/nsx39/)」（略してポケミク）が発売されたのは2014年、すでに5年も前になってしまいました。すでに片付けられてしまったかもしれません。そんなポケミクをScratch3から歌わせてみたいと思います。

## 学研のページより
![image.png](http://otonanokagaku.net/nsx39/img/exp.jpg)

## デモ

[デモ](https://youtu.be/2KYXkHCd1bw)をYoutube に置きました。ちなみに子供向けの設定になっていました。Pushボタンを押すとポケミクがしゃべります。

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/44eccc4f-a814-a825-43c9-62e168015f60.png)](https://youtu.be/2KYXkHCd1bw)

Scratch のプログラムは以下に置いてあります。
https://github.com/UchiwaFuujinn/UchiwaFuujinn.github.io/tree/master/scratch3midi/ポケミクテスト１.sb3

## 準備

Scratch3 はMIDI Extension を仕込んでいる[こちら](https://uchiwafuujinn.github.io/scratch3webmidi/)を利用してください。使い方は、[こちら]((https://qiita.com/UchiwaFuujinn/items/cf455acf2aecd6e024a9))の記事を参照ください。

- <b>ポケミクを[▲]+[▼]+[U]同時押しで「NSX-1モード」</b>にしてください。
- ブラウザは必ずChrome でアクセスしてください。Chrome でないとMIDIが扱えません。
- Chrome > 設定 > 詳細設定 > プライバシーとセキュリティ > サイトの設定 > MIDIデバイス > のメニューにある、
「サイトがシステムエクスクルーシブメッセージを使用してMIDIデバイスにアクセスする際に確認する（推奨）」のスイッチはオンにしてください。

## ブロック
- メッセージブロック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/8fa64535-a106-aeec-48b2-b2aa15d9b7f8.png)

テキストをシステムエクスクルーシブに変換してポケミクに送ります。３２文字までなっています。いまのところひらがなにしか対応していません。

こちらはヤマハの[Yamaha-WebMusic](http://yamaha-webmusic.github.io/)を参考にしています。

- レポーターブロック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/0c31a997-83a9-322d-a619-d963729e966b.png)

Strlen の機能です。上のメッセージブロックでポケミクに送信したひらがなの数を持っています。この数のノートオンを送ると、ひらがなを一通り歌わせることができます。

## 例

下のようなプログラムで、”あいうえお”を４分音符５つのタイミングで発音します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58417/c799277f-f773-15db-89e4-3fd37bd2dd4a.png)
Linuxのシェル技Tips（複数サーバへ同じコマンドを実行）

## 本資料の目的
* 複数サーバに対して、何かしらのコマンドを実行したい場合のTips。

## 前提条件
* コマンドを実行したいサーバへrootユーザ等でログイン可能なサーバから実行すること。
* コマンドを実行したいサーバへのログインパスワードが同じであること。
* ホスト名を指定する場合、コマンド実行元サーバから名前解決が可能なこと。
* `sshpass`コマンドが利用可能なこと。

## 実行内容
### 1行目
* `for list in`の後にコマンドを実行したいサーバを入力

### 2行目
* `do echo $list`

### 3行目
* `sshpass -p`の後にコマンドを実行したいサーバのパスワードを入力し、その後に実行したいコマンドを入力

### 4行目
* `done`

## 実行コマンドイメージ
```
[root@xxx ~]# for list in 実行ホスト1 実行ホスト2 実行ホスト3
> do
> echo $list
> sshpass -p パスワード ssh $list 実行したいコマンド
> done
```

```
例：NICの一覧を取得したい場合
[root@xxx ~]# for list in aaa bbb ccc
> do
> echo $list
> sshpass -p xxx ssh $list lspci | grep Ethernet
> done
```
VBScriptでC言語のcontinue相当の処理を行う方法

VBScriptにはC言語のcontinueやRubyのnextに相当するような、現在のイテレーションをスキップする機能がありません。
Do Whileを使うことによって、continueと等価な処理を行う事ができます。

```vb
For i = 0 To 10
  Do
    If i = 5 Then
      Exit Do
    End If
    WScript.Echo(i)
  Loop While False
Next
```

これによって、ネストが1段深くなってしまい可読性が落ちてしまいますが、どうしても今のイテレーションをスキップしたいときのテクニックとして活用ください。

なお、このテクニックはいわゆる去勢されたGOTOともつながりがあるテクニックです。
VBScriptのa = b = cには2つの解釈がある

VBScriptで書かれた以下のコードと等価なRubyコードは何でしょうか？

```vb
a = b = c
```

# 答え
そのコードが書かれているコンテキストによって、以下の2つのどちらかになる。

```rb
a = (b == c)
(a == b) == c
```

VBScriptは代入と比較の両方を1つの演算子 `=` でまかないます。
また、VBScriptは代入は式ではなく文です。
そのため、代入と比較の演算子が別々になっている言語を学んだ人がVBScriptを使うと、予想だにしない挙動に遭遇することがあります。

多くの言語では、程度にもよりますが、式と文の境界が曖昧になっており、式が要求されそうなコンテキストに文を書くことができます。
厳密に言うならば、はある言語では文として提供されている機能が、別の言語では式として提供されているということです。
Rubyは他の言語では文として提供されている多くのものが式になっていますので、サンプルとして適切です。

```ruby
# ifは文ではなく式
a = (if hoge == fuga then 1 else 0 end)

# メソッド定義ですら式になる
a = (def hoge; end)
```

ifやメソッド定義すらも式になるというRubyの仕様はJavaプログラマーなどからすると異質なものに見えます。
これらまで式にするのはやりすぎだという意見もあるかもしれません。

しかし、はるか昔に文から式になったものを私たちは受け入れ、なんの違和感もなくそれを式として扱っています。
それが代入です。

以下のコードが実行できるのは代入が式として扱われていることの証拠です。
もし、代入が文であるならば、その結果をaに代入することはできないからです。

```ruby
a = b = c
```

しかし、VBScriptでは代入は式ではなく文です。
`a = b = c` の両方の=を代入にすることはできません。

そのため、VBScriptの `a = b = c`と等価なRubyコードは `a = (b == c)` もしくは `(a == b) == c`です。
可能性は2つあります。
どのようなときに前者と解釈され、どのようなときに後者と解釈されるのでしょうか？

ここでもまた、代入は式ではなく文という仕様を思い出します。
前者は式ですが、後者は文です。
つまり、このコードが書かれたコンテキストが文が要求されるものなのか、式が要求されるものなのかによって、どちらになるのかが決まります。

```vb
' 式が要求されるコンテキスト
Call Func(a = b = c)
While a = b = c

' 文が要求されるコンテキスト
a = b = c
```
eclipse 2019-09 のバグ対応

開発環境
macOS Catalina
eclipse 2019-09
JDK11.0.5
e(fx)clipseプラグイン 3.6.0
Egitプラグイン

それは突然やってきた。

eclipse 2019-09でJavaFXプログラミングをしていた時のことであった。
普通にコンパイル＆実行できていたのに、ある時を境にjavaファイルのパッケージ宣言が
エラーで真っ赤っ赤に(´・ω・｀)

結論から言うと、フォルダ＆パッケージ構成がぶっ壊れていたのであった。

幸い、フォルダ＆パッケージ構成が壊れる前に、プロジェクトフォルダをバックアップしていたのが功を奏した。

解決策としては、以下の通り。

1. eclipseからプロジェクトを削除。
2. 別名でバックアップしていたプロジェクトフォルダを元の名前でコピー。
3. eclipseで既存のプロジェクト、もしくは既存のgitプロジェクトとしてインポート。
4. 最新のソースコードをGitにプッシュしていた場合はプルして最新のコードを取り込む。Gitにプッシュしていない場合はバックアップしていたプロジェクトからソースコード(ファイル)を上書きして。プロジェクトをリフレッシュする。

以上で正常なフォルダ＆パッケージ構成で作業を再開できます。

eclipse 2019-09以前のバージョンでも同様の現象が起きるか不明なため、Gitとは別にcpコマンド、またはtarコマンドでプロジェクトのバックアップを定期的にとっておくことをオススメします。
Ruby小ネタ

他の言語やっていた人がRubyやって、なるほどこう書くのか、と思ったものを幾つか。

### presence
```ruby:
a = b.present? ? b : nil
a = b.presence
```
上下とも同じ意味だけど、三項演算子よりも、presenceの方がRubyライク。
※ただしpresenceはRailsのメソッドなので注意
ここで、nilではなく任意の値を入れるならば「||」でいれる。

```ruby:
a = b.presence || 'hoge'
```


### ループ
```ruby:Rubyの場合
[*1..10].each do |index|
end
```

```C#:C#の場合
for(int i = 1; i<11 ;i++){
}
```
ずっとC#だったので、ループというとfor文と思ってしまうけど、Rubyは配列を回すイメージ。
そしてよくある、「この配列の中に'A'という値が含まれるか」チェックは、C#だとループ回してif文かませるパターンですが、Rubyならany?でいける。

```ruby:配列に値が含まれるか？
[*1..10].any?(4)
```
で、業務で使うとすると、こういう風にブロックを記述するパターンが汎用的。

```ruby:配列に3で割り切れる値が含まれるか？
[*1..10].any? {|index| index.modulo(3) == 0 }
```
個人的な教訓として、配列を回したくなったら、Rubyにはなにか便利なのがあるから調べたほうが良い。

### Enumerable#any?とArray#include?
コメントで教えていただいたので追記です。
`[*1..10].any?`と例に出しましたが、配列で「〇を含むか？」は`include?`があり、こちらの方が高速です。
any?の方が高速になるのは、any?にモデルなど、値以外を渡す場合になります。
※以下、教えていただいたscivola様のコードを転記いたします

```ruby:
# 数字を含む文字列はあるか
["hoge", "AE35", ""].any?(/\d/)

# 1 以上 10 未満の数はあるか
[0.2, -8, 9.80665].any?(1...10)

# 整数オブジェクトはあるか
[0.2, 7, 2/3r].any?(Integer)
```

Rubyでの記述は、同じことを実現するのに複数の種類のメソッドがありますが、「今回はどちらが高速か？」という観点も大切にします。
自分への戒めも含め、ここに記述します。
他の言語にはない、VBScriptの論理演算子

VBScriptの論理演算子には他の言語にはない独特な2つの演算子があります。
今回はそれらを紹介します。

# Eqv演算子
1つめはEqv演算子です。
[Eqv 演算子
](https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392432(v=msdn.10))

この演算子は両辺のTrue/Falseが一致しているかどうかを返します。
両辺がどちらもTrueもしくは、どちらもFalseのときにTrueを返し、そうでないときにはFalseを返します。
これは、Xor演算子の結果にNot演算子を作用させたのと等価です。
※ どちらかがNull値の場合の結果は省略

```vb
' 以下の2つは等価
a Eqv b
Not(a Xor b)
```

どのような場面でこの演算子が役に立つのか分かっていないので、上手な活用法を知っている方がいらっしゃいましたらコメントいただけますとありがたいです。

# Imp演算子
2つめはImp演算子です。

[Imp 演算子](https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392433(v=msdn.10))

この演算子は論理包含演算を行います。
命題論理を学んでない人は「論理包含 is 何？」と思うことが多いかと思います。
Wikipediaに詳しい説明がありますので、そちらをごらんください。
(論理包含)[https://ja.wikipedia.org/wiki/%E8%AB%96%E7%90%86%E5%8C%85%E5%90%AB]

Wikipediaにあるベン図より、以下がわかります。

```vb
' 以下の2つは等価
a Imp b
(Not a) Or b
```

どのような場面でこの演算子が役に立(略)
なぜVBScriptのTrueは-1なのか

以下のドキュメントによると、VBScriptのTrueは `-1` と等価です。

[True キーワード
](https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392375%28v%3dmsdn.10%29)

また、Falseは `0` と等価です。

[False キーワード
](https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392369(v=msdn.10))

一方、C言語ではstdbool.hの中で、trueを1と等価に、falseを0と等価にしています。

```c
#ifndef __cplusplus

#define bool    _Bool
#define true    1
#define false   0

#else /* __cplusplus */
```

また、JavaScriptではtrueを整数型にキャストすると、1になります。

```js
Number(true)
// => 1
```

さらに、Pythonではbool型はint型のサブタイプであり、Trueは1と等価です。

```py
True == 1
# => True
```

なぜ、C言語やJavaScriptやPythonのtrueは1と等価だったり、キャストすると1になるのに、VBScriptのTrueは-1と等価なのでしょうか？

# 答え
VBScriptにはビット演算と論理演算を同じ演算子で行うため。

C言語やRubyやPythonやJavaScriptなどの主要な言語では、ビット演算と論理演算が明確に区別されています。

```c
/* C言語 */
a = b & c /* ビット演算 */
a = b && c /* 論理演算 */
```

```ruby
# Ruby
a = b & c # ビット演算
a = b && c # 論理演算
```

```python
# Python
a = b & c # ビット演算
a = b and c # 論理演算
```

```js
/* JavaScript */
a = b & c /* ビット演算 */
a = b && c /* 論理演算 */
```

一方VBScriptでは、これら2つの演算はどちらも同じ演算子によってなされます。

```vb
' VBScript
a = b And c ' ビット演算
a = b And c ' 論理演算
```

参考: [And演算子](https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392407%28v%3dmsdn.10%29)

ここでは、And演算子のみを例に出しましたが、Or演算子やNot演算子についても同様です。

では、他の言語では別々の演算子によって提供されている機能を、VBScriptはどうやって1つの演算子のみで提供しているのでしょうか？

VBScriptにはビット演算子しかなく、TrueとFalseをいい感じに整数型にマッピングすることによって論理演算子っぽく見せているのが真相です。
そのためには、Trueをすべてのbitが1の整数に、Falseをすべてのbitが0の整数にマッピングすることが必要であり、またそうする以外にこの要件を満たすマッピング方法はありません(必要十分条件)。

さて、このように符号化されたTrueとFalseを数値型の表現に復号するとどうなるのでしょうか？
Falseが0になることは自明ですが、Trueはどうなるのでしょうか？
VBScriptの整数型は符号付き16bit整数で、負数の表現方法には2の補数形式が使われています。
そのため、すべてのbitが1の整数は-1という数値を表すことになります。

このような理由によってVBScriptのTrueは-1と等価になります。他の言語にはない珍しい仕様ですので、やや注意が必要です。
例えば、C言語のテクニックにエラー時は負数を返すというものがありますが、同様のことをVBScriptでやると罠にはまる危険性があります。
【Swift】Combine.frameworkのFutureとDeferredと即時実行、遅延実行

以前投稿した内容で
Combine.frameworkの`Future`はインスタンスを生成した時点で
中のクロージャを実行させるということについて書きました。

https://qiita.com/shiz/items/f089c93bdebfaef2196f
https://developer.apple.com/documentation/combine/future

この場合
Subscribeをしていないのに処理が実行されてしまい
無駄にリソースを消費してしまう可能性や
副作用を起こして思わぬ動作をしてしまう可能性もあります。


そういう場合`Deferred`を活用する方法があります。

https://developer.apple.com/documentation/combine/deferred

`Deferred`はinitで`createPublisher`というクロージャを受け取り
中でPublisherを生成します。
このクロージャは**Subscribeした時に初めて**実行されます。

# 検証

下記のコードをPlaygroundで実行して確認します。

まずFutureの場合

```swift

let futurePublisher = Future<String, Never> { promise in
    print("Future 実行")
    promise(.success("hello"))
}
```

この時点で

```
Future 実行
```

が出力されます。

一方`Deferred`の場合

```swift

let deferredPublisher = Deferred { () -> Just<String> in
    print("Deferred 実行")
    return Just("hello")
}
```

これだけ書いても何も実行されません。

Subscribeしてみると

```swift

let cancellable = deferredPublisher
    .sink(receiveCompletion: {
        print("receiveCompletion \($0)")
    }, receiveValue: {
        print("receiveValue \($0)")
    })
```

```
Deferred 実行
receiveValue hello
receiveCompletion finished
```

とSubscribeしてから
クロージャの中が実行されていることがわかります。

これを活用して`Future`を遅延実行させる方法が
下記の動画でも紹介されています。

※ 
下記の例は`Future`の特徴をよく表しているため引用させていただきました。

注意点として下記の例にある２番目の1729という値を受け取ることはありません。

Futureは値を一度受け取るとすぐにCompletionするため
受け取れるのは**最初の42だけ**です。

動画では値を継続的に受け取りたいため
この後Custom Publisherの生成を行っています。

https://www.pointfree.co/episodes/ep80-the-combine-framework-and-effects-part-1

```swift

let aFutureInt = Deferred {
  Future<Int, Never> { callback in
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
      print("Hello from inside the future!")
      callback(.success(42))
      callback(.success(1729))
    }
  }
}
```
※ この時点ではまだSubscribeしていないため
実行はされません。


# まとめ

`Deferred`について検証してみました。
`Deferred`を活用することで不必要な処理やセットアップなどが
実行されるリスクを減らすことができます。

また`Future`を一緒に活用することで
非同期処理の遅延実行も実現することができることもわかりました。

しかし
`Future`は値を一度して受け取らないという特徴を持っているため
使い方を知らないと

「あれっ？なんか思っていたのと違う」

となってしまう可能性もあるので注意が必要ですね😅

何か間違いなどございましたら教えていただけますとうれしいです🙇🏻‍♂️
オンライン決済サービス Stripe の API を #Ruby の pry で叩いたら JSON が見にくいので pry-doc で色付けしてみたり curl + jq を使ったりと

なんとAPI doc の例はそのまま使える一般公開のキーっぽい
https://stripe.com/docs/api/invoices/list?lang=ruby


# install pry

```
gem install pry pry-doc
```

![image](https://user-images.githubusercontent.com/13635059/69239380-66e23480-0bdd-11ea-8325-7b66e502738f.png)

# でも JSON みづらすぎ！

```
require 'stripe'
Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc'
Stripe::Invoice.list({limit: 3})
```

![image](https://user-images.githubusercontent.com/13635059/69239446-9133f200-0bdd-11ea-8493-2ef3f6ac7452.png)

# ハッシュなら色がつく


```
require 'stripe'
Stripe.api_key = 'sk_test_4eC39HqLyjWDarjtT1zdp7dc'
Stripe::Invoice.list({limit: 3}).data.map(&:to_h)
```

![image](https://user-images.githubusercontent.com/13635059/69239502-bb85af80-0bdd-11ea-83b0-d68509ee222a.png)

# curl + jq 

Ruby関係ないよ
pryの起動も大変だよ

Docs で言語や curl への切り替えが可能。

![image](https://user-images.githubusercontent.com/13635059/69239585-e7089a00-0bdd-11ea-8e2b-2db9eafa97e2.png)

curl の結果を jq にわたすと綺麗だね

`brew install jq`

`curl -s https://api.stripe.com/v1/invoices -u sk_test_4eC39HqLyjWDarjtT1zdp7dc: -d limit=3 -G | jq`

![image](https://user-images.githubusercontent.com/13635059/69239552-d35d3380-0bdd-11ea-9be6-90c375762cdb.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[PHP] 正規表現で SQL のキーワードだけを一発で大文字/小文字変換する

# 背景

`mysqldump` とかで吐き出したやつの大文字小文字を統一したいけど，いい感じのフォーマッタが見つからなかったので正規表現で雑に捌いてみた。制約として，カラム名やテーブル名などはすべてクオート記号で括られている必要があります。

<del>かっこいい正規表現が書きたかっただけです（本音）</del>

# 実装

## 関数定義

```php
function lowerCaseKeywords(string $sql): string
{
    static $regex = <<<'EOD'
    /
        ((`)|(")|('))                              (?# クオーテーション開始)
            (?:
                (?:\1\1)++                         (?# 連続で並べるクオーテーションのエスケープ)
                |
                (?:\\\1)++                         (?# バックスラッシュを頭につけるクオーテーションのエスケープ)
                |
                (?:\\\\)++                         (?# 連続で並べるバックスラッシュのエスケープ)
                |
                (?(2)[^`]++|(?(3)[^"]++|[^']++))   (?# 該当しないクオーテーションの連続)
            )*+
        \1                                         (?# クオーテーション終了)

        |

        ([^`"']++)                                 (?# 置換したい文字列)
    /x
EOD;

    return preg_replace_callback($regex, function ($matches) {
        return empty($matches[5]) ? $matches[0] : strtolower($matches[0]);
    }, $sql);
}
```

## 使用例

```php
$sql = <<<'EOD'
CREATE TABLE `Articles`(
  `ID` Bigint(20) Unsigned NOT NULL AUTO_INCREMENT,
  `Title` Varchar(191) NOT NULL default "No Title",
  `Body` Text NOT NULL,
  PRIMARY KEY (`ID`)
) DEFAULT CHARSET=utf8mb4 COMMENT='This is a table for ''Article''';

CREATE TABLE `Comments`(
  `ID` Bigint(20) Unsigned NOT NULL AUTO_INCREMENT,
  `Article_ID` Bigint(20) Unsigned NOT NULL,
  `Body` Text NOT NULL,
  FOREIGN KEY `FK_Article_ID`(`Article_ID`) REFERENCES `Articles`(`ID`)
) DEFAULT CHARSET=utf8mb4 COMMENT="This is a table for \"Comment\"";
EOD;

echo lowerCaseKeywords($sql);
```

```sql:実行結果
create table `Articles`(
  `ID` bigint(20) unsigned not null auto_increment,
  `Title` varchar(191) not null default "No Title",
  `Body` text not null,
  primary key (`ID`)
) default charset=utf8mb4 comment='This is a table for ''Article''';

create table `Comments`(
  `ID` bigint(20) unsigned not null auto_increment,
  `Article_ID` bigint(20) unsigned not null,
  `Body` text not null,
  foreign key `FK_Article_ID`(`Article_ID`) references `Articles`(`ID`)
) default charset=utf8mb4 comment="This is a table for \"Comment\"";
```
Conditionalメソッドに渡す引数は評価されない

#ConditionalAttribute

ログ用関数などによく使う`ConditionalAttribute`という属性クラスがあります。
これは、voidを返すメソッドにつけると、Defineされたシンボル（`DEBUG`とか）の状態によってそのメソッドの呼び出しを有効にしたり無効にしてくれる属性です。

```csharp:1
static void Main(string[] args)
{
    Log();
    Console.ReadKey();
}

[Conditional("LOG")]
static void Log()
{
    Console.WriteLine("YukaMaki");
}

```
#実行時評価される引数

例えば上記のようにすると、`LOG`シンボルが定義されているときのみコンソールに文字列が表示されます。では次のようにするとどうなるでしょうか？

```csharp:2
static void Main(string[] args)
{
    Log("Hello World!" + TooHeavy());
    Console.ReadKey();
}

[Conditional("LOG")]
static void Log(string msg)
{
    Console.WriteLine(msg);
}

// 処理に1秒ぐらいかかるとする
static string TooHeavy() => DateTime.Now.ToString();
```

よく見る光景です。もし、引数はちゃんと評価されているのであれば、本番ビルドでも`Log`を通るたびに無駄な処理と無駄な文字列のアロケーションがされていることになります。
果たして、引数は評価されているのでしょうか？

```csharp:3
static void Main(string[] args)
{
    Log("Hello World!" + TooHeavy());
    Console.WriteLine(isCalledHeavy);
    Console.ReadKey();
}

[Conditional("LOG")]
static void Log(string msg)
{
    Console.WriteLine(msg);
}

static bool isCalledHeavy = false;

static string TooHeavy()
{
    isCalledHeavy = true;
    return DateTime.Now.ToString();
}
```

引数の生成に副作用を持たせてみました。評価されると`isCalledHeavy`が立つので評価されたことがわかります。

```:output
False
```

結論、引数も評価されなくなりました。無駄な処理も生まれずに安心安心…というわけにはいかず、これは逆に危ないかもしれません。

```csharp:4
// OK
HogeClass hoge = null;
bool isSuccess = TryParse(ref hoge);
Log(isSuccess);

// hogeはnullのままだ！！
HogeClass hoge = null;
Log(TryParse(ref hoge));
```

下のように書いてしまうと、`LOG`シンボルの有無で全然処理が変わってしまいます。この場合、この後、Null例外が出て「リリースビルドだけばぐってる～～！！😵😵😵」になってしまうでしょう…
この場合は必要な処理が欠ける方ですが、3のソースで、Logの行が長いからと言って、引数をローカル変数に分割した場合には無駄な処理が発生する原因になりえます。

# おまけ

```csharp
string msg = "Hello World!" + TooHeavy();
Log(msg + "_"); // 引数を処理させるためにちょいと加工
```

これをコンパイルしてみます。

```c
IL_0000: ldstr "Hello World!"
IL_0005: call string Program::TooHeavy()
IL_000a: call string [System.Runtime]System.String::Concat(string, string)
IL_000f: pop
IL_0016: ret
```

しっかり呼ばれていることが確認できますね。
Conditionalメソッドは、行そのものがなかったことにされています。
`TooHeavey`が完全に副作用をもたらさない場合、JITによって消える可能性はある気はします。