へっぽこ技術ブログです

【JavaFX】JavaFXのWeb資料 覚書

OracleのサイトにあるJavaFX関連の解説ページURLを記録しておく。

 

Canvasの使い方をこれで勉強した。

  JavaFX: JavaFXグラフィックスの操作

  https://docs.oracle.com/javase/jp/8/javafx/graphics-tutorial/index.html

cssのところを読んでやってみた。

  JavaFX: JavaFXスタート・ガイド

  https://docs.oracle.com/javase/jp/8/javafx/get-started-tutorial/index.html

 

NetBEANS IDEで作業するようになってるけど、自分はIntelliJ IDEA Com.Ed. でやった。当然だけど特に問題なし(読み替えは多少あるけど)。

 

自分への覚書

おしまい

 

【Windows】Windows10の回復メディア作成ツールでハマった件(覚書)

メーカー製PCなんてとんと買わない(仕事では山ほど毎年新規でいじるけど店頭販売品とはちと違う)ので知らなかったのですが、昔はたいていPCに添付されていた再セットアップ用リカバリーメディア(回復メディア)がWindows10になって付かなくなってたんですね。

で、Windows10には「回復メディア作成ツール」って標準機能が付いたので、ができてそれを使うようになった、と。 知人がノートPCを購入して相談に乗ってたので、そのとき初めて知りました。

 

その「回復メディア作成ツール」でハマったので覚書。

 

USBメモリを使って回復メディアを作ろうとしていたのですが、「回復ドライブを作成できません」 との表示が出て途中で止まっちゃう。何度やっても。まともなエラーメッセージはなく、「回復ドライブの作成中に問題が発生しました。」の文章のみ。

 

色々なサイトをみて試行してみたけど有効だったのは『古いUSB2.0規格のUSBハブを経由してUSBメモリを接続して試した』場合のみだった。USB3のポートにUSB3(3.1)のUSBメモリを繋げて作成していたのだけどコレがいけなかった模様。2.0規格のUSBメモリを買っておけばよかった、しっぱいしっぱい。

 

おしまい

【Windows】ディスプレイだけ表示されなくなる状態を設定変更して回避した話

状況

・メーカー製ノートPCにWindows 10をクリーンインストールしたものを共有PCとして設置してある
・使用後にディスプレイを開いたまま放置されると、電源はオンのまま画面が何も映っていない状態になる
・マウス、キーボード、電源ボタンのどれを操作しても画面表示が復帰しない。
・電源ボタン長押しで強制的に電源オフするしかない。

対処方法

・「電源オプション」を表示する。
 (コントロールパネルから選ぶか、タスクトレイの電源アイコンを右クリックして選ぶ)
・いま選ばれている電源プランの「プラン設定の変更」リンクをクリックする。
・「ディスプレイの電源を切る」の選択を『適用しない』に変更する。
・「コンピューターのスリープ状態にする」の選択を『5分』などの適当な時間にする。
・「変更の保存」をクリックしてウインドウを閉じる。

これで放置されていても5分後等にスリープ状態になる(画面も暗くなる)が、マウスを動かすなどすればスリープから復帰して画面表示も同時に復帰するようになった。
メーカー製PCに素のWindowsをインストールしたので電源管理周りのデバイスドライバのせいなのかなぁと思うけど真相はわかりません。ちなみに Windows 10 のバージョン1803ってやつです。←2018年の3月版。今は1809がデフォなのかな?

おしまい

【AdventCalendar】【Python】pygameを始めよう。というか、始めた

この記事は横浜医療情報専門学校プログラミングクラブのAdvent Calendar 12月18日分の記事です。というか、忘れてたので急いで書いてます。


adventar.org

 

最近は訳あってプログラミング言語として Pythonばかり使ってるんですが、プログラミング言語の教育やら啓蒙(大げさ)のためには、「上辺と底辺の2つの値を入力して台形の面積を計算するプログラム」とか興味の湧かない計算をネタに学ぶのではなく、「なんか知らんけどカーソルキーで絵が動く」とか面白っぽいネタが必要と考えています。(ちなみに前者は昔に某高校の非常勤講師を受けた時に高校の先生がやっていた内容です。それを全否定してカリキュラム作り直しちゃいましたけど...)

 

という訳で、PythonでもGUIアプリを作る方法を調べたのですが、最初に調べた限りではどこのサイトでもどの書籍でも tkinter というライブラリを使う方法が紹介されていたんですよね。

