OmniAICreator/Qiita-1.07M huggingface dataset:
【初心者】【PHP】【Laravel】ドットインストールのLaravel5入門をCloud9でする場合の設定方法

ドットインストールのLaravel5入門をCloud9でする場合の設定方法です。

Cloud9は便利なのですがRuby on RailsのようにLaravelのテンプレートが
設定されていないので、インストール部分をシェルにしてできるだけ
初心者でも簡単にすぐに学習環境を整えれるようにと思い投稿しました。

Laravel5入門
http://dotinstall.com/lessons/basic_laravel


動作確認は「Open in Preview」ではなく「Open」で行う事 ！！

| 項目 | 値 |
|:-----------|------------:|
| プロジェクト名 |     myblog |
| データベース名 | dotinstall_blog_laravel |
| データベースユーザー名 | dbuser |
| データベースユーザーパスワード | hw8JUMe6 |

# Laravelインストールと設定
```
rm -f setup_cloud9_laravel.sh ; touch setup_cloud9_laravel.sh; chmod u+x setup_cloud9_laravel.sh; vi setup_cloud9_laravel.sh
```

下記内容に変更する

DB_DATABASE="dotinstall_blog_laravel"
DB_USERNAME="dbuser"
DB_PASSWORD="hw8JUMe6"
の値を変更すれば自分のプロジェクトを作れます。

```
#!/bin/sh

DB_DATABASE="dotinstall_blog_laravel"
DB_USERNAME="dbuser"
DB_PASSWORD="hw8JUMe6"

rm -f php.ini hello-world.php

sudo sed -i 's/DocumentRoot \/home\/ubuntu\/workspace/DocumentRoot \/home\/ubuntu\/workspace\/public/g' /etc/apache2/sites-enabled/001-cloud9.conf

sudo composer self-update
composer create-project laravel/laravel ./laravel --prefer-dist

shopt -s dotglob

mv laravel/* ./
mv laravel/.* ./
rm -rf laravel

composer update

sed -i "s/DB_DATABASE=homestead/DB_DATABASE=$DB_DATABASE/g" .env
sed -i "s/DB_USERNAME=homestead/DB_USERNAME=$DB_USERNAME/g" .env
sed -i "s/DB_PASSWORD=secret/DB_PASSWORD=$DB_PASSWORD/g" .env

sed -i "s/'timezone' => 'UTC',/'timezone' => 'Asia\/Tokyo',/g" config/app.php                                                                                                                       
sed -i "s/'locale' => 'en',/'locale' => 'ja',/g" config/app.php

mysql-ctl start
mysql -u root -e"create database $DB_DATABASE;"
mysql -u root -e"grant all on $DB_DATABASE.* to $DB_USERNAME@localhost identified by ""'""$DB_PASSWORD""';"
```

実行する

```
./setup_cloud9_laravel.sh
```

# 必要に応じてaliasの設定をします。
「cc」と入力するとCloud 9 特有の phpmyadminの起動コマンド等が表示されます。

```
vi ../.bash_aliases                                                                                                                                                                                                     
```

下記内容に変更する

```
alias ls='ls --color=auto -F'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias less="less -R "

alias mysqldump="mysqldump --user=$C9_USER --host=$IP"
alias php="php -c ~/workspace/php.ini"
alias mongod="mongod --bind_ip=$IP --small --rest '$@'"
alias ..="cd .."

# mysql
alias mysql-stop='mysql-ctl stop'
alias mysql-start='mysql-ctl start'
alias mysql-restart='mysql-ctl restart'
alias mysql-cli='mysql-ctl cli'
alias mysql-phpmyadmin='phpmyadmin-ctl install'

# Cloud 9
alias cc='alias | grep -e mysql-stop -e mysql-start -e mysql-restart -e mysql-cli -e mysql-phpmyadmin'
```

設定を反映する

```
source ../.bash_aliases
```
GradleのインストールからHello World！まで。[CentOS 6] 

GradleをCentOS6.x上にインストールする手順をまとめます。
####手順
#####<Font color="red">JDKをインストールします。</font>

今回は、java-1.8.0のversionをインストールします。

```bash
[vagrant@localhost ~]$ yum install -y java-1.8.0-openjdk-devel

***省略***

Complete!

# version確認
[vagrant@localhost ~]$ java -version
openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
[vagrant@localhost ~]$
```

#####<Font color="red">gradle.zipの最新版を落としてきます。</font>
今現在では、gradle-2.14が最新versionです。--no-check-certificateオプションをつけないと「安全の確認をしないで接続するには、`--no-check-certificate' を使ってください。」と言われることがあるので気をつけて下さい。

```bash
# zipファイルを落としてきます。
[vagrant@localhost ~]$ wget https://services.gradle.org/distributions/gradle-2.14-all.zip --no-check-certificate

***省略***

# /opt/gradle配下に解凍します。
[vagrant@localhost ~]$ unzip gradle-2.14-all.zip -d /opt/gradle
```

#####<Font color="red">環境変数の設定</font>
下記のように環境変数を設定してください。

```bash:.bash_profile
export GRADLE_HOME=/opt/gradle/gradle-2.14
export PATH=$GRADLE_HOME/bin:$PATH
```
```bash
# sourceコマンドで展開します。
[vagrant@localhost ~]$ source .bash_profile

# versionを確認します。
[vagrant@localhost ~]$ gradle -v

------------------------------------------------------------
Gradle 2.14
------------------------------------------------------------

Build time:   2016-06-14 07:16:37 UTC
Revision:     cba5fea19f1e0c6a00cc904828a6ec4e11739abc

Groovy:       2.4.4
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_91 (Oracle Corporation 25.91-b14)
OS:           Linux 2.6.32-431.el6.x86_64 amd64
```

#####<Font color="red">ビルドスクリプトの作成</font>
では簡単に「Hellp World!」と出力するスクリプトを書いていきます。
gradleは、Groovyで書かれていて、デフォルトのファイル名は「*build.gradle*」となっているのでその通りにファイルを作成します。

```java:build.gradle
task hello << {
  println 'Hello World!'
}
```

```bash
[vagrant@localhost ~]$ gradle hello
:hello
Hello World! # Hello World!と出力されています。

BUILD SUCCESSFUL

Total time: 3.753 secs

This build could be faster, please consider using the Gradle Daemon: https://docs.gradle.org/2.14/userguide/gradle_daemon.html
[vagrant@localhost ~]$


# gradle tasksとするとタスク一覧を出してくれます。
[vagrant@localhost ~]$ gradle tasks
:tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

***省略***

Other tasks
-----------
hello // 作成されたタスク

To see all tasks and more detail, run gradle tasks --all
To see more detail about a task, run gradle help --task <task>

BUILD SUCCESSFUL

Total time: 4.357 secs

