みーくんは起床のプロ

この記事は、がっこうぐらし! Advent Calendar 2016 - Adventar の 12/5 についての記事です。 昨日の記事は @utgwkk の めぐねえにはなれない僕らだから - 私が歌川です でした。

はじめに

みーくん と言えば、ショッピングモールの籠城生活が印象的かと思います。 彼女(達)の籠城生活は精神的につらいものであるはずですが、 精神力を強くもち、みーくんは生き延びることができました。 それにはきっと生活習慣も大きく関わっていたでしょう。 特に、規則正しい生活習慣には規則正しい起床が不可欠です。 この記事では、みーくんの籠城生活の起床のコマを参考にして よい起床方法を考察しようと思います。

みーくんの起床(7話 まいにち より)

まず、彼女はめざまし時計により起床します。 その後、中座し目をゴシゴシし、カーテンを開け朝日を浴び、目を覚まします。 そして、リンスとシャンプーで紙を洗った後、着替え、 ダンボール机の上にてカロリーメートと水を朝ごはんに食べます。 いただきます、ごちそうさまは欠かしません。

f:id:CHY72:20161205181913p:plain まず、明らかに彼女は規則正しく起床しています。 僕は二度寝をよくしてしまい、遅刻することが多々あります。 それに、そもそも起きるのが午後だったりして、一日を無駄にしてしまうことも多いです。 そうすると精神的にどんどん辛くなっていきます。 f:id:CHY72:20161205182034p:plain

見習うべくは、彼女の理想的とも言える起床方法です。 まず、めざまし時計。 これをセットすることで高確率で所望の時間に起床することができます。 こういう文明の利器は須らく使うべきです。 次に、中座して目をゴシゴシしている。 こうすることで、まず体が急に起き上がることで夢の内容を忘れることができ、 二度寝をしたいと思う要件の一つ、「見た夢の続きが気になる」を無くすことができます。 目をゴシゴシすることで、目やにが落ち、目が開きやすくなります。 そして、彼女は朝日を浴びます。 朝日を浴びることで体は起床に対して前向きになることは、理解できると思います。 このように段階的に起きることによって、起床を確かなものにしています。 一度起床してしまえば、規則正しい生活習慣を送るのも容易いものです。 さらに、彼女は着替え、朝ごはんを食べています。 着替えてから朝ごはんを食べるという順番は、一見不思議なものに思えるかもしれませんが、 ご飯を食べると眠たくなることは分かりきっていることなので、 先に着替えを済ましておくことで、それを回避していると考えれば理解できるでしょう。 「いただきます」「ごちそうさま」 と声に出すことで更に目が覚めます。 他にも考察すべきことがあるとすれば、彼女の寝る態勢が仰向きであることでしょうか。 この寝方は、起きる動作に最も移行しやすい態勢です。

まとめ

みーくんは起床のプロ

さいごに

毎日起床失敗しているのでみーくんを見習って起床のプロになりたい。 次の記事は 12/9 に @京橋ひよわ による がっこうぐらしの避難生活 | ひよわのらくがき です。 くるみちゃんかわいいよね

参考

がっこうぐらし! 2巻 www.amazon.co.jp

Macで(Windows風に)アプリをキーボードで切り替えるJXAを書いた

したいこと

Windowsでは以下の操作が簡単にできますがデフォルトのMacでは実現できません。

  • Win+0~9 キーで数字の対応するタスクバー(MacでいうDock)の位置のアプリの起動/切り替え
  • Win+↑でアプリの画面最大化
  • Win+←→ でアプリを画面の右(左)半分にフィットさせる

Win+←→キーなどは、shiftltなどのアプリを入れることでも再現することができますが、 それではDockをキーボードで簡単に操作することはできません。 また、SplitViewを使う手もありますが、他のアプリとの切り替えがめんどうなのであれはダメです。 以上の操作を実行するAppleScriptを書いてキーボードショートカットに割り当てて爆速開発環境にしたいわけです。