そこで tkinter を使う方法を試行錯誤して、作品としてアクションゲーム(っぽいやつ)を作ってみたのですが、たくさんの敵キャラを動かしてみたところそれはもうカクカクで実用的ではない。その時に出した結論は『Pythonってアクションゲーム作りには向かない」でした。

 

しかし、ひょんなことから日経ソフトウェアのバックナンバーを見る機会があってその中で書かれていた記事が「pygameライブラリを使ってPythonでゲームを作る」ってやつだったので試したところこれがかなりイケルやつでした。まあ pygameライブラリって10年以上前からあるらしいんですが、出会いってそういうものですよね。出会ってなければ間違った結論のままだったわけで、そういうことって多いんだろうなと改めて実感。

 

とりあえず作りかけのアクションゲーム(っぽいもの)を以下に置いておきます。あくまで作りかけなので悪しからず。こなれたコードになってないことも悪しからず。


# ばくだんくん

import pygame
import random

##### Global Variables #####
SCREEN_WIDTH = 452   #画面のサイズ
SCREEN_HEIGHT = 352  #
COLOR_BLACK = (0,0,0)  # 黒
COLOR_RED =(255,0,0)   # 赤
DX = [-1, 0, 1, 0]   # 向きごとの移動分
DY = [0, -1, 0, 1]   #
stageNumber = 1  # 現在のステージ番号
bombKazu = 1   # 持っている爆弾の数。初期数は1つ
bombLength = 1   # 爆弾の威力。初期は1つ先のマスまで
mapAll = open("./mapdata.txt", "r").readlines()

