OmniAICreator/Qiita-1.07M huggingface dataset:
OpenGL + GLUT 入門メモ


* [GLUTによる「手抜き」OpenGL入門](http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html)
* [Amazon.co.jp： GLUTによるOpenGL入門―「OpenGL Utility Toolkit」で簡単3Dプログラミング! (I・O BOOKS): 床井 浩平: 本](http://www.amazon.co.jp/GLUT%E3%81%AB%E3%82%88%E3%82%8BOpenGL%E5%85%A5%E9%96%80%E2%80%95%E3%80%8COpenGL-Utility-Toolkit%E3%80%8D%E3%81%A7%E7%B0%A1%E5%8D%983D%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-I%E3%83%BBO-BOOKS/dp/4777511340/ref=sr_1_1?ie=UTF8&qid=1398562903&sr=8-1&keywords=opengl+glut)


環境は Mac OS X 10.9.2

# OpenGL,GLUTのインストール

Mac OS X は 開発に必要なライブラリ等は Developer Tool に入っているのでダウンロードなどは不要。


# HelloWorld

```c:hello.c
#include <GLUT/glut.h>

// ウィンドウへの描画関数
void display(void)
{
}

int main(int argc, char *argv[])
{
  // OpenGL/GLUT 環境の初期化
  glutInit(&argc, argv);
  // ウィンドウを開く
  glutCreateWindow("Hello OpenGL/GLUT world.");
  // ウィンドウへの描画関数の登録
  glutDisplayFunc(display);
  // メインループ開始
  glutMainLoop();
  return 0;
}
```

コンパイル

```
cc hello.c -framework GLUT -framework OpenGL
```

Mervericks だと大量のDeprecation warring が出るので `-Wno-deprecated` をつける

```
cc hello.c -framework GLUT -framework OpenGL -Wno-deprecated
```

#
Macのターミナルで( ᐛ)パァが降る


## 気分が落ち込んだ時にどうぞ

```php
php -r 'list($y, $c)=explode(" ",`stty size`);$S="\x28\xE1\x90\x9B\x20\xF0\x9F\x91\x90\x20\x29";$a=[];echo "\033[2J";for(;;){$r=rand(0,$c-6);if(!isset($a[$r])){$a[$r]=0;};foreach($a as $x=>$o){$a[$x]++;if($y<$a[$x]){$a[$x]=NULL;}echo "\033[{$o};{$x}H      \033[{$a[$x]};{$x}H{$S} \033[0;0H";}usleep(20000);}'
```

![paa.png](https://qiita-image-store.s3.amazonaws.com/0/39026/17599cd3-a0ee-c875-e317-097f15d934ac.png "paa.png")

\#底に溜まらないようにしたりいろいろした(つもり)


## 参考
http://deeeet.com/writing/2014/04/30/beer-on-terminal/
http://uzulla.hateblo.jp/entry/2014/04/30/201006
SpriteKit入門 -18-


##描画順序
1. Scene
2. zPosition順
3. 親Node
4. 子Node(childrenプロパティ順)

**ignoresSiblingOrderプロパティがYESの場合は、zPositionが同じなら親と子の区別なく最適化された順序で描画する。**

##Hit順序
描画順序の逆。
**userInteractionEnabledをYESにしないとHitしない。**
Android Studio 起動時に NoClassDefFoundError とかになったら

Android Studio のアップデート中に色々あって、アップデートが強制的に中断され、簡単に言えば環境が壊れてしまった状態。

## げんしょう :angry: 

Android Studio 自体の起動中に NoClassDefFoundError とか表示され、起動しない。

## かいけつほうほう :smile: 

インストールしなおす

Getting Started with Android Studio | Android Developers - http://goo.gl/iJEvl
CSSメタ言語のSass ScssとLessを比較しました

# CSSメタ言語は基本的に同じ
LessやSassとかScssとかいっぱいありますが、基本的にはみんな同じです。
とりあえずCSSと似ているScssを使うといいと思います。

#GUIのコンパイラを使おう
CSSメタ言語はGUIコンパイラでコンパイルするといいです。compassなどを利用しコマンドラインでコンパイルしようと思いついても、GUIを使った方がずっと楽でいいとおもいます。

GUIコンパイラを２点、PreprosとKoalaをご紹介します。

* Prepros
 * https://prepros.io/
* Koala
 * http://blog.sou-lab.com/koala/

Koalaは.mapというファイルが生成されるらしく、Preprosがオススメです。

# Sass/Scss と Less の比較
Sass/ScssとLessを比較です。一番違うのは構築の環境です。

|  | Sass/Scss | Less |
|:----------:|:-----------:|:------------:|
| ドキュメント | http://sass-lang.com/documentation/file.SASS_REFERENCE.html | http://less-ja.studiomohawk.com/ |
| インストールとコンパイル       |        rubyのgemをインストール |     node.jsパッケージを使うと簡単      |

## 変数
変数の比較です。

|  | Sass | Scss | Less |
|:----------:|:-----------:|:-----------:|:------------:|
| 変数 | $hoge | $hoge | @hoge | 
| 代入 | $hoge : 10px | $hoge : 10px; | @hoge : 10px; | 

SassとScssの変数は$から始まります。

```sass:Sassの変数
$red : #FF0000
.hoge
  background-color : $red
```
```scss:Scssの変数
$red : #FF0000;
.hoge {
  color: $red;
}
```

Lessの変数は@から始まります。

```less:Lessの変数
@red : #FF0000;
.hoge {
  background-color : @red;
}
```

Lessの変数は@で始まるので、CSSの@mediaなどの記法と被る可能性があり注意が必要です。

# おまけ
BootstrapはBootstrap4からScssになるらしく、Bootstrap5ではPostCSSになるぽいので参考にしてくださいね☆（ゝω・）vｷｬﾋﾟ

<blockquote class="twitter-tweet" lang="ja"><p lang="en" dir="ltr">Oh, btw—Bootstrap 4 will be in SCSS. And if you care, v5 will likely be in PostCSS because holy crap that sounds cool.</p>&mdash; Mark Otto (@mdo) <a href="https://twitter.com/mdo/status/591364406816079873">2015, 4月 23</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
RedhatのStruts1脆弱性(CVE-2014-0114)対応 Part.2

[前回](http://qiita.com/ykare@github/items/9c7a244cb20345b7731c)に続いて今度はRPMのバイナリを調べてみる。

#調査対象
CentOS用にリリースされていたバイナリ。64bit版だけど調べたいのはjarなのでどれでもいいかと思う。

http://mirror.centos.org/centos/5/updates/x86_64/RPMS/struts-1.2.9-4jpp.8.el5_10.x86_64.rpm


#RPMの中身
 * /usr/share/doc/struts-1.2.9/STATUS.txt
 * /usr/share/doc/struts-1.2.9/LICENSE.txt
 * /usr/share/doc/struts-1.2.9/README
 * /usr/share/doc/struts-1.2.9/INSTALL
 * /usr/share/doc/struts-1.2.9/NOTICE.txt
 * **/usr/share/java/struts-1.2.9.jar**
 * /usr/share/java/struts.jar -> struts-1.2.9.jar
 * /usr/share/struts/struts-nested.tld
 * /usr/share/struts/struts-config_1_1.dtd
 * /usr/share/struts/validator-rules.xml
 * /usr/share/struts/struts-config_1_0.dtd
 * /usr/share/struts/struts-tiles.tld
 * /usr/share/struts/struts-bean.tld
 * /usr/share/struts/struts-config_1_2.dtd
 * /usr/share/struts/struts-logic.tld
 * /usr/share/struts/web-app_2_2.dtd
 * /usr/share/struts/struts-html.tld
 * /usr/share/struts/web-app_2_3.dtd
 * /usr/share/struts/tiles-config_1_1.dtd
 * /usr/lib64/gcj/struts/struts-1.2.9.jar.db
 * /usr/lib64/gcj/struts/struts-1.2.9.jar.so

#対応方法
今回はLinuxで実際にインストールして試したわけじゃないけど、 */usr/share/java/struts-1.2.9.jar* が脆弱性対応されたモジュール本体である。もちろん、こんな場所にあっても通常は役に立たないので、これを各Webアプリケーションの **WEB-INF/lib/** にある *strutsXXX.jar* と置き換えて配置してやる必要がある。

Windows7 + Java7 + Tomcat8.0.5 の環境で *struts-example.war* で確認したところ、当然のように出回っている *POC* は防ぐことができた！
(Redhatの修正は、攻撃を検知しても例外を出すわけでなく **単に無視するだけであることに注意** ）

#JARの中身
*struts-1.2.9.jar* を展開してみた。

```properties:META-INF/MANIFEST.MF
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.5
Created-By: 4.1.2 20080704 (Red Hat 4.1.2-54) (Free Software Foundatio
n, Inc.)
Extension-Name: Struts Framework
Specification-Title: Struts Framework
Specification-Vendor: The Apache Software Foundation
Specification-Version: 1.2.9
Implementation-Title: Struts Framework
Implementation-Vendor: The Apache Software Foundation
Implementation-Vendor-Id: org.apache
Implementation-Version: 1.2.9
Class-Path: commons-beanutils.jar commons-digester.jar commons-fileup
load.jar commons-logging.jar commons-validator.jar jakarta-oro.jar
```

*Create-By: Red Hat* となっている。

```shell-session
$ javap -v org/apache/struts/Globals.class | grep version 
minor version: 0
major version: 46
```

*major version: 46* なのでJDK1.2用にコンパイルされていることが分かる。Struts1なのでJavaも古いバージョンを利用しているかもしれないけど、これなら安心か？
さすが、Red Hatさん！抜かり無い(笑)

#参考
* [RedhatのStruts1脆弱性(CVE-2014-0114)対応 Part.1](http://qiita.com/ykare@github/items/9c7a244cb20345b7731c)
* Redhat セキュリティアップデート https://rhn.redhat.com/errata/RHSA-2014-0474.html
* [S2-020類似攻撃のStruts1での対策方法](http://qiita.com/kawasima/items/670d2591bc8fea19dc1d)
* [自作のStruts1対策](https://gist.github.com/ykare/1fb2d5d11e16cb0003c3)
[状態マシン図] 終了同期を取る

状態マシンを設計していて、何か２つのことを同時並行しておこない、両方が終了したら、次の状態に遷移したい、というモデルを作りたいことがある。

そのときに、直交状態＋終了状態＋完了遷移を組み合わせるとうまく実現できる。

![36_state.png](https://qiita-image-store.s3.amazonaws.com/0/11188/6370cc73-5dd7-b45c-4ec8-05365d76d680.png)

状態２１と状態２２が直交していて、両方が終了状態まで到達したときに、状態９に遷移する。

このように、内部に直交する領域が複数ある場合は、すべての領域が終了状態になったときに、その状態が終了状態となると決められている。

その領域が終了状態なったかどうかは、以下のアルゴリズムで判断する。

1. その状態が単純状態であった場合は、入場時アクションを実行終わったところで、終了状態に到達している。
1. その状態が複合状態（コンポジット状態）であった場合は、<br>１つまたは複数ある領域（＝＝状態）のすべてが終了状態に到達しているときに、終了状態となる。
1. その領域に終了状態が１つ以上ある場合は、いずれかの終了状態に到達しているならば、終了状態である。
1. その領域に終了状態が１つもない場合は、1と同じ。

このため、以下の場合は、

![37_state.png](https://qiita-image-store.s3.amazonaws.com/0/11188/04f2b845-bf04-687b-c8ec-ee76ea178ce3.png)

この場合は、領域２３は状態１０と状態１１のどちらにいても終了状態であると判断され、状態２にいればIS_IN(状態２３が終了状態）は常にTRUEとなり、流れは上のモデルと同じく、状態２１と状態２２がともに終了状態に到達したときに、状態９に遷移する。

直交合成状態で説明したが、サブマシンを持つ場合でも同様である。

---

参考文献

1. UML2.0 仕様書<br>
[http://www.amazon.co.jp/dp/4274066630/](http://www.amazon.co.jp/dp/4274066630/)<br>
p.723 完了遷移と完了イベント
[2022-04-01をもって利用不可] ntpを使わずに時刻を合わせるワンライナー (Proxy環境下でも安心)

# Caution! 本記事で紹介しているやり方は、2022年4月1日以降は利用できなくなります！いままでありがとうございました！

利用不可になる詳細については、以下のページを参照ください。
https://jjy.nict.go.jp/httphttps-index.html

以下、記事の内容は残しておきます。

## あなたのlinux、もしくはmac、なんだったらbusybox、時間合ってますか？なに、Proxy環境下だからntpがちゃんと動いてくれなくていつの間にか時刻がズレてく日々を送っている？

## このポストは

訳あってProxy環境下で作業をせざるを得ないが、ntpをProxy環境下でちゃんと動作させる術を調べるのが面倒な人のための記事です。
※ 後述しますが、Proxy自体は使います。ntpを使わずに時間を合わせられるという内容です。

## (2016.08.31更新) 真・下の一行を打ちこめば時間が合います（必要に応じて sudo をつけてね）

`date --set @"$(wget -q https://ntp-a1.nict.go.jp/cgi-bin/jst -O - | sed -n 4p | cut -d. -f1)"`

## 簡単に解説

`wget -q https://ntp-a1.nict.go.jp/cgi-bin/jst -O -`

この部分で、nictさんから時間を取得しています。以下のような内容が返ってきます。

```html
<HTML>
<HEAD><TITLE>JST</TITLE></HEAD>
<BODY>
1472647059.250
</BODY>
</HTML>
```

BODYに書いてある内容はいわゆるエポック秒というやつで、1970年1月1日から現在までにどんだけ時間が経過しているかを秒で表しているというやつです。
もしあなたのデバイスがProxy環境化にあり、すんなりwgetができない場合はここでProxyを設定する必要があるかもしれません。
典型的には、`export http_proxy=http://[your.proxy.url:port]` みたいにすればProxyは通せます。

`sed -n 4p`

この部分で、4行目を一行だけ抜き出しています。
上記の例の場合だと `1472647059.250` の部分が抜き出せます。

`cut -d. -f1`

この部分で、「ピリオドで区切った場合の1フィールド目」を抜き出しています。
`-d` でデリミター指定、`-f`で何番目のフィールドかを指定、ですね。
これで `1472647059` が抜き出せます。これを、

`date --set @[ここに↑で抜き出したエポック秒を入れる]`

という形で与えてあげることで、時間合わせを行います。
管理者権限が必要な場合は、ここに `sudo` が必要です。

## いつ使うのか

* ntpがProxyを越えてくれないよ、でも設定の方法よくわかんないよ、という方（私）が時間を合わせるとき。
* ちょっと今だけ時間合えばいいから、という今だけ急ぎたいとき。
* ntpさん、自動で時間合わせするように設定したけど、なかなかやってくれないな、、、まだかなまだかな、となってしまうせっかちな方（私）が瞬時に時間を合わせようとするとき。
* etc...

## なんで時間合わすのか

時間なんてずらしっぱなしでいいじゃん、別に困らないよ、というのであれば、いいのです。それでいいです。
ただ時間があってないと困るケースがあって、それはSSLの通信を行う場合。時間が合ってないと怒られたりします。
Arch Linux ユーザならAURを使うとき（yaourtコマンド等を使うとき）に時間があってないと怒られます。これはGitHubのリポジトリを見に行く(このときSSL通信を行う可能性がある)からです。

## 時間が合うのはわかったとして、毎日やるのか

毎日上記のコマンドを打つのも面倒ですよね！
であれば、cronで毎時実行するようにしてやればいいですよ！

@kumabook 情報提供ありがとうございました！
[Ruby] スペーストーキー問題

結城浩さんのCodeIQ スペーストーキー問題
[https://codeiq.jp/ace/yuki_hiroshi/q839](https://codeiq.jp/ace/yuki_hiroshi/q839)
を解いて応募したのですが、解答512行中2行を間違えて評価３でした。ちゃんと検算をしなかったのが敗因でした。奇数桁目にある文字が２文字連続して同じ場合にデコードできない場合があることに気が付きませんでした。大いに反省し、ソースコードを修正して正しい答えが求められるように直しました。

教訓：エンコードする問題なら、デコードするテストを書いてきちんとチェックすること。

```ruby:space2.rb

# encoding: Shift_JIS
# Ruby 2.0.0
# スペーストーキー問題
# space2.rb

def decode(word)
  debug = false
  if word.length.odd?
    decode = 'X'
  else
    decode = ''
    prev_c = ''
    prev_n = ''
    word.scan(/.{1,2}/m).each { |t|
      c = t[0,1]
      n = t[1,1]
      p c,n if debug
      # ひとつ前と文字が同じ かつ １つ前の長さが'z'でないと、デコードしても分離できない。
      if prev_c == c && prev_n != 'z'
        decode = 'X'
        break
      else
        prev_c = c
        prev_n = n
      end
      decode += (c * (n.ord - ('a'.ord - 1)))
    }
  end
  "#{decode}:#{word}"
end

File.open("result.txt",'w') { |w|
  File.open("words.txt",'r') { |r|
    while line = r.gets
      word = line.chop
      decoded = decode(word)
      w.puts decoded
      p decoded
    end
  }
}


```
Qiita Team で常に先頭にエントリーへのリンクを表示する UserScript

やっつけですが。

Tampermonkey を使ってます。 http://tampermonkey.net/

よかったら、Twitter みたいにエントリーを先頭に Pin できるような機能作ってください。 @yaotti 


```js
// ==UserScript==
// @name       Qiita Pinner
// @namespace  https://mycompany.qiita.com/
// @version    0.1
// @description  リンク集を一番上に表示します。
// @match      https://mycompany.qiita.com/
// @copyright  2014+, Atsushi Nagase
// ==/UserScript==

$('#stream-container').before('<div style="padding-bottom:3em"><h2 class="feed-heading">&nbsp;<i class="fa fa-angle-right"></i>&nbsp;Pinned Posts</h2><div class="item-box"><ul id="pinned-posts"></ul></div></div>')
var ul = $('#pinned-posts');

function addPost(title, url) {
  ul.append('<li><a href="'+url+'">'+ title +'</a></li>')
}

addPost('とっても大事なエントリー #1', 'https://mycompany.qiita.com/johndoe/items/abcdef0123456789');
addPost('俺のチートシート', 'https://mycompany.qiita.com/ngs/items/abcdef0123456789');
```

![Screen Shot 2014-05-08 at 16.07.50.png](https://qiita-image-store.s3.amazonaws.com/216/833/f32ddb5c-9a15-e77e-22e5-7e60af5eb454.png)
gulp-ruby-sass で source map が使えない場合

# compileするscssファイルにsourceMappingURLを記述すること！

`sass({sourcemap: true})`でsource mapを作成したら自動でcssの最後に`/*# sourceMappingURL=main.css.map */`が記述され勝手にひも付くっしょと思いがちですがそんなことは無いので、自力でscssに書いておきましょう。

# `sass()`の使い方

```lang:js
gulp.task('sass', function() {
  return gulp.src('sass/main.scss')
    .pipe(plumber())
    .pipe(sass({sourcemap: true}))
    .pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))
    .pipe(gulp.dest('css'))
    .pipe(notify({ message: 'Styles task complete' }));
});
```
とするとcssフォルダに、main.cssとmain.css.mapが作られます。あとは、main.cssの最後の行に下記のように記述。

```lang:js
・・・・
/*# sourceMappingURL=main.css.map */
});
```

# 途中で`rename()`すると不具合起きるので注意

```lang:js
gulp.task('sass', function() {
  return gulp.src('sass/main.scss')
    .pipe(plumber())
    .pipe(sass({sourcemap: true}))
    .pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1', 'ios 6', 'android 4'))
    .pipe(rename('main.css'))  // ← コイツ
    .pipe(gulp.dest('css'))
    .pipe(notify({ message: 'Styles task complete' }));
});
```

source mapがmain.cssとして作られ、main.css.mapは作られません。

# `style: 'compressed'`は使えません
```lang:js
gulp.task('sass', function() {
    .pipe(sass({sourcemap: true, style: 'compressed'}))
});
```
`compressed`の場合はcssに記述した`/*# sourceMappingURL=main.css.map */`がコメントとして削除されてしまい、.cssと.mapがひも付きません。
nested, compact, expanded ならダイジョウブだけど、、、うーん圧縮したい。。。
SpriteKit入門 -17-


SKActionに名前をつけて実行中のアクションを削除してみます。
下記のようにすると、1回目にタップすると点滅を始め、2回目にタップすると点滅が中断するようになります。

```objectivec:HelloScene.m
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
	SKSpriteNode *spaceship = (SKSpriteNode *)[self childNodeWithName:@"spaceship"];
	if (spaceship != nil) {
		SKAction *action = [spaceship actionForKey:@"pulse"];
		if (action != nil) {
			[spaceship removeActionForKey:@"pulse"];
		}
		else {
			SKAction *fadeOut = [SKAction fadeOutWithDuration:1.0];
			SKAction *fadeIn = [SKAction fadeInWithDuration:1.0];
			SKAction *pulse = [SKAction sequence:@[fadeOut, fadeIn]];
			SKAction *pulseForever = [SKAction repeatActionForever:pulse];
			[spaceship runAction:pulseForever withKey:@"pulse"];
		}
	}
}
```

今回はここまで。
Google maps の InfoWindow を半透明に

やっと、InfoWindow を半透明にすることができた。

```css
<style type='text/css'>
  .gm-style > div > div > div > div > div {
    color: red;
    opacity: 0.6;
  }
