OmniAICreator/Qiita-1.07M huggingface dataset:
[Linux][tips] 一定時間アクセスのないハードディスクをスリープさせるには

Linuxマシンで一定時間アクセスが無い時にハードディスクをスリープさせて必要な時だけ動作させる方法を紹介します

# 手順

hdparmコマンドに"-S"オプションと時間、ハードディスクのデバイスを指定します
※ root権限が必要ですので、必要に応じて `sudo` コマンドを付けて実行してください

```shell-session
# hdparm -S %時間% %ハードディスク%
```

## 時間について
* 0～251 の数字を指定します
    * 0 はスリープを無効にします
    * 1～240 を設定すると、 `指定した数字 × 5秒` がスリープまでの時間になります
    * 241～251 を設定すると、 `(指定した数字 - 240) × 30分` がスリープまでの時間になります

### 時間の指定例

| パラメータ | 計算 | スリープまでの時間 |
|-----+-----+-----|
| 1 | 1 × 5秒 | 5秒 |
| 240 | 240 × 5秒 | 1200秒 = 20分 |
| 241 | (241 - 240) × 30分 | 30分 |
| 242 | (242 - 240) × 30分 | 1時間 |
| 251 | (251 - 240) × 30分 | 11 × 30分 = 5時間30分 |

## ハードディスクの指定について

`/dev/sda` など、ハードディスクを示すデバイスファイルのパスを指定します。複数のディスクを装着したマシンでは、認識のタイミングなどで `sda, sdb, sdc...` の割り振りが変わってしまうことがあるので、ディスク毎に固有なIDを使うと良いかもしれません

`/dev/disk/by-id` を見ると、システムで認識されているハードディスクの型番やシリアルNo.が含まれたIDが確認できます

```shell-session:例)/dev/disk/by-idの中身
# ls -l /dev/disk/by-id
合計 0
lrwxrwxrwx 1 root root  9  2月 16 11:50 ata-CT500MX500SSD1_xxxxxxxxxxxx -> ../../sda
lrwxrwxrwx 1 root root 10  2月 16 11:50 ata-CT500MX500SSD1_xxxxxxxxxxxx-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10  2月 16 11:50 ata-CT500MX500SSD1_xxxxxxxxxxxx-part2 -> ../../sda2
lrwxrwxrwx 1 root root  9  4月 29 13:17 ata-ST2000DL003-9VT166_xxxxxxxx -> ../../sdd
lrwxrwxrwx 1 root root 10  4月 29 13:17 ata-ST2000DL003-9VT166_xxxxxxxx-part1 -> ../../sdd1

     :
```
※シリアルNo.部は変更しています

## hdparm を実行する

`/dev/sda` のハードディスクを最終アクセスから1時間後にスリープするようにします

```shell-session
# hdparm -S 242 /dev/sda

/dev/sda:
 setting standby to 242 (1 hours)
```

ディスクIDでスリープ時間を指定する場合は、 `-part` が付いていないIDを指定してください

```shell-session
# hdparm -S 242 /dev/disk/by-id/ata-ST2000DL003-9VT166_xxxxxxxx

/dev/disk/by-id/ata-ST2000DL003-9VT166_xxxxxxxx:
 setting standby to 242 (1 hours)
```

設定したスリープ時間を解除するには時間を"0"にします

```shell-session
# hdparm -S 0 /dev/sda

/dev/sda:
 setting standby to 0 (off)
```

# 確認方法

ハードディスクがスリープしているか確認するには、hdparmコマンドで"-C"オプションを指定します

```shell-session
# hdparm -C %ハードディスク%
```

## 実行例

```shell-session:動作中
# hdparm -C /dev/sda

/dev/sda:
 drive state is:  active/idle
```

```shell-session:スリープ中
# hdparm -C /dev/sdb

/dev/sdb:
 drive state is:  standby
```

稼働時には"active/idle"、スリープ中には"standby"または"sleeping"(より低電力な時)と表示されます

ハードディスクによっては、状態の確認をすることもアクセスしたことと同じ扱いになり、スリープまでの時間が伸びてしまったり、スリープ中の状態確認からactive状態になることがあります

# 注意点

hdparmの設定はハードディスクを取り外したり、電源OFFにすると設定前の状態に戻りますので、起動時や接続時に再度設定しなおす必要があります

スリープをすることで、ハードディスクの節電や温度上昇を防ぐ効果もありますが、頻繁にスリープ/復帰を繰り返すと逆にそれが負担となり、寿命を縮めてしまう可能性もあるので、スリープの時間はアクセス状況を見て決めるのが良いでしょう

ハードディスクや、外付けケース、マザーボードなどの環境によってはこの設定が効かない物もあるようです。アクセスが全くないはずなのにスリープ状態にならない場合は、環境を変えてみてください

USBハードディスクケースの節電機能で、この設定に限らずケース内のコントローラーでスリープさせてしまう場合がありますが、この場合はhdparmの設定は反映されません
容量確保の問題:Symantec Endpoint Protectionのファイル削除

初投稿です
この記事はSymantec Endpoint Protection for macがインストールされているMac OS X 10.10.5を使用しています。

