OmniAICreator/Qiita-1.07M huggingface dataset:
条件付きvalidation定義で使うwith_optionsについてちょっと調べてみた

# with_optionsを使ったvalidation

以下のような感じで、with_optionsを使った条件付きvalidationを定義することがあると思います。

```rb
class Hoge < ApplicationRecord
  with_options on: :some_case do |hoge|
    hoge.validates :name, presence: true
    hoge.validates :description, length: { minimum: 10 }
  end
end
```

このように書くと、Hoge.new.valid?(:some_case)って書いたときに↑のvalidationを呼ぶことができます。
特に気にせず、そういうイディオムみたいなもの、と思って使っていましたが、このコード、内部の構造読んでみるとなかなかおもしろかったので触りだけまとめてみます。

# ブロック変数は何のObject？
上のコードでいうhogeは何のObjectなんでしょうか？
なんとなく、valid?を読んだときのレシーバー、つまりそのclassのインスタンスなのかと思ってましたが、中身を覗いてみるとActiveSupport::OptionMergerというクラスのオブジェクトが出てきます。
こんなclassです

```rb
require "active_support/core_ext/hash/deep_merge"

module ActiveSupport
  class OptionMerger #:nodoc:
    instance_methods.each do |method|
      undef_method(method) if method !~ /^(__|instance_eval|class|object_id)/
    end

    def initialize(context, options)
      @context, @options = context, options
    end

    private
      def method_missing(method, *arguments, &block)
        if arguments.first.is_a?(Proc)
          proc = arguments.pop
          arguments << lambda { |*args| @options.deep_merge(proc.call(*args)) }
        else
          arguments << (arguments.last.respond_to?(:to_hash) ? @options.deep_merge(arguments.pop) : @options.dup)
        end

        @context.__send__(method, *arguments, &block)
      end
  end
end
```

このclass、黒いな。。。
ど頭でinstance_evalやclassやobject_id以外をundef_methodして、その上でmethod_missingを上書きしてますね。一体何が始まるのか期待感が高まります。
hashのdeep_mergeなんてのも初めて見ました。


# with_optionsの定義場所

