CDDBの取得がうまくいかない話

オンライン環境がないところでCDから音楽ファイルのコピーを行うと、データベースに接続できずにうまくCDにタイトルやアーティストの名前が書き込まれません。
後からでも一応できるのですが、WindowsMediaPlayerしか入ってない環境だと、既存のファイルに対してはデータを書き込めず(オプションで書き込めるようにできるが、特定のファイルのみ更新みたいなことができない)ので、困っていたので自分用のCDの音楽の情報をゲットするプログラムを作ろうとした。

続きを読む “CDDBの取得がうまくいかない話”

GoogleSpreadsheetを使って簡易DBを作る

##はじめに
Unityなんかでゲーム制作をしていると、スコアランキングなんかを作りたい時があります。
ふつうはMySQLなんかのDBを使って書くといいと思います。しかしサーバーの維持費がかかったりします。そんな時は、Google Spreadsheetを使って節約しましょう
続きを読む “GoogleSpreadsheetを使って簡易DBを作る”

Lisp勉強2

メリークリスマス、皆さん。
今日はリストをちょこっと勉強して、繰り返しをちょこっと勉強します。

(1 2 3 4 ore ore2)
コンな感じで線形のリストを定義できるらしい。これ自体では使えない。

(first (list 1 2 3))
最初の要素を取り出すそう。つまり1と表示される。

(rest (list 1 2 3))
こっちは、rest、つまり残りを出す。つまり最初以外のリストを作って返却する。
結果は、(2 3)

(nth 2 (list 1 11 111 1111))
nth関数は、n個目を吐き出す関数、1つめにn個目、2つ目にlistを与えればよい。
返却は、111ですね。

(quote (a b c))
quote関数はlistを生成する関数ですが、いつものリストと違って中が展開されないそうだ。
つまり、ここでのaとbとcは変数として展開はされずに、a b cといった文字列で返却される。
結果は (A B C)。
大文字、小文字は無視された。

(cons 10 (quote (a b c)))
consは、リストに要素を追加する命令。1つ目の引数に追加する要素を書く、そして、2つめの引数にリスト本体を渡してあげる。
そうすると、(10 a b c)と表示される。先頭(という概念があるのかは知らないが)に追加される。

()
空のリストはNILになる。それだけ。

(length (quote (a b c)))
これを使うと、リストの長さを取得できる。いたって普通な感じだ。

繰り返し:
(dotimes (n 3) (format t "~a" n))
3回繰り返す。012って出る。
dotimesが繰り返し命令だな。変数の宣言っぽく3っていう風にやる。
ふ~ん、一応何となく分かってきた感じだ、

(format t "~a" n)
ここで、表示している。
~aっていうのがprintfの%dみたいなやつらしい。
なるほど

dolistっていうのもあって、こっちはfor-eachを書けるらしい。使い方はほぼ同じだ。
変数で3って入れてたところに、リストを与えればいいらしい。

力尽きたので、今日はこれにて。
いい夜を。
続く。

スキンサイトのデザインをアップデートしました

スキンサイトのデザインをアップデートしました
表題がすべてを語っています。

デザインを変えたといいましても、それを生成する部分にもかなりの変更を入れました。
coreの部分はphpで書かれているんですけれど、そこの部分にも手をかなり入れました。やばいです。
3年ぶりぐらいにコード見たけどかなり不安になるようなコードばっかり書いてますね。当時の自分……。

cssも青基調のデザインから白系に戻しました。
何となく最近のgoogleなんかをちょっと見た目を参考にしました。ヘッダーが付いてくるタイプでヘッダーの中に検索ボックス埋め込んじゃうタイプ。
※Google翻訳なんかもUI結構変わってて驚きましたが。
続きを読む “スキンサイトのデザインをアップデートしました”

Lisp勉強1

今まで手続き型言語とか、オブジェクト指向の奴ばっかり扱ってきたので、関数型言語とかよくわからん。
古典的にLispを勉強してみようと思った。
プログラムは日々圧倒的成長が必要なのだ。(しらんけど)

Ubuntuでやってます。
まずは適当にLisp Commonパッケージをインストール
処理系の違いはよく分からん。
sudo apt-get install sbcl

sbclの対話の奴でやってみる。
公式っぽいところのチュートリアルみつつ
(format t "Hello World")
へ~、文字列型扱えるんだ。

続いて、関数を見る。
まずは四則演算
(+ 1 2)
ポーランド記法だ。おそらく(関数名 引数…)って感じだろう。

続きを読む “Lisp勉強1”

phpでちょっと考えた話

大乱闘スマッシュブラザーズ、私もやりたい。
そんなこんなで金曜日になりました。

ところで、Noto’sSkinsのサイトを現在せっせと更新中なわけですが、phpのバージョンを変更することにしました。
サーバーの都合上、5.6から、念願の(?)7.1に変えました(テスト環境を)。
そしたら、エラーが出ましたね。

どうやらphp7以降ではいろいろな字句解析とかもいろいろなところで変更が入ったらしくって、結構エラーが出ちゃいました。私自身、phpを書くのが得意というわけではなく残念なphpのコードを書いていたのが、原因なのですが……。

countでエラーが出ました。
どうやら、7より前のcount(array)関数では、引数の型が変数ならば何でもよかったようで、配列以外の型だと自動的に0を返してくれるようだったのですが、7からでは取れる引数が、配列のみになったようです。

なるほど……、phpの型って結構ガバガバで怖いと思いました。

その代わり、phpにはis_array(value)という関数があってそれで、配列か判定できるようなので、それを使ったりいらないところを消したりしました。
動きました。よかったです。

