Boogie Board Syncを買った

Boogie Board Syncを買った、保存できてBluetoothで取り出せるやつ
BB-2がすごい使いやすいけど、やっぱり保存できたほうがいいよねってことで

f:id:zenu:20160605164502j:plain

なんか、超うすいんですけど、文字が
BB-2は細く書こうとすると、まず付属のスタイラスじゃ無理ってくらい分厚い
BB-6は頑張っても太く書けない
店頭で触って分かってたけど、やっぱ薄い
遠目で何かいたかわかんないくらい

薄いのはなれの問題だろうけど、、、Windowsで接続できない!
なんでだろう、BluetoothのペアリングはできたけどSyncVDCで再度接続せんかいボケって出る・・・
とりあえずAndroidのほうでは見れたから良しとしよう

ローカルリポジトリをGitHubへ後から上げる方法

毎回よくわからなくなるのでメモ
GitHubリポジトリは作っておく、リモートリポジトリの設定はGUIでやっておく


リポジトリ名は.gitって付いているほう
https://github.com/zenuas/Roku
https://github.com/zenuas/Roku.git

git fetch
git merge origin/master
# たぶん.gitignoreあたりがコンフリクトする
# 差支えなければGitHubのものをそのまま使う
git commit
git push

今までまっしろけだったcontributionsとかゆーのがわずかに緑になった
みぎっかわだけ
f:id:zenu:20160530001842p:plain

.NETのジェネリクス解決

.NETのジェネリクス解決が意外とめんどくさい
型にジェネリクスがついている場合と関数にジェネリクスがついている場合がある

例えばListなんかは型にジェネリクスがついているのでこんな感じ

Dim list = GetType(List(Of ))
Dim list_add = list.GetMethod("get_Item") ' この時点で「T List(T).get_Item(int32)」
Dim list_str = list.MakeGenericType({GetType(String)})
Dim list_str_add = list_int32.GetMethod("get_Item") ' これで「string List(int32).get_Item(int32)」

例えばメソッドジェネリクスがついているとしたらこんな感じ

Dim list = GetType(List)
Dim list_add = list.GetMethod("get_Item") ' この時点で「T List.get_Item(int32)」
Dim list_str_add = list_add.MakeGenericMethod({GetType(String)}) ' これで「string List.get_Item(int32)」

list_addだけ見たらほぼ違いがないっていう
レシーバがIsGenericTypeなら型のジェネリクス解決して
list_addがIsGenericTypeなら関数のジェネリクス解決する感じ?

とりあえずList型だけ動かしたかったのでレシーバ決め打ちで解決をしたけど、型と関数が両方ジェネリクスだとどーしたらよかんべか

var xs = List(Int)()
List.Add(xs, 10)
var a0 = List.get_Item(xs, 0) # ←例えばApplyじゃなくてこの第一引数を使う?

型と関数に別々のジェネリクスを設定したケースを用意して同時にApplyできるか考えよう
・・・そんな都合のいいクラスあったか?

.NETのメソッドが呼べた

.NETのメソッドが呼べるようになった
作っている言語にメソッドなんて概念をつけていないので「型.メソッド(引数)」の並びを「メソッド(型, 引数)」に変えて関数コールするようにした
幸いCILではどっちでも一緒だしね

f:id:zenu:20160518232334p:plain

ちょっと面倒なのが名前空間
「DateTime.Parse(a)」は「DateTime::Parse(a)」と「Parse(DateTime, a)」の2種類の解釈ができるから「DateTime」が型なのか名前空間なのか判定しなきゃいけない
でもメソッドなんてないので、便宜上↓みたいなイメージに展開している

namespace System
    struct DateTime
        var x = xxxxx

    namespace DateTime
        sub Parse(s : String) DateTime
            xxxxx

        sub ToString(self : DateTime, s : String) String
            xxxxx

これじゃDateTimeが型なのか名前空間なのか型付けしてみるまでわかんない・・・
自分のソース部分だけなら型と同名の名前空間なんかコンパイルエラーにしちゃえばいいけど.NETアセンブリ読み込みのところだけは、まぁできるようにしておく
おかげでシンタックスシュガーの変換が型のinfer中に行うはめになって、どんより

.NETのコンストラクタが呼べた

.NETのコンストラクタを呼べるようになった
値型でコンストラクタの引数無しはinitobjなの?
とりあえずnewobjしか対応してない、DateTimeを引数無しで作成することができへんけどまぁええわ
f:id:zenu:20160514120129p:plain

コンストラクタの解決はめんどくさかったのでこんな風にしておいた
デフォルト引数も可変長引数も当面無視する感じ

TypeInfo.GetConstructors.FindFirst(
    Function(ctor) ctor.GetParameters.And(
        Function(arg, i) root.LoadType(arg.ParameterType.GetTypeInfo) Is args(i)))

しかし、デフォルト引数ってCILでは呼び出し側がスタックにプッシュするんやな
呼び出された側かCILがあんじょうやってくれるもんやと思ってた・・・


gitのお勉強ついでにブランチを切ってnon-fast-forwardでマージした
前回はfast-forwardでマージしちゃってよくわかんなくなったので、今回はいい感じにコミットグラフが残った
まぁ別にmaster一本でも困らないんだけど、ヨカッタヨカッタ
f:id:zenu:20160514120436p:plain

.NETの関数が呼べた

.NETの関数が呼べるようになった
おかげでprint関数とかをハードコーディングしなくてもmscorlibをロードしておけば
System.Console.WriteLineを呼べる感じ

f:id:zenu:20160507053358p:plain

ただ、コンストラクタを呼べるように作ってないので呼べるのはまだクラス関数だけ!
メソッドは、、、そもそも今作っているコンパイラメソッド作る予定ないし
ジェネリクスの解決も.NETのやり方とだいぶ違う実装方法やからどーすんべかなー

新しいパーサのほうはびっくりするくらい問題なく動いている
shift/reduce conflictがでたけど、とりあえず無視や

リパッケージは悪くない

Androidアプリがリパッケージされてマルウェアしこまれてうんぬんという記事
www.atmarkit.co.jp


ぉぃぉぃ、リパッケージしやすいというのはユーザにとってメリットなんだよ〜
そりゃソース公開されているのがベストだけど、そうじゃなければデコンパイルしてカスタマイズするのなんて当たり前だろ
マルウェアしこまれたうんぬんはストアの問題、ソースからコンパイルできないライトユーザの問題、リパッケージが悪いわけじゃない
そんなわけわからん事のためにリパッケージ対策すすめるとか勘弁して欲しい

ストアがなんとかせい、ストアが