ごはんと飲み物は紙一重

このブログはモチベーションアップのために情報工学関連について記事を更新していこうと思います。三日坊主にならないよう頑張ります。

【俺妹】大好きな黒猫をディープラーニングで認識しないわけがない【データ収集編】

タイトルにセンスが無いとかいうのはなしで

やっと必要最低限の情報を整えてブログ公開することができそうでしたので,ひとまず記事としてまとめることにしました.

大学2年になった夏休み・・・Pythonを独学し始めて1年,深層学習を独学し始めて半年,そろそろなにかしら自分の力でなにか結果を残したい!

「俺妹×深層学習・・・そうだ!黒猫をCNNで学習させて認識できるようなプログラムを作ろう!」

というありきたりで,n番煎じなネタではありますがやってみました!

実行環境

  • MacBookPro Retina 13 inch
  • Mac OS X El Capitan 10.11.6
  • pyenv × anaconda2-4.0.0

実行環境を整えるのに半年くらいかかった気はする,直にインストールすれば問題ないのですが,pyenvにtensorflowとかopencv2をインストールするのがだるかった思い出.

今回はbrewのインストールから記述するとか言うところは省いて環境は整っている状態から記事を書き始めることにしますね.

準備編

やっとこさ本編です.まずは学習には必要不可欠である,顔データの収集からしなければいけません. (顔データがその辺に落ちていればこの記事は必要ないことになりますからねw)

初めにGoogle先生

Python 顔認識」

で検索をかけるとすっごくOpenCVを推してくるみたいです.実際キャラクター認識やアイドル認識の記事を見てみるとOpenCVで顔認識をしているところはかなり見かけたので私も使おうってことで,

qiita.com

この記事を見ました.これ見る限りでは人物の画像を認識する記事だったので,アニメキャラクターを認識するようのカスケードファイルはないのかと探したところ,

ultraist.hatenablog.com

あるんですね.これが.先人様々ですねw

# -*- coding: utf-8 -*-

##
## AnimefaceDetection.py
##
## 学習したデータを用いて画像から分類をする.
##

import sys
sys.path.append("/usr/local/lib/python2.7/site-packages")
import cv2
import os.path

def detect(filename, cascade_file="lbpcascade_animeface.xml"):
    if not os.path.isfile(cascade_file):
        raise RuntimeError("%s: not found" % cascade_file)

    # カスケード分類器の特徴量を取得
    cascade = cv2.CascadeClassifier(cascade_file)

    # ファイル読み込み
    img = cv2.imread(filename)

    # グレースケール変換
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # ヒストグラム表示用のイメージ作成
    gray = cv2.equalizeHist(gray)

    # キャラクター認識の実行
    # scaleFactorは画像スケールにおける縮小量
    # minNeighborsは値が大きくなれば検出の信頼性が上がるが見逃してしまう場合も増える
    # 認識する最小サイズ
    faces = cascade.detectMultiScale(gray,
            # 認識用オプション
            scaleFactor = 1.1,
            minNeighbors = 1,
            minSize = (24,24))

    # 保存先のディレクトリ作成
    if len(faces) > 0 :
        path = os.path.splitext(filename)
        dir_path = path[0] + '_face'
        if os.path.isdir(dir_path) == False:
            os.mkdir(dir_path)


    # 結果を表示
    cv2.imshow("AnimeFaceDetect", image)

    print ('何かキーを押すと続行します')
    cv2.waitKey(0)

    # 実行結果を保存
    cv2.imwrite("detect.png", image)

# 引数判定
if len(sys.argv) != 2:
    sys.stderr.write("usage: detect.py <filename>\n")
    sys.exit(-1)

filename = sys.argv[1]
detect(filename)

上記の用にプログラムを作成すると, f:id:ST_ha1cyon:20161025183500p:plain

こんな感じでざっくりとアニメ顔を認識してデータを集めることが可能・・・

ですが!!

この調子で画像1枚1枚を集めて検出器にかけているようでは,俺の夏休みが終わってしまう!! 実際サンプルとしては主要キャラに1000枚くらいを想定していたので,画像を探しているだけで気が遠くなりそう・・・

そんなとき・・・

動画からフレームごとにキャプチャすれば画像集めの時間を短縮できるのでは・・・

幸運にも動画データはあったため,さっそくプログラムを改良.

# -*- coding: utf-8 -*-