バリデーションをグルーピングするのに使用しているwith_optionsのほうも気になります。
with_options、validationのときくらいしか見ないので、てっきりActiveModel::Validationとかにあるのかと思いきや
[ActiveSupport](https://github.com/rails/rails/blob/ab8847c92092a57df6433f4fc72682074359531f/activesupport/lib/active_support/core_ext/object/with_options.rb)に定義がありました。

```rb
def with_options(options, &block)
  option_merger = ActiveSupport::OptionMerger.new(self, options)
  block.arity.zero? ? option_merger.instance_eval(&block) : block.call(option_merger)
end
```
with_optionsに渡されたブロックにブロック引数があればOptionMergerを引数として渡してblockをcallします。
これがバリデーションをグルーピングするときの挙動にあたるわけです。

```rb
  with_options on: :some_case do |hoge|
    hoge.validates :name, presence: true
    hoge.validates :description, length: { minimum: 10 }
  end
```
このhogeが前述の通り、OptionMergerのインスタンスです。
OptionMergerにvalidatesはないので、method_missingに拾われ、最終的に以下に行き着きます

```rb
@context.__send__(method, *arguments, &block)
```
@ contextは、with_optionsのself、methodはvalidates、*argumentsは [:name, presence: true] -> [:description, length: { minimum: 10 }]が順番に渡され、&blockはありません。

黒いですね。


with_optionsのコメントを読むと以下の様なことが書いてあります

> An elegant way to factor duplication out of options passed to a series of method calls.

そういう目的で使うものだったのですね。なるほど。
結合条件は、JOIN句とWHERE句、どっちで書くべき？

昔話になりますが、Oracle8の頃は、結合条件をJOIN句に書けませんでした。
Oracle9からは、JOIN句に書けるようになりました。

私も昔は、結合条件をWHERE句に書いていました。
けど、どこかの現場で、Oracle固有の書き方だから、
標準の書き方のほうが良いよ？と教えて貰い、変えました。

Oracle固有の書き方だと、DBが変わった場合に変更する必要が出てくるため、
SQLを書くとは、可能な限り標準で書くのをお勧めします。

余談として、DECODEとCASE だったら、CASEを使うのも標準に準拠する為です。

## 参考サイト
- [図でイメージするOracle DatabaseのSQL全集](https://www.oracle.com/technetwork/jp/articles/otnj-sql-image1-308625-ja.html#p01intro)

## 内部結合
### 標準
```
SELECT 
 *
FROM T1_TBL a
INNER JOIN T2_TBL b
on a.ID = b.ID
```
### Oracleの固有条件
```
SELECT 
 *
FROM T1_TBL a, T2_TBL b
WHERE a.ID = b.ID
```
## 外部結合
### 標準
```
SELECT 
 *
FROM T1_TBL a
LEFT OUTER JOIN T2_TBL b
on a.ID = b.ID
```
### Oracleの固有条件
```
SELECT 
 *
FROM T1_TBL a, T2_TBL b
WHERE a.ID = b.ID(+)
```

## 結論
Oracle固有の書き方、懐かしく感じました（笑）
＋をどっちに書けばいいのか、迷っちゃいました。

うる覚えですが、Oracleも標準を推奨していたはずなので、
標準で書きましょう！

けど、＋の書き方を見かけても、焦らず、
あ～、昔の書き方なんだな～って思って貰えれば幸いです。
Z80アセンブラにおけるサブルーチン呼び出しの検討

32bitのCコンパイラの出力を参考にZ80アセンブラのサブルーチン呼び出しを検討してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257554/7ef23930-efc2-f089-7c32-a6baf5d6c417.png)
https://godbolt.org/z/RP5mD0

```
;10 bload "program.bin",r

CHPUT	equ $00a2

	org $d000
start:
	ld hl,7		; y
	push hl
	ld hl,$40	; x
	push hl
	call hoge
	pop hl		; 空読みx2
	pop hl

	call CHPUT
	ret

; byte hoge(word x, word y)
_x	equ 2
_y	equ 4

hoge:
	ld (spwk),sp
	ld ix,(spwk)

	ld a,(ix+_x)
	add a,(ix+_y)
	ret

spwk:	dw 0

	end start
```

https://msxpen.com/codes/-LlK5E_0AaZzBHazDiux
【メモ】Pythonのパッケージ, モジュール, __init__.pyについて

# 参考
[6.モジュール(module)](https://docs.python.org/ja/3/tutorial/modules.html)

# メモ
sklearnを例に



![IMG_0160.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186209/78afa7ff-f657-5de6-9bef-c8e6b793e878.png)

# 感想
iPadのノートアプリ、GoodNotes使ってたけど全然デフォルトメモ帳のほうが書きやすい。
【SQLServer】インデックスを使用して処理改善をする

##とにかく処理が重い
うちの会社が客先へいれているシステムの処理が遅すぎて
どうあがいてもタイムアウトになり、10分以上経っても応答なし。
##原因
もともとサーバーのスペックが低く、ネットワーク環境もよろしくない。
しかし、特にネットワークが原因ではなかった。
自社から客先で稼働しているものを実行してみると同じ状況になり、
タイムアウトとなって何も出来ない・・・・
理由としては、SQLで、ビューを使用しており、テーブルは10個以上見ている。
上司にはデータベース構造が悪いんじゃない？と根本的なことを言われたが、
すぐにどうこうできる問題ではない。
##対処法
####SQLの実行計画を見る
上司に相談してSQLの実行計画を見てみなよと言われた。
前にも見たことはある気がするがほぼなんじゃそりゃ状態・・・
とりあえず教えてもらいながら見てみた。

見てみると、INDEX SCANとなっており、コスト33％。
SEEKになれば大分変わると言われたが、じゃあ何をすれば良いのか状態。
####インデックスをはる
上述の実行計画を見てみると、主キー以外の項目Aが条件となり、
データを探している。
とりあえず、項目Aを追加して非クラスタインデックスを新規作成。
そして、再度実行計画を見てもINDEX SCANのままで変わらない。
####ヒント句を使う
```sql:hinto.sql
SELECT *
FROM   テーブル名
WITH (INDEX(インデックス名))
```
参考：https://www.projectgroup.info/tips/SQLServer/SQL/SQL000020.html
ヒント句を使用することで強制的に先ほど作ったインデックスを参照するようになり、
INDEX SEEKへと変わった。
####再度SQLを実行する
実行時間が10分以上かかっていてタイムアウトになっていたところが
1分半となりました。それでも遅いですが・・。
##さいごに
SQLを速くする方法・・なんて考えたことが今回の問題を通して感じた。
システムを作ってもレスポンスが遅ければ、
もしかすると手で書くほうが早い場合もあるだろう。
ITを使えばオールオッケーではなく、業務もシステム内部も効率良く出来なければ
システム化する意味はない・・・
抽象的な名前よりも具体的な名前を使う

# 最初に
本記事は、私がリーダブルコードを読んで学んだことをメモしているものです。
もし、理解が足りていない部分がありましたら、ご指摘いただけると嬉しいです。

## 例 ) オプション名 :  —run_locally

デバッグ情報を印字するオプション

- ローカルマシンでテストする時に使う
- リモートサーバーで動かす場合はパフォーマンスの問題で使わない

## 問題点

- 新しいチームメンバーがこのオプションを見た時に理解できない
  - オプション名から動作を理解できない
- リモートサーバーでもデバッグ情報を表示したい場合に、「—run_locally」だとおかしい気がする
  - リモートなのにローカル
- デバッグ情報を表示したくない場合に「run_locally」を使わないという選択をするが、オプション名からして使わないとローカルで動かせないイメージが湧く

## 解決策

- オプション名に環境名「locally」が入っているのが問題なので、「—extra_logging」という名前に変える
  - 直感的で明確
- デバッグ情報を印字するオプションのみではない場合は？(—run_locallyだと、抽象的な表現なので)
  - オプションを増やす (オプションが増えても、それぞれのオプションの意味が明確なら大きな問題にはならない)
  - *直行する概念は無理に一つにまとめようとせずに別々に使えるようにする*
汎用的な名前の変数は作らないようにする

# 最初に
本記事は、私がリーダブルコードを読んで学んだことをメモしているものです。
もし、理解が足りていない部分がありましたら、ご指摘いただけると嬉しいです。

# 汎用的な名前とは？

- 「tmp」・「retval」・「foo」のような単語単体で見ても大まかな意味しかわからない or 大まかな意味もわからない名前

  ```c#
  public int GetCount(string value)
  {
    //	これは戻り値という情報しか入っていない
    var retval = 0;
    
    retval = value.Length;

    return retval;
  }
  ```

## どうすればいいか

- 変数の「目的」や「値」を示す名前をつける

  ```c#
  public int GetCount(string value)
  {
    //	この変数はなにをカウントしているのかが変数名のみで判断できる
    var valueCount = 0;

    valueCount = value.Length;

    return valueCount;
  }
  ```

## 汎用的な名前を使わない場合の利点

- 変数の目的を事前に伝えることができる
- 目的、値の名前を持っている変数が違う使われ方( バグ )をされていた場合にすぐに気付くことができる

# 汎用的な名前でもうまく使っえば使える

## 例 : 2つの変数を入れ替える

  ```c#
  if(right < left)
  {
    tmp = right;
    right = left;
    left = tmp;
  }
  ```

  - この場合の「tmp」変数の目的は、一時的な変数の保存かつ、生存期間が数行のみなので「tmp」という、「この変数には他に役割がない」と明示している変数名は理にかなっている
Markdown記法メモ

初めてのQiita記事なので、Markdown記法についてのメモを残したいと思います。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#コードの挿入
 (空行)
 \`\`\`ruby:qiita.rb
 puts 'The best way to log and share programmers knowledge.'
 \`\`\`
 (空行)


**結果**

```ruby:qiita.rb
puts 'The best way to log and share programmers knowledge.'
```




# テキストの装飾
##　見出し
* \# これはH1 タグです
* \## これはH2 タグです
* ¥#######　これはH6 タグです

##　強調、強制
\_か\*で囲むとイタリック体になります
\_Italic type\_
_Italic type_

__か\**で囲む強勢になります
\**strong\*\*
**strong**


##　打消し線
打消し線を使うには\~~で囲みます
\~~打消し線\~~
~~打消し線~~


##　折り畳み
\<details>\<summary>ここに要約を書く\</summary>ここに折りたためる文を書く\</details>
<details><summary>ここに要約を書く</summary>ここに折りたためる文を書く</details>


折りたたむ文のなかでMarkdown記法を使いたい場合は、折りたたまれる部分を\<div>で囲む。\<div>とコードブロックの間には空白行が一つ以上必要です。


\<details>\<summary>ここに要約を書く\</summary>\<div>

ここにコードを書く
\</div>\</details>


<details><summary>ここに要約を書く</summary><div>

ここに折りたためる文を書く
</div></details>


#リスト
## Disc型

* 文頭に*、+、-のいずれかを入れるとDisc型のリストになる。
* \*のあとにはスペースが必要


## Decimal型

1. 文頭に「数字.」を入れるとDecimal型リストになる。
2. こちらも「数字.」のあとにスペースが必要です。


## Checkbox

Disc型の記述の後ろに[ ]を入れるとチェックボックスが生成されます。
チェックが入った状態のボックスを生成する場合は[x]を入力します。
前後にスペースが必要です。

\- [ ] タスク1
\- [x] タスク2


- [ ] タスク1
- [x] タスク2


#引用
文頭に>を置くことで引用になります
\>引用です
\>>ネストされた引用です

>引用です
>>ネストされた引用です

#水平線

下記は全て水平線として表示されます

\* * *
\***
\*****
\- - -
\---------------------------------------



以下水平線
* * *



#リンク

リンクは以下のように書きます。
" "はなくてもよい
\[リンクテキスト](URL "カーソルを合わせたら出るやつ")
[リンクテキスト](http://qiita.com "カーソルを合わせたら出るやつ")

おなじURLへのリンクを複数個所に設定することもできます。
\[リンクテキスト]\[名前]
\[名前][ ]
\[名前]:URL



[リンクテキスト][名前]
[名前][]
[名前]:http://qiita.com


#画像の埋め込み
画像の埋め込みは以下のようにします。
" "はなくても大丈夫です。
\![代替えテキスト]\(画像のURL "画像タイトル")

![代替えテキスト](https://qiita-image-store.s3.amazonaws.com/0/45617/015bd058-7ea0-e6a5-b9cb-36a4fb38e59c.png "画像タイトル")


#テーブル記法
入力補完機能がある
\3x2
とするとできる

手動の場合
```
| Left align | Right align | Center align |
|:-----------|------------:|:------------:|
| This       | This        | This         |
| column     | column      | column       |
| will       | will        | will         |
| be         | be          | be           |
| left       | right       | center       |
| aligned    | aligned     | aligned      |
```

と入力すると、

| Left align | Right align | Center align |
|:-----------|------------:|:------------:|
| This       | This        | This         |
| column     | column      | column       |
| will       | will        | will         |
| be         | be          | be           |
| left       | right       | center       |
| aligned    | aligned     | aligned      |

となる。


#数式の挿入
コードブロックの言語指定に"math"を指定することでTeX記法を使うことができる。



#目次の自動挿入
目次は見出しを基にして自動生成される。



#注釈
本文中に\[^1]や\[^example]と入れることで、脚注へのリンクを張れる。[^1]

[^1]:注釈内容の記述するのは本文中でも末尾でもよい



#エスケープ
バックスラッシュ/をMarkdownの前に入れることでMarkdownをエスケープできる

\\* リストをエスケープ
\* リストをエスケープ
Ajaxとは

Ajaxとは、Asynchronous JavaScript + XMLの略で、JavaScriptによる非同期通信を用いたプログラミングの手法のことを言います。ユーザーがアクションを起こした際に、ページ全体を書き換えるのではなく、JavaScriptにサーバとの通信をさせ、ページの一部を書き換えることで、毎度毎度ページ全体が書き換えることなく、スムーズなUX(User Experience)を提供します。
[修正中]HTTP基礎

#これは何。
HTTPとは何か。を分解して解説していく予定。

#1. HTTP ベースシステムの構成要素
Client　⇄　Proxy　⇄　Proxy　⇄　Server

ブラウザーとサーバーの間に、ルーターやモデムなどリクエストを扱うコンピューターがさらに存在する。ウェブが階層構造で設計されたおかげで、これらはネットワークやトランスポート層の中に隠されている。 HTTP はアプリケーション層の最上位に存在する。ネットワークの問題を診断することは重要だが、 HTTP を説明する際に下層のことはほとんど重要ではない。

##1. クライアント｜ユーザーエージェント
ユーザーのために動くツール。主にブラウザが担う機能。
エンジニアやウェブ開発者がアプリケーションをデバックするために使用するプログラムでもある可能性がある。

##2. ウェブサーバー
クライアントがリクエストを送る先には、クライアントのリクエストに応じてレスポンスを返すサーバーがいる。サーバーは仮想的には１台だけのマシンとして見えるが、実態としてはロードバランサーを介して複数台接続されている場合がほとんど。
ロードバランサーを介す目的は負荷分散、あるいは他のコンピューター (キャッシュ、データベースサーバー、電子商取引サーバーなど) に問い合わせを行う複雑なひとまとまりのソフトウェアを分け合って、リクエストに応じて全面的または部分的に文書を生成することにある。

##プロキシ
ウェブブラウザーとウェブサーバーの間では、多数のコンピューターや端末がHTTPメッセージを中継する。ウェブスタックは階層構造であるため、これらの処理のほとんどはトランスポート層、ネットワーク層、物理層のいずれかで行われ、 HTTP 層から見れば透過的であり、パフォーマンスにかなりの影響を与える。アプリケーション層で行われる処理は、通常プロキシと呼ばれる。これらは透過的である場合とそうでない場合 (プロキシを通過するときにリクエストを変更する場合) があり、さまざまな機能を実行する。

- キャッシュ (キャッシュは共用、あるいはブラウザーキャッシュのように個人用にできます)
- フィルタリング (アンチウィルススキャンやペアレンタルコントロールなど)
- 負荷分散 (複数のサーバーが別々のリクエストに対応できるようにする)
- 認証 (さまざまなリソースへのアクセスを制御する)
- ログ記録 (履歴情報の保管を可能にする)

#HTTP の基本方針
##
##
##

#HTTP が制御できること
#HTTP のフロー
#HTTP メッセージ

#参考文献
[HTTP概要](https://developer.mozilla.org/ja/docs/Web/HTTP/Overview)
[HTTPレスポンスコード](https://developer.mozilla.org/ja/docs/Web/HTTP/Status)
[HTTPメッセージ](https://developer.mozilla.org/ja/docs/Web/HTTP/Messages)
[まとめ記事](https://itsakura.com/network-http-get-post)
Pythonをブラウザで試し書き: paiza.io

## これは何 ##

[サイタという個人レッスンサービスでPythonの講師をはじめました。](https://cyta.jp/python/s/kokoronopython/)

[https://cyta.jp/python/s/kokoronopython/](https://cyta.jp/python/s/kokoronopython/)

上記の講座では、主にプログラミング初心者の方を対象にレッスンを行っていきます。


レッスンサイトに載せているブログ記事をときどきQiita用に加工して載せていきたいと思います、という趣旨の第一回投稿です。


## Pythonをブラウザで試し書き: paiza.io ##

「まずもってWindowsへPythonをインストールする時点でつまずいてしまった...」

「MacだからPythonが最初からインストールされているらしいが、ターミナルの使い方がそもそもわからない...」

という初心者の強い味方がブラウザでプログラミング言語を実行できるサービスです。 [^1]

今回は [paiza.io](https://paiza.io/ja) というサービスを紹介します。

[https://paiza.io/ja](https://paiza.io/ja)

このサイトはメニューが日本語なのも嬉しいですね。


使い方はとても簡単で「コードを作成してみる(無料)」をクリック → コードを書ける画面に移動したら、左上のプルダウンから書きたい言語(Python3)を選ぶ → あとは書くだけ!

ブラウザなのでそれなりに制限はいろいろあります [^2] が、コーチ目線でみると「思った以上にいろいろできるな!」という印象でした。

初心者のユーザが、Pythonの文法を覚えるのにいろいろいじってみる、などの用途には十分ではないでしょうか。


試しに次のようなコードを入力して...

```python
# coding: utf-8
# Your code here!
import json

data = {
    "name":"Keyser Söze",
    "suspect":True
}

print(json.dumps(data, indent=2))
```

「実行」ボタンを押したところ、期待したとおり下記のような出力を得ることができました。 [^3]

```json
{
  "name": "Keyser S\u00f6ze",
  "suspect": true
}
```


みなさんもお試しあれ!



## Source ##

https://cyta.jp/python/b/91945



[^1]: Pythonなどの言語は通常シェルというものを仲介役にしパソコンの中で動作しますので、ブラウザ上で書いて実行するにはそういう用途で公開されているサービスを利用する必要があります。(ちなみにJavaScriptのような言語はブラウザそのものに実行する能力(エンジン)が備わってます。)


[^2]: paiza.io などのサービスを用いブラウザ上でPythonを実行するということは、言い換えると「ブラウザを親にして」Pythonを実行するということです。この場合、<strong>ブラウザができないこと == ブラウザ上のPythonにもできない</strong><br>となります。具体的にはHDDやSSDに保存されているファイルを直接 paiza.io 上で書いたPythonにて操作することはできません。これはセキュリティ上の要求です。


[^3]: URLの寿命がどの程度かわかりませんが、サンプルコードを入力した状態の paiza.io は下記URLからアクセスできるようです。https://paiza.io/projects/e2z5qELyIXzW1B5AHlhEKw?language=python3
#リモートワーク に比べてリアルオフィスワークが劣っている点 ( 当方プログラマでありエンジニア )

# 移動コストが半端じゃない

- 移動は時間とお金とエネルギー資産の浪費である。たとえ、たった30分間だけたとしても。
- 本当にバカにならない。この浪費に気づかないのは、単に慣らされているだけ。
- リモートワークで移動に使う往復1時間を節約すれば、1時間分の勉強や、休憩や、開発ができる。エネルギーも使い果たしていないので、実質、その3倍は得をしている。

# オフィス環境が劣悪である

- 特にオープンオフィスでは、扉を開く音、人が通る景色などで気が散り、集中力が発揮できない。人が働くような環境じゃない。
- 座りやすい椅子、使いやすいディスプレイなどを自由に選ぶことができない。
- 人それぞれ好きな場所、集中できる場所は違うのに、それを選ぶことができない。

# 情報量のノイズが多い

- 周りにリアルに人がいることで、開発の本当の問題点や、コアな部分が見えづらくなる。
- リアルワールドの情報量はあまりにも多すぎて、どれを取捨選択すれば良いかわからなくなる。
- リモートワークでSlackやZoomなどを駆使した方が、そもそもの情報量を絞り込んだり、コントロールしやすくなる。

# 関連

- [リモートワークについて - Qiita](https://qiita.com/YuichiroMinato/items/a67d0fa8323649ddd9d0)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
max→logic(エフェクトをコントロールする方法)

## 1.はじめに
logicは音源だけでなく、多様なエフェクトも用意されているdawです。
前回は音源を鳴らす方法を紹介しましたが、今回はエフェクトをコントロールする方法について説明します。

## 2.maxの設定
下の図と同じパッチを作成します。
<img width="350
" alt="スクリーンショット 2019-07-31 2.21.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464319/4348b8e9-b605-4982-0532-c885e8e0cd48.png">
[ctlout]をダブルクリックして、「from Max1」と設定します。
![midicontrol 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464319/579fb92f-c2b7-d58a-a602-3e30f77c0a08.jpeg)



##3.logicの設定（前準備）
トラックを立ち上げる前に、midiの設定を行います。
#####[logic pro X]→[環境設定]→[詳細] :
「MIDI項目」にチェックを入れます。

<img width="500
" alt="logic1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464319/55d267e2-52cd-f3a0-0a00-198f25bcc69a.png">

#####[録音]→[録音チェックの設定] :
「マルチトラックの録音時〜」にチェックを入れます。
<img width="1058" alt="daw3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464319/f11daadc-c0ad-744f-e900-f8bcf1494ac0.png">

これで前準備は完了です。

##4.logicの設定（トラック作成後）
エフェクトのツマミをいじった後、コントローラアサイメント[⌘+L]を表示させます。
次にmax側のツマミを動かします。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">「maxのパッチ」→「logicのエフェクト」を連動させる方法 <a href="https://t.co/PYZEKCz0cg">pic.twitter.com/PYZEKCz0cg</a></p>&mdash; sazae　赤い人 (@sazae2000en) <a href="https://twitter.com/sazae2000en/status/1157406403570495488?ref_src=twsrc%5Etfw">August 2, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

以上で設定完了です。

　
##5.demo
実際に動かしてみます。
この動画では、 リバーブのwetとdryを反比例で動かしています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">maxでlogicのリバーブを動かす。 <a href="https://t.co/2mXlo4J3r6">pic.twitter.com/2mXlo4J3r6</a></p>&mdash; sazae　赤い人 (@sazae2000en) <a href="https://twitter.com/sazae2000en/status/1157408024840921088?ref_src=twsrc%5Etfw">August 2, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##6.まとめ
今回は、logicの内蔵エフェクトをmaxで動かす方法を説明しました。次回は、maxで設定した音源をlogicに出力する方法について説明しようと思います。
Oracle 64bit 環境へのEntity Framework作成

お世話になります。
oracle 64bit 環境のデーターベースへVisualStudio2016 64bitから
Entity Framework6のデーターベースファーストでEDMXを作成したいのですが
<img width="434" alt="Entity Framework.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466665/91835a44-97e2-4ccb-177c-351dadd8ee02.png">
データソースの選択にoracleデーターベースが表示されません。
どうすれば表示されますでしょうか？

よろしくお願いします。
RailsにおけるAjax通信（アクション名.js.erb にflashメッセージとインスタンス変数を渡す）

RailsにおいてAjax（非同期）通信を有効化した際は、通常のビューファイルではなくviewsディレクトリ配下の`アクション名.js.erb`というファイルに書かれた内容がレンダリングされます。

※ この.js.erbファイルは自動作成されないので、`touch app/views/コントローラ名/アクション名.js.erb`コマンド等で作成する必要があります。）

そのファイルによるレンダリングの際に、
「createやdestroyアクションにおける処理が反映されたインスタンス変数や、flashメッセージを表示したい！」と思うことが多くあると思います。

自分の備忘録を兼ねて下記します。

## コントローラファイル

```ruby:authorized_maps_controller.rb
class AuthorizedMapsController < ApplicationController

~ 略 ~

# 下記①②を、create.js.erbで利用します
# ① インスタンス変数 [@authorized_users] 
#  使用するために必要なこと ⇨ 特になし。createアクション内で定義されていれば利用可能

# ② flashメッセージ [flash[:notice] = "ユーザー：#{@authorized_user.email} を追加しました。"]
#  使用するために必要なこと ⇨ format.jsのブロック内に書く必要があります。

  def create
    @authorized_users = @map.authorized_users
    if @authorized_user = User.find_by(authorized_params)
      @map.authorizing_user(@authorized_user)

      respond_to do |format|
        # format.jsとして、flashメッセージはブロック内に記述します 
        format.js { flash[:notice] = "ユーザー：#{@authorized_user.email} を追加しました。" } 
      end

    else
      flash[:notice] = "招待できないメールアドレスです"
      render 'new'
    end
  end


```

上記コントローラで定義したインスタンス変数`@authorized_users`と、`flash[:notice]`を利用します。

## アクション名.js.erbファイル

```javascript:create.js.erb

// htmlメソッドに渡すHTML(ERB)構成を、文字列として変数users_listに格納
// この文字列はそのままERBとして読まれるので、インスタンス変数やヘルパーメソッドをそのまま書ける
users_list = '\
      <% @authorized_users.each do |user| %>\
        <% if current_user == user %>\
          <li><%= "#{user.email}（所有者）" %></li>\
        <% else %>\
          <li><%= user.email %></li>\
        <% end %>\
      <% end %>\
    ';

<% flash.each do |type, message| %>
　// Bootstrapを導入しているため、`class="alert alert-success"`としています
  $("#added-message").html('<p class="alert alert-success"><%= type %><%= message %></p>')
  $("#result").html(users_list)
<% end %>
```

正しく記述されていれば、formを送信したタイミングで画面が更新されます。

## 上記内容を実施する前に
利用中のformヘルパーにて`remote: true`が有効化されていることを確認の上、ご実施ください。
下記のうちチェックが入っているものは、デフォルトで`remote: true`が有効になっています。

- [x]  form_with
- [ ]  form_for
- [ ]  form_tag
【React】ホットラインマイアミっぽい文字を表示できるコンポーネントを開発してみた

最近Gatsby製の[ブログ](https://unearned-in.com/)を作ったので、そこで使うためにReactのコンポーネントを開発しました！
↓こんな感じの文字が出せます。
![react-hlm.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/8dbc87d6-88f8-4d52-5bc8-d0d1bcbb102e.gif)
リポジトリ : https://github.com/Y0KUDA/react-hlm
デモページ : https://y0kuda.github.io/react-hlm/index.html
NPM : https://www.npmjs.com/package/react-hlm

名前の由来はタイトルの通り、Hotline Miamiです。
marqueeと合わせて使いたくなる90年代っぽい感じにできたと思います。

# 使い方
npmで公開しているので`npm`や`yarn`で`react-hlm`をインストールすれば使えます。
こんな感じのコードで簡単にバナーを出せます。  

```typescript
<HLM.Banner text="sample"/>
```

詳しくは[リポジトリ](https://github.com/Y0KUDA/react-hlm)を参照してください。

# 技術的な話
## 立体に表示する方法
エレメントの高さを0にすることで、同じ場所に複数のテキストを表示することができます。
少しずつずらして表示することで3Dっぽく表示してます。

```typescript
{Array.from(Array(layers).keys()).map(layer=>{
  return  <div  key={layer+"_key"} 
                style={Object.assign({top:`calc(${vecY*layer*distance}px - ${elementHeight}px )`,
                                      left:vecX*layer*distance,
                                      position:"relative",
                                      height:"0", //　高さが0
                                      color:acid(time*colorSpeed+layer*0.1),
                                      zIndex:layer},style)}>
            {text}
          </div>
})}
```

## 正しい領域を設定する方法
立体表示をするためにエレメントの高さを0にしてしまっているので、そのままだと領域がおかしくなってしまいます。
今回は同じテキストのエレメントを非表示で作成し、その領域内にずらして入れ込むことで領域を設定しています。
まず、以下のコードで何も表示しない領域を作成します。  

```typescript
<div style={{visibility:"hidden"}} ref={ref}> // visibility:"hidden" にすると表示されない。
                                              // ref={ref} とすると、refからエレメントを参照できる。
{text}
</div>
```
すると、こんな感じの領域が発生します。
![box-shift.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/a1f47314-4e35-8d78-ac34-293aa290b206.png)
次に、以下のコードでエレメントの高さを取得します。  

```typescript
    useEffect(() => {
      setElementHeight(ref.current.offsetHeight); // refからエレメントの高さを取得し、設定。
      window.addEventListener('resize', ()=>setElementHeight(ref.current.offsetHeight)); // ウインドウがリサイズされたときに高さが更新されるようにイベントを設定。
      const id = setInterval(() => {
        updateTime(t => t + 50);
      }, 50);
      return () => {
        clearInterval(id);
      };
    },[]);
```

最後に、取得した高さ分を差し引いて表示するようにします。  

```typescript
{Array.from(Array(layers).keys()).map(layer=>{
  return  <div  key={layer+"_key"} 
                style={Object.assign({top:`calc(${vecY*layer*distance}px - ${elementHeight}px )`, // - ${elementHeight}px で必要な高さを差し引く。
                                      left:vecX*layer*distance,
                                      position:"relative",
                                      height:"0",
                                      color:acid(time*colorSpeed+layer*0.1),
                                      zIndex:layer},style)}>
            {text}
          </div>
})}
```

いい感じに収まりました。
![box.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/725b6b0a-fed7-b662-1cc3-3589c8542cc8.png)

# 最後に
ブログやってるので見てくれると嬉しいです！
まだ中身があまりないですが・・・
https://unearned-in.com/
Python3でnクイーン問題を解く

# nクイーン問題とは
n×nのチェスの盤上に、n個のクイーンがお互いを攻撃しないように、ボード上に配置する問題。
[n-クイーン(Wikipedia)](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%82%A4%E3%83%88%E3%83%BB%E3%82%AF%E3%82%A4%E3%83%BC%E3%83%B3#n-%E3%82%AF%E3%82%A4%E3%83%BC%E3%83%B3)

バックトラック法の例として有名な問題 ([バックトラック法とは](https://qiita.com/mk668a/items/7ad2a0ad3c3b3d856fff))


# 実装
```python:nqueens.py 
def n_queen(n):
    count = 0
    for board in put_queens(board=[n] * n):
        for queen in board:
            print(''.join('.Q'[x == queen] for x in range(n)))
        print()
        count += 1
    print(count, 'ways')


def put_queens(board, y=0):
    n = len(board)
    if y == n:
        yield board
    else:
        for x in range(n):
            if not conflict(board, x, y):
                board[y] = x
                yield from put_queens(board, y + 1)


def conflict(board, x, y):
    return any(tx == x or tx + (y - ty) == x or tx - (y - ty) == x
               for ty, tx in enumerate(board[:y]))


if __name__ == '__main__':
    n_queen(int(input('n = ')))
```

入力:
n
Android8.0でTextViewに表示した文字列の折り返し位置がおかしい

## TextViewに文字列を設定したので表示を確認

<table border="0">
<tr>
<td>Android 8.0のEmulator<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380332/3e5fcb7e-b2d7-e7ae-69fa-bf6b22f00dce.png"></td>
<td>Android 8.1のEmulator<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380332/0a3832d8-eadc-2ec6-bb22-9656910c2f70.png"></td>
</tr>
</table>

うん！文字の折り返し位置がおかしいね！！

ちなみにコードがこちら！（ただtextに文字列を設定しているだけ）

```xml
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="さすがディオ！俺達に出来ないことを平然とやってのけるッ！"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />
```

## と言うわけで調べてみた

google issue trackerにこんな内容があった
https://issuetracker.google.com/issues/64418117

どうやら「breakStrategy = "simple"」を設定すれば正しく表示される様子

## 実際に試してみた結果

```xml
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="さすがディオ！俺達に出来ないことを平然とやってのけるッ！"
    android:breakStrategy = "simple"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />
```

<table border="0">
<tr>
<td>Android 8.0のEmulator<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380332/daac87ac-d5cd-c588-0d56-e0ab697992ae.png"></td>
<td>Android 8.1のEmulator<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380332/4f4f3127-5d59-6599-395c-d7ebef7717ee.png"></td>
</tr>
</table>

「breakStrategy = "simple"」を設定すると同じところで折り返してくれていることを確認

## breakStrategyってなんぞ？

Android公式ではここの項目
https://developer.android.com/reference/android/widget/TextView#attr_android:breakStrategy

「breakStrategy = "high_quality"」を設定すると本投稿の内容である折り返し位置がおかしい状態で表示されてしまうため
defaultでは「breakStrategy = "high_quality"」が設定されている様子だが
Android8.0ではこの問題は修正されていないようなのでAndroid8.0のみこの表示状態となってしまう

## ちなみに…
「breakStrategy = "balanced"」を設定すると下図のように表示されたため端で折り返すためには
「breakStrategy = "simple"」と設定するしかない様子

<table border="0">
<tr>
<td>Android 8.0のEmulator<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380332/80d6f1c0-8451-9fd7-10c1-7b8e259671fe.png"></td>
<td>Android 8.1のEmulator<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380332/e6194cb7-a80c-d5a8-c316-67db5422ab79.png"></td>
</tr>
</table>
バックトラッキングとは

# バックトラッキングとは
- 問題に対して解決できる組み合わせが複数存在する場合があります。
- その解決できる組み合わせを見つける為に、選択肢の中から様々な組み合わせを試さなければいけません。
- **バックトラッキング**は、選択肢の中から全ての可能な構成を調べるための体系的な方法です。

まず、選択肢の中から1つ選択する場合、以下のような特性があります。

```1. 選択肢の中から何を選べばいいか知るための情報がない。```
```2. それぞれの選択が、次の選択につながる。```
```3. 1つ以上のいくつかの選択が問題を解決するかもしれない。```

具体的に例をあげると、

### 例1. 迷路

迷路でスタートからゴールまでの道を見つける場合。
各交差点では、以下の3つの選択肢から選択する必要がある。

- 直進
- 左折
- 右折

このとき、以下のような特性があります。

```1. この3つの選択肢から正しい選択をするために十分な情報がない。```
```2. それぞれの選択が、次の選択につながる。```
```3. 1つ以上のいくつかの選択が問題を解決するかもしれない。```

### 例2. 地図

地図の色を以下の4色に分ける場合。

- 赤
- 黄
- 緑
- 青 

隣接する国は異なる色でなければならないとする。

このとき、以下のような特性があります。

```1. この4つの選択肢から正しい選択をするために十分な情報がない。```
```2. それぞれの選択が、次の選択につながる。```
```3. 1つ以上のいくつかの選択が問題を解決するかもしれない。```

**これらの問題を解決する唯一の方法は、全ての可能性をチェックすることです。**

全ての可能性をチェックするために、体系的な方法である**バックトラッキング**を使います。

# 実装
解は、各要素```a(i)```が有限全順序集合Sから選ばれるベクトル```(a(1), a(2), a(3), ...a(n))```であると仮定します。(つまり、Sは可能な選択肢の集合)

- 部分解```A```を作成し、それを```A =(a(1), a(2), ... , a(k))```のように拡張しながらテストする。
- 部分解が解である場合は、出力する。そうでない場合、```S(k)```から```a(k)```を削除して、別の可能な選択を試す。
- 可能な選択が尽きた場合、```k-1```してSの最初の選択を消して、次の選択を試す。

### 擬似コード
```python

def BACKTRACK(S):
  # S: 可能な選択を保持したリスト
  S(1) = S
  k = 1
  while(k > 0):
    while S(k) != empty:  #　進める
      a(k) = an element in S(k)
      S(k) = S(k) - a(k)
      if(a(1), a(2), ..., a(k)) is a solution:
        print(a(1), a(2), ..., a(k))
      k = k + 1
      S(k) = S
    k = k - 1  # バックトラック
```
再帰を使用した実装

```python

def BACKTRACK(A, k, S):
  # A = a(1), ..., a(k): 部分解
  if A is a solution:
    print A = a(1), ..., a(k)
  else:
    k = k + 1
    S(k) = S
    while S(k) != empty:
      a(k) = an element in S(k)
      S(k) = S(k) - a(k)
      A = A + a(k)
      BACKTRACK(A, k, S)
```

### 例
3-bitの2進数で1が2個以上含まれている数を見つける。
この問題を解決する唯一の方法は、全ての可能性（000、001、010、....、111）をチェックすることになります。

可能性は8つあり、これらは問題の探索空間と呼ばれ、以下のようなツリー構造に編成することができます。

```
             _ _ _  
        /              \
     0 _ _           1 _ _
   /       \       /       \
  00_     01_     10_     11_
 /   \   /   \   /   \   /   \
000 001 010 011 100 101 110 111

```

### 8クイーン問題
バックトラック法の適用例として、8クイーン問題があります。
[Python3でnクイーン問題を解く](https://qiita.com/mk668a/items/82a4683683da2fa35c43)
Rails:docker-compose upしてもstatusがexitedしてしまう現象

最近Railsを勉強し始めて、初めてアプリ開発をしています。

その中で謎の現象が起こったのでメモしておきます。

#Version

ruby '2.5.3'
rails '5.2.3'
docker 2.1.0.0
Mac PC

#概要

dockerでRailsの環境を構築して開発をしていた際に、
何らかの状態から再度コンテナを立ち上げる時、`docker-compose up -d`をして

```
Starting meigen_db_1 ... done
Starting meigen_web_1 ... done
```

上記のように出るものの、`docker ps`しても

```
a373d21eec11        mysql:5.7           "docker-entrypoint.s…"   3 days ago          Up About a minute   0.0.0.0:3306->3306/tcp, 33060/tcp   meigen_db_1
```

とDBのコンテナしか立ち上がらない。webサーバー側が立ち上がらないのだ。
`docker ps -a`でみてみると


```
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                               NAMES
58a49eb1bc6f        meigen_web          "bundle exec rails s…"   4 seconds ago       Exited (1) 2 seconds ago                                       meigen_web_1
a373d21eec11        mysql:5.7           "docker-entrypoint.s…"   3 days ago          Up 2 minutes               0.0.0.0:3306->3306/tcp, 33060/tcp   meigen_db_1
```

STATUSがexitedになってしまっている。


# 調査

とりあえず、調べてみる。
`docker logs <コンテナID>`

```
A server is already running. Check /app_name/tmp/pids/server.pid.
=> Booting Puma
=> Rails 5.2.3 application starting in development
=> Run `rails server -h` for more startup options
Exiting
```

どうやら`bundle exec rails s -p 3000 -b 0.0.0.0`を実行した時にこけてしまっているらしい。

注目はここ
**A server is already running. Check /app_name/tmp/pids/server.pid.**

もうすでにWebサーバーは動いているらしい。

そこで、マウントされているホスト側のファイルを確認してみると、

確かに`tmp/pids/server.pid`というファイルがある。
このファイルを削除して、再度`docker-compose up -d`を実行すると


```
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
58a49eb1bc6f        meigen_web          "bundle exec rails s…"   22 minutes ago      Up 2 seconds        0.0.0.0:3000->3000/tcp              meigen_web_1
a373d21eec11        mysql:5.7           "docker-entrypoint.s…"   3 days ago          Up 3 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp   meigen_db_1
```

無事にコンテナが起動したままになりました！

これを解決するまでに原因が解らず、５回ほど環境構築し直しました。。
他の方が同じ道を辿らないことを祈ります。
renderしてるのに画面が遷移しないのはform_withだから

viewを持つcreateアクション、という、ちょっと変なコードを書いていて、
ログを見る限りrenderしているはずなのに、画面が遷移しない、という現象に出くわして、かなりハマってしまったので書いてみました。

# form_withはデフォルトだとXMLHTTPRequestで通信してる
上記の現象の原因を探っていて、ログにJSが動いた形跡を見つけて、form_withの仕様によるものであることにたどり着きました。
form_withがデフォルトだとXMLHTTPRequestで通信しており、ゆえにrenderを書いても画面が遷移しない、ということがおこります。

ドキュメントのとおりです。
https://api.rubyonrails.org/v5.2.3/classes/ActionView/Helpers/FormHelper.html#method-i-form_with
ドキュメントのとおり、local: trueを渡せばちゃんと同期通信してくれます。

普段からform_withに慣れている人には特に違和感ない挙動なのだと思いますが、古いRailsのコードに慣らされてるせいで全然気づきませんでした。
どこかで同じようにハマった誰かがこの記事にたどり着きますよう。
配列の非同期処理を同期させる関数forEachSyncとmapSyncを作ってみた

# はじめに

配列の`forEach`や`map`は非同期処理を`await`することができない。

自前で同期処理を作る必要がある。

なので配列の非同期処理を同期させる関数`forEachSync`と`mapSync`を作ってみた。


# GitHubで公開中

https://github.com/querykuma/ArraySync


# 使い方

### forEachSync

```javascript

await arr.forEachSync(async function callback(currentValue [, index [, array]])[, batchSize]);

```

### mapSync

```javascript

var new_array = await arr.mapSync(async function callback(currentValue[, index[, array]]) {
    // Return element for new_array
}[, batchSize]);

```

`batchSize`は１度に並行処理させたい配列の大きさを指定する。
`batchSize`は省略可能で省略したら1になる。


# サンプルプログラム

### forEachSync

```javascript

var sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay));
var ary = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

