プログラマメモ2 - programmer no memo2

段ちがいで色変えたいときは、UITableViewCellの背景色を、willDisplayCellで変更 2010/03/28

iphoneです。UITableViewの行の色を段違いで変更したいなーと思って、cellForRowAtIndexPathの中でcellにたいして色をつけていたけどかわらず、悩んでました。
で、調べると、実装する箇所がちがっていて、実装する場所は、willDisplayCellのが正しいようです。





以下コード、そのまんまだけど....
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 0 || indexPath.row%2 == 0) {
UIColor *altCellColor = [UIColor colorWithWhite:0.7 alpha:0.1];
cell.backgroundColor = altCellColor;
}
}

xpathです。ノード名があれやこれやというふうにORで指定したい場合 - local-name()を使って 2010/03/28

XMLです。XPathです。
忘れないうちにメモしておこう。

ノード名があれやこれやというふうにORで指定したい場合

下記のような感じで書けます。

//Word/*[local-name()='Furigana' or local-name()='Roman']

便利です。ちょっと使ってみました。Yahoo API テキスト解析 - ルビ振り 2010/03/27

Yahoo APIいろいろ充実していますね。

ちょっといろいろフリガナにしたい文字列があって途方にくれていたのですが、Yahoo APIのテキスト解析はすばらしいです!!
人手でやるとかなり面倒だけど、コンピュータでやれるとあっという間でした。



形態素解析とか、その辺のノウハウがあれば、自前で辞書とか用意してやれるのかもしれないけど、API便利だなー。

それで、全く参考になりませんが、Javaです。
XPath使ってます。

package a;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class TestHUriganaHenkan {

public static void main(String[] args) throws IOException,
InterruptedException, SAXException, ParserConfigurationException,
XPathExpressionException {
a();
}

static String MAKE_URL(String sentence) throws UnsupportedEncodingException {
final String APP_ID = "<あなたのAPP_ID>";
final String SENTENCE = URLEncoder.encode(sentence, "utf-8");
final String GRADE = "1";
final String URL = String
.format(
"http://jlp.yahooapis.jp/FuriganaService/V1/furigana?appid=%s&grade=%s&sentence=%s",
APP_ID, GRADE, SENTENCE);
return URL;
}

static void a() throws IOException, InterruptedException, SAXException,
ParserConfigurationException, XPathExpressionException {
String s = "変換したい文字";
String surl = MAKE_URL(s);
byte[] result = get_html(surl);
String sresult = new String(result, "utf-8");
ByteArrayInputStream input = new ByteArrayInputStream(sresult
.getBytes("utf-8"));
Document document = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().parse(input);
aa(document);

}

static void aa(Document doc) throws XPathExpressionException {
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("//Word/Furigana");

// Object result = expr.evaluate(doc, XPathConstants.STRING);
NodeList nodeList = (NodeList) expr.evaluate(doc,
XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
System.out.print(node.getTextContent() + " ");

}
// System.out.println(result.getNodeValue());

}

public static byte[] get_html(String surl) throws MalformedURLException,
IOException {
URLConnection connection = new URL(surl).openConnection();
connection.connect();
BufferedInputStream in = new BufferedInputStream(
(InputStream) connection.getInputStream());
return get(in);
}

public static byte[] get(InputStream in) throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
int len = 0;
byte[] bs = new byte[8192];
while ((len = in.read(bs)) != -1) {
outputStream.write(bs, 0, len);
outputStream.flush();
}
outputStream.close();
} finally {
in.close();
}
return outputStream.toByteArray();
}

}

IB(Interface Builder)を使うべきか使わざるべきかそれが問題というわけではないけども。 2010/03/26

現時点、IB(Interface Builder)を使うほうが大変だ、です。
一個ボタンを載せるだけでもコードをがしがし書かないといけないけど、慣れるとたいしたことないと思うし。
でも、サンプルアプリとか作るとか、入力ボックスが多いとかボタンが多いとかそういうものだと、RADっぽくがんがん部品を載せるにはいいかもしれない。
ただ、画面遷移とか考えると、IB使わないほうがまだ理解しやすいな(今のところ)。

IBを使わないということはXIBを使わないというわけで、まず、XIBをプロジェクトからとりのぞく作業から開始するわけです。

手順は、xcode上で、windowベースのプロジェクトを作成し、迷わずxibを消して、plisから設定を削除し、main関数の中で、UIApplicationMainの第4引数で、xxxAppDelegateを指定して、didFinishLaunchingWithOptionsで、自前のwindowを設定して表示って感じ。

まずはUIKit使って、リスト表示させてそこから次の画面いってMapKitを使うもの手慣らしに挑戦してみようか。その1 2010/03/22

ひさびさiPhoneアプリに挑戦。
が、なんとなくつくりたいものはあるけど、どこからアプローチしていいものか悩む。
とりあえず、iPhone Dev Centerでもながめて、考えようと思う。


