pre{ white-space: pre; } .entry-content pre{ word-wrap: normal; }

ぶらコード

ぶらりオープンソースの旅

GitBookのIntroductionページに旅の記録を追加

一週間を振り返った前回のエントリに引き続き、GitBookの方にも旅の記録、つまりはGitBookの更新記録を書いておくことにした。
まだまだ、未完成な本なので、更新中であることをアピールする意図もあり。
GitBookのこんな使い方はアリなんだろうかとも思ったが、まあアリだろう。

最初の一週間を振り返ってみるという試み

2017/02/20(月)

 
記念すべき、ぶらりソースコードの旅、のスタート日。前からアイディアとしては、頭の中にあった「ソースコードの旅」。

まだ活用はしていないが、すでに「codetrip.jp」というドメインも取得済み。さらには、ホスティングサーバもレンタルしてあるのだが、どのようにコンテンツを作っていこうか悩みながらも、時だけが過ぎていった。

今はサラリーマンプログラマ(SE)としても就業中の身。さらには通勤も時間かかるし残業も多いしで、なかなか時間が確保できない状況。ソースコードはぼちぼち読んでいるのだが、その結果をアウトプットして、コンテンツ化することが出来ていなかった。

そんなこんなで時が過ぎていったが、自分の中の表現欲が抑えきれず、ついに自分の中から溢れ出した。それがこの日だった。この日は比較的早く帰れたので、帰宅途中に少し喫茶店に寄って頭の中を整理した。とにかく、形は後回しにしてでも、まずは世の中に出そうと思いブログを始めることにした。コンテンツを作りながら、試行錯誤して、どんどん作り変えて行けば良いと思った。

そして、とりあえずはてなブログのアカウントを作成した。ブログに関しても、オリジナルドメインを利用するためにプロアカウントにしようかとか、色々悩んでしまったが、そこで止まっていては先に進めない。というかある意味そんなことを繰り返してきて、この日に至っていた。

だが、とうとうそれも限界に達したというか、自分の中の表現欲が上回った。変に技術的に色々と出来るもんだから、そこら辺も色々とこだわり始めるとキリがなかった。なのでいっその事、一般のブロクサービスから始めることにしたのだった。なんとなく技術系のブログで馴染みのあったはてなブログにお世話になることにした。

この後、実際にぶらコードをスタートさせたのだが、ちょっとした書き方とか色々と調べながらの作業になったので、結局エントリとして書けたのは、日付が変わった2/22であった。

2017/02/21(火)

とりあえず、mavenソースコードをぶらつくことにした。その当たりの経緯は以下のエントリに書いた。

kutami-karamu.hatenablog.com

ソースを貼り付けたはいいけど、シンタックスハイライトさせるのに失敗するという、どうにもこうにも素人丸出しなスタートになった。汗
でも、とにかくスタートできた事は、とても大きいことなのだ。とてつもなく小さい一歩なのだが、0(ゼロ)が1(イチ)になったのだから、ある意味天地がひっくり返るくらいデカイ出来事でもあるわけだ!←大げさ。

この日、早速スターをつけてくださる方が2名いて、とても励みになった。1か月くらいは世の中に認知されないだろうと思っていたので、嬉しい驚きでもあった。
このあたりは一般のブログサービスならではの展開の速さなんだと思う。はてなブログで始めて正解だった。たとえどんなに良いコンテンツを作れたとしても、誰も見てくれなかったら、存在しないのと変わらないもんね。
ま、作ってるだけでも楽しかったりはするんだが。実際に始めて見ないと分からないことであり、やっぱり始めてよかったと実感した。

2017/02/22(水)

この日は、一旦更新はお休み。同僚と飲みに行っていたので〜。

2017/02/23(木)

再開。自分で作ったブログをスマホで読んでみたら、コードの折り返しが行けてない感じで、読みづらかったので改善したかった。
で、色々と調べてgist使って書いてみることにした。折り返しに関しては、良い感じになった。とりあえず、ぶらコード的にも先に進めたので良かった。
この日はブログのタイトルとかデザインとか細かいところもチョイチョイ改善していった。まだ全然満足できてないけど。

