2009年2月28日土曜日

BeagleBoard欲しいな

uGReaderでZEROさん提案の2行表示に対応したのですが、どうも出来が悪くて、そのまま公開するか、もっと手を入れるか考えてしまってます。
それよりも、仕事の方が忙しくって土日返上です、とほほ。システムの検証に使う機材が1週間しか借りられなくって、土日も出てね!って言われてしまいました

話は変わりますが、日経 Linux03月号の特集が"NetbookでLinuxを楽しむ"だったので買ってきました。Netbookにlinuxを入れるのは面白そうですが、せっかくXPが入ってるんだからLinuxにして不自由する事もないかなって気もします(とか言いつつ、NB100にLinuxいれてリカバリ領域を吹っ飛ばしてXPに戻れなくしてしまいましたが...とほほほほ)

それより気になったのが特集3"超小型Linuxマシンを自作する"です。
BeagleBoardってarmコアをつんだ基板にUbuntuをインストールする記事と、Androidをインストールする記事。
BeagleBoardはARM Cortex-A8コア搭載のOMAP3530/500MHz SDRAM128MB搭載だそうです。Digi-keyで15000円位?
欲しいなぁ
でもメモリ128MBじゃFireFoxとかまともには動かないかなって気がします。512MBくらい積んどきゃ良いのにね

2009年2月22日日曜日

文字列の描画

最近自転車通勤になって通勤中にfeedチェックする時間がなくなり、uGReaderで未読がたまる状態になってます。未読がたまると、記事のタイトル一覧をざーーーーっとながめて、すべて既読にする事が多くなりました。adesで記事のタイトル表示は1行分なので、タイトルの内容が殆ど表示されない場合が結構あります。
そこで、表示行数を変えられるようにしようと考えたのですが、実際の表示行数を取得する方法が分かりませんでした。
.netだとMeasureStringを使って、文字列の表示サイズを取得する事ができるようですが、mobile用のcompact frameworkは部分的にしかサポートされていなくて、文字列を折り返して表示した場合のサイズを取得できません。結構基本的なことだと思うのですが、どうすればよいのでしょう?

今のところ固定行数を設定することしかできなくてver1.17にこっそり設定を追加してます。2行くらいの表示で、たいていの記事は内容が分かるので、まぁいいかなとも思ってます。(1行で収まる場合にも空白が表示されるのが嫌ですが)

設定ファイル(uGReader.xml)にItemHeightタグ内を2とかに書き換えると行数が変わります。タグが無い場合は、"画像無し"等の設定を変えると、タグを追加した設定ファイルが作成されます

2009年2月17日火曜日

uGReader Ver1.17

これはβバージョンです

+mobile経由で開いた記事のフォントサイズを指定したサイズに無理やり変更するようにしてみました。
記事を全部ダウンロードした後に内部でブックマークレットを実行してフォントサイズを変更しています。ダウンロード中はフォントサイズは変わりませんし、確実にフォントサイズを変更できるのか?自信が無いのでβバージョンとしておきます。

その他、記事のリスト行数の変更処理を実験中で、リスト表示が多少変わっています

cabファイル

uGReader Ver1.16

メニューに"フォルダリストに戻る"を追加しました。記事リスト表示中に、メニュー操作でフォルダリストに戻ります

cabファイル

2009年2月14日土曜日

やっちまいました

HP Mini 1000用 カスタマイズUbuntu「MIE」インストーラ 提供開始
って記事を見て、ToshibaのネットブックNB100で試してみようと思ったんですよ

ほんと軽い気持ちで
記事もよく読まずに"usbフラッシュにlinuxがインストールされるんだ、フンフン♪ubuntuのライブCDみたいなもんかな"って感じで、英文の警告もろくに読まずにusbフラッシュにイメージを焼いて、NB100にブッ挿して起動したら。
あれよと思う間にHDDにインストールされてしまいました。

ししししまった~

リカバリしなきゃー、リカバリCDは、えっと...ディスクが同梱されて無いよ。はじめにリカバリディスクをお作りくださいって書いてあるし
しっからりとHDD内のリカバリ領域もぶっ飛んでるみたいです

