2009年10月25日日曜日

iPhoneでキャプチャ禁止

iPhoneのSDK3.0からカメラ用APIが色々追加されたと聞きました。
いくら探してもキャプチャを取れなくするAPIは公開されていません。

カメラ付きケータイが禁止されている会社もあるのに、なぜ非公開なのでしょうか。疑問です。

ソースコードなどを書くとまずそうなので、方法だけ載せます。

まず前提として、iPhoneはシングルタスクで稼動する。ということがあります。

そして、非公開APIを含めて実現できること。
カメラロールに入っている画像の撮影時間を取得すること。
カメラロールに入っている画像を削除すること。

ということはつまり、
1)アプリ起動時の起動時間を保持しておく。

2)アプリ終了時に(起動時間≦撮影時間)の画像を全て削除する。

とすれば、アプリ起動中にキャプチャした画像は亡き者になります。

※OSアップデートによって実装できなくなる可能性もあります。

ちなみにOS3.1.2ではこの方法がうまくいくことが確認できました。

2009年10月14日水曜日

xfireでSOAP

最近仕事でjavaのSOAP通信にxfireというライブラリを使い、どつぼにハマった。
ドキュメント類も一切ないので、これから使う人のためにメモ。

xfireとは:
次世代のSOAPフレームワーク。各種標準をサポートしており、扱いやすいAPIを通じてSOA開発のアプローチを実現する。
※このフレームワークというのがポイント!


使い方
①SOAPサーバ側にxfire設定ファイル(services.xml)を、WEBアプリの以下のパスに配置されるようにする。
WEBルート/classes/META-INF/xfire/services.xml

services.xml
<bean>
<service>
<name>WebServiceName</name>
<serviceclass>com.oboegaki.servers.TestService</serviceclass>
<implementationclass>com.oboegaki.servers.Test</implementationclass>
</service>
</bean>

②SOAPサーバ用xfireライブラリをクラスパスに入れる。

③web.xmlにxfire定義を追加する。

web.xml
<web-app>
<servlet>
<servlet-name>XFireServlet</servlet-name>
<display-name>XFire Servlet</display-name>
<servlet-class>
org.codehaus.xfire.transport.http.XFireConfigurableServlet
</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/servlet/XFireServlet/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet>


④WEBアプリをデプロイ

注意点
①SOAPクライアントとしてxfireを使用するときは、SOAPサーバ側もxfireでなければならない。

②SOAP通信に用いるインタフェースは、クライアント側とサーバ側で同じパッケージにしなければならない。

2009年10月9日金曜日

Android

Google Androidが気になっている。
iPhone嫌い、ってかapple嫌いの私は必然的にGoogle好きになってしまった。

というわけでAndroidケータイHT-03Aを買うべく、まずはアプリを作る。

これからアプリ作成日記を書こうと思う。

2009年9月26日土曜日

便利なスキル

社会人教育にはめったに出てこない、新人に教えたい便利なスキルを列挙。

・EXCEL VBA

・UNIX/Linux シェルスクリプト

・Ant

・VBScript/JScript

iPhoneのAPNs

最近仕事でiPhoneを使った業務システムの開発を行った。

社内PCからiPhoneへ向けたメッセージを送信するのに、
apple社のAPNs(Apple Push Notification service)を使用したので、
覚えたことをメモ。

・APNs番号について
APNs番号とは、iPhoneのデバイスIDとアプリケーションのBundleIdentifierが紐付けられた、端末を一意に特定するための番号。半角英数で64文字。

APNs番号の作成タイミング:iPhoneアプリからappleAPNsサーバに初回アクセスに行ったとき、appleAPNsサーバで発行し、iPhoneアプリに戻してくる。