(async () => {
  await ary.forEachSync(async (a, index, array) => {
    console.log("forEachSync first", a, index, array.length);
    await sleep(1000);
  }, 3);

  console.log("forEachSync end");
})();

```

`batchSize`が3で`[1,2,3]`、`[4,5,6]`、`[7,8,9]`、`[10]`と逐次処理される。


### mapSync

```javascript

var sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay));
var ary = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

(async () => {
  var ary_result = await (await ary.mapSync(async (a, index, array) => {
    console.log("mapSync first", a, index, array.length);
    await sleep(500);
    return a + 10;
  }, 3)).mapSync(async (a, index, array) => {
    console.log("mapSync second", a, index, array.length);
    await sleep(500);
    return a + 100;
  });
  console.log("mapSync", ary_result);
})();

```

mapSync firstは`batchSize`が3で`[1,2,3]`、`[4,5,6]`、`[7,8,9]`、`[10]`と逐次処理される。
mapSync secondは`batchSize`が1で`[11]`、`[12]`、`[13]`、`[14]`、`[15]`、`[16]`、`[17]`、`[18]`、`[19]`、`[20]`と逐次処理される。

# p-map

[p-map - npm](https://www.npmjs.com/package/p-map)を見つけた。
mapSyncとほとんど同じプログラムだ。
p-mapのconcurrencyはmapSyncのbatchSizeと同じ。

ぱっと違いを調べたところ

- mapSyncは配列のみだがp-mapはiteratorを受け取るようだ。
- mapSyncは配列のprototypeを書き換えており配列をつなげて使えるが、p-mapは引数を渡す方式で配列をつなげて使えない。
- p-mapはmapper(element, index)だが、mapSyncはcallback(currentValue[, index[, **array**]])となっておりarrayにも対応。
- mapSyncはawaitすることしか考えていなかったが、p-mapはPromise.catch(reject)に対応しているようだ。
- p-mapはrequire('aggregate-error')と書いてあってNode.js以外ではそのまま使えないが、mapSyncはNode.js以外でもそのまま使える。
- mapSyncのbatchSizeはデフォルト1だが、p-mapのconcurrencyはデフォルトInfinity。
- p-なんとかのnpmが46個もあった。
- forEachSyncに対応するp-eachは作ってないようだ。p-each-seriesはあった。
ELBのIPと台数をひたすらdigしておく

ELBのスケーリングを観察するのが目的
ELBのDNS名解決は、インターネットに繋がっていれば可能です
ELBのIPと台数をひたすらdigしておくために、
作った適当なEC2 (インターネットに繋がる) のcrontabに登録して下記スクリプトを実行したのよ

# crontab (1分おきに実行)

```
*/1 * * * * sh /home/ec2-user/elbdig.sh <ロードバランサのDNS名>
```

# elbdig.sh

```sh
#!/bin/bash -