リカバリディスクを手に入れなきゃと、サポートに電話したら、
まず最初に、「リカバリは純正の外付けDVDドライブでしかできません」とか言われました。「そんなわけないじゃん、これだからメーカーは!」って思いながら、リカバリディスクは入手できますか?って聞いたら、暫くまたされて「NB100ではリカバリディスクの販売はいたしておりません。本体をお預かりしてリカバリ致します」「修理扱いです」

ぉおお

ちなみにNB100は嫁の所有物です。嫁さんには「いいよ、修理すれば直るんでしょ」と言ってくれました。
「元気出して、そんなこともあるよ。でも私が同じような失敗をしたら、アホじゃバカじゃって言うでしょ。私は言わないから」みたいな事も言われました。それってアホじゃバカじゃって言われるのと変わらんと思う


せっかくなんで、修理前にWindows7のβ版を入れてみました


結構使えるんじゃない?って思いました

ligthboxのタイトル表示

ホームページで画像表示にLightBox2を使いましたが、タイトル表示にちょっと問題がありました。ちょこっと手を入れてみたので、メモっときます。

lightboxといえば、WILLCOMストアの2009春 新機種ラインアップページ画像表示が、そのまんまLightBoxで作られてました。lightboxではhtmlタグにtitle=""で指定した文字列を画像の下に表示します。同じグループ名をつけた写真ではNext,Prevボタンで連続して画像が表示できますが、このときタイトルがついた画像とついてない画像が混在していると、タイトルをつけなかった画像に直前に表示した画像のタイトルがそのまま適用されてしまいました(FireFox,safariで確認)
titleが空白は存在しない場合は表示を隠すように書き換えました

さらに、タイトル以外に補足説明を入れたかった(たとえばWILLCOMストアの画像にマウスを乗っけると "wx430k<br \>シンプルな中に上質な..."のようにポップアップが出るのが嫌だった)ので、ちょっと改造して、リンクタグに内包するテキストを表示するようにしてました。

改造部分
lightbox.js

