Kohei Nozaki's blog 

markdown4jで遊ぶ


Posted on Wednesday Jan 22, 2014 at 01:28PM in Technology


環境

  • markdown4j 2.2
  • WildFly 8.0.0CR1
  • Oracle JDK7u51

何をするの?

markdown4jで遊びます。とりあえずサンプルとかありがちなのを動かしてみてどんな感じのhtmlが生成されるか見てみます。

実験用画面も置いておきます

準備

pom.xml

mavenで取ってこれるのでここにあるdependencyを追加します

実験用画面

JSFで画面を作ります

CDI管理Bean

import java.io.IOException;
import java.io.Serializable;

import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

import org.markdown4j.Markdown4jProcessor;

@Named
@SessionScoped
public class MarkdownBean implements Serializable {

	String body;
	String md;

	public String getMd() {
		return md;
	}

	public void setMd(String md) {
		this.md = md;
	}

	public String getBody() {
		return body;
	}

	public void setBody(String body) {
		this.body = body;
	}

	public void process() throws IOException {
		md = new Markdown4jProcessor().process(body);
	}
}

Faceletsページ

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets">

<h:head></h:head>
<body>
	<h:form>
		<h:inputTextarea value="#{markdownBean.body}" cols="80" rows="5"
			id="input" />
		<br />
		<h:commandButton action="#{markdownBean.process()}" value="process">
			<f:ajax execute="input" render="md md2" />
		</h:commandButton>
		<div>
			<h:outputText value="#{markdownBean.md}" id="md" />
		</div>
		<hr />
		<div>
			<h:outputText value="#{markdownBean.md}" id="md2" escape="false" />
		</div>
	</h:form>
</body>
</html>

動かしてみる

遊ぶ

markdown4jのページにあるサンプル






最後の方は外部サービス連携みたいですが便利ですね

さらに遊ぶ

# 見出し1
## 見出し2

段落1ああああああああああああああああああああああああああああああああああああああああああああああああああ

段落2

