John(筋肉)の備忘録的な何か

備忘録的な何かであり、進捗そのものでもあるよ!!怖い人は見ないで!

ラズパイをスリープしないようにする

こんにちは、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 suvimが起動されちゃう状況に設定。それを解決するゲームです。なんか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をあまり使わないのでどうやって開くかも調べました。

手順としてはこう。

  1. sudo suvimをroot権限で起動する。
  2. /etc/passwdと入力。
  3. カーソルが/etc/passwdの上にある状態でCtrl-W gf
  4. すると/etc/passwdが開ける。
  5. いい感じにrootのところを編集。
  6. クリア!

という感じです。

最後に

どうやらrootの方を変更するゲームはEasyモードらしい。 HardモードでUserの方も変更するゲームもあるらしい。またやる。

今更ながらKosenセキュリティコンテストに参加したよ!

お久しぶりです。最近忙しくてダメだったJohnです。めっちゃ久しぶりの更新。。

今回タイトルの通り、Kosenセキュリティコンテストにチーム「:(){:|:&};:」として参加してきました。write up的なのを書かなくちゃいけないそうですがそこまで問題解けていないのがつらいです。

まず結果。。

f:id:julia-bardera-jb:20171029001125p:plain

やったぜ6位!

完全趣味チームとして参加していた割にはいい感じの結果となりました。

Write up的なの。

全然解いてないのがばれるのが恥ずかしいので、「はぁ、好き。。」ってなった問題を一つ。

Crypto 100 「解凍して解凍せよ」

皆大好き画像処理!というわけで簡単な画像処理です。 今回、画像処理系が全然なかったのが悲しいくらいでした。

以下問題。

f:id:julia-bardera-jb:20171029001727p:plain

問題文は「ファイルからフラグを読み取れ!」。 そしてzipファイルが渡されました。

zipファイルは上げられなかったので、その中身の画像をどうぞ。

masks.png

f:id:julia-bardera-jb:20171029002029p:plain

xor.png

f:id:julia-bardera-jb:20171029002026p:plain

ファイル名がもうあれなので、そんな感じにするべく、わざわざ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

f:id:julia-bardera-jb:20171029002834p:plain

xとy、ミスった。

しかし、ここでJohnはチームメイトのいるやんさんにInkscape使えばと助言されます。

そしてそしてその結果。 f:id:julia-bardera-jb:20171029003401p:plain

Flagは「SCKOSEN{simple_visual_cryptography}」でした。

最後に。

楽しかった! そしてそれ以上にこれ。 f:id:julia-bardera-jb:20171029003814p:plain 明石高専のチームが2トップという瞬間。 うれしかったですね。

校内でもCTFを開こうと色々模索中です。

Python、Pillowで画像の最頻値を取る!

どうも、Johnです。 テスト期間なんですが、進捗出したい欲がすごかった上、インターンエントリーシートに「自分ブログやってまっせ!」と言ってしまったので書きたいと思います。

何やったのか

今回画像の最頻値を取るのですが、実はブログ始めたての頃に一度やっています。

john-bardera.hatenablog.com

このときは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として使ってます。 f:id:julia-bardera-jb:20170730001714j:plain

結果

入力3枚 f:id:julia-bardera-jb:20170730000505j:plain 入力5枚 f:id:julia-bardera-jb:20170730000554j:plain 入力7枚 f:id:julia-bardera-jb:20170730000604j:plain 入力9枚 f:id:julia-bardera-jb:20170730000617j:plain 入力11枚 f:id:julia-bardera-jb:20170730000626j:plain 入力13枚 f:id:julia-bardera-jb:20170730000636j:plain

ちなみに処理にかかった時間は入力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以上の画像は無理っぽいですね。。)

f:id:julia-bardera-jb:20170714220950j:plain

f:id:julia-bardera-jb:20170714221218j:plain

f:id:julia-bardera-jb:20170714222500j:plain