Lightbox.prototype = {
...
Builder.node('span',{id:'caption'}),
Builder.node('span',{id:'comment'}),
Builder.node('span',{id:'numberDisplay'})
...


start: function(imageLink) {
if ((imageLink.rel == 'lightbox')){
// if image is NOT part of a set, add single image to imageArray
this.imageArray.push([imageLink.href, imageLink.title , imageLink.textContent
]);
} else {
// if image is part of a set..
this.imageArray =
$$(imageLink.tagName + '[href][rel="' + imageLink.rel + '"]').
collect(function(anchor){ return [anchor.href, anchor.title , anchor.textContent ]; }).
uniq();
...

updateDetails: function() {

// if caption is not null
if (this.imageArray[this.activeImage][1] !=undefined & this.imageArray[this.activeImage][1] != ""){
this.caption.update(this.imageArray[this.activeImage][1]).show();
}
else
{
this.caption.update(this.imageArray[this.activeImage][1]).hide();
}
if (this.imageArray[this.activeImage][2] !=undefined & this.imageArray[this.activeImage][2] != ""){
this.comment.update("<p>" + this.imageArray[this.activeImage][2] +"</p>").show();
}
else
{
this.comment.update("<p>" + this.imageArray[this.activeImage][2] +"</p>").hide();
}




ただし、IEだとcomment部分が表示できませんでした。もう少しやり方を考えたほうがよさそうです

2009年2月11日水曜日

DWM

デザイン ウェーブ マガジンが廃刊となるそうです。といってもハード系のエンジニアしか知らないか?

DWMは3月号と4月号の合併号です。DWMは、これで廃刊になって、季刊のデジタル・デザイン・テクノロジになるそうです。2009年4月10日発売で、FPGA基板が付くそうです。今度は何でしょう?楽しみですね。
FPGAの部屋

たまに(付録つきの月)しか買ってなかったけど、ちょっと残念です。でも、そんな予感もしてました、Interface紙やトランジスタ技術紙と微妙にテーマがかぶったりするときがあったりしてましたし。

創刊当時(月刊誌になる前)から毎号買ってましたが、先日古い号は殆ど処分しました。もったいなと思ったけど、技術系の雑誌は古くなると価値が低くなってしまのですね。(基礎的な内容は古くても役に立つのだけど、毎年春はフレッシャーズ特集で繰り返し記事になる)

2009年2月10日火曜日

uGReader Ver1.15

だいぶ時間があいてしまいましたが、要望にもらった
+MobileのUrlエスケープ処理をやりました。

WindowsMobileではHttpUtility.UrlEncodeが使えないので代わりにUri.EscapeDataStringを使いました。(参考HttpUtility を使わないURLエンコード
Uri.EscapeUriStringでは:,/,?などがエスケープされないっぽくてちょっとはまりましたが、EscapeDataStringを使うと全部エスケープしてくれました。

今回は修正後のテストをあんまりしてないけど、その他は書き換えてないので大丈夫だと思いますが、どうでしょう。
とりあえずWIRED VISIONはゲートウェイ経由で見ることが出来ました

cabファイル


翻訳するオプションをOnにしているとGoogleTranslaterが間に入ってしまうので、翻訳ページのエラーが表示されるみたいです

macでファイルのアップロードができないの続き2

macで画像ファイルのアップロードが頻繁に失敗する問題について引き続き作業したので、メモしときます。
昨日までにmacのsafari上でHTTP1.1のKeep-aliveな通信を行ってサイズの大きなファイルをアップロードすると、高い確率で失敗するらしいということがわかりました。
家はロリポップのサーバを使っているので、apacheの設定が変えられないのでサファリを使っての解決策が思いつきませんでした。
そこでsafariを使わないで画像をアップロードする方法をとることにしました。
使ったのはapplescript+curlです。
applescriptからシェルのコマンドを呼び出せるので、unixのcurlコマンドを使ってファイルの転送を行います。送られたフォームデータをサーバ側でPHPで使って記事の登録をします。

参考にしたのは
ドラッグ&ドロップでFC2ブログに複数の画像をまとめてアップロードするAppleScriptです。というか、ほとんどコピーです。
applescriptも初めてで、殆ど理解してませんが、手探りでなんとかなりました。
スクリプトをアプリとして保存して、画像ファイルをドラッグ&ドロップすると、投稿先を選択するダイアログが出て、ドラッグした画像を適当に縮小してサーバに送信します

ほんとうは画像のタイトルも入れられるようにしたかったのですが、日本語が化けるので止めました。エンコードするとかなんかが必要なんだと思います

これでiPhotoからドラッグして画像の送信ができるようになりました。
「こういうことが出来るのがmacの良いとこだね」と嫁さんに言ったけど理解してもらえませんでした。





property msg1 : "管理画面のパスワードを入力" as Unicode text
property msg2 : "終了しました。" as Unicode text
property msg3 : "ログインに失敗しました。" as Unicode text

on open drop
activate me
--display dialog msg2 default button 1 buttons "Start"
----メインループ
repeat with theFile in drop
set theFile to theFile as string
set upFile to getBaseName(theFile)
--set drslt to display dialog "画像ファイル: " & upFile & " を送信します
--タイトル:" default answer "" buttons {"投稿", "キャンセル"} default button 2
--set btn to button returned of drslt
--
--if btn = "キャンセル" then
-- return 0
--end if
--set title to text returned of drslt
set title to ""

set caption to "画像ファイル: " & upFile & " を送信します
投稿先を選択して下さい"
set caption to "投稿先を選択して下さい"
set choices to {"混合技法", "水彩画", "日本画"}
set crslt to choose from list choices default items "水彩画" with prompt caption

if crslt = false then return 0
set crslt to contents of item 1 of crslt
if crslt = "混合技法" then
set category to "6"
else if crslt = "水彩画" then
set category to "7"
else if crslt = "日本画" then
set category to "8"
end if

set upFile to "/xxx/" & upFile
process_item(theFile, upFile)
tell application "Finder"
set fPath to POSIX path of theFile as Unicode text
set uploadScript to "curl -u " & myID & ":" & myPass & " -L " & myURL & " -F \"upload=@" & upFile & "\" -F category=" & category & " -F title=\"" & title & "\""
--set response to uploadScript
set response to do shell script uploadScript
----パスワードの入力フォームがレスポンスに含まれていた場合、ログイン失敗と判定(ちょっとこのへんが微妙…)
if response contains "401" then
beep
display dialog msg3 with icon 0 buttons "OK" default button 1
error number -128
end if
display dialog response buttons "OK" default button 1
end tell
end repeat
beep
--display dialog msg2 default button 1 buttons "OK"
end open

on process_item(this_item, newFile)
try
with timeout of 900 seconds
tell application "Image Events"
launch -- always use with Folder Actions
set this_image to open file this_item
scale this_image to size 1000
save this_image as JPEG in file newFile
close this_image
end tell
end timeout
on error error_message
tell application "Finder"
activate
display dialog error_message buttons {"Cancel"} default button 1 giving up after 120
end tell
end try
return newFile
end process_item

on getBaseName(itemName)
set org_delimi to text item delimiters of AppleScript -- オリジナルの区切り文字をとっておく

set text item delimiters of AppleScript to ":" -- "、"で区切る
set num to count text item of itemName
set newName to text item num of itemName as string
set text item delimiters of AppleScript to org_delimi -- 操作終了後にオリジナルの区切り文字に戻す

return newName
end getBaseName

2009年2月8日日曜日

macでファイルのアップロードができないの続き

ここまで作業をして、リサイズした画像をアップロードしてみましたが結構な割合でアップロードできない事がありました。PHPでファイルを受信したらメッセージを出力するようにして何度もテストすると、メッセージが出ないことがありました。(つまりファイルの受信が完了していないという事でPHPのプログラム側の問題ではない)
調べてると、こんな記述を発見

Safariからのファイルアップロードに失敗する時の対処法(Apacheの設定)

Safariからのファイルアップロードする先のサーバで、ApacheのKeepAliveをOffにすると、このトラブルが発生しなくなります。

Apacheのhttpd.confの適切な場所に、下記の一行を追加して、Apacheの再起動を行ってください。(setenvif_moduleが有効になっている前提でです)

BrowserMatch "Safari" nokeepalive



たぶん、あたりだと思います
だけどロリポップのサーバではApachiの設定までは変えられないのでどうしようもないです
これが事実だとするとsafariは使えないですね。こんな問題をappleが放置しておくとはちょっと考えられないですけど

macでファイルのアップロードができない

忘れないうちに書いときます

macで画像ファイルをアップロードできなかった原因を調べてみると、2種類あるようでした。
ひとつはアップロードは完了しているけど画像ファイルにエラーがあってPHPがエラーとなってしまう事が原因。
二つ目はアップロードが完了しないことがある
ということでした。最初の画像ファイルのエラーはiphotoで編集したファイルは、ファイルサイズが2倍くらいになっていて、受信したデータをPHPのImageCreateFromJPEG()関数でImageが生成できてませんでした。
これはjpegファイルをmac上でリサイズして再生すると解決できました。
リサイズは自動化したいので、
ImageMagickのconvertコマンドを使うことにして
ImageMagick (RMagick)をMacにインストールを参考に、ImageMagicをインストールしました。

まずXCodeをOSのインストールCD2枚目を使ってインストール
sudo port install jpeg
sudo port install libpng
sudo port install libwmf
sudo port install tiff
sudo port install lcms
sudo port install freetype
sudo port install ghostscript

で必要なライブラリ等をインストール。途中でlibwmfのインストールがエラーで終わってしまったけど、wmfは関係ないから無視して続行しました。(いいのかな?)

imagemaigickもportでインストールできました
sudo port install imagemaigick

インストールの作業はmakeに結構時間がかかったので(数十分だったと思う)別のアプローチを探して見ました

AppleScriptを使う方法
AppleScriptを使うと、特定のフォルダに対しての操作をトリガとして、スクリプトを実行することができるらしい。サンプルで用意されたスクリプトの中にフォルダに画像ファイルを入れると自動的に回転させるというのがあったので、これを改造してサイズを変更するように新しいスクリプトを作りました

中身はまったく理解してないですが、回転させているところを
scale this_image to size 1000
に書き換えて同じフォルダに保存しました


(*

Image - Resize 1000

*)


property done_foldername : "Resized Images"

-- the list of file types which will be processed

-- eg: {"PICT", "JPEG", "TIFF", "GIFf"}

property type_list : {"JPEG", "TIFF", "PNGf"}

-- since file types are optional in Mac OS X,

-- check the name extension if there is no file type

-- NOTE: do not use periods (.) with the items in the name extensions list

-- eg: {"txt", "text", "jpg", "jpeg"}, NOT: {".txt", ".text", ".jpg", ".jpeg"}

property extension_list : {"jpg", "jpeg", "tif", "tiff", "png"}



on adding folder items to this_folder after receiving these_items

-- CHECK FOR THE DESTINATION FOLDER WITHIN THE ATTACHED FOLDER

-- IF IT DOESN'T EXIST, THEN CREATE IT

tell application "Finder"

if not (exists folder done_foldername of this_folder) then

make new folder at this_folder with properties {name:done_foldername}

set current view of container window of this_folder to list view

end if

set the target_folder to folder done_foldername of this_folder

end tell

-- PROCESS EACH OF THE ITEMS ADDED TO THE ATTACHED FOLDER

try

repeat with i from 1 to number of items in these_items

set this_item to item i of these_items

set the item_info to the info for this_item

-- CHECK TO SEE IF THE ITEM IS AN IMAGE FILE OF THE ACCEPTED FILE TYPE

if (alias of the item_info is false and the file type of the item_info is in the type_list) or (the name extension of the item_info is in the extension_list) then

tell application "Finder"

-- LOOK FOR EXISTING MATCHING ITEMS IN THE DESTINATION FOLDER

-- IF THERE ARE MATCHES, THEN RENAME THE CONFLICTING FILES INCREMENTALLY

my resolve_conflicts(this_item, target_folder)

-- MOVE THE ITEM TO THE DESTINATION FOLDER

set the target_file to (move this_item to the target_folder with replacing) as alias

end tell

-- PROCESS THE ITEM

process_item(target_file)

end if

end repeat

on error error_message number error_number

if the error_number is not -128 then

tell application "Finder"

activate

display dialog error_message buttons {"Cancel"} default button 1 giving up after 120

end tell

end if

end try

end adding folder items to


on resolve_conflicts(this_item, target_folder)

tell application "Finder"

set the file_name to the name of this_item

if (exists document file file_name of target_folder) then

set file_extension to the name extension of this_item

if the file_extension is "" then

set the trimmed_name to the file_name

else

set the trimmed_name to text 1 thru -((length of file_extension) + 2) of the file_name

end if

set the name_increment to 1

repeat

set the new_name to (the trimmed_name & "." & (name_increment as string) & "." & file_extension) as string

if not (exists document file new_name of the target_folder) then

-- rename to conflicting file

set the name of document file file_name of the target_folder to the new_name

exit repeat

else

set the name_increment to the name_increment + 1

end if

end repeat

end if

end tell

end resolve_conflicts


-- this sub-routine processes files

on process_item(this_item)

-- NOTE that the variable this_item is a file reference in alias format

-- FILE PROCESSING STATEMENTS GOES HERE

try

-- convert alias reference to string

set this_item to this_item as string

with timeout of 900 seconds

tell application "Image Events"

launch -- always use with Folder Actions

set this_image to open file this_item

scale this_image to size 1000

save this_image with icon

close this_image

end tell

end timeout

on error error_message

tell application "Finder"

activate

display dialog error_message buttons {"Cancel"} default button 1 giving up after 120

end tell

end try

end process_item

つづく...