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

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を両方が等価条件



pp.93

tag : 谷本心 Java本格入門

2017-04-28 23:14 : 開発 : コメント : 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
 
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 :

[開発][Linux] ファイルの編集

$ touch newFile.txt
$ vi newFile.txt
i
ESC
:wq!

touch で新規ファイルの作成
viviewでファイルを開く
i でinsert編集モードに
ESC でコマンドモードに戻り
:wq! でwrite(変更保存)してquit(viewモード終了)する

trouble shooting

編集内容の保存ができない。terminal(コマンドプロンプト)がプチ硬直状態になる
→ ファイルへの編集権限がない
→ chmodでアクセス権限(permission)変更してから編集する

E492 でエラーになって上書き保存終了できない
E492: not an editor command: qw
→ コマンドの打つ順番が違う。writeしてからquitする。「:qw!」とするとエラーになる

ref:
https://chrisjean.com/using-vi-vim-as-a-command-line-editor/

tag : Linux touch vi E492

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

[開発][Linux] ファイル・ディレクトリのアクセス権限の変更

■ 権限確認方法: ls -l

■ 権限変更方法: chmod 変更対象 変更方法 変更内容 対象ファイル

chmod 777 hoge.txt
chmod u+x hoge.txt
chmod go+w hoge.txt
chmod a-wx hoge.txt

変更対象:
u ユーザー
g グループ
o その他
a すべて

変更方法:
= 指定した権限にする
+ 指定した権限を付与する
- 指定した権限を除去する

変更内容:
r 読み取り
w 書き込み
x 実行

■ 権限表記見方:

user1@VM01:~/sample$ ls -l
total 4
-rw-r--r-- 1 root root 1858 Oct 24 05:40 docker-compose.yml

「-rw-r--r--」はアクセス権限を示す
最初の1文字目 → ファイル種別
- ファイル
d ディレクトリ
l シンボリックリンク

2~4文字目 → ファイルの所有者に対する権限
5~7文字目 → ファイルの所有グループに対する権限
8~10文字目 → その他に対する権限

r 読み取り
w 書き込み
x 実行
- 権限なし

■ 権限数値見方:

r(読み取り)・・・4
w(書き込み)・・・2
x(実行)・・・1

要は足し算
0 ---
1 --x
2 -w-
3 -wx
4 r--
5 r-x
6 rw-
7 rwx

ref.
Linuxの権限確認と変更(超初心者向け)
http://qiita.com/masashi-t-h/items/5f4c4fa768642aad9e06

tag : Linux permission chmod

2016-10-28 10:04 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Hyperledger Fabric Starter Kit を Vagrant 使わずに動かす-鯨手引き編

鯨手引(ついでに蛸も少し)

// Index
¦ - Dockerの概念
¦ - 鯨の骨組み
¦ - 必須条件
¦ - 鯨コマンド
¦ - 鯨の断舎利
¦ - 蛸コマンド
¦ (最初しか参照しない情報)
¦ - 鯨を入れる前に①(バージョン確認)
¦ - 鯨を入れる前に②(OSバージョン確認)
¦ - 鯨のインストール
¦ - 鯨からハローワールド
¦ - Docker@Ubuntu用の小細工
¦ - 蛸を入れる前に(バージョン確認)
¦ - 蛸のインストール
//

―――――――――――――――――――――――――
1
Dockerの概念
詳細はGoogleに山ほど転がっているので割愛。

―――――――――――――――――――――――――
2
鯨の骨組み
https://docs.docker.com/engine/understanding-docker/
Dockerはクラサバ構成。
Docker Daemonがサーバで、Docker CLIがクライアント。両者とも母国語はGo言語。
サーバをクライアントがラップしているイメージ。サーバ/クライアント間はREST APIで会話。


―――――――――――――――――――――――――
3
必要条件
①OS条件は公式ページをご参照あれ:https://docs.docker.com/engine/installation/
Goがインストールされていること
③Dockerがインストールされていること

―――――――――――――――――――――――――
4
鯨コマンド
王道:DockerHubからbaseimageを取得(pull)→Dockerfileを用意して毛を生やした独自dockerimageを作成(build)→コンテナを生成(create)→コンテナ起動(start)


// * 余談:Goの環境変数は別にDocker的には必要ない
$ export GOPATH=$HOME/gows
$ export PATH=$PATH:$GOPATH/bin
* //

①大前提:Dockerグループへの加入 → 後述の「Docker@Ubuntu用の小細工」を参照

②イメージ検索
$ docker search hyperledger | more
同じ情報をweb経由でDockerHubで見れる
https://hub.docker.com/explore/
公式イメージと単なる個人の公開イメージが見れる。個人の非公開イメージは表示されない。

③イメージ取得
$ docker pull repo:tag
該当するイメージをローカルに複製する。
Tagを指定しない場合はデフォルトでlatestタグが適用される。

④保持するイメージ一覧
$ docker images

⑤Dockerfile編集
$ cd myWorkFolder
$ touch Dockerfile
$ vi Dockerfile
:w
:q
$ rm Dockerfile
$ rm –d myFolder
Touch でファイル作成し、viでファイルを開き、wで保存し、qでファイルを閉じる。
不要になればrmでファイルを消すなりディレクトリごと削除する。

⑥新規イメージ作成
$ cd myWorkFolder
Build[TODO]
同フォルダ配下のDockerfileが参照される

⑦新規コンテナの生成
$ docker ps –a
既存する全コンテナを確認してから
$ docker create --name imageNameOrImageId repo:tag
新規コンテナの生成
$ docker ps –a
再度、既存コンテナ一覧を見ると1つコンテナが増えている筈

⑧コンテナの起動
$ docker start containerId
Startでコンテナ起動。

⑨新規コンテナの生成&&起動
$ docker run imageId
Runするとコンテナ生成と起動が同時に行われる

―――――――――――――――――――――――――
5
鯨も断舎利
①心得
子を消さずに親を消そうとするとエラーになる為、
コンテナ停止→コンテナ削除→イメージ削除 の順序で実施すること。

②コンテナの整理
稼働中のコンテナの確認
$ docker ps
停止中のコンテナの確認
$ docker ps -a
コンテナのIDだけ表示させる場合
$ docker ps -a -q
不要なコンテナの削除
$ docker rm {コンテナID1} {コンテナID 2}
全コンテナの一括削除
$ docker rm `docker ps -a -q`

③イメージの削除
既存イメージの確認
$ docker images
イメージの削除 (複数指定不可)
$ docker rmi [イメージID]

―――――――――――――――――――――――――
6
蛸コマンド
①起動
docker-composeファイルの横で、
$ docker-compose up -d

②停止
$ docker-compose stop

―――――――――――――――――――――――――
7
鯨を入れる前に①(バージョン確認)
入れる前に、既存するかを確認する
バージョン確認(簡易表示)
$ docker --version
インストールされていない場合
|user1@VM01:~$ docker --version
|The program 'docker' is currently not installed. You can install it by typing:
|sudo apt install docker.io

インストールされている場合
|user1@VM01:~$ docker --version
|Docker version 1.12.2, build bb80604

バージョン確認 (詳細情報付き)
$ docker version
|user1@VM01:~$ docker version
|Client:
| Version: 1.12.1
| API version: 1.24
Go version: go1.6.3
| Git commit: 23cf638
| Built: Thu Aug 18 05:33:38 2016
| OS/Arch: linux/amd64
|Server:
| Version: 1.12.1
| API version: 1.24
Go version: go1.6.3
| Git commit: 23cf638
| Built: Thu Aug 18 05:33:38 2016
| OS/Arch: linux/amd64

―――――――――――――――――――――――――
8
鯨を入れる前に②(OSバージョン確認)
入れる前に、OSが対応されているかを確認する

OSのバージョンの確認
$ lsb_release -a
|root@VM01:/home/user1# lsb_release -a
|No LSB modules are available.
|Distributor ID: Ubuntu
|Description: Ubuntu 16.04 LTS
|Release: 16.04
|Codename: xenial

Ubuntuのbit確認
$ arch
|user1@VM01:~$ arch
|x86_64

カーネルの確認
$ uname -r
|root@VM01:/home/user1# uname -r
|4.4.0-28-generic

―――――――――――――――――――――――――
9
鯨のインストール
方法いろいろ。apt-getやらwgetやらcurlやら。

