Reminiscence

感情の残骸

Linux 64bit環境でAndroid SDKのビルドが失敗する話

正確にはaaptが存在するのに存在しませんと言われて実行できない話

原因は32bit版のC++のライブラリとzlibが存在しないためで入れれば解決する

UbuntuとかのDebian系統だとaptでlib32stdc++6とlib32z1を入れればいいらしい

ぼくはSlackwareを使っていたのでここから全ライブラリ入れてここからzlib入れたら動いた

React

React.js使ってこんな物作った

このコードだとそこまで目に見えてないが面倒なDOM操作をほとんど書いてないが(Reactの動作のためにベースノードを取得して渡してるのみ)動いてるの最高。

他のライブラリの使用経験がほとんど無いため比較はできないが余計な処理を書かず必要な部分に集中できるのよいと思った。
ぼくは頭が良くないのでコードを書いているとよくバグを仕込んでしまうが、Reactを使えばデータの処理にだけ注力し、データが更新されるたび全データをReactに送ればいい。ReactがViewの生成と更新を全て行ってくれる(差分更新なので効率がいいらしい)。

ReactはView層のみを提供していてフレームワークではないがフレームワークを比較対象に出せるくらい使いやすいのでこれからも使っていきたい。

近況です

暇すぎる

function btoa(bin){
  //Base64テーブル
  //英(大|小)文字&数字&記号二種(+/)
  var table = 'ABCDEFGHJIKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
  var res = ''
  while(bin.length !== 0){
    //24bitごとに区切る
    var chunk = bin.slice(0, 3)
    var bits = 0
    for(var i = 0; i < chunk.length; i += 1){
      bits += chunk.charCodeAt(i) << 16 - (8 * i)
    }
    //出力文字数は入力+1
    var outlen = chunk.length + 1
    //6bitごとに区切ってテーブルを元に符号化
    for(var i = 0; i < outlen; i += 1){
      res += table.charAt(bits >> 18 - (6 * i) & 63)
    }
    //パディング
    for(var i = 0; i < 4 - outlen; i += 1){
      res += '='
    }
    bin = bin.slice(3)
  }
  return res
};

function atob(asc){
  //パディングの除去
  asc = asc.replace(/=/g,'')
  var table = 'ABCDEFGHJIKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
  var res = ''
  while(asc.length !== 0){
    //24bitごとに区切る
    var chunk = asc.slice(0, 4)
    var bits = 0
    //テーブルを元に復号化
    for(var i = 0; i < chunk.length; i += 1){
      bits += table.indexOf(chunk.charAt(i)) << 18 - (6 * i)
    }
    //符号化の逆なので-1
    var outlen = chunk.length - 1
    //8bitごとに区切って元のデータに戻す
    for(var i = 0; i < outlen; i += 1){
      res += String.fromCharCode(bits >> 16 - (8 * i) & 255)
    }
    asc = asc.slice(4)
  }
  return res
};

console.log(btoa('nk0t'))
console.log(atob('bmswdA=='))
console.log('nk0t' === atob(btoa('nk0t')))

大体古いIEにatobとbtoaが無いのが悪いし古いIEを使わせられる環境が悪いし金かかるOSは仕方ないとは思うが(仕方なくはない)ブラウザくらい入れ替えろという話

Kotlinからtwitter4j-streamのStatusListener等をaddListenerすると死ぬ問題について

Kotlinにてtwitter4jを使用し以下のようなコードを書くとIllegalAccessExceptionを吐いて死にます

val stream = TwitterStreamFactory().getInstance()
stream.addListener(UserStreamAdapter())

先に解決策だけ書いておくとJavaでラッパー作ると解決します

 public static void addStatusListener(TwitterStream stream, StatusListener listener){  
     stream.addListener(listener);  
 }  

なぜこういうことが起きるのかと言うと、Kotlinのコンパイラが吐き出すコードをデコンパイルしてみるとわかりますが、継承クラスであっても基底の引数として求められるクラスに一々キャストして渡しています。

先ほどの問題のKotlinのコードをデコンパイルしたものがこちらになります

TwitterStream stream = new TwitterStreamFactory().getInstance();
stream.addListener((StreamListener)new UserStreamAdapter());

ここで問題なんですが、キャストに使用されるStreamListenerはpackage privateになっており外側からはアクセスできません。参考
そのためJavaだと問題なく動くはずの上記のコードはStreamListenerにアクセスできずに落ちてしまいます、解決策では該当の部分だけをJavaで書いてやってキャストを避けることによって問題を回避しています。

近況

Twitterやめてひたすらゲームしたりひたすら人の作ったプログラムのソースコード読んだりプログラム書いたりしてた。

読んでるほうはひたすらRubyソースコードやらCommon Lispソースコードやら眺めてただけだが少々コードを読む力がついただけで役に立ったとはあまり思えない。ただ普段使用している言語が内部でこういう動作してるのかといった具合で面白いので退屈はしなかった。

書くほうはRubyPythonを利用してヒープソートを実装してみたり前から興味があって入れたまま放置してたCommon Lispを利用してマージソートを書いてみたりしていた。

Lispのコードを読んではいたが書いたのは今回が初めてなので拙いとは思うが折角なので貼っておく。

リストのマージ自体はCommon Lisp側に組み込み関数があるので苦労はしなかったがLispの作法が分かってないのでリストを分割したりする部分に苦労した。

コードを書くのには苦労したがデバッグにはさほど苦労しておらず、個人的には言語として相当使いやすい部類だと感じた、括弧が多い部分が少々書きづらいがプログラミング用のエディタを使用すれば対応する括弧をハイライトしてくれるのでそこまで気にはならなかった。

長々と小難しい感想を書いたがプログラミングは最高ってわけだ、Lisp楽しい✌('ω')✌

後友達がいるわけでもないしかなり寂しいのでずっと話してくれる人がいるのは幸せなことなんだなって思った、おしまい。