2014年9月7日日曜日

NetBeansを使ったJava EEアプリケーション開発


最近のJava Webフレームワークについて調べてみたところ、どうやらJava EEが良いようなので、今回はJava EEに手を出してみます。


Java EEについて調べていると、EclipseよりNetBeansで説明されていることが断然多いです。
単にJavaでの開発というとシェア的にはEclipseに分があるものの、Java EEやるならNetBeansって事でしょうか。

今まではEclipse派でしたが、NetBeansはインストールしたらすぐ使える的なことも良く書いてあるので、今回はNetBeansを試してみようと思います。


まずは、NetBeansのインストールからと言いたいところですが、NetBeansのサイトからダウンロードしてインストーラの指示通りインストールするだけでした。

インストールは割愛し、プロジェクトの作成、バッキングBeanの作成、JSFページの作成について、基本的な部分を試してみます。

今回は、ユーザー名を入力してログインボタンを押すと、ログインしたユーザー名を表示し、ログアウトボタンを押すとユーザー名が消えるだけのサイトを作成します。

  • プロジェクトの作成

新規プロジェクト⇒Java Web⇒WEBアプリケーション

プロジェクト名の入力

Java EEのバージョンやアプリケーションサーバの選択

フレームワークの選択

必要なファイルと階層構造が生成されます。

おもむろに実行すると、初期状態のindex.xhmlが開きます。

ここまでは細かい設定いらず、非常に簡単です。


また、コードを触る前にLombokというライブラリを入れておきます。
ボイラープレートコードをアノテーションだけでコンパイル時に生成してくれるかなり使えるライブラリです。

設定はLombokのサイトからlombok.jarをダウンロードして、ライブラリフォルダに登録するだけです。


  • バッキングBeanの作成

新規⇒JavaServer Faces⇒JSF管理対象Bean

Bean名やパッケージ名の入力

ソース・パッケージフォルダに指定した名前のjavaファイルが生成されます。
表示させると以下のようなコードになっています。

package monawebwallet;

import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;

@Named(value = "loginBean")
@SessionScoped
public class LoginBean implements Serializable {

    /**
     * Creates a new instance of LoginBean
     */
    public LoginBean() {
    }
   
}

いわゆるJavaBeansですが、@Named@SessionScopedの二つのアノテーションを使用しています。

@Namedアノテーションは決まりごとで、ここで指定した名前(value)でELからアクセス出来ます。

@SessionScopedアノテーションは、バッキングBeanのスコープを定義します。
他にも@RequestScoped@ApplicationScopedなどがありますが、アカウントを保持させるので、ここではセッションスコープにしました。

このコードにアカウント文字列を保持するプロパティを追加し、Lombokの@NoArgsConstructor@Getter@Setterアノテーションを付けます。

package monawebwallet;

import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
import lombok.NoArgsConstructor;
import lombok.Getter;
import lombok.Setter;

@Named(value = "userBean")
@SessionScoped
@NoArgsConstructor
@Getter
@Setter
public class UserBean implements Serializable {

    String accountStr;
}

非常にすっきりしていますが、これでデフォルトコンストラクタとゲッター、セッターがコンパイル時に生成されます。


  • JSFページの作成

新規⇒JavaServer Faces⇒JSFページ

ファイル名の入力

Webページフォルダ直下に指定した名前のxhtmlファイルが生成されます。

ちなみにこのページにアクセスするには、http://localhost:8080/MonaWebWallet/login.xhtmlではなく、http://localhost:8080/MonaWebWallet/faces/login.xhtmlです。

デフォルトのindex.xhtmlについては、http://localhost:8080/MonaWebWallet/でアクセス可能ですが、実際にはweb.xmlでウェルカムページとして設定されている、faces/index.xhtmlにアクセスしています。

詳しくはweb.xmlを見て頂きたいのですが、faces配下のファイルがFacesServletの管理対象としてマッピングされています。

