大学生のときに撮影したモノクロフィルムのスキャンデータを Colorize した

ディープネットワークを用いた大域特徴と局所特徴の学習による白黒写真の自動色付け

github.com

Colorize が気軽にできるとわかって何かおもしろい使い方がないかなと考えて、大学生のころに撮影したモノクロフィルムのスキャンデータをつかうことを思いついた。
つかう手順として最初に Torch のインストールが必要で、これをいれたあと lua を起動しようとしてもうまくいかったけど、結局 torch 上で lua をうごかせば問題なかった。

手持ちのスキャンデータはフィルムごとにフォルダにいれていたので LuaFlieSystem(lfs) でファイル操作が必要だったけど Python やってる感じと違和感がなかったのでサクサクできた。そのまま回してたらメモリがなくなってしまったので GC 動かしたけど簡単にできてよかった。 gist.github.com 結果としては森とか空は綺麗に色がつくけど、その他は厳しい感じになった。 out0001.jpg_7

以上です。

DURR がほしかったけど売り切れなので python で memento mori

f:id:trss:20150411163845p:plain

Skrekstore — A shivering bracelet that investigates our perception of 5 minutes.

DURR 5分に1度振動して時間の伸び縮みをおしえるプロダクトがあるのですが もう購入できないのでどうにか体験したいなと思って5分に1度アスタリスクを出力するのを書きました

github.com

これだけだとターミナルみてないとわからないので画面を光らせるとかそういうのやりたいけど方法がよくわからない
あと 5分ごとなら pomodoro にもつかえるなと思ったので pomodoro モードもつけた ポーズ機能とかリセットとかないのでそういうのもつけたい
generator で pomodoro のメッセージをコントロールするところが無駄に悩んだ

gist79dbcf78de4168c942da

なぜ5分なのか

なにかで DURR のひとたちのインタビューを読んで 1分だとうざいし 10分だと伸び縮みがよくわからないけど 5分だといい感じ だそうで そうした

壊れた図bot をつくった

bot という最高の手動bot がありますが これがグリッチしたら最高じゃんと思ってつくって運用していつのまにかフォロワーが500を超えたので紹介します
まあふつうに twitterbot + glitch という感じなので特に言うことないのですが
グリッチに関しては以下を

安全に glitch できるようにした - >>> (trs is snobbishness) == True

自動投稿に関してはよくわからなかったので crontab をつかいました

本体

#! usr/bin/python
# -*- coding: utf-8 -*-

from config import *
import glitch.glitch as glitch
import twitter
import urllib
import base64
import pickle
import os
import glob
import random
from replyPattern import replyPattern

class TwitterClient(object):
    def __init__(self):
# config に置いたキーから oauth 設定
        self.t = twitter.Twitter(
            auth=twitter.OAuth(
                OAUTH_TOKEN,
                OAUTH_TOKEN_SECRET,
                CONSUMER_KEY,
                CONSUMER_SECRET
                ))
# 図bot から画像取得
    def get_user_tweets(self, screen_name="zu__bot", counts=1):
        ut = self.t.statuses.user_timeline(screen_name=screen_name, counts=counts)
        try:
            media_url = ut[0]["entities"]["media"][0]["media_url"]
            status_id = ut[0]["id_str"]
            return (media_url, status_id)
        except KeyError:
            return ut[0]["text"]
    def get_timeline(self):
        return self.t.statuses.home_timeline()[0]["text"]
    def post_tweet(self, msg=None):
        self.t.statuses.update(status=msg)
#データ付きの投稿
    def post_with_media(self, data=None, msg="", reply=None):
        try:
            params = {"media[]": data,
                  "status": msg,
                  "in_reply_to_status_id": reply
                 }
            self.t.statuses.update_with_media(**params)
            return True
        except:
            return False
    def latest_status_id(self, latestid):
        with open("latestStatusID", "rb") as f:
            try:
                lastid = pickle.load(f)
            except  (pickle.UnpicklingError, EOFError):
                lastid = None
        if latestid != lastid:
            with open("latestStatusID", "wb") as w:
                pickle.dump(latestid, w)
            return True
        else:
            return False
#再破壊
    def get_reply(self, screen_name="kowaretazu_bot", counts=1):
        ut = self.t.statuses.mentions_timeline(screen_name=screen_name, counts=counts)
        if ut:
            status = ut[0]["text"]
            reply_id = ut[0]["id_str"]
            return (status, reply_id)
        else:
            return None
    def reply_checker(self, status):
        status = status.lstrip("@kowaretazu_bot").lstrip().lstrip("@zu__bot").lstrip()
        if status in replyPattern:
            return True
        else:
            return False
    def latest_reply_id(self, replyid):
        with open("latestReplyID", "rb") as f:
            try:
                lastid = pickle.load(f)
            except  (pickle.UnpicklingError, EOFError):
                lastid = None
        if replyid != lastid:
            with open("latestReplyID", "wb") as w:
                pickle.dump(replyid, w)
            return True
        else:
            return False
