テーマを変えようとしたら、何も起こらなかったので、見たらデプロイに失敗していた。
で、原因を確認したら、イメージの OS が古いせいらしい。
20.04?に上げたらうまく行った。(バージョンうろ覚え
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/ivy
が archived
になっとるーー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
を使うため、 ivy
の MessageLogger
クラスが見つからないので多分ダメなのだろう。
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
|
ヴェスティア共和国の商人、タマゴ・ボーロは東の方に冒険に出て、帰還した後口述筆記で東方見聞録を書かせたが、
筆記者がそれに加えてあることないこと書いたのでファンタジーっぽくなってしまった。
ブログの名前を「放浪書庫運営委員会公式ブログ」から「うぃーくりー・あんだーわーるど・にゅーす」に変更しました。
といっても、てきとーな事柄についてのメモを書き倒していくというこのブログの運営ポリシーに変化はありません。
ひらがななのは実際には闇インターネットのことや、不思議島、不思議少年、不思議アメリカ大統領、不思議 UFO や不思議宇宙人、不思議生物のことについては扱わないからです。
「うぃーくりー・あんだーわーるど・にゅーす」というのはウィークリー・ワールド・ニューズという週刊タブロイド紙を捩っています。
ということで、これからも「うぃーくりー・あんだーわーるど・にゅーす」をよろしくお願いします。
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!
参考
NHK 教育で観た、海洋巨大生物の番組が頭にこびりついている。
もう大体忘れてしまったんだけど、海の中にはクラーケンやシーサーペント以外にも超巨大な
生物がいるんだと思わせるような内容だった。
だから、時折巨大海洋生物について調べてみているのだが、全然見つからない。
多分こんな風にやると思うんだけど:
1
|
say 'begin'.reverse; # => (begin)
|
このコードは 'begin'
という文字列を配列の中に突っ込んだものを返すということを行う。
というのも .reverse
は Mu
で定義されてはいるけれど、リスト用のメソッドなので、 .reverse
は
'begin'
という文字列を要素が 1 つあるリストとみなしてしまう。
となればあとは簡単で、文字列を文字ごとにバラバラにして(.split('')
)反転し(.reverse
)、からの結合(.join( '' )
)を行えば
文字列を反転できるはずだ。
1
|
say 'begin'.split('').reverse.join(''); # => nigeb
|
で、 Str
クラスにはそのものズバリのメソッド .flip
が存在する:
1
|
say 'begin'.flip; # => nigeb
|
begin
...
ensure err
...
nigeb
仮にぴょこ(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);
|
ピクセル(水色かな?)を方向キーによって動かすコード。
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
|