フレームワークのリストがあったので掲載。
書籍とかでよく紹介されているはUIKitだと思うけど、手で数えて26もあるぞ...
少ないのか多いのかいまいちわからないけど。


AddressBook.framework
AddressBookUI.framework
AudioToolbox.framework
AudioUnit.framework
AVFoundation.framework
CFNetwork.framework
CoreAudio.framework
CoreData.framework
CoreFoundation.framework
CoreGraphics.framework
CoreLocation.framework
ExternalAccessory.framework
GameKit.framework
Foundation.framework
IOKit.framework
MapKit.framework
MediaPlayer.framework
MessageUI.framework
MobileCoreServices.framework
OpenAL.framework
OpenGLES.framework
QuartzCore.framework
Security.framework
StoreKit.framework
SystemConfiguration.framework
UIKit.framework


まずはUIKit使って、リスト表示させてそこから次の画面いってMapKitを使うもの手慣らしに挑戦してみようか。

とはいいつつも、また、挫折して他のことしだすんだよねー
Orz...

[delphi]デバッグ文出力メモ帳(ノートパッド)経由 2010/03/21

環境は、Delphi2010

下記の説明をみつけて、試してみました。


別アプリケーション経由で出力できるんですね。
送りつけたい画面のウィンドウハンドルをみつけて、EM_REPLACESELというメッセージを送りつけるという感じですかね。

unit Unit2;

interface

uses Windows, Messages, SysUtils;

(*
外部に公開するときはinterfaceにまず定義を書くことを忘れずに!!!!
*)
procedure DebugPrintNotepad(S: string);

implementation

var
hwndNotepadEdit: HWND;

(*
参考:オリジナルはここ
http://delfusa.main.jp/delfusafloor/technic/technic/085_DebugOutput.html
*)
procedure DebugPrintNotepad(S: string);
var
hwndNotepad: HWND;
sTIME: String;
begin
if not isWindow(hwndNotepadEdit) then
begin
hwndNotepad := FindWindow('Notepad', '無題 - メモ帳');
hwndNotepadEdit := FindWindowEx(hwndNotepad, 0, 'Edit', nil);
end;
if not isWindow(hwndNotepadEdit) then
exit;

