何も考えずに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 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

朝一起動

# 朝一起動
function runIfNot($name,$cmd,$ag=$null)   {
    if((Get-Process -Name $name -ErrorAction SilentlyContinue) -eq $null)  {
        if($ag -eq $null)	{
            start-process $cmd
        } else {
            start-process $cmd -ArgumentList $ag
        }
    }
}
function jobIfNot($name,$cmd)   {
    if((Get-Process -Name $name -ErrorAction SilentlyContinue) -eq $null)  {
        Start-Job -ScriptBlock {start-process $using:cmd}
    }
}
runIfNot "chrome" "chrome.exe"
runIfNot "firefox" "firefox.exe" "http://radiko.jp/#!/live/FMFUKUOKA"
runIfNot "onenoteim" "onenote-cmd:"
#runIfNot "ONENOTE" "ONENOTE.EXE"
runIfNot "thunderbird" "thunderbird.exe"
jobIfNot "slack" "slack:"
powershell -File "暗号ドライブ起動.ps1"
Start-Sleep -s 30
powershell -File "devウィンドウ整列.ps1"
Start-Sleep -s 60
powershell -File "devメールバックアップ.ps1"

少し前に勉強がてらに朝定型的に起動させるアプリ類の起動バッチをPowerShellで書いた。こういう小さいところでも思考の判断量を減らすと、気力の維持に役立つというのが最近しみじみ思う。

若い頃は全然大丈夫だったことなので、老いてきているのを痛感するとともに、今のうちにゴリゴリ生活効率化をしておかないと次の半世紀の生活をキープするのが厳しい予感がある。

IntelliJ IDEAのキーボードショートカット一覧の機械翻訳

最近IntelliJ IDEAやAndroid Studioを使うことが多く、ショートカットに少し慣れてきたところなのだが、C:\Program Files\JetBrains\IntelliJ IDEA XXX\help (Windows版)にあるReferenceCard.pdfをざっくりGoogle translateに通したので誰か欲しい人もいるだろうから置いておきます。

