OmniAICreator/Qiita-1.07M huggingface dataset:
MacにPythonのインストール


Pythonをインストールする前に準備することがあります。  

##Homebrew  
Homebrewをインストールします。  
rubyはMacOSにインストールされていますので、以下のコマンドをターミナルから実行します。  

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"  
```

インストール先を確認しましょう。  
$ which brew  
/usr/local/bin/brew  

Homebrewをアップデートするには以下のコマンドを実行します。  
$ brew update && brew upgrade  

##pyenv
次にPyenvをインストールします。これはPythonのバージョン管理ソフトウエアーです。
通常MacOSにはPython2.7がインストール済みですが、複数のバージョンのPythonを利用する場合には、このソフトウエアーを利用します。  
$ brew install pyenv  
その後、自分のホームディレクトリーにある.bash_profileを編集します。  
viで編集するか、  

```
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

以下のように.bash_profileに書き込みます。  

```
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
```

その後、  
$ source .bash_profile  
でリフレッシュします。  

これで、Pythonをインストールする準備は整いました。  
それでは、実際にインストールしてみましょう。
インストール可能なPythonの一覧は以下のコマンドで確認できます。 

``` 
$ pyenv install -l  
Available versions:  
  2.1.3  
  2.2.3  
  2.3.7  
```

特定のバージョンをインストールします。  
$ pyenv install 3.5.1   

インストールされたバージョンを確認します。  

```
$ pyenv versions  
* system (set by /Users/yoshi/.pyenv/version)  
  3.5.1  
```
実際アクティブにするバージョンを選択するには、  
$ pyenv global 3.5.1  
とします。確認してみると、 

``` 
$ pyenv versions  
  system  
* 3.5.1 (set by /Users/yoshi/.pyenv/version)  
のように*印が変更されています。  
```

これで3.5.1のバージョンをインストールできました。  
確認してみましょう。    
$ which python  
/Users/ユーザ名/.pyenv/shims/python  
自分のホームディレクトリーの.pyenvにインストールされています。  
それでは実際に起動してみます。  

```
$ python  
Python 3.5.1 (default, Jul  5 2016, 01:34:21)  
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.  
\>>>  
```
ラズパイ3　インストール

ラズパイ3とSDカード購入直後から、起動して日本語環境にするまで。

# SDカードの中身準備

