OmniAICreator/Qiita-1.07M huggingface dataset:
SmartGit > Filesペインがpink色になった状態 | 対処 | UI: 色だけの警告では対処方法が分からない

```txt:動作環境
C++ Builder XE4
Windows 7 Pro (32bit)
SmartGit Version 17.1.5 #11217, installed: #11182
C++ builder XE4
```

### 状況

Filesペインがpink色になった。
どういう状況だろうか?

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f10e8cd4-e700-40ce-5d54-de29a1625024.png)

### 対処 > 処理されていないファイル

Filesペインの上にあるアイコンのうち「If selected, not yet version controlled files will be shown. 」というヘルプを持つアイコンがある。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f0abc91c-b2e5-6350-169a-1662f7fc06e8.png)

そのアイコンをクリックして機能を有効にすると、.vlbファイルが表示された。
(.vlbファイル: C++ Builderのファイル)

そのファイルをリポジトリに追加してコミットするとFilesペインの色は通常のwhiteに戻った。

### UI: 色だけの警告では対処方法が分からない

SmartGitは分かりやすいUIであると思っていたが、今回のUIは分からなかった。

Filesペインに出ている注意であるので、その関連性があると推測した。

色表示だけでなく、「some files are not yet version controlled」のようなメッセージがあれば分かりやすいように思う。

関連: 