どうやっても容量が逼迫するMacbook airユーザーでしたがOmniDiskSweeper(<url/>https://www.omnigroup.com/more</url>)を使って中身を覗いたところ
~/Library/Application Support/Symantec/AntiVirus/に生成されているファイルが40GBを超えていることを発見。
調べてもWebで情報が得られずしかしこれがあるとまともにPCが動かないレベルだったので削除しました。
結果50GB以上の容量が確保でき今のところは問題もなく動いているようです。もし私と同じような状況でこれ以外の方法を知っている方がいらしたらぜひお願いします。現状ログインするたびに日付のファイルが増えるばかりで困っています。
参考リンク:Macの容量が突然一杯に！なぜ？→原因はAdobe Creative CloudのPDApp.logというログファイルでした http://ushigyu.net/2015/07/19/mac-storage-full-because-of-adobe-creative-cloud-pdapp-log/ 
Macの容量を空けたい人へ。フォルダやファイルのサイズが一目でわかるアプリ「OmniDiskSweeper」 http://ushigyu.net/2012/07/09/omnidisksweeper/
@ushigyuさんから
Linuxでx86アセンブラ（Cとの連携編）

# この記事について
アセンブラでプログラムする場合、主に2通りの方法があります．アセンブラでプログラム全体を作る方法と、一部の関数だけをアセンブラで書く方法です．前者はアセンブラの可読性の低さを考えると現実的ではないです．というわけで後者が主流になります．一部の関数をアセンブラ、それ以外はCで書くという方法で、保守性と実効速度の高さを両立できます．

# 必要な道具
この記事ではLinux環境を想定しています．アセンブラは環境に強く依存するので、Linux以外では動きません．Linux環境で以下のソフトを用意してください．
* gcc
* nasm

# プログラムの作成
下のCプログラムmain.cと、アセンブラプログラムadd.asmをエディタで書いて保存しましょう．

```c:main.c
#include <cstdio>
extern int asm_add(int a, int b);

int main()
{
    int a, b;
    a = 1;
    b = 2;
    int ans = asm_add(a, b);
    printf("%d\n", ans);

    return 0;
}
```

```add.asm
section .text
global _sm_add
asm_add:
    enter 0,0
    mov eax, edi
    mov ebx, esi
    add eax, ebx
    leave
    ret
```
main.cをコンパイルしてオブジェクトファイルを生成します．
```gcc -c -o main.o main.c ```
add.asmをコンパイルしてオブジェクトファイルを生成します．
``` nasm -g -f elf64 -o add.o add.asm ```
生成されたオブジェクトファイルをリンクします．
``` gcc -o add -lc -g main.o add.o -o add ``` 
これで、実行ファイルaddが得られました．
実行すると
``` 3 ```
が、画面に表示されます．

# Cプログラム側解説
Cのソースを、解説していきます．とても、簡単なコードです．まずはじめにexternで関数``` int add(int a, int b) ```が宣言されています．
アセンブリファイルでは、Cで通常行うようにヘッダファイルでオブジェクト間のつながりを処理することができません．そこで、extern付きで宣言し外部リンクを指定します．
他の部分は普通のCプログラムと変わりません．
同様にC++でも、アセンブラで作られた関数を呼び出すことができます．

# アセンブラ側解説
短いコードなので一行ずつ解説しています．
``` section .text ```コードの始まりを意味します．.text以外に、.data(初期化されたデータの宣言)、.bss(初期化されていないデータの宣言)のセクションがありますが、このコードでは省略しています．

``` global _asm_add ``` マーカ_asm_addをグローバル指定にし、他のコードからも参照できるようにしています．

``` asm_add: ```は、マーカです．これより下が関数``` asm_add ```の本体です．

``` enter 0,0 ```はスタックフレームの構築を行う命令です．スタックフレームは、メモリ上に展開されるデータの保管先です．関数内で使用される変数や、関数が終わったあとに戻る命令のアドレスを保管しています．

``` 
mov eax, edi
mov ebx, esi
```
は、引数、a,bを汎用レジスタに移しています．Linux環境では、関数の引数はレジスタに保管されて渡されます．これは、メモリへアクセスする頻度を減らし処理を高速化するためです．関数のどの引数のデータがどのレジスタに保管されるかは一対一で決まっています．以下に対応表を示します．

| レジスタ | 引数 |
|:-------:|:------:|
| edi | 第一引数 |
| esi | 第二引数 |
| edx | 第三引数 |
| ecx | 第四引数 |
| r8d | 第五引数 |
| r9d | 第六引数 |

第七引数からはスタックを経由してやり取りされます．しかし、実行速度や、可読性を考慮すると、第七引数以上は必要ないでしょう．

```
add eax, ebx
```
ebxの内容と、eaxの内容を足しています．Linux環境ではeaxの値を関数の返り値として用います．
``` leave
ret ```
```leave```は、スタックの開放を行います．```enter```と対になる命令です．``` ret ```で、call命令でスタックにプッシュされた関数呼び出し元のアドレスに戻ります．

# 終わりに
これで、cからアセンブリを呼び出せるようになりました．この方法を取ることでコンパイラが、自動で行うには難しい最適化を手動で行えるようになります．
**Happy Hacking!!**

# 参考文献
* "System V Application Binary Interface AMD64 Architecture Processor Supplement"   
    http://x86-64.org/documentation/abi.pdf
* th0x4c 備忘録:[GDB] Linux X86-64 の呼出規約(calling Convention)を Gdb で確認する
    http://th0x4c.github.io/blog/2013/04/10/gdb-calling-convention/

* Guide to Assembly Language Programming in Linux
  http://www.amazon.co.jp/Guide-Assembly-Language-Programming-Linux/dp/0387258973

↓↓コメントがあれば励みになります↓↓
The requested PHP extension ext-mcrypt * is missing from your system と言われた時の解決方法

composerのinstallでエラーがでました。環境はMacOSX10.10.5です。

```bash:composerのinstallでエラー
php composer.phar install
Loading composer repositories with package information
Installing dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - The requested PHP extension ext-mcrypt * is missing from your system
```

ext-mcryptがないようです。

```
php -v
PHP 5.6.4 (cli) (built: Jan  7 2015 01:04:24) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
```

brewでPHPを入れていたと思うのでbrewで入れます。

```
brew install php56-mcrypt
```

# 再度composer install

```
php composer.phar install
```
今度は成功しました(^o^)
UserInterfaceState.xcuserstateを無視する

# 概要
毎回新プロジェクトを作る度にいちいちコミット対象として出てくるUserInterfaceState.xcuserstateくん。
これが面倒でgitからpullする時やpushする時にいらっとするはめになるのでまず無視する設定をしてます。
すぐ調べれば出るのですが、自分用に改めてメモ。

# UserInterfaceState.xcuserstateとは
Xcode4になってUserInterfaceState.xcuserstateファイルが作成されるようになったらしく
少しでも変更を加えようものなら容赦なく差分を出してくるファイルです。
このファイル一体何をしているんだと軽く調べましたがほとんどが消す方法しかでてこず途中で断念しましたw
何か対象から外した時のデメリットとか知りたかったんですが、ほとんどのユーザーがこれで困って無視しているので問題はないのかなーと思い一旦置いておきます。

# gitignoreの作成
UserInterfaceState.xcuserstateを無視するには、gitignoreファイルを作成します。
場所は、.gitファイルが置かれている場所(レポジトリのルートディレクトリ)と同じ階層に作成してください。

中身はこんな感じ。

```lang:gitignore
.DS_Store
*.swp // これも指定しておくと便利

UserInterfaceState.xcuserstate // ここで指定
```

他にも追跡したくないファイルは最初にまとめておくのが便利。

# すでにプロジェクトを作成してしまっている場合
UserInterfaceState.xcuserstateのキャッシュを消さないといつまでもコミット対象になるので消しましょう。

```file:command
$ git rm --cached  自分のプロジェクト名.xcodeproj/xcuserdata/自分のアカウント名.xcuserdatad/UserInterfaceState.xcuserstate
$ git commit -m "removed cache."
```

これでOKです。かんたんです！
cocoapodを導入しているプロジェクトだとxccode~~以下にあるかもしれませんが、findでファイル自体を探してそこを指定してキャッシュを消してあげれば良いと思います。
Goフレームワークのパフォーマンス比較

GoはGoogleによって開発されている言語で主な特徴として並行処理、静的型づけ、シンプルな記述がある。

２００９年に誕生したみたいだが、他の言語と同じく既に多くのWebフレームワークがあり、どのフレームワークがパフォーマンスが良いのか調べました。

テスト方法としては
・１,0000件のGETリクエストを飛ばしてjsonで応答を返す
・テスト機種、MacBook Pro (Retina, 15-inch, Mid 2015)、2.8 GHz Intel Core i7、16 GB 1600 MHz DDR
・三回繰り返した平均

下記がテストコードである


```performance.go
package main

import (
    "net/http"
    "io/ioutil"
    "time"
    "fmt"
    "flag"
)

func main() {
    start := time.Now()
    var port string
    flag.StringVar(&port, "port", "3000", "文字列を入力します。")
    flag.Parse()

    url := fmt.Sprintf("http://localhost:%s/", port)
    for i := 0; i < 10000; i++ {
        resp, _ := http.Get(url)
        defer resp.Body.Close()
        byteArray, _ := ioutil.ReadAll(resp.Body)
        fmt.Println(string(byteArray))
    }
    end := time.Now().Sub(start)
    fmt.Printf("%s秒", end)
}
```

###テストするフレームワーク
・Revel :0.12.0
・beego :1.5.0
・Gin :
・martini
・goji


##結果


| フレームワーク | 結果 |
|:-----------|------------:|
| Gin       |       2.51|
| goji      |       2.77|
| beego     |       2.88|
| martini   |       3.37|
| Revel     |       4.47|



ginが早いですね、フルスタックなフレームワークでbeegoも早かったのが意外です。

ちなみに早いものだと４分から５分で１００万件のリクエストをさばけることになるのですが驚異的ですね、ORMマッパーを入れて検証していないのではっきりした数値はわかりませんが。大幅にインフラコストが削減できそうな気がします。


ソースコードは以下を参照ください
https://github.com/t-fukui/performance_test
Vagrantの公開鍵、秘密鍵を用いたssh接続の設定


## 環境

- ホストPC: Mac
- CentOS ver : 6.5
- 仮想環境: VirtualBox


## 仮想環境設定

### CentOS 仮想マシンを構築する

#### 作業ディレクトリを作成する

```bash
cd
mkdir Workspace
cd Workspace
```
- boxファイルのURLを入手する
	- http://www.vagrantbox.es/ へアクセスする – search: centos 6.5で検索
	- CentOS 6.5 x86_64のURLをコピーする

- vagrantコマンドでboxを追加する

```bash
vagrant box add centos65 "コピーしたURL" (ダウンロードが始まるので時間かかります)
```

- Vagrantfileを生成する 

```bash
vagrant init centos65
```

### CentOS 仮想マシンを構築する
 
- Vagrantfileをカスタマイズする

```bash
sudo vi Vagrantfile
```

お好みで

- CentO仮想マシンを作成する

```bash
vagrant up
```

- CentOS仮想マシンに接続する

```bash
vagrant ssh
```

## 秘密鍵、公開鍵設定
### 公開鍵の転送
```bash
vagrant ssh-config    # port番号を確認(Mac環境で行う)
scp -P port番号 -i ~/.ssh/秘密鍵ファイル ~/.ssh/公開鍵ファイル 仮想マシン:仮想マシンのディレクトリ/転送先でのファイル名
```

### 転送した鍵とMac環境が同じか確認

- Mac環境

```bash 
ssh-keygen -vlf ~/.ssh/公開鍵ファイル 
```

- 仮想環境

```bash 
vagrant ssh 
ssh-keygen -vlf ~/.ssh/公開鍵ファイル 
```
上記を比較して確認する

### Vagrantfileに秘密鍵のパスを設定する

```Vagrantfile
config.ssh.private_key_path = "~/.ssh/秘密鍵ファイル"
```

```bash
vagrant reload
```

### 公開鍵と秘密鍵でssh接続できる事を確認
Macから仮想環境にアクセスをできるか確認をする

```bash 
vagrant ssh
```

### password認証をできなくしたい場合

- パスワードが設定されていないアカウントを拒否する


/etc/ssh/sshd_configを指定

```/etc/ssh/sshd_config
PermitEmptyPasswords no
```

### パスワード認証方式を無効にする

/etc/ssh/sshd_configを指定

```/etc/ssh/sshd_config
PasswordAuthentication no
```

### sshの再起動
```bash
sudo /etc/rc.d/init.d/sshd restart
```

これでパスワード認証ができなくなり、秘密鍵、公開鍵によるログインしかできなくなります


## 補足
### portがほかのアプリで使われているため利用できない場合

```log
The forwarded port to 8080 is already in use
```

Vagrantfileにてポート番号の変更を行う

```Vagrantfile
config.vm.network "forwarded_port", guest: 80, host: 8080 #<-ここを変更
```

### sshログインするときに、localeで警告がでる場合

```log
warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
```

Macにて

```/etc/ssh/ssh_config
# SendEnv LANG LC_*
```

一旦ssh接続する際に設定をおくっているところをコメントアウトすることで対処。
CentOSに日本語パッケージをインストールすることでも対処できるので、
時間がある際にパッケージのインストールをする。
google スプレッドシートで特定の文字が入力された行に色を付ける

# 概要
Google スプレッドシート で簡単にタスク管理をしようとした際、特定の文字、例えば、列に"完了"と入力した時、自動的に背景色を変える方法を説明します。
google apps script を利用せずに **条件付き書式** だけで対応できるので、お手軽です。

# 手順
## 背景色を変えたい列を選択
![1.png](https://qiita-image-store.s3.amazonaws.com/0/18318/f28f45a0-f202-a2ec-66e6-b2e14f80f176.png)

## 選択領域で、右クリックをして、条件付き書式を選択
こんな感じの画面になります
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/18318/6e9351b1-411b-3071-b5c8-7e544685f3d1.png)

## 背景色を変える条件を以下のとおり設定します
- **セルの書式設定の条件** で **カスタム数式** を選択
- **値または数式** に **=$C1="完了"** と入力します。
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/18318/71ee2756-13bd-560d-961d-55ed0f779906.png)