// * 予備知識
¦aptとyumはパッケージのインストールなどを行うパッケージ管理ソフト。
¦前者はDebian系OS用で、後者はRedHat系OS用。
¦wgetとcurlはWebからファイル取得するファイルダウンローダー的役割
¦前者がHTTPやFTP経由で再帰的にディレクトリ/ファイルをダウンロードするのに対し、
¦後者はTP, FTPS, HTTP, HTTPS, GOPHER, TELNET等のプロトコルに対応した通信ライブラリ。語源はClient for URLs。* //

□wgetでインストールする場合
wgetの取得 (Azure/Ubuntuの場合、デフォで入ってるので不要)
$ sudo apt-get install wget
|user1@VM01:~$ sudo apt-get install wget
|Reading package lists... Done
|Building dependency tree
|Reading state information... Done
|wget is already the newest version (1.17.1-1ubuntu1.1).
|0 upgraded, 0 newly installed, 0 to remove and 116 not upgraded.

Wgetでdockerをget
$ wget -qO- https://get.docker.com/ | sh
|user1@VM01:~$ wget -qO- https://get.docker.com/ | sh
|apparmor is enabled in the kernel and apparmor utils were already installed
|+ sudo -E sh -c apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
|Executing: /tmp/tmp.7EYn46C2gh/gpg.1.sh --keyserver
|hkp://ha.pool.sks-keyservers.net:80
|--recv-keys
|58118E89F3A912897C070ADBF76221572C52609D
|gpg: requesting key 2C52609D from hkp server ha.pool.sks-keyservers.net
|gpg: key 2C52609D: public key "Docker Release Tool (releasedocker) " imported
|gpg: Total number processed: 1
|gpg: imported: 1 (RSA: 1)
|+ break
|+ sudo -E sh -c apt-key adv -k 58118E89F3A912897C070ADBF76221572C52609D >/dev/null
|+ sudo -E sh -c mkdir -p /etc/apt/sources.list.d
|+ dpkg --print-architecture
|+ sudo -E sh -c echo deb \[arch=amd64\] https://apt.dockerproject.org/repo ubuntu-xenial main > /etc/apt/sources.list.d/docker.list
|+ sudo -E sh -c sleep 3; apt-get update; apt-get install -y -q docker-engine
|Hit:1 http://azure.archive.ubuntu.com/ubuntu xenial InRelease
|Hit:2 http://azure.archive.ubuntu.com/ubuntu xenial-updates InRelease
|Hit:3 http://azure.archive.ubuntu.com/ubuntu xenial-backports InRelease
|Get:4 http://security.ubuntu.com/ubuntu xenial-security InRelease [94.5 kB]
|Get:5 https://apt.dockerproject.org/repo ubuntu-xenial InRelease [30.2 kB]
|Get:6 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages [2,478 B]
|Fetched 127 kB in 0s (134 kB/s)
|Reading package lists... Done
|Reading package lists...
|Building dependency tree...
|Reading state information...
|The following additional packages will be installed:
| aufs-tools cgroupfs-mount libltdl7
|Suggested packages:
| mountall
|The following NEW packages will be installed:
| aufs-tools cgroupfs-mount docker-engine libltdl7
|0 upgraded, 4 newly installed, 0 to remove and 116 not upgraded.
|Need to get 19.4 MB/19.4 MB of archives.
|After this operation, 102 MB of additional disk space will be used.
|Get:1 http://azure.archive.ubuntu.com/ubuntu xenial/universe amd64 cgroupfs-mount all 1.2 [4,970 B]
|Get:2 http://azure.archive.ubuntu.com/ubuntu xenial/main amd64 libltdl7 amd64 2.4.6-0.1 [38.3 kB]
|Get:3 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 docker-engine amd64 1.12.2-0~xenial [19.3 MB]
|Fetched 19.4 MB in 1s (13.1 MB/s)
|Selecting previously unselected package aufs-tools.
|(Reading database ... 72104 files and directories currently installed.)
|Preparing to unpack .../aufs-tools_1%3a3.2+20130722-1.1ubuntu1_amd64.deb ...
|Unpacking aufs-tools (1:3.2+20130722-1.1ubuntu1) ...
|Selecting previously unselected package cgroupfs-mount.
|Preparing to unpack .../cgroupfs-mount_1.2_all.deb ...
|Unpacking cgroupfs-mount (1.2) ...
|Selecting previously unselected package libltdl7:amd64.
|Preparing to unpack .../libltdl7_2.4.6-0.1_amd64.deb ...
|Unpacking libltdl7:amd64 (2.4.6-0.1) ...
|Selecting previously unselected package docker-engine.
|Preparing to unpack .../docker-engine_1.12.2-0~xenial_amd64.deb ...
|Unpacking docker-engine (1.12.2-0~xenial) ...
|Processing triggers for libc-bin (2.23-0ubuntu3) ...
|Processing triggers for man-db (2.7.5-1) ...
|Processing triggers for ureadahead (0.100.0-19) ...
|Processing triggers for systemd (229-4ubuntu6) ...
|Setting up aufs-tools (1:3.2+20130722-1.1ubuntu1) ...
|Setting up cgroupfs-mount (1.2) ...
|Setting up libltdl7:amd64 (2.4.6-0.1) ...
|Setting up docker-engine (1.12.2-0~xenial) ...
|sent invalidate(passwd) request, exiting
|sent invalidate(group) request, exiting
|sent invalidate(group) request, exiting
|Processing triggers for libc-bin (2.23-0ubuntu3) ...
|Processing triggers for systemd (229-4ubuntu6) ...
|Processing triggers for ureadahead (0.100.0-19) ...
|+ sudo -E sh -c docker version
|Client:
| Version: 1.12.2
| API version: 1.24
| Go version: go1.6.3
| Git commit: bb80604
| Built: Tue Oct 11 18:29:41 2016
| OS/Arch: linux/amd64

|Server:
| Version: 1.12.2
| API version: 1.24
| Go version: go1.6.3
| Git commit: bb80604
| Built: Tue Oct 11 18:29:41 2016
| OS/Arch: linux/amd64

|If you would like to use Docker as a non-root user, you should now consider
|adding your user to the "docker" group with something like:

| sudo usermod -aG docker user1

|Remember that you will have to log out and back in for this to take effect!

□ (挫折中) apt-getでインストールする場合&& Ubuntu Xenial 16.04 (LTS)の場合
もろもろ前処理。
sudo su
apt-get install apt-transport-https ca-certificates
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
apt-get update
apt-get purge lxc-docker
apt-cache policy docker-engine
apt-get update
apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
apt-get install docker-engine

https://docs.docker.com/engine/installation/linux/ubuntulinux/
http://qiita.com/ishida330/items/887ae52c9f6ce4ff3b7f

→放置中

□curlでdockerをget
Ref. Example: Install Docker on Ubuntu Linux, https://docs.docker.com/engine/getstarted/linux_install_help/

―――――――――――――――――――――――――
10
Dockerからハローワールド
インストールできたらついでにHello World!
$ sudo docker run hello-world
|user1@VM01:~$ sudo docker run hello-world
|Unable to find image 'hello-world:latest' locally
|latest: Pulling from library/hello-world
|c04b14da8d14: Pull complete
|Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
|Status: Downloaded newer image for hello-world:latest

|Hello from Docker!
|This message shows that your installation appears to be working correctly.

|To generate this message, Docker took the following steps:
| 1. The Docker client contacted the Docker daemon.
| 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
| 3. The Docker daemon created a new container from that image which runs the
| executable that produces the output you are currently reading.
| 4. The Docker daemon streamed that output to the Docker client, which sent it
| to your terminal.

|To try something more ambitious, you can run an Ubuntu container with:
| $ docker run -it ubuntu bash

|Share images, automate workflows, and more with a free Docker Hub account:
| https://hub.docker.com

|For more examples and ideas, visit:
| https://docs.docker.com/engine/userguide/

|user1@VM01:~$

Ref.
さわって理解するDocker入門, https://www.ogis-ri.co.jp/otc/hiroba/technical/docker/part1.html

―――――――――――――――――――――――――
11
Docker@Ubuntu用の小細工
Ubuntuでdocker使う為の設定
Dockerグループを作成し、sudo権限のあるユーザへの付与
DockerデーモンはUnixソケットにバインドする関係だそう
Unixソケットのオーナーはデフォでrootユーザだから、dockerの実行にはルート権限が必要
つまり、dockerデーモンは常にrootユーザとして動く必要がある
その為の細工をする前に、

ルート権限なしに動けないことを確認
$ docker run hello-world
|user1@VM01:~$ docker run hello-world
|Post http:///var/run/docker.sock/v1.19/containers/create:
|dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?.

