OmniAICreator/Qiita-1.07M huggingface dataset:
静的コンテンツのトークンベースのアクセス制御

Webアプリケーションにおいて、例えば個人のアップロードした画像等のファイルは、自分自身もしくは権限を与えた人のみに制限したいということはよくあります。

権限のチェックなどをふつうに行えばよいのですが、そうなると大抵はDBやLDAPへのアクセスが必要になって、画像が沢山あるページなどを表示するときに、サーバリソースの心配をしなくてはなりません。

そこでサーバリソースに負荷をかけずに、適切なアクセス制御をする仕組みの例を作りました。

https://github.com/kawasima/tbac-example

## 仕組み

静的コンテンツのアクセス制御をトークンベースで行います。

トークンは、

```
有効期限$Base64(HmacSHA256(sessionId$リソースパス$有効期限))
```

として作ります。このサンプルでは

```jsp
<body>
  <img src="/images/secret.png?token=<%= URLEncoder.encode(TokenUtil.createToken(request, "/images/secret.png"), "UTF-8")%>"/>
</body>
```

のようにTokenUtilを介して上記のようなルールでトークンを生成しています。実務で使うにはスクリプトレットはアレなので、イメージタグ用のtaglibを作った方がよいでしょう。

そして、ブラウザからトークン付きで画像のリクエストがとんでくる訳ですが、これをフィルタでトークンチェックします。

```java:TBACFilter.java
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
        if (!TokenUtil.validToken((HttpServletRequest) servletRequest)) {
            httpResponse.sendError(403);
            return;
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }

```

TokenUtil.validTokenでは、

1. トークンがある。
2. セッションがある(認証)。
3. 送られてきたトークンの有効期限より現在日時が小さい。
4. ↑で作られたトークンを同じ手順でトークンを作り、送られてきたものと一致する。

の順にトークンが検証されて、全部パスすれば画像が表示されるようになっています。

トークンに含まれる平文部分の有効期限を改ざんしても、HmacSHA256のところでハッシュ値が一致しないのでエラーにすることができます。 同様にこのトークンをもって、別の画像を表示しようとしても、やはりHmacSHA256のハッシュ値が一致しないのでエラーになります。

## 性能検証

さてこのフィルタあり/なしで性能差があるか、軽く検証してみました。

| フィルタ | 平均(ms) | 最大(ms) |90%ライン (ms)|スループット|
|:--------|------------:|------------:|------------:|------------:|
|あり    | 91|829|116|471.7|
|なし    | 90|613|120|463.7|

特に差は出ないようです。
concernsの名前空間（ディレクトリ）を分けた場合のファイルの置き場所

例えば

* app/controllers/foo/users_controller.rb

みたいな感じでファイルを作って、ここに`concerns`を作りたい場合

* app/controllers/concerns/foo/users_concern.rb

というようにファイルを作り、モジュールには

```rb
module Foo::UsersConcern
  extend ActiveSupport::Concern
...

end
```

というように書けば、

```rb
module Foo
  class UsersController
    include UsersConcern

    ...

  end
end
```

というように呼べる。

最初、

* app/controllers/foo/concerns/users_concern.rb

みたいな感じで作っちゃってちょっと嵌った。
herokuへデプロイしたあとにgit commit --amendしたらデプロイでエラー

#状況
しばしばこれをやってしまう、そそっかしい私です。

```bash
$ git commit -a -m 'version up'
$ git push heroku master
```
したあとにversion upが足りてないことに気付くw
足りてなかった分を追加し、commitする。

```bash
$ git commit -a --amend
```
そしてデプロイすると、

```bash
$ git push heroku master
Fetching repository, done.
To git@heroku.com:myapp.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@heroku.com:myapp.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```
non-fast-forwardだと怒られてしまいます。
#解決法
herokuにはローカルが反映されていればいい、という立場でやってますので、

