2009年5月25日月曜日

Visioでオブジェクトのテキストを常に水平に表示(に見せかける)

Microsoft のVisioで図を描くとして、オブジェクトにテキストを載せたとします。
通常、オブジェクトを回転させたらテキスト部分も一緒に回転するけど、それを自動で水平に保つやり方。
 

だいぶ前にそういう動作をする図を見て、少々ヘルプなど見てもどうやるかわからなかったのでほっといたんだけど、VISIOの解説書(MSのサイトを分かり易く再編) 見ながらシェイプシートのいじり方を見ていたら分かった。
 

ちなみに試したVisioは2003、資料は2000用だった、多分2007でも似たようなもんだろう。
 
 

デフォルトの動作を確認


 

[caption id="attachment_1323" align="alignnone" width="377" caption="画像:オブジェクト+テキスト"]画像:オブジェクト+テキスト[/caption]
 

矢印を作ってテキストを乗っける、これに角度をつけていくと、
 

[caption id="attachment_1325" align="alignnone" width="313" caption="画像:角度をつける"]画像:角度をつける[/caption]
 

このくらいなら見れる、が、もう少し角度をつけると...
 

[caption id="attachment_1326" align="alignnone" width="285" caption="画像:90度を超えて回転"]画像:90度を超えて回転[/caption]
 

読みづらっ。
 

こういうのは 「テキスト ブロック ツール」を使ってテキスト部分だけ回転してあげればいいんだけど、
 


[caption id="attachment_1324" align="alignnone" width="347" caption="画像:テキストを水平に表示"]画像:テキストを水平に表示[/caption]
 

読みやすくすることはできたが、毎回調整するのも面倒。
これをシェイプシートを調整することで、矢印を少々回転させても、テキストが水平方向に保たれるようにできる。
 
 


シェイプシートを開く


たまたま見つけたVISIOの解説書を読んで、Visioはドロー系で、オブジェクトはベクタで管理しているというのを認識した。そういえばそうなんだよなー。
テンプレ使って、適当に線引いてりゃそれなりの図が描ける、GUIが楽なので普段全然意識しなかったな。
 

で、オブジェクト情報は シェイプシート というのに保管されていると。
調整したいオブジェクトを選択して、ファイルメニューからシェイプシートを開く。
 

[caption id="attachment_1327" align="alignnone" width="310" caption="画像:シェイプシートの開き方"]画像:シェイプシートの開き方[/caption]
 

[caption id="attachment_1328" align="alignnone" width="738" caption="画像:シェイプシートを開いた"]画像:シェイプシートを開いた[/caption]
 

結構いじり甲斐のありそうなものが出てきたな。
 
 

シェイプシートで、テキスト領域の動作を変更する


で、シェイプシート内の「Text Transform」セクションの 「TxtAngle」という行がテキストブロックの向きを決定している。
しかし初期状態では「Text Transform」セクションが表示されていなかったり(※)するので、セクションを手動で追加する。
※ 「テキスト ブロック ツール」で一度でも角度を調節していれば表示されている。
 

シェイプシートの適当なところで右クリック、操作したいセクションを挿入する。
[caption id="attachment_1329" align="alignnone" width="663" caption="画像:セクション追加01"]画像:セクション追加01[/caption] 
 

[caption id="attachment_1330" align="alignnone" width="327" caption="画像:セクション追加02"]画像:セクション追加02[/caption] 
 

ここでは「Text Transform」やね。
 

[caption id="attachment_1332" align="alignnone" width="670" caption="画像:TxtAngle 行"]画像:TxtAngle 行[/caption]
 

「TxtAngle」があることが確認できる。
ここを変更することでテキストブロックの角度を調節することができるんだが...
 
 

テキストブロックは、相対座標で管理されている


"TxtAngle=0" なら、これを保護して常に "0" になるようにすればいいんじゃないかと思いきやそうではない。
実際に矢印を回転させるとわかるけど、ここは0から動かない。オブジェクトのベースからの相対的な角度という扱いなので、ベースが斜めなら斜めに表示される。
 
GUIからテキストブロックの回転を保護しても、ベースにつられてくるくる回るのはこういう仕組みだからとここでやっと気付いた。。もしかして常識なのかもしれないが、数字で見るまでは気付かないもんだ。
 

ではどうすりゃいいかってのが、『ベースが x度 傾いたらテキストは反対向きにx度( -x度 )傾ける。』というやりかた。
 

このベースの角度に対応するのが、「Shape Transform」の「Angle」、これを利用て常に角度を自動調整させないと、テキスト水平の野望は達成できない。
なるほどねー、"=GUARD(0 deg)" とかではできないわけだ。
 
 


