OmniAICreator/Qiita-1.07M huggingface dataset:
厨二病っぽい名前のライブラリとかフレームワークを集めてみたい

最近、JS界隈を始めとして、厨二病っぽい名前のライブラリやらフレームワークやら、言語やらが流行っているように思います。
(いや、むしろ流行って欲しい！)

そんなわけで、厨二病っぽい何やらかを、Githubから適当に探してみました。
あまりにも更新が古いものとか、開発が進んでいなさそうなものは除外しています。

そんな、どうでもいい感じの記事になっています。

# 怪物系

伝説上のモンスターとかをそのまま何かの名前にしていないかな
そんな感じで調べてみました

## ドラゴン(Dragon)

空を飛んだり火を吹いたり、割と好き勝手な爬虫類のバケモノです。
こいつの名前を使ったライブラリとかはあるのでしょうか？

### http://dragon.deparadox.com/

イかすスクロールとかドラッグオンのUIを提供する、jQueryのプラグイン
なるほど、Drag On でドラゴンとは。。。
似たようなものに https://github.com/jeremyckahn/dragon ってのもあって、これもシンプルで高機能なドラッグオンUIを提供しています。

### https://github.com/cuckoosandbox/dragon

[cuckoo sandbox](https://cuckoosandbox.org/)をより拡張したものらしいです。
cuckoo sandboxはマルウェアの解析に使うツールですな

### https://github.com/chrisabrams/dragon

Backbone.jsにES6とかES7とか仮想DOMとか、そういう新しい仕様や思想を取り入れて改善させた、クライアントサイドのフレームワークです
まだまだ作成途中に見えます

## ベヘモス(Behemoth)

超でかい怪獣として表わされることの多い怪物ですな。
バハムートがベヘモスのアラビア読みらしいです。

### https://github.com/DigitalPebble/behemoth

一貫した大規模ドキュメント処理の一連の流れを提供するプラットフォーム。
一連の処理とは、ドキュメントの取得(クローラーとか)、テキストの処理、処理結果の吐き出しのことです。
最近solrを触る機械があるので、この辺はチェックしておきたいですね。

めぼしい物はこれくらいでした。。。

## リバイアサン(Leviathan)

こちらは海の怪獣ですな。

### https://github.com/iambowen/leviathan

ちょっと古いですが、dockerレジストリとサーバの設定ファイルを共有サーバにおいておいて、開発環境構築の際に、自動的にそこからイメージや設定ファイルを取得し、お手軽に環境を再現してしまおうという仕組みを提供する、シェルスクリプト群です。

# 神格系

神様の名前を入れてしまう方も多いでしょう。
特に、多神教の神は俗っぽいのもいるので、使いやすかったりするのかもしれません。

## オーディン(Odin)

大人気の北欧神話の神様。
あっさりとフェンリルに食われたりしてます。

### http://wpod.in/

WordPressのベーステーマで、そこから容易にテーマを作っていけるよ！というフレームワークです。
ブラジルのWordPressユーザーグループが作ってるみたいで、ドキュメントがポルトガル語だったりします。

### https://github.com/jwaldrip/odin

go言語のself-documentedなコマンドラインプログラムの作成を支援するライブラリです。
ナンノコッチャと思うかもしれませんが、例えばコマンドラインで
`mycli -h`と書いたら、マニュアルやヘルプが出てくるものですが、これを自前で描くのは大変です。
しかし、このodinを使用することで、コードの中で記述した内容を読み取り、いい感じのヘルプを自動的に生成してくれるのです。
go言語を勉強する際には、是非とも試してみたいものです。
ゴーランガ！

### https://github.com/h4t0n/odin

[Ghost](https://ghost.org/)というブログ作成用のプラットフォームがあって、そのデフォルトテーマであるCasperをフォークして作られた、CSSライブラリです。

### http://www.theodinproject.com/

WEB開発のオープンソースな学習プログラムです。
コードの割合を見ると、Rubyを中心に勉強するようですね。

## ゼウス

ギリシャ神話の最高神は、一体どのようなツールに変貌しているのか。。

### https://github.com/burke/zeus

railsの開発タスク、例えばconsoleとかserverとかtestとかを予め読み込んでおくことで、爆速で起動してしまうというツールです。
一応gemなんですが、コードの半分以上がgoで書かれているというツールです。

### http://zeuscart.com/

とても堅牢な、PHP/MySQLベースのショッピングカートソフトウェアとのこと。
もう、ゼウス関係ないな。。。
見た目はとても面白そうなので、是非とも使ってみたい。

## アマテラス(amateras(u))

日本からも神格をお一人

### https://github.com/takezoe/amateras-modeler

EclipseにUMLとER図のエディタを導入するツール
HTMLエディタもあるみたいです。

### https://github.com/mzelenyuk/Amaterasu

Rails製のソーシャルネットワークです。

# 武器編

強力な武器名をツールにつけることにより、「このツールこそ最強」を表すのは良いことだと思います。
そんな理由で作られたかどうかわかりませんが、有名な武器名のツールを探してみました。

## エクスカリバー

アーサー王伝説出てくる、日本で最も有名な武器じゃないでしょうか。
厨二心をくすぐるこの武器をモチーフにしたツールは、どのようなものがあるでしょうか。

### http://docs.excaliburjs.com/en/latest/

Excalibur.jsとは、もろな名前ですよね。
TypeScriptを使用するJavascriptのゲームエンジンです。
canvasを使って2Dゲームを作るために使います。

## グングニル(gungnir)

北欧神話でいう、勝利のやりですね。

### https://github.com/ZizhengTai/gungnir

C++で並列処理を簡単に書けるというツールです。

## デュランダル(durandal)

神話ではないですが、英雄が持っていたという件ですね

### http://durandaljs.com/

最近話題のSPAフレームワークですな。
Aureriaを参考に、更に開発を進めているようです。

# まとめ

多かったり少なかったりする厨二ツールですが、見つけたらまた追加していこうと思います。
underscoreコードリーディング（compose）


underscoreに詳しくないので、勉強半分でソースコードを読む。


##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##composeとは


###[underscorejs.orgのcompose](http://underscorejs.org/#compose)

こんな説明。
>####_.compose(*functions) 
>Returns the composition of a list of functions, where each function consumes the return value of the function that follows. >In math terms, composing the functions f(), g(), and h() produces f(g(h())).



```javascript
var greet    = function(name){ return "hi: " + name; };
var exclaim  = function(statement){ return statement.toUpperCase() + "!"; };
var welcome = _.compose(greet, exclaim);
welcome('moe');
=> 'hi: MOE!'

```
------------- 
それぞれの関数*functionsに書かれたそれぞれの関数の値を返し続けた結果の、関数のリストで構成された値を返す
数学的に言うとf,g,hの関数が合った場合にf(g(h()))の形で表します


###[underscore.compose](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L863)
コード的にはこのあたり。

```javascript
 // Returns a function that is the composition of a list of functions, each
  // consuming the return value of the function that follows.
  _.compose = function() {
    var args = arguments;
    var start = args.length - 1;
    return function() {
      var i = start;
      var result = args[start].apply(this, arguments);
      while (i--) result = args[i].call(this, result);
      return result;
    };
  };
```

argumentsを変数argsに格納する。
startにargsの長さ-1をいれる。
関数を返す。返す関数は以下の関数。
resultにargsの一番最後に格納されている関数をapplyした結果を入れる。引数はないので、composeされた関数が実行されたときの引数はargumentsにある。
iをデクリメントしながら、resultにargs[i]にresultを与えた結果を代入し続ける。iが-1になったら終わる。
実行後、resultを返す。
three.jsでテクスチャ画像をクロスドメイン回避して取得する


## 課題
three.jsでテクスチャ画像を別ドメインのサーバーから取得したいとき。

なにもしないと
"Cross-origin image load denied by Cross-Origin Resource Sharing policy."
のようなクロスドメインのエラーがでる。

## 解決方法

これでOK。

```
THREE.ImageUtils.crossOrigin = "*";
var texture = THREE.ImageUtils.loadTexture("http://example.com/hoge.jpg");
```
amazon S3画像へのクロスドメイン接続を許可する


JavaScriptから非同期でs3の画像を取得するとき。
CORSという仕組みを使う。


## S3でCORS設定
S3の設定ページで「CORS設定の編集」をクリック

<img width="1253" alt="qiita.png" src="https://qiita-image-store.s3.amazonaws.com/0/29775/c6eb2a77-cbaa-214d-48b6-1e817f0fd2da.png">


AllowedHeaderを↓のような感じに編集。

```
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>
```

もっと厳密に設定するなら↓が参考になりそう。
http://memocra.blogspot.jp/2012/09/s3cors.html
Play Framework サーバーでJSONを拾ってリアクションする手短な書き方

JSON投げの標的サーバーを作りたいです。でもパース面倒くさいです。

`Play Framework Json case class` あたりで検索すると参考になる記事がたくさん出てくるんですが、なんだかどれも今ひとつ簡単に思えないのです。いちいちAPIごとにクラス作るのはいいとして、どうせ1回くらいしか使わないのに毎回implicitを書くんですよね… お辛い… みたいな。

関連処理ごとどこかに隠蔽しようかなあとも思ったんですが（先送り体質）、それだと「どういうJSONを投げなきゃいけないのか」がコードから読み取れなくなりますので、逆に困ります。
とはいえ、リクエストの内容がおかしかったら場合分けしたいし、やりたいことはそれなりにあるので毎回書くのはやっぱり嫌。

というわけで関数を悪魔合体させて何とかします。Tryはおまけです。

``` ApiController.scala
trait ApiController extends Controller {

  def TryJsonAction[T](r: Reads[T])(act: T => Request[AnyContent] => Result): Action[AnyContent] = Action { request =>
    request.body.asJson.flatMap(_.asOpt[T](r)) match {
      case None => BadRequest
      case Some(apiValue) => Try { act(apiValue)(request) } match {
        case Success(result) => result
        case Failure(_) => InternalServerError
      }
    }
  }
  
  def TryAction[T](act: Request[AnyContent] => Result): Action[AnyContent] = Action { request =>
    Try (act(request)) match  {
      case Success(result) => result
      case Failure(_) => InternalServerError
    }
  }
  def TryAction[T](act: => Result): Action[AnyContent] = TryAction(_ => act)
}
```

使うときはこんな感じ。daoは適当、イメージです。

``` server.scala

class Server @Inject()(dao: WorkerDao) extends ApiController {

  case class CreateWorkerApiValue(name: String)
  def createWorker = TryJsonAction(Json.reads[CreateWorkerApiValue]) { apiValue => request =>
    Ok(dao.generate(apiValue.name).register.toJson)
  }

}
```

結構スッキリしましたね。多分動くんじゃないかなと思われます。
PHPマルチバイト文字列の切り取り(メモ)

PHPでマルチバイト文字列の切り取りに迷ったのでメモ。

## `substr` … 文字列を任意の箇所から任意バイト数切り取り
　第１引数：対象の文字列
　第２引数：切り取り開始位置（バイト）
　第３引数：切り取り開始のバイト数

```php
var_dump(substr("mojiretsu", 0, 2)); // string(2) "mo"
var_dump(substr("ごりら", 0, 3)); // string(3) "ご"
```

## `mb_substr` … 文字列を任意の箇所から任意文字数切り取り
　第１引数：対象の文字列
　第２引数：切り取り開始位置
　第３引数：切り取り開始の文字数
　第４引数：文字エンコーディング

```php
var_dump(mb_substr("mojiretsu", 0, 2, "UTF-8")); // string(2) "mo"
var_dump(mb_substr("ごりら", 0, 3, "UTF-8")); // string(9) "ごりら"
```
Mac: KeePass, KeePassX, MacPass の情報まとめ



パスワード管理ソフトウェア KeePass の情報まとめ

## まとめ

感想: Mac OS Xで色々やるのは、かなり面倒。

### Mac

* データベースには、1.xと2.x系がある
* ブラウザ連携、データベース同期などは別のソフトウェアと組み合わせてやる必要がある
* Keepass: 元が.NETなので、Mono, XQuartzが必要
* KeepassX: KeePassをQt化?
* Macpass: Objective-C: zipをダウンロードか、gitでソースを取得後、Xcodeでコンパイル

### ブラウザ

* ブラウザでフォームへの自動補完を使うには、KeePassHttpが必要
* Chrome:　ChromeIPass
* Firefox: Passifox

### モバイルOS

* iOS: Minikeepass, Keepasstouch
* Android: Keepass2Android
 
## Mac: Keepass

ここからダウンロード
* [KeePass 2.x for Mac OS X - KeePass](http://keepass.info/download/p_macosx/)

以下が必要

* Mono >= 3.0
* XQuarts >= 2.7.4


## KeePassX


* 公式ページ: [KeePassX](http://www.keepassx.org/)


## MacPass

* 公式ページ: [MacPass by mstarke](http://mstarke.github.io/MacPass/)
* [KeePassHTTP · mstarke/MacPass Wiki](https://github.com/mstarke/MacPass/wiki/KeePassHTTP)

## 参考

* [KeePass / Discussion / Open Discussion:Keepass and Mac](http://sourceforge.net/p/keepass/discussion/329220/thread/eb00d276/)
Brakemanで結果が見切れないようにする


[Brakeman](https://github.com/presidentbeef/brakeman)を用いてセキュリティチェックをしていたのですが、`brakeman`コマンドだけだと、ターミナルの幅が小さいと


```
View Warnings:

+------------+--------------------------------------------------------------------------+----------------------+---------------------->>
| Confidence | Template                                                                 | Warning Type         | Message              >>
+------------+--------------------------------------------------------------------------+----------------------+---------------------->>
| High       | xxxx/xxxx (xxx#xxx)                                  | Cross Site Scripting | Unsafe parameter valu>>
+------------+--------------------------------------------------------------------------+----------------------+---------------------->>

```

のように、肝心のどの部分で問題が起こってるのかってところで見切れてしまいました。
そこでbrakemanのヘルプを見てたのですが、

```
brakeman --table-width （お好きな幅の長さ）
```

で横幅が広がってどこで問題が起こっているか見れるようになりました。
Ruby のヒアドキュメントすごい

Ruby のヒアドキュメントは行指向の文字列リテラルで，まとまったテキストを書くのに向いています．

```ruby
puts <<-EOS
foo
bar
baz
EOS
```

- 出力

```
foo
bar
baz
```

## メソッドチェーンをつなげる

たとえばヒアドキュメントの中身をすべて小文字にしたいときは下記のようにします．メソッドチェーンをつなげる位置がやや直感的でないですが，`cat` コマンドがそんな感じですね．

```ruby
puts <<-EOS.downcase
FOO
BAR
BAZ
EOS
```

- 出力

```
foo
bar
baz
```

## 余計なインデントを取り除く

Ruby のヒアドキュメントはインデントを考慮しないため，ソースコードのインデントを崩して書くか，[unindent]() gem のようなメソッドを `String` に生やす必要がありました．

```ruby
def usage
  <<-USAGE
blah [option] {file}

--version show version
--help    show this help
  USAGE
end

def usage
  <<-USAGE.unindent
    blah [option] {file}

    --version show version
    --help    show this help
  USAGE
end
```

Ruby 2.3 からは専用の構文が入り，次のように書けば良くなりました．すごい．

```ruby
def usage
  <<~USAGE
    blah [option] {file}

    --version show version
    --help    show this help
  USAGE
end
```

## メソッド呼び出しの引数

`<<-IDENT` の部分が1つの式になるような感じなので，次のように文字列部分をぶらさげるように書けます．

```ruby
puts JSON.parse(<<-JSON, symbolize_names: true, max_nesting: 10)
{
    "answer": 42,
    "heredoc": "sugoi"
}
JSON
```

## 複数のヒアドキュメント

よって，次のようにして複数のヒアドキュメントを1つの式に含めることができます．

```ruby
puts <<-STR1, <<-STR2
this is first
string
STR1
this is second
string!
STR2
```

- 出力

```
this is first
string
this is second
string!
```


## クワイン

ヒアドキュメントの identifier 部分は異常に自由度が高いので，
それを応用して，次のようなクワインが書けるようです．僕が考えたわけではなく拾い物です．

```ruby
puts <<2*2,2
puts <<2*2,2
2
```

気になる方は手元で動かしてみてどうなっているのか見てみてください．

```sh
$ ruby quine.rb > result
$ diff quine.rb result
```

## まとめ

すごい．
FunctionalなSwiftのmap, filter, reduceのススメ

# 概要

おもに配列を扱う便利な`map, filter, reduce`を使わない例と対比します。
チートシートとしての使用を想定してます。
# map
## お題
 ある配列から各要素に対して自乗し、新しい配列を作りたい!

### 宜しくない書き方
`var`を使い`append()`する方法

```swift
func square(x: Int) -> Int {
  return x * x
}
var a = [1, 2, 3, 4, 5]
var b = [Int]()

for x in a {
  b.append(square(x))
}
```
### mapヲ使用スベシ1
```swift
func square(x: Int) -> Int {
  return x * x
}

let a = [1, 2, 3, 4, 5]
let b = a.map { x in
  square(x)
}
```
### mapヲ使用スベシ2
関数を引数とするケース

```swift
func square(x: Int) -> Int {
  return x * x
}

let a = [1, 2, 3, 4, 5]
let b = a.map(square) // [1, 4, 9, 16, 25]
```
### mapヲ使用スベシ3
ここでショートハンド引数を使用。１行で書ける。

```swift
[1, 2, 3, 4, 5].map { $0 * $0 } // [1, 4, 9, 16, 25]
```

15より大の配列も`filter`使うととても簡略に書ける！

```swift
[1, 2, 3, 4, 5].map { $0 * $0 }.filter { $0 > 15　} // [16, 25]
```

# filter
ある条件を満たすオブジェクトを配列に追加するケース
## お題
gradeが90より大のStudentオブジェクトの一覧 (bestStudents）が欲しい!

## 宜しくない書き方
`var`を使い`append()`する方法

```swift
var bestStudents = [Student]()

for student in students {
  if student.grade > 90 {
    bestStudents.append(student)
  }
}
```
## filterヲ使用スベシ1
ここでショートハンド引数を使用。簡潔になる。

```swift
let besetStudents = students.filter { $0.grade > 90 }
```
## filterヲ使用スベシ2（関数を渡す）
引数として関数を渡すケース。

```swift
func isBestStudent(student: Student) -> Bool {
  return student.grade > 90
}

let bestStudents = students.filer(isBestStudent)
```
# reduce
配列の要素を畳み込む。

## お題
1,2,3,4,5を要素に持つ配列の要素を積み上げ、その総和を求めたい!
## 宜しくない書き方
`var`を使い、for inで積み上げる。

```swift
let a = [1, 2, 3, 4, 5]

var sum = 0
for x in a {
  sum += x
}
```
## reduceヲ使用スベシ1
リストの畳込み時は、reduceを使う。

```swift
let a = [1, 2, 3, 4, 5]
let sum = a.reduce(0) { (total, value) in
  return total + value
}
```
### 解説
初期値`0`が下表#1のtotalになり、resultが次iterationの(#1...5それぞれ)のtotalになる。

| iteration | total: U | value: T |  result |
|:--------|------:|-------:|-------:|
| #1       |       0 |       1 |     1 | 
| #2       |       1 |       2 |     3 | 
| #3       |       3 |       3 |     6 | 
| #4       |       6 |       4 |    10 | 
| #5       |      10 |       5 |    15 | 

## reduceヲ使用スベシ2
ここでショートハンド引数を使用。

```swift
let a = [1, 2, 3, 4, 5]
let sum = a.reduce(0) { $0 + $1 } // 15
```
## reduceヲ使用スベシ3
`+`が渡せる！

```swift
let a = [1, 2, 3, 4, 5]
let sum = a.reduce(0, combine: +) // 15
```

参考文献
1. [7 Habits For a More Functional Swift
](http://www.slideshare.net/jarsen7/7-habits-for-a-more-functional-swift)
2. [Swift Functional Programming Tutorial](http://www.raywenderlich.com/82599/swift-functional-programming-tutorial)
ESP8266 > ユニバーサル基板実装 > ハンダ面 / 部品面比較 > 2代目から5代目

ESP8266のユニーバル基板実装

### 歴代の成績

- 1代目 : 回路がよくわからず、修正不可
- 2代目 : 正常動作 (両面基板[63963J2H], 部分的にAWG28で実装)
- 3代目 : ノイズ多発でプログラム書込み不可 (片面基板[ICB-288], 全てAWG28で実装)
- 4代目 : 正常動作 (両面基板[TNF44-69], 全てAWG28で実装)
- 5代目 : 正常動作 (片面基板[ICB-288], 全てAWG28で実装)


### 使用基板

- 63963J2H
  - 不明。もらいもの
  - 多分、ガラスエポキシ
- ICB-288
  - [link](http://www.sunhayato.co.jp/material2/index.php/item?cell003=%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E5%9F%BA%E6%9D%BF%E8%A3%BD%E5%93%81&cell004=%E5%B0%8F%E5%9E%8B%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E5%9F%BA%E6%9D%BF&name=%E5%B0%8F%E5%9E%8B%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E5%9F%BA%E6%9D%BF+ICB-288&id=621&label=1)
  - 紙フェノール
- TNF44-69
  - [link @ rs online](http://jp.rs-online.com/web/p/matrix-boards/6030710/)
  - ガラスエポキシ


### ハンダ面の比較

上から2代目,3,4,5代目

![DSC_0054.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/6444bca5-0670-b65b-d45b-5253e11238d2.jpeg)

### 部品面の比較

上から1,2,3,4,5代目

![DSC_0056.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/d4ae6cfc-9a5a-45cb-82ee-c9b772226e60.jpeg)

4,5代目はリセット関連を未実装。


### 5代目まで作った理由

3代目で動作がうまくいかなかった理由を知りたかった。

以下があやしいと思っていた。

1. ICB-288の絶縁性が悪い可能性
2. AWG28だとノイズに弱い可能性

5代目で正常動作して分かったのは、上記どちらも悪くないということ。

実装間違いかもしれないが、見なおしてもなかなかわからないのが現在の僕の腕前だ。
CircleCIやTravis CIに頼らず、Coverallsを使う

# composer.jsonに以下を追記

versionは適当です。

```
  "phpunit/phpunit": "^4.0",
  "satooshi/php-coveralls": "1.0.1"
```

# composer installする

する

```
php composer.phar install
```

# 適当にGitHubにpushしてCoverallsを有効にする

そしてrepo_tokenとやらを控える。

# .coveralls.ymlを書く

```yml:coveralls.yml
repo_token: ここに控えたrepo_tokenを
coverage_clover: build/logs/clover.xml
```

coverage_cloverはcoverageのxmlレポートが吐き出される場所を指定すると良い

# 適当にcoverageを集計する

```
./vendor/bin/phpunit --coverage-clover build/logs/clover.xml
```

# coverallsにカバレッジの結果を飛ばす

```
# -v付けないと全然ログが出力されない。エラーもわからないレベルなのでつけておくほうがいいかと
./vendor/bin/coveralls -v
```

以上！！
ちなみに今回は『Slim』のフレームワークを使って簡単に試してみました。
同じようにちょっと、動かしてみたいだけの人は『Slim』を使うのがおすすめです。
https://github.com/slimphp/Slim
Go メモ2

## 今日やること
 - Go の IDE とか開発環境ととのえる
 - パッケージ管理ツールとか調べる
 - 有名なフレームワーク調べる
 - テストの仕方とか
 - 作法を調べる(スペースは2でいいのかしら？)
 - 簡単なアプリ(掲示板くらい)を作ってみる。

酔っててほとんど手につかなかった。

## IDE は Goclipse

面倒だからこれで行く。

## パッケージ管理ツール
 - [ここにいろいろあった](https://github.com/golang/go/wiki/PackageManagementTools)
 - gom, glide あたりがメジャー？
 - gem みたいな超強い子はいないのかしら。。。
 -  **go package manager** でぐぐって一番上にきた[これ](https://github.com/gpmgo/gopm)を使うことにした。
 -  皆が使ってるのを知りたい

## 有名なフレームワークを探す
 - 前提条件として速度命ではない。実装しやすさ優先

### Revel
 - 爆速で有名？

割り込みが入ったので今日はここまで。

- 明日やること
 - 有名なフレームワーク調べる
 - テストの仕方とか
 - 作法を調べる(スペースは2でいいのかしら？)
 - 簡単なアプリ(掲示板くらい)を作ってみる。
Amazon RDS for MySQLでストレージ容量を減らす

RDSのストレージ容量は、増やすことは簡単にできますが減らすことはできない[^1]ので、慎重に検討しましょう。
万が一、私のように調子に乗って増やし過ぎてしまった場合は、以下の手順で擬似的にストレージサイズを縮小させることができます。

# 手順
1. お好みのストレージ容量で新インスタンスを作成
2. 旧インスタンスの識別子を変更し、既存のアプリケーションから読み書きが行えない状態にする
3. データを移行する（`mysqldump -h <旧インスタンスのエンドポイント> -u <user> -p<password> | mysql -h <新インスタンスのエンドポイント> -u <user> -p<password>`）
4. 新インスタンスの識別子を、旧インスタンスの元の識別子と同じものに変更する
5. 旧インスタンスを削除

# ネタ元
- http://dba.stackexchange.com/q/27639
- http://ja.stackoverflow.com/q/8957
[^1]: http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_ModifyInstance.MySQL.html
C# コンソールから起動した別プロセスが時間内に終了しなかったらプロセスを殺す

# コンソールアプリで起動した別プロセスを殺す

## 作ろうと思った理由
コンソールから起動した別プロセスがダイアログを表示したまま、プロセスが終わるまで待っていてメインプロセスがフリーズしてしまった。
一定時間起動した別プロセスが終了しなかったら殺したい。

## イメージ図
![20160202_005.png](https://qiita-image-store.s3.amazonaws.com/0/111261/74b00a33-d4a9-bca1-f70e-fd46fadd8e52.png)

## ソースコード
メモ帳を起動してから、１分以内に終了しなかったら、メモ帳を殺して終了する

```csharp:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace ConsoleProcessWaitEnd
{
    class Program
    {
        private const int MAX_SECCONDS = 10 * 1000;

        static void Main(string[] args)
        {
            ProcessStartInfo psiNotepad = new ProcessStartInfo();
            psiNotepad.FileName = @"notepad";
            Process psNotepad = System.Diagnostics.Process.Start(psiNotepad);

            if(!psNotepad.WaitForExit(MAX_SECCONDS))
            {
                psNotepad.Kill();
            }
            
        }
    }
}

```

何分間か動かなかったら時々警告を出すようにするならThreadにする必要がある。

```csharp:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Diagnostics;

namespace ConsoleThread
{
    class Program
    {
        private const int MAX_SECCONDS = 60;
        static private int timerCount = 0;
        static private bool isSuccess = false;

        static private Process psNotepad;

        static void Main(string[] args)
        {
            Thread thexe = new Thread(new ThreadStart(ThreadExe));

            thexe.Start();

            while (true)
            {
                if (isSuccess)
                {
                    Console.WriteLine("OK");
                    break;
                }

                if (timerCount < MAX_SECCONDS)
                {
                    Thread.Sleep(1000);
                    timerCount++;
                }

                else
                {
                    Console.WriteLine("NG");
                    psNotepad.Kill();
                    thexe.Abort();
                    break;
                }
            }
            Console.ReadKey();
        }

        private static void ThreadExe()
        {
            ProcessStartInfo psiNotepad = new ProcessStartInfo();
            psiNotepad.FileName = @"notepad";
            psNotepad = System.Diagnostics.Process.Start(psiNotepad);
            psNotepad.WaitForExit();
            isSuccess = true;
        }
    }
}
```

## git
[ConsoleThread](https://github.com/gansaibow/qiita/tree/master/VisualStudio/SandBox/ConsoleThread)
GitHub の URL 短縮サービス git.io 用のシェルスクリプト

- 2022/06/08 追記 
    - git.io は2022年4月に read-only となりました
    - なので、**この記事に書いてあることは現在は行うことが出来ません**
    - 詳細
        - [Git.io deprecation | GitHub Changelog](https://github.blog/changelog/2022-04-25-git-io-deprecation/#changelog-64536)
        - [git.ioは非推奨(read only)になってしまったので注意する必要がありそう - Acme::AnaTofuZ->new;](https://anatofuz.hatenablog.com/entry/2022/06/04/080414)

------

GitHub の URL も長くなったりするので、何度も参照するものは短縮  URL にすると都合が良いのですが、実は GitHub 自身が [git.io](https://git.io/) という短縮 URL サービスを提供しています。

* [GitHub内URLのURL短縮サービスgit.ioの使い方 - Qiita](http://qiita.com/kawasy/items/db9ca99f3e1c407a83f1)
* [Git.io: GitHub URL Shortener](https://github.com/blog/985-git-io-github-url-shortener)

上記ページのサンプルと読むと、使い方はいたってシンプル。

ブラウザからだと短縮 URL の後ろに指定の文字を入れることができないのですが、API を叩くと可能なようです。

```shell-session
$ curl -i http://git.io -F "url=https://github.com/xtetsuji/p5-ModPerl-PSGI" -F "code=modperl-psgi"
```

これで https://github.com/xtetsuji/p5-ModPerl-PSGI が https://git.io/modperl-psgi に短縮されます。

`code=` のパラメータが無ければ、URL はランダムに払い出されます。

せっかくなので、簡単に使うことができるシェルスクリプトを書いてみました。

```bash
#!/bin/bash

GITIO_URL=https://git.io

url="$1"
code="$2"

if [ -z "$url" ] ; then
    echo Usage:
    echo "  $0 URL [CODE]"
fi

if [ -n "$code" ] && grep -E '[^a-zA-Z0-9_-]' <<<"$code" >/dev/null 2>&1 ; then
    echo "code is only alpha-numeric and _ and -."
    exit
fi

echo "url = $url"
if [ -n "$code" ] ; then
    echo "code = $code"
fi

if [ -z "$code" ] ; then
    curl -i $GITIO_URL -F "url=$url"
else
    curl -i $GITIO_URL -F "url=$url" -F "code=$code"
fi

echo ""
```

文字制限などは、なんとなくアルファベットと数字とハイフンとアンダースコアのみだろうと勝手に入れています。

コマンドと出力の例は以下のような感じになります。

```shell-session
$ mkgitiourl https://gist.github.com/xtetsuji/1446584 maillog-hashnize 
url = https://gist.github.com/xtetsuji/1446584
code = maillog-hashnize
HTTP/1.1 100 Continue

HTTP/1.1 201 Created
Server: Cowboy
Connection: keep-alive
Date: Wed, 03 Feb 2016 11:10:48 GMT
Status: 201 Created
Content-Type: text/html;charset=utf-8
Location: https://git.io/vgtEH
Content-Length: 40
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Runtime: 0.187053
X-Node: 982f2daf-c02c-439c-8e49-52eaa3e2cc1c
X-Revision: 4fdc60de6311e6a3aa31e19bc7b3aad7e85d33a6
Strict-Transport-Security: max-age=31536000; includeSubDomains
Via: 1.1 vegur

https://gist.github.com/xtetsuji/1446584
```
slackcat を使ってみる


## slackcat

- slackcat を使えばシェルからSlackへ投稿できる

<http://slackcat.chat/>

## インストール

- MacOSX の場合は、Homebrew を使って簡単にインストールできる

```Bash
$ brew update
$ brew install slackcat
```

- Linux にもインストール可能 (公式ページ参照)

## 設定

<https://github.com/vektorlab/slackcat/blob/master/docs/configuration-guide.md>

- 以下のコマンドを叩けば、ブラウザが開いてSlackとの連携画面が表示される

```Bash
$ slackcat --configure
```

- 許可すると、トークンが発行されるので、`~/.slackcat` に保存する

```Bash
$ echo "xoxp-xxxx-xxxx-xxxx-xxxx" > ~/.slackcat
```

- Slackをマルチチームで使っている場合には、次のように設定するといい

```:~/.slackcat
team1 = xoxp--xxxx-xxxx-xxxx-xxxx
team2 = xoxp--xxxx-xxxx-xxxx-yyyy
default_team = team1
default_channel = develop
```

## 使い方

- 以下のような感じで使える

```
# ストリームモードで使用開始
$ slackcat --channel team2:general --stream --plain

# ファイルをスラックに投稿
$ slackcat --channel general --filename test.jpg ~/Images/test.jpg

# コマンド出力をプレーンテキストとして投稿
$ echo test | slackcat --tee --stream --plain

# コマンド出力をスニペットとして投稿
$ date | slackcat --tee
```
ViewPagerの中のFragmentのViewを使ってShared element animationする

Activity1 -> Activity2 にアニメーションするときに、Activity2の中にアニメーションターゲットのViewが存在する場合は、`transitionName`を設定するだけでShared element animationできる。
たとえば、Activity2のレイアウトとして

```xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher"
        android:transitionName="image" />

</LinearLayout>
```

というふうになっていれば、Activity1から遷移するときにちょこっと手を加えるだけでアニメーションできる。

```java
Intent intent = new Intent(context, Activity2.class);
startActivity(intent, ActivityOptionsCompat
    .makeSceneTransitionAnimation(this, imageView, "image")
    .toBundle());
```

しかし、アニメーション先のActivityがViewPagerやFragmentを使っている場合、Fragment内のViewに`transitionName`を設定していても正しくアニメーションしてくれない。

この場合、アニメーション先のActivityで`setEnterSharedElementCallback`でアニメーション開始時の処理を上書きすることで、前のActivityから送られてきた`transitionName`文字列に対応するViewを直接指定できる。

```java
private PageFragment currentFragment; // ViewPagerで表示中のFragment

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // ViewPagerの中身を設定
    initViews();

    // Shared element animationの処理を上書きする
    setEnterSharedElementCallback(new SharedElementCallback() {
        @Override
        public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {
            // 前のActivityから送られてきたtransitionName (今回は"image")に対応するViewをFragmentから取得する
            sharedElements.put("image", currentFragment.getImageView());
        }
    });
}

void initViews() {
    FragmentPagerAdapter adapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
        @Override
        public Fragment getItem(int position) {
            return new PageFragment(); // 個々のページのFragmentを作成
        }

        @Override
        public int getCount() {
            return 3; // 必要なページ数だけ
        }

        @Override
        public void setPrimaryItem(ViewGroup container, int position, Object object) {
            super.setPrimaryItem(container, position, object);
            currentFragment = (PageFragment) object; // 表示中のFragmentをActivityのフィールドに保持する
        }
    };

    viewPager.setAdapter(adapter);
}
```
Altera社のQuartusで身に覚えの無い「Error (10517): VHDL type mismatch error at xxxx.vhd(nn): boolean type does not match integer literal」に出くわしたときの対処方法

#はじめに

久しぶりに Altera 社の Quartus を使ってた時、身に覚えの無い「Error (10517): VHDL type mismatch error at xxxx.vhd(nn): boolean type does not match integer literal」(xxxx.vhdはIPのトップ階層のVHDLのファイル名でnnは行番号)に出くわしました。
その対処方法が判りにくかったので、防備録としてメモっておきます。

#トラブルが発生した環境

- Altera 社 Quartus Prime Verion 15.1.0 Build 185 10/21/2015 SJ Lite Edition 
- Qsys を使って各種IPを接続している
- 使っているIPのうち、Top階層のHDL が VHDL　かつ generic に boolean 型のパラメータ変数がある IP がある
- Quartus Prime の Setting > IP Settings > IP generation HDL preference: が Verilog になっている


#トラブルの原因

Quartus Prime の Setting > IP Settings > IP generation HDL preference: が Verilog になっていると、Analyze時に Qsysで作ったHDLのトップ階層のHDLが Verilog-HDL に変換されてプロジェクト内(db/ip/xxxx/xxxx.v xxxx には Qsys で作ったシステムの名前)に取り込まれるようです。その際、インスタンスしたIPのboolean型のパラメータ変数に(true/false)ではなく(1/0)を設定してしまいます。で、IPのトップ階層がVHDLだと、当然 boolean型のパラメータに 1 or 0 を設定していることになり、VHDLの文法エラーになるわけです。


#対処方法

対処方法は、次のいずれかです

1. Quartus Prime の Setting > IP Settings > IP generation HDL preference: を VHDL にする
2. IPのTop階層のVHDLを、Verilogに書き換える
3. IPのboolean型のパラメータをInteger型にする

正直、IPを書き換えるのは手間だし、そもそも他者の作ったIPだとどうしようも無いので、多分 1 が一番楽。

#参考

似たようなトラブルが報告されています

- [Error: VHDL type mismatch error at <component_name>.vhd: boolean type does not match integer literal](https://www.altera.com/support/support-resources/knowledge-base/solutions/rd05212011_256.html)    
   2013年2月に報告されていて、「This issue will be fixed in a future release of Quartus® II software.」なんて書いてますが。
- [Error (10517): VHDL type mismatch error at altera_epcq_controller_core.vhd(17): boolean type does not match integer literal](http://wl.altera.co.jp/support/kdb/solutions/rd03252015_975.html)    
これも多分同じ原因かな。解決策として「Use the Verilog language for Qsys generation.」とありますが、私が試してみたところ、Qsys の generation HDL を Verilog にしても VHDL にしても結果は変わりませんでした。こちらには「This problem is fixed in version 15.0 of the Quartus II software.」とありますが。

もしかして、Setting > IP Settings > IP generation HDL preference: を VHDL にするのが解決策ってことなんだろうか？　だとしたらちょっとスジ違いな解決策ですね。そもそも Verilog-HDL に変換する際に Boolean 型のパラメータをちゃんと true/false にするのがスジじゃないかな～。
API Gateway -> Lambda(Python)でさくっとクエリ文字列をとる

# やりたいこと

`https://example.com/beta/resource` にGETでアクセスした際に、Lambda側でクエリ文字列を取得したい


# おこたえ

1. API Gatewayの `Integration Request` をクリック
![スクリーンショット 2016-02-03 20.19.44.png](https://qiita-image-store.s3.amazonaws.com/0/73113/f512487c-ce8d-c600-93c7-8105aadbe44b.png)

2. `Mapping Templates` セクションを開いて、 `content-type` に `application/json` と入力
![スクリーンショット 2016-02-03 20.21.55.png](https://qiita-image-store.s3.amazonaws.com/0/73113/4b4e09ec-6708-c3b2-e86b-c3646f242118.png)

3. 右側の `Input passthrough` の鉛筆をクリックして、 `Mapping Templates` を選択
![スクリーンショット 2016-02-03 20.23.38.png](https://qiita-image-store.s3.amazonaws.com/0/73113/400420d2-8970-73b4-0f39-061933884753.png)

4. 以下のとおり入力して保存

```js
{
#foreach( $key in $input.params().querystring.keySet() )
    "$key": "$input.params().querystring.get($key)"#if( $foreach.hasNext ),#end
#end
}
```
![スクリーンショット 2016-02-03 20.22.41.png](https://qiita-image-store.s3.amazonaws.com/0/73113/f4b02b2e-cc3e-90bd-2fa2-3f285ec42fa2.png)

これでlambda_function()の第一引数の `event` にクエリ文字列が格納される。


参考：http://r7kamura.hatenablog.com/entry/2015/08/14/043134
unity入門　その１

# Unityを始めてみる。
## Unityってなんだ？
　[unity](https://ja.wikipedia.org/wiki/Unity_(ゲームエンジン))とはゲーム開発を簡単に行うためのツール

　とは言っても、物理エンジンやらシェーダやらを全部自前で
　書くよりは簡単に行うためのツールということであり、
　やることはそれなりに多い。

　記憶力に不安のある私は、やったことをメモしていこうと思った。

　なんといっても、iOSとandroidにも対応。
　それがとても魅力に感じた。


------------------------------------------
## 開発環境概要
- Unity5.3.1
- Mac

　最終的には、iosアプリとして出力する。
　（正確には、xcodeプロジェクトを生成）

-----------------------------------------
## 画面レイアウトについて
　スクリーンキャプチャ画像について
 window->layoutなんかを使って、配置変更してます。
 説明が変わってしまう部分もあるかと思いますが、読み替えてもらえると。。。 

　![スクリーンショット 2016-02-03 14.16.53.png](https://qiita-image-store.s3.amazonaws.com/0/98558/2a404800-6b11-1c6d-341c-fb6646e88088.png)

-----------------------------------------
## 物体を置く -> 落とす　->　跳ねる

**　画面内にキューブ状の物体を配置 **
3D Object -> Cube 
Unityのバージョンによって場所が変わってるかもしれない。
![スクリーンショット 2016-02-03 14.20.32.png](https://qiita-image-store.s3.amazonaws.com/0/98558/3b060d6d-5e39-b04a-d082-cfe5d8fa370d.png)

以下のようなキューブが生成される。
![スクリーンショット 2016-02-03 14.20.59.png](https://qiita-image-store.s3.amazonaws.com/0/98558/8a1bd01f-9341-3205-4148-be8c70875e5f.png)


この物体をフィールドに見立てて、平べったい板状にする。
![スクリーンショット 2016-02-03 14.23.29.png](https://qiita-image-store.s3.amazonaws.com/0/98558/32b4bd1a-fb30-38b8-2037-020a4902d997.png)

続いて、Cubeを置いたときと同様にして、Sphereを作る。
![スクリーンショット 2016-02-03 14.26.47.png](https://qiita-image-store.s3.amazonaws.com/0/98558/248bb3b6-e0d3-63ae-d409-ad297c1c37b4.png)

何かあるけど、見えない。
生成されたポジションが板と重なっているので、ポジションを調整します。

直接キーボードで打ち込んでもいいし、Yのあたりをクリックして、
左右に動かしても変更することができる。
![スクリーンショット 2016-02-03 14.27.46.png](https://qiita-image-store.s3.amazonaws.com/0/98558/29c8bd58-524e-1752-7ee5-bea80f406bcb.png)

Y座標を１以上にすると、球体が顔を出してきます。

![スクリーンショット 2016-02-03 14.28.37.png](https://qiita-image-store.s3.amazonaws.com/0/98558/e66fe31f-92fa-cb4a-eba0-afa1797fa069.png)

この球体に重力の影響を与えます。

Hierarchyで、Sphereが選択された状態で、
InspectorのAdd Componentをクリック
コンポーネントの一覧から、Physicsを選ぶ。
さらにその中にある、Rigidbodyを選択

![スクリーンショット 2016-02-03 14.33.01.png](https://qiita-image-store.s3.amazonaws.com/0/98558/0c5d8051-d4d0-52df-ae82-6dff3a0acccd.png)

Rigidbodyのパラメータ
- Mass 質量
- Drag
- Angular Drag
- Use Gravity
- Is Kinematic
- Interpolate
- Collision Detection
- Constraints
- -Freeze Position
- -Freeze Rotation

これで、球体に重力が加わる。
しかし、このまま動かしても、落ちて板に乗っかるだけです。
非常に不自然な動きになります。

跳ねる動作を追加します。

AssetsにPhysic Matrialを作成します。
![スクリーンショット 2016-02-03 15.00.59.png](https://qiita-image-store.s3.amazonaws.com/0/98558/5afa6006-ed55-4221-ccf3-f433136c16f7.png)

作成したNew Physic Materialを選択し、
Inspectorで以下のパラメータを変更

Bounciness = 1

減衰係数を設定する項目で、
１だと減衰しない
0だとはねない

Physic Material をオブジェクトに設定

HierarchyのCube,Sphereの

Cube  :Box ColliderのMaterial と
Sphere:Sphere ColliderのMaterial に設定

![スクリーンショット 2016-02-03 15.06.56.png](https://qiita-image-store.s3.amazonaws.com/0/98558/2af02dc8-3813-bb28-fef5-a9270f6db71b.png)


計算ロジックとしては、
物体それぞれに反発係数を設定し、
ぶつかった二つの物体A,Bの減衰係数が
両方１の場合、減衰なし

A:1.0 B:0.5だと
AとBがぶつかった場合は、減衰率0.5となる。


ただ、A:1.0,B:0.0にした場合だと
跳ねないかと思ったが、試してみると少し跳ねる。

そのため、単純な積算とかではないのだろう。
そこらへんの詳細はドキュメントに書いているのか
必要になったら確認する。


とりあえず、
ここまで。
MacからiPhoneのスクリーンショットを取得

ソシャゲがだるいので自動化しようとしていた際の覚え書き
スクリーンショットはオートで取れるが脱獄せずにタップ操作を発生させるのが予想以上に大変でお蔵入りになった

# MacからiPhoneのスクリーンショットを取得

YosemiteからQuick Time PlayerのMovie RecordingでiPhone画面を表示できるようになったのでそれを使う。

```objc

- (CGImageRef)getIPhoneScreenshot {
	
	CGWindowID windowID = [self getMovieRecordingWindowID];
	
	CGWindowImageOption imageOptions = kCGWindowImageDefault;
	CGWindowListOption singleWindowListOptions = kCGWindowListOptionIncludingWindow;
	CGRect imageBounds = CGRectNull;
	
	return CGWindowListCreateImage(imageBounds, singleWindowListOptions, windowID, imageOptions);
}

- (CGWindowID)getMovieRecordingWindowID {
	
	CGWindowListOption windowListOption = kCGWindowListOptionAll | kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements;
	CFArrayRef windowList = CGWindowListCopyWindowInfo(windowListOption, kCGNullWindowID);
	
	NSInteger listCount = CFArrayGetCount(windowList);
	
	for (CFIndex i = 0; i < listCount; i++) {
		
		CFDictionaryRef windowInfo = CFArrayGetValueAtIndex(windowList, i);
		
		CGWindowID windowID = 0;
		CFNumberGetValue(CFDictionaryGetValue(windowInfo, kCGWindowNumber), kCGWindowIDCFNumberType, &windowID);
		
		CFStringRef windowName = CFDictionaryGetValue(windowInfo, kCGWindowName);
		
		if ([(__bridge NSString *)windowName isEqualToString:@"Movie Recording"]) {
			return windowID;
		}
	}
	return 0;
}

```


# スクリーンの操作

## タップ

・iPhone背面のケースとスクリーンを同通するとタップとして認識される
・まずスクリーンに端を解放した導線を接触させておいて、次に解放端を握った時もタップとして認識された
・実験してみたところ、画面につける端子は面積（1~2cm^2以上）が必要
・画面に導線を接触させておき、トランジスタやFETで導通させることでタップを発生させるのはうまくいかなかった。物理スイッチではできたのでリレーならなんとかなるかも
CentOS7+PHP7+CodeIgniter3.0.4の環境を作る。

Composerのインストール

```lang:
# curl -sS https://getcomposer.org/installer | php
```

どのユーザでも使用出来るようにコマンドパスが通る場所に保存。

```lang:
# mv composer.phar /usr/local/bin/composer
```

phpをインストール

```lang:
# yum -y install php php-pecl-apc php-mysql php-gd php-mbstring php-mcrypt php-xml php-pecl-redis php-opcache php-devel zlib-devel php-pecl-zip --enablerepo=remi-php70
```

Codeigniterをインストールするフォルダに移動して、「composer.json」というファイルを作成する。

```lang:composer.json
{
    "require": {
            "codeigniter/framework": "3.0.4"
    }
}
```

Composerを使用してインストール

```lang:
# composer install
```
Markdownで書くbashコマンド

備忘録利用で kobito をよく利用しています。
bash コマンドを Markdown で記述する際に毎回悩んでいるので、調べた内容の備忘録を。

bash コマンドを記述する際のシンタックスタイプは以下の通りです。

* bash,sh,ksh
* shell-session
* ~~console~~(昔はあったようですが、補完に出てこないため廃止？)

各出力結果を見てみましょう。

```none:none
# コメント
# echo hello
hello
$ echo hello
hello
test@test $ echo
test@test # echo
```

まずは参考までの none です。

```bash:bash
# コメント
# echo hello
hello
$ echo hello
hello
test@test $ echo
test@test # echo
```

次に bash です。コマンドは色づけしてくれるのですが、#～にすると～の部分が灰色となり見づらくなります。コメント部なので仕方ないのですが…
「$」や「#」は一般ユーザや特権ユーザ(root)を表す場合も多い為、#を先頭に記述する場合も多いと思います。

```shell-session:shell-session
# コメント
# echo hello
hello
$ echo hello
hello
test@test $ echo
test@test # echo
```

最後に shell-session です。こちらはコマンド出力結果を貼り付ける時に利用します。先頭をプロンプト(～@～ $ or #)形式で記述することで、その行だけ文字色が灰色にはならないようです。


**結論**
shell スクリプトを記述する ⇒ bash
コマンドの結果を貼り付ける ⇒ shell-session

コマンドの羅列 + コメント記載で利用している私は bash の「#」には妥協しようと思います…
(別のタイプを指定すれば綺麗に見えるのでしょうか…)

**おまけ**

```:指定無し
# コメント
# echo hello
hello
$ echo hello
hello
test@test $ echo
test@test # echo
```

「none」とはハイライトの仕方が違うようです。
私の利用用途では一番しっくりきているのですが、指定なしは何用のハイライトなんでしょう。


参考URL：[Qiitaでシンタックスハイライト可能な言語一覧](http://qiita.com/Qiita/items/e84f5aad7757afce82ba)
前月対比・前日対比のグラフ表示において、できるだけ小さい面積で数字もビジュアルも満たす...

## はじめに
初見ではムムムとなると思いますが、慣れると..?
個人差あると思いますので、一つのアイデアとして見てください。

## 実装例
<img width="400" alt="sample.png" src="https://qiita-image-store.s3.amazonaws.com/0/111947/d2674e10-6b24-6728-7a21-d1d96bf27467.png">

今回は、**前月対比**を例に説明します。

### 比較する基準日を変更できるようにする
今日が**2016/02/03**ですが、まだ19時です。24時までの数値をもとにいろいろ比較しなければ正確とは言えません。ですので、基準日を「1日前」というように変更することができるようにしています。
今回の場合、基準日は**2016/02/02**ということになります。

### 前月の全体を表示する
オレンジのグラフの**3,318,610,572**の部分です。
これで、前月全体と今月の基準日までの数値を比較できるようになります。

### 前月の基準日までを表示する
今月の基準日は**2016/02/02**ですので、前月の基準日を**2016/01/02**とし、前月1日から前月の基準日までを表示します。
オレンジのグラフの**409,293,166**の部分です。
これで、前月の基準日までと今月の基準日までの数値を比較できるようになります。

### 今月の基準日までを表示する
オレンジのグラフの**409,927,835**の部分です。
* * *
ここまでで主要な数値が出そろいました。
あとは、(1)～(3)までの数値を使っていきます。
あともう少しです。
* * *
### 前月全体に対する今月基準日までの進捗率
オレンジのグラフの**12.35%**、**-2,908,682,737**の部分です。
進捗率、下振れ・上振れしている数量を表示するとともに、細いバーで率のイメージも伝えます。

### 前月基準日と今月基準日までの比較
オレンジのグラフの**100.16%**、**+634,669**の部分です。
進捗率、下振れ・上振れしている数量を表示するとともに、細いバーで率のイメージも伝えます。

## さいごに
前日対比、については前月対比の月と日の概念を、日と時間におきかえただけです。

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
UITextFieldのshouldChangeCharactersInRange:replacementString:は使えない子かもしれない


`shouldChangeCharactersInRange:replacementString:`の中でUITextFieldに入力された文字列を取得しようとして、だいぶ手こずった。

英数キーボードで入力した場合は問題なさそう。
日本語キーボー度で入力した場合は文字列の追加については問題なさそうなんだけど、未確定の状態でdeleteしたらUITextFieldに文字列が残っていてもUITextFieldのlengthが0と判定されるっぽい。

ひどい。

[iOS で文字数制限つきのテキストフィールドをちゃんと作るのは難しいという話](http://blog.niw.at/post/92806309874)を参考にして、`UITextFieldTextDidChangeNotification`を使う方法で実装したところ、UITextFieldに入力された文字列を取得でき、確定の状態でdeleteしたときも残された文字列を正しく取得できた。
Bash だけできる冪等なバックグラウンド起動コマンド。

git-push で任意の(再)起動コマンドを走らせる時に便利だったメモ。

```sh
PID=$(ps aux | grep '<コマンド>' | awk '{ print $2 }')
[ -z "${PID}" ] && kill ${PID}
nohup <コマンド> 2>&1 | logger &
unset PID
```
pebble sdk でエミュレータが動かないときの対処

Pebble アプリをつくるときは[Cloud Pebble](http://cloudpebble.net)が便利ですが、やはりローカルで開発したいという気持もあります。

ローカルの開発環境のPebbleSDKにはエミュレータもついていて、実機がなくてもアプリを実行できるのですが、うまくエミュレータが起動してくれなくてはまったのでメモです。

## 環境
Mac 10.11
PebbleSDK 3.1

## 公式チュートリアル

公式の使いかたには、アプリのディレクトリで以下のコマンドを実行すればエミュレータが起動すると書いてある

```bash
$ pebble install --emulator basalt
```

## やってみた

```bash
$ pebble install --emulator basalt            
[INFO    ] Starting Pebble basalt emulator...
[INFO    ] Starting phone simulator...
[ERROR   ] Could not connect to phone at localhost:12342. Ensure that 'Developer Connection' is enabled in the Pebble app.
```

うまくいかない。

## 対処

何か足りてないのかもしれないので brew doctor を実行。

```bash
$ brew doctor
Warning: Some installed formula are missing dependencies.
You should `brew install` the missing dependencies:

    brew install pebble-qemu

Run `brew missing` for more details.
```

それっぽいの出てきた。

```bash
% brew install pebble-qemu
% pebble install --emulator basalt
[INFO    ] Starting Pebble basalt emulator...
[INFO    ] Starting phone simulator...
[INFO    ] Installation successful
```

できた。
swagger ドキュメントからコマンド一発でモックサーバを自動生成する (haskell-servant)

# Swagger-Codegen (haskell-servant)

## それ何？
Swagger-Codegen は WebAPI ドキュメントツール「Swagger」向けに書いた API ドキュメントから各言語向けに API のクライアントとサーバを自動で生成できるツールです。
今回、筆者が実装したのは haskell-servant を生成できる機能です。
ちなみにサーバを動かすだけなら Haskell の知識は全く必要ありません。
https://github.com/swagger-api/swagger-codegen

## 何に使うの？
- 1行もコードを書かないでモックサーバが作れます。
- haskell-servant のモデル定義を簡単に得られます。
モックサーバではなく実際に機能を持つサーバを実装することもできます。

## インストール
以下がインストールされていない場合には事前に準備してください。

- Java
- Maven  

## ビルド
以下のコマンドで swagger-codegen をビルドします。

```lang:shell
cd swagger-codegen  
git clone https://github.com/swagger-api/swagger-codegen.git
mvn package
```
## 動かしてみる
以下のコマンドで swagger ドキュメント(json) からモックサーバを生成・起動します。

```lang:shell
java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate \
  -i http://petstore.swagger.io/v2/swagger.json \
  -l haskell-servant \
  -o /path/to/mock-server
cd /path/to/mock-server
stack build
stack exec server
```

上記の `-i` オプションで独自の swagger json を指定すれば、オリジナルのモックサーバを生成することができます。
petstore であれば、例えば以下の uri でモックの出力結果を得ることができます。
http://localhost:8080/user/test

## 実装のポイント
- モックサーバがダミー値をランダムで自動に生成する  
QuickCheck を使って値をランダムに生成している。

## 今後の予定
- リファクタリング  
動くことを優先にしたので、十分に良い実装とは言えない。
良い修正案があれば PullRequest をください！
- Swagger-codegen haskell クライアントの実装  
サーバ生成をメインにしていますが、haskell-servant の効力によりクライアントも容易に作成できます。現状では自動生成できてないので、自前で実装することが必要になります。 
- 未実装のオプションへの対応(エラーメッセージ、値範囲制限など)  
型が強い Haskell のメリットをより活かせるように。
ロードバランサーごしにRemoteAddressを取得する

サーバ構成を

　　　　　[世の中]
　　　　　　｜
　　[ロードバランサー]
　　　　　　｜
　[アプリ][アプリ][アプリ]
　　　　　　｜
　　　　　[DB][DB]

みたいにしてる場合、アプリケーションサーバで普通に

```php:php

$ip = $_SERVER['REMOTE_ADDR'];

```

とすると、ロードバランサーのIPが入っちゃって、ユーザのIPが分かんない。


```php:php

if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ipArray = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
    $ip = $ipArray[0];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}

```

↑こうすればいいらしい。

元ネタ
https://teratail.com/questions/131
AWS AutoScalingのスケジュール設定がコンソールからできるようになってた

# AWS AutoScaling

2015/12月までは下記のような面倒なコマンドをawscliで入れないといけなかったが
最近？コンソールからも設定できるようになっていたので軽く紹介

## 今までは
下記のコマンドで設定していた。スケーリングポリシーはコンソールで設定できるのにスケジュールは設定できなくて不便だった<code>
aws autoscaling put-scheduled-update-group-action --auto-scaling-group-name "group-name" \
  --scheduled-action-name "action-name" --recurrence "unix cron syntax" --desired-capacity
</code>

実例<code>
aws autoscaling put-scheduled-update-group-action --auto-scaling-group-name autoscaling-test \
--scheduled-action-name scale-out-1945 --recurrence "45 10 * * *" --desired-capacity 5 \
--profile autoscaling
</code>

recurrenceにcronと同様の形式で時間はUTCで指定

## これからは

EC2のAutoScalingから
![Untitled (1).png](https://qiita-image-store.s3.amazonaws.com/0/97433/6b5afe61-b218-7852-b2ca-29dd905d79f5.png)

こうして
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/97433/2222a22a-762e-9521-ca12-bb5f0d4ffdef.png)

この画面から設定すればOK
![スクリーンショット 2016-02-03 17.06.56.png](https://qiita-image-store.s3.amazonaws.com/0/97433/1ef6306f-18dc-47e4-5a4b-becd603bbcad.png)

繰り返しの項目は基本cron形式。一回のみや毎日、毎時等選択できるがUTC基準っぽいのでcronを推奨

それでは快適なAutoScaling環境を
pandas 備忘録

# pandas備忘録
## 概要
- メモ程度ですが，簡単にまとめていきます
- 随時更新していきます(たぶん)

## 参考
- http://blog.brainpad.co.jp/entry/2014/12/10/204111
- http://sinhrks.hatenablog.com/entry/2015/06/18/221747
 - iteritems()について

## 方法
### csvファイルの読み込み
```
In [1]: df = read_csv('./input/hoge.csv')
```
- シングルクォーテーション忘れがち．．

### 中身の確認
```
In [2]: df
Out[3]:
  label  a   b    c  d
0    aa  1  11  111  e
1    bb  2  22  222  e
2    cc  3  33  333  e
3    dd  4  44  444  e
```

### 1ラベル目を抽出
```
In [2]: df[[1]]
Out[2]:
   a
0  1
1  2
2  3
3  4
```
### 'a'ラベルを抽出
```
In [3]: df['a']
Out[3]:
0    1
1    2
2    3
3    4
Name: a, dtype: int64
```
### 場所指定して要素にアクセスその1(ラベルで指定)
```
In [4]: df.loc[:,['a','b']]
Out[4]:
   a   b
0  1  11
1  2  22
2  3  33
3  4  44
```
### 場所指定して要素にアクセスその2(列で指定)
```
In [5]: df.iloc[:,[1,2]]
Out[5]:
   a   b
0  1  11
1  2  22
2  3  33
3  4  44
```

### 数値部分の統計量
```
In [6]: df.describe()
Out[6]:
              a          b           c
count  4.000000   4.000000    4.000000
mean   2.500000  27.500000  277.500000
std    1.290994  14.200939  143.300384
min    1.000000  11.000000  111.000000
25%    1.750000  19.250000  194.250000
50%    2.500000  27.500000  277.500000
75%    3.250000  35.750000  360.750000
max    4.000000  44.000000  444.000000
```

### numpy.ndarray形式で
```
In [7]: df.values
Out[7]:
array([['aa', 1, 11, 111, 'e'],
       ['bb', 2, 22, 222, 'e'],
       ['cc', 3, 33, 333, 'e'],
       ['dd', 4, 44, 444, 'e']], dtype=object)
```

### 各ラベルのデータタイプ取得
```
>>> df.dtypes
target      int64
v1        float64
v2        float64
v3         object
v4        float64
v5        float64
v6        float64
v7        float64
v8          int64
v9        float64
dtype: object
```
### ラベルのデータタイプで選択
```
>>> df.ix[:, df.dtypes == np.int64]
         target     v8
   No.1      1      2
   No.2      2      2
```

### iteritems(), iterrows()
```
>>> df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c'])
>>> df
    A  	B   C
a	1	4    a
b	2	5    b
c	3	6    c

>>> for (key,column) in df.iteritems():
        print key
        print column
A
a    1
b    2
c    3
Name: A, dtype: int64
B
a    4
b    5
c    6
Name: B, dtype: int64
C
a    x
b    y
c    z
Name: C, dtype: object
```
```
>>> for (key, row) in df.iterrows():
        print key
        print row
a
A    1
B    4
C    x
Name: a, dtype: object
b
A    2
B    5
C    y
Name: b, dtype: object
c
A    3
B    6
C    z
Name: c, dtype: object
```
#### factorize
```
>>> pd.factorize(df['A'])
(array([0, 1, 2]), Int64Index([1, 2, 3], dtype='int64'))
>>> pd.factorize(df['B'])
(array([0, 1, 2]), Int64Index([4, 5, 6], dtype='int64'))
>>> pd.factorize(df['C'])
(array([0, 1, 2]), Index([u'x', u'y', u'z'], dtype='object'))
```
```
>>> df['C'], indexer = pd.factorize(df['C'])
>>> df
	A	B	C
a	1	4	0
b	2	5	1
c	3	6	2
>>> indexer
Index([u'x', u'y', u'z'], dtype='object')
```
Kemalで100,000 rps の世界に近づく

[Kemal](https://github.com/sdogruyol/kemal) はCrystal-langで書かれた Sinatra likeな高速Webアプリケーションフレームワークです。
Githubに掲載されているベンチマーク結果を見ると、100,238 rps 出るとか。速いです。あまりにも高速なので、きちんとした計測ツールを使わないと正しい計測ができません。MacOS環境の`ab`とかでは計測ツール側のオーバーヘッドが大きくて1000rps程度で測定限界に達してしまいます。

作者のsdogruyol氏に聞いたところ、「`wrk`を使え」ということだったので、`brew install wrk` で導入します。

計測用の`server.cr`。Sinatraっぽい。

```crystal-lang
require "kemal"
logging false

get "/" do
  "ok"
end
```

ログは切ります。
kemalは`shards`で導入します。以下 `shard.yml`

```yaml
dependencies:
  kemal:
    github: sdogruyol/kemal
```

`shards install` で ok
releaseビルドして`production`環境で起動。

```shell-session
% crystal build --release server.cr
% ./server -e production
```

`top -o cpu` でCPU使用率が高いプロセスがあれば停止しておきます。あとは `wrk` で測定です。

```shell-session
% wrk -c 128 -d 10 http://127.0.0.1:3000
Running 10s test @ http://127.0.0.1:3000
  2 threads and 128 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.55ms  371.64us  10.96ms   81.07%
    Req/Sec    41.33k     1.85k   45.73k    82.00%
  822074 requests in 10.00s, 69.78MB read
Requests/sec:  82181.62
Transfer/sec:      6.98MB
```

82181.62 rps。なかなかいい値が出ました :)
検証環境は Macbook Pro 13 (CPU 3.1 GHz Intel Core i7, RAM 16 GB 1867 MHz DDR3) です。
背景画像の複数指定(multiple background images)をしてselect要素を装飾する

以下のようなプルダウンメニューの装飾を`multiple background images`とbackground-positionのpx指定を利用して作成します。

<img width="211" alt="スクリーンショット 2016-02-03 15.36.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/52375/a8f91b80-81e4-d78a-cb4d-61eb3c987b0a.png">

`multiple background images`は文字通り、1つの要素に背景画像の複数指定を示しています。具体的な方法は以下のコードを見てもらえば分かると思いますが、`,`(カンマ)で区切っていくだけです。

注意点としては、上のレイヤーにくるものを先に書いてあげないと、思った通りの表示ができない可能性があります。
今回でいうと、三角形のアイコンの指定を先に書かず、グラデーションの指定を先にしてしまうと、グラデーションの下にアイコンが配置されるような形になるため、表示されなくなってしまいます。

次にアイコンの位置の指定ですが、`background-position`で`right 10px`のような指定が可能になり、要素の右や下から相対的な位置で配置できるようになりました。
ブラウザのサポート状況は以下のリンク先で確認してください。

[CSS background-position edge offsets](http://caniuse.com/#feat=css-background-offsets)
#HTML

```html
<select name="" id="" class="select">
    <option value="">選択してください</option>
    <option value="">あああああ</option>
    <option value="">いいいいい</option>
</select>
```

#CSS
```css
.select {
    -webkit-appearance:none;
    font-size: 16px;
    padding: 10px 20px 10px 10px;
    width: 200px;
    text-align: center;
    background: #ffffff;
    background: url(tri.png) no-repeat right 10px center,
                -webkit-linear-gradient(top,  #ffffff 0%,#f6f6f6 47%,#ededed 100%);
    background: url(tri.png) no-repeat right 10px center,
                linear-gradient(to bottom,  #ffffff 0%,#f6f6f6 47%,#ededed 100%);
}
```
エラー画面などに表示されるTomcatのバージョンを隠す

## はじめに
404や500等のエラー画面のフッタに表示されてしまうTomcatのバージョン情報。
そのままにしておくと問題のあるバージョンを使い続けていることもすぐにバレてしまいます。
理想は常に最新版を使うことですが、運用面・テスト面で限界もあるので、バージョンを隠す対応はしておいたほうがよいでしょう。

## 手順
catalina.jarを解凍し、バージョン情報が記載されているファイルを編集します。

```
$ cd $TOMCAT_HOME
$ jar xf catalina.jar org/apache/catalina/util/ServerInfo.properties
$ vi org/apache/catalina/util/ServerInfo.properties
```
バージョン情報等を空に変更します。

```properties:org/apache/catalina/util/ServerInfo.properties
#server.info=Apache Tomcat/8.5.9
server.info=
#server.number=8.5.9.0
server.number=
#server.built=Dec 5 2016 20:18:12 UTC
server.built=
```
編集したファイルを元に戻します。

```
$ jar uf catalina.jar org/apache/catalina/util/ServerInfo.properties
$ rm -fr org
```

## 動作確認
設定変更後にTomcatを再起動してください。
バージョンの表示がなくなっていることを確認できます。

![- Error report.png](https://qiita-image-store.s3.amazonaws.com/0/111947/4a534db3-dcbc-f708-7b0b-4195b1cf026c.png)
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)