</style>
```

![2014-05-08_214211.png](https://qiita-image-store.s3.amazonaws.com/0/32214/387615b1-2a13-c600-187f-1a13a9ef8f34.png)
ipython notebookをubuntu12.04に入れてみた


ipythonはpythonのオリジナルのpythonインタプリタよりもハイライトや履歴管理など便利な機能を兼ね備えたツールである。さらにipython notebookはブラウザ上からスクリプトを実行でき、pythonのパッケージや、コードを学習、演習する上でとても便利なツールである。今回はこれをubuntu12.04に入れてみる。


# インストール

```
$ sudo apt-get install ipython
```

このままだと、ipythonのバージョンが古いため、pipで内容をアップグレードする。

```
$ sudo pip install —upgrade ipython[all]
$ sudo pip install jinja2
$ sudo pip install pyzmq
$ sudo pip install —upgrade tornado
```

後は、コマンドラインから実行すれば良い。

```
$ ipython notebook
```

# 外部からアクセス可能にする。

このままだと、自分で検証する専用になるが、外部で公開したい場合は、ホームディレクトリ中にある.ipythonの設定をいじることになる。

まず、

```
$ ipython profile create nbserver
```

と実行して、.ipythonの下に、profile_nbserverというディレクトリを作成する。

後は、その中のipython_notebook_config.pyを編集する。編集すべき項目は以下の通り。

```
# Kernel config
c.IPKernelApp.pylab = 'inline'  # if you want plotting support always
# Notebook config
c.NotebookApp.certfile = u'/absolute/path/to/your/certificate/mycert.pem'
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.password = u'sha1:bcd259ccf...your hashed password here'
# It's a good idea to put it on a known, fixed port
c.NotebookApp.port = 9999
```

NotebookApp.passwordの部分は、ipythonで生成すると良い。

```
$ ipython
…
In [1]: from IPython.lib import passwd
        passwd()