[リンク](http://www.google.com/)

![画像](/jboss_community.png)

``` java
class hoge{
  private int hoge;
  private int hoge2;
}
```

参考文献


CLIからデプロイしてみる


Posted on Tuesday Jan 21, 2014 at 04:18PM in Technology


環境

  • WildFly8.0.0CR1
  • Eclipse Kelper SR1

デプロイするWARファイルの準備

WARファイルを作る

対象のプロジェクトを選んで右クリック→Export→WAR file

Web projectとDestnationを埋めてFinish

中身を見てみる

kyle-no-MacBook:~ kyle$ jar tvf ~/JavaEE7Prac.war 
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
   105 Mon Jan 20 13:28:12 JST 2014 META-INF/MANIFEST.MF
     0 Sat Jan 18 21:56:20 JST 2014 META-INF/
     0 Thu Jan 16 15:04:08 JST 2014 META-INF/maven/
     0 Thu Jan 16 15:04:08 JST 2014 META-INF/maven/com.example/
     0 Thu Jan 16 15:04:08 JST 2014 META-INF/maven/com.example/JavaEE7Prac/
   232 Mon Jan 20 18:07:00 JST 2014 META-INF/maven/com.example/JavaEE7Prac/pom.properties
   897 Mon Jan 20 18:07:00 JST 2014 META-INF/maven/com.example/JavaEE7Prac/pom.xml
     0 Sat Jan 18 21:53:56 JST 2014 WEB-INF/
     0 Sat Jan 18 21:56:12 JST 2014 WEB-INF/classes/
     0 Sat Jan 18 21:56:20 JST 2014 WEB-INF/classes/META-INF/
     0 Sat Jan 18 21:47:46 JST 2014 WEB-INF/classes/META-INF/batch-jobs/
   183 Sat Jan 18 21:50:40 JST 2014 WEB-INF/classes/META-INF/batch-jobs/job001.xml
     0 Thu Jan 16 15:09:30 JST 2014 WEB-INF/classes/com/
     0 Mon Jan 20 17:00:08 JST 2014 WEB-INF/classes/com/example/
   678 Mon Jan 20 13:28:16 JST 2014 WEB-INF/classes/com/example/TestBatchlet.class
  1413 Mon Jan 20 13:28:16 JST 2014 WEB-INF/classes/com/example/TestServlet.class
   252 Sat Jan 18 21:53:56 JST 2014 WEB-INF/beans.xml
     0 Thu Jan 16 15:51:56 JST 2014 WEB-INF/lib/
385091 Mon Jan 20 13:28:12 JST 2014 WEB-INF/lib/commons-lang3-3.2.1.jar
   540 Mon Jan 20 16:58:00 JST 2014 WEB-INF/web.xml
kyle-no-MacBook:~ kyle$ 

大丈夫そうですね。jarファイルとかもちゃんと入ってる。

デプロイしてみる

CLIからデプロイ

$ sudo -i -u wildfly /usr/local/wildfly/bin/jboss-cli.sh
[disconnected /] connect
[standalone@localhost:9990 /] deploy /tmp/JavaEE7Prac.war
[standalone@localhost:9990 /] 

アクセスしてみる

大丈夫そうですね

デプロイされたアプリ一覧を表示

[standalone@localhost:9990 /] ls deployment
JavaEE7Prac.war                 postgresql-9.3-1100.jdbc41.jar  
[standalone@localhost:9990 /] 

CLIからアンデプロイ

[standalone@localhost:9990 /] undeploy JavaEE7Prac.war
[standalone@localhost:9990 /] 
[standalone@localhost:9990 /] ls deployment
postgresql-9.3-1100.jdbc41.jar  
[standalone@localhost:9990 /] 

消えましたね。アクセスしても消えています

$JBOSS_HOME/standalone/log/server.logを見てみる

2014-01-21 15:45:59,294 INFO  [org.jboss.as.repository] (management-handler-thread - 8) JBAS014900: Content added at location /usr/local/wildfly/standalone/data/content/81/8f5b7155a35cc08acfd55f279cd7bab40e5972/content
2014-01-21 15:45:59,305 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-4) JBAS015876: Starting deployment of "JavaEE7Prac.war" (runtime-name: "JavaEE7Prac.war")
2014-01-21 15:46:00,445 INFO  [org.jboss.weld.deployer] (MSC service thread 1-3) JBAS016002: Processing weld deployment JavaEE7Prac.war
2014-01-21 15:46:01,027 INFO  [org.hibernate.validator.internal.util.Version] (MSC service thread 1-3) HV000001: Hibernate Validator 5.0.2.Final
2014-01-21 15:46:01,941 INFO  [org.jboss.weld.deployer] (MSC service thread 1-1) JBAS016005: Starting Services for CDI deployment: JavaEE7Prac.war
2014-01-21 15:46:02,535 INFO  [org.jboss.weld.Version] (MSC service thread 1-1) WELD-000900: 2.1.1 (Final)
2014-01-21 15:46:02,593 INFO  [org.jboss.weld.deployer] (MSC service thread 1-1) JBAS016008: Starting weld service for deployment JavaEE7Prac.war
2014-01-21 15:46:05,880 INFO  [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-4) Initializing Mojarra 2.2.4-jbossorg-1 20131017-1524 for context '/JavaEE7Prac'
2014-01-21 15:46:07,412 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-4) JBAS017534: Register web context: /JavaEE7Prac
2014-01-21 15:46:07,590 INFO  [org.jboss.as.server] (management-handler-thread - 8) JBAS018559: Deployed "JavaEE7Prac.war" (runtime-name : "JavaEE7Prac.war")
2014-01-21 15:46:38,643 INFO  [stdout] (batch-batch - 1) Hello JSR352
2014-01-21 15:47:14,605 INFO  [stdout] (batch-batch - 3) Hello JSR352
2014-01-21 15:47:27,235 INFO  [stdout] (batch-batch - 5) Hello JSR352
2014-01-21 15:47:27,389 INFO  [stdout] (batch-batch - 7) Hello JSR352
2014-01-21 15:51:30,933 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-4) JBAS017535: Unregister web context: /JavaEE7Prac
2014-01-21 15:51:30,956 INFO  [org.jboss.weld.deployer] (MSC service thread 1-3) JBAS016009: Stopping weld service for deployment JavaEE7Prac.war
2014-01-21 15:51:30,992 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-2) JBAS015877: Stopped deployment JavaEE7Prac.war (runtime-name: JavaEE7Prac.war) in 65ms
2014-01-21 15:51:31,088 INFO  [org.jboss.as.repository] (management-handler-thread - 15) JBAS014901: Content removed from location /usr/local/wildfly/standalone/data/content/81/8f5b7155a35cc08acfd55f279cd7bab40e5972/content
2014-01-21 15:51:31,089 INFO  [org.jboss.as.server] (management-handler-thread - 15) JBAS018558: Undeployed "JavaEE7Prac.war" (runtime-name: "JavaEE7Prac.war")

