OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel artisanコマンドメモ


よく使うLaravel artisanコマンドメモ。artisanはアルチザンと読むらしい。

##使い方を調べる

###コマンド一覧

どんなコマンドがあるか。
バージョンアップで仕様が変わったりするので、たまに眺めてみる。

```bash
php artisan list
```

###ヘルプを表示

コマンドの-hをつける(--helpでも)。

```bash
php artisan make:controller -h
```

##代表コマンド

###ルートの確認

設定されているrouteの確認。自動生成される場合もあるので、たまに眺めてみる。

```bash
php artisan route:list
```


###モデルの作成

モデル雛形の作成。昔はmigrateファイルも生成されてうざかったが、今は別途作成となった。

```bash
php artisan make:model Admin
```

###マイグレーションの作成

作成するときは事実上、テーブルを作成するので--create=<table_name>オプションを使う。

ファイル名の頭には日次が付与される。下記例だと、2015_12_31_003428_create_admins_table.phpなどとなる。

```bash
php artisan make:migration create_admins_table --create=admins
```

###マイグレーションの実行

マイグレーションの実行。

```bash
php artisan migrate
```

###マイグレーションの再実行

一度実行されたmigrateファイルは基本実行されない。再度実行する際は、resetやrefresh等を組み合わせて使う。他にrollbackなどもある。

```bash
php artisan reset
php artisan migrate:refresh
```

###Seederの作成

以前はSeederの生成コマンドは無かったが、5.1?くらいから追加された。

```bash
php artisan make:seeder AdminTableSeeder
```

###Seederの実行

Seederを実行します。実行に際しては、DatabaseSeeder.phpのrun()メソッドで明示する必要があります。

```bash
php artisan db:seed
```

###コントローラー作成

コントローラーを生成します。

```bash
php artisan make:controller HogeController
```

###最適化

手動でコントローラを生成したり、リネームしたりした際は、実行してみます。その他、いろいろ。

```bash
php artisan optimize
```

###ビルトインwwwサーバの起動

ビルトインサーバーの起動。標準だと8000portが利用される。

```bash
php artisan serve
```

###対話コンソール起動

ちょっとしたディバッグに利用できる。

```bash
php artisan tinker
```
技術英語 > But that’s only part of it. / No moving parts. / I'll have to omit the other parts.

@ LOE > September 14, 2012

http://loe.org/shows/shows.html?programID=12-P13-00037
> But that’s only part of it.

<hr>
関連して思い出したのは

> No moving parts.

可動部がない

<hr>
関連して思い出したのは

> I'll have to omit the other parts.

会議での英語の本に記載されていた。

緑の帯のある本「英語でミーティング - そのまま使える表現集 by 藤井 正嗣さんら」だったような気がする。
Expressのview engine を JavaScriptにしてみる

次の試みへの下準備回です。
Expressのview engine を JavaScriptにしてみます。
言い換えるとJavaScriptの実行結果として得たHTML文字列をExpressでレンダリングするように設定します。

#ファイル構成
以下のファイルを今回は同一フォルダに置くことにします。
- index.html.js
- app.js

#テンプレート index.html.js

``` index.html.js
module.exports = function(){
  return "<html><head></head><body>AAA</body></html>"
}
```

はい。見たまんまですね。簡単なHTMLを返す関数をモジュールとしてエクスポートしています。このようにrequire可能なモジュール関数としてテンプレートを定義します。今回はとりあえず直書きのHTMLを返しますが、もっと高度なJavaScriptも記述できるでしょう。

# Expressの設定 app.js

``` app.js
var express = require('express');
var app = express();

app.set('views',".");//viewディレクトリを今回はカレントに設定
app.set('view engine', 'html.js');//テンプレートの拡張子を今回はhtml.jsに設定

//今回の本題
//view engine に javascriptを設定
app.engine('html.js', function(path, options, fn){
  try{
    var js = require(path);
    var html = js(options);
    fn(null, html);
  }catch(err){
     fn(err);
  }
});

    
app.get('/index', function(req, res){
  res.render('index');
});

app.listen(process.env.PORT);
```

先に全体を示しましたが重要なのはここです。

```
app.engine('html.js', function(path, options, fn){
  try{
    var js = require(path);
    var html = js(options);
    fn(null, html);
  }catch(err){
     fn(err);
  }
});
```

エンジンには関数を設定します。形式は
function(path, options, fn)
です。optionsにはres.render(name, options)で渡したオプションが入ります。
成功した場合はfn(null, html)を呼び出し、失敗した場合はfn(err)を呼び出すそうです。
正直try-catchなくても、外部でちゃんとキャッチしてるらしく動作あまりかわらないんですけど一応書いてます。

今回は関数を返すモジュールをrequireして実行、htmlを取得する形式をとっています。この辺りはお好みでカスタマイズできると思います。

これでとりあえずJavaScriptをテンプレートエンジンに設定することができました。/indexにアクセスすればindex.html.jsのJavascriptが実行され、その結果がレンダリングされます。

次回はこれを基礎に自作のJSテンプレートエンジンでも作ろうかと思います。
オシャレなPS1環境変数をセットしたら/bin/shが動かなくなってたときの対処

`PS1`環境変数内でシェル関数を呼び出しているような場合、別のシェルを起動すると関数は引き継がれずに環境変数だけ引き継がれてしまってエラーが出ることがあります。たとえば私は普段zshを使っているのですが、shを明示的に起動すると下記のような状況になります。

```
› sh
sh: git_info_for_prompt: command not found
%3~%#
```

普段はshとか起動しないからいいかなと思ってたんですが、EmacsでTRAMPを使っていると内部的にshを起動していて死ぬことに気付きました。類似の状況は他にもあるのではないでしょうか。


## ENV環境変数を利用する

上記の状況に対応する方法は2種類考えられます。

- `PS1`をどの環境でも動くような値に変更する
- 別のシェル起動時に無難な`PS1`をセットし直す

前者の方がキレイな気もしますが、自分用の設定ファイルでポータビリティの高い書き方を強要されるのも変な話です。そこで後者の方針で進めてみます。

たとえばbashであれば`~/.bashrc`でbash用の`PS1`を設定するようにすればzsh用の`PS1`のせいでエラーが出ることはありません。しかし、素のshやshにリネームされたdashを起動した場合、自動的に読み込まれる設定ファイルというのが存在しません（ログイン時であれば`~/.profile`が有効ですが、今回の状況ではログインシェルとは限らないため）。

そこで、`ENV`環境変数をセットすることにします。この変数に初期化ファイルをセットしておくと、sh・dash・kshあたりが起動時に読み込んでくれるようです。

私は`~/.profile`に次のように追記しました。

```
# すべてのシェル起動時に読まれるファイルを設定
# 複雑なPS1を設定している環境で/bin/shを直接起動された場合に対処するため
ENV=".shrc"; export ENV
```

また、`~/.shrc`には次のように書きました。

```
PS1='$ '; export PS1
```

こうして無事平和が訪れました。

```
› sh
$
```

## 参考URL

`ENV`環境変数はググラビリティが低すぎて1次情報がどこなのか全然わかりませんでした…。

