So-net無料ブログ作成
仕事とプログラムのハナシ ブログトップ
前の10件 | -

vc#でWord制御 ‐ ページ番号と行番号を取得 ‐ [仕事とプログラムのハナシ]

普通にWordを使うとき、文書のカーソル位置に応じて、ステータスバーのページ番号と行番号が変化する。
アプリからWord制御するときに、このページ番号と行番号を取得して、実行ログに残しておきたかった。

結論としては、Word.RangeのInformationを取得して、そこからWdInformation列挙体で欲しい情報を指定するだけ。とっても簡単。VB.NETでも同様に取得できるようです。

ググってみたところ、すんなりとは見付からなかったので、自分用めも。(探し方が悪かったのかも?簡単すぎて説明するレベルじゃなかったのかも??)

当然のことながら保証しないので、自己責任でどうぞ。
例外処理なんかも入れてくださいね。


using Microsoft.Office.Core;
using Word = Microsoft.Office.Interop.Word;
~~~略~~~
private  void GetPageLine_FromRange(Word.Range range, ref int page, ref int line)
{
    // wdActiveEndPageNumberは範囲末尾の位置を取得するので、範囲を先頭に絞る。
    // object型(実態はSystem.Int32型)で返ってくるので、さしあたりキャストしておく。
    page = (int)range.Characters[1].get_Information(Word.WdInformation. wdActiveEndPageNumber);
    // wdFirstCharacterLineNumberは範囲先頭の位置を取得するので、引数で受け取ったまま使う。
    // こちらもobject型(実態はSystem.Int32型)。
    line = (int)range.get_Information(Word.WdInformation.wdFirstCharacterLineNumber);
}


Wordオートメーションアプリの動作確認環境は以下の通り
◆VC# 2008 Express Edition
◆.NET Framework 3.5 SP1
◆Office 2007 (Word 2007)

人間は、いかると心臓がバクバクいうんだね。 [仕事とプログラムのハナシ]

ひとが足りず、外注(派遣)さんに来てもらうことになった。
面接した偉いひと曰く
『高齢だけど、できそうな感じ。
 すごくできるか、すごくできないか、どっちか』
とのこと。

来てみれば確かに高齢で、定年って何歳だっけー?といいたくなる年齢。
表示設定でフォントや倍率を特大にしたり、印刷物を拡大鏡で見たり、老眼鏡を着けたり外したり。
『まぁ、年だから仕方ないやね。』くらいに思っていた。

そんな初日の打合せ(兼引き継ぎ)、妙に悪い予感がした。
・縦書き用ノートに横書きしている
・体制を説明したのにメモを取らない
・パソコンとメールサーバと暗号化ZIPのパスワードを混同
・読んでほしいと伝えたファイルを読んでいない
・メールが口語、かつ、まとまっていない
・数時間掛けて何やら調べていたが『できない』と結論付ける(その後、私が5分で解決)
・OpenFileDialogのFilterプロパティをググってる
・出してきた工数見積もりが異様に多い
ひとつひとつは些末だが、合計すると結構な不安感になった。あまりに心配なので、その日のうちに上長にアラームをあげておいた。

二日目以降、その不安が徐々に明確になってきた。

ひとの話しは聞いていない。
→二日目に明確化

設計はまるっきりしやしない。
→三日目に明確化

ひとのメールもろくに読んでない。
製造はさっぱり進まない。
調査はまったくできていない。
→五日目までに明確化

口を開けば
・○○は聞いていない(説明済み)
・○○のはずだ(説明とまったく違う)
・○○はどう作るのか(それを設計するのが仕事じゃないのか)
・○○は一日掛けて調べたが、できない(30分で実装できましたが。。。)
・○○を除けばできている(除いてもできていない&構成が雑すぎる&プログラムが汚なすぎる)
のオンパレード。

無論、ここまで何もしなかった訳ではなく、必要な情報を随時揃えたり、それとなくor具体的に誘導したり、打てるだけの手は打った。
それでもまったくもって進まない。
なんなんだ、こいつ。

ちなみに。
三日目時点であまりに進まないので、裏でこそこそサヨナラの方向に誘導するための布石を準備してみた(短納期なのにレビュー必須に持ち込んだ)。