##
## VideoAFDetection.py
##
## VideoAFDetection は先人の知恵の結晶をそのまま使いキャラクターを矩形抽出する.
## face_detectionでは人間の目と顔を認識することで実装していたためアニメ用にする
## 動画からキャラクターを抽出できるようにする.
##

import sys
sys.path.append("/usr/local/lib/python2.7/site-packages")
import cv2
import os.path

cascade_file = "lbpcascade_animeface.xml"

def detect(image):
    if not os.path.isfile(cascade_file):
        raise RuntimeError("%s: not found" % cascade_file)

    # カスケード分類器の特徴量を取得
    cascade = cv2.CascadeClassifier(cascade_file)

    # グレースケール変換
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # ヒストグラム表示用のイメージ作成
    gray = cv2.equalizeHist(gray)

    # キャラクター認識の実行
    # scaleFactorは画像スケールにおける縮小量
    # minNeighborsは値が大きくなれば検出の信頼性が上がるが見逃してしまう場合も増える
    # 認識する最小サイズ
    faces = cascade.detectMultiScale(gray,
            # 認識用オプション
            scaleFactor = 1.1,
            minNeighbors = 1,
            minSize = (24,24))

filename = sys.argv[1]
cap = cv2.VideoCapture(filename)

# 顔だけを切り出して保存する
framenum = 0
faceframenum = 0
color = (0,0,255)

# 保存先のディレクトリ作成
path = os.path.splitext(filename)
dir_path = path[0] + '_face'
if os.path.isdir(dir_path) == False:
    os.mkdir(dir_path)

while(cap.isOpened()):
    framenum += 1

    ret, image = cap.read()
    if not ret:
        break

    if framenum%50 == 0:
        faces = detect(image)
        if len(faces) == 0:
            continue # 認識結果がnullなら次のフレームへ

        for rect in faces:
            x = rect[0]
            y = rect[1]
            width = rect[2]
            height = rect[3]
            dst = image[y:y + height, x:x + width]
            resized_dst = cv2.resize(dst,(64,64)) # サイズを64*64に調整
            if str(faceframenum) < 10:
                cv2.imwrite(dir_path  + '/' + "00" + str(faceframenum) + ".jpg", resized_dst)
            elif 10 < str(faceframenum) < 100:
                cv2.imwrite(dir_path + '/' + "0" + str(faceframenum) + ".jpg", resized_dst)
            else:
                cv2.imwrite(dir_path + '/' + str(faceframenum) + ".jpg", resized_dst)
            faceframenum += 1

cap.release()

このプログラムを動画ファイルに対して実行すると,1話分のキャラクター画像を取り込んでくれるので大体500枚から800枚くらいの顔データを取得することができました.動画からだとモブキャラも同じく顔として認識するので,学習に使用しない顔データを除くと1話あたり大体400枚位のデータが集まりました.

記事が長くなってもいけないのでこのパートはここまでということで.次回では【データ準備編】と題しまして,集めた顔データを整理して学習に使用するための形に持っていくところまでを記事にしたいと考えています.

Tensorflowでも深層学習がしたい その0

その0って書いておきながら,続くかどうかは別としてTensorflow欲が少しずつ高まってきているので,自分用のメモ兼わからないひとむけに書こうかなとか思ったりしたわけで.

 

深層学習って何を勉強したらいいんだろう…と思いend先生に相談してみたところ,「MLPシリーズの深層学習がいいよ」と言われて1年後期に購入.

http://www.amazon.co.jp/dp/4061529021

 

一周読みきっての感想としては,

「(やっべ,なんとなく読めるところあるけど理解できてねぇ)」

という印象.深層学習初心者として思ったのは,数学的知識がないと厳しい物を感じるところ.イメージでいろいろつかもうとしても掴んでいたのは空だった的な感じでした.

 

というわけで,前置きも長くなりそうなので本題に移ると,

「本の理解をTensorflowを通して学べるなら深層学習とTensorflowをどっちも理解できるんじゃなかろうか!」

っていう感じで,やっていったことをまとめていこうかなと.

 

とはいえ,Tensorflowを全く書いたことがない人に関しては,「Tensorflow触れない積んだ」ってなりそうですが,slideshareにこんなによいスライドが!!

 

www.slideshare.net

 

これを一通り読み通しながら,プログラミングしていくとTensorflowの書き方の流れや基本的なことが抑えられるはず!

 

この前提を置いておきながら,本とリンクさせて理解していくつもりですので,応援よろしくお願いします←

梅雨明けとマイクラと…

