OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi 3にCentOS入れてみた

Raspberry Piには普段raspbianを入れて遊んでいるのですが、CentOS触ってみたくなったので試してみた。

用意したもの
+ パソコン
+ ラズパイ
+ まいくろえすでぃーかーど
+ その他接続するのに必要なもの


## まずはイメージファイル
http://mirror.centos.org/altarch/7/isos/armhfp/ からRaspberry Pi 3のイメージファイルをDL。

## イメージファイルの解凍
xzファイル解凍したいのでbrewで入れる。(Centの人yumでも入った)

```bash:ターミナル
$ brew install xz
```

解凍する。

```bash:ターミナル
$ xz -d CentOS-Userland-7-armv7hl-Minimal-1603-RaspberryPi3.img.xz
```

CentOS-Userland-7-armv7hl-Minimal-1603-RaspberryPi3.img 的なものができる。

## microSDに書き込み

CentOS-Userland-7-armv7hl-Minimal-1603-RaspberryPi3.imgをmicroSDに書き込む。

```bash:ターミナル
# デバイス名確認(今回は/dev/disk2)
$ diskutil list

$ diskutil unmountDisk /dev/disk3
$sudo dd bs=1m if=~/Desktop/CentOS-Userland-7-armv7hl-Minimal-1603-RaspberryPi3.img of=/dev/disk3
Password: ****
    ・
    ・
diskutil eject /dev/disk2
```


## sshで接続してみる

まずはip調べなきゃ。

システム環境設定 -> 共有 -> インターネット共有にチェックを入れる。
<img width="638" alt="スクリーンショット 2016-10-10 0.33.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/108495/e074ab44-006c-9a5e-3bc9-cfe0c7fbbd56.png">

```bash:ターミナル
# ipアドレスを調べる
$ ifconfig
bridge100: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
  options=3<RXCSUM,TXCSUM>
  ether 7a:31:c1:0c:37:64
  inet 192.168.2.1 netmask 0xffffff00 broadcast 192.168.2.255
    ・
    ・

$ arp -a
web.setup (192.168.0.1) at 1c:b1:7f:ff:7a:67 on en0 ifscope [ethernet]
? (192.168.0.5) at (incomplete) on en0 ifscope [ethernet]
? (192.168.0.6) at a8:20:66:16:d0:b4 on en0 ifscope [ethernet]
? (192.168.0.255) at (incomplete) on en0 ifscope [ethernet]
? (192.168.2.10) at b8:27:eb:95:40:21 on bridge100 ifscope [bridge]
? (192.168.2.255) at (incomplete) on bridge100 ifscope [bridge]
? (224.0.0.251) at 1:0:5e:0:0:fb on en0 ifscope permanent [ethernet]
? (239.255.255.250) at 1:0:5e:7f:ff:fa on en0 ifscope permanent [ethernet]
broadcasthost (255.255.255.255) at (incomplete) on en0 ifscope [ethernet]
```

192.168.2.10っぽい。

ユーザ名 : root
パスワード : centos

で接続する。

```bash:ターミナル
$ ssh root@192.168.2.10
root@192.168.2.10's password:centos
```

ログインできた⭐️

デフォルトだと容量的に良くないらしい。

https://wiki.centos.org/SpecialInterestGroup/AltArch/Arm32
にちゃんと書いてた。

```bash:ターミナル
$ touch /.rootfs-repartition
$ systemctl reboot
```

使用率が38% -> 6%に(● ˃̶͈̀ロ˂̶͈́)੭ꠥ⁾⁾


## まとめ
簡単:;(∩´﹏`∩);:
次回色々試して遊んでみようかと。
機械学習論文読みメモ_5

[Robust Random Cut Forest Based Anomaly Detection On Streams](http://jmlr.org/proceedings/papers/v48/guha16.pdf), ICML 2016
robust random cut tree(RRCF)に基づくストリームデータの異常検知手法を提案する。
RRCFはIsolation Forestと類似しているが、各ステップにおける次元選択時に各次元のデータ分散幅に基づいた重み付け分布を用いる。
またその分割の軌跡を木構造で構築し、それを大量に作りアンサンブルする事でforestを作る。
このRRCF構造は、データ分散幅に基づく距離の定義の利用で、その距離が大きければ少なくともある2点がマンハッタン距離以上は離れている事が言える。
この事実を利用してさらに任意のLp(p>1）距離に関してもそれが大きい場合はRRCFにおけるisolationが早くなる事も言える。
またオンライン監視を意識した、保持するサンプルの取捨、またそれに伴う木構造変化に関して、生成確率的に一貫したサンプル取捨後の木構造を効率よく計算する手法を提案する。
この手法では、確率分布を替えないようにするだけでなく、サンプル取捨前後で構造が近い事を要求する。この要求を満たすためにはデータ分散に応じた次元選択がキーとなる。

[Scalable Variational Inference in Log-supermodular Models](http://www.jmlr.org/proceedings/papers/v37/djolonga15.pdf), ICML 2015
log-supermodularモデルにおけるapproximate bayesian inferenceを扱う。
このモデルは2値変数におけるマルコフ確率場を扱い、さらに高い次数の相互関係を学習出来る。
このモデルの適用例としては画像セグメンテーションがある。
log-supermodularモデルの１つであるL-Fieldは劣モジュラ関数の微分を用いて分配関数のバウンドを変分推論の枠組みで最適化するものであった。
本論ではL-Fieldにおける変分推論を良く研究された劣モジュラ最小化に関する最小ノルム問題に帰着出来る事を示した。
この事実を利用し、より効率的な最適化を可能にした。
さらにL-Fieldは特定のRenyi距離を正確に最小化出来る事を示した。
CentOS6.6へのphantomjsのinstall方法



```bash
su -
```

```bash
cd /usr/local/src/
```

```bash
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/phantomjs/phantomjs-1.9.2-linux-x86_64.tar.bz2
```

```bash
tar jxfv phantomjs-1.9.2-linux-x86_64.tar.bz2
```

```bash
cp phantomjs-1.9.2-linux-x86_64/bin/phantomjs /usr/local/bin/
```

```bash
yum install freetype
```

```bash
yum install fontconfig
```

confirmation

```bash
phantomjs --version
```
emoji on Fedora

```
============================== N/S Matched: emoji ==============================
nodejs-emojione-awesome.noarch : Emojione awesome
nodejs-emojione-ios.noarch : EmojiOne utility for iOS
google-noto-emoji-fonts.noarch : Google Noto Emoji Fonts
nodejs-emojione-meteor.noarch : EmojiOne utility for Meteor
nodejs-emojione-python.noarch : EmojiOne utility for Python
nodejs-emojione-android.noarch : EmojiOne utility for Android
nodejs-emojione-json.noarch : EmojiOne utility for Json files
google-android-emoji-fonts.noarch : Android Emoji font released by Google
ibus-uniemoji.noarch : Input method for entering unicode symbols and emoji by
                     : name
nodejs-emojione.noarch : EmojiOne is a complete set of emojis designed for the
                       : web
ibus-table-code.noarch : Ibus-Tables for Latex, CNS11643 & Emoji
```
windows上のrubygemsでsslのエラーが出て証明書の入れ替えでも上手く行かなかった場合にやった事。

## 背景

windowsにrubyをインストールする際に成功したパターン(バージョン含む)を繰り返し適応してきましたが、今回新たにインストールしたDELLのInspiron 13 5000 Seriesにインストールしようとしたらsslがらみではまってしまってそれを解決するまでの話です。

## rubyインストールからエラー発生まで

[ruby 2.3.1](http://rubyinstaller.org/downloads/)をインストールしました。

コマンドプロンプトを起動してrubygemsを更新します。
すると以下のsslに関するエラーが出ます。

```shell-session
>gem update --system
ERROR:  While executing gem ... (Gem::RemoteFetcher::FetchError)
    SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/specs.4.8.gz)
