業務改善 – 添付ファイルの削除 Outlook VBA

なにやらExcel VBAとかGoogle Apps Scriptなど、普段は触らないものたちを触る機会が多かった1年でした。開発環境がしんどいですが、業務をストレートに機械にやらさせるので、楽しいという本能が出やすくもあります。

それでもって添付ファイルをざっくり削除して場所を確保したいという課題を、個人的には使うことがないOutlookで解くことになりました。

続きを読む

電波時計に10分前行動させてみる

目の前の電波時計が正しい時間を指していないとき人はそれをどうにかしたいという欲求にかられ、良いものが無いか探し、数々のアイディア実績を見つけて感動し、メーカー品の電波時計は実際にすぐにスマホで同期でき、景品でもらった時計は同期してくれないようなのでおもむろにブレッドボードを出してくるのでした。
続きを読む

CuPy, Chainer をAnaconda3で使う インフラ気にしたくない、Windowsでお気楽にCUDA, cuDNN使いたい

2018-11-30現在

CuPyをインストールするのにCUDAとかcuDNNとかWindowsだとVisual Studioとか大変だった方もいらっしゃると思いますが、 CuPyがcondaコマンドでインストールできるようになりました ということでWindows用も出来上がっているので、一利用者としてはもうAnaconda使うに限るっしょという感じです。バージョンちょっと旧くても良いし(2018-11-30現在だとChainer 4.5)、pipがどうとかインストールがどうとかどうでもよいけどNVIDIA積んでるからCuPy使いたいという方にAnaconda3はお勧めです。

ただ、
RTFM: CuPy 5.1.0 – Installation Guide

自動テスト通ってんのはUbuntu GNU/Linux 64bit LTS14.04/16.04とCentOS 7(64bit)だけだかんね。WindowsとかmacOSを含む他の環境でのCuPyは、動いてるように見えてもわしゃ知らんからね。

と書かれている(CuPy 5.1.0より前も同様)ので、テストの詳細はよくわかりませんが(オープンソースなんだから見ろという…)、機能まで含まれているとすると、違う環境で動作させようとしているまじめな良い子は

  • 財布の紐のadminに相談、物で溢れ返っている人は空間デザイナーにも相談
  • マルチブート
  • クラウド, VPS,レンタルサーバ

等を駆使して、書かれているGNU/Linux環境を整えます。

この機械はWindowsゲーム用、まじめでもガチ勢でもないからこのままAnaconda3をインストールするくらいで、できるだけめんどいことしたくないけどCuPyは使いたいし、ということで進めます。

念のため CUDA GPUs の中からお持ちのGPUを探して、Compute Capabilityの数字を確認しておきます。Installing cuDNN に、必要なcompute capabilityが書かれて(ただ今だと3.0以上)います。

続きを読む

RECV/CQ: Invalid WhiteTable code word, row 0, x 0

2017/5/22追記: libtiff本家から2017/5/22に4.0.8がリリースされたので、順次libtiffが4.0.8にアップデートされていけば以下の問題は発生しなくなるのでしょう。


与信を通過しましたとか、(情報) 統合思念体(ってなんだか知らないけどなんか納得)様からのFAXがしばらく来てませんでしたがFAXが必須な仕事でも無く、電話番号とTSIの一覧はエラーも含めてすべて毎日自動的に送られてくるので必要なものかどうかは一目瞭然なのと、そもそも必要ならば別のコンタクト手段がいくらでもあるので気付かないふりを継続していました。しかしついに年に1,2回のFAXを受けないといけない場面に出くわし、届かないので詳細ログを確認したところ、FAXサーバのlibtiffが4.0.7にアップグレードされた2016年の暮れ頃から3ヶ月以上FAXが正常受信されずに 続きを読む

bruteblock – 非公式IPv6パッチ

キエフ発のbruteblockはSSHのbrute-force攻撃対策で参照されることが多いようですが、標準入力を読んでipfwのテーブルに追加(bruteblock)してくれ、テーブルから決められた時間経過後に削除(bruteblockd)してくれるというシンプルな作りのおかげで使い道は無限大、自分次第あなた次第、SMTP-AUTH, IMAP4へのあくなき挑戦や、公開していないポートへのアクセスなど、好きなトリガーを設定するだけです。

Apache HTTPDのCustomLog directiveはpiped logを出力できますし、SSHでの利用例のようにsyslogdもパイプに出力できるのでsyslogを吐くプログラムならば何でもbruteblockを利用できることになります。

続きを読む

