2013年12月7日土曜日

TopCoderのSRMで自動的に翻訳してくれるプラグインを作成しました。(非公式KawigiEdit拡張)


TopCoderのSRMの問題を翻訳してくれるプラグインを作成しました。
(正確に言うと、KawigiEditプラグインの機能追加です。)

今まで、わざわざ翻訳サイトに投げていた人に便利になると思います!!


Arenaで問題 を開くとすぐに翻訳してくれます。




特徴

  • (独自)問題を開いた瞬間に翻訳し、ウェブブラウザで表示します。(見やすい)
  • (独自)MICROSOFT TRANSLATORを使っています。 (ある程度まで無料なので)
  • (独自)ページをキャッシュするので、過去に表示していたら素早く表示します。
  • KawigiEdit 2.4を元に改造を行っているため、Java/C++/C#/VB/Python すべての言語に対応しております。
  • プラグインの導入が簡単
  • (独自)答えがあっているとき、Desired answerとYour answerを表示しない(自分が欲しかったので)


Downloadはこちらから
https://docs.google.com/file/d/0B-5M9QAsSoVbUXRYV25FbU5yZjg/edit?pli=1


設定方法

Name:  KawigiEdit-yuki
EntryPoint: kawigi.KawigiEdit
ClassPath: ダウンロードしたjarファイルのパス



その他の設定方法はKawigiEditと一緒なので、こちらのブログが詳しいです。

TopCoder: Setting up KawigiEdit
http://mogproject.blogspot.jp/2013/09/setting-up-kawigiedit.html



免責事項


  • 非公式なので諸事情で突然公開停止になる可能性がございます。
  • 翻訳精度に関しましては、翻訳サイト様にお願いして下さい。
  • このプラグインを入れても、直訳のため問題が分かることは保証できません。
    (現に、自分は英語のまま読んでます。。)

改造元
KawigiEdit-pfa 2.4.0 (unofficial)
https://apps.topcoder.com/forums/?module=Thread&threadID=794920&start=0&mc=1#1759241

2013年11月6日水曜日

[Android]Calendarクラスのバグ?

注)比較的難易度高めの記事です。
Android APIのバグの可能性もあるので、もしそうでしたら、報告する場所教えてください><
(何か賞金とかもらえるなら折半で!)

Calendar使う場合、こういうことをする時があります。

DAY_OF_WEEK  
はcalendar オブジェクトが何曜日かというのを指定します。

WEEK_OF_YEAR
は calendar オブジェクトが一年の何週目(最大52週)というのを指定します。

この2つで、特定の日付を解決します。

(本当は YEAR (年)も設定する必要はありそうですが、なぜかAndroidでは必須ではない。)

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
calendar.set(Calendar.WEEK_OF_YEAR, 30);
Log.d("tag", calendar.get(Calendar.WEEK_OF_YEAR) + "");

一旦 オブジェクトが日曜日 というのを設定します。
さらにcalendar オブジェクトが一年の30週目というのを設定します。
つまり 2013年7月21日というのを設定しています。
なので、ここでは30が出力されます。
しかし、

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.WEEK_OF_YEAR, 30);
calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
Log.d("tag", calendar.get(Calendar.WEEK_OF_YEAR) + "");

と書いたら、なぜかWEEK_OF_YEARが反映されずに、
今週(2013年11月6日現在なら45)
が出力されてしまいます。

時間があったら、この問題を追ってみたいと思います。

ちなみに通常の Java(Java 7)ではこの問題は発生しないっぽいです。

参考:

Java API

http://docs.oracle.com/javase/jp/1.5.0/api/java/util/Calendar.html


Android API

http://developer.android.com/reference/java/util/Calendar.html

2013年8月22日木曜日

[MySQL]WordPressのセットアップではまったこと

WordPressのセットアップするときに、
MySQLにwordpressというユーザー名を作成し、パスワードを変更し、
そのユーザー名とパスワードを入力してもどうやってもMySQLに接続できなくてハマったのでメモ。

原因を調べて、もしかしたらというものを見つけたのでメモします。
(ただし再現性がないので、絶対というわけではないので。もし同じ症状の人がいたら、助けになるかもしれないかもしれない程度で。。)

phpMyAdminで表示したユーザー一覧はこちら


自分が設定したのは 
ユーザー名 wordpress ホスト % だったのですが、
デフォルトでユーザー すべて ホスト %  となっているものがあります。
ユーザー認証(WordPressのセットアップ)するときに、後者が優先されてしまってうまく設定できてなかったらしいのです。
なので、ユーザー すべて ホスト %を削除するとちゃんと設定出来ました。。
2,3時間ハマりました。。
ただし、再現性がないので本当は違う問題なのかも。。


2013年8月4日日曜日

[TopCoder]自分の解いた問題一覧を出してみました。

GitHubのMarkDownが面白そうだったので、せっかくなのでTopCoderの自分の解いた問題を一覧で表示するようにしてみました。