```

## 検索で見つかる対策ではうまくいかず

[windows rubygems ssl](https://www.bing.com/search?q=windows+rubygems+ssl&form=EDGNTC&qs=PF&cvid=06328fb745e14491bbd810a44f2d7056&pq=windows+rubygems+ssl&PC=DCTS)のキーワードで検索すると証明書を置き換えるという解決策が出できます。

具体的なことは[shimojさんがまとめてくれてます](http://qiita.com/shimoju/items/394818b4989b94680aaf)のでそちらを見ていただくとして、今回は残念ながらこれでは解決しませんでした。
新たにOpenSSL::X509::StoreErrorがでています。

```shell-session
>gem update --system
ERROR:  While executing gem ... (OpenSSL::X509::StoreError)
```

こちらに関してはいろいろ検索しましたがダイレクトに解決策が見つかりませんでした。

## 対策

最終的に見つかったのがこちらです。

[SSL Error When installing rubygems, Unable to pull data from 'https://rubygems.org/](http://stackoverflow.com/questions/19150017/ssl-error-when-installing-rubygems-unable-to-pull-data-from-https-rubygems-o)

- http://rubygems.org/pages/download よりrubygemsの最新のバージョンのzip形式をダウンロードします。(この時点では2.6.7でした。)
- zipファイルを展開します。
- 展開したフォルダー内で ruby setup.rb を実行します。

```shell-session
> cd  C:\Users\[username]\Downloads\rubygems-2.6.7\rubygems-2.6.7
> ruby setup.rb
```

これでもう一度 gem update --system を試してみます。

```shell-session
>gem update --system
Latest version currently installed. Aborting.
```

最新バージョンであることが確認できました。
bundlerのインストールも正常にできています。

```shell-session
>gem install bundler
Fetching: bundler-1.13.2.gem (100%)
Successfully installed bundler-1.13.2
Parsing documentation for bundler-1.13.2
Installing ri documentation for bundler-1.13.2
Done installing documentation for bundler after 11 seconds
1 gem installed
```

という事で解決しました。
effective DRPM

FedoraやopenSUSEではRPMパッケージの取得に際し、RPMパッケージ全てではなくて既存のパッケージと新規パッケージの差分（delta）パッケージを取得してローカルでRPMパッケージを生成するというDRPMを使っている。これには以下のようにダウンロードサイズを劇的に縮小する効果がある（下記だと50%と半減している）

```
(snip)
[DRPM] xorg-x11-drv-openchrome-0.4.0-1.fc24_0.5.0-1.fc24.x86_64.drpm: done                                     
[DRPM] webkitgtk3-2.4.11-1.fc24_2.4.11-2.fc24.x86_64.drpm: done                                                
----------------------------------------------------------------------------------------------------------------
合計                                                                            880 kB/s | 380 MB     07:21     
Delta RPMs reduced 767.9 MB of updates to 379.5 MB (50.1% saved)
```

ただし、これには副作用としてローカルでRPMを生成し直すことになるので、CPUを使うしディスクアクセスが遅いと非常にストレスになる可能性がある。

よく分かってないのはリポジトリ側でDRPMをどのように生成しているのか、という点。あと、差分を作る場合に特定のバージョンとのdeltaを作ることになるけど、複数バージョンに対して作ってるのか、とか。
Ubuntu で 窓替えのような機能を実装する

# Windows の 窓替え が便利すぎる
僕は ctrl + tab で窓替えを起動し、1文字入力で指定ウィンドウに切り替えをしていました。
http://www.vector.co.jp/soft/winnt/util/se431478.html

それをubuntuでも使えるようにしたい。

# m-yamashita さんの Quick.pyを利用

- LinuxでAlt+Tabとサヨナラできる！Quickey.pyを作りました。
 - http://qiita.com/m-yamashita/items/8c9b22079fb375653eb2

# なぐり書き実装
Autokeyの中で適当なスプリクトを作成して、下記のように記述。適当なショートカットキーをautokeyで割り振ってください。僕は ctrl+tab が好きです。

適当に必要箇所を変更してください。使い方は Quitck.py と同じですが、Tkinter で超お手軽スイッチャウィンドウを作ってます。

Tkinter のウィンドウ上で一文字の入力を受け付け、それに紐付いたウィンドウがアクティブ化、もしくは起動し、対応するキーがなければ勝手に終了します。

時間の関係上、作りこむ気は今のところありません。

```python
# Enter script code
import Tkinter as tk
import threading
import subprocess

def onKeyPress(event):
    is_found = True
    # Regexp of window title or WM_CLASS.
    if event.char == "f":
        regexp = " - Firefox$"
        command = "firefox"
        options = "-a"
    elif event.char == "a":
        regexp = " Atom$"
        command = "atom"
        options = "-a"
    elif event.char == "e":
        regexp = " Eclipse$"
        command = "eclipse"
        options = "-a"
    else:
        is_found = False

    # Call the main routine(Don't change me!!).
    if is_found:
        subprocess.Popen('python ~/.config/autokey/quickey.py/quickey.py %s "%s" "%s"' % (options, regexp, command), shell=True)
        #subprocess.Popen(['python', '~/.config/autokey/quickey.py/quickey.py', options, regexp, command])
    root.destroy()

root = tk.Tk()
root.geometry('300x200')
text = tk.Text(root, background='black', foreground='white', font=('Comic Sans MS', 12))
text.insert('end', 'a:Atom\n')
text.insert('end', 'e:Eclipse\n')
text.insert('end', 'f:Firefox\n')
text.pack()
root.bind('<KeyPress>', onKeyPress)
root.mainloop()

``
CFBundleVersion❤Git

CircleCIでiOSプロジェクトをビルドした際にBuild(CFBundleVersion)をうまく更新したい。

今まではスプリクトを作成し、CFBundleVersionをインクリメントするスプリクトを作成しCircleCIからコミットするようにしていたが、GitHubの新しい機能とバッティングしてしまった。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">GitHubの新機能の影響でmasterのテスト通過を必須とするとskipが通らずハマる / CircleCIでビルドが走らないようにするには、コミットメッセージに[skip ci]や[ci skip]を含める on <a href="https://twitter.com/Qiita">@Qiita</a> <a href="https://t.co/hqcj5y6JYX">https://t.co/hqcj5y6JYX</a> <a href="https://t.co/5l6YrsC5QB">pic.twitter.com/5l6YrsC5QB</a></p>&mdash; Tsuyoshi Yonemoto (@yoneapp) <a href="https://twitter.com/yoneapp/status/785026756730204160">2016年10月9日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

そこで対応方法を考えた。一つは$CIRCLE_BUILD_NUMを使うことである。これはとてもうまくいく。
https://ja.ngs.io/2015/04/05/circleci-ios/

そこから発想を展開させ検索し、次の記事を見つけた。
CFBundleVersionとタイムスタンプを使う手法で、これもうまくいく。
http://www.tokoro.me/2014/05/19/xcode-versioning/

ここで、現在の状態からCFBundleVersionを生成するとコミットしなくてすむことが分かった。
そこで、前述の手法を参考に次のようなスプリクトを考えた。

```bash
plistBuddy="/usr/libexec/PlistBuddy"
infoPlistFileSource="${SRCROOT}/${INFOPLIST_FILE}"
infoPlistFileDestination="${TEMP_DIR}/Preprocessed-Info.plist"

if ! git diff-index --quiet HEAD --; then
gitChangedSuffix="*"
fi

branchName=$(git rev-parse --abbrev-ref HEAD)
shortGitVersionHash=$(git rev-parse --short HEAD)
gitBaseVersion="$branchName:$shortGitVersionHash"

if [ -n "$CIRCLE_BUILD_NUM" ] && [ $branchName = "master" ]; then
  versionString=${CIRCLE_BUILD_NUM}
elif [ -n "$CIRCLE_BUILD_NUM" ]; then
  versionString=$gitBaseVersion#${CIRCLE_BUILD_NUM}
else
  versionString=$gitBaseVersion${gitChangedSuffix}
fi

$plistBuddy -c "Set :CFBundleVersion $versionString" $infoPlistFileDestination
```

これは4つの結果になる。

```
A: master:db4e1e6
B: master:db4e1e6*
C: master:db4e1e6#1
D: 1
```

- Aは、CircleCI以外でビルドした場合
- Bは、Aの場合でaddされてないコミットがある場合
- Cは、CircleCIでmaster以外でビルドした場合
- Dは、CircleCIでmasterでビルドした場合

実際には次の要素で構成される。

```
(GIT_BRANCH):(GIT_SHORT_HASH)(GIT_CHANGE)(#CIRCLE_BUILD_NUM)
```

結論として、このようにすることでgitの状態からCFBundleVersionを決定することが出来るので、CFBundleVersionからアプリの実際のコードを逆引きし問題を解決しやすくなると考えられる。