サイズやレイアウトがぐちゃぐちゃになった入力フィールドやチェックボックスを直す – UIComponentのインスタンスをダイナミックに作ると大変

弊社の製品「アポ助」のクライアントはFlashアプリケーションで、ActionScriptを駆使して作られています。 直感的で誰でもすぐに使える画面が好評なのですが、その直感的な操作を実現するために、その時の状態に応じて入力フィールドやチェックボックスなどを動的に生成してレイアウトしています。

ところが、このように動的にコンポーネントを生成してレイアウトするアプリケーションの場合、入力コンポーネントにUIComponentの子クラスを使うとやっかいなことになることがあります。

アポ助はクリニック用の予約管理システムなので、患者様のお名前を入力するフィールドや、診察の種類を選ぶボタンがあり、以下の画像が正しい姿です。

正しい姿
正しい姿

ご覧のように、文字やフィールドなどがきれいに整列して見易くなっています。以下が使用しているクラスです。

テキスト部分: flash.text.TextField
入力フィールド:fl.controls.TextInput
診察の種類:fl.controls.RadioButton/fl.controls.CheckBox
(fl.controlsのコンポーネントは、fl.controls.UIComponentの子クラスです。)

ところが、特定の条件において、これが次のように表示されることがあります。

サイズなどがぐちゃぐちゃ
サイズなどがぐちゃぐちゃ

一目瞭然ですが、フィールドのサイズ設定が反映されずに枠からはみ出ていますし、ラジオボタンやチェックボックスに、肝心のボタンが表示されていません。この問題はUIComponentの描画のタイミングに起因するようです。

この問題はUIComponentのdrawNow()メソッドを呼ぶことで回避できます。つまり、描画のタイミングを明示的に指示する形です。TextInputのwidthやheightの設定が反映されなかったり、チェックボックスが表示されない時などに、試してみてください。

国ごとのIPアドレスの範囲 – RIR stats -> 各国のIPv4とIPv6のCIDR

ありがちな作業なのでそのものずばりなツールはごまんとありそうですが、極力先人の知恵を組み合わせて手抜きしながらIPv6対応のものを自力生成してみます。net-mgmt/p5-Net-IPが超便利です。最近はaggregateされたものは置いてないようなので aggregate-cidr-addresses を使います。NANOG MLのメールのとおりにIPv6の場合はprefix()をprint()に変更します。

上を hoge.pl とでもして保存。先ほどの aggregate-cidr-addresses もその名前のままダウンロードして、最後の

の部分を

に置き換えます。日本のサイダーであればfetchなりwgetなりを使って

お気楽日本のサイダー jp のできあがり。全部のRIR statsは以下のとおり。

頻繁にRIRにftpしないように良い子はちゃんとftpしたファイルを保存します。あとRIR dbはただの登録情報なので、実際に設置されている国と異なったりanycastだったりする場合も多いので、もう少し精度良く場所を知りたい場合はGeoIPなどの他、looking glass, traceroute, whoisなどを使って推察していくことになります。

RIP, dmr 1941-2011

すごい勢いでつぶやかれているようですが、まさにこの本(K&R)が世のプログラミング言語に与えた影響は計り知れず、彼がいなければ世のOSの状況も変わっていたし、それに広範囲に依存している世の中も大きく変わっていたと思います。鶯色のカバーのANSI C対応第2版の翻訳本は今でもきれいに本棚に並んでいますが、高校生のころ読んだ白いカバーの初版の翻訳本はぼろぼろです。

大きなSpriteを複数ページに分けて印刷するとおかしなことになる

ひとつのSpriteの上に、大小様々ないくつものSpriteを乗せました。 そのSpriteはA4の紙よりも大きいため、印刷する際には複数のページに分けないといけません。 ActionScriptで一つのSpriteを例えば2ページに分けて印刷するには、PrintJob.addPage()を2回呼び、それぞれの第2パラメータに、1回目ならnew Rectangle(0, 0, <ページ幅>, <ページ高さ>)を渡し、2回目ならnew Rectangle(0, <ページ高さ>, <ページ幅>, <ページ高さ>)を渡します。このように、各ページにSpriteのどの部分を印刷するかを指定します。

ActionScriptの日本語メッセージを解読してみよう

ActionScriptのコンパイル時やランタイムの日本語のエラーメッセージはなかなかどうして手ごわくて、暗号なんじゃないかと思えてくる時があります。

正しく解釈できるようになるには経験値が必要ですが、全てのエンジニアがその経験をすぐに積めるわけではないですし、試行錯誤を繰り返してこそ経験値が増えるのに、その試行錯誤の副産物であるエラーメッセージの解釈に経験値が必要だなんて、鶏が先か卵が先か。しかも分かり辛いエラーほど、そのエラーの文言とはまったく無関係の初歩的なケアレスミスによって発生するものが多いのです。

