[Scala,ScalaTest]テスト実行内でテスト名を使う

ScalaTestでテストケースの中で、テストの名称を使う。

多用はしないだろうが、テストツール内でログを自力でレポート形式に荒加工する場合などに使えるかも。

SampleSpec.scala

class SampleSpec extends FreeSpec {
 "第一テスト" - {
  "第一項" in {
    val a = 1+1
    println(s"エビデンス:$a")
    assert(a == 2)
  }
 }
}

import org.scalatest.{FreeSpec, fixture}

class SampleSpec extends fixture.FreeSpec with fixture.TestDataFixture {
 "第一テスト" - {
  "第一項" in { td => {
      println(s"テスト「${td.scopes.mkString("/")}/${td.text}」)
      val a = 1+1
      println(s"エビデンス:$a")
      assert(a == 2)
     }
  }
 }
}

IntelliJでのnodejs-expressのdockerリモートデバッグ設定

開発環境前提(セキュリティ関係はなし状態),サーバー側は docker-composeとnodemonで実行

サーバー側のdocker-compose.yml内の nodemon 行にinspect項を追加。port 9229を通す

app:
・・・
  ports:
    - "0.0.0.0:9000:9000"
    - "0.0.0.0:9229:9229"
  command: sh -c "・・・ nodemon --inspect=0.0.0.0:9229 ・・・"

ローカルのIntelliJ側は Run/Debug Configuration で Attach to Node.js/Chrome を選んでデバッグ実行

つながらないときは サーバー側に
Debugger listening on ws://0.0.0.0:9229/b4f8874b-e433-429c-8e61-1xxxxx などのログが出ているので websocket がつながるか別のツールで確認する(wscatなど)

何も考えずにJoda-Time (Java, Scala)

sdt.

libraryDependencies += "joda-time" % "joda-time" % "2.9.9"

meven

<dependency>
  <groupId>joda-time</groupId>
  <artifactId>joda-time</artifactId>
  <version>2.9.9</version>
</dependency>

今または指定日時

val date = DateTime.now()
val date = new Date(2001,1,1,12,30,0)

足す、引く

val date = date.plusDays(1)
val date = date.minusYear(1)

書く

val str = date.toString()
val str = date.toString("yyyy/MM/dd HH:mm:ss")
//エスケープは ' で囲む 
val str = date.toString("yyyy-MM-dd'T'HH:mm:ss")
val date = DateTime.parse(str,DateTimeFormat.forPattern("yyyyMMdd"))

android の java.lang.VerifyError は悩ましい

先週やってた作業の中で突然androidアプリでjava.lang.VerifyErrorが出始めたケースがあった。結果から言うと根本原因はわからんかった。

解決方法としてはコールバック処理の一部のソースをリファクタリングしてメソッドとして外に移動 (Extract Method) させたら現象が消えたというていたらく。。。

何か作法としてあまりよくない書き方をしてたんだろうなとは思いつつも問題は解決せねばならぬ。

show must go on なのだ。。。

PowerShell で UWP系アプリ(Microsoft Storeで売ってるアプリ)をコマンドラインで起動する