これ、faces配下じゃないほうにアクセスしても普通のhtml部分は表示されるため、ちょっとハマりました。
そして、そのままFacesServletが処理する前のソースが見えてしまうのでなんだか微妙なのですが、表示させない方法についてはまた別の機会に。


新規でJSFページを作る際は上記の流れですが、今回はデフォルトで生成されているindex.xhtmlを書き換えて使います。

表示させると以下のようになっています。

<?xml version='1.0' encoding='UTF-8' ?>
<!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://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        Hello from Facelets
    </h:body>
</html>

<h:body>タグ内を以下のように書き換えます。

<h:form>
    <h:inputText id="account" size="30" value="#{userBean.accountStr}" />
    <h:commandButton id="login" value="ログイン" />
    <h:commandButton id="logout" value="ログアウト" actionListener="#{userBean.setAccountStr('')}" />
</h:form>
<b><h:outputText value="#{userBean.accountStr}" /></b>

#{userBean.accountStr}のように、ELを使用することでバッキングBeanのプロパティにアクセス出来ます。

<h:form>タグの中に<h:inputText>タグを入れて、valueにELでバッキングBeanのプロパティを設定しておくと、フォームをSubmitした際に、プロパティのセッターが呼ばれて値が格納されます。

<h:outputText>タグのvalueに設定すると、プロパティのゲッターが呼ばれて、値が取り出されます。

ログイン前

ログイン後

  • 日本語対応

日本語を入力すると壮大に文字化けしました。

新規⇒Glassfish⇒Glassfish ディスクリプタ

そのまま進めると、「このプロジェクトのデプロイメント構成が見つかりません。デプロイメント・ディスクリプタのバージョンを正しく設定できませんでした。」とエラーが出ましたが、とりあえず放置します。

構成ファイルフォルダの中にsun-web.xmlが生成されるので、以下のように<parameter-encoding>タグを追加します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD GlassFish Application Server 3.0 Servlet 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_3_0-0.dtd">
<sun-web-app error-url="">
    <class-loader delegate="true"/>
    <jsp-config>
        <property name="keepgenerated" value="true">
            <description>Keep a copy of the generated servlet class' java code.</description>
        </property>
    </jsp-config>
    <parameter-encoding default-charset="UTF-8" />
</sun-web-app>

うまくいきました。

Read More...

2014年8月11日月曜日

サーバーサイドJAVAの環境を整える


Monacoindの基本的な動きは大体分かったので、実際にWEBサービスの形にしてみようと思います。

Linuxもそんなに詳しくないので、色々と試しながらやってみます。

使う言語はJava。

なぜJavaかというと、過去に、Google App Engine for Java(GAE/J)でWEBサービスを作るというような記事を書いて、フレームワークについても調べて、Slim3やべぇなどと騒いだあげくに、何も作らなかったので、贖罪の意味を込めてJavaを使います。

今回は環境作りです。


まずは、Apacheをインストールします。

$ sudo apt-get update
$ sudo apt-get upgrade

$ sudo apt-get install apache2

この時点で既にApacheは起動しているようで、http://localhostにアクセスすると以下が表示されます。

「あなたの予想に反して~」はどこ行っちゃったんでしょう。
It works!なんて言われても、こっちのほうが予想外です。

とりあえず設定ファイルなどは触らずに次行きます。


次は、Tomcatをインストールします。

$ sudo apt-get install tomcat7

これで必要なJavaなどもまとめてインストールされ、tomcat7ユーザが作成されます。

同じくこの時点でTomcatは起動しているようで、http://localhost:8080にアクセスすると以下が表示されます。

続いて、ドキュメントやらWeb Management Interfaceやらexampleやらをインストールします。

$ sudo apt-get install tomcat7-docs tomcat7-admin tomcat7-examples

以下二つはそのまま見れます。

tomcat7-docs

tomcat7-examples

以下二つは認証が必要です。
tomcat7-admin (manager webapp)
tomcat7-admin (host-manager webapp)

tomcat-users.xmlを編集し、manager-guiとadmin-guiへアクセスするためのIDを作成します。

