Play FrameworkをVSCodeでリモートデバッグする

はじめに

難しく考えすぎていました。
拡張機能なんていらない!

ググった結果

f:id:m_mitsurupj:20210927093311p:plain
こんなキーワードで検索していました。
すると、「Remote Development」を入れろとか、「ObjectScript」を入れろとか、
記事の海に飲み込まれていました。

あ、23歳おめでとう。

Eclipseでは簡単にできる

f:id:m_mitsurupj:20210927093716p:plain
デバッグ構成の「リモート Java アプリケーション」で。
VSCodeもこれぐらい簡単にできないものか。
※リモートデバッグ用のポートを開けている前提です。

ググり直す

Play Frameworkに固執するのはやめて、検索キーワードにSpring Bootを入れてみたら良記事発見。 yomon.hatenablog.com

そうそう、この情報が欲しかったのです。
下記内容のlaunch.jsonを作成するだけでOK。

{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "type": "java",
            "name": "Debug (Attach)",
            "request": "attach",
            "hostName": "localhost",
            "port": 9999
        }
    ]
}

FastArrayListはforEach()に対応していない

OpenJDK11で、Apache Commons Collections 3系に含まれるFastArrayListに対して、forEach()を行うと処理が行われない。

List<String> list = new FastArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");

StringBuilder sb = new StringBuilder();
list.forEach(e -> sb.append(e));

// xxが出力される
System.out.println("x" + sb.toString() + "x");

原因

FastArrayListはforEach()をオーバーライドしていないので、親であるArrayListのforEach()が実行される。

@Override
public void forEach(Consumer<? super E> action) {
    Objects.requireNonNull(action);
    final int expectedModCount = modCount;
    final Object[] es = elementData;
    final int size = this.size;
    for (int i = 0; modCount == expectedModCount && i < size; i++)
        action.accept(elementAt(es, i));
    if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
}

ループ条件のmodCountはAbstractListで宣言されている。

protected transient int modCount = 0;

また、sizeはArrayListで宣言されている。

private int size;

これらはArrayList#add(E)ではインクリメントされるが、FastArrayList#add(Object)ではインクリメントされない。(sizeはアクセスできないし)

対処

匿名クラスでforEach()をオーバーライドする。

List<String> list = new FastArrayList() {
    public void forEach(Consumer action) {
        Objects.requireNonNull(action);
        for (Object t : this) {
            action.accept(t);
        }
    };
};
list.add("aaa");
list.add("bbb");
list.add("ccc");

StringBuilder sb = new StringBuilder();
list.forEach(e -> sb.append(e));

// xaaabbbcccxが出力される
System.out.println("x" + sb.toString() + "x");

Scratchで共同開発する

Scratchの共有プロジェクトとバックパックを使用して、共同開発する方法を教えていただいたので、まとめておきます。

【作成するプロジェクト】
キャッチゲーム

【使用するアカウント】
e_masakun ステージ担当
e_chi_chan リンゴ担当
e_nacchan ボウルおよびマージ・追加開発担当


1. e_masakunでステージを作成し、共有プロジェクトに
f:id:m_mitsurupj:20180917174850p:plain

2. e_chi_chanでリンゴを作成し、共有プロジェクトに
f:id:m_mitsurupj:20180917175057p:plain

3. e_nacchanでボウルを作成し、共有プロジェクトに
f:id:m_mitsurupj:20180917175128p:plain

※以降はe_nacchanで作業します。

4. e_chi_chanの共有プロジェクトの中を見る
f:id:m_mitsurupj:20180917175336p:plain

5. リンゴのスプライトをバックパックにドラッグ&ドロップ
f:id:m_mitsurupj:20180917175508p:plain

6. 自分の共有プロジェクトの中を見る
f:id:m_mitsurupj:20180917175635p:plain

7. バックパックからスプライトにドラッグ&ドロップ
f:id:m_mitsurupj:20180917175713p:plain

8. e_masakunの共有プロジェクトの中を見る
f:id:m_mitsurupj:20180917175835p:plain

9. ステージそのものをバックパックに入れることはできないので、ステージのスクリプトバックパックにドラッグ&ドロップ ※背景も同様
f:id:m_mitsurupj:20180917175907p:plain

10. 自分の共有プロジェクトに戻り、バックパックからステージのスクリプトと背景をドラッグ&ドロップ
f:id:m_mitsurupj:20180917180052p:plain

11. ボウルの追加開発
f:id:m_mitsurupj:20180917180201p:plain

12. リンゴの追加開発
f:id:m_mitsurupj:20180917180245p:plain

こんな感じで。
今回は1人で複数アカウントを使用していますが、実際にはどのようにして役割分担やマージしていくかが重要と感じました。

Pythonで日本標準時を取得・表示する

※細かいことは考慮していません。

# モジュール読み込み
import requests
import json
from datetime import datetime
from time import ctime

# NICTの日本標準時をJSONで取得
response = requests.get("http://ntp-b1.nict.go.jp/cgi-bin/json")
response.encoding = response.apparent_encoding
response_text = response.text

# JSONから日本標準時を取得し、日付に変換
response_json = json.loads(response_text)
st = response_json["st"]
st_ctime = ctime(st)
st_datetime = datetime.strptime(st_ctime, "%a %b %d %H:%M:%S %Y")

# 表示
print(st_datetime)

実行結果

2018-09-01 21:43:55

NICTからは下記形式のJSONが返却されます。

{
 "id": "ntp-b1.nict.go.jp",
 "it": 0.000,
 "st": 1535805835.215,
 "leap": 36,
 "next": 1483228800,
 "step": 1
}

また、ctimeの結果をprintすると下記のようになります。

Sat Sep  1 21:43:55 2018

ふるさと納税における各自治体の対応

ふるさと納税でワンストップ特例申請を出した後に、確定申告に変更しようと思い、各自治体へ問い合わせしたところ、対応がマチマチだったため纏めておく。 

 

高知県安芸郡田野町

・氏名を確認される

・伝えたら、◯月に寄付された◯◯市に在住の方ですね?と確認される

・手続き不要との回答

・ワンストップ特例申請は取消しておくとのこと

 

大阪府泉佐野
・氏名などは確認されない

・手続き不要との回答

 

岩手県北上市
・氏名、住所を確認される

・手続き不要との回答

 

高知県安芸郡田野町の対応マズくないですか?

氏名が分かれば住所を特定されてしまいますよ・・・。