具体的には、

  • Ctrl + 0~9キーで対応するDockの位置のアプリを起動/切り替え
  • Ctrl + ↑キーで現在のアプリの画面を最大化する
  • Ctrl + ←→キーで現在のアプリを左右に寄せる
  • Ctrl + ↓ キーで隣のアプリと切り替え
  • Ctrl + _ キーでiTunesと切り替え

の操作ができるようにしたいわけです。

手順

  1. $brew cask install karabiner で、キーバインドのために Karabiner を入れる。
  2. $brew install cliclick で、shellからクリック操作をエミュレートできるcliclickを入れる。(/usr/local/bin/cliclick にcliclickが配置されているようにする)
  3. Karabinerを開き、private.xml(キーバインド割当設定)を生成する
  4. gist.github.com をprivate.xmlに書く。
  5. gist.github.com~/.mv_windows.js に書く。
  6. Karabinerで先程生成したキーバインドを設定する。
  7. うまく動作しない場合はKarabinerのアクセシビリティが正しいかを確認する。
  8. キーバインド完成!!

感想

初めてAppleScriptを書いてみようとして文法がアレだったのでJavaScriptで書きました。 JXAの日本語情報(特にDock周り)がとても少なかったのでなかなかめんどかったです。

600kmくらいママチャリを漕いだら9月が終わってしまっていた

概要

九州の横断(新門司->USA->別府),愛媛の横断(八幡浜->東予港),滋賀の横断(琵琶湖一周)を漕いだという話です. f:id:CHY72:20160927130101p:plain

9/11 出発日前日

  • この日はシャドウマッピングをUnityで実装しました. www.slideshare.net
  • サークルのメンバーが九州に行く機運が高まっていたので せっかくなので僕は自転車で行きたいなーと思いたちました
  • フェリーを予約して,早めの就寝.
  • 宿:部室

9/12 九州へ(出町柳->大阪南港 +64.0km 総計64.0km)

9/13 USAへ(新門司(福岡)->USA(大分) +51.7km 総計137.3km)

  • 九州住みのKMC部員と別府まで目指すも途中でバテてUSAで終了
  • USAから電車で別府に行き更に他の部員(電車に乗って楽をする人たち)と合流
  • 体調:快晴過ぎて日焼けして温泉に入れなかった(><).
  • 宿:5kくらいのホテル

9/14 別府へ(USA(大分)->別府(大分) +56.0km 総計193.3km)

  • 朝は雨が降っていたのでメンバーで別府地獄めぐり
  • 午後は別府まで自転車で山越え.2時間くらいコンビニすら無い区間があってやばかった.
  • 宿:雨が降ってきたので入ったネカフェ

9/15 博多観光

  • そにっく往復を用いて博多へUターンして観光
  • 太宰府,博多タワーetcを観光
  • 宿:深夜に別府に帰ったのでカプセルホテル

9/16 松山へ(八幡浜(愛媛)->松山(愛媛) +64.5km 総計257.8km)

  • フェリーで別府->八幡浜へ向かい,夕やけこやけラインをひたすら進む
  • 日本ではここでしか生産されないらしいポポーなどを購入
  • 浜がきれいかなーとか思っていたら消波ブロックしかなかった(><)
  • 宿:松山の部員宅

9/17 ~ 9/20 松山観光

  • ランタン祭り,大神輿総練,道後温泉などを満喫
  • 途中で台風が来てヤバみ

9/21 京都へ帰還1 (松山(愛媛)->東予港(愛媛) +68.4km 総計 326.2km)

  • ぐるっと海岸線を廻って港へ
  • 宿:フェリー

9/22 ~ 9/23 京都へ帰還2 (大阪南港->出町柳 + 64.3km 総計390.5km)

  • 体調:瀕死

9/24 琵琶湖一周 (➰ +217.0km 総計 607.5km)

  • 締めに軽く琵琶湖を一周しました(ママチャリでも半日半くらいでできる)
  • 体調:死

