OmniAICreator/Qiita-1.07M huggingface dataset:
誰でも簡単に量子計算自動化2（google colabでpsi4&RDKit）


Google Colabを活用して誰でも簡単に量子計算自動化できるようになる記事です。[前回](https://qiita.com/takashi-programming/items/71fcfb6ff12d383d7f78)はpsi4のみをColabに導入しました。今回はColobにRDKitとpsi4の両方を導入する方法について解説します。

Google Colabの使い方は[このサイト](https://future-chem.com/rdkit-google-colab/)がおすすめです。
psi4についての説明は[このサイト](https://future-chem.com/psi4-intro/)がおすすめです。
RDKitについての説明は[このサイト](https://future-chem.com/rdkit-intro/)がおすすめです。

#psi4とRDKitのインストールとimport
時間がない人やとりあえず動けばいいという人は，以下のコードを貼り付ければColab上にconda環境の構築からpsi4とRDKitのimportまでができるようになります．

```ruby:psi4_and_RDKit.ipynb

# コンダの実装
!wget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
!chmod +x Miniconda3-latest-Linux-x86_64.sh
!bash ./Miniconda3-latest-Linux-x86_64.sh -b -f -p /usr/local
# psi4のインストール
!conda install -q -y -c psi4 python=3.6 psi4
# RDKitのインストール
!conda install -q -y -c rdkit python=3.6 rdkit
#pathの追加
import sys
sys.path.append('/usr/local/lib/python3.6/site-packages/')
# psi4,RDKitのimport
import psi4
from rdkit import rdBase
```
コード各部の説明については以下を参照してください．

##conda環境の構築とpsi4のインストール
[前回](https://qiita.com/takashi-programming/items/71fcfb6ff12d383d7f78)と同様です。

1.minicondaのインストールスクリプトのダウンロード
2.スクリプトの実行権限の付与
3.インストールスクリプトを実行して/use/local下に環境構築
4.psiはpython3.7では失敗するので、python3.6のバージョンをインストール。

```
# コンダの実装
!wget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
!chmod +x Miniconda3-latest-Linux-x86_64.sh
!bash ./Miniconda3-latest-Linux-x86_64.sh -b -f -p /usr/local
# psi4のインストール
!conda install -q -y -c psi4 python=3.6 psi4
```

##RDKitのインストール
python3.7バージョンを入れようとしたのですが、こちらも失敗したので、python3.6バージョンをインストールします。
ちなみに、psi4なしではpython3.7バージョンをインストール可能です（[参考](https://future-chem.com/rdkit-google-colab/)）。

```
# RDKitのインストール
!conda install -q -y -c rdkit python=3.6 rdkit
```

##モジュール検索パスにpsi4、RDKitの場所追加

```
sys.path.append('/usr/local/lib/python3.6/site-packages/')
```

#終わりに
今回は「誰でも簡単に量子計算自動化2（google colabでpsi4&RDKit）」という記事を書きました．初心者にとってpythonの環境構築は挫折ポイントの1つですので，Google Colabを使うことで気軽に分析が始められる点は大きな利点だと思います．
[私のブログ](https://effichem.blogspot.com/)ではもっと詳細な情報や、化学系のグラフ作成方法など幅広く紹介しているので是非参考にしてみてください。
次回はGoogle Colob上で実際に計算処理を実行する方法を解説する予定です。

##参考
https://future-chem.com/rdkit-google-colab/ Google ColabでRDKit：ケモインフォマティクス用のpython環境を手軽に構築

https://effichem.blogspot.com/ 私のブログ
Ubuntuでhamachi

# Ubuntuでhamachi

魚の話ではなく、VPNサービスの話。

Minecraftとかゲームサーバーを公開するときによく使うhamachi。
Windowsだとアプリいれてログインして適当に設定して終わりだが、UbuntuなどLinuxではコマンドもあって中々覚えられない。
自分への覚書きとして記す。

## Install
debファイルを落としてきてインストール
（URLは参考から最新をもってきてね）

```bash
$ wget https://www.vpn.net/installers/logmein-hamachi_2.1.0.203-1_amd64.deb
$ sudo dpkg -i logmein-hamachi_2.1.0.203-1_amd64.deb
```
## 使い方
なんかGUIもあるらしいけどどうせSSHでしか使わないしコマンドで操作しましょう。

```bash
//hamachiネットワークに接続
$ sudo hamachi login

//ステータス確認
$ sudo hamachi

//ニックネームの変更
$ sudo hamachi set-nick [nickname]

//ネットワークの作成(作成すると自動的に参加するっぽい)
$ sudo hamachi create [network name]

//ネットワークへの参加
$ sudo hamachi join [network name]
```

## 参考URL
[LogMeIn download Site](https://www.vpn.net/linux)
[Hamachi for Linux の基礎](https://help.logmein.com/articles/ja/Documentation/hamachi-c-hamachi-linux-fundamentals)
ActionTextの問題とその解決策としてのactive_storage_variant_records

`has_rich_text :content`これで文章、画像などもcontentカラムに埋め込めるわけですが、
生のcontentのデータはhtml(imgタグなど)そのものではなく、画像などの埋め込み情報（どのテーブルのどのidなのか）を持っているだけです。
そして生のhtmlコードを作るには`content.to_s`を呼ぶ必要があります。

```ruby
def full_content
  self.content.to_s
end
```
こういうコードを書いてる人も多いでしょう。

1つのレコードの1つのcontentカラムに多数の画像を埋め込むこともあります。
1記事に20枚の画像があれば、20の画像(blob)インスタンスが作られます。
そして各画像をvariantでリサイズ、圧縮やwebpなど生成している場合は、
`content.to_s`が呼ばれると、20回、variantが存在するのかを確認しにいきます。
"既にvariantが存在する"というフラグなどをテーブルに突っ込めばいいのに、毎回gcpやawsなどにアクセスします。
1回あたり40msくらいかかります。20回行えば800msです。

たとえば30レコードの記事を一括でjsonでとってくる必要があり、1記事で20の画像がある場合、
`content.to_s`が30回呼ばれ、それぞれの`content.to_s`の中でvariant checkが20回行われ、
合計600回variant checkが走ります。
それで24000ms = 24秒かかります。

解決策としては、
1. 1回content.to_sを呼んだらstatic_full_contentカラムなどにその結果を保存しておく。contentが上書きされるたびに、after_saveなどでフックしてstatic_full_contentに結果を保存するようにする。一番速くなる。
2. application.rbに`config.active_storage.track_variants = true`を追記して、variantが存在することをテーブルに保存する。

2の解決策が楽です。

毎度のことながら、自分のメモでゴミのような文章ですね。明日自分で読んでも意味わからないでしょう。
Rails コントローラのコンストラクタでは super を呼ぼう

Ruby では他の言語におけるクラスのコンストラクタにあたる処理を `initialize` メソッドとして定義します。（[initialize のリファレンス](https://docs.ruby-lang.org/ja/latest/method/Object/i/initialize.html)）

Rails では典型的なコントローラを ApplicationController の派生クラスとしてつくります。そのため、コントローラの初期化を `initialize` で実装すると基底クラスの `initialize` をオーバーライドすることになります。（[ApplicationController のリファレンス](https://www.rubydoc.info/docs/rails/Rails/ApplicationController)）

リファレンスにあるとおり、ApplicationController は

```
Object
^
AbstractController::Base
^
ActionController::Metal
^
ActionController::Base
^
Rails::ApplicationController
```

という継承関係にあります（上に行くほど抽象的な親です）。このうちコントローラとしての初期化は主に [ActionController::Metal#initialize](https://www.rubydoc.info/docs/rails/ActionController/Metal#initialize-instance_method) で行われているようです。

したがって、`initialize` 内で `super` を呼ぶことで、基底クラスのコンストラクタを呼び出しつつも、独自の初期化処理をすることができます。（[super のリファレンス](https://docs.ruby-lang.org/ja/latest/doc/spec=2fcall.html#super)）

オーバーライドした基底クラスのメソッドを `super` で呼び出さないと、コントローラとして必要な処理が欠けてしまい、たとえばページが正常に表示されないといった不具合を招きます。

例えば、以下の例では TweetsController を初期化する際に、ツイートを埋め込むために必要な前処理をオブジェクトの初期化時に行っています。

```rb
require 'oembed'

class TweetsController < ApplicationController
    def initialize
        OEmbed::Providers.register(OEmbed::Providers::Twitter)
        OEmbed::Providers::Twitter.endpoint += "?omit_script=true"
        super // This is it
    end

    def show
        @tweet = Tweet.find(params[:id])
        @tweet_embedded = OEmbed::Providers.get(@tweet.url).html
    end
end
```

このように、 initialize 内で super によって基底クラスのオーバーライドしたメソッドを呼び出すことで、 Rails の設計に沿ったコントローラをつくることができます。

-----

このように子クラスから親クラスのメソッドを呼び出すことは、コンストラクタに限らず設計次第ではよく行われ、その是非は別としても、言語機能としてはよくあります。たとえば C++ では super キーワードこそないものの、親クラス名を明示して `AbstractClass::method()` のようにメンバ関数を呼び出すことができます。（[参考](https://marycore.jp/prog/cpp/call-super-virtual-function/)）
ReactNativeでiosアプリを作るメモ

iOSとAndroid両方のアプリを作れるReactNativeですが、エミュレータ起動の方法とか気をつけるところを忘れてしまっていたので、自分用にメモを残します。

### ReactNative
ご存知かと思いますが、ReactNativeはモバイルアプリケーションフレームワークです。
Reactのような書き方でiOSやAndroidのネイティブアプリを作ることできます。
利点は上記で、欠点は用意されてない端末の機能を使うAPIを自分で用意する必要があるところです。

端末の機能を使うAPIはある程度用意されてますが、マイナーなAPIはAndroidJavaやObjectiveC(SwiftもObjectiveCが必須)を使って自分で書く必要があります。

### エミュレータでアプリを起動
[ドキュメント](https://reactnative.dev/docs/running-on-simulator-ios.html)を読むと、プロジェクトディレクトリで下記のコマンドを実行する

```
npx react-native run-ios --simulator="iPhone 5s"
```

iPhone5sの部分はエミューレータで使う端末名になります。

※ちなみに私は上記のコマンド実行時に下記のエラーに遭遇し、[ここに載っている方法](https://qiita.com/SuguruOoki/items/3f4fb307861fcedda7a5)で解決しました。

```
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.60.dylib
```

### 実機でアプリを起動
[ドキュメント](https://reactnative.dev/docs/running-on-device)を読むと、

0.ios developerアカウントに登録（有料）
1.iosディレクトリでxcodeプロジェクトを開く
2.GeneralタブでSigninの設定をする（developerアカウントの選択）
3.buildとrunを実行

xcodeを使ったことがある人はハマらない箇所かと思います。

### buildエラー対応
遭遇したエラーと対処法を記録

エラー１

```
Module {module名} does not exist in the Haste module map 
```

エラー２

```
Getting this error: error: bundling failed: Error: Unable to resolve module `{module名}`
```

エラー３

```
npm ERR! code EISGIT
...
```

このあたり、モジュールのバグもあるが、基本キャッシュを消す下記の操作で解消

```
watchman watch-del-all

rm -rf node_modules && npm install

rm -rf /tmp/metro-bundler-cache-* 

npm start -- -- reset-cache

rm -rf /tmp/haste-map-react-native-packager-*
```

ただ、この次のエラーで2日使っても、解消方法がわからず、あきらめました

```
Native module cannot be null
```

次のアプリからはExpo使います( ´ ▽ ` ;)
VBSからのExcel操作（既オブジェクト流用、開き直し無し）

・VBSからExcelを操作します
・既にファイルオープンの場合はそのオブジェクトをそのまま使用します。開き直しはしません
・既にExcelが立ち上がっている場合はそのオブジェクトを使用します。別プロセスのExcelを使用しませんので、Bookまたがりの関数などが問題なく使用できます。

```
' VBSによるExcelファイル処理の雛型
' 既にファイルオープンの場合はそのオブジェクトをそのまま使用することで開きなおしがない。
' また新規に開く場合でも既存Excelオブジェクトを利用することで、同一のExcelプロセスとなり
' Bookまたがりの関数などが問題なく使用できる。
' 
' [xxxx] 四角カッコでくくると日本語の変数が使用できます
' 
' 
[フルパス] = "Y:\Qiita\zz.xlsx"
[シート名] = "aaa"   '☆☆☆　カタカナの「ト」が最終文字の場合、エラーになってしまいます。なぜかわかりません。

On Error Resume Next
  Set [今回APL] = Nothing  '--- 今回使用するApplcationオブジェクト ---
  Set [今回EXL] = Nothing  '--- 今回使用するExcelオブジェクト ---
  Set [既存EXL] = Nothing  '--- 既に使用しているExclオブジェクト ---
  Set [既存EXL] = GetObject(, "Excel.Application")  '--- 既存のEXLオブジェクト ---
  [既存EXL].DisplayAlerts = False                   '--- 警告表示抑止 ---
  Set [今回EXL] = GetObject([フルパス])             '--- 対象ファイルのEXLオブジェクト ---
  Set [今回APL] = [今回EXL].Parent                  '--- 対象ファイルのApplicationオブジェクト ---
  Set [今回EXL] = Nothing                           '--- 新規オブジェクトでオープンの場合は今開いたExcelは閉じられる。既存オブジェクトの場合はそのまま。---
  
  '--- 対象ExcelファイルのOPEN確認 ---
  For Each book In [今回APL].Workbooks
    If StrComp(book.FullName, [フルパス], 1) = 0 Then
      
      '--- オープン済なので当該オブジェクトを使用する ---
      Set [今回EXL] = book
      [今回APL].Visible = True
    End If
  Next
  '--- 対象Excelがまだオープンできていない ---
  If [今回EXL] Is Nothing Then
    If Not [既存EXL] Is Nothing Then
      Set [今回APL] = [既存EXL]                         '--- 既存BOOKを流用 ---
    Else
      Set [今回APL] = CreateObject("Excel.Application") '--- 新規オブジェクトを使用 ---
    End If
    [今回APL].Visible = True                             '--- 可視 ---
    Set [今回EXL] = [今回APL].Workbooks.Open([フルパス]) '--- Excelファイルをオープン ---
  End If
  [既存EXL].DisplayAlerts = True
  Set [既存EXL] = Nothing
On Error Goto 0
If [今回EXL] Is Nothing Then Err.Raise 1, "", "ファイルがオープン出来ませんでした"


'-----------------
'--- Excel処理 ---
'-----------------


Set [今回SHT] = [今回EXL].Worksheets([シート名])
  
[今回SHT].Range("A2") = "eee"





Set [今回APL] = Nothing
Set [今回SHT] = Nothing
Set [今回EXL] = Nothing
'--- END ---

```
Prometheusでfederationを実現するまで(Prometheus federation設定編)

# まえがき
https://qiita.com/sinnsa233048/items/e6bcfa97660e38007a93
の続き

# Prometheus構築/設定

1. [kube-prometheus](https://github.com/coreos/kube-prometheus.git)のマニュフェストをk8sクラスタにデプロイ
2. prometheus1サーバでのprometheusコンテナ作成
3. prometheus1サーバでのgrafanaコンテナ作成


## 使用した環境
前回からprometheusノードが追加されています。

* 使用OS: CentOS7.8
* masterノード
 * ノード名: master1
 * ipアドレス: 192.168.10.11
* wokerノード
 * ノード名: woker1
 * ipアドレス: 192.168.10.21
* prometheusノード
 * ノード名: prometheus1
 * ipアドレス: 192.168.10.31

## kube-prometheusのマニュフェストをk8sクラスタにデプロイ

https://github.com/coreos/kube-prometheus.git
のリポジトリのデプロイメントを使用します。

### gitよりクローン
```
# yum -y install git
# git clone https://github.com/coreos/kube-prometheus.git

# cd kube-prometheus
```

### マニュフェストをデプロイ
alartmanagerは今回用いないので別のディレクトリ等をを作成しておきます。

```
# mkdir manifests-not-deploy
# mv manifests/alertmanager*  manifests-not-deploy/
```

alartmanager以外のマニュフェストをデプロイ

```
# kubectl create -f manifests/setup
# kubectl create -f manifests
```

### マニュフェストを修正
今回はprometheusのポートをNodePortで公開し、外部からアクセスを行います。
(grafanaについても今回は公開します。)

* manifests/prometheus-service.yaml

`type:NodePort`
`nodePort: 30090`
を追加します。

```
apiVersion: v1
kind: Service
metadata:
  labels:
    prometheus: k8s
  name: prometheus-k8s
  namespace: monitoring
spec:
  type: NodePort
  ports:
  - name: web
    port: 9090
    targetPort: web
    nodePort: 30090
  selector:
    app: prometheus
    prometheus: k8s
  sessionAffinity: ClientIP
```

* manifests/grafana-service.yaml

こちらも同様に
`type:NodePort`
`nodePort: 30090`
を追加します。


```
apiVersion: v1
kind: Service
metadata:
  labels:
    app: grafana
  name: grafana
  namespace: monitoring
spec:
  type: NodePort
  ports:
  - name: http
    port: 3000
    targetPort: http
    nodePort: 30080
  selector:
    app: grafana
```

## prometheus1サーバでのprometheusコンテナ作成
### dockerインストール
(k8sクラスタ構築編でも使用した)docker公式のインストールスクリプトを使用します。

```
$ curl https://get.docker.com | sh

# systemctl enable docker
# systemctl start docker
```

### prometheus設定ファイル作成
k8sクラスタ内に構築したprometheusの情報をすべて取得します。

```
cat <<EOF > /tmp/prometheus.yml
scrape_configs:
  - job_name: 'federate'
    scrape_interval: 15s

    honor_labels: true
    metrics_path: '/federate'

    params:
      'match[]':
        - '{job=".+"}'
        - '{__name__=~".+"}'

    static_configs:
      - targets:
        - '192.168.10.11:30090'
EOF
```

### prometheusコンテナ起動

```
# docker run -d -p 9090:9090 -v/tmp/prometheus.yml:/etc/prometheus/prometheus.yml 
 prom/prometheus

```

## prometheus1サーバでのgrafanaコンテナ作成

### コンテナ起動
```
docker run -d --name=grafana -p 3000:3000 grafana/grafana
```

### datasource設定

`prometheus`を選択しURLに`http://localhost:9090`を指定

### dashbord設定
k8sクラスタ内に構築したgrafanaに`kubernetes-mixin`のタグがつけられたdashbordを
エクスポートし、prometheus1サーバでのgrafanaにインポートして使用。


# 最後に
2回に渡ってPrometheusでfederationを実現するやり方を紹介させていただきました。
疑問点/ご指摘等は遠慮なくいただければと思います。
必要メモリリソースを減らしたVDI環境について

#本件を投稿した理由
私はVDIシステムを設計・構築するエンジニアとなりますが、VDIシステムはコンポーネントが多いので、物理リソースが少ないと検証が上手く出来ないという課題がございました。

そのため、必要リソースを削減する方法がないかと思い、2020年のゴールデンウイークの空いた時間で検討を実施してみました。

Server Coreを使ったサーバ構築は、メーカーのサポートもされず、需要もほぼないと思いますが、今回検証してみて、自分自身色々な学びがあって良かったなと思っています。

以下が結果となりますので、暇があるときにでも確認いただければと思います。
※今後も修正していくかもです。

・Windows Server Coreを構築する上での最低限のコマンド
https://qiita.com/takeyuki14/items/b0f7e189c820c5852f9b

・WindowsのServer CoreにActive Directoryをインストールする
https://qiita.com/takeyuki14/items/f27713d82f1ca5517ca4

・WindowsのServer CoreにVMware Horizon7のView Composerをインストールする
https://qiita.com/takeyuki14/items/6eea1649f3b7ae37e3d3

・WindowsのServer CoreにVMware Horizon 7のConnection Serverをインストールする
https://qiita.com/takeyuki14/items/6bf6eaa51dec3925c3ce
ProcessingでVJ素材を作るブログ　第二回 Processingで動画を作る

#Processingで動画を作ってみよう
とりあえずウェブサイト等みて、

##動画とは
基本的なところから振り返ろう。
動画とは以下のGIFのように、連続した画像である。

https://youtu.be/jx0y9bwxlJg

Processingでは、` setup()` 関数と、` draw()` を使って、連続した画像を作成していく。

###1. setup()
**最初の一回のみ実行される関数。**
setup()には、描画する際の画面サイズ、フレームレートなど初期情報を記述する。

###2. draw()
**何回も呼ばれる関数**
draw()は何らかの脱出措置（？）を行わない限り永遠に呼ばれ続ける。
実際の絵はこの関数内で実行されるようにする。

###（3.グローバル変数）
関数ではないが、一応。
setup()とdraw（）の両方で使いたい変数であったり、draw関数が何回も実行されるため、前のdraw関数の結果を保持したい場合、グローバル変数として、setup（）の上部に記載する。例えば円を左から右に動く動画を作りたいときは、グローバル変数に円のx座標、y座標を記載する。

##今回のサンプル
概要：円を左はじ中央から右へ動かす。

内容：
グローバル変数に、x座標、y座標、円の直径を記載しておく。
setup()では、
動画のサイズ、
背景色、
線の色
フレームレート
線の幅
各パラメータの初期値を記載しておく。
※各関数の詳細はWeb等で検索してね。わからなかったらコメントよろしく。
draw()では、
1. 前のdrawで描かれた円を消すため、background()で真っ白に。
2. 円を描く。
3. 次のdraw()で少し右に描かれるようにx座標の値をいくつか加算。


```processing:sample.pde
int x;
int y;
//直径
int dia;

void setup() {
  size(1500, 800);
  background(255);
  stroke(0);
  frameRate(30);
  strokeWeight(2);
  //初期値
  x = 0;
  y = height/2;
  dia = 100;
}

void draw(){
  background(255);
  ellipse(x, y, dia, dia);
  x += 30;
 }

```
感想：
動くには動いたけど、なんかカクツキがありますなぁ。
フレームレートかな？？？

とりあえず今日はこの辺で！
golang 型switch記法


golang勉強。
型switch記法というのが本に載ってたので、動くように書いてみた。
どの値を入れるとどう返すかをint型だけにして、main　の中で直接書いてみた。

```
package main
  
import "fmt"

func main() {

        var x interface{} = 4  //この値をswitchのcaseで判定
        switch x := x.(type) {
        case int:
                fmt.Printf("%#v %T\n", x, x)
        }

        fmt.Println("Hello")
}
```


reflectを使ってtypeを判定する例

```
package main

import (
    "fmt"
    "reflect"
)

func main() {
    var x float64 = 3.4
    fmt.Println("type:", reflect.TypeOf(x))
}
```

## 参考
[Go言語の型とreflect](https://qiita.com/atsaki/items/3554f5a0609c59a3e10d)
SEGGER Embedded Studio を使ってNordic SDK内のマクロを追う

Nordic の SDK はマクロ山盛りで見通しが藪の中。
SEGGER Embedded Studio (SES) を使ってマクロを辿る方法。

# 環境

SEGGER Embedded Studio for ARM V4.18
Ubuntu 18.04 


# 事例


SDK nRF5_SDK_for_Thread_and_Zigbee_v4.0.0_dc7186b
の examples - zigbee - experimental 中の、「multi_sensor」

を改造していたら、

```

<info> app: Production configuration is not present or invalid (status: -1)
<info> app: Production configuration is not present or invalid (status: -1)
<info> app: Production configuration is not present or invalid (status: -1)
```

というのがずっと出るようになってしまいました。

デバッガで追うとm ain.c の以下の箇所で発生していることがわかりました。

```

while(1)
    {
        zboss_main_loop_iteration();
        UNUSED_RETURN_VALUE(NRF_LOG_PROCESS());
    }
```
この        UNUSED_RETURN_VALUE(NRF_LOG_PROCESS());
を実行するとデバッガで追えなくなりループ表示がはじまる。


        UNUSED_RETURN_VALUE(NRF_LOG_PROCESS());
は何をやっているのかな？
該当行を SES 上で右クリックし

Go To Definition または
Go To Declaration

を選択すると、以下のように表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a8bbb46e-fc44-e281-8c9c-8494824f5c0b.png)

読んでみると、単に ((void)(NRF_LOG_PROCESS()))を意味しているだけだった。
今度は NRF_LOG_PROCESS() を右クリックし Go To Definition を選ぶと
nrf_log_ctrl.h に切り替わり該当する以下が表示される。

```

#define NRF_LOG_PROCESS()    NRF_LOG_INTERNAL_PROCESS()
```

NRF_LOG_INTERNAL_PROCESS() を更に追うと

nrf_log_ctrl_internal.hの

```
#define NRF_LOG_INTERNAL_PROCESS() nrf_log_frontend_dequeue()
```

となり、
nrf_log_frontend_dequeue() を右クリックし Go To Definition を選ぶと

nrf_log_frontend.c の

```

bool nrf_log_frontend_dequeue(void)
```

が出るので
そこにブレークポイントを設定しデバッグできる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/52eb5dc9-3a3e-d8f7-b95f-c254c955c19b.png)


# 事例の顛末

なお、今回は

UNUSED_RETURN_VALUE(NRF_LOG_PROCESS());

を追っていったが肝心のメッセージが出る原因はここではなかったようだ。
それ以前に実行設定された Zigbee スレッドからのシグナル処理の結果、以下の箇所で出力されるらしい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6ba1d143-1df5-776c-548b-0a27a07f099a.png)

更に、メッセージが無限ループするのはソフトの問題ではなく、ハードウェアの問題で起動直後にリセットがかかっていたのが原因でした。

お騒がせ様！
UnrealEngine4のお勉強⑤DefaultPakFileRules.iniについて

この記事では[「UnrealEngine4のお勉強③DLC機能を実装する」](https://qiita.com/kotarotaro_A/items/97140ec8f9e4ddd7738c)で作成したプロジェクトをもとに、
DefaultPakfileRules.iniファイルの使い方について説明していきます。
UE4のPrimaryAssetLabelやpak分割についてまだわからないという方は先にそちらの記事をお読みください。

### はじめに
さて、先述の記事ではPrimaryAssetLabelを用いてプロジェクト内のコンテンツを以下の3つに分けました。

- pakchunk0.pak
- pakchunk1.pak
- pakchunk2.pak

そして
apkにはpakchunk0.pak
dlcにはpakchunk1.pakとpakchun2.pak
がそれぞれ入っている状態です。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212804/09df5cf8-926f-4489-0880-8c4ff04e364b.png)

ちなみにですが、pakファイルの中身を確認したい場合は、
Epic Games\UE_4.24\Engine\Binaries\Win64にあるUnrealPak.exeを使って
コマンドプロンプトで下記のように実行すると取得することができます。

```
UnrealPak.exe -list [対象のpakファイルへのパス]
```


### DefaultPakFileRules.iniの機能
名前の通り、pakファイル生成時のルールに関するiniファイルで、
現状自分が試してできたことは下記です。

- ChunkIDの設定を上書きすることができる
- ビルド時のパッケージングの対象から外すことができる
- プロジェクト内、エンジン内、すべてのファイルに対して設定可能
- ビルドプラットフォーム、コンフィギュレーションごとに設定可能

使い方や記述の説明はエンジン内の下記ファイルに記載があります。
Epic Games\UE_4.24\Engine\Config\BasePakFileRules.ini

### 使い方

まず、プロジェクトのConfigディレクトリ内にDefaultPakFileRules.iniというファイルを作成します。
そしてそのiniファイルの中にどんどん設定を書き加えていきます。

1.特定のファイルのChunkIDを変更する

```ini:DefaultPakFileRules.ini
[OverrideWBP]
bOverrideChunkManifest=true
OverridePaks="pakchunk0"
Platforms="Win64"
Targets="Development"
+Files=".../DlcSample/Content/pak1/WBP_LevelPak1.uasset"
+Files=".../DlcSample/Content/pak2/WBP_LevelPak2.uasset"
```

上記の設定は、ChunkID=1とChunkID=2にそれぞれ設定した
WBP_LevelPak1.uassetとWBP_LevelPak2.uassetを
ChunkID=0に上書きします。

UnrealPak.exe -listで確認すると、どちらのファイルもpakchunk0.pakに含まれていることがわかります。
（結果を貼るのはめんどくさいのでご自身でご確認お願いします）

例えばこのように変更すればpak1以下をまるっとChunkID=0に変更して、pakchunk1.pakはなくなります。

```
+Files=".../DlcSample/Content/pak1/*"
```

2.特定のファイルをパッケージの対象から除外する

``` ini:DefaultPakFileRules.ini
[ExcludeWBP]
bOverrideChunkManifest=true
bExcludeFromPaks=true
Platforms="Win64"
Targets="Development"
+Files=".../DlcSample/Content/pak1/WBP_LevelPak1.uasset"
+Files=".../DlcSample/Content/pak2/WBP_LevelPak2.uasset"
```

上記の設定は、ChunkID=1とChunkID=2にそれぞれ設定した
WBP_LevelPak1.uassetとWBP_LevelPak2.uassetを
パッケージから除外します。

UnrealPak.exe -listを用いて中身を見ると、どちらもpakファイル内に含まれていないことがわかります。
（結果を貼るのがめんどくさい（以下略

3.プロジェクト内、エンジン内、すべてのファイルに対して設定可能
こちら今までの例で指定していたファイルの個所をPlginsに変更すればプラグインを

```
+Files=".../DlcSample/Plugins/hogehoge"
```

Engineに変更すればエンジン内のコンテンツを

```
+Files=".../Engine/Content/hogehoge"
```

それぞれ設定の変更を実施することが可能です。

### 終わり
ちょっと説明がいきない手抜きになってしまった感ありますが、DefaultaPakFileRules.iniは便利な設定ファイルだと思っています。
次回バージョンアップに必要なコンテンツをプロジェクトに入れたけどまだ公開したくない場合、
androidで利用したけどiOSでは利用していないプラグインをそれぞれパッケージから外したい場合、
などなど、プロジェクトをいじらずにiniファイルからその設定をちょこちょこっといじれます。
【Git】Gitの基本操作と基本コマンド3

[【Git】Gitの基本操作と基本コマンド2](https://qiita.com/soehina/items/fef479851f72bfc63ef3)の続き。

#GitHubでの開発の流れ
GitHubでの開発手順。

#プルリクエスト
自分の変更したコードをリポジトリに取り込んでもらえるように依頼する機能。

###手順
1. masterブランチを最新に更新
2. ブランチを作成
3. ファイルを変更
4. 変更をコミット
5. Githubへpushする
6. プルリクエストを送る
7. コードレビュー
8. プルリクエストをmasterブランチにマージ
9. ブランチを削除


##GitHub Flow
GitHub社が用いているワークフロー。

###流れ
1. masterブランチからブランチを作成
2. ファイルを変更してコミット
3. 作成したブランチと同名のブランチをGitHubにpush
4. プルリクエストを送る
5. コードレビューしてmasterブランチにマージする
6. masterブランチをデプロイする

※materブランチは常にデプロイできる状態で保つ。

#リベース
履歴を整えた形で変更を統合する。

```
git rebase ブランチ名
```
現在のブランチのコミット履歴を対象のブランチが指すコミットの一つ前に移動させる。

#タグ
コミットを参照しやすくするためにわかりやすい名前をつける。
リリースポイントに使うことが多い。

##タグの一覧表示
```
git tag
```
パターンを指定して表示。

```
git tag -l "201705"
```

##タグの作成
タグには以下の二種類がある。

- 注釈付き版
- 軽量版

###注釈付き版
正式なタグ。

```
git tag -a "タグ名" -m "メッセージ"
```

###軽量版
タグ名をつけるのみ。

```
git tag "タグ名"
```

###後からタグづけする
```
git tag タグ名 コミット名
```
###タグのデータを表示
```
git show タグ名
```

##タグをリモートリポジトリに送信
git push コマンドで別途指定する必要がある。

```
git push リモート名 タグ名
```

###ローカルにあってリモートにないタグを一斉送信
```
git push origin --tags
```

#スタッシュ
作業を一時避難する。
コミットしたくない場合などに使う。

```
git stash
```

##避難した作業の確認
```
git stash list
```

##避難した作業の復元
```
git stash apply
```

###ステージの状況も復元する
```
git stash apply --index
```

###特定の作業を復元する
```
git stash apply スタッシュ名
```
スタッシュ名は git stash list で確認できる。

##避難した作業の削除
```
git stash drop
```

###特定の作業を削除する
```
git stash drop スタッシュ名
```

###全作業を削除する
```
git stash clear
```
#まとめ
gitでの基本操作と基本コマンドを確認してきました。
頭ではわかっていても手を動かさないと理解は深まりませんので、意識して使っていく必要がありますね。

ではでは。
Windows用VirtualBoxで64BitOSが認識されなくなった時の対処方法

### Windows用VirtualBoxで64BitOSが認識されなくなった時の対処方法

少し前にメインPCで使用していたWindowsPCのVirtualBoxファイル（vdiファイル。ゲストはCentOS64bit）を在宅勤務用PCにインポートしようとしたが、その時、64BitOSが認識されなくなるという問題に直面した。ネット上には「Hyper-Vを無効にすればよい」という情報が散見されたが、在宅勤務用PCはWindowsサンドボックスを使用していたこともあり、一筋縄ではいかなかった。誰かの参考にでもなればと思い、私の経験を公開してみたい。

- 環境（在宅勤務用PC）

Windows 10 Pro（バージョン1909）64Bit版（Intel CPU使用でBIOSのIntel-VTはEnabled状態）
VirtualBox6.1.6

- 対応

(1)Windowsの機能（表示方法はいくつかあるが「ファイル名を指定して実行」画面で OptionalFeatures 指定後、OKクリックで表示される）画面で「Hyper-V」「Windowsサンドボックス」のチェックを全て外し、OKをクリックする。なお、この際、PCを再起動するか？という確認メッセージが表示されるので、それに従い再起動を行った。（下の画面参考）<br>![VBox01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410962/7e1e1127-99c1-c569-56bb-efca62cb7b7f.png)


(2)PC再起動完了後、VirtualBoxでインポートを試みるが、64BitOSが認識されない。

(3)サービス（画面の表示方法はいくつかあるが「ファイル名を指定して実行」画面で services.msc 指定後、OKクリックで表示される画面）を確認したところ、Hyper-V関連のサービス（「HVホストサービス」「Hyper-Vで始まるサービス」）がいくつもあり、それらを全て無効にした。（下の画面参考。最初にサービスを確認した時点で各サービスの状態がどのようなものであったかは記録しておらず、忘れてしまったが、実行中のものについては停止後に無効にしている。）<br>![VBox02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410962/e5912feb-6bba-36f3-15ac-0dba7f3efdc1.png)


(4)VirtualBoxでインポートを試みるが、まだ64BitOSが認識されない。

(5)PC再起動を行い、VirtualBoxでインポートを試みると、64BitOSが認識された。

以上参考までに。
naru Pt. 2: inet:download (OSM データダウンロード)

[naru](https://github.com/unvt/naru) で OSM データをダウンロードするには、次のとおりタスクを実行します。

```zsh
rake inet:download
```

このタスクの実行にかかる [Rakefile](https://github.com/unvt/naru/blob/master/Rakefile) の記述は次の通りです。

```ruby
REGION = 'australia-oceania'
AREA = 'fiji'

namespace :inet do
  desc 'download source geospatial data to the place'
  task :download do
    u = "https://download.geofabrik.de/#{REGION}/{#{AREA}-latest.osm.pbf}"
    sh "curl -C - #{u} --output './src/#1'"
  end
end
```

[OpenStreetMap Data Extracts](https://download.geofabrik.de/) から提供されている osm.pbf ファイルを `curl` でダウンロードして、`src` ディレクトリの下に置きます。

定数 `REGION` や `AREA` の値を変更することで、ダウンロード・生産する対象を変更することができます。

REGION は africa, asia, australia-oceania, central-america, europe, north-america, south-america のような文字列です。

AREA は somalia のような文字列です。[OpenStreetMap Data Extracts](https://download.geofabrik.de/) で、ダウンロードリンクのアドレスを確認して書き換えを行うと確実です。

[`curl`](https://curl.haxx.se) は、URL を使ってデータを伝送するためのコマンドラインツール（及びライブラリ）です。
【書籍レビュー】現場で使える！Python自然言語処理入門

全体的な自然言語処理のことを知りたく購入しました。
書籍：[現場で使える！Python自然言語処理入門](https://www.shoeisha.co.jp/book/detail/9784798142685)

## 書籍概要
* 第1章：テキスト分析の目的、要素技術について
* 第2章：テキスト文の入手（スクレイピングやPDF/Wordなどから入手）、形態素分析について
* 第3章：係り受け、処理したデータの検索について
* 第4章：IBM Cloudのテキスト分析サービスを使った分析について
* 第5章：Word2VecとBERTについて

第1章の自然言語処理で使っている技術の説明は基本の一部技術ではあるが整理されていましたので頭の整理には良かった。
第5章のBERTの説明については、Web検索で引っかかる説明よりも平易な説明のせいか頭の中に入ってきやすかった。ざっくりはわかった。

## 学びになった部分
|            |        | 従来技術                               | 新技術                                                                               |
|------------|--------|----------------------------------------|--------------------------------------------------------------------------------------|
| 要素分析   | 技術   | 形態素分析                             | エンティティ抽出（人名・地名）                                                       |
|            | ツール | MeCabJuman                             | IBM NLU　※BERT プラスαでも実現可能の想定                                               |
| 要素間分析 | 技術   | 構文解析・係り受け（品詞間の関係理解） | ・関係抽出（エンティティ間の理解）・意味役割抽出・評判分析・キーワード抽出・概念抽出 |
|            | ツール | Cabocha                                | IBM NLU　※BERT プラスαでも実現可能の想定                                               |
| 統計分析   | 技術   | 単語スコア化                           | 単語ベクトル化                                                                       |
|            | ツール | TF-IDF                                 | Word2Vec                                                                             |

## 次のアクション
ざっくり必要なテキスト分析の技術、BERTについて頭の整理が出来たので良かった。
なんとなく自然言語処理についてわかってきたので、実際に自分のやりたいことを元にして手を動かす。
Google Colab で MeCab と CaboCha を使う最強の方法

実際最強かは知らないけども、自分的にこれだなって思っている方法

Google Colab の コードセルにコピペで動きます(たぶん)。`make` に少し時間がかかるのでコーヒーでも飲んで待ちましょう☕️

[Gist ソースコード](https://gist.github.com/tomowarkar/021580fa52781ed0b0d913f46c8bb7e5)

```bash:google_colab.ipynb
%%bash
# mecabとmecab-python3の依存関係をインストール
apt-get install mecab swig libmecab-dev mecab-ipadic-utf8
# mecab-pythonのインストール
pip install mecab-python3

# crfppダウンロード(cabochaの依存関係)
curl -sL -o CRF++-0.58.tar.gz "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7QVR6VXJ5dWExSTQ"
tar -zxf CRF++-0.58.tar.gz
# crfppインストール
cd CRF++-0.58
./configure && make && make install && ldconfig
cd ..

# cabochaダウンロード
url="https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7SDd1Q1dUQkZQaUU"
curl -sc /tmp/cookie ${url} >/dev/null
code="$(awk '/_warning_/ {print $NF}' /tmp/cookie)"
curl -sLb /tmp/cookie ${url}"&confirm=${code}" -o cabocha-0.69.tar.bz2
tar -jxf cabocha-0.69.tar.bz2
# cabochaインストール
cd cabocha-0.69
./configure -with-charset=utf-8 && make && make check && make install && ldconfig
# cabocha-pythonのインストール
pip install python/
cd ..
```

### 動作検証
```bash
%%bash
mecab -v
pip show mecab-python3 | grep -e Name -e Version && echo
cabocha -v && echo
pip show cabocha-python | grep -e Name -e Version 
```
```:output
mecab of 0.996

Name: mecab-python3
Version: 0.996.5

cabocha of 0.69

Name: cabocha-python
Version: 0.69
```

```python
import MeCab
tagger = MeCab.Tagger()
print(tagger.parse("隣の客はよく柿食う客だ"))
```
```:output
隣	名詞,一般,*,*,*,*,隣,トナリ,トナリ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
客	名詞,一般,*,*,*,*,客,キャク,キャク
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
よく	副詞,一般,*,*,*,*,よく,ヨク,ヨク
柿	名詞,一般,*,*,*,*,柿,カキ,カキ
食う	動詞,自立,*,*,五段・ワ行促音便,基本形,食う,クウ,クウ
客	名詞,一般,*,*,*,*,客,キャク,キャク
だ	助動詞,*,*,*,特殊・ダ,基本形,だ,ダ,ダ
EOS
```
```python
import CaboCha
cp = CaboCha.Parser()
print(cp.parseToString("隣の客はよく柿食う客だ"))
```
```:output
隣の-D        
  客は-------D
    よく---D |
        柿-D |
        食う-D
          客だ
EOS
```
子テーブルの値を where 絞り込み　Rails 

#where句で値の絞り込み
Railsで子テーブルのカラム名で where 絞り込みを行う方法です。

```
User.joins(:posts).where(posts: {work_in_progress_flag: true})
```

上記の様に、
where句内で、ハッシュ形式で記述することで
子テーブルの値で絞り込みを行う事が出来ます。

```
where(子テーブル名: {カラム名：　値})
```


#参考
>Railsガイド Active Record クエリインターフェイス
https://railsguides.jp/active_record_querying.html#%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E6%9D%A1%E4%BB%B6

Railsガイドは大事
AWSインスタンスにキーペアの代わりにパスワードログインを有効にする方法

### 【１】パスワードの設定

```bash:ec2-user、rootユーザーのパスワード変更
sudo passwd ec2-user
Changing password for user ec2-user.
New password:
Retype new password:

sudo passwd root
Changing password for user root.
New password: 
Retype new password: 
```

### 【２】パスワードログインの有効化
以下の通り、```/etc/ssh/sshd_config```の以下パラメータを変更。

```bash:/etc/ssh/sshd_config 
PasswordAuthentication yes
```


### 【３】設定反映

以下コマンドで設定反映。

```bash:
sudo service sshd restart
```
### 【４】AMIイメージで設定を残す場合

以下の通り、```/etc/cloud/cloud.cfg```の以下パラメータを変更。

```bash:/etc/cloud/cloud.cfg
ssh_pwauth: 1
```


以上
TypeScript/JavaScript/Pythonの自動言語変換の話

この記事は[GWアドベントカレンダー](https://gw-advent.9wick.com/)の[「なにか新しいことにチャレンジするカレンダー」](https://gw-advent.9wick.com/calendars/2020/67)の5/6記事です。

---


APIを策定し、SDKを作る側になると、どの言語に対応するかという悩みが出てきます。
SDKを作る労力は最小限にしたいので、できればどれか一つの言語で作ったらそれを他の言語に自動変換したいですよね。

自動変換できる！！とまでは行かないものの、結構惜しいところまで出来てるんじゃないかなというライブラリをまとめてみました。

※どのライブラリも惜しい！もう一歩！　というところで、完全に自動変換は難しそうでした。9割自動変換→のこり1割手動で治す　みたいなやり方であればうまくいきそうです。

# JavaScript -> TypeScript

Javascriptの6割の人はTypeScriptも使ったことがある・・・みたいな話もありますが、旧いライブラリはまだJavaScriptですよね。移行コストが掛かるから移行できない・・という場合、自動変換が使えたら便利かもしれません


とりあえずJavaScriptからTypeScriptに変換するのは、こちらのライブラリが便利でした。


https://github.com/gregjacobs/js-to-ts-converter

JavaScriptのASTを分解して、TypeScriptを構築し直しています。TypeScriptのコンパイルの逆ですね。型は周りから推測して〜みたいなことが書いてありますが、ほぼ役に立たず、全部anyです。
でもとりあえず動きそうだよ！ってところまでは変換してくれます。（※動くわけではないです。エラーが一部でました）

ASTは慣れればそんなに難しくないので、自分のプロジェクトに合わせて[一部スタマイズ](https://github.com/9wick/js-to-ts-converter/)みたいなこともかんたんです。


# JavaScript <-> Python

JavaScriptとTypeScriptはゆっても同じ言語でしょ？という声も聞こえてきますが、JavaScriptとPythonなら完全に別言語ですね。

これにはjiphyが良さそうでした

https://github.com/timothycrosley/jiphy

中身までは読めてないですが、これもおそらくASTを構築して変換してると思います。変換できる構文一覧が載ってるのもポイント高いです。

<img width="813" alt="スクリーンショット 2020-05-06 20.00.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/b69b2faa-817b-2257-e66c-ca21e54ccfa9.png">

この一覧に載ってるレベルのプログラムであれば問題なく動きますが、ちょっと悲しいのがclassに対応していないところ。

> Jiphy does not implement stdlib components, classes, etc. It's SYNTAX ONLY.

classが対応していないので、ほんとに小さめのプログラムで使うか、もしくはあとでclassのところを直して上げる必要が出てきます。


# TypeScript -> Java, Python, C＃

いろんな言語に対応していてすごいのがjsii
https://github.com/aws/jsii

これまでの変換はあくまでプログラム内容の変換でしたが、こいつはちょっと仕組みが違います。バックグラウンドで必ずTypeScript(というかnode.js)が動いて、それのインターフェースをJava, Python, C#に変換するよ　というものです。

Pythonの関数を呼び出してると思ったら裏で動いてるnode.jsの関数にパススルーされてた！　みたいなものです。

バックグラウンドで動く言語が1つなので、バグ遭遇率は低そうですよね。

結構画期的な仕組みで、惜しいところまで言ってるのですが、
メモリを多く食ったり、インターフェースの引数に使える型が限定的(そこは動的に言語変換されるため)だったりというデメリットもあります。

あと、なにより問題だったのは、これ専用にプロジェクトを作り出してないと、あとから対応するのが難しいってのがあります。
jsiiが定める言語仕様に沿ってプログラムを作らないといけないんですね。
例えば、

- 各言語の制約を全部引き受けるようなプログラムの書き方が必要
（pythonだけ欲しくてもjavaの制約もc#の制約も受ける）
- 命名規則が決まってる　　例：getXXX() は禁止 switchはC#の予約語なので使用禁止など
- コールバックとか、TypeScript特有の書き方は禁止
- `default export`, `export =` は禁止（おそらく名前がつかなくなるから）

などなど。
でも、最初から視野に入れて動くのであればなかなかに良いライブラリです


# まとめ

言語変換ライブラリ3つ試してみました。
どれも惜しい！って所まで来てるので、あと１〜２年もしたら完全なものができてるといいなぁと高望みしてます。
今の時期ネットでコラボ動画のクオリティアップの方法？【１】

ネットセッション企画プロジェクトを進めて行く中で動画制作上画像ソースとその音ソースを分離することにより更にクオリティの高い作品を作ることが可能になります。その理由は実際に動画の音成分をそのまま再生してみると、視聴したマイナスワン音源（この場合は動画無しのMP3）を元に自撮り動画を撮り、その動画ソースをそのままiMovie等の動画作成ツールで動画と元の音源MP3をミックスすると時間尺が合わなず音ズレを起こします。しかし動画から音ソースを分離して見ると、元の音源MP3と問題なく合うと言う現象が確認されます。（経験値なので確証は有りませんが）
以上の理由から動画から音ソースを分離作成する手順を記載いたします。

１、ダウンロードした動画を右ボタンで「サービス」『選択したビデオファイルをエンコード』を選択
![スクリーンショット 2020-05-06 19.10.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/66b20da7-09bc-2b19-3ffb-4d3e7222f07a.png)
２、しばらくすると下記ダイヤログが開くのでAudio Onlyを選択して、「続ける」をクリック![スクリーンショット 2020-05-06 19.10.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/5d694fff-7a6c-70f2-5e46-7cc961c1f750.png)
３、しばらく待つと、動画と同じフォルダ内にm4aファイルができる
![スクリーンショット 2020-05-06 19.11.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/0e291406-e28e-0acd-4182-89cb870772a0.png)
４、m4aデータを → mp3にする為、右クリック＞このアプリケーションで開く＞iTunes　をクリック
![スクリーンショット 2020-05-06 19.51.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/55597ca4-2be6-61d9-5569-0982fa3cb2ec.png)
５、iTunesに読み込まれたファイルを選択して、ファイル＞変換＞mp3バージョンを作成　をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/e2068ac2-c8c2-7efb-7adb-c11e99d9b4b7.png" width="60%">
６、デフォルトでは次の場所にmp3ファイルができる
/Users/自分のMac名/Music/iTunes/iTunes Media/Music/Unknown Artist/Unknown Album
![スクリーンショット 2020-05-06 19.19.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/6cdfb3dd-d0a1-1739-5402-d999652dcba6.png)
　と言うふうに手順としては結構手間がかかりますが必要な処理と言えます。（動画から音ソースを取り出すアプリもいくつか有ります。）
windowsのGPUでYOLOv3(TensorFlow 2.1)で物体検出をやってみた！

## 環境
windows7 64bit
Gefore GTX 680MX GPU
anaconda

##１．CUDAインストール
下記サイトからCUDA Toolkit 10.1 update2バージョンをダウンロードする
（TensorFlow2.1.0対応しているのはCUDA Toolkit 10.1のため）
https://developer.nvidia.com/cuda-toolkit-archive

インストール場合、Visual Studio Intergrationを選択しないでください

インストール成功の場合、`nvcc -V`実行すると、下記結果が表示される

```
C:\Windows\System32>nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:12:52_Pacific_Daylight_Time_2019
Cuda compilation tools, release 10.1, V10.1.243
```

## 2．cuDNNインストール
下記サイトからcuDNN for CUDA 10.1を選択してダウンロードする
（NVIDIA account必要）
https://developer.nvidia.com/cudnn

zipファイルを解凍し、
cudaフォルダをcuda765にrenameし、
「C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1」のパスにコピーする

コピー後
![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632066/fe4dc03f-d164-5554-a4a0-09921dfba6e4.jpeg)

## 3. 環境変数設定
PATHに下記cuDNNパス追加

```
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\cuda765\bin
```

## 4. condaでkeras_work作成
```
conda create -n keras_work
activate keras_work
```

## 5. tensoflowのインストール

```
conda install tensorflow
```

## 6.確認
```
(base) C:\Users\mac>activate keras_work

(keras_work) C:\Users\mac>python
Python 3.7.7 (default, Apr 15 2020, 05:09:04) [MSC v.1916 64 bit (AMD64)] :: Ana
conda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
2020-05-06 19:46:04.480481: I tensorflow/stream_executor/platform/default/dso_lo
ader.cc:44] Successfully opened dynamic library cudart64_101.dll
>>> print(tf.__version__)
2.1.0
>>> print(tf.test.is_gpu_available())
・・・
physical GPU (device: 0, name: GeForce GTX 680MX, pci bus id: 0000:01:00.0, compute capability: 3.0)
True
```


## 7.YOLOV3資材準備

Githubからソース取得

```
cd c:\temp
git clone https://github.com/zzh8829/yolov3-tf2.git
cd yolov3-tf2
```

pjreddie.comからyolo3.weightをダウンロード
※2時間かかる

```
wget https://pjreddie.com/media/files/yolov3.weights --no-check-certificate
```

上記pjreddie.comからyolov3.weights取得のは遅いのため、下記ＵＲＬもダウンロードできる
https://pan.baidu.com/s/1G2Qh-V8kyLOq4oDbTwK6HQ
提取码（パスワード）:vogw
ファイルは「yolo_tf2.1\data\yolov3.weights」

yolo3.weightファイルをyolov3-tf2パスに移動
ファイル移動したことを確認

```
(keras_work) C:\temp\yolov3-tf2>dir /B *.weights
yolov3.weights
```

## 8.変換（事前トレーニング済みのdarknet weightを変換する）

```
python convert.py --weights ./yolov3.weights --output ./checkpoints/yolov3.tf
```

## 9.確認（detection）
```
python detect.py --image ./data/street.jpg
```
![output.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632066/94f8d296-c105-7902-7847-3ed4e3d75be6.jpeg)
anyenvでtfenvを使うときのエラーを抑止する

# どんな問題の記事？

以下のような症状の方のための記事です。

- `tfenv`を`anyenv`経由でインストールしている。
- 新しいシェルを起動したとき、以下のような出力がある。

```shell
No such command 'init'
Usage: tfenv <command> [<options>]

Commands:
   install       Install a specific version of Terraform
   use           Switch a version to use
   uninstall     Uninstall a specific version of Terraform
   list          List all installed versions
   list-remote   List all installable versions
```

# 対処法は？

以下の２つからお好みの方法で対処できます。

## 対処法1. `anyenv-tfenv-init` を使う

簡単に対処したいなら(拙作で申し訳ないのですが) [anyenv-tfenv-init](https://github.com/rugamaga/anyenv-tfenv-init) をインストールすることで対処できます。
これは以下の手順で実行できます。

```shell

mkdir -p $(anyenv root)/plugins
git clone https://github.com/rugamaga/anyenv-tfenv-init.git $(anyenv root)/plugins/anyenv-tfenv-init
```

## 対処法2. `PATH` の通ったディレクトリに `tfenv-init` を作る

もしくは `PATH`の通ったディレクトリに`tfenv-init` というシェルスクリプトを配置することで対処できます。

たとえば `~/bin` にパスを通しているなら

```shell
echo '#!/usr/bin/env bash' > ~/bin/tfenv-init
chmod +x ~/bin/tfenv-init
```

とすることで対処できます。

# なぜこれが起きているの？

`anyenv` は、そこで取り扱うことができる各 `.*env` に、 `init` というサブコマンドがあることを期待する作りになっています。
これはシェルの起動に伴って `tfenv init` というコマンドが呼び出されることを意味しています。
ところが `tfenv` 側には `init` サブコマンドがありません。
そのため `tfenv init` がエラーとなり、起動時に問題の表示(=tfenvのusage)が出てしまいます。

# なぜこれが対処になるの？

実は `tfenv` のサブコマンドは利用者で拡張することができます。
そのためには `PATH`の通ったディレクトリに `tfenv-(作りたいサブコマンド)` という形式の実行ファイルを置きます。
今回は `init` というサブコマンドを実装してしまえばよいです。そこで対処法2では `tfenv-init` を作ってしまうことで対処しています。

また`anyenv` の `plugins` には実行パスが通ります。
そこで対処法1では `tfenv-init` を内蔵させた `anyenv-tfenv-init` という`anyenv`のプラグインをインストールしました。

# 長期的には？

upstreamの `tfenv` や `anyenv` のリポジトリに、この問題を議論するIssueはすでにあります。
しかし動きがないまま1〜2年ほど経っています。

https://github.com/tfutils/tfenv/issues/53
https://github.com/anyenv/anyenv/pull/81

解決したら`anyenv-tfenv-init`側は「このプラグインを消すのだ。」というアラートを出そうと思っています。
VisualStudio2019 (Community)でWebアプリを作る２

<h4>Modelの追加</h4>

１．プロジェクトを右クリック-「追加」-「新しいフォルダ」選択。フォルダ名を『Models』にする。
![2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167018/6a89c0ae-989f-41f3-838c-860037d2caee.png)

２．作成したModelsフォルダを右クリック-「追加」-「クラス」を選択。『UserInfo』クラスを作成する。
![2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167018/95542607-de26-af88-05de-02fc689b805d.png)

![2-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167018/91252868-b0d6-2851-47e8-ccf4a4bbb7a6.png)

３．作成したクラス内に変数設定。(赤枠)
![2-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167018/9ed7d81d-8b0d-f132-98b6-a2c1832588da.png)

４．「Pages」フォルダを右クリックして、新しいフォルダを作成。
　　フォルダ名は『UserInfos』にする。
![2-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167018/68024d5b-6409-e315-4032-20a66fa44418.png)

５．「UserInfos」フォルダーを右クリック-「追加」-「新規スキャフォールディングアイテム」を選択。
![2-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167018/966258a8-b004-7308-eee2-db2c3793eb12.png)

６．「Entity Framework を使用する Razor ページ(CRUD)」を選択し、「追加」ボタンを押す。
![2-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167018/98a1758e-a8db-9a5c-be7f-8a089f9befcd.png)

７．赤枠内通りのものを選択。
![2-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167018/b848fcbd-4aa8-f642-6125-58b4728258fd.png)

８．DataフォルダとWebApplication1Context.cs、UserInfosフォルダ配下に複数のファイルが出来上がる。
![2-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167018/215fc1c3-f4a2-91c3-18d0-bc655b896ace.png)

９．デバッグ実行をして、URLを書き換える。指定した画面が出ればOK。
![2-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167018/68788779-5a26-c317-2179-2799ada435ed.png)
![2-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167018/ba83248f-13c7-c351-3bb0-b1569a277f7a.png)
出来なかったら、マイグレーションしてみる。
https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/razor-pages/model?view=aspnetcore-3.1&tabs=visual-studio#pmc


ここまで、WebApplication1プロジェクトにしてたけど、次からは自分が作ってるプロジェクトを利用する。
疲れた(笑)
Macと外付けディスプレイを同じ表示にする方法

外付けディスプレイにMacBookと同じ画面を出力する方法についてです。
#やり方
<img width="1168" alt="ミラーリング1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611124/fb733c09-664a-b966-42d9-8bcdafd61b1c.png">

```

1.画面左上のリンゴマークをクリック。
2.「システム環境設定」をクリック。
3.「ディスプレイ」をクリック。

```
<br>
![ミラーリング4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611124/cd339334-6347-b8d0-6db0-375055d18ecf.png)

```
4.「ディスプレイをミラーリング」にチェックを入れる。
```
以上。
MacBookとディスプレイをつなげるだけでできると勘違いしていたので、
同じことで困った誰かの役に立てればいいなと思い投稿しました。

#参考
[Mac公式 - Mac で外付けのモニタを使う](https://support.apple.com/ja-jp/HT202351)
Laravel で MySQLのテーブルを暗号化して使う

# やること
MySQLの実際のデータが収められているファイルは暗号化されていない。これを暗号化してLaravelのcreate_tableで暗号化テーブルとして作成する記述をする。
任意のデータベースにcoffeesテーブルが存在しているとして話を進める。

* 追記： apt update ; apt upgrade でMySQLのデータベースが壊れた。要注意。



# MySQL側の設定

```SQL
select * from coffees;                                                                     
+----+---------------------+-------+--------+------------+------------+
| id | name                | price | memo   | created_at | updated_at |
+----+---------------------+-------+--------+------------+------------+
| 1  | ブレンド            | 320   | <null> | <null>     | <null>     |
| 2  | アイス              | 320   | <null> | <null>     | <null>     |
| 3  | カプチーノ          | 500   | <null> | <null>     | <null>     |
| 4  | Hot Chocolate       | 500   | <null> | <null>     | <null>     |
| 5  | Caramel Apple Spice | 500   | <null> | <null>     | <null>     |
| 6  | Vanilla Crème       | 500   | <null> | <null>     | <null>     |
+----+---------------------+-------+--------+------------+------------+
6 rows in set
```

coffeesテーブルが収められているファイルを見てみると、文字列がそのまま入っている。

```bash
## strings /var/lib/mysql/coffees.ibd
infimum
supremum
Hot Chocolate
Caramel Apple Spice
Vanilla Cr
```

このファイルを暗号化する。

## MySQL keyring_file.so のインストール

MySQLで以下のSQLを実行。

```SQL
install plugin keyring_file soname 'keyring_file.so';
```

my.cnfを変更
/etc/mysql/my.cnf の [mysqld]以下に追記

```bash
early-plugin-load=keyring_file.so
keyring_file_data=/var/lib/mysql/mysql-keyring/keyring
```

mysqlを再起動(Ubuntu)

```bash
systemctl restart mysql.service

```

# Laravelでのcreate_tableの記述

```SQL
ALTER TABLE coffees ENCRYPTION='Y'
```
を実行する記述を追加。


```php
class CreateCoffeesTable extends Migration
{
    public function up()
    {
        Schema::create('coffees', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->integer('price');
            $table->string('memo')->nullable();
            $table->timestamps();
        });
'price' => 500]);
        DB::table('coffees')->insert(['name' => 'Hot Chocolate', 'price' => 500]);
        DB::table('coffees')->insert(['name' => 'Caramel Apple Spice', 'price' => 500]);
        DB::table('coffees')->insert(['name' => 'Vanilla Crème', 'price' => 500]);

        DB::statement("ALTER TABLE coffees ENCRYPTION='Y'"); // ←ーー暗号化 ココ
    }
}
```


暗号化されているか確認

```bash
# strings coffees.ibd
f8cd72f3-155c-11ea-8341-080027c2e88e.
;r^Z
%qc%
+Uy2C
sgA 
c1B!u\
XS_W
lO"Jhi!
/#6)
&yyQ9
|[t(>
```

暗号化されている。

これで情報漏洩リスクを下げられる。

# 要注意
ubuntuでMySQL関連のアップデートがあると自動アップデートできない。
暗号化されたデータベースが壊れたので、
apt update 
apt upgrade
を行うときには必ず
mysqldumpで全データベースのバックアップを取る。
OSのアップデートが終わるとMYSQLのデータベースが壊れた状態になるので、dumpしたSQLからデータベースの回復を行う。
TwitterのAPIを利用してツイートの一括削除をしてみる

# python-twitterで闇のツイートを消す

## きっかけ
友人から中学時代のツイートのスクショが送られ、懐かしいなーと思いつつ自分の過去ツイートを見返してみるとあまりにも酷かったので一括削除しようと思いました。本当に酷く痛々しいので載せられません。

ちょうど、TwitterのAPIを触ってみたいと思っていていい機会なのでツイート一括削除をやってみました。~~(黒歴史クリーナーを使うのは負けな気がした)~~

## API利用申請

以下のサイトから、TwitterのAPI利用申請をします。
https://developer.twitter.com/en/apps

承認までかかる時間は人それぞれのようですが、私は1回では申請が通らず、1ヶ月くらいかかりました。

## Twitterデータの取得
APIから取得できるデータは、1回3200件までとのことなので今回はTwitterデータをダウンロードし、そこからデータを参照します。
以下のURLから取得できます。

https://twitter.com/settings/account

![スクショ3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404417/fcd4c307-4251-fa74-4d2e-7ad821ed17e1.jpeg)

ダウンロードしたら、その中にあるJSONファイルを確認し、Twitterのデータがダウンロードできてるかを確認します。

１ツイートの情報は、以下のようにJSONファイルに書かれています。

```tweet.json
{
  "tweet" : {
    "retweeted" : false,
    "source" : "<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>",
    "entities" : {
      "hashtags" : [ ],
      "symbols" : [ ],
      "user_mentions" : [ ],
      "urls" : [ ]
    },
    "display_text_range" : [ "0", "52" ],
    "favorite_count" : "1",
    "id_str" : "1249886861201309697",
    "truncated" : false,
    "retweet_count" : "0",
    "id" : "1249886861201309697",
    "created_at" : "Tue Apr 14 02:27:04 +0000 2020",
    "favorited" : false,
    "full_text" : "nasneのHDDガリガリ音して本格的にやばいサポート終了してるから買い替えだけどいい代替製品あんのかな",
    "lang" : "ja"
  }
}
```


## ライブラリのインストール

python-twitterをpipを使用してインストールします。

```
pip install python-twitter
```

## 削除コード

実際のPythonのコードです。
twitter.Api()には、承認後に作成するアプリの`Consumer API keys`と`Access token & access token secret`を書きます。

今回は、2016年より前の痛々しいツイートを消したいので、`created_at`が2016より小さいidを取得し、`DestroyStatus`に渡してあげます。

```delete_tweets.py
import twitter
import json

tweet_json_path = 'resource/tweet.json'
json_open = open(tweet_json_path, 'r')
json_load = json.load(json_open)

api = twitter.Api(
    consumer_key='*****************',
    consumer_secret='*****************',
    access_token_key='*****************',
    access_token_secret='*****************'
)

for n in json_load:
    if int(n["tweet"]["created_at"][-4:]) < 2016:
        api.DestroyStatus(n["tweet"]["id"])

api.PostUpdates('2016年より前のツイート削除が完了 from Python')

```

あとは実行するだけです。
これで勉強しつつ、過去の闇を葬り去ることができました。

めでたしめでたし:blush:
Float計算回路のVerilog-HDL実装について -その2(減算編)

#Float計算回路のVerilog実装
~ FPGA に載せたい ~
オレオレ実装なので間違っていても知りません

加算回路編
[Float計算回路のVerilog-HDL実装について -その１](https://qiita.com/Soleiyu/items/5bbb991de443e61e318e)

デバッグツール作成編
[Float計算回路の(ry-その１.１(float値の16進数表記)](https://qiita.com/Soleiyu/items/1fbdc78c68ad69a6d34d)

補足とLeadingZeros編
[Float計算回路のVerilog-HDL実装について -その1.5 (LeadingZeros)](https://qiita.com/Soleiyu/items/2fbd44883cfb1cdd253d)

（基本的な）減算だけ
正の数1 - 正の数2
かつ　数1 > 数2

大体前回と一緒.

## 目的
floatの勉強
float32のハードウェア実装


##浮動小数点数の減算
オレオレ浮動小数点加算回路のタイミングは下の図のように設計した.
![sub_timing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253609/32e54a82-c3b4-a95e-03ff-c9508ff5df4c.png)

以下詳細

### 1. 値の比較
数値比較を行い, 大きい方を vb(value big), 小さい方を vs(value small)へ格納する.
加算回路と異なり、符号の話が関係するので完全に大小を分離したい.

```
//TIM1
reg [31:0] vb;
reg [31:0] vs;

always @(posedge clk) begin
    // TIM1 //
    if (v2[30:23] < v1[30:23]) begin
		vb <= v1;
		vs <= v2;
	end else if (v1[30:23] < v2[30:23]) begin
		vb <= v2;
		vs <= v1;
	end else if (v2[22:0] < v1[22:0]) begin
		vb <= v1;
		vs <= v2;
	end else begin
		vb <= v2;
		vs <= v1;
	end
end  
```
指数部で大小比較
指数部が同値ならば仮数部で大小比較

### 2. 指数部距離の計算
シフト量を把握するために, 各数値の指数部距離を計算する.
他はパイプライン時に潰されないように保護する.

```
//TIM2
reg [7:0] dexp;
reg [7:0] vexp;
reg [22:0] vb2;
reg [22:0] vs2;
   
always @(posedge clk) begin
    dexp <= vb[30:23] - vs[30:23];
    vexp <= vb[30:23];

    vb2 <= vb[22:0];
    vs2 <= vs[22:0];                                                                                     
end
```

### 3. 値のシフト, 減算の準備
減算のために１を付け加えたり, 値をシフトして桁を合わせておく.
この際小さい方の数値はシフト時に切り捨てる(正しいかどうかは知らない).

```
//TIM3
reg [7:0] vexp2;
reg [24:0] vb3;
reg [24:0] vs3;
 
always @(posedge clk) begin
    vexp2 <= vexp;

    vb3 <= {2'b1, vb2};
    vs3 <= {1'b0, vssf({1'b1, vs2}, dexp)};
end
```
シフト方法は頭いい方法がまだわからないで前回のを使います.


### 4. 減算
桁は合わせているため,減算を行うのみ.

```
//TIM4
reg [7:0] vexp3;
reg [24:0] r;

always @(posedge clk) begin
    vexp3 <= vexp2;

    r <= vb3 - vs3;                                                                                
end
```

### 5. LeadingZeros処理
LeadingZeros を処理し
指数部をいじる.
LeadingZerosモジュール lzsv にて
1クロック消化される為

```
//TIM5, 6
reg [7:0] vexp4;
reg [7:0] vexp5;
reg [23:0] lzr;
wire [4:0] lznum;
wire [23:0] lzres;

lzsv lzm(
	.clk(clk),
	.v(r),
	.num(lznum),
	.res(lzres)
);

always @(posedge clk) begin
    vexp4 <= vexp3;
    vexp5 <= vexp4 - {3'b0, lznum};

    lzr <= lzres;
end
```

### 6. 型の生成

```
//TIM7
reg [31:0] res;

always @(posedge clk) begin
    res[31] <= 1'b0;
	res[30:23] <= vexp5;
	res[22:0] <= lzr[22:0];
end
```
float 型を生成する.

## シミュレーション結果
例

```math
123.4\ -\ 7.25 = 116.15\\
42F6\_CCCD\ -\ 40E8\_0000 = 42E8\_4CCD
```

![Screenshot from 2020-05-06 19-28-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253609/c14e68fe-4581-175b-3ea3-c4b4a906872c.png)

まぁあっているのではないでしょうか.

桁数ブレッブレなのはご愛嬌