# 引数1となりうる値
# ロードバランサ名

elbname=$1

        datetime=$(date "+%Y-%m%d-%H:%M-%S")

        ipaddrlist=$(dig ${elbname} |grep -v -E "^(;|$)" |awk '{print $5}' |sort -n -t'.' -k1,1 -k2,2 -k3,3 -k4,4 |awk -v 'RS=nothing!!!!' '{print $1,",",$2,",",$3,",",$4,",",$5,",",$6,",",$7,",",$8}')

        number=$(dig ${elbname} |grep -v -E "^(;|$)" | wc -l)

        echo -e "${datetime}\t${number}\t${ipaddrlist}" |tee -a ${elbname}.txt

# 20190803 追記 : cronに登録しておくため while文は不要でした 削除しました
# また、ELBは8台まで拡張するため、$1,",",$2,",",$3,",",$4,",",$5,",",$6,",",$7,",",$8 と修正しました
```
NLP for Java (NLP4J) (1)


近々「自然言語処理を簡単に試せるライブラリ」を公開しようと考えています。

こんな感じのコードを書くと

```java

	public static void main(String[] args) throws IOException {
		String text = "今日は走って学校に行きました。";
		YJpMaService service = new YJpMaService();
		ArrayList<Keyword> kwds = service.getKeywords(text);
		for (Keyword kwd : kwds) {
			System.out.println(kwd);
		}
	}