お久しぶりの更新になったわけで,前回の更新はTeX勉強会だったってことはもう2ヶ月も立っているのか.時間というものは非常に恐ろしいものだ…

 

ところで沖縄も梅雨があけたということみたいなので,本格的な夏が始まるみたい(他人事)

情報工学科に通う身としては熱さと湿気は不快度指数を高める条件になってて,冬場は「はやく夏来いよ」とか行ってる割には夏になると「くそあつい」なんて行ってるから早く本州にでも引越s(ry

熱さにも負けずに課題などいろいろ頑張っていきたいところ.

 

ところでここ最近はfacebooktwitterでもつぶやく頻度が増えているマインクラフト.

 

1年前の私「絶対にハマって課題できなくなるからやらない」

今の私「マイクラくっそ楽しいんだが」

 

こんな感じですはい.特に友人がサーバーを立てている模様でみんなとマイクラの話が共有できるのもまた一つの楽しみで.

一番大きなものとしては,バイト先で小学生にプログラミングを教える機会があるのだが,そこで子どもたちの話題に合わせられることが大きいかな.そのおかげもあってか最近は子供からマイクラの話をたくさん振られるようになって好感度もあがっている…のかな.

 

というわけで,興味はないかもしれないけど建築物紹介でもしておくとするかな

f:id:ST_ha1cyon:20160619220024p:plain

初の自宅.結局レールを伸ばしたせいで家というよりも完全に駅となってしまった.友人に「マイクラはとりあえず家をつくればやりたいことが見つかる」といわれ作成.すると,みるみるやりたいことが見つかってくる.恐るべし.

 

f:id:ST_ha1cyon:20160619215846p:plain

モノレールのような感じ.

 

f:id:ST_ha1cyon:20160619215849p:plain

自宅第2弾.初期に比べてマイクラ慣れの度合いが恐ろしく違う建造物のような気がする.動画やサイトを見ながらちまちま作ってく感じだった.相変わらず自分はものづくりがかなり好きな感じする.

 

f:id:ST_ha1cyon:20160619215853p:plain

植林場.これはすぐ作れる.

 

f:id:ST_ha1cyon:20160619215857p:plain

f:id:ST_ha1cyon:20160619215859p:plain

馬小屋.ここにきてまさかXOR回路を使えば便利になる事態が発生するとはおもわなんだ.

 

まぁかなり充実したマイクライフを過ごしています.

そのせいでほかの趣味がかなりおろそかになっているような気もするけど,熱があるうちに時間を注ぐのが一番よかったりするのかな.今のところはマイクラばっかりしている夏が続きそう.

第1回TeX勉強会のフィードバックなど

気が付けば1ヶ月ぶりの更新になってしまったのですが,別にサボっていたというわけではなく1,2件ほど途中まで下書きはしたものの記事にする目標まで達成できなかったということもあって記事にしなかっただけで(ry

 

というわけで,今回のタイトル通り4月9日(土)に琉大にて琉Techの名前をお借りして「第1回TeX勉強会」を開催させてもらいました。

ryutech.doorkeeper.jp

 

初講師ということもあったのと,ここ数回琉Techでの勉強会は10数名くらいの参加だったので「そんなに多くならないでしょう」と余裕ぶっこいて緊張もしてなかったのですが…

 

3日前:参加希望者 4人

2日前:参加希望者 7人

1日前:参加希望者 20人

当日:参加希望者 27人

(当日参加者:41人)

へ?40人?うそやん…イベント開始前に本気で焦りました…

人数が想定の2倍…いや3倍はあろうかという勢いで集まってもらって,急に緊張が…

特に今回の参加者には1年次の参加者がとても多く,全体の6割ぐらいを占めていたと思います。新入生ってなにかわからないけどやる気に満ち溢れていて素晴らしいです。

2年次の参加もそれなりにあり,授業に対して危機感を感じている皆さんのやる気を感じました。(こういう空気いいと思う)

そろそろ本題に戻ってフィードバックでもしましょうかね。

 

イベント準備


 イベント開始前には一応資料の方を作成していたのですが,どこまで詰めて準備するかがわからず,以前のイベントにあった,

 

aokabin.hateblo.jp

 

の実施した時の話が詳しくまとめられていたので,これを参考にしながら準備を進めていました。

 

マスタースライドに先に変更を加えてから,編集作業を行ったのでわりと苦労することなく,さっくりと資料を作ることができたのではないかと思います。

資料の作り方はリンク先のページ同様,具体的流れを先にまとめてからそれを見て資料を作成する感じです。

あんまりながったるい勉強会にしたくないなと考えていたので,3時間程度で終わる内容を用意しました。60ページでだいたい10時間ぐらいかな?

 

はじめてのTeX - Googleドライブ https://goo.gl/rzQ5mb

 

 後述しますが,準備の段階でやっておいたほうがいいなと思ったのは

# 作った資料を一度他人に見せて,意見をもらう

といったところでしょうかね。

 

 イベント中


 イベントレポートを活かして今回の勉強会では

# 講師の他にアシスタント(5名)を用意

# 勉強会中に音楽を流して質問しやすい,話しやすい雰囲気作り

の2つを行いました。

 

1年次は開始時間30分前にはほとんどの参加者が揃っており,2年次以上の先輩方が時間ギリギリもしくは5〜10分ほど遅刻する様子がみられましたね。

時   間   厳   守   と書くだけではやはり効果は薄そうです・・・

それくらいならいっそ開始時間の30分前に余裕を持って開始時刻を書いておけば予定通りに始めるのではないかな(それはちゃんと時間通りに来ている方に失礼)

 

今回の勉強会でアシスタントさんの存在はとても大きく,勉強会につきものであるエラーに対して,アシスタントさんフル稼働してもらって対応していました。

そのおかげで,エラーによってやる気を失う学生が少なかったのは救いですね。

しかし,エラーが出なかった人が「先進んでいいのかな?」って迷ってしまって結局進まずに暇をさせてしまう展開があったので,事前に「進められる方は先に進んでもいいですよ」みたいな声掛けがあればよかったのかなと感じました。

 

講師に質問…というよりも手を上げてアシスタントさんを呼んで質問するみたいな展開が多かったので,音楽を流したことも一応影響?しててくれたのかなと。

 

とにかく講師をやってる時に思ったことは1つ。

# アシスタントさんがいるととっても楽!(精神的に,肉体的に)

 

 イベント終了後


 イベントを終了して思ったことは,自分自身の技術力と知識の低さを痛感させられましたね…

というのも,今回の勉強会のエラーはほとんどアシスタントに来ていただいた先輩方のおかげでなんとかなったものの,正直自分ではなんとかならなかった…

 

後述しますが,TeXの設定をいろいろとしているおかげで我がMacbookでは苦労することなくいろいろと使えているような気がしますが,勉強会からTeXを使いはじめる人たちは環境がその日で整わないといけないため,こっちのパソコンでできるけどみんなのパソコンではできない現象が多発しましたね…

環境設定からやる初心者向けの勉強会では,実際に初期化されたパソコンを借りてみんなで環境構築するほうが確実だったかなぁと感じました。

 

イベント最後にアンケートをとったのでその結果も考察しながら,書き綴っていこうと思います。

 

f:id:ST_ha1cyon:20160411091633p:plain

1年次が多かったのもそうですが,今回は4分の3ほどが勉強会に初参加との事だったので,雰囲気が掴みづらかったのではないかと…もっと初心者に優しい勉強会にするために私自身もしっかり準備せねば…

 

f:id:ST_ha1cyon:20160411091827p:plain

比較的4が多かったですね。分かりやすかった(4と5)割合は86.1%とかなり高くてほっとしました。エラーが出るたびにグダグダしてしまったと思うので,つぎはこれよりも満足度の高い勉強会を実施してみたいですね。

ただ5は3分の1しかなかったので,満足度を高くするためには,事前準備をしっかりしてなるべくエラーを出させないようにするところですかね。

 

f:id:ST_ha1cyon:20160411092602p:plain

f:id:ST_ha1cyon:20160411092605p:plain

意見をまとめてみると

# 何をしたらいいかわからなくなってしまう時があった

# 専門用語が多く,設定が難しかった

 

の2つが多かったですかね。何をしたらいいかわからなくなってしまうところは,エラーの対応などで流れを止めてしまうせいで起こってしまうのではないかなと感じました。

また,専門用語については・・・大きな壁ですね・・・

確かに難しい用語が多く,とくに1年次も多かったために苦しいと感じる方もいたのではないかと…

環境設定から入る際には,自分のパソコンともう一つ初期化されたパソコンを用意して,映像を繋ぎ変えながら一緒に環境設定すると良かったかもしれないですね…

(仮想化ができるならいいけどできたっけな…)

 

 まとめ


 今回の勉強会をしてみて,また新たな課題がたくさん見つかったことはとてもよかったことで,初めてにしては得るものが大きかったのではないかと。

勉強会を開くときは1人ではなくて,複数人でスライドを作成したり,アシスタントをお願いしたり,グループワークにすることができれば,準備段階からもっと楽になるのではないかなと感じました。

TeXは自分自身ももっと使えるようになって,6月あたりにリベンジしてみたいですね。(2年次向けに,数式やグラフとかをまじえたものとか)

個人的にはPython勉強会もやってみたい。でもその前にもっと自分自身の技術力を高めていかなければ…まだまだ上には全然満たないほどしかPythonできないし……あれ?そもそも「Pythonできる」ってどれくらいのことを指すのか()

 

話が脱線しそうだ。今回のまとめ!

# アシスタントは数名用意すべき!講師側が絶対に楽になります!

# 勉強会中にJAZZ系統いいね。コーヒーとか用意出来たらもう完璧←

# 資料を作成するなら,イベント前に一度他人に見せて意見をもらってブラッシュアップ

# 初心者向け勉強会(環境設定から始まる勉強会)では実際に環境設定をみんなにみせながら行えると良し

# 教室予約,鍵の解錠,ゲストWi-fiの申請 はしっかりと!

 

大体は,参考にしたサイトとほとんど被ってしまうけど,勉強会のクオリティは自分の準備にかけた時間分だけ高くなると思います!

これから勉強会を企画しようと考えてる方はぜひがんばってください!

Pythonの管理だったり

最近rubyの勉強会に参加し,環境管理ツールからのインストールをした。「これって,pythonでもあるんじゃないか」と思ってググったら,

 

coderoid.hatenablog.com

 

やっぱあるのね。

というわけでpyenvをインストール。これを期に2系から3系に乗り換えようと思い,

 

$ pyenv install 3.5.1

 

を実行すると,

 

Downloading Python-3.5.1.tgz...

-> https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz

Installing Python-3.5.1...

 

BUILD FAILED (OS X 10.11.3 using python-build 20160130)

 

Inspect or clean up the working tree at /var/folders/wf/t85y0r395b556y3flsp7ys6c0000gn/T/python-build.20160311214848.95362

Results logged to /var/folders/wf/t85y0r395b556y3flsp7ys6c0000gn/T/python-build.20160311214848.95362.log

 

Last 10 log lines:

  File "/private/var/folders/wf/t85y0r395b556y3flsp7ys6c0000gn/T/python-build.20160311214848.95362/Python-3.5.1/Lib/ensurepip/__main__.py", line 4, in <module>

    ensurepip._main()

  File "/private/var/folders/wf/t85y0r395b556y3flsp7ys6c0000gn/T/python-build.20160311214848.95362/Python-3.5.1/Lib/ensurepip/__init__.py", line 209, in _main

    default_pip=args.default_pip,

  File "/private/var/folders/wf/t85y0r395b556y3flsp7ys6c0000gn/T/python-build.20160311214848.95362/Python-3.5.1/Lib/ensurepip/__init__.py", line 116, in bootstrap

    _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)

  File "/private/var/folders/wf/t85y0r395b556y3flsp7ys6c0000gn/T/python-build.20160311214848.95362/Python-3.5.1/Lib/ensurepip/__init__.py", line 40, in _run_pip

    import pip

zipimport.ZipImportError: can't decompress data; zlib not available

make: *** [install] Error 1

 

ってエラーがでた。なんじゃとおもってググると xcode command line developer tools が入ってないご様子。

 

$ xcode-select --install

 

でインストールすればうまくいった。

これでとりあえず環境設定はなんとかなりそうだ。El Capitanにしてからというもののこういうエラーに悩まされてる様な気がする(気のせい)

↓参考サイト

qiita.com

 

これで管理できるようになったからいいか。ターミナルを駆使してもっといろいろ扱ってみたいと思う日でした(小並感)

OS X Yosemite 仮想化奮闘記 その1

春休みということもあり,TeX勉強会の資料作成をしたところ…

「まずい!Yosemite以前とEl Capitanの環境違うやん!」

ということに気づき,作業を一旦中止。

動作確認用MacOS(Yosemite以前)が欲しかったため,Mac内にSnow LeopardVirtualBoxにインストールすることにした。

 

インストールに必要なものとして

VirtualBox

Mac OS X Snow Leopard

※以下は10.6.3より前のOS Xをインストールする際に必要みたい

・iBoot

 

の3つがあればなんとか出来るみたい。

まずはVirturalBoxの設定から,必要な環境は流れ通りに整える。流れ通りってなんだよっていう人はググッたほうがいいと思うんだ。うん。

注意しなければいけないのは,設定で "EFIを有効化"のチェックをはずさないとiBootがちゃんと起動してくれない。

左上の設定から設定しようとすると変更できずに,フラストレーション溜まってしまうので一つ一つOSを右クリックして設定するのが良い。

f:id:ST_ha1cyon:20160304015113p:plain

設定が終わったら,iBoot.isoをマウントして(マウントは起動後右下のバーのCDマークからマウント可)いざ起動。

f:id:ST_ha1cyon:20160304014935p:plain

この画面にこれたらまずまず。次にこの画面の状態からマウントを変更してSnow Leopardのインストールディスクにする。そしてF5キーで更新を行うと,ディスク名が変更されたのがわかる。

f:id:ST_ha1cyon:20160304014937p:plain

変更できたのが確認できたら,ドヤ顔決めてEnterキーをッターンと決めよう。正しくマウントされていればインストール画面が待っているはず(ちょっとだけ時間掛かる可能性があるので焦らずに…)

f:id:ST_ha1cyon:20160304015744p:plain

ここで「よっしゃインストールいけるで!」っていって続けるを押してどんどん先に進むとインストールできずに放心状態になるのでご注意を。続けるを押す前に,

 

ユーティリティー→ディスクユーティリティー

 

へ移動。念のためディスクを消去して綺麗にしてあげてから,

f:id:ST_ha1cyon:20160304014948p:plain

パーティション分けをする。この時に適当に名前をつけてあげて(今回は動作確認用ということでOperating Checkにしている)設定は完了。

f:id:ST_ha1cyon:20160304014944p:plain

そしたら先程のインストール初期画面に戻り,流れ通りにインストール。パソコン自体の性能にもよるんだろうけど,こっちは表示時間通り30分位でインストールを終えた感じがする。

インストールが終わったら,先ほど同様iBootから起動していくと,インストールされたハードディスクが見えるはずなので起動。個人情報など設定すれば…

f:id:ST_ha1cyon:20160304014949p:plain

これにてインストール完了。

結構ざっくりと説明は省いてここまできたが,実際にはいろいろエラーを解決するために時間を食ってしまい気づけば19時から7時間たってしまっていた…

数十サイト探しまわったせいで,どのサイトが一番わかりやすかったかなぁなんてのはあんまりなかった(WindowsからのMac仮想化はあってもMacからMac仮想化が乏しかった)ので,試行錯誤しまくってそのたびに検索かけてたね。検索大事。

 

とはいえ,基本となる進め方は以下のURLのサイトを見ながらだったので,本記事を用いて感謝したいと思います。

loan3000.blog71.fc2.com

 

今回はインストールまでだが,ここで終止符…ではなく本来の目的である「YosemiteでのTeX環境設定を確認する」までがゴールなのでまだまだ道は険しい(ような気がする)。

 

気が向けばまたその2があるんじゃないかな。

おやすみ,世界。

充実した春休み(前半)

気がつけばもう弥生の季節で。

テストが落ち着いて春休みに入ってからというものの

 

・念願の高校の友人との飲み会

Pythonをpaizaでひたすらやってるマン

Swift勉強会

・古宇利島へ宿泊

・自習室の大掃除からの留送会

 

などなど,細かいイベントを含めれば数えきれないほど,毎日予定が詰まっていく日々で,前期後の夏休みに比べれば圧倒的に1日1日暇がなく楽しい。

絶賛反抗期中の弟もとりあえず前期試験を終え,すこしは俺に当たらなくなってはきたのかな。まだまだ嫌われる身ではあるが・・・。

 

春休みを残り1ヶ月と控えて,まだまだやらなきゃいけないことがたくさんあるから,手をつけていかないとな。

 

話は変わって,そろそろ5代目キーボードステッカーを作成していこうかなとか考えておりまして・・・キーボードカバーにステッカーを貼る構想は結局のところ,

・ステッカーのシール部分に埃がついてしまう

・洗えることが売りのキーボードカバーが洗えない

(シールが剥がれ落ちてしまう)

というわけで次なる構想は

・キーボードに貼ってその上からカバーを被せる

というのが濃厚なのかな・・・

実際問題,洗っているとキーボードカバーが少し伸びてしまって,キーから0.5mm程度浮いてしまっているんだよなぁ。

なんとかして洗える痛キーボードカバーをつくれないことか・・・

春休み中に1つは完成させておきたいとおもう今日なのであった。

 

梅酒うまい。