【Python】ソースコードの>と<を無効化するスクリプト

import re
from sys import argv 

if len(argv)!=2 : 
    print("file is empty")
    quit()

ptngt=re.compile(">")
ptnlt=re.compile("<")

fin=open(argv[1],"r")
lines=fin.readlines()
fin.close()

fout=open(argv[1]+".txt","w")
for line in lines:
    line=ptnlt.sub("&lt;",line)
    line=ptngt.sub("&gt;",line)
    fout.write(line)

fout.close()

ブログとかでソースコードを公開するときに、ソースコード中の>や<を手作業で無効化するのが面倒になったのでスクリプト作ったよ。

置き換えは下記2個

・「>」 →「&gt;」

・「<」→「&lt;」

凄い技術は何もないと思うけど、興味があったらコピペして使ってくれて良いです。

Nexus7でAndroid5.1にアップデートした感想

以前、Android4系からAndroid5.0にアップデートした時、あまりの重さとGallery消滅で憎悪を覚えた人は多いはず。
今回のAndroid5.1へのアップデートでは、若干の処理速度向上は有った気がする。
でも、やはり十分な速度とは言い難い。
数分間動かしてるとすぐにCPU稼働率が75%まで上がり、こまめにタスクを終了させてあげる必要がある。
めんどい。
個人的には、「5.0よりはマシになった」ぐらいの感想。

【Python3.4】フラクタルノイズで雲画像を生成するよ

saved_cloud_6

from PIL import Image
import array, random, math

SIZE=2**8

class MyImage(object):
    def __init__(self,width,height,img=None):
        self.width=width
        self.height=height
        if img is None:
            self.buffer=[0 for i in range(width*height*3)]
        else:
            self.buffer=list(Image.open(img).convert('RGB').tostring())

    def setPixelAdd(self,x,y,color):
        if x>=self.width or y>=self.height or y<0 or x=0:
            count+=1
            density += self.data[i-level][j]
        if i+level=0:
            count+=1
            density += self.data[i][j-level]
        if j+level<self.size:
            count+=1
            density += self.data[i][j+level]   
            self.data[i][j] = density/count + (self.noise[i][j] * level)

    def getPILImage(self):
        return Image.frombuffer('RGB',(self.width,self.height),bytes(self.buffer),"raw",'RGB',0,1)

