Backbone.jsのモデルクラス③

今回はhas関数です。
has関数は、Model内に引数に渡した変数名の値があるかどうかを判定し、true/falseを返却します。
変数が定義されていて、値が設定されていればtrue、
変数が定義されていない、定義されているがnull、定義されているがundefinedの場合はfalseを返却するようです。

以下にソースコードを示します。

<html>
<head>
<script type="text/javascript" src="../js/jquery-1.10.1.js"></script>
<script type="text/javascript" src="../js/underscore.js"></script>
<script type="text/javascript" src="../js/backbone.js"></script>
<script type="text/javascript">
var Player = Backbone.Model.extend({
	defaults : {
		"tel" : "0120123123"
	}
});

$(document).ready(function() {
	player = new Player({
		name : "田中一郎",
		rank : null,
		birthdate : undefined,
		address : ""
	});
	
	$("#contents").html(
			"player has name : " + player.has("name") + 
			"<br/>" +
			"player has no : " + player.has("no") +
			"<br/>" +
			"player has rank : " + player.has("rank") +
			"<br/>" +
			"player has birthdate : " + player.has("birthdate") +
			"<br/>" +
			"player has mail : " + player.has("mail") +
			"<br/>" +
			"player has tel : " + player.has("tel") +
			"<br/>" +
			"player has address : " + player.has("address")
			);
});
</script>
</head>
<body>
<div id="contents">
</div>
</body>
</html>

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

player has name : true
player has no : false
player has rank : false
player has birthdate : false
player has mail : false
player has tel : true
player has address : true

Backbone.jsのModelクラス②

前回の記事に引き続き、今回もModelクラスです。

今回はescape関数です。
前回使ったget関数とほぼ同じですが、HTMLタグをエスケープしてくれます。

まずはソースコードから。

<html>
<head>
<script type="text/javascript" src="../js/jquery-1.10.1.js"></script>
<script type="text/javascript" src="../js/underscore.js"></script>
<script type="text/javascript" src="../js/backbone.js"></script>
<script type="text/javascript">
var Player = Backbone.Model.extend({
});

$(document).ready(function() {
	player = new Player({
		name : "<b>田中一郎</b>"
	});
	
	$("#contents").html(player.get("name"));           // -①
	$("#contents2").html(player.escape("name"));   // -②
});
</script>
</head>
<body>
<div id="contents">
</div>
<div id="contents2">
</div>
</body>
</html>

順番に説明していきます。

①get使用時

今回は対象文字列が「田中一郎」をタグで囲んだ文字列です。
ブラウザで表示するとタグがそのまま適用され、「田中一郎」が太字になって表示されます。

②escape使用時

一方でescape関数はHTMLタグに対してエスケープを行います。
ブラウザで表示すると、タグはエスケープされて、「田中一郎」と表示されます。

Backbone.jsのModelクラス①

Backbone.jsの学習を始めてみました。
Backbone.jsって何?
っていう人のために。

自分もよくわかっていませんが、何かと乱雑になってしまうJavaScriptのコードにMVCの考え方を持ち込んで
ソースコードをスッキリと機能的に記述できるようにしたフレームワークだそうです。

フレームワークと言っても特に大きな制約があるわけでもなく、
jQuery、underscore.jsに依存するため、これらを事前にインポートしておく必要がある程度です。

今日は最初の記事ということで、Modelクラスについて書いていきたいと思います。
Modelはデータの定義やロジック部分となる手続きをまとめたクラスになります。

まずはソースコードから。

<html>
<head>
<script type="text/javascript" src="../js/jquery-1.10.1.js"></script>
<script type="text/javascript" src="../js/underscore.js"></script>
<script type="text/javascript" src="../js/backbone.js"></script>
<script type="text/javascript">
var Player = Backbone.Model.extend({ // -①
});

$(document).ready(function() {
	player = new Player({ // -②
		name : "田中一郎"
	});
	
	$("#contents").text(player.get("name")); // -③
});
</script>
</head>
<body>
<div id="contents">
</div>
</body>
</html>

順番に説明していきます。

①Modelクラスの定義

Playerというクラスを作ってみました。
「Backbone.Model.extend」の部分は固定です。

②Playerクラスの生成

