OmniAICreator/Qiita-1.07M huggingface dataset:
KVM仮想サーバ用bonding・VLAN・ブリッジ設定

# 概要
KVM仮想サーバ用のぼくがかんがえたさいきょうのネットワーク設定のメモ。

# 前提
  * (10)GbEをWAN用に2ポート備えたCentOS ７のKVM仮想化サーバ（仮想化ホスト）
  * 対向スイッチとはbondingで接続
  * 対向スイッチにはVLANが設定してあり、接続先ポートはタグ付のまま
  * 対向スイッチには割とたくさんのVLANが設定してあるため、ethポート毎にVLANを変えるのは無理
  * VLANはOS側でアンタグしてブリッジとして仮想化ゲストに渡す
  * 仮想化ホストと仮想化ゲストの管理者は異なる可能性がある
  * 仮想化ゲストの管理者に変な設定をされて想定外のVLANにアクセスされたくない
  * 仮想化ホストへのリモート接続やストレージへの接続は別のethポートで行うため今回の設定では考慮しない

というわけでbonding + タグVLAN + ブリッジで実現する。

# 設定
`em1`と`em2`を対象のポートとする。

## libvirtの作成する仮想ネットワークを潰す
```
# virsh net-destroy default
# virsh net-undefine default
# virsh net-list --all
```

## 邪魔なネットワーク設定を削除
```
# rm /etc/sysconfig/network-scripts/ifcfg-em1
# rm /etc/sysconfig/network-scripts/ifcfg-em2
```

## bondインターフェースを作成
```
# nmcli connection add type bond autoconnect yes con-name bond0 ifname bond0 mode active-backup
# nmcli connection mod bond0 ipv4.method disabled ipv6.method ignore
# nmcli connection add type bond-slave autoconnect yes ifname em1 master bond0 
# nmcli connection add type bond-slave autoconnect yes ifname em2 master bond0 
```

## VLANとブリッジの設定
以下の2つのファイルをVLAN ID毎に作成する。サンプルはVLAN 100の場合。
VLANがDHCP配下だとしても`BOOTPROTO=none`にしておいて、仮想化ゲスト側で自動取得の設定にする。
当初はnmcliでやろうとしたけどめんどくさいので自分で書いてる。

```
# vi /etc/sysconfig/network-scripts/ifcfg-bond0.100
DEVICE=bond0.100
BRIDGE=br100
VLAN=yes
ONBOOT=yes
BOOTPROTO=none
```

```
# vi /etc/sysconfig/network-scripts/ifcfg-br100
DEVICE=br100
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=none
```

## 設定反映
試行錯誤でやったので、初回は再起動しないとダメかも。
VLAN設定を追加したときはこれで問題ない。

```
# nmcli connection reload
```

## KVM側の設定
仮想化ゲストのXMLで下記みたいな感じになるよう設定。

```xml
    <interface type='bridge'>
      <mac address='52:54:00:xx:xx:xx'/>
      <source bridge='br100'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
```

## テスト
仮想化ゲストに適当なIPアドレスを振って、pingが飛ぶか疎通チェック。
仮想化ゲストをシャットダウンして別のブリッジを設定して期待通りの挙動になるかのチェック。
pingを飛ばしながら`em1`と`em2`の接続してあるケーブルを交互に抜くことで冗長化されているかチェック。

# 参考リンク
下記記事あたりを参考にしました。
http://www.postcard.st/nosuz/tech/2011/09/17-23
http://www.si1230.com/?page_id=967
http://www.si1230.com/?page_id=4728
https://qiita.com/yteraoka/items/e661c2a8c6e7617e64f9
[git merge --squash]commitを1つにまとめてと言われたら。

プルリクエストに対してコミットがたくさんになってしまい、
「commitを1にまとめて」と言われることがあると思います。

その時は下記をの通りに実行


## 登場するブランチ
- 作業ブランチのマージ先
  - `develop`
- 作業ブランチ
  - `feature/example_999`
- 一時作成用ブランチ
  - `tmp`

``` shell
$ git checkout feature/example_999 # 作業ブランチへ移動しておく
$ git branch -m feature/example_999 tmp # -m ブランチ名を変える
$ git checkout develop # 作業ブランチのマージ先ブランチに切り替える
$ git checkout -b feature/example_999 # 作業ブランチと同じ名前のブランチを作成
$ git merge --squash tmp # 1つにまとめる
$ git commit -m "squash" # commit
$ git push origin feature/example_999 -f # push
$ git branch -D tmp # tmpブランチを削除
```
iMovieで複数の写真の長さ(クリップ)を一括変更する方法

校長先生に卒業式で流す動画の制作を頼まれたのでiMovieでつくることに。

とりあえず使えそうな画像を突っ込んで曲に合わせて編集していくことにしました。

突っ込んだ画像がもともと４秒流すデフォルト設定になっていたのにあとから気づいて一括で0.5秒くらいに変更できないかと調べていたところ、

>http://yokyo-movie.com/imovieの使い方/imovie-10-0-3複数の写真のクリップをまとめて長さを揃え/

こちらのサイトを見つけました。
しかし2014年の記事でこの機能のボタンが見つからず、他の記事もなく、渋々自力で探すことにしました...
よく使いそうな機能だしきっとどこかにあるはず...！



#そしてやっと見つけました...

<img width="820" alt="スクリーンショット 2018-02-21 15.09.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/232752/13676210-47d2-5ca7-e9f7-6237db712589.png">



気になってこのインフォメーションみたいなマークを押してみたらまさかのここに継続時間を変更できるものがありました

写真(クリップ)を全選択し、この継続時間を変更すると　思った通りすべての写真の表示時間を変更することができました。


#まとめ
右上のインフォメーションのようなボタンから継続時間を変更することで写真の表示時間が変更できます。(全選択で全てに適用することも可能)

よく使う機能だし、インフォメーションみたいなアイコンのところに置かずもう少しわかりやすくしてくれても良かったんじゃないですかAppleさん...
RPGツクールMV 1.6.0 コアスクリプト変更点

# 1.6.0リリース、コアスクリプト更新が強制に

18/02/21、ツクールMVが1.6.0に更新されましたが、**コアスクリプトを1.6.0に更新しないとテストプレイできなくなる**仕様のため、古いコアスクリプトの更新がほぼ強制的となりました。
しかしむやみに更新するとプラグインの競合が怖い…どういう感じに対応すればいいか分からない！
というわけで、前バージョン1.5.1から、1.6.0へコアスクリプトがどのように変更されたか？というのを以下にまとめることにしました。

※**1.5.1　→　1.6.0　の差分**です！

※15：00時点で差分ツール見てまとめたものですが、もしかすると漏れがあるかもしれません。ご了承ください。

## 競合が起こりうるプラグイン

結論から言うと、以下のプラグインは競合の可能性があります。

  * 以下の関数を**上書き**しているもの
    * Utils.isOptionValid
    * Graphics._cssFontLoading
    * Graphics._updateRealScale
    * BattleManager.checkAbort
    * BattleManager.checkAbort2
    * Game_Interpreter.prototype.command113
    * Scene_Item.prototype.update
    * Spriteset_Battle.prototype.overworldBattleback1Name
    * Spriteset_Battle.prototype.overworldBattleback2Name
  * 以下の関数を**呼び出し・継承**しているもの
    * BattleManager.checkAbort2
  * アイテムシーンにて、選択ウィンドウを増やしているもの
    * アイテムシーンにおいてデッドロックチェックを行うようになった影響で、追加ウィンドウにフォーカスが起きる際に挙動がおかしくなる

## コアスクリプト変更点

具体的な変更点を挙げていきます。
「？」と付けているのは変更確認しているものの検証がまだ不十分な箇所です。

### Core

  * （183行）バージョン数値変更（当たり前！）
  * （194～196行）Utils.isOptionValid の挙動変更
    * おそらく最新 Nwjs の挙動に合わせるため
  * （1720行）Graphics._cssFontLoading の挙動変更
    * document.fonts.ready.then が条件式に追加
  * （2366行）Graphics._updateRealScale：拡大率100～101％の解像度増加は原寸大になるよう変更
    * 数ドットだけウィンドウが大きいという場合は原寸大になる
 
### Manager

  * （1942～1946行）スタンドアロン時、F12 ではデバッグツール起動しないよう変更？
  * （2277行、2626～2633行）逃走判定の仕様変更
    * CheckAbort、CheckAbort2 と別れていた関数が統一され、CheckAbort2 は**削除**されました
    * そのためプラグインで CheckAbort2 を呼び出していた場合エラーの可能性があります

### Objects

  * （9342行）「ループの中断」コマンドの挙動変更
    * ループがネストしていても正しく動作するように

### Scene

  * （1295～1301行）アイテムシーンにて、カテゴリー部・アイテム部・アクター部のいずれもフォーカスされてない時、カテゴリー部を自動でフォーカスするよう修正
    * デッドロック対策による変更（ニュースより：`アイテム画面とメニュー画面を切り替えた際に稀にフリーズする問題を修正。`）
    * アイテムシーンにて**選択ウィンドウを追加するプラグインと競合**し、挙動がおかしくなるので注意！