```

こんな感じで出力される、というものです。

```java
Keyword [facet=名詞, lex=今日, str=今日, reading=きょう]
Keyword [facet=助詞, lex=は, str=は, reading=は]
Keyword [facet=動詞, lex=走る, str=走っ, reading=はしっ]
Keyword [facet=助詞, lex=て, str=て, reading=て]
Keyword [facet=名詞, lex=学校, str=学校, reading=がっこう]
Keyword [facet=助詞, lex=に, str=に, reading=に]
Keyword [facet=動詞, lex=行く, str=行き, reading=いき]
Keyword [facet=助動詞, lex=ます, str=まし, reading=まし]
Keyword [facet=助動詞, lex=た, str=た, reading=た]
Keyword [facet=特殊, lex=。, str=。, reading=。]
```

この例では裏でYahoo! Japan の日本語形態素解析サービスを呼び出していますが、
→ https://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html
ほかの自然言語処理サービスも統一感ある方法で呼び出したり、自然言語処理を自作する仕組みを提供しようと考えています。

自然言語処理はなかなか楽しい処理なのですが、それをプログラミング（Java!）でやろうとすると、
処理の呼び出しやレスポンスの処理がけっこう面倒だったりします。

そこで、個人的には長年使ってきた仕組みのオープンソース版を作ってみたら自然言語処理に対する敷居が下がって、たとえば大学生がちょっと勉強で使ってみるとか、大学の研究室でとっかかりに使ってみれるようなものになるのではないかな、と考えている次第です。

日曜大工的にコードの準備を行っているところです。


以上です。
AK4497 の消費電流まとめ

# 概要

768kHz 32bit I2S DACのAK4497の各種動作モードでの消費電流を測って見る。
ついでに、ほぼ同条件で AK4490、AK4493、AK4495S も測ってみる。

# 測定条件

## 測定機器

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187531/9fb07ee3-3c6d-dda4-c2c4-1e591ddcde2f.png)

- コントローラ ： [NanoPi-NEO2](https://sites.google.com/view/chikoidac/home/ipslcd13)
- 測定機器：INA226
    - シャント抵抗　5mΩ (=分解能 約0.5mA)
    - I2C制御の電子負荷付 (今回は使わない)
- [1.3" IPS LCD HAT](https://sites.google.com/view/chikoidac/home/ipslcd13)

## 測定対象

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187531/888b1c85-0ce0-b688-0578-39bfde642491.png)

- AK4490
- AK4493
- [AK4495S](https://sites.google.com/view/chikoidac/home/ChiKoiDac4495)
- AK4497


## 測定音源

- 音源: 1kHz Sine波
- フォーマット：44.1kHz、32bit I2S

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187531/d65a642f-6de0-7b4a-2c32-c3d75bfca1bd.png)

# 結果。

## AK4497 の各種モードと消費電流

9v単電源より、シリーズレギュレータで 5v および 3.3vを生成。
LPF用オペアンプは未装着。
オペアンプ用負電圧生成回路が動作してる状態ですが、おそらく2~3mA程度と思われますので、ほぼAK4497の消費電流です。

|HLOAD|SC2|SC1|SC0|供給電圧[V]|消費電流[mA]|
|:--:|:--:|:--:|:--:|--:|--:|
|0|0|0|0|9.018750|103.090|
|0|0|0|1|9.020000|96.752|
|0|0|1|0|9.020000|98.865|
|0|0|1|1|9.020000|96.752|
|0|1|0|0|9.018750|103.090|
|0|1|0|1|9.020000|96.752|
|0|1|1|0|9.018750|98.865|
|0|1|1|1|9.020000|96.752|
|1|0|0|0|9.017500|118.722|
|1|0|0|1|9.017500|113.652|
|1|0|1|0|9.017500|115.342|
|1|0|1|1|9.017500|113.652|
|1|1|0|0|9.017500|118.722|
|1|1|0|1|9.017500|113.652|
|1|1|1|0|9.017500|115.342|
|1|1|1|1|9.017500|113.652|

- 再生停止中
    - 9.030000 [V] 8.450 [mA]

- 768kHz再生時、HLOAD=1, SC=0
    - 9.005000[v] 160.127[mA]

## AK4490, AK4493, AK4495S, AK4497 の消費電流比較

SCはいずれも 0
LPF用オペアンプ MUSES 8820 ありです。

|DAC|供給電圧[V]|消費電流[mA]|
|:--|--:|--:|
|AK4490|9.020000|56.192|
|AK4493|9.021250|56.615|
|AK4495S|9.021250|54.080|
|AK4497	HLOAD=OFF|9.015000|128.862|
|AK4497	HLOAD=ON|9.013750|143.650|

# 最後に。。。

AK4499 はAK4497の2倍の消費電力と言っているので、すごいことなりそうです。
ethers.js で署名検証

- ethers.js で署名検証を行うサンプルコードです。
- 署名の取得についてのサンプルコードは [ethers.js でメッセージのハッシュ値に署名](https://scrapbox.io/a42/ethers.js_でメッセージのハッシュ値に署名) を参照してください。

```js
// 署名者のアドレス
let signerAddress = "0xfC12b50bD2D04d3754BfC1cFB6c303fb9EAcA118"