## 完了ボタンを押す
これ以降、C列に**完了**と入力すると、背景色が緑色に自動的に変更されます。
Visualforceのコンポーネントでヘッダとフッターを表示する

Visualforceでサイト共通の部品を使う事ってよくありますよ。
特にヘッダーやフッターはよくある例なのですが、コンポーネント化する方法は実はあまり知られていなかったりするので書いておきます。


# 前提
- API Version: 35
- 環境: 開発者向け環境

# 手順

##1.コンポーネントを作成
まずは以下の様にヘッダーとフッターコンポーネントを作成します。

```html:test_component_header.vfc
<apex:component >
    <h1>ヘッダーを表示します</h1>
</apex:component>
```

```html:test_component_footer.vfc
<apex:component >
    <hr/>
    <center><div>
      	@wolfeatsapple all rights reserved.
        </div></center>
</apex:component>
```

##2.コンポーネントを読み込む
それらを各コンテンツページで`<c>`タグで読み込むだけです。

```html:test_component_home.vfp
<apex:page showHeader="false" sidebar="false" standardStylesheets="false">
    <!-- <c>タグでコンポーネントを呼び出します -->
    <c:test_component_header />
    
    <!-- ここからメインコンテンツ -->
    <div>
        <p>ホームです。</p>
    </div>
    <!-- ここまでメインコンテンツ -->
    
    <!-- ヘッダー同様にフッターもコンポーネントで呼び出します -->
    <c:test_component_footer />
</apex:page>
```
Riot.js動かしてみた

## 参考

