[開発][JMS] Transaction界隈の確認に参照するシーケンスなメモ

spring-jms-4.3.5.RESEASE.jar

//Thread#run
//ThreadPoolExecutor$Worker#run
//StandardCOntext#startInternal
//StandardContext#listenerStart
//ContextLoaderListener#contextInitialized
//ContextLoaderListener#initWebApplicationContext
//ContextLoaderListener#confiureAndRefreshWebApplicationContext
//XmlWebApplicationContext#refresh
//DefaultLifecycleProcessor#onRefresh

//JmsListenerEndpointRegistry#start - 206
//JmsListenerEndpointRegistry#startIfNecessary - L.243
//DefaultMessageListenerContainer#start - L.598
//AbstractJmsListeningContainer#doStart - L.285
-- DefaultMessageListenerContainer#sharedConnectionEnabled - L.711
-- AbstractJmsListeningContainer#establishSharedConnection - L.381
-- -- AbstractJmsListeningContainer#createSharedConnection - L.413
-- -- -- JmsAccessor#createConnection - L.180
-- -- -- AbstractJmsListeningContainer#prepareSharedConnection - L.434
-- //DefaultMessageListenerContainer#startSharedConnection - L.822
-- -- AbstractJmsListeningContainer#startSharedConnection - L.448

loop: --------------------------------------------------------------------------

//Thread#run
//AsyncMessageListenerInvoker#run - L.1047
-- //AsyncMessageListenerInvoker#executeOngoingLoop - L.1158
-- -- //AsyncMessageListenerInvoker#invokeListener - L.1166
-- -- -- AsyncMessageListenerInvoker#initResourceIfNecessary - L.1184
-- -- -- -- AbstractJmsListeningContainer#getSharedConnection - L.491

-- -- -- //AbstractPollingMessageListenerContainer#receiveAndExecute - L.232
-- -- -- -- //ChainedTransactionManager#getTransaction - L.101
-- -- -- -- -- //MultiTransactionStatus#registerTransactionManager - L.68
-- -- -- -- -- //JmsTransactionManager#getTransaction - L.373
-- -- -- -- -- -- JmsTransactionManager#doBegin - L.186 ★BREAKPOINT

-- -- -- //AbstractPollingMessageListenerContainer#receiveAndExecute - L.235
-- -- -- -- AbstractPollingMessageListenerContainer#doReceiveAndExecute - L.302 - ☆AsyncRcv ★BREAKPOINT
-- -- -- -- -- //AbstractPollingMessageListenerContainer#receiveMessage - L.416
-- -- -- -- -- //AbstractMessageListenerContainer#doExecuteListener - L.651
-- -- -- -- -- -- //AbstractMessageListenerContainer#invokeListener - L.681
-- -- -- -- -- -- -- //MessagingMessageListenerAdapter#onMessage - L.69
-- -- -- -- -- -- -- -- //MessagingMessageListenerAdapter#invokeHandler
-- -- -- -- -- -- -- -- -- //MyJmsListener - ☆transaction boundary
-- -- -- -- -- -- -- -- -- -- //MyServiceImpl - ☆transaction boundary
-- -- -- -- -- -- -- -- -- -- -- JmsTemplate#doSend - L.591 - ☆SyncSend ★BREAKPOINT
-- -- -- -- -- -- -- -- AbstractAdaptableMessageListener#sendResponse - L.399 - ☆Reply ★BREAKPOINT

-- -- -- -- -- //AbstractMessageListenerContainer#doExecuteListener - L.665
-- -- -- -- -- -- AbstractMessageListenerContainer#commitIfNecessary - L.757 ★BREAKPOINT
-- -- -- -- -- -- -- //JmsUtils#commitIfNecessary - L.217
-- -- -- -- -- //AbstractMessageListenerContainer#doExecuteListener - L.658
-- -- -- -- -- -- //AbstractMessageListenerContainer#rollbackOnExceptionIfNecessary - L.800
-- -- -- -- -- -- -- JmsUtils#rollbackIfNecessary

-- -- -- //AbstractPollingMessageListenerContainer#receiveAndExecute - L.249
-- -- -- -- //AbstractPlatformTransactionManager#commit
-- -- -- -- -- JmsTransactionManager#doCommit - L.234 ★BREAKPOINT

-------------------------------------------------------------------------- :loop

tag : Spring JMS transaction JmsUtils JmsTemplate ChainedTransactionManager JmsTransactionManager

2017-07-13 21:39 : 開発 : コメント : 0 : トラックバック : 0 :

[開発][JMS] ActiveMQ Broker な話

apache-activemq-5.14.1

■ Running an ActiveMQ Broker
組込Brokerを使いたい場合は「How do I embed a Broker inside a Connection」参照

先ず、ActiveMQ Brokerの実行
cd C:\apache-activemq-5.14.1\bin
activemq console

次に、brokerの挙動を指定。方法は3つ。推奨されるのは Broker XBean URI。

- Broker Configuration URI での指定
  e.g.
  activemq console broker:(tcp://localhost:61616,network:static:tcp://remotehost:61616)?persistent=false&useJmx=true

- Broker XBean URI での指定
  e.g.
  activemq console xbean:foo.xml

- Broker Properties URI での指定
  e.g.
  activemq console properties:foo.properties

 ref.
 http://activemq.apache.org/broker-xbean-uri.html

Web ConsoleでActiveMQの監視
 http://localhost:8161/admin
 admin/admin

以下の場合は、本家サイト参照
- brokerをServletエンジンで実行させる場合
- brokerをJ2EEアプリサーバで実行させる場合
- brokerをソースコードで実行させる場合
- brockerをmavenで実行させる場合

brokerのfailover時に、brokerが自動でdetectして再接続するようにする為には、
 URIを以下のように変える
 failover:tcp://host:port
 ref.
 http://activemq.apache.org/configuring-version-5-transports.html

ref.
Running an ActiveMQ Broker
http://activemq.apache.org/version-5-run-broker.html

■ Broker XBean URI での指定方法
対象のフォルダの在り処
C:\apache-activemq-5.14.1\conf\activemq.xml

ActiveMQ ver5.3 以降のものには KahaDBが推奨される

AMQ Message Store とは
ActiveMQ ver5+ にあるデフォルトのストレージ。
組み込み式トランザクションが張られたメッセージの処理に有用
メッセージのコマンドは、transaction journalに書き込まれる
deta logとして残す事で、メッセージを永続化している。=default kaha

□ 設定
デフォルトでは、AMQ Store が使用されるが、永続化などamqPersistenceAdapterで設定変更可能
e.g.
<'broker brokerName="broker" persistent="true" useShutdownHook="false">
  <'persistenceAdapter>
    <'amqPersistenceAdapter directory="${activemq.base}/activemq-data" maxFileLength="32mb"/>
  <'/persistenceAdapter>
  <'transportConnectors>
    <'transportConnector uri="tcp://localhost:61616"/>
  <'/transportConnectors>
<'/broker>

tag : ActiveMQ Broker JMS activemq AMQ

2017-07-13 21:32 : 開発 : コメント : 0 : トラックバック : 0 :

[開発][JMS] AMQで電文永続化

AMQでのJMSメッセージを永続化したい

ActiveMQは予期せぬエラーでMessageBrokerが終了してしまった場合、未送信のメッセージを保持する機能を持っています。」
これがしたい。

使用する JMS MOM(Message Oriented Middleware)は Active MQ。
永続化先はデータベース
アプリ側は Spring、DBは PostgreSQL を使いたい。

とか色々と思考したけど、
管理コンソールの「Send To」で「Persistent Delivery」にチェックすれ良いだけだった!爆
http://127.0.0.1:8161/admin/send.jsp?JMSDestination=TmpTestQueue&JMSDestinationType=queue

ref.
ActiveMQでメッセージキューを実装する, 2013.07.24
http://www.geek.sc/archives/1030
AMQ x MySQL

Efficient Lightweight JMS with Spring and ActiveMQ, 2009/10/16
https://codedependents.com/2009/10/16/efficient-lightweight-jms-with-spring-and-activemq/
Spring x AMQ (incl. ExceptionListener)

JMS PERSISTENCE
http://forum.spring.io/forum/spring-projects/integration/jms/10577-jms-persistence
how to get msgs redelivered as soon as restarting a server after a failover, using AMQ x JDBC x embeddedBroker

Spring Boot Example of Spring Integration and ActiveMQ
https://dzone.com/articles/spring-boot-example-of-spring-integration-and-acti

etc.
http://activemq.apache.org/spring-support.html
http://activemq.apache.org/version-5-run-broker.html
http://activemq.apache.org/how-do-i-embed-a-broker-inside-a-connection.html
http://activemq.apache.org/how-can-i-monitor-activemq.html

--------------------------------------------------

[脱線] H2とは
H2 Database Engineは、Apache Derby、HSQLDB、Berkeley DB と並ぶ組み込みデータベース
中でもH2はパフォーマンスが高いと言われる
http://www.h2database.com/html/main.html
特徴
・全てJava。でもネイティブ版もある。
・組込モードとサーバモードとある
・クラスタリングにも対応

[脱線] PostgreSQL の操作
手段は主に3つ

□ WIndowsのコマンドプロンプトでPostgresSQL操作
スタートメニュー>コマンドプロンプト
"C:/Program Files/PostgreSQL/9.4/bin/psql" postgres postgres
select * from pg_tables where not tablename like 'pg%' order by tablename;

□ PostgresSQL付属のコマンドラインアプリで操作
スタートメニュー>SQL Shell(psql)を起動

□ pgAdminでPostgresSQL操作
http://www.pgadmin.org/ からmsiファイルをDLして来てインストール
スタートメニュー>pdAdminIIIを実行
「サーバに接続の追加」>適当に名称入れて、接続パスワード(postgresインストール時に設定したヤツ)だけ入れて後はデフォルトのまま「OK」
繋がらない場合に確認>C:\Program Files\PostgreSQL\9.4\data\postgresql.conf
PostgreSQLで外部からのTCP接続を許可していない場合があるので。
要チェックなパラメータ
listen_addresses TCP接続を許可するIPアドレスを指定。デフォルトは「localhost」で、自分自身のサーバーからしか接続を許可しない。
port 待ち受けるポート番号を指定。デフォルトは5432。
log_destination PostgreSQLが出力するログ出力先を指定。
pg_hda.confファイルの編集

tag : AMQ JMS ActiveMQ MessageBroker MOM Spring PostgreSQL PERSISTENCE H2

2017-07-07 20:06 : 開発 : コメント : 0 : トラックバック : 0 :

Sphinx / reStructuredText の参照情報

このところは rst が主流のようで、、

Sphinx / reStructuredText の参照情報

reStructuredText構文
http://www.ne.jp/asahi/hishidama/home/tech/sphinx/rest.html
はやわかり reStructuredText
http://www.planewave.org/translations/rst/quickref.html/restructuredtext.html
Sphinxでの文章の書き方(reStructuredText)
http://planset-study-sphinx.readthedocs.io/ja/latest/04.html

tag : Sphinx reStructuredText rst

2017-07-07 20:02 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] 文字化けな話

H2から取って来たデータが文字化けする。

とりあえず、
STS>Run>Run Configurations... >Common>Encoding>Other>UTF-8
にしとけ。

Something Detail:
spring-jdbc-4.2.7.RELEASE.jar>META-INF>spring.handlers
org.springframework.jdbc.config.JdbcNamespaceHandler
InitializeDatabaseBeanDefinitionParser ext. AbstractBeanDefinitionParser#parseInternal(element, parserContext)
DatabasePopulatorConfigUtils.setDatabasePopulator(element, builder)
getAttribute("encoding")
EncodedResource#encoding

tag : Spring spring jdbc H2 STS Encoding InitializeDatabaseBeanDefinitionParser JdbcNamespaceHandler

2017-07-07 19:57 : 開発 : コメント : 0 : トラックバック : 0 :

[開発][谷本心] Java本格入門

Chap.1 Javaの基本を知ろう

Java SE – Standard Edition
Java EE – Enterprise Edition
Java ME – Micro Edition
JRE – Java Runtime Environment
JDK – Java Development Kit


Chap.2 基本的な書き方を身につける

Java VM – HotSpot, JRockit, IBM JVM, HP-UX JVM, Zing, OpenJDK

Javaの基本的な記法
- 文とブロック
- コメント
- 変数、型、リテラル ※ リテラル = 変数に代入する値を具体的に表現したもの
- 演算子:単項演算子, 二項演算子, 三項演算子
- 数術演算子:+, -, *, /, %, - (単項演算子), ++ (単項演算子), -- (単項演算子)
- 関係演算子:==, !=, >, >=, <, <=, instanceof
- 条件演算子:<条件> ? 式1 : 式2
- 論理演算子:&&, ||, ! (単項演算子)
- ビット演算子:&, |, ^ (ビット演算XORを行う), <<, >>, >>>, ~ (単項演算子, bitを反転する)
- 代入演算子:=, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, >>>=
- 文字列結合に利用する演算子:+, +=
- 制御構文:if, switch, for / for-each, while / do…while
- クラスとメソッド
- 修飾子:アクセス修飾子, abstract修飾子, static修飾子, final修飾子, transient修飾子, volatile修飾子, synchronized修飾子, native修飾子, strictfp修飾子
# static – classがinstance化されていなくてもaccessできるmemberに付ける
# final – 大文字のスネークケースで定義する
# transient – objectのserialize時にserialize対象から除外される
# volatile – multithreadからaccessされるfieldがthread毎にcacheされないようにする
# synchronized – 同時に1threadだけ実行できることを指定する
# native – C/C++などJava以外のnative codeを呼び出すことを指定する
# strictfp – 浮動小数点をIEEE 754企画で厳密に処理することを指定する
- メソッドのオーバーライド
- インスタンス
- thisを用いた記述の注意点
- コンストラクタ

- Javadoc
- アノテーション - @Override, @Deprecated. @SuppressWarnings
- クラスと変数はキャメルケースで、定数はスネークケースで
- 変数名の後ろに_は付けない
- 変数は名詞、メソッドは動詞で命名すべし
- 「不吉な匂い」がする名前は要注意

Chap. 3 型を極める

Javaは静的型付け言語
# 言語次第で型が決まるtiming異なる―静的片付け言語 と 動的型付け言語
# JavaScriptやRubyは動的片付け言語
Javaの型は2種類 ― プリミティブ型 と 参照型
プリミティブ型:byte, short, int, long, char, float, double, Boolean
- リテラルによるプリミティブ型変数の宣言 ― ★なだ謎い
- ライドニングとナローイング ― e.g. int intNum = shourtNum; // ワイドニングによる自動変換

参照型
- 参照(ポインタ)
- 文字列リテラル
- nullリテラル

ラッパークラス
- プリミティブ型(基本型)はobjectでなく単なるvalue = methodを持たない
- プリミティブ型に対する操作はラッパー(参照型)に入れて扱う - e.g. primitive: byte = wrapper: java.lang.Byte
- wrapperクラスによくあるmethodたち:#valueOf, #pareseXxx, #toString
- primitiveはnullを持てない = null checkが不要

オートボクシングとアンボクシング ― 「==」演算子とかでは注意が必要
primitive  wrapper class への自動変換 = オートボクシング Autoboxing
wrapper class  primitive への自動変換 = アンボクシング Unboxing
autoboxing/unboxingは利用せずに明示的に変換するのが無難

クラスを定義する
パッケージ
# FQCN = fully qualified class name
アクセス修飾子
- 対クラス:public, default
- 対メソッド:public, protected, default, private
その他の修飾子:static, final

継承
抽象クラス
インタフェース
匿名クラス - ref. ラムダ式
Nested class - ref. Effecitve Java 第2版

Instanceof演算子
オブジェクトの等価性
- hashCodeメソッド - 自身のobjectの内容を新た巣数値(ハッシュ値)=同じ値を持つオブジェクトは同じハッシュ値となる
- ハッシュ値比較はequals比較より速い。※ hashCodeとequalsを両方が等価条件
- Objects.hash で hashCode 作れる (Java 7 +)
- デフォのtoString は、基底クラスのObject#toString のhashCode になる
- メソッドチェイン形式での文字連結 = StringBuilder#append

型にまつわる問題の予防
列挙型 enum
- public static finalは型安全でない=不正に動作する可能性あり
- 大文字で定義するのはpublic static finalと同じ
- switch 文にも利用可能
- enumのconstructor は privateとすること

ジェネリクス (総称型) – java 5 +
List list = new ArrayList<>();
# Java 7+であればダイヤモンドオペレータで略式定義が可能
Stack, push, pop, remove – null check 要。
仮型パラメータE でジェネリックス定義例
List list;
# list.forEach(stack::push)なことも可能
public class HogeClass
# extends 以外にsuper, 不定を表す?も使用可能- cf. Effective Java 第2版