https://github.com/yuki2006/topcoder

ローカル側でREADME.mdを生成し、githubにあげたらいい感じに見えるようになってます。

今まで、どの過去問を解いたかなどの管理が一苦労だったので、これだけでも十分です。



こちらから一部ソースを拝借しました。
https://github.com/fornwall/eclipsecoder-archive

2013年8月2日金曜日

[TopCoder]SRM 587 Div2


Easy InsertZ

問題
http://community.topcoder.com/stat?c=problem_statement&pm=12700&rd=15699&rm=318350&cr=23018525

回答



Medium JumpFurther 

問題 




JumpFurther の方は、DP? DFS?とか結構悩んだけど、貪欲で行ってbadStepになってしまったら、最初の1stepを進まずにとどまるようにすれば、最大になります。

結構いい問題。

2013年7月27日土曜日

倍精度と整数の対応

Wikipedia「倍精度」
http://ja.wikipedia.org/wiki/%E5%80%8D%E7%B2%BE%E5%BA%A6


double型で 整数の対応可能(longに変換可能)なのは2の 53乗まで、

ただし、2のべき乗だけなら 63乗まで可能。

2013年7月26日金曜日

[Android]ActionBarSherlockからSupport Library v18 のActionBarへの移行

先日、新しいNexus7とともにAndroid 4.3 が発表されましたが、新しいOSとともに発表されるのが、Android SDKのバージョンアップ!

個人的にはこっちのほうが楽しみだったりします。


さて、今回 Android SDK付属の Android Support Libraryがv18 になり
なんと(やっと?)Action Bar UI に対応しました。
http://developer.android.com/tools/support-library/index.html

設定方法はこちらの「Adding libraries with resources」をどうぞ
http://developer.android.com/tools/support-library/setup.html


さて、わたしは今まで ActionBarSherlock というありがたいライブラリを使っておりましたが、
http://actionbarsherlock.com/

公式で対応したということで移行処理をしてみました。



単純なものは、移行は簡単なのですが、もうちょっとGoogleさんには少し頑張ってもらいたかったところ。

相変わらず onCreate時にsetThemeを設定しないといけないみたいだし。

(自分が知ったかぎりもの)
各対応するもの表にしました。

(軽い動作確認は行いましたが、コードの正確性は保証いたしませんのでご注意ください。)


2013年7月22日月曜日

[TopCoder]初心者にオススメ問題

今回も、自分用のまとめです。
気づいた時に更新します。


始めてTopCoderをする方用にオススメの練習問題。
(わかりやすい問題)



もちろんすべてDiv2、上な問題ほどわかりやすいはず。





2013年7月20日土曜日

[TopCoder]SRM 585 Div 2

ブログを書くネタもあまりないので、プログラミングつながりということで 自分のまとめも兼ねてTopCoderのソースコードも公開して行きたいと思います。
 #本当は、ちゃんとしたアーカイブしたいけど

 ちなみに、ソースコードはGitHubのURLを貼るだけです。
 #リクエストがあれば何かするかも

 TopCoder自体は2年くらい前からやってましたが、スコアは低いです。頑張ります。

 というわけで早速。


 SRM 585 Div 2

 Easy

 LISNumberDivTwo
http://community.topcoder.com/stat?c=problem_statement&pm=12446

 ソース:
 https://raw.github.com/yuki2006/topcoder/master/src/LISNumberDivTwo.java 


 Medium 

TrafficCongestionDivTwo
http://community.topcoder.com/stat?c=problem_statement&pm=12697

 ソース:
https://github.com/yuki2006/topcoder/blob/master/src/TrafficCongestionDivTwo.java



特に、TrafficCongestionDivTwo の方は、興味深かったので説明書きます。

本番で書いたコードはなんとなく見つけた法則でのメモ化再起なんですが
SRM終了後に
他の人のエレガントなアルゴリズムを考えていた時に、見つけたアルゴリズムです。
(System Testには通りましたが、理論的に説明できません。。)

しかも、「倍数の証明 ジェネレータ」
http://tma.main.jp/baisuu/

というさらに興味深いサービス見つけたので、更にはかどりました。


高さh+1の完全二分木のノード数 は 2^h -1 です。