2017/02/24(金)

仕事中にLinuxカーネルパラメータに関して調べる必要があって、ググっても中々情報が得られなかった。もうちょい探していると、ひらメソッドで有名なサイトに辿り着いた。
ひらメソッド - LinuxKernelHackJapan

そういえば、ひらメソッドってあったな。改めてぶらコードのコンテンツ作成方法としてみてみると、色々と参考になった。
というのも、ここ何日間かで、コンテンツを書いていったのだが、eclipseやコンソールで読んでいくスピードに対して、ブログでアウトプットできるスピードが圧倒的に遅く、フラストレーションが溜まっていたのだ。

何かもっと改善しないと、ストレスが溜まって仕方ないと思い、前から考えていたツールの開発を先にやるか?とか思ってたけど、それやっちゃうとまたアウトプットが遅れちゃうからなぁ、というもう一人の自分からのお告げがあり、何とか別の方法を模索していた。
なるべくシンプルにやりたい。結局はテキストデータだから、シンプルにmarkdownとかで書いて、SCMとかでバージョン管理して、必要に応じてコンバートしてコンテンツを作成する、とかがベターだと思っていた。

そんな視点で模索していたところ、GitBookに辿り着いた。これも以前から目にしていたサービスだった。
ひらメソッドwiki使ってたけど、ぶらコードではとりあえずGitBookでやってみることにした。ブログだと単なる時系列の並びになりがちで、自分自身も書きづらかった。その点GitBookだと勝手に構造化されていくし、中身のテキストデータはGitHubでバージョン管理されていくので、自分のやりたいことにかなり合致していることに気がついた。自分でツールとかを構築するよりは、早いしシンプルだし、その分、今優先すべきコンテンツ作成にリソースを割り振れるわけだ。

実際に書いてみたら、良いカンンジにできた。これからしばらくは、GitBookを中心にコンテンツを作っていこうと思う。
このブログでは、今回のエントリのようにぶらコードの裏側となる、自分の試行錯誤、悪戦苦闘、七転八倒の軌跡を残していこうと思う。

GitBookを作ってみた。

昨日までにとりあえず書いてみた、mavenのぶらり旅をGitBookで書いてみた。
ブログで書くより綺麗な仕上がりになっていいかも。
読む人的にも電子ブックになってるから、フォントサイズとか変えられるし、目次とかのナビゲーションもついてるから、いいんでないでしょうか。

Introduction · ぶらコード:maven

ぶらコード:maven:その4(Plexusその3):入り口に入るの巻

今回は、入り口をめっけたので、次回はこの入り口をぶらつきつつ、その先に進んで行くとします。

前回見つけた入り口に入って行きたいのだが、ソースコードを如何に貼り付けて、ぶらり旅の記録を残していくか試行錯誤中。
とりあえず、gist使ってソースを貼ってみる。

まずは、main()メソッドの5行目で、次のmainWithExitCode()というメソッドに入っていく。
なんでわざわざmainWithExitCode()メソッドに分岐するのかってのは、main()メソッドの構造を明確にしたいからですかね。
mainWithExitCode()でくくり出した、一番やりたいことの外で、例外のハンドリングして、
正常時と異常時にそれぞれ適切な終了コードを、System.exit()を使って処理していますな。

ところで、異常時には「100」という値を返してますが、この値が意味するところは、、、特になさそうだな。

で、mainWithExitCode()に入ってみると、

冒頭で以下のコードに遭遇。

String classworldsConf = System.getProperty( CLASSWORLDS_CONF );

CLASSWORLDS_CONFというのは同じファイル内で、

protected static final String CLASSWORLDS_CONF = "classworlds.conf";

と定義されている。