任意のIDとパスワードを設定します。

$ sudo nano /etc/tomcat7/tomcat-users.xml

tomcat-usersタグの中に以下を追加。
<tomcat-users>
    <user username="admin" password="password" roles="manager-gui,admin-gui"/>
</tomcat-users>

保存したら再起動します。
$ sudo service tomcat7 restart

それぞれ、自分で設定したIDとパスワードでログインします。

tomcat7-admin (manager webapp)


tomcat7-admin ( host-manager webapp)


最後にApacheとの連携の設定を行います。

Apache&Tomcatの連携は、静的なコンテンツはApacheに担当させ、動的なコンテンツをTomcatに担当させるという、良く見る構成です。

ただ、Tomcat単体で動かした場合より低速になったりするようですし、そもそもJSPなどでページを作って行くと、Apacheに担当させるような静的なコンテンツは少なくなり、Apacheは無くても良いという説もあります。

Apacheの拡張機能などを使わないのであれば、Tomcat単体運用も選択肢の一つのようですね。

でもとりあえず連携させときます。

tomcatのserver.xmlを開いて、8080ポートを閉じ、8009ポートを開けます。
$ sudo nano /etc/tomcat7/server.xml

以下をコメントアウトします。
<!--
<Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000" URIEncoding="UTF-8" redirectPort="8443" />
-->

以下のコメントアウトを削除します。
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />


AJPモジュールの設定ファイルを作成し、連携の設定を行います。
$ sudo nano /etc/apache2/mods-available/proxy_ajp.conf

以下を入力して保存します。
ProxyPass /tomcat/ ajp://localhost:8009/

AJPモジュールを有効化します。
$ sudo a2enmod proxy_ajp

http://localhost/tomcat/にアクセスすると、ApacheからTomcatに飛ばされて、TomcatのIt works !が表示されます。


これでApacheもTomcatもデフォルトで起動するようになっているので、あとは何か作るだけです。
気長にやります。


Read More...

2014年8月4日月曜日

JSON-RPCを使ってmonacoindを操作する2 WEB Walletを作るには?


Bitcoin API calls 和訳版を参考に、WEB Walletを作るには?という視点でmonacoindで色々やってみました。

流れ的には以下のような感じでしょうか。


getaccountaddressでDeposit用のアドレスを作成。
その際、ユーザ固有のアカウントをアドレスに紐付ける。

既存のものではなく、新しいアドレスを作成するには、getnewaddressで新規作成する。
アカウントのアドレスリストは、getaddressesbyaccountで取得する。

getbalanceでアカウントの残高を確認。
listtransactionsでトランザクション履歴を確認。

sendfromで指定のアドレスへWithdrawする。


では、それぞれのメソッドを確認していきます。


  • getaccountaddress

指定したアカウントに支払いを受けるための、最新のアドレスを返します。
なければ作成、あればそれを返す。

$ curl --user 'rpcuserid:rpcpassword' --data-binary '{"jsonrpc":"1.0","id":"1","method":"getaccountaddress","params":["testAc"]}' -H 'content-type:text/plain;' http://127.0.0.1:9359
{"result":"MVPMzNXWwu4db4uwUzFm3NbDLRvpjmfkSC","error":null,"id":"1"}

MVPMzNXWwu4db4uwUzFm3NbDLRvpjmfkSCがtestAcにおけるDeposit用のアドレスとなります。

  • getnewaddress

呼ぶたびに新しいアドレスを返します。(以下は2回呼んだ結果)

$ curl --user 'rpcuserid:rpcpassword' --data-binary '{"jsonrpc":"1.0","id":"1","method":"getnewaddress","params":["testAc"]}' -H 'content-type:text/plain;' http://127.0.0.1:9359

{"result":"MUh5HD2VEC1UGZxxF1TRcKKsFCbGfmjEpq","error":null,"id":"1"}
{"result":"MS6WsHkyb9cFrHrxKFmi7bARwwpvNRvhsH","error":null,"id":"1"}