This build could be faster, please consider using the Gradle Daemon: https://docs.gradle.org/2.14/userguide/gradle_daemon.html
```
目指せマウスを使わないエンジニア！！コーディング速度を1.5倍にするショートカットキー！！

先輩のエンジニアのコーディング風景を見ていると、知らない間にカーソルがいい感じの位置に移動していたり、いい感じに選択したりしていることが多々あります。今回はそんな先輩に追いつくために、使えるショートカットをまとめてみました。
Mac基準で記入しますのでWindowsの方はごめんなさい。

#レベル１
まずは基礎編、エンジニアでない方も知っているであろうショートカットたちです。

|ショートカットキー| 役目 |
|---|---|
| Command + c |選択している文字列をコピー
| Command + v |コピー、切り取られた文字列をペースト |
  Command + x | 一行切り取り、文字列選択時は選択された文字列を切り取り |
  Command + a | すべて選択
  Command + t | 同じウインドウでタブを開く
  Command + n | 新しいウインドウでタブを開く
  Command + z | 作業を一つ前に戻す。
  Command + w | タブを閉じる
Command + f | 検索
Command + q | アプリケーション終了

#レベル2
ショートカットキーでの移動をマスターしていきます。
移動をショートカットキーのままできると、ホームポジションのまま作業を進められるので作業効率が上がります。

| ショートカットキー | 役目 |
|------|-----|
| Contfrol + p| 上に移動 |
| Control + n| 下に移動 |
| Control + f| 前に移動 |
| Control + b| 後ろに移動

#レベル3
最後に少し応用編。これができればコーディング速度1.5倍！！！

|ショートカットキー| 役目|
|---|---|
Command +y | 作業を一つ進める
Command +{ | Escape
Command + tab | アプリケーション切り替え
Control + h| BackSpace
Control + d| Delete
移動、削除など + Option | 一単語ずつ移動、削除などを行う
移動、削除など + Command | 末尾までその処理を行う
Rust学習用メモ

# まえがき

Rustを学習するにあたって今後参考にしたい資料などのメモ。
随時アップデートしていく予定。

# 言語仕様

https://doc.rust-lang.org/book/
https://y-yu.github.io/trpl-ja-pdf/a4.pdf
http://rustbyexample.com/index.html

# 開発環境

https://crates.io/
http://doc.crates.io/index.html

# Playground

https://play.rust-lang.org/

# News

https://blog.rust-lang.org/
https://this-week-in-rust.org/
Visual Studio Code で VSTS (Visual Studio Team Services) にプロジェクトを PUSH する。

自分のナレッジのためにも、Qiita に初投稿をば。

Visual Studio Code (以下、VS Code) でソース管理がちゃんとできていなかった＆ Git を全然触ったことがない人間が、試行錯誤のうえ VS Code から Visual Studio Team Services (以下、VSTS) の Git リポジトリに PUSH するまでの流れです。
※間違ってることもあると思うので、その時は教えてください。

# 事前準備
- VS Code のインストール
- VS Code の拡張機能「Visual Studio Team Services」のインストール
- Git のインストール
- VSTS チームプロジェクト (Git リポジトリ) の作成

# やってみた手順
1. PC に VSTS からリポジトリを Clone する。
初めての時は Microsoft アカウント認証が求められるようです。
![git clone.png](https://qiita-image-store.s3.amazonaws.com/0/133109/6a15571f-2621-63c5-d73a-2be30d2aa00e.png)

2. Clone で生成されたフォルダ内にプロジェクトフォルダを作成する。
![2 Create Project.png](https://qiita-image-store.s3.amazonaws.com/0/133109/ae4760e3-d76f-a810-0956-82e28e2047a8.png)

3. 作成したプロジェクトを VS Code で開く。
Clone したフォルダに作成したプロジェクトを開くと、ログインエラーが表示されます。
![2 Open VS Code.png](https://qiita-image-store.s3.amazonaws.com/0/133109/07fd5330-94aa-ed28-d188-f10b3f1194d5.png)

4. VS Code 内で VSTS にログインする。
「>team login」を開き、Personal Access Token (以下、PAT) を入力する。(PAT の取得は後述)
![3 Team Login.png](https://qiita-image-store.s3.amazonaws.com/0/133109/37fe6c8b-da38-3a52-2287-b67ae3ce63a7.png)
![4 Register PAT.png](https://qiita-image-store.s3.amazonaws.com/0/133109/103e23ac-269b-2f0a-8df1-945a4f73a0a7.png)

4. コードを追加する。
5. ローカルでコミットする。
![5 Commit Local.png](https://qiita-image-store.s3.amazonaws.com/0/133109/add88d8e-18ba-1ca1-20f7-54c2e057f9c9.png)

6. プロジェクトを Git コマンドで PUSH する。(初回のみ)
ここで、プロジェクトのフォルダ内で Git コマンド「git push -u origin --all」を実行しました。
これでようやく VSTS 側にプロジェクトフォルダとファイルが登録されます。
![6 Git push.png](https://qiita-image-store.s3.amazonaws.com/0/133109/4d91ac51-004f-5c31-e077-a55dc5475de1.png)

7. コードを諸々書いていく。
8. VS Code 内でコミットする。
手順「5」と同じ。
9. 「･･･」から Push を実行する。
![7 Git push.png](https://qiita-image-store.s3.amazonaws.com/0/133109/eefecea6-9979-63be-8b47-15d640bb36bf.png)

あとは手順「7」～「9」の繰り返しを行うことで、ソースコードを追加できました。

## 補足 : PAT の生成
1. VSTS のチームプロジェクトから PAT の作成画面を開く。
![s1 Create PAT.png](https://qiita-image-store.s3.amazonaws.com/0/133109/445c1072-324a-d925-900e-7541a9a4f37c.png)

2. 「Add」で新しい PAT を作成する。
![s2 add pat.png](https://qiita-image-store.s3.amazonaws.com/0/133109/1936453b-0f4a-9d68-dcc4-2294151c634d.png)


3. 「Create Token」ボタンをクリックする。
![s3 create pat.png](https://qiita-image-store.s3.amazonaws.com/0/133109/f2978b6f-ac3d-9fbb-2db6-2cf7613803ec.png)

4. PAT をコピーする。
![s4 copy pat.png](https://qiita-image-store.s3.amazonaws.com/0/133109/3c3d0fed-f898-960e-b262-60e98e4a6360.png)
PythonとBottleを使用してSalesforceにアクセスするサンプルを作成してみた

ここ最近Pythonを個人的に学習し始めたこともあって、PythonからSalesforceを使用できないかと思って試してみた。

# 使用するもの

今回のサンプルを作成するのに使用したのは以下

- Python 3.5
- virtualenv
- Bottle
- simple-salesforce

ちょっとだけ補足すると

### Bottle

PythonでWebアプリケーションを作成するためのフレームワーク。PythonでWebアプリケーションを作成するためのフレームワークには他にDjangoなどがある。
Bottleはその中でも軽量なフレームワークで、必要最低限のものが一通り揃っているとのことなので選択。

### virtualenv

Pythonの仮想環境を作成するライブラリ。イメージとしてはVirtualboxとVagrantで仮想環境を作成するのに近いかも。

### simple-salesforce

PythonからSalesforceを操作するためのモジュール。公式ドキュメントを見た感じだとREST APIを叩いているみたい。

## 実装

実装したものは最低限しかないけれど

```html:index.tpl
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Bottle Indexテンプレート</title>
  </head>
  <body>
    <h1>{{msg}}</h1>
    <h2></h2>
    <form action="" method="post">
      <input type="text" name="username" placeholder="Username" />
      <input type="password" name="password" placeholder="Password" />
      <input type="password" name="security_token" placeholder="SecurityToken" />
      <input type="submit" value="ログイン" />
    </form>
  </body>
</html>
```

```py3:index.py
from bottle import route, run, template, request
from simple_salesforce import Salesforce

@route('/')
def index(msg='This page is home page.'):
    return template('index', msg=msg)

@route('/', method=["POST"])
def login_salesforce():
    uname = request.POST.getunicode("username")
    upw   = request.POST.getunicode("password")
    token = request.POST.getunicode("security_token")
    try:
        sf = Salesforce(username=uname, password=upw, security_token=token)
        return template("login_success")
    except Exception as e:
        return template("login_error")
    finally:
        print("ログイン処理終了")

run(host='localhost', port=8080, debug=True, reloader=True)
```

本当に最低限だけです。
今後適宜追加予定なので。

現段階でのソースはGithubの[BottleSalesforceEnv](https://github.com/silverskyvicto/BottleSalesforceEnv)にあがっています。
draft-jsでシンタックスハイライターを作る


## tl;dr

strategy で 正規表現でヒットさせて、ヒットした部分を component で置き換える。正規表現と色の組み合わせは一般化できるので、そこまでやってみた。

## 最小コード

@mizchi みたいにユーザー名に色を付ける

```js:decorators/username-decorator.js
import {CompositeDecorator} from "draft-js";
const USERNAME_REGEX = /\@[\w]+/g;

export default new CompositeDecorator([
  {
    strategy(contentBlock, callback) {
      const text = contentBlock.getText();
      let matchArr, start;
      while ((matchArr = USERNAME_REGEX.exec(text)) !== null) {
        start = matchArr.index;
        callback(start, start + matchArr[0].length);
      }
    },
    component(props) {
      return <span {...props} style={styles.handle}>{props.children}</span>;
    },
  },
]);

const styles = {
  handle: {
    color: "rgba(98, 177, 254, 1.0)",
    direction: "ltr",
    unicodeBidi: "bidi-override",
  }
};
```


使う

```js:components/my-editor.js
import {Component} from "react";
import {Editor, EditorState} from "draft-js";
import usernameDecorator from "../decorators/tweet-decorator";

export default class MyEditor extends Component {
  constructor() {
    super();
    this.state = {
      editorState: EditorState.createEmpty(usernameDecorator),
    };
  }

  onChange(editorState) {
    this.setState({editorState});
  }

