かつてモーゼはエジプトを脱出した。
それにならってWiiU内にあるプチコンBIGのソースリストを脱出させることにした。
旅は相当困難であった。
最初はデータを色画像として脱出させようとしたがjpgの謎圧縮に阻まれて
第8画像までは元の生活に戻ることはできなかった。
もう旅をやめようかと思ったが最後に1ドット1ビットの最低限の状態にしてみる。
画像ははじめて認識できる元の状態に戻った。
寝て起きたあとのプログラムがプログラマの旅にとって重要である。
モーゼが旅を終えた時、最初にしたかったことは「ただ眠る」に違いない。
----すみません 駄文は以上です。----
prg.jpg
すみませんグラフィックドライバの故障ではありません。
上記のプチコンBIGのプログラムでedit0にあるプログラムを画像化したものです。
(1)ソースの画像化
上記プログラムをプチコンBIG edit0以外から実行するとedit0のプログラムソースを画像化します。
(注854x30文字まで対応 utf-16からutf-8のため一部文字は文字化けするかも)
(2)画像化して投稿
パッド画面に同じような画像が表示された状態でhomeボタンを押してインターネットブラウザを開きます。
WiiU 画像投稿ツール https://i.nintendo.net/wiiu/を開きます。
(ブックマークに入ってました)
下画面をTumblrに投稿します。TwitterでもFacebookでも画像を854x480のサイズで取得できるならばOK
(下画面が重要)
(3)投稿画像を取得
原寸表示させた画面を保存 ファイル名はprg.jpgに変更
(4)画像からテキストに戻す
この画像をPython3 pygameを使ってプログラムに戻します。
実行場所にprg.jpgがあること。
下記プログラムを
$ python3 imagedec.py
で実行すると
text.txtに戻ります。
ubuntu16.04環境で作成しているのでwindowsだとファイル名の設定とかが少し違うかもしれません。
プログラムがIndexError: pixel index out of rangeを起こした場合は画像サイズが854x480かどうか確認してみてください。
imagedec.py
<参考文献>
Python: テキストファイルに書き込み – write()、writelines()メソッド
pythonゲームコーディング10時間目
サンプル画像
デコード後
-----------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------
それにならってWiiU内にあるプチコンBIGのソースリストを脱出させることにした。
旅は相当困難であった。
最初はデータを色画像として脱出させようとしたがjpgの謎圧縮に阻まれて
第8画像までは元の生活に戻ることはできなかった。
もう旅をやめようかと思ったが最後に1ドット1ビットの最低限の状態にしてみる。
画像ははじめて認識できる元の状態に戻った。
寝て起きたあとのプログラムがプログラマの旅にとって重要である。
モーゼが旅を終えた時、最初にしたかったことは「ただ眠る」に違いない。
----すみません 駄文は以上です。----
prg.jpg
すみませんグラフィックドライバの故障ではありません。
上記のプチコンBIGのプログラムでedit0にあるプログラムを画像化したものです。
(1)ソースの画像化
上記プログラムをプチコンBIG edit0以外から実行するとedit0のプログラムソースを画像化します。
(注854x30文字まで対応 utf-16からutf-8のため一部文字は文字化けするかも)
(2)画像化して投稿
パッド画面に同じような画像が表示された状態でhomeボタンを押してインターネットブラウザを開きます。
WiiU 画像投稿ツール https://i.nintendo.net/wiiu/を開きます。
(ブックマークに入ってました)
下画面をTumblrに投稿します。TwitterでもFacebookでも画像を854x480のサイズで取得できるならばOK
(下画面が重要)
(3)投稿画像を取得
原寸表示させた画面を保存 ファイル名はprg.jpgに変更
(4)画像からテキストに戻す
この画像をPython3 pygameを使ってプログラムに戻します。
実行場所にprg.jpgがあること。
下記プログラムを
$ python3 imagedec.py
で実行すると
text.txtに戻ります。
ubuntu16.04環境で作成しているのでwindowsだとファイル名の設定とかが少し違うかもしれません。
プログラムがIndexError: pixel index out of rangeを起こした場合は画像サイズが854x480かどうか確認してみてください。
imagedec.py
#!/usr/bin/python # -*- coding: utf-8 -*- import pygame from pygame.locals import * pygame.init() window_size = (100, 100) screen = pygame.display.set_mode(window_size) img_map = pygame.image.load('prg.jpg') gx = 0 gy = 0 def decode8(): global gx global gy a = 0 for i in range(8): col = img_map.get_at((gx, gy)) if col.r>200: a=a+pow(2,(7-i)) gx=gx+1 if gx==854: gx=0 gy=gy+1 return a def imgtotext(): st="" for x in range(854*30): s=decode8()*0x100+decode8() if s>0: st=st+chr(s) #st=st+hex(decode8()*0x100+decode8())+" " f = open('text.txt', 'w') f.write(st) f.close() imgtotext() pygame.quit() quit()
<参考文献>
Python: テキストファイルに書き込み – write()、writelines()メソッド
pythonゲームコーディング10時間目
サンプル画像
デコード後
-----------------------------------------------------------------------------------------------
DIM SX[20],SY[20] DIM VSX[20],VSY[20] DIM AX[20],AY[20],ALV[20],ADX[20],ADY[20] DIM VAX[20],VAY[20] GRIPS=-1 CX=0 CY=0 CDX=0 CDY=0 TIME=MILLISEC OWARISW=0 GAME DEF STARSET FOR I=0 TO 19 SPSET I,226 @S SX[I]=RND(384) SY[I]=RND(224) FOR J=0 TO I-1 IF DIST(SX[I]-SX[J],SY[I]-SY[J])<20 THEN GOTO @S NEXT SPOFS I,SX[I],SY[I] NEXT END DEF ALIENSET FILL ALV,1 FOR I=0 TO 19 SPSET I+20,958 SPCOLOR I+20,RGB(255,180,255) @S AX[I]=RND(384) AY[I]=RND(224) FOR J=0 TO I-1 IF DIST(AX[I]-AX[J],AY[I]-AY[J])<20 THEN GOTO @S NEXT SPOFS I+20,AX[I],AY[I] NEXT END DEF ALIENMOVE FOR I=0 TO 19 IF ALV[I]==0 THEN CONTINUE R=RND(10) IF R==0 THEN ADX[I]=1 IF R==1 THEN ADX[I]=-1 IF R==2 THEN ADY[I]=1 IF R==3 THEN ADY[I]=-1 AX[I]=AX[I]+ADX[I] AY[I]=AY[I]+ADY[I] AX[I]=MAX(0,MIN(AX[I],384)) AY[I]=MAX(0,MIN(AY[I],224)) IF R==5 THEN SPSET I+20,958+RND(10):SPCOLOR I+20,RGB(255,180,255) SPOFS I+20,AX[I],AY[I] NEXT END DEF GAME @START ACLS TITLE CX=100 CY=100 CDX=0 CDY=0 'KEYでグリップ SPSET 100,464 SPOFS 100,CX,CY SPCOLOR 100,RGB(256,220,180) @GAME TIME=MILLISEC OWARISW=0 STARSET ALIENSET BWAIT WHILE 1 B=BUTTON() IF B==0 THEN CDY=CDY+1 ELSE IF B == #A THEN RNEARSTAR OUT N,D IF N==-1 THEN CDY=CDY+1:GOTO @PASS SPCOLOR N,RGB(255,0,0) CDY=0 SWING N,D,-15 SPCOLOR N,RGB(255,255,255) ENDIF IF B == #B THEN LNEARSTAR OUT N,D IF N==-1 THEN CDY=CDY+1:GOTO @PASS SPCOLOR N,RGB(255,0,0) CDY=0 SWING N,D,15 SPCOLOR N,RGB(255,255,255) ENDIF ENDIF @PASS CX=CX+CDX CY=CY+CDY IF CDY>16 THEN CDY=16 SPOFS 100,CX,CY IF CY>300 THEN CY=0 IF CX<-300 THEN CX=600 IF CX>700 THEN CX=-200 ALIENMOVE WOMANKICK TIMEWRITE IF OWARISW==1 THEN GOTO @CLEAR WAIT 2 WEND @CLEAR ENDTIME MILLISEC-TIME OFFWAIT BWAIT GOTO @START END DEF ENDTIME T FOR I=0 TO 300 STEP 2 GCLS GPUTCHR 30,100,"TIME "+STR$(T),I+1,I+1 IF I>100 AND BUTTON()!=0 THEN GOTO @E WAIT 1 NEXT FOR I=300 TO 3 STEP -2 GCLS GPUTCHR 30,100,"TIME "+STR$(T),I+1,I+1,RGB(60,60,60) IF BUTTON()!=0 THEN GOTO @E WAIT 1 NEXT @E GCLS GPUTCHR 30,100,"TIME "+STR$(T),4,4,RGB(60,60,60) END DEF TIMEWRITE LOCATE 40,29:PRINT "TIME:";MILLISEC-TIME; END DEF SWING N,D,DT BEEP 12 KX=SX[N]:KY=SY[N] WHILE 1 R=ATAN(KY-CY,KX-CX) KAKU=R*180/PI() 'IF KAKU<0 THEN KAKU=360+KAKU KAKU=KAKU+DT SPOFS 100,CX,CY CX=KX-COS(RAD(KAKU))*D CY=KY-SIN(RAD(KAKU))*D IF BUTTON()==0 THEN IF D==0 THEN CDX=0:CDY=0:RETURN IF D>10 THEN D=10 CDX=-COS(RAD(KAKU+90*DT/15))*D CDY=-SIN(RAD(KAKU+90*DT/15))*D RETURN ENDIF ALIENMOVE WOMANKICK TIMEWRITE IF OWARISW==1 THEN RETURN WAIT 2 VSYNC WEND END DEF BWAIT @S IF BUTTON()!=0 THEN RETURN GOTO @S END DEF OFFWAIT @S IF BUTTON()==0 THEN RETURN GOTO @S END DEF AWAIT @S IF BUTTON()==#A THEN RETURN GOTO @S END DEF NEARSTAR OUT R,BD BD=1000 R=-1 FOR I=0 TO 19 D=DIST(SX[I]-CX,SY[I]-CY) IF D<BD THEN BD="D:R=I " NEXT RETURN R END DEF RNEARSTAR OUT R,BD BD="1000 " R="-1 " FOR I="0" TO 19 IF SX[I]-CX<0 THEN CONTINUE D="DIST(SX[I]-CX,SY[I]-CY) " IF D<BD THEN BD="D:R=I " NEXT RETURN R END DEF LNEARSTAR OUT R,BD BD="1000 " R="-1 " FOR I="0" TO 19 IF SX[I]-CX>0 THEN CONTINUE D=DIST(SX[I]-CX,SY[I]-CY) IF D<BD THEN BD="D:R=I " NEXT RETURN R END DEF DIST(DX,DY) RETURN SQR(DX*DX+DY*DY) END DEF WOMANKICK SW="0 " FOR I="0" TO 19 IF ALV[I]==0 THEN CONTINUE IF DIST(CX-AX[I],CY-AY[I])<16 THEN BEEP 82,RND(2000):ALV[I]=0:SPCLR 20+I ELSE SW="1 " NEXT IF SW="=0" THEN OWARISW="1 END DEF" TITLE FOR I="0" TO 300 STEP 2 GCLS GPUTCHR 0,0,"STAR UMAN 3",I+1,I+1 IF I>100 AND BUTTON()!=0 THEN GOTO @E WAIT 1 NEXT FOR I=300 TO 3 STEP -2 GCLS GPUTCHR 0,0,"STAR UMAN 3",I+1,I+1,RGB(60,60,60) IF BUTTON()!=0 THEN GOTO @E WAIT 1 NEXT @E GCLS GPUTCHR 0,0,"STAR UMAN 3",4,4,RGB(60,60,60) END '1/2M*V*V 'MGH DEF UNNUIWATCH VX,VY 'DIM SX[20],SY[20] 'DIM VSX[20],VSY[20] 'DIM AX[20],AY[20],ALV[20],ADX[20],ADY[20] 'DIM VAX[20],VAY[20] ARYOP #AOPSUB VSX,SX,VX ARYOP #AOPSUB VSY,SY,VY ARYOP #AOPSUB VAX,AX,VX ARYOP #AOPSUB VAY,AY,VY FOR I=0 TO 19 SPOFS I,VSX[I],VSY[I] SPOFS I+20,VAX[I],VAY[I] NEXT END
-----------------------------------------------------------------------------------------------