生成には通常のJavaScriptと同じようにnewを用います。
コンストラクタとして、メンバ変数nameに「田中一郎」を設定しています。

③Playerクラスの内容の取得

②で生成したPlayerクラスの変数に対して、getメソッドを用い、メンバ変数の照会をしています。
get("メンバ")とすることでModelクラスのメンバを取得することができます。
逆にset("メンバ", "設定値")とすることで、Modelクラスのメンバに値を設定することができます。

上記のコードの結果は、画面ロード後に「田中一郎」と表示されます。

JBossAS7をApache2.2とmod_proxyでAJP連携

タイトルの通りです。
環境は以下の通り。

■JBossAS7
■Apache2.2

いずれもインストールは完了済みとします。

Apacheの設定

httpd.confを編集します。

まずは以下の設定のコメントアウトを外しましょう。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

自分のは元々コメント外れてましたが、確認してみてください。

以下の設定を追記します。

include conf/extra/httpd-proxy.conf

設定ファイルの末尾で構いません。

次にconfフォルダにextraフォルダを作成し、その下に、httpd-proxy.confファイルを作成します。
作成したファイルに以下を記述します。

<Location /test/>
    ProxyPass ajp://localhost:8009/test
</Location>

この設定で、http:///testとするとJBossの/testと連携することができます。
/test部分は任意の設定に書き換えてください。

JBossの設定

standalone.xmlを編集します。
configurationフォルダにあります。

      <subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false">
            <connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
            <connector name="ajp" protocol="AJP/1.3" scheme="http" socket-binding="ajp"/>−①
            <virtual-server name="default-host" enable-welcome-root="true">
                <alias name="localhost"/>
                <alias name="example.com"/>
            </virtual-server>
        </subsystem>
<||

①の部分を1行追加します。

これで設定は完了です。

JBoss Forgeインストール

JBossForgeとは、

コマンドラインからJavaEEアプリケーションを生成することができる次世代のシェル

と書いてありました。

引用元:http://forge.jboss.org/

それってMavenとどう違うんでしょうか。

とりあえずインストール。
どうせだからソースコードからMavenを使ってビルドしてみることに。
OSはWindows8を使ってます。

必要なものは以下の通り。

  • JDK(1.4以上と書いてあったけど、1.5以上かな)
  • Maven3
  • Git

上記のものはインストール完了が前提。


まずはGitでソースコードを取得します。

git://github.com/forge/core.git

続いてMavenでビルドしてみる。

D:\jboss\workspace\core>mvn install
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] Forge - Parent
[INFO] Forge - Targeted Event Bus
[INFO] Forge - Parser/Java API
[INFO] Forge - Parser/XML
[INFO] Forge - Shell API
[INFO] Forge - Maven Integration APIs
[INFO] Forge - Git Integration
[INFO] Forge - Test Harness
[INFO] Forge - Maven Project Model
[INFO] Forge - Parser/Java
[INFO] Forge - Shell
[INFO] Forge - Git Integration Tests
[INFO] Forge - Project Model Maven Tests
[INFO] Forge - Test Harness (Web)
[INFO] Forge - Java EE APIs
[INFO] Forge - Java EE Integration Impl & Plugins
[INFO] Forge - Scaffolding APIs
[INFO] Forge - Scaffolding Plugins
[INFO] Forge - Dev Plugins
[INFO] Forge - Scaffold Provider for Java Server Faces
[INFO] Forge - Modular Plugin Loader
[INFO] Forge - Tracking
[INFO] JBoss Forge - Distribution Build
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Forge - Parent 1.2.1.Final
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-enforcer-plugin:1.1.1:enforce (enforce-java-version) @ forge-pa
rent ---
[INFO]
[INFO] --- maven-enforcer-plugin:1.1.1:enforce (enforce-maven-version) @ forge-p
arent ---
[WARNING] Rule 1: org.apache.maven.plugins.enforcer.RequireJavaVersion failed wi
th message:
Detected JDK Version: 1.7.0-13 is not in the allowed range [1.6.0-30,1.7).
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Forge - Parent .................................... FAILURE [2.262s]
[INFO] Forge - Targeted Event Bus ........................ SKIPPED
[INFO] Forge - Parser/Java API ........................... SKIPPED
[INFO] Forge - Parser/XML ................................ SKIPPED
[INFO] Forge - Shell API ................................. SKIPPED
[INFO] Forge - Maven Integration APIs .................... SKIPPED
[INFO] Forge - Git Integration ........................... SKIPPED
[INFO] Forge - Test Harness .............................. SKIPPED
[INFO] Forge - Maven Project Model ....................... SKIPPED
[INFO] Forge - Parser/Java ............................... SKIPPED
[INFO] Forge - Shell ..................................... SKIPPED
[INFO] Forge - Git Integration Tests ..................... SKIPPED
[INFO] Forge - Project Model Maven Tests ................. SKIPPED
[INFO] Forge - Test Harness (Web) ........................ SKIPPED
[INFO] Forge - Java EE APIs .............................. SKIPPED
[INFO] Forge - Java EE Integration Impl & Plugins ........ SKIPPED
[INFO] Forge - Scaffolding APIs .......................... SKIPPED
[INFO] Forge - Scaffolding Plugins ....................... SKIPPED
[INFO] Forge - Dev Plugins ............................... SKIPPED
[INFO] Forge - Scaffold Provider for Java Server Faces ... SKIPPED
[INFO] Forge - Modular Plugin Loader ..................... SKIPPED
[INFO] Forge - Tracking .................................. SKIPPED
[INFO] JBoss Forge - Distribution Build .................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.955s
[INFO] Finished at: Tue Feb 26 02:04:38 JST 2013
[INFO] Final Memory: 12M/110M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:1.
1.1:enforce (enforce-maven-version) on project forge-parent: Some Enforcer rules
have failed. Look above for specific messages explaining why the rule failed. -
> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e swit
ch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please rea
d the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionE
xception

