OmniAICreator/Qiita-1.07M huggingface dataset:
最適化オプションによる結果の違いin Fortran

コンパイルの最適化オプションによって結果に違いが出る場合があります。
Fortranにおいて、わかりにくいバグが発生したので、備忘録的にこちらに書いておきます。

突然ですが、以下のFortranコードを見てください。

```Fortran:test.f90
module testmodule
    type testtype
        contains 
        procedure::test
    end type testtype

    contains

    subroutine test(self,i,v)
        implicit none
        class(testtype)::self
        integer,intent(in)::i
        complex(8),intent(out)::v
    
        write(*,*) "1",v*i

    end subroutine
end module testmodule

program main
    use testmodule
    implicit none

    complex(8)::v
    integer::i
    type(testtype)::t1

    i = 10
    v = 1d0
    call t1%test(i,v)
    i = 10
    v = 1d0
    call test2(i,v)
    !write(*,*) v

    contains 


end program main

subroutine test2(i,v)
    implicit none
    integer,intent(in)::i
    complex(8),intent(out)::v

    write(*,*) "2",v*i
    
end subroutine

```

このコード、gfortranでのコンパイルの最適化レベルのオプションの違いによって、異なる結果を返します。

```
gfortran test.f90
```
だと、

```
 1               (10.000000000000000,0.0000000000000000)
 2               (10.000000000000000,0.0000000000000000)
```

```
gfortran test.f90 -O2
```
だと、

```
 1               (0.0000000000000000,0.0000000000000000)
 2               (10.000000000000000,0.0000000000000000)
```
となります。

実は、このコードは作成者としては10が出て欲しいコードです。
しかし、一箇所バグが混入しているため、最適化レベルによって結果が変わってしまっています。
バグはどこでしょうか？



答えは、

```fortran
complex(8),intent(out)::v
```
は

```fortran
complex(8),intent(in)::v
```
とすべきです。inとoutを間違って入力してしまった、ということです。
outなので本来は値が入力されないにも関わらず、直前でのvの値が入ってしまっていて、結果的にintent(inout)のような挙動をしています。オブジェクト指向で書いた場合にO2とした時は、それをちゃんと反映したのか、きちんとvの値が反映されず、10とは表示されません。
eclipse 自動改行 ショートカットキー

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538465/3a169b9e-bd8c-0335-0e71-d24bb2f6afb5.png)

上のようにインデントがバラバラなコードあります。

①インデントを自動で直したい範囲を選択　↓↓
　![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538465/3316ae50-2e61-d876-ac69-9bb843d03d99.png)


②やっちゃってください →　**[Ctrl + i]**![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538465/b4ed0dcb-e98f-cd33-42c5-d7e9fecd97b3.png)

されると思います。自動インデント
年末まで毎日webサイトを作り続ける大学生 〜37日目 cssでパララックス風サイトを作る〜

##はじめに
こんにちは！@70days_jsです。

cssで簡単にパララックス風サイトを再現してみました。

今日は37日目。(2019/11/24)
よろしくお願いします。

サイトURL
https://sin2cos21.github.io/day37.html

##やったこと
cssで簡単にパララックス風サイトを作れるという記事をみたので早速やってみました。

![test2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/29a99434-6f9e-d129-3f10-fe0b6cf81aa3.gif)

とても手軽に実装できます。htmlもcssもシンプルです。
htmlは以下のように、ページ単位でdivに分けます。（one-pageクラスがついてるdiv)

```html
<body>
    <div class="one-page page-zero">
        <p>桃太郎</p>
    </div>
    <div class="one-page page-one">
        <p>むかしむかし、あるところに</p>
    </div>
    <div class="one-page page-two">
        <p>お爺さんとお婆さんがいました。</p>
    </div>
    <div class="one-page page-three">
        <p>お爺さんは山へ芝刈りへ。</p>
        <p>お婆さんは川へ洗濯へ。</p>
    </div>
    <div class="one-page page-four">
        <p>すると、お婆さん。</p>
        <p>洗濯をしていると川から桃が流れてきました。</p>
    </div>
    <div class="one-page page-five">
        <p>私、桃はあんまり好きじゃないなぁ。</p>
        <p>お婆さんは桃を無視しました。</p>
    </div>
    <div class="one-page page-six">
        <p>二人はその後も幸せに暮らしましたとさ。</p>
        <p>おしまい。</p>
    </div>
</body>
```

cssの重要な部分 ↓

```css
.one-page {
    width: 100vw;
    height: 100vh;
    position: sticky;
    top: 0;
}
```

これで.one-pageクラスのついた部分は縦横いっぱいなので1ページみたいに見えます。

そしてpositionがstickyなので、スクロールしてtopの位置が0になった時にfixedとなり、パララックスのように見えるというわけです。

そのあとは各ページごと（divごと）にz-indexをつけて重なる順序を指定して、他のスタイルを調整して終わりです。↓

```css

.page-zero {
    z-index: 0;
    background-color: rgba(150, 100, 50, 1);
}

.page-one {
    z-index: 1;
    background-color: rgba(50, 0, 0, 1);
}

...
```

##感想
以前javascriptでパララックスサイトを作ろうとして失敗した経験があったので、こんなに簡単に実装できて驚いています。
パララックスにも色々タイプがあるみたいなので、他のタイプのも年末までにやってみたいですね。

最後までお読みいただきありがとうございます。明日も投稿しますのでよろしくお願い致します。