- [運用者に優しいエラーメッセージ](https://qiita.com/aim120g/items/3445b34039a8dafaf57a)
- [良いエラーメッセージの書き方](https://qiita.com/castaneai/items/da6baec750370689e2fa)


SmartGitはManualが読みやすくない。


### Supportからのメール

サポートの方からメールが届いた。
untracked fileがあるよ、とのこと。
上記の対応で正しいようだ。

サポートの方って、どうもあの人のような気がするが。。。
自分の作ったソフトウェアを大切にしようとする心の現われだろうか。
mariabackupをMroongaに対応させる

　mariabackup が Mroonga のファイルに対応していなくて不便だったので、とりあえずpatchを作ってみた。
　作成元は mariadb-10.1.31.tar.gz 。

~~~diff:files/patch-extra_mariabackup_backup_copy.cc
--- extra/mariabackup/backup_copy.cc.orig       2018-02-04 11:30:30.000000000 +0900
+++ extra/mariabackup/backup_copy.cc
@@ -2044,6 +2044,15 @@
                if (!pname)
                        pname = info.name;

+               /* copy mroonga files */
+               const char *mrn_file = ".mrn";
+               if (strstr(pname, mrn_file) != NULL) {
+                       ret = copy_file(ds_data, info.name, info.name, 1);
+                       if (!ret) {
+                               break;
+                       }
+               }
+
                /* Copy aria log files, and aws keys for encryption plugins.*/
                const char *prefixes[] = { "aria_log", "aws-kms-key" };
                for (size_t i = 0; i < array_elements(prefixes); i++) {
~~~


　datadir内のファイルをコピーをしている部分があったので、ファイル名に".mrn"が含まれている場合もコピーするようにしてみた。コピーしたあとはcontinueとかしたほうがいいような気もする。
（あと、aria log等をcopy_file()してるとこでretのチェックしてるけど、forの外でもbreakしなくていいのかはちょっと気になった）


### 補足
　ロックの状態等によっては上記の修正ではNGかも？　と思ってソースを確認したところ、いちおうロック取得後に実行されている模様。
（backup_start()内で、lock_tables() の後でbackup_files()及びbackup_files_from_datadir()が実行されていた。上記はbackup_files_from_datadir()内の修正）

### 補足2
　xtrabackup2.3も同様に対応できるんじゃないかと思ったのですが、backup_copy.ccにbackup_files_from_datadir()に相当する部分がなかったので、そこも作る必要がありそうでした。
（mariabackupと同様の処理をするように修正すれば動きそうではありますが）
RedisのSorted Setsで同一スコアの場合、順位をランダムにしたい

タイトルの通り、Sorted Setsで取ってきたランキングで、同一のスコアの場合は順位をランダムにしたい。

```ruby
# こんなデータがあったとして
ids_and_scores = [[10010818, 155.0],[10026928, 150.0],[10025650, 150.0],[10023988, 150.0],[10023708, 150.0],[10023820, 115.0],[10025925, 110.0],[10024209, 110.0]]

# ここと
[10026928, 150.0],[10025650, 150.0],[10023988, 150.0],[10023708, 150.0]

# ここの順番をランダムにしたい
[10025925, 110.0],[10024209, 110.0]
```

まずは重複しているスコアを取ってくる。

```ruby
duplicate_scores = ids_and_scores.group_by { |id_score| id_score[1] }.select { |score, ary| 1 < ary.size }.keys
# => [150.0, 110.0]
```

重複しているスコアの場合は配列にまとめる。

```ruby

last_score = 0
id_ary_tmp = ids_and_scores.inject([]) do |output, id_score|
  if duplicate_scores.include?(id_score[1])
    if output.last.class == Array && last_score == id_score[1]
      output.last << id_score[0]
    else
      output << [id_score[0]]
    end
  else
    output << id_score[0]
  end
  last_score = id_score[1]

  output
end
# => [10010818, [10026928, 10025650, 10023988, 10023708], 10023820, [10025925, 10024209]]
```

重複しているスコアの配列をシャッフルして`flatten`で配列を作り直す。

```ruby
id_ary = id_ary_tmp.map do |id_ids|
  if id_ids.class == Array
    id_ids.shuffle
  else
    id_ids
  end
end.flatten
# => [10010818, 10023988, 10025650, 10026928, 10023708, 10023820, 10024209, 10025925]
```

メソッドにまとめる。

```ruby
# 同スコアの場合はランダムで順位づけしたい
def sort_id_considering_duplicate_scores(ids_and_scores)
  duplicate_scores = ids_and_scores.group_by { |id_score| id_score[1] }.select { |score, ary| 1 < ary.size }.keys
  last_score = 0
  id_ary_tmp = ids_and_scores.inject([]) do |output, id_score|
    if duplicate_scores.include?(id_score[1])
      if output.last.class == Array && last_score == id_score[1]
        output.last << id_score[0]
      else
        output << [id_score[0]]
      end
    else
      output << id_score[0]
    end
    last_score = id_score[1]
    output
  end

  id_ary = id_ary_tmp.map do |id_ids|
    if id_ids.class == Array
      id_ids.shuffle
    else
      id_ids
    end
  end
  id_ary.flatten
end
```

一応動いているっぽいけどもっとシンプルにできそう。。。

```ruby
sort_id_considering_duplicate_scores(ids_and_scores)
# => [10010818, 10026928, 10023988, 10023708, 10025650, 10023820, 10024209, 10025925]

sort_id_considering_duplicate_scores(ids_and_scores)
# => [10010818, 10026928, 10023988, 10025650, 10023708, 10023820, 10024209, 10025925]

sort_id_considering_duplicate_scores(ids_and_scores)
# => [10010818, 10023708, 10025650, 10023988, 10026928, 10023820, 10024209, 10025925]

sort_id_considering_duplicate_scores(ids_and_scores)
# => [10010818, 10023988, 10025650, 10023708, 10026928, 10023820, 10024209, 10025925]

sort_id_considering_duplicate_scores(ids_and_scores)
# => [10010818, 10025650, 10023708, 10023988, 10026928, 10023820, 10025925, 10024209]

```

※バグがあったので一部修正。
ベイズ線形回帰

自分が機械学習の研究をするであろうことが決まったのでそれに向けて様々な回帰手法や分類手法を勉強しようと思い立った。
ただノートにまとめるだけなのもつまらないのでこの場に雑にアウトプットしていこうと思う。

##回帰
回帰というのは入力**x**とそれに対応する出力yが複数組判明している時に
$$y=f(x)$$
というモデルを当てはめることである。
このモデルが推定できて何が嬉しいかというと出力がわからない入力**x**をモデルに当てはめることで出力を推定することができることだ。
したがってこのモデルのクオリティが推定のクオリティに関わってくる。
![Normdist_regression.png](https://qiita-image-store.s3.amazonaws.com/0/242603/5da7b903-5752-aca8-1e6a-535632560db1.png)
(画像はWikipedia 回帰分析より)

##線形回帰
まず回帰分析の中でもベーシックな線形回帰について
線形回帰というのは先ほど述べたモデル$f(x)$がパラメータ$\omega$を用いて
$$f(x)=\omega^Tx$$
というふうに線形和で表せると仮定する。
ここにノイズ$\epsilon 〜 N(0,\sigma_{n}^2)$を加え、
$$y = f(x)+ \epsilon$$
というモデルを仮定する。
$f(x)$を決めるということはすなわちパラメータ$\omega$を定めることである。
$\omega$を決める際に、どういう$\omega$がいいのか評価をする基準としては、
二乗誤差
$$E(\omega)= \sum_{i=1}(y - \hat{y}\ )^2$$
を最小にする$\omega$を採用する最小二乗法がある。

##ベイズ線形回帰
ベイズ線形回帰では、目的はやはり$\omega$を推定することなのだが$\omega$が従う確率分布を推定するというアプローチをとる。
具体的な戦略は、まず何もデータを得られていない状態で$\omega$の分布（事前確率）を定める。
$$\omega 〜N_{n}(0,\Sigma_{p})$$
ここから観測データy,xを元に事後確率$p(\omega|y,X)$を求める。

```math
\begin{eqnarray}
p(\omega|y,X) &=&\frac{p(y|X,\omega)p(\omega)}{p(y|X)} \\
              &\propto&p(y|X,\omega)p(\omega) \\
              &=& 略\\
              &\propto&\exp \left[ -\frac{1}{2} \left\{ \omega-\frac{1}{\sigma_{n^2}} \left( \frac{1}{\sigma_{n^2}}XX^T + \Sigma_{p}^{-1} \right)^{-1}Xy \right\}^T \left( \frac{1}{\sigma_{n^2}}XX^T + \Sigma_{p}^{-1} \right) \left\{ \omega-\frac{1}{\sigma_{n^2}} \left( \frac{1}{\sigma_{n^2}}XX^T + \Sigma_{p}^{-1} \right)^{-1}Xy \right\} \right]
\end{eqnarray}
```
１行目の式の導出がよくわからない。
ベイズの定理を用いているのだろうが前提が複数ある時の変形が調べてもなかなか出て来なかった。
式を見やすくするために、$A=\frac{1}{\sigma_{n^2}}XX^T + \Sigma_{p}^{-1}$, $\bar{\omega}=\frac{1}{\sigma_{n}^2}A^{-1}Xy$と置くと
$$p(\omega|y,X) \propto \exp \left[ -\frac{1}{2} \left( \omega-\bar{\omega}  \right)^T A \left( \omega-\bar{\omega}  \right) \right]$$
つまり$\omega$は平均$\bar{\omega}$,分散$A^{-1}$の正規分布に従う。
今回はMAP推定という最頻値を推定値とするアプローチをとるのだが、正規分布の最頻値は平均と一致する。
したがって推定値$\hat{\omega}=\bar{\omega}$
以上からモデルを推定することができたため入力値から出力を予測することができる。

##まとめ
非常に雑ではあったが今回はベイズ線形回帰についてアウトプットした。
何か解釈の間違いがあれば指摘していただけると幸いである。

次回はガウス過程回帰についておそらくまとめる。
圧縮されたtarの展開方法の変遷

私がやっていた圧縮されたtarの展開の仕方を書いてみる。

# ～1992年

gzipが出る前。圧縮に使っていたのはcompressで圧縮したtarの拡張子はtar.Z。ファイルを伸長して標準出力に出力するzcatがあり、tar.Zを展開するときは

```
zcat hoge.tar.Z | tar xf -
```

としていた。

# 1993年～

gzipが登場した。わりとすぐにGNU tarがzオプションを実装したので、tar.gzを展開するときは

```
tar xzf hoge.tar.gz
```

とできた。しかし、当時はGNU tarが入っていてかつ新しいことはあまり期待できないので、gzipに含まれているzcatを使って

```
zcat hoge.tar.gz | tar xf -
```

とすることもあったし、うっかりcompress用のzcatを呼んでしまうとゴミが吐かれるので

```
gzip -cd hoge.tar.gz | tar xf -
```

とgzipを明示的に呼ぶこともあった。

# 1996年～

bzip2が登場した。GNU tarでのbzip2の対応はかなり遅かったので、ファイルを伸長して標準出力に出力するbzcatを使って

```
bzcat hoge.tar.bz2 | tar xf -
```

としていた。

その間に多くのLinuxディストリビューションがGNU tarをbzip2に対応させていた。オプションはyが一般的で

```
tar xyf hoge.tar.bz2
```

のようにできたが、どこでも使える可能性が低くいので当てにしなかった。yオプションがアップストリームに取り込まれてから、Iになったりjになったりしたので、まったく当てにできなかった。

# 2005年～

GNU tarが圧縮ファイルの形式を自動認識するようになったので、どの圧縮ファイルについても

```
tar xzf hoge.tar.*
```

とするようになった。この時点でzは不要になっていたが、圧縮ファイルを自動認識をさせるにはzが必要だと誤解していたため指定し続けていた。

# 2009年～

xzが登場してGNU tarにJオプションが生えたが、自動認識させればよいのでそれまでと変わらず。

# 2011年～

zがいらないって気付いて付けなくなったのは、このあたりだと思う。
rubocopがうまく動いてくれないときの対処

[Glavin001/atom-beautify](https://github.com/Glavin001/atom-beautify)
こちらでrubocopを使用しrubyの自動修正をしようとしたが、うまくいかなかったので対処したときのめも。


# 確認した点
## ホーム直下に~/.rubocop.ymlがあるか
rubocopはプロジェクトのディレクトリにある.rubocop.ymlよりホームの設定ファイルを優先する。
なのでいったんホーム直下のものを消す。

## rbenv使用の場合
プロジェクトの使用バージョンでrubocopがインストールされているか確かめる。
自分の場合インストールされてなかったので、インストールした。
プロジェクトごとにrubyバージョンが違う場合はこちらの対処で行けるかも。
だめならatomを再起動する。


# 備考
一通り確かめるときは、まずコマンドラインでうまくいくか確認し、次にatomで動作実行なり、デベロッパーコンソール起動で確かめると早くていいと思います。
Javascript - stickyみたいにfixedを使いたいけど使えない場合の実装

下記場合

```html:sample.html
<!DOCTYPE html>
<html>
  <head>
    <title>sample</title>
  </head>
  <body style='overflow: hidden;'>
    <div style='width: 500px; height: 500px; overflow-x: scroll; overflow-y: scroll; margin: 30px auto;'>
      <div style='width: 300px; height: 1000px; background-color: rgb( 0, 0, 255 )'>
        この属性の特徴：縦に長い・青の背景色
        固定にするよ！
      </div>
      <div style='width: 1000px; height: 300px; background-color: rgb( 255, 0, 0 )'>
        この属性の特徴：横に長い・赤の背景色
        固定にするよ！
      </div>
      <div stype='width: 700px; height: 700px; margin: 300px 0px 0px 300px; background-color: rgb( 0, 255, 0 );'>
        この属性の特徴：横にも縦にも長い・緑の背景色
      </div>
    </div>
  </body>
</html>
```

## なにがしたいのか
　「横スクロール時は、赤と緑が動くようにして青を固定！」
　「縦スクロール時は、青と緑が動くようにして赤を固定！」

## 以下をつかえ！
```javascript:sample.js
/*
 * -----------------
 * reference arguments
 * 	element selector name -> as method '$' to the library 'jquery' set argument. return null = throw error
 *  toggle -> a String 'top' or 'left'. this is set you. top: element is deal vertical scrolling. left: element is deal horizon scrolling.
 */
function scrolling( parents_element_selector, target_element_selector, toggle, default_margin_value ) {
	
	if( !toggle || ( toggle !== 'top' && toggle !== 'left' ) ) {
		return;
	}
	if( !target_element_selector || !( $( target_element_selector ) ) ) {
		return;
	}
	
	// how much to user scrolled length.
	// scrolled length value + element margin value before element was scrolled by user
	var aflterScrolledValue = 0;
	if( toggle === 'top' ) {
		afterScrolledValue = document.getElementById(parents_element_selector).scrollTop;
	} else {
		afterScrolledValue = document.getElementById(parents_element_selector).scrollLeft;
	}
	
	// set value as look liked to scrolling element
	$(target_element_selector).css( 'margin-' + toggle, (afterScrolledValue + default_margin_value) + 'px' );
}
```

もうちょっと丁寧にまとめるから待ってて。。。
VirtualBoxの シリアルポートTCP/IP backend機能を使ってデバイス実機が無くても開発する方法

## TL;DR

[VirtualBox](https://www.virtualbox.org/) の [5.0 から入った**シリアルポートのTCP/IP backend** 機能](https://www.virtualbox.org/wiki/Changelog-5.0)を使うと、VM起動時に localhost にTCPポートが開き、そこにホスト側から接続するとVMの `/dev/ttyS0` につながるので

```console:host側
$ echo -en "\x02PayLoad\x03" | nc localhost 10001
```

```console:guest側
$ sudo screen /dev/ttyS0
```

で通信しあったりできるお。

## お困りごと

IoTをやってると、シリアルポートデバイスと向き合う時間がとても増えます。しかし**実機が無くて困った**ことありませんか？
VirtualBoxを使っているのであればシリアルポートの設定で「ポートモード=TCP」を活用してみてください。はかどります。

## やりかた

VirtualBoxのVM設定内、シリアルポートの設定で下記の通りにしてください

* シリアルポートを有効化: チェックする
* ポート番号: **COM1** (COM1 なら `/dev/ttyS0` になります)
* ポートモード: **TCP**
* 存在するパイプ/ソケットに接続: チェックをはずす
* パス/アドレス: _適当なポート番号_ (例では `10001` としました)

![VirtualBoxのシリアルポートの設定画面](https://qiita-image-store.s3.amazonaws.com/0/22754/fd3425c0-e0c3-2981-24c1-530b51a8bd4f.png)

この状態で起動すると Linux(Ubuntu) なら `dmesg` にこんな感じで `/dev/ttyS0` が出来上がります

```console
 $ sudo dmesg | grep tty
 [    0.000000] console [tty0] enabled
 [    1.303306] 00:02: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
```

#### POINT;

「存在するパイプ/ソケットに接続」はデフォルトでチェックがついているのですが、これがついていると起動できません（空いているポートを探しに行く？原因不明ですけど。）

## つかいかた

ホスト側から telnet や nc といったコマンドで `localhost:10001` へ接続するだけです

以下の動画は上がゲストのLinux(Ubuntu)で `screen /dev/ttyS0` に接続、ホスト側は telnet や nc で `localhost:10001` に接続して、双方でデータをやり取りしている様子です
※Linux → ホストでは、screen がecho backしてないので何も入力してないように見えますが。

![7378a82689d78dea3c1e7ece787858d8-gif.gif](https://qiita-image-store.s3.amazonaws.com/0/22754/9867db43-5bb5-e68e-a62b-03e269ef805f.gif)

### データ送信のTips

`echo` コマンドの `-e` や `-n` オプションと `\x` を使えばバイナリ文字列も送信できます

```console:host側
$ echo -en "\x02Payload\x03\n" | nc localhost 10001
```

## あとがき

前までは [com0com](https://qiita.com/yaju/items/e5818c99857883a59033) 等の仮想シリアルポートを使う方法がありましたが、より簡単にシリアルポートをエミュレートできるようになって便利ですね

EoT
Google Apps Script (GAS) でプロジェクトのバージョンを変えても、定期実行に設定した処理のバージョンは変わらない

## 前提
#### プロジェクトのバージョン切り替え
GASには、プロジェクトのバージョンを過去にデプロイしたものに即切り替える機能が用意されている。
`公開 > ウェブアプリケーションとして導入 > プロジェクト バージョン` の画面で

- 「新規作成」を選ぶと編集中の最新コードが新しいバージョン番号でデプロイされる（普段はこっち）
- 過去バージョンを選ぶと過去の状態のプロジェクトが再デプロイされる（今回はこっち）

ちなみに `ファイル > 版を管理` からは過去のデプロイをコメントとともに一覧できたりする。

#### 定期実行処理
`編集 > 現在のプロジェクトのトリガー` から「特定の処理を毎日4時台に実行したい」みたいなことができる。

「特定の処理」は global function になってさえいればなんでもいいっぽい。

## 発生した問題
- プロジェクトに破壊的変更を加える必要があり、通常の利用がない時間帯に開発バージョンをデプロイし、作業終了時には安定バージョンに戻すということをやっていた
	- 安定バージョンをデプロイした際も、スクリプトエディタのコードは開発バージョンのままで放置していた。
- ところがある日、安定バージョンがデプロイされているにもかかわらず、定期実行処理が壊れているよとGASからエラーメールが飛んできた
	- どうも定期実行処理に関しては、明示的にデプロイしたバージョンではなく、エディタで編集中だったコードがそのまま走るらしい
		- うそーん

## まとめ

- 定期実行については、怪しい動き（トリガー設定されたfunctionを削除 → 安定バージョンをデプロイ →  `現在のプロジェクトのトリガー` 画面でfunctionが見つからないと警告が出続ける）を知っていたので、嫌な予感はしていた
- よその基盤を使うときは、当たり前と思える挙動もしっかり確認をしておくべき
- とはいえ開発者としては、実行されるコードは明示的にデプロイしたバージョンに限定されていてほしいと思うはず
- せめてバージョン切り替えの画面に1行注意書きぐらいはあってもいいんじゃないですかねえ…… という気持ち
Homebrew部 python3デフォ化により普通には使えなくなったpython2系を使う裏技

Homebrewがアップデートしたので初投稿です。
#概要
- "Python3"コマンドを打ってファッてなった人向け。
- Homebrewの導入については先駆者兄貴にお任せします。
- macOS HighSierra 10.13.2
- HOMEBREW_VERSION: 1.5.8

#（Homebrewではpython3をデフォルトとして扱うので）お兄さん許してぇ
Homebrewをアップデートしたからにはもう元には戻れないゾ
Homebrewで"python"コマンドを実行すると３系で実行されるようになりました。

今まで.bash_profileで

```:.bash_profile
export PATH="/usr/local/bin:$PATH"
```
のようなベタ打ちし、pyenv等切り替えや仮想環境を碌に使用せず実行時に

```bash
python file.py
python３ file.py
```
のように２系３系を使い分けていた人間のクズからすると大変な仕様変更です。（クズでなくてもめんどくさい仕様変更です。）
冗長な説明になりますが上記コマンドでは、Homebrewはどちらでもpython3系を扱って実行されます。


[・methaneのブログ このブログに乗せているサンプルコードはすべてNYSLです。
「3月1日、Homebrew のデフォルトの Python が Python 3 になります。」](https://methane.hatenablog.jp/entry/2018/02/28/3%E6%9C%881%E6%97%A5%E3%80%81Homebrew_%E3%81%AE%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AE_Python_%E3%81%8C_Python_3_%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)
methane様のブログにて簡潔に状況がまとめられています。

最後にbrewのpython2を使い、そこはかとなく今までのようにpythonを扱う方法を記載します。



#具体的な変更はどうで、それをどうすればいいのか

[brew update でPython環境がおかしくなったので雑に解消メモ](https://qiita.com/kamemoge/items/c8f50685109ed0b9c9d4)
上記の記事にてエイリアスの変更について記されていました。書き終わった後に見つけてしまいました。

3/1以降のアップデートの時点でHomebrewにて扱うpython3<font color="LimeGreen">("usr/local/bin/python3")</font>のリンクは
("/usr/local/Cellar<font color="DeepPink">/python</font>/3.6.4_3/Framewo~~~")
を叩くようになりました（python3のバージョンは3/8現在）。

python3コマンドを受け付けなくなった理由は
まずHomebrewをアップデート時に<font color="MediumVioletRed">("/usr/local/Cellar/python3")</font>のディレクトリが消された。
それなのにpythonのformulaは更新されていないのでpython3コマンド<font color="LimeGreen">("usr/local/bin/python3")</font>からのリンクは存在しない<font color="MediumVioletRed">("/usr/local/Cellar/python3")</font>を叩いておりコマンドを受け付けなかった。
pythonのformula更新時に<font color="MediumVioletRed">("/usr/local/Cellar/python3")</font>から("/usr/local/Cellar<font color="DeepPink">/python</font>")へののシンボルリンクが貼られpython3コマンドが有効になった、が真相だと思います。
ガバガバ推理ですみません。

以下のコマンド入力して欲しいのですが、過去の環境を再現することは並みの裏技ではできないと思いますので注意してください。もうアップデート後なので後の祭りだと思いますが。

```
brew upgrade python
```
普通にHomebrewのpythonをアップデートするコマンドです。これで"python3"と打つとHomebrewのアップデート時点での最新のpython3にシンボリックリンクが通り、実行されるといった状況になるのだと思います。

#HomebrewのPython2を扱う
Homebrewのpython2系を敢えて使うにはoptディレクトリからのpython2のシンボリックリンクを叩く必要があります。

[How to run Python2 after Homebrew Update?
](https://stackoverflow.com/questions/49082978/how-to-run-python2-after-homebrew-update)での回答のようにbrew link --force python2 で解決しても後々問題は出ないと思うのですが、.bash_profileに

```bash:.bash_profile
export PATH="/usr/local/opt/python@2/bin:$PATH"
```
とコメントと共に記述しておけば安全だと思います。（Homebrewでもlinkを貼ろうとすると推奨されます。）
これで

```bash
python2 file.py
```
と入力する形で、恐らくpython3もpip3も動く今までと近い状態でpython2系を扱えるはずです。

#編集後記
かなりガバ推理なので、訂正言及していただけるとありがたいです。
アプデ後にディレクトリ眺めたので過去の形がわからない状態で推測しました。

とりあえずbrew側から言及されるエラー情報だけだと一本道で解決しないので、ヒントになるページに飛べるまとめを作りました。
cron | mail > link > 1分ごとのcron処理に対するmailをコントロールする | crontabでcdを使う

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

### 状況

- 1分ごとにサーバープロセスのログを保存
    - cronで実行
- >> mailが1分ごとにやってくる

### 提案いただいた方法

@tukiyo3 さんの[コメント](https://qiita.com/7of9/items/ed4d361d03b69934d7f5#comment-6b61bbbfd5ec97dc634b)
においてcron設定した場合のメールのコントロールに関する方法を紹介いただいています。

将来使いそうですので、検索で見つけられるようリンク記事とします。
Laravel ログイン中、ログイン画面にアクセスした際のリダイレクト先変更

###最初に
php artisan make:auth　で作成した認証機能である
変更箇所のみ記載、説明なし

###目的
- ログイン後に/homeでなく、/topにリダイレクトしたい
- ログイン中に/loginにアクセスした際、/topにリダイレクトしたい

###app\Http\Middleware\RedirectIfAuthenticated.phpの変更


```php5

    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
-            return redirect('/home');
+            return redirect('/top');
        }

        return $next($request);
    }
```

###app\Http\Controllers\Auth\LoginController.phpの変更
```php5
-    protected $redirectTo = '/home';
+    protected $redirectTo = '/top';
```
###その他の変更
- app\Http\Controllers\Auth\RegisterController.php
- app\Http\Controllers\Auth\ResetPasswordController.php

```php5
-    protected $redirectTo = '/home';
+    protected $redirectTo = '/top';
```
IMPORTRANGEで参照できない

参照先にアクセス権をリクエストしておかないといけない。

複数範囲指定では、リクエストボタンがでないため、

単一セルを指定すると、ボタンが現れる。

新しいスプレッドシート毎にアクセス権が必要なため、

新規スプレッドシートを作る際に、ハマりがち。
PHPのエラー出力先をコマンドで確認

## 概要
phpのファイルを作って「phpinfo();」を実行しなくても、PHPの設定を確認できないか調べたメモ

## コマンドでいけるみたい
```
$ php -i | grep error_log
```

## 参考サイト
- [PHPバージョン確認コマンドとphpinfo情報表示コマンド](https://qiita.com/na0AaooQ/items/5b745a00f2c2da32c3ce)
未使用のコンテナ、volumeなどを一括削除

## 概要
dockerを運用していると不要なコンテナやvolumeなどが溜まっている場合があるので、一括削除するためのメモを残す。

## 停止コンテナ一括削除
status=exitedで停止コンテナの一覧を取得して、一括削除する。
※ [docker container prune | Docker Documentation](https://docs.docker.com/engine/reference/commandline/container_prune/)

```bash:ターミナル
$ docker rm `docker ps -f "status=exited" -q`

or

$ docker container prune
```

## 未使用のVolumeを一括削除
dangling=trueでコンテナから参照されていないVolumeの一覧を取得して、一括削除する。
※ [docker volume prune | Docker Documentation](https://docs.docker.com/engine/reference/commandline/volume_prune/)

```bash:ターミナル
$ docker volume rm $(docker volume ls -qf dangling=true)

or

$ docker volume prune
```

## 未使用のイメージを一括削除
※ [docker image prune | Docker Documentation](https://docs.docker.com/engine/reference/commandline/image_prune/)

```bash:ターミナル
$ docker image prune

$ docker image prune -a
```
## 未使用のネットワークを一括削除
※ [docker network prune | Docker Documentation](https://docs.docker.com/engine/reference/commandline/network_prune/)

```bash:ターミナル
$ docker network prune
```
## 未使用なコンテナ, イメージ, ネットワークを一括削除
※ [docker system prune | Docker Documentation](https://docs.docker.com/engine/reference/commandline/system_prune/)

```bash:ターミナル
$ docker system prune

# volumeも破棄する場合はこちら
$ docker system prune --volumes
```


## 参考サイト
* [Docker一括削除コマンドまとめ](https://qiita.com/boiyaa/items/9972601ffc240553e1f3)
* [[Docker]未使用のVolumeを一括削除](https://cheaparchitec.wordpress.com/2016/07/11/docker%E6%9C%AA%E4%BD%BF%E7%94%A8%E3%81%AEvolume%E3%82%92%E4%B8%80%E6%8B%AC%E5%89%8A%E9%99%A4/)
コメントアウトについての賛否

## コメントアウト賛成派の意見

* 過去のコードが一目瞭然
* 過去の変更履歴がないと何を修正したのかわからない

## コメントアウト反対派の意見

* コメントは今コードが動いている理由を説明するものであり、過去にコードが動かなかった理由を説明するものではない
* コードを読む理由は「現在の動作を理解するため」あるいは「現在何が間違っているのかを発見するため」が第一の理由であって、「過去に何があったのか」を紐解くのはそれらが解決した後の作業だから。
* 変更履歴はSCMが保持しており、かつ変更履歴が正常に機能するなら変更理由と変更内容は理解可能である。
* 変更理由(変更の動機)はBTS,ITS等により厳密に管理される必要があり、変更理由(変更の動機)に対する作業内容も厳密に管理されるべきだから。
* 適切なコメントはコードの理解を助けるが、そうでないコメントはコードの理解を妨げる

コメントアウト賛成派の意見があればどうぞ。
あるディレクトリに存在するシェルスクリプト全てにエイリアスを張る

# はじめに
この記事では、あるディレクトリに格納されたシェルスクリプト全てに対してエイリアスを張るスクリプトを示します。

このスクリプトを読み込むことで、あるディレクトリに存在するシェルスクリプト（例えば"$HOME/.mylib/sh/my_exec.sh"）を、`my_exec`で実行できるようになります。


# スクリプト
前提条件として、MY_SH_DIRにはエイリアスを張りたいshファイルのみ存在するものとします。
拡張子で判別したいとかがある場合はif文を書いてください。

また、.bash_aliasに書いてますが.bashrcとかにべた書きでも構いません。

```bash:.bash_alias

# MY_SH_DIR下のshにエイリアスを張る

MY_SH_DIR=$HOME/.mylib/sh # 任意に変更すること

for filename in $( ls $MY_SH_DIR ); do
  # 実行権限付与 やらなくてもいいし、細かく設定したいなら任意に設定のこと
  chmod +x "${MYLIB_SH_DIR}/${filename}"

  # 最長除外でリンクを貼る "a.sh"も、"a.sh.old"も"a"で張りに行く
  # 最短除外にする場合は {filename%%.*} を　${filename%.*} とする
  alias "${filename%%.*}"="${MYLIB_SH_DIR}/${filename}"
done

```

.bash_aliasを新しく作成した場合は、.bashrcに`test -r ~/.bash_alias && source ~/.bash_alias`を追加してください。


# 参考文献

* https://qiita.com/koara-local/items/04d3efd1031ea62d8db5
Support Libraryを27.1.0に更新メモ

## はじめに
[Support Library 27.1.0](https://developer.android.com/topic/libraries/support-library/revisions#27-1-0) がリリースされました。
Support Libraryを27.1.0に更新したときに行ったことをメモします。

## RecyclerView.Adapter でのエラー
ビルドを行ったところ、以下のエラーが出た。

```
Error: Class '***RecyclerViewAdapter' is not abstract and does not implement abstract base class member @NonNull public abstract fun onCreateViewHolder(@NonNull p0: ViewGroup, p1: Int): ***RecyclerViewAdapter.ViewHolder defined in android.support.v7.widget.RecyclerView.Adapter
```

以下がnon-null型に変更されていたので対応しました。

* RecyclerView.Adapter#onCreateViewHolder() の ViewGroup
* RecyclerView.Adapter#onBindViewHolder() の RecyclerView.ViewHolder

```kotlin

//---------------------- Before ----------------------

override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
    // do something
}

override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
    // do something
}

//---------------------- After ----------------------

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    // do something
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    // do something
}
```

## ViewModel を FragmentActivity  / Fragment で渡す際

> FragmentActivity and Fragment now implement ViewModelStoreOwner and can now be used with the ViewModelProvider constructors as an alternative to using ViewModelProviders.of()

FragmentActivity / Fragment　に　ViewModelStoreOwner が実装されていたそうなので、以下のように変えました。

```kotlin:***Fragment.kt

//---------------------- Before ----------------------

ViewModelProviders.of(this, factory).get(***ViewModel::class.java)

//---------------------- After ----------------------

ViewModelProvider(this, factory).get(***ViewModel::class.java)
```

## RecyclerView の差分更新(今後)

> ListAdapter for RecyclerView (along with AsyncListDiffer) make it easier to compute list diffs on a background thread. These can help your RecyclerView animate content changes automatically, with minimal work on the UI thread. They use DiffUtil under the hood.

[ListAdapter](https://developer.android.com/reference/android/support/v7/recyclerview/extensions/ListAdapter.html) を使って、RecyclerView の差分更新も行う予定です。
d3.jsで、<select>と<option>に別データをバインドしてみた

# やりたいこと

d3.jsを使って、Objectのarrayに格納したデータと連動した、`<select>`が並んだリストを作りたい。
`<option>`もさくっと配列にしといて連動してくれたらいいな（ゴリゴリかくのも面白くない

# 実装

```javascript
// バインドする対象
var foo = [
    {
        "id": "A", // バインドするリストのユニークなID
        "name": "rowA", // ラベル
        "num": 1 //　これをselectでデフォルト選択状態にしたい
    },
    {
        "id": "B",
        "name": "rowB",
        "num": 3
    }
];

// option選択肢
var opt = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// <ul>の下に、foo配列１要素＝１<li>としてバインド
var l = d3.selectAll("ul#foo_list")
    .selectAll("li")
    .data(foo, function (d) {
        return d.id;
    }).enter().append("li");

// <label>追加
l.append("label")
    .attr("for", function (d) {
        return d.id;
    })
    .html(function (d) {
        return d.name;
    });

// セレクトボックス本体をバインド
var s = l.append("select")
    .attr("id", function (d) {
        return d.id;
    });

// <option>の追加。バインドデータはoption選択肢リストにする。
s.selectAll("option")
    .data(opt, function (dd) {
        return dd;
    }).enter().append("option")
    .text(function (dd) {
        return dd;
    })
    .attr("value", function (dd) {
        return dd;
    });

// 上記、option追加後に、デフォルトでどれを選択状態にするかセット。
s.property("value", function (d) {
    return d.num;
});
```

## ポイント
* `<select>`をappendした状態、を変数で持っておく。
* `.property("value", 〜' は、`<option>`のappend後でないと動作しなかった。

## 環境
* d3.js 4.12.0
* HTML5
* （一応python 3.6.0、Flask 0.12 で制作）
* 同ページにjQuery 3.2.1 を読み込んでいるがこの部分の衝突はなし

以下の動作は確認しています
* macOS Sierra 10.12.6 Safari 11.0.3
* 同mac Chrome最新
* iOS 11.2.2 Safari
* Android 2.0.0 Chrome 64
溜まりに溜まったgit stashを一掃する

私のようなズボラな人へ。

## こんな場合に使えます
こまごまとブランチを切り替える度に`git stash`
↓
戻って来たら`git stash apply`
（`git stash pop`と違い、stashに残り続けます）
（だって、念のためとっておいたら、どこかで役に立つかもしれないし・・・）
（↑完全に片付け苦手な人の心理）
↓
そのままstashが残り続ける

で、いつのまにか**100以上のstash**が＼(^o^)／

## ワンライナーで一掃
とりあえず、完了してるブランチ分だけでもまとめて消しちゃいましょう。

```bash
git stash list | grep 'WIP on ブランチ名' 2>/dev/null | awk '{print $1}' | sed -e 's/://' | sort -r | xargs -I {} git stash drop {}
```

`git stash list`から指定したブランチのstashを抜き出して`stash drop`で捨てています。
**`sort -r`で降順にしてあげないと、dropの度に番号が繰り上がるのでおかしなことになります。**
（やっちまった！）

~~うっかりするとマージコミットされた他のブランチstashも抽出されちゃうので、~~
~~ちゃんとしたい人はもう少し作りこんだ方が良いでしょう。~~
Commitメッセージに「WIP on」が入っていない限りは大丈夫なはず。
AnsibleでCiderつきネットワークアドレスを設定する

####やりたかったこと↓

- chronyの特定のグループのアドレスだけネットワークアドレスをcider(prefix)つきで許可範囲書くやつ。

####やりかた
#####１．ansible-playbook実行ホストで以下をインストール

```
pip install netaddr
```

#####２．変数を準備

```
# vi roles/myrole/defaults/main.yml 
～略～
net_mask: "{{ ansible_default_ipv4.network }}/{{ ansible_default_ipv4.netmask }}" 
```

setupモジュールでどんなfactの値(実行するホストの値をとってくるchefでいうOhai)がとれるか確認する手っ取り早いコマンドは
`ansible -m setup -c local localhost`という感じ。（これはローカルの値だけどリモートにしたいなら単にインベントリを-iで指定する。
`ansible -m setup -i hosts/mystage myhost01`
あと変数名が分かってて特定の値でフィルタかけた出力だけ見たいときは、`-a "filter=ansible_default_ipv4"`という感じにオプション追加する。(-aでは各モジュールに応じたオプションを指定することができ`yum`モジュールなら`-a "name=openssl state=latest"`などでタスク書かなくてもパッケージアップデートに使えたりなど。）


#####３．templateに以下のように書く

```
# vi roles/myrole/templates/chrony.conf.j2
～略～
{% macro hosts(host) -%}
{{ hostvars[host]['ansible_%s'|format(myrole_ntp_network_device)].ipv4.address }}
{%- endmacro %}

{% if 'mygroup1' in group_names %}
{# mygroup1の場合 #}
server ntp.nict.jp iburst
server ntp.jst.mfeed.ad.jp iburst

{# 要pip install netaddr at ansible host(clientには不要)#}
# Allow NTP client access from local network.
allow {{ net_mask | ipaddr('net') }}       #★確かめたいフィルタかけた場所
{% else %}
{%   if groups.mygroup1 is defined and groups.mygroup1 != [] %}
{# mygroup1でなく、mygroup1が存在する場合 #}
{%     for h in groups.mygroup1 %}
server {{ hosts(h) }} iburst
port 0
{%     endfor %}
{%   else %}
{# mygroup1でなく、mygroup1が存在しない場合 #}
server ntp.nict.jp iburst
server ntp.jst.mfeed.ad.jp iburst
{%   endif %}
{% endif %}
～略～
```
hostversのマクロのとこのホスト名の変数はloopで複数扱うなら以下のようにインベントリに書いた変数にしたほうがちゃんと動くのかもしれない。たぶん。（なんかdictオブジェクトがないわよって感じのエラーを見かけた）

```
# view hosts/mystage
[cache]
my-cache01 ansible_host=10.5.0.25 

# view roles/myrole/templates/chrony.conf.j2
{% macro hosts(host) -%}
{{ hostvars[host].ansible_host }} 
{%- endmacro %}
```


#####４．ansible-playbookで動確
さきに実行するクライアントのinventoryのグループをmygroup1にしてからmygroup1向けの設定が効くのか確認

```
# ansible-playbook -i hosts/mystage site.yml -C -D -vv 
TASK [myrole : set chrony.conf] *************************************************************
task path: /pathtorole/myrole/tasks/mytask.yml:118
NOTIFIED HANDLER restart-chronyd
--- before: /etc/chrony.conf
+++ after: /tmp/tmpfOXT5n/chrony.conf.j2
～略～
+# Allow NTP client access from local network.
+allow 10.5.0.0/21             #★目的の値となったことを確認
～略～
```

#####参考：
http://docs.ansible.com/ansible/latest/playbooks_filters_ipaddr.html
http://blog.keshi.org/hogememo/2015/12/07/exploiting-ansible-jinja2

マニュアルじっと見るの大事だなと思いました。
ネットワークアドレスとサブネットマスクを求められれば複数のネットワークからの許可設定もできると思われ。
CSSを駆使するための覚書

## after
>CSS において ::after は、選択した要素の最後の子要素として擬似要素を作成します。よく content プロパティを使用して、要素に装飾的な内容を追加するために用いられます。この要素は既定でインラインです。
[MDN](https://developer.mozilla.org/ja/docs/Web/CSS/::after)

afterは、指定したクラス名に追加したいコンテンツ(テキストや吹き出し、音声ファイル)をくっつけたいときに使う。

```html:sample.html
<p class="boring-text">古くつまらないテキストです。</p>
<p>つまらなくも楽しくもないふつうのテキストです。</p>
<p class="exciting-text">MDN への協力は簡単で楽しいものです。
編集ボタンを押して新しいライブサンプルを追加したり、既存のサンプルを改良したりします。</p>
```

```css:sample.css
.exciting-text::after {
  content: "<- これ*こそ*楽しい！"; 
  color: green;
}

.boring-text::after {
   content: "<- ツマラナイ！";
   color: red;
}
```
**結果**
![スクリーンショット 2018-03-08 12.15.27.png](https://qiita-image-store.s3.amazonaws.com/0/222672/56a5ae4f-7f43-b72b-c095-e755fe1299c5.png)

## clearfix
>clearfixは、指定したい要素の親要素にclassで指定し、使用します。
今回、中央に寄せたいのはleftとright・・・メインの部分です。
今、この二つだけに対する親要素がありませんので、今回はhtmlにも手を加える必要があります。https://qiita.com/sanstktkrsyhsk/items/8298a47683fd67ad6299

```html:index.html
<!DOCTYPE html>
~中略~
 <body>
  <div class="header"></div>
  <div class="main clearfix">
   <div class="left"></div>
   <div class="right"></div>
  </div><!-- main clearfix -->
  <div class="footer"></div>
 </body>
</html>
```

```css:index.css
body{
  margin: 0 auto;
  width: 400px;
}
~中略~
.clearfix::after{
  content: "";
  display: block;
  clear: both;
}
```

通常はまわりこみをさせたくない要素にclear: both;とすることでまわりこみを防ぐことができる。しかし、それだと、そのあとの要素すべてにclear:both；をつける必要がある。ということで、回り込みをさせたくない要素の前の部分を指定したクラス名にafterをつけ、そこでclear: both;してあげることで、それ以降の要素にclear: both;が適用されるという考え方、だと思う。

## display
以下のの三種類はぶっちゃけサルワカさんの記事を読めばいい。
https://saruwakakun.com/html-css/basic/display
### block
### inline
### inline-block
ラズパイ（Raspbian） 設定メモ　SSHからApache導入

## SSH

* SDカードのルートに空のファイル「SSH」の名前を付けて保存

* sudo raspi-config コマンドでSSHを有効化する・あとSD容量拡張も

* IPアドレスを固定化

```bash
sudo nano /etc/dhcpcd.conf

interface eth0 ; 無線LANの場合
static ip_address=192.168.*.* ; ifconfigコマンドで調べる
static routers=192.168.*.*
static domain_name=192.168.*.*
```

再起動して繋がるか確認

```bash
ping -c 5 （ホスト名またはIPアドレス）
```

SSHクライアントにて↑で設定したアドレスに接続

初期ユーザ名とパスワードを入れて入れたら成功　(初期ID : pi , raspberry)


## 起動・再起動コマンド

再起動

```bash
sudo reboot
```

シャットダウン

```bash
sudo shutdown -h now
```

## PHP7本体+

```bash

# PHPをインストール

 sudo apt-get -y install -y php7.0

# 拡張ライブラリーもインストールしておきます

 sudo apt-get -y install php7.0-mysql php7.0-mbstring

# php7のApacheモジュールを有効化

 sudo a2enmod php7.0
```

念のためapacheを再起動

## Apache
### 起動・停止・再起動
```
sudo service apache2 start
sudo service apache2 stop
sudo service apache2 restart
```
### ステータス確認
```
service apache2 status
```
## ドキュメントルート変更
デフォルトが */var/www/html* なのでこれを変更します。

* **/etc/apache2/apache2.conf** 内

*<Directory /var/www/>* の部分を書き換える

* **/etc/apache2/sites-available/000-default.conf** 内

DocumentRoot を書き換え

* **書き換え後、apacheを再起動する**


## MySQL
### ログイン
```
mysql -u [ユーザー名] -p
```

## phpMyAdmin

パッケージから導入する場合

```bash

sudo apt-get -y install phpmyadmin
```

### インストール後の質問

* Web server to reconfigure automatically: 

apache2 を選択

* Configure database for phpmyadmin with dbconfig-common?

すでにMySQLを設定済みであればNO

### Apacheの設定

/etc/apache2/sites-available/  内にサイト設定ファイル hoge.conf を作成。

```c
Alias /phpmyadmin "/usr/share/phpmyadmin/" 
<Directory "/usr/share/phpmyadmin/">
    Order allow,deny
    Allow from all
    Require all granted
</Directory>
```

設定ファイルをApacheに認識させる

```bash
sudo a2ensite hoge.conf
```

apacheを再起動、/phpmyadmin でアクセスできるか確認。
snmptrapでトラップを送るときのデータタイプ指定

net-snmpの公式サイトに、記載はある。

http://net-snmp.sourceforge.net/tutorial/tutorial-5/commands/snmpset.html

けど、snmptrapというコマンドでトラップを送りたい、
というときに、このページにたどり着ける気がしないので、
以下に記載する。

---

マニュアルの通り、以下のようにコマンドを実行することで、一覧が入手できる。

```
[root@localhost ~]# snmpset -h |& tail -4
  TYPE: one of i, u, t, a, o, s, x, d, b
        i: INTEGER, u: unsigned INTEGER, t: TIMETICKS, a: IPADDRESS
        o: OBJID, s: STRING, x: HEX STRING, d: DECIMAL STRING, b: BITS
        U: unsigned int64, I: signed int64, F: float, D: double
[root@localhost ~]#
```

snmptrapの、どの部分の話かというと、以下のような話。

```
#!/bin/sh
snmptrap -v 1 -c public 192.168.0.100 \
NET-SNMP-EXAMPLES-MIB::netSnmpExampleHeartbeatNotification "" 6 17 "" \
netSnmpExampleHeartbeatRate i 123456
```

適当なトラップを送ろうとしている。
この内容のnetSnmpExampleHeartbeatRate i 123456という部分の、iの部分の話。

netSnmpExampleHeartbeatRate i 123456は、INTEGER型で、123456という値だよ、ということ。
電子回路入門　超音波センサー

#**はじめに**
書籍に沿って引き続き進めていきます。

#**超音波センサーとは**
超音波を出して距離を測定するセンサーです。
音波を出し戻ってくるまでの時間で距離を計測することができるようです。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/195542/0c6402e2-e1ed-abc1-61d2-8ab549e69301.png)

まずTriggerを10μ秒間ONにすると、超音波が発信れます。
発信されるとechoがONになり、受信するとechoがOFFになります。
![仕組み.png](https://qiita-image-store.s3.amazonaws.com/0/195542/5cc2d371-ba04-fe8b-75f4-307ca9b6c15c.png)


今回の製作において、[こちらのページ](https://blog.psoclatinoamerica.co/sensor-ultrasonido-hc-sr04-con-psoc5lp/ "Sensor Ultrasonido HC-SR04 con PSoC5LP - PSoC Latinoamérica")が大変わかりやすく、参考にさせていただきました。
Arduinoの場合だとライブラリがあったり参考記事がたくさんあるのですが…

超音波がいっぱいある場所や超音波が苦手な動物がいる場所では使用しないようにしましょう。
→ その場合は赤外線で距離を計測


#**回路図**
![超音波_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/195542/dd073056-e9cd-642d-65db-5a609122a646.png)

#**PSoC設定**
- ControlRegを使用してTrigger(Pin2)のONとタイマーのリセットを同時に実行できるようにします。
- echo(Pin3)がONになったときタイマー計測を開始できるようにします。
![設定.png](https://qiita-image-store.s3.amazonaws.com/0/195542/91f45df8-0cd9-ba77-72a2-f9832d3f6b98.png)

#**プログラム**
ほぼ[参考にさせていただいたページ](https://blog.psoclatinoamerica.co/sensor-ultrasonido-hc-sr04-con-psoc5lp/ "Sensor Ultrasonido HC-SR04 con PSoC5LP - PSoC Latinoamérica")と同じですが。

```c
#include "project.h"
#include <stdio.h>
#include <stdlib.h>
 
int value_counter=0;
float distancia=0.0;
char imp[9];
 
int main(void)
{
    CyGlobalIntEnable;
    
    Timer_1_Start();
    UART_1_Start();
    for(;;)
    {
        while(Pin_3_Read()==0)
        {
            Control_Reg_1_Write(1);
            CyDelayUs(10);
            Control_Reg_1_Write(0);
            CyDelay(1);
        }
        while(Pin_3_Read()== 1){};
        value_counter = 65535-Timer_1_ReadCounter();
        distancia = value_counter / 58.0 ;
        sprintf(imp,"%.1f cm  \n",distancia);
        UART_1_PutString(imp);      
    }
}
```

#**結果**
![結果.png](https://qiita-image-store.s3.amazonaws.com/0/195542/89d98d84-815c-7c69-153f-f9d7f504e398.png)
SmartGit > Mergeの種類 > Create Merge-Commit | Merge to Working Tree | Cancel > マージ手順の間違い

```txt:動作環境
C++ Builder XE4
Windows 7 Pro (32bit)
SmartGit Version 17.1.5 #11217, installed: #11182
```

### 違和感のあるダイアログ

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/63d62f5d-009b-93f5-93d9-be65ed944ad5.png)

### やろうとしていたことと、違和感の理由

featureブランチを切っていたリポジトリでmasterにマージしようとしていた。

従来の手順に従えば、下記に記載のように「Fast-Forward」のボタンも表示されるはず。
[SmartGit > Mergeの種類 > Fast-Forward | Create Merge-Commit | Merge to Working Tree](https://qiita.com/7of9/items/5b8467c07146859dfe0e)

### 今回の手順

1. Brachesペインのmaster上で右クリック
2. Merge...を選択

### 正しい手順

1. Branchesペインのmasterをダブルクリック
    - masterをcheckout
2. マージしたいfeatureブランチ上で右クリック
3. Merge...を選択

### うっかりによる失敗

linuxのログを取るbash scriptを実装した直後に、WindowsでC++ Builderプロジェクトの実装に戻ってきた。
頭の切り替えができておらず、うっかり失敗するところだった。

- タスク切り替え時は、まず落ち着く
- 違和感を感じた点で作業を中断
- 違和感を解消する
CentOS7でGeforce GTX1080Tiのドライバをインストールする

CentOS7でデュアルディスプレイを試してみたかったので、不慣れながらもやってみたことです。
Geforce GTX1080Ti対応のNVIDIAドライバを入れるだけですが、CUIに慣れてないとちょっと戸惑うかもしれません。

#NVIDIAドライバをダウンロードしておく
初めにビデオカード(私の場合GTX1080Ti)に合ったドライバをダウンロードしておき、探しやすい位置に保存しておきます。
[NVIDIAドライバダウンロード](http://www.nvidia.co.jp/Download/index.aspx?lang=jp)はここです。

ちなみに英語の[マニュアル(バージョン390.25)](http://us.download.nvidia.com/XFree86/Linux-x86_64/390.25/README/installdriver.html)はこれ


#ドライバの確認
基本的に何もいじってなければNouveauというドライバがインストールされています。

まず何が入っているか確認します。

```bash

lsmod | grep nouveau
```

で出てくるはずです。

#ランレベルを下げる
ランレベルをチェックします。

```bash
sudo systemctl get-default
```

graphical.target
と表示されるはずで、これはランレベル5(Xディスプレイマネージャが起動している)状態になってます。

ランレベルを3に変更します。

```bash
sudo systemctl set-default multi-user.target
```

再度確認します。

```bash
sudo systemctl get-default
```

multi-user.target
と表示されていればランレベル3に変更できています。

変更を適用するためシステムを再起動します。
**これ以降はCUIのみで操作します。**よって再起動前に別のマシンか携帯などにメモをとっておいた方がいいです。

真っ黒な画面になりますがユーザーIDとパスワードを入力しログインします。

#nouveauを無効化する
nouveau関連のモジュールがイメージファイルで管理されているので今のイメージファイルのバックアップを取ります。

```bash
sudo mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r)-nouveau.img
```

nouveauをロードしない起動イメージファイルを作成します。

```bash
sudo dracut --omit-drivers nouveau /boot/initramfs-$(uname -r).img $(uname -r)
```

他のモジュールとの依存関係を断ち切ってnouveauを必ず禁止にするためファイルを二つ作ります。

```bash
vi /etc/modprobe.d/modprobe.conf
vi /etc/modprobe.d/nouveau_blacklist.conf
```

どちらのファイルにも同じものを書き込みます。

```
blacklist nouveau
options nouveau modeset=0
```

保存した後、再度再起動します。

```bash
reboot
```

nouveauが無効化されるので、見た目多少変わるかもしれません。
再度nouveauが読み込まれていないかどうか確認します。

```bash

sudo lsmod | grep nouveau
```

何も出てこないはずです。

#NVIDIAドライバをインストールする
あらかじめ保存しておいたrunファイルを実行します。

```bash
sudo sh NVIDIA-Linux-x86_64-390.25.run 
```

私の場合はバージョン390.25のものです。
たくさんファイルを変更するかどうかなど聞かれますが、すべてACCEPT、YESで答えます。

再起動します。

```bash
reboot
```

#ランレベルを戻す
最後にランレベルを元の5(graphical.target)に戻します。

```bash
sudo systemctl set-default graphical.target
sudo systemctl get-default
```

graphical.target
になっていることを確認して再起動。

```bash
reboot
```

いつも通りの画面に戻り、完了です。
Deep Learning > セミナー情報 @ MathWorks > ディープラーニングの組み込み機器実装ソリューション～GPU/CPU編～ 2018-04-10

[ディープラーニングの組み込み機器実装ソリューション～GPU/CPU編～](https://jp.mathworks.com/company/events/webinars/upcoming/implement-deep-learning-applications-for-gpus-cpus-2410982.html?s_v1=22901&elqem=2374232_EM1_JP_DIR_18-03_MOE&elqTrackId=cfa78373a64243899e92474ef787bbe7&elq=08ab1e6cac534b97bdde40fe06e2f263&elqaid=22901&elqat=1&elqCampaignId=7577)

...
> デモ : 組み込み機器への[CNN実装](https://jp.mathworks.com/discovery/convolutional-neural-network.html)
...
> 対象製品
- [GPU Coder](https://jp.mathworks.com/products/gpu-coder.html)
- [MATLAB Coder](https://jp.mathworks.com/products/matlab-coder.html)
- [Neural Network Toolbox](https://jp.mathworks.com/products/neural-network.html)
- [Parallel Computing Toolbox](https://jp.mathworks.com/products/parallel-computing.html)

自分は遠方に在住しているのでセミナーには参加できない。

誰か参加して、Qiitaにて紹介していただけるとうれしいです。

リンク先の情報は自分の今後に役立つだろうか。
Mac のスクリーンショットを特定のディレクトリーに保存する

macOS のスクリーンショットは次のショートカットで撮れるが、保存先のデフォルトがデスクトップになっていてすぐにデスクトップが汚れてしまう。

- Shift + Command + 3
- Shift + Command + 4

これをなんとかするために特定ディレクトリーに保存先を変更する。

手動でやる場合、 `defaults write` コマンドで `com.apple.screencapture` という plist に `location` というキーで保存先を書き込めばいい。その後設定反映のために `SystemUIServer` を再起動。

```sh
defaults write com.apple.screencapture location ~/Desktop/ss
killall SystemUIServer
```

というあたりをいちいち書いていくのが面倒なので sh script を書いた。

https://github.com/januswel/dotfiles/blob/master/bin/ss2.sh

使い方は次のように。

```sh
# 保存先変更
./ss2.sh ~/Desktop/ss

# 保存先をデスクトップに戻す
~/ss2.sh
```
エラー　8193　VSS

ボリューム シャドウ コピー サービス エラー: ルーチン RegOpenKeyExW(-2147483646,SYSTEM\CurrentControlSet\Services\VSS\Diag,...) の呼び出し中に予期しないエラーが発生しました。hr = 0x80070005, アクセスが拒否されました。
。 

操作:
   ライターを初期化しています

コンテキスト:
   ライター クラス ID: {e8132975-6f93-4464-a53e-hoge}
   ライター名: System Writer
   ライター インスタンス ID: {8b93b571-c041-42f4-b84a-hoge}

って何じゃろ？？？
エラー　ADWS　1202

現在このコンピューターは指定されたディレクトリ インスタンスをホストしていますが、Active Directory Web サービスはこのサービスを提供できません。Active Directory Web サービスはこの操作を定期的に再試行します。
 
 ディレクトリ インスタンス: NTDS
 ディレクトリ インスタンス LDAP ポート: 389
 ディレクトリ インスタンス SSL ポート: 636

が気になるので調査のログ失礼します。
Mono: C# の http クライアントMの使い方 (Post)

RestSharp.dll というライブラリーを使います。
RestSharp.dll　へのシンボリックリンクを　コンパイル、実行するフォルダー内に作成します。

```cs:http_post.cs
// --------------------------------------------------------------------
/*
	http_post.cs

						Mar/08/2018
*/
// --------------------------------------------------------------------
using	System;
using	System.IO;
using	RestSharp;
// --------------------------------------------------------------------
class	http_post
{
// --------------------------------------------------------------------
static	void	Main (string[] args)
{
	Console.WriteLine ("*** 開始 ***");

	const string host_in = "https://httpbin.org";
	const string user = "jiro";
	const string password = "123456";

	var client = new RestClient(host_in);

	var request = new RestRequest("/post", Method.POST);
	request.AddParameter("user", user);
	request.AddParameter("password", password);

	IRestResponse response = client.Execute(request);

	var content = response.Content;

	Console.WriteLine (response);
	Console.WriteLine (content);

	Console.WriteLine ("*** 終了 ***");
}

// --------------------------------------------------------------------
}

// --------------------------------------------------------------------
```

```text:Makefile
http_post.exe : http_post.cs
	mcs http_post.cs -r:RestSharp.dll
clean:
	rm -f *.exe
```

実行コマンド

```bash
mono ./http_post.exe
```

次のバージョンで確認しました。

```text
$ mono --version
Mono JIT compiler version 6.8.0.105 (Debian 6.8.0.105+dfsg-3.2 Wed Jun 30 05:34:49 UTC 2021)
```

Get の例はこちら
[Mono: C# の http クライアントの使い方 (Get)](https://qiita.com/ekzemplaro/items/5ba964181da7a2db701c)
Rでオブジェクトの構造を調べたいときの関数

```
str(オブジェクト名)
```

はじめての関数を使った結果の出力データフレームになにが入っているかみたいときに使います。

よく使うのに、よく忘れるので備忘メモとして。

あとそのデータの構造自体を知りたいときはこちら。

```
class(オブジェクト名)
```

dist関数の結果とかそのままcsvファイルに出力できないことがあり、この関数のお世話になりました。

余談ですがdist関数の結果をcsv出力したいときは、

```
as.matrix(オブジェクト名)
```

としてあげるとマトリクス扱いになり出力できます。

追記：
scale関数とか使ってデータフレームがマトリクス形式になってしまったときに、データフレームにする関数はこちらです。

```
as.data.frame(オブジェクト名)
```
MBED OS5を使ってSDカードのR/Wしてみたよ

# はじめに

これは「MBED OS5ってやつを見直したよ」っていう、最近身の回りであったハートウォーミング（？）なお話です。（MBEDさんにとっては理不尽極まりないけど・・・）			
			
まず正直に言いますが、私が最初にMBED OSって聞いて、「スレッドとかメッセージパッシングとか書くやつか。めんどくさいなぁ・・・。」って思いました。			
			
昨今の組み込みOSは、リッチなデバイスを中心にLinuxが跋扈してuITRONベースの宗派いろいろとかAmazonのFreeRTOSとかもうてんやわんやな状態です。 （あくまでも私個人の見解ですが）

そういうごちゃごちゃした状況で、
　「もし苦手な英語のドキュメントを読んで使ってみたものの、別のデファクトスタンダードが現れたらどうすんだ」
　「自分の身は自分で守るしかない」
という身勝手でチキンで一部意味不明な殻に閉じこもっていたわけです。			
			
しかし、実際使ってみて、「なかなか。フムフム。これはこれで。というか、OSって付いてるけど全然難しくないやーん」と感じましたので、本記事を書くに至りました。		

# 実際にやったこと
			
## ハードウェアの準備
            
そろそろ文章を書き疲れました（早い）。
図を中心にして説明します。巻いていきましょう（メリハリが大事！）。
今回用意したブツはこれです。			
![hw_structure.png](https://qiita-image-store.s3.amazonaws.com/0/155449/2680bb22-49d3-ec37-10a7-f15edfcf41fa.png)

使ったマイコンボードはFRDM-K22Fです。SDカードにはSPIモードの結線で繋いでいます。

## ソフトウェアの準備
			
mbedのCLI環境を整えて、SDカード用のプロジェクトをimportすれば終わりです。			
			
### CLI環境の構築

この辺りの方々の記事を参考にさせていただきました。
　①https://os.mbed.com/users/ytsuboi/notebook/ja-setup-mbed-cli-on-windows/
　②https://qiita.com/matsujirushi/items/bf4db4514a753f794643  

　※importのやり方とかもここを見ればバッチリかと思います。	

### SDカードのプロジェクトのインポート
　↓のプロジェクトをインポートします。
　https://github.com/ARMmbed/mbed-os-example-fat-filesystem	

　※インポート時間が長いです。（私のところでは30分以上待った気がします）
　※「Issue」にもありますが、現状のリポジトリをimportするとSDカードのフォーマットが失敗（-9のリターン）しますので、「mbed-os」を5.7.6にしてください。（私はmbed-os-example-blinkyのプロジェクトを元々インポートしていましたので、そこからmbed osのフォルダだけコピペしました）
　※ここのプロジェクトはそのままだとファイルシステムはRAM上に作る仕様なので、上記ページ記載の↓の変更を行います

［抜粋：ファイルシステム構築ターゲットをRAMからSDカードへ変更する方法］
![change_article.png](https://qiita-image-store.s3.amazonaws.com/0/155449/e7c91aa2-51d5-9353-f42a-6f8d42556796.png)
［参考：実際に変更したコード］
![code_change.png](https://qiita-image-store.s3.amazonaws.com/0/155449/4f92d87f-5f0d-2f6d-79ad-110980ca4395.png)

## 動かしてみる

 ここまでの手順で動作させると以下のようなメッセージが出て成功したことがわかります。		

```出力メッセージ
Welcome to the filesystem example.
Formatting a FAT, RAM-backed filesystem. done.
Mounting the filesystem on "/fs". done.
Opening a new file, numbers.txt. done.
Writing decimal numbers to a file (20/20) done.
Closing file. done.
Re-opening file read-only. done.
Dumping file to screen.
0
1
2
3
　：（省略）
17
18
19
EOF.
Closing file. done.
Opening root directory. done.
Printing all filenames:
  numbers.txt
Closeing root directory. done.
Filesystem Demo complete.
```
			
 さらにSDカードを取り出してPCで中身を見てみると、以下のようにファイルが作られています。		

![SD_contents.png](https://qiita-image-store.s3.amazonaws.com/0/155449/0d5b5466-9c74-26fc-03f2-1a22d2a127d0.png)

 ※フォーマットエラーで-5が返る場合はハード的にあまりよろしくない状態になっているようです。SDカードのボードを抜き差しすると解消しました。
 （プルアップとかすれば解消するのかしら・・・）	
			
			
# 終わりに

いかがでしたでしょうか。
私はこのようにMBED OS5を使ってみて、「簡単に使えて今後も使ってみたい」と感じました。

また、SDカードは色々使い道がありますので、発想の着火剤になるかと思います。
（今回やったことも実は別の目的の副産物なのですが、その話は長くなるので今回はパスします。）
			
			
至らないところは処々あるかと思いますが、見ていただいてありがとうございました。
тнайк чoμ_〆(・ω・｡)			
			
			 
# 追記
もう少しMBEDについて書いておくと、私はしばらくクラウドのMBEDを使っていませんでした。
そこで、最近使ってみたところ、インポートでわけのわからないエラーやワーニングがでて気が滅入りました。
本記事のようにリポジトリがGitHubでホストされているMBED OS5を使った開発の方が今後は主流になっていくのかもしれません。
Mono: C# の http クライアントの使い方 (Get)

RestSharp.dll というライブラリーを使います。
RestSharp.dll　へのシンボリックリンクを　コンパイル、実行するフォルダー内に作成します。
[RESTSHARP.DLL FILE INFORMATION](https://www.dll4free.com/restsharp.dll.html) からダウンロード

```cs:http_get.cs
// --------------------------------------------------------------------
/*
	http_get.cs

						Mar/08/2018
*/
// --------------------------------------------------------------------
using	System;
using	System.IO;
using	RestSharp;
// --------------------------------------------------------------------
class	http_get
{
// --------------------------------------------------------------------
static	void	Main (string[] args)
{
	Console.WriteLine ("*** 開始 ***");

	const string host_in = "https://httpbin.org";

	var client = new RestClient(host_in);

	var request = new RestRequest("/get", Method.GET);

	IRestResponse response = client.Execute(request);

	var content = response.Content;

	Console.WriteLine (response);
	Console.WriteLine (content);

	Console.WriteLine ("*** 終了 ***");
}

// --------------------------------------------------------------------
}

// --------------------------------------------------------------------
```

```text:Makefile
http_get.exe : http_get.cs
	mcs http_get.cs -r:RestSharp.dll
clean:
	rm -f *.exe
```

実行コマンド

```bash
mono ./http_get.exe
```

次のバージョンで確認しました。

```text
$ mono --version
Mono JIT compiler version 6.8.0.105 (Debian 6.8.0.105+dfsg-3.2 Wed Jun 30 05:34:49 UTC 2021)
```
Jasmineで可変エラーメッセージを掴むには

# jasmineは可変エラーメッセージに対応してない

[公式ドキュメント](https://jasmine.github.io/2.8/introduction)より

```javascript

it("The 'toThrowError' matcher is for testing a specific thrown exception", function() {
    var foo = function() {
      throw new TypeError("foo bar baz");
    };

    expect(foo).toThrowError("foo bar baz");
    expect(foo).toThrowError(/bar/);
    expect(foo).toThrowError(TypeError);
    expect(foo).toThrowError(TypeError, "foo bar baz");
  });
```

上記のように関数ポインタを渡す必要があるので以下のような関数をテストする際に困る。

```javascript
testFunction(hoge) {
  if (condition) throw new Error(`Error Message ${hoge} !`);
}
```

## 解決方法

[こちら](https://stackoverflow.com/questions/21221697/using-tothrowerror-in-jasmine)参照

無名関数で囲んでやれば関数ポインタ渡すことになるよね？ということらしい。
なので、以下のようにテストすればいい。

```javascript
it('適切なエラーが投げられていること', () => {
  expect(() => {testFunction('たまげた')}).toThrowError('Error Message たまげた !');
});
```

以上！！
CentOS > cron設定の消失

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

### 状況

プログラムのバックアップ用cronを設定したサーバーを使っている。
(自分用メモ: 「backup_exec > 20:30に動かしている | crontab設定」 @ esa.io)

> cron設定は以下。
> ```$ sudo cat /var/spool/cron/y_okada
30 20 * * * /home/wrf/TOOL/backup_exec```

上記のファイルを確認したところ、空になっていた。
原因は不明である。

### 使用サーバー

[CentOS > 謎の再起動 > 08:49 x 4 > 現在時刻の6分前](https://qiita.com/7of9/items/b0c6e9a09dc4379f82fb)
にて原因不明の再起動を起こしたサーバーで発生した。

### とりあえず保留

cron設定しなおし運用してみる。
再度問題があった時に詳しい調査を行う。
10020　このコンピューターには 1 つ以上の IPv6 アドレスが動的に割り当てられています。DHCPv6 サーバーの動作を安定させるには、静的 IPv6 アドレスのみを使用してください。

https://social.technet.microsoft.com/Forums/ja-JP/361aa91e-aac3-43d9-b222-f7734b3659fe/rtmdcdhcplanipv6?forum=winserver8

は

IPv6/DHCPv6を利用利用しない場合、イベントID 10020のイベントログは無視して構わないとのKBが出ています。KBの内容は2008R2、2008の内容ですが、2012でも同様と考えて頂いて構いません。

との事……