```bash
$ git push -f heroku master
```
と`-f`を付けて強制的にpushしちゃいます。heroku側のブランチは消し去ります。
そういう立場じゃ無い人は、他の手段を取ってくださいm(_ _)m
#参考
[git - Cannot push to github - keeps saying need merge - Stack Overflow](http://stackoverflow.com/questions/10298291/cannot-push-to-github-keeps-saying-need-merge/18135171#18135171)
Rails4でDeviseを用いたユーザーログイン機能の実装

# Gem
##Gemfileを用いたインストール
DeviseをGemfileに追加しBundlerを用いてインストールします。

```
~ vim Gemfile
```

```rb:Gemfile
# 以下の内容を追記してください
gem 'devise'
```

そしてBundlerでインストールするために、以下のコマンドを実行します。

```
~ bundle install
```

#Devise
##インストール
以下のコマンドを用いてDeviseのインストールを行います。

```
~ rails g devise:install
```

##認証用ユーザーモデルの作成
以下のコマンドを実行し、認証で用いるユーザーモデルの作成を行います。

```
# 'user'の部分は自分がauthで使用したいテーブルの名前に合わせてください
~ rails g devise user
```

これでマイグレーションファイルも作成されるので、ここでDBに反映させます。

```
~ rake db:migrate
```

この状態で下記URLにアクセスして、正常に新規登録画面が表示されることを確認してください。
http://localhost:3000/users/sign_up

##フラッシュメッセージの設定
フラッシュメッセージが出るようにしていきます。

```
~ vim app/view/layouts/application.html.erb
```

```rb:application.html.erb
<% if notice %>
　　<p class="alert alert-notice"><%= notice %></p>
<% end %>
<% if alert %>
   <p class="alert alert-error"><%= alert %></p>
<% end %>
```

##リダイレクト先の指定
deviseは認証に関するactionを行った後、リダイレクトが実行されます。そのパスはデフォルトでuser_root_path、なければroot_pathとなります。リダイレクトに備えてroot_pathの設定をしていきます。

```
~ vim config/routes.rb
```

```rb:routes.rb
# 以下の内容を追記
root 'home#index'
```

これにともないhome_controllerの設定も行います。

```
~ rails g controller home
~ vim app/controllers/home_controller.rb
```

```rb:home_controller.rb
class HomeController < ApplicationController
    def index

    end
end
```

```
~ vim app/view/home/index.html.erb
```

```rb:index.html.erb
<p><%= link_to 'ユーザー情報編集', edit_user_registration_path %></p>
<p><%= link_to 'ログアウト', destroy_user_session_path, :method => :delete %></p>
```

これで一通り、ユーザー登録、編集、ログイン、ログアウトが実行できるようになったかと思います。

#補足
deviseでよく使用する関数を以下にまとめました。コードを書く際に参考にしてみてください。
※以下はすべて認証のモデルがuserとして書いています。実際は適宜自分の環境に合わせて変えてください。

```rb
# ログイン中のアクションの制限
authenticate_user!
#　使用例：hogeアクションはログインしていないユーザーでもアクセス可能
before_filter :authenticate_user!, only: :hoge

# ユーザーがログインしているかどうかのチェック
user_signed_in?

# ログインユーザーの情報取得
current_user

# ログインユーザーのセッション情報を取得
user_session
```


#参考
以下のURLを参考にさせて頂きました。不明点などがありましたら以下を見て頂ければわかるかと思います。

* http://qiita.com/azusanakano/items/a51aef1347865a452fcc
* http://easyramble.com/devise-on-rails.html
[Linux] USB Ether gadget(g_ether) の使い方等


## そもそもUSB Ether Gadget とはなんぞや
これは、Linuxが乗っかってるボードやらデバイスについているUSB Deviceポートにお手軽になんらかの機能を追加するフレームワークの一つです。
参考→　http://www.linux-usb.org/gadget/

Gadgetはファイルストレージやらカメラやら色々ありますが、Ether Gadgetは、あるデバイスについてるUSB Deviceをイーサネットに見立てて、ホストとTCP/IP通信などをしましょうというやつです。

TCP/IP通信が出来るようになるということは、ホスト側がデバイスと通信するためにわざわざドライバを作るという手間が省けます。

さらに、デバイス側にftpd等がある場合は、ファイルのやりとりをするコードを書かなくてもよくなりますし、TCP/IP通信ができると何かと便利です。

以下の手順で簡単にUSB Etherが使用可能になります。
（注：当たり前ですが、カーネルにドライバが無いとだめです）


```console:log
$ modprobe g_ether
g_ether gadget: using random self ethernet address
g_ether gadget: using random host ethernet address
usb0: MAC 22:02:25:6c:25:47
usb0: HOST MAC 46:01:8e:9f:b4:f2
g_ether gadget: Ethernet Gadget, version: Memorial Day 2008
g_ether gadget: g_ether ready
fsl-usb2-udc: bind to driver g_ether
```

と出てきて、さらにこの状態から

```console:log

$ ifconfig usb0 up

```

とすると、一応USB-LANが使用可能になります。


## WindowsがホストPCな場合のドライバの入れ方

USB Gadgetが接続されているPCがWindowsな場合、modprobeした時点でドライバの検索を開始してしまいます。

よくあるのが、これ→
https://code.google.com/p/beagleboard/downloads/detail?name=linux.inf&can=2&q=

みたいな、お手製の[linux.inf]を取ってきてやる方法もあります。

ですが、もう一個方法があって、デバイスマネージャを開いて、ドライバのインストールで「自分で探す」を選択して、
 "ネットワーク アダプダ" → "Microsoft Corporation" → "Remote NDIS Compatible Device"
を選択して入れてあげると良い感じに動きます。

参考：https://github.com/mindboards/ev3dev/wiki/Setting-Up-Windows-USB-Ethernet-Networking

(Windows8ではmlinux.infを使うやり方は入れることができません。Windwos8は認証が無いドライバを許して無いので…。Remote NDIS Compatible Deviceのほうは試してないですが、認識させられるかもしれません)

## Gadget側のMACアドレスの設定方法

得に指定しなくてもランダムで決定されますし、問題はないと思いますが、次のようにやると設定できます。

```console:log

$ modprobe g_ether host_addr=ホストのMAC dev_addr=デバイス側MACアドレス

```

## IPアドレス設定のコツ

相手がWindowsの場合は、ネットワークを認識した時点でAPIPA(Automatic Private IP Addressing：DHCPなどではなく自動的にIPが割り振られるシステム)が働きます。

なので、Gadget側をあらかじめ[169.254.1.0]～[169.254.254.254]の値を設定しておくと、Windwos側でIPアドレスの設定をしなくても通信ができるのでお得です。

IPアドレスの設定は、ifconfig時にやります。

```console:log

$ ifconfig usb0 169.254.10.10 up

```
とかやるとよいですね。
AOJ 0000;QQ 解答

public class Main{
public static void main(String[ ]args){

int k = 0;
for(int i = 1 ; i<10 ;i++){
for(int j = 1 ; j < 10 ; j++){
k = i * j;

System.out.println(i + "x" + j + "=" + k);
}
}
}
}
jQueryを使ってタグの内容が空の場合はそのタグを削除する

今後使いそうなのでメモ

```:
$(function() {
	 $("p:empty").remove();
});
```

##親要素を消したいとき
.parent()を使う

```:tableの場合
$(function() {
	 $("table tr td:empty").parent("tr").remove();
});
```
CodeIgniterのActive Recodeで実行したSQLを確認


Active Recodeで書いているとたまにSQLはどんな感じになっているのか気になるときがあります

クエリを実行後に$this->db->last_query()で確認できます。
echoで呼び出せばOKです。

```
echo $this->db->last_query();
```

実際に書くとこんな感じ。

```model.php
$this->db->select('user_id');
$this->db->from('user');
$query = $this->db->get();
echo $this->db->last_query();
```

結果表示はこんな感じです

```結果
SELECT `user_id` FROM (`user`)
```

参考: [php - Getting CodeIgniter Active Record's current SQL code - Stack Overflow](http://go.shr.lc/1uVRyAj)
rsyncで.gitignoreにあるファイルを無視してリモートにコピーする

`-C` と `--filter` を使う。

```zsh
rsync -C --filter=":- .gitignore" -acvz --delete /path/to/project/ user@example.com:/path/to/project/
```

古いバージョンの `rsync` だと、 `-C` で **.git/** が無視されない場合があるので、新しいバージョンのものを使うと良い。

aliasを設定しておくと便利。

```zsh
alias rsync-git='rsync -C --filter=":- .gitignore"'
```
iOS 7 でカウントダウンタイマーを実装する

iOSのゲームアプリを作っていて、「残り時間」を実装する必要があったので、その方法のメモ。

##NSTimerを使う

※2014/06/12修正しました。
カウントダウンする必要のあるViewControllerのヘッダーファイルにNSTimerのインスタンスを宣言しておいて、
iOS7だとPrivate変数は無名カテゴリに入れてしまうの方がアクセサとか作ってくれていいっぽいです。


※修正前

```lang:ViewController1.h
@interface ViewController1 : UIViewController
{
    int time;
    NSTimer* countdown_timer;
}
```

※2014/06/12修正後

```lang:ViewController1.m
@interface ViewController1()
@property (nonatomic)         int time;
@property (nonatomic, strong) NSTimer* countdown_timer;
```

実装ファイルでタイマーの設定をします。

```lang:ViewController1.m
- (void)viewDidLoad
{
    [super viewDidLoad];
 
    countdown_timer = [NSTimer scheduledTimerWithTimeInterval:1 
                       target:self 
                       selector:@selector(update) 
                       userInfo:nil 
                       repeats:YES];
    time = 30;
    [countdown_timer fire];
}
```

scheduledTimerWithTimeInterval:1の部分は、1秒ごとにupdate関数を呼び出すという設定です。
repeatsをYESに設定することで、繰り返し実行されます。
あとは、update関数の中身に、timeをデクリメントする処理を書けばカウントダウンされます。

```lang:ViewController1.m
- (void)update
{
    if (time <= 0.0) {
        [countdown_timer invalidate];
    }
    else {
        time--;
    }
}
```

invalidateでタイマーを止めています。


##表示の仕方
残り時間を表示するには、labelを用意して、そのlabelのtextに残り時間をNSStringに変換して入れます。
`[NSString stringWithFormat:@"%d",time];`で簡単に変換できます。
docker pullできずハマる


v1.0.0が出たので触ってみたら、いきなりコケて辛い思いをしました。
実行環境は、Mac OS X 10.9.3で、dockerはhomebrew-cask を利用してインストールしています。

[Installing Docker on Mac OS X]("http://docs.docker.com/installation/mac/") の「Installation」まで終わらせて、

```sh
docker pull ubuntu
```

としてみたところ、次のようなエラーがでて先に進みません。。

> Sending build context to Docker daemon 19.97 kB
> Sending build context to Docker daemon
> Step 0 : FROM ubuntu
> Pulling repository ubuntu
>2014/06/11 12:09:21 Get https://index.docker.io/v1/repositories/ubuntu/images: dial tcp: lookup index.docker.io on 192.168.1.1:53: no answer from server

名前解決ができないのだろと思い、boot2docker-vmのresolve.confを変更してみるが、直らず。

```sh
host $ boot2docker ssh
vm $ sudoedit /etc/resole.conf

# nameserver を、8.8.8.8 に変更
```




## 解決方法

boot2dockerを再起動したらpullできるようになりました。

```sh
boot2docker restart
```



参考
[no answer from server #3603](https://github.com/dotcloud/docker/issues/3603)
Luaをインストールしてみた

Luaインストール

あまりにも簡単すぎた・・・。

# 環境

```
brew -v 
```

> Homebrew 0.9.5

# インストール

```
brew install lua
```

> Warning: Your Xcode (4.6.2) is outdated
Please update to Xcode 4.6.3.
Xcode can be updated from the App Store.
==> Downloading http://www.lua.org/ftp/lua-5.1.5.tar.gz
######################################################################## 100.0%
==> Downloading patches
######################################################################## 100.0%
==> Patching
patching file Makefile
patching file src/Makefile
patching file src/lua.c
==> make macosx INSTALL_TOP=/usr/local/Cellar/lua/5.1.5 INSTALL_MAN=/usr/local/Cellar/lua/5.1.5/share/man/man1
==> make install INSTALL_TOP=/usr/local/Cellar/lua/5.1.5 INSTALL_MAN=/usr/local/Cellar/lua/5.1.5/share/man/man1
?  /usr/local/Cellar/lua/5.1.5: 15 files, 300K, built in 6 seconds

```
lua
```

> Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio

# いつもの Hello World

```
print("Hello Wolrd!!")
```

> Hello World!

# 参考サイト
http://y-ken.hatenablog.com/entry/macosx-install-lua-luajit-luarocks
Express 4.x系のインストールとコマンド

## Express 4.x系のインストール

```
$ npm install -g express-generator
```

## 基本的なコマンド

```
$ express ディレクトリ
$ cd ディレクトリ
$ npm install
$ npm start
```

3系のように「\$ node app」や「\$ node app.js」では開始できない
そのようにするためにはapp.jsを自力で記述

http://localhost:3000
でアクセスするのは同じ。ただしapp.jsにポートの設定が見当たらない

以下のapp.jsが自動生成されている

```js:app.js
var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(require('stylus').middleware(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);

/// catch 404 and forward to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

/// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});


module.exports = app;
```


## オプション

```
  Usage: express [options] [dir]

  Options:

    -h, --help          output usage information
    -V, --version       output the version number
    -e, --ejs           add ejs engine support (defaults to jade)
    -H, --hogan         add hogan.js engine support
    -c, --css <engine>  add stylesheet <engine> support (less|stylus|compass) (defaults to plain css)
    -f, --force         force on non-empty directory
```

CSSプリプロセッサーは今まで通り

```
$ express ディレクトリ -c stylus
```

新たにcompassのサポートが見られる

オプションのセッションサポート「-s」は廃止っぽい



参考
http://blog.excale.net/index.php/archives/4186
rbenv BUILD FAILEDの原因はreadlineかも

```$ rbenv install```
Downloading ruby-2.0.0-p451.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/9227787a9636551f1749ee8394b5ffe5
Installing ruby-2.0.0-p451...

BUILD FAILED

Inspect or clean up the working tree at /var/folders/bb/cg4hs1y96td08skrjw5cj8rh0000gp/T/ruby-build.20140611125242.46745
Results logged to /var/folders/bb/cg4hs1y96td08skrjw5cj8rh0000gp/T/ruby-build.20140611125242.46745.log

Last 10 log lines:
compiling ossl_x509crl.c
compiling ossl_x509ext.c
compiling ossl_x509name.c
compiling ossl_x509req.c
compiling ossl_x509revoked.c
compiling ossl_x509store.c
installing default openssl libraries
linking shared-object openssl.bundle
ld: warning: directory not found for option '~/.rbenv/versions/2.0.0-p451/lib'
make: *** [build-ext] Error 2
rbenv: version `2.0.0-p451' is not installed


これに対して

```$brew uninstall readline```
```$brew install https://raw.githubusercontent.com/Homebrew/homebrew/0181c8a1633353affefabe257c170edbd6d7c008/Library/Formula/readline.rb```
```$brew pin readline```

で、rbenv install出来るようになる。
社内ネットにつないだときだけプロクシ設定をオンにする

社内ドメインがexample.co.jpだとしましょう。
こんなファイルを社内ウェブサーバに置いて http://wpad.example.co.jp/wpad.dat というURLで参照できるようにしておきます（wpad.example.co.jpという名前はhosts解決でも構いません。すなわちローカルマシン内でもOK）。

するとあら不思議。社内ネットにつながったときだけプロキシが有効になります。

```js:wpad.dat
function FindProxyForURL(url,host)
{
	if ( isPlainHostName(host)
	  || shExpMatch(host, "172.16.*")
	  || shExpMatch(host, "172.17.*")
	  || shExpMatch(host, "172.18.*")
	  || shExpMatch(host, "172.19.*")
	  || shExpMatch(host, "172.2?.*")
	  || shExpMatch(host, "172.30.*")
	  || shExpMatch(host, "172.31.*")
	  || shExpMatch(host, "10.*")
	  || shExpMatch(host, "192.168.*")
	  || shExpMatch(host, "127.0.0.*")
	  || shExpMatch(host,"*.example.co.jp"))
		return "DIRECT";
	else return "PROXY proxyserver:8080";
}
```

Macクライアントの場合は【ネットワーク環境設定】-【詳細】-【プロキシ】のダイアログで【自動プロキシ検出】にチェックを入れてください。
[JavaScript] オブジェクトをループでまわす


「そもそもオブジェクトをループで回したい場面なんてねぇよ！」
「潔く標準のメソッド使えよ！」といったツッコミを想定の上で書いております.

ご承知の上でお読みください.

![js-logo.png](https://qiita-image-store.s3.amazonaws.com/0/7756/2161a4a5-49d8-5163-891e-1563dedcb9e2.png)

## フロー

ふとオブジェクトをループで回したいってときに私がたどるフロー

1. for in 使うか?
2. いや keys で key 配列とってきて forEach で回したほうがカッコよくね？
3. obj.keys().forEach(...) ... あれ? エラー??
4. keys って Object の static メソッドかよ!!
5. Object.keys(obj).forEach(...)

これを今回は↓

1. forIn(...) 使お♪

で済ませちゃおうって tips です.

## よくやっちゃうダサいパターン

for in でまわす.
`hasOwnProperty()` 忘れがち.

```js
var human = {
    name: "phi",
    age: 25,
    bloodType: 'O',
};

for (var key in human) {
    if (human.hasOwnProperty(key)) {
        var value = human[key];
        console.log(key, ':', value);
    }
}
```

## モダンだけど使い方間違いがちなやつ

`keys()` 使えば `hasOwnProperty()` でチェックする必要ない.
けど, `human.keys()` じゃなくて `Object.keys(human)` ってのがなんとも...

```js
var human = {
    name: "phi",
    age: 25,
    bloodType: 'O',
};

Object.keys(human).forEach(function(key) {
    var value = this[key];
    console.log([key, ':', value].join(' '));
}, human);
```

## forIn 定義してオレオレコーディング

js の最大のメリット(デメリット?) である `prototype` の拡張!
`Object.prototype` に `forIn` を定義しちゃいます.

```js
Object.defineProperty(Object.prototype, "forIn", {
    value: function(fn, self) {
        self = self || this;

        Object.keys(this).forEach(function(key, index) {
            var value = this[key];

            fn.call(self, key, value, index);
        }, this);
    }
});
```

これでさっきのコードがこうなります.

```js
human.forIn(function(key, value, index) {
    console.log([index, key, value].join(','));
});
```

使うのかわかんないけど index も取れちゃいます♪

## サンプル

実際の動作は[こちら](http://jsdo.it/phi/1zVc)で見れます!




ちなみに最新の [tmlib.js](http://phi-jp.github.io/tmlib.js/) でも同じようなメソッドが定義されているので
読み込むだけで `obj.$forIn()` って感じで同じようなことがやれます.
っというステマでしたmm



他にもこんなのあるよーとかあれば教えて下さい:D
クッキーのSecureフラグはリバースプロキシに立てさせたい

HTTPクッキーで秘密情報、例えばログインセッションIDなどを扱う場合はSecureフラグを立てるのが定石です（例え秘密情報を扱わないとしても立てるのが定石と考えるべきかもしれません。セキュリティテストでは機械的に問題点として検出されてしまいますから）。

Secureフラグとは「HTTPS通信時にしか送り返さないでください」というブラウザへの指示。

```
Set-Cookie: session_id=8Zf60baQ4;secure
```

などと、Set-Cookieヘッダにsecureと追記することで実現します。こうしておけば、平文通信に秘密情報が流れてパケットキャプチャで盗聴されてしまうという心配がなくなります。

開発時にはsecureフラグが邪魔だったり
==
というわけでまともなユーザアカウント管理のあるWebシステムならsecureフラグは当然付けなければいけないのですが、問題は開発中です。

開発マシンのローカルにサーバを立てて動かしているときなど、HTTPSアクセスってことはまずしません。HTTPでアクセスしますよね。すると、secureフラグのせいでログインができなくなってしまうのです。

本番環境に発行したときだけsecureがオンになるように設定する？ 設定漏れが怖いですね、だってsecureをオンにし忘れたって異常動作は出ないから気付きませんよ…？

HTTPS通信の付属品だと考えればHTTPSリバースプロキシの責務
==
HTTPS通信をサーバ側でどう実現するかですが、Apacheをフロントエンドに立ててHTTPSリバースプロキシとして働かせる場合、 **HTTPS通信をしていることでsecureフラグが必要になっているんだから、HTTPS通信を実現しているApacheがそれもやってください** と考えると機能が一箇所にまとまります。

Apacheにset-cookieヘッダの書き換えをさせるのです。ここで使うのはmod_headersモジュール。標準モジュールです。httpd.confへの記述は一行だけ。

```
Header edit Set-Cookie ^(.*)$ $1;secure
```

Nginxだと一筋縄ではいかない
==
Apacheよりは全般的に設定のシンプルに書けるNginxですが、これに相当する設定をするのは単純ではありません。自力でスクリプトを記述する必要があります。
Python3でpdfを作る多分一番簡単な方法


## 結論から
1. wkhtml2pdfをインストール
2. html+cssで書類を整形する
3. wkhtml2pdfでpdf化

以上。あっPython関係無い！

とにかく、2時間程度でpdf出力機能の実装がおわったので、時間ないときに良いと思います。

参考：http://tdoc.info/blog/2012/09/19/wkhtmltopdf.html



## 良い点と悪い点
#### 良い
・書類をhtml+cssで作れるから超簡単。
・特に、Webアプリにpdf出力機能をつける場合の親和性が良い。ブラウザで見えるものならpdfにできるわけなので、「書類ページ」を作ればいいだけ。ほかの一般ページと同列にテンプレートのメンテナンスができる。

#### 悪い
・html+cssだから制御が限られる。主に縦方向の。書類の下余白とかどうでもいい場合だけ使える。

## Pythonからwkhtml2pdfを呼ぶ方法
コマンド叩けばいいだけだけど、PythonラッパのPython-wkhtml2pdf ってのがあって超絶便利だった。
Python2 onlyだけど数分で対応できます。
いちおうフォークしてPython3対応したやつをここに置いた
https://github.com/yasunori/python-wkhtmltopdf/tree/myFeatureSpike
PRしてないのは、元がPython2.5を動作対象にしてて、やだなーってなっています。printとか。`__future__` 使えないし、これどうすればいいんでしょう偉い人教えてください。


## 捕捉
### Pythonでのpdf作成、他の有名な方法
#### Sphinx
Pythonでドュメントといえば、だけど、今回はもっと、サクッとやりたかったので見送り。
http://tk0miya.hatenablog.com/entry/20111208/p1


#### reportlab
Python, pdf で検索すると大体出てくるのがこれだけど、Python2なので今回は見送り。
と思ってたらPython3対応してたー！
http://www.reportlab.com/software/documentation/relnotes/30/
今度ためしてみよう……

おしまい
rack-mini-profilerをGemfileに入れるときは require: false しよう

# tl;dr

`rack-mini-profiler` を `Gemfile` に入れるときは `require: false` しよう。

# 詳細

## 動く

デフォルトで有効になってるってのは多人数で開発してるといろいろよろしくないので、環境変数を指定して有効にするようにした。

* Gemfile

```ruby
group :development do
  gem 'rack-mini-profiler', '0.9.1', require: false
end
```

* config/initializers/rack_profiler.rb

```ruby
if Rails.env == 'development'
  if ENV.has_key?('ENABLE_RACK_PROFILER')
    require 'rack-mini-profiler'
    Rack::MiniProfilerRails.initialize!(Rails.application)
  end
end
```

* rails server

```
% ENABLE_RACK_PROFILER=1 bundle exec rails server
```

## 動かない

* Gemfile

```ruby
group :development do
  gem 'rack-mini-profiler', '0.9.1'
end
```

* config/initializers/rack_profiler.rb

```ruby
if Rails.env == 'development'
  require 'rack-mini-profiler'
  Rack::MiniProfilerRails.initialize!(Rails.application)
end
```

これをしないと500が返る。原因は  `rack-mini-profiler` が複数回 `require` されること。

```
undefined method `discard' for nil:NilClass rack-mini-profiler
```

backtrace。

```
[2014-06-11 11:48:42] ERROR NoMethodError: undefined method `discard' for nil:NilClass
/PATH/TO/YOUR/ruby/gems/2.0.0/gems/rack-mini-profiler-0.9.1/lib/mini_profiler/profiler.rb:307:in `call'
```

ググると[PR](https://github.com/MiniProfiler/rack-mini-profiler/pull/68)が引っかかるんだけど、「それは違うよ」というオチで、「idiot-proof」として（ぐぬぬ）別の[PR](https://github.com/MiniProfiler/rack-mini-profiler/pull/75)がマージされている。

## Links

* https://github.com/MiniProfiler/rack-mini-profiler
* https://github.com/MiniProfiler/rack-mini-profiler/pull/68
* https://github.com/MiniProfiler/rack-mini-profiler/pull/75
phpからレスポンスをXMLで取得したい

マイ・オークション（出品中）の情報をphpからレスポンスをXMLで取得したいです。

```php
<?php
$ch = curl_init();
$options = array(
  CURLOPT_URL => "https://auctions.yahooapis.jp/AuctionWebService/V2/mySellingList?start=$start"
 ,CURLOPT_HTTPHEADER =>array("Authorization: Bearer $accessToken ")
);
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
$xml = simplexml_load_string($response,'SimpleXMLElement');
print_r($xml);
```

した結果が下記の通りで、[totalResultsAvailable]の値は本当は０でないです。
/ResultSet/Result　の情報が取得できてないのは、[totalResultsAvailable]が０になっているからですか？
cURL 転送用オプションが足りないのでしょうか？
simplexml_load_stringのオプション指定が必用なのでしょうか？

SimpleXMLElement Object ( [@attributes] => Array ( [totalResultsAvailable] => 0 [totalResultsReturned] => 0 [firstResultPosition] => 0 ) [0] => )
「ユニティちゃんゲームジャム @ GMO Yours」6.14-6.15

![unity_on_photon.png](https://qiita-image-store.s3.amazonaws.com/0/26479/f9c50ed0-a9c3-406b-e9c9-11b7bc1d4f0b.png)


6月14日-15日　
## ユニティちゃんゲームジャム @ GMO Yours

#  開催スケジュール 

2014年6月14日（土）
　 9:00 集合
　10:00 開会式 チーム分け
　18:00 進捗発表
　23:00 ビル入退館〆切（23時〜翌9:00までは出入り不可となります）

2014年6月15日（日）
　 9:00 再入館開始
　15:00 開発終了、発表
　17:00 閉会

#  集合・出入口
【ロビー階】 初日朝の集合は、こちらのロビー階にお越し下さい。
http://ir.gmocloud.com/company/profile/access/ 
　　　　　　 
【地下入口】それ以降の来場は、地下１階入り口をご利用ください。
http://ir.gmocloud.com/company/profile/access02/ 



#  会場利用アナウンス 

・会場となるGMO Yoursへの出入りには入館カードが必要です。
・入館カードの発行には、お名前とご連絡先が必要です。
・途中入退館をする場合は、都度係員への確認が必要です。
・ビル内の自動販売機等はご利用いただけません。
・お飲物やお食事は、あらかじめ付近のコンビニ等で充分に補充してください。
・館内は全館禁煙です。喫煙スペースはビルの外にあります。
・PC、アダプター、その他周辺機器等はお貸し出しできません。
・電源タップ等は会場でご用意致しますが、数に限りがございますので複数機材をご利用される方は、持参していただくことをお勧めします。

#  Unity　参照URL
Unity 最新バージョン(4.5.1)
http://japan.unity3d.com/unity/download/

ユニティちゃん 2Dデータ
http://unity-chan.com/
公式Webよりダウンロードしたパッケージデータがうまくインポートできない場合は下記URLの「Source code(zip)」よりデータをDLするようお願いいたします。
https://github.com/unity3d-jp/unitychan2d/releases/
 
　
#  Photon × Unityちゃん2D

https://dl.dropboxusercontent.com/u/153254465/Unity/unitychan/2D/Photon/Photon.html

Unityテクノロジーズの安藤さんが作成したユニティちゃん2Dゲームです。PhotonCloud を利用してリアルタイムマルチプレイが楽しめます。
ファイルも下記URLからご参照ください。

Zipファイル：
https://dl.dropboxusercontent.com/u/153254465/Unity/unitychan/2D/Photon/Photon%E5%AF%BE%E5%BF%9C%E3%83%A6%E3%83%8B%E3%83%86%E3%82%A3%E3%81%A1%E3%82%83%E3%82%932D.zip


#  進捗発表

①　チーム照れ屋
　　PKゲーム×戦略性　のハイブリットゲーム！

　　PC２台以上でユニティちゃんがPKするゲーム。
　　FREE KICK STRIKE
   Photonの接続でいくらでもキーパーが増やせる。
　　キックするまでの立ち位置で方向性が選定され、
　　キーパーは残り時間との兼ね合いを計算してセーブの位置を予測する。


②　チームVR
　　Oculus で　オンライン ボ◯バ◯マ◯　

　　VRユニティちゃんボンバー
　　OculusRiftでボンバーまんのごとく爆弾を連発
　　Photonを使ってオンラインでリアルタイム対戦を実現。
　　

③　チームESCAPES　2D
　　大量のユニティちゃんがユニティ仮面を襲う！？

　　アイテムをゲットしながらユニティ画面が奔走！
　　ユニティちゃんが近づくと「進捗どうですか？」とプレッシャーを掛ける！
　　ユニティちゃんを落とす穴も作り出せる戦略性に富んだもの！


④　チームスーパーユニティ対戦
　　ユニティちゃんと世界各国のキャラクターと異種格闘！
　　まるでスマブラを彷彿とさせる同時対戦ゲーム！


⑤　チーム親子丼
　　Photonとユニティちゃんの相性は!?みんなでサッカーやろうせ！
　　「スーパーユニティちゃんサッカー」目線を変えてプレイを楽しめる！
Photonを使って６人同時に3-3マッチを実現。シンプルかつ高精度のチーム対戦に！


⑥　チーム 時村研究所
　　クッキーXXX !? ビートに合わせてユニティちゃんボイスが楽しめる！
　　ユニティちゃんが走ると　曲に合わせて大量のユニつむりが！
　曲も作成し、が変わるになるという仕様。


⑦　Uniの幸
　　目指せ内定！ Uniを使ってスマホで手軽にワンタッチアクション！
　　ピンボールのようにうにを回収するゲーム、
　　最終ダンジョンでは、ユニティ仮面の振らせる仮面を回収、それまで回収したウニでユニティ仮面を攻撃！


⑧　ユニティちゃんCUP 2014
　　Kinectを使ってPKゲーム！ユニティちゃんに、俺はなる！
　　
　　PKのキッカーの動きをKinectで探知し、ユニティちゃんがキック！
　　短時間のゲームジャムで実装できるよう、ボールの跳躍角度は固定し、方向だけKinectで探知して飛ぶように設計。
　
　　
　
⑨　荒谷組　日本工学院爆破
　　ユニティちゃんが日本工学院をぶっ壊す！？
　　
　　LeapMotion で最初のロケットスタートを始動
　　工学院を飛び出して太陽系惑星を次々と爆破。
パーミッション設定メモ

サーバーのユーザーにフォルダの書き込み権限を与えたい
※sudo chown -R ユーザー：グループ　ファイル　は、自分が管理者でなくなるので良くなかった…

1.
ユーザー名の確認 ps auxw | grep httpd
グループ名の確認 cat /etc/group

2.
（対象フォルダの上階層へcd）
ll -la　パーミッション確認

3.
グループにサーバーのユーザーを追加する
sudo dscl . -append /Groups/グループ名 GroupMembership ユーザー名
確認
dscl . -read /Groups/グループ名

http://nemoplus.hateblo.jp/entry/20090120/1232466123
http://flyingmango.jp/web/dscl.html

4.
フォルダのグループのパーミッションを変える
sudo chmod -R g+rwx 対象フォルダ
確認
ll -la
MySQL の権限のコマンドまとめ。


### まずどのユーザーがいるか知りたい。
```sql
SELECT user,host,password FROM mysql.user;
```

###個々のユーザーの権限はなにか知りたい。
```sql
SHOW GRANTS FOR root@'localhost';
```

###いわゆる何でもできる管理者用ユーザ
```sql 
GRANT ALL ON *.* TO adminuser@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
```
※MySQLにはGRANT権限というものがあります。GRANT権限とは、他のユーザに対して権限を付与することができる権限のことです。当然のことながらGRANT権限は通常管理者用ユーザにか付与しません。


###IP制限
```sql
GRANT ALL ON *.* TO adminuser@'172.16.0.0/255.255.255.0' IDENTIFIED BY 'password' WITH GRANT OPTION;
```


###全てのデータベースにアクセスできる一般ユーザ(WITH GRANT OPTIONがないのに注目)
```sql
GRANT ALL ON *.* TO testuser@'%' IDENTIFIED BY 'password';
```

###特定のデータベースにアクセスできる一般ユーザ
```sql
GRANT ALL ON testdatabase.* TO testuser@'%' IDENTIFIED BY 'password';
```

init_connect
らへんは、

###SELECT,INSERT,UPDATE,DELETEしかできない一般ユーザ
```sql
GRANT SELECT,INSERT,UPDATE,DELETE ON testdatabase.* TO testuser@'%' IDENTIFIED BY 'password';
```

###手動で権限テーブルをリロードする
```sql
FLUSH PRIVILEGES;
```
参考：[init_connectコマンドが失敗したらしい。](http://programming-10000.hatenadiary.jp/entry/20130806/1375794910)
ログの出し方メモ

WordPressでお問い合わせのサンキューページにCookieを利用したところ不具合が起こったため、どう条件分岐を通ったか確認する

```lang:functions.php
<?php
function p($arg) {
    error_log($arg . "\n" , 3, 'そのフォルダ/log/wp.log');
}
function d($arg) {
      ob_start();
            var_dump($arg);
            $log = ob_get_contents();
                    ob_end_clean();
                    return rtrim($log);
}
function pd($arg)
{
      p(d($arg));
} ?>
```

```lang:thanks.php
<?php p("---------------------------------"); ?>
<?php pd($_COOKIE["visited"]);?>
<?php if(isset($_COOKIE["visited"])){
  pd("setted");
  setcookie("visited","",time() - 1800, "/" );
}else{
  pd("not setted");
   header('location: /contact/index');
}
?>
<?php p("---------------------------------"); ?>
```


ブラウザでthanks.phpをリロードする
その後、

`tail -f そのフォルダ/log/wp.log`


（ログには関係ないが）

```lang:contact.php
<?php setcookie("visited", 1, 0, "/" ); ?>
```
Redmine上の文書をまともに印刷できるようユーザーCSSを作りました

開発文書類はRedmine上でWikiで書くことにしたとしましょう。でもそれを偉い人に出す大きい会議に出すお客さんに出すとかなると印刷が避けられなくなります。そしてRedmineのWiki文書を印刷したものは体裁が悲惨というか人間が読めたものではありません。

そこで印刷時にだけ発効するユーザーCSSを書きました。ChromeのStylebotでしか動作確認していませんしMeiryoとか使っててWindows寄りですが、調整しつつご活用ください。

```css
@media print {
  body {    
    font-family: serif;    
    font-size: 16px;    
    line-height: 1.6em;    
    color: #000;
  }
  ul,ol {    
    margin-bottom: 0 !important;
  }
  b, strong {    
    font-family: Meiryo;
  }
  a {    
    text-decoration: underline !important;    
    color: #000 !important;    
    background-color: #333;
  }
  h1, h2, h3, h4 {    
    font-family: Meiryo;    
    color: #000 !important;
  }
  h2, .wiki h1 {    
    font-size: 21px;
  }
  h3, .wiki h2 {    
    font-size: 19px;
  }
  h4, .wiki h3 {    
    font-size: 17px;
  }
  #main {    
    background: #fff;
  }
  div.wiki pre {    
    margin: 0.3em 1em 0.3em 1em;    
    white-space: pre-wrap;
    word-break: break-all;    
    font-size: 14px;    
    line-height: 1em;
  }
}
```
Rails4.1でdeviseのログイン後のリダイレクト先を変更

##概要
Ruby On Rails4.1環境でdeviseを利用してログイン機能を実装していますが、
ログイン後にリダイレクトするパスを変更します。

##実装

after_sign_in_path_forをオーバーライド

```app/controllers/application_controller.rb
# 以下を追加
  # ↓メソッドの返り値がリダイレクト先のパスになります。
  def after_sign_in_path_for(resource)
    root_path
  end
```

##補足

今回は例としてroot_pathを入れていますが、
ここではroot_pathのようにPathHelperでも、
'/menu/index'のようにURL指定でも、
何かしら複雑な処理を入れても構いません。
Android NDKを触ってみる

## Android NDKとは？
* Android Native Development Kitの略称である。
* Androidアプリケーションの一部または全部をC/C++言語で開発するためのキットです。 

## 環境構築
* 前提
 * eclipse上に、Android開発環境構築済み(英語版)
* 構築手順
 * [Android NDKのダウンロード](http://developer.android.com/tools/sdk/ndk/index.html)
 * インストーラは、存在していない。任意の場所に解凍するだけ
 * eclipseを起動して、menu Window → Preferences → Android → NDK → “NDK Location” にNDKのパスを設定する
 *   ・   例： Path/to/android-ndk-r9d
 * 環境変数の PATH にも NDK のフォルダを追加する


## hello world NDKを作成
#### プロジェクト作成
![hellondk_create_project.png](https://qiita-image-store.s3.amazonaws.com/0/13451/8440d3ab-6160-91cd-a498-5bde53b9d7ab.png)
![hellondk_create_project_over.png](https://qiita-image-store.s3.amazonaws.com/0/13451/108be002-06e7-e82b-0a95-591906ab6bde.png)


#### Native Support設定
* プロジェクト・エクスプローラーのプロジェクト名の上でマウスを右クリックし、「Android Tools」のサブメニューから「Add Native Support」を選択する
* Library Nameのネームを修正するとか、そのまま保留するとか
* プロジェクト・エクスプローラーの下に、jniフォルダが出て、helloWorldNDK.cppとAndroid.mkのファイルが2つある
* プロジェクト作成するときに、自動的に生成されたMainActivity.javaを修正する

```java

public class MainActivity extends Activity {

	TextView text1;

	static {
        System.loadLibrary("helloWorldNDK");
    }
	 
	public native String msgFromNDK();
	 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        text1 = (TextView)findViewById(R.id.textView1);
        text1.setText(msgFromNDK());
        
        if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
    }

...省略...

```

#### eclipseで、C/C++ヘッダーファイルを作成
* eclipseのツールバーに、「External Tools」→ 「External Tools Configurations」を選択する
* 左上に、新規作成ボタンをクリックして、以下のように「NDK create」を作成する
* ![Externa_tools_new.png](https://qiita-image-store.s3.amazonaws.com/0/13451/77ca9ae7-a893-0c66-77c2-a7286614eec9.png)
* MainActivity.javaソースファイルを開いてテキストエディターがアクティブの状態で、「NDK create」を実行する
* 「com_example_helloworldndk_MainActivity.h」が、jni下に、作成された

#### C++のソースファイル
```c++
#include <jni.h>
#include <assert.h>
#include <com_example_helloworldndk_MainActivity.h>

JNIEXPORT jstring JNICALL Java_com_example_helloworldndk_MainActivity_msgFromNDK
(JNIEnv *env, jobject thiz) {
    jstring jstr = env->NewStringUTF("hello world NDK!");
    assert(jstr);
    return jstr;
}
```

#### 実行結果
![hellondk_result.png](https://qiita-image-store.s3.amazonaws.com/0/13451/e594d7f1-6312-c59c-0d9e-48b818be1ce3.png)


## 参照
* http://note.chiebukuro.yahoo.co.jp/detail/n136598
 * 大部分は、この文書を参照したけど、この文書の最近更新が2013年なので、古くなる
* [Android NDKのインストール](http://dench.flatlib.jp/opengl/androidsdk)
ubuntu 12.04 LTS に dockerをインストールしたときのメモ

Ubuntu 12.04 LTS にdocker 1.0.0 をインストールしたときの手順です。
[公式サイト](http://docs.docker.com/installation/ubuntulinux/#ubuntu-precise-1204-lts-64-bit)の手順そのままです。

# 動作確認環境
 * OS:Ubuntu 12.04.4 LTS(64bit)
 * Kernel Version:3.8

# 前準備

```shell-session
sudo apt-get update
sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
```

## /usr/lib/apt/methods/https が存在するか？
存在しないときは、コマンド実行

```shell-session
apt-get update
apt-get install apt-transport-https
```

# dockerのリポジトリを登録

```shell-session
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
sudo sh -c "echo deb https://get.docker.io/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"
```

# docker インストール

```shell-session
sudo apt-get update
sudo apt-get install lxc-docker
```

# OSイメージのダウンロード
ubuntuのOSイメージをダウンロードする。

```shell-session
sudo docker run -i -t ubuntu /bin/bash
```
Google Chromeでユーザエージェントを変更する


**Google Chrome Developer Toolsに［Overrides］設定がない**と思ったら、場所が変わっていたようです。

以下、ユーザエージェントの変更方法です。


**1.デベロッパーツールを開く**
[Ctrl + Shift + i] で開きます



**2.Show drawerをクリック**
\>≡ のようなボタンをクリックします。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/40418/dacfa973-6856-eaf5-137b-9599c8caa346.png)


**3.Emulationタブをクリック**


![2.png](https://qiita-image-store.s3.amazonaws.com/0/40418/cff0f204-92ed-33bd-a0b6-03ed64cf6efc.png)


**4.User Agentを表示**

![3.png](https://qiita-image-store.s3.amazonaws.com/0/40418/f045d7b5-cb6b-1b82-4879-36add0daadbf.png)


**5.Spoof user agentをチェック**


![4.png](https://qiita-image-store.s3.amazonaws.com/0/40418/4a87a622-2ce2-130c-941f-dcc8ebe6acb6.png)


**6.ユーザエージェントを選択**


![5.png](https://qiita-image-store.s3.amazonaws.com/0/40418/d8407e27-6d20-4cfa-3b3f-218268e58bdf.png)



これを使用すれば、Chrome1つで色々なブラウザをテストすることが出来ます。

・補足
Chrome Developer Toolsのドキュメント
https://developer.chrome.com/home/devtools-pillar
Tomcatで画像ファイル表示

色々試してみましたが、このコードで安定したのでメモです。
Tomcat: 7.0.53

まずはサーブレットのコード。

```java:ImageFileServlet
package com.sample.web;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/imagefile")
public class ImageFileServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public ImageFileServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //出力するファイル(あらかじめWebContent以下に配置しておく。)
        String dir = getServletContext().getRealPath("/");
        String fname = request.getParameter("name");

        int iData = 0;

        //ServletのOutputStream取得
        ServletOutputStream out = response.getOutputStream();

        //画像ファイルをBufferedInputStreamを使用して読み取る
        BufferedInputStream in = new BufferedInputStream(new FileInputStream(dir+fname));

        //画像を書き出す
        while((iData = in.read()) != -1){
            out.write(iData);
        }

        in.close();
        out.close();
    }

}
```

続いて表示用のHTML

```html:test.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Servletで画像ファイル表示</title>
</head>
<body>
<img src="./imagefile?name=neko2.jpg"><br>
<img src="./imagefile?name=neko2.png"><br>
<img src="./imagefile?name=neko2.gif"><br>
</body>
</html>
```
標準入力から入れたjsonをpythonにparseしてもらう



毎度 json.load[s] とどっちだっけと迷ったり
sys.stdin() みたいに呼び出して怒られたり
encoding='utf-8'を指定しないで怒られたりしてるので覚え書きをします


```python
#!/usr/bin/python
import json, sys

pythoned_json = json.load(sys.stdin, encoding='utf-8')
```
【質問】RubyでOPACを構築

RubyでOPACを構築しようとしているのですが、
未だにRubyとは何なのかが分かっていない状態で手も足も出ません。
答えを教えていただけないでしょうか。
申し訳ありませんが、よろしくお願いします。

↓
http://ss.cc.affrc.go.jp/ric/opac/opaclist.html
これらのOPACを参考にしつつ、以下の仕様を満たすOPACを構築しなさい。

A. 必須仕様
(1) jbisc.txtのデータをすべて取り込むこと。
(2) データベースに格納するフィールドは、NBC、ISBN、TR、PUBとする。
(3) TRはタイトル(本タイトルやタイトル関連情報等)と著者(責任表示)の2つのフィールドに分
けて格納すること。
(4) PUBは出版者(出版地や出版者名)と出版年の2つのフィールドに分けて格納すること。
(5) 検索語を入力する窓を一つ設定し、検索語を1語入れると、タイトルと責任表示を検索し、
結果を返すこと。
(6) 結果には、データベースに格納したフィールドの全てを表示すること。表示は見やすいよう
に配置し、色遣いも工夫すること。


↓以下、できれば…

B. 加点仕様(中級)
(1) NBC、ISBN、TR、PUBだけでなく、全てのフィールドをデータベースに格納すること
(2) 検索語を入力する窓に複数の語を入力し、検索が行えること
(3) 全てのフィールドを同じ条件で検索するANY検索、フィールドを個別に指定した検索の両
方が行えること。フィールドの指定はボタンによる切り替え、入力用の窓を別にするなど、
複数の方法がある。

C. 加点仕様(上級)
(1) 検索結果一覧は一部のフィールドを用いた簡易表示として、検索結果の一つを選んでクリッ
クすると、詳細表示画面を出し、すべてのフィールドを表示すること。
(2) 検索結果は1行につき1データとし、20件ごとに表示すること。20件を超えたら次ページに
表示すること。
Gradle Plugin を 0.11.+ にアップデートしたらやること

AndroidStudio を 0.6.0 にすると、Gradle Plugin もアップデートするよう促されます。
この時、Robolectric を使ったテストをセットアップしていると、`gradle-android-test-plugin` が Gradle Plugin のアップデートの影響を受けて正しく動かなくなります。

アップデートの配信直後、`gradle-android-test-plugin`に対策が施され、Maven Central に無事リリースされていますので、現在は `gradle-android-test-plugin` の最新版を利用すれば問題なく Robolectric が使用できます。

## Maven の依存管理に対する変更

[GitHub のプロジェクト](https://github.com/robolectric/robolectric-gradle-plugin)では、今回のリリースに合わせてプロジェクト名そのものも変更されています。

これにあわせて、Maven にデプロイするときに使用する Group ID と Artifact ID も[変更されて](https://github.com/robolectric/robolectric-gradle-plugin/commit/4919a3c2f72d82c8ef696c4b036499481b60c458)います。

よって、以下のように記述します。

```groovy
buildscript {
    dependencies {
        classpath 'org.robolectric:robolectric-gradle-plugin:0.11.+'
    }
}
```

## プラグイン名の変更

これまで、`android-test`という名前でプラグインを適用していましたが、`robolectric`となります。

```groovy
apply plugin: 'robolectric'
```

ここで、以下の様なスクリプトを組んでいると、`androidTest()`が見つからないという旨の例外でビルドが失敗します。

```groovy
androidTest {
    include '**/*Test.class'
    // ...
}
```

これは以下のように修正します。

```groovy
robolectric {
    include '**/*Test.class'
    // ...
}
```

## おまけ

AndroidManifest に [Google Analytics](https://developer.android.com/reference/com/google/android/gms/analytics/GoogleAnalytics.html) のための `metadata`を埋め込んでいると、Robolectric のテストランナーがクラッシュします。

理由は、`metadata`に`value`属性が設定されていることを前提としているためです。今のところ、空の`value`属性を付与することで回避できます。
ViewとViewControllerの繋ぎ方


以下の記事でViewControllerからViewを切り離すことについて書きましたが、具体的にViewとViewControllerを繋ぐ方法についての補足です。
[IB/Storyboard使わない派のlayoutSubviewsによるレイアウト調整](http://qiita.com/yuch_i/items/b4612fae110254c816f4)


## Viewのパブリックプロパティを使う方法

まずは切り離したViewのうち、ViewControllerでアクセスするサブビューをパブリックプロパティにする方法です。
移行コストが少ないので面倒臭い時はまずこの方法を使い、余裕がある時に後のことを考えて後述のデリゲートを使う方法に書き変えるといいかもしれません。

###ポイント

- 画面パーツはViewに配置する
- ViewControllerからアクセスする必要があるパーツはパブリックプロパティにする
- ViewControllerでViewを生成した後、パブリックプロパティ経由でイベントハンドラ登録等を行う


```View.h
@interface HogeView : UIView
// パブリックプロパティ
@property(nonatomic, strong) UIButton okButton;
@property(nonatomic, strong) UIButton cancelButton;
@end
```

```ViewController.m
@interface HogeViewController ()
@property(nonatomic, strong) HogeView *hogeView;
@end

@implementation HogeViewController

-(void) loadView {
	// View生成
	self.hogeView = [[HogeView alloc] init];
	self.view = self.hogeView;

	// 繋ぎ部分
	// ViewControllerからイベントハンドラ登録
	[self.hogeView.okButton addTarget:self action:@selector(onOkTapped) forControlEvents: UIControlEventTouchUpInside];
	[self.hogeView.cancelButton addTarget:self action:@selector(onCancelTapped) forControlEvents: UIControlEventTouchUpInside];
}

// イベントハンドラ
-(void) onOkTapped {
	...
}
-(void) onCancelTapped {
	...
}

@end
```

## デリゲートを定義する方法

より変更に強い設計にするにはView専用のデリゲートを定義し、ViewとViewControllerをデリゲート経由で繋ぐ方法です。

###ポイント

- View専用のデリゲートViewDelegateを定義する
- ViewではViewDelegateのみパブリックプロパティにする
- ViewDelegateのセッタ内でイベントハンドラ登録等を行う
- ViewControllerはViewDelegateを実装する
- ViewControllerでViewを生成した後、ViewのViewDelegateを設定する

```View.h
// 専用デリゲート
@protocol HogeViewDelegate
-(void) onOkTapped;
-(void) onCancelTapped;
@end

@interface HogeView : UIView
// デリゲートのみパブリックにする
@property(nonatomic, weak) id<HogeViewDelegate> delegate;
@end
```

```View.m
@interface HogeView
// サブビューはプライベートにする
@property(nonatomic, strong) UIButton okButton;
@property(nonatomic, strong) UIButton cancelButton;
@end

@implementation HogeView

// デリゲートのセッタ
-(void) setDelegate:(id<HogeViewDelegate>)delegate {
	_delegate = delegate;

	// デリゲート経由でイベントハンドラ登録
	[self.okButton addTarget:delegate action:@selector(onOkTapped) forControlEvents: UIControlEventTouchUpInside];
	[self.cancelButton addTarget:delegate action:@selector(onCancelTapped) forControlEvents: UIControlEventTouchUpInside]
}

@end
```

```ViewController.m
// デリゲートを実装
@interface HogeViewController () <HogeViewDelegate>
@property(nonatomic, strong) HogeView *hogeView;
@end

@implementation HogeViewController

-(void) loadView {
	// View生成
	self.hogeView = [[HogeView alloc] init];
	self.view = self.hogeView;

	// 繋ぎ部分
	self.hogeView.delegate = self;
}

// イベントハンドラ
-(void) onOkTapped {
	...
}
-(void) onCancelTapped {
	...
}

@end
```
Goでipcalcを書いた

Go歴1日で突撃した #gocon でGo欲を触発され、とにかく何でもいいからGoで書きたくなり、Go版ipcalcを書いてみた


## 概要
* https://github.com/goldeneggg/ipcl
* CIDR形式(例:192.168.1.0/24)の文字列から、取り得るホスト数やIPアドレスのレンジ等を算出・出力する
* 現状公開されてる計算ツールだと「CIDRを一覧で記載したファイルを入力して一括parse」が可能なものが見当たらなかったので対応した


## Go本体のテストコードに助けられた
* 今回Goを書いてみて最初に浮かぶ感想はこれ。「この処理って標準パッケージ使ってどう書けばいいんだろ？」と迷った時、公式ドキュメントももちろんだが __Go本体のテストコードを読むのが良い__ 。テストの書き方も学べて一石二鳥（Goに限った話じゃ無いかもしれないけど他言語のテストコード読んだこと無いので比較は出来ない。さーせん ）
    * Goにはアサーションが無いので、テストの成否は「テスト対象関数/メソッドの戻り値 __の内の1つ__ であるerrorオブジェクト 」で判定するスタイル。当然本体のテストコードも然り
        * [アサート(assert)がない理由は? - golang.jp](http://golang.jp/go_faq#assertions)
        * [テスト用のヘルパー関数がみあたりません - golang.jp](http://golang.jp/go_faq#testing_framework)
    * そしてこの本体テストコードの「エラーハンドリング→エラー有無での後続処理の切り替え」あたりの書き方が自実装コードに適用出来る場面が割りとあった
        * 今回の用途で言えばnetパッケージの `ip_test.go` のコードにだいぶ助けられた
* Goのソースコード（テストコードも含む）は、 [Mercurialでローカルに落とす](http://golang.org/doc/install/source)、もしくは[ここでオンラインで読める](http://golang.org/src/pkg/) 。
    * `hoge.go`のテストは`hoge_test.go`という名前にするのがGo流


## 備忘

### net パッケージ
* 今回一番お世話になったGo標準パッケージで、TCP/IP, UDP, ソケット、ネットワークI/Oに関連する機能は一通り網羅されている

#### IP型
* `IP`型は、ひとつのIPアドレスを表す型で、実体は`[]byte`型、16byteのバイト配列
* CIDRのパースは `func ParseCIDR(s string) (IP, *IPNet, error)`を使えば一発でやってくれる
    * 戻り値の`IP`がネットワークアドレスになっている
* `func IPv4(a, b, c, d byte) IP`は、IPアドレスの各オクテットの値をbyteで渡してIP型で返す関数。
    * 戻り値のIPは4byteではなく16byteで返ってくるが、これは公式ドキュメントを読む限りIPv6もフォローする為に汎用性を持たせたものと思われる
    * 例えば`172.168.1.0`のIP型表現は内部的に`[]byte`型でこうなってる → `[0][0][0][0][0][0][0][0][0][0][0][0][172][168][1][0]`
    * 4byteで欲しい場合は、 `func (ip IP) To4() IP` メソッドで変換する

#### IPNet型
* 「CIDRで表現されるIPネットワークそのもの」を表すオブジェクト
    * 実体は「ネットワークアドレスを表現する`IP`型」「ネットマスクを表す`IPMask型」の2つのフィールドを持つstructになっている
* `func (n *IPNet) Contains(ip IP) bool`で、指定したIP（IPアドレス）がそのネットワーク範囲内のものか？を判定する事が出来る

#### IPMask型
* ネットマスクを表す型で、同じく実体は`[]byte`型
* プレフィックス長からIPMask型のオブジェクトを取得したい場合は`func CIDRMask(ones, bits int) IPMask`を使う。`bits`にはIPv4なら32を指定

### for文
* 初期値や事後処理で複数パラメータを取るfor文は `for i, f, t := 0, 0, 8; i < 4; i, f, t = i+1, f+8, t+8 { ... }` って具合に、変数宣言時同様に代入演算子は1つに集約して書く

### 数値を2進, 16進で表記したい
* `fmt.Sprintf()`を使う
* `%b` 2進, 前ゼロ埋め8桁で表記したければ`%08b`する
    * `fmt.Sprintf("%08b", 3) // = "00000011"`
* `%x` 16進, 前ゼロ埋め2桁で表記したければ`%02x`とする 
    * `fmt.Sprintf("%02x", 15) // = "0f"`
GCCやClangは再帰下降型のパーサを使用している

タイトルの通り。
dartコンパイラもソースを見る限り再帰下降型のようである。
yaccなどのパーサ生成ツールを用いていないのは意外だった。
保守のしやすさ,エラーからの復帰などの点からパーサを手書きしているようだ。
詳しくは参考リンクの一つめに書かれてある。


#参考

* [c - Are GCC and Clang parsers really handwritten? - Stack Overflow](http://stackoverflow.com/questions/6319086/are-gcc-and-clang-parsers-really-handwritten)

* [New_C_Parser - GCC Wiki](https://gcc.gnu.org/wiki/New_C_Parser)

* [Clang - Features and Goals](http://clang.llvm.org/features.html)

* [Dartのparserのソース](https://github.com/dart-lang/bleeding_edge/blob/master/dart/runtime/vm/parser.cc)
node.jsでWindowsのパスにする

# 背景

Atom Shellでshell#showItemInFolderを使おうとしたら、__dirnameで得られるc:/work/pathの形式だと、エクスプローラーが開かず。どうやら、c:\work\pathな形式でないと動かないことが分かった。

# c:/work/pathな形式をc:\work\pathにする方法

Node.js標準のpathモジュールで出来た。

```
var path=require('path');

var filePath = "c:/work/path";
console.log(path.resolve(filePath));
```

# 関連記事

- [Atom Shellでデスクトップキャプチャー（動画）アプリ](http://kjunichi.cocolog-nifty.com/misc/2014/05/atom-shell-c5d0.html)
- [node.jsで大きな数を扱う](http://kjunichi.cocolog-nifty.com/misc/2014/05/nodejs-083e.html)
- [Node.jsでパイプを使う外部コマンドを実行するには](http://kjunichi.cocolog-nifty.com/misc/2014/03/nodejs-707a.html)
よく使うワードプレス関数、ハマる落とし穴


# よく使うワードプレス関数

### （今いるページの）記事IDを取得
```php
<?php $post->ID; ?>
```
`<?php get_the_ID(); ?>`でも一緒！

### （今いるページの）urlを取得

```php
<?php the_permalink(); ?>
```

### 記事カテゴリIDを取得
```php
<?php get_the_category( 記事ID ); ?>
```
引数`記事ID`は省略可能。省略したら、現在のカテゴリ。

### 記事タイトル取得
今いるページの記事タイトル取得

```php
<?php the_title(); ?>
```

wp_postsテーブルのpost_titleを取得

```php
<?php get_the_title( 記事ID ); ?>
```

### サムネイル画像のurl（パス）取得
```php
<?php wp_get_attachment_url(get_post_thumbnail_id( 記事ID )); ?>
```

- thumnail_idと記事IDは別物なので注意！
- get_post_thumbnail_idは、引数[記事ID]からthumnail_idを取得
- wp_get_attachment_urlは、引数[thumnail_id]からサムネイル画像のurl（パス）取得
- この方法なら元画像のurlを取得できる。

以下の方法でも画像のurlを取得できる。
↓↓（画像サイズは150☓150）

```php
<?php 
$thumb = get_the_post_thumbnail($post->ID,'thumbnail');
$pattern= "/(?<=src=['|\"])[^'|\"]*?(?=['|\"])/i";
preg_match($pattern, $thumb, $thePath);
echo "$thePath[0]";
?>
```
### TOP画面か否かを調べる
```php
<?php is_front_page(); ?>
```
top画面（記事一覧画面）ならtrue、それ以外ならfalse

### DBアクセス（例）
```php
<?php $wpdb->get_results('SELECT * FROM table_name', ARRAY_A); ?>
<?php $wpdb->get_var( 'query', column_offset, row_offset ); ?>
など
```

- sql文は各自読み替えること。
- アクセスするDBの設定は、`wp-config.php`に書いておく。
- `get_var`などのメソッドも適宜読み替えること。
 - get_var('クエリ文', 列番号, 行番号)：戻り値1つ
 - prepare()：
 - get_raw('クエリ文', output_type, row_offset)：output_typeは、以下の3通り。
     - `OBJECT`、`ARRAY_A`（連想配列）、`ARRAY_N`（インデックス配列）
 - get_col()
 - get_results('クエリ文', output_type)

### DBから記事urlのリストを取得するためのsql文
```mysql
select ID, post_title, post_date from wp-posts where post_status = 'publish' and post_type = 'post';
```
- 「記事ID」と「記事タイトル」と「投稿日時」を取得
- `post_status = 'publish'`これ付けないと「自動下書き」も含まれてしまう
- `post_type = 'post'`これ付けないと「footer」などの記事以外のリンクも含まれてしまう

# ハマる落とし穴

### functions.phpをいじるときは細心の注意を！
構文エラーが生じたら管理画面すら真っ白になる。
管理画面を使わずに直にfunctions.phpをいじらなくてはいけなくなるので、functions.phpをいじる前には細心の注意を！

### RSSのurlたたくとエラーになる問題
原因のほとんどは、xmlファイルの一番最初に空白行が含まれてしまっていること。
解決策は、

- header.phpの最初に空白行があれば、削除
- wp-includes/feed-rss2.php、wp-includes/feed-rss2-comments.phpの2ファイルの行頭に`ob_end_clean();`を記入
- 各ファイル最後の`<?php ?>`の`?>`を省略すべし
- wp-rss2.phpやwp-atom.phpに関して、`<?php ?>`の外に改行がないことをチェック
- wp-config.phpに関して、`<?php ?>`の外に改行がないことをチェック
- functions.phpに関して、`<?php ?>`の外に改行がないことをチェック
- plugin無効化

上記、上から順に対応していけばだいたいOK。
ブラウザキャッシュが残っていると変更が更新されない事が多いので、変更後は【ブラウザキャッシュの削除】を忘れずに！！！！！
（「ブラウザのキャッシュ」と「閲覧履歴」は別物なので注意！）

### stg環境での「予約投稿失敗」対処法
ここでは、
「stg環境（basic認証あり）では予約投稿失敗し、本番環境（basic認証なし）ではうまくいく」
場合の対処法を記す。

WordPressの予約投稿の手順は、

- サイトに誰かがアクセス
- 予約投稿を時間過ぎた投稿がないかチェック
- あればHTTP-CRONを使用して投稿実行

投稿実行のリクエストは、stgで用いているサーバー自身。
つまり、自サーバーからのリクエストをbasic認証なしでアクセス可能な設定にすればOK！

施す対処は以下の1行をWordPressフォルダ直下の`.htaccess`に追記するのみ。

```
allow from 127.0.0.1
```
クリック時、非同期でHTTPリクエストを投げる方法


# 概要（すぐ動くもの作りたい人はすっ飛ばしていいです）
使うものは、

- JavaScript
- Ajax
- jQuery

他のやり方もたくさんありそうだけど、学習コスト最小限で実装できそうなやり方を選んだ。
jQuery使わなくても、

- XMLHTTP
- XMLHttpRequest

とかいうオブジェクトを使えばできるが、ブラウザ依存らしいのでjQueryを使うことにした。

# 実装すること

## 1.まず、jQuery使うための準備

```html
<script src="http://code.jquery.com/jquery.js"></script>
```

jQuery使う準備にはやり方が2通りある。

- url叩いて持ってくる
- ファイルをダウンロードしてきてそれを読み込む

上記ソースコードは前者。

## 2.クリックイベント発生時、非同期でHTTPリクエストを投げる

```html
<script>
$('.[クラス名]').click(function() {
  $.ajax({
    type: "GET",
    url: "[URL名]",
    async: true //trueなら非同期処理。falseなら同期処理。
  });
});
</script>
```

- `[クラス名]`に対応する要素をクリックしたら、`function() {}`の中身が実行される
- クラス名だから`.`。ID名なら`#`（cssと一緒）
- $関数の機能は4つ（引数による）
 - 文字列（cssセレクタ）：マッチする要素をjQueryオブジェクトとして返す
 - 文字列（html）：書いたhtmlタグの要素として構築して、jQueryオブジェクトでラップして返す
 - Elementオブジェクト：渡したElementオブジェクトをjQueryオブジェクトでラップして返す
 - 関数オブジェクト：DOM構築後、自動で実行（onload的な）