へたれ技術っぽいブログしてます

【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しなかったよん。

【覚書】【AI】ふる〜いPCにTensorflow環境を作ったった(多分)という話

会社の倉庫に何台も転がっている古いPCにNVIDIAGPUを載っけて、そこにTensorflowを導入できたっぽいので手順を覚書しておく。

 

■マシン環境:

Fujitsu FMV ESPRIMO D5350

  - MotherBoard : GIGABYTE GA-TQ35M

  - CPU : Intel Core2Duo E6850 3.0GHz

  - Memory : 4GB(DDR2 2GB × 2)

  - HDD : 500GB

  - GPU : MSI Geforce GTX-1050ti 4G OCV1

  - 電源 : 230W

 

■ソフトウェア環境

Windows 10 (Fall Creator Update)

・Anaconda 5.1 (Python 3.6 version, 64-Bit Graphics Installer (537MB))  download

・CUDA 9.0 (cuda_9.0.176_win10.exe と 2つのパッチ)  download

・cuDNN 7.0.5 (cudnn-9.0-windows10-x64-v7.zip)*1  download(要ID登録)

python 3.5.5*2

・tensorflow-gpu 1.5.0

・keras 2.1.6

・Visual C++ 2015 再配布可能パッケージ  download

Visual Studio Community 2017  download

 

■インストール手順 Part.1 (ダウンロードしたソフトのインストール)

(1) コントロールパネルの「プログラムと機能」からNVIDIA関係のものを全てアンインストール

  このPCはグラボを載せるとマザーのDsub出力が使えなくなるので必然的にディスプレイをグラボ側に接続する必要がある。この状態で Windows10 をクリーンインストールするとNVIDIAのソフトが勝手に入ってくるっぽい。CUDAをインストールするときに同じのがインストールされるので、バッティングしないように一応アンインストールしておいた。(この作業が必要かどうかはわからないけど念の為)

(2) Visual C++ 2015 再配布可能パッケージをインストール

 うーん、不必要かも知れない。そのうち試す。

(3) Visual Studio Community 2017 をインストール

 CUDA 9.0のインストール中に「こいつ必要だけど入ってる?」と聞かれるので、あらかじめインストールしておいた。

(4) CUDA 9.0と2つのパッチをインストール

(5) cuDNNのzipを展開して c:¥Program Files¥NVIDIA GPU Computing Toolkit¥CUDA¥v9.0 の下にコピー

(6) Anaconda をインストール

 

■インストール手順 Part.2 (環境構築)

(1) Anaconda Promptを起動。以下、このウインドウで作業する。

(2) 「conda upgrade -n base conda」でcondaを最新版に更新

(3) 「conda create -n tfenv35 python=3.5 jupyter」で tfenv35 という環境を作成*3

(4) 「activate tfenv35」で環境を切り替え。

(5) 「pip install tensorflow-gpu==1.5」でTensorFlow 1.5をインストール

(6) 「pip install keras」でKerasをインストール

 

そのうち Windows10のクリーンインストールからこの手順で大丈夫なのか検証しておく。もう一枚 1050tiを買おうかな?*4

 

 ネットのたくさんの方々のブログを紐解いてここまでできた。皆様の知見公開に感謝。

 

 

 

 

 

*1:7.1.4ではダメ

*2:3.6でも普通に動いた

*3:3.6でも大丈夫だったので conda create -n tfenv36 jupyter ってので良さげ。tfenv36の部分はお好きな名称で

*4:もう一枚買って試した。1080なマシンでも試した。Good!でしたよ

【覚書】【AI】Windows10にTensorflowとKerasを使える環境を設定したいのだけど...

いろいろなWindowsマシン(i7~Core2Duo、GTX1080~GTX750Ti)にTensorflowを入れたのだけどサクッと動くときと実行時にエラーを吐き出すときがあってよくわからない。Web記事をもとにいろいろと試してみるけど、結局のところCUDA、cuDNN、Tensorflow、Pythonのバージョンの組み合わせで不具合が起きているのではないかと思われた。...っちゅーわけで、巷のソレ系の技術ブログさんで示されているバージョンの組み合わせを一覧にしてみようかなーと。

 

見つけ次第に以下へ記していく所存

No. CUDA cuDNN tensorflow-gpu Python
1 8.0 6.0 1.4  
2 9.1 7.1.3 1.8  
3 9.0 7.0 1.6 3.5
4 9.1 7.0.5   3.6
5 8.0 5.1   3.5
6 8.0 6.0    
7 8.0 6.0 1.4 3.5

 空欄はバージョンの記載が無しだったものです。

 

元記事へのリンクも張ろうかと思ったけどちょっとなんなのでヤメておいた。