・プロビジョニングプロファイルとプロバイダ証明書について
プロビジョニングプロファイルは、開発用(Development)と商用(Production)が存在する。
それぞれ違いはあるが、注意すべきは、Productionが有効になっている場合、Developmentは無効になるということ。つまり、Production登録したあとは、iPhoneアプリに食わせるプロビジョニングプロファイルも、プロバイダサーバに置く証明書(pemファイル)も、Production版の証明書をキーチェーンからExportして使用しなければならない。
おそらく、APNsサーバ内で制御しているのだろう、APNsのテスト機(gateway.sandbox.push.apple.com)へアクセスしても、反応してくれなくなる。



参考:
iPhoneアプリで稼げるのか:PushNotificationの実装方法

Push Notification 用フレームワーク

Antの基礎

最近Antでのビルド環境を構築しているので、覚えたことをメモ。

・環境変数を取得する
<property environment="env"/>
<path id="ENV.TARGET">
<fileset dir="${env.libpath}" includes="*.jar"/>
</path>


・ビルドバージョンファイルを自動生成
<buildnumber file="src/build_version.properties"/>

こうすると、バージョンファイルが存在しない場合は生成し、存在する場合はビルド番号を1足してくれる。作成するアーカイブに取り込むようにする。

・他のビルドファイルを取り込む
まさにjavaのextendsのように、ビルドファイルも取り込むことができる。
<import file="../common_build.xml"/>
取り込んだビルドファイルに定義しているターゲットでも、自分のターゲット名を同じにすればオーバーライドできる。

参考:
公式ドキュメント

Hidedama's Ant Memo

教訓 ライブラリ・ソース管理

仕事をしていて感じたこと、トラブルプロジェクトでの経験を生かして、
ここに教訓を書いておく。

ライブラリ・ソース管理
大規模開発において、必ずトラブルが発生するライブラリ・ソース管理。
開発するに当たって相当の工数を取られてしまうのが現状だと思われる。
管理を簡素化するためにいくつか覚書。
(1)ディレクトリ構造を同一にする
開発を行うメンバーは、開発に関する全てのディレクトリ構造を同一にする。

(2)ソース管理はバージョン管理ソフトを使用する
ソース管理は、フォルダを分けて「old」「new」などやるのは時間と手間の無駄。
バージョン管理ソフトを導入する。
VSS(Visual Source Safe)やCVS、SVN(Subversion)など。
CVSとSVNはフリーなので、導入が楽かもしれない。

VSSはファイルベースの管理ソフトなので、サーバが不要。ネットワークフォルダとクライアントソフトがあればOK。
SVNはサーバソフトとクライアントソフトが必要で、通常SVNといわれているのはサーバソフトのこと。SVNクライアントでは、TortoiseSVN(トータスSVN)がWindowsシェル統合で使いやすい。

(3)プロジェクトファイルを共有する
EclipseやVisualStudioなど、統合開発環境(IDE)のプロジェクトは必ず共有し、全メンバーで同一のものを使用する。
IDEのプロジェクトファイルには、様々な設定(例えばjavaの開発ならクラスパスや参照ライブラリの設定)が入っているため、各メンバーでバラバラの設定を持ってしまうと、ソースを新しくすると動かなくなる、などの事態が発生する。当然プロジェクトファイルもバージョン管理する。

(4)ビルド・メイク環境を一つにする
プログラムのビルド・メイクは、必ず一つの環境とし、バージョン情報を付加する。

教訓 外国人SE

仕事をしていて感じたこと、トラブルプロジェクトでの経験を生かして、
ここに教訓を書いておく。

外国人SE
原価低減のため、外国人SEを投入することが多い。
まぁ結局高くつくことが多いわけだが、それは指示を与える日本人の問題。
外国人SEの方が技術レベルが高いことが多く、
使いようによってはうまくいくはず。(うまくいったのを見たことないが)

(1)資料を作らせるときは、枠を予め決めておく
外国人SEに資料を作らせる際、「こうこうこういう資料を作れ」という指示はNG。
こちらでほしい資料を作ってくれることなど絶対にない。(日本人でも無理だと思う)
そのため、例えばエクセルの一覧を作らせる場合は、予め枠、つまりカラム名を全て書き、
「そのカラムには何を書くのか」という説明をつけて渡す。
そして、「このエクセルの空白を埋めろ」という指示を出す。