$ sudo usermod -aG docker user1
|user1@VM01:~$ sudo usermod -aG docker user1
|sent invalidate(passwd) request, exiting
|sent invalidate(group) request, exiting
|sent invalidate(passwd) request, exiting
|sent invalidate(group) request, exiting
|user1@VM01:~$

グループに追加できても、
sudo付けずにdocker叩く→エラーになる
|user1@VM01:~$ docker run hello-world
|Post http:///var/run/docker.sock/v1.19/containers/create:
|dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?.
一度logoutしてloginをし直してから
sudo付けずにdocker叩くと→エラーなくHelloしてくれる筈
|user1@VM01:~$ docker run hello-world
|Hello from Docker!
|This message shows that your installation appears to be working correctly.

Ref.
DockerをLinux(Ubuntu 14.04 LTS)にインストールする方法と解説, https://tracpath.com/works/devops/how_to_install_the_docker/

―――――――――――――――――――――――――
12
蛸を入れる前に(バージョン確認)
ローカルに入っているかをバージョンチェックで確認
$ docker-compose –v
インストールされていない場合
|user1@VM01:~$ docker-compose -v
|The program 'docker-compose' is currently not installed. You can install it by typing:
|sudo apt install docker-compose

―――――――――――――――――――――――――
13
蛸のインストール
Docker-composeの最新版の確認
https://github.com/docker/compose/releases
ver1.8.1 as of 2016/10/20
インストールコマンドも同リリースノートにあり。

インストール
$ 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
|user1@VM01:~/myDocker$ sudo su
|root@VM01:/home/user1/myDocker# curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
| % Total % Received % Xferd Average Speed Time Time Time Current
| Dload Upload Total Spent Left Speed
|100 600 0 600 0 0 2091 0 --:--:-- --:--:-- --:--:-- 2097
|100 7798k 100 7798k 0 0 6038k 0 0:00:01 0:00:01 --:--:-- 10.7M

作業フォルダの権限付与
$ chmod +x /usr/local/bin/docker-compose

バージョン確認
$ docker-compose version
|root@VM01:/home/user1# docker-compose version
|docker-compose version 1.8.1, build 878cff1
|docker-py version: 1.10.3
|CPython version: 2.7.9
|OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013
$ docker-compose –v
|user1@VM01:~/myDocker$ docker-compose -v
|docker-compose version 1.8.1, build 878cff1

Ref. DockerとDocker Composeをインストール, http://qiita.com/taroshin/items/22bb360b18a0a24871dd

tag : Docker compose Go Daemon CLI REST_API

2016-10-25 00:37 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Hyperledger Fabric Starter Kit を Vagrant 使わずに動かす-環境整備編(Docker除く)

1
ショッチュウ叩くコマンド
export GOPATH=$HOME/gows
export PATH=$PATH:$GOPATH/bin

2
AzureでOS環境整備
構成:
新規>Virtual Machines>Ubuntu Server 16.04 LTS>(デプロイモデルの選択) クラシック>作成
>1基本
名前:VM01
ユーザー名:Azureログインのユーザ名
認証の種類:パスワード
パスワード:ターミナルでログインする時のパスワード
リソースグループ:新規作成:VM01
場所:米国東部
>2サイズ>すべて表示>A2 Basic>選択
>3設定>OK
>4概要
https://portal.azure.com/#blade/HubsExtension/Resources/resourceType/Microsoft.Resources%2Fresources

3
CLIのインストール(ローカル環境に)
Tera Term/SuperPutter
* CLI=Command Line Interface, SCP=Secure Copy Protocol
* ref: http://www.moongift.jp/2011/10/20111011-2/

4
Gitのインストール
バージョン管理ツールのインストール。
//* Azure/Ubuntuにはデフォで入ってる筈 *//
★sudo apt-get install git

Git自体のバージョン確認
★git --version
|user1@VM01:~$ git --version
|git version 2.7.4

5
Goのインストール
インストールの既存するか確認
★go version
|user1@VM01:~$ go version
|go version go1.6.2 linux/amd64

ルート権限にしてインストール
★sudo su
★apt-get update && apt-get install golang
★exit
|user1@VM01:~$ sudo su
|root@VM01:/home/user1# apt-get update && apt-get install golang
|Hit:1 http://azure.archive.ubuntu.com/ubuntu xenial InRelease
|Hit:2 http://azure.archive.ubuntu.com/ubuntu xenial-updates InRelease
|Setting up pkg-config (0.29.1-0ubuntu1) ...
|Setting up golang-1.6-race-detector-runtime (0.0+svn252922-0ubuntu1) ...
|Setting up golang-race-detector-runtime (2:1.6-1ubuntu4) ...
|Processing triggers for libc-bin (2.23-0ubuntu3) ...
|root@VM01:/usr/local# exit
|exit
|user1@VM01:/usr/local$ go version

作業フォルダ(workspace)の作成
どうゆう名称のフォルダを何処に作ろうと自由。
★mkdir gows
|user1@VM01:~$ cd $HOME
|user1@VM01:~$ pwd
|/home/user1
|user1@VM01:~$ mkdir gows
|user1@VM01:~$ ls
|gows

6
環境変数の設定
★export GOPATH=$HOME/gows
★export PATH=$PATH:$GOPATH/bin
※ GOPATHは必ずGo treeの外に設けること。=GOROOTとは異なる値となる

環境変数の確認
★printenv
|user1@VM01:~$ printenv
|XDG_SESSION_ID=3
|TERM=xterm
|SHELL=/bin/bash
|SSH_CLIENT=202.225.5.123 21021 22
|SSH_TTY=/dev/pts/1
|USER=user1
||LS_COLORS=rs=0:di=01;…;36:
|MAIL=/var/mail/user1
|PATH=/home/user1/bin:/home/user1/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/user1/goworkspace/bin
|PWD=/home/user1
|LANG=en_US.UTF-8
|SHLVL=1
|HOME=/home/user1
|LOGNAME=user1
|SSH_CONNECTION=202.225.5.123 21021 10.2.0.4 22
|GOPATH=/home/user1/goworkspace
|LESSOPEN=| /usr/bin/lesspipe %s
|XDG_RUNTIME_DIR=/run/user/1000
|LESSCLOSE=/usr/bin/lesspipe %s %s
|_=/usr/bin/printenv
|user1@VM01:~$

7
環境の更新
★sudo apt-get update
//* apt: Linuxでソフトウェアの導入や管理、削除に用いられるパッケージ管理システムの一つ *//
|user1@VM01:~$ sudo apt-get update
|Hit:1 http://azure.archive.ubuntu.com/ubuntu xenial InRelease
|Hit:2 http://azure.archive.ubuntu.com/ubuntu xenial-updates InRelease
|Hit:3 http://azure.archive.ubuntu.com/ubuntu xenial-backports InRelease
|Get:4 http://security.ubuntu.com/ubuntu xenial-security InRelease [94.5 kB]
|Fetched 94.5 kB in 0s (147 kB/s)
|Reading package lists... Done

8
GoでHello World

あとまわし XXX TODO

ref:IBM Hyperledger Fabric, Chainfrog, posted on September 21, 2016

9
ちなみにVagrantは入れない。
Vagrantが使えたら色々と楽な筈なのだが、VargrantはVirtualBox (vBox)の使用を前提としている。
コミッタ達の推奨もこの手段。
が、VirtualBoxはカーネルに触る。一方、Azure上のVM環境からカーネルへのアクセスは許容されていない
→VM環境上からVagrantでのfabric体験は不可。
ちなみに、$GOPATH/src/github.com/hyperledger/fabric/devenv/VagrantfileではDockerの設定やvBoxのインストールなどをゴニョゴニョやってる

tag : Hyperledger fabric Azure CLI Go Vagrant VirtualBox Docker

2016-10-25 00:29 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] Hyperledger Fabric Starter Kit を Vagrant 使わずに動かす-概念編


1
始まり
巷で話題のHyperledger FabricというもののStarter Kitというものを動かしてみたいが為の奮闘記
本家はVagrant/VirtualBoxを使用する想定の手順だが、Microsoft Azure上でVirtualBoxが使えないのでVagrantを使わずに動かす。もう動けば何だっていい。

2
想定読者
Hyperledgerという言葉聞いたこと有るくせにLinuxのリの字も知らないおさる。

3
概要 ― 超そもそもHyperledger
そもそもHyperledgerに関して。
Hyperledgerプロジェクトにはサブプロジェクトが3つある。
Blockchain Explorer
Hyperledger Fabric (IBMのご出身)
― Sawtooth Lake (Intelのご出身)
ココで焦点当てるのはFabric