こいつは、システムプロパティから読み込みを行っている訳だが、
以前登場した、mvnコマンドの「/usr/local/Cellar/maven/3.3.3/libexec/bin/mvn」というシェルスクリプトの最後に記載のある、
起動時の以下のコードでplexusの起動時に「"-Dclassworlds.conf=${M2_HOME}/bin/m2.conf" \」
として渡しているものを、ここで受け取っていることになる。

exec "$JAVACMD" \
  $MAVEN_OPTS \
  -classpath "${M2_HOME}"/boot/plexus-classworlds-*.jar \
  "-Dclassworlds.conf=${M2_HOME}/bin/m2.conf" \
  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
  ${CLASSWORLDS_LAUNCHER} "$@"

ようやくmavenとも繋がってきたな。

ぶらコード:maven:その3(Plexusその2):「旅の入り口を発見」の巻

で、以前たどり着いた、「plexus-classworlds-*.jar」が何者かってことから入っていこう。

Plexus Classworlds – About
によると、どうやら「クラスローダーフレームワーク」らしい。

「クラスローダーフレームワーク」って単語はあまり聞きなれないけど、
要はクラスをローディングしてくれる便利ツールなんでしょう。

早速ソースを探す。

Plexus Classworlds – Source Repository
てなページがあったので見てみると、どうやらGitHubでソース管理している様子。

なので以下のURLからソースをゲット。
http://github.com/codehaus-plexus/plexus-classworlds

ローカルで「mvn eclipse:eclipse」してeclipseに取り込む。

でもちょっとその前に、今回の「plexus-classworlds-*.jar」君はjarファイルなので、
このjarの中のどのクラスがエントリポイントなのかを探さないといけない。

jarの中を見てみるのもいいけど、ちょうど良くpom.xmlがあったので、
「jar」というキーワードで検索してみたところ、以下の記述を発見。

      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.5</version>
        <configuration>
          <archive>
            <manifest>
              <mainClass>org.codehaus.plexus.classworlds.launcher.Launcher</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>

pomの記載通り、mainClassは「org.codehaus.plexus.classworlds.launcher.Launcher」らしいので、
こいつのmain()メソッドが今回の旅の入り口(エントリポイント)ってことになるわけだっ。

で、以下のがその入り口です。

    /**
     * Launch the launcher from the command line.
     * Will exit using System.exit with an exit code of 0 for success, 100 if there was an unknown exception,
     * or some other code for an application error.
     *
     * @param args The application command-line arguments.
     */
    public static void main( String[] args )
    {
        try
        {
            int exitCode = mainWithExitCode( args );

            System.exit( exitCode );
        }
        catch ( Exception e )
        {
            e.printStackTrace();

            System.exit( 100 );
        }
    }

    /**
     * Launch the launcher.
     *
     * @param args The application command-line arguments.
     * @return an integer exit code
     * @throws Exception If an error occurs.
     */
    public static int mainWithExitCode( String[] args )
        throws Exception
    {
        String classworldsConf = System.getProperty( CLASSWORLDS_CONF );

        InputStream is;

        Launcher launcher = new Launcher();

        ClassLoader cl = Thread.currentThread().getContextClassLoader();

        launcher.setSystemClassLoader( cl );

        if ( classworldsConf != null )
        {
            is = new FileInputStream( classworldsConf );
        }
        else
        {
            if ( "true".equals( System.getProperty( "classworlds.bootstrapped" ) ) )
            {
                is = cl.getResourceAsStream( UBERJAR_CONF_DIR + CLASSWORLDS_CONF );
            }
            else
            {
                is = cl.getResourceAsStream( CLASSWORLDS_CONF );
            }
        }

        if ( is == null )
        {
            throw new Exception( "classworlds configuration not specified nor found in the classpath" );
        }

        launcher.configure( is );

        is.close();

        try
        {
            launcher.launch( args );
        }
        catch ( InvocationTargetException e )
        {
            ClassRealm realm = launcher.getWorld().getRealm( launcher.getMainRealmName() );

            URL[] constituents = realm.getURLs();

            System.out.println( "---------------------------------------------------" );

            for ( int i = 0; i < constituents.length; i++ )
            {
                System.out.println( "constituent[" + i + "]: " + constituents[i] );
            }

            System.out.println( "---------------------------------------------------" );

            // Decode ITE (if we can)
            Throwable t = e.getTargetException();

            if ( t instanceof Exception )
            {
                throw (Exception) t;
            }
            if ( t instanceof Error )
            {
                throw (Error) t;
            }

            // Else just toss the ITE
            throw e;
        }

        return launcher.getExitCode();
    }

