JavaScriptでAsync-Await-Catch

ちょっと予習。

async function sleep(wait, result) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (result === 3) {
        reject('error!')
      } else {
        console.log(result)
        resolve()
      }
    }, wait)
  })
}

async function syncSleep() {
  await sleep(2000, 1)
  await sleep(100, 2)
  await sleep(1000, 3)
}

syncSleep().catch(error => console.log('Error', error))

ポイントとなるのは、

  • sleepでPromiseオブジェクトを返すこと
  • Promiseの中でreject, resolveで正常/異常を区別つける
  • 時間がかかる関数、それを呼び出す関数はasyncをつけること

でしょうかね。

MacでWindows10 on BootCamp

やんごとなき事情で、Windows 10 on BootCampしたので簡単にメモ。

用意するもの

  • USBメモリィ 16GB
  • Windows10 ISOイメージ
  • Windows10 プロダクトキー

以下のサイトをなぞりながらインストールしていきました。

rocketnews24.com

道中、ハマったことといえば、
1. Windows 10のネットワークアダプタ無線LANが出てこない 2. Windows 10のネットワークが不安定 ぐらいです。

ハマったこと(1)は、以下、 support.apple.com

ハマったこと(2)は、以下、

macha3.dip.jp

で、それぞれ解決しました。しばらくは様子見てみます。

Javassistで対象クラスのアノテーション情報を取得

Javassitはいわゆるバイトコード操作ライブラリですが、クラスの解析も出来るんじゃないかなと思いました。
ということで、やってみた記事になります。

解析対象クラス

このクラスのメソッドに付与されているアノテーションを取得してみます。
雑いテストクラスで正直すまんこってす。

package oreore.tool.detector.target;

public class Target {
    Date date;
    LocalDate localDate;

    @Deprecated
    public Date getDate() {
        return date;
    }

    @Transient
    public void setDate(Date date) {
        this.date = date;
    }

    @Addressing
    public LocalDate getLocalDate() {
        return localDate;
    }

    public void setLocalDate(LocalDate localDate) {
        this.localDate = localDate;
    }
}

アノテーションを解析するクラス

ちょっとOOPっぽい形にしてみました。
まず親がこれ。

public abstract class Detector {
    CtClass loadClass(final String fqcn) {
        ClassPool classPool = ClassPool.getDefault();
        CtClass ctClass = null;
        try {
            ctClass = classPool.get(fqcn);
        } catch (NotFoundException e) {
            e.printStackTrace();
        }
        return ctClass;
    }

    protected abstract DetectorResult analyze(final CtClass ctClass, final DetectorResult detectorResult);

    public DetectorResult invoke(final String fqcn) {
        final CtClass ctClass = loadClass(fqcn);
        final DetectorResult detectorResult = new DetectorResult();
        analyze(ctClass, detectorResult);
        return detectorResult;
    }

    public static class DetectorResult {
        private Map<String, Object> information = new HashMap<>();

        public Map<String, Object> getInformation() {
            return information;
        }

        public void addInformation(final String key, final List list) {
            this.information.put(key, list);
        }
    }
}

そして、アノテーション解析するクラスです。
こいつの中にpsmvを定義しているのはご愛嬌。(面倒くさかっただけともいう)

public class AnnotationDetector extends Detector {
    @Override
    protected DetectorResult analyze(CtClass ctClass, DetectorResult detectorResult) {
        final Stream<CtMethod> ctMethodStream = Arrays.stream(ctClass.getMethods());
        ctMethodStream.forEach(method -> {
            try {
                final List<Object> annotations = Arrays.asList(method.getAnnotations());
                detectorResult.addInformation(method.getName(),
                        annotations);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        });
        return detectorResult;
    }

    public static void main(String[] args) {
        final Detector annotationDetector = new AnnotationDetector();
        final DetectorResult result = annotationDetector.invoke("oreore.tool.detector.target.Target");
        for (Map.Entry<String, Object> entry: result.getInformation().entrySet()) {
            System.out.println(entry.getKey() + " : " + entry.getValue());
        }

    }
}

実行結果

ふむ。

getClass : []
wait : []
notifyAll : []
notify : []
getLocalDate : [@javax.xml.ws.soap.Addressing]
setLocalDate : []
hashCode : []
equals : []
clone : []
setDate : [@java.beans.Transient]
finalize : []
toString : []
getDate : [@java.lang.Deprecated]

まとめ

JavaのReflection APIでも同様の事が出来るらしいので、わざわざJavassistを使う必要はないと思います。 解析結果に基づいて元クラスにごにょごにょするようなユースケースがあればJavassistの出番ではないでしょうか。

どのpackageがimportされているか調べる方法

APIか何かで取れるかと思ったけど、出来ないっぽい。

stackoverflow.com

じゃあ、javassistならどうなのよ?と思って、ClassPoolらへんを見てみる。

ClassPool (Javassist API)

お、getImportedPackagesがあるやん。使えるかな?

create-react-appで使われているテスト系ライブラリって何よ

いやまあ、公式ガイドか何かを見れば一発だとは思うのですが、ちょっとゼロから調べてみます。


create-react-appでテスト系のライブラリとして何が使われているのか調べてみます。
create-react-appで生成したアプリであればターミナルでnpm testでテストを実行出来ます。
npm testは、"test": "react-scripts test --env=jsdom"エイリアスですね。

それでは、react-scriptsの中で何かライブラリが定義されているのか見てみます。
react-scriptsのpackage.jsonを見てると、テスト系ライブラリとしてjtestがあります。これっぽいですね。

GitHub - facebook/jest: 🃏 Delightful JavaScript Testing.

更に、package.jsonを何気なく眺めていると以下記述を発見。

       "bin": {
         "react-scripts": "./bin/react-scripts.js"
       },

./bin/react-scripts.jsを見てみます。
これは、ターミナルでreact-scripts xxxが実行されたときに呼ばれるラッパーみたいなものですね。

react-scripts testが実行されたとき、./scripts/test.jsが呼ばれるようになっており、test.jsの中でjtestを実行していますね。

もうこれで、create-react-appは、jtestをテストライブラリとして使っているの確定。