// 署名の flat-format 表現（65 bytes）
let signature = "0x1e15f8b126addb29b968f56034cf57094fb2845bb55ad888d4dfca5eb3472ce241bb1d04dcf78999ddd7c6c01525c99ae66272dbd09aefd215161189fe36f0ed1c"

// 署名したメッセージ
let message = "piyopiyo!"

// メッセージのバイト列を取得
let messageBytes = ethers.utils.toUtf8Bytes(message)

// メッセージの Keccak ハッシュ値を取得
let messageDigest = ethers.utils.keccak256(messageBytes)

// 署名検証
// 署名者のアドレスが得られる
let recoveredAddress = ethers.utils.recoverAddress(messageDigest, signature)
console.log(recoveredAddress)

if (signerAddress === recoveredAddress){
	console.log("Signature is verified!")
}
```

#Ref.
- https://scrapbox.io/a42/ethers.js_で署名検証
- https://docs.ethers.io/ethers.js/html/api-utils.html#signature
- https://docs.ethers.io/ethers.js/html/api-utils.html#addresses
【メモ】JSONについて

## jsonとは？
Java Script Object Notation
JavaScript で使われるファイルの書き方（.csv .xmlの部類）

昔はデータの受け渡しにXMLの書き方が使われていたらしいが、描きにくくJSONが広まったとのこと

JavaScriptというワードが含まれているが、swift,php,rubyでも使われており、JavaScriptとの縛りは少ない

```js
//このような感じの書き方