特に問題なさげですね。

上書きデプロイをワンライナーで

sudo -i -u wildfly /usr/local/wildfly/bin/jboss-cli.sh --connect "deploy /tmp/JavaEE7Prac.war --force JavaEE7Prac.war"

参考文献


ダンプしてリストアしてみる


Posted on Tuesday Jan 21, 2014 at 02:32PM in Technology


何をするの?

手元の端末で作ったDBを別のマシン上のPostgreSQLにリストアしてみます

環境

ダンプ環境
PostgreSQL 9.2.4 @ OS X 10.9.1
リストア環境
PostgreSQL 9.2.6 @ CentOS 6.5

テスト用のDBを作る

作成用SQL

一応日本語が化けるのとか心配なので日本語も入れてみます

create database testdb001 owner kyle encoding 'UTF8' TEMPLATE template0;
\c testdb001
create table hogetable (id bigint, hogecol varchar(255));
insert into hogetable values (1, 'hoge111');
insert into hogetable values (2, 'ほげ222');

流す

何故かpsqlのプロンプトに日本語をコピペすると文字化けしてしまうのでヒアドキュメント経由で食わせます

kyle-no-MacBook:prepare kyle$ psql <<EOF
> create database testdb001 owner kyle encoding 'UTF8' TEMPLATE template0;
> \c testdb001
> create table hogetable (id bigint, hogecol varchar(255));
> insert into hogetable values (1, 'hoge111');
> insert into hogetable values (2, 'ほげ222');
> EOF
CREATE DATABASE
You are now connected to database "testdb001" as user "kyle".
CREATE TABLE
INSERT 0 1
INSERT 0 1
kyle-no-MacBook:prepare kyle$

ちゃんと入ったか確認してみましょう

kyle-no-MacBook:prepare kyle$ psql testdb001
psql (9.2.4)
Type "help" for help.

testdb001=# select * from hogetable ;
 id | hogecol 
----+---------
  1 | hoge111
  2 | ほげ222
(2 rows)

testdb001=# 

大丈夫そうですね。

ダンプ

もっとも柔軟だそうなのでcustom形式にします。このコマンドで

pg_dump -F c testdb001 > testdb001.dump

実行してみる

kyle-no-MacBook:~ kyle$ pg_dump -F c testdb001 > testdb001.dump
kyle-no-MacBook:~ kyle$ ls -l testdb001.dump 
-rw-r--r--+ 1 kyle  staff  2106  1 21 13:37 testdb001.dump
kyle-no-MacBook:~ kyle$

こいつをscpか何かでリストア環境に持っていきます

リストア

このコマンドでいってみる

pg_restore -v -C -d postgres -j 2 testdb001.dump
-v
進捗状況を詳細表示
-C
リストアの前にデータベースを作成する
-d postgres
接続時のDBにpostgresを使う。-Cを同時に指定している場合,データのリストア先ではない。リストア先のDB名はダンプファイルに含まれるものが使われる.-Cを同時に指定していない場合は,データのリストア先になる.
-j 2
2パラで同時実行。この場合入力はパイプではだめらしい

スーパーユーザで実行するならこう

sudo -u postgres sh -c "pg_restore -v -C -d postgres -j 2 testdb001.dump"

ダンプファイルをpostgresユーザが読めるところに置いて実行