Chap. 4 配列とコレクションを極める
System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
Int[] newArray2 = Arrays.copyOf(oldArray, oldArray.length + 2);
上記両者の性能は互角
Int[] array = {1, 1, 2, 3, 5, 8, 13};
System.out.println(array);  [I@1bb60c3 = [ (配列) + I (int型) + @1bb60c3 (ハッシュ値)
System.out,println(Arrays.toString(array));  [1, 1, 2, 3, 5, 8, 13]
Arrays.sort(array);
プリミティブ型の場合  値の昇順でsort
オブジェクト型の場合  Comparable インタフェースの compareTo でsort ( = ComparableをimplしてないとClassCastException)

Sort by Comparable  デフォルトソートとして利用
Sort by Comparator  業務的に必要な順序にソート

Arrays.binarySearch (2分探索)

void hogeMethod(String… args)

Collection > List, Set, Map

List : ArrayList, LinkedList(順序保持リスト), CopyOnWriteArrayList(ThreadSafeなArrayList)
add, addAll, set, remove, removeAll, retainAll (一致しない要素の削除), clear
get, size, isEmpty, subList, toArray
contains, containsAll, indexOf, lastIndexOf
iterator, listIterator
Collections.sort

for (String element : list) { … }
*
for (Iterator iterator = list.iterator(); iterator.hasNext(); ) {
….String element = iteratory.next();
….System.out.println(element);
}
*
Iterator iterator = students.iterator();
while (literator.hasNext()) {
….Student student = iterator.next();
….if (student.getScore() < 70) {
……..iterator.remove();
….}
}

ArrayList: 追加○, 挿入○, 値取得◎, 検索×  for文を使う
LinkedList: 追加◎, 挿入◎, 値取得×, 検索×  要素の追加削除が多い
CopyOnWriteArrayList: 追加○, 挿入○, 値取得◎, 検索×  複数threadからの同時アクセスあり

Map
HashMap:
-内部のHashTableにデータ保持=参照が速い
-無限ループに注意
-ThreadSafeでない。→ synchronizedにするかThreadSafeのConcurrentHashMapを使う
LinkedHashMap
-HashMapのSubClass
-要素追加順を保持する
TreeMap
-二分探索木

HashMap: 追加◎, 取得◎, 列挙◎
LinkedHashMap: 追加◎, 取得◎, 列挙◎
ConcurrentHashMap: 追加○, 取得○, 列挙○
TreeMap: 追加△, 取得△, 列挙△

Set: 重複を持たない
HashSet
LinkedHashSet
TreeSet
# ThreadSafeなSetが欲しい時はCollections.newSetFromMap(new ConcurrentHashMap())で作れる

Queue#poll, peek
Deque

Chap. 5 ストリーム処理を使いこなす - ラムダ式とStream API -


pp.150

tag : 谷本心 Java本格入門

2017-06-27 23:15 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Message Brocker って結局、何者?

tag.
JMS Message Brocker MOM Queue

■ ことのはじまり
JMSで送受信する電文(メッセージ)が環境障害時に消失しないよう、DBなりに永続化して置きたい
その為に、単純にMOMに繋げるのではなく、Brokerを仲介させる必要があるげ?

てか、broker を今ひとつ掴み切れて無い
WebSphere Message Broker とか rich な感じはぷんぷんするが必須なのか?何が嬉しいのだ?

■ JMS Message Broker の意義
JMS Messaging product に含まれる物:
-Brocker: A JMS broker provides connectivity, message storage, and message delivery functions to its clients. It also provides quality of service features, such as reliability, persistence, security, and availability.
- Messages
- Destinations
- Clients (Producer / Consumer)
- Connections: Connections are the technique used by clients to specify a protocol and credentials for a sustained client interaction with a broker.
- Sessions: Sessions are defined by a client on a conection established with a broker. Each session defines whether the messages will form transactions, and -- if not -- the acknowledgement mode for messages.

画像検索してもなんだかBrockerがJMSの一部というかQueueなりTopicなりの実体を保持する輩に見えるが
WebSphere MQ と WebSphere Message Brock と別にあるということは別物。ん?どゆこと?

「ActiveMQでは中継を行うサーバのことをMessageBrokerと呼んでいます。」 (TechScore)
「WebSphere Message Brokerはそんな時代にEAIにおける「ハブ」製品」 (IBM developerWorks)

そもそも共通定義が無い!?
「There is not really an official definition for what a JMS broker is, but there is conceptual difference between a message queue and broker.」 (stackoverflow)
ビンゴ!共通定義はないが、Queue と Message Brocker は別物。

┏━━━━━━━━━━━━━━━━━━━━
┃■ Queue は、
┃msg の header だけを見る。それを元に電文送信する。
┃msg の body は決して見ないし、msg の変換とか変な事も一切しない。
┃悪までも電文送信が任務。

┃■ Message Brocker は、
┃Queue と違ってプログラム実行環境を提供する。
┃なので、msg の body を解析したり、よしなに変換したりできる。
┃=ミドルなりアプリのversion upで生じたひずみを吸収することも可能。

┗━━━━━━━━━━━━━━━━━━━━

Message Brocker の一番の意義は、

The big value of message brokers is that they can do some really nice things for you for handling message concurrently, fail-over for processing logic, deploying of processing logic, monitoring and logging ... etc. Think of a message broker as a specialized application server for writing message processing code, possibly in a custom high level language. For example IBM message broker can be programmed in a ESQL an extension of SQL along with a diagrams and nodes that you connect with each other. Programs written for a message borker will be shorter than if you wrote all the code yourself using plain JMS.

Brokers can be centralized or distributed, so for example you can have a central broker in New York, an have clients in London and Hong kong connected to it. Or you could have the broker be distributed and have an instance running in London and Hong kong which do the message processing closer to the source / destination of the message, it will all depend on your management infrastructure and what other resources like databases the message broker needs to talk to.


ref.
エンタープライズ・メッセージング! JMS編 前編
http://www.acroquest.co.jp/webworkshop/JavaNetwork/NP_lecture05.html
CORBA等のRPC(Remote Procedure Call)という通信方式とJMSとの違い

JMS Basics, JMS components
https://access.redhat.com/documentation/en-US/Fuse_Message_Broker/5.4/html/Getting_Started/files/FuseMBStartedKeyJMS.html
MOMが包含する登場人物の紹介。分かり易い

JMS Development, Basic broker application components
https://access.redhat.com/documentation/en-US/Red_Hat_JBoss_Fuse/6.0/html/Product_Introduction/files/JMSdev.html
アプリ側の処理フロー。分かり易い

JMS Messaging Objects and Patterns, Sun Java System Message Queue 4.1 Technical Overview
https://docs.oracle.com/cd/E19717-01/819-7759/aeras/index.html
RedHatより深いが、その割には分かり易そう

JMSの基礎, 2006.09.20
http://www.techscore.com/tech/Java/JavaEE/JMS/1/
ActiveMQサーバ/MessageBrokerの起動

What is the responsibility of a JMS broker in the JMS Eco system?
https://stackoverflow.com/questions/14152648/what-is-the-responsibility-of-a-jms-broker-in-the-jms-eco-system
JMS Brokerとは何か。


tag : JMS Message Brocker MOM Queue WebSphere MQ

2017-06-07 13:58 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Spring JMS の AbstractMessageListenerContainer っていう奴

tag:
JMS Spring AbstractMessageListenerContainer AbstractPollingMessageListenerContainer DefaultMessageListenerContainer SimpleMessageListenerContainer sessionAcknowledgeMode acknowledge sessionTransacted JtaTransactionManager JmsTransactionManager TransactionAwareConnectionFactoryProxy


Java 1.0a(アルファ版)がダウンロードできるようになったのが1994年
対し、JMSのfirst releaseが2001年
その差たった7年
Javaはともかく、JMSが未だに現役なのが凄い

両者とも取り巻く登場人物の変化は大きい
一番はやはりSpring?になるのか?
そのSpringも決してJMSを無視して折らず、Spring JMSがある
https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/jms.html


JMSのそもそも仕様で、
開発者部品の任意のタイミングでJMS Providerに接続して電文を受信する同期受信と
JMS Providerが電文を受信したタイミングで開発者部品が呼び出される非同期受信とあるが、
Springもまたその両方をサポートしている。
特に後者の非同期受信でスポットライトを浴びるのが以下のSpringのクラスたち
AbstractMessageListenerContainer - AMLC
├- AbstractPollingMessageListenerContainer - APMLC
│ └- DefaultMessageListenerContainer - DMLC
└- SimpleMessageListenerContainer - SMLC

こやつ等を使用した非同期電文受信からのDB更新を同一トランザクションで管理できるか
というテーマが繰り広げられる訳なのだが、

その前提ともなる大切な事がAMLC のJavadocにしれっと書いてるのでメモメモ
Class AbstractMessageListenerContainer
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/listener/AbstractMessageListenerContainer.html
・ JMS の MessageListener を使うでも Spring SessionAwareMessageListener を使うでも良し
・ 通常はJMS Connectionを1つだけ保持し、全てのlistenerがそれを使いまわす。=超標準的なJMSのlistener sessionの管理方法
・ 外部リソースと同一トランザクションにするなどXAを使用する時は新規にConnectionを設ける。プロセスの登録はサブクラス依存
NOTE:
- デフォルトの message listener container は、如何なる例外が発生しようとも、log だけ吐いて JMS Provider へ回さない。
  =非同期受信がrollbackされ、一度受信した電文がQueueに返ることは無い ★留意されたし★
- と言えども、その発生例外をハンドリングしたい場合は、setErrorHandler で任意の例外ハンドラを設定すること
  ただし、その例外ハンドラは ExceptionListener が呼ばれた後に呼ばれることにご注意あれ ★留意されたし★

非同期受信した電文をQueueからdeleteしても良いかをJMS Providerに伝える仕組みがacknowledgeなるもの
acknowledgeすると電文がQueueから消える訳だが、コイツがまた曲者。


AMLC が提供する acknowledge オプションは以下の4つ:
- 1. sessionAcknowledgeMode = AUTO_ACKNOWLEDGE (default)
- 2. sessionAcknowledgeMode = DUPS_OK_ACKNOWLEDGE
- 3. sessionAcknowledgeMode = CLIENT_ACKNOWLEDGE
- 4. sessionTransacted = true

各オプションの詳細:

-- 1. sessionAcknowledgeMode = AUTO_ACKNOWLEDGE (default)
DMLC の場合 >>
  非同期受信した電文をacknowledgeしてから、listenerが呼ばれる。 ★留意されたし★
  電文のロールバックは起こりえず、同一電文が他のlistenerに食われることもない=同一電文の再配信なし ★留意されたし★
SMLC の場合 >>
  listenerが呼んでから、非同期受信した電文をacknowledgeする。 ★留意されたし★
  どんな例外が発生しようが電文のロールバックはしない=同一電文の再配信なし(DMLCと同じ) ★留意されたし★
  ※ ただし、JVM異常時はロールバックする可能性あり

-- 2. sessionAcknowledgeMode = DUPS_OK_ACKNOWLEDGE
lazy message acknowledgmentをするだけで、後はAUTO_ACKNOWLEDGEの時に同じ

-- 3. sessionAcknowledgeMode = CLIENT_ACKNOWLEDGE
呼び出されたlistenerの処理が成功した場合にのみacknowledgeする。
例外発生時は「best effort」で非同期受信をロールバックする=同一電文の再配信あり

-- 4. sessionTransacted = true
呼び出されたlistenerの処理が成功した場合にのみacknowledgeする。
例外発生時は「必ず」で非同期受信をロールバックする=同一電文の再配信あり

そんなこんなで同一電文の重複配信(duplicate message processing problem)の可能性は拭えない
対処法は2つ
・listenerに重複判定するロジックを入れる。cf. JMSRedelivered flag
・XAトランで全処理をラップする。
※ XAトランはオーバーヘッドがかかる点に留意されたい


☆ 推奨手法
sessionTransacted = ture にしとくがよろし。
  特に listener からlocalのDBを更新する場合。
  ただし、重複配信の対策はロジックでよしなにやる必要あり。
・ もしくは、JtaTransactionManager をtransactionManagerに設定してXAトランにする。

☆ 注意
XAトランかJTAの場合にのみ、JmsTransactionManagerを使用し、
それ以外の場合は、sessionTransacted を使用するのが良い (JtaTransactionManagerは使わずに)。


所変わって、APMLC
AbstractPollingMessageListenerContainer#setTransactionManager
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/listener/AbstractPollingMessageListenerContainer.html#setTransactionManager-org.springframework.transaction.PlatformTransactionManager-
電文の受信とlistener処理をwrapするトランのマネージャを登録する。
デフォはnull
設定される場合は、基本 Spring の JtaTransactionManager かそのさぶクラス。JTA-aware ConnectionFactory とsetで使用するのが王道

NOTE:
JTA より local JMS transaction の使用を検討すべき。
local JMS transaction なら、単純にsessionTransactedをtrueにするだけで、非同期受信以降の SessionAwareMessageListenerで呼び出されるsessionを包括できる。
つまり、JmsTransactionManagerと同等のことをlocal JMS transactionで叶う。


で、そのJmsTransactionManagerとは何ぞや?
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/connection/JmsTransactionManager.html
・ 任意のConnectionFactoryからConnectionとsessionを取得してthreadに割り振るのが仕事。
・ local strategyで、JTA でのJMS実行の代替手段
・ Prosは、如何なる環境で作動すること。Standaloneでもtest suiteでもmessage brokerとの連携だって可能。
・ Consは、JMSトランとDBトランを1トランで扱うなどのJTA/XAトランの制御はできない。それやるなら、SpringのJtaTransactionManagerをstrategyとすべき。


## なんかもやっとする
## AUTO_ACKNOWLEDGEやDUPS_OK_ACKNOWLEDGEは良いけど、
## sessionTransacted=trueで基本的に有無言わさず非同期受信をcommit(acknowledge)するかどうか記述が曖昧
## sessionTransactedにする場合は、JVM死亡時以外は非同期受信電文のrollback無しな表現がまた曖昧
## plus, 仮にJVM死亡時以外は非同期受信電文のrollback無しの場合、他のacknowledge optionとの違いは何??


で、ググってたら新キャラ登場
TransactionAwareConnectionFactoryProxy - TACFP
ref.
Dr. David Syer, Distributed transactions in Spring, with and without XA - Seven transaction-processing patterns for Spring applications, JAN 6, 2009 12:00 AM PT
http://www.javaworld.com/article/2077963/open-source-tools/distributed-transactions-in-spring--with-and-without-xa.html
な、長い..

tag : JMS Spring AbstractMessageListenerContainer AbstractPollingMessageListenerContainer DefaultMessageListenerContainer SimpleMessageListenerContainer sessionAcknowledgeMode acknowledge sessionTransacted JtaTransactionManager

2017-06-05 20:02 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] CSRF/XSSはいずれも脆弱性の1つで、もしくはそれを利用した攻撃のことを言う

cross-site request forgeries
クロスサイトリクエストフォージェリ
CSRF (シーサーフ)
リクエスト強要

Webアプリケーションの脆弱性の一つもしくはそれを利用した攻撃

別のサイトに用意したコンテンツ上の罠のリンクを踏ませること等をきっかけとして、
インターネットショッピングの最終決済や退会等Webアプリケーションの重要な処理を呼び出すようユーザを誘導する攻撃である。

ブラウザが正規の Webコンテンツにアクセスした際には毎回、
セッションを維持するために所定の Cookie、Basic認証データあるいは Digest認証データがブラウザから Webサーバ宛に送出されるという性質を、この攻撃は悪用する。

----------------------------------------

cross site scripting
クロスサイトスクリプティング
XSS

他人のWebサイトへ、悪意のあるスクリプトを埋め込むこと
Webアプリケーションの脆弱性もしくはそれを利用した攻撃
Webサイトへの代表的な攻撃手法

----------------------------------------

相違

同じ>
― どちらも「クロスサイト」という言葉が先頭につく
― なりすましのようなことが結果としてできる
― どちらも受動型攻撃である

違う>
XSSはブラウザ上でスクリプトが動き、CSRFはサーバー上でスクリプトが動く


ref.
リクエスト強要(CSRF)対策
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/301.html
クロスサイトスクリプティング(XSS)とCSRFの違い早分かり
http://d.hatena.ne.jp/ockeghem/20071203/p1

tag : XSS CSRF

2017-04-22 00:36 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Authentication vs. Authorization vs. Verification

Authentication
認証
ユーザIDとパスワードとか本人確認をしてサービスにログインするときなどに使用

Authorization
認可
認証してサービスにログインするわけではなく、特定の期間や特定の条件のもとで情報へのアクセスを認可するときなどに使用
=ログイン処理を通さずにサービスやユーザ情報を取得したりする

Verification
検証
サービス提供側がその人が今ログイン使用としてるユーザと本当に同じ人物なのか確認


cf.
- OAuthは、authentication より authorization として使用されるべき、と。
- Googleは、2-Step Verification
- Githubは、2-factor Authentication


ref.
【プログラマ英語】それ認証って意味じゃないですよ(厳密には)
http://qiita.com/tienlen/items/9e1b58dd173472f071c0

tag : Authentication Authorization Verification

2017-04-21 22:00 : 開発 : コメント : 0 : トラックバック : 0 :

[ORM][MyBatis] 単純な文字列リストを入れ子に持つBeanへのResultMap定義

■ 事象
The content of element type "resultMap" must match "(constructor?,id*,result*,association*,collection*,discriminator?)". mybatis
要素タイプ"resultMap"のコンテンツは"(constructor?,id*,result*,association*,collection*,discriminator?)"と一致する必要があります。
org.apache.ibatis.builder.BuilderException
org.xml.sax.SAXParseException
 
■ 原因
resultMap の Schema 違反
 
■ 対応
以下のように result の定義を全部 collection の前にする
|    <'resultMap id="accountMap" type="myproject.Account">
|        <'id property="userId" column="user_id" />
|        <'result property="firstName" column="first_name" />
|        <'result property="lastName" column="last_name" />
|        <'result property="status" column="status" />
|        <'result property="lastUpdate" column="last_update" />
|               <'collection property="roles" ofType="java.lang.String" javaType="list">
|                   <'result column="role_column" />
|               <'/collection>
|    <'/resultMap>
 
Beanのfield定義順にしたいところだけど、以下のようにしてはダメ
|    <'resultMap id="accountMap" type="myproject.Account">
|        <'id property="userId" column="user_id" />
|        <'result property="firstName" column="first_name" />
|        <'result property="lastName" column="last_name" />
|               <'collection property="roles" ofType="java.lang.String" javaType="list">
|                   <'result column="role_column" />
|               <'/collection>
|        <'result property="status" column="status" />
|        <'result property="lastUpdate" column="last_update" />
|    <'/resultMap>
 
[参考] SQL 定義はこんな感じ
    <'select id="findOne" parameterType="String" resultMap="accountMap">
    <'![CDATA[
        SELECT
            a.user_id,
            a.first_name,
            a.last_name,
            r.role as role_column,
            a.status,
            a.last_update
        FROM
            ACCOUNT_TBL a, ROLE_TBL r
        WHERE
            a.user_id = #{userId}
            AND a.user_id = r.rltbl_user_id
    ]]>
    <'/select>
 
[参考] Beanはこんな感じ
public class Account implements Serializable {
 
              private static final long serialVersionUID = 1L;
 
              private String userId;//user_id
              private String firstName;//first_name
              private String lastName;//last_name
              private List<'String> roles;//role
              private String status;//status
              private Date lastUpdate;
 
[参考] こんな書き方もいろいろ ― 未検証w
 
    <'select id="findOne" parameterType="String" resultMap="accountMap">
    <'![CDATA[
        SELECT
            a.user_id,
            a.first_name,
            a.last_name,
            (
                SELECT r.role as role_column
                FROM role_tbl r
                WHERE rltbl_user_id = #{userId}
            ),
            a.status,
            a.last_update
        FROM
            ACCOUNT_TBL a, ROLE_TBL r
        WHERE
            a.user_id = #{userId}
            AND a.user_id = r.rltbl_user_id
    ]]>
    <'/select>
 
----------
             
    <'resultMap id="accountMap" type="account.master.system.pilot.domain.model.Account">
        <'id property="userId" column="user_id" />
        <'result property="firstName" column="first_name" />
        <'result property="lastName" column="last_name" />
        <'result property="status" column="status" />
        <'result property="lastUpdate" column="last_update" />
        <'result property="roles" javaType="java.util.List" resultMap="mapForPropRoles" />
    <'/resultMap>
    <'resultMap id="mapForPropRoles" type="java.lang.String">
        <'result property="roles" column="role_column" jdbcType="VARCHAR" javaType="java.lang.String" />
    <'/resultMap>
             
----------
 
    <'resultMap id="accountMap" type="account.master.system.pilot.domain.model.Account">
        <'id property="userId" column="user_id" />
        <'result property="firstName" column="first_name" />
        <'result property="lastName" column="last_name" />
        <'result property="status" column="status" />
        <'result property="lastUpdate" column="last_update" />
        <'collection property="roles" column="userId" javaType="ArrayList" ofType="String" select="findUserRoles">
            <'result property="value" column="role_column"/>
        <'/collection>
    <'/resultMap>
 
                  <'select id="findUserRoles" resultType="String">
                  <'![CDATA[
                      SELECT
                          role as role_column
                      FROM
                          ROLE_TBL
                      WHERE
                         rl_user_id = #{userId}
                  ]]>
    <'/select>
 
----------
 
ref.
http://mybatis.org//dtd/mybatis-3-mapper.dtd
Mybatis resultmap to map values to hash map field of a model, stckoverflow, Dec 6 '12 at 16:46
http://stackoverflow.com/questions/13548349/mybatis-resultmap-to-map-values-to-hash-map-field-of-a-model
https://github.com/mybatis/mybatis-3/issues/364
http://stackoverflow.com/questions/1127992/how-do-you-map-a-liststring-in-ibatis
ネストされた select を使って collection を読み込む
http://www.mybatis.org/mybatis-3/ja/sqlmap-xml.html
Nested Select for Collection
http://www.mybatis.org/mybatis-3/sqlmap-xml.html
 
tag:
ORM MyBatis iBatis nested list string resultmap collecon BuilderException SAXParseException 1:N

tag : ORM MyBatis iBatis nested list string resultmap collecon BuilderException SAXParseException

2017-03-29 23:04 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Spring related troubles faced in March, 2017

------------------------------
## 1       
tag: spring-security NoSuchBeanDefinitionException     
 
open-date: 2017/3/13          
trouble:
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'userDetailsService' is defined          
 
close-date: 2017/3/13         
shooting:
spring-security.xml
    <'sec:authentication-manager>
        <'sec:authentication-provider user-service-ref="userDetailsService">
            <'sec:password-encoder ref="passwordEncoder" />
        <'/sec:authentication-provider>
    <'/sec:authentication-manager>
userDetailsService
 
UserDetailServiceImpl implements UserDetailsService としていた為、bean名が合致していなかった。
HogeRepositoryをInjectする時は、Interface名でautowiredされてるのと混同してた。ココは普通のref-beanなので真面目なbean名が正解。
 
 
------------------------------
## 2       
tag: spring-security jsp form-login     
 
open-date: 2017/3/13          
trouble:
http://localhost:8080/myProject/login.jsp
Resource Not Found Error!
Resource not found.
 
close-date: 2017/3/13         
shooting:
        <'sec:form-login
            login-page="/login.jsp"
            authentication-failure-url="/login.jsp?error=true" />
としてたのを、以下に修正
        <'sec:form-login
            login-page="/login/loginForm"
            login-processing-url="/login" />
実際のjspは「webapp/WEB-INF/views/login/loginForm.jsp」
 
 
------------------------------
## 3       
tag: spring-security jsp NotReadablePropertyException 
 
open-date: 2017/3/13          
trouble:
NotReadablePropertyException: Invalid property 'principal.account' of bean class [org.springframework.security.authentication.AnonymousAuthenticationToken]: Bean property 'principal.account' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?             
 
close-date: 2017/3/13         
shooting:
JSPで
<'sec:authorize access="isAuthenticated()">
せずに
${f:h(principal.account.firstName)}
した為の例外
 
 
------------------------------
## 4       
tag: jsp CannotRenderException       
 
open-date: 2017/3/13          
trouble:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.apache.tiles.request.render.CannotRenderException: An exception occurred processing JSP page /WEB-INF/views/layout/template.jsp at line 27
Caused by: org.apache.jasper.JasperException: /WEB-INF/views/login/loginForm.jsp (line: 4, column: 4) プレフィックス tでインポートされたタグライブラリには、タグ messatePanel は存在しません
 
close-date: 2017/3/13         
shooting:
凡ミス。スペルミス
t:messatePanel --> t:messagesPanel
 
 
------------------------------
## 5       
tag: jsp JasperException    
 
open-date: 2017/3/13          
trouble:
Caused by: org.apache.jasper.JasperException: /WEB-INF/views/login/loginForm.jsp (line: 4, column: 62) Attribute qualified names must be unique within an element          
 
close-date: 2017/3/13         
shooting:
<'t:messagesPanel messagesType="error" messagesType="error" messagesAttributeName="SPRING_SECURITY_LAST_EXCEPTION" />
messagesTypeが重複している。↓↓TOBE
<'t:messagesPanel messagesType="error" messagesAttributeName="SPRING_SECURITY_LAST_EXCEPTION" />
 
 
------------------------------
## 6       
tag: spring-security InternalAuthenticationServiceException          
 
open-date: 2017/3/13          
trouble:
spring-securityの認証項目をusernameでなくuserIdにしたい。
org.springframework.security.authentication.InternalAuthenticationServiceException: For input string: ""
at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:126)
Caused by: java.lang.NumberFormatException: For input string: ""
at account.master.system.pilot.domain.service.userdetails.AmspUserDetailsServiceImpl.loadUserByUsername(AmspUserDetailsServiceImpl.java:29)
 
close-date: 2017/3/13         
shooting:
loginForm.jspのinputのname/idはusernameにするか、小細工が要る。
AFTER:
            <'td><'input type="text" id="username" name="username" value="0001" />(0001)<'/td>
            <'!-- <'td><'input type="text" id="userId" name="userId" value="0001" />(0001)<'/td> -->
もしくは、
JSP ・・・ <'td><'input type="text" id="userId" name="userId" value="0001" />(0001)<'/td>
spring-security.xml ・・・
<'sec:form-login
    login-page="/login/loginForm"
    login-processing-url="/login"
    username-parameter="userId"/>
 
ref.
Spring Security Custom Login Form Annotation Example
https://www.mkyong.com/spring-security/spring-security-custom-login-form-annotation-example/
Spring Bootで認証を行う
http://blog.okazuki.jp/entry/2015/07/05/180726
 
 
------------------------------
## 7       
tag: spring-security TypeException    
 
open-date: 2017/3/13          
trouble:
spring-securityの認証項目をusernameでなくuserIdにしたい。
Caused by: org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='userId', mode=IN, javaType=class java.lang.String, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #1 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
 
close-date: 2017/3/13         
shooting:
なんか術あるんだろうけど、そりあえずの強行手段。 int 型をしぶしぶ String 型に定義しなおす
 