{
  "user" : {
    "name": "Tom",
    "age": 22,
    "languages": ["Japanese", "English"],
    "active": true
  }
}
```

## 終わりに
最近、importXMLが使いたくてXpathを触る機会がある。
少しでも間違うとデータがないと言われる。
「XMLの使いにくさってこんな感じか」と勝手に思ってます。
railsのプロセスを停止させる

railsというか特定のプロセスを停止させる方法です。

# pidの確認
下記コマンドで3000番ポートで起動しているプロセスのIDを確認します

```
lsof -wni tcp:3000
```

するとこんなのが出てきます。

```
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ruby    24301 ubuntu    6u  IPv4 161869      0t0  TCP *:3000 (LISTEN)
```

この場合プロセスIDは24301ですね。

# プロセスを停止させる

下記コマンドで停止させます。

```
kill -9 pid
```

先程確認したプロセスIDの場合だと

```
kill -9 24301
```

ですね。
[ React Native ]要素がfocusされたらstyleを変更する

# はじめに
もともと、webアプリの勉強をしており、htmlやcss、Reactなどのフレームワークを勉強していましたが、Reactを勉強したついでに、React　Nativeも勉強してみました。
React Nativeを始めてみて、スタイルを当てるということに対して、webアプリとかなり違うなぁと戸惑いました。
その一つとして、タイトルの通り、要素がfocusされたらstyleを変更することを紹介したいと思います。

開発環境は、Expoで構築し、デザインは、NativeBaseを用いています。

# 環境

```
"expo": "^33.0.0",
"native-base": "^2.12.1",
"react": "16.8.3",
```

# Inputをかく
NativeBaseを用いて、まずは、フォームを作ります。

```App.js
import {Item, Input} from 'native-base';

<Item rounded style={{borderColor: '#ddd'}}>
    <Input placeholder='e.g.)  hoge' />
</Item>
```
これで、以下のようになります。
![IMG_0539.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405522/19cf1924-dd1f-d7ca-0ce8-f2dafb06f21d.jpeg)


# focus時にデザインを変更する

React Nativeでは、cssほどデザインの自由度もなく、また、擬似クラスなどもありません。そのため、webアプリではcssで簡単に実装していたfocusも、javascriptによって制御する必要があります。

今回は、フォーカスすると、フォームの線の色が変更するコンポーネントを作りたいと思います。

```App.js
import {Item, Input} from 'native-base';

<Item rounded style={{borderColor: '#ddd'}}>
    <Input 
        placeholder='e.g.)  hoge'
        onFocus={this.onFocus}        ++追加
        onBlur={this.onBlur} />　　　　++追加
</Item>
```
onFocusもonBlurも、セットで使われるイベント属性で、onFocusは、フォーカスが要素に与えられる時に発生します。また、onBlurは、その要素からフォーカスが外れた時に発生します。

そして、それぞれで呼び出している関数は、以下の通りです。

```App.js
//stateの部分のみ切り取り
this.state = {borderColor: '#666'}

onFocus = () => {
    this.setState({
        borderColor: 'skyblue',
    })
}
onBlur = () => {
    this.setState({
        borderColor: '#666',
    })
}
```
onFocus関数では、フォーカス時に指定したい色を指定し、onBlur関数では、フォーカスが外れた時の色をしていています。また、stateの初期値では、フォーカスもブラーも発生しない状態の初期の色を指定しています。

それでは、stateの変更により、Inputのボーダーの色も変更するようにしていきます。

```App.js
import {Item, Input} from 'native-base';

<Item rounded style={{borderColor: this.state.borderColor}}>    //変更
    <Input 
        placeholder='e.g.)  hoge'
        onFocus={this.onFocus}        
        onBlur={this.onBlur} />