エラーが出ました。
JDKが1.7だったのがいけなかったらしい。

ちなみに、JAVA_HOMEにJREを指定している場合もエラーになります。
JDKを指定してください。

JAVA_HOMEに1.6を設定して再トライするもやっぱりBUILD FAILUREになった。
テストでエラーになっているようだったので、テストをスキップしてインストールしました。

mvn -Dmaven.test.skip=true install

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Forge - Parent .................................... SUCCESS [1.623s]
[INFO] Forge - Targeted Event Bus ........................ SUCCESS [1.095s]
[INFO] Forge - Parser/Java API ........................... SUCCESS [0.188s]
[INFO] Forge - Parser/XML ................................ SUCCESS [0.112s]
[INFO] Forge - Shell API ................................. SUCCESS [0.422s]
[INFO] Forge - Maven Integration APIs .................... SUCCESS [0.265s]
[INFO] Forge - Git Integration ........................... SUCCESS [0.103s]
[INFO] Forge - Test Harness .............................. SUCCESS [0.130s]
[INFO] Forge - Maven Project Model ....................... SUCCESS [0.190s]
[INFO] Forge - Parser/Java ............................... SUCCESS [0.203s]
[INFO] Forge - Shell ..................................... SUCCESS [1.011s]
[INFO] Forge - Git Integration Tests ..................... SUCCESS [0.309s]
[INFO] Forge - Project Model Maven Tests ................. SUCCESS [0.232s]
[INFO] Forge - Test Harness (Web) ........................ SUCCESS [29.675s]
[INFO] Forge - Java EE APIs .............................. SUCCESS [1.115s]
[INFO] Forge - Java EE Integration Impl & Plugins ........ SUCCESS [7.156s]
[INFO] Forge - Scaffolding APIs .......................... SUCCESS [0.768s]
[INFO] Forge - Scaffolding Plugins ....................... SUCCESS [1.067s]
[INFO] Forge - Dev Plugins ............................... SUCCESS [2.471s]
[INFO] Forge - Scaffold Provider for Java Server Faces ... SUCCESS [6.968s]
[INFO] Forge - Modular Plugin Loader ..................... SUCCESS [0.644s]
[INFO] Forge - Tracking .................................. SUCCESS [3.137s]
[INFO] JBoss Forge - Distribution Build .................. SUCCESS [1:53.029s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2:54.120s
[INFO] Finished at: Tue Feb 26 03:01:06 JST 2013
[INFO] Final Memory: 65M/231M
[INFO] ------------------------------------------------------------------------

ようやく成功!

~\dist\targetの下にできあがったものがあります。
2013年2月27日現在では「forge-distribution-1.2.1.Final」ができている。

forge-distibution-1.2.1.Finalフォルダを任意の場所に配置して、環境変数を設定しておく。
FORGE_HOMEにフォルダを、PATHに%FORGE_HOME%\binを設定。

動作確認してみよう。
コマンドラインを開いて、「forge」と入力してEnter

D:\>forge
Failed loading: test.test:1.0.0-SNAPSHOT:moo
org.jboss.modules.ModuleNotFoundException: Module test.test:moo is not found in
local module loader @e80d1ff (roots: D:\forge-distribution-1.2.1.Final\modules,C

\Users\XXXXXXX\.forge\plugins,D
\)

at org.jboss.modules.LocalModuleLoader.findModule(LocalModuleLoader.java
:126)
at org.jboss.modules.ModuleLoader.loadModuleLocal(ModuleLoader.java:275)

at org.jboss.modules.ModuleLoader.preloadModule(ModuleLoader.java:222)
at org.jboss.modules.LocalModuleLoader.preloadModule(LocalModuleLoader.j
ava:94)
at org.jboss.modules.ModuleLoader.loadModule(ModuleLoader.java:204)
at org.jboss.forge.shell.Bootstrap.loadPlugins(Bootstrap.java:254)
at org.jboss.forge.shell.Bootstrap.access$200(Bootstrap.java:38)
at org.jboss.forge.shell.Bootstrap$1.run(Bootstrap.java:125)
at java.lang.Thread.run(Thread.java:662)
_____
| ___|__ _ __ __ _ ___
| |_ / _ \| `__/ _` |/ _ \ \\
| _| (_) | | | (_| | __/ //
|_| \___/|_| \__, |\___|
|___/

JBoss Forge, version [ 1.2.1.Final ] - JBoss, by Red Hat, Inc. [ http://forge.jb
oss.org ]

なんかExceptionが発生してるけど、立ち上がった。
コマンドリストを表示する命令(list-commands --all)を入力してみる。

[no project] D:\ $ list-command --all
list-command --all

ERROR*** No such command: list-command

Did you mean this ?
list-commands
[no project] D:\ $
[no project] D:\ $ list-commands --all

[FILE & RESOURCES]
cat* cd*
cp* edit*
find* fingerprint*
grep* list-web-resources*
ls ls*
mkdir* mv*
open* pick-up*
pwd* pwr*
rm* touch*
wc*

[FILES & RESOURCES]
ls

[OTHER]
alias* analytics info*
analytics* beans list-alternatives*
beans list-decorators* beans list-interceptors*
beans new-bean* beans new-conversation
beans new-qualifier* beans new-scope*
beans new-stereotype* beans setup*
constraint AssertFalse constraint AssertTrue
constraint DecimalMax constraint DecimalMin
constraint Digits constraint Future
constraint Max constraint Min
constraint NotNull constraint Null
constraint Past constraint Pattern
constraint Size constraint Valid
ejb add-transaction-attribute ejb new-ejb*
ejb setup* entity*
faces new-view* faces project-stage*
faces setup* faces*
field field boolean
field custom field int
field long field manyToMany
field manyToOne field number
field oneToMany field oneToOne
field string field temporal
git clone* git git-checkout*
git setup* gitignore create*
gitignore edit* gitignore list-templates*
gitignore setup* gitignore update-repo*
gitignore-edit add gitignore-edit list
gitignore-edit remove i18n add-locale*
i18n faces-setup* i18n get*
i18n put* i18n remove*
i18n setup* java list-imports
java new-annotation-element java new-annotation-type*
java new-class* java new-enum-const
java new-enum-type* java new-field
java new-interface* java new-method
java* jms setup*
jstl setup* jta setup*
persistence setup* persistence*
plugins new-plugin* plugins setup*
remove-constraint rest endpoint-from-entity*
rest setup* servlet setup*
servlet* soap setup*
unalias* validation setup*

[PROJECT]
build* execute-java*
maven remove-parent* maven set-artifactid*
maven set-groupid* maven set-parent*
maven set-version* mvn*
new-project* project add-dependency*
project add-known-plugin-repository* project add-known-repository*
project add-managed-dependency* project add-plugin-repository*
project add-repository* project find-dependency*
project find-managed-dependency* project install-facet*
project list-dependencies* project list-facets*
project list-managed-dependencies* project list-plugin-repositories*
project list-properties* project list-repositories*
project remove-dependency* project remove-facet*
project remove-managed-dependency* project remove-plugin-repository*
project remove-property* project remove-repository*
project set-property* project*
setup* shade exclude*
shade include* shade make-executable*
shade relocate* shade remove*
shade reset* shade setup*
test*

[SHELL ENVIRONMENT]
about* clear*
echo* exec*
exit* forge find-plugin*
forge git-plugin* forge install-plugin*
forge list-plugins* forge remove-plugin*
forge restart* forge source-plugin*
forge update* forge update-abort*
forge* help*
less* list-commands*
list-config* list-properties*
more* reset*
run* run-url*
set* version*
wait*

[UI GENERATION & SCAFFOLDING]
list-scaffold-providers* scaffold from-entity*
scaffold indexes* scaffold setup*
scaffold templates*

[VERSION CONTROL]
git*

(* = command accessible from current context)

JBossForgeを使って何ができるのか、次回はこいつでできることを探してみよう。

JBoss Developer Studioインストール

時代に逆行していると思いつつも、会社でJBossを使うことになったので、IDE(統合開発環境)をインストールしてみようと思います。

JBossプロダクトを開発にはEclipseベースのJBoss Developer Studioというツールが存在します。

ダウンロードは以下より行ってください。
http://www.jboss.org/developer


「DownLoad Tool Now」をクリックします。
f:id:ats337:20130220014623p:plain


リンクをクリックします。
f:id:ats337:20130220014627p:plain


ダウンロードが始まります。
ダウンロードしたjarファイルをダブルクリックでインストーラを起動します。

「Next」で次へ
f:id:ats337:20130220014629p:plain


「I accept the term of this license agreement.」にチェックを入れて、Nextボタンをクリック
f:id:ats337:20130220014632p:plain


任意のインストールフォルダを設定をしてNextボタンをクリック
f:id:ats337:20130220014633p:plain


JavaVMを選択する。
とりあえず無難にDefault Java VMを選択しておきました。
Nextボタンをクリック。
f:id:ats337:20130220014635p:plain


サーバはまだダウンロードしていなかったので、何もせずそのまま「Next」ボタンをクリック
f:id:ats337:20130220014637p:plain


「Next」をクリックしてインストールを開始します。
f:id:ats337:20130220014639p:plain


インストールを完了したら「Next」ボタンをクリック
f:id:ats337:20130220014641p:plain


適当にチェックを入れて「Next」ボタンをクリック
f:id:ats337:20130220014643p:plain


「Done」ボタンをクリックしてインストールを終了
f:id:ats337:20130220014645p:plain

複数のボタンを同時にタップさせないようにする

1つの画面にボタンを2つ配置する。
ボタンを同時のタップすると・・・・・2つのボタンが同時に効いてしまう。

今までこんなことあったっけ!?

と思い調べてみました。
ちなみにAndroid4.0.3でコンパイルしてました。

2.3.3の時はそんなことなかったはずなので、
2.3.3でコンパイルし直して、同様にボタンを同時押ししてみた。

・・・・・起きない。

調べてみると・・・・あった。
3.0かららしいが、どうやらイベントはデフォルトでそれぞれのViewごとで受け付けられるようになっているぽい。
2.3.3までは、あるViewをタップしている間、別のViewはイベントを受け付けられなかったが、
3.0以降はデフォルトでイベント中に別のイベントも受け付けるらしい。

別のViewを受け付けないようにするためには、以下のように、親Viewの属性として「android:splitMotionEvents="false"」を追加する。

<LinearLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:splitMotionEvents="false">
    <Button android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button1"
        android:id="@+id/button1"/>
    <Button android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button2"
        android:id="@+id/button2"/>
</LinearLayout>

これが書いてある子Viewはイベントを並行して処理しなくなる。

また、いちいちレイアウトに設定したくない場合は、以下のようにstyles.xmlにテーマ、およびスタイルとして設定してもよい。

<style name="AppTheme" parent="android:Theme.Holo.Light">
    <item name="android:windowEnableSplitTouch">false</item>
</style>