BEFORE
CREATE TABLE ACCOUNT_TBL (
    user_id int(4),
AFTER
CREATE TABLE ACCOUNT_TBL (
    user_id varchar(4),
 
 
------------------------------
## 8       
tag: Git  
 
open-date: 2017/3/14          
trouble:
git  push済みのcommitを揉み消したい      
 
close-date: 2017/3/14         
shooting:
get reset HEAD~
git push -f origin branchname
 
HEADの後の「~」が「直前の」コミットを意味する。2こ前のコミットを指したければ「~~」とする感じ。
 
ref.
git pushを取り消す
http://tweeeety.hateblo.jp/entry/2015/06/10/215753
さっきの取り消したい!って時のGitコマンドまとめ
http://qiita.com/kansiho/items/2bacecdb95d752cb38b7
 
 
------------------------------
## 9       
tag: jsp checkbox NestedServletException CannotRenderException           
 
open-date: 2017/3/14          
trouble:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.apache.tiles.request.render.CannotRenderException: java.io.IOException: JSPException including path '/WEB-INF/views/user/registerForm.jsp'.
Caused by: java.io.IOException: JSPException including path '/WEB-INF/views/user/registerForm.jsp'.
Caused by: org.apache.jasper.JasperException: /WEB-INF/views/user/registerForm.jsp (line: 40, column: 16) TLDに従ってタグ form:checkbox は空でなければいけませんが、そうではありません
 
close-date: 2017/3/14         
shooting:
<'form:checkbox path="status" label="ACTV" >ACTV<'/form:checkbox>
↓↓
<'form:checkbox path="status" label="ACTV" />
 
 
------------------------------
## 10     
tag: Spring MVC IllegalStateException            
 
open-date: 2017/3/14          
trouble:
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'userForm' available as request attribute   
 
close-date: 2017/3/14         
shooting:
Controllerで以下を実装する。
@ModelAttribute
public UserForm setUpForm() {
  UserForm form = new UserForm();
  return form;
}
 
 
------------------------------
## 11     
tag: Spring AOP BeanCreationException BeanCreationException NoSuchBeanDefinitionException        
 
open-date: 2017/3/14          
trouble:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'registerController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: account.master.system.pilot.domain.service.user.RegisterService account.master.system.pilot.app.user.RegisterController.registerService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [account.master.system.pilot.domain.service.user.RegisterService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@javax.inject.Inject()}
 
 
close-date: 2017/3/14         
shooting:
public class RegisterServiceImpl implements RegisterService {
↓↓
@Service
public class RegisterServiceImpl implements RegisterService {
 
 
------------------------------
## 12     
tag: jsp JasperException    
 
open-date: 2017/3/14          
trouble:
Caused by: org.apache.jasper.JasperException: /WEB-INF/views/user/registerForm.jsp (line: 10, column: 39) ${ タグが終了していません             
 
close-date: 2017/3/14         
shooting:
<'td><'form:input path="userId" />${f:h{userForm.userId)}<'/td>
↓↓ f:h"{" の括弧が合ってない
<'td><'form:input path="userId" />${f:h(userForm.userId)}<'/td>
 
 
------------------------------
## 13     
tag: jsp checkbox IllegalArgumentException    
 
open-date: 2017/3/14          
trouble:
Caused by: java.lang.IllegalArgumentException: Attribute 'value' is required when binding to non-boolean values  
 
close-date: 2017/3/14         
shooting:
<'form:checkbox path="status" label="INIT" />
↓↓
<'form:checkbox path="status" label="INIT" value="INIT" />
 
 
------------------------------
## 14     
tag: Spring MVC RequestMapping UnsatisfiedServletRequestParameterException    
 
open-date: 2017/3/14          
trouble:
<'form:form action="${pageContext.request.contextPath}/user/register"
method="post" modelAttribute="userForm">
<'form:button>Confirm<'/form:button>
<'/form:form>
 
org.springframework.web.bind.UnsatisfiedServletRequestParameterException: Parameter conditions "redo" OR "complete" OR "form" OR "confirm" not met for actual request parameters: register={Submit}, _csrf={c2007699-7c1a-482c-81fc-11858d0cb42f}
 
close-date: 2017/3/14         
shooting:
@Controller
@RequestMapping(value = "/user/register")
public class RegisterController {
public String register(@Valid UserForm userForm, BindingResult bindingResult, Model model, RedirectAttributes attributes) {
↓↓RequestMappingの定義がメソッドに無かった。
@RequestMapping
public String register(@Valid UserForm userForm, BindingResult bindingResult, Model model, RedirectAttributes attributes) {
 
 
------------------------------
## 15     
tag: "spring DateTimeFormat
typeMismatch Date ConversionFailedException
 
open-date: 2017/3/14          
trouble:
Field error in object 'userForm' on field 'birthday': rejected value []; codes [typeMismatch.userForm.birthday,typeMismatch.birthday,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userForm.birthday,birthday]; arguments []; default message [birthday]]; default message [Failed to convert property value of type [java.lang.String] to required type [java.util.Date] for property 'birthday'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value ''; nested exception is java.lang.IllegalArgumentException]  
 
close-date: 2017/3/14         
shooting:
以下のようにformatterを噛ませば良い。
 
@NotNull
@DateTimeFormat(pattern = "yyyy/MM/dd")
private Date birthday;//birthday
 
 
------------------------------
## 16     
tag: Spring redirect RedirectAttributes             
 
open-date: 2017/3/14          
trouble:
Resource Not Found Error!
Resource not found.
 
close-date: 2017/3/14         
shooting:
return "redirect:user/register?complete";
↓↓
return "redirect:/user/register?complete";
 
 
------------------------------
## 17     
tag: xml util schema           
 
open-date: 2017/3/14          
trouble:
Description Resource Path Location Type
The prefix "util" for element "util:map" is not bound. myproject-codelist.xml /myproject-domain/src/main/resources/META-INF/spring line 29 XML Problem
 
 
close-date: 2017/3/14         
shooting:
xmlの冒頭にschema定義にutilを追加する
 
<'beans xmlns=
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
    ">
 
 
------------------------------
## 18     
tag: TERASOLUNA SimpleMapCodeList          
 
open-date: 2017/3/14          
trouble:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'org.terasoluna.gfw.common.codelist.SimpleMapCodeList' is defined         
 
close-date: 2017/3/14         
shooting:
<'bean id="CL_ROLE" parent="org.terasoluna.gfw.common.codelist.SimpleMapCodeList">
↓↓
<'bean id="CL_ROLE" class="org.terasoluna.gfw.common.codelist.SimpleMapCodeList">
 
cf. DBから取得する場合は「parent="AbstractJdbcCodeList"」とparentでOK
 
 
------------------------------
## 19     
tag: Spring xml IllegalArgumentException ClassNotFoundException           
 
open-date: 2017/3/14          
trouble:
Caused by: java.lang.IllegalArgumentException: Cannot find class [java.util.linkedHashMap]
Caused by: java.lang.ClassNotFoundException: java.util.linkedHashMap
 
close-date: 2017/3/14         
shooting:
単なるミスペル
 
<'util:map key-type="java.lang.String" value-type="java.lang.String"
map-class="java.util.linkedHashMap">
↓↓
map-class="java.util.LinkedHashMap">
 
 
------------------------------
## 20     
tag: Spring MVC DefaultMessageSourceResolvabl        
 
open-date: 2017/3/15          
trouble:
org.springframework.context.support.DefaultMessageSourceResolvable: codes [userForm.birthday,birthday]; arguments []; default message [birthday]         
 
close-date: 2017/3/15         
shooting:
JSP では text で受けているのに対し、Form は Date 型で宣言している為。
Form の方を String にすれば良し。
 
 
------------------------------
## 21     
tag: Spring MVC  
 
open-date: 2017/3/15          
trouble:
form の validation の NotNull を通過してしまう、無入力でsubmitしているのに。          
 
close-date: 2017/3/15         
shooting:
無入力でも空文字が渡っている為。NotBlankなvalidationも付ければ良い。
 
 
------------------------------
## 22     
tag: Spring MVC validation 
 
open-date: 2017/3/16          
trouble:
4文字以上って設定しただけなのに、エラーメッセージが「size must be between 4 and 2147483647」と出る。
2147483647 は最大値と思われる。
 
close-date: 2017/3/16         
shooting:
@Size(min = 4)
private String password;//password
としていた為の事象。Sizeでやるなら @Size(min=4, max=8)な書き方にすべき。
最小値だけの指定であれば↓以下が正解
@Min(value = 4)
private String password;//password
というか、数値じゃなくて文字列数なのでMinも違う説w
文字列数はSizeで良いぽい。

tag : Spring

2017-03-23 22:02 : 開発 : コメント : 0 : トラックバック : 0 :

[道具] ローカルメモリを極力使わずに済む開発環境が欲しい

検討用備忘録

条件:
無料、Java、軽量 or クラウド、(可能なら) Windows

[候補] Eclipse v3.5
http://mergedoc.osdn.jp/pleiades-redirect/3.5/pleiades_platform_jre.zip.html
ref.
Eclipseで最軽量Java開発環境を構築
https://www.erestage.com/develop/eclipse_mini/

tag : Eclipse IDE Java

2017-03-09 20:26 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] gitignore な話

.gitignore
 
# Java
*.class
*.jar
*.war
*.ear
 
# Eclipse
.project
.classpath
.settings
 
# Idea
.idea
*.iml
*.iws
*.ipr
 
# OS
Thumbs.db
.DS_Store
 
# Gradle
.gradle
!gradle-wrapper.jar
 
# Maven
target
 
# Build
out
build
bin
 
# Other
*.log
*.swp
*.bak
 
 
ref.
Javaのプロジェクトで使う.gitignore
http://qiita.com/tora470/items/d61c3fcb261e48edc996

tag:
git gitignore java

tag : git gitignore java

2017-03-09 19:46 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] GitBushで保存されているアカウント情報を変更する

GitBushで保存されているアカウント情報
=コミットログ↓↓に残るユーザ名とメールアドレス
 
$ git log
commit 4d8687b040093addb8c59960836384b0f5767776
Author: hogehoge
Date:   Thu Aug 5 20:05:20 2010 +0900
 
 
既存の設定を確認する @GitBush
以下のいずれでも可
globalとlocalがある
$ git config -l
$ git config --global –list
$ $git config --local --list
 
 
アカウント情報の設定
 
■方法① configコマンドで変更する @GitBush
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
 
■方法② 設定ファイルを直に変更する
GitのHOMEディレクトリの在り処を確認する @GitBush
$ git ~
 
そのフォルダに行くと、「.gitconfig」がある
それをeditorで開くと以下のような記載がある筈
それをよしなに変更して保存する
 
[user]
              name = John Doe
              email = johndoe@example.com
 
 
● cf. -諸々な設定ファイル
system設定
[gitインストール先]\etc\gitconfig
※Linuxの場合は、/etc/gitconfig
 
global設定
C:\Users\$USER\.gitconfig
又は
C:\Documents and Settings\$USER\.gitconfig
※Linuxの場合は、${HOME}/.gitconfig
 
リポジトリ設定
gitリポジトリ\.git\config
 
● cf. -SourceTree にも同様な設定あり
global設定
SourceTreeのメニュー [ツール]-[オプション]
リポジトリ設定
SourceTreeのメニュー [リポジトリ]-[リポジトリ設定]の[詳細]タブ
 
 
ref.
1.5 使い始める - 最初のGitの構成
https://git-scm.com/book/ja/v1/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-%E6%9C%80%E5%88%9D%E3%81%AEGit%E3%81%AE%E6%A7%8B%E6%88%90
gitのauthorの確認と変更
http://hacknote.jp/archives/15745/
git設定ファイルの構成について
http://zero-config.com/windows/git-config.html
 
 
tag:
git GitHub GitBush author config

tag : git GitHub GitBush author config

2017-03-09 19:33 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] SonarQube Cyclomatic Complexity 循環的複雑度

SonarQube が出す「複雑度」って何よ?
 
で、Complexityって何よ?
循環的複雑度 (Cyclomatic Complexity; CC) ゆうもの。
条件複雑度(Conditional Complexity)とも呼ばれるそう。CCであることには変わらないww
Javaの場合、if, for, while, case, catch, throw, return 構文で考えられる処理分岐の回数を言う。
それら情報を魔法の方式 (M = E − N + 2P) に当てはめて算出される数字。
# つまり、Complexity とは別に出されている 重複 (Duplication) の数値が高い内は、複雑度は見てもしょうがない
気がする。
 
で、一般的に言われるのは
 ・ 1-4 優秀!
 ・ 5-7 可
 ・ 8-10 不可
 ・ 11+ 論外
 
 
その複雑度を下げる為にできる事
 
モノゴトはシンプルにせよ:
- easy to read
- easy to use
- easy to change
- no use of any non-necessary third party tool or technology
- looks simple
- lean
- straightforward
 
基本規則を遵守せよ:
- keep methods short (one screen limit)
- never ever reuse a variable for different purpose
- use self-descriptive variable and method names
- no magic numbers
- be friend with your language
- dont fight the convention
- watch out for premature optimization
- always refactor the code after you test it
- dont get sucked into over-engineering
- learn new things by prototyping
 
 
Metric Definitions
https://docs.sonarqube.org/display/SONAR/Metric+Definitions
Metrics - Complexity
https://docs.sonarqube.org/display/SONAR/Metrics+-+Complexity
Through the eyes of sonar : Complexity
https://mestachs.wordpress.com/2012/11/26/through-the-eyes-of-sonar-complexity/
循環的複雑度
https://ja.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E7%9A%84%E8%A4%87%E9%9B%91%E5%BA%A6

tag:
SonarQube Cyclomatic Complexity 循環的複雑度
 

tag : SonarQube Cyclomatic Complexity 循環的複雑度

2017-03-07 21:15 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Spring での責務

偶然見つけたけど分かり易いの備忘

Spring での責務


ref.
Spring での責務についてまず見てほしい一枚の絵
http://qiita.com/yo1000/items/a6acbf5f454a7f53aef9

tag.
Java Spring View Controller Service Repository Template Model Advice AOP

tag : Java Spring View Controller Service Repository Template Model Advice AOP

2017-03-04 12:29 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] SonarQube なる CodeChecker

tag: SonarQube Scanner SonarLint PostgreSQL IllegalStateException HeapDumpOutOfMemoryError

// ------------------------------------------------------------
■ quick reference: // 詳細は後述参照

step 0 (optional)
> install Sonar
> set a database for sonar
> start Sonar

step 1
create a folder to keep the target source
e.g. C:\tmp\Sonar\testTargetProject

step 2
create sonar-project.properties, save it under the same folder.
e.g. C:\tmp\Sonar\testTargetProject\sonar-project.properties

step 3
start Sonar, and start check via a CommandPrompt
cd C:\sonar\sonarqube\bin\windows-x86-64
StartSonar.bat
cd C:\_btkouei\20170626_泉岳寺のSonar\target
sonar-scanner.bat

step 4
check the result
http://localhost:9000/about

------------------------------------------------------------ //
 
SonarQubeとは
スイスのSonarSource社が主に開発を行っている
統合的なプログラム品質管理を行える統合品質管理ツール (無償)
https://www.sonarqube.org
 
■ できるとこと
ソースコードの静的解析チェック
プログラムの複雑度の測定
諸々解析結果はブラウザから閲覧
結果のエクセルなりにexportもできる
CI環境への組み込みも可
 
■ 対応言語
いろいろ
 
■ 使い方
 
SonarQube Server
解析結果を表示するサーバ
https://www.sonarqube.org から zip を DL
sonarqube-6.2.zip を展開して、Cドライブに移植
cd C:\sonar\sonarqube\bin\windows-x86-64
 
DB の設定
コマンドプロンプトを開き以下を実行してく
"C:/Program Files/PostgreSQL/9.4/bin/psql" postgres postgres
# postgresユーザのPWを入力
password
# sonarqubeユーザを新規作成
CREATE USER sonarqube WITH PASSWORD 'sonarqube';
ALTER ROLE sonarqube CREATEDB;
# 権限付与
CREATE DATABASE sonar WITH ENCODING 'UTF-8' OWNER=sonarqube;
grant all privileges on database sonar to sonarqube;
# 既存ユーザの確認
\du
\l
# RackInitializationException 回避の為のサーチパスの設定
ALTER USER sonarqube SET search_path to public;
# ログアウト
\q
 
諸項目の設定
C:\sonar\sonarqube\conf\sonar.properties
上記プロパティファイルの当該箇所を以下のように更新
# User credentials.
sonar.jdbc.username=sonarqube
sonar.jdbc.password=sonarqube
#----- PostgreSQL 8.x/9.x
sonar.jdbc.url=jdbc:postgresql://localhost/sonar
 
StartSonar.bat でSonarQubeサーバを起動
http://localhost:9000/ にアクセス
管理ユーザの場合は admin / admin がデフォルト Login ID と PW
 
cf.
InstallNTService.bat             サービスとしてインストール
StartNTService.bat サービスの開始
StopNTService.bat              サービスの停止
UninstallNTService.bat         サービスのアンインストール
 
// ------------------------------
[事象]
StartSonar.bat で HeapDumpOutOfMemoryError
C:\sonar\sonarqube\logs\es.log に詳細あり
詳細
2017.03.02 14:35:17 WARN  es[][o.s.p.ProcessEntryPoint] Fail to start es
org.elasticsearch.transport.BindTransportException: Failed to bind to [9001]
org.elasticsearch.transport.BindTransportException: Failed to bind to [9001]
              at org.elasticsearch.transport.netty.NettyTransport.bindToPort(NettyTransport.java:478)
Caused by: org.jboss.netty.channel.ChannelException: Failed to bind to: /127.0.0.1:9001
              at org.jboss.netty.bootstrap.ServerBootstrap.bind(ServerBootstrap.java:272)
Caused by: java.net.BindException: Address already in use: bind
              at sun.nio.ch.Net.bind0(Native Method)
 
[原因]
先に実行した奴のプロセスが残ってて、portを取り合ってるため。
ついでがあったのでPC再起動してやったら普通に軌道できた
------------------------------ //
 
 
SonarQube Scanner
ソース解析して、結果をSonarQubeサーバに送る子
他にmavenプラグインを使用する等、代替手段あり
https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner
から sonar-scanner-2.8.zip DL
展開して、、Cドライブに移植>C:\sonar\sonar-scanner
 
環境変数Pathに「C:\sonar\sonar-scanner\bin」を追加
コマンドプロンプトで以下を叩いてインストールされてることを確認
sonar-scanner.bat -h
諸々と情報が表示されればOK
 
諸項目の設定
分析したいプロジェクトのフォルダ配下に「sonar-project.properties」を新規に作成
各項目は以下を参照
https://docs.sonarqube.org/display/SONAR/Analysis+Parameters
記載内容例:
// --------------------
# must be unique in a given SonarQube instance
sonar.projectKey=my:project
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=My project
sonar.projectVersion=1.0

# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# Since SonarQube 4.2, this property is optional if sonar.modules is set.
# If not set, SonarQube starts looking for source code from the directory containing
# the sonar-project.properties file.
sonar.sources=.

# Encoding of the source code. Default is default system encoding
#sonar.sourceEncoding=UTF-8
-------------------- //
 
作成した「sonar-project.properties」と同じ階層までコマンドプロンプトで cd していき
そこで「sonar-scanner.bat」を実行して分析開始。
※ sonar-runner.bat はかつて使われてた非推奨な輩
こんなんのが最後に表示される筈↓↓
INFO: More about the report processing at http://localhost:9000/api/ce/task?id=AVqOBVe9614YH3R8UGOd
INFO: Task total time: 13:47.217 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 13:48.934s
INFO: Final Memory: 57M/926M
INFO: ------------------------------------------------------------------------
 
http://localhost:9000/ に行き、admin / admin でログイン
対象のプロジェクトまで掘ってくと結果が見れる
 
 
SonarLint
http://www.sonarlint.org/
Eclipse上で静的チェックしてくれる子
結果はSonarQubeへ送付するも、localで確認するも可
条件:
Java 8, SonarQube 5.6+
 
org.sonarlint.eclipse.site-2.6.0.201702201416.zip をDLして展開
org.sonarlint.eclipse.site-2.6.0.201702201416 を、
C:\STS\sts-bundle\sts-3.8.2.RELEASE\plugins に配置
STS を再起動
してみたけど、「SonarQube server view」が無い、、
 
「Views Plugin - Plugins - SonarQube」が必要らしいというのはもはや昔の話で
コレ ↓↓ を入れろ、ってことぽい
https://www.sonarsource.com/why-us/products/plugins/governance.html
が、これ有償なお代物..
ん?これ? ↓↓ よく分からん。
https://docs.sonarqube.org/display/PLUG/Views
https://docs.sonarqube.org/display/PLUG/Governance+Plugin
 
 
ref.
SonarQubeでプログラムの品質管理をはじめる(概要)
http://qiita.com/sh-ogawa/items/fac0eca110c3558dfae9
Analyzing with SonarQube Scanner <-- 日本語サイト漁ったけど、結局、これが最も明快だった、、
https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner
オカルトから科学へ - SonarQubeで静的コード解析を始めよう
http://koduki.hatenablog.com/entry/2014/02/11/133558
SONNARQUBEでソースコードの品質を解析する
https://t246osslab.wordpress.com/2016/11/20/sonnarqube%E3%81%A7%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%93%81%E8%B3%AA%E3%82%92%E8%A7%A3%E6%9E%90%E3%81%99%E3%82%8B/
SonarQubeをインストール
http://gozuk16.hatenablog.com/entry/2016/04/15/171138
コード探知機「Sonar」でプロジェクトの深海を探れ! (2/4)
http://www.atmarkit.co.jp/ait/articles/1010/08/news124_2.html
SonarQube, C++ プラグインの Windows へのインストールと使い方
http://yohshiy.blog.fc2.com/blog-entry-305.html
SonnarQubeを使って有名どころJavaフレームワークの品質を解析してみた
http://daipresents.com/2016/sonnarqube/

tag : SonarQube Scanner SonarLint PostgreSQL IllegalStateException HeapDumpOutOfMemoryError

2017-03-03 08:33 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Maven/pom/dependencies/dependency/scope のあるべき

Maven/pom/dependencies/dependency/scope:
依存するライブラリが何時クラスパスに追加されるかを指定するもの
以下より指定する。
 
■ 前提
compile
  全ての状況でクラスパスに追加される。default値。
provided
  コンパイル時のみクラスパスに追加される。ライブラリやJDKやコンテナによって提供される場合に指定する。
  実行環境で提供されるライブラリに対して指定するもの。e.g. servlet-api.jar
runtime
  テストの実行&通常の実行時にクラスパスに追加される。実行時のみに必要な場合に指定する。
  e.g. JDBCドライバ
test
  テストのコンパイルと実行の時に暮らすパスに追加される。テストの時のみ必要な場合に指定する。
system
  定時的にクラスパスに追加する場合に指定する。
 
■ JDBCドライバ
商用や試験環境では、アプリサーバが提供するデータソースでJNDI経由のアクセスが主流
その場合は、provided で結構。
そうでない場合は、JDBCドライバはコンパイル時には不要なものになるので runtime が妥当。
 
 
ref.
Maven 入門 (2)
http://www.techscore.com/tech/Java/ApacheJakarta/Maven/3/

tag : Maven pom scope

2017-03-01 21:17 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] vim な話 - ド初心者のQuick Reference

vim = linux用のeditorソフト
appleにはデフォで入っており、terminalを上げて「vim」と入れれば詳細が見れる
 
 
● 「vim hoge.txt」でopen with nomal-mode
 
mode = 3つ
 ― nomal = vim で開いた状態がコレ。いわゆる参照モード
 ― insert = nomal-modeから「i」押すとなる。挿入(入力)モード。nomal-modeに抜けるには「:q」
 ― command = nomal-modeから「:」で切り替え。コマンドモード。nomal-modeに抜けるにはやはり「ESC」
 ― visual = normal-modeから「v」で切り替え。文字選択ができる。
 
● 困ったら取り合えず「ESC」連打
 
● normal-modeでの操作
gg ― ファイルの先頭へ
G ― ファイルの最後へ
CTRL+f / CTRL+b ― 1画面前へ/後ろへ
^  ― 行頭へ
$ ― 行末へ
f a ― aまでジャンプ。「;」で次にジャンプ
% ― 対応する括弧の閉じにジャンプ
 
● insert-mode での操作
:w ― 保存
:w! ― 上書き保存
:w hoge.txt ― hoge.txtとして新規保存
:q ― 閉じる
:q! ― 変更を保存せずに閉じる
:e hoge.txt ― 違うファイルを開く

tag : vim mode editor

2017-02-24 22:54 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Git Command - 基礎編

■ とりあえず、local 環境を初期化
  install/open gitbush (≒terminal/command prompt)
  $ cd /c/tmp/gitStudy
  $ git config --global user.name "myusername"
  $ git config --global user.email "myemail@hogehoge.com"
  $ git init
  「C:\tmp\gitStudy」に「.git」という隠しフォルダが出来ている筈
  $ git init --bare = 共有リポジトリとして初期化する
    
    
■ 把握すべき資材保管場所
  ① remote repository / shared repository (上位)
  ② local repository / private repository
  ③ staging area / index
  ④ working copy / working tree (下位)
    
    
■ ブツの取得 (下り) -手始めにサンプルキットを
  $ git clone https://github.com/github/training-kit.git
  ① remote repository から資材が ④ working copy へ複製される
  新たに「C:\tmp\gitStudy\training-kit」というフォルダが作成されている筈
  ※ 共有リポジトリは「ホゲホゲ.git」な名前が通例
    
    
■ 状況確認
  害なし。好きなだけ叩くが良し
  $ git branch
  $ git status
  $ git diff BRANCH_NAME
  $ git show COMMIT_HASH_VALUE or TAG_NAME
  $ git log
  $ git log -l
  $ git diff = b/w working copy and staging area
  $ git diff --cached = b/w staging area and local repository
  $ git diff staged
  $ git config -l
  $ git reflog
    
    
■ 最新資材取得 (下り)
  [local repository]  <-- clone -- [remote repository]
  [working copy]  <-- pull -- [remote repository]
  [working copy] <-- merge -- [local repository]  <-- fetch -- [remote repository]
  ※ pull = fetch + merge
    
    
■ 資材更新 (上り)
  [working copy] -- add/rm/mv --> [staging area] -- commit --> [local repository]  -- push --> [remote repository]
    
  管理対象にFILEを加える
  $ git add FILE
  管理対象からFILEを除く
  $ git rm FILE
  管理対象のFILEをOLDからNEWに移動する
  $ git mv OLD NEW
    
    
■ CONFLICT
  他者の変更とconflictした場合、当該ファイルは以下のようになっている
    <<<<< HEAD
    (ローカルリポジトリ local repository の内容)
    =====
    (共有リポジトリ remote repository の内容)
    >>>>> (共有リポジトリのコミットID)
  TOBEを残して後は全削除して、add, commit, push すれば良い。
    
    
■ もやもや (基本、実験したら分かる事の筈)
  ・squash は local repository な話なのか?
  ・rebase も 対 local repository な話で push とかが要る認識であってるのか?
  ・fast-forward に理解し切れていない有難みがありそう
    
    
■ quick reference 
  ●ステージングエリア(staging area)にブツを上げる
    $ git add hoge.txt
    $ git add .
    
  ●ローカルリポジトリ(local repository)にブツを上げる
    $ git commit -m "add tutorial #2" -a
    $ git commit --amend = 直前のコミットを変更(上書き)する
    $ git commit -am "commit comment" = add + commit
    
  ●作業フォルダ(working copy)とステージングエリア(staging area)の変更を取り消す
    $ git reset --hard HEAD = staging area と working copy の両方(--hard) を 直前のcommit(HEAD) に戻す
    $ git reset --hard HEAD^ = staging area と working copy の両方(--hard) を 2こ前のcommit(HEAD^) に戻す
    $ git reset --hard ORIG_HEAD = staging area と working copy の両方(--hard) を 最新のcommit(HEAD^) に戻す
    
  ●ブランチを作ったり統合したり消したり
    $ git branch = 現在地を確認する
    $ git branch hoge = hogeブランチを作成する
    $ git checkout hoge = hogeブランチに移動する
    $ git checkout -b issues/2_tutorial = 新規ブランチを作ってソコに移動する
    $ git rebase master = 今居るブランチの基底点を今のmasterに改める
    $ git merge hoge = hogeの内容を今居るブランチに取り込む
    $ git branch -d hoge = hogeブランチを消す
    $ git branch --merged = 今居るブランチに取り込まれたブランチの一覧を表示する
    $ git branch --no-merged = 今居るブランチに取り込まれていないブランチの一覧を表示する
    
  ●変更内容を一時退避する
    $ git stash save "any comment" = まだ作業中なのでコミットしたくない変更内容を一時的に退避させる
    $ git stash list = 退避した変更内容の一覧を表示する
    $ git stash show
    $ git stash pop = 一番に上に乗っかっている変更内容を取り出す
    
  ●タグを付ける
    $ git tag v1.0 = 直近のcommitにv1.0という名前のタグ(コミットIDの別名)を付ける
    $ git tag = タグの一覧を表示する
    $ git tag v0.9 任意のコミットID = 任意のコミットIDのコミットに対してv0.9という名前のタグを付ける
    $ git tag -d v0.9 = 指定のタグ(v0.9)を削除する
    
  ●エイリアス(ギットコマンドの短縮名)な話
    $ git config --global alias.co checkout = チェックアウトに「co」という短縮名を付ける
    $ git config --global alias.st status = ステータスに「st」という短縮名を付ける
    $ git config --global alias.br branch = ブランチに「br」という短縮名を付ける
    $ git config --global alias.ci commit = コミットに「ci」という短縮名を付ける
    $ git config -l = コンフィグの詳細を確認する
    
  ●共有リポジトリ(remote repository)な話
    $ git remote add origin ~/sharedrepository.git = 任意のパス(~/sharedrepository.git)をリモートリポジトリとして「origin」という名前で今居るリポジトリに追加する
    $ git config -l = リモートリポジトリの在り処(remote.origin.url)を確認する
    $ git remote rm origin = 「origin」っていう名前のリモートリポジトリへのリンクを外す
    $ git clone ~/sharedrepository.git localrepository = 任意のリモートリポジトリを任意の名前のローカルリポジトリとして複製してくる
    
  ●共有リポジトリ(remote repository)にブツを上げたり下げたり 
    $ git push origin master = 「origin」って名前の共有リポジトリにローカルリポジトリのmasterブランチの資材を挙げる
    $ git push origin issues/2_tutorial
    $ git push -f origin issues/2_tutorial
    $ git pull origin master = 「origin」って名前の共有リポジトリの資材をローカルリポジトリのmasterブランチに取り込む
    
  ●未整理 
    $ git cherry-pick -x 898c769381921c3a8 = 任意のコミット(特定できれば尻尾は割愛可。最低7桁)を今居るブランチに取り込む
    $ git merge --squash issues/2_add-tutorial
    
■ ref
  training-kit
  https://github.com/github/training-kit
  ドットインストール git入門
  http://dotinstall.com/lessons/basic_git#!comments
  「Pro Git」の日本語版
  https://git-scm.com/book/ja/v2
  インタラクティブにgitのコマンドが学べる「try git」
  https://try.github.io/levels/1/challenges/1
  https://www.codeschool.com/learn/git

tag : command repository remote local staging_area working_copy add commit push git

2017-02-21 23:27 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Git は嫌う前に全貌を把握すべき

■ 想定読者                                                  
        SVN に慣れ親しんでいて どうにも Git に大して抵抗・恐怖・嫌悪感を抱いている人                                  
                                           
■ 目的                                           
        Git とお友達になる                                       
        親友になる気は毛頭ない                               
                                           
■ 抵抗・恐怖・嫌悪感の根源                                                  
        招待がモヤっとしている                               
        command が謎過ぎる。感覚で打てない。実態にどのように反映しているのかが分からないし、どのように反映されるべきかもも謎い                                      
                                           
Git って何よ?                                                      
        version管理する SVN (Subversion) とタスク管理する Trac (Edgewall Software) を合体させたようなモノ                                         
        プラス、review の仕組みが組み込まれたモノ                                         
                                           
Git と SVN の大きな流れの違い                                                     
        Git の場合                                       
                issue 作る                         
                issue 毎に branch を作る               
                local で改修して local の branch に commit する                  
                remote の branch に push する                   
                GitHub ( or GitLab or GitBucket ) 経由で master program への改修 code の merge request を作る                        
                merge request を受けて第三者が code review して、master に merge する                     
                                           
        SVN の場合                                    
                issue/task 管理は Trac で実施                      
                適宜、改修して SVN の trunck に commit する                     
                ※ commit と issue の紐付けはマニュアル (Trac に revision 番号を記載など)                 
                ※ commit 前に review はない。 =regression risk を上げる。 commit 後も無かったり…                           
                                           
        以上から                                         
                Git は 品質管理にも重みを置いている。開発がある程度落ち着いているプロジェクトには非常に有用                 
                SVN はささっと commit したい速度重視型。                         
        ⇒ 一長一短。プロジェクト規模や状況に応じて使い分けるが良し                                    
                                           
■ official な Git の pros/cons                                                
        pros                                  
                分散version管理 ⇒使う一開発者的にはどうでもいい。知りたいの、ソコじゃない                        
                軽量 ⇒使う一開発者的にはどうでもいい。知りたいの、ソコじゃない               
                                           
        cons                                  
                file単位で version管理されていない                          
                text file でも rename と contents 変更を同時にやると git log --follow でファイルの履歴が追えなくなる                           
                # Git 的には履歴追跡とか不要な概念らしい               
                                           
■ Git command を叩く前に知っとけ!Git の4つの概念 (ファイルの状態を保存する場所)                                                      
        Working Tree = Working Copy = 作業ディレクトリ                            
                今、作業しているファイル達の部屋                           
        Index = ステージング・エリア ≒ git add files                                    
                コミットする為のファイルを登録する場所。                           
                全量でないが特定複数ファイルを一度にコミットしたい時に暫定置き場として大活躍するところ                        
                # ってか CLI だからこんな問題が生じるんじゃん?               
                # 自作自演感を拭えないのは私だけなのか?STS の Git な Plugin を使いこなせたらいいことあるかも                           
        Local Repository = Git リポジトリ                           
                リモートリポジトリに送るためのコミットを記録する場所                    
        Remote Repository                                        
                複数人で共有するためのリポジトリ                           
                                           
        img: http://www.atmarkit.co.jp/ait/articles/1307/05/news028_3.html                            
        img: http://www.slideshare.net/to_ueda/git-6821390                                    
                                           
■ 「.git」っていうファイル                                                    
        reposiotry の clone 時とかにできる。Git の全てが詰まってる。 e.g. object 格納領域, indext, ref, symref, etc.                                    
        object 格納領域 とは - file 情報やcommit 履歴の保存場所。以下4つから構成される                              
                ブロブ > 1つの file を現す object。 Version 管理対象の file 内容(だけ)を保持する                    
                ツリー > 1つのdirectory構造を現すもの。Pointerを持つ。                
                コミット > commitの日時やmessage、1つ前のcommitを指すpointerを持つ               
                タグ > 注釈 tag やpointerを持つ。                         
                                           
■ Git 代名詞に近いcommandたち と ファイルの移籍っぷり                                          
        [working copy] --> git add --> [staging area / index] --> git commit --> [local repository] --> git push --> [remote repository]                                       
        [working copy] <-- git checkout -- [staging area / index] <-- git reset <-- [remote repository]                                 
        [working copy] <-- git merge/rebase -- [local repository] <-- git fetch <-- [remote repository]                                 
        [working copy] <--------------- git pull <--------------- [remote repository]                                         
                                           
■ Git の代表的な command                                                    
        clone, fetch, pull                              
                clone - 何もないlocalに資材を取得する                     
                pull - remote repository に commit された最新の更新を local に取り込む                         
        checkout, switch, stash                                  
        add, rm, commit, push                                   
                新規ファイルの追加が改修の追加は、add して commit                        
                既存ファイルの削除は、rm して commit                   
                git add -u で変更あったファイルのみstagingするも一手。(この新規作成ファイルは含まれない)                           
                git push origin master の origin=remote repositoryの名称、master=branchの名称                          
        reset, revert                                      
                revert - 指定したコミットが持ち込んだ変更を打ち消すコミットを追加すること。                          
                                          ※ revertは、新規commitの追加のみで、既存commitの削除は無い     
                reset (index 再設定) - add で stage した資材を reset で unstage すること                      
                reset (HEAD 付け替え) - 特定の commit をHEADの付替えで実質的に削除すること。                   
                        ※ reset (HEAD付け替え) は、 soft, mixed, hard の option がある       
        merge, rebase                                  
                merge - 複数ブランチへの変更を1つにmergeすること                         
                rebase - branchの起点と特定のとに変更すること                     
        cherry-pick - 特定の commit だけを特定の branch に取り込むこと                                   
                                           
        log, show                                         
                git log -p > そのブランチのコミットログが全部表示される                 
                show > 特定のコミットの内容を表示させる                          
                        git show {最新のcommit のhash tag}             
                                = git show HEAD
                        1つ前の commit 内容が見たい場合
                                = git show HEAD^
                        2つ前の commit の場合   
                                = git show HEAD^^
                                = git show HEAD~2
        status - tracked/untracked = git に追跡/認識されているか否か                               
                追跡されている場合の状態は3つ unmodified, modified, staged                           
                                           
                                           
                                           
                                           
■ 個人的に Git を嫌う理由                                                     
        上記に加え、diff が使い難い。⇒ きっとソレに相当する Git 操作を知らないだけ                                       
        HEADって何?                               
                今いるブランチの最新のコミット。HEADが今いるブランチを決めている。                     
                git checkout な branch の switch は HEAD を移動させているだけ。                 
        stagingって何が嬉しいの?                                        
        forkって何?Clearなimageが欲しい                                        
                                           
■ おまけ                                                     
        STS に default で git の plugin ある                                      
        STS>Window>Show View>Git  Git Interactive Rebase, Git Reflog, Git Repositories, Git Staging, Git Tree Compare                            
                                                 
                                                 
ref.                                                  
Gitの良さが分からない? ちょっとそこに座れ, 2016/10/06                                                
https//www.kaitoy.xyz/2016/10/06/git-vs-subversion/                                                 
git resetとrevertを図解する, 2016/01/01                                                  
https//www.kaitoy.xyz/2016/01/01/git-revert-reset/                                                     
Gitのマージを図解する, 2015/12/28                                           
https//www.kaitoy.xyz/2015/12/28/git-merge/                                              
Gitのリポジトリの中身をなるべく正確に理解する, 2015/12/27                                           
https//www.kaitoy.xyz/2015/12/27/git-repository/                                                       
Git初心者に捧ぐ!Gitの「これなんで?」を解説します。, 2013/09/04                                             
http//kray.jp/blog/git-why-explanation/                                         
Git の仕組みを5分で理解する!, 2014/08/05                                            
http//qiita.com/hshimo/items/ab91b99cd61724127aa7                                              
Pro Git 日本語版電子書籍公開サイト                                                     
https//progit-ja.github.io/#download                                            
https//git-scm.com/book/ja/v2                                                    
git における stage, commit, branch, 2014/09/04                                                     
http//blog.bonar.jp/entry/2014/09/04/223048                                               
EclipseでGitを使う(4)プッシュまでの流れをまとめる。, 2015/07/01                                          
http//tech.pjin.jp/blog/2015/07/01/git-on-eclipse-4-how-to-push/    

tag : Git GitHub GitBucket SVN add commit push pull merge rebase

2017-02-15 21:14 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] ActiveMQ+Tomcat+Spring で電文送信する

■前提
ActiveMQ は Tomcat の内部に統合して動かす(※) = Tomcat のサブプロセスとして動作させる
ActiveMQ = v5.14.1
Tomcat = v8.5
接続ファクトリはJNDIで取得

※for google: integrating activemq with tomecat, integrating existing tomcat server with active mq, embed activemq in tomcat, configure activemq in tomcat

■サマリ
01 - ActiveMQ の jar を Tomcat の lib に配置する
02 - JNDIの登録
03 - ActiveMQ用の小細工
04 - ActiveMQの起動
05 - アプリ側の実装

■01 - ActiveMQ の jar を Tomcat の lib に配置する
Tomcat が ActiveMQ の jar を使用する為

取得先
C:\apache-activemq-5.14.1\lib

取得対象
geronimo-jms_ver.jar
geronimo-j2ee-management_ver.jar
activemq-spring_ver.jar
activemq-openwire-legacy_ver.jar
activemq-broker_ver.jar

格納先
C:\Program Files\Apache Software Foundation\Tomcat 8.5\lib
※ Linuxの場合 /opt/tomcat/apache-tomcat-ver/lib

個別にコピペが面倒い場合は
activemq-all.jar を上記の代わり配置する。
activemq-all.jar は以下から取得可能
http://mvnrepository.com/artifact/org.apache.activemq/activemq-all
Mavenでの取得も可能


org.apache.activemq
activemq-all
5.14.1


pom.xmlのあるディレクトリにcdしてmvn installすれば以下にjarができる筈。
それをTomcatのlibフォルダにコピーする
C:\Users\{userName}\.m2\repository\org\apache\activemq\activemq-all\5.14.1

■02 - JNDIの登録
C:\Program Files\Apache Software Foundation\Tomcat 8.5\conf
context.xml に接続ファクトリとキューを定義


auth="Container" brokerName="localhost"
brokerURL="tcp://localhost:61616" password="admin" userName="admin"
type="org.apache.activemq.ActiveMQConnectionFactory"
factory="org.apache.activemq.jndi.JNDIReferenceFactory" />


auth="Container"
type="org.apache.activemq.command.ActiveMQQueue" physicalName="AtrsRequestQueue"
factory="org.apache.activemq.jndi.JNDIReferenceFactory" />

STS経由でTomcatを動作する場合は以下にあるcontext.xmlを更新する
C:\{workspace of STS}\Servers\Tomcat v8.5 Server at localhost-config

■03 - ActiveMQ用の小細工
Messageの実装クラスを独自の物にした場合、そのパッケージをTomcatのsetenvで実行引数に渡す。既存しない場合は新規作成
Windows
C:\Program Files\Apache Software Foundation\Tomcat 8.5\bin\setev.bat
Linux
opt/tomcat/apache-tomcat-ver/bin/setenv.sh
定義例
-Dorg.apache.activemq.SERIALIZABLE_PACKAGES=java.lang,java.util,org.apache.activemq,org.fusesource.hawtbuf,com.thoughtworks.xstream.mapper,hoge.piyo
任意のパッケージ名を指定する

■04 - ActiveMQの起動
cd C:\apache-activemq-5.14.1\bin
activemq stop
アプリより送信した電文は以下のActiveMQ管理画面のキュー画面から確認できる
http://127.0.0.1:8161/admin/
Login ID: admin
Password: admin

■05 - アプリ側の実装
Webにぎょうさん転がっているsampleの通り。
DynamicDestinationを使用すれば、ActiveMQに実在しないキューを動的に作成してくれる


ref.
Tomcat + Spring + ActiveMQ, 2015/10/31
http://www.javanbeyond.com/activemq/tomcat-spring-activemq/
Configure Apache ActiveMQ with Tomcat 6, 2010/12/03
https://rocksolutions.wordpress.com/2010/12/03/configure-apache-activemq-with-tomcat-6/
Pre-integrated Tomcat with ActiveMQ
http://activemq.apache.org/tomcat.html
TomcatでActiveMQを動かしてみる, 2011/8/24
https://shinodogg.com/?p=3593
How to embed ActiveMQ in Tomcat, 2011/06/01
http://blog.octera.info/2011/06/how-to-embed-activemq-in-tomcat/

tag : ActiveMQ Tomcat8 STS Spring JMS JNDI

2016-12-17 07:48 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] 暫く見ぬ間にSpringがえらい成長してた