4
概要 ― Hyperledger Fabric(超々上辺)
Hyperledger Fabric*はdistributed ledger platform for running smart contractsの1実装である。
Hyperledgerプロジェクト配下の1サブプロジェクトに当たる。
2016年6月にver0.5がリリース。刻一刻と成長中
公式サイトは2つ存在している。連動するGitHubは同一。(入りやすい順)
4.1Incubation Notice
http://hyperledger-fabric.readthedocs.io/
Starter Kitがあるのはこちら。細かい話になると、Hyperledger Fabric Documentationへのリンクになる
4.2Hyperledger Fabric Documentation
http://openblockchain.readthedocs.io/
共同開発する人向けの情報がメインという感じ。
4.3(おまけ) Protocol Specification
https://github.com/hyperledger/fabric/blob/master/docs/protocol-spec.md
どこまで公式なのか謎だけど有用なサイトその③
かなり開発者向け。
ちなみに、コミッタのBaohua Yang (yeasy)がDockerに公開しているfabricイメージは本家の次に人気。
ただ、そのDockerイメージはちょっと前提踏まえている人向けでおサルには少し難しい。

5
概要 ― Hyperledger Fabric(表面辺り)
Hyperledger Fabricの特徴① - メンバーシップサービス
Hyperledger Fabricの特徴② - モジュラー型アーキテクチャ
•Membership Services
Blockchain Services
•Chaincode Services

// * モバイルアプリ開発プラットフォームもfabricだし、コマンドライン 経由で 任意の Python 関数 を実行するツールもfabric。ご注意あれ。検索時はHyperledgerも入れた方が無難。* //

6
概要 ― Hyperledger Fabric (概念辺り)

6.1
FabricってかHyperledgerはpeerによる構成
Peerには2種類、validatingとnon-validating。
Validating peer(検証Peer/検証Node) – a node on the network responsible for running consensus, validating transactions, and maintain the ledger.
Non-validating peer(非検証Peer/非検証Node) – a node that functions as a proxy to connect clients (issuing transactions) to validating peers. It doesn’t execute transactions but it may verify them.
(ref: Christian Cachin, Architecture of the Hyperledger Blockchain Fabric, July 2016)

6.2
サポートするアプリは2種類

6.2.1
Standalone Application
登場人物は3匹。
①Node.js
②Membership Service
③Peer
アプリ母体であるNode.jsとPeerにばら撒くChaincodeというロジックを実際開発し、後は要はフレームワークやね。

6.2.2
Web Application
基本Standalone Applicationと同じ。てか、ラップしただけ。
ブラウザ → Web tier → Database tier の流れになる
6.3開発環境
Hyperledger Fablic Client (HFC) SDK

7
俯瞰図