```

実行すると、パスワードを入力するように求められ、最終的に”sha1:…”が出力される。それを上記のc.Notebook.passwordに入力として与えると良い。セキュリティとしては、弱いがcertfileをコメントアウトすると、文字列認証でロックされたprofile設定が出来上がる。

後は、ipython実行時にprofileを指定すれば良い。

```
$ ipython notebook —profile=nbserver
```
Unity2dでゲームを作ってみた

# 作ったもの
[おはじき + タワーディフェンスのミニゲーム](https://github.com/GoldenDrop/OhajikiQuest/blob/master/Photo/%E3%82%B2%E3%83%BC%E3%83%A0%E7%94%BB%E9%9D%A2.png)

[GitHubリポジトリ](https://github.com/GoldenDrop/OhajikiQuest)

[遊んでみる](https://dl.dropboxusercontent.com/u/2219262/OhajikiQuest/TestBuild.html
)  ※UnityPlayerをインストールしている必要があります


### [ルール]
+ プレイヤー、モンスターの順に交互に行動
+ プレイヤーは自分のターンに攻撃できます
+ 敵ターンにモンスターは移動してきます
+ 全ての敵を撃破でステージクリア
+ 青いゾーンまで侵入されるとゲームオーバー

### [操作方法]
+ 左クリックドラッグでプレイヤーを飛ばすことができます
+ 左クリックドラッグ中に右クリックを押すことで引っ張り操作をやり直せます


## 作ってみた感想
##### [良かった点]
+ ３Dに比べて、はるかに素材が見つかりやすい(ゲーム作成用のフリー素材など)
+ ｚ軸を考えないで良い
+ アニメーションも簡単に作れる

##### [苦労した点]
+ Unity2Dの資料が少ない　リファレンスと睨めっこしながら試行錯誤しました

### [素材提供]
+ FSM http://www.tekepon.net/fsm/
+ 臼井の会 http://usui.moo.jp/rpg_tukuru.html
+ ユウラボ8bitサウンド工房 http://www.skipmore.com/
+ HURT RECORD http://www.hurtrecord.com/
+ ぴぽや倉庫 http://piposozai.wiki.fc2.com/
Deviseでメール認証で発行されるURLを押してそのままログインできるようにしたい。


# 問題
- [Devise](https://github.com/plataformatec/devise)を使って、メール認証を行う。
- 送られてきた認証用メールのURLをクリックすると、Signinのページではなく、ダイレクトにログインされるようにしたい。

# 解決策

## その前に

> ###Do not sign the user in after confirmation
In previous Devise versions, the user was automatically signed in after confirmation. This meant that anyone that could access the confirmation e-mail could sign into someone’s account by simply clicking the link.
Automatically signing the user in could also be harmful in the e-mail reconfirmation workflow. Imagine that a user decides to change his e-mail address and, while doing so, he makes a typo on the new e-mail address. An e-mail will be sent to another address which, with the token in hands, would be able to sign in into that account.
If the user corrects the e-mail straight away, no harm will be done. But if not, someone else could sign into that account and the user would not know that it happened.
For this reason, Devise 3.1 no longer signs the user automatically in after confirmation.

[Devise 3.1: Now with more secure defaults | Plataformatec Blog](http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/)より

Devise 3.1以前のバージョンでは、認証のURLからそのままサインインすることは可能だったようですが、メールのtypoなどで、別のアドレスに誤送信された場合、メール認証のURLからダイレクトにログインできてしまうとアカウントの情報簡単に取得されてしまうので、3.1以降は廃止されているそうです。

## それでもダイレクトログインしたい場合は、

※ ```config.allow_insecure_sign_in_after_confirmation = true``` の方法はサポートしないようです。[こちらの回答](http://stackoverflow.com/a/20961042)より。

ですので、

```ruby:app/controllers/confirmations_controller.rb

