OmniAICreator/Qiita-1.07M huggingface dataset:
遅延評価を、IOアクションのリストで試す

## 遅延評価は無限を取り扱える
Haskellでは遅延評価という仕組みがある。この仕組みの中では、関数は引数にとるデータについて必要な分だけを使うことになる。

例えば、

```hs
take 3 [0..] -- [0,1,2]
```
とすれば、0から無限に続く正の整数というまとまりから、先頭の３つの要素を取り出すことができる。これはとても便利な仕組みだ。なぜなら、 **まとまりそのもの**と、**それをいくつ取り出すかという条件**を独立させることができるからだ。これにより、プログラマは対象となるまとまりそのものと、その停止条件を別個に設計できるようになる。

```hs:無限の例
filter even [0..] -- 偶数
filter odd [0..] -- 奇数
fibs -- フィボナッチ数列

fibs = 1 : 1: zipWith (+) fibs (tail fibs)
```


なお、先の例をJavaScriptで書くとこのようになるだろう。

```js
function take(n) {
    var arr = [];
    var i;
    for (i = 0; i < n; i++) {
        arr.push(i);
    }
    return arr;
}
```

後者は、**n個の整数**といった有限のまとまりしか扱っていないことがわかる。これを切り離して無限にしてしまったら、プログラムが停止してしまう。モジュール性の観点から言えば、**まとまりそのもの**と、**それをいくつ取り出すかという条件**を分けて表現できた方が嬉しいことが多い(そんなことを前に書いた:[モジュール化について考えてみたときのまとめ](http://qiita.com/rooooomania/items/d86608f2d8292f79e8ca))

## 遅延評価とIO
そんななか、何か他に良い題材はないかと考えていたところ、いつも参考にさせていただいてるブログの[遅延評価とIO](http://d.hatena.ne.jp/kazu-yamamoto/20090603/1244010880)という記事にとても興味を引くことが書いてあった。

> つまり IO に関わる関数さえも、遅延評価というノリのおかげで、完全に独立な部品となるのである。

なるほど、IOに関わる関数さえもなんらかのまとまりとして扱うことができる。あとは独立して停止条件を設計し、つなぎ合わせれば無駄な処理なく必要な分だけ実行できるようになるということだ。WebアプリケーションのようにIOモナドの実装が多くなりがちなケースでは特に、この実装方針を応用して、よりリーダブルなコードにしたい！と思った。
具体的にはHTTPから受け取るデータとか、ロードするデータ（ファイルまたはデータベース）に対する操作を、なんらかのまとまりとして捉える、ということになるだろう。

## サンプル
とても残念だが、実践的なアイデアは浮かばなかった。代わりに、次のようなまとまりと停止条件を考えてみた。

|モジュール|サンプル仕様|
|---|---|
|まとまり|ランダムな値を生成し、標準出力に表示するIOアクションが無限に続くリスト|
|停止条件|生成された値が、実行時に引数として渡す任意の整数にマッチするまで|

次のようなプログラムになった。

```hs:lazyList.hs
import System.Random
import System.Environment
import Control.Monad

-- 0から30までのInt型の値をランダムに選び、標準出力に表示したあとに返す
randInt :: IO Int
randInt = do
    gen <- newStdGen
    let ret = fst $ randomR (0, 30) gen
    putStrLn $ show ret
    return ret

-- IO Int のリストをとり、指定した数字にマッチするまでIOアクションを実行する
searchNumber :: Int -> [IO Int] -> IO ()
searchNumber _ [] = putStrLn "Nothing"
searchNumber x (im:ims) = do
    y <- im -- ここでIO アクションが実行される
    unless (x == y) $ searchNumber x ims

main :: IO ()
main = do
    args <- getArgs
    searchNumber (read $ head args) (repeat randInt)
```

```:実行結果
$ runhaskell lazyList.hs 10
6
18
24
10
```

無限に続くIOアクションのリストを引数にとるものの、引数に入れた数字とマッチすれば即座に停止していることがわかる。
また、`randInt`、`searchNumber`それそれが独立しているので、別の関数やまとまりとつなぎ合わせることが可能になっている。

## 終わりに
最近、`Node.js`も並行して学習しているのだが、ここでもストリームという概念が登場していて、利用する目的が似ている。まとまりとそれをどう取り扱うか、ということについてきちんと知識と勘所を正しく身に付けることが、次世代のプログラミングスキルとしてとっても重要な気がしている。
[Sphinx] #5 ドキュメント構造化 (初級: 複数ファイルを扱う)

# 前提条件

- Sphinxの利用環境が準備できていること
    - 参考: http://qiita.com/tcsh/items/ce758fd45f748463c4b9#%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89-%E5%8F%82%E8%80%83
- ドキュメントプロジェクトを作成してあること
    - http://qiita.com/tcsh/items/b102d70212d97aede46f


0. 事前作業
===========


プロジェクトディレクトリの決定
------------------------------

```bash:変数の設定:
DIR_HANDSON="${HOME}/$( date +%Y%m%d )-handson" \
     && echo ${DIR_HANDSON}

FILE_SUB_HANDSON="${DIR_HANDSON}/main/index.rst" \
     && echo ${FILE_SUB_HANDSON}
```


プロジェクトディレクトリへの移動
--------------------------------

```bash:コマンド:
cd ${DIR_HANDSON}/main/
```


1. ラベルとクロスリファレンス
=============================


1.1. ラベル
-----------

```bash:コマンド:

mv ${FILE_HANDSON} ${FILE_HANDSON}.org

cat << EOF >> ${FILE_HANDSON}
.. _top:

EOF
```

```bash:コマンド(更新):
cat ${FILE_HANDSON}.org >> ${FILE_HANDSON}

cat ${FILE_HANDSON}
```


1.2. クロスリファレンス
-----------------------

```bash:コマンド:
echo "" >> ${FILE_HANDSON}
echo ':ref:`Topへ <top>`' >> ${FILE_HANDSON}
echo "" >> ${FILE_HANDSON}
```

```bash:コマンド(更新):
echo '---(ここから)---' \
     && cat ${FILE_HANDSON} \
     && echo '---(ここまで)---'
make html
```


2. toctree
==========

```bash:コマンド:
cat << EOF >> ${FILE_HANDSON}

----------------------------------------------------------------
サブページ
----------------------------------------------------------------

.. toctree::
   :glob:
   :maxdepth: 2

   ./*

EOF
```

```bash:コマンド(更新):
echo '---(ここから)---' \
     && cat ${FILE_HANDSON} \
     && echo '---(ここまで)---'
make html
```

取り込むべきサブページが存在しないので、Warningが1件表示されます。

```bash:コマンド:
cat _warn.log
```


3. 編集対象ファイルの決定 (サブページ)
======================================

```bash:変数の設定:
FILE_SUB_HANDSON="${DIR_HANDSON}/main/sub.rst" \
     && echo ${FILE_SUB_HANDSON}
```

```bash:コマンド:
cat << EOF >> ${FILE_SUB_HANDSON}
.. _sub1:

================================================================
サブページ その1
================================================================

EOF
```

```bash:コマンド(更新):
echo '---(ここから)---' \
     && cat ${FILE_SUB_HANDSON} \
     && echo '---(ここまで)---'
make html
```

完了
======
phpのsessionを複数のmemcacheサーバに保存するお話

WEBサーバ複数台でセッションを共有したくて
セッションをmemcacheに保存したかったときにはまったお話。
＋
memcaheサーバが複数台だとどう設定したものか。というお話。

はまった点
・phpのsessionの設定場所について
/etc/php.ini
/etc/php.d/memcache.ini
/etc/httpd/conf.d/php.conf

ってな感じで複数個所ある。
んで、僕の環境の場合 mod_php 利用しているため
「/etc/httpd/conf.d/php.conf」の設定が最後に適用されるみたい。(※1)
なのでApache経由で触るだけなら「/etc/httpd/conf.d/php.conf」を編集しておけばOK。

はまったところ
php.iniのみ変更して phpinfo を見ると
master value：memcahe
local value：files
↑
ここでだいぶはまった。

まぁ最終的にPHPのソース内で書き換えました。(※2)
<pre>
ini_set( 'session.save_handler', 'memcache' );
ini_set( 'session.save_path', 'tcp://host1:11211, tcp://host2:11211' );
</pre>

---
引用元
※1
http://qiita.com/takehironet/items/3522a2f38f86d783d01a
※2
http://www.trajectory.jp/tech/php/memcachesession.html
TTY経由でないsudoの実行

#TTY経由でないsudoの実行
* エラー内容：<br>

```
sudo: sorry, you must have a tty to run sudo
```
※具体的には、/etc/sudoers(visudo）から該当行を以下のようにコメントアウトすればOK

```
#Defaults    requiretty
```
[JAWS-UG CLI] EC2:#3 インスタンスの削除 (Tokyo)

AWS CLIを利用して、EC2のインスタンスを削除してみます。

前提条件
========

* [JAWS-UG CLI] 総合案内: http://qiita.com/tcsh/items/14c3278f69ab073afe0f を確認して、必要な手順を終えていること。
* ハンズオンで利用したEC2インスタンス以外のインスタンスが稼動していないこと。


EC2への権限
-----------

* EC2に対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

* AWS CLI 1.11.2
* AWS CLI 1.7.39

```bash:コマンド:
aws --version
```

```text:結果(例):
aws-cli/1.7.39 Python/2.7.5 Darwin/13.4.0
```


0. 準備
=======

0.1. リージョンの決定
---------------------

```bash:変数の設定:
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.2. 変数の確認
---------------

```bash:変数の確認:
aws configure list
```

```text:結果(例):
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       ec2Full-prjZ-mbp13              env    AWS_DEFAULT_PROFILE
      access_key     ****************LOAQ shared-credentials-file
      secret_key     ****************I1O1 shared-credentials-file
          region           ap-northeast-1              env    AWS_DEFAULT_REGION
```

profileが '\<not set\>'  と表示される場合は、以下を実行してください。

```bash:コマンド:
export AWS_DEFAULT_PROFILE=<IAMユーザ名>
```


0.3. 稼動インスタンスを確認
---------------------------

同一リージョンで稼動しているインスタンスのインスタンスIDを確認します。

```bash:コマンド:
ARRAY_EC2_INSTANCE_ID=$( \
  aws ec2 describe-instances \
    --filters Name=instance-state-name,Values=running \
    --query 'Reservations[].Instances[].InstanceId' \
    --output text \
) \
  && echo ${ARRAY_EC2_INSTANCE_ID}
```

```text:結果(例):
i-xxxxxxxx
```


2. EC2インスタンス削除
======================


2.1. EC2インスタンス削除
------------------------

```bash:変数の設定:
EC2_INSTANCE_ID=$(echo ${ARRAY_EC2_INSTANCE_ID} | sed 's/ .*$//') \
  && echo ${EC2_INSTANCE_ID}
```

```bash:変数の確認:
cat << ETX

        EC2_INSTANCE_ID: ${EC2_INSTANCE_ID}

ETX
```

```bash:コマンド:
aws ec2 terminate-instances \
  --instance-ids ${EC2_INSTANCE_ID}
```

```json:結果(例):
      {
        "TerminatingInstances": [
          {
              "InstanceId": "i-xxxxxxxx",
              "CurrentState": {
                  "Code": 32,
                  "Name": "shutting-down"
              },
              "PreviousState": {
                  "Code": 16,
                  "Name": "running"
              }
          }
        ]
      }
```


2.2. EC2インスタンスの状態確認
------------------------------

```bash:コマンド:
EC2_INSTANCE_STATE=$( \
  aws ec2 describe-instances \
    --instance-ids ${EC2_INSTANCE_ID} \
    --query 'Reservations[].Instances[].State.Name' \
    --output text \
) \
  && echo ${EC2_INSTANCE_STATE}
```

```text:結果:
terminated
```

同一リージョンでインスタンスが起動していないことを確認します。

```bash:コマンド:
ARRAY_EC2_INSTANCE_ID=$( \
  aws ec2 describe-instances \
    --filters Name=instance-state-name,Values=running \
    --query 'Reservations[].Instances[].InstanceId' \
    --output text \
) \
  && echo ${ARRAY_EC2_INSTANCE_ID}
```

```text:結果:
(戻り値なし)
```

完了
======
RubyからのParse繋ぎこみサンプル

さーっと調べて、具体例としてgemを使わずにParseに接続しているサンプルコードが見当たらなかったのでメモ。

```rb
require 'net/http'
require 'uri'

location = URI.parse('https://api.parse.com/1/classes/Xxxxxxx')
https = Net::HTTP.new(location.host, location.port)
https.use_ssl = true

req = Net::HTTP::Post.new(location.request_uri)
req['X-Parse-Application-Id'] = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
req['X-Parse-REST-API-Key'] = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
req['Content-Type'] = 'application/json'

data = {
  content: 'test'
}.to_json
req.body = data

res = https.request(req)

puts "code -> #{res.code}"
puts "msg -> #{res.message}"
puts "body -> #{res.body}"
```
正規表現でif文を書くとき

よく忘れるのでメモ


部分一致で発見
左のパターンのどれかが右に当たればマッチ。
'|'をパターンの大外に書くとおかしくなる。
パターンに括弧を書くときは、エスケープしないとだめなはず
perlと逆な感じで少しわかりにくい。

```py

import re
if re.compile("福岡|神奈川|東京|千葉").search("東京都目黒区"):
    print("Match!")
```
.searchの所の他のメソッド
> match(str)
>    文字列の先頭がマッチするかどうかを判定し、マッチしたら MatchObject インスタンスを返し、マッチしなかったら None を返す
>findall(str)
>    マッチする部分のすべてを MatchObject インスタンスのリストで返す。マッチしなければ空のリストを返す
>finditer(str)
>    マッチする部分すべてを MatchObject インスタンスのイテレータで返す。マッチしなければ空のイテレータを返す

追記　下記は、いずれも1つマッチする

```py
if "東京" in ['福岡','神奈川','東京','東京都','千葉']:
    print('Match!')

if "東京" in '東京都品川区':
    print('Match!')
```



perlの時
そういえば、こんな感じだった。
日本語の時は注意事項があった気がする...　忘れた。。

```pl

if ("Hello, world!" =~ /wor/) {
    print("Match!\n");
}
```


参照　いろんなコードで紹介してあります。
https://hydrocul.github.io/wiki/programming_languages_diff/string/match.html
最新の技術トレンドに追従する最も簡単な方法

http://stackshare.io/

[StackShare](http://stackshare.io/)とは、ツールやサービスがどのようなものを使って開発されているのかや、どのようなものと関連しているのかなどを把握できる上に、ランキングや注目タグもあるため、最新の技術トレンドや便利なサービス、ツールなどを見つけやすいのです。

これらは、`Application and Data`, `Utilities`, `DevOps`, `Business Tools`にカテゴライズされ、非常に分かりやすくなっています。

個人のプロフィールページからは、Stackを作成、閲覧できたりします。また、Star機能もあります。

![](https://raw.githubusercontent.com/mba-hack/images/master/stackshare.png)
Herokuの移行先としてOpenShiftを選択する

##はじめに

[OpenShift](https://www.openshift.com)は[Heroku](https://www.heroku.com/)と同じくPaaS(Platform as a Service)の一つで、無料でWebアプリを公開したりするときによく利用されます。有料プランももちろんあります。`OpenShift`の場合は、3つのアプリまで無料という感じっぽいです。

`Heroku`で[新料金](https://blog.heroku.com/archives/2015/5/7/new-dyno-types-public-beta)が発表されたこともあり、移行先が検討されはじめてる感じします。

##使い方

まず、アカウントの作成からです。

https://www.openshift.com

アカウントを作成したら、CLIツールでアプリ開発からアップロードまでを行います。


```bash:
$ ruby -v
2.2.0

$ gem install rhc

# SSH鍵などの登録を行います
$ rhc setup
If you have your own OpenShift server, you can specify it now. Just hit enter to use the server for OpenShift Online: openshift.redhat.com.
#あなたがあなた自身のOpenShiftサーバーを持っている場合は、ここで指定することができます。 openshift.redhat.com：ちょうどOpenShift Onlineのサーバーを使用するためにEnterを叩いてください。

Applications are grouped into domains - each domain has a unique name (called a namespace) that becomes part of your public application URL. You may
create your first domain here or leave it blank and use 'rhc create-domain' later. You will not be able to create an application without completing
this step.
#アプリケーションは、ドメインにグループ化されている - 各ドメインは、公開アプリケーションのURLの一部になります（名前空間と呼ばれる）は、一意の名前を持っています。
#ここにあなたの最初のドメインを作成したり、それを空白のままにして、「作成ドメインをRHC」以降を使用します。あなたが完了せずにアプリケーションを作成することができません。

Please enter a namespace (letters and numbers only) |<none>|:
#名前空間（文字と数字のみ）を入力してください|<なし>|：
#私の場合はUserNameを入力しました。ドメインの一部になるのでUserNameがお勧めです
```

次にアプリの作成と公開です。使用言語は[ドキュメント](https://developers.openshift.com/en/getting-started-overview.html)に詳しく書いてあります。

```bash:
$ rhc create-app home nodejs-0.10
Cloning into 'home'...
The authenticity of host 'home-XXXX.rhcloud.com (255.255.255.1)' can't be established.
RSA key fingerprint is SHA256:Ifdiisdfid5isfdhaihgrahvuiarheUsdfsadsaDD.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'home-XXXX.rhcloud.com,255.255.255.1' (RSA) to the list of known hosts.

# 先ほど作ったアプリのルートに移動して、Gitのリモートリポジトリを一応確認しておく。
$ cd ./home/

$ git remote -v

$ echo node_modules > .gitignore

$ npm install
$ node server
--------------------------------------
$ curl 127.0.0.1:8080

$ grep -R self.ipaddress .
self.ipaddress = process.env.OPENSHIFT_NODEJS_IP;

$ grep -R self.port .
self.port      = process.env.OPENSHIFT_NODEJS_PORT || 8080;

$ git push origin master
```

参考

http://jinjor-labo.hatenablog.com/entry/2015/04/14/011749

http://qiita.com/pine613/items/8555df6952e09532bf5a
naming > FindObjectOfType() / FindObjectsOfType() @ unity

UnityのAPIにて
http://docs.unity3d.com/ScriptReference/EventSystems.EventSystem.html

> FindObjectOfType : Returns the first active loaded object of Type type.
> FindObjectsOfType : Returns a list of all loaded objects of Type type.

APIの名称が「Object」なのか「Objects」なのかで返されるものが単数なのか複数なのか分かるようにしている。

http://docs.unity3d.com/ScriptReference/Object.FindObjectOfType.html
http://docs.unity3d.com/ScriptReference/Object.FindObjectsOfType.html

public static Object FindObjectOfType(Type type);
public static Object[] FindObjectsOfType(Type type);
技術英語 > What a coincidence! / Is it purely coincidence that ...

フルハウスのミシェル役だったオルセン姉妹が出演した「ふたりはお年ごろ (So Little Time)」にて言っていたセリフ

> What a coincidence! (なんて偶然なんでしょう!)

好きな男の子に会うために待ち伏せしていて、会った時に言った言葉。

<hr>
@ Q-SQUARED (STAR TREK: THE NEXT GENERATION)
> Is it purely coincidence that you happen to share that name, ...

<hr>
coinがらみで思い出したのは
- the other side of the coin is that... (別の一面は)

<hr>
「待ち伏せ」は @ Q-SQUAREDにて ambush が使われていた。
ActiveModel::Modelで簡単に検索機能追加

![Screenshot 2015-07-19 17.18.39.png](https://qiita-image-store.s3.amazonaws.com/0/82804/04ea7dd4-5d78-f796-9575-d66c445d37c9.png)

# ActiveModel::Model
```rb
class SearchForm
  include ActiveModel::Model

  attr_accessor :q
end
```

# Model

```rb:使用したModel関連Gems
gem 'pg',    '~> 0.17.1'  # PostgreSQLを使用するため
```

```rb
class Ingredient < ActiveRecord::Base

  scope :sorted, ->{ order(name: :asc) }
  scope :named, ->(q) { where("name ilike ?", "%#{q}%") }
```

# View

```rb:使用したView関連Gems
gem "font-awesome-rails"  # fa_icon("アイコン名")を利用しアイコンを表示するため
gem 'haml-rails'          # HAMLでテンプレートを書くため
gem 'bootstrap-sass'      # Bootstrapを利用するため
```

```haml
.filter_wrapper{ style: "margin-bottom: 20px;" }
  = form_for @search, url: ingredients_path, html: {method: :get}, class: "form-horizontal" do |f|
    .form-group
      .input-group
        = f.search_field :q, class: "form-control"
        %span.input-group-btn
          = f.button fa_icon("search"), class: "btn btn-default"
```

# Controller
```rb
class IngredientsController < ApplicationController

  before_action :search_ingredients, only: :index

  def index
  end

  private

    def search_ingredients
      @search = SearchForm.new(params[:search_form])
      @ingredients = if @search.q.present?
        then Ingredient.all.named(@search.q)
        else Ingredient.all
      end.sorted
    end
end
```

#参考資料
[松田明、後藤大輔（2014）「詳解Rails 4」,『Ruby徹底攻略 (WEB+DB PRESS plus), p.89, 技術評論社.](http://www.amazon.co.jp/Ruby%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-WEB-DB-PRESS-plus/dp/4774165344)
Kotlinで設定ファイルを扱う方法。JSON版

Gsonとdata classを使って簡単にシンプルにJSON設定ファイルを扱うことができました。
これだけの記述で実現でき、見やすさも十分なのはKotlinの仕様のおかげですね。

```json:app_setting.json
{
  "redisHost": "192.168.1.1",
  "redisPort": 6379,
  "redisDb": 5
}
```

```kotlin:Config.kt
import com.google.gson.Gson
import java.io.File

data class Config
(
        val redisHost:String,
        val redisPort:Int,
        val redisDb:Int
) {
    companion object {
        var config:Config = _parseConfig("app_setting.json")

        fun get():Config {
            return config
        }

        fun _parseConfig(filePath:String):Config {
            val source = File(filePath).readText("UTF-8")
            return Gson().fromJson(source, Config::class.java)!!
        }
    }
}
```
Chart.jsで折れ線グラフをリアルタイムにウネウネ動かした。

# chart.jsのグラフを動かしたい
センサー値とかを収集していい感じにリアルタイムに動かして表示したいなーと思って[Chart.jsのLineChart](http://www.chartjs.org/docs/#line-chart)を弄ってみて、なんとかウネウネ動かすとこまで行ったのでまとめ。

# できたもの
やりたかったことは常時一定の測定点をもつ折れ線グラフを右から左へ流していくイメージ。
https://jsfiddle.net/yac0L4gq/2/
（初期化以外は）適当に乱数値でグラフ書いてます。
すでに存在する点の値を次々ずらして更新していくことで動きを作っている。

# 失敗したこと
すでに存在する点をシフトしていくと左からなくなる予定の測定点がアニメーションして右側に移動する、持ってるデータにどこの点の測定点かなどのデータも持ってる、などイマイチな挙動やデータの状態になるのでこの方針は諦めた。

# 感想
ウネウネ動かしてるとすごい勢いでCPUのファンが回ってしまう、そういう意味では重い処理なのでこのまま使うには実用的ではないと思われる。
グラフの描画オプションを変更すればマシになるかもしれない。（いま曲線ででるのでその計算とか結構かかってるかも。）
他のグラフはもっと簡単にできそうなのでラインチャートを選んだことが間違いだった気はしている。
そのうちマシにしたいけどここで一区切り。
RailsのプロジェクトをVMで共有した際にbundle installでこける問題

#はじめに
Railsで作ったプロジェクトを仮想環境でホストPCと共有しているフォルダに入れた時に、bundle installしようとするとunlink_internal的なエラーが吐かれた。

#解決法
色々ググりまくってようやく出てきた以下の英語サイトを参考にしつつ。
http://joequery.me/guides/bundle-install-text-file-busy/

要はデフォルトだとbundlerがgemをインストールする際のフォルダがvendor/bundleだけど、そこがホストPCと共有されているフォルダだとダメですよーってことらしい。

というわけでbundlerがgemをインストールするフォルダを共有フォルダではない場所に指定してあげれば解決する。


指定箇所はRailsプロジェクト内の.bundle/configに書かれているので、共有フォルダ外に新たにgemインストール用のフォルダ（上のサイトの例だと.bundles/(プロジェクト名)）を作ってあげて、そこのパスを指定してあげればいい。

```shell:config
BUNDLE_PATH: "/home/vagrant/.bundles/YOUR_PROJECT_NAME_HERE"
BUNDLE_DISABLE_SHARED_GEMS: '1'
```
JAWS-UG関西女子会「はじめて女子応援企画！事例から学ぶもくもく＆もぐもぐ会」

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-65307172-1', 'auto');
  ga('send', 'pageview');

</script>
#はじめに
この記事はJAWS-UG関西女子会[「はじめて女子応援企画！事例から学ぶもくもく＆もぐもぐ会」](https://jawsugosaka.doorkeeper.jp/events/26344)で
 ~~もぐもぐ~~ [^1] もくもくする際のテキストとなります。
[^1]: 節子！それは懇親会や！！早まったらあかん！！！

#もくもくのねらい
もくもくの前にスライドで説明をした事例と同じような構成を作ること
※全く同じではありません

#もくもくの内容

1. Amazon S3＋CloudFrontで静的WEBサイトを高速化
1. ELB + EC2 + RDSでECサイト構築
2. 作成したインスタンスの削除方法

#事前準備
##Windows環境の方は

* サーバーに接続するためにTeraterm等をインストールして下さい

※SSH接続クライアントであればteratermでなくてもOKです

**Teraterm**
ダウンロード先：http://osdn.jp/projects/ttssh2/
<p>　</p>

* FTP接続用クライアント(FFFTP等)をインストールして下さい

※FFFTPでなくてもFTPクライアントであればOKです。

**FFFTP**
http://osdn.jp/projects/ffftp/releases/


##Mac環境の方は

* サーバー接続にはターミナルを使用するのでSSH接続クライアントのインストールは特に不要です
* FTP接続用クライアント(Cyberduck等)をAppStoreからインストールして下さい

※CyberduckでなくてもFTPクライアントであればOKです。

**Cyberduck**
https://cyberduck.io/

##Management Consoleの言語設定

本手順では ~~作成者の都合で~~画面表示が英語となっております。
画面表示が日本語となっている方は画面左下の「日本語」をクリックして「English」に変更して下さい。
![AWS000196.JPG](https://qiita-image-store.s3.amazonaws.com/0/85659/7d6705cf-8211-c8e1-9693-c1211fef05db.jpeg)

##リージョンの設定
リージョンとはAWSのデータセンターがある地域のことを指し、現在世界に11箇所のリージョンがあります。
日本には東京リージョンがあるのですが、もちろん他のリージョンを使うこともできます。
今回使用するのは東京リージョンとなります。
リージョンの変更はManagementConsole右上の地名が描かれているところをクリックして行います。
「Tokyo」となっていることを確認して下さい。
![ELB000296.JPG](https://qiita-image-store.s3.amazonaws.com/0/85659/39239e09-253f-bf3f-69d5-694b428abd77.jpeg)

##TIPS
構築時にviエディターというLinuxのテキストエディタを使用する場面があります。
以下によく使うコマンドをまとめていますのでご参照下さい。
[こちら](http://qiita.com/naotinn74/private/9995a9af760ab514bb89)

#もくもく手順
以下リンクを参照して下さい

[1.Amazon S3＋CloudFrontで静的WEBサイトを高速化させよう](http://qiita.com/naotinn74/private/25d0c6474d7637143555)
[2-1.ELB + EC2 + RDSでECサイト構築～EC2作成編～](http://qiita.com/naotinn74/private/fd1fcf19c8689de417c8)
[2-2.ELB + EC2 + RDSでECサイト構築～RDS作成編～](http://qiita.com/naotinn74/private/f98e87b3674b1bd4cdd5)
[2-3.ELB + EC2 + RDSでECサイト構築～ELB作成編～](http://qiita.com/naotinn74/private/9bdce230a4ff7459533a)
[2-4.ELB + EC2 + RDSでECサイト構築～EC-CUBEインストール編～](http://qiita.com/naotinn74/private/83ccefd08bbea796f359)
[3.作成したインスタンスの削除方法](http://qiita.com/naotinn74/items/be3ce4909dc1a725b8f3)

#おまけ
「1.Amazon S3＋CloudFrontで静的WEBサイトを高速化」ではS3への直接アクセスを禁止する設定となっています。
CloudFrontまではいいや～、という方へS3のみで静的WEBサイトを作る手順をご用意しております。
[Amazon S3で静的WEBサイトをつくろう ～おまけバージョン～](http://qiita.com/naotinn74/private/d53c0516c938e3397fc1)
Elixirのパターンマッチ


[Elixir](http://elixir-lang.org/)の[Getting Started](http://elixir-lang.org/getting-started/introduction.html)をやろうと思いまして、そのメモです。

# はじめに
[04. Pattern matching](http://elixir-lang.org/getting-started/pattern-matching.html)です。
パターンマッチいいですよね。

# The match operator
* `=`はマッチ演算子
* 左にあるときだけ変数は割り当てられる

```iex
iex> x = 1
1
iex> 1 = x
1
```

# Pattern matching
```iex
iex> {a, b, c} = {:hello, "world", 42}
{:hello, "world", 42}
iex> a
:hello
iex> b
"world"
iex> c
42
iex> {a, b} = {:hello, "world", 42}
** (MatchError) no match of right hand side value: {:hello, "world", 42}

iex> {a, b, c} = [:hello, "world", "!"]
** (MatchError) no match of right hand side value: [:hello, "world", "!"]

iex> {:ok, result} = {:ok, 13}
{:ok, 13}
iex> {:ok, result} = {:error, :oops}
** (MatchError) no match of right hand side value: {:error, :oops}

iex> [a, b, c] = [1, 2, 3]
[1, 2, 3]
iex> a
1
iex> [head | tail] = [1, 2, 3]
[1, 2, 3]
iex> head
1
iex> tail
[2, 3]
iex> [h|t] = []
** (MatchError) no match of right hand side value: []

iex> [h|t] = [1]
[1]
iex> [1|tail] = [1,2,3]
[1, 2, 3]
iex> tail
[2, 3]
```

# The pin operator
* ピン演算子`^`は以前に束縛した値とマッチングするときに使う

```iex
iex> x = 1
1
iex> {x, x} = {1, 2}
** (MatchError) no match of right hand side value: {1, 2}

iex> {^x, x} = {1, 2}
{1, 2}
iex> x
2
```

# その他
* 捨てる値のマッチには`_`変数を使う
* `_`は参照できない
* パターンマッチの左では関数を呼び出せない

```iex
iex> [h | _] = [1,2,3]
[1, 2, 3]
iex> h
1
iex> _
** (CompileError) iex:242: unbound variable _

iex> length([1,2,3]) = 3
** (CompileError) iex:242: illegal pattern
```
githubとcloud9の連携

githubとcloud9の連携で自分用メモ

```
git init
git add . 
# ここでgitしたいディレクトリを指定
git commit -m "first commit"
git remote add origin git@github.com:entaku19890818/bbtuit.git
git branch futsal
git pull origin +master:futsal
git diff futsal master
git commit 
git push -u origin master
```
フォント文字列を補完で選べるSwiftFontNameの使い方


XcodeでUIFontをフォント名で指定するときに、正しい文字列を書かなきゃいけないのは面倒ですよね？その面倒さをなくすためだけの軽量ライブラリ、それがSwiftFontNameです。

![helvetica.png](https://qiita-image-store.s3.amazonaws.com/0/24041/24a0fe53-0cd8-523b-28f0-520fd8ed669b.png "helvetica.png")

[morizotter/SwiftFontName](https://github.com/morizotter/SwiftFontName)


## 使い方

[Carthage](https://github.com/Carthage/Carthage)または、[CocoaPods](https://github.com/cocoapods/cocoapods)でインストールしてください。Github上の`SwiftFontName`ディレクトリにあるファイルを直接プロジェクトに追加してマニュアルで利用することもできます。

### フォントの補完

利用したいファイルの冒頭に、

```swift
import SwiftFontName
```

と記述し、下記の様に書きます。

```swift
FontName.HelveticaNeueLight // HelveticaNeue-Light
```

`FontName`と書いた時点で、候補が一覧として表示されます。`H`と打つとHelvetica系に絞り込まれます。これで、文字列の「HelveticaNeue-Light」が返ります。

### 言語環境によってフォントを変える

NSLocalizedStringなどと組み合わせれば今まででも実現はできていたのですが、フォントのためだけにローカライゼーションを書くのは面倒だったりするので、その場で言語ごとの指定もできるようにしています。

<pre class="brush:swift">
LocalizedFontName(FontName.Copperplate, ["ja": FontName.HiraKakuProNW6, "en": FontName.HelveticaNeueLight])
</pre>

この場合、OSの言語が日本語の場合、`HiraKakuProN-W6`を、英語の場合`HelveticaNeue-Light`を、それ以外の場合`Copperplate`を表示することができます。

フォントの文字列はそんなにたくさんいじることはないかもしれないですが、都度、検索したりしてコードを書く流れが滞ることはあると思います。それを回避できる効果があります。

## 詳細

[README](https://github.com/morizotter/SwiftFontName)を参照してください。
バッチログを集めてjoinコマンドで一覧化

#joinコマンド便利

存在は知っていたが使うことはほとんどなかったjoinを最近使うようになってコレ便利ってなってます。
textファイルに対してSQLのInner join、Outer joinみたいなことができます。

#バッチログの開始時間と終了時間を一覧化する。

この記事はバッチログ群に対してgrepしてjoinすることで、このログに含まれる開始時刻と終了時刻を抽出して最終的にはExcelに放り込んでみて便利だなーとなったのでその記録です。
今回のバッチログ群は執筆者がプロジェクトで見た感じのログを擬似的に再現したものです。

#ログの例

以下みたいなのが各JOBごとにいっぱい出る環境を相手にしてます。
JOBIDをファイル名に含み、開始と終了の行にはgrepで抜くのにちょうどいい文字列と行出力時の時間を含んでいます。

```jobA.log
2015/07/19 23:59:20 start
hogehoge
fugafuga
piyopiyo
2015/07/20 00:20:30 end
```

```jobB.log
2015/07/20 01:20:30 start
foo
var
baz
2015/07/20 01:25:35 end
```

こういったファイル群から、ファイル名とjob開始時間、job終了時間を1行にまとめるために、コマンドをいろいろ叩きます。

# 開始時間と終了時間をgrep

開始と終了の時間を抜きます。
grepで抜くことによって、ファイル名（JOB名）とタイムスタンプを含む出力がでます。
```
$ fgrep start * 
jobA.log:2015/07/19 23:59:20 start
jobB.log:2015/07/20 01:20:30 start
$ fgrep end * > ended.txt
jobA.log:2015/07/20 00:20:30 end
jobB.log:2015/07/20 01:25:35 end
```
#️ファイル名でJOINしたい

~~上記の２つの出力をファイルにした後ファイル名でjoinしてくれれば目的達成なのですが問題がありました。
１現場で唯一つかえる*nix環境のAIXに存在したjoinコマンドはデリミタが指定できないようだったので、joinコマンドの標準のデリミタであるスペースかタブにしないと正しくjoinできません。
joinのキーが"ファイル名:出力年月日"という微妙きわまりない状態になります。~~
**すみませんちゃんとあったので、オプションでやる場合、他の記事等参照してみてください**
そのため、ファイル名の後ろに出力されるコロンが邪魔なので、sedで"log:"を"log "と置換してコロンの存在をごまかします。

```
$ fgrep start * |sed -e 's/log:/log /g'
jobA.log 2015/07/19 23:59:20 start
jobB.log 2015/07/20 01:20:30 start
$ fgrep start * |sed -e 's/log:/log /g' > started.txt 

$ fgrep end * |sed -e 's/log:/log /g'
jobA.log 2015/07/20 00:20:30 end
jobB.log 2015/07/20 01:25:35 end
$ fgrep end * |sed -e 's/log:/log /g' > ended.txt
```
ファイル名の後ろがスペースになりました。

# そしてjoin

ここまで下処理をして、joinが可能になります。
joinコマンドは入力ファイルのソートが必要らしいですがgrepの時点でファイル名によってソートされてるようなので省略。

```
$ join started.txt ended.txt 
jobA.log 2015/07/19 23:59:20 start 2015/07/20 00:20:30 end
jobB.log 2015/07/20 01:20:30 start 2015/07/20 01:25:35 end
```
これでファイル名(JOBID)と開始時間と終了時間が１行に出力されました。
このファイルをExcelに放り込めるように更に正規表現などをかけますがそこは略。
Excelに取り込むことで開始時間、終了時間の列挙、処理時間が一覧化できました。
コマンドで作ることで、サクッと間違いなく作れるのがよいです。
ランダムに障害物をVRレーシングゲームに登場させる

[この記事](http://qiita.com/fumishitan/items/2b60f27b79fdb4772be4)の5回目

今回はランダムに障害物を発生させるロジックを作ります。とはいっても多くはhityotamaさんの記事[【Unity開発4】敵キャラをランダムで生成！ Randam.RangeとInstantiate【ドライビングゲーム5】](http://hiyotama.hatenablog.com/entry/2015/05/09/080000)をもとにしています。
今回はその中の、createScript.csの変更とそれにまつわる、各設定の変更について記載します。

## createScript.csの変更
スクリプトは、Mapの生成の削除やenemyborderなどの固定値の変更を行いました。そうすると以下のようになります。

```createScript.cs
using UnityEngine;
using System.Collections;

public class createScript : MonoBehaviour {
	
public GameObject enemy1;
public GameObject enemy2;
public GameObject enemy3;
public GameObject enemy4;

int border = 1000;
int enemyBorder = 1;
float defdiff = 100f;
void Update (){
  if (transform.position.z > enemyBorder) {
    CreateEnemy ();
  }
}

void CreateEnemy (){
   if (Random.Range (0, 3) == 0) {
      Instantiate (enemy1, new Vector3 (-5f, 0f, enemyBorder + defdiff), enemy1.transform.rotation);
   }

   if (Random.Range (0, 3) == 0) {
      Instantiate (enemy2, new Vector3 (-1.8f, 0f, enemyBorder + defdiff), enemy2.transform.rotation);
}
   if (Random.Range (0, 3) == 0) {
      Instantiate (enemy3, new Vector3 (1.8f, 0f, enemyBorder + defdiff), enemy3.transform.rotation);
   }
   
   if ((Random.Range (0, 3) == 0)) {
      Instantiate (enemy4, new Vector3 (5f, 0f, enemyBorder + defdiff),enemy3.transform.rotation);
    }
    enemyBorder += Random.Range (0, 3)*10;
  }

}
```

このスクリプトをMainCameraにアタッチします

## 各設定の変更

ここではアタッチ後のインスペクタの設定を説明します。[hityotamaさんの記事](http://hiyotama.hatenablog.com/entry/2015/05/09/080000)では、Classic Carというアセットを使っていましたが今回は自作したものを利用します。

自作したオブジェクトはCubeを利用して作りました設定値は下の図のように設定しました。

![スクリーンショット 2015-07-20 0.02.39.png](https://qiita-image-store.s3.amazonaws.com/0/55227/3608e7c5-1c30-32ef-983e-057552fdfd2c.png)

上記のBlockを障害物として下記の図のようにcreateScript.csのインスペクタに設定しました。

![スクリーンショット 2015-07-20 0.05.13.png](https://qiita-image-store.s3.amazonaws.com/0/55227/7e96c110-d890-816f-4e56-b121dfd2432b.png)

これで障害物がランダムで現れます。
トラブル対処メモ：classpnp.sysが原因でWindows 7が起動しない

暫く忙しかったので、久々の更新です。

# はじめに
「何もしてないのにパソコンが起動しなくなった」というお決まりの文句でご相談を頂きました。
HDDの異常な気がするので買い替えを検討しているという話でしたが、何か力になれないかと思い、当該PCを拝見させていただきました。
その際の記録をメモしておきます。

# 環境
OS: Windows 7 Home Premium 64bit
機種: 富士通 FMV LIFEBOOK AH43/G
使用状況: Google Chrome, iTunesなどがインストールされ、OfficeドキュメントやiTunesメディアファイルが保存されているのを除き、ほぼ初期状態（セーフモードでの起動で確認）、リカバリディスク未作成

# 症状
- Windowsを通常起動しようとすると、ブート画面から進まない
- 修復を試みようとすると、トラブル解決ナビが一向に起動しない

# 対処
- セーフモードで起動しようとしましたが、途中`C:¥Windows¥System32¥drivers¥classpnp.sys`の読み込みに異常に時間がかかりました。このまま起動しないかと思われましたが、放置しておくと何とかセーフモードで起動しました。ただ、1つ1つの動作が非常に緩慢です。
- 問題のclasspnp.sysをclasspnp.sys.bakとリネームした上で削除しました。管理者のアクセス許可が必要だったので、`takeown /f C:¥Windows¥System32¥drivers¥classpnp.sys`として所有権を外し、右クリックからプロパティで書き込み権限を付与しました。
- 削除後、動作が非常に軽くなったことから、classpnp.sysが悪さをしていたことは明らかです。
- 原因が判明し、再起動してclasspnp.sysを修復しようとしましたが、セーフモードに入れなくなり、修復しようにもトラブル解決ナビで止まるようになってしまいました。

# 検討事項
- classpnp.sysが悪さをする原因は、Google先生によればざっと以下のようなものでした。しかし、ほぼ初期状態のマシンであり、外部機器は無線マウスのレシーバくらいしかありませんでした。この問題が何が原因で発生したのかは定かではありません。
 - 外付けディスク
 - Daemon Tools
 - セキュリティソフト
- classpnp.sysを削除した後、システムファイルチェッカーを実行し、classpnp.sysを復元してからであれば、問題なく再起動できたか？
- HDDのリカバリ領域から富士通の純正ツールを利用してリカバリディスクを作成しようとしましたが、リカバリ領域が見つからないためディスク作成ができない旨が表示され、ディスク作成ができませんでした。確かにリカバリ領域は残っているのですが。ところで、ここ最近のWindowsマシンにはリカバリディスクが付属していないんですね…。

# 行った提案
- Linuxの起動ディスクを作成し、Linuxを通してCドライブ内のファイルをバックアップ
- Windowsのリカバリディスクの作成もしくは購入

# 参考サイト
- [PCが2台同時に起動しなくなったのを何とか直した話、あるいはclasspnp.sys問題 | GUiLZ.ORG](http://www.guilz.org/2014/08/17/pc2%E5%8F%B0%E5%90%8C%E6%99%82%E8%B5%B7%E5%8B%95%E4%B8%8D%E5%8F%AF%E3%80%81classpnp-sys%E5%95%8F%E9%A1%8C/)
− [Windows7/セーフモードでClassPNP.sysで止まる - まりふのひと](http://d.hatena.ne.jp/ogohnohito/20120707/p1)
- [セーフ モード起動で classpnp.sys の読み込みから進まない - マイクロソフト コミュニティ](http://answers.microsoft.com/ja-jp/windows/forum/windows_7-performance/%E3%82%BB%E3%83%BC%E3%83%95/d6db803b-1f44-49b7-b564-b74735c6a12b)
- [TrustedInstallerのアクセス許可、windows7のファイル所有権･アクセス権を変更する方法](http://freesoft.tvbok.com/windows7/general/trustedinstaller.html)
- [Windows 7 USB/DVD Download Tool で Windows 7 インストール用の USB メモリを作る](http://www.vwnet.jp/Windows/w7/OSinstallFromUSBFlash/Windows7_USB_DVD_Download_Tool.htm)
- [リカバリディスク有償サービス - FMVサポート : 富士通](http://azby.fmworld.net/support/attachdisk/)

Original: 2015-07-19 19:39:45
Macのウィンドウ分割に便利なShiftIt

# ShiftItとは
WindowsやUbuntuではデフォルトでウィンドウを片側半分に寄せるショートカットキーがありますが、Macにはありません。
OS X 10.11でウィンドウ境界の調整に関しては少し改善されているかもしれないですが、ショートカットキーはなさそうです。
そこで、ShiftItをインストールしてやると、ショートカットを設定して、

- ウィンドウを1/2, 1/4サイズで並べる
- 最大化・最小化
- フルスクリーンの切り替え
- センタリング

などを行うことができます。
[公式版](https://code.google.com/p/shiftit/)は開発が終了しており、[Mike's Version](https://github.com/fikovnik/ShiftIt)に引き継がれています。ショートカットキーの変更は、後者になって新規に追加された機能です。
デフォルトではChromeのタブ切り替えなどとショートカットが重複しているので、変更をおすすめします。

# 導入方法
初期状態がOS X 10.10であるとします。10.10未満のバージョンではアクセシビリティの設定は不要です。
1. [ダウンロードページ](https://github.com/fikovnik/ShiftIt/releases)から最新版を入手します
2. ZIPファイルを解凍したら、「Development」/「Local build」に書かれている通りですが、ビルドしてアプリケーションファイルを生成します
    - X11を利用する場合: `$ xcodebuild -target ShiftIt -configuration Release`
    - X11を利用しない場合: `$ xcodebuild -target "ShiftIt NoX11" -configuration Release`
3. 2.で生成したアプリケーションファイルを`/Applications`にコピーします
4. アクセシビリティの許可が必要と言われます。しかし、「システム環境設定」/「セキュリティとプライバシー」/「プライバシー」/「アクセシビリティ」からShiftIt.appにチェックを入れてから、改めて起動しようとしても同じメッセージが表示されてしまいます
5. そのため、一旦Macを再起動します（確かログアウトだけではダメだった気がします）
6. Macの再起動後、ShiftItが起動できればステータスバーにアイコンが表示されます
7. アイコンを押して、「環境設定」を選択して、お好みに応じてカスタマイズしてください。「ログイン時に開く」にチェックを入れておきましょう。ちなみに筆者は以下の設定にしています
![preference.png](https://qiita-image-store.s3.amazonaws.com/0/86866/406e31f8-e13b-58ec-4783-7f899450d980.png)

Original: 2015-06-10 01:14:38
Microsoft Office 365 Universityを日本で契約する（2015年版）

# Office 365 Universityとは
- 日本では取り扱っていないOffice 365の学生向けサブスクリプションです
- Officeソフトの他、OneDrive 1TB追加容量やSkypeの無料通話が4年間格安($79.99)で使えます

# 対象者
- 大学からOfficeのライセンスを貰えない
- 国内で買えるOffice 365 Soloはぼったくりだ
- Office Premium搭載PCなんて買ってない
- WindowsでもMacでも使いたい

# 参考サイト

- [Office365 Universityは日本でも契約出来るの？ 検証してみました！ - にーと てくのろじー](http://neat-tech.info/2013/02/22/subscribe-office365-university-from-japan/)
 - 2013年2月の記事で古いので、2015年4月現在の情報で検証しています
- [【MS】DreamSpark総合スレ【開発ソフト無料】](http://kohada.2ch.net/test/read.cgi/prog/1210936743/)
 - 国際学生証認証の方法について

# 準備するもの

- Microsoftアカウント
-- 持ってない人はあまりいないと思いますが
- 国際学生証（ISICカード）
-- [大学のトラベルセンターで即日発行できます](http://www.utcoop.or.jp/tr/news/news_detail_530.html)
 - 2015年4月に発行すると、有効期限は2016年3月まででした
 - B4で発行すると、M1になる前に失効するので注意
- クレジットカード
- 適当なアメリカ国内の住所
 - [Fake Name Generator](http://ja.fakenamegenerator.com/)などで生成しておきましょう
 - 詳細設定を使って消費税・州税のかからない住所にしましょう

# 費用

- 本体 $79.99
- 国際学生証（ISICカード） ¥1,750

# 手順


1. [Microsoft Store](http://www.microsoftstore.com/store/msjp/jp_JP/home)にアクセスし、サイト最下部左側「日本 - 日本語」→「世界各地のMicrosoft Store」の一覧から「United States - English」を選択
2. 最上部検索欄で「Office 365 University」で検索
3. 次のものを選択。[ここから直接飛べるかもしれない](http://www.microsoftstore.com/store/msusa/en_US/pdp/Office-365-University/productID.275549300)
Office 365 University
    - 4-year subscription
    - For 2 PCs, Macs, or tablets including iPad, Android, or Windows, plus 2 phones
    - Word, Excel, PowerPoint, Outlook, Skype, and more
    - 1TB OneDrive cloud storage
    - Ongoing access to updates

4. 「Buy and download now」→「Checkout」と進み、Microsoftアカウントでログイン
5. 学生認証を国際学生証のシリアル番号で行う。この画面は表示言語を日本語に切り替えることも可能。大学名やac.jpメールアカウントを入れて認証できるところもあるみたいだが、東大は無理。明治はできるらしい？
    - シリアル番号は、カード右下の「（アルファベット1文字）＋（12桁の数字）＋（アルファベット1文字）」で書かれているが、このうち末尾のアルファベットは入力しない（例：S 012 345 678 901 V → S012345678901）
    - 間違えると「国際学生証の番号が有効ではありません。」と出る。間違えすぎるとあと3回とカウントダウン開始
6. 請求先情報の入力。住所入力では適当に生成しておいた住所を入れます
7. カートの中身の確認。$79.99（＋住所に応じた税）が表示されているのを確認して決済
8. メールでダウンロードリンクが送られてきたらダウンロード、インストール
9. 終了

# 最後に
安いですが推奨はしませんので、自己責任で行ってください。

Original: 2015-06-01 00:29:41
play2.4になって変わったな〜と感じること

こんにちは、深澤です！

最近、playframeworkを使うことが多いのですが、
バージョンが上がって、「あぁ、変わったな〜」と感じることがあったので今回まとめてみました。

誰かの参考になれたらと思います。

なお、今回はjavaの方で語っていきます！

#eclipseコマンドがなくなった！？

はい、最初に気が付いた異常はこれですね。
今まで、playアプリケーションをeclipseのプロジェクトとして読み込む際、
アプリケーションのルートディレクトリで、以下のコマンドを使ってからeclipseにインポートしてました。
>$ activator eclipse

このコマンド、外部からプラグインとして持ってこないと使えなくなってしまったんですね。
こんな感じのエラーが出ます。
>[error] Not a valid command: eclipse (similar: help, alias)
[error] Not a valid project ID: eclipse
[error] Expected ':' (if selecting a configuration)
[error] Not a valid key: eclipse (similar: deliver, licenses, clean)
[error] eclipse
[error]

projectディレクトリの中にあるplugins.sbtに次のように記述してeclipseコマンドを使えるようにします。

>addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.5.0")

これでリロードしてあげると使えるようになります。

#モデル関係の設定

正確に言うとebeanの設定もあるんですけどね。
結構焦りました。

今までは（僕の記憶では）build.sbtから追加していたのですが、こちらもプラグインになりました。
eclipseくんと同じようにplugins.sbtに追記してあげてください。

>addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "1.0.0")

設定はこれだけではありません。
次にアプリケーションのルートディレクトリ直下にあるbuild.sbtファイルのroot部分を変更します。
>lazy val root = (project in file(".")).enablePlugins(PlayJava,PlayEbean)

さらに、デフォルトのモデルを知らせるために、application.confファイルに次の一行を追記します。
>ebean.default = ["models.*"]

あとはevolutionもbuild.sbtに付け加えなければならなくなりました。
>libraryDependencies ++= evolutions

インポート先（継承先？）も変わっているので注意が必要です。
>import com.avaje.ebean.Model;

モデル関係はがっつり変わったかなと。

#セッションのインポート先

sessionを使おうとした時に全然使えなくて焦りました。
インポート先は次のようになっています。
> import play.mvc.Http.Session;

これ、前からなんですかね？
以前は、play.api.mvcの下だった気がします。

たぶん、ここの周りは他にも変わったかもしれないのですが、検証が追いついてません・・・。
何かあれば、コメントしていただけるとありがたいです。
僕も、何か見つけ次第、追記していきます。

#routeが動的参照になった
今までコントローラの参照って全部staticだったんですけど、
2.4から動的な参照になりました。
逆にstatic参照にすると読み込んでもらえない（コンパイルエラー）ですね。

とりあえず、気になる点は以上です。
また何か発見があれば書き込んでいきたいなと思っています。

最後までお付き合いいただき、ありがとうございました＾＾
Sublime Text 3で SublimeOnSavedBuild を使うときの注意

[こちらの記事](http://ikasama.hatenablog.jp/entry/2013/07/06/012622)を元に SublimeOnSavedBuild を使って haml を保存のたびに自動で html に変換しようとして、なぜかうまくいかず。自分の環境はSublime Text 3。

```json:haml.sublime-build
{
  "cmd": ["haml", "$file", "$file_path/$file_base_name.html"],
  "selector": "source.haml",
  "working_dir": "${file_path}",

  "osx":
  {
    "path": "/users/hachi8833/.rbenv/shims:$PATH"
  }
}
```

結局[こちらの掲示板](https://www.sublimetext.com/forum/viewtopic.php?f=3&t=17201)の情報によると、`source: source.haml`ではなく`source: text.haml`としなければならないらしい。これで動くようになった。

```json:haml.sublime-build
{
  "cmd": ["haml", "$file", "$file_path/$file_base_name.html"],
  "selector": "text.haml",
  "working_dir": "${file_path}",

  "osx":
  {
    "path": "/users/hachi8833/.rbenv/shims:$PATH"
  }
}
```

# おまけ

最近思ったのだけど、Ruby on RailsやGrunt、Middlemanなどに代表されるWebフレームワークで行っている haml->html変換、compass/sass/scss->css変換、coffeescript->javascript変換は、フレームワークでやるより、エディタでやる方がよいのではないだろうか。

もちろんこうした機能がフレームワークにあることで知る機会が増えることになるのでそれはそれでよいのだけど、それによってフレームワークが肥大化し、メンテが難しくなったりするとしたら少々残念な気がする。しかも`rails new`とかするたびに毎回こうした変換用のgemをえっちらおっちらと用意しないといけなかったり。

慣れてきたら、こうした変換はSublimeなどのエディタに任せるようにした方が普遍性が高まるかもしれない。
XamarinのAndroidサンプルコードが動かなかった→応急処置


サンプルコードがシミュレータで動かない
----

XamarinのAndroidのサンプルコード、例えば[これ](http://developer.xamarin.com/samples/monodroid/BuiltInViews/)をダウンロードしてXamarinで読み込んで、XamarinAndroidPlayerで動かそうとしても以下のエラーが出て、動きませんでした。

```
Detecting installed packages

Waiting for packaging to complete

Installing application on device

Deployment failed because of an internal error: Failure [INSTALL_FAILED_CPU_ABI_INCOMPATIBLE]

Deployment failed. Internal error.
```
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE とあるので、何かCPUが原因と思って設定を見ていた所、それっぽい所を発見しました。

![プロジェクト_オプション_-_BuiltInViews.png](https://qiita-image-store.s3.amazonaws.com/0/7946/7e258ce6-364a-572f-ca6f-4a6406f47101.png "プロジェクト_オプション_-_BuiltInViews.png")


応急処置として、ここのx86にチェックを入れると、動かすことができました。

![プロジェクト_オプション_-_BuiltInViews.png](https://qiita-image-store.s3.amazonaws.com/0/7946/f64fb8c8-6013-6198-bc52-cdb780e23d36.png "プロジェクト_オプション_-_BuiltInViews.png")

ただ、ここは選択できない状態になってます。試行錯誤の結果、以下の手順でチェックを入れることができました。

- 一般タブの"Packaging and Development"の、"Use shared Mono Runtime"のチェックを外す
- Advancedタブのロックが外れるので、x86のチェックを入れる
- 一般タブに戻ってチェックを元に戻す
- [OK]を押して保存

![プロジェクト_オプション_-_BuiltInViews.png](https://qiita-image-store.s3.amazonaws.com/0/7946/c30cc01d-07af-45f8-f4d3-76090a530e63.png "プロジェクト_オプション_-_BuiltInViews.png")

どうしてこうなった？
----
推測ですが、シミュレータがx86のバイナリしか受け付けれないのに、Xamarinのサンプルコードがx86バイナリを作らない設定になってるんじゃないかと思います。ただこのあたり、自分が作ったプロジェクトだと何も設定せずとも動くので、Xamarinが「よろしく」やってくれる所じゃないかなと思うと、なんだか不具合のようにも思います。

自分の環境設定漏れかもしれません。またサンプルコードは数ヶ月前から編集されてないので、今のXamarinに対応できていないのかもしれません。みんな「x86なシミュレータを使ってない」から気づかれてない不具合があるのかもしれません。

原因はよく分からないですが、自力で回避できる応急処置法が分かったので記録として残します。


環境
----
**Mac**
![この_Mac_について.png](https://qiita-image-store.s3.amazonaws.com/0/7946/2c78944a-8272-95fd-5710-5e03b975e962.png "この_Mac_について.png")



**Xamarin Studio**
![About_Xamarin_Studio.png](https://qiita-image-store.s3.amazonaws.com/0/7946/9a0f4ff3-a292-601f-6e0a-b935670f44a2.png "About_Xamarin_Studio.png")



**Xamarin Android Player**
![空白_Skitch_キャンバス.png](https://qiita-image-store.s3.amazonaws.com/0/7946/2e624576-2565-b3af-f42e-a4c8b3197013.png "空白_Skitch_キャンバス.png")
Sails.js 0.11でチャットを作る


## 概要

以下の記事はすごくわかりやすくてありがたかったのだが、0.11では動かなかったので対応させてみた。
(0.11からsocket.ioが1.0になり、色々変わっているようだ)

- Sails.js(0.10.x)でSocket.IOを使った超シンプルなチャットサービスを作る
http://qiita.com/KeitaMoromizato/items/fce04753d3ea253fa8a1

- Sails.js(0.10.x)でチャットアプリを作りながらPub/Subで柔軟に通知するテクニックを学ぶ
http://qiita.com/KeitaMoromizato/items/8102ccbb0fef757847b5

## クライアント側 get/create

socket.get -> io.socket.get
socket.post -> io.socket.post
io.socket.getは接続確立に関係なく呼び出せる。

## サーバ側 getの通知

以下でBlueprintとだいたい同じになる。(sails/lib/hooks/blueprints/actions/find.jsを見た)
これは一つ目の記事(Thread対応前)のもの。

```javascript:MessageController.js
...
  find: function(req, res) {
    Message.find().exec(function(err, messages) {
      if (req.isSocket) {
        Message.subscribe(req, messages);
        if (req.options.autoWatch) {
          Message.watch(req);
        }
      }
      res.json(messages);
    });
  },
```

Message.subscribeの第二引数が必須になり、対象レコードを指定するのだが、(たぶん)既存のレコードの更新だけがsubscribe対象になるので、Message.watchも呼び出す必要がある。
デバッグ時などで普通のGETで呼び出したときにエラーになるので、req.isSocketで囲んだほうがいい。

## サーバ側 createの通知

こちらも少し挙動が変わったと思われる。これも一つ目の記事(Thread対応前)のもの。

```javascript:MessageController.js
...
  create: function(req, res) {
    var text = req.param('text');
    Message.create({ text: text }).exec(function(err, message) {
      if (req.isSocket) {
        Message.publishCreate(message, !req.options.mirror && req);
      }
      res.json(message);
    });
  }
```

publishCreateやpublishUpdateにて、引数を与えないとエコーする(自分にも通知が来る)ようになった。
Blueprintではミラーリングオプションが未設定ならエコーしないようになっている。

## まとめ

ソースはここ。
https://github.com/firewood/sails_chat
Elixirの演算子


[Elixir](http://elixir-lang.org/)の[Getting Started](http://elixir-lang.org/getting-started/introduction.html)をやろうと思いまして、そのメモです。

# はじめに
[3. Basic operators](http://elixir-lang.org/getting-started/basic-operators.html)です。

# List
* Listの結合は`++`
* Listの引き算？は`--`

```iex
iex> [1, 2, 3] ++ [4, 5, 6]
[1, 2, 3, 4, 5, 6]
iex> [1, 2, 3] -- [2]
[1, 3]
```

# 文字列
* 文字列の結合は`<>`

```iex
iex> "foo" <> "bar"
"foobar"
```

# 論理演算
* `and`、`or`、`not`
	* 第1引数は`true`/`false`じゃないとだめ
* `&&`、`||`、`!`
	* どんな型でもOK
	* `false`と`nil`以外を真として扱う

```iex
iex> true and 1
1
iex> false or 1
1
iex> 1 and true
** (ArgumentError) argument error: 1

iex> nil or false
** (ArgumentError) argument error: nil

iex> true && 1
1
iex> false || 1
1
iex> 1 && true
true
iex> nil || 1
1
iex> !1
false
```

# 比較演算子
* だいたいいつもの
* `===`はintegerとfloatの比較に厳密

```iex
iex> 1 == 1.0
true
iex> 1 === 1.0
false
```

* 違う型同士も比較できる
* 型でどちらが小さいかが決まる

```
number < atom < reference < functions < port < pid < tuple < maps < list < bitstring
```

```iex
iex> 1 < :a
true
iex> a > :a
false
iex> 1 > :a
false
iex> 1 < :a
true
iex> :a < fn -> true end
true
iex> fn -> true end < {1}
true
iex> {1} < [1]
true
iex> [1] < "1"
true
iex> "1" < [1]
false
```

# その他の演算子
公式サイトに全演算子の優先順位と結合則がのってます。
http://elixir-lang.org/getting-started/basic-operators.html

演算子の意味は載ってないので、リファレンスみるのがいいのかな。
http://elixir-lang.org/docs/stable/elixir/
パイプでフラッシュされる単位を制御するコマンド

3秒ぐらいで思いついた方法

```bash:全てを一気にフラッシュ(OSXなら-dの代わりに-D)
CommandA | base64 | base64 -d | CommandB
```

```bash:行単位でフラッシュ
CommandA | while read line; do echo $line; done | CommandB
```

```bash:文字単位でフラッシュ(Bash専用)
# CommandA | while read -n 1 char; do echo -n $char; done | CommandB
# ちゃんと動かなかったので却下
```

編集リクかコメントで汎用性高い方法とかあったら教えて下さい
homebrew + pyenv-virtualenv を使った仮想環境の構築

homebrew + pyenv-virtualenv を使った場合の仮想環境の作り方です。homebrewを使っているのでMacOS用となります。

同じような資料はすでにいろいろありますが、自分用のメモで作成しています。

# インストールとpyenv設定

pyenv-virtualenvおよびそのラッパーを導入したい場合、brewを使っていると以下のようにして簡単に導入できます。

```
% brew install pyenv-virtualenv
% brew install pyenv-virtualenvwrapper
```

homebrew-fileを使っている方は以下のようにします。

```
% brew file brew install pyenv-virtualenv
% brew file brew install pyenv-virtualenvwrapper
```
インストール時に以下のような注意が表示されますので、後ほど設定します。

```
To enable shims and autocompletion add to your profile:
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi

To use Homebrew's directories rather than ~/.pyenv add to your profile:
export PYENV_ROOT=/usr/local/var/pyenv
```
環境設定をします。

```
% vi .bash_profile
```
この内容を追記します。

```
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
```
.bash_profile設定を有効にします。

```
% source .bash_profile 
```

# pyenvを使ってPythonを導入する
pyenvを使ってpythonをインストールします。ここでは例としてPython3.3.6をインストールしました。

```
% pyenv install 3.3.6
Downloading Python-3.3.6.tgz...
-> https://yyuu.github.io/pythons/0a58ad1f1def4ecc90b18b0c410a3a0e1a48cf7692c75d1f83d0af080e5d2034
Installing Python-3.3.6...
(以下略)

% 
```
なおPYENV_ROOTが未設定の場合、~/.pyenv/shims/以下にインストールされます。

# 仮想環境の作成

先ほどpython3.3.6をインストールしましたので、これを利用し"sandbox336"という名前で仮想環境を作ります。

```
% pyenv virtualenv 3.3.6 sandbox336
```

# Tips
## pyenvでインストール可能なもの一覧表示

pyenvでインストール可能なものは以下のようにやって調べます。

```
% pyenv install -l
```
## djangoのインストール方法

pipが~/..pyenv/shims/pipを使う場合はpipコマンドでインストールします。

```
% which pip 
→pipが~/.pyenv/shims/pipを見ていること
% pip install django
```

## 環境の削除方法
pyenvでインストールしたようにアンインストールも可能です。

```
% pyenv uninstall sandbox336
% pyenv uninstall 3.3.6
```

# 参考資料
http://qiita.com/maosanhioro/items/47a52f96fefba7126f9b
[JavaScript] 画像リサイズ＆回転

**別記事に書いた『<a href="http://qiita.com/yasumodev/items/e1708f01ff87692185cd" target="_blank">画像変換：&lt;img&gt;要素 ⇔ Base64』</a> の手法を応用すると、画像リサイズや回転ができます。取り急ぎデモソースのみです。解説は、いずれ…。注意点として、冒頭の記事と同じくJavaScriptのクロスドメイン制限の影響を受けます。つまり、<font color="red">外部サーバーにある画像をリサイズ・回転して表示することはできません。</font>**

また、iOSでカメラ撮影された画像は勝手に回転してしまうので注意が必要です。詳細については「参考URL」を。

# ![](//goo.gl/78mjX8) その１：\<img\>タグの画像をリサイズ・回転

⇒ [画像リサイズのデモ：\<img\>タグ](http://jsfiddle.net/9f9707o9/4/)
⇒ [画像リサイズのデモ：\<img\>タグ【90度ずつ回転】](http://jsfiddle.net/9f9707o9/5/)

# ![](//goo.gl/78mjX8) その２：Base64画像データをリサイズ・回転

⇒ [画像リサイズのデモ：Base64](http://jsfiddle.net/9hnpdd5p/6/) <font color="#448800">※コールバック方式に書き直しました</font>
⇒ [画像リサイズのデモ：Base64【90度ずつ回転】](http://jsfiddle.net/9hnpdd5p/7/)

# ![](//goo.gl/78mjX8) 参考URL

▼Canvasの画像をリサイズする簡単な方法【HTML5・javascript】
http://mementoo.info/archives/1634
▼クライアント側でcanvasを使って画像をリサイズする
http://qiita.com/geek_duck/items/2db28daa9e27df9b861d
▼HTML canvas drawImage() Method
http://www.w3schools.com/tags/canvas_drawimage.asp
▼JavaScriptで縮小画像の作成
http://am-yu.net/2014/03/16/
▼Canvas の「汚染」?
https://developer.mozilla.org/ja/docs/Web/HTML/CORS_enabled_image
▼[JavaScript] 画像変換 img要素⇔Base64
http://qiita.com/yasumodev/items/e1708f01ff87692185cd

#### **<font color="red">iOS注意点</font>**

iOS系（iPhone、iPadなど）の端末でカメラ撮影されたJPEG画像を canvas に描画すると勝手に回転されてしまいます。「画像のEXIF情報を読み取って、そのつど回転してね」というイジワルな(？)仕様のようです…。これについては以下のサイトが参考になります。

▼iPhoneの写真が勝手に回転している事に悩まされた話
http://jp.kumi-log.com/entry/2014/03/16/160752
<font color="#6699ff">★</font>JPEGからJavascriptでEXIFのOrientation情報のみを取得する
http://www.egashira.jp/2013/03/obtain-orientation-from-jpeg-exif
▼exif-js と ios-imagefile-megapixel でスマホからの画像アップロードのプレビュー表示に対応する
http://wada811.blogspot.com/2014/11/image-upload--preview.html
▼iPhoneやiPadで撮った写真（縦）をCANVASへdrawimageすると、勝手に回転する現象
http://konnma.blogspot.jp/2014/12/iphoneipadcanvasdrawimage.html


***

(･o･ゞ いじょー。
【Vagrant】"vagrant up"が出来なくなった時の対処メモ

以前、勉強としてVagrantでCentOSが入った仮想マシンを作成していたので、また使おうと思って、
`vagrant up`
を実行したところ以下のメッセージが出力されました。

<メッセージ抜粋>
`VBoxManage.exe: error: Context: "int __cdecl handleImportAppliance(struct HandlerArg *)" at line 779 of file VBoxManageAppliance.cpp
`

# エラーメッセージの原因は何か？
ネットで調べたところ、私のようにこのメッセージに対処された時の対処法を残してくれている方のメモを発見。
どうやら、前回からVMのIDが変わっているために発生しているエラーのようでした。

# VMのIDってどうやって調べるの？
私が見つけたページにパスが通っている前提で以下のコマンドを実行して現行のVMのIDを表示させていました。
`VBoxManage.exe list vms`

残念なことに私の環境ではパスが通っていなかったので、VirtualBoxをインストールしたパスまで移動して実行しました。
`cd C:\Program Files\Oracle\VirtualBox
C:\Program Files\Oracle\VirtualBox>VBoxManage.exe list vms
"centos" {a46d48a4-54fc-4b74-aaf6-e94580264590}
(省略)
`

私の環境ではつらつらと出来ていましたが、Vagrantで作成した仮想マシンの名前は「centos」だったので、このIDをコピーします。

# どこを修正するの？
それぞれの実行環境によるかと思いますが、私は下記のパスにある「id」ファイルの値と先程コピーしたIDを比較して値が違っていたので、IDの値をコピーした値に変更しました。
ファイルパス：`C:\.vagrant.d\boxes\.vagrant\machines\default\virtualbox\id`

# 確認
改めてコマンドプロンプトを立ち上げなおして実行します。
`c:\.vagrant.d\boxes>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: boxes_default_1437307828975_11380
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if its present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => C:/.vagrant.d/boxes
`

うまく立ち上がり、TeraTermよりSSHで接続できました。
いやー次回から注意せねば。

# 参考情報
<a>突然、vagrant upができなくなった<a href ="http://terurou.hateblo.jp/entry/2013/12/17/121138" />
<a>Vagrantの仮想マシンIDの紐づけの直し方<a href ="http://elm-arata.hatenablog.com/entry/2013/09/25/175547" />
IE9で突然Javascriptのエラーが起きて画面表示が崩れるようになったとき

昨日までちゃんと動作していたのに、急にJavascriptのエラーで動かなくなり、CSSも含む表示もなんだか崩れてしまった。
そんなときに確認したいこと。

IEの「互換表示」機能
アドレスバーの横に置いてあるので、間違えてクリックしがちです。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/6688/d10fd5fa-5910-779a-361e-cb6519a16cf4.png)

ここが青くなっているということは、「互換表示」機能が動作しているということです。
ここをオフにすれば、きっと昨日のちゃんと動いていた状態に戻るはず。

jQueryのバージョンもIE9対応なのに
「エラー: オブジェクトは 'addEventListener' プロパティまたはメソッドをサポートしていません。」
とか、
「エラー: 'jQuery' は定義されていません。」
とかが出るときは、確認してみてください。