なんかいろいろこんぴゅーたかんけいのなぐりがき

なんか勉強しているこんぴゅーた関係のことのメモやそれ以外のことを書こうかなあ...

logs

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

pythonからVRAMに書き込む

rectangles.jpg


ウインドウのないWindowsプログラムを作りたかった。もちろんPythonで。
考えてでた案がVRAMに直接書き込めば絵とかwindowなしで書き込めるんじゃね?というもの。
で、いろいろ調べてみるとwindowsのapiでそれが実現できそうだ。

ひたすら調べていくと、CreateDCとかのキーワードがでてきたので、そのキーワードとかで調べてくいと、C言語で実際にウィンドウの外に長方形を書き込んでいるサンプルコードを発見。winapiを使っているということはpythonのctypesでこれを利用できるはずなので、pythonでバインド?してみた。ctypesについてあまりよく理解していないので、ポインタとかをどうやって処理してよいかわからず不安だったが、案外うまくいった。

それで、ある程度まとまったのでソースのメモ。



これが今回の主成果物である writeVRAM.py
色の指定方法が0xBGR(R = 00 から ffまで、B、Gも同様)みたいな感じで指定するのでsetColorにその変換作業が入っている。setColorに0-255以外の値を入れたときの動作は知らん。


import ctypes
dll = ctypes.windll.gdi32
hdc = dll.CreateDCA("DISPLAY",0,0,0)

def setColor(r=255,g=255,b=255):
# 0 <= Color <= 255

#convert to hex
B = hex(b) ; G = hex(g) ; R = hex(r)
#del "0x" string
B = B[B.index("x")+1:]
G = G[G.index("x")+1:]
R = R[R.index("x")+1:]

if B == "0" : B = "00"
if G == "0" : G = "00"
if R == "0" : R = "00"

num = "0x"+B+G+R

dll.SelectObject(hdc,dll.CreateSolidBrush(int(num,16)))

def drawPie(x1,y1,x2,y2,x3,y3,x4,y4):
"""
Pie
"""
dll.Pie(hdc,x1,y1,x2,y2,x3,y3,x4,y4)
def drawRRect(x1,y1,x2,y2,x3,y3):
"""
RoundRect
"""
dll.RoundRect(hdc,x1,y1,x2,y2,x3,y3)
def drawRect(x1,y1,x2,y2):
"""
Rectangle
"""
dll.Rectangle(hdc,x1,y1,x2,y2)


if __name__ == "__main__":
dll.SelectObject(hdc,dll.CreateSolidBrush(0x0000ff))
dll.Rectangle(hdc,100,100,200,200)


これは以前も掲載した気がするが一応掲載したwindowsPCのディスプレイサイズを調べる monitor.py

import ctypes
def getMonitorSize():
x = ctypes.windll.user32.GetSystemMetrics(0)
y = ctypes.windll.user32.GetSystemMetrics(1)
return x,y
def test():
x,y = getMonitorSize()
print x
print y

if __name__ == "__main__":
test()


でこれが、サンプルプログラム。上の2つのコードと一緒のディレクトリにいれてから実行すればあなたのデスクトップが四角だらけになる。コメントアウトをはずせば扇形だらけになる。

from writeVRAM import *
import monitor
import random
import time

mx,my = monitor.getMonitorSize()


while True:
x1 = random.randint(0,mx)
x2 = random.randint(0,mx)
x3 = random.randint(0,mx)
x4 = random.randint(0,mx)
y1 = random.randint(0,my)
y2 = random.randint(0,my)
y3 = random.randint(0,my)
y4 = random.randint(0,my)

setColor(random.randint(0,255),random.randint(0,255),random.randint(0,255))
#drawPie(x1,y1,x2,y2,x3,y3,x4,y4)
drawRect(x1,y1,x2,y2)
time.sleep(1)





今後は余裕があればwriteVRAMを改良して、ビットマップファイルから書き込めたり、高速化、1ピクセルにたいして書き込むメソッドなどを加えたい。

vimperator に plugin をいれた

