OmniAICreator/Qiita-1.07M huggingface dataset:
IoTプラットフォーム比較　Azure：AWS

ある勉強会でAzureもAWSもIoTプラットフォームがあるけど、いまいちよくわからないという話が出たので簡単な比較表を作ってみました。
ただし、AWSについては使ったことがないので間違いがあるかもしれません。

||Azure|AWS|
|:-----------|:-----------|:-----|
|デバイス用SDK|.Net、C、Node.js、JAVA|C、Node.js、Arduino|
|プロトコル|HTTP,AMQP,MQTT|HTTP,MQTT|
|クラウド側入口|IoTHub|DeviceGateway|
|メッセージ処理|Stream Analytics|Rules Engine|
|バックエンド|Azure SQL Database、Azure Storage|Amazon DynamoDB、Amazon S3|
|データ解析＆ビュー|AzureML、HDInsight、PowerBI|Amazon Machine Learning、Amazon EMR、Amazon QuickSight|

どちらもできることはほとんど同じです。
プロトコルの対応が違うくらいでしょうか。

***
追記（2016/3/2)
2016/2にAzure IoTHubがMQTTプロトコルに対応しました。
Rails | Resque を動かす最小手順の使い方

## 1. ジェムを追加する

素直に resque をインストールすれば良い。

```rb:rails_project/Gemfile
gem 'resque'
```

```
$ bundle install
```

## 2. 実行内容を書く

最終的にワーカーに実行させたい処理を、モデルの `perform` メソッドの中に書く。
ここではテストとして、標準出力するだけの処理を作る。

```rb:rails_project/app/models/example.rb
class Example
  @queue = :default

  def self.perform
    p 'Hello Sword!'
  end
end
```

## 3. ワーカー用の設定をおこなう

Rakefile に1行足すだけで良い。

```rb:rails_project/Rakefile
require 'resque/tasks'
```

## 4. ワーカーを立ち上げる

`$ TERM_CHILD=1 QUEUES=* bundle exec rake environment resque:work`

立ち上げても、今は何も起こらない。
なぜならジョブが登録されるまで、ワーカーは喋らないからだ。とりあえず放っておこう。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/49a5866e-f661-1c41-37ce-714939fb233a.png)


## 5. ジョブを登録する

ワーカーとは別タブ(別窓)でジョブを追加してみよう。
Rails のコンソールを使うのが手軽だ。

`$ bundle exec rails console`

```rb
irb(main)> Resque.enqueue(Example)

=> true
```

成功したら `true` が返ってくる。

## 6. ジョブが実行される

数秒経ってから、先ほどのワーカーのタブに戻ってみよう。
**「文字列を標準出力する」**というジョブが実行されているのが分かるだろう。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/bc38c086-4efb-340e-3f45-799776acb454.png)

おめでとう！

# 前提

- Rails プロジェクトは既に作成されていることとする。
- bundler は既にインストールされていることとする。

# 環境

- resque (1.25.2)
- Rails 4.2.4



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
LAMP設定(CentOs7 + PHP7 +MariaDB)

#準備（CentOs7 のインストールと設定）
　 http://www.tecmint.com/centos-7-installation/;
#**1.ファイアウォールを設定、ポット80と3306を開く**
　**1)firewalld停止**
　systemctl stop firewalld.service #firewalld停止
　systemctl status firewalld　#firewalld停止確認
　systemctl disable firewalld.service #firewalld自動起動停止        
 **2)iptablesをインストール、設定**
 　yum install iptables-services #インストール
   　vim /etc/sysconfig/iptables #編集
　　　以下の文言を追加：
　　　-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
　　　-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
　　:wq! #保存＆閉める
　systemctl restart iptables.service #再起動
　systemctl enable iptables.service #自動起動
#**2.Apacheをインストール**
　yum install httpd
　systemctl start httpd.service
　systemctl restart httpd.service
　systemctl enable httpd.service　
  
　確認  ip addrでipを探す!![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/69069/c12f6c66-ec7f-11fd-e84e-ab32adfe4426.png)



#**3.MariaDBをインストール、設定**
　**1)MariaDBをインストール**
　yum install mariadb mariadb-server
　systemctl restart mariadb.service 
　systemctl enable mariadb.service
　cp /usr/share/mysql/my-huge.cnf /etc/my.cnf 
  **2)MariaDBを設定**
  mysql_secure_installation
  systemctl restart mariadb.service
#**4.PHP7をインストール、設定**
 **1)PHP7とPhpMyAdminをインストール**
 http://qiita.com/100/items/8e9d9540845cc23e6111
 http://thinkcmf.com/topic/topic/index/id/351.html(阿里云 Centos 7 PHP7环境配置 LNMP)
 **2)Apacheを設定**
　　vi /etc/httpd/conf/httpd.conf 
　　ServerSignature On　#追加
　　Options Indexes FollowSymLinks  #変更：Options Includes ExecCGI FollowSymLinks
　　#AddHandler cgi-script .cgi　#変更：AddHandler cgi-script .cgi .pl
　　AllowOverride None　 #変更：AllowOverride All 
　　AddDefaultCharset UTF-8#変更
　　DirectoryIndex index.html   #変更：DirectoryIndex index.html index.htm Default.html Default.htm index.php
　　MaxKeepAliveRequests 500 #追加
:wq! 
   systemctl restart httpd.service
   rm -f /etc/httpd/conf.d/welcome.conf /var/www/error/noindex.html
**3)phpを設定**
　　vi /etc/php.ini 
　　date.timezone =
　　expose_php = Off
　　short_open_tag = ON
　　open_basedir = .:/tmp/ 
　　:wq! 
　　systemctl restart mariadb.service
　　systemctl restart httpd.service 
#**テスト**
　cd /var/www/html
　vi index.php
　　<?php
　　　phpinfo();
　　?>
　:wq!
github pagesに独自ドメインを設定する際の注意


CNAMEというファイルをリポジトリのrootにpushし、ドメイン名を記載しておくと独自ドメインを設定出来る。

```CNAME
hogehoge.com
```

２個以上のリポジトリでCNAMEをpushしても、最古のCNAMEファイルが優先される。（上書きされない）

#更新したい場合

２個以上をPUSHした状態で１個目のCNAMEファイルを消しても404 Notfoundになる。

その後２個目のCNAMEをpushし直すと２個目に設定される。
Unity3DでVR Game Making -3 


##Trying to make game with using Unity3D and Oculus Rift.


>**Title:** Garbage Toss

>**Object:** Tossing Garbage from the roof into the multiple trashcan

>**Number of Player:** 1~2


*Steps*
1. *Brain-Storming*
2. **Oculus-Rift setup**
3. *Game Build step*
4. *3d-modeling*
5. *Unity Work*

<hr/>

a)Garbage can 3d modeling

b)Basic position setting

<img width="1162" alt="Screen Shot 2016-02-18 at 15.41.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/99307/9cb3868c-52d8-37cb-03a8-637edbe287bf.png">




<br/>
<img width="1159" alt="Screen Shot 2016-02-18 at 15.41.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/99307/95accb1b-4f27-0fac-741e-b943fcbd27b2.png">

Still deciding the background and pointing system.
Unity3DでVR Game Making -2

##Trying to make game with using Unity3D and Oculus Rift.


>**Title:** Garbage Toss

>**Object:** Tossing Garbage from the roof of a building to multiple targets of trashcan

>**Number of Player:** 1~2


**Steps**
1. **Brain-Storming**
2. *Oculus-Rift setup*
3. *Game Build step*
4. *3d-modeling*
5. *Unity Work*


<hr/>
MySQLでの絵文字の検索に関して


絵文字の検索をした際下記のような結果が出ることがあった。ちなみにMySQL5.6でcharacter_setはutf8mb4。

```
mysql> SELECT id, hex(title) FROM tags WHERE title = 0xF09F9886;
+-----+------------+
| id  | hex(title) |
+-----+------------+
| 165 | F09F9886   |
| 166 | F09F9884   |
+-----+------------+
```

id=165のみが返ってくると思ったらもう一つ違う値も返ってくる。。。

おかしいなぁと調べていたら、Collation(照合順序)の問題だった。特にCollationの設定を指定なかったので、`utf8mb4_general_ci`になってたと思うがこれを`utf8mb4_bin`に変えたところ正しい結果が得られた。
Rails 4.2.5.1 + RSpecでundefined method cache エラーの対策


対策

