IntelliJ IDEA を使っていて、新しめの JDK を使ってて Kotlin のコードで

jdk Cannot access class 'java.lang.reflect.Type'. Check your module classpath for missing or conflicting dependencies

こんなエラーが出ることがあるじゃろ? <del>それをこうしてこうじゃ AA 略</del>

それ、プロジェクト SDK がセットされてないかも。

ctrl + shift + alt + s を押してプロジェクト SDK をセットしてみると解消するアル!! (キャラ崩壊)

(Project Structure > Project Settings > Project > SDK

固体データという呼称を提案します

気が付くと、ゲーム系業界に戻ってきて10年以上かな?

割と前から思ってた事がある。

いわゆるマスターデータと呼ばれてるもの、他の業界だとちょっと違うのかもしれないけれどスマホゲーとかのマスターデータというのは割とその他の流動的なデータとははっきりと分かれてて、最近は DB に入れないケースも多い

(他のユーザーデータ等がまともに検索できる形式だった頃は、マスターデータとリレイションあると検索のクエリーとか書きやすいとかもあったのだけど、もうシャーディングだのなんだので調査のために生のクエリー投げるとかも簡単ではない時代なわけで、そうなるともうマスターは DB には入ってなくていい)

で、なおかつ結構な会社でこれを (コンピューターでのデータ処理の専門家ではない) プランナーさん達が形式まで決めるようなところが多かったりする。

そういうわけで、「彼らの決めた形式」をそのまま扱うのはちょっとどうなの?構造ごと変形する処理を一発かました方がいいんじゃないの?と思ってる。

で、「マスターデータ」という呼び名はもう普及しまくっちゃってるのでプランナーさんとか運用者さんたちにあげちゃって、変形後のデータは別の名前で呼んで区別したい。

 

そこで固体データ (solid data) という呼称はどうだろう?

関連のある用語付けとして、システムの稼働でリアルタイムで変わっていくデータは液体データ (liquid data)、NoSQL 系の中の特に永続化を主目的にしてないようなデータは気体データ (gaseous data) でどうですかお客さん?

 

Windows の MSI インストーラーの中身の展開

 

今の現場、Windows の管理者権限がなくてパスすら通せないというエンジニアの仕事理解してんのかって環境なのです

(ただここの社長エンジニア出身ぽい空気がするので、純粋に他人を信じられないタイプなんだなと思う)。

 

それはいいとして、インストールするソフトについては特に管理されてないので常識の範囲で必要なソフトは入れたいわけで、MSI 形式を展開したいと思った。やり方はちゃんとあった。

> msiexec /a to-extract.msi targetdir="C:\this\should-be\a\full-path" /qn

参考: https://atmarkit.itmedia.co.jp/ait/articles/0703/02/news130.html

 

targetdir はフルパスである必要があるそうです。

あと単純に中身を取り出しただけで使えるとは限らない (まあ普通いけるやろ) です。

MySQL Workbench は普通にいけた。

最近、インストールするディレクトリをカスタマイズもできずに、ホームディレクトリ内の意味不明な手の届かない場所に勝手にインストールされちゃうものも多いから、むしろ管理者権限あっても中身だけ取り出せるなら取り出したいかもと思いました、まる。

 

python のソート関数が key を要求してくる件について

今の仕事でメインに使ってる言語は Kotlin なのだけど、Excel のワークブックからデータを読み取ってくるような用途には python が使われてる。
そこで python でソートしたかったのだけど、組み込みの sorted() 関数の引数が key となっていて、「これだな」と思った cmp は deprecated だった。

同じ状況の人へのサクッとした解決策としては key に functools.cmp_to_key(your_cmp_func) のような感じで指定すればおk

 

import functools

def compare_as_see_fit(lhs, rhs):
    if lhs > rhs:
        return 1
    elif lhs < rhs:
        return -1
    return 0

print(sorted([65535, 7, 255, 7, 31], key=functools.cmp_to_key(compare_as_see_fit)))

 

もうこれだけで it works! なのだけど、この functools.cmp_to_key() クンが何をどうしてくれてるのかイメージできなかった。

ほな、ソースみよか?

 

# Copyright (C) 2006-2013 Python Software Foundation.

def cmp_to_key(mycmp):
    """Convert a cmp= function into a key= function"""
    class K(object):
        __slots__ = ['obj']
        def __init__(self, obj):
            self.obj = obj
        def __lt__(self, other):
            return mycmp(self.obj, other.obj) < 0
        def __gt__(self, other):
            return mycmp(self.obj, other.obj) > 0
        def __eq__(self, other):
            return mycmp(self.obj, other.obj) == 0
        def __le__(self, other):
            return mycmp(self.obj, other.obj) <= 0
        def __ge__(self, other):
            return mycmp(self.obj, other.obj) >= 0
        __hash__ = None
    return K

 

あ、あ、そういう事ね!!

自分が勝手に「絶対値に変換してからソート関数に渡せ」って意味に勘違いしてただけで、比較可能ならそれでいいのね!!
そもそも key っていう引数の意味自体を勘違いしてたわ。
要素の絶対値を求める関数だと思ってた!!
型を明示しない言語だとそういう部分を正確に読み取るの難しいよね。

 

膿汁出る

このブログ(もともとは日記)のタイトルを見ればわかるように、私は C++ プラグラマーであった。

 

過去形である。

要するにおじさんは classic C++ プログラマーだったのである。

 

この10年ほど、C++ が激変していた事は知っていたが、もう使ってなかったし、まるで子供時代の情景かのように、今更戻るところでも、戻れるところでもないかのように感じていた。

 

ただ、なんとなく悔しかった。

最も熱狂したプログラミング言語で、最も好きなプログラミング言語だとも言いたかった。

しかし最近あまりにも C++ は変わりすぎていて、それが言いづらい雰囲気になっていた。

 

というわけで、なんとなく modern な C++ に再入門してみようと思う。

はっきり言ってガベコレのある言語に慣れ過ぎたし、今の C++ を見る限り取りこぼしをキャッチアップするという気持ちでは絶対ダメだ。

これは再入門だと捉えている。

 

そして Effective Modern C++ を読み始めた。

最初の数ページで最早何言ってるのか全然わからない。

ただ、膿汁が溢れ出る懐かしい感じが濃厚にした。

多分、世の中の C++ 好きという人種はこういう変態なのだろう。

 

この感覚は論理的ではない。

ただ、論理を軽々と超えてくる本能なのだ。

C++ は間違いなく、今も昔も変態専用言語である。

 

 

ただ当時も思ってたけど今は余計に、これ原著ないと何書いてあるのかさっぱりわかんねえな。

ムーブ演算可能とか書かれても able to move operation なのか、move operable なのか can move operation なのかそれ以外の何かなのか推測不可能だよ。

そもそも俺は仮引数と実引数って言われると parameter なのか argument なのか混乱するんだよw

大和言葉と漢字と英語の三つを併せて覚えないといけないっていう日本人プログラマーは、もうその時点で一定レベル変態なのに、日本人 C++ 使いとか、ど変態じゃないとやってられないと思うw

bash の prompt を変える

変数に指定する時点で一度バックスラッシュが解釈されるからややこしい

メモしておく。


# MSYS2 default
PS1="\\[\\e]0;\\w\\a\\]\\n\\[\\e[32m\\]\\u@\\h \\[\\e[35m\\]$MSYSTEM\\[\\e[0m\\] \\[\\e[33m\\]\\w\[\\e[0m\\]\\n\\$ "

# Ubuntu default
PS1="\\[\\e]0;\\u@\\h: \\w\\a\\]${debian_chroot:+($debian_chroot)}\\[\\033[01;32m\\]\\u@\\h\\[\\033[00m\\]:\\[\\033[01;34m\\]\\w\\[\\033[00m\\]\\$"

# 色を変える
# \\[\\e[1;30m\\]
# 戻す
# \\[\\e[m\\]

# my MSYS
export PS1="\\[\\e[1;32m\\]\\u@\\h\\[\\e[m\\] \\[\\e[1;35m\\]MSYS \\[\\e[1;37m\\]\\t \\[\\e[1;33m\\]\\w \\n\\[\\e[1;30m\\]\\$ \\[\\e[m\\]"

# my WSL2
export PS1="\\[\\e[1;32m\\]\\u@\\h\\[\\e[m\\] \\[\\e[1;35m\\]WSL2 \\[\\e[1;37m\\]\\t \\[\\e[1;34m\\]\\w \\n\\[\\e[1;30m\\]\\$ \\[\\e[m\\]"