※ すべて以下からの抜粋
http://terasolunaorg.github.io/guideline/5.2.0.RELEASE/ja/index.html

RequestLifecycle.png
http://terasolunaorg.github.io/guideline/5.2.0.RELEASE/ja/_images/RequestLifecycle.png
ApplicationLayer.png
http://terasolunaorg.github.io/guideline/5.2.0.RELEASE/ja/_images/ApplicationLayer.png


アプリケーション層
アプリケーション層は、クライアントとのデータの入出力を制御する層
  Controller = @Controllerアノテーションが付与されているPOJO
    画面遷移の制御
    ドメイン層のServiceの呼び出し
  View
    クライアントへの出力。HTML/PDF/Excel/JSONなど
    ※JSONやXML形式の出力を行う場合は、HttpMessageConverterクラスがViewの役割を担う。
  Form (form backing bean)
    HTMLのフォームを表現
    入力チェックルールの宣言 = Bean Validationのアノテーションを付与
    ※ドメイン層がアプリケーション層に依存しないよう
      → Beanは入れ替える。
      → 入れ替え作業はCOntrollerよりHelperなりDozerの利用が推奨される。(Controllerの可読性保持の為)
    ※JSONやXML形式の入力を受ける場合は、
      → ResourceクラスがFormの役割を担う。
      → 変換は、HttpMessageConverterクラスが担う。
  Helper
    Controllerを補助する
    必要に応じて、POJOクラスとして作成する

ドメイン層
ドメイン層は、アプリケーションのコアとなる層であり、ビジネスルールを実行(業務処理を提供)する。
  Domain Object
    ビジネスを行う上で必要な資源や、ビジネスを行っていく過程で発生するものを表現するモデル
  Repository
    Domain Objectのコレクションのような位置づけ
    Domain Objectの問い合わせや、作成、更新、削除のようなCRUD処理を担う
    この層では、インタフェースのみ定義、実体はインフラストラクチャ層のRepositoryImplで実装する

インフラストラクチャ層
インフラストラクチャ層は、ドメイン層(Repositoryインタフェース)の実装を提供する層
データストア(RDBMSや、NoSQLなどのデータを格納する場所)への永続化や、メッセージの送信などを担う。
  RepositoryImpl
    Repositoryインタフェースの実装として、Domain Objectのライフサイクル管理を行う処理を提供する。
  O/R Mapper
    データベースとEntityの相互マッピングを担う。
    MyBatis (MapperインタフェースやSqlSession) / JPA (EntityManager) / Spring JDBC (JdbcTemplate) が、本機能を提供する。
  Integration System Connector
    データベース以外のデータストア(メッセージングシステム、Key-Value-Store、Webサービス、既存システム、外部システムなど)との連携を担う。

LayerDependencies.png
http://terasolunaorg.github.io/guideline/5.2.0.RELEASE/ja/_images/LayerDependencies.png
LayerDependencyInjection.png
http://terasolunaorg.github.io/guideline/5.2.0.RELEASE/ja/_images/LayerDependencyInjection.png
LayeringPattern1.png
http://terasolunaorg.github.io/guideline/5.2.0.RELEASE/ja/_images/LayeringPattern1.png

プロジェクト構成
[projectName]-domain  ドメイン層に関するクラス・設定ファイルを格納するプロジェクト
[projectName]-web  アプリケーション層に関するクラス・設定ファイルを格納するプロジェクト
[projectName]-env  環境に依存するファイル等を格納するプロジェクト
[projectName]-infra  インフラストラクチャ層のクラスを格納するプロジェクト。domainプロジェクトに格納もOK

Bean定義構成



メッセージを同期送信する処理の流れ
JMSSendOverview.png
http://terasolunaorg.github.io/guideline/5.2.0.RELEASE/ja/_images/JMSSendOverview.png

JMSメッセージを同期送信する処理の流れ
JMSSyncOverview.png
http://terasolunaorg.github.io/guideline/5.2.0.RELEASE/ja/_images/JMSSyncOverview.png

JMSメッセージを非同期受信する処理の流れ
JMSASyncOverview.png
http://terasolunaorg.github.io/guideline/5.2.0.RELEASE/ja/_images/JMSASyncOverview.png



tag : Spring

2016-12-09 23:28 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] 10年も前からあるActiveMQをSpringで

Ref. Using ActiveMQ 4 > Getting Started
http://activemq.apache.org/getting-started.html#GettingStarted-StartingActiveMQStartingActiveMQ

ActiveMQ のダウンロード
http://activemq.apache.org/download.html
latest: ActiveMQ 5.14.1 Release as-of 20161207

ActiveMQ のインストール手順書 for Windows
http://activemq.apache.org/getting-started.html#GettingStarted-InstallationProcedureforWindows

■ActiveMQ のインストール
ダウンロードした zip を展開し C ドライブ直下に配置 = インストール完了
C:\apache-activemq-5.14.1

■ActiveMQ 起動
cd C:\apache-activemq-5.14.1
bin\activemq start
コマンドプロンプトに以下が表示されればOK
INFO | No Spring WebApplicationInitializer types detected on classpath
INFO | ActiveMQ WebConsole available at http://0.0.0.0:8161/
INFO | ActiveMQ Jolokia REST API available at http://0.0.0.0:8161/api/jolokia/
INFO | Initializing Spring FrameworkServlet 'dispatcher'
INFO | No Spring WebApplicationInitializer types detected on classpath
INFO | jolokia-agent: Using policy access restrictor classpath:/jolokia-access.xml
以下をブラウザに打ち込みadminでログインすれば、MQ監視画面が見れる
http://127.0.0.1:8161/admin/
Login ID: admin
Password: admin

■ActiveMQ 停止
cd [activemq_install_dir]/bin
./activemq stop

■Queue の作成
MQ監視画面のメニューバーから Queues を選択
Queue Nameに任意のキュー名称を入れてcreate

■電文生成&送信
Queue画面>送信先とするQueue>Operations>Send To で必要事項を入力して Send