この記事には、そんな、ActionScriptのコンパイルエラーを解読…ではなく解釈するための経験値の素を継続的に追加していきます。

まず最初に、これから特定のメッセージが発生した際のいくつかの考えられる原因を説明しますが、そのメッセージの原因が必ずここに説明してあるものであるとは限らないので、注意してください。同じメッセージで複数の原因がある場合があるので、ここに説明してあるものは、あくまでそれらのうちの一つとして参考にしてください。

rightparenがcolonの前に必要です。

右括弧がコロンの前に必要です、と言っているわけですが、そんなことない時でも出ます。

関数の定義の際にfunctionのキーワードを書き忘れた場合。直前までJavaでコーディングをしていると、よく出会います。

誤: private isOk(strTest:String):Boolean {
正: private function isOk(strTest:String):Boolean {


ActionScript ファイルには外部から表示可能な複数の定義は使用できません

定義を使用できません、って何か使用しているつもりはないのだけど…と混乱しがちなメッセージです。

これは、クラス変数を定義するつもりが、public class….で始まるクラス定義の外に変数の定義文を書いてしまうとこれが出ます。もちろん、賢いIDEを使っていればこのようなことは起きません。


private 属性はクラスプロパティの定義でのみ使用できます。

または、「protected 属性はクラスプロパティの定義でのみ使用できます。」

「そうですよね」と答えたくなるメッセージですが、このエラーがある日突然起き始めることがあります。それまでは大丈夫だったのに。

これは、にょろ括弧{}の不一致です。このエラーが起きた場所から遡って行って、{}を含むfunction定義を見つけて、目を皿のようにして{}を見ましょう。多分if文やループ文など、どこかのブロックが閉じていないか、もしくは余計な}があるか、というところです。


1113 Array(x) は新しい Array(x) と同様に動作します。Array 型に値をキャストするには、Array(x) ではなく式 x を Array として使用します。

「式xをArrayとして使用」って、もう、文章が完全に崩壊しています。某アインシュタインの伝記の翻訳本ぐらい支離滅裂です。

この文章は、「Array(x)と書くとnew Array(x)という意味になっちゃうよ」と注意してくれているのです。さらに、「キャストしたければArray(x)ではなく、(x as Array)を使いましょう」(Arrayのキャストにはas演算子を使う)と正しい方法を教えてくれているのです。親切にもメッセージが正しい方法を教えてくれる稀有なケースであるにも関わらず、残念な翻訳でもったいないことになっていますね。


まだまだある?!

この記事は、正しい解釈が必要なメッセージに遭遇したら今後も引き続き更新します。

Using a CheckBox in a DataGrid in ActionScript 3.0 [AS3] – I Want a CheckBox Inside a DataGrid that Behaves Like a CheckBox

There is an entry on this blog that answers questions like “How do I put check boxes inside a datagrid?” and “How do I enable multiple check box selections?”, which is one of the popular entries on this blog. The entry is in Japanese, but I recently found out in an English forum that they seem to be universal questions. Thinking the entry might help a few more people, I tried some web page translation tools on the entry, but I couldn’t figure out any of what I was trying to say by reading the translated stuff, so I decided to translate the entry into English myself.

Well, so much for the introductory remarks. Here it is.

Data manipulation is a basic aspect of business applications, so it is probably safe to assume that a GUI-providing programming language has functions and components that deal with data manipulation like listing, sorting, etc. ActionScript 3.0 does, too.

In this entry, I will explain how to put check boxes in such data lists by adding few functions to code samples in Adobe’s online documents. Let’s assume that you are making a course registration application. By using the method explained in this entry, you can change the status of multiple students in one step by ticking multiple check boxes. Some components allow you to select multiple lines by clicking on them while holding down the Ctrl key, but if you think that method is not so user-friendly, then check boxes may be the solution.

Data manipulation components are commonly made with a pattern using a data grid, a data provider and a renderer. ActionScript 3.0 uses the same pattern, and provides
fl.controls.DataGrid that displays data in a grid of rows and columns, fl.data.DataProvider that provides data to a DataGrid, and fl.controls.listClasses.CellRenderer that tells the grid how to display the provided data. By default ActionScript 3.0 provides a CellRenderer class that displays the data in text.

To change one of the columns in a DataGrid to display a check box, 1) you make a new class that inherits the fl.controls.CheckBox class and implements the fl.controls.listClasses.ICellRenderer interface, and 2) specify the new class in the cellRenderer property of the subject column. The details are explained in the “Define a custom CellRenderer class” section of “Work with a CellRenderer” page on the ActionScript 3.0 Components manual. However, the code listed on this page results in an error, so for a samples code, the one listed in the comments section on fl.controls.dataGridClasses.DataGridCell is much more useful. If you are making a CellRenderer class for the very first time, I’d recommend you to just try this sample code first. This sample code is hereafter referred to as “the sample code” in this entry.

