OmniAICreator/Qiita-1.07M huggingface dataset:
GistのHTMLを直接表示する方法


ちょっとしたコードをシェアするのにGistは便利ですが、`HTML`としてそのままブラウザに表示したり、`JSON`として利用するには少々難があります。レスポンスヘッダの`Content-Type`が`text/plain`固定なので、Rawデータにアクセスしてもソース表示に。(↓スクリーンショット)

![Screenshot](https://qiita-image-store.s3.amazonaws.com/0/1858/b80b6a7e-d8b6-d861-4cde-0894b1843f3f.png)

## Gistを中継するサービス

HTMLの共有では[jsfiddle.net](http://jsfiddle.net)や[jsdo.it](http://jsdo.it)が人気ですが、`HEAD`要素内の変更ができず、モバイル向けのサンプル表示には向きません。例えば、`<meta name="viewport" content="user-scalable=no">`とかが出来ません。なんとかならないかなと思っていたところ、良さそうなサービスが2つほどありました。どちらも機能はだいたい同じです。

- githack: https://raw.githack.com/
- RawGit: https://rawgit.com/

![raw.githack.com.png](https://qiita-image-store.s3.amazonaws.com/0/1858/d0cc213d-73d1-2ae9-9d53-97a65cbc1edf.png)

## githackの使い方

githackを例に説明すると、特定のGistのURLについてドメイン部分を`githubusercontent`から`githack`に書き換えるだけです。拡張子に従って適切な`Content-Type`で送出してくれます。

`https://gist.githubusercontent.com/cognitom/xxxx/raw/yyyy/index.html`
`https://gist.githack.com/cognitom/xxxx/raw/yyyy/index.html`

一応、まとめておきます。こんな感じ(↓)ですね。

アクセス先 | 見え方 | Content-Type
:--- | :--- | :---
[Gistのパーマリンク](https://gist.github.com/cognitom/de11ba8cf4f4b98ac8ab#file-index-html) | 普段のGistのページ | n/a
[GistのRawデータ](https://gist.githubusercontent.com/cognitom/de11ba8cf4f4b98ac8ab/raw/2492f488474aa7a7b03b6577af819dbe27aad2b5/index.html) | ソース表示 | `text/plain`
[githack経由](https://gist.githack.com/cognitom/de11ba8cf4f4b98ac8ab/raw/2492f488474aa7a7b03b6577af819dbe27aad2b5/index.html) | Web表示 | `text/html`

というわけで、無事、ブラウザで表示できました。

![Screenshot](https://qiita-image-store.s3.amazonaws.com/0/1858/b7300905-bfb0-3659-27d0-d4855d37beae.png)

Gistのほか、GitHub, Bitbucketに対応しているのも嬉しいところです。

## githackの仕組み

ちなみに、このgithackですが、サービスのソースコードが[GitHubで公開](https://github.com/neoascetic/rawgithack)されています。といっても、中身は`nginx.conf`と`proxy.conf`だけ。要は`nginx`そのもの転送サービスですね。
【Kobito】Markdown記法&ショートカットまとめ【保存版】


ショートカットの確認がてら、実際に使ってみる練習も兼ねています。
あと自分の中で使う頻度が高そうなものから順番に書いています。
全て[Kobitoヘルプ](http://kobito.qiita.com/ja/docs/about-markdown "Kobito")を参考にしました。
あと自分の中で「これ使わないな」ってやつ&分からなかったものは入れてません。
理解したら、また随時追加予定です。

##内容
▶︎Markdown記法
-見出し
-文字装飾
-コード
-引用
-水平線
-表作成
-リンク
▶︎ショートカット一覧
-基本的なショートカットまとめ

#▶︎Markdown記法

##見出しは`#`でくくる

#　H1見出し
`#　H1見出し`

## H2見出し
`## H2見出し`

### H3見出し
`### H3見出し`

#### H4見出し
`#### H4見出し`

##### H5見出し
`##### H5見出し`


###### H6見出し
`###### H6見出し`

##イタリックは`*a*`もしくは`_a_`
*I've never been to haircut.*

##太字は`**a**`もしくは`__a__`
**Your hairstyle looks fabulous.**


##長いコード入力の時は```でくくる

```一行目は名前が入る
	hr {
height: 1px;
border: none;
border-top: 1px #000000 solid;
} 
```


##短いコード入力の時は`でくくる

`例：<a href=target=_"blank">` 


##引用は`>`でくくる

>こんな感じに引用が表示される

##水平線は`_`もしくは`*`をつかう

5種類あるのですが、一番シンプルだと感じたものだけ紹介させていただきます

`***`
`__`


以下のように表示されます

***
___


##表は以下の通りに入力する

```graph
| Left align | Right align | Center align |
|:-----------|------------:|:------------:|
| 左寄よせ     | 右寄せ      |　  中央寄せ    |
| How       | are          | you          |

```

すると、このように表示される

| Left align | Right align | Center align |
|:-----------|------------:|:------------:|
| 左寄せ     | 右寄せ      |　  中央寄せ    |
| How       | are          | you          |


##リンクの貼り方は`[リンク名](url)`
`[Kobitoヘルプ](http://kobito.qiita.com/ja/docs/about-markdown)`



#▶︎ショートカット一覧

ここからは基礎的なショートカットまとめです。

##基本的なショートカットまとめ

| キー | コマンド |
|:-----------:|:------------:|
| command + N | 新規記事の作成 |
| command + S | 記事の保存 |
| command + E | 記事の編集 |
| command + W | 記事を閉じる |
| command + P | 記事の印刷 |
| command + O | ファイルを開く |
| command + I | 画像の貼付け |^
| command + shift + I | スクリーンショットの貼付け |
| command + shift + P | プレビューを表示させる |
| J   | （トップ画面で）次の項目へ   |
| K   | （トップ画面で）前の項目へ   |
| O   | （トップ画面で）新規ウインドウで開く   |
| command + - | プレビューを小さくする |
| command + 0 | プレビューを元のサイズに戻す |
| command + M | Kobitoの最小化 |
| command + Q | Kobitoを閉じる |

ここらへんのショートカットが、使用頻度の高いものかと思います。
他のショートカットはKobitoのメニュー「アイテム」から随時確認することができます。
Macの「環境設定」→「キーボード」→「ショートカット」→「アプリケーション」の「+」でKobitoを選択すると、ショートカットの変更も可能ですので、それぞれ使いやすいようにカスタマイズしても良いかもしれません。


参照元：[Kobitoヘルプ](http://kobito.qiita.com/ja/docs/about-markdown "Kobito")
言語ごとのSoftTabsの設定について

[以前、言語ごとのエディタの設定の変更について書きました](http://qiita.com/s-shin/items/5e85c4005f7c7c2f72ec#%E8%A8%80%E8%AA%9E%E3%81%94%E3%81%A8%E3%81%AE%E8%A8%AD%E5%AE%9A)。

が、最近ハードタブの設定に困っています[^1]。

グローバルの設定では、

```cson
'global':
  'editor':
    'softTabs': false
```

とすることでインデントにハードタブを使うよう設定することが出来るのですが、現在の最新バージョン0.165.0では、言語別設定にsoftTabsを入れても反映されません。

ただ、不思議なことにMakefileに関しては、自動でハードタブになります。何か訳があるのかと思い、少しソースを覗いてみたら、こんなフレーズがありました。

```coffeescript:text-editor-spec.coffee
    it "uses hard tabs in Makefile files", ->
      # FIXME remove once this is handled by a scoped setting in the
      # language-make package

      waitsForPromise ->
        atom.packages.activatePackage('language-make')

      waitsForPromise ->
        atom.project.open('Makefile').then (o) -> editor = o

      runs ->
        expect(editor.softTabs).toBe false
```

https://github.com/atom/atom/blob/v0.165.0/spec/text-editor-spec.coffee#L3512

どうもMakefileについては特別な扱いをしており、でも言語別設定の方に移さないとね、ということでWIPのようです。

まとめ:

* 現バージョン（0.165.0）では、標準の言語別設定でsoftTabsを変えることが出来ません。
* 対応策
    * 言語別設定可能になるまで耐え忍ぶ。
        * 随時`whitespace:convert-spaces-to-tabs`で変換する[^2]。
    * Packageを入れる。
        * syntax-settingsなどではsoftTabsの設定も可能です（[参考](http://qiita.com/s-shin/items/35b48cf6fe7e2d348558)）


[^1]: 練習がてらgolangを書いているので
[^2]: golangなら`go fmt`をpre-commitで掛けておけば問題無いかもしれません。
ArUco用マーカーを一斉に作る

ARToolKitは有名ですが、ライセンスがGPLなので企業など事情がある人は使い辛いです。
[ArUco](http://www.uco.es/investiga/grupos/ava/node/26)はほぼ同等の機能を有しており、さらにBSDライセンスなので、めんどくさいことがないのでお気軽に使えます。

マーカー画像が用意されておらず、自分で作らないといけなく、ちょっと苦戦します。
自分のために多数のマーカーが印刷された画像を作るためのスクリプトを用意しました。

imagemagickとArUcoがインストールされている前提です。

```bash:mkmarkers.sh
#!/bin/bash

# create aruco markers in one jpeg file
# requirement: imagemagick, aruco
INITIAL_MARKER_ID=100
MARKER_NUM=20
MARKER_PIXEL_SIZE=100
OUTPUT_FILE=output.jpg
MARKER_BORDER=50
OUTPUT_DIR=/tmp/aruco_tpm
export LD_LIBRARY_PATH=/usr/local/lib

mkdir -p "${OUTPUT_DIR}"
pushd "${OUTPUT_DIR}"
rm -f *.jpg
for i in $(seq ${MARKER_NUM})
do
    marker_id=$((i + ${INITIAL_MARKER_ID}))
    echo $marker_id
    aruco_create_marker "${marker_id}" "${marker_id}.jpg" "${MARKER_PIXEL_SIZE}"
done

popd
montage -border "${MARKER_BORDER}" -tile 4x5 -background white -bordercolor white ${OUTPUT_DIR}/*.jpg "${OUTPUT_FILE}"
display "${OUTPUT_FILE}"
```
パーフェクトJava ３章 数値①


## 3-1 整数

### 3-1-2 ビット長と値の範囲
 5つの整数型のそれぞれに割り当てられているビット長が違うので扱える値の範囲が違うというお話。　
　プログラミング言語が、内部表現を隠蔽して整数型として10進数で使えているということは常に意識しておかないといけない。このあたりの内部表現は、「コンピュータはなぜ動くのか」が理解の手助けになっているかも。

### 3-1-4 リテラル表記
　2進数表記がJava7で加わったのは知っていたけど、アンダースコアで区切りを表現できるのはつい最近まで知らなかった。
たまに2進数で考えたいことがあるのでそれなりに使っている。読む人にとっても、ビット演算などのために使う変数とわかるのでありがたい。

```
n = 0b11111111
n = 0b_1111_1111 
```

### 3-1-5 文字と数値
　Javaの文字は内部的には数値というお話。基本的に、Javaでは文字を文字列として扱うけど、速度を出したいときなどは文字配列として扱うことがあり、そのときにこのあたりの考え方が生きている気がする。

### 3-1-7 整数型の使い分けの指針

- byte、char型  
小さな整数型としても使えるが、それぞれバイトおよび文字としての意味に限定して使うべき。
- short、int、long型  
「どれでもいいならばint型を使う」。int型のみアトミック性を保証しているのは知らなかった。ただ、ここまで64bit0Sが主流になってくると、long型でもパフォーマンスをそれほど気にしなくてもいい気がする。  
short型は、16ビット長に意味がある場合のみ（ex.TCP/IPの世界ののポート番号）。

## 3-2 整数の演算
基本的な演算子についての説明。

## 3-3 型変換
このあたりの厳密な型がJavaの好きなところ。自分はそれほど苦労しなかったけど、型が曖昧な言語でプログラミングを覚えた人は苦労するのかな？

### 3-3-2 キャスト
キャストのビット切り捨て動作の説明もある。基本的に、キャストが多い時は設計が悪いときがほとんどなので、設計から見直すべき。

## 3-4 ブーリアン（真偽値）
　
### 3-4-1 ブーリアン型
ブーリアン型の説明。変数に直接ブーリアンを代入するフラグ変数の多用は避けるべき。自分はフラグ変数をよく使ってしまいます。。。（このあたりはオブジェクト指向でプログラムを覚えたのではないくせが残っているのかも）
ifの条件式でtrue/falseと比較してるクソコードもたまに見る。

```
if (contains("foo bar", "bar") == true){
// hoge
}
```

### 3-4-2 ブーリアン型の注意点
ブーリアン型にまつわるバグは意外に多い。それを避ける1つの指針は、否定演算子をなくすこと。

```
if (!Character.isDigit(c) && !Character.isLetter(c)) {
	System.out.printlne("any symbol?");
}
```
↓否定演算子の除去

```
if (Character.isDigit(c) && Character.isLetter(c)) {
	; // through
} else {
	System.out.printlne("any symbol?");
}
```

個人的には読みやすくなったとは感じないが。。。いずれにしろ、テストコードで、すべての分岐を網羅しておくべき。テストコードを書かない人がまだまだ多い。
Clickで手軽にPythonのコンソールアプリケーションを作る


コマンドラインから実行できるPythonプログラムを作成したい場合、コマンドライン引数の処理に`argparse`や`optparse`を使って引数をparseするのが一般的かと思います。

[Click](http://click.pocoo.org/)ライブラリを用いると、任意の関数をデコレータでwrapするだけで、手軽にコンソールアプリケーションを作成することが出来て、便利です。

試しにURLをGETする簡単な実装をしてみます。

```http_fetcher.py
import click
import requests

@click.command()
@click.argument('url')
def fetch(url):
    click.echo(requests.get(url).text.encode('utf-8'))

if __name__ == '__main__':
    fetch()
```

```
% python http_fetcher.py http://www.qiita.com/
<!DOCTYPE html>...
```

*-o*で引数を指定すると、ファイルに書いてくれるようにしてみます。

```http_fetcher2.py
import click
import requests
import sys

@click.command()
@click.argument('url')
@click.option('-o', '--out-file', type=click.File('w'))
def fetch(url, out_file):
    if not out_file:
        out_file = sys.stdout
    click.echo(requests.get(url).text.encode('utf-8'), file=out_file)

if __name__ == '__main__':
    fetch()
```

```
% python http_fetcher2.py -o index.html http://qiita.com
% cat index.html
<!DOCTYPE html>...
```

ファイルもClickが自動的に開いてくれて、File Objectとして返してくれるので便利です。

その他、コマンドのグループ化、プログレスバーの表示など、気の利いた機能がいろいろついています。ドキュメントは[こちら](http://click.pocoo.org/3/)。
Python基礎講座(8 分岐)

# 分岐処理
プログラムの処理は「順次・分岐・反復」の組み合わせとされます。
プログラミング言語は一般的に上から書かれた命令文を順次実行しますが、
変数の値に応じて処理の内容を変化させることで、プログラムにより複雑な処理を
実行させることができます。

## if文
### if(もし～なら)
分岐処理の基本であるif文の構造は、以下になります。
「条件」が正しい場合、「処理」が行われます。

**if 条件 :
　　　処理**

if文において「処理」を記述する行は字下げ(インデント)を行ってください。

**if 条件 :
処理**

このように書いた場合は、他のプログラミング言語と異なりPythonは
以下のようなエラーを返します。
**IndentationError: expected an indented block**

```py3:if_example.py
a = 1
if a == 1:
   print("a is 1")
```
上記のプログラムは、"a is 1"を出力します。
変数aに1以外の値を格納した場合は、if以降の条件を満たさないため、
何も出力されません。

### if～else(もし～なら、それ以外なら)
「条件」を満たす場合は「処理A」、満たさない場合は「処理B」を実行します。

**if 条件 :
　　　処理A
  else :
　　　処理B**

```py3:else_example.py
a = 1
if a == 1:
   print("a is 1")
else:
   print("a is not 1")
```
上記のプログラムは、"a is 1"を出力します。
変数aに1以外の値を格納した場合は、"a is not 1"を出力するようになります。

### if～elif～else(もし～なら、それ以外で～なら、それ以外なら)
「条件A」を満たす場合は「処理A」、「条件A」を満たさず、「条件B」を満たす場合は「処理B」、
いずれの「条件」も満たさない場合は「処理Z」を実行します。
elif文は複数記述することが出来ます。

**if 条件A :
　　　処理A
  elif 条件B
　　　処理B
  else :
　　　処理Z**

```py3:elif_example.py
a = 1
if a == 1:
   print("a is 1")
elif a == 2:
   print("a is 2")
elif a == 3:
   print("a is 3")
else:
   print("a is not 1,2,3")
```
上記のプログラムは、"a is 1"を出力します。
変数aに2を格納した場合は、"a is 2"を出力します。
変数aに3を格納した場合は、"a is 3"を出力します。
1,2,3以外の値を格納した場合は"a is not 1,2,3"を出力します。

## 比較演算子
if文における「条件」の多くは *ある値 比較 ある値* を判定して、条件を満たすか満たさないか決定します。
この比較で用いる演算子を紹介します。

| **比較演算子** |  **説明**  |
|:--------------|-----------:|
| ==            | 等しい     |
| !=            | 等しくない |
| >=            | 以上       |
| <=            | 以下       |
| >             | より大きい  |
| <             | より小さい  |

算数で使用する記号の意味そのままなため細かい説明は省略しますが、等号の演算子のみ「=」ではなく「==」です。
また、型をまたがった比較は等価とはなりません。
整数と小数点以下が0の値は比較が出来ますが(1 == 1.0 はTrueを返します)、
1 == "1" はFalseを返します。

## and or not(かつ・または・ではない)
複数の「条件」を組み合わせて、より複雑な「条件」を作成することが出来ます。

```py3:and_or_not_example.py
a = 1
b = ['a','b','c']

if not (a == 1 and 'z' in b) or len(b) != 3 :
   print("ok!")
```

このプログラムはand、or、notの機能を説明するために無理に書いたプログラムですが、
何をしているか分かりますか？正解は
**（aが1かつb内に'z'が存在する）左記条件を満たさない、または、bの要素数が3でない**です。

## 必ずFalseを返す値
PythonでFalse(偽)として扱われる値は
* False
* ゼロとして認識できる数値(0や0.0)
* 空のリスト、タプル、ディクショナリ、セット
* None
他にもありますが、使用される値は上記が多いです。

### None型
None型は「値が存在しない」ことを示す特別な型です。
Noneか否かを判定するためには is None(またはis not None)を使用します。

```py3:none_explain.py
x = None
if x is None:
   print("x is none")

y = False
if y is not None:
   print("y is not none")
```

FalseはNoneではない点に注意してください。

次: [Python基礎講座(9 反復)](http://qiita.com/Usek/items/3a2f2529e2e7a0dd2542)
Python基礎講座(7 ディクショナリ)

##ディクショナリ
辞書型(ディクショナリ)は、[キーバリューストア](http://e-words.jp/w/KVS.html)でデータを保存します。
キーバリューストアについて知らない人は、郵便番号を連想してみてください。
郵便番号は、典型的なキーバリューでデータを格納したシステムです。
キー：107-0052　バリュー：東京都港区赤坂
キー：160-0021　バリュー：東京都新宿区歌舞伎町
他にも、学校の学籍番号と生徒名の関係もキーバリューと言えるでしょう。
Pythonではディクショナリを
`d = {'key1' : 'Value1', 'key2' : 'Value2'}`
のように定義します。

以下のプログラムをコピーして、実行してください。それぞれの機能を説明します。

```dictionary_explain.py
d = {'key1' : 'Value1', 'key2' : 'Value2'}

print("len(d) {0}".format(len(d)))
print("min(d) {0}".format(min(d)))
print("max(d) {0}".format(max(d)))

dic_d_key1 = 'key1' in d
dic_d_key3 = 'key3' in d
print("dic_d_key1 {0}".format(dic_d_key1))
print("dic_d_key3 {0}".format(dic_d_key3))

print("d[key1 {0}".format(d['key1']))
print("d[key1 {0}".format(d.get('key1')))
print("d[key1 {0}".format(d.get('key3')))
print("d[key1 {0}".format(d.get('key3','No Existance')))
d['key1'] = 'NewValue1'
d['key3'] = 'Value3'
del d['key2']
print("d {0}".format(d))
print(d.pop('key3'))
print("d {0}".format(d))
```

### ディクショナリ内の要素の存在確認
**キー in ディクショナリ** でディクショナリ内に要素が存在するかを確認できます。

### len(ディクショナリ)、max(ディクショナリ)、min(ディクショナリ)
**len(ディクショナリ)**と記述することで、ディクショナリ内のデータの数を取得できます。
**max(ディクショナリ)**と**min(ディクショナリ)**は、ディクショナリ内のデータが最大/最小の**データのキー**を返します。

### データの取得
ディクショナリでバリューを取得する場合は、キーを指定します。
**ディクショナリ[キー]**で取得できますが、この記法の場合、ディクショナリに存在しない
キーを指定した場合、エラーが発生します。
**キー in ディクショナリ**でキーが存在することを確認して処理を行う方法もありますが、
もう１つのキーの指定方法が**ディクショナリ.get(キー)**です。こちらはディクショナリに存在しない
キーを指定してもエラーにはなりません。さらに、
**ディクショナリ.get(キー,キーが存在しない場合のバリュー)**と記述することで、
キーが存在しない場合に返す値を設定することが出来ます。

### データの追加・更新
**ディクショナリ[キー] = バリュー**
キーがディクショナリ内に存在しない場合はデータの追加、存在する場合はバリューの更新となります。

### データの削除
**del ディクショナリ[キー]**
キーとキーに対応したバリューのデータを削除します。ただし、ディクショナリに存在しない
キーを指定した場合、エラーが発生します。
**ディクショナリ.pop(キー)**は、プログラムの出力結果でも分かるように、バリューを取得した上で削除します。
(箱から取り出す処理をイメージしてみてください）
ただし、こちらもディクショナリに存在しないキーを指定した場合、エラーが発生します。
**キー in ディクショナリ**でキーが存在することを確認して処理を行う方法もありますが、
popはgetと同様に、**ディクショナリ.pop(キー,キーが存在しない場合のバリュー)**と記述することで、
エラーを発生することなくキーが存在しない場合のバリューを返すよう記述することが可能です。

次: [Python基礎講座(8 分岐)](http://qiita.com/Usek/items/e63fd930a31c6faad856)
Python基礎講座(5 リスト・タプル)

# リスト
Pythonのリスト(List)は1つのリストに数値、文字列、リストなど様々な型の
データを格納することが出来ます。定数も変数も要素にすることが可能です。

**l = ['a', 'b', 'c']
X = [1, 2, 3.4, "a", l]**

Xには [1, 2, 3.4, "a", ['a', 'b', 'c']] が格納されます。
リストは[ ]で括って、各要素は,で区切ってください。
以下のプログラムをコピーして、実行してください。それぞれの機能を説明します。

```py3:list_explain:py
z = ['a','b','c']
x = [1, 2, 3.4, "a", z]
a_in_list = 'a' in z
d_in_list = 'd' in z
print("a_in_list {0}".format(a_in_list))
print("d_in_list {0}".format(d_in_list))
print("len(z) {0}".format(len(z)))
print("max(z) {0}".format(max(z)))
print("min(z) {0}".format(min(z)))
print("x[1] {0}".format(x[1]))
print("x[-1] {0}".format(x[-1]))
print("x[1:3] {0}".format(x[1:3]))
print("x[1:] {0}".format(x[1:]))
print("x[:3] {0}".format(x[:3]))
x[1:4] = ["taro","jiro"]
print("changed x {0}".format(x))
a = z + x
print("a {0}".format(a))

y = [] #create empty list
y.append("spam")
print("y {0}".format(y))
y.append("ham")
print("y {0}".format(y))
y2 = ["egg","ham"]
y.append(y2)
y.remove('ham')
print("y {0}".format(y))

z.reverse()
print("z {0}".format(z))

sortlist = [0,1,3,7,5]
sortlist.sort()
print("sort {0}".format(sortlist))
```

### リスト内の要素の存在確認
文字列型と同様に、リストも**x in リスト**でリスト内に要素が存在するかを確認できます。

### インデックシング
文字列型と同様に、リストもx番目の要素を取得することができます。

### len(リスト)、max(リスト)、min(リスト)
文字列と同様の処理が要素に対して行うことができます。

### 範囲を指定しての要素を差し替え
**x = [1, 2, 3.4, "a", z]**
に対して、
**x[1:4] = ["taro","jiro"]**
と記述することで、
**[1, 'taro', 'jiro', ['a', 'b', 'c']]**
このようにリストの内容を変更することが出来ます。
元々のリストの[1:4]の部分である[2, 3.4, "a"]つまり3つの要素が
差し替えの結果["taro", "jiro"]の2つになっています。
この”範囲を指定しての要素を差し替え”はリストに対しては可能ですが、文字列型はサポートしていません。

### 要素の追加
**リスト.append(要素)**でリストに要素を追加できます。
要素はリストでも可能です。この場合リストにリストを連結する処理となります。
プログラムからも分かるように、記号"+"でも同じ処理を行うことが出来ます。

### 要素の削除
**リスト.remove(要素)**でリストから要素を削除できます。
リストは同じ要素を複数格納することが出来ますが、指定した要素が複数存在する場合は
最初の要素を削除します。
存在しない要素を削除しようとした場合はエラーが発生します。
inを使用して事前に存在することを確認した後、remove()を行うと安全です。

### リストの逆順
**リスト.reverse()**でリストの要素の順番を逆にすることが出来ます。

### リストのソート
**リスト.sort()**でリスト内の要素を順番に並べ替えることが出来ます。

#タプル
タプルはリストに非常によく似ています。
[ ] ではなく( )で括ります。

**tuple = (1,2,3.4,"a","test")**

リストと同じように要素の存在確認や、インデックシング、len、min、maxは使用できますが、
要素の差し替えや要素の追加、削除は出来ません。
それでは、要素の変更が出来ないタプルを使用する理由はあるのでしょうか？

タプルを使用するメリットは、プログラムの実行速度が少し速いため、
内容が変わらないリストを用意したい場合はタプルも選択肢に入れることが出来ます。
他にもタプルを使用するメリットはありますが、それについては後述します。

次: [Python基礎講座(6 セット)](http://qiita.com/Usek/items/6d05a580142db7c31c07)
Python基礎講座(3 Pythonの実行)

## プログラムの実行
それでは実際にプログラムを書いてみましょう。
それぞれのコードの意味は、この後の章で各自説明しますので、
まずは実際に書いたプログラムを実行してみましょう。

**odd_or_even.py**という名前でファイルを作成し、以下のプログラムを記述します。
Pythonの特徴である字下げ（インデント）に注意してください。
字下げはタブでも半角空白でも大丈夫ですが、空白を使用する際は個数に注意してください。

```py3:odd_or_even.py
def odd_or_even():
    for i in range(1,6):
        if i % 2 != 0:
            print("{0} is odd".format(i))
        else:
            print("{0} is even".format(i))
        
    
if __name__ == "__main__":
    odd_or_even()
```

Pythonが正しくインストールされれば、プログラムを実行すると、以下のような結果が出力されます。

**1 is odd
2 is even
3 is odd
4 is even
5 is odd**

このプログラムは1から5までの値が奇数か偶数かを判断するプログラムです。
日本語に訳すと、上記のプログラムは以下のような処理を行っています。

* 1から5までの範囲の数値に対して
* 数値を2で割った余りが0でない場合は、「*数値* is odd」と表示
* そうでない場合は、「*数値* is even」と表示

次のページから、Pythonの記法の説明に入ります。
・・・が、その前に、今後の学習のために以下のことを覚えておいてください。

## print
プログラムで文字を出力するための命令文がprint文です。
以下のプログラムを実行して、print文の使用方法を理解してください。

```py3:print_explain.py
print("display statement")
print("display statement {0}".format("string"))
print("display {0} {1} {2}".format(1,"a","abc"))
```

## コメント
コメントはソースコードのうち、人間の言葉（日本語や英語）で挿入された注釈のことです。
コンピュータが処理を行うときには無視されるため、自由に文を挿入することができます。
あなたが書いたプログラムを他の人が読んだ際、コードだけではプログラムの意図が分からないことがあるかもしれません。
その際にコメントを入れておけば、相手にこちらの意図を理解してもらう助けになります。
また、一時的に動作させたくないプログラムがある場合、コメントにすることもあります。
行をコメントの状態にする場合、「#」を先頭に記述します。
以下のプログラムは"taro"、"saburo"を出力し、"jiro"は出力しません。

```py3:comment_explain.py
print("taro")
#print("jiro")
print("saburo")
```

複数行を一気にコメントアウトしたい場合は、ダブルクォーテーション（またはシングルクォーテーション）3つで文を囲みます。

```py3:multi_comment_explain.py
print("1")
#print("2")
print("3")
print("4")
'''
print("5")
print("6")
'''
print("7")
print("8")
"""
print("9")
print("10")
"""
```

コメントを上手に活用しましょう。

## 日本語の出力
以下のプログラムを実行してください。エラーが発生すると思います。

```py3:display_japanese_ERROR.py
print("こんにちは世界")
```

Pythonで日本語を出力したい場合、1行目に以下のコードを追加してください。

```py3:display_japanese.py
# -*- coding: utf-8 -*-
print("こんにちは世界")
```
正しく出力されると思います。
Pythonで日本語を入出力したい場合は、[文字コード](http://e-words.jp/w/E69687E5AD97E382B3E383BCE38389.html)に[utf-8](http://e-words.jp/w/UTF-8.html)を使用することを明記する必要があります。
※コメントで記述していますが、Pythonは文字コードの設定を理解します。

次: [Python基礎講座(4 数値型・文字列型)](http://qiita.com/Usek/items/d681c6b95d7bea6b3250)
Python基礎講座(2 Pythonのインストール)

2015年1月現在、Pythonには2つの大きなバージョンが存在します。
2000年に公開されたバージョン2.xの最終版である2.7と、2008年に公開された3.xの最新版3.4です。
今回はこれからPythonの学習を始める人を念頭に、Python3.4を使用します。
Python3.xは2.xのソースコードに対して[後方互換性](http://e-words.jp/w/E5BE8CE696B9E4BA92E68F9B.html)を持たないので注意してください。

## Pythonのインストール

### Windows/Mac OS
[公式ホームページ](https://www.python.org/downloads/release/python-342/)の”Files”から自分のPCのOSと32bit/64bitに対応した
インストーラをダウンロードします。
その後はインストーラの指示に従ってください。
[こちらのページ](http://www.pythonweb.jp/install/)はWindowsにPythonをインストールする際参考になります。
MacにPythonをインストールする際は[こちらのページ](http://methane.hatenablog.jp/entry/2013/11/05/Mac_%E3%81%A7_Python_%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89(2013_11))が参考になるかもしれません。


### Linux
ほとんどのLinuxディストリビューションにはPythonがプリインストールされています。

## 統合開発環境のインストール
インストールが完了したら、[コマンドプロンプト](http://e-words.jp/w/E38397E383ADE383B3E38397E38388.html)または同時にインストールされた
IDLE(Python GUI)でもプログラムが可能ですが、ソースコードを書くために
便利なテキストエディタやソフトウェアを使用することも出来ます。
僕はフリーの[統合開発環境](http://e-words.jp/w/IDE-2.html)である[PyCharm](https://www.jetbrains.com/pycharm/)を使用していました。
最近はAtomやVisual Studio Codeなど様々なテキストエディタ、IDEを使用してPythonを書くことができます。

## 「オンライン実行環境」 paiza.IO
2014年11月にリリースされたサービス[paiza.IO](https://paiza.io/?locale=ja-jp)を紹介します。
このサービスは、ブラウザでプログラムを記述して、即実行結果を
確認することが出来る便利なサービスで、Python3も対応しています。
ただし、使用する際には以下の点で注意が必要です。
* 後の章で紹介する命令文の一部が2015年1月時点では対応していない
* プログラムの実行結果が他のユーザにも公開されるので、コードに個人情報は書かないこと

次: [Python基礎講座(3 Pythonの実行)](http://qiita.com/Usek/items/fba0991e224a1cdea274)
Python基礎講座(1 Pythonとは)

## Pythonとは

Pythonとは、1991年に登場したプログラミング言語です。
以下のような特徴を持っています。

* [フリーソフト](http://e-words.jp/w/E38395E383AAE383BCE382BDE38395E38388E382A6E382A7E382A2.html)かつ[オープンソース](http://e-words.jp/w/E382AAE383BCE38397E383B3E382BDE383BCE382B9.html)
* [クロスプラットフォーム](http://e-words.jp/w/E3839EE383ABE38381E38397E383A9E38383E38388E38395E382A9E383BCE383A0.html)
* [インタラクティブシェル](http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%B7%E3%82%A7%E3%83%AB)
* 過去のプログラム言語の便利な考え方を多数取り入れている
* 科学演算や機械学習で利用可能なライブラリが多数用意されている

これらの特徴から、主に欧米で普及しています。
[Google App Engine](http://e-words.jp/w/Google20App20Engine.html)でも利用可能な言語としてJavaなどと共に採用されています。
[Youtube](http://e-words.jp/w/YouTube.html)や[Dropbox](http://e-words.jp/w/Dropbox.html)もPythonで記述されています。
意外なところでは、人気シミュレーションゲーム「Civilization 4」もPythonで記述されています。

このページを今読んでいる人の中は「Pythonは学習しやすいから」と聞いたことがあるのではないでしょうか？
Pythonが学習に適していると言われる理由はいくつかあります。
* [予約語](http://e-words.jp/w/E4BA88E7B484E8AA9E.html)が少ないためシンプル
* 同じ処理を行う命令は同じ名前で実行できるため分かりやすい
* [字下げ(インデント)](http://e-words.jp/w/E382A4E383B3E38387E383B3E38388.html)を強制することによりコードが何をしているのかが分かりやすい

「字下げの強制」はPythonの大きな特徴としてよく話題に挙がります。

◆例：C言語で書かれた階乗のプログラム

```c:factorial.c
int factorial(int x)
{
    if (x == 0) {
        return 1;
    } else {
        return x * factorial(x - 1);
    }
}
```

◆同じ結果を返すC言語のプログラムだが、分かりにくい

```c:factorial.c
int factorial(int x) {
 if(x == 0) {return 1;} else
 {return x * factorial(x - 1); } }
```

◆Pythonで書かれた階乗のプログラム

```py3:factorial.py
def factorial(x):
    if x == 0:
        return 1
    else:
        return x * factorial(x - 1)
```

◆このように書くとエラーとなる

```py3:factorial_ERROR.py
def factorial(x):
    if x == 0: return 1 else:
return x * factorial(x - 1)
```

また、求人案件から見るプログラミング言語別給料ランキングで
[1位を獲得したという調査結果](http://www.itmedia.co.jp/news/articles/1410/31/news126.html)もあります。

Python名前の由来は、イギリスのテレビ局 BBCが製作したコメディ番組
『空飛ぶモンティ・パイソン』です。

Pythonという英単語が意味する爬虫類のニシキヘビがPythonのマスコットや
アイコンとして使われることがあります。
![python.sh-150x150.png](https://qiita-image-store.s3.amazonaws.com/0/64230/e222c585-b5b4-8bbb-8b9b-7d22a0368be4.png)


次: [Python基礎講座(2 Pythonのインストール)](http://qiita.com/Usek/items/1acf10f7e302810463a9)
MacBook Pro (Retina, 13-inch, Mid 2014)の見た目を変える

#MBPの見た目を変更
[解像度](http://qiita.com/HOKARI_Yutaka/items/9aa17d9cf0213a20c441)については、[ここ](http://qiita.com/HOKARI_Yutaka/items/9aa17d9cf0213a20c441)(http://qiita.com/HOKARI_Yutaka/items/9aa17d9cf0213a20c441) で書きました。
それ以外の変更した点をメモ。

##デスクトップ設定
デスクトップの任意の場所で、2本指クリックする。
![スクリーンショット 2015-01-04 14.25.44.png](https://qiita-image-store.s3.amazonaws.com/0/26668/f3f0dfe0-6d39-c1dc-d011-5f61524b9bc6.png)
「表示オプションを表示」を選択。
![スクリーンショット 2014-12-29 12.06.35.png](https://qiita-image-store.s3.amazonaws.com/0/26668/ce31c500-432d-dffc-05f0-a2c95a491a64.png)
好みによってアイコンサイズ、グリッド感覚やテキストサイズを変更する。
![スクリーンショット 2014-12-29 12.07.39.png](https://qiita-image-store.s3.amazonaws.com/0/26668/27945361-a37c-9297-3f49-2a1c0a772611.png)

##メニューバーの変更
メニューバー、いろいろ変更できます。
###サウンド
順不同で、音量から。
例によって「アップルメニュー」から「システム環境設定」を選択し、そこから「サウンド」を選択。
![スクリーンショット 2014-12-29 12.23.40.png](https://qiita-image-store.s3.amazonaws.com/0/26668/4ef4165b-1567-cdba-2106-c2633db34615.png)
「メニューバーに音量を表示」をチェックすると、メニューバーにスピーカーマークが表示されます。
![スクリーンショット 2014-12-29 12.24.05.png](https://qiita-image-store.s3.amazonaws.com/0/26668/dcf827d6-d848-1cb4-38a3-5a3de263529b.png)
こんな感じ。
![スクリーンショット 2014-12-29 12.31.23.png](https://qiita-image-store.s3.amazonaws.com/0/26668/6e55f6ee-db54-2beb-7348-60b046d927a3.png)

###日付と時刻
はじめメニューバーの日付と時刻の表示はこんな感じ。
![スクリーンショット 2014-12-29 12.31.23.png](https://qiita-image-store.s3.amazonaws.com/0/26668/55207d20-5503-9e10-3cd7-82a0e22e303f.png)
「システム環境設定」から「日付と時刻」を選択。
「時計」タブを選択。
![スクリーンショット 2014-12-29 12.30.27.png](https://qiita-image-store.s3.amazonaws.com/0/26668/c28728e2-3180-76e5-9529-b88b24324a78.png)
好みの表示をチェック。
![スクリーンショット 2014-12-29 12.32.30.png](https://qiita-image-store.s3.amazonaws.com/0/26668/b87016e3-8169-e60c-4dab-1225516ea639.png)
こんな具合に変わります。
![スクリーンショット 2014-12-29 12.32.44.png](https://qiita-image-store.s3.amazonaws.com/0/26668/f1b495b9-319e-a644-3f50-9568a73bc831.png)

###バッテリー
何となくバッテリーの状況がみれますが、ちゃんと%表示でみたい。
バッテリーマークを右クリック
![スクリーンショット 2014-12-29 12.37.10.png](https://qiita-image-store.s3.amazonaws.com/0/26668/72b01213-06fb-f28d-95d3-767c75a95333.png)
「割合（％）を表示」をチェック
![スクリーンショット 2014-12-29 12.37.54.png](https://qiita-image-store.s3.amazonaws.com/0/26668/8f138d59-156b-aa49-baa9-a12e7d818e71.png)
バッテリーマークの横に％表示がでます。
![スクリーンショット 2015-01-04 14.57.40.png](https://qiita-image-store.s3.amazonaws.com/0/26668/08c629ac-0acf-0fb4-58be-0108c00194ae.png)

デスクトップ周りは以上！？
bison++ install (cygwin)

．．．メモです。
#Cygwin と bison++
Cygwinには，
　flex++は存在するが，
　Bison++はsetup-x86**.exe には入っていない模様？だ．
　(※)bison(++無し）は有り

# INSTALL
##flexpp-bisonpp
下記Webサイトからダウンロードして，普通にmakeしたらそのまま動く模様．
[flexpp-bisonpp](https://code.google.com/p/flexpp-bisonpp/)

##ビルド例
（cygwin-32bit版でのみ確認）
> $ tar xvfz bisonpp-1.21-45.tar.gz
> $ cd bison++-1.21/
> $ ./configure
> checking for gcc
> checking how to run the C preprocessor
> checking for install
> checking for minix/config.h
> checking for POSIXized ISC
> checking for working const
> checking for ANSI C header files
> checking for string.h
> checking for stdlib.h
> checking for memory.h
> checking for strerror
> checking for working alloca.h
> checking for alloca
> creating config.status
> creating Makefile
> 
> $ make
> （略）
> 
> $ make install
> sh ./mkinstalldirs /usr/local/bin /usr/local/lib  /usr/local/man/man1
> rm -f /usr/local/bin/bison++
> cd /usr/local/lib; rm -f bison.cc bison.h
> rm -f /usr/local/man/man1/bison++.1
> /usr/bin/install -c bison++ /usr/local/bin/bison++
> /usr/bin/install -c -m 644 ./bison.cc /usr/local/lib/bison.cc
> /usr/bin/install -c -m 644 ./bison.h /usr/local/lib/bison.h
> chmod a+r /usr/local/lib/bison.cc /usr/local/lib/bison.h
> /usr/bin/install -c -m 644 ./bison++.1 /usr/local/man/man1/bison++.1
> chmod a+r /usr/local/man/man1/bison++.1

#注意事項
ただし,Bisonファイルは，Unix形式（LF形式，CRLF形式(MSDOS形式)はNG）でないと，ツールが通らない

＝＝＞NG例（parser.yがMSDOS形式のテキストファイル）
> $ bison++ parser.y
> "parser.y", line 1: unknown character with code 0xd in declaration section
renameっていうコマンドあった


しらなかった。ショックである。

## インストール

```
brew install rename
```

## 使い方

基本的なやつ

```bash
# 正規表現で、カレントディレクトリの全ファイル名置換
$ rename -s .jpg _pc.jpg *

# 置換正規表現をperlとかっぽい形で書いてもOK
$ rename 's/\.jpg/_pc\.jpg/' *

# カレントディレクトリのファイルの、.bakっていう拡張子をすべて葬り去る
$ rename -x *.bak
# つまりこれとおなじ
$ rename -s .bak '' *
```

置換条件はたくさん渡してもOK。

```bash
$ ls
1.foo	2.bar	3.baz

# こうやったら拡張子が一巡して面白いのでは、とおもったけど
$ rename -s foo bar -s bar baz -s baz foo *

# 結果はこうだった
$ ls
1.foo	2.foo	3.foo

# つまりたくさん渡した場合は、はじめのやつから順に処理される。
```

さっきから使っている`-s`は、`--subst`の略。
全部を置換したい場合は`-S`/`--subst-all`を使う。

```bash
$ ls
1.foo.foo.foo

# subst
$ rename -s .foo .baa *

$ ls
1.baa.foo.foo

# 今度はsubst-all
$ rename -S .foo .baa *

$ ls
1.baa.baa.baa
```

## 関連記事
 - [複数のファイルに対して、特定の語を一気に置き換え - Qiita](http://qiita.com/fnobi/items/6761eb7c64ab1b0d98eb)

## 参考
 - [rename // plasmasturm.org](http://plasmasturm.org/code/rename/)
Virtualbox: コンソールを表示せずに仮想マシンを起動する

#方法
Shiftキーを押しながら起動ボタンをクリックする。
コマンド操作などは参考リンクを参照のこと。

#参考
VBoxHeadless（ウィンドウ非表示起動） | VirtualBox Mania
http://vboxmania.net/content/vboxheadless%EF%BC%88%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E9%9D%9E%E8%A1%A8%E7%A4%BA%E8%B5%B7%E5%8B%95%EF%BC%89-0
[Ruby2系][Rails4系]gem updateがうまくいかない時に見たい箇所


### gem updateでエラーが。。。


![スクリーンショット 2014-12-19 14.10.00.png](https://qiita-image-store.s3.amazonaws.com/0/15812/94812369-b804-ad98-6de9-f75188fd5665.png "スクリーンショット 2014-12-19 14.10.00.png")


![スクリーンショット 2014-12-19 14.10.54.png](https://qiita-image-store.s3.amazonaws.com/0/15812/153ae860-f765-7d94-d22b-38cdd6c61b19.png "スクリーンショット 2014-12-19 14.10.54.png")


エラー内容に従い、

```コマンド
bundle install 
```

をしてもうまくいきませんでした。


### 解決方法

その場合は、

```コマンド
ls -al /Users/ユーザー名/.rbenv/shims
```

```参考例
ls -al /Users/g08m11/.rbenv/shims
```

を実行し、ずらっと並んでいる　ディレクトリやファイルの中から

```
update_rubygems

```

の権限をチェック

もし、

![スクリーンショット 2014-12-19 14.17.07.png](https://qiita-image-store.s3.amazonaws.com/0/15812/a828ef43-1d65-04de-67b7-81adf6405393.png "スクリーンショット 2014-12-19 14.17.07.png")

となっていたら、

```コマンド
sudo chown -R ユーザー名:staff /Users/ユーザー名/.rbenv
```

とし、「.rbenv」配下がすべて同一の所有者の状態にすること。

すると、事象は解決します。
なんでもsudoを付ける癖がある人は注意が必要です。



## 追記

### 以下の場合はsudoによる実行で問題ありません。


```
g08m11:rails_app$ gem update
Updating installed gems
Updating actionmailer
Fetching: i18n-0.7.0.gem (100%)
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.
g08m11:rails_app$ ls -la  /Library/Ruby/Gems/
```
EclipseとAndroid StudioでAndroid SDKを共有する

2015/1/5 追記:
こんな面倒なことしなくても、custom installを選んでAndroid SDKの場所を指定すれば、足りないものを追加でインストールして簡単に共有することができました。。

# 背景

Android Studioの正式版がリリースされたので、新規プロジェクトはAndroid Studioで開発していくことにしました。一方、古いプロジェクトは移行にまだ時間がかかるので、引き続きEclipseも使っていきます。ただし、Android SDKはサイズが大きいので共有することにしました。

# 環境
* Linux Mint 16 Petra (Ubuntu Saucy Salamander (13.10) ベース)
* Android Studio 1.0.1

# 内容

* Android Studio をダウンロードして適当な場所に解凍します。

ダウンロードURL: http://developer.android.com/sdk/index.html

* Android Studio を起動します。

```bash
$ cd {installation home}/bin
$ ./studio.sh
```
標準インストールかカスタムインストールかを聞かれますが、標準インストールを選択します。

* Android Studio を一旦終了します。 $HOME/Android/Sdkに新しいAndroid SDKが作成されます。作成されていない場合はAndroid Studioで新規アプリケーションを適当に作成し、ビルドします。

* Eclipseで使っていた古いAndroid SDKのフォルダには存在せず、新しいAndroid SDKのフォルダにだけ存在するフォルダを古い方にコピーします。

```bash
add-ons/addon-google_apis-google-21
build-tools/21.1.2
extras/android/m2repository
extras/google/m2repository
platforms/android-21
system-images/android-21
```

* 新しいAndroid SDKのバックアップを取り、古いAndroid SDKへのシンボリックリンクに変更します。

```bash
$ cd $HOME/Android
$ cp -rf Sdk Sdk_bak
$ ln -s <古いAndroid SDKのパス> Sdk
```

# その他
共有する過程で、Build-toolsやGoogle Play Services Library を更新してしまい、Eclipse でエラーが出てしまいましたが、以下で解決しました。

* Google Play Services Library のプロジェクトが Eclipse で開けない。

Libraryを更新した際に、.projectファイルがなくなってしまったので一旦Eclipseのプロジェクトから消した後、再度インポートしました。

* v7 Support Library のプロジェクトにてリソースが見つからないエラーが発生。

```bash
...sdk/extras/android/support/v7/appcompat/res/values-v21/styles_base.xml:75: error: Error retrieving parent for item: No resource found that matches the given name 'android:Widget.Material.ActionButton'.
```
Stackoverflow (http://stackoverflow.com/questions/26431676/appcompat-v721-0-0-no-resource-found-that-matches-the-given-name-attr-andro) を参考に、project.properties ファイルの target=android-19 を target=android-21 に修正しました。
[iOS] CLLocationManagerで移動速度を取得する

Swift編はこちら：http://qiita.com/koogawa/items/0c23fbb2ab1e6a10055a

----

CLLocation クラスの `CLLocationSpeed` プロパティを使います。

```objc
/*
 *  speed
 *  
 *  Discussion:
 *    Returns the speed of the location in m/s. Negative if speed is invalid.
 */
@property(readonly, nonatomic) CLLocationSpeed speed __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_2_2);
```

単位は m/s です。位置情報が取得できない時はマイナスの値が返ります。精度はそこまで高くないようです。

## 実装例

```objc
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
    // Speedを更新
    self.speedTextField.text = [NSString stringWithFormat:@"%.2f", newLocation.speed];

    // km/hで表示したい場合
    self.kphTextField.text = [NSString stringWithFormat:@"%.2f", newLocation.speed * 3.600];
}
```

### 実行結果

![iOSシミュレータのスクリーンショット 2015.01.04 11.46.17.png](https://qiita-image-store.s3.amazonaws.com/0/8292/04dcecd1-4444-91d7-f0e9-a267cf0acc81.png)

## サンプルソース

https://github.com/koogawa/iSensor/blob/master/iSensor/SpeedViewController.m

## おまけ

iOSシミュレータでは **City Bicycle Ride**（自転車で移動している場合）などを再現できますが、それぞれの速度を取得したところ次のような結果になりました。

<table>
<tr><th>City Run </th><th>City Bicycle Ride </th><th>Freeway Drive </th></tr>
<tr><td> 約4m/s</td><td> 約7m/s </td><td> 約33m/s </td></tr>
<tr><td> 約14km/h</td><td> 約27km/h </td><td> 約120km/h </td></tr>
</table>

Freeway Drive の移動速度が意外と速くて驚きましたｗ
ssh のログレベルを変更する

ssh でどこかに接続するたびに

```
debug2: ...
debug1: ...
debug1: ...
```

というのがばーっと出てきて邪魔なので消しました。

## LogLevel の変更
出力するログのレベルは `/etc/ssh_config` にある (Mac の場合？) LogLevel で変更することができます。
私は debug のログが邪魔だったので、LogLevel を `DEBUG2` から `INFO` に変更しました。
設定できる値は `QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG, DEBUG2, DEBUG3` です。後ろに行くほど冗長になります。

## おまけ
### 接続をタイムアウトしないようにする
他になんか便利な設定ないかなと思い、いろいろ見たところ、ほとんどは良くわかりませんでしたが、`ServerAliveInterval` は便利そうだったので設定しました。

サーバーに接続しているとちょっと離席している間に接続が切れていて、再度接続し直さないといけないという経験があると思います。私はこれが本当に面倒だったので、定期的にサーバーに信号を送ってあげて接続を維持するようにしました。

信号の間隔を設定するのは `ServerAliveInterval`(default 0) です。
本来はサーバーが生きているかを確認するための設定で、サーバーから信号が返ってこないと何度かリトライし、接続を切断します。その際、リトライ回数を決めるのが `ServerAliveCountMax`(default 3) です 。

私は切断しないように定期的に信号を送りたいだけなので、`ServerAliveInterval` のみ変更しました。

```
ServerAliveInterval 60
```

これで 60 秒ごとに信号を送ってくれるので、意図しない切断がなくなります。
Ruby: Enumerator::Lazy で URI生成

末尾に「/page=n/」(n はページ番号)がつくような URI を生成したい場面の話です。

# Enumerator::Lazy で URI生成
URI生成の簡単な例です。

```rb:sample1.rb
mk_uri_gen = -> n = 0 { -> { "http://hoge/hoge/page=#{n += 1}/" } }

ug = mk_uri_gen.()
p ug.()       #=> "http://hoge/hoge/page=1/"
p ug.()       #=> "http://hoge/hoge/page=2/"
p ug.()       #=> "http://hoge/hoge/page=3/"
  :
```

これは、Enumerator::Lazy の仕組みを使い以下のようにできます。

```rb:sample2.rb
ug = (1..Float::INFINITY).lazy.map{|n| "http://hoge/hoge/page=#{n}/" }

p ug.next     #=> "http://hoge/hoge/page=1/"
p ug.next     #=> "http://hoge/hoge/page=2/"
p ug.next     #=> "http://hoge/hoge/page=3/"
  :
```

Enumerator::Lazy を使う場合は rewind や take, each などが使えて便利です。

```rb
   :
p ug.next     #=> "http://hoge/hoge/page=4/"
p ug.next     #=> "http://hoge/hoge/page=5/"
ug.rewind  # 巻き戻し
p ug.next     #=> "http://hoge/hoge/page=1/"
p ug.next     #=> "http://hoge/hoge/page=2/"
   :
```
```rb
# 最初の5つ分の繰り返し
ug.take(5).each do |uri|
  p uri
end
```
```rb
# 無限の繰り返し (注)ずっと処理が続きます
ug.each do |uri|
  p uri
  gets      # ここで、キー押下待ちになります。処理をやめるときは Ctrl-C を押しましょう
end
```


# URI テンプレートのパラメタ化
URI のテンプレートをパラメタとして渡せるようにしたいとします。

パーセント記法による書式文字列を渡す方法が考えられます。

```rb:sample3.rb
hoge = 'http://hoge/hoge/page=%{n}'

mk_uri_gen = -> tmpl { (1..Float::INFINITY).lazy.map {|n| tmpl % {n:n} } }

ug = mk_uri_gen.(hoge)
p ug.next    #=> "http://hoge/hoge/page=1/"
p ug.next    #=> "http://hoge/hoge/page=2/"
p ug.next    #=> "http://hoge/hoge/page=3/"
    :
```

 固定文字列をパラメタにしたい場合は上のようになりますが、ラムダを渡す方がより柔軟に処理できます。

```rb:sample4.rb
          # 1ページ目以前には「/page=n/」をつけない URI を生成するラムダ
hoge = -> n { %(http://hoge/hoge/#{"page=#{n}/" if n > 1}) }

mk_uri_gen = -> tmpl { (1..Float::INFINITY).lazy.map(&tmpl) }

ug = mk_uri_gen.(hoge)
p ug.next    #=> "http://hoge/hoge/"
p ug.next    #=> "http://hoge/hoge/page=2/"
p ug.next    #=> "http://hoge/hoge/page=3/"
    :
```

# Nokogiri::HTML::Document を返すジェネレータの例
```rb:sample5.rb
require 'open-uri'
require 'nokogiri'

hoge = -> n { %(http://hoge/hoge/#{"page=#{n}/" if n > 1}) }

conv       = -> uri { Nokogiri::HTML open uri }
mk_doc_gen = -> tmpl { (1..Float::INFINITY).lazy.map(&tmpl).map(&conv) }

dg = mk_doc_gen.(hoge)
                  # dg は Document を返すジェネレータ
dg.each do |doc|  # doc は URIが指定するページを読み込んだ Nokogiri::HTML::Document オブジェクト
  puts (doc/:title).map(&:text) * ' '

  gets   # キー押下待ち
end
```

# おわりに
本稿内容の動作確認は以下の環境で行っています。

```shell-session
$ ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]
```
```shell-session
$ gem list nokogiri

*** LOCAL GEMS ***

nokogiri (1.6.5)
```
```shell-session
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 14.04.1 LTS
Release:	14.04
Codename:	trusty
```

参考

- [class Enumerator::Lazy (Ruby 2.1.0 リファレンスマニュアル)](http://docs.ruby-lang.org/ja/2.1.0/class/Enumerator=3a=3aLazy.html)
- [無限リストを map 可能にする Enumerable#lazy (るびま: Rubyist Magazine 0041 号)](http://magazine.rubyist.net/?0041-200Special-lazy)
親愛なる甥に送るｃ学習のまとめ#1



#OS,コンパイラ
Winの場合、以下のパターンです。
BCC32 (Borland C++ Compiler 5.5)
CYGWIN　（Unixエミュ）
Visual Studio .net　（MSの環境）
wubi (Ubuntuのマルチブート環境を作ります)
VmwarePlayer （仮想環境構築）

Unix,Linux
gcc


OSはそれぞれ特徴があり、何が一番とは一概に言えません。

私のような技術者には、Unix,Linuxを使ったOSSが有利なので、Winを使う理由は現在ほとんどありません。
しかし、Winも捨てたものでも無い。制御系ではWin専用の環境もあるので。
どのOSにも対応できるようになっておくのが理想です。
但し、基本はGCCです。

#Win環境上のコンパイラ
##BCC32の場合
ダウンロード
http://www.embarcadero.com/jp/products/cbuilder/free-compiler
環境設定手順
http://www.cppdrive.jp/
IDE BccDev
http://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/C++2/02/bccsetup.html

##cygwinによる仮想環境
ダウンロード
https://www.cygwin.com/
※これはUnix仮想環境なので、Unixを学ぶ必要あり。

##VmwarePlayerによる仮想環境
ダウンロードはスクリーンショットの下、製品が色々あるけど、Player
![スクリーンショット 2015-01-04 12.20.49.png](https://qiita-image-store.s3.amazonaws.com/0/33317/b4c4f844-58e9-c5fd-fc05-3f3306e8fa21.png "スクリーンショット 2015-01-04 12.20.49.png")
https://my.vmware.com/jp/web/vmware/downloads


インストールしたら、OSのISOイメージをインストールしましょう。
ここにひと通りのLinuxの紹介とリンクがあります。
http://simosnet.com/livecdroom/

##Linux実機環境
中古PCを購入。OSは不要。DELL、ASUSなどが失敗しないでしょう。
WinでISOイメージをメディアに焼く
クライアントOSとしては、Ubuntu系をお勧めします。
BIOSをいじる。で、インストール

##エディタ、IDE
###vi,vim
vi,vimというエディタがあります。コマンドベース
Unix,Linuxを学びましょう。
![スクリーンショット 2015-01-04 12.40.04.png](https://qiita-image-store.s3.amazonaws.com/0/33317/5c560607-9550-2cc6-5711-ededbf9985f3.png "スクリーンショット 2015-01-04 12.40.04.png")

###sublime
http://www.sublimetext.com/3
英文読んで下さい。素晴らしいエディタです。

###Eclipse
https://eclipse.org/downloads/packages/eclipse-ide-cc-developers/lunasr1
英文読んで下さい。素晴らしいエディタです。

#c言語
http://www.kumei.ne.jp/c_lang/
extruderの使い方

extruderというのは普段はindexだけひょっこり表示されているが、
マウスでクリックするとスクロールされて内容が大きく表示されるjQueryプラグイン。
デモは[ココ](http://pupunzi.com/#mb.components/mb.extruder/extruder.html)に、ソースは[ココ](https://github.com/pupunzi/jquery.mb.extruder)にあります。

とりあえず使う

```html:extruder.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
  <script src="https://code.jquery.com/ui/1.11.1/jquery-ui.min.js"></script>
  <link rel="stylesheet" href="https://code.jquery.com/ui/1.11.1/themes/smoothness/jquery-ui.css">
  <!-- mbExtruder -->
  <link rel="stylesheet" href="./lib/extruder/css/mbExtruder.css" >
  <script src="./lib/extruder/inc/mbExtruder.js"></script>
  <script src="./lib/extruder/inc/jquery.hoverIntent.min.js"></script>
  <script src="./lib/extruder/inc/jquery.mb.flipText.js"></script>
  <script>
   /* javascript */
  </script>
</head>
<body>
  <div id="extruder" class="a {title:'Hide Menu'}">
    <div>Contents_1</div>
    <div>Contents_2</div>
    <div>Contents_3</div>
    <div>Contents_4</div>
  </div>
</body>
</html>
```
```javascript:javascript
$(function(){
  $("#extruder").buildMbExtruder({
      position : "left" // flapをどこに表示するか。
  });
});
```

出来上がり
![open.png](https://qiita-image-store.s3.amazonaws.com/0/48569/39faab5c-5375-84aa-a408-a6f0988c1d3b.png)


buildMbExtruderのオプション一覧

| オプション            | 説明        |
|:---------------------|:------------|
| width                | クリックして内容を表示させた時、どの幅までスライドさせて表示させるか。デフォルト値：350            |
| sensibility          | クリックしなくてもマウスを乗せただけでスライドを開くようにした時、どのくらいの時間乗っけていたら開くか？試しても反応なし。            |
| positionFixed        | 目印の位置は固定するかどうか。trueの場合スクロールしても常に表示される。            |
| accordionPanels      | 複数のextruderを配置し、片方を開いている時にもう片方のextruderを開いた場合、元々のextruderをしまうか、どのまま表示するか。デフォルト値：true(閉じて隠れる。)            |
| position             | flapを表示する位置(top, left, right, bottom)。デフォルト値：top            |
| extruderOpacity      | スライドを閉じて表示している時の透明度(0.0~1) デフォルト値：1(透明度なし)           |
| flapDim              | flapの大きさ？よくわからん。            |
| textOrientation      | flapの文字の向き上から読むか下から読むか。デフォルト値："bt"(下から読む)            |
| onExtOpen            | 開いた時のイベント(開き始めた時に通知)            |
| onExtContentLoad     | 表示内容を読み込んだ時のイベント            |
| onExtClose           | 閉じた時のイベント(閉じきった時に通知)            |
| slideTimer           | スライドの速度。デフォルト値：300(ms)            |
| hidePanelsOnClose    | なんじゃこりゃ。サブパネルを実装した時になんちゃらかんちゃら。            |
| autoCloseTime        | 自動で閉じるまでの時間(ms)。デフォルト値：0(ずっと表示)            |
| closeOnExternalClick | 表示内容を閉じる方法。falseにするとflapをクリックしないと閉じない。trueにするとどこか他の箇所をクリックすれば閉じる。            |
| closeOnClick         | 表示内容をクリックすれば閉じる？よくわからん。 |
ランダムな文字列を発生させる

### ランダムな文字列を発生させる


```r
RanString <- function(strlength){
  seed <- c("A","B","C","D","E","F","G","H","I","J",
            "K","L","M","N","O","P","Q","R","S","T",
            "U","V","W","X","Y","Z")
  paste(seed[round(runif(strlength, 1, length(seed)))], collapse="")
}

RanString(1)
RanString(2)
RanString(10)
```
Google Apps Scriptでスプレッドシートを別形式で保存

## 目的
- Google Apps Scriptでスプレッドシートを出力できるのはPDF形式のみで、かつサイズ等のオプション変更ができないので実用性が低い。
- それを解決するため、UrlFetchを使ってデータを取得する方法を次に示す。

#### 追記）OAuth対応
- Google APIが認証方式をOAuthに統合したため、それに対応するように修正行う。
 - [Changes to OAuth in Apps Script - Google Apps Developer Blog](http://googleappsdeveloper.blogspot.jp/2015/03/changes-to-oauth-in-apps-script.html)
 - [getOAuthToken() - Class ScriptApp - Apps Script — Google Developers](https://developers.google.com/apps-script/reference/script/script-app#getOAuthToken())

####実際のコード
```js
// exportのオプション
var fileTitle = "ファイル名";
var gdocUrl    = 'https://docs.google.com/spreadsheets/';
var exportOptions = {
  exportFormat: "pdf",
  size:         "7",
  fzr:          "false",
  portrait:     "false",
  gridlines:    "false",
  printtitle:   "false",
  sheetnames:   "false" 
};

// メールのオプション
var mailConf = {
  "to" : "dummy@mail.com",
  "title" : "メール添付テスト",
  "msg": "テストです。"
};

// 対象となるファイルとシート（この場合は最初のシート）
var ss = SpreadsheetApp.getActiveSpreadsheet();
var fileId = ss.getId();
var sheetId = ss.getSheets()[0].getSheetId();

// export用のURLを生成
var qs = [];
qs.push( "gid=" + sheetId );
for( paranName in exportOptions ){
  qs.push( paranName + "=" + exportOptions[paranName] );
}
var fetchUrl = gdocUrl +'d/'+fileId+'/export?' + qs.join("&");

try{

  // ファイルをUrlFetchで要求
  var fetchOption = {
    "headers" : { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() },  // OAuth
    "muteHttpExceptions" : true 
  };
  var fileName = fileTitle + "." + exportOptions.exportFormat;
  var fileBlob = UrlFetchApp.fetch(fetchUrl,fetchOption).getBlob().setName(fileName);

  // ファイルをドライブに保存
  DriveApp.createFile(fileBlob);

  // メール送信を実行  
  MailApp.sendEmail( mailConf.to, mailConf.title, mailConf.msg, {
    attachments : [fileBlob]
  });

} catch(e){
  Logger.log( "ファイル生成に失敗しました" );
}
```

## 参考
- 標準的なPDF出力方法は次の通り。
- PDF以外の出力形式を選択できず、かつ印刷オプションを指定することもできない。
 - [getAs(String) - Class Spreadsheet - Apps Script — Google Developers](https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getAs(String))
 
#### コードサンプル
```js
MailApp.sendEmail( 'to@mail.com', 'mail title', 'mail body', { attachments:[{
    fileName : 'test.pdf',
    content  : SpreadsheetApp.getActive().getAs('application/pdf').getBytes(),
    mimeType :'application/pdf'
}]});
```
STM32F4DISCOVERY + .NET Micro FrameworkでLチカ

# はじめに
[こちら](http://qiita.com/takjn/items/23945868b4ac7c668e97)の手順で.NET MFを書き込んだSTM32F4DISCOVERYを使って、LEDを点滅させてみます。
Windows 8 64Bit + Visual Studio Express 2012 for Windows Desktop + .NET Micro Framework V4.3 RTMを使います。

# 手順
Visual Studioを起動して、プロジェクトを作成します。

1. ファイル > 新しいプロジェクト を選択
2. Visual C# > Micro Framework > Console Application を選択
3. プロジェクト > 参照の追加 を選択
   * Microsoft.SPOT.Hardware を選択してOK
4. プロジェクト > 既存項目の追加 を選択
   * C:\MicroframeWorkPK_4_3\DeviceCode\Targets\Native\STM32F4\ManagedCode\Hardware を開く
   * "HardwareProvider.cs" "CPU.cs"  を選択して OK
5. プロジェクト > プロパティ を選択
6. .NET Micro Framework タブを選択、TransportにUSBを選択し、DeviceがCerb-Family_Gadgeteerとなったことを確認
7. Program.csを開く

```csharp:Program.cs
using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using Microsoft.SPOT.Hardware.STM32F4;

namespace STM32F_Test
{
    public class Program
    {
        public static void Main()
        {
            OutputPort led = new OutputPort(Pins.GPIO_PIN_A_1, false); 

            while (true)
            {
                led.Write(true);
                Thread.Sleep(250);
                led.Write(false);
                Thread.Sleep(250);
            }
        }
    }
}

```

# 実行
PA1(とGND)にLEDを接続します。
あとは、Visual Studioの開始ボタンを押すだけ。

デバッガも動きますので、一時停止などもできるようです。
EditorWindowのOnGUIを好き勝手呼び出す

とは言ったものの、`void Update() { OnGUI(); }` のように直接呼び出すことはできません。

## Repaintメソッドを使う
一番簡単なOnGUIの呼び出し方としては、EditorWindow.Repaintメソッドを呼び出す事だと思います。

```csharp
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;

public class FrameCountWindow : EditorWindow
{
    [MenuItem("Window/FrameCountWindow")]
    public static void OpenWindow()
    {
        GetWindow<FrameCountWindow>();
    }

    void OnGUI ()
    {
        EditorGUILayout.LabelField ("Frame: " + Time.frameCount);
    }

    // 毎フレーム更新
    void Update()
    {
        Repaint();
    }
}
#endif
```
メニューバーからFrameCountWindowを開けます。
Playすると、下の画像の'Frame: xxx'が凄い勢いで回っていきます。
![スクリーンショット 2015-01-04 11.05.36.png](https://qiita-image-store.s3.amazonaws.com/0/5973/b1345782-35c6-63bb-6344-e12e32452144.png)

ただ、Repaintした瞬間に再描画が行われるわけではないでしょうね。
OnGUIの呼び出し自体は普通のフローで行われているでしょう。きっと。

## イベントを発行する
Repaintメソッドを使わない方法としては、自分でEditorWindowに対して再描画関係のイベントを発行する、というものがあります。

```csharp
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;

public class FrameCountWindow : EditorWindow
{
    [MenuItem("Window/FrameCountWindow")]
    public static void OpenWindow()
    {
        GetWindow<FrameCountWindow>();
    }

    void OnGUI ()
    {
        EditorGUILayout.LabelField ("Frame: " + Time.frameCount);
        Debug.Log(Event.current.commandName);
    }

    // 毎フレーム更新
    void Update()
    {
        var editorEvent = EditorGUIUtility.CommandEvent("Count" + Time.frameCount);
        editorEvent.type = EventType.Used;
        SendEvent(editorEvent);
    }
}
#endif
```
上記の例では、EditorGUIUtility.CommandEventメソッドでイベントを作成し、そのイベントを自身にSendEventして投げ込んでいます。

EditorGUIUtility.CommandEventメソッドの引数の文字列については、何でも大丈夫です。
この文字列は、OnGUIメソッド内では`Event.current.commandName`で取り出すことができます。

`editorEvent.type = EventType.Used;`で設定しているEventTypeについては、ものによってはOnGUIが呼ばれない事がある点に注意して下さい。

またこの方法も、あくまでイベントを発行しているだけであり、SendEventした瞬間にOnGUIが呼ばれているわけではありません。きっと。

## おわり
今回は、EditorWindow内で自身を再描画するという処理だったので、あんまりありがたみの無いサンプルになってしまいましたね。
ただ、EditorWindow.RepaintとEditorWindow.SendEventは共にpublicなメソッドなので、どこからでも呼び出すことができます。
「エディタでPlay中にリアルタイムでEditorWindowを更新したい！」なんて状況で使えるかもしれません。
bazaarのコマンド

bazzarでよく使うコマンドを備忘録代わりにまとめてみました。

■共用リポジトリの生成

```bash
$ bzr init-repo --no-trees (リモートリポジトリのパス)
```

■ローカルリポジトリの生成

```bash
$ bzr init
```

■ファイルを作業ツリーに追加

```bash
$ bzr add 
```

■作業ツリーの状態を参照

```bash
$ bzr status
```

■ファイルをローカルリポジトリに保存

```bash
$ bzr commit -m "コミットメッセージ"
```

■ファイルをリモートリポジトリに保存

```bash
$ bar push (ブランチ名)
```

■修正した差分を見る

```bash
$ bzr diff -c (リビジョン番号)
```

（参考）
http://doc.bazaar.canonical.com/bzr.2.1/ja/index.html

http://doc.bazaar.canonical.com/bzr.2.1/ja/tutorials/centralized_workflow.html
シェルスクリプトコーディングルール

インフラエンジニアたるもの、シェルスクリプトは頻繁に書くと思います。
自由に書きやすい分、メンテナンスがしづらい面も多い言語でもあるので、自分ルールを書き留めておこうと思います。


#シェルの宣言(1行目)には気をつける
1行目にはみなさん何を宣言[^1]しますか？
Linux使いならbashかzshが多いと思う。
UNIX使いなら生粋のsh(bourne shell)が多いと思う(独断)。
ただ、1行目の宣言においては、/bin/sh は環境によってbashだったり他だったりにシンボリックリンクが張られていることが多いので、どんな記述をするか(言語依存の記法)に合わせた宣言をするべき。
特にif文などの条件分岐、比較演算は記法依存が大きいので、そのあたりで使い分けるのがポイント。
自分ルールだと、

* Linuxだと `#!/bin/bash`
* UNIX(HP-UX, Solarisなど)だと `#!/bin/sh`

としています。

[^1]: 1行目の宣言のことをシバン/シェバンと呼ぶらしいですね。実はこの記事書いてて初めて知りました。[シバン (Unix) - Wikipedia](http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%90%E3%83%B3_%28Unix%29)


#戻り値は明示的に返す
多くの場合、エラー時には明示的に`return 1`や`exit 1`を返すと思います。
では正常時はどうでしょうか。
これは賛否両論あると思いますが、自分ルールの場合は正常時は `exit 0` で明示的に0を返すことにしています。

シェルスクリプトはその性質上、ジョブスケジューラ(個人レベルだとcron、業務レベルだとJP1やHinemosなど)から叩かれることが多いため、ジョブフローの制御において

* 正常終了は0
* 以上終了は1

とされることが多いです。
そのため、正常に終了する場合は明示的に0で返し、異常終了する場合は明示的に1を返すほうが何かと親切な設計になると思います。(いろいろ心配されるんですよ、本当に0で終わるのか？と聞かれたり。。。)


#変数のスコープを意識する
シェルスクリプトは変数のスコープが非常に曖昧です。
別メソッドのスコープ内で宣言した変数は、意図しない限りはいわゆるグローバル変数のように振る舞います。
なので、メソッド内でのみ使うものは意識的に`local`を付けてローカル変数として扱うほうがよいでしょう。
自分ルールでは以下のようにしています。

* ローカル変数(メソッド内など)：`local variable=ほげほげ`
* グローバル変数(メインシェル内など)：`Variable=ほげほげ`
* 環境変数：`export VARIABLE=ほげほげ`


#複数本のシェル郡を書く場合は、メインシェルとライブラリの2本立てで作る
シェルスクリプトは非常に読みやすいです。
上から処理順に書いてあるので、読みやすいし、その流れに倣って書きやすいです。
ただし、シェルスクリプト1本で全て完結してよいのは単独な簡易シェルを書く場合のみ。
業務レベルで作成すると何十本という単位でシェルを作成することが多いので、汎用的に使えるようにサブシェルにライブラリ化したうえで、メインシェル側は処理フローのみ記述するようにしましょう。

ライブラリ側を書く時も、できるだけオブジェクト指向に書くほうが汎用性が上がるでしょう。
シェルスクリプトの場合、同名メソッドによるオーバーライドができないのでメソッド名を変えるしか無いですが。。。
たとえばログ関数のような場合、

```shell-session
logging() {
  local loglevel=$1
  local msgbody=$2
  local msg=[${loglevel}]${msgbody}
  echo "${msg}"
}
```

としておいたうえで、ログレベルに応じて呼び出すメソッドを変えてやります。

```shell-session
logging_info() {
  logging "INFO" "$1"
}

logging_error() {
  logging "ERROR" "$1"
}
```

エラーレベルの時だけsyslogに出力したくなったら、`logging()`を書き変えてあげればよいだけですね。
という感じでライブラリを育ててあげましょう。


---
ひとまず以上です。
何か書き留めておいたほうが良いことを思い出したら追記します。