or1ko's diary

日々を書きます

Jelly Proの思い出をつらつら

https://pc.watch.impress.co.jp/docs/column/ebook/1321127.html

Jelly 2の記事を見たので、昔、その一つ前のJelly Proを
メインで使ってい時代のことを思い出したのつらつら記載。

Jelly Proは、最初にkick startで見つけ、そこで購入した。
とにかく重いスマホを持ち歩くのが嫌でひび軽量なものを探していた。
当時、何度探してもSonyのかなり前のものが小型のモデルがあるくらいで、
期待するほど小さいスマホはなかった。

シンガポールからの船便で1月くらいかけて届いた。
当初は技適に通ってなかったが、その後通った。

バッテリーはなにもしてなくても1日もつかもたないかだった。
画面は小さくて、慣れても字を打ち間違えることがある。
特に真ん中の下フリック(たしか「ん」)が基本できないので、
そこは何度も押すことで対応していた。
外に出たときにブラウジングをどうしてもしたいときにしか
打ち込まないことにしていたのであまり頻度はなかったが。
基本的に外に出たときはスマホは使わないようにしていた。
ただ、「Google Map」は使いたくなることがあったが、
画面が小さすぎて地図を読み取るのがだいぶ困難だった。
旅行とかの場合は、別途タブレットやノートPCを持っていたので、
Jelly Proをテザリングして使っていた。

ジョギングのお供には随分役になった。
Pokemon Goを起動させながらジョギングしていが、
大体1時間くらいで電池が無くなる感じだった。
ジョギングに持ち運ぶには小さくて軽くてよかった。
音楽プレイヤーとしても軽量なのは良い。

書き起こしてみるとなにが良かったのだろうかという感じだが、
だいぶ気に入っていたこともあり、1台紛失したあとに、
もう1台買って使い続けた。

ただ、やはり小さすぎた。
その後、Rakuten Miniがあらわれたので、
そちらに移動して今は満足している。
Jelly Proのおかげか、Rakuten miniの画面サイズに文句を感じたことがない。
ブラウジングも「Google Map」も満足している。

記事をみたら、「Jelly 2」に切り替えたくもなったが、
2万円強するならば、Rakuten Miniから切り替えようとは思わない。
安くても切り替えようと思えないので、今はRakuten Miniがよい。

Rakuten Miniは、バッテリー増やしてほしいこととと、
利用しない楽天のアプリやGoogleのアプリをアンイストールさせてほしい。
専用のランチャーがそれほどアプリを置きやすくないので、
不要なランチャーを削除できるようにしてほしい。
とは思うけど、Rakuten Miniが気に入っている。

ファイアウォールの送信の規則をすべて無効化する方法

管理者でPowerShellのコンソールを起動し、下記を実行する。
ファイアウォール設定は、エクスポートしておいてからやる。

Get-NetFirewallRule -Direction Outbound | ? { $_.Enabled -eq $True } | % { Set-NetFirewallRule -Enabled False -Name $_.Name }

一つの規則を無効化するのにそこそこ時間がかかるため、
有効な規則のみでフィルタしている。

別途、ファイアウォールの送信規則の規定をブロックにすることで、
自端末からのすべての通信をブロックすることができると思われる。

ブラウザがどのポートを使うかしらべたくて試した。
TCP 443とUDP53を許可すればyoutubegoogleなどは利用できたが、
この記事を書こうと試したら、TCP 80の追加も必要だった。
UDP53は、名前解決に利用しているのだろうから、IPアドレスでのアクセスなら不要だと思われる。

クラス名とメソッド名を出力するカスタムDoclet

クラス名やそのメソッド一覧が取得したくてJavadocのカスタムDocletを思い出して、使ってみたが、以外と目的にたどり着けなかったため、記録を残す。

JDK 9 からカスタムDocletの作成方法が変更されたようだ。
Using the new Doclet API

SampleDoclet.java
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Set;

import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.tools.Diagnostic.Kind;

import jdk.javadoc.doclet.Doclet;
import jdk.javadoc.doclet.DocletEnvironment;
import jdk.javadoc.doclet.Reporter;

public class SampleDoclet implements Doclet {
  private Reporter rep;

  @Override
  public void init(Locale locale, Reporter reporter) {
    this.rep = reporter;
  }

  @Override
  public String getName() {
    // Docletの名前
    return "sampleDoclet";
  }

