Browsing articles in "ちょっといいノウハウ"
9月 14, 2012
admin

日付計算の落とし穴 (その2)

前回の「日付計算の落とし穴」の続きです。
それでは、翌月の末日を取得したい場合にはどうすれば良いか?
という話ですが、以下のようにすれば良いことが分かります。

実行環境:PHP version 5.2.6

[php]

<?php

print("2012/01/29の一か月後→".GetNextMonth_Fixed("2012/01/29")."<br>");
print("2012/01/31の一か月後→".GetNextMonth_Fixed("2012/01/31")."<br>");
print("2012/02/29の一か月後→".GetNextMonth_Fixed("2012/02/29")."<br>");
print("2012/03/31の一か月後→".GetNextMonth_Fixed("2012/03/31")."<br>");
print("2012/04/30の一か月後→".GetNextMonth_Fixed("2012/04/30")."<br>");
print("2012/05/31の一か月後→".GetNextMonth_Fixed("2012/05/31")."<br>");
print("2012/06/30の一か月後→".GetNextMonth_Fixed("2012/06/30")."<br>");
print("2012/07/31の一か月後→".GetNextMonth_Fixed("2012/07/31")."<br>");
print("2012/08/31の一か月後→".GetNextMonth_Fixed("2012/08/31")."<br>");
print("2012/09/30の一か月後→".GetNextMonth_Fixed("2012/09/30")."<br>");
print("2012/10/31の一か月後→".GetNextMonth_Fixed("2012/10/31")."<br>");
print("2012/11/30の一か月後→".GetNextMonth_Fixed("2012/11/30")."<br>");
print("2012/12/31の一か月後→".GetNextMonth_Fixed("2012/12/31")."<br>");

function GetNextMonth_Fixed($pDate){
$wkTimeStamp = strtotime(‘+2 month’,strtotime(date("Ym01",strtotime($pDate))));
$wkTimeStamp = strtotime(‘-1 day’,$wkTimeStamp);
$wkDate = date("Y",$wkTimeStamp)."/".date("m",$wkTimeStamp)."/".date("d",$wkTimeStamp);
return $wkDate;
}

?>

[/php]

一旦、当月の1日に遡る

2カ月後の日付を取得する

1日前の日付を取得する

という手順を踏むことで、翌月の末日を取得することができました。

出力結果:

2012/01/29の一か月後→2012/02/29
2012/01/31の一か月後→2012/02/29
2012/02/29の一か月後→2012/03/31
2012/03/31の一か月後→2012/04/30
2012/04/30の一か月後→2012/05/31
2012/05/31の一か月後→2012/06/30
2012/06/30の一か月後→2012/07/31
2012/07/31の一か月後→2012/08/31
2012/08/31の一か月後→2012/09/30
2012/09/30の一か月後→2012/10/31
2012/10/31の一か月後→2012/11/30
2012/11/30の一か月後→2012/12/31
2012/12/31の一か月後→2013/01/31

今後もPHPについてのTipsがあれば、
備忘録を兼ねて投稿しようと思います。

8月 27, 2012
inomoto

【InDesign】InDesignのバグ2点

今回は、仕事中に発見したInDesignのバグを2点ご紹介します。
1点は解決方法がありますが、もう1点は解決方法がありません。
もしこれから同じような処理を行う予定の方はご注意下さい。

1 CS5〜限定 bottom right corner optionのバグ&回避方法

 CS5から、text frameやrectangleの角丸の設定の仕様が変更され、4つの角を別々に制御できるようになりましたが,バグを1点発見しました。4つ角のプロパティは下記の通りです。

・top left corner option     角のシェイプ左上
・top left corner redius    角のサイズ左上
・top right corner option    角のシェイプ右上
・top right corner redius    角のサイズ右上
・bottom left corner option   角のシェイプ左下
・bottom left corner redius   角のサイズ左下
・bottom right corner option   角のシェイプ右下
・bottom right corner redius  角のサイズ右下

