OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu 20.04 LTSでWacomペンタブのキー設定

# ペンタブの列挙
```bash
$ xsetwacom --list devices
Wacom Intuos BT M Pad pad       	id: 11	type: PAD       
Wacom Intuos BT M Pen stylus    	id: 12	type: STYLUS
```

# 設定の確認
```bash
$ xsetwacom --get "Wacom Intuos BT M Pen stylus" all
Option "Area" "0 0 21600 13500"
Button: Actions are not supported by xorg.conf. Try shell format (-s) instead.
Button: Actions are not supported by xorg.conf. Try shell format (-s) instead.
Button: Actions are not supported by xorg.conf. Try shell format (-s) instead.
Button: Actions are not supported by xorg.conf. Try shell format (-s) instead.
......
```
出力されてますが、ボタンの設定は--shell(-s)オプションをつけると表示されます。

```bash
$ xsetwacom -s --get "Wacom Intuos BT M Pen stylus" all
xsetwacom set "Wacom Intuos BT M Pen stylus" "Area" "0 0 21600 13500"
xsetwacom set "Wacom Intuos BT M Pen stylus" "Button" "1" "button +1 "
xsetwacom set "Wacom Intuos BT M Pen stylus" "Button" "2" "button +2 "
xsetwacom set "Wacom Intuos BT M Pen stylus" "Button" "3" "button +3 "
xsetwacom set "Wacom Intuos BT M Pen stylus" "Button" "8" "button +8 "
......
```

ボタンの設定は``$ xsetwacom set DeviceName "Button" button-number mapping``で設定できます。
manでも確認できます。manで確認してください。

ここからが本題です。
__ペンタブを再接続するとこの設定は初期化されます。__