One point that I found inconvenient with the sample code was that each check box represents the selection status of a line in the grid. So, let’s take a step forward and make the check boxes independent of the selection status by going through the modifications that need to be made to the sample code.

First, we modify the function set selected(). In the sample code, the CheckBox’s status is set here, which presents two problems:

  1. This method is called when a line in the DataGrid is selected, so the status of a CheckBox always reflects the selection status of the containing row in the DataGrid; i.e a CheckBox is ticked when a row is selected, making it not appropriate for applications like shopping carts and the aforementioned course registration program. Instead, it should toggle its status when you click on it.
  2. This method is not called when the DataGrid is first displayed, so the cell values are not reflected to the CheckBox status, making the CheckBox unchecked by default no matter what the cell value is. It is only when a row is clicked (selected) that a cell value is reflected to the corresponding CheckBox.

In order to solve these problems, a part of the logic in set selected() is moved to functions set listData() and toggleSelected() both of which will be described later. The line that sets the _rowSelected attribute remains in set selected() so that visual attributes of the DataGrid object (e.g. colors) can be changed when a row is selected.

To solve problem #1, we will modify the function toggleSelected(), for which the sample code says “don’t set selected or dispatch change event”, but for the above mentioned reasons, the selected attribute is set here. (Please note that this is only a suggestion, so please use this at your own risk. For the rest of the usual caveats, please read our “Terms of Use”.)

Now we have a CheckBox that behaves like a CheckBox; i.e. if you click on it it toggles its check mark status regardless of the selection status of the DataGrid.

In order to solve problem #2, we will take a look at set listData(). set listData() is called 1) when a DataProvider is set to a DataGrid, and 2) when something is changed in a DataGrid (when DataGrid.selectable = true). We are taking advantage of the former timing, so we are moving the logic that had been implemented in set selected() down here.

By implementing this, a CheckBox will appropriately reflect the cell value when a DataGrid is filled with values specified in a DataProvider.

By setting the newly implemented CellRenderer to a column in a DataGrid, you will start seeing check boxes instead of “true” and “false” strings.

You can use the CellRenderer like this, but if your application handles ListEvent.ITEM_CLICK events, there is one more modification to make, which is to stop CheckBox’s CLICK events to be transformed to ListEvent.ITEM_CLICKED events, because we are making check boxes that behave independently of DataGrid’s selection status, and clicking on a check box does not mean selecting the corresponding row in a DataGrid.

So, there you have it – a Checkbox in a DataGrid that behaves like a CheckBox!

A few last comments — This code is one implementation method that I derived after much trial and error, which is listed here for your reference. Please read our “Terms of Use” before using the code.

This code is being used in application that we develop, and is subject for future modifications and bug fixes.

浮動少数問題 Java版 CVE-2010-4476

どっかで見たことのある数字のような気がしますが(表記されている1個の値だけではなく範囲になります。DoS仕掛けてくれちゃってる人検出用シグナチャを作る方はこちらやそこから参照されているOpenJDKのBTSですがこちらを。少数をパースする場面って何気に多いですね)。さっそくfp87な機械のEclipseにコピペして自動的に文法チェックされた日にはそのままEclipseハングするので半べそです。2011/2/15に(日本では15日深夜にJava SE 6 Update 24登場しました)6u24が出るまではJava SE Floating Point Updater Toolでしのぎましょうということなので管理者権限でunzipしたjarを実行したら、一生懸命ランタイムライブラリをばらかしてからアーカイブし直してるようでした。インストール先の空き容量がぎりぎりな人はちょっと注意かも。

タイムゾーンのオフセット+09:18:59 はて、18:59はなんぞや?

いろいろ検索したつもりでしたが、実は :18:59 timezone と検索することで先人の方々のサイトがヒットし、Google先生がいれば誰でも天才ということで表題の件は簡単に速攻で解決できたことがわかりました。しかしせっかく書いたので恥ずかしながら公開しておきます…

続きを読む

「初めてのWindowsガジェット」ソースコード解説