  render() {
    return (
      <Editor
        editorState={this.state.editorState}
        onChange={this.onChange.bind(this)}
        ref="editor"
      />
    );
  }
}
```

動きました

![](https://i.gyazo.com/90fbe257f94fd5ce40ade284c5fa1c95.png)


## 一般化する

任意の正規表現でヒットしたものをハイライトするのを一般化するとこうなる。

```js
import {CompositeDecorator} from "draft-js";

const HIGHLIGHT_RULES = [
  {
    regex: /\@[\w]+/g,
    color: "rgb(98, 177, 254)"
  },
  {
    regex: /\#[\w]+/g,
    color: "rgb(95, 184, 138)"
  }
];

export default new CompositeDecorator(HIGHLIGHT_RULES.map(rule => (
  {
    strategy(contentBlock, callback) {
      const text = contentBlock.getText();
      let matchArr, start;
      while ((matchArr = rule.regex.exec(text)) !== null) {
        start = matchArr.index;
        callback(start, start + matchArr[0].length);
      }
    },
    component(props) {
      return <span {...props} style={{
        color: rule.color,
        direction: "ltr",
        unicodeBidi: "bidi-override",
      }}>{props.children}</span>;
    },
  }
)));
```

まだ使い込んでないんで色々と引数を足したくなるだろうが、そのうちライブラリに切り出す。

特定の構文下でルールを変える、といった拡張が考えられる。

## 参考

- [Draft.js | Rich Text Editor Framework for React](https://facebook.github.io/draft-js/docs/advanced-topics-decorators.html "Draft.js | Rich Text Editor Framework for React")
- [draft-js/tweet.html at master · facebook/draft-js](https://github.com/facebook/draft-js/blob/master/examples/tweet/tweet.html "draft-js/tweet.html at master · facebook/draft-js")
Rubyのアクセスメソッドについて

#アクセスメソッドを使う理由は？

コードの量を減らすため


#アクセスメソッドについて

[Rubyのインスタンス変数](http://qiita.com/negabaro/items/e32bb5a4ffe80f7cac76)に続いてRubyのアクセスメソッドについてまとめます。


インスタンスメソッドに値を保存するには
クラスに毎回set,getメソッドを作らないといけないので面倒です。

そのためRubyでは定義されたアクセスメソッドを利用してset,getメソッドの作成を省略できます。

アクセスメソッドは以下の表通りです。

|定義式|機能|effect|
|---|---|---|
|attr_reader :v|参照が可能|def v; @v; end|
|attr_writer :v|更新が可能|def v=(value); @v=value; end|
|attr_accessor :v|参照・更新が可能|attr_reader :v; attr_writer :v|


set,getメソッドはセットみたいなもんで僕はほとんどattr_accessorしか使ってない感じです。

また複数のインスタンスメソッドを外から使うには

```rb
attr_accessor :carname, :location, :age
```
のように書けます。

#コード

次のコードはアクセスメソッドを利用してオブジェクト毎に値を保存して表示するコードの例です。

```rb
class Car
attr_accessor :carname
end

mom_car  = Car.new
father_car = Car.new

mom_car.carname = 'morning'
father_car.carname = 'lamborghini'

puts mom_car.carname
puts father_car.carname
```

実行結果




```rb
morning
lamborghini
```

---------------------
attr_accessorをコメントアウトするとアクセスできないよって言われます。

```rb
class Car
# attr_accessor :carname
end

mom_car  = Car.new
father_car = Car.new

mom_car.carname = 'morning'
father_car.carname = 'lamborghini'

puts mom_car.carname
puts father_car.carname
```

実行結果

```rb
access_method.rb:8:in `<main>': undefined method `carname=' for #<Car:0x000000011c68e8> (NoMethodError)
```

---------------------


参考
http://www.rubylife.jp/ini/class/index6.html
CentOS6系で、LVM /root（ルートパーティション）を拡張するメモ

#参考にしたサイト
http://qiita.com/TsutomuNakamura/items/93c6333c8dd32aeb197a
http://yoseatsu.me/article/910
http://knowledge.sakura.ad.jp/tech/925/
http://qiita.com/2or3/items/501f206a6091a4ce895f
http://h50146.www5.hp.com/products/software/oe/hpux/developer/column/beg_integrity_10/


#環境
前提：仮想ソフトでの作業。（VMware or VirtualBox 等）
ＯＳ：CentOS6.x
ディスク：
　　　既存ディスク：/dev/sda
　　　追加ディスク：/dev/sdb　←　管理画面で追加したディスク

追加後の状態
/dev/sda: |-sda1(/boot)-|-sda2(LVM)-| 
/dev/sdb: |-未割り当て-|
※sda2の中身（lv_root,lv_swap)


#作業の流れ
1.追加ディスクに、パーティションを作成　（利用コマンド fdisk)
2.追加ディスクに、物理ボリュームを作成　（利用コマンド pvcreate）
3.追加ディスクを、既存ボリュームグループに参加　（利用コマンド vgextend）
4.ボリュームグループにの空きを、論理ボリューム(lv_root)へ割り当てる　（利用コマンド lvextend）
5.ファイルシステムの拡張　（利用コマンド resize2fs）


#実際の作業
1.追加ディスクに、パーティションを作成

```
# fdisk /dev/sdb

コマンド (m でヘルプ): n
コマンドアクション: p
パーティション番号 (1-4): 1
最初 シリンダ (1-1044, default 1):  <--そのままEnter
Last シリンダ, +シリンダ数 or +size{K,M,G} (1-1044, default 1044):  <--そのままEnter
コマンド (m でヘルプ): t
16進数コード (L コマンドでコードリスト表示): 8e
コマンド (m でヘルプ): w
```

2.追加ディスクに、物理ボリュームを作成

```
# pvcreate /dev/sdb1
```


3.追加ディスクを、既存ボリュームグループに参加
既存ボリュームグループの確認には（vgdisplay）を利用

```
# vgdisplay
  --- Volume group ---
  VG Name               VolGroup
   ~ 略 ~

現在存在するボリュームグループは、"VolGroup"
```

```
# vgextend VolGroup /dev/sdb1
```


4.ボリュームグループにの空きを、論理ボリューム(lv_root)へ割り当てる
論理ボリュームの確認には（lvdisplay）を利用

```
# lvdisplay
  --- Logical volume ---
  LV Path                /dev/VolGroup/lv_root
  LV Name                lv_root
  VG Name                VolGroup
  ~ 略 ~

 --- Logical volume ---
  LV Path                /dev/VolGroup/lv_swap
  LV Name                lv_swap
  VG Name                VolGroup
  ~ 略 ~

このサーバには、論理ボリュームはlv_rootとlv_swapが存在することがわかる。
```

```
# lvextend -l +100%FREE /dev/VolGroup/lv_root
```

5.ファイルシステムの拡張

```
# resize2fs /dev/VolGroup/lv_root
```
Pythonを使ってTwitterに投稿する

PythonからTwitter APIを操作して、
自分のアカウントにつぶやきの投稿をします！

ちなみに今回使う、Python Twitter Toolsは投稿だけではなく、Twitterの検索結果を取得したり、ダイレクトメッセージの送信などもできるパッケージです。

#設定した環境
MacBook Air (13-inch, Mid 2011)
プロセッサ： 1.8 GHz Intel Core i7
メモリ： 4 GB 1333 MHz DDR3
OSバージョン： 10.11.5
Python: 3.5.2

#準備
今回はPython Twitter Toolsを利用します。

pipでインストールする手もあるみたいですが、自分はこちらからファイルをダウンロードしてインストールしました。

https://pypi.python.org/pypi/twitter

ダウンロードしたら、解凍したフォルダに移動してインストールをします。
（フォルダにはバージョンが記されているので、DLしたものに合わせて入力してください。）

```sh
$cd twitter-x.xx.x
$python setup.py install
```

### pipでインストールする場合


```sh
$pip install twitter
```

#Twiiterでアプリケーション登録をする
以下のページからTwitterのアプリケーション登録をしてAPIを使えるようにします。
アカウントは普段使って投稿しているものと同じものを使います。

https://apps.twitter.com/

登録したら、「Keys and Access Tokens」のタブを選択して、
API key, API secret, Access token, Access token secretの取得をします。

![image](https://qiita-image-store.s3.amazonaws.com/0/8222/c675cb39-ec9f-baca-77ad-bbb21e89609a.png)


#投稿してみよう！
それでは、以下のコードに各種Tokenを入れて、実行してみましょう。

```py:post.py
from twitter import Twitter, OAuth