自分のブラウザは結構前からFirefox + vimperator だった。
vimperator はvim ライクなキーバインドを実現するfirefoxのアドオンでかなり好みで、さらにvimperatorにプラグインをいれることもできたのだが、キーバインドだけに満足していた。

 しかし、先日、暇つぶしにプラグインをいれてみたら、さらに使いやすくなったのでどのプラグインを入れたのか軽くメモし、そのときに始めて触った.vimperatorrcの内容もメモしておく。

プラグイン:
HOME フォルダ以下にvimperator/plugin というふうにフォルダを配置し、そのしたに*.jsという感じでプラグインをいれていく。

direct_bookmark.js はてなブックマークやdeliciousといったサービスにブックマークをコマンドでポストできる
ime_controller.js hintモード時の日本語変換の切り替えを勝手にやってくれる
migemo-find.js 文字検索時にローマ字入力で日本語検索できる 別途アドオンが必要
migemo_hint.js ヒント検索時に以下上記と同様。アドオンも上記と同じものが必要
nicontroller.js ニコニコ動画のプレイヤ操作がコマンドで行える


.vimperatorrc

set hlsearch
set complete=sSl

nnoremap j 5<C-e>
nnoremap k 5<C-y>
nnoremap h <C-p>
nnoremap l <C-n>

let g:direct_sbm_use_services_by_tag = "dp"
let g:direct_sbm_use_services_by_post = "dp"


wxPythonで透明なウィンドウに画像を描画する

ディスプレイに画像をウインドウなしで表示したかった。つまり、画像だけがパソコンの画面に表示されるようにしたかった。イメージがしにくかったらデスクトップアクセサリとかを想像すると何を言いたいのか分かってもらえるはず。

どうやらこの目的を果たすためには透明なウィンドウの上に画像を表示させ、あたかも画像だけが表示されているようにするみたいだった。

で、例のごとくTkinterでそんな感じのことができないものかと、試行錯誤してうまくいかず、とりあえずググるとどうやらTkinterで実現するのは難しいらしい。その代わりwxPythonモジュールを使えばいけそうだということだ。

ということで1時間ほどwxPythonの基本的なウィジェットのソースコードを読み終えたあと、今度はwxPythonでググってウィンドウを透明化する方法を見つけた。しかし、このとき見つけた方法では描画した画像も一緒に透明化してしまい、今回やりたいこととは少し違うものだった。

 気を取り直して検索を続行したがなかなか目的の手段について書かれたページがなかった、そもそも日本語でwxPythonについて書かれているページがほとんどない!!全くないわけではないが、欲しい情報が見当たらない。

 それでもめげずに検索していると、http://python.matrix.jp/projects/wxPython/ にはねまわるウイドウな例 というサンプルコードがあり、このサンプルコードが今回私のやりたいことの道しるべとなってくれそうだ。
 しかしこのコード、思ったより簡単でないのに加え、表示させるpng画像に対して一回よく分からん変換をして利用している。


よさげなサンプルを見つけてから1時間後:
…よく分からなかった。


 さらに検索を繰り返し、時折見つかるヒントを参考に試行錯誤し、作業開始から10時間後…:
とりあえず動いた!!すばらしい。現在の段階では透明なところはウインドウがないと扱われるが、画像が描画されているところはウイドウ扱いされているみたいなので、画像のところもウインドウ扱いされないようにしたいが、今日はここまでにしておこう。つかれた。土曜日返せ!!

以下、今回の成果物

import wx
class myFrame(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, title=title,style = wx.NO_BORDER | wx.FRAME_SHAPED)
self.Bind(wx.EVT_PAINT, self.OnPaint)
image = wx.Image('keys2.png')
self.bitmap = image.ConvertToBitmap()

self.SetClientSize(image.GetSize())
self.SetShape(wx.RegionFromBitmapColour(self.bitmap,wx.Color(255,255,255)))

def OnPaint(self, event=None):
deviceContext = wx.PaintDC(self)
deviceContext.DrawBitmap(self.bitmap, 0, 0, True)

app = wx.App(False)
frame = myFrame(None, "none")
frame.Show()
app.MainLoop()