内部的にどうなっているのか、先ほど使ったgetaccountaddressで確認してみます。

{"result":"MVPMzNXWwu4db4uwUzFm3NbDLRvpjmfkSC","error":null,"id":"1"}

受信用アドレスは、新しいアドレス生成前と変わっていません。


  • getaddressesbyaccount

指定したアカウントのアドレスリストを返します。

$ curl --user 'rpcuserid:rpcpassword' --data-binary '{"jsonrpc":"1.0","id":"1","method":"getaddressesbyaccount","params":["testAc"]}' -H 'content-type:text/plain;' http://127.0.0.1:9359

{"result":["MUh5HD2VEC1UGZxxF1TRcKKsFCbGfmjEpq","MS6WsHkyb9cFrHrxKFmi7bARwwpvNRvhsH","MVPMzNXWwu4db4uwUzFm3NbDLRvpjmfkSC"],"error":null,"id":"1"}

もともとのアドレスに加え、新規で生成したアドレスがアカウントに紐付いています。


ここで0.01MONAほど入金してみます。

getaddressesbyaccountで確認すると、アドレスが増えています。

{"result":["MLGDvB3UoYEV9FvWkq2xkvFrxh6bPLniQE","MUh5HD2VEC1UGZxxF1TRcKKsFCbGfmjEpq","MS6WsHkyb9cFrHrxKFmi7bARwwpvNRvhsH","MVPMzNXWwu4db4uwUzFm3NbDLRvpjmfkSC"],"error":null,"id":"1"}

getaccountaddressで確認すると、新しいアドレスが入金用アドレスに変わっています。

{"result":"MLGDvB3UoYEV9FvWkq2xkvFrxh6bPLniQE","error":null,"id":"1"}

  • getbalance

指定したアカウントの残高を返します。

$ curl --user 'rpcuserid:rpcpassword' --data-binary '{"jsonrpc":"1.0","id":"1","method":"getbalance","params":["testAc"]}' -H 'content-type:text/plain;' http://127.0.0.1:9359

{"result":0.01000000,"error":null,"id":"1"}

  • listtransactions

トランザクション履歴を返します。

$ curl --user 'rpcuserid:rpcpassword' --data-binary '{"jsonrpc":"1.0","id":"1","method":"listtransactions","params":["testAc"]}' -H 'content-type:text/plain;' http://127.0.0.1:9359

{"result":[{"account":"testAc","address":"MVPMzNXWwu4db4uwUzFm3NbDLRvpjmfkSC","category":"receive","amount":0.01000000,"confirmations":6,"blockhash":"d4dd988599a7649897a80ed94dd5f9e3642c9be33d76fa067bda3dcf352802b0","blockindex":18,"blocktime":1407077735,"txid":"9ee8386695853db90dd2d37abc46e65874a68db51e4daf2721e1ce1a3441156b","normtxid":"0e36640249a1b732c99311e8babbc85a7db43f7640b136188e5a78853b014d6f","time":1407077288,"timereceived":1407077288}],"error":null,"id":"1"}

categoryreceiveのトランザクション履歴が確認出来ます。


  • sendfrom

指定したアカウントから送金します。

$ curl --user 'rpcuserid:rpcpassword' --data-binary '{"jsonrpc":"1.0","id":"1","method":"sendfrom","params":["testAc","MR2j3u5oNWZzAAxeHtSinHUEVNiSbkn8zJ",0.001]}' -H 'content-type:text/plain;' http://127.0.0.1:9359

{"result":"92828b7bf40b85b41f7deeb4e8f90ed2a14ced8efa83875132ca9319967f771f","error":null,"id":"1"}

listtransactionsで再度トランザクション履歴を確認してみます。