テキストブロックの角度を、シェイプの角度に対応させて反対に傾ける


「Shape Transform」の「Angle」、これはそのまま変数として利用できるので「TxtAngle」に突っ込む。
 


[caption id="attachment_1333" align="alignnone" width="254" caption="画像:TxtAngle調整01"]画像:TxtAngle調整01[/caption]
 

[caption id="attachment_1324" align="alignnone" width="347" caption="画像:テキストを水平に表示"]画像:テキストを水平に表示[/caption]
 

これまでを踏まえて、「TxtAngle」 に"-Angle" と入力。これでテキストブロックはオブジェクトと逆向きに回転してくれ、結果的に水平に表示される。
 
 

他の要素を評価して、左右反転にも対応


折角なのでちょっと応用する、"TxtAngle = -Angle" のまま、左右反転してみよう。
[caption id="attachment_1334" align="alignnone" width="288" caption="画像:対策なし左右反転"]画像:対策なし左右反転[/caption]
 

(ノ∀`)アチャー
左右反転したということで、"-Angle"では反対の反対で2倍なのだ。
 

シェイプシートでみると、『オブジェクトを左右反転させる=「Shape Transform」の「FlipY」フラグTrue』 ということになっている。
[caption id="attachment_1335" align="alignnone" width="655" caption="画像:左右反転のフラグ"]画像:左右反転のフラグ[/caption]
 

ならこれをチェックさせて、TxtAngleを調整させればOKだというわけで。
[caption id="attachment_1336" align="alignnone" width="656" caption="画像:分岐ありのTxtAngle"]画像:分岐ありのTxtAngle[/caption]
 

適当に入れたIF文だったが...
 

[caption id="attachment_1337" align="alignnone" width="258" caption="画像:左右反転してもテキスト水平"]画像:左右反転してもテキスト水平[/caption]
 

全く普通に動作してくれた、もっと考慮すべき条件はいろいろあると思うけど、大体これの応用でいけそうだ。
 
 
 


Visioの情報は探しにくい?


VISIOの解説書 の序文にもあるが、ここらは全部MSの公開しているドキュメントに載っているはずなんだけど、えらい探しにくい。
昔調べた時は、全然わかんなかったもんなぁ。
 

ということで、この記事も間接的にVisioの情報にたどり着くヒントになったら良いなということも込めて作成。
よりよいやり方は公式参照。
 

2009年5月16日土曜日

Solaris10にNRPEを仕込んでNagiosからやりたい放題

メモエントリ
 


Solaris10にNRPEを入れる際、ちまちまと調べながら、とりあえず動作 ⇒ SSLで動作 ⇒ inetd 経由で動作 ⇒ TCPラッパー追加
とようやく完成にこぎつけたが手順残すの面倒だと思っていたら、WEBにあった。
 

Configuring Nagios Plugins & NRPE on Solaris 10 < < UtahSysAdmin.com
 

あれをカットしなくてもできるとか、 inetadm の使い方とかとても参考になった。
 

2009年5月14日木曜日

『Microsoft スキル チャージ プログラム ‐ 第 3 弾 「Web サーバー導入キッ ト」』、音沙汰ないや

ちょっとまえに書いた記事で、MSの 「Web サーバー導入キット」 を応募したと書いたが特に連絡ない。
 
 

やっぱり送信が締め切りギリギリすぎたか...
先着100名だったらしいし、っていうか営業時間でいえば終わっていた気もしなくもない。
 

借りた後の皮算用はいっぱいしたんだけどなあ、残念。

2009年5月8日金曜日

PowerShellでDDNSサービスを更新(3)

PowerShellでDDNSサービスを更新(1)PowerShellでDDNSサービスを更新(2) 、の続き。
ddo.jp に対してPowerShell で更新をかけようというもの。
 
 

HTTPでクエリストリング付きのGETを送る


PowerShell から WebClient クラスを使ってクエリ文字列をくっつけたGETはどうすればいいのか。
 

単純にくっつけてみる



[sourcecode language='sh']# 引数格納、URL形式
param([string]$url)


# 途中で例外を吐いたらここに飛び、抜ける
trap [Exception] {
echo $error[0].exception
break
}


# クエリ文字列を作成
$query = "?dn=hoge.example.jp&pw=piyopiyo"


# .NetFramework の WebClient クラスを拝借
$webCli = New-Object System.Net.WebClient

# コンテンツを取得、無理やりくっつけてみる
$body = $webCli.DownloadString($url + $query)
[/sourcecode]

で、実行してHTTPで送られている内容をキャプチャ。※テストなのでhostヘッダが "sawano.members.icraft.jp"
GET /index.html?dn=hoge.example.jp&pw=piyopiyo HTTP/1.1
 
Host: sawano.members.icraft.jp
Connection: Keep-Alive


あら、これでも送れてるのね。
しかし釈然としない、WebClient クラスには QueryString とかいうプロパティがあるみたいので、それを使うのが普通っぽい。
 
 


WebClient.QueryString で


はて、QueryString を設定するにはどうしたらいいのかね。
連想配列で突っ込んでみたら、案の定怒られた。
[sourcecode language='sh']# 連想配列でクエリの内容を設定してみる
$query = @{dn = "hoge.example.jp";pw = "piyopiyo"}
$query

# .NetFramework の WebClient クラスを拝借
$webCli = New-Object System.Net.WebClient
$webCli.QueryString = $query[/sourcecode]
 

Name Value
---- -----
dn hoge.example.jp
pw piyopiyo
"QueryString" の設定中に例外が発生しました:
""System.Collections.Hashtable" を
"System.Collections.Specialized.NameValueCollection" に変換できません。"

 

ほう、左様か。NameValueCollection ってのを使えばいいの?
 

[sourcecode language='sh']# 引数格納、URL形式
param([string]$url)


# 途中で例外を吐いたらここに飛び、抜ける
trap [Exception] {
echo $error[0].exception
break
}

# NameValueCollection をマニュアル通り定義してみる
$query = New-Object System.Collections.Specialized.NameValueCollection

$query.add( "dn", "hoge.example.jp" )
$query.add( "pw", "piyopiyo" )


# .NetFramework の WebClient クラスを拝借
$webCli = New-Object System.Net.WebClient

# WebClient の QueryString プロパティを設定
$webCli.QueryString = $query

# コンテンツを取得
$body = $webCli.DownloadString($url)[/sourcecode]


で、実行とHTTPキャプチャ。
GET /index.html?dn=hoge.example.jp&pw=piyopiyo HTTP/1.1
 
Host: sawano.members.icraft.jp
Connection: Keep-Alive


できたようだ。
 
 
 

これでややこしそうなところは一通り準備がそろった。イベントログ書き出し・メールくらいは如何様にでもなろう。
 

終わりにしようかどうしようか。

2009年5月7日木曜日

MySQLテーブルのリカバリ、WordPress 真っ白

メモエントリ
 

Wordpressを管理画面からいじっていたら、突然インストーラの画面になった。

DBを見に行ったら下記エラー、テーブル飛んだΣ(-_-;) !?

ERROR 1016: Can't open file: 'wp_options.MYD'. (errno: 145)
 
 

他のテーブルは大丈夫、wp_options がおかしかったからインストーラが起動したのか、うーん。
 

MySQLのコンソールからとりあえずチェックコマンドを実行してみる
CHECK TABLE wp_options;
出力には "Table is marked as crashed" と含まれている、イヤだなあもう。
 
 

REPAIR TABLE wp_options;
としたらなおった。
 

PowerShellでDDNSサービスを更新(2)

PowerShellでDDNSサービスを更新(1) の続き。
ddo.jp に対してPowerShell で更新をかけようというもの。
 

IPアドレスが更新されているかチェック


毎回更新していると相手さんに負荷がかかるので、IPアドレスが登録時のものと変わっているかチェックする。
 
IPアドレスをゲットして、ローカルにおいたテキストに保存しつつ更新というシナリオ。
 

"get_ipandtest.ps1" というスクリプトを作成。
[sourcecode language='sh']# 引数格納、URL形式
param([string]$url)

# IPアドレスの書式を正規表現で定義しておく
$IPFmt = "^(25[0-5]|(2[0-4]|1[0-9]|[1-9])?[0-9]\.){3}(25[0-5]|(2[0-4]|1[0-9]|[1-9])?[0-9])$"


# 途中で例外を吐いたらここに飛び、抜ける
trap [Exception] {
echo $error[0].exception
break
}

# テキストファイルに保存していたIPアドレスを取得
# なかったら0.0.0.0 などを突っ込む
if (Test-Path myAdd.txt) {
$testIP = Get-Content myAdd.txt -TotalCount 1 -encoding UTF8
} else {
$testIP = "0.0.0.0"
}

# テストIPのチェック用
echo $testIP

# .NetFramework の WebClient クラスを拝借
$webCli = New-Object System.Net.WebClient

# コンテンツを取得
$body = $webCli.DownloadString($url)

# 改行を消しちゃう
$body = $body -replace "`n", ""

# コロン区切りで配列に格納、DDOでは2つ目がIPアドレス
$ip = $body.split(":")



# IPアドレスの書式をチェック
if ($ip[1] -match $IPFmt) {
echo "IPアドレス ゲット成功デース"
} else {
Write-Output "ゲットシタモノハ IPアドレスデハ アリマセーン"
break
}

echo $ip[1]


# グローバルIPアドレスが変わったかどうかチェック
if ($ip[1] -eq $testIP) {
echo "IPアドレスハ カワッテマセーン"
} else {
Write-Output "IPアドレス カワッテマス、テキスト更新シマース"
$ip[1] | Out-File myAdd.txt -encoding UTF8
}
[/sourcecode]

echo と Write-Output が混ざっているのには特に意味はなく、両方できるんだなーというのを試している。
 
 

動作させてみる


初回動作では myAdd.txt がないので、0.0.0.0 を相手に比較。
 
 

PS > ./get_ipandtest.ps1 http://info.ddo.jp/remote_addr.php
0.0.0.0
IPアドレス ゲット成功デース
125.4.***.***
IPアドレス カワッテマス、テキスト更新シマース

 

2回目の動作では、myAdd.txt があるのでそれと比較してグローバルIPが変わっているかチェックさせる。
PS > ./get_ipandtest.ps1 http://info.ddo.jp/remote_addr.php
125.4.***.***
IPアドレス ゲット成功デース
125.4.***.***
IPアドレスハ カワッテマセーン

 

あとは クエリストリングつけて、HTTP で GET をするだけだ。
さらにつづく。

2009年5月1日金曜日

PowerShellでDDNSサービスを更新(1)

自宅に WindowsでWebサーバを立てる羽目 になりそうだが、ドメインもってません。
 

ダイナミックDNSサービスでも使うかと思うので、使い方を調べるため昔の同僚が使っていた、 ddo.jp を参照、HTTPでGETすれば更新できるとわかった。
ここをつかうならDiCE とか頼る必要ないな、手作りしてみよう。
 

仕組みを考えとく



  • 自分のとこのIPが変わってるか調べる

  • 変わってたらDDNS更新をかける

  • 更新の成功失敗はイベントログに書き込む

  • 更新成功時はメールも投げちゃう


と、こんな感じか。
 
 

とりあえず自分のIPゲット


DDO使うとしたらば、そこが提供しているIP確認のURLを使えばサービスの死活監視もできていいかも知れない。
 

PowerShellで指定したURLのコンテンツを出力してみる、エラーは全部止めちゃえばいいや。
# 引数格納、URL形式
param([string]$url)
 
# 途中で例外を吐いたらここに飛び、抜ける
trap [Exception] {
echo $error[0].exception
break
}
 
# .NetFramework の WebClient クラスを拝借
$webCli = New-Object System.Net.WebClient
 
# コンテンツを取得
$body = $webCli.DownloadString($url)
 
# コンテンツ出力
echo $body

と、こんなもん?実行してみる。
 

PS > ./get_ip.ps1 http://info.ddo.jp/remote_addr.php
 
 REMOTE_ADDR:125.4.***.***


うーむ微妙な出力...
ちょっと調整しよう。
 

# 引数格納、URL形式
param([string]$url)
 
# 途中で例外を吐いたらここに飛び、抜ける
trap [Exception] {
echo $error[0].exception
break
}
 
# .NetFramework の WebClient クラスを拝借
$webCli = New-Object System.Net.WebClient
 
# コンテンツを取得
$body = $webCli.DownloadString($url)
 
# コンテンツ出力
# echo $body
 
# 改行を消しちゃう
$body = $body -replace "`n", ""
 
# コロン区切りで配列に突っ込む
$ip = $body.split(":")
 
# 出力して確認
echo $ip[0]
echo $ip[1]

IPアドレス部分だけ切り出すように、文字列の操作をちょっと入れてみた。
 

PS > ./get_ip.ps1 http://info.ddo.jp/remote_addr.php
 REMOTE_ADDR
125.4.***.***


これで "$ip[1]" にIPアドレスが綺麗に入った。
ローカルにテキストで保管して、数時間おきに比較しよう。
 
 

つづく。

wget で取得した内容を標準出力

メモエントリ
 

wget -O - 'http://sawano.members.icraft.jp/'

wget の "-O" オプションは、取得した内容を引数に指定したファイルに保存する。
 

このとき ファイル指定の変わりに "-" ハイフン一丁指定してあげると、標準出力にでてくる。
 
 

ちょいと man を引用
-O file
--output-document=file
The documents will not be written to the appropriate files, but all will be concatenated
together and written to file. If - is used as file, documents will be printed to standard
output, disabling link conversion. (Use ./- to print to a file literally named -.)
 
Note that a combination with -k is only well-defined for downloading a single document.

 

使いどころは限定的、動作確認とか。