OmniAICreator/Qiita-1.07M huggingface dataset:
UiPathワークフローの処理状況を音声で知らせる方法

本記事ではWindows10のテキストの音声読み上げ機能を利用し、UiPathワークフロー実行中の処理状況を音声で知らせる方法について紹介します。

※UiPath Studio Community Edition 2020.4.1を使用しています。

# 実装手順


## (1) 名前空間のImportを解決する。
本実装で必要な変数synthの変数の型はSystem.Speech.Synthesis.SpeechSynthesizerですが、型の参照でも、インポートタブでも出てこないので、先に解決します。
これには、XAMLファイルを直接編集する方法が手っ取り早かったので、本記事では、この方法を使います。
プロジェクトを作成後に生成されたMain.xamlをメモ帳で開いて下記の様に2行追加し保存します。
Studioを立ち上げ直して、この追加が反映されている状態にしてください。
![g.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/3e5c6693-5190-2504-c366-d88dffe91be9.png)
追加する２行はここからコピーしてください。↓

```
      <AssemblyReference>System.Xaml</AssemblyReference>
      <AssemblyReference>System.Speech</AssemblyReference>
```
## (2) 変数を定義する。
下記の様に変数を定義します。
![h.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/55a55804-b685-ca64-74d0-004c851a1ab8.png)

System.Speech.Synthesis.SpeechSynthesizerは「型の参照」から選択します。
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/0551171b-113f-9f9e-aad7-d5424d93103b.png)

## (3) ワークフローを作成する。
出力ボリューム(Volume)と読み上げ速度(Rate)を設定し、「メソッドを呼び出し」アクティビティをワークフローに挿入し、TargetObjectとMethodNameを下記の様に設定します。
![c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/c494cfb3-6aca-98a0-788c-a75fab4a5730.png)

続けてプロパティのパラメータで音声で読み上げるテキストを設定します。
![d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639319/4d46ba31-4c3e-7125-6293-d465726502cc.png)

## (4) ワークフローを実行します。

「正常に終了しました」と音声が出れば成功です。

# まとめ
名前空間の解決が面倒な点もあり、再利用性も考えるとライブラリにしておくと便利ですね。

ワークフロー実行中に、”エラーが発生しました”、”処理が終了しました”、”現在○○を処理しました”など、作業の進捗や状況を音声で知らせてくれると便利かも！

次回、この仕組みを利用したお手軽なアプリケーション構築事例を紹介したいと思います。
DragonRubyで簡易タイピングゲーム