#破壊
class GlitchClient(object):
    def __init__(self, url):
        self.savepath = url.lstrip("http://bs.twimg.com/media/")
        urllib.request.urlretrieve(url, self.savepath)
        self.glitched_image = "glitched{0}.jpg".format(random.randint(0, 62))
    def glitch(self):
        glitch.glitch(self.savepath, max=True)
    def image_cleanupper(self):
        names = glob.glob("*.jpg")
        names.remove(self.savepath)
        names.remove(self.glitched_image)
        list(map(os.remove, names))
    def b64_to_utf8_decoder(self, filename):
        with open(filename, "rb") as f:
            return base64.b64encode(f.read()).decode("utf8", "ignore")
#キーワードきたら破壊
def onemore(t=None):
    reglitch = t.get_reply()
    try:
        if t.reply_checker(reglitch[0]):
            return t.latest_reply_id(reglitch[1])
    except (TypeError):
        pass
    return False

def glitch_machine(zubot=None, t=None):
    g = GlitchClient(zubot[0])
    g.glitch()
    data = g.b64_to_utf8_decoder(g.glitched_image)
    if t.post_with_media(data, "@zu__bot", zubot[1]):
        g.image_cleanupper()

def main():
    try:
        t = TwitterClient()
        zubot = t.get_user_tweets()
        if onemore(t):
            glitch_machine(zubot, t)
            return
        if not t.latest_status_id(zubot[1]):
            return
        glitch_machine(zubot, t)
#なんかエラー起きたら投稿
    except:
        t = TwitterClient()
        t.post_tweet("Sorry, 壊れた図_bot has been broken.")

if __name__ == '__main__':
    main()
replyPattern = {"one more",
                "もっかい",
                "壊して"
}

よければ楽しんでください

https://twitter.com/kowaretazu_bot

安全に glitch できるようにした

trsqxyz/glitch · GitHub

いままでのやつはファイルのデータのランダムな文字列をランダムな文字列で置換するというもので 画像ごとぶっ壊してしまうことや 全く壊せていないことが多々あった
そこでデータにある最多の文字を選んで壊すことで安定的に壊すようにした

gistfcae978769220c05321f

オプションの intense をつけると前と同じ動作で壊す

http://f.cl.ly/items/3r3Z2B1E1q2b1i3K1H3C/cmp_glitch.png

参加しなかったけど参加できた PyCon JP 2014

先日 PyCon JP 2014 が終わりました
自分は仕事でつかっていないので楽しみのためだけにアーリーバードの 7kという参加費を払う気になれなかったので不参加でしたが、すべてのセッションおよび LT で YouTube による Live があったので 自室にいてもほぼリアルタイムに会場の雰囲気を味わうことが出来ました
画質も音質も良く スライドと話者がバランスよく表示されるレイアウトも見やすくて 結局 今回の参加費にはこういったところへの対価も含まれているんだなと当然なことを感じました(会計内容知りませんが
またパーティーの参加費やコーヒーブレイク ランチ またカンファレンスのためだけに光ネクストの引き込み工事兼1ヶ月分の契約まで含まれていて そういったサービス向上のおかげで自室で好きなセッションが見られたというのが感謝しかないなと思いました

アーカイブもありますのでまだまだ参加できます

https://www.youtube.com/playlist?list=PLMkWB0UjwFGm4Ao5w2CKv24tl_Op_kxs5
21世紀でよかった

スライドのまとめ
http://minhavoz269.blogspot.jp/2014/09/pycon-jp-2014_16.html

公式まとめがきた
https://pycon.jp/2014/reports/slides/?utm_content=buffer2e6a9&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer

Mac OS X Mavericks でデュアルモニタをする際に Dock を任意のディスプレイに表示させる

任意のディスプレイの右下もしくは左下にカーソルを移動させるとできるっぽいです
ホットコーナーの設定とかは関係ないみたい

f:id:trss:20140906234928p:plain

f:id:trss:20140906235051g:plain

Moneytree の有料サービスが始まるっぽい

超絶便利サービスの Moneytree から利用規約変更のメールがきたので読んでみました
変更箇所をハイライトで示していてとっても親切

f:id:trss:20140823110405p:plain

ハイライトされている部分はほとんど有料サービスについての内容でした
どんなサービスか気になります
というか利用規約が読みやすいし短いし感動 読みきれたの初めてかもしれない

cf.

利用規約 | Moneytree