# 設定の自動化
udevを使ってシェルスクリプトを実行します。ただし、ちょっと工夫します。
[こちら](https://mattintosh.hatenablog.com/entry/20171106/1509897385)の記事にもあるとおり、単にudevルールのRUNでコマンドを実行しても、そのタイミングではまだペンタブは接続されていないので設定は適用されません。sleepをしてもRUNの内容が完了するまで接続が完了しないので無効です。そこで、シェルスクリプトをバックグラウンドで実行し、その中でsleepすることで接続の完了を待ちます。

ここに書いてありました(笑)
https://unix.stackexchange.com/questions/65788/why-doesnt-xsetwacom-work-from-udev
日本語で解説してる記事がないので書いておこうと思います。

```bash:/etc/udev/rules.d/90-wacom.conf
ACTION=="add", SUBSYSTEMS=="input", ATTRS{name}=="Wacom Intuos BT M Pen", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/run/user/1000/gdm/Xauthority", RUN+="/usr/local/bin/wacom.sh"
```

```bash:/usr/local/bin/wacom.sh
#!/usr/bin/env bash
/usr/local/bin/wacom-post.sh &
```

```bash:/usr/local/bin/wacom-post.sh
#!/usr/bin/env bash
/usr/bin/sleep 2
export XAUTHORITY=/run/user/1000/gdm/Xauthority
export DISPLAY=:0
/usr/bin/xsetwacom --set "Wacom Intuos BT M Pen stylus" Button 2 key "ctrl z"
```

ここでは、ペンのキーにCtrl+Zを設定しています。
Ubuntuの設定からもペンのキーマッピングを指定できますが、マウスのボタンや戻る、進むくらいしか設定できないので。
Windows 10 で neovim(or vim8 or later) で標準パッケージマネージャでぺろっとプラグインを入れる

## 背景

* Linux で (n)vim 使いである
* Windows 10 でも, Windows ネイティブの vim を使う必要が出てきている
  * ほかの Windows アプリが生成したデータ大きめのファイルを編集したいとか. 
  * WSL とか, Microsoft Terminal や msys とかで vim 動かすだと遅くて使い物にならないとか
* (n)vim は標準設定で, git-fugitive とか  NERDTree とかのプラグインが(標準設定で)使えればい
  * 設定やカスタマイズに一営業日とかかける余裕はないので, ぺろっと 10 分くらいで環境設定終わらせたい.
  * dein とか Pathogen とかプラグインマネージャとかいらない. 標準設定の状態で plugin が(標準設定のままで)使えればよい
* git for WIndows などで git コマンドが使えるものとします(プラグインインストール用)

vim8(neovim 含む)から搭載された標準パッケージマネージャを使います.

https://shapeshed.com/vim-packages/

## とりあえず手っ取り早く結果知りたい人用

```
git clone https://github.com/preservim/nerdtree ~/AppLocal/Local/nvim/pack/vendor/start/nerdtree
```

と, `~/AppLocal/Local/nvim/pack/vendor/start/<pluginname>` に vim プラグインを git clone でいけます!

## neovim

https://neovim.io/

Chocolatery なりでインストールしておくとします.

neovim-qt, nvim どちらでも設定は同じです.

## A VIM packages

標準のパッケージマネージャはその名も A VIM packages なので名称がよくないです(検索にほぼ出てこない) :cry:

Windows 10 だと, アプリの設定ファイルはだいたい `~/AppLocal/` に配置されます.(`%LOCALAPPDATA%` 環境変数で設定されているフォルダパス)

`:h packages` でヘルプが出ますが, **ヘルプドキュメントは Linux 環境を想定していますのでそのまま `~/.local` とかにプラグインのファイルを入れても nvim が読み込んでくれないので注意です!** :warning: 

実際のパッケージのパスは

`set pp`(or `set packpath`)で確認できます. こちらの Windows 10 で nvim の標準では,

```
packpath=~\AppData\Local\nvim,~\AppData\Local\nvim-data\site,C:\tools\neovim\Neovim\share\nvim\runtime,~\AppData\Local\nvim-data\site\after,~\AppData\Local\nvim\after  
```

と出ました. 

### スターアップ時にプラグインを自動ロードする

起動時に, `packpath` + `pack/*/start/` と, `start` というフォルダ名が含まれているフォルダがスキャンされます. pack のあとのフォルダ名は任意ですが, `vendor` がよくつかわれるようです.


たとえば, NerdTree をインストールするには,

```
git clone https://github.com/preservim/nerdtree ~/AppLocal/Local/nvim/pack/vendor/start/nerdtree
```

とします. git clone する場合は git がよろしくフォルダ(`pack/vendor/strart/nedtree`)を作ってくれます.

あとは nvim(or vim8)起動すれば `:NERDTree` コマンドがよろしく使えます!

### 手動でパッケージ追加

`pack/*/opt` にあるののは, 自動ロードされずに手動でパッケージ追加する必要があります.

`packadd <packagename>` でいけるようであるが...(opt にあるパッケージの利用方法は未検証)


## その他

nvim の設定ファイルは `~/AppLocal/Local/nvim/init.vim` になります.
(`:CheckHealth` で設定ファイルのパスを確認できます)
【Swift】カメラロールから取得した動画サムネイルの画質が悪い時・向きがおかしい時

# 環境

Swift5
Xcode11.6

# 起こったこと

カメラロールから動画を選択する画面の実装をしていた時。
動画のプレビュー画像の画質がなぜか荒い。

リソースの取得は`PHImageManager`で行っていた。

# 見直すべき点その１

リソースの取得時に画質の設定を行う。
ググると一番よく出てくる対策。

```swift
let phImageManager = PHImageManager()
let assets = PHAsset.fetchAssets(with: .video, options: nil)

// クオリティを指定する
let options = PHVideoRequestOptions()
options.deliveryMode = .highQualityFormat

assets.enumerateObjects({ obj, index, stop in
    phImageManager.requestPlayerItem(
        forVideo: assets[index],
        options: options,  // 設定を与える
        resultHandler: { playerItem, info in
            ...
        })
})
                
```

自分の場合はこれが原因ではなかった。

# 見直すべき点その２

動画からブレビュー画像を生成時に画質が落ちていないか？

```swift

let item: AVPlayerItem = ... // その１でPHImageManagerを利用して取得したもの
let asset:AVAsset = item.asset
let gene = AVAssetImageGenerator(asset:asset)
gene.appliesPreferredTrackTransform = true
gene.maximumSize = CGSize(width: ..., height: ...) // これが原因だった！
let capImg = try! gene.copyCGImage(at: CMTime.zero, actualTime: nil)
```

`gene.maximumSize`で指定したサイズが小さかった（実際に表示するビューと同じ大きさにしていた）のが原因でした。
この一行を取り除くと見事、綺麗な画質のプレビューが取得できました〜

# プレビュー画像の向きがおかしい時

```swift
gene.appliesPreferredTrackTransform = true
```

の一行を忘れないように！
Fortran ファイル入力での行読み飛ばし

シーケンシャル・ファイルからデータを読み込む時、不要な行を読み飛ばすのには、空の READ 文で十分です。（かつそのほうが速いはずです）

# ファイル入力読み飛ばし
Fortran のプログラム質問サイトなどを見ていますと、ファイルからデータを読み込む時、不要な行を読み飛ばすのにダミー変数への入力などをしている例が多く見受けられます。しかし、実は読み込み変数を何も書かない空っぽの READ 文だけで次の行に飛んでくれます。

書式付きの場合は、ダミー読み込みのための書式変換が要らず改行を探すだけになるため負荷が軽くなります。

書式なしの場合は（普通は）行頭と行末にレコード長が埋め込まれているので次の行まで飛ばして行けます。なお行末にもレコード長が埋め込まれているのは BACKSPACE 文で逆戻りするためで、順方向にも逆方向にも同じ感じで行をスキップして進んで行けるようになっています。

## 例
以下で書式なしの場合について実際の例を見てみます。

ここではまずウォーミングアップに 100 要素の実数配列を 1 行に一気に書き出します。ファイルを rewind 文で巻き戻した後、一気に 100 個のデータを読み込みます。またファイルを巻き戻して、1 行につき 1 個のデータを書き出してゆきます。

次に BACKSPACE 文で 1 行づつ 50 行ばかり逆戻りしてゆきます。そこからまたファイルの最後まで行を読み飛ばしながら行数を数えてゆきます。

ファイル末まで来たのは iostat 調べますが、EOF (end of file) を表す数が iso_fortran_env の中に iostat_end として定義されるようになったので (f08) これを用いてみました。（伝統的に Fortran では EOF を表す数は -1 になっているので、わざわざ無理しなくてもいいんですが。忘れてましたが is_iostat_end() という関数もありました。f08）

```fortran
    program IOtest
        use, intrinsic :: iso_fortran_env, only : iostat_end
        implicit none
        real :: x(100), y(100)
        integer :: i, k, io, ipos
        
        forall(i = 1:100) x(i) = real(i)
        write(9) x
        rewind(9)
        
        read(9) y
        rewind(9)
        
        
        rewind(9)
        do i = 1, 100
            write(9) y(i)
        end do

        do i = 1, 50
            backspace(9)
        end do
            
        k = 0
        do 
            read(9, iostat = io) 
            if (io == iostat_end) exit
            k = k + 1
        end do
        print *, 'number of data', k
    end program IOtest
```

## 実行結果
100 行のデータを書き込んだ後、backspace 文 50 回で 50 行逆戻りしたので、そこから end_of_file まで行を読み飛ばしてゆくと、当然データ数は 50 行分になります。

```
 number of data          50
```

## おまけ
書式なしフォーマットの内部。

規格で規定されているわけではないけれども、一般に Fortran の書式なしのシーケンシャル・ファイル（順並びファイル）は、各行に対応するレコードの前後に、レコード長が書き込まれています。（最近では 4 バイト整数値で）

前後に書き込まれているのは、空の READ 文や BACKSPACE 文で順方向・逆方向に素早くデータを読み飛ばしてヘッドを動かすためだと思われます。

READ - BACKSPACE と順方向と逆方向で命令が対称になっていないのは歴史的な理由でご愛嬌ｗ

```fortran
    program IOtest2
        implicit none
        integer :: i, k, ix(3)

        forall(i = 1:3) ix(i) = i
        write(9) ix

        do i = 1, 3
            write(9) ix(i)
        end do    
        close(9)

        open(9, access = 'stream')
        do 
            read(9, end = 99) k 
            print *, k
        end do
99      continue

    end program IOtest2
```

### 実行結果　intel fortran 調べ

４バイト整数の要素３の配列と、４バイト整数が３個書き出されているので、以下の様な４バイト整数値がファイルに書き込まれている。

12byte 1, 2, 3 12byte
 4byte 1 4byte
 4byte 2 4byte
 4byte 3 4byte
　

```
          12
           1
           2
           3
          12
           4
           1
           4
           4
           2
           4
           4
           3
           4
```
Ruby on RailsにおけるServiceクラスのススメ

こんにちは、@hairgaiです。
今回は、賛否両論あるServiceクラスについての自分的な使い方を書いていこうと思います。

## Serviceクラスとは
DDD（ドメイン駆動設計）でのサービスから派生している（と勝手に認識している）、ある一つの機能を記述するクラス郡です。
詳しくは説明している人がたくさんいらっしゃるので割愛しますが、ビジネスロジックをモデルとコントローラーの中間でキレイに書けるので、僕はよく使っています。
今回は（僕の使い方は間違ってるかもしれませんが）、自分的な使い方及びそのメリットと思われる部分を書いていきます。

## 基本的な使い方
まず、基本的な使い方を、コード例と共に紹介しようかなと思います。（これが正解かどうかは正直わかりませんが、見やすいのでいいかなと思ってます）
例えば、SNSなどで「フォローをする」という機能をService層として1ファイルに記述すると、こんな感じにになるかと思います。
**※重ねていいますが、これが正解とかじゃないです。**

```ruby
class FollowService
  attr_reader :user, :target_user
  attr_accessor :follow

  def initialize(user, target_user)
    @user = user
    @target_user = target_user
  end

  def perform
    check!

    create_follow!
    run_after_worker!
  end

  private

  def check!
    check_following!
    check_blocking!
  end

  def check_following!
    return true unless user.following?(target_user)

    raise ArgumentError, 'User following target user'
  end

  def check_blocking!
    return true unless user.blocking?(target_user)

    raise ArgumentError, 'User blocking target user'
  end

  def create_follow!
    self.follow = user.follows.create!(target_user: target_user)
  end

  def run_after_worker!
    AfterFollowWorker.perform_in(0.2.seconds, follow.id)
  end
end
```

### ピュアなRubyのクラスで作る
基本的に何かGem等を使って作ることは、僕はしていないです。
ピュアRubyでの実装にすることで「実装の理解に対する障壁を下げる」効果を狙っています。
Serviceクラスは（重い機能になると）ロジックが複雑になりがちなので、なるべくシンプルに作成し、誰が見てもすぐに理解できるように心がけています。

### クラス名を定める
命名に好みがあると思いますが、機能を象徴するクラスであるので`[動詞]([目的語])Service`で統一しています。
命名規則をつけることで機能が推論しやすくなるというメリットがあります。

### publicなメソッドはperformのみにする
ここらへんも好みがあると思います（`call`とかにしたりする人も多いです）が、基本的にはpublicなメソッドを一つだけ生やし、それ以外は呼べないものとします。
これは、Serviceクラスは単一の機能を象徴するクラスであり、それを使用することで実現できる機能を単一のものと限定するためです。
この単一のpublicメソッドは結構いろいろな方が言っていますが、僕も設計時点において迷いが全くなくなり実装スピードが格段に上がったので採用しています。

### publicなメソッドで呼ぶのはprivateメソッドのみ
これも見通しが良くなる + 1メソッドごとの責務が軽くなり、ガード節が使いやすくなったりするので採用しています。
ここらへんは好みの分かれるところだと思います。

### 後処理等へのアプローチを単一にする
上のFollowServiceでも書いていますが、業務で使用する以上はユーザさんに対するレスポンスを一番に考えます。
そういった場合のアプローチとしては「1レスポンス中には必要な処理のみを行う」というものがあり、後続処理などはジョブとしてキューに格納し、ジョブサーバ等に処理させることになります。
その際に、ControllerやModel等色々な場所にジョブをコールする処理が散らばると、プロジェクト全体での見通しが悪くなります。

そこで、`HogeService`の後処理のジョブは`AfterHogeJob`にする、というような命名規則にし、Serviceクラスでのみコールするという決まりにすることで、全体の見通しを良くすることができます。

### Controllerの肥大化の解消
言うまでもないですね。

```ruby
class FollowsController < ApplicationController
  def create
    target_user = user.find(params[:target_user_id])
    service = FollowService.new(current_user, target_user)
    service.perform

    redirect_to user_path(target_user)
  end
end
```

### Modelの肥大化の解消
こちらも言うまでもないですね。
Modelに書いていたものを全部Serviceクラスに持っていき、モデルがデータの関連付けやバリデーション、その他単一モデルに関するメソッド等のみになります。
そのため、モデルからロジックの多いメソッドがなくなり、肥大化した見づらいモデルというものがなくなります。

## あとがき
こうして改めて書いてみると、僕は色々と責任をServiceクラスに負わせている書き方をしているんだなぁ、と思います。
Serviceクラスは必要ない、等々議論の余地はあると思いますが、こういった設計等の話はあくまで手法の一つなので、自分たちのビジネスに合わせて適切に使用できると良いですね。
Keynoteの数式環境の中で改行する

# 一行ずつ並べるの、めんどくないですか?

Keynoteの数式環境、便利ですよね。
次のようにaligned環境を使ってやれば...

```
\begin{aligned}
Xe^{+}+Xe &\rightarrow  Xe_{2}^{+}\\
Xe_{2}^{+}+e^{-}&\rightarrow  Xe^{\ast \ast}+Xe\\
Xe^{\ast \ast}&\rightarrow Xe^{\ast}+heat\\
Xe^{\ast}+Xe+Xe &\rightarrow Xe_{2}^{\ast}+Xe\\
Xe^{\ast}_{2}&\rightarrow 2Xe+h\nu
\end{aligned}
```

このように改行&整列した出力を得ることができます。

![Screen Shot 2020-09-08 at 1.05.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277751/1b546198-74ed-d400-0ae2-7ca27a479900.png)

めでたしめでたし。
【Blender2.83】ボーンの親子関係の変更方法

自分用の作業メモです。

１．編集モードにして親子にしたいボーンを複数選択
　※子にしたいボーン→親にしたいボーンの順に選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603125/7171cd6b-433d-d697-fba0-41e07bba9b90.png)