phpでは、比較演算子の等価(==)がガバガバなことで有名ですね。
奥が深い……ネットワーク関連ももうちょっと勉強したいと思えます。
あとRubyも使ってみたい。Ruby on Rails、ぜひやってみたい。今の流行は何なんでしょうか、割と知らないので今度調べてみます。

普段IDE使ってC#やらJava書いているとこういうところで困りますね……。
それでは。

1.13でワールドのフォーマット変わったんだよな~~w

標記通りです。
具体的に言うと、Section[:list]部はblocks[:bytearray]の配列が廃止され、パレット方式となりました。
Pallets[:list]にパレットデータが格納され、BlockStates[:compound]にステートIDが書かれています。ちなみにBlockStates[:longArray]はlong配列です。1long値につき16blockが格納されていると思われます。longは64bitなので、おそらく16bitでしょう。メタデータも書かれていませんすべてプロパティーに変更されています。
パレットの要素がName[:string]とPropertis[:compound]です。

HeightMapが増えたため、HeightMaps[:compound]に格納されています。ライトマップや水のしみこみ??みたいなマップが格納されています。これ、あれですねもし別のライブラリでやるとしたら計算がしんどいめんどい。

IsTerrainPopulated[:byte]が見つからない。なんかStatus[:string]に変わったかな???ていうか文字列で管理するのなんなの……(文字列管理嫌悪派

なんかよくわからんListがいっぱいありますね。真相は自分の目で……

たいへんそうです。

.NETのLevelDBのライブラリについて考える

OrangeNBTの実装に向けての検証とテスト等

LevelDBはgoogleが開発したSQLiteみたいなデータベースです。MinecraftのBedrock版でワールドの保存に使われてます。C#で実装しなおすのは極めて車輪の再発明です。ライブラリがどれがいいのか考えるだけの記事です。

LevelDBはCでの実装が公式に公開されてます。https://github.com/google/leveldb
.NETでは動きません。DLLImport等使えば動くと思いますけど……。

理想のライブラリの条件を上げましょう
・追加のDLLいらない。NativeDLLもできればいらない。
・ソースコードのまま導入できる。いわばオープンソース
・.NET Standardで動いてほしい。動かなくても改造可なら改造する。
・ライセンスにソースコードの開示を求める条項がないこと。このライブラリの利用者もおそらく継承されるため
・別に高機能は求めてない。低レベルでもいい。うごけばそれでいい。

ざっとググってみた限り以下のライブラリを見つけたので検証していきます。
LevelDB.NET
https://github.com/neo-project/leveldb
ライセンス:BSD-3。(可)
githubを見る限りcppファイル等しかない。下記のReactiveExtensionのことでしょうか?

LevelDB sharp
https://github.com/meebey/leveldb-sharp
ライセンス:BSD-3。(可)
ネイティブDLLの使用:あり(unix等で動かないっぽい?)

ReactiveExtension LevelDB
https://github.com/Reactive-Extensions/LevelDB
ライセンス:Apache License, Version 2.0(可)
ネイティブDLLの使用:あり(厳しい)

IronLevelDB
https://github.com/tg123/IronLeveldb
ライセンス:MIT(可)
ネイティブDLLの使用:なし
しかし、githubのREADMEをよく読むと、「This project is still under hard working」このプロジェクトはまだ作業中みたいなこと書いてあるし、読み込み関数しかまだ書いてないぜ見たいこと書いてある……。むむむこれに期待したいけど……厳しい。

Nugetの上位のそれっぽいやつもリンク切れてたり。ライセンスがよくわからなかったり……

そもそもMOJANGのLevelDBは若干改造されたやつである。圧縮方法がどうも違うらしい。
https://github.com/Mojang/leveldb-mcpe

うううむ……どうしようか。
.NET Standardにするとやはり、ネイティブDLLはない方がいいわけで。(うざい・使いにくい・各自コンパイル面倒くさい64bit/32bitでも変わる)

やはり……車輪の再発明しちゃう?

Minecraftの地形生成を考える【2】

Minecraftの地形生成を考える【2】

前回、一応基本となる地形生成のパーリンノイズについて一応書きましたので、今回はBeta1.8以降のバイオームわけについて。

バイオーム拡大法
バイオームを拡大していく方法です。
ゆえにMinecraftの地形生成は時間がかかります。

簡単な仕組みは
16×16(チャンク)を生成するために、もっと小さいブロックの四角形(例:4×4)を拡大・補完することで無限の生成を可能にしています。
無限といってもint値やlong値には最大が有るわけですから、その最大のなかのちょっとを何回も拡大することで擬似的に無限世界を生成することができるのです。
一番最初は固定シード値によってランダムに点をばらまくだけです。

拡大・補完の仕方
2×2ならば3×3に拡大します。(n x n => (2n – 1) x (2n – 1))

A B
C D

一番最初の拡大のときは下記のように拡大して補完します

A A or B B
A or C A, B, C or D B or D
C C or D D

この処理の際、シード値を常に座標から計算するなどして一定にしておかないと次のチャンクとの補完結果がずれる場合があります。また隣のチャンクとの差異吸収のために16×16は補完後18×18になるようにしてそこから16×16を取り出すことで次の拡大に影響が出ないようにします。

それ以降の拡大時には大陸や海をちゃんとつなげていくために上下または左右の最頻値をとって補完していきます。
ただし全て異なる場合などは上記同様ランダムに決定していきます
例:

A B
A A

これを、

A A B
A A B
A A A

これをもう一回拡大すると

A A A B B
A A A A B
A A A B B
A A A A A
A A A A A

この拡大処理を十分に繰り返し、あるていどの大きさになったところで終了します。
このようにバイオームのあの複雑なバイオームの境界線を生み出すことができるのです。