OmniAICreator/Qiita-1.07M huggingface dataset:
gitmemo

# gitmemo
最近、仕事でもgitを使うことが増えました。
さよならsvn・・でも容量が大きなファイルはgit苦手なのでドキュメントはsvnのほうがいいですかね。

## gitコマンドもろもろ
### 状態確認
`git status`
カレントディレクトリの状態をみます。
ファイルの追加、更新、削除など。

`git log`
コミットログが見れます。

`git remote -v`
リモートリポジトリの登録情報が見れます。
普通ならoriginが登録されているはず。

### ブランチ関連
`git branch`
ローカルのブランチ一覧を表示

`git branch -a`
リモート含めてブランチ一覧を表示

`git checkout [branch_name]`
ブランチの切り替え

`git checkout -b [branch name]`
現在のブランチを元に新しいブランチを作成

`git checkout -b [remote_repository]/[branch_name]`
*ex. `$git checkout -b origin/develop`*
リモートのブランチを元に新しいブランチをローカルに作成

### ステージング、コミット、プッシュ、プル
`git add -n [file]`
*ex. $git add -n aaa.txt*
いわゆるdry-run。実際には実行されません。
どのファイルが追加されるのか試せます。
後述の`-u`つけるときに使うと便利。

`git add -u`
更新のあったファイルだけaddします。
untracked filesよろしく新規追加ファイルは追加されません。
`-n`つけて確認がおすすめ。

`git add -A`
すべてのファイルをaddします。
新規ファイルも追加されます。
おなじく`-n`つけて確認がおすすめ。

`git commit -m 'commit message'`
コミットメッセージ付でコミットできます。
mオプションなしだと、viでの編集画面が開いてメッセージを入力できます。

`git push origin master`
リモートリポジトリoriginのmasterブランチに内容をプッシュします。

`git pull origin master`
リモートリポジトリoriginのmasterブランチの情報を取得して、マージします。
pull = fetch + merge



追記中...
言語処理100本ノック 00~02


今、言語処理のための機械学習入門という本で機械学習の勉強をしております。そのアウトプットとして東北大学　乾・岡崎研究室の言語処理100本ノック2015をpythonで実装しようと思います。
目標は8月中にやりきります、、、予定では!!
pythonのパーション2.7.9です。
http://www.cl.ecei.tohoku.ac.jp/nlp100/

**第1章**
*00.文字列の逆順*
文字列"stressed"の文字を逆に（末尾から先頭に向かって）並べた文字列を得よ．

```nlp00.py
#!/usr/bin/env python
s = 'stressed'
def reverse(a):
    for i in range(len(a)/2):
       temp = a[i]
       a[i] = a[len(a)-(i+1)]
       a[len(a)-(i+1)] = a[i]
    return a
print(reverse(s))
```
*00 改良版*

```nlp00re.py
#!usr/bin/env python
s = "stressed"
print(s[::-1])
```

*01.パタトクカシーー」*
「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ．

```nlp01.py
#coding: UTF-8
str = u'パタトクカシーー'
print(str[0:len(str):2])
```

*01改良版*

```nlp01re.py
#! usr/bin/env python
#coding:UTF-8
str = u"パタトクカシーー"
print(str[::2])
```
`str[::2]`この書き方はpythonぽいって感じなのかなー

*02.「パトカー」＋「タクシー」＝「パタトクカシーー」*
「パトカー」＋「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ．

```nlp02.py
#!/usr/bin/env python
#coding: UTF-8
str1 = u'パトカー'
str2 = u'タクシー'
str = ''
for i in range(len(str1)):
    str = str + str1[i]+str2[i]
print(str)
```

*０２改良版*

```nlp02.py
#!usr/bin/env python
# coding:UTF-8
str1 = u'パトカー'
str2 = u'タクシー'
print(''.join(i+j for i,j in zip(str1,str2)))
```
ああ、綺麗なコードが書けるようになりたい
自作gemのインストール方法について

# 概要
* 自作のgemや、OSSのgemをカスタマイズして、インストールする際の備忘録です。

# Local gem install
* localの専用ツール1回インストールして、プロジェクト関係なく使用する際に向いてると思います。

```bash

# 対象のgemの作業ディレクトリでビルド
$ rake build
 -> pkg/hoge-0.0.1.gem

# pkg/hoge-0.0.1.gem にgemファイルが作成されるため gem install
$ gem install pkg/hoge-0.0.1.gm

```

# Local gem を Gemfileに記述して bundle install

* 自作のGemを開発しながらやる際には向いてそうです。
* 作業ディレクトリ/対象のGEMディレクトリ(hoge)
* 作業ディレクトリ/インストール先プロジェクトディレクトリ/(boo)
の想定で記載しております。

```bash

# 対象のgemの作業ディレクトリでビルド
$ rake build
 -> pkg/hoge-0.0.1.gem

# bundle installしたい作業ディレクトリに移動
$ cd ../boo/
$ vim Gemfile
  + gem 'hoge', '0.0.1', :path => '../hoge'

$ bundle install
```

# githubからGemfileに記載して bundle install
* 開発が完了したタイミングでこちらにするといいと思います。

```bash

# bundle installしたい作業ディレクトリ
$ vim Gemfile
  + gem 'hoge', :git => 'https://github.com/xxxx/hoge.git', :branch => 'development'

$ bundle install
```
attr_readerは何とも使い易いのだと感じた、

ozwk様、理解の助けをして頂き、誠にありがとうございました。

以下内容

attr_readerに関しての理解(インスタンス変数も変数なのだから代入される値は数値であれ文字列であれなんでも良い)

誤解 

```
attr_reader :title, :price

def book
  @title = title

```

上記が基本形だと思い、アクセスメソッド(ゲッター)ではインスタンス変数に対してはゲッターに指定した値しか使えないと誤解した。基礎がたらんな、、

```

class Book
  attr_reader :x
  
  def initialize()
    @x = 3333 # or ddddなんかでもよい
  end
end

```
Middleman : MacOSX 導入①

1. インストール
　　ターミナルを起動し以下のコマンドを実行
　　*gem install middleman

2. サーバーの起動 
　　以下のコマンドで、作業フォルダを作成
　　*middleman init [プロジェクト名]*
　　作成したプロジェクトフォルダに移動し、以下のコマンドで起動
　　*bundle exec middleman server*

3. 確認
　　プラウザを起動し、以下のURLで確認出来る
　　http://localhost:4567/
CCLabelTTFで自動改行する方法

## 困ってたこと
cocos2dで`CCLabelTTF`を使っていたが、自動的に改行されずに画面を突き抜けて表示されてしまう。
`contentSize`の指定もできないし困っていた。

なおバージョンは`cocos2d 3.4`です。

## 解決した
OpenGLで文字を表示してるから仕方のないことなのだろうと諦めて`\n`を入れていたのだが、ある日突然解決した。

```swift
let label = CCLabelTTF()  // インスタンス生成方法は割愛
label.dimensionsType.heightUnit = .Normalized  // サイズの指定を%表示にもできる。
label.dimensions = CGSizeMake(0.8, 0.8)    // このサイズを横に超えれば改行するして、下に超えれば表示されなくなる。
```

これでCCLabelTTFで改行コードを入れなくて済む。
ユニバーサルアプリを作ってるから、みっともないところで改行してて困ってたけど解決してよかった。

## おまけ
サイズフィットもあった。
縦揃え、横揃えもあった。

```swift
label.adjustsFontSizeToFit = true
label.horizontalAlignment = .Left
label.verticalAlignment = .Center
```

こんな基本的なことも知らなかったなんて・・・。
ちなみに、アウトラインをつけたり影をつけたりもできたりします。
意外と知られていない？ Photoshop CC画像アセット機能の超便利テクニック

