何も考えずに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間の同時パルスによる含意の伝達)も出来るようになるし、それは人にも「共感」に見える行動になる。

jQuery Datatablesにひらがなカタカタ無視の絞り込みを入れる

日々見つけた細かいTipsを書き留めておくようにするのがよいだろう。

jQuery Datatablesは、とりあえずエイヤでテーブル状のデータを表示するときにあまり考え込まずにページネーションやソートなど細かい機能を手軽に入れられるJavaScriptツールだ。テーブル表示にtableタグを使うのが今風でなくなってきているが、取り急ぎ機能を入れたりモックアップを起こすときには便利である。ただ、検索絞り込みのときに、日本語でよく必要になるカタカナひらがな無視検索(絞り込み)がないので、そのあたりを拡張する案の一つを。

このあたりを参考に検索拡張部分で、比較をひらがなカタカナ統一してしまうみたいな方法が考え込まずに楽だった。

文字変換には moji.js を使ってみる感じ。

<script src="moji.js"></script>
<script>
$(document).ready(function () {
    $('#customkeyword').keyup(function () {
            $('#table').DataTable().draw();
    });

    $.fn.dataTable.ext.search.push(
            function (settings, data, dataIndex) {
                var key = moji($('#customkeyword').val().trim()).convert("HGtoKK").convert("ZEtoHE").toString().toUpperCase();
                if (key == '') {
                    return true;
                }
                for (var i = 0; i < data.length; i++) {
                    var dt = moji(data[i].trim()).convert("HGtoKK").convert("ZEtoHE").toString().toUpperCase();
                    if (dt.indexOf(key) != -1) {
                        return true;
                    }
                }
                return false;
            }
    );
});
</script>

 

あと#customkeywordのテキストボックスを作って、DataTable側の定義DOMで標準テキストボックスを消すと見栄えが少しはマシになるかも。

$('#table').DataTable({
・・・
"dom": "lrtip",
・・・
});

 

鬼トレの調子がわずかによい

いらんことでもいろいろ考え事を集中しているときが脳にはよいのだろうなー。鬼トレはたまに続けている(鬼めくりだけですが)けど最近若干ポイントが高めに出ている。まぁいいことだろう。

openAiのuniverseみたいなものはずいぶん前に欲しかったもので、一時は自作環境を作ったのだが共通基盤がないと他者に説明することが困難なのよね。

ただ、報酬のハンドリング方法は違うし、外界をVNC+ベクター画像で認識させるのではなく、すべてアローキーも含めてテキストの塊で処理させる形でしたが。キーボードエミュレートドライバとかも作ってましたが。でもそれを変な人ということでなく他人に説明可能な時代になったのはありがたい気がする。

めがみめぐりを少しやってるけどゲームと考えると厳しい気がする。音声合成とかLive 2Dとか頑張ってるのはわかるけど、現状では愛玩暇つぶしかなー。どちらかというとこれで作った技術を今後他ゲームに応用するとかにいいのではないかという気がする。

入出力遅延も学習対象

現実的なAIの外界入力を考えたときに、かならず通信路やデバイスの遅延があるわけだが、遅延はそのまま環境と自己の特性として学習する必要がある。そのときタイマー付きノード(遅延ノード)で考えると、それらを全部まとめた形で入力しても問題がないことになる。

分離できない遅延はそのまま「遅延がないもの」として学習を進めてよいし、途中のIO(皮膚触感や筋肉緊張など)の入力も織り交ぜて入力すれば、個々でのずれが発生順序の時刻のずれとして学習されていく。

どちらにしても入出力の遅延も含めて学習対象として、そのまま入力してよいわけになる。
発火の時刻の照合が教師である点はそのままでよい。
実際、デバイスとノードのエミュレータとの通信をプログラムとして書くと、イベントのプールとスタックで記述することになったので、遅延は実装の上ではかなり考慮が必要だった(時刻をイベントに記録するとか)が、学習システム側ではそれも含めて対象としてよい考えて作っていた。

出力はタイマーである

「推測結果の出力はタイマーの集まりである」という言い方は、今まで考えていた「事象の発生時刻/時刻を推測する」という考え方より、直感的で他者にわかりやすい気がする。

どこの時刻の話をしているのかが伝わらないし説明しにくかったのよね。出力結果がタイマーであるというと、出力結果が出された時刻に対して、検証とフィードバックが未来に行われ、推測の実行が現時刻で行われる というのがわかりやすい。

しかも実装も現実的に近いんじゃないだろうか。