OmniAICreator/Qiita-1.07M huggingface dataset:
systemd Service Unit入門

## はじめに
CentOS7から導入されたsystemdと呼ばれる新しいシステム管理・サービスマネージャーが導入されました。今回は一番利用頻度が高いService Unitについて調べましたのでまとめます。

## Unitとは
* 今までサービス起動スクリプトとして管理してものが、Unitという形で定義され、様々なタイプのUnitがある
* Unitは、`/usr/lib/systemd/system`に配置されている

## Service Unitとは
プロセスやデーモンの起動・停止を制御するUnitです。

## httpd.serviceファイルをコードリーディングする

多くの人が利用しているApacheのhttpd.service Unitファイルにどんな内容が書かれているのが読んでいきます。

```shell-session:/usr/lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target
```

### [Unit]セクション

オプション|説明
---|---
Description|Unitの説明文
After|`network.target remote-fs.target nss-lookup.target` の後に起動する
Documentation|ドキュメントのURI。manコマンドが記載されている。

※ `man 5 systemd.unit` で確認可能

### [Service]セクション

オプション|説明
---|---
Type|`notify`は、プロセスの起動完了時に`sd_notify`でメッセージを送信する
EnvironmentFile|環境変数ファイルの指定
ExecStart|サービスの起動コマンド `/usr/sbin/httpd $OPTIONS -DFOREGROUND`
ExecReload|サービスのリロードコマンド `/usr/sbin/httpd $OPTIONS -k graceful`
ExecStop|サービスの停止コマンド `/bin/kill -WINCH ${MAINPID}`
KillSignal|サービスを停止する際に使用するシグナル `SIGCONT`
PrivateTmp|`/tmp/` `/var/tmp`を使用する

### [Install]セクション

オプション|説明
---|---
WantedBy|enable時に`/etc/systemd/system/multi-user.target.wants/`からリンクを貼る