### Sprite

  * （2538行、2547行）フィールドマップで　戦闘背景指定→空欄　にしても戦闘背景が消えないバグ修正

### Window

  * 変更なし

### Nwjs更新による挙動変更

  * require('nw.gui').Window.get().isDevToolsOpen() は**定義されなくなった**
    * デバッグプラグインなどでこの関数を呼び出した場合、エラーになります！

# 今コアスクリプトを更新するべきか、否か

本体を更新してしまった場合、どちらにせよ更新しないとテストプレイが不可能なため、「作成中のプロジェクトはコアスクリプト編集していて…」といった場合でない限り渋々更新することになるでしょう。

スクリプト自体の大幅な変更点は無いため、プラグイン競合の可能性は少ないはずです。ただし、アイテムシーンの挙動変更当たりは、**アイテム機能追加プラグインとの競合の可能性が高い**です。
（例えばYanfly氏のItemCoreまたはその関連プラグインは1.6.0コアスクリプトと競合し、アイテム選択後にカテゴリウィンドウとアイテム行動ウィンドウが同時にフォーカスされた状態になってしまいます）

アップデートからまだ時間は経っていませんので、アップデート対応を気長に待つべきかもしれません。
あるいは、本体を1.6.0に更新せずにそのままにしておくという手段もあります。

# おまけ：画像データの修正点

スクリプトとは関係ありませんが、画像データにも修正が入ったため列挙。

  * \img\characters\People1.png
    * おばさん（左上から6人目）の髪型と服のディテールがちょっと位置変更された
  * \img\tilesets\Inside_B.png
    * 玉座がちょっと下に移動した
  * \img\tilesets\Dungeon_B.png
    * 木箱E(銀)がちょっと右に移動した
  * \img\tilesets\Outside_C.png
    * 屋根飾りA（赤瓦）の色がちょっと明るくなった

# (20:00追記) Steam版におけるバージョンの戻し方

Steam版ツクールMVは自動更新のため、通常であればバージョンアップを余儀なくされます。
ですがSteam版ツクールMVはバージョン変更を自由に行えるようSteamに登録されているため、以下の手順をとることで簡単にバージョンをロールバックすることができます。

  1. 『RPG Maker MV』を**右クリック**
  + **『プロパティ』**を選択
  + **『ベータ』**タブを選択
  + **『参加希望のベータを選択してください:』**項目をクリックするとバージョンリストが表示されるので、利用したいバージョンを選択する
  + プロパティウィンドウを閉じると、選択されたバージョンのダウンロードが開始されます

これで、1.6.0以前の環境でツクールを遊ぶことができます。
コアスクリプトのバージョンアップが嫌だなと思った場合は試してみると良いでしょう。
kickstarterスタイルのViewModelをサクッとつくるテンプレートを今更ながらつくった