以前、[DragonRuby GTK (Game Toolkit) で遊んでみた](https://qiita.com/tnantoka/items/163ee82c402f9a6180fa) という記事を書きました。

QiitaにHello, Worldを投稿するとだいたい飽きる（！）のですが、今回は引き続き触っています。

ふと「タイピングゲームを作りたいな」と思ったので、その練習に単純なものを作ってみました。

## 作ったもの

![tor.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2191/c13d36d8-507e-86b2-780a-3936594e6f3c.gif)

テキストが表示されて、それを入力するだけです。
タイムオーバーとかもなく、ただそれだけです。

こちらのリンクからWebブラウザでプレイできます。
https://tnantoka.github.io/typing-on-rails/
※ Firefoxだとたまにエラーになります（ページ更新で解消するはず）

ソースコードはGitHubにあります。
https://github.com/tnantoka/typing-on-rails

タイプするテキストを[Rails Guides](https://guides.rubyonrails.org/)のサンプルコードから借りたので、**Typing on Rails**という名前になっています。

## Tips

基本的には[DragonRuby GTK (Game Toolkit) で遊んでみた](https://qiita.com/tnantoka/items/163ee82c402f9a6180fa) の内容で作れるのですが、
一部書いてないものがあったのでメモしておきます。

### 背景色を変える

`outputs.background_color` に `[R, G, B]` を設定すれば変更できます。

```
# 赤！！！
outputs.background_color = [255, 0, 0]
```

### 押されたキーの一覧を取る

前回使った `inputs.keyboard.key_up.space` でも入力状態は取れるのですが、
今回はキーの一覧を見る実装にしてみました。

入力されたキーは`inputs.keyboard.key_down.truthy_keys`で取得できます。

```
# aを入力
[:char, :raw_key, :a]

# A（Shift + a）を入力
[:char, :raw_key, :a, :shift]

# Command + Shift + aを入力
[:char, :raw_key, :a, :shift, :meta]
```

### フォントによってLabelのサイズわりと違う

`Label`の`size_enum`には `-10`〜`10`を指定できるのですが、同じ`10`を指定しても、フォントによって結構サイズが違います。

例えば、以下の4つのフォントを並べてみると…

- [Hack](https://github.com/source-foundry/Hack)
- [FiraCode](https://github.com/tonsky/FiraCode)
- [Source Code Pro](https://fonts.google.com/specimen/Source+Code+Pro)
- [Press Start 2P](https://fonts.google.com/specimen/Press+Start+2P)

<img width="601" alt="Screen Shot 2020-06-20 at 14.10.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2191/19230842-4e82-2f0a-a60c-6d7c12719989.png">

こうなります。

使うフォントによって `size_enum` を調整する必要がありそうです。

### 公開したゲームが動かない

packageしたbuildをGitHub pagesで公開したら、動きませんでした。

原因は、

> Server reported failure downloading 'app/.main.rb.swp'!

というエラーでした。
`.gitignore`でGitは無視してくれますが、当然DragonRubyは無視してくれないので…。

`builds/typing-on-rails-html5-0.1/manifest.json` を見ると不要なファイルが含まれていることに気づけるかもしれません。
（今回の `.swp` ファイルもバッチリ入っていました）

## まとめ

200行足らずで作れました。
（前回作ったPrimitives.rbの分は数えていませんが）
お手軽です。
PythonのBottleを使ってログイン・ログアウトの処理を作ってみた。

※本記事は個人用のメモです。

ちょっと作ってみたくなったので調べてみた。
参考にさせていただいたのは以下のページ

https://qiita.com/Gen6/items/c153d562e757d88aa5c1
https://stackoverflow.com/questions/35588873/how-to-logout-in-python-bottle
http://www.denzow.me/entry/2017/12/09/103828
https://qiita.com/yoskmr/items/8d35b6c7a15cfa275dfc

# コード
こんな感じになった。ほとんど参考ページのスクリプトを流用させていただいた。感謝。

~~~login.py
#!/user/bin/env python
# -*- coding: utf-8 -*-

from bottle import route, run, template, request, static_file, url, get, post, response, error
from bottle import redirect
import sys, codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout)

SECRET_KEY = 'some-secret-key'
LIFE_TIME = 120

@route("/")
def html_index():
    user_id = request.get_cookie('account', secret=SECRET_KEY)
    if user_id is None:
        redirect('/login')
    else:
        return template('index',url=url)


@route("/static/<filepath:path>", name="static_file")
def static(filepath):   
    user_id = request.get_cookie('account', secret=SECRET_KEY)
    if user_id is None:
        redirect('/login')
    else:
        return static_file(filepath, root="./static")


@get("/login")
def login():
    return """
        <form action="/login" method="post">
            Username: <input name="username" type="text" />
            Password: <input name="password" type="password" />
            <input value="Login" type="submit" />
        </form>
    """

@route("/login", method="POST")
def do_login():
    username = request.forms.get("username")
    password = request.forms.get("password")
    if check_login(username, password):
        response.set_cookie("account", username, secret=SECRET_KEY, path='/', max_age=LIFE_TIME )
        redirect('/')
    else:
        redirect('/login')

def check_login(username, password):
  if username == "admin" and password=="password":
    return True
  else:
    return False


@route('/logout')
@route('/logout', method="POST")
def logout():
    response.delete_cookie('account')
    redirect('/login')

@error(404)
def error404(error):
    return template("404")

run(host="localhost", port=8080, debug=True, reloader=True)

~~~

これで、
・最初の状態はログイン画面に遷移する。
・ログインしたらcookieにユーザー情報を登録し、以後のアクセスはそちらを見て行う。
・/logoutにアクセスしたらcookieの情報を削除してログアウトした状態になる。
・指定時間たったらcookieが無効になる。
ってことができた。

ディレクトリ構造はこんな感じで。

~~~
├─static
│  ├─css
│  ├─img
│  └─js
└─views
~~~

viewsの下にtemplateで使うファイルを入れてあげればよいはず。
templateはこちらのページに詳しく解説されているので、ここを参照のこと。
http://www.denzow.me/entry/2018/03/03/220942

Templateの中でmicro Pythonも使えそうなのでとっても便利そう。

この方法で一般的なお作法にのっとっているかは？？？
いろいろ難しいなぁ。
scapy で HTTP GET してからコネクションの切断まで行儀よく実行する方法

scapy で http response の tcp segment length が知りたい。そう思うことがありませんか？皆さん。tcp segment length さえ分かればコネクションの切断などの処理など書きまくれるのにと。。

調べてみるとどうも sr や sr1 の返り値からは tcp segment length は得られないようで sniff の返り値から以下のように得る必要があるようです。

```
len(rcv[TCP].payload)
```

または

```
len(rcv[TCP])
```

以下 http response の tcp segment length を見てコネクションの切断をするサンプルとなります。

意外となにかデータを受け取ってからコネクションの切断まで処理している scapy のサンプルがネットに落ちてない気がしますので参考になれば幸いです。

``` scapy_http_get.py
#!/usr/bin/env python3

from scapy.all import *
conf.L3socket=L3RawSocket

def main():
    src_ip='192.168.1.20'
    src_port=20000
    dst_ip='192.168.1.100'
    dst_port=80
    iface='ens3'

    http_req = 'GET / HTTP/1.1\r\nHost: ' + dst_ip + '\r\n\r\n'

    http_get(src_ip, src_port, dst_ip, dst_port, iface, http_req)

def http_get(src_ip, src_port, dst_ip, dst_port, iface, http_req):
    pkt_ip = IP(src=src_ip, dst=dst_ip)
    pkt_tcp = TCP(sport=src_port, dport=dst_port)

    # 3WHS SYN
    pkt_tcp.flags = 'S'
    syn = pkt_ip/pkt_tcp;
    synack = sr1(syn)

    # 3WHS ACK
    pkt_tcp.flags = 'A'
    pkt_tcp.seq = synack.ack
    pkt_tcp.ack = synack.seq + 1
    ack = pkt_ip/pkt_tcp
    send(ack)

    # HTTP GET (This code is expected to get only one packet from the HTTP server.)
    send(pkt_ip/pkt_tcp/http_req)
    pkts = sniff(count=1,filter='host ' + dst_ip + ' and port ' + str(dst_port), iface=iface)
    # The HTTP 200 OK may be retransmitted from the server becauase it takes about 3 seconds here...

    # ACK for HTTP 200 OK
    rcv = pkts[0]
    tcp_len = len(rcv[TCP].payload)
    pkt_tcp.seq = rcv.ack
    pkt_tcp.ack = rcv.seq + tcp_len
    http_req_ack = pkt_ip/pkt_tcp
    send(http_req_ack)

    # FIN
    pkt_tcp.flags = 'FA'
    fin = pkt_ip/pkt_tcp
    fin_ack = sr1(fin)

    # LAST ACK
    pkt_tcp.flags = 'A'
    pkt_tcp.seq = fin_ack.ack
    pkt_tcp.ack = fin_ack.seq + 1
    last_ack = pkt_ip/pkt_tcp
    send(last_ack)

if __name__ == '__main__':
    main()
```

参考: [Stack Overflow: How to get the length of http response python scapy](https://stackoverflow.com/questions/28080197/how-to-get-the-length-of-http-response-python-scapy)
C# 構造体・クラスのデバッグ表示をDebuggerDisplay属性で制御する

構造体・クラスは変数ウィンドウで`{ConsoleApp1.TestClass}`のように表示されますが、`DebuggerDisplay`属性や`DebuggerTypeProxy`属性により表示を変更できます。

ここでは`DebuggerDisplay`属性のよく使うパターンを紹介します。以下、`i`は`int`型、`f`は`float`または`double`型の変数またはプロパティです。

|表記|概要|
|:--|:--|
|`[DebuggerDisplay("{X}")]`|`X`の値を二重引用符ありで表示する。|
|`[DebuggerDisplay("{X,nq}")]`|`X`の値を二重引用符なしで表示する。|
|`[DebuggerDisplay("X:{X}")]`|「X:」に続けて`X`の値を二重引用符ありで表示する。|
|`[DebuggerDisplay("X:{X,nq}")]`|「X:」に続けて`X`の値を二重引用符なしで表示する。|
|`[DebuggerDisplay("{i.ToString(\"D10\")}")]`|`i`の値を10桁以上になるまで0で埋めて二重引用符ありで表示する。|
|`[DebuggerDisplay("{X.ToString(\"D10\"),nq}")]`|`i`の値を10桁以上になるまで0で埋めて二重引用符なしで表示する。|
|`[DebuggerDisplay("{X.ToString(\"X10\",nq)}]")`|`i`の大文字16進数表現を10桁以上になるまで0で埋めて二重引用符なしで表示する。|
|`[DebuggerDisplay("{f.ToString(\"F2\")}")]`|`f`の値を小数点以下2桁まで二重引用符ありで表示する。|
|`[DebuggerDisplay("{f.ToString(\"F2\"),nq}]")`|`f`の値を小数点以下2桁まで二重引用符なしで表示する。|

- 整数や小数の書式化については以下を参照できます。
  - [Standard numeric format strings - Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings)
  - [Double.ToString Method - Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/api/system.double.tostring)
- `Math.Round`なども使えます。
青空一行文庫ブックマークレット

青空文庫の作品を「一行にする」ブックマークレットです。岩下 智氏の作られた[一行文庫](https://onelinebook.com/)に触発されて作りました。人や環境によっては複数行より読みやすくなると思います。
![20200627.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248832/a6f631ba-c1d9-06bd-e441-8ab6e719676f.png)

```
javascript: (() => { let text = ''; document.querySelectorAll('body > h1, body > h2, body > h3, .metadata, .main_text').forEach(node => { text += node.innerHTML.replace(/<(\/?ruby|\/?rb|\/?rp|\/?rt)>/g, '___$1___').replace(/<[^>]+>/g, '').replace(/___([^_]+)___/g, '<$1>') + '　'; }); text = text.trim().replace(/(\r\n|\r)+/g, '\n').replace(/\n{2,}/g, '\n').replace(/\n/g, '　').replace(/　{2,}/g, '　'); document.querySelectorAll('body > *').forEach(node => { node.style.display = 'none'; }); document.body.innerHTML += `<div style="letter-spacing: 0.25em; white-space: nowrap; writing-mode: vertical-rl;">${text}</div>`; document.body.style.cssText = 'background-color: #001020; color: #f0f0f0; display: flex; justify-content: center; font-family: "游明朝","Yu Mincho",YuMincho,"Hiragino Mincho Pro",serif; font-feature-settings: "pkna"; font-size: calc(2.5vh + 10px); -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; margin: 2em;'; })(); void 0;
```

ご存知の通り、青空文庫の HTML フォーマットは完全に統一されているわけではないため、作品によってはレイアウトが崩壊したり、外字が非表示になったりする可能性があります（外字についてはルビが振られているはずなので、可読性は損なわれないかと）。
また、スマートフォンでの使用を想定したフォントサイズにしているため、環境によってはフォントサイズの調整が必要になる可能性もあります。 PC では `font-size: calc(2.5vh + 10px);` の `2.5vh` を `2vh` くらいにした方が良いかもしれません。

【その他の青空文庫用ブックマークレット】
* [青空文庫の闇堕ちブックマークレット](https://qiita.com/mimonelu/items/fac9bc98aee1ea3bf11b)
* [青空文庫スピーカー](https://qiita.com/mimonelu/items/b239a82f67a55bbb5c45)
【入門】ブラウザでレスポンスが表示されるまで


普段なにげなく使っているブラウザですが、 裏側ではいろんなことをよしなに処理してくれています。

本記事では **「レスポンスを取得してからブラウザで表示されるまでの流れ」** をざっくり見ていきたいと思います。

この記事は入門編ですが、より詳しくは以下の書籍と記事がおすすめです。特に書籍の学びをまとめたような記事になっているくらい参考にさせていただきました。より詳細の仕組み、さらにはパフォーマンスチューニングの話が書かれていて勉強になりました。

- [Webフロントエンド ハイパフォーマンス チューニング](https://www.amazon.co.jp/dp/4774189677)
- [ブラウザの仕組み(古い記事なので注意)](https://www.html5rocks.com/ja/tutorials/internals/howbrowserswork/)

意訳してしまい正確ではない部分や、間違っている部分があるかも知れません。そっと指摘してもらえたら嬉しいです。

## ブラウザで表示されるまでの 4 STEP

基本的には、以下の 4 STEP を経て画面に描画されます。

```
1. Loading
2. Scripting
3. Rendering
4. Painting
```

おおよその役割は以下のようです

|STEP|役割|
|:---|:---|
|Loading|HTML,CSS,JavaScript,画像とかの読み込み・解析|
|Scripting|JavaScript のコンパイルと実行|
|Rendering|CSSの適用とレイアウト|
|Painting|画面に表示|


## 各 STEP で行われていること

さらにそれぞれの STEP を見ていきます

### 1. Loading

HTML,CSS,JS,画像などのリソースの取得・読み込み・解析を行います。

```
1-1. DownLoad
1-2. Parse
```

#### 1-1. DownLoad

HTML, CSS, JavaScript, 画像などリソースを取得します。

使用するネットワークプロトコルは以下のとおりです。

|ネットワーク階層|プロトコル|
|:---|:---|
|アプリケーション層|HTTP|
|セッション層|TLS（httpsのみ）|
|トランスポート層|TCP|
|ネットワーク層|IP|

名前解決は省いてます

#### 1-2. Parse

ダウンロードしたリソースを読み込み・解析しながら、レンダリングエンジンが扱う内部表現に変換していきます。

- HTML は `DOM ツリー`  という木構造を持つ内部表現に変換
- CSS は `CSSOM ツリー` という木構造を持つ内部表現に変換

DOM（Document Object Model） は[「HTML、XML を JavaScript から操作するためのAPIの集合」](https://developer.mozilla.org/ja/docs/Web/API/Document_Object_Model/Introduction)
CSSOM（CSS Object Model） は[「CSS を JavaScript から操作するためのAPIの集合」](https://developer.mozilla.org/ja/docs/Web/API/CSS_Object_Model)
を指しています

その他のリソースもそれぞれレンダリングエンジンにが扱う内部表現に変換されます

また １-２ の Parse がすべて完了してから Scripting にうつるとは限りません
`script` 要素は何も属性を指定しない場合は、同期的に読み込みと実行が行われ、その間の Parse をブロックします
複数の JavaScript ファイルが読み込まれていたら Parse の一部と Scripting の一部が繰り返されます。

`script` 要素に `async`, `defer` 属性を指定した場合は非同期的な挙動に変化します。

- **async** : script 要素の読み込み時に Parse をブロックせず、スクリプトが取得され次第 Scripting 実行
- **defer** : script 要素の読み込み時に Parse をブロックせず、ドキュメントのパース後に Scripting 実行

となります


### 2. Scripting

JavaScript のコンパイルと実行をします。

コンパイルの方式は、JavaScript エンジンの実装方式によって異なりますが JIT コンパイルが主流のようです。
JIT（Just In Time） というように、 JavaScript の**実行時**にブラウザの処理系が動作している CPU が直接解釈できる機械語に変換します。

一度 Painting まで終わったああとに、なんらかのイベントによって JavaScript が実行された場合はこの Scripting から再実行します。
再利用できるものは極力つかうようにレンダリングエンジンなどがよしなにやってくれます。

### 3. Rendering

スタイルの計算と、どのように視覚的に配置するかきめるという処理を行います。

```
3-1. Calculate Style
3-2.  Layout
```

#### 3-1. Calculate Style

CSSOM ツリーのなかに格納された CSS ルールセットを用いて、DOM ツリーの要素のどことマッチするか総当りで計算していきます。

マッチングの処理が終わったら、同じ DOM 要素に対して複数あった場合に CSS の[詳細度](https://developer.mozilla.org/ja/docs/Web/CSS/Specificity)にあわせて優先順位をつけていきます
複数のルールセットが同じ詳細度であれば、 CSS の中で最後に宣言されたものが要素に適用されます。

#### 3-2.  Layout

要素の大きさ、位置、z軸のかさなりなどを計算します。

最終的に DOM ツリーと CSSOM ツリーを合体させて  Layout ツリーを生成します。

### 4. Painting

画面に表示すべくピクセル単位で表示するための処理を行います。

```
4-1. Paint 
4-2. Rasterize
4-3. Composite Layers
```

#### 4-1. Paint 

ここでは後続の処理のための命令を生成します。
2D グラフィックライブラリ（Chrome などで使用されている Blink レンダリングエンジンでは [Skia](https://skia.org/)を使用）に伝える命令です。

#### 4-2. Rasterize

４-１ で生成した命令をもとに ピクセルへと描画します。
ｚ軸の関係を考慮して、それぞれの層を、１レイヤーとして別々に描画していきます。

z-index などではまるスタックコンテキストの条件が関係するのもこのラスタライズです。

#### 4-3. Composite Layers

作ったレイヤーを合成していきます。
docker MAMP ポート　nginxエラーが出た話

dockerをいれたら、localhostでMAMPに入れなくなった。
nginxの４０４エラーだったので、おそらくポートが競合していると考えた。

MAMPの上のバーのファイルからpreferencesで、
ポートを８０から５０にして、
nginxから apacheに変更して解決。
次回以降ログインの際には、localhot:50/で始める必要ありますが。。。
SymPyの活用法

# 背景

近頃、ある一定の境界条件を満たす多項式の解析解を必要とすることがありました。
解析解を求めるのは、苦労しそうだったので、SymPyを使って楽にできないか検討してみました。

# SymPy

SymPyはシンボリック演算をするためのpythonライブラリです。
以下のようなことができます。

たとえば以下のうような連立方程式の解析解を求めたいとします。
$ bx + ay = ab $
$ x - cy = c$
この連立方程式の解は、

```python
import sympy
a = sympy.symbols("a")
b = sympy.symbols("b")
c = sympy.symbols("c")
x = sympy.symbols("x")
y = sympy.symbols("y")
sympy.solve([b*x+a*y-b*a,x-c*y-c],(x,y))
```

この結果は、$\frac{a c \left(b + 1\right)}{a + b c},\frac{b \left(a - c\right)}{a + b c}$となって正しい結果が得られます。

# 多項式の係数
ここでは、多項式

$f(x) = A_{0}+A_{1} x+A_{1} x^{2} + A_{3} x^{3} + A_{4} x^{4} + A_{5} x^{5}$

の中で、

$f(0) = 0$
$f(1) = S_{1}$
$f'(0) = 0$
$f'(1) = 0$
$f''(0) = 0$
$f''(1) = 0$
を満たす係数を求めたいとします。

```python
for i in range(6):
    exec(f"A{i} = sympy.Symbol(\"A{i}\")")
S1 = sympy.Symbol("S1")
x = sympy.Symbol("x")

f = A0 + A1*(x) + A2*(x)**2 + A3*(x)**3 + A4*(x)**4 + A5*(x)**5
f1 = sympy.diff(f, x)
f2 = sympy.diff(f1, x)
```
まず上記のように変数と求めたい関数を用意して、

$f(0) = 0$の条件は

```python
cond0 = f.subs(x, 0) - 0
```

のように表現します。
同様に残りすべての条件を

```python
cond1 = f.subs(x, 1) - S1
cond2 = f1.subs(x, 0) - 0
cond3 = f1.subs(x, 1) - 0
cond4 = f2.subs(x, 0) - 0
cond5 = f2.subs(x, 1) - 0
```

で定義します。

このすべての条件を満たす$A_{0},A_{1},A_{2},A_{3},A_{4},A_{5}$は

```python
solution = sympy.solve([cond0, cond1, cond2, cond3, cond4, cond5],(A0,A1,A2,A3,A4,A5))
```
とすると、答えは
$(A_{0},A_{1},A_{2},A_{3},A_{4},A_{5}) = (0, 0, 0, 10 S_{1}, - 15 S_{1}, 6 S_{1})$
と求まりました。

この結果を$f(x)$に再代入すると、

```python
for i in range(6):
    exec(f"f = f.subs(A{i}, solution[A{i}])")
```
$f(x) = 10S_{1}x^{3} -15S_{1}x^{4} + 6S_{1}x^{5}$
$f'(x) = 30S_{1}x^{2} -60S_{1}x^{3} + 30S_{1}x^{4}$
$f''(x) = 60S_{1}x -180S_{1}x^{2} + 120S_{1}x^{3}$


となり、求めたい関数$f(x)$が分かりました。
ゲストログイン機能について


ポートフォリオの作成にあたり、ゲストログイン機能は必須です。
忙しい担当者の方が、わざわざ会員登録をするよりも
ささっと多くの機能を見る場合が多いためです。

ゲスト登録機能は、下記の記事の方法で搭載できました。

https://qiita.com/take18k_tech/items/35f9b5883f5be4c6e104#%E3%81%9D%E3%81%AE2-%E3%82%B2%E3%82%B9%E3%83%88%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E6%A9%9F%E8%83%BD%E3%81%AE%E5%AE%9F%E8%A3%85%E6%96%B9%E6%B3%95

こちらの「その2: ゲストログイン機能の実装方法」で実装しました。

その際、下記の2点は少しつまづいたので
記載指定おきます。

##[1]routes.rbの設定

```ruby:config/routes.rb
  devise_scope :user do
    post 'users/guest_sign_in', to: 'users/sessions#new_guest'
  end
```
こちらは、最初勝手に「devise_for :users」を修正するのかと思いましたが
追記する形で大丈夫でした。

デバイスを利用している方ですと

```ruby:config/routes.rb
  devise_for :users

  devise_scope :user do
    post 'users/guest_sign_in', to: 'users/sessions#new_guest'
  end
```

こんな感じですね。


##[2]modelの設定

あとは記事の通りにやればうまく行くのですが、
自分は１つだけエラーになりました。

上記の設定ですと、ゲストユーザーのアカウントは
メールアドレスとパスワードの作成だけされています。

そのため、アカウントの作成に「nickname」などが
必須項目であった場合、エラーが起こります。

その際は、モデルでその情報を追記してあげましょう。

```ruby:models/user.rb

  def self.guest
    find_or_create_by!(nickname: 'ゲスト', email: 'guest@example.com') do |user|
      user.password = SecureRandom.urlsafe_base64
    end
  end
```

これで問題なく作成できました！
Javaの繰り返し処理

##はじめに
正直クラスの書き方全然理解できない（本内容とは無関係）

###繰り返し処理
繰り返し処理とは、一定の処理を自動で繰り返し行う処理のこと**while**文と**for**文

```kane.java
while(条件){
 繰り返す処理;
}

for(条件){
 繰り返す処理;
}
```

```kane.java
int = 1;                     //初期化

while(i <= 5){ //条件
 System.out.println(i);      //繰り返す処理
 i++;                        //１を追加していく　変数の更新
}

for(int i = 1; i <= 5; i++){ //初期化、条件、更新をまとめて書ける
 System.out.println(i);      //繰り返す処理
}
```

変数に**1を足し忘れる**と変数は**1のまま変わらず**、条件が**永遠にtrue**になるので、繰り返し処理が無限に行われる（無限ループ）

##break
繰り返しを終わらせるためには、**条件をfalse**にする以外に、**breakを使って強制的に終了**させる方法がある。if文などの条件分岐と組み合わせることで、任意の箇所で繰り返し処理を終わらせることができる。

```kane.java
for(int i = 1; i <= 10; i++){ 
 if (i > 5){ //６になると強制終了
  break;
 }
 System.out.println(i);      
}
```

##continue
continueはその周の処理だけをスキップして、次の周を実行できる。continueもif文などと組み合わせて利用するのが一般的。

```kane.java
for(int i = 1; i <= 10; i++){ 
 if (i % 3 == 0){ //3の倍数の時飛ばして次の処理を行う
  continue;
 }
 System.out.println(i);      
}
```
```console:コンソール
1
2
4
5
7
8
10 
```
**3の倍数は飛ばされてる**

##終わりに
コーヒーの効果に今頃気づく２８才。
netplanでポリシールーティングする

ipアドレスはちょっと変更しているので、ミスってたらすみません。

# 概要
## 背景
1.
LIVAで構築していたProxy Server(Squid)をクライアントPC上のHyper-V上にリプレースすることにしました。
メインPCをB550マザーで一式リプレースしたので、マシンパワーが余剰となったので物理機を一台削除することにしたのでした。
Sandyおじがんばった！感動した。（ケースだけ流用）
Zen3がきたらCPUだけ交換するぞ（たぶん）

2.
Hyper-Vホストとゲストでファイルコピーをできるようになったらしいのでできるようにしておく。

## Proxyでやりたいこと
クライアントPCのブラウザプロキシ設定で、ipv6、またはipv4の回線で自由に接続を変更できるようにしたい。

- Proxy Port 8081にアクセスすると、ipv4の回線でインターネットアクセスする。
- Proxy Port 3128にアクセスすると、ipv6の回線でインターネットアクセスする。

## 設定の変更点
Ubuntuのネットワーク設定が/etc/network/interfacesから/etc/netplanに変更がありました。

## ネットワークの状態

ONU----ipv6用のルータ-----クライアントPC（squid on Hyper-V）
　|　　　　　　　| <---LAN側ポート同士が結線されている。
　|----ipv4用のルータ


## ネットワークの設定

### Hyper-VにUbuntuを入れていく
（ｒｙ

### いままで

過去記事参照
https://qiita.com/yamada6667/items/1cdc080251eef62e12e6

### これから
#### 各オブジェクトのIP
・ipv6ルータ 192.168.1.1
・ipv4ルータ 192.168.1.200
・squidサーバ 192.168.1.50:3128,192.168.1.250:8081

#### squid サーバの設定

いままでは、iptablesやip_forward、rt_tables、ip routeでの設定が必要でしたがこれらは不要になりました。

Squidの設定は以前と変わりません。

```conf:squid.conf
# 待ち受けポートと。tcp_outgoingの設定をする。
# 8081ポートにアクセスしに来た場合はIPアドレス.250として外部へ接続しに行く
acl ipv6 localport 3128
acl ipv4 localport 8081
tcp_outgoing_address 192.168.1.50 ipv6
tcp_outgoing_address 192.168.1.250 ipv4 
```

/etc/ntplan/のyamlファイルを作りましょう。
デフォルトで作られているものをコピーして、アルファベット順にしたときに、後ろになるように
ファイル名を変更して、ファイルを修正する。

```yaml:netplan.yaml

#　やること
#　ipアドレスを複数定義する。
#　デフォルトゲートウェイはとりあえずipv6側へ
#  ルートテーブル200に.200(ipv4)への経路を追加する。
#　squid 8081ポートの通信はIP.250として通信する。その時のゲートウェイはルートテーブル200を使う。

network:
  ethernets:
    eth0:
      addresses:
      - 192.168.1.50/24
      - 192.168.1.250/24
      gateway4: 192.168.1.1
      routes:
      - to: 0.0.0.0/0
        via: 192.168.1.200
        table: 200
      routing-policy:
      - from: 192.168.29.250/32
        table: 200
      nameservers:
        addresses:
        - 192.168.1.1
        - 8.8.8.8
  version: 2
```

あとはクライアントPCのプロキシの設定で3128か8081かを設定すると、インターネット接続回線が切り替わる。


## Hyper-Vとゲストでファイルコピー

```shell:ゲストOS
sudo apt install linux-cloud-tools-generic
```

```Powershell:ホストOS（管理者権限）
 copy-vmfile -name "squid" -sourcepath "D:\tmp\copyfile.txt" -destinationpath "/tmp" -filesource host
```

コピーされたファイルのパーミッションは

```
-rwxr--r--  1 root root   27 Jun 27 20:29 copyfile.txt
```

なので、ファイル操作に注意だ。
Rails CRUD機能実装②(今回は、編集、詳細)

<h1><a href="https://qiita.com/smbbc20/items/f616f7f9aa243d19af26">前回</a>の続きで、編集と詳細を記載します。</h1>
機能追加するときの手順復習：routes.rb→controller追記→view追加
<h1>編集機能</h1>
新規投稿と似たような手順です。
編集画面表示（edit）→入力内容で更新（update）

```routes.rb
resources :birds, only: [:index, :new, :create, :destroy, :edit]
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618706/5ce564dc-d47e-7819-661b-cdfc3c65305a.png)

一覧画面に編集画面へのリンクを貼ります。
Prefixが「edit_bird」でidを渡して、GETメソッドなので以下のようになりますね。

```index.html.erb
<%=link_to "編集", edit_bird_path(bird.id), method: :get %>
```
渡されたidと一致するレコードを取得し、編集画面へと渡します。

```birds_controller.rb
def edit
  @bird = Bird.find(params[:id])
end
```

そして、編集画面です。

```edit.html.erb
<%=form_with(model:@bird, local:true) do |form|%>
  <%=form.text_field :name, placeholder: "鳥の名前"%>
  <%=form.text_field :pic, placeholder: "鳥の写真のURL"%>
  <%= form.submit "更新"%>
<%end%>
```


ちゃんと編集画面へのリンクが表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618706/38fa08af-1c64-b751-eb34-2622b488e46f.png)

クリックするとちゃんと遷移しますね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618706/13235634-009a-fa29-67d0-a098832dc80b.png)


<h3>ここからは更新処理です！</h3>
まずはroutes.rb!

```routes.rb
resources :birds, only: [:index, :new, :create, :destroy, :edit, :update]
```

controllerで入力内容を受け取って、DBを更新します！新規投稿で作成した、bird_paramを使用します！

```birds_controller.rb
...
  def update
    bird = Bird.find(params[:id])
    bird.update(bird_params)
  end
  private
  def bird_param
    # params.require(:モデル名).permit(:カラム名,:カラム名,......)
    params.require(:bird).permit(:name, :pic)
  end
...
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618706/6de91974-6d8c-e0b8-6e5d-0626798cea9f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618706/32c4b224-a4c8-0d13-8725-74807c0dd3b8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618706/bd2004ed-0799-4018-5645-959e15eb561b.png)

ちゃんとカワセミ2に変更されていますね！

<h1>詳細表示機能</h1>
いよいよ最後の機能です！頑張りましょう！！

```routes.rb
resources :birds, only: [:index, :new, :create, :destroy, :edit, :update, :show]
```
としてもいいですが、全機能追加しているので、onlyの記述はいらないですね！消しましょう！

```routes.rb
  resources :birds
```
かなりスッキリしました！！

一覧画面に詳細画面へのリンクを貼りましょう！
rails routesコマンドを実行すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618706/a24b7314-7343-e3f1-1886-b596cdf2e63a.png)
prefixがbird,methodがGETで、idもしてしてあげましょう！

```index.html.erb
<%= link_to '詳細', bird_path(bird.id), method: :get %>
```

そしてcontrollerでidを受け取り、レコードを取得します！

```birds_controller.rb
def show
    @bird = Bird.find(params[:id])
  end
```

いよいよ最後に、show.html.erbです！

```show.html.erb
<%= @bird.name %>
<div style=
"background-image: url(<%= @bird.pic %>); 
 background-position: center center;
 background-size: cover;
 width: 300px; 
 height: 300px;
 margin-bottom: 10px;
 ">
</div>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/618706/071cae11-662b-b71a-e8a1-3de334d584a8.png)

きちんと選択したものが表示がされています。


<h1>まとめ</h1>
railsは、modelを渡せばリンク先を自動識別してくれたりと、フレームワークの決まりを理解すれば、爆速で基本的なサイトが作れますね。
今度は、ログイン機能を実装させますので、ご期待ください！
最後まで、ありがとうございました！！
windowsでiverilog その35

#概要

windowsでiverilogやってみた。
put,get付きのfifo書いてみる。

#サンプルコード


```


module fifo(input clk, input rst, input put, input get, input [7:0] data, output reg [7:0] out);
	reg [7:0] mem[4:0];
	reg [4:0] rd_pos;
	reg [4:0] wr_pos;
	assign empty = ((wr_pos - rd_pos) == 0) ? 1'b1 : 1'b0;
	assign full = ((wr_pos - rd_pos) == 32) ? 1'b1 : 1'b0;
	always @(posedge clk or negedge rst)
	begin
		if (!rst)
		begin
			wr_pos <= 0;
			rd_pos <= 0;
		end
		else
		begin
			if (put & full == 1'b0)
			begin
				mem[wr_pos] <= data;
				wr_pos <= wr_pos + 1;
			end
			if (get & empty == 1'b0)
			begin
				out <= mem[rd_pos];
				rd_pos <= rd_pos + 1;
			end
		end
	end
endmodule

module test();
	wire [7:0] out;
	reg put,
		get;
	reg clk;
	reg rst;
	reg [7:0] data;
	fifo u(.clk(clk), .rst(rst), .put(put), .get(get), .data(data), .out(out));
	initial
	begin
		$monitor("%d %d %d %d", put, get, data, out);
		clk = 0;
		rst = 1;
		put = 0;
		get = 0;
		#10
			rst = 0;
		#10
			rst = 1;
		#10
			put = 1;
			data = 16'd1;
		#10
			data = 16'd2;
		#10
			put = 0;
			get = 1;
		#60
			$finish;
	end
	always
	begin
		#5
			clk = 1;
		#5
			clk = 0;
	end
endmodule




```

#実行結果


```


0 0   x   x
1 0   1   x
1 0   2   x
0 1   2   x
0 1   2   1
0 1   2   2


```


以上。
これからのアプリ開発を変える、NoCodeの調査まとめ

# NoCodeとは
日本ではあまり馴染みがないかもしれませんが、最近NoCodeという開発ツールが飛躍的に進化を遂げています。
NoCodeとはプログラムを書かずにアプリ開発ができる技術のことで、海外では日本と比べて認知度が高くビジネスでも利用されています。
実際に使われている例を挙げると、インドのユニコーン企業であるSwiggyが利用していたり、WeWorkRemotelyがNoCode製のリモートワークマッチングプラットフォームを買収するなどしています。
そしてつい先日、日本でもSPOTTOというオンライン就活プラットフォームが株式会社For A-careerに買収され、日本初のノーコードアプリの買収案件として話題を集めました。

# NoCodeの何がいいのか
NoCodeを使うことで、アプリ開発は劇的に速くなります。
システムの開発はロジックを組むことと実装することに分けられ、多くの時間を実装に割り当てることになります。
NoCodeではコードを書かなくていいため、ロジックを考えるだけでシステムを開発することができ実装にかかるコストが抑えられます。
また、プログラミング言語の知識や使用するNoCodeツールによってはDBの知識も必要としないので、非エンジニアでもシステムを開発することができます。

# GoogleによるAppSheetの買収
今年の1月に、GoogleがNoCodeアプリの開発を手がけているAppSheetの買収を発表しました。
Googleは自社でApp MakerというNoCodeサービスを開発していましたが、それを捨ててAppSheetを買収したことで大きな話題となりました。
App Makerは来年1月に終了する予定で、AppSheetにかける意気込みが伺えます。

# AWSのノーコードツール
つい先日、AWSからもノーコード環境がリリースされました。

[AWSのノーコードツール「Amazon Honeycode」はなぜ生まれたのか？](https://jp.techcrunch.com/2020/06/25/2020-06-24-why-aws-built-a-no-code-tool/)

リリースされたばかりということもあり、UIや機能としてはまだまだ課題がありますが、今後に期待です。

# NoCodeツール調べ

## AppSheet
先ほど紹介したGoogleが買収したNoCodeツールです。
面白い機能がたくさんあり、バーコード読み取りやOCRスキャン、メール配信機能を兼ね備えています。
さらにGoogleが母体なだけあって、機械学習機能もあります。

日本向けのサイトがあり、ドキュメントも揃っているので比較的始めやすいNoCodeです。
[AppSheet Japan Community](https://www.appsheet-japan-community.com/)

多くあるNoCodeツールの中で割と知られている印象です。

## Power Apps
Microsoftが提供しており、こちらも公式のドキュメントが充実しています。
[Power Apps のドキュメント](https://docs.microsoft.com/ja-jp/powerapps/)

中でもAI BuilderというAIモデルが豊富で、物体検出やOCRのほか、データを学習してそれをアプリに組み込むことも可能です。
ビジネスカードリーダー機能がついているのはおもしろいですね。
[AIモデルの種類](https://docs.microsoft.com/ja-jp/ai-builder/model-types)

アプリ開発が容易なだけでなく、AIをアプリに組み込むことも容易になのはPower Appsの大きな特徴です。

## Adalo
[Adalo](https://www.adalo.com/)
インドのユニコーン企業であるSwiggyやSPOTTOで使われているツールです。
開発画面が今風で、優れたUI/UXのアプリを開発できるのが特徴です。画面がカラフルで、直感的に操作できるため開発が楽しくなりそうなツールです。
昨年末に大きなアップデートが行われ表現の幅が格段に上がりました。機能はAppSheetやPower Appsに比べ少ないですが、一般的なアプリケーションを作るには十分です。
[ノーコード開発ツールAdaloはここまで進化している](https://descartes-search.com/media/nocode-app-developement/#Adalo)

## bubble
[bubble](https://bubble.io/)
知名度としてはかなり有名で古株なNoCodeです。
古株なだけあって日本語の情報も多く、YouTubeにも解説動画が多く上がっています。
学習コストが高いそうですが、ビジネスでの採用事例も複数あります。

## Glide
[glide](https://www.glideapps.com/)
スプレッドシートでデータ管理ができるのと、PWA対応のアプリ開発ができるNoCodeです。
お気に入り機能やユーザー登録機能、ショッピング機能までも作ることができ、さらにstripeとの連携もできるのでECサイトの開発も可能です。
以前QiitaにGlideの紹介記事を書きました。ぜひご一読ください。
[コードを一切書かずにアプリ開発ができてしまうglideの威力を紹介する](https://qiita.com/nisyuu/items/74725b6dfa9a7f6ca821)


# 参考
[NoCodeツールおすすめ36選！アプリ開発から自動化ツールまで！](https://bolt-dev.net/posts/187)
[AppSheetを買収したグーグルの「ノーコードへの本気度」を解説します](https://paradigm-shift.co.jp/column/79/detail)
[WEB説明会のプラットフォームサービス「SPOTTO（スポット）」がリリース。](https://prtimes.jp/main/html/rd/p/000000006.000052204.html)
[ノーコードでウェブアプリが作れる！Bubble（バブル）の使い方](https://blog.nocodelab.jp/entry/2019/07/24/%E3%83%8E%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E3%82%A6%E3%82%A7%E3%83%96%E3%82%A2%E3%83%97%E3%83%AA%E3%81%8C%E4%BD%9C%E3%82%8C%E3%82%8B%EF%BC%81Bubble%EF%BC%88%E3%83%90%E3%83%96%E3%83%AB)
Googleフォームの回答のデフォルト値を設定する

## Googleフォームの回答デフォルト値を設定する。

Googleフォームを業務アプリとして使用している場合や、質問の多いフォームの場合、
デフォルト値を予め設定しておくと、回答者の入力の手間を省くことが出来て便利です。

この記事ではデフォルト値を設定する方法について説明します。


## デフォルト値の設定手順

### Googleフォームを開く
編集権限のあるGoogleフォームを開きます。

### 「事前入力したURLを取得」をクリック
画面右上の「・・・」クリック→「事前入力したURLを取得」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/82ad2d9e-cf83-c158-5112-8ba0708ba3ec.png)

### デフォルト値を設定
デフォルト値を入力します。

良く使うチェックボックスにチェックしておいたり、
回答者に選択してほしいラジオボタンを選択状態にしておいたり、適宜調整します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/7af4d301-c2d1-0cc4-280c-ca3cb2f42f28.png)


### リンクを取得
デフォルト値を全て設定したら、フォームの最下部にある「リンクを取得」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/7571166d-47b9-1440-58ab-cb51c0b78e73.png)

画面下にポップアップが表示されますので、「リンクをコピー」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/67ec739d-42a4-67f3-2b25-f7e648d1b700.png)


### 取得したリンクを開く
リンクを開いてみましょう。先ほど設定したデフォルト値が入力された状態でフォームを開くことが出来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/113a30ab-f5dc-1fee-c07e-3296d64b52e0.png)


### 回答する
自分が回答者の場合は、次回以降このURLから回答すればOKです。
自分以外の回答者には、このURLを配布して、このURLから回答してもらえばOKです。


## 関連記事

https://www.teijitaisya.com/gas-googledocument/

https://www.teijitaisya.com/gas-create-multiform-from-sheet/

https://www.teijitaisya.com/gas-googleform/
【Salesforce】まだ疑問に思っていること

まだ疑問に思っている、実践したことがないですが、いつか解決したい問題の記録

１．Sitesを利用して公開アクセス可能なWebサイトを構築する場合、
　Salesforceのドメインではなく、独自のドメインにする方法。
doxygenというドキュメント作成ツールを使ってみました。

#はじめに

<font color=red>!今回はとりあえず使うを目標にしています。</font>

macでやってます！

簡単にドキュメントを作れるといったdoxygenを使ってみました！
最初はgit cloneしてmake…な感じで難しいのかと思いきや、、、
アプリインストールして使う的な感じのものでした。
なのでアプリ(ツール)の紹介です、、、

あと使用できる言語できない言語ありますのでご了承ください:bow_tone1:

対応言語は以下みるにC++が基本でその他にC, Objective-C, C#, PHP, Java, Pythonなどみたいです。
https://www.doxygen.nl/index.html

#Step1　使用ツールのダウンロード

https://www.doxygen.nl/download.html#srcbin
にいって私の場合macだったので、以下をクリックしてダウンロードしました。
windowsの方はexeとか書いてあるものをダウンロードする感じかと、、、
<img width="1093" alt="スクリーンショット 2020-06-27 17.21.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/870c4812-50aa-a87a-e5e1-439bb92b1a14.png">

#step2 使えるように
:star:インストール終わったら〇〇.zipがインストールしたブラウザの下の方に出てくるかと思うのでクリック

:star:以下出てくるのでラーメンみたいなアイコン『Doxygen』と書いてるものクリック。
<img width="386" alt="スクリーンショット 2020-06-27 17.13.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/d434b805-8ca5-28a1-7d9e-a0de9fe1fc12.png">

:star:以下のようになるので一旦『キャンセル』をクリック
<img width="420" alt="スクリーンショット 2020-06-27 17.14.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/7e3e4daa-7ac2-3c11-6ad1-f1f1a17779c0.png">

:star:以下のように設定ファイルのセキュリティプライバシーのところに『使用がブロックされました…　このまま…』って出てくるので『このまま開く』をクリック
ちなみにこの画面は、歯車的なアイコン
『システム環境セット』->　『セキュリティとプライバシー』 -> 一般のタブのところです！
<img width="655" alt="スクリーンショット 2020-06-27 17.14.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/f4fec44f-d445-cd0a-1f34-a8064d208c39.png">

:star:上記タップで開くボタンが出るので『開く』をクリック
<img width="479" alt="スクリーンショット 2020-06-27 17.15.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/f1efb3dd-0958-d08f-eda0-76de73ed957b.png">


#step3 早速使う
あとは使用するもの選択してRunするのみという感じです。

<img width="825" alt="スクリーンショット 2020-06-27 17.36.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/6649b9ba-4927-088b-38e6-1197bebff4a6.png">

①　
ドキュメントしたいものフォルダ選択。
以下は私が選択したものの中身です。
<img width="409" alt="スクリーンショット 2020-06-27 17.39.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/fef3fa82-70b7-bb85-582f-fc6f62835b12.png">

②
Runタブ選択

③
Run doxygenクリック

④
Show HTML outputクリック
ちなみに以下出力されました。
面白いですね！:heart_eyes:
<img width="877" alt="スクリーンショット 2020-06-27 17.42.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/07fda3d2-cf9a-7745-2ac5-4950edcfb34a.png">

#おまけ
ソースコードが配下に全てあるものであれば上記操作で終了。

ただ、フォルダ内全ての検索だと以下チェック必要。
ちなみに、フォルダやファイルが多いととんでもなく時間かかるので検索するフォルダは限定した方が良きかと、、、
<img width="806" alt="スクリーンショット 2020-06-27 19.36.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/4fe8c7e2-556a-f162-5e8e-d686a35d0012.png">

ちなみに出力されたものです。
<img width="324" alt="スクリーンショット 2020-06-27 19.35.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/97a2719e-92f6-b441-1000-2cbc02a574d7.png">


あと言語のモード指定場所の紹介。PHPの場合はPHPを指定する方がいいのかな？と感じています。
<img width="547" alt="スクリーンショット 2020-06-27 19.37.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/899a74f0-0845-328f-479d-bcb40f150ef5.png">


#さいごに
コードじゃなくてドキュメントで見たいな〜〜〜って時に便利だと感じました。
もう少し深く知りたいと思ったら勉強したいと思います！
激重フルアーマーRPAは要らん。とりまシュっと操作再生だけできればいいんや【世界初編】

# 壱

とある作業で
*「構築はコード化しているのにXX（ツール名）をインストールするのにログインして操作要るんすよね」*
*「RPA仕込んでおけば良くね？ｗｗｗｗｗ」*

### は？？？？？

RPAってUiPATH出始めの頃はUWSCや、AutoHotkeyをもっとコモディティ域に下した良い狙いだったんだけど、
いつの間にやら複雑なフローやらAPIやら、クラウド連携だのAI絡みの**重厚なソリューションとして
金額的にも肥大していった**。JREランタイムだの追加で色々入ってくるようになった。アンインスコめんどい。
しかも、SaaS製品と違って日本だとセキュリティ絡みで手元で動くパッケージ製品の需要の方が多そうなのに、
**当然SaaSより高い**。目標をセンターに入れてスイッチだけなのにとても息苦しい。

# 弐

**Linuxのexpectコマンドみたいに最低限のOSとインタフェースになってくれれば良くてOCR機能なんて要らない！**
というお気持ちをツールにしました。

![rabbitRPA.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/72ba6e01-d351-7957-3c1b-3019ddf01c9b.gif)

<a href="https://github.com/yasutakatou/rabbitRPA"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/yasutakatou/rabbitRPA.png" width="460px"></a>

こんなの

### んーー・・・・・別にフツーですね。

どこが凄いかと言うと、これ**ワンバイナリに収まってる**んですわ。たぶん他には無い。
つまり、ファイル一個コピーしてくればオペレーションの録画と再生が出来てしまう！
アンインスコはファイル消すだけ！！

### インスコ自動化しようず→コピってシュ→ファイル消してクリーン

の最小手でRPAれる。

# 参

「あれ、ワイの端末だとラグいぞ」
「んー、その4GセロリンSATA端末は激遅で画像の書き出しが間に合ってないみたい」
「そういう環境にこそこういうツールの需要があるんじゃね？」

### ぐぬぬ

# 終

やはり環境依存の低さと動作速度とモジュールの多さからのバランスでGo言語は最強やな。
書いてて飽きる気がしないわ。
WSL2で外部からssh接続

# 概要

windows側のIPアドレスを指定してssh接続できるようにする。
[wsl2でsshサーバを起動し、外部からそこに接続](https://qiita.com/yabeenico/items/15532c703974dc40a7f5)
を参考にして、設定しました。

# ポートフォワード設定

wslのIPアドレスは、Powesrshell(要管理者権限) で 下記で取得可能. 

```powershell
$ wsl hostname -I
172.22.188.123 
```

ポートフォワード設定は、Powesrshell(要管理者権限)で下記のように設定する。1
trimend() がポイント。入れないと `host name -I`  の最後空白か、なんかでポートフォワードがうまく動作しないみたです。

```powershell
$ netsh interface portproxy add listenport=22 connectport=22 connectaddres=(wsl hostname -I).trimend() 
```

# タスクスケジューラに登録

起動毎に wsl のIPが変更されるので、起動時に設定できるようにする。

## 全般

セキュリティオプションを下記のように設定する

* ユーザがログインしているかどうかにかかわらずに実行する。
* 最上位特権で実行するにチェック

## トリガー設定

* スタートアップ時
* 遅延時間30秒 (早すぎると wsl側のIPの設定より先になってしまうみたいです)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521901/6fd781d4-f0c7-e447-2180-7c09ec0b30f5.png)

## 操作の編集

* プログラム/スクリプト: `%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe`
* 引数: `-Command "C:\Users\xxxx\task\set_portproxy.ps1"`

```powershell:set_portproxy.ps1
netsh interface portproxy delete v4tov4  listenport=22
netsh interface portproxy delete v4tov4  listenport=3000
netsh interface portproxy delete v4tov4  listenport=3001
netsh interface portproxy add v4tov4  listenport=22 connectaddress=(wsl hostname -I).trimend() connectport=22
netsh interface portproxy add v4tov4  listenport=3000 connectaddress=(wsl hostname -I).trimend() connectport=3000
```
NERDTreeのウインドウにフォーカスしているかどうかを判定する関数を作る

# 用途

以下のような便利なキーマップを設定したいとします。

```vimscript
nnoremap ]b :bn<CR>
nnoremap [b :bp<CR>
nnoremap ]B :bl<CR>
nnoremap [B :bf<CR>
```

このキーマップは簡単にバッファを切り替えられて便利ですが、NERDTreeのウインドウ内でも使えてしまうので、嫌な気持ちになるときがあります。

NERDTreeのウインドウ内ではこの機能を無効化したいです。


# 解決策

```vimscript
function IsInNERDTreeBuf()
  return exists('t:NERDTreeBufName') && bufname("%") == t:NERDTreeBufName
endfunction

nnoremap <expr> ]b IsInNERDTreeBuf() ? ':echoerr "You are in NERDTree."<CR>' : ':bn<CR>'
nnoremap <expr> [b IsInNERDTreeBuf() ? ':echoerr "You are in NERDTree."<CR>' : ':bp<CR>'
nnoremap <expr> ]B IsInNERDTreeBuf() ? ':echoerr "You are in NERDTree."<CR>' : ':bl<CR>'
nnoremap <expr> [B IsInNERDTreeBuf() ? ':echoerr "You are in NERDTree."<CR>' : ':bf<CR>'
```

IsInNERDTreeという関数を作りました。これは、NERDTreeのウインドウにフォーカスしているかどうかを判定するための関数です。キーマップを設定するときに`<expr>`とこの関数を使えば、NERDTreeのウインドウ内にいるときとそうでないときで機能を切り替えられます。この例では、NERDTreeのウインドウ内にいるときは`:echoerr "You are in NERDTree."<CR>`が有効になり、エラーメッセージが表示されます。外にいるときは、`:bn<CR>`が有効になり、バッファを切り替えられます。


# 解決策（改良版）

エラーメッセージでは繰り返し表示してしまったときにストレスを感じさせる恐れがあるので、以下のように改良します。

```vimscript
nnoremap <expr> ]b IsInNERDTreeBuf() ? '<C-w>l:bn<CR>' : ':bn<CR>'
nnoremap <expr> [b IsInNERDTreeBuf() ? '<C-w>l:bp<CR>' : ':bp<CR>'
nnoremap <expr> ]B IsInNERDTreeBuf() ? '<C-w>l:bl<CR>' : ':bl<CR>'
nnoremap <expr> [B IsInNERDTreeBuf() ? '<C-w>l:bf<CR>' : ':bf<CR>'
```

この例では、NERDTreeのウインドウ内にいた場合、先に右側のウインドウに移動するように設定しています。このようにすることで、NERDTreeのウインドウ内かどうかを意識することなくバッファを切り替えることができます。
[CloudFunctions]複数リクエストを投げる場合のコールドスタートについて検証

# 概要

CloudFuntionsを使ってAPIを実装していたときにコールドスタートについて気になる挙動があったので、実際に処理を実行しながら検証してみました。

# 実例

一度の処理で5つのAPIを叩く必要があるとします。
この5つのAPIは互いに依存していないので、**処理の順番を考慮する必要はありません**。

順番を考慮する必要がないので`Promise.all`使って並列処理させればいいやと思ったものの処理時間が想定とは違う結果になったので、
直列処理と並列処理の速度をそれぞれ検証してみた次第です。

# 前提

- functionsのエンドポイントは1つで、その中でexpressを使ってルーティングしています。
- node v10.17.0

# 検証

## awaitによる直列処理

awaitを使って5つのAPIを直列で実行していきます。

```ts
await axios.get(`${this.apiRoot}/hello/gackt`);
await axios.get(`${this.apiRoot}/hello/shogun`);
await axios.get(`${this.apiRoot}/hello/abadango`);
await axios.get(`${this.apiRoot}/hello/takera`);
await axios.get(`${this.apiRoot}/hello/paseriman`);
```

### コールドスタート時

<img width="683" alt="await_cold.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190770/328fadfb-9903-4f3c-e0e9-4fa628e6df1c.jpeg">

最初の関数の実行に約4秒かかっていますが、それ以降の処理はそれぞれ0.15秒ほどで実行されています。
この結果は想定通り。

### ウォームスタート時

<img width="685" alt="await_warm.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190770/40a945d9-3839-9557-3695-f99a67a4087e.jpeg">

コールドスタートに比べて最初の関数の実行が短縮されています。
多少のブレはあるもののそれぞれの関数が0.15-0.20秒ほどで実行が完了しています。
こちらも想定通り。

### こんな例外も・・・

<img width="687" alt="await_error.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190770/2718a3d8-f573-1667-a2ff-93184d2c67cc.jpeg">

検証しているときにこんなパターンも発生しました。
2回目のときに実行環境が変わってコールドスタートが発生したのでしょうか。
これが起きてしまうのは想定外だったし、開発者としては結構ツラいです。。

## Promise.allによる並列処理

Promise.allをつかって5つのAPIへのリクエストを同時に投げます。

```ts
Promise.all([
  axios.get(`${this.apiRoot}/hello/gackt`),
  axios.get(`${this.apiRoot}/hello/shogun`),
  axios.get(`${this.apiRoot}/hello/abadango`),
  axios.get(`${this.apiRoot}/hello/takera`),
  axios.get(`${this.apiRoot}/hello/paseriman`),
]);
```

### コールドスタート時

<img width="686" alt="all_cold.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190770/63341057-b48d-313e-07d2-1c905a519231.jpeg">

最速で3.5秒ほど、最遅で6秒ほど処理に時間がかかっています。
コールドスタートなのでまあこんなもんかという感じ。

### ウォームスタート時

(コールドスタート時の実行の直後に再実行してます。)

<img width="687" alt="all_warm.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190770/053f0ca6-ac34-a486-189b-100008c4a508.jpeg">

一部の関数は直列処理のウォームスタートと同じくらいの処理時間で、残りの一部がコールドスタートと同じくらいの処理時間という結果に。
何度か実行してみましたが、たまにすべての関数がウォームスタートと同じ速度で実行されますが、いずれかの関数がコールドスタートと同等になってしまうことのほうが多かったです。

ここからは自分なりの解釈なのですが、
並列処理の場合はすべてのリクエストが同時に投げられるので、それぞれ別の実行環境で実行されるため、その時のfunctions側の状況によってどれだけコールドスタートになるかが決まる、ということなのでしょうか🤔
そうだとすると、実行対象のAPIの数が増えるほどコールドスタートが発生する確率が高くなりそうです。

# 結論

CloudFunctions(というよりFaaS全般？)においては、同時に実行できるからといって安易に並列処理をするべきではないなと思いました。

# 参考記事

- [Serverless: Cold Start War 第一章](https://medium.com/orangesys/serverless-cold-start-war-%E7%AC%AC%E4%B8%80%E7%AB%A0-7e62d3d273c)

検証しているときに見つけた記事です。
1年前の記事ではありますが、今でもこの状況が続いているとすればCloudFunctionsは中々の厄介者ですね。。
AndroidStudioでKotlin Multiplatform Projectの開発時に、breakpointで止まらない場合がある

# エラーメッセージ

「Breakpoint does not belong to any class」

# 原因

以下のような`by lazy` 構文を使うと、これを定義したクラス内ではbreakpointで止まらなくなる場合がある。

```sample.kt
private val hoge by lazy {
    "hoge"
}
```
# 対処法

`by lazy` を使わない

# 発生した環境

- Android Studio 4.0
- Android Studio 4.1 Preview
- IntelliJ IDEA Ultimate
Tensorflow v2使用時にv1の関数を使用する

`.compat.v1.`を付け加える

```
>>> tf.get_variable_scope()
AttributeError: module 'tensorflow' has no attribute 'variable_scope'
```

```
>>> tf.compat.v1.get_variable_scope()
<tensorflow.python.ops.variable_scope.VariableScope at 0x7f41e7efb198>
```
Macで現在日時をクリップボードにセットする

# やりたいこと
- 下の画像のようなメモを[Typora](https://typora.io/)で書いているんだが、
- 日時`# 2020-06-27 18:28:41`の部分を書くのが面倒くさいのでなんとかしたい
<img width="472" alt="スクリーンショット 2020-06-27 19.08.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8352/b7095b29-f151-d388-477a-0cfae6ccbb09.png">



# スクリプトエディタを起動して
<img width="466" alt="スクリーンショット 2020-06-27 18.40.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8352/2cdfd6c7-0c30-6641-6ecb-fda700caa689.png">

# ソース
- dateのフォーマットはお好きにどうぞ

```applescript
set the clipboard to (do shell script "date '+# %Y-%m-%d %H:%M:%S'")
```

# 保存する
- ファイルフォーマットは `アプリケーション` にする
<img width="734" alt="スクリーンショット 2020-06-27 18.39.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8352/00781d2f-5991-1b9e-acf6-6a76c3d46f39.png">

# アプリケーションを実行する
- 実行するとクリップボードに日時がセットされる
<img width="473" alt="スクリーンショット 2020-06-27 19.07.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8352/d4748cd8-6612-dc53-5c4c-3e1615481802.png">


# Spotlightを使うと便利
- SpotlightのデフォルトキーはCmd + Spaceだったはず
- datetimeと入力せずとも`d`でヒットしてくれるはず
<a href="https://gyazo.com/7e063986218eb340fbbe88f72f55f890"><img src="https://i.gyazo.com/7e063986218eb340fbbe88f72f55f890.gif" alt="Image from Gyazo" width="1000"/></a>

# Alfredを使うともっと便利
- 好きなショートカットキーに、作成したアプリケーションの実行を割り当てる
- この例ではCtrl + Shift + Dを押すと現在日時がクリップボードにコピーされます
![スクリーンショット 2021-05-11 14.27.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8352/01d3c90f-d085-6fe0-abc1-811078b8d59a.png)
解法メモ AtCoder Grand Contest 046 D - Secret Passage

はまったのが解説にない部分だったので、
同じはまり方をした人には役立つかも。

問題文：[AGC046D](https://atcoder.jp/contests/agc046/tasks/agc046_d)

---

できあがる文字列をTとする。
Tの各文字は、以下のいずれか：

- ★ 元から文字列Sの「右側」にあり、操作を受けなかったもの
- △ 元は、文字列Sの「左側」にあり、操作を受けて挿入されたもの

★と△の決め方は複数あるが、
数え上げるために、★の位置を以下の方法で貪欲に1つに決める。

「文字列Sの右端から順に、Tのできるだけ右にくるように対応づける」

その上で、対応付いた分をあらためて「右側」とする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605081/0f1a18c3-938a-9c86-dfa5-23e6f31d29aa.png)

すると△は、
左にある一番近い★と反対の数字（0なら1、1なら0）・・・（※）
になる。

そこで、「右側」を全通り試し、数え上げる。
具体的には、`S[0]`～`S[i]`を「左側」、残りを「右側」とし、
`i`を全通り試す。

- 「左側」から0を`j`個、1を`k`個供給することが可能か否か `dpA[i][j][k]`
- 「右側」に、0を`j`個、1を`k`個挿入してできる文字列の個数 `dpB[i][j][k]`

を計算し、可能な組合せを全部足したものが答。

# `dpB[i][j][k]`の計算

`i`の大きい方から順に以下の通り計算することができる。
今、`i`=iの時の計算をしようとしているとする。

## `S[i]`=0の時
（※）で書いた通り、`S[i]`の右に1を挿入する。
`i`=i+1の時点で1が`k`個以下なら、
`i`=iで1を`k`個にできるので、それらの和を取ればよい。

```math
dpB[i][j][k]=Σ_{k'=0}^k dpB[i+1][j][k']
```

これはimos法の時と同じ操作で求まるので、
計算量は$O(N^3)$（$N$はSの長さ）。

## `S[i]`=1の時
`S[i]`の右に0を挿入する。`S[i]`=0の時と同様に考えると、以下の通りになる。

```math
dpB[i][j][k]=Σ_{j'=0}^j dpB[i+1][j'][k]
```

# `dpA[i][j][k]`の計算

配るDPで考える。
`dpA[i][j][k]`が「可能」なら、
次の2つ(`S[i+1]`と`S[i+2]`)のどちらかを供給に回すことができるので、

```
dpA[i+2][j+1][k  ] ←「可能」（次の2つのどちらかに0がある時）
dpA[i+2][j  ][k+1] ←「可能」（次の2つのどちらかに1がある時）
```

とできる。
また、次の2つのうち右側(S[i+2])をその場に「挿入」することで、
何もせずに`i`を1つ進めることができる。

```
dpA[i+1][j][k] ←「可能」
```

これをしないと、
0011000000…のようになっている時に、1を2つ供給できない。
区切りを1つずらすことで2つとも供給に回せる。

更にもう1つ遷移を考える必要がある。これに気づかず大はまりした。

<details><summary>もう1つの遷移を考えずにはまった様子</summary><div>
以上を実装すると、入力例3が合わない。
しかし文字列Sが長すぎて原因が分からない。
挫折しかけたが、もう少し頑張ってみた。
問題文の操作を愚直に実行して数えあげるコードを作成。
文字列Sが短ければこれで正解が分かるので、
正解と食い違うできるだけ短い文字列Sを色々手入力して探す。

その結果、S=111001の時に、
正解が25個なのに24個と答えているのを見つけた。
正解25個の文字列をダンプすると、「100」がある。
・・・
どう見ても100が作れるように見えない。
100を作るためには、2つの0を供給する側に回す必要があるが、
2つとも供給するのは不可能に見える。
・・・
1分くらい考えて、ようやく気が付いた。
先に0と0の間に1を挿入して2つの0を分離しておけば、2つとも供給できる！
</div></details>

---

もう1つの遷移として、次の1つ(`S[i+1]`)を供給に回す操作が可能。
次の1つが0なら、供給に回す予定だった1を一つ取り崩し、
0の後ろに挿入すれば、0を供給に回せる。
次の1つ(`S[i+1]`)が1なら、その反対の操作をする。

```
dpA[i+1][j+1][k-1] ←「可能」(次が0の時)
dpA[i+1][j-1][k+1] ←「可能」(次が1の時)
```

結局、`dpA[i][j][k]`の遷移を全部まとめると、以下となる。

```
dpA[i][j][k]が「可能」の時のみ以下の遷移を実施：
dpA[i+2][j+1][k  ] ←「可能」(S[i+1]とS[i+2]のどちらかに0がある時)
dpA[i+2][j  ][k+1] ←「可能」(S[i+1]とS[i+2]のどちらかに1がある時)
dpA[i+1][j  ][k  ] ←「可能」
dpA[i+1][j+1][k-1] ←「可能」(S[i+1]が0の時)
dpA[i+1][j-1][k+1] ←「可能」(S[i+1]が1の時)
```

計算量はこちらも$O(N^3)$なので、全体も$O(N^3)$で解ける。

---

本番では、問題だけ読んだがやらずに避けた。
後から解いてみると、案の定どっぷりはまったので、避けて正解だった。
火の式かもしれないモノ

#概要
火の式をいじってみました。
火の式は「y=x」のようなものをあらゆる手段で詐欺ることで1でも多くの齟齬を出させることで膨張します。これは自由回答なのでいくらでもシンプルにも複雑にもできます。

#回答例
```
(x+100)=y
100=y-x
x+(y-x)=y
x+(x+(y-x))=x+y-x
x+x+y-x=x+y-x
x+x-x=x+y-x-y
x=0
y=100 ・・・壱
```
```
(x+100)=y
(x+100)-y=0
((x-y)+(100-y))=0
x-2y=-100
-x+2y=100
x-x+2y=y
2y=y.（・・・量子力学の勘違いの仕方に近いね。）
0=-2y+y
y=0
x+100=0
x=-100　・・・弐
```
```
壱と弐より
-100+100=100
100=0
100+1=0+1
101=1.（バウぅ～ワン！）
```
#回答例２
```
y=100+x
y=(100)+(100)
y=200A(Aは絶対値)
200A=y/x(身長計かいな？)
A=(y/x)/200
200*((y/x)/200)=y/x
1=1
```
```CPP
#include <iostream>
#include <cmath>

//https://ja.wikipedia.org/wiki/%E4%BA%8C%E6%AC%A1%E6%96%B9%E7%A8%8B%E5%BC%8F%E3%81%AE%E8%A7%A3%E3%81%AE%E5%85%AC%E5%BC%8F

template<class T>
std::pair<T, T>  Quadratic(const T& A, const T& B, const T& C) {
	T X = std::sqrt((B * B) -(4 * A * C));
	return { (-B + X) / (2 * A),(-B - X) / (2 * A) };
}

int main() {
	auto X = Quadratic<double>(1, 100, 1);

	std::cout << X.first << ':' << X.second << std::endl;

	double V = X.first;
	double A = V * V + 100 * V - 1;

	V = X.second;
	double B = V * V + 100 * V - 1;	
	
	std::cout << A << ':' << B << std::endl;
	
	return 0;
}
```
#終わりに。
これは加速式でしょうか？「y=2y」とは？
数学は苦手なので、こういう屁理屈をこねるしかできないのです。
「0は全、全は１」かなぁ？？
しかし、量子力学のニオイがしますね・・・。

#ガベージ
```
y=100+x
y=(99)+(1)
y=300*0.99+300*0.01
y=297+3

0=1/x.
100+x-y=1/x
100x+x^2-y*x=1
x^2+100x-1=yx
(x^2+100x-1)/x=y
解の公式適応後:(x^2+100x-1)=-2
-2/x=y
x=y/-2
y=100+(y/-2);
-2y=-200-y

-y=-200
y=-100

////
y=100+x
y=(100)+(100)
y=200A
200A=y/x
A=(y/x)/200
200*((y/x)/200)=y/x
1=1

///

200*((100+x)/x)/200=(100+x)/x
200*(100/x+1)/200=100/x+1

///
y=50A+50A
y-50A=50A
y/50-A=A
y/50=2A
A=y/100
y=50(y/100)+50(y/100)
y=y/2+y/2
y=y

////
y=49A+51A
y-49A=51A
(y-49A)/51=A
(y/51)-(49A/51)=A
y/51=A+(49/51)*A
y/51=(51/51)*A+(49/51)*A
y/51=100/51*A
y=100A
////
X+Y+Z=0
Z=-X-Y
Y=-X-Z

-X-Y-Z=0
Z-Z=0
X-X-Z-X-Y=0
X-X+X+Y-X-Y=0
```