class ConfirmationsController < Devise::ConfirmationsController
  def show
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])
    yield resource if block_given?

    if resource.errors.empty?
      set_flash_message(:notice, :confirmed) if is_flashing_format?
      sign_in(resource) # <= THIS LINE ADDED
      respond_with_navigational(resource){ redirect_to after_confirmation_path_for(resource_name, resource) }
    else
      respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render :new }
    end
  end
end

```

```ruby:config/routes.rb
devise_for :users, controllers: { confirmations: 'confirmations' }
```

と記入することで実現できます。

# 参考

- [ruby on rails - Avoid sign-in after confirmation link click using devise gem? - Stack Overflow](http://stackoverflow.com/questions/18655334/avoid-sign-in-after-confirmation-link-click-using-devise-gem)

- [Devise 3.1: Now with more secure defaults | Plataformatec Blog](http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/)
Androidのオープンソース（AOSP）を見る

いくつかWeb上でAndroidのソースコードが見れたりするので、まとめてみました。

|   提供元   | 備考 |
|:-----------|:------------|
| [本家](https://android.googlesource.com/) | ソースのダウンロードは[Developerサイトへ](http://source.android.com/source/downloading.html) |
| [Github](https://github.com/android) | 本家のミラーサイト |
| [OESF](https://sites.google.com/site/devcollaboration/codesearch) | OpenGrokなのでソースコードの検索に便利 |
| [GrepCode](http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/) | ソースコードの検索に使えます。ここはframeworksだけのようです。 |
| [Linaro](http://android.git.linaro.org/gitweb) | Frameworkは本家と同じかと思うけど純正ではないはず |
| [Android SDK Search](https://chrome.google.com/webstore/detail/android-sdk-search/hgcbffeicehlpmgmnhnkjbjoldkfhoin) | Chromeエクステンションですが、AndroidDeveloperサイトからのクラスのソースコード参照 ([本家](https://android.googlesource.com/)) が容易になります。|

オープンソースの動向をチェックしたい場合は、
 [本家](https://android.googlesource.com/)のコミットログ見るといいが、[Android Community](http://androidcommunity.com/tag/aosp/)の記事も要チェック。
Gsonで上手く取れないJsonと対応策


とあるAPIをJsonで取得してGsonでパースしたときの話。

```json:User.json
{
   "user":"yamacraft",
   "note":"こんにちは"
}
```

こんな内容のJsonをGsonで取りたい場合、

```java:User.java
public class User {
    public String user;
    public String memo;
}
```

とやればいいはずなのに、なぜかIllegalargumentexceptionがでてしまう。
なんでかと思ったら、一部のvalueが空のとき、


```json:User.json
{
   "user":"yamacraft2",
   "note":{}
}
```

と返ってきたからだった（えっ）。
なので、先ほどのclassを、

```java:User.java
public class User {
    public String user;
    public Object memo;
}
```

に変えたらIllegalargumentexceptionを回避できるようになった。
ここではpublicにしちゃっているけど、変数をprivateにして、getterでStringに変換して返せば大丈夫かなと思ったところ、

```java:User.java
public String getMemo(){
   if(memo == null){
      // ここに来ない
      return "";
   }

   if(memo.toString().equals("")){
      // ここにも来ない
      return "";
   }

   return memo.toString();
}
```

と、「"note":{}」の時に空文字を返したいのにできない。
まさかと思って、

```java:User.java
public String getMemo(){
   if(memo.toString().equals("{}")){
      return "";
   }
   return memo.toString();
}
```

とやったら上手くいった！

……え？本当に（取得も含めて）これが正解？？
NGUI の UIRoot についてメモ


参照元：[UIRoot](http://www.tasharen.com/forum/index.php?topic=6710)

# Scaling Style について

* PixelPerfect 常に指定したピクセルで表示するモード、解像度の低い端末だと相対的に大きく見えるし、逆に解像度が高いと小さく見えるが、拡縮によるドット欠けなどは発生しない。

* FixedSize 相対的なサイズを保持するモード、スクリーン幅の 50% のサイズで表示されているボタンはどの端末で見ても 50% の幅で表示される。このオプションを選択した場合、ManualHeight の設定を忘れないこと。

* FixedSizeOnMobile 先の PixelPerfect と FixdSize を組み合わせたモード。デスクトップアプリとして動作する際は PixelPerfect として動作し、モバイルアプリとして動作する場合は FixeSize として動作する。

※FixedSize 以外を選択した場合、 Minimu Height と Maximum Height を設定する必要がある。
Ghost Script memo


## -sDEVICE

- epson
	
	any.
	1. png16m
	
		any have [pngmonod, png16m, pnggray and pngalpha]
		注意: pngalpha にした時、背景は透明になる

		-dBackgroundColor=16#ffffff など指定が必要？よくわからん
	1. jpeg	
		
			options:
			1. -dJPEGQ (0 to 100, default:75)
				Quality Level
			2. -dQFactor (0 to 1.0)
				QFactor quality scale
	1. epson
	2. ijs (InkJeT)

```examples:
$ gs -dSAFER -sDEVICE=ijs -sIjsServer=hpijs -sDeviceManufacturer=HEWLETT-PACKARD -sDeviceModel='DESKJET 990' -dIjsUseOutputFD -sOutputFile=/dev/usb/lp1 -dNOPAUSE -- examples/tiger.eps

$ gs -sDEVICE=epson example/tiger.ps
```

## -OutputFile

出力ファイル

printf のに順次してた場合、ページ番号で連番で作成する。

-sOutput=test-%03d.png など。

## -dFirstPage / -dLastPage

出力するページを限定させる

- -dFirstPage ではじめのページ
- -dLastPage で終わりのページ

## -r

出力ファイルの解像度を変更させる。

-r400にした場合、400dpiになる。
-r400x300 にした場合、縦は400dpiになり、横は300dpiになる。

## -dFIXEDMEDIA

何かページサイズに合わせるだって。

## -dBATCH

つけることで、Postscriptのコマンド実行が終わった時にプロセスを終了する。

## -dNOPAUSE

ページ出力が終わった時に、止まらない。よくわからん。


## see:

http://ghostscript.com/doc/current/Use.htm
http://ghostscript.com/doc/current/Devices.htm
http://d.hatena.ne.jp/hoge49/20120607/1339040993
http://www.linuxjournal.com/content/tech-tip-extract-pages-pdf
Amazon RDSの信頼性（可用性と耐久性）について


# 記事を書くきっかけ

新しい案件でAmazon RDS（以下、RDS）の採用を検討している。RDSが提供するデフォルトのサービス内容でカバーされる、信頼性について調査を行い、クライアントに説明を行う際の根拠としたい。

**_本記事の内容の真偽については、各々で調査・判断をお願いします。_**

# この記事の要約

1. Multi-AZのMySQLもしくはOracleを対象とした記事である。
1. RDSのデフォルトの内容を対象とした記事である。
1. RDSの信頼性は99.95%くらいである。
1. 一般的に、障害発生時の過去5分以内に、新しいエンドポイントを持つ新しいデータベースインスタンスとして復旧可能である。
1. バックアップデータの保存先の耐久性は99.999999999％、可用性は99.9%くらいである。

**_この数字から来る信頼性では足らず、更に100%に近づけてくれというならば、「別途色々考えます」というスタンスで良いと考えます。_**

# 一般公開

現在RDSはβ版では無く、一般公開されている。[いくつかの記事](http://jp.techcrunch.com/2013/06/07/20130606amazons-relational-database-service-hits-general-availability-gets-sla-with-99-95-monthly-uptime-promise/)によれば、一般公開は米国時間の2013年6月6日である。

# SLA

[サービスレベルアグリーメント（SLA）](http://aws.amazon.com/jp/rds/sla/)はこちら。要約すると下記のようになる。

1. Multi-AZ構成に対してSLAが適用される。
1. 対象のエンジンはMySQLとOracle。
1. 月間アップタイムが99.0%以上99.95%未満の場合は料金の10%、99.0%未満の場合は25%が割引される。

# データの格納先

1. データベースとログの格納にAmazon EBSボリュームを使用する。
1. EBSの耐久性については[EBS製品の詳細](http://aws.amazon.com/jp/ebs/details/)の「Amazon EBS の可用性と耐久性」が参考になる。
 1. 追加料金無しで同一AZ内の複数のサーバーにレプリケートされる。
 1. 特定の条件のボリュームの年間故障率は0.1%〜0.5%である事が期待出来て、市販のハードディスクの一般的な年間故障率4%前後と比較すると、10倍の信頼性がある。
1. EBSの可用性については[EC2及びEBSのSLA](http://aws.amazon.com/jp/ec2/sla/)に詳しい。月間アップタイムが99.0%以上99.95%未満の場合は料金の10%、99.0%未満の場合は30%が割引される。

# 自動化バックアップ

[RDSのFAQ](http://aws.amazon.com/jp/rds/faqs/#automated-backups-database-snapshots)が参考になる。デフォルトの内容を要約すると下記のようになる。前提は「データベースインスタンスに対して自動化バックアップがオンになっている」事である。

## バックアップ

1. 任意のバックアップウィンドウ（任意に設定可能なスケジュール）で、1日1回自動で、完全なバックアップが取得される。
1. 随時トランザクションログが取得されている。

## 復元

1. バックアップによって特定時点への復旧を開始して、トランザクションログによって復元可能な最新時刻まで、任意の秒数を指定する事が可能。
1. 復元可能な最新時刻は通常、過去5分以内。
1. 復元を行う事で、新しいエンドポイントを持つ新しいデータベースインスタンスが作成される。

## バックアップデータの保存先

1. 自動バックアップはAmazon S3（以下、S3）に保存される。
1. S3の可用性については[S3のSLA](http://aws.amazon.com/jp/s3/sla/)に詳しい。月間アップタイムが99%以上99.9%未満の場合は料金の10%、99%未満の場合は25%が割引される。
1. S3の耐久性については[S3のFAQの「データ保護」](http://aws.amazon.com/jp/s3/faqs/#data-protection_anchor)に詳しい。特定の一年間、99.999999999％のオブジェクト耐久性を提供するよう設計されているとの事。

## バックアップデータの保存に関する費用

1. 追加料金無しで、1日の保持期間でデータベースインスタンスの自動バックアップを行える。
1. 無料のバックアップストレージは、準備したデータベースのサイズに限定される。
1. アクティブなデータベースインスタンスのみに適用される。
[Grails]プログラマチックトランザクション

# 参考
[6.6 プログラマチックトランザクション](http://grails.jp/doc/latest/guide/GORM.html#programmaticTransactions)
[Interface TransactionStatus](http://docs.spring.io/spring/docs/3.0.x/javadoc-api/org/springframework/transaction/TransactionStatus.html)
[Serviceを使ってみる](http://qiita.com/saba1024/items/06771c750320e2ca46f0)

# 概要
Grailsでトランザクションを利用したい場合、[Serviceを使ってみる](http://qiita.com/saba1024/items/06771c750320e2ca46f0)にのように、ServiceというGrailsの機能を利用することで実現できます。

実はServiceだけじゃなくて、プログラマチックトランザクションというSpringの仕組みを利用しても実現できます。
GORMが拡張されているので非常に簡単。

#サンプル
例えば以下のようなドメインが有る場合。

```groovy:Hoge.groovy
class Hoge {