9/25

  • 体調:死

9/26

  • 体調:あし

9/27

  • 体調:よろし

こころえ

  • 一日にママチャリで走れる距離は70km.(それ以上すると翌日に負担が出る)
  • 自転車グローブは必須.(これがないと手にマメが出来て痛い)
  • 大阪のオバちゃんみたいにサドルにクッションを引いた.(確実にお尻が痛くなる)
  • 一日でも日焼けはするので日焼け止めは大切.(でないと温泉で疲れを癒せなくなる)
  • 運がよいと自転車を漕ぐときは雨が降らない.(そして僕の運はよいです)
  • 400km漕いだあとでも琵琶湖は一周できる.(但し翌2日死ぬ)
  • ロードバイクの方が自転車の5倍くらい効率が良い
  • 公共交通機関の代わりに自転車を使用しても費用は結局同じ(フェリーで自転車代が余分にかかったり,水分補給費等が高かったり)

まとめ

  • 沢山の人の支えのお陰で適当すぎる計画でも無事で済みました.とても感謝.
  • 公共交通機関は神.

夏休み1日目

まだ記録管理用のslackbot/アプリも作っていないのでここに記録することになります. 今日は何もしませんでした. @nonamea774 に水飲み鳥を送りつけました. あと,TensorFlowやってる人が多いのでやってみたいと思いました. 特定の絵師の特徴とかを機械学習させたら楽に絵師を検索できたりするのかな. 575とかダジャレとかも判定させたりしたいですね.

まとめ

今日は 9 時間寝ました.

朝6時に寝て昼3時ころに起きたでしょうか.

形式的な朝ごはん,昼ごはんは食べておりません.

昼過ぎに起きると体調はあまり芳しくない様子.

更に追加で22時から25:20まで3:20寝ました.

この睡眠は快適でした.

そりでは,無限に練りをしまつ.

夏休みに入りました

夏休みに入りました.

有意義に過ごしていきたいと思うので日記を描くことにしました.

とはいえ,日記に何をしたのかをインターネッツに書き込むことははばかられます.

ですので,何時間睡眠をとったか,だけを毎日記録していこうと思います.

…それならSlackBot作ってやったほうが早いですね.

じゃあそうします.

まとめ

今日は 9時間寝ました.

寝起きは辛く,快眠ではなかったです.

照明を浴びることにより徐々に目を覚ましました.

起床時刻は朝10時です.

それでは,よい眠りを

KMCとPiet,そして最強のPietの為にdllを動的にC#で読みこむ話

はじめに

この記事はKMC Advent Calendar 2015 18日目の記事です。 前回の記事はwalkureさんによる京大マイコンクラブと旅するわたし - (。・ω・。)ノ・☆':*;':*でした。

KMCID: murataです。
最近Pietのことしか考えてないのでこの記事を書いたら半年ほどPiet禁します。 タイトルの「C#でDllを動的に読み込む話」はC#とかいう難しい言語でちょっとよくわかりにくいので 先に簡単で分かりやすい言語であるPietの話から始めますね。

最近僕が描いたPiet

3つ程描きました。

あぁ^~心がぴょんぴょんするんじゃぁ^~とは (アァーココロガピョンピョンスルンジャァーとは) [単語記事] - ニコニコ大百科に、 他のプログラミング言語はいっぱいあるのにPietだけなかったので描きました。 「あ~心がぴょんぴょんするんじゃ~」と出力します。 Pietはプログラミング出来い人にも画像という冗長性の手段によってコードの意味を伝えられる素晴らしい言語なんです。

髪の毛で72を取ってそれを顔を縦横無尽に横断しながらCHIHAYAという文字列を作って出力し続けています。

gyazo.com
これはここに描いているとおりの文字列を出力するコードです。 好きな文字列をわかりやすく表現出来ますね。 Pietは柔軟にコードを手軽に描ける良い言語なんです。