一週間と二日が経過し、外注さんは、このトラップに見事に嵌まってくれることとなる。
レビューで山盛りのバグを露呈してくれたんだ。
しかも『これこれの使い方なら動く』とか『いついつまでは動いていた』などの言い訳付きで。

その嵌まりっぷりは見事の一言に尽きる。

・・・が、しかし。
お客様にリリースするプログラムだというのに適当すぎる外注さんの所業が頭に来て、危うく怒鳴り付けるところだった。
私やプロジェクト管理者が各種機能を揃えてお膳立てしたにもかかわらず実装できていないことを、プロジェクト管理者のせいにする所業も頭に来て、こちらも怒鳴り付けるところだった。
両方、目一杯こらえて、ぎりぎりせーふ。
人間ってのは心底いかると心臓がバクバクいうんだなぁ、と知ったよ。

なお、諦めのついた上長はサヨナラの方向で動き始め、面接担当者さんからは『申し訳ない』の一言をもらい、現状は私の狙い通りに進みつつある。
この外注さんに掛けた費用がもったいなくて堪らないが、時間が戻ってくるでなし、そもそも私は経営に関与しない平社員だし。

私は、自分の元々持っている案件をフルスピードで終わらせて、外注さんから奪還した作業を進める所存です。
うし、がんばるぞ。

Renesas FDTのスクリプトのメモ [仕事とプログラムのハナシ]

以前、Renesas FDT のスクリプトを使っていて、Connect命令のUSB Direct接続の使い方がわからず困ったので、メモを残しておく。

ほんとはRenesas rulz!に残そうかと思ってたんだけど、同じ問題で悩んでたとおぼしきスレッドが削除されちゃったようなので、自分用メモだけにする。

【以下、メモ】
FDTのマニュアルをみると、PIDとBIDを指定しろって書いてあるんだけど、BIDって何だろう?
PIDは、お馴染みプロダクトIDだよね(でもってVIDはお馴染みベンダIDだよね)。

どうやら、BIDってのはシリアルナンバーのことらしい。

デバドラで、接続したMCUのUSBプロパティをひらくと、詳細タブで↓みたいなのが確認できる。←当たり前
USB¥VID_xxxx¥PID_yyyy¥5&zzzzzzzz&0&n

(上記の円マークはわざと全角にしてあります)
んで、この5からnまでがBIDらしい。

VIDとPIDは、接続MCUによって固定。
BIDはPCによって変化。(特に最後のnはUSBポートによって変化するので注意)

これらも当たり前

★ここで要注意★
FDTのマニュアルに書かれてるPIDは、一般的なPIDと違う。
上記の例でいえば、VIDからyyyyまでを指すんだって。
えー?なにそれー(´Д`)と言いたいのをグッと堪えましょう。

【結論】
FDTスクリプトのConnect命令は次のように記述すべし。
Connect USB|VID_xxxx¥PID_yyyy|5&zzzzzzzz&0&n

えええ?マニュアルの例と全然違うじゃん(´Д`)と言いたいのをグッと堪えましょう。

以上、メモでした。

gccとリンカスクリプト(ld)のメモ [仕事とプログラムのハナシ]

自分用めも。

【前提】
組み込み。

STM32(ARMコアのMCU)に、OSなしでファームを載せる。
ツールチェーンはお馴染みの開発環境Sourcery G++ lite (arm-none-eabi-gcc などが一式入ったやつ )を使う。

プロジェクトは複数のソースファイルで構成。
ぜんぶをビルドして、ひとつのelfファイルにまとめる。
(motでもhexでもいいんだけど)

【やりたいこと】
main.c
aaa.c
bbb.c
のうち、bbbだけ別領域に配置したい。
mainとaaaはごく普通にFlash ROMに配置、
bbb.cは外付けメモリに配置、みたいに。

マイコン徹底入門さんのプロジェクトとかを参考にしてると、全部Flash ROMに置いてるんじゃないかな??(←未確認)
少なくとも私が参考にしたところ(別サイト)は、そうだった。

【やろうとして失敗したこと】
配置を決めるなら、bbb.cだけ違うセクションにしてやれば、簡単にリンカスクリプトで配置できるんじゃね?