## 参考
* [systemd\.unit](https://www.freedesktop.org/software/systemd/man/systemd.unit.html)
* [systemd\.kill](https://www.freedesktop.org/software/systemd/man/systemd.kill.html)
UniRx の AddTo と TakeUntilDestroy

UniRx には、GameObjectが死んだときに自動でキャンセルする方法が2つほど用意されてる。

一つ目は、 `AddTo(...)` で 、死んだら止めるリストにDisposableを登録しておく方法。

```csharp
// MonoBehaviourのとあるメソッド内
observable
	.Subscribe(...)
	.AddTo(this)  // thisが死んだら Disposeされる
```

二つ目は、`.TakeUntileDestroy(...)` オペレータを使い、指定したGameObjectが死んだら 即Completedする。

```csharp
// MonoBehaviourのとあるメソッド内
observable
	.TakeUntilDestroy(this)
	.Subscribe(...) // thisが死んだら OnCompleted() からの Dispose()
```

この2つ、並べてみると どちらも購読側でほぼ同じようなスタイルで使えてしまうので、どっちで書くか? という話になる。
で、実装を読んでみた結果、近頃は、基本的に、発行側も購読側も、`TakeUntilDestroy` を使うのが良いという結論になった。

理由は、`AddTo` で追加したDisposable は、明示的にリムらない限りCompositeDisposableへ蓄積されていくため、ゴミオブジェクトが増え続けるコードを書くリスクがあるから。

対してTakeUntilDestroy は、内部的には HotなObservableを待っているだけなので数が増えることによるオーバーヘッドはない。

1つのMonoBehaviourが実行するSubscribeの回数が固定であればこれは問題にならないんだけど、Subscribeは非同期処理の開始命令としても使えてしまうから、実行中に何度も何度もやっちまうコードを素朴に書くと、保持しているリストの中身が天井知らずに増殖してゆくことになる。
そのため 最近は TakeUntilDestroy のスタイルで書くようになった。

この辺のスタイルはコードのあちこちに現れてくるので、GameObjectへのAddToはなくして良いのではないか という気がする。

--

Rxというやつは、キャンセルがきちんとサポートされていることがオシャレな点のひとつ。

この世の 全てのObservable は、自身をキャンセル(Dispose)する方法を知っている。
`Subscribe` で購読を開始したとき、どんなObservable も `IDisposable` を返してくるので、こいつを握っておいてDispose()すればいつでも処理はキャンセルされることになっている。

行儀の良いObservableたちは、Disposeで単に静かになるだけじゃなく、リソースを食う非同期処理も中断してくれるため、こういった機能がないPromiseなんかと比べるとたいへん省エネな実装ができる。

Rx を使っていると、「リソースがリークしていないか」という知能指数が要求される難しい問題が、「適切にDisposeを呼んでいるか」というそこそこ単純な問題に置き換わってくれるで嬉しい。
CRONコマンド チートシート

# CRONコマンド

## log確認
`cat /var/log/cron`

## ステータス確認
`service crond status`

## 自動起動設定確認
`chkconfig --list crond`

## cronコマンドの書式
`crontab [- u :user] {-l|-r|-e} オプション`

- リスト `crontab -l -u [ユーザ]`

- 編集 `crontab -e -u [ユーザ]`

- 削除 `crontab -r -u [ユーザ]`

## crontabコマンドで実際に書き込まれるディレクトリ
`cd /var/spool/cron/[ユーザ]`

## cronの設定ファイル（CentOS）
|ディレクトリ名|利用者|主な用途|
|:-:|:-:|:-:|
|/var/spool/cron/user|全ユーザ|ユーザ毎の自動タスク設定ファイル|
|/etc/crontab|root|毎時、毎日、毎月、毎週の自動タスクのメイン設定ファイル|
|/etc/cron.hourly|root|毎時実行される自動タスク設定ファイルを置くディレクトリ|
|/etc/cron.daily|root|毎日実行される自動タスク設定ファイルを置くディレクトリ|
|/etc/cron.monthly|root|毎月実行される自動タスク設定ファイルを置くディレクトリ|
|/etc/cron.weekly|root|毎週実行される自動タスク設定ファイルを置くディレクトリ|
|/etc/cron.d|root|上記以外の自動タスク設定ファイルを置くディレクトリ|

## crontab -r で設定が全て吹っ飛ぶので、ローカルファイルにバックアップを取っておく
- 現在の設定をバックアップ （例）`crontab -l > ~/crontab`
- ローカルファイルを反映する （例）`crontab < ~/crontab`

## 書式
- 分: `0～59`
- 時: `0～23`
- 日: `1～31`
- 月: `1～12`  または
`jan,feb,mar,apr,may,june,july,aug,sept,oct,nov,dec`
- 曜日 `0～7` （0,7は日曜日） または `sun,mon,tue,wed,thu,fri,sat`

## コマンド
- リスト `0,15,30,45`（分フィールドで指定した場合、15分に一度処理を実行）
- 範囲 `1-5`（曜日フィールドで指定した場合、月曜日～金曜日に処理を実行）
- 共存 `1,3,7-9`（時間フィールドで指定した場合、1時、3時、7時、8時、9時に処理を実行）
- 間隔値 `1-5/2`（時間フィールドで指定した場合、1時、3時、5時に処理を実行）  
※「/」の後ろに指定した値の間隔で処理を実行

# 参考URL
> https://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html
Raspberry Pi ロボットをゼスチャーで操作する【GrovePi/Python3】

RaspberryPiロボットは [以前](http://qiita.com/PonDad/items/05dba9e65533e8c98694) Node.jsとArduinoを利用して作ったのですが、Pythonで動作出来るように改造してみました。

音声入力を使わず、今回はゼスチャーセンサーを利用して操作してみます。まずは３種類の動作をさせてみました。

![joy.gif](https://qiita-image-store.s3.amazonaws.com/0/47128/15d9a0dc-2b09-c7bd-4290-f0add89dbdfa.gif)

「Wave」のゼスチャーで、うなずきながらこちらに寄ってきます。

![fear.gif](https://qiita-image-store.s3.amazonaws.com/0/47128/542a9518-f655-62f8-f0a2-d73fe82fa4f3.gif)

「Forward」のゼスチャーで、首を振りながらあとすざりします。

![play.gif](https://qiita-image-store.s3.amazonaws.com/0/47128/ee7f8628-879e-6adc-a2c6-2b3ef292644f.gif)

「Clockwise」のゼスチャーで、ダンスをします。（ちょっとダンスっぽくないけど）

## 環境

![IMG_9098.jpg](https://qiita-image-store.s3.amazonaws.com/0/47128/c78c8d7f-19ff-bce3-9516-7811cc186c6c.jpeg)


- Raspberry Pi2 ModelB(RASPBIAN JESSIE WITH PIXEL 4.4/Python 3.4.2)
- PLANEX 無線LAN子機 (USBアダプター型) GW-USNANO2A (FFP)
- Raspberry Pi カメラモジュール Raspberry Pi Camera Board
- cheero Canvas 3200mAh IoT 機器対応
- ステレオプラグインスピーカー ASP-2188K
- Arduino工作用の中国製ロボットキット（アクリルボード・モーター・タイヤ・単４電池ケース・超音波センサ・サーボモーター用アームなど）
- PCA9685 16Channel 12bit PWM
- SG90サーボモータ
- 電池ケース 単3×3本用（4.5V）、単3×2本用（3.0V）
- GrovePi
- GROVE - ジェスチャー
- GROVE - RGBバックライト液晶モジュール
- GROVE - I2C モータードライバ
- GROVE - 超音波距離センサモジュール

ずらずらと書きましたが、RaspberryPiにGrovePiを接続し、モーターやセンサー類の制御を行っています。カメラマウント用のサーボモーターは電圧の関係でGroveシステムを使って制御出来ないので、別途モータードライバを用意します。

GrovePi（要はArduino）をRaspberryPiの上部にマウント出来るので少しスリムに出来ました。

## Python3

プログラミングは手抜きをして、メーカーが用意しているPythonライブラリを使用します。Groveシステムとサーボモータードライバのサンプルコードを利用してこんな風に記述してみました。

[app.py - Gist](https://gist.github.com/PonDad/6edf28a7dfa23e45efbdf29546aea5f1)

必要なライブラリは以下のライブラリよりインポートします。

サーボモータードライバー
[Adafruit_Python_PCA9685/Adafruit_PCA9685/PCA9685.py - GitHub](https://github.com/adafruit/Adafruit_Python_PCA9685/blob/master/Adafruit_PCA9685/PCA9685.py)

i2cモータードライバー
[GrovePi/Software/Python/grove_i2c_motor_driver/grove_i2c_motor_driver.py - GitHub](https://github.com/DexterInd/GrovePi/blob/master/Software/Python/grove_i2c_motor_driver/grove_i2c_motor_driver.py)

ゼスチャーセンサー
[GrovePi/Software/Python/grove_gesture_sensor/grove_gesture_sensor.py - GitHub](https://github.com/DexterInd/GrovePi/blob/master/Software/Python/grove_gesture_sensor/grove_gesture_sensor.py)

カラーLCD液晶
[GrovePi/Software/Python/grove_rgb_lcd/grove_rgb_lcd.py - GitHub](https://github.com/DexterInd/GrovePi/blob/master/Software/Python/grove_rgb_lcd/grove_rgb_lcd.py)

## まとめ

今回はチャットの文字入力や音声入力を利用せずセンサーで動作させてみました。

これだけでは面白くないので、次回ロボットに簡単な感情エンジンを搭載してみたいと思います。（続く）
SP Flash Toolであれこれ

某ぺリア用flashtool的存在、MediaTek端末向けのツールであるSP Flash Toolを触ってみた。

# 使い方
1.*Option* > *Download* > *General Setting* > *DA DL ALL with Checksum* にチェックを入れる。必須っぽい。

2.*Download* タブを開く

3.*Scatter-loading File* へダウンロードしたROMの *Android_scatter.txt* を指定する

4.flashmodeを *Firmware Upgrade*、もしくは*Download Only* に指定。
 **※Format All + Downloadに指定するとIMEIがすっ飛ぶかもなので注意**
 **(追記:Format Allモードで書き込みを行った場合、Baseband+IMEI消失+機種依存でbootloader relockされる地獄になる可能性あり [参考](http://qiita.com/IS03/items/9bc7c447708fdc742731 "参考"))**

5.*Download*ボタンを押して書き込み状態へ移行する

6.端末に装着されているバッテリーを外し、完全に電源が切れた状態でPCへ接続する

7.あとはROMが書き込まれるの待つだけ。おしまい。

[参考](https://jagadgetaholic.blogspot.jp/2015/11/howtouse-spflashtool.html "参考")

# ROMはどこから

XDAにスレがないようなマイナーな端末(中華系)を扱う場合、ROMは[ここ](http://www.needrom.com/ "ここ")から落とすのがいいかもしれない。~~あまり信用してないが...~~

# 考察のような何か

・Stock ROMのフォルダ内には*boot.img*、*recovery.img*等のファイルが存在するが、これらは*Scatter-loading File*の記載を改変なしで別物に差し替えても問題なく書き込み可能っぽい。（もちろん同名、上書き保存の上でですが）

・と、言うことで*recovery.img*のみカスタムリカバリ(CWM/TWRP)に上書き、差し替えてそれ以外の領域をStotkの状態で書き込むことも可能だったり。

・*fastboot flash recovery recovery.img* が通らない端末へカスタムリカバリを導入+zipで配布されているカスタムROMをインストールしたい場合に有効な手段かもしれない。

# ひとこと

*fastboot oem unlock* で素直にbootloader unlockさせて、お願い。。。
【初心者投稿-10】sublime textをついにダウンロード

#昨日までのおさらい
エンジニア歴10日で早くも挫折を経験。
その中で友人からウェブサイトのトップページ作成を依頼されるという事態に。

ググってでも形にして、脱**"自称エンジニア"**へ

#さっそく作業のためにsublime textを

参考にしたページはこれ↓↓
[リンク](http://qiita.com/daigon/items/9ed55b0eeb57ccded0f8)

自分はwindowsなので全部が全部その通りではなかったけど、開発に着手できそうです。
それにしても重い…。
明日はそこを改善しよう！

#学習の記録
* Progate8日目
* 今日の勉強時間：1時間50分
* 総学習時間：9時間20分
* 今日学んだこと：プログラミングって思ったよりシンプル？どんだけコードをそぎ落としながらイメージを形にしていくかが大事なのでは、と素人ながら思った今日。float:leftとかでまだまだ苦しんでいるものの戯言です。(笑)
クラス定義の外でもメソッドは定義できる

Pythonのメソッドは普通は次のようにクラス定義の中で`def`文を記述して定義します。(コードは全てPython3です。)

```py:
class Foo:
    def __init__(self, name):
        self.name = name

    def print_name(self):
        print(self.name)

# Fooのインスタンスを作成
foo = Foo('foo') 
```
ですが、クラスを定義した後に普通の関数をクラスの外に書いて、その関数をクラスの属性にセットすることでも定義することができます。この方法で、上記の`print_name`メソッドをクラスの外で定義した場合、次のようになります。

```py:
class Bar:
    def __init__(self, name):
        self.name = name

# Barのインスタンスを作成
bar = Bar('bar')

def print_name(self):
    print(self.name)

Bar.print_name = print_name
```

`foo`と`bar`の`print_name`の動作と型を比較してみると、次のように出力されます。

```pycon:
>>> foo.print_name()
foo
>>> bar.print_name()
bar
>>> foo.print_name
<bound method Foo.print_name of <__main__.Foo object at 0x03C83610>>
>>> bar.print_name
<bound method Bar.print_name of <__main__.Bar object at 0x042F5D10>>
```
`foo`でも`bar`でも`print_name`の型は`bound method`となっていて、関数で定義してもクラス定義の中で定義する場合と全く同じようにメソッドが定義できることが分かります。
タグで特定のEC2インスタンスを保護するIAMポリシー

保護対象のEC2 Instancesの停止、再起動、削除を禁止します。
また、<font color="Red">保護手段であるTagの削除も禁止します</font>。

※特定のVPCやSubnet内のEC2 Instancesを保護する方法について、
[【Amazon EC2 API アクションでサポートされるリソースレベルのアクセス許可】](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-supported-iam-actions-resources.html)により、(非常に残念ですが)インスタンスの起動(StartInstances)、停止(StopInstances)、削除(TerminateInstances)、再起動(RebootInstances)(作成(RunInstances)を除く)のAPI Actionはリソースベースのアクセス許可をサポートされていないため、ConditionにVPCやSubnetを指定することでは、そのVPCやSubnet内のEC2 Instancesを保護することができません。


```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ProtectedEc2Instances",
            "Effect": "Deny",
            "Action": [
                "ec2:StopInstances",
                "ec2:RebootInstances",
                "ec2:TerminateInstances",
                "ec2:DeleteTags"
            ],
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/tag-key": "value"
                }
            },
            "Resource": "arn:aws:ec2:region:account:instance/*"
        }
    ]
}
```
WinSCPの特殊文字の対応

最近、仕事でWinSCPを使うことがあったのですが、その時にハマった特殊文字の対応についてまとめていきます。


# そもそもWinSCPって？
詳細は下記のページの説明文に記載があるため、省きますが、私はWindowsのファイル取得、転送のためのクライアントツールで、GUI、CLIが用意されています。
https://winscp.net/eng/docs/lang:jp


# ハマったポイント
サーバーへ接続する時にWinSCPのGUIではうまく行ったけど、コマンドラインを使っていた時に、パスワードに「%」などの特殊文字が使われていたのですが、そのまま入力すると認識してもらえなくて接続できず苦戦したと言う話です。

下記のページによると、次のような特殊文字の場合は、こう置き換えてねーと解説がありました。

| 特殊文字 | 変換後の文字 |
|:-----------|------------:|
| スペース       |        %20または+ |
| #     |      %23 |
| %       |        %25 |
| +         |          %2B |
| /       |       %2F |
| @    |     %40 |
| :    |     %3A |
| ;    |     %3B |
http://winscp.net/eng/docs/session_url

# 具体例
こんなコマンドを実行したいとします。パスワードに「%」が使われてますので、「%25」に置き換えます。

```bat:変換前
option batch on
option confirm off
open ftpes://hoge:hoge%hoge@10.xxx.xxx.xxx/
option transfer ascii
get * C:\download
close
exit
```

↓

```bat:変換後
option batch on
option confirm off
open ftpes://hoge:hoge%25hoge@10.xxx.xxx.xxx/
option transfer ascii
get * C:\download
close
exit
```

変換後にパスワードの文字列を変更したところうまく接続できました！
できる限り特殊文字は使わないようにしたほうがいいスネ...
Google Spreadsheet の予定リストを Google Calendar に追加する。

Google Calendar でポチポチと予定を追加するのは面倒ですね。特に "XX まであと N 週間" といった予定を手動で入力するのは苦痛です。その点 Google Spreadsheet を使えば、予定のタイトルと時間のリストを簡単に生成できるので、そのリストをインポートするところを GAS で自動化しました。


```js:add_events.gs
/**
 * | Start      | End        |   | Calendar  | Title | Done |
 * |------------|------------|---|-----------|-------|------|
 * | 3/26 13:00 | 3/26 14:00 |   |           | Lunch |      |
 * |------------|------------|---|-----------|-------|------|
 * | 3/26       |            | v | Birthdays | Alice |      |
 */
var INDEX = {
  START: 0,
  END: 1,
  WHOLE_DAY: 2,
  TITLE: 3,
  CAL: 4,
  DONE: 5,
}

function registerEvents() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  
  // This represents ALL the data
  var range = sheet.getDataRange();
  var values = range.getValues();

  for (var i = 0; i < values.length; i++) {
    var row = values[i];
    // Find the calendar if the name is specified, otherwise use the default calnder.
    var cal = CalendarApp.getCalendarsByName(row[INDEX.CAL])[0] || CalendarApp.getDefaultCalendar();
    // Skip if the event is already registered.
    if (row[INDEX.DONE] != "") {
      continue;
    }
    
    var start = new Date(row[INDEX.START]);
    var title = row[INDEX.TITLE];
    if (row[INDEX.WHOLE_DAY] == "") {
      var end = new Date(row[INDEX.END]);
      cal.createEvent(title, start, end);
    } else {
      cal.createAllDayEvent(title, start);
    }
    
    // Mark as done.
    var done = range.getCell(i + 1, INDEX.DONE + 1);
    done.setValue("✓");
  }
}
```

走らせ方

1. Create a new spreadsheet in Google Docs
2. Add a list of events [1]
3. Click [Tool] > [Script Editor]
4. Copy-paste this script.
5. Run the registerEvents function

[1] Table example.

| Start      | End        | All Day | Calendar  | Title | Done |
|------------|------------|---------|-----------|-------|------|
| 3/26 13:00 | 3/26 14:00 |         |           | Lunch |      |
| 3/26       |            | v       | Birthdays | Alice |      |


https://gist.github.com/hota911/93585cd18531d67d6995146ca67ae516
電池大事に for Mac

# 動機
『Macのバッテリー寿命を長持ちさせるxxのコツ』っていう記事をよく見かけるが、
初期設定のアドバイスとしては良いのだけど、継続的インテグレーション的には乏しいものを感じたので、自分なりに補完してみた。

# やること
電池の下限と上限を決めて、適時通知を出します。
私のMacは2011年モデルで20%切れのときの通知だとちょっと遅いときがあるんで、下限も設定できるようにしました。


# Required
* growlnotify

# Source
私はtmuxを使用しいるため、[1つのshellファイル](https://raw.githubusercontent.com/KazuakiM/dotfiles/master/src/battery.sh)でいい感じに処理していますが、
cronで1分毎に実行などでも問題無いはずです。

```
battery=`pmset -g ps|egrep -o '[0-9]{1,3}%'|egrep -o '[0-9]{1,3}'|tr -d '\n'`
charge=`pmset -g ps|egrep -o 'discharging'|tr -d '\n'`

if [ "$charge" = 'discharging' -a "$battery" -lt 35 ]; then
    growlnotify -m 'Battery!'
elif [ "$charge" = '' -a "$battery" -gt 95 ]; then
    growlnotify -m 'Battery!'
fi
```

# TODO
growlnotifyを全ディスプレイに表示する方法
growlnotify依存からの脱却
scopeをActiveSupport::Concernに分割する

## はじめに
Railsのscope機能は、共通的に使うクエリーをメソッドのように定義することができる便利な機能です。ですが、システムが肥大化するにつれ、モデルクラス内がscopeを宣言しすぎると、見通しが悪くなってしまいます。そこでscopeをActiveSupport::Conernに分割する方法をまとめます。

## 実行環境
* Ruby 2.4.0
* Rails 5.0.1

## ActiveSupport::Concern とは
Railsで共通処理をモジュールとして切り出し、インクルードすることでモジュールを使用することができます。詳しくは[こちら](http://qiita.com/castaneai/items/6dc121ce6ff100614f42)をご覧ください。

## ActiveSupport::Concernでscopeを分割する

以下のUserモデルには４つのscopeが宣言されています。

```rb:app/models/user.rb
class User < ApplicationRecord
  scope :trial, -> { where(state: 'trial') }
  scope :active, -> { where(state: 'active') }
  scope :inactive, -> { where(state: 'inactive') }
  scope :canceled, -> { where(state: 'canceled') }
end
```

モデルにActiveSupport::Concernを導入するには以下の手順で行います。

1. `app/models/concerns/`以下のモジュールファイルを作成する
2. `ActiveSupport::Concern`モジュールをextendで取り込む
3. includedブロック内でscopeを宣言する
4. モデル側でモジュールをincludeする

これでCorcernにファイル分割することができ、ソースコードがすっきりします。

```rb:app/models/concerns/sample.rb
require 'active_support'

module Sample
  extend ActiveSupport::Concern

  included do
    scope :trial, -> { where(state: 'trial') }
    scope :active, -> { where(state: 'active') }
    scope :inactive, -> { where(state: 'inactive') }
    scope :canceled, -> { where(state: 'canceled') }
  end
end
```

```rb:app/models/user.rb
class User < ApplicationRecord
  include Sample
end
```

## 参考
* [ActiveSupport::Concern](http://api.rubyonrails.org/classes/ActiveSupport/Concern.html)
* [rails/concern\.rb at master · rails/rails](https://github.com/rails/rails/blob/master/activesupport/lib/active_support/concern.rb)
RedHat7.3にGlassfish4.1.1をインストールする


##環境
|インストール|Version|
|:------------|:--------:|
|RedHat Linux|7.3|
|Java SE|1.8.0_121_b13|
|glassfish|4.1.1|

##手順
###Javaのインストール
OracleのサイトからJavaSEの最新版をダウンロードする。
インストールをrootで実行。

``` sh:インストールのコマンド
rpm -ivh jdk-8u121-linux-x64.rpm
```

###Glassfishのインストール
OracleのサイトからGlassfishのzipファイルをダウンロードする。
https://glassfish.java.net/download.html
glassfish-4.1.1.zipをダウンロードする。

``` sh:インストールのコマンド
unzip glassfish-4.1.1.zip
mv glassfish4 /opt/
useradd glassfish
passwd *****
chown -R glassfish /opt/glassfish
```

###Systemd Unitファイルを作成する
自動起動させるために、SystemdのUnitファイルを作成する。

``` sh:/etc/systemd/syste/glassfish.service
[Unit]
Description=Glassfish Application Server
After=syslog.target network.target

[Service]
Type=forking
ExecStart = /opt/glassfish4/bin/asadmin start-domain
ExecStop = /opt/glassfish4/bin/asadmin stop-domain
ExecReload = /opt/glassfish4/bin/asadmin restart-domain
PIDFile=/opt/glassfish4/glassfish/domains/domain1/config/pid
EnviromentFile=/etc/sysconfig/glassfish
TimeoutStartSec=600
TimeoutStopSec=60
User=glassfish
Group=mono

[Install]
WantedBy=multi-user.target
```

``` sh:/etc/sysconfig/glassfish
JAVA_HOME=/usr/java/jdk1.8.0_121
```
・・・JAVA_HOMEしか指定していないので、EnviromentFileの指定はなくてもいいか（笑）
とりあえず、起動を確認。

```sh:起動確認
systemctl start glassfish
ps auxww |grep java
glassfi+  6091 97.6  5.6 2643524 217460 ?      Sl   23:39   0:11 /usr/java/jdk1.8.0_121/bin/java -cp /opt/glassfish4/glassfish/modules/glassfish.jar -XX:
・
・
・
```
起動が確認できたので、自動起動するように登録。

``` sh:登録コマンド
systemctl enable glassfish
systemctl list-unit-files  -t service |grep glassfish
glassfish.service                           enabled 
```

再起動して、自動起動しているかを確認する。

``` sh:確認コマンド
systemctl status glassfish
```
ちょっと分かりにくいが、`Active: active (running)`と出力されていればOK。
twitterクライアント

twitterクライアントをアップした。

https://github.com/hideume/simple-twc

である。

#概要
最初はpythonでtwitter apiで遊んでいたんだが、どうも、図を表示したくなったり、表形式で表現したかったりしたので、そうか！nodeだ！と気が付き実装したわけである。

#移行
pythonからnodeは、まあ簡単であった。しかし、これはゆくゆくはgitに・・と思っていて、今日ようやくアップしたという次第である。

#特徴1 retweet状況確認
標準のtwitterクライアントだと、retweetしているときに、誰がどのくらいの速度でやっているのかが、簡単にわからない。
これが、簡単にわかるのが、特徴である。

re:200とかは、retweeteが200あるような、ツイートをクリックで履歴表示する機能である。

#特徴２ listed
標準のtwitterクライアントだと、どこに設定してあるのかわからないが、自分のユーザ名(screen_nama)が誰かのlistに保存してある数をtwitterは管理している。

この数が多いほど、注目度が大きく、「どんなリスト」に登録されているかでなんとなく、その人の評価がわかるというシロモノである。

これで見てみると、海外のユーザでは何千ものユーザを管理しているようで、なんか恐ろしさを感じたりする。

きっと、他にも、いろんな検索が可能なんだと思う。まあ、今日は最初なんでぼちぼちですが、emoji対応や見栄え対応(style)が必要だと思うんだが、まあ、そこは許してもらおう。

そうそう、pugやexpressもど素人なんで、そこもよろしく。
[VBA]選択範囲をCSVに保存するマクロ

非常に使う機会が多いので、めも:ok_hand:

```vba:

Sub CSVに保存xlsx()
 
 'エクセルファイル名を取得して、CSVのファイル名にします
    Dim fileName As String
    Dim Target As String, pos As Long
    Target = ActiveWorkbook.Name
    pos = InStrRev(Target, ".")
    If pos > 0 Then
        If LCase(Mid(Target, pos + 1)) = "xls" Then
            fileName = Replace(ActiveWorkbook.Name, ".xls", ".csv")
        ElseIf LCase(Mid(Target, pos + 1)) = "xlsx" Then
            fileName = Replace(ActiveWorkbook.Name, ".xlsx", ".csv")
        Else
            MsgBox "エラー"
        End If
    End If

    thisPath = ActiveWorkbook.Path
 
 Dim fromRange
 fromRange = Selection(1).Address
 Dim toRange
 toRange = Selection(Selection.Count).Address
 fileName = "C:\Users\user1\Desktop\" & fileName
 
  On Error Resume Next
 
 
  Dim txt As Object
  Set txt = CreateObject("ADODB.Stream")
 
  'Set data type to save TEXT.
  txt.Type = adTypeText
  'Set char code to UTF-8
  txt.Charset = "UTF-8"
 
  txt.LineSeparator = adCRLF
 
 
  txt.Open
 
 
  'Set range
  Set r = Range(fromRange, toRange)
 
  Dim rowNo As Integer
  Dim colNo As Integer
  Dim colNoMax As Integer
 
  rowNo = Range(fromRange).Row
  colNoMax = Range(toRange).Column
 
 
  For Each r2 In r
 
      colNo = r2.Column
 
      If rowNo <> r2.Row Then
          rowNo = r2.Row
      End If
 
      'Chr(34) is double quotes
      'txt.WriteText Chr(34)
      txt.WriteText r2.Value
      'txt.WriteText Chr(34)
 
      If colNoMax = r2.Column Then
 
          txt.WriteText vbNewLine
      Else
 
          'Chr(44) is comma
          txt.WriteText Chr(44)
 
      End If
 
  Next r2
 
  txt.SaveToFile fileName, 2
  txt.Close
  Set txt = Nothing

End Sub

```
ゆっくりとデータサイエンティスト回りの概念/手法を整理してみようと思う part8

※この投稿はシリーズものの一部です。
[part7](http://qiita.com/yuusei/items/43ad17fbd642e16ab4e7) <-[part0](http://qiita.com/yuusei/items/49a63f4402afc66243e6)->[part9](http://qiita.com/yuusei/items/5caf4d8b5c76488efb6b)

注意)このエントリは下記の章立てたシリーズの最初の章のエントリとなります。
	これらのエントリは数式を理解する為に絵が多く入っています。
　　 ただし、当然数式も多く入っている為、あまり耐性のない方は無理をせず閉じていただければと思います。

1章　記述統計の基本と基本的な確率分布 
この章の目標は、平均や分散、標準偏差などを3次元までのレベルで絵を記載して理解できるようにするのが目標です。
著者の好みでわけのわからないこだわりが入る場合がありますが、なるべくわかりやすく書いていきたいと思います。

1.1 確率関数と記述統計
この節では、まず確率関数の定義を示し、続けてその定義を基にして、平均や分散、標準偏差や相関を絵にして
説明していきたいと思います。

1.1.1 確率関数(離散-連続)
[該当エントリ](http://qiita.com/yuusei/items/342fced5a45095172400)

1.1.2 同時確率(離散)
[該当エントリ](http://qiita.com/yuusei/items/1b8e90899a8497d54759)

1.1.3 同時確率(連続)
[該当エントリ](http://qiita.com/yuusei/items/b824168c52c2e68295d8)

1.1.4 平均と標本分散と標本標準偏差(離散)
[該当エントリ](http://qiita.com/yuusei/items/43ad17fbd642e16ab4e7)

1.1.5 標本分散と不偏分散と母分散

このエントリでは、前回のエントリで説明しきれなかった、
離散世界の中でもサンプルの世界と真の値を繋ぐ道具「不偏分散」について説明します。
ここで不偏分散について、説明して、次回、自由度と言う概念を説明したいと思います。
前回標準偏差と自由度までやると言っていたんですが、結局時間がなくてここまでになっています・・・

まず、離散の世界でよく使われる分散は三つあります。
「標本分散$(s^2)$」と「不偏分散${\hat{\sigma}}^2$」と「母分散${\sigma}^2$」です。

```math
\begin{eqnarray}
	s^2 &=& \frac{1}{n} \sum_{I = 1}^{n} (x_i - \bar{x})^2  \\
	{\hat{\sigma}}^2 &=& \frac{1}{n-1} \sum_{i = 1}^{n} (x_i - \bar{x})^2　\\
	{\sigma}^2 &=& \frac{1}{n} \sum_{I = 1}^{n} (x_i - \mu)^2
\end{eqnarray}
```

上が標本分散で、下が母分散。
で、真ん中が不偏分散。
※$\mu$は母集団の平均です。

ぱっと見の印象でどうでしょう？
ネタを知っているからですが、僕には標本分散と母分散が同じ形に見えていて、
不偏分散だけが (n-1)で割ってるから、
他の二つよりも数字が大きく出そうだな、これが仲間外れっぽいなと思ったりするわけです。
実は、それは数式の見方としては正しく、現実の見方としては誤りです。

ここに離散の世界におけるサンプリングの罠が隠れています。

その罠とは「現実世界で手に入れたデータから計算した標本分散は、どんなに大きい数だろうと、真の分散よりも小さくなる（※統計ではこの真の分散の事を母分散と言います）」です。

カンのいい人は分かったと思いますが、なかなか分かり辛いと思うので、追加の説明をします。

最初の３つの式で、僕は「標本分散と母分散は似てる」「不偏分散だけ仲間外れで、計算結果が大きくなりそうだ」と言いました。 

ですが、サンプリングの罠に従うと「標本分散と母分散は違う。標本分散の方が小さい」となるわけです。

はてな？同じ式に見えるのになぁ？ですね。

なんでそうなるのか直感的な説明をする前に「じゃあ、サンプリングしても母分散は求められないのか？」と言う疑問が湧きますよね。これに答えます。

「サンプルの結果から母分散は求められます。それが不偏分散です」

どうしても小さくなりがち（小さく偏りがち）なサンプルの標本分散に代わって、母分散に対し偏りのない式が欲しい。

その要望を満たすのが不偏分散になるわけです。不偏分散が理論的に母分散としてつかえると言う話は、例えば [ここ](http://tech.naviplus.co.jp/2014/02/27/不偏分散はなぜ-n-1-で割るのか？/) とか で説明していますので、そちらを参照して下さい。

さて、話を戻して、何故標本分散が母分散より小さくなるかの話です。

これなんですが、正直言って [ここ](http://home.a02.itscom.net/coffee/tako08Annex2.html)の「観測データの構造」 の図よりもわかりやすい図が書けなかったので、図の説明はそちらを見てください。実は一つ前のエントリの図はこのサイトからインスパイアされています。
ここでは、図ではなく言葉で説明しますね。

```math
\begin{eqnarray}
サンプルのばらつき &=&  \frac{1}{n} \sum_{i = 1}^{n} (x_i - \bar{x})^2 \\
真のばらつき &=& \lim_{n \to \infty} \frac{1}{n}\sum_{i = 1}^{n} (x_i - \bar{x})^2
\end{eqnarray}
```

です。(※数式はイメージです)

雑ですかね？要は、

サンプルのばらつきではカバーできないくらい真のばらつきに影響を与える変数は多い。
つまり、真のばらつきはサンプルで考慮できている範囲の外で「更にばらつく」。
よって、サンプルは限られた範囲しか考慮できていないので、真のばらつきよりも「ばらつきが小さくなる」。

というわけです。
この辺に入ってくると分散分析などの世界に片足突っ込んでます。
その辺を実務でやった事はあるので、いつか話ができるといいなとは思っています。

また、有限と無限の話も絡んできて、大数の法則とか中心極限定理とかも絡んでくるんですが、
そのあたりの話は、だいぶ先の方になると思います。
まずは、足元の部分をどうにか終わらせなくては・・・
次は標準偏差と自由度の話。変数の独立って何？です。

来月の頭は忙しいので、中旬になってしまうかもしれませんが、のんびりお待ちください。
VPSの支払いにLINE Payは使えるのか

| VPS        | 支払い       | PayPal経由 | 情報                                        | 
|:----------:|:-----------:|:---------:|:------------------------------------------:|
| Azure      | 出来る(と思う) | 不要       | 登録のみ確認済み、**実際に支払い確認はしていない**   |
| ConoHa     | 出来る       | 不要       | チャージ出来る事を確認済み、**月末払いには使えない**  |
| EC2(AWS)   | 出来る       | 不要       | **一度カードエラーが発生したが**、再登録後月払いで確認済み|
| さくらインターネット | 出来ない      | - | **カード会社の規定により利用できない** ([プリペイド機能付きカードは利用できますか](https://help.sakura.ad.jp/hc/ja/articles/206437081#ac02))
| IDCFクラウド      | 出来る | 利用不可       | **2017/11/14から**利用できるようになった   |
*編集リクエストで情報を追加して頂けると幸いです*
jsclasses に新たに jsreport が追加された件

pLaTeX／upLaTeX用の和文文書クラスとして広く用いられている[jsclassesクラス集]ですが、最近（2017年2月）になって大きな機能拡張が行われました。従来あった「jsarticleクラス」と「jsbookクラス」に加えて、新たに**「jsreportクラス」**が利用できるようになりました。本記事では、この新しい「jsreportクラス」について解説します。

[jsclassesクラス集]: https://www.ctan.org/pkg/jsclasses

## jsreportクラス、現る

従来のjsclassesには次の2つのクラスが含まれていました。

  * jsarticleクラス： “article系”（章のないレポート用）
  * jsbookクラス： “book系”（書籍用）

そして、“report系”（章のあるレポート用）のレイアウトを使いたい場合は、次のように「jsbookクラスに`report`オプションを付ける」ことが指示されていました[^slide-1]。

[^slide-1]: ちなみに、jsarticleに`slide`オプションを付けると、スライド用の文書クラスとして機能します。

```latex:report系のjsclasses（旧）
% reportオプションを付ける
\documentclass[report,a4paper,11pt]{jsbook}
```

これに対して、2017/02/13リリースの新しいjsclassesでは新たにreport系のクラスである**jsreport**が提供されるようになりました。

  * jsreportクラス： “report系”（章のあるレポート用）

```latex:report系のjsclasses（新）
\documentclass[a4paper,11pt]{jsreport}
```

この「jsreportクラス」は単に従来の「jsbook +`report`」の名前を変えたものではなく、より「report系のクラスとして適切なレイアウト」になるように仕様修正がなされています。

※なお、従来の「jsbook+`report`」については、従来の仕様のままで今後も用いることができます。

## jsreportはabstractが違う

従来の「jsbookクラス+`report`」と新設の「jsreportクラス」の違いは、**abstract環境の意味とその挙動**に関するものです。

### 文書を概要するabstract環境

一般のarticle系／report系のクラスにおいて、abstract環境は**「文書の概要を記述する」**ものであり、典型的には標題（`\makatitle`）の直後に配置[^abst-pos-1]されます。

[^abst-pos-1]: 文書クラスによっては、**LaTeXソース上での**abstract環境の位置について「`\maketitle` 以前の任意の位置に記述できる」という仕様のものもあります。この場合も、出力上は通常通り標題の直後に配置されるのが一般的です。

```latex:jsarticleのabstract環境
% pLaTeX文書
\documentclass[a4paper]{jsarticle}
%...(略)...
\begin{document}

\maketitle % 標題

\begin{abstract}% "文章の"概要
近年，{\TeX}のアレ性への認識の共有が深まるにつれて，
{\TeX}の必要性を低減させるための技術（いわゆる「{\TeX}グッバイ」）
に対する需要が高まっている．
本研究では，Microsoft社の著名なワープロソフトである「Word」に
ついて，それを用いた「{\TeX}グッバイ」の可能性について考察する．
%...(略)...
\end{abstract}

%...(略)...
\end{document}
```

![jsreport-2.png](https://qiita-image-store.s3.amazonaws.com/0/14550/ae9aaeb3-6a0c-807b-aa4d-840c13609ac8.png)

このような「文書概要」の形式は、書籍[^book-abst-1]では用いられないため、一般的なbook系の文書クラス（LaTeX標準のbookクラスなど）では、abstract環境は提供されないのが普通です。

[^book-abst-1]: 書籍では“文書の概要”は通常「前書き（前文、Preface）」と題した章に記述されます。

### 章を概要するabstract環境

ところが、**jsbookクラス**では特別に、abstract 環境を**「章の概要を記述する」**という別の目的をもつものとして提供しています。

```latex:jsbookのabstract環境
% pLaTeX文書
\documentclass[a4paper]{jsbook}
%...(略)...
\begin{document}
%...(略)...
\chapter{{\TeX}言語に関する大事な注意}

%%%%↓"章の概要"を表すabstract環境
\begin{abstract}
{\TeX}言語危険、ダメゼッタイ。
大事なことなのでもう一度：{\TeX}言語危険、ダメゼッタイ！
\end{abstract}

{\TeX}言語は組版エンジン{\TeX}の動作を記述するための
プログラム言語である。
従って、{\TeX}言語を使うことで、{\TeX}の機能の全てを
直接扱うことが可能になる。
%...(略)...
\end{document}
```

![jsreport-1.png](https://qiita-image-store.s3.amazonaws.com/0/14550/2bf10a7d-ddd0-a821-9542-c5a7dad2d178.png)

### jsreport、マジreport系

article系／report系のクラスとjsbookクラスではabstract環境の用途が異なることが解りました。それでは、jsclassesの新旧双方の「report系クラス」ではabstract環境はどちらの意味になるのでしょうか。答えは以下の通りです。

  * jsbookクラス+`report`： abstract環境は「章の概要」用
  * jsreportクラス： abstract環境は「文書の概要」用

「jsbookクラス+`report`」は元がjsbookであることの影響のためか、abstract環境が「章の概要」用になっていました。しかし、report系である以上、本来は「文書の概要」用のabstract環境となるのが望ましいはずです。それが新しいjsreportクラスでは修正されている、というわけです。

## まとめ

というわけで、jsclassesクラス集でreport系の文書を作る場合は、今後は（古い環境との互換が不要な限りは）**新しい「jsreportクラス」を使いましょう！**
bundle install先ってどこになるの？

#rbenvを使っている場合

ruby2.4.0であれば

```
/Users/****/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems
```
にインストールされます。

#rbenvのgemsetも使っている場合

```
/Users/****/.rbenv/versions/2.4.0/gemsets/プロジェクト名/gems/
```
にインストールされます。

#bundle install --path ほげほげパス
で指定した場合は、
ほげほげパス以下にインストールされるわけですが、実はbundlerは一度インストールした先を覚えてしまうそうで、お試しに--pathを設定してgemのインストール先を変更したことがあったのですが、その時に.bundle/configにインストール先が記録されてしまい管理しているgemの挙動がおかしくなってしまいました。

ちょっとこのせいでかなーりハマったので皆さんお気をつけて。


参照[http://qiita.com/hisonl/items/162f70e612e8e96dba50]
Androidアプリのコンポーネントについて

#概要
最近インターン先でAndroidアプリの開発をすることになり、コンポーネントについての理解が足りず苦労したので、勉強したことをメモ代わりに書きます。かなり初歩的な内容なのであんまり参考にはならないかもです:satisfied:
#勉強に使った本
[基本からしっかり身につくAndroidアプリ開発入門](https://www.amazon.co.jp/dp/4797384506)

#各コンポーネントの概要と役割
<dl>
 <dt>アクティビティ</dt>
 <dd>アプリの画面を表示するためのコンポーネントであり、状態保存・復帰や他のコンポーネントを呼び出す仕組みが用意されている。他のアクティビティを呼び出す時、情報をメッセージとしてシステムに伝達する仕組みを<font color="Red">インテント</font>という。</dd>
 <dt>フラグメント</dt>
 <dd>アクティビティの持つUIや昨日の一部を表現するもの。画面の大きさによって表示の仕方を変えれることや、まとまったUIやロジックをアクティビティから独立させられるから便利。</dd>
 <dt>サービス</dt>
 <dd>バックグラウンドで動作するコンポーネントであり、UIの提供などを行わない。メインの処理とは別に動かせるため、ユーザーの行動を阻害しない形で処理を行いたい場合や、アクティビティのライフスタイルに影響されずに処理を継続したい場合に便利。ただし、基本的にはアプリと同一のプロセスのメインスレッド上で動作するため、実装する際にはCPUを酷使する処理をそのまま書くのを避け、サービス場でスレッドを立てた上で動作させるべき</dd>
 <dt>コンテントプロバイダ</dt>
 <dd>アプリが管理しているデータへのアクセスを提供するためのコンポーネント。管理しているデータの形式に関係なく、データを取得して操作することができるインターフェースを提供する。Android SDKには最初からいくつかのコンテントプロバイダが用意されているため、カメラで撮影した写真やカレンダー情報、連絡先情報などを簡単に取得・更新することができる。</dd>
 <dt>ブロードキャストレシーバ</dt>
 <dd>ブロードキャストされたインテントを受け取り、処理を行う。インテントのブロードキャストは個別のアプリから行うこともできるが、システムが発行する場合（端末が充電器に接続された時、日付が変わった時など）もある。なお、ブロードキャストレシーバは標準設定では１０秒以内に処理を終えなければユーザに対して強制終了するかどうかのダイアログを表示してしまうため、データ更新を行うサービスを呼び出す処理のみに使用し、処理自体は呼び出したサービス側で行うべきである。</dd>
</dl>

#コンポーネントのライフサイクル
<dl><dt>アクティビティ</dt><dd>状態が変化するごとに<strong>コールバックメソッド</strong>が呼ばれる。開発者はこのコールバックメソッドにそれぞれの状態に対応した処理を行う。</dd>
<dt>フラグメント</dt><dd>基本的にはアクティビティと同様にコールバックメソッドに従った処理を記述するが、フラグメントはアクティビティの中に置かれるコンポーネントであるため、アクティビティのライフスタイルの影響を受ける。アクティビティが破壊された場合、そのアクティビティに置かれたフラグメントも破壊される。</dd><dt>サービス</dt><dd>startService()で「開始された」状態と、bindService()によって「バインドされた」状態の２つの起動方法によって異なる形態をとる。前者の場合メモリ不足などによってシステムが停止させられるか明示的に終了しない限り停止しないため、メモリの無駄な占有を防ぐために不要になったら明示的に終了させる必要がある。後者の場合は実行したコンポーネントとサービスが一種のクライアントとサーバーの関係になるため、呼び出し元がバインドを解除すればサービスは停止する。この場合は複数のコンポーネントを同一のサービスにバインドさせることができる。</dd><dt>コンテントプロバイダ</dt><dd>アプリの起動時に生成され、その後はプロセスが続く限り破棄されない。コンテントプロバイダのライフサイクルについては、基本的に意識する必要がない。</dd><dt>ブロードキャストレシーバ</dt><dd>onReceive()　の間のみ生存する。onReceive()が終了すると不要なオブジェクトと見なされ、間も無く破棄される。ただし、goAsync()メソッドを読んだ場合、その戻り値であるPendingResultクラスのfinish()メソッドを呼ぶまでは実行可能</dd>
</dl>
(参考)アクティビティのライフサイクル
![activity_lifecycle_pic](https://qiita-image-store.s3.amazonaws.com/0/124827/a181161c-9628-b89e-e644-9af1b4c9e3f7.jpeg)
####<font color="Blue">ライフサイクルの可視化について</font>
各コンポーネントが独自のライフサイクルを持ち、ライフサイクルの各段階で可能な処理が変わることがスマートフォンアプリの複雑さの原因になっている。表示やユーザーの入力といったライフサイクルに影響されやすい処理を受け持つクラスはできる限りシンプルに保つよう設計するべき。そして、ビジネスロジックやデータの永続化といった処理を、アクティビティのライフスタイルに影響されないように設計すべきである。

#最後に
以上が、コンポーネントに関する簡単なまとめです。今は電卓やメモ帳を使って勉強している最中なので、また気が向いたら実装に関することをメモがわりに何か書いてみたいと思います。\:kissing_closed_eyes: chu☆

####石川はまだ寒いです:mask:
Windows10でhash値を確認する方法

実行バイナリとか、Linuxのisoファイルを使う場合、基本的にはチェックしたほうが良いと思います。また、大きめのファイルだとダウンロード時にファイルが壊れることもあるので、チェックすると良いと思います。（過去に何回かLinux Mintのisoファイルがぶっ壊れていて時間を無駄にしたことがありました。。。）

# MD5
```bat
certutil -hashfile c:\test.txt MD5
```

# SHA1
```bat
certutil -hashfile c:\test.txt SHA1
```

# SHA256
```bat
certutil -hashfile c:\test.txt SHA256
```

# ヘルプコマンド

```bat
$ certutil -hashfile -?

使用法:
  CertUtil [オプション] -hashfile InFile [HashAlgorithm]
  ファイルに暗号化ハッシュを生成し表示します

オプション:
  -Unicode          -- リダイレクトされた出力を Unicode として書き込む
  -gmt              -- 時刻を GMT で表示します
  -seconds          -- 時間を秒とミリ秒で表示します
  -v                -- メッセージを詳細に表示します
  -privatekey       -- パスワードと秘密キーのデータを表示します
  -pin PIN                  -- スマート カードの PIN
  -sid WELL_KNOWN_SID_TYPE  -- 数値 SID
            22 -- ローカル システム
            23 -- ネットワーク サービス
            24 -- ローカル サービス

ハッシュ アルゴリズム: MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512
```
オプションがよくわからんですが、(ﾟεﾟ)ｷﾆｼﾅｲ!!
最近知ったforeachのこと

## nullチェック不要
配列（$arr）がnullだとエラーになるので、is_array()でチェックしてたけど、

```php:before
if(is_array($arr)) {
  foreach($arr as $value) {
    (--- code ---) 
  }
}
```

キャストすれば、空配列になるので、チェック不要。

```php:after
foreach((array)$arr as $value) {
  (--- code ---) 
}
```
コードが短くなった。

## ジェネレーター・・・？
foreachは配列のためだけにあると思ってた。
複数の要素を1つの変数で扱うためには、とにかく配列にぶっこむものだと思ってた。
しかし、「[ジェネレーター](http://php.net/manual/ja/language.generators.php)」なるものがあるらしい。

配列を定義して、必用な分だけ値をセットする代わりに、
関数を定義して、その中で必要な分だけ```yield [値];```と追加していく。
```yield （[キー]=>[値]）;```とすれば、連想配列のようなkey-value形式にも対応可能。

このyieldを含んだジェネレーター関数を実行すると、ジェネレーターオブジェクトが返され、
配列と同様にforeach文で扱うことができる。

```php:array
$arr = [1, 3, 5];

foreach($arr as $value) {
```
と定義する代わりに


```php:generator
function myGenerator() {
  yield 1;
  yield 3;
  yield 5;
}

foreach(myGenerator() as $value) {
```
と定義できる。

値に規則性がある場合は、for文などと組み合わせて、値を生成できる。
何度もyieldと書かなくて済む。
引数を受け取り、実行時に値を指定できるような関数にしておけば、使い回しができそう。

```php:generator
function myGenerator($start, $end, $step) {
  for($i=$start; $i<$end; $i+=$step) {
    yield $i;
  }
}
foreach(myGenerator(1, 10, 2) as $value) {
```
Live2Dで縦横の比率を調整する

Live2DでCanvasの縦横サイズが異なる場合、以下のように伸びて描画されます。
（SampleApp1のサンプル以外）
<img width="500" alt="def_canvas.png" src="https://qiita-image-store.s3.amazonaws.com/0/15028/7f6c0829-75e3-d705-af81-6f3fd2603fff.png">

それを回避する方法をメモしておきます。

# 開発環境
[Live2D WebGL SDK2.1](http://sites.cybernoids.jp/cubism-sdk2/webgl2-1)のSimpleサンプルをカスタム

# ソースコード
まずはHTML部分にLive2DFramework.jsを追加します。この中に含まれるL2DMatrix44クラスを使います。

```html:simple.htmlの12行目あたり
<!-- Live2D Library -->
<script src="../../lib/live2d.min.js"></script>
<script src="../../framework/Live2DFramework.js"></script>
<!-- User's Script -->
<script src="src/Simple.js"></script>
```

Live2DFramework.jsに比率調整用の以下コードを追加します。

```js:Live2DFramework.jsの860行目あたり
L2DModelMatrix.prototype.setScale = function(width, height, scale)
{
    var scaleX = scale / width;
    var scaleY = -scale / height;
    this.scale(scaleX, scaleY);
}
```

Simple.draw()部分の行列部分を以下のように修正します。
canvasはグローバル変数にして、参照できるようにしておいて下さい。

```js:Simple.jsの150行目あたり
//    // 表示位置を指定するための行列を定義する
//    var s = 2.0 / live2DModel.getCanvasWidth(); //canvasの横幅を-1..1区間に収める
//    var matrix4x4 = [
//        s, 0, 0, 0,
//        0,-s, 0, 0,
//        0, 0, 1, 0,
//       -1, 1, 0, 1
//        ];
//    live2DModel.setMatrix(matrix4x4);
    
// 描画してるLive2Dモデルのサイズを取得
var height = live2DModel.getCanvasHeight();
var width  = live2DModel.getCanvasWidth();
// Canvasのサイズ取得
var can_height = canvas.height;
var can_width  = canvas.width;
    
// Live2D用の行列定義
var mmat = new L2DModelMatrix(width, height);
// スケールを調整する関数に渡す
mmat.setScale(can_width, can_height, 0.7);
// ポジション(X, Y)
mmat.setCenterPosition(0.0, -0.5);
// 配列をセット
live2DModel.setMatrix(mmat.getArray());
```
これでCanvasサイズを変更しても縦横比率が正しくなりました！
<img width="500" alt="custom_canvas.png" src="https://qiita-image-store.s3.amazonaws.com/0/15028/7423e621-c776-0465-bf6f-317eb9c36985.png">

# 参考
[Live2Dで位置とサイズを調整する](http://qiita.com/naotaro0123/items/013a9731755cb0a0537a)
wpの検索結果URLを固定ページにする

ここでは一覧用の固定ページはpage-list.php


```フォームのソース
<form action="/list/" method="get">
<!-- valueはキーワードがあるかどうかの判定 -->
<input name="keyword" value="<?php echo isset($_GET['keyword']))? esc_html($_GET['keyword']) : ''; ?>">
</form>
```

```page-list.php
<?php
$args = array(
  'post_type' => array('hoge','foo'),
  'posts_per_page' => -1,
);
// キーワードがあるかどうか
if(isset($_GET['keyword'])) $args['s'] = esc_html($_GET['keyword']);
$the_query = new WP_Query( $args );
// ループ
if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) : $the_query->the_post();
  // 何かする
endwhile;
endif;
// 投稿データをリセット
wp_reset_postdata();
?>
```

たぶんこういうイメージかな。。
WindowsでCP932(Shift-JIS)エンコード以外のファイルを開くのに苦労した話

初投稿記事です。
非情報学部からIT業界に就職し、入社から1年がたとうとしている人の記事です。
プログラミング以外にも記事を書いたり説明することも下手ですので、暖かく見守って頂けると幸いです。

何か指摘がございましたらコメントお願いします。


#Pythonでファイルのopenができない
現在、業務でPythonを使うことになりそうな状況になっているので、勉強として自宅でプログラムを作成したところ上手くいかなかった部分があったので、備忘録として記事を投稿します。

プログラミング初心者で同じような部分で躓いている方がいらっしゃったら参考にしてください。

当記事では、JSONファイルを対象にしていますが、CSVファイルなどの他のファイルを開いた場合でも同じような現象が起きます。
よければ参考にしてください。

##環境
OS  :Windows 8.1
言語:Python 3.6.0

Macで開発した方がいいのかもしれませんが、仕事の環境がWindowsだったので、そちらに合わせました。

Pythonのバージョンも、2系を使うか3系を使うか迷いましたが、今後を考えて3系を使うことにしました。
ただ、ネット上では2系のコードが多い印象です。私の場合ネット上でコードをあさることが多いので、3系の基礎的なことを先に学んだ方がいいですね。

##プログラムコード
データをJson形式で保存し、Pythonのプログラムから読みだすため、ネット上で色々調べながら以下のコードを記述し実行したところエラーが発生しました。

```json:test.json
 {
     "name": "タロー",
     "age": 20  
 }
```
データは簡単なもので試してみます。


```py3:pytest.py
import json

f = open(r'C:\Users\UserName\Desktop\test.json','r')
data = json.load(f)
print(data)
```
単純にファイルを開いてデコーディング(?)・表示するだけのプログラムです。

```py3:実行結果
UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 0: illegal multibyte sequence
```
初めての私からすると'cp932'????
といった状況でした。

どうやら、デフォルトの場合、文字のコーディングはUTF-8になるのですが、Windows環境を使用しているとデフォルトがcp932でコーディングされるようです。
なので、プログラムにUTF-8でコーディングする様に記述を加えます。


```py3:pytest.py
import json

f = open(r'C:\Users\UserName\Desktop\test.json','r',encoding="utf-8")
data = json.load(f)
print(data)
```
まあ、これなら上手くいくやろ・・・
と思っていましたが、甘かったようです。


```py3:実行結果
json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig): line 1 column 1 (char 0)
```
今度はUTF-8 BOMってなんだ・・・

これもまた調べてみると、UTF-8ではBOMが付くものとそうでないものがあるようです。
このエラーを解決するためにencodingを"utf-8"から"utf-8_sig"にする必要があるようです。


```py3:pytest.py
import json

f = open(r'C:\Users\UserName\Desktop\test.json','r',encoding="utf-8_sig")
data = json.load(f)
print(data)
```

とりあえず成功を祈りながら実行してみます。

```py3:実行結果
{'name': 'タロー', 'age': 20}
```

表示は成功!!


##終わりに
いや～
研修の時は躓いた記憶はないのですが、独学だったりすると無駄に躓くものですね。
こんなのさらっと終わらせるつもりでしたが、解決までに結構時間がかかりました。

初心者の方は、簡単なデータや簡単なプログラムから書き始め、積み上げながら完成にもっていった方がいいと思います。
(経験者の方もそのようにしているかもしれませんが)

私はすんなりいくと思って完成形に近いものを作ってから実行してエラーが出たので、エラーの原因を突き止めるのに結構時間がかかりました。
まだまだ未熟ですね・・・

今後も、私自身の経験の為にも小さい物から記事を書いていきたいと思います。

以上になります。
Dockerコンテナに別ttyで接続する

コンテナの公開するポートを指定せずにrunしてしまった時に、サーバーなどが動いているか確認したい時にterminalの別タブからattachしてもサーバーのログ画面で2つとも一緒やないかいとなることがあった

`docker attach コンテナ名`

ではなく

`docker exec -it コンテナ名 bash`

で繋げばおけ


### 参照
[Docker - Enter Running Container with new TTY](http://stackoverflow.com/questions/20932357/docker-enter-running-container-with-new-tty "Docker - Enter Running Container with new TTY")
HTML属性にシングルクォーテーションを使えるのなら、PHPの変数を扱いやすくなるかも、と思ったこと

## 事の発端
HTMLの属性値は、ダブルクォーテーションで囲うものだばかりと思っていたが、
シングルクォーテーションでもよいらしいと知った。

```html
<p class="foo">content</p>
```
```html
<p class='foo'>content</p>
```

## ひらめいた
今まで、PHPの文字列内にHTMLコードを埋め込む際、文字列全体をシングルクォーテーションで囲っていた。

```php:wrap_string_with_'
$html = '<p class="foo">content</p>';
```

なぜなら、属性値を囲うダブルクォーテーションをエスケープするのが嫌だったからだ。
視認性が落ちるし、抜け漏れの恐れもある。

```php:wrap_string_with_"_escape
$html = "<p class=\"foo\">content</p>";
```

ただ、変数が入ってくると、面倒だ。
変数の前後で文字列を一旦閉じて、ドット演算子で変数と連結して・・・
とやるのは、変数がいくつもあると面倒だし、何よりスマートじゃない。

```php:wrap_string_with_'_concat
$class = "foo";
$html = '<p class="'.$class.'">content</p>';
```

ダブルクォーテーションの中であれば、{}で囲うことで変数を展開できるので、できれば使いたい。

```php:wrap_string_with_"_expand
$name = "foo";
$str = "My name is {$name}.";
```

しかし、ダブルクォーテーション in ダブルクォーテーションだと、やはり視認性が・・・。

```php:wrap_string_with_"_escape_expand
$class = "foo";
$html = "<p class=\"{$class}\">content</p>";
```

これが、今までの葛藤だった。


しかし、属性値をシングルクォーテーションで囲えるのならば、話は違う。

```php:wrap_string_with_"_expand
$class = "foo";
$html = "<p class='{$class}'>content</p>";
```

大分見やすい。


## しかし
属性値をシングルクォーテーションで囲ったHTMLコードを見たことがなかった。
何か理由があるのではないかと調べてみたところ、主に2つの理由がありそうだ。

* 英語圏では、シングルクォーテーションと同じ ' を省略記号として使う。I'm fine. のように。そのため、区切り文字として使用する記号は、慣例的にダブルクォーテーションになった、という説。
* XSS対策として、PHPではhtmlspecialchar()及びhtmlentities()が使用される。これらのメソッドは、デフォルトではシングルクォーテーションをエンティティ文字列に変換しない。引数で指定をすれば変換することもできるが、デフォルトのままで変換されない場合を考慮して、ダブルクォーテーションで囲んでおいた方が安全という説。


## 結論
* 業務上、マークアップ済みのHTMLコードをいただき、PHPで処理を加えることが多いため、納品されたデータに合わせるのが筋。その場合、属性値はダブルクォーテーションで囲われている確率が高い。
* 個人的にマークアップするのであれば、シングルクォーテーションでもよいと思った。
* htmlspecialchar()及びhtmlentities()には、ENT_QUOTESを指定して、ダブルクォーテーションもシングルクォーテーションもエンティティ変換するようにする。


## 追記
よく考えてみたら、業務上、「HTMLコードを組み立てて返す」といった処理はせず、もっぱらviewでHTMLにPHPタグを埋め込んでいる。

```php:PHP
<?php
$class = "foo";
if(true) {
?>
  <p class="<?php echo $class; ?>">content</p>
<?php
}
?>
```

これだと、そもそも影響は受けない。


## 参考
* [HTMLの属性値はなんでダブルクォートで囲むことが推奨されているのか考えてみた](http://yutaka.hatenablog.jp/entry/2013/06/01/010304)
* [JavaScriptのシングルクォーテーションとダブルクォーテーション](http://qiita.com/niusounds/items/f21a28e862a68a098ea7)
chrome で昔の日付の toLocaleString が変

windows10
Chrome 57.0.2987.110 (Official Build) （64 ビット）


```javascript
new Date(2000, 0, 1).toLocaleString()
// "2000/1/1 0:00:00"
```

うん

```javascript
new Date(1900, 0, 1).toLocaleString()
// "1900/1/1 0:00:00"
```

うんうん

```javascript
new Date(1800, 0, 1).toLocaleString()
// "1800/1/1 0:18:59"
```

うん？

---

windows7
Chrome 57.0.2987.110 (Official Build) （32 ビット）


```javascript
new Date(2000, 0, 1).toLocaleString()
// "2000/1/1 0:00:00"
```

うん

```javascript
new Date(1900, 0, 1).toLocaleString()
// "1899/12/31 23:27:52"
```

うん！？？
初心者向け Macでバックアップから復元する方法


## 概要
Macにはバックアップを管理するタイムマシンという便利なツールが入っています。

このタイムマシンでバックアップを作成した場合、そのバックアップから復元することができます。

やり方がわからない方のために、復元する方法を写真でわかりやすく説明します。

## 手順
- Macを一度シャットダウンします。
- 外付けハードディスクを取り付けます。
- 立ち上げる時に、`command + R` を押し続けてマークが表示されたら離します。
- しばらくするとリカバリーモードが起動します。
- リカバリーモードになったら、「主に日本語を使用する」を選択して、次にいきます。

![20170311_224933.jpg](https://qiita-image-store.s3.amazonaws.com/0/142810/5434ac6e-d399-af78-b444-63d685aa58bf.jpeg "20170311_224933.jpg")

- 「Time Machineバックアップから復元」選択し、「続ける」をクリックします。

![20170325_195541.jpg](https://qiita-image-store.s3.amazonaws.com/0/142810/36b91a1e-de94-8889-cd87-fab5369de8c6.jpeg "20170325_195541.jpg")

- 「続ける」を選択します。

![20170325_195557.jpg](https://qiita-image-store.s3.amazonaws.com/0/142810/46bcb771-03e8-fb5e-b898-a2df29fee78e.jpeg "20170325_195557.jpg")

- 外付けハードディスクを選択し、「続ける」をクリックします。

![20170325_195623.jpg](https://qiita-image-store.s3.amazonaws.com/0/142810/30bef1ad-db30-12c8-dcc9-9e0b364404ba.jpeg "20170325_195623.jpg")

- 「復元元」を選択し、復元した日付を選びます。そして、「続ける」をクリックします。

![20170325_195643.jpg](https://qiita-image-store.s3.amazonaws.com/0/142810/de015211-14fb-4831-b3d9-9f5b973a7796.jpeg "20170325_195643.jpg")

- 「Macintosh HD」を選択し、「復元」をクリックします。

![20170325_195700.jpg](https://qiita-image-store.s3.amazonaws.com/0/142810/b1aed742-403b-ec80-2c95-51c95e678e40.jpeg "20170325_195700.jpg")

- ここから復元が開始されます。

![20170325_195730.jpg](https://qiita-image-store.s3.amazonaws.com/0/142810/0e157c21-a8ca-f8eb-defb-298a5b91913d.jpeg "20170325_195730.jpg")

- 復元が終わると、再起動されます。
- 以上がバックアップから復元する方法となります。
マークダウン チートシート

# Markdown Cheat sheets

-----

# 見出し1
## 見出し2
### 見出し3
#### 見出し4
##### 見出し5
###### 見出し6

-----

* リスト1
    - 子リスト1_1
        + 孫リスト1_1_1
        + 孫リスト1_1_2
    - 子リスト1_2
* リスト2
* リスト3

-----

1. 番号付きリスト1
    1. 番号付きリスト1_1
    2. 番号付きリスト1_2
        1. 番号付きリスト1_2_1
        2. 番号付きリスト1_2_2
        3. 番号付きリスト1_2_3
2. 番号付きリスト2
3. 番号付きリスト3

-----

- [x] チェックボックス on  
- [ ] チェックボックス off

-----

引用
> お世話になります。xxxです。
>
> バグってます。

-----

二重引用
> お世話になります。xxxです。
>
> バグってます。
>
>> お世話になります。 yyyです。
>>
>> 先日納品させて頂いたシステムの調子はいかがでしょうか。

-----

インラインコード表示 `composer install`

-----

コード表示はスペース4 or タブ

    public function hoge()
    {
        return 'hoge';
    }

-----

チルダ × 3 でもOK

~~~
public function hoge()
{
    return 'hoge';
}
~~~

-----

バッククオート × 3 でもOK

```
public function hoge()
{
    return 'hoge';
}
```

-----

チルダ or バッククオートの後に言語名でシンタックスハイライト  
※Qiitaの場合は`ruby:index.rb`とすることでファイル名も明示可能

```ruby:index.rb
class Hoge
    def hoge
        print 'hoge'
    end
end
```

-----

改行は  
スペース2

-----

強調 `<em>`  
*italic*  
_italic_  

-----

強調 `<strong>`  
**bold**  
__bold__

-----

強調 `<em> + <strong>`  
***italic + bold***  
___italic + bold___

-----

~~打ち消し~~

-----

本文本文本文 [注釈1]  
本文本文本文 [脚注1]

[注釈1]:注釈テキスト
[脚注1]:脚注テキスト

-----

自動リンク  
http://qiita.com  
<http://qiita.com>

-----

インラインリンク  
[Google](https://www.google.co.jp/)  
[Qiita](http://qiita.com "タイトル付き")  
[Qiita](http://qiita.com "http://qiita.com")

-----

リンク共有
[ここ][link-1] と [ここ][link-1] のリンクは連動。  
[link-1]:(http://qiita.com/drafts/c686397e4a0f4f11683d "hello)

-----

画像  
![ダミー画像](http://placehold.it/350x150)  
![ダミー画像](http://placehold.it/200x100 "タイトル")

[![Build Status](https://travis-ci.org/laravel/framework.svg)](https://travis-ci.org/laravel/framework"a")
[![Total Downloads](https://poser.pugx.org/laravel/framework/d/total.svg)](https://packagist.org/packages/laravel/framework)
[![Latest Stable Version](https://poser.pugx.org/laravel/framework/v/stable.svg)](https://packagist.org/packages/laravel/framework)
[![Latest Unstable Version](https://poser.pugx.org/laravel/framework/v/unstable.svg)](https://packagist.org/packages/laravel/framework)
[![License](https://poser.pugx.org/laravel/framework/license.svg)](https://packagist.org/packages/laravel/framework)

-----

水平線
* * *  
***  
*****  
- - -  
———————————————————

-----

テーブル

| Left align | Right align | Center align |
|:-----------|------------:|:------------:|
| left       |       right |    center    |
| aligned    |     aligned |    aligned   |
| column     |      column |    column    |
fishでも{1..9}を展開したい！

# tl;dr

fishシェルで[擬似的に`echo {1..9}`のような範囲展開を実現するプラグイン](https://github.com/ryotako/fish-expand-range)を作成しました．

# 動機

fishシェル便利ですよね！ 素の設定でかなり快適に使うことができます．
しかし，他のシェルと比べて不便だなと思う点もあります．

![スクリーンショット 2017-03-25 15.39.36.png](https://qiita-image-store.s3.amazonaws.com/0/124405/b9cdcb39-36dc-d2ff-b555-963db9d97f8e.png "スクリーンショット 2017-03-25 15.39.36.png")

どうやら，`fish`のブレース展開は`{1..9}`や`{a..c}`のような範囲展開ができないようです．

`fish`で範囲展開に相当することを行うにはコマンド置換を使います．

```fish
# {1..9}相当
touch test(seq 9).txt

# {1..9..2}相当
echo (seq 1 2 9).txt

# {a..c}相当
echo (jot -c 3 a c)
```

このように一応可能ではある...ものの，タイプ量も増えるし，これまで通り`{1..9}`の書式で範囲展開できないかな...と考えていました．

## 解決

`fish`の`commandline`コマンドについて調べていた際にアイデアを思いついたので実装してみました．擬似的にですが`fish`で範囲展開が可能になります．

![fish_expand_range.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/124405/a5f1b986-2391-49fb-42df-558282ac0938.gif "fish_expand_range.mov.gif")

`fish`が`{1..9}`といった書式を受け付けてくれない以上，**入力したコマンドが実行される前に，その内容を書き換えるしかない**という発想です．

実装を要約すると以下の通りです．コマンドの実行を行う**改行キー(`\n`, `\r`)にキーバインド**して，コマンドラインの内容を書き換えます[^key].

[^key]: キーバインドで一つの関数を呼び出すのではなく，`;`で分割して複数コマンド呼び出しているのは，関数が削除された場合のための保険です．他のキーならともかく，改行を失うことになると大変なので．

``` fish:key_bindings.fish
bind \n 'type -q __expand_range; and __expand_range; commandline -f execute'
bind \r 'type -q __expand_range; and __expand_range; commandline -f execute'
```

``` fish:__expand_range.fish
function __expand_range
    set -l buf
    for line in (commandline) # コマンドラインが複数行だった場合のためのループ
        set buf $buf (expand_range $line) # これが処理の本体
    end
    commandline (string join \n $buf) # 複数行をつなげてコマンドラインに書き出す．
end
```


ちなみに範囲展開そのもの(`expand_range`関数)の実装についてですが，`bash`を呼んで展開してもらっています．

**`bash`を呼んで展開してもらっています．**

つまり実体は`bash -c 'echo {1..9}'`です．`bash`便利．

## まとめ
`fish`シェルは`bash`や`zsh`のような多機能性と引き換えにシンプルな姿を得たシェルですが，`bash`の機能をつまみ食いすることで，もっと便利に使えるようになりました．

## 余談
改行にキーバインドするという荒っぽい方法ですが，いろいろ可能性はありそうです．
というのも，上記`__expand_range.fish`関数内で呼び出している`expand_range`関数を**任意の文字列操作コマンド**に変えることにより，対話モードに限って好きな構文を擬似的に追加できるからです．

すぐ思いつくところでは，以下のようなもがあります．

- コマンドラインに`G`を見つけたら`| grep`に置換 (zshの`global alias`相当)
- 最初の語が実行可能でないファイルのとき，拡張子を見て適当なコマンドを前置 (zshの`suffix alias`相当)
- `!!`を`eval $history[1]`に置換 (ヒストリ置換相当)
- コマンドラインが特定の条件を満たすとき，空白を前置してヒストリに残さない (`bash`の`HISTIGNORE`相当)
- コマンドライン中の重複した空白を一つにしてから実行 (`zsh`の`hist_reduce_blanks`相当)
- `$((...))`を`(math ...)`に置換
- `&&`を`; and `に，`||`を`; or `に置換

もちろん，上記全部を実装するくらいなら初めから`zsh`を使え，という話になるのですが，「fishには概ね満足だが，他のシェルにあるあの機能がないのが我慢できない」という場合は，必要な機能だけつまみ食いして追加できる可能性が，あるのではないでしょうか...

## 追記(2017/4/1)
**改行へのキーバインドによってグローバルエイリアスを実現する**，を既にやっている方がおられました！
[zshからfishに乗り換えてみた](http://qiita.com/masa0x80/items/346b4b9c0ff08205995e)
Crawler


![](https://www.shareicon.net/data/128x128/2015/10/06/112727_development_512x512.png)

## Web データの収集
* Webページのダウンロード
* HTML解析

## ログインの必要なWebサイトをクロールする
* PhantomJSとCasperJS
* Electron

## データの整形と保存
* 文字コードと変換
* 正規表現
* DB
* レポートの自動生成

## 形態素解析で日本語を扱う
* 形態素解析について

## crawlerのためのデータソース
* Twitter
* Facebook
* はてなブックマーク
* Amazon
* Flicker
* Youtube
* Yahoo!Finance
* Wikipedia

## データの分類と予測と機械学
* データの活用法

## データの視覚化
* Google Charts
* D3.js自由度の高いチャート
* D3.js地図
* D3.jsから派生したライブラリ
Railsコードリーディング環境を整える

![](http://findicons.com/files/icons/1607/ruby_on_rails/128/ror_logo.png)

* `rails new CodeReading`  
Ruby on Railsをclone  
	|+CodeReading/  
	|+rails/

```
# Gemfile
source 'https://rubygems.org'

gem 'rails', path: '../rails'
gem 'pg'
gem 'pry-rails'
gem 'pry-doc'
gem 'pry-byebug'
gem 'byebug'
```
* `bundle install`
* `rails g model User name:string`

```
class User < ActiveRecord::Base

binding.pry
  validates :name, length: { maximum: 30 }
end
```
*  `rails c`でテキトーなuserを作成
Meta-8,9,10,11,12章-rails


![](https://ruby.tw/logo.gif)

## Active Record
* Application のオブジェクトをDBにマッピングする
* b
 
## Action Pack
* ウェブフレームワークのウェブの部分を扱う
* b

## Active Support
* 時刻計算やロギングなどの汎用的な問題を扱うユーティリティ
* b

## ソースコードを見る
* gemのunpackコマンドでカレントディレクトリにコピーされる
* `gem unpack activerecord -v=4.1.0`
* b

## 
* 多くのモジュールをインクルードすることによってActiveRecord::Baseは巨大なクラスになっている
* b
 
## 疎結合
* a
* b

## テスト容易性
* a
* b

## モジュールの再利用性
* a
* b

## 
* a
* b

## 
* a
* b

## 
* a
* b

## 
* a
* b

## 
* a
* b

## 
* a
* b

## 
* a
* b

## 
* a
* b
Meta-7章


![](https://ruby.tw/logo.gif)

## 
* a
* b
 
## 
* a
* b
* 
## 
* a
* b

## 
* a
* b

## 
* a
* b

## 
* a
* b

## 
* a
* b

## 
* a
* b

## 
* a
* b

## 
* a
* b

## 
* a
* b

## 
* a
* b