##参考
1. たった数行のCSSでパララックス風表現ができる「position: sticky」の使い方 - WPJ (https://www.webprofessional.jp/js-library-scrollreveal-2/)

とても分かりやすかったです。ありがとうございます！
React関係まとめ

# React関係まとめ

* [javascriptで生成したcreate-react-appをTypeScript化する
](https://qiita.com/k_hoso/private/b4fe6181aa157ca2c7f3)
* [create-react-appで生成したReactのESLintをVSCodeでやる（自動整形付き）](https://qiita.com/k_hoso/items/b31529beafb78c80c0a2)
* [create-react-appで生成したReactのimportを絶対パスでやる（VSCode対応）]
(https://qiita.com/k_hoso/items/b6534a9d1536fde75f5c)
* [create-react-appで生成したReactのJest実行をVSCodeからブレークが効く状態で実行する](https://qiita.com/k_hoso/items/fad5d822adbd1471fc09)
* [ReactのhooksのESLint対応](https://qiita.com/k_hoso/items/5372317f7f7ae0cb31f2)
* [ReactでHTMLの文字列をレンダリングする（変数に格納されているHTMLの文字列をレンダリングする）](https://qiita.com/k_hoso/items/ccc9c5ddf00ff57d76ac)
* [Reactで日付入力にカレンダー（DatePicker）を使う ※年をプルダウンで指定して元号も表示する](https://qiita.com/k_hoso/items/1bacfb38e449552f2c71)
* [Reactで外部ドメイン向けにリンクを生成する（ReactRouterだとできない？ので。。）](https://qiita.com/k_hoso/items/5e2102e647ecd7809b93)

## etc

* [Reactで画面を作る時に気を付けるべきポイントメモ
](https://qiita.com/k_hoso/private/d5e7267c18c416e10232)

## お役立ちリンク

* [Made with React](https://madewithreact.com/tag/react/)
動画の音声をnormalizeする話

# はじめに
- ffmpegを使って、mp4の音声をnormalizeしよう．
- 音声だけならSoxで処理すれば良い．

Soxのことなら以下のサイトが綺麗にまとめているので、参考にしてください．
[SoXチートシート - コマンドラインで音声編集](https://qiita.com/moutend/items/50df1706db53cc07f105)

# 処理手順
以下の手順で進めていきます．

1. ffmpegをインストール
2. normalize処理

今回試した環境は以下の通りです．
OS: Ubuntu 18.04 LTS
CPU: i3-4130 3.40GHz
メモリ: 16GB

# 1. ffmpegをインストール
以下のコードを実行してffmpegをインストールしてください．
※[Ubuntu18.04にffmpegをインストールする](https://www.komee.org/entry/2018/10/30/120000)を参考にしています．

```
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install ffmpeg
```

# 2. normalize処理
normalize処理をする前に、今回使用する動画の拡張子と音声のサンプリング数とチャンネルを以下に示します．

- 拡張子：mp4
- サンプリング数：48000Hz
- チャンネル：2(ステレオ)

適当に4種類くらいコードを記しておきます．
※以下の2つは適宜変更してください．

- input.mp4: 入力する動画(適宜指定)
- output.mp4: 出力される動画(任意の名前)

```titie:単純にnormalizeするとき
$ ffmpeg -i input.mp4 -filter:a loudnorm output.mp4
```

```titie:チャンネル変更(2⇒1)&normalizeするとき
$ ffmpeg -i input.mp4 -filter:a loudnorm -ac 1 output.mp4
```

```titie:サンプリング数変更(48000⇒16000)&normalizeするとき
$ ffmpeg -i input.mp4 -filter:a loudnorm -ar 16000 output.mp4
```

```titie:よくばりセット(上記3つをまとめたもの)
$ ffmpeg -i input.mp4 -filter:a loudnorm -ac 1 -ar 16000 output.mp4
```

より詳しく知りたい人は以下の2つを参考にしてください．
[Audio Volume Manipulation](https://trac.ffmpeg.org/wiki/AudioVolume)
[無償のFFmpegでWavファイルの変換(Wavに変換)](http://www.xucker.jpn.org/pc/ffmpeg_wav.html)

# まとめ

- ffmpegで動画の音声をnormalizeした．
- ffmpegは色々な拡張子に対応しているのでとても便利．
ハマった！！！FontAwesomeがバージョン５からCDN配布を止めていた！

# 公式サイトでCDNを探しても見当たらない！　

いつの間にか、バージョン5からCDN配布を止めており、メアドを入力してファイルを取得する必要があった！

<img width="1551" alt="スクリーンショット 2019-11-24 22.08.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497005/fb1b1308-0bad-7507-653a-4b065a3d77dc.png">

## Javascriptファイルを読み込んで動的にスタイルシートを展開する方針に変わっていた！

```
<!doctype html>
<html>
  <head>
    <!-- Place your kit's code here -->
    <script src="https://kit.fontawesome.com/XXXXXXXXXX.js" crossorigin="anonymous"></script>
  </head>

  <body>
    <!-- Ready to use Font Awesome. Activate interlock. Dynotherms - connected. Infracells - up. Icons are go! -->
  </body>
</html>
```

## ちなみに・・・公式サイトでダウンロードできるファイルはバージョン５に対応していない！

ダウンロードしたファイルからscssだけを取り出してコンパイルして使用しましたが、`□`が表示されて使用できなかった！
バージョン５からは`@font-face`が使用されているが、ダウンロードファイルは使用されていなかった！

<img width="1194" alt="スクリーンショット 2019-11-24 22.16.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497005/e6f55c9d-2023-3d06-9c74-dc14569e39b5.png">

## 登録は無料！

恐る恐るメアドを入力して登録してみましたが、登録自体は無料でした！
ログイン後は管理画面に表示され、有料版にアップグレードすることができる形式になっていた！
【自分用】Node.jsアプリの設計の手順

Twitterのようなアプリを設計する際

###①要件定義
<機能要件>
投稿を作る。
投稿を編集する。
投稿を削除する。
投稿をお気に入りとする。
投稿に対してコメントをする。

などの基本的な機能を定義することを言います。

<非機能要件>
機能に付随する要件やセキュリティ要件

などを定義する。

###②用語定義
上記の要件定義であがった用語を定義する。

|用語       |英語表記     |意味　　　　|
|:--------:|:----------:|:---------|
|ユーザー    |    user   |  投稿の利用者 |
|投稿    |    tweet   |  投稿をすること |
|お気に入り    |    favorite   |  投稿をお気に入りに登録すること |
|コメント|　comment |投稿に対してコメントをすること|

用語の表す対象の意味付けをしっかりすることで、思わぬ実装ミスを防ぐことができます。


###③データモデリング
ER図などを使い用語の関係性などを定義する。
用語設計をすることによって、要件に漏れがないか、仕組みに問題がないかをチェックすることができます。

ユーザー1 --------- \*投稿1 ---------\*お気に入り

参考：[データモデリング基本](https://qiita.com/tarotaro1129/items/662afb8cb9b0969da7fd)
###④URL設計
内容を表示するページ構成を設計する。
同じページ上に表示できるものは一緒のページをする。

・トップページ/投稿一覧ページ
・自分の投稿/コメント/お気に入りを表示するページ
・投稿を作成するページ
・投稿を編集するページ

####ページURL

|パス      |メソッド     |ページの内容　|
|:--------:|:----------:|:---------|
|/  |GET|  トップページ/投稿一覧ページ |
|/tweet/:tweetid|GET| 自分の投稿/コメント/お気に入りを表示するページ |
|/tweet/new  |GET|投稿を作成するページ|
|/tweet/:tweetid/edit|GET|投稿を編集するページ|

####WEBAPIのURL

|パス      |メソッド     |処理内容　|方法|
|:--------:|:----------:|:---------|:---:|
|/tweet  |POST| 投稿をする  |  フォーム |
|/tweet/:tweetid?edit=1|POST|投稿を編集する|フォーム|
|/tweet/:tweetid?delete=1|POST|投稿を削除する|AJAX|
|/tweet/:tweetid/user/:userid/favorite|POST|投稿をお気に入りする|AJAX|
|/tweet/:tweetid/user/:userid/comment|POST|投稿にコメントをする|AJAX|


###④モジュール設計
Expressなどのフレームワークを使えばモジュール設計は簡単ですが、
ここではMVCに当てはめてみます。

####MVC
モジュール設計はMVCフレームワークを使うと整理がしやすいです。

#####Model
Modelはデータモデリングのことを指し、データの管理を行うモジュールを当てはめます。
Modelモジュールはmodelsディレクトリの配下におきます。

|ファイル名| models/user.js |models/tweet.js|models/comment.js|models/favorite.js|
|:--:|:--:|:--:|:--:|:--:|
|役割|ユーザーの定義と保存|ツイートの定義と保存|コメントの定義と保存|お気に入りの定義と保存|

#####View
Viewは見た目、HTMLなどを生成するテンプレート（pugやEJS）を当てはめます。
Viewはviewsディレクトリの中におきます。

|ファイル名|index.pug|new.pug|layout.pug|edit.pug|
|:--:|:--:|:--:|:--:|:--:|
|役割|トップ/投稿一覧モジュール|新規投稿モジュール|基礎モジュール|投稿編集モジュール|

#####Controller
ControllerはModelとViewをコントロールする部分で、Node.jsだとルーティングを指します。

|ファイル名|routes/tweet.js |routes/comment.js|routes/fovorite.js|
|:--:|:--:|:--:|:--:|
|役割|ツイートの処理|コメントの処理|お気に入りの処理|


参考：[N予備校 プログラミングコース](https://www.nnn.ed.nico/courses/497/chapters/6891)
.NET Framework 入門①

# .Net Frameworkの概要

・「マイクロソフトが提供するVisualStudioで開発したプログラムを実行するための環境」である。
・セキュリティや機能性が高いことが利点である
・Windowsでのみ使用可能、.NET COREをインストールすることで、MACOS,LINUXでプログラムを実行できる。
・どの言語で記述しても共通中間言語（CIL）にコンパイルされる。CILを共通言語ランタイム（CLR）が読み込む事でプログラムが実行される。

# .Net Frameworkの最大の特徴
・VisualBasic, C#, C++, VB, Pythonなど、多くのプログラミング言語がサポートされている。
・開発者はメモリ管理などを意識することなく、プログラムを開発することができる。
BottomNavigationViewのアイテムを動的に隠す

## はじめに
業務において「条件に応じてBottomNavigationViewのアイテムを隠す」
という要件があって調べたので備忘録として残しておきます。

## 実装方法
最初はVisibilityを触って非表示にする方法を調べていましたが、remoteItemを使うのが正解のようです。

```kotlin
mBottomNavigationView.getMenu().removeItem(R.id.item_name);
```
## 結果
「カリキュラム」というメニューを隠してみました。

### 通常時
通常はBottomNavigationが4つのメニューアイテムを持っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68671/879c66b9-3480-7837-bcc1-093edee769c2.png)

### removeItemで隠した時
このようにカリキュラムのメニューが隠れ、3つのメニューアイテムとなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68671/b8c561c1-682e-0081-5104-c8d006e76b6a.png)

## 参考
https://stackoverflow.com/questions/45051301/how-to-dynamically-hide-a-menu-item-in-bottomnavigationview
【ノートまとめは不要】100時間で基本情報技術者試験に合格した勉強法です。

#私のプロフィール
- エセ理系(プログラミングも数学も嫌いな生物専攻)
- 社会人一年目、某外資系システムベンダーで技術営業職 
- 暗記とかまじ無理

そんな私が、つめこみ1ヶ月(100時間くらい)で基本情報受かったので、まとめます

- 私が受けたのは、2019年秋試験です
- 結果は、午前75%、午後83%でした

#こんな人向けの記事です
- 試験までまだ1ヶ月はある
- IT系に勤めていて、CPUとか単語はなんとなくわかる
- 今からまじ本気出す(￣▽￣)

#ちなみに言うと
- ３日で受かったという記事を見ましたが、その人はめちゃすごいので、鵜呑みにしないようにしましょう
- 我ら凡人には1ヶ月はかかりますw

#勉強法サマリー
- 午前試験は12回(6年分)、とにかく答えを覚える、ノートまとめはしない
- 午後問題はテキストベース、一度も解かない (!!)
- 平日２時間、休日は５時間くらいやる

#用意するもの
- [過去問](https://amzn.to/34eVKT7)
 - ４回分のテキスト+８回分のpdfが付いてきます
- [午後テキスト](https://amzn.to/2OEcKMe)
- 付箋

以上。

#やり方

ノートまとめは不要です。過去問を時間を測って解く必要もありません。(本番は時間は十分にあるからです)
間違えた問題を何回でも解くことが大事です。

- １週間目
 - 12回分を一気に２週します。 
 - １週目はとにかく午前問題を見る
 - 最初から正解を見て頭に叩き込む(見たら一回顔をあげて、そらんじてみるといいですよ)
 - ２週目は答えを隠す→10秒で解答をチェック、覚えていなくてまちがえたものに付箋


- 2週間目
 - さらに3週します。
 - ただし、付箋をつけているもの以外は目を通さないです
 - 当たったら付箋を外して、付箋の数を減らしていく

- 3週目
 - 付箋が全てとれるまでやります。 
 - 後半は午後問題をやります…といってもテキストを眺めるだけです。
 - 正解を見ながら、問題文をなぞっていきます

- ４週目
 - もう付箋は全部取れてますよね？ 
 - 午後の問題の流れは頭に入ってますよね？

以上です！！

#とりあえずまとめると、

正解を叩き込んでおけばおっけーってことです。
Go Modules で stringer なんかの開発用ツールを管理するには

# はじめに

* Go Modules で stringer や lint など開発用のツールを依存パッケージとして管理する方法についてまとめます。

# Go Modules で開発ツールを管理できない問題

* stringer などの開発ツールを go get すると一時的に go.mod に記載されますが、コードの中で import されていないため go mod tidy すると go.mod から外れてしまいます。

# 解決策

* コード中で import されてさえいれば Go Modules の管理対象にできるので、開発ツールを import するだけのファイルをおいておきます。
* ファイル名は何でも良いのですがとりあえず `tools.go` で統一しておくとわかりやすいかもしれません。

```go:tools.go
// +build tools

package main

import _ "golang.org/x/tools/cmd/stringer"
```

# 解説

* 行頭の `// +build ` はビルドタグと呼ばれるもので、go build 時に固有環境向けのコードを実装するために利用されます
* tools.go のビルドタグには `// +build tools` と記載されているため tools タグがある場合のみコンパイル対象になります
* 実際には tools タグ付きでビルドされることはないので、実行時に何らかの影響を与えることなく Go Modules のために開発ツールを import するということが tools.go によって実現されています。
* かなりバッドノウハウっぽいですが、[Go Modules の Wiki](https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module) に記載されている手法なのでとりあえずこうしておくのが良さそうです。
CUIからWIFI接続を行う方法

目的
=========
Raspberry Pi Zeroにcomを繋げて色々作業を行っていたが、sshでファイルのやりとりを行いたくなってきた。
無線LANが備わっているので、家のWiFiルーターに接続させたいがGUIではなくCUIでのやり方が分からなかったので調べたことを残す  
 
やり方
========

設定ファイルを作成する
-------------------
``` wpa_supplicant ``` と呼ばれるIEEE 802.11iのサプリカントのソフトウェアを用いて接続を行う。
設定ファイルは``` /etc/wpa_supplicant/mywifi.conf ``` に作成する。

```shell
wpa_passphrase SSID password > /etc/wpa_supplicant/mywifi.conf

```

接続する
---------------
作成した設定ファイルをwpa_supplicantコマンドを使って自宅wifiに繋げる  

```shell
dhclient wlan0 
 ```
SQL Serverで外部ファイルのSQL文を連続実行する方法

# TL;DR

- SQL Server でテーブル定義変更用のクエリ等を順番に実行する方法

# 解説

- sqlフォルダに、実行したい順にファイル名を付けたテキストファイルを配置（01等の数値を付ける）
- 接続情報を記載して、BATを実行する
- ローカルにコピーしないと動作しない、はず

# コード

```:構成
runsqlfiles.bat
└sql
  └01_createtable.txt
  └02_insertdata.txt
  └...
```

```batchfile:runsqlfiles.bat
@echo off

set PATCH_HOME=%~dp0\
set SQL_DIR=sql\
set INFO_LOG1=sqlrunlog.log
set SQL_LOG1=sqldetaillog.log
set server=myserver\myinstance
set db=mydb
set user=myuser
set pass=mypassword

cd %PATCH_HOME%%SQL_DIR%
  
echo ━━━━━━━━━━━━━━━━━━━━
echo 接続先 %DB%@%SERVER%
echo %PATCH_HOME%%SQL_DIR%のテキストファイル（*.txt）のSQLを連続実行します。
echo ローカルにコピーしてから実行してください。
echo ━━━━━━━━━━━━━━━━━━━━

pause
  
REM exe
echo %date% %time% >> %PATCH_HOME%%INFO_LOG1%
for /f "usebackq" %%I in (`dir /b /a-d /s *.txt`) do (
  echo 実行しています "%%I"
  echo %%I >> %PATCH_HOME%%INFO_LOG1%
  
  echo ――――――――――――――――――――― >> %PATCH_HOME%%SQL_LOG1%
  echo %%I >> %PATCH_HOME%%SQL_LOG1%
  echo ――――――――――――――――――――― >> %PATCH_HOME%%SQL_LOG1%

  sqlcmd -l 240 -S %server% -d %db% -U %user% -P %pass% -i %%I >> %PATCH_HOME%%SQL_LOG1%
  
  echo %date% %time% %%I ★完了 >> %PATCH_HOME%%SQL_LOG1%
)
echo %date% %time% >> %PATCH_HOME%%INFO_LOG1%
  
echo 完了。ログファイルを確認し、エラーが出ていないかを確認してください。
pause
```
ElasticSearch + Elastalertでエラーログ検出時に通知したい

# PreRequirement
Kibana
ElasticSearch

# Install Elastalert
Elastalert公式はYelp製で下記で提供されているhttps://github.com/Yelp/elastalert

また、下記でDocker版も提供されている
https://github.com/bitsensor/elastalert


ElasticSearchが動作している状態で、下記コマンドを実施するとElastalertが起動する

```
git clone https://github.com/bitsensor/elastalert.git; cd elastalert
docker run -d -p 3030:3030 \
    -v `pwd`/config/elastalert.yaml:/opt/elastalert/config.yaml \
    -v `pwd`/config/config.json:/opt/elastalert-server/config/config.json \
    -v `pwd`/rules:/opt/elastalert/rules \
    -v `pwd`/rule_templates:/opt/elastalert/rule_templates \
    --name elastalert bitsensor/elastalert:latest
```

# 実際にアラートあげる設定をまとめる予定
BigQueryで16進数を文字列に変換する

FORMATを使うと、16進数をUTF-8文字列に変換できる。

```
SELECT FORMAT("%t", FROM_HEX("666f6f626172"));

=> foobar
```

文字列にならない16進数は、

```
SELECT FORMAT("%t", FROM_HEX("66f6f62617"));

=> f\xf6\xf6&\x17
```
こうなる。

##参考
https://stackoverflow.com/questions/53669054/from-hex-in-google-bigquery-returns-different-result-than-the-result-on-the-publ
EntityFrameworkCoreでMigrationsしたときのテーブル名や定義名

EntityFrameworkCoreで、業務で何も考えずに名前を決めたせいで外部キー(以下、「FK」)で困ったので、テーブル名や定義名がどう設定されるのか確認した。

- 確認環境
  - SQL Server 14.0
  - .net core 2.2
  - EntityFrameworkCore 2.2

## テーブル名
**結論**
**DbContextクラスのプロパティ名がそのままテーブル名になる**

```CorporateDbContext.cs
public class CorporateDbContext : DbContext
{
    public CorporateDbContext() { }
    public CorporateDbContext(DbContextOptions<ApplicationCommandDbContext> options)
        : base(options)
    {
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
    }
    public DbSet<User> User { get; set; }
    public DbSet<UserDetail> UserDetails { get; set; }
    public DbSet<Companys> Company { get; set; }
    public DbSet<CompanyDetails> CompanyDetails { get; set; }
}
```
この場合だと、`User`と`Companys`のクラスが単数形に、
`UserDetail`と`CompanyDetails`のクラスが複数形になる。

## カラム名（FK）
**結論
クラス名＋"Id"で自動生成される**

```Companys.cs
public class Companys
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<CompanyDetail> CompanyDetail { get; set; }
}
```
```CompanyDetail.cs
public class CompanyDetail
{
    public Guid Id { get; set; }
    public string DetailKey { get; set; }
    public string DetailValue { get; set; }
}
```
上記のように親テーブルから子テーブルに対してプロパティを実装した場合、EntityFrameworkCoreではシャドウプロパティとしてFKが自動的に設定され、テーブルにも実装される。
上の場合だと、データベースのCompanyDetailテーブルには`CompanysId`のカラムが実装される。

## 最後に
クラスやプロパティの命名は昔からきちんと決めることが大事と言われていたけど、それを痛感した。
私がやってしまったのはFKのほうで、明示的にFKのプロパティを考えなしに実装した結果、`CompanyId`と`CompanysId`の両方がテーブルに実装されてしまった。

## 参考
[EntityFrameworkCore シャドウ プロパティ](https://docs.microsoft.com/ja-jp/ef/core/modeling/shadow-properties)
[EntityFrameworkCore リレーションシップ](https://docs.microsoft.com/ja-jp/ef/core/modeling/relationships)
Alexaのスマートディスプレイが作れるSDKが出てたのでラズパイで試してみた

Alexa Smart Screen SDKという、Amazon Echo showのようなスマートディスプレイが作れるSDKが公開されてました。
https://twitter.com/alexadevs/status/1197243218016002049
今までは一部のデバイスメーカーにしか公開されていなかったのでしょうか？

MacOS、ラズパイ、Ubuntuにてプロトできるそうです。
https://github.com/alexa/alexa-smart-screen-sdk/wiki/Quick-Start-Guides
今回はラズパイでやってみました。

#プロトの流れ
基本的に以下のサイトを見ながら手を動かせばできます。
https://github.com/alexa/alexa-smart-screen-sdk/wiki/Raspberry-Pi-Quick-Start-Guide
ので、ざっくりとした流れのみ書きます。

1. Amazon Developer PortalにてAVSデバイスを定義し、セキュリティプロファイルを作成する。
* AVS Device SDKをビルドし、動作できるよう設定する。
* APL Core Libraryをビルドする。
* Alexa Smart Screen SDKに必要な依存環境のインストールhttps://github.com/alexa/alexa-smart-screen-sdk/wiki/Raspberry-Pi-Quick-Start-Guide#test-the-alexa-smart-screen-sdk-sample-app
* Alexa Smart Screen SDKをビルドする。

ちなみに、ラズパイ上でのビルドは中々に時間がかかりました。。
合間にご飯作ったり買い物行ったりで5、6時間くらい？？
全コマンドを一つの.shファイルにまとめれば、もっと早いと思います。

#動作
動作方法は以下です。
https://github.com/alexa/alexa-smart-screen-sdk/wiki/Raspberry-Pi-Quick-Start-Guide#test-the-alexa-smart-screen-sdk-sample-app
こちらもざっくりした流れのみ書きます。

1. SampleAppプロセスを立ち上げる。
2. ブラウザで指定のindex.htmlを開き、SmartScreenのGUIを開く。
3. キーボードのAキーをホールドしながら、ラズパイに繋がったUSBマイクに話しかける。

すると、以下のようにディスプレイカードが表示されます。(適当にWhat is Japanese?と話しかけた結果です。)
![IMG_9656.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266059/654ee7e1-c3ea-9987-e451-94d0ed6f3749.jpeg)
APL対応スキルも動作します。(セットアップで疲れて家ではやりませんでしたが。。)

カードの表示まで、ちょっと時間かかるかなーという印象です。
もっとスペックの高いマシンでやればサクサク動きそう。

# まとめ・感想など
* Alexa Smart Screen SDKは、Alexa対応スマートディスプレイ向けのSDK。
* プロト方法はAlexaのGitHubにすべて書かれている。(https://github.com/alexa/alexa-smart-screen-sdk/wiki/Quick-Start-Guides)
* 時間はかかるが、Linuxコマンドが少し使えればプロトできるくらい簡単。
* ラズパイでやるとものすごく時間がかかる。次はPCでやりたい。

以上、初投稿でした。
Androidで文字を点滅するメソッドができてうれしい

　こんにちはヨースケです。文字列の一致に"=="を使っていました(笑)。equalsですね！

### 初めて作ったアプリで実装
　この文字を点滅させるメソッドは、初めてアプリを公開した時に実装したものになります。[計算問題付き電卓](https://play.google.com/store/apps/details?id=first.myapp.mycalc)←このアプリは名前の通り電卓に計算問題を出す機能を付けたアプリとなっています。計算問題がスタートするとタイマーをスタートさせ、全10問クリアするとタイマーがストップしそのタイムで点滅するようにしました。また、答え終わると過去のクリアタイムを表示するようにしています。

### ソースコード
　あんまり長ったらしくなってもよくないので稚拙なコードではありますが自分自身の備忘録として貼っておきます。

```java:Quest.java
public class Quest extends AppCompatActivity {
private final Handler handler = new Handler();
//タイマーを表示
    private TextView timerText;
...中略...
//全問正解するとtimer_stop()を呼びます
//タイマーストップ
        public void timer_stop() {
            handler.removeCallbacks(runnable);
            timerText.setTextColor(Color.RED);
            count = 0;
            insert_db();
            result_tweet();
            init();
        }

 //止めたタイムをチカチカさせるメソッド
        private void init() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    int time = 500;
                    try {
                        Thread.sleep(time);
                    } catch (Exception e) {

                    }
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            if (timerText.getVisibility() == View.VISIBLE) {
                                timerText.setVisibility(View.INVISIBLE);
                            } else {
                                timerText.setVisibility(View.VISIBLE);
                            }
                            init();
                        }
                    });
                }
            }).start();
        }
}
```

　このinit()メソッドで止めたタイマーをチカチカ点滅させています。この→[テキストビューを点滅させる方法](https://codeday.me/jp/qa/20190108/126818.html)を参考にプログラムを組んだので大体の流れしか分からず、Threadやhandlerのところも勉強不足なのでまだまだ勉強が足りないなぁーと反省。(メソッド名ェ...)

　現在は3つ目のアプリ、「一日日記(福岡編)」(仮題)を開発中です。ひと段落着いたときや投稿したいなーとなったときに書いていくのでよろしくお願いしますね(^ ^)。ちなみにTwitterもやっていますので気軽にフォローよろしくお願いします！→[Twitterのアカウント](https://twitter.com/karmari3)

参考URL：
テキストビューを点滅させる方法：https://codeday.me/jp/qa/20190108/126818.html
Cloud Firestore を Java から使う際のドキュメントまとめ

## Firestore 全般

- [Cloud Firestore  \|  Google Cloud](https://cloud.google.com/firestore/)
- [Cloud Firestore documentation  \|  Cloud Firestore  \|  Google Cloud](https://cloud.google.com/firestore/docs/)
- [Cloud Firestore  \|  Firebase](https://firebase.google.com/docs/firestore/)

## 料金

- [料金  \|  Cloud Firestore  \|  Google Cloud](https://cloud.google.com/firestore/pricing?hl=ja)
- [Firebase Pricing  \|  Firebase](https://firebase.google.com/pricing/?hl=ja)
- [使用量と制限  \|  Firebase](https://firebase.google.com/docs/firestore/quotas)

## データモデル

- [Cloud Firestore データモデル  \|  Firebase](https://firebase.google.com/docs/firestore/data-model)
- [サポートされているデータ型  \|  Firebase](https://firebase.google.com/docs/firestore/manage-data/data-types)
- [Cloud Firestore のインデックスの種類  \|  Firebase](https://firebase.google.com/docs/firestore/query-data/index-overview)
- [使用量と制限  \|  Firebase](https://firebase.google.com/docs/firestore/quotas)

## Cloud Firestore API Client Library for Java

- [SDK とクライアント ライブラリ  \|  Firebase](https://firebase.google.com/docs/firestore/client/libraries)
- [Google Cloud Java Client for Firestore at master · googleapis/google\-cloud\-java · GitHub](https://github.com/googleapis/google-cloud-java/tree/master/google-cloud-clients/google-cloud-firestore)
- [Cloud Firestore API Client Library for Java  \|  Google Developers](https://developers.google.com/api-client-library/java/apis/firestore/v1)
- [com\.google\.cloud\.firestore \(Google Cloud API\)](https://googleapis.dev/java/google-cloud-clients/latest/index.html?com/google/cloud/firestore/package-summary.html)
- [Cloud Firestore API v1](https://developers.google.com/resources/api-libraries/documentation/firestore/v1/java/latest/)

## サンプルコード

- [Quickstart using a server client library  \|  Cloud Firestore  \|  Google Cloud](https://cloud.google.com/firestore/docs/quickstart-servers)
- [Cloud Firestore を使ってみる  \|  Firebase](https://firebase.google.com/docs/firestore/quickstart?hl=ja)
- [Cloud Firestore でデータを取得する  \|  Firebase](https://firebase.google.com/docs/firestore/query-data/get-data?hl=ja)
- [Cloud Firestore にデータを追加する  \|  Firebase](https://firebase.google.com/docs/firestore/manage-data/add-data?hl=ja)
- [java\-docs\-samples/firestore at master · GoogleCloudPlatform/java\-docs\-samples · GitHub](https://github.com/GoogleCloudPlatform/java-docs-samples/tree/master/firestore)

## バックアップとリストア

- [データのエクスポートとインポート  \|  Firebase](https://firebase.google.com/docs/firestore/manage-data/export-import?hl=ja)
- [データのエクスポートをスケジュールする  \|  Firebase](https://firebase.google.com/docs/firestore/solutions/schedule-export?hl=ja)
【テストおじさんへの道】テストをやると幸せになれる

#what this is?
これは僕がテストおじさんになるまでの軌跡を書いた記事です。
この記事を社内で共有してテストの文化を浸透させるために書いています。
執筆当時はまだ「テスト赤ちゃん」です。優しく指摘してください。

#テストをなぜ行う？
答えは簡単です。
「人間は愚かで、プログラムを操ることは難しいから」
です。

最近では「誰でもプログラマーになれる！」なんて、さもプログラマーの敷居が低いかのような言葉がインターネッツで飛び交っていますが
甘いです。
プログラムは簡単に壊れます。そして人に牙をむきます。
そんな事が当たり前の職業でどうやってプログラムを正常にコントロールするのか…
それが「テスト」です。

##テストを書かないとどうなるのか
いくつかあります。
・品質が保証されない
・デバッグのコストが莫大になる
・改修のコストとリスクが莫大になる
・引き継ぎがのリスクが高くなる
などなど…

僕が一番推したいのは
「不安で寝れない」
ということです。
いつ、どこで、どんなときにバグが起こるか、書いた本人ですらわからないのです。
そんな不安をテストは解消してくれます。

##テストを書くとどうなるのか
もうメリットがたくさんです。
・品質が保証されているので、安心して運用出来る。
・デバッグのコストが一気に下がる。手動でのフォームテストなどをしなくてもよくなる。
・改修が簡単になる。どこに副作用があるのか簡単に把握出来る。
・引き継ぎが楽になる。とりあえずテストを読めば使用がふんわりわかる。

様々な恩恵を受けることができますが、一つだけデメリットがあります。
それは
「開発コストが上がる」
ということです。
当然今までの開発にプラスしてテストも書くわけですから、仕方ありません。
ですがメリットを考えるとプラマイゼロ、むしろメリットのほうが大きいと思います。

#テストをするにはどうする？
僕は主にphpを使うので、テストではphpunitを利用します。
他の言語ではjsunitやrubyunitなど、○○unitでググればなんか出ると思います。

そんなphpunitですが、みんな使っているLaravelに基本搭載されています。
```vendor\phpunit\phpunit\phpunit```にバイナリデータがあります。コレが正体です。
ですが、結構奥のディレクトリに眠っているので
普段は```vendor\phpunit\bin\phpunit```というシンボリックリンクがあるので、それを叩きます。

コマンドで
```sudo php ./vendor/bin/phpunit```
と打つと

```
PHPUnit 8.4.2 by Sebastian Bergmann and contributors.
```

と表示されてテストが走ります。

#テストを書くにはどうする？
テストはLaravelの```tests\Feature```の中に置きます。
デフォルトで入っている```ExampleTest.php```には以下のように書かれています。

```php5

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}
```

基本的に書き方としては
・test○○○というpublic functionを書く
・$this->get('○○○')でレスポンスを得る
・aeert○○○()でテストする
です。

###test○○○というpublic functionを書く
基本的にクラスの上から下へ実行されます。
関数名はtestというプレフィックスを付けなければ自動で実行されません。

###$this->get('○○○')でレスポンスを得る
getの他にもpostやputなどがあります。

###aeert○○○()でテストする
assert○○○()をアサーションといいます。
assertStatus()やassertSee()などたくさんあります。
このアサーションを組み合わせてプログラムをテストします。

アサーションには、phpunitが用意しているものと
https://phpunit.readthedocs.io/ja/latest/assertions.html

Laravelのヘルパとして用意されているものがあります。
https://readouble.com/laravel/5.7/ja/http-tests.html

#まずは書いてみよう
簡単なものを書いてみて動きを自分で確認するのがテストへの第一歩だと思います。
とりあえず触ってみましょう、テストの素晴らしさがわかると思います。
【Jiraカンバンボードのベストプラクティス 】親子タスク整理・完了タスク非表示

#概要
プロジェクト管理・コミュニケーションツール「Jira」には自分のタスクを表示させる「カンバンボード」機能があります。

Jira初心者のぼくは当初この「カンバンボード」が苦手で、
✅そのタスク・プロジェクトの全体像（WBS・進捗）がボードから見えない
✅期限が迫っていることがボードから検知できない
✅終わったタスクがいつまでもボードに残り続ける
といったカオスな問題を抱えていました。

この問題を解消したカンバンボードのベストプラクティス（自称）をここでまとめます。

#カンバンボード Before
具体的にお見せすると、当初ぼくのボードは以下のようになっていました。
![myJiraBord_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521810/05c8e073-5837-d2c4-b79d-4193a379b053.png)
見てのとおり、以下の状況が発生しています：
✅「その親タスク（親課題）は何か？」「その子タスク（子課題）は何か？」の関連性が分かりにくく、アウトプットを出すためにどういったタスクがあり、どういう状況なのかが分からない
✅期限が具体的にいつなのか分からない（そしていろんなタスクで既に期限に達してしまっている）
✅（「DONE」のタスクが無制限に増え続けるため）画面右側のスクロールがどこまでも長くなっている

#カンバンボード After
さきほどのボードをカスタマイズした結果以下のようになりました。
![myJiraBord_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521810/558edf6c-bfa8-0d87-d604-f3b6dddf3343.png)

以下のような仕様に生まれ変わりました：
✅親タスクごとにレーンが分かれている（親子関係のないタスクは一番下のレーンで「その他の課題」としてまとめられている）
✅各タスクのなかでそれぞれの子タスクの進捗が分かる
✅終わった子タスク、すべての子タスクが終わった親タスクは、一定期間後にボードから消える（「終わった」とはステータスが「DONE」または「TRASH」になったことを指します）

#実装方法
- **親子関係の可視化:「スイムレーン」≫「ストーリー」に変更**
(標準的な設定です)
![jiraBoardSettingSwimLane.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521810/ef3b788b-62d7-cc7c-ac67-55b8f0ebf8d0.png)

- **期日の可視化:「カードレイアウト」≫「期日」を追加**
(標準的な設定です)
![jiraBoardSettingCardLayout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521810/66f2b402-fe3a-2040-4b91-3c310350b821.png)

- **終了したタスクの整理:「カードレイアウト」≫「期日」を追加**
(JQLという独自言語を使ってカスタマイズします)

```
NOT (resolution = Done AND resolutiondate < -3d AND status in (Done, Cancelled))
```
![jiraBoardSettingQuickFilter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521810/21816d89-c195-93db-49db-7cdda390e8e4.png)

#課題
✅優先順位のフィルターをつけたい
※`order by priority desc`を試したが効かなかった
✅他の人が担当者の子タスクも表示させたい


---
よかったらフォローとかメッセージしてください！

**\ *Follow Me!* /**
**[*Qiitaアカウント*](https://qiita.com/MasatoEmata)**
**[*Twitterアカウント*](https://twitter.com/masatoemata)**
rampパラメータでポイントのアトリビュートを制御するTips

#この記事は？
Houdiniユーザーにとってあまりにも当たり前すぎて、Tipsにもなっていないような内容を自分用備忘録として記事にしました。

#1.rampパラメータを作成
##1-1.wrangleノードに作成する
```C:ramp
float  chramp(string channel, float ramppos)

float  chramp(string channel, float ramppos, float time)

vector  chramp(string channel, float ramppos)

vector  chramp(string channel, float ramppos, float time)
```
Houdiniでのrampは返す値の型が「float」「color」の2種類あります。
wrangle上ではfloatの場合もvectorの場合も同じなので、ただコードを書いて表示させただけではすべてfloatのrampになってしまうため、別途Edit Parameter Interfaceウィンドウにて、Ramp TypeをColorに設定してやる必要があります。
（VEX上で指定できる方法あれば情報が欲しいです。プラグマ？）

string channelのところで指定した名前は、そのままパラメータのnameに使用され、
nameの頭文字が小文字であったら大文字に変更されたものがパラメータのLabelに使用されます。

#2.作例いろいろ
##2-1.作例①ポイントの移動
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434798/82134194-4dd9-0b97-e1ba-0b0085e9d6cc.png)


```C:example_pos
float position=fit(@P.y,0,`ch("../line1/dist")`,0,1);
float move=chramp("move",position);
float multiply=chf("multiply");

@P.x=@P.x+move*multiply;
```

##2-2.①解説
```C
float position=fit(@P.y,0,`ch("../line1/dist")`,0,1);
```
ここで各ポイントが、rampでいう0～1のどこに当たるかというのを設定しています。
「高さ０をrampの0、高さ最大をrampの1とした時の、@P.yの位置」を決めています。
高さの最大はlineノードで指定したLengthのパラメータをそのまま持ってきています。

```C
float move=chramp("move",position);
```
上記で設定した範囲をrampに設定します。
これは「"move"という名前のrampパラメータで、rangeの値を決める」という意味です。

```C
@P.x=@P.x+move*multiply;
```

@P.xに、rampパラメータで取得した値を加算し、各ポイントを移動させました。
rampが吐き出す値は0～1であるため、そのままだと移動による変化が見えないため、任意の数値（multiply）を乗算して移動量を調節できるようにしています。

#2-3.rampパラメータでpscaleを制御
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434798/c39060fc-1bd6-cd44-80c1-4d4c8a85065b.png)

```C:example_pos
float position =fit(@ptnum,0,@numpt,0,1);
float tube_scale=chramp("ramp",position);

@pscale=tube_scale;
```
##2-4.作例③
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434798/8137b8c2-a5cc-e8d2-2be0-e1a7cbe398c0.png)

```c:prim_scale
vector max_pos=getbbox_max(1);
vector min_pos=getbbox_min(1);

float position=fit(@P.z,min_pos.x,max_pos.x,0,1);
float scale=chramp("scale",position)+0.5;

f@prim_scale=scale;
```

```C:prim_color
float position=fit(@prim_scale,0.5,1.5,0,1);
vector color=chramp("prim_color",position);

@Cd=color;
```
外観モードの変更を監視する（macOS / Objective-C）

# 概要

- アクアとダークモードでメニューバーアイコンを切り替える必要がでた。
- [（Apple）Supporting Dark Mode in Your Interface](https://developer.apple.com/documentation/xcode/supporting_dark_mode_in_your_interface?language=objc)にあるように、Viewであれば`drawRect`などで切り替えれば良さそう。
- ただし今回は`NSObject`内で操作したいため再描画のトリガがない。よって`NSNotification`で実装を行った。

## 参考

- [objective c \- macOS 1014でダークモードを検出するにはどうすればよいですか？](https://tutorialmore.com/questions-107444.htm)
- [Swift：macOSでテーマの切り替えを検出する](https://qiita.com/Kyome/items/a673401f3cdec347c6a6)
- [NSNotificationを使って設定パネルを実装する](https://qiita.com/IKEH/items/93abd9c1e034426951ad)
- [（Apple）Supporting Dark Mode in Your Interface]
    - View関連は載っているけれどNSNotificationに関しては言及が無い
    - 「Supporting Dark Mode in Your Interface」ではViewの描画時のことに言及している。
    - 基本はNSNotificationば使わないのだろうか。今回みたいにメニューバーアイコンを考えなくていいなら、描画時に変更するので事足りるのか。
    
## Code

```objc
[NSDistributedNotificationCenter.defaultCenter addObserver:self
                                                  selector:@selector(themeChanged:)
                                                      name:@"AppleInterfaceThemeChangedNotification"
                                                    object: nil];
```

```objc
-(void)themeChanged:(NSNotification *) notification {
    NSLog (@"%@", notification);
}
```

```objc
/**
 @brief 現在ダークモードかどうか
 */
- (BOOL)isDarkMode {
    if (@available(*, macOS 10.14)) {
        NSAppearance *appearance = NSApp.effectiveAppearance;
        NSLog(@"%@", NSAppearance.currentAppearance);
        return appearance.name == NSAppearanceNameDarkAqua;
    }
    return NO;
}
```

```objc
NSAppearance *appearance = NSApp.effectiveAppearance;
```

`NSAppearance`のとり方に注意。

```objc
NSAppearance *appearance = NSAppearance.currentAppearance;
```

- これだと`NSAppearance`が`appearance.name`が初回起動時のテーマに固定されて値が帰ってくるので不適。
- [currentAppearance](https://developer.apple.com/documentation/appkit/nsappearance/1531945-currentappearance?language=objc)
PHPがメインの経験者が、Pythonを始めて５日目の話（selenium）PHP vs Python

#はじめに
今回はseleniumを使用してChromeブラウザをコントロールしてWEBのサービスに保存されているファイルをダウンロードするのが目的です。もう一点の重要な目的はPHPとPythonで同じダウンロードを行い、結果の比較をしたいと思います。ダウンロードはWEBメールの添付ファイルが最初の目的でしたが、Slack や Facebook Cybozu 等、現在はPHPのコードで大体可能です。この話を聞いた某編集者がハッキングだと言われましたが、普通に自分でログインしてダウンロードするのと基本的に変わりませんので、堂々とやって良い処理です。以下、PHPだと selenium-webdriverを利用する事になる訳で、今になりPythonの場合と比較して複雑に感じます。PHPで動かす場合には次の記事を参考にさせていただきました。この記事にあるように準備が色々とあります。「[seleniumを使ってPHPでChromeの自動操作をする](https://qiita.com/Rasukarusan/items/0ca204d5b0f0fb876252)」その準備を終えて、seleniumを起動します。
######１．PHP編（seleniumの起動）

```

java -jar selenium-server-standalone.jar &
```

######２．PHP編（実際にログインしダウンロードまで行きます）
このコード、一部意図的では無い部分があります。結果的に試行錯誤して上手くログインしてダウンロード出来たので採用したコードで、例えばスクリーンショットも不要ですが、撮るとダウンロード出来たのでそのまま残したものです。PHPでseleniumは以外に大変なのかもしれません。これからPythonで同じ事をやるとどうなるか楽しみですが、Pythonの場合もseleniumのインストールを別途やらなくてはならないので、同じ環境でやって良いものか気になります。

``` download.php
require_once './vendor/autoload.php';

use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\WebDriverExpectedCondition;
use Facebook\WebDriver\WebDriverBy;

// ダウンロードしたchromedriverのパスを指定
$screenPath = $relative.'/g_screenshot.png';
$driverPath = '/usr/local/bin/chromedriver';
putenv("webdriver.chrome.driver=" . $driverPath);
// Chromeを起動するときのオプション指定用
$options = new ChromeOptions();
// ヘッドレスで起動するように指定
$options->addArguments([
'--no-sandbox',
'--headless',    // ヘッドレスで起動するように指定。ダウンロードフォルダ指定が無効になる。
'--disable-gpu',    // ヘッドレスで暫定的に必要なフラグ
'--ignore-certificate-errors',  // SSLセキュリティ証明書のエラーページ（「このサイトのセキュリティ証明書は信頼できません」のページ）を表示しません。
]);
$caps = DesiredCapabilities::chrome();
$caps->setCapability(ChromeOptions::CAPABILITY, $options);
$driver = ChromeDriver::start($caps, null, 1000*60*5, 1000*60*10);
$path = dirname(__FILE__).'/data'; # ダウンロードされるWEBサーバーのパス（このプログラムからのパス）
$this->setDownloadDir($driver, $path);
$driver->manage()->window()->maximize();

// 仮想ログイン、$atarget はダウンロードするファイルのリンク
$driver->get($wtarget); # このリンク先のファイルがダウンロードされます。
$element = $driver->findElement(WebDriverBy::name('username'));
$element->sendKeys($wuser);
$element = $driver->findElement(WebDriverBy::name('password'));
$element->sendKeys($wpass);
$element->submit();
$driver->manage()->timeouts()->implicitlyWait(5);
$driver->takeScreenshot($screenPath);
//$driver->manage()->getCookies();
// 仮想ログイン完了
```
######３．PHPで構築した環境で from selenium import webdriver が動作しない
この問題ですが、
Python 3.7.5 (default, Nov  1 2019, 19:15:52) では未だにエラーになっているのですが、もう一つの 
Python 2.7.17 (default, Oct 25 2019, 10:08:31) ではすんなり動きます。二つの環境がそれぞれ呼び出すモジュールの関係なのでしょう。

``` webdriver.py

# 限りなく自分用のメモです。
from selenium import webdriver # from <module> import <driver>
# ImportError: cannot import name 'webdriver' from 'selenium' (unknown location)
```
ほぼパスの問題だと思いますが、Python 3.7.5 はエラーのままになっています。
######４．google-chrome と chromedriver のバージョンの問題かもしれない
selenium をPHPで動かし出した時期にPythoのサンプルでテストをしていたのですが、その時期には動いていたPythonのサンプルがwebdriverを読み込んだ時点で止まります。そのエラーは google-chrome のバージョンと chromedriver のバージョンを示していて、クラッシュしている雰囲気なのです。PHPについては現在実装されている google-chrome と chromedriver を変えると逆に google-chrome がクラッシュします。この関係は何か理由がありそうなのです。少々悩みます。
cronとrtcwakeでLinuxの自動起動及び自動シャットダウン

# 概要
Ubuntuで録画サーバを動かしていると電気代がバカにならないので、
使わない時間帯(自分の場合は3時～20時)に合わせて、自動起動と自動シャットダウンができるようにしてみた。

今回は以下の2つのコマンドを使います。
#crontab -e
```
分(0-59)　時(0-23)　日(1-31)　月(1-12)　曜日(0-7) コマンド
```
*でワイルドカード指定が可能
#rtcwake
```
sudo rtcwake -m [モード] -s [復帰までの秒数]
```
-m off シャットダウン
-m disk 休止
-m mem サスペンド
#設定
今回はcronでrtcwakeコマンドをスケジュール実行させました。

```
# 3時にシャットダウンし、20時に起動させる場合
0 3 * * * sudo rtcwake -m off -s 61200
```
pythonでgifの可視化/読み込み/書き込み + 高速化【OpenCV】

完全にメモです。。
職業柄よく使う気がして(?)

# 読み込み

## scikit-video バージョン

- 安全策ならこう

```python
from skvideo.io import vread
gif = vread("sample.gif")
# print(gif.shape) # => (例): (21, 600, 600, 3)
```

- でもこれは遅いので↓のほうがいいと思う

## OpenCV バージョン

- 速い

```python
import cv2
import numpy as np

# faster than `vread` in `skvideo.io`
def vread(path, T=30):
    cap = cv2.VideoCapture(path)
    gif = [cap.read()[1][...,::-1] for i in range(T)]
    gif = np.array(gif)
    cap.release()
    return gif

gif = vread("sample.gif", T=21)
# print(gif.shape) # => (例): (21, 600, 600, 3)
```

- フレーム数は与えてあげないといけないのだけが難点。

- フレーム数与えない(リスト内容表記じゃない)普通の書き方の例↓

```python
import cv2

filepath = "data/raw/GH010005-0.mp4"
cap = cv2.VideoCapture(filepath)

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret:
        cv2.imshow("Frame", frame)
        cv2.waitKey(1)
    else:
        cap.release()
cv2.destroyAllWindows()
```

# 表示

## ウィンドウ表示

```python
import cv2
cv2.namedWindow("frame", cv2.WINDOW_NORMAL)

for t in range(len(gif)):
    cv2.imshow("frame", gif[t])
    cv2.waitKey(50) # 少しだけ待たないと表示されない

cv2.destroyAllWindows()
```

![output (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188173/f5e306d3-a0bd-8492-c352-8eb1e21f3ddd.gif)

## jupyter上での表示

```python
import matplotlib.pyplot as plt
%matplotlib inline

plt.figure(figsize=(21,9))
for t in range(21):
    plt.subplot(3,7,t+1)
    plt.imshow(gif[t])
plt.show()
```

![Screenshot from 2019-11-24 20-56-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188173/0b83a012-9d2f-f30b-d3da-8b421f5db551.png)

# 書き込み

```python
import moviepy.editor as mpy
def npy_to_gif(npy, filename):
    clip = mpy.ImageSequenceClip(list(npy), fps=10)
    clip.write_gif(filename)
```

# (読み込み時間の比較)

- OpenCVの勝ち！

![Screenshot from 2019-11-24 21-02-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188173/dbed6979-f09a-d590-6cc3-261d587e424a.png)


# 以上！

(gifはここから拝借しました https://miro.medium.com/max/1200/1*LnQ5sRu-tJmlvRWmDsdSvw.gif)
【検定論】片側検定問題の一様最強力検定

# 背景
前回（[【検定論】ネイマン・ピアソンの補題を数値実験で確認する](https://qiita.com/jajagacchi/items/86e2d71e9a76b5448ac2)）は単純仮説の最強力検定について確認しましたが、片側検定においても同様の考え方で一様最強力検定を構成出来るそうです。数値実験で確認してみます。

# どのように検定すればよいか
考える問題は$H_0:\theta\leq\theta_0,\;H_1:\theta>\theta_0$です。$\theta_1<\theta_2$となるふたつの値を考えます。尤度比を考え、
$$
f(x,\theta_2)/f(x,\theta_1) = g(T,\theta_1,\theta_2)
$$
と書け、さらにこれが$T$について単調増加であるとき、尤度比の値ではなく$T$の値を用いてネイマン・ピアソンの補題と同様の検定を行うことで一様最強力検定を行うことが出来ます。$T$は必ずしも十分統計量である必要はありませんが、十分統計量であれば分解定理よりこの式の形に書けることは保証されます。

# 数値実験
ポアソン分布から値をふたつサンプリングする場合を考えます。$T$として十分統計量$t=x_0+x_1$を考えます。尤度比は
$$
\frac{e^{-2\lambda_1}}{e^{-2\lambda_0}}\left(\frac{\lambda_1}{\lambda_0}\right)^t
$$
となり、$t$の関数として書けます。さらに$\lambda_1>\lambda_0$ですので$t$について単調増加関数となっています。
検定はある値$c$を用意し、$T>c$であれば棄却します。有意水準を$\alpha$とすると、
$$
P_{\lambda\leq\lambda_0}(t>c) \leq \alpha
$$
が成立する必要があります。$\lambda_0$以下の全範囲について有意水準$\alpha$以下を満たす必要がありますが、明らかに$\lambda=\lambda_0$のとき$\alpha$以下であればそのほかの範囲は自動的に有意水準の条件を満たします。
ここでは$\lambda_0=3,\alpha=0.1$としてみます。後の流れは前回と同じなので、細かい話は省略します。例によって、離散分布の場合は一般に確率化が必要となります。最初にコードを示します。

```c++
#include <iostream>
#include <fstream>
#include <random>
#include <vector>

int factorial(int k)
{
	int ret = 1;
	for (int i = 1; i <= k; i++)
	{
		ret *= i;
	}
	return ret;
}

int main(int argc, char **argv)
{
	std::mt19937 mt(0);
	double lambda = atof(argv[1]);
	double lambda0 = 3;
	std::poisson_distribution<int> poi(lambda);
	std::poisson_distribution<int> poi0(lambda0);

	int N = 10;
	std::vector<double> pt(N);
	double sum = 0;
	double alpha = 0.1, beta;
	int c = 9;
	for (int t = 0; t < N; t++)
	{
		pt[t] = 0;
		for (int x0 = 0; x0 <= t; x0++)
		{
			pt[t] += pow(lambda0, t) * exp(-2 * lambda0) / factorial(x0) / factorial(t - x0);
		}
		sum += pt[t];
//		std::cout << "t > " << t << " : " << 1 - sum << std::endl;
		if (t == c) beta = alpha - (1 - sum);
	}
	double r = beta / pt[c];

	std::uniform_real_distribution<> u(0, 1);
	int reject = 0;
	int Iter = 100000;
	for (int iter = 0; iter < Iter; iter++)
	{
		int x0 = poi(mt);
		int x1 = poi(mt);
		int t = x0 + x1;
		if (t > c) reject++;
		else if (t == c)
		{
			if (u(mt) < r) reject++;
		}
	}
	std::cout << lambda << " " << reject / (double)Iter << std::endl;;
	return 0;
}
```
最初に有意水準が10%以下となっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/068c6126-6609-38dd-f79c-a347b21421e3.png)
確かに条件を満たしています。次は検出力を、確率化をした場合としない場合で比較してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/7304f763-68a9-058b-79d8-64ddcc74e8ca.png)
確率化をした場合の方が一様に検出力が高いことがわかります。

# 感想
片側検定においても尤度比が重要な役割を果たすんですね。
nvmでdefaultバージョンを設定してもsystemのnodeが使用されてしまう

nvmでnodeのバージョン管理をしたいのだが、`nvm alias default v*.*.*`でデフォルトのバージョンを設定しても、新しいターミナルを開くとsystemのnode(brewでインストールしたnode)が使用されてしまう問題が起こった。
`nvm ls`を実行するとdefaultではなく、systemを指してしまうのだ。

```
$ nvm ls
       v12.13.1
->       system
default -> lts/* (-> v12.13.1)
node -> stable (-> v12.13.1) (default)
stable -> 12.13 (-> v12.13.1) (default)
```

## 実行環境
macOS 10.14.6
nvm 0.35.1(node v12.13.1をインストール済み)
brewでインストールしたnode v13.1.0

## 原因
もともと、yarnをbrewでインストールした時にnodeが一緒にインストールされてしまい、それがターミナルを開くとnvmでインストールしたnodeより優先されていた。
(ちなみにbrewでyarnを入れた理由は、yarnの公式に[npmでyarnをインストールするのはお勧めしない](https://yarnpkg.com/ja/docs/install#alternatives-stable)ということが書いてあるため。)

## 解決方法

調べてみると、[ここ](https://github.com/nvm-sh/nvm/issues/1184#issuecomment-460701361)に解決方法があった。

どうやら、下記コマンドでbrewからyarnをアンインストールせずに、nodeだけをアンインストールできるようだ。

```
brew uninstall node --ignore-dependencies
```

上記実行後、新しいターミナルを開くと無事nvmのdefaultのnodeバージョンを使うことができるようになった。

```
$ node -v
v12.13.1
```

```
$ nvm ls
->     v12.13.1
default -> lts/* (-> v12.13.1)
node -> stable (-> v12.13.1) (default)
stable -> 12.13 (-> v12.13.1) (default)
```

なお、参考ページの別のコメントに、`.bash_profile`や`.bashrc`などでnvmを読み込んだ後に`$PATH`を変更していることが原因の場合もあるとの指摘もあったので、この記事の方法で解決できない場合はそちらも確認してみると良いかもしれない。
定数(Rustの基本構文-4-)

#はじめに
Rustの基本的な文法についてまとめてみた。第4回！
第2,3回は変数(let文)についてだったので今回は「__定数__」について。
###目的
Rustにおける基本的な構文の理解をする。

#Rustの基本構文シリーズ
第1回⇒[Rustの基本構文(1)](https://qiita.com/jin237/items/b344d3a7e6dfe1056e31)　　URL：https://qiita.com/jin237/items/b344d3a7e6dfe1056e31
第2回⇒[Rustの基本構文(2)](https://qiita.com/jin237/items/6910b4f803a35f317213)　　URL:https://qiita.com/jin237/items/6910b4f803a35f317213
第3回⇒[Rustの基本構文(3)](https://qiita.com/jin237/items/59ef229a4de30cb8203b)　　URL：https://qiita.com/jin237/items/59ef229a4de30cb8203b

#定数
let文では変数の定義ができたが、今回は「__const文では定数の定義ができる__」ということである。

文の形は、

```
const 名前: 型 = 定数式；
```
のようにかく。
例を引用してくる。(from 実践Rust入門　言語仕様から開発手法まで P.227-例5)

```rust
const SECRET_NUMBER: i32 = 25;
```
定数についてはそこまで説明することもない。コンパイル時に一度計算され、それを参照している場所に値が埋め込まれる。

#スタティック変数
スタティック変数の特徴
・変数の型の明示。
・グローバルスコープを含む、どのスコープにでも置くことができる。
・定義するときに使う定数式にはコンパイル時に値が確定するものしか使うことができない。
さらには、__mut__を使うことによって、ミュータブルにすることもできる。
例を引用してくる。(from 実践Rust入門　言語仕様から開発手法まで P.228-例7)

```rust
//例7
//定義に使う値はコンパイル時に値が確定するものでないといけない
static mut v: Option<Vec<i32>>=None;
//ミュータブルなスタティック変数を扱うときは代入も参照もunsafeブロックの中で行わないといけない
unsafe{
  //代入するときはコンパイル時に値が確定するものでなくてもよい。
  v = Some(vec![1, 2, 3]);
  println!("{:?}", v);
}
```

#さいごに
定数、変数以外にもスタティック変数がある。これは使い道の幅が増えるし、処理も早くなるのもわかる。
基本構文シリーズでは次に計算系(演算子など)や、分岐(ifなど)、繰り返し(loopなど)についても書いていって大まかなコード内容の整理を書いていく。
加速度センサーの使い方

# 加速度センサーとは

加速度センサーとは、その名の通りセンサー本体が動いた時の加速度を測ることができます。

今回は秋月電子の[**ＭＭＡ８４５２Ｑ使用３軸加速度センサーモジュールキット**](http://akizukidenshi.com/catalog/g/gK-12069/)を使います。

秋月電子で一番安い加速度センサーです。

# 配線
![MMA8452Q_ブレッドボード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299406/7bffd6ef-7548-0e4c-5b2a-f113c03bea3d.jpeg)

上のようにします。

名前がSCA1000となっていますが気にしないでください（~~今回使っているセンサーがfritzingにありませんでした~~）。基板に3.3VとかいてあるところをArduinoの3.3Vに、GNDをGNDに、SDAとSCLをA4とA5につなげればOKです。

# プログラム

秋月電子の[取扱説明書](http://akizukidenshi.com/download/ds/akizuki/ae-mma8452.pdf)にサンプルプログラムが載っているのでそれをそのまま使います。

```c++
// I2C を使用するのに必要です。 
#include <Wire.h>

// MMA8452のI2Cスレーブアドレスを設定します。
// 基板ジャンパSJ1が未接続(デフォルト)なら0x1D、はんだで接続したら 0x1Cです。
#define MMA8452_ADRS 0x1D

// MMA8452の内部レジスタアクセスと加速度算出に使う定数です。 
#define MMA8452_OUT_X_MSB 0x01
#define MMA8452_XYZ_DATA_CFG 0x0E
#define MMA8452_CTRL_REG1 0x2A
#define MMA8452_CTRL_REG1_ACTV_BIT 0x01 
#define MMA8452_G_SCALE 2 　

void setup() {
  byte tmp;

  // UARTのボーレートは、38400bpsに設定します。
  Serial.begin(38400);
  Wire.begin();

  // MMA8452の内部レジスタを設定します。
  tmp = MMA8452_ReadByte(MMA8452_CTRL_REG1); MMA8452_WriteByte(MMA8452_CTRL_REG1, tmp &
~(MMA8452_CTRL_REG1_ACTV_BIT));
  MMA8452_WriteByte(MMA8452_XYZ_DATA_CFG, (MMA8452_G_SCALE >> 2));

  tmp = MMA8452_ReadByte(MMA8452_CTRL_REG1);
  MMA8452_WriteByte(MMA8452_CTRL_REG1, tmp | MMA8452_CTRL_REG1_ACTV_BIT);
}

void loop() {
  byte buf[6]; float g[3];

  // MMA8452の内部レジスタにある測定値を読み込みます。
  // X: g[0], Y: g[1], Z: g[2] に対応します。 
  MMA8452_ReadByteArray(MMA8452_OUT_X_MSB, 6, buf);
  g[0]=-(float((int((buf[0] << 8) | buf[1]) >> 4))/((1 << 11) /
MMA8452_G_SCALE));
  g[1]=-(float((int((buf[2] << 8) | buf[3]) >> 4))/((1 << 11) /
MMA8452_G_SCALE));
  g[2]=-(float((int((buf[4] << 8) | buf[5]) >> 4))/((1 << 11) /
MMA8452_G_SCALE));

  // 測定値をタブで区切ってUARTに出力します。
  // このようにすることで、Arduino IDEのシリアルプロッタでグラフ 表示ができます。
  Serial.print(g[0], 4);
  Serial.print("\t");
  Serial.print(g[1], 4);
  Serial.print("\t");
  Serial.print(g[2], 4);
  Serial.println("\t");
  delay(10);
}

void MMA8452_ReadByteArray(byte adrs, int datlen, byte * dest)
{
  Wire.beginTransmission(MMA8452_ADRS);
  Wire.write(adrs);
  Wire.endTransmission(false);
  Wire.requestFrom(MMA8452_ADRS, datlen);
  while(Wire.available() < datlen);
  for(int x = 0 ; x < datlen ; x++){
    dest[x] = Wire.read();
  }
}

byte MMA8452_ReadByte(byte adrs) {
  Wire.beginTransmission(MMA8452_ADRS);
  Wire.write(adrs); 
  Wire.endTransmission(false);
  Wire.requestFrom(MMA8452_ADRS, 1)
  while(!Wire.available());
  return(Wire.read());
}

void MMA8452_WriteByte(byte adrs, byte dat) {
  Wire.beginTransmission(MMA8452_ADRS); 
  Wire.write(adrs);
  Wire.write(dat);
  Wire.endTransmission();
}
```

#  グラフを見る

ArduinoIDEから書き込みます。

この時、`ツール＞シリアルプロッタ`を起動すると、センサーの値をArduinoIDEからグラフで見ることができます。

# 最後に

最後まで読んでくださりありがとうございました。

何か不備などがありましたら、コメントで教えてください。
Rustを最速で試す方法 (Rust Playground)

今更ながら[Rust Playground](https://play.rust-lang.org/)の紹介

# とにかくRustを試す
1. Webブラウザで https://play.rust-lang.org/ にアクセスする。
2. 初めてアクセスしたならすでにHello Worldプログラムが記入されている。編集可能なエディタになっているので、変更したいなら変更する。
3. 左上の"Run"というボタンをクリックする。
4. 実行結果が表示される。コードを変更していなければ、ビルド時のメッセージと「Hello, world!」が表示される。

# 解説

見ればわかると思いますが、Rust Playgroundはブラウザ上でRustのコードを編集・ビルド・実行できるサービスです。ローカル環境にRustの開発環境をインストールすることなくコードが実行できるので、とりあえずRustを試しに書いてみたい方におすすめです。

# 機能

初心者だけでなく、習熟したRustプログラマにもありがたい機能が複数あります。

## 標準以外のクレート

エディタで`use 〜`や`extern crate 〜`と入力すると、補完が働いてインポートしたいクレートが表示されます。ここに表示されるクレートは実際に使うことができます。Rustで何か書く時はたいてい標準以外のクレートを使うことになるので、これらを試せるのはありがたいです。

![p01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182229/808f6b81-8097-9a2b-c30b-4269ed50b74a.png)

[プロジェクトのREADME](https://github.com/integer32llc/rust-playground)によると、人気(ダウンロード数)Top100のクレート、[Rust Cookbook](https://rust-lang-nursery.github.io/rust-cookbook/)で扱っているクレート、そしてそれらが依存するクレートが利用可能とのことです。

## Nightlyを使える

左上のメニューに「STABLE」と書かれているところがありますが、ここをクリックしてNightlyを選択しましょう。お手軽にRustのNightly環境が使えます。Rustの不安定な機能はNightlyでしか試せません。そのため、ローカルにStableしか入れていない人にとっては、お手軽にRustの新機能をいち早く試せる方法となります。

## コードを共有

右上の「SHARE」ボタンを押すと、自分がエディタに入力した内容を保持したRust Playgroundへのリンクが生成されます。[こんな感じです。](https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20println!(%22My%20super%20example!%22)%3B%0A%7D) 簡単にコードを共有でき、共有相手がその場ですぐ実行することができます。URLにコードを書き込む形式か、Gistへアップロードされたコードを参照する形式のどちらかを選べます。

## その他細かい機能

* 「RUN」ボタン右のメニューから、cargo testやアセンブリ出力等などを実行するよう変更できる
* メニューからDebug/Releaseを切り替え可能
* リリースチャンネル変更ボタンの右メニューから、エディションやバックトレースの有無が変更できる
* 「TOOLS」メニューからRustfmt等のツールを使うことができる
* 「CONFIG」メニューからエディタのテーマ等を変更できる

# 制限

ネットワーク機能は利用できず、またメモリ等のリソースもある程度制限されるようです。また複数のソースファイルを扱うことはできません。