{"result":[{"account":"testAc","address":"MVPMzNXWwu4db4uwUzFm3NbDLRvpjmfkSC","category":"receive","amount":0.01000000,"confirmations":7,"blockhash":"d4dd988599a7649897a80ed94dd5f9e3642c9be33d76fa067bda3dcf352802b0","blockindex":18,"blocktime":1407077735,"txid":"9ee8386695853db90dd2d37abc46e65874a68db51e4daf2721e1ce1a3441156b","normtxid":"0e36640249a1b732c99311e8babbc85a7db43f7640b136188e5a78853b014d6f","time":1407077288,"timereceived":1407077288},{"account":"testAc","address":"MR2j3u5oNWZzAAxeHtSinHUEVNiSbkn8zJ","category":"send","amount":-0.00100000,"fee":-0.00100000,"confirmations":0,"txid":"92828b7bf40b85b41f7deeb4e8f90ed2a14ced8efa83875132ca9319967f771f","normtxid":"8a13b422a5c0adbe08b4b410d22457e1570142bfde66068a708ec19eddc8aee4","time":1407078088,"timereceived":1407078088}],"error":null,"id":"1"}

categorysendのトランザクションが増えました。


WEB Walletなんてのは実装としては意外と簡単なんですね。

セキュリティとか考えなければ、ですが。

Read More...

2014年8月3日日曜日

JSON-RPCを使ってmonacoindを操作する


JSON-RPCの動きを検証するために、jqueryなどを使って適当なJavascriptでテストページを作ったのですが、クロスオリジンの問題でうまく動きません。

ポートが異なるだけで別オリジン扱いのようなので、どうしようもないのかな?と思っていたところ、動きをテストするだけならもっと簡単な方法がありました。

cURLという、様々なプロトコルでデータを送受信できるユーティリティを使います。

試しにインストールして使ってみましょう。

$ sudo apt-get install curl
$ curl http://monacoin.org/ja/

これでだーっと標準出力にサイトのソースが表示されます。


では実際にmonacoindを操作してみましょう。

monacoindとJSON-RPCを使って会話をするために必要なIDとPWは、初回起動時にmonacoin.confに設定しているはずです。

そのIDとPWを使ってデフォルトのrpcportにアクセスすると、ちゃんと返事があります。

$ curl --user 'rpcuserid:rpcpassword' --data-binary '{"jsonrpc":"1.0","id":"curltext","method":"getinfo","params":[]}' -H 'content-type:text/plain;' http://127.0.0.1:9402

{"result":{"version":80700,"protocolversion":70002,"walletversion":60000,"balance":0.01800000,"blocks":208195,"timeoffset":44,"connections":8,"proxy":"","difficulty":1105.55691097,"testnet":false,"keypoololdest":1405931648,"keypoolsize":104,"paytxfee":0.00000000,"mininput":0.00001000,"errors":""},"error":null,"id":"curltext"}


monacoin.confの他の設定項目についても見てみます。

いくつかある設定項目の内、重要なのはrpcallowipとrpcportです。
server、listenについては設定しなくても返事があるので、qtを使う時に必要な設定なのか、デフォルトが有効な設定のようです。

まずrpcportを設定すると、待ち受けるポートをデフォルトの9402から変更出来ます。

rpcport=9359

monacoin.confで上記のように設定すると、以下のように9359ポートで動いているのが分かります。

$ curl --user 'rpcuserid:rpcpassword' --data-binary '{"jsonrpc":"1.0","id":"curltext","method":"getinfo","params":[]}' -H 'content-type:text/plain;' http://127.0.0.1:9359

{"result":{"version":80700,"protocolversion":70002,"walletversion":60000,"balance":0.01800000,"blocks":208196,"timeoffset":44,"connections":6,"proxy":"","difficulty":938.68052376,"testnet":false,"keypoololdest":1405931648,"keypoolsize":104,"paytxfee":0.00000000,"mininput":0.00001000,"errors":""},"error":null,"id":"curltext"}

次に、rpcallowipを設定すると、別のIPからでもアクセス出来るようになります。

以下のコメントアウトした1行目のように設定にすると、ネットワークごとアクセス許可が出来ます。