* [Qiitaのriot.jsタグ](http://qiita.com/search?utf8=%E2%9C%93&q=tag%3Ariot.js&sort=rel)
* [公式HP日本語ドキュメント](http://riotjs.com/ja/)

## 動かしてみる

ファイル構成

* index.html
* todo.tag

```html:index.html
<!doctype html>
<html>
<body>

<todo></todo>
<script src="todo.tag" type="riot/tag"></script>
<script src="https://cdn.jsdelivr.net/g/riot@2.3(riot.min.js+compiler.min.js)"></script>
<script>riot.mount('todo')</script>

</body>
</html>
```

```html:todo.tag
<todo>
  <h3>hello</h3>
</todo>
```

## 解説

> riot.mount('todo')

* todoタグに todo.tag ファイルの中身を割り当て

## 注意点

* 必ずカスタムタグよりインデントが深くないと解釈されません。

```html:ダメな例(カスタムタグと同じインデント)
<todo>
<h3>hello</h3>
</todo>
```

```html:良い例(カスタムタグより1文字以上深いインデント)
<todo>
 <h3>hello</h3>
</todo>
```

## IE8対応

```diff:index.html
 <!doctype html>
 <html>
   <head>
     <title>Riot todo</title>
     <link rel="stylesheet" href="todo.css">
+    <!--[if lt IE 9]>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.0.5/es5-shim.min.js"></script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.2/html5shiv.min.js"></script>
+    <script>html5.addElements('todo')</script>
+    <![endif]-->
   </head>
   <body>
 
     <todo></todo>
 
     <script src="todo.tag" type="riot/tag"></script>
     <script src="https://cdn.jsdelivr.net/g/riot@2.3(riot.min.js+compiler.min.js)"></script>
     <script>
       riot.mount('todo')
     </script>
 
   </body>
 </html>
```
Vue.jsをクラスから使う時のセットアップ

まずはHTMLの方ですが、書きたくないのでJadeで失礼します。

```jade:index.jade
include ./elements

+html(lang="ja")
  +head
    title Test
  body

    #mario
      p Mario:
        button(@click="jump") Jump
      ul
        li(v-for="item in items" v-text="item.text")

    #luigi
      p Luigi:
        button(@click="jump") Jump
      ol
        li(v-for="item in items" v-text="item.text")
```

`elements` がインクルードされていますが、共通部分を外出ししているだけで、特別なことはしていません。
`+` が付いている箇所でコールしています。`#` はdivが作られていて、`@` はVueの記法で `on` を意味します。

ちなみに、`elements` の内容は↓。

```*:elements.jade
mixin html
  doctype
  html&attributes(attributes)
    block

mixin head
  - var CDN = '//cdnjs.cloudflare.com/ajax/libs/'
  head
    meta(charset="utf-8")
    script(src=CDN + "vue/1.0.1/vue.min.js")
    script(src="main.js" charset="utf-8")
    block
```

続いて本題のJSですが、Coffeeだとこんな感じ。
ES6で書いても似たようなものですね。

```coffeescript:main.coffee
'use strict'

class Mario

  constructor: (@el)->
    @data =
      items: []

    new Vue({el: @el, data: @data, methods: @methods})

  methods:
    jump: (e)->
      obj =
        text: 'Jumped'
      @items.push(obj)
      return

document.addEventListener('DOMContentLoaded', ->
  new Mario('#mario')
  new Mario('#luigi')
  return
, false)
```

`@` はCoffeeだと `this` と読みます。
あとは `methods:` と `@data` を必要に応じて追加していくだけで使えます。

## 結果

![Screen Shot 2015-11-07 at 11.53.44 AM.png](https://qiita-image-store.s3.amazonaws.com/0/38383/841071ca-702c-83d0-0941-8242056e8d8e.png)

現場からは以上です。
git statusで出るUntracked filesを削除する方法

まず、「git status」でUntracked filesを確認

```:zsh
% git status
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	xxx/xxx
	yyy/yyy
```

「git clean」に「nオプション」を付け、削除するUntracked filesを確認

```:zsh
% git clean -n 
Would remove xxx/xxx
Would remove yyy/yyy
```

「git clean」に「fオプション」を付け、Untracked filesを削除

```:zsh
% git clean -f
Removing xxx/xxx
Removing yyy/yyy
```
キーが文字列なのに，「:」を使った記法でハッシュオブジェクトを生成すると


キーがシンボルでないのに，ハッシュロケット「=>」を使わずに，「:」を使って以下のように書いて，

```Ruby
h = {"Tokyo":"03", "Osaka":"06", "Sapporo":"011"}
puts h
```

これを実行すると出力結果は次のようになります．

```
$ {:Tokyo=>"03", :Osaka=>"06", :Sapporo=>"011"}
```

キーを文字列にしたつもりが，シンボルに変換されています．

次に，次のように文字列の部分に「-」を使って，上と同じことをしてみる．

```Ruby
h = {"Tokyo-city":"03", "Osaka":"06", "Sapporo":"011"}
puts h
```

シンボルに「-」（ハイフン）は許されないので，どうなるんだろうと思って，実行してみると以下のようになる．

```
$ {:"Tokyo-city"=>"03", :Osaka=>"06", :Sapporo=>"011"}
```

うーん，なんだかややこしいｗちなみに，

```rb
puts h[:"Tokyo-city"]
```

とするとちゃんと値が取り出せます．
PowerShellの環境変数と自動変数

## 環境変数はプロバイダEnvの中にあるよ
ちょいちょいシェルスクリプトを書いていて、うっかり変数`$HOME`でホームディレクトリを参照してしまうわけですが、ふと気になって環境変数を覗いてみたらそんなのないです。

``` powershell
(*'-') >> Get-ChildItem env: | Where-Object {$_.Name -match "HOME"}

Name                           Value
----                           -----
HOMEDRIVE                      C:
HOMEPATH                       \Users\home


(*'-') >> Get-Content $profile | Select-String "HOME"
(*'-') >>
```

ドライブとパスがそれぞれ別々に違う名前で設定されてますね。当然プロファイルファイルの`$PROFILE`にも書いてありません。おかしいな、ちゃんと`$HOME`が正しく展開されているのに。。。

## 自動的に設定される自動変数
まぁ、環境変数も上記の通り一部自動的に設定されるんですが、PowerShellには自動変数というものがあるのを忘れていました。起動直後に`Get-Variable`で変数リストを覗いてみると…。

``` powershell
(*'-') >> Get-Variable | Where-Object {$_.Name -match "HOME"}

Name                           Value
----                           -----
HOME                           C:\Users\home
PSHOME                         C:\Windows\System32\WindowsPowerShell\v1.0


(*'-') >>
```

ありました！

自動変数、普段無意識に使っているものもありますね。`$PROFILE`とか`$_`とか。

## シェルスクリプトで使いそうな自動変数
個人的に使いそうなものをまとめてみました。

| 変数名 | 値 |
|---|---|
| \$_ | 入力行一行分 |
| \$^ | 入力行の行頭単語 |
| \$\$ | 入力行の行末単語 |
| \$? | 直前のコマンド実行結果のBool値 |
| \$Args | 引数リスト |
| \$False | 偽のBool値 |
| \$Home | ドライブレター込みのホームディレクトリパス |
| \$LastExitCode | 直前のコマンドの戻り値 |
| \$MyInvocation | 実行コマンド自身の情報 |
| \$OFS | awkでお馴染みの出力時フィールドセパレータ |
| \$PsVersionTable | PowerShellのバージョン情報 |
| \$Pwd | ドライブレター込みのカレントディレクトパス |
| \$True | 真のBool値 |

## おまけ
`$MyInvocation`はスクリプト自身のパスが知りたいときに使いますね。

``` powershell
(*'-') >> Get-Location

Path
----
C:\


(*'-') >> Get-Content C:\Users\home\place.ps1
"Script Path: $(Split-Path -Parent $MyInvocation.MyCommand.Path)"
"Current Path: $Pwd"
(*'-') >> C:\Users\home\place.ps1
Script Path: C:\Users\home
Current Path: C:\
(*'-') >>
```

こんな感じ。
C > warning > 警告「xxxに代入した値は使われていない」の対処方法 > (void)xxx; > (void) ival, dval, str, dt, numItem;

```txt:動作確認
C++ Builder XE4
```

[SO](http://ja.stackoverflow.com/questions/18499/%E8%AD%A6%E5%91%8A-xxx%E3%81%AB%E4%BB%A3%E5%85%A5%E3%81%97%E3%81%9F%E5%80%A4%E3%81%AF%E4%BD%BF%E3%82%8F%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84-%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95?noredirect=1#comment17148_18499)で質問した内容を後日の検索のためこちらに記載。

```c
void Test_someFunc() {
    int val;
    val = getVal();
}
```

以下のようなテスト関数を用意した場合、ビルドごとに以下の警告がでる。

> valに代入した値は使われていない

対応としては以下のようにする。

```c
void Test_someFunc() {
    int val;
    val = getVal();
    (void)val ; // 警告「xxxに代入した値は使われていない」の回避
}
```

BLUEPIXYさんに感謝。

関連
https://wiki.openoffice.org/wiki/Writing_warning-free_code#Unused_parameters

<hr>
上記の応用で以下をやってみた。一応これでもいけそうだ。

```cpp
(void) ival, dval, str, dt, numItem;
```
c++ builder > W8065 プロトタイプ宣言のない関数 's_testFunc'の呼び出し > 引数をvoid

```txt:動作確認
C++ Builder XE4
```

以下の警告がでた。
>  W8065 プロトタイプ宣言のない関数 's_testFunc'の呼び出し

以下の条件で警告がでたもよう

- Cソースファイル (.c)
- `static void testFunc()` として定義
  - ソースファイルスコープの関数
- `testFunc()`としてコール

解決策

- `static void testFunc(void)` として定義


引数がない場合と、引数がvoidの場合の違いをもう少し意識しないといけない。

cppソースでは上記の警告が発生しないもよう。
coding79 > UIとロジックを分離する | データバインディング

##内容
UIとロジックを分離する

Coders at Work by Peter Seibel 
p411以降
>実際私はLevel 1 PostScriptインタプリタをグラフィックスなしで、グラフィックスのコードの最初の１行を書く前に書いたのです。マニュアルを開いてオペレータを見てもらえばわかりますが、グラフィックスを参照しているものはありません。グラフィックスの設計に取りかかる前に全て実装したのです。

UIとロジックを分離した良い例。

##分離していない場合の問題点

UIとロジックがスクラムを組んだコードの悪い点

- 派生品を作りにくい. 再利用しにくい
   - 派生品はUIが変わる
   - ロジックだけ使いまわししにくい
   - UIの変更にひっぱられて、同じロジックのコードがコピー生産される
- コードリーディングがしにくい
   - 1つのクラスにUIとロジック両方が入っている場合、片方だけ振舞を追おうとしても読みにくい
   
結果として、UIとロジックが分離されていないクラスやパッケージは追加修正時にトラブルのもとになる。

##実際に分離した結果

実際に分離されていないクラスを分離してみた。

- １つのロジックを使いまわすことができるようになった
- UIだけ変更した派生品を短時間できちんと動作検証して作成できるようになった
- クラスの中身の理解を短時間で行い、クラスの変更ができた
- おかしな実装がいくつも見つかった
  - 中身が読みやすくなったことで、おかしい実装が目立つようになった

## データバインディング
(追記 2017/06/01)

http://www.atmarkit.co.jp/ait/articles/0905/19/news145_5.html
> データ・バインディングを使うべき理由
> ... そもそもこのバインディングを使うと、どんな良いことがあるのだろうか。それはずばりUIとロジックをきれいに分離できるという点である。
How to get MAC table of Network devices by SNMP(ネットワーク機器のMAC TableをSNMPで取得する）

# Overview
　ネットワーク機器の稼働状況を調べる上で、MAC Tableの学習状況が確認できないかと思って調べたのがこのエントリ。
SNMPの標準MIBには含まれていないがベンダ毎に拡張MIBを作っていて取得できるようになっているようなのでまとめておく。

## Cisco
　最初に見つけたのがCisco。
やはりそういう需要はあるようだ。

http://www.cisco.com/cisco/web/support/JP/100/1007/1007010_mac_ip_snmp-j.html


## Juniper

## Arista
　Aristaの場合、　SNMP v3を使って取得するようだ。
取得方法は[下記](https://eos.arista.com/forum/how-to-get-mac-and-arp-table-through-snmp/)に記載されていた。
　SNMP v3で取得するので、事前にSNMP v3の設定が必要

# memo
とりあえず書き留めておく
【Unity】【ADX2LE】スクリプトの書く量を少なくしてみた

#カタログIPゲームジャムより

例えば、「キャラが発生」して「攻撃」するといった場合の
音をつけるコードの量は

![ソースに追加する量.png](https://qiita-image-store.s3.amazonaws.com/0/96808/8c21b9cb-9927-76e3-d28d-cff99372f484.png)

これくらいで済みます。

音のリミットとかはデータ側にあるので、
バージョン管理時とかもスクリプトは一切書き換えずに振る舞いを変えることができます。

（サウンド調整が超楽、サウンド演出のために他の作業を止めずにいける）


#実際にはこれらコード以外に初期化処理や鳴らすためのACBのロードとか必要です。
【ADX2】サイレンの音を3回だけ繰り返す

音を３回だけ繰り返したいとかある

![3回.png](https://qiita-image-store.s3.amazonaws.com/0/96808/a25630c5-650f-214d-a26e-7a9354b5560f.png)

コピーして並べるのが一番簡単

![コピーしてならべる.png](https://qiita-image-store.s3.amazonaws.com/0/96808/12155b4d-24f9-7efc-be91-8d304c10b94f.png)

（他にも方法はありますが）
ターミナルで階層的なフォルダを一発で作成する方法

新規でhoge1/hoge2/hoge3というフォルダを作るとします。

今までフォルダを一つずつ作っていて非常に面倒でした。

```
mkdir hoge1
cd hoge1
mkdir hoge2
cd hoge2
mkdir hoge3
```

pオプションをつけると一度に階層的なフォルダを作成できるようです。

```
mkdir -p hoge1/hoge2/hoge3
```
C > 可変引数マクロでのdefine置き換え > __VA_ARGS__

@mt08 さんのコメント
今後の再利用のため抜粋しておく
http://qiita.com/7of9/items/6a3e69ffbb2ca9abdd48#comment-9e168467a77dd2205ba8

>scanf_sは可変引数なので、可変引数マクロで置き換え、はどうでしょうか？
>`#define scanf_s(fmt, ... )        scanf(fmt, __VA_ARGS__)`

<hr>
可変数個引数マクロの作り方
[tshinoの日記](http://d.hatena.ne.jp/tshino/20061123/1164307813)

> GCCのプリプロセッサの便利な拡張を知ったのでメモ。
>
>関数形式マクロの引数の数は固定、というのはよく知られていると思うけど、現在のC言語（C99）ではサポートされている。

<hr>
その他リンク
http://qiita.com/saltheads/items/e1b0ab54d3d6029c9593
https://msdn.microsoft.com/ja-jp/library/ms177415(v=vs.120).aspx
ideone > サービス使用時の留意点 > whileループの最大回数を指定しておく

自分の失敗から気づいた事項のメモ。

## whileループ使用時の留意点

ideoneなどのプログラムを実行できる外部サービスを利用するとき、while()などの無限ループには最大回数を設定しておくのが望ましい。

理由として、「無限ループになった時に、自分で強制停止できないため」。
無限ループの種類によっては負荷が高いままとなってしまう。

コードの例としては以下のようなものにする。

```c
#include <stdio.h>

int main(void) {
	int errCount = 0;
	int a;
	static const int maxRetry = 3;
	
	printf("数字を入力してください\n");
	scanf("%d", &a);

    while(a < 0 || a > 1000) {
    	printf("整数のみを入力してください。\n");
    	scanf("%d", &a);
    	errCount++;
    	if (errCount >= maxRetry) {
    		exit(1);
    	}
    }
    
	return 0;
}
```

```txt:stdin
a
b
c
1
2
3
```

```txt:結果
Runtime error	time: 0 memory: 2116 signal:-1
数字を入力してください
整数のみを入力してください。
整数のみを入力してください。
整数のみを入力してください。
```

http://ideone.com/4aE25d

上記の例では、最初の１回の入力に加えて３回のリトライ失敗後に処理を終わらせる。

## The Power of Tenでの定義

関連して、The Power of Tenでも定義されている。
こちらはセキュアなコーディングに向けてのルールとして定義されていたと思う。

http://spinroot.com/p10/rule2.html
> Rule Two
Give all loops a fixed upper-bound.
(すべてのループに上限を指定せよ)

他のコーディングルールガイドにもあったように思うが、ぱっと出てこない。

ローカルで強制停止できる環境上でのテストコーディングだったらここまでしなくてもいいと思う。

## サービス提供者の視点
ideone側としてサービス提供者の場合、こういう無限ループに陥るプログラムの扱いはどうするのか興味が湧いた。

以下のような対策がいいだろうか

- 指定時間経過後にプロセスを強制的に停止する
- CPU使用率をチェックして、CPU使用率が高いままのプロセスを強制的に停止する

２つ目については、本当にCPU負荷が高いプログラムも停止してしまうかも。
技術英語 > My methods are sound and time-honored. / stand the test of time

@ Star Trek Voyager > LEARNING CURVE

指導について悩むTuvokがNeelixとの会話の中で言った言葉
> My methods are sound and time-honored.

訳としては「私の教育法には長年の実績がある」とついていた。

<hr>
soundは「健全な」という意味だろう。

http://ejje.weblio.jp/content/sound
> 〈身体・精神が〉健全な，正常な.

<hr>
time-honored は初めて聞いた。

http://ejje.weblio.jp/content/time-honored
> 昔ながらの，由緒(ゆいしよ)ある.

<hr>
関連して思い出したのは

http://ejje.weblio.jp/content/stand+the+test+of+time
> stand the test of time
> 長く使用される；長年にわたって賞賛される

「　"時間に試験"に立つ >> 長く使われる　」というイメージ
Node.jsをつかう → はやい

この記事ではNode.js v5.0.0とruby 2.2.3とを使用しています。
そして、ネタです。つまりは、本投稿は必ずしも個人の見解でもなく、必ずしも私めの雇用主、関係者の立場、戦略、意見を代表するものではありません。

# すごい要約

- [RubyからGoの関数をつかう → はやい - Qiita](http://qiita.com/grj_achm/items/679b3f3af2cf377f0f02)
- [Crystalで書く → はやい - Qiita](http://qiita.com/etmnk/items/2801cd09c6ec4439c8fd)
- [RubyからRustの関数をつかう → はやい](http://qiita.com/rejasupotaro/items/2aa57a67f4a97101950c)
- *NEW* [Node.jsをつかう → はやい](http://qiita.com/item/3a5e8681edf2cdf1b54c)

です。

# Node.js、はやい
Node.jsとRubyの計算速度を比べるため、フィボナッチ数を単純に計算するやつをそれぞれ書きました。

```js:fib.js
function fib(n){
  if(n <= 1) {
    return n;
  }
  return fib(n - 1) + fib(n - 2);
}

console.log(fib(40));
```

```rb:fib.rb
def fib(n)
  return n if n <= 1
  fib(n - 1) + fib(n - 2)
end

puts fib(40)
```
Rubyのコードは[RubyからRustの関数をつかう → はやい](http://qiita.com/rejasupotaro/items/2aa57a67f4a97101950c)から頂きました。


実行結果は以下です。

```:Node.js
$ node -v
v5.0.0
$ time node fib.js
102334155

real	0m1.520s
user	0m1.417s
sys 	0m0.031s

```

```:Ruby
$ ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin15]
$ time ruby fib.rb
102334155

real	0m16.715s
user	0m16.285s
sys 	0m0.400s
```

Node.jsの方がRubyより10倍早い。スクリプト言語でも十分早い。
みんなJavaScript使えばいいのに。（危ない）
【ADX2】この波形ループだったらなぁといった時

この波形がループだったらなぁ、といった時

対象の波形をダブルクリックして

![波形ダブルクリック.png](https://qiita-image-store.s3.amazonaws.com/0/96808/45dfd437-ce91-f174-bde1-2432aabfb0bb.png)

「リループ有効フラグ」をTrueにすれば　速攻で全体ループになります。（波形エディットせずにできるので超便利）

![loop.png](https://qiita-image-store.s3.amazonaws.com/0/96808/eb8a63e0-50b7-14e6-5ab5-1e5c1da7a708.png)

逆にループ波形だけど、ワンショットに戻したい時もここで
リループタイプをワンショットにすることもできます。

![スクリーンショット 2015-11-07 6.36.52.png](https://qiita-image-store.s3.amazonaws.com/0/96808/24388ff1-fdcf-3116-697b-1d6d49cc61f7.png)

ちなみに「バックスペース」キーで元の画面に戻れます。　（Macの場合はFnを押さずにdelete）
【ADX2LE】保存忘れを防ぐ

ADX2LEが突然落ちたりとかで作成中のデータが消えると痛いので、

ビルドダイアログの「プロジェクト保存」のチェックを入れておくと少し安心

![保存わすれ.png](https://qiita-image-store.s3.amazonaws.com/0/96808/3f31a538-cc0f-1ffb-d7fc-ced7415edd1b.png)

（こまめに保存大事）
【Unity】ADX2LEでiOSでレイテンシー改善

ADX2LEで発音タイミングが遅いと感じたら

iOS Config のBuffering Timeを小さくすると良い

![レイテンシー.png](https://qiita-image-store.s3.amazonaws.com/0/96808/74aad4cf-77b8-ab61-8c2f-ea11383e5253.png)
【Unity】ADX2LEでiOSビルド時はAny Platform外す

iOSビルドする時

Plugin 'cri_ware_unity.dll' is used from several location:

![スクリーンショット 2015-11-07 6.02.41.png](https://qiita-image-store.s3.amazonaws.com/0/96808/c4c078f0-bf52-432b-f3c6-e5662dc1df04.png)

ってエラーがでてしまったら
エラーのでてるdllを選択して、Any Platformのチェックを外すと良い

![Any外す.png](https://qiita-image-store.s3.amazonaws.com/0/96808/6286ac34-cd74-3709-80d0-a7cbff7a6bee.png)

あと、adx2leが古い時は最新にする。
磁気センサアレイを用いて磁石の位置を検出したい



#はじめに
磁気センサアレイで位置を検出したい。

検出対象物の中に永久磁石を仕込むことで、その位置を取得するシステムを実験した。

#磁気センサの選定について
磁気センサには複数の種類がある。

[リードスイッチ](http://akizukidenshi.com/catalog/g/gP-03676/)は、強磁性体の銅線が浮いた状態でガラス管の中に封入されている。
外部磁場が印加されることで導線同士が引き合い、導通するしくみだ。
一個40円と値段が手軽なのも魅力。

ホール効果を利用した磁気検出には[ホールIC（アナログ出力）](http://akizukidenshi.com/catalog/g/gI-07014/)や[ホールIC（デジタル出力）US1881](http://akizukidenshi.com/catalog/g/gI-05274/)が有名である。
単価も60円と非常に安い。

磁石の極性によらず、有無を判定したい場合にはリードスイッチがおすすめである。

もしくは国内では手に入りにくいが、ホールICの一種である[OH090U](http://www.digikey.jp/product-detail/ja/OH090U/365-1001-ND/374779)を利用する事を考えても良い。
これはUS1881と違い、外部磁場が印加されなく成ることで出力が元にもどる。
単価は220円とやや高い。
[こちらの記事](http://woodcnc300.blog.fc2.com/blog-entry-286.html)が参考に成る。

#位置検出の諸手法について

画像ベース、磁気ベースの方法を検討してきた。
NFCのような近距離通信を使ったシステムなら、被検出側に複雑なシステムを要求することもなく多くの種類の物体位置を認識可能である。
オブジェクトに対して、オブジェクトを後ろに追加したい

まあたまには、PHPで連想配列じゃなくてオブジェクトをごにょることもあるさ。そんなときオレは、オブジェクトの個数を数えたくなったんだ。

`array_push()`だとか、`$obj[] = $obj`なんかはすべて配列用だ。うーん、数えたいだけなんだけどなァ！

ってときは `new ArrayObject()`して空のArrayObjectを作ろう。
これにより、`->append()`メソッドが使えるようになる。ここにぶち込めば、その名の通り後ろに追加してくれる。

````php
//$objects = 10個ぐらいで、
//$objects->name = 'unko' は3個としよう

$push = new ArrayObject();
foreach( $objects as $object ){
  if( $object->name == 'unko' ){
    $push->append( $object );
  }
}
count($push); // -> 3
````

ふうすっきり
vimでの複数行インデント修正 

例えば、スペース4つ分で複数行インデントしたい場合

```
:set shiftwidth=4
```
 
1. shift + v でVISUALモードで行選択
2. j(下)かk(上)でインデントしたい行を選択
3. shift + > でインデントされる
grunt-shellでGruntでshellを実行する

https://github.com/sindresorhus/grunt-shell

# インストール

```bash:
$ npm install --save-dev grunt-shell
```

# 単純にコマンドを出力する

```javascript:Gruntfile.js
module.exports = function(grunt) {
    grunt.loadNpmTasks('grunt-shell');

	grunt.initConfig({
	    shell: {
	        hello: {
	            command: 'echo hello world!'
	        }
	    }
	});
	
	grunt.registerTask('default', ['shell']);
};
```

実行

```bash:
$ grunt

> Running "shell:makeDir" (shell) task
> hello world!

> Done, without errors.
```

# コールバックを実行する

```javascript:Gruntfile.js
module.exports = function(grunt) {

    grunt.loadNpmTasks('grunt-shell');

	grunt.registerTask('ls', function() {
		var exec = require('child_process').exec;

		var done = this.async();
		// 実行するコマンド
		var command = 'ls';
		var options = {
			timeout: 10000
		};
		var callback = function(err, stdout, stderr) {
			// コールバック処理
			console.log(stdout);
			done();
		};

		exec(command, options, callback);
	});
};
```
[python]for 文の使い方をすべて知らなかった

#for文
for文でよくif文(例外処理等）＋`break`を入れる。
その時、`break`したのか正常終了(すべての要素を回り切る）したのか知りたい。
`break`で終了した時は、そのif文に処理を書ける。
逆に、すべての要素を回った時の処理の書き方は？

##
参考URL：http://docs.python.jp/3.4/reference/compound_stmts.html
>最初のスイート内で break 文が実行されると、 else 節のスイートを実行することなくループを終了します。 continue 文が最初のスイート内で実行されると、スイート内にある残りの文の実行をスキップして、次の要素の処理に移るか、これ以上次の要素が無い場合は else 節の処理に移ります。

ここでのスイートは、for文内での処理のこと（多分）
基礎を学んだ時にちゃんと全部見ないとこういうのを見落とす。
for文が終わった時にelseを使えば、正常終了した時に実行される。
使い方は、if-elseと一緒。


##サンプル
下記のコードは、num_listに文字列が含まれているかいなかを出力するコード（なんの役にも立たない）
テスト用に最初に渡したリストには文字列を含ませています。

```check_num.py
import random

def num_check(num_list):
    print(repr(num_list))
    for i in num_list:
        if type(i) == str:
            print('文字が含まれています')
            break
    else: print('文字を含んでいません。')

if __name__ == '__main__':
    num_check([random.randint(-1, 100) if i != 5 else str(i)  for i in range(10)])
    num_check([random.randint(-1, 100) for _ in range(10)])
```
##出力
```output.
$ python check_num.py 
[78, 3, 2, 82, 52, '5', 20, 41, 66, 98]
文字が含まれています。
[96, 10, 92, 72, 95, 9, 64, 60, 92, 77]
文字を含んでいません。
```

##まとめ
elseを使えば、正常終了した時の処理ができる。
ちなみに、while文でも、最初の条件文でループを抜けた時の処理を同様にelseを使って表せます。
CentOS初期設定

##さくらクラウドを始めてみるのでcentosの初期設定
個人用アカウント追加してrootをsshできなくするまで
###ユーザーの追加
```
# useradd testuser
# passwd testuser
```
###sudoersの編集
```
# visudo
--------------下記の箇所を編集--------------
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
testuser  ALL=(ALL)       ALL
```

###wheelに追加
```
# usermod -G wheel sokuda
```

###suできる人を制限
```
#vi /etc/login.defs

----------------末尾にでも追加------------
SU_WHEEL_ONLY yes

# vi /etc/pam.d/su
----------------以下の設定をコメント外して有効化-----
auth required /lib/security/pam_wheel.so use_uid 
```

ここまでで個人のアカウント設定は完了

###rootでsshできなくする
```
$sudo vi /etc/ssh/sshd_config

---------------以下の場所を変更------------
#PermitRootLogin yes
↓
PermitRootLogin no

$sudo service sshd reload
```
face_counter: 画像に顔が何個含まれているか判定するコマンド

[face_counter](https://github.com/henteko/face_counter)という、指定した画像の中に何個人間の顔が含まれているかを数字で返してくれるコマンドを作成したのでそれのご案内

# 概要
[face_counter](https://github.com/henteko/face_counter)は指定した画像の中に、人間の顔が何個含まれているかを数値で教えてくれるシンプルなコマンドラインツールです
内部でOpenCVを使用して、顔を判定しています
ですので、インストールする際には別途OpenCVのインストールも必須です(これが割と難関)

# 使用方法
[README](https://github.com/henteko/face_counter/blob/master/README.md)にあるように、OpenCVのインストールから行います
OSXの場合はhomebrewを使用して、以下のようにインストールします
ちなみに僕の環境だとOpenCV 2.4.12でした

```shell-session
$ brew tap homebrew/science
$ brew install opencv
```

そして、gem installでface_counter自身をインストールします

```shell-session
$ gem install face_counter
```

これで準備は完了です、あとはface_counterコマンドが実行できるようになっているので実行しましょう

```shell-session
$ face_counter /path/to/image
```

# 内部構成
スーパーシンプルに、OpenCVで顔の判定定義のファイルを用いて顔判定をしている箇所の個数を標準出力で表示しているだけです

```ruby
image = OpenCV::IplImage::load input_filename
haar_xml_file = File.join(File.dirname(__FILE__), 'haarcascade_frontalface_alt.xml')
detector = OpenCV::CvHaarClassifierCascade::load haar_xml_file

p detector.detect_objects(image).count
```

ちなみに、homebrewでインストールしたOpenCV(2.4.12)で入る/usr/local/share/OpenCV/haarcascades/以下の定義ファイルは古いらしくて、これを持ってきて実行するとエラーになった

```shell-session
error: (-2) The node does not represent a user object (unknown type?) in function cvRead (OpenCV::CvStsError)
```

なので[この記事](http://qiita.com/araya/items/b599318236cd6feee7c0)を参考に、最新版のxmlをインターネットから取得してきて実行するとうまくいきました

# おわりに
このface_counterを使うことで、僕の日課である自撮りがより精度が高くなると思っています
具体的には、自動で撮られた自撮りに対してこのface_counterを実行することで、確実に顔が写っているかどうかの判定ができるので、何も写っていない真っ暗な自撮り(?)をGoogle Photoなどにアップロードしなくて済むようになり、便利になります

# 参考リンク
http://qiita.com/araya/items/b599318236cd6feee7c0
http://shokai.org/blog/archives/8627
int型の1と0をループ中で交互に用意するにはどうするか

#結論
```cpp:C++14
int arr[10];
int work = 1;
for(auto& i : arr) i = (work ^= 1);
```

```java:Java
int arr[10];
int work = 1;
for(int i = 0; i < arr.length; i++) arr[i] = (work ^= 1);
```

多分これが一番早いと思います。
[0と1の相互変換](http://qiita.com/yohhoy/items/f7fe3d1f0f0d2918afa5)

一応こんなこともできるけど。

```java
int arr[10];
int work = 1;
int t[] = { 0, 1 };
for(int i = 0; i < arr.length; i++) arr[i] = (work = t[work]);
```

# プロローグ
普段C++を書いている人にとって、Javaとは実に謎な言語にうつる。

今回見ていくのはboolean型の特徴だ。

>[型変換の基本ルール - 型変換 - Java入門](http://www.javadrive.jp/start/cast/index1.html)
>基本データ型の中でもboolean型は特別でboolean型から他のデータ型に変換はできず、また逆にboolean型に変換することもできません。 

ふむふむ。つまり

```cpp:C++
int hoge = 1;
int re = hoge ? 0 : 1;//JavaだとhogeはBooleanではないので違法
```

こんなことはJavaではできないってことね。

# 本題

たとえばループ中で1と0を交互にほしいということはままある。

```cpp:C++パターン1
int arr[10];
int work = 1;
for(auto& i : arr) i = (work = !work);
```

```cpp:C++パターン2
int arr[10];
bool work = false;
for(auto& i : arr) i = std::excange(work, !work);//C++14から
```


ただ上記のようなコードはJavaでは使えない。

```java:Java失敗例
int arr[] = new int[10];
boolean work = true;
for(int i = 0; i < arr.length; i++) arr[i] = (work = !work);//Error. Booleanからintに変換できない
```

じゃあどうするか？

```java:Javaパターン1
int arr[] = new int[10];
int work = 1;
for(int i = 0; i < arr.length; i++) arr[i] = (work = work + 1 & 1);
```

```java:Javaパターン2
int arr[] = new int[10];
boolean work = true;
for(int i = 0; i < arr.length; i++) arr[i] = BooleanUtils.toInteger(work = !work);//冗長！
```

でけた。うーん、汚い。

#追記

```cpp:C++パターン2
int arr[10];
bool work = true;
for(auto& i : arr) i = ++work;//C++14までdeprecatedC++17で廃止
```

なんかこれはうまくいかない。trueに対するoperator++の挙動がfalseにするのではなくtrueになる模様。~~なんでや。~~元記事(コメント参照)のミスの模様。



#感想

- ``auto``ください
- bool → int に変換できないのは納得いかない
- 範囲for文に参照使わせてください
- Javaパターン2は実は未検証だ
- なんでJavaってきれいに書けないの？
- ホントにJava初心者なので温かい目で見てください
- Javaますます嫌いになった
macOS Mojave に LaTeX 環境を作る

## 環境

- macOS Mojave
- Homebrew

## インストール

BasicTeX と Ghostscript をインストール。

```bash
brew cask install basictex
brew install ghostscript
```

アップデートをかけておきます．

```bash
sudo tlmgr update --self --all
```

デフォルトで A4 用紙を使う設定を行う。

```bash
sudo tlmgr paper a4
```

LaTeXiT をインストールしておくとプレゼン作成の際に便利だが、最近の Keynote は MathType を使えば LaTeX 形式で数式を記述することができる。

```bash
brew cask install latexit
```

## TeX のパッケージ管理

`tlmgr` というコマンドでパッケージ管理を行います．

主な使い方は，以下のとおり．

```bash
# パッケージの検索
tlmgr search ほげほげ

# パッケージやコレクションの情報を表示
tlmgr info パッケージ名など

# パッケージのインストール
tlmgr install パッケージ名

# パッケージのアンインストール
tlmgr remove パッケージ名

# TeX のアンインストール
tlmgr uninstall
```


## 日本語環境

日本語を使うためのパッケージ群をインストールします．

```bash
sudo tlmgr install collection-langjapanese
```

これで，日本語対応の LaTeX である pLaTeX，Unicode に対応した pLaTeX である upLaTeX が使えるようになります．


## 和文フォント
### ヒラギノ

Mac の場合は，ヒラギノフォントを埋め込むように設定するといいでしょう．

```bash
sudo tlmgr repository add http://contrib.texlive.info/current tlcontrib
sudo tlmgr pinning add tlcontrib '*'
sudo tlmgr install japanese-otf-nonfree japanese-otf-uptex-nonfree ptex-fontmaps-macos cjk-gs-integrate-macos
sudo cjk-gs-integrate --link-texmf --cleanup
sudo cjk-gs-integrate-macos --link-texmf
sudo mktexlsr
sudo kanji-config-updmap-sys --jis2004 hiragino-highsierra-pron
```

確認します．

```console
% kanji-config-updmap-sys status
CURRENT family for ja: hiragino-highsierra-pron
Standby family : hiragino-highsierra
Standby family : ipa
Standby family : ipaex
Standby family : ms
Standby family : toppanbunkyu-highsierra
Standby family : yu-win10
```

## その他
### jlisting

日本語環境でソースコードの埋め込みを行うには jlisting というパッケージを利用します。
[ここ](http://osdn.jp/projects/mytexpert/downloads/26068/jlisting.sty.bz2/) から `jlisting.sty` をダウンロード．

```zsh
sudo mv jlisting.sty /usr/local/texlive/2019basic/texmf-dist/tex/latex/listings/
sudo chmod +r /usr/local/texlive/2019basic/texmf-dist/tex/latex/listings/jlisting.sty
sudo mktexlsr
```

### 欧文フォント

欧文フォントでよく使われるのは，Latin Modern，New TX あたりでしょうか．デフォルトの Computer Modern は古いフォントでさまざまな問題があるので，その改良版である Latin Modern の利用を推奨します．

#### Latin Modern

デフォルトでインストールされています．
プリアンブルには次のように書くようにします．

```latex
\usepackage[T1]{fontenc}
\usepackage{lmodern}
```

#### New TX

パッケージをインストールします．

```bash
sudo tlmgr install newtx txfonts helvetic fontaxes boondox
sudo tlmgr install kastrup tex-gyre
```

プリアンブルには次のように書くようにします．

```latex
\usepackage[T1]{fontenc}
\usepackage{newtxtext,newtxmath}
```

# 参考
- https://oku.edu.mie-u.ac.jp/~okumura/texwiki/?TeX%20Live%2FMac
- http://mktozk.hateblo.jp/entry/configure-tex-on-mac
- http://doratex.hatenablog.jp/entry/20180501/1525144736
PowerShellのスクリプトを、実行権限がRestrictedのまま実行するためのバッチファイル

##バッチファイル

同期実行する場合

```bat:CallPosh.bat
@ECHO OFF
FOR %%a IN (%*) DO type %%a | powershell -command "Invoke-Expression($input)"
```


非同期実行する場合

```bat:CallPoshAsync.bat
@ECHO OFF
FOR %%a IN (%*) DO type %%a | start /b powershell -command "Invoke-Expression($input)"
```


##使い方（例）

例として、sample1.ps1、sample2.ps1の2ファイルを実行してみる。

```ps1:sample1.ps1
echo "こんにちは。";
start-sleep 5;
echo "こんにちは。";
start-sleep 5;
echo "こんにちは。";
```

```ps1:sample2.ps1
echo "☆☆☆☆☆☆";
start-sleep 5;
echo "☆☆☆☆☆☆";
start-sleep 5;
echo "☆☆☆☆☆☆";
```

まず、同期実行してみた。

```bat:
CallPosh.bat sample1.ps1 sample2.ps1
```

```txt:結果
こんにちは。
こんにちは。
こんにちは。
☆☆☆☆☆☆
☆☆☆☆☆☆
☆☆☆☆☆☆
```

次に、非同期実行してみた。

```bat:
CallPoshAsync.bat sample1.ps1 sample2.ps1
```

```txt:結果
こんにちは。
☆☆☆☆☆☆
こんにちは。
☆☆☆☆☆☆
こんにちは。
☆☆☆☆☆☆
```

##まとめ

バッチファイルはダブルクリックやファイルのドラッグ＆ドロップで起動できるので、
PowerShellと組み合わせて活用していきたい。
Gyazoの画像を全部ダウンロードしてくるマン

僕は日頃[Gyazoに自撮りをアップロードする](http://qiita.com/bilyakudan/items/1f48782300ac139abbe3)習慣があったのだが、これをGoogle Photoに移行するためにGyazoにアップロードしている自撮り画像を全部取ってくる必要があった
なので頑張ってGyazoの画像を全部一旦localにダウンロードしてくるようなスクリプトを書いた

# ソースコード
[これ](https://github.com/henteko/gyazo_downloader)

基本的には[Gyazo API](https://gyazo.com/api/docs)を叩いて画像をダウンロード、touchコマンドで作成日をGyazoのcreated_atに揃える、といった感じの事をしている
touchコマンドで作成日をGyazoのcreated_atに揃える所がミソで、これをしないとGoogle Photoにuploadした際に日付が全部同じになってしまう

[gyazo](https://rubygems.org/gems/gyazo)というrubyのgemがあるんだけど、これだと画像の総数がGyazo APIだとヘッダーに入ってくるので、ライブラリ側で握りつぶされていて取得できなかった(多分、もしかしたらできるかも)
なのでわざわざ自前でAPI叩いてるけど、まぁGyazoのAPIはシンプルなので全くの無問題だった

# おわりに
Gyazoで自撮り管理はなかなか厳しいという感じだった
まぁそもそも自撮りを管理するサービスではないので、当たり前っぽい
また別記事で書くけど、今後はGoogle Photoで自撮り管理をしていく所存
ImageMagickで2枚の画像を比較

# compareコマンド

compareコマンドで2枚の画像の差分を比較する事ができます

```bash:
$ compare -metric AE img_1.jpg img_2.jpg diff.jpg

> 1470
```

オプションは以下とおり

```bash:
$ compare -metric [アルゴリズム] [画像1] [画像2] [出力される比較画像]
```

# オプション
## アルゴリズム
AE: 異なるピクセル数
PSNR: ピーク信号対雑音比


詳しくはこちら
http://www.imagemagick.org/script/command-line-options.php#metric

## -verbose

```bash:
$ compare -verbose -metric AE img_1.jpg img_2.jpg diff.jpg

> img_1.jpg JPEG 640x480 640x480+0+0 8-bit sRGB 176KB 0.000u 0:00.000
> img_2.jpg JPEG 640x480 640x480+0+0 8-bit sRGB 183KB 0.000u 0:00.000
> Image: img_1.jpg
>   Channel distortion: AE
>     red: 1470
>     green: 1470
>     blue: 1470
>     all: 1470
> img_1.jpg=>diff.jpg JPEG 640x480 640x480+0+0 8-bit sRGB 149KB 0.000u 0:00.000
```

# compositeコマンド

```bash:
$ composite -compose difference img_1.jpg img_2.jpg diff.jpg
```
上記のコマンドで黒い画像ができあがります
この画像が真っ黒かどうかを以下のコマンドで調べることができます

```bash:
$ identify -format "%[mean]" diff.jpg

> 401.777
```
0に近ければ近いほど黒い(差分が少ない)ということらしいです
Groongaで学ぶ全文検索 2015-11-06


# 検索の精度を上げる

##精度とは？みんなのイメージ
* ユーザーの満足度
* 思ったものが探せているかの度合い
* 漏れ無く検索できるか
* ゴミが無い

で大体合っている

## 全文検索の精度の指標

* 全文検索の精度の指標として再現率、適合率の２つを指標とする事が多い
* どちらも高い方が精度が高い


###再現率:答えをどれ位見つけられているかの度合い、全てあるうちの答えがどれ位含まれているかという事
みんなのイメージのうち、もれなく=再現率が高いという事

例)
ドキュメントに存在するキーワドが3つ中3つヒットする場合100%
3つ中2つなら66%

###適合率:ハズレが入っていない確率
ゴミが無い＝適合率が高いという事

##現実は
・ どちらも高くするのは難しい
・ モノによって求められる精度の高さが異なる
→Web検索の場合など最初の方しか見ないのでゴミがあっても
最初の方のデータの精度が高ければ良い
→特許などは漏れがある方が問題なので再現率が高い方が大事

##実際に精度を上げる方法

Webなどの場合には各ベージの重要度に応じて文書に対するスコアをつける、「スコアリング」で精度を上げる事ができる。

###スコアリングの例

#### 1.TF:単語の出現回数
* 文書の中にたくさんキーワードが含まれている程関連しているという考え

#### 2.TFIDF=TF/DF


*  色々な文書に含まれている単語は重要では無く、
少ない文書に含まれているものほど関連があるため重要という考え
* DF=単語が含まれているドキュメント数
* TFは大きい方が重要
* DFは小さいほうが重要

例)
A:100のキーワードが存在/10000の文書に存在=1/100
B:2つのキーワードが存在/1つの文書に存在=2
→Bの方が重要と判断する

#### 3.BM25

* 文書の長さも考慮する

### キーワード以外で精度を上げる方法

キーワードだけを使うのは限界がある。
メタデータ（他の関連する情報）も使った方がより精度が上がる。

例）
・ リンクの参照回数
・ タグ
・位置情報（現在地に近いほうが大事など
・検索したユーザーの情報なども使える
・訪問したことあるページを上位に出す
・下記のようにキーワード毎にランク付けして海鮮のランクが高いものを重要とする

居酒屋A　海鮮 10
居酒屋B 海鮮 5
居酒屋C 中華 10


##Groongaは
TF、TFIDF、TF limitありなどが使える。

TF limitありとは

*  スパム情報が入るとアテにならない場合があるため、ある程度まででlimitを決めて利用する

*  limitはユーザーが指定できる
デスクトップのFinderを一瞬で隠したり表示したりする




Macのデスクトップがごちゃごちゃ。プレゼンとかでとっさに隠したいときに簡単にできるようにシェルを書きました。

```lang:desk
#!/bin/sh

if [ ! $1 ] ; then
    printf "Usage:\n\t${0##*/} on  ... Show finder on Desktop\n"
    printf "\t${0##*/} off ... Hide finder from Desktop\n"
elif [ $1 = "on" ] ; then
    defaults write com.apple.finder CreateDesktop -boolean true
    killall Finder
elif [ $1 = "off" ] ; then
    defaults write com.apple.finder CreateDesktop -boolean false
    killall Finder
fi
```

# 使い方
`$ desk off # デスクトップをキレイに`
`$ desk on  # デスクトップにFinderを表示`

# 何をしてるか
こちらに詳しくのっています。
[Macでデスクトップ上のアイコンを非表示にする方法 投稿者: Inforati]
(http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-disable-desktop-icons.html)
顔画像の特徴点抽出で使えそうな学習データセット２

#A semi-automatic methodology for facial landmark annotation 
顔画像の特徴点抽出のための半自動方法論（データベースの紹介）

##概要
　強力な顔画像モデルの開発は学習や確認，テストのために膨大なアノテーションされた顔画像のデータが必要になる．特徴点に関してそれぞれの顔画像の手動アノテーションは職人芸が要求され，作業量は通常膨大になる．不確実なアノテーションの原因は疲れである．存在する少数の顔画像データベースはトレニングデータにしては少数のアノテーションを提供する．さらに，それぞれ異なってアノテーションされたデータベースを用いるのは難しい．この問題は複数のデータベースをもちいた実験を実行不可能なものにする．この困難に対抗するために，私たちはアノテーションされている膨大な顔画像データベースのために，半自動のアノテーション方法論を提案する．この論文ははじめにアノテーションされた膨大な顔画像データベースに適したルーツの開発を想定している．私たちはアノテーションを生成する私達のツールために MultiPIE, XM2VTS, AR, and FRGC Ver. 2 databasesを採用した．アノテーションは以下のサイトで公開されているもので作成した．最終的に私たちは生成されたアノテーションの正確さを確かめる実験を行った．

##はじめに

　コンピュタービジョンでは顔画像を用いた研究はポピュラーであり，よく研究された分野でもある．顔画像のアライメントはおそらくもっとも重要な役割である．近年は変化するモデルを元にしたアライメント手法が成功している．一般的に変形するモデルはターゲットオブジェクトの形状や輝度を表現する．変形するモデルは内部にテンプレートを幾つか表現しており，新たなオブジェクトをテンプレートへとFittingする．多様な変形モデルはモデルベースの顔画像分析として提案されてきた．最もよく知られているのはASMやAAMやCLMである．
　前述の方法はトレーニング時に正確にアノテーションされた顔画像データベースが必要になる．存在するデータベース[5,9,10,7]はたくさんのバリエーションをカバーしてる（異なるオブジェクト，姿勢，照明，オクルージョンなど）．だけれども提供されているアノテーションはいくらかの制限が見受けられる．（１）存在する多数のデータベースは全体の画像の比較的小さなサブセットのアノテーションを提供している[5][7]．（２）いくらか良くないアノテーションの画像が含まれている[9]．（３）それぞれのアノテーションモデルは異なる数の特徴点を含んでいる[5][9][7][10]
　拡張し正確なアノテーションの一つの方法は手動の労力によるものである．だけれどもこれはつまらなくまたタスクのパフォーマンスをあげるトレーニングが必要になる．最終的に，人が原因となり生成されたアノテーションは未だに不確実なものになる．よって，半自動のアノテーションシステムが重要になる．
特定のインターフェースを実装したenumだけを受け取れるように型引数を定義する

```java:Main.java
package sample;

public class Main {
    
    public static void main(String[] args) throws Exception {
        method(Hoge.HOGE);
        method(Fuga.FUGA); // コンパイルエラー
        method(new Piyo()); // コンパイルエラー
    }
    
    public static <T extends Enum<?> & MyInterface> void method(T t) {}
    
    public static interface MyInterface {}
    public static enum Hoge implements MyInterface {HOGE}
    public static enum Fuga {FUGA}
    public static class Piyo implements MyInterface {};
}
```

全ての `enum` は `java.lang.Enum` のサブクラスになるので、 `<T extends Enum<?>>` として、 `& MyInterface` を追加することでインターフェースを限定させられる。
ImageMagickをmacにインストール

# インストール
Homebrewからインストールしようとしたらエラーが出たので、インストーラで入れてみることにしました

こちらからインストール
http://cactuslab.com/imagemagick/

以下を選択

```
ImageMagick 6.9.1-0 for Mac OS X 10.5 – 10.10
Requires XQuartz. (7.8 MB)
```

# エラー
インストール完了後、displayコマンドを試してみたところ、以下のエラーが出ました

```bash
$ display page.png 

> dyld: Library not loaded: /opt/X11/lib/libfontconfig.1.dylib
>   Referenced from: /opt/ImageMagick/bin/display
>   Reason: Incompatible library version: display requires version 10.0.0 or later, but libfontconfig.1.dylib provides version 8.0.0
> Trace/BPT trap: 5
```

どうやら、X11のライブラリのバージョンが古いと怒られているようです

# XQuartzのインストール
XQuartzを直接インストールしてみました
http://www.xquartz.org/

すると実行できました

```bash:
$ display
```
結果
以下の画面が起動します
<img src="https://qiita-image-store.s3.amazonaws.com/0/29966/29022108-785c-9d2d-7211-eb5f194be42f.png" alt="ImageMagick" width="500" />
Common Lispで書く→はやい

#発端
[RubyからGoの関数をつかう → はやい](http://qiita.com/grj_achm/items/679b3f3af2cf377f0f02)

##関連
[RubyからRustの関数をつかう → はやい](http://qiita.com/rejasupotaro/items/2aa57a67f4a97101950c)
[Crystalで書く → はやい](http://qiita.com/etmnk/items/2801cd09c6ec4439c8fd)

上記記事への便乗です。

#条件
Arch Linux on Windows7(VirtualBox)で検証しています。

```
$ uname -a
Linux ArchLinux 4.2.5-1-ARCH #1 SMP PREEMPT Tue Oct 27 08:13:28 CET 2015 x86_64 GNU/Linux
$ ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
$ sbcl --version
SBCL 1.2.16


```

#内容

```fib.rb
def fib(n)
  return n if n <= 1
  fib(n - 1) + fib(n - 2)
end

puts fib(40)
```

```fib.lisp
(defun fib (n)
    (if (<= n 1)
        n
        (+ (fib (- n 1)) (fib (- n 2)))))

(print (fib 40))
```

#結果

```
$ time ruby fib.rb
102334155

real    0m19.350s
user    0m19.063s
sys     0m0.020s


$ time sbcl --script fib.lisp

102334155
real    0m4.836s
user    0m4.833s
sys     0m0.000s

```

Common Lispの方がRubyの4倍ほど速いですね。

##コンパイルしてみる

```
$ sbcl

*(compile-file "fib.lisp")
NIL
*(quit)

$ time sbcl --script fib.fasl

102334155
real    0m4.787s
user    0m4.780s
sys     0m0.007s
```

あんまり変わらないですね。

#おわり
共有ライブラリの作り方とか分からないので、どなたかお願いします(丸投げ)。

#おまけ

```
$ clisp --version
GNU CLISP 2.49 (2010-07-07) (built on foutrelis)
...
(省略)
...

$ time clisp fib.lisp

102334155

real    3m7.812s
user    3m7.807s
sys     0m0.003s
```
CLISP遅い...？

#追記
Clozure CL

```
$ wget ftp://ftp.clozure.com/pub/release/1.10/ccl-1.10-linuxx86.tar.gz
$ tar zxvf ccl-1.10-linuxx86.tar.gz
$ cp ccl/lx86cl64* ~/bin //PATHの通ったとこ
$ source ~/.bashrc
$ alias ccl="lx86cl64"
$ time ccl --load fib.lisp --eval '(quit)'
102334155

real    0m1.535s
user    0m1.530s
sys     0m0.003s
```

Rubyと比べて12倍ほど速くなりました！
【保存版】各サイトの box-shadow まとめ

# はじめに

最近は google が提唱したマテリアルデザインが流行しています。マテリアルデザインのガイドラインに従っておけば、モダンでそれっぽいデザインになるので、デザインセンスのないプログラマとしては、非常にありがたいですね。

ところで、マテリアルデザインといえば影が特徴的ですが、どのくらいの影にすれば良いのか迷うことはありませんか? 私も、今回新規にサイトのデザインをするにあったって、影の付け方を迷ったため、様々なマテリアルデザインのサイトを巡回して、どんな影の付け方をしているのか調べてみました。

# Google

https://accounts.google.com

ヘッダやカードなどは以下のように定義されています。

```
box-shadow: 0 2px 5px rgba(0,0,0,0.26)
```

アプリ一覧などのポップアップは、やや深めで以下のような定義です。

```
box-shadow: 0 2px 10px rgba(0,0,0,.2)
```

あまり関係ありませんが、2文字クラスなど、短くて読みにくいクラス名が大量に使用されていました。


# TopCoder

https://www.topcoder.com/

TopCoder はマテリアルデザインというよりはフラットデザインに近く、影はやや控えめでした。

```css
box-shadow: 0 1px 6px rgba(0,0,0,.2);
```

# feedly

https://feedly.com/

大きく分けて、以下の2つの影が使用されているようです。ボタンなど多くのものは1つめの定義が、一部のより深い影をもつ要素は2つめの定義が使用されていました。

```
box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
box-shadow: 0 10px 20px rgba(0,0,0,0.12), 0 6px 6px rgba(0,0,0,0.16);
```

# Materialize

http://materializecss.com/

`.z-depth-x`というクラスが定義されており、必要に応じてこれを extend しています。

0 から 5 までの 7 段階に分けて定義されていますが、ほとんどは .z-depth-1 または .z-depth-1-helf であり、それよりも深いものはほとんど使用されていません。

```css
// Z-levels
.z-depth-0 {
  box-shadow: none !important;
}
.z-depth-1{
  box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12);
}
.z-depth-1-half{
  box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15);
}
.z-depth-2{
  box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
}
.z-depth-3{
  box-shadow: 0 12px 15px 0 rgba(0, 0, 0, 0.24), 0 17px 50px 0 rgba(0, 0, 0, 0.19);
}
.z-depth-4{
  box-shadow: 0 16px 28px 0 rgba(0, 0, 0, 0.22), 0 25px 55px 0 rgba(0, 0, 0, 0.21);
}
.z-depth-5{
  box-shadow: 0 27px 24px 0 rgba(0, 0, 0, 0.2), 0 40px 77px 0 rgba(0, 0, 0, 0.22);
}
```

# まとめ

いかがでしょうか。マテリアルデザインなら google のものを採用するのが良いかもしれませんが、マテリアルデザインを独自にカスタマイズしたデザインもあるようなので、イメージに最も近いサイトのデザインを参考にするのも良いでしょう。