また、文章での資料などがほしい場合、章立てを予め作っておく。
そして、あるならサンプルを渡す。サンプルがなければ、「この章にはこういうことを書く」という説明をつける。

(2)日本語での会話は信じない
日本に仕事をしている外国人SEの中には、流暢に日本語を話せる人もいる。
しかし、その人は日本人ではない。
日本の文化として、「阿吽の呼吸」や「暗黙の了解」などがあるが、
その人には通用しない。
外国人SEに限ったことではないが、こちらには当然のことが、外国人には当然でないことがほとんどである。
もしコミュニケーションをとるなら、メモやメールなど、文章・図にまとめさせるほうが良い。
会話よりまだましだ。

(3)慣習を教え込む
外国人SEの中には日本のシステム開発での慣習を理解している人もいる。
例えば、本番サーバに気軽にアクセスしないことや、勝手にテストモジュールを入れ替えたりしない、など。
だが、外国人SEの下にいる(まさに母国語しか話せない人たち)プログラマは守ってくれない。
やってしまう人がいる場合、すぐさま注意し、やってはいけないことを理解させる。

教訓 開発環境を整える

仕事をしていて感じたこと、トラブルプロジェクトでの経験を生かして、
ここに教訓を書いておく。

開発環境を整える
トラブルプロジェクトの場合は特にだが、急にメンバーを増員することが多い。
急に人が増えたところで、開発環境についての資料がないと、無駄に終わることが多い。それだけならまだしも、開発当初からのメンバーが質問攻めに合うこと必至。
そんなときのために、環境資料を必ず先にまとめておく。
(1)テスト機の情報を一覧にまとめる。
論理サーバ名、ホスト名、IPアドレス、リモート接続プロトコル、OSログインユーザ、パスワード、注意点など。
(2)各テスト機の起動・停止など、システム操作の手順を処理フローと一覧にまとめる。
例)




(3)作成したアプリケーションが出力するログのパスを一覧にする。

(4)アプリケーションのテストにログインが必要な場合、ユーザ一覧を作成する。
その際、そのユーザを誰が(どのチームが)使用するかを明確にする。

2009年6月10日水曜日

Windowsで"tail"コマンド

たまーにwindowsでUNIXのtailコマンドができたらいいなと思う。
スクリプトで作ってみた。
まだまだ検討の余地がありそうだけど、第一版をUP。



//tail for windows.
//please select "Cscript" engine.
//Created by sashimi.

var looptime;
var path;


if(WScript.Arguments.length==0
|| WScript.FullName.substr
(WScript.FullName.length-11).toUpperCase()=="WSCRIPT.EXE"){
WScript.Echo("Usage:cscript tail.js ");
WScript.Quit(1);
}

path=WScript.Arguments(0);
//WScript.echo(path);

var fso=WScript.CreateObject("Scripting.FileSystemObject");

if(!fso.fileExists(path)){
fso=null;
WScript.Quit(1);
}

var ts=fso.OpenTextFile(path,1,false);
var size=fso.GetFile(path).Size;

//WScript.Echo(size);
ts.Skip(size);
try{
while(true){
WScript.Sleep(1000);
if(!ts.AtEndOfStream){
WScript.Echo(ts.ReadLine());
}
}
}catch(e){
}finally{
ts=null;
fso=null;
}

2009年6月5日金曜日

EXCELでタグ付き正規表現

サクラエディタでタグ付き正規表現ができないみたい。
秀丸ならできるのにな。
探してみたらEXCELでできるみたいなので、拝借。



' 正規表現による置換
Function RegReplace(ByRef strSource As String, _
          ByRef strPattern, _
          ByRef strReplacement As String) As String


  '動作環境: IE5.0以上がインストールされていること
  '参照設定: Microosft VBScript Regular Expressions x.x

  Dim REG As REGEXP
  Set REG = New REGEXP
  With REG
    .Pattern = strPattern
    .IgnoreCase = False
    .Global = True
    RegReplace = .Replace(strSource, strReplacement)
  End With
  Set REG = Nothing