が、基本的にはlocalhostからのみの接続とすべきでしょう。
そうであれば、デフォルトでlocalhost限定なので、わざわざ設定しなくても良さそうですが、設定しろとよく書いてあるので、念のため。

#rpcallowip=192.168.0.*
rpcallowip=127.0.0.1

ちなみにrpcpasswordを間違えると、以下のようにHTMLでレスポンスがあります。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML>
<HEAD>
<TITLE>Error</TITLE>
<META HTTP-EQUIV='Content-Type' CONTENT='text/html; charset=ISO-8859-1'>
</HEAD>
<BODY><H1>401 Unauthorized.</H1></BODY>
</HTML>


Read More...

2014年7月24日木曜日

ethereumをビルドしてみる


突然Newsletterが届いたので、ethereumをビルドしてみました。

今どういうフェーズなのか知りませんが、とりあえず何も考えずにビルド。


wikiを見ながら試しました。

とりあえず準備。
sudo apt-get update && sudo apt-get upgrade

まず、必要パッケージのインストール。

sudo apt-get install build-essential g++-4.8 git cmake libgmp-dev \
libboost-all-dev automake unzip libtool libleveldb-dev yasm libminiupnpc-dev \
libreadline-dev scons libncurses5-dev qtbase5-dev qt5-default qtdeclarative5-dev \
libqt5webkit5-dev libcurl4-openssl-dev


Cryptopp 5.6.2が必要だそうですが、libcrypto++-devにはCrypto++ v5.6.1しかないので、ソースからビルドする。

git clone https://github.com/mmoss/cryptopp.git
cd cryptopp
sudo scons --shared --prefix=/usr
cd ..


JSONRPCもソースから。

git clone git://github.com/cinemast/libjson-rpc-cpp.git
cd libjson-rpc-cpp/build
cmake .. && make
sudo make install
sudo ldconfig
cd ..


ethereumのソースを拾って来る。

git clone https://github.com/ethereum/cpp-ethereum
cd cpp-ethereum
git checkout develop


ビルドする。

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release && make


CUIで起動
cd eth
./eth


GUIで起動
cd alethzero
./alethzero


この辺を見ながら動かしてみたけど、いまいち何が起きてるのか不明。

ま、とりあえずメモってことで。

Read More...

2014年7月21日月曜日

意外と簡単に動いた! monacoindのビルドから実行まで


何か暗号通貨関連でサービスを作りたいと思い立ち、準備運動としてWalletのビルドを前回やったので、次にデーモンのビルドを試してみます。

最近TVで報道されたり、暴騰したりで話題のMonacoinのmonacoindをビルドしてみます。


前回Walletをビルドする際に、必要そうなパッケージはあらかた突っ込んだので、今回は非常にシンプルです。
$ git clone git://github.com/monacoinproject/monacoin.git
$ cd monacoin/src
$ make -f makefile.unix

ビルドし終わったら、「/usr/local/bin」あたりに放り込んで実行します。
$ monacoind
Error: To use monacoind, you must set a rpcpassword in the configuration file:
It is recommended you use the following random password:
rpcuser=monacoinrpc
rpcpassword=EvCj7irBs1egMX33HixQ6Hv481neRF9Jm8qmFwRKdUJy
(you do not need to remember this password)
The username and password MUST NOT be the same.
If the file does not exist, create it with owner-readable-only file permissions.
It is also recommended to set alertnotify so you are notified of problems;
for example: alertnotify=echo %s | mail -s "Monacoin Alert" admin@foo.com

なんか怒られました。

設定ファイルでrpcpasswordを設定しろとのことです。
オーナーのみ読み込み可能なように設定するべきと書いてあります。

ということで、指定どおりファイルを作成し編集する。
$ touch monacoin.conf
$ vi monacoin.conf

#中身は言われた通りに設定してみる。
rpcuser=monacoinrpc
rpcpassword=EvCj7irBs1egMX33HixQ6Hv481neRF9Jm8qmFwRKdUJy