- [ORACLE_SID、ORACLE_HOME の確認方法 - オラクル・Oracleをマスターするための基本と仕組み](http://www.shift-the-oracle.com/config/show-environment-variable.html)
- [autojump | VivaFan通信](http://vivafan.com/2013/03/autojump/)
テキストエディタ選択チャート


独断と偏見に寄ります。

![エディタ選択チャート.png](https://qiita-image-store.s3.amazonaws.com/0/64630/2569250b-c259-268a-97ca-e280517cca75.png "エディタ選択チャート.png")

SVGで貼り付けはできないのかな？
Windowsでslackのbotを作る。

ﾄﾞﾓヽ(´Д｀ ) ( ´Д｀)ノﾄﾞﾓ
4:3モニターから買い換えた@ChikuwaJBです。
なんかモニターが大きくなるとパソコンのスペックも上がった気がしますね(意味不明)
# WindowsでSlackのbotを作る。

基本的には[http://lab.aratana.jp/entry/2014/12/04/185053](http://lab.aratana.jp/entry/2014/12/04/185053)を参照。

## bin/hubotが動かない…

```
D:\Users\Chikuwa\Documents\slackbot>bin\hubot.cmd
'coffee' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

```
テンパる。

### 解決方法。

```
npm install -g coffee-script
```
なんで一緒に入らないの…
まあいいけど。。

## なぜかプロジェクト初期だとexample.coffeeが真っ白。

とりあえず自分でコードを書きます。

```
module.exports = (robot) ->
 robot.hear /chikuwa/i, (res) ->
   res.send "ちくわっておいしいよね(棒)"

```

こうしたら`bin/hubot`して

```
D:\Users\Chikuwa\Documents\slackbot>bin\hubot
slackbot> [Sun Jan 03 2016 05:16:21 GMT+0900 (東京 (標準時))] ERROR hubot-heroku-alive included, but missing HUBOT_HEROKU_KEEPALIVE_URL. `heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s  | grep web-url | cut -d= -f2)`
[Sun Jan 03 2016 05:16:22 GMT+0900 (東京 (標準時))] INFO hubot-redis-brain: Using default redis on localhost:6379
slackbot> hubot ping
slackbot> chikuwa
slackbot> ちくわっておいしいよね(棒)
```

よしゃあ。

## herokuにあげても動かない。。

調べること30分。。

`Procfile`ファイルの中身を変えたらできた。

Before:

```
web: bin/hubot -a campfire
```

After:

```
web: bin/hubot --adapter slack
```

なんかこの`hubot`ちゃんslackとは別のcampfireっていうチャットサービスにも対応してるみたいなんですね…

自動判別とかしてくれないのかね･･･

# まとめ

結構時間かかりました(1時間半弱)
まだまだ勉強しないと。。。
Docker公式OS一覧

[Docker公式](https://github.com/docker-library/official-images/tree/master/library)OSを目視で検索したメモ。ROSとかneurodebianみたいな特殊なものは除きました。Verは2016/4/15時点でlatestのものです。

OS|Ver|Download Size|Image Size|Memo
:--|:--|--:|--:|:--
[scratch](https://hub.docker.com/_/scratch/)||0 MB|0 MB|GO exeで便利
[busybox](https://busybox.net/)|1.24|676 KB|1.113 MB|最小の実行ファイルとなるよう設計されたプログラム群
[alpine](http://www.alpinelinux.org/)|3.3|2 MB|4.798 MB|busyboxがベース
[cirros](https://launchpad.net/cirros/)|0.3.4|4 MB|7.735 MB|パッケージマネージャーなし
[ubuntu-debootstrap](https://hub.docker.com/r/library/ubuntu-debootstrap/)|14.04|35 MB|87.09  MB|Deprecated(alpineへ代替)
[opensuse](https://ja.opensuse.org/)|13.2|38 MB|97.7  MB
[photon](https://vmware.github.io/photon/)|1.0RC|43 MB|119.1 MB|VMware製
[debian](https://www.debian.org/)|8.4|51 MB|125.1 MB
[ubuntu](http://www.ubuntulinux.jp/)|14.04|66 MB|188 MB
[mageia](http://www.mageia.org/ja/)|5|72 MB|193.1 MB
[centos](https://www.centos.org/)|7|71 MB|196.7   MB
[oraclelinux](http://www.oracle.com/jp/technologies/linux/)|7.2|74 MB|205.9 MB
[fedora](https://getfedora.org/ja/)|23|74 MB|204.7 MB
[ubuntu-upstart](https://hub.docker.com/_/ubuntu-upstart/)|14.04|102 MB|253.3 MB|デーモン用の起動が早い版
[crux](https://crux.nu/)|3.1|122 MB|341.7 MB
[sourcemage](http://www.sourcemage.org/)|0.61|233 MB|644.7 MB|sourceベース

- alpineが小さくてよいですね。(ubuntu-debootstrapはdeprecatedになりました。)
- 下記参考リンクのubuntu-essentialで、科学技術計算用Python3.5環境([tsutomu7/scientific-python](https://hub.docker.com/r/tsutomu7/scientific-python/))作ってみました。
    - Anaconda 4.0を利用したMKL版("tsutomu7/scientific-python:mkl")も用意しました。
- alpineベースでも、[frolvlad/alpine-glibc](https://hub.docker.com/r/frolvlad/alpine-glibc/)を使えば、Anacondaが使えます。同じように科学技術計算用Python3.5環境[tsutomu7/alpine-python](https://hub.docker.com/r/tsutomu7/alpine-python/)(659MB)を作ってみました。



参考

- [Alpine Linux で Docker イメージを劇的に小さくする](http://qiita.com/asakaguchi/items/484ba262965ef3823f61)
- [Alpine Linux で軽量な Docker イメージを作る](http://qiita.com/pottava/items/970d7b5cda565b995fe7)
- [効率的に安全な Dockerfile を作るには](http://qiita.com/pottava/items/452bf80e334bc1fee69a)
- [お前のDockerイメージはまだ重い💢💢💢](https://speakerdeck.com/stormcat24/oqian-falsedockerimezihamadazhong-i)
- [ubuntu-essential 最小構成の Ubuntu Docker Image](http://qiita.com/A-I/items/af0f654eeac2cc464d1e)
- [超軽量 Docker Image true (125 bytes) と sleeping-beauty (129 bytes)](http://qiita.com/kitsuyui/items/ba6eb17e6bbe97aa6b04)
- [official-images一覧](https://github.com/docker-library/official-images/tree/master/library)

以上
デスクトップのC#プロジェクトをPCLプロジェクトに手作業で変換する

小ネタだけど、日本語で書かれた資料が見当たらなかったので、とりあえず知っていることを書いておこう。（英語では [SO](http://stackoverflow.com/questions/11265132/is-there-any-guidance-on-converting-existing-net-class-libraries-to-portable-li)に同旨の質問があった。）

通常のC#プロジェクト (.csproj) をPCLのC#プロジェクト (.csproj) に変換するには、以下の(1)〜(3)を行えば良い。

(1) 最初のPropertyGroup要素の下に、以下を追加する。

    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>

（実際には、最初のPropertyGroupである必然性は全然なくて、とにかく余計なConditionが無く必ず適用されるPropertyGroupであれば良い。）

他のProjectTypeGuidsがあれば、追加はせず、代わりにその内容を置き換える。

ちなみに、最初のGuidはPCLを、次のGuidはC#であることを示している。だから、もしPCLをサポートする他の言語のプロジェクトにしたい場合は、この値をその言語のGuidにする。

(2) 同じPropertyGroupの下に、以下を追加する:

    <TargetFrameworkProfile>Profile78</TargetFrameworkProfile>

TargetFrameworkVersion要素と並んでいると明確で良い。

TargetFrameworkProfileの値は、指定したいPCLプロファイルの名前にする。
ここで注意すべきは、それぞれのプロファイル名は、それぞれ、特定のTargetFrameworkVersionの値を前提としているということだ。Profile78なら、TargetFrameworkVersionは v4.5 となる。

(3) ルートProject要素の最後の要素として、以下のデフォルトのImport要素

    <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

を削除し、代わりに以下を追加する:

    <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />

以上で完了だ。分かってしまえば、スクリプトで自動的に.csprojを生成することも出来るはずだ。
ElectronのメニューからJavaScript呼び出し


以下のリポジトリに対して、作業します。

```
git clone https://github.com/atom/electron-quick-start
```

index.htmlにJavaScriptのtestFunc関数を定義します。
関数はグローバルに定義されている必要があります。

```index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Hello World!</title>
    <script>
    var testFunc = function(){
      alert("Hello");
    }
    </script>
  </head>
  <body>
    <h1>Hello World!</h1>
  </body>
</html>
```


main.jsの冒頭に```const Menu = electron.Menu;```を追記し、
```app.on('ready', function() {```の下に以下の処理を追加。

```main.js
var template = [
  {
    label: 'Test',
    submenu: [
      {
        label: 'TestFunc',
        accelerator: 'CmdOrCtrl+S',
        click: function(item, focusedWindow) {
          if (focusedWindow)
            focusedWindow.webContents.executeJavaScript('testFunc()');
        }
      }
    ]
  }
]
var menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu);
```

# 実行結果
メニューに「TestFunc」が表示されます。

![スクリーンショット 2016-01-03 4.09.16.png](https://qiita-image-store.s3.amazonaws.com/0/6811/8613baf5-4792-2190-f66a-a09b4c19772a.png "スクリーンショット 2016-01-03 4.09.16.png")

JavaScriptのtestFunc関数が実行され、"Hello"とalertされます。

![スクリーンショット 2016-01-03 4.09.40.png](https://qiita-image-store.s3.amazonaws.com/0/6811/04243311-8051-4dc1-fc1f-4460764d7420.png "スクリーンショット 2016-01-03 4.09.40.png")


# 参考サイト

http://electron.atom.io/docs/v0.36.0/api/menu/
http://electron.atom.io/docs/v0.27.0/api/browser-window/#webcontents-executejavascript-code
Ruby Mechanize でスクレイピングをするときに User-Agent は必須

## 概要
こんにちは。アレックスです。

この投稿では、スクレイピングをするときに見落としがちな、
User Agent（ユーザーエージェント 以下UA）について簡単に解説します。

なぜ、このような記事を書くのか?
経緯はブログに書きましたので一番最後に記載します。
良かったら、ご覧下さい :)

## 目次
1. なぜ必要なのか
2. 具体的なコード
3. 参考文献
4. 最後に

## なぜ必要なのか
長い持論も有りますが、そちらはブログに記載いたしました。
端的に技術・機能的な面で言うと、UAを設定しなければ、
Mechanizeのデフォルトで "WWW-Mechanize/バージョン" となります。

>サーバアクセス時に User-Agent リクエストヘッダで送信される文字列を返します。
> user_agent= や #user_agent_alias= で設定していない場合のデフォルト値は "WWW-Mechanize/バージョン(http://rubyforge.org/projects/mechanize/)" です。

引用元:http://seesaawiki.jp/ruby_mechanize/d/Mechanize#user_agent

ロボット丸出しなので、ロボット対策をしているサイトではたくさん503返されたりします。
httpsのサイトですと、UAの指定が無いからにセキュアな接続が確立できなかったりします。

## コード解説
```ruby:scrap_example.rb

#! /bin/sh
#! ruby
# coding: utf-8
Encoding.default_external = 'UTF-8'
require 'rubygems'
require 'mechanize'
# require 'Mechanize' と頭文字が大文字になっている例を良く見かけるが小文字で統一したほうが良い。

agent = Mechanize.new
agent.user_agent_alias = 'Windows Mozilla'
page = agent.get('https://www.foobar.bazz/')
# Mechanizeは便利なUAのエイリアスがあるので、その中から設定が簡単です。

ua = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36"
agent.user_agent = ua
# 文字列で指定することも可能です。


```

文字列での指定は、個人的にはあまり使用したことありません。
エイリアスには無いブラウザも有りますので、
以下の様なサイトで確認して文字列で指定するのが良いかもしれません。
[ユーザーエージェント確認](http://luftool.com/useragent/)

簡単ではございましたが、以上が解説です。

## リンク
参考文献
[楽々スクレイピング! Ruby Mechanizeの使い方](http://www.xmisao.com/2013/10/05/ruby-www-mechanize.html)
[楽々スクレイピング! Ruby Mechanizeの使い方(2)](http://www.xmisao.com/2014/04/02/ruby-www-mechanize-2.html)
[Ruby Mechanize wiki (ja)](http://seesaawiki.jp/ruby_mechanize/d/Mechanize)
[Rubyで始めるWebスクレイピング](http://www.slideshare.net/takurosasaki/web-scrapingruby)
[APT Browse - /usr/lib/ruby/vendor_ruby/mechanize.rb](http://apt-browse.org/browse/debian/wheezy/main/all/ruby-mechanize/2.3-2/file/usr/lib/ruby/vendor_ruby/mechanize.rb)

経緯ブログ記事
[Rubyスクレイピング – 1 User-Agent 設定が必須](http://arri-ba.net/devlog/2015/12/31/ruby-scraping-user-agent-mechanize/)


## 最後に
最後までご覧頂き有難うございました。
今回は、アレックスが投稿いたしました。

ご指摘、ご質問、ご意見など何でもございましたら遠慮なくお願いします。
プロセス・スレッドを特定のCPUコアでのみ動作させる方法

マルチコアCPUではプロセス・スレッドが実行されるCPUコアはOSのスケジューラに依存し、状況に応じて別のCPUコア上にコンテキストが移動することがあります。LinuxではCPUアフィニティを設定することで、このような移動を抑制し特定のCPUコア上でのみプロセス・スレッドを（主にパフォーマンス上の問題で）実行することが出来ます。

## CPUアフィニティとは

そのスレッドが実行を許可されている論理CPUの集合です。CPUアフィニティはビットマスクで表されます。

例としてCPU0は `0x00000001`, CPU1は `0x00000002`, CPU0,1,3の集合は `0x0000000b` になります。

CPU0は実体はどのCPUコアかというのは `cat /proc/cpuinfo` で確認できます。

## コマンドによるCPUアフィニティの設定方法

tasksetというコマンドでプロセスのCPUアフィニティを設定できます。

```
# taskset -p mask pid
```

maskにはCPUアフィニティを、pidは変更したいプロセスを指定します。

プロセスpidのスレッド全てに対して変更する場合は `-a` オプションを使います。

```
# taskset -a -p mask pid
```

### あるCPUプロセッサで特定のプロセスのみ実行する方法

そのプロセスのみ、該当のCPUで実行を許可し、他のすべてのプロセスは許可をはずします。

```
# ps -e -o pid= | xargs -n 1 taskset -p 0xFFFFFFFE
# taskset -p 0x00000001 PID
```

## プログラム上でCPUアフィニティを設定する方法

プログラム上でCPUアフィニティを設定する場合は[sched_setaffinity()](http://linuxjm.osdn.jp/html/LDP_man-pages/man2/sched_setaffinity.2.html)という関数を使います。

```c
#define _GNU_SOURCE             /* feature_test_macros 参照 */
#include <sched.h>

void
func(void)
{
  cpu_set_t mask;
  int ret;

  // mask を全て OFF にする
  CPU_ZERO(&mask);

  // CPU_AFFINITY_MASKのコアでの実行を許可する
  CPU_SET(CPU_AFFINITY_MASK, &mask);

  // CPUアフィニティを設定
  ret = sched_setaffinity(0, sizeof(mask), &mask);
  if (ret != 0) {
    // error
  }
}
```
forとeachで挙動が違って辛かった


## forを使ってThreadを作成

Threadを使って並行処理でそれぞれの

```ruby:for_code
threads = []
for m in markets
  # ThreadのオブジェクトIDはちゃんと違うの入っている
  threads.push(Thread.new {
    m.update()
  })
end

threads.each {|t|
  t.join
}
```
こんなコード書いたらひたすら最後の市場の情報を更新し続けて困った！

## eachを使ってThreadを作成

なりべくeachを使うようにというお話があったことを思い出したので試してみた

```ruby:each_code
threads = []
markets.each {|m|
  threads.push(Thread.new {
    m.update()
  })
}
threads.each {|t|
  t.join
}
```

ちゃんとすべての市場の情報が更新される様になった！

## どうして？

forでもオブジェクトID異なっていることは確認しました．

どうしてこうなるの？
bundle exec rails g spree:installでNoMethodError

spreeがNo longer maintainedとのことで推奨していたSolidusをインストールする際に起きたNoMethodErrorの解決方法。(SolidusのSlackで見つけた)

```rb:Gemfile
gem 'handlebars_assets', github: 'leshill/handlebars_assets'
```
を追記してbundle install。
Clojure clojure-csv の使い方

CSV の読み書きをするライブラリ。 `returns a lazy sequence of vectors of strings` とのこと。

[Clojure clojure.data.csv の使い方](http://qiita.com/kyanny/items/519ecd883e4007336b38) とだいたい同じ。こっちのほうがちょっと多機能っぽい気がする。あと write がデフォルトで文字列を返すのでこっちのほうが若干とっつきやすい。

GitHub
https://github.com/davidsantiago/clojure-csv
ドキュメントは README しか見つからなかった。

```clj
(ns clj-clojure-csv.core)

(require '[clojure-csv.core :as csv])

(let [filename "usa-states.csv"
      csv (slurp filename)
      rows (csv/parse-csv csv)]
  rows)

(let [filename "usa-states.csv"
      csv (slurp filename)
      rows (csv/parse-csv csv)]
  (doseq [row rows]
    (let [code (first row)
          name (second row)]
      (println (str code " => " name)))))

(let [filename "test.ltsv"
      csv (slurp filename)
      rows (csv/parse-csv csv :delimiter \tab)]
  rows)

(let [filename "test.ltsv"
      csv (slurp filename)
      rows (csv/parse-csv csv :delimiter \tab)]
  (map (fn [row]
         (str (first row) " => " (second row)))
       rows))

(csv/write-csv [["foo" "bar"]
                ["baz" "qux"]])

(csv/write-csv [["foo" "bar"]
                ["baz" "qux"]
                ["I'm" "pen"]]
               :delimiter \tab)

(println
 (csv/write-csv [["foo" "bar"]
                 ["baz" "qux"]]
                :force-quote true))

(println
 (csv/write-csv [["foo" "bar"]
                 ["baz" "qux"]]
                :quote-char \!
                :force-quote true))

(csv/write-csv [["foo" "bar"]
                ["baz" "qux"]]
               :end-of-line \newline)
```

サンプルコードとサンプルデータ
https://github.com/kyanny/playground/tree/gh-pages/clj-clojure-csv
php app/console doctrine:schema:update --force が失敗する

php app/console doctrine:schema:update --forceを実行すると、
下記の謎のエラーが出る

[PDOException]
SQLSTATE[HY000] [2002] Not a directory

そんな時は下記を実行する
sudo mkdir /var/mysql
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock
sudo chown _mysql /var/mysql/mysql.sock
sudo chmod 777 /var/mysql/mysql.sock


▪️参考
http://stackoverflow.com/questions/20754444/sqlstatehy000-2002-not-a-directory-when-doctrineschemacreate
HomebrewでRをインストール

(2018年9月27日更新：外部リポジトリのhomebrew/scienceが廃止されたとの指摘を受け、現時点の外部リポジトリ名brewsci/scienceに修正しました)

(2019年6月12日更新：コメントにて、パッケージ版のインストールの方がよいとの指摘を受け記載を修正しました）

`brew cask`コマンドでパッケージ版をインストールします。

```bash
$ brew cask install r
（後略）
```
Twitterアプリで"Desktop applications only support the oauth_callback value 'oob'"って出た時の対処

表題の通りのエラーがOauthで帰ってくる場合なんですが、
Twitterアプリでの認証でCallbackURLを指定してOauth認証をしようとするとデスクトップの場合に限りこのエラーが出る場合があるみたい。

oobってなんのこっちゃなんですが、私の場合はローカル開発中でlocal.comにcallbackさせようとしてたらエラーが出ました。

#対処方法
ということでOauth時のCallbackURLを認証の際に送る部分は空にして、dev.twitter.com上でのcallbackに開発環境でのURLを突っ込んで対処しました。

"Enable Callback Locking"にチェックを付けて置かなければこれで大丈夫なはず。
PythonのMySQLdbでUTF-8の日本語文字を扱う。

PythonでMySQLdbを通して日本語が含まれるレコードをぶっこ抜くのにunicodeになりやがる。

Python + MySQLで様々にググっても、たぶん簡単すぎて誰も書いてやがらないのでメモります。ポイントはconnector.cursorclass = MySQLdb.cursors.DictCursorのところなんだろうと思う。

```python:sample.py
# -*- coding: utf-8 -*- 
# coding: UTF-8

import MySQLdb
from MySQLdb.cursors import DictCursor
if __name__ == "__main__":
    connector = MySQLdb.connect(host='localhost',db="dbname",user="user",passwd="password", charset="utf8")
    connector.cursorclass = MySQLdb.cursors.DictCursor
    cursor = connector.cursor()
    cursor.execute("SET NAMES utf8")
    cursor.execute = connector.cursor()
    cursor.execute.execute('SELECT * FROM sample limit 10')
    res = cursor.execute.fetchall()
    for row in res:
     print row['users']
    cursor.close()
    connector.close()
```
openframeworksの勉強を始めたので記録


なんだかかっこよさげだからね！
本格的に始めるかは分からないけれど、どういう構成で動いていて何ができるのかくらいは押さえておきたい。
随時更新。

## どうやってインストールすればよい？

[公式](http://openframeworks.jp/)からダウンロードしてきましょう。
「インストール」というよりは「ダウンロード」でした。落ちてきたソースコード群をいい感じのところに置いておくのみです。

なお、C++等をふんだんに使っているので、Xcodeのcommand line toolをあらかじめ入れておく必要があります。

## とりあえず何かしら動かしたいです

一番手っ取り早いのは、ダウンロードしたopenframeworksファイル群の中の、`examples`フォルダの中を覗いてみて、楽しそうな名前の`.xcodeproj`をダブルクリックすることです。
（個人的には`examples/video/asciiVideo/asciiVideo.xcodeproj`あたりがおすすめです。すごいしコードはそんなに難しくない。）

Xcodeが起動して、そのプロジェクトが開くので、すかさず **Run** しましょう。
すごい感じのデモが走ります。

## Xcode起動しないと動かせないのめんどくさくない？

ご心配なく、コマンドラインからでもいけるようです。
Terminalで、`examples`の特定のプロジェクトルートに移動して`make`すると、binが生成されるので、
あとは`make run`すれば、Xcodeから呼び出した時と同様に動きます。

Xcode慣れしてれば、普通にXcodeから呼べばいいと思います。他の何かと連携したい場合はシェルからのほうが便利？

## addonを使ってみたいです
プログラミングの新しい環境を覚える上で、ライブラリを使いこなすのは必要不可欠です。
[このへん](http://www.ofxaddons.com/categories)を見ていると、openframeworksにも大量に **addon** があるのが分かります。

ではこいつらを導入するにはどうするかというと、 **そのaddonのdoc・READMEに書いてあります** というような公式見解…

ただし基本的にはXcodeから、

- addonのファイルをプロジェクトの管理下に置く（add file）
- search pathに、ヘッダファイル（`{アドオン名}.h`）の在り処を追加

とすれば、includeして使えるようになるっぽい。

## 追加予定
- http通信したい
- Androidで動かしたい
- 音をごりごりやりたい

## 参考文献

- [Xcodeセットアップガイド | openFrameworksJp](http://openframeworks.jp/setup/xcode)
herokuでよく使うコマンド

herokuでよく使うコマンドを記載


ログインする

```
$ heroku login
```

appを作成する

```
$ heroku apps:create
```

dynoのスケールを設定する

```
$ heroku ps:scale web=1
```

webで開く

```
$ heroku open
```

確認無しで削除する

```
$ heroku apps:destroy --app app_name --confirm app_name
```

DBの作り直し 

```
$ heroku pg:reset DATABASE
```

最新ログをコマンドラインで監視

```
$ heroku logs -t
```

Herokuへssh接続

```
$ heroku run bash
```


Herokuへの環境変数の変更

```
$ heroku config:set TWITTER_KEY=**********
```

Herokuの環境変数の確認

```
$ heroku config | grep "TWITTER"
```

HerokuのConfigを出力

```
$ heroku config --shell
```

Herokuのインスタンス再起動

```
$ heroku restart
```

Herokuで動いているプロセスのチェック

```
$ heroku ps
```

Herokuのリリース履歴の確認

```
$ heroku releases
```

戻したいバージョンを指定してロールバックをかける  

```
$ heroku rollback <version_number>
```



アプリの詳細情報を表示

```
$ heroku apps:info
```


herokuアプリへの紐付け

```
$ heroku apps:join --app APP
```


herokuアプリへのヒモ付け解除

```
$ heroku apps:leave --app APP
```


以上
配列名にnameを使用するとfor-inで期待の動作をしない問題

下記コードの様にJavaScriptでfor-inで回して順に配列の中身を順に取り出そうとするも配列の要素の１字ずつが取り出されてしまう。

```html
<script>
    var name = ['山田', '佐藤', '鈴木'];
    for(var i in name) {
        document.write(name[i] + 'です。' + '<br>');
    }
</script>
```

出力結果
>
山です。 
田です。 
,です。 
佐です。 
藤です。 
,です。 
鈴です。 
木です。

勿論、期待していた出力結果は以下の通りです。

出力結果
>
山田です。
佐藤です。
鈴木です。

## まずnameの変数名をname1とかに変えてみる

```html
<script>
    var name1 = ['山田', '佐藤', '鈴木'];
    for(var i in name1) {
        document.write(name1[i] + 'です。' + '<br>');
    }
</script>
```

出力結果
>
山田です。
佐藤です。
鈴木です。

期待通りの出力がされた様です。

しかしこれだと何故このような結果に至ったのか、何故変数名をnameをname1に変えると上手くいくのかが納得がいかなかった為、もう少し調査してみました。

するとこんな仕様が見つかりました。
https://developer.mozilla.org/ja/docs/Web/API/Window/name

これによると、window.nameというグローバルオブジェクトwindowのプロパティがあるということです。
つまりこれが何を意味しているのかというと、**変数名をnameにしてしまうとグローバル変数であるwindow.nameと衝突してしまう**ということです。
※name1に変数名を変更すると衝突自体は回避出来る

そして、window.nameは仕様によるとString型に型変換されてしまう為、
```window.name = ['山田', '佐藤', '鈴木']```
としてしまうと、配列の各要素が取り出されるのではなく、１文字ずつが取り出されてしまうという結果に至るわけです。
※そもそもfor-inだとランダムに要素が取り出される可能性があるので、順番を変えたくない場合には適しません。

## 対処法
即時関数で囲った上でローカル変数を定義し、for-inではなく単純にfor文を利用する方法が一番簡単な解決法かと思います。
これによりwindow.nameとの衝突を回避出来るハズです。

```html
<script>
(function () {  
  var name = ['山田', '佐藤', '鈴木'];

  for (var i = 0, l = name.length; i < l; ++i) {
    document.write(name[i] + 'です。' + '<br>');
  }
}());
</script>
```

参考ページ
https://teratail.com/questions/16647
Android開発におけるDI、ORM、環境による定数変更、view共通化の参考リンク

# Android開発におけるDI、ORM、環境による定数変更、デザインの参考リンク

## DI
Dagger2の参考リンク
[Androidアプリ開発でDIのDagger2の使用方法](http://qiita.com/kiimiiis/items/20c3fa79988ed3ccb3c9)
[Dagger2のインストール](http://code.tutsplus.com/tutorials/dependency-injection-with-dagger-2-on-android--cms-23345)
[Dependency Injection With Dagger 2 on Android](http://code.tutsplus.com/tutorials/dependency-injection-with-dagger-2-on-android--cms-23345)
[依存性注入（DI: Dependency Injection）と Dagger 2](http://rakuishi.com/archives/di-dagger2/)

## ORM
DBFlow
[ORMラッパーDBFlow v3.0-beta1の使い方](http://qiita.com/kiimiiis/items/603524744f312a24e3f0)

## 環境による定数変更
debug、開発、本番でAPIのURLとか変えたいときとか環境により定数を変えたいときに
[ここが凄いよ AndroidStudioとGradle](http://firespeed.org/diary.php?diary=kenz-1824)

## デザイン
[AndroidのView共通化方法](http://qiita.com/konifar/items/14517db6477621125d94)

これでwebで開発したときみたいな感じでできそう :laughing:
Gitlab8.3.2でlfsができねー(更新8.15.3で出来た)

大容量の動画やPSDファイルをgitリポジトリーと別管理できるlfsが、gitlabにも対応したよというから
やってみたら、できん。

とりあえず適当なリモートリポジトリーを作成して

・ローカルにcloneする。
・ローカルの該当ディレクトリーのターミナルから

git lfs install
git lfs track "*.mp4"

mp4ファイルを作業ディレクトリに追加。

後はいつものお決まりのコマンド

git add .
git commit -m "動画追加"
git push

以下ERROR

Git LFS: (2 of 1 files) 17.85 MB / 8.93 MB　←　何故か２個アップ
Repository or object not found: http://***.***/group/lfs.git/gitlab-lfs/objects/2e79049717e1623c6487bb778137571664a4ea5162617d068eea5fe19656c147/9359861
Check that it exists and that you have proper access to it

error: failed to push some refs to 'ssh://git@***.***/group/lfs.git'

何回かやったが意味がわからんから
あきらめる

.git/config

[lfs]   url = http://***.***/group/lfs.git/info/lfs
access = basic
[lfs "http://***.***/group/lfs.git/info/lfs"] ←git push すると見に覚えのない設定が勝手に追加される
        access = basic

環境
ローカル
Mac OS 10.11.2
git version 2.6.4
git-lfs/1.1.0 (GitHub; darwin amd64; go 1.5.1)
リモート
GitLab Community Edition 8.3.2

参考
https://github.com/github/git-lfs
http://qiita.com/kiida/items/0d51c43ac73f14f09f5a

#【追記】また挑戦してみた　2017.1.12

まず最初にapacheでリバースプロキシーをかけて
既存nginxで稼働させていたのだが、そこが原因かもしれないと考え
内蔵nginxに変更してみた。

環境
ローカル
Mac OS 10.12.2
git version 2.11.0
git-lfs/1.5.4 (GitHub; darwin amd64; go 1.7.4)
gitlab　8.15.3

・ローカルにcloneする。
・ローカルの該当ディレクトリーのターミナルから

git lfs install (lfsインストール)
git lfs track "*.mp4" (対象ファイルをセット)

git add .
git commit -m "動画追加"
git push

アップされた。

##（２）他のディレクトリーにクローンしてみるがエラーがでて、lfs管理ファイルが落とせない

git clone ssh://****/lfstest.git

Cloning into 'lfstest'...
WARNING: Git LFS is using a deprecated API, which will be removed in v2.0.
         Consider enabling the latest API by running: `git config lfs.batch true`.
Error downloading object: video.mp4 (2e79049717e1623c6487bb778137571664a4ea5162617d068eea5fe19656c147)
省略
エラーがでた

##（３）SMUGGEオプションをつけてみる
GIT_LFS_SKIP_SMUDGE=1 git clone ssh://****/lfstest.git

[http://www.slideshare.net/hibiki443/git-git-lfs-60951449]

落とせた。
ファイル内容はハッシュポイントファイルだけお

-rw-r--r--    1 ****  ****  325263  1 12 00:32 gakusei.png
-rw-r--r--    1 ****  ****     132  1 12 00:32 video.mp4 (容量が小さいテキストポインターだけ)

git lfs fetch(lfsファイルの最新情報を落とす)　エラー

Fetching master
WARNING: Git LFS is using a deprecated API, which will be removed in v2.0.
         Consider enabling the latest API by running: `git config lfs.batch true`.
Git LFS: (0 of 1 files) 0 B / 8.93 MB
http: Server supports batch API only, please update your Git LFS client to version 1.0.1 and up.
Docs: https://***/help
Warning: errors occurred

エラー対処
##（４）git config lfs.batch true

git lfs fetch(lfsファイルの最新情報を落とす)　リトライ

Fetching master
Git LFS: (1 of 1 files) 8.92 MB / 8.93

成功

git lfs pull(本体をpull)
成功
ESP8266 (ESP-WROOM-02) で7セグメントLEDを制御する

# 概要
ESP8266(ESP-WROOM-02 以下 WROOM02) を使って、7セグメント 4ディジット のLEDを制御する。

# はじめに
WROOM02 は Wi-Fi 通信機能が内蔵された Arduino (として使える IC) です。

※センサーを使うには、以下参照。
http://qiita.com/exabugs/items/9ca4093813db71278b39

今回は、7セグメント 4ディジット (5461AS カソード・コモン) の LED を制御します。


# 回路図

Eagle プロジェクト全体はこちらの Github にアップしています。
https://github.com/exabugs/eagle7seg4digits

実際の回路図は以下。

![7seg.png](https://qiita-image-store.s3.amazonaws.com/0/69410/048e9d4d-d048-ba91-25c2-b4b59cfc7b8e.png)

1 LED あたり 20mA 程度なので、アノード側はソースドライバを使わなくてもいけると思います。
なので、カソード側だけ、シンクドライバ(TD62083APG)を使っています。

[注意]
 - WROOM02 は 3.3V 駆動です。電源回路は別途足してください。
 - USB-シリアル変換 のインタフェースは、回路図から外していますので、TXD/RXD, GND に適切に接続してください。


# スケッチ

スケッチは以下になります。
 - 10000 からカウントダウンします。
 - 1ディジットを 4msec でダイナミック点灯しています。これより長いとちらつきました。

```cpp
#include "Ticker.h"

Ticker ticker;
Ticker ticker2;

#define SCK 14                // CLK       クロック信号出力ピン
#define RCK 12                // LOAD      ラッチ動作出力ピン
#define SI  13                // MOSI - DI データ信号出力ピン
#define CLR 15                // クリア

const int segments[] = {
//  HGFEDCBA
  0b00111111, // 0
  0b00000110, // 1
  0b01011011, // 2
  0b01001111, // 3
  0b01100110, // 4
  0b01101101, // 5
  0b01111101, // 6
  0b00100111, // 7
  0b01111111, // 8
  0b01101111, // 9
};

const int digits[] = {
//  HGFEDCBA
  0b00000001, // 0
  0b00000010, // 1
  0b00000100, // 2
  0b00001000, // 3
};

void out1(int x, int d) {
  digitalWrite(CLR, LOW) ; // Clear
  digitalWrite(CLR, HIGH) ;

  digitalWrite(RCK, LOW) ;
  shiftOut(SI, SCK, MSBFIRST, digits[d]);
  shiftOut(SI, SCK, MSBFIRST, segments[x]);
  digitalWrite(RCK, HIGH) ;        // ラッチ信号を出す
}

void out4(int val) {
  static int p = 0;
  p = ++p % 4;
  int x[4];
  for (int i = 0; i < 4; i++) {
    x[i] = val % 10;
    val = val / 10;
  }
  out1(x[p], p);
}

void setup() {
  Serial.begin(115200);
  Serial.print("\n");

  pinMode(SCK, OUTPUT) ;
  pinMode(RCK, OUTPUT) ;
  pinMode(SI,  OUTPUT) ;
  pinMode(CLR, OUTPUT) ;

  delay(3000) ;            // 3S後開始

  Serial.print("Start\n");

  ticker.attach_ms(1000, timer);
  ticker2.attach_ms(4, loop2);
}

int cnt = 10000;

void loop() {
}

void loop2() {
  out4(cnt);
}

void timer() {
  cnt--;
  Serial.print(cnt);
  Serial.print("\n");
}
```

Arduino スケッチ 全体はこちらの Github から。
https://github.com/exabugs/sketch7seg4digits


# 制作

実際に作ってみると、こんな感じです。

![IMG_0256.JPG](https://qiita-image-store.s3.amazonaws.com/0/69410/60985d43-b161-4086-9dda-d34fa182f59a.jpeg)

# まとめ
ESP8266(ESP-WROOM-02 以下 WROOM02) を使って、7セグメント 4ディジット のLEDを制御しました。
ダイナミック点灯の周期を、ちらつかせずに長くするには、何か手法がありますかね？
EmacsでSwiftを自動補完

EmacsでSwiftをコーディングするときにメジャーモードのSwift-modeがあるけど
自動補完の機能は用意されてません。
探して見たとこ、ponpoko1968さんが自動補完機能を用意されてるようです
http://ponpoko1968.hatenablog.com/entry/2015/11/09/183855

用意されてるauto-complete-swfit.elを動作してみましたが
自分の環境では動かないようでした

``` sh
# My Environment
swift --version
Apple Swift version 2.1.1 (swiftlang-700.1.101.15 clang-700.1.81)
Target: x86_64-apple-darwin15.2.0
```

~~上記環境でも動くようにしたものをForkして用意しました。~~
2016/3/6 
ponpoko1968さんより修正プルリクを取り込んでいただきました。

こんな感じになります
![auto-complate-swift.gif](https://qiita-image-store.s3.amazonaws.com/0/37724/79b48245-9f32-4762-6af6-d32fd8d0be5f.gif)

## 設定手順
sourcekittenをインストール

``` sh
$ brew install sourcekitten 
```

以下からauto-complate-swift.elを落してelispのload-path先へ配置します
~~https://github.com/fujimisakari/auto-complete-swift~~
https://github.com/ponpoko1968/auto-complete-swift

init.elに以下の設定を追加します

``` elisp
(require 'auto-complete-swift)
(push 'ac-source-swift-complete ac-sources)

;; デフォルトのSDKは以下が設定されてます
;; /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk
;; 異る場合は以下で再設定する必要があります
;; (setq swift-compiler-args "-sdk /path/to/sdk/")
```

auto-completeを有効にして、M-x ac-complete-swiftを実行すると補完できるようになります
Smalltalk で回転演算を実装する

　ふと Smalltalk で「回転演算ってどうやるんだろうなー？」と思ったんですが、軽く探してみて見つからなかったので、自前実装するとしたらこんな感じでしょうか？
　配列(もちろん文字列も可)を右に k 回転させます。

```smalltalk
| array k middle first last result |
array := #(0 1 2 3 4 5 6).
k := 3.
middle := array size - k + 1.
first := (array copyFrom: 1 to: middle - 1) reverse.
last := (array copyFrom: middle to: array size) reverse.
result := (first, last) reverse.
```

結果は以下のようになります。

```smalltalk
#(4 5 6 0 1 2 3)
```

でもやっぱり、そのものズバリのものがあるような気がしますが…。
【react-native】MACでreact-native環境構築

## 前提条件
・Xcode
・brew install
・brew upgradeとbrew updateで事前にbrewのバージョンをアップしておく

## node.jsインストール
・node.js >=4.0
・node.jsはnodebrewでインストール
https://github.com/hokaccha/nodebrew

※bashやzshなどでnodeの環境設定を確認
\# nodebrew
export NODEBREW_ROOT=\$HOME/.nodebrew
export PATH=\$HOME/.nodebrew/current/bin:\$PATH

\# node path
NODE_PATH=/Users/\*\*\*/.nodebrew/current/lib/node_modules
NPM_PATH=/Users/\*\*\*/.nodebrew/current/bin/npm
export PATH=/usr/local/bin:~/bin:\$NPM_PATH:\$NODE_PATH:$PATH

※筆者はnode v5.3.0を利用
% nodebrew ls
v0.10.29
v0.11.13
v5.3.0
current: v5.3.0

## react-nativeインストール
% npm install -g react-native-cli

## Android 設定
http://developer.android.com/intl/ja/ndk/downloads/index.html

上記のサイトからndkをダウンロード
※筆者はandroid-ndk-r10c

・ndk解凍
ndk\$ chmod a+x android-ndk-r10c-darwin-x86_64.bin
ndk\$ ./android-ndk-r10c-darwin-x86_64.bin

・ndk環境変数
\# Add environment variable ANDROID_HOME
export PATH=\$ANDROID_NDK:\$PATH

・Android SDK
http://developer.android.com/intl/ja/sdk/index.html#Other
上記のサイトでAndroid SDKをダウンロード & Android Studio InstallもOK

・ANDROIDの環境変数
\# Add environment variable ANDROID_HOME
export ANDROID_HOME=/Users/***/dev/env/sdk
export ANDROID_SDK=\$ANDROID_HOME
export PATH=\$ANDROID_HOME:\$PATH
export PATH=\$ANDROID_SDK:\$PATH
export PATH=\$ANDROID_HOME/tools:\$ANDROID_HOME/platform-tools:\$PATH

## アプリ作成
% react-native init AwesomeApp
※AwesomeAppは任意の名前

## Androidのビルド
% cd AwesomeProject
% react-native run-android

## iOSのビルド
AwesomeProject/ios/AwesomeProject.xcodeprojをXcodeで開く

## トラブルシューティング
・Androidの実機で「Unable to download JS bundle」が出る
http://stackoverflow.com/questions/32572399/react-native-android-failed-to-load-js-bundle
上記のサイトに詳しく書いてある

対応方はこれ
% react-native start > /dev/null 2>&1 &
% adb reverse tcp:8081 tcp:8081
Sinatra + Thin + NginxでWEBアプリケーション運用

#概要
Sinatraで作ったWEBアプリケーションをThin + Nginxで運用する。
本当はUnicornの方が早いらしいが、SinatraのチュートリアルでThinが紹介されており、手軽さを重視しThinで構築した。
また、Thin単体で動かすとなぜかSSL通信時にセッションが維持されないという現象に直面したので、Nginxをフロント、Thinをバックエンドサーバーとして動かすことにした。

#環境
+ Ubuntu 14.04.2 LTS 
+ Ruby 2.0.0-p645
+ Nginx 1.4.6
+ Sinatra 1.4.6
+ Thin 1.6.4

#設定

最小のファイル構造。

```bash
.
|-- Gemfile
|-- app.rb
|-- config.ru
```

# Sinatraの設定
`config.ru`を記述し、Sinatraをモジュールとして起動できるようにする。

```rb:config.ru
require './app'
run Application
```

```rb:app.rb
require 'bundler/setup'
require 'sinatra/base'

class Application < Sinatra::Base
  get '/' do
    'hello,world!'
  end
end
```

## Thinの設定
GemfileにThinを書いておく。

```rb:Gemfile
gem 'sinatra' , '1.4.6'
group :production do
  gem 'thin'
end
```
`bundle install`の後に、Thinをサービスとして起動する設定を行う。
rootで実行する必要があるため、環境変数PATHを引き継ぐ設定にするか、bundleを直接叩く。

```bash
$ which bundle
/home/kazuya/.rbenv/shims/bundle
$ sudo /home/kazuya/.rbenv/shims/bundle exec thin install
Installing thin service at /etc/init.d/thin ...
mkdir -p /etc/init.d
writing /etc/init.d/thin
chmod +x /etc/init.d/thin
mkdir -p /etc/thin

To configure thin to start at system boot:
on RedHat like systems:
  sudo /sbin/chkconfig --level 345 thin on
on Debian-like systems (Ubuntu):
  sudo /usr/sbin/update-rc.d -f thin defaults
on Gentoo:
  sudo rc-update add thin default
$ sudo /usr/sbin/update-rc.d -f thin defaults
```
これでThinがサービスとして自動起動するようになる。

次にThinの設定ファイルを作成する。

```yaml:/etc/thin/hoge.yml
---
chdir: /path/to/your/application
environment: production
timeout: 30
log: log/thin.log
pid: tmp/pids/thin.pid
max_conns: 1024
max_persistent_conns: 100 
require: []
wait: 30
threadpool_size: 20
socket: /tmp/hoge.1.sock
daemonize: true
```
これでThin起動時に上記の設定が読み込まれる。

# Nginxの設定
Thinとは/tmp/hoge.1.sockを通じてやりとりする。
SSL周りの詳細な設定は、また別の機会に。

```nginx:/etc/nginx/sites-available/hoge-service.com
upstream backend {
    server unix:/tmp/hoge.1.sock;
    ip_hash;
}

server {
    listen       80;
    listen       443;
    server_name hoge-service.com;

    ssl on;
    ssl_certificate /etc/nginx/ssl-files/server.crt;
    ssl_certificate_key /etc/nginx/ssl-files/server.key;

    location / {
        proxy_pass http://backend;
    }
}
```



以上で完了。
ちゃんとしたサービスとして運用するには、負荷を考えThinのクラスタリング等のチューニングすべきかもしれない。
GitHub上のファイルをCDNとして参照する

***
**RawGitは、2019年10月に、サービスを終了するとのことです。**
https://rawgit.com/

>RawGit is now in a sunset phase and will soon shut down. It's been a fun five years, but all things must end.
>
>GitHub repositories that served content through RawGit within the last month will continue to be served until at least October of 2019. URLs for other repositories are no longer being served.
>
>If you're currently using RawGit, please stop using it as soon as you can.

***

# はじめに
サンプルを作成するのに、JavaScriptのライブラリをダウンロードしたり、Bowerなどを利用してインストールしたり、というのは、多少面倒さを感じるところだ。
サンプルぐらいであれば、CDN(Content Delivery Network)を利用して参照したい。

- CDNとは？
 - Content Delivery Network のことで、ファイルなどのWebコンテンツを配信するために最適化されたネットワークのこと。有名なライブラリだと、インターネットで公開されており、JavaScrptやCSSファイルをダウンロードしなくても、読み込むだけで利用できるようになっていたたりする。
 - jQueryだと、以下のように記述するヤツ。

  ```
  <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
  ```


しかしながら、GitHub上のファイルは、インターネットで公開されていても、テキストとして読み込まれるため、直接URLを指定してもJavaScriptやCSSとしては利用できない。


# GitHub上のファイルをCDN化するサービス『RawGit』
『[RawGit](http://rawgit.com/)』というサービスを利用すると、GitHub上のファイルのURLを指定するだけで、CDN化してくれる。

![rawgit.png](https://qiita-image-store.s3.amazonaws.com/0/22893/f55b06cc-b9af-af7c-bcc8-78c02328d066.png)

例えば、Canvasを利用するグラフィックライブラリの[Paper.js](http://paperjs.org/)を指定すると、以下のようになる。

|対象|URL|
|:---|:---|
|GitHub上のファイル|https://github.com/paperjs/paper.js/blob/develop/dist/paper-full.min.js|
|RawGit(dev/testing)|https://rawgit.com/paperjs/paper.js/develop/dist/paper-full.min.js|
|RawGit(production)|https://cdn.rawgit.com/paperjs/paper.js/develop/dist/paper-full.min.js|


最近、JavaScriptでサンプル実装する場合は、もっぱらRawGitを利用するようになった。
プロダクション環境に利用するかどうかは利用者の判断に依るところだと思うが、サンプルレベルであれば、HTMLファイル単体で公開もできるようにもなるので、非常に便利ではなかろうか。

# その他のCDNサービス

数百のライブラリが、CDNで利用できるように登録されている。
比較メジャーなライブラリであれば、こちらで公開されている可能性が高い。

1. [jsDelivr](http://www.jsdelivr.com/)
1. [cdnjs.com](https://cdnjs.com/)
curlリソースに任意の文字列を保存する

libcurlの機能なんだろうけど、PHPからでも使えた。

PHPマニュアルには反映されていないが、`curl_setopt()`で使えるオプションの一つに`CURLOPT_PRIVATE`なるものがある。

これはcurlリソースに任意の文字列を保存できるという機能らしい。

```php
$ch1 = curl_init();
$ch2 = curl_init();

curl_setopt($ch1, CURLOPT_PRIVATE, 'abcd');
curl_setopt($ch2, CURLOPT_PRIVATE, 'wxyz');

var_dump(curl_getinfo($ch1, CURLINFO_PRIVATE));
var_dump(curl_getinfo($ch2, CURLINFO_PRIVATE));
```

ちゃんとch1にはabcdが、ch2にはwxyzが格納されていて、区別されている。
格納した文字列はリクエスト自体には何ら影響を与えず、単なる付加情報として利用者が好き勝手に使ってよいということらしい。

`curl_setopt`(もしくは`curl_setopt_array`)で格納し、`curl_getinfo`で第二引数を`CURLINFO_PRIVATE`にすることで取り出せる。
`curl_getinfo`の第二引数を省略して連想配列で一気に取得することは**できない**ので注意。
libcurlの方だと保存できるのは`void*`型らしいのでなんでもいいんじゃないかと思うが、PHP版では文字列しか保存できないようだ。

文字列しか保存できない、、ということで微妙なのだが、複数のリソース型変数をいくつも扱いたい時、綺麗に管理するのが意外と面倒くさいので、何かの役に立つことはあるかも。

まあ、「こういう感じのクラスに普通ラッピングするよね、なんでそんな微妙な機能が必要なの」とも思うんだけど、、、

```php
class CurlRequest {
  private $ch;
  function __construct($url) {
    $this->ch = curl_init($url);
  }
  function __destruct() {
    curl_close($this->ch);
  }
  //...

  /**
   * 追加属性情報を保持させる
   */
  function setInfo($name, $value) {
    //...
  }
  function getInfo($name) {
    //...
  }
}
```

ラッピングするとある程度のコストはかかるから、リソース型を直接使って、カリカリにチューニングしたいとき（並列数をすごく多くしたいとか）には、使えるかな？
pandasでunix時刻をdatetime型に変更する際の注意事項


下記テーブルのようなpd.DataFrame型（indexにunix時刻が入っている）があった時に，int型のtimestampをその後の処理上，datetime型に変更したいが，
pandasに用意されている関数をそのまま使うと，おかしな結果になってしまったので備忘録．


|              | x        | y     |z          |
|---------------|-----------|----------|----------|
| timestamp     |           |          |          |
| 1450407402547 | -2.153091 | 1.582626 | 9.288803 |
| 1450407402577 | -2.368118 | 1.287659 | 9.227219 |
| 1450407402607 | -3.023911 | 4.160522 | 8.133606 |
| 1450407402637 | -2.316528 | 2.467163 | 9.581879 |

```python:convert.py
df["time"] = pd.to_datetime(df.index , unit="ms")
df["time2"] =df.index
df["time3"] = df.time2.apply(lambda x: datetime.fromtimestamp(x/1000))

```


| |x             | y         | z        | time     | time2                   | time3         |                            
|---------------|-----------|----------|----------|-------------------------|---------------|----------------------------|
| timestamp     |           |          |          |                         |               |                            |
| 1450407402547 | -2.153091 | 1.582626 | 9.288803 | 2015-12-18 02:56:42.547 | 1450407402547 | 2015-12-18 11:56:42.546999 |
| 1450407402577 | -2.368118 | 1.287659 | 9.227219 | 2015-12-18 02:56:42.577 | 1450407402577 | 2015-12-18 11:56:42.576999 |
| 1450407402607 | -3.023911 | 4.160522 | 8.133606 | 2015-12-18 02:56:42.607 | 1450407402607 | 2015-12-18 11:56:42.607000 |
| 1450407402637 | -2.316528 | 2.467163 | 9.581879 | 2015-12-18 02:56:42.637 | 1450407402637 | 2015-12-18 11:56:42.637000 |

time2は下記のようにするとエラーが出たので無理やり作った．
```
df["time3"] = df.index.apply(lambda x: datetime.fromtimestamp(x/1000))
```

```
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-117-0c598f05317f> in <module>()
----> 1 df["time3"] = df.index.apply(lambda x: datetime.fromtimestamp(x/1000))

AttributeError: 'Int64Index' object has no attribute 'apply'
```


上記の結果からtime3のやり方だと正しくunix時刻が変換される．

pd.to_datetimeの仕様を確認せねば...
Windows上にまともなシェルとpythonの環境を作っておく

WindowsとLinuxを比べたとき、やっぱり嫌なのは使いづらいターミナルエミュレータです。そこで、今回はConEmuを代わりに入れます。
また、やっぱりbashを使いたいので、これも入れましょう。さらにPythonと幾つかのパッケージも使えるようにしておきましょう。

# MSYS2のインストール

[ここ](https://msys2.github.io/)からダウンロードしてぽちぽちするだけです。

```bash
$ pacman --needed -Sy bash pacman pacman-mirrors msys2-runtime
$ exit
```

```
$ pacman -Su
```

しておきましょう

# ConEmuのセットアップ

[ここ](https://conemu.github.io/)からダウンロードしてぽちぽちします。
そのままだとmsysのbashのセッションがないので、settings>startup>tasksで、"c:\msys64\usr\bin\bash.exe" --login -iのコマンドを登録しておきます。デフォルトにしたければsettings>startupからspecified named taskで選んでおきます。

ただこのままだと、私の環境ではctrl-lが動かなかったので、

```:.inputrc
"\C-l": "echo -en '\\0033\\0143'\n"
```

としました。ただこうしてしまうとbash以外のreadlineを使ってるプログラムでctrl-lが効かないのでなんかもうちょいいい手が欲しいです。

# Pythonのインストール

pacmanで突っ込むか、[ここ](https://www.python.org/)から落とします。私はMSYSに依存するのが嫌だったので公式から落としました。公式のpythonを使う場合は、libncursesが使えないので

```bash:
$ pip install pyreadline
```

としておきます。また、pipを使うときにも、ヘッダがないなどの理由でパッケージがビルドできなかったら[ここ](http://www.lfd.uci.edu/~gohlke/pythonlibs/)からぽちぽち落とすといいです。あと私の環境ではbashrcにパスを入れとく必要がありました。
Intellij IDEAでDjangoプロジェクト作成時のエラーを回避(Django not found in selected interpreter)

Intellij IDEAでDjangoプロジェクト作成時のエラー(Django not found in selected interpreter)が出る場合の回避方法を記載

・現象
File > New project > Python Module 
↓
Specify the Python interpreter画面から「Configure」をクリック
↓
「＋」をクリック
↓
Python SDK > Crete virtual env...をクリック
↓
OK > Next
↓
Djangoにチェックをいれて「finish」をクリック
↓
Django not found in selected interpreterのエラーメッセージが表示される


・対処法
IDEA上で作成したvirtualenv環境に途中でdjangoをインストール
するか、事前にdjangoをインストールしたvirtualenv環境を選択する

File > New project > Python Module 
↓
Specify the Python interpreter画面から「Configure」をクリック
↓
「＋」をクリック
↓
Python SDK > Crete virtual env...をクリック
↓
OK > Next
↓
ここからターミナル
virtualenvをactiveにします
(~/hoge_env/はCreate virtualenvで作成したディレクトリ)

```
$ source ~/hoge_env/bin/activate
```
↓
djangoをインストール

```
$ pip install django==1.7.1
```
↓
ここからIDEA
Djangoにチェックをいれて「finish」をクリック

※事前に作成したvirtualenv環境を指定する場合は、
Create virtualenvのところを「Local...」から指定してください


以上
非アーティスト向けのSubstance Painter(2)

前回記事はこちら：http://qiita.com/com04/items/575ae68c9748934ec774

# UVが伸びる時がある
「Projection」を「Tri-planner projection」にすると3軸に対した面に貼られるのでマシになるかも。<br>
![sp_12.png](https://qiita-image-store.s3.amazonaws.com/0/58518/fa73af7e-05aa-b647-1af9-55fc08cd64b9.png)



# メタル質感
塗りつぶしのマテリアルで「metal_steel_brushed/Steel brushed」を選択するとメタルっぽい質感になります。<br>
![sp_11.png](https://qiita-image-store.s3.amazonaws.com/0/58518/6664266e-9e3c-c6c3-23f6-bb6475739dcc.png)

# 土汚れ
屋外で活動した際の土の汚れ。Generatorで「MG Ground Dirt」を使用すると、高さに合わせて適用が出来ます。<br>
地面に近いほうが強く出て、地面から離れるほど薄くなる感じ<br>
![sp_13.png](https://qiita-image-store.s3.amazonaws.com/0/58518/4bfbc920-1d32-390b-9203-8fed63fb11b8.png)

# 指定したポリゴンだけにマスクして塗る
1. レイヤーでマスクを選択して、ツールバーの「Polygon Fill」を選択。<br>
「Properties」欄で塗り方（頂点選択、ポリゴン選択、メッシュ選択）とマスクカラーを選択して、3D Viewで塗っていく。<br>
![sp_18.png](https://qiita-image-store.s3.amazonaws.com/0/58518/7551999f-84db-3b78-3a96-0aa4c5f04661.png)


# パーティクルブラシ
マスクを選択して、「Particles」からブラシを選択します。<br>
マスクカラーで白にすると表示、黒にすると非表示になるのは他と一緒。<br>
![sp_14.png](https://qiita-image-store.s3.amazonaws.com/0/58518/2a211209-4717-35c6-834b-92c7b706da94.png)
後は3D Viewで左クリックでパーティクルで塗っていく。

## かすめた弾痕
1. 「Particle」欄で「laser impact」を選択。
2. 下記のようなアングルで、矢印のように左クリックしたまま動かす。<br>
![sp_16.png](https://qiita-image-store.s3.amazonaws.com/0/58518/06ee217c-aa1e-03f2-a794-4e29ff59dae3.png)
3. 結果<br>
![sp_17.png](https://qiita-image-store.s3.amazonaws.com/0/58518/2f323f41-1116-5302-d241-99e811c0705e.png)

## ほか
他にも割れた(broken glass)、焼けた感じ（burn）等などあるので、適当にパラメーター調整して塗るだけで簡単に試せます。



# 出来上がり
テクスチャが一切描けない自分でもこんな感じに出来ました。
![sp_19.png](https://qiita-image-store.s3.amazonaws.com/0/58518/d620bff4-ee51-6bcd-581d-2baa39923d68.png)
GitHub Pagesで静的なサイトを公開し、独自ドメインを設定する

# 初めに

今回自身のGitHub Pagesのサイトにお名前.comで取得した独自ドメインを設定したので、設定方法を書いていこうと思います。

http://theimaginationwasunbroken.com

# GitHub Pages

## GitHub Pagesとは

GitHub Pagesは静的なサイトを簡単に公開できるGitHubのサービスです。

## GitHubアカウントの取得

まずはGitHub Pagesを利用するためにGitHubのアカウントを取得します。

https://github.com/join

こちらから新規登録をしてアカウントを作成します。

## リポジトリの作成

GitHub Pagesはアカウントに対して作成するのと、リポジトリに対して作成ができますが、今回はリポジトリに対して作成したいと思います。

アカウントを作成したら次に、「＋New Repository」で新しいリポジトリを作成します。

<img width="334" alt="スクリーンショット 2016-01-02 16.07.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/e361f9e8-19f0-07ff-a26b-841532cdb805.png">

Repository nameに適当に名前を入力し「Create repository」でリポジトリを作成します。

<img width="1025" alt="スクリーンショット 2016-01-02 16.14.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/c4fea6b5-1e5a-cb59-1ca6-9175f7eb1a83.png">

作成したら表示されたコマンドをMacならターミナルに、Windowsならコマンドプロンプトに入力してリポジトリの作成は完成です。

## GitHub Pagesの設定

次に作成したリポジトリにGitHub Pagesを設定します。
設定の方法はgh-pagesというブランチを作成するだけです。

<img width="326" alt="スクリーンショット 2016-01-02 16.28.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/631a50ba-1081-2d58-f574-6b10775f49a1.png">

gh-pagesというリポジトリを作成することで静的なサイトを公開できます。
サイトの公開に必要なhtmlファイルやCNAMEファイル（後述）は全てこのgh-pagesブランチにプッシュします。

アドレスは
`{GitHubのアカウント名}.github.io/{作成したリポジトリ名}`
になります。今回自分が作成したサンプルの場合は
`tiwuofficial.github.io/GitHubPagesSample`
になります。
次にこのサイトに独自ドメインを設定したいと思います。

# 独自ドメインの設定

## 独自ドメインの取得

まずはお名前.comというサイトで好きな独自ドメインを取得します。

http://www.onamae.com/

今回自分はtheimaginationwasunbroken.comというドメインを取得しました。

## DNSレコードの設定の設定

取得したらお名前.comのドメイン設定タブを開いて下記のアイコンのDNS関連機能の設定を開きます。

<img width="129" alt="スクリーンショット 2016-01-02 21.25.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/9c4bf6cb-d200-ef82-c5bb-a903810663ba.png">

自分の取得したドメインにチェックを入れ「次へ進む」を開きます。
DNSレコード設定を利用するの右に「設定」のボタンがあるので、開きます。

<img width="628" alt="スクリーンショット 2016-01-02 21.37.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/f7bf9c21-8d10-f4a1-ff8a-0012a16f7e93.png">

「ホスト名 / TYPE / TTL / VALUE / 優先 / 状態」と入力する箇所があります。
TYPEにAが選択されていることを確認して、VALUEに192.30.252.153と192.30.252.154の合計2つを追加します。

上記のIPアドレスは下記GitHubのhelpページを参考にしました。

https://help.github.com/articles/tips-for-configuring-an-a-record-with-your-dns-provider/

IPを2つ追加したら画面下部にある確認画面に進むを開き、設定するをクリックし、設定を完了させます。

## CNAMEレコードの設定

DNSレコードの設定が終わったらCNAMEという名前のファイルにお名前.comで取得したドメインのみを記述しプッシュします。

これでお名前.comで取得した独自ドメインにGitHub Pagesのサイトを結びつけることができます。

# 終わりに

GitHub Pagesで以前からサイトは公開していたのですが、今回独自ドメインを利用したので
設定方法をまとめました。

サイトの公開や独自ドメインの設定も簡単だったのでこの機会に是非、独自ドメインを設定してみてはどうでしょうか。