sTIME := FormatDateTime('yyyy-mm-dd hh:nn:ss', NOW);
S := Format('%s %s', [sTIME, S]);
SendMessage(hwndNotepadEdit, EM_REPLACESEL, 0, LPARAM(PChar(S + #13#10)));
end;

end.

[delphi]DLL どうやってデバッグするのさ ツールーバー開発とか。 2010/03/20

DLLのデバッグの仕方がわからなかったので、ファイルに出力して調べる。

フォームの開発とかでは、IDEのデバッガー使えばいいのはわかるんだけど、エクスプローラーに組み込むためのDLLつくってるときってどう動きを確認していいのかわからなくて安直にファイル出力して確認することに。

調べればいい方法はあるだうなー
とりあえず。

ファイルが削除できないとか、書けないという問題には下のコードでは対処できてない。。。

unit DebugLog;

interface

procedure MyLog(S: String);

implementation

uses
SysUtils;

var
INIT: Boolean;

procedure MyLog(S: String);
var
F: TextFile;
fileHandle: Integer;
sLOG: String;
sTIME: String;
begin
// ファイル決めうち
sLOG := 'c:\tmp\debug.log';

// これでいいのかな...
if not INIT then
begin
// ファイルを削除
DeleteFile(sLOG);
INIT := true;
end;

sTIME := FormatDateTime('yyyy-mm-dd hh:nn:ss', NOW);
S := Format('%s %s', [sTIME, S]);
// ファイルがなければ作成
if not FileExists(sLOG) then
begin
fileHandle := FileCreate(sLOG);
FileClose(fileHandle);
end;
AssignFile(F, sLOG);
Append(F);
Writeln(F, S);
CloseFile(F);
end;

end.


2010-03-21
ついでに別の実装、try except finalyを入れてみた。

unit DebugLog;

interface

uses Dialogs;

procedure MyLog(S: String);

implementation

uses
SysUtils;

var
INIT: Boolean;

procedure MyLog(S: String);
var
F: TextFile;
fileHandle: Integer;
sLOG: String;
sTIME: String;
begin
// ファイル決めうち
sLOG := 'c:\tmp\debug.log';

// これでいいのかな...
try
try
if not INIT then
begin
// ファイルを削除
DeleteFile(sLOG);
end;

sTIME := FormatDateTime('yyyy-mm-dd hh:nn:ss', NOW);
S := Format('%s %s', [sTIME, S]);
// ファイルがなければ作成
if not FileExists(sLOG) then
begin
fileHandle := FileCreate(sLOG);
FileClose(fileHandle);
end;
AssignFile(F, sLOG);
Append(F);
Writeln(F, S);
CloseFile(F);
except
on e: Exception do begin
ShowMessage( '[Err] ' + e.Message );
end;
end;
finally
INIT := true;
end;

end;

end.

[delphi]Delphi2010をインストールして、まっさきにしておきたいことはデフォルトプロジェクトのフォルダ位置を変更すること 2010/03/20

Delphiインストールしてすぐにしておきたいことは、デフォルトプロジェクトの位置をかえることです。
僕の場合は、ネットワークドライブにdelphi以外のプロジェクトも集めているので、毎回、変えるの面倒だった。

[ツール]-[オプション]-環境オプション-デフォルトプロジェクト

で変更できます。

[delphi] VarUtilsのVariantInitは、TVarDataを引数にとります。 2010/03/19

Delphiです。Delphi2010を使ってます。

ちょっと踏み込んでDelphiでWin32なプログラムを作成しようとすると勝手がよくわかりません。。。
さて、

VARIANT vEmpty;

::VariantInit(&vEmpty);
というコードをみてdelphiでどうやるんだろうと思って調べました。


調べたら、

vEmpty: OleVariant;

VariantInit(vEmpty);
かなーって感じでしたが、これだとコンパイル時にエラーがでます。


vEmpty: TVarData;

VariantInit(vEmpty);
ってするみたいです。

もしくは、

vEmpty: OleVariant;

VariantInit(TVarData(vEmpty));
って感じ

OleVariantを引数にとるAPIに渡すときは、逆に変換してあげないといけないのかな。

OleVariant(vEmpty)


よくわかってないけど....
あやういな

[delphi]フォームにドラッグアンドドロップ 2010/03/14

Delphiです。Delphi2010を使ってます。

フォームにファイル(フォルダ)をドラッグアンドドロップ(drag and drop)可能にするためのコードです。

まず、DragAcceptFilesでウィンドウのハンドルを指定します。
するとドロップされたよというウィンドウメッセージが届きます。
そのメッセージをもとにDragQueryFileして、
いくつファイルがドロップされたのかとか、ファイル名がわかります。
そして、最後にDragFinishします。

ドラッグ&ドロップでファイル名を受け取る - Delphi Tips! - ファイル


コード

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, shellapi;

type
TForm1 = class(TForm)
procedure dropCode(Sender: TObject);
private
{ Private 宣言 }
procedure DropFiles(var msg: TWMDropFiles); message WM_DROPFILES;

public
{ Public 宣言 }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.dropCode(Sender: TObject);
begin
OutputDebugStringW('*** impli drop code');
DragAcceptFiles(Form1.Handle, True);
end;

procedure TForm1.DropFiles(var msg: TWMDropFiles);
var
FileName: array [0 .. 255] of Char;
total, i: Integer;
begin
total := DragQueryFile(msg.Drop, Cardinal(-1), nil, 0);
OutputDebugStringW(PwideChar(Format('*** total:%d', [total])));
for i := 0 to total - 1 do
begin
DragQueryFile(msg.Drop, i, FileName, SizeOf(FileName));
OutputDebugStringW(FileName);
end;
// ハンドルを解放
DragFinish(msg.Drop);
end;

end.

[delphi]Writeln 2010/03/14

Delphiです。
Delphi2010を使ってます。

JavaだとEclipseでの開発は5〜6年ぐらいしてます。
すぐに言語上の疑問があったり、APIの動作を知りたい場合に,main書いて動かして標準出力で確認してます。
プログラムを動かしての確認がIDE上で完結するのがうれしいです。

delphiで同じことしようとするとコンソールアプリのプロジェクトを用意してexeをビルドしてコマンドプロンプトで確認ってことをしてます。もっと完結(簡潔)にできないかしらと思ってます。

ここから本題。

Writelnを使って出力するわけですが、この関数は、複数の引数をうけとることができます。

write や writeln の使い方がよくわからない - Delphi エラーのやっつけ方

へぇーと思ったしだい。これって、文字列の連結を書かなくてもいいんだ。

コード

program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;

begin
try
Writeln('*** check ',' a ',' b ', ' c ');
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

ちなみに出力のフォーマットは、Format関数を使うみたい。

参考

純粋であること。副作用がないこと。 2010/03/06

関数型言語についての本を開くと、「関数が純粋である」とかでてくるし、あと「副作用がない」というのもでてくる。
で、正直、よくわかってないのだが、素直に同じ引数を渡せば、同じ結果が得られるというふうに理解した。

だけど、これが自分がプログラムを書くうえでどうメリットになるのか、これからぽちぽちと勉強していこと思う。

スバラしいとか、すごいとかいわれても実感としてまだ体感?できてないんだよね。

経験として、バグとりではまるとき、あるメソッドなりクラスが、裏で環境変数をSystem.getenvとかしてたりしていて、動きがわからないということがあるけど、《みえないところで何かしている》ということをなくせば、普段つかってるJavaとかでもスジがよくなるかな。

正直、Javaのキーワードのfinalについてわかってない。《変数を上書きできない》ということのメリットをJVMを実装する上での要求と考えていたのだけど、Haskell,とかErlang、一度変数を定義すると上書きできないことが言語のデフォルトなのをみると、それだけではないのかな。