２．右クリック→ペアレント→作成→接続※1orオフセットを維持※2
　※1接続...子のボーンが親のボーンに接続されるように移動する
　※2オフセットを維持...それぞれのボーンが位置を維持する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603125/87aaa24a-8749-48a3-b71f-afc585b92929.png)

３．選択したボーンが親子になる。
VoTTでアノテーションデータを作成する

# 初めに
最近yoloやssdを用いた物体検出を行いました。その際に行ったアノテーションデータの作成方法を記録しておきます。

#使用環境
- ubuntu20.04またはwindows10


# インストール方法(ubuntuの場合)
1. NodeJSとNPMのインストール  
  VoTTにはNodeJS(>= 10.x, Dubnium)とNPMが必要です。まずはこの2つをインストールします。
  [参考](https://www.sejuku.net/blog/84238)から

```bash:install
sudo curl -sL https://deb.nodesource.com/setup_10.x | sudo bash -
sudo apt-get install nodejs
sudo apt install npm
#バージョン確認
nodejs --version
```
を行いインストールしました。

2\. VoTTのインストール
&nbsp;&nbsp;&nbsp; [VoTT公式ページ](https://github.com/microsoft/VoTT#download-and-install-a-release-package-for-your-platform-recommended)通りに行います。

```bash:install_VoTT
cd ~
git clone https://github.com/Microsoft/VoTT.git
#install
cd VoTT
npm ci
   
#起動
cd ~/VoTT
npm start
```

# インストール方法(windows10の場合)
[VoTT公式ページ](https://github.com/Microsoft/VoTT/releases)からexeファイルをダウンロード
exeファイルを実行する

# 使用方法
1. 起動するとブラウザからweb版が開き、アプリケーションのウィンドウがもう一つ開く(つまりウィンドウが二つできる)(ubuntuの場合)。  
  web版ではローカルのファイルが扱えないので今回は使わない。(windowsでは一つしかウィンドウが出ないのでそのまま使う)
1. New Projectを選択
1. display nameを任意に指定する
1. Add Connectionからアノテーションしたいデータがあるフォルダとアノテーション結果を保存したいフォルダを追加する。
1. Source Connectionにアノテーションしたいデータがあるフォルダ、Target Connectionにアノテーション結果を保存したいフォルダを指定する。
1. Video Settingsを指定する(ここをどうするべきかはよくわかっていません。デフォルトの15のままにしました?)
2. 右上のTAGSの+マークから使いたいtagを追加する
3. 範囲を指定してtagを選ぶ   
  ※tagにはそれぞれ0〜9のキーが割り当てられているのでtagの選択はわざわざカーソルを動かさなくてもキーボードで0~9を押すと早い
1. 画像データ分繰り返す
2. 終わったら保存(save project(画面中央あたりの保存アイコン)を押す)する
3. データのエクスポート
  1. 左のexportマークを押す  
  2. exportの設定をする
  5. 画面中央のexport projectを押すとexportされる


 


#参考
[VoTT公式ページ](https://github.com/microsoft/VoTT#download-and-install-a-release-package-for-your-platform-recommended)
[UbuntuにNode.jsを導入する方法3つを目的別に紹介！(18.04LTS)](https://www.sejuku.net/blog/84238)
GoogleMapの下からニュッと出るやつを実装してみた

# はじめに

参考になったのはこちらの２記事でした。

- [iOSのハーフモーダルをAndroidでも実装してみた(Kotlin+BottomSheetBehavior)](https://qiita.com/fumiyakawauso/items/1d0fa27aa508a3e0570a)
- [【Android】GoogleマップアプリのようなBottomSheet（画面下部のメニュー）を作る](https://qiita.com/mmmmk/items/4005836363eace5ca4fb)

# 実装したコードと説明

全量は [こちら](https://github.com/shinya-takano/GoogleMapSample/tree/add_bottom_sheet) に

## ポイント
Google のロゴをスライドに合わせて移動させてます。
（GoogleMap風に..）
xmlではanchorも指定していますが、
anchorは若干マージンの幅がずれたりするので、
onSlideで計算した方が良い感じになります。

計算が手動になりますが、滑らかに動く分計算して実装できるといい感じです。

## 閉じているとき
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/5a1fe291-4206-691c-7ad7-7fcca777a0b1.png" width="50%" />

## 広げたとき
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/224e3c44-3371-8341-71ec-3569904b0405.png" width="50%" />

## MapsActivity.kt

```kotlin
        // CoordinatorLayout の 直下に配置している View を渡す
        bottomSheetBehavior = BottomSheetBehavior.from(findViewById(R.id.bottomSheetLayout))
        bottomSheetBehavior.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
                override fun onSlide(bottomSheet: View, slideOffset: Float) {

                    Log.d("tag", "slideOffset=$slideOffset")

                    // 異常値を弾く
                    if (slideOffset > 1 || slideOffset < -1) {
                        return
                    }

                    val minHeight = 56 // peek_height
                    val slide = 300 - minHeight // 最大の高さから最低の高さを引いたのが移動幅
                    val defaultBottomMargin = 8 // 最低bottomマージン
                    val bottomMargin = (slide * slideOffset + minHeight + defaultBottomMargin).toInt()
                    mMap.setPadding(0 ,0, 0, dp2px(bottomMargin))
                }

                override fun onStateChanged(bottomSheet: View, newState: Int) {

                }
            })
        bottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED
```

## activity_maps.xml

```xml
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="72dp"
        android:layout_marginEnd="16dp"
        android:layout_gravity="top|end"
        android:orientation="vertical"
        app:layout_anchorGravity="top|end"
        app:layout_anchor="@id/bottomSheetLayout">

        <Button
            android:id="@+id/buttonMyHouse"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="自宅" />

        <Button
            android:id="@+id/buttonMyOffice"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="勤務先" />

    </LinearLayout>
```

# 最後に

iOSとandroidでの違いとか部品名が意外とわからない、あとGoogleのアプリ使ってるとできること（できそうなこと）、Googleが提供している部品かどうかがわかるのでやっぱり使い倒すの大事だなと。
論理演算子はboolean以外も返す const = AA || BB みたいなの

[JavaScriptの「&&」「||」について盛大に勘違いをしていた件 - Qiita](https://qiita.com/Imamotty/items/bc659569239379dded55)

```typescript
const _perview = Number($body.getAttribute('data-perview')) || 'auto';
```

えっなにこれ、って思ってた。

`Number($body.getAttribute('data-perview'))`が`true`であれば`Number($body.getAttribute('data-perview'))`を返す。そうでなければ`'auto'`を返す。

そういう使い方出来るのね…if文的な時でしか使えないと思ってたよ本当に…
Microsoft Teamsにメッセージと画像を送る(Node.js)

Teamsのチャンネルに投稿用アカウント(Incoming Webhook)を追加して、
チャンネルにメッセージや画像を投稿する

##1.投稿したいチャンネルにIncoming Webhookを追加

* Teamsの投稿したいチャンネルで右クリックして [コネクタ] を選択
* [incoming Webhook] を検索して [追加] をクリック、次画面で再度 [追加] をクリック
* incoming Webhookの名前とアイコン画像を設定して [作成] をクリック
* Webhook用のURLが表示されるのでコピーして [完了] をクリック


##2.base64にエンコードした画像をメッセージに埋め込んでpostで送信
* node.jsの環境つくり、"fs"と"request"をインストール
* index.jsと同じ階層に画像を準備
* 以下のindex.jsを実行

```javascript:index.js
const fs = require('fs');
const request = require('request');

fs.readFile('画像名.png', 'base64', (date) => {
    let base64date = date;
    let message = "魔法陣ぐるぐる" //画像の上に書きたいメッセージ

    let options = {
        uri: "teamsからコピーしたURL",
        headers: {
            "Content-type": "application/json",
        },
        json: {
            "text": message + "<br>" + "![]" + "(" + base64date + ")"
        }
    };
    request.post(options);  // postリクエスト送信
});

```
<br>

こんな感じで送られる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701179/fd037fd3-3880-4976-b493-2c62d318f64f.png)

##注意

* プライベートチャンネルにはこの方法で送信できない
* 画像サイズが大きすぎると、base64にエンコードしたときに文字列が長過ぎて送れない
２種類の広告介入の効果を分解してみる

１つだとつまらないので、2つのtrendで

１つはt=30から(trend)、もう一つは80から(trend2)。

介入時の情報は広告の目的ならわかるので、trendの一回微分（速度）に対してexp(b*is_start)と入れた。
介入時点は微分不可だが、可能としても別にいい気もしたけど収束しないので・・・

観測変数のsigmaの制限と、事前分布は外したかったけどこれも収束しないのでやむなく。

![a7dc6424-ccb1-45d2-927d-30df92f3e46e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38159/1c6152d2-3a2d-ec98-1df1-2915c54336ec.png)

```r
library(tidyverse)

T=100

z1=c(rep(0,30),seq(0,20,length.out = 70))+2*rnorm(T) #広告1
z2=c(rep(0,80),seq(0,100,length.out = 20))+3*rnorm(T) #広告2

y=z1+z2+3*rnorm(T)

ts.plot(y)

z1_begin=rep(0,T)
z1_begin[30]=1
z2_begin=rep(0,T)
z2_begin[80]=1

df1=data.frame(y=y,T=T,z1,z2)

'''
![a7dc6424-ccb1-45d2-927d-30df92f3e46e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38159/7fdf03fb-9282-34f3-e56e-1a4576be792a.png)

stanコードは以下
```r

scode="
data{
int N;
real y[N];
int arn;
int z1_begin[N];
int z2_begin[N];
}

parameters {
real<upper=15> sigma;
real trend[N];
real<upper=2> s_trend;

real trend2[N];
real<upper=10> s_trend2;

real b1;
real b2;

#real ar[N];
#real c_ar[arn];
#real s_ar;

}

model{
real ssum;
s_trend ~ normal(1,1);
#s_ar ~ normal(1, 1);
trend[1:30]~normal(0,2);
trend2[1:80]~normal(0,2);

for(t in 3:N){
trend[t]~normal(trend[t-1] -exp(b1*z1_begin[t-1])*(trend[t-1]-trend[t-2]),s_trend);
trend2[t]~normal(trend2[t-1] -exp(b2*z2_begin[t-1])*(trend2[t-1]-trend2[t-2]),s_trend2);


}


for(t in 1:N){
    y[t]~normal(trend[t]+trend2[t],sigma);
    #y[t]~normal(trend[t]+ar[t],sigma);
}

}"



library(rstan)
S=1
y=y
N=length(y)
time=1:N
sdat=list(y=y,N=N,z1_begin=z1_begin,z2_begin=z2_begin,
          arn=1)

t2i=rep(0,N)
t2i[80:100]=seq(0,100,length.out = 21)

fit=stan(model_code = scode,data=sdat,
         init=function() { list(#trend=rep(mean(y),N),
                                #trend2=t2i,
                                  
                                ar=rep(0,N)
         )},warmup=1000,iter=2000,chains=1)

trend=get_posterior_mean(fit,par="trend")
trend2=get_posterior_mean(fit,par="trend2")

sigma=get_posterior_mean(fit,par="sigma")
s_trend=get_posterior_mean(fit,par="s_trend")
ar=get_posterior_mean(fit,par="ar")

b=get_posterior_mean(fit,par="b1")
b2=get_posterior_mean(fit,par="b2")

print(sigma)

plot.ts=function(df_plt){
  df_plt=df_plt %>% gather(names(df_plt)[names(df_plt)!="time"],key=variable,value=value)
  df_plt  %>% 
    ggplot(aes(x=time,y=value,colour=variable))+geom_line()
}

df_plt=data_frame(y,trend=trend,trend2=trend2,time)

print(plot.ts(df_plt))

```

上手くいったら、介入時刻の情報無しでやってみます
fitbitのapi連携と集中力判定(PHP,Javascript)

#記事の概要

作成したポートフォリオの解説です。以下をまとめています。

- 背景
- 主な機能
- 開発手順
- 工夫点
- 課題

#背景
「ポモドーロ・テクニック」という時間管理術が話題になっており、そのためのアプリなどもあるが、実際に集中しているかどうかを判断するのは単純なポモドーロタイマーだけでは難しい。
今回は心拍数と集中力の関係に着目し、集中力を判定するアプリを作成しました。

#スペック
<dl>
  <dt>言語</dt>
  <dd>PHP 7.4.2</dd>
  <dd>javascript</dd>
  <dt>DBMS</dt>
  <dd>MySQL 5.7.26 </dd>
  <dt>開発環境</dt>
  <dd>MacOS Catalina 10.15.5 </dd>
  <dd>MAMP 5.7 </dd>
  <dt>ライブラリ</dt>
  <dd>jquery</dd>
  <dt>フレームワーク</dt>
  <dd>Bootstrap 4.2</dd>
  <dt>バージョン管理</dt>
  <dd>Git 2.24.3</dd>
  <dt>本番環境</dt>
  <dd>xserver</dd>
  <dt>ウェアラブル端末</dt>
  <dd>fitbit inspireHR</dd>
</dl>

#主な機能
###ポモドーロタイマー
・ホーム画面
スタートを押すと25分タイマーが作動します。
タイマーの下には今日と今週の作業記録が表示されます。
<img width="300" alt="スクリーンショット 2020-09-07 22.13.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620908/eaf14bb5-9d5d-bfcc-589b-9d1bf8528884.png">
・25分が終わると
「お疲れ様です。5分休憩しましょう！」が表示されます。
<img width="300" alt="スクリーンショット 2020-09-07 22.14.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620908/bb640f05-061e-641b-a797-99436c51b726.png">
###データ
・データ画面
「１週間のポモドーロ回数の推移」と「直近の作業の心拍数の推移が表示されます。
<img width="300" alt="スクリーンショット 2020-09-07 23.00.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620908/d5b9bd2e-b532-a3c1-3514-26a414244c0e.png">

#開発手順
1. 要件定義
2. 環境設定
3. データベース設計
4. コーディング
5. xserverデプロイ

###1.用件定義
今回作成するアプリに必要な機能
・タイマー機能
・データ記録
・データ表示
・チャート表示
・fitbitのAPIからのデータ取得

php,Javascriptで開発を行う。

###2.環境選定
本番環境では知名度の高い「xserver」を使用する。
GitとGitHubは練習として使っていく。

###3.データベース設計
カラムはシンプルに
・ID
・start_at（作業開始時間)
・stop_at(作業終了時間)

###4.コーディング
コーディングを実施
####4.1データベース作成
MAMPのphpMyAdminを使ってデータベースを作成。

####4.2ホーム画面
タイマーのカウント表示はJavasciptで動的に実装。
「START」、「STOP」、「RESET」ボタンを押した時の処理を実装。
作業終了時、DBに自動的に登録される。（Ajax)
画面のデザインはBootstrapを用いて時間短縮。

####4.3データ画面
グラフはchartistというjsのライブラリで作成。
作業記録はホーム画面同様、MAMPのDBから取得する。

心拍数の記録はfitbitのAPIから取得。
以下サイトを参考にカスタマイズ
https://qiita.com/RINYU_DRVO/items/6607a0aa7ca3294f8e47

MAMPのDBから直近のデータを取り出してAPIに渡すことで
直近の作業時間あたりの心拍数の推移を取得。
(ここが一番苦労した、、、)

取得した心拍数のデータをもとに
平均心拍数と集中力判定を実施。

集中力判定は以下を基準に作成。
1.高集中：平均心拍数が高く、心拍数の分散(以下、分散)が低い
2.高ストレス：平均心拍数が高く、分散が高い
3.安定集中：平均心拍数が低く、分散が低い
4.集中していない：平均心拍数が低く、分散が高い

※閾値については今後調整します。


###5.xserverデプロイ

本番環境ではxserverを使用。
xserver上にDBを立て、プログラムもDB接続部分の修正。

#工夫点
・世の中にない機能を考え、実装まで持って行った
・自分で使いたいと思うようなアプリにすることができた

#今後の課題
一通りの動作ができた時点で完成としました。
主な課題は以下の通りです。

- チャートの追加(1週間ごとの比較など）
- 作業内容の記録(どんな作業の時にどんな集中状態なのか評価するため）

#参考文献
[Fitbit Web APIとPHP7で心拍数を取得しよう](https://qiita.com/aiba-akihito/items/e945967981c7d7eb11c8)

#GitHubアカウント
freedog1
https://github.com/freedog1/pomodoro
nslookupにて「server can't find <domain>: REFUSED」

環境: mac os 

```zsh
## エラーが出てしまう
$ nslookup google.com
Server:		2404:1a8:7f01:b::3
Address:	2404:1a8:7f01:b::3#53

** server can't find google.com: REFUSED
```

```zsh
## 第２引数にDNSサーバーを固定で指定したら通った
$ nslookup google.com 1.1.1.1
Server:		1.1.1.1
Address:	1.1.1.1#53

Non-authoritative answer:
Name:	google.com
Address: 172.217.25.110
```
rails c でカラムの確認


カラムの確認したいけど、mysqlに行くのがめんどくさいときにrails cから確認する方法です。

```
User.columns
```

でいけます。

ただこれだと他の情報も引っ付いてくるので、カラム名だけほしいときは、

```
User.columns.map(&:name)
```


でいけます。
CKA(Certified Kubernetes Administrator)取得するまでに実施したこと

# はじめに
Kubernetesを業務で触り始めて、約4ヶ月、
CKA対策をし、約2ヶ月で取得できたので、対策方法を紹介したいと思います。

## 勉強教材
- 皆さん大好き **Kubernetes完全ガイド**
- 皆さんご存知 **UdemyのCKA対策教材**  
その他いろいろ。以上

という感じでKubernets完全ガイド、UdemyのCKA対策がとても良かったのです。
デメリットといえば、Udemyについてくるhands-onは別サイトを使うのですが、そこのレスポンスがクソ遅く何度投げ出したことか。。。。  
レスポンス改善方法はわからないので、耐えてください。

ただ、これだと少し足りないところがあるので、
[Kubernetes-the-hard-way](https://github.com/kelseyhightower/kubernetes-the-hard-way)でKubernets clusterの構成要素を学習したり、（cluster maintenanceやtrouble shootingに役立つのでやっておいて損はないですが、ただこなすだけならやらないほうがいいです。他のところに時間をさきましょう。）
[CKAD-exercises](https://github.com/dgkanatsios/CKAD-exercises)でコンテンツごとに模擬試験？のようなものが有志によって作成されていますので、やってみましょう。

## 対策の流れ
1. 皆さん大好き **Kubernetes完全ガイド**にて、基礎知識をつける。
2. 皆さんご存知 **UdemyのCKA対策教材**のhands-onにて、試験対策をする。
   インド英語？があまり聞き取れなかったので、hands-on以外は飛ばしました。  
字幕もAI自動翻訳っぽいものを使っているのかわかりませんが、結構喋ってる内容と違う単語が表示されていたので、お気をつけください。  
Kubernetes完全ガイドで基礎を身に着けていれば、hands-on以外は飛ばして良いと思います。
3. UdemyのCKA対策教材のhands-onをスラスラ解けるまでやる。
4. UdemyのCKA対策教材のhands-onをスラスラ解けるまでやる。
5. UdemyのCKA対策教材のhands-onをスラスr....

という感じでやっていればCKA取得できると思います。
ぜひ頑張ってください。

希望があれば、TIPS的な記事も書きます。
EC2(AmazonLinux) にGitHubからclone

#EC2上にSSH Keyを作成

```
$cd ~/.ssh
$ssh-keygen -t rsa
```

何か聞かれるが、何もせずEnter3回そのまま押せば良い。

~/.ssh 以下に、`id_rsa` と `id_rsa.pub`が生成される。

#GitHubにSSH Keyを登録
GitHub上で、Settings → SSH and GPG keysと進む。
適当な名前をつけ、`id_rsa.pub`の中身のテキストを貼り付ける。
![スクリーンショット 2020-09-07 19.42.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/36b40820-4d33-f155-1ceb-08901a5779b8.png)

![スクリーンショット 2020-09-07 19.53.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/3c332e6d-6df1-da18-4868-25b78c08c7d0.png)

#EC2にGitHubからclone
EC2上で

```
git clone *********
```

****のところは下記clone with sshの欄。
![スクリーンショット 2020-09-07 19.55.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250449/b39fec38-ea7d-2ef3-7e79-e478d7623ced.png)
Pythonで読み込む設定ファイルを切り替える方法

# はじめに
Pythonでプログラムを実行する際にオプションをつけることで読み込む設定ファイルを変える方法です。

# ファイル構成

``` bash
.
├── config
│   ├── config_dev.ini
│   └── config_prod.ini
└── main.py
```

# 設定ファイル

``` confg_prod.ini
[MYSQL]
USER = "user_prod"
PWD = "password_prod"
```

``` config_dev.ini
[MYSQL]
USER = "user_dev"
PWD = "password_dev"
```

# 実行ファイル

``` main.py
import argparse
import configparser


def parser_conf():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "-p",
        "--prod",
        action="store_true",
        help="use prod config")
    parser.add_argument(
        "-d",
        "--dev",
        action="store_true",
        help="use dev config")
    args = parser.parse_args()
    config = configparser.ConfigParser()
    if args.prod:
        config_file_name = "config/config_prod.ini"
    else:
        config_file_name = "config/config_dev.ini"
    config.read(config_file_name, encoding='utf-8')
    return config


if __name__ == '__main__':
    config = parser_conf()
    print(config['MYSQL']['USER'])
    print(config['MYSQL']['PWD'])
```

# 実行結果
``` bash
$ python main.py -d
"user_dev"
"password_dev"

$ python main.py --dev
"user_dev"
"password_dev"

$ python main.py -p
"user_prod"
"password_prod"

$ python main.py --prod
"user_prod"
"password_prod"
```
【Vue.js】 子コンポーネントのプロパティやイベントをそのまま全て親コンポーネントから使用する方法

# はじめに
input や button などの基本的な自作コンポーネントをさらにラップしたコンポーネントを使うときなどに、**子コンポーネントのプロパティやイベントをすべて使いたい**時がしばしばあります。そのようなときにどうすればいいのかをまとめました。

# ルートの HTML 要素の属性は親から付与可能
そもそもの前提として、コンポーネントの**ルートの HTML 要素の属性は親から付与可能です。**
下記のようなルート要素に input だけを配置した基本的なコンポーネントを作ったとします。

```BaseInput.vue
<template>
  <input type="text">
</template>

<script lang="ts">
import { Component, Vue } from "vue-property-decorator";

@Component({})
export default class BaseInput extends Vue {}
</script>

<style scoped lang="scss"></style>
```

親コンポーネントから子コンポーネントのルート HTML 要素に属性を付与することができます。

```CustomInput.vue
<template>
  <base-input
    class="base-input-class"
  />
</template>
…
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474068/a8915104-b6db-294d-1362-ac9a8d888608.png)



# 子要素のプロパティを親からすべて利用可能にする

`v-bind="$attrs"` を使うことで、ルート HTML 要素の属性以外の prop も親から利用可能になります。

```BaseLabelInput.vue
<template>
  <div>
    <p>{{ label }}</p>
    <input
      type="text"
      v-bind="$attrs"
    >
  </div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";

@Component({})
export default class BaseLabelInput extends Vue {
  @Prop({ default: '' })
  label!: string
}
</script>
```

```CustomLabelInput.vue
<template>
  <base-label-input
    label="label name"
    :value="test"
  />
</template>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474068/db7a2b18-f256-89e8-7de5-04b0fd7576b3.png)

# ルート HTML 要素の属性を親から使用させたくないとき
ルート要素のプロパティを親に継承させたくないときは `inheritAttrs: false` を使います。
下記の例では input をルート要素に持つ BaseInput コンポーネントに `inheritAttrs: false` を適用した上で placeholder プロパティを付与しています。

```BaseInput.vue
<template>
  <input
    type="text"
    :placeholder="placeholder"
  >
</template>

<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";

@Component({ inheritAttrs: false })
export default class BaseInput extends Vue {
  @Prop()
  placeholder?: string
}
</script>
```

親コンポーネント側では `value` 属性を付与することはできません。
`placeholder` prop は通常通り使用できます。

```CustomInput.vue
<template>
  <!-- value は無効、placeholder は有効 -->
  <base-input
    value="sample text"
    placeholder="placeholder"
    @input="onInput"
  />
</template>
...
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474068/aa725a13-345f-8564-b255-a1688b561f73.png)

# すべてのイベントを親から使用したい時
プロパティと異なり、ルート要素であったとしても、子のイベントは受け取ることができません。
そこで、`v-on=$listeners` を子要素に記述し、すべてのイベントを親コンポーネントで受け取れるようにします。

```BaseInput.vue
<template>
  <input
    type="text"
    v-on="$listeners"
  >
</template>
...
```

```CustomInput.vue
<template>
  <base-input
    @input="onInput"
    @click="onClick"
    @focus="onFocus"
  >
</template>
...
```

# 参考
- https://jp.vuejs.org/v2/guide/components-props.html
- https://jp.vuejs.org/v2/guide/components-custom-events.html
OpenWRT(LEDE)使いこなし : NASとしてsamba共有するまで

# はじめに
OpenWRT/LEDEはワイヤレスルーター向けのLinuxディストリビューションですが、
NASとして運用する場合のTipsとして、
samba設定について情報を残しておきます。

尚、中華NASキットBS-U35WFにOpenWRT/LEDEをインストールするまでのTipsは以下です。

- [中華ファンレスNASをOpenWRT(LEDE)で使う](https://qiita.com/yo-he/items/74793b33c4761f9529f3)

参考 :

- [NAS (aka Network Attached Storage)](https://openwrt.org/docs/guide-user/services/nas/start) : OpenWRTのオフィシャルTips
- [ほげぴよwiki Samba のインストール](https://hogepiyo.com/wiki/doku.php?id=openwrt:install-samba)

# samba install
基本的にほげぴよさんのwikiの通りです。
違いと言えば、Webインターフェース luci-app の日本語版を入れたくらいです。

```
root@LEDE:~# opkg list | grep samba
luci-app-samba - git-19.271.72080-7b230b0-1 - Network Shares - Samba SMB/CIFS module
・・・
luci-i18n-samba-ja - git-19.271.72080-7b230b0-1 - Translation for luci-app-samba - 日本語 (Japanese)
・・・
samba36-client - 3.6.25-8 - Samba 3.6 SMB/CIFS client
samba36-server - 3.6.25-8 - The Samba software suite is a collection of programs that implements the SMB protocol for UNIX systems, allowing you to serve files and printers to Windows, NT, OS/2 and DOS clients. This protocol is sometimes also referred to as the LanManager or Netbios protocol.

```

```
root@LEDE:~# opkg install samba36-server luci-app-samba luci-i18n-samba-ja
```

# home作成
openWRT/LEDEは、標準では /home すら作られていない為、作成します。

```
root@LEDE:/# cd /mnt/sda1
root@LEDE:/mnt/sda1# mkdir home
root@LEDE:/# ln -s /mnt/sda1/home/ /home
```

# 上手くsambaへ繋がらない場合
私の場合、sambaが正しく起動しても、外部から上手く接続できませんでした。
結論としては、/etc/samba/smb.conf ではなく、
/etc/samba/smb.conf.template を修正する必要があります。

```/etc/samba/smb.conf.template
root@LEDE:~# vi /etc/samba/smb.conf.template
      interfaces = |INTERFACES|
↓
#      interfaces = |INTERFACES|
	bind interfaces only = no
```

# ゲストアカウント追加
家庭内NAS運用の場合、家族の共有ディレクトリを運用する場合等は、ゲストアカウントで運用します。

```/etc/samba/smb.conf.template
	guest account = nobody
```

# シンボリックリンク対策
公開ディレクトリからシンボリックリンクを辿りたい場合は、
以下の設定が必要です。

```/etc/samba/smb.conf.template
	unix extensions = no
	wide links = yes
```

# luci-appからの設定
ここまでの/etc/samba/smb.conf.templateに対する設定は、
GUIのluci-app経由からも設定出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704155/5637b854-fd29-8807-40eb-b8f15b7379fc.png)
ロードバランサーとは？

Webサーバーを冗長化する際に、システムに届くリクエストをどのWebサーバーに渡すかということを考える必要が出てくる。

この**`振り分け作業を行うための機器がロードバランサー`**である。ロードバランサーによって作業が振り分けられることにより、一台当たりの負荷を軽減することができる。

ロードバランサーはWebサーバーよりインターネットよりに配置して、配下となるWebサーバーを認識させる。

クライアントからのリクエストはロードバランサーが一旦全て受け取り、そのリクエストを配下のWebサーバーに均等に転送することで各Webサーバーの負荷を平準化しつつ、リクエストを処理させる。そしてWebサーバーからのレスポンスは一旦ロードバランサーが受け取り、ロードバランサーからクライアントへ転送する。
Windows Server を監視する その２


#[前回](https://qiita.com/kazumatsukazu/items/12ac22d42d2ad285a71a)までの話
以下を監視することにした
####1.ビジネス監視
なし

####2.フロントエンド監視
なし

####3.アプリケーション監視
MT4アプリが落ちている

####4.サーバ監視
WindowsServerが落ちている
メモリまたはCPUが１００％になっている
→１００％になってからでは遅いので80%にする(普段は60%)。

####5.ネットワーク監視
FX会社との疎通が取れるか
レイテンシが普段と比べて遅くなっていないか

####6.セキュリティ監視
ログイン

をしよう、というお話。

#で、どうやって実装する？
[公式](https://cloud.google.com/logging/docs/agent/installation?hl=ja)によるとどうやらStackdriverをWindowsServerに入れると、イベントログを収集してくれるらしい。

そしてさらに調べると、Windowsには「[eventcreate](https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/eventcreate)」なるコマンドでイベントログに任意のメッセージを書き込めるとのこと。

**これだ！！**

試しにやってみますた。

```
C:\Windows\system32>eventcreate /t error /id 100 /d test

SUCCESS: An event of type 'error' was created in the 'Application' log with 'EventCreate' as the source.

C:\Windows\system32>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485045/d5f8aa1f-f9b0-80ef-180c-5ca5112697f9.png)

できてるできてる。
そしてGCPのログコンソール上からも
![スクリーンショット 2020-09-07 12.48.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485045/a1aed3d6-7fe8-0554-4182-185f18bcae1a.png)

できてるできてる。

#通知はどうにやるんかいな
[こちら](https://qiita.com/kengomkt/items/f41fe1d08a06a3676c2f)がとても参考になった。
参考にして以下のように設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485045/bd289c9e-bdac-cbcf-9058-67ff9bdde98a.png)

メールも届いた。
![スクリーンショット 2020-09-07 21.52.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485045/690bab3d-a671-13ea-e8c0-15c954af8692.png)

**でも1つ問題なのは、1分後にリカバリーのメールがきてしまうこと。**
件数が1分あたりに０になるから閾値より下になった、てことで間違ってはいないのだけど、、、
ちなみにAlignerをcountに変えると、０にならないのか、二度目以降にエラーを発生させてもメールが飛ばない、という事態に陥ったのでこの方法はやめました。
特定のログが出たらメッセージを通知したいだけなので、本来なら閾値設定などはいらないのだが、調べてもそのような設定の仕方は見つけられなかった。
どなたかやり方ご存知の方がいたら教えていただけますと幸いです。

#実装していく
####MT4アプリが落ちている
Windows上で稼働するアプリケーションが起動しているかどうかを知るための方法
調べるとどうやら起動しているプロセスを確認する「tasklist」コマンドがあるらしい

```
C:\Windows\system32>TASKLIST | FIND "terminal.exe"
terminal.exe                  4364 RDP-Tcp#72                 2     88,568 K
terminal.exe                  4720 RDP-Tcp#72                 2     70,112 K
terminal.exe                  1716 RDP-Tcp#72                 2     47,412 K

C:\Windows\system32>
```

※訳あってMT4を3つ稼働させています。

というわけでこんな感じのbatファイルを書きました。

```
@ECHO OFF

tasklist | find "terminal_test.exe"
if %errorlevel%==1 (
    eventcreate /t error /id 100 /d battest
) 
:END

exit
```

※terminal.exeを別名に名称変更しています。

tasklistして、findできなければerrorlevelが1になるので、1ならeventcreate、という感じです。
(見たまんま笑)

これをタスクスケジューラに登録します。
[ここら辺](https://www.atmarkit.co.jp/ait/articles/1007/30/news111.html)が参考になるかな

とりあえず今回はここまで
ここまでできれば後少しかな
GatsbyJS faviconファイル設定

以下のディレクトリにファイルを配置する

```
{プロジェクト名}/static/favicon.ico
※ 変更されない場合は再ビルド or キャッシュ削除
```

manifestを追加する場合は、公式チュートリアル参考にしてください
https://www.gatsbyjs.com/tutorial/part-eight/#-using-gatsby-plugin-manifest
Layoutタップ時にRecyclerViewもタップ対象とする方法

親のLayoutに `android:clickable="true"` してもRecyclerView領域タップに反応してくれない。そんなときの対応方法。

setAdapterの後に `suppressLayout(true)` をするだけでOK。
※ `setLayoutFrozen(boolean)` は Deprecated になりました。
https://developer.android.com/reference/kotlin/androidx/recyclerview/widget/RecyclerView#suppresslayout

タッチイベントやスクロールが無効になるので、当然RecyclerViewのアイテムがClickListener等のイベントを持っていても反応しなくなります。

setAdapterの後なのは、setAdapter内でfalseに設定されているためです。

```java
// recyclerview-1.1.0-sources.jar
public void setAdapter(@Nullable Adapter adapter) {
    // bail out if layout is frozen
    setLayoutFrozen(false);
    setAdapterInternal(adapter, false, true);
    processDataSetCompletelyChanged(false);
    requestLayout();
}

@Deprecated
public void setLayoutFrozen(boolean frozen) {
    suppressLayout(frozen);
}
```

`suppressLayout(true)` の１行を追加するだけで良いですが、ソースコード上で行う必要があるためレイアウトXML上からは分からなくなってしまいます。なので私が実装する際にはCustomViewを作成しています。

```kotlin
package com.example.myapp

import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
import androidx.recyclerview.widget.RecyclerView

class SuppressRecyclerView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    @SuppressLint("PrivateResource") defStyleAttr: Int = R.attr.recyclerViewStyle
) : RecyclerView(context, attrs, defStyleAttr) {

    override fun setAdapter(adapter: Adapter<*>?) {
        super.setAdapter(adapter)
        suppressLayout(true)
    }
}
```

```xml
<com.example.myapp.SuppressRecyclerView
    android:id="@+id/list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
    tools:itemCount="3"
    tools:listitem="@layout/list_card" />
```

以上
markdown初心者を卒業したい

未だにmarkdownチョットデキるようにならないのでmarkdownについて調べてみた。

## markdownチュートリアル
markdownを練習できるサイトがある。課題形式で実際にmarkdownを記述してクリアをしていこう。
[markdownの練習にどうぞ](https://www.markdowntutorial.com/)

## Githubでも絵文字が使える？
いろいろ調べてたら、Githubがかなりの数の**絵文字**に対応しているらしい。
明日からのレビューでガンガン使っていこうと思います。
[Githubで使える絵文字の一覧](https://www.webfx.com/tools/emoji-cheat-sheet/)

## GithubのMarkdown記法ガイド
Github公式のMarkdown記法一度目を通すといいかも。
https://guides.github.com/features/mastering-markdown/
備忘録_MFC_文字列変換

### MFCでの文字列変換 (std::string → CStringW)
```
CStringW cstw;
CStringA csta;
std::wstring wstr;
std::string str;

cstw = wstr.c_str(); // CStringW ← wstring
csta = str.c_str();  // CStringA ← string

cstw = (CString)str.c_str(); //CStringW ← string
React Native Gesture Handler を Android で使用するのに必要な設定

Android で react-native-gesture handler が一部動かなくなって詰まっていたので忘備録。

## tl;dr;

- Android にて、Modal Component の中でreact-native-gesture-handler を使うには、`gestureHandlerRootHOC` を Modal の中で使う必要がある。
- https://docs.swmansion.com/react-native-gesture-handler/docs/#usage-with-modals-on-android

```jsx
import * as React from 'react'
import { Text, Modal } from 'react-native'
import { TouchableOpacity, gestureHandlerRootHOC } from 'react-native-gesture-handler'

const ModalChild = gestureHandlerRootHOC(()=>{
  return (
    <TouchableOpacity onPress={()=>{/* some event */}}>
      <Text>Button with Gesture</Text>
    </TouchableOpacity>
  )
})

export const GestureInModal = () => {
  return (
  <Modal>
    <ModalChild />
  </Modal>
  )
}

```

## react-native-gesture-handler について。

React Native は基本的に画面の描画は JS 層で書いた React のコードをうまく変換して描画されます。(2020年9月現在)
どの様に描画されるかは JS のコードを読み込んで、それを ViewConfig という json に変換してそれぞれ iOS や Android のコードに変換すると言った処理が走ります。（これらの描画は、現在進行中の Fabric プロジェクトによって方針が変わって速度も改善されますが今の所は話を進めます。)

これは Animation や Gesture など、ユーザーの動きに合わせて画面を動かすのには適していなく、特に Android ではそのまま書くと大きなパフォーマンス減少の原因になりがちとなります。

[react-native-gesture-handler](https://github.com/software-mansion/react-native-gesture-handler) はこの問題を解決すべく作成されたライブラリで、今では react-navigation など、多くの react-native の主要ライブラリで使用されています。

react-native-gesture-handler はスワイプやフリックなどの gesture を行った際に行われる処理をネイティブ層に閉じ込めることによって、本来のネイティブのパフォーマンスで動作が行えるようにするライブラリです。メール一覧で左にスワイプすることで削除するなどと言ったユースケースの時に使用されます。

## 詰まった箇所

react-native-gesture-handler が提供している `Swipeable` や `TouchableOpacity` を使って、ボタンを押したら遷移、スワイプしたら削除のような動作を行おうとした時、一部の画面で iOS では問題なく動いていたのが Android では Touch event も Swipe event も発生していなかった。

今まで他の箇所では問題なく動いていたのだが、どうやら react-native が提供している `Modal` Component のみ Android で動作していなかった。

Android では、最初に react-native-gesture-handler を読み込んだ際、Gesture が行える範囲が MainActivity の1画面に限られているようで、react-nativeのModalを使った画面はそれとは別画面扱いになり、react-native-gesture-handlerの適応範囲外になっていた模様。

[React Native Gesture Handler の公式ドキュメント](https://docs.swmansion.com/react-native-gesture-handler/docs/#usage-with-modals-on-android)によれば、もし Modal の中で react-native-gesture-handler を使う必要がある場合は、Modal の中でさらに `gestureHandlerHOC` を使って、Modal のページの中でも gesture handler を読み込む様に設定する必要がある模様。


```jsx
import * as React from 'react'
import { Text, Modal } from 'react-native'
import { TouchableOpacity, gestureHandlerRootHOC } from 'react-native-gesture-handler'

const ModalChild = gestureHandlerRootHOC(()=>{
  return (
    <TouchableOpacity onPress={()=>{/* some event */}}>
      <Text>Button with Gesture</Text>
    </TouchableOpacity>
  )
})

export const GestureInModal = () => {
  return (
  <Modal>
    <ModalChild />
  </Modal>
  )
}

```

これで問題なく Android の modal の中でも Gesture Handler を動かすことができた。

## 参考

- https://docs.swmansion.com/react-native-gesture-handler/docs/#usage-with-modals-on-android
CSSで背景を斜めにする。

一瞬で背景を斜めにします。
デモ: https://codepen.io/tt113/pen/XWdVGbL?editors=1100


# 実装
```html:html
<div class="box">
  
</div>
```

```css:css
.box {
  height: 600px;
  background: linear-gradient(
    175deg, #fac700 52%, #1394CF 52%);
}
```

# 結果
![スクリーンショット 2020-09-07 23.26.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352602/df245700-54bf-bcb2-920b-bf7c19837cd1.png)

# 解説
cssにはlinear-gradient関数というグラデーションを生成する関数があり、それを使って実装している。

引数の指定方法は様々だが、今回は１つ目の引数(`175deg`)はグラデーションの角度、

2つ目・3つ目の引数はグラデーションの色、始まる位置を指定している。



# 参考文献
- [
linear-gradient() - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/linear-gradient)
GatsbyJS よく使うコマンド

プロジェクト作成

```
gatsby new {プロジェクト名} {雛形}
例
gatsby new hello-blog https://github.com/gatsbyjs/gatsby-starter-hello-world
```
開発サーバーを起動する

```
gatsby develop
```
本番用のビルド

```
gatsby build
```
本番用サーバーを起動する

```
gatsby serve
```
キャッシュの削除

```
gatsby clean
```

都度追加しますーーー
![Party Parrot](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F401312%2F8d5c70a3-f609-ab2c-e2db-6b4c8d3b9531.gif?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=becdf09ee2b7b16221339c5724babdc0 "Party Parrot")
AWSLambda(Node.js)の入力パラメータチェック


AWSLambda(Node.js)のREST APIにおいて入力パラメータのチェックがしたい
そうだ、[value-schema](https://www.npmjs.com/package/value-schema)を使おう

#value-schemaができること
1.必須パラメータの有無、
2.型、
3.想定範囲内に存在するか(e.g.limit < input < limit)、
上記3点における入力パラメータの検証と修正ができる

#使い方
大きく２つの書き方がある....と勝手に思ってる
基本のフォーマットは　vs.型名( {オプション} )

```javascript
//====その1. オブジェクトの中身をまとめてチェックする方法====
var vs = require("value-schema");

// 入力パラメータのオブジェクト
let requestbody = {
    testId: "test",
    testNum: 1,
    testlist: [1, 2, 3],
    NoCheckid:"no",
};

// 入力パラメータの満たすべき条件
const schemaObject = {
    testId: vs.string({minLength: 3}), //eventIdが文字列かつ5文字以上
    testNum: vs.number({minValue: 1,}), //testNumが数字かつ1以上
    testlist: vs.array({minLength: 2}), //testlistがarrayかつ2要素以上
                                        //noNoCheckidは条件を書いてないのでチェックされない
};

// 全ての条件を満たさない場合エラーを投げる,満たす場合は変数にいれる
const checkedRequestbody = vs.applySchemaObject(schemaObject,requestbody,(err)=> {
    throw new Error("入力パラメータがおかしい")
});
```


```javascript
//====その2. パラメータ単体でチェックする方法====
var vs = require("value-schema");
const flag = true;
const checkedName = vs.boolean().applyTo(flag,(err)=> { //flagがbool値である
    throw new Error("入力flagがおかしい") //条件を見たさない場合err投げる
});
```

##ほぼ全ての型で使える便利なオプション
{strictType: true} : 厳密なタイプチェックができる、デフォルトはオフ
{ifUndefined: somevalue} : パラメータがundefinedの場合に任意の値を入れておく
{ifNull: somevalue} : パラメータがnullの場合に任意の値を入れておく
{ifEmptyString: somevalue} : パラメータが空文字""の場合に任意の値を入れておく

＊その他オプションなどは[公式](https://www.npmjs.com/package/value-schema)を参照
Redisのデータ構造Set型の活用

インメモリ・データベースRedisはString、Hash、List、Setなどのデータ構造をサポートしている。本節では、Set型の活用方法について説明する。
Set型は、一つのキーに複数の要素データの集合を保存するときに利用する。Set型の特徴は、集合に保存される要素データは重複せず、ソートもされない。

##Set型データを操作する基本コマンド
以下に、Redis-cliでSet型データを操作するための基本コマンドを示す。

```
#　要素の追加
127.0.0.1:6379> sadd users Mike Marry Jack
(integer) 3
# 要素の表示
127.0.0.1:6379> smembers users
1) "Marry"
2) "Jack"
3) "Mike"
# 要素の数の表示
127.0.0.1:6379> scard users
(integer) 3
# 要素の削除
127.0.0.1:6379> srem users Mike
(integer) 1
```
##Set型の集合演算
Set型に対して、和、差、積の集合演算ができる。以下、業務例を用いて説明する。
あるWebサイトでは、毎日新規登録したユーザID、および翌日に再度ログインしたユーザIDを集計する要件があるとする。RedisのSet型を用いて、以下の手順でこの要件を実現できる。

* 既存ユーザIDを保存するSetを用意する。そのSetのキーに「`user:id`」を指定する。
* 日付ごとにログインしたユーザIDを保存するSetを用意する。そのSetのキーに「`user:id:yyyyMMdd`」を指定する。「yyyyMMdd」は日付である。

例えば、2020/09/07にログインした３つのユーザID(100460 100451 100341)を以下のコマンドでRedisに保存する。

```
# 2020/09/07にログインしたユーザIDをuser:id:20200907に保存する
sadd user:id:20200907 100460 100451 100341
```
和集合コマンドで、毎日のログインユーザIDを既存ユーザIDのSetに追加する。

```
# user:id:20200907とuser:idの和集合をuser:idに保存する
sunionstore user:id user:id user:id:20200907
```
2020/09/08に新規ログインユーザIDのSetを求めるには、以下の差集合コマンドを利用する。

```
# user:id:20200908とuser:idの差集合、つまり、新規ユーザIDをuser:newに保存する
sdiffstore user:new user:id:20200908 user:id  
```
2020/09/08に新規登録して、かつ、2020/09/09にもログインしたユーザIDのSetを求めるには、以下の積集合コマンドを利用する。

```
# user:newとuser:id:20200909の両方にあるユーザIDをuser:remに保存する
sinterstore user:rem user:new user:id:20200909  
```
上記例のように、集合演算が必要な業務要件は、RedisのSet型を利用して簡単に実現できる。もちろん、MySqlなどのRDBを利用しても同じことを実現できるが、高性能のRedisを活用することも一つの選択肢になるではないか。
座標圧縮についての備忘録

競プロの精進をしていたら、<b>座標圧縮</b>というものに出くわした。
例えば、

```cpp
{55,6,432,55,98,67,6,32};
```
のような配列を

```cpp
{2,0,5,2,4,3,0,1};
```
の様に変換するものだ。

ゴリゴリやれば行けそうな気もするが上手いやり方があったのでそれを備忘録として残す。

手順を簡単に説明すると、

```
・元の配列aを、別の配列valsにコピー
・valsをソート
・valsから重複した要素を消す。
・配列aをなめて二分探索でvalsからインデックスを取得
```
といった具合だ。非常に上手い。

これをC++でコードに起こすと次のようになる。

```c++
vector<int> a{55,6,432,55,98,67,6,32};//元の配列

vector<int> vals=a;

sort(vals.begin(),vals.end());
auto itr=unique(vals.begin(),vals.end());//重複した要素を消す
//これだと消されたところが穴になる。
//unique()の戻り値は消されたところの次のイテレータ
vals.erase(itr,vals.end());//穴を消してあげる
for(auto aa:a){
	int ret=lower_bound(vals.begin(),vals.end(),aa) - vals.begin();
	cout<<ret<<" ";
}
cout<<endl;
```
ちなみに、

```cpp
auto itr=unique(vals.begin(),vals.end());
vals.erase(itr,vals.end());
```
は、

```cpp
vals.erase(unique(vals.begin(),vals.end()),vals.end());
```
の様に一つにまとめることもできる。

<h2>発見</h2><br>新たに得られた知見としては、このアルゴリズム自体とunique()とerase()という関数の存在である。

余談だが、座標圧縮でコピー先の配列の変数名としてvalsを用いるのが慣例になっているようだがどういう意味なのだろうか。
あの「バルス！！」と関係あるのか、非常に興味がある。
【初心者でもわかる】cssだけでスライドショー風の横スクロールできるカルーセルの作り方

# どうも7noteです。CSSだけで作れるカルーセルの作り方

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/css-carousel/
【PowerShell】イベントログをCSVファイルとして出力する

##経緯
Windowsサーバの点検業務にイベントログの確認があり、毎回各サーバへリモデして確認するのは面倒なので
CSVへ出力するスクリプトを作成しました。
エラー以上のログでフィルタリングしています。

##変数定義
デスクトップ配下のEventLogsフォルダを指定している。ない場合は作成される
今回は1日ごとにログ取得することを想定して昨日の日付を取得

```powershell
#任意の出力先フォルダと-afterで指定する時間を設定
$OutPutFolder = Join-Path ([Environment]::GetFolderPath('Desktop')) "EventLogs"
if(!(Test-Path $OutPutFolder)){ mkdir $OutPutFolder }
$yesterday = (Get-Date).Date.AddDays(-1)
```

##Get-EventLogを使用するやり方
``EntryType -eq "0"``とはレベルが「重大」であるログ。

```powershell
#Systemログ、Applicationログを別々に$OutPutFolderへ保存する処理。
@("System", "Application") | %{
    Get-EventLog $_ -After $yesterday |
    ?{ ($_.EntryType -eq "Error") -or ($_.EntryType -eq "0") } |
    Export-Csv -Encoding Default -NoTypeInformation -Path (
        Join-Path $OutPutFolder ($_ + "Log_" + (Get-Date).Date.ToString("yyyyMMdd") + ".csv") #任意の出力ファイル名
    )
}
```
##Get-WinEventを使用するやり方
こっちの方がいいかも
上のスクリプトではSystemとApplicationで別ファイルに分けていたがこちらは1つのファイルですむ
``Level=1,2``について、1「重大」2「エラー」3「警告」4「情報」が配列で指定できる

```powershell
Get-WinEvent -FilterHashtable @{
    LogName='System', 'Application'
    Level=1,2
    StartTime=$yesterday
} | 
Select-Object -Property * |
Export-Csv -Encoding Default -NoTypeInformation -Path (
        Join-Path $OutPutFolder ("WinEventLog_" + (Get-Date).Date.ToString("yyyyMMdd") + ".csv") #任意の出力ファイル名
    )
```
`-FilterHashtable @{}`でいろいろフィルターできて便利。しかも早い。
フィルタリングの仕方について[こちらのページ](https://devblogs.microsoft.com/scripting/use-filterhashtable-to-filter-event-log-with-powershell/)がとても参考になりました。

上記のスクリプトではすべてのプロパティをCSVへ出力しています。
``Get-WinEvent``で``Select-Object``にて選択できるプロパティは下記。

Message
Id
Version
Qualifiers
Level
Task
Opcode
Keywords
RecordId
ProviderName
ProviderId
LogName
ProcessId
ThreadId
MachineName
UserId
TimeCreated
ActivityId
RelatedActivityId
ContainerLog
MatchedQueryIds
Bookmark
LevelDisplayName
OpcodeDisplayName
TaskDisplayName
KeywordsDisplayNames
Properties

##余談
Get-EventLogでは表示できないMassege内容が、Get-WinEventでは見えたりする。
~~(Get-WinEventからパイプでExport-Csvに渡すと改行が混じって列がずれる。それを直すスクリプトを書かなければならなくなる。)~~
CSVに改行コードが混じるのは確かだけれどエクセルで表示した際はきちんと列がずれなかったのでこれでよいのかな。

当初はGet-EventLogの方が簡単だと思ってたけど、やってみたらGet-EventLogの方がシンプルで早くてよかったかもしれない。