今年のKMCとPietの活動を振り返る

この記事はKMCアドベントカレンダーなので、 一応今年(2015年)のKMCの大きなPiet活動を簡単に振り返ろうと思います。

時系列順にPiet活動を振り返る

  • 3月 Pietの統合開発環境(IDE)であるPidetPietのエディタを作った話が発表される
    • これにより、開発がスムーズになりPietの開発が加速されました。
  • 5月 Pietを描く新入生プロジェクト発足
    • KMCの新入生に初めてのプログラミングでPietを教える…正気の沙汰ではないですね。 kmc.hatenablog.jp
  • 8月 YAPCでPietの講座が部員によって行われる
  • 11月 NFでPietが展示される
    • NF(京大の学祭)でPietを展示しました。 文字でしかプログラミング出来ないという常識を吹き飛ばすのがなかなか新鮮なのか意外と好評でした。

KMCの部員が開発しているツールを探してみた

Pietの中間言語コンパイラ、テストユーティリティ、インタプリタIDE…十分な開発環境が用意されてますね。 ここまでPietの開発が進んでいるのはKMCだけではないでしょうか?

僕の考えた最強のPiet

こんなに夢のあるPietをさらに実用的な言語にしようと、 僕は二週間くらいかけて最強のPiet拡張を考案しました。 概要だけ言うと数字だけでなくスタックを積んだりDllを扱えて、 ゲームやWebアプリケーションを手軽に作れるようになる予定です。 @Noname774さんのサークルにその仕様書を寄稿させてもらったのでよければお手に取り下さい。

C#でDllを動的に読み込む

僕の考えた最強のPietはC#で作られたPidetをベースに作る予定なので、 同じくC#で実装します。 僕の考えた最強のPietではdllを読み込む機能を搭載する予定です。 そのためにまずはC#で動的にdllを読み込める必要があります。 今回の記事のメインはその読み込み方についてです。 静的に(つまりコンパイル前に予め)読み込むのなら、 DllImport属性を利用することで簡単に利用することが出来ます。 (解説は他所に譲ります)。 しかし、この方法ではコンパイル後にそれで定義していない新しいDllの関数を動的に呼び出すことは出来ません。 ではどうすればいいのでしょうか?

.Net製のDllの場合

.Net製Dll、つまりC#VB.Netで作成されたdllの場合は比較的楽に呼び出すことが出来ます。

public static object Load_DotNet_Dll(string dllpath,string ClassName ,string FuncName, object[] Params) {
    try {
        var t = Assembly.LoadFrom(dllpath).GetType(ClassName);
        var obj = Activator.CreateInstance(t);
        return t.GetMethod(FuncName).Invoke(obj, Params);
    } catch {return 0;}
}

(usingは省略しました)。 使うときには、

Load_DotNet_Dll("Plugins/TestDLL.dll", "TestDll.CsDll.LangA",new object[] { 5, "RA" });

このように文字列と引数の配列だけを用います。 これで動的に好きなdllを呼び出せるようになります。 (この例では自作DllをPlugins下にTestDLL.dllという名前で配置していて、 そのDll内で定義された、TestDll名前空間のCsDllクラスのLangA関数を引数 5 と "RA" で呼び出しています。) .Net製dllは型など色々な情報がそのまま入っているため、扱いが容易なのですね。

C製のDllの場合

C製のDll(kernel32.dll,winmm.dllなど)はちょっと手間が必要です。 関数ポインタを得る為に kernel32.dllからLoadLibrary,FreeLibrary,GetProcAddressを呼び出す必要があります。 さらに引数に応じた関数デリゲードは動的に作成しなければならないのでなんかめんどかったです。 デリゲードをジェネリックで作成すると一見成功するように思えますが、そうすると いざ使う時に型がジェネリックのままなので使うことが出来ないです。