  @Override
  public Set<? extends Option> getSupportedOptions() {
    // このDoclet用の引数を定義する
    return Collections.emptySet();
  }

  @Override
  public SourceVersion getSupportedSourceVersion() {
    // サポートするソースコードのバージョン
    return SourceVersion.latest();
  }

  @Override
  public boolean run(DocletEnvironment docEnv) {

    Set<? extends Element> includedElements = docEnv.getIncludedElements();
    for (Element element : includedElements) {
      if (element.getKind() == ElementKind.CLASS) {
        rep.print(Kind.NOTE, "クラス名 -> " + element.getSimpleName().toString());
        List<? extends Element> members = element.getEnclosedElements();
        for (Element member : members) {
          if (member.getKind() == ElementKind.METHOD) {
            rep.print(Kind.NOTE, "メソッド名 -> " + member.toString());
          }
        }
      }
    }
    return true;
  }
}
実行結果
> javac SampleDoclet.java -encoding utf8
> javadoc SampleDoclet.java -sourcepath . -doclet SampleDoclet -docletpath . -encoding utf-8
ソース・ファイルSampleDoclet.javaを読み込んでいます...
Javadoc情報を構築しています...
クラス名 -> SampleDoclet
メソッド名 -> init(java.util.Locale,jdk.javadoc.doclet.Reporter)
メソッド名 -> getName()
メソッド名 -> getSupportedOptions()
メソッド名 -> getSupportedSourceVersion()
メソッド名 -> run(jdk.javadoc.doclet.DocletEnvironment)

すべてのプロパティが$nullのPSCustomObjectの判定

$null -eq ($target.psobject.Propeties.Value |
Where-Object { $_ -ne $null} |
Select-Object -First 1})

PSCustomObjectにpsobjectというプロパティがあることを知った。

PSCustomObjectの比較

プロパティ名が同じでも -eq で比較するとFalseになる。
プロパティだけ取り出して、Compare-Objectで比較する。

$a = [PSCustomObject]@{ a = "a" }
$b = [PSCustomObject]@{ a = "a" }
$c = [PSCustomObject]@{ a = "c" }

$np = $a | Get-Member -Type NoteProperty | ForEach-Object { $_.Name }
(Compare-Object -Property $np $a $b).Count -eq 0

# 等しくない例。Falseになる。
(Compare-Object -Property $np $a $c).Count -eq 0

# Equalsおよび-eqでの比較はFalseになる
$a.Equals($b)
$a -eq $b

もう少し簡単な方法ないだろうか

Thunderbirdのメールデータを取得する方法

Import-Module -Name PSSQLite

$database = "C:\Users\<ユーザ名>\AppData\Roaming\Thunderbird\Profiles\<ランダムな文字列>.default\global-messages-db.sqlite"

# 全件取得したい場合はlimit 1を削除する
$query = "select * from messages INNER JOIN messagesText_content ON messages.id = messagesText_content.docid limit 1"

Invoke-SqliteQuery -Query $query -DataSource $database

参考にしたページ
Thunderbirdからメールメッセージを取得するSQLクエリー
Querying Thunderbird's SQLite message database from C# - Stack Overflow

SQLite にアクセスするためのPowerShellのモジュール
PowerShell Gallery | PSSQLite 1.0.3

3秒間ごとにコピーするスクリプト

指定したフォルダ($src)から指定したフォルダ($dest)にコピーするスクリプト
ただし、ファイルやフォルダを一つコピーするたびに3秒待つ。
また、フォルダの更新日付はコピーした日付となる。

$src = "<コピー元のフォルダパス>"
$dest = "<コピー先のフォルダパス>"
$waitSeconds = 3 # 待ち時間(秒)

Get-ChildItem $src -Recurse |
ForEach-Object {
    $isDir = $_.GetType().ToString().Contains("DirectoryInfo")
    $file = $dest + $_.FullName.Substring($src.Length)
    Write-Host "check $file"
    $exists = Test-Path -LiteralPath $file
    if (-not $exists) {
        if ($isDir) {
            Write-Host "make directory -> $file"
            New-Item -Path $file -ItemType Directory
        } else {
            Write-Host "copy file -> $file"
            Copy-Item -Path $_.FullName -Destination $file
        }
        Write-Host "wait $waitSeconds seconds"
        Start-Sleep -Seconds $waitSeconds
    }
}