</Item>
```
動画は用意していませんが、フォーカスすると、右の画像になります。
![IMG_0539.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405522/adf8af01-d9f8-2d76-7ac0-6bf0cb1ba880.jpeg)
![IMG_0540.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405522/0923b1ab-d378-2e88-10fd-0506167185e0.jpeg)

# 終わりに
cssで書いていた時はサクッとしていたことがネイティブではできないことが多いので、一つ一つ調べて勉強していきたいと思います。
iTerm2で矢印キーを出来るだけ使わない方法

## iTerm2で矢印キーを出来るだけ使わない方法
MacのiTerm2を出来るだけ矢印キーを使わない方法を紹介します。

次の6つのショートカットキーが便利です。

control + N : 下矢印と同じ
control + P : 上矢印と同じ
control + B : 左矢印と同じ
control + F : 右矢印と同じ
control + A : 行頭へ移動
control + E : 行末へ移動

この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
【Adblock】Twitterの新UIから{プロモーション|広告}を削除する

TwitterのUIが新しいのに強制移行になりましたが

* 超見にくい
* プロモーションツイート超邪魔

です。
というわけで邪魔なものは消去しようと思います。

### 対象環境

* Adblock plus
* Adblock plus が動作する最近のブラウザ

### 唱える呪文

**2019/08/06更新**

~~twitter.com#?#article:-abp-has(article > div > div > div > div > span:-abp-contains(プロモーション))~~

twitter.com#?#article:-abp-has(article > div > div > div > div > div > span:-abp-contains(プロモーション))

### メモ

TwitterのCSSのランダムそうな文字列って人によって多分違うと思うのでそこがすごく厄介ですね…

いったん表示した後内容を確認してノードを削除するので一瞬だけ表示されてしまいます。

### 詳細な設定方法

https://takap-tech.com/entry/2019/07/25/180403
パラメータテーブルと、その値を取るカスタム関数｜Power Query

パラメータが必要なときは、よく使っています。
僕の方式だと戻り値のデータ型がanyなので、実際に使う場合は適宜データ型の変換が必要になります。
この辺りをコントロールする方法が見つかったら、書き足すかも知れません。


###準備
下図のようなテーブルを作り、名前を「ParameterTable」としておきます。
※テーブル名はコードの方もいじれば変えられますが、列名は必ず、NameとValueにしてください。（Record.FromTable関数が作動しなくなるため）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/a2bad521-05b3-0ba3-40ab-b12ce8760b7e.png)

###関数のコード
名前は何でもいいです。
※レコード化せず、テーブルのままフィルタをかけ、ドリルダウンをする方法でも書ける。パフォーマンスに違いがあるほどデータを詰め込んだことないので、どっちがいいかは不明。

```pq:GetParameterValue
(ParameterName as text)=>
let
    Source = Excel.CurrentWorkbook(){[Name="ParameterTable"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Name", type text}, {"Value", type any}}),
    Custom1 = Record.FromTable(#"Changed Type"),
    Custom2 = Record.Field(Custom1,ParameterName)
in
    Custom2
```
###実行した様子
普通は、こういうコードを書いて、コード内で固定値に差し替えて使います。

```
= GetParameterValue("日付")
```


もちろん、パラメータの名前を打って、呼び出しをしても動きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/6af0b56c-8550-c72d-2785-cc3efb2aabdb.png)



###コピーの仕方
都度、テーブルを作って、関数をコピペ――でもいいんですが、下図のようにテーブルの隣に適当にロードした値をくっつけておいて、ブックとして保存しておくと便利です。
この状態でシートをコピーしてやれば、クエリも一緒にコピーされます。

元のファイルの様子
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/157c0964-d80f-6c95-b391-80f363706449.png)
コピー先での様子
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/2dc93253-4418-e399-bce1-b78b80db5335.png)


###参考
一般的な関数の書き方としては、下記サイトからダウンロードできるPDFの9章が詳しいです。
[Power Query M language specification - PowerQuery M | Microsoft Docs](https://docs.microsoft.com/en-us/powerquery-m/power-query-m-language-specification)
Leetcode 997: Find the Town Judge

```swift
func findJudge(_ N: Int, _ trust: [[Int]]) -> Int {
    var inDegree = Array(repeating: 0, count: N+1)
    var outDegree = Array(repeating: 0, count: N+1)
    for pair in trust {
        inDegree[pair[1]] += 1
        outDegree[pair[0]] += 1
    }
    
    for i in stride(from: 1, through: N, by: 1) {
        if inDegree[i] == N-1 && outDegree[i] == 0 {
            return i
        }
    }
    return -1
}
```
AWSを触ったこと無い奴が1ヶ月弱でAWS認定ソリューションアーキテクトアソシエイトに受かったお話

# 初めに
タイトル通りなのですが、AWSを初めて触ってから1か月弱でAWS認定ソリューションアーキテクトアソシエイトに合格しました(2019年4月)
割と簡単かなーと思って試験に臨みましたが、プロトコルの基礎知識がないと解けないようなものもありました。
2週間で受かった！とか書かれている記事もありますが、**初学者が真に受けると死にます**
(ある程度AWSを触ったことがある人でしたら2週間でも十分受かる試験だと思います)

# なぜAWS認定ソリューションアーキテクトアソシエイトを受けようと思ったのか？
~~なんとなく名前がかっこいいから~~
AWSの案件に携われるチャンスが増えると思ったから

# 受験当時のスペック
######職務経験
・サーバ保守(オンプレ、RHEL6.x系)1年
　→作業手順やbashシェル等の作成

・サーバ設計構築(オンプレ、RHEL7.x系)半年
　→Postfixとdovecotを使ったメールサーバ、
　　Apache使ったリバース/フォワードプロキシ、
　　Bind使ったDNSサーバの設計・構築。

######取得資格
・基本情報
・応用情報
・情報安全支援士合格
・Lpic(LinuC)1,2,304

# 使用した教材など
[徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書](https://www.amazon.co.jp/gp/product/4295005495/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&psc=1)
[![image.png](https://qiita-image-store.s3.amazonaws.com/0/299739/cb86d8d0-54a0-98bd-534f-2a18bb890774.png)](https://www.amazon.co.jp/gp/product/4295005495/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&psc=1)
[Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)](https://www.amazon.co.jp/gp/product/4797392576/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&psc=1)
[![image.png](https://qiita-image-store.s3.amazonaws.com/0/299739/d759e531-a264-3539-277f-6aa8eefdc0fd.png)](https://www.amazon.co.jp/gp/product/4797392576/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&psc=1)

[AWS公式模擬試験](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)
[AWSサービス別資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)

# 勉強時間
40時間程度
######内訳：
20時間
徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書

10時間
AWSサービス別資料を読み込み
主にEC2,VPC,ELB,S3,Lambda,RDS,Route53,CloudFront,IAM周り

7時間
Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)

3時間
公式模擬(復習含む)

# 本番試験の結果

総合スコア:  76%

| score | Topic |
|:-------------------|:--------------------|
| 88%  | Design Resilient Architectures                |
| 71%  | Define Performant Architectures               |
| 66%  | Specify Secure Applications and Architectures |
| 50%  | Design Cost-Optimized Architectures           |
| 100% | Define Operationally-Excellent Architectures  |

# おわりに
試験中にこれ落ちる・・・と何度も思いながら問題を解きましたが、何とか合格することができました。
130分と長い試験ですが、くじけない精神で臨めば受かると思います。

資格を取得することがゴールではなく、業務で生かしてこそ意味があると思っています。
これからAWSをはじめとするパブリッククラウドを活用する場面が増えてくると思いますので、
まずは資格を通して体系的に知識をつけてみてはいかがでしょうか。

私はAWS認定ソリューションアーキテクトに合格したことでAWS案件に携わることができ、
非常に良い経験をさせていただきました。
その中で資格を通して体系的に学んだ知識も非常に役に立っています。

この記事を読んでくださった皆様が試験に受かることを願っています_(:3 」∠)_！
大学の研究で機械学習をしている僕が環境をいろいろまとめてみる

みなさんこんにちは！やっしーです！

僕って、Web系やってるけど、実は機械学習系もやってたりするんですよ！
ということで、今回はいろんな環境をバラバラに使ってしまっているので、一応まとめてみます、**機械学習を研究するに当たって試してみた環境**を紹介していこうと思います！

#### 研究環境
* MacBook Pro 13インチ　core i5メモリ8GB
* Ubuntu 16.04LTS

ちなみに研究室の都合によりGPU非搭載のデスクトップです

## 環境その１　ハードウェア周り
#### MacBook Pro 13インチ　core i5メモリ8GB
ディスプレイ的には、ベゼルがそんなに広くないのであまり小さいと思ったことはありません。しかしメモリに関しては、よくある6万枚のMNISTやcifar10のデータセットで学習を行うと、Touch Bar付近がめっちゃ暑くなります（ちなみにお肉は焼けません、たぶん）
エンジニアとしてWeb系やるにしても、16GBはやはり必須ですねぇ、、、欲しいですねえ、、、

#### Ubuntu 16.04LTS
あの紫と、ターミナルのデザインが好きなのでコレ！

## 環境その２　言語環境周り
### 1. 仮想環境管理　conda
いつも仮想環境を

**conda create --name ENV_NAME python=3.7**
って作成しています。pipを使っていたのですが、研究室にデスクトップを置いてる以上、プロキシが避けられない環境にあります。なので、pipやcondaもプロキシを通すパスの設定が必要でした。exportするだけなのだと思うのですが、pipだとできなかったし、Macの仮想環境もpipからcondaに乗り換えてしまったので、もうめんどくさいです。**pip install -r "requirements.txt"**とかあるから便利なんですけどね、、、、
### 2. IDE
それぞれの良い点や困った点を紹介していきます
#### 1.spyder
Anaconda Navigatorいれたら真っ先に触るであろうエディタのひとつ。GUIバックエンドがすでに設定されている（ **Cent OSとかでターミナル実行、matplotlibとかのpyplot.showメソッドとかは、matplotlib.use('Agg')などのGUIバックエンド指定が必要**  ）即座に簡単なプロットとかを見たい人向けかもしれない。科学シミュレーションとか。  
良い点：GUIバックエンドが付いている、IPythonコンソースが付いているので、コマンドも使える。ステップ実行が可能
困った点：なれるまで細かい操作が難しい。Ipythonコンソールとか削除しちゃうと設定が保存されちゃってデフォルトも戻せない！と落ち込んだ過去あり。**ちなみに進捗発表プレゼンには向かない**

#### 2. jupyter notebook
上記に続き、Anaconda Navigatorにあるやつ。.ipynb（ipython notebook）という拡張子で主に書く（ライブラリやインポート予定のものは.pyでも良い）。Markdown記法で説明を書く、プログラムを書く等、ブロックで分けられて、ブロック単位でのプログラム実行が可能。
良い点：Markdown記法が使える、プラグイン入れるなりすればそのままスライドの形にできる
困った点：仮想環境を立ち上げて起動すると、ターミナルが占有され、他の作業をするためにもうひとつターミナルを開かなくてはならなくなる。**!コマンド　でターミナルの実行ができるが、Question等に対して再度文字入力とかができない、、、？conda installはproseed?って聞かれてキー入力しなきゃだからpip向きかもしれない**

### 3.可視化環境
#### 1. Tensorboard
kerasやtensorflowのcallbacksに指定することで、終了時にTrain AccuracyやTest AccuracyのEpoch毎の推移等をグラフ化してくれるツール。簡単なプレゼンにいいかも
良い点：やってる感が出る
困った点：若干くせがあり、慣れないとわからない
#### 2. Tensorwatch
Tensorboardのリアルタイム版と私は捉えている。これを操ることでやってる感を上記のものより醸し出すことができる。魔法のアイテム
良い点：やってる感がすごい出る
困った点：使い方がわからない。使えない。


以上、まとめた。できたら自分の環境におけるベストなものを選定したいね。これから研究しようとしている人たちもよかったら参考にしてみてください。

それではまた！
良い週末を！