C#でLoadLibraryを使用してアンマネージDLLを使用する - 閑古鳥 C# GetDelegateForFunctionPointer with generic delegate - Stack Overflow

[DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern IntPtr LoadLibrary(string lpFileName);
[DllImport("kernel32", SetLastError = true)]
internal static extern bool FreeLibrary(IntPtr hModule);
[DllImport("kernel32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = false)]
internal static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);

public static class DelegateCreator {
    private static readonly Func<Type[], Type> MakeNewCustomDelegate 
        = (Func<Type[], Type>)Delegate.CreateDelegate(
            typeof(Func<Type[], Type>),
            typeof(Expression)
                .Assembly
                .GetType("System.Linq.Expressions.Compiler.DelegateHelpers")
                .GetMethod("MakeNewCustomDelegate", BindingFlags.NonPublic | BindingFlags.Static));
    public static Type NewDelegateType(Type ret, Type[] Params) {
        Type[] args = new Type[Params.Length+1];
        Params.CopyTo(args, 0);
        args[args.Length - 1] = ret;
        return MakeNewCustomDelegate(args);
    }
}


public static object Load_C_Dll(string dllpath,string func , object[] Params) {
    try {
        var Types = Params.Select(arg => arg.GetType()).ToArray();
        IntPtr handle = LoadLibrary(dllpath);
        IntPtr fadd = GetProcAddress(handle, func);
        Type t = DelegateCreator.NewDelegateType(typeof(IntPtr), Types);
        object res = Marshal.GetDelegateForFunctionPointer(fadd, t).DynamicInvoke(Params);
        FreeLibrary(handle);
        return res;
    } catch { return 0; }
}

私達はこの関数を定義したのでもうこれからは、 Load_C_Dll("user32.dll", "MessageBoxA", new object[] { IntPtr.Zero, "Hello World.", "Caption", (uint)0 }) のようにすることでコンパイル後でも、実行中の好きな時に好きなDllを呼び出すことが出来ます!

まとめ

このDll機能を利用して僕は最強のPietを作るつもりなので乞うご期待ですよ。

ついでに宣伝

https://play.google.com/store/apps/details?id=com.Paradigm.Ikada https://lh3.googleusercontent.com/1QTRWS-ETw4ul_5SHEA5RjG0E49JrxsT-wIGhOxvUIJ_tgVIo9cgunlJet19O94Wffme=h900 最近運ゲー排除マインスイーパーをAndroidアプリにした話と市場に対する雑感 - DNEK's blogみたいに自作ゲームを宣伝するのが流行っているっぽいので僕も最近作ったパズルゲームのAndroid版を公開します。 よかったら遊んでステージ作れるんで投稿して下さい。

最後に

明日の記事は、Kazakamiさんによる「shellチャンネルについて」です。 好きなコマンドが何もかも気にせず好き放題打てる夢の様なチャンネルShellチャンネルの話ですね! 期待しています!!!!!

シェーダ周りを色々調べたのでまとめてみた

KMCでのグラフィックのプロジェクトでは、 毎回担当者が講座をします。 僕は今回担当でシェーダーについて調べてたので軽くブログに書こうかな ということで書きます。

Shader?

  • Shade(陰影)を持たせて立体的に魅せたりリアリティを持たせたりする技法
  • 物体の面の情報とか頂点の情報とかで色や頂点を操作出来るので応用方法は様々

応用例

  • トゥーンシェーディング

  • 水面の表現

    • 反射・水紋・屈折などを計算してリアルな水面を再現している
    • 例:World of Warships worldofwarships.com

基本的な仕組み

  • WebGL(ブラウザで高性能描画が出来るやつ)の解説サイトが凄く良かったです。 wgld.org
  • w020 ~ w024, w042 ~ w048 あたりを見れば基本は分かりますし、それ以外にも参考になるものはとても多いサイトです。

絵を描く時に活かす

どのくらいShaderを使うと変わるの

実際のゲームへの応用

Unityで活かす