    String name
    static constraints = {
    }
}
```
## 基礎
このドメインに対してトランザクションを走らせたい場合は、以下のようなコードになります。

```groovy:HelloController
def index3() {
    Hoge.withTransaction { TransactionStatus status ->
        // 例えばＩＮＳＥＲＴ
        def newHoge = new Hoge(name:"koji").save()
    }
    render "OK"
}
```

上記のコードは正常にINSERTされます。
単純に、ドメインのwithTransactionというメソッドに、やりたいことをクロージャとして渡してあげるだけです。
では実際にロールバックするようにしてみます。

##ロールバックさせる
```groovy:HelloController
def index3() {
    Hoge.withTransaction { TransactionStatus status ->
        // 例えばＩＮＳＥＲＴ
        def newHoge = new Hoge(name:"koji").save()
        status.setRollbackOnly()
    }
    render "OK"
}
```
`status.setRollbackOnly()`が実行されると、そのトランザクション（withTransactionブロック内）のデータベースに対する変更はすべてロールバックされます。

## トランザクションの範囲
**1トランザクション == withTransactionブロック**なので、withTransactionブロックがループなどで複数回実行されている場合は、そのたびにトランザクションが異なります。

例えば以下の場合。
10回withTransactionブロックが実行されます。

```groovy:HelloController
def index3() {
    (1..10) .each {Integer index ->
        Hoge.withTransaction { TransactionStatus status ->
            def newHoge = new Hoge(name:"koji-${index}").save()

            // INSERTした結果、IDが奇数の場合はロールバックする。
            if (newHoge.id % 2 != 0) {
                status.setRollbackOnly()
            }
        }
    }
    render "OK"
}
```

これを実行すると、データベースにINSERTした際に、IDが奇数の場合にロールバックされます。
実行結果は以下のようになります。

![console1.png](https://qiita-image-store.s3.amazonaws.com/0/11059/d3f2c72d-18cd-6a88-64da-1b7658876a74.png)

非常に簡単ですね。

##別のドメインの更新でも有効
なお、今回HogeドメインのwithTransactionを使っていますが、このHoge.withTransactionブロックの中で別のドメインを利用することもできます。
例えば以下のドメインを用意して、同じようにHogeのIDが奇数だった場合にロールバックするようにしてみます。

```groovy:Piyo.groovy
class Piyo {

    String name
    static constraints = {
    }
}
```

以下のようなコードを実行します。

```HelloController.groovy
def index3() {
    (1..10) .each {Integer index ->
        Hoge.withTransaction { TransactionStatus status ->

            def newHoge = new Hoge(name:"Hoge-${index}").save()

            // Hogeドメインとは関係ないドメインのINSERT
            def newPiyo = new Piyo(name:"Piyo-${index}").save()

            // Hogeが奇数ならロールバック
            if (newHoge.id % 2 != 0) {
                status.setRollbackOnly()
            }
        }
    }
    render "OK"
}
```

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

![console2.png](https://qiita-image-store.s3.amazonaws.com/0/11059/8cbb0278-8d62-d4af-89f7-38ba64e15185.png)

前回の実行結果が残っているのでちょっと見づらいですが、Hogeに関しては通常通り奇数がロールバックされていて、ちゃんと関係ないPiyoドメインもロールバックされていることが分かります。

#まとめ
複雑な処理などはやはりServiceとして実装したほうがいいと思いますが、run-scriptで実行されるバッチなどの簡単な処理などであれば非常に便利な機能だと思います。
python/tornadoでカスタムしたエラーページを使う

python/tornadoでカスタムエラーページを扱う際に少々はまったのでまとめ。

```py3
# -*- coding: utf-8 -*-
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    # self.write_errorをオーバーライド
    def write_error(self, status_code, exc_info=None, **kwargs):
        self.set_header('Content-Type', 'text/html; charset="utf-8"') # 適宜content-typeを宣言(optional)
        if status_code == 503:
            # 直接書いてもいいし、
            self.finish('<h1>503 Service Temporarily Unavailable</h1>')
        elif status_code == 404:
            # テンプレートを別途用意してもいい
            self.render('/path/to/templates_dir/404.html',
                # テンプレート中に埋め込む変数をキーワード引数渡しする
                message = 'hogehoge'
            )
        # 中略...

    def get(self):
        # 中略...

application = tornado.web.Application([
    # 中略...
])

if __name__ == "__main__":
    application.listen(port=8080)
    tornado.ioloop.IOLoop.instance().start()
```
まとめ

- オーバーライドしたwrite_error内ではself.finish()で〆る
- self.render()は内部でself.finish()を呼ぶので無問題
進行状況をプログレスバーで表示

Homebrewの進行状況、たとえば

```
$ brew install node.js
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/node-0.10.2
######################################################################## 100.0%
```
こんな感じのプログレスバー表示を行うメソッドです。

#`progress_bar` メソッド（幅80文字版）
```ruby:progress_80.rb
#!/usr/bin/env ruby
# coding: utf-8
$stdout.sync = true #書いておかないと出力がバッファに溜め込まれるかも

def progress_bar(i, max = 100)
  i = max if i > max
  rest_size = 1 + 5 + 1      # space + progress_num + %
  bar_width = 79 - rest_size # (width - 1) - rest_size = 72
  percent = i * 100.0 / max
  bar_length = i * bar_width.to_f / max
  bar_str = ('#' * bar_length).ljust(bar_width)
#  bar_str = '%-*s' % [bar_width, ('#' * bar_length)]
  progress_num = '%3.1f' % percent
  print "\r#{bar_str} #{'%5s' % progress_num}%"
end

(0..1000).each do |j|
  sleep 0.001
  progress_bar(j, 1000)
end
puts
```
実行すると

```
$ ruby progress_80.rb 
######################################################################## 100.0%
```
という感じになります。実際に動かして、プログレスバーが伸びていく様子を確認してください。

なお、`max` を与えないと `max = 100` になります。
つまり、`i` がそのままパーセントを表している場合は引数を一つだけにすることが出来ます。

```ruby:
(0..100).each do |j|
  sleep 0.01
  progress_bar(j)
end
puts
```

#`progress_bar` メソッド（幅可変版）
（2015/12/23追記）
先ほどの `progress_bar` メソッドはコンソール幅が80文字決め打ちでしたが、そうじゃない環境だとあまり良くないですよね。コンソール幅は `IO.console_size` で取得できるのでこれを利用します（冒頭で `require 'io/console/size'` が必要）。

>##`console_size` -> `[Integer, Integer]` [added by io/console/size]
端末のサイズを `[rows, columns]` で返します。
`io/console` が利用できない場合は、`IO.default_console_size` の値を返します。

>- [singleton method IO.console_size (Ruby 2.2.0)](http://docs.ruby-lang.org/ja/2.2.0/method/IO/s/console_size.html)


```rb
require 'io/console/size'
$stdout.sync = true