## OSのインストーラー取得
[NOOBS](https://www.raspberrypi.org/downloads/noobs/)をDL。
lightでも数分かかるのでその間に次に進む。

## SDカードフォーマット
[SDカードフォーマッター](https://www.sdcard.org/jp/downloads/formatter_4/)をインストールしてフォーマットする。
適当にやってもOSインストール時になんだかんだFAT32にリサイズされてるっぽい。
※普通にWindows標準機能でフォーマットしてもOK。

## OSをSDにコピー
DLしたNOOBSを解凍してフォーマットしたSDに入れる

# ラズパイ起動

## 物理的な準備
1. SD入れる。
2. 有線のキーボード、マウスをラズパイに接続。
3. ディスプレイを接続。
4. （ここまでの順番はどうでもいい）
5. micro-USB繋げて電源ON

## NOOBS起動
電源ONしたら起動して、Wi-Fi接続しろと言われる
→SSID選択してPSK入力。
※ラズパイ3はWLAN入っています（[公式のラズパイ3スペック](https://www.raspberrypi.org/products/raspberry-pi-3-model-b/)：802.11n Wireless LAN）
OSが沢山出てくるので選ぶ。
→Ruspbian選択

## OSのインストール
結構時間かかる。
終わったら「成功したよ」と英語で言われる。
※画面下部に言語とキーボードのドロップダウンメニューが出る。日本語は文字化けするので今は変えない。
→完了すると再起動する。

## OS起動
画面右上のアイコンクリックしてもっかいWi-Fi設定する。

## SSH設定
最初からSSHはEnableされているっぽいのでIPだけ`ifconfig`で確認して接続する。
> もし設定されていなければ
> `sudo raspi-config`
> で、Advansed設定→SSHの設定→Enableで再起動すれば有効化できそう。

以下、リモート。

## 中身のアップデート
以下を実行。
`sudo apt-get update`
`sudo apt-get upgrade`
「続ける？」と聞かれたらYで。かなーり時間かかる。

## セキュリティ
@R-STYLEさんの[RaspberryPiをRaspbianで使う場合の初期設定メモ（ユーザ追加）](http://qiita.com/R-STYLE/items/b481ba2d695ddf8bcee4)参照

# 困ったこと
TeraTermでラズパイに接続してviしようとしたら、編集モードでEnterやBackSpace、Dell、矢印キーが使えない。文字は打てる。
github APIを使ってコマンドラインからリポジトリを作る

これだけ。

```
curl -u 'ユーザー名' https://api.github.com/user/repos -d '{"name":"リポジトリ名"}'
```

実行するとgithubのパスワードを聞かれるので、答えるとすぐに作られる。

## リポジトリ一覧を表示するには

```
curl -s https://api.github.com/users/ユーザー名/repos | jq -r ".[].full_name"
```
Mac OS X El CapitanにTensorFlow v0.11.0 RC1をインストール

# 概要
Mac OS X El Capitanに最新版のTensorFlowをインストール出来なかった。  

# 環境

でもこのPythonは使わない。

- Mac OS X El Capitan
- python v.2.7.10
- TensorFlow v0.11.0 RC1

# 一言でまとめると

デフォルトでインストールされているPythonやそこに入れたnumpyが邪魔してたのでPython 3を入れてPython 3でTensorFlowを動かした。

# 手順

方法が色々あるようですが、既存の環境を汚さない[Virtualenv installation](https://www.tensorflow.org/versions/r0.11/get_started/os_setup.html#virtualenv-installation)を使ってインストールしました。

### Python 3をインストール

```bash:prepare.sh
brew update
brew install python3
pip3 install --upgrade setuptools
pip3 install --upgrade pip
brew linkapps
pip3 install numpy
```
### インストールするURLを指定

[公式]((https://www.tensorflow.org/versions/r0.11/get_started/os_setup.html#virtualenv-installation))から`py2`を`py3`に帰る。

```bash:setUrl.sh
export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.11.0rc1-py3-none-any.whl
```

### インストールする

```bash:install.sh
pip3 install --upgrade $TF_BINARY_URL
```

### 仮想環境に入る。

```bash:activate.sh
source ~/tensorflow/bin/activate
```

## 動作確認

`python`ではなく`python3`を使う。

```py
python3

>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>>
```


### 使い終わったら環境を抜ける。

```bash:deactivate.sh
deactivate
```

# 参考
[Homebrewを使ってMacにPython3とかNumpyとかScipyとかをインストールする](http://hiho-developer.hatenablog.com/entry/20131221/1387564021)
DockerでRailsを起動させるときにはまったメモ

# 課題
docker-composeでrails + databaseのアプリケーションを起動すると、`rake db:create` `rake db:migrate` `rails s`を
実行しないといけないが、下記コマンドだと起動が失敗します。

```yaml
service:
  app:
    command: bundle exec rake db:create && bundle exec rake db:migrate && bundle exec rails s -p 3000
```

```
app_1         | rake aborted!
app_1         | OptionParser::AmbiguousOption: ambiguous option: -b
app_1         | /usr/local/bundle/gems/rake-11.3.0/exe/rake:27:in `<top (required)>'
```

# 解決策
docker-composeでのコマンドをshell経由で実行する

```yaml
service:
  app:
    command: ["/bin/bash", "-c", "bundle exec rake db:create && bundle exec rake db:migrate && bundle exec rails s -p 3000"]
```
Flycheckでnode_modules/.binを使う

# 動機

[Flycheck](http://www.flycheck.org/)で[ESLint](http://eslint.org)を使っていると、グローバルインストールされた `eslint` コマンドではなく、各プロジェクトにインストールされた `node_modules/.bin/eslint` を使いたくなるときがあります。

# 実現

`npm bin` コマンドの出力を `exec-path` に追加することで実現します（`npm bin` コマンドは普通、そのプロジェクトの `node_modules/.bin` の絶対パスを出力します）。
下記のEmacs Lispコードを `init.el` に追加してください。

```el:init.el
(defun my/use-node-modules-bin ()
  (let* ((local-path (replace-regexp-in-string
                      "[\r\n]+$" "" (shell-command-to-string "npm bin"))))
    (setq-local exec-path (cons local-path exec-path))))

(add-hook 'flycheck-mode-hook #'my/use-node-modules-bin)
```

# 別解（2017-10-25 追記）

[add-node-modules-path](https://melpa.org/#/add-node-modules-path) という素晴らしいパッケージを見つけましたので、これを使いましょう。
`exec-path` をバッファローカルに変更してくれます。

これでもう `flycheck-executable-find` をカスタマイズする必要はありません。

# 別解（2017-07-21 追記）

- `npm bin` は Node.js プロセスを立ち上げるので遅い ⇒ `node_modules` 固定で Emacs Lisp で実装する
- `exec-path` を更新するのではなく、Flycheck が提供する `flycheck-executable-find` 変数を使う

```el:init.el
(defun my/find-npm-command (command)
  (let* ((dirname "node_modules")
          (root (locate-dominating-file default-directory dirname)))
    (if root (concat
               (file-name-as-directory root)
               (file-name-as-directory dirname)
               (file-name-as-directory ".bin")
               command))))

(defun my/executable-find (command)
  (let* ((file-path (my/find-npm-command command)))
    (if (and file-path (file-executable-p file-path))
      file-path (executable-find command))))

(setq flycheck-executable-find #'my/executable-find)
```

# ~~最終解（2017-07-22 追記）~~ ⇒最終解ではないです :bow: 

これが一番シンプルな解（かも）。

[このQiitaの記事](http://qiita.com/Jxck_/items/8f5d1b70b7b5aa6053ee)にあるように、あらかじめ `PATH` を設定しておいて、

```sh
export PATH="./node_modules/.bin:${PATH}"

# Or
pathmunge ./node_modules/.bin
```

[`exec-path-from-shell`](https://github.com/purcell/exec-path-from-shell)を使って `PATH` を Emacs に読み込ませるようにすればよいです。

こうすることで、上記にあるような Flycheck への設定はすべて不要になります。

## セキュリティ上問題あり（2017-07-24 追記）

…と書きましたが、

```sh
export PATH="./node_modules/.bin:${PATH}"
```

は、

```sh
export PATH="${PATH}:./node_modules/.bin"
```

とするのが、セキュリティ上正しいです。

理由は、仮に `./node_modules/.bin/touch` というファイルが存在した場合、OSコマンドの `touch` をオーバーライドして悪意のあるコマンドを実行することができるからです。
（詳しくは :point_right: https://github.com/npm/npm/issues/957#issuecomment-237064313 ）

ただ `PATH` の一番最後に `./node_modules/.bin` を置いてしまうと、グローバルインストールした npm パッケージの方がローカルインストールしたパッケージより優先されてしまうという点が悩ましいです。 :sob:  

やはり Flycheck に設定した方が、影響範囲が限定されるので安全かもしれません。
Audioを停止（終了）させるには pause() → currentTime = 0;

タイトルどおり。

```js:js
var audio = document.getElementById('audio');

// 再生
audio.play();

// 停止
audio.pause();
audio.currentTime = 0;
```

初めてAudioタグで遊んでみて、
ボタンを押すごとに　**再生 → 停止 → （最初から）再生**
……と、別のイベントと一緒に効果音を出すというのをやってみたかった。

ググッて出てくる入門記事には `pause()` は当然あるけど、
一時停止じゃなくて、ちゃんと停止（次押したら最初から再生）させたかった。
`play()` があるんだから `stop()` くらいあるでしょって思ったけど動かない。

調べたら `pause()` してから再生時間を0に戻すという方法だった。
Audioタグについての入門記事には意外と載ってなかったりする。

## 参考

* [HTML5 Audio stop function - Stack Overflow](http://stackoverflow.com/questions/14834520/html5-audio-stop-function)
gym_torcsをubutnu16で動かすために

# 前書き
ubutnu16でgym_torcsを実行するための環境構築に苦労したので, 備忘録として残しておきます.
# gym_torcsとは
ググってください.

# gym_torcsをubutnu16で動かすために
gym_torcsを入れる前にまず, 以下の3つをインストールします.

```
sudo apt-get install xautomation
sudo pip3 install bumpy
sudo pip3 install gym
```

次に ugo-nama-kunさんのgitからgym_torcs_masterをダウンロードします.
https://github.com/ugo-nama-kun/gym_torcs

ダウンロード後に, 
gym_torcs/vtorcs-RL-color/src/modules/simu/simuv2/simu.cppの64行目を書き換えます.

```cpp:simu.cpp
if (isnan(car->ctrl->gear) || isinf(car->ctrl->gear)) car->ctrl->gear = 0;
```
```cpp:simu.cpp
if (isnan((float)(car->ctrl->gear)) || isinf((float)(car->ctrl->gear))) car->ctrl->gear = 0;
```


書き換えた後に, gym_torcs/vtorcs-RL-colorに移動し, ターミナルで以下のコマンドを入力します.

```
sudo apt-get install libglib2.0-dev  libgl1-mesa-dev libglu1-mesa-dev  freeglut3-dev  libplib-dev  libopenal-dev libalut-dev libxi-dev libxmu-dev libxrender-dev  libxrandr-dev libpng12-dev 
./configure
make
sudo make install
sudo make datainstall
```

ターミナルでtorcsと書き, 実行できれば成功です.


gym_torcs/vtorcs-RL-colorでsnakeoil3_gym.pyを実行することで, デモを見られます.
```python3 snakeoil3_gym.py
```

# 参考文献
http://www.jianshu.com/p/a3432c0e1ef2
https://research.preferred.jp/2016/05/
回転寿司4段活用

## 回転寿司Lv1
```html
<span class="fa fa-spin">:sushi:</span><span class="fa fa-spin">:sushi:</span><span class="fa fa-spin">:sushi:</span>
```
<span class="fa fa-spin">:sushi:</span><span class="fa fa-spin">:sushi:</span><span class="fa fa-spin">:sushi:</span>

## 回転寿司Lv2
```html
<span class="fa fa-spin">:sushi::sushi::sushi:</span>
```
<span class="fa fa-spin">:sushi::sushi::sushi:</span>


## 回転寿司Lv3

```html
<div>
<span class="fa fa-spin">:sushi:
<span class="fa fa-spin">:sushi:
<span class="fa fa-spin">:sushi:
<span class="fa fa-spin">:sushi:
<span class="fa fa-spin">:sushi:
<span class="fa fa-spin">:sushi:
</span></span></span></span></span>
</div>
```

<div>
<span class="fa fa-spin">:sushi:
<span class="fa fa-spin">:sushi:
<span class="fa fa-spin">:sushi:
<span class="fa fa-spin">:sushi:
<span class="fa fa-spin">:sushi:
<span class="fa fa-spin">:sushi:
</span></span></span></span></span>
</div>

## 回転寿司Lv4
```html
:moneybag: :moneybag: :moneybag: :moneybag: :moneybag: 
:sushi: :sushi: :sushi: :sushi: :sushi:
```

:moneybag: :moneybag: :moneybag: :moneybag: :moneybag: 
:sushi: :sushi: :sushi: :sushi: :sushi:

## 補足
FontAwesomeのfa-spinの事例としての技術記事ということでひとつ穏便に。
あと、元ネタは @hanachin_ さんです。

## :book: 参考資料
* [Font Awesomeで回転したいときfa-spinが便利 - hanachin_ - Qiita](http://qiita.com/hanachin_/items/e729dfd6a72b2c84842e)
* [Font Awesome](https://fortawesome.github.io/Font-Awesome/examples/)
Sublime Text でMarkdownのプレビュー方法（HTML編）

# Sublime TextでMarkdown形式のファイルのプレビュー方法（HTML編）
* Markdown形式が好きでよく使うのですが、作成した文章をチーム内や組織内に提出する際にHTMLに変換することがあります。
* また、自分用のメモであってもmd(テキスト）よりもHTML化しておいたほうが可読性があがることがあります。
* そのために利用しているプラグインの紹介

## 環境
* Windows 10 (64bit)
* 下記はインストール済みであること。
    * Sublime Text 3
    * package control

## Sublime Text 2/3 Markdown Preview
### インストール方法
* インストールするプラグイン
    * [GitHub](https://github.com/revolunet/sublimetext-markdown-preview)

1. `Ctrl` + `Shift` + `p` を押下し、`Package Control: Install Package` を選択します。
2. `Markdown Preview` を選択して、インストールします。

### 使い方
* `Ctrl` + `Shift` + `p` を押下し、Markdownを入力すると下記の3つが表示される。
    * Markdown Preview: Preview in Browser
        * 作成しているMarkdownファイルをHTML変換し、ブラウザに表示する。
    * Markdown Preview: Save to HTML
        * HTML変換してファイルを保存する
    * Markdown Preview: Copy to Clipboard
        * HTML変換したデータが、クリップボードに保存される。
* 上記の3つの中からいずれかを選択すると、下記の選択肢が出てくるので好きな方を選択する。  
二つの違いはCSSの違いとなる。
    * gitHub
    * markdown

### 個人的な使い方
* Markdown記法になれてくると、都度都度プレビューをしながら文書を作成する必要が薄れてくる。
* 一通り書いたあとで、`Markdown Preview: Preview in Browser` を利用してブラウザで文書の確認。
    * そして、誤字脱字があるので修正
* 確認が終わったら、`Markdown Preview: Save to HTML` を利用してHTML保存する。
vimの基本コマンド


[実践Vim](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Vim-%E6%80%9D%E8%80%83%E3%81%AE%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%81%A7%E7%B7%A8%E9%9B%86%E3%81%97%E3%82%88%E3%81%86%EF%BC%81-%E3%82%A2%E3%82%B9%E3%82%AD%E3%83%BC%E6%9B%B8%E7%B1%8D-%EF%BC%A4%EF%BD%92%EF%BD%85%EF%BD%97-%EF%BC%AE%EF%BD%85%EF%BD%89%EF%BD%8C-ebook/dp/B00HWLJI3U/ref=sr_1_1?ie=UTF8&qid=1477729215&sr=8-1&keywords=%E5%AE%9F%E8%B7%B5vim)からの個人メモ。随時更新。
※vimの操作方法の表記は上記の本と合わせている。

## ノーマルモード

### 指定した文字の場所に移動する

`f {char}`
	
`;`を押すと次の対象に移動する。`,`で戻る。	

### カーソルを合わせた単語を削除する

`cw`。削除後にインサートモードになる。

### 行末に移動する。

`$`。`A`だと移動後にインサートモードになる。
Xcode テーマのおすすめ設定〜自作してシンタックスハイライトをいい感じにする〜

# Xcodeのテーマ(カラースキーム)は何を設定してますか？

Xcodeにはデフォルトで何種類かのテーマがプリインされておりますが、さまざまなカスタムテーマも存在します。
上記のどちらかを使っている、という方がほとんどなのではないでしょうか？
この記事では、**それらのテーマにはない恩恵を受けるためのおすすめの設定**をご紹介します！

# デフォルトテーマやカスタムテーマの色分けは単純…
デフォルトおよび世に出ているカスタムテーマに共通している点が一つあります。
それは、XcodeのPreferenceのFonts and Colorsを見ても分かるように、**Source Editorの設定可能な項目数の割に使っている色のパターンがかなり少ないこと**です。
プリインテーマを使ってみた自分はこのように感じ、カスタムテーマに手を伸ばすもプリインと同様で、カラーパターンが少ないことに気づきます…
いいテーマないかなぁとその後も探しましたが、なかなか巡り会えず・・・

# 自作してみました:tada:
じゃあ作っちゃえばいいじゃんということで、自作してみました！
その名も「[Colorful Dark](https://github.com/ruwatana/Colorful-Dark)」 （見たまんまですねw）
これはXcodeのPreferenceのキャプチャ画面です。
プレビューを見てもプリインのものに比べるとかなりカラフルな配色になっているのがわかると思います！
<img alt="Colorful Dark" src="https://qiita-image-store.s3.amazonaws.com/0/128422/1b535cc0-28f0-3807-499e-4d99ba227c70.jpeg">

# 自作テーマと既存のテーマとの違いについて
割と自己満のために作った自作テーマでしたが、コード理解にとても効果がありました。

今回、自作したテーマでは、**「Project ~~」と「Other ~~」の色味を分けています**。
プリインテーマやカスタムテーマでは、ProjectとOtherは同一色が用いられています。
ちなみに、「Project　~~」はプロジェクトで作ったカスタムのメソッドやプロパティ、「Other ~~」はUIKitやFoundationなどの純正ライブラリに対してのシンタックスハイライトを表しています。

お気づきの方もいらっしゃるかもしれませんが、**プリインテーマではカスタムで作ったメソッドなのか、既存ライブラリのメソッドなのかが一目でわからない**わけです。

では、それが区別できるようになると何が嬉しいの？という話をしたいと思います。

# シンタックスハイライトの恩恵を最大限に受けられる
例えばプロジェクトに新規でジョインする際、既存のコードの全体把握をしながら開発するということは多々あると思います。
この際に配色が分かれていると、**プロジェクト内で作られたメソッドなのか、UIKitなどの既存ライブラリのものなのかが非常に直感的に理解する**ことができます。

iOSエンジニア歴の短い方ならなおさらです。Otherの配色になっているメソッドを見れば、「このクラスにはこういうメソッドがあるのか」といった気づきが得られるわけです。
さらに、プロパティやメソッド、enumのcaseなどの配色も分けておけば、それらも視覚的に判断がつくので、無駄にコードを読む必要もなくなるわけです。
trailing closureなどがコードに混ざってくると一見メソッドなのかプロパティなのかif文なのかわからなくなることがありますが、それもシンタックスハイライトのおかげで解決できるわけです。
extensionや自作クラスで既存ライブラリのプロパティやメソッドをoverrideした際は、Project側の配色になるため、「あ、このメソッドはoverrideされてるんだ」ということが、すぐにわかります。
この辺も非常に助かりますね:wink:

# 自作テーマ「Colorful Dark」の配色について
今回自作したテーマでは、Project（自作）のプロパティやクラス、メソッドは赤系統、Other（UIKitなど）は青系統に分けて作っています。
緑はコメント、予約語は紫です。
いかがでしょうか。クラスやメソッド、プロパティ、Enumのケースまでそれぞれの配色担っていることがわかると思います！
<img width="800" alt="スクリーンショット 2016-10-29 20.34.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/128422/51f778be-82d4-4f11-a263-4de35872f4bf.png">

# おわりに
ということで、Xcodeのテーマのおすすめ設定についてまとめました。
みなさんも、iOS開発には必須となっているXcodeですが、これを機にテーマの設定を見直してみてはいかがでしょうか。
自作するのが面倒だよという方がいらっしゃれば、まずは自分が作った「[Colorful Dark](https://github.com/ruwatana/Colorful-Dark)」を設定していただいて、効果を実感していただきたいです。（フィードバックをいただけますと、とても喜びます）

また、この自作テーマを作った後に知ったのですが、カスタムテーマで「[monokai-revisited](https://github.com/b0ti/xcode-monokai-revisited)」というのがあり、こちらも比較的多い配色を使っていてオススメです。

最後までお読みいただきありがとうございました:bow:
それでは、よいiOS開発ライフを:sun_with_face:

# リンク
* [今回自作したXcodeのテーマ「Colorful Dark」 - GitHub](https://github.com/ruwatana/Colorful-Dark)
* [Monokai Revisited Xcode Theme - GitHub](https://github.com/b0ti/xcode-monokai-revisited)
AdobeXDの知って得する使い方講座

ここではAdobeXDをどんな感じで使うのかをまとめていきます。
#そもそもAdobeXDってなんですか？
Android・iOS・PCのサイズでのサイトやアプリのデザインなどを行うプロトタイプ作成ツールになります。プロトタイプの動作を作ることも可能なのでとても重宝します。
<Font Color="red">現在はmacでのみ対応しています。</Font>
※CreativeCloudからダウンロードする形でインストールになります。
[詳しくはこちら！](http://www.adobe.com/jp/products/experience-design.html?sdid=19SCDRPN&mv=search&s_kwcid=AL!3085!3!154494514251!e!!g!!adobe%20xd&ef_id=VhnywwAAAeMWZwj2:20161029123058:s)
![スクリーンショット 2016-10-29 16.45.36.png](https://qiita-image-store.s3.amazonaws.com/0/34911/6af703da-b9fa-97da-a557-3fd4957984bd.png "スクリーンショット 2016-10-29 16.45.36.png")

##AdobeXDの機能説明
全体の感じはこんな形。
![スクリーンショット 2016-10-29 17.19.44.png](https://qiita-image-store.s3.amazonaws.com/0/34911/565e28d4-a348-a939-5067-685c94a80add.png "スクリーンショット 2016-10-29 17.19.44.png")

####各機能の機能の説明
<Font Color="red">基本的には囲い込みで領域を指定してそちらに画像をドラック&ドロップをする。</Font>
![スクリーンショット 2016-10-29 17.15.03.png](https://qiita-image-store.s3.amazonaws.com/0/34911/b410f91a-4951-1901-e731-3045ac242229.png "スクリーンショット 2016-10-29 17.15.03.png")

###便利な部分を紹介！
#####・1:囲い込みを編集して自由に編集！
青い点を追加することで吹き出しを作ったりすることも可能です。
![スクリーンショット 2016-10-29 20.53.52.png](https://qiita-image-store.s3.amazonaws.com/0/34911/9934b27b-13a4-a335-3679-ef836a182faa.png "スクリーンショット 2016-10-29 20.53.52.png")
![スクリーンショット 2016-10-29 20.57.08.png](https://qiita-image-store.s3.amazonaws.com/0/34911/f4d66ed4-e3e7-e553-f60b-5769ffbd01d6.png "スクリーンショット 2016-10-29 20.57.08.png")
#####・2:画像をドラッグアンドドロップで追加！
ドラッグアンドドロップでその枠の中に画像を注入することができます。
直感的に扱えるのがこのソフトウェアのいいところです！！
![スクリーンショット 2016-10-29 21.12.38.png](https://qiita-image-store.s3.amazonaws.com/0/34911/b10a3238-5343-7733-b7b6-5b11ccb0ff07.png "スクリーンショット 2016-10-29 21.12.38.png")
![スクリーンショット 2016-10-29 21.14.10.png](https://qiita-image-store.s3.amazonaws.com/0/34911/b41ec74c-963a-cd4d-710e-78fa8dfa5fae.png "スクリーンショット 2016-10-29 21.14.10.png")
#####・3:リピートグリッドを使うことで楽々同じデザインが作れる
リスト表示のデザインをリピートグリッド扱いにして設定することが可能になっています！余白も指定できるのもデザイナーでない人も使いやすいと思います。
2で説明した画像も複数選択で順番に設定することが可能です。
<Font Color="red">※Adobeのサイトから抜粋</Font>
![xd-grid-animation-375x500.gif](https://qiita-image-store.s3.amazonaws.com/0/34911/c39234a1-167d-36ad-3595-2112f85e96a9.gif "xd-grid-animation-375x500.gif")

######以上がAdobeXDの便利な方法についてです。
<Font Color="red">細かい利用方法はコメントください！！</Font>
詳しい利用方法なども紹介する予定です！！
少々お待ちください。
processingで中心からの角度を座標に変換したい

# やりたいこと

「真ん中からの角度だけ指定して、そこの座標を出したい」

・角度は数値で持ってるのに、それを表現できない
・時計とかをデザインしたい場合、角度の方が直感的に分かりやすかったりする

# やったこと

子供のころ数学でやったように、0°なら円の右側、90°なら真上という感じで角度に応じて座標を決める



***

`angle`に好きな角度（数値）を設定することができる
`radians()`と`cos()`、`sin()`を使って角度を座標に変換する

* 角度を400°にした場合は360を引いて40°のところに座標が決まる
* このプログラムでは角度に応じて左周りであり、角度をマイナスに設定すると右周りになる

```
color BG;

void setup() {
  size(600, 600);

  colorMode(HSB, 360, 100, 100);
  BG = color(0, 0, 5);
  background(BG);
  noStroke();
  frameRate(30);
}
  
void draw() {
  
  int angle;
  float x;
  float y;

  translate(width/2, height/2);
  pushMatrix();

  // 補助線
  noStroke();
  fill(60, 100, 100);
  ellipse(0, 0, 10, 10);
  
  // 中心点
  stroke(200, 0, 100);
  noFill();
  ellipse(0, 0, 400, 400);

  // 角度を座標に変換する
  angle = 60;
  x = cos(radians(angle));
  y = -1 * sin(radians(angle));
  translate(x * 200, y * 200); //適当に値を大きくする
  noStroke();
  fill(60, 100, 100);
  ellipse(0, 0, 20, 20);
  popMatrix();
}
```

`angle=60`で設定するとこんな感じになる

![60度.png](https://qiita-image-store.s3.amazonaws.com/0/142776/b7cafb82-6776-55aa-5723-1f5551c311ab.png)
grepに変わるツールをインストール


highway

他にも
sift, ag, pt などあるらしいが、[ここ](http://tkengo.github.io/blog/2015/10/19/release-highway/)によると highway良さげらしいので、highwayをしばらく使ってみようと思う。

macでは、

```shell
$ brew tap tkengo/highway
$ brew install highway
```

ではいるし。楽チン。


時々、難しいことやると落ちるけど、その時はgrep使うからまぁ困らない。
grepより圧倒的に早い！！！

--

文字列探索アルゴリズム

Boyer-Moore のアルゴリズムより、良いのがあるんですね。知らんかった。
上のblogによれば

```
その亜種としてさらに高速な Quick-Search というアルゴリズムも存在します。
```
だそうです。

[A simple fast hybrid pattern-matching algorithm](http://www.sciencedirect.com/science/article/pii/S1570866706001067)
そのうち読んでみたい。

取り急ぎ。
GitBucket のサインイン画面に適当なメッセージを表示する

ログイン前に案内とかの文章を表示したかったのでちょっとやってみたのをメモ。

System Settings の Information に以下の HTML (JavaScript) を入れると、signinページでだけ表示される。

```html
<script>
if (location.pathname.startsWith("/signin")) {
  $(".body").append('<p>Hello world</p>');
}
$(".close").click();
</script>
```

`.close` の `click`を呼ばないと空のボックスが表示されてかっこ悪いので追加。
ちょっと AJAX チックなことをやればサインインページでだけコンテンツを別の URL から読んでくるとかも出来るかな。
MeCabにユーザー辞書を追加する


# 環境
- MacOS 10.11 (El Capitan)
- pip install mecab-python でインストールしたMeCab


# 辞書を作成する

```bash
vi user_dic.csv

使い方,-1,-1,1,名詞,一般,*,*,*,*,*,*,*,mydic
取扱説明書,-1,-1,1,名詞,一般,*,*,*,*,*,*,*,mydic
...
```


# ユーザー辞書のコンパイル

```bash
$ /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index \
-d /usr/local/lib/mecab/dic/ipadic \
-u user.dic \
-f utf-8 \
-t utf-8 user.csv
```

- オプションの意味
 - -d DIR: システム辞書があるディレクトリ
 - -u FILE: FILE というユーザファイルを作成
 - -f charset: CSVの文字コード
 - -t charset: バイナリ辞書の文字コード

とのことなので、

```bash
/usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index \
-d /usr/local/lib/mecab/dic/ipadic \
-u user_dic.dic \
-f utf-8 \
-t utf-8 \
user_dic.csv 
```
user_dic.dicができた。

# 辞書の追加

```bash
vi /usr/local/etc/mecabrc

userdic = /Users/.../user_dic.dic
```
追加できた。


# 動作確認
```bash
$ mecab
取扱説明書
取扱説明書      名詞,一般,*,*,*,*,*,*,*,mydic
EOS
```
できたっぽい。


# その他
動詞の追加は面倒らしい。
http://www.mwsoft.jp/programming/nlp/mecab_dictionary_customize.html


# 参考

- [MeCab ユーザ辞書への単語追加](https://blog.apar.jp/linux/2748/)
- [mecabユーザ辞書を追加](http://qiita.com/takaheraw@github/items/286cdb27887bd00e2245)
- [MeCabにユーザ辞書を追加する](http://tseiya.hatenablog.com/entry/2012/09/19/191114)
- [タチコマ好きなエンジニアのブログ](http://yukihir0.hatenablog.jp/entry/20110201/1296565687)
OpenCVのドキュメントが充実している

OpenCVのドキュメントが不足しているなんて、いつの時代のことだ。
Tutorials for contrib modules　も含めてドキュメントが充実している。


**OpenCV3.1 / Related Pages**
http://docs.opencv.org/3.1.0/pages.html
http://docs.opencv.org/3.2.0/pages.html

**OpenCV/Examples**
http://docs.opencv.org/3.2.0/examples.html
コードのディレクトリ:
opencv/sources/samples/cpp

**OpenCV Tutorials**
http://docs.opencv.org/3.2.0/d9/df8/tutorial_root.html
Introduction to OpenCV
http://docs.opencv.org/3.2.0/df/d65/tutorial_table_of_content_introduction.html
Installation in Linux
http://docs.opencv.org/3.2.0/d7/d9f/tutorial_linux_install.html
Installation in Windows
http://docs.opencv.org/3.2.0/d3/d52/tutorial_windows_install.html
How to build applications with OpenCV inside the "Microsoft Visual Studio"
http://docs.opencv.org/3.2.0/d6/d8a/tutorial_windows_visual_studio_Opencv.html

Tutorials for contrib modules
http://docs.opencv.org/3.2.0/d3/d81/tutorial_contrib_root.html

コードのディレクトリ:
opencv/sources/samples/cpp/tutorial_code



**Face Recognition with OpenCV**
http://docs.opencv.org/3.1.0/da/d60/tutorial_face_main.html
http://docs.opencv.org/3.2.0/da/d60/tutorial_face_main.html

ライブラリが単に用意されているだけではなく。その手法がデータとアルゴリズムとの両面で解説されています。これを使えば、顔認証システムを開発することができるでしょう。



**Interactive Visual Debugging of Computer Vision applications**
http://docs.opencv.org/3.1.0/d7/dcf/tutorial_cvv_introduction.html
は、従来だったら自前でデバッグ用の画像をソースコードを書いて出力していたのを、
標準化したやりかたで実現できそうです。


**CUDA Module Introduction**
http://docs.opencv.org/3.1.0/d2/dbc/cuda_intro.html
GPU-Accelerated Computer Vision (cuda module)
http://docs.opencv.org/3.1.0/da/d2c/tutorial_table_of_content_gpu.html

--------------------------------------------------------------------------------
 記事を独立させました。
[opencv_contrib のコードをWindows 7 Visual Studio 2013でビルドする](http://qiita.com/nonbiri15/items/fd47a499052a18ab2d43)


-------------------------------------------------
付記：

CUDAの環境設定ははまる場合があるので
[Ubuntu CUDA で検索してみる](http://qiita.com/search?q=ubuntu+cuda)


Ubuntu14.04にNVIDIAドライバーをインストールしたらGUIログインできなくなったときの話
http://qiita.com/tanakatsu1080/items/c97c4ea3b1d349e2f718

UbuntuにCUDAを入れようとしたらハマった
http://qiita.com/bohemian916/items/a48e6496b04bbbf09fb3

これによれば、
対応方法「ubuntuでNouveauを無効にする方法」を実行して、

はまらないための方法
$ sudo sh cuda_<version>_linux.run
を実行する前に


```
 1. Perform the pre-installation actions.
 2. Disable the Nouveau drivers.
 3. Reboot into text mode (runlevel 3).
```

をすべきものらしい。
http://developer.download.nvidia.com/compute/cuda/7_0/Prod/doc/CUDA_Getting_Started_Linux.pdf


ここで「 2. Disable the Nouveau drivers.」には、OSごとに違いがあって、Ubuntuについては次の記述があった。

```
4.3.5. Ubuntu
 1. Create a file at /etc/modprobe.d/blacklist-nouveau.conf with the following
contents:
blacklist nouveau
options nouveau modeset=0
 2. Regenerate the kernel initramfs:
$ sudo update-initramfs -u
```
pandasを使って月ごとのキーワード出現回数の変化をグラフ化する


# 前提
([前回](http://qiita.com/urakarin/items/852e3dee5cc11ecf1678)と同じ)
ここにExcelファイルがある。
とあるDBから出力されたもので、１行１レコード、一つのフィールドには文章が格納されている。
また、各行には日付情報のフィールドもある。
今回のお題は、このフィールド内の文章内から指定されたキーワードを抜き出し、月ごとに出現回数がどのように変化しているかをプロットしてみよう、というもの。
入口と出口はWindowsのExcelファイルで、中間はMacで行う。

文字コード変換や、Excel変換等は前回と同じなので省略。

# 準備

pd.read()によりcsvを読み込んだものをdfとする。
要MeCab

```python
def group_by_month(df):
	e = df['comment']	#文章のあるフィールドを指定
	e.index = pd.to_datetime(df['datetime'])	# 日付情報をindexに指定する
	m = MeCab.Tagger('-Ochasen')	# 出力をChasenモードにする

	result_df = None
	for k, v in e.iteritems():
		if type(v) != unicode:
			continue
		target_dic = {		# 対象となるキーワードを指定する
			'XXX'			: 0,
			'YYY'			: 0,
			'ZZZ'			: 0,
		}
		s8 = v.encode('utf-8')
		node = m.parseToNode(s8)
		while node:
			word=node.feature.split(',')[0]
			key = node.surface
			if key in target_dic:
				target_dic[key] += 1	# 見つかればカウントを増やす
			node = node.next
		if result_df is None:
			result_df = pd.DataFrame(target_dic, index=[k])
		else:
			result_df = result_df.append(pd.DataFrame(target_dic, index=[k]))
	# 月ごとにgrouping
	result_df['index1'] = result_df.index
	result_df = result_df.groupby(pd.Grouper(key='index1', freq='M')).sum()
	# indexでは動かないぽいのでcolumnに入れる
	return result_df
```
毎回dictionaryを空にして出現回数を数え、DataFrameに変換して加える、ということをしている。
もっとシンプルにできそうな気がするが、やり方がわからない。

この時点でresult_dfには下記のようなデータが入る。

```
            XXX YYY ZZZ
index1                
2014-06-30   0   1   0
2014-07-31   0   6   0
2014-08-31   3  19   6
2014-09-30   1   8   0
2014-10-31   5  29   7
2014-11-30  10   8   0
2014-12-31  10  31   8
2015-01-31  12  41  15
2015-02-28  45  82  22
2015-03-31  21  58   9
2015-04-30  23  60  19
2015-05-31   4  36   3
2015-06-30  11  40   8
2015-07-31  13  49  11
2015-08-31   8  14   2
2015-09-30  13  13   9
2015-10-31   5  31   9
2015-11-30  11  21   3
2015-12-31  12  21   3
2016-01-31   2  19   0
2016-02-29  12  15   5
2016-03-31   9  32   7
2016-04-30   2  22   4
2016-05-31   6  24   2
2016-06-30   7  21   4
2016-07-31   9  22   4
2016-08-31   5  21   1
2016-09-30   7  31   6
2016-10-31   0  12   1
```

# プロット

```python
'''
	グラフ領域を準備する
'''
def plot_init(title):
	fig = plt.figure()
	ax = fig.add_subplot(1,1,1)
	ax.set_title(title)
	return fig, ax

'''
	プロットする
'''
def plot_count_of_day(df):
	title = 'test_data'
	fig, ax = plot_init(title)
	for c in df.columns:
		df[c].plot(label=c, ax=ax)
	ax.legend()
	ax.set(xlabel='month', ylabel='count')
```

# 結果
こんな感じ。

![test_data.png](https://qiita-image-store.s3.amazonaws.com/0/82958/da93fb2a-d1bc-f90c-2d65-1ece6c62ead7.png "test_data.png")


おわり。
PHPでデータベースに接続してみた。

#　自己紹介
皆さん初めまして。某学校で、ITの知識を勉強中の初心者プログラマーのわたのんです。将来はサーバサイドのエンジニアになるため、今精進しています。
以後お見知りおきを。得意言語はPHPです。今回はPHPでのデータベースの接続のやり方について書かせていただきます。
#データベース接続方法
データベースの接続には今回PDO（Php Data Object）というクラスを使います。
ほかにも関数を使って接続する方法もあるがPHPのバージョンが5.5以上になってくるとつかえないので、データベース接続時にはPDOを使うことをおすすめします。
書式は以下のとおり
*＄変数名＝new　PDO（"DBの種類：dbname=接続したいDB名;host=ホスト名;charset=文字のエンコード;","ID","pass"）*

```php:db.php
$dsn="mysql:dbname=sample_db;host=sample_host;charset=UTF-8";
$user="watanonn";
$pass="******";

try{
   $pdo=new PDO($dsn,$user,$pass);
}catch(PDOException $e){
   echo "接続失敗";
   die();
}
```
簡単に説明しちゃうと引数をすべて変数で管理し、try、catchで囲んだだけ。あとは書式通り。
チョー簡単！！因みにdie()関数は強制終了したいときに使います。
#データベースの値を取り出す(SELECT)
1.query()メソッドを使う方法
2.prepare()、execute()メソッドを使う方法

| メソッド | 意味 |
|:-------:|:----:|
|query()   |prepareを使わずに、SQL文を実行   |
|prepare()   | 値部分にパラメータをつけてSQL文実行待ち  |
|execute()   | 準備したprepareに入っているSQL文を実行  |
1.query()メソッドを使う方法

```php:db.php
$sql="SELECT 列名 FROM テーブル名";
$stmt=$pdo->query($sql);
while($data=$stmt->fetch()){
  echo "$data["取り出したい列の名前"]";
}
```
2.prepare()、execute()メソッドを使う方法

```php:db.php
$sql="SELECT 列名 FROM テーブル名 WHERE :id AND :pass";
$stmt=$pdo->prepare($sql);
$ret=$stmt->execute(array(
                    ":id"=>入れたい値,
                    ":pass"=>入れたい値
                   )); 
while($data=$stmt->fetch()){
  echo "$data["取り出したい列の名前"]";
}
```
#データベースの値を挿入(INSERT)
```php:db.php
$sql="INSERT INTO テーブル名(列名,・・・)　VALUES(:id,:pass) ";
$stmt=$pdo->prepare($sql);
$ret=$stmt->execute(array(
                    ":id"=>入れたい値,
                    ":pass"=>入れたい値
                   )); 
if($ret){
  echo "INSERT失敗";
  die();
}
```
※UPDATE文やDELETE文も同じことなので、省略。

#最後に
いかがでしたか？PHPでデータベースに接続する方法は:smiley:
これからも至らない点は多々あるかとは思いますがこれからもPHPについて投稿したいと思います。
間違っている点や改善点などありましたら連絡ください:bowtie:

#追記（2017-05-12）
##PDOの属性設定
###設定方法

    pdoのオブジェクト変数->setAttribute(属性の内容,属性の値);
**PDO::ATTR_ERRMODE**
     SQL実行でエラーが起こった際にどう処理するかを指定します．デフォルトは PDO::ERRMODE_SILENT です．

・PDO::ERRMODE_EXCEPTION を設定すると例外をスローしてくれる．これを選択しておくのが一番無難．

・PDO::ERRMODE_WARNING はSQLで発生したエラーをPHPのWarningとして報告する．

PDO::ERRMODE_SILENT は何も報告しない．
以後おすすめの例

```php:dp.php
$pdo->setAttribute(PDO::ATTR_ERRORMODE,PDO::ERRORMODE_EXCEPTION);
```
###おまけ

```php:dp.php
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
```
※プリぺアドステートメントを使うときは入れておこう(笑)
※いずれも、PDOクラスをインスタンス後に記述する

##feachの引数
・PDO::FETCH_BOTH
カラム番号とカラム名の両方をキーとする連想配列で取得する．
・PDO::FETCH_NUM
カラム番号をキーとする配列で取得する．
・PDO::FETCH_ASSOC
カラム名をキーとする連想配列で取得する．これが一番ポピュラーな設定．
・PDO::FETCH_OBJ
カラム名をプロパティとする基本オブジェクトで取得する．
Expressのルーティングを動的に追加する

今作っているシステムがプラグイン的にMVCをモジュールとしてパッケージングして自由に拡張できるようにしているのですが、特定のディレクトリ以下にある（階層構造可）ファイルを読み込むようにしています。

そこでこんな感じでルーティングを自動追加するようにしました。

```
var addRouter = (app, path) => {
  fs.readdir(path, (error, files) => {
    for (var i in files) {
      let dir = files[i];
      if (dir.indexOf('.') == 0) {
        continue;
      }
      if (fs.statSync(`${path}/${dir}`).isFile()) {
        continue;
      }
      if (fs.existsSync(`${path}/${dir}/index.js`)) {
        var lib = require(`${path}/${dir}`);
        let url_path = path.replace(`${__dirname}/modules`, "") + `/${dir}`;
        console.log("Add rountes", url_path)
        app.use(`${url_path}`, lib.router);
      }
      addRouter(app, `${path}/${dir}`);
    }
  });
}

addRouter(app, `${__dirname}/modules`);
```

addRouterを再帰的に実行して、 modules 以下にあるディレクトリに index.js があればそれをモジュールとして読み込みます。例えば users というディレクトリであれば、 /users というルーティングが使われます。 admin/users であっても同様です。全部非同期でやるとネストが深くなりそうだったので、一部Syncにしています…。
Expressの公開ディレクトリを追加する

今作っているシステムはプラグイン的にMVCを1つのモジュールとして配布できるのですが、モジュールによってはWebブラウザ向けのJavaScript/CSSも配布したいことがあります。

そこでExpressの公開ディレクトリを動的に追加します。

```
app.use('public2', express.static('modules_public_path'));
```

こうすると http://example.com/public2 も公開ディレクトリになります。後はこの中に index.js や index.css を作っていけば良いだけです。public2というのがキーになるので、同じ名前だと上書きしてしまうと思います。後、

```
app.use('/admin/public2', express.static('modules_public_path'));
```

みたいに階層も使えるので便利です。
Expressで動的にviewsを変更する

今作っているシステムで、プラグインのような形でMVCを一つのパッケージとして配布できるようにしているのですが、そのためにはビューのディレクトリをコントローラ側で動的に変更する必要がありました。

ということでやり方。

```
var express = require('express');
var router = express.Router();

router.all('*',  (req, res, next) => {
  req.app.set('views', __dirname + '/views/');
});
```

requestの中にappが入っているんですね。後はそれを動的にsetで変更してあげればOK。
python-firebase 1.2で認証でハマった件

# 概要
pythonでfirebaseのデータを取得して、加工したくなりました。
python-firebaseというライブラリがあったので使ったのですが、
FirebaseのDatabaseにアクセスする際に、認証する所でハマりました。

# 環境など
Mac OS Sierra 10.12.1
Python 2.7.12
python-firebase (1.2) https://github.com/ozgur/python-firebase

# インストール
マニュアルどおりに下記のコマンドを実行

```shell-session:MacOS_Terminal
$ sudo pip install requests
$ sudo pip install python-firebase
```

# ハマった所
## firebase.FirebaseAuthentication

「firebase.Authentication」と記載しているページ(https://pypi.python.org/pypi/python-firebase） があり、騙されました。昔そういう名前だったとか？
ただしくは「firebase.FirebaseAuthentication」です。

## THIS_IS_MY_SECRET
下記のマニュアル通りに行おうとしたところ、「THIS_IS_MY_SECRET」が、どれなのか迷いました。

<img width="939" alt="スクリーンショット 2016-10-29 19.50.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/94245/23628e3c-05eb-6ed0-125a-ae4693d84155.png">

ここから取得したら、うまく認証が通りました。
（「表示する」で出てきたシークレットをコピペ。）

![スクリーンショット 2016-10-29 20.07.56.png](https://qiita-image-store.s3.amazonaws.com/0/94245/a408a70c-bbb7-8126-f516-4a9ac4a72f12.png)

以上です。
大きいサイズのテキストファイルをソートする

## 普通はこう？

普通は以下の方法ですが、ファイルサイズ分のメモリを消費してしまいます。

```py
with open('/path/to/not-sorted-file', 'r') as fr:
    new_lines = sorted(fr.readlines()) # ファイルサイズ分メモリに展開

with open('/path/to/sorted-file', 'wb') as fw:
    fw.write(''.join(new_lines))
```

## 大きいサイズに対応する

関数を書きました。大体↓のような事をしてます。

1. ファイルを行毎に読む
2. 行毎に以下を取っておいて、1 listにまとめる
	* 各行のfile offset値
	* ソートの比較条件にする各行のsubstring
3. #2のlistをソートする
4. ファイル ``fr`` を開き直す
5. 書き込み様のファイル ``fw`` を開く
5. #3のlistをforeachし、ファイル ``fr`` の位置をfile offset値の箇所に移動する
6. ``line = fr.readline()`` する
7. ``fw.write(line)`` する

> この方法だと "substring x 行数" 分はメモリを消費してしまうのが、いただけないところ (;_;)

```py
import os
import uuid
import tempfile

def sort_large_file(filename, key=lambda l: l[:5]):
    '''
    sort large file without on-memory.

    :param str filename: abspath of file.
    :param function key: the function makes sort-key from a line.
    '''
    # ソート前ファイルを退避する.
    tmpname = os.path.join(tempfile.gettempdir(), 'sortlargefile_%s' % (uuid.uuid4().get_hex()))
    os.rename(filename, tmpname)

    # make a list of offsets.
    offset_list = []
    with open(tmpname, 'r') as fr:
        while True:
            offset = fr.tell()
            line = fr.readline()
            if not line:
                break

            keyword = key(line)
            offset_list.append((keyword, offset, ))

    # sort offsets.
    offset_list.sort(key=lambda e: e[0])

    # sort (write to new file).
    with open(filename, 'wb') as fw, open(tmpname, 'r') as fr:
        for keyword, offset in offset_list:
            fr.seek(offset)
            line = fr.readline()
            fw.write(line)

    # remove tmp.
    os.remove(tmpname)
```

## 実際に試してみる

以下の様に関数を呼びます。

* 第1引数はソート対象ファイルのパスです。
* 第2引数は「1行を引数にとって、ソートの比較条件になるsubstringを返す」関数です。
    * ここでは、CSV行の1列目の要素を切り出すlambdaを与えています。


```pycon
> sort_large_file('/path/to/your/file', lambda l: l[:l.find(',')])
```

↓もとのCSVです。

```csv
2016-10-01,apple,red
2016-09-29,orange,orange
2015-12-21,banana,yellow

```

> sort_large_file()関数は最終行にも改行が必要。

↓ソートされてこうなります。

```csv
2015-12-21,banana,yellow
2016-09-29,orange,orange
2016-10-01,apple,red

```
ソースからビルドしたPHP-FPMをインストールせずに使う

PHP本体にデバッグコードを埋めつつ、PHP-FPMの1プロセスが何個かのリクエストを処理するときの挙動を見たいような場合に、いちいち`make install`するのは大げさなので、その場で動かせるようにしてみたときの手順。下記はMacOSX 10.11上で行いました。

```
$ tar xvf php-7.0.12.tar.xz
$ cd php-7.0.12
$ brew install openssl libxml2
$ mkdir -p etc/conf.d etc/php-fpm.d var/log var/run
$ ln -s ../php.ini-development etc/php.ini
$ ln -s ../sapi/fpm/php-fpm.conf etc/php-fpm.conf
$ ln -s ../../sapi/fpm/www.conf etc/php-fpm.d
$ CFLAGS="-O0 -g" ./configure --with-openssl=$(brew --prefix openssl) --with-libxml-dir=$(brew --prefix libxml2) --without-pear --with-gd --enable-sockets --with-jpeg-dir=/usr --with-png-dir=/usr --enable-exif --enable-zip --with-zlib --with-zlib-dir=/usr --with-kerberos --with-mcrypt=/usr --enable-soap --enable-xmlreader --with-xsl --enable-ftp --enable-cgi --with-curl=/usr --with-tidy --with-xmlrpc --enable-sysvsem --enable-sysvshm --enable-shmop --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-pdo-sqlite --enable-pcntl --with-libedit --enable-mbstring --disable-debug --enable-fpm --enable-bcmath --prefix="$(pwd)" --with-config-file-path="$(pwd)/etc" --with-config-file-scan-dir="$(pwd)/etc/conf.d"
$ make -j4
$ sapi/fpm/php-fpm
```

これでPHP-FPMが9000番ポートで待ち受けるようになるので、nginxの設定をよしなにやればブラウザからPHP-FPMにアクセスできるようになります。個人的には便利。

# 標準エラー出力をログに吐く

`www.conf`で次のように設定すると、PHP本体から標準エラー出力に書いた内容がログファイル`var/log/php-fpm.log`に出力されます。

```:www.conf
catch_workers_output = yes
```

PHP本体に雑に`fprintf(stderr, "...")`と書くだけでデバッグ出力が確認できて楽です。

`./configure`する前であれば、Autoconfのテンプレートファイルである`www.conf.in`の方を修正した方がいいかもしれません。

# graceful restart

`php-fpm.conf`で次の行のコメントアウトを外してpidをファイル化しておきます。

```:php-fpm.conf
pid = run/php-fpm.pid
```

こちらもやはりテンプレートファイル`php-fpm.conf.in`を修正した方が面倒がないかもしれませんね。

こうすることで、PHP本体のコードを修正して`make`してPHP-FPMをリスタートするのが楽になります。

```
$ kill -USR2 $(cat var/run/php-fpm.pid)
```
Python > def main(argv=None): > 引数を無視する?

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

TensorFlowというDeep Learningのフレームワークを学習中。

TensorFlowを遊び倒す！ 4-1. Convolutional Neural Networks
http://blog.brainpad.co.jp/entry/2016/04/22/170000

https://www.tensorflow.org/versions/master/tutorials/deep_cnn/index.html

CIFAR-10のデータセットを処理するTutorialを読んでいる。

これまで読んできたpythonコードは主に以下のものだった。

```mnist_with_summaries.py
def main(_):
  if tf.gfile.Exists(FLAGS.summaries_dir):
    tf.gfile.DeleteRecursively(FLAGS.summaries_dir)
  tf.gfile.MakeDirs(FLAGS.summaries_dir)
  train()
```

cifar10_train.pyのmain()の定義は以下になっている。

```cifar10_train.py
...
def main(argv=None):  # pylint: disable=unused-argument
  cifar10.maybe_download_and_extract()
  if tf.gfile.Exists(FLAGS.train_dir):
    tf.gfile.DeleteRecursively(FLAGS.train_dir)
  tf.gfile.MakeDirs(FLAGS.train_dir)
  train()
...
```

main()の定義において`argv=None`という記載ができるようだ。

関連 http://www.artima.com/weblogs/viewpost.jsp?thread=4829
> First, we change main() to take an optional 'argv' argument, which allows us to call it from the interactive Python prompt:

```py
def main(argv=None):
    if argv is None:
        argv = sys.argv
    # etc., replacing sys.argv with argv in the getopt() call.
```

>Note that we fill in the default for argv dynamically. This is more flexible than writing

```
def main(argv=sys.argv):
    # etc.
```
リカバリーディスク無しに Windows 10 を再インストールする

諸事情[^1]によって Windows 10 を再インストールしないといけない状況に追い込まれました。

リカバリーディスクが無い場合にWindows10を再インストールする手順を紹介します。

必要なものは8GB以上のUSBメモリと、起動できるWindowsのPCです。

# 手順

1. Windows 10 のディスク イメージ (ISO ファイル) のダウンロードする
2. ISOをUSBメモリに書き込む
3. USBメモリからブートする
4. 再インストール

## Windows 10 のディスク イメージ (ISO ファイル) のダウンロードする

Microsoftの公式ページから Windows 10 のISOイメージをダウンロードできます。

[Windows 10 のディスク イメージ (ISO ファイル) のダウンロード)](https://www.microsoft.com/ja-jp/software-download/windows10ISO)

## ISOをUSBメモリに書き込む

ISOイメージをUSBメモリに焼くために Rufus という Windows のソフトウェアを利用しました。
ファイルシステムはNTFSを選択し、ブートディスクを作るを有効にしました。

http://rufus.akeo.ie/

最初は Mac から ddコマンドを使ってISOをUSBに書き込んだのですが、ファイルシステムがUDFとなってしまって、諦めました。予備のWindowsのPCを持っていて助かりました。

## USBメモリからブートする

機種や BIOS/UEFI の設定によってブートローダを表示する方法は色々です。

ドスパラで買ったデスクトップPCでは、起動時にF8を連打することで、ブートローダを表示してUSBメモリから起動することができました。

USBメモリからブートすると、OSの再インストールの画面になるので、画面の指示に従って再インストールすればOKです。

[^1]: Windows10 Inside Previewの「ビルドが期限切れになります」というのを放置していたら、ついに起動しなくなりました。UEFIの設定から過去の日付に変更することで起動はできるものの、ビルドが期限切れていて Windows Update も使えない状態でした。自動修復モードからのWindowsの再インストールを試しましたが、再インストール後も期限切れのビルドのInside Previewが入ってしまい、問題が解決しませんでした。
Python > print時の書式指定`%` > "%s %s" % ('Hello', 'World',)

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

TensorFlowというDeep Learningのフレームワークを学習中。

TensorFlowを遊び倒す！ 4-1. Convolutional Neural Networks
http://blog.brainpad.co.jp/entry/2016/04/22/170000

https://www.tensorflow.org/versions/master/tutorials/deep_cnn/index.html

CIFAR-10のデータセットを処理するTutorialを読んでいる。

```cifar10_train.py
...
        format_str = ('%s: step %d, loss = %.2f (%.1f examples/sec; %.3f '
                      'sec/batch)')
        print (format_str % (datetime.now(), step, loss_value,
                             examples_per_sec, sec_per_batch))
...
```

print時の書式指定に`%`を使うようだ。
http://postd.cc/new-string-formatting-in-python/
Python > assert not np.isnan(loss_value), 'Model diverged with loss = NaN'

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

TensorFlowというDeep Learningのフレームワークを学習中。

TensorFlowを遊び倒す！ 4-1. Convolutional Neural Networks
http://blog.brainpad.co.jp/entry/2016/04/22/170000

CIFAR-10のデータセットを処理するTutorialを読んでいる。

cifar10_train.pyの以下のassert not np.isnan()の記載は未消化だった。

```cifar10_train.py
...
    for step in xrange(FLAGS.max_steps):
      start_time = time.time()
      _, loss_value = sess.run([train_op, loss])
      duration = time.time() - start_time

      assert not np.isnan(loss_value), 'Model diverged with loss = NaN'
...
```

loss_valueがNaNになった時にエラーとなるようにするようだ。

https://docs.scipy.org/doc/numpy/reference/generated/numpy.isnan.html
http://docs.python.jp/2.4/ref/assert.html
TensorFlow > GPUはあるけどメモリ制約の関係で使わない方法 > CUDA_VISIBLE_DEVICES=-1 python cifar10_train.py

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

TensorFlowを遊び倒す！ 4-1. Convolutional Neural Networks
http://blog.brainpad.co.jp/entry/2016/04/22/170000

CIFAR-10のデータセットを処理するTutorialを学習中。

http://qiita.com/7of9/items/b8286880b483f6468e27
においてGPU(GeForce GTX 750 Ti: 2GB)では`cifar10_train.py`と`cifar10_eval.py`を同時実行はできないことがわかった。

CPU動作にしようとしてが、関連pythonファイルを変更してもうまくCPU動作にできなかった。

以下を見つけた。
[TensorflowでGPUを制限・無効化する](http://qiita.com/kikusumk3/items/907565559739376076b9#%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%82%92%E5%88%B6%E9%99%90%E3%81%99%E3%82%8B)
> http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#env-var
CUDAには環境変数CUDA_​VISIBLE_​DEVICESを用いてプログラムが利用できるGPUを制限する機能があります．

```
# GPU: 0だけ使う
$ CUDA_​VISIBLE_​DEVICES=0 python test_gpu.py
```

CPUだけ使うにはどうすればいいかわからないが、以下をやってみた。

```
$ CUDA_​VISIBLE_​DEVICES=-1 python cifar10_train.py
```

CPU動作になったようだ。これで`python cifar10_eval.py`を実行すると正常動作するようになった。

<font color=red>ただし上記の方法はただの思いつきなので、正式な方法ではないかもしれない。</font>

関連 http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#env-vars

### こちらのほうがいい

trainはGPUで動かす。

```
$ python cifar10_train.py
```

evalをCPUで動かす。

```
$  CUDA_VISIBLE_DEVICES=-1 cifar10_eval.py
```
サポートの終了した Ubuntu 10.04 から 12.04 にアップデートする

2015年4月にサポートが切れた Ubuntu 10.04 LTS をアップデートしようとしたら、いくつかの問題が発生しました。同じような問題に陥った人のためにメモを残します。

# 通常の Ubuntu のアップデート手順
サポート期間中のUbuntuの通常のアップデート手順です。

```
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install update-manager-core
sudo do-release-upgrade
```

サポート期間が過ぎていると、`sudo apt-get update` と `sudo do-release-upgrade` が失敗しました。

# サポート期間外のために apt-get update できない
上記の手順を実施したところ、そもそも `apt-get update` ができませんでした。

```
$ apt-get update
# ・・・中略・・・
エラー http://archive.ubuntu.com lucid-security/main Packages
  404  Not Found [IP: 2001:67c:1360:8001::21 80]
# ・・・中略・・・

W: http://archive.ubuntu.com/ubuntu/dists/lucid-updates/main/binary-i386/Packages.gz の取得に失敗しました  404  Not Found [IP: 2001:67c:1360:8001::21 80]

E: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。

```

## 対処方法
`/etc/apt/sources.list` の `archive.ubuntu.com` を `old-releases.ubuntu.com` に置換しました。

```
$ vim /etc/apt/sources.list   # s/archive/old-releases/g に置換
```

これで、`apt-get update` できるようになりました。


# do-release-upgrade がパッケージ認証のエラーで失敗する

`do-release-upgrade` がパッケージ認証のエラーで失敗しました。

```
$ sudo do-release-upgrade

# ・・・中略・・・

パッケージの認証において、エラーがありました


いくつかのパッケージが認証できませんでした。これは一時的なネットワークの問題かもしれません。あとで再び試してみてください。以下に認証できなかったパッケージのリストが表示されます。
# ・・・中略・・・

システムを元に戻しています

中断します
Reading package lists... Done
Building dependency tree
Reading state information... Done
Building data structures... Done
=== Command detached from window (Fri Oct 28 11:44:15 2016) ===
=== Command terminated with exit status 1 (Fri Oct 28 11:44:15 2016) ===
WARNING:root:estimate_kernel_size_in_boot() returned '0'?
# ・・・中略・・・
```

## 対処方法

`/etc/update-manager/release-upgrades.d/unauth.cfg` というファイルを次の内容で作成することで、中断されなくなりました。

```
[Distro]
AllowUnauthenticated=yes
```

# 参考
- [Ubuntu：apt-get updateでエラー（404 Not Found）が出たときの対処法](http://webkaru.net/linux/ubuntu-apt-get-update-error/)
- [upgrading Ubuntu 10.04 to 12.04 error authenticating some packages](http://sysadm.mielnet.pl/upgrading-ubuntu-10-04-to-12-04-error-authenticating-some-packages/)
tweepyでtwitterのリスト周りを触る

こんにちは、[@yushun_o](https://twitter.com/yushun_o)です。
[yushun.me](http://www.yushun.me)でソフト公開してます。よかったら見てください。
最近tweepyを使って遊んでいたのですが、思ったよりtwitterのリスト周りの日本語の情報が少なくて困ってしまったので、自分の使いそうなところをまとめておきました。
念のため環境を書いておきます。
```Mac OS X Yosemite
Python 3.5.2
```

##準備
`pip install tweepy`
でtweepyをインストール

https://apps.twitter.com/
ここで"Create New App"してCONSUMER_KEY等々を取得

```myauth.py
# -*- coding:utf-8 -*-
import tweepy

CONSUMER_KEY = "xxx"
CONSUMER_SECRET = "xxx"
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
ACCESS_TOKEN = "xxx"
ACCESS_SECRET = "xxx"
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)
```
これで`from myauth import api`でapiがいつでも呼び出せます。


##tweepyでリストを触る
さっそく、今回の本題であるtwitterのリスト周りを触っていきます。
###リストの作成/削除
```create_destory_list.py
from myauth import api
screen_name="" #リスト作成者の@~~の~~
listname="" #リストの名前
api.destroy_list(owner_screen_name=screen_name,slug=listname)  #slug...リスト名が日本語のときは注意*1
api.create_list(name="作りたいリストの名前",mode="public",description="説明") #modeは、"public"か"private"で公開、非公開を選べる
```
*1..."mylist"という名前のリストを作成した場合は、そのままslug="mylist"となりますが、"マイリスト"という名前のリストを作成した場合は、slug="list○"という風になってしまいます。対処法は後述します。
###リスト一覧を取得
```get_all_list.py
from myauth import api
screen_name="" #リスト作成者の@~~の~~
for twilist in api.lists_all(screen_name=screen_name):
    print("slug="+twilist.slug)
    print("name="+twilist.name)
```
各Listクラスのslugとnameを出力してます。
僕は、日本語の名前のリストのときslugを特定する方法をこれしか知りません。(ご存知の方いたら教えてください。)
tweepyでリストを扱うときは、リストの名前を英語にすることをおすすめします。
###リストのユーザーを取得
最後にリストに追加されてるユーザーを取得する方法です。tweepyのCursorクラスを使って取得します。

```get_member_of_list.py
from myauth import api
screen_name="" #リスト作成者の@~~の~~
listname="" #リストの名前
for member in tweepy.Cursor(api.list_members,slug=listname,owner_screen_name=screen_name).items():
    print(member.screen_name)
```
##おわりに
注意するところは、slugの部分くらいだったと思います。
list周りの全てを触れることはできてないので、この記事で足りなければ本家(github)を参考にしてください。
https://github.com/tweepy/tweepy/blob/master/tweepy/api.py
拙い記事でしたが、**tweepyはほんとに使いやすい**ので、ぜひ皆さん使ってみてください。
"Ynaqdh"の意味

ずっと下書きに眠っていた。

```
Overwrite xxx/xxx/xxx.rb? (enter "h" for help) [Ynaqdh]
```

| 文字 | 英語 | 日本語 |
|:--:|:--:|:--:|
| Y | yes, overwrite | 上書き |
| n | no, do not overwrite | 上書きしない |
| a | all, overwrite this and all others | すべて上書き |
| q | quit, abort | やめる |
| d | diff, show the differences between the old and the new | 差分を確認 |
| h | help, show this help | ヘルプ |
[Swift]でLabelの一部をリンク化させる方法

# SwiftでUILabelの先頭の文字をリンク化させて見ました

UILabelで一部リンク化させたいなと思ったのですが、ライブラリを使うのは嫌なのでちょっと調べて見ました。

環境
Xcode8
Swift3

### 実装

```.swift
class ViewController: UIViewController {

    @IBOutlet weak var helloLabel: UILabel!
    
    let linkText = "Hello"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        helloLabel.isUserInteractionEnabled = true
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapGesture))
        helloLabel.addGestureRecognizer(tapGestureRecognizer)
        
        // リンク化させる場所を青くさせる。
        let string = helloLabel!.text!
        let range = (string as NSString).range(of: linkText)
        let attributedString = NSMutableAttributedString(string: string)
        attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.blue, range: range)
        helloLabel.attributedText = attributedString
    }
    
    func tapGesture(gestureRecognizer: UITapGestureRecognizer) {
        guard let text = helloLabel.text else { return }
        let touchPoint = gestureRecognizer.location(in: helloLabel)
        let textStorage = NSTextStorage(attributedString: NSAttributedString(string: linkText))
        let layoutManager = NSLayoutManager()
        textStorage.addLayoutManager(layoutManager)
        let textContainer = NSTextContainer(size: helloLabel.frame.size)
        layoutManager.addTextContainer(textContainer)
        textContainer.lineFragmentPadding = 0
        let toRange = (text as NSString).range(of: linkText)
        let glyphRange = layoutManager.glyphRange(forCharacterRange: toRange, actualCharacterRange: nil)
        let glyphRect = layoutManager.boundingRect(forGlyphRange: glyphRange, in: textContainer)
        if glyphRect.contains(touchPoint) {
            print("Tapped")
        }
    }
}
```

これだけでlinkText内の任意の文字列をリンク化させることができます。

<img width="320" alt="Simulator Screen Shot 2016.10.29 18.28.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/137474/e32c3054-bb5b-5662-b28e-f302a3bf7a09.png">

こんな感じになりました。(きもいですね)