【ランチタイムラーニング】 初めてのWindowsガジェット」という記事(冒頭の「注」もお読みください)で、お昼を食べながら踏み出す、ガジェット作成の第一歩について説明しました。

この記事では、その記事に掲載したソースコードについて、少し詳しく解説します。

JavaScriptでのタイマー機能の実装

最初はHTMLの開始と、CSSのスタイルの定義です。

7行目で、bodyの幅を130pxに設定しています。ガジェットがWindows Vistaのサイドバーに貼り付いている状態を「ドッキング」と言いますが、このドッキングの状態では、ガジェットの最大の幅は130pxです。

また、ガジェットをサイドバーに貼り付けず、単独でデスクトップに表示する状態にすることができ、この状態を「アンドック」と言います。

アンドックした状態では、ガジェットの幅は130px以上に設定することができます。多くのガジェットでこの設定を利用して、ドッキングの状態では簡易的なビュー、アンドックした状態ではリッチなインターフェイスを持ったビュー、というようなビューの切り替えを提供しています。ただし、アンドックした状態でも、ガジェットのサイズは縦横共400pxを超えないことをMicrosoftは勧めているそうです。

さて次にHTMLを見てみましょう。

4行目が経過時間を表示するエリア(nowTime)です。そして、5行目に設定時間を入力するフィールド(setTime)があり、6行目、7行目がタイマーを開始、停止するためのボタンです。開始するにはJavaScriptで記述したstartTimer()ファンクション、停止するにはfinish()ファンクションをそれぞれ呼ぶようになっています。

1行目で、このHTMLがロードされたときにJavaScriptで記述したinit()ファンクションを呼ぶようになっていますが、後で出てくるように、今回のガジェットではこのinit()ファンクションは何もしないので、このHTMLがロードされたときは特別な処理は行われません。しかし、今後タイマーの背景画像を変えたりするなどカスタマイズするときに、HTMLがロードされるタイミングでJavaScriptのファンクションを呼ぶ、ということを覚えておきましょう。

最後にJavaScriptを見てみましょう。

ここでは経過時間の常時を更新し(26行目)、毎秒JavaScriptのsetTimeout()でつぎのちょうどの秒にdoSecTimerを呼び出します(30行目)。念のため高負荷がかかっていて表示の次のちょうどの秒が過ぎてしまった場合には単に0.1秒後に再度更新するようにします(32行目)。これをsetTimeout()で設定時間までの時間を計る(39行目,44行目)ことでタイマーを実装しています。

表示の更新は、その時点での時間と開始時間の差分をとって、何秒経過したかを計算します。もちろん1秒ごとに1を足すのが一番簡単ですが、タイマーイベントがジャストの時間に発生しなかったり、そのほかの計算での時間も足されてしまうのでどんどんどんどん遅れることになり、やめたほうが良いでしょう。

また、前述の通りこのガジェットではHTMLがロードされたときに呼ばれるinit()ファンクションでは何もしませんが、7行目、8行目でコメントアウトしてある行のコメントをはずして、背景画像を表示することができるでしょう。

ガジェットでのalertの実装

さてタイマーはこれで実装できるのですが、そもそもタイマーは、指定時間が経過したことを「ぴぴっ」とか言いながら教えてくれてこそ、その本領を発揮できると言うものでしょう。なのにこのタイマーにはアラーム機能がありません。まるで人ごとのように書いてしまいましたが、このセクションでは簡単なアラーム機能を実装しましょう。

そもそも何故このタイマーガジェットはalert()ファンクションを使って、ひょいっとポップアップさせることさえしないのか。それは、alert()ファンクションやconfirm()ファンクションで出てくるポップアップがWindows Vista User Experience Guidelines for the Sidebarに則っていないということでサイドバーガジェットでは無効化されているからです。

それでもとりあえず簡単にポップアップを出したいときもあるではないですか。デバッグするときなんか特に。MSDN Magazineの記事に、そんな開発者の心の叫びに応えた、alert()やconfirm()と同等の機能を実装するやり方(ガジェットプラットフォームが脆弱である一因)が掲載されています。以下が今回のタイマーガジェットにそのやり方を適用する方法です。

ステップ1: ファンクションを準備する

作業フォルダに新しく「Timer.vbs」というファイルを作成して、次のように記述し保存します。

ステップ2: タイマーガジェットから呼び出す

Timer.htmlの中で、前述のCSSの直後、JavaScriptの直前に次の行を書きます。

同じくTimer.htmlの中の、finish()ファンクションの最初か最後に次の行を書きます。

これで簡単なアラーム機能ができました。

参照情報