#同じく指示通りオーナーのみ読み込み可能に。
$ chmod 400 monacoin.conf

#実行する。
$ monacoind

初めてmonacoindを実行すると、debug.logがモリモリ増量していきます。
初回の同期処理をしてるんだと思いますが、100M超えたあたりで不安になりました。。

不安なのでdebug.logを監視してみます。
$ tail -f debug.log

height(何ブロック目まで読み込んだか)の値が少しずつ大きくなっていっているので何か動いている風です。
しばらく待って、最新のブロックまで読み込んだ後、再起動したところdebug.logは200kぐらいになりました。

実際のデータはblocksディレクトリの中だと思われます。


では、実際にAPIを叩いて動作しているか確認してみます。

monacoindをデーモンとして起動します。
$ monacoind -daemon
Monacoin server starting

いくつかAPIを呼んでみます。

  • ヘルプ

$ monacoind help
だーっとヘルプが表示されます。


  • monacoindを停止

$ monacoind stop
Monacoin server stopping

#この状態でAPIを呼ぶと当然エラー
$ monacoind help
error: couldn't connect to server


  • 再起動してから残高を表示

$ monacoind -daemon
Monacoin server starting
$ monacoind getbalance
0.00000000


  • 最新のブロック番号を表示

$ monacoind getblockcount
197067


  • 現在のdifficultyを表示

$ monacoind getdifficulty
227.03475154


  • もろもろの情報をまとめて表示

$ monacoind getinfo
{
    "version" : 80700,
    "protocolversion" : 70002,
    "walletversion" : 60000,
    "balance" : 0.00000000,
    "blocks" : 197069,
    "timeoffset" : 26,
    "connections" : 8,
    "proxy" : "",
    "difficulty" : 168.17490151,
    "testnet" : false,
    "keypoololdest" : 1405931648,
    "keypoolsize" : 101,
    "paytxfee" : 0.00000000,
    "mininput" : 0.00001000,
    "errors" : ""
}


  • 受信用アドレスの情報を表示
以下だと取引の発生していないアドレスは表示されません。

$ monacoind listreceivedbyaddress
[
]


  • すべての受信用アドレスの情報を表示
取引の発生していないアドレスも表示されます。

$ monacoind listreceivedbyaddress 0 true
[
    {
        "address" : "MENrRKiTwgXSGxczz62Jk7AFq67pLYpdWV",
        "account" : "",
        "amount" : 0.00000000,
        "confirmations" : 0,
        "txids" : [
        ]
    }
]


  • 取引発生後の受信用アドレス
別のWalletから上記アドレスに0.01MONA送金後、こんどはオプション無しで表示されました。

$ monacoind listreceivedbyaddress
[
    {
        "address" : "MENrRKiTwgXSGxczz62Jk7AFq67pLYpdWV",
        "account" : "",
        "amount" : 0.01000000,
        "confirmations" : 7,
        "txids" : [
            "f1a4f98965f45d69abbced94c94e0daa6c4b8106593b8836f2d3d8dc2244d1e6"
        ]
    }
]


  • 取引発生後のすべての受信用アドレス
取引発生後、内部的に新しいアドレスが追加された模様。

$ monacoind listreceivedbyaddress 0 true
[
    {
        "address" : "MENrRKiTwgXSGxczz62Jk7AFq67pLYpdWV",
        "account" : "",
        "amount" : 0.01000000,
        "confirmations" : 7,
        "txids" : [
            "f1a4f98965f45d69abbced94c94e0daa6c4b8106593b8836f2d3d8dc2244d1e6"
        ]
    },
    {
        "address" : "MNVb8W1dHD4jNGRtCayhiMzojGontESw8r",
        "account" : "",
        "amount" : 0.00000000,
        "confirmations" : 0,
        "txids" : [
        ]
    }
]


  • 送金テスト
0.001MONAを送金してみます。