Editing 編集
Ctrl + Space 基本コード補完(任意のクラス、メソッド、または変数の名前)
Ctrl + Shift + Space スマートコード補完(予想されるタイプでメソッドと変数のリストをフィルタリング)
Ctrl + Shift + Enter 完全なステートメント
Ctrl + P パラメータ情報(メソッド呼び出し引数内)Ctrl + Qクイックドキュメント検索
Shift + F1 外部文書
Ctrl + mouse over code 簡単な情報
Ctrl + F1 キャレットでエラーや警告の説明を表示する
Alt + Insert コードを生成…(Getters、Setters、Constructors、hashCode / equals、toString)
Ctrl + O メソッドをオーバーライドする
Ctrl + I メソッドを実装する
Ctrl + Alt + T …で囲む(if..else、try..catch、for、synchronizedなど)
Ctrl + / 行コメントによるコメント/コメント解除
Ctrl + Shift + / ブロックコメントでコメント/コメント解除
Ctrl + W 連続して増加するコードブロックを選択
Ctrl + Shift + W 現在の選択を前の状態に減らします
Alt + Q コンテキスト情報
Alt + Enter Show 意図的なアクションとクイックフィックス
Ctrl + Alt + L 再フォーマットコード
Ctrl + Alt + O インポートを最適化する
Ctrl + Alt + I 自動インデント行
Tab / Shift + Tab 選択行をインデント/未インデント
Ctrl + X , Shift + Delete 現在の行または選択したブロックをクリップボードに切り取ります
Ctrl + C , Ctrl + Insert 現在の行または選択したブロックをクリップボードにコピーする
Ctrl + V , Shift + Insert クリップボードから貼り付ける
Ctrl + Shift + V 最近のバッファから貼り付ける…
Ctrl + D 現在行または選択したブロックを複製する
Ctrl + Y キャレットの行を削除
Ctrl + Shift + J スマートライン参加
Ctrl + Enter スマートライン分割
Shift + Enter 改行する
Ctrl + Shift + U キャレットまたは選択したブロックの単語の大文字と小文字を切り替える
Ctrl + Shift + ]/[ コードブロックの終了/開始までを選択
Ctrl + Delete/Backspace 単語末尾まで削除
Ctrl + NumPad+/- コードブロックの展開/折りたたみ
Ctrl + Shift + NumPad+ すべて展開
Ctrl + Shift + NumPad- すべて折りたたむ
Ctrl + F4 アクティブなエディタタブを閉じる
Usage Search 利用検索
Alt + F7/Ctrl + F7 使用法の検索/ファイル内の使用法の検索
Ctrl + Shift + F7 ファイル内の使用法を強調表示する
Ctrl + Alt + F7 使い方を表示する

Navigation ナビゲーション

Ctrl + N 授業に行く
Ctrl + Shift + N ファイルへ
Ctrl + Alt + Shift + N シンボルへ
Alt + Right/Left 次/前のエディタタブに進む
F12 前のツールウィンドウに戻る
Esc (ツールウィンドウから)エディタに移動します
Shift + Esc アクティブウィンドウまたは最後のアクティブウィンドウを隠す
Ctrl + Shift + F4 アクティブな実行を閉じる/メッセージ/検索/ …タブ
Ctrl + G 行に移動
Ctrl + E 最近のファイルのポップアップ
Ctrl + Alt + Left/Right 前後に移動する
Ctrl + Shift + Backspace 最後の編集場所に移動します
Alt + F1 任意のビューで現在のファイルまたはシンボルを選択します
Ctrl + B , Ctrl + Click 宣言へ
Ctrl + Alt + B 実装に進む
Ctrl + Shift + I クイック定義ルックアップを開く
Ctrl + Shift + B 型宣言に行く
Ctrl + U スーパーメソッド/スーパークラスへ
Alt + Up/Down 前の/次の方法に進む
Ctrl + ]/[ コードブロックの末尾に移動
Ctrl + F12 ファイル構造ポップアップ
Ctrl + H 型の階層
Ctrl + Shift + H メソッド階層
Ctrl + Alt + H 呼び出し階層
F2 / Shift + F2 次/前の強調表示エラー
F4 / Ctrl + Enter ソースを編集/ソースを表示
Alt + Home ナビゲーションバーを表示
F11 ブックマークを切り替える
Ctrl + F11 ブックマークをニーモニックで切り替える
Ctrl + #[0-9] 番号付きブックマークに移動する
Shift + F11 ブックマークを表示
Search/Replace 検索/置換
Double Shift どこでも検索
Ctrl + F 見つける
F3 / Shift + F3 次を検索/前を検索
Ctrl + R 交換する
Ctrl + Shift + F パスで探す
Ctrl + Shift + R パスに置き換える
Ctrl + Shift + S 構造的に検索する(Ultimate Editionのみ)
Ctrl + Shift + M 構造的に交換する(Ultimate Editionのみ)

Live Templates ライブテンプレート

Ctrl + Alt + J ライブテンプレートで囲む
Ctrl + J ライブテンプレートを挿入
iter Java SDK 1.5スタイルに従った繰り返し
inst instanceofでオブジェクトタイプを確認し、それをダウンキャストします。
itco java.util.Collectionの要素を繰り返します
itit java.util.Iteratorの要素を繰り返します
itli java.util.Listの要素を繰り返します
psf パブリックスタティックファイナル
thr 新しく投げる

Refactoring リファクタリング

F5 コピーする
F6 移動する
Alt + Delete 安全な削除
Shift + F6 リネーム
Ctrl + F6 署名を変更
Ctrl + Alt + N 列をなして
Ctrl + Alt + M 抽出方法
Ctrl + Alt + V 変数を抽出する
Ctrl + Alt + F 抽出フィールド
Ctrl + Alt + C 定数を抽出する
Ctrl + Alt + P 抽出パラメータ

Debugging デバッグ

F8/F7 ステップオーバー/ステップイン
Shift + F7 / Shift + F8 スマートステップイン/ステップアウト
Alt + F9 カーソル位置まで実行
Alt + F8 式を評価する
F9 プログラムを再開
Ctrl + F8 ブレークポイントを切り替える
Ctrl + Shift + F8 ブレークポイントを表示する

Compile and Run コンパイルして実行する

Ctrl + F9 プロジェクトを作成します(修正および依存コンパイル)。
Ctrl + Shift + F9 選択したファイル、パッケージ、またはモジュールをコンパイルする
Alt + Shift + F10/F9 設定を選択して実行および/またはデバッグ
Shift + F10/F9 実行/デバッグ
Ctrl + Shift + F10 エディタからコンテキスト設定を実行する

VCS/Local History VCS /地域の歴史

Ctrl + K / Ctrl + T プロジェクトをVCSにコミット/ VCSからのアップデート
Alt + Shift + C 最近の変更を見る
Alt + BackQuote (`) 「VCS」クイックポップアップ

General 全般

Alt + #[0-9] 対応するツールウィンドウを開く
Ctrl + S すべてを救う
Ctrl + Alt + Y 同期する
Ctrl + Shift + F12 最大化エディタの切り替え
Alt + Shift + F お気に入りに追加
Alt + Shift + I 現在のプロファイルで現在のファイルを調べる
Ctrl + BackQuote (`) クイックスイッチ電流方式
Ctrl + Alt + S 設定ダイアログを開く
Ctrl + Alt + Shift + S プロジェクト構造ダイアログを開く
Ctrl + Shift + A アクションを探す
Ctrl + Tab タブとツールウィンドウを切り替える
jetbrains.com/idea blog.jetbrains.com/idea @intellijidea

同時、遅延、共時性

同時(または少し汎化して、事象Aのn時間後に事象Bが起きること)が重要な含意を含むという視点は、主観/自我の仕組みの主たる構成要素である。

同時というのは、同じように動く2物体を一つの視覚でまとめて見ると、網膜上で類似位置を空間的にノードで接続できるので、AIにも人間にも認識しやすい。

同時のパルスは、他者から見ると単なるパルス以上の情報量を持たない。しかし主観にとっては、自己の仕組みから出るパルスと「同時」に起きる外界のパルスは重要な意味を含む。

そして「同時」をルールとしたノード結合の強化はニューロ網の基本的な学習ルールである。

共時性というオカルトのような話が、人から発案されたのは偶然ではなく「同時」がニューロの認識できる基本単位であるからであり、あと「遅延」を認識できる機構(つまりニューロ網の個々に時計のメカニズムを持たせる)ことで「繰り返し」を処理できるようになる。

「繰り返し」は「歌」であり、「近い未来の予測」である。

それを構造的に組み合わせれば「少し遠い未来の予測」になる。

その「少し遠い未来の予測」を他者に説明可能にするためには「主観/自我」の要素を除去し「その個人との同時性」をなくすことで、「文章/書籍」などの静的コンテンツに記述がしやすい形にする必要がある。それが「論理/物理」である。

AIを人に近づけたいのなら、「同時」および「遅延した同時(Aのn時間後のB)」をニューロで処理しやすい形で組み込めばよい。

AIに「同時」を処理出来るようにすれば、おそらく「共感」(AI間の同時パルスによる含意の伝達)も出来るようになるし、それは人にも「共感」に見える行動になる。