End Function


秀丸使えないときはこれを使うしかない。


訂正。サクラエディタでも使えるみたいです。

2009年5月22日金曜日

EXCELワークブックの目次を作る

仕事してるとEXCELのシートが大量に作られてるドキュメントをよく見る。
シートを移動するのがめんどくさいので、目次を作るマクロを作ってみた。

'ハイパーリンク表紙作成------------------------------------------
Sub CreateCoverPage()
'例外処理
On Error GoTo Exception
'Define
Dim objApp As Application
Dim objWB As Workbook
Dim objWS As Worksheet
Dim sCnt As Integer 'シート数
Dim sHyper() As String 'シート名ハイパーリンク文字列配列
Dim I As Integer 'ループ用
Dim rVis As range '非表示確認用
'Instance
Set objApp = Application
'表示の変更
objApp.DisplayAlerts = False
objApp.ScreenUpdating = False
objApp.Cursor = xlWait
'ファイルオープン
Set objWB = ActiveWorkbook
'シート数ゲット
sCnt = objWB.Sheets.Count
'配列にハイパーリンクアドレスを作成
ReDim sHyper(sCnt - 1)
For I = 0 To sCnt - 1
sHyper(I) = objWB.Sheets(I + 1).name
Next
'表紙シート作成
Set objWS = objWB.Sheets.Add(Before:=objWB.Sheets(1))

On Error Resume Next 'シート名が重複しても処理を続ける
objWS.name = "目次"
On Error GoTo Exception
'既存シートのシート名をハイパーリンクとして表紙に記述
For I = 1 To sCnt
objWS.Cells(I + 3, 2).Select 'シート名記述はB4から下へ
objWS.Hyperlinks.Add Anchor:=Selection, Address:="", SubAddress:= _
"'" & sHyper(I - 1) & "'!A1", TextToDisplay:=sHyper(I - 1)
Next

With objWS 'シートタブの色
.Tab.ColorIndex = 50
'結合
.range("B1:C1").Merge
.range("D1:G1").Merge
'補足表示
.range("B1").Value = "ブック名 : [" & objWB.name & "]"
.range("D1").Value = "目次作成日:" & CStr(Now)
.range("B3").Value = "シート名"
.range("C3").Value = "説明"
.range("D3").Value = "作成日"
.range("E3").Value = "作成者"
'太字・アライン
.range("B1:D1").Font.Bold = True
.range("B3:E3").Font.Bold = True
.range("B3:E3").HorizontalAlignment = xlCenter
'表示形式
.Columns("D:D").NumberFormatLocal = "yyyy/m/d"
'色をつける
.range("B1").Characters(Start:=7).Font.ColorIndex = 53
.range("B3:E3").Interior.ColorIndex = 40
.range(.Cells(4, 2), .Cells(3 + sCnt, 5)).Interior.ColorIndex = 35
'カラムサイズを設定する
.Columns("A:A").ColumnWidth = 2
.Columns("B:B").EntireColumn.AutoFit
.Columns("C:C").ColumnWidth = 58.13
.Columns("D:D").ColumnWidth = 11.5
'罫線
With .range("B3:E3").Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With .range("B3:E3").Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With .range("B3:E3").Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With .range("B3:E3").Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With .range("B3:E3").Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With .range(.Cells(4, 2), .Cells(3 + sCnt, 5)).Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With .range(.Cells(4, 2), .Cells(3 + sCnt, 5)).Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With .range(.Cells(4, 2), .Cells(3 + sCnt, 5)).Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With .range(.Cells(4, 2), .Cells(3 + sCnt, 5)).Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With .range(.Cells(4, 2), .Cells(3 + sCnt, 5)).Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
If sCnt <> 1 Then
With .range(.Cells(4, 2), .Cells(3 + sCnt, 5)).Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
End If
End With
Exit Sub

