OmniAICreator/Qiita-1.07M huggingface dataset:
【備忘録】Safariでassets配下の動画が再生されない


# 問題点

- Webサイト上に配置した動画(mp4)がSafari(Mac/iOS)で表示されない
- Chrome(Mac)では正常に表示されている

# 解決方法

- 動画(mp4)を`/assets`配下から`/public`配下に移動した

# 環境

アプリ | バージョン
:--- | :---
Rails | 5.1.4
Chrome (Mac) | 64
Safari  (Mac)| 11.0.3
Safari (iOS) | 11.2

# 実装

```
<h2>Assetsに配置したmp4ファイル</h2>
<video src="<%= asset_path 'sample.mp4' %>"
       width="640" height="360"
       autoplay muted loop playsinline>
</video>

<hr>

<h2>Publicに配置したmp4ファイル</h2>
<video src="/movie/sample.mp4"
       width="640" height="360"
       autoplay muted loop playsinline>
</video>
```



# スクリーンショット

## Chrome (Mac)

![mp4_chrome.png](https://qiita-image-store.s3.amazonaws.com/0/141934/09419940-f560-bc37-f979-a8afb137419d.png)

## Safari  (Mac)

![mp4_safari_mac.png](https://qiita-image-store.s3.amazonaws.com/0/141934/14d02079-2894-b444-ad2a-e4a7be8c0e23.png)

## Safari (iOS)

<img width="280" alt="mp4_safari_iphone.png" src="https://qiita-image-store.s3.amazonaws.com/0/141934/20a79c13-5444-fc38-caa9-6d0a6b39c1cb.png">
UXは機能とユーザビリティの上に立脚

山岡俊樹先生が連載されている[「観察工学の概念と方法」](https://ogis.kansatsu.jp/blog/category/4)の中で、次の記事にとても分かりやすい図があったのでメモ。

「第69回　UXを考える(5)」<https://ogis.kansatsu.jp/blog/detail/242>
![UXの構造](https://ogis.kansatsu.jp/_files/blog/images/yamaoka69_1.jpg)

図１に示されている、機能－ユーザビリティ－UXのピラミッドはとても分かりやすい。
よいUXを提供するためには、機能が十分満足できるレベルであることはもちろん、次の６つの感覚を生じさせるユーザビリティを備えている必要がある。

(1) 非日常性の感覚 
(2) 獲得の感覚　 
(3) タスク後に得る感覚 
(4) 利便性の感覚　 
(5) 憧れの感覚　 
(6) 五感から得る感覚

記事の中で述べられている「70デザイン項目」は、[2017年10月に参加したセミナー](https://www.hcdnet.org/hcd/event/entry-1102.html)でも教えていただいた、人間工学に基づくUXの要因とその体系（UXのフレームワーク）。詳細は山岡先生の著書が詳しいが、次のブログの引用でも概要はつかめるだろう。

### 70デザイン項目の引用
http://d.hatena.ne.jp/stj064/20091207/p1

### 著書のうちの一冊
* [「デザイン人間工学-―魅力ある製品・UX・サービス構築のために」](https://www.amazon.co.jp/デザイン人間工学-―魅力ある製品・UX・サービス構築のために―-山岡-俊樹/dp/4320071921)
aptitude upgradeで「dpkg: パッケージ rsyslog の処理中にエラーが発生しました (--configure):」

Windows 10のBoW(Bash on Ubuntu on Windows)で、OSを最新版に更新できないエラーが発生しました。強制削除してインストールしなおすと解消しました

# 現象

```bash:エラー
$ sudo aptitude upgrade
インストール・削除・更新されるパッケージがありません。
0 個のパッケージを更新、 0 個を新たにインストール、 0 個を削除予定、0 個が更新されていない。
アーカイブ 391 k バイト中 0  バイトを取得する必要があります。 展開後に 0  バイトのディスク領域が新たに消費されます。
dpkg: パッケージ rsyslog の処理中にエラーが発生しました (--configure):
 パッケージ rsyslog は設定の準備ができていません。
 設定できません (現在のステータス `half-installed')
dpkg: パッケージ at の処理中にエラーが発生しました (--configure):
 パッケージ at は設定の準備ができていません。
 設定できません (現在のステータス `half-installed')
処理中にエラーが発生しました:
 rsyslog
 at
E: Sub-process /usr/bin/dpkg returned an error code (1)
パッケージをインストールできませんでした。復旧を試みています:
```

# 対処

エラーになっているパッケージを強制削除した後、インストールしなおした。

```
$ sudo dpkg --force-all -r rsyslog at
$ sudo aptitude install  rsyslog at
```

# 参考にさせて頂いたサイト

  * [install/remove不能状態となったパッケージの処置](http://tkmtmkt.hatenablog.com/entry/20120201/1328108099)

# 環境

  * Windows 10 Pro 1709/16299.248
  * Ubuntu VERSION="14.04.5 LTS, Trusty Tahr"
Bluetooth > jaybird RUN対応デバイス

Bluetoothの互換性についてよくわかっていない。


ワイヤレスイヤホン jaybirdのRUNという製品はBluetooth 4.1という仕様のようだ。
https://jaybirdsport.com/ja-jp/run-true-wireless-sport-headphones/run-specs.html

接続相手としては上記に以下の記載がある。

> RUNは、次のBluetoothデバイスに対応：iPhone（3、3S、4、4S、5、5C、5S、6、6 Plus、7、7 Plus）、Apple Watch（1、2）、iPod Touch、iPad、iPad mini、新しいiPod nano、Android、Windows、Blackberry、Android Wearスマートウォッチ、パソコン、Macおよびゲーミングデバイス。    

対応デバイスのiPhoneのうち、iPhone 4あたりを確認すると以下のように2.1などでも接続できるようだ。
https://ja.wikipedia.org/wiki/IPhone_4
> Bluetooth 2.1 + EDR Cambridge Bluecore4

[Raspberry PiでUSB/Bluetoothアダプタを使う](https://qiita.com/yuyakato/items/4ca410bd216a8aadd5ce)
で使われているBluetooth(USB)アダプタは4.0+EDR/LE対応という仕様のようだ(4.1とは違う?)。

4.0と4.1の互換性については下記に詳しい。
[Bluetooth 4.0とBluetooth 4.1は互換性があるのか](http://direct.pc-physics.com/network/bluetooth4-bluetooth4-1-compatibility.html) @ 直販パソコンのすすめ

## 利用用途

### 就寝前のリスニング

Apple TV(第二世代) + FMトランスミッター + [iRiver T10](http://kakaku.com/item/01305111228/)の組合せでリスニングを時々行う。Star Trek Next Generation もしくはDeep Space 9。

Apple TV(第二世代)にはBluetoothは未搭載。
https://ja.wikipedia.org/wiki/Apple_TV

RUN対応にするにはApple TVの買い替えは必要になる。


### 可動範囲の拡張

Desktop (Ubuntu 16.04 LTS)に5m程度のイヤホンを使っている。

USB Bluetoothアダプタ + RUNを使用することで、可動範囲は増える。

四六時中、音を聞く必要があるかはどうか。

### BorgSensorシステムの出力として

MemoryEnhancerではWiFiを使ってUDPでのコマンド送信をする。
その応答は画面を見ることで確認するのであるが、RUNを使って音としての応答にすると、ディスプレイの前に束縛されない。

### ラジオ体操

ラジオ体操の音源をUbuntuでならして、イヤホンケーブルの束縛なく、ラジオ体操ができる。


## 言い訳

@ 田尻智　ポケモンを創った男 by 宮晶太郎さん

> 当時は全然、不思議に思わなかったんだけど、「テレビゲームって面白い！」って興奮で夜も寝られなくなるような感じになって、小遣いを全部ゲームに使うとか、「参考書買う」って言いながらゲームにつぎ込むとか（笑）。塾に行くためのバス代をケチって、わざわざ歩いてゲームやったりとか（笑）。
...
ゲーム代を手に入れるための言い訳を無限に考えてた（笑）。


@ 海からの贈物 by Anne Morrow Lindbergh

> しかし今日では、私たちは私たちの孤独の世界に自分の夢の花を咲かせる代わりに、そこを絶え間ない音楽やおしゃべりで埋めて、そして我々はそれを聞いてさえもいない。

iRiver T10は単三電池駆動のため、バッテリーがへたるということがなく13年近く使用している(時給:労働基準法違反の大活躍）。RUNの場合はバッテリーがへたるので、5年程度で駆動時間はどうなっているか。
autosaveのときに属性に変更がなくても子のモデルでもsaveメソッドが必ず呼ばれるようにするには？

# 要求
ネストしたリレーションを保存するようなviewで、子のオブジェクトで設定されたコマンドに応じて自身の属性を書き換えたい場合の処理を行う。

# 課題の認識
まずモデルを以下のように定義したとします。

``` ruby
class FooObject < ApplicationRecord
  has_many :bar_objects, autosave: true, inverse_of: :foo_object
  accept_nested_attrubites_for :bar_objects
end

class BarObject < ApplicationRecord
  belongs_to :foo_object, inverse_of: :bar_objects
  attr_accessor :commands

  # コマンドに応じた処理
  def handle_commands
    # 属性をなんらか変更する
    ...
  end

  # こいつが怪しい
  before_validation :handle_commands
end
```

このときcommandsは、attributesに存在しないためbar.commands = 'do your best'などと設定しても、attributesは変更を認識しません。
ということは、autosave: trueとしたところで、自動保存は動かないかもしれません。

なぜ、かも、、、なのかというと、なんらかの属性を設定した場合には、変更扱いになるので、before_validation以下が動きます。

なんとも、微妙な挙動なのです。
すぐに思いつく解決策は、以下のようにコントローラーの中で明示的にhandle_commandsを呼び出すというものです。

```ruby
class FooObjectsController < ApplicationController
  def update
    @foo = FooObject.find(params[:id])
    @foo.attributes = foo_object_params
    @foo.bar_objects.to_a.select{ |b| b.commands.present? }.each(&:handle_commands)
    @foo.save
  end
end
```

まあ、これでもいいんですど、
これでは、コントローラーが仕様を知りすぎています。
rails consoleとか、他の例えばCSV一括取り込みなどで保存する場合も、いちいちこれをやらんといけません。

このhandle_commandsを呼び出すというのはbar_object固有の内部的な仕様です。
これはぜひともカプセル化したいので、BarObjectへ分離したいと思います。

# ではどうする？
railsは、autosaveをtrueに設定した際に、railsが保存プロセスを動かすべきかどうかを判断するときに、changed_for_autosave?メソッドを使って確認します。
通常であれば、ありがたい挙動なのですが、before_validation、あるいはカスタムのコールバックを定義していて、そこで属性を再設定しているときなどはそれらすら呼び出されないので、困ります。

実際のコードは違いますが、ざっくり言えば、railsがやっていることは、

```ruby
bar_objects.select(&:changed_for_autosave?).each(&:save)
```

のようなイメージです。
ですからこのメソッドをオーバーライドします。

``` ruby
class BarObject < ApplicationRecord
  ...

  def changed_for_autosave?
    super || @commands.present?
  end

  ...
end
```
これで、@commandsになんらか設定されていれば、autosaveのときでも変更があったものとしてrailsは処理してくれるようになります。

最終的にControllerからコマンドに対する処理を取り除いて以下のようにできます。

``` ruby
class FooObjectsController < ApplicationController
  ...

  def create
    @foo = FooObject.find(params[:id])
    @foo.attributes = foo_object_params
    @foo.save
  end

  ...
end
```

ここまで読んでくれてありがとう。
長いビット列を16進数にする

# はじめに
長いビット列を16進数にする方法を記載します。

# Excel
Excelでビット列を16進数にするには BIN2HEX を使います。
ただし ビット長は 9ビットまでです。9ビットを超えると正常に動作しません。

![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/84205/7540686a-3ed1-e4cb-05da-8bb88a2049b8.jpeg)

# Python
Pythonを使うと 9ビットを超えるビット列を扱えます。
ビット列は0bではじめます。formatを使うことで桁数を合わせた16進数にできます。
例を示します。
0b 0000 0011 0010 0000 0000 0000 0000 0000を8桁の16進数にする例です。

```python
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> '0x{0:08x}'.format(0b00000011001000000000000000000000)
'0x03200000'
```
Android NDKのデバッグでAndroid studioが固まる(tgkill)、クラッシュ　

ほぼ土日しか触らないということもあってこつこつと気負わず続けてきたのですが、なんとか最低限動くようになってきたマイアプリ。

だけどうまく動いてたと思ったら何かAndroid Studioのデバッガの調子が悪いというか、ブレークポイントまわりでステップを進めているとAndroidStudioが固まってしまうようになった。

なんだよ～昔のVCかよ～と思いつつも改善しないことには先に進めないのでいろいろ考えてみてると、ある箇所に思い至った。それは、グローバル領域でヒープメモリ確保するという行儀の悪いコード。このnewの中のコンストラクタでステップインアウトしてるとIDEが固まるのだった。テンポよくステップを進めると固まらなかったり？したのだが、tgkillエラーで止まったり止まらなかったり。


```
...
//大域でメモリ確保
CPlayer* _pPlayer = new CPlayer();

CPlayerIf* GetPlayer()
{
    return _pPlayer;
}
```

いろいろ試して効果なかったのだが、ここのメモリ確保をアプリのエントリポイント(ActivityのonCreate)の中から呼ぶようにすると一発解決。

```
CPlayer* _pPlayer = NULL;

CPlayerIf* GetPlayer()
{
    if(NULL==_pPlayer)
        _pPlayer = new CPlayer();
    return _pPlayer;
}
```

グローバルで書いたスタック領域がどういう順番で処理されるのかというのは把握しづらいところではあるけれども、その処理の中でヒープ領域を確保する、というのはあまり良くなかったのでしょう。まあこんなことする下手っぴはなかなかいないでしょうが、備忘を兼ねて登録しました。
RealmFlowソースコード覚書


自分用メモです。

## struct RealmFlow の型引数

```struct RealmFlow<RW : ReadWriteType, T, U, ROW: RawOrWrap>```

### RW

幽霊型その１

現在必要とされているトランザクションの種類が
- ReadOnly
- WriteOnly
- ReadWrite
なのかを覚えておくための幽霊型。

これにより、```realm.run(flow: flow)``` が呼ばれた時に、```realm.beginWriteTransaction()```を呼び出す必要があるかどうかをコンパイル時に決定出来る。

参考： [Realmの処理を再利用可能かつ合成可能にする@社内iOS勉強会](https://www.slideshare.net/yukitakahashi3139241/realmios)

### T

入力の型。

たいていは、```Realm.Object```の子クラスのはず。

### U

出力の型。

```subscribe()``` に渡される引数の型と考えれば、ほぼ間違いない。

### ROW

幽霊型その２

Uが、 生データRaw( ```Realm.Results<T>``` ) なのか ラップされたデータWrap( ```SequenceWrapper<T>``` ) なのかを表す。


## 抽象class SequenceWrapper

```class SequenceWrapper<T>``` は以下のシグネチャを持つ。

```var first: T?```

```var count: Int```
    
```func max(by: (T, T) throws -> Bool) rethrows -> T?```
    
```func min(by: (T, T) throws -> Bool) rethrows -> T?```
    
```func prefix(_ maxLength: Int) -> AnySequence<T>```
    
```func suffix(_ maxLength: Int) -> AnySequence<T>```
    
```func forEach(_ body: (T) throws -> Void) rethrows```

```func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, T) throws -> Result) rethrows -> Result```
    
```func reduce<Result>(into initialResult: Result, _ updateAccumulatingResult: (inout Result, T) throws -> ()) rethrows -> Result```

```func makeIterator() -> SequenceWrapper<T>._Iterator```
Rubyの勉強 基礎的なところ

C# javascript PHP、Javaなどからみて違うとこ。

ターミナルで実行するときは
irb
ファイルは.rb 
ファイル実行は ruby ファイル名

##他の言語と違うところなど
・出力はputs print p
・フォーマット指定はsprintf
・to_sメソッド 文字列化
・文字列からint to_i
・intからfloat to_f
・nullがnil
・改行が区切りなので;で終わらなくてもエラーにならない
・コメントは#
・変数宣言に型定義なし、変数の前になにかつける必要もない
・変数宣言だけだとエラーになる(何か値を代入する必要がある)
・変数名にアルファベット以外が使える(ひらがな、漢字)
・文字列比較は==とか!=でOK
・数値には`_`を含めることができる(`_`は無視される)
・++ --の演算子がない
・文字列、数値は暗黙的に変換されない
(文字列に数値を+で繋げる時はto_sしないとエラーになる
・小数計算の丸め誤差あり。
・条件分岐else if はelsif そしてendで終わる
・ifで&& ||を使った場合、戻りがtrue false出なく、最後に判定した結果を返す
・ifの反対unlessがある
・言語的にメソッド名も変数名も小文字のスネークケースで書く
・戻り値にreturnなくても最後に評価された式がメソッドの戻り値になる
・変数名.classでクラス名確認
・文字列のつくりかたで' "の他に%記法がある
・ヒアドキュメントは<<識別子 中身 識別子
・charはstring文字と文字列の違いなし
・三項演算子あり
・GCは自動
・同じメソッドに複数の名前がついている場合がある。size lengthなど・・・
(自分でも定義可能)
・object_idメソッドで参照がわかる。これが同じなら同じ参照
・ライブラリを読み込む場合は require ライブラリ名
・配列がArray
・for文でforも使えるけれどeachメソッドを使う

##メソッドの呼び出し
オブジェクト.メソッド(引数、引数・・・)
オブジェクト.メソッド 引数 引数 ・・・
引数がなければ
オブジェクト.メソッドだけで呼べる
ifとかもカッコなしでいける・・・
メソッド定義すらカッコなしでいける・・・たとえ引数があってもいける。
同じ処理で別の名前をつけることができる。エイリアスメソッド。

##小数の丸め誤差
Rationalクラスを使うと誤差が出ない。
rをつける。そして.to_fしてfloatにするという・・・めんどくさいな。
<img width="252" alt="スクリーンショット 2018-02-18 07.06.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/58ad5729-05be-0963-7541-bb041b5423b0.png">

##if分岐

```
if 条件A
    #処理A
elsif 条件B
    #処理B
else
    処理C
end
```
後置ifというのがあったり if els ifのあとに then入れてとかもあったけど使わない

ifで&& || を使った場合、true falseを返すわけではなく最後に評価した値を返す。

```
変数 = 条件A || 条件B || 条件C
```
最初にtrueになった条件の値を返す

##メソッドの定義
カッコなくても平気。
デフォルト引数指定できる。

```
def メソッド名(引数)
    #処理
end
```

?や!で終わるメソッドが作れる。
?は真偽値を返すのが慣習らしい。
!は使用する際は注意が必要らしい。
例えば引数の値自身を変化させてしまう場合などに!をつけたり・・・。

##%記法
%q! 'で囲ったのと同じ
%Q! "で囲ったのと同じ
%!  "で囲ったのと同じ
区切り文字は! ?  ~などの好きな記号が使える

```
name = "Ayumegu"
puts %!My name is #{name}!
```
出力 My name is Ayumegu

#１０進数以外のリテラル
2進数 0b
8進数 0
16進数 0x

##case文

```
case オブジェクトや式
when 値
　＃処理
when 値
  ＃処理
end
```

##三項演算子

```
あゆめぐ = 10
あゆめぐ > 1 ? "1匹よりいる" : "1匹以下"
```

##配列
new いらない。
配列がArrayのイメージ。
異なるデータ型が入れられる
存在しない要素を指定してもエラーにはならずnilが返る。
元のサイズより大きい添え字にデータが入れられる(間はnilで埋まる)
最後の要素に追加するには<<で入れる
削除はdelete_atメソッド

```
a = [1,2,3]
a[4] = 10 #とすると a[3]=nilが入る
b = [
    1,
    "あゆめぐ",
    3,
]

c = []
c << "あゆめぐ"
```

###多重代入できる
これによりdivmodという割り算の商とあまりを配列として返すメソッドで別々の変数で受け取ることができる

```
a,b = [1,2] #aに1 bに2が入る
syou, amari = 100.divmod(9)
```
（ConEmu初期設定）改行設定・コピペ挙動の変更を行う手順


コピペした時にワンラインになってしまう設定を変更します。

`Win+Alt+P > keys & macro > paste > paste mode #2` を `multi lines` に変更したらOK。

![https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_428c3c7d-2f79-4b9a-9158-02aefa142801.png](https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_428c3c7d-2f79-4b9a-9158-02aefa142801.png)

参考は以下。

https://conemu.github.io/en/SettingsPaste.html
PhpStormでPostgreSQLからの取得結果に対してタイムゾーンを設定する方法

# 発生事象

- PhpStormのDBツールからSelectで取得した日時情報が `UTC` になっている。
- PostgresqlのDB自体のタイムゾーンは `Asia/Tokyo` になっている。
- DBサーバー上でpsqlコマンドで取得するとちゃんと `Asia/Tokyo` になっている。

# 環境

- PhpStorm 2017.3.4
- PostgreSQL 9.6

# 解決方法

PhpStormで使っているPostgreSQL JDBCドライバの `VM options` に下記を設定すれば良い。

```
-Duser.timezone=Asia/Tokyo
```

設定画面は下記の`Database`ウィンドウでプロパティボタンを押下して、

![PhpStormでDB取得結果のタイムゾーンを設定する方法_01.png](https://qiita-image-store.s3.amazonaws.com/0/165884/a9c1b18d-474b-09bd-9a49-5df13ad46b33.png)

`Advanced` タブを選択すれば表示される。

![PhpStormでDB取得結果のタイムゾーンを設定する方法_02.png](https://qiita-image-store.s3.amazonaws.com/0/165884/ec12dd0e-bf23-a755-c2ed-63bc41d72fbe.png)
react-component-component


[ryanflorence/react-component-component: Declarative version of React.Component](https://github.com/ryanflorence/react-component-component)

ryanflorence製のReact.Componentを宣言的に扱えるライブラリ。
動機としては、ライフサイクルやいくつかのstateを扱いたい場合があるが、新しくコンポーネントを作りたくない場合ある。そんなときに使うとのこと。

まあ、`recompose`の一部機能の`render prop`版と捉えるのがいい。

```jsx
import Component from 'react-component-component'

ReactDOM.render(
  <div>
    <h2>Let's get some gists!</h2>
    <Component
      initialState={{ gists: null }}
      didMount={({ setState }) => {
        fetch("https://api.github.com/gists")
          .then(res => res.json())
          .then(gists => setState({ gists }));
      }}
    >
      {({ state }) =>
        state.gists ? (
          <ul>
            {state.gists.map(gist => (
              <li key={gist.id}>{gist.description}</li>
            ))}
          </ul>
        ) : (
          <div>Loading...</div>
        )
      }
    </Component>
  </div>,
  DOM_NODE
);
```

`children`または`render prop`に`{state, setState, props, forceUpdate}`が渡ってくるのでそれを使う。

実装はとても普通というか`redner prop`を使うなら誰もがこういうことするだろうなという実装。まあもう少しちゃんとテスト書こうなという気持ちはある。

この抽象を使えると面白くて、例えば`readme`にある例をさらに`render prop`のパターンで`Counter`として分離するとこうなる。

```jsx
import * as React from 'react'
import Component from 'react-component-component'

const Counter = ({ children }) => (
  <Component initialState={{ count: 0 }}>
    {({ setState, state }) =>
      children({
        count: state.count,
        inc: () => setState({ count: state.count + 1 }),
        dec: () => setState({ count: state.count - 1 })
      })
    }
  </Component>
)

const App = () => (
  <Counter>
    {({ count, inc, dec }) => (
      <div>
        <h2>Every app needs a counter!</h2>
        <button onClick={dec}>-</button>
        <span> {count} </span>
        <button onClick={inc}>+</button>
      </div>
    )}
  </Counter>
)

export default App
```

ここにはコンポーネントしかないが、ロジックがある。

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="und" dir="ltr">`component component` is fantastic😆<a href="https://t.co/1armRnGUun">https://t.co/1armRnGUun</a> <a href="https://t.co/o2DvI8nS5B">pic.twitter.com/o2DvI8nS5B</a></p>&mdash; 𝔸𝕂𝔸𝕄𝔼@アルバイト.js (@akameco) <a href="https://twitter.com/akameco/status/964986866574348288?ref_src=twsrc%5Etfw">February 17, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
sympy で特殊関数


sympy は Python で所謂 Matematica の要領で数式計算をしてくれるパッケージ

インストールは普通に

```bash
$ pip3 install sympy
```

など、pip でできる (上の例は python3 と `pip3`）。

## 基本

### 微積分


```python
import sympy

sympy.var('x')

print(sympy.diff(x**2 + x, x)) # 微分
print(sympy.integrate(x**2 + x, x)) # 不定積分
print(sympy.integrate(x**2, (x, 0, 1))) # 定積分

print(sympy.latex(x**2)) # LaTex 表記
```

### 分数

0.333 じゃない、$ 1/3 $ が欲しいんだ。

```python
print(sympy.Rational(1, 2))
```

### 数値

逆に数値が欲しい場合は `evalf()` メソッド

```python
print(sympy.pi) # => pi
print(sympy.pi.evalf()) => 3.14159265358979
```

## 初等関数

普通に `pi`, `sin`, `cos`, `sqrt`, `erf` などなど


## 特殊関数

このドキュメントを見れば良いみたい。`gamma`, `beta`, ベッセル関数、などなど、それなりに揃っている。

http://docs.sympy.org/latest/modules/functions/special.html



### Legendre polynomial

$$ P_\ell(x) = \texttt{legendre}(l, x) $$

```python
from sympy import *
var('x')
print(legendre(2, x))
```

### Spherical harmonics

$$ Y_{\ell m}(\theta, \phi) = \texttt{Ynm}(l, m, theta, phi)$$


```python
from sympy import *
var('theta')
var('phi')
print(Ynm(2, 2, theta, phi).expand(func=True))
```

多項式と Legendre 多項式を行ったり来たりしたかった私はこのくらいで満足。
Swift入門者むけハンズオン！Swift愛好会 vol28 補足(上揃えのUILabelの作り方)

#### 01.UILabelを置いて制約をつける
![01.UILabelを置いて制約をつける.gif](https://qiita-image-store.s3.amazonaws.com/0/86930/d43179c7-8caa-b52d-a554-9db460aa2aef.gif)
#### 02.改行と上揃えになる制約をつける
![02.改行と上揃えになる制約をつける.gif](https://qiita-image-store.s3.amazonaws.com/0/86930/b7741593-a398-9f6b-1b21-b17af972d1cd.gif)
#### 03.UILabelをコードに紐づける
![03.UILabelをコードに紐づける.gif](https://qiita-image-store.s3.amazonaws.com/0/86930/c94ca26b-fac9-464a-6893-ac583d532eb8.gif)
tmuxで開発用の常駐プロセスを複数分割しながら起動する

tmuxinator を使うまでもないケースで、1画面で複数プロセスを起動したいようなとき
勿論ログも混ぜたくない

例: webpack-dev-server, jest --watch, glow(flow の監視版) を同時に立てたい

```script/start-dev
#!/usr/bin/env sh
tmux split-pane -h \; send-keys "yarn glow --watch" Enter
tmux split-pane -v \; send-keys "yarn jest --watch" Enter
tmux split-pane -v \; send-keys "yarn webpack-dev-server" Enter
```

![](https://i.gyazo.com/12e565adad45dd5abd898e6880386a78.png)

(縦分割の幅を等分にしたかったがわからなかった)

ちゃんとやるなら tmuxinator だとはわかるが、設定が色々面倒なのでこれぐらいでいい気がする
【Ruby on Rails】gemのbundle installのエラー 

railsチュートリアル1.5.1 Herokuのセットアップにて
Gemfileを書き換えてbundle install --without productionを実行するも

Bundle complete! 16 Gemfile dependencies, 64 gems now installed.
Gems in the group production were not installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
というエラーメッセージが出てしまい"pg"のインストールが出来ません。

原因など分かればご教示下さい。

gemのbundle installのエラー
Redmine4プラグイン開発ハンズオンに参加した

アジャイルウェアさん主催の [Redmine4(Rails5)プラグイン開発ハンズオン無料セミナー](https://agileware.connpass.com/event/72689/) に参加してきたので、内容やポイントなどを備忘録程度にまとめます。なお、ハンズオンで実施された内容の資料は参加ページのほうにアップロードされているのでそちらも合わせて。

# 実施内容

Redmine環境の構築後、今回のために用意されたサンプルプラグインとして [maimai77/redmine_iine](https://github.com/maimai77/redmine_iine) をコミットログどおりにコピペ写経しつつ解説（コードを見ながら口頭で）を聞いていくという流れでした。

ソースを自分で読み解いていけば、今回のハンズオンに参加されていない方でも、コミットログを追って似たようなことはできるかと思います。[Redmine公式のPlugin Tutrial](http://www.redmine.org/projects/redmine/wiki/Plugin_Tutorial) も合わせて読むとよいでしょう。

今回のハンズオンでは、まだ開発中のRemine4をターゲットとしてプラグインを作っていくことになっていました。Redmine4ではRails5.1になるので、その影響でいくつか従来とは異なる実装をする必要があります。上記 redmine_iine の実装は、Redmine3以前のプラグインをRedmine4向けにも対応させたい人にも参考になりそうです。（今回の実装はシンプルにRedmine4向けのみで、3には対応してないはずですが）

あと、Rails力もある程度必要でした。私はあまり持ち合わせてないので、都度調べながらソースを読んでいたりもしました。

# ハンズオンのポイント

* プラグインをつくるとき、Redmine公式のPlugin Tutrialではgeneraterを使うようになっているが、アジャイルウェア社のエンジニアはgeneratorは使わずゼロからリソースを作っていくとのこと（Redmineのプラグインgeneratorがあまりいけてないらしい）
* Redmineのプラグインで何らかの画面に変更を加えるときは [Hooks List](http://www.redmine.org/projects/redmine/wiki/Hooks_List) の中にあるView Hooksを使って実装していく
    * View Hooksでerbを挿入することになるが、表示したい項目のhtmlをそのまま挿入のではなく、Javascriptで要素を差し込むようなパターンにすることが多い。
        * Redmine自体のビューがとても変わりやすく、JavaScriptで埋め込んだほうが柔軟に対応できるので
        * そもそもRedmineで実装されているHooksではちょうどいい位置に挿入できるようなHooksがないこともよくある
            * チケットのジャーナルの下に差し込むHookはあるけど上に差し込むのがなくて困ったりする
            * Hookをwikiからがんばって探すより、汎用的に使える view_layouts_base_content で差し込んじゃうのが楽 
    * （[今回のコード](https://github.com/maimai77/redmine_iine/commit/a06af31909cf4e8a39258970ab40c87140dbf22f#diff-c17c9104b270dbddb36a83f0c63b5129R7)） をみて
        * Q: プラグインを作るときRedmineの画面を見て、実装したい画面のコントローラとアクション名を探すときはどうするのがいいですか
            * A: 実際にRedmine操作するとログにでるので、そこから追うのが早い。もしくはroutesを読む
* [このへん](https://github.com/maimai77/redmine_iine/commit/46e9eafa9c9965baf3874a75ea7d5820bb85d41b#diff-f0e04085d72ce0295d98b8156fd78520R17) で既存のRedmineのIssueにパッチをあてることで（includeでMix-inして） 、Issueにiine_count（イイネ数）を追加する
   * （Ruby 2.3のはなしだけど） ぼっち演算子 `&.` をつかうとスマートに書けるのでよい
   * ActiveSupport::Reloarder　はRails5から。従来と変わるポイント。古いプラグインだと違う書き方になるので使っていれば動かなくなるところ
       * Redmine3と4の両対応するには、主に2通りの方法
           * 愚直にバージョン判定してifで分岐する
           * プラグインのリポジトリ/ブランチ自体を別物にして管理しちゃう
* Railsのバージョンが上がったことにより、 `alias_method_chain` は非推奨になった。代わりに Prepend をつかう
* 今回はCloud9（AWS Cloud9）を利用したが、他にもプラグイン開発する環境はいろいろとやりかたがある
    * Dockerで立てる
    * ansibleで立てる
    * Cloud9のオープンソース版を使う
    * 等
* Q: プラグインのテストするときに参考になるものはありますか？
    * A: アジャイルウェア社で開発しているプラグインはだいたいRSpecでテストしている。（[アジャイルウェア社のGithubリポジトリ](https://github.com/agileware-jp)みるといいかも） 外部には公開されていないテスト用の資材（秘伝のタレ）もあるが、整理すれば一般にも公開できるかも
* テストコード上、コントローラ周りとかは軽めな物が多い。重点としては、リクエストしてどういう値が返ってくるかとか、画面表示とかを中心にテストを組んでいる。つくりすぎてもメンテコストかかるので

# 所感

いろいろ思うところがありましたが割愛します
make-variable-buffer-localとmake-local-variableの関係

なんか同じような名前の機能だけど別の機能。

## 三行で

* Emacsでの「ローカル」とは、変数にバッファごとに独立した値を保持できることです。
* `make-local-variable`は、本来ローカルでない変数を現在のバッファで一時的にローカルにします。
* `make-variable-buffer-local` は、その変数が常にローカルとしてセットされるようにします。

この両者の関係は、Emacs 24.3で追加された `subr.el` を見ればわかりやすいです。
[`emacs-26.0.91`](https://github.com/emacs-mirror/emacs/blob/emacs-26.0.91/lisp/subr.el#L120-L133)より抜萃。

```subr.el
(defmacro setq-local (var val)
  "Set variable VAR to value VAL in current buffer."
  ;; Can't use backquote here, it's too early in the bootstrap.
  (declare (debug (symbolp form)))
  (list 'set (list 'make-local-variable (list 'quote var)) val))

(defmacro defvar-local (var val &optional docstring)
  "Define VAR as a buffer-local variable with default value VAL.
Like `defvar' but additionally marks the variable as being automatically
buffer-local wherever it is set."
  (declare (debug defvar) (doc-string 3))
  ;; Can't use backquote here, it's too early in the bootstrap.
  (list 'progn (list 'defvar var val docstring)
        (list 'make-variable-buffer-local (list 'quote var))))
```

Emacs Lispでのニュアンスとしては、`defvar-`は変数定義、`setq-`は変数のセット(代入・束縛)ですね。

そもそもEmacs 24.3以降では覚えやすい`defvar-local`と`setq-local`を使っておけばいいので、わざわざ紛しい方を覚えておく必要は特にありません。

つまり、以下の記述はEmacs 24.3未満との互換性を考慮する必要がある場合の専用だと思ってください。

## 解説

### `make-local-variable`

**本来は全体で共有される変数だが、特別にバッファローカルにしたい**場合に利用します。

```init.el
(defun my/enh-ruby-mode-hook ()
  "Enhanced Ruby Modeでだけ ac-ignore-case を t にしたいお"
  (set (make-local-variable 'ac-ignore-case) t))
```

`ac-ignore-case`は本来カスタマイズ変数なので、その影響は全体に影響します。そのため、特定のモードでは特別にローカルとして設定する必要があるのです。

しかし、 `(set (make-local-variable 'ac-ignore-case) t)` ってビジュアルがもう野暮ったい。

```init.el
(defun my/enh-ruby-mode-hook ()
  "Enhanced Ruby Modeでだけ ac-ignore-case を t にしたいお"
  (setq-local ac-ignore-case t))
```

`setq-local`で超すっきりしましたね。

### `make-variable-buffer-local`

**最初からバッファローカルとして設定させたい**変数に利用します。

`copy-file-on-save-dest-dir` は `.dir-locals.el` で設定させたいのです。

```copy-file-on-save.el
;;;###autoload
(progn
  (defvar copy-file-on-save-dest-dir nil
    "Path to deployment directory or convert (mapping) function.")
  (make-variable-buffer-local 'copy-file-on-save-dest-dir)
  (put 'copy-file-on-save-dest-dir 'safe-local-variable #'stringp))
```

`copy-file-on-save-dest-dir`って何回も書かなきゃいけないのはだるいですね。

```copy-file-on-save.el
;;;###autoload
(progn
  (defvar-local copy-file-on-save-dest-dir nil
    "Path to deployment directory or convert (mapping) function.")
  (put 'copy-file-on-save-dest-dir 'safe-local-variable #'stringp))
```

一行減りました！ うれしい！ そんなことより、[僕みたいな記憶力の悪い人間](https://github.com/emacs-php/emacs-auto-deployment/pull/2/commits/72986f2d5d5ef66a6f2cca19055a4f1832c435f8)が[ミスをしにくいコードになった](https://github.com/emacs-php/emacs-auto-deployment/pull/2/commits/e51f51f502270383efbcc7a9750f20aaf3bc8ef9)のは嬉しいことです。

## まとめ

みんなは早うEmacs 24.3以下を切って`defvar-local`と`setq-local`を使ってな。
SAM で API Gateway の Base Path Mapping を設定する

この記事は、AWS Serverless Application Model (AWS SAM) で API Gateway の Base Path Mapping を設定しようとした際の記録です。


# [AWS Serverless Application Model (AWS SAM)](https://github.com/awslabs/serverless-application-model) とは

- AWS がサーバーレスアプリケーションを構築するためのフレームワーク
- Lambda, API Gateway, DynamoDB などのリソースを手軽に管理できる
- ベースは AWS CloudFormation

## 参考
- [AWS Serverless Application Model (AWS SAM) を使ってサーバーレスアプリケーションを構築する](https://dev.classmethod.jp/cloud/aws/aws-serverless-application-model/)


# SAM で API Gateway の Base Path Mapping を設定する（2018/05/18追記）

- SAM の AWS::Serverless::Api では Base Path Mapping の設定ができない
  - [AWS::Serverless::Api](https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessapi)

- AWS::Serverless::Api と一緒に AWS::ApiGateway::BasePathMapping のリソースを作成する
  - ~~AWS::ApiGateway::BasePathMapping の Stage に指定する値は、AWS::Serverless::Api から取得できないため、以下の値を指定する~~
  - `AWS::Serverless::Api のリソース名 + AWS::Serverless::Api の StageName + "Stage"`

- AWS::ApiGateway::BasePathMapping の Stage には以下の値を指定する
    - `!Ref MyApi.Stage`
    - 2018/03/13 にリリースされた SAM v1.4.0 にて API の Stage への参照が使えるようになりました
       - Release 1.4.0 : [Refer to resources generated by SAM](https://github.com/awslabs/serverless-application-model/releases/tag/1.4.0)


```yaml:template.yml

  SampleApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      DefinitionUri: /path_to_swagger/swagger.yml

  SampleApiBasePathMapping:
    Type: AWS::ApiGateway::BasePathMapping
    Properties:
      DomainName: sample.api.example.com
      RestApiId: !Ref SampleApi
      BasePath: v1
      Stage: !Ref SampleApi.Stage

```
基礎SELECT覚えようリスト

#概要
最低限覚えて欲しいSELECTの基本的な使い方です。

こちらも参考までに
[超基礎SQL覚えようリスト](https://qiita.com/CASIXx1/items/0dc86c516eb61ebfb2fd)

#[復習]SELECTの超基本

##SELECTの基本を覚えよう
基本の文法は以下の通り

```
SELECT 取得対象列名
  FROM 取得対象テーブル名  
```

テーブルを指定し、更に列名を指定することで、
全行の指定した列のデータを取得することが出来る。

また複数列も指定出来る。

```
SELECT 取得対象列1, 列2, 列3, ...
  FROM 取得対象テーブル名  
```

全ての列を指定したい場合は「*」を使えば良い。

```
SELECT *
  FROM 取得対象テーブル名  
```

条件分岐ありSELECT

```sql:
SELECT name
FROM   weight_table
WHERE  weight >= 65
```

#SELECTの加工
取得したテーブルを様々な形で加工出来るので、覚えよう。

各例では、このテーブルを使うことにする。

誰がどのクラスに出席しているか

attendance_table

| id | name | class | attendance | 
|:---|------|-------|-----:|
| 2 | tanaka | history | true |
| 3 | watanabe | history | false |
| 1 | yamamoto | math | true |
| 4 | nakayama | history | false |

##並び替え

FROM tableの後に
ORDER BY カラム名 ASCかDESC

ORDER BYの後のカラム名で、出力結果を昇順か降順で並び替える。

ASCだと、昇順に
DESCだと、降順となる。
昇順は、数字が小さい方から大きい方に　1,2,3,4,5
降順は、数字が大きい方から小さい方に　5,4,3,2,1で何となく理解してくれれば。

実際に使うとこうなる

```sql:
SELECT id, name
FROM table
ORDER BY id ASC
```

出力結果：

| id | name | 
|:---|-----------:|
| 1 | yamamoto |
| 2 | tanaka | 
| 3 | watanabe |
| 4 | nakayama |


###取得制限
ORDER BY　文 のあとに、LIMITを付けると、
並び替えた後の行を全行ではなく、LIMITの後に指定した数の行だけ取ってくることが出来る。

```sql:
SELECT id, name
FROM table
ORDER BY id ASC
LIMIT 3
```

| id | name |
|:---|-----------:|
| 1 | yamamoto |
| 2 | tanaka | 
| 3 | watanabe |

##重複排除
SELECT 列名の間にDISTINCTを付けると、
DISTINCTの後に指定した列で重複している値は出力させないようにする。

```sql:
SELECT DISTINCT class
FROM table
```

| class |
|:-----:|
|history|
|math|

##集合取得
同じ構造（カラム名や種類）のテーブルを複数集計出来る。

今回は、このテーブルと集合出力する。
another_attendance_table

| id | name | class | attendance | 
|:---|------|-------|-----:|
| 5 | sato | english | true |
| 7 | kawai | history | false |
| 6 | kitano | chemistry | true |
| 8 | matsumoto | english | false |

###和集合
二つの同じ構造のテーブルを足し合わせる。

各テーブルに対して、SELECT文をそれぞれ記述
その間にUNIONを付ける。
カラム名が同じ前提なので、ORDER BYなどを付けることも出来る。

```sql:
SELECT * FROM attendance_table
UNION
SELECT * FROM another_attendance_table
ORDER BY id
```

| id | name | class | attendance | 
|:---|------|-------|-----:|
| 1 | yamamoto | math | true |
| 2 | tanaka | history | true |
| 3 | watanabe | history | false |
| 4 | nakayama | history | false |
| 5 | sato | english | true |
| 6 | kitano | chemistry | true |
| 7 | kawai | history | false |
| 8 | matsumoto | english | false |

###差集合
あるテーブルの出力結果から、別の同じ構造のテーブルの出力結果を差し引く

各テーブルに対して、SELECT文をそれぞれ記述
その間にEXCERPT(Oracle,Mysqlでは使えない)を付ける。
最初のSELECTでの出力結果から、最後のSELECTの出力結果で重複した値は出力しない。

```sql:
SELECT class FROM attendance_table
EXCERPT
SELECT class FROM another_attendance_table
```

| class |
|:---:|
| math |

最初のSELECTでは、math,historyが得られたが、
最後のSELECTで、history,english,chemistryが得られたので、
重複したhistoryは、出力させず、mathだけ出力する。

###積集合
あるテーブルの出力結果と、別の同じ構造のテーブルの出力結果で重複した値を出力する。

各テーブルに対して、SELECT文をそれぞれ記述
その間にINTERSECTを付ける。
最初のSELECTでの出力結果から、最後のSELECTの出力結果で重複した値は出力しない。

```sql:
SELECT class FROM attendance_table
INTERSECT
SELECT class FROM another_attendance_table
```

| class |
|:---:|
| history |

最初のSELECTでは、math,historyが得られ、
最後のSELECTで、history,english,chemistryが得られたので、
重複したhistoryだけ出力する。
QiitaにCodePenを埋め込めない問題の対策

# はじめに
QiitaにはCodepenを埋め込めるはずですが、新しく作成したCodepenはなぜか正常に埋め込めませんでした。
> [Qiitaで記事にCodePenが埋め込めるようになりました](https://qiita.com/Qiita/items/edae7417214c8e957f54)

埋め込んだ結果はこんな感じ。
<img width="675" alt="SS 2018-02-18 1.59.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/135313/17442edb-eb86-bdd2-6ecc-c0e966130354.png">

# 原因
codepenが生成する埋め込み用コード内に含まれるscriptのsrcが変更されていた。

赤枠の部分
<img width="640" alt="SS 2018-02-18 2.11.55.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/135313/d7cb1c13-aa96-db93-52b8-671b5cf40d9d.jpeg">


```html
<!-- これまでのscriptタグ -->
<script async src="https://static.codepen.io/assets/embed/ei.js"></script></script>

<!-- 2018/02/18時点のcodepen埋め込みコード -->
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
```

URLでアクセスできるjsファイルの中身は変化ありませんでした。恐らく、jsのURL変更により、Qiita上で動くjsのホワイトリストから漏れたのかなと予測。だとするなら、近いうちにQiitaが対応してくれそう。

# 対策
埋め込みコード内のscript urlを古いものに変更。

```html
<p data-height="186" data-theme-id="0" data-slug-hash="WvPgPP" data-default-tab="html,result" data-user="plotly" data-embed-version="2" data-pen-title="Basic Line Plot with Plotly.js Charts" class="codepen">See the Pen <a href="https://codepen.io/plotly/pen/WvPgPP/">Basic Line Plot with Plotly.js Charts</a> by plotly (<a href="https://codepen.io/plotly">@plotly</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<!-- URLを古いものに変更 -->
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
```

ちゃんと動いた。
<p data-height="460" data-theme-id="0" data-slug-hash="oEpGdB" data-default-tab="result" data-user="icchi" data-embed-version="2" data-pen-title="my-plotly-sample" class="codepen">See the Pen <a href="https://codepen.io/icchi/pen/oEpGdB/">my-plotly-sample</a> by icchi (<a href="https://codepen.io/icchi">@icchi</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
tcpdumpでサーバの負荷は上がるのか

# はじめに
ネットワーク不具合調査の時に活躍する`tcpdump`コマンド、便利ですよね。しかしコマンドを実行して標準出力に結果を流した場合、使い方によっては物凄い勢いで結果が画面に流れていくため、「もしかしてこれってサーバへの負荷が凄いのでは」と心配になることがあります。
サーバ負荷は環境によって異なりますが、今回は簡単に試したかったのでZabbixサーバ上でtcpdumpを流しながら自分自身の負荷を測定することにしました。

# 環境
IDCFクラウド Light.S1 (1CPU、メモリ1GB）
CentOS 7.4 + Zabbix 3.4.6 + MariaDB 5.5.56 + Apache 2.4.6

# 実験方法
ノートPCからZabbixサーバにSSHログインをし、Zabbixサーバ上で自分自身のリソースを取得した状態で、`tcpdump -i any`を実施します。
キャプチャパケットが画面に表示される、SSH通信に載せて結果がノートPCに送信される、そのSSHパケットが画面に表示される、……でループして画面が凄い速さで流れます。

# 結果
## Load average
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/b208f70c-4774-b47f-aa91-6f5ee7582799.png)

1分平均で0.1未満から最大0.4程度に。ちょっと増えましたがまだまだ余裕です。

## CPU使用率
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/39993fba-b476-b8a5-d7cd-3c395f5e78c8.png)

idle timeが98%から85.5%へ。13%ほど使用率が増えました。見ての通り余裕です。

## メモリ使用率
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/9987e64c-2654-e893-b785-9c18aa586fef.png)

若干使っているかな？　という感じです。ほぼ誤差ですね。

# おわりに
結論としては、CPUに若干の負荷がかかる程度でした。
ログが凄い勢いで流れますが、極端に怖がる必要はなさそうです。
環境によって結果は異なると思いますので、実際に使う時はサーバの負荷を見ながらやりましょう。
vimium の フォーカスを見やすくする


# はじめに
このCSSを「CSS for Vimium UI」に貼り付けると
スクショのような色でフォーカスの文字がでるようになります。

デフォルトだと黄色のブロックで出るので、ちょっと目立ちすぎかなと思い
黒っぽい色に変えて、文字の色も見慣れた色に変更しました。

また、使いやすいようにキーバインドを一部変更したのでその設定も記載しました。


変更する箇所は以下の場所にあります。
__vimium > オプション　> Advanced Options > CSS for Viumium UI__
## css
```css
div > .vimiumHintMarker {
/* linkhint boxes */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#565756),
color-stop(100%,#444444));
border: 1px solid #E4E4E4;
opacity: 1.0;
text-shadow: none !important;
}

div > .vimiumHintMarker span {
/* linkhint text */
text-shadow: -1px -1px 2px black, 1px -1px 2px black, -1px 1px 2px black, 1px 1px 2px black;
color: #33cccc;
font-size: 14px;
font-family: Overpass, "ヒラギノ角ゴ Pro", Avenir, sans-serif;
}

div > .vimiumHintMarker > .matchingCharacter {
color: #FF8700;
}
``` 

## キーバインド変更
```
# Insert your preferred key mappings here.

map <C-h> goBack
map <C-l> goForward

unmap u
map <c-u> scrollPageUp

unmap d
map <c-d> scrollPageDown

unmap x
map d removeTab

map u restoreTab

map <C-p> togglePinTab
```


## 参考画像
![qiita.post.0218.png](https://qiita-image-store.s3.amazonaws.com/0/107300/6fb668d5-3f2d-bbae-d7a1-7977a3f7a936.png)


# 公式 Wiki
https://github.com/philc/vimium/wiki/Theme
こちらの公式 Wiki に素晴らしい設定が多数ありましたので、ぜひ Wiki を見てください。



# 参考URL
* ["Dark Theme" CSS for Chrome Vimium extension](https://gist.github.com/hlung/ccac0a7a5b2f2559c3b9)
* [Vimium - Chrome Web Store](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb?hl=en)
* [今更Vimperator入門とvimperatorrc晒し - Qiita](https://qiita.com/highdrac/items/4f48fda72520ac3546f5)
* [Wiki](https://github.com/philc/vimium/wiki/Theme)
NFCと組み込み機器で通信する際の3モードの使い分け

#はじめに
NFCには3種類のモードがあります。
3種類もあります。

+ リーダライダモード
+ カードエミュレーションモード
+ P2P通信モード

さて、組み込み機器からNFCでスマートフォンと連携させたいと考えたとき、どうやるのを考えるでしょう？

もちろん、各モードには明確な目的があって設計されていますが、他のモードでもやろうと思えば代用できたりする場面があったりします。
ので、各モードがどういったときに便利なのかを考えてみることにしました。

#セキュリティについて
どのモードにおいても、セキュリティは確保されません。
通信している時点で、物理的特性により10cm以内に存在していることは保証されますが、
チェックサム以上の通信の健全性の保証はありません。

通信における暗号化や、漏出対策などは各自で行う必要があります。

#リーダライタモード
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191114/94a15dc5-bab3-0364-fa23-6ff46442a9bb.png)

スマートフォンを読み取り装置として使うモードです。
組み込み機器側はタグとして振る舞います。

利用例

+ ポスター広告(QRコードと同等)
+ [体温計・歩数計のデータ取り込み](http://www.itmedia.co.jp/promobile/articles/0910/08/news070.html)
+ 機器の設定転送・ログ取り出し
+ 電子値札の書き換え
+ Bluetoothペアリング
+ Wi-Fi設定の配信

傾向
　スマートフォン連携は本質ではなくおまけ。あるいは、業務用端末を使うことを想定している。
　スマートフォンは読み取りに行く側。

利点

+ **(利用シーン次第ですが)静的なタグを読み取ること代用することができます。**
+ **組み込み機器側の電源が切れているときでも無線電力を使って不揮発メモリの情報が読み取れます。**
+ NDEFを使ってブラウザを自動的に立ち上げたりできます。
+ NDEFのみ**iPhoneで利用できます。**
+ アプリ側のタイミングは比較的自由です。
+ もっとも広く使われている使い方であり、対応している機器が多いです。
+ 省電力
+ PCでも利用しやすい

欠点

+ スマートフォンがないと機能しない機能になります。
+ 組み込み機器側は常にスマートフォンの要求を待機します。
+ 読み出しは常にスマートフォン側で行う必要があります。
+ スマートフォン側の通信タイミングや操作が支配的になります。
+ NDEF以外の場合は**読み取りのために常にアプリを立ち上げている必要があります**。
+ **NDEF以外の場合はプロトコルは自分で考える必要があります。**
+ 大容量のデータのやり取りには向いていません。
+ 同期的通信になります。

チップ例

+ Felica Plug
+ Felica Link
+ NFC PLUG

#カードエミュレーションモード
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191114/537b07a0-8dbd-9035-ab22-34b550c14a6a.png)

スマートフォンがHCEでタグとして振る舞い、組み込み機器側が読み取り装置として振る舞うモードです。

利用例

+ セキュリティロック(カードとスマートフォン併用)
+ 店頭における電子決済
+ スポーツクラブの会員証やポイントカード

傾向
　スマートフォンを持っていない人でも、NFCカードを発行することで利用できる。
　スマートフォンは読み取ってもらう側。

利点

+ カードと平行して使うことができ、スマートフォンがなくても機能します。
+ 組み込み機器側の通信タイミングや操作が支配的になります。
+ **アプリを立ち上げていなくても自動で立ち上がるためバックグラウンドで通信が可能です**。(HCE-F除く)
+ **ロック画面でも通信可能です**(スリープ中は無理な様子)

欠点

+ **HCEのないスマートフォンでは利用できません**
+ **プロトコルを自分で考える必要があります。**
+ **利用には電源が入っている必要があります。**
+ バッテリー駆動の機器の場合は読み取り開始の操作が必要です。
+ アプリ側は基本的に迅速に応答する必要があります。
+ ポーリングを繰り返すため消費電力が大きい。
+ 組み込み機器側から繰り返し読み取りを行う必要があります。
+ **iPhoneで利用できない**
+ PCで利用しにくいでしょう。(API的に)
+ 大容量のデータのやり取りには向いていません。
+ 同期的通信になります。

チップ例

+ Felica Link (搬送波生成回路付き)
+ RC-S620


#P2P通信モード
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191114/52a38777-ec92-ed21-aae3-c82535b7f59b.png)


スマートフォンと組み込み機器が対等な立場で振る舞うモードです。

利用例

+ スマートフォン同士のデータ交換
+ [スマートフォン同士のデータ交換(BTSSP)](https://news.mynavi.jp/article/20150307-android_why/)
+ スマートフォンとPCのデータ交換
+ [組み込み機器に対するWi-Fi設定の転送？](http://www.sony.jp/ServiceArea/impdf/pdf/44773110M.w-JP/jp/contents/TP0000219611.html)

傾向
　データ交換

利点

+ LLCPを使い通信します。
+ NFCの本来の想定された使い方なので、対応機器が広い...はずです
+ TCPやUDP相当の通信を行うことができます。
+ 組み込み機器間で通信することも可能です。
+ 大容量のデータのやり取りや、継続的な通信を行うことができます。
+ 非同期で通信を行うことができます。

欠点

+ SNEP以外で対応している機器を正直見たことがありません。
+ NDEF以外で動くんでしょうか？
+ DEP・LLCP・SNEPとスタックするためソフトウェアが複雑になります。
+ 通信中はかざし続ける必要がある上、通信速度が低速なので辛い。
+ **Androidですらまともに使えるのか不明(OSが握っててアプリに開放されていないように見える)**
+ **利用には電源が入っている必要があります。**
+ (なお、おサイフケータイと干渉する模様)


チップ例

+ Felica Link (搬送波生成回路付き)
+ RC-S620
Cloud Functions の Slack 通知に Cloud Firestore データへの直リンクを貼る

Cloud Functions でエラーが起きた時に Slack に通知を飛ばしたいですね。
その時、エラーが発生したデータに Cloud Firestore 管理画面の直リンクがあると便利です。

というわけで実装してみましょう。

## Firestore の URL をみる

https://console.firebase.google.com/u/0/project/sandbox-hoge/database/firestore/data~2Fuser~2F08UQUZSbDw7VdlVTRwpU

このような URL があったとして、これは 4 つに分解できます。

* https://console.firebase.google.com/u/0/project/
    * どの Project も同じ、 firebase の base_url
* sandbox-hoge/
    * project_id
    * `functions.config().firebase.projectId` で取得できる
* /database/firestore/data~2F
    * Database の firestore を表す部分
* user~2F08UQUZSbDw7VdlVTRwpU
    * データの path を表す部分
    * `DocumentReference.path` で取得できる、 `/` は `~2F` に置換する

## コードで作り出す

こんな感じになります。

```ts
let baseURL = 'https://console.firebase.google.com/u/0/project/'
baseURL += (functions.config().firebase.projectId || '/projectId') + '/database/firestore/data~2F'
const ref = admin.firestore().doc('user/08UQUZSbDw7VdlVTRwpU').path
const path = ref.replace(/\//g, '~2F')
const firestoreURL =  baseURL + path

console.log(firestoreURL)
// => https://console.firebase.google.com/u/0/project/sandbox-329fc/database/firestore/data~2Fuser~2F08UQUZSbDw7VdlVTRwpU
```

この URL を slack に投げるとエラーが起きた時に直リンクでデータへ飛ぶことができます。 

## ライブラリ

というわけで、 Firestore へのリンクを自動で貼ってくれる Slack クライアントライブラリを作りました。

[starhoshi/fire\-slack](https://github.com/starhoshi/fire-slack)

### 使い方

index.[js|ts] で初期設定をします。 TypeScript の実装例ですが、 JS で使う場合は脳内変換してください。

```ts
import * as Slack from 'fire-slack'

Slack.initialize(
    <admin.AppOptions>functions.config().firebase,
    'https://your-incoming-webhook-url',
    { channel: 'default_channel', iconEmoji: ':default:', username: 'default_usern' } // optional
)
```

送信はこれだけ。

```ts
// エラーはあれば指定する
Slack.send({webhook: {text: 'message'}, ref: reference, error: error}
```

こんな感じでデータへのリンクと project_id を自動で表示してくれます。

![screenshot\.png \(413×199\)](https://raw.githubusercontent.com/starhoshi/fire-slack/master/assets/screenshot.png)

`webhook` のパラメータは [TypeScript で型安全に Slack の Incoming Webhook を扱う \- Qiita](https://qiita.com/star__hoshi/items/b1960e076598bbb5c6a6) で書いた、 `IncomingWebhookOptions` 型がそのまま使えます。

### 実際の Cloud Functions のサンプル

現実世界ではこのように使うことを想定しています、エラーが起きた時のサンプルです。

```ts
export const orderPaymentRequested = functions.firestore
    .document(`sampleorder/{orderID}`).onCreate(async event => {

  try {
    return event.data.ref.update({ name: 'new name' })
  } catch (error) {
    // ref and error are optional.
    await Slack.send({
      webhook: { text: 'An error occurred!' },
      ref: event.data.ref,
      error: error
    })
    return Promise.reject(error)
  }
})
```

## おわり

Cloud Functions で Firestore やっている人は使ってみてください :pray:
[starhoshi/fire\-slack](https://github.com/starhoshi/fire-slack)
cordovaでハローワールド

# cordova いじりたい

以下を参考にした。

* https://cordova.apache.org/docs/en/latest/guide/cli/index.html#installing-the-cordova-cli

1. nodejs が入ってなかったらインストールする
2. `npm install -g cordova`

これだけ

# とりあえず環境作る

## まずはハローワールドでしょ

* ということでプロジェクトを作る
* 以下コマンドでスケルトン作ってくれた

```
cordova create hello_world com.example.hw hello_world
```

* cordova公式にanonymouseなレポート送る？って聞かれた。
* nにしといた。（なんとなく

## 対象のプラットフォームを追加する

とりあえず`android`,`browser`,`ios`を追加してみる

* プロジェクトディレクトリに移動してからコマンド打ってね？って怒られた。。。

```
cd hello_world
```

* 移動してから下記コマンド

```
cordova platform add android
cordova platform add browser
cordova platform add ios
cordova platform add windows
```

* windowsでもiosのプラットフォーム自体は追加できたな。。。
* ビルドできないとか？

## とりあえずbrowser版をビルドしてみる

* まだ何もしていないけど
* ビルドの前に下記コマンドで必要なものがそろっているか確認する事ができるみたい

```
cordova requirements
```

* JDK入ってない
* AndroidSDKはいってない
* そもそもiosじゃない
* などなど、文字化けするいきおいで怒られた。

```
cordova platform remove android
cordova platform remove ios
cordova platform remove windows
```

* ひとまずWEBでできればいいかなということでbrowserのみにした。
    * なんか`cordova requirements`でエラー出るけど**まあいっか**
* windowsはどうじゃろかと思ったのだがSDKないのでビルドできひんって言われた。

### とりあえずbrowserをビルド

```
cordova build browser
```

* `platforms`にディレクトリが作成されてビルドされたファイルがコピーされた。
* `platforms`が出力ディレクトリという事か。

### 動かしてみる

以下コマンドを打つことでサーバーが立ってブラウザが自動起動した。

```
cordova run browser
```

### WEB公開するときは？

* XAMPPで試してみる。
* 動くかな？
* xamppのサーバー設定をちょちょいといじってvirtualホスト作成
* `hosts`もいじってテスト用ドメインを充てる


* XAMPPを立ち上げて さっき作ったテスト用ドメインにアクセス
    * ちゃんと表示された。

# WEBベースのアプリなら簡単に作れそう。

* nodejsとかpythonなどの組み合わせができるか。
    * `hooks`、`plugins`が肝になってきそう。
    * まだ見てないんだけどね。
        * `hooks`はcordovaのCLIコマンドに対するhookなわけか。
        * `plugins`は思った通りネイティブ向けコード書くかんじか。
        * イメージとしては`hooks`にgulpなりbrowserifyなりのタスク書いておいてビルドした時にjsに書き出ししてhtmlで読み込んで使う感じかな。
        * というか今のところそれしか思い浮かばない。
* プラットフォーム対応について
    * WEBベースなら全く問題ないが、platformのネイティブな機能などを使う場合は当然そっち向けのAPIを使用する必要があるね。
    * こっちも`hooks`、`plugins`が重要になってきそう
    * というかコントローラ的なjsはぶっちゃけnode？
        * まだ試したないのでいろいろ試そう。
    * すぐに試せそうでよろしい。
JavaScript 複数行テキストを扱う

#JavaScriptで複数行テキストを変数に追加する方法
```javascript
var insertHTML ='<div class="panel-group">'+
                'hogehoge'+
                '</div>';

$('#idname').append(insertHTML);
```

１行１行文字列を「+」演算子で連結

※バックスラッシュで連結する方法もあるがGoogle JavaScript Style GuideでNG
[Google JavaScript Style Guide](http://cou929.nu/data/google_javascript_style_guide/#string)
raspberry pi zero wh  をセットアップしてみた

#用意するもの
- raspberry pi zero wh　[ここ](https://raspberry-pi.ksyic.com/)で買った
- microSDカード 16GBを用意したがもっと少なくていい。
- コンセントUSB変換アダプタ　ipad充電用のやつ。スマホ充電のでも大丈夫だと思う
- microUSBケーブル　電源供給用
- miniHDMI-HDMIケーブル 
- キーボード　マウス　ラズパイにつなげるには以下も必要
    - microUSB-USB変換ケーブル
    - USBハブ
- USB電流電圧テスター [ここ](https://www.amazon.co.jp/USB%E9%9B%BB%E6%B5%81%E9%9B%BB%E5%9C%A7%E3%83%86%E3%82%B9%E3%82%BF%E3%83%BC-%E9%9B%BB%E5%9C%A7%E3%81%A8%E9%9B%BB%E6%B5%81%E3%83%81%E3%82%A7%E3%83%83%E3%82%AB%E3%83%BC-3-30V-0-5-1A-3-0%E5%AF%BE%E5%BF%9C-%E3%83%91%E3%83%AF%E3%83%BC/dp/B01DGZ1FXQ) で買った。なくてもいいがあると便利かも

#SDカードの用意 NOOBSの用意

このパートはPCで行う

- SDformatterを
[ここ](https://www.sdcard.org/jp/downloads/formatter_4/)からダウンロードしてSDカードをフォーマットしておく。
- NOOBS lite を[ここ](https://www.raspberrypi.org/downloads/noobs/)からダウンロードして解凍。SDカードにコピーする。
注意するのは、ダウンロードしたファイルを解凍すると、

```
|--NOOBS_lite_v2_4
|  |--BUILD-DATA
|  |--INSTRUCTIONS-README.txt
|  |--RECOVERY_FILES_DO_NOT_EDIT
|  |--bcm2708-rpi-0-w.dtb
.
.
.
```
みたいな感じで解凍されるが、SDカードのルートには

```
|--BUILD-DATA
|--INSTRUCTIONS-README.txt
|--RECOVERY_FILES_DO_NOT_EDIT
|--bcm2708-rpi-0-w.dtb
.
.
.
```
を直接置くこと。

#raspbian lite のインストール
このパートからraspberry pi で行う。

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/233578/46fb526f-35a7-5d39-3d02-535177fe3e68.png)

後は画面に現れる指示に従うだけ。
家のwifiにつなげてインストールが始まる。
今回はraspbian lite をインストール。FULL版との違いはGUIがついているかどうか。今回はGUI使わないのでliteでOK。

# パスワードの変更
ラズパイのidとpassの初期値は`pi raspberry`なので変更する。

```
sudo raspi-config
```
passの変更を選んで変更しておく。

# 参考サイト
https://learn.sparkfun.com/tutorials/getting-started-with-the-raspberry-pi-zero-wireless#resources-and-going-further
https://www.raspberrypi.org/documentation/setup/
http://igarashi-systems.com/sample/translation/raspberry-pi/configuration/raspi-config.html
ECR ライフサイクルポリシーを利用したImageの自動削除



## はじめに
ECRで運用をしていくと溜まってしまうimageですがこれらを世代管理していこうと思います。

また、参考までにECRの費用は '0.10 USD/GB/月' です。
費用を少しでも抑えたいので古いImageはやはり消しておきたいですね！

そして今回使用するツールは ECR の ライフサイクルポリシー

![image.png](https://qiita-image-store.s3.amazonaws.com/0/81734/d8cac40e-daba-8642-f5f2-4896d0debe8d.png)


ポリシーは機能は多く複雑なポリシーの作成が可能です。
しかし、それらは[Amazon ECR ライフサイクルポリシー]([Amazon ECR ライフサイクルポリシー - Amazon ECR](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/LifecyclePolicies.html))をよく読めば作成可能ですが今回、よく使うことが多いであろう一部ポリシー設定例を紹介させていただきます。

## 削除ポリシーの世代管理概要

|タグの有無|世代管理方法|
|:----|:----|
|有|日数|
|有|イメージ数|
|無|日数|
|無|イメージ数|




## よく使いそうなサンプル
### productionタグをつけたimageを10世代だけ残す設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/81734/a77a5de5-2c75-b62e-9d42-8fc334475d87.png)

### productionタグをつけたimageで10日以上経過したものを削除する設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/81734/7d62bd92-a4e3-a14a-1200-672bb1e2f377.png)

### latest運用していてタグがないものを指定する場合
----
### 10世代だけ残す設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/81734/8cb8c131-5e31-12c0-bfdf-6b2bedc0f9f5.png)

### 10日以上経過したものを削除する設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/81734/879d9a91-2515-5f2d-0ff2-d2d77d9e0f03.png)

## タグ(Tag prefixes)を指定する場合の注意点

> tagPrefixList
> タイプ: list[string]
> 
> 必須: tagStatus が [tagged] に設定されている場合のみ、必須
> 
> このパラメータは、"tagStatus": "tagged" を指定した場合のみ使用されます。ライフサイクルポリシーでアクションを実行するための、カンマ区切りのイメージタグプレフィックスのリストを指定する必要があります。たとえば、イメージに prod、prod1、prod2 というようにタグが付いている場合、すべてを指定するためにタグプレフィックス prod を使用します。複数のタグを指定する場合、指定されたすべてのタグが付いているイメージのみが選択されます。

※[ライフサイクルポリシーのパラメータ](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/LifecyclePolicies.html#lp_evaluation_rules)より

実際に以下のように設定して試してみた。

ECRリポジトリ登録Image

```
api:staging.v1.0.1
api:staging.v1.0.2
api:staging.v1.0.3
```

こういった場合、ポリシーで指定するタグ名を以下のように指定できます。

```
staging
```

Dry Runしてみると・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/81734/a2fa4b26-b941-618b-fb48-2b2c1a3cc38c.png)

うまくヒットしたようです！
Linux CentOS6で使ったコマンド2

[前回の記事](https://qiita.com/ayane_9408/items/17772f4aee6ad1de9fa1)の続き

#viエディタ
##編集モードへの切り替え
`i`:カーソルの位置から入力
`a`:カーソルの直後から入力

##編集
`x`:カーソルの位置の文字を削除
`dd`:カーソルのある行を削除
`yy`:カーソルのある行をコピー
`u`:やり直し

##保存/終了
`:q`：終了
`:q!`：強制終了
`:w [ファイル名]`：保存
`:e [ファイル名]`：指定したファイルを読み込んで編集

##マウント/アンマウント
mount [オプション] [デバイス名/ファイル名]
umount  [オプション] [デバイス名/ファイル名]

#ネットワーク周り
- NIC情報の表示
`ifconfig [インターフェース]`

- ルーティング情報の表示と設定
`route [オプション]`

- パケットの到達性のチェック
`ping [オプション] [宛先IP/ホスト名]`

- 転送経路のチェック
`traceroute [オプション] [宛先IP/ホスト名]`

- 名前解決
`nslookup [オプション] [ホスト/ドメイン名] [サーバ名]`

- 名前解決の診断
`dig [＠DNSサーバ] [宛先IP/ホスト名] [クエリータイプ] [オプション]`

- メール送信
`mail [宛先]`
 - `-s`：タイトル指定
 - `-c`：Cc
 - `-b`：Bcc
 - `-r`：送り主メアド

- 起動
`service network start`
- 停止
`service network stop`
- 再起動
`service network restart`
- 確認
`service network status`


## 設定ファイル
- インタフェース設定
 - /etc/sysconfig/network-script/ifcfg-eth0
- サーバ内の名前解決設定
 - /etc/hosts
- DNS設定
 - /etc/resolv.conf


#パッケージ管理
- パッケージインストール

`yum [オプション] [コマンド] [パッケージ名]`

（オプション）
`-y` ：問い合わせにすべてyesで応える

（コマンド）
`install`,`update`
Linux CentOS6で使ったコマンド

Linux CentOS6.9でサーバ構築時に使用したコマンドをメモ的にまとめる。

# パス操作

## 現在の作業ディレクトリを表示
`pwd`

## 作業ディレクトリの変更

`cd [オプション] [パス]`

- `cd -`または`cd ../`
    - 一つ前のディレクトリに戻る

## ファイルの一覧表示

`ls [オプション] [パス]`

- ` ls -a`
    - 隠しファイルも含めたすべてのファイルを表示

- `ls -l`
    - 詳細な情報を表示

## ディレクトリを作成

`mkdir [オプション] [ディレクトリ名]`

- `mkdir -p path/fuga/hoge`
    - 作成するディレクトリに必要な親ディレクトリも作成

## ディレクトリやファイルの移動/名前の変更

`mv [オプション] [変更/移動前のファイル名] [変更/移動後のファイル名]`

- `mv -i mae/path ato/path`
    - 上書き確認
- `mv -f mae/path ato/path`
    - 強制的に上書き
- `mv -R mae/path ato/path`
    - ディレクトリをコピー

## ファイルの削除

`rm [オプション] [ファイル/ディレクトリ名]`

- `rm -f dir/file`
    - 確認をせずに削除する
- `rm -f dir/file`
    - 削除前に問い合わせを実行
- `rm -R dir/file`
    - ディレクトリを中身ごと削除

----

## ファイルの閲覧

`cat [オプション] [ファイル名]`
 
`tail [オプション] [ファイル名]`
 `-n`：行数指定
 `-c`：文字数指定
 `-f`：リアルタイムに表示

`less [ファイル名]`
- `/文字列`：指定文字列を末尾方向に検索
- `n`：前回の検索を末尾方向に繰り返す
- `スペース`：1ページ進む
- `v`：エディタを起動

----

- 指定したパターンに一致した行を抽出して表示

`grep 〔オプション〕〔検索パターン〕〔ファイル名〕`
`-n`：行番号付きで表示
`-v`：一致しない行を出力

----

- 空のファイルを作成

`touch 〔オプション〕 〔ファイル名〕`

`-t [yymmdd]`：指定ファイルの時刻を設定

- yy: 西暦下2桁
- mm: 月
- dd: 日

---