ここで問題でいう1つのパスを 葉のノード →その上のノード →右下の葉のノード
を順番にやっていくと最小のパス集合数になるのではと思いました。
(理論的に証明できません。。


ここで、 hが偶数のとき, ノード数は3の倍数になることの証明はこちら

2^(2n)  -1 = 4^n  -1 が 3の倍数であることの証明
http://tma.main.jp/baisuu/baisuu.php?eq=4%5En-1&num=3


また hが奇数の時、ノード数は3で割ったら1余る証明はこちら (少し変形してます

2^(2n+1)  -1 -1 が  3の倍数であることの証明
http://tma.main.jp/baisuu/baisuu.php?eq=2%5E%282*n%2B1%29-2+&num=3


つまり、
hが偶数の時は、先ほどの長さ3のパスの組み合わせで構成可能
hが奇数の時は、長さ3のパスの組み合わせで構成すると根のノードだけ残る(あまり1)

つまり、
  (2^h -1)/3 の切り上げの値が 最小のパス集合の数と等しくなるではないかと思いました。

2^h-1 % 3のあまりの最大値は1なので

切り上げを表現するためにテクニカルな方法を用いて+2にしました
つまりreturn文はなんと一行で表現出来ました。

return ((long) Math.pow(2, treeHeight + 1) - 1 + 2) / 3;

ツッコミお待ちしております。




2013年7月10日水曜日

if -else を教えてる時に・・。

早速ですが、このコードの間違いを探してください。
(答えは本文で)





とある機会で、初歩からJavaプログラミングを教える機会があって、
前でプロジェクターで映しながら、こうやったらこうできますよみたいなハンズオンで説明してたんです。


文の最後には「セミコロンが要りますよ」とか基本的なことから教えて、

四則演算や%も教えました。


次に
if文を教えようと、奇数偶数を判定するようなコードを書いて、前に写して、
受講者の方に「こんなコード書いてみてください」と言って書いてもらったのですが、


そこ、受講者の方から
「奇数の時も偶数ですと出るのですが・・・」と質問されました。


そこで受講者の方が書いたのは、最初に載せたコードです。


私はパッと見た時に、すぐに気づきませんでした。。










わかりやすいようにフォーマッタをかけたのは下のコードです。






else のあとのセミコロンがあるために、elseの中身が空文として扱われてしまうんですね。

そして そのあとの{}が空ブロックとして扱われてif-elseと関係なく実行されてしまうんですね。


今まで長くプログラミングをして来ましたが、
こういうコードが書けるのというが新しい発見でした。
(使いドコロは無さそうですが)

やっぱり、プログラミングを教えたりすると、たまにこういう発見をするのが嬉しいですね。


豆知識として是非。




2013年2月9日土曜日

[Java][Android]Arrays.asListについて

Javaには
Arrays.asList()という配列をリストに変換するメソッドがあります。

仕様上の問題で、配列ではなくリストで渡さないといけないというのが
たまーにあるので重要という程でもないですが、知っていると便利なメソッドです。



こういうコードを書いてみました。

これを実行すると、asList.remove(0)で例外が発生します。



実は、Arrays.asList()で取得したリストは不変(addもremoveもできない)という仕様があります。
(ドキュメントにもちゃんと書いてあります)

たまに忘れます...


ではこのArrays.asList()で取得したリストとは何なのでしょうか。



少し調査してみました。(Java6を対象にしています)


Eclipse でasListの部分をクリックして 宣言を開く (F3) をしてみます。
ArraysクラスのasList の宣言が見れます。


そうするとあれ??
ArrayListに引数のものを入れて返してるだけじゃないですか。

つまりasList()で取得したものはArrayListということになり、可変(addもremove)も出来るはず。


しかしここに落とし穴があり。

 
さらにこのArrayListのところで F3を押して ArrayListの宣言を見てみます。





(一部分のみ)


気づきにくいですが、これは Arraysクラスの中の内部クラスとして宣言されているものなのです。

我々がよく使うArrayListとは別物なのです。

ちなみにadd メソッドは ここでは宣言されてなくて extends のAbstractListを辿って
add(E element)を辿り

add(int index, E element) 
の宣言部分

を見るとこのようになっております。
中身が例外だけ・・・・。(゚д゚)!

とりあえずこの仕組みによって例外が投げられているのですね。



ちなみに、通常のArrayListを調べると 同じくextends AbstractList されていますが、

きちんとオーバーライドでaddの中身が実装されています。


ちなみに
Arraysの中のArrayList(T[] array)という宣言は 通常のArrayListのコンストラクタにはありません。


なので配列の要素を全部渡すときは これがエレガントな方法です。


(2013/11/30 追加  yozaさんthx)




今回主にJavaに関してのことでしたが Androidアプリでも同様です
(そもそもきっかけはこちら)

ListViewの表示でよく使う ArrayAdapterで なぜかremove()をするとなぜか失敗していたので調べた結果たどり着いたのが

ArrayAdapterのコンストラクタのこの部分。
Arrays.asList()が使われてます。


つまりこれで作成されたArrayAdapterの内部で使われるリストは不変になってしまいます。

JavaDocの説明に これで渡すと不変であると書いてないじゃないですか。。。orz  
(テストしてなかったこちらも悪いですけど)

まとめ

Arrays.asList で取得したリストは不変です。
宣言の中身を見ると、同名のArrayListが使われてます。(ややこしい)

不変の理由は、addやremoveの中身が無い実装のAbstractListのため

AndroidのArrayAdapterのコンストラクタで配列を渡すと不変リストになってしまうので注意です。重要