21/06/15 16:11
iOS プログラミングで、UITableViewのセルを頻繁に更新したいときに、reloadDataを使うと罠にはまる。 というのも、古いセルに割り当てられたメモリが解放されず、どんどんメモリ使用量がたまっていく。 これはUIView関係のautoreleaseのタイミングのせいで、仕方ない。 UITableView reloadData many times cause memory leak and slow down applicationhttp://stackoverflow.com/questions/4029603/uitableview-reloaddata-many-times-cause-memory-leak-and-slow-down-application この現象。 ここでの答えは、 reloadRowsAtIndexPaths:withRowAnimation: を使え、ということだったが、確かにメモリ量はふえないが、例えばセンサデータのような高速に切り替わるデータを扱うときは、更新してる様子は見れたもんじゃない。 正しいやり方は、reloadDataを使わず、セルの中の一部だけ(この場合はセンサデータを表示するUILabelだけ)更新してやる。ここ が参考になる。 //for cell updating - (void )updateCell:( UITableViewCell *)cell atIndexPath:( NSIndexPath *)indexPath { // セルの中身をアップデートの例。この場合は4のTagでとってこれるUILabelの値を変更できる 。 ((UILabel *)[cell viewWithTag : 4 ]). text =[[ dataArray objectAtIndex :indexPath. row ] value ]; } - ( void )updateVisibleCells { for ( UITableViewCell *cell in [ tableView visibleCells ]){ [ self updateCell :cell atIndexPath :[ tableView indexPathForCell :cell]]; } } こういうメソッドを用意してやって、updateVisibleCellsを呼べば、見えてる場所のセルの中身だけ更新されるし、 きちんと一つだけの更新したい場合は、updateCellだけ呼べばOK。16/04/15 20:08
昔ニコニコ生放送のコメントを取得してごにょごにょするプログラムをJavaで書いてた時は、NicoAPIWrapperというのを使わせてもらってたのですが、久しぶりに昔書いたプログラムを使おうと思っても、ニコニコ生放送のログイン仕様などが変わったせいか、動きませんでした。 なんかないかなぁ、と探してみたのですがそのまま動くものがありませんでした。残念。 ブラウザのコンソールでニコ生側とブラウザとのやりとりを眺めてみると、どうやらログイン時のパラメータの渡し方などが違うようです。 これだけだったら簡単に直せそうなので、やってみましょう。 元のコードとして、今回は、 ニコ★リブというプロジェクトの中の、Nico-Lib-Java-Hal というのを使ってみることにしました。(Nico-Lib-Java-Talisker@ZQNというのでも、改良すればいけました) ここからNico-Lib-Java-Halをダウンロード: http://sourceforge.jp/projects/nicolib/scm/svn/tree/head/Java/ 変更するのは、nicolib.api.Common.java だけで良さそうです。 loginメソッドの中のプログラムを、下記のように変えます。 // オリジナル //String param = String.format("mail=%s&password=%s &next_url =", mail,password); // takuro が直した String param = String.format( "mail_tel=%s&password=%s&next_url=" , mail , password ); /** * オリジナル * HttpURLConnection http = null; * try { * * http = Http.postConnection(LOGINPAGE_URL, param , null); String * cookies = http.getHeaderField("Set - Cookie"); String userSession = * NicoText.getUserSession(cookies); if(userSession != null){ * Http.setUserSession(userSession); return true; } **/ // ここから takuro がなおした HttpsURLConnection http = null ; try { http = (HttpsURLConnection) Http.postConnection( LOGINPAGE_URL , param , null ); String userSession = "" ; Map headers = http .getHeaderFields(); Iterator it = headers .keySet().iterator(); while ( it .hasNext()) { String key = (String) it .next(); System. out .println( key + ":" + headers .get( key )); if ( key != null && key .equals( "Set-Cookie" )) { userSession = headers .get( key ).toString(); } } userSession = NicoText.getUserSession( userSession ); System. out .println( " ユーザセッションをゲットなう " + userSession ); // ここまで takuro がなおした。あとはそのまま・・ たぶんこれで動くと思います。(私の環境では動きました) 28/01/15 08:24
いつのまにかOSXが提供するJar Bundlerがなくなってたので、YosemiteとかでJavaアプリを.app化する方法。 (1)起動可能なjarファイルの作成、と(2) AppMakerによるapp化 の2ステップで簡単にできます。 (1) 起動可能なjarファイルの作成 Eclipseプロジェクトから、Export -> JavaのRunnable JAR file を選択。 Launch configuration からメインプログラムを選択して、Export destinationを適当に決める。 Library handlingには、Package required libraries into generated JAR が僕の環境だと一番しっくりきました。 これで、必要なライブラリなどもexportするjarファイルに含まれます。あと、 app
化するときにアイコンに使いたいicnsファイルをネットから探しておきましょう。 (2) AppMaker による app 化 ここから AppMaker
をありがたくダウンロードさせていただく。 http://sourceforge.net/projects/jarappmaker/ あとは、 AppMaker
を起動して、 (1)
で作成した jar
ファイルと、アイコンを指定して、起動に必要なJavaのバージョンを指定して、Startボタンを押せば、できます。 簡単!! 25/11/14 09:27
過去のデモが Processing1.0 系でQTJavaで動いてるので、それをそのままYosemiteで動かしたい場合のメモ。 http://www.compadre.org/osp/bulletinboard/TDetails.cfm?FID=57&TID=3331&ViewType=2 ここを参考に、まずQTJava.zip と libQTJNative.jnilib をどこからかゲットしてきて、 /System/Library/Java/Extensionsここに置く。 そのあと、Tracker をダウンロードしてきて、入れる。 http://www.cabrillo.edu/~dbrown/tracker/installers/Tracker-4.87-osx-installer.zip あとは動きます。 32bitモードでJavaプログラム起動しないと動かないかも? 実行時のVMオプションに -d32