7.1
Docker界隈
FabricはDocker居てこそのもの。なので、まずDockerの雰囲気から。
(図: http://itpro.nikkeibp.co.jp/atcl/column/14/111400098/111400001/?rt=nocnt#)
Docker親分が居て、ボコボコと仮想環境を制御する。1仮想環境=1コンテナ=1 Docker Image。
(図: https://blog.techstars.jp/nyumon-docker-2346/)
ただ、少し厳密に書くとDocker親玉の上にコンテナが積まれるというか、子プロセスが生成される感じ。
Docker親玉が「docker0」に当たる。
Ref:Docker eLearning Cources, https://training.docker.com/self-paced-training ←公式&&非常に分かり易い

7.2
Fabric界隈
3匹の登場人物の相関図は↓こんな感じ。

fabric_internal_structure.png
(Application Overview, https://github.com/hyperledger/fabric/blob/master/docs/nodeSDK/app-overview.md)
-Application
アプリバックエンドに当たるところ。NVP(非検証)ノードとREST API*で通信する。
-Peer
1コンテナで1peer。
port: デフォで4つ。
7050 - REST service listening port,
7051 - peer service listening port,
7052 - used by CLI for callbacks,
7053 - Event service on validating node
-Membership Services
Portはデフォで1つ。
7054 - Certificate Authority (CA) listening port

//* REST=Representational State Transfer
Software Architectureの1つ。(SOAPは仕様でRestはArchitecture)
だったが、SOAPプロトコルのようなMEP*ベースの特別な抽象化をしないもののことを今は指す。*//
//* MEP = Message Exchange Pattern; SOAPノード相互のメッセージ交換のパターンを確立する為の雛形 *//

7.3
Docker x Hyperledger Fabric (Starter Kitの場合)
Azure_Docker_Fabric.png

OS上にまずDocker親分がいる。Docker親分は3つコンテナを作り並列で立ち上げる。3匹は
Fabricアプリ母体(Node.js)、MemberService(CA)、Peerの3つ。
// * その3つがまた各々でlayer構成になっていくのだが、それはDockerなお話。 * //
エンドユーザがWebを介してアクセスするのはアプリ母体部分。そのアプリ母体が適宜CAとPeerとやり取りする感じ。

tag : Blockchain Hyperledger Fabric Docker Linux

2016-10-25 00:21 : 開発 : コメント : 0 : トラックバック : 0 :

[開発] はやりのGo言語をAzure/Ubuntuにインストールする

Goのインストール
sudo su
apt-get update && apt-get install golang

作業フォルダ(workspace)の作成
mkdir gows

環境変数の設定
export GOPATH=$HOME/gows
export PATH=$PATH:$GOPATH/bin


tag: Go golang ubuntu Azure install Permission_denied Failed fetch 404

LOG ――――――――――――――――――――
★sudo apt-get install golang
|E: Failed to fetch  http://azure.archive.ubuntu.com/ubuntu/pool/main/b/binutils/binutils_2.26-8ubuntu2.1_amd64.deb 404 Not Found
上記のような404エラーが出た場合は以下コマンドを実施。(そのバージョンがrepoにもはやないのが原因)
★apt-get update && apt-get install golang
|user1@VM01:~$ apt-get update && apt-get install golang
|W: chmod 0700 of directory /var/lib/apt/lists/partial failed - SetupAPTPartialDirectory (1: Operation not permitted)
|E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
|E: Unable to lock directory /var/lib/apt/lists/
|W: Problem unlinking the file /var/cache/apt/pkgcache.bin - RemoveCaches (13: Permission denied)
|W: Problem unlinking the file /var/cache/apt/srcpkgcache.bin - RemoveCaches (13: Permission denied)
|E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
|E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
上記のようなPermission deniedされた時はsudo付けて実行
★sudo apt-get update && apt-get install golang
|Fetched 10.8 MB in 6s (1,778 kB/s)
|Reading package lists... Done
|E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
|E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?
ルートアカウントでないとダメらしい。
★sudo su
★apt-get update && apt-get install golang
|user1@VM01:~$ sudo su
|root@VM01:/home/user1# apt-get update && apt-get install golang
|Hit:1 http://azure.archive.ubuntu.com/ubuntu xenial InRelease
|Hit:2 http://azure.archive.ubuntu.com/ubuntu xenial-updates InRelease
|Hit:3 http://azure.archive.ubuntu.com/ubuntu xenial-backports InRelease
|Hit:4 http://security.ubuntu.com/ubuntu xenial-security InRelease
|Reading package lists... Done
|Reading package lists... Done
|Building dependency tree
|Reading state information... Done
|The following additional packages will be installed:
| binutils build-essential cpp cpp-5 dpkg-dev fakeroot g++ g++-5 gcc gcc-5
| gcc-5-base golang-1.6 golang-1.6-doc golang-1.6-go
| golang-1.6-race-detector-runtime golang-1.6-src golang-doc golang-go
| golang-race-detector-runtime golang-src libalgorithm-diff-perl
| libalgorithm-diff-xs-perl libalgorithm-merge-perl libasan2 libatomic1
| libc-dev-bin libc6-dev libcc1-0 libcilkrts5 libdpkg-perl libfakeroot
| libfile-fcntllock-perl libgcc-5-dev libgomp1 libisl15 libitm1 liblsan0
| libmpc3 libmpx0 libquadmath0 libstdc++-5-dev libstdc++6 libtsan0 libubsan0
| linux-libc-dev make manpages-dev pkg-config
|Suggested packages:
| binutils-doc cpp-doc gcc-5-locales debian-keyring g++-multilib
| g++-5-multilib gcc-5-doc libstdc++6-5-dbg gcc-multilib autoconf automake
| libtool flex bison gdb gcc-doc gcc-5-multilib libgcc1-dbg libgomp1-dbg
| libitm1-dbg libatomic1-dbg libasan2-dbg liblsan0-dbg libtsan0-dbg
| libubsan0-dbg libcilkrts5-dbg libmpx0-dbg libquadmath0-dbg bzr mercurial
| subversion glibc-doc libstdc++-5-doc make-doc
|The following NEW packages will be installed:
| binutils build-essential cpp cpp-5 dpkg-dev fakeroot g++ g++-5 gcc gcc-5
| golang golang-1.6 golang-1.6-doc golang-1.6-go
| golang-1.6-race-detector-runtime golang-1.6-src golang-doc golang-go
| golang-race-detector-runtime golang-src libalgorithm-diff-perl
| libalgorithm-diff-xs-perl libalgorithm-merge-perl libasan2 libatomic1
| libc-dev-bin libc6-dev libcc1-0 libcilkrts5 libdpkg-perl libfakeroot
| libfile-fcntllock-perl libgcc-5-dev libgomp1 libisl15 libitm1 liblsan0
| libmpc3 libmpx0 libquadmath0 libstdc++-5-dev libtsan0 libubsan0
| linux-libc-dev make manpages-dev pkg-config
|The following packages will be upgraded:
| gcc-5-base libstdc++6
|2 upgraded, 47 newly installed, 0 to remove and 116 not upgraded.
|Need to get 32.8 MB/68.3 MB of archives.
|After this operation, 345 MB of additional disk space will be used.
|Do you want to continue? [Y/n] y
|Get:1 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 gcc-5-base amd64 5.4.0-6ubuntu1~16.04.2 [16.6 kB]
|Get:2 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libstdc++6 amd64 5.4.0-6ubuntu1~16.04.2 [393 kB]
|Get:3 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 binutils amd64 2.26.1-1ubuntu1~16.04.3 [2,310 kB]
|Get:4 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 linux-libc-dev amd64 4.4.0-43.63 [837 kB]
|Get:5 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 cpp-5 amd64 5.4.0-6ubuntu1~16.04.2 [7,660 kB]
|Get:6 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libcc1-0 amd64 5.4.0-6ubuntu1~16.04.2 [38.8 kB]
|Get:7 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libgomp1 amd64 5.4.0-6ubuntu1~16.04.2 [55.1 kB]
|Get:8 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libitm1 amd64 5.4.0-6ubuntu1~16.04.2 [27.4 kB]
|Get:9 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libatomic1 amd64 5.4.0-6ubuntu1~16.04.2 [8,902 B]
|Get:10 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libasan2 amd64 5.4.0-6ubuntu1~16.04.2 [264 kB]
|Get:11 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 liblsan0 amd64 5.4.0-6ubuntu1~16.04.2 [105 kB]
|Get:12 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libtsan0 amd64 5.4.0-6ubuntu1~16.04.2 [244 kB]
|Get:13 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libubsan0 amd64 5.4.0-6ubuntu1~16.04.2 [95.4 kB]
|Get:14 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libcilkrts5 amd64 5.4.0-6ubuntu1~16.04.2 [40.0 kB]
|Get:15 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libmpx0 amd64 5.4.0-6ubuntu1~16.04.2 [9,762 B]
|Get:16 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libquadmath0 amd64 5.4.0-6ubuntu1~16.04.2 [131 kB]
|Get:17 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libgcc-5-dev amd64 5.4.0-6ubuntu1~16.04.2 [2,241 kB]
|Get:18 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 gcc-5 amd64 5.4.0-6ubuntu1~16.04.2 [8,604 kB]
|Get:19 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libstdc++-5-dev amd64 5.4.0-6ubuntu1~16.04.2 [1,430 kB]
|Get:20 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 g++-5 amd64 5.4.0-6ubuntu1~16.04.2 [8,302 kB]
|Fetched 32.8 MB in 1s (23.1 MB/s)
|Extracting templates from packages: 100%
|Selecting previously unselected package libmpc3:amd64.
|(Reading database ... 61156 files and directories currently installed.)
|Preparing to unpack .../libmpc3_1.0.3-1_amd64.deb ...
|Unpacking libmpc3:amd64 (1.0.3-1) ...
|Preparing to unpack .../gcc-5-base_5.4.0-6ubuntu1~16.04.2_amd64.deb ...
|Unpacking gcc-5-base:amd64 (5.4.0-6ubuntu1~16.04.2) over (5.3.1-14ubuntu2.1) ...
|Setting up gcc-5-base:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|(Reading database ... 61161 files and directories currently installed.)
|Preparing to unpack .../libstdc++6_5.4.0-6ubuntu1~16.04.2_amd64.deb ...
|Unpacking libstdc++6:amd64 (5.4.0-6ubuntu1~16.04.2) over (5.3.1-14ubuntu2.1) ...
|Processing triggers for libc-bin (2.23-0ubuntu3) ...
|Setting up libstdc++6:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Processing triggers for libc-bin (2.23-0ubuntu3) ...
|Selecting previously unselected package binutils.
|(Reading database ... 61161 files and directories currently installed.)
|Preparing to unpack .../binutils_2.26.1-1ubuntu1~16.04.3_amd64.deb ...
|Unpacking binutils (2.26.1-1ubuntu1~16.04.3) ...
|Selecting previously unselected package libc-dev-bin.
|Preparing to unpack .../libc-dev-bin_2.23-0ubuntu3_amd64.deb ...
|Unpacking libc-dev-bin (2.23-0ubuntu3) ...
|Selecting previously unselected package linux-libc-dev:amd64.
|Preparing to unpack .../linux-libc-dev_4.4.0-43.63_amd64.deb ...
|Unpacking linux-libc-dev:amd64 (4.4.0-43.63) ...
|Selecting previously unselected package libc6-dev:amd64.
|Preparing to unpack .../libc6-dev_2.23-0ubuntu3_amd64.deb ...
|Unpacking libc6-dev:amd64 (2.23-0ubuntu3) ...
|Selecting previously unselected package libisl15:amd64.
|Preparing to unpack .../libisl15_0.16.1-1_amd64.deb ...
|Unpacking libisl15:amd64 (0.16.1-1) ...
|Selecting previously unselected package cpp-5.
|Preparing to unpack .../cpp-5_5.4.0-6ubuntu1~16.04.2_amd64.deb ...
|Unpacking cpp-5 (5.4.0-6ubuntu1~16.04.2) ...
|Selecting previously unselected package cpp.
|Preparing to unpack .../cpp_4%3a5.3.1-1ubuntu1_amd64.deb ...
|Unpacking cpp (4:5.3.1-1ubuntu1) ...
|Selecting previously unselected package libcc1-0:amd64.
|Preparing to unpack .../libcc1-0_5.4.0-6ubuntu1~16.04.2_amd64.deb ...
|Unpacking libcc1-0:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Selecting previously unselected package libgomp1:amd64.
|Preparing to unpack .../libgomp1_5.4.0-6ubuntu1~16.04.2_amd64.deb ...
|Unpacking libgomp1:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Selecting previously unselected package libitm1:amd64.
|Preparing to unpack .../libitm1_5.4.0-6ubuntu1~16.04.2_amd64.deb ...
|Unpacking libitm1:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Selecting previously unselected package libatomic1:amd64.
|Preparing to unpack .../libatomic1_5.4.0-6ubuntu1~16.04.2_amd64.deb ...
|Unpacking libatomic1:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Selecting previously unselected package libasan2:amd64.
|Preparing to unpack .../libasan2_5.4.0-6ubuntu1~16.04.2_amd64.deb ...
|Unpacking libasan2:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Selecting previously unselected package liblsan0:amd64.
|Preparing to unpack .../liblsan0_5.4.0-6ubuntu1~16.04.2_amd64.deb ...
|Unpacking liblsan0:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Selecting previously unselected package libtsan0:amd64.
|Preparing to unpack .../libtsan0_5.4.0-6ubuntu1~16.04.2_amd64.deb ...
|Unpacking libtsan0:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Selecting previously unselected package libubsan0:amd64.
|Preparing to unpack .../libubsan0_5.4.0-6ubuntu1~16.04.2_amd64.deb ...
|Unpacking libubsan0:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Selecting previously unselected package libcilkrts5:amd64.
|Preparing to unpack .../libcilkrts5_5.4.0-6ubuntu1~16.04.2_amd64.deb ...
|Unpacking libcilkrts5:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Selecting previously unselected package libmpx0:amd64.
|Preparing to unpack .../libmpx0_5.4.0-6ubuntu1~16.04.2_amd64.deb ...
|Unpacking libmpx0:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Selecting previously unselected package libquadmath0:amd64.
|Preparing to unpack .../libquadmath0_5.4.0-6ubuntu1~16.04.2_amd64.deb ...
|Unpacking libquadmath0:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Selecting previously unselected package libgcc-5-dev:amd64.
|Preparing to unpack .../libgcc-5-dev_5.4.0-6ubuntu1~16.04.2_amd64.deb ...
|Unpacking libgcc-5-dev:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Selecting previously unselected package gcc-5.
|Preparing to unpack .../gcc-5_5.4.0-6ubuntu1~16.04.2_amd64.deb ...
|Unpacking gcc-5 (5.4.0-6ubuntu1~16.04.2) ...
|Selecting previously unselected package gcc.
|Preparing to unpack .../gcc_4%3a5.3.1-1ubuntu1_amd64.deb ...
|Unpacking gcc (4:5.3.1-1ubuntu1) ...
|Selecting previously unselected package libstdc++-5-dev:amd64.
|Preparing to unpack .../libstdc++-5-dev_5.4.0-6ubuntu1~16.04.2_amd64.deb ...
|Unpacking libstdc++-5-dev:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Selecting previously unselected package g++-5.
|Preparing to unpack .../g++-5_5.4.0-6ubuntu1~16.04.2_amd64.deb ...
|Unpacking g++-5 (5.4.0-6ubuntu1~16.04.2) ...
|Selecting previously unselected package g++.
|Preparing to unpack .../g++_4%3a5.3.1-1ubuntu1_amd64.deb ...
|Unpacking g++ (4:5.3.1-1ubuntu1) ...
|Selecting previously unselected package make.
|Preparing to unpack .../archives/make_4.1-6_amd64.deb ...
|Unpacking make (4.1-6) ...
|Selecting previously unselected package libdpkg-perl.
|Preparing to unpack .../libdpkg-perl_1.18.4ubuntu1.1_all.deb ...
|Unpacking libdpkg-perl (1.18.4ubuntu1.1) ...
|Selecting previously unselected package dpkg-dev.
|Preparing to unpack .../dpkg-dev_1.18.4ubuntu1.1_all.deb ...
|Unpacking dpkg-dev (1.18.4ubuntu1.1) ...
|Selecting previously unselected package build-essential.
|Preparing to unpack .../build-essential_12.1ubuntu2_amd64.deb ...
|Unpacking build-essential (12.1ubuntu2) ...
|Selecting previously unselected package libfakeroot:amd64.
|Preparing to unpack .../libfakeroot_1.20.2-1ubuntu1_amd64.deb ...
|Unpacking libfakeroot:amd64 (1.20.2-1ubuntu1) ...
|Selecting previously unselected package fakeroot.
|Preparing to unpack .../fakeroot_1.20.2-1ubuntu1_amd64.deb ...
|Unpacking fakeroot (1.20.2-1ubuntu1) ...
|Selecting previously unselected package golang-1.6-src.
|Preparing to unpack .../golang-1.6-src_1.6.2-0ubuntu5~16.04_amd64.deb ...
|Unpacking golang-1.6-src (1.6.2-0ubuntu5~16.04) ...
|Selecting previously unselected package golang-1.6-go.
|Preparing to unpack .../golang-1.6-go_1.6.2-0ubuntu5~16.04_amd64.deb ...
|Unpacking golang-1.6-go (1.6.2-0ubuntu5~16.04) ...
|Selecting previously unselected package golang-1.6-doc.
|Preparing to unpack .../golang-1.6-doc_1.6.2-0ubuntu5~16.04_all.deb ...
|Unpacking golang-1.6-doc (1.6.2-0ubuntu5~16.04) ...
|Selecting previously unselected package golang-1.6.
|Preparing to unpack .../golang-1.6_1.6.2-0ubuntu5~16.04_all.deb ...
|Unpacking golang-1.6 (1.6.2-0ubuntu5~16.04) ...
|Selecting previously unselected package golang-src.
|Preparing to unpack .../golang-src_2%3a1.6-1ubuntu4_amd64.deb ...
|Unpacking golang-src (2:1.6-1ubuntu4) ...
|Selecting previously unselected package golang-go.
|Preparing to unpack .../golang-go_2%3a1.6-1ubuntu4_amd64.deb ...
|Unpacking golang-go (2:1.6-1ubuntu4) ...
|Selecting previously unselected package golang-doc.
|Preparing to unpack .../golang-doc_2%3a1.6-1ubuntu4_all.deb ...
|Unpacking golang-doc (2:1.6-1ubuntu4) ...
|Selecting previously unselected package golang.
|Preparing to unpack .../golang_2%3a1.6-1ubuntu4_all.deb ...
|Unpacking golang (2:1.6-1ubuntu4) ...
|Selecting previously unselected package libalgorithm-diff-perl.
|Preparing to unpack .../libalgorithm-diff-perl_1.19.03-1_all.deb ...
|Unpacking libalgorithm-diff-perl (1.19.03-1) ...
|Selecting previously unselected package libalgorithm-diff-xs-perl.
|Preparing to unpack .../libalgorithm-diff-xs-perl_0.04-4build1_amd64.deb ...
|Unpacking libalgorithm-diff-xs-perl (0.04-4build1) ...
|Selecting previously unselected package libalgorithm-merge-perl.
|Preparing to unpack .../libalgorithm-merge-perl_0.08-3_all.deb ...
|Unpacking libalgorithm-merge-perl (0.08-3) ...
|Selecting previously unselected package libfile-fcntllock-perl.
|Preparing to unpack .../libfile-fcntllock-perl_0.22-3_amd64.deb ...
|Unpacking libfile-fcntllock-perl (0.22-3) ...
|Selecting previously unselected package manpages-dev.
|Preparing to unpack .../manpages-dev_4.04-2_all.deb ...
|Unpacking manpages-dev (4.04-2) ...
|Selecting previously unselected package pkg-config.
|Preparing to unpack .../pkg-config_0.29.1-0ubuntu1_amd64.deb ...
|Unpacking pkg-config (0.29.1-0ubuntu1) ...
|Selecting previously unselected package golang-1.6-race-detector-runtime.
|Preparing to unpack .../golang-1.6-race-detector-runtime_0.0+svn252922-0ubuntu1_amd64.deb ...
|Unpacking golang-1.6-race-detector-runtime (0.0+svn252922-0ubuntu1) ...
|Selecting previously unselected package golang-race-detector-runtime.
|Preparing to unpack .../golang-race-detector-runtime_2%3a1.6-1ubuntu4_amd64.deb ...
|Unpacking golang-race-detector-runtime (2:1.6-1ubuntu4) ...
|Processing triggers for libc-bin (2.23-0ubuntu3) ...
|Processing triggers for man-db (2.7.5-1) ...
|Setting up libmpc3:amd64 (1.0.3-1) ...
|Setting up binutils (2.26.1-1ubuntu1~16.04.3) ...
|Setting up libc-dev-bin (2.23-0ubuntu3) ...
|Setting up linux-libc-dev:amd64 (4.4.0-43.63) ...
|Setting up libc6-dev:amd64 (2.23-0ubuntu3) ...
|Setting up libisl15:amd64 (0.16.1-1) ...
|Setting up cpp-5 (5.4.0-6ubuntu1~16.04.2) ...
|Setting up cpp (4:5.3.1-1ubuntu1) ...
|Setting up libcc1-0:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Setting up libgomp1:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Setting up libitm1:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Setting up libatomic1:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Setting up libasan2:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Setting up liblsan0:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Setting up libtsan0:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Setting up libubsan0:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Setting up libcilkrts5:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Setting up libmpx0:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Setting up libquadmath0:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Setting up libgcc-5-dev:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Setting up gcc-5 (5.4.0-6ubuntu1~16.04.2) ...
|Setting up gcc (4:5.3.1-1ubuntu1) ...
|Setting up libstdc++-5-dev:amd64 (5.4.0-6ubuntu1~16.04.2) ...
|Setting up g++-5 (5.4.0-6ubuntu1~16.04.2) ...
|Setting up g++ (4:5.3.1-1ubuntu1) ...
|update-alternatives: using /usr/bin/g++ to provide /usr/bin/c++ (c++) in auto mode
|Setting up make (4.1-6) ...
|Setting up libdpkg-perl (1.18.4ubuntu1.1) ...
|Setting up dpkg-dev (1.18.4ubuntu1.1) ...
|Setting up build-essential (12.1ubuntu2) ...
|Setting up libfakeroot:amd64 (1.20.2-1ubuntu1) ...
|Setting up fakeroot (1.20.2-1ubuntu1) ...
|update-alternatives: using /usr/bin/fakeroot-sysv to provide /usr/bin/fakeroot (fakeroot) in auto mode
|Setting up golang-1.6-src (1.6.2-0ubuntu5~16.04) ...
|Setting up golang-1.6-go (1.6.2-0ubuntu5~16.04) ...
|Setting up golang-1.6-doc (1.6.2-0ubuntu5~16.04) ...
|Setting up golang-1.6 (1.6.2-0ubuntu5~16.04) ...
|Setting up golang-src (2:1.6-1ubuntu4) ...
|Setting up golang-go (2:1.6-1ubuntu4) ...
|Setting up golang-doc (2:1.6-1ubuntu4) ...
|Setting up golang (2:1.6-1ubuntu4) ...
|Setting up libalgorithm-diff-perl (1.19.03-1) ...
|Setting up libalgorithm-diff-xs-perl (0.04-4build1) ...
|Setting up libalgorithm-merge-perl (0.08-3) ...
|Setting up libfile-fcntllock-perl (0.22-3) ...
|Setting up manpages-dev (4.04-2) ...
|Setting up pkg-config (0.29.1-0ubuntu1) ...
|Setting up golang-1.6-race-detector-runtime (0.0+svn252922-0ubuntu1) ...
|Setting up golang-race-detector-runtime (2:1.6-1ubuntu4) ...
|Processing triggers for libc-bin (2.23-0ubuntu3) ...
|root@VM01:/home/user1#

作業フォルダ(workspace)の作成
★mkdir gows
|root@VM01:/home/user1# pwd
|/home/user1
|root@VM01:/home/user1# ls
|root@VM01:/home/user1# mkdir gows
|root@VM01:/home/user1#

tag : Go golang ubuntu Azure install Permission_denied Failed fetch 404

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

[開発] DockerとDocker Composeって何よ?

Linux上のシンプルで軽量な仮想環境(コンテナ)
Guest OSが不要な分VMよりも速い

Azure上のUbuntuDockerを入れる
rootユーザでログイン
| user1@VM01:~$ sudo su
| root@VM01:/home/user1#

最新のDockerパッケージをインストールする
| root@VM01:/home/user1# curl -fsSL https://get.docker.com/ | sh
| apparmor is enabled in the kernel and apparmor utils were already installed
| + sh -c apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-keys {key}
| Executing: /tmp/tmp.{address}/gpg.1.sh --keyserver
| hkp://ha.pool.sks-keyservers.net:80
| --recv-keys
| {key}
| gpg: requesting key {key} from hkp server ha.pool.sks-keyservers.net
| gpg: key {key}: public key "Docker Release Tool (releasedocker) " imported
| gpg: Total number processed: 1
| gpg: imported: 1 (RSA: 1)
| + break
| + sh -c apt-key adv -k {key} >/dev/null
| + sh -c mkdir -p /etc/apt/sources.list.d
| + dpkg --print-architecture
| + sh -c echo deb \[arch=amd64\] https://apt.dockerproject.org/repo ubuntu-xenial main > /etc/apt/sources.list.d/docker.list
| + sh -c sleep 3; apt-get update; apt-get install -y -q docker-engine
| Get:1 http://security.ubuntu.com/ubuntu xenial-security InRelease [94.5 kB]
| Hit:2 http://azure.archive.ubuntu.com/ubuntu xenial InRelease
| Get:3 http://azure.archive.ubuntu.com/ubuntu xenial-updates InRelease [95.7 kB]
| Hit:4 http://azure.archive.ubuntu.com/ubuntu xenial-backports InRelease
| Get:5 http://download.virtualbox.org/virtualbox/debian xenial InRelease [7,894 B]
| Get:6 http://security.ubuntu.com/ubuntu xenial-security/main Sources [42.3 kB]
| Get:7 http://security.ubuntu.com/ubuntu xenial-security/universe Sources [10.1 kB]
| Get:8 http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages [152 kB]
| Get:9 http://security.ubuntu.com/ubuntu xenial-security/main Translation-en [62.4 kB]
| Get:10 https://apt.dockerproject.org/repo ubuntu-xenial InRelease [30.2 kB]
| Get:11 http://security.ubuntu.com/ubuntu xenial-security/universe amd64 Packages [44.4 kB]
| Get:12 http://security.ubuntu.com/ubuntu xenial-security/universe Translation-en [26.7 kB]
| Get:13 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main Sources [192 kB]
| Get:14 http://azure.archive.ubuntu.com/ubuntu xenial-updates/universe Sources [97.2 kB]
| Get:15 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages [394 kB]
| Get:16 http://azure.archive.ubuntu.com/ubuntu xenial-updates/main Translation-en [150 kB]
| Get:17 http://azure.archive.ubuntu.com/ubuntu xenial-updates/universe amd64 Packages [332 kB]
| Get:18 http://azure.archive.ubuntu.com/ubuntu xenial-updates/universe Translation-en [115 kB]
| Ign:5 http://download.virtualbox.org/virtualbox/debian xenial InRelease
| Get:19 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages [2,313 B]
| Fetched 1,848 kB in 1s (1,165 kB/s)
| Reading package lists... Done
| W: GPG error: http://download.virtualbox.org/virtualbox/debian xenial InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY {key}
| W: The repository 'http://download.virtualbox.org/virtualbox/debian xenial InRelease' is not signed.
| N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use.
| N: See apt-secure(8) manpage for repository creation and user configuration details.
| Reading package lists...
| Building dependency tree...
| Reading state information...
| The following additional packages will be installed:
| aufs-tools cgroupfs-mount libltdl7
| Suggested packages:
| mountall
| The following NEW packages will be installed:
| aufs-tools cgroupfs-mount docker-engine libltdl7
| 0 upgraded, 4 newly installed, 0 to remove and 11 not upgraded.
| Need to get 19.5 MB/19.6 MB of archives.
| After this operation, 102 MB of additional disk space will be used.
| Get:1 http://azure.archive.ubuntu.com/ubuntu xenial/universe amd64 cgroupfs-mount all 1.2 [4,970 B]
| Get:2 http://azure.archive.ubuntu.com/ubuntu xenial/main amd64 libltdl7 amd64 2.4.6-0.1 [38.3 kB]
| Get:3 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 docker-engine amd64 1.12.1-0~xenial [19.5 MB]
| Fetched 19.5 MB in 1s (12.5 MB/s)
| Selecting previously unselected package aufs-tools.
| (Reading database ... 85920 files and directories currently installed.)
| Preparing to unpack .../aufs-tools_1%3a{address}ubuntu1_amd64.deb ...
| Unpacking aufs-tools (1:{address}ubuntu1) ...
| Selecting previously unselected package cgroupfs-mount.
| Preparing to unpack .../cgroupfs-mount_1.2_all.deb ...
| Unpacking cgroupfs-mount (1.2) ...
| Selecting previously unselected package libltdl7:amd64.
| Preparing to unpack .../libltdl7_2.4.6-0.1_amd64.deb ...
| Unpacking libltdl7:amd64 (2.4.6-0.1) ...
| Selecting previously unselected package docker-engine.
| Preparing to unpack .../docker-engine_1.12.1-0~xenial_amd64.deb ...
| Unpacking docker-engine (1.12.1-0~xenial) ...
| Processing triggers for libc-bin (2.23-0ubuntu3) ...
| Processing triggers for man-db (2.7.5-1) ...
| Processing triggers for ureadahead (0.100.0-19) ...
| Processing triggers for systemd (229-4ubuntu8) ...
| Setting up aufs-tools (1:{address}ubuntu1) ...
| Setting up cgroupfs-mount (1.2) ...
| Setting up libltdl7:amd64 (2.4.6-0.1) ...
| Setting up docker-engine (1.12.1-0~xenial) ...
| sent invalidate(passwd) request, exiting
| sent invalidate(group) request, exiting
| sent invalidate(group) request, exiting
| Processing triggers for libc-bin (2.23-0ubuntu3) ...
| Processing triggers for systemd (229-4ubuntu8) ...
| Processing triggers for ureadahead (0.100.0-19) ...
| + sh -c docker version
| Client:
| Version: 1.12.1
| API version: 1.24
| Go version: go1.6.3
| Git commit: 23cf638
| Built: Thu Aug 18 05:33:38 2016
| OS/Arch: linux/amd64
|
| Server:
| Version: 1.12.1
| API version: 1.24
| Go version: go1.6.3
| Git commit: 23cf638
| Built: Thu Aug 18 05:33:38 2016
| OS/Arch: linux/amd64
|
| If you would like to use Docker as a non-root user, you should now consider
| adding your user to the "docker" group with something like:
|
| sudo usermod -aG docker your-user
|
| Remember that you will have to log out and back in for this to take effect!
|
| root@VM01:/home/user1#

一般ユーザに"docker"グループの追加
| root@VM01:/home/user1# gpasswd -a user1 docker
| Adding user user1 to group docker
| sent invalidate(passwd) request, exiting
| sent invalidate(group) request, exiting
| sent invalidate(group) request, exiting
| root@VM01:/home/user1#

一般ユーザで再度ログインして、hello-worldを実行する
| root@VM01:/home/user1#
| root@VM01:/home/user1# su user1
| user1@VM01:~$ docker run hello-world
| Unable to find image 'hello-world:latest' locally
| latest: Pulling from library/hello-world
| c04b14da8d14: Pull complete
| Digest: sha256:{sth}
| Status: Downloaded newer image for hello-world:latest
|
| Hello from Docker!
| This message shows that your installation appears to be working correctly.
|
| To generate this message, Docker took the following steps:
| 1. The Docker client contacted the Docker daemon.
| 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
| 3. The Docker daemon created a new container from that image which runs the
| executable that produces the output you are currently reading.
| 4. The Docker daemon streamed that output to the Docker client, which sent it
| to your terminal.
|
| To try something more ambitious, you can run an Ubuntu container with:
| $ docker run -it ubuntu bash
|
| Share images, automate workflows, and more with a free Docker Hub account:
| https://hub.docker.com
|
| For more examples and ideas, visit:
| https://docs.docker.com/engine/userguide/
|
| user1@VM01:~$

Dockerが起動していない時
sudo service docker start

Azure上のUbuntuにDocker Composeを入れる

Docker compose とは、
複数のコンテナから成るサービスを構築・実行する手順を自動的にし、管理を容易にする機能
compose ファイルを用意してコマンドを1 回実行することで、
そのファイルから設定を読み込んですべてのコンテナサービスを起動することができるようになる

https://docs.docker.com/compose/install/
https://docs.docker.com/engine/installation/linux/ubuntulinux/

カーネルのバージョン確認
| user1@VM01:~$ uname -r
| 4.4.0-38-generic

ユーザ切り替え
user1@VM01:~$ sudo su

アップデート
| root@VM01:/home/user1# sudo apt-get update
| Hit:1 http://azure.archive.ubuntu.com/ubuntu xenial InRelease
| Get:2 http://azure.archive.ubuntu.com/ubuntu xenial-updates InRelease [95.7 kB]
| Hit:3 http://security.ubuntu.com/ubuntu xenial-security InRelease
| Hit:4 http://azure.archive.ubuntu.com/ubuntu xenial-backports InRelease
| Get:5 http://download.virtualbox.org/virtualbox/debian xenial InRelease [7,894 B]
| Hit:6 https://apt.dockerproject.org/repo ubuntu-xenial InRelease
| Ign:5 http://download.virtualbox.org/virtualbox/debian xenial InRelease
| Fetched 104 kB in 1s (103 kB/s)
| Reading package lists... Done
| W: GPG error: http://download.virtualbox.org/virtualbox/debian xenial InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY {key}
| W: The repository 'http://download.virtualbox.org/virtualbox/debian xenial InRelease' is not signed.
| N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use.
| N: See apt-secure(8) manpage for repository creation and user configuration details.

CA Certificatesのインストール
| root@VM01:/home/user1# sudo apt-get install apt-transport-https ca-certificates
| Reading package lists... Done
| Building dependency tree
| Reading state information... Done
| ca-certificates is already the newest version (20160104ubuntu1).
| apt-transport-https is already the newest version (1.2.12~ubuntu16.04.1).
| 0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded.
| root@VM01:/home/user1#

GPG鍵の追加
| root@VM01:/home/user1# sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
| Executing: /tmp/tmp.{address}/gpg.1.sh --keyserver
| hkp://p80.pool.sks-keyservers.net:80
| --recv-keys
| 58118E89F3A912897C070ADBF76221572C52609D
| gpg: requesting key 2C52609D from hkp server p80.pool.sks-keyservers.net
| gpg: key 2C52609D: "Docker Release Tool (releasedocker) " not changed
| gpg: Total number processed: 1
| gpg: unchanged: 1
| root@VM01:/home/user1#

「docker.list」の確認
| root@VM01:/home/user1# cd /etc/apt/sources.list.d/
| root@VM01:/etc/apt/sources.list.d# ls -l
| total 4
| -rw-r--r-- 1 root root 71 Oct 3 02:14 docker.list
| root@VM01:/etc/apt/sources.list.d#

中身確認
| root@VM01:/etc/apt/sources.list.d# cat docker.list
| deb [arch=amd64] https://apt.dockerproject.org/repo ubuntu-xenial main
| root@VM01:/etc/apt/sources.list.d# docker-compose --version
| The program 'docker-compose' is currently not installed. You can install it by typing:
| apt install docker-compose

Ubuntuのバージョン確認
| root@VM01:/etc/apt/sources.list.d# cat /etc/issue
| Ubuntu 16.04.1 LTS \n \l
|
| root@VM01:/etc/apt/sources.list.d# cat /etc/lsb-release
| DISTRIB_ID=Ubuntu
| DISTRIB_RELEASE=16.04
| DISTRIB_CODENAME=xenial
| DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"
| root@VM01:/etc/apt/sources.list.d#

OSがUbuntu Xenial 16.04 (LTS)の場合はdocker.listを以下に直すが既になってるので無視
| deb https://apt.dockerproject.org/repo ubuntu-xenial main

APTパッケージの更新
| root@VM01:/etc/apt/sources.list.d# sudo apt-get update
| Hit:1 http://security.ubuntu.com/ubuntu xenial-security InRelease
| Get:2 http://download.virtualbox.org/virtualbox/debian xenial InRelease [7,894 B]
| ...

ごみのお掃除
| root@VM01:/etc/apt/sources.list.d# sudo apt-get purge lxc-docker
| Reading package lists... Done
| Building dependency tree
| Reading state information... Done
| Package 'lxc-docker' is not installed, so not removed
| 0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded.
| root@VM01:/etc/apt/sources.list.d#

参照レポジトリの確認
| root@VM01:/etc/apt/sources.list.d# apt-cache policy docker-engine
| docker-engine:
| Installed: 1.12.1-0~xenial
| Candidate: 1.12.1-0~xenial
| Version table:
| *** 1.12.1-0~xenial 500
| 500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages
| 100 /var/lib/dpkg/status
| 1.12.0-0~xenial 500
| 500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages
| 1.11.2-0~xenial 500
| 500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages
| 1.11.1-0~xenial 500
| 500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages
| 1.11.0-0~xenial 500
| 500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages
| root@VM01:/etc/apt/sources.list.d#

バージョン確認
| root@VM01:/etc/apt/sources.list.d# docker-compose --version
| The program 'docker-compose' is currently not installed. You can install it by typing:
| apt install docker-compose
| root@VM01:/etc/apt/sources.list.d#

もうインストールしたのかと思いきや、まだだったようで。
aptでインストールというので
| root@VM01:/etc/apt/sources.list.d# apt install docker-compose
| Reading package lists... Done
| Building dependency tree
| Reading state information... Done
| The following additional packages will be installed:
| python-backports.ssl-match-hostname python-cffi-backend python-chardet
| ...
| root@VM01:/etc/apt/sources.list.d# docker-compose --version
| docker-compose version 1.5.2, build unknown

めでたしめでたし。多分。


ref.
2016年版、Dockerのすべてが5分でわかるまとめ!(コマンド一覧付き)
http://paiza.hatenablog.com/entry/docker_intro
Ubuntu16.04にDockerをインストール
http://qiita.com/snowman8765/items/d3f2756aeac1f18eccf9
今からでも間に合うDockerの基礎。コンテナとは何か、Dockerfileとは何か。Docker Meetup Tokyo #2
http://www.publickey1.jp/blog/14/dockerdockerfiledocker_meetup_tokyo_2.html


tag : Docker Linux Azure Ubuntu Compose

2016-10-04 14:50 : 開発 : コメント : 0 : トラックバック : 0 :
ホーム  次のページ »

search

ad



counter


tag cloud

category cloud