access_token = "自分のを記入"
access_token_secret = "自分のを記入"
api_key = "自分のを記入"
api_secret = "自分のを記入"

t = Twitter(auth = OAuth(access_token, access_token_secret, api_key, api_secret))

text = 'Pythonを使ってつぶやいてみました。'
statusUpdate = t.statuses.update(status=text)

# 生の投稿データの出力
print(statusUpdate)

# 要素を絞った投稿データの出力
print(statusUpdate['user']['screen_name'])
print(statusUpdate['user']['name'])
print(statusUpdate['text'])
```

実行すると最初に、とても長い文字列が出力されますが、これが一投稿に含まれる全てのデータです。

これだと見た目上、どんな内容がつぶやかれたのかわかりにくいので、
最後の3行で、スクリーンネームとユーザー名、投稿本文を抽出して出力しています。

```py:post.py
# 要素を絞った投稿データの出力
print(statusUpdate['user']['screen_name'])
print(statusUpdate['user']['name'])
print(statusUpdate['text'])
```

抽出したいデータに応じて、[]の中を編集してみると良いと思います。
例えば、['description']とするとプロフィールの紹介文も取得できます。

投稿したり、抽出したりできる便利なPython Twitter Toolsの入門編でした。
Rubyのインスタンス変数

#インスタンス変数とは

・オブジェクトの中で値を保存しておくための利用されます。
・クラスから作成されるオブジェクト毎に固有のものとなります。
・インスタンス変数はクラス内で全メソッドで共通して使用することが出来ます。
・@から始まる名前で表記します。(例: @length)


##使い方

```rb
class クラス名

  def メソッド名
    @name = 値
  end

end
```


##オブジェクト毎に値を持つ例

```rb
class Car
  def set_car_name(str)
    @name = str
  end

  def get_disp_name
    print(@name, "¥n")
  end
end

mom_car  = Car.new
father_car = Car.new

mom_car.set_car_name('morning')
father_car.set_car_name('lamborghini')

puts mom_car.get_disp_name
puts father_car.get_disp_name
```

表示結果

```rb
morning

lamborghini
```


参考：
http://www.rubylife.jp/ini/class/index4.html
yokohama.rb#70 に出した問題の実装例(ruby)


yokohama.rb#70( https://yokohamarb.doorkeeper.jp/events/45057 )で、いわゆる「どう書く」をやりました。

問題の方は http://nabetani.sakura.ne.jp/yokohamarb/2016.07.ront/

です。
実際のところ、以前出した http://nabetani.sakura.ne.jp/hena/ord5railsontiles/ のリメイクです。

で。

会場で紹介した実装例を。

```ruby
def solve( src )
  map = [nil]*5+[*?a..?p].each_slice(4).map{ |x| [x, nil ] }.flatten+[nil]*5
  cur=[5+1,5]
  seq=map[cur[0]]
  m={ 1=>5, 5=>1, -1=>-5, -5=>-1 }
  loop do
    case src[cur[0]-5 ]
    when "0"; cur[1] = -m[cur[1]]
    when "1"; cur[1] = m[cur[1]]
    when "2"; cur[1] = cur[1]
    when "3"; return seq
    end
    cur[0]+=cur[1]
    return seq unless map[cur[0]]
    seq += map[cur[0]]
  end
end

def test( src, expected )
  actual = solve( src )
  okay = actual == expected
  p [ okay ? "ok" : "**NG**", src,actual, expected ]
end

test( "0113/1201/2201/2100", "bcgfeabfjnoklpo" ) # 0    
test( "0211/1200/2220/2103", "bfjnokghdc" ) # 30
```

テストデータの大半は省略。

実装方針としては、

* 地図は 1次元で持つ。
* 盤面の外に出たかどうかを、番兵で判断する

というもの。

`when "2"` の代入文は不要なんだけど、なんとなく書いてみた。

他の方の実装や感想は

* https://gist.github.com/hamakn/6a87a3463794754ac142741d5535f067#file-70th-md
* http://blog.kymmt.com/entry/yokohamarb-70
* http://nomnel.hatenablog.com/entry/2016/07/10/163743
* https://gist.github.com/miyohide/fefafbbf0b9ce8640991da1ee15d6fed

などをご覧いただければと思う。
ConnectionString の作成・パースに ConnectionStringBuilder を使う

ADO.NET でデータベースに接続するとき、接続文字列 (ConnectionString) を指定しますが、接続文字列の作成・パースを簡単にするためのクラスが提供されています。

`System.Data.Common` 名前空間に `DbConnectionStringBuilder` という基底クラスがあり、各データベース向けにこれを継承したクラスがあります。

SQL Server の場合は [SqlConnectionStringBuilder](https://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqlconnectionstringbuilder.aspx) です。

## 接続文字列の作成

```csharp
// using System.Data.SqlClient;

var builder = new SqlConnectionStringBuilder();
builder.DataSource = "ServerName";
builder.InitialCatalog = "AdventureWorks";
builder.IntegratedSecurity = true;

var connectionString = builder.ConnectionString;
Console.WriteLine(connectionString);
// => "Data Source=ServerName;Initial Catalog=AdventureWorks;Integrated Security=True"
```

## 接続文字列のパース

```csharp
// using System.Data.SqlClient;

var connectionString = "Network Address=(local);Integrated Security=SSPI;Initial Catalog=AdventureWorks";
var builder = new SqlConnectionStringBuilder(connectionString);

Console.WriteLine("DataSource: " + builder.DataSource);
// => "DataSource: (local)"
Console.WriteLine("IntegratedSecurity: " + builder.IntegratedSecurity);
// => "IntegratedSecurity: True"
Console.WriteLine("InitialCatalog: " + builder.InitialCatalog);
// => "InitialCatalog: AdventureWorks"
```
Play2.5のherokuデプロイ手順

毎回微妙にそのままではデプロイできなかったりするのでデプロイ手順メモです.

# Playのプロジェクトを作成

手順メモの目的なので新規に作成します。
今回はjavaで!

```bash:プロジェクト作成
activator new test-app

Fetching the latest list of templates...

Browse the list of templates: http://lightbend.com/activator/templates
Choose from these featured templates or enter a template name:
  1) minimal-akka-java-seed
  2) minimal-akka-scala-seed
  3) minimal-java
  4) minimal-scala
  5) play-java
  6) play-scala
(hit tab to see a list of all templates)
> 5
```
```bash:動作確認
cd test-app/
activator run
```
check http://localhost:9000/

# Commit 

ローカルで動作確認できたら、ファイルをgit管理下に入れます.

```bash:git-init
git init
git add --all
git commit -m 'initial commit.'
```

# Heroku上でのアプリケーション作成
test-app-0708はheroku上でのアプリ名を決めます.

```bash:heroku-create
heroku create test-app-0708
```

# Push (デプロイ)
herokにpushすればそのまま、コンパイルされ自動でアプリケーションとして動いてくれます。

```bash:git-push
git push heroku master
```
**しかし、このままだとApplication Errorになります。**

# Procfileの作成

/test-app配下に
`Procfile`ファイルを作成

```:Procfile
web: target/universal/stage/bin/test-app -Dhttp.port=${PORT} -Dplay.crypto.secret=${APPLICATION_SECRET}
```

# APPLICATION_SECRETの設定
APPLICATION_SECRETのabcdefgのとこは、適当に生成.
aアプションで、heroku上でのアプリケーションの選択.

```bash:APPLICATION_SECRET
heroku config:set APPLICATION_SECRET='abcdefg' -a test-app-0708
```

# 再デプロイ

```bash:redeploy
git add --all
git commit -m 'add procfile'
git push heroku master
```

# 完了

てな感じでお手軽に完了!
素晴らしきかな。
 ProcfileとAPPLICATION_SECRETのことを知らないと、ちょっとだけ嵌るのでそこだけ注意ね :stuck_out_tongue_closed_eyes: 

![スクリーンショット 2016-07-09 23.56.01.png](https://qiita-image-store.s3.amazonaws.com/0/70150/1ee46d1e-d440-4e9d-1fa3-0837a0b7d540.png)

# 参考までに

- [Heroku Play Framework Support (Official Heroku)](https://devcenter.heroku.com/articles/play-support)
- [Deplaying to Heroku (Official Play)](https://www.playframework.com/documentation/2.5.x/ProductionHeroku#Deploying-to-Heroku)
suコマンドの基本

suはよく使うが体系的に学んだことがなかったので調べてみました。

| コマンド | 意味 | 説明 | 
|:-:|:-:|:-:|
| su  | ユーザを切り替える(Substitute User)  | ユーザーを切り替えるのに使用する。 |

書式

```
 $ su [-flmp] [-c command] [-s shell] [-] [--help] [user[arg...]] 