今回はまった点:pngに透過色を設定しているとなぜかうまくいかなかった。とにかく透過処理が大変だった。

qwer.jpg

vimで改行の形式と文字コードを変更する

set fenc=utf-8でutf-8に変更する。
*文字化けしてるときは使わないほうがいいと思われ。たしか別の文字コードでファイルを開きなおすvimコマンドがあったはず。

set fileformat=unix でunix形式の改行に変換する。これをしておかないとたまにおかしなことになる。
windows形式にするときはunixをdosと変えて行えばいい。


Ubuntuにユーザーを大量に登録するときにしたことのメモ

 先日からUbuntu(バージョンは忘れたが7か8くらい)にユーザを大量(言っても10人くらいだが)しようと試行錯誤していて、今日やっとできた。
 もちろん1人ずつ予め備わっているGUIの設定メニューを使用して登録すればいい話なのだが、人数が多いため、これを自動的に行いたかった。

今回はこれを代わりにコマンドでおこなったわけで、
具体的には以下のコマンドを使った。

useradd
mkdir
chpasswd
usermod
chmod
chown

以下手順
まずは useradd ユーザ名
で新規ユーザの追加
そしてmkdirで/home/ユーザ名 なるディレクトリを作成
その次はusermod -G グループ名1,グループ名2… ユーザー名 という風にしてユーザの所属グループの追加
追加するべきグループは、見本として、一回GUIで新規ユーザを作ってそのユーザ名で id ユーザ名 を実行してそこに表示されるグループIDを登録すればいい

順番が前後するが(前後してても結果は変わらないはず)先にmkdirで作ったホームディレクトリの所有者を変更する。変更しないとmkdirしたユーザの所有となってしまう。
まずは所持グループを
chown -R :グループ名(ユーザ名と同じ) /home/ユーザ名
次に所持ユーザを変更する
chown -R ユーザ名 /home/ユーザ名
ちなみに-Rは指定ディレクトリ以下に対しても再帰的に同様の設定をするというオプション。多分必要ないが念のため

次にこれは任意ではあるがユーザが管理者以外の人間に自分のホームディレクトリを見られることを希望しない場合は
chmod 700 /home/ユーザ名
でパーミッションを変更する

最後にchpasswdコマンドを使ってパスワードを登録(あるいは変更)する。(この方法を見つけるのに苦労した、useraddとかでもパスワードが登録できるはずだが、スクリプトで自動化するのが難しかった、というかできなかった)
これを使う前にユーザ名と登録したいパスワードを記入したファイルを容易する。書式はこんなかんじ

user1:pass1
user2:pass2

みたいな感じでつくって保存すればいい。空白行があるともしかしたらエラーがでるかもしれないので空白行はなくすこと、特に最終行に注意。

ファイルを書き終えたら、 chpasswd < 書いたファイル名 でパスワードを変更。

以上の方法でコマンドだけでユーザ登録できるわけだが、これでは結局パスワードの登録以外は1人ずつしなければいけないので例のごとくpythonで書いてみる。


#coding:utf-8
import os

r = open("userlist","r")
GIDS = "4,20,21,24,25,26,29,30,44,46,104"
users = []
for line in r:
users.append(line[:line.index(":")])
for user in users:
os.system("useradd " + user)
os.system("usermod -G " + GIDS+" "+user)
os.system("mkdir /home/" + user)
os.system("chown -R :" + user + " /home/" + user)
os.system("chown -R " + user + " /home/" + user)
os.system("chmod 700 /home/" + user)

os.system("chpasswd < userlist")



実行するときは sudo を忘れずに!!
同じディレクトリにuserlistという名前の先のchpasswdと同様の形式のファイルを用意すればあとは自動てきにやってくれる。
これをするために結構ググったのだけれど、ここまで詳しく、しかもpythonでかかれていたものはなかった。

実際にこれを使うときにはスクリプト中のGIDSを適切なものに書き換えて使ってください。あと、このスクリプトでエラーがでるなら多分文字コードか改行の形式だと思うからチェックしてみてください。

Paging Navigation

Navigations, etc.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。