def progress_bar(i, max = 100)
  height, width = IO.console_size # height は使ってませんが説明のために記載
  i = max if i > max
  rest_size = 1 + 5 + 1 # space + progress_num + %
  bar_width = (width - 1) - rest_size
  percent = i * 100.0 / max
  bar_length = i * bar_width.to_f / max
  bar_str = ('#' * bar_length).ljust(bar_width)
  progress_num = '%3.1f' % percent
  print "\r#{bar_str} #{'%5s' % progress_num}%"
end
```
（2015/12/23追記ここまで）
#rubygems
gemになっているものもいろいろあります。
[The Ruby Toolbox - CLI Progress Bars: Indicate the progress of long-running tasks in your command line utilities](https://www.ruby-toolbox.com/categories/CLI_Progress_Bars)

#なお
この投稿はこちらの二匹目のドジョウですw
[CLIでプログレスバーみたいのを出力する - Qiita](http://qiita.com/hokaccha/items/3abd55aa23894b57ffd1)

ただし、このプログレスバーは以前から個人的に使ってましたw
このスクリプトとかで（出力は若干違いますが
[NHK語学講座のラジオ番組ストリーミングを取得するRubyスクリプトgogakuondemand.rb（v3.5 '14/3/31更新版） - 別館 子子子子子子（ねこのここねこ）](http://d.hatena.ne.jp/riocampos+tech/20130731/p1)
qiita 500: Internal Server Error

qiita.com　のAPIをたたいてみた。

https://qiita.com/api/v1/search?q='java'
でブラウザで検索してみる。


  500: Internal Server Error

  申し訳ありません、ただ今障害が発生しております。
  復旧作業中ですのでしばらくお待ち下さい。

  と表示される。

原因は、おそらくヒット件数が多すぎて取得しきれなかったのだろう。

https://qiita.com/api/v1/search?q='java'&page=1&per_page=30

で、取得件数を絞ることで解決した。
Perlbrew で install-patchperl/install-cpanm が失敗する場合


現状、バージョンが 1.11 の wget がインストールされている環境だと、

perlbrew install-patchperl
perlbrew install-cpanm

が失敗する。

gistへのhttps接続がうまくいかないのでエラーになる。
curlを使うように指定できれば良いが、そういったオプションがないので、
以下の様なファイルを作成する。

```bash:~/.wgetrc
check_certificate = off
```

この設定で、--no-check-certificate オプションをつけた場合と同じ動作になるので、
エラーが回避できる。

perlbrewでは過去に --no-check-certificate オプションを固定で付けていたようだけど、
セキュリティを考慮して外したようだ。
なので、--no-certificateを固定にするようなパッチは受け入れられないと思う。
シートでテキスト入力させるときはNSWindowの Title Barを表示すること

備忘録。

何らかの設定画面をシートダイアログでつくるとき、ベースとなる NSWindowの Title Barオプションを外すとテキスト編集ができなくなる。ボタンとかは使える。

参考: http://stackoverflow.com/questions/7561347/cant-edit-nstextfield-in-sheet-at-runtime

後半を読むと、キーウィンドウになるよう設定するだけでも良いみたい
htmlspecialchars_decodeをPHP4上で動作させなければならない場合の対処方法

htmlspecialchars_decode について。

突然のエラー、、
原因は「htmlspecialchars_decode」関数がPHP4環境では動作しないとのこと。。

そのため、似たような処理をPHP4上で実現させるための対処方法を調べました。

```php
if ( !function_exists('htmlspecialchars_decode') ){
	function htmlspecialchars_decode($string,$style=ENT_COMPAT)
	{
		$translation = array_flip(get_html_translation_table(HTML_SPECIALCHARS,$style));
		if($style === ENT_QUOTES){ $translation['&#039;'] = '\''; }
		return strtr($string,$translation);
	}
}
```

このコードを追記するだけで無事、エラーは消え、デコードもされていました。

フォームに入力した値も正常に変換されていたので問題なく動いている・・。


http://www.umbrellastudio.com/web-development/php4-friendly-htmlspecialchars_decode/ より
Node.jsで静的にサイトを生成する時の現時点でのおすすめ

## 注意

このポストも半年以上が経過し、情報が古くなっています。選定の際は以下のサイトなどで再度検討することをおすすめします。
[Top Open-Source Static Site Generators - StaticGen](https://www.staticgen.com/ "Top Open-Source Static Site Generators - StaticGen")

## 方向性は2つ選択肢は3つ

### タスクランナ
単ページやシンプルな構造のサイトの場合いわゆるスタティックサイトジェネレータでなくても、[GRUNT](http://gruntjs.com/ "GRUNT")や[gulp.js](http://gulpjs.com/ "gulp.js")などのタスクランナーで十分
わざわざ独自の規格とかに乗っかるより、そっちのエコシステムに乗っかったほうが断然いい
ただし、それなりにタスクランナーについて予備知識は必要

### タスクランナ+ジェネレータ
設定ファイルとかディレクトリの初期設定が面倒なら、Gruntなら[Yeoman](http://yeoman.io/ "Yeoman")、gulp.jsなら[Slush](http://klei.github.io/slush/#/ "Slush")などを使えばいい。
こっちはタスクランナーの予備知識に加えてジェネレータの知識も必要。
大きなエコシステムに乗っからなくてもいいなら割と取っ付き易い[Brunch](http://brunch.io/ "Brunch")って選択肢もある。

### スタティックサイトジェネレータ
そして今回の書きたかった上の2つの方向とは違う専用ツールとしてのスタティックサイトジェネレータ

## StaticSiteGeneratorを選ぶ理由

スタティックサイトジェネレータをわざわざ使う場合の基準はどこなのか考えた結果

* サイト生成に特化してるから始めやすい
* CMS的なヘルパーが豊富
  * 月別アーカイブ
  * タグ別アーカイブ
* 他のブログシステムとかからの移行ツールがある
* テーマテンプレートがある

とかの付加価値があるかどうかだと思った。
この辺りはRubyの[jekyll](http://jekyllrb.com/ "jekyll")や[middleman](http://middlemanapp.com/jp/ "middleman")が段違いに充実していて人気がある理由かもしれない。
実際Githubのスターの数も桁が違う。[[リスト]Static Site Generator 静的にHTMLを書き出すもののリストを作ってみよう。](http://jsbin.com/biyeg "[リスト]Static Site Generator 静的にHTMLを書き出すもののリストを作ってみよう。")

## 結論

Middlemanやjekyllは魅力的だけど、javascriptで全部済ませたいからNodejs製のプロダクトの中から探しているわけで至った結論がCMS的な機能を今すぐに求めるなら、[hexo](http://hexo.io/ "hexo")がいいかな。
CMS的な機能も欲しいけど、Grunt/Gulpのエコシステムに乗っかりたいなら、[Assemble](http://assemble.io/ "Home | Assemble")(絶賛開発中感有り)

![Archives__2014_5___Hexo.png](https://qiita-image-store.s3.amazonaws.com/0/4319/037beabc-27f6-e89b-eae9-c5ad8823ecf7.png)

以上現時点ではそんな感じ。
monitでping監視

サーバの死活監視を手軽に設定したかったので、monitを使ってみることにしました。

# 参考にさせていただいたサイト

[株式会社シャノン技術ブログ: 15分で始めるmonitによるサーバ監視](http://shanon-tech.blogspot.jp/2011/11/15monit.html)

[Monit でお手軽に外部のサーバを監視する - akishin999の日記](http://d.hatena.ne.jp/akishin999/20121030/1351555542)

# 環境
* OS : CentOS release 5.9 (Final)
* monit : 5.5

# インストール

DAGリポジトリ(rpmforge)を設定済みだったので、yumでインストール可能でした。

```bash
yum install -y monit
```

# 設定

設定ファイルは共通となるものが「/etc/monit.conf」、さらに「/etc/monit.d」の中に監視対象を細かく分けて書いていきます。

## /etc/monit.conf

自分の場合は変更したのは初期設定から二点だけでした。

### メールサーバの設定

```bash
set mailserver mail.example.com
```

### httpdの設定

monitは状態を確認できるhttpデーモンを起動しています。
初期設定だとローカルからしかアクセスできないようになっているので、
これを外部からも見られるようにします。

```bash
set httpd port 2812 and
    allow 192.168.0.0/24   # アクセスできる範囲を指定
    allow admin:monit      # ベーシック認証のIDとPASSWORD
    allow @monit           # allow users of group 'monit' to connect (rw)
    allow @users readonly  # allow users of group 'users' to connect
```

これで
http://monithost:2812
にアクセスすると、ステータスを監視できます。
（monithostの部分はmonitを動かしているホストかIPに変えてください）

## /etc/monit.d/ping.conf

個別の設定は/etc/monit.dの中に書いていきます。
ファイル名はなんでもいいので、ここでは「ping.conf」とします。

```bash
set alert mail01@example.com
set alert mail02@example.com not on {INSTANCE}