Dが必要な理由は、申請時にはCFBundleVersionがピリオドで区切られた非負の整数の必要があるため。
[ITMS-90060エラーでiTunes Connectへバイナリがアップロードできない件](http://qiita.com/nozaq/items/40ae521b645c5195c20a)
org-modeでUMLを埋め込み(PlantUML)




# はじめに

org-modeでは、org-babelという仕組みを使って、org-modeの文書内にプログラミング言語を埋め込んで実行することができます。
例えばrubyの場合だと以下のようになります。

```
#+BEGIN_SRC ruby
require 'date'
"This file was last evaluated on #{Date.today}"
#+END_SRC
```
上記のコード断片を評価すると(C-c C-c)、以下のように結果がバッファに埋め込まれます。

```
#+RESULTS:
: This file was last evaluated on 2016-10-06
```

## スクリーンショット

<img width="347" alt="スクリーンショット 2016-10-06 18.10.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/91520/e57c5069-0b5e-ad0f-130a-f4e3c152e308.png">


PlantUMLもorg-babel一つの言語なので、org-mode内で実行し画像を生成することができます。

* [Babel:Language](http://orgmode.org/worg/org-contrib/babel/languages.html) 

さらにEmacsはバッファ内にインラインで画像を表示できるので、org-modeの文書内にインラインで画像を表示できます。

## 例えばこんなかんじになります
以下にスクリーンショットを貼ります。Emacsのバッファに生成されたUMLの画像が表示されています。

----

<img width="670" alt="スクリーンショット 2016-10-06 19.45.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/91520/25c1da8d-bb57-3ea5-f4e4-796ccef43ee9.png">

----
# 初期設定

PlantUMLは既に使える状態になっているという前提(JavaやGraphvizはインストール済み)ではなしを進めます。

まだの方は、公式サイトなどを参照して下さい。

http://plantuml.com/starting

## plantuml.jarを配置

plantuml.jarを任意の場所に配置しておきます。
私の場合、`~/.emacs.d/lib/plantuml.jar`というように配置して、
`.emacs.d`に含めてバージョン管理対象としています。

## plantuml.jarのパス設定

以下のように`init.el`に設定します。

```lisp
;; plantuml.jarへのパスを設定
(setq org-plantuml-jar-path "~/.emacs.d/lib/plantuml.jar")

;; org-babelで使用する言語を登録
(org-babel-do-load-languages
 'org-babel-load-languages
 '((plantuml . t)))
```

おためしでやってみる場合は、上記の式を`eval-last-sexp`などで評価してください。

# やってみる

## org文書の作成

```
#+BEGIN_SRC plantuml :file animal.png
動物 <|-- 犬
動物 <|-- 猫
#+END_SRC
```

`#+BEGIN_SRC`から`#+END_SRC`内で`C-c C-c`とすると、内部のコードがPlantUMLとして実行されます。

![animal.png](https://qiita-image-store.s3.amazonaws.com/0/91520/8f38019a-e63c-70f0-4a87-2cab523e4bba.png)

## 日本語が文字化けする場合

環境によっては、日本語が文字化けする場合があります。
その場合、plantumlを起動する際のコマンドラインオプションで、
明示的に文字コードを指定するのがよいと思われます。

```
#+BEGIN_SRC plantuml :file animal.png :cmdline -charset UTF-8
```



# 画像のインライン表示

`M-x org-toggle-inline-images`で画像インライン表示をトグルすることができます。


あるいは、org文書冒頭に以下のように記述をしておくと、その文書ではデフォルトでインラインで画像が表示されるようになります。

```
#+STARTUP: inlineimages
```
RubyでScalaのケースクラスっぽいことがしたかったのでStructを使えばよかった

Scalaのcase classが好き。一行ぱぱっと書くだけで型の恩恵を受けられるのが最高。
Rubyでもそういうのが欲しくなったので第一弾として単純なイミュータブルなコンテナとしての型を定義してみる。
単純にハッシュを使うとかhashieを使うとかでも結果の用途として同じようなことができるけど型が欲しいのです。

__追記__

コメントで教えてもらいましたが、[Struct](https://docs.ruby-lang.org/ja/latest/class/Struct.html) でやりたいことができるのでした。Qiitaに書いてよかった！

__追記ここまで__

普通に書くとこんな感じになるはず。

```ruby
class Food
  attr_reader :price, :name
  def initialize(price, name)
    @price = price
    @name = name
  end
end
```

ちょっと長いので一行で書きたい。
なのでこんなヘルパーメソッドを定義する。


```ruby
def case_class(*args)
  claz = Class.new
  claz.send :define_method, :initialize, Proc.new do |*iargs|
    args.each_with_index do |arg, idx| 
      self.instance_variable_set("@#{arg}", iargs[idx])
    end
  end
  args.each do |arg|
    claz.send :define_method, arg, Proc.new do
      self.instance_variable_get("@#{arg}")
    end
  end
  claz
end
```

こんな使い方ができるようになった。

```irb
[161] pry(main)> Person = case_class :name, :age
=> Person
[162] pry(main)> p1 = Person.new('Adam', 30)
=> #<Person:0x007fdec619be80 @age=30, @name="Adam">
[163] pry(main)> p2 = Person.new('Bob', 14)
=> #<Person:0x007fdec53c29d0 @age=14, @name="Bob">
```

今日はここまで。
RubyでRubyのコード一括フォーマット（自動でインデント綺麗にする）するの作った


# 概要
EclipseとかVisual Studioみたいな、全選択してボタン押すと一括でインデント綺麗にしてくれるのが欲しかった。
需要ありそうだからググればすぐ見つかるかと思ったら、あまりにも良い感じのが見つからなかったから自作してみた。探し方が悪いんだろうか。

本当はエディタ側で設定した方が理想的な動作になるんだろうけど、色々プラグイン入れたりとかの面倒なことはあんまりしたくなった。

## コード

gist参照
https://gist.github.com/sensq/dc302c9185cb260104a581cc39c656bd
ちょっと改造すればたぶん他の言語でも使える。

## 使い方

以下のコマンドを実行

```shell
ruby formatter.rb 'file_path'
```

## ざっくりした処理の説明

- ファイル読み込む
- 上記ファイルと同階層にバックアップ作成（フォーマット失敗したときや比較用）
- フォーマット処理
    - 予約語を定義（defとかifとか、インデント変えるキーになる文字列）
    - 最初にインデントを全部消去
    - 一行ずつ探索し、予約語が存在する行が出てきたら、インデントを一つずらす
    - コメント行は無視
    - 探索中の行の頭に、インデントの深さに応じたスペースを追加
- 上書き保存

## 実行例

適当にインデントがめちゃくちゃなコードを書いてフォーマットしてみる。

```rb
class Test
  attr_accessor :pub
  def initialize
@pub = 0
  end
  # loopのサンプル
  def loop
    (0..10).each do |i|
    (0..10).each do |j|
    (0..10).each do |k|
      if k%2
      p i
      elsif k%3
      p j
      else
      p k
      end
    end
    end
    end
    end
# caseのサンプル
def case_sample
    case @pub
    when 1
    p "hoge"
    when 2
    p "fuga"
  end
  end
end

test = Test.new
#if true
  test.pub = 2
#end
test.case_sample
```

これをフォーマットすると・・・

```rb
class Test
  attr_accessor :pub
  def initialize
    @pub = 0
  end
  # loopのサンプル
  def loop
    (0..10).each do |i|
      (0..10).each do |j|
        (0..10).each do |k|
          if k%2
            p i
          elsif k%3
            p j
          else
            p k
          end
        end
      end
    end
  end
  # caseのサンプル
  def case_sample
    case @pub
    when 1
      p "hoge"
    when 2
      p "fuga"
    end
  end
end

test = Test.new
#if true
test.pub = 2
#end
test.case_sample
```

キレイ！！

## バグ
- ~~do～endではなく、{}で書いてるコードには使えない~~
    - ~~インライン展開"#{}"とか、{}を1行で書いてる場合とかの判定が面倒そうだった~~
    - ↑直しました
- 文字列として"\sdo\s"の含まれる行があると、次の行からインデントされてしまう
    - 「doが"や'で囲まれている場合は無視する」ってのが面倒そうだった
    - 「前後が\sのdo」という条件にしているので、あまり起こらないバグのはず

自分で書いたコードが想定通りにフォーマットされることしか確認していないので、汎用的に使えるかどうかは自信ありません。
たぶんだいたいのコードには使えるんじゃないかと思います。

## 追記
いまいち使い勝手悪かったので、Mery（エディタ）のマクロにしてみた。
https://gist.github.com/sensq/589de2764297e22d9b5a99acebca4684
macOS SierraでKarabinerが動かない人へ捧げるTIPS

#主な読者
- macOS Sierraにアップグレードしたはいいものの、Karabinerが動かなくて困っている方
- **JISキーボードをUSキーボードとして使用するためにKarabinerでキー配列を変更していた方**

# 困ってしまいました
以上の状況に陥ってしまい大変困っている読者の皆様に、粗末なものですが臨時の代用策としては機能するであろうTipsをお送ります。

# 単刀直入に
Tipsのアウトラインとしては以下の通りです。

1. 以下の記事を参照して自分専用のキー配列を作る
http://qiita.com/ThePncity/items/6c24868a7f1ae45f52b9
> (この作業がいささか面倒に感じられますが、引き返すもよし、進むもよし、あなた次第でございます。ただここを乗り切れば９割が完遂します。)


2. macの`System Preferences > Keyboard > Input Sourcesタブ`からキーボードに先ほど作成したキー配列を追加

3. cmd + Spaceで切り替える
> (ここがイマイチスマートではないので、改善したいものです)

4. 以上

# その他Tips
JISキーボード -> USキーボードの他にも、OptionキーとCommandキーの入れ替えもKarabinerで行なっていたかたもいらっしゃるかもしれません。そのような方は以下の方法で切り替えましょう。

1. macの`System Preferences > Keyboard > Keyboardタブ > Modifier Keys...`からOptionとCommandのキーを入れ替える
2. 以上

> ただしこの方法にも欠陥があり、OptionとCommandをいれかえるとJISキーボードには右側にOptionキーがないため、右側のCommandキーが使えない状態になってしまいます。Delete操作とかが非常に煩わしくなります。

## 最後に
以上の設定をしても随所に煩わしさが残るので、どなたかもっとスマートでエクセレントな解決方法をお持ちの方は教えてください。

> [英数]に割り当てられるキーボード配列が選択できれば、`Cmd + Space`を何度も連打しなくても済むのですが...
slackbotを中継につかって、bottleからjsonの形式でslackに返す。

# 概要
slackで作成したbotにメンションつけて指定の文言で話しかけると
軽量webフレームワークのbottleから話しかけられた文言に紐づいた
情報を返す。返された情報はslackに投稿される。
また、bottleにhttpでアクセスしても同様の情報を取得できるので、
必ずslackを介さなくてもOK。

## 結果イメージ
### イメージその１　アルファベットに応じたJSONを返す。
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/86853/ed9217c1-fe13-7cca-7032-91c08af86aab.png)

magi_caspにメンションつけて話しかけると、
JSONで情報を返してくれる。
この例では I love [A|B|C|D|E|F|G|H]という条件で
I love の後にA~Hのアルファベットを入力すると、
アルファベットに応じたJSONを返してくれる。

### イメージその２ 天気を返す
magi_caspにメンションで `tenki` と話しかけると、
当日と翌日の天気を返してくれる。

# これが良い方法なのかについて
分かりません。dockerを少し覚えて、bottleとslackbotを勉強中に
こういう使い方もできるのではと思いついてやりました。

# 前提
- dockerを使うのでdockerをホストするサーバがいります。  
ホストOSはcentos7です。
- コンテナは2ついります。
 - slackbotを動かすコンテナ
 - bottleを動かすコンテナ
- さくらのクラウドで作ってます。  
石狩リージョンで1core 1GBで1時間7円のプランです。
- dockerが動くサーバは準備済みとします。 
- slackへのBotsのIntegrationの追加は済んでいる。

# 準備

## cloneする。  
以下のコマンドを実行して筆者が作成したgitリポジトリをcloneします。
```git clonehttps://github.com/tomokitamaki/slackbotWithbottle.git```
　
## Dockerfileを使ってイメージを作る
1. BotsのAPItokenを記載したファイルを作成する。
cloneした中のslackbot_bottleというフォルダの中の、
slackbotというフォルダにAPITOKEN.pyというファイルを作る。
```vi　APITOKEN.py```
以下のフォーマットでBotsのAPItokenを記載する。
```APIAPI = "APIトークン"
例）APIAPI = "apitoookennnn"
```

1. slackbotが動くコンテナのイメージを作る
cloneした中のslackbot_bottleというフォルダの中の、slackbotというフォルダの中に、
```build_slackbot_Dockerfile``` というDockerfieがあるので、
該当ファイルがあるディレクトリに移動して、以下のようなbuildコマンドで実行する。  
```sudo docker build -t　slackbot:centos7 build_slackbot_Dockerfile　.```  
これでimageが出来上がります。以下のコマンドを実行するとイメージができていることを確認できます。  
```sudo docker images```
　　
2. bottleを動かすコンテナのイメージを作る
cloneした中のslackbot_bottleというフォルダの中の、bottleというフォルダの中に、 
```build_bottle_Dockerfile``` というDockerfieがあるので、
該当ファイルがあるディレクトリに移動して、以下のようなbuildコマンドで実行する。  
```sudo docker build -t　slackbot:centos7 build_bottle_Dockerfile　.```  
これでimageが出来上がります。以下のコマンドを実行するとイメージができていることを確認できます。  
```sudo docker images```

## イメージからコンテナを起動させる

1. slackbotのイメージからコンテナを起動させる。  
以下のコマンドで起動する。  
```sudo docker run -d --name slackbot slackbot:centos7```
2. bottleのイメージからコンテナを起動させる。  
以下のコマンドで起動する。　  
`sudo docker run -d -p 3333:80 --name bottle bottle:centos7`  
bottleはport80で待ち受けているのでホストOSのprt3333宛ての通信をコンテナのport80に繋げます。

# Botにメンションしてみる。
Botにメンションをつけて tenki と話しかけると、
```今日の天気は("曇り"), 明日の天気は("晴時々曇")```
と返って来ればOK。
# ブラウザで見てみる

`http://サーバのIP:3333/tenki/tenki`
でアクセスして
```今日の天気は("曇り"), 明日の天気は("晴時々曇")```
と返ってくるとバッチリ。

# おわり
ここまで行うと天気や、単語とアルファベットを紐付けたJSONを返してくれる、
BOTとそれと連携するbottleが使えるようになります。
以下のREADMEもぜひご覧ください。
https://github.com/tomokitamaki/slackbotWithbottle
# 発展
pluginsフォルダ内のファイルに追記をすれば、返信のバリエーションが増やせますし、
hello_world.py内にpythonのコードを書けばもう少し複雑なこともできます。  

# TIPS
- 【つまづき】slackbotのコンテナからbottleのコンテナに通信できないとき。  
pluginsフォルダにあるbotのメンションを定義しているファイル内に記載をした、  
URLがホストOSのグローバルのIP:ポート番号（ex：http://サーバのIP:3333)だとうまくいかなかったので、
IPをホストのグローバルIPではなくてコンテナのローカルIPにするとうまくいきました。
- bottleのインストール方法  
http://tech.aainc.co.jp/archives/9826 の2. Bottleのインストールの項 からページの最後まで進めてください。
- slackbotのインストール方法  
http://blog.bitmeister.jp/?p=3892 の Slack Bot環境の構築 の項からPythonで[Slackbotを作る(2)](http://blog.bitmeister.jp/?p=3911)まで進めてください。
すごく分かりやすいです。
WP-CLI使って手元でWordPressサイト立ち上げるまで

# WP-CLIって
https://wp-cli.org/
WordPressサイトの作成から記事投稿、管理、プラグイン設定など、CLIから何でもできることを目指して開発されてるツール。

# WP-CLIのインストール

```
$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
$ php wp-cli.phar --info
$ chmod +x wp-cli.phar
$ mv wp-cli.phar ~/bin/wp # なんか適当にパス通ってるとこに置く
```

# MySQLの準備

- DB名: `wpcli` 
- ユーザー: `wpcli:wpcli`

```
$ mysqladmin -uroot -pXXXXX create wpcli
$ mysql -uroot -pXXXXX -e "GRANT ALL PRIVILEGES ON wpcli.* TO wpcli@localhost IDENTIFIED BY 'wpcli'"
```

# サイト作成

```
$ mkdir wpcli && cd wpcli
$ wp core download
$ wp core config --dbname=wpcli --dbuser=wpcli --dbpass=wpcli
$ wp core install --url=localhost --title=wpcli --admin_user=(管理者名) --admin_password=(管理者パスワード) --admin_email=(管理者メールアドレス)
$ wp server
```

![スクリーンショット 2016-10-09 21.37.22.png](https://qiita-image-store.s3.amazonaws.com/0/29342/b37bb39b-c130-f623-9d12-0498117dbf7d.png)

ヒュ～……？？？？


# なんかエラーでた

PHP7系だと↓みたいなエラーでまくる

```
Warning: Parameter 1 to wp_default_styles() expected to be a reference
```

2016-12-06リリース予定のWordPress4.7を待つか、PHP7系を諦めろ、とのこと
https://core.trac.wordpress.org/ticket/37772 

今回はphp5.6に落とす

```
$ brew uninstall --force homebrew/php/php71
$ brew install homebrew/php/php56
$ wp server
```

![スクリーンショット 2016-10-09 22.44.23.png](https://qiita-image-store.s3.amazonaws.com/0/29342/98064d25-5fbc-4f16-6517-2e05e1c5b116.png)

ヒュ～
Centos7にNginx + Unicornで構築したRedmine3.3にredmine_knowledgebaseをインストールする

# [概要]
Redmineにノウハウなどを共有するスペースを作成する、redmine_knowledgebaseをインストールする。
Redmine2.x系の頃は、Redmine全体のナレッッジベーストして使えが、Redmine3.x系からプロジェクトを一つ立ち上げて、それをナレッッジベースト使ってね！という方式に変わったらしい。
プロジェクト単体のナレッジベースでもいいし、専用のプロジェクトを作って全体のナレッジベースにしてもいいようになっている。

# [事前準備]
事前に下記が構築済みであること。

[Centos7にNginx + UnicornでRedmine3.3構築方法](http://qiita.com/sabakan7/items/d20e81b9395a654f6e55)

# [作業内容]
## ■Git clone
```bash
$ cd /opt/redmine/plugins/
$ git clone git://github.com/alexbevi/redmine_knowledgebase.git
```

## ■bundle install　実行
```bash
$ bundle install
```

## ■マイグレーション実行
```bash
$ bundle exec rake redmine:plugins:migrate NAME=redmine_knowledgebase RAILS_ENV=production
```

## ■再起動させて反映
```bash
$ sudo systemctl restart redmine-unicorn.service
```

# [事後確認・作業]
プラグインの設定画面から、プラグインが追加できているか確認して完了。
【古い記事・今はできる】CircleCI で Docker ビルドキャッシュができない理由

# 2017/04 追記

[CircleCI 2.0 で Docker のバージョンが上がったためキャッシュできるようになりました](http://qiita.com/na-o-ys/items/7e7a7e4cde378fc54b32)

以下は CircleCI 1.0 時代になぜできなかったのかの説明

# やりたいこと

- CircleCI の Docker イメージビルドが遅い
    - イメージキャッシュが引き継がれないため
- なんとかしてイメージキャッシュを引き継ぎたい

# TL;DR

- CircleCI の Docker バージョンが 1.10 の間は、無理
    - もう少しでなにかしらのアナウンスがあるらしい (https://discuss.circleci.com/t/request-docker-1-12/5120/13)
- Docker 1.11 対応を待つ
    - [tonistiigi/buildcache](https://github.com/tonistiigi/buildcache) が使える
- Docker 1.13 リリース & 対応を待つ
    - cache-from オプションが追加された

# CircleCI ドキュメントにある workaround は効かない

[Caching Docker layers](https://circleci.com/docs/docker/#caching-docker-layers)

`docker save` でイメージを CircleCI にキャッシュさせて、`docker load` で引き継ぐ方法。
2016年10月現在 CircleCI の Docker はバージョン 1.10 で、この方法は使えない。

# Docker 1.10

Docker 1.10 でレイヤ情報がイメージに含まれなくなった。
https://github.com/docker/docker/issues/20380#issuecomment-184978854

このバージョンでキャッシュを持ち越す方法は、おそらく `/var/lib/docker` 以下をハックする以外にない。

# Docker 1.11 / 1.12

このバージョンでは、[tonistiigi/buildcache](https://github.com/tonistiigi/buildcache) を使ってビルドキャッシュデータを save & load できる。

また、`docker load` でレイヤ情報を復元できるようになった (https://github.com/docker/docker/pull/21385) ので、

1. `docker save {history全部} > cache.tar`
2. `docker load -i cache.tar`

でキャッシュが復元できる。(詳細: https://github.com/docker/docker/issues/20316#issuecomment-221289631)

# Docker 1.13 (未リリース)

docker build に cache-from オプションが追加される。
https://github.com/docker/docker/pull/26839

```
docker build --cache-from myimage:v1.0 -t myimage:v1.1 .
```

docker save と組み合わせてうまくやれると思う。

# 結論

CircleCI を諦める / Docker 1.11 以降の対応を待つ
ニコ動をJSで動的に埋め込みたい！

## 何が問題なの

### Youtubeだと割とすんなり実装できます
Youtubeなら

```javascript:
// 動画のIDを指定
var movieId = 'xxxxx';
// ターゲットをキャッシュ
var target = document.getElementById('movie');

// ターゲット要素に動画を埋め込み
target.innerHTML = '<iframe src="https://www.youtube.com/embed/' + movieId + '" width="580" height="326" frameborder="0" allowfullscreen></iframe>';
```

みたいに書けば簡単に動画の埋め込みができる。

### でもニコ動だと……
ニコ動でも同じ様な事をやりたいんだよね。
ということで、素直に実装しようとすると

```js
// 動画のIDを指定
var movieId = 'smxxxxx';
// ターゲットをキャッシュしておく
var target = document.getElementsByClassName('movie')[0];

// ニコ動埋め込みタグに含まれるscript要素を作成する
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', 'http://ext.nicovideo.jp/thumb_watch/' + movieId + '?w=580&h=326');

// ターゲット要素に動画(を呼ぶスクリプト)を埋め込み
target.appendChild(script);
```

こんな感じになるよね。
でも、これだと上手く動いてくれない。（[→このあたり参考](http://codenote.net/javascript/2485.html)）
どうやら、ここで読み込むニコ動のスクリプトは、最終的にdocument.writeでembed要素の書き込みを行っている。
でも、appendChildして読み込んだJSからのdocument.writeは上手く動かない。

## じゃあどうすればいいの

結論から言えば、document.writeの動作を、element.appendChildと同様の動作にすればよい。

ところで、JavaScriptは、既存のメソッドを上書きする事ができる。
そこで、一時的に、document.writeの動作を、element.appendChild同様の動作としてしまう。

```js
var script, target;

// 動画のIDを指定
var movieId = 'smxxxxx';
// ターゲットをキャッシュしておく
target = document.getElementById('movie');

// 元のメソッドは後で書き戻すので一時待避させておく。
var write = document.write;

// 新しい関数で上書き
document.write = function (arg) {
	// ここがメイン：動画表示部に引数として渡された要素を挿入
	target.innerHTML = arg;

	// 気が済んだのでdocument.writeを戻す
	document.write = write;
};

// 埋め込み動画を呼び出す部分
// ニコ動埋め込みタグに含まれるscript要素を作成する
script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', 'http://ext.nicovideo.jp/thumb_watch/' + movieId + '?w=580&h=326');

// ターゲット要素に動画を埋め込み
target.appendChild(script);
```

やったね、動画が表示されたよ。
これでいくらでもニコ動埋め込み放題だね！
RaspberryPizeroでbluetoothシリアル通信をする方法

# RaspberryPiとAndroidスマホをBluetoothで通信させたい
- RaspberryPizeroがある
- 小さいからスマホと無線で連携させたい
- wifiはアクセスポイントが必要&スマホはインターネットにつなぎたい

## RaspberryPizeroの紹介
- 小型パソコンと言われるRaspberryPiのさらに小型版
- 小さいけどLinuxが動作可能
- バージョンが上がってRaspberryPi用のカメラを接続できるようになった(要zero用カメラケーブル)

## Bluetoothでシリアル通信
- Bluetoothの通信方法の一つ(詳しい説明は割愛)
- Androidのサンプルアプリの一部を修正するだけで通信できる(簡単)


## 作ったもの，作り方
### RaspberryPizero編
- 初期設定はRaspberryPizeroの設定が必要なため，直接かssh接続できるようにしとく
- BluetoothのUSBドングルが必要
- OSはRaspbian
- Bluetoothライブラリの導入

``` bash
sudo apt-get install bluez
sudo apt-get install bluetooth blueman bluez-tool
```

- Bluetoothのペアリング
    - ペアリングするデバイス(今回はAndroid)を検索可能状態にしておく

    ``` bash
    sudo bluetoothctl -a
    scan on //ペアリング対象のアドレスを確認
    scan off
    pair <ペアリング対象のアドレス>
    trust <ペアリング対象のアドレス> //次回起動時に自動接続
    ```

- BluetoothのSPP(シリアル通信)設定
    - /etc/systemd/system/dbus-org.bluez.serviceに以下の記述を追加(設定後再起動した方が良い)

    ``` vim
    ExecStart=/usr/lib/bluetooth/bluetotthd -C
    ExecStartPost=/usr/bin/sdptool add SP
    ```

- Bluetoothのシリアル接続をC言語から利用する
    - ライブラリ導入


    ``` bash
    sudo apt-get install libbluetooth-dev
    ```

    - RFCOMMを利用して接続，通信
    - サンプルコードのrfcomm-server.cを利用[http://people.csail.mit.edu/albert/bluez-intro/x502.html](http://people.csail.mit.edu/albert/bluez-intro/x502.html)
    - ビルド

    ``` bash
    gcc <.cファイル> -o <出力ファイル> -lbluetooth
    ```

    - 出力されたファイルを実行することでBluetoothサーバーとしてペアリングしたデバイスからの接続を待つ状態になる

### Androidアプリ編
- AndroidStudioを利用
- 起動時に__Import an Android code sample__から__Bluetooth Chat__を選択してプロジェクトを作成
- コードの修正
    - サンプルプロジェクトをBlueotthのシリアル通信に対応させます
    - BluetoothChatService.javaの50,51行目を以下のように変更(シリアル通信用にUUIDを変更)

    ``` java
    private static final UUID MY_UUID_SECURE =
                UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    ```

    - デバッグなどでRaspberryPizeroとペアリングしたAndroidデバイスにインストール

### 接続
- RaspberryPizeroで作成したrfcomm-serverプログラムを起動
- AndroidにインストールしたBluetotth Chatアプリを起動
- Androidアプリの__Connect a device - secure__またはBluetoothのマークからペアリングしたRaspberryPizeroを選択
- テキストボックスに文字を入力してsendを押す
- 入力文字と同じ文字が帰ってきたらシリアル通信成功！

![Screenshot_2016-10-09-17-50-02.png](https://qiita-image-store.s3.amazonaws.com/0/86283/fe20fb4b-485d-fe9e-e07b-15bdbdc7d4e0.png)


## 今後の課題
- 初期のペアリング設定にsshか直接入力が必要なためもっと簡単にペアリングしたい
- 複数デバイスからの接続や別のBluetoothプロトコル通信と併用して何か作りたい
WioNodeでパンかご監視装置の作り方

# 会社から帰るときに家に明日のパンがあるか知りたかった
## 作りたいもの
- できるだけ簡単にパンかごを作る
- インターネット経由(帰宅中のスマホから)でパンかごにパンがあるかわかる
↓
WioNodeで簡単にパンかご監視装置ができるはず
## WioNodeの紹介
WioNode Wiki
[http://wiki.seeed.cc/Wio_Node/](http://wiki.seeed.cc/Wio_Node/)

- インターネット経由で簡単に制御ができるIoTなマイコン
- Wifi経由でAndroid,iOSから設定可能
- REST APIでネットワーク上からデータを入出力できる
- センサー，出力機器をGROVEコネクタで簡単接続
    - GROVE対抗センサーの種類も豊富
- 安い ([スイッチサイエンス](https://www.switch-science.com/catalog/2799/))

## 作ったもの，作り方
パンの有無だけでは寂しいのでついでに部屋の温度も測れるようにした

### 材料
- WioNode
- かご(100円)
![DSC_0777.JPG](https://qiita-image-store.s3.amazonaws.com/0/86283/1213ec60-d738-c764-7f11-ac9233c70916.jpeg)
- クリップボード(100円)
![DSC_0780.JPG](https://qiita-image-store.s3.amazonaws.com/0/86283/6a148319-fe0d-c14b-9575-a90b65346a20.jpeg)
- GROVEボタン
    - [https://www.switch-science.com/catalog/1246/](https://www.switch-science.com/catalog/1246/)
- GROVE温度センサ
    - [https://www.switch-science.com/catalog/806/](https://www.switch-science.com/catalog/806/)

### 作成
1. ボタンをボードに留める(ネジで無理やり止めてる)
    - この時ボードのクリップが有る向きにボタンが来るようにする
![DSC_0781.JPG](https://qiita-image-store.s3.amazonaws.com/0/86283/beef5599-27d7-e525-3499-d43b63a1c02b.jpeg)

2. テープでマイコンと温度センサをボードの裏に張り付ける
    - 配置は良い感じで，ボードの高さはクリップに何か挟んで調整
![DSC_0783.JPG](https://qiita-image-store.s3.amazonaws.com/0/86283/e167d711-f955-6535-4c71-15b388cd0f9c.jpeg)

3. かごにUSBケーブルが通るように穴をあけてWioNodeと接続
![DSC_0785.JPG](https://qiita-image-store.s3.amazonaws.com/0/86283/a7dbfba2-7255-f679-3a4f-f83ad8b75f8d.jpeg)

4. 完成！
![DSC_0786.JPG](https://qiita-image-store.s3.amazonaws.com/0/86283/aa3b8280-1337-e561-fa5b-3382b893145e.jpeg)

### WioNodeの設定(Android)
- WioNodeのAndroid,iOSからの接続初期設定については割愛
    - 専用アプリからWifiにWioNodeをwifiに接続できる
- WioNode専用アプリから接続したセンサの設定を行う
    - 今回はボタンと温度センサを接続しているので接続ポートに対応したモジュールを置く+WioNodeをアップデートする
![Screenshot_2016-10-09-15-12-43.png](https://qiita-image-store.s3.amazonaws.com/0/86283/0e578a42-d599-c4ea-eaa9-04863357612f.png)

- ViewAPIから接続確認，各センサのコントロールが可能
- 共有ボタンからインターネットからの接続URLを取得できる
    - ブラウザのお気に入りに入れておく

### 使い方
- ブラウザからアクセスすると会社からの帰宅途中でもパンかごの監視と温度がわかる
![DSC_0788.JPG](https://qiita-image-store.s3.amazonaws.com/0/86283/a94be168-8079-cbcc-948b-c1222b9f1152.jpeg)
- ブラウザはWioNodeのAPIサンプルなので，とりあえず状態がわかる程度(temperatureが温度，pressedがボタンの状態)
![Screenshot_2016-10-09-15-27-34.png](https://qiita-image-store.s3.amazonaws.com/0/86283/c5e478a5-c40d-5538-402d-aff735d73f77.png)


## その他
- 電池消費量は多い(リチウムイオンバッテリーだと長時間使用できない)
- Wifiに接続することが前提のため常に接続できるWifi環境が必要(外に持ち運べない)

## 今後の課題
- スマホ側のアプリ作りたい(REST APIなのでスマホアプリでもブラウザでもゲームからでも扱える)
- 冷蔵庫の中の買い置きの有無の方がもっと知りたかった
URL正規化でサイト全体にリダイレクト処理を入れるときに気をつけたいこと

URL正規化をするためサイト全体にリダイレクト処理を入れたときに、
クリティカルなバグを発生させてしまったことがあったため備忘&戒めのため書きます。
そもそもURL正規化ってなんだよというところから。

## URL正規化とは
簡単に言うと、コンテンツ内容が全く同じである複数URLでオリジナルのURLを明確にしSEO力を上げる処理になります。

例えば、www.あり・なしどちらも表示できる状態であったり、index.htmlのあり・なしだったり。
これらを片方に寄せるようリダイレクト処理をかけたり、canonical属性を使ったりします。

詳しくはこのあたりを見ればわかるかと思います。

- [wwwあり、なし等のURLの正規化方法　canonical属性の使い方](https://www.allegro-inc.com/seo/canonical-url)
- [canonical属性タグの使い方〜URLの正規化でSEOのマイナス評価を避けよう](https://ferret-plus.com/1809)

## 正規化するためにどんなことをしたか
今回は、URL末尾のスラッシュありなしでどちらも同じ内容が表示されていたため、
サイト全体をスラッシュありに統一しようとなり.htaccessに処理を記述しました。

```
RewriteRule ^(.+[^/])$ /$1/ [R=301,L]
```

これが悲劇の始まりです。

## どんなバグが発生したか

具体的には以下のようなバグが発生していました。

- 自前APIへリクエストしたくてもリダイレクトされ正常にリクエストできなくなり、ページング時などデータ取得できず関連箇所死亡
- 同アプリケーションで用意している管理画面にログインできなくなる

つまり、スラッシュありに統一したはいいものの、
リクエストは以前からスラッシュなしにリクエストするようになっていたため
Ajaxで処理していた箇所などはリクエストしても正常に返ってこなくなるという状態となっていたわけです。
テストコードもない状態で、適当に開いたページがリダイレクトされるかどうかしか確認できていなかったため、
上記のような状態を本番にアップしてから気づいてしまいました。

## 対応方法

今回は取り急ぎ気づいた時点でリダイレクトを一旦外しました。
その後、APIへのリクエストなど正規化する必要もなくクリティカルなエラーにつながりそうなURLでは正規化をかけない、
他のフロント側のURLにはリダイレクトをかける、というように修正しました。

ちょっと考えれば気づきそうなものですが…またやってしまわないよう気をつけたいです。
さくらのVPSにRancherをインストールする

# Dockerの管理が面倒になってきた。
ちょっとしたプログラムとかを動かす環境としてさくらのVPSを使っているけれど、
そんなに大量にサーバを借りられないので、基本的にVPS内でコンテナを使って運用してる。
2,3年前はLXCを使って運用していたけれども、1年前くらいから徐々にDockerに切り替えている。

Docker環境の個人的な課題として、気づくとコンテナが増えていく...
サーバではなくてクライアント端末だったらDocker for Mac(Windows)や・kitematicを使うからそうでもないけれど、
サーバは気づくと増えてる。

# 管理ツールとして何が良いか？
Dockerの管理ツールは今色々乱立していると思ってる。
## Docker DataCenter
- 2016年の2月くらいに発表
- Dockerを管理するためのオンプレミスプラットフォーム
- Docker社純正
- GUIついてる

## Kubernetes
- Googleのborgから来ているコンテナ管理ツール
- GUIが無かった
- 入れるの大変(なイメージ）


## OpenShift v3
- Redhat
- GUIも搭載
- PaaSってよく言われるけれど、PaaSというよりはKubernetesに足りない箇所をいい感じに追加している

ただここで上げたツールのイメージとして個人の1サーバしかない環境では重厚長大だと思ってる。

## Rancher
- 基本的にOSS(商用版もある）
- GUIがついてる
- 入れるの簡単
- コンテナ・実行ホストをデプロイできる
- 管理・ログ機能

色々あるけれど、1ホストで使ってもちょうど良いコンパクトさだと思ってる（大規模環境にも使えるように設計・開発はされているとのこと）


# Rancherをインストール
インストールといっても、管理サーバ側はDocker Imageを落としてきてrunするだけ。
### ホストの環境は
- Ubuntu 14.04.5 LTS
- Docker version 1.12.1, build 23cf638

インストールは下記で。
```
root@machine:~# docker run -d --restart=unless-stopped -p 8080:8080 rancher/server
```

終わったら http://hostname:8080 にアクセスすればこんな画面が出てくる

![スクリーンショット 2016-10-09 22.07.32.png](https://qiita-image-store.s3.amazonaws.com/0/8190/9db37e74-ee01-75dc-6564-99b4d0231c1e.png)

ホストを追加する画面
最近よくある形で、下部に出てくるコマンドを追加したいホストで打てば自動でホストが追加される。
![スクリーンショット 2016-10-09 22.09.13.png](https://qiita-image-store.s3.amazonaws.com/0/8190/9db4b474-73bf-4511-7252-9d75bd220c77.png)


アカウント連携画面
![スクリーンショット 2016-10-09 22.16.34.png](https://qiita-image-store.s3.amazonaws.com/0/8190/a8adcfa1-8470-784a-1241-ee66ae617936.png)

今回はここからLOCALを選択してRancher内部の認証方式を使う。セットアップが終わると管理画面につなごうとすると認証を求められるようになる。
![スクリーンショット 2016-10-09 22.22.14.png](https://qiita-image-store.s3.amazonaws.com/0/8190/31d2a504-3525-02cd-3e85-1b5954dec3f7.png)

これから色々Rancher内部を触って行こうと思う。
Python3で簡単にtwitterに投稿する

## はじめに
pythonからtwitterへの自動投稿をしたかったので、
twitterAPIとAPI連携ライブラリを利用した投稿方法を調べました。
pythonは3.x系を利用しています。

## APIキーとアクセストークンの取得

以下のアプリ開発者向けのサイトでアプリの新規登録をします。
[Twitter Application Management](https://apps.twitter.com/)

必要なキーとアクセストークンを取得し、メモします。

 - Consumer Key (API Key)
 - Consumer Secret (API Secret)
 - Access Token
 - Access Token Secret

## ライブラリのインストール

python向けのtwitterAPI連携ライブラリがあります。今回はシンプルな以下のライブラリを利用しました。
[sixohsix/twitter](https://github.com/sixohsix/twitter)

``` sh

# pipのインストール（pipがない場合）
easy_install pip

# pipを利用してライブラリをインストール
pip install twitter

```

## pythonでの投稿プログラムサンプル

``` python:twitter_post_sample.py
#coding: UTF-8

import twitter

# 取得したキーとアクセストークンを設定する
auth = twitter.OAuth(consumer_key="XXX",
                     consumer_secret="XXX",
                     token="XXX",
                     token_secret="XXX")

t = twitter.Twitter(auth=auth)

# twitterへメッセージを投稿する 
t.statuses.update(status="pythonからtwitterへの投稿テストです！")

```
atomエディタで実施するCSSの整形

世には["atom-beautify"](https://atom.io/packages/atom-beautify)という万能整形ツールがありますが、
インデントを揃えただけでは足りない。

## 今回の目的
CSSのプロパティ順序が一意に定まることで視線の移動は少なくなる。
これを素早く実施する。

### ["css-clean"](https://atom.io/packages/css-clean)と["stylefmt"](https://atom.io/packages/stylefmt)を実施する

```css:Sample.css
body {

  overflow-x: hidden;
  transform: rotate(0.028deg);
  overflow-y: scroll;



  height: 100%;
}
```

```css:Done.css
body {
  height: 100%;
  overflow-x: hidden;
  overflow-y: scroll;
  transform: rotate(0.028deg);
}
```


- [x] ["css-clean"](https://atom.io/packages/css-clean)
- メリット
  - 素早くプロパティをソート
- デメリット
  - ソートはパッケージ依存(順序変更できない)
  - `:`(コロン)の前後に空白が入る(`:`に基づく整形により有名なコーディング規約では非推奨に当たる)

- [x] ["stylefmt"](https://atom.io/packages/stylefmt)
- メリット
  - 素早い.stylelintrcに基づく整形
  - 上記の`:`整形問題の解決
- デメリット
  - ["linter-stylelint"](https://atom.io/packages/linter-stylelint)の導入(パッケージインストール)
  - ["stylelint-config-standard"](https://github.com/stylelint/stylelint-config-standard)を設定(.stylelintrcに若干記述)


🍵 CSSは壊れやすい言うけども、まず問題の早期発見の工夫を。
Zabbix 3.0でマクロのタイムゾーンがUTCから変更できなくてハマった

Zabbix 3.0で、WebUI等では時刻がJSTで表示できているにも関わらず、マクロ（DATE,TIME）で引かれる値がUTCとなってしまいハマったので、解決法を記録しておきます。

## 前提
* PHP(7)のタイムゾーンは以下のコマンドで変更済み  
```sed -i -e 's/mod_php5.c/mod_php7.c/' /etc/apache2/conf-available/zabbix.conf```  
```sed -i -e 's:# php_value date.timezone Europe/Riga:php_value date.timezone Asia/Tokyo:' \
/etc/apache2/conf-available/zabbix.conf```
* サーバのタイムゾーンは以下のコマンドで変更済み  
```echo 'Asia/Tokyo' > /etc/timezone```

## 解決法
以下のコマンドでローカルタイムを変更すれば治りました。
```cp /usr/share/zoneinfo/Japan /etc/localtime```

このあたり全然詳しくないので、もしかしたら変なことやってるかもしれません。
リスト、numpy配列の累算代入について

#オブジェクトが変更可能かどうか
Pythonのリスト、numpy配列において
`a = a + b`
`a += b`(累算代入と呼ばれる)
の挙動が違うことに注意する必要がある。

Pythonの累算代入では、可能ならばインプレース (in-place) 演算を行う。
すなわち、オブジェクトの内容が変更可能ならば、新たなオブジェクトを生成しない。

そのため、オブジェクトが変更可能(mutable)か変更不能(immutable)かが重要になってくる。数値型は変更不能なオブジェクトで、リストは変更可能なオブジェクトである。
#id関数で実験
Pythonの組み込み関数にid関数というものがある。
id関数を使うことで、オブジェクトの識別値を取得できる。識別値はオブジェクトの有効期間中は一意かつ定数であることが保証されている。
なので、このid関数を使って両者の違い説明をする。
#数値型
まずは`a+=1`から。

```python:test1.py
a = 1
print (id(a))
a += 1
print (id(a))
```
```python:test1.py実行結果
1663828464
1663828496
```
aの識別値が変わっていることがわかる。
Pythonでは数値型は変更不能(immutable)なオブジェクトであり、
`a+=1`の処理によってaの参照先が変わるためだ。
次に`a=a+1`を見てみる。

```python:test2.py
a = 1
print (id(a))
a = a + 1
print (id(a))
```
```python:test2.py実行結果
1656226288
1656226320
```
やはり、aの識別値が変わっていることがわかる。
ここまでは問題ないだろう。
#リスト
こちらが本題。

```test3.py
a = [0,1,2]
b = [2,3,4]
print (id(a))
a  =  a + b
print (id(a))
```


```test3.py実行結果
53560776
53560200
```
aの識別値が変わっている。
次に、


```test4.py
a = [0,1,2]
b = [2,3,4]
print (id(a))
a  += b
print (id(a))
```
```test4.py実行結果
53560008
53560008
```
今度は、aの識別値が変わっていない。
#numpy配列
くどくなってしまうので、numpy配列についての実験結果は割愛するが、
通常のリストと同様の結果になる。
numpyの公式チュートリアルにも以下のように記載がある。

Arithmetic operators on arrays apply elementwise. A new array is created and filled with the result.

Some operations, such as += and *=, act in place to modify an existing array rather than create a new one.

#まとめ
`a = a + b`
`a += b`
のような記述が等価とは限らないので注意が必要である。
Centos7にNginx + Unicornで構築したRedmine3.3の初期設定

# [概要]
Redmineの初期設定をまとめます。

# [事前準備]
下記が構築済みであること。
[Centos7にNginx + UnicornでRedmine3.3構築方法](http://qiita.com/sabakan7/items/d20e81b9395a654f6e5５)
[Centos7にNginx + Unicornで構築したRedmine3.3をLet's EncryptでSSL化対応](http://qiita.com/sabakan7/items/ee0ba72bed560311eb1d)

# [作業内容]
## ■　初期ユーザのパスワード作成
URLにアクセスすると、Redmineのホーム画面にアクセスするので、右上のログインからログインします。

![redmine](http://drive.google.com/uc?export=view&id=0Byh1aAqbAigJWVJtQzlPLXF2S3c)

初期ユーザのは下記となっている

|ユーザ名 |admin |
|-------|-------|
|パスワード|admin  |

![redmine_login](http://drive.google.com/uc?export=view&id=0Byh1aAqbAigJMUpKRjBzOXp1ajg)

ここはお好みによって、ユーザ名、メールアドレスを変更してください。
あとは、タイムゾーンが空白になっているので、「(GMT+09:00)Tokyo」とかにしておけば良いかと。
変更したら、「保存」を選択
![redmine_login](http://drive.google.com/uc?export=view&id=0Byh1aAqbAigJYThyd0pYRTdFRTg)

## ■　初期設定
### ■　Redmineの全般設定
「管理」 → 「設定」から設定画面を開きます。
![redmine_management](http://drive.google.com/uc?export=view&id=0Byh1aAqbAigJSHp0SW5pWEtza2c)

初回のアクセスだと、下記のような表示がされるので、適宜`デフォルト設定をロード`をしてください。
![redmine_management](http://drive.google.com/uc?export=view&id=0Byh1aAqbAigJbWlINnV2NTU5M3M)

設定を変更した項目はこんな感じ
ホスト名とパスはRedmineに使っているドメインを指定
プロトコルは、HTTPS対応してあるので、`HTTPS`に設定
テキストの書式とかは好みがあると思うので、お好きなように。

|ホスト名とパス |redmine.sample.com|
|-----------|------------------|
|プロトコル    |HTTPS             |
|テキストの書式|Markdown          |

![redmine_management](http://drive.google.com/uc?export=view&id=0Byh1aAqbAigJZWRNRzI2UTlZR0k)


### ■　Redmineの表示設定

変更点は下記だけです。
人によっては、`テーマ`を変更すると見やすくなるので、おすすめです。

|デフォルトの言語|Japanese(日本語)|
|------------|---------------|

![redmine_setting_display](http://drive.google.com/uc?export=view&id=0Byh1aAqbAigJTXVtWWNYbzJCbHc)

###　■　Redmineの認証設定
変更点はこんな感じ
セキュリティを考えて、`認証が必要`にチェックを入れてます。
これをすることによって、未認証のユーザはどのページにもアクセスできなくなります。
あと、パスワードの有効期限を設定して、一応1年間は同じパスワードを使えないようにしてます。

|認証が必要       |チェックを入れる｜
|---------------|------------|
|パスワードの有効期限|365日       |

![redmine_setting_authentication](http://drive.google.com/uc?export=view&id=0Byh1aAqbAigJOW1BdHdVMzR0cTg)

###　■　RedmineのAPI設定
後々使うことになるので、`RESTによるWebサービスを有効にする`にチェックを入れる。

![redmine_setting_api](http://drive.google.com/uc?export=view&id=0Byh1aAqbAigJamMwWnRRbzloRms)


###　■　Redmineのプロジェクト設定
プラグイン新規に追加した場合、`新規プロジェクトに置いてデフォルトで有効になるモジュール`から有効・無効を変更できます。
※Agileは、プラグインとして追加したものです。

![redmine_setting_api](http://drive.google.com/uc?export=view&id=0Byh1aAqbAigJNU4wTnZZckxqSG8)

これで一通りの設定が完了です。

# [事後確認・作業]
Pythonのコーディング規約PEP8を要約してみる(1)

#はじめに
PEP8の日本語版は以下のURL
https://pep8-ja.readthedocs.io/ja/latest/#id4
に書かれているのだが，私は長い文章を読むことが苦手なので私なりに要約した.
1つのテーマにつき1〜2文を心掛けて要約したものの，それでもまだ長いので記事を複数回に分ける.
文字だけで説明するのは難しいと判断した内容に関してはサンプルコードも載せた.
要約しすぎて意味まで変わってしまっているということがあればコメントしてください.


#コードレイアウト
##インデント
1つのインデントごとに，スペースを4回入れる.
##タブかスペースか？
スペースの方が望ましい.
Python3ではインデントにタブとスペースを混ぜるとエラーが出る.
##1行の長さ
すべての行の長さを，最大79文字までに制限する.
##2項演算子の前で改行すべきか、後で改行すべきか?
統一されているのであれば、2項演算子の前後どちらででも改行しても問題ない.
段落の中にある式は、常に2項演算子や関係演算子の後で改行するが，構造化された式は常に2項演算子の前で改行するのを推奨されている.

```
良い例：演算子とオペランドを一致させやすい
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)
```
```
悪い例：演算子がオペランドと離れてしまっている
income = (gross_wages +
          taxable_interest +
          (dividends - qualified_dividends) -
          ira_deduction -
          student_loan_interest)
```
##空行
関数やクラスの定義は2行ずつ空ける.
クラス内の関数の定義は1行ずつ空ける.
##ソースファイルのエンコーディング
常にUTF-8を使用するべき.
##import
import文は，通常は行を分けるべき.

```
良い例
import sys
import os
```
```
悪い例
import sys,os
```
しかし，以下のような場合はOK
```
from subprocess import Popen, PIPE
```
##モジュールレベルの二重アンダースコア変数名
```
__all__,__author__,__version__
```
のようなモジュールレベルの “二重アンダースコア変数”はimport 文の前に書く
##文字列に含まれる引用符
単一引用符' で囲まれた文字列と、二重引用符 " で囲まれた文字列は同じ.
統一されているのであればどちらを用いても問題なし.

#式や文中の空白文字
##以下の場合では空白は余計である
###・括弧やブラケット、波括弧 のはじめの直後と、終わりの直前
```
良い例：
spam(ham[1], {eggs: 2})
```
```
悪い例:
spam( ham[ 1 ], { eggs: 2 } )
```
####・カンマやセミコロン、コロンの直前
```
良い例:
if x == 4: print x, y; x, y = y, x
```
```
悪い例:
if x == 4 : print x , y ; x , y = y , x
```
###・関数呼び出しの引数リストをはじめる開き括弧の直前
```
良い例:
spam(1)
```
```
悪い例:
spam (1)
```
###・インデックスやスライスの開き括弧の直前
```
良い例:
dct['key'] = lst[index]
```
```
悪い例:
dct ['key'] = lst [index]
```
###・代入演算子を揃えるために、演算子の周囲に1つ以上のスペースを入れる
```
良い例：
x = 1
y = 2
long_variable = 3
```
```
悪い例：
x             = 1
y             = 2
long_variable = 3
```
###・その他の推奨事項
・行末に余計な空白文字を残さない
・2項演算子は、両側に常にひとつだけスペースを入れる
・キーワード引数や、デフォルトパラメータであることを示すために使う = の両側にスペースを入れない

```
良い例：
def complex(real, imag=0.0):
    return magic(r=real, i=imag)
```
```
悪い例：
def complex(real, imag = 0.0):
    return magic(r = real, i = imag)
```
・関数アノテーションはコロンの前にスペースを入れないというルールを守りつつ，-> 演算子がある場合はその両側には常にスペースを入れる.

```
良い例:
def munge(input: AnyStr): ...
def munge() -> AnyStr: ...
```
```
悪い例:

def munge(input:AnyStr): ...
def munge()->PosInt: ...
```
・デフォルト値をもった引数アノテーションと組み合わせる場合、 = の前後にはスペースを入れる

```
良い例:
def munge(sep: AnyStr = None): ...
```
```
悪い例:
def munge(input: AnyStr=None): ...
```
・複合文(一行に複数の文を入れること)は一般的に非推奨.また，if/for/while と 短い文を同じ行に置くことがOKな場合もあるが、複合文を置くのはNG

```
良い例:
if foo == 'blah':
    do_blah_thing()
do_one()
do_two()
do_three()
```
```
悪い例:
if foo == 'blah': do_blah_thing()
do_one(); do_two(); do_three()
```
READMEとは？

ソフトウェアに添付される使用法や注意事項が書かれたファイルのこと。
ソフトウェアの説明書という認識でOK！
最低限ユーザーに読んでほしい内容が書かれていることから「読んでください！」という意味でREADMEと名付けられている。
RailsでJavaScriptの依存関係

JavaScriptで次のように複数のファイルに依存関係があるとき、

```coffeescript:zzz.coffee
window.ZZZ =
  create: (name) ->
    # ....
```

```coffeescript:aaa.coffee
AAA = ZZZ.create('aaa')
```
require_treeだとアルファベット順に読み込まれるのでうまく動かない。
application.jsで順番を一つづつ指定して読み込ませるというのも流石に面倒すぎる。

こんな時はaaa.coffeeにrequireを記述すればいい。

```coffeescript:aaa.coffee
#= require 'zzz'
AAA = ZZZ.create('aaa')
```
よく考えたら当たり前かもしれないけど盲点でした。
macOS Sierra でOpenCVがインストールできない

## macOS Sierra にアップデートしたMacで```brew install opencv3```

```bash:shell
brew update
brew install -v cmake 
brew install opencv3
```

と打つと，これでインストールできるはずですが，

```shell-session
...
...
make[1]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[ 11%] Linking CXX shared library ../../lib/libopencv_video.dylib
...
...
...
[ 11%] Built target opencv_video
make: *** [all] Error 2
```

というようにmakeでエラーが出てしまいました．

~/Library/Logs/Homebrew/opencv/02.make
を見ると

```shell-session:shell-session
/tmp/opencv-20161009-48749-7hs5s5/opencv-2.4.13/modules/highgui/src/cap_qtkit.mm:46:9: fatal error: 'QTKit/QTKit.h' file not found
#import <QTKit/QTKit.h>
        ^
1 error generated.
make[2]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/src/cap_qtkit.mm.o] Error 1
```

というエラーが発生していることが確認できました．

## エラーの原因

上記のエラーで色々と調べてみると

http://stackoverflow.com/questions/39590741/fatal-error-qtkit-qtkit-h-file-not-found-when-i-build-opencv-on-mac

https://github.com/Homebrew/homebrew-science/issues/4303

https://github.com/Homebrew/homebrew-science/issues/4104

https://github.com/opencv/opencv/pull/7159

あたりがヒットしました．
どうやらmacOS Sierraにて，QTkitがサポートされなくなり，その結果エラーが出ているようです．

この問題は既にfixされmasterにmergeされているようなので，
--HEADオプションを付けてインストールします．

```bash:shell
brew install opencv --HEAD
```

するとmakeにようやく成功しました．

ところで，OpenCVはkeg-onlyというパッケージだそうで，シンボリックリンクを貼ってくれないそう．そこで，

```bash:shell
brew link opencv3 --force
```

とすることで強制的にリンクさせます．

最後に，

```bash:shell
g++ main.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`
```

とすれば，無事コンパイルが通りました．

## 参考URL
http://www.yasutomo57jp.com/2010/09/01/linux%E3%81%A7opencv%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E9%81%A9%E5%BD%93%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%99%E3%82%8B%E3%81%BE%E3%81%A7/
続・初心者による初心者に向けたクラス講座

#続・クラス説明

今回は[前回のクラス説明](http://qiita.com/fms_eraser/items/4ff4852b4774b48d08ef)に引き続き、継承などの内容を取扱いたいと思います。

##継承ってなんだ？

前回はクラスは設計図のようなものだと言いました。

その例として車を挙げましたが、一概に車と言っても様々な種類があります。

- バス
- 二輪車
- トラック
- その他たくさん...

では自転車のクラスを作りましょう！...となっても一から作り直すのは面倒くさいですよね！
何とかして以前作った車クラスを応用できないものでしょうか。実はそんな素敵な方法があるんです！
それが継承です.イメージとしては元の仕様書をコピーして一部を書き換えたり、要素を追加したりすることが出来ます。

継承元(車クラス)のことを親クラス(スーパークラス)と呼び、
継承先(自転車クラス)のことを子クラス(サブクラス)と呼びます。

```
継承 -> 設計図をコピーして書き換えたり、手を加えること

継承元(車)　 　　= 　親クラス(スーパークラス)
継承先(自転車)　 = 　子クラス(サブクラス)
```

##継承を使ってみよう！

###まずは継承

```processing
// 車の設計図(クラス)
class Car{
    // 高さと横幅と長さ、何人乗りかを変数にする
    float hight, width, length;
    int   seat_num;
    
    // 車をデータを元に作ってくれるやつ(コンストラクタ)
    Car(float _h, float _w, float _l, int _s){    // 引数にデータを入力しよう
        hight    = _h;
        width    = _w;
        length   = _l;
        seat_num = _s;
    }
    
    void run(){
        // 車が走る処理
    }
    void stop(){
        // 車が止まる処理
    }
}
```

これが以前作った車クラスです。とりあえず車クラスを継承した自転車クラスを作ってみましょう！

```processing
class Bicycle extends Car{

	// 継承元のクラスの変数と関数が中に入ってる！(本当は見えていない)
    // float hight, width, length;
    // int   seat_num;
    // void run(){
    //     // 車が走る処理
    // }
    // void stop(){
    //     // 車が止まる処理
    // }
    
}
```

上の時点で**コンストラクタ以外**の変数、関数が全て引き継がれます。

###変数追加

自転車には電動自転車という便利なものがあるらしいですね！
というわけで電動自転車かそうでないかを示す変数を追加してみましょう！

```processing
class Bicycle extends Car{
	// 電動自転車か否かを示す変数を追加する
	boolean isElectric;
}
```

たったこれだけで`isElectric`変数が追加されました。

###コンストラクタ

次はコンストラクタを設定しましょう！自転車は一人乗りですね？(二人乗りは危険ですよ！)
また、１から書き直しても良いのですが、親クラスのコンストラクタを使いたいときは、`super()`を使いましょう。

```processing
class Bicycle extends Car{

	boolean isElectric;
	
	// コンストラクタ
	Bicycle(float _h, float _w, float _l, boolean _isElectric){
		// 車クラスのコンストラクタはCar(height, width, length, seat_num)
		super(_h, _w, _l, 1);
		is Electric = _isElectric;
	}
}
```

これでコンストラクタの設定が完了です！


###オーバーライド

関数もすべて引き継がれていますが、自動車と自転車では走り方が違いますね？
車はエンジンを使いますが、自転車は足で漕いで走ります。
でももう`run()`という関数が定義されてしまっているではないですか！
大丈夫です。そんなときはオーバーライドです！
オーバーライドは親クラスで定義された関数を同じ関数名で書き換えることです。
とても簡単に出来てしまいます。

```processing
class Bicycle extends Car{
	// run()をオーバーライドする
	void run(){
		// 自転車が走る処理
	}
}
```

ね？簡単でしょ？

###まとめ

```processing
Aクラスを継承したBクラスを作りたい！
class B extends A{}
⇒これでAクラスのコンストラクタ以外を引き継いだBクラスが出来る！

継承したクラスに変数、関数をを追加したい！ ⇒ 継承したクラス内で宣言するだけ！

継承した関数を書き換えたい！ ⇒ 同名の関数を宣言し直すだけ！(オーバーライド)

親クラスのコンストラクタを使いたい！
super(a, ...);
⇒引数は親クラスのコンストラクタに揃える
```

以上、続・クラス説明でした！