OmniAICreator/Qiita-1.07M huggingface dataset:
Remixをローカルのファイルと同期させる方法

みなさんDaaps開発楽しんでますか？
Daaps開発で使うプログラミング言語Solidityのエディタとして、ブラウザ上で書けるRemixが便利です。
しかし、ブラウザ上でサクサク書いていると、「あれ？このファイルブラウザ上にしかないのか、ちょっと怖くね？」と気づきます。
その後、ローカルのファイル読み込めないのかな？と探すと、左上にフォルダマークを発見します。無事読み込めて、納得納得・・した後に、「ブラウザ上で編集した内容がローカルに反映されていない」ことに気づいて絶望します。

Remixをローカルのファイルと同期させるためには、上記の方法では不十分で、下記の作業をする必要があります。

# remixdのインストール
Remixと連携させたいフォルダ内に、remixdをインストールします。
remixd
(https://github.com/ethereum/remixd)

今回は、公開されているチュートリアルを私が作成したものと、remixを連携させていきます。

```
$ git clone https://github.com/3tomcha/pet-shop-tutorial.git
$ cd pet-shop-tutorial
$ npm install -g remixd
```

最後にlsコマンドで、remixdがあることを確認すれば、インストールは完了です。

## 注
「npm install -g remixd」は、バージョンによってはエラーになるようです。その場合は、下記のようにgit cloneを用いてインストールして見てください。

```
$ git clone https://github.com/ethereum/remixd.git
```
# remixdの起動
インストールしたremixdを起動します。
下記のように連携したいフォルダを指定します。

```
remixd -s <連携したいフォルダのパス> --remix-ide https://remix.ethereum.org
```

私の場合は、下記の通りになります。実行するとsetupやlisteningなど動いていそうな単語が表示されると思います。これで、フォルダの方の準備はOKです。

```
$ remixd -s /Users/tomoya/pet-shop-tutorial --remix-ide https://remix.ethereum.org

[WARN] You may now only use IDE at https://remix.ethereum.org to connect to that instance
[WARN] Any application that runs on your computer can potentially read from and write to all files in the directory.
[WARN] Symbolinc links are not forwarded to Remix IDE

setup notifications for /Users/tomoya/pet-shop-tutorial
Sat May 18 2019 18:05:44 GMT+0900 (JST) Remixd is listening on 127.0.0.1:65520
```

# ブラウザから連携する
リミックスから操作していきます。
（https://remix.ethereum.org/）

まずは左上の鎖のマークをクリックします。
![スクリーンショット 2019-05-18 18.10.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247390/a1282fc7-287a-3f69-1d70-9019ecdf4956.png)

Connect to Localhostと出るので、Connectをクリックします。
![スクリーンショット 2019-05-18 18.11.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247390/70cdc9d1-fc98-c600-f1ab-dc5301f004d6.png)

鎖のマークが緑になったら成功です。左のフォルダの一覧にlocalhostが表示されます。
![スクリーンショット 2019-05-18 18.12.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247390/69be0663-d888-1a24-7890-088647ced091.png)

localhostのファイルを試しに編集し保存してみると、ローカルのファイルも変わっていることがわかると思います。これで完了です！お疲れ様でした！
![スクリーンショット 2019-05-18 18.15.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247390/950e4bca-acac-310a-ac90-3b828c1085b6.png)
最短路長で解ける線形計画問題 (牛ゲー)

[2021年8月30日追記．ここから]  
　[AtCoder Beginner Contest 216 G - 01Sequence](https://atcoder.jp/contests/abc216/tasks/abc216_g) の[公式解説](https://atcoder.jp/contests/abc216/editorial/2474)を読んだら，牛ゲーで解けると書いてあります (解いているときは思いつきもしませんでした)．そこでこの記事を昔書いたことを思い出して読み直してみました．
　多分，大きくは間違ってはいないだろうと思いますが，あまり役に立つ記事ではなさそうです．大事なところは Fact2 で終わっていて，後はそれほど興味なさそうなところの処理を延々と書いていますので．
　以下が元記事 (2019年5月18日投稿)．
[2021年8月30日追記．ここまで]

　[蟻本](https://www.amazon.co.jp//dp/4839941068/) の2.5節の応用問題のところに Layout ([POJ No.3169](http://poj.org/problem?id=3169)) がある．そこに，特殊な線形計画問題は，グラフの最短路問題として解くことができる，と書かれている．ネット上では「牛ゲー」と呼ばれているらしい．少し検索してみたのだけれど，どうしてそれで良いのか，という説明があまり見つからなかった．(いや，きっとあるだろうとは思うけれど，十分探せていない．) まあ，そんなことは明らかだ，ということなのかもしれないが，トップから到達可能でない部分も制約を満たすようにできて，値をいくらでも大きくできる，というところがすぐにはわからなかったので，書いておく．もっとマシな考え方があったら教えてください．線形計画問題について何も知らないので，変なことを書いているかもしれない．

　制約 $x_j - x_i \leq c_{ij} $ ($ (i,j) \in E $) のもとで，与えられた p, q に対して $x_q - x_p$ の最大値を求めたい．Eに現れる数をノード集合Vとして，各$(i,j) \in E$ について，$i$から$j$に距離 $c_{ij}$ のエッジがある有向グラフ G を考える．このとき，以下が成り立つことを示す．

1. 制約を満たす解が存在することと，G に負閉路がないことは同値．
1. Gに負閉路が無い時，制約を満たす $x_q - x_p$ がいくらでも大きくできることと，$q$ が $p$ から到達不可能なことは同値．
1. Gに負閉路が無く，$q$ が $p$ から到達可能な時，$x_q - x_p$ の最大値は，$p$ から $q$ への最短路長に等しい．

　まず簡単なことをチェックする．

__Fact 1__ 　Gに負閉路があると，制約を満たす解は無い．
理由: 閉路 $ i_0 \to i_1 \to \cdots i_k \to i_0 $ の距離合計が $ c < 0 $ だとする．解として
$(a_i \mid i \in V) $があるとすると，$ a_{i_{j+1}} - a_{i_j} \leq c_{\,i_j \,i_{j+1}} $ ($j = 0, \ldots, k$) が成り立つので，これらを全部加えると，$ 0 \leq c $ となり，矛盾する．

__Fact 2__ 　$(a_i \mid i \in V) $ が制約を満たすとする．G において，$i$ から $j$ へのパス $i = i_0 \to i_1 \to \cdots \to i_k = j$ があるとき，このパスの長さを $l = c_{i_0 i_1} + \cdots + c_{i_{k-1} i_k}$ とすると，$a_j - a_i \leq l$ である．
理由: $a_{i_{m+1}} - a_{i_m} \leq c_{i_m i_{m+1}}$ ($m = 0, \ldots, k-1$) を全部加えれば良い．

　次に，$n \not\in V$ なる $n$ をとる．Gに，ノード $n$ を追加し，各 $i \in V$ に対して $n から i$ へのエッジを追加する．エッジ$n \to p$ の長さは0, $i \neq p$ なる $i$ に対しては，エッジ $n \to i$ の長さは $M$ とする．ただし，$M$ は十分大きく，具体的には $M > |E|\times {\rm max}\\{ |c_{ij}| \mid (i,j) \in E\\}$ となるようにとる．このようにして作成したグラフをG'とする．各 $i \in V$ に対し，$a_i$ を，$n$ から $i$ までの最短路の長さとして定義する．

__Fact 3__ 　Gに負閉路が無い場合，$i$ が $G$ において $p$ から到達可能であれば，$ a_i $ は，$G'$ における $p$ から $i$ の最短路の長さに等しい．
理由: これがなりたつように$n$を端点とするエッジの長さを定めた．

__Fact 4__ 　Gに負閉路が無い場合，$(a_i \mid i \in V)$ は制約を満たす．
理由: $(i,j) \in E$ とする．$a_j - a_i > c_{ij}$ と仮定すると，$n$ から $i$ への最短路に $i \to j$ を加えたパスの長さは $ c_{ij} + a_i < a_j $ となってしまい，$a_j$の定義に反する．

　準備ができたので，(1)-(3)を示す．
　(1) Fact 1 と Fact 4 から明らか．
　(2) の左から右は，Fact 2．右から左: $q$が$p$から到達できないとすると，$a_q - a_p = M - 0 = M$．Mは前述の条件の下でいくらでも大きく取れる．
　(3) Fact 2から，$x_q - x_p$ は，最短路長を超えられない．一方で，Fact 4より $(a_i \mid i \in V)$ は制約を満たし，$a_q - a_p$ は，Fact 3 より，最短路長である．
(終)
php-master-changes 2019-05-17

今日は文字列結合演算子の優先度修正、sapi/litespeed の configure オプションの修正、テストのフィクスチャファイルのリネーム、ext/dom で、有効でない宣言のドキュメントを読み込んだ際に DOMDocumentType のプロパティへのアクセスで SEGV を起こす問題の修正があった！

# 2019-05-17
## bwoebi: Merge branch 'deprecate_concat_add_sub' into PHP-8.4
- https://github.com/php/php-src/commit/cbc90b1f6e97cfa5b8ff990f9343c684bd1039a4
- [7.4~]
- PHP 7.4 で文字列結合演算子 . と加減算の +- を括弧なしで使うのを非推奨化
- [RFC の受理された](https://wiki.php.net/rfc/concatenation_precedence) 奴
- コミットコメントにはツッコまないぞ……！

## bwoebi: Merge branch 'concatenation_precedence'
- https://github.com/php/php-src/commit/af12aa8124232b8fb6e96736e1232f6e0d2554e8
- PHP 8.0 で文字列結合演算子 . が加減算の +- より優先度が低くなるよう修正

## petk: Rename configure --with-litespeed to --enable-litespeed
- https://github.com/php/php-src/commit/8e456d3b9e34ce0bf26ec23a2c88cae2bedec7dd
- sapi/litespeed で、--with-litespeed の configure オプションを --enable-litespeed に改名
- 追加のライブラリとかを使う際に --with-hoge、それ以外の機能有効化は --enable-hoge なので sapi/litespeed は enable の方ですね、という

## petk: Update UPGRADING about LiteSpeed
- https://github.com/php/php-src/commit/16e910ccfd8c7659973f0a8a13744d412e30496f
- [7.4~]
- ↑を UPGRADING へ追記

## petk: Use *.data for fixture files
- https://github.com/php/php-src/commit/bd1bd38a3579a6507551a2cfa34713cdc92cf081
- [7.4~]
- ext/zlib で、テストのフィクスチャに .data の拡張子をつけるよう修正

## cmb69: Fix [#78025](https://bugs.php.net/bug.php?id=78025): segfault when accessing properties of DOMDocumentType
- https://github.com/php/php-src/commit/e246dea9fe4d679f20de298c753d9ad083dbad68
- [7.2~]
- ext/dom で、有効でない宣言のドキュメントを読み込んだ際に DOMDocumentType のプロパティへのアクセスで SEGV を起こす問題の修正
- 空文字を返すよう修正された
glideappでアプリを作ってみよう

# GlideAppsとは?

Google Spreadsheetに簡単にアプリのようなUIをかぶせることができるツールです。
https://www.glideapps.com

# 何ができるの？
Google Spreadsheetをデータソースとして、基本的なList -> Detail表示を基本としたアプリケーションを作成できます。
複数のタブに異なる情報を表示したり、シート間に参照関係を定義することでリンクすることもできます。

かなり制約は多いですが、うまく使うと意外といろんなことが実現できます。

# 認証方法
簡単なパスワード認証と、メールアドレスのピン番号認証をサポートしています。

* 公開 (Public)
* メール認証あり公開 (Public with email)
* パスワード認証 (Password)
* 登録メールアドレス(or ドメイン)のみに公開 (Email whitelist)

# Google Spreadsheetの機能
Excelに慣れている人は多分知らない機能として、「ARRAYFORMULA」のような、数式を入力したセル以外にも結果を出力することができる関数があります。特にアプリから編集を行う場合には、ARRAYFORMULAを使ったほうが行の増加に対応しやすいです。

# ボドゲ会アプリ
いろいろ試してみるサンプルとして、友人と不定期に行なっているボドゲ会の履歴を見るアプリを作成中です。
https://gamesweplayed.glideapp.io

同じシートから複数のアプリを作ることができるので、僕らが実際に記録に使うための編集機能つきのバージョンも作っています。
Leetcode #23: Merge k Sorted Lists

```swift
func mergeKLists(_ lists: [ListNode?]) -> ListNode? {
    guard !lists.isEmpty else { return nil }
    guard lists.count > 1 else { return lists[0] }
    
    let middle = lists.count / 2
    let left = mergeKLists(Array(lists[0..<middle]))
    let right = mergeKLists(Array(lists[middle...]))
    
    return mergeTwoLists(left, right)
}

func mergeTwoLists(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
    guard let l1 = l1 else { return l2 }
    guard let l2 = l2 else { return l1 }
    
    if l1.val < l2.val {
        l1.next = mergeTwoLists(l1.next, l2)
        return l1
    } else {
        l2.next = mergeTwoLists(l2.next, l1)
        return l2
    }
    return nil
}
```
【Unity】ローカル変数のreadonly（読み取り専用）を実現する方法【C#】

# はじめに
C++を書いてた人が「C#はローカル変数を読み取り専用にできない」と嘆いていたので実現方法を考えてみました。

# やりたいこと
* [C#コミュの読み取り専用ローカル変数](https://mixi.jp/view_bbs.pl?comm_id=24497&id=5519321)

>
C#の文法で分からない事があります｡ 
読み取り専用の参照型ローカル変数を作る方法はあるのでしょうか? 

>
他の言語で例を示しますと 
・C++では my_class* const myc = new my_class(); 
・Javaでは final MyClass myc = new MyClass(); 
と書きますがC#ではどう書くのかが分かりません｡ 
ひょっとして方法がないですか !? 

>
読み取り専用にしたい目的は 
(1)プログラムの読み手に、スコープを抜けるまで変更しない意志を伝える｡ 
(2)コンパイラーに変数の不変を保証させる｡ 
(3).NETランタイムの最適化を控えめに期待する｡ 
(4)僕の好み｡(^^;) 

>
調べた内容 
・const ローカル変数には使えるのですが、参照型はstringとnullしか指定出来ません｡ 
・readonly ローカル変数には使えません。 
他に相当する予約語が見あたりませんでした｡ 

## 多言語での書き方

```.cpp
// C++
my_class* const myc = new my_class(); 
```

```.java
// Java
final MyClass myc = new MyClass(); 
```

```.js
// JavaScript
const foo = new Foo();
```

他の言語には変数を読み取り専用化するためのキーワードがあるみたいです。

# C#での実現方法
いろいろ調べても「できない」という結論が多かったのですが、`using()`の副作用を使ったやり方を思いついたので紹介します。

参照を書き換えできないラッパークラスを作って`using()`を使います。

```foo.cs
using System;
using UnityEngine;

public class FooScript : MonoBehaviour
{
    void Start()
    {
        using (var foo = new Readonly<Foo>(new Foo(1)))
        {
            // valueを通じてインスタンスにアクセス可能
            Debug.Log("id: " + foo.value.id);

            // 再代入はコンパイルエラー：
            //   Using variable 'foo' is immutable. The assignment target must be an assignable variable, property or indexer
            foo = null;
        }
    }
}

public class Foo
{
    public readonly int id;

    public Foo(int id)
    {
        this.id = id;
    }
}

public class Readonly<T> : IDisposable
{
    public readonly T value;

    public Readonly(T value)
    {
        this.value = value;
    }

    void IDisposable.Dispose()
    {
    }
}
```

`using()`に渡した変数は再代入不可になります。再代入するコードはコンパイルエラーになるので、やりたいことは実現できています。

* `using()`が必須
* `using()`に渡すインスタンスに制限がある
  * `IDisposable`を実装している必要がある
  * スコープを抜けるときに`Dispose()`が呼ばれても大丈夫な実装である必要がある
* `using()`の副作用を利用している
* 一行で書けない、長い

なので推奨はしませんが、どうしてもやりたくなったときに実装コストとトレードオフで検討してみてください。

ちなみに自分で実装した`Readonly<T>`クラスの代わりに[UniRx](https://github.com/neuecc/UniRx)の`ReactiveProperty`,`ReadOnlyReactiveProperty`を使うこともできます。

```cs
using (var foo = new ReactiveProperty<Foo>(new Foo(1)).ToReadOnlyReactiveProperty())
{
    Debug.Log("id: " + foo.Value.id);
    foo = null; // この行はコンパイルエラー
}
```

## C# 8.0だともっと短く書けるかも
* [リソースの破棄 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](https://ufcpp.net/study/csharp/oo_dispose.html)

```cs
using var a = new DeferredMessage("a");
```

C# 8.0だと`using`が1行で書けるので短く書けそうです。

# 参考

* [C# 7に向けて(1): 変数やフィールドの書き換え](https://ufcpp.wordpress.com/2015/02/01/c-7に向けて1-変数やフィールドの書き換え/)
* [C#ならではかな？不変型。変わらない良さ。変わるとき。](http://yamayatakeshi.jp/cならでは？不変型%E3%80%82変わらない良さ%E3%80%82変わるとき/)
AWSのec2インスタンスとVSCodeのSFTPの繋げ方

久々にvscodeを使った時にSFTPで繋いで便利になったので、紹介しようと思います。

# SFTPとは

##### 通称:SSH File Transfer Protocolである
**sshの仕組みを使ってコンピュータ間でのファイルを安全に転送するためのプロトコル**で、仕事でftpを使うなら安全性のためにsftpを使ったほうがいい。

### まずはAWSでEC2でインスタンスを何か立ち上げておく
<img width="744" alt="スクリーンショット 2019-05-18 17.34.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263492/33d49b94-5fe4-5e1b-dfa4-1fb6af418eb1.png">

そして、ターミナルなどでインスタンスをssh接続で立ち上げておく。

<img width="211" alt="スクリーンショット 2019-05-18 17.38.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263492/bfed5f6a-56f9-7d2b-0130-12ffae1a0c3b.png">



### VSCodeのSFTPをインストールする

<img width="819" alt="スクリーンショット 2019-05-18 17.30.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263492/1993da8b-d489-beb1-f440-f99551d7deae.png">


UsageにあるwindowsならCtrl+shft+PかmacならCmd+Shft+Pで検索ボックスで、SFTP：configを実行する。

### fstp.jsonが生成される





<img width="448" alt="スクリーンショット 2019-05-18 17.47.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263492/a27c741b-1850-560c-edd3-3654e1bc9538.png">

|name|自分のサーバに名前をつける|
|---|---|
|host|自分のインスタンスのパブリックIPアドレス|
|protocol|そのままsftp|
|port|そのままssh|
|username|インスタンスのusername whoamiコマンドで見れる|
|privateKeyPath|Pemファイルの絶対パス|
|remotePath|接続先のディレクトリ|
|uploadOnSave|保存したら自動で更新してくれる|

そして、そのまま一旦jsonファイルを保存します。

##### SFTP：List ALL
Ctrl+shft+PかCmd+Shft+PでSFTP：List ALLでインスタンス上のディレクトリが表示されるので、自分がファイルを編集したいディレクトリに行き編集や新規作成を行うことができます。

<img width="597" alt="スクリーンショット 2019-05-18 17.57.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263492/d5418abe-ea81-6414-79b0-478ab037e426.png">


#### まとめ

SFTPを使うことで安全にリモートのサーバに繋いで編集や作成が可能なので、とても便利です。もちろん、AWSのインスタンス以外でも使えますのでよかったら試してみてください。
【Rails】before_destroyでmodelの削除可否チェック

## modelの削除可否チェックを実装したい

親modelが複数の子modelを持っているケースで、

```ruby:parent.rb
class Parent < ActiveRecord::Base
  has_many :children, dependent: :destroy
end
```

```ruby:child.rb
class Child < ActiveRecord::Base
  belongs_to :parent
end
```

ここで、**子modelが0件になってしまう場合は削除できない**のような削除可否チェックを挟みたい場合は、 子modelに[before_destory](https://railsguides.jp/active_record_callbacks.html#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AEdestroy) で実装すると良い。

```ruby:child.rb
class Child < ActiveRecord::Base
  belongs_to :parent

  # 追加
  before_destroy :must_not_destroy_last_one_child

  private

  def must_not_destroy_last_one_child
    throw(:abort) if (parent.children - [self]).empty?
  end
end
```

## 親modelごと削除したいときに子modelのbefore_destoryが邪魔になる
このままだと、親modelごと削除するときに子modelのbefore_destoryに引っかかってエラーとなってしまう。

親modelごと削除の場合は、[destroyed_by_association](https://github.com/rails/rails/blob/b9ca94caea2ca6a6cc09abaffaad67b447134079/activerecord/lib/active_record/autosave_association.rb#L259) が設定されているので、その値を見てreturnしてしまえばよい。

```ruby:child.rb
class Child < ActiveRecord::Base
  belongs_to :parent

  before_destroy :must_not_destroy_last_one_child

  private

  def must_not_destroy_last_one_child
    return if destroyed_by_association.present? # 追加
    throw(:abort) if (parent.children - [self]).empty?
  end
end
```

これで解決:smile:

## 余談

親model側で、 `dependent: :delete_all` に変えることでActive Record コールバックを発生させないというアプローチもあるが、これはおすすめしない。

今後、子modelにコールバックが追加されたり、孫modelが増える可能性とか色々を考慮すると、不正なデータを発生させないために考えることが増えてしまうので。。
STM32CubeIDEを使ってみよう　How To STM32CubeIDE 日本語版　(6) 　UARTを使ってみよう(2)

STM32CubeIDEを使ってみよう　How To STM32CubeIDE 日本語版　(5) 　UARTを使ってみようの続きです。

今回は、受信した文字に応じて動くプログラムを作ってみましょう。
case文を使って、条件分岐し、LEDを動かすプログラムを作ります。
同じような記事がどこかにあったのですが、見つけれませんでした。
類似の資料として以下２つのサイトがありますので、こちらもぜひご覧ください。

・STM32でUARTをやってみる2
http://gsmcustomeffects.hatenablog.com/entry/2017/03/23/120043
・UARTを使ってみる
https://nucleo87.webnode.jp/nucleo%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/uart%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86%EF%BC%81/

まずは、プログラムの内容を考えてみしょう。
TeraTermなどで文字を受信すると、その内容によりLEDが点灯したり、消灯したりしたいと思います。
まずは、文字を受信するプログラムを書いてみます。
HAL_UART_Receiveが文字を受信するプログラムです。
使用するポートはhuart2です
pDataには、受信する文字列を入れる名前です。
今回は、revとします。
このため、intやcharなどで　revを定義しましょう。
int やcharは、文字を入れたいか、数字を入れたいかで決めましょう。
sizeは入れるサイズで、timeoutは適宜入れましょう。
char rev;
HAL_UART_Receive(&huart2,&rev,1,3000
が決まりました。

![61-1-1-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/64ca89cd-cdba-6c40-ecec-722d288b447c.jpeg)
![61-1-1-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/bcf8cc7c-2d4c-28ef-eb97-1859e1111f9e.jpeg)


もし、xxと受信したらLEDを点灯させる
今回は、1と入れたらLEDが点灯する、２を入れたら消灯するとします。

  switch(rev)
 {case '1':～～～
｝
となります。
ちなみに、最後に「== HAL_OK」が必須です。

![61-1-1-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b07039db-0fe4-6507-4275-91c1cd832f65.jpeg)

ここまで来て、動かない時に、なぜだろうか？と思う時があると思います。
なので、本当に押したキーを認識するかのプログラムを追加しましょう

前回と同じように作ってみましょう。
char rec1[] ="Receive1\r\n";
HAL_UART_Transmit(&huart2,(uint8_t *)rec1,sizeof(rec1),1000);

それでは、プログラムを作ってみましょう。
![61-1-1-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/99e9e3b3-fc38-0a7c-4f4b-003e190bc48b.jpeg)

```
  /* USER CODE BEGIN 2 */
   char msg[] ="Hello STM32\r\n";
   char msg2[] ="PushButton\r\n";
   char rec1[] ="Receive1\r\n";
   char rec2[] ="Receive2\r\n";
   char nonans[] ="Not Understand \r\n";

   char rev;

   HAL_UART_Transmit(&huart2,(uint8_t *)msg,sizeof(msg),3000);

  // HAL_UART_Transmit(&huart2,(uint8_t *)msg,strlen(msg),3000);

   /* USER CODE END 2 */
     /* USER CODE BEGIN 3 */
	   if(HAL_UART_Receive(&huart2, &rev, 1, 1000)==HAL_OK){
		   switch(rev)
		 		   {
		   case '1':
			   	   	   HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin,1);
					   HAL_UART_Transmit(&huart2,(uint8_t *)rec1,sizeof(rec1),3000);
					   break;
		   case '2':
					   HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin,0);
					   HAL_UART_Transmit(&huart2,(uint8_t *)rec2,sizeof(rec2),3000);
					   break;
		   default:
			   		   HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
			   	   	   HAL_UART_Transmit(&huart2,(uint8_t *)nonans,sizeof(nonans),3000);
					   break;
		 		   }
	   }
   }
  /* USER CODE END 3 */
```

うまく動くと、１を押すと、LEDが点灯し、２を押すと消灯、それ以外だと点灯消灯が切り替わると思います。
【ラビットチャレンジ】 応用数学 第三章 情報理論 レポート

#自己情報量
情報量はエントロピーとも言う．
事象の不確かさを測る尺度．噛み砕いて言うと情報の価値を示し，めったに起こらない事象だと大きくなる．
事象の起こる確率を$P(x)$，確率の逆数を$W(x)=\frac{1}{P(x)}$とする．
$$I(x) = -\log\bigl(P(x)\bigr)=\log\bigl(W(x)\bigr)$$

- 対数の底が$2$のとき，単位はbit．（事象の数を表すために必要なスイッチの数）
- 対数の底が$e$のとき，単位はnat．（微分積分など計算が容易．）

元の情報量に対する変化量の大きさという考え方．
$$\Delta I=\frac{\Delta w}{w}$$$$dI=\frac{dW}{W}$$両辺積分して，$$I=\log W$$


独立な事象がともに起こるという事象の情報量は，独立な事象の情報量の和になる．
$$I(x) = -\log\bigl(P_A(x)P_B(X)\bigr)=-\log\bigl(P_A(x)\bigr)-\log\bigl(P_B(x)\bigr)$$

> 物理のエントロピー $\Delta S$ は，エネルギー$E$ と 温度$T$を用いて，
> $$\Delta E = T \Delta S$$

#シャノンエントロピー（平均情報量）
自己情報量の期待値．


```math
\begin{align}
H(x) &= E\bigl(I(x)\bigr)\\
&=-E\bigl(\log\bigl(P(x)\bigr)\bigr)\\
&=-\sum\bigl(P(x)\log\bigl(P(x)\bigr)\bigr)
\end{align}
```

#カルバック・ライブラー ダイバージェンス
KLダイバージェンス，KL距離とも言われる．
同じ事象・確率変数における異なる確率分布$P$,$Q$の違いを表す．

```math
\begin{align}
D_{KL}(P\Vert Q) &= \mathbb{E}_{x\sim P}\left[ \log \frac{P(x)}{Q(x)}\right] \\
&= \mathbb{E}_{x\sim P}\left[ \log P(x)- \log Q(x)\right]\\
&= \mathbb{E}_{x\sim P}\left[ I_Q-I_P\right]
\end{align}
```

$\mathbb{E}_{x\sim P}$は$P$で平均を取る（確率分布$P$における期待値）という意味．


$Q$は事前分布，$P$は事後分布．
新たな情報を知ることで確率変数に対してどの程度の情報を提供したかを示す．

確かに，$ \mathbb{E}_{x \sim P} \left[ I_Q - I_P \right]$は，事象の不確かさ（情報量）の減少を表す式である．

#交差エントロピー
KLダイバージェンスの一部を取り出したもの．
具体的には，$D_{KL}(P\Vert Q)$に$H(P)$（$P$の平均情報量）を足したもの．
$\mathbb{E}_{x \sim P} \log P(x)$の項が無くなる．

```math
\begin{align}
H(P,Q) &=H(P)+D_{KL}(P\Vert Q)\\
H(P,Q) &= -\mathbb{E}_{x \sim P} \log Q(x)
\end{align}
```

$Q$についての自己情報量を$P$の分布で平均している（= 交差）．
符号化方式が，真の確率分布$P$ではなく，ある所定の確率分布$Q$に基づいている場合に，とりうる複数の事象の中からひとつの事象を特定するために必要となるビット数の平均値を表す．

$H(P,Q)=H(P)=H(Q)$のとき，$P$と$Q$は一致．

<br>
<br> 

[DeepLearning ラビットチャレンジ](http://ai999.careers/rabbit/　"ラビットチャレンジリンク")
<img src="http://ai999.careers/tools/wp/wp-content/uploads/2018/12/card.png" width=50%>
Leetcode #25: Reverse Nodes in k-Group

```swift
func reverseKGroup(_ head: ListNode?, _ k: Int) -> ListNode? {
    let dummyHead = ListNode(0)
    var start = dummyHead
    start.next = head
    var current = head
    var stack = [ListNode]()
    while current != nil {
        for _ in 0..<k {
            if let node = current {
                stack.append(node)
            } else {
                break
            }
            current = current?.next
        }
        if stack.count == k {
            while !stack.isEmpty {
                start.next = stack.removeLast()
                start = start.next
            }
            start.next = current
        }
    }
    return dummyHead.next
}
```
音響技術におけるソフトウェアの役割

音響技術におけるソフトウェアの役割を考えるにあたり、
歴史的、物理的、論理的な分類を行う。

#歴史的


#物理的
##電気・電子

###集音・拡声・出音
音響技術に電気を用いるようになったのは、集音と拡声がある。
集音器(microphone)から電気信号を出音箱(speaker)に送る。
間には、電気信号の拡声器(amplifier)が入る。

###録音・出音
レコードに録音し、出音する仕組み

##混合・編集
混合器(mixer), 編集機(editor)


##音響効果(effector)
Equalizer


#論理的

##音のファイル形式
AAC
AIFF
BWF (Broadcast Wave Format) 
Ogg 
Opus 
MP3
MPEG-4 ALS
WAV
WMA(Windows Media Audio)

##音のライブラリ
DirectSound  dsound.lib
DxLib
ALSA (Advanced Linux Sound Architecture) 
TheAmazingAudioEngine2
https://github.com/TheAmazingAudioEngine/TheAmazingAudioEngine2
Coreaudio
https://lists.apple.com/mailman/listinfo/coreaudio-api

###関連ライブラリ
TPCircularBuffer
https://github.com/michaeltyson/TPCircularBuffer

##音の入力ソフト

##音の出力ソフト

##音の編集ソフト

###楽譜編集ソフト

#参考資料

オーディオアプリ開発でありがちな4つの間違い
https://postd.cc/four-common-mistakes-in-audio-development/

##参考資料 on Qiita

C言語でシンセサイザー作成入門（その１）
https://qiita.com/MachiaWorx/items/87968666a2baf9fcc493
Ionic+Cordovaの開発環境の作成

# はじめに
1つのソースで、Androidアプリとiosアプリの両方を開発できるか試したかったので、Ionic + Cordova の開発環境作ってみました。簡単に作れたので、それほど書くことはありませんが、手順を書いておきます。

# 前提となる開発環境
以下の3つの開発環境がすでに存在しているPCで試しています。
- Android開発環境 (Android Studio)
- ios開発環境 (Xcode)
- Node.js

# 導入手順
- ionicとcordovaをインストールします。

```
$ npm install -g ionic cordova
```

- ionicのサンプルアプリケーションを作成します。ここでは、アプリ名をmyApp、tabsのアプリケーションとします。

```
$ ionic start myApp tabs
```

- アプリケーションを起動します。
ブラウザを起動すると、以下のように作成したサンプルアプリケーションが見られます。

```
$ cd myApp
$ ionic serve
```

<img width="200" alt="20190518-ionic-cordova-browser.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404406/bd9a8eb3-dbed-6a93-1acc-12338a6fc026.png">


- Cordovaで作成するOSを追加します。

```
$ ionic cordova platform add ios
$ ionic cordova platform add android
```

- 各エミュレータでアプリの起動します。
- 
```
$ ionic cordova run ios
$ ionic cordova run android
```

<img width="200" alt="20190518-ionic-cordova-ios.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404406/c9d72056-a042-ae02-1e06-3db38ad21165.png">

<img width="200" alt="20190518-ionic-cordova-android.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404406/27af06a7-ef31-9aaf-ae74-7e0ca7bdb403.png">


# 参考文献
- [IonicのGet Started(公式)](https://ionicframework.com/getting-started/#cli)
地理院地図をQGISで使う

　GISの利用について、自分自身の備忘録としてメモっておく。
　しばらくすると忘れてしまうし。

#地理院地図で利用できる地図
　[地理院地図](https://maps.gsi.go.jp/#5/36.104611/140.084556/&base=std&ls=std&disp=1&vs=c1j0h0k0l0u0t0z0r0s0m0f1)とは、国土地理院がインターネット上に公開している地図サービスのこと。
　公共測量は国土地理院に報告する義務（測量法第40条第1項）があるので、国土地理院の地図が最も正確な日本地図となる。
　現在、公開されている地図で、普通の事務に使えそうなものをリストアップしてみる。

##標準の地図（ベースマップ）
　学校で使った地図帳のような日本地図から、どんどんズームインしていくと都市計画図などをベースにした詳細な地図まで見られる。
　標準色と淡色地図、白地図がある。
##空中写真
　10年位毎に全国を撮影しているようで、地図の選択項目には何種類かある。
　地域により、利用できる年代が違う。
　秋田市の場合、1960年代、1975頃、現在が利用できる。
##治水地形分類図
　ベースマップに重ねて表示する。
　その地域が、どのような成り立ちでできた土地か分類している。
　例えば、昔は河川の流路だったとかわかる地図。

#地理院地図の使い方
　地理院地図のページを開くとベースマップが表示されるので、そのまま見たいところをズームインすれば良い。
　空中写真などは、左側にあるメニューから選択して表示する。
　地図のレイア毎に透過度を設定できる。

#どんなことに使えるか？
##地理院地図の特徴
###住所のピンポイント表示は苦手
　Google mapなら、住所を入力すると、その住所に飛ぶことができるが、地理院地図では難しい。
　地理院地図は、緯度経度で探すのは得意だろうけどね。

###インターネット上の利用は比較的自由
　国がopen dataを推進しており、国土地理院の地理院地図も比較的制限の少ないライセンスで利用できる。
　特に普通の使い方なら利用料はかからないのは強みだと思う。
　インターネット上で普通に閲覧するだけでない場合、ライセンスの確認が必要。

###当然、最も信頼できる地図
　日本の地図作成の権威が作成しているため、地形図としては最も正確と思われる。

##普通の事務仕事での使いみち
　まず思いつく利用法として、文書内に張り込む地図としての利用が考えられる。
　この場合、「地理院地図」というロゴを埋め込めばサイズや枚数に制限があるが利用できる。

　他に昔の空中写真が利用できることから、過去の土地の利用状況を調べることができる。
　昔の状況を調べたい、というのはビジネスでは結構あると思う。
　そういうときに地理院地図は便利だと思う。もし、高解像度写真が必要なら、国土地理院のサイトから注文もできるようだし。

　例えば、家を買ったり建てる際、その買おうとしている土地が、かつて、どのようなところだったのか確認できるわけですな。
　昔からの地名で「なんとか沢」などのように水にちなむ言葉が含まれている場合、昔、河川沿いだったり沼地だったりするといわれているけど、宅地開発が本格化する前の時代、例えば高度経済成長期のあたりの空中写真を確認すれば、はっきりと確認できる。
　この場合、治水地形分類図を重ねて利用すれば、もっと情報量は増えると思われる。
（日本の平地は河川の流域に発達しているところが多いので、地番の善し悪しを考え始めると､適地はかなり減ると思うけど・・・・）

##ちょっと高度な利用方法
　ブラウザからでは正確な位置を探すのが難しい場合がある。
　特に空中写真は縮尺が小さいのでピンポイントで探すのが難しい。
　こういう場合、どうするか？
　GISの背景地図にすれば良い。

#qgis3.4以降での利用方法
　GISで利用するとしても、商用GISはすごく高い。
　費用がかからず、本格的かつわかりやすいGISは、[qgis](https://qgis.org/ja/site/)が挙げられる。
　稼働環境が、Windows、FreeBSD、Linux、OS X等マルチプラットフォームになっていることも、使用する環境を選ばす良い。
　ネットで情報を検索すると、大学や国などが使用方法の講習会を開いているため今後普及が進むと思われる。
##地理院地図の表示方法
　地理院地図はWebサービスの一種で、Google mapと同じ地図タイルを配信している。
　画面に表示したい領域をリクエストして、送られてきたタイルを表示するわけですね。
　このデータ送受信の方法を設定する必要があり、国土地理院の[「地理院タイル一覧」](https://maps.gsi.go.jp/development/ichiran.html)の詳細欄に情報が記載されている。
　例えば、標準地図を使用したい場合は
　　URL：https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png
の情報を設定する。
　zがズームレベル（どの領域を指定するか）、Xとyが必要なタイルの位置を示すらしい。）
　詳細は国土地理院の[地理院タイル仕様](https://maps.gsi.go.jp/development/siyou.html#siyou-zm)に記載されている。

　qgisで具体的にどう設定するか。
　qgisは3シリーズになっており、最新版（2019/5/18現在）の3.6では標準機能で地図タイルが表示できる。
　qgis起動時に表示されている「ブラウザ」に「Z/X/Y tiles」という項目があり、これが地理院地図などインターネット上の地図サービスを設定する項目になる。
　「Z/X/Y tiles」をマウスで選択し、右クリックすると「新しい接続」というダイアログが表示されるので、名前設定し、url欄に先の情報を入力する。

　
#参考図書
　全く初めての場合、手がかりが欲しいと思うが、そのとき参考になりそうな本。　

###朝日浩輔、大友翔一、水谷貴行、山手規裕著『統計・防災・環境情報がひと目でわかる地図の作り方』
　技術評論社　2014年　[出版社の紹介ページ](https://gihyo.jp/book/2014/978-4-7741-6913-2)
　地図の基本から解説され、具体的な作業手順も紹介されていて、わかりやすい。既に改訂版が刊行されている。
###『Interface 2017年10月号』
 CQ出版社
　「IoTのためのラズパイ地図・地形・地球大集合」という特集に、地理院地図等、いろいろな地図情報がまとめられている。
AzureVM(ubuntu 18)にdocker＆docker-composeをインストール

# tl;dr
AzureVM(ubuntu server 18.04 LTS)にdockerをインストールします。

# dockerのインストール
```
$ sudo apt update
$ sudo apt install -y apt-transport-https gnupg-agent
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get install -y docker-ce
```

ここで一旦dockerの起動を確認します。

```
$ sudo docker run hello-world
```

問題がなければ「Hello from Docker!」と表示されます。

#dockerの便利設定
sudoなしでのdocker実行、dockerの常時起動設定です。

```
$ sudo usermod -aG docker $USER
$ sudo systemctl start docker
$ sudo systemctl enable docker
```

設定後、再起動します。

# docker-composeのインストール
curlコマンドで取得するバイナリのバージョンに注意！

```
$ sudo curl -L https://github.com/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
```

docker-composeの動作確認

```
$ docker-compose --version
```
問題がなければdocker-composeのバージョンが表示されます。
[Terraform] gcp でサービスアカウントを作らずに apply

# はじめに
タイトル通りです．需要は謎です．ぱっと調べた感じなかったので残します．
ユーザアカウントはあるがterraformのためのサービスアカウントを作る権限が与えられていないという状況です．
# ユーザアカウントのキーの居場所
いろいろ探し回ると`~/.config/gcloud/legacy_credentials/`にありました．これをcredentialsに指定して，あげたらできました．
# 結論
``` 
provider "google" {
  project = "hoge-project"
  credentials = "${file("~/.config/gcloud/legacy_credentials/[user_account]/abc.json")}"
}
```
Leetcode #30: Substring with Concatenation of All Words

```swift
func findSubstring(_ s: String, _ words: [String]) -> [Int] {
    if words.count == 0 {
        return []
    }
    let chars = Array(s)
    var answer = [Int]()
    let length = words[0].count
    var dict = [String: Int]()
    for word in words {
        if let value = dict[word] {
            dict[word] = value + 1
        } else {
            dict[word] = 1
        }
    }
    
    for i in stride(from: 0, through: s.count - words.count * length, by: 1) {
        var tmpDict = dict
        var possible = true
        for j in 0..<words.count {
            let str = String(chars[(i+j*length)..<(i+j*length+length)])
            if let value = tmpDict[str] {
                if value == 1 {
                    tmpDict.removeValue(forKey: str)
                } else {
                    tmpDict[str] = value - 1
                }
            } else {
                possible = false
                break
            }
        }
        if possible {
            answer.append(i)
        }
    }
    return answer
}
```
基礎知識の補填　Python（例外処理）

今回は、Pythonの例外処理についてのアウトプットをしていく。

正直、現場に入ってコードを書くまでは、if文とかとの使い分けがよくわかってなかったこともあり、今回改めて復習。

## try except文を使う理由
使用する主な理由としては、「エラーを検知させること」。

if文は、「条件分岐」

for文は、「繰り返し処理」

try except文は、「エラー検知」

というイメージ。

## どんなときに使うのか

実行したい処理でエラーが発生しても処理を継続させたい場合などに用いる。

例を挙げてみる。

```python

Num = [1,2,3,4]
n = 5

#処理を継続させつつ、エラーを抽出することが可能
try:
    print(Num[n])  #リストから、５番目のデータを抽出
except:
    print('違うよ！！！！')  #データがない場合、「違うよ！！！！」とエラーを吐く

print('おにぎり')　#たとえエラーでも処理は継続し、「おにぎり」が出力される
```
```
#出力結果
違うよ！！！！
おにぎり
```
当然、Numのリストには、５番目のデータは存在しないのでエラーとして引っかかる。

そして、「おにぎり」が出力される。

## 特定のエラーのみを検知させる

上記で発生したエラーは正しくはIndexErrorの部類となる。

そのIndexErrorが発生したときのみエラーを検知させる方法↓↓

```python

Num = [1,2,3,4]
n = 5

try:
    print(Num[n])
except IndexError as ie:    # ieは、変数
    print('違うよ！！！！: {}'.format(ie))   #{}内にエラーが表示させる

print('おにぎり')
```
```
#出力結果
違うよ！！！！: list index out of range
おにぎり
```
また、違うエラー用のexcept文を追加した場合、

```python

Num = [1,2,3,4]
n = 5
del n  #nを削除

try:
    print(Num[n])
except IndexError as ie:
    print('違うよ！！！！: {}'.format(ie))
except NameError as ne:    #NameErrorを検知して、エラー内容を出力させる
    print(ne)

print('おにぎり')
```
```
#出力結果
name 'n' is not defined
おにぎり
```
### その他のエラーを検知したい場合

except Exception asを用いる。

```python

Num = [1,2,3,4]
n = 5
n = 'たまご'   #すぐに文字列を代入

#処理を継続させつつ、エラーを抽出することが可能
try:
    print(Num[n])
except IndexError as ie:
    print('違うよ！！！！: {}'.format(ie))
except NameError as ne:
    print(ne)
except Exception as ex:　#IndexError、NameError以外のエラーが発生した場合
    print('other: {}'.format(ex))

print('おにぎり')
```
↓str型だよ！と怒られる

```
#出力結果
other: list indices must be integers or slices, not str
おにぎり

```
### finallyを使って必ず実行させる
たとえエラーを検知しても必ず実行させることができるのがfinally↓↓

```python

Num = [1,2,3,4]
n = 5
n = 'たまご'

try:
    print(Num[n])
except IndexError as ie:
    print('違うよ！！！！: {}'.format(ie))
except NameError as ne:
    print(ne)
except Exception as ex:
    print('other: {}'.format(ex))
finally:    #←必ず実行したい処理
    print('絶対実行！')

print('おにぎり')
```
```
#出力結果
other: list indices must be integers or slices, not str
絶対実行！
おにぎり
```


## 参考教材
酒井潤さんのUdemy教材「Python 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイルを学び、実践的なアプリ開発の準備をする」
https://www.udemy.com/share/1013hkB0oeeV9XTXo=/
51歳からのプログラム　備忘録　「２つ数値 A>Bなら、B=Aとする」で躓く　そして解決に至らず。jquery

自作のプログラムで、
`<input type="number" name="A">`
`<input type="number" name="B">`

で、`A>B なら B=A` とする。
というコードを作ったら、うまくいかない。

（jqueryの読み込みコードは省略）

```html
<input type="number" name="A">
<input type="number" name="B">

//jquery
<script>
$(function(){

  //　関数　A　B　を比較して、 A>B なら　B=A　とする
  function test(){
    var A=$('input[name="A"]').val();  //　Aの値を取得
    var B=$('input[name="B"]').val();  //  Bの値を取得
    
    if(A>B){
       $('input[name="B"]').val(A);     //  Bの値をAの値にセット
    }
  }

  $('input[name="A"]').change(test);   // Aが変化したら 関数呼び出し 
  $('input[name="B"]').change(test);   // Bが変化したら 関数呼び出し
});
</script>
```
これを実行すると、ブラウザには、ボックスA、ボックスBが表示される。
Aに数字を入力すると、A>Bの時に、BはAの値と同じ値を表示する。

10の乗数の時に不具合
--
**不具合のパターン**
１　Bに任意な値を入力した後、Aに10の乗数を直接入力
　　-> Bは変化しない

２　Aのスピンボタンで入力値を増減させたときに
　　-> 10の乗数になるときにBは変化しない

３　Aに5を入力して、Bはスピナーで数を増やしていくと、
　　10に届いたところで5に戻る。
　　以降、Bをスピナーで増数しても、延々と5~10を繰り返す。

４　１）　Bに10～19、100～199、1000～1999、など整数を入力
　　　　　Aをスピナーで増数すると、2に達したときに、BはAと同数(2)を表示
　　２）　Bに20～29、200～299、2000～2999、などの整数を入力
　　　　　Aをスピナーで増数すると、3に達したときに、BはAと同数(3)を表示
　　３）　以降、桁の左の数字が変化する時に、
　　　　　桁の一番左の数字の繰り上がり数がAとなる様子。
　　　　　（桁の一番左側の数字は何というのでしょうか？）


\<javascript>でも同じだった。

```js
 window.addEventListener("DOMContentLoaded",function(){
    function test(){
      var inp1=document.getElementById('inp1');
      var inp2=document.getElementById('inp2');
      if(inp1.value>inp2.value){
         inp2.value=inp1.value;
      }
    }

    inp1.addEventListener('change',test);
    inp2.addEventListener('change',test);
  });
```

jqueryのコードをいじってみる。if文を削除。

↓↓↓↓↓↓↓ あなたの記事の内容
```js:
───────
```js
↑↑↑↑↑↑↑ 編集リクエストの内容
if(A>B){
    $('input[name="B"]').val(A);
}
```
↓

```js
$('input[name="B"]').val(A);
```
これで上記の不具合はなくなった。
桁の変化は、if文で判定すると不具合が出るのでしょうか？

でも、これでは目的な動作が実装できないので、

```js
// value　と min　を追加
<input type="number" name="A" value="1" min="1">
<input type="number" name="A" value="1" min="1">

// 10の乗数の時だけ、別途 B に A を代入
if(A%10==0){$('input[name="B"]').val(A);}
```
あとは、\<input type="number">で、スピナーを外せればいいのだけれど。
調べるのに時間かかりそう。もしくは不可能？

というわけで、今日は何も進められませんでした。ちゃんちゃん。
timeoutコマンドとsudoコマンドの注意点

## timeoutコマンドとは

`timeout`コマンドは、時間とコマンドを指定しコマンドを実行するコマンドです。たとえ無限ループであったとしても、実行開始から、指定した時間が経過した段階で、コマンドの実行を終了してくれます。

```shell
$ sleep 10  # 10秒間sleepして、プロンプトに戻る。
$ timeout 5 sleep 10  # sleepの指定は10秒だけど、5秒経過時点で終了してプロンプトに戻る。
```

```shell:test.sh
#!/bin/sh
while true;do
    echo "test"
done
```
```
$ ./test.sh  # 無限ループ。
test
test
test
...
(Ctrl+C)
$ timeout 5 ./test.sh  # 5秒で戻ってくる。
test
test
test
...
test
$
```

## timeoutコマンドをsudoコマンドと組み合わせたときの注意点

この`timeout`コマンドを`sudo`コマンドと組み合わせて使うとき、その指定の位置によって結果が変わってきます。

```shell
$ sudo timeout 10 ./test.sh  # パターン1 
$ timeout 10 sudo ./test.sh  # パターン2
```

この場合、10秒後にプロンプトに戻るのは**パターン1**です。**パターン2ですと、無限ループに突入したまま返ってきません。**

ちゃんと実装を見たわけではないですが、`timeout`コマンドが一般ユーザで実行されている以上、`sudo`によって管理者権限で実行されたプロセスを操作できなくなっているためと推測されます。

## どんなときに影響がでるのか

[BPF Compiler Collection](https://github.com/iovisor/bcc)という、便利な計測ツール群があります。

その中の[fileslower](https://github.com/iovisor/bcc/blob/master/tools/fileslower.py)というツールは、ディスクIOの遅いプロセスとファイルを表示してくれる便利なツールです。標準では読み込み/書き込みが10ms以上掛かっているプログラムを表示してくれます。

このツールは、実行するとストリーム状に無限に表示をし続けます。また、その性質上、スーパーユーザ権限を要求します。

おそらく、自動監視用と言うよりは、管理者がコンソールからその場で眺めるために使うツールなのだと思いますが、これをcronで定期的に取得したい場合や、他の監視ツールと組み合わせてiowaitが大きいときに実行したいという場合には、ちょっと使いにくいものになってしまいます。

その際に、`timeout`コマンドを利用すれば、一定時間内だけ取得してリダイレクトでファイルに出力と言うことも可能になります。その際に、`sudo`との関係が出てくるわけです。

実際に実行する際には、以下の様なコマンドをcron実行させることになると思います。

```shell
#!/bin/sh

sudo timeout 10 /usr/share/bcc/tools/fileslower -a
```

紛らわしい感じがしますが、`timeout`と`sudo`の位置は間違えないように注意です。

## 追記

cronで実行する際は、実行ユーザを設定ファイルで指定できるので、`sudo`を使う必要は無いかも知れないなというのは、書き終わったあとに気づいたことでした…

とはいえ、コンソールから実行する際も、本稿のことを考慮していないとうまく動かないこともあるかと思うので、このまま記事は残しておきます。
Discord Botがエラーを出したときにWebhookで自動通知する。

# 目標
ボットがエラー出したときにWebhookでエラーを通知してもらう。
# 環境
・Python3.7
・discord.py rewrite
・discord-webhook 0.4.1 
# インストール等
することが多いので略します。
★pipでインストールできます。

# さっそくソースコード
2つファイルが必要です。

```python:webhookerror.py

from discord_webhook import DiscordWebhook, DiscordEmbed
from discord_webhook import DiscordWebhook, DiscordEmbed

def error_log(message):
	webhook = DiscordWebhook(url='WebhookのURL',username="Webhookの名前")
	data=":exclamation: " + message+":exclamation:"
	embed = DiscordEmbed(title='エラー', description=data, color=0xff0000)
	webhook.add_embed(embed)
	webhook.execute()
```

```python:main.py
from discord.ext import commands
import discord
from discord.ext import commands as c
bot = commands.Bot(command_prefix='!', activity=d.Activity(name='ボットのエラーをWebhookで流します!', type=d.ActivityType.watching))
import webhookerror

#botのおかしなエラーをすべて取得。
@bot.event
async def on_command_error(ctx,error):
	webhookerror.error_log("エラーが発生しました：" +str(error)+"\nServername:"+str(ctx.guild.name)+"\nName:"+str(ctx.author))

#流れるかテストするためのコマンド
@bot.command()
async def test(ctx):
	prin()
```

# 実行
実行してみましょう!
Webhookからメッセージが送信されたら成功です!
# 最後に
今回はエラーをWebhookにエラー文を流せるようにしてみました。

そして、
discord.py rewrite 正式リリースおめでとうございます! :tada:

追記:なんでdiscord.pyのWebhookのやつ使わなかったかっていうと使い方がわかんなかったから。
XcodeでTread 1:signal SIGABRTが出てアプリが立ち上がらない原因と解決方法

## Tread 1:signal SIGABRTが出てアプリが立ち上がらない

以下のようなエラーが出る
<img width="1054" alt="スクリーンショット 2019-05-18 15.10.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324272/4d565fa0-1e1d-f583-8ef8-398b0ed62efe.png">

---

## 原因

コードとUI部品がつながっていない
control + ドラッグで コードを一度追加した後、コードの部分だけ手動で消したため

---

## 解決方法

View Controllerを右クリック
<img width="271" alt="スクリーンショット 2019-05-18 15.11.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324272/1aec1796-2d2b-7586-881c-60080157de58.png">

三角マークが出ている部分の×を押して接続を切る

<img width="209" alt="スクリーンショット 2019-05-18 15.11.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324272/cfb7cd8e-bb3c-4518-65a6-dc1f7e532f62.png">

以上
[Instagram] 自動でいいねをしてくれるシステム

# 概要
指定したハッシュタグを検索して、設定した回数分「いいね」を実行するシステム
既に「いいね」をしている場合は、パスをする
※いろいろなブログを参考にして実装しました

# 環境
 - Windows 10 Home
 - Windows Subsystem for Linux
 - Ubuntu 18.04.2 LTS
 - Python 3.6.7
 - Chromedriver 74.0.3729.6 (win32)
 - Selenium 3.141.0.dist-info

# Google Chromeのインストール
環境とバージョンが一致しないと起動しないため、注意が必要

```
$ wget http://chromedriver.storage.googleapis.com/74.0.3729.6/chromedriver_win32.zip
```

# Seleniumのインストール

```
$ pip3 install selenium
```

# ソースコード

```python

import sys
import os
sys.path.append('/usr/local/lib/python3.7/dist-packages')

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import urllib.parse
import time

#Webdriver
browser = webdriver.Chrome('/mnt/c/workspace/pydev/chromedriver.exe')

BASE_URL      = 'https://www.instagram.com/'
LOGIN_URL      = BASE_URL + 'accounts/login/?source=auth_switchwer'
TAG_SEARCH_URL = BASE_URL + 'explore/tags/{}/?hl=ja'

#selectors
NO_LIKE_FLAG = "//button/span[@class='glyphsSpriteHeart__outline__24__grey_9 u-__7']"

NOTICE_BUTTON = "//button[@class='aOOlW   HoLwm ']"
LIKE_BUTTON   = "//button[@class='dCJp8 afkep _0mzm-']"

MEDIA_SELECTOR      = 'div._9AhH0'
NEXT_PAGER_SELECTOR = 'a.coreSpriteRightPaginationArrow'

#USER INFO
username = 'Instagramのユーザ名'
password = 'Instagramのログインパスワード'

#params
tagName = '指定するハッシュタグ'
likedCounter = 0
likedMax = 100 # likeのMAX値

if __name__ == '__main__':

    # ログイン画面にアクセス
    browser.get(LOGIN_URL)
    time.sleep(3)

    # ログイン情報を入力してログイン
    usernameField = browser.find_element_by_name('username')
    usernameField.send_keys(username)
    passwordField = browser.find_element_by_name('password')
    passwordField.send_keys(password)
    passwordField.send_keys(Keys.RETURN)
    time.sleep(3)

    # 通知ボタンを押下
    browser.find_element_by_xpath(NOTICE_BUTTON).click()
    time.sleep(3)

    # 指定したハッシュタグを検索
    encodedTag = urllib.parse.quote(tagName)
    encodedURL = TAG_SEARCH_URL.format(encodedTag)
    print("encodedURL:{}".format(encodedURL))
    browser.get(encodedURL)
    time.sleep(3)

    # media click
    browser.implicitly_wait(15)
    browser.find_element_by_css_selector(MEDIA_SELECTOR).click()

    # 次へボタンが表示されないか、いいねがlikedMax分いくまでいいねし続ける
    while likedCounter < likedMax:
        time.sleep(15)
        try:
            browser.find_element_by_xpath(NO_LIKE_FLAG)
            browser.find_element_by_xpath(LIKE_BUTTON).click()
            likedCounter += 1
            print("liked {}".format(likedCounter))
        except:
            #読み込まれなかったり既にいいねしているならパス
            print("pass")
            pass

        # 次へ
        try:
            browser.find_element_by_css_selector(NEXT_PAGER_SELECTOR).click()
        except:
            break
        print("You liked {} media".format(likedCounter))
```

# 実行方法

```
$ python3 ファイル名.py
```
JavaScriptのコールバック関数とか簡単な非同期処理について

##コールバック関数とは

関数に引数として渡される関数のことです。

JavaScriptの関数は「ファーストクラスオブジェクト（第一級オブジェクト）」というもので、
数値や文字列のように変数に代入したり、配列にセットしたりと、
なんらかの計算処理ができたりといったプログラミングの基本機能が使えます。


上記を踏まえ、
関数を引数にして実行してみます。


```JavaScript:test.js
// 挨拶を実行
sample(hello);

// 関数を実行する関数
function sample(hoge) {
  hoge(); 
}

// 挨拶する関数
function hello() {
  console.log('hello');
}
```
関数を受け取る関数、なので高階関数というやつですね。

wikiによると...
>高階関数（こうかいかんすう、英: higher-order function）とは、
第一級関数をサポートしているプログラミング言語において、関数（手続き）を引数にしたり、
あるいは関数（手続き）を戻り値とするような関数のことである。

この様に実行できます。

無名関数でもOK。

```JavaScript:test.js
// 挨拶を実行
sample(function(){console.log(2)});

// 関数を実行する関数
function sample(hoge) {
  hoge(); 
}
```

さらに無名関数は省略出来るので…

```JavaScript:test.js
// 挨拶を実行
sample(() => console.log('hello'));

// 関数を実行する関数
function sample(hoge) {
  hoge(); 
}
```

こう書けます。

##コールバック関数と非同期処理の関係

簡単な非同期処理です。

```JavaScript
// 数字を順番に表示
console.log(1);
setTimeout(() => console.log(2), 1000);
console.log(3);
```

上から順番に実行されていきますが、
実際にコンソールに表示されるのは…

```console
1
3
2
```

こうなります。


###順番としては、
>console.log(1);で1を表示。
↓
setTimeout(～省略～);でタイマーをセット。
↓
console.log(3);で3を表示。
↓
タイマーの時間が経過したのでconsole.log(2);で2を表示。※非同期処理

つまりsetTimeoutがコールバック関数を実行しています。
このようにコールバック関数は非同期処理とともに用いられることが多いです。


##参考
https://maeharin.hatenablog.com/entry/20130308/javascript_function_ninjya

https://ja.wikipedia.org/wiki/%E9%AB%98%E9%9A%8E%E9%96%A2%E6%95%B0

https://qiita.com/YoshikiNakamura/items/732ded26c85a7f771a27
VirtualBoxのゲストOSのネットワーク設定コマンド

諸事情により社内でVirtualBoxのゲストOSの仮想NIC（ネットワークアダプタ）をホスト側の有線と無線への割当を頻繁に切り替えるため、コマンドでの切替方法を記載する。

以下の"Attached to"と"Name"の部分の変更をコマンド化する。ゲストVMの起動中に変更することを想定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149690/a48343d9-4429-626b-381e-36ed65a6ef32.png)

# ネットワークアダプタへの割当コマンドの書式

```
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" controlvm <VM名> <nic番号> <割当タイプ> <ホスト側割当アダプタ>
```
VBoxManage.exe controlvmのコマンドを使用することで、起動中のVMの設定を変更できる。modifyvmのコマンドはVMが停止していないと使用できないと理解している。


## 無線アダプタへブリッジ接続のコマンド例
```
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" controlvm windows10en nic1 bridged "Intel(R) Dual Band Wireless-AC 8265"
```

"Intel(R) Dual Band Wireless-AC 8265"の部分は以下のようにホストWindowsのアダプタのデバイス名で、プロパティから文字列をコピーできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149690/9e072599-99cb-ed79-aa42-7b71cb3f9a7e.png)

## 有線アダプタへブリッジ接続のコマンド例
```
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" controlvm windows10en nic1 bridged "Realtek USB GbE Family Controller"
```

## NAT接続のコマンド例
```
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" controlvm windows10en nic1 nat
```

## 割当解除のコマンド例
```
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" controlvm windows10en nic1 null
```

# NIC1の現在の割当先の確認方法
## コマンド
``` 
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" showvminfo windows10en | find "NIC 1:"
```

## 出力結果
``` 
NIC 1:                       MAC: **********, Attachment: Bridged Interface 'Realtek USB GbE Family Controller', Cable connected: on, Trace: off (file: none), Type: 82540EM, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny, Bandwidth group: none
``` 

# .bat化
以下のコマンドを.batファイルに記載し、ワンクリックで割当先の実行できるようにすると便利。
現在の割当先の確認、一度割当解除（念のため）、NIC1を有線アダプタへ割当、変更の割当先の確認という順でコマンドを羅列する。

```
@echo off
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" showvminfo windows10en  | find "NIC 1:"
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" controlvm windows10en  nic1 null
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" controlvm windows10en  nic1 bridged "Realtek USB GbE Family Controller"
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" showvminfo windows10en  | find "NIC 1:"
pause
```

# 参考URL
https://www.virtualbox.org/manual/ch08.html
Vue CLI 3のインストール（Mac）

私の環境の問題かもしれないが、Vue CLI 3 をインストール後、Macの再起動が必要だった

Vue CLI の公式ガイド
[https://cli.vuejs.org/guide/installation.html](https://cli.vuejs.org/guide/installation.html)
日本語訳
[http://www.fumiononaka.com/Business/html5/FN1807001.html](http://www.fumiononaka.com/Business/html5/FN1807001.html)

のとおりにグローバルに MacのターミナルでVue CLI をインストールし、

```
$ npm install -g @vue/cli
```
インストールされたバージョンを確認したが、”command not found”で確認できなかった

```
$ vue --version
-bash: vue: command not found
```
sudo を試しても同じ状態で変わらず

```
$ sudo npm install -g @vue/cli
Password:
```

PC（Mac）を再起動したところ、無事確認でき。 Vue コマンドを実行できるようになった

```
$ vue --version
3.7.0
```
【AWS；lightsail】SFTPなどでファイルアップロードできるようにする方法

#Permission denied (publickey). になりがち
解決方法
・基本的なことは他のサイトで乗っているので、それらを確認してから下記項目を実践してくだい。
###コマンド
```sudo chown -R bitnami /opt/bitnami/apps
```
terminalや、公式のSSHのやつで入力してみてね。
#パーミッション
新しいファイルのアクセス権は606に変更しましょう！
（wordpressのテーマエディターから編集できるようになるので楽。）
AzureVMにSSH 公開キーを使って接続

# SSH 公開キーを作成
シェルコマンドで公開キーを作成します。
私の場合は、「Git for Windows」( https://gitforwindows.org )についてくる「Git Bash」を使用しました。

```
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key : (ここに任意の名前)
Enter passphrase (empty for no passphrase): (ここに任意のパスワード)
Enter same passphrase again: ( パスワードを再入力 )
Your identification has been saved in {入力した名前}.
Your public key has been saved in {入力した名前}.pub.
```
これで、入力した名前で、秘密鍵ファイルと公開鍵ファイルが作成されます。.pubの拡張子がつくのが公開鍵です。
私の場合は、名前に「azure_playground_id_rsa」と入力したので、以下の２ファイルが作成されました。
・azure_playground_id_rsa
・azure_playground_id_rsa.pub
ここで設定したパスワードは忘れないようにしましょう。

# AzureVMを作成
azureのポータル（ https://portal.azure.com ）からVMを作成します。
![azurevm作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395902/a79545b5-2641-3812-2360-f6bdd7bf5317.png)

- 地域
  最寄りの拠点を選択しました。

- イメージ
  ubuntuの新しいほうを選択しました。

- サイズ
  試しに作ってみるだけなので、最少の構成にしました。

- 認証の種類
  SSH 公開キーで接続したいので、それを選択。

- ユーザー名
  管理者アカウント名を入力します。

- SSH 公開キー
  上で作成した公開鍵ファイルの内容（テキスト）をコピー＆ペーストします。

- パブリック受信ポート
  SSH接続をしたいので、「選択したポートを許可する」を選びます。
  
- 受信ポートを選択
  SSH接続したいので、「SSH」を選択します。

最後に、「確認および作成」ボタンをクリックします。
確認画面が表示されるので、そこで作成を確定します。

# AzureVMのipアドレス確認
azureのポータルの「Virtual Machines」画面より、VMのipアドレスを確認します。
一覧の末尾、「…」をクリックするとサブメニューが表示されるので、そこで「接続」を選択するとipアドレスを確認できます。
![キャプチャ6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395902/d4e53373-b73d-efbe-9d20-2be2a874bf31.png)



# SSH configの作成
テキストエディタにて、configファイルを作成します。

```
Host (任意の接続名)
  Hostname (VMのipアドレス)
  User (VM作成時に入力した管理者アカウント)
  IdentityFile (公開鍵ファイルのパス)
```

私の場合だと、以下になりました。

```
Host azure.playground
  Hostname ***.***.***.***
  User player
  IdentityFile C:\Users\quz\.ssh\azure_playground_id_rsa
```

# VMに接続
「Git Bash」にてsshコマンドを叩いて接続しました。
結果のipアドレス部分は「***」にて潰しています。
途中、「Enter passphrase for key」部分で、公開鍵作成時のパスワード入力を求められます。

結果

```
$ ssh azure.playground
The authenticity of host '***.***.***.*** (***.***.***.***)' can't be established.
ECDSA key fingerprint is SHA256:au2uqcm39rd3QMfymkGDqd770Z70V6td2LjlbnXp3Xs.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '***.***.***.***' (ECDSA) to the list of known hosts.
Enter passphrase for key 'C:\Users\quz\.ssh\azure_playground_id_rsa':
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.18.0-1018-azure x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Sat May 18 05:23:28 UTC 2019

  System load:  0.04              Processes:           115
  Usage of /:   4.1% of 28.90GB   Users logged in:     0
  Memory usage: 75%               IP address for eth0: 10.0.0.4
  Swap usage:   0%

0 packages can be updated.
0 updates are security updates.



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

player@playground:~$

```
線形のデータ構造について

##データ構造とは
データを保持するための形式や方法のことです。
そしてこの方法や形式にはさまざまな種類があります。
抽象データ型やクラスは同じ概念です。
データ構造やそれに付随した操作のことを抽象データ型やクラスという言葉を用いて表します。
この二つは概念としては同じですが、オブジェクト指向のプログラミングをサポートするような場合はクラス、オブジェクト指向をサポートしない場合は抽象データ型と区別されます。
「プログラムにおけるデータ構造はクラスもしくは抽象データ型」だということを覚えておきましょう。

##リストと配列の違いとは
リストが要素が順番に並んだデータ構造です。
リストと配列の違いとしては二つ挙げることができます。
一つ目がリストは要素の数を変えることができますが、配列はあらかじめ要素の数が決まっています。
二つ目がリストはどんな型でも格納することができますが、配列はあらかじめ決まった型のデータしか格納することができません。

##スタック
スタックは要素の挿入と削除がリストの先頭だけで行われ、「最後に入ったものが、最初に出ていく」という形をとります。
このスタックのデータ構造では要素を挿入することをpush、要素を削除することをpopといいます。
そしてリストの先頭をtop、リストの底辺をbottomと呼びます。
スタックは時系列でデータを保持したいときに役に立つデータ構造です。
デキストエディタなどにある元に戻す機能が例として挙げることができます。

##キュー
キューはリストの一方の端で要素が挿入され、もう一方の端で要素の削除が行われるデータ構造です。
このデータ構造は「最初に入ったものが、最初にでていく」という構造をもったものです。
そしてこのデータ構造に要素を挿入することをEnqueue、要素を削除することをDequeueといいます。
スタックとキューはどちらも操作に制限がかかったデータ構造です。

##連想配列
この連想配列はキーを用いてそのキーに対応した値を素早く見つけ出せるようなデータ構造です。
この連想配列ではキーと値を関連付けてデータを保持しています。
連想配列の実装にはハッシュ法というものが用いられるのでハッシュテーブルと呼ばれることもあり、Pythonでは「辞書」と呼ばれています。

##連結リスト
連結リストがリストの各要素が次もしくは前の要素へのリンクをもっているデータ構造です。
そしてこの連結リストには種類があります。
####単方向リスト
各要素が一つのリンクを持っています。
リンクはリストの中の次の要素を指します。
最後の要素のリンクにはnullを用いて終端を表します。
####双方向リスト
双方向リストは要素が前後の要素のリンクを持っています。
終端と銭湯へのリンクを設定すれば循環リストになります。
####循環リスト
単方向リストの最初と終端をつなげたものです。
終端に来てもまた最初に戻るので、環状のデータ構造となります。