まぁ前述の通り、スライド資料が900MBほどあったので共有はしないでおこうかなと考えています。見たい人は僕に会いに来て。

最後に

自分も高専カンファ開きたい!!ってなったので1月上旬あたりを目標に開催予定です!大阪のど真ん中でおっきく行う予定ですので1月上旬は開けておくようお願いします。

あと舞鶴高専カンファ、運営お疲れ様でした!!

ところで、画像アップロードしながら書いてるんですが、10分くらいステータスバーが動いてないような。。っていうかダメだ。解像度下げたのをまた別にアップロードしよう。

深夜テンションでどうでもいいプログラム書いた。

皆さん、こんにちは。John(🍅)です。

少しブログを読み直してみると驚愕の真実が明らかになりました。

 

これです

f:id:julia-bardera-jb:20170501031007j:plain

 

インデントの消失したPythonのコードです。というかもはやPythonじゃない。

はてなの設定なのかどうなのか、空白が引用では認識されないのかなんなのか。

 

そこで

半角空白4つを全角空白2つに変換するプログラムを書きました。

 f = open("target.py", "r")
lines = f.readlines()
for line in lines:
  x = 0
  while True:
    max_x = len(line.split("半角空白4つ"))
    if max_x == x:
      break
    elif not line.split("半角空白4つ")[x]:
      print("全角空白2つ", end="")
    else:
      print(line.split("半角空白4つ")[x], end="")
    x += 1

半角空白4つを見つけると全角空白2つに入れ替えてくれます。

 

最後に

置換使えよってなった。

いまブログを書いてて思いました。なぜわざわざプログラムを書いたのか。

深夜テンションで書いたけど何だこれ。

PythonでやるTAK関数の高速化

ほげ!John(())です。

Lispの怖い人、@fu7mu4さんからご飯を頂いたのでその消化を行っていきたいと思います。(めっちゃほったらかしてた)

 

ご飯内容

gist.github.com

 

そういうことです。ありがてぇ。。

 

とりあえずPythonで実装してみた

def tak(x, y, z):
  if x <= y:
    return y
  else:
    return tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y))

 そのままですが。

 

そして最後に

 print(tak(12, 6, 0))

 を付け加えたこのプログラムの実行時間。

$ time python3 tak.py
12

real 0m4.960s
user 0m4.776s
sys 0m0.032s

 となりました。

 

高速化

 結果を先に

$ time python3 fast_tak.py
fast_tak.py:5: SyntaxWarning: name 'tak_dict' is used prior to global declaration
global tak_dict
12

real 0m0.499s
user 0m0.112s
sys 0m0.028s

 怒られてるけど、解決策わかんないです。

コードはこんな感じ。

def tak(x, y, z):
  try:
    tak_dict
  except NameError:
    global tak_dict
    tak_dict = {}

  if str(x) + "," + str(y) + "," + str(z) in tak_dict:
    return tak_dict[str(x) + "," + str(y) + "," + str(z)]
  elif x <= y:
    return y
  else:
    first = tak(x - 1, y, z)
    tak_dict[str(x - 1) + "," + str(y) + "," + str(z)] = first
    second = tak(y - 1, z, x)
    tak_dict[str(y - 1) + "," + str(z) + "," + str(x)] = second
    third= tak(z - 1, x, y)
    tak_dict[str(z - 1) + "," + str(x) + "," + str(y)] =third
    tak_dict[str(first) + "," + str(second) + "," + str(third)] = tak(first, second, third)
    return tak_dict[str(first) + "," + str(second) + "," + str(third)]

print(tak(12, 6, 0))

辞書使ってすでに計算してるのを省略した。 

汚いのは知ってるけど、Pythonわかんない僕にはこれしか思いつかなかったんだ。。

 

でもこれで4.5秒位早くなった!わっしょい!

 

最後に

かまってくれる方、ありがとうございます。

ゆっくりながらも頑張っていくので構い続けて下さいな!