このうちの、「bottom right corner option」だけが、スクリプトエディタ上に入力することができません。コンパイルできなくなってしまいます。
Adobeのフォーラムを検索したところ、「«property pcO4»」と入力すると、「bottom right corner option」にコンパイルされるようです。
(参照:http://forums.adobe.com/thread/829997)

ですが、このままだとコンパイルのたびに「bottom right corner option」を「«property pcO4»」に打ち直ししなければならず、正直仕事になりません。

そこで、テキストをスクリプトとして評価するという方法でこの現象を回避してみようと思い、下記のルーチンを作成しました。

[applescript]
–bottom right corner optionを取得
on getBottomRightCornerOption(frameID, appName)
set aScript to "
tell application \"" & appName & "\"
tell document 1
tell text frame id " & frameID & "
set bottomRightCornerOption to «property pcO4»
end
end
end" as string
set aResult to run script aScript
return aResult
end getBottomRightCornerOption

–bottom right corner optionを設定
on setBottomRightCornerOption(frameID, bottomRightCornerOption, appName)
set aScript to "
tell application \"" & appName & "\"
tell document 1
tell text frame id " & frameID & "
set «property pcO4» to " & bottomRightCornerOption & "
end
end
end" as string
set aResult to run script aScript
end setBottomRightCornerOption
[/applescript]

上がプロパティの取得用、下が設定用です。
取得用ルーチンに渡すパラメータは、

1 オブジェクトのID
2 アプリケーション名

設定用ルーチンに渡すパラメータは、

1 オブジェクトのID
2 取得用ルーチンで取得した値
3 アプリケーション名

です。アプリケーション名を渡すことにしてあるのは、CS5以降のverでも使用できる可能性を考えてのことです。CS5.5を調べてみたところ、修正されていないようでしたので……。

これで、面倒な作業なしに開発に集中できるようになりました.

2 CS5まで? anchored object settingsのバグ(回避方法なし)

アンカーオブジェクトのあるプロパティの設定が、GUIからできることとスクリプトからできることが異なる、という現象です。
親文字からの間隔を「カスタム」にすると、アンカー付き位置の「Y基準」を設定できるようになりますが、ポップアップメニューからは下記の列挙値が取得できると思います。

・行(ベースライン)
・行(キャップハイト)
・仮想ボディの上
・仮想ボディの中央
・仮想ボディの下
・行(行送りの先頭)
・列枠
・テキストフレーム
・ページマージン
・ページ枠

これらと、AppleScriptの辞書で定義されている列挙値を比較すると、以下のようになります.

・行(ベースライン)  line baseline
・行(キャップハイト) capheight
・仮想ボディの上    (値なし)
・仮想ボディの中央   (値なし)
・仮想ボディの下    (値なし)
・行(行送りの先頭)  top of leading
・列枠         column edge
・テキストフレーム   text frame
・ページマージン    page margins
・ページ枠       page edge
・(値なし)      line Xheight
・(値なし)      line ascent

このなかで特に困るのが、仮想ボディ関係のプロパティです。大概の自動処理系の作業は、手作業でのデータやテンプレートがまずあって、それにあわせて仕様を設定するということが多いと思いますが、そこでこれらの値が使用されている場合、スクリプトで対応できなくなってしまいます。同じような作業を行う際はご注意ください。

ちなみに、こちらはCS4でも同じ現象が見られますので,それ以前も同様の可能性があります(確認はしていません).CS5.5では修正されているようです。許されるならば5.5に上げてしまうのも一つの手段かと思われます.

5月 28, 2012
admin

日付計算の落とし穴

久しぶりにプログラミングについて書きます。
近頃は主にPHPを使って開発する機会が多いのですが、
便利な関数を使っていると思いがけない落とし穴(?)に
遭遇する事があります。
PHPは非常に使い勝手の良い言語で、日付の計算をする場合も
strtotime関数という直感的にイメージしやすい引数を渡せるものがあります。
しかし、その使い勝手の良さ故にバグを誘発することも
時として起こります。

例えば、このstrtotime関数を使用して1か月後の日付を取得したい場合、
引数の1番目に”next month”という様に英単語を渡すと
簡単に取得できるように思えます。

実行環境:PHP version 5.2.6

[php]

<?php

print("2012/01/29の一か月後→".GetNextMonth("2012/01/29")."<br>");
print("2012/01/31の一か月後→".GetNextMonth("2012/01/31")."<br>");
print("2012/02/29の一か月後→".GetNextMonth("2012/02/29")."<br>");
print("2012/03/31の一か月後→".GetNextMonth("2012/03/31")."<br>");
print("2012/04/30の一か月後→".GetNextMonth("2012/04/30")."<br>");
print("2012/05/31の一か月後→".GetNextMonth("2012/05/31")."<br>");
print("2012/06/30の一か月後→".GetNextMonth("2012/06/30")."<br>");
print("2012/07/31の一か月後→".GetNextMonth("2012/07/31")."<br>");
print("2012/08/31の一か月後→".GetNextMonth("2012/08/31")."<br>");
print("2012/09/30の一か月後→".GetNextMonth("2012/09/30")."<br>");
print("2012/10/31の一か月後→".GetNextMonth("2012/10/31")."<br>");
print("2012/11/30の一か月後→".GetNextMonth("2012/11/30")."<br>");
print("2012/12/31の一か月後→".GetNextMonth("2012/12/31")."<br>");

function GetNextMonth($pDate){
$wkTimeStamp = strtotime(‘next month’,strtotime($pDate));
$wkDate = date("Y",$wkTimeStamp)."/".date("m",$wkTimeStamp)."/".date("d",$wkTimeStamp);
return $wkDate;
}

?>
[/php]

しかし、2012年の1,3,5,8,10月の場合、月末の日付を渡すと
翌々月の日付を取得してしまいます。

出力結果:

2012/01/29の一か月後→2012/02/29
2012/01/31の一か月後→2012/03/02
2012/02/29の一か月後→2012/03/29
2012/03/31の一か月後→2012/05/01
2012/04/30の一か月後→2012/05/30
2012/05/31の一か月後→2012/07/01
2012/06/30の一か月後→2012/07/30
2012/07/31の一か月後→2012/08/31
2012/08/31の一か月後→2012/10/01
2012/09/30の一か月後→2012/10/30
2012/10/31の一か月後→2012/12/01
2012/11/30の一か月後→2012/12/30
2012/12/31の一か月後→2013/01/31

恐らくは、
2012/03/31の一か月後

2012/04/31は存在しない

存在する日付まで進める

2012/05/01 という流れをもって
翌々月の日付を取得していると思われますが、直感的に見て
若干違和感を覚える挙動をしています。

既存のプログラミング言語の機能でも、
便利さに目を奪われると思いがけない落とし穴に出くわす事があります。
便利なものこそ、時と場合に応じて本当に有効かどうか確かめる必要がある、
と思いました。

5月 21, 2012

コンピュータの悲鳴

コンピュータは、HDDや放熱ファン、光学ドライブなど物理的な運動を伴う部品を含んでいるため、これらの部品が壊れた場合には部品交換……運が悪ければ買い替えということになってしまいます。

いきなり壊れるという場合は少なく、何らかの「予兆」はあります。

 例:HDDから異音がする(とくにカンカンといった普段鳴らない音)
 例:放熱ファンから異音がする(ひっかかるような音)

これら以外にも、季節による傾向もあります。冬場にデスクトップ機が壊れるケースが多いような気がします。

過去には、水冷タイプのPowerMac G5が派手な水を吹いておなくなりになられたケースや、HDDがトンでしまった事例などがあり、これらの「コンピュータの悲鳴」的な現象を事前に感じ取ることができれば、いきなり「悲しいお別れ」にならなくて済むのではないでしょうか。

コンピュータからデータをバックアップしておく「遺産相続」や、設定値をメモしておく「遺言書の作成」などなど、事前に手を打っておけば仕事が停滞することも少なくなるはずです。

ときに、自分のメインマシンで前述の2症状が発生しているのですが、これは夢でしょうか。夢であってほしいと思います。

6月 21, 2011
amemiya

日付と時刻を取得するマクロ関数

Office2010に替えてから、昔つくったエクセル2003のマクロが使っているうちにコンパイルエラーを起こすようになった。2003以前と2007以降ではオブジェクトモデルが大幅に変更されたらしいので、廃止された関数とかは書き直さなくてはいけない。今回は日付と時刻を取得する関数がエラーになっていたので同じような関数に置き換えた。内容をメモしておく。
 Date関数・Time関数→Now関数に書き換え
 Year関数・Month関数・Day関数・Hour関数・Minute関数→DatePart関数に書き換え
これでコンパイルエラーは出なくなった。稼働テストをしても問題ないみたいなので、とりあえず終了。かなり昔に作ったものなので、エラー部分以外にも書き直したいと思う部分があったりするので、コード全体の見直しも必要かもしれない。

5月 18, 2011
admin

ペアプログラミング

 koisoです。4ヶ月ぶりの投稿です。今回はソフトウェアの開発手法の
1形態であるペアプログラミングを紹介したいと思います。

 ペアプログラミングとは、1人が1台のPCを占有して開発を行う従来の
方法と異なり、2人で1台のPCを使用して互いの知見を持ち寄って
開発を進めるという比較的新しい手法です。

 ペアプログラミングで開発を行うとどのようなメリットがあるのでしょうか?
一見すると1台のPCで2人が作業をするというのは何だか非効率な
イメージを持たれる方もいらっしゃるかもしれませんが、意外と生産的な
作業ができるのです。これは私自身がペアプログラミングを実際に
某情報誌製作会社で開発をした経験から言えると思います。
特に、作業者2人のうち一方がプログラムの仕様を熟知しており、
もう一方に対して説明を交えながら開発を行う、といった状況では
大変効率的に情報共有が進みます。ひいては作業自体もスムーズに進みます。
また、一定時間2人で顔を突き合わせて作業をしていると
適度に緊張感を保つ事が出来るため、短い時間でありながら密度の濃い
仕事が可能になります。よって、だらだらと作業をして残業時間が増える、
なんて事も避けられます。
 但し、限られた人員で作業をこなさなければならない状況では
この開発手法は作業スピードを落とすことになるかもしれません。
ある程度マンパワーに余裕がある状況でないとペアプログラミングは
有効に機能しない所が難点である、と言えます。

2月 21, 2011
inomoto

AppleScript ミニツール2つご紹介

Inomotoです。初投稿です。
今回は私が業務でよく使っているAppleScriptを二つ紹介します。

1 個別にZip.app
OSXになってから、Finderからcontrol+クリックでファイルをZip圧縮できるようになりました。
ただ、この機能では複数のファイルを選択したときに、まとめて1つのファイルに圧縮されてしまいます。
ときにはたくさんのファイルを一つ一つ個別に圧縮したい場合もありますので、そんなときに役に立つのではと思います。

[applescript]
—————————————
–Drag&amp;Dropしたアイテムを一つずつ処理
—————————————
on open inItems
with timeout of (1 * 60 * 60 * 12) seconds
repeat with tgtItem in inItems
tell application "Finder"
set tgtItem to tgtItem as alias
zipIt(tgtItem) of me
end tell
end repeat
end timeout
end open

—————————————
–エイリアスを渡すとそのアイテムをZIP圧縮するルーチン
—————————————
on zipIt(tgtItem)
tell application "Finder"
–処理対象の名前を取得
set tgtName to name of tgtItem as Unicode text
set tgtName to quoted form of tgtName

–カレントディレクトリを取得
set tgtParent to parent of tgtItem as alias
set tgtParent to quoted form of POSIX path of tgtParent

set zipName to tgtName &amp; ".zip" –zip名

–フォルダの中身を全て階層的に圧縮
do shell script "cd " &amp; tgtParent &amp; " ; " &amp; "zip -r " &amp; zipName &amp; " " &amp; tgtName

end tell
end zipIt
[/applescript]

2 Dropしたファイルを指定したプログラムで処理.app
お客様からいただいたテキストファイルを使用する際、そのまま何もせずに使えることは稀です。大概の場合は何らかの処理が必要になります。
私はそのようなときには大概perlを用いて処理するのですが、perlを使いたい場合はターミナルを開いてコマンドラインから入力しなければならず、私のような面倒くさがりにはちょっと敷居が高い作業です。
このスクリプトをアプリケーション形式で保存すると下記の2手順でperl処理が行えます。
・処理したいファイルをまとめてDrag&Dropする
・どのプログラムで処理するかダイアログで指定
procFileの『do shell script “perl “』の『perl 』の部分を書き換えるとrubyやPHPなどでもできるのかなぁと思っていますが、まだ試していません。

[applescript]
on open inFiles
tell application "Finder"
set progSource to choose file with prompt "プログラムのファイルを選択"
end tell
repeat with tgtFile in inFiles
procFile(progSource, tgtFile) of me
end repeat
activate
display dialog "END" giving up after 2
end open

——————————————————-
–プロセスを呼び出して処理
——————————————————-
on procFile(progSource, tgtFile)
set progSource to quoted form of POSIX path of progSource
set tgtFile to quoted form of POSIX path of tgtFile
do shell script "perl " &amp; progSource &amp; " " &amp; tgtFile
end procFile
[/applescript]

10月 17, 2008

一流アナリストの7つ道具

テレビ東京「ワールドビジネス・サテライト」のコメンテーターでおなじみのロバート・フェルドマン氏の本『一流アナリストの「7つ道具」』を読んでみました。

 

Continue reading »

10月 10, 2008
admin

コメントと改行のちょっといい話

プログラムのソースコードの中には、「コメント」というものがあります。直接コンピュータが「実行しない」注釈のことで、実行時には無視されます。

では、この「コメント」は盲腸のような「あってもなくてもよい」ものなのか、と言われれば……さにあらず。とても大事な働きをするものです。しかも、プログラムの実行時にではなく、人がプログラムを読んだり書いたりするときに、です。

Continue reading »

9月 3, 2008

MindManager導入セミナーのレポート

MindJet MindManagerというマインドマップのソフトウェアを使い出して2年以上たちます。マインドマップというのは……何かをまとめたり、議論を行ったりする時に使う道具です。テーマを四方八方に広げて掘り下げてまとめていけるので、比較的自由な発想を行えることを特徴としています。また、一度広げた内容をズームアウトして俯瞰して振り返ったりすることもできます。

Continue reading »

ページ:12»