```

| オプション名 | 説明 | 
|:-:|:-:|
| -f  |  初期設定ファイル(.bashrc)を実行しない |   
|  -l, -  |ログイン・シェルを使用してユーザーを切り替える  |  
| -m, -p |環境変数"HOME"，"USER"，"LOGNAME"，"SHELL"を変更しない |
| -c | ユーザ切り替え後、commnadを実行する |
| -s shell | 指定したシェルを実行する。 |
|--help  | ヘルプ |
|user[arg...]  | ログインするユーザを指定する |


###使用例
* * *

「管理者権限を見てみる。」

```bash:
# (e.g:vagrantユーザ → rootユーザ)
[vagrant@localhost ~]$ id
uid=500(vagrant) gid=500(vagrant) 所属グループ=500(vagrant) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[vagrant@localhost ~]$ whoami
vagrant

[vagrant@localhost ~]$ su // userを省略するとrootになります。
パスワード: vagrant
[root@localhost vagrant]/# id
uid=0(root) gid=0(root) 所属グループ=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@localhost vagrant]/# whoami
root
```

「 [ - ] の有無について」
「-」をつけた場合は、現在のシェルの環境変数をすべて解除し、その上で指定したユーザーとしてシェルを起動します。そして、カレントディレクトリをそのユーザーホームディレクトリとします。

```bash: 
# (e.g:vagrantユーザ → rootユーザ)

# 環境変数を作成
[vagrant@localhost ~]$ export SAMPLE=sample
[vagrant@localhost ~]$ echo $SAMPLE
sample
[vagrant@localhost ~]$ pwd
/home/vagrant // 現在のディレクトリ

#「-」なし
[vagrant@localhost ~]$ su
パスワード:

[root@localhost vagrant]/# echo $SAMPLE
sample  //環境変数が引き継がれている

[root@localhost vagrant]/# pwd
/home/vagrant // カレントディレクトリのまま

# 「-」あり
[vagrant@localhost ~]$ su -
パスワード:

[root@localhost ~]/# echo $SAMPLE

[root@localhost ~]/# pwd
/root // ホームディレクトリ
```

-cの使用例(ユーザ切り替え後、commnadを実行する)

```bash: 
# rootユーザで「test.txt」ファイルを作成してみる。
[vagrant@localhost ~]$ su -c 'touch test.txt; ls -la test.txt' -
パスワード:
-rw-r--r--. 1 root root 0 Jul  9 15:03 test.txt // rootユーザで作成されています。
[vagrant@localhost ~]$
```
Cent OS でユーザディレクトリ以下にある任意のフォルダ内のhtmlファイルを公開する手順

# 目的
Cent OSでユーザディレクトリ以下にある任意のフォルダ内のhtmlファイルを外部からアクセスできるようにする

# 環境
OS : CentOS 6.8 (Final)
httpd version :  Apache/2.2.15 (Unix)

# 前提
1. UserName : foo(root権限有)
2. ログインユーザ : foo
3. 公開したいディレクトリ : `/home/foo/bar`
4. 公開したいファイル : `/home/foo/bar/hoge.html`
5. ドメイン名 : example.com
6. `httpd`はインストール済

# 手順
## `"/etc/httpd/conf/httpd.conf`を編集
適当なエディタで以下のように編集
    
    (省略)
    <IFModule mod_user.c>
      UserDir disbaled
      UserDir enabled foo
      UserDir bar
    </IfModule>
    (省略)

## `/home/foo`以下にディレクトリ`bar`を作成
`$ mkdir ~/bar`

## `/home/foo/bar`以下に`hoge.html`を作成
適当なエディタで`hoge.html`を作成

    "hoge.html"  
    Welcome to hoge.html

##  `/home/bar`の権限を変更
`$ chmod 701 ~`

## SELINUXを無効化する
### 一時的に無効化する
  `$ sudo setenforce 0`
### 再起動時にも無効かされるように適当なエディタで`/etc/sysconfig/selinux`を以下のように編集

     (省略)
     #SELINUX=enforcing
     SELINUX=disabled
     (省略)

## `httpd`を再起動
`$ sudo /etc/init.d/httpd/restart`

## 確認方法
適当な端末よりブラウザから`http://example.com/~foo/hoge.html`にアクセス
Welcome to hoge.html　と表示されれば問題なし

# 追加情報
## indexページの追加とアクセスに関して
 `/home/bar`以下に`index.html`を作成した場合、
`http://example.com/~foo/`にアクセスすれば、
`index.html`の内容が表示される

## シンボリックリンクを利用してのアクセスする方法

1.  `~/bar`ディレクトリを作成
2.  `hoge.html`を作成する
3.  `/home/foo`のアクセス権を変更
`$ chmod 701 /home/foo`
4.  `/var/www/html/`以下にシンボリックリンクを貼る
`sudo ln -s ~/bar/hoge.html /var/www/html/hoge.html`
5. `http://example.com/hoge.html`にアクセス
GitLabがメモリ不足で遅いときの対処法