今回は、入り口をめっけたので、次回はこの入り口をぶらつきつつ、その先に進んで行くとします。

ぶらコード:maven:その2(Plexusその1)

Plexus周辺をぶらぶらしてみる。

前回は、

Plexus – Plexus Overview

どうやら、maven用に開発されたIoC(Inversion of Contorl)するライブラリのようだね。

という認識だったが、どうやらIoCするライブラリでもないようだ。

概要はこちら
Plexus – Plexus Overview

最初はIoCのライブラリだったけど、今はIoCの部分は「Eclipse Sisu」ってのに置き換わっていて、
別の方向を目指しているようだ。

google翻訳がかなりいい線いってたので、とりあえず貼っておく。

重要なお知らせ
Plexusプロジェクトは以前はIoC Plexus Containerに重点を置いていました。現在はEclipse Sisuに置き換えられており、Google Guice拡張機能として書き直されています。IoCの部分が廃止されたとしても、私たちは参照のためにIoC全体の内容を保持しました。

Plexusプロジェクトは、ソフトウェアプロジェクトを作成して実行するための完全なソフトウェアスタックを提供します。Plexusコンテナに基づいて、アプリケーションはコンポーネント指向プログラミングを利用して、モジュール化された再利用可能なコンポーネントを構築し、容易に組み立てて再利用することができます。

Plexusは、Spring Frameworkのような他のIoC(Inversion-of-Control)や依存性注入フレームワークと似ていますが、以下のような多くの機能をサポートする本格的なコンテナです。

コンポーネントのライフサイクル
コンポーネントインスタンス化の戦略
・ネストされたコンテナ
コンポーネント構成
・自動配線
コンポーネントの依存関係
・コンストラクタインジェクション、セッターインジェクション、およびプライベートフィールドインジェクションを含むさまざまな依存性注入技術。

Plexusと他の製品との違いの詳細については、機能の比較ページを参照してください。

プレクサスプロジェクトは、このような突堤、ベロシティ、Hibernateは、国際化、およびなどの一般的なタスクとツールキットのために事前に構築されたコンポーネントの数を提供し、より多くの。しかし、PlexusはSpring、Avalon、Pico Containerなどの他のIoCフレームワーク用に書かれた既存のコンポーネントをそのまま使用することができます。また、既存のコードをPlexus Container内で再利用することもできます。

Plexusには、アプリケーションを実行できるアプリケーションサーバーが付属しているため、必要に応じてサービスの実行などの一般的な機能を備えたスタンドアロンの実行可能な配布を簡単に作成できます。ただし、Plexusアプリケーションは、Java EEアプリケーションやWebアプリケーションを含む既存のアプリケーションにコンテナを埋め込むことで、どのような環境でも実行できます。

PlexusのコンポーネントJavaで記述する必要はなく、JythonJRuby、Beanshell、Groovyのコンポーネントファクトリが存在します。

Plexusコンテナは現在、いくつかのアプリケーションとフレームワーク、特にMaven 2.0とWebwork 2.2(Struts Action Framework 2.0)で使用されています。

Plexus に関するよくある質問への回答はFAQをご覧ください。

どうやら、ソフトウェア開発のフレームワークってことみたいだね。
でもやっぱりマイナーだよね。ほとんど聞いたことない。

と思ってたら、FAQに以下のような自虐的とも取れる記述がw
Plexus – Frequently Asked Questions