■ActiveMQ のログ
C:\apache-activemq-5.14.1\data\activemq.log

■ActiveMQ の port
デフォルト port は61616
port 状況を確認するコマンド
netstat -an|find "61616"


■Tutorial
ActiveMQ with Spring in Eclipse
http://natlaughlin.com/articles/activemq_spring/

ActiveMQSpring をダウンロードして解凍
Eclipse>Project Explorer>右クリック>Import>General>Existing Projects into Workspace
ActiveMQSpring を選択

Eclipse>Project Explorer>ActiveMQSpring>右クリック>プロパティ>Java Build Path
>Libraries>Add External JARs..
C:\Users\user1\.m2\repository\org\apache\tomcat\tomcat-servlet-api\8.0.36\tomcat-servlet-api-8.0.36.jar>追加

Eclipse>Servers>Tomcat>右クリック>Add and Remove..
ActiveMQSpring を選択して追加

Eclipse>Servers>Tomcat>Run

http://localhost:8080/ActiveMQSpring/activemq/receive
にアクセス
暫し待つと(裏でActiveMQ電文をTESTQUEUE queueに送信している)
Message received:hello123 と表示される

http://localhost:8080/ActiveMQSpring/activemq/send?message=hello123
で異なる電文を送信できる。
URL末尾のmessageを任意の文字列にして送信(Enter)した後にアクセス
http://localhost:8080/ActiveMQSpring/activemq/receive
を更新すると、messageの後の文字列が表示されている筈

Spring の設定
WebContent/WEB-INF/applicationContext.xml
<'bean id="broker" class="org.apache.activemq.xbean.XBeanBrokerService">
<'property name="useJmx" value="false">
<'property name="persistent" value="true">
<'property name="transportConnectors">
<'bean class="org.apache.activemq.broker.TransportConnector">
<'property name="uri" value="tcp://localhost:0" />
<'/bean>
<'/property>
<'/bean>

<'bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQXAConnectionFactory">
<'property name="brokerURL" value="vm://localhost">
<'/bean>

XBeanBrokerService (仲介ブローカー)を使用するようになっている
仲介ブローカー介さずに直に ActiveMQ ブローカーに飛ばしたい場合は以下のように修正したら良い

<'bean id="connectionFactory"
class="org.apache.activemq.spring.ActiveMQXAConnectionFactory" >
<'property name="brokerURL" value="tcp://localhost:61616">
<'/bean>

ライブラリ構成を Maven の pom.xml から変更した場合は再デプロイが必要
mvn dependency:copy-dependencies -DoutputDirectory=./WebContent/WEB-INF/lib

■参考
2009/10/16, Efficient Lightweight JMS with Spring and ActiveMQ
https://codedependents.com/2009/10/16/efficient-lightweight-jms-with-spring-and-activemq/

2011/03/03, Get started with Spring JMS using ActiveMQ
http://java-diaries.blogspot.jp/2011/03/get-started-with-spring-jms-using.html

Messaging with JMS
https://spring.io/guides/gs/messaging-jms/

2007/02/14, 6.ActiveMQについて
http://www.techscore.com/tech/Java/JavaEE/JMS/6/

2015/12/03, MQTTって何?
http://qiita.com/mamatumo/items/e99428775c20064f41ee

tag : ActiveMQ JMS Spring Tomcat QUEUE message Eclipse

2016-12-09 23:23 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] そもそもSaaSとか

tag: SaaS PaaS IaaS BaaS mBaaS DaaS CaaS NaaS XaaS

SaaS(サース)…Software as a Service
PaaS(パース)…Platform as a Service
IaaS(イァース/アイアース)…Infrastructure as a Service
BaaS …Backend as a Service
mBaaS …mobile Backend as a Service
DaaS …Desctop as a Service
CaaS …Crimeware as a Service
NaaS …Network as a Service
XaaS(ザース) …X as a Service

---------------------------------------------

SaaS
ソフトウェアとしてのサービス
ブラウザ上で閲覧できるメールやスケジュール管理などがこれに分類される
パソコンにインストールすることなく、ブラウザ上で使用できるさまざまなアプリケーションのことをSaaSと呼ぶ


PaaS
プラットフォームとしてのサービス
OSなどのプラットフォームの機能をサービスとして提供し、ユーザーが好きなソフトを使えるようにすること


IaaS
インフラストラクチャとしてのサービス
Webサービスや情報システムの公開に必要な仮想サーバーを提供するサービス
物理的なサーバーに求められていたCPUやメモリ、ハードディスクといったリソースを仮想化することによって、ネットワークを通じてこれらのリソースを利用できるようにする
マシンの機能だけを提供され、ユーザーが好きなプラットフォームとアプリケーションを利用できるようにすること
CPU、ストレージ等を提供するサービス 、HaaS HはHardwere のこと。iCloudとかgoogle driveとかそう。

BaaS
スマートフォン向けWebアプリケーションに必要な機能を提供するサービス
アプリケーションの構成要素のうち、
ユーザーと直接やり取りする部分がフロントエンド、
ユーザーには見えない部分で処理を行って出力や保存を行う部分がバックエンド。
具体的にはテータの保管、プッシュ通知の配信、会員認証や会員の管理、ソーシャルメディアとの連携、アプリ内のデータやコンテンツの管理といった機能

tag : SaaS PaaS IaaS BaaS mBaaS DaaS CaaS NaaS XaaS

2016-11-30 15:39 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Fabric開発環境でCLIを叩く

tag:
Fabric Hyperledger Ordering Service Endorser Committer Solo Kafka PBFT peer CC Chaincode

●概要
ローカル環境*でpeerを起動する。
StarterKitとの違いはDockerを一切使用しないこと。
Dockerを介さないことで開発中のCCの挙動確認がより容易になる。
実行するコマンドは主にCLI
また、全操作をsudoで実施している

* Local Development Environmentと呼ばれている環境。

●Overview
環境構築
peer/core.ymlの確認
ordererを起動 @Terminal①
peerを起動 @Terminal②
CCを登録 @Terminal③
CCをデプロイ @Terminal④
CCをクエリ @Terminal④ ←苦戦中なう

* CC = Chaincode

※ ちなみに① Orderer
公式手順(*1)には何故かordererに関する記載ない。
ざっくりPeerのサービス制御部分で、Solo, Kafka, PBFTの3モードがある。
関連定義は以下にある。
fabric/orderer/orderer.yaml

ref.
Hyperledger Ordering Service
https://github.com/hyperledger/fabric/blob/6f9b4272f4e3a6d843866402fa4325f39124e044/orderer/README.md
DockerHub>Hyperledger>fabric-orderer
https://hub.docker.com/r/hyperledger/fabric-orderer/

※ ちなみにのちなみに Peerの正体
PeerはEndorser(譲渡人)とCommitterの2つの顔がある。
Endorser - the peer will simulate the transaction and ensure that the outcome is both deterministic and stable
Committer - the peer will validate the integrity of a transaction and then append to the ledger.
ref.
Hyperledger-Fabric: What is the committer and orderer in core.yaml?
http://stackoverflow.com/questions/40339898/hyperledger-fabric-what-is-the-committer-and-orderer-in-core-yaml

※ ちなみに② membersrvc
公式手順(*1)では、make membersrvc && membersrvcと記載されているが
membersrvcはMakefileのtargetからなくなっているので端折る。

※ ちなみにのちなみに CLIは変身中
認証局周辺を主として変化が予想される。
v0.6.1-preview にはあったpeer networkが、
v0.7.0-snapshot からは消えており、新たにpeer loggingが追加されている。
加え、GitHub資材のfabric配下のMakefileのtargetも変貌を遂げており
v0.7.0-snapshotでは「make membersrvc」が出来なくなっている。

*1 公式手順
Writing, Building, and Running Chaincode in a Development Environment
https://hyperledger-fabric.readthedocs.io/en/latest/Setup/Chaincode-setup/
※ 同サイトに記載されているOption 1と 2・3では大きく違う
  1は開発環境が構築されるのに対し、2・3はDockerを大前提としている

■ 環境構築

Microsoft Azureに立てたUbuntu上に構築する。(Vagrant/VirtualBoxは使用しない)
ShellでのVagrant担当分の環境構築の実施 ― 鯨, Go, 環境変数, RocksDB, PIP, behave, 蛸
※ Rootユーザでの実施が無難。
※ 単体テストの実施も推奨されているが1hr以上かかる。適宜割愛するのが良い。実行するtargetはMakefile参照。2016/11/25時点ではpeerとordererで必要条件は満たせる。
sudo su
sudo apt-get update
# install Go
sudo apt install golang-go
Do you want to continue? [Y/n] y
sudo su
export GOPATH=$HOME/gows
export PATH=$PATH:$GOPATH/bin
mkdir -p $GOPATH/src/github.com/hyperledger

cd $GOPATH/src/github.com/hyperledger
## 方法① - the latest (recommended)
git clone https://github.com/hyperledger/fabric.git
## 方法② - specific version (v0.6)
# git clone https://github.com/hyperledger/fabric.git
# cd fabric
# git checkout -b v0.6
# git branch
# cd ../
## 方法③ - Gerrit (1 of official ways)
## in Building on Power Platform, it says get material from Gerrit.
# git clone http://gerrit.hyperledger.org/r/fabric
## 方法④ - specific version (v0.5) --> no shell for Ubuntu
## if you want to checkout using following line, you have to clone the material from hyperledger-archives/fabric.git
# git clone https://github.com/hyperledger-archives/fabric.git
# cd fabric
# git checkout -b origin/v0.5-developer-preview
# git branch
# cd ../

## the shell below will take around half hour; which not included in v0.5
./fabric/devenv/setupUbuntuOnPPC64le.sh
# (need about 30min to finish the shell. be patient!)
# add login-user into the Docker group
sudo usermod -aG docker root
exit x2

re-login
sudo su
export GOPATH=$HOME/gows
export PATH=$PATH:$GOPATH/bin
cd $GOPATH/src/github.com/hyperledger/fabric
## make peer and orderer instead of all-target; building all excepting testing which includes docker-target; setup a testing env.
## all images are v0.7.0-snapshot which are updated just few min ago and are remaned as latest. (the version is not available in DockerHub; https://hub.docker.com/r/hyperledger/fabric-peer/tags/)
## On the other hand, if you pull the image:latest, its latest update is 5 weeks ago, the one tagged as x86_64-0.6.1-preview.
## ref. https://github.com/hyperledger/fabric/blob/master/Makefile
## after making the peer, you'll see several docker images; hyperledger/fabric-javaenv, hyperledger/fabric-ccenv, openjdk and hyperledger/fabric-baseimage.
# make dist-clean all
make peer
make orderer
export PATH=$PATH:/root/gows/src/github.com/hyperledger/fabric/build/bin


■ peer/core.ymlの確認
peerコマンドはcore.ymlの定義に則って作成される。
peerの挙動を把握する為にymlを確認(&必要に応じて修正)する。
在り処:$GOPATH/src/github.com/hyperledger/fabric/peer/core.yml
※ peerコマンドを叩く前までにやればOK

すること①ファイルに定義されているCLI定義の確認
cli:
# The address that the cli process will use for callbacks from chaincodes
address: 0.0.0.0:7052
→CLIで実行する時のipとportを確認

すること②ファイルに定義されているREST定義の確認
rest:
# Enable/disable setting for the REST service. It is recommended to disable
# REST service on validators in production deployment and use non-validating
# nodes to host REST service
enabled: true
# The address that the REST service will listen on for incoming requests.
address: 0.0.0.0:7050
→RESTでの実行を可(true)にする ※ defaultはfalse
→RESTで実行する時のipとportを確認

(格闘中)すること③ordererのリスナポートの修正
# ----!!!!IMPORTANT!!!-!!!IMPORTANT!!!-!!!IMPORTANT!!!!----
# THIS HAS TO BE DONE IN THE CONTEXT OF BOOTSTRAP. TILL THAT
# IS DESIGNED AND FINALIZED, THE FOLLOWING COMMITTER/ORDERER
# DEFINITIONS HAVE TO SERVE AS THE MEANS TO DRIVE A SIMPLE
# SKELETON.
#
# All "chaincode" commands from CLI (except "query") will
# send response from the endorser to the Committer defined below.
committer:
enabled: true
ledger:
# orderer to talk to
orderer: 0.0.0.0:5151
→ordererのデフォルトポートの5151にする ※ 修正前は7050
⇒例外なり。。
 2016/11/29 06:17:52 grpc: addrConn.resetTransport failed to create client transport: connection error: desc = "transport: dial tcp 0.0.0.0:5151: getsockopt: connection refused"; Reconnecting to {"0.0.0.0:5151" }
 06:17:52.905 [committer] NewDeliverService -> ERRO 063 Cannot dial to 0.0.0.0:5151, because of grpc: timed out when dialing
 2016/11/29 06:17:52 grpc: addrConn.resetTransport failed to create client transport: connection error: desc = "transport: dial tcp 0.0.0.0:5151: getsockopt: connection refused"; Reconnecting to {"0.0.0.0:5151" }

すること④peerコマンドのビルド ★TBC-せんでも反映されるぽい
cd /root/gows/src/github.com/hyperledger/fabric
make peer
→core.ymlに加えた変更を反映させる為にpeerコマンドを作り直す
→ref>http://stackoverflow.com/questions/40211903/hyperledger-peer-node-start-error


■ Terminal #1 - orderer

cd $GOPATH/src/github.com/hyperledger/fabric/ && ./orderer
or
export GOPATH=$HOME/gows
export PATH=$PATH:$GOPATH/bin
export PATH=$PATH:/root/gows/src/github.com/hyperledger/fabric/build/bin
orderer

// Terminal #1 Result (rest:enabled:trueの場合) -----
root@VM01:~/gows/src/github.com/hyperledger/fabric/peer# orderer
[02:36:59.434] config_util.go:34: [DEBUG] Found map[interface{}]interface{} value for fileledger
[02:36:59.434] config_util.go:48: [DEBUG] Found real value for fileledger.Location setting to
[02:36:59.435] config_util.go:48: [DEBUG] Found real value for fileledger.Prefix setting to string hyperledger-fabric-rawledger
[02:36:59.435] config_util.go:34: [DEBUG] Found map[interface{}]interface{} value for kafka
[02:36:59.435] config_util.go:48: [DEBUG] Found real value for kafka.Brokers setting to []interface {} [127.0.0.1:9092]
[02:36:59.435] config_util.go:48: [DEBUG] Found real value for kafka.Topic setting to string test
[02:36:59.435] config_util.go:48: [DEBUG] Found real value for kafka.PartitionID setting to int 0
[02:36:59.435] config_util.go:45: [DEBUG] Found map[string]interface{} value for kafka.Retry
[02:36:59.435] config_util.go:48: [DEBUG] Found real value for kafka.Retry.Period setting to string 3s
[02:36:59.435] config_util.go:48: [DEBUG] Found real value for kafka.Retry.Stop setting to string 60s
[02:36:59.435] config_util.go:34: [DEBUG] Found map[interface{}]interface{} value for general
[02:36:59.435] config_util.go:48: [DEBUG] Found real value for general.OrdererType setting to string solo
[02:36:59.435] config_util.go:48: [DEBUG] Found real value for general.BatchTimeout setting to string 10s
[02:36:59.435] config_util.go:48: [DEBUG] Found real value for general.MaxWindowSize setting to int 1000
[02:36:59.435] config_util.go:48: [DEBUG] Found real value for general.BatchSize setting to int 10
[02:36:59.435] config_util.go:48: [DEBUG] Found real value for general.ListenAddress setting to string 127.0.0.1
[02:36:59.435] config_util.go:45: [DEBUG] Found map[string]interface{} value for general.Profile
[02:36:59.435] config_util.go:48: [DEBUG] Found real value for general.Profile.Enabled setting to bool false
[02:36:59.435] config_util.go:48: [DEBUG] Found real value for general.Profile.Address setting to string 0.0.0.0:6060
[02:36:59.435] config_util.go:48: [DEBUG] Found real value for general.GenesisMethod setting to string static
[02:36:59.435] config_util.go:48: [DEBUG] Found real value for general.ListenPort setting to int 7050
[02:36:59.436] config_util.go:48: [DEBUG] Found real value for general.QueueSize setting to int 10
[02:36:59.436] config_util.go:48: [DEBUG] Found real value for general.LedgerType setting to string ram
[02:36:59.436] config_util.go:34: [DEBUG] Found map[interface{}]interface{} value for ramledger
[02:36:59.436] config_util.go:48: [DEBUG] Found real value for ramledger.HistorySize setting to int 1000
[02:36:59.436] config_util.go:93: [INFO ] map[ramledger:map[HistorySize:1000] fileledger:map[Location: Prefix:hyperledger-fabric-rawledger] kafka:map[Brokers:[127.0.0.1:9092] Topic:test PartitionID:0 Retry:map[Period:3s Stop:60s]] general:map[Profile:map[Address:0.0.0.0:6060 Enabled:false] ListenPort:7050 QueueSize:10 OrdererType:solo BatchTimeout:10s MaxWindowSize:1000 BatchSize:10 ListenAddress:127.0.0.1 GenesisMethod:static LedgerType:ram]]
[02:36:59.436] config.go:186: [INFO ] Validated configuration to: &{General:{OrdererType:solo LedgerType:ram BatchTimeout:10s BatchSize:10 QueueSize:10 MaxWindowSize:1000 ListenAddress:127.0.0.1 ListenPort:7050 GenesisMethod:static Profile:{Enabled:false Address:0.0.0.0:6060}} RAMLedger:{HistorySize:1000} FileLedger:{Location: Prefix:hyperledger-fabric-rawledger} Kafka:{Brokers:[127.0.0.1:9092] Topic:test PartitionID:0 Retry:{Period:3s Stop:1m0s} Version:{version:[0 9 0 1]}}}
[02:36:59.437] ramledger.go:235: [DEBUG] Sending signal that block 18446744073709551615 has a successor
[02:36:59.437] server.go:35: [INFO ] Starting orderer with consenter=*solo.consenter, and ledger=*ramledger.ramLedger
----- Terminal #1 Result (rest:enabled:trueの場合) //

// 参考:Terminal #1 Result (rest:enabled:falseの場合) -----
root@VM01:~# orderer
[04:43:54.533] config_util.go:34: [DEBUG] Found map[interface{}]interface{} value for kafka
[04:43:54.540] ramledger.go:235: [DEBUG] Sending signal that block 18446744073709551615 has a successor
[04:43:54.540] server.go:35: [INFO ] Starting orderer with consenter=*solo.consenter, and ledger=*ramledger.ramLedger
----- 参考:Terminal #1 Result (rest:enabled:falseの場合) //


■ Terminal #2 - start peer

export GOPATH=$HOME/gows
export PATH=$PATH:$GOPATH/bin
export PATH=$PATH:/root/gows/src/github.com/hyperledger/fabric/build/bin

どれでも(取り敢えず)OK
peer node start --peer-chaincodedev
CORE_PEER_ADDRESS=localhost:7051 peer node start --peer-chaincodedev
CORE_PEER_ADDRESS=0.0.0.0:7051 peer node start --peer-chaincodedev
CORE_PEER_ADDRESS=172.17.0.3:7051 peer node start --peer-chaincodedev

|●脱線>Committerの初期化が失敗する
|[error]
|# CORE_PEER_ADDRESS=172.17.0.3:7051 peer node start --peer-chaincodedev
|04:05:52.380 [committer] readUntilClose -> ERRO 067 Invalid transaction, error Invalid creator specified in the header
|→放置中★TODO

|●脱線>ポート7051が使用中な例外でpeer起動できない
|[error]
|# CORE_PEER_ADDRESS=172.17.0.3:7051 peer node start --peer-chaincodedev
|2016/11/29 03:11:50 Failed to listen: listen tcp 0.0.0.0:7051: bind: address already in use

|[check]
|ポートの確認
|# netstat -untap
|結果割愛
|# netstat -untap | grep peer | grep tcp
|tcp 1 0 127.0.0.1:54670 127.0.0.1:7050 CLOSE_WAIT 6391/peer
|tcp6 0 0 :::7051 :::* LISTEN 6391/peer
|tcp6 0 0 :::7053 :::* LISTEN 6391/peer
|プロセスの確認
|# ps
| PID TTY TIME CMD
| 5183 pts/3 00:00:00 sudo
| 5186 pts/3 00:00:00 su
| 5187 pts/3 00:00:00 bash
| 6391 pts/3 00:00:00 peer
| 8004 pts/3 00:00:00 ps

|[action]
|問題のポートを占有しているプロセスを射殺
|# kill -9 6391
|[1]+ Killed CORE_PEER_ADDRESS=localhost:7051 peer node start --peer-chaincodedev
|# ps
| PID TTY TIME CMD
| 5183 pts/3 00:00:00 sudo
| 5186 pts/3 00:00:00 su
| 5187 pts/3 00:00:00 bash
| 8014 pts/3 00:00:00 ps

|[reason]
|多分、StarterKitでdocker compose経由に起動させたpeerプロセスがゾンビ化したと思われる。



// Terminal #2 Result -----
04:53:39.918 [sysccapi] RegisterSysCC -> INFO 061 system chaincode vscc(github.com/hyperledger/fabric/core/system_chaincode/vscc) registered
04:53:39.918 [committer] NewDeliverService -> INFO 062 Creating committer for single noops endorser
04:53:39.919 [nodeCmd] serve -> INFO 063 Starting peer with ID=name:"jdoe" , network ID=dev, address=0.0.0.0:7051, rootnodes=, validator=true
04:53:39.920 [protoutils] ValidateTransaction -> INFO 064 ValidateTransactionEnvelope starts for envelope 0xc8201fcf60
04:53:39.920 [protoutils] ValidateTransaction -> INFO 065 Header is chainHeader: chainID:"**TEST_CHAINID**" > signatureHeader:
04:53:39.920 [protoutils] validateChainHeader -> INFO 066 validateChainHeader info: header type 1
04:53:39.920 [committer] readUntilClose -> ERRO 067 Invalid transaction, error Invalid creator specified in the header
Commit success, created a block!
----- Terminal #2 Result //
★TBC StartOpenchainRESTServer に関するログが出力されていない=RESTでアクセスできない。Committerの例外が起因しているのか否か

// Terminal #1 Result -----
[04:53:39.919] server.go:52: [DEBUG] Starting new Deliver handler
[04:53:39.919] deliver.go:50: [DEBUG] Starting new Deliver loop
[04:53:39.920] deliver.go:144: [DEBUG] Received message Seek:
[04:53:39.920] deliver.go:149: [DEBUG] Sent update
[04:53:39.920] deliver.go:87: [DEBUG] Receiving message Seek:
[04:53:39.920] deliver.go:186: [DEBUG] Updating properties for client
[04:53:39.920] deliver.go:133: [DEBUG] Room for more blocks, activating channel
[04:53:39.920] deliver.go:133: [DEBUG] Room for more blocks, activating channel
----- Terminal #1 Result //


■ Terminal #3 - register cc
Hyperledger Fabric Starter KitでいうところのStarterコンテナに当たるところ
cd /root/gows/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02

どれでもOK
CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=0.0.0.0:7051 ./chaincode_example02
CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=localhost:7051 ./chaincode_example02
CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=127.0.0.1:7051 ./chaincode_example02
cf.
localhost(127.0.0.1)がactiveであることはTerminal #1のordererの標準出力からも確認できる

