Ubuntuのバージョンを上げた

Dec 1, 2022

テーマを変えようとしたら、何も起こらなかったので、見たらデプロイに失敗していた。
で、原因を確認したら、イメージの OS が古いせいらしい。

20.04?に上げたらうまく行った。(バージョンうろ覚え

Grab に失敗する

Dec 1, 2022
1
2
@Grab(group='org.openjfx', module='javafx-base', version='19')
import javafx.application.Application

これを実行すると以下のような表示が出る。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Caught: java.lang.NoClassDefFoundError: org/apache/ivy/util/MessageLogger
java.lang.NoClassDefFoundError: org/apache/ivy/util/MessageLogger
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:390)
    at java.base/java.lang.Class.forName(Class.java:381)
    at groovy.grape.Grape.getInstance(Grape.java:124)
    at groovy.grape.Grape$1.run(Grape.java:161)
    at groovy.grape.Grape$1.run(Grape.java:158)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:318)
    at groovy.grape.Grape.grab(Grape.java:158)
    at groovy.grape.GrabAnnotationTransformation.visit(GrabAnnotationTransformation.java:380)
    at org.codehaus.groovy.transform.ASTTransformationVisitor.lambda$addPhaseOperationsForGlobalTransforms$5(ASTTransformationVisitor.java:377)
    at org.codehaus.groovy.control.CompilationUnit$ISourceUnitOperation.doPhaseOperation(CompilationUnit.java:896)
    at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:692)
    at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:666)
    at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:373)
    at groovy.lang.GroovyClassLoader.lambda$parseClass$2(GroovyClassLoader.java:316)
    at org.codehaus.groovy.runtime.memoize.StampedCommonCache.compute(StampedCommonCache.java:163)
    at org.codehaus.groovy.runtime.memoize.StampedCommonCache.getAndPut(StampedCommonCache.java:154)
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:314)
    at groovy.lang.GroovyShell.parseClass(GroovyShell.java:572)
    at groovy.lang.GroovyShell.run(GroovyShell.java:392)
    at groovy.lang.GroovyShell.run(GroovyShell.java:382)
    at groovy.ui.GroovyMain.processOnce(GroovyMain.java:649)
    at groovy.ui.GroovyMain.run(GroovyMain.java:389)
    at groovy.ui.GroovyMain.access$1400(GroovyMain.java:67)
    at groovy.ui.GroovyMain$GroovyCommand.process(GroovyMain.java:313)
    at groovy.ui.GroovyMain.processArgs(GroovyMain.java:141)
    at groovy.ui.GroovyMain.main(GroovyMain.java:114)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    at java.base/java.lang.reflect.Method.invoke(Method.java:578)
    at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:109)
    at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:132)
Caused by: java.lang.ClassNotFoundException: org.apache.ivy.util.MessageLogger
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 31 more

全然良くわからないんだが、 Grape 機能が使えないようだ。

org.apache.ivy.util.MessageLogger クラスが見つからないらしい。 というか、 pantsbuild/ivyarchived になっとるーーw

…というのは多分関係ない。

以下のように修正しても、ダメっぽかった。

1
2
3
@Grab(group='org.apache.ivy', module='ivy', version='2.5.1')
@Grab(group='org.openjfx', module='javafx-base', version='19')
import javafx.application.Application

@Grab を使う時に ivy を使うため、 ivyMessageLogger クラスが見つからないので多分ダメなのだろう。

1
2
3
4
@Grab(group='org.apche.commons', module='commons-lang3', version='3.1')
import org.apache.commons.lang3.StringUtils

println StringUtils.join( args, ', ' )

もちろん、このコードでも同じ。

1
2
3
@GrabConfig(systemClassLoader=true)
@Grab(group='org.openjfx', module='javafx-base', version='19')
import javafx.application.Application

冒険家タマゴ・ボーロの話

Jun 6, 2021

ヴェスティア共和国の商人、タマゴ・ボーロは東の方に冒険に出て、帰還した後口述筆記で東方見聞録を書かせたが、 筆記者がそれに加えてあることないこと書いたのでファンタジーっぽくなってしまった。

うぃーくりー・あんだーわーるど・にゅーすについて

Jun 6, 2021

ブログの名前を「放浪書庫運営委員会公式ブログ」から「うぃーくりー・あんだーわーるど・にゅーす」に変更しました。
といっても、てきとーな事柄についてのメモを書き倒していくというこのブログの運営ポリシーに変化はありません。
ひらがななのは実際には闇インターネットのことや、不思議島、不思議少年、不思議アメリカ大統領、不思議 UFO や不思議宇宙人、不思議生物のことについては扱わないからです。

「うぃーくりー・あんだーわーるど・にゅーす」というのはウィークリー・ワールド・ニューズという週刊タブロイド紙を捩っています。

ということで、これからも「うぃーくりー・あんだーわーるど・にゅーす」をよろしくお願いします。

Scoop の SBCL を使用する

May 20, 2021

Scoop で SBCL をインストールしても、sbcl はコアファイルが変なところにあると思っていて探しても見つからないので、 実行できない。

変なところっていうか、インストーラーが既定のパスにしているところなので、変ではないんだけども……。