$ monacoind sendtoaddress MR2j3u5oNWZzAAxeHtSinHUEVNiSbkn8zJ 0.001
02f4ab46964f9a55dd0554a5764725e10513b1ad402b939a96e2273d531c9773

早速Windowsに入れているWalletに0.001MONA届きました。


ちなみに激しく貧乏なのは、1MONAが7円ぐらいに跳ね上がった時に、焦って全部Bitcoinにしてしまったためです。。
まさかあそこから30円突破まで行くとは。。


ということで、なんかサービス作るのでMonacoinで寄付下さいw

MR2j3u5oNWZzAAxeHtSinHUEVNiSbkn8zJ


Read More...

2014年6月1日日曜日

Linux用walletをビルドする


そういえば、一度もWalletを自分でビルドしたことが無かったので、Walletのビルドを試してみました。
ビルドの実験はVMware上のUbuntuで作業しました。


まずは最近無事完全PoSへ移行したRingoで試します。

GitHub
https://github.com/dkwzjw/ringo


「INSTALL」を見ると以下のような記載があります。

Building Ringo

See doc/readme-qt.rst for instructions on building Ringo QT,the intended-for-end-users, nice-graphical-interface, reference implementation of Ringo.


まずはdoc/readme-qt.rstを見ろと書いてあり、見ると以下のように記載されています。

First, make sure that the required packages for Qt5 development of your distribution are installed, for Debian and Ubuntu these are:

apt-get install qt5-default qt5-qmake qtbase5-dev-tools qttools5-dev-tools build-essential libboost-dev libboost-system-dev libboost-filesystem-dev libboost-program-options-dev libboost-thread-dev libssl-dev libdb++-dev

then execute the following:
qmake
make

Qt(キュートと読む)というのは、アプリケーション開発フレームワークで、クロスプラットフォーム対応が楽な設計になっているとか。

事前準備として、そのQt開発に必要なパッケージをインストールします。
$ apt-get install qt5-default qt5-qmake qtbase5-dev-tools qttools5-dev-tools build-essential libboost-dev libboost-system-dev libboost-filesystem-dev libboost-program-options-dev libboost-thread-dev libssl-dev libdb++-dev

次にgitをインストールします。
$ sudo apt-get install git

次にringoのリポジトリを複製します。
今回は/tmpで作業。
$ cd /tmp
$ mkdir ringo
$ cd ringo
$ git clone git://github.com/dkwzjw/ringo.git ./

git cloneしてあげると、GitHubからringoのソースコードをごっそり持ってくるので、Makefileを作成し、makeします。
configureじゃなくてqmakeなんですね。
$ qmake
$ make

なにやらエラーを吐きました。
src/net.cpp:19:32: fatal error: miniupnpc/miniwget.h: そのようなファイルやディレクトリはありません
 #include <miniupnpc/miniwget.h>
                                ^

以下で必要なパッケージをインストールしたらいけました。
$ sudo apt-get install libminiupnpc-dev libminiupnpc8


が、思いっきり文字化けw


既にコンソールに日本語が出ていたので、ロケール設定には問題ないはず。
$ env | grep LANG
LANG=ja_JP.UTF-8

やはり問題無いですね。

フォントがインストールされてないだけか?ということで、IPAフォントを入れてみます。
$ sudo apt-get install fonts-ipafont

うーん、あと一歩w漢字が表示出来ない。。


よく分からないですが、動作には問題なさそうなので、文字化け問題は一旦放置して、Vertcoinでもやってみます。

基本的な作りは本当に皆同じなんですね。

ほぼ同じように作業したところ、Makefile作るときに、なにやらエンコードか何かのエラーが出ましたが、とりあえずうまくいきました。

ちなみに、ホームディレクトリにringoフォルダや、vertcoinフォルダが出来ているんですが、隠しディレクトリです。
lsコマンドに「-a」オプションを付ければ見えます。


ちなみに、BAMTでも試してみたのですが、ビルドは出来たんですが、容量不足とか言われて同期出来ませんでした。
たしかに、結構容量喰うんですよね。
Read More...