Photoshop CCには、**画像の変更と同時にリアルタイムにレイヤーを書き出す「[画像アセット](https://helpx.adobe.com/jp/photoshop/using/generate-assets-layers.html)」というとても便利な機能があります**。
しかし、先日他社のデザイナー、エンジニアと話していて、画像アセットの**便利な機能が意外に知られていないこと**に気づきました。今回は、**知っているととても便利なPhotoshop CCの画像アセット機能のテクニック**について紹介します。
使用しているPhotoshopのバージョンは、CC 2015です。

#書き出し画質が設定できる
書き出し画像は、画質の設定によって大きく品質が変わってきます。画像アセット機能では、**JPEG、PNGの書き出し画質を設定することができます**。なお、GIF画像はアルファチャンネルありの8ビット画像のみ書き出すことができます。

##JPEG画像の画質設定
JPEG画像は「~.jpg」という名前で書きだすことができますが、デフォルトの画質は80%です。他の画質で書き出したときは、レイヤー名の接尾辞を以下のように設定します。

| 接尾辞| 画質 |
|---------|------|
| .jpg    | 80%  |
| .jpg100 | 100% |
| .jpg6   |  60%|

##PNG画像の色数指定
PNG画像は「~.png」という名前で書きだすことができますが、デフォルトでは32ビットのPNG画像（アルファチャンネルあり）です。他のビット数でレイヤー名の接尾辞を以下のように設定します。

| 接尾辞 | ビット数 | アルファチャンネル|
|---------|------|---|
| .png    | 32  | あり  |
| .png24 | 24 |  なし |
| .png8   | 8  |  あり |


#SVG画像の書き出しもできる
レイヤー名の接尾辞を「~.svg」とすることで、SVG画像の書き出しもできます。

#書き出しフォルダの指定ができる
画像はPSDと同階層の「PSD-assets」というフォルダに保存されていきますが、この中でフォルダを指定して画像を書き出すことが可能です。**大量の画像をフォルダに分けつつ効率よく書き出したいときに便利**です。
HTML相対パスを指定するのと同じ手順で、
「書き出したいフォルダ名/画像名」
とします。
例えば、hogeフォルダにpiyo.pngを書き出したければ、以下のように設定します。

```lang:Photoshopレイヤー名
hoge/piyo.png
```

#最後に
**画像アセット機能は、Photoshop CCの数ある画像書き出し機能の中でもトップクラスに使いやすい機能**です。（※）今回紹介した機能を使いこなし、より効率のよい制作につなげていただければと思います。

※ 「[Web用保存は古い!? JPEG画質が改善したPhotoshop CC 2015の新方式の画像保存機能まとめ - ICS MEDIA](https://ics.media/entry/7689)」にて各書き出し方法を比較しています。
root30GBでOS installして、残りのDisk領域をxfsでmountする

手元のメモを開放
300GB*2,raid1の鯖


イカ、メモ

```bash
[root@kakeru-db01 ~]# fdisk -l

ディスク /dev/sda: 299.4 GB, 299439751168 バイト
ヘッド 255, セクタ 63, シリンダ 36404
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0002e014

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *           1          66      524288   83  Linux
パーティション 1 は、シリンダ境界で終わっていません。
/dev/sda2              66        3982    31457280   83  Linux
/dev/sda3            3982        4243     2097152   82  Linux スワップ / Solaris
[root@kakeru-db01 ~]# fdisk /dev/sda

警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
      強く推奨します。 and change display units to
         sectors (command 'u').

コマンド (m でヘルプ): n 
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
選択した領域 4
最初 シリンダ (4243-36404, 初期値 4243): 
初期値 4243 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (4243-36404, 初期値 36404): 
初期値 36404 を使います

コマンド (m でヘルプ): w
パーティションテーブルは変更されました！

ioctl() を呼び出してパーティションテーブルを再読込みします。

警告: パーティションテーブルの再読込みがエラー 16 で失敗しました: デバイスもしくはリソースがビジー状態です。
カーネルはまだ古いテーブルを使っています。新しいテーブルは
次回リブート時か、partprobe(8)またはkpartx(8)を実行した後に
使えるようになるでしょう
ディスクを同期しています。
[root@kakeru-db01 ~]# reboot
...
[root@kakeru-db01 ~]# fdisk -l

ディスク /dev/sda: 299.4 GB, 299439751168 バイト
ヘッド 255, セクタ 63, シリンダ 36404
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0002e014

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *           1          66      524288   83  Linux
パーティション 1 は、シリンダ境界で終わっていません。
/dev/sda2              66        3982    31457280   83  Linux
/dev/sda3            3982        4243     2097152   82  Linux スワップ / Solaris
/dev/sda4            4243       36404   258335386   83  Linux
[root@kakeru-db01 ~]# mkdir /data
[root@kakeru-db01 ~]# mkfs.xfs /dev/sda4
meta-data=/dev/sda4              isize=256    agcount=4, agsize=16145962 blks
         =                       sectsz=512   attr=2
data     =                       bsize=4096   blocks=64583846, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal log           bsize=4096   blocks=31535, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@kakeru-db01 ~]# vim /etc/fstab
/dev/sda4 /data xfs defaults,logbufs=8,logbsize=256k,noatime 0 0
[root@kakeru-db01 ~]# mount -a
[root@kakeru-db01 ~]# echo noop > /sys/block/sda/queue/scheduler 
[root@kakeru-db01 ~]# echo 'echo "noop" > /sys/block/sda/queue/scheduler' >> /etc/rc.local
[root@kakeru-db01 ~]# cat /sys/block/sda/queue/scheduler
[noop] anticipatory deadline cfq 
```

おしまい
a / 8 と a >> 3 どちらがいいのか

# びしゃびしゃなので

暑い！！！

ただ歩いてるだけでもびしゃびしゃになる。
びしゃびしゃの美少女は価値が高いかもしれないが、本当にガッカリなことに、私は美少女ではなく中年親父なので、汗で道を濡らしながらズルズルと歩く単なる巨大ナメクジと同じ価値０の生物である。

さらに無価値なことに、本当にどうでもいいことが気になってしまった。

> a / 8 と a >> 3 、どっちがROMちっちゃくなるの？

本当にどーでもいいことなのだが、ずぶぬれびしゃびしゃなのでしかたない。

Arduinoでやってみることにした。

# アホみたいな方法で試してみる

ずぶぬれになって思考回路が停止した人くらいしか興味の無い話題間違いなしなのだが、この季節全国に3000万人くらいは同じようなオッサンが道を濡らしてあるいてるはずである。

つまり、家につくなりビールも飲まずに下記のような、ROM使用量を確認すること以外に全く何の役にも立たないコードを書いてしまうアホな人、実は多いかもしれない。いや、多いはずだw

というわけで、下記コードをArduino IDE 1.6.3でビルドして確認してみた。

```testes.ino
uint8_t a,b;

void setup() {
  a = b = 0;
  Serial.begin(19200);
}

void loop() {
  a ++;
  b = a / 1; // <-ここを書き換えてROM使用量がどのように変わるか？
  Serial.write(b);
}
```

`Serial.write(b)`などと書いてるが、別にシリアルモニタなんか起動するはずもない。ただビルドするだけだ。

# 結果

びしゃびしゃの人はたぶん知ってると思われるが、せっかく何回もビルドしたので結果を晒す。

|式|ROM使用量|
|:-----------|:------------|
|b = a;|1,636byte|
|b = a / 2;|1,638byte|
|b = a >> 1;|1,642byte|
|b = a / 3;|1,646byte|
|b = a / 4;|1,640byte|
|b = a >> 2;|1,646byte|
|b = a / 5;|1,668byte|
|b = a / 6;|1,668byte|
|b = a / 7;|1,668byte|
|b = a / 8;|1,642byte|
|b = a >> 3;|1,648byte|
|b = a / 9;|1,646byte|
|b = a / 10;|1,668byte|
|b = a / 11;|1,668byte|
|b = a / 12;|1,668byte|
|b = a / 13;|1,668byte|
|b = a / 14;|1,668byte|
|b = a / 15;|1,668byte|
|b = a / 16;|1,640byte|
|b = a >> 4;|1,648byte|
|b = a / 31;|1,668byte|
|b = a / 32;|1,642byte|
|b = a >> 5;|1,648byte|
|b = a / 64;|1,644byte|
|b = a >> 6;|1,648byte|
|b = a / 128;|1,642byte|
|b = a >> 7;|1,646byte|
|b = a / 256;|1,638byte|
|b = a >> 8;|1,638byte|

# 結論

シフトより割った方が良いみたい。
自分にとっては発見であった。
（逆だとおもってた）
サーバに適用する前にローカル環境でSSL証明書をブラウザで確認する方法

## About
SSL証明書更新をするに当たって、更新後に正しい証明書が送られてきた確認したかったのですが、検証環境がありませんでした。そんなときにopensslコマンドで擬似サーバを作ってブラウザから証明書の情報を確認する方法をまとめました。

## 各種ファイルについて
### KEYファイル（Private Key/秘密鍵）
秘密鍵。大本になるファイル。サーバにインストールします。この秘密鍵を元にCSRを作成します。

### CSRファイル（Certificate Signing Request/証明書署名要求）
申請者から認証局へ送られる証明書。申請者を識別する情報と申請者の公開鍵が含まれてる。

### CRT/CERファイル
認証局がCSRファイルに情報を付加して秘密鍵で暗号化したのもので、俗にサーバ証明書と呼ばれる。どちらのファイルも509証明書を格納したファイルを示しているだけで、ファイルフォーマットと関連付いているわけではない。CERと言った場合、中間証明書として扱うことがあるとのこと。

## ブラウザを使って証明書を確認する
ローカルで擬似的なサーバを作って実際に証明書を確認します。

### `/etc/hosts`を修正する
登録しているコモンネームとアクセスするドメイン名が一致していないと意味がないので、`/etc/hosts`を書き換えて擬似的にアクセスするように見せかける必要があります。

### サーバを起動する
```
$ openssl s_server -cert <crtファイル> -key <private_key> -www
```

中間証明書がある場合はオプションで指定する。

```
$ openssl s_server -cert <crtファイル> -key <private_key> -CAfile <cer> -www 
```

`-www`だと証明書の情報などが出てしまい、嫌だという場合は`-WWW`オプションを使うことで回避できます。`-WWW`をつけるとコマンドを実行したカレントディレクトリが、ドキュメントルートのようになるので、適当なファイルをURLに指定すると良いです。

* [2015/10/追記]
ブラウザによってはDH鍵交換を許可していないため、エラーが出ることがあります。その場合は下記のようにオプションを追加してECDHのみ許可することで確認が可能になります。

```
$ openssl s_server -cert <crtファイル> -key <private_key> -CAfile <中間証明書> -www -no_dhe
```

### ブラウザでアクセスする。
https://<hogehoge>:4433にアクセスすれば、ログみたいなものが書いているページにアクセスできます。アドレスバーの鍵マークをクリックするなどして、証明書情報の確認が可能です。

## 番外編
### opensslコマンドで確認

#### 擬似サーバを起動する

```
$ openssl s_server -cert <crtファイル> -key <private_key>
```

上記コマンドを叩くことでサーバが起動する

#### クライアントからアクセスする

```
$ openssl s_client -connect localhost:4433
```

ポート番号を変更したい場合は`-accept 5000`のように指定が可能です。
こちらの方法だとアクセスが成功すると、チャットを打つことができます。

### ハッシュ値を確認する
* ローカルで確認するにはこれが簡単そうですね。

```
$ openssl x509 -noout -modulus -in server.crt | openssl md5
12345678abcdefg12345678abcdefg
$ openssl rsa -noout -modulus -in server.key | openssl md5
12345678abcdefg12345678abcdefg
$ openssl req -noout -modulus -in server.csr | openssl md5
12345678abcdefg12345678abcdefg
```

## link
* [オレオレ証明書をopensslで作る（詳細版） - ろば電子が詰まっている](http://d.hatena.ne.jp/ozuma/20130511/1368284304)
* [SSL証明書のKEYファイル・CSRファイル・CRTファイルのチェック方法 - install memo](http://d.hatena.ne.jp/install-memo/20110906/1315291837)
* [IPA 独立行政法人 情報処理推進機構：PKI 関連技術情報](http://www.ipa.go.jp/security/pki/)
* [CentOS7.1 64bit OpenSSLを使用したSSL用の秘密鍵と証明書の作成 | kakiro-web カキローウェブ] (http://www.kakiro-web.com/linux/ssl.html)
カレントディレクトリ以下のsjisファイルをutf-8に変換する

カレントディレクトリに色々な文字コードのファイルがあって、sjisファイルのみをutf-8に変換する方法。

```shell-session
$ find . -type f -name "*.php" | xargs nkf -g  | grep Shift_JIS | sed -e 's/:Shift_JIS (CR)//g' | xargs nkf -Sw --overwrite
```

解説は後ほど書く。
RSSのlinkタグのhrefの値の取得の仕方

# はじめに
この記事は私のサイト『**[FantmSite](http://fantmsite.com/)**』のブログでこう書いていたのですが、心機一転としてブログを閉鎖し、今後サイトをリニューアルすべくその一つとしてQiitaに移転させています。

# 記事の内容
バグはわかっていたのですが、『**[FantmSite-Nogi](http://fantmsite.com/Nogi/)**』の乃木坂46の新着ニュースのリンクがうまく指定できておらずその記事のページに飛ぶことができなくなっていました。今回はそのバグの原因と解決方法として記載します。
今回のこの新着ニュースはGoogle検索の機能を利用したRSSを利用しています。

**参考サイト**
[Googleの新着検索結果をRSSフィードで取得する方法、調査・情報収集などに](http://nelog.jp/google-alert-feed)

今回このRSSを利用してハマった(バグになった)のがlinkタグのhrefに格納されている値の取得ができていないことでした。次に示しているのが間違った指定の仕方です。

**間違った指定の仕方**

```php:
foreach($rss->entry as $ND){
    $fs_link = $ND->link;
}
```

＊実際に取得しているコードと同じにするとセキュリティ上よろしくないと思われるので、少し変えて記述しています。そのため、今回の記事に関係あるところ以外は省略しています。
それで、正しい指定の仕方は以下のとおり。

**正しい指定の仕方**

```php:
foreach($rss->entry as $ND){
    $fs_link = $ND->link->attributes()->href;
}
```

この**`attributes()`**は、

>XMLタグの中で定義された属性とその値を取得します

ということらしいです。
(PHPの公式マニュアル「**[SimpleXMLElement::attributes](http://php.net/manual/ja/simplexmlelement.attributes.php)**」より)

実は以前もここではまったことがあり、解決した時「あ…これ前にも見た気が…」っとなってしまいました(´-ω-｀;)
今回は今後のためのメモに書きました。
いくつ知ってる？ Git用語で始める英会話 

普段使っている横文字の意味がわかると、英語に親近感が湧いてきます。
今回は、**現在世界で最も勢いのあるバージョン管理システム「Git」でよく使われる用語を中心に、英単語を学んでみましょう**。

* 日本語読み
* 意味
* 発音方法
をまとめています。

#よく使われる英単語と意味
##git／ギット
ばか者、ろくでなし
gít(ギット)

##repository／リポジトリ
倉庫、貯蔵庫
rɪpάzət`ɔːri (リポォズィトリィ)

##commit／コミット
任せる、委ねる
kəmít(カミィットゥ)

##work tree／ワークツリー
work：作業
tree：図表
Gitにおいては、作業中のファイル群のことを指す。
wˈɚːk tríː(ワァク トゥリィ)

##index／インデックス
索引
índeks(インデック（ス）)

##push／プッシュ
押し出す
pˈʊʃ(プッシュ)

##pull／プル
引っぱる
pˈʊl(ぷぅぅ)

##clone／クローン
複製する
klóʊn(クロウン)

##merge／マージ
mˈəːdʒ（ンマージ）
併合する、合併する

##branch／ブランチ
枝、支流、分家
brάːntʃ（ブラァァンチ）

##master／マスター
主人、大家
mάːstə（ンマスタ）

##topic／トピック
話題、テーマ
tˈɔpɪk（トピック）

##head／ヘッド
先頭
héd（ヘエッドゥ）

##スタッシュ／stash
退避させる、蓄える
stˈæʃ（ステァッシュ）

##rebase／リベース
re:再び
base:基礎をつくる
riː béɪs(リベイ（ス）)

##fetch／フェッチ
とってくる
fétʃ（フェッチ）

##tag／タグ
付け札、タグ
tˈæg(テァグ)

#revert／リバート
戻す、取り消す
rɪvˈəːt（リバェァ（トゥ））

#最後に
Hey! Mr.Git! とか言われると、「Gitがすごいできる人」ではなく馬鹿にされているので怒りましょう。
多线程 Thread


一、重要概念

	1. 线程是进程的一个实体。进程在执行时拥有独立内存单元,而线程之间可以共享内存，能够拥有更好的性能和用户体验。
	ps.多线程要适度使用，并不是线程越多，性能越好
	2. 一个线程，多个任务，一个任务执行完后才进行下一个任务，称为串行。多个线程，分担多个任务，并发执行任务，称为并行。
	3. 同步sync,阻塞式，一个任务未完成会影响其他的进程。
	异步async,非阻塞式,一个线程的任务未完成不会对其他线程的任务造成阻塞和影响。
	ps.异步和并发 概念不同。
	4. 临界资源:并发环境中有着固定数量被多个线程竞争的资源。
	5. 互斥: 对资源的访问是排他式的。
	6. 死锁: 两个或多个线程都等待对方结束。
	7. 活锁: 想要执行的线程总是发现其他的线程正在执行以至于长时间或永远无法执行。
   
   
   
二、线程的创建

直接创建线程的两种方式:

	1. `NSThread detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument;`
	2. `NSThread *thread = [[NSThread alloc] initWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument];`
	`[thread start];`
   
-
	ps. 这种方式可以设置(配置)线程 属性。
	配置线程:
	01.设置优先级: threadPriority
	02.绑定数据: threadDictionary
	03.设置名称: name属性
	04.启动线程: start
	05.退出线程: exit
	
三、线程同步方式

	1.NSLock				(上锁)
	2.NSConditon
	3.@synchronized代码块
	
四、线程安全

	1. 所有属性声明都尽量使用nonatomic.
	2. 尽量避免多个线程竞争同一资源的情况。
	3. 让服务器端处理复杂逻辑,客户端只获取结果。
	
五、NSOperation
	1.使用NSOperation的子类NSInvocationOperation和NSBlockOperation
	
	NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(foo:) object:nil];
	[operation start];//同步方式执行
	
	NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{\\}];
	[operation2 start];//同步方式执行
	
	//异步方式执行
	NSOperationQueue *queue = [[NSOperationQueue alloc] init];
	[queue addOperation:operation1];
	[queue addOperation:operation2];
	
	ps.如果需要控制队列中线程数量,可以使用下列形式
	[queue setMaxConcurrentOperationCount:5];
--	
六、GCD入门
--
```
	1. GCD简介
		让程序平行排队的特定任务，根据可用的处理资源，安排他们在任何可用的处理器核心上执行任务。
	2. GCD底层维持一个FIFO队列，该队列称为dispatch queue,它可以保证先进来的任务先得到执行。dispatch queue分为三类:
		2.1 private serial dispatch queue: 用户队列。该任务队列默认的是串行执行，可以通过dispatch_queue_create()函数来创建该队列，可以通过第二个参数来指定串行还是并行。
		2.2 global dispatch queue: 全局队列，有三个队列，优先级不同。可以通过dispatch_get_global_queue()函数来获得，需要传人优先级。
		2.3 main dispatch queue: 提交该队列的任务在主线程上执行。可以通过dispatch_get_main_queue()函数来获得此队列。
		
		常用的：
		第一个：
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAU LT, 0), ^{
		// 耗时的操作 		dispatch_async(dispatch_get_main_queue(), ^{
		// 更新界面 });
		});
		
		第二个：(在指定的时间之后执行)
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull * NSEC_PER_SEC);
dispatch_after(time, queue, ^{});

		第三个:(多个任务完成后刷新主界面事例)
dispatch_queue_t queue = dispatch_get_global_queue(0,0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{});
dispatch_group_async(group, queue, ^{});
dispatch_group_async(group, queue, ^{});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{});
dispatch_release(group);

		第四个:(同时进行读写操作的示例)
dispatch_async(queue, ^{});
dispatch_async(queue, ^{});
dispatch_async(queue, ^{});
dispatch_barrier_async(queue, ^{});
dispatch_async(queue, ^{});
dispatch_async(queue, ^{});

		第五个:(挂起和恢复派发队列)
dispatch_suspend(queue);					//挂起
dispatch_resume(queue);					//恢复

		第六个:(只执行一次处理)
static dispatch_once_t token;
dispatch_once(&token, ^{});
```
vim-airlineのステータスラインが表示されない場合の解決方法

一つのファイルを以下のコマンドのようにvimで開いた場合、`vim-airline`のステータスライン(下のバー)が表示されない場合があったので解決方法をメモ。

```bash
$ vim hoge.txt
```

どうやらステータスラインを2行として`.vimrc`に設定を追加してあげる必要があったみたいです。

```vim:.vimrc
set statusline=2
```
Yahoo! JavaScriptマップAPIで経路検索プラグインを使い、初期表示で経路を表示する

# はじめに

店舗紹介などでよくありそうな、交通機関からの経路表示をした地図を表示しようと思います。
単純な画像表示であれば[経路地図API](http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/routemap.html)で表示できます。
グリグリ動く地図ならGoogleMapでもできますが、経路となると直線しか引けない上に経由地の個数が20個くらいまでと限られていて使いにくいです。
Yahoo!のJavaScriptマップAPIのプラグインで出来るようなので試してみます。

# 作ってみる

## とりあえず地図表示

まずは単純な地図を表示してみる。
[APP_ID]はYahooでアプリケーションIDを発行したものを記入してください。

```html
<html>
<body>
<div id="map" style="width:500px; height:500px;"></div>
<script type="text/javascript" charset="utf-8" src="http://js.api.olp.yahooapis.jp/OpenLocalPlatform/V1/jsapi?appid=[APP_ID]"></script>
<script type="text/javascript">
window.onload = function() {
    var map = new Y.Map("map",{"configure":{"scrollWheelZoom":true}});
    map.addControl(new Y.LayerSetControl());
    map.addControl(new Y.SliderZoomControlHorizontal());
    map.addControl(new Y.CenterMarkControl());

    //経路探索プラグインを生成します。
    var plugin = new Y.RouteSearchPlugin();
    //Mapオブジェクトにプラグインを追加します。
    map.addPlugin(plugin);
    //地図を描画します。
    map.drawMap(new Y.LatLng(35.662484, 139.734222), 15 , Y.LayerSetId.NORMAL);
}
</script>
</body>
</html>
```

六本木ヒルズが中心にきた地図が表示されたかと思います。
地図を右クリックするとメニューが出て、出発地・到着地・経由地などが設定できるかと思います。

## 初期地点を追記

今回のメインである、地図表示初期に経路を表示するようにしてみます。
RouteSearchPluginのコンストラクタの引数に地点情報を与えるとできるようです。
参考：[公式 - YOLP(地図):Pluginクラス](http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/js/reference/YPlugin.html#RouteSearchPlugin)

```js
    var configs = {
        "latlngs": [
            new Y.LatLng(35.68156404067264,139.76721008431142),  //東京駅
            new Y.LatLng(35.6657214,139.7310058),  //東京ミッドタウン
            new Y.LatLng(35.69073464614311,139.6998272943479)   //新宿駅
        ]
    };
    var plugin = new Y.RouteSearchPlugin(configs);
```

## 完成版

```html
<html>
<body>
<div id="map" style="width:500px; height:500px;"></div>
<script type="text/javascript" charset="utf-8" src="http://js.api.olp.yahooapis.jp/OpenLocalPlatform/V1/jsapi?appid=[APP_ID]"></script>
<script type="text/javascript">
window.onload = function() {
    var map = new Y.Map("map",{"configure":{"scrollWheelZoom":true}});
    map.addControl(new Y.LayerSetControl());
    map.addControl(new Y.SliderZoomControlHorizontal());
    map.addControl(new Y.CenterMarkControl());
    var configs = {
        "latlngs": [
            new Y.LatLng(35.68156404067264,139.76721008431142),  //東京駅
            new Y.LatLng(35.6657214,139.7310058),  //東京ミッドタウン
            new Y.LatLng(35.69073464614311,139.6998272943479)   //新宿駅
        ]
    };

    //経路探索プラグインを生成します。
    var plugin = new Y.RouteSearchPlugin(configs);
    //地図を描画します。
    map.drawMap(new Y.LatLng(35.662484, 139.734222), 15 , Y.LayerSetId.NORMAL);
    //Mapオブジェクトにプラグインを追加します。(drawMapの後に記載すべし)
    map.addPlugin(plugin);
}
</script>
</body>
</html>
```

追記
tofuyaさんご指摘通りに修正しました。
マウスイベントの座標取得について

`mousedown`, `mousemove`, `mouseup` などのイベントで拾えるマウス座標ですが、いくつか種類があります。いつもどれがどれだったか忘れてしまうので、いい加減覚えようと思ってまとめました。

## clientX, clientY

**DOMコンテンツ内の**X,Y座標。

HTMLページ内のワールド座標です。左上が0,0

## offsetX, offsetY

イベントをハンドリングしている**DOM要素内の**X,Y座標。


## screenX, screenY

**スクリーン上の**X,Y座標。

デュアルモニター環境だったりするととても大きな値になったりします。

## x,y

Chromeだと使える。値は`clientX`, `clientY`と一緒。

## 迷った時の確認用コード

```html
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>

<body>
  <div style="margin: 100px; width:200px; height:2000px; border: solid 1px gray;" id="box"></div>
  <script>
    document.getElementById('box').onmousemove = function(e) {
      console.log('client(%s, %s) offset(%s, %s) screen(%s, %s)',e.clientX, e.clientY, e.offsetX, e.offsetY, e.screenX, e.screenY);
    }
  </script>
</body>

</html>
```

黒い枠線のボックス上でマウスを移動するとコンソールにそれぞれの座標値が出力されます。
H2Oでset-cookieが正常に動作しな（かった）

[H2O](https://github.com/h2o/h2o)でPHPを動かしてWordPressを動かそうと思ったら何故かログイン出来ない、という症状が発生したので調べてみました。
（1.4.2にて修正されているのを確認済みです）

## 原因

headerを圧縮する処理が入っているのか、

```
set-cookie: foo=bar
set-cookie: baz=qux
```

とならないと行けないところを、

```
set-cookie: foo=bar, baz=qux
```

と一つにまとめられちゃっていました。

## 解決

このレベルの内容なら誰かがIssueを投稿してるだろうと思って探していると、[まさにその症状のIssue](https://github.com/h2o/h2o/issues/424)があって、ちゃんと修正されてバージョンアップしていました。

ということでバージョンアップ。

```
git pull
cmake .
make clean
make h2o
make install
```

## まとめ

ちゃんと最新版を利用しましょう。
ggplot2のデフォルトの色を知りたい

# Q. 
ggplot2のデフォルトの色を知りたいです。RGBも知りたいです。

# A.
以下のコードで知ることができます。

## 色分けの基準がfactorの場合
```OK_example1.R
ggColorHue <- function(n, l=65) {
  hues <- seq(15, 375, length=n+1)
  hcl(h=hues, l=l, c=100)[1:n]
}

cols       <- ggColorHue(n=4)
cols_dark  <- ggColorHue(n=4, l=45)
cols_light <- ggColorHue(n=4, l=85)

col2rgb(cols)
scales::show_col(cols)
```

col2rgbはrgbを計算するのに使っています。最後の行の結果は以下の通りです。
![OK1.png](https://qiita-image-store.s3.amazonaws.com/0/12869/18f01181-0588-3e2a-b191-34733480edad.png)

## 色分けの基準が連続値の場合
```OK_example2.R
cols <- colorRampPalette(c("#132B43", "#56B1F7"))(n=25)
col2rgb(cols)
scales::show_col(cols)
```

n=25はテキトーです。

![OK2.png](https://qiita-image-store.s3.amazonaws.com/0/12869/5ab1da44-5ce1-b969-0440-706e5ac14cce.png)

# 参考資料
http://stackoverflow.com/questions/8197559/emulate-ggplot2-default-color-palette
http://docs.ggplot2.org/current/scale_gradient.html
CをPythonから使えるようにCythonでwrapする

[「Cython　Cとの融合によるPythonの高速化」オライリー](http://www.oreilly.co.jp/books/9784873117270/)から
C言語で書かれた関数をPythonでimportして実行できることをUbuntu上でたどってみた。

まずは、この本のサンプルがgithub上にあるのでzipファイルでまとめてダウンロードする。
https://github.com/cythonbook/examples

展開してできたディレクトリに移動する。
examples-master/07-wrapping-c/01-wrapping-c-functions-mt-random

ここにはMakefileがあるのでmakeしてみる。
そうすると必要なファイルができたようで
同書p128にある例がIPythonから動作する。
In [1]: import mt_random

In [2]: mt_random.init_state(42)

In [3]: mt_random.rand()
Out[3]: 0.37454011439684315

確かに、本に書かれているようにCythonでC関数をラップできている。


まず、Cのソースファイルとヘッダファイルとがあること。


###Cythonにおける外部Cコードの宣言(拡張子 .pxd)

```txt:mt.pxd
cdef extern from "mt19937ar.h":
    void init_genrand(unsigned long s)
    double genrand_real1()
```


###C関数のラップ(拡張子 .pyx)

```txt:mt_random.pyx
# distutils: sources=["mt19937ar.c"]
cimport mt

def init_state(unsigned long s):
    mt.init_genrand(s)

def rand():
    return mt.genrand_real1()
```

###コンパイルの方法を指示するsetup.pyファイル

```py:setup.py
from distutils.core import setup, Extension
from Cython.Build import cythonize

ext = Extension("mt_random",
                sources=["mt_random.pyx", "mt19937ar.c"])

setup(name="mersenne_random",
      ext_modules = cythonize([ext]))
```

そしてsetup.pyを実行するMakefileが既にzipファイルの中に含まれていた。
これをmakeすれば先ほどの実行結果になりました。

pxdファイル, pyxファイル, setup.pyを書くことでwrapできることがわかりました。

このようにして実装したmt_randomモジュールについて
help(mt_random)
とすると
以下のようにhelpが表示されるのも便利です。

Help on module mt_random:
NAME
    mt_random

FILE
    /(略)/examples-master/07-wrapping-c/01-wrapping-c-functions-mt-random/mt_random.so

FUNCTIONS
    init_state(...)
    
    rand(...)

DATA
    __test__ = {}


この例題以上のことを理解するには、同書の７章を読むことのようです。

全てをC言語で書かなくても、ボトルネック部分だけをC言語で書いて
Cythonを使ってラッパーを書けば十分になるというのはうれしい限りです。
jquery兄弟要素の指定方法まとめ

![2015-07-29_1900.png](https://qiita-image-store.s3.amazonaws.com/0/54076/00fd37bd-ce61-d66c-28b9-f895c988f164.png)
主に参考にしたサイト
[jQuery 兄弟要素の取得と操作 – 自分以外の兄弟、自分以降の兄弟、自分以前の兄弟等](http://zxcvbnmnbvcxz.com/jquery-siblings-next-prev/)

テーブル組をしていて
toggleボタンを押したら上下両方のテーブル要素が選択されるように
jqueryを調整したい、ということでjqueryの兄弟要素の選択方法をlearning。


###**自分以外の要素**
*[.sibling()](http://semooh.jp/jquery/api/traversing/siblings/expr/)*　要素を使う

###**自分（含めずに）の一つ後の要素**
*[.next()](http://semooh.jp/jquery/api/traversing/next/%5Bexpr%5D/)*　要素を使う

（）内には.next('p')のようにフィルタを掛けることが可能。（）が空欄の場合はその後の要素すべてが対象となる。

###**自分（含めずに）の後のすべての要素**
*[.nextAll()](http://semooh.jp/jquery/api/traversing/nextAll/%5Bexpr%5D/)*　要素をもちいる

###**自分（含めずに）の一つ前の要素**
*[.prev()](http://semooh.jp/jquery/api/traversing/prev/%5Bexpr%5D/)*　要素を使う

```lang:HTML
$("button").click(function () {
  $curr = $curr.prev();
  $("div").css("background", "");
  $curr.css("background", "#f99");
});
```
のように書くと、クリックするたびにセレクタを変更することが可能。

###**自分（含めずに）の前のすべての要素**
*[.prevAll()](http://semooh.jp/jquery/api/traversing/prevAll/%5Bexpr%5D/)*　要素を使う
SparkR で timestamp 型のカラムがうまく表示されない不具合を魔改造でどうにかする #rstatsj

> Spark 1.5.0 でバグ修正されたようです。2015/09/09

今までファイルで扱っていたアクセスログをすべて Parquet にして SparkR で集計するようにしています。
しかし、DataFrame に java.sql.Timestamp 由来のカラムが一つでもあると、SparkR がエラーを出します。

ちょっと再現してみましょう。

まずは、Scala で java.sql.Timestamp のカラムだけからなる DataFrame を作り、Parquet で保存します。

```scala:spark-shell
$ spark-shell
scala> import java.sql.Timestamp
scala> case class TimestampTest(timestamp: Timestamp)
scala> import sqlContext.implicits._
scala> val rdd = sc.parallelize(1 to 3).map(i => TimestampTest(Timestamp.valueOf("2015-01-01 00:00:0" + i)))
scala> val dataframe = rdd.toDF
scala> dataframe.write.parquet("timestamp-test.parquet")
```

これを R 側から読み込んで DataFrame に戻します。

```r:R
library(SparkR)

sc <- sparkR.init(master="local")
sqlContext <- sparkRSQL.init(sc)

df <- parquetFile(sqlContext, "timestamp-test.parquet")
print(df)
```

```:結果
DataFrame[timestamp:timestamp]
```

ちゃんと DataFrame として読み込めたようです。

しかし、この DataFrame に対して `head()` をしてみると、

```r:R
head(df)
```

```
Error in as.data.frame.default(x[[i]], optional = TRUE) : 
  cannot coerce class ""jobj"" to a data.frame
```

エラーが出ます。

原因は、SparkR では timestamp 型として java.sql.Time のみをサポートしており、java.sql.Timestamp は Java オブジェクトとしてそのまま保持されてしまうためのようです。
しかし、Parquet は timestamp 型として java.sql.Timestamp しかサポートしておらず、java.sql.Time では保存できません。

これは困りました。

しょうがないので、SparkR を魔改造して `collect()` 関数の中身を、java.sql.Timestamp を見つけたら POSIXct へ変換するように書き換えてしまいましょう。
これによって、`head()` や `take()` などの関連する関数の挙動も変わります。

```r:R
# Override SparkR::collect --------------------------------------------------------  
collect <- function(x, stringsAsFactors = FALSE) {
  # listCols is a list of raw vectors, one per column
  listCols <- SparkR:::callJStatic("org.apache.spark.sql.api.r.SQLUtils", "dfToCols", x@sdf)
  cols <- lapply(listCols, function(col) {
    objRaw <- rawConnection(col)
    numRows <- SparkR:::readInt(objRaw)
    col <- SparkR:::readCol(objRaw, numRows)
    close(objRaw)
    ### begin added area to read Timestamp ###
    if(is.list(col) && length(col) > 0) {
      obj <- col[[1]]
      class <- SparkR:::callJMethod(obj, "getClass")
      class_name <- SparkR:::callJMethod(class, "getName")
      if(class_name == "java.sql.Timestamp") {
        times <- lapply(col, function(x) {
          SparkR:::callJMethod(x, "getTime")
        })
        times <- unlist(times, use.names = FALSE) / 1000
        col <- as.POSIXct(times / 1000, origin = "1970-01-01")
      }
    }
    ### end added area ###
    col
  })
  names(cols) <- columns(x)
  do.call(cbind.data.frame, list(cols, stringsAsFactors = stringsAsFactors))
}
SparkR_env <- asNamespace("SparkR")
environment(collect) <- SparkR_env
invisible(eval(setMethod("collect", signature(x = "DataFrame"), collect), SparkR_env))
```

それでは再び `head()` を実行してみましょう。

```r:R
head(df)
```

```:結果
            timestamp
1 2015-01-01 00:00:01
2 2015-01-01 00:00:02
3 2015-01-01 00:00:03
```

できました！

というわけで、この機能を SparkRext パッケージに追加しました。

- [SparkRext - SparkR extension for closer to dplyr](https://github.com/hoxo-m/SparkRext)

Enjoy!

## 参考

- [既存パッケージ内のS4メソッドの書き換え](http://qiita.com/kohske/items/f406f66f75fb972a32ea)
【人柱報告】Parallels Desktop 10でWindows 10にアップグレード

# Parallels Desktop 10上でWindows 10は本当に動かないのか

待望のWindows 10無償アップデート前日になって、気づいてしまいました。
Win10がParallels Display Adapter (WDDM)と互換性が取れないためアップデートできないということに。
予約を入れても、コノザマ。
![スクリーンショット 2015-07-29 15.05.47.png](https://qiita-image-store.s3.amazonaws.com/0/86866/e7a20e54-2390-06db-a380-53d85bcab612.png)


しかし、本当に動かないのでしょうか？

# 環境

- MacBook Pro Retina (Late 2013) 15インチ、SSD 512GB、店頭販売モデル
- OS X 10.10.4
- Windows 8.1 Pro → Windows 10 Pro
- Parallels Desktop 10.2.1 (29006) → Win10アップグレード後に10.2.2 (29105)に更新


# ISOイメージのダウンロードページが登場

Win10提供開始当日になって、ISOイメージのダウンロードリンクが現れました。
[Windows 10 ISO](http://www.microsoft.com/ja-jp/software-download/windows10ISO)
エディションと言語を選択したら、32bit, 64bitのリンクが生成されるので、有効期限（1日）以内にダウンロード。
**ここで、ダウンロード完了時のファイルサイズをきちんと確認しておきましょう！（Win10無印、日本語、64bit選択で、Chrome上の表示は3.9GBです）**
これを怠ったため、僕は2GB程度の不完全なISOファイルをToast 11でDVDに無理矢理焼いて、無為なディスクを作成してしまいました。もちろんParallelsにISOを直接マウントしても起動しません。完全なISOなら、Windowsディスクイメージ書き込みツールでも、Macのディスクユーティリティでもきちんと焼けるはずです。「image not recognized」「選択されたディスク イメージ ファイルは有効ではありません。」などとエラーが出たらもう一度ダウンロードしましょう。

# セットアップの過程

気を取り直して、ディスクユーティリティでマトモな円盤を焼きました。
マウントしたイメージをエクスプローラで参照して、setup.exeを押して、セットアップを進めていきます。

- 外付けドライブで円盤から参照する場合は、必ず仮想Windowsから直接マウントしてください。Macにマウントしたものをpsf経由で参照すると、このようにsetup.exeの実行に失敗します（画像はWin10にアップグレードした後のものです）。
![スクリーンショット 2015-07-29 18.52.44.png](https://qiita-image-store.s3.amazonaws.com/0/86866/e62eb8da-d572-97da-6d6b-d0d819f0383e.png)

- DVDドライブからブートしたらプロダクトキーを入れろと言われたので、クリーンインストール扱いになりそうです。

以下、途中の画面です。
![スクリーンショット 2015-07-29 17.54.26.png](https://qiita-image-store.s3.amazonaws.com/0/86866/5347e532-830c-2f7f-a958-2e4fea86e0fd.png)

![スクリーンショット 2015-07-29 17.58.00.png](https://qiita-image-store.s3.amazonaws.com/0/86866/f43c409f-df80-3bf7-3f6d-8b223318fcad.png)

![スクリーンショット 2015-07-29 17.58.51.png](https://qiita-image-store.s3.amazonaws.com/0/86866/f449356c-8901-ca5c-eecb-fddbc92588c9.png)

![スクリーンショット 2015-07-29 18.02.44.png](https://qiita-image-store.s3.amazonaws.com/0/86866/d79ce858-5305-55e8-a3be-39ee529e5981.png)
![スクリーンショット 2015-07-29 18.16.38.png](https://qiita-image-store.s3.amazonaws.com/0/86866/abd5cadf-a266-68ef-bea5-fc4d2ca5738c.png)
![スクリーンショット 2015-07-29 18.18.05.png](https://qiita-image-store.s3.amazonaws.com/0/86866/aaac2d13-5744-b5c1-0093-69541acf993b.png)


時間はそれなりに掛かります。更新プログラムの適用から30分ほどは見た方がよいでしょう。

# インストール後

ん、解像度おかしくない？と思ったら、Parallels Toolsのインストールが始まりました。

![スクリーンショット 2015-07-29 18.19.01.png](https://qiita-image-store.s3.amazonaws.com/0/86866/82086f51-dd5b-dc6e-7123-c45dd1d5ca98.png)
![スクリーンショット 2015-07-29 18.21.08.png](https://qiita-image-store.s3.amazonaws.com/0/86866/19e426f2-bc27-88c3-2854-c70a9615b34e.png)

インストール完了後、再起動すると、画面表示には特に問題は見られませんでした。

![スクリーンショット 2015-07-29 18.23.31.png](https://qiita-image-store.s3.amazonaws.com/0/86866/7a914414-3c2f-4855-1efd-d3d653ba1f99.png)

# まとめ

結果として、実際にWin10を入れて少し見てみた限りでは互換性の問題が影響を及ぼしているようには見えませんでした。
自己責任でお試しください。
Kotlinの細かいとこメモ

#JSONICを使ってみる
```sample.kt
//デコード
val size = JSON.decode("{width:10,height:20}", javaClass<Size>())

//エンコード
val str = JSON.encode(size)


```

#三項演算子はifだよ
```sample.kt
 val b = if(a % 2 == 0) "even" else "odd"
  println(b) // odd
```
AndroidプロジェクトでもJavadoc生成したい！


最近ではGradleを使ったAndroidプロジェクトが主流になりました。
どうせならGradleタスクから一発でJavadocも生成したいですよね。

GradleのJavaプラグインを使えばGradleタスクに `javadoc` タスクが追加されるのですが、Androidプラグインにはそんなタスクはありません。
それに、 `R.java` とか自動生成されたファイルは入れたくない…

ので、自力でカスタマイズできるJavadoc生成タスクを作っちゃいましょう。


# 環境
以下の環境で動作を確認しています。

* Gradle 2.2.1
* (Android Studio 1.2.2)


# コード
Android Applicationのモジュール向けです。

`(モジュール)/build.gradle` にコピペします。

```build.gradle
android.applicationVariants.all { variant ->

    task("generate${variant.name.capitalize()}Javadoc", type: Javadoc) {
        description "Generates Javadoc for $variant.name."
        source = variant.javaCompile.source
        ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
        classpath = files(variant.javaCompile.classpath.files) + files(ext.androidJar)
        exclude '**/BuildConfig.java'
        exclude '**/R.java'
    }

}
```

これで `generateDebugJavadoc` と `generateReleaseJavadoc` がタスクが使えるので、叩くと `(モジュール)/build/docs/javadoc` 以下にJavadocが生成されます！
（variantの数だけ、variantのコンパイル対象になっているソースのJavadocタスクが作られます）


## Android Libraryの場合は？

1行目を書き換えます。

```
android.applicationVariants.all { variant ->

↓

android.libraryVariants.all { variant ->
```

Android ApplicationモジュールとAndroid Libraryモジュールでは使われているGradleプラグインが違うためです。


# 参考

* [Generate JavaDocs with Android Gradle plugin](http://stackoverflow.com/questions/17033878/generate-javadocs-with-android-gradle-plugin)
ng-classの使い方メモ

普通の使いかた。
文字が赤と青の色で表示されます。

```lang:html
<html ng-app="App" ng-controller="AppCtrl">
<body>
  <div ng-class="{redColor:isRed}">赤く表示されます。</div>
  <div ng-class="{blueColor:isBlue}">青く表示されます。</div>
</body>
</html>
```

```lang:js
angular.module('App', [])
  .controller('AppCtrl', ['$scope', function($scope) {
    $scope.isRed = true;
    $scope.isBlue = true;
  }])
```

```lang:css
.redColor {
  color: red;
}
.blueColor {
  color: blue;
}
```

<a href="http://codepen.io/satofaction/pen/xGQPPx" target="_blank">サンプル</a>

class名をハイフンで区切った場合は、下記のように**''**で囲む必要があります。
あたりまえか・・・。

```lang:html
<html ng-app="App" ng-controller="AppCtrl">
<body>
  <div ng-class="{'red-color':isRed}">赤く表示されます。</div>
  <div ng-class="{'blue-Color':isBlue}">青く表示されます。</div>
</body>
</html>
```

下記のような書き方もできます。どんなメリットがあるのかがよくわかりませんでした。。。

```lang:html
<html ng-app="App" ng-controller="AppCtrl">
<body>
  <div ng-class="{true:'red-color'}[isRed]">赤く表示されます。</div>
  <div ng-class="{true:'blue-Color'}[isBlue]">青く表示されます。</div>
</body>
</html>
```

<a href="http://codepen.io/satofaction/pen/JdeOvd" target="_blank">サンプル</a>
たった2行!最も簡単にeddystoneでURLを送信する方法

なんか新しいeddystoneってのが出たみたいだし試してみるか…
でもどうやってそもそも電波飛ばしたらいいんだ？

というわけで、Macを使って最も簡単にeddystoneの[Eddystone-URL](https://github.com/google/eddystone/tree/master/eddystone-url)を飛ばしてみたいと思います。

#環境
- Bluetooth Low Energy(BLE, Bluetooth4.0)が搭載されたMac製品
 - Macbook Pro, Macbook Pro Retina, Macbook Airなどなど
 - 最近の製品なら大抵OK
- node.js v0.12.0 (筆者の動作確認環境)

#準備
Macでnode.jsとnpmを使えるようにする必要があります。
http://nodejs.org/
から"INSTALL"をクリックしpkgファイルをダウンロードし、インストールします。

その後、無ければ適当にディレクトリを作成しましょう。
ここでは`~/eddystone`を作成します。

```Bash
mkdir ~/eddystone
```

これで準備は完了です！

#Eddystone-URLを飛ばしてみる

この表現があっているのかわかりませんが…。

[node-eddystone-beacon](https://github.com/don/node-eddystone-beacon)を使用します。
ちなみに、今回はEddystone-URLを飛ばそうとしていますが、[Eddystone-UID](https://github.com/google/eddystone/tree/master/eddystone-uid)も飛ばすことが出来ます。
node-eddystone-beaconをnpm installしましょう

```Bash
cd ~/eddystone
npm install eddystone-beacon
```
その後、適当にjsを書きます。下記をコピペでも構いません。

```js:app.js
EB = require('eddystone-beacon');
EB.advertiseUrl('http://goo.gl/uagFfW');
```

これで準備は完了です。
実際に実行してみましょう。

```Bash
node ~/eddystone/app.js
```

特にエラーがでなければ成功です。
iOS版Chrome(44以上)のToday Extensionで手軽に確認できます。

#よくあるエラー

```
$ node app.js 
/.../eddystone/node_modules/eddystone-beacon/node_modules/eddystone-url-encoding/lib/encode.js:16
    throw new Error([
          ^
Error: Encoded URL (http://3.141592653589793238462643383279502884197169399375105820974944592.com/) is too long (max 18 bytes): 67 bytes
    at module.exports (/.../eddystone/node_modules/eddystone-beacon/node_modules/eddystone-url-encoding/lib/encode.js:16:11)
    at Object.makeUrlBuffer (/.../eddystone/node_modules/eddystone-beacon/lib/advertisement.js:31:19)
    at Object.advertiseUrl (/.../eddystone/node_modules/eddystone-beacon/lib/beacon.js:10:43)
    at Object.<anonymous> (/.../eddystone/app.js:2:4)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
```

指定しているURLが長すぎます。
[URL短縮サービス](http://goo.gl)などを使用してURLを短くしてみましょう。
my_car.run

車を走らせよう

メソッド呼び出しはわかりづらいですよね＾＾(感想)

>・ゲッターメソッドでインスタンス変数@xを呼び出せるようにする。
・initializeメソッド newメソッドでインスタンスを生成すると同時にこのメソッドは呼ばれる。
・runメソッド runメソッド呼び出し時に@x = 0にdistance引数を加算する

>・この段階だとインスタンスに定義されてrunメソッドが呼び出されてもユーザー入力できないので
run(distance)の引数distanceにgets.chomp.to_iメソッドを代入する。

>・my_car = Car.newでmy_carインスタンスを生成
　この時にinitializeメソッドが呼び出される

>・my_car.run(distance)でmy_carにrunメソッドを定義
①initializeメソッドが呼び出されている
②@x += distance <= gets.chomp.to_iメソッドが使える。


>puts  "走行距離: #{my_car.x}km"

>以下わかりづらい日本語(呼び出されている)に関して

>この時initializeメソッドはもう呼び出されているんだから#{my_car.run}でいいんじゃね＾＾
と考えたので実験

>実験　#{my_car.run}引数runでいいじゃん、もうinitializeメソッドはインスタンス生成時に呼びだれているし！！my_carあたりに代入されてるでしょ <--

>結果
ArgumentError(引数エラー、、)＾＾

>理解したこと
呼び出されている＝定義されているわけではない、ちゃんと@x = 0であることをmy_carインスタンスに定義しなければならない。

>point

>initializeメソッド newメソッドでインスタンスを生成すると同時にこのメソッドは呼ばれる。で言及されている"呼ばれる"は具体的に言えば、「定義して扱えるようにしておく」とかかな？？


　
車を走らせる＝走行距離0に対してユーザーの入力から走行距離を足せるように出来る。


```
class Car 
  attr_reader :x #1

  def initialize #2
    @x = 0
  end

  def run(distance) #3 
    @x += distance
  end 
end


my_car = Car.new("ブリウス", "白") 


puts "何km走りますか？"
distance = gets.chomp.to_i #4

my_car.run(distance) #5


puts "走行距離: #{my_car.x}km"#6

```

> #ゲッターメソッド注意点
> ① 走行距離"x"を外部から変更できないようにゲッターメソッドで定義(セッターが存在しないので外部から変更不可。)
② ゲッターメソッドで@x(インスタンス変数)を取得出来るようにしている。
③ @nameなどのインスタンス変数の値はクラス内からしか取得出来ません。

> #理解の手順   

>①initializeメソッド(コンストラクタ)を定義、インスタンス変数@xにdistanceを代入しておく、定義内容は「走行距離xを0にする。」
② runメソッドを定義、定義内容は「呼び出し時に自身の走行距離xに引数distanceを加算する。」
③ @xに0を代入、インスタンス生成時の最初の走行距離を0にする
3 Carクラスのインスタンスを生成
④distanceにユーザー入力(gets)の末尾の改行文字を取り除いたもの(get.chomp)を整数に変換した値 (get.chomp.to_i)を代入
⑤Carクラスのインスタンスにdistanceを仮引数とするrunメソッドを定義
⑥Carクラスのインスタンスにゲッターメソッドを定義する
CordovaでWkWebView(telerik plugin)を使う

Cordovaは標準でUIWebViewを使うので、Safariで検証して直前にアプリ化してリリースみたいな危ない橋を渡ろうとすると死にます。
UIWebViewのパフォーマンスはSafariに較べて３倍程度遅く、操作感がかなり変わってしまいます。
もちろんPhonegapも事情は同じです。

iOS8から用意されている「WKWebView」を使うと、Safariと同等程度のパフォーマンスが出るようになります。
注意点として、WKWebViewではファイルシステムへの参照が厳しくなっているため、WKWebViewではWebサーバをcordova内に立てる構成になっています。そのため、UIWebViewとは動作が変わるおそれがあります。

Cordova向けのWKWebViewプラグインは、apacheのものとtererikのものと２つありましたが、数ヶ月前に試用した時点では、tererik側の方が安定していました。（apache側はlocalStorageを使えなかったかと記憶しています）

https://github.com/Telerik-Verified-Plugins/WKWebView

とりあえずHelloWorldとしては下記のコマンドを実行すればOKです。

```
cordova create helloworld
cordova platform add ios
cordova plugin add com.telerik.plugins.wkwebview
cordova prepare
```

その後に、生成されたフォルダをXCodeで開けば良いです。
attr_encryptedを手動で復号する方法


諸事情から、rubyスクリプトで、attr_encryptedで暗号化されたデータを復号する必要があったのでメモ

```ruby:memo
$ sudo gem install attr_encrypted
$ irb
irb> require 'attr_encrypted'
irb> require 'base64'
irb> class User
irb>  attr_encrypted :hoge, :key => 'secret_key'
irb> end
irb> user = User.new
irb> p user.decrypt(:hoge,Base64.decode64('dbに保管されているデータ') )
"元データ"
=> "元データ"
```
Swift 画面遷移のコード(初心者向け)

色々あって初iOSアプリ制作奮闘中！

※ボタン押したタイミングなどではなくて、
数秒後に自動で画面遷移したくなったのでメモです

##1、StorybordIDを付ける
遷移したい先のビューの
StorybordIDに任意の名前を付けます。
今回の例だと"target"です

![スクリーンショット 2015-07-29 17.22.31.png](https://qiita-image-store.s3.amazonaws.com/0/76843/90d3956e-5513-697e-0d82-c35051ef966c.png)

##2、コードを書く

```swift

let targetViewController = self.storyboard!.instantiateViewControllerWithIdentifier( "target" ) as! UIViewController
self.presentViewController( targetViewController, animated: true, completion: nil)
```

以上です！
変なとこあったらご指摘ください
今日もがんばりましょう
Vagrantでletter_openerを使う


これまで開発環境をマシン自体に持っていたため、[letter_opener](https://github.com/ryanb/letter_opener)を使っていました。

今回開発環境をVagrantに移行して使っていると、

```bash:

12:33:42 web.1  | Failure in opening /vagrant/tmp/letter_opener/1358825621_ba83a22/rich.html
with options {}: Unable to find a browser command. If this is unexpected, Please rerun with
environment variable LAUNCHY_DEBUG=true or the '-d' commandline option and file a bug at
https://github.com/copiousfreetime/launchy/issues/new

```

というエラーが出てしまった。

## 解決方法

[letter_opener_web](https://github.com/fgrehm/letter_opener_web)を使用します。

```ruby:config/environments/development.rb

config.action_mailer.delivery_method = ENV['USER'] == 'vagrant' ? :letter_opener_web : :letter_opener

```

## 参考

[letter_opener_web/README](https://github.com/fgrehm/letter_opener_web/blob/master/README.md)
CentOS7，Apache2でディレクトリへのデータ書き込みができない

# CentOS7 + Apache2 で特定ディレクトリにデータを書き込もうとしてはまる

## まとめ
SELinuxのせいです．
設定を変えるか無効にしてください．
（参考： http://www.hoge256.net/2014/10/1200.html ）

mod_security を導入している方はそちらの設定も念のため見直されると良いと思います．

---
## 背景
とあるCMSを導入する際，
ふと思い立って普段はXAMPPなどで手軽に環境構築しているところを，
yumでApacheなどをそれぞれ入れて設定してみようとしたところ，
ディレクトリへのデータの書き込みができずはまる．

## 現象
ディレクトリのパーミッションは777にも関わらず，
CMSのインストーラーが「書き込み権限が割り当てられていない」と怒る．

phpで以下のようなスクリプトを組んでみても書き込みはできない

```php:sample.php
<?php
$fname = "dummy";
try{
	$fp = fopen( $fname, "w" );
} catch (ErrorException $e) {
	print($e);
}
if( $fp ){
echo __LINE__.": OK".PHP_EOL;
	fputs($fp, date("Ymd H:i:s"));
	fclose( $fp );
}
echo __LINE__.": OK".PHP_EOL;
```

以下のようなエラーが出てくる
`Warning: fopen(dummy): failed to open stream: Permission denied in /var/www/html/sample.php on line 4`

mod_security を入れていたのでこれが悪さをしているのかな？
と思って切ってみたりするが変化なし．

## 対策
こちらのサイト（ http://www.hoge256.net/2014/10/1200.html ）を参考に，
SELinuxの設定を見直す．

> `/var/www/html/tmp` 
> に書き込みを許したいとして，
> `# semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/tmp(/.*)?"`
> `# restorecon -R /var/www/html/tmp`
> のような設定を行う．

もしくは単純にSELinuxを停止する．
`# setenforce 0`
Rubyデザインパターン 4日目 : Composite

Rubyデザインパターン学習のために、自分なりに読書の結果をまとめていくことに決めました。第4日目はCompositeです。(http://www.amazon.co.jp/gp/product/4894712857/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4894712857&linkCode=as2&tag=morizyun00-22)

![スクリーンショット 2015-07-27 11.25.28.png](https://qiita-image-store.s3.amazonaws.com/0/80075/d68a4010-c177-4ef5-2f2e-899a76c76cb6.png)


# **<i class="fa fa-pencil"></i>　4日目 Composite**

4日目はCompositeパターンです。
このパターンの特徴は、ツリーや階層構造を作るときに便利なパターンになります。

階層、ツリー構造のオブジェクトをつくりたいとき、そのツリーを利用するコードが一つのオブジェクトを扱っているのか、ごちゃごちゃした枝全体を扱っているのか考えさせたくないときに便利です。

具体的なコードに移ります。ケーキ屋さんがケーキを作る工程を表現するプログラムを例にあげます。

**<i class="fa fa-check-square-o"></i> 構成要素として必要な物は以下の３点です**

1. コンポーネント(基底クラス
2. 子クラス(小麦粉の計量、卵の投入などそれ以上機能を分離できない最も小さな要素
3. コンポジット(子クラスをまとめあげるもの

## **<i class="fa fa-code"></i> Composite サンプルコード**

```rb
class Task
  attr_reader :name

  def initialize(name)
    @name = name
  end

  def get_time_required
    0.0
  end
end

class AddDryIngredientsTask < Task #　子クラス
  def initialize
    super('Add dry ingredients')
  end

  def get_time_required
    1.0 # 小麦粉と砂糖を加えるのに１分
  end
end

class MixTask < Task # 子クラス
  def initialize
    super('Mix that batter up')
  end

  def get_time_required
    3.0
  end
end

class MakeBatterTask < Task
  def initialize
    super('Make batter')
    @sub_tasks = []
    add_sub_task( AddDryIngredientsTask.new )
    add_sub_task( MixTask.new )
  end

  def add_sub_task(task)
    @sub_tasks << task
  end

  def remove_sub_task(task)
    @sub_tasks.delete(task)
  end

  def get_time_required #ここで子タスクの時間を全て合計している
    time = 0.0
    @sub_tasks.each {|task| time += task.get_time_required }
    time
  end
end

batter = MakeBatterTask.new
batter.get_time_required # => 4.0
```

MakeBatterTaskでは、子クラスを管理するためのメソッドを定義してあります。具体的には以下のふたつです。

* `add_sub_task`
* `remove_sub_task`

このふたつのメソッドで`@sub_tasks`配列に必要な子タスクを出し入れします。
`add_sub_task`で追加された要素は、オーバーライドされた`get_time_required`で各々のクラスで定義された作業時間を合計し、出力します。
新しい子クラスを作ったときは、`@sub_tasks`に入れて扱う事で、等価に増やすことができます。



```rb
class MakeBatterTask < CompositeTask
  def initialize
    super('Make batter')
    add_sub_task( AddDryIngredientsTask.new )
    add_sub_task( AddLiquidsTask.new )
    add_sub_task( MixTask.new )
  end
end

class MakeCakeTask < CompositeTask
  def initialize
    super('Make cake')
    add_sub_task( MakeBatterTask.new )
    add_sub_task( FilePanTask.new )
    add_sub_task( BakeTask.new )
    add_sub_task( FrostTask.new )
    add_sub_task( LickSpoonTask.new )
  end
end
```

そして、最後はこういった形でコンポジットが子クラスをまとめあげることができるように、コンポジットがコンポジットをまとめあげることができます。

再帰的な実装にしてあるので、階層がどれだけ深くなっても対応できるようになっています。

```rb
def get_time_required
  time = 0.0
  @sub_tasks.each {|task| time += task.get_time_required }
  time
end
```

# **<i class="fa fa-star"></i>　まとめ**

作業を定義する具体的なクラスも、それをまとめあげて管理するクラスも似たようなメソッドを持っており、扱う側からどちらも等価なものとして扱いたいときに有効です。
例えると、ディレクトリとファイルの関係のように、親ディレクトリを削除したときに所属するディレクトリもファイルも削除する、といったシステムにも向いているかもしれません。
継承ベースであるTemplate Methodの、再帰的なバージョンとも言えるかもしれませんね。

### **<i class="fa fa-file-code-o"></i> 参照**

* http://morizyun.github.io/blog/ruby-design-pattern-04-composite/
【PHP】Objectの配列から指定したキーが最小である要素を取得する方法

#　Objectの配列から指定したキーが最小である要素を取得する

例えば以下のようなBookというClassがある

```php:book.php
<?php
class Book {
    private $name;
    private $price;
   
    function __construct($name, $price) {
        $this->name  = $name;
        $this->price = $price;
    }
    public function getPrice() {
        return $this->price;
    }
}
```

BookClassの配列からpriceが最小のオブジェクトを取得したい

```php:index.php
<?php
$book1 = new Book("やさしいJava", 2000);
$book2 = new Book("やさしいPHP", 1000);
$book3 = new Book("やさしいRuby", 3000);

$bookList = array( $book1,  $book2,  $book3);
```

## コード例

以下のように単純にループすることで取得できる

```php:index.php
<?php
$book1 = new Book("やさしいJava", 2000);
$book2 = new Book("やさしいPHP", 1000);
$book3 = new Book("やさしいRuby", 3000);

$bookList = array( $book1,  $book2,  $book3);

$result = $bookList[0];
foreach($bookList as $book) {
    if($result->getPrice() > $book->getPrice()) {
        $result = $book;     
    }
}

var_dump($result);
```

または、usortという関数を使用すると、ユーザー定義でソートが実行できるので最小値が取得できる
ただし、コード量は減らせるが計算量が多くなってしまうみたい

```php:index.php
<?php
$book1 = new Book("やさしいJava", 2000);
$book2 = new Book("やさしいPHP", 1000);
$book3 = new Book("やさしいRuby", 3000);

$bookList = array( $book1,  $book2,  $book3);

usort($bookList, function($a, $b) {
    return $a->getPrice() > $b->getPrice();
});

var_dump($bookList[0]);
```

array_reduceを使う方法をコメントで教えてもらいました

```php:index.php
<?php
$result = array_reduce($bookList, function ($c, $i) {
    return $c && $c->getPrice() <= $i->getPrice() ? $c : $i;
});

var_dump($result);
```
インスタンス変数の値を取得するメソッド(ゲッター)

`@name`などのインスタンス変数の値はクラス内からしか取得出来ません。
クラス外からインスタンス変数の値を取得するには、クラス内に`def name`のように定義する
このインスタンス変数の値を取得するためのメソッドを「ゲッター」と呼びます。

```rb
class Car 
  def initialize(name, color)
    @name = name
    @color = color
  end
  
  def name
    @name 
  end
end

my_car = Car.new("プリウス", "白")     
puts my_car.name

```

# attr_readerメソッド(アクセスメソッド)

「ゲッター」(インスタンス変数の値を取得するためのメソッド)を簡単に定義する方法。

```rb
class Car
  attr_reader :name, :color
  def initialize(name, color)
    @name = name
    @color = color
  end
end

my_car = Car.new("プリウス", "白")
puts my_car.name  

```


# インスタンス変数の値を変更するメソッド(セッター)

`@color`などのインスタンス変数の値の変更はクラス内でしか出来ません。
外部からインスタンス変数の値を変更する場合

```rb
class Car
  def initialize(name, color)
    @name = name
    @color = color
  end

  #外部からインスタンス変数の値を変更する場合
  def color=(value)
    @color = value
  end
end

my_car = Car.new("プリウス", "白")
my_car.color = ("赤")
```

# attr_writer(アクセスメソッド)



`attr_writer :color`と定義すると、「`color = ""`」と定義できます。

```rb
class Car
  attr_writer :name, :color
end

my_car = Car.new("プリウス", "白")
puts my_car.color
#結果　白

my_car.color = "赤"  
puts my_car.color
#結果  赤
```

# attr_readerrとattr_writerを同時に定義する。

attr_accessorを用いるとゲッターとセッターの両方を一度に定義することが出来ます。

```rb
class Car
  attr_accessor :name, :color
end

my_car = Car.new("プリウス", "白")
puts my_car.color #ゲッター
#結果　白
my_car.color = "黒" #セッター
puts my_car.color #ゲッター
#結果 黒
```