Lifegameを実装した!
こんにちは。John(None)です。 休みの間手持ち無沙汰だったのでLifegameを実装しました。
Lifegameはググってください。 numpyだけで動作するので遊んでみてね!!
コード
# coding:utf-8 import os import time import numpy as np stage_x = 5 stage_y = 10 class Lifegame: def __init__(self): #self.game = np.zeros([stage_y + 2, stage_x + 2]) # 壁ループなし game_yet = np.random.randint(0, 2, size=(stage_y + 2, stage_x + 2)) game_format_x_format =[[0]] game_format_x_format.extend([[1]] * stage_y) game_format_x_format.append([0]) game_format_x = np.array(list(map((lambda i: i * (stage_x + 2)), game_format_x_format))) game_format_y = [0] game_format_y.extend([1] * stage_x) game_format_y.append(0) game_format = game_format_x * game_format_y self.game = game_yet * game_format #self.game = np.random.randint(0, 2, size=(stage_y + 2, stage_x + 2)) # 代入(=)だとarrayのポインタを代入する扱いになるのでnp.arrayでコピーする self.next = np.array(self.game) while True: os.system("clear") self.print_game() time.sleep(0) self.all_do_next() self.game = np.array(self.next) def pixcel_do(self, x, y): x_y_around = np.sum(list(map((lambda i: i[x-1] + i[x] + i[x+1]), (self.game[y-1:y+2])))) if not self.game[y][x]: if x_y_around == 3: self.next[y][x] = 1 else: if x_y_around - 1 <= 1: self.next[y][x] = 0 elif x_y_around - 1 >= 4: self.next[y][x] = 0 else: self.next[y][x] = 1 def all_do_next(self): for y in range(1, stage_y + 1): for x in range(1, stage_x + 1): self.pixcel_do(x, y) def print_game(self): print("_" * stage_x) ans = "" for y in range(1, stage_y + 1): for x in range(1, stage_x + 1): if self.game[y][x]: ans += "人" else: ans += " " ans += "\n" print(ans) if __name__ == "__main__": Lifegame()
「&」コマンドと標準入力の優先度がふと気になった。
どうもJohn(テスト爆死)です。 テストが今日で終わり、連続活動時間が43時間を超えつつありますが進捗をなにか生み出したい機運だった次第です。
なにすんのか
今回はふと「&」コマンドとPythonの標準出力の優先度を知りたくなった感じです。ただただふと思っただけのことです。
実験するべくこんなプログラムを用意しました。
input_echo.py
# coding:utf-8 import sys while True: print("1") mes = input() print("2") print(mes) print("3") if mes == "pyexit": sys.exit()
実験方法はいたって簡単。
python3 input_echo.py &
を実行するだけ。
結果
$ python3 input_echo.py & $ 1
となりました。まぁここまでは想定通り。
次にa
とか入力してみます。
$ 1 a a: command not found [3]+ Stopped python3 input_echo.py
ほげ~~。強制終了ぽよ~~。
まとめ
「&」コマンドつけないとちゃんと実行されるのでpythonの標準入力はバックグラウンドでは働かないんだなぁ。。としみじみ思いました。
次はマルチプロセシングとかやった時のinput()
の処理を見てみたい。
では寝たいと思います。
どうやらここで寝落ちしてたみたいです。 ブログ書き終わって投稿せずに寝るマンしてました。
ラズパイをスリープしないようにする
こんにちは、John(ほげ)です。 テスト期間なのですが、最近の発見を記録しておきたいと思います。
現在学校で電光掲示板というかデジタルサイネージを作っているのですが、うっかりラズパイのスリープ設定をいじるのを忘れて設置してしまっていました。 そこで得た情報をまとめておこうと思います。
尚、RaspberryPi3 modelBを使用しています。
なにしたか
はじめ別の方法で試したのですがうまくいかなかったのでどれが正しいとかはわかりませんが、以下すべて実行すればどうにかなります多分。
/etc/xdg/lxsession/LXDE-pi/autostart
"/etc/xdg/lxsession/LXDE-pi/autostart"に
@xset s 0 0
@xset s noblank
@xset s noexpose
@xset dpms 0 0 0
@xset -dpms
と追記するだけ。
RaspberryPi3はここではなく"/etc/xdg/lxsession/LXDE/autostart"(LXDE-piではなくLXDE)に同じように書き込むべきという意見もあるようだった。自分は両方に書き込んだ。
/etc/lightdm/lightdm.conf
"/etc/lightdm/lightdm.conf"に
[SeatDefaults]
xserver-command=X -s 0 -dpms
と追記する。
これはどのRaspberryPiのバージョンによる違いはなさそう。
最後に
こまごましているけど、こういうことで積極的にブログを書いていきたい。ほげ~~。
rootのシェルをvimにするゲーム。
どうもJohnです。先日先輩のいるやんさんに面白いゲームを教えていただいたので、それの攻略をやろうかと思います。
どういうゲームか
タイトルの通り、sudo su
でvimが起動されちゃう状況に設定。それを解決するゲームです。なんかCTFっぽい。
vimの部分をbash等にもう一度戻すとクリアな訳ですが、編集するにはrootである必要があり、sudoでコマンドを実行しようとするとvimが起動されてしまい、コマンドが実行できないという感じのゲーム。
プレイ方法
sudo chsh -s /usr/bin/vim root
を実行する。これでおk。ゲームスタートです。是非やってみて。
攻略法
以下攻略法です。
chshコマンドについて調べてみたところ、どうやら/etc/passwdが設定ファイルのようです。
スタート段階でcat /etc/passwd
を実行すると、一番上の行に
root:x:0:0:root:/root:/usr/bin/vim
とあるはずです。
ここまでわかればVimmerの方はわかるんでしょうが、自分は何分Emacs派というほどではありませんが、Vimをあまり使わないのでどうやって開くかも調べました。
手順としてはこう。
sudo su
でvimをroot権限で起動する。/etc/passwd
と入力。- カーソルが
/etc/passwd
の上にある状態でCtrl-W gf
。 - すると
/etc/passwd
が開ける。 - いい感じにrootのところを編集。
- クリア!
という感じです。
最後に
どうやらrootの方を変更するゲームはEasyモードらしい。 HardモードでUserの方も変更するゲームもあるらしい。またやる。
今更ながらKosenセキュリティコンテストに参加したよ!
お久しぶりです。最近忙しくてダメだったJohnです。めっちゃ久しぶりの更新。。
今回タイトルの通り、Kosenセキュリティコンテストにチーム「:(){:|:&};:」として参加してきました。write up的なのを書かなくちゃいけないそうですがそこまで問題解けていないのがつらいです。
まず結果。。
やったぜ6位!
完全趣味チームとして参加していた割にはいい感じの結果となりました。
Write up的なの。
全然解いてないのがばれるのが恥ずかしいので、「はぁ、好き。。」ってなった問題を一つ。
Crypto 100 「解凍して解凍せよ」
皆大好き画像処理!というわけで簡単な画像処理です。 今回、画像処理系が全然なかったのが悲しいくらいでした。
以下問題。
問題文は「ファイルからフラグを読み取れ!」。 そしてzipファイルが渡されました。
zipファイルは上げられなかったので、その中身の画像をどうぞ。
masks.png
xor.png
ファイル名がもうあれなので、そんな感じにするべく、わざわざPythonを書きました。
# coding:utf-8 from PIL import Image, ImageDraw import numpy as np image1 = Image.open("./xor.png", "r") image2 = Image.open("./masks.png", "r") x_range = image1.convert("RGB").size[0] y_range = image1.convert("RGB").size[1] target = Image.new("RGB", ((x_range, y_range)), (255, 255, 255)) white_canvas = ImageDraw.Draw(target) np_image1 = np.array(image1) np_image2 = np.array(image2) y = 0 while y < y_range: x = 0 while x < x_range: if np_image1[x][y][0] == np_image2[x][y][0]: white_canvas.point((x, y), (0, 255, 255)) else: white_canvas.point((x, y), (np_image1[x][y][0], np_image1[x][y][1], np_image1[x][y][2])) x += 1 y += 1 target.save("./ans.png", "PNG", quality=100, optimize=True)
必死だったので綺麗さとか求められなかった。 訳すると、画像をXORして、True?まぁ、1を返したところだけシアンブルーにするというプログラム。
結果がこれ。
ans.png
xとy、ミスった。
しかし、ここでJohnはチームメイトのいるやんさんにInkscape使えばと助言されます。
そしてそしてその結果。
Flagは「SCKOSEN{simple_visual_cryptography}」でした。
最後に。
楽しかった! そしてそれ以上にこれ。 明石高専のチームが2トップという瞬間。 うれしかったですね。
校内でもCTFを開こうと色々模索中です。
Python、Pillowで画像の最頻値を取る!
どうも、Johnです。 テスト期間なんですが、進捗出したい欲がすごかった上、インターンのエントリーシートに「自分ブログやってまっせ!」と言ってしまったので書きたいと思います。
何やったのか
今回画像の最頻値を取るのですが、実はブログ始めたての頃に一度やっています。
このときはPython始めたてで何もわかんなかったので、入力画像3枚でしかできませんでしたが、今回は何枚でも出来るようにしました。
ソース(適当)
numpy使いてぇ、ってなって書き始めたのにそうでもなくなって悲しい。 あと英語できないのでネーミング勘弁して。
# coding:utf-8 import statistics as st from PIL import Image, ImageDraw import numpy as np def stmode(matrix): #最頻値が存在しない時、1番はじめの画像に準ずる try: mode=st.mode(matrix) except Exception:#statistics.StatisticsError mode=matrix[0] finally: res=(int(mode[:3]), int(mode[3:6]), int(mode[6:])) return res images=[] almost_images=13 num=0 while num < almost_images: image=Image.open("./tikuma/"+str(num)+".JPG", "r") #imagesに各画像のRGB値が入れられる images.append(np.array(image)) if not num: x_range=image.convert("RGB").size[0] y_range=image.convert("RGB").size[1] num+=1 #白いキャンバス作成 target=Image.new("RGB", ((x_range, y_range)), (255, 255, 255)) white_canvas=ImageDraw.Draw(target) y=0 while y < y_range: x=0 while x < x_range: before_mode=[] num=0 while num < almost_images: #各画像の[x][y]の要素(例,[1,14,514])を9桁の文字列(例,"001014514")に変換する before_mode.append(str(images[num][y][x][0]).zfill(3)+str(images[num][y][x][1]).zfill(3)+str(images[num][y][x][2]).zfill(3)) num+=1 #その最頻値を出し、白いキャンバスに色を置いて行く white_canvas.point((x, y), stmode(before_mode)) x+=1 y+=1 target.save("./tikuma/ans/ans"+str(almost_images)+".jpg", "JPEG", quality=100, optimize=True)
入力に使った画像
可愛いでしょ?
☆とGET、帰ボタンが違うので、これの除去を目標としました。
こんな感じに0~13.JPGとして使ってます。
結果
入力3枚 入力5枚 入力7枚 入力9枚 入力11枚 入力13枚
ちなみに処理にかかった時間は入力3枚~7枚までは2空3分。 11枚や13枚になると4分30秒と言ったところでした。
まとめ
艦これ楽しい!!!!!
まとめ改
GETと帰ボタンが枚数多くするごとにずれていっていたが、おそらく入力誤差であろう。もしかしたらこのぐらいの小さい変化であったら、平均を取った方がきれいになるかもね。
次からはちゃんとnumpy使うもん!
舞鶴高専カンファに行ってきました。(今更)
どうもJohnです。(114514年ぶりぐらいのブログ更新)
今回、7月1日に行われた舞鶴高専カンファに登壇者として参加しました。
何をやらかしたか
- ガチプロに「#john_is_pro」って煽られた
- ひやかしさん(@nnsnodnb)に新しい黄色の魔剤もらった
- クソ弱い行動しかしなかった
- みすたーさん(@FineSight_Mr)にコーヒー豆をプレゼントした
- 900MBもあるスライドを発表した
- 舞鶴高専の隣のキャンプ場に泊まった
- そんでもってBBQをした
- しかも徹夜で麻雀した
- 麻雀の実況を「#kosenconf」でした
- 遠足に参加した
- ひやかしさんのブログの構成をパクった
どんなLTしたか
入力画像を1ピクセルづつ明度を測って、その明度の文字を出力していって画像を文字で表そう、、というプログラムの紹介LTをしました。筋肉っ!
スライドも全て文字で表したのでスライドが900MBを超えました。
1ピクセルに対し、15*15ピクセルの文字に置き換えるので色にもよりますが1スライド50MBぐらいになりました。すごーい!!
サンプル画像、2*2ピクセルに1文字となってます。大体6~15MBです。興味のある方はダウンロードしてアップで見ていって下さい。(ちなみにはてなだと20MB以上の画像は無理っぽいですね。。)
まぁ前述の通り、スライド資料が900MBほどあったので共有はしないでおこうかなと考えています。見たい人は僕に会いに来て。
最後に
自分も高専カンファ開きたい!!ってなったので1月上旬あたりを目標に開催予定です!大阪のど真ん中でおっきく行う予定ですので1月上旬は開けておくようお願いします。
ところで、画像アップロードしながら書いてるんですが、10分くらいステータスバーが動いてないような。。っていうかダメだ。解像度下げたのをまた別にアップロードしよう。