更新する [RSpec 3.4.1](https://github.com/rspec/rspec-rails/compare/v3.4.0...v3.4.1)：

<blockquote class="twitter-tweet" lang="en-gb"><p lang="en" dir="ltr">PSA: if you got stung by RSpec not working with rails 4.2.5.1 yesterday, I just released RSpec 3.4.1 which is compatible with it!</p>&mdash; Fatigue Elemental (@samphippen) <a href="https://twitter.com/samphippen/status/692029477774364675">January 26, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


または何らかの回避策を採ってください：

```rb
RSpec::Rails::ViewRendering::EmptyTemplatePathSetDecorator.class_eval do  
  alias_method :find_all_anywhere, :find_all
end
```

- https://github.com/rspec/rspec-rails/issues/1532
- https://github.com/rails/rails/issues/23244
Unity3DでVR Game Making -1 

##Trying to make game with using Unity3D and Oculus Rift.


>**Title:** ?

>**Object:** ?

>**Number of Player:** 1~2


*Steps*
1. *Brain-Storming*
2. *Oculus-Rift setup*
3. *Game Build step*
4. *3d-modeling*
5. *Unity Work*
コマンドでMacの画面に通知ダイアログを出す

TwitterのChromeプラグインの通知がうるさすぎるので、API叩いてMacの通知に流すシェル書けないかな〜のかな〜とかおもって。

`osascript`という、Apple Scriptを実行するコマンドが入ってます。
これを使って、アプリ通知を出します。

```
osascript -e 'display notification "hogehoge" with title "Fuga"'
```

シェルからも実行できます。

```disp.sh
#!/bin/sh
/usr/bin/osascript -e 'display notification "hogehoge" with title "Fuga"'
```

Apple Scriptおもしろそうやん。
なにか使えそう。
[Crystal] gzip圧縮されたテキストファイルを読む

１日あたり数千万行（多い時で１億行超え）のログアーカイブ（gzip圧縮）を月単位で解析する必要に迫られ，**Ruby** の `Zlib::GzipReader` に相当する **Crystal** の機能はないものかと探ってみると，伸長用の `Zlib::Inflate` クラスを使って同じようなことができるっぽい。

```rb
require "zlib"

File.open("text_file.gz","rb") do |gzip_file|
  Zlib::Inflate.gzip(gzip_file).each_line do |line|
    puts line
  end
end
```

#<i class="fa fa-trash-o"></i> ボツ案

ちなみに，試行錯誤の過程では `LibZ.gzread`を使ってこんなコードを書いてみたりも。

```rb
require "zlib"

def gunzip_each(file_name)
  char = uninitialized UInt8
  cptr = pointerof(char)
  buf = [] of UInt8
  lines = [] of String

  begin
    raise Exception.new("File not found.(#{file_name})") if (fd = LibC.open(file_name, LibC::O_RDONLY)) == -1
    raise Exception.new("Error in gzdopen.(#{file_name})") unless gz = LibZ.gzdopen(fd, "r")
    while (LibZ.gzread(gz, cptr, 1) > 0)
      buf << char
      if char == 10
        yield String.new(Slice(UInt8).new(buf.to_unsafe, buf.size))
        buf.clear
      end
    end
  ensure
    LibZ.gzclose(gz) if gz
    LibC.close(fd) if fd && fd != -1
  end
end
```
Unity 5.3.1p1 XCode il2cpp_codegen_initialize_methodエラー


* Unity 5.3.1p1にアップデート（パッチ適用）後、XCodeのビルドにて、「il2cpp_codegen_initialize_method」のエラーが発生し、ビルドできなくなった
<br />

* 以下の記事を参考に
    * http://forum.unity3d.com/threads/il2cpp_codegen_initialize_method-compiler-errors.375932/
<br />  
* Unity Download AssistantのiOS Build Supportにチェックを入れ、追加インストールしたところ、XCodeのビルドエラーが解決した
Sublime Text > Find: / Where: / Relace: の履歴を呼び出す > カーソルの上下

```txt:動作確認
Sublime Text 2 on Windows 7 pro
```

Ctrl + Shift + Fで表示される検索項目の`Find:`、`Where:`、`Replace:`。それぞれの項目においてカーソルの上下キーを入力をすることで履歴を呼び出すことができるようだ。

操作間違いをして見つけた。

複数プロジェクトを並列的に作業しているので、こういう機能があると助かる。
[AWS]API Gateway + S3でファイルをダウンロードさせる

# やりたいこと
- API GatewayのInvoke URLを叩くとS3においてあるファイルがダウンロードされる。

# まずやってみたこと(失敗)
「**Integration type**」で`HTTP Proxy`を選択して「**Endpoint URL**」にS3のStatic Website HostingのEndpointを指定すれば行けると思ったのですが`Internal server Error`となりました。

# うまくいったやり方
ひとまずうまくいったやり方が以下になります。

## S3にバケットを作成
任意のバケットを作成し、ダウンロードさせたいファイルを配置します。

## S3アクセス用のroleを作成
IAMでAPI GatewayからS3の該当バケットにアクセスするためのroleを作成します。

## API Gatewayの設定
以下のように設定します。
	
### Integration Request
	Integration Type
		AWS Service Proxyを選択
	AWS Region
		S3のリージョンを選択
	AWS Service
		S3を選択
	HTTP method
		任意
	Path override
		S3のkey(bucketname含む)を入力
	Execution role
		作成したroleのarnを入力

### Method Response
	Response Models for 200
		Content type
			application/octet-stream

# 課題
`Content-Disposition: attachment; filename="filename"`
 の設定ができていません。

「**Method Response**」の「**Response Headers for 200**」に
`Content-Disposition`
を追加して、
「**Integration Response**」の「**Header Mappings**」の「**Mapping value**」に
`attachment; filename="filename"`
を指定すると以下のエラーとなりました。

	Invalid mapping expression specified: Validation Result: warnings : [], errors : [Invalid mapping expression specified: attachment; filename="filename"]

ここは現在調査中です。

# 2016/02/09追記
2016/02/09現在、「**Method Execution**」からのTESTを実行すると`Internal server error`となります。
どうやらAPI Gatewayのバグの用で、Deployすると正常に動作します。
3Dweb


**treejs+angularを組み合わせて、Web上に３D画像を表示することが目的です。Cordova＋threejsでの表示はできましたので、あとはangularで３D画像の回転、拡縮を実現したいと思います。**


##generatorでthreejsのひな型を作る##

このひな型にはangularは組み込まれません。

１．generator github より generator-threejsを取得
２．generatorを登録　npm -g generator-threejs
３．mkdir angular-threejs  cd angular-threejs
４．package.jsonの先頭行　nameをディレクトリ名に変更
５．npm install
６．grunt serve

##yoでつくるプロジェクトの使用目的

**Cordova** create はハイブリッド用の開発環境とアプリのひな型を作成してくれます。
**yo**はあらかじめ用意（誰かが開発）された**generator**を使って専用の開発環境(例えばthreejs)とアプリのひな型を作る。これらのアプリはHerokuやnodejsサーバー上で動作する。

##generators##

**以下の実験はCordova環境で作成されたコンテンツがどのような環境で動くのかを調査したものである。**

##実験の方法##
Cordova環境で開発したＷＷＷフォルダー内のコンテンツ一式をＹＯで作成したプロジェクトのappにそっくりcopyし、grunt serveで実行する。

##実験の結果##
⓵generator angular-threejsを使って作成したプロジェクトに以下のサイトで紹介されたjeepのサンプル(Cordovaでも正常に動作）は正常に動いた。
http://twofuckingdevelopers.com/2014/02/mixing-angularjs-threejs/ 
⓶generator angularを使って作成したプロジェクトでは動かない。
⓷onsenuiのサンプルはangularで動く

今日2016/1/28  jeepを動かすことが目的なのでここで打ち切り。
[告知] vim-modelineとauto-encodingを併用した場合にモードラインのfileencodingを無視する問題に対する対応


## はじめに

[vim-modeline](https://atom.io/packages/vim-modeline)と[auto-encoding](https://atom.io/packages/auto-encoding)を併用しており、かつ本来の文字コードとモードラインの`fileencoding`が異なる値の場合、モードラインの設定値を無視してauto-encodingで判定した文字コードが設定されてしまう場合があるという問題がある。

## 例

```ruby
# vim: set fenc=euc-jp

class SomeClass
  def initialize
  end
end
```

上記のようにモードラインには`euc-jp`と明記されているもののASCII範囲の文字しか使っていない場合、auto-encodingはこのファイルを`utf8`として文字コードをセットする。
しかし、このファイルは後日ASCII範囲外の文字を入力する予定であり、モードラインに記述してあるから問題ないとして特に文字コードを気にせずに編集すると、`euc-jp`として保存してほしいのに`utf8`として保存してしまう可能性がある。

この問題はvim-modelineが文字コードをセットする処理と、auto-encodingが文字コードを判定してセットする処理が同じようなタイミングで実行されている[^1]ために発生する。
私の環境で試したところ常時auto-encodingの処理が後に実行されて`utf8`がセットされることとなったが、場合によってはvim-modelineの処理のほうが後に実行される可能性もある。

## 対処

vim-modeline側でauto-encodingの処理終了後にモードラインの解析、文字コードのセットを行えれば一番いいのだが、auto-encodingの処理終了を取得することができないためvim-modeline単体ではどうしようもない。
そのため、auto-encodingが有効になっているかどうかをvim-modelineで判定し、有効となっていたら警告を表示するように修正してリリースを行った。
もし警告が出た場合、ファイルを開いた後に`vim-modeline:detect`コマンドを実行して再度モードラインの設定値を反映させてほしい。

## 問題

auto-encodingを利用している場合は警告が出るが、`init.coffee`で文字コードを判定するようにしていたり、別パッケージで文字コードをセットするようにしている場合は警告が出ない。
今回たまたまauto-encodingが有効になっているかの判定が出来たので実装したが、その他の場合の判定は今のところ思いつかないため対応は未定である[^2]。

[^1]: vim-modelineは`observeTextEditors`を利用しているが、auto-encodingは`onDidOpen`を利用している。実行タイミングとしては`observeTextEditors`のほうが早いため基本的にはauto-encodingの処理のほうが後に実行されることになるが、ご存知の通り処理は非同期で進むためvim-modelineの処理が何かしらの理由でもたついていた場合はauto-encodingの処理が終わってからモードラインの設定値が反映される可能性もある。
[^2]: `onDidChangeEncoding`をフックしてモードラインの設定値と比較することも考えているが、[encoding-selector](https://atom.io/packages/encoding-selector)で手動で変更した際にも警告が出るのはあまりよろしくないと思い保留している。
qlobaで新しいエントリーがあったことをSlackに通知する

[qloba](https://www.qloba.com/) はランディングページなど、フォーム付きのホームページをノンコーディングで作成できるサービスです。現在はβ版が提供されています。

qloba のフォームにエントリーがあったとき、qlobaのWebhookと[Slack](https://slack.com/)のIncoming Webhookを連携して、Slackに通知を送信する方法を紹介してみます。

# Slack側の設定

qlobaの通知を受け取るチャンネルを作成します。
![slack1.png](https://qiita-image-store.s3.amazonaws.com/0/72884/06f5f7c9-c518-8a7d-3597-0ebe988b8547.png)

## Slackにメッセージを送信する

SlackのAPIでメッセージを送信する方法は大きくふたつあります。
- Web APIを使う方法
- Incoming Webhookを使う方法

Web APIを使う場合は、任意のユーザーでAPIトークンを取得する必要があります。今回はImcoming Webhookを使うことにします。

## Incoming Webhookの作成

Incoming Webhook Integrationのページを開きます。
https://www.slack.com/services/new/incoming-webhook

![slack2.png](https://qiita-image-store.s3.amazonaws.com/0/72884/1c87c468-cda8-0848-8ddf-7b46a4d875ce.png)

メッセージを送信したいチャンネルを選択して、「Add Incoming WebHooks Integration」ボタンを押します。

Incoming Webhookが作成されます。

作成後のページに、Incoming WebhookのURLが表示されます。こちらはあとで利用します。ボットの名前や、アイコンのカスタマイズを行うこともできます。

![slack3.png](https://qiita-image-store.s3.amazonaws.com/0/72884/87d4f014-5e20-c197-f368-fc4b01723912.png)


これでSlack側の準備は完了です。

## qloba側の設定

ページ公開後にプロジェクトの設定画面を開き、「サービス連携」 > 「Webフックを追加」の画面で以下のように設定します。

### サービス

その他

### URL

作成したIncoming WebhookのURL

### カスタムデータ

```json
  {
    "text": "%name%さんからの応募がありました。<%url%|詳細はこちらから>"
  }
```

%name%などのプレイスホルダーは、実行時に置換されます。

## テストエントリーを送ってみる

![slack4.png](https://qiita-image-store.s3.amazonaws.com/0/72884/8798c4cc-1e13-5a2e-b69e-9b9f6e0f728a.png)

できました！　これで大事なエントリーを見逃さずにすみますね。
S3にクライアントから直接アップロードする方法（Ruby+curlコマンドでの実演）

このライブラリを使うのが良い、とか、無駄にレイヤー重ねる記事が多くて辟易したので、シンプルなのを提示しておきます。
ファイルの分離の仕方はRailsっぽく書いてますが、Railsには依存しない話です。

（ちなみに、fogを使っても出来そうですが、fogを使うまでもなさそうです。）

## 認証済みURLを作る

```Gemfile.rb
gem 'aws-sdk'
```

```rb
# Railsならinitializerとかその辺で
Aws.config.update({
    region: 'ap-northeast-1',
    credentials: Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])
  })
S3_BUCKET = Aws::S3::Resource.new.bucket(ENV['AWS_S3_BUCKET'])
# あなたが神経質なら定数に入れずにシングルトンクラス作っても良いです
```

```hoge.rake
# 先頭にスラッシュはつけない方がS3上のパスは綺麗になる
path = 'where/you/want/to/locate/file.png'
signed_url = S3_BUCKET.object(path).presigned_url(:put, expires_in: 36000)
puts signed_url
```

## curlで送る

```bash
# signed_urlの所に上のrubyで作ったURLを貼る
# カレントディレクトリに debug.png というファイルがある想定
curl -X PUT --data-binary '@debug.png' signed_url
```

というわけで、curlコマンドでHTTPリクエストの形が明瞭になったので、あとはブラウザのJSなりiOS/Androidのコードなり、どこからでもアップロードできますね。めでたしめでたし。

## 蛇足: なんでputなのか？

REST的に、POSTは冪当性のない操作、PUTは冪当性のある操作に使うべきだからです。
Electronが作成・保存するlocalStorageなどのキャッシュディレクトリ


# 保存場所(Windows7の場合)

C:\Users\%USERNAME%\AppData\Roaming\\**package.jsonのnameフィールド**\

# 検証環境

* Windows7 Professional 64bit
* electron-prebuilt 0.36.4
* node v5.2.0

***

Electronを触ることは簡単ですが、余計なゴミ[^1]をできるだけ出したくない。
そこで、ローカルに値を保存できる**localStorage**を使うときは場所を調べておこうと思ったが、検索にうまくひっかからなかった。
しかたがないのでファイルモニターを使って書き込みを監視した。
調べると、**localStorage**以外にもキャッシュやCookieも同ディレクトリに保存していた。
**localStorage**を使わないから余計なファイルが残らないわけではないようだ。

同じアプリでもpackage.jsonのnameフィールドを変えると、
変えた名前のディレクトリが作成されたので、これに依存していると言っていいと思う。

不要になったアプリ名のディレクトリをまるごと削除すればよさそうなので、これで神経質な人も気兼ねなく開発できそう。

# 追記:main process から取得 (全環境対応)

投稿直後にもっといいやりかたをよく思いつく。
(比較的マイナーな)localStorageに固執していたから検索に引っかからなかった。
「Electron Cookie directory」などと検索したら目的に達した。
しかもドキュメントにしっかり書いていた。


* <i class="fa fa-external-link"/> [electron/app.md · atom/electron]
* <i class="fa fa-external-link"/> [Electron Documentation - App]

※どちらも同じ

main processで
`app.getPath('userData')`を実行すれば取得できる。
これでWindows以外の場合も楽に取得できるだろう。

main processは完璧にクイックスタートのコピペだった。
ちゃんと読もう。

main processでの`console.log()`もまた一癖あるので注意。

[Electron Documentation - App]:http://electron.atom.io/docs/v0.36.5/api/app/#app-getpath-name
[electron/app.md · atom/electron]:https://github.com/atom/electron/blob/2af7c37d13cfeabbcf548f063e83321cb39b850f/docs/api/app.md#appgetpathname
[^1]: アプリ削除後も残るようなファイル
ターミナルが「Write failed: Broken pipe」で切断される時の対処法


ターミナルでAWSに接続していて、しばらく操作していないと以下の表示と共に接続が切れる事が多々ある。

```
Write failed: Broken pipe
```


ログを見ながら開発なんかしてるとコード書いてる間によく切れて、さすがに効率が悪く重い腰を上げてググッてみたら一発で出てきました。
もっと早く調べとけばよかった...。

参考
[「Write failed: Broken pipe」によりsshが切断された時の対処法](http://qiita.com/xxthermidorxx/items/2f4ced5edf306fdd9dfb "「Write failed: Broken pipe」によりsshが切断された時の対処法")


クライアント側の対処として```~/.ssh/config```に以下を記述。

```
ServerAliveInterval 15
ServerAliveCountMax 10
```

15秒ごとに10回応答確認をサーバに送り、それでも応答がない場合にタイムアウトになるという設定みたい。

サーバー側の対処もあるようですが、今回は実行していないので、省略。
pkill使って複数のプロセスを一気に殺す

実行中のプロセスを殺しない時、今まで以下のやり方です。
非常に面倒で退屈だった。

```
# ps -ef | grep hoge
　　111    .....   hoge1
　　222    .....   hoge2
　　333    .....   hoge2

# kill 111
# kill 222
# kill 333

```

**pkill**使う非常に便利です。

```
# pkill -f 'hoge'
```

便利ですが、ちょっとリスキー、慎重に使ってください。
JavaでSSL通信のリンク集


仕事でハマったのでメモ。

#そもそもSSLの仕組み
仕様自体が難しいので、足場固めが必要ですね。。

こちらが非常にわかりやすいです。コメントも必読。
[httpsだからというだけで安全？調べたら怖くなってきたSSLの話!？](http://qiita.com/kuni-nakaji/items/5118b23bf2ea44fed96e)

こちらもわかりやすいです。
[理解してるつもりの SSL/TLS でも、もっと理解したら面白かった話](http://tkengo.github.io/blog/2015/12/01/https-details/)

#自己署名証明書（オレオレ証明書）の対応
[CentOS 6.5 OpenSSLでオレオレ認証局](http://qiita.com/T_Tsan/items/632e83167bbc3a90ad4e)
検証環境の作成は、こちらを参考にさせてもらいました。すごく丁寧。

##UrlConnenction
例外の説明や、SSL通信のデバッグが大変ためになりました。
[JavaでSSL証明書の検証無効化、ホスト名検証の無効化…とデバッグ](http://d.hatena.ne.jp/Kazuhira/20141004/1412441208)

##HttpClient
StackOverFlowのコード、最新(2015/1/26で4.5.1)だとdeprecatedだらけだなあ。。
と思ってたら本家にサンプルありました。
https://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientCustomSSL.java


#古いバージョンのJavaで「Could not generate DH keypair」Runtime例外が発生する
例えば、JDK1.6.0_65でApacheが以下の設定だと発生します。
[ApacheでOpenSSLのセキュリティを強化する](http://qiita.com/sion_cojp/items/99fee211ceace3f76cff)

回避策
[Java: Why does SSL handshake give 'Could not generate DH keypair' exception?](http://stackoverflow.com/questions/6851461/java-why-does-ssl-handshake-give-could-not-generate-dh-keypair-exception)
JavaバージョンあげるかJCE Providerを設定するのが正攻法。

[Java 7 and Could not generate DH keypair](http://stackoverflow.com/questions/10687200/java-7-and-could-not-generate-dh-keypair)
こちらのChristophの回答だと、環境変更できない場合の回避策があります。
取扱注意ではありますが。
MozcでもMacっぽいキーの割り当て

Mac(JIS配列)にある、英数/かなを、LinuxのMozcにおいて、無変換/変換で再現しようというお話。

Mozcのプロパティを開きます。
![Screenshot from 2016-01-26 14:49:28.png](https://qiita-image-store.s3.amazonaws.com/0/76668/208488be-0894-6edb-1a2e-f79d62fe05a2.png)

次に、キー設定の選択の隣にある編集というボタンを押します。
![Screenshot from 2016-01-26 14:50:13.png](https://qiita-image-store.s3.amazonaws.com/0/76668/a4219094-b5dc-5abb-fdbd-cca4c3c78860.png)

編集▼→エントリーを追加で下図の下2行のものを追加します。
![Screenshot from 2016-01-26 14:50:48.png](https://qiita-image-store.s3.amazonaws.com/0/76668/48d9b9f8-c99e-d8d8-b9a0-3ce702a81bc9.png)

これでOK。

[参照]
https://blog.alpha-kai-net.info/?p=1167
RSpecでUser-Agentを書き換える方法

[Rails4の場合はこれ] (http://qiita.com/semind/items/18a9461f46d513a7ed4e)

```lang:Rails4
request.env["HTTP_USER_AGENT"] = "hogehoge"
```

Rails3は、

```lang:Rails3
request.env["User-Agent"] = "hogehoge"
```

何でかは忘れましたがいろいろトライ＆エラーした結果です
FuelPHP でOrmを使用したModelのphpUnit


FuelPHPでORMを使用した形でのphpUnitの書き方。

SQLの発行するときはfrom_cacheをつけないとキャッシュが残ってしまい
後のテストケースに影響する。

例）
$rows = Model_XXXX::query()->from_cache(false)->get();
新卒採用で聞かれそうな技術質問まとめ

こんにちは
初投稿です。

就活・・・そろそろはじまりますね

はじまってからあたふたするのは嫌なのでとりあえず技術的な質問には全部対応できるようになりたいと思う今日この頃。


いざ聞かれると基礎的なところも答えられなかったりします（あ、わかるのに説明できない・・・!）っていうことが多々あるかと。


以下に思いつく限りの質問を載せていきます。
解説もそのうち載せます・・・

###1.基礎編

-クラスとインスタンスの違い
-インターフェースと抽象クラスをどんな基準で使い分けているか
-継承とコンポジションをどんな基準で使い分けているか
-static/finalの意味
-List/Set/Mapの違い
-参照渡し/値渡しとは
-O(n)とはどういう意味か
-ミニマックス法とは何か
-遺伝的アルゴリズムとは何か


###2.研究について
-理系だと研究についてはほぼ確実に聞かれます
-なぜその研究をしようと思ったのか
-具体的にどうか
-その研究に出てくる単語の説明・問題点などは一通り言えるように


###3.書かされる系
-ソートアルゴリズム
-素数アルゴリズム
-階乗アルゴリズム
-プロコンみたいな問題


###4.その他経験系
-使用 OS は何か (Linux/UNIX)
-どれくらい使えるか
-grep/tar/find を使ったことはあるか
-Webフレームワークは何を使っているか
-普段技術情報をどこから得ているのか



自分が思いつくのはこんな感じ
実装してても内部の処理について深く知らなかったので、聞かれて悔しい気持ちにならないように
[Swift] iOS でテキストの読み上げをする


# AVSpeechSynthesizer を使って音声読み上げをする

iOS アプリで音声読み上げをやりたくなったので調べてみたメモです。

AVSpeechSynthesizer というクラスを使うと簡単に読み上げができました。

1. AVSpeechSynthesizer を生成
1. 読み上げるテキストを引数に AVSpeechUtterance を生成
1. voice プロパティに言語指定した Voice を指定（ここでは ja-JP） 
1. 読み上げ

という順で処理を行います。コードにすると下記の通り。

```
let talker = AVSpeechSynthesizer()
let utterance = AVSpeechUtterance(string: text)
utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP")
talker.speakUtterance(utterance)        
```

# テキストをひとつずつ読み上げていく

ただ上記の処理では複数のテキストを読み上げる場合などに同時に読み上げてしまいます。そこでシングルトンを作って読み上げ処理を１つずつ行うようにしてみました。

やっていることは簡単で、

2. 1. 読み上げたいテキストをリストに追加
2. リストにあるテキストを音声読み上げ(再生は同時にひとつだけ)
3. 読み上げ終了、2に戻る

をやっています。

```
import UIKit
import AVFoundation

final class TtsManager: NSObject, AVSpeechSynthesizerDelegate {
    
    static let sharedInstance = TtsManager()

    var texts = [String]()
    let talker = AVSpeechSynthesizer()

    private override init() {
        super.init()
        talker.delegate = self
    }

    func append(text: String) {
        texts.append(text)
        if texts.count == 1 {
            play(texts[0])
        }
    }

    // MARK: AVSpeechSynthesizerDelegate
    func speechSynthesizer(synthesizer: AVSpeechSynthesizer, didFinishSpeechUtterance utterance: AVSpeechUtterance) {
        if texts.count > 0 {
            texts.removeFirst()
            if texts.count > 0 {
                play(texts[0])
            }
        } else {
            // speech finished
        }
    }

    func clear() {
        texts.removeAll()
        if talker.speaking {
            talker.stopSpeakingAtBoundary(.Immediate)
        }
    }

    private func play(text: String) {
        let utterance = AVSpeechUtterance(string: text)
        utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP")
        talker.speakUtterance(utterance)
    }
    
}

```
英語でググるときのコツ

記事の内容はこちらを参照してください。
https://mishimay.github.io/159ce8cf7649f8740334/
<!--

# 英語版Googleを使う

日本から https://www.google.com へアクセスすると日本語にローカライズされたページが表示され、検索結果には日本語のページが優先的に表示されてしまいます。

英語版Googleを使用するには **https://www.google.com/?hl=en** へアクセスします。



# 便利な検索ワード


## ~~ not working
~~が機能しない、働かない

## detect ~~
~~を検出する、検知する

## prevent ~~
~~を防ぐ

## avoid ~~
~~を避ける

## specific ~~
~~特有の、\~~に対してだけ


# Stack Overflow 内を検索する
Stack Overflow とは世界最大級のプログラマ向けQ&Aサービスです。
困っていることはここで探すとすぐに見つかることが多いです。

このサイト内に限定して検索するには `site:stackoverflow.com` を検索ワードに付け加えます。


# 文を `" "` で囲う
`" "` で囲うと、囲った文をひとまとまりの検索ワードとして指定できます。

エラーメッセージを検索する場合など、単語がスペースで分割されないので便利です。

e.g. 
`"CGBitmapContextCreate: unsupported parameter combination"`


-->
C++ > 複数回条件成立かどうかの検知 > 対象は50項目


以下の「やりたいこと」に記載があるように、複数回条件が成立しているかを検知したい。

[仕組み @ mindmup](https://atlas.mindmup.com/2016/01/eb42adf0a61501337c1807ffef1f7e0d/_conditionestablished_160126/index.html)

STLやテンプレートを使ってシンプルにできるかもしれないが、まだ自分には馴染みがないため地道に実装する。

こういうクラスは一度作ってしまえば、今後の他のソフトウェア実装時に使いまわしできる、と期待している。

関数名は作りながら、もっといい名前を模索する。
cocoapodsで [!] Unable to find a specification for `ライブラリ名`のとき


該当ディレクトリで
`$ pod install`したら



こんなエラーが出てくる
`[!] Unable to find a specification for "ライブラリ名"`


その時はmasterにそのライブラリが入ってるか確認
`$ pod search "検索文言"`

検索文言にSlackといれました。


はいってたらこんな感じに該当ライブラリが出る

```
-> SlackTextViewController (1.9.1)
   A drop-in UIViewController subclass with a custom growing text input and
   other useful messaging features.
   pod 'SlackTextViewController', '~> 1.9.1'
   - Homepage: https://slack.com/
   - Source:   https://github.com/slackhq/SlackTextViewController.git
   - Versions: 1.9.1, 1.9, 1.8, 1.7.2, 1.7.1, 1.7, 1.6, 1.5.2, 1.5, 1.4.1, 1.4,
   1.3.3, 1.3.2, 1.3.1, 1.3, 1.2.10, 1.2.9, 1.2.8, 1.2.7, 1.2.6, 1.2.5, 1.2.4,
   1.2.3, 1.2.2, 1.2.1, 1.2, 1.1.1, 1.1, 1.0 [master repo]

```

入ってなかったらこんな感じ

```
$ pod search "hogenyan"
[!] Unable to find a pod with name matching "hogenyan"
```


ちゃんとlistにはいってるじゃない！
絶対cocoapodsのmasterがおかしい！

っていうとき

cocoapodsのmaster（ライブラリをversion別に管理しているところ）が壊れちゃってる時もあります



わたしはいつも下記コマンドでなおしてます
（cocoapodsの公式で言ってたきがする)


```

$ sudo rm -fr ~/.cocoapods/repos/master/


$ pod setup
ーーーーSetup completed

$ pod install

```

毎回うんざりするんですけどこのなおし方で本当に良いのかな〜
ローカル環境にnode.jsをインストール


node.jsのインストールと初期設定まで。

## 1\.インストール環境

MacOS 10.9.4  
Git 2.0.0

## 2\.nvmインストール

node.jsのバージョン管理を行う為のツール。  
これがあると複数バージョンのインストールとバージョンの切り替えが楽になる。  
インストールはgithubからソースを取得して読み込むだけ。

<pre>$ git clone git://github.com/creationix/nvm.git ~/.nvm
$ source ~/.nvm/nvm.sh
$ nvm help
</pre>

## 3\.インストール可能なバージョンの確認

インストール可能なバージョンリストを表示。

<pre>$ nvm ls-remote
</pre>

## 4\.node.jsをインストール

インストールしたいバージョンを指定してインストール。

<pre>$ nvm install 0.10.30
</pre>

## 5\.インストール確認

下記コマンドを実行してバージョンが表示されればインストール成功。

<pre>$ node -v
v0.10.30
</pre>

## 6\.nvmの設定

デフォルトで使用するバージョンを指定する。

<pre>$ nvm alias default v0.10.30
default -> v0.10.30
</pre>

毎回nvm.shを読み込むのが面倒なので.bash_profileへ以下を追記。

vi ~/.bash_profile  
if [[ -s ~/.nvm/nvm.sh ]];  
then source ~/.nvm/nvm.sh  
fi
node.jsでHello World


## 1\.Hello Worldを表示させる

下記のソースを任意のディレクトリで保存します。  
ここではexample.jsという名前で作成しました。

<pre>var sys = require('sys');
var http = require('http');
var server = http.createServer(
    function (request, response) {
        response.writeHead(200, {'Content-Type': 'text/plain'});
        response.write('Hello World!!');
        response.end();
    }
).listen(3000);
sys.log('Server running at http://localhost:3000/');
</pre>

## 2\.example.jsを実行

<pre>$ node example.js
7 Aug 09:50:00 - Server running at http://localhost:3000/
</pre>

## 3\.ブラウザからアクセス

ブラウザから以下へアクセス

<pre>http://localhost:3000
</pre>

Hello Worldと表示されれば成功です。
横幅いっぱいに表示出来るJqueryスライダー


Plugin: jquery.fullwidthslider.1.0  
提供元: [TARO_UNIT][1]さん

## 1\.ダウンロード

以下のURLからダウンロード  
<http://www.torounit.com/blog/2011/12/05/1048/>

## 2\.インストール

headタグ内にダウンロードしてきたファイルを読み込む  


<pre>&lt;script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js" &gt;&lt;/script&gt;
&lt;script type="text/javascript" src="js/jquery.fullwidthslider.1.0.js"&gt;&lt;/script&gt;
</pre>

※パスやファイル名は適宜変えてください。

## 3\.実装方法

### HTML

<pre>&lt;div class="slide"&gt;
    &lt;ul class="stage"&gt;
        &lt;li&gt;&lt;img src="slideImage/demo1.jpg" alt="" width="640" height="480" /&gt;&lt;/li&gt;
        &lt;li&gt;&lt;img src="slideImage/demo2.jpg" alt="" width="640" height="480" /&gt;&lt;/li&gt;
        &lt;li&gt;&lt;img src="slideImage/demo3.jpg" alt="" width="640" height="480" /&gt;&lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;
</pre>

### JavaScript

<pre>$(function(){
    $(".slide").fullWidthSlider({
        width:640,
        height:480
    });
});
</pre>

## 4\.オプション

| オプション          | 説明                  | デフォルト      |
|:-------------- |:------------------- |:---------- |
| width          | スライドの横幅             | 960        |
| height         | スライドの高さ             | 400        |
| time           | 切り替わるスピード(ミリ秒)      | 5000       |
| slideStage     | スライドのステージ           |            |
| (スライド群を格納する要素) | .stage              |            |
| slideMember    | スライドする要素            | li         |
| nav            | スライドのナビゲーションを使うかどうか | true       |
| slideNavi      | ナビゲーションのクラス         | .slideNavi |
| mouseoverStop  | マウスオーバーで止める         | true       |

 [1]: http://www.torounit.com/
CentOS6.6にEPELとRemiをyumに追加する


新規でCentOSをインストールしたら必ずやってることでいつも忘れるのでメモ代わりに EPELとRemiをyumリポジトリに追加する。

# リポジトリインストール

EPELはyumコマンドで楽々インストール

<pre>yum install epel-release
</pre>

続いてRemiのインストール 初めにGPGキーをインポート

<pre>rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
</pre>

次にインストール

<pre>rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
</pre>

インストールしたEPELとRemiの初期設定を行います。 デフォルト無効にしておいて必要なときだけ使用するように変更していきます。 enabledが0に変更する。

<pre>vi /etc/yum.repos.d/remi.repo
vi /etc/yum.repos.d/epel.repo
</pre>

# 使い方

yumのオプションで適用するリポジトリを指定するだけで使用できます。

<pre>yum --enablerepo=[remi or epel] info php
</pre>
特定のIPからのみSSH接続を許可


前にOpenVPNを構築して開発環境を作成したが、  
SSH接続をOpenVPN経由でのみ許可したかったためその方法を紹介します。

### 1\. /etc/hosts.denyに追加

初めに拒否リストを編集してすべての接続を拒否する

<pre>vi /etc/hosts.deny

#すべての接続を拒否
sshd : ALL
</pre>

### 2\. 許可するIPを/etc/hosts.allowに追加

次に許可したいIPをここに追加

<pre>vi /etc/hosts.allow

#接続を許可したいIPを追記
sshd: 10.8.
sshd: 127.0.0.1
</pre>

これで/etc/hosts.allowに追加したIPからのみSSH接続ができるようになりました。
WKT形式をGeoJSON形式に変換する



デスクトップGISの世界で使われているファイルを、ウェブGISで使おうとする際に、ファイルフォーマットの変換が必要になる場合があります。

ここではWKTについてふれます。

## WKT (Well-known text)とは
ジオメトリ・オブジェクトを地図上に表現するためのマークアップ言語。詳しくは以下を参照ください。
https://ja.wikipedia.org/wiki/Well-known_text

## ライブラリの選定
ウェブGISで使うためにGeoJSONに変換します。
変換ライブラリには以下があります。

- Terraformer - Well Known Text Parser(Esri Portland R&D Center)
http://terraformer.io/wkt-parser/

- wellknown.js(MapBox)
https://github.com/mapbox/wellknown

wellknown.jsはnodeモジュールとして配布されているので、今回はブラウザでのオン・ザ・フライ変換も視野に入れてTerraformerを採用します。

## 使い方
変換自体はとても簡単で、以下2ファイルを読み込み、

```
<script src="terraformer.min.js"></script>
<script src="terraformer-wkt-parser.min.js"></script>
```


```
var geoJSONSingle = Terraformer.WKT.parse( wktSingle );
```
で変換できます。

変換前の例

```
MULTIPOINT ((10 40), (40 30), (20 20), (30 10))
```

変換後の例

```
{"type":"MultiPoint","coordinates":[[10,40],[40,30],[20,20],[30,10]],"bbox":[10,10,40,40]}
```


GeoJSONオブジェクトとして生成したい場合には

```
//wktObj...変換前のWKTデータ、geoJSONObj...変換後のGeoJsonデータ
var _geoArray = new Array();

for (var i=0; i<wktObj.length; i++) {
	var _o = new Object();
	
	_o["type"] = "Feature";
	_o["geometry"] = Terraformer.WKT.parse( wktObj[i] );
	_o["properties"] = {"country_id": "some_id",
							"count": "some_count"};
	_geoArray[i] = _a;
};

var geoJSONObj = {
"type": "FeatureCollection"
};

geoJSONObj["features"] = _geoArray;
```

などとします。

## 注意
WKTやGeoJSONでは、扱うジオメトリ・オブジェクトの種類によってデータフォーマットが異なります。数値データを入れ子にしている括弧の数の違いに注目してください。

- WKT

https://ja.wikipedia.org/wiki/Well-known_text#.E3.82.B8.E3.82.AA.E3.83.A1.E3.83.88.E3.83.AA.E3.82.AA.E3.83.96.E3.82.B8.E3.82.A7.E3.82.AF.E3.83.88

- GeoJSON

http://geojson.org/geojson-spec.html#appendix-a-geometry-examples
luaを有効にしてvimをインストール

入力補完などを使う際にluaが必要になった為vimを手動で再インストール したときの手順を纏めておきます。

環境はMac＋Homebrewを使用してインストールしたのでHomebrewがインストールされてない 場合は適宜環境に合わせて入れてください。 Homebrewのインストール方法は [こちら][1]から

## 1\.luajitのインストール

<pre>cd /usr/local/src
git clone http://luajit.org/git/luajit-2.0.git luajit
cd luajit
sudo make
sudo make install
</pre>

## 2\.Homebrewのアップデート

<pre>brew update
</pre>

## 3\.luaをインストール

<pre>brew install lua
</pre>

## 4\.hgをインストール

<pre>brew install hg
</pre>

## 5\.vimをインストール

<pre>hg clone https://vim.googlecode.com/hg/ /usr/local/src/vim
cd /usr/local/src/vim
make clean
./configure --prefix=/usr/local --enable-multibyte --enable-xim --enable-fontset --enable-rubyinterp --enable-perlinterp --with-features=huge --disable-selinux --enable-luainterp=yes --with-lua-prefix=/usr/local --with-luajit
make
make install
</pre>

## 6\.インストール後の確認

<pre>/usr/local/bin/vim --version | grep lua
</pre>

## 7\.パスの確認

<pre>which vim
</pre>

 [1]: http://blog.sims625.com/homebrew%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/ "こちら"
テスト環境をDockerで作成する(Webサーバ)

## ■目的

[前回](http://qiita.com/nagi244/items/10623f509bba6887192d)、Dockerを色々触ってみてなんとなく感触が掴めました。
今回は理想形への第一歩として「Webサーバ」をDockerで作成してみたいと思います。

【追記】
有識者より「**1コンテナ1プロセス**」が良い、とご教授いただいたので、「Apache」と「Java」は分けて考えた方が良さそうです。

## ■Webサーバの構成

OSは「CentOS 6.7」、「Apache」と「Java」をインストールしたいので、`docker pull`でイメージをダウンロードできなさそうです。
(上記構成のイメージが配布されているかもしれませんが...)
「Dockerfile」を作成して、自前でイメージを作成することにします。

## ■手順

### 1. Dockerfile作成

任意の場所に「Dockerfile」を作成する
`$ touch Dockerfile`

### 2. Dockerfileに以下を記述する

```yaml:Dockerfile
# CentOS 6.7のイメージ
FROM centos:6.7

# 管理者
MAINTAINER nagi244<hoge@hoge.co.jp>

# システムアップデートと「wget」インストール
RUN yum -y update && yum -y install wget && yum clean all

# Apacheインストール
RUN yum -y install httpd && yum clean all

# JDKインストール
RUN wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u71-b15/jdk-8u71-linux-x64.rpm" \
&& yum -y localinstall jdk-8u71-linux-x64.rpm \
&& yum clean all \
&& rm jdk-8u71-linux-x64.rpm

# コンテナ内のポート番号
EXPOSE 80

# コンテナ内でフォアグラウンドで実行
ENTRYPOINT ["/usr/sbin/httpd"]
CMD ["-D", "FOREGROUND"]
```

JDKのバージョンは、[こちら](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)でURLをコピーしてお好みのバージョンをインストールできます。

### 3. イメージ作成

Dockerfileからイメージを作成するには、`docker build`コマンドを使用します。
「-t」オプションでイメージのリポジトリ名を付けられるようです。今回はわかりやすく「web-server」としました。
「.」はDockerfileの場所です。Dockerfileと同じ場所でコマンドを叩いています。
`$ docker build -t web-server .`

成功したら、`docker images`コマンドでイメージができたか確認します。

### 4. Docker起動

以下のコマンドで、Dockerをバックグランウンドで起動します。
ポート番号「8080」は、外部からコンテナにアクセスする際に使用するポート番号のようです。

`$ docker run --name hoge1 -d -p 8080:80 web-server`

### 5. 動作確認

ホストのブラウザで「http://[VMのIPアドレス]:8080/」にアクセスしてみます。「Apache 2 Test Page」が表示されました！
無事WebサーバをDockerで作成できました。
webglでGLSLを勉強してみる。

最もシンプルな書き方として、画像を反映させる場合には、

仮説を元に検証していくので間違えもあるかもしれません。

```lang:glsl
<script id="vs" type="x-shader/x-vertex">
attribute vec3 position;
attribute vec2 texCoord;
varying vec2 vTexCoord;
void main(){
	vTexCoord = texCoord;
	gl_Position = vec4(position, 1.0);
}
</script>
<script id="fs" type="x-shader/x-fragment">
precision mediump float;
varying vec2 vTexCoord;
uniform sampler2D texture;
void main(){
	 highp vec4 color   = texture2D(texture, vTexCoord);
	 gl_FragColor = color;
}
</script>
```
と思う。



attribute ：頂点座標とか、テクスチャ画像の座標とか、何もしなくても、この中に値が含まれている
varying ：GLって２つのGLSL?を書くけど、互いに独立してる感じ。両方の受け渡しに利用する。

precision mediump float：計算の制度でmediumpをlowpとかに出来る感じ。使って効果を感じないけど、計算の時の小数点の数などによるのかな？と。

uniform：呼び出しの関数から値を渡す事ができる

var uniLocation = {};
uniLocation.texture = gl.getUniformLocation(programs, 'texture');
・・・
gl.uniform1i(uniLocation.texture, 0);
・・描画処理

みたいにする事で、textureに0を登録。（画像は数字で管理されてるはず。何番目のエリアに格納されてる。とか）

なので、これで、登録してある画像のデータを送信。って感じになる。


和訳をすると、
>各ポジションに対して、テクスチャの座標系をそのまま反映して、色を取得。
>そして、その色をそのまま描画。

みたいになっている。

で、
vTexCoord を変更仕様とすると上の式では登録ができるが、下の式だと変更はできなかったりもする。

```lang:glsl
//vTexCoord = texCoord;
vTexCoord = vec2(texCoord.x*2.0,texCoord.y);
```

例えば、こんな感じに変更をすると、横幅をテクスチャのに対して通常の倍の長さを割り当てるので、横幅が2分の1になる。


そして、今進めてるのが、

screenっていう名称で

[128 / 255, 0, 0, 1]

みたいなRGBAを登録して中に読み込みたい。


gl.uniform4f(gl.getUniformLocation(programs, 'screen'), 128 / 255, 0, 0, 1);

みたいなのを書くと、
uniform vec4 screen;

でglslの中で値が取得できる。

uniform4i
でやっていたら動かなかったのだけど、

iってintって意味で、fがfloatで、浮動小数点があるので、ああ、fだなって（笑）

screenっていうので、えんじ色のデータが中で取り出せるようになりました。

uniform1fとかだと一つのfloatを送れるなど。で、上と下両方で利用できるので制御に使いやすい。


これである程度読めたりするのかと。
InterfaceBuilder で実装した UIScreenEdgePanGestureRecognizer が効かない

#前提

iOS8.x

#現象
xib, storyboard などの InterfaceBuilder で 
UIScreenEdgePanGestureRecognizer を実装すると機能しない

#対応

仕方ないのでコードで実装しました。


```swift:ViewController.swift
private var screenEdgePanGestureRecognizer: UIScreenEdgePanGestureRecognizer!

override func viewDidLoad() {
	super.viewDidLoad()
	screenEdgePanGestureRecognizer =
	 UIScreenEdgePanGestureRecognizer(target: self, action: Selector("migiSwipe:"))
	screenEdgePanGestureRecognizer.edges = .Left
	self.view.addGestureRecognizer(screenEdgePanGestureRecognizer)
	screenEdgePanGestureRecognizer.delegate = self
}

func migiSwipe(sender: AnyObject) {
	// スワイプ時の処理を記述
}
```





この問題は iOS8.x で発生していましたが、iOS9 アップデート後発生しなくなりました。



#参考
- [How do I set up an UIScreenEdgePanGestureRecognizer using Interface Builder?](http://stackoverflow.com/questions/26256985/how-do-i-set-up-an-uiscreenedgepangesturerecognizer-using-interface-builder)
Proxy に負けないで

## yum

##### 一時的に

    # export http(s)_proxy=http://<PROXY_IP>:<PROXY_PORT>

##### 恒久的に

/etc/yum.conf に追加

    proxy=http://<PROXY_IP>:<PROXY_PORT>


## rpm

##### 一時的に

    rpm --httpproxy <PROXY_IP> --httpport <PROXY_PORT>


## apt-get

##### 恒久的に

/etc/apt/apt.conf に追加

    Acquire::http::proxy "http://<PROXY_IP>:<PROXY_PORT>";

## wget

##### 一時的に

    # export http(s)_proxy=http://<PROXY_IP>:<PROXY_PORT>

##### 恒久的に

* 個別ユーザーに

~/.wgetrc に追加

    http_proxy=http://<PROXY_IP>:<PROXY_PORT>

* 全ユーザーに

/etc/wgetrc に追加

    http_proxy=http://<PROXY_IP>:<PROXY_PORT>

## curl

##### 一時的に

    # curl -x <PROXY_IP>:<PROXY_PORT> -L <URL>

##### 恒久的に

* 個別ユーザーに

~/.curlrc に追加

    proxy = http://<PROXY_IP>:<PROXY_PORT>

## git

##### 恒久的に

    # git config --global http.proxy http://<PROXY_IP>:<PROXY_PORT>
    # git config --global https.proxy http://<PROXY_IP>:<PROXY_PORT>


## subversion

##### 恒久的に

* 個別ユーザーに

~/.subversion/servers に追加

    [global]
    http-proxy-host = <PROXY_IP>
    http-proxy-port = <PROXY_PORT>


## npm

##### 恒久的に

* npm コマンドで

```
# npm config set proxy http://<PROXY_IP>:<PROXY_PORT>
# npm config set https-proxy http://<PROXY_IP>:<PROXY_PORT>
```

## gem

##### 一時的に

* Gem コマンドで

```
# gem install <PKG> -r -p http://<PROXY_IP>:<PROXY_PORT>
```

* 環境変数で

````
# export http(s)_proxy=http://<PROXY_IP>:<PROXY_PORT>
````

##### 恒久的に

* 個別ユーザーに

~/.gemrc に追加

    http_proxy: http://<PROXY_IP>:<PROXY_PORT>


## bundler

##### 一時的に

* 環境変数で

````
# export http(s)_proxy=http://<PROXY_IP>:<PROXY_PORT>
````

## pip
##### 一時的に
* pip コマンドで

```
pip install <PKG> --proxy=http://<PROXY_IP>:<PROXY_PORT>
```

## vagrant

##### 一時的に

* 環境変数で

````
# export http(s)_proxy=http://<PROXY_IP>:<PROXY_PORT>
````

## http over telnet via proxy

    # telnet <PROXY_IP> <PROXY_PORT>
    
    GET http://www.example.com/ HTTP/1.1

## 環境変数を全体的に設定

##### 恒久的に

* 個別ユーザーに

下記のいずれかに追加
- ~/.bash_profile

    export http://<PROXY_IP>:<PROXY_PORT>
    export https://<PROXY_IP>:<PROXY_PORT>

* 全ユーザーに

下記のいずれかに追加
- /etc/environment

```
http://<PROXY_IP>:<PROXY_PORT>
https://<PROXY_IP>:<PROXY_PORT>
```

- /etc/profile
- /etc/profile.d/

```
export http://<PROXY_IP>:<PROXY_PORT>
export https://<PROXY_IP>:<PROXY_PORT>
```
SwiftのプロジェクトにGoogle Analytics SDKを導入する

分析ツールですが、やはりGoogle Analyticsが導入コストも低く、いろんな角度で分析できるので無難かなと思ってます。
Swiftのプロジェクトに導入するまでの手順をまとめました。

### Cocoapods

```pod:Podfile
pod 'GoogleAnalytics', '~> 3.13.0'
```

### Bridging-Headerに記述

```Example-Briding-Header.swift
...
#import "GAI.h"
#import "GAIFields.h"
#import "GAILogger.h"
#import "GAIDictionaryBuilder.h"
...
```

### 起動時のセットアップ

```AppDelegate.swift
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        ...
        AppDelegate.setupGoogleAnalytics()
        ...
    }

    ...
    var tracker: GAITracker?
    class func setupGoogleAnalytics() {
        GAI.sharedInstance().trackUncaughtExceptions = true
        GAI.sharedInstance().dispatchInterval = 20
#if DEBUG
        GAI.sharedInstance().dryRun = true
        GAI.sharedInstance().logger.logLevel = .Info
#else
        GAI.sharedInstance().dryRun = false
        GAI.sharedInstance().logger.logLevel = .None
#endif
        if let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
            appDelegate.tracker = GAI.sharedInstance().trackerWithTrackingId("UA-111111-1")
        }
    }
    ...
```

### スクリーンをTrackする

各UIViewControllerのviewWillAppearにて。

- `screenName` は設計によるので自由に設定する
- もちろん全てのクラスに下記を書くのは冗長なのでHelperとかExtensionとかで一行のメソッドにするか、親クラスでこれをやって継承するなどお好みで

```ExampleViewController.swift
override func viewWillAppear(animated: Bool) {
    if let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
        let bundleName = NSBundle.mainBundle().infoDictionary!["CFBundleName"] as! String
        let className = NSStringFromClass(type).componentsSeparatedByString(".").last!
        let screenName = [bundleName, className].joinWithSeparator(".")
        let build = GAIDictionaryBuilder.createScreenView().set(screenName, forKey: kGAIScreenName).build() as NSDictionary
        appDelegate.tracker?.send(build as [NSObject : AnyObject])
        appDelegate.tracker?.set(kGAIScreenName, value: nil)
    }
}

```

### イベントをTrackする

画面以外はイベントを設定するのが良いので、必要な箇所にて下記を記述する。

```SomeEventClass.swift
    if let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
        let build = GAIDictionaryBuilder.createEventWithCategory("category",action: "action",label: "label",value: 999).build() as [NSObject : AnyObject]
        appDelegate.tracker?.send(build)
    }
```
UI > Link > Stackoverflow > Error Message Text - Best Practices

どういうエラーメッセージを表示するのがいいか。

[Error Message Text - Best Practices]
(http://stackoverflow.com/questions/117083/error-message-text-best-practices)

ChrisNさんのリンク
[Link](https://msdn.microsoft.com/en-us/library/windows/desktop/dn742469.aspx)からたどれる以下の項目が参考になる。

- Error Messages
- Warning Messages
- Confirmations
- Notifications
Google Docs の更新を監視して更新があれば Gist に放り込んで差分をチェックする

Google Docs で1日に何度も更新されるドキュメントがある
手軽でよいのだが Read Only なので変更履歴すら見れない

更新通知や差分が全然わからん！誰かに聞かないと何もわからない状況
なんという屈辱…………許さへん……じぇったい許さへん……

# Gist

Github を利用するレベルの規模ではないので今回は Gist を利用する.
先に対象のGistを作成して更新するだけというシンプルなものにする.

```js:gist.gs
function updateGist(id, access_token, text) {
  var url = 'https://api.github.com' + '/gists/' + id + '?access_token=' + access_token;
  var payload = {
    'description': 'ドキュメントが更新されちょるばい！',
    'files': {
      'docs.html': {
        'content': text
      }
    }
  };
  var param = {
    'method': 'POST', // ほんとは patch
    'contentType': 'application/json',
    'payload': JSON.stringify(payload);
  };
  return UrlFetchApp.fetch(url, param);
}
```

# Slack

[以前](http://qiita.com/makietan/items/b8c71ae2df3481970893)も記事にした方法を利用する.

```js:slack.gs
function slack(text, channel, token) {
  var url = '';
  var parse = 'none';
  var payload = {
    'token': token,
    'channel': channel,
    'text': text,
    'username'; '小鳩',
    'parse': 'none',
    'icon_emoji': ':kobato:'
  };
  var param = {
    'method': 'POST',
    'payload': payload
  };
  return UrlFetchApp.fetch(url, param);
}
```

# Google Document to HTML

Google App Script だけでは [getAs()](https://developers.google.com/apps-script/reference/base/blob#getAs(String)) が PDF にしか変換できなかったので Drive API を利用することにした.

## 注意事項

Google デベロッパーコンソールを有効にして、[リソース] - [Google の拡張サービス…] で Drive API のスイッチをオンにしてください. 

![スクリーンショット 2016-01-26 11.33.45.png](https://qiita-image-store.s3.amazonaws.com/0/30241/26dd776d-af27-8550-25cf-22a4c99177ad.png)

## コード

```js:documentscript.gs
function getDocument(fileId) {
  var file = Drive.Files.get(fileId);
  var htmlLink = file.exportLinks['text/html'];
  if (!htmlLink) {
    throw 'File cannot be converted to HTML.';
  }
  var oAuthToken = ScriptApp.getOAuthToken();
  return UrlFetchApp.fetch(htmlLink, {
    headers: {
      'Authorization': 'Bearer ' + oAuthToken
    }
  });
}
```

HTML のリンクを開くための認証に苦戦したが、なんとなくググったところ
とても簡単な `  var oAuthToken = ScriptApp.getOAuthToken();` で終わった

# main

## 前提

- Slack のチャンネルは仮で '#kanshi'
- Slack のトークンは仮で 'token' を使う
- Gist の ID は仮で 'piyo' を使う
- Gist のアクセストークンは仮で 'access_token' を使う
- 最終更新日はセル (1, 1) にある
- ドキュメントの ID は仮で 'hoge' を使う
- スプレッドシートの URL は仮で 'fuga' を使う
- 1行で出力されると差分が見づらいので改行を無理やり入れる

## コード

```js:main.gs
function main() {
  var spreadsheet = SpreadsheetApp.openByUrl('fuga');
  var sheet = spreadsheet.getSheets()[0];
  var docsId = 'hoge';
  var file = DriveApp.getFileById(docsId);
  var oldLastUpdated = parseInt(sheet.getRange(1,1).getValue());
  var lastUpdated = file.getLastUpdated();

  if (oldLastUpdated < lastUpdated.getTime()) {
    updateGist('piyo', 'access_token', getDocument(docsId).toString().replace(/>/g,'>/n'));
    slack('ドキュメントが更新されちょるばい！', '#kanshi', 'token');
  } 

  sheet.getRange(1,1).setValue(lastUpdated.getTime());
}
```

# まとめ

Google が更新あったら通知してくれて、差分もいい感じに見せてくれたら
こんなことしなくて済んだんだけど！

あと Google App Script でもお手軽な HTML Beautifier みたいなのが欲しいところ
シェル芸 Project Euler - Problem 1


## はじめに

@gin_135 さんの「[Project Eulerをシェル芸で解いてみる](http://qiita.com/gin_135/items/c0fde5686f33d947aa6c)」シリーズが大変面白いです.
大抵は @gin_135 さんの Qiita 投稿, @eban さんの別解 on ブログ, @MasWag さんの別解 on Twitter を楽しく読ませていただき, 読んだだけで分からないものは, 手元で再現などして楽しんでいますが, 方針として大きく異なる別解を思いついたものについて, 自分のエントリを立てようと思います.

「Project Euler」の解説, 問題文の引用などは省略します.

本エントリは Problem 1 ([問題原文](https://projecteuler.net/problem=1), [問題文日本語訳](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%201)) の解答です.


## 方針

他の問題 (Project Euler のというだけでなく, 現実の) にも共通で使える汎用演算について, 別途スクリプトを用意し, これをパイプで繋げます.

本題は, 数列に対し 3 または 5 の倍数を「濾過」し, 和算で「畳み込み」すれば良いので,

濾過スクリプトと左畳み込みスクリプトを用意します.

## 濾過

```sh:filter
#!/bin/sh

f=$1
while read line
do
  set "$line"
  if `eval $f`
  then
    echo $line
  fi
done
```

を `filter` として保存し, PATH に含まれるディレクトリに保存 (または保存したディレクトリを PATH に追加), 実行パーミションを与えてあるとします.

解説は「[濾過 in シェル](http://qiita.com/kohyama/items/ad967b76c91d2c0ad370)」にあります.

## 左畳み込み

```sh:reduce
#!/bin/sh

f=$1
i=$2
if [ "X$i" = "X" ]
then
  read i
fi
while read line
do
  set "$i" "$line"
  i=`eval $f`
done
echo $i
```

を `reduce` として保存し, PATH に含まれるディレクトリに保存 (または保存したディレクトリを PATH に追加), 実行パーミションを与えてあるとします.

解説は「[左畳み込み in シェル](http://qiita.com/kohyama/items/2796960ebbd842227821)」にあります.

## 例題解答

10未満の自然数のうち, 3 か 5 の倍数 (3 か 5 で割り切れる) 数の合計は 23 になります.

```sh:
$ seq 9 | filter '[ `expr $1 % 3` -eq 0 -o `expr $1 % 5` -eq 0 ]' | reduce 'expr $1 + $2'
23
```

## 本題解答

例題同様

```sh:
$ seq 999 | filter '[ `expr $1 % 3` -eq 0 -o `expr $1 % 5` -eq 0 ]' | reduce 'expr $1 + $2'
```

とします.

## 参考

@gin_135 さんの解答「[Project Eulerをシェル芸で解いてみる(Problem 1)](http://qiita.com/gin_135/items/c0fde5686f33d947aa6c)」
@eban さんの解答「[Project Euler Problem 1 #シェル芸 - jarp](http://jarp.does.notwork.org/diary/201601a.html#201601031)」
初期化時に連番の配列を1行で生成する

## やりたかったこと

配列の初期化時に `[1,2,3,4,5]` みたいな連番の配列を一括生成したかったけど、案外と1行で出来る文法がなかった

## こうする

<del>

```swift
let array = [Int]() + (1...5)
print(array) // [1, 2, 3, 4, 5]
```

そんだけ！
</del>

コメントで教えてもらったけど、そもそもこうやってかけるんだって！

```swift
let array = [Int](1...5)
print(array) // [1, 2, 3, 4, 5]
```

単にググり力が足りないだけだったようだ。
Ruby | 配列で最初の要素だけを削除する ( 2行目以降を全て得る )

# 解決

`drop` すれば良い。

```rb
['A','B','C','D','E'].drop(1)

# => ["B", "C", "D", "E"]
```

# 問題

## shift の返り値

配列を shift すると、**取り出した要素**が返り値になる。
**残った要素**ではない。

```rb
['A','B','C','D','E'].shift

=> "A"
```

## shift!

`shift` はそもそも破壊的。だから `shift!` なんてない。 

```rb
['A','B','C','D','E'].shift!
# => NoMethodError: undefined method `shift!' for ["A", "B", "C", "D", "E"]:Array
```

## 一時変数

求める値は得られるが。3行も書かなければいけない。

```rb
alphabets = ['A','B','C','D','E'] 

alphabets.shift

alphabets 

# =>  ["B", "C", "D", "E"]
```

# 過去

今までは配列に対して `[1..-1]` を問うていた。

```rb
['A','B','C','D','E'][1..-1]

# => ["B", "C", "D", "E"]
```

`1` は配列の**二番目**という意味。 ( `2` ではない )
`-1` は配列の**最後**という意味。
# 環境

- Ruby 2.2.4

# 謝辞

- `drop` を教えてくれた @pinzolo さん
- `shift` がそもそも破壊的だと指摘してくれた @scivola さん



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->