cf.
NG: CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=172.17.0.3:7051 ./chaincode_example02
  due to: 04:19:37.824 [shim] ERRO : Error trying to connect to local peer: grpc: timed out when dialing
  (CORE_PEER_ADDRESS=172.17.0.3:7051 peer node start --peer-chaincodedevでpeerを起動していてもNG)
NG: CORE_CHAINCODE_ID_NAME=mycc ./chaincode_example02
  due to: 04:21:15.776 [shim] CRIT : peer.address not configured, can't connect to peer

// Terminal #3 Result -----
root@VM01:~/gows/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02# CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=0.0.0.0:7051 ./chaincode_example02
05:15:50.037 [shim] INFO : Chaincode log level not provided; defaulting to: DEBUG
05:15:50.037 [shim] DEBU : Peer address: 0.0.0.0:7051
05:15:50.046 [shim] DEBU : os.Args returns: [./chaincode_example02]
05:15:50.047 [shim] DEBU : Registering.. sending REGISTER
05:15:50.048 [shim] DEBU : []Received message REGISTERED from shim
05:15:50.048 [shim] DEBU : []Handling ChaincodeMessage of type: REGISTERED(state:created)
05:15:50.048 [shim] DEBU : Received REGISTERED, ready for invocations
----- Terminal #3 Result //

// Terminal #2 Result -----
05:15:50.046 [chaincode] HandleChaincodeStream -> DEBU 068 Current context deadline = 0001-01-01 00:00:00 +0000 UTC, ok = false
05:15:50.047 [chaincode] processStream -> DEBU 069 []Received message REGISTER from shim
05:15:50.047 [chaincode] HandleMessage -> DEBU 06a []Handling ChaincodeMessage of type: REGISTER in state created
05:15:50.047 [chaincode] beforeRegisterEvent -> DEBU 06b Received REGISTER in state created
05:15:50.047 [chaincode] registerHandler -> DEBU 06c registered handler complete for chaincode mycc
05:15:50.047 [chaincode] beforeRegisterEvent -> DEBU 06d Got REGISTER for chaincodeID = name:"mycc" , sending back REGISTERED
05:15:50.047 [chaincode] notifyDuringStartup -> DEBU 06e nothing to notify (dev mode ?)
----- Terminal #2 Result //

peerが起動できると以下のファイルが生成されていることが確認できる。
root@VM01:/var/hyperledger/production# ls -l
total 12
drwxr-xr-x 2 root root 4096 Nov 28 06:55 db
drwxr-xr-x 3 root root 4096 Nov 28 06:55 ledger
-rw-r--r-- 1 root root 5 Nov 28 06:55 peer.pid

■ Terminal #4 - deploy cc && query cc
□ CCデプロイ
export GOPATH=$HOME/gows
export PATH=$PATH:$GOPATH/bin
export PATH=$PATH:/root/gows/src/github.com/hyperledger/fabric/build/bin
どちらでもOK
peer chaincode deploy -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -n mycc2 -c '{"Args": ["init", "a","100", "b", "200"]}'
CORE_PEER_ADDRESS=0.0.0.0:7051 peer chaincode deploy -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -n mycc -c '{"Args": ["init", "a","100", "b", "200"]}'
★TBC ローカルのCCのパスの指定方法

cf.
NG: CORE_PEER_ADDRESS=172.17.0.3:7051 peer chaincode deploy -c '{"Args": ["init", "a","100", "b", "200"]}'
NG: CORE_PEER_ADDRESS=172.17.0.3:7051 peer chaincode deploy -n mycc -c '{"Args": ["init", "a","100", "b", "200"]}'
NG: CORE_PEER_ADDRESS=172.17.0.3:7051 peer chaincode deploy -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -n mycc -c '{"Args": ["init", "a","100", "b", "200"]}'
  due to:
  2016/11/29 05:48:32 grpc: addrConn.resetTransport failed to create client transport: connection error: desc = "transport: dial tcp 172.17.0.3:7051: getsockopt: no route to host"; Reconnecting to {"172.17.0.3:7051" }
  Error: Error getting endorser client chaincode: Error trying to connect to local peer: grpc: timed out when dialing

// Terminal #4 Result -----
root@VM01:/home/user1# peer chaincode deploy -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -n mycc2 -c '{"Args": ["init", "a","100", "b", "200"]}'
05:48:22.033 [msp] func1 -> INFO 001 Creating the msp manager
05:48:22.033 [msp] GetManager -> INFO 002 Returning MSP manager %!p(msp.peerMspManagerImpl={map[] false})
05:48:22.033 [msp] Setup -> INFO 003 Setting up the MSP manager from config file /root/gows/src/github.com/hyperledger/fabric/msp/peer-config.json
05:48:22.033 [msp] newBccspMsp -> INFO 004 Creating BCCSP-based MSP instance
05:48:22.033 [SW_BCCSP] createKeyStoreIfNotExists -> INFO 005 KeyStore path [/tmp] missing [false]: []
05:48:22.033 [msp] Setup -> INFO 006 Setting up MSP DEFAULT
05:48:22.033 [msp] Setup -> INFO 007 Setting up MSP instance from file /root/gows/src/github.com/hyperledger/fabric/msp/peer-config.json
05:48:22.093 [msp] newIdentity -> INFO 008 Creating identity instance for ID &{{DEFAULT} ROOTCA}
05:48:22.093 [msp] newSigningIdentity -> INFO 009 Creating signing identity instance for ID &{{DEFAULT} PEER}
05:48:22.093 [msp] Setup -> INFO 00a MSP manager setup complete (config file /root/gows/src/github.com/hyperledger/fabric/msp/peer-config.json)
----- Terminal #4 Result //

// Terminal #3 Result -----
05:48:37.890 [shim] DEBU : [lccc]Received message INIT from shim
05:48:37.890 [shim] DEBU : [lccc]Handling ChaincodeMessage of type: INIT(state:established)
05:48:37.890 [shim] DEBU : Entered state init
05:48:37.890 [shim] DEBU : [lccc]Received INIT, initializing chaincode
Aval = 100, Bval = 200
05:48:37.890 [shim] DEBU : [lccc]Inside putstate, isTransaction = true
05:48:37.890 [shim] DEBU : [lccc]Sending PUT_STATE
05:48:37.891 [shim] DEBU : [lccc]Received message RESPONSE from shim
05:48:37.891 [shim] DEBU : [lccc]Handling ChaincodeMessage of type: RESPONSE(state:init)
05:48:37.891 [shim] DEBU : [lccc]before send
05:48:37.891 [shim] DEBU : [lccc]after send
05:48:37.891 [shim] DEBU : [lccc]Received RESPONSE, communicated (state:init)
05:48:37.891 [shim] DEBU : [lccc]Received RESPONSE. Successfully updated state
05:48:37.891 [shim] DEBU : [lccc]Inside putstate, isTransaction = true
05:48:37.891 [shim] DEBU : [lccc]Sending PUT_STATE
05:48:37.900 [shim] DEBU : [lccc]Received message RESPONSE from shim
05:48:37.900 [shim] DEBU : [lccc]Handling ChaincodeMessage of type: RESPONSE(state:init)
05:48:37.900 [shim] DEBU : [lccc]before send
05:48:37.900 [shim] DEBU : [lccc]after send
05:48:37.900 [shim] DEBU : [lccc]Received RESPONSE, communicated (state:init)
05:48:37.900 [shim] DEBU : [lccc]Received RESPONSE. Successfully updated state
05:48:37.900 [shim] DEBU : [lccc]Init succeeded. Sending COMPLETED
05:48:37.900 [shim] DEBU : [lccc]Move state message COMPLETED
05:48:37.900 [shim] DEBU : [lccc]Handling ChaincodeMessage of type: COMPLETED(state:init)
05:48:37.900 [shim] DEBU : [lccc]send state message COMPLETED
----- Terminal #3 Result //

// Terminal #2 Result -----
05:48:50.503 [protoutils] validateEndorserTransaction -> INFO 16d validateEndorserTransaction info: there are 1 actions
05:48:50.503 [protoutils] validateEndorserTransaction -> INFO 16e validateEndorserTransaction info: signature header is valid
05:48:50.526 [protoutils] ValidateTransaction -> INFO 16f ValidateTransactionEnvelope returns 0xc820126530, err %!s()
Commit success, created a block!
----- Terminal #2 Result //

// Terminal #1 Result -----
[05:48:39.483] server.go:46: [DEBUG] Starting new Broadcast handler
[05:48:39.737] blockcutter.go:74: [DEBUG] Enqueuing message into batch
[05:48:49.737] consensus.go:101: [DEBUG] Batch timer expired, creating block
[05:48:49.959] ramledger.go:235: [DEBUG] Sending signal that block 0 has a successor
[05:48:50.204] deliver.go:133: [DEBUG] Room for more blocks, activating channel
----- Terminal #1 Result //


|●脱線>同じCC名でデプロイをやり直せない
|[error]
|05:38:12.690 [msp] Setup -> INFO 00a MSP manager setup complete (config file /root/gows/src/github.com/hyperledger/fabric/msp/peer-config.json)
|Error: Error endorsing chaincode: rpc error: code = 2 desc = Error deploying chaincode: Transaction or query returned with failure: Chaincode exists mycc
|05:38:28.525 [shim] func1 -> ERRO 09f [82cd940a]Transaction execution failed. Sending ERROR
|05:38:28.525 [chaincode] processStream -> DEBU 0a0 [82cd940a]Received message ERROR from shim
|05:38:28.525 [chaincode] processStream -> ERRO 0a1 Got error: Chaincode exists mycc

|[action]
|Terminal #2 (peer startしたやつ) と3 (CC登録したやつ)をCTRL+Cで強制終了し
|/var/hyperledger/production配下を全削除してpeerを再起動する。
|cd /var/hyperledger
|rm -rf production


□ CCクエリ → 苦戦中
peer起動時のcommitterの例外が起因している気がする★TODO
NG: peer chaincode query -n mycc -c '{"Args": ["query", "b"]}'
  due to: Error: Error endorsing chaincode: rpc error: code = 2 desc = Error deploying chaincode: Failed to launch chaincode spec(Failed to init chaincode(handler not found for chaincode mycc))
NG: peer chaincode query -l golang -n mycc -c '{"Function":"query", "Args":["b"] }'
NG: CORE_PEER_ADDRESS=0.0.0.0:7051 peer chaincode query -n mycc -c '{"Args": ["query", "b"]}'
NG: CORE_PEER_ADDRESS=172.17.0.3:30303 peer chaincode query -n mycc -c '{"Args": ["query", "b"]}'
NG: CORE_PEER_ADDRESS=172.17.0.3:7051 peer chaincode query -n mycc -c '{"Args": ["query", "b"]}'
NG: peer chaincode query -n vscc -c '{"Args": ["query", "b"]}'
NG: peer chaincode query -n **TEST_CHAINID** -c '{"Args": ["query", "b"]}'

ref.
Hyperledger Fabric: Error while performing chaincode deploy on peer
http://stackoverflow.com/questions/40371024/hyperledger-fabric-error-while-performing-chaincode-deploy-on-peer

tag : Fabric Hyperledger Ordering Service Endorser Committer Solo Kafka PBFT peer

2016-11-28 19:11 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Hyperledger Fabricの為の環境構築と鯨家族の扱い方

#0
2016/11/21
"
□ お題目 --------------------"
"環境構築>
はじめに"
N/A
"
□ 実施方法 --------------------"
"ここに記す環境構築は全てが必須な訳ではない。
各々の目的に応じて必要な設定を選ぶこと。"
"
□ 確認方法/実行結果 ---------------"

"
□ 備考/参考 --------------------"

"
========================="
#1
2016/11/11
"
□ お題目 --------------------"
環境構築
既存環境の更新
"
□ 実施方法 --------------------"
sudo apt-get update
"
□ 確認方法/実行結果 ---------------"
"$ apt-get -v
--------------------
apt 1.2.12 (amd64)"
"
□ 備考/参考 --------------------"

"
========================="
#2
2016/11/11
"
□ お題目 --------------------"
"環境構築>
単体"
"Gitのインストール
※ Azure Ubuntuには不要"
"
□ 実施方法 --------------------"
"sudo apt-get install git

"
"
□ 確認方法/実行結果 ---------------"
"$ git --version
--------------------
git version 2.7.4"
"
□ 備考/参考 --------------------"

"
========================="
#3
2016/11/18
"
□ お題目 --------------------"
"環境構築
Fabric StarterKit"
"必要最小限物資の導入
(フルセット)"
"
□ 実施方法 --------------------"
"sudo apt-get update
sudo apt-get install wget
wget -qO- https://get.docker.com/ | sh
sudo usermod -aG docker user1
sudo su
curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
(re-login to terminal)
mkdir handson
curl -o docker-compose.yml https://raw.githubusercontent.com/hyperledger/fabric/master/examples/sdk/node/docker-compose.yml
docker-compose up -d
docker-compose down

Go言語のインストール、GOPATHの設定、fabric資材の取得はいずれも不要。
※ docker-compose up -d で (もし無ければ) docker imageの取得、dockerコンテナの生成、コンテナの起動をする。
※ docker-compose down で コンテナを停止し、削除する。(docker imageはそのまま残る。)"
"
□ 確認方法/実行結果 ---------------"
"以下のコマンドで実行前後の違いが確認できる。
@HOSTVM
$ docker images
$ docker ps