皆さんご存知 [kickstarter/ios-oss](https://github.com/kickstarter/ios-oss)。

すでに公開されて1年以上経っていますが、当時いろいろ記事も書かれていました。

* [Kickstarter-iOSのViewModelの作り方がウマかった](https://qiita.com/muukii0803/items/045b12405f7acff1a9fd)
* [[MVVM] kickstarter/ios-oss での画面遷移のやり方](https://qiita.com/star__hoshi/items/41dff8231dd2219de9bd)


そんな [kickstarter/ios-oss](https://github.com/kickstarter/ios-oss) ですが、これに即したViewModelをつくろうとすると、
毎回InputとOutputのProtocolを書かないといけないのでめんどうです😞

というわけで、今更ですがXcodeで新規ファイル作成時に使えるテンプレートを作成してみました。

[RxKickstarterViewModelTemplate](https://github.com/monoqlo/RxKickstarterViewModelTemplate)

Xcodeに追加すると、ファイル作成画面にViewModelのテンプレートが出てきます。

<img width="731" alt="template.png" src="https://qiita-image-store.s3.amazonaws.com/0/12896/ee8bb88f-e4ea-9e38-377b-bd12f76ff32c.png">

これを使えば以下のようなファイルをシュシュっとつくれます🙂[^1]

```swift
//
//  HogeViewModel.swift
//  TestProject
//
//  Created by monoqlo on 2018/02/21.
//  Copyright © 2018年 Your Company. All rights reserved.
//

import Foundation
import RxSwift

protocol HogeViewModelInputs {
    func <#name#>()
}

protocol HogeViewModelOutputs {
    var <#name#>: Observable<<#type#>> { get }
}

protocol HogeViewModelType {
    var inputs: HogeViewModelInputs { get }
    var outputs: HogeViewModelOutputs { get }
}

class HogeViewModel: HogeViewModelInputs, HogeViewModelOutputs, HogeViewModelType {
    
    var inputs: HogeViewModelInputs { return self }
    var outputs: HogeViewModelOutputs { return self }
    
    private let disposeBag = DisposeBag()
    
    // MARK: - HogeViewModelInputs
    
    var <#name#>: Observable<<#type#>>
    
    // MARK: -
    
    init() {
        
    }
    
    // MARK: - HogeViewModelOutputs
    
    func <#name#>() {
        
    }
    
}
```

[^1]: RxSwiftをよく使うので、いくつかそれを前提としたコードも足されています
【React】イベントハンドラで引数を使いたい【備忘録】


# 普通に引数は渡せない
```jsx:こんなことしてました
render() {
  return (
    <div>
      <button onClick={this.click(1)}>One</div>
    </div>
  );
}

click(value) {
}
```

これでは
`関数を実行している`
記述になってしまう。

あくまでやりたいのは、 `引数付きの関数の登録`！

```jsx:正しくはこう
render() {
  return (
    <div>
      <button onClick={this.click}>One</div>
    </div>
  );
}

click() {
}
```

# 引数使いたい
できます！
公式に書いてありました（完全にスルーした私
[Passing Arguments to Event Handlers](https://reactjs.org/docs/handling-events.html#passing-arguments-to-event-handlers)

## 方法1：引数なしの関数でreturnしたらいいじゃない
```jsx
<button onClick={ () => this.click(1) }>One</div>
```

超納得。
関数定義の中で引数付きの関数を実行すると言う記述です。

アロー関数はthisを束縛しません(一つ上のthisを探す)
そのため、constructorでthisを束縛(bind)しなくても動きます。

ただ、これだと(再)描画のたびに関数を作成することになるため、
Bestとは呼べない模様。
参考：https://code.i-harness.com/ja/q/1c6e0e2

## 方法2：bind関数使う
```jsx
<button onClick={ this.click.bind(this, 1) }>One</div>
```

でもbind書きたくないですね。

### 方法2-2

そもそもonClickに登録する関数をアロー関数で定義すればいいじゃない。

```jsx
clickButton = () => {
  this.click(1);
};

render() {
  return (
    ...
    <button onClick={this.clickButton}>One</div>
    ...
  );
}
```


## 方法3:HTML5のカスタム属性を利用する
```jsx
render() {
  return (
    <div>
      <button onClick={this.click} data-num="1">One</button>
    </div>
  );
}

click() {
  console.log(e.currentTarget.getAttribute('data-num'));  // 1
}
```

HTML5から「data-*」でカスタム属性がつけられるそうです(知りませんでした
これを利用して、属性経由で渡しちゃおうって作戦。
LAPACK95で特異値分解する

#概要
今回は、Fortranの有名なライブラリLAPACKを用いて、特異値分解する方法を紹介したいと思います。
数学的には以下のようなこのことを行っています。

```math
A = U \Sigma V^{t}

```
Aがm×n行列であれば、Uはm×min(m,n)行列,シグマはmin(m,n)×min(m,n)行列（対角成分に特異値、それ以外は0の行列,対角成分は特異値の値の大きいものから並んでいる。）、Vtはmin(m,n)×n。

特異値分解の具体的な説明は他のページにお任せするとして、使い方だけを説明します。LAPACKはFORTRAN77で書かれており、とても使いづらいものです。そのため、Fortran95で書かれ使いやすくしたLAPACK95を用いることにします。
これらのダウンロードとインストール方法は以下のページを参照しました。
(https://qiita.com/AnchorBlues/items/69c1744de818b5e045ab)

#方法1：テストデータ作成
まず、以下のようなデータファイルを用意し、作業ディレクトリに保存する。

```text:test_data_lapack.dat
2.27  -1.54   1.15  -1.94
0.28  -1.67   0.94  -0.78
0.48  -3.09   0.99  -0.21
1.07   1.22   0.79   0.63
-2.35   2.93  -1.45   2.30
0.62  -7.39   1.03  -2.57
```
#方法2：プログラムファイル作成
さらにプログラムファイルを用意する。

```Fortran:test_lapack95.f90
program lapack_test
  use f95_lapack !ここでLAPACK95を用いる宣言
  
  implicit none
  integer :: i, m, n, info, small_mn
  real(8) :: A(1:6,1:4)
  real(8),allocatable :: S(:), U(:,:), Vt(:,:)
  character :: filename*120
  
  m = ubound(A,1)
  n = ubound(A,2)
  small_mn = min(m,n)!small_mnは整数m,nの小さい方の整数値を取る。
  allocate(S(1:small_mn), U(1:m,1:small_mn),Vt(1:small_mn,1:n))!small_mnを決めてからallocateする。

  filename = "./test_data_lapack.dat"
  open(20,file=filename, status = 'old')
  do i = 1, 6
     read(20,*) A(i,1:4)!用意したデータの読み込み
  enddo
  close(20)

  call LA_GESVD(A(1:m,1:n), S(1:small_mn), U=U(1:m,1:small_mn), & Vt = Vt(1:small_mn,1:n), JOB ="N", INFO = info )!ここで特異値分解を行っている。

  if(info < 0) then !もし特異値分解が失敗していれば、Failと表示される。
     write(*,*) info
     stop "Fail"
  endif
  
!以下結果の書き出し
  write(*,*) "sigma="
  write(*,*) sigma(1:small_mn)
  write(*,*) "U="
  write(*,*) U(1:m,1:small_mn)
  write(*,*) "Vt="
  write(*,*) Vt(1:small_mn,n)
  stop
end program lapack_test

```
#実行方法

```bash
gfortran test_lapack95.f90 -I/usr/local/include -llapack95 -llapack -lblas
./a.out
```

#解説1:変数の説明
Aという配列(行列)が今回特異値分解したいと考えている行列。（この行列をバラバラにする）subroutineではintent(inout)この計算ではinと思えば良い。
Sは特異値を集めた配列である。大きい値の特異値から順に並べられている。通常ではシグマという行列の対角成分だけをとってきたものである。subroutineではintent(out)
Uは左特異ベクトル。subroutineではintent(out)
Vtは右特異ベクトル。subroutineではintent(out)
JOB="N"はAに値を返すかということを決めるものであるが、特に気にしなくてよい。
INFO=infoはsubroutine LA_GESVDの計算が成功した場合には0それ以外には失敗の原因により、負の整数が与えられる。subroutineではintent(out)

#解説2：重要な点
small_mnをしっかりと計算することである。これを計算しallocate。もしくは自分の頭でどちらが小さいかを予め計算してからU,Vt等の定義をすることである。これらの配列のサイズをうまく指定しておかないとおかしなことになる。

#解説3：subroutine LA_GESVD
LA_GESVDというのがLAPACK95内に含まれているサブルーチンである。目的は特異値分解であるので、右特異ベクトルVt、左特異ベクトルUを求める際にはキーワードを用いてオプションで指定することで計算できるようになっている。ただし右特異ベクトルは転置された状態になって格納されていることに注意(Vtのtは転置のtの意味)キーワードの部分は省略でき、もし特異値のみを得たい場合はU=,Vt=といった＝の入った部分は入力する必要はない。
またこのサブルーチンを使用する際には

このサブルーチンではプログラムの冒頭において
use f95_lapack
という宣言が必要である。

#参考文献
[元のデータ](http://www.nag-j.co.jp/lapack/dgesvd.htm)
[LAPACK95](http://www.netlib.org/lapack95/lug95/node325.html)

#最後に
ご質問等あればお気軽にどうぞ。
返信が遅い可能性もあります。
間違った記述がある場合もあります。
他のサブルーチンについては詳しくないです。
以上、ご了承ください。
赤外線リモコンのデータ

[I2C赤外線リモコン](https://qiita.com/yamori813/items/74c060bdc84950bccfc8)や[mruby-remocon](https://qiita.com/yamori813/items/a7379d750518f174c0c4)はビットトレードワンさんのUSB赤外線リモコンの仕様を一部変更したデータ形式となっています。

1バイト目は同じデータですが、2バイト目以降のデータはビットの並びを反転してます。USB赤外線リモコンは最下位ビット(Least Significant Bit:LSB)からの送信でI2C赤外線リモコンは最上位ビット(Most Significant Bit:MSB)からの送信となります。

![IRBIT.png](https://qiita-image-store.s3.amazonaws.com/0/104066/2ad28f68-0ff9-46af-bb70-e657837e8352.png)

これまで赤外線リモコンのデータでLSBからのパータンは見た事がなく、以前から作っていた、アルマジロのお使いなどと共通としたかったからです。ちなみに普通のシリアル通信はLSBから送られます。

アルマジロのお使いではFUTABA WEBさんのリモコン・データーベース形式(MSBから送信)を使っています。

この形式からI2C赤外線リモコンのデータ形式にするには以下のように変換します。

ソニーPlayStation2の○を例にします。

データは0xBAB5B0となって20ビットのデーターです。

1バイト目はビット長を4で割った物が上位4ビットで下位4ビットは信号のタイプになります。タイプは家電協会が1でNECが2でSONYが3となります。

((20 / 4) << 4) | 3 = 0x53

となります。後は0xBA,0xB5,0xB0が続き4バイトでデータが出上がります。

mruby-remoconの受信機能でデータを取得する事もできます。

```
$ mirb 
mirb - Embeddable Interactive Ruby Shell

> t = Remocon.new()
 => #<Remocon:0x101056fe0>
> p t.recieve
[83, 186, 181, 176]
 => [83, 186, 181, 176]
```

NECタイプのAppleRemoteの再生ボタンは[130, 119, 225, 32, 00]になります。この信号を調べているサイトではビットの並びが逆なページもあるようなのでNECタイプのビットは逆なのかもしれませんが、混乱するので並びは統一します。

自分のテストケース

|タイプ|対象|備考|
|:--|:--|:--|
|SONY|CD,PS2||
|NEC|AppleRemote||
|家電協会|[シーリング](https://qiita.com/yamori813/items/9a6587bc22e8f61ce182)|シーリングは認識率低いです|

貴重なデータを提供されているFUTABA WEBさんに感謝しております。
電子回路入門　Lチカ 

# **はじめに**
今回参考にした書籍
「[電子部品ごとの制御を学べる！Raspberry Pi 電子工作実践講座 ](https://www.amazon.co.jp/%E9%9B%BB%E5%AD%90%E9%83%A8%E5%93%81%E3%81%94%E3%81%A8%E3%81%AE%E5%88%B6%E5%BE%A1%E3%82%92%E5%AD%A6%E3%81%B9%E3%82%8B-Raspberry-Pi-%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C%E5%AE%9F%E8%B7%B5%E8%AC%9B%E5%BA%A7-%E7%A6%8F%E7%94%B0/dp/4800711614 "電子部品ごとの制御を学べる！Raspberry Pi 電子工作実践講座 ")」

図を見ながら直感的に電子部品等の仕組みを理解することができる。

この書籍ではラズベリーパイを使用していますが、私は諸事情によりPsoC5を使用して進めていきます。
プログラムより、電子回路の説明が主です(´・ω・`)

# **使用部品**
- [PsoC5](http://akizukidenshi.com/catalog/g/gM-09432/)
- [LED](http://akizukidenshi.com/catalog/g/gI-11655/)<br>
形状、光度(cd)を選択。<br>
VF(順電圧)、IF(順電流)の確認。
- [抵抗100Ω](http://akizukidenshi.com/catalog/g/gR-25331/)<br>
LEDが壊れないため。

※VF...LEDにかけるべき電圧。
※IF...順方向に電圧を加えた時に、LEDに流れる電流。

LED用の抵抗の抵抗値を求める式(オームの法則)

`抵抗値(Ω)＝（供給電圧(V)-順電圧(V)）÷ 順電流(I)`

今回の場合は、供給電圧5V、順電圧2V、順電流20mAとする。
順電流が小さいと少し暗くなる。
 (5-3)÷0.02=100
100Ω程度の抵抗を使用するため、今回は100Ωを使用。
ラズベリーパイの場合はGPIO供給電圧が3.3Vになっていて、抵抗値が60Ωなので、書籍ではそれに近い100Ωを使用している。

# **Lチカ**
Lチカとは、LEDをチカチカさせること(´・ω・`)
## 配線
PSoCに見えないかもしれないが、PsoCと書いてあるのでPsoCです(´・ω・`)
![LED.png](https://qiita-image-store.s3.amazonaws.com/0/195542/7b3b0ad0-0ef4-7725-c47d-5534253f30e7.png)
LEDには極性があります。アノード(+)が足が長い方、カソード(-)足が短い方。
抵抗には極性はないので普通に接続してください。
![LED回路図.png](https://qiita-image-store.s3.amazonaws.com/0/195542/7ae4a92e-4631-09f1-2a9c-68a1e0029a63.png)
LEDの図記号は、ダイオードとほぼ同じ形です。(発光ダイオードなので)発光するので矢印が2本外側へ向いています。
抵抗の図記号は上のようにジグザグだったり、四角だったりします。
## プログラム
プログラムの書き込み方法については[こちら](https://qiita.com/ryokai/items/57b57964e9ab7bdc9208 "PSoCを始めましょう(Lチカまで)")を参考にしました。
プログラムを見るとわかりますが、1(ON)と0(OFF)を0.5秒周期で繰り返しているので、チカチカします。

```c
#include "project.h"

int main(void)
{
    CyGlobalIntEnable;
    
    for(;;)
    {
     LED_Write(1);
     CyDelay(500);
    
     LED_Write(0);
     CyDelay(500);
    }
}
```
お気に入り登録したページの一覧を表示するjavascript

[ホームページにお気に入り登録機能を追加する](https://qiita.com/ounziw/items/041ca921b0049e3b56b2) の続編です。今回は、お気に入り登録したページの一覧を表示してみます。

### 一覧を取得して表示する

一覧を取得して表示するコードです。

```js
function displayFavorites() {
    var favorite_pages = JSON.parse(localStorage.getItem('favorite_pages')); // ローカルストレージから取得する
    var title = 'title';
    var listclass = 'viewhistory';
    listdata = $("<ul></ul>",{
        class: listclass
    });
    $("#favoritelist").text('');
    if (favorite_pages) {
        $("#favoritelist").append(listdata);
        for(i=0;i<10;i++) { // 最大10個まで
            if (favorite_pages[i] && !isNaN(favorite_pages[i]['url'])) { // 要素があるかどうかの判定。(上のforと合わせてコードを改善できるかもしれない)
                textdata = $("<a></a>",{
                    href: CCM_APPLICATION_URL + '/index.php?cID=' + parseInt(favorite_pages[i]['url']),
                    text: favorite_pages[i][title]
                }); // リンクを作成
                removedata = $("<button></button>",{
                    id: parseInt(favorite_pages[i]['url']),
                    text: "お気に入りから削除する",
                    class: "btn btn-primary removedata"
                }); // お気に入りから削除するボタン
                textlist = $("<li></li>").html(textdata);
                textlist.append(removedata);
                $("#favoritelist").children('ul').append(textlist);
            }
        }
    } else {
        $("#favoritelist").text("お気に入りはありません。");
    }
}
```

この関数displayFavoritesを、読み込み時に実行します。

```js
$( document ).ready(function() {
    displayFavorites();
});
```

htmlには下記のように記述しておきます。

```html
<h3>お気に入りページ</h3>
<div id="favoritelist"><!-- ここにお気に入り一覧が表示される --></div>
```

### 一覧から削除する

一覧から削除するコードです。この部分は前回とよく似ています。

```js
$(document).on("click", ".removedata", function () {
    var favorite_pages_start = JSON.parse(localStorage.getItem('favorite_pages'));
    var favorite_pages = [];
    if (favorite_pages_start) {
        for(i=0;i<10;i++) {
            if (favorite_pages_start[i] && $(this).attr("id") !== favorite_pages_start[i].url) {
                favorite_pages.push(favorite_pages_start[i]);
            }
        }
    }
    localStorage.setItem('favorite_pages',JSON.stringify(favorite_pages));
    displayFavorites();
});
```

違いとしては、前回は今見ているページをお気に入りから削除、だったのに対して、今回はどのボタンを押したかによって削除するページが変わる点です。
削除するページは、 $(this).attr("id") でページIDを取得して判定しています。

今回のコードは、[心理学のための統計入門](https://statistics.calculator.jp/)で実際に活用しています。
最近の Google 検索に使った単語ランキングを出す

唐突にマイ検索ワードクラウドを作りたくなったので書いてみました。
動かしてみて「確かに今日はこれについてたくさん調べたな」と思い返せるのが目標です。

とりあえず node のローカルスクリプトで実装しました。Webアプリにするには Chrome Extension くらいの権限が必要だと思います。



ブラウザ履歴をとるモジュールに使ったのはこちら。
https://www.npmjs.com/package/node-browser-history


```js
import BrowserHistory from 'node-browser-history'
import { URL } from 'url'
import querystring from 'querystring'
import _ from 'lodash'

function getSearchWord(url) {
	const params = querystring.parse(url.search.substr(1))
	return params.q.split(' ')
}

function isGoogleSearchUrl(url) {
	return url.hostname.match(/www\.google\./)
}

function toRanking(histories) {
	const words = histories
		.map(e => new URL(e.url))
		.filter(isGoogleSearchUrl)
		.map(getSearchWord)
	const counts = _.map(_.countBy(_.flatten(words)), (v, k) => ({
		word: k,
		count: v,
	}))
	return _.orderBy(counts, e => -e.count)
}

;(async () => {
	const history = await BrowserHistory.getChromeHistory(1000)
	const res = toRanking(history[0])
	console.log(res)
})()
```



出力結果

```
[ { word: '原材料', count: 36 },
  { word: '食品', count: 24 },
  { word: '世界', count: 20 },
  { word: '既存', count: 14 },
  { word: '種類', count: 11 },
  { word: '分類', count: 9 },
  { word: '種類数', count: 8 },
  { word: 'firebase', count: 7 },
  { word: 'sns', count: 7 },
  { word: 'node', count: 7 },
...
```

「確かに原材料について調べたな」と思い出せました。
`node-browser-history` にはcount 引数しか無いので、ページングなどの拡張をするには他のものが必要そうです。
Zabbix agent on ___ is unreachable for 5 minutes が出まくる問題

`Zabbix agent on ___ is unreachable for 5 minutes` が出たり消えたり繰り返すようになった。たまに直るし、たまになる。

原因

zabbix-agentのversionがserverより新しかった。

`zabbix_agentd -V` してみましょう。

serverをupgradeして解消。
Unreal Engine 4メモ：DataTableのTips

#パラメータの用途をエディタ上で明示的にする1

Datatableの構造体自体にDisplayNameを追加

- テーブルデータを新規追加時にDisplayNameで指定した文字列でプルダウンメニューに表示される。
- 日本語にすると逆に分かりにくいかもしれないが、注釈を加える程度は役に立つかもしれない。

```c++:Sample.cpp
USTRUCT(BlueprintType, DisplayName = "FShopListParam:商品リストに関するデータ")
struct FShopListParam : public FTableRowBase
{
	GENERATED_USTRUCT_BODY()
};
```
---
#パラメータの用途をエディタ上で明示的にする2

- パラメータにDisplayNameを設定すると、アセットを開いた時にカラム名を自由に設定でき可読性が上がる。
- データ入力ウインドウではDisplayName、Categoryを設定するとその他のアセットのインスペクタと同じように表示される。

```c++:Sample.cpp
USTRUCT(BlueprintType)
struct FShopParam : public FTableRowBase
{
	GENERATED_USTRUCT_BODY()

	UPROPERTY(EditAnywhere, DisplayName = "店舗ID", Category = "店舗番号を入力する。")
	uint32 ShopID;
};
```
---
#UDataTableを入れ子にする

- リレーションしたいときはコレ。但し、csvからインポートして使う場合はパスの指定方法に注意。エディタからだと選んで登録するだけ。
 - もちろんロードすれば、ShopListDataはすぐに使える状態になっている。

```c++:Sample.cpp
USTRUCT(BlueprintType)
struct FShopParam : public FTableRowBase
{
	GENERATED_USTRUCT_BODY()

	UPROPERTY(EditAnywhere, DisplayName = "ショップ商品リスト情報のDatatableアセット", Category = "(テキストでの入力例)「DataTable'/Game/ShopList_TEST1.ShopList_TEST1'」")
	UDataTable* ShopListData;
};
```
---
#デフォルト値を設定する

- コンストラクタでメンバイニシャライザを書くと、エディタ上で新しいレコードを追加した時にその値で初期化してくれる。「0」以外を初期値にしたい場合は便利。

```c++:Sample.cpp
USTRUCT(BlueprintType)
struct FShopParam : public FTableRowBase
{
	GENERATED_USTRUCT_BODY()

	UPROPERTY(EditAnywhere, DisplayName = "店舗ID", Category = "店舗番号を入力する。")
	uint32 ShopID;

	FShopParam() : ShopID(-1) {} // 初めは無効値にしておく
};
```
---
#インポートされたレコードを解析、加工する

- FTableRowBase::OnPostDataImportはカスタム修正や解析などを目的としたインタフェース。
 - Post処理なので、まさにインポートする時に加工して代入ができる訳ではないが、文字列で登録させといて内部的に時間パラメータにパースする等の変則的なコードなら書けそう[^1]。
 - また、解析した結果問題のあるデータが見つかった場合はOutCollectedImportProblemsに文字列を登録するとログに出る（未確認・・・）。

---

```c++:DataTable.h
	/** 
	 * Can be overridden by subclasses; Called whenever the owning data table is imported or re-imported.
	 * Allows for custom fix-ups, parsing, etc. after initial data is read in.
	 * 
	 * @param InDataTable					The data table that owns this row
	 * @param InRowName						The name of the row we're performing fix-up on
	 * @param OutCollectedImportProblems	List of problems accumulated during import; Can be added to via this method
	 */
	virtual void OnPostDataImport(const UDataTable* InDataTable, const FName InRowName, TArray<FString>& OutCollectedImportProblems) {}
```

---

```c++:Sample.cpp
USTRUCT(BlueprintType)
struct FBestRecordParam : public FTableRowBase
{
	GENERATED_USTRUCT_BODY()

public:
	UPROPERTY(EditAnywhere)
		FString RecordString;
	FTimespan Record;

	void OnPostDataImport(const UDataTable* InDataTable, const FName InRowName, TArray<FString>& OutCollectedImportProblems) override final
	{
		auto* tmp = UDataParameter::FindRowByName<FBestRecordParam>(InDataTable, InRowName);
		bool bTryparse = FTimespan::Parse(tmp->RecordString, Record);
		if (!bTryparse) UE_LOG(LogTemp, Warning, L"時間のパースに失敗");
	}
};
```

[^1]: [UE4メモ：DataTableのFTimespan型はインポート出来ない](https://qiita.com/sy_/items/fd0a7b8e20c50849e659)
非線形波動シミュレーション

波動を知るため、シミュレーションしてみた

# テキスト

田中光宏：非線形波動の物理（森北出版, 2017）
http://www.morikita.co.jp/books/book/3022

![nonliner.jpg](https://qiita-image-store.s3.amazonaws.com/0/202534/4da623ae-7320-1293-7e0a-7a2e28a07418.jpeg)

# Burgers 方程式（２章）

Interactive Code
http://nbviewer.jupyter.org/github/Lirimy/simulation/blob/master/burgers_simulation.ipynb

![burgers.png](https://qiita-image-store.s3.amazonaws.com/0/202534/9e19fa67-8a9c-35dc-010c-4a28672d263f.png)

図 2.4 を再現できた
２つの衝撃波が $t=6$ あたりで合体しているのがわかる

# KdV 方程式（５章）

Interactive Code
http://nbviewer.jupyter.org/github/Lirimy/simulation/blob/master/KdV_simulation.ipynb

テキストの式では良いパラメータを見つけられなかったので、こちらのサイトに従った
http://www.isc.meiji.ac.jp/~mizutani/python/sovling_kdv.html

![kdv.gif](https://qiita-image-store.s3.amazonaws.com/0/202534/ffd6f1f0-0e56-bfc9-8177-41b912720251.gif)

見ていると結構おもしろい

1. 波面が垂直に切り立つ
2. 孤立波（ソリトン）が発生する
3. 隣にも次々と孤立波があらわれる
4. 孤立波同士がぶつかる
5. カオスへ

最後のカオスのところが本質的なのか、あるいは単に計算上の誤差や精度の問題であらわれるだけなのかはわからない
【備忘録】<script type="module">でcredentials付きでJSをロードしたい場合はcrossorigin属性をつける

`type="module"`なJSファイルをcredentialsをつけて(jsファイルリクエスト時にクッキーが付く)ロードしたい場合は、crossorigin属性をつけるとできるそうで、試してみたらできました。
参考元: [ECMAScript modules in browsers - JakeArchibald.com](https://jakearchibald.com/2017/es-modules-in-browsers/)

```HTML
<script type="module" crossorigin src="hoge.js"></script>
```
また、このようにロードした場合、ロードしたJSファイル内でimportステートメントでのモジュールファイルロードにおいてもcredentialsが有効となりました。

この仕様、とくにデフォルトの仕様をどうするかはまだ議論中のようで、はっきりしているのが`fetch()`に合わせるということ。でその`fetch()`のデフォルトの動作をどうするかが議論中？
[Script modules and credentials · Issue #2557 · whatwg/html](https://github.com/whatwg/html/issues/2557)
変数の中身を入れ替える際は分割代入を使うとスマート


以下のような二つの変数があるとします。

```ts:変数を2つ用意
let a = 'A';
let b = 'B';
```

分割代入を使うと以下のように書くことができます。

```ts:分割代入を使った値の交換
[b, a] = [a, b];

console.log(`a の値は ${a} です。`);    // a の値は B です。
console.log(`b の値は ${b} です。`);    // b の値は A です。
```

ES2015が使えない環境では以下のように書きます。

```ts:古典的な値を交換するイディオム
let temp = a;

a = b;
b = temp;
```

以下のように一時変数を２つ用意するのは非推奨です。

```ts:冗長な値の交換
let temp1 = a;
let temp2 = b;

a = temp2;
b = temp1;
```
Can't connect to local MySQL server through socket '/tmp/mysql.sock' の解決法

# つまづいたこと

Railsアプリを起動したら、以下の文字が画面に表示された。
ローカルのMySQLに `mysql -u [ユーザー名]`で接続しようとしても同じメッセージだった。

```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

# 解決方法

1.昨日　`/usr/local/etc/my.cnf` に書いた `log-bin=mysql-bin`を消した。

```
# /usr/local/etc/my.cnf

[mysqld]
log-bin=mysql-bin　→これを消した

```

2.さらにMySQLを再起動した。

```
mysql.server restart
```

# 何故発生したのか

以下、調査中です。
昨日変更した設定がbash再起動時に適用されたのか？
`log-bin=mysql-bin` はなぜまずかったのか？

# なぜ`log-bin=mysql-bin` を追加したか

`mysqldump` した時に
`mysqldump: Error: Binlogging on server not active`
が出るエラーの解決方法として紹介されていた。
でも、別の方法で解決したので結局不要となった。
Font Awesome 5 を擬似要素で使う

推奨のSVG with JSは手軽で便利だけれど、擬似要素で使うのがすこし面倒なのと、表示スピードがやや遅いので、Web Fonts with CSSを使うことが多い。

Freeを擬似要素で使うときには、
https://use.fontawesome.com/releases/v5.0.6/css/all.css
の中にある

```
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
display: inline-block;
font-style: normal;
font-variant: normal;
text-rendering: auto;
line-height: 1
```

に加えて、

```
content: '\f138';
font-family: 'Font Awesome\ 5 Free';
font-weight: 900;
```
の3行を擬似要素に指定しなければならない。
freeはfont-weightが900しかないのでこれを指定しないとフォントが表示されない。
警告システム > 「システムの生き血を啜る閾値」に関する案 > chattering対策 | 不感帯時間 | レポートをまとめる

[システムの生き血を啜る閾値](https://qiita.com/aim120g/items/13f973bd4d997491f191)
> このへんの運用設計と実装、他ではどうしているんでしょうね？ 真面目に議論したことがないので興味があります。

どのようにすれば生き血をすすらせないようにするか。

### 用語整理

以下と定義する。

- ON: 危険域
- OFF: 安全域

### 1. chatteringとしての対応

ON,OFFの切替えが一定期間に頻発する場合、chatteringとしての対策は有効かもしれない。

chatteringというのは電子回路のスイッチなどでON, OFF切替えが頻発する症状のことで、その対策は色々考えられている。

http://elm-chan.org/docs/tec/te01.html

「どのくらいの期間」に対して対策するかは要検討だろう。

### 2. 不感帯時間の設定 (思いつき)

1つ目の警告が出た(OFF->ON)後で、不感帯時間の間は次の警告は送信しない、というような機能をつける。

不感帯時間の設定値は実際の運用をしながら決めていく。

**設定を誤ると大切な警告が届かなくなる点には注意が必要だろう**。

### 3. 警告をまとめる

イベント発生のたびに警告を発信すると、警告数が多いときに運用者に大きな負担となる。

適当な長さ(N分間 or N時間)ごとにレポートとして警告をまとめると、警告受信者の負担は減るかもしれない。

緊急を要するイベントはすぐに警告を発してほしいという要望があるかもしれず、その場合はこの案は不適である。

１つのレポート内のイベント数が多い点は変わらず、その点の負担は変わらない。

### 複合対策

1-3の機能を複合利用してもよいかもしれない。

1つの機能の不具合を別の機能がカバーしてくれる。

システムでやけどしそうなものは複数のものでカバーするというのが下記の動画でも紹介されている。
<font color=red>**注意:会社で見ない方がいいかもしれない動画**</font>
[''ÇEKME HELVA'' TRABZON](https://www.youtube.com/watch?v=cqZRq0mNq34&list=PL_MJualihC5AxdlHgVUROYKbNAaPJ5PE4&index=67&t=0s)
tsconfig.json：型定義ファイルのエラー対処法

tsconfig.json の設定に影響して
型定義ファイル（*.d.ts）から型チェックエラーが大量に出てしまった時の対処法です。

**自環境**
* Angular  4.4.6
* TypeScript 2.6.2

----

### 事象
ASP.NET MVC と Angular4 でアプリ開発を行っています。
この度、TypeScript のお勉強も兼ねて tsconfig.json の設定を触っていたところ
こんなエラーが大量に出て実行できなくなりました。

* `エラー	TS2420	クラス '****' はインターフェイス '****' を正しく実装していません。`
* `Error 	TS2420	Class '****' incorrectly implements interface '****'.`

 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/81813/21703ed0-b82e-f500-274f-e03e145c49dc.png)

こういう、どうやら型定義ファイルで（*.d.ts）エラーが出ているのが、大量に。

### 対処

tsconfig.json の compilerOptions 下に以下2つのプロパティを追加

```json:tsconfig.json
{
  "compilerOptions": {
    "skipLibCheck": true,          // すべての型定義ファイル（*.d.ts）の型チェックをスキップする
    "noStrictGenericChecks": true, // 関数型の汎用シグネチャの厳密なチェックを無効にする
  },
}
```

無事エラーがでなくなりました。
exclude に 型定義ファイルを除外する記述を追記するのかと思いきや、プロパティが用意されてるんですね。
とっぴんぱらりのぷう


## 参考：
1. [@angular/core is not compatible with Typescript 2.4.1 when activating option strictNullChecks #17863 - GitHub](https://github.com/angular/angular/issues/17863)
2. [Compiler Options - TypeScript](https://www.typescriptlang.org/docs/handbook/compiler-options.html)
bashのaliasに引数を渡したい

### 目的
発端はssh終了後に明確に抜けたことを表示させるためclearがしたかった。

- やりたいこと `ssh remote-host && clear`

管理するInstanceが多い場合や、ssh-completionで毎回clearを打つのも億劫だったので方法を調べた。

### aliasではうまくいかない
alias だとoptionsと引数の順番は指定できない。
解決策としてfunctionか、適当なコマンドファイル（例えば`ssh.sh`）を作る。
今回はコマンドファイルを作成する。

### コマンドファイル
パスの通ったディレクトリーに、以下のファイルを作成する。

```bash:ssh.sh
#!/usr/bin/env bash
ssh $@ && clear
```

さらに、今回は標準コマンドのsshの名称を使いたいので、aliasで追加する。
`~/.bashrc`や`~/.bash_profile`に以下を追記。
aliasが利用出来るので任意の名称が使えますのでコマンドと同じscript名に抵抗がある場合は適宜置き換えて下さい。

```bash:.bash_profile
alias ssh="~/.sh/ssh.sh"
```

### 参考
[bashのalias に引数を渡すには？ - それマグで！](http://takuya-1st.hatenablog.jp/entry/2015/12/15/030119)
Microsoft AZURE の画像APIから1000枚以上取得する

##やりたいこと

機械学習をやっていくにあたって、学習用に画像を大量に取得しなければいけない事がありまして、MicrosoftAzureの画像検索APIを使えば、bingの検索結果から画像を取得できるようなのでやってみました。

```python

query = #検索したい単語を入力してください
dir_name = #結果の保存先のディレクトリ名を指定してください
all_img = 1500 #取得したい画像の数を指定してください(最大数は1500です)
current_dir = #カレントディレクトリを指定してください

ENDPOINT = 'https://api.cognitive.microsoft.com/bing/v7.0/images/search'
HEADERS = { 'Ocp-Apim-Subscription-Key': '自分のAPIキーを入れてください' }
params = {'q': query,
         'mkt': 'ja-JP',
         'count': 50}

#count毎に分けてAPIから画像のURLを取得し、json形式で得られるので、ロードし
#てリストに加えます
def  GetImageUrls(endpoint, headers, params):
    ImageUrls = []
    for i in range(int(all_img) // params['count']):
        offset = i * params['count']
        params['offset'] = offset
        
        response_json=requests.get(endpoint
                ,headers=headers,params=params)

        response = json.loads(response_json.text)
        
        for i in range(params['count']):
            try:
                ImageUrls.append(response['value'][i]['contentUrl'])
            except:
                continue
    return ImageUrls

#保存するディレクトリがなければ作ります
def mkdir(dir_name):
    if os.path.isdir(current_dir + '\\' + dir_name) == False:
        os.mkdir(current_dir + '\\' + dir_name)
    else : pass

#先ほど作ったリストから画像を取得し、jpg形式で書き込みます
def DLimages(ImageUris, dir_name):
    mkdir(dirname)
    timeout = 5
    num_err = 0
    num_suc = 0
    i = 1
    for ImageUrl in ImageUrls:
        try:
            response_image = requests.get(ImageUrl, timeout=timeout)
            image = response_image.content
        except requests.exceptions.RequestException:
            num_err += 1
            continue
        
        with open(current_dir + '\\' + dir_name + '\\' + str(i) + ".jpg", 'wb') as f:
            f.write(image)
            f.close()
        
        i += 1
        
        num_suc += 1
    print('error:' + str(num_err))
    print('suc:' + str(num_suc))

#関数を作り終わったので

image_urls = GetImageUrls(ENDPOINT, HEADERS, params)
DLimages(image_urls, dir_name)
```

以上で、指定したディレクトリに名前が数字のjpg画像が保存されています。
ただし、もともとbingの検索結果が1500もないと少なくなります。
また、画像のurlが指定されていないと追加されません

さらに、jpgだけに指定してしまっているので、結果を見るといくつか開けないファイルが存在します。これを防ぐためには、取得してきた時点でファイル形式を確認し、その形式に合わせて保存しなおす必要があります。
du -h -d 1 | sort -h が優勝

## du コマンドでディレクトリごとのディスク使用量をみよう

LinuxサーバーやMacでディスク使用量をみるのに便利なコマンドが、du。

素のduだとこういう動き

- 全階層をたどって
- ディスクの使用量をバイト数で表示

このままだとちょっと不便。

- 今いるディレクトリの一回層目だけをとりたい
- バイト数じゃなくて、GBやMBの単位でみたい
- サイズ順に並べたい

## これが一番便利なオプション

```sh
$ du -h -d 1 | sort -h
```

## 解説

- -h で人が見やすいGBやMBの単位にしてくれる
- -d 1 で一回層目だけ計算してくれる
- sort を使うんだけど、10M と 1G の表示は、1Gの方が大きいとみなして並び替えてくれる

## 使い方

一回

```sh
$ du -h -d 1 | sort -h
  0B	./lib
  0B	./log
  0B	./tmp
4.0K	./.bundle
 20K	./db
 24K	./bin
 44K	./test
 92K	./config
236K	./app
9.0M	./.git
 12M	./public
 13M	./vendor
 34M	.
```

以降は、

```sh
$ !du
```
で、先の長いコマンドを再利用。

## 感想

- いろんなコマンドで -h というオプションがあるのは知っていたけど、sort にも -h があるというのは超優しいね（これ昔なかったよね）
-  sort -h -r  を使えば降順にソートもできるけど、大きなディレクトリが下にあった方が見やすいので昇順のままでいい
- df と du 間違えがちなのはこっ恥ずかしいので内緒
iframeのonload呼び出し順

iframeの読み込みが完了後、onloadが動作するのか検証
すぐ読み込みが完了してしまうとテストできないので、iframeの読み込みを5秒遅らせる



```php:iframe呼び出し先
<?php
sleep(5);//5秒待機
echo 'iframetest';
?>
<html>
  <script type="text/javascript">
     alert('一番初めに実行されます');
   </script>
</html>
```

```html:iframe呼び出し元
    <body>
        <iframe onload="alert('2番目に実行されます')" src="//***">
        </iframe>

        <script type="text/javascript">
            $(window).load(function() {
                alert("最後に実行されます");
            });
        </script>
    </body>
```

##結果
1. iframeの読み込み
2. iframeの読み込み完了後、iframeのonload
3. 最後にwindow onload
Slackのユーザープロフィールアイコンを一括ダウンロードする

社内で使う発表資料を作る際に、各チームメンバーのSlackアイコンを集める作業が頻発するので、1ライナーを書いてみた。

```
curl https://slack.com/api/users.list -d "token=$OAUTH_TOKEN" \
  | jq -r '.members[] | select(.deleted == false) | select(.is_restricted == false) | select(.is_bot == false) | .profile.image_72, .name' \
  | xargs -n 2 sh -c 'curl -L $0 -o $1.png'
```

こんな感じ。
新 Qiitaのフィードから特定ユーザーの投稿を非表示にするユーザースクリプト

[Qiitaのフィードから特定ユーザーの投稿を非表示にするユーザースクリプト - Qiita](https://qiita.com/khsk/items/392ec147c4962caed9ca)


<font color="white">
ファーストビューがトレンドになって頻繁に目に入るようになった。
トレンドに入ることでいいねが増え掲載期間が伸びるのか、バズりやすい記事はずっとトレンドに入る。
タイムラインやタグフィードと異なり自分ナイズできない&流れないので、延々と好きでない投稿を突きつけられて前作時代よりストレスを感じていることに気付かされた。
対象記事・ユーザーのいいねが増えていることさえもストレスに感じるのは流石に自分の狭量さに辟易とするが、煽りタイトルなのが拍車をかけて辛い。そういったタイトルが伸びやすそうな雰囲気があるのも辛い。
ファーストビューはタイムラインにするか、
フォロータグのトレンドにするか(これは効果薄か)
アドオンみたいにトレンドを既読にして再表示しない機能が欲しい。
</font>

# 動作検証環境

* Firefox 58
* Greasemonkey 4.2

# コード

Gistスクリプトリンク[Qiita_user_filter_for_feed.user.js](https://gist.github.com/khsk/3ba7b2f2148f8d757d26b49ded5ae082/raw/c5bc744b5b732f1a9bbb4116061a6bce768f2ada/Qiita_user_filter_for_feed.user.js)

```js:Qiita_user_filter_for_feed.user.js
// ==UserScript==
// @name        Qiita user filter for feed
// @namespace   khsk
// @description フィードから特定ユーザーの投稿を非表示にする
// @include     https://qiita.com/
// @include     https://qiita.com/trend
// @include     https://qiita.com/timeline
// @include     https://qiita.com/tag-feed
// @version     1
// @grant       none
// ==/UserScript==

console.time('userfilter');

const NG_USERS = [
];

const filtering = () => {
  // トレンド, ユーザーランキング, タイムライン アイコンリンク, タグフィード アイコンリンク(こっちはユーザー名リンクでもよかった), おすすめユーザー(多分出ないけど)
  const targets = document.querySelectorAll('a.tr-Item_author, div.ra-User_screenname>a, a.tl-ItemContent_userImage, a.tf-ItemContent_userImage, a.tl-RecommendedUser_screenname')
  Array.prototype.forEach.call(targets,function(target){
    user = target.href.match(/https?:\/\/qiita.com\/([^/]+)/)[1];
    if (NG_USERS.indexOf(user) != -1) {      
      switch (target.className) {
        case 'tr-Item_author':
        case 'tl-RecommendedUser_screenname':
          target.parentNode.parentNode.parentNode.parentNode.style.display = 'none';
          break;
        case '':
          target.parentNode.parentNode.parentNode.parentNode.parentNode.style.display = 'none';
          break;
        case 'tl-ItemContent_userImage':
        case 'tf-ItemContent_userImage':
          target.parentNode.parentNode.parentNode.style.display = 'none';
          break;
        default:
          console.log(target);
          break
                              }
    }
  });
}

// 変更を監視する。追加分だけには対応しておらず、毎回全チェック。
var mo = new MutationObserver(function(data1, data2) {
	filtering();
});

// 監視対象が大きいが妥協
const root = document.querySelector('div')
const options = {childList: true, subtree:true};
mo.observe(root, options);
filtering();
console.timeEnd('userfilter');

// todo コメント非表示 需要が生まれたら
```


[Hiroyuki Tomine (とみね）さんのツイート: "ユーザー単位のスパム報告ですかねー、確かに。記事は用意があるんですが🙏 ミュート機能は現在実装中です～… "](https://twitter.com/htomine/status/977024421943697408)
実装中だって。
Unity GPS　LocationServiceStatus.Initializingのままになる

iosでGPSがLocationServiceStatus.Initializingのまま進まない状態になってて、
原因は設定のLocation Usage Descriptionが未記載だったから。
ここ適当に記載したら動いた。
ios10以降？必須みたいなのに変わってるらしい。

<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/47d254b3-7002-803d-9f24-0eda4095ce9e.png" width="300">
Ruby の map の中で return すると外側のメソッドを return してしまう

当たり前じゃん！と言われるかもしれないけど、ハマったのでメモ。

## ハマった事象
Ruby で以下のようなコードを書いていた。
(あくまでサンプルなので細かいとこにツッコミたくなってもグッとこらえてください)

```ruby
def all_negative?(items)
  results = items.map do |item|
    return false unless item.is_a?(Numeric)
    item < 0 ? true : false
  end
  results.all?
end
```

引数に配列を与えて、すべての要素が負の数であるかどうかを判定するメソッドであるが、数値以外は数値と比較できないので、Integer でなければ予め `return false` する、という処理を書いてある。

このメソッドを実行すると一見ちゃんと動く。

```ruby
all_negative?([-1, -2])
# => true

all_negative?([-1, :hoge, 1])
# => false
```

しかしこれ、実は `return false` をした時点で、ループをぶった切って `all_negative?` 自体が `false` を返してしまっている。
map は戻り値で配列を作るんだ！と思い込んでたけど、 `return` しちゃうとまずいということを知らなかった。

試しに `results.all?` でなく `results?` を返すようにしてやるとよくわかる。

```ruby
def all_negative?(items)
  results = items.map do |item|
    return false unless item.is_a?(Numeric)
    item < 0 ? true : false
  end
  results
end

all_negative?([-1, -2])
# => [true, true]

all_negative?([-1, :hoge, 1])
# => false
# => 本当は [true, false, false] となっていて欲しい
```

後者は配列ではなく直接 false を返してしまっている。
今回の場合ではたまたま偶然困らないけど、例えばループ内で何か別の処理をするような場合、メソッドの戻り値は正しいけど処理されてないものがある…ということになりかねない。というかなった。

## 本来はどう書くべきか
今回のような場合であれば、`return` ではなく `next` を使うべきだった。
`next` は引数を与えてやればその引数を返すようになるので、`return` をそのまま `next` に変えてやればOK。

```ruby
def all_negative?(items)
  results = items.map do |item|
    next false unless item.is_a?(Numeric)
    item < 0 ? true : false
  end
  results
end

all_negative?([-1, -2])
# => [true, true]

all_negative?([-1, :hoge, 1])
# => [true, false, false]
```

参考: [rubyのnextに引数与えるとnil返さずにすむのしらなんだ](https://qiita.com/mdaisuke/items/07c91989833d5108ffed)
1. クラスター計算機で udocker を利用する: 紹介編

# docker が動かないなら udockerを使えばいいじゃない

docker はとても便利なツールで、Windows/OS X/Linuxと各環境下動作する
これまでは様々なツールの使い勝手を試そうと思っても

* そのツールをコンパイルする事が困難だったり
* コンパイルできてもライブラリーの思わぬ差で動作しなかったり
* 動作しても正しくは動作しなかったり
* そのツールが利用している他のツールが動かなかったり

どんなに良さそうなツールでも、いざ利用するまでの手間が大変だった

dockerはこの一連の苦痛を相当程度和らげてくれてる

* もしそのツールがdocker hub に置かれているならば、コマンド一発でダウンロードして試してみる事ができる
* docker hubに無くても、ツールの動作環境が記載されていれば、その環境に近い imageを元に割りと簡単にツールが動作する環境をつくりだせる

そんなdockerにもちょっとした弱点が有る
手元のコンピューターにdockerの環境を構築するのはとても容易で、Windows/OS X/Linuxどれも基本的にはインストーラーを起動して指示に従うだけ

ただ、手元のコンピューターでそれが動作したら、可能ならそのまま自分が利用できる大きな計算機でも使ってみたいと思うだろう

ここから困難が始まる

あなたの利用できる計算機に既にdockerの環境が準備されていたら

* 利用規約を確認
    * 恐らく、コンテナ内で実行可能なアプリケーションについては、システム管理側の要請による何らかの制約はあると思う
* docker コンテナをpull して実行

もし、dockerがインストールされてなくて、さらにdocker環境の構築も色々な制約で困難だったときはudockerを利用しよう

## udockerとは何か

udockerの特徴にはこんなものがある

* dockerがインストールされていなくても、docker イメージを利用できる
* docker hubから イメージをダウンロードできる
* まるで普通のdockerを利用しているかのようにコマンドを実行できる
* udockerのインストールも実行も完全に自分のユーザー権限で行う事ができる

一方で、udockerにはこんな制約がある

* ホストのOSはLinuxに限定される
[proot](https://proot-me.github.io)が動く環境が必要
* ネットワークは仮想化できない
    * 仮想ネットワークを作成してルーティングを...などという事はできない
    * docker composeは利用できない
* システムの管理権限が必要なリソースを操作する事はできない
    * 例えば一般ユーザーはネットワークのポート番号1024以下のポートを直接操作できないので、80番ポートでウェッブサーバーを起動する等という事はできない。 
* 仮想環境を利用しているかのようにリソースをマッピングしているだけだということを常に意識する必要がある
    * ファイルの操作は実環境のファイルに対して実行されているので、"rm -r" 等の操作には十分注意が必要
    *  実行環境毎にディレクトリを分けないと複数のプロセスで上書きするという悲惨な事になりかねない

という事で、udockerは何かを紹介したところで今日はここまで:smiley:
composerでforkしたリポジトリの新しいバージョンを使用する


公式リポジトリがメンテナンスされていないのでforkされた新しいリポジトリを使いたいとき。

composer.jsonの`repositories`にforkされた新しいリポジトリを追加すると新しいリポジトリを参照してくれます。

```composer.json
"repositories": [
	{
        "type": "vcs",
        "url": "git@github.com:MatthewPattell/php-fcm.git"
    }
],
"require": {
    "grohiro/laravel-firebase": "1.0.1",
    "paragraph1/php-fcm": "0.8"
}
```

ここで別のパッケージ `grohiro/laravel-firebase` が `dependencies` で `php-fcm`のバージョン`0.7`を参照しているとバージョン不一致でエラーになります。

```
Problem 1
  - grohiro/laravel-firebase 1.0.1 requires paragraph1/php-fcm ^0.7.0 -> satisfiable by paragraph1/php-fcm[0.7] but these conflict with your requirements or minimum-stability.
  - Installation request for grohiro/laravel-firebase 1.0.1 -> satisfiable by grohiro/laravel-firebase[1.0.1].

```

自分が要求しているのが `php-fcm@0.8`、laravel-firebaseパッケージが要求しているのは `php-fcm@0.7` です。
ここでバージョンを `0.8` に上げても問題ないなら上書きしてしまいましょう。
`require`のバージョン指定で `as` を使用するとバージョンに別名を付ける事ができます。

```
"require": {
    "grohiro/laravel-firebase": "1.0.1",
    "paragraph1/php-fcm": "0.8 as 0.7"
}
```

これでバージョン`0.8`を`0.7`として扱う事ができました。

## 参考
- [Aliases - Composer](https://getcomposer.org/doc/articles/aliases.md)
- [php - How to override others dependencies in composer.json - Stack Overflow](https://stackoverflow.com/questions/30170005/how-to-override-others-dependencies-in-composer-json)
ProgressDialogが非推奨(deprecate)になっていた


Cloud Firestoreからデータを取得している間、プログレスバーを出そうかな〜と思って `ProgressDialog`クラスのインスタンスを作成したら横線が引かれた。

![スクリーンショット 2018-02-21 10.48.43.png](https://qiita-image-store.s3.amazonaws.com/0/139360/124fdc5e-bf4c-d4b4-f686-ab1e64f7257e.png)


## 公式ドキュメントをみてみる

https://developer.android.com/reference/android/app/ProgressDialog.html

ドキュメント見るとこう書かれていた。

This class was deprecated in API level 26.
ProgressDialog is a modal dialog, which prevents the user from interacting with the app. Instead of using this class, you should use a progress indicator like ProgressBar, which can be embedded in your app's UI. Alternatively, you can use a notification to inform the user of the task's progress.



これが確かにProgressDialogが出ている間アプリはなにも操作できないのでその方がいいかも。
(昔自分もこれでハマった)
ERROR 1067 (42000): Invalid default value for 'created_at'

### 問題
````
  SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default val
  ue for 'updated_at' (SQL: ALTER TABLE notices CHANGE created_at created_at
  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP;)
````
````
SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default val
  ue for 'updated_at'
````
### 対策
/etc/my.cnfを変更
````
[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
````
※SET GLOBAL sql_mode = 'xxxx' でも変更可能だが、再起動するとシステム変数が戻ってしまうので、設定ファイルから変更

### 原因
　0000-00-00 00:00:00 を許容しないため？

### 背景
 タイムスタンプのデフォルト値に実行日付を設定しようとしたら、
マイグレーションが完了しない。


### 環境
 mysql 5.7.20
 EC2 Linux (x86_64)

### ◆参考
https://stackoverflow.com/questions/36882149/error-1067-42000-invalid-default-value-for-created-at

システム変数の表示と変更
http://www.ksknet.net/mysql/post_102.html
例のGCEインスタンスでログが大量発生してディスク容量が100%になる問題について

日本語のドキュメントがググってもなかったので、とりあえず自分用メモを晒します。

こういうエラーが`/var/log/messages`に大量に吐かれて、ファイル容量を圧迫するのが原因です。

```
Cannot read proc file system: 9 - Bad file descriptor.
```

これはGCEのバグだとされています。
https://groups.google.com/forum/#!topic/gce-discussion/Eyf_ZUoK7Nc

このディスカッションによると、この問題に対して2/7にパッチが当たっています。

**2018.3.6 追記**
2018.3.6日現在、まだ問題が継続して発生していました。

**2018.3.28 追記**
https://issuetracker.google.com/issues/72874427
ここで書かれているとおりに、下記のようにプロセスの再起動を行うと、今の所落ち着いています。

```bash
sudo pkill syslogd 
sudo umount -l /proc
sudo mount proc /proc -t proc 
sudo service rsyslog start
```

# とりあえず解決したいなら
すぐにでも解決したい人は、sshで入って下記のコマンドを実行すれば解決します。
ただそれだとエビデンスが取れないので、下記の手順で確認していくことをおすすめします。

```bash
sudo su -
rm -rf /var/log/messages*
```


# サーバーのディスク状況を確認する

SSHでサーバーに接続して

```bash
df -h
# を実行すると
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       9.8G  9.8G     0 100% /
tmpfs           851M     0  851M   0% /dev/shm
# こんな感じで出力されます
```

/dev/sda1 というのが、GCEインスタンスのディスクとしてマウントされたものです。
Sizeが9.8に対して、Usedが9.8なのAvailが0になり、Use%は100%になっています。

# ディスクを埋めている場所を探す

```bash
# rootになって
sudo su -
# ファイルを大きい順にリストアップさせます。
ls -lhS / | sort -nr -k5 | head -10
# リストアップしたもの
9690	/
7926	/var
7661	/var/log
3886	/var/log/messages
3708	/var/log/messages-20180204
742	/usr
633	/lib
570	/lib/modules
350	/usr/share
159	/opt/rh/python27/root/usr
```

こうすると上から順に見ていくので、まずルートディレクトリの容量が大きい(当たり前)ので、それから順に容量の大きい順になっています。
このバグの場合は、`/var/log/messages`とその子どもたち`/var/log/messages-<日付>`のファイルに大量に`Cannot read proc file system: 9 - Bad file descriptor.`と吐かれてしまうのが原因です。
zabbixでpermission 777のフォルダを見つけたらアラートする

マカーなのでディレクトリよりフォルダと呼ぶのが好きです。

logrotate対象のディレクトリが777だと [because parent directory has insecure permissions.](https://ma.ttias.be/logrotate-on-rhelcentos-7-complains-about-insecure-permissions-on-parent-directory-world-writable/) などと怒って仕事を放棄するので、それを検知するzabbix userparameterを書きました。

手抜きなので `.conf` ひとつで書いちゃいました。これだと見づらいのがzabbix userparameterの残念なところです。真面目にやるときは `.sh` にしましょう。

# zabbix item
```shell
$ cat findpermission.conf 
# permissionチェックツール
# 777のフォルダが有るとlogrotateがコケるときがあるので、怪しいフォルダがないか探すために作成
# 
# 対象dirに 777 のフォルダがあればそのリストを、なければ 0 を返す

# How to use
# Item:
#  Type: Zabbix agent
#  Type of information: text
#
#  findpermission[permission,<location>]
#
#  @param permission(int)        777, 644 など探したいdirのpermission(octal)
#  @param location(string)       "/var /home" など探したい親フォルダのフルパス
#  @return (string)              ヒットしたdirリスト or 0
#
# Trigger:
#  findpermission[777].count(#3,0,eq)}<>3
#  意味：0が返ってきた回数が３回中３回じゃなかったら＝３回連続で777のフォルダを見つけたらアラート実行
#
#### チェックコマンド
#### $ zabbix_get -s 192.168.1.3 -k "findpermission[777]"
#### 0 が返れば検索結果ゼロ。見つけた場合は777のフォルダリストを表示します。

UserParameter=findpermission[*],if [ -z "$1" ]; then echo "Please specity one octal permission. e.g. findpermission[777]"; exit 1; fi; if [ -z "$2" ]; then DIR="/var/log"; else DIR=$2; fi; if [ `find $DIR -type d -perm $1 | wc -l` -eq 0 ]; then echo 0; else echo -e "Directories below have permission $1.\n"; find $DIR -type d -perm $1; fi;
```

# trigger
私のzabbix scriptは、zabbix上で「何が悪いのか？」まで見えるようにする信条があるので返り値はだいたい以下になってます。

- 成功： `0`
- 失敗： エラー原因をstringsで表示

zabbix v3.0.x 以外はこれをnumericで受け取れないので、itemは `text` で受け取って、以下のtriggerで検知させます。

     findpermission[777].count(#3,0,eq)}<>3

※ 数値じゃないので単純な比較演算ができないのです

# results
こんな感じで、残念なサーバの状況を洗い出せました。あとはこれをひとつずつなんとかしていきたいと思います。除外することになるものもあるでしょう・・。
![2018-02-21_10h32_16.png](https://qiita-image-store.s3.amazonaws.com/0/24737/c1847154-fbd9-082e-cbee-283f9031b731.png)

zabbix上でひっかかったフォルダのリストまで確認できてます。
![2018-02-21_10h16_16.png](https://qiita-image-store.s3.amazonaws.com/0/24737/9f91fd99-b242-56ce-da33-25d2f7af7bf6.png)

アラートなど鳴らさず直接 chmod してもいいのですが、しばらくは現状把握の意味でこれを回しておきたいと思います。

新しい技術にトライしているときなどは 777 は有用なので、絶対悪としては扱いたくない所存です。
Grepが無い……

ふとWindowsServerには
Grepが無い事に気がついてしまいました……

なので調査してみると……

(Windows)Windowsでgrepする = findstr
http://blog.goo.ne.jp/shinx1265/e/44ad3b2df1a7ea1a61da504500a5725a


WindowsコマンドプロンプトでUNIXの「grepコマンド」に似た「findコマンド」が結構便利です！
http://w5300.com/it/215/


とあるので
findで解決しようと思いましたが
>test.txt
で書き込んで紅……orz
log調査なんかでワンライナーPerlつかうとき用忘備録(正規表現 置換)

経緯
===
logから特定の文字列を取り出して、起こった事象の詳細が知りたい。
sedよくわからん。Perlでいいや。

結論
===

```
cat error.log | perl -anle 'if(s/<なんかマッチパターン>/<なんか置換文字列>/){print}'
```

みそは `n` オプションと `if(s///){print}`

結論に至るまで
===

最初特に考えなしに単純に `s///` だけ書いて、print書かなくても出力されるように `p` オプションをつけて実行した。

```
cat error.log | perl -aple 's/<なんかマッチパターン>/<なんか置換文字列>/'
```

そのときは後ろにさらに `jq` くっつけて整形していたんだけども、json形式じゃないってエラーがでていた。
どうやら `p` のおかけでマッチしてない部分についても、 `$_` が出力されてしまっていたようだった。

ということで[結論](#結論)に至った。

参考
===

ワンライナーperlについてはこちらの記事が簡潔。
https://qiita.com/ngyuki/items/d5dde70cf2de952cfb87

詳しくオプション知りたければ `perldoc perlrun`