class MyCloud(object):
    def __init__(self,sz):
        self.size=sz
        self.img=MyImage(sz,sz)
        self.noise=[[random.uniform(-1.0,1.0) for i in range(sz+1)] for j in range(sz+1)]
        self.data=[[0 for i in range(sz+1)] for j in range(sz+1)]
        self.data[0][0] = self.noise[0][0] * sz
        self.data[0][sz-1] = self.noise[0][sz-1] * sz
        self.data[sz-1][0] = self.noise[sz-1][0] * sz
        self.data[sz-1][sz-1] = self.noise[sz-1][sz-1] * sz

    def updatePixel(self,i,j,level):
        count = 0
        density = 0
        if i-level>=0:
            count+=1
            density += self.data[i-level][j]
        if i+level=0:
            count+=1
            density += self.data[i][j-level]
        if j+level<self.size:
            count+=1
            density += self.data[i][j+level]   
        self.data[i][j] = density/count + (self.noise[i][j] * level)

    def update(self,level):
        if level==0: return
        for i in range(level,self.size,level*2):
            for j in range(level,self.size,level*2):
                self.data[i][j]=(
                self.data[i-level][j-level]
                +self.data[i-level][j+level]
                +self.data[i+level][j-level]
                +self.data[i+level][j+level])/4 
                +(self.noise[i][j]*level)
        for i in range(0,self.size+1,level*2):
            for j in range(level,self.size,level*2):
                self.updatePixel(i,j,level)
        for i in range(level,self.size,level*2):
            for j in range(0,self.size+1,level*2):
                self.updatePixel(i,j,level)
        self.update(level // 2)

    def render(self):
        maxCloud = max([max(self.data[i]) for i in range(self.size)])
        minCloud = min([min(self.data[i]) for i in range(self.size)])
        distance = maxCloud - minCloud;
        for i in range(self.size):
            for j in range(self.size):
                c = int(255 * (self.data[i][j]-minCloud) / distance)
                self.img.setPixelAdd(i,j,(c,c,c))

cloud=MyCloud(SIZE)
cloud.update(SIZE // 2)
cloud.render()
imgOut = cloud.img.getPILImage()
imgOut.save("saved_cloud.png")
imgOut = cloud.img.getPILImage()
imgOut.save("saved_cloud.png")

ざっくり解説
下記画像のような、ランダムノイズをまず作成し(ソースコード中の「noise」)、それをもとに繰り返し処理によって雲(data)を作成していく物。
cloudRandom
再帰処理にせず、while文で回したほうが良いと思ったけど、今さら面倒なのでそのまま公開。

画像が生成されていく過程を順番に撮影していくと、下記の画像のようになる。
cloudMaking
等間隔に点を打ちながら雲を形勢していく様子が見て取れる。

「QPython」でAndroid上でもPythonのコーディング出来るよ

Screenshot_2015-02-25-02-09-34

 

Android上でのPython開発・テスト環境として「QPython」を使ってみた。

実際には2週間ぐらい前から使ってるんだけど、オフラインでもソースコードを実行できる数少ないフリー開発環境なので重宝してる。

PIL(Python Image Library)なども入ってるから、画像処理の実験なども可能。

【QPythonサイト】
http://qpython.com/

【Python】PIL画像の生データで加算処理するよ

from PIL import Image
import array, random, math
class MyImage(object):
  def __init__(self,img):
    tmp=Image.open(img)
    (self.width, self.height)=tmp.size
    self.buffer=bytearray(tmp.convert('RGB').tostring())
    
    def setPixelAdd(self,x,y,color):
      if x>=self.width or x=self.height or y<0 : return
      addr=x*3+y*self.width*3
      self.buffer[addr+0]=min(255,self.buffer[addr+0]+color[0])
      self.buffer[addr+1]=min(255,self.buffer[addr+1]+color[1])
      self.buffer[addr+2]=min(255,self.buffer[addr+2]+color[2])
      
    def getColor(self,x,y):
      addr=x*3+y*self.width*3
      return self.buffer[addr+0],self.buffer[addr+1], self.buffer[addr+2]
      
    def bltAdd(self,dx,dy,dw,dh,src,sx=0,sy=0):
      for y in range(dh):
        for x in range(dw):
          self.setPixelAdd(dx+x,dy+y,src.getColor(sx+x,sy+y))
    
    def getPILImage(self):
      sz=(self.width,self.height)
      return Image.frombuffer('RGB',sz,bytes(self.buffer),"raw",'RGB',0,1)

imgData1=MyImage('dest.png')
imgData2=MyImage('src.png')
imgData1.bltAdd(10,10,8,8,imgData2)
imgOut = imgData1.getPILImage()
imgOut.save("saved.png")

dest

src

saved

ImageChopsでも加算処理は可能だが、画像のサイズが違うとエラーになるのでゲーム素材の作成には不向き。
仕方がないから自分で加算処理に使えるクラスを作ってみた。

やってるコトは極めて単純。
・PILのImage.openで画像を開く
・生データをbytearrayに変換
・for文で2枚の画像を合成
・最期にbytearrayをbytes型に変換してPIL画像を再生成
これだけな。

【備考】
・生データは、画像の左上端から「RGBRGBRGB……」の順番に1byteずつデータが並んでいるため、配列操作で簡単に書き換えることが可能。
このようなデータの並び方はC言語やJavascriptで画像処理をしても同じ。
・「setPixelAdd」関数を弄ることで、幾らでも面白い画像合成が可能。夢が膨らむ。

【備忘録】クモ綱 クモ目とサソリ目の足を模式図にした

fig_aracnidLeg

節足動物門 クモ綱の、クモ目とサソリ目の足を模式的に現した。

膝節(しっせつ)の大きさが随分違う。

クモの膝節は文字通り「膝(ひざ)」程度の大きさであるのに対し、サソリの膝節は脛節より大きい。

クモ綱全体で、「基節・転節・腿節・膝節・脛節・蹠節・跗節」という規格は、ほぼ共通なのだが、大きさに違いが多くて判別困難な場合も多い。

絵を描くときの参考になれば幸いです。

【備忘録】昆虫の足の構造を模式的に表す

fig_insectLeg
昆虫の足は(一部の例外を除けば)この構造で説明が付きます。
カマキリの鎌みたいに「基節」が極端に長く発達している昆虫もいるので、
絵を描くときは注意が必要です。

ここで言う「昆虫」とは、
節足動物門、六脚亜門、昆虫綱に含まれる生物を指します。
蜘蛛やカニなどは昆虫ではないので、足の構造が違います。
(後でスケッチするかも知れない)

何かの参考になれば幸いです。