$ cp testdb001.dump /tmp
$ cd /tmp
$ sudo -u postgres sh -c "pg_restore -v -C -d postgres -j 2 testdb001.dump"
pg_restore: リストアのためにデータベースに接続しています
pg_restore: 2183 ENCODING ENCODING を処理しています
pg_restore: 2184 STDSTRINGS STDSTRINGS を処理しています
pg_restore: 2185 DATABASE testdb001 を処理しています
pg_restore: DATABASE testdb001を作成しています
pg_restore: 新しいデータベース"testdb001"に接続しています
pg_restore: データベース"testdb001"にユーザ"postgres"で接続しています
pg_restore: 5 SCHEMA public を処理しています
pg_restore: SCHEMA publicを作成しています
pg_restore: 2186 COMMENT SCHEMA public を処理しています
pg_restore: COMMENT SCHEMA publicを作成しています
pg_restore: 2187 ACL public を処理しています
pg_restore: 169 EXTENSION plpgsql を処理しています
pg_restore: EXTENSION plpgsqlを作成しています
pg_restore: 2188 COMMENT EXTENSION plpgsql を処理しています
pg_restore: COMMENT EXTENSION plpgsqlを作成しています
pg_restore: 168 TABLE hogetable を処理しています
pg_restore: TABLE hogetableを作成しています
pg_restore: メインの並列ループに入ります
pg_restore: 項目 2180 TABLE DATA hogetable に着手します
pg_restore: テーブル"hogetable"のデータをリストアしています
pg_restore: 項目 2180 TABLE DATA hogetable を完了しました
pg_restore: メインの並列ループを終了します
pg_restore: DATABASE testdb001用の所有者と権限を設定しています
pg_restore: SCHEMA public用の所有者と権限を設定しています
pg_restore: COMMENT SCHEMA public用の所有者と権限を設定しています
pg_restore: ACL public用の所有者と権限を設定しています
pg_restore: EXTENSION plpgsql用の所有者と権限を設定しています
pg_restore: COMMENT EXTENSION plpgsql用の所有者と権限を設定しています
pg_restore: TABLE hogetable用の所有者と権限を設定しています
pg_restore: TABLE DATA hogetable用の所有者と権限を設定しています
$ echo $?
0
$ 

確認してみましょう

$ psql testdb001
psql (9.2.6)
"help" でヘルプを表示します.

testdb001=> \d
            リレーションの一覧
 スキーマ |   名前    |    型    | 所有者 
----------+-----------+----------+--------
 public   | hogetable | テーブル | kyle
(1 行)

testdb001=> select * from hogetable ;
 id | hogecol 
----+---------
  1 | hoge111
  2 | ほげ222
(2 行)

testdb001=> 

権限とかスキーマが若干不安ですがデータは移っているようですね。

参考文献


PUTメソッドとmod_jkについて調べる


Posted on Tuesday Jan 21, 2014 at 09:34AM in Technology


環境

$ /usr/sbin/httpd -v
Server version: Apache/2.2.15 (Unix)
Server built:   Aug 13 2013 17:29:28
$ 

GETを送ってみる

全部APサーバに飛ばす設定にしているのでAPサーバのウェルカム画面的なものが返る。