  1. powershellウィンドウを立ち上げて、Get-AppxPackage を入力する
Get-AppxPackage
  1. リストされたアプリ情報一覧の中で起動させたいアプリを探して、その項の PackageFamilyName 名をコピーする
  2. powershellウィンドウで以下の書式でコマンドを叩く
start shell:AppsFolder:パッケージファミリ名!App

もうちょいわかりやすい方法はないのかね。

Docker Toolbox for Windows は基本Cドライブ内しかディスク共有できない

今時 Docker Toolbox for Windows を使っているだとかいう突っ込みはなしで。。。

Docker Toolbox for Windowsではプロジェクトは Cドライブ(できればCドライブの文書フォルダ内) に置いたほうがよい。

いろいろ技術的な制約(VirtualBoxの共有設定とか)のため、 ディスク共有を別ドライブに置くことが難しい。出来ない訳ではない。実際にVirtualBoxレベルの設定をぐちゃぐちゃいじってDドライブとかに設定は出来た。ただ全然本道ではないところに時間を食うので避けたほうがよい。実際昔ごちゃごちゃやってそれが出来たというところまで覚えていた状態で、再び似た環境を作ることになって、またごちゃごちゃを思い返していらない時間を使った。。。

できれば
Macを使う→Unix系なのでシェル差異やファイルシステム差異などを気にしなくてよい→自分は宗教上Macは避けている。
Docker for Windowsを使う→Hyper-Vベースなのでうまくいくのかも?→何でも屋をやっていると VirtualBox,VMwareなどをもろもろ使うのでHyper-Vが入れられない。
Linuxを使う→どうしてもOffice系ドキュメントを欲しがるお客がいる&デスクトップ系の小賢いツールを使いたいときがある。

WindowsのCドライブは肥大して訳がわからなくなるので極力別ドライブに入れたい(アプリや文書データ等)という管理をしていると表題の問題に当たっちゃう訳で。。。

Windowsをそろそろ離れたいというところもあるのだけどなぁ(私的利用では中古ノートをChromeBook化したもので困らなかったところはある)

[android] androidxにプロジェクト移行したら、OssLicensesMenuActivity でエラー

調べたけどなかなかぴったり説明が出なかったので。

targetSdkVersion 27 を 28 にしてねwariningがよく出るようになってきたので 28にアップしたら、androidxにしなきゃダメみたいなメッセージが出てきたので、ライブラリの依存性をごりごり修正してたら、OSSライセンス一覧生成画面のところで以下のエラー

java.lang.IncompatibleClassChangeError: Class 'com.google.android.gms.oss.licenses.OssLicensesMenuActivity' does not implement interface 'androidx.lifecycle.LifecycleOwner' in call to 'androidx.lifecycle.Lifecycle androidx.lifecycle.LifecycleOwner.getLifecycle()' (declaration of 'androidx.lifecycle.LiveData' appears in ・・・

解決方法 以下をgradleに追加

implementation "androidx.appcompat:appcompat:1.1.0-rc01"

何も考えずにGlideを使う(Android)

取り急ぎ細部は考えずにRESTからのURLで画像を表示する。

public class ListRecycleViewAdapter extends RecyclerView.Adapter<ListViewHolder> {

    private List<InfoRowData> list;
    private Context context;


    public ListRecycleViewAdapter(Context context, List<InfoRowData> list) {
        this.context = context;
        this.list = list;
    }

    @NonNull
    @Override
    public ListViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_row, parent, false);
        return new ListViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final ListViewHolder holder, final int position) {
        //  非同期取得
        if (list.get(position).getLogoUri() != null) {
            String url = list.get(position).getLogoUri();
            Glide.with(context)
                    .load(url)
                    .placeholder(R.drawable.ic_default_icon)
                    .into(holder.LogoIcon);
        } else {
            Glide.with(context)
                    .load(R.drawable.ic_default_icon)
                    .placeholder(R.drawable.ic_default_icon)
                    .into(holder.LogoIcon);
        }
    }
}
public class DetailsFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_details, container, false);

        ImageView iconView = view.findViewById(R.id.logoIcon);
        //  非同期取得
        if (data.getLogoUrl() != null) {
            String url = data.getLogoUrl();
            Glide.with(getContext())
                    .load(url)
                    .placeholder(R.drawable.ic_default_icon)
                    .into(iconView);
        } else {
            Glide.with(getContext())
                    .load(R.drawable.ic_default_icon)
                    .placeholder(R.drawable.ic_default_icon)
                    .into(iconView);
        }

    }
}

案件固有名詞をわざわざ除去するのは面倒だな。そういうツールも作るべきかね。

https://github.com/bumptech/glide/wiki

https://bumptech.github.io/glide/doc/getting-started.html