"
"
□ 備考/参考 --------------------"
"StarterKitをHOSTから動かすには以下が必須条件となる。
Docker がインストールされている
Docker Compose がインストールされている
StarterKit用のymlが取得できている
以上を満たせば、後は「蛸 up」で起動するのみ。"
"
========================="
#4
2016/11/17
"
□ お題目 --------------------"
"環境構築>
フルセット"
fabric>インストール for Ubuntu
"
□ 実施方法 --------------------"
"ShellでのVagrant担当分の環境構築の実施 ― 鯨, Go, 環境変数, RocksDB, PIP, behave, 蛸
※ Rootユーザでの実施が無難。
※ 単体テストの実施も推奨されているが1hr以上かかる。適宜割愛するのが良い。実行するtargetはMakefile参照
sudo su
# install Go
sudo apt install golang-go
Do you want to continue? [Y/n] y
sudo su
export GOPATH=$HOME/gows
export PATH=$PATH:$GOPATH/bin
mkdir -p $GOPATH/src/github.com/hyperledger
cd $GOPATH/src/github.com/hyperledger
git clone http://gerrit.hyperledger.org/r/fabric
./fabric/devenv/setupUbuntuOnPPC64le.sh
# (need about 30min to finish the shell. be patient!)
# add login-user into the Docker group
sudo usermod -aG docker root
exit x2
re-login
sudo su
export GOPATH=$HOME/gows
export PATH=$PATH:$GOPATH/bin
cd $GOPATH/src/github.com/hyperledger/fabric
make dist-clean all
export PATH=$PATH:/root/gows/src/github.com/hyperledger/fabric/build/bin"
"
□ 確認方法/実行結果 ---------------"
"インストールした端末でfabricコマンド(peer network等)が実行できるようになる。
実行結果>Makefile Resultシート参照
単体テストの後の最後のtargetであるbehaveで硬直したので強制終了。ログを見るにpython辺りの処理で躓いた模様。
TBC: behave (according to Makefile, it's 'runs the behave test')"
"
□ 備考/参考 --------------------"
"Building on Power Platform
https://github.com/hyperledger/fabric/blob/master/docs/dev-setup/build.md#building-on-power-platform
Shell
https://github.com/hyperledger/fabric/blob/master/devenv/setupUbuntuOnPPC64le.sh
Makefile (前提条件: Go, docker, git, curlがインストールされていること)
https://github.com/hyperledger/fabric/blob/master/Makefile"
"
========================="
#5
2016/11/11
"
□ お題目 --------------------"
"環境構築>
フルセット"
fabric>インストール for RedHat
"
□ 実施方法 --------------------"
"ShellでのVagrant担当分の環境構築の実施 ― 鯨, Go, 環境変数, RocksDB, PIP, behave, 蛸
$ sudo su
$ sudo apt install yum
$ yum install git
$ mkdir -p $HOME/git/src/github.com/hyperledger
$ git clone http://gerrit.hyperledger.org/r/fabric
$ source fabric/devenv/setupRHELonZ.sh
"
"
□ 確認方法/実行結果 ---------------"
N/A
"
□ 備考/参考 --------------------"
"Building on Z
https://github.com/hyperledger/fabric/blob/master/docs/dev-setup/build.md#building-on-z"
"
========================="
#6
2016/11/11
"
□ お題目 --------------------"
"環境構築>
単体"
Go>インストール
"
□ 実施方法 --------------------"
"either one:
$ sudo apt install golang-go
Do you want to continue? [Y/n] y
…………………………
$ sudo su
# apt-get update && apt-get install golang
Do you want to continue? [Y/n] y
"
"
□ 確認方法/実行結果 ---------------"
"$ go version
--------------------
go version go1.6.2 linux/amd64"
"
□ 備考/参考 --------------------"

"
========================="
#7
2016/11/11
"
□ お題目 --------------------"
"環境構築>
Setting"
環境変数の設定
"
□ 実施方法 --------------------"
"mkdir $HOME/gows
--------------------
export GOPATH=$HOME/gows
export PATH=$PATH:$GOPATH/bin
"
"
□ 確認方法/実行結果 ---------------"
"printenv
--------------------
XDG_SESSION_ID=104
TERM=xterm
SHELL=/bin/bash
以下割愛"
"
□ 備考/参考 --------------------"

"
========================="
#8
2016/11/11
"
□ お題目 --------------------"
"環境構築>
単体"
wget>インストール
"
□ 実施方法 --------------------"
sudo apt-get install wget
"
□ 確認方法/実行結果 ---------------"
"$ wget -V
--------------------
GNU Wget 1.17.1 built on linux-gnu.
"
"
□ 備考/参考 --------------------"

"
========================="
#9
2016/11/11
"
□ お題目 --------------------"
"環境構築>
単体"
クジラ>インストール
"
□ 実施方法 --------------------"
"$ wget -qO- https://get.docker.com/ | sh
$ sudo usermod -aG docker user1
* replace user1 with your own user
then, re-login after logout.
"
"
□ 確認方法/実行結果 ---------------"
"$ docker -v
--------------------
Docker version 1.12.1, build 23cf638"
"
□ 備考/参考 --------------------"

"
========================="
#10
2016/11/11
"
□ お題目 --------------------"
"環境構築>
単体"
タコ>インストール
"
□ 実施方法 --------------------"
"更新が頻繁。公式サイトも参照のこと。
$ sudo su
# curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# exit
"
"
□ 確認方法/実行結果 ---------------"
"$ docker-compose version
$ docker-compose -v
--------------------
docker-compose version 1.9.0, build 2585387

"
"
□ 備考/参考 --------------------"
https://github.com/docker/compose/releases
"
========================="
#11
2016/11/11
"
□ お題目 --------------------"
環境設定
fabric資材の取得
"
□ 実施方法 --------------------"
"$ mkdir -p $HOME/gows/src/github.com/hyperledger
$ cd $HOME/gows/src/github.com/hyperledger
$ git clone https://github.com/hyperledger/fabric.git
※ 上記でfabricの全て(全バージョン)を取得している
"
"
□ 確認方法/実行結果 ---------------"
""
"
□ 備考/参考 --------------------"
"任意のversionにしたい場合
$ cd $HOME/gows/src/github.com/hyperledger$ git clone https://github.com/hyperledger/fabric.git
$ cd fabric
$ git checkout v0.6.1-preview
もしくは
git clone -b v0.6.1-preview https://github.com/hyperledger/fabric.git
"
"
========================="
#12
2016/11/11
"
□ お題目 --------------------"
"環境構築>
単体"
Rocks DB>インストール
"
□ 実施方法 --------------------"
"$ sudo apt-get install -y libsnappy-dev zlib1g-dev libbz2-dev
$ cd /tmp
$ git clone https://github.com/facebook/rocksdb.git
$ cd rocksdb
$ git checkout v4.1
諸設定
$ PORTABLE=1 make shared_lib
30分ほど待つ。
$ sudo INSTALL_PATH=/usr/local make install-shared

11/15 以下のところは割愛した
git checkout v4.1
"
"
□ 確認方法/実行結果 ---------------"

"
□ 備考/参考 --------------------"
"※fabric v0.6.xはRocksDB v4.1を想定している
※fabric v0.6.xを扱うには別途対bug処置が必要
Building the fabric, Building outside of Vagrant,
https://github.com/hyperledger/fabric/blob/master/docs/dev-setup/build.md
RocksDB > latest version
https://github.com/facebook/rocksdb/releases"
"
========================="
#13
2016/11/11
"
□ お題目 --------------------"
"環境構築>
単体"
Pip>インストール
"
□ 実施方法 --------------------"
"$ curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python
$ sudo apt install python-pip
$ pip install --upgrade pip
$ sudo pip install behave nose docker-compose
$ sudo pip install -I flask==0.10.1 python-dateutil==2.2 pytz==2014.3 pyyaml==3.10 couchdb==1.0 flask-cors==2.0.1 requests==2.4.3
"
"
□ 確認方法/実行結果 ---------------"

"
□ 備考/参考 --------------------"

"
========================="
#14
2016/11/11
"
□ お題目 --------------------"
"環境構築>
単体"
タコ>初期値設定
"
□ 実施方法 --------------------"
"$ cd /etc/default/
$ sudo chmod 777 docker
$ vi docker
以下を追記
DOCKER_OPTS=""-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock""
"
"
□ 確認方法/実行結果 ---------------"

"
□ 備考/参考 --------------------"

"
========================="
#15
2016/11/16
"
□ お題目 --------------------"
"環境構築>
単体"
"gcc>インストール
(C言語のコンパイラ)"
"
□ 実施方法 --------------------"
$ sudo apt-get install gcc
"
□ 確認方法/実行結果 ---------------"
"Reading package lists... Done
Building dependency tree
Reading state information... Done
gcc is already the newest version (4:5.3.1-1ubuntu1).
gcc set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 27 not upgraded.
"
"
□ 備考/参考 --------------------"
HOSTVMでmake peerする為に入れてみたが不要。
"
========================="
#16
2016/11/11
"
□ お題目 --------------------"
基本操作>蛸
タコ>定義ファイルの準備
"
□ 実施方法 --------------------"
"$ mkdir -p $HOME/mydir
$ cd $HOME/mydir
$ touch docker-compose.yml
$ vi docker-compose.yml
"
"
□ 確認方法/実行結果 ---------------"

"
□ 備考/参考 --------------------"
"Writing, Building, and Running Chaincode in a Development Environment, Option 2 Docker for Mac or Windows, Running the Peer and CA,
https://github.com/hyperledger/fabric/blob/master/docs/Setup/Chaincode-setup.md"
"
========================="
#17
2016/11/11
"
□ お題目 --------------------"
基本操作>蛸
タコ>起動
"
□ 実施方法 --------------------"
"$ cd $HOME/mydir
$ docker-compose up –d
$ docker-compose up -d -f $HOME/mydir/my-docker-compose.yml
※ 独自のファイル名にしている時は「f」で指定する。
"
"
□ 確認方法/実行結果 ---------------"

"
□ 備考/参考 --------------------"
"以下の操作に相当する。
Docker pull image
docker build image
docker run container"
"
========================="
#18
2016/11/11
"
□ お題目 --------------------"
基本操作>蛸
タコ>終了
"
□ 実施方法 --------------------"
"docker-compose down
docker-compose down -f $HOME/mydir/my-docker-compose.yml
※ 独自のファイル名にしている時は「f」で指定する。
"
"
□ 確認方法/実行結果 ---------------"

"
□ 備考/参考 --------------------"

"
========================="
#19
2016/11/22
"
□ お題目 --------------------"
基本操作>鯨
"クジラ>
箱の立ち上げ方>概念"
"
□ 実施方法 --------------------"
"コンテナはイメージを元に生成される。
方法① 自力で鯨絵図を捜索→箱生成
方法② 鯨の定義ファイルを用意→鯨絵図のレポジトリを定義→定義ファイルを鯨に食わせて箱生成
共通する当該コマンドは以下の2つ
$ docker create {sth}
$ docker start {sth}
上記の2コマンドを一括で処理したい場合は以下のコマンド
$ docker run {sth}
※ いずれもTag (≒image version)を指定しない場合は最新版の鯨絵図が取得される。
※ ちなみに箱を畳む時は「docker stop {sth}」で。"
"
□ 確認方法/実行結果 ---------------"

"
□ 備考/参考 --------------------"
"ref. 2016年版、Dockerのすべてが5分でわかるまとめ!(コマンド一覧付き) ★オススメ
http://paiza.hatenablog.com/entry/docker_intro"
"
========================="
#20
2016/11/22
"
□ お題目 --------------------"
基本操作>鯨
"クジラ>
鯨絵図一覧取得"
"
□ 実施方法 --------------------"
"$ docker images
上記で取得できる情報は以下に格納されている情報。
/var/lib/docker/image/aufs/repositories.json"
"
□ 確認方法/実行結果 ---------------"
"root@VM02:/var/lib/docker/image/aufs# docker -v
Docker version 1.12.3, build 6b644ec
root@VM02:/var/lib/docker/image/aufs# date
Tue Nov 22 02:27:30 UTC 2016
root@VM02:/var/lib/docker/image/aufs# ls -l
total 16
drwx------ 4 root root 4096 Nov 18 01:14 distribution
drwx------ 4 root root 4096 Nov 18 01:09 imagedb
drwx------ 5 root root 4096 Nov 18 01:16 layerdb
-rw------- 1 root root 1079 Nov 22 01:09 repositories.json
"
"
□ 備考/参考 --------------------"

"
========================="
#21
2016/11/11
"
□ お題目 --------------------"
基本操作>鯨
"クラジ>
箱の物理ログファイル確認"
"
□ 実施方法 --------------------"
"コンテナのログファイルはHOST VMの以下ロケーションにある。
/var/lib/docker/containers//-json.log
$ sudo su
# cd /var/lib/docker/containers/"
"
□ 確認方法/実行結果 ---------------"

"
□ 備考/参考 --------------------"

"
========================="
#22
2016/11/11
"
□ お題目 --------------------"
基本操作>鯨
"クラジ>
箱のログ確認"
"
□ 実施方法 --------------------"
"docker logs
e.g. $ docker logs vp0"
"
□ 確認方法/実行結果 ---------------"

"
□ 備考/参考 --------------------"

"
========================="
#23
2016/11/22
"
□ お題目 --------------------"
基本操作>鯨
"クジラ>
箱への出入り"
"
□ 実施方法 --------------------"
"入り:
$ docker exec -it peer /bin/bash
出:
方法① bashを終了させる
# exit
方法② bashから抜ける (dettach)
[control] + p もしくは [control] + q"
"
□ 確認方法/実行結果 ---------------"
"※ exit: これによりbashのプロセスが終了する。そのプロセスがコンテナで動作する優位のプロセスだった場合は、bashプロセスの終了でコンテナも終了する=コンテナに加えた変更が失われる。
※ dettach: これでbashプロセスを終了させずにログアウトできる。コンテナで動作していたプロセスがこのbashだけだったとしてもdettachすればコンテナは終了しない=コンテナに加えた変更も保持される。"
"
□ 備考/参考 --------------------"

"
========================="
#24
2016/11/22
"
□ お題目 --------------------"
基本操作>鯨
"クジラ>
鯨絵図の加筆履歴"
"
□ 実施方法 --------------------"
"docker history {イメージ名 or イメージID}
e.g. $ docker history mypeer"
"
□ 確認方法/実行結果 ---------------"
"user1@VM02:~/handson$ docker history d910ed217b7d
IMAGE CREATED CREATED BY SIZE COMMENT
d910ed217b7d 25 minutes ago sh -c sleep 10; peer node start --peer-chainc 91.98 kB Overwriting Test
feabb8a54c41 47 minutes ago sh -c sleep 10; peer node start --peer-chainc 50.53 kB Saving Test
21cb00fb27f4 4 weeks ago /bin/sh -c #(nop) WORKDIR /opt/gopath/src/git 0 B
以下割愛"
"
□ 備考/参考 --------------------"

"
========================="
#25
2016/11/22
"
□ お題目 --------------------"
基本操作>鯨
"クジラ>
資材の共有手段 (ざっくり)"
"
□ 実施方法 --------------------"
"方法① 鯨絵図で共有する
方法② 鯨箱で共有する"
"
□ 確認方法/実行結果 ---------------"

"
□ 備考/参考 --------------------"

"
========================="
#26
2016/11/22
"
□ お題目 --------------------"
基本操作>鯨
"クジラ>
資材の共有手段 (鯨絵図>ざっくり)"
"
□ 実施方法 --------------------"
"方法① 鯨絵図を直接共有する。(限定的もしくはオフラインな環境に有用)
方法② DockerHub経由に共有する。(全世界にばら巻きたい時や更新・連携の頻度が高い時に有用)"
"
□ 確認方法/実行結果 ---------------"

"
□ 備考/参考 --------------------"

"
========================="
#27
2016/11/22
"
□ お題目 --------------------"
基本操作>鯨
"クジラ>
鯨絵図の在り処"
"
□ 実施方法 --------------------"
"Docker のイメージはJSONファイルとして保存されている。以下のディレクトリにそのファイルを確認にできる。
$ sudo su
# cd /var/lib/docker/image/aufs/imagedb/content/sha256
root@VM02:/var/lib/docker/image/aufs/imagedb/content/sha256# ls -l
total 52
-rw------- 1 root root 9423 Nov 22 01:09 d910ed217b7d3291593801febbcde3e713cf5fb72555f0805fea2fe79e331914
"
"
□ 確認方法/実行結果 ---------------"

"
□ 備考/参考 --------------------"
"ref.
Dockerのイメージはどこにある?
http://deeeet.com/writing/2013/12/16/where-are-docker-images-storede/"
"
========================="
#28
2016/11/22
"
□ お題目 --------------------"
基本操作>鯨
"クジラ>
資材の共有方法 (鯨絵図>直接共有)"
"
□ 実施方法 --------------------"
"(憶測) docker imageの物理ファイルででも共有が可能なのでは?
鯨絵図を別端末に移植して試そうとしたが、権限制約で元ファイルをVMから落とすのに失敗。プラス、鯨絵図のpermissionを何故か変更できない。Chmodコマンド知らん、と言われる。そんなアホな。。"
"
□ 確認方法/実行結果 ---------------"

"
□ 備考/参考 --------------------"

"
========================="
#29
2016/11/22
"
□ お題目 --------------------"
基本操作>鯨
"クジラ>
資材の共有方法 (鯨絵図>Hubで共有)"
"
□ 実施方法 --------------------"
"$ sudo docker login
Username: {urDockerHubUserName}
Password: {urDockerHubPw}
Email: {urEmail}
Login Succeeded

$ sudo docker push {repositoryName}/{imageName}
"
"
□ 確認方法/実行結果 ---------------"

"
□ 備考/参考 --------------------"

"
========================="
#30
2016/11/22
"
□ お題目 --------------------"
基本操作>鯨
"クジラ>
資材の共有方法 (鯨箱)"
"
□ 実施方法 --------------------"
"exportコマンドでdocker のコンテナを tar ファイルに固めることができる。
その物理ファイルを共有できれば同じコンテナを複製できる。
限定的なオフラインの環境に有用かな。
方法:
[command] docker ps
イメージのコンテナIDを把握
[command] docker export 4b8e3b429b04 > ~/sample-centos6.tar
[command] cat sample-centos6.tar | docker import - sample-test:6
にてエクスポートとインポートができる
[command] docker run --privileged -d -p 8080:80 --name sample sample-test:6 /sbin/init
にて実行可能"
"
□ 確認方法/実行結果 ---------------"
TBD
"
□ 備考/参考 --------------------"
"ref. Dockerで開発環境のイメージを作る
https://www.v-force.co.jp/archives/1065"
"
========================="
#31
2016/11/22
"
□ お題目 --------------------"
基本操作>鯨
"クジラ>
箱を新規の鯨絵図として保存"
"
□ 実施方法 --------------------"
"docker containerからdocker imageを作成する。コンテナが起動していることが条件。
step1: docker ps
→ 保存対象のコンテナIDを確認
step2: docker commit -m ""コメント"" {コンテナID} {名前:タグ}
e.g. $ docker commit -m ""Saving Test"" 52b3a07d9594 mypeer
"
"
□ 確認方法/実行結果 ---------------"
"user1@VM02:~$ docker commit -m ""Saving Test"" 52b3a07d9594 mypeer
sha256:feabb8a54c4158bd13d4a603501ee3dd62dd69da194a2155e8a477d113a71415
以下で新規イメージの有無を確認できる。
user1@VM02:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mypeer latest feabb8a54c41 23 seconds ago 1.424 GB
"
"
□ 備考/参考 --------------------"
"ref. Dockerで開発環境のイメージを作る
https://www.v-force.co.jp/archives/1065"
"
========================="
#32
2016/11/22
"
□ お題目 --------------------"
基本操作>鯨
"クジラ>
箱を既存の鯨絵図に上書保存"
"
□ 実施方法 --------------------"
"step1: docker ps
→ 保存対象のコンテナIDを確認
step2: $ docker commit -m ""コメント"" {現在稼働中のコンテナID} {既存リポジトリ名:既存タグ}
e.g. docker commit -m ""Overwriting Test"" 9959795303e0 mypeer
"
"
□ 確認方法/実行結果 ---------------"
"user1@VM02:~/handson$ docker commit -m ""Overwriting Test"" 9959795303e0 mypeer
sha256:d910ed217b7d3291593801febbcde3e713cf5fb72555f0805fea2fe79e331914
以下のCREATEDで既存イメージの更新状態が見れる
user1@VM02:~/handson$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mypeer latest d910ed217b7d 49 seconds ago 1.424 GB
"
"
□ 備考/参考 --------------------"

"
========================="

tag : Hyperledger Fabric Docker Compose yml Starter Kit Rocks DB Go

2016-11-23 01:36 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Hyplerledger Fabric でのトラブルをシューティング



==============================
1
2016/11/11
基礎知識
ちなみにの
そもそも
fabricの実行方法

原因・対処

"CLIを使うかRESTを使うかの大きく2つある。
CLIで実行する場合はTerminalを起動して実行する。
RESTを使用する場合は、Terminalからでも実行できるし、Postman等のREST Clientを経由しても実行できる。
"

==============================
2
2016/11/11
基礎知識
ちなみにの
そもそも
CLIとは

原因・対処

"# peer chaincode..などのfabric提供のコマンドをterminal/teraterm等から直に実行すること。
ローカルでもHOSTVMでもdockerコンテナ内でもfabricが導入できていれば実行可能。
Dockerでpullしてくるpeerのイメージには既にfabricが構築されているので間違いなく実行可能。
HOSTVMにfabric入れる場合は、golangやgit等の基本資材に加えfabric使用する為の環境構築が必要になる。Vagrant/VirtualBoxが使用できる環境であれば容易に構築可能。
"

==============================
3
2016/11/11
基礎知識
ちなみにの
そもそも
RESTとは

原因・対処

"HTTPなどでアクセスしてコンテンツを取得できるcURLコマンドを使用してピアコンテナと通信して実行すること。fabricが導入されていない環境からの実行も可能になる。加え、ピアコンテナ内からも実行可能。
cf. cURLコマンド
http://www.hcn.zaq.ne.jp/___/unix/curl_manual.html
cf. cURLのバージョン確認
$ curl --version"

==============================
4
2016/11/11
基礎知識
ちなみにの
そもそも
cURLコマンドで投げている文字列の意味が分からない

原因・対処

"基本形:curl [option] URL
-X = HTTP サーバとの通信の際に用いる独自のリクエストメソッドを指定するオプション
-H =HTTPリクエストのヘッダ情報を指定するオプション
-d =POST リクエストで渡すデータを指定するオプション
e.g. curl -X POST -H 'Content-Type: application/json' -d 'piyo' http://localhost:7050/hoge

コマンド出力をcURLでPOSTするやり方を取れば、改行を含ませた記述方法も可能になる。
@の後はファイル名を記載するがコマンド出力を読ます場合はファイル名の代わりに「-」と記載する。
e.g. echo ""foo\nbar\nbaz"" | curl --data-binary @- 'http://localhost:6666/'
ref. http://qiita.com/edvakf@github/items/fb5c2f55292218a5446d"

==============================
5
2016/11/8
docker compose
HOST VMで
docker-composeを起動しようとして
"user1@VM05:~/handon$ docker-compose up -d
ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable."

原因・対処

"sudo usermod -aG docker user1
した後に一度ログアウトする必要があるのにしていない為の事象。
→ 一度TeraTermを出て再ログイン。"

==============================
6
2016/11/9
docker compose
HOST VMで
docker-compose経由でCAとPeerを起動しようとして
"Peerのdockerログに例外が出た。
[crypto] Errorf -> ERRO 021 [validator.test_vp0] Failed requesting read certificate [rpc error: code = 14 desc = grpc: RPC failed fast due to transport failure].
[crypto] Errorf -> ERRO 022 [validator.test_vp0] Failed requesting ECA certificate [rpc error: code = 14 desc = grpc: RPC failed fast due to transport failure].
2016/11/09 05:08:34 grpc: addrConn.resetTransport failed to create client transport: connection error: desc = ""transport: dial tcp: lookup ca on 168.63.129.16:53: no such host""; Reconnecting to {""ca:7054"" }
2016/11/09 05:08:34 Failed to dial ca:7054: grpc: the connection is closing; please retry."

原因・対処

"docker-compose.yml
peer>CORE_PEER_PKI_ECA_PADDRで指定しているホスト名が誤っている為。
CORE_PEER_PKI_ECA_PADDRで指定するホスト名はmembersrvcのcontainer_nameと一致していること。
加え、peerからCAへのlinksも定義されていること。
→ docker-compose定義ファイルの修正"

==============================
7
2016/11/8
"peer
node"
ピアコンテナ内で
peer node stop
"コンソールログ
05:44:54.512 [nodeCmd] stop -> INFO 002 Stopping peer using grpc
2016/11/08 05:44:54 transport: http2Client.notifyError got notified that the client transport was broken EOF.

Dockerログ
[server] StopServer -> DEBU 6752 returning status: status:STOPPED
[server] StopServer -> DEBU 6753 Remove pid file /var/hyperledger/production/peer.pid"

原因・対処

"特に対応は不要。
コンソールログにbrokenとあるかるが、dockerログの通りプロセスのpidファイルを削除できている。"

==============================
8
2016/11/9
"peer
chain"
HOST VMで
"chainの長さを見ようとして
"
"$ curl 172.17.0.2:7050/chain
curl: (7) Failed to connect to 172.17.0.2 port 7050: Connection refused
$ curl 172.17.0.2:7054/chain
curl: (56) Recv failure: Connection reset by peer"

原因・対処

"接続先情報が違うから。
$ docker logs で起動ログから以下のINFOログを見つける。
[nodeCmd] serve -> INFO 080 Starting peer with ID=name:""vp0"" , network ID=dev, address=172.17.0.3:7051, rootnodes=, validator=true
[rest] StartOpenchainRESTServer -> INFO 081 Initializing the REST service on 0.0.0.0:7050, TLS is disabled.
restが出力している「0.0.0.0:7050」が接続先になる。
(同アドレスは、fabric/peer/core.yamlの値が参照されている。)

加え、そのportがコンテナ外部からアクセス可能なportとして定義されていること。=docker-compose.ymlのpeer>portsで定義されていること。

→ 「$ curl 0.0.0.0:7050/chain」で再実行
「$ curl localhost:7050/chain」でも同じ。

※ もし、docker-compose.yml で peer の環境変数 CORE_VM_ENDPOINT をIPで指定している場合は、以下の様にそのIPでも実行できる。
$ curl 172.17.0.1:7050/chain

"
"ref.
curl err list --> https://curl.haxx.se/libcurl/c/libcurl-errors.html
curl cmd list --> curlコマンドで覚えておきたい使い方12個
Hyperledger fabricでchaincodeの開発環境を構築する --> http://qiita.com/tyasu/items/92c2033cf3199a80cb67"
==============================
9
2016/11/10
"user
login
REST"
HOST VMから
"RESTで
ログインしようとして
"
"user1@VM05:~/handson$ curl -X POST -H 'Content-Type: application/json' -d '{""enrollId"":""jim"",""enrollSecret"":""6avZQLwcUe9b""}' http://localhost:7050/registrar

コンソールログ
curl: (52) Empty reply from server"

原因・対処

"時間の問題。Peerが起動し切れていない段階でログインしようとした為に発生する例外。
※ docker-compose.yml > peer > CORE_SECURITY_ENABLED=true が設定さていること"

==============================
10
2016/11/11
"cc
deploy
CLI"
ピアコンテナ内から
CLIでCCデプロイしようとして
"peer chaincode deploy -c '{""Function"":""init"", ""Args"":[ ""a"", ""2000"", ""b"", ""1000""] }'

コンソール
Error: Must supply value for chaincode path parameter.
"

原因・対処

"peerは、①コマンドのスキーマチェック、②ログイン状態チェック、③各オプションの実行と処理を進める。
これはchaincodeのスキーマチェックでの例外で、chaincodeが使用する nフラグか pフラグを指定する。
e.g.
peer chaincode deploy -n mycc -c '{""Function"":""init"", ""Args"":[ ""a"", ""2000"", ""b"", ""1000""] }'"

==============================
11
2016/11/9
"cc
deploy
CLI"
ピアコンテナ内から
CLIでCCデプロイしようとして
"# peer chaincode deploy -n mycc -c '{""Function"":""init"", ""Args"":[ ""a"", ""2000"", ""b"", ""1000""] }'

コンソール
Error: Must supply username for chaincode when security is enabled"

原因・対処

"peer セキュリティ有効で起動している為にユーザ情報なしではCC実行できない。
手段①
docker-compose の peer の CORE_SECURITY 系の項目を軒並み無効にした peer コンテナに作り直す。
手段②
ログイン情報を入れて実行する。 Cf. fabric/membersrvc/membersrvc.yaml : eca > users > lukas, diego, jim, binhnなりを u フラグでchaincodeコマンドの引数で渡す。
e.g. peer chaincode deploy -u jim -n mycc -c '{""Function"":""init"", ""Args"":[ ""a"", ""2000"", ""b"", ""1000""] }'

"

==============================
12
2016/11/9
"cc
deploy
CLI"
ピアコンテナ内から
CLIでCCデプロイしようとして
"peer chaincode deploy -u jim -n mycc -c '{""Function"":""init"", ""Args"":[ ""a"", ""2000"", ""b"", ""1000""] }'

コンソール
Error: User 'jim' not logged in. Use the 'peer network login' command to obtain a security token."

原因・対処

"peer セキュリティ有効で起動している為にログインなしではCC実行できない。
一度コンテナを作り直した場合はユーザログインからすること"

==============================
13
2016/11/10
"cc
deploy
CLI"
ピアコンテナ内から
CLIでCCデプロイしようとして
"# peer chaincode deploy -u jim -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{""Function"":""init"", ""Args"": [""a"",""100"", ""b"", ""200""]}'

コンソール
Deploy chaincode:
09:48:57.767 [main] main -> INFO 003 Exiting.....

ピアdocker ログ
09:48:58.632 [chaincode] Launch -> ERRO 03d sending init failed(handler not found for chaincode )
09:48:58.632 [chaincode] Launch -> ERRO 03e stop failed chaincode name not set(Failed to init chaincode(handler not found for chaincode ))
"

原因・対処

"開発モードでpeerを起動している場合は、デプロイするチェーンコードの名称を指定する必要がある。
以下のように n フラグを足せば「name not set」のエラーは消える。

e.g.
peer chaincode deploy -u jim -n mycc -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{""Function"":""init"", ""Args"": [""a"",""100"", ""b"", ""200""]}'

※ ピアコンテナCLIでデプロイした場合は、「curl localhost:7050/chain」でheight数が増加するが、CCクエリすると失敗しているのが分かる。
"

==============================
14
2016/11/11
"cc
deploy
CLI"
ピアコンテナ内から
CLIでCCデプロイしようとして
"peer chaincode deploy -u jim -l golang -n mycc2 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{""Function"":""init"", ""Args"":[ ""c"", ""2000"", ""d"", ""1000""] }'

ピアdockerログ
[chaincode] Launch -> ERRO 042 sending init failed(handler not found for chaincode mycc2)"

原因・対処

"コマンド引数で渡しているCCの名称が、docker-compose.yam > app* > CORE_CHAINCODE_ID_NAME に定義したCCの名称と一致していない為のもの。

* StarterKitであればstarterコンテナの定義部分"

==============================
15
2016/11/10
"cc
deploy
REST"
HOSTVMから
"RESTでCCデプロイしようとして
"
"コンソールログ
{""jsonrpc"":""2.0"",""result"":{""status"":""OK"",""message"":""mycc""},""id"":1}
user1@VM05:~/handson$

docker ログ
[chaincode] Launch -> ERRO 031 sending init failed(handler not found for chaincode mycc)"

原因・対処

"アプリがコンテナが起動していない為
コンソールログにはOKと出るが、実際にはledgerに登録できておらず、queryすると以下の例外が返る。
"

==============================
16
2016/11/11
"cc
deploy
REST"
HOSTVMで
"RESTで
CCデプロイしようとして"
{"jsonrpc":"2.0","error":{"code":-32000,"message":"Registration missing","data":"User not logged in. Use the '/registrar' endpoint to obtain a security token."},"id":1}

原因・対処

"ユーザのログインをせずにchaincodeを実行しようとしている為の例外。先にログインすべき。
RESでのログイン方法
curl -X POST -H 'Content-Type: application/json' -d '{""enrollId"":""jim"",""enrollSecret"":""6avZQLwcUe9b""}' http://localhost:7050/registrar
CLIでのログイン方法
$ docker exec -it vp0 /bin/bash
# peer network login jim -p 6avZQLwcUe9b"

==============================
17
2016/11/11
"cc
deploy
REST"
ピアコンテナで
"RESTで
CCデプロイしようとして"
Error: User 'jim' not logged in. Use the 'peer network login' command to obtain a security token.

原因・対処

"セキュリティを有効にしているので、デプロイする前にログインが必要。
以下のログインコマンドをHOSTVMで実施してからデプロイする。
curl -X POST -H 'Content-Type: application/json' -d '{""enrollId"":""jim"",""enrollSecret"":""6avZQLwcUe9b""}' http://localhost:7050/registrar"

==============================
18
2016/11/11
"cc
deploy
REST"
HOSTVMで
"RESTで
CCデプロイしようとして"
"コンソール
{""jsonrpc"":""2.0"",""error"":{""code"":-32602,""message"":""Invalid params"",""data"":""Chaincode name may not be blank in development mode.""},""id"":0}"

原因・対処

"params > chaincodeID > name項目が抜けている。

TOBE:
""chaincodeID"": {
""name"": ""mycc"",
""path"": ""github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02""
},
"

==============================
19
2016/11/11
"cc
deploy
REST"
HOSTVMで
"RESTで
CCデプロイしようとして"
"コンソール
{""jsonrpc"":""2.0"",""error"":{""code"":-32602,""message"":""Invalid params"",""data"":""Must supply username for chaincode when security is enabled.""},""id"":0}
ピアdockerログ
04:54:38.081 [rest] ProcessChaincode -> INFO 02d REST processing chaincode request...
04:54:38.081 [rest] processChaincodeDeploy -> INFO 02e REST deploying chaincode...
04:54:38.081 [rest] processChaincodeDeploy -> ERRO 02f Must supply username for chaincode when security is enabled.
04:54:38.081 [rest] ProcessChaincode -> INFO 030 REST successfully deploy chaincode: {""jsonrpc"":""2.0"",""error"":{""code"":-32602,""message"":""Invalid params"",""data"":""Must supply username for chaincode when security is enabled.""},""id"":0}"

原因・対処

"params > secureContext項目が抜けている。

TOBE:
""params"": {
中略
""secureContext"": ""jim""
},
"

==============================
20
2016/11/10
"cc
query
REST"
HOSTVMから
"RESTで
CCをクエリしようとして
"
"コンソールログ
{""jsonrpc"":""2.0"",""error"":{""code"":-32003,""message"":""Query failure"",""data"":""Error when querying chaincode: Error:Failed to launch chaincode spec(Could not get deployment transaction for mycc - LedgerError - ResourceNotFound: ledger: resource not found)""},""id"":1}

ピアdockerログ
08:17:06.785 [chaincode] Launch -> ERRO 038 You are attempting to perform an action other than Deploy on Chaincode that is not ready and you are in developer mode. Did you forget to Deploy your chaincode?
08:17:06.785 [crypto] closeClientInternal -> INFO 039 Closing client [jim]...
08:17:06.849 [rest] processChaincodeInvokeOrQuery -> ERRO 03a Error when querying chaincode: Error:Failed to launch chaincode spec(Could not get deployment transaction for mycc - LedgerError - ResourceNotFound: ledger: resource not found)"

原因・対処

"CCのデプロイにそもそも失敗している。
Docker-composeにアプリを定義し、アプリに以下の開発モードで実行する際に必要な環境が変数が設定されていること。
- DEPLOY_MODE=dev
- CORE_CHAINCODE_ID_NAME=mycc
- CORE_PEER_ADDRESS=vp0:7051

アプリに必要な最小限な設定
myapp:
container_name: app
image: hyperledger/fabric-starter-kit
environment:
- DEPLOY_MODE=dev
- CORE_CHAINCODE_ID_NAME=mycc
- CORE_PEER_ADDRESS=vp0:7051
command: sh -c ""sleep 20; /opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02/chaincode_example02""
links:
- myca
- myvp0
"

==============================
使用したdocker-compose.yml

myca:
# try 'docker ps' to see the container status after starting this compose
container_name: ca
image: hyperledger/fabric-membersrvc
# ports:
# - "7054:7054"
command: membersrvc

myvp0:
container_name: vp0
image: hyperledger/fabric-peer
ports:
# the ports allow access from outside container. alson, not needed when run a single container.
- "7050:7050"
- "7051:7051"
- "7053:7053"
environment:
- CORE_PEER_ADDRESSAUTODETECT=true
# comment in either one. both will give you a same result.
# 172.17.0.1 is a default docker0 bridge ip. see /etc/local/docker>DOCKER_OPTS for relevant setting.
- CORE_VM_ENDPOINT=unix:///var/run/docker.sock
# - CORE_VM_ENDPOINT=http://172.17.0.1:2375
- CORE_LOGGING_LEVEL=INFO
- CORE_PEER_ID=vp0
- CORE_PEER_PKI_ECA_PADDR=ca:7054
- CORE_PEER_PKI_TCA_PADDR=ca:7054
- CORE_PEER_PKI_TLSCA_PADDR=ca:7054
- CORE_SECURITY_ENABLED=true
# - CORE_SECURITY_ENROLLID=test_vp0
# - CORE_SECURITY_ENROLLSECRET=MwYpmSRjupbT
# choose either: noops or pbft
- CORE_PEER_VALIDATOR_CONSENSUS_PLUGIN=noops
# this gives access to the docker host daemon to deploy chain code in network mode
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# have the peer wait 10 sec for membersrvc to start
# the following is to run the peer in Developer mode - also set sample DEPLOY_MODE=dev
command: sh -c "sleep 10; peer node start --peer-chaincodedev"
#command: sh -c "sleep 10; peer node start"
links:
- myca

# refer to hyperledger/fabric/docs/Setup/Network-setup.md

myapp:
container_name: app
image: hyperledger/fabric-starter-kit
# volumes:
# # tweak this to map a local developmnt directory tree into the container
# - ~/mytest:/user/mytest
environment:
# - MEMBERSRVC_ADDRESS=membersrvc:7054
# - PEER_ADDRESS=vp0:7051
# - KEY_VALUE_STORE=/tmp/hl_sdk_node_key_value_store
# # set to following to 'dev' if peer running in Developer mode
- DEPLOY_MODE=dev
- CORE_CHAINCODE_ID_NAME=mycc
- CORE_PEER_ADDRESS=vp0:7051
# the following command will start the chain code when this container starts and ready it for deployment by the app
command: sh -c "sleep 20; /opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02/chaincode_example02"
# stdin_open: true
# tty: true
links:
- myca
- myvp0

tag : Blockchain Hyperledger Fabric Starter Kit Azure Ubuntu docker compose Vagrant

2016-11-12 14:30 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Hyplerledger Fabric Starter Kit での遊び方

Hyplerledger Fabric Starter Kit での遊び方
(近々整理予定)






Blockchain Hyplerledger Fabric Starter Kit
Azure Ubuntuで出来合いのChaincodeをデプロイするまでに実行した手順まとめ
==============================
1
環境構築
"Gitのインストール
Azure Ubuntuには不要"
"------------------------------
実施方法/確認方法"
"sudo apt-get install git
ーーーーーーーーーー
git --version"vi docker-compose.yml
"------------------------------
実行結果"

"------------------------------
備考/参考"

==============================
2
環境構築
Goのインストール
"------------------------------
実施方法/確認方法"
"either one:
$ sudo apt install golang-go
$ apt-get update && apt-get install golang
ーーーーーーーーーー
$ go version"
"------------------------------
実行結果"

"------------------------------
備考/参考"

==============================
3
環境構築
"Goの作業フォルダ
"
"------------------------------
実施方法/確認方法"
StarterKitを動作させる分には無くてOK
"------------------------------
実行結果"

"------------------------------
備考/参考"

==============================
4
環境構築
環境変数の設定
"------------------------------
実施方法/確認方法"
"export GOPATH=$HOME/gows
export PATH=$PATH:$GOPATH/bin
ーーーーーーーーーー
printenv"
"------------------------------
実行結果"

"------------------------------
備考/参考"

==============================
5
環境構築
環境更新
"------------------------------
実施方法/確認方法"
sudo apt-get update
"------------------------------
実行結果"

"------------------------------
備考/参考"

==============================
6
環境構築
"wgetの取得
Azure Ubuntuには不要"
"------------------------------
実施方法/確認方法"
sudo apt-get install wget
"------------------------------
実行結果"

"------------------------------
備考/参考"

==============================
7
環境構築
dockerのインストール
"------------------------------
実施方法/確認方法"
"$ wget -qO- https://get.docker.com/ | sh
$ sudo usermod -aG docker user1
ーーーーーーーーーー
docker-compose –v"
"------------------------------
実行結果"

"------------------------------
備考/参考"

==============================
8
環境構築
docker-composeのインストール
"------------------------------
実施方法/確認方法"
"$ sudo su
# curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# exit
ーーーーーーーーーー
$ docker-compose version
$ docker-compose –v"
"------------------------------
実行結果"

"------------------------------
備考/参考"

==============================
9
環境設定 (任意)
fabricのインストール
"------------------------------
実施方法/確認方法"
"$ mkdir -p $HOME/gows/src/github.com/hyperledger
$ cd $HOME/gows/src/github.com/hyperledger
$ git clone https://github.com/hyperledger/fabric.git
以下を追記
DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"
"
"------------------------------
実行結果"

"------------------------------
備考/参考"

==============================
10
Vagrant担当の環境設定 (任意)
Rocks DBのインストール
"------------------------------
実施方法/確認方法"
"$ sudo apt-get install -y libsnappy-dev zlib1g-dev libbz2-dev
$ cd /tmp
$ git clone https://github.com/facebook/rocksdb.git
$ cd rocksdb
$ git checkout v4.1
諸設定
$ PORTABLE=1 make shared_lib
30分ほど待つ。
$ sudo INSTALL_PATH=/usr/local make install-shared

"
"------------------------------
実行結果"

"------------------------------
備考/参考"
"Building the fabric, Building outside of Vagrant,
https://github.com/hyperledger/fabric/blob/master/docs/dev-setup/build.md"
==============================
11
Vagrant担当の環境設定 (任意)
Pipのインストール
"------------------------------
実施方法/確認方法"
"$ curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python
$ sudo apt install python-pip
$ pip install --upgrade pip
$ sudo pip install behave nose docker-compose
$ sudo pip install -I flask==0.10.1 python-dateutil==2.2 pytz==2014.3 pyyaml==3.10 couchdb==1.0 flask-cors==2.0.1 requests==2.4.3
"
"------------------------------
実行結果"

"------------------------------
備考/参考"

==============================
12
Vagrant担当の環境設定 (任意)
docker daemonの初期値設定
"------------------------------
実施方法/確認方法"
"$ cd /etc/default/
$ sudo chmod 777 docker
$ vi docker

"
"------------------------------
実行結果"

"------------------------------
備考/参考"

==============================
13
Vagrant担当の環境設定 (任意)
Building on Z
"------------------------------
実施方法/確認方法"
"$ sudo su
$ sudo apt install yum
$ yum install git  skip as already installed
$ mkdir -p $HOME/git/src/github.com/hyperledger
$ git clone http://gerrit.hyperledger.org/r/fabric
$ source fabric/devenv/setupRHELonZ.sh
"
"------------------------------
実行結果"

"------------------------------
備考/参考"

==============================
14
設定
"docekr-compose
準備"
"------------------------------
実施方法/確認方法"
"$ cd $HOME
$ mkdir handon
$ cd handson
$ touch docker-compose.yml
$ vi docker-compose.yml
記載内容は本記事の最後に掲載
"
"------------------------------
実行結果"

"------------------------------
備考/参考"
"Writing, Building, and Running Chaincode in a Development Environment, Option 2 Docker for Mac or Windows, Running the Peer and CA,
https://github.com/hyperledger/fabric/blob/master/docs/Setup/Chaincode-setup.md"
==============================
15
起動
"docker-compose
起動"
"------------------------------
実施方法/確認方法"
"$ HOME/handson
$ docker-compose up –d
$ docker-compose up -d -f /home/user1/handson/docker-compose.yml
"
"------------------------------
実行結果"

"------------------------------
備考/参考"

==============================
16
終了
"docker-compose
終了"
"------------------------------
実施方法/確認方法"
docker-compose down -f /home/user1/handson/docker-compose.yml
"------------------------------
実行結果"

"------------------------------
備考/参考"

==============================
17
動作確認
コンテナの物理ログファイル確認
"------------------------------
実施方法/確認方法"
"HOST VMの/var/lib/docker/containers//-json.log
$ sudo su
# cd /var/lib/docker/containers/"
"------------------------------
実行結果"

"------------------------------
備考/参考"

==============================
18
動作確認
コンテナのログ確認
"------------------------------
実施方法/確認方法"
"docker logs
e.g. $ docker logs vp0"
"------------------------------
実行結果"

"------------------------------
備考/参考"

==============================
19
動作確認
"RESTでピア確認
"
"------------------------------
実施方法/確認方法"
$ curl 172.17.0.2:7050/network/peers
"------------------------------
実行結果"

"------------------------------
備考/参考"
"REST API, REST Endpoints,
https://github.com/hyperledger/fabric/blob/master/docs/API/CoreAPI.md"
==============================
20
動作確認
"RESTでチェーンの長さ確認
"
"------------------------------
実施方法/確認方法"
"ピアだけが起動されている場合
$ curl 172.17.0.2:7050/chain
$ curl 172.17.0.2:7050/chain/blocks/1
CAも起動されている場合
$ curl 0.0.0.0:7050/chain
$ curl 0.0.0.0:7050/chain/blocks/1
$ curl http://localhost:7050/chain や
$ curl localhost:7050/chain でもOK
peerのCORE_VM_ENDPOINT環境変数を指定している場合
$ curl 172.17.0.1:7050/chain
$ curl 172.17.0.1:7050/chain/blocks/0
"
"------------------------------
実行結果"

"------------------------------
備考/参考"
"この時、127.17.0.2はNVPないしVPコンテナのIPで、7050はRESTが使用するポート。(core.yamlのrest.addressで定義あり)
ブロックの詳細を見る場合はindexを指定する。"
==============================
21
ログイン
CLIでログイン
"------------------------------
実施方法/確認方法"
"$ docker exec -it vp0 /bin/bash
# peer network login jim
Enter password for user 'jim': 6avZQLwcUe9b
もしくは
peer network login jim -p 6avZQLwcUe9b"
"------------------------------
実行結果"
"コンソール
user1@VM05:~$ docker exec -it vp0 /bin/bash
root@e6b94236f5b2:/opt/gopath/src/github.com/hyperledger/fabric# peer network login jim
00:19:14.835 [networkCmd] networkLogin -> INFO 001 CLI client login...
00:19:14.836 [networkCmd] networkLogin -> INFO 002 Local data store for client loginToken: /var/hyperledger/production/client/
Enter password for user 'jim': ************
00:19:41.629 [networkCmd] networkLogin -> INFO 003 Logging in user 'jim' on CLI interface...
00:19:41.975 [networkCmd] networkLogin -> INFO 004 Storing login token for user 'jim'.
00:19:41.975 [networkCmd] networkLogin -> INFO 005 Login successful for user 'jim'.
00:19:41.976 [main] main -> INFO 006 Exiting....."
"------------------------------
備考/参考"

==============================
22
ログイン
"RESTでログイン
※ HOST VMからでもピアコンテナからでも実行できる
※ CAコンテナとアプリコンテナからは実施不可。"
"------------------------------
実施方法/確認方法"
"curl -X POST -H 'Content-Type: application/json' -d '{"enrollId":"jim","enrollSecret":"6avZQLwcUe9b"}' http://localhost:7050/registrar
"
"------------------------------
実行結果"
"コンソール
{"OK":"Login successful for user 'jim'."}
ピアdockerログ
05:11:19.427 [rest] Register -> INFO 098 REST client login...
05:11:19.427 [rest] Register -> INFO 099 Local data store for client loginToken: /var/hyperledger/production/client/
05:11:19.427 [rest] Register -> INFO 09a Logging in user 'jim' on REST interface...
05:11:19.427 [crypto] RegisterClient -> INFO 09b Registering client [jim] with name [jim]...
05:11:19.433 [crypto] Debugf -> DEBU 09c [client.jim] Data will be stored at [/var/hyperledger/production/crypto/client/jim]
割愛
05:11:19.736 [crypto] RegisterClient -> INFO 0cb Registering client [jim] with name [jim]...done!
05:11:19.736 [rest] Register -> INFO 0cc Storing login token for user 'jim'.
05:11:19.737 [rest] Register -> INFO 0cd Login successful for user 'jim'."
"------------------------------
備考/参考"

==============================
23
ログアウト
RESTでログアウト
"------------------------------
実施方法/確認方法"
"HOSTVMで以下実行
user1@VM05:/opt$ curl -X DELETE --header 'Accept: application/json' 'http://localhost:7050/registrar/jim'"
"------------------------------
実行結果"
"コンソール
{"OK":"Deleted login token and directory for user jim."}
"
"------------------------------
備考/参考"

==============================
24
デプロイ
"RESTでCCデプロイ
(出来合いのCC)
※ HOSTVMかピアコンテナから実行
"
"------------------------------
実施方法/確認方法"
"echo '{
"jsonrpc": "2.0",
"method": "deploy",
"params": {
"type": 1,
"chaincodeID": {
"name": "mycc",
"path": "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02"
},
"ctorMsg": {
"function": "init",
"args": ["a", "1000", "b", "2000"]
},
"secureContext": "jim"
},
"id": 1
}' | curl -X POST -H 'Content-Type: application/json' -d @- http://localhost:7050/chaincode"
"------------------------------
実行結果"
"コンソール
{"jsonrpc":"2.0","result":{"status":"OK","message":"mycc"},"id":1}
ピアdockerログ
00:42:49.758 [rest] ProcessChaincode -> INFO 037 REST processing chaincode request...
00:42:49.758 [rest] processChaincodeDeploy -> INFO 038 REST deploying chaincode...
00:42:49.758 [rest] processChaincodeDeploy -> INFO 039 Local user 'jim' is already logged in. Retrieving login token.
00:42:49.759 [crypto] InitClient -> INFO 03a Initializing client [jim]...
00:42:50.084 [crypto] InitClient -> INFO 03b Initializing client [jim]...done!
00:42:50.085 [crypto] closeClientInternal -> INFO 03c Closing client [jim]...
00:42:50.171 [rest] processChaincodeDeploy -> INFO 03d Successfully deployed chainCode: mycc
00:42:50.171 [rest] ProcessChaincode -> INFO 03e REST successfully deploy chaincode: {"jsonrpc":"2.0","result":{"status":"OK","message":"mycc"},"id":1}"
"------------------------------
備考/参考"