とりあえず、新しくコアファイルを $HOME/.sbcl に作成することにする。

既定のところに Scoop をインストールしていれば、以下のようなスクリプトでコアファイルを作成できるはず:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[ ! -d $HOME/.sbcl ] && mkdir -p $HOME/.sbcl 

sbcl --core /c/ProgramData/Scoop/apps/sbcl/current/sbcl.core --noinform --no-print --no-userinit <<EOF
; loading asdf and asdf-install library
;(require :asdf)
;(require :asdf-install)

; dumping image
(save-lisp-and-die
 (merge-pathnames ".sbcl/sbcl.core" (user-homedir-pathname))
 :purify t)
EOF

これでコアファイルはできたので、以下のようなハローワールド系コードを実行してみよう:

1
(write-line "Hello, World!")

だが、sbcl は C:/Program Files/sbcl/ に入っているコアファイルを見てしまう。

$ sbcl --script ./hello.lisp
fatal error encountered in SBCL pid 20796(tid 00000000001D68F0):
can't find core file at C:Program Files/sbcl/lib/sbcl//sbcl.core

なので、 --core オプションを指定して先ほど作成したコアファイルを見るようにしてみるとうまくいく。

$ sbcl --core $HOME/.sbcl/sbcl.core --script ./hello.lisp
Hello, World!

読み込むコアファイルを設定ファイルで指定できれば良いのだが……。

SBCL_HOME の指定

調べてみると、 SBCL_HOME という環境変数を指定すれば良いようだ。

上記の例で言えば、以下のようにすれば、 --core オプションの指定が不必要になる:

1
export SBCL_HOME=$HOME/.sbcl
$ sbcl --script ./hello.lisp
Hello, World!

参考

巨大海洋生物のロマンについて

May 18, 2021

NHK 教育で観た、海洋巨大生物の番組が頭にこびりついている。

もう大体忘れてしまったんだけど、海の中にはクラーケンやシーサーペント以外にも超巨大な 生物がいるんだと思わせるような内容だった。

だから、時折巨大海洋生物について調べてみているのだが、全然見つからない。

Raku で文字列を反転したい時にたぶんやること

May 17, 2021

多分こんな風にやると思うんだけど:

1
say 'begin'.reverse;                        # => (begin)

このコードは 'begin' という文字列を配列の中に突っ込んだものを返すということを行う。

というのも .reverseMu で定義されてはいるけれど、リスト用のメソッドなので、 .reverse'begin' という文字列を要素が 1 つあるリストとみなしてしまう。

となればあとは簡単で、文字列を文字ごとにバラバラにして(.split(''))反転し(.reverse)、からの結合(.join( '' ))を行えば 文字列を反転できるはずだ。

1
say 'begin'.split('').reverse.join('');     # => nigeb

で、 Str クラスにはそのものズバリのメソッド .flip が存在する:

1
say 'begin'.flip;                           # => nigeb

特に意味はないんだけど、end が対応するキーワードの反転になっている ruby っぽい言語

May 17, 2021
begin
...
ensure err
...
nigeb

PICO-8 っぽい C ライブラリ

May 17, 2021

仮にぴょこ(pyoco)と名前をつけることにする。

ぴょこはフレームワークではなくてソースコードをバッと渡されて、それをビルドするみたいな方向性で行こうと思う。 例えば gane.c に空の init()update()draw() が書いてあって、それに書き足したりするというような方法で 開発していく。

とりあえず、サンプルコード?で見た関数をそのまま宣言したのを書いておく:

1
2
3
4
/*!
 * 画面をまっさらにします。
 */
PYC_API void cls(void);
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
/*!
 * 画面の (x, y) の位置に指定された色番号 color_no のピクセルを表示します。
 *
 * \param x        表示したいピクセルの x 座標位置。
 * \param y        表示したいピクセルの y 座標位置。
 * \param color_no 表示したいピクセルの色番号。
 *
 * \return 成功したら `PYC_SUCCESS`、失敗したら多分 `PYC_FAILURE`。
 */
PYC_API int32_t pset(int32_t x, int32_t y, int32_t color_no);
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
/*!
 * 指定された番号のスプライトを画面の指定された位置(x, y)に表示します。
 *
 * \param no          スプライト番号。
 * \param x           スプライトを表示する x 座標。
 * \param y           スプライトを表示する y 座標。
 *
 * \return 成功したら `PYC_SUCCESS`、失敗したら多分 `PYC_FAILURE`。
 */
PYC_API int32_t spr(int32_t no, int32_t x, int32_t y);

PICO-8 の Lua コード

May 17, 2021

ピクセル(水色かな?)を方向キーによって動かすコード。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
function _init()
   x = 64
   y = 64
end

function _update()
   if ( btn( LEFT  ) ) x -= 1
   if ( btn( RIGHT ) ) x += 1

   if ( btn( UP    ) ) y -= 1
   if ( btn( DOWN  ) ) y += 1
end

function _draw()
   cls()
   pset( x, y, 12 )
end

わぁお! ちょー簡単だ。

スプライトの場合は SPR 関数を使う。

1
2
3
4
5
function _draw()
   cls()
   -- 表示したいスプライトを 1 番とする。
   spr( 1, x, y )
end