なぜPlexusは普及していないのですか?
Plexusは何年も前から存在していましたが、スタンドアロン製品として広く普及したことはありません。開発の焦点は、Maven 2.0のプラグインモデルなどの高度なアプリケーションアーキテクチャのニーズを容易にすることができるコンテナを提供することでした。

Maven 2.0の安定版リリースでは、Maven 2.0プラグインの作成に使用されるため、スタンドアロン製品としてのPlexusが注目を集めており、一般的なアプリケーション開発に提供できるメリットが見られます。

さらに、Plexusはアプリケーションコンテナを必要とする人にとって魅力的になってきましたが、Springのような一般的なフレームワークには必要な機能がありません。

今後のPlexus 1.0のリリース、およびその高度な機能と他のフレームワークとの統合により、Plexusは今後すべてのアプリケーション開発者にとって人気の高い選択肢になることを願っています。

まあ、そういうことのようです。
でも、少なくともmavenという偉大なアプリケーションを影で支えているわけですから、ぶらついてみる価値はあるでしょう。
その他、Plexusサイトの情報を一通り読んでみましたが、イマイチピンと来ませぬ。
なので、実際にmavenで使っているとこを読んでみて、感覚を掴んでいきたいと思います。
意外と良さそうであれば、今後自分でも使うかもしれないしねぇ。

編集モードは後から切り替えられん。なぜ?

うむむ。シンタックスハイライトされてませんな。 また、今度調べましょ。

うむむ。後から切り替えることはできないのね。 仕方ない。とりあえずはあきらめる。 次からは気をつける。

なんで切り替えられんのだ?レンダリングし直すだけでは?

オリジナルの文字列を保持しておらんのか?

いや、そんなことはないな。再編集できてるもんな。

でもそれは「見たまま」編集モードだから?

試しにこのエントリーを「見たまま」モードで編集しつつ、

別タブでも記事を書こうとするとこのエントリーが「Markdown」モードの編集画面で表示される。

この時、残念ながらたくさーーんの、htmlタグとその中に埋め込まれた、

cssのスタイル指定がごにょごにょゴニョォーっと、蠢いているのが見えてしまった。

<blockquote>
<p style="margin: 10px 0px; padding: 0px; font-weight: normal; color: #666666; font-family: 
sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: 
normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; 
white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: #ffffff;">
うむむ。
<a class="keyword" style="color: inherit !important; text-decoration: none; word-break: break-word; cursor: 
pointer !important; word-wrap: break-word; font-size: 16px; font-weight: inherit !important; 
font-style: inherit !important; pointer-events: auto !important;" 
href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%F3%A5%BF%A5%C3%A5%AF%A5%B9">
シンタックス</a>ハイライトされてませんな。</p>
<p style="margin: 10px 0px; padding: 0px; font-weight: normal; color: #666666; 
font-family: sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; 
font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent:
 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width:
 0px; background-color: #ffffff;">また、今度調べましょ。</p>
</blockquote>
<p>うむむ。後から切り替えることはできないのね。</p>
<p>仕方ない。とりあえずはあきらめる。</p>
<p>次からは気をつける。</p>
<p> </p>
<p>なんで切り替えられんのだ?</p>
<p>レンダリングし直すだけでは?</p>
<p>オリジナルの文字列を保持しておらんのか?</p>
<p>いや、そんなことはないな。再編集できてるもんな。</p>

つまりは、オリジナルの文字列は保持しておらず、変換後の文字列だけ持っているから、後から変えられんということか。

よくよく考えると見たままモードってのは、裏でhtmlを生成してくれているだけで、

やれ太文字だのアンダーラインだのを引くってのは、

その対象となる文字列をマークアップしているってことなわけだから、 プレーンテキストで保持するのは難しいですわな。

はてなブログのソース読んで確かめたい。 はてなのエンジニアの皆様、変なとこ覗いてしまってすみません。。。

こんなところが気になるのも、エンジニアの性ということでお許しを。