check host myhost01 with address myhost01
    if failed icmp type echo with timeout 4 seconds
    then alert

check host myhost02 with address 192.168.0.10
    if failed icmp type echo with timeout 4 seconds
    then alert
```

これで全てです。
set alertの後に、異常発生時に送信したいメールアドレスを指定します。
ただ、それだけだとmonit自体の停止・起動時などもいちいちメールがくるので、
それが嫌な場合は「not on {INSTANCE}」をつけておきます。

check host〜の後に、監視したいサーバの状態を書いていきます。
with addressの後が実際に監視するサーバの情報で、ホスト名かIPアドレスを指定します。

# テスト実行

以下のコマンドで試しに実行可能です。

```bash
monit -vI
```

終了はCtrl+Cです。

# 設定反映

```bash
service monit restart
```

# 最後に

monitは初めて使ってみましたが、とてもお手軽に設定できて便利です。
今回はpingの監視だけでしたが、他にもmysqlのチェックなど様々な事が可能です。
一度使ってみてはいかがでしょうか。
Devise + omniauthでTwitterのログインはメール認証をスキップしたい。


# 問題
- omniauthも使ってTwitterのログインも実装している。

- [devise](https://github.com/plataformatec/devise/)でメール認証する(confirmable)ようにした。

- Twitterのログインだと、Emailを取得できないので、Twitterのログインのときには、メール認証せずにログインするようにしたい。


# 解決策


`skip_confirmation!` を使ってスキップすることができる。

モデル名が`User`の場合は、`user.skip_confirmation!`
# 参考

[ruby on rails - skipping email confirmation for omniauth users using devise - Stack Overflow](http://stackoverflow.com/questions/7489914/skipping-email-confirmation-for-omniauth-users-using-devise)
iPythonで実装のソースコードを見る

超具体的に言うと、WebDriverのPython APIでByを使うんですがこれが何宣言してんのか知りたい。```By.NAME```は覚えたけど```By.CLASS_NAME```なのか```By.CLASS```なのかどっちだっけ。

……というときに```locate '/usr*python*webdriver*by*'```とかやるの、なんだかアホいなぁと。

    > locate '/usr*python*/webdriver*by*'
    /usr/local/lib/python2.7/dist-packages/selenium/webdriver/common/by.py
    /usr/local/lib/python2.7/dist-packages/selenium/webdriver/common/by.pyc
    (viewとかemacsで見る)

豆知識としてipythonの方法を紹介します。?を2個つけるだけです。

    In [1]> from selenium.webdriver.common.by import By
    In [2]> By??
    Type:        type
    String form: <class 'selenium.webdriver.common.by.By'>
    File:        /usr/local/lib/python2.7/dist-packages/selenium/webdriver/common/by.py
    Source:
    class By(object):
        """
        Set of supported locator strategies.
        """
    
        ID = "id"
        XPATH = "xpath"
        LINK_TEXT = "link text"
        PARTIAL_LINK_TEXT = "partial link text"
        NAME = "name"
        TAG_NAME = "tag name"
        CLASS_NAME = "class name"
        CSS_SELECTOR = "css selector"
    
        @classmethod
        def is_valid(cls, by):
            for attr in dir(cls):
                if by == getattr(cls, attr):
                    return True
            return False

『Pythonによるデータ分析入門』という本で何故かipythonの入門記事がありまして、自分の使ってるツール知らないのは恥だぁと改めて思いました。

なおiPythonのチートシートは以下の通り。

http://damontallen.github.io/IPython-quick-ref-sheets/

# おまけ

これも同書籍からですが、地味に衝撃を覚えたので参考まで (python-matplotlib パッケージ等が先に必要です)

    > ipython --pylab
    In [1]> plot(np.random.randn(100).cumsum())

どう動作するかは https://www.youtube.com/watch?v=BrDJssegqwo からどうぞ
NIST SP800-115 Technical Guide to Information Security Testing and Assessment


http://csrc.nist.gov/publications/nistpubs/800-115/SP800-115.pdf

NISTが公開している、情報セキュリティテスト、アセスメントの技術的ガイドを一部だけ翻訳したよー。
翻訳進めば、内容を更新しますよー。
超ざっくり翻訳だし、内容の正当性については保証しません。

- レビュー技法
 - ドキュメントレビュー
 - ログレビュー
 - ルールセットレビュー
- ターゲットの身元確認と解析技法
- 脆弱性の検証技法

ログレビュー

権限ログも大事

システム設定のレビュー

NIST SP800-53Aというのがセキュリティ制御テストについて書かれたドキュメント

ファイル整合性チェック

# 3.7 Summary

レビュー技法

| 技法 | 能力(capability) |
|:--|:--|
|ドキュメントレビュー|技術的な精度と完全性のためのポリシーと手続きを評価|
|ログレビュー|システムの利用、設定、変更についての変遷を見ることができる。起こりうる問題と、ポリシー逸脱を明らかにできる|
|ルールセットレビュー|ルールセットに基づいたセキュリティ制御上の穴を見つけられる|
|システム設定レビュー|システム設定の強度を評価する。システム強化ポリシーに従って設定されているかを検証できる|
|ネットワークスニッフィング|ローカルネットワークのトラフィックを監視し、アクティブなシステムやOS、通信プロトコル、サービスやアプリケーションについての情報を記録できる。通信の暗号化について確認できる|
|ファイル整合性チェック|重要なファイルへの変更を識別する。またよく知られた攻撃ツールなどの不要な特定の形態を識別することができる|
【無理】WindowsのコンソールでUnicodeを使いたい

前にも書いた気がするのですが、できることの情報共有だけじゃなくて出来ないことの情報も積極的に公開していったほうが良いと思うんです。そうすれば無駄に検索に時間を費やすこともなくなるし。

できないと思って情報公開したら「それできるよ。」と誰かが教えてくれるかもしれないし！

さて、Ruby界隈で迫害され続けるWindowsですが、自分はやっぱりWindowsがなんだかんだで一番使いやすいのでWindowsでRubyを使いたいんです。快適なRuby開発環境をWindowsに求めて今回は文字コードに関してのお話です。

## 基礎知識

Windowsの日本語版のコンソールはShift-JIS(CP932)
最近のRubyの標準は`UTF-8`
Windowsで`Unicode`といった時には文字コード体系のUnicodeではなくて`UTF-16`を指すことが多い。

## Rubyのコンソールで日本語を表示する方法

取れる方法は”RubyをShift-JISで使う”か"WindowsをUTF8"で使うのどちらかになりますが、前者は時代に逆行してるし、ウムラウトとかハングルが使えないので却下。

## 日本語表示できるようにする

`chcp 65001`でコマンドプロンプトの設定がUnicode(UTF8?)になるので、これで`irb`とか`pry`で日本語を表示できる。

でも、日本語入力は出来ない。IMEがアクティブにならないし、コピペならできるそうだけど、自分の環境ではコピペさえも不可能。

## 無理です。

以上が現状です。10年前ぐらいから問題になってる気がしますが未だに解決されていません。長期サポートの弊害がおもいっきり出てるんでしょう。

なんでもRubyKaigiのスポンサーとかもMicrosoftはしてるそうですが、そのお金でココらへんの実装したほうがむしろRuby界隈のWindowsに対する評価は上がるんじゃないかと思います。
Deviseを使ったサインアップがこける。


#やりたいこと
[devise](https://github.com/plataformatec/devise)を使ってログイン機能を実装しており、Sign_upするときに、emailとpasswordだけじゃなく、usernameも登録のときに入力させたいなと思った。

```rails:app/view/devise/registrations/new.html.erb

<h2>Sign up</h2>

<%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">
  	<%= f.input :username, required: true %> #ここを追記
    <%= f.input :email, required: true %>
    <%= f.input :password, required: true %>
    <%= f.input :password_confirmation, required: true %>
  </div>

  <div class="form-actions">
    <%= f.button :submit, "Sign up" %>
  </div>
<% end %>

<%= render "devise/shared/links" %>

```

追記してみたが、サインアップでこけてしまう。


#解決策

パラメータがきちんと渡っていなかった。

```ruby:app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :username
  end
end

