mieki256's diary



2017/11/01(水) [n年前の日記]

#1 [love2d][lua][raspberrypi] love2dでフルスクリーン表示のテスト

love2dでフルスクリーン表示ができそうか動作確認中。

まずは、Windows10 x64 + love2d 0.10.2上で実験。

フルスクリーン表示の標準的な指定の仕方について。 :

love2d は、フルスクリーン表示を指定できる。まずは、標準的な指定方法を試してみる。

使用した画像は以下。License : CC0 ってことで。

_bg_640x480.png
_spaceship_001_64x64.png

ソースは以下。

_conf.lua
function love.conf(t)
  t.window.width = 640
  t.window.height = 480
  t.window.title = "Move Sprite Example 02"
  t.window.vsync = true
  
  t.window.fullscreen = true
  t.window.fullscreentype = "exclusive"
end
conf.lua の中で以下を指定してるので…。
  • t.window.fullscreen = true
  • t.window.fullscreentype = "exclusive"
640x480の画面が、フルスクリーン表示、かつ、画面一杯にアスペクト比を保持しつつ引き延ばされて表示されるはず。

_main.lua
-- sprite move example 02

function love.load()
  -- init
  
  -- get window width and height
  scrw = love.graphics.getWidth()
  scrh = love.graphics.getHeight()
  
  -- load image
  bgimg = love.graphics.newImage("bg_640x480.png")
  playerimg = love.graphics.newImage("spaceship_001_64x64.png")
  
  -- player work
  player = {}
  player.x = scrw / 2
  player.y = scrh / 2
  player.speed = 250
  player.imgw = playerimg:getWidth()
  player.imgh = playerimg:getHeight()
end

function love.update(dt)
  -- update
  
  -- key check
  local ang = -1
  if love.keyboard.isDown("left") then ang = 180
  elseif love.keyboard.isDown("right") then ang = 0
  end
  if love.keyboard.isDown("up") then
    if ang < 0 then ang = 270
    elseif ang == 0 then ang = 270 + 45
    else ang = 180 + 45
    end
  elseif love.keyboard.isDown("down") then
    if ang < 0 then ang = 90
    elseif ang == 0 then ang = 45
    else ang = 180 - 45
    end
  end
  if ang >= 0 then
    local spd = player.speed * dt
    local ra = math.rad(ang)
    player.x = player.x + (spd * math.cos(ra))
    player.y = player.y + (spd * math.sin(ra))
  end

  -- move area check
  local wh = player.imgw / 2
  local hh = player.imgh / 2
  local xmin = wh
  local ymin = hh
  local xmax = scrw - wh
  local ymax = scrh - hh
  player.x = math.min(math.max(player.x, xmin), xmax)
  player.y = math.min(math.max(player.y, ymin), ymax)
end

function love.draw()
  -- draw BG
  love.graphics.setColor(255, 255, 255, 255)
  love.graphics.draw(bgimg, 0, 0)
  -- love.graphics.rectangle("fill", 0, 465, scrw, 150)
  love.graphics.setColor(255, 255, 255, 255)
  
  -- draw player
  ofsx = player.imgw / 2
  ofsy = player.imgh / 2
  love.graphics.draw(playerimg, player.x - ofsx, player.y - ofsy)
  
  love.graphics.print("FPS: "..tostring(love.timer.getFPS()), 10, 10)
end

function love.keypressed(key, isrepeat)
  -- ESC to exit
  if key == "escape" then
    love.event.quit()
  end
end

結果はこんな感じに。予想通りの表示になった。

move_sprite02_ss_win10x64.png

Raspberry Pi Zero W上で動かすと上手く行かない。 :

上記のソースを、Raspberry Pi Zero W + raspbian stretch + OpenGL ESを使うSDL2 + love2d 0.10.2 で動かしてみる。画面解像度は、1280x720。

move_sprite02_ss_raspi0w.png

酷い結果になった。conf.lua 内で指定したウインドウサイズは無視されて、画面解像度(=1280x720)がウインドウサイズとして取得されてしまっている模様。

解決策。 :

解決策をググってたら、以下の記事に遭遇した。

_Love2D - Raspberry Pi Forums
(edit- nevermind, created a workaround!)

create a low res 'virtual' screen with a canvas.
set its filtering mode to 'nearest' draw all game stuff to there at the end, draw that canvas (scaled up) to the actual high res screen.
result = low res sharp fat pixels on a high res screen.

Love2D - Raspberry Pi Forums より

「仮想スクリーンとして canvas を用意して、そこに描画してから canvas を拡大描画したらそれらしくなった」と言ってるのかな…?

_Canvas - LOVE
_love.graphics.setCanvas - LOVE
_Canvas:renderTo - LOVE
_love.graphics.draw - LOVE

ということで、その方法を試してみる。

_conf.lua
function love.conf(t)
  -- t.window.width = 1280
  -- t.window.height = 720
  t.window.vsync = true
  
  t.window.fullscreen = true
  -- t.window.fullscreentype = "exclusive"
end

_main.lua
-- fullscreen disp 01

function love.load()
  -- init

  -- set filter
  love.graphics.setDefaultFilter("nearest", "nearest")
  
  scr_w = 640
  scr_h = 480
  canvas = love.graphics.newCanvas(scr_w, scr_h)
  
  -- get window width and height
  wdw_w = love.graphics.getWidth()
  wdw_h = love.graphics.getHeight()
  
  -- load image
  bgimg = love.graphics.newImage("bg_640x480.png")
  playerimg = love.graphics.newImage("spaceship_001_64x64.png")
  
  -- player work
  player = {}
  player.x = scr_w / 2
  player.y = scr_h / 2
  player.speed = 250
  player.imgw = playerimg:getWidth()
  player.imgh = playerimg:getHeight()
end

function love.update(dt)
  -- update
  
  -- key check
  local ang = -1
  if love.keyboard.isDown("left") then ang = 180
  elseif love.keyboard.isDown("right") then ang = 0
  end
  if love.keyboard.isDown("up") then
    if ang < 0 then ang = 270
    elseif ang == 0 then ang = 270 + 45
    else ang = 180 + 45
    end
  elseif love.keyboard.isDown("down") then
    if ang < 0 then ang = 90
    elseif ang == 0 then ang = 45
    else ang = 180 - 45
    end
  end
  if ang >= 0 then
    local spd = player.speed * dt
    local ra = math.rad(ang)
    player.x = player.x + (spd * math.cos(ra))
    player.y = player.y + (spd * math.sin(ra))
  end

  -- move area check
  local wh = player.imgw / 2
  local hh = player.imgh / 2
  local xmin = wh
  local ymin = hh
  local xmax = scr_w - wh
  local ymax = scr_h - hh
  player.x = math.min(math.max(player.x, xmin), xmax)
  player.y = math.min(math.max(player.y, ymin), ymax)
end

function love.draw()

  -- set canvas
  love.graphics.setCanvas(canvas)
  
  -- draw BG
  love.graphics.setColor(255, 255, 255)
  love.graphics.draw(bgimg, 0, 0)
  -- love.graphics.rectangle("fill", 0, 465, scr_w, 150)
  love.graphics.setColor(255, 255, 255)
  
  -- draw player
  ofsx = player.imgw / 2
  ofsy = player.imgh / 2
  love.graphics.draw(playerimg, player.x - ofsx, player.y - ofsy)
  
  -- unset canvas
  love.graphics.setCanvas()

  -- draw canvas to window
  love.graphics.setColor(255, 255, 255)
  love.graphics.draw(canvas, 0, 0, 0, wdw_w / scr_w, wdw_h / scr_h)
  
  love.graphics.print("FPS: "..tostring(love.timer.getFPS()), 10, 10)
end

function love.keypressed(key, isrepeat)
  -- ESC to exit
  if key == "escape" then
    love.event.quit()
  end
end

結果はこうなった。

fullscreen_disp01_ss_raspi0w.png

アスペクト比の計算をサボってるので、4:3の画面が16:9で引き延ばされて、横に長い見た目になってしまっているけど…。少なくとも、画面一杯に引き延ばして描画することは可能っぽい。

少し説明。 :

conf.lua 内では…。
  • ウインドウサイズの指定をコメントアウト。
  • フルスクリーン表示の種類の指定をコメントアウト。

この、conf.lua の内容で…。
  • Raspberry Pi Zeor W 上では「とにかくフルスクリーン表示しろ」という指定になる。ウインドウサイズ = 画面解像度。
  • Windows10 x64上では、ウインドウサイズはデフォルトの800x600になり、その800x600の画面がフルスクリーン表示される。

main.lua 内では…。
  • 初期化処理(love.load()内)で canvas を作成。
  • 描画処理(love.draw()内)では、canvas にゲーム画面を描いてから、その canvas をウインドウに拡大しつつ描画。
  • 拡大縮小描画はクッキリした見た目にしたかったので、love.graphics.setDefaultFilter("nearest", "nearest") を記述して、nearestフィルタで拡大縮小するように指定。

canvas への描画は、以下でできるらしい。
  love.graphics.setCanvas(canvas)
  (描画処理)
  love.graphics.setCanvas()

ウインドウへのcanvasの描画は、love.graphics.draw() を使う。
love.graphics.draw(描画したい画像・キャンバス等, 
                   描画位置x, 描画位置y, 
                   描画方向 ,
                   横方向の拡大縮小率, 縦方向の拡大縮小率)

もう少し説明。 :

luaでローカル変数を使いたい時は、local と頭につけるらしい。
    local ang = 0

三角関数は以下。
  • math.sin(ラジアン値)
  • math.cos(ラジアン値)
  • 度からラジアンの変換は、math.rad(角度)
  • ラジアンから度への変換は、math.deg(ラジアン値)

最大値、最小値を取り出すなら以下。
  • math.min(値1, 値2) : 最小値を返す。
  • math.max(値1, 値2) : 最大値を返す。

Luaは初めて触ってるわけだけど、このあたりは比較的素直な仕様だなと…。

#2 [love2d][lua][raspberrypi] 「jack server is not running or cannot be started」について

Raspberry Pi Zero W 上でSDL2関係のアレコレを動かそうとすると、「jack server is not running or cannot be started」と言われてしまう時があるのだけど。解決策をググってみて分かった点をメモ。

どうやら、コレって別にエラーが出てるわけではなくて、サウンドを鳴らす何かしらが「音を出す色んな仕組みにとりあえず打診してみたんだけど、jack君は無反応だったよ」と調査結果を報告してるだけ、らしい…。

回避策としては、jackd -d dummy とやらを実行しておけばメッセージは出なくなる模様。何をやってるのかさっぱり分からんけど。

以下、そのあたりの話について目についた記事をメモ。

_sound - Problem starting JACK server "Jack Server is not running or cannot be started" - Ask Ubuntu
_python - Raspberry Pi Radio Script Stopped Working "jack server is not running or cannot be started" - Stack Overflow
_python - PyAudio trying to use JACK - Stack Overflow
_python - jack server is not running or cannot be started - Stack Overflow
_[SOLVED] ALSA complaining about Jack Server
_Complains about jack server not running on Raspbian - Issue #10 - shichao-an/soundmeter
_Rassberry Pi and Jack audio - Raspberry Pi Forums

#3 [hns] この日記ページでLua言語の色分け表示ができるように指定

この日記ページにプログラムソースを貼り付けて表示する際は、SyntaxHighlighter を使わせてもらっているのだけど。

_SyntaxHighlighter

Lua言語には対応してないわけで。対応させる方法はないのかなと。

色々ググってみたら、以下の記事で公開されてるファイルを使えば対応できるらしいと知り、試しに導入。

_SyntaxHighlighter Evolved Brush for other languages - mikrom

syntaxhighlighter-evolved-lua-brush.zip をDLして解凍。中に shBrushLua.js が入ってるので、scripts ディレクトにコピー。

hns の theme.ph を編集。以下を追加。
<script type="text/javascript" src="scripts/shBrushLua.js"></script>

以下で公開されてる版でも動いてくれた。おそらく韓国の方が公開してるのかな…。

_SyntaxHighlighter 3.0.xx , lua brush shBrushLua.js

他にも色んな版を見かけたけど、どうも SyntaxHighlighter のバージョンによって使えるファイルが違うようで。他の scripts/shBrush*.js の中身を眺めて、似たような記述がされてるファイルを探さないといかんらしい。

Autoloaderが動かない。 :

以下によると、Autolaoder なる機能があるらしいけど。

_【Javascript】SyntaxHighlighter 3.0 の新機能と注意点 | blog.remora.cx

ローカルで試してみたけど、動かない…。

ググってみたら、以下の記事で説明が。

_SyntaxHighlighter(Ver3.x)の導入方法 | Sabakura Blog
SyntaxHighlighterは、ページ読み込み後に動作させないと上手く機能しません。そのため、フッター部で読み込ませるか、もしくはヘッダ部に記述する場合は、window.onloadを使う必要があります。

SyntaxHighlighter(Ver3.x)の導入方法 | Sabakura Blog より


そういうことだったのか…。window.onload を使う形に書き換えてみたら動いてくれた。助かった。

2017/11/02(木) [n年前の日記]

#1 [lua][love2d][raspberrypi] love2dでインチキ多関節

love2dを勉強中。どのくらいスプライト相当が描画できそうか動作確認。

とりあえず、 _昔DXRubyを使って書いたインチキ多関節 を移植してみたり。こんな感じになった。

inchiki_takansetsu_love2d_ss.gif

スプライト相当を64枚描画してるのに、この速度。素晴らしい。

ただ、Pi Zero W上では、動きがちょっとガクガクしてる感じもする。

ひょっとすると、getFPS() が取得してるのは love.update() が呼ばれてる頻度で、描画はまた別なのかな。まあ、内部的には60FPS相当で処理できてるということなら、それはそれでいいか…。

何にせよ、Pi Zero上でリアルタイム系の2Dゲームを作ってみたい、てな場合、Lua + love2d は良い選択肢になりそうな予感。…OpenGL ESを有効にしたSDL2をビルドしないといかんあたりがハードルになりそうではあるけど。その版も apt でインストールできればいいのに。

使用画像とソース。 :

使用画像は以下。License : CC0 / Public Domain ってことで。

_bg_640x480.png
_ufo.png

ソースは以下。

_conf.lua
function love.conf(t)
  t.window.title = "Inchiki Takansetsu"
  t.window.width = 1280
  t.window.height = 720
  t.window.vsync = true
  -- t.window.fullscreen = true
  -- t.window.fullscreentype = "exclusive"
end

_main.lua
-- Inchiki Takansetsu

function love.load()
  -- init

  -- set filter
  love.graphics.setDefaultFilter("nearest", "nearest")

  scr_w = 640
  scr_h = 480
  canvas = love.graphics.newCanvas(scr_w, scr_h)

  -- get window width and height
  wdw_w = love.graphics.getWidth()
  wdw_h = love.graphics.getHeight()

  scr_scale = math.min((wdw_w / scr_w), (wdw_h / scr_h))
  scr_ofsx = (wdw_w - (scr_w * scr_scale)) / 2
  scr_ofsy = (wdw_h - (scr_h * scr_scale)) / 2

  -- load image
  bgimg = love.graphics.newImage("bg_640x480.png")
  img = love.graphics.newImage("ufo.png")
  img_w = img:getWidth()
  img_h = img:getHeight()

  -- work
  nmax = 64
  bx = scr_w / 2
  by = 0
  startdeg = 0
  poslist = {}
  for i=1,nmax do
    poslist[i] = {x=0, y=0}
  end

  -- framerate steady
  min_dt = 1 / 60
  next_time = love.timer.getTime()
end

function love.update(dt)
  -- update

  next_time = next_time + min_dt

  -- get mouse position
  local mx, my = love.mouse.getPosition()
  mx = (mx - scr_ofsx) / scr_scale
  my = (my - scr_ofsy) / scr_scale

  local dw = mx - bx
  local dh = my - by
  local deg = startdeg
  local h = 100
  for i=1,nmax do
    local ii = i - 1
    local x = bx + (dw * ii / nmax) - (img_w / 2)
    local y = by + (dh * ii / nmax) - (img_h / 2)
    -- local hh = h * ii / nmax
    local hh = h
    x = x + hh * math.sin(math.rad(deg))
    poslist[i].x = x
    poslist[i].y = y
    deg = deg + 8
  end

  startdeg = startdeg + 360 * dt
end

function love.draw()

  -- set canvas
  love.graphics.setCanvas(canvas)

  -- draw BG
  love.graphics.setColor(255, 255, 255)
  love.graphics.draw(bgimg, 0, 0)
  love.graphics.setColor(255, 255, 255)

  -- draw objs
  for i=1,nmax do
    local x = poslist[i].x
    local y = poslist[i].y
    love.graphics.draw(img, x, y)
  end

  -- unset canvas
  love.graphics.setCanvas()

  -- draw canvas to window
  love.graphics.setColor(255, 255, 255)
  love.graphics.draw(canvas, scr_ofsx, scr_ofsy, 0, scr_scale, scr_scale)

  love.graphics.print("FPS: "..tostring(love.timer.getFPS()), 10, 10)
  love.graphics.print("env: "..tostring(love.system.getOS()), 10, 40)

  if love.system.getOS() == "Windows" then
    -- wait
    local cur_time = love.timer.getTime()
    if next_time <= cur_time then
      next_time = cur_time
    else
      love.timer.sleep(next_time - cur_time)
    end
  end
end

function love.keypressed(key, isrepeat)
  -- ESC to exit
  if key == "escape" then
    love.event.quit()
  end
end

何かテキトーな名前のフォルダを作って、画像と *.lua を入れて、「love フォルダ名」で実行できる。

それにしても…。 _DXRuby版 と比べると、長いな…。

少し説明。 :

Raspberry Pi Zero上でフルスクリーン表示をする関係で、一旦 canvas 内に描画してから、その canvas をウインドウに描画する、ということをしてる。先日書いたソースではアスペクト比がおかしい状態で引き延ばしてたけど、今回はアスペクト比をちゃんと維持するようにしてみた。love.load() の中で、canvasの拡大縮小率や描画座標を求めてる。

マウス座標の取得は、love.mouse.getPosition() でできるらしい。
local mx, my = love.mouse.getPosition()
今回、canvas を拡大縮小して描画してるので、ソレを考慮してマウス座標を求めてる。

Windows上ではFPS値がスゴイことになってたけど、どうやら本来は、時間を測って sleep を入れるべき、らしい。 _love.timer.sleep (日本語) - LOVE で、そのあたりのサンプルが提示されてる。ただ、Raspberry Pi上で動かした場合は、特に何もしなくても love.timer.getFPS() が 60FPS を返すので、今回は Windows上で動いてる時のみ、該当処理が行われるようにしてみた。

_love.system.getOS() で、OS種類が取得できる。
  • Windows10 x64上で動かしたら、"Windows" が返ってきた。
  • Raspberry Pi上で動かしたら、"Linux" が返ってきた。
ん? コレって、フツーのLinux上で動かしているのか、Raspberry Pi上で動かしているのかは、判別できないのかな? 今後の課題かも。

#2 [lua][love2d] NTEmacs上にlua-modeを追加

昨日まで、lua + love2d のソースを _Notepad++ で編集していたのだけど。どうも個人的に使い勝手がしっくりこない感じがしてきたので、emacs(NTEmacs 24.5.1) に lua-mode 等をインストールして環境整備を。ちなみに環境は Windows10 x64。

いやまあ、Notepad++ での編集も、それほど悪くないのだけど。ショートカットキー一発で、love2dを実行できるように設定できたりもするので…。フツーは Notepad++ のほうがオススメというか。

lua-modeのインストール。 :

lua-mode は以下。…じゃないかな。たぶん。

_Lua-mode

M-x list-package で一覧を表示して、lua-mode 20170130版をインストール。(C-s で lua-mode を検索して、該当行でiキーを押してxキー)。

~/.emacs に以下を追加。
;; ----------------------------------------
;; lua-mode