Exception: 'Dispose
Set objApp = Nothing
Set objWB = Nothing
Set objWS = Nothing
'削除確認ダイアログを出す
Application.DisplayAlerts = True
Application.Visible = True
Application.Cursor = xlDefault

MsgBox "エラーが発生しました" & vbCrLf & _
"エラー番号:" & Err.Number & " エラー詳細:" & Err.Description _
, vbExclamation, "システム"
End Sub
こんな感じのができます。

そして目次にジャンプするマクロ(これがないとあんまり意味ない)
また次回。

2009年5月18日月曜日

セルをコンボボックスにする

EXCELの入力規則でコンボボックス(リストが表示される&入力も可能)を使う場合
こんなの↓


[入力規則]で通常のリストを設定し、[エラーメッセージ]タブの
[無効なデータが入力されたらエラーメッセージを表示する]のチェックをオフにする。


ちなみに、参照するリストを別シートに記載したい場合は、
名前つきセル参照を使う。


別シートで名前つきセル範囲を設定してから、入力規則ダイアログで"=セル名称"と設定する。

2009年4月29日水曜日

ヘルプを眺めてて初めて知ったVBスクリプトのバッチモード。
忘れないようにメモ。

WScript.Interactive = False

"WScript.Echo"や"Msgbox"コードを無視してくれます。

とりあえずこれを使って、Cscriptの場合だけ
デバッグメッセージを表示するような感じにしてみた。

'WScriptだったらメッセージを表示しないように
If Ucase(Right(WScript.FullName,11)) = "WSCRIPT.EXE" Then
WScript.Interactive = False
End if

今度TimeOutプロパティの使い道を検討してみよう。

フィルタオプションの使用

EXCELでオートフィルタをかけるとき、条件は2つまでしか設定できないが、
フィルタオプションを使用することで解決できることがある。

フィルタオプションを使うと、好きなだけ条件を並べられるし、
AND条件、OR条件も柔軟に指定できる。

例えば、ある一覧からキー"管理番号"が
"A001"
"A002"
"B005"
"C009"
にヒットするやつをフィルタリング。なんてことも簡単にできる。

ただし、フィルタオプションでは作業用セルが必要となってくるので、
もしVBAで処理化するならその辺も考えないといけない。

VBAではAdvancedFilterを使う。

2009年4月22日水曜日

VBAからVBAのコード編集

マクロを仕込んだブックを使っていて、古いコードを一括で編集したいときがあります。

そんなときは、コードを編集するマクロを書いてやればいいのです。

ここでは簡単な編集をメモっときます。

ヘルプを見るとわかるけど、プロシージャ作ったりなんかもできるみたい。

個人的にはコードをVBAで作っていくより、ファイル読み込ませるほうが確実で早いと思うんだけど。。。


'指定ブックのVBAコード編集する
Public Sub UpdateCode()
Dim path As String
Dim wb As Workbook
Dim tgt_mod As String
Dim in_path As String

'指定ブックのパス
path = "C:\WORK\Target.xls"
'追加したいモジュール名称
tgt_mod = "Module1"
'対象ブックを開く
Set wb = Application.Workbooks.Open(path)

With wb.VBProject.VBComponents(tgt_mod).CodeModule

'5行目に文字列を挿入する
.InsertLines 5, "msgbox cstr(5)"

'テキストファイルから追加する

in_path = "C:\WORK\input.bas"
.AddFromFile in_path

'文字列を追加する
.AddFromString ("'コメントを追加する")

'そのモジュール内のコードを削除する
.DeleteLines 1, .CountOfLines

End With

'対象ブックを保存して閉じる
wb.Save
wb.Close

Set wb = Nothing
End Sub
あとは、対象ブックを探すロジックを入れるだけ。

ただし、コード編集をしたいブックのVBAProjectがロックされてる場合はエラーになります。

ネットを色々調べてみたけど、どうやらVBAからVBAProjectのロック解除はできなさそう。

まぁできたらロックの意味あんまりないよね。

今度からは後々のことを考えて作ります。

※ブックのロック設定・解除はVBAからもできます。