各関数に__attribute__((section("xxx")))をつければ、それを付けた関数は.textセクションじゃなくなることを確認。
変数も同様にセクション変更可能なことを確認。
でも、.rodata(ソースべた書きの文字列とか定数とか)がうまく変更できない。
なんとかこのファイルだけセクション変更したいのに.rodataはどうやればいいのー??
gccのオプションで変更できたりしないのー??

って考えたのがそもそもの間違いだった。
ぐぐってたら、ファイル単位で云々したいならリンカスクリプトのマニュアルをあたれって書かれてた。


【じゃあどうしろっての?】
リンカスクリプトのマニュアル、ざーっと読む。
そしたら、すごく簡単で拍子抜け。。。

※以下、リンカスクリプト。
記載していない部分でFlash ROMや外付けメモリのアドレス、サイズは定義済み。


SECTIONS
{
    .text :
    {
        .=ALIGN(4);
        *(.text)
        *(.text.*)
        *(.rodata)
        *(.rodata.*)
        .=ALIGN(4) ;
    } >FLASH

みたいになってると思うので

SECTIONS
{
    .sample :
    {
         .=ALIGN(4) ;
        bbb.o(.text)
        bbb.o(.text.*)
        bbb.o(.rodata)
        bbb.o(.rodata.*)
        .=ALIGN(4) ;
    } >EXT_MEM 

    .text :
    {
        .=ALIGN(4);
        *(.text)
        *(.text.*)
        *(.rodata)
        *(.rodata.*)
        .=ALIGN(4) ;
    } >FLASH

ってするだけ。
bbb.cのソースで__attribute__使う必要なんて全くない。元に戻そう。

【ざっくり過ぎる解説】
*(.text) が、全ファイルの.textセクションという意味なんだって。
(カッコ前のアスタリスクが、ファイル名ワイルドカードになってる)

で、そこより前に bbb.o(.text) と書いて、bbb.oの.textセクションを配置しちゃう。
(カッコ前がファイル名、ここはldに渡されるファイル名なので.oで指定)

*(.text) に来たときは、すでにbbbは配置済みだから、未配置の全ファイルがここで配置される。
.rodataも同じ要領でおけ。

ソース側でセクション名変更しようとしてた自分がばかだったよ、ほんとに。

【教訓】
環境やツールをよく理解しましょう(←当たり前、しかもまだ理解しきってない)

【余談】
リンク時にガーベージコレクションのオプションをいれてあると、使ってないセクションが消されちゃうので・・・

それぞれKEEPで括っとくといいかも。
bbb.o(.text) → KEEP(bbb.o(.text))
*(.text) → KEEP(*(.text))
みたいに。.rodataも同じ要領でおけ。



以上、自分用めもでした。

プロジェクトリーダーが責任転嫁しちゃダメじゃん [仕事とプログラムのハナシ]

『前の版で作り込まれた不具合だ』とか
『xxさんが製造した部分でxxしてたから』とか
プロジェクトリーダーが言ったらダメだよ。

それって言外に「だから自分のせいじゃない」って言ってるよね。。。

たしかに要因となりそうな[種]は前の版で植え込まれてたけど、前の版では実装対象外になった機能のバグだよ?
たしかにxxさんがコーディングした部分だけど、あなたの指示通りにコーディングした機能のバグだよ?
しかも、カバーできる試験項目も用意してたのに、不必要と判断したのはあなただよ?

前の版の担当者も、xxさんも反省すべきところはあるんだけど、プロジェクトリーダーやプロジェクトマネージャが責任を負わなかったらダメだよ。
偉そうに指示するだけがプロジェクトリーダーじゃないし、リリース時に承認するだけがプロジェクトマネージャじゃないでしょ。

・・・ということを言いたいんだけど、私はプロジェクトから外れちゃったし、チームも別だから、言えた立場じゃないんだよね。

.NETのSerialPortクラスでハマったこと [仕事とプログラムのハナシ]

.NET Framework (3.5) のSerialPortクラスでハマったことをメモ。
※個々の現象は、ググると詳細な情報(ブログや掲示板)が出てくるので、まとめだけ。

■BeginInvokeでスレッド使っているとき、ポートをCloseしたあとにアプリが落ちる。
 例外発生してるんだけど捕まえづらい。

■データ受信時に、バッファへの書き込み(Windows側が行う)とバッファからの読み出し(自分の書いたプログラムが行う)が運悪く競合すると、受信したはずのデータが読めなくなる。
 そのあとに追加で受信すると、読めなくなったデータが読めるが、追加分が読めない。
 ByteToReadだっけ?の分だけ読めば発生しづらいけど、100%の回避策にはならない。

■USB-232C変換(俗にいうUSBシリアル)のポートをSerialPortクラスでOpenした状態でUSBシリアル(USB側)を引っこ抜くとアプリが落ちる。
 例外発生してて、捕まえられるんだけど、ガーベージコレクションあたりがダメっぽくて、それだけじゃ対処できない。
 キャッチしてから無視すると、その場はokだけど、そのアプリで再度SerialPortクラスを使ったときに落ちる。

■StopBitsプロパティにNoneが設定できない。
 enumに列挙されてるクセに、設定しようとすると範囲外だって例外がスローされる。

■StopBitsプロパティの1.5bitが使えない。
 これは設定できる。けど、使えない。
 クラスじゃなくてWindows標準ドライバの問題っぽい。
 →別のドライバがあれば使えそうな気がするけど、未検証。

■受信イベントの発生タイミングが信用できない。
 『受信したときに発生する』んであって『バッファにデータがあるか』じゃない、ってところまではいい。
 空っぽの状態で受信したのにイベントメソッドに飛ばないってのはどーいうことだ。

■フロー制御が使えない。
 ハードフローがRTSのみってのはどーいうことだ。
 他のピンはどーなってんだ。

■COMポート番号の列挙は簡単だけど、フレンドリーネームの取得がかったるい。
 どっちも取得できれば便利なのに。

こんなもんかなー?
思い出したら追記しようっと。


私の「先生」いわく、CreateFileを使ったほうがいい、だそうな。

ぐーぐる先生はあきる野市がお嫌い? [仕事とプログラムのハナシ]

所用にて、ぐーぐる先生で地図をいじってたんです。

ふと見ると、「あきる野市」の表記がない。
ちゃんと市役所の場所も表示されてるのに、太字の「あきる野市」表記がないんです。
近隣の日の出、檜原、福生、昭島、八王子などは表記があるのに、「あきる野市」表記がないんです。
あきる野市、ぐぐーる先生に嫌われたか??
ぐーぐるまっぷ(2km)に「あきる野市」がない
→(念のため)大きい画像はこちら

なーんて。
表示倍率を一段上げる(詳細にする)と出てくるんですけどね。
ぐーぐるまっぷ(1km)なら「あきる野市」がある
→(念のため)大きい画像はこちら

きっと、広域にすると「あきる野市」という文字列を表記するための横幅が確保できないんでしょう。
なんでだか幅の狭いところに配置されてるので。

あきる野市そのものは横幅がたっぷりあるので、位置を変更するだけって気がするんですけどね。
先生のすることは、たまに理解できません。

またもや男扱いされました。 [仕事とプログラムのハナシ]

昨日のESECで、顔認識のデモをみてきたのですが。。。

20-29才
男性

と判定されました。
あまりにも予想通り過ぎますw


どことは言いませんが、
バザールでござーるのグッズをくれる企業のブースです。

言ってるじゃん


説明員さんが、私以外の方から質問を受けていたのですが、
『男性が女装するとどう判断される?』
との問に
『女性と判断される』
と答えていました。

するってぇと、私は男装してることになるんかなー?

ふははははは
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:moblog

昼だ!休憩だ!! [仕事とプログラムのハナシ]

昼だ!休憩だ!!

・・・と思ったんだけど、空いてるうちに回ろうかな。

RFIDに突撃~
nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:moblog

カメラ忘れた(x_x) [仕事とプログラムのハナシ]

せっかくESECにきたのに、カメラ忘れちゃった。
携帯電話しか持ってないや。

あちゃー(x_x)
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:moblog
前の10件 | - 仕事とプログラムのハナシ ブログトップ