##### Class #####
class MyChar(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        
        self.muki = 0
        self.jyoutai = 0
        
        self.images = []
        for i in range(4):
            self.images.append(pygame.image.load("./img/my" + str(i) + ".png"))
        self.image = self.images[self.muki]
        colorkey = self.image.get_at((0,0))
        print(colorkey)
        self.image.set_colorkey(colorkey)
        self.rect = self.image.get_rect()

    def changeImage(self):
        self.image = self.images[self.muki]
        
        
class TekiChar(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        
        self.muki = 0
        self.jyoutai = 0
        
        self.images = []
        for i in range(3):
            self.images.append(pygame.image.load("./img/teki" + str(i) + ".png"))
        self.image = self.images[self.muki]
        self.rect = self.image.get_rect()

    def update(self):
        if self.jyoutai <= 0:
            self.muki = random.randrange(4)
            self.jyoutai = 32
            xnext = (self.rect.x - 100) // 32 + DX[self.muki]
            ynext = (self.rect.y      ) // 32 + DY[self.muki]
            if maps[ynext][xnext] != "0":
                self.jyoutai = 0
        else:
            self.image = self.images[(self.rect.x + self.rect.y) % 3]
            self.rect.x += DX[self.muki]
            self.rect.y += DY[self.muki]
            self.jyoutai -= 1



class Bomb(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        
        self.jyoutai = 0

##### SubRoutine #####
def gamenByouga():
    screen.fill(COLOR_BLACK)
    for y in range(11):
        for x in range(11):
            #pygame.draw.rect(screen, (255,255,255), (x * 32, y * 32, 32, 32))
            if maps[y][x] == "8":
                screen.blit(imgBlock, (x * 32 + 100, y * 32))
            elif maps[y][x] == "9":
                screen.blit(imgWall, (x * 32 + 100, y * 32))
            elif maps[y][x] == "G":
                screen.blit(imgDoor, (x * 32 + 100, y * 32))
            else:
                screen.blit(imgFloor, (x * 32 + 100, y * 32))

def mapsSetup():
    global tekiCharGroup
    tekiCharGroup = pygame.sprite.Group()
    global maps
    maps = []
    for y in range(11):
        maps.append(list(mapAll[(stageNumber - 1) * 12 + y]))
        for x in range(11):
            if maps[y][x] == "M":
                myChar.rect.x = 32 * x + 100
                myChar.rect.y = 32 * y
                maps[y][x] = "0"
            elif maps[y][x] == "E":
                tekiChar = TekiChar()
                tekiChar.rect.x = 32 * x + 100
                tekiChar.rect.y = 32 * y
                tekiCharGroup.add(tekiChar)
                maps[y][x] = "0"
    print(maps)
            
#######################################################
##### GAME START
pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
gameclock = pygame.time.Clock()

### Charcter Generate
myCharGroup = pygame.sprite.Group()
myChar = MyChar()
myCharGroup.add(myChar)
tekiCharGroup = pygame.sprite.Group()
tekiChar = TekiChar()
tekiCharGroup.add(tekiChar)

##### Char Tile #####
imgFloor = pygame.image.load("./img/tileFloor.png").convert()
imgBlock = pygame.image.load("./img/tileBlock.png").convert()
imgWall = pygame.image.load("./img/tileWall.png").convert()
imgDoor = pygame.image.load("./img/tileDoor.png").convert()



##### Stage Start
mapsSetup()

for sprite in myCharGroup.sprites():
    print(sprite)
for sprite in tekiCharGroup.sprites():
    print(sprite)

endflag = 0

while endflag == 0:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            endflag = 1

    keypress = pygame.key.get_pressed()
    if myChar.jyoutai == 0:
        if (keypress[pygame.K_LEFT]):
            myChar.muki = 0
            myChar.jyoutai = 8
        elif (keypress[pygame.K_UP]):
            myChar.muki = 1
            myChar.jyoutai = 8
        elif (keypress[pygame.K_RIGHT]):
            myChar.muki = 2
            myChar.jyoutai = 8
        elif (keypress[pygame.K_DOWN]):
            myChar.muki = 3
            myChar.jyoutai = 8
        myChar.changeImage()
    else:
        myChar.rect.x += (DX[myChar.muki] * 4)
        myChar.rect.y += (DY[myChar.muki] * 4)
        myChar.jyoutai -= 1
            
    gamenByouga() # 背景となるマップや残り時間などを描画
    tekiCharGroup.update() # 敵の移動処理
    tekiCharGroup.draw(screen) #敵の描画
    myCharGroup.draw(screen) #自機の描画

    gameclock.tick(30)
    pygame.display.flip()

pygame.quit()

うん、pygameいいよ皆さん始めましょう。というか、やっつけな記事でごめんなー。


明日の記事は、みんなのアイドル 五段パイセンによる『在学生向けポエム「横浜医療情報専門学校を卒業したあと学校と在校生に対して思うこと」』です。お楽しみに〜〜!

【Android】【覚書】エミュレーターが動かなかったのを直した

本日相談を受けて、表題の通り「AndroidのAVDマネージャからエミュレーターを起動しようとしても動かない」という症状を直した(サポートした)ので覚書。

 

環境:Windows 10

 

症状:エミュレーターが起動しない。なにやら exit code 1 とエラー表示される。

 

対処:

・コントロールパネルの「プログラムと機能」からWindowsの機能としてHyper-Vを無効にする

Intelのサイトから「haxm-windows_v7_3_2.zip」をダウンロードしてインストール

 

ググったら、

 Intel HAXM is required to run this AVD.
 Android Emulator is incompatible with Hyper-V. 

 

ってことらしいです。

つまりは仮想化テクノロジーとして「Microsoft社のHyper-V」ではなく「Intel社のVT」を使用するようにしなさいということ。

 

 うん、めんどくさいですね。

【Android】【覚書】最近プレファレンス使ったアプリ作ってなかったからちとハマった

むかーーーしに作ったAndroidアプリの更新をしていたら、利用者の方から不具合報告を頂いた。メインの機能じゃないところなのでバグに気づいてなかったのだけど「アプリが停止しました」と落ちるので早々に不具合対応をする。

 

LogCatによると

   java.lang.SecurityException: MODE_WORLD_READABLE no longer supported   

ってエラーで止まってるので、ググったところ

    getSharedPreferences("RESULT", MODE_WORLD_READABLE)

ってモードの指定が今は使っちゃいけなくて、

    getSharedPreferences("RESULT", MODE_PRIVATE)

ってーのに書き換えたところエラーを吐かなくなりました。

 

まあ、Android 6.0 (マシュマロ)以降で既に使っちゃいけなかったらしいけど、このアプリってAndroid 1.6(ドーナツ)用に作ってたものだもの、許してくださいませ。

 

と、Android 9.0 (パイ)が公開されてるイマドキなのに呑気なものだねー、自分。ごめんなさい。さんじやんうんから

 

【足跡】Python入門の講義資料を作成ちゅう

ただいま表題の講義資料を作成中。

ググったけど1件もHitしなかった

「楽々Python勉強会」

というタイトルにした。

この名称は自分がキープするぜい、という足跡というか覚書として記す。

 

ちなみにハッシュタグは #rakupy ね。これも1件もHitしなかったよん。