OmniAICreator/Qiita-1.07M huggingface dataset:
capsid.js で input のミラリング

[capsid.js](https://capsid.js.org) を使って、インプットフォームのミラリング (入力内容を即座に別dom に反映) をする例です

```html
<div class="mirroring">
  <p>
    <input class="src" placeholder="Type something here" />
  </p>
  <p class="dest"></p>
</div>
```

```js
const { def, on, wired } = capsid
 
class Mirroring {
  @wired('.dest') get dest () {}
  @wired('.src') get src () {}

  @on('input') onReceiveData (e) {
    this.dest.textContent = this.src.value
  }
}

def('mirroring', Mirroring)
```

マネージャーコンポーネント (MirroringManager) の dest に `.mirror-dest` 要素がワイヤーされます。 src に `.mirror-src` 要素がワイヤーされます。

input 要素に入力があると、 input イベントがマネージャーコンポーネントにバブリングして `@on('input') onReceiveData` メソッドが呼ばれます。

onReceiveData では、 dest.textContent に対して、src.value を代入することでミラリングを実現しています。

# デモ

[コードペン](https://codepen.io/kt3k/pen/VbvKNp?editors=1010)
よく使うJavaライブラリで味わうデザインパターン - Builderパターン

普段よく使うJavaライブラリにも、GoFのデザインパターンが隠されています。日々の作業が忙しく見逃しがちですが、たまにはじっくり一種の芸術ともいえる美しい設計を味わってみましょう。

## 今回の芸術

```java
import java.util.Locale;
import java.util.Locale.Builder;
...

Locale locale = new Builder()
    .setLanguage("ja")
    .setRegion("JP")
    .setScript("Latn")
    .setExtension(Locale.UNICODE_LOCALE_EXTENSION, "ca-japanese")
    .build();
```

日時を出力するときなどによく使うJavaのLocaleクラスのインスタンス生成シーンですが、あらためて鑑賞してみると、インターフェイスの美しさにうっとりしてしまいます。

## 鑑賞のポイント
[Locale](http://docs.oracle.com/javase/8/docs/api/java/util/Locale.html)インスタンスの生成には、Builderクラスが使われています。このクラスの`setXXX`メソッドでいろいろなプロパティを設定してから、`build`メソッドでインスタンスを生成します。Localeインスタンスがimmutable（不変）であることを予感させるところに美しさを感じます。詳しくは以下で解説します。


## Builderパターンを使わない場合

実は、Localeクラスは直接newしてインスタンス化することもできます。むしろ、普通はこっちの書き方をします。こんな感じになります。

```java
// 引数はlanguage, country, variant
Locale locale = new Locale("ja", "JP", "JP");
```

では、このLocaleインスタンスに新しいプロパティを追加するにはどうすればいいでしょうか？

```java
// XXX: このようなメソッドはない
locale.setScript("Latn");
```

このようにインスタンスメソッドで設定する方法を思いつくかもしれませんが、こんなメソッドはありません。Localeクラスは、インスタンスが一度作られた後に中身を変えることができないimmutableな設計になっているからです。うっかり別の個所で値が変更されることはないので、安心してインスタンスを使うことができます。

それならば、引数を増やしたコンストラクタを使用するのもひとつの方法でしょう。

```java
// XXX: 引数を4つとるコンストラクタはない
Locale locale = new Locale("ja", "JP", "JP", "Latn");
```

しかし、このようなコンストラクタはありません。この方法だとコンストラクタの種類がプロパティの数だけ必要になってしまい、プロパティの数が多いクラスを生成するには美しくない実装になってしまいます。

## Builderパターンを使った場合

冒頭のコードのようにBuilderパターンを使うことで、以下の恩恵を受けることができます。

１．凝ったオブジェクトを生成できる<font color="DarkGray">（今回の場合はimmutableなオブジェクト）</font>
２．オブジェクトへの設定項目が増えても対応できる<font color="DarkGray">（今回の場合はクラスのプロパティが増えても引数を増やしたコンストラクタを作る必要がない）</font>

また、

３. `build`メソッド内で引数の検証ができる

ということもBuilderパターンの特徴です。ただ、引数の検証は直接newする際のコンストラクタ内でもできるので、今回の比較では関係ありません。


## Builderパターンへの賞賛の声

多くの専門家からも、Builderパターンへの賞賛の声が上がっています。

irxgroundさん
> 複雑なオブジェクトを生成するのに、生成専用のクラスを用意するのは有用である。
http://qiita.com/irxground/items/d1f9cc447bafa8db2388

lang_and_engineさん
> あれこれ注文を付けてから，最後にドカンと一発やらかすパターンである。最終的な処理をカスタマイズするために，事前に設定や命令を１個ずつ言い渡す事ができるパターン。とも言える。１個ずつ言い渡せるので，おかげでコンストラクタ内の初期化処理に何もかもを詰め込まないで済む。
http://language-and-engineering.hatenablog.jp/entry/20120330/p1


## 最後に

わざわざ美術館に行かなくても、たった1行のコードを眺めるだけで知的な愉しみを味わうことができるのは、プログラマーの醍醐味でしょう。

Builderパターンの芸術性に共感してくださったエンジニアの方は、ぜひ当社（[クオリサイトテクノロジーズ株式会社](http://www.qualysite.co.jp/career/)）の採用担当までご連絡ください！


## 関連記事
#### インスタンスを作る
- [よく使うJavaライブラリで味わうデザインパターン - Factoryパターン](http://qiita.com/takuya-s/items/7ffebaee2a9db4310460)
- よく使うJavaライブラリで味わうデザインパターン - Builderパターン
- [よく使うJavaライブラリで味わうデザインパターン - Abstract Factoryパターン](http://qiita.com/takuya-s/items/6b26410d8eb47a9410e4)

#### インターフェイスをシンプルにする
- [よく使うJavaライブラリで味わうデザインパターン - Facadeパターン](http://qiita.com/takuya-s/items/eb663424a21094303b95)
- [よく使うJavaライブラリで味わうデザインパターン - Adapterパターン](http://qiita.com/takuya-s/items/45176b2bfc9fe07a9ce7)

#### 他のクラスに任せる
- [よく使うJavaライブラリで味わうデザインパターン - Template Methodパターン](http://qiita.com/takuya-s/items/8898e9bae34acada6480)
- [よく使うJavaライブラリで味わうデザインパターン - Strategyパターン](http://qiita.com/takuya-s/items/473699b5cb2d5329eed3)
videoタグで動画をループさせた際、都度リクエストを送信する問題

videoタグで動画をループさせた際、一部ブラウザで都度リクエストを送信する事象が存在します。

![スクリーンショット 2017-04-08 14.26.17.png](https://qiita-image-store.s3.amazonaws.com/0/126897/dfc08d29-c111-9e3f-f52e-e6751c84a48c.png)


chromiumでも上記事象のイシューが上げられています。
https://bugs.chromium.org/p/chromium/issues/detail?id=680063

#原因
おそらくレンジリクエストが原因なのではと・・

#事象での影響
ネットワークの帯域を占有することになり、通信速度が低下します。表示速度などを意識しているサイトでは注意が必要でしょう。

#対処方法
- YouTubeのAPIを利用する
- 動画の時間と容量を制限する

##YouTubeのAPIを利用する
多くのサイトの動画はYouTubeを利用していると思うので、一番安全な手段だと思います。

##動画の時間と容量を制限する

Videoタグを使用した場合でも動画の時間と容量を制限することで事象を回避できることがありました。
以下のサイトでは事象が起きておりません。容量が軽く、時間が短い動画はループの度にリクエストを送信することなく実現できそうです。

・動画再生時間と容量（10秒 3.67MB）
https://www.nissin.com/jp/

また、テストで以下の目安で動画を作成したところリクエストを投げることなくループが実現できました。

- 10秒→7M以下
- 20秒→5M以下
- 30秒→2.6M以下

30秒以上は画質の問題もあり、YouTubeを利用するほうが良いでしょう。
[obsolete] FreeBSD 4.2-RELEASE #0 にて、CF を使った sendmail の設定メモ

* この参考例でのリレーポリシーは
無条件転送
外側 ⇒ ドメイン宛ての内側
内側 ⇒ 内側
内側 ⇒ 外側
localhost ⇒ 全て

* 条件付きで
外側 ⇒ 外側

* その条件は
From 行のドメイン名で判断
⇒この場合は接続元が不特定多数

* その他は全て弾く。

ftp://ftp.kyoto.wide.ad.jp/mail/CF/ から次のファイルを get

```text
CF-3.7Wpl2.tar.gz
CF-3.7Wpl2-smtpcheck.patch1
CF-3.7Wpl2-smtpcheck.patch2
```
* 展開とパッチ充て

```console
% tar zxfv CF-3.7Wpl2.tar.gz
% cd CF-3.7Wpl2/Master
% patch < ../../CF-3.7Wpl2-smtpcheck.patch1
% patch < ../../CF-3.7Wpl2-smtpcheck.patch2
```
* def ファイルの編集

```console
% cp ../Standards/sendmail-v8.def ../hoge.def
% ee ../hoge.def
```
* hoge.def の書き換え個所

```text
VERSION=3.7Wpl2
VERSION_SEPARATOR=/
LOCAL_VERSION=`date +%Y.%m.%d.%H`
OS_TYPE=bsd4.4
MX_SENDMAIL=yes
####MY_DOMAIN=hoge.co.jp			#必要であればドメイン名を記述
####MY_NAME=hoge-sv					#必要であればホスト名を記述
LOCAL_MAILER_FLAG_ADD='S'			#sendmail 8.9.3 以降の仕様変更に追従するために必ず追加
COPY_ERRORS_TO='postmaster'
PRIVACY_FLAGS='goaway'
MAIL_RELAY_RESTRICTION=yes
LOCAL_HOST_IPADDR=192.168.1			#local ip address
LOCAL_HOST_DOMAIN=hoge.co.jp		#リレー制限用で、制限を受けずにリレーさせるドメイン名を記述
CLIENT_HOST_DOMAIN=hoge.co.jp
ALLOW_RECIPIENT_DOMAIN=hoge.co.jp
ALLOW_RELAY_FROM=hoge.co.jp
ALLOW_RELAY_TO=hoge.co.jp
```

* 編集した def ファイルから cf ファイルの作成

```console
% cd ..
% make hoge.cf
```
*ここのファイルネームはhoge.defでは無い！*

* cf ファイルのインストール

```console
% su
# cp hoge.cf /etc/mail/sendmail.cf
```
* sendmailに新しいcfファイルを認識させる

sendmailの再起動

```console
# kill -HUP `cat /var/run/sendmail.pid`
# newaliases
```
俺のコマンド

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/%E4%BF%BA%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/)をご覧ください😀

個人的によく使うLinuxとかのコマンド集です。

## grepいろいろ

### 指定したディレクトリ直下のファイルから特定の文字列を検索する

```sh:
find '/xxx/yyy/' -maxdepth 1 -type f -print | xargs grep 'moji1'
```

※単に `grep 'moji1' /xxx/yyy/*` でもよいが、`.env` などの隠しファイルがヒットしない


### 指定したディレクトリからn階層下までのファイルから特定の文字列を検索する

```sh:
find '/xxx/yyy/' -maxdepth n -type f -print | xargs grep 'moji1'
```
- nが2の場合、1階層下までが対象となる
    - grep対象
       - /xxx/yyy/* （直下）
       - /xxx/yyy/\*/* （1階層下）
    - 対象外
       - /xxx/yyy/\*/\*/* （2階層下）
       - /xxx/yyy/\*/\*/\*/* （3階層下）


### 指定したディレクトリ配下すべてのファイルから特定の文字列を検索する

```sh:
find '/xxx/yyy/' -type f -print | xargs grep 'moji1'
```

### 複数文字列の場合

```sh:
find '/xxx/yyy/' -type f -print | xargs grep 'moji1¥|moji2'
```

- `¥|`で繋ぐ。

### 特定のパスを除外する

```sh:
find '/xxx/yyy/' -path '*/zzz' -prune -o -type f -print | xargs grep 'moji1'
```

- 複数の場合は`-path 'target' -prune -o`を繰り返し書く。

## シンボリックリンクを探す

```sh:
ll | grep ^l
```

## プロセスをkill

```sh:プロセスID（PID）を探す
ps aux | grep {hogehoge}

```

```sh:kill
kill {PID}
```

## viがvimなのか調べる

```sh:whichコマンドでエイリアス貼られているか確認
$ which vi
alias vi='vim'
        /usr/local/bin/vim
```

```sh:念の為vimも確認
$ which vim
/usr/local/bin/vim
```

## viで置換

```sh:
:%s/BEFORE/AFTER/cg
```

- `%s`：ファイル全体
- `g`：行全体
- `c`：処理確認
  - `y`：置換する
  - `n`：置換しない
  - `a`：ファイル内全て置換
  - `q`：置換中止

## ファイルディスクリプタの上限値を確認

```sh:
# ソフトリミット（変更可能だが、ハードリミット以上の値を設定することはできない）
$ulimit -Sn
1024

# ハードリミット
$ulimit -Hn
4096

# OS全体で開くことができるファイル数
$cat /proc/sys/fs/file-max
99848
```

## package-lock.json の内容で npm install したい
`npm ci`
【メモ】量子コンピュータ

最初の投稿なので？？、軽めにいきたいと思います。


#ちょっとした背景
自分が大学生のころ、隣の席でUTD（Under the Desk　自分の研究以外に別研究を実施）として、量子光学や量子コンピュータを独力で研究開始していた猛者（同期）がいました。

（久しぶりに探してみたら所属先は移ってましたが、継続して量子光学を研究しているようでした）


そんな影響を受けて、量子コンピュータに興味を持っていますが、自分は１００％ミーハーなので、エンタングルとか単語を数語知っているに過ぎません。。。

#現状の検索結果

まずは最近の状況をぐぐってみた結果を。。。

- 昔は数QBIT程度だったと思うが、数千QBITまでオーダーが上がっており、現在のコンピュータに対しての優位性が「一部」ではあるもの示せるようになっている

> [D-Waveの量子コンピュータは「1億倍高速」、NASAやGoogleが会見](http://itpro.nikkeibp.co.jp/atcl/news/15/120904017/?rt=nocnt)

- IBMから数QBITレベルだが、クラウドで一般公開されるようになり、一般人レベルでも体験できる世の中になった（提供されるQBITは今後増加の見込み）

> [米IBMが量子コンピュータのシステム構築用APIを公開](http://itpro.nikkeibp.co.jp/atcl/news/17/030600715/)

- 量子コンピュータはアルゴリズムが命であり、アルゴリズム有無で有効性が大きく異なるが、利用できるアルゴリズムは、ぱっと見あまり増えてなさそうにも見える。これはネットでさっと見れる範囲では、ということだが、ここが量子コンピュータのブレークスールーの一つのキー。

- もうひとつのブレークスルーのキーは量子コンピュータ自体の性能。QBITの増加も必須だが、計算可能時間や、エラー率なども大きなファクター（コストも当然からんできますが、、）

- 量子コンピュータのビジネスでの活用想定としてはセキュリティが中心で、あとはコグニティブ（AI）。ただ、基本的には多体系の計算にも有効なはずなので、分子計算や流体計算などの科学技術計算を通じたものもでてくるのでは。天気予報などもビジネスと絡んできているので、量子コンピュータがそのバックボーンになっていく可能性もある。


#リンク

> [NASA QuAIL](https://ti.arc.nasa.gov/tech/dash/physics/quail/)

> [Google reserch Quantum A.I. ](https://research.google.com/pubs/QuantumAI.html)

> [IBM IBMQ](https://www.research.ibm.com/ibm-q/)
VALUE-DOMAIN での Mailgun の DNS 設定

Mastodon のために VALUE-DOMAIN で Mailgun の DNS 設定をしようとしたら全然うまくいかなくて苦労したので記録。

## VALUE-DOMAIN の DNS 設定
最終的に以下の設定でうまくいった。

```
txt mg v=spf1 include:mailgun.org ~all
txt smtp._domainkey.mg k=rsa;p=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
mx mxa.mailgun.org. 10 mg
mx mxb.mailgun.org. 10 mg
cname email.mg mailgun.org.
```

申込時に「サブドメインにした方が良いよ」というサジェスチョンがあったので、それに従って mg.example.jp のように登録。

## SPF レコード
spf レコードの設定でそもそもこれを忘れてサブドメイン mg を指定し忘れる。

## smtp.__domainkey
これは単に DNS の認証的な設定だろうか。
`k=rsa;` と `p=XXX...` の間に改行だかスペースだかかが入っていて、これの扱いが不明。とりあえず余計なコードが入らないように詰めたら通った。スペースは OK かもしれない。

## MX レコード
この設定の VALUE-DOMAIN での書き方に最後まで悩まされた。

## CNAME レコード
一生懸命 `email` だけを指定していたが、 `.mg` を忘れず付けないといけない。
render :partial で別のフォーマットを使いたい時はfomats


formatで指定しても駄目だったので調べた。
ドキュメントに載ってなかったので、該当のメソッド読んだ結果

```ruby:actionview-5.0.2/lib/action_view/renderer/partial_renderer.rb
    # Sets up instance variables needed for rendering a partial. This method
    # finds the options and details and extracts them. The method also contains
    # logic that handles the type of object passed in as the partial.
    #   
    # If +options[:partial]+ is a string, then the +@path+ instance variable is
    # set to that string. Otherwise, the +options[:partial]+ object must
    # respond to +to_partial_path+ in order to setup the path.
    def setup(context, options, block)
      @view   = context
      @options = options
      @block   = block

      @locals  = options[:locals] || {}
      @details = extract_details(options)

      prepend_formats(options[:formats])

      partial = options[:partial]
      (略)

```

formatsでOKっぽい。

```ruby
<%= render :partial => "hoge", :formats => :js %>
```

と書けば良いっぽい。

```ruby:actionview-5.0.2/lib/action_view/renderer/abstract_renderer.rb
    def prepend_formats(formats)
      formats = Array(formats)
      return if formats.empty? || @lookup_context.html_fallback_for_js

      @lookup_context.formats = formats | @lookup_context.formats
    end
```

内部的にprepend_formats内で最初にArrayしてるのでオプション自体は配列でもそうでなくても良い様です。
Xcodeでアプリの標準言語を日本語にする方法


Targets -> Info の、　「Localization native development」でJapanを選択する。

次に同じ画面で、右クリックでメニューを出し、「Add Row」を選ぶ。
keyに　```Localizations```、 items[0]のvalueで、```Japanese``` を選択する

ここまでは簡単。

次に、以下の画像のように、Project -> Info にある Localizationsを変更する。GUIで変更できなかったので、エディタで直接変更する。

![a88d25f6-f31a-b65f-5a26-41a5c93d0cfb.png](https://qiita-image-store.s3.amazonaws.com/0/10494/682e7aa5-554c-67ca-0df5-07c1ad037eda.png "a88d25f6-f31a-b65f-5a26-41a5c93d0cfb.png")



```
$ vi <プロジェクト>.xcodeproj/project.pbxproj 
```

```Region``` で検索すると以下の記述があるので、 ~~English の部分をJapanese、enのところを~~ ```ja```に変更する

```
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
        en,
        Base,
);
```
AtomでRemote-FTPを使う

AtomでサーバにファイルをSFTPでアップロードしたかったのでRemote-FTP設定しました。

#手順1：Remote-FTPをインストールする
settings->+install で「Remote-FTP」を検索。install。

#手順2：Remote-FTPの設定をする
Atomを再起動してからFTP設定したいプロジェクトを開いてから
パッケージ->Remote-FTP->Create SFTP config file
![スクリーンショット 2017-04-17 18.16.09.png](https://qiita-image-store.s3.amazonaws.com/0/169137/50d9a182-0cc8-aa5c-2fd8-c8d06e7f731a.png)

#手順3：.ftpconfigファイルを書き換える
手順2をするとそれぞれのプロジェクトに.ftpcinfigができるので、書き換える。
**パスワード認証を使わないときも行をまるまる消すのではなく""で空文字にしておく**
![スクリーンショット 2017-04-18 9.57.33.png](https://qiita-image-store.s3.amazonaws.com/0/169137/f85a3b7e-a9c9-8e72-0469-a7ecbe8afce5.png)

#手順4：接続してみる
パッケージ->Remote-FTP->Connect
![スクリーンショット 2017-04-18 13.12.43.png](https://qiita-image-store.s3.amazonaws.com/0/169137/84707c16-bb11-86fa-bd34-09d7b1066a69.png)

#手順5：設定変更してみる
atomのsettingsからRemote-FTPの設定を変更してみる。
「Auto Upload On Save」がデフォルトalwaysになっている。それだと常にローカルとサーバが同期してしまうのでneverに変更。
neverにしておくと、手動uploadした時だけ同期できる。
![スクリーンショット 2017-04-18 13.03.26.png](https://qiita-image-store.s3.amazonaws.com/0/169137/397a55cb-5c42-c7f8-efc2-f15628743b8b.png)

#手順6：アップロードしてみる
更新したいファイルを右クリック->Upload
![スクリーンショット 2017-04-18 13.03.55.png](https://qiita-image-store.s3.amazonaws.com/0/169137/c5d0ad7c-462f-5427-c2d3-96b68433bd96.png)
一時ファイル無しでrubyで生成した文字列を外部コマンドに渡す方法

「一時ファイルを作らずにスクリプトで生成した文字列を外部コマンドに渡す方法」なのですが、個人的にはGraphvizのdotコマンドでグラフをpng形式で保存するプログラムを書く機会があったときにこれについて調べました。ということで、以下で説明している例ではコマンドは`dot`コマンドになります。ですが標準入力を受け取るタイプのコマンドならば、インプットとして例えば`foo.in`があって`a.rb`が`<cmd>`が受け付ける形式に`foo.in`を変換して標準出力するものとしたとき、`./a.rb foo.in| <cmd>`みたいにしたり、`./a.rb  foo.in > tmp.in && cat tmp.in | <cmd>`みたいなことは必要無いことが分かると思います。

入力が手で書かれたdotファイルであれば`dot -Tpng -o image.png < tmp.dot`とすれば画像ファイルはできあがります(ドットファイルを標準入力としてリダイレクトせず、つまり'<'が無くても画像ファイルは生成されます)。ですがもともとの入力が別の形式だった場合は、それをドット言語で書かれた文字列に何らかのスクリプト言語で変換し、dotコマンドに渡すことになると思います。このとき、一時ファイルを作っても良いのですが、それは結局ゴミなので、一時ファイルを作らずに画像ファイルを生成する方法を調べました。結論としては、dotファイルは標準入力を受け付けるのでpopenを使えば一時ファイルは不要です。以下がrubyで書いた例です(Parser#dotfileは読み込んだファイルをdot言語に変換するメソッドとします)。

```ruby
def white_graph(path, ext)
  p = Parser.new
  p.parse(IO.read(path))
  fn = File.basename(path, ext)
  IO.popen("dot -Tpng -o ./images/#{fn}.png", "r+") do|io|
    io.puts p.dotfile
  end
end
```
NetBeans 環境設定備忘録

#NetBeansの設定
忘れないように記しておくことにする
インストール方法は公式が日本語に対応しているのでそれに従った
###プラグイン
導入方法はツール->プラグインから検索してインストールする
導入したプラグイン一覧
***Show path in titlebar***
タイトルバーにファイルパスを表示するプラグイン
同名ファイルを見分けるのに便利そう
***Core outline***
コードのアウトラインを表示するプラグイン
インデントの階層が理解しやすくなるはず
***Explorer from here***
「プロジェクト」パネルや「ファイル」パネルの中のコンテンツを右クリックした時のメニューに「エクスプローラーで開く」を追加してくれるプラグイン
***Change Line Endings on Save***
ファイルを保存するときに改行コードをそろえるプラグイン
おすすめに書いてあったので導入
ツール > オプション > エディタ > Line Endingsでenableにチェックを入れ改行コードをWindowsのものに指定した

---
何か追加があれば追記していきたいと思う
Docker + VirtualBox でホストディレクトリがマウントされない時

Docker-machine + VirtualBox で ```-v <<host_dir>>:<<container_dir>>```
でホストのディレクトリをマウントしようとしてできなかった時の備忘録.

VirtualBox の仮想マシン設定 -> 共有フォルダタブ
で共有フォルダがデフォルトでは /Users のみのため,
/Users 以外の /usr/local/ などのディレクトリにマウントすることはできない.
共有フォルダを追加すればできそうだがこの手の設定をむやみに追加してもあまりいいことはなさそうなので特別こだわりがなければ /Users 配下のディレクトリで作業した方がよさそう.

(マウントできない場合はエラーメッセージを出してくれませんかねクジラさん...)

**念のため構成メモ**
Mac: 10.10.5
Docker-machine: 0.7.0
Docker: 1.11.1
VirtualBox: 5.1.18 r114002

2017/08/03 追記
Mac の場合は docker for mac を使えば Virtual Box はいらないし, 
マウントできないとエラーを出してくれるし, マウント対象ディレクトリは簡単に追加できるし,
docker-machine からの migration もサポートしてるしなので楽々です.
[obsolete] FreeBSD 4.2-RELEASE に於ける旧版から移行の際に CF で互換を持たせるための作業

http://qiita.com/je3kmz/items/f3b5934c1988061aa70f の追加情報
04.txt の追加情報

http://www.freebsd.org/ja/releases/4.2R/notes.html
より引用

sendmail がバージョン 8.9.3 から 8.11.1 にアップグレードされました.
これには, 標準のファイル配置 (/usr/src/contrib/sendmail/cf/README 参照),
newalias の実行が root と信頼されたユーザ (trusted user) に制限された
こと, STARTTLS encryption, MSA ポート (587) の標準設定における無効化と
いった重要な変更が含まれています. 詳細については
/usr/src/contrib/sendmail/RELEASE_NOTES をご覧ください.

今回から, mail.local(8) は set-user-id バイナリとして
インストールされなくなりました.  もし, 使っている
/etc/mail/sendmail.cf が FreeBSD 3.1.0 以降に付属している
sendmail.cf 以降のものであるなら問題はありません.
しかし, もし手作業などの他の方法で sendmail.cf を作成し,
かつ mail.local をメール配送に使用している場合には,
Mlocal 行の F=S フラグが設定されているかどうか確認してください.
.mc ファイルを使用して sendmail.cf を生成している場合は,
以下の行を .mc ファイルに追加して sendmail.cf ファイルを
再生成することで, フラグを追加することができます.
    MODIFY_MAILER_FLAGS(`LOCAL', `+S')dnl
なお FEATURE(`local_lmtp') にはすでにこのフラグが含まれています.
ActionMailer の送信ログをとりたい

たまたま Rails の `ActionMailer` について調べてみる機会がありましたので、そこに見られた Observer について書きたいと思います。

ご存知のように、メールの送信というものは失敗する可能性があります。ですので、できうるかぎりメールはユーザに届けたい！という場合は、再送の手間をかけなければいけないこともあるわけですが、そうした際に必要になってくるのは、そう、送信ログです。`ActionMailer` では簡単に送信ログがとれますので、今回はそれについて書いてみます。

たとえば次のようなメールアクションがあったとします。

```ruby:app/mailers/foo_mailer.rb
class FooMailer < ActionMailer::Base
  def foo(recipient_email_address)
    mail(to: recipient_email_address, body: 'foo')
  end
end
```

このメールを送信するには、ご存知のように

```ruby
FooMailer.foo('to@example.com').deliver_now
```

というふうにするわけですが、今回はログを取得したいので、これを実行するまえにあらかじめ `ActiveSupport::Notification` でサブスクライブしておきます。

```ruby
ActiveSupport::Notification.subscribe("deliver.action_mailer") do |name, start, finish, id, payload|
  puts "name: #{name}"
  puts "payload: #{payload}"
end
```

こうしておくと、送信処理の直前に次のようなアウトプットが得られるようになります。

```
name: deliver.action_mailer
payload: {:mailer=>"FooMailer", :message_id=>nil, :subject=>"Foo", :to=>["to@example.com"], ...}
```

なお、 `"deliver.action_mailer"` は「送信時」（実際に送信する直前）のイベントですが、これを `"process.action_mailer"` にすれば「送信処理の前」（アクション、つまり今回の場合であれば `FooMailer.foo` 実行の直前）のイベントを購読できます。

## interceptors と observers

`ActiveSupport::Notification` は `ActionMailer` の `deliver_mail`（送信処理）や `process`（アクションの実行）で発火するようになっていますが、`Mail` 自体にも Observer を加えるしくみが用意されており、`ActionMailer` からは `register_interceptors` や `register_observers` からそうした Observer を登録しておくことができます。

たとえば

```ruby
class MyInterceptor
  def self.delivering_email(mail)
    puts mail.inspect
  end
end

class MyObserver
  def self.delivered_email(mail)
    puts mail.inspect
  end
end

ActionMailer::Base.register_interceptors(:my_interceptor)
ActionMailer::Base.register_observers(:my_observer)
```

としておけば、送信処理の直前で `MyInterceptor.delivering_email` を割り込ませることができ、送信後に `MyObserver.delivered_email` を実行させることができます。

## さいごに

もちろん、 `ActionMailer::Base#deliver_mail` メソッドを直接上書きしても、送信処理の前に割り込みをすることはできるだろうと思います（この場合、`super` を呼ばなければ送信そのものをキャンセルすることもできそうです）。

しかし、こうした Observer を使えるしくみが用意されているので、もし用途に適しているようであれば、活用してみたほうがキレイな実装になるかな？と思います。
booleanに対するrailsのpresent?

コードレビューしててダメじゃんと思ったけどダメじゃなかった件のメモ

端的に書くとこんなコード（例なので強引にpresent?使ってます）

```ruby
hoge = fuga.piyo? # true or falseを返す

if hoge.present?
  p "hogehoge"
end
```

trueにしろfalseにしろif文の中通っちゃうと思ったけどそうじゃなかった。

present?の確認

```ruby
> false.present?
=> false

> [nil, true, false, 0, 1, ""].map(&:present?)
=> [false, true, false, true, true, false]
```

変数にfalseが入っていてもpresent?ではfalseを返すことが確認できました。
この時点では違和感が。

railsのコードを見ると
https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/blank.rb#L23

blank?の裏返し。

```rb
> false.blank?
=> true

> [nil, true, false, 0, 1, ""].map(&:blank?)
=> [true, false, true, false, false, true]
```

falseはtrueを返すことを確認。
こっちだと違和感ないから不思議。

納得したので終了
php(CodeIgniter )DBで管理するまでも無いものを配列で管理する方法

データベースで管理するまでも無いものは配列で管理すると便利

```php:model
	public $status = array(
		'1' => "個人",
		'2' => "会社",
		'3' => "委託",
	);
```

```php:controllers
$data = array(
'project_status' => $this->Talent_model->status,
		);

	$this->load->view('talent/index.php', $data);
```

```php:views
<?= $project_status[$value['id']]?>
```
Ruby + rcairo で描画処理をするサンプル

## cairo と rcairo とは

- cairo: 二次元グラフィック描画ライブラリ
- rcairo: cairo の Ruby 用インターフェース

## 今回の動作確認環境

- macOS Sierra 10.12.4
- cairo 1.14.8
- ruby 2.4.0
- rcairo 1.15.5

## cairo のインストール

```sh
$ brew install cairo
```

## rcairo のインストール

```sh
$ gem install cairo
```

## サンプルコード

新規作成、読み、書き、描画のサンプルコード。

```ruby
require 'cairo'
require 'stringio'

# 画像を生成する
def make_image()

  format = Cairo::FORMAT_ARGB32
  width = 300
  height = 200

  # 画像の新規作成
  surface = Cairo::ImageSurface.new(format, width, height)
  context = Cairo::Context.new(surface)

  context.set_source_rgb(1, 1, 1)
  context.rectangle(0, 0, width, height)
  context.fill

  context.set_source_rgb(0, 0, 1)
  context.arc(width / 2, height / 2, height / 4, 0, 2 * Math::PI)
  context.fill

  # PNG画像を書き込み
  io = StringIO.new
  surface.write_to_png(io)
  io.pos = 0
  io
end

# 画像にラクガキする
def draw_rakugaki(io)

  # PNG画像を読み込み
  surface = Cairo::ImageSurface.from_png(io)
  context = Cairo::Context.new(surface)

  w = surface.width / 4
  h = surface.height / 4

  context.set_source_color(Cairo::Color::GREEN)
  context.set_line_width(10)
  context.move_to(w, h)
  context.line_to(w * 3, h * 3)
  context.stroke

  # PNG画像を書き込み
  io = StringIO.new
  surface.write_to_png(io)
  io.pos = 0
  io
end

open('sample1.png', 'wb') do |io|
  io.write(make_image.read)
end

open('sample2.png', 'wb') do |output|
  open('sample1.png', 'rb') do |input|
    output.write(draw_rakugaki(input).read)
  end
end
```

## 参考資料

- cairographics.org https://cairographics.org/
- cairo | RubyGems.org | your community gem host https://rubygems.org/gems/cairo
- rcairo reference manual http://rcairo.github.io/doc/
- Documentation for cairo http://www.rubydoc.info/gems/cairo/
- Rubyist Magazine - cairo: 2 次元画像描画ライブラリ http://magazine.rubyist.net/?0019-cairo
SketchでRadiusを角ごとに指定する（ver43.1）

sketchのバージョン、43.1です。
各radiusに対する指定は、 `;` で区切るみたいです。

順番はCSSと同じ

```
左上;右上;右下;左下
```
----------
例

```
8;2;2;8
```

![image](https://qiita-image-store.s3.amazonaws.com/0/7039/250b3d46-c332-ac14-d9fe-38056a4c18e2.png)

----------

例

```
8;2;2;8
```
![image](https://qiita-image-store.s3.amazonaws.com/0/7039/6aabd4bb-916e-7781-98c2-31cf6341bb86.png)
RadioButtonのフォーカス、タッチ無効化

RadioGroupがわからなかった為、
カスタムViewにRadioButton形式の選択項目とわかるようにRadioButtonを設置した
RadioButtonだけをタッチされた時、RadioButtonのアニメーションが起きてしまう（選択される
RadioGroupではないので解除が出来なくなる
困る
→RadioButtonに対してのタッチを無効化しよう

参考
http://qiita.com/_meki/items/3a1769382bdd9d4d5ab7

focsable=false
focusbleInTouchMode=false
→特に効果なしフォーカスではないようだった

clickable=false
→選択されない。アニメーションされない
setOnClickListener にオブジェクトが登録されていると動作しないらしい

enabled=false
→選択されない。表示がdisabledの状態になるため使えない
さくらインターネットのレンタルサーバ、スタンダードプラン以上の環境で、シェルから FFmpeg のコンパイルする。

# イントロダクション
通常の契約をして、ssh でログインするトコまでは割愛しておく🌝

私の契約している環境では FreeBSD 9.1-RELEASE だったので、ホームディレクトリ上に実行ファイルやライブラリを構築しなければならない。
従って、以下の環境変数の設定と各ディレクトリを作成をしておく。
# 環境設定
環境変数は好みのシェルに合わせてログイン時に自動的に読み込むようにして置くことで、毎回手動で入力する事が省くことができるから、初期のシェルが csh だったので、.cshrc に追記しておく。

```shell:.cshrc
setenv TZ JST-09
setenv LANG ja_JP.UTF-8
set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin $HOME/bin)
set dspmbyte utf8
setenv TMPDIR ~/tmp
setenv LIBRARY_PATH ~/lib
setenv LD_LIBRARY_PATH ~/lib
setenv C_INCLUDE_PATH ~/include
setenv PKG_CONFIG_PATH /usr/local/libdata/pkgconfig/:~/libdata/pkgconfig
```

ディレクトリの作成

```text
% mkdir -p ~/tmp ~/lib ~/libdata ~/include
```


以下のライブラリは、日本放送協会が展開している「らじるらじる」を、録音する際に必要になるので、録音しない場合は飛ばしてもいい。

注：20180727 現在では rtmpe プロトコルを用いての配信終了したそうなので、以下の gmp のインスコはスルーしてよい。
# 必要ライブラリのビルド
```text:gmp(不要)
% cd ~ && fetch -o- ftp://ftp.gnu.org/gnu/gmp/gmp-6.2.1.tar.xz | bsdtar xf -
% cd gmp-6.2.1 && ./configure M4=m4 --prefix=${HOME} CC=clang
% gmake -j4 all && gmake install
```

ご本尊の build は、上記のライブラリを読み込むか否かで、configure のスイッチを変更する必要があるので注意する事。
# ご本尊のビルド
```text:FFmpeg
% cd ~ && fetch -o- https://ffmpeg.org/releases/ffmpeg-5.0.1.tar.xz | bsdtar xf - && cd ffmpeg-5.0.1
% ./configure --disable-x86asm --enable-gmp --enable-openssl --enable-version3 --cc=clang --prefix=${HOME} --disable-ffplay --disable-doc --disable-htmlpages --disable-podpages --disable-txtpages --enable-manpages --enable-small --enable-openssl --enable-static --progs-suffix=`pwd | awk -F- '{print $NF}' | tr -d .`
```

注：gmp ライブラリをインスコしていなければ、--enable-gmp を削除すること

```text
% gmake -j4 all
% install ffmpeg`pwd | awk -F- '{print $NF}' | tr -d .` ~/bin/
% install ffprobe`pwd | awk -F- '{print $NF}' | tr -d .` ~/bin/
```

注：Makefile 使って install すると使わないファイルもインストールするのでバイナリだけインストールする。

これで、ffmpeg がコマンドラインから使えるようになる。

最後に後始末として不要なら、ソースファイルの tarball や作業ディレクトリを削除しておけば、無駄な容量消費を抑えられる。

```text
% # 必要であれば gmp も削除する
% cd ~
% rm -Rf gmp-6.2.1
% rm -Rf ffmpeg-5.0.1
```
# コンクルージョン
この手順書では、ffmpeg コマンドの後ろに便宜上バージョン番号を付しいるが、不要の場合は ./configure 及び install コマンド中の `pwd ...` の記述を削除すれば従来通りのバージョン番号の付さない実行形式が生成される。
初心者だけど初心者にswitch文をもっと真っ当に教えてほしい件

## 背景
プログラミングの勉強を始めて半年のペーペーの初心者です。
業務で必要に迫られてレガシーコードのリファクタリングをやったりしてます。
その程度の初心者がC言語の勉強を始めて1週間も経たずに、ポインタなんかよりもswitch文に敵意が湧きました。（なお現在C言語歴2ヶ月程度）
適切に使えばswitchも便利なのかもしれませんが、

**なんでもかんでもswitchするコードが多すぎる！！！** 

もはやプログラミング初心者にswitch文を教えないでおいてほしいとすら思ってきます。
（なお、ここでいう初心者というのはプログラミング初めて1週間とかの初心者、というか入門者を指しますのであしからず）

## そもそも論
そもそもプログラム、というか情報処理の基本はif文による条件分岐とfor文による繰り返しであると言えるでしょう。
if文とfor文（と逐次処理）で書けないプログラムはないという話もあります。
初心者にはせめてそのことを教えてあげてください。
そしてまずはif文とfor文による制御文を自由に使えるようにしてあげてください。

間違っても条件分岐の記述についてswitch文から入らないでほしいし、極端なことを言えば（初めは）switch文の使用を禁止するくらいの構えがあってもいいのではないでしょうか。

## switchの誘惑
if ~ else if ~ else文は確かに初心者にはとっつきにくい部分があります。
分岐条件を理解するのにいちいち立ち止まって考えなければならないので、もどかしさがあります。
switch文はインデントが揃って見た目もきれいに条件分岐を記述できるので、一見してとてもシンプルに見えます。
加えて、enumとの相性が（あたかも）とても良いように見えるということも、switchの誘惑に拍車をかけている気がします。

## 初心者が書いてしまうであろうswitch文
では実際に初心者にswitchを教えたらどうなるかを見ていきます。
私が実際にリファクタリングしている、既に製品化されたコードの一部を簡単にして掲載しています。


```c:
enum state {
    hage,
    hige,
    huge,
    hege,
    hoge,
};

int var;
int i = 0;
int j = 100;
int hogehoge_state; // enum stateを条件分岐して代入

/* 中略 */

switch (hogehoge_state) {
    case hage:
        var = 0;
        i++;
        j++;
        break;
    case hige:
        var = 1;
        i++;
        j++;
        break;
    case huge:
        var = 2;
        i++;
        j++;
        break;
    case hege:
        var = 3;
        i++;
        j++;
        break;
    default:
        var = 0;
        break;
}
```

## switchが便利なのはわかるが、、、
enumやswitchを用いてプログラムの振る舞いを記述するのが一見してわかりやすいというのはたしかに理解できます。
おそらく、上述のコードはC言語歴1時間程度でも動作を理解できることでしょう。

しかし、本当にswitch文で書かれたコードが **「読みやすく」** なっているでしょうか。
さらに言えば **「保守しやすく」** なっているでしょうか。
上述のコードを参考にswitch文の害悪について考察してみましょう。

## switchの弱点
- コピペでコードが書ける、コピペを強要する
    - 個人的には最大の問題点だと思います
    - 上述のサンプルコードが `case` から `break` までコピペで書かれたコードであることは想像に難くないでしょう
    - switch文そのものを書き換えない限り、 **保守する側にもコピペを強要します** 
    - コピペの結果、条件分岐や処理が増えるにつれて倍々にコードが増えていきます
- 状態を全列挙する必要がない
    - サンプルでは `case hoge: ` が記述されておらず `default` に含まれてしまっています
    - コードを読む側には `case hoge:` が **記述されていない意図** がわかりません（バグなのか仕様なのかすら判断できないためコメントなどで補足があるべきでしょう）
    - 意図しないバグの原因になりますし、コードを保守する際にも落とし穴になりえます
    - サンプルコードはたかだか5分岐程度ですが、10も20も条件分岐していたらもはや大混乱です
- フォールスルー問題
    - 言語によっては `break;` を抜かすことができてしまいます

## ちなみに、if文ならこう書ける
上述のswitch文をリファクタリングしてみましょう。

```c:
if (hogehoge_state < hoge) {
    var = hogehoge_state;
    i++;
    j++;
} else {
    var = 0;
}
```

たしかに、if文による条件分岐を読み解くのにswitch文ほどには直感的ではないため、立ち止まって考える必要があるかもしれません。
しかしながら、コピペいらずで、機能も追加しやすく、読む側にも意図が明確に伝わり、圧倒的に保守しやすいコードになっています。

## まとめ
Qiitaに投稿したりコメントしたりするレベルの方々にとっては「なんて幼稚な話なんだ」と呆れられることかと思います。
しかしながら、実際にこんなコードでお金をもらっている人々がいるのも事実。

switch文についてググればC言語のみならず実にさまざまな言説を見かけますが、実際にサンプルのようなコードをこれでもかと言うほどにたくさん見ている身としては、安易に

**「switch文を使えば条件分岐がわかりやすく記述できる」** 

などと宣伝して欲しくはないと思わせられる今日この頃です。

もちろん、うまく使えばとても便利なことも承知していますが、メリットデメリットについてきちんと伝えることが大事なのではないでしょうか。
要するに **使い所の問題** だと思うのです。

## おまけ
switch文について涙を流しながら参考にするページが時々あります
[私はswitch文が嫌い](http://qiita.com/nonbiri15/items/4cb1b317fcb88f270a55)
[switchを消すメイキング的な話](http://qiita.com/sasanon/items/3a6ff6dc54b4fd8bafdb)
[Android]音量変更のアウトプットの設定

##経緯
音が出るアプリでメディアの音量を調整したいのに着信音が変化してしまう。
そんなことってありますよね。

##対応
音の出る画面のActivityで
```
setVolumeControlStream(AudioManager.STREAM_MUSIC);
```
これで大丈夫。ちゃんとメディア音量が変化するようになります。

あれ？効果音だけ大きい？
それはきっとSoundPoolのAudioAttributesがUSAGE_MEDIAになってないんじゃないかな？
```
AudioAttributes audioAttributes = null;
        if (android.os.Build.VERSION.SDK_INT >=　android.os.Build.VERSION_CODES.LOLLIPOP) {
            　　audioAttributes = new  AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
            .build();
            soundPool = new SoundPool.Builder().setAudioAttributes(audioAttributes).setMaxStreams(1).build();
        } else {
            //ロリポップより前のバージョンに対応するコード
            soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
        }
```

参考
[Handling Changes in Audio Output](https://developer.android.com/guide/topics/media-apps/volume-and-earphones.html)
[AudioManager](https://developer.android.com/reference/android/media/AudioManager.html)
CentOSで起動と同時にネットワーク設定がされない（eth0が起動しない）ときの対処

# CentOSで再起動すると、Termでアクセスできないことがある
セットアップの際に、手動でネットワーク設定するとなるらしい。

## 対処
次のファイルを編集する。

```
vim /etc/sysconfig/network-scripts/ifcfg-eth0
```
ONBOOTをyesに修正。

```
ONBOOT=no
```
↓

```
ONBOOT=yes
```
## 参考URL
http://hacknote.jp/archives/4328/
YYYYMMDD形式で保存された日付ディレクトリをローテートしたい（削除・圧縮）

# dateコマンドを利用して日付名ディレクトリを削除・圧縮したい

毎日保存されるSQLログがディスク圧迫の原因になっていたのでローテートスクリプトを作成して対処しました。
というのも、本来ローテートすべきログをそのままにしていたためです。
大きく分けてスクリプトの内容は圧縮・削除がメインです。

## findコマンドではなくdateコマンドを利用した理由
ファイルやディレクトリ検索のコマンドといえばfindですが、今回このコマンドは使用しませんでした。
findコマンドは、”タイムスタンプを参照して指定した日付より古いファイルを削除する”みたいなことができます。
しかしながら、それはあくまでタイムスタンプを参照します。
そのため、削除したくないファイルであっても指定した期間より古ければ削除対象になってしまいます。
あくまで、```YYYYMMDD```形式で一定期間より古いとされるディレクトリを削除させたかったので、今回はdateコマンドで日付を取得させる方針にしました。

#### dateコマンドにした理由のちょいまとめ
* 削除対象ディレクトリ内に”削除したくない”ファイルが存在していたから
* 削除対象のディレクトリはあくまで```YYYYMMDD```形式のものだったから



## デイリーでちょうど二年前のディレクトリを削除し、ちょうど一ヶ月前のディレクトリを圧縮する

#### ローテート方針
* ちょうど一ヶ月前の日付ディレクトリを圧縮していく
* ちょうど二年前の日付ディレクトリを削除していく
* cronに設定し、dailyで実行する
* 圧縮後のディレクトリ名は```"YYYYMMDD.zip"```にする
* 圧縮後、元のディレクトリは削除する

以下の場所に作成したスクリプトを配置しました。
これで毎日、「一ヶ月前の日付ディレクトリが圧縮され、一年前の日付ディレクトリが削除され続ける」ようになります。


```/etc/corn.daily/zip.sh
#!bin/sh
date1=`date "+%Y%m%d" -d "1 month ago"`
date24=`date "+%Y%m%d" -d "24 month ago"`
rmdate732=`date "+%Y%m%d" -d "732 day ago"`
logdir=＜対象ディレクトリ＞
zip -r "$logdir$date1".zip $logdir$date1
rm -rf $logdir$date24
rm -rf "$rmdate732".zip
rm -rf $logdir$date1
```
***※```rm -rf```コマンドが含まれています。実行する場合はご自身の環境に合わせて一度テストなどするようにしてください***

## 二年以上前のディレクトリを削除する（一度だけ実行する）
デイリーでのローテート設定は完了しました。翌日以降、対象ディレクトリが圧縮・削除されていれば問題ないです。
しかしまだ終わりではありません。私が作業している環境だと、二年以上前となった日付ディレクトリがたくさん残っています。
実質これらが圧迫の主な原因な上、削除対象なので削除してしまいたいと思います。

* 例：2017/2/17（当日）→　～2015/2/16までを削除。

任意の場所に以下のスクリプトを作成しました。このスクリプトは一度実行すれば削除対象のディレクトリが削除されます。

```delete_24month_ago.sh
#!/bin/sh
#2年から6年前までのディレクトリを削除する

a=731
cd 対象ディレクトリ
while [[ $a -ne 2190 ]]; do

  a=`expr $a + 1`
  dateRoop=`date "+%Y%m%d" -d "$a day ago"`

    if [[ -e $dateRoop ]]; then
      rm -rf "$dateRoop"* 2>> /home/USERDIR/rotate.log
    fi

done
cd ~
```

***※```rm -rf```コマンドが含まれています。実行する場合はご自身の環境に合わせて一度テストなどするようにしてください***

## 一ヶ月前から二年前までのディレクトリを圧縮する（一度だけ実行する）
ここまでの作業を実施すると、以下のような状況になっているかと思います。

* 二年以上前までの日付ディレクトリは削除されている
* 翌日から、ちょうど一ヶ月前の日付ディレクトリは圧縮される
* 翌日から、ちょうど二年前の日付ディレクトリが削除される

つまり、この時点ではまだ何もされず残っている日付ディレクトリが存在しています。


つまり、***一ヶ月前～二年前までの日付ディレクトリ***です。
これらのディレクトリも圧縮しておけば、整合性が取れるので作業完了です。

このスクリプトも任意のディレクトリに作成します。このスクリプトは一度実行すれば対象のディレクトリが圧縮されます。

```
#!/bin/sh
a=31
cd ＜対象ディレクトリ＞
while [[ $a -ne 732 ]]; do

  a=`expr $a + 1`
  dateRoop=`date "+%Y%m%d" -d "$a day ago"`

    if [[ -e $dateRoop ]]; then
      zip -r "$dateRoop".zip $dateRoop 2>> /home/USERDIR/rotate.log
    fi

  rm -rf $dateRoop 2>> /home/USERDIR/rotate.log

done
cd ~
```

***※```rm -rf```コマンドが含まれています。実行する場合はご自身の環境に合わせて一度テストなどするようにしてください***

## おわりに
dateコマンド、意外と便利なんだなーと思いました。「タイムスタンプで検索して古いもの削除～」とするなら、findコマンドのほうがあっさり終わりそうですね。
実際、ネットでdateコマンドを利用してファイルやらを削除する話はあまりみられませんでした。
※単にもっと簡単なやり方があるだけなのかもしれませんが・・・

ともあれ誰かの役に立つことがあればと思います。
技術書読書会 #3 Infrastructure as Code

#技術書読書会 #3 Infrastructure as Code

## 技術書読書会とは
読まない技術書は、ただの鈍器だ！！と、昔しゃべる豚さんが言っていました。

技術書を最後まで読み切る事は意外と大変です。一人なら無理だけどみんなの力があればできるかも・・・。
そんなことを誰が思たのか、ともあれそんな気持ちに賛同したメンバーが１冊の技術書を読み込むという結構ハードルの高いことにチャレンジをしていきます。

## 技術書読書会の進め方
eXtreme Readingの方式で進めていきます。

### 実施方法
以下の流れで読書をしていきます。

```
1. 0分～5分間で、今回読み進める章/節を発表する
2. 15分～30分間で、読書
3. 5分～10分間で、ディスカッション
4. 1～3を時間分繰り返す
5. まとめ
```

今回の読書会は、所要時間30分で以下の配分で行いました。

```
1. 5分間で、今回読み進める章/節を発表する
2. 15分間、読書
3. 5分間、ディスカッション
4. 10分間、まとめ
```

### 利点
eXtreme Readingの利点です。

- 事前の準備がいらない。
- ディカッションをすることにより理解を深める事ができる。参加者全体の理解度の底上げが期待できる。
- 時間を区切って進行するので、読書の進捗が一定となり本の読み終わり時期を予測することができる
- みんなでやればなんとかなる


## 今回読む書籍
[Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス](
https://www.amazon.co.jp/Infrastructure-Code-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%90%E7%AE%A1%E7%90%86%E3%81%AE%E5%8E%9F%E5%89%87%E3%81%A8%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-Kief-Morris/dp/4873117968/ref=sr_1_1?ie=UTF8&qid=1491455639&sr=8-1&keywords=Infrastructure+as+Code)

## 参加人数
6人

## 所要時間
30分

## 進捗
2.3 - 2.4.5

## ディスカッション

### 2.3.2 ストレージリソース
峯　ストレージの容量の監視について改めて考えさせられた。AWS Cloud watchで確認できるけれど活用できてないよね。
飯　ここで言っているダッシュボードとは、AWS Cloud watchのように標準で用意されているものなのか自前で用意するのかがわからなかった。
峯　多分どっちでもいいのかと思う。ただ、ダッシュボードを見る癖がないんだよね。
岡　これ、5.3.1「情報ラジエーターとは何か」の事ですか？出番であるって書いてあるから
岡　こういうのを見ていって、残すか捨てるか
飯　結構管理していると、ここにもコストとかかっているのかってあるじゃないですか
峯　会社的に好きなのは、1年後はどうなっているの2年後はどうなっているの利用量の上昇率どれくらいなのみたいなの。わかればコストが見えてきて判断できる。こういった話が好きじゃないですか

### 2.3.2.3 ネットワーク化されたファイルシステム
飯　ちょうどしようかと思っていた。
岡　影響やエラーシナリオも必ずテストするというのが大事かなと、改めて
岡　結局、使い勝手だけ見て構築しない事が重要

### 2.3.3 ネットワークリソース
岡　ぜんぜん関係ないんだけど、ロードパランシングじゃないよね。
飯　結構脱字が多い
飯　SDNの言葉の意味が分からなかった。まあ、どっちかというと四角い線の中のほうが身に染みた。

```
wikipediaより

Software Defined Networking（ソフトウェア・デファインド・ネットワーキング、SDN）はコントローラと呼ばれるマシンで
動作する制御用ソフトウェアにより、物理ネットワークを制御する技術のことである。2008年にカリフォルニア大学バークレー校と
スタンフォード大学で研究が開始された。SDNはコントロールプレーンからデータプレーンへのコミュニケーションを必要とし、その
通信プロトコルの一つとしてはOpen Flowが存在する。現在は、Open Networking FoundationによってOpenFlow規格の策定と
SDNの推進が進められている
```

岡　そうですね。うちもそうなんで
飯　手作業で
岡　物理サーバーで、ネットワークマネージャーコマンドをバシバシ叩いて一つずつ設定していく感じ
岡　それだったら、定義ファイルなんか用意しておいて・・・そっちのほうがいい気がします。
峯　今のプロジェクトでは、AWS Cloud Formationでやってみている。開発環境や本番環境は定義ファイルから構築できる
岡　お金がどこまでかかるかによりますよね。
飯　それもありますよね
峯　そうだね。AWS Cloud Formationだと、AWSに環境構築しちゃうからね。

## 気づき

* 区切りの良いところで区切るために 読書時間をフレキシブルにするのも良いかも
* 今回の読書会では1ページ2分30秒として計算中

## まとめ
リモートの人がいるが、通信がうまくいかずに会話になかなか入ってこれない。試行錯誤中！明日はSkypeを利用してみる。通常業務ではappear.inを利用しているが、読書会で映像のプライオリティーは低いのでskypeで音声のみを流してみる。ただ、映像がないのは寂しいと思うので、途切れるとは思うがappear.inで映像は流しておく。
CRM(F-Revo)をLightsailで導入した

# はじめに
F-RevoCRMとは（引用 https://f-revocrm.jp/）
> F-RevoCRM は、世界中で活用されている vTigerCRM をベースに、日本の企業文化に合わせてシンキングリードが独自のカスタマイズを行った、フリー＆オープンな高機能CRMアプリケーションです。

このCRMをインストールしてから運用するために実施した内容をまとめておきます。
インストール手順は公式ページを参照ください。

## 環境
**サーバ**
　AWS Lightsail（RAM：1GB, SSD：30GB, 転送量：2TB）
　リージョン：バージニア

**ミドルウェア**
　Apache2.4
　MySQL5.6.35
　PHP5.6
*※最初PHP7でインストールを実施したところ、バージョン対応していないらしくインストール時点でコケたためPHP5.6で導入しました。*

## 前提
CRMのユーザは社員であり、社内・社外からアクセスする

## セキュリティ設定

* 常時HTTPS接続
* 社外IPからのアクセス時はダイジェスト認証
* サーバ証明書（Let's encrypt）
* iptablesでファイアウォール設定
　*※LightsailのGUIコンソールでネットワーク設定もできますが高度な設定ができないためにiptablesを使用しました*

## バックアップ設定

* Lightsailで使用できるスナップショットを利用
* データベースはmysqldumpを定時実行

## 運用設定

* F-Revoログ出力設定
* 証明書自動更新設定

## 懸念点（特にLightsail）
Lightsailのスペックに限界がきた場合、スケールアップする可能性があります。
2017年4月段階で、LightsailのスケールアップはAPIからしか実施できないのが注意点です。
さらに、DBをインスタンスから切り離したいとなると、VPC Peeringを経由させる必要があったりするので若干複雑化します。
また、スナップショットでサーバを復旧させた場合（復旧と言っても新規インスタンスとして立ち上がる）、Public IPが変わります。Static IPを設定するかDNS Zoneを設定する必要が出てきますね（IPもDNSもLightsailで設定可能です）。

## おわりに
今のところ特に問題は発生してないです。F-Revoの推奨スペックはRAM4GBと記載がありますが、そこも特に問題はないです。
ただし、Lightsailのリージョンがバージニアのため、コマンド入力に微妙にタイムラグがあってストレスが溜まります。。。
Date, DateTime, Timeでの加算の違い

rubocopで`Rails/TimeZone`について怒られたのでリファクタリング。

```ruby
10:42:22 - INFO - Inspecting Ruby code style: app/models/hoge.rb
Inspecting 1 file
C

Offenses:

app/models/hoge.rb:3:20: C: Rails/TimeZone: Do not use DateTime.now without zone. Use one of Time.zone.now, DateTime.current, DateTime.now.in_time_zone, DateTime.now.utc, DateTime.now.getlocal, DateTime.now.iso8601, DateTime.now.jisx0301, DateTime.now.rfc3339, DateTime.now.to_i, DateTime.now.to_f instead.
    now = DateTime.now
                   ^^^

1 file inspected, 1 offense detected
```

`DateTime.now`を`Time.zone.now`に差し替えたら計算結果が違う！みたいなことになったので初歩的な内容だけどメモ。

### 環境
```zsh
$ rbenv version
2.3.4
$ rails -v
Rails 4.2.8
```

### 検証

```ruby
# Dateオブジェクトに10加算すると10日加算される
[39] pry(main)> today = Date::today
=> Tue, 18 Apr 2017
[40] pry(main)> today + 10
=> Fri, 28 Apr 2017

# DateTimeオブジェクトに10加算すると10日加算される
[41] pry(main)> now = DateTime.now
=> Tue, 18 Apr 2017 10:57:37 +0900
[42] pry(main)> now + 10
=> Fri, 28 Apr 2017 10:57:37 +0900

# Timeオブジェクトに10加算すると10秒加算される
[43] pry(main)> now = Time.zone.now
=> Tue, 18 Apr 2017 10:57:59 JST +09:00
[44] pry(main)> now + 10
=> Tue, 18 Apr 2017 10:58:09 JST +09:00
```

そもそもこういう、数字を直接加算するのは直感的ではないので以下のように書き換えたほうがいい。

```ruby
[45] pry(main)> now = Time.zone.now
=> Tue, 18 Apr 2017 11:10:09 JST +09:00
# ちゃんとActiveSupportの機能を使う
[46] pry(main)> now + 10.days
=> Fri, 28 Apr 2017 11:10:09 JST +09:00
```

以上。

### 参考
- [DateTime に月、日、時、分、秒を足す。 - こせきの技術日記](http://koseki.hatenablog.com/entry/20080527/date)
- [RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い - Qiita](http://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c)
- [Class: RuboCop::Cop::Rails::TimeZone — Documentation for rubocop (0.47.1)](http://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Rails/TimeZone)
Mastodonの/aboutでローカルTLを表示するUserScript

ローカルTLチラ見ツールづくりが流行ってるようなので。

https://gist.github.com/unarist/6d06ad73945b5a369f6d593b1a2cfba8

UserScriptが何か、どう使うかは適当にググってくださいね。

## つかいかた

非ログイン状態でアクセスした時のトップページである /about のユーザー登録フォームにリンクが追加されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/25051/7d5fac0c-e232-e70d-a8ef-9c19fecee888.png)

で Preview local TL をクリックすると、インスタンスのロゴの下にタイムラインが出ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/25051/c7b42e13-5abc-8e55-8376-b75ee4fa6252.png)

ヘッダ部分（Local TL ...）をクリックすると閉じます。

今のところリアルタイム更新とか続きを読むとか洒落た機能はついていませんが、閉じて開きなおすと改めて読み込むので、リロードはそれで。

## 特徴

ユーザーページを非ログイン状態で見たときのDOM構造をだいたい再現しているので、そういう感じに表示されます。インスタンスのカスタマイズや[kktCSS](http://qiita.com/emerald_magic/items/27d233870e04d791fe2b)みたいなのも反映されます。あとCWやNSFWも軽く対応してます[^1]。

逆に言えば、デフォルトのDOM構造やスタイリングにひどく依存しているので、インスタンスによっては（リンクやTLの挿入先を見つけられず）動かないとか、見た目があれなことになるかもしれません。何かしらの手段で報告してもらえればなにか考える...かもしれません。

なおこのような形で組み込む都合上、`@match` の指定が `https://*/about` と超広いです。適当にチェックして Mastodon っぽくなければ離脱してはいますが、気になる人は `@match` を個別に指定するか、Bookmarklet 化するとよいかと[^2]。

## そのうち改善しそうなところ

- 続きを読む
- 表示リンクとヘッダが離れてて更新がだるい（リロードボタンつけてもいいかも）
- 画像のlightbox的なやつ（ユーザーページにもないけど）

まあ、https://github.com/tootsuite/mastodon/issues/1053 が実装されたらいらなくなるんでしょうけど。


[^1]: DOM再現すれば動いてくれるかと思ったけどそんなことはなかったので自前実装
[^2]: CSPが厳しいサイトでは厳しいかもしれない（ので `@require` つけた）
Hyper-V上のCentOS7+Dockerのバックアップが失敗する

# はじめに
　なんでか分からないけど、Hyper-V上のCentOS7のWindowsServerバックアップが失敗する。しかもDockerを動かしているクライアントだけが。
# 構成
ホストOS：WindowsServer2012R2
クライアントOS：CentOS7（kernel-3.10.0-510.10.2.el7.x86_64） on Docker（version17.3）
# 症状
- ライターで一時的でないエラーが発生しました。バックアップ処理を再試行しても、
おそらくエラーは再発します。
- 仮想マシン 'XXX' のバックアップ チェックポイントを作成できません: エラーを特定できません (0x80004005)。

　などと申しており、バックアップに失敗します。Dockerを入れていない同じカーネルのCentOSは失敗していません。
# 原因
　最初はホスト側に問題があるんじゃないかと思ったりもしたんですが、WindowsUpdateに該当しそうなパッチも無いし、メモリが足りんとかって訳でもなさそう。

　じゃあクライアント側かってことで、ログを漁ってみると…。audit.logにこんな奴がおりました。

`type=AVC msg=audit(...): avc: denied { search } form pid=000 comm="hypervvssd" name="docker"...`
`type=AVC msg=audit(...): avc: denied { read } form pid=000 comm="hypervvssd" name="docker"...`

　hypervvssdって明らかにHyper-V関係ですよね。調べてみると初期インストール時に含まれている「hyperv-daemons」ってパッケージの一部で、シャドウコピー作成時に動作するサービスのようです。（参考：https://docs.oracle.com/cd/E39368_01/e59456/section_dzn_tz2_kp.html）
　systemctlからステータスを見てみますと`Hyper-V VSS: FREEZE of /var/lib/docker/overlay failed; err:13 Permission denied`ってエラーで止まってました。

　以上のことからhypervvssdサービスがdocker関係（/var/lib/docker/overlay）のシャドウコピー作成時にselinuxに拒否られて止まってしまうのが原因ではないかと思われるといったとこでしょうか？
# 解決策
1. setroubleshootなるものを入れてもう1日放置（`yum install setroubleshoot`）。
2. setroubleshootが/var/log/messagesに吐き出したsuggestsを確認。 `*** Plugin catchall (100. confidence) suggests ***`って解決方法のヒントが見つかるはず。今回は、selinuxにポリシーを追加せよと仰せでした。
3. ポリシーを追加するためにまずはpolicycoreutils-pythonをインストール（`yum install policycoreutils-python`）し、audit2allowコマンドが実行できるようにする。
4. 次にsuggestsの言う通りに`ausearch -c 'hypervvssd' --raw | audit2allow -M my-hypervssd`でaudit.logからポリシーファイルを生成。
5. `semodule -i my-hypervssd.pp`でselinuxにポリシーを追加。

　以上で、翌日以降のバックアップは無事正常終了するようになりましたとさ。
# まとめ
- Hyper-V上のLinuxのシャドウコピーはクライアント側のhypervvssdサービスが関わってるよ。
- Dockerを入れている場合、hypervvssdがselinuxに引っかかるよ。
- WindowsServer側のログを見ただけじゃ、エラーの原因はさっぱりだよ（見当違いの原因を探しまくったよ）。
マストドン楽しいけど、テクノロジーよりも文化的構造が面白い

Railsの応用例として面白いとか、P2Pじゃなくてがっかりだぜとか、色んな意見を読みましたが、やっぱり一番面白いのはpawoo.net周りの異文化摩擦とその調整に向けた動きだと思う。

federatedであることの意味って、やはり多様なユーザに、多様なコンテンツポリシーを持った多様なインスタンスが応える、というところにあるのだ。Qiitaに相応しいネタよりもその辺の方が格段に面白いので、ぜひpawoo.netとmastodon.cloudとあとなんか[サーバ一覧](https://instances.mastodon.xyz/list)から、マイナーだけど活きてるインスタンスのどれかひとつくらいに登録して、数時間くらい泳いでみると良いと思う。

えっちなのが好きな人はぱうーは最後にした方が良いよ。
Swiftでの外部サービス連携したファイル添付(iCloud、Googleドライブ、Dropbox等)

## はじめに
こちらは Xcode8.3.1 Swift3.0 で開発したものになります。

今回開発中に、「いろんな添付ファイルをアップロードしたい。」という要望がありました。そこで、どのようなものがいいかなと考えていたら、slackみたいな添付ファイルアップロードシステムを作りたいと思い、調べはじめしました。実装とハマったことを記載します。
ゴールの完成イメージが画像は、下記の画像になります！

<img width="320" alt="Image uploaded from iOS (8).jpg" src="https://qiita-image-store.s3.amazonaws.com/0/115405/9bbed349-af4c-dcd2-a1ad-030e3472db6c.jpeg">


## 今回の実装
今回はappleで基準の `UIDocumentMenuViewController` を使って作成しました。
それに加えて、photoLibraryにもアクセスできるようにした。
下記が実装のソースコードです！

```
let importMenu = UIDocumentMenuViewController(documentTypes: ["public.image", "public.audio", "public.movie", "public.text", "public.item", "public.content", "public.source-code", "public.data"], in: .import)
        importMenu.delegate = self
        importMenu.addOption(withTitle: "Choose From Library", image: UIImage(named: "picture")!, order: .first, handler: {
            let status = ALAssetsLibrary.authorizationStatus()
            if status == ALAuthorizationStatus.restricted || status == ALAuthorizationStatus.denied {
                // アクセス許可されていない
                // ユーザー自身にカメラへのアクセスが許可されていない
                self.showErrorAlert(msg: NSLocalizedString("cameraRollNonSet", comment: "cameraRollNonSet"))
            } else {
                // アクセス許可あり
                // ユーザーがアクセス確認をしていない
                if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) {
                    let controller = UIImagePickerController()
                    controller.delegate = self
                    controller.sourceType = UIImagePickerControllerSourceType.photoLibrary
                    self.present(controller, animated: true, completion: nil)
                }
            }
        })
        // iPad対応
        importMenu.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
        importMenu.popoverPresentationController?.sourceView = self.view
        importMenu.popoverPresentationController?.sourceRect = CGRect(x: self.view.bounds.size.width / 2.0, y: self.view.bounds.size.height / 2.0, width: 1.0,  height: 1.0)
        self.present(importMenu, animated: true, completion: nil)

```

## ２つのはまりポイント
1. icloudの許可をしてあげないとクラッシュする
2. 添付ファイルの形式を指定してあげないといけない

#### 1.icloudの許可をしてあげないとクラッシュする
Xcode側で許可しないとアプリでクラッシュしてしまいます。その対応は、下記になります。現在、icloudがOFFになっている人は、ONに変更してください。そうすれば問題なく開くようになるはずです！

<img width="754" alt="icloud.png" src="https://qiita-image-store.s3.amazonaws.com/0/115405/b24489d1-691f-3155-c00a-0ab429911e65.png">

#### 2.添付ファイルの形式を指定してあげないといけない
このdocumentTypesで、アップロードできる形式を決めるように見えます。（確かなことを言ってる気がしない。。）
今回は、画像やテキスト等を全て選択できるようにしています。これを設定されていないと、icloudを開いても、特定のファイルが選択できなくようになってしまうので注意してください。

`documentTypes: ["public.image", "public.audio", "public.movie", "public.text", "public.item", "public.content", "public.source-code", "public.data"]`

## 添付したタイミングでの情報取得方法
メソットであります、添付する時に、端末に保存して内部URLを返してくれます。ここで形式を判定してあげるのもいいかもしれないです。ソースコードは、下記になります。
```public func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) { } ```

## 最後に
ぜひとも参考していただると嬉しいです。何か間違え等あったら教えてくださいmm
活性化関数をグラフ化

#概要
活性化関数をグラフ化してみた。

#写真
![figure_1-1.png](https://qiita-image-store.s3.amazonaws.com/0/18104/edf31179-6cf5-3b88-2479-939b81e79b2b.png)

#サンプルコード

```
import matplotlib.pyplot as plt
import numpy as np

def tanh(x):
    return np.tanh(x);
def relu(x):
    return np.maximum(0, x)
def sigmoid(x):
    return 1.0 / (1.0 + np.exp(-x))
x = np.linspace(-1.0, 1.0, 100)
plt.plot(x, tanh(x), label = "tanh")
plt.plot(x, relu(x), label = "relu")
plt.plot(x, sigmoid(x), label = "sigmoid")
plt.legend()
plt.show()

```
Python > sys.path > モジュールを検索するパスを示す文字列のリスト

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 3078 / 12833)

> Where does Python look for files to import? It uses a list of directory names and ZIP archive files stored in the standard sys module as the variable path.

試してみた。

http://ideone.com/ymwEWM

```py
import sys
for place in sys.path:
	print(place)
```

```txt:run
/home/aE6sH9
/usr/lib/python35.zip
/usr/lib/python3.5
/usr/lib/python3.5/plat-x86_64-linux-gnu
/usr/lib/python3.5/lib-dynload
/usr/local/lib/python3.5/dist-packages
/usr/lib/python3/dist-packages
```

参考: [sys.path](https://docs.python.jp/3/library/sys.html?highlight=sys%20path#sys.path)

> モジュールを検索するパスを示す文字列のリスト。 PYTHONPATH 環境変数と、インストール時に指定したデフォルトパスで初期化されます。
Python > try: / except:

### except:

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2903 / 12833)

`try:`と`except:`の使い方が掲載されている。

試してみた。

http://ideone.com/mhkPBd

```py
alist = [ '7of9', 'Janeway', "B'Elanna Torres" ]
position = 5
 
try:
	print(alist[position])
except:
	print("Position is out of range")
```

```txt:run
Position is out of range
```

### except exceptiontype as name:

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2919 / 12833)

試してみた。

http://ideone.com/rhOmZ8

```py
alist = [ '7of9', 'Janeway', "B'Elanna Torres" ]
position = 5

try:
	print(alist[position])
except IndexError as err:
	print("Position is out of range")
except Exception as other:
	print("Something doesn't sit right well.")
```

```txt:run
Position is out of range
```

### 公式ドキュメント

参考: [5. 組み込み例外 @  Python >> 3.6.1 >> ドキュメント >> Python 標準ライブラリ](https://docs.python.jp/3/library/exceptions.html?highlight=indexerror)
プログラミング学習記録2日目

なんでもチャレンジということでUdacity講座受講。英語苦手なのに。
今までが苦手なだけ、要はこれから。
新しいことに常に触れ続け自分なりに考察する。これが今の私。

<h3>Python</h3>
変数宣言がシンプル : name = 'tanaka'
表示もシンプル : print(name)
変数名のつけ方
○アルファベットから始まる : name , book
❌数字から始まる : 1name 

比較演算子
x == y : xとyが同値
x != y : xとyが同値ではない　

条件式の注意点
if x == 40: ←コロン　;じゃない

真偽値は頭文字が大文字 :True , False

<h3>Udacity</h3>
講座名 : Responsive Web Design Fundamentals
必要tools : Chrome DevTools と Udacity Front End Feedback Extension
Chrome DevToolsショットカットキー一覧↓
https://developers.google.com/web/tools/chrome-devtools/shortcuts 

Chrome DevTools :　
サイトのhtmlやcssなどのサイト構成が丸わかり。
Device選択、オリジナルDeviceも設定できるのでweb関連の開発に使える。

Q.なぜ responsive design が重要なのか？
A.様々なデバイスでもサイトを気持ちよく見るために。　
It's for users to see websites comfortably.

device independent pixels(dips) : ブラウザの画素数
Hardware pixels : moble　や　pc 等の機器自体の画素数

inconsistent : 矛盾した
技術英語 > or [at the very least] complain a lot!

@ http://thecodist.com/article/the-six-goals-of-every-programming-project

> or **at the very least** complain a lot!

http://eigoboost.com/at-least-english/
> at least (最低でも・少なくとも)のちょっと強い言い方。意味はあまり違わないけどもっと強い言い方なので何かが最低な基準みたいなニュアンスがする。「本当に本当に最低でも…」って感じだ。

...

usabilityに問題があり、ユーザが欲しい機能があったとしても使えない場合、上記のようになるとのこと。

どうするかというと

> You might have to test your designs, or at least spend time understanding who they are and how they might approach what you are giving them. 

ユーザ自身のことをよく理解しないと良い設計は生まれない。

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

http://qiita.com/7of9/items/5f968683f2968cde26e4
>  it’s almost to the point