1GBメモリのマシン上にGitLabサイトを構築すると遅い場合がある。
(GitLabは4GBメモリ（または2GBメモリ+2GBスワップ）を推奨のよう ([参考](https://docs.gitlab.com/ce/install/requirements.html#memory)))
なるべくメモリを消費しないようにし、また極力スワップさせないことで
GitLabの応答速度を上げることができる。

```ruby:/etc/gitlab/gitlab.rb
unicorn["worker_processes"] = 1
postgresql["shared_buffers"] = "128MB"
```

ファイル編集後に `gitlab-ctl reconfigure` を実行

```:/proc/sys/vm/swappiness
5
```

ファイル編集後に `sysctl -p` を実行
Dir.mktmpdir が短縮ファイル名をブロックパラメーターにするのでエラい目にあった

Ruby で一時ディレクトリーを作るには tmpdir ライブラリーを require して，[`Dir.mktmpdir`](http://docs.ruby-lang.org/ja/2.3.0/method/Dir/s/mktmpdir.html) メソッドを使う。

基本は

```rb
require "tmpdir"

Dir.mktmpdir do |dirpath|
  # なんとかかんとか
end
```

の形。ブロックパラメーター `dirpath` には，文字どおり，作成された一時ディレクトリーのパスが渡されるので，ブロック内でそのパスに何かしたりできる。

ブロックの評価が終われば，一時ディレクトリーは自動的に削除されるので，後始末を考えなくていい。

しかし，Windows でちょっと困ったことが起こった。`dirpath` にはいわゆる「短いファイル名」形式のパスが渡されるのだ。

「短いファイル名」とは，[8.3形式](https://ja.wikipedia.org/wiki/8.3%E5%BD%A2%E5%BC%8F) しか使えなかった MS-DOS との互換性のために編み出された，本物のファイル名（パス中のディレクトリー名も含む）を無理やり 8.3 形式に落とし込んだもの。（微妙に間違ってたらごめん）

例えばディレクトリー名「Documents and settings」が「DOCUME~1」になったりする。Windows の Ruby では，どちらでアクセスしても構わない。

ところが面白いことに，そのパスを使って `Dir.glob` した結果は，「短いファイル名」形式でなく「長いファイル名」形式だ。

たとえば，

```rb
require "tmpdir"

Dir.mktmpdir do |dir|
  p dir
  IO.write(dir + "/foo.txt", "hoge")
  p Dir.glob(dir + "/*")
end
```

とやると，最初の `p` では短い形式，二番目の `p` では長い形式で表示される。

これの何が困るのか。
パス名を Pathname 化して [`relative_path_from`](http://docs.ruby-lang.org/ja/2.3.0/method/Pathname/i/relative_path_from.html) で一時ディレクトリーからの相対パスを得ようとしたとき，短い形式と長い形式では同じディレクトリーとみなしてくれないから `../../../../` みたいので始まる長ったらしいパスになる。

どうやって解決したのか。
`some_dir` が短い形式のディレクトリーパスだとして，

```rb
Dir.glob(some_dir).first
```

で長い形式に変換すればよいようだ。

なんかバカバカしい気もするけど，これよりマシな方法が思いつかない。
SlackとConfluenceを連携する方法

Atlassian User Groupでリーダー、オーガナイザーさせていただいている[@kajinari](https://twitter.com/kajinari)です。

SlackとConfluenceの連携方法について、調査していたところ、以下の方法でできましたので紹介したいと思います。　
＃標準機能ではできなかったので、ConfluenceのPluginを使っています。その前提でお読みくださいませ。

# 何を実現したかったのか
以下の様に、各スペース毎に任意のチャンネルに対して、Confluenceのページ作成されたら通知するようにしたかった。
![image](https://qiita-image-store.s3.amazonaws.com/0/45733/bf9921da-a7a8-b35d-16a4-da28c45cd6c1.png)



# 環境
* Confluence : Atlassian Cloud 
* Slack

# プラグインをさがす。
以下の2つのプラグインが該当しました。

* [Slack for Confluence Pro | Atlassian Marketplace](https://marketplace.atlassian.com/plugins/com.madein49.slack-for-confluence/cloud/overview)
* [Slack Connector for Confluence Server | Atlassian Marketplace](https://marketplace.atlassian.com/plugins/com.jsoft.plugins.confluence-slack/server/overview)

私の環境は、CloudバージョンのConfluenceですので、[Slack for Confluence Pro](https://marketplace.atlassian.com/plugins/com.madein49.slack-for-confluence/cloud/overview)を選択し、セットアップしました。

# インストールと全体設定

Market placeから該当のPluginを導入すると、以下の通り設定項目がでてきます。 "Slack for Confluence"をクリックしてセットアップを完了させましょう。

<img width="536" alt="slackintegration.png" src="https://qiita-image-store.s3.amazonaws.com/0/45733/efaf28b4-16d0-79da-2426-0d0aac5e0510.png">


設定必要な箇所は以下のとおりです。

### 基本設定

IncomingのWebhookをSlack側で準備しましょう。
**Webhook URL** にIncoming webhookのURLを設定しましょう。Slack側でChannelを指定させられると思いますが、どのChannelでも問題ありません。

<img width="1049" alt="slackintegration01.png" src="https://qiita-image-store.s3.amazonaws.com/0/45733/545791db-20d8-f98c-f546-5e2b4f1db2f7.png">

| 設定箇所 | 値 |
|:-:|:-:|
|Webhook URL|Slack側で準備したものをコピペ|
|Bot Name |もし修正したい場合に|
|Bot Icon URL|もし修正したい場合に|
|Notification Format  |もし修正したい場合に。|

### Global Notifications
ここでChannelを選択することもできますが、全てのConfluenceの変更が一つのChannelNotificationされてしまうので、一旦スキップしました。

## 各Confluence スペースでの設定
更新通知を行いたいConfluenceスペースに移動し、各Confluence側の**スペースツール**から**アドオン**をクリックする。
![image](https://qiita-image-store.s3.amazonaws.com/0/45733/f1949d5b-a089-72f4-c0ad-fb8fe9ae1893.png)

## 通知を行いたいチャンネルを指定する。　
通知を行いいたいチャンネルと、どの変更が加わった時に通知を送るのかをチェックする。
<img width="837" alt="slackintegration02.png" src="https://qiita-image-store.s3.amazonaws.com/0/45733/ea17b793-32e7-80c2-869f-a7534ca0ee1f.png">

ただし、ひとつのスペースで通知できるスペースはひとつのようです。
＃[Slack Connector for Confluence Server](https://marketplace.atlassian.com/plugins/com.jsoft.plugins.confluence-slack/server/overview)ではできるようです。

また、更新系やコメントなどのアクションに対して通知を行ったととしても、**Notification Format**が一緒なのであまり効果的ではなかったです。

# 通知結果
こんな感じに通知される様になりました。
![image](https://qiita-image-store.s3.amazonaws.com/0/45733/68625446-5cff-b8ee-6e4c-58ec73c1b020.png)

これで各スペース管理者が、自分のチームのチャンネルに通知設定できるようになりました。


参考になれば幸いです。

以上です。
Storyboard上で枠線関連の調整が可能なUIView


CALayer要素の調整をStoryboard上から行えるようにする。
下記クラスを使用することでそれが可能になる。


```
import UIKit

@IBDesignable class DesignableView: UIView {

    @IBInspectable var borderWidth: CGFloat = 0 {
        didSet {
            layer.borderWidth = borderWidth
        }
    }
    
    @IBInspectable var cornerRadius: CGFloat = 0 {
        didSet {
            layer.cornerRadius = self.frame.size.width/2
        }
    }
    
    @IBInspectable var borderColor: UIColor = UIColor.blackColor() {
        didSet {
            layer.borderColor = borderColor.CGColor
        }
    }

    
}

```


UI要素の調整はStoryboard上で行うほうが何かと便利。
Object#inspect は Encoding.default_external の影響を受ける

Ruby の `inspect` メソッドは Encoding.default_external の影響を受けるようだ。

まず，String オブジェクトがどんなバイト列になっているのかを調べるメソッドを定義しておく。

```rb
class String
  def byte_sequence
    bytes.map{|b| "%0X" % b}.join(" ")
  end
end
```

そのうえで，`default_external` を変えて文字列「`あ`」を `inspect` してみる。

```rb
Encoding.default_external = "UTF-8"
puts "あ".inspect.byte_sequence
#=> 22 E3 81 82 22

Encoding.default_external = "CP932"
puts "あ".inspect.byte_sequence
#=> 22 5C 75 33 30 34 32 22
```

それぞれの先頭と末尾にある 0x22 はダブルクオート `"` だ。

UTF-8 版で，ダブルクオートに囲まれた `E3 81 82` は　UTF-8 での `あ` のバイト列だ。

一方，CP932（いわゆる Windows 版 Shift JIS；「Windows 31J」ともいう）のほうは，`\u3042` の形になっている。

そういえば，確かに

```rb
p "あ"
```

とやったとき，UTF-8 だと「`"あ"`」と表示されるが，CP932 だと「`"\u3042"`」と表示されたりするよな。

`inspect` が `p` メソッドのためにある，と考えればこの仕様は理解できなくもない。

でも，こんな大事なことがリファレンスマニュアル

http://docs.ruby-lang.org/ja/2.3.0/method/Object/i/inspect.html
http://docs.ruby-lang.org/ja/2.3.0/method/String/i/inspect.html
http://docs.ruby-lang.org/ja/2.0.0/method/Regexp/i/inspect.html

のどこにも書いてない。

で，だ。`inspect` をデバッグなんか以外の目的で使いたいこともある。

今回のことに気づいたのも，ユーザーが入力した正規表現を HTML 形式のレポートの中に表示しようとして，`Regexp#to_s` だとイマイチなので `Regexp#inspect` にしたわけなのだが，日本語が混じってたときに `\u3042` みたいになってて「あれ？」と思ったんだ。
不要太信任驚嘆號 - 第三方函式庫使用的心得

最近因為專案需求的關係，用了 "iVersion" 這個第三方函式庫

我們的專案是使用 Swift 撰寫，而 iVersion 是一個 Objective-C 的函式庫

在實作 iVersion 的 delegate methods 的時候，這些 Objective-C protocol 中傳入的參數通常會被 Xcode 用 "implicit unwrapping" 這種方式呈現，如下：

``` swift
func iVersionVersionCheckDidFailWithError(error: NSError!) {
    // 對 error 做一些事情
}
```

因為太信任這個 `NSError!` 的關係，直接使用 error 這個物件造成正是環境的 App 在檢查版本失敗時多了一些 crash ：

<img width="100%" alt="スクリーンショット 2016-07-09 20.38.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/41979/da951adc-45e1-6a5e-7724-8844f950f32d.png">
*(紀錄來自 Crashlystic)*

一開始在看 log 的時候，本來還以為是 iVersion 的問題，打開 code 看到那個驚嘆後就知道發生了什麼事了 :neutral_face: 

而且 70% 以上的 crash 還是這個看起來不怎麼樣的問題造成的 :neutral_face: 

## 修改

以這個案例為例，如果要取用 error 的話，就使用 optional 的方式來使用

``` swift
func iVersionVersionCheckDidFailWithError(error: NSError!) {
    // 原本可能長這樣
    debugPrint(error.localizedDescription)
    // 就可以改成這樣
    debugPrint(error?.localizedDescription)
}

```

即使這個 error 物件非預期的以 nil 值傳入，在使用的時候也不會造成 crash 。

比較實用的情境就是，當要把這個 error 訊息送到 log 服務（如 GA 或 Crashlystic)的時候，就可以不會造成 crash 的送達了 :tada: 

## 結語

> 用 ! 在 runtime 是很危險的，

而且這個危險是無法挽回直接會 crash 的

多用 Optional Chaining `(?.)` 吧!
之前我也有對這個的感想寫過一篇文章： [對 Optional 和 Optional Chaining 的感想](http://qiita.com/vc7/items/35ada010b44007a93e52)
可以再一次參考看看 :stuck_out_tongue_winking_eye:
Arduino > シリアルプロッター > 複数データの表示 > スペース / タブ

```txt:動作環境
Arduino IDE 1.6.6 on Windows 8.1 pro 
```

Arduino IDEで使用できるシリアルプロッタ（参考: http://qiita.com/umi_kappa/items/632c02d5d749004619ef )。

複数データを表示できたらいいのに、と思っていたらできるようだ。

http://www.instructables.com/id/Ultimate-Guide-to-Adruino-Serial-Plotter/

```
Serial.print(temperature);
Serial.print(" ");
Serial.println(humidity);
```
>OR

```
Serial.print(temperature);
Serial.print("\t");
Serial.println(humidity); 
```

ただし、縦軸は共通になりそうなので、絶対値の大きく異るデータは見にくいだろう。

<hr>
(追記 2016/07/10)

上記を試したが、複数表示できない。
何か制限があるのだろうか。

Arduino IDE 1.6.6.
CentOS7 MariaDB(MySQL)インストール手順

今更感はありますが、CentOS7へのMariaDBインストールの手順を記載します。
CentOS7からはMySQLに変わってMariaDBが標準になっています。
基本的にMySQLとの互換はありますので、MySQLのコマンドや、MySQLWorkbenchも使えます。

# 前提
- CentOS7 インストール済み
- SSHにて実行

# 手順
## yumからインストール
```
yum install mariadb mariadb-server
rpm -qa | grep maria
```

## 文字コードの変更
```
vi /etc/my.cnf
```
```shell-session:my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
character-set-server=utf8

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
```

## サービスの起動
```
systemctl enable mariadb.service
systemctl start mariadb.service
```

## 初期設定
基本的には全てそのままでインストールしても問題ないと思います。
```
mysql_secure_installation
```

## データベース作成
```
create database testdb
```

## ユーザー追加
```
mysql -u root -p
[パスワード]を入力

# データベースtestdbに対して全ての権限を持ったユーザtestuser@localhostを登録
grant all on testdb.* to testuser@localhost identified by 'password';
```
RustでHello world

## 参考

* [How to install run and use Rust in windows 10 - help - The Rust Programming Language Forum](https://users.rust-lang.org/t/how-to-install-run-and-use-rust-in-windows-10/5345/15)

## windows

### download

https://www.rust-lang.org/en-US/downloads.html

`Visual C++ Build Tools`をインストール済みでない場合は以下を選択すること。

![gnu.png](https://qiita-image-store.s3.amazonaws.com/0/25728/6c0a3cbc-d86d-e16b-dffc-ae87bd8b5f88.png)

### ドキュメント

* [公式HP](https://www.rust-lang.org/en-US/documentation.html)
    * [日本語訳](https://github.com/ctjhoa/rust-learning/blob/master/ja_JP.md)

### コンパイル

```rust:main.rs
fn main() {
    println!("Hello, world!");
}
```

```bash:コンパイル
rustc main.rs
```

* main.exe : 1,697,363 バイト


### VC++版

> error: could not exec the linker `link.exe`: 指定されたファイルが見つかりません。 (os error 2)

というエラーが出たときは[visualcppbuildtools_full.exe](
http://go.microsoft.com/fwlink/?LinkId=691126)が別途必要

![vs.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c7ea9070-2f41-c627-bd12-72ce1f4739cd.png)

## Linux

```sh
apt install -y rustc
```

### cargoを使ってhello world

* cargo : Rust's package manager.
    * [数当てゲーム](http://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/guessing-game.html#%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)

```
cargo new prj1 --bin
```

* .gitや.gitignoreも一緒に用意される。
    * ソースは src/main.rs

![carg.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ecc36245-7712-417e-6605-4ecae7d8b1c3.png)

```
cargo build
```

* target/debug/prj1.exe

が生成される。直接exeを実行してもよいが、以下で実行できる。

```
cargo run
```



----

## 書式メモ

### sprintf的な

* [変数束縛](http://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/variable-bindings.html#%E6%9D%9F%E7%B8%9B%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%99%E3%82%8B)

```rust:main.rs
fn main() {
    let x: i32;
    x = 4;
    println!("The value of x is: {}", x);
}
```

### function

* [関数](http://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/functions.html)

```rust:main.rs
fn main() {
    print_number(5);
}

fn print_number(x: i32) {
    println!("x is: {}", x);
}
```
ライブラリを導入して出てきた"Command failed due to signal: Segmentation fault: 11"

# SVProgressHUDライブラリを導入したら出てきたエラー "Command failed due to signal: Segmentation fault: 11"

SVProgressHUDを自分のアプリで使おうと思ってライブラリを導入して
ビルドしたらエラーが出力されました。（他の人の環境ではうまくいったりと
現象としては謎でした）
とりあえず、以下のように設定したらうまくいったのでメモします。

## 環境
> Xcode 7.3.1<br>
> Swift version 2.2

## 対処法
 Xcode の Build Settings を編集します。

1. Build Settings を選択して「whole」と検索します。
![スクリーンショット 2016-07-09 20.04.15.png](https://qiita-image-store.s3.amazonaws.com/0/129549/73c650f6-a760-02b5-34fc-a0d3575cd9e5.png)


2. Swift Compiler - Code Generation セクションのOptimizationLevel
のDebug部分を「fast,Whole Module Optimization ~」に変更する
![スクリーンショット 2016-07-09 20.04.48.png](https://qiita-image-store.s3.amazonaws.com/0/129549/33457234-3844-595c-7ebd-ef44c57692d2.png)

![スクリーンショット 2016-07-09 20.05.15.png](https://qiita-image-store.s3.amazonaws.com/0/129549/4e74fc1d-7824-0261-0c84-f87fbd5a55d5.png)


 これでビルドしたらエラーが無くなりました。
BFGでコミット履歴から巨大なファイルに関する情報を消去する

GitHubにpushするには100Mのファイルサイズ制限があります。
過去に100M以上のファイルをコミットしていた場合、(たとえ最新のコミットではgitignoreしていても)怒られます。
BFGコマンドは過去の履歴をうまく消去してくれます。
`git-filter-branch`のかわりになるっぽい。
### 例えばgit pushでこんなメッセージが出た場合
```
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
remote: error: Trace: fce1986777f944a968512a9ef106a6a6
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File vendor/bundle/ruby/2.3.0/gems/libv8-3.16.14.15-x86_64-darwin-14/vendor/v8/out/x64.release/libv8_base.a is 152.64 MB; this exceeds GitHub's file size limit of 100.00 MB
```
### BFGコマンドのインストール
Macであればbrewで簡単に入ります。
`$brew install bfg`
### BFGコマンドの実行
過去のコミットを遡って特定サイズ以上のファイルを消去してくれるコマンドです。(この場合は100M以上)
`$bfg --strip-blobs-bigger-than 100M`
このコマンドで最新のコミットは何も変更されません。
あとはpushするだけ

### リンク
- [BFG Repo-Cleaner(公式)](https://rtyley.github.io/bfg-repo-cleaner/)
- [Removing files from a repository's history(GitHubヘルプ)](https://help.github.com/articles/removing-files-from-a-repository-s-history/)
- [Git still trying to push ignored and deleted file(stackoverflow)](http://stackoverflow.com/questions/33466466/git-still-trying-to-push-ignored-and-deleted-file)
- [BFGを使ってgitリポジトリから巨大なファイルを削除してみた(qiita)](http://qiita.com/aosho235/items/f944c0148a6fbe711a5a)
HTML5 で画像の figure caption（figcaption タグ）

こんにちは。
html5 で、画像に対して figure caption を付け、加えて画像の幅に対して折り返し・センタリングする方法を調べました[^1]。

[^1]: 参考「[HTMLで画像に説明(Caption)を付けるならfigureタグを使えばよかった](http://qiita.com/regonn/items/f7aeb77eb3c83679c532)」

```html
<figure style="text-align:center;display:table;width:1px;" >
<img src="http://qiita.com/icons/favicons/public/apple-touch-icon.png" width="120"/>
<figcaption style="font-size:small;">画像埋め込み　画像埋め込み</figcaption>
</figure>
```

<img width="269" alt="qiita.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/54617/15e4dbe1-08fe-2c23-111d-35bf76a1dd77.jpeg">
ActiveSupport::Notifications and Thread.current

http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html

http://railscasts.com/episodes/249-notifications-in-rails-3

http://web.archive.org/web/20150515174238/http://m.onkey.org/thread-safety-for-your-rails


https://github.com/rails/rails/blob/master/activesupport/lib/active_support/per_thread_registry.rb

https://github.com/rails/rails/blob/master/activesupport/lib/active_support/notifications.rb#L205-L208

https://github.com/rails/rails/blob/master/activesupport/lib/active_support/notifications.rb#L185-L188

https://github.com/rails/rails/blob/master/activesupport/lib/active_support/notifications.rb#L164

https://github.com/steveklabnik/request_store

```rb
class RequestRegistry
  extend ActiveSupport::PerThreadRegistry

  attr_accessor :current_user, :current_permissions
end

RequestRegistry.current_user = "user"
puts RequestRegistry.current_user
```

http://www.justinweiss.com/articles/better-globals-with-a-tiny-activesupport-module/
HerokuでPostgresの参照先を切り替える方法

# 想定ケース
- ステージング環境と開発環境がある状況において、テスト目的で開発環境からステージング環境のデータベースに接続するようなケース。

# ターゲット環境
- ステージング環境
    - app名=app-staging
    - Heroku Postgres add-onをインストール済み
- 開発環境
    - app名=app-dev
- 手元にはHeroku Toolbeltインストール済み

# 手順：開発環境にステージング環境のPostgresをアタッチ
- イメージ：開発環境にステージング環境のPostgresを繋ぐ作業

アタッチ

```
$ heroku addons:attach app-staging::DATABASE -a app-dev
Attaching postgresql-solid-12345 to app-dev... done
Setting HEROKU_POSTGRESQL_MAROON config vars and restarting app-dev... done
```

確認

```
$ heroku pg:info -a app-dev
=== HEROKU_POSTGRESQL_MAROON_URL
Plan:        Hobby-basic
Status:      Available
Connections: 0/20
PG Version:  9.5.2
Created:     2016-05-13 06:55 UTC
Data Size:   257.1 MB
Tables:      15
Rows:        697387/10000000 (In compliance)
Fork/Follow: Unsupported
Rollback:    Unsupported
Add-on:      postgresql-solid-12345
```

# 手順：アタッチしたデータベースをデフォルトデータベースにする
- 上記手順でアタッチした状態だと、環境変数`HEROKU_POSTGRESQL_MAROON_URL`にアクセス情報が設定されています。なお、この`MAROON`部分はCOLOR文字列でランダムに変化します。
- Herokuのアプリケーションは通常、環境変数`DATABASE_URL`にデータベースへのアクセス情報が設定されている前提で実装します。
- つまり、アタッチしたデータベースをデフォルトデータベースにするということは、`HEROKU_POSTGRESQL_MAROON_URL`の値を`DATABASE_URL`へコピーする、というイメージになります。
 
```
$ heroku pg:promote HEROKU_POSTGRESQL_MAROON_URL -a app-dev
Promoting postgresql-solid-12345 to DATABASE_URL on app-dev... done
```

確認

- `DATABASE_URL`へアタッチしたデータベースアクセス情報がセットされていることを確認できます。
- これで参照先データベースを切り替えることができました。

```
$ heroku config -a app-dev
=== app-dev Config Vars
DATABASE_URL:                 postgres://useruser:passpass@ec2-54-32-10-11.compute-1.amazonaws.com:5432/dbname
HEROKU_POSTGRESQL_MAROON_URL: postgres://useruser:passpass@ec2-54-32-10-11.compute-1.amazonaws.com:5432/dbname
(snip)
```

# 解除手順

アタッチの反対はデタッチです。

```
$ heroku addons:detach -a app-dev HEROKU_POSTGRESQL_MAROON_URL
```
Object <=> JSON 相互変換 on Ruby

# 何の記事？

RubyでObjectとJSONを相互変換する関数を書いてみました。

# 成果物
```ruby:json_obj_mapper.rb
# json文字列から指定したクラスのインスタンスを生成
def to_o(json, klass)
  a = klass.new

  JSON.parse(json).each do |k,v|
    if(a.respond_to?("set_"+k.to_s))
      a.send("set_"+k.to_s, v)
    end
  end

  a
end

# オブジェクトからJSON文字列を生成
def to_j(obj)
  hash = {}
  obj.class.instance_methods(false).grep(/get_.*/).each do |e|
    method_name = e.to_s
    key_name = method_name[4..-1]

    hash[key_name] = obj.send(method_name)
  end

  hash.to_json
end
```

# 使い方
```
irb(main):001:0> load './json_obj_mapper.rb'
=> true
irb(main):002:0> class A
irb(main):003:1> def initialize
irb(main):004:2> @x = 0
irb(main):005:2> @y = ""
irb(main):006:2> end
irb(main):007:1> def set_x(x)
irb(main):008:2> @x = x
irb(main):009:2> end
irb(main):010:1> def set_y(y)
irb(main):011:2> @y = y
irb(main):012:2> end
irb(main):013:1> def get_x
irb(main):014:2> @x
irb(main):015:2> end
irb(main):016:1> def get_y
irb(main):017:2> @y
irb(main):018:2> end
irb(main):019:1> end
=> :get_y
irb(main):020:0> to_o({"x"=>123, "y"=>"abc"}.to_json, A)
=> #<A:0x0000000322e298 @x=123, @y="abc">
irb(main):021:0> a = A.new
=> #<A:0x00000003226a48 @x=0, @y="">
irb(main):022:0> a.set_x(123)
=> 123
irb(main):023:0> a.set_y("abc")
=> "abc"
irb(main):024:0> to_j(a)
=> "{\"x\":123,\"y\":\"abc\"}"
irb(main):025:0> puts to_j(a)
{"x":123,"y":"abc"}
=> nil
irb(main):026:0>
```

* `to_o` : 第2引数で指定されたクラスのインスタンスを作ります。
`set_[JSONのキー文字列]`というメソッドを通して属性値をセットします。

* `to_j` : オブジェクトからJSON文字列を作ります。
`get_*`というメソッドからJSONのキーとオブジェクトの属性値を取得します。
Eclipse：新規ファイルにBOM(UTF-8)をつける


Eclipse で新規にファイルを作成すると Workspace に設定されたエンコードで保存されます。
文字エンコーディングを UTF-8 に設定した場合、新規にファイルを作成しても BOM は付きません。
そこで、BOM を付加するスクリプトを書きました。Ruby 版と Python 版があります。

## AddBom.rb

```ruby
#! /usr/bin/env ruby

path = ARGV[0]
puts "Add BOM to #{path}"
src = File.read(path)
bom = "\xEF\xBB\xBF"
if src.index(bom) == 0
	raise "BOM already exists"
end

File.open(path, "w") do |io|
	io << bom
	io << src
end
```

## AddBom.py

```python
# -*- coding:utf-8
import os
import sys

def main(path):
    f = open(path, mode='rb')
    data = f.read()
    f.close()

    utf8bom = "\xef\xbb\xbf"
    if len(data) >= 3:
        if data[0:3] == utf8bom:
            print "BOM already exists " + path
            return 0

    f = open(path, mode="wb")
    f.write(utf8bom)
    f.write(data)
    f.close()
    print "Add BOM to " + path
    return 0

if __name__ == '__main__':
    if len(sys.argv) < 2:
         print sys.argv
         print "addbom <path>"
         sys.exit(0)
    else:
        sys.exit(main(sys.argv[1]))
```

## eclipse に外部ツールとして登録する

メニューバーから `Run > External Tools > External Tools Configurations...` を選択します。
新規作成し、AddBom.rb もしくは AddBom.py を登録します。

### AddBom.rb の場合

 項目 | 設定
---|---
Name | AddBom
Location | ruby.exe のパス
Arguments | \<AddBom.rbのパス\> ${resource_loc}

### AddBom.py の場合

 項目 | 設定
---|---
Name | AddBom
Location | python.exe のパス
Arguments | \<AddBom.pyのパス\> ${resource_loc}

## 使い方

新規ファイルを作成し、そのファイルを開いた状態で AddBom を実行します。
BOM がなければ追加され、すでに追加されていれば何もしません。
また、空ファイルでなくても問題なく動作します。