```



#参考

[ruby - Adding Username to devise rails 4 - Stack Overflow](http://stackoverflow.com/questions/17537665/adding-username-to-devise-rails-4)

[plataformatec/devise#strong-parameters](https://github.com/plataformatec/devise#strong-parameters)
[Windows 7] キーボードのカーソル移動速度を上げる方法

MacではKeyRemap4MacBookを使って爆速にしているキーボードでのカーソル移動速度ですが、windowsでは特に何にもしていなかったので、激遅に感じます。

快適に動かす為の方法を調べました。

# コントロールパネルから変更

1. 画面左下のwindowsボタンをクリックしたら出てくる「プログラムとファイルの検索」欄に『キーボード』と入力して検索。
2. コントロール欄の中に「キーボード」という項目が出てくると思うので、それをクリック
3. 「表示までの待ち時間」や「表示の間隔」を調整（試す欄がすぐ下にあるので、試し試しやってみてください）

![keybordSetting.jpg](https://qiita-image-store.s3.amazonaws.com/0/18705/5d2e1815-c7a3-3478-17cf-89b92792e5e3.jpeg)

4. 適応ボタンを押下
5. OKボタンを押下して終了（再起動しなくてもすぐに反映されているはず）


# レジストリ操作をして更に速くする（非推奨!!）

**!!レジストリ操作は自己責任でお願いします!!**

1.1 画面左下のwindowsボタンをクリックしたら出てくる「プログラムとファイルの検索」欄に『regedit』と入力して検索。
=> regedit.exeを押下

1.2 ファイル名を指定して実行（Windowsキー + R）から、regeditを入力して実行。

2. レジストリ エディタが開くので、以下のとおり操作。
=> HKEY_CURRENT_USER -> Control Panel -> Keyboard までディレクトリを展開

![regeditPhoto.jpg](https://qiita-image-store.s3.amazonaws.com/0/18705/e5de0825-fd0b-8d50-3eb5-6d6ea4ddbb31.jpeg)


3. KeyboardSpeedという項目が見つかると思うので、変更。

|項目|内容|
|----|----|
|KeyboardDelay|表示までの待ち時間(つまり0だと待ち時間なし)|
|KeyboardSpeed|表示の間隔(値が大きいほど、速い)|

コントロールパネルでの変更は31が限界な感じ？
レジストリ操作をすれば、31以上に上げられます。
私は、60くらいを超えるとそんなに違いが分からなくなりました。

結構早くなったはずです！
快適になったかな^^;

あとで、Macの場合も書きます。
tmux-cheat-sheet

# tmux-cheat-sheet

tmuxってなに？なにが楽しいの？という方は[こちら](http://d.hatena.ne.jp/eco31/20101126/1290725841)が詳しいです。

このチートシートでは主にデフォルトのキーバインドを書いていきます。

## 基本
tmuxでググると[C-b c]みたいな記述をよく見かけます。
自分も最初わからなかったんですけど、これは以下の様な操作を意味します。

>[C-b c]の入力方法
1. Ctrlキー(コントロールキー)を押しながら[b]キーを押す
2. 一旦離す
3. [c]キーを押す

tmuxでは
ほとんどのキーバインドで[C-b]を使います。なのでここでは簡単に[@]と表記します。
例えば前述のキーバインドは[@-c]と表記することにします。

|基本|キーバインド|
|:-:|:--|
|デタッチ|@-d|

## ウィンドウ操作
||キーバインド|
|:-:|:--|
|新規ウインドウ作成|@-c|
|次のウインドウへ移動(next)|@-n|
|前のウインドウへ移動|@-p|
|直前のウインドウへ移動(last)|@-l|
|ウィンドウ番号を指定して移動|@-[番号]|
|ウィンドウ名を変更|@-,|
|ウィンドウ名を閉じる|@-&|
|ウィンドウ|@-&|

## ペイン操作
||キーバインド|
|:-:|:--|
|水平に分割|@-"|
|垂直に分割|@-%|
|垂直に分割|@-%|
|全ての分割を解除|@-!|
|現在のペインを解除|@-x|
|ペイン移動|@-o|
|ペイン入れ替え|@-{|
|ペイン入れ替え|@-{|
JavaScriptで配列の生成


空の配列を１０個生成

```js
Array.apply(null, {length:10});
> [undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined]
```

順列の値を含む配列を生成

```js
Array.apply(null, {length:10}).map(Number.call, Number);
> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

値を文字列にして生成

```js
Array.apply(null, {length:10}).map(Number.call, String)
> ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
```
Markdownのリスト記法を取得するBookmarklet

#Bookmarklet
```javascript
javascript:window.prompt('','['+%20document.title%20+']('+%20location.href%20+')');void(0);
```
引用したいページを開いてこのBookmarkletを使うと、入力ダイアログが出ます。のでコピペしてください。
OKでもキャンセルでもボタン押してもらえれば消えます。
単純なのでiOSでも使えます。
#ぐだぐだ
Qiitaでは、リンク先のURLだけしか書いてないひとが多い。リンク先のタイトルが分からないのはイマイチ。
はてな村出身なので、URL書いて:titleと書けばタイトルを引っ張ってきてくれる、とっても便利なはてな記法になれている。MD記法になぜこのタイトル自動補完がないのか、残念で仕方が無い（重くなるんでしょうけどね）。

なので、Qiita利用者の皆さん、投稿を書く際にこれを使ってください。手抜きだけど。
#希望
どなたか、リスト記法がクリップボードに直接入るBookmarkletを作ってくださいm(_ _)m Mac版を希望。
#あ。
bookmarkletを先に作ってるひとが居た（そりゃ居るわな）。
>```
javascript:(function(){void(prompt(document.title,"["+document.title.replace(/[\[\]]/g,"\\$&").replace(/\\$/, "")+"]("+location.href+")"))})()
```
[Qiita - Markdownのリンクを作成するブックマークレット - Qiita](http://qiita.com/manuluu/items/bc316367742963b13b16)

Chromeの機能拡張[Create Link](https://chrome.google.com/webstore/detail/create-link/gcmghdmnkfdbncmnmlkkglmnnhagajbm)ならクリップボードへコピーできるらしい。
[Markdown - ページのタイトルとURLを簡単に貼る - Qiita](http://qiita.com/ymko/items/72b15f12dd9f367c092c)
Goutteでプログレス表示をしてみる

今日はお遊び投稿！

CLIで何かをダウンロードするようなコマンドを作る時に進捗が表示されるとイライラが多少は軽滅されますよね！
特に時間のかかるものをダウンロードする時に何も表示されなかったら「まだかよ！」ってなりますね。

そこで今日はPHPで[Goutte](https://github.com/fabpot/goutte)を使ってダウンロードプログレスを表示してみようと思います。

コードはこんな感じになります。


```php:download.php
<?php

require __DIR__ . '/vendor/autoload.php';

use Goutte\Client;
use Guzzle\Http\Client as GuzzleClient;

$guzzleClient = new GuzzleClient('', array(
    GuzzleClient::DISABLE_REDIRECTS => true,
    GuzzleClient::CURL_OPTIONS => array(
        CURLOPT_NOPROGRESS => false,
        CURLOPT_PROGRESSFUNCTION => function ($download_size, $downloaded, $upload_size, $uploaded) {
            if (0 < $download_size) {
                printf("dowloading... %d%%\r", $downloaded / $download_size  * 100);
                flush();
            }
        }
    )
));
$client = new Client();
$client->setClient($guzzleClient);
$client->request('GET', 'http://example.com/');
```

これを実行すると

```shell-session
$ php download.php
dowloading... 14%
```
みたいな感じで進捗率が表示されるようになります。

Goutteは内部でGuzzleクライアント使ってるのでオプションを指定したGuzzleクライアントをセットする事で内部の挙動を変更できるようになっています。

これで待ち時間のイライラが軽滅されますね。

wgetとかcurlでいいだろ！と突っ込まれそうですがそこはお遊びということで^^
ではでは！
brew install boost に失敗した場合の対処法

`brew install boost` した時、以下のエラーを吐いてビルドが失敗した。

```
==> ./b2 --prefix=/usr/local/Cellar/boost/1.55.0_1 --libdir=/usr/local/Cellar/boost/
    cp "bin.v2/libs/wave/build/darwin-4.2.1/release/link-static/libboost_wave.a"  "/usr/local/Cellar/boost/1.55.0_1/lib/libboost_wave.a"

    ...failed updating 112 targets...
    ...skipped 20 targets...
    ...updated 12489 targets...

    READ THIS: https://github.com/Homebrew/homebrew/wiki/troubleshooting

    These open issues may also help:
    Boost 1.55.0 fails to build --universal (https://github.com/Homebrew/homebrew/issues/26951)
    "bottle blocked by python requirement" is vague in boost 1.55.0_1 upgrade (https://github.com/Homebrew/homebrew/issues/28281)
```

どうやら Python まわりで問題が発生しているっぽい。

ここで対処法は2つある。Python support を捨てるか System Python を使うかである。

## 1. Python support を無効にする
デフォルトでは Python support を有効にした boost がインストールされることになっている。
しかし、そもそも他のパッケージの依存物として boost を入れるのなら、Python support は必要ないことがほとんどである。
Python support を無効化してインストールすれば良い。

```bash
$ brew install boost --without-python
```

## 2. System Python を使ってビルドする
エラーメッセージでググったところ、homebrew の Github リポジトリに [issue が上がっていた](https://github.com/Homebrew/homebrew/issues/28281)。
System Python（Mac に最初から入っているやつ）を使っていないのが原因とのこと。

自分は pyenv を使って Python 3.4.0 を常用する設定にしていたので失敗したのである。
System Python を使うよう設定を戻したのち、再インストールしたら成功した。

```bash
$ pyenv global system
$ pyenv rehash
$ brew install boost
```