==============================
25
デプロイ
"RESTでCCデプロイ
(出来合いのCC)
※ HOSTVMかピアコンテナから実行
※ cURLにヘッダ情報を載せなくてもOK"
"------------------------------
実施方法/確認方法"
"echo '{
"jsonrpc": "2.0", "method": "deploy",
"params": {
"type": 1,
"chaincodeID": {
"name": "mycc",
"language": "golang",
"path": "/opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02"
},
"ctorMsg": {
"args": ["init", "a", "1000", "b", "2000"]
},
"secureContext": "jim"
},
"id": 0
}' | curl -X POST --data-binary @- 'http://localhost:7050/chaincode'
"
"------------------------------
実行結果"
{"jsonrpc":"2.0","result":{"status":"OK","message":"mycc"},"id":0}
"------------------------------
備考/参考"

==============================

26
デプロイ
"CLIでCCデプロイ
(出来合いのCC)"
"------------------------------
実施方法/確認方法"
"$ docker exec -it vp0 /bin/bash
# peer chaincode deploy -u jim -n mycc -c '{"Function":"init", "Args":[ "a", "2000", "b", "1000"] }'

実行引数にCパスを渡していないパターン
CCの在り処はdocker-compose.ymlのappに以下の定義を参照していると推測。
command: sh -c "sleep 20; /opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02/chaincode_example02""
"------------------------------
実行結果"
"コンソール
09:29:38.054 [chaincodeCmd] getChaincodeSpecification -> INFO 001 Local user 'jim' is already logged in. Retrieving login token.
09:29:38.800 [chaincodeCmd] chaincodeDeploy -> INFO 002 Deploy result: type:GOLANG chaincodeID: ctorMsg:
Deploy chaincode: mycc
09:29:38.800 [main] main -> INFO 003 Exiting....."
"------------------------------
備考/参考"
"ピアコンテナからCLIでデプロイする場合、ピアdockerログには認証のログしか出力されない。問題なくデプロイできた場合は、デプロイに関するINFO以上のログなし。
"
==============================
27
デプロイ
"CLIでCCデプロイ
(出来合いのCC)"
"------------------------------
実施方法/確認方法"
"$ docker exec -it vp0 /bin/bash
# peer chaincode deploy -u jim -n mycc -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Function":"init", "Args": ["a","100", "b", "200"]}'

実行引数にCCパスを渡すパターン"
"------------------------------
実行結果"
"コンソール
Deploy chaincode: mycc
09:53:31.493 [main] main -> INFO 003 Exiting.....
ピアdockerログ
09:58:08.080 [chaincodeCmd] getChaincodeSpecification -> INFO 001 Local user 'jim' is already logged in. Retrieving login token.
09:58:08.508 [chaincodeCmd] chaincodeDeploy -> INFO 002 Deploy result: type:GOLANG chaincodeID: ctorMsg:
Deploy chaincode: mycc
09:58:08.508 [main] main -> INFO 003 Exiting....."
"------------------------------
備考/参考"

==============================
使用したdocker-compose.yml

myca:
# try 'docker ps' to see the container status after starting this compose
container_name: ca
image: hyperledger/fabric-membersrvc
# ports:
# - "7054:7054"
command: membersrvc

myvp0:
container_name: vp0
image: hyperledger/fabric-peer
ports:
# the ports allow access from outside container. alson, not needed when run a single container.
- "7050:7050"
- "7051:7051"
- "7053:7053"
environment:
- CORE_PEER_ADDRESSAUTODETECT=true
# comment in either one. both will give you a same result.
# 172.17.0.1 is a default docker0 bridge ip. see /etc/local/docker>DOCKER_OPTS for relevant setting.
- CORE_VM_ENDPOINT=unix:///var/run/docker.sock
# - CORE_VM_ENDPOINT=http://172.17.0.1:2375
- CORE_LOGGING_LEVEL=INFO
- CORE_PEER_ID=vp0
- CORE_PEER_PKI_ECA_PADDR=ca:7054
- CORE_PEER_PKI_TCA_PADDR=ca:7054
- CORE_PEER_PKI_TLSCA_PADDR=ca:7054
- CORE_SECURITY_ENABLED=true
# - CORE_SECURITY_ENROLLID=test_vp0
# - CORE_SECURITY_ENROLLSECRET=MwYpmSRjupbT
# choose either: noops or pbft
- CORE_PEER_VALIDATOR_CONSENSUS_PLUGIN=noops
# this gives access to the docker host daemon to deploy chain code in network mode
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# have the peer wait 10 sec for membersrvc to start
# the following is to run the peer in Developer mode - also set sample DEPLOY_MODE=dev
command: sh -c "sleep 10; peer node start --peer-chaincodedev"
#command: sh -c "sleep 10; peer node start"
links:
- myca

# refer to hyperledger/fabric/docs/Setup/Network-setup.md

myapp:
container_name: app
image: hyperledger/fabric-starter-kit
# volumes:
# # tweak this to map a local developmnt directory tree into the container
# - ~/mytest:/user/mytest
environment:
# - MEMBERSRVC_ADDRESS=membersrvc:7054
# - PEER_ADDRESS=vp0:7051
# - KEY_VALUE_STORE=/tmp/hl_sdk_node_key_value_store
# # set to following to 'dev' if peer running in Developer mode
- DEPLOY_MODE=dev
- CORE_CHAINCODE_ID_NAME=mycc
- CORE_PEER_ADDRESS=vp0:7051
# the following command will start the chain code when this container starts and ready it for deployment by the app
command: sh -c "sleep 20; /opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02/chaincode_example02"
# stdin_open: true
# tty: true
links:
- myca
- myvp0


tag : Blockchain Hyperledger Fabric Starter Kit Azure Ubuntu docker compose Vagrant

2016-11-12 13:50 : 開発 : コメント : 0 : トラックバック : 0 :
ホーム  次のページ »

search

ad



counter


tag cloud

category cloud