;; This snippet enables lua-mode
;; This line is not necessary, if lua-mode.el is already on your load-path
;; (add-to-list 'load-path "/path/to/directory/where/lua-mode-el/resides")

(autoload 'lua-mode "lua-mode" "Lua editing mode." t)
(add-to-list 'auto-mode-alist '("\\.lua$" . lua-mode))
(add-to-list 'interpreter-mode-alist '("lua" . lua-mode))

インデントレベルが3になってる模様。2にする。
(setq lua-indent-level 2)

これで、.lua を開いたら lua-mode になってくれた。

love2d用のマイナーモードをインストール。 :

love2d用のマイナーモード、love-minor-mode.el を公開してくれてる方が居るようで。これもありがたく使わせてもらおう…。

_ejmr/love-minor-mode: An Emacs minor mode for LOVE

love-minor-mode.el をDL。emacs からパスが通ってる場所に置く。

love-minor-mode.el 内で、love.exe の場所を決め打ちしてるところがあるので修正。「love.exe」で検索すれば見つかるはず。もっとも、love.exe にPATHが通ってる環境なら、.el 内を編集する必要はないけれど。

~/.emacs に以下を追加。
;; love2d love-minor-mode
(require 'love-minor-mode)

使い方は…。例えば main.lua 等を開いている状態で、M-x love-minor-mode を実行。「Love-minor-mode enabled」と表示されたら該当マイナーモードが有効になる。再度 M-x love-minor-mode と打てば無効になる。

M-p に love/play が割り当てられているので、main.lua を編集中に M-p を叩けば、love.exe を呼び出して実行してくれる。

2017/11/03(金) [n年前の日記]

#1 [windows][raspberrypi] Windows上でRaspberry Piのエミュレータを動かしてみたり

Raspberry Pi Zero Wを使って何かしら動作確認をするたびに、Raspberry Pi Zero W機の電源を入れたりキーボードを引っ張り出すのが面倒臭いなと。

Windows上でエミュレーションできたら多少は快適にならないかと思えてきたので、Raspberry Piのエミュレータとやらを動かしてみようかなと。環境は、Windows10 x64。

どうやら、QEMUなる仮想PCを使うとエミュレーションができるらしい。

簡単に動かす方法。 :

以下が参考になった。

_Windows 用ラズパイエミュレータを使ってみた : まだプログラマーですが何か?

以下から、qemu.zip をDL。2012/07/26と古いけど…。

_Raspberry Pi emulation for Windows download | SourceForge.net

解凍して、D:\qemu として置いてみた。run.bat を実行。Raspberry Piの画面がたしかに出てきた。

raspbian のバージョンは wheezy らしい。ちなみに、wheezy → jessie → stretch の順で新しい。最新版は stretch。

source.listを変更。 :

手元の環境では、sudo apt-get update だの sudo apt-get upgrade 等を実行するとダウンロードの段階で固まってしまう。

/etc/apt/source.list を変更して、日本国内のサーバを指定すれば改善する時があるらしいので試したり。

_rasbianでapt-get updateがうまく行かない場合の可能性について - Live the Life you Love

ミラーサイトは以下。

_RaspbianMirrors - Raspbian

JAIST や Yamagata University のURLで置き換えたら、少なくともダウンロードは止まらなくなった。

比較的新しいQEMUとraspbian stretchのimgで試してみる。 :

どうせなら raspbian stretch を動かしてみるか…。と思ったけれど、stretch用のkernelが見つからない。jessie用で動くかな…。qemu も新しい版を試してみたいな…。

ということで、比較的新しい版で動かしてみる。以下の解説記事に従って作業。ありがたや。

_Windows+QEMUでRaspberry Piをエミュレートする | junkato.jp
_Raspberry Pi emulator for WindowsでRaspbian最新版を動作させる手順 - Qiita

必要なファイルを入手。 :

以下から qemu をダウンロード。

_QEMU for Windows - Installers (64 bit)

qemu-w64-setup-20171006.exe をDLして実行するとインストールされる。今回は、D:\qemu\ にインストールした。

raspbian stretch の img (2017-09-07-raspbian-stretch.zip) もDL。解凍して、中に入ってた .img を使う。

_Download Raspbian for Raspberry Pi

kernel は、kernel-qemu-4.4.34-jessie を使ってみた。

_dhruvvyas90/qemu-rpi-kernel: Qemu kernel for emulating Rpi on QEMU

2017-09-07-raspbian-stretch.img と kernel-qemu-4.4.34-jessie を、D:\qemu\qemu 以下に入れる。バッチファイルを作成。

run_raspbian.bat
@set PATH=D:\qemu;%PATH%
qemu-system-arm.exe -kernel kernel-qemu-4.4.34-jessie -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda 2017-09-07-raspbian-stretch.img -net nic -net user,hostfwd=tcp::2222-:22
  • qemu-system-arm.exe は、ARM CPUのエミュレータ。
  • *-arm.exe と *-armw.exe の違いは、実行時にコンソール(DOS窓?)を出すか出さないか、らしい。
  • -kernel hoge でカーネルファイルを指定。
  • -cpu arm1176 -m 256 で、ARM CPU(の種類)、メモリ容量を指定してる。
  • -hda hoge.img で、HDDイメージを指定。
  • -net user,hostfwd=tcp::2222-:22 で、SSHのポート(22番) を 2222番に変更、しているのではないかな…。昔は -redir で指定してたらしいが、その指定方法は非推奨になったらしい。

run_raspbian.bat を実行。raspbian が起動した。

raspbian上での初期設定。 :

qemu + raspbian起動後、/etc//etc/ld.so.preload を編集。1行目に「#」を打ってコメントアウト。
sudo nano /etc/ld.so.preload

/etc/udev/rules.d/90-qemu.rules を作成。
sudo nano /etc/udev/rules.d/90-qemu.rules
中身を以下に。
KERNEL=="sda", SYMLINK+="mmcblk0"
KERNEL=="sda?", SYMLINK+="mmcblk0p%n"
KERNEL=="sda2", SYMLINK+="root"

sudo shutdown -h now でシャットダウンしてから、バッチファイルを再度実行して起動するか確認。一応動いている模様。

imgの容量を増やす。 :

以下の記事を参考にして、imgを2GBほど増加。

_Raspberry Pi のイメージファイルを拡張する - ymyzk’s blog
Windows上のDOS窓で作業。2GB の temp.img を作成して、raspbian stretch の img にくっつけて、raspbian-stretch.img というファイルを新規作成。
qemu-img create -f raw temp.img 2G
copy /b 2017-09-07-raspbian-stretch.img+temp.img raspbian-stretch.img

run_raspbian.bat 内の、 *.img を raspbian-stretch.img に変更。

qemu + raspbianを起動後、sudo fdisk /dev/sda を実行。
  • パーティション2の開始セクタをメモしておく。
  • パーティション2を削除してから、プライマリーパーティションとして再作成。
  • 開始セクタは、先ほど削除したパーティションの値を指定。
  • パーティションテーブルを書き込んで fdisk終了。

sudo shutdown -h now でシャットダウン。run_raspbian.bat を実行して raspbianを再起動。

sudo resize2fs /dev/sda2 を実行してパーティションをリサイズ。

SWAP領域を追加。 :

SWAP領域も追加。run_raspbian.bat 内で、temp.img を -hdb temp.img で追加して。raspbianを起動して以下を実行。
sudo mkswap /deb/sdb
sudo swapon /dev/sdb

問題点。 :

色々問題があるようで。
  • とにかく遅い。何かするたびに十数秒〜数十秒待たされる。
  • メモリ容量の指定は256MBが上限らしい。厳しい。代わりにSWAPを指定すると言ってもHDDにアクセスさせる時点で速度的に厳しいわけで。ユーザモードなるモードで動かせばもっとメモリを増やせるらしいけど、それはそれで何かしら制限があるだろうし…。
  • ガンガンフリーズする。sudo apt-get upgrade ですら、ところどころでフリーズする…。
  • マウスカーソルが妙なところを指す。位置が合わない。

これでは実機を動かしたほうがマシだなあ、という気分になってきた。

画面解像度を変更。 :

デフォルトでは 640x480 の画面になってしまうが、以下のページで画面解像度の変更方法が書いてあった。800x600,16bit であれば変更できるらしい。

_Raspberry PI Emulation | Southend Linux User Group (web archive)

/etc/X11/xorg.conf を新規作成。
sudo nano /etc/X11/xorg.conf

中に以下を記述。
Section "Screen"
  Identifier "Default Screen"
  SubSection "Display"
   Depth 16
   Modes "800x600" "640x480"
  EndSubSection
EndSection

その他参考ページ。 :

#2 [raspberrypi] Raspberry Pi用のスペーサが届いた

スイッチサイエンスさんに注文してた、 _Raspberry Pi用のスペーサセット(SSCI-022682。長さ11mmスペーサ x 4、M2.6ネジ x 8) がネコポスで届いた。

M3.0のネジなら近所のホームセンターでも入手できるのだけど、Raspberry Piの固定用の穴はM2.6じゃないと入らないらしいので、それだと入手しにくかったわけで…。通販で入手するしかないな、と。

とりあえずコレで、Raspberry Pi3 とブレッドボードを、 _TAMIYA ユニバーサルプレートL の上に固定できた。Raspberry Pi3 が電動雲台の上に固定してあっても、USB端子、HDMI端子、電源端子に、ケーブルを差せるから、動作確認等に流用できる。ていうか自分の場合、ケースは要らなかったな…。こういう状態のほうが全然便利だったかも。最初からこうしておけばよかった。

関係ないけど、ユニバーサルプレートをニッパーで無理矢理切っていく最中に、プレートの切断面で親指を切ってしまった。痛い。もっと簡単に、好きな形で切り出せる製品があればいいのに。いや、強度が足りなくなるから難しいか。…本来、このプレートは何で切るべきなんだろう。

2017/11/04() [n年前の日記]

#1 [lua][love2d] love2dでスプライトをアニメーション、するあたりを勉強中

love2dを勉強中。スプライトシート画像を扱うあたりを調べていたり。どうやら Quad とやらを使えばできるらしいけど…。

_love.graphics.newQuad (日本語) - LOVE

2017/11/05() [n年前の日記]

#1 [lua][love2d] love2dでスプライトをアニメーション

いわゆるスプライトシート画像を使ってlove2dで描画してみようと。

スプライトシートというのは…以下のような画像。アニメーションの各コマが一つの画像にまとまってる、みたいな画像のこと。

ufo_64x64_fullcol.png

動作確認環境は、Windows10 x64 と Raspberry Pi Zero W + raspbian stretch。

こんな感じになった。

quad_test01_ss.gif

Windows10 x64上でも、Raspberry Pi Zero W上でも、同じように動いてくれた。

画像とソース。 :

画像は以下。License : CC0 / Public Domain ってことで。

_ufo_64x64_fullcol.png

ソースは以下。

_conf.lua
function love.conf(t)
  t.window.title = "Quad Test01"
  t.window.width = 1280
  t.window.height = 720
  t.window.vsync = true
  -- t.window.fullscreen = true
  -- t.window.fullscreentype = "exclusive"
end

_main.lua
-- fullscreen disp 01

function love.load()
  -- init

  -- set filter
  love.graphics.setDefaultFilter("nearest", "nearest")

  -- set canvas size
  scr_w = 640
  scr_h = 480
  canvas = love.graphics.newCanvas(scr_w, scr_h)

  -- get window width and height
  wdw_w, wdw_h = love.graphics.getDimensions()

  scr_scale = math.min((wdw_w / scr_w), (wdw_h / scr_h))
  scr_ofsx = (wdw_w - (scr_w * scr_scale)) / 2
  scr_ofsy = (wdw_h - (scr_h * scr_scale)) / 2

  -- load image
  img = love.graphics.newImage("ufo_64x64_fullcol.png")

  -- make Quad
  imgs = {}
  for i=1,(8 * 4) do
    local ii = i - 1
    local x = (ii % 8) * 64
    local y = math.floor(ii / 8) * 64
    imgs[ii] = love.graphics.newQuad(x, y, 64, 64, img:getDimensions())
  end
  img_count = 9
  img_count_time = 0

  -- framerate steady
  min_dt = 1 / 60
  next_time = love.timer.getTime()
end

function love.update(dt)
  -- update
  next_time = next_time + min_dt

  img_count_time = img_count_time + dt
  img_count = 9 + math.floor(15 * img_count_time) % 15
end

function love.draw()

  -- set canvas
  love.graphics.setCanvas(canvas)

  -- draw BG
  love.graphics.setColor(0, 0, 255)
  love.graphics.rectangle("fill", 0, 0, scr_w, scr_h)

  -- draw sprite
  love.graphics.setColor(255, 255, 255)
  love.graphics.draw(img, imgs[img_count], 32, 32)

  -- unset canvas
  love.graphics.setCanvas()

  -- draw canvas to window
  love.graphics.setColor(255, 255, 255)
  love.graphics.draw(canvas, scr_ofsx, scr_ofsy, 0, scr_scale, scr_scale)

  love.graphics.print("FPS: "..tostring(love.timer.getFPS()), 10, 10)

  if love.system.getOS() == "Windows" then
    -- wait
    local cur_time = love.timer.getTime()
    if next_time <= cur_time then
      next_time = cur_time
    else
      love.timer.sleep(next_time - cur_time)
    end
  end
end

function love.keypressed(key, isrepeat)
  -- ESC to exit
  if key == "escape" then
    love.event.quit()
  end
end

実行の仕方は、画像、conf.lua、main.lua をテキトーな名前のフォルダに入れて、「love フォルダ名」で実行。

少し説明。 :

スプライトシートを使うには ―― 一つの画像の中から部分的に取り出して描画するには、Quad とやらを使うらしい。

_love.graphics.newQuad (日本語) - LOVE
    frmae_info = love.graphics.newQuad(x, y, 横幅, 縦幅, 元画像のサイズ)
ちなみに、元画像のサイズは、元画像の入った変数:getDimensions() で取得できる。

Quad は、元画像の中から画像を取り出すというより、取り出すための情報を作る、みたいな感じだろうか…。と言うのも、実際の描画は以下のような感じで、元画像を渡しつつ処理するわけで。
  love.graphics.draw(元画像の入った変数, frame_info, width, height)

この記事へのツッコミ

Re: love2dでスプライトをアニメーション by 名無しさん    2018/01/10 15:17
love2dに対する日本語の説明が非常に少ないので助かります。
勉強させていただきます。

#2 [lua][love2d] love2dでタイルマップの表示

love2dでタイルマップBGを表示したいなと。

タイルマップは _Tiled Map Editor で作成するとして…。

ググってみたら、sti(Simple Tiled Implementation)を使うと楽になるらしい。

_karai17/Simple-Tiled-Implementation: Tiled library for LOVE
_Lua.Space | Using Tiled Maps in LOVE

試してみた。たしかに楽に表示できる。

tilemap_test01_ss.png

自作の画像やマップデータは以下。License : CC0 / Public Domain ってことで。

_tile01.png
_mecha_bg_map.tmx
_mecha_bg_map.lua

stiの使い方。 :

まず、Tiled から、.lua 形式でエクスポート。

sti を、 _karai17/Simple-Tiled-Implementation から、任意のフォルダ内で git でクローンするなり、zipでDL・解凍するなりして。
git clone https://github.com/karai17/Simple-Tiled-Implementation.git

main.lua があるフォルダに、stiフォルダを丸々コピー。例えば以下のようなファイル構成に。
.
|-- sti
|   |-- plugins
|   |   |-- box2d.lua
|   |   `-- bump.lua
|   |-- graphics.lua
|   |-- init.lua
|   `-- utils.lua
|
|-- conf.lua
|-- main.lua
|
|-- mecha_bg_map.lua : タイルマップデータ(.lua)
|-- mecha_bg_map.tmx : タイルマップデータ(.tmx)
`-- tile01.png : タイルマップで使う画像

表示するだけなら、以下で済む。
local sti = require "sti"

function love.load()
  map = sti("mecha_bg_map.lua")
end

function love.update(dt)
  map:update(dt)
end

function love.draw()
  map:draw()
end
簡単だ…。

ただ、スクロール等はどうすればいいのやら。調べてみないと。sti に同梱の main.lua が、カーソルキーやWASDキーでスクロールできているので、参考になりそうな予感。

#3 [windows] treeをインストール

Windows版 tree.com は出力結果が何かしっくりこないので、*NIX版の tree を MSYS2上でインストールしてみたり。

MSYS2 MSYS (64bit) を起動。以下を打ってインストール。
pacman -S tree

以下で実行できる。
tree --charset=C --dirsfirst

Windows用のバイナリもあるらしい。 :

以下で、Windows用の tree.exe が公開されてた。バージョンはちょっと古いっぽいけど。

_Tree for Windows

tree.com ではなくて tree.exe で実行すればいい。Windows10 x64上で試してみたら、ちゃんと動いてくれた。ただ、日本語ファイル名についてはおかしな表示になる。

他にも色々選択肢があるっぽい?

_how do I add the 'tree' command to git-bash on Windows? - Super User

2017/11/06(月) [n年前の日記]

#1 [lua][love2d] love2dでタイルマップの表示その2

love2dでタイルマップBGを表示できるかどうか実験中。昨日は表示までできたけど、スクロールはどうするのかなと。

色々試して、こんな感じに。Windows10 x64 と Raspberry Pi Zero W、love2d 0.10.2上で動作確認した。

tilemap_test03_getgid_ss.gif

使用画像とマップデータ。 :

自作した、 _Tiled Map Editor 用のデータは以下。License : CC0 / Public Domain ってことで。

_tile01.png
_mecha_bg_map.tmx

love2d + _sti (Simple-Tiled-Implementation) で読み込むためのデータは以下。

_mecha_bg_map.lua

ソース。 :

ソースは以下。動作には、 _sti(Simple-Tiled-Implementation) が必要。

_conf.lua
function love.conf(t)
  t.window.title = "Tilemap Test 03"
  t.window.width = 1280
  t.window.height = 720
  t.window.vsync = true
  t.console = true
  -- t.window.fullscreen = true
  -- t.window.fullscreentype = "exclusive"
end

_main.lua
-- tilemap test 03

local sti = require "sti"

local scroll_type

function love.load()
  -- init

  -- set filter
  love.graphics.setDefaultFilter("nearest", "nearest")

  -- set canvas size
  scr_w = 640
  scr_h = 480
  canvas = love.graphics.newCanvas(scr_w, scr_h)

  -- get window width and height
  wdw_w, wdw_h = love.graphics.getDimensions()

  scr_scale = math.min((wdw_w / scr_w), (wdw_h / scr_h))
  scr_ofsx = (wdw_w - (scr_w * scr_scale)) / 2
  scr_ofsy = (wdw_h - (scr_h * scr_scale)) / 2

  -- load tilemap
  map = sti("mecha_bg_map.lua")

  map.getGidByPixel = function(self, x, y, layerindex)
    local tilex, tiley = self:convertPixelToTile(math.floor(x), math.floor(y))
    tilex = math.floor(tilex)
    tiley = math.floor(tiley)
    local layer = map.layers[layerindex]
    local tilew = layer.width
    local tileh = layer.height
    local gid = -2
    if tilex >= 0 and tiley >= 0 and tilex < tilew and tiley < tileh then
      local tile = layer.data[tiley + 1][tilex + 1]
      if tile == nil then
        gid = -1
      else
        gid = tile.gid
      end
    end
    return gid
  end

  scroll_type = 2

  layers = {}
  for i,layer in ipairs(map.layers) do
    -- print(i, layer.name)
    layers[i] = layer
  end

  -- init bg position
  tx_start = 0
  ty_start = 0
  tx = tx_start
  ty = ty_start

  gid = 0

  -- framerate steady
  min_dt = 1 / 60
  next_time = love.timer.getTime()
end

function love.update(dt)
  -- update
  next_time = next_time + min_dt

  map:update(dt)

  -- keyboard check
  local speed = 160 * dt
  local kd = love.keyboard.isDown
  if kd("left") or kd("a") then
    tx = tx - speed
  elseif kd("right") or kd("d") then
    tx = tx + speed
  end
  if kd("up") or kd("w") then
    ty = ty - speed
  elseif kd("down") or kd("s") then
    ty = ty + speed
  end
  if kd("r") then
    tx = tx_start
    ty = ty_start
  end

  if scroll_type == 0 then
    map.layers["bg_a"].x = 0
    map.layers["bg_a"].y = 0
    map.layers["bg_b"].x = 0
    map.layers["bg_b"].y = 0
  elseif scroll_type == 1 then
    layers[2].x = -tx
    layers[2].y = -ty
    layers[1].x = -tx / 2
    layers[1].y = -ty / 2
  elseif scroll_type == 2 then
    map.layers["bg_a"].x = -tx
    map.layers["bg_a"].y = -ty
    map.layers["bg_b"].x = -tx / 4
    map.layers["bg_b"].y = -ty / 4
  end

  -- get mouse position
  local mx, my = love.mouse.getPosition()
  mx = (mx - scr_ofsx) / scr_scale
  my = (my - scr_ofsy) / scr_scale

  -- get tile gid
  mx = mx + tx
  my = my + ty
  gid = map:getGidByPixel(mx, my, "bg_a")
end

function love.draw()

  -- set canvas
  love.graphics.setCanvas(canvas)

  -- draw BG color
  love.graphics.setColor(0, 0, 0)
  love.graphics.rectangle("fill", 0, 0, scr_w, scr_h)

  -- draw tilemap BG
  love.graphics.setColor(255, 255, 255)
  if scroll_type == 0 then
    map:draw(-tx, -ty)
  elseif scroll_type == 1 then
    for i, layer in ipairs(layers) do
      map:drawLayer(layer)
    end
  elseif scroll_type == 2 then
    map:draw()
  end

  -- unset canvas
  love.graphics.setCanvas()

  -- draw canvas to window
  love.graphics.setColor(255, 255, 255)
  love.graphics.draw(canvas, scr_ofsx, scr_ofsy, 0, scr_scale, scr_scale)

  love.graphics.print("FPS: "..tostring(love.timer.getFPS()), 10, 10)
  love.graphics.print("tx = "..tostring(tx), 10, 40)
  love.graphics.print("ty = "..tostring(ty), 10, 60)
  love.graphics.print("C : scroll type = "..tostring(scroll_type), 10, 80)
  love.graphics.print("R : reset", 10, 100)
  love.graphics.print("ESC : exit", 10, 120)
  love.graphics.print("gid = "..tostring(gid), 10, 160, 0, 2.0, 2.0)

  if love.system.getOS() == "Windows" then
    -- wait
    local cur_time = love.timer.getTime()
    if next_time <= cur_time then
      next_time = cur_time
    else
      love.timer.sleep(next_time - cur_time)
    end
  end
end

function love.keypressed(key, isrepeat)
  -- ESC to exit
  if key == "escape" then
    love.event.quit()
  end
  if key == "c" then
    scroll_type = (scroll_type + 1) % 3
  end
end
  • カーソルキー or WASDキーでスクロール。
  • Rキーで座標を初期化。
  • Cキーで、パララックスの有無の切り替え。
  • マウスカーソル位置のタイル番号が表示される。

実行の仕方は、テキトーなフォルダを作成して、conf.lua、main.lua、mecha_bg_map.lua、tile01.png と、stiフォルダを入れて、「love フォルダ名」で実行。

少し解説。 :

Tiled マップエディタで作成するマップデータには、複数のレイヤーを含めることができる。

全レイヤーを同じ表示位置でスクロールさせてもいいのなら、描画時に以下を指定するだけで済む。
local sti = require "sti"

function love.load()
  map = sti("mecha_bg_map.lua")
end

function love.update(dt)
  map:update(dt)
end

function love.draw()
  map:draw(表示位置x, 表示位置y)
end

各レイヤーの情報にアクセスしたいなら、map.layers["レイヤー名"] でアクセスできる。

各レイヤー(タイルレイヤー)は、以下のような値を持ってる。
  • name : レイヤー名
  • x : 表示位置 x
  • y : 表示位置 y
  • width : 横方向のタイル個数
  • height : 縦方向のタイル個数
他の値は、 _STI Documentation を参考に。

例えば、各レイヤーの表示位置を別々にして、パララックス(視差効果。いわゆる多重スクロール)をしたいなら、以下のように書ける。
map.layers["hoge"].x = -200
map.layers["hoge"].y = -400

map.layers["fuga"].x = -100
map.layers["fuga"].y = -200
このように各レイヤーの表示位置を変更しておけば、描画時は map:draw() を呼ぶだけで済む。map:draw(x, y) のように書かなくていい。

local tilex, tiley = map:convertPixelToTile(x, y) を呼べば、x,yのピクセル座標から、タイル位置を求めることができる。戻り値は小数点以下の値も含んでいるので、math.floor() を使って小数点以下切り捨てをしてから値を使うことになると思う。

タイルマップレイヤーのデータ部分(タイル番号がずらずら並んでる部分)にアクセスしたいなら、以下のような記述になる。
map.layers["レイヤー名"].data[tiley+1][tilex+1]

例えば、
local gid = map.layers["hoge"].data[1][1].gid
と書けば、「hogeという名前のレイヤーの、タイル位置 (0, 0) のタイル番号」を取得できる。Luaの配列は、えてして0ではなく1から始まる点に注意。

タイルレイヤー上の空白部分は、nil で示されているので、
map.layers["hoge"].data[1][1].gid
でタイル番号を取得しようとして、そこが空白だったりすると、nil から .gid を取得しようとしてエラーになってしまう。なので、一旦 map.layers["hoge"].data[1][1] が nil かどうかを調べて、nil なら空白扱いに、nil じゃなければ .gid で取得、といった処理を書かないといけない。

上記のソースでは、以下の部分がタイル番号を取得するメソッドになってる。
  map.getGidByPixel = function(self, x, y, layerindex)
    local tilex, tiley = self:convertPixelToTile(math.floor(x), math.floor(y))
    tilex = math.floor(tilex)
    tiley = math.floor(tiley)
    local layer = map.layers[layerindex]
    local tilew = layer.width
    local tileh = layer.height
    local gid = -2
    if tilex >= 0 and tiley >= 0 and tilex < tilew and tiley < tileh then
      local tile = layer.data[tiley + 1][tilex + 1]
      if tile == nil then
        gid = -1
      else
        gid = tile.gid
      end
    end
    return gid
  end

参考ページ。 :


2017/11/07(火) [n年前の日記]

#1 [anime] ライダーエグゼイド最終回とライダービルド1話、2話を視聴

録画したままだったソレをようやく視聴。

エグゼイドは…なんだか脚本面が凄かったなと…。ずっと少年漫画ノリが続いたというか…。先の展開が全然読めない作品だったなと。自称・神のキャラも良かった…。

ビルド1話は最後のバイク走行シーンでビックリ。よくまあこんな映像作れるなあ…。そういえば1〜2話は田崎監督で、個人的には嬉しいなと。

2話もなんだかすごいところをバイクで走ってる…。デカイのも出てきた…。力入ってるなあ…。

ビルドの壁設定は、進撃の巨人からのインスパイアだろうか…。学者設定は、学者さんが主役らしいドラマがヒットしてたから、そこから発想、なのかな。何にせよ、ライダーシリーズでは見たことない設定なのでイイ感じ、かもしれず。

変身カットが興味深い。人物の前後に複雑な3DCGが入るあたりどうやってるのかなと…。いや、今までもそういうカットがあっただろうけど、改めて考えてみると作り方について悩むというか。1コマずつ手作業で切り抜きとかやってられないだろうし、人物だけグリーンバックの前で撮影、とかだろうか…。別スタジオで撮影するとなるとロケ場所と照明を合わせるのが大変そうだし、であればロケ場所で人物の後ろに大きなグリーンバックを運んできて…。でもそれだとカメラを動かせなくなるか…。背景と人物で2回撮影しないといけないし…。何かノウハウがあるんだろうな…。まさか奥行きも取得できるカメラを導入してるとか…。

などと思って見ていたら、2話で簡易タイプの変身カットが。使い分けしていくのかな…。場所によってはあんな大掛かりな変身できないだろうし、一瞬で変身するカットも必要になるだろうし…。

2017/11/08(水) [n年前の日記]

#1 [ubuntu] サブPCにインストールしてあったUbuntuをアップグレード

TV代わりのディスプレイを置いてあるスチールラック、に入ってる薄型ケースのPCに、Ubuntu 16.04 LTS を入れてあったのだけど。なんとなく Ubuntu 17.04、17.10にアップグレードしてみようかなと。

てなわけでアップグレード作業を始めてみたものの、2時間経っても終わらない…。2.5インチHDDを載せてるから遅いのだろうか。CPU は AMD A6-3500だからそれほど遅くは…。いや…スペックを調べてみたら、遅いほうか…。

6時間ぐらいかかってアップグレードできた。が、無線LAN子機が無反応になった…。こりゃ困った。

面倒臭いから全部消して入れ直すか。こんなことなら 16.04 LTSのままにしておけばよかった。

#2 [dtm] FL Studio を 12.5.1.5 にアップデート

Windows10 x64上で FL Studio を 12.5.1.5 にアップデート。

インストーラを起動したら不正終了。これはまたアレかな、と想像して、MS-IME を Google IME に変更したら起動してくれた。…この症状、ずっと修正されないなあ。まあ、Image-Line が日本語版Windowsを用意できるわけないだろうから、どうせ報告したって「ウチでは動いてる」と言われるのがオチだろうけど。

2017/11/09(木) [n年前の日記]

#1 [ubuntu] 薄型PCにインストールした Linux Mint 18.2 を色々設定中

昨日、薄型PCの Ubuntu 16.04 LTS を 17.04 や 17.10 にアップグレードしたら無線LANが反応しなくなったので、面倒くさいから Linux Mint 18.2 cinnamon版をクリーンインストールしてしまったり。そのあたりの作業をメモ。

USBメモリからインストール。 :

_Download - Linux Mint から、linuxmint-18.2-cinnamon-64bit.iso をDL。今回は Torrent とやらでDLしてみた。

microSDカードリーダ BUFFALO BSCRMSDCBK + microSDHC Team 8GB CLASS10 (KSY008G0MC28PI) に、UNetbootin を使ってインストール。

薄型PCのUSB端子に差して起動。薄型PCは、CPU : AMD A6-3500(3コア, 2.1GHz (最大2.4GHz))、M/B : ASUS F1A75-M。起動デバイスの優先順位を変えてもHDDから起動してしまって悩んだり。優先順位の設定を全部無効にしたら、USBメモリ(というか、microSDカードリーダ)から起動してくれた。

HDD内を全消去する形でインストール。途中で、UEFIブートが云々と尋ねてきたけど…。そこらへんよく分からないので、とりあえずインストールしてしまった。

各種設定。 :

以下の記事を参考にして色々作業。

_Linux Mint 18: インストール後やっておくべき 20 選 | 221B Baker Street

上記の記事で掲載されてる内容をそのままやってるだけだけど、リンク先が消えると困るので一応メモ。

SSHでアクセスできるようにする。 :

sudo aptitude install openssh-server
sudo aptitude instal ssh

/etc/ssh/sshd_config の ClientAliveInterval を設定。
ClientAliveInterval 15

_ssh 接続をタイムアウトしないようにする - maruko2 Note.

byobuをインストール。 :

どうも無線LANがブチブチ切れるので、対策の一つとしてbyobuをインストール。
sudo aptitude install byobu

byobu で実行。万が一回線が切れても、次回また byobu を実行すれば以前のプロセスが復活できる…らしい。

起動時のスプラッシュ画面を非表示に。 :

起動時はテキストがずらずらと表示されるほうが好み。
sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULTの行で、"noquiet nosplash" を指定。

無線LAN子機 IO-DATA WN-G300UA のドライバを変更。 :

IO-DATA WN-G300UA は RTL8192CU チップ搭載品で、一応 Ubuntu等に差せば認識はしてくれるのだけど、ドライバがおかしいそうで、接続がブチブチ切れる。github で公開されてるソレを導入して改善させる。

_pvaret/rtl8192cu-fixes: Realtek 8192 chipset driver, ported to kernel 3.11.
_RTL8192cu fix, works on recent Linux kernels (3.x and 4.x)

sudo apt-get update
sudo apt-get install git linux-headers-generic build-essential dkms
git clone https://github.com/pvaret/rtl8192cu-fixes.git
sudo dkms add ./rtl8192cu-fixes
sudo dkms install 8192cu/1.10
sudo depmod -a
sudo cp ./rtl8192cu-fixes/blacklist-native-rtl8192.conf /etc/modprobe.d/
sudo reboot

iwconfig と打てば、無線LAN子機の状態が分かる。デフォルトでは 150Mb/s と表示されてたけど、上記作業を行った 300Mb/s と表示された。

ただ、コレでも時々切れる。この製品、ちとダメダメだと思います。

sambaをインストール。 :

sudo aptitude install samba

共有フォルダを作っておく。
sudo mkdir /home/pub
sudo chown nobody:nogroup /home/pub
sudo chmod 777 /home/pub

設定ファイルを修正。
sudo vi /etc/samba/smb.conf

[global]
   dos charset = CP932
   unix charset = UTF-8
   workgroup = (Windowsネットワークのワークグループ名を指定)
   server string = %h server (Samba, Ubuntu, Core2Duo-ATX)

   domain master = no
   local master = no
   preferred master = no
   os level = 0

   guest account = nobody
   unix password sync = no

   (中略)

[homes]
   comment = Home Directories
   browseable = no
   create mask = 0700
   directory mask = 0700

[pub]
   path = /home/pub
   comment = Public Space for Everyone
   read only = no
   public = yes
   force create mode = 0666
   force directory mode = 0777
   guest ok = yes
   guest only = yes
   hosts allow = 192.168.1.

testparm と打って設定ファイルにエラーがないことを確認してから samba再起動。
systemctl restart smbd
systemctl restart nmbd

sambaにユーザを追加してパスワードを設定。
sudo smbpasswd -a ユーザ名

Windows機から、ping 薄型PCのホスト名、と打って反応が返ってきたらインストールできてる。

フォントをインストール。 :

sudo aptitude install fonts-mplus fonts-migmix fonts-mmcedar fonts-umeplus fonts-motoya-l-maruberi fonts-motoya-l-cedar fonts-horai-umefont fonts-ipafont-gothic fonts-ipafont-mincho

壁紙をインストール。 :

sudo apt-get install mint-backgrounds-* ubuntu-wallpapers-* ubuntustudio-wallpapers xubuntu-community-wallpapers-xenial

日本語化。 :

wget -q http://packages.linuxmint-jp.net/linuxmint-ja-archive-keyring.gpg -O- | sudo apt-key add -
sudo wget http://packages.linuxmint-jp.net/sources.list.d/linuxmint-ja.list -O /etc/apt/sources.list.d/linuxmint-ja.list
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install mint-gnome-ja --install-recommends
sudo apt-get install fcitx-mozc

ただ、コレをやると、ソフトウェアリソースを起動してアレコレした際に、「〜による署名は弱い digestアルゴリズム(SHA1)を使用しています」という警告が出てしまう。なんでも、Ubuntu 16.04以降は、gpg鍵なるものをSHA2にしたそうで、しかし各リポジトリは相変わらずSHA1のままだから、警告が出てしまうらしい。

_Linux Mint Japan 日本語フォーラム ・ トピック - パケットマネジャーの更新について

linuxmint-jp だか _Linux Mint Japan だかが対応してくれないと解決しないらしいけど、今年の頭から放置状態っぽい。

Google Chromeのインストール。 :

echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee -a /etc/apt/sources.list && wget https://dl.google.com/linux/linux_signing_key.pub && sudo apt-key add linux_signing_key.pub && sudo apt-get update && sudo apt install google-chrome-stable

コーデックのインストール。 :

sudo apt-get install ubuntu-restricted-extras libavcodec-extra
sudo apt-get install libdvd-pkg

ハードウェア情報を調べる。 :

sudo apt-get install hardinfo

blenderをインストール。 :

sudo add-apt-repository ppa:thomas-schiex/blender
sudo apt update && sudo apt install blender

grub-customizerをインストール。 :

sudo add-apt-repository ppa:danielrichter2007/grub-customizer
sudo apt-get update
sudo apt-get install grub-customizer

mint cinnamon から mint mate や mint xfce に変更。 :

sudo aptitude install mint-meta-mate
sudo aptitude install mint-meta-xfce

シャットダウン時に待たされる症状を緩和。 :

以下を参考に作業。

_【Ubuntu】シャットダウンが遅い | Jの戯言
sudo vi /etc/systemd/system.conf

以下を追加。(コメントアウトされてるので有効化して秒数を変更)
DefaultTimeoutStopSec=10s

IPv6無効化。 :

sudo vi /etc/sysctl.conf
以下を追加。
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

以下で反映。
sudo sysctl -p

grub側でも指定。
sudo vi /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 noquiet nosplash"

grubの修正内容を反映。
sudo update-grub

vncをインストール。 :

sudo aptitude install vnc4server
sudo aptitude install x11vnc
vncserver :1
vncserver -kill :1

~/.vnc/xstartup を弄って色々試してるけど、どうも xfce を正常に起動できない…。いや、起動はするのだけど、毎回「初めてのアクセスだからパネル設定はどうする? デフォルトにする? 空にする?」と尋ねてきて初期化されてしまう。デスクトップ画面のソレをそのまま使いたいのだけど…。

まあ、以下を実行して、ホスト名:5900 にアクセスすれば目的は果たせるのだけど。
x0vncserver -display :0 -passwordfile ~/.vnc/passwd

一番最後に
startxfce4 &
と書いてあれば xfce4 になるのとちゃうんか…。

コレが mate なら問題なさそうな感じで動くのだけど。
mate-session &
Linux Mint はmateが標準らしいから、ソレに合わせておくのが無難なのかな?

xfceを利用しようとすると画面がおかしくなるのは、どうもバグっぽい気配が。

_How do I get the Mint xfce desktop via VNC? - Linux Mint Forums

2017/11/10(金) [n年前の日記]

#1 [ubuntu] Linux Mint 18.2にLXDEをインストールしてみたり

薄型PCにインストールした Linux Mint 18.2 Cinnamon上に、LXDEをインストールしてみたり。vncでアクセスする際にLXDEを使えば設定が楽かなと。

何を入れればいいのかよく分からんけど、とりあえずググって各記事を眺めて、以下をインストール。
sudo aptitude install lxde lxde-common lxsession-logout lxsession-default-app lxtask

~/.vnc/xstartup は以下のような感じに。日本語入力には ibus-anthy を使う。
#!/bin/sh

# Uncomment the following two lines for normal desktop:
#unset SESSION_MANAGER
#unset DBUS_SESSION_BUS_ADDRESS
#exec /etc/X11/xinit/xinitrc

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources

xsetroot -solid grey

# export XKL_XMODMAP_DISABLE=1
export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus
ibus-daemon -dxr

# x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
# x-window-manager &

# exec xfce4-session &
# startxfce4 &
# mate-session &

lxsession -s LXDE &
vncconfig -iconic &

vncを起動してアクセスしてみたら画面が表示された。が、ログを見るとエラーが出ているような。
$ cat ~/.vnc/hoge\:1.log
(中略)
error opening security policy file /etc/X11/xserver/SecurityPolicy
Could not init font path element /usr/X11R6/lib/X11/fonts/Type1/, removing from list!
Could not init font path element /usr/X11R6/lib/X11/fonts/Speedo/, removing from list!
Could not init font path element /usr/X11R6/lib/X11/fonts/misc/, removing from list!
Could not init font path element /usr/X11R6/lib/X11/fonts/75dpi/, removing from list!
Could not init font path element /usr/X11R6/lib/X11/fonts/100dpi/, removing from list!
** Message: main.vala:99: Session is LXDE
** Message: main.vala:100: DE is (null)
** Message: main.vala:110: No desktop environnement set, fallback to LXDE
** Message: main.vala:131: log directory: /home/mieki256/.cache/lxsession/LXDE
** Message: main.vala:132: log path: /home/mieki256/.cache/lxsession/LXDE/run.log

フォントが足りないのかなと以下を入れてみた。
sudo aptitude install xfonts-100dpi xfonts-100dpi-transcoded xfonts-75dpi xfonts-75dpi-transcoded xfonts-intl-japanese xfonts-intl-japanese-big xfonts-mplus xfonts-naga10 xfonts-shinonome
ログに変化は無かった。

ググってみたところ、/etc/X11/xorg.conf でフォントの場所が指定されてるので、存在しない場所は該当行をコメントアウトすべし、と説明されてたけど…。Linux Mint 18.2 (Ubuntu 16.04) は、xorg.conf が無い。するとどこでフォントの場所が指定されているのか…。

フォント自体は、/usr/share/fonts/X11/ にあるようだけど…。リンクを張って各フォルダがあるように見せかけてみる。
sudo mkdir /usr/X11R6
sudo mkdir /usr/X11R6/lib
sudo mkdir /usr/X11R6/lib/X11
sudo ln -s /usr/share/fonts/X11 /usr/X11R6/lib/X11/fonts
*/speedo 以外のエラーは消えてくれた。

#2 [dtm] FL StudioのVSTスキャンが遅い

先日インストールした、FL Studio 12.5.1.5 を起動して VSTのスキャンを始めてみたら、終わる気配が無くて。

どうもVSTの詳細情報を取得するような仕様になったことで、時間がかかるようになったらしい…?

#3 [movie] 「G.I.ジョー」実写映画版を視聴

録画したまま見れてなかったのだけどようやく視聴。

こういう設定だったのか…。いや、映画用に作った設定なのだろうけど。

映像は凄かった。3DCG万歳。ただ、砂漠の上で飛行機が飛んでる図は、なんだかリアルさがないというか…。飛行機が鏡面仕上げっぽいソレだからウソっぽく見えたのだろうか。まあ、全編ウソっぽい設定だらけなので、気にしてもアレだけど。

2017/11/11() [n年前の日記]

#1 [lua][love2d] love2dで音を鳴らそうとしているけれど

love2dを使ってサウンドを再生できそうか試しているのだけど。

Windows10 x64 + love2d ならスンナリと ogg が再生できたものの、Raspberry Pi Zero W で試すと、再生状態を調べる or 再生しようとするだけでアプリが落ちてしまう。うーん。

gopherrun が mp3 を再生できているのだから、SDL2のビルドは問題ないのでは、と思っているけど…。いや待て。考えてみたら gopherrun が使ってるのは SDL2_mixer なのかな…。

2017/11/12() [n年前の日記]

#1 [lua][love2d] love2dで音を鳴らせるのか動作確認中

Ubuntu 16.04 LTSをインストールしてあるサブPC上で love2d を動かしてみたけど、そちらだと mp3 も ogg も鳴るなと…。いや、wav だけは変なエラーを出して鳴らないけど。なんでや。

何にせよ、Rspberry Pi上の love2d のサウンド関係がおかしい、ということになりそうだなと。だって Ubuntu上では音が鳴るのだし。

VirtualBoxx + Debian stretch 上でも動作確認。 :

raspbian は Debian を元にしてるらしいので、Ubuntu より Debian で動作確認したほうがいいのかなと思えてきて。ということで、VirtualBox上で Debian stretch をインストールして動作確認。

_Debian インストールCD/DVDイメージ - cdimage.debian.or.jp から、「PC/サーバー用DVDイメージ (64ビット)」、debian-9.2.1-amd64-DVD-1.iso をDL。MATE と xfce をインストール。

Debian stretch上だと、wav も mp3 も ogg も鳴ってくれた。

するとどうして Ubuntu上で wav が鳴らないのだろう…。

VirtualBox上ではOpenGL関係のエラーが出る。 :

VirtualBox上で love2d を動かすと、おそらく OpenGL関係のエラーが出るようで。love と打って実行しただけでも以下のメッセージが表示される。
OpenGL Warning: glXChooseVisual: bad attrib=0x20b2, ignoring
まあ、警告だから、気にしなくてもいいのかな…。でも気になる…。

VMware上で試してみるか…。VirtualBox上のソレは削除。

2017/11/13(月) [n年前の日記]

#1 [pc][love2d] VMwareにDebian stretchをインストール

動作確認用として、Debian stretch を VMware上にインストールしてみた。環境は Windows10 x64 + VMware。

Debianをインストール。 :

_Debian インストールCD/DVDイメージ - cdimage.debian.or.jp から、「PC/サーバー用DVDイメージ (64ビット)」、debian-9.2.1-amd64-DVD-1.iso をDL。

VMware上で新規仮想マシンを作成。メモリは2GB。仮想HDDのサイズは16GB。ちなみに、Debianの最低推奨スペックは10GBらしい。

「Graphical install」ではなく「Install」を選択して作業を進めていった。途中の tasksel 画面で、xfce、sshサーバを選択。プリントサーバを非選択。

インストール終了後、再起動したらrootでログイン。設定をしていく。

パッケージを最新にする。 :

パッケージを最新に更新。

apt edit-sources または nano /etc/apt/source.list をして、以下を追加。
deb http://ftp.jp.debian.org/debian/ stretch main contrib non-free
deb-src http://ftp.jp.debian.org/debian/ stretch main contrib non-free

更新。
apt update
apt upgrade

ついでに、普段使っていて慣れている aptitude もインストール。
apt install aptitude

sudoの設定。 :

rootになって作業するのはなんだか怖いので、sudo をインストール。
apt install sudo

visudo で設定ファイルを編集できる。以下を追加。
ユーザ名 ALL=(ALL) ALL

ビルド用のアレコレをインストール。 :

sudo aptitude install build-essential linux-headers-amd64

VMware用のアレコレをインストール。 :

VMware用のビデオドライバ + クリップボードやファイルの共有を可能にする、open-vm-tools をインストール。
sudo aptitude install open-vm-tools open-vm-tools-dkms open-vm-tools-desktop

起動時にテキストで情報をずらずらと表示したい。 :

sudo vi /etc/default/grub

quiet を、noquiet nosplash に修正して更新。
sudo update-grub

ifconfigが見当たらない。 :

sudo aptitude install net-tools

/sbin/ifconfig で実行。

ip addr でもIPアドレスは確認できる。

ユーザフォルダ内の各フォルダを日本語名から英語名に変更。 :

sudo apt-get install xdg-user-dirs-gtk
LANG=C xdg-user-dirs-gtk-update

サウンド再生用のツールをインストール。 :

sudo aptitude install mpg321 vorbis-tools flac

xscreensaverをインストール。 :

sudo aptitude install xscreensaver xscreensaver-data-extra xscreensaver-gl xscreensaver-gl-extra xscreensaver-screensaver-bsod xscreensaver-screensaver-dizzy xscreensaver-screensaver-webcollage

自動起動に以下を追加。しようと思ったら追加されてた。
xscreensaver -nosplash

他の作業。 :

ipv6を無効化したり、sambaをインストールしたり。

love2dをインストール。 :

sudo aptitude install love
love

しかしコレだと古いバージョンがインストールされる。最新版をインストールしたい。

SDL2関係をインストール。
sudo apt remove love
sudo aptitude search sdl2
sudo aptitude install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev libsdl2-ttf-dev libsdl2-gfx-dev

_Building LOVE (日本語) - LOVE に従って作業。
# sudo apt install liballegro4.4 libdevil1c2 libluajit-5.1-2 libluajit-5.1-common libopenal-data libopenal1 libphysfs1
# sudo aptitude install lua50 lua5.1 lua5.2 lua5.3 luajit

sudo aptitude install liblua5.1-dev
sudo aptitude install build-essential autotools-dev automake libtool pkg-config libdevil-dev libfreetype6-dev libluajit-5.1-dev libphysfs-dev libsdl2-dev libopenal-dev libogg-dev libvorbis-dev libflac-dev libflac++-dev libmodplug-dev libmpg123-dev libmng-dev libturbojpeg0 libtheora-dev

mkdir packages
cd packages
wget https://bitbucket.org/rude/love/downloads/love-0.10.2-linux-src.tar.gz
tar zxvf love-0.10.2-linux-src.tar.gz
cd love-0.10.2
./configure
make
sudo make install

love2dの動作確認をしてみたけれど、サウンドは、wav、ogg、mp3、どれも鳴ってくれた。

2017/11/14(火) [n年前の日記]

#1 [raspberrypi][lua][love2d] Raspberry Pi Zero W + love2dで音が鳴らせなくてハマっていたり

Raspberry Pi Zero W + love2d で音が鳴らせなくてハマっていたり。環境は、raspbian stretch。

公式リポジトリ版の SDL2 + love2d なら音が鳴るのかなと疑問が湧いたので試してみたのだけど、公式リポジトリ版も音は鳴らなかった。トホホ。

自分でSDL2をビルドする際に、--disable-pulseaudio をつけないでビルドしたら、pulseaudio が無効にならずに音が鳴ってくれるのでは、と期待して外してビルドしてみたけどこれまた変化なし。love2dのビルドまで含めて5時間ぐらいかかったのに…。トホホ。

公式リポジトリ版ですら音が鳴らないということは、どうも raspbian stretch上では love2d も SDL2 も音が鳴らない状態のまま放置されているのでは、という不安がムクムクと。色々ググってみても、どの情報も raspbian stretch の前の版、raspbian jesiie での話ばかりなわけで。

公式リポジトリ版のSDL2とlove2dのインストール方法。 :

まずは自分でビルドした版をアンインストール。SDL2 や love2d をビルドしたディレクトリに入って。
sudo make uninstall

全部終わったら、公式版をインストール。
sudo aptitude install libsdl2-2.0-0 libsdl2-dev libsdl2-gfx-1.0-0 libsdl2-gfx-dev libsdl2-image-2.0-0 libsdl2-image-dev libsdl2-mixer-2.0-0 libsdl2-mixer-dev libsdl2-net-2.0-0 libsdl2-net-dev libsdl2-ttf-2.0-0 libsdl2-ttf-dev
sudo aptitude install love

公式版はOpenGLを使うことが前提のバイナリになってるので、Raspberry Pi Zero W上で GL driver を有効にして、OpenGLを使えるようにする。公式には、Pi Zero系でGL driverはサポートされてないし、使おうとすると動作が不安定になるけれど、有効にできないわけでもない。
sudo raspi-config

Advanced Oprions -> GL Driver。以下の3つが出てくるので、G1 か G2 を選ぶ。今回、G1を選んだら、aplay hoge.wav ですら音が出なくなったので、G2を選んだ。
G1 GL (Full KMS) OpenGL desktop driver with full KMS
G2 GL (Fake KMS) OpenGL desktop driver with fake KMS
G3 Legacy        Original non-GL desktop driver
「 The xxxx KMS GL driver is enabled.」と表示される。

Finish を選ぶと「Reboot(再起動)するか?」と尋ねてくるけど「いいえ」を選んで、/boot/config.txt を編集。
sudo vi /boot/config.txt

以下のように、cma-128 を追加する。
dtoverlay=vc4-fkms-v3d
↓
dtoverlay=vc4-fkms-v3d,cma-128
dtoverlay=vc4-kms-v3d
↓
dtoverlay=vc4-kms-v3d,cma-128

sudo reboot で再起動。OpenGL が有効になった状態で起動してるか動作確認。
glxgears
ギアが表示されて、正常な色と、それなりのフレームレートで動いてくれたら、上手く行ってる。

音が鳴るか確認。
aplay hoge.wav
鳴らないなら、以下を参考にして設定を見直す。

_R-Pi Troubleshooting - eLinux.org
_とりあえずこれだけ知っておけばなんとかなるRaspberry Piのオーディオ設定 - mattintosh note

で。既に書いたけど、この状態でも love2dで音は鳴らなかった。残念。

retropie-setupを利用しようとしたけれど。 :

_RetroPie/RetroPie-Setup

$ git clone --depth=1 https://github.com/RetroPie/RetroPie-Setup.git
$ cd RetroPie-Setup
$ sudo ./retropie_setup.sh sdl2

Sorry - Raspbian/Debian Stretch (and newer) is not yet supported on the RPI

Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 9.1 (stretch)
Release:        9.1
Codename:       stretch
raspbian stretch は対応してねえよと言われてしまった…。

2017/11/15(水) [n年前の日記]

#1 [raspberrypi][love2d] piloveを試用

Raspberry Pi上で love2d を動かすことに特化した、pilove というSDカードイメージがあるようで。

_PiLove - LOVE on RaspberryPI

もし、コレを使って音が鳴れば、少なくとも Raspberry Pi Zero W + love2d で音が鳴る状態にすることは不可能ではない、てなことぐらいは分かるかもしれないなと思えてきたので試用してみようかなと。

インストール方法。 :

公式サイト上には、pilove 0.3 のリンクしかないけれど、 _Index of /downloads には 0.4 が置いてあったので、pilove 0.4 (pilove-0.4.img.gz)をDL。変更履歴は、 _pilove/changelog.txt に書いてある。

解凍すると、中には .img ファイルが入ってた。

Windows10 x64 + _Win32 Disk Imager 1.0.0 を使って、.imgファイルを microSDに書き込む。今回は、Team製 8GB の microSDHC に書き込んでみた。

Raspberry Pi Zero W に microSDHC を差して起動。デフォルトユーザ名は sysop。パスワードは posys。

love2dの動作確認。 :

/usr/local/games/love-0.10.2/src/love を実行。

パーミッションが違うと怒られた。覗いてみたら、所有者について sysop と root が混在してる。とりあえず変更してみる。
cd /usr/local/games/love-0.10.2/src
sudo chown sysop:sysop *
sudo chown sysop:sysop ./.*

一々場所を指定して起動するのは面倒臭いので alias に登録。~/.bashrc に追記しておく。
nano ~/.bashrc
alias love='/usr/local/games/love-0.10.2/src/love'

あるいは、該当の場所まで PATH を通すとか。
export PATH=$PATH:/usr/local/games/love-0.10.2/src

一応、何も指定しないで love を実行したら、例の画面は表示された。

問題点。 :

現状では、Raspberry Pi Zero W の WiFi(無線LAN)が使えない。pilove は、raspbian jessie を元にして構築してあるらしいけど…。無線LAN関係は入ってないのか…。

LAN端子を備えた Raspberry Pi1 / Pi2 / Pi3 ならどうにかなるのかもしれないが、無線LANしかついてない Raspberry Pi Zero W では外部からアクセスしようがない。となると、love2d用のソースも、画像ファイルも、サウンドファイルも転送できない。これでは動作確認すら満足にできない…。結局音は鳴るのか、鳴らないのか。これでは分からん…。

#2 [raspberrypi] Raspberry Pi Zero Wにraspbian jessieをインストール

piloveをビルドできないか試したくなってきたので、raspbian jessie を Raspberry Pi Zero W上にインストール。ちなみに、raspbian の現行版は stretch。一つ前の版が jessie。

raspbian jessieを入手。 :

raspbian jessie を入手しようとしたものの、公式サイト上では見つからず。

_Raspberry Pi Downloads - Software for the Raspberry Pi

しかし、JAISTのサーバに raspbian jessie が残ってた。

_Index of /pub/raspberrypi/raspbian_lite/images/raspbian_lite-2017-07-05
_Index of /pub/raspberrypi/raspbian/images/raspbian-2017-07-05

2017-07-05-raspbian-jessie.zip をDLして解凍。中に入ってた .img を Win32 Disk Imager を使って microSDHC (Team製 8GB)に書き込み。Raspberry Pi Zero W に差し込んで起動。すんなり起動してくれた。

色々設定。 :

画面解像度、ホスト名、ロケール等を設定。piユーザのパスワードも変更。
sudo raspi-config

rootのパスワード変更 + ユーザを追加。以下を参考に作業。

_RaspberryPiをRaspbianで使う場合の初期設定メモ(ユーザ追加) - Qiita

sudo passwd root
sudo adduser 新規ユーザ名
sudo gpasswd -a 新規ユーザ名 sudo
sudo gpasswd -d pi sudo

sudo nano /etc/sudoers.d/010_pi-nopasswd
or
sudo nano /etc/sudoers
pi ALL=(ALL) NOPASSWD: ALL をコメントアウトして、piユーザが root になれないようにする。

usermod を使って、新規ユーザを各グループに登録
$ groups pi
pi : pi adm dialout cdrom audio video plugdev games users input netdev spi i2c gpio

$ sudo usermod -aG sudo,pi,adm,dialout,cdrom,audio,video,plugdev,games,users,input,netdev,spi,i2c,gpio 新規ユーザ名

$ groups 新規ユーザ名
新規ユーザ名 : 新規ユーザ名グループ adm dialout cdrom sudo audio video plugdev games users input netdev pi spi i2c gpio

リポジトリのURLを変更。 :

デフォルト設定だとアクセスが遅かったので、日本のミラーサーバのURLに変更。今回は JAIST を利用させてもらうことに。
sudo nano /etc/apt/sources.list

以下を追加して、元々のURLはコメントアウト。
deb http://ftp.jaist.ac.jp/raspbian/ jessie main contrib non-free rpi

apt-get でパッケージ等を更新。
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo rpi-update

フォントのインストール。 :

sudo aptitude install fonts-ipafont fonts-ipaexfont fonts-takao fonts-mplus fonts-migmix fonts-mmcedar fonts-umeplus fonts-motoya-l-maruberi fonts-motoya-l-cedar fonts-horai-umefont

sudo aptitude install xfonts-mplus ttf-kochi-gothic-naga10 ttf-kochi-mincho-naga10 xfonts-naga10 xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xfonts-shinonome
xfonts-* は、今時は要らないかも。

日本語フォルダ名を英語フォルダ名に変更。 :

/home/pi/ 以下に日本語のフォルダ名がずらずら並んでるけど、CUIで作業する際に指定が面倒臭い。英語名にする。
sudo apt-get install xdg-user-dirs-gtk
LANG=en_GB.utf8 xdg-user-dirs-gtk-update
LANG=C ではなくて LANG=en_GB.utf8 であることに注意。

しかし、上手く行かない。以下ならなんとかなった。ただし、古い日本語フォルダ名が残ってしまって、それらは自分で削除しないといけなかった。
LANG=en_GB.utf8 xdg-user-dirs-update --force

_Ubuntu のデスクトップ環境のフォルダ名を日本語から英語にする - Qiita

自動ログイン設定の変更。 :

piユーザではなく、新規ユーザで自動ログインするようにしたい。
sudo vi /etc/lightdm/lightdm.conf
[SeatDefaults]
autologin-user=ユーザ名
autologin-user-timeout=0

_Debian Jessie Wheezy 自動ログイン lightdm系 ? Linux. リナックス. ヒト ノ タメ ノ.

IPv6無効化。 :

sudo nano /etc/sysctl.conf

以下を追加。
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

sudo sysctl -p を実行して反映。

_[Raspbian] IPv6を無効にする方法(Raspbian Jessie Lite) - Life with IT

sshの接続が切れないように設定。 :

/etc/ssh/sshd_config の ClientAliveInterval を設定。
sudo nano /etc/ssh/sshd_config
ClientAliveInterval 15

vim をインストール。 :

sudo aptitude install vim
sudo aptitude install vim-nox

vimの設定変更。せめてソースコードの色付けぐらいはする。
vi ~/.vimrc
syntax on

サウンド再生や変換用ツールをインストール。 :

sudo aptitude install mpg321 mpg123 vorbis-tools flac sox libsox-fmt-mp3 libsox-fmt-all

wav, mp3, ogg の再生は以下。
aplay hoge.wav
mpg123 hoge.mp3
ogg123 hoge.ogg

でも、sox に入ってる play を使えば大体のフォーマットは再生できる模様。mp3は再生できなかったが、libsox-fmt-mp3 をインストールしたら再生できるようになった。
play hoge.flac
play hoge.wav
play hoge.ogg
play hoge.mp3

_Debian User Forums - View topic - Can't play mp3 files with play (sox)
_SoX(Sound eXchange)でMP3を扱う

microSDHCの速度測定。 :

sudo aptitude install hdparm
sudo hdparm -t /dev/mmcblk0

piloveをビルドしようと試みたが失敗。 :

ここまでやっておいてアレだけど、raspbian jessie 上では、pilove をビルドできなかった。

_skarbat/pilove: Love2D on the Raspberry PI

「Intelベースシステム、QEmu, NBDドライバ、xsysrootツールが必要」と書いてある。Raspberry Pi 実機で作るわけではなかったのか…。しかも pipaOS がどうのこうのと書いてある。なんやねん。そのOS。

retropie-setupを利用してSDL2をインストールしようと試みたが失敗。 :

piloveがダメなら、retropie-setup はどうだろう。

_RetroPie/RetroPie-Setup: Shell script to set up a Raspberry Pi/Odroid/PC with RetroArch emulator and various cores

mkdir retropie-setup
cd retropie-setup
git clone https://github.com/RetroPie/RetroPie-Setup.git
cd /RetroPie-Setup
sudo ./retropie_setup.sh sdl2
なんだかよく分からないメニュー画面が出てきた。SDL2だけをビルドしてくれるわけではナサゲ。

#3 [raspberrypi][love2d] raspbian jessie上でSDL2とlove2dをビルド

pilove も retropie-setup も raspbian jessie 上で動かせなかったので、仕方なく以前と同様の手順でビルド。SDL2は OpenGL を無効にしてビルドすることで、Raspberry Pi の OpenGL ES を使って描画できるようにする。

SDL2のビルド。 :

_Golang と SDL2 でゲームを作る - KaoriYa
_SDL2-2.0.6 on Raspberry Pi - ChoccyHobNob

sudo aptitude install automake build-essential mercurial qt5-default libtool libasound2-dev libaudio-dev libesd0-dev libsndfile1-dev libmodplug-dev libopenal-dev libfontconfig1-dev libpango1.0-dev freeglut3-dev libfreeimage-dev libjpeg-dev libtiff5-dev libwebp-dev libxcursor-dev libxi-dev libxrandr-dev libxss-dev libudev-dev libsmpeg-dev libxinerama-dev
mkdir ~/sdl2
cd ~/sdl2
wget https://www.libsdl.org/release/SDL2-2.0.5.tar.gz
tar xzf SDL2-2.0.5.tar.gz
cd SD2-2.0.5
mkdir build && cd build

configure をする段階で、--host=arm-raspberry-linux-gnueabihf をつけたり外したりしてみた。
../configure --disable-pulseaudio --disable-esd --disable-video-mir --disable-video-wayland --disable-video-x11 --disable-video-opengl

SDL2 Configure Summary:
Building Shared Libraries
Building Static Libraries
Enabled modules : atomic audio video render events joystick haptic power filesystem threads timers file loadso cpuinfo assembly
Assembly Math   :
Audio drivers   : disk dummy oss alsa(dynamic) nas(dynamic)
Video drivers   : dummy opengl_es2
Input drivers   : linuxev linuxkd
Using libudev   : YES
Using dbus      : YES
Using ime       : YES
Using ibus      : NO
Using fcitx     : NO
../configure --host=arm-raspberry-linux-gnueabihf --disable-pulseaudio --disable-esd --disable-video-mir --disable-video-wayland --disable-video-x11 --disable-video-opengl

SDL2 Configure Summary:
Building Shared Libraries
Building Static Libraries
Enabled modules : atomic audio video render events joystick haptic power filesystem threads timers file loadso cpuinfo assembly
Assembly Math   :
Audio drivers   : disk dummy oss alsa(dynamic) nas(dynamic)
Video drivers   : rpi dummy opengl_es1 opengl_es2
Input drivers   : linuxev linuxkd
Using libudev   : YES
Using dbus      : YES
Using ime       : YES
Using ibus      : NO
Using fcitx     : NO

どうやら、--host=arm-raspberry-linux-gnueabihf をつけて configure しないと、Video driver に rpi が出てこない模様。このオプションは必須っぽいな…。

ちなみに、「--disable-video-mir --disable-video-wayland --disable-video-x11 --disable-video-opengl」の指定で、OpenGL を無効にしているらしい。

raspbian jessie ではなく、raspbian stretch + SDL2-2.0.5 で configure した場合の結果は以下。
../configure --host=arm-raspberry-linux-gnueabihf --disable-pulseaudio --disable-esd --disable-video-mir --disable-video-wayland --disable-video-x11 --disable-video-opengl

SDL2 Configure Summary:
Building Shared Libraries
Building Static Libraries
Enabled modules : atomic audio video render events joystick haptic power filesystem threads timers file loadso cpuinfo assembly
Assembly Math   :
Audio drivers   : disk dummy oss alsa(dynamic) nas(dynamic) sndio
Video drivers   : rpi dummy opengl_es1 opengl_es2
Input drivers   : linuxev linuxkd
Using libudev   : YES
Using dbus      : YES
Using ime       : YES
Using ibus      : YES
Using fcitx     : NO

raspbian jessie上で configure した時と違って、Audio に、sndio というのがついてる。libsndio-dev をアンインストールしたほうがいいのかな。
sudo aptitude remove libsndio-dev

libsndio-dev をアンインストールした状態で configure すると以下になった。
SDL2 Configure Summary:
Building Shared Libraries
Building Static Libraries
Enabled modules : atomic audio video render events joystick haptic power filesystem threads timers file loadso cpuinfo assembly
Assembly Math   :
Audio drivers   : disk dummy oss alsa(dynamic) nas(dynamic)
Video drivers   : rpi dummy opengl_es1 opengl_es2
Input drivers   : linuxev linuxkd
Using libudev   : YES
Using dbus      : YES
Using ime       : YES
Using ibus      : YES
Using fcitx     : NO

makeしてインストール。
make
sudo make install

love2dをビルド。 :

各ページを眺めながら、必要になりそうなパッケージを列挙してインストール。

_Building LOVE (日本語) - LOVE
sudo aptitude install build-essential pkg-config libfreetype6-dev libopenal-dev libvorbis-dev libtheora-dev libmpg123-dev libluajit-5.1-dev libphysfs-dev libmodplug-dev

sudo aptitude install autotools-dev automake libtool libdevil-dev libogg-dev libflac-dev libflac++-dev libmng-dev

# raspbian jessie
sudo aptitude install libturbojpeg1-dev

# raspbian stretch
sudo aptitude install libturbojpeg0-dev

_pilove/build-love2d.sh at master - skarbat/pilove
sudo aptitude install build-essential pkg-config libfreetype6-dev libopenal-dev libvorbis-dev libtheora-dev libmpg123-dev libluajit-5.1-dev libphysfs-dev libmodplug-dev

sudo aptitude install devscripts git-core debhelper dh-autoreconf libasound2-dev libudev0 libudev-dev libdbus-1-dev libx11-dev libxcursor-dev libxext-dev libxi-dev libxinerama-dev libxrandr-dev libxss-dev libxt-dev libxxf86vm-dev libgl1-mesa-dev libpulse-dev libibus-1.0-dev pulseaudio libraspberrypi-dev

love2d 0.10.2 の Linux用ソースをDLしてビルドする。
mkdir ~/love2d
cd ~/love2d
wget https://bitbucket.org/rude/love/downloads/love-0.10.2-linux-src.tar.gz
tar zxf love-0.10.2-linux-src.tar.gz
cd love-0.10.2
./configure
make
sudo make install

動作確認の結果。 :

love で実行。例の画面が出た。

サウンドを鳴らすソースを与えて動作確認してみた。以下のような警告が表示されたものの、音が鳴った。…やった! 鳴ったぞ! ようやく音が聞こえたわ…。
AL lib: (WW) alc_initconfig: Failed to initialize backend "pulse"

つまり、raspbian jessie上で SDL2 や love2d をビルドする分には、ちゃんと音が鳴ることが分かった。Raspberry Pi + love2d は音が鳴らない、というわけではないらしい。

しかし、raspbian stretch でやると音が鳴らないわけで…。SDL2、もしくはlove2dは、raspbian stretch に未対応ということだろうか? love2d を使いたいなら、raspbian jessie を使うしかない?

それとも pulseaudio が絡んでたりするのだろうか。例えば pilove の公式サイト上に書いてあるとおりに、
pulseaudio --start
とやってから love2d を動かすと、音が鳴らなくなるし…。
pulseaudio --kill
とやってから再度試したら音が鳴ったし…。

pulseaudio ってそもそも何なのでしょうか。ググって各説明ページを眺めてみてもピンとこない。Linuxのサウンドシステム関係はよく分からんなあ…。いや、Windowsのサウンド関係もちゃんと分かってるわけでもないけれど。

raspbianはバージョンによってpulseaudioの扱いが違う。 :

raspbian関係の記事をググってたら気になる話が。raspbian jessie までは、Bluetooth から音を鳴らすために標準で pulseaudio がインストールされていたけど、raspbian stretch では別の何かを使って Bluetooth から音を鳴らせるようになったので pulseaudio は標準でインストールされていないらしい。

_Raspbian StretchではPulseaudioを使わなくなったのでxrdpのサウンドをどうするか思案中
_Raspbian Stretch has arrived for Raspberry Pi - Raspberry Pi

そのあたりが関係してるのかな…。

#4 [raspberrypi] microSDを抜き差ししやすいaspberry Pi Zero W用のケースが欲しい

今現在、Raspberry Pi Zero W のケースとして、 _公式の白と赤の例のケース を使ってるけど。microSDを差し替えるのが面倒臭い。
  1. 一旦ケースの蓋を外して
  2. ケースから基板を取り出して
  3. microSDを差し替えて
  4. またケースに基板をはめ込んで
  5. 蓋をして…。
面倒臭い。特に、ケースにハメ込んである基板をグリグリ引っ張り出すのが面倒臭い。

基板をケースに入れたまま microSD を差し替えられるケースって無いのかな…。

ググった感じでは、種類は少ないけど一応ありそうな気配も。でも、見た目は差し替え可能なように見えつつも、実際には差し替えが容易ではない、的な罠がありそうな気配も。そもそも入手性もアレだし。

まあ、最悪、スペーサーだけを基板につけて、基板をむき出しにしておけば目的が果たせそうな気もするけど。それもそれでなんだかアレだなと。

2017/11/16(木) [n年前の日記]

#1 [raspberrypi][love2d] love2dが音を鳴らしてくれない件でまだハマってる

raspbian jessie までは pulseaudio が標準で入ってたけど、raspbian stretch は pulseaudio を使わなくなった、という話が気になるわけで。そのあたりが絡んでいて、love2d の音が鳴らないのではないか、と。

Raspberry Pi Zero W + raspbian stretch 上で、pulseaudio関係のパッケージをアンインストールしてから love2d をビルドしてみた。これで音が鳴るだろうか…。

pulseaudio関係をアンインストール。 :

sudo aptitude purge pulseaudio libpulse-dev pulseaudio-utils libsox-fmt-pulse
sudo aptitude purge hoge で、設定も含めてパッケージをアンインストールできる。

残ってるのは以下。
$ sudo aptitude search pulse | grep -E '^i'

i A libpulse-mainloop-glib0   - PulseAudio client libraries (glib support)
i A libpulse0                 - PulseAudio client libraries
vlc等が libpulse0 を必要とするらしいので残しておいた。

love2dをビルド。1時間半かかった。

試してみたが、ダメだった。相変わらず音を出そうとすると「Illegal instruction」と表示される。

「Illegal instruction」が気になる。 :

「Illegal instruction」というメッセージでググってるうちに気になる話を見かけた。armv7l の命令を armv6l で実行しようとした場合、そういうエラーメッセージを出す場合もあるそうで。

_raspberry pi - Illegal instructionというエラーについて - スタック・オーバーフロー

もしかすると、raspbian stretch の SDL2 を作る際に必要になるパッケージの中に ―― それも音関係を処理するパッケージの中に、ARMv7 が載ってる Raspberry Pi2 / Pi3 を前提にして作られてしまったパッケージが存在していて、それを ARMv6 の Raspberry Pi Zero W 上で動かそうとした、からエラーが出る、という可能性はないだろうか。raspbian jessie の頃は ARMv6のことも考えて作られてたけど、raspbian stretch は、まだそこまで手が回ってない、とか。

だとすれば、ARMv7 が載ってる Raspberry Pi3上で同じ作業をすると、そちらではすんなり動く・音が鳴る、かもしれない。

Raspberry Pi3 で love2d の動作を試してみる。 :

手持ちの Raspberry Pi3 + raspbian stretch + love2d で、音が鳴るか試してみたり。

ますは公式リポジトリ版のパッケージをインストール。
$ sudo aptitude install love
以下の新規パッケージがインストールされます:
  binfmt-support{a} liballegro4.4{a} libdevil1c2{a} libluajit-5.1-2{a} love

GL Driver (Fake DKMS) を有効化。公式リポジトリ版の SDL2関係は OpenGL を使うオプションでビルドされているらしいので。

love2d で音が出るか試してみた。音が鳴った。相変わらず、jack server がどうこうとメッセージが出るし、なんだかワンテンポ遅れてから鳴ってるけど、それでも一応音は鳴った。

ということは、raspbian stretch の公式リポジトリにアップされてる SDL2 + love2d は、必ずしも音が鳴らない、というわけではないということかな…。

しかし、何故か途中で音が鳴らなくなる。

ふと、Raspberry Pi3 に、pulseaudio が入っていて、動いてることに気づいた。おそらく gosu を動かす際にインストールしたのではないかな…。
$ ps x | grep pulse
1536 ?        S<l    0:01 /usr/bin/pulseaudio --start --log-target=syslog

pulseaudio --kill としてから love2d を動かすと、音がずっと鳴ってくれるようになった。ただ、love2d を動かすと、その時点で pulseaudio が起動してしまう模様。love2d を終了させてから確認すると、また pulseaudio が復活してる。

現状、pulseaudio と jack 関係でインストールされていたのは以下。
$ sudo aptitude search pulse | grep -E '^i'
i A libpulse-dev             - PulseAudio client development headers and libraries
i A libpulse-mainloop-glib0  - PulseAudio client libraries (glib support)
i A libpulse0                - PulseAudio client libraries
i A libpulsedsp              - PulseAudio OSS pre-load library
i   pulseaudio               - PulseAudio sound server
i A pulseaudio-utils         - Command line tools for the PulseAudio sound server

$ sudo aptitude search jack | grep -E '^i'
i A jackd              - JACK Audio Connection Kit (default server package)
i A jackd2             - JACK Audio Connection Kit (server and example clients)
i A libjack-jackd2-0   - JACK Audio Connection Kit (libraries)
i A qjackctl           - User interface for controlling the JACK sound server

pulseaudio をアンインストールしてみる。設定まで含めて削除。
sudo aptitude purge pulseaudio
この状態でも love2d の音は鳴る。しかも、pulseaudio が入っていた時より音が鳴り始めるまでの反応が全然早い。

つまり、raspbian stretch + love2d だから音が鳴らない、というわけではないらしい。少なくとも、Raspberry Pi3 + raspbian stretch + love2d なら、音が鳴る。ただし、Raspberry Pi Zero W + raspbian stretch + love2d では、音が鳴らない。

となると…。これはもしかすると、raspbian stretch の公式リポジトリには、ARMv7を前提にしたパッケージが色々アップロードされていて、ARMv6の Raspberry Pi Zero W にインストールしてしまうと不具合が起きる、ということになるのだろうか。

本当にそうかな? 実は Raspberry Pi Zero W も、raspbian stretch を入れてすぐに love2d を動かせば、音が鳴ってくれたりしないだろうか。試してみるしかないかな…。

#2 [firefox] Firefox 57が出たらしい

今までの拡張(アドオン)が使えなくなる、Firefox 57 だか Firefox Quantum だかが、とうとう公開されてしまったらしい。

Firefoxにたくさん拡張を入れて便利に使ってるつもりになってた自分としては、コレは困った…。どうしよう…。拡張が使えない Firefox なんて、利用する意味が無い…。

いやまあ、Webなんたらで書き直された拡張なら動くらしいけど。現状ではほとんど書き直されてないし、「全部書き直せって? だったら拡張の開発なんてやめるわ」と言い出した作者さんもチラホラ居るし。

Firefox ESR版を使えば従来の拡張も動くらしいけど、半年後にはESR版も Firefox 57 と同じ状態になるらしいし。Pale Moon、Waterfoxという派生ブラウザなら従来の拡張も動くという話があるけど、完全に互換性があるわけでもなさそうで。困った。

どうせ使いづらくなるなら、別ブラウザへの移行を、例えば Google Chrome へ移行することをちゃんと検討し始めたほうがいいのだろうか。うーん。

ちなみにFirefox ESR ってのは、法人向けとして、最新版よりちょっと古いバージョンの、セキュリティ面だけを修正して公開していくスタンスの Firefox、という説明で合ってるのかな。ベースは古い版なので、従来の拡張もまだ動くわけで。

storageフォルダって何だろう。 :

とりあえず Firefox の Profilesフォルダをバックアップしておこう…と思ったら、1.38GBもある。なんでや。

中のファイルサイズを一つ一つ確認していったら、storageフォルダが1GBほどのサイズ。何だろう。このフォルダは…。

中身を眺めると…。どうも Unityで作成された何かしらをブラウザ上で動かそうとした場合に、件の場所にデータ等が格納されてるっぽいなと。ソレ以外にも色々入ってるけど。コレは勝手に削除してもいいのだろうか。ダメなのだろうか。ググってもそれらしい情報が見つからない…。

Firefox ESRをインストールしてみた。 :

とりあえず、Firefox ESR をインストールしてみたのだけど。

起動しようとしても、いつまで経ってもウインドウが表示されない。仕方ないのでタスクマネージャからプロセスを殺してみたけど…。再度起動させたら、ウインドウは表示されたものの、ブックマークが全部消えた…。

バックアップしておいたブックマークの .json を渡して復元しようとしてみたら、CPUを1コア全部使って何か処理をしてるものの、そこから先に進まない。もしかして、Firefox ESR は52ベースで、今まで使ってたのは56ベースだから、処理できない .json になっているのだろうか…。

htmlでもバックアップしておいたので、そちらからならインポートできた。

と思ったら Firefox Sync が動き始めたようで、ブックマークの中身がグチャグチャに。しかもおそらく Firefox Sync がツッコんできたブックマークの内容が妙に古い。拡張も少しずつ入り始めたけど、これまた内容が古い。

Firefox Sync…酷いな…。たぶんある時期から同期ができてなかったんだな…。ダメダメなサービスだ…。いや、もしかすると Firefox 52時点の内容を同期しようとしたのだろうか。

最初の起動で固まってたというか処理が戻ってこなかったのも、Firefox Sync が必死に処理をしていたから、だろうか。たぶんこの機能、大量のブックマークやアドオンは想定してないのではないかなあ…。いや、Firefoxのブックマーク機能自体が、大量のブックマーク数を想定してなさそうだけど。整理してるうちにどんどん重くなっていくし…。

2017/11/17(金) [n年前の日記]

#1 [raspberrypi] Raspberry Pi Zero Wにraspbian stretchを再インストール中

Raspberry Pi Zero W に、raspbian stretch を再インストール中。

前回は Transcend製 microSDHC 16GBにインストールしたけど、今回は東芝製 microSDHC 16GB にインストール。

_NOOBS_v2_4_4.zip をDLして解凍。 _SDメモリカードフォーマッタ でフォーマットしたmicroSDHCに、解凍して出てきたファイル群をそのままコピー。

Raspberry Pi Zero W に microSDHC を差して起動すると選択画面が出てくる。国の設定を日本に。WiFi(無線LAN)を設定。Raspbian を選択。1〜2時間ぐらいでインストール終了。

#2 [firefox] Firefox 57になるとこれだけ機能削減されるので困る

昨日、Firefox ESR をインストールする前に、Firefox 56 の拡張の状態をキャプチャしておいたのだけど。こんな状態で。

firefox56_addon_list_ss_20171117.png


「旧式」と黄色く表示されてるのが、Firefox 57以降では動かなくなる拡張。数えてみたら29個あった。現状では、全体の3/4の拡張が使えなくなっちゃう。

どれもこれも、「コレが使えたら便利になりそう」とユーザが思って、わざわざ『能動的』にインストールした拡張なわけで。つまりはどれもユーザが望んでた機能と言えるわけだけど、その、ユーザが望んでた機能がざっくり数えて約30個も突然無くなってしまったら…。そりゃ当然「使えないソフト」「ダウングレード」扱いされるよなと。

代わりに劇的に速くなった、とかならまだしも、実測ではたいして違いはなさそうだし…。

_ASCII.jp:2倍速い最新ブラウザー「Firefox Quantum」正式版登場! 早速ベンチマークした (1/2)

なんだかなあ。

いやまあ、しばらくは Firefox ESR版を使ってどうにか、とは思っているけど…。

2017/11/18() [n年前の日記]

#1 [raspberrypi] rpi-updateが進まなくてハマったり

Raspberry Pi Zero W に raspbian stretch をインストールして、sudo rpi-update をしようとしたのだけど、54MBほどの何かをダウンロードするところでダウンロードが止まってしまって先に進まなくて悩んだり。数回繰り返してみたけど状態に変化無し。/etc.apt/sources.list を編集してリポジトリのURLを変えてみても変化無し。うーん。

一日経ってから試してみたら、今度はダウンロードできた。どうもサーバのほうでアレなことが起きてたような気がする。

ということで、上手く行かない場合は別の時間帯に試してみる、ということでいいのかな…。

2017/11/19() [n年前の日記]

#1 [raspberrypi][love2d] raspbian stretch は Raspberry Pi Zero W に対応してないのかもしれない

Raspberry Pi Zero W に raspbian stretch をクリーンインストールして、love2d (love) を動かしてみたのだけど。
sudo aptitude install love
sudo raspi-config
-> GL driver enable
sudo reboot

結局、love2d で音は鳴らなかった。鳴らそうとすると、Illegal instruction と表示されてしまう。

クリーンインストールした直後の raspbian stretch で音が鳴らないのだから、公式リポジトリ版のパッケージを使うと音が鳴らない、という状態は間違いないのではないかなと。

ということで、状況としては、以下のような状態で。
HardwareOSGL driverlove2d sound play
Raspberry Pi3raspbian stretchenablesuccess
Raspberry Pi Zero Wraspbian jessiedisablesuccess
Raspberry Pi Zero Wraspbian stretchenablefailure
Raspberry Pi Zero Wraspbian stretchdisablefailure

推測だけど、raspbian stretch は一見すると Raspberry Pi Zero W上でも動くように見えてるけど、実はいくつかのパッケージは Pi2 / Pi3用 = ARMv7を前提としてビルドされていて、Pi1 / Zero系 = ARMv6が載ってる Raspberry Pi上では動かないのではないだろうか。

描画関係のパッケージは見た目ですぐに動かないことが分かるから、そのあたりの作業ミスはしてないのだろうけど、音関係はチェック作業が十分にできていない可能性がありそう。プログラマーという人種は音関係を軽視する人が結構多いので、チェック漏れがあっても、まあ仕方ないのかもしれない。

もちろん、自分が音関係で必要な作業を忘れていて音が鳴らない可能性もあるけれど。でも、pulseaudio 関係はアンインストールしてみたり、そもそもインストールされてなかったりもするし…。

大体にして、raspbian jessie 上では、巷の解説ページ通りに作業すると、すんなり動くし音が鳴るわけで。であれば、どう考えても raspbian stretch がおかしいだろうと。

解決策。 :

ということで、Raspberry Pi上で love2d を動かしてみたい、という場合は、以下の選択肢になるのだろうなと。
  • A. Raspberry Pi2 / Pi3 を入手して使う。
  • B. Raspberry Pi Zero系で動かしたいなら、raspbian jessie をインストールして、その上で love2d を使う。

ちなみに、raspbian jessie のイメージは以下で入手可能。

_Index of /pub/raspberrypi/raspbian/images/raspbian-2017-07-05
_Index of /pub/raspberrypi/raspbian_lite/images/raspbian_lite-2017-07-05

pilove は Raspberry Pi Zero W に対応してないらしい。 :

解決策の選択肢として、
  • C. microSD を買ってきて pilove のイメージをインストールしてソレを使ってどうにか頑張る。
てのもあるかなと思ったけど、手元で確認してみた感じでは、どうやら pilove のイメージは古過ぎて Raspberry Pi Zero W に対応してないようで。

ちなみに、pilove は以下から入手できる。

_PiLove - LOVE on RaspberryPI
_Index of /downloads

pilove の /etc/network/interfaces の中には、無線LANの ssid や pskのパスワードを設定できそうな感じの記述があったので、そこを書き換えれば無線LANが使えるかなと期待したのだけど。試しに修正してみても再起動すると何故か元に書き戻されてしまって首を捻ったり。

ググってみたら、以下のやり取りが。

_Pi Zero W - Issue #1 - pipaos/pipaos
_wifi on Pi Zero W - Issue #3 - skarbat/pilove

「sudo rpi-update をしたら状況が変わるかも」等が書いてあるけど。無線LANが繋がらないのだから sudo rpi-update はできないわけで。「Pi3に microSD を差して sudo rpi-update してどうにかなった」てな事例も書かれてるようだけど、ソレって Zero W しか持ってなかったら手詰まりだよなと。

そんな状態なので、pilove は、Pi1 / Pi2 / Pi3 / Pi Zero を持ってる人なら利用できるかもしれないけれど Zero W は未対応、という状況っぽい。

Zero W も有線LANが使える状態にしてあれば利用できる可能性があるかもしれないけど、USB接続の有線LANアダプタを新規購入する等の追加投資が必要になるわけで。ちと厳しい。

余談。 :

raspbina stretch上でも、問題が起きてるパッケージをどうにか見つけて自分でビルド、という解決策があるのかもしれないけど…。
  • どのパッケージが間違ってビルドされているのか、見つけ出せる気がしない。たくさんあるし、何をどうやって動作確認すればいいのやら。
  • 実機上でのビルドは時間がかかるから、一つ一つビルドし直してるうちに辟易して投げ出しそう。
  • Intel CPUが載ったPC上で Raspberry Pi用バイナリをビルドすることも可能らしいけど、環境整備の仕方が分からなかった。
なので、現実的じゃないだろうと。

と言っても、誰かがそのあたりの作業をしないとずっとこのまま放置状態になるのでマズいのだけど…。しかしそもそも Raspberry Pi1 / Zero系上で love2d を動かしたい人が世の中に一体どれだけ居るんだよ、という気もするわけで。
  • Pi3を買えば、何の苦労もなく、しかもそれなりの速度で動かせるし。
  • どうせ Zero系を使う場面って、GPIOで何か制御するのがメインじゃないのかと。とにかく遅いし。
  • 学校でZero系導入してプログラミング教育に使うと言っても、どうせ Scratch 1.x を触らせて終わりだろう。Zero系は Scratch 2.0 すら動かないし。
  • mp3 や ogg を鳴らすだけなら、mpg123、mpg321、vorbis-tools を入れれば一応鳴るわけで。love2d で鳴らそうとすると困るって話なだけで。

ということで、Raspberry Pi1 / Zero上でも60FPSで動かせる2Dゲーム制作用の何かがあればヨサゲかもと期待して色々やってたけど、ちと残念な結果に。音が鳴らないのではゲームっぽくならないよな…。雰囲気出ないよな…。

まあ、前述のとおり、Zero系でも raspbian jessie を使えばなんとかなるけど。しかし、今現在NOOBSを使ってインストールされる raspbian stretch で鳴らないってのが困るなと。

Zero系で GL driver を有効にして love2d を動かすと、30FPSぐらいまで遅くなるのも気になる。OpenGL ESで描画すると60FPSが出るし、Pi3上で GL driver を使っても60FPS出るんだけどな…。GL driver を使うと Raspberry Piの実力が発揮できない、ということかもしれない。

#2 [raspberrypi][love2d] love2dでサウンドを鳴らすソレ

love2dでサウンドを鳴らすソレ。動作確認に使った。License : CC0 / Public Domain ってことで。

_sound_test01.zip


一応ソースもアップロード。

_conf.lua
_main.lua

サウンドデータは以下。

_bgm_loop.wav / _se_beam.wav / _se_explosion.wav

_bgm_loop.mp3 / _se_beam.mp3 / _se_explosion.mp3

_bgm_loop.ogg / _se_beam.ogg / _se_explosion.ogg

2017/11/20(月) [n年前の日記]

#1 [raspberrypi] Raspberry Pi Zero Wの無線LANが使えなくなって困ったり

Raspberry Pi Zero W + raspbian jessie で sudo rpi-update をしたら、再起動後に無線LANが使えなくなった。困った。

ググったら以下のページが。

_Rapberry piの起動時に無線LAN接続ができなくなった. - Atelier d' OFCOURSE

sudo ifup wlan0 と打ったら無線LANが有効になった。ということは、使えるけど起動時に有効になってない状態、ということかな…。

/etc/network/interface を編集。
sudo vi /etc/network/interface
allow-hotplug wlan0 の前に auto wlan0 を追加してから再起動。無線LANが使えるようになった。助かった…。

#2 [raspberrypi][love2d] Raspberry Pi Zero W + raspbian jessie でlove2dを使えるようにする手順をメモ

前にもメモした記憶があるけど、今回 raspbian jessie をクリーンインストールしたので、再度メモ。

SDL2(OpenGL無効版)をビルドしてインストール。 :

SDL2は、画像の描画や音声ファイルの再生等をしてくれるライブラリ、という説明でいいのかな…。

公式リポジトリにある、OpenGLが有効になったSDL2をインストールしたい場合は、以下だけで済む。
sudo aptitude install libsdl2-dev

が、今回は OpenGL無効(にすることで OpenGL ESが有効になる)版をインストールしたいのでビルドする。以下を参考に作業。

_Golang と SDL2 でゲームを作る - KaoriYa
_SDL2-2.0.6 on Raspberry Pi - ChoccyHobNob

ビルドに必要なパッケージをインストール。
sudo aptitude install automake build-essential mercurial qt5-default libtool libasound2-dev libaudio-dev libesd0-dev libsndfile1-dev libmodplug-dev libopenal-dev libfontconfig1-dev libpango1.0-dev freeglut3-dev libfreeimage-dev libjpeg-dev libtiff5-dev libwebp-dev libxcursor-dev libxi-dev libxrandr-dev libxss-dev libudev-dev libsmpeg-dev libxinerama-dev

ソースをDLして解凍して configure。
mkdir ~/sdl2
cd ~/sdl2
wget https://www.libsdl.org/release/SDL2-2.0.5.tar.gz
tar xzf SDL2-2.0.5.tar.gz
cd SDL2-2.0.5
mkdir build && cd build

../configure --host=arm-raspberry-linux-gnueabihf --disable-pulseaudio --disable-esd --disable-video-mir --disable-video-wayland --disable-video-x11 --disable-video-opengl

結果は以下。Raspberry Pi1 / Zero系の場合、--host=arm-raspberry-linux-gnueabihf をつけて configure しないと、Video driver に rpi が出てこないので、指定は必須。
SDL2 Configure Summary:
Building Shared Libraries
Building Static Libraries
Enabled modules : atomic audio video render events joystick haptic power filesystem threads timers file loadso cpuinfo assembly
Assembly Math   :
Audio drivers   : disk dummy oss alsa(dynamic) nas(dynamic)
Video drivers   : rpi dummy opengl_es1 opengl_es2
Input drivers   : linuxev linuxkd
Using libudev   : YES
Using dbus      : YES
Using ime       : YES
Using ibus      : NO
Using fcitx     : NO

--host=arm-raspberry-linux-gnueabihf をつけない場合は以下になる。video driver に rpi が無い。
../configure --disable-pulseaudio --disable-esd --disable-video-mir --disable-video-wayland --disable-video-x11 --disable-video-opengl

SDL2 Configure Summary:
Building Shared Libraries
Building Static Libraries
Enabled modules : atomic audio video render events joystick haptic power filesystem threads timers file loadso cpuinfo assembly
Assembly Math   :
Audio drivers   : disk dummy oss alsa(dynamic) nas(dynamic)
Video drivers   : dummy opengl_es2
Input drivers   : linuxev linuxkd
Using libudev   : YES
Using dbus      : YES
Using ime       : YES
Using ibus      : NO
Using fcitx     : NO

makeしてインストール。1〜2時間ぐらいかかる。
make
sudo make install
共有ライブラリを一応更新。
sudo ldconfig
$ sudo ldconfig -p | grep SDL2

        libSDL2-2.0.so.0 (libc6,hard-float) => /usr/local/lib/libSDL2-2.0.so.0
/usr/local/lib/ 以下にインストールされた。

love2dをビルドしてインストール。 :

以下を参考にして作業。

_Building LOVE (日本語) - LOVE
_pilove/build-love2d.sh at master - skarbat/pilove

必要なパッケージをインストール。
sudo aptitude install build-essential pkg-config libfreetype6-dev libopenal-dev libvorbis-dev libtheora-dev libmpg123-dev libluajit-5.1-dev libphysfs-dev libmodplug-dev
sudo aptitude install autotools-dev automake libtool libdevil-dev libogg-dev libflac-dev libflac++-dev libmng-dev
sudo aptitude install libturbojpeg1-dev
sudo aptitude install build-essential pkg-config libfreetype6-dev libopenal-dev libvorbis-dev libtheora-dev libmpg123-dev libluajit-5.1-dev libphysfs-dev libmodplug-dev
sudo aptitude install devscripts git-core debhelper dh-autoreconf libasound2-dev libudev0 libudev-dev libdbus-1-dev libx11-dev libxcursor-dev libxext-dev libxi-dev libxinerama-dev libxrandr-dev libxss-dev libxt-dev libxxf86vm-dev libgl1-mesa-dev libibus-1.0-dev libraspberrypi-dev

ちなみに、raspbian jessie ではなく raspbian stretch の場合は、libturbojpeg1-dev ではなく libturbojpeg0-dev をインストールするっぽい?
sudo aptitude install libturbojpeg0-dev

love2dのLinux用のソースをDLして解凍して configure してビルドしてインストール。1時間半かかった。
mkdir ~/love2d
cd ~/love2d
wget https://bitbucket.org/rude/love/downloads/love-0.10.2-linux-src.tar.gz
tar zxf love-0.10.2-linux-src.tar.gz
cd love-0.10.2
./configure --host=arm-raspberry-linux-gnueabihf
make
sudo make install

$ which love
/usr/bin/love
/usr/bin/以下に、love がインストールされた。

動作確認。 :

love で実行。例の画面が出た。

love2dに、サウンドを鳴らすソースを与えてみた。以下のような警告が表示されたものの、音が鳴った。
AL lib: (WW) alc_initconfig: Failed to initialize backend "pulse"

音が鳴らない場合は、pulseaudio --start をしてから pulseaudio --kill をしてから試すと音が鳴ったりした。

各パッケージのインストール時にリストアップされたパッケージをメモ。 :

一応、各パッケージのインストール時にリストアップされたパッケージもメモ。環境は、Raspberry Pi Zero W + raspbian jessie。

$ sudo aptitude install automake build-essential mercurial qt5-default libtool libasound2-dev libaudio-dev libesd0-dev libsndfile1-dev libmodplug-dev libopenal-dev libfontconfig1-dev libpango1.0-dev freeglut3-dev libfreeimage-dev libjpeg-dev libtiff5-dev libwebp-dev libxcursor-dev libxi-dev libxrandr-dev libxss-dev libudev-dev libsmpeg-dev libxinerama-dev

以下の新規パッケージがインストールされます:
  autoconf{a} automake autopoint{a} autotools-dev{a} debhelper{a} dh-autoreconf{a} dh-strip-nondeterminism{a}
  freeglut3{a} freeglut3-dev gettext{a} intltool-debian{a} libarchive-zip-perl{a} libasound2-dev libasprintf-dev{a}
  libaudio-dev libaudiofile-dev{a} libavahi-client-dev{a} libavahi-common-dev{a} libcaca-dev{a}
  libcairo-script-interpreter2{a} libcairo2-dev{a} libdbus-1-dev{a} libdirectfb-dev{a} libdirectfb-extra{a}
  libdrm-dev{a} libdrm-exynos1{a} libdrm-omap1{a} libdrm-tegra0{a} libegl1-mesa-dev{a} libesd0-dev
  libfile-stripnondeterminism-perl{a} libflac-dev{a} libfontconfig1-dev libfreeimage-dev libfreeimage3{a}
  libgettextpo-dev{a} libgettextpo0{a} libgl1-mesa-dev{a} libgles2-mesa-dev{a} libglib2.0-dev{a}
  libglu1-mesa-dev{a} libharfbuzz-dev{a} libharfbuzz-gobject0{a} libice-dev{a} libjbig-dev{a} libjpeg-dev
  libjpeg62-turbo-dev{a} libjs-excanvas{a} libltdl-dev{a} liblzma-dev{a} libmail-sendmail-perl{a} libmodplug-dev
  libogg-dev{a} libopenal-dev libpango1.0-dev libpcre3-dev{a} libpcrecpp0{a} libpixman-1-dev{a}
  libpthread-stubs0-dev{a} libpulse-dev{a} libpulse-mainloop-glib0{a} libqt5opengl5-dev{a} libqt5sql5{a}
  libqt5sql5-sqlite{a} libqt5test5{a} libqt5xml5{a} libsdl1.2-dev{a} libslang2-dev{a} libsm-dev{a} libsmpeg-dev
  libsmpeg0{a} libsndfile1-dev libsys-hostname-long-perl{a} libtiff5-dev libtiffxx5{a} libtool libudev-dev
  libunistring0{a} libvorbis-dev{a} libwayland-bin{a} libwayland-dev{a} libwebp-dev libx11-dev{a} libx11-doc{a}
  libx11-xcb-dev{a} libxau-dev{a} libxcb-dri2-0-dev{a} libxcb-dri3-dev{a} libxcb-glx0-dev{a} libxcb-present-dev{a}
  libxcb-randr0-dev{a} libxcb-render0-dev{a} libxcb-shape0-dev{a} libxcb-shm0-dev{a} libxcb-sync-dev{a}
  libxcb-xfixes0-dev{a} libxcb1-dev{a} libxcursor-dev libxdamage-dev{a} libxdmcp-dev{a} libxext-dev{a}
  libxfixes-dev{a} libxft-dev{a} libxi-dev libxinerama-dev libxrandr-dev libxrender-dev{a} libxshmfence-dev{a}
  libxss-dev libxt-dev{a} libxxf86vm-dev{a} m4{a} mercurial mercurial-common{a} mesa-common-dev{a} po-debconf{a}
  qt5-default qt5-qmake{a} qtbase5-dev{a} qtbase5-dev-tools{a} x11proto-core-dev{a} x11proto-damage-dev{a}
  x11proto-dri2-dev{a} x11proto-fixes-dev{a} x11proto-gl-dev{a} x11proto-input-dev{a} x11proto-kb-dev{a}
  x11proto-randr-dev{a} x11proto-render-dev{a} x11proto-scrnsaver-dev{a} x11proto-xext-dev{a}
  x11proto-xf86vidmode-dev{a} x11proto-xinerama-dev{a} xorg-sgml-doctools{a} xtrans-dev{a}
更新: 0 個、新規インストール: 135 個、削除: 0 個、保留: 0 個。

$ sudo aptitude install build-essential pkg-config libfreetype6-dev libopenal-dev libvorbis-dev libtheora-dev libmpg123-dev libluajit-5.1-dev libphysfs-dev libmodplug-dev
以下の新規パッケージがインストールされます:
  libluajit-5.1-2{a} libluajit-5.1-dev libmpg123-dev libphysfs-dev libphysfs1{a} libtheora-dev

$ sudo aptitude install autotools-dev automake libtool libdevil-dev libogg-dev libflac-dev libflac++-dev libmng-dev
以下の新規パッケージがインストールされます:
  liballegro4.4{a} libdevil-dev libdevil1c2{a} libflac++-dev libflac++6{a} liblcms2-dev{a} libmng-dev

$ sudo aptitude install libturbojpeg1-dev
以下の新規パッケージがインストールされます:
  libturbojpeg1{a} libturbojpeg1-dev

$ sudo aptitude install devscripts git-core debhelper dh-autoreconf libasound2-dev libudev0 libudev-dev libdbus-1-dev libx11-dev libxcursor-dev libxext-dev libxi-dev libxinerama-dev libxrandr-dev libxss-dev libxt-dev libxxf86vm-dev libgl1-mesa-dev libibus-1.0-dev libraspberrypi-dev
以下の新規パッケージがインストールされます:
  at{a} bsd-mailx{a} dctrl-tools{a} debian-keyring{a} devscripts diffstat{a} distro-info-data{a} dput{a} equivs{a}
  exim4-base{a} exim4-config{a} exim4-daemon-light{a} gir1.2-ibus-1.0{a} git-core hardening-includes{a}
  libapt-pkg-perl{a} libclass-accessor-perl{a} libclass-inspector-perl{a} libclone-perl{a} libcommon-sense-perl{a}
  libconvert-binhex-perl{a} libcrypt-ssleay-perl{a} libdigest-hmac-perl{a} libdistro-info-perl{a}
  libemail-valid-perl{a} libexporter-lite-perl{a} libfile-basedir-perl{a} libibus-1.0-5{a} libibus-1.0-dev
  libio-pty-perl{a} libio-sessiondata-perl{a} libio-socket-inet6-perl{a} libio-string-perl{a} libio-stringy-perl{a}
  libipc-run-perl{a} libjson-perl{a} libjson-xs-perl{a} libmime-tools-perl{a} libnet-dns-perl{a}
  libnet-domain-tld-perl{a} libnet-ip-perl{a} libossp-uuid-perl{a} libossp-uuid16{a} libparse-debcontrol-perl{a}
  libparse-debianchangelog-perl{a} libperlio-gzip-perl{a} libsoap-lite-perl{a} libsocket6-perl{a}
  libsub-name-perl{a} libtask-weaken-perl{a} libtext-levenshtein-perl{a} libtie-ixhash-perl{a}
  libxml-parser-perl{a} libxmlrpc-lite-perl{a} lintian{a} patchutils{a} python3-magic{a} t1utils{a} wdiff{a}

pulseaudioについてメモ。 :

pulseaudio関係をインストールしたい場合は、以下も打つけど…。
sudo aptitude install pulseaudio libpulse-dev

raspbian jessie をクリーンインストールした直後は以下のような状態で既にアレコレ入ってたので、わざわざインストールを指定しなくてもよいのではないかな…。
$ sudo aptitude search pulse | grep -E '^i'

i A libpulse-dev                    - PulseAudio client development headers and
i A libpulse-mainloop-glib0         - PulseAudio client libraries (glib support)
i A libpulse0                       - PulseAudio client libraries
i A libpulsedsp                     - PulseAudio OSS pre-load library
i A pulseaudio                      - PulseAudio sound server
i   pulseaudio-module-bluetooth     - Bluetooth module for PulseAudio sound serv
i A pulseaudio-module-x11           - X11 module for PulseAudio sound server
i A pulseaudio-utils                - Command line tools for the PulseAudio soun

#3 [linux] 自宅サーバの時計がおかしくて悩んだり

自宅サーバが、2017/11/20 01:30頃に何故か勝手に再起動していて首を捻ったのだけど、それはさておき。

どうも自宅サーバの時計がおかしい…。ハードウェアクロックが、異様にずれてる。

ちなみに環境は Vine Linux 6.5。
# cat /etc/vine-release
Vine Linux 6.5 (Poupille)

時刻を確認。
# date
2017年 11月 20日 月曜日 07:55:46 JST

# hwclock -r --debug
hwclock from util-linux 2.19
/dev interface to clock を使います。
直前のずれの修正は 1969 年以降 1511128259 秒時点で行なわれました
直前の調整は 1969 年以降 1511128259 秒時点で行なわれました
ハードウェア時計はローカル時刻です
ハードウェア時計ローカル時刻を保持しているとみなします
クロックチックを待っています...
...クロックチックを取得しました
ハードウェア時計から読込んだ時刻: 2017/11/19 22:55:52
ハードウェア時計時刻 : 2017/11/19 22:55:52 = 1969 年以来 1511099752 秒
2017年11月19日 22時55分52秒  -0.203008 秒
ハードウェアクロックが、ちょうど9時間ずれてる。おかしい。UTC絡みなのだろうか…?

ntpの状態は以下のような感じ。
# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
-ntp1.plala.or.j 202.234.233.109  4 u  140  256  377   19.093   -4.844   0.514
-ntp2.plala.or.j 202.234.233.109  4 u  203  256  377   12.973   -3.774   0.957
+ntp1.jst.mfeed. 133.243.236.17   2 u  204  256  377   20.810   -1.036   0.505
*ntp2.jst.mfeed. 133.243.236.17   2 u  196  256  377   21.901   -0.961   0.599
+ntp3.jst.mfeed. 133.243.236.17   2 u   91  256  377   18.489   -0.653   0.717
LOCAL(0)        .LOCL.          10 l  59m   64    0    0.000    0.000   0.000

ハードウェアクロックに、現在時刻を設定してみる。
# date
2017年 11月 20日 月曜日 08:28:08 JST

# hwclock --systohc --localtime --debug
hwclock from util-linux 2.19
/dev interface to clock を使います。
直前のずれの修正は 1969 年以降 1511132257 秒時点で行なわれました
直前の調整は 1969 年以降 1511132257 秒時点で行なわれました
ハードウェア時計はローカル時刻です
ハードウェア時計ローカル時刻を保持しているとみなします
クロックチックを待っています...
...クロックチックを取得しました
ハードウェア時計から読込んだ時刻: 2017/11/19 23:28:23
ハードウェア時計時刻 : 2017/11/19 23:28:23 = 1969 年以来 1511101703 秒
Time elapsed since reference time has been 0.004853 seconds.
Delaying further to reach the new time.
ハードウェア時計を 08:28:23 に設定 = 1969 年以来 1511134103 秒
ioctl(RTC_SET_TIME) に成功しました。
前回の調整以来、少なくとも一日経過しないと、ずれを修正できません。

# hwclock --show ; date
2017年11月20日 08時29分18秒  -0.351335 秒
2017年 11月 20日 月曜日 08:29:18 JST
設定できたように見えるけど、しばらくするとまた時間がずれる。何故。

関係ありそうなファイルを確認。 :

# strings /etc/localtime
TZif2
        JCST
TZif2
JCST
JST-9

# cat /etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=false
ARC=false

# cat /etc/adjtime
0.018596 1511134103 0.000000
1511134103
LOCAL

指定がおかしいようには見えないのだけどなあ…。

そもそも、一体何が、一定時間毎にハードウェアクロックを上書き設定してしまうのだろう?

「11分モード」なるものがあるらしい。 :

以下のページを眺めてたら、「11 minute mode(11分モード)」なるものがあると知った。11分毎にハードウェアクロックを再設定してしまう機能がカーネルにあるらしく、ソレを利用してntpサーバがハードウェアクロックを設定してしまう時があるそうで。

_日時を設定して再起動すると標準時刻に戻ってしまう | アットマークテクノ ユーザーズサイト
_hardware clockがずれる件と 11 minute mode - (ひ)メモ
_Man page of HWCLOCK - (カーネルによるハードウェアクロックの自動合わせ、の項を参照)
_RHEL6のtickless kernel - とあるSIerの憂鬱
_設定ファイル
_パソコンの時計 ハードウェアクロックとシステムクロック

状態を確認してみる。
# ntptime | grep status
  status 0x2001 (PLL,NANO),
UNSYNC の表記が無いので、11 minute mode(11分モード)が有効になっているらしい。つまりウチの自宅サーバは、ntpd だかカーネルだか分からんけど、11分毎にハードウェアクロックが上書きされてしまう模様。

/etc/adjtime の3行目が、LOCAL か UTC かで、ハードウェアクロックから時刻を読み取る際の処理が変わってくるらしい。試しに UTC にしてみた。
vi /etc/adjtime
3行目をUTCに

vi /etc/sysconfig/clock
UTC=true に

hwclock --systohc --utc --debug

# hwclock -r --debug
hwclock from util-linux 2.19
/dev interface to clock を使います。
直前のずれの修正は 1969 年以降 1511139353 秒時点で行なわれました
直前の調整は 1969 年以降 1511139353 秒時点で行なわれました
ハードウェア時計はUTC時刻です
ハードウェア時計UTC時刻を保持しているとみなします
クロックチックを待っています...
...クロックチックを取得しました
ハードウェア時計から読込んだ時刻: 2017/11/20 00:59:18
ハードウェア時計時刻 : 2017/11/20 00:59:18 = 1969 年以来 1511139558 秒
2017年11月20日 09時59分18秒  -0.768737 秒

そもそもLinuxのシステムクロックはUTCで、ハードウェアクロックもUTCを前提にしている場合が多い、という話も見かけた。

どうせ Linux しか動かさない環境なのだから、これで様子を見てみよう…。

hwclockについて。 :

  • hwclock -w と hwclock --systohc は同じ。ハードウェアクロックを設定する。
  • hwclock -r と hwclock --show は同じ。ハードウェアクロックを読み出す。
  • --debug をつけると、詳細を表示してくれる。
  • --utc をつけると UTC として扱い、--localtime をつけるとローカルタイムとして扱う。

2017/11/21(火) [n年前の日記]

#1 [cg_tools] PaintShop Pro 2018の体験版を試用

数日前にソースネクストのページを見ていたら Corel PaintShop Pro 2018 が安く売られていて、どんなソフトなんだろうと気になったわけで。いや、大昔に、たしか Ver. 4.2J とかその時期に購入したことはあったのだけど、さすがに今では全然違っちゃってるだろうと。

_体験版があるらしい ので、試しにインストール。30日間利用できるらしい。

インストール場所も何も尋ねてこないままインストールされた。C:\Program Files\Corel\Corel PaintShop Pro 2018 (64-bit)\ にインストールされた模様。

試用には、Corelのアカウントが必要らしい。以前何かで登録してあったので、そのアカウントを利用。

触った感じでは…。トーンカーブが使える Photoshop Elements、かなあ…。

「Ver. 2018は起動時間が50%速くなったぞ!」と謳われてるけど、それでも結構時間がかかる。体感では、Photoshop Elements 8.0の数倍長い起動時間のような印象。前バージョンは一体どんだけ遅かったんや。

機能面は…。オブジェクトの抽出、がちょっと気になった。画像 → オブジェクトの抽出、で使える。切り抜きたい部分をブラシで囲んでから、その中をバケツで塗って実行すると、ブラシで塗った部分を境界として切り抜き作業をしてくれる。PhotoImpactにあった機能を持ってきたらしい。いや、再実装したのかもしれんけど。たしか Photoshop にもこういう機能が…。境界線の調整、だったっけ? アレをもっと荒くしたような機能、っぽいなと。

ブラシ関係は、これといった魅力を感じなかった。そもそも Corel は、お絵かき用途に Painterシリーズを推しているらしいので、PaintShop Pro のブラシ機能についてはあまり力を入れてないらしい。

自分は普段、GIMP、Krita、CLIP STUDIO PAINT、場合によっては稀に Photoshop Elements、あたりを使うことで作業を済ませたりするのだけど…。そんな状態なので、「コレは絶対に欲しい」と思う何かしらを PaintShop Pro には感じなかった。が、Photoshop の代替品、かつ、安いソフトが欲しいという場面なら、このソフトを選択するのもアリかなと。少なくとも機能面は十分に揃っていて、Photoshop Elements + α のように感じたわけで。

まあ、自分、Paintgraphic 3 もHDDの肥やしにしてる状態なので、コレ以上この手のソフトを入手してもおそらく使わないのでは、てな予感もあるのだけど。

2017/11/22(水) [n年前の日記]

#1 [lua][windows] luarocksとluacheckをWindowsにインストール

luarocksなるものをインストールすると、lua関係の便利なアレコレが簡単にインストールできるようになるらしい。更に、luarocks を使って luacheck をインストールすることで、luaのソースファイルを静的チェックできるようで。試しにWindows10 x64上でインストールしてみようかなと。

以下を参考にして作業。

_にっき♪: luacheck
_LuaとLuaRocksのWindowsインストール
_Installation instructions for Windows - luarocks/luarocks Wiki

luarocksをインストール。 :

インストールには、Lua とリンクライブラリとやらが必要。以下の2つを _Lua Binaries Download からDLして解凍。インストール。
lua-5.3.4_Win32_bin.zip
lua-5.3.4_Win32_dllw4_lib.zip

また、途中でコンパイルをするから、Visual Studio が必要になるっぽい。自分の環境は Visual Studio 2015 Community をインストールしてあるので、スタートメニューから、開発者コマンドプロンプトを実行して、その上で作業した。

_LuaRocks releases から、luarocks-2.4.3-win32.zip をDL、解凍。luaにPATHが通ってる状態で以下を打って luarocks をインストール。
install /LUA Luaインストール場所\ /P LuaRocksインストール場所
今回は以下のフォルダを指定。
install /LUA D:\Dev\lua_x86\ /P D:\Dev\luarocks

気を利かせたつもりで、事前にLuaRocksインストール場所を作成しておくと、「指定されたフォルダが既にあるからインストールできねえ」と文句を言われる。事前に作成しないほうがヨサゲ。

luarocks.bat その他が作られた。環境変数 PATH に通しておく。

luacheckをインストール。 :

luarocks install luacheck で、luacheck がインストールできるはずなのだけど…。
D:\Dev\lua_x86>luarocks install luacheck

Installing https://luarocks.org/luacheck-0.21.2-1.src.rock
Missing dependencies for luacheck 0.21.2-1:
   luafilesystem >= 1.6.3 (not installed)
luacheck 0.21.2-1 depends on luafilesystem >= 1.6.3 (not installed)
Installing https://luarocks.org/luafilesystem-1.7.0-2.src.rock
cl /nologo /MD /O2 -c -Fosrc/lfs.obj -ID:/Dev/lua_x86/include src/lfs.c
lfs.c
link -dll -def:lfs.def -out:lfs.dll D:/Dev/lua_x86/lua53.dll src/lfs.obj
Microsoft (R) Incremental Linker Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.
D:\Dev\lua_x86\lua53.dll : fatal error LNK1107: ファイルが無効であるか、または壊れています: 0x330 を読み取れません。
Error: Failed installing dependency: https://luarocks.org/luafilesystem-1.7.0-2.src.rock - Build error: Failed compiling module lfs.dll

lfs.dll とやらが作れないぞ、と怒られてしまった。

_installing on windows fails with LNK1107 (lua 5.2) - Issue #82 - keplerproject/luafilesystem

Visual Studio 2015 (VC14) と一致する何かしらのファイル群が必要らしい…。

_LuaBinaries - Browse /5.3.4/Windows Libraries/Static から、lua-5.3.4_Win32_vc14_lib.zip をDLして解凍。Luaインストール場所にコピー。どうも lua53.lib というファイルが必要だったらしい。

luarocksインストール場所\config-5.3.lua の修正も必要。中の一部を以下に変更。
    LUALIB = 'lua53.dll'
     ↓
    LUALIB = 'lua53.lib'

この状態で再度インストールを試す。
luarocks install luafilesystem
luarocks install luacheck

Luaインストール場所\systree\bin\luacheck.bat ができた。Luaインストール場所の直下にコピー。

動作確認。 :

luacheck hoge.lua でチェックができる。

が、love2d用のluaソースを渡すと、「loveって何だ? そんなの知らねえよ!」と山ほど怒られる。これでは…使えないな…。

この記事へのツッコミ

Re: luarocksとluacheckをWindowsにインストール by 名無しさん    2022/10/21 23:34
突然のコメント失礼いたします.
本記事を参考にLuaの導入をしようとしています.(Win10 62bit版 VS2017)です)
installコマンドをコマンドプロンプト上で実行できません.
PATHを通せばいいのかな,と考え調べてみたのですがwingetのサブコマンドとしてのinstallしか出てきません.
もしよろしければ>install /LUA path /P PATHの部分をどのように実行されているかお教えいただけませんでしょうか?
Re: luarocksとluacheckをWindowsにインストール by mieki256    2022/10/26 00:24
> wingetのサブコマンドとしてのinstallしか出てきません.

luarocks-2.4.3-win32.zip を解凍すると、中に install.bat が入っていて、当時はソレを呼び出してインストール処理をしていたようです。
luarocks-x.x.x-windows-32.zip ではなくて、
luarocks-x.x.x-win32.zip を入手する必要があります。

> install /LUA path /P PATHの部分をどのように実行されているか

記事中にもメモしてありますが以下の指定で実行していたようです。

install /LUA D:\Dev\lua_x86\ /P D:\Dev\luarocks

D:\Dev\lua_x86\ に lua.exe その他が既に入っていて、
D:\Dev\luarocks\ に luarocks をインストールしようとしています。

ただ、私自身は、後々 hererocks というツールを使って
Lua と Luarocks をビルドして使う形に移行したようです…。
2021/06/19頃の日記に、その旨メモしてありました…。

#2 [lua][windows] Visual Studio Code にLua関係の拡張をインストールしてみたり

Windows10 x64 + Visual Studio Code 1.18.1 に、Lua関係の拡張をインストールしてみたり。

_vscode-lua - Visual Studio Marketplace
_LOVE - Visual Studio Marketplace

Alt + L で love2d を実行できる、らしい。

そこそこ補完が効いてくれる模様。

#3 [lua][emacs] Emacs(NT Emacs)にLuaとlove2d関係のauto-completeをインストール

Lua関係の auto-completeパッケージを見かけたので試しにインストール。Lua用のソースを書く際に補完してくれるようになるっぽい。

環境は Windows10 x64 + NTEmacs 24.5.1。 _Lua-mode と auto-complete はインストール済み。

_rolpereira/auto-complete-lua.el: Auto-complete builtin Lua functions in Emacs
_rolpereira/auto-complete-love.el: Auto-complete LOVE functions in Emacs

それぞれzipファイルをDLして解凍。

以下のファイルやフォルダを、Emacsからパスが通ったところにコピー。
auto-complete-lua.el
auto-complete-lua-tests.el
lua-documentation
auto-complete-love.el
auto-complete-love-tests.el

~/.emacs に以下を記述。

(require 'auto-complete-lua)
;; (add-hook 'lua-mode-hook '(lambda ()
;;                             (setq ac-sources '(ac-source-lua))
;;                             (auto-complete-mode 1)))

(require 'auto-complete-love)
(add-hook 'lua-mode-hook '(lambda ()
                            (setq ac-sources '(ac-source-love))
                            ; Uncomment only if you're using `auto-complete-lua' (see below)
                            (push ac-source-lua ac-sources)
                            (auto-complete-mode 1)))

auto-complete-lua と auto-complete-love の両方を入れる場合、auto-complete-love側の設定だけをしておけばいいらしい。最初、両方の設定を書いてしまったら補完がちゃんと動かなかった。

参考までに、~/.emacs のLua関係の設定部分をメモ。
;; ----------------------------------------
;; lua-mode

;; This snippet enables lua-mode
;; This line is not necessary, if lua-mode.el is already on your load-path
;; (add-to-list 'load-path "/path/to/directory/where/lua-mode-el/resides")

(autoload 'lua-mode "lua-mode" "Lua editing mode." t)
(add-to-list 'auto-mode-alist '("\\.lua$" . lua-mode))
(add-to-list 'interpreter-mode-alist '("lua" . lua-mode))

(setq lua-indent-level 2)

(add-hook 'lua-mode-hook
          '(lambda ()
             (abbrev-mode 1)
             (electric-pair-mode t)
             (electric-indent-mode t)
             (electric-layout-mode t)
             ;; ||も括弧の補完の対象にする
             ;; (add-to-list 'electric-pair-pairs '(?| . ?|))
             ))

;; love2d love-minor-mode
(require 'love-minor-mode)

(require 'auto-complete-lua)
;; (add-hook 'lua-mode-hook '(lambda ()
;;                             (setq ac-sources '(ac-source-lua))
;;                             (auto-complete-mode 1)))

(require 'auto-complete-love)
(add-hook 'lua-mode-hook
          '(lambda ()
             (setq ac-sources
                   (append ac-sources '(ac-source-love ac-source-lua)))
             (auto-complete-mode 1)))
ac-sources に、ac-source-love と ac-source-lua を追加する形にしてみた。

ちなみに、love2d-minor-mode は以下で入手できる。

_ejmr/love-minor-mode: An Emacs minor mode for LOVE

2017/11/23(木) [n年前の日記]

#1 [lua] Luaについて勉強中

Luaでクラスを作る方法について勉強中。以下を参考にしてちょこちょこ試してたり。

_Luaでオブジェクト指向(1)―基本はコロン記法とメタテーブル - Minecraftとタートルと僕
_blog/luaoo.md at master - kengonakajima/blog
_第 4 回: Lua のオブジェクト指向について紹介する - WTOPIA v1.0 documentation
_八角研究所 : 高速スクリプト言語「Lua」を始めよう!(4) - 高速スクリプト言語「Lua」を始めよう!(4)
_Luaの文法とオブジェクト指向 - yappyの日記

2017/11/24(金) [n年前の日記]

#1 [lua][love2d] love2dで敵をたくさん出してみる

Luaでクラスを作る方法が分かってきたので love2d で実験。雑魚的相当のオブジェクトをたくさん出せそうかテスト。

こんな感じに。

enemys_test01_ss.gif

以下の環境で動かしてみたけれど、どちらも同じように動作した。

画像とソース。 :

使用画像は以下。License : CC0 / Public Domain ってことで。

_bg_640x480_02.png
_enemy02.png

ソースは以下。

_conf.lua
function love.conf(t)
  t.window.title = "Enemys Test01"
  t.window.width = 1280
  t.window.height = 720
  t.window.vsync = true
  -- t.window.fullscreen = true
  -- t.window.fullscreentype = "exclusive"
end

_main.lua
function love.load()
  -- init

  -- set filter
  love.graphics.setDefaultFilter("nearest", "nearest")

  scr_w = 640
  scr_h = 480
  canvas = love.graphics.newCanvas(scr_w, scr_h)

  -- get window width and height
  wdw_w, wdw_h = love.graphics.getDimensions()
  scr_scale = math.min((wdw_w / scr_w), (wdw_h / scr_h))
  scr_ofsx = (wdw_w - (scr_w * scr_scale)) / 2
  scr_ofsy = (wdw_h - (scr_h * scr_scale)) / 2

  -- load image
  bgimg = love.graphics.newImage("bg_640x480_02.png")
  enemy_img = love.graphics.newImage("enemy02.png")

  -- define enemy class
  Enemy = {}
  Enemy.new = function(x, y, dx, dy, xw, ang, angspd, img)
    local obj = {}
    obj.activate = true
    obj.x = x
    obj.y = y
    obj.dx = dx
    obj.dy = dy
    obj.bx = x
    obj.by = y
    obj.xw = xw
    obj.angle = ang
    obj.angspd = angspd
    obj.img = img
    obj.img_w = img:getWidth()
    obj.img_h = img:getHeight()
    setmetatable(obj, {__index = Enemy})
    return obj
  end

  Enemy.update = function(self, dt)
    if not self.activate then return end

    self.bx = self.bx + self.dx * dt
    self.y = self.y + self.dy * dt
    self.x = self.bx + self.xw * math.sin(math.rad(self.angle))
    self.angle = (self.angle + self.angspd * dt) % 360.0
    if self.y - self.img_h > scr_h then self.activate = false end
  end

  Enemy.draw = function(self)
    if not self.activate then return end

    local x = self.x - self.img_w / 2
    local y = self.y - self.img_h / 2
    local ang = math.rad(self.angle)
    local scale = 1.0
    local ox = self.img_w / 2
    local oy = self.img_h / 2
    love.graphics.draw(self.img, x, y, ang, scale, scale, ox, oy)
  end

  -- work
  enemys = {}
  born_timer = 0.0
  math.randomseed(0)

  -- framerate steady
  min_dt = 1 / 60
  next_time = love.timer.getTime()
end

function love.update(dt)
  -- update
  next_time = next_time + min_dt
  if dt > 1.0 then return end

  born_timer = born_timer + dt
  if born_timer >= 0.3 then
    -- enemy born
    born_timer = born_timer - 0.3
    x = math.random(scr_w)
    y = -32
    dx = 0
    dy = 40 + math.random(80)
    xw = 50
    ang = math.random(360)
    angspd = 240
    obj = Enemy.new(x, y, dx, dy, xw, ang, angspd, enemy_img)
    table.insert(enemys, obj)
  end

  -- move enemys
  for i, spr in ipairs(enemys) do
    spr:update(dt)
  end

  -- remove enemy
  local elen = #enemys
  for i=elen,1,-1 do
    if not enemys[i].activate then
      table.remove(enemys, i)
    end
  end
end

function love.draw()
  -- set canvas
  love.graphics.setCanvas(canvas)

  -- draw BG
  love.graphics.setColor(255, 255, 255)
  love.graphics.draw(bgimg, 0, 0)

  -- draw objects
  love.graphics.setColor(255, 255, 255)
  for i, spr in ipairs(enemys) do
    spr:draw()
  end

  -- unset canvas
  love.graphics.setCanvas()

  -- draw canvas to window
  love.graphics.setColor(255, 255, 255)
  love.graphics.draw(canvas, scr_ofsx, scr_ofsy, 0, scr_scale, scr_scale)

  love.graphics.print("FPS: "..tostring(love.timer.getFPS()), 10, 10)
  love.graphics.print("env: "..tostring(love.system.getOS()), 10, 40)
  love.graphics.print("enemys: "..tostring(#enemys), 10, 60)

  if love.system.getOS() == "Windows" then
    -- wait
    local cur_time = love.timer.getTime()
    if next_time <= cur_time then
      next_time = cur_time
    else
      love.timer.sleep(next_time - cur_time)
    end
  end
end

function love.keypressed(key, isrepeat)
  -- ESC to exit
  if key == "escape" then
    love.event.quit()
  end
end

画像とソースをテキトーな名前のフォルダに入れて、love フォルダ名、で実行。

少し解説。 :

上記のソースでは、Enemy というクラスを作って処理をしてる。以下の3つのメソッドを用意した。
  • クラス生成用メソッド Enemy.new
  • 座標更新処理用メソッド Enemy.update
  • 描画処理用メソッド Enemy.draw

Luaでクラスを作る際の書き方については、以下の解説ページが参考になった。

_Luaでオブジェクト指向(1)―基本はコロン記法とメタテーブル - Minecraftとタートルと僕
_blog/luaoo.md at master - kengonakajima/blog

色んな書き方があるっぽいけど…。
  • hoge.new の中で他のメソッドも書くやり方だと、インスタンスを作るたびにメソッドが別領域に作られてメモリの無駄遣いになる。
  • かといって setmetatable を使うと、メソッドは同じ領域を使うからメモリの面では助かるけど、メソッド名の検索が一々入るから処理速度は遅くなる。
さて、どっちがいいのだろうなと…。

2017/11/25() [n年前の日記]

#1 [dtm] FL Studio 12.5.1をアンインストールしたら酷いことに

先日、FL Studio を 12.5.1 にアップグレードしたら VST のスキャンが異様に遅くなってしまって。12.x に上書きインストールしたせいでおかしくなったのかなと思えてきたので、アンインストールして再インストールしてみようとしたのだけど。

FL Studio をアンインストールしたら、フリーのVST群をインストールしてあった C:\Program Files (x86)\Vstplugins\ フォルダまで削除されてしまった…。なんてことをしてくれるんだ…。

幸い、C:\Program Files (x86)\Vstplugins\ は Dドライブに移動してシンボリックリンクを張ってたから、リンクが削除されただけでファイルの実体は全部残ってたから助かったのだけど。C:\Program Files (x86)\Common Files\VST* 等も削除された可能性があるかもなと…。

2017/11/26() [n年前の日記]

#1 [cg_tools] ドット絵作成中

EDGE2を使ってドット絵作成中。シューティングゲームの自機に使えそうなドット絵を描こうとしてるところ。

やはり、左右対称モード、上下対称モードがが欲しい…。コピーして貼り付けて反転するのが面倒…。バランスが掴みづらい。

2017/11/27(月) [n年前の日記]

#1 [love2d][lua] love2dでシューティングゲームの自機っぽいものを書いてたり

love2dを使って、縦スクロールシューティングゲームの自機っぽい処理を書いてたり。

こんな感じに。カーソルキーで移動。Zキーで弾を撃つ方向の変更/固定を切り替え。

stg_player_test01_ss.gif

動作確認環境は、Windows10 x64 + love2d 0.10.2。

弾を加算合成で描画してるので、love2d 0.10.0以降が必要。もっとも、加算合成の指定部分を修正すれば love2d 0.9.x でも動きそうだけど…。

使用画像。 :

以下が自作の使用画像。License : CC0 / Public Domain ってことで。

_airplane_03_64x64_000.png
_airplane_03_64x64_001.png
_bg_640x480_02.png
_bullet_01_32x32.png

ソース。 :

_conf.lua
function love.conf(t)
  t.window.title = "Stg Player Test01"
  t.window.width = 1280
  t.window.height = 720
  t.window.vsync = true
  -- t.window.fullscreen = true
  -- t.window.fullscreentype = "exclusive"
end

_main.lua
-- Stg Player Test01

angle_change_key = false

function love.load()
  -- init

  -- set filter
  love.graphics.setDefaultFilter("nearest", "nearest")

  scr_w = 640
  scr_h = 480
  canvas = love.graphics.newCanvas(scr_w, scr_h)

  -- get window width and height
  wdw_w, wdw_h = love.graphics.getDimensions()
  scr_scale = math.min((wdw_w / scr_w), (wdw_h / scr_h))
  scr_ofsx = (wdw_w - (scr_w * scr_scale)) / 2
  scr_ofsy = (wdw_h - (scr_h * scr_scale)) / 2

  -- load image
  bgimg = love.graphics.newImage("bg_640x480_02.png")
  player_img_a = love.graphics.newImage("airplane_03_64x64_000.png")
  player_img_b = love.graphics.newImage("airplane_03_64x64_001.png")
  bullet_img = love.graphics.newImage("bullet_01_32x32.png")

  -- define player class
  Player = {}
  Player.new = function(x, y, img_a, img_b)
    local obj = {}
    obj.activate = true
    obj.speed = 300
    obj.x = x
    obj.y = y
    obj.gun_angle = -90
    obj.gun_angle_change_mode = false
    obj.img_a = img_a
    obj.img_b = img_b
    obj.img_w = img_a:getWidth()
    obj.img_h = img_a:getHeight()
    setmetatable(obj, {__index = Player})
    return obj
  end

  Player.update = function(self, dt)
    if not self.activate then return end

    if angle_change_key then
      self.gun_angle_change_mode = not(self.gun_angle_change_mode)
      angle_change_key = false
    end

    local ang = -1
    if love.keyboard.isDown("left") then ang = 180
    elseif love.keyboard.isDown("right") then ang = 0
    end
    if love.keyboard.isDown("up") then
      if ang < 0 then ang = 270
      elseif ang == 0 then ang = 270 + 45
      else ang = 180 + 45
      end
    elseif love.keyboard.isDown("down") then
      if ang < 0 then ang = 90
      elseif ang == 0 then ang = 45
      else ang = 180 - 45
      end
    end
    if ang >= 0 then
      local spd = self.speed * dt
      local ra = math.rad(ang)
      self.x = self.x + (spd * math.cos(ra))
      self.y = self.y + (spd * math.sin(ra))

      if self.gun_angle_change_mode then
        -- gun angle change
        local tgt_ang = (ang + 180) % 360
        if self.gun_angle ~= tgt_ang then
          local a = (tgt_ang - self.gun_angle) % 360
          if a > 180 then a = a - 360 end
          local spd = 5
          if a > 0 then
            if a < spd then
              self.gun_angle = tgt_ang
            else
              self.gun_angle = (self.gun_angle + spd) % 360
            end
          elseif a < 0 then
            if a > -spd then
              self.gun_angle = tgt_ang
            else
              self.gun_angle = (self.gun_angle - spd) % 360
            end
          end
        end
      end
    end

    -- move area check
    local wh = self.img_w / 2
    local hh = self.img_h / 2
    local xmin, ymin = wh, hh
    local xmax, ymax = scr_w - wh, scr_h - hh
    self.x = math.min(math.max(self.x, xmin), xmax)
    self.y = math.min(math.max(self.y, ymin), ymax)
  end

  Player.draw = function(self)
    if not self.activate then return end
    local ox, oy = self.img_w / 2, self.img_h / 2
    local x, y = self.x, self.y
    local ang = math.rad(self.gun_angle)
    local scale = 1.0
    love.graphics.draw(self.img_a, x, y, 0, scale, scale, ox, oy)
    love.graphics.draw(self.img_b, x, y, ang, scale, scale, ox, oy)
  end

  -- define player bullet class
  PlayerBullet = {}
  PlayerBullet.new = function(x, y, ang, img)
    local obj = {
      speed = 600,
      activate = true, x = x, y = y, ang = ang, img = img
    }
    obj.img_w, obj.img_h = img:getWidth(), img:getHeight()
    obj.img_wh, obj.img_hh = obj.img_w / 2, obj.img_h / 2
    setmetatable(obj, {__index = PlayerBullet})
    return obj
  end

  PlayerBullet.update = function(self, dt)
    if not self.activate then return end
    local ra = math.rad(self.ang)
    self.x = self.x + (math.cos(ra) * self.speed * dt)
    self.y = self.y + (math.sin(ra) * self.speed * dt)
    local xmin, ymin = -self.img_wh, -self.img_hh
    local xmax, ymax = scr_w + self.img_wh, scr_h + self.img_hh
    if self.x < xmin or self.x > xmax or self.y < ymin or self.y > ymax then
      self.activate = false
    end
  end

  PlayerBullet.draw = function(self)
    if not self.activate then return end
    love.graphics.draw(self.img, self.x, self.y,
                       math.rad(self.ang), 1.0, 1.0,
                       self.img_wh, self.img_hh)
  end

  -- work
  math.randomseed(0)
  player = Player.new(scr_w / 2, scr_h / 2, player_img_a, player_img_b)
  player_bullets = {}
  shot_timer = 0

  -- framerate steady
  min_dt = 1 / 60
  next_time = love.timer.getTime()
end

function love.update(dt)
  -- update
  next_time = next_time + min_dt
  if dt > 1.0 then return end

  player:update(dt)

  shot_timer = shot_timer + dt
  if shot_timer >= 0.1 then
    -- born player bullet
    shot_timer = shot_timer - 0.1
    local x = player.x
    local y = player.y
    local ang = player.gun_angle + math.random(-20, 20) / 10
    local obj = PlayerBullet.new(x, y, ang, bullet_img)
    table.insert(player_bullets, obj)
  end

  -- move player bullets
  for i, spr in ipairs(player_bullets) do
    spr:update(dt)
  end

  -- remove bullet
  local elen = #player_bullets
  for i=elen,1,-1 do
    if not player_bullets[i].activate then
      table.remove(player_bullets, i)
    end
  end
end

function love.draw()
  -- set canvas
  love.graphics.setCanvas(canvas)

  -- draw BG
  love.graphics.setColor(255, 255, 255)
  love.graphics.draw(bgimg, 0, 0)

  -- draw objects
  love.graphics.setColor(255, 255, 255)
  player:draw()

  love.graphics.setBlendMode("add")
  for i, spr in ipairs(player_bullets) do
    spr:draw()
  end
  love.graphics.setBlendMode("alpha")

  -- unset canvas
  love.graphics.setCanvas()

  -- draw canvas to window
  love.graphics.setColor(255, 255, 255)
  love.graphics.draw(canvas, scr_ofsx, scr_ofsy, 0, scr_scale, scr_scale)

  love.graphics.print("FPS: "..tostring(love.timer.getFPS()), 10, 10)
  love.graphics.print("env: "..tostring(love.system.getOS()), 10, 40)

  if love.system.getOS() == "Windows" then
    -- wait
    local cur_time = love.timer.getTime()
    if next_time <= cur_time then
      next_time = cur_time
    else
      love.timer.sleep(next_time - cur_time)
    end
  end
end

function love.keypressed(key, isrepeat)
  -- ESC to exit
  if key == "escape" then
    love.event.quit()
  elseif key == "z" then
    angle_change_key = true
  end
end

少し説明。 :

加算合成描画は、love.graphics.setBlendMode("add") を指定してから描画すればいいらしい。通常描画に戻すときは、love.graphics.setBlendMode("alpha") を呼ぶ。
  love.graphics.setBlendMode("add")
  for i, spr in ipairs(player_bullets) do
    spr:draw()
  end
  love.graphics.setBlendMode("alpha")

#2 [cg_tools] シューティングゲームの自機に使えそうな画像

ゲームっぽいサンプルソースを書く際に自機の画像があったほうが雰囲気が出てモチベーションが上がる気がするので、自作画像を置いときます。License : CC0 / Public Domain ってことで。好きに使ってください。砲台部分は重ねて使うことを前提にして描いてある…けど無くてもいいような。

airplane_02_64x64.png
_airplane_02_64x64.png

airplane_02_64x64_000.png
_airplane_02_64x64_000.png

airplane_02_64x64_001.png
_airplane_02_64x64_001.png

airplane_03_64x64.png
_airplane_03_64x64.png

airplane_03_64x64_000.png
_airplane_03_64x64_000.png

airplane_03_64x64_001.png
_airplane_03_64x64_001.png

airplane_04_64x64.png
_airplane_04_64x64.png

airplane_04_64x64_000.png
_airplane_04_64x64_000.png

airplane_04_64x64_001.png
_airplane_04_64x64_001.png

bullet_01_32x32.png
_bullet_01_32x32.png

#3 [cg_tools] 使い勝手の良いオープンな画像フォーマットは存在するのだろうか

ドット絵を作る際は、 _EDGE2_GrafX2 を使って作業しているのだけど。GrafX2 で描いてgifで保存してから EDGE2 で開こうとしたら「アニメーションのデータがおかしいから開けんわい」と怒られてしまったり。

どうも GrafX2 は、レイヤーも含んだ状態で画像を保存するために、アニメGIFとして保存してる気配が。アニメGIFのフレームが、レイヤー扱いになってるのではないかなあ…。そしておそらく、アニメGIFではあり得ない形で情報を格納してるのかも。

こういう状態になるのも、レイヤーを含めることができて、かつ、仕様が公開されてるオープンな画像フォーマットが当時は存在してなかったから、なのだろうなと。

いやまあ、GIMP の .xcf とか一応あったけど、当時はフォーマット仕様が文書の形で存在してなくて「ソースが仕様だ」とか言ってたらしいし。Photoshop の .psd は仕様が公開されてなくて各自が解析しながら独自実装してたし。そもそもその手のCGソフトは、機能追加するたびに作業用ファイルに保存する情報も増えていくから、事前にカッチリと決めておくのが難しいという事情も。

しかし…。今なら何か使えそうなフォーマットがありそうな気も。

あるいは、今から新規に策定するなら、どういう仕様にするのが妥当なんだろう。各レイヤーは png にして、xmlで管理情報を保持、とかそんな感じだろうか…。

2017/11/28(火) [n年前の日記]

#1 [cg_tools] エフェクト画像を作成中

BGをスクロールさせる処理を入れてみたけど、弾が地形に当たった際のエフェクトが欲しいなと。てなわけで、 _Detonation を使ってエフェクト画像を作成中。

どうも欲しいイメージに近づいてくれない…。難しい…。

2017/11/29(水) [n年前の日記]

#1 [cg_tools] エフェクト画像をまだ作成中

_Detonation を使ってエフェクト画像をまだ作成中。なかなか思ったように作れない…。

爆発時にリングが広がるように見せたくなってきたので、リング画像をGIMPで作成。集中線を描画できる、 _Speedline というプラグインを使わせてもらって作業してるところ。

2017/11/30(木) [n年前の日記]

#1 [cg_tools] 敵弾の画像作成で悩んだり

シューティングゲームであれば、えてして雑魚敵が弾を撃ってくるものだろうと。であれば敵弾の画像が必要だよなと。てなわけで作成しようと試みたのだけど、どうも今一つな出来に。

視認性を高めるためには、点滅なり回転なりをしたほうがいいのだろう、と思って一応点滅するように色が微妙に変わっていく3パターンでアニメをするようにしてみたけれど、どうもハッキリと認識できないような。

このあたり、何かノウハウがあるのではないか…。と思ってググってみたけど、「敵弾のグラフィックはこうあるべき」てなあたりを誰も言及・説明してないようで。うーん。ゲームをプレイする側は、視認性が悪い場合にソレを問題視してるようだけど、「視認性が悪い」という感想だけで終わってしまって、何故視認性が悪いのか原因を推測して、改善案まで検討してる事例はほとんど無くて。

それでも一応、参考になりそうなページを少し見かけたのでメモ。

点滅の有無。 :

_「バトルガレッガ Rev.2016」,秋葉原Heyにて期間限定でアーケード版の稼働を実施。敵弾カラー変更の紹介ムービーの公開も - 4Gamer.net

敵弾の表現として、以下を用意してるらしい。
  • 1パターンを表示するだけ。
  • 弾の色を赤と青で構成。点滅無し。
  • 弾の色を赤と青で構成+白も挿入して点滅有り。
  • 弾の色を赤と青で構成+グレー?も挿入して点滅有り。
  • 弾の色をピンク+白を挿入して点滅有り。
「刺激性の強い色使いにする」「点滅させる」てなあたりが策だろうか。しかし、アーケード版は何もしてなかったというのが気になる。何もしないほうが、パッと見ではリアルな画面に感じる、てなことだろうか。まあ、現実世界では、点滅する存在のほうが珍しいわけで。

しかし、点滅させればいいというモノでもなさそうな。例えば以下のタイトル。

_Hyper Duel (Arcade/Technosoft/1993 Keith) [HD] - YouTube
_Sega Saturn Longplay [006] Hyper Duel - YouTube

アーケード版に比べると後者のコンシューマ版のほうが敵弾が描き込まれていてリッチさが増してるけど、かえって見づらくなってないか、という気もするわけで。

縁取り。 :

_四色カラーで視認性を上げるために: ドット絵とアイデアと

4色しか使えない環境では、黒で縁取ることで視認性が上がる、という話が出ている。アタリが存在するものは輪郭をハッキリさせる、という方針というか。

回転。 :

_回転と点滅、どっちが目立つ?表示灯の点灯方式の違いについて - LED回転灯.com

ゲームのグラフィックの話ではないけれど、警告灯は、回転と点滅のどちらが目立つか、という話らしい。回転するほうがより目立つ、ということかな…。

回転する敵弾と言えば、このあたりだろうか。

_レイディアントシルバーガン - YouTube
_1988 [60fps] Gradius II Type4 Nomiss Loop1 - YouTube

発光とは相性が悪い。 :

_【東方】最近光る弾多くないかな…以前の境目がある弾の方が見やすいと思う|2ch東方スレ観測所

加算描画を多用して光らせる事例が多くなってきてるけど、避けづらくなったという苦情が出てる。考えてみれば、4色で画像作成する話で出ていた、「アタリが存在するものは輪郭をハッキリさせる」という方針と真逆なわけだから、そりゃプレイしづらくなって当然かもしれないなと。ただ、加算描画って見た目が奇麗だから、ウケがよさそうではある…。

#2 [pc] マウスを交換

今まで使ってた ELECOM M-XG1UBSV のホイールがおかしくなってきたので、予備の M-XG1UBSV と交換。これが最後の予備。生産中止になった製品なので、次回壊れたら別製品を探さないと…。

前回交換したのは…。 _2016/12/13 だったらしい。やっぱり1年で壊れていく製品らしい。

以上、30 日分です。

過去ログ表示

Prev - 2017/11 - Next
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

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project