53ningen.com

@gomi_ningen's Website

Jakarta Commons CLI

  • Jakarta Commons CLI
    • コマンドライン引数をパースしてという CLI(Command Line Interface)
    • Options: 受け取れるオプション
    • addOption で受け取れる引数を追加していく
    • parser.parse(options, args)とするとパースした結果を得られる
import org.apache.commons.cli.base.*;

final Options options = new Options();
final Option helpOpt = OptionBuilder
                .hasArg(false)
                .withArgName("help")
                .isRequired(false)
                .withDescription("このヘルプ")
       ...
Read More

phax/ph-cssを使う

phax/ph-css の使い方

// parsing css and get CSSOM
final CascadingStyleSheet css = CSSReader.readFromString(
                ".index h1,\n" +
                ".index h2,\n" +
                ".index h3,\n" +
                ".index h4,\n" +
                ".index h5,\n" +
                ".index h6 {\n" +
                "    font-family: \"ヒラギノ明朝 ProN W3\", \"HiraMinProN-W3\", serif;\n" +
                "    font-size: large;\n" +
                "}", ECSSVer...
Read More

Immutable パターン

<p>結城先生のデザパタ本マルチスレッド編 第2章のまとめ</p> <h2>問題</h2> <p>複数のスレッドがインスタンスを共有しているが、インスタンスの状態は変化しない。 このときに、何も考えず <code>Single Threaded Execution</code> パターンを使うとスループットが落ちてしまいます。</p> <h2>解決方法</h2> <p>インスタンスが状態変化しないのであれば <code>Single Threaded Execution</code> パターンを使う必要はありません。 その場合は意図しない状態変化を防ぐためにフィールドが変化しないようにする <code>Immutable</code> パターンを用います。 不変性を保つのは大変なので、気をつけて実装する必要があります。またドキュメントにクラスが不変であることを明示する方が良いでしょう。</p> <h2>関連するパターン</h2> <ul> <li>状態を変更するスレッドが参照するスレッドの数よりも少ないときは、<code>Read-Write Lock</code> パター...Read More

Single Threaded Executionパターン

結城先生のデザパタ本マルチスレッド編 第1章のまとめ

問題

複数のスレッドがインスタンスを共有している状態で、 それぞれのスレッドがインスタンスの状態を勝手に変更すると、インスタンスの安全性が失われます。

解決方法

そこで、そのままではインスタンスが不定な状態に陥ってしまう範囲を定めます。 これをクリティカルセクションと呼びます。 このクリティカルセクションを synchronized を用いて1つのスレッドだけが実行できるようにガードします。 このようなパターンを Single Threaded Execution パターンと呼びます。

関連するパターン

  • インスタンスの状態が変化しないときには Immutable パターンを使うことにより、スループットを向上させることができる
  • インスタンスの状態を参照するスレッドと変更するスレッドが分かれている場合は Read-Write Lock パターンを使うことにより、スループットを向上させることができる

以下のようなカウンターがあったとします

c...
Read More

Java言語で学ぶデザインパターン 〜マルチスレッド編〜 読書メモ (1)

結城先生のデザパタ本マルチスレッド編がサクッと読めそうだったので読み進めているので、自分用メモ。ほとんど知っている内容ではあったけど、体系的に知識が入っていなかったので、よい確認になる...。

Java 言語のスレッド

スレッドの起動方法

スレッドを起動する方法は2つある

  1. Thread クラスのサブクラスのインスタンスを使ってスレッドを起動する
  2. Runnable インターフェースの実装クラスのインスタンスを使ってスレッドを起動する
class ThreadSubclass extends Thread {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    public void run() {
        IntStream.range(0, 10).forEach(i -> logger.info(Integer.toString(i)));
    }

}

class RunnableImpl imp...
Read More

Java8 + AWS Lambda + API Gateway で遊ぶ

この記事では Java8 で書いたメソッドを AWS Lambda に実行させ、その実行結果を API Gateway を用いて外から取得できるような簡単なアプリケーションを作成していきます。

めっちゃ雑にいうと、Java で String を返すメソッドを書いて、その文字列を返す API を作るというようなことをやります。

この際、String を返す Java のコードを実行するのが、AWS Lambda の役割で、その実行結果を取得できるエンドポイントを提供するのが API Gateway の役割になります。

また、ちょっと手を加えるだけで簡単に JSON を返す API を作ることもできるので、使い方次第では遊べるツールになるのではないでしょうか?

固定した文字列を返す API を作成する

まず、あるエンドポイントを叩くと、ただ文字列が帰ってくるだけの API を作成しながら、AWS LambdaAPI Gateway の使い方を確認していきます。

Gradle プロジェクト作成〜実行対象のメソッド作成

gradle で適当にプ...

Read More

Javaの短絡評価されない論理演算子

Javaで論理演算を行うとき、もっぱら &&|| を利用すると思います。if (isHoge() && isFoo()) { ... } 的な感じで。

これらは短絡評価されるので、たとえば false && true という式があったとして、前者を評価した時点でこの式全体は false が返ることは明らかなので、後者の true は評価されません。

こんなコードは読みたくないのですが、もし boolean を返すメソッドが副作用を持っていて、短絡評価された場合当たり前ですが、動作に影響がでます。たとえば以下のような最悪な感じのメソッドを考えてみましょう。

private static boolean isTrueWithSideEffect() {
    System.out.println("hoge");
    return true;
}

private static boolean isFalseWithSideEffect() {
    System.out.println("foo");
    return fals...
Read More

Scalaのtraitを解剖してみた

Scala の trait を解剖してみた

trait Trait {

    val value: String = s"$getOne"

    def getOne: Int = 1

    def getTwo: Int

}

これを jad すると

// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name:   Trait.scala

import scala.Predef$;
import scala.StringContext;
import scala.runtime.BoxesRunTime;

public abstract class Trait$class
{

    public static int getOne(Trait ...
Read More

Scalaの末尾再帰除去を確認する

Scala の末尾再帰除去を実際に jad を使って確かめただけの簡単な記録。 jad の導入は以下のとおり。

brew tap homebrew/binary
brew install jad

簡単な階乗関数で確認すればわかりやすい

object Math {

  def fact(n: Int): Int =
  if (n < 2) 1
  else n * fact(n - 1)

  def fact2(n: Int): Int = {
    def go(n: Int, acc: Int): Int = {
        if (n < 2) acc
        else go(n -1, n * acc)
    }
    go(n, 1)
  }

}

こんなのをコンパイルして jad でどうなっているか確認します。以下その結果。

public final class Math$
{

    public int fact(int n)
    {
        return n >= 2 ? n...
Read More

Copyright © 53ningen.com