$ curl -v http://localhost:80/ -X GET
* About to connect() to localhost port 80 (#0)
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: localhost
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Tue, 21 Jan 2014 00:28:59 GMT
< Server: Apache/2.2.15 (CentOS)
< Last-Modified: Sun, 22 Dec 2013 06:12:49 GMT
< Content-Length: 2417
< Connection: close
< Content-Type: text/html; charset=UTF-8
< 
<!--
  ~ JBoss, Home of Professional Open Source.
  ~ Copyright (c) 2011, Red Hat, Inc., and individual contributors
  ~ as indicated by the @author tags. See the copyright.txt file in the
...

PUTを送ってみる

デフォルトで拒否されるっぽい

$ curl -v http://localhost:80/ -X PUT
* About to connect() to localhost port 80 (#0)
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> PUT / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: localhost
> Accept: */*
> 
< HTTP/1.1 405 Method Not Allowed
< Date: Mon, 20 Jan 2014 23:55:11 GMT
< Server: Apache/2.2.15 (CentOS)
< Content-Length: 83
< Connection: close
< Content-Type: text/html; charset=UTF-8
< 
* Closing connection #0
<html><head><title>Error</title></head><body>405 - Method Not Allowed</body></html>

インストールしてからmod_jkでAPサーバに全リクエスト飛ばす設定をした他は、何も設定変更していないのだけど拒否されている。PUTも飛ぶのかと思っていたけど違うようだ。

他のメソッドも試してみる

PUT, DELETE, OPTIONSは405

$ curl -LI http://localhost:80/ -X GET -o /dev/null -w '%{http_code}\n' -s
200
$ curl -LI http://localhost:80/ -X POST -o /dev/null -w '%{http_code}\n' -s
200
$ curl -LI http://localhost:80/ -X PUT -o /dev/null -w '%{http_code}\n' -s
405
$ curl -LI http://localhost:80/ -X DELETE -o /dev/null -w '%{http_code}\n' -s
405
$ curl -LI http://localhost:80/ -X OPTIONS -o /dev/null -w '%{http_code}\n' -s
405
$ 

知らなかった。そういえば少し前に脆弱性が報告されていたような。そのせいでApache側でデフォルトオフになったのだろうか。mod_jkの設定がどうのというよりそもそもApacheで受け付けない設定になっている感じ。

許可するには?

そもそも最近のApacheでは全面的にオフになっていて、[7]によると何やらモジュールの有効化などが必要らしい。何か大変そうなので今回はここまでにしておく。

参考文献

  1. Issue with HTTP methods (DELETE,PUT) not being accepted (returning 405 Method not allowed) (Apache Users)
  2. Re: Issue with HTTP methods (DELETE,PUT) not being accepted (returning 405 Method not allowed) (Apache Users)
  3. Tomcat + Apache mod_jk PUT gives 405 (Tomcat forum at JavaRanch)
  4. [Tomcat-users] mod_jk PUT request-method returns 405 Error - Grokbase
  5. Agile Testing: Configuring Apache 2 and Tomcat 5.5 with mod_jk
  6. cURLでHTTPステータスコードだけを取得する - Qiita [キータ]
  7. PUTやDELETEを使うために - PukiWiki


JPQLをorm.xmlに書いてみる


Posted on Tuesday Jan 21, 2014 at 08:04AM in Technology


何をするの?

JPQLをorm.xmlに書いて動かしてみます。

環境

  • WildFly8.0.0CR1
  • Eclipse Kepler SR1
  • PostgreSQL 9.2.4
  • Oracle JDK7u51

準備

これの続きです。

orm.xmlに書いたクエリを動かしてみる

orm.xmlを作る

src/main/java/META-INFの下に作ります。右クリックメニューからNew→JPA ORM Mapping File

場所を確かめてFinish

出来たら開きましょう

クエリを書く

named-queryを書いてみます。エンティティに直書きしてたのとほとんど同じです。違うのはidで逆順ソートかけてるとこだけです

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings version="2.1"
	xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm http://xmlns.jcp.org/xml/ns/persistence/orm_2_1.xsd">
	<named-query name="findHogeEntityAllDesc">
                <query>
                 SELECT
                     e
                 FROM
                     HogeEntity e
                 ORDER BY
                     e.id DESC
                </query>
	</named-query>
</entity-mappings>

この書き方だと < とか > をエスケープしないといけないのが面倒くさいですが、こういう感じで書くとそのまま書けます。

Daoにメソッドを追加

findAllDesc()を追加します

package com.example.dao;

import java.util.Date;
import java.util.List;

import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;

import com.example.entity.HogeEntity;

@Named
public class HogeEntityDao {

	@PersistenceContext
	private EntityManager em;

	@Transactional
	public void save() {
		HogeEntity e = new HogeEntity();
		e.setHogeDate(new Date());
		em.persist(e);
	}

	public List<HogeEntity> findAll() {
		return em.createNamedQuery("findHogeEntityAll", HogeEntity.class).getResultList();
	}
	
	public List<HogeEntity> findAllDesc() {
		return em.createNamedQuery("findHogeEntityAllDesc", HogeEntity.class).getResultList();
	}
}

サーブレットから呼び出すメソッドを変更

package com.example.servlet;

import java.io.IOException;
import java.io.Writer;

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

import com.example.dao.HogeEntityDao;
import com.example.entity.HogeEntity;

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

	@Inject
	HogeEntityDao dao;

	public HogeServlet() {
		super();
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		dao.save();
		try (Writer w = response.getWriter()) {
//			for (HogeEntity e : dao.findAll()) {
			for (HogeEntity e : dao.findAllDesc()) {
				w.write("id=" + e.getId() + ", hogeDate=" + e.getHogeDate() + "\n");
			}
		}
	}
}

動かしてみる

逆順になりました。改行とかも自由なので、やっぱりクエリはエンティティのアノテーション内に書くよりorm.xmlに書いた方が良い気がします。