2013年2月12日火曜日

Cloud9凄すぎ

Heroku上で、Node.js + MongoDBのアプリケーションを作成している。
クライアントに開発環境を用意してというのが、今までの常道だと思うが、開発自体もクラウド上でやってしまおうというのが、Cloud9
いままではShiftEditを使用していたが、Cloud9は単なるソースエディタの領域だけではなく、ソースを実行してデバッグしたり、SSHで、コマンドを実行したりできる。
Gitでバージョン管理やHerokuへのデプロイ作業など、すべてCloud9上でできてしまう。
クラウドなので、自宅PCはもちろんのこと、タブレットでも(効率を考えなければ)できる。
今までは、開発環境を構築するために、IDEをインストールし、GitやNode.js、NPMをインストールしてから、各種モジュールをインストールしなければならなかった。開発者のそれぞれの環境で、この環境構築作業をする必要があった。
 だけど、Cloud9を使用すると、 IDEのインストールは不要だし、GitやNode.js、NPMのインストールもすでにされている。
今はFree版で使用しているが、本格的に使い込む場合には、月額12ドルで使用出来るPremium版を使用しよう。

2013年2月8日金曜日

Tomcatで大量のパラメータを送信すると警告: More than the maximum number of request parameters (GET plus POST) for a single request ([10,000]) were detected. と警告される

現象

Tomcat 7.0.32を使用していて、大量のパラメータがある画面をPOSTすると、サーブレットに渡ってこないパラメータがある。

原因

エラーが発生した画面ではパラメータの数がTomcatのConnectorの属性maxParameterCountのデフォルト値である10,000を超えていたため。

対応

TomcatのConnectorの属性maxParameterCountに適切な値を設定する。

背景

Weblogic環境で問題なく動作しているシステムの開発環境として、Tomcat7を使用している。
大量のパラメータをPOSTすると、サーブレットに後半の値が渡ってきていないために、java.lang.ArrayIndexOutOfBoundsExceptionが発生してしまっていた。
調査の過程で、Tomcatは、POSTサイズはデフォルトで2MBであることがわかったが、今回POSTサイズは300KB程度である。
しかも、2MBを超えたPOSTを送ると、java.lang.IllegalStateException: Post too largeというエラーが返ってくるそうだ。
ログを再度確認してみると、
警告: More than the maximum number of request parameters (GET plus POST) for a single request ([10,000]) were detected. Any parameters beyond this limit have been ignored. To change this limit, set the maxParameterCount attribute on the Connector.
と出ていた。
気づいていたのだが、読み飛ばしていた。
hashdos攻撃に対応するために、この値は必要最小限にすることが肝要であることが、Tomcatでのhashdos攻撃対策に書かれているが、とにかくパラメータが多いのでしょうがない。

2013年2月6日水曜日

git push heroku master express --path herokuとしたが

https://github.com/visionmedia/express/pull/1483 の情報を見て、express に --pass heroku オプションを付けてアプリケーションを生成してgitにpushしてみたが、やはり同じだった。

$ git push heroku master
Counting objects: 15, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (15/15), 1.76 KiB, done.
Total 15 (delta 1), reused 0 (delta 0)
-----> Node.js app detected
-----> Resolving engine versions

       WARNING: No version of Node.js specified in package.json, see:
       https://devcenter.heroku.com/articles/nodejs-versions

       WARNING: The default version of Node.js and npm on Heroku will begin
       tracking the latest stable release starting September 1, 2012.

       Using Node.js version: 0.4.7
       Using npm version: 1.0.106
-----> Fetching Node.js binaries
-----> Vendoring node into slug
-----> Installing dependencies with npm
       npm ERR! error installing express@3.1.0 Error: Unsupported
       npm ERR! error installing express@3.1.0     at checkEngine (/tmp/node-npm-hzLj/lib/install.js:493:14)
       npm ERR! error installing express@3.1.0     at Array.0 (/tmp/node-npm-hzLj/node_modules/slide/lib/bind-actor.js:15:8)
       npm ERR! error installing express@3.1.0     at LOOP (/tmp/node-npm-hzLj/node_modules/slide/lib/chain.js:15:13)
       npm ERR! error installing express@3.1.0     at chain (/tmp/node-npm-hzLj/node_modules/slide/lib/chain.js:20:4)
       npm ERR! error installing express@3.1.0     at installOne_ (/tmp/node-npm-hzLj/lib/install.js:470:3)
       npm ERR! error installing express@3.1.0     at installOne (/tmp/node-npm-hzLj/lib/install.js:411:3)
       npm ERR! error installing express@3.1.0     at /tmp/node-npm-hzLj/lib/install.js:347:9
       npm ERR! error installing express@3.1.0     at /tmp/node-npm-hzLj/node_modules/slide/lib/async-map.js:54:35
       npm ERR! error installing express@3.1.0     at Array.forEach (native)
       npm ERR! error installing express@3.1.0     at /tmp/node-npm-hzLj/node_modules/slide/lib/async-map.js:54:11
       npm ERR! error rolling back express@3.1.0 Error: ENOTEMPTY, Directory not empty '/tmp/build/node_modules/express'
       npm ERR! Unsupported
       npm ERR! Not compatible with your version of node/npm: connect@2.7.2
       npm ERR! Required: {"node":">= 0.5.0"}
       npm ERR! Actual:   {"npm":"1.0.106","node":"0.4.7"}
       npm ERR!
       npm ERR! System Linux 2.6.32-350-ec2
       npm ERR! command "/tmp/node-node-VLKq/bin/node" "/tmp/node-npm-hzLj/cli.js" "install" "--production"
       npm ERR! cwd /tmp/build
       npm ERR! node -v v0.4.7
       npm ERR! npm -v 1.0.106
       npm ERR! code ENOTSUP
       npm ERR!
       npm ERR! Additional logging details can be found in:
       npm ERR!     /tmp/build/npm-debug.log
       npm not ok
 !     Failed to install --production dependencies with npm
 !     Heroku push rejected, failed to compile Node.js app

To git@heroku.com:application.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@heroku.com:application.git'

2013年2月5日火曜日

git push heroku masterでプッシュできず

http://d.hatena.ne.jp/sasaplus1/20120503/1335980529 では、Herokuで使用できるnode.jsとnpmのバージョンのURLがある。
npmは http://heroku-buildpack-nodejs.s3.amazonaws.com/manifest.npm で、node.jsは  http://heroku-buildpack-nodejs.s3.amazonaws.com/manifest.nodejs 。
最新かどうかわからないが、npmは1.1.65、node.jsは0.8.14が最新。
package.jsonには、npmは1.2.2、node.jsは0.8.18を指定しているのがいけないのかな。
直してからgit push heroku masterしてみよう。

HerokuのGitにプッシュでNode 0.4.7が使用される

https://devcenter.heroku.com/articles/nodejsに書いてあるとおり、enginesにnodeとnpmを指定してgit push heroku masterすると、
{
  "name": "app",
  "version": "0.0.1",
  "dependencies": {
    "express": "3.1.0",
    "ejs": "*",
    "less-middleware": "*"
  },
  "engines": {
    "node": "0.8.x",
    "npm": "1.2.x"
  }
}

       WARNING: No version of Node.js specified in package.json, see:
       https://devcenter.heroku.com/articles/nodejs-versions

       WARNING: The default version of Node.js and npm on Heroku will begin
       tracking the latest stable release starting September 1, 2012.

       Using Node.js version: 0.4.7
       Using npm version: 1.0.106
と表示されてしまう。

2012年8月8日水曜日

Proxy経由でSeleniumを実行する

社内のクライアントから社内のサーバーのテストをしているので、サーバー自体はProxy経由ではないのだが、Webアプリ側でYUI3のCSSやjQueryをYahooやjQueryのサイトのソースコードを直接参照している。
Proxy経由の設定をしていなかったため、Seleniumによる統合テストにおいて、yui.yahooapis.comへアクセスできなかった。
java -Dhttp.proxyHost=proxyhost -Dhttp.proxyPort=8888 -jar selenium-server.jar
とすればよい。
EclipseでJUnit4を使用して統合テストを自動化しているため、プロジェクトのPropertiesからRun/Debug settingsで該当するJUnit4のクラス(FooTest)を選び、Editボタンをクリックする。
ArgumentsタブのVM arguments欄に-Dhttp.proxyHost=proxyhost -Dhttp.proxyPort=8888を記述する。
単体テストクラスごとにこの設定をしないといけなさそうなので、手間。

2012年7月11日水曜日

MeteorのHandlebarsで2項比較を試す



Meteorで使用しているHTMLテンプレートエンジンのHandlebars.jsのブロック要素はifを始め、4つ程度しかない。
Helperを登録することにより、独自に追加することができそうなので、2つの数値の大小関係で処理内容を変えようと思い以下のことをした。
foo.html
<head>
<title>原価管理システム</title>
</head>
<body>
{{>mainContent}}
</body>

<template name="mainContent">
{{#ifCond 10 3}} big {{else}} small {{/ifCond}}
</template>

foo.js
if(Meteor.is_client){
Handlebars.registerHelper("ifCond", function(m, n, block){
if(m > n) {
return block();
} else {
return block.inverse();
}
});
}

if(Meteor.is_server){
Meteor.startup(function(){
});
}

bigが表示される。

{{#ifCond 10 3}} big {{else}} small {{/ifCond}}を
{{#ifCond hoge 3}} big {{else}} small {{/ifCond}}に変えて、
if(Meteor.is_client){ の下に
Template.mainContent.hoge = function(){
return 8;
}
を挿入すると、ifCondの3つの引数のmには8が渡ってきているが、nには本来blockに渡って来るべき関数が渡ってきて、blockは未定義となっている。

今度は{{#ifCond hoge}}で、hogeに式を渡すようにする(m > nなど)。