8.9.10

[Windows 7編]ネットワーク設定を標準で使ってはいけない

 Windows 7のネットワーク設定を標準で使ってはいけない。標準では「SNP(Scalable Networking Pack)」と呼ばれるネットワークを最適化する機能が有効化されている。この「SNPが有効化」されている設定のままPCを動作させると、ネットワーク処理が不安定になったり、ネットワーク処理とは関係ないアプリケーションの処理に影響を与えたりする可能性があるからだ。

 SNPとは、通常はPC上のプロセッサが行っているネットワーク処理を、PC内部のNIC(ネットワークインタフェースカード)に担当させるなどしてプロセッサの負荷を下げる機能だ。

ハードにネットワーク処理を分担させるSNP

 SNPは三つの機能からなる。「SNPが有効」とは三つのうち、少なくとも一つが有効化していることを指す。

(1)TCP Chimney Offload
 TCPのネットワーク制御をプロセッサからNICにオフロード(負荷を軽減)する機能。この機能を有効にすると、大量データの送信処理や、通信データの信頼性をチェックするための値(チェックサム)の計算などを、NIC上のTOE(TCP Offload Engine)と呼ぶモジュールで処理する。プロセッサにかかるネットワーク処理の負荷を軽減できる。

(2)Receive Side Scaling(RSS)
 TCPの受信制御を効率化する機能。この機能を有効にすると、通常は一つのプロセッサコアで行う受信制御を、複数のコアが分担して行うようになる。特定のプロセッサコアへの負荷を分散できる。

(3)Network Direct Memory Acc

ess(NetDMA)
 NICからのメモリーアクセスを効率化する機能。この機能を有効にすると、NICに処理をオフロードしてもプロセッサを経由しなければできなかったメモリーアクセスが、直接できるようになる。プロセッサの負荷の軽減と、NICでの処理の高速化が図れる。

 以上のような機能を使うと、プロセッサの負荷を軽減し、ネットワークのパフォーマンスはより最適化されるはずだ。しかし実際には、SNPを有効化すると、特定のネットワーク操作でパフォーマンスが低下するといった不具合が発生するケースが起こっている。また、SNPを有効化していたことで、ネットワークパケットの取りこぼしが発生し、正常に通信できないという問題も発生している。

 そのほか、アプリケーションが正常に働かなくなることもある。その背景には、SNPの三つの機能が「カーネルモード」で処理されることがある。カーネルモードとは、Windows 7で管理するすべてのハードウエアに直接アクセスできる高い特権

のこと。カーネルモードで動作するということは、メモリーにも自由にアクセスできるということだ。

 NICやネットワークドライバが大量のメモリー領域を占有することもできてしまう。もしそうしたことが起これば、メモリーリークが発生したり、アプリケーション用のメモリー領域が不足したりして問題が発生する。

 残念ながら現在(2010年9月)のところ、SNPを安心して使える状況にあるとはいえない。今後の改善は見込めるが、システムの安定運用を重視するなら、当面はSNPの利用を避けたほうがよさそうだ。どうしても使いたい場合は、ハードウエ

アベンダーが提供しているネットワークドライバやNICが正常に作動し、さらにそれらとマイクロソフトが提供するWindows 7との連携がうまくいくかどうかを検証しておこう。

コマンドでSNPを無効化

 SNPを無効化するには、まずSNPがシステムで使用されているのかどうか確認するところから始める。Windows 7の「コマンドプロンプト」で以下のコマンドを入力すると、SNPの各機能が有効化され

ているかどうかを確認できる。

netsh int tcp show global

 確認するのは、「Receive-Side Scaling状態」「Chimney オフロード状態」「NetDMA 状態」の三つだ(図1)。ここが「enabled」「automatic」となっていたら、有効になっていることを示す。有効になっていると分かったら、コマンドプロンプトに以下のコマンドを使用してSNPを無効化する。

図1●「netsh int tcp show global」の実行 結 果(Windows 7のネットワークの標準設定)

・TCP Chimney Offload の無効化

netsh int tcp set global chimney=disabled

・Receive-Side Scaling(RSS)の無効化
netsh int tcp set global rss=disabled

・Network Direct Memory Access(NetDMA)の無効化
netsh int tcp set global netdma=disabled

 上記のコマンドを入力した後は、前述のコマンドでシステムの設定を確認し、状態がいずれも「Disabled」になっていれば無効化が完了する。さらに、ハードウエア側の設定変更も必要になる。ハードウエアベンダーが提供する情報を参考にして無効化するのも忘れずに行おう。

瀧澤 俊臣(たきざわ としおみ)
日本ヒューレット・パッカード株式会社 テクノロジーサービス事業統括 サポートデリバリ統括本部 グローバルソリューションセンター本部 ミッションクリティカルサポート二部 コンサルタント
1996年、日本DEC入社。コンパックコンピュータを経て、現在、日本ヒューレット・パッカード勤務。IAサーバ、マイクロソフト製品をメインとしたミッションクリティカルなお客様向けに、運用提案や保守など、システム全般にわたるトータルサポートを提供している。


http://itpro.nikkeibp.co.jp/article/COLUMN/20100824/351391/

8.6.10

オラクル海外データインポート


システムの環境変数 に NLS_LANGを設定

28.4.10

ハードディスクやSSDを最適化する - Windows 7実践ナビ:ITpro

ハードディスクやSSDを最適化する - Windows 7実践ナビ:ITpro: "ハードディスクやSSDを最適化する
記事一覧へ >>
5 4 3 2 1 <<
デフラグやキャッシュの機能を無効にする

 まず自動デフラグのオフは、図4の「ディスクデフラグツール:スケジュールの変更」ダイアログで、「スケジュールに従って実行する」のチェックを外せばよい。「SSD」も「デフラグ」は行った方が理論上はよいはずだが、毎週はさすがに多すぎる。1カ月単位でチェックして、もし断片化が20%を超えているようなら手動で実行する程度でよいだろう。

 次に「Pefetch」の機能を無効にしてみよう。「スタート・メニュー」の「検索ボックス」に「regedit」と入力し、検索結果をクリックしてレジストリ・エディタを起動する。レジストリ・エディタの画面左側のツリーから「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters」と階層をたぐり、その右側に表示される「EnablePrefetcher」をダブルクリックする(図9)。表示されたダイアログ内の値が有効を表す「1」になっているので、「0」に変更すればPrefetch機能が無効になる。
図9●Prefetch機能をオフにする
Prefetch機能をオフにするには、レジストリ・エディタからHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParametersを開き、右側の項目にある「EnablePrefetcher」の値を0にする。
[画像のクリックで拡大表示]

 さらに「SuperFetch」を無効にしてみよう。「スタート・メニュー」にある「検索ボックス」に「サービス」と入力し、その検索結果から「ローカルサービスの表示」をクリックする。表示された画面の右側の一覧[SuperFetch]サービスをダブルクリックしてプロパティのダイアログを開き、[全般] タブの[スタートアップの種類] を確認する(図10)。ここが[自動(遅延開始)]になっていて、サービスが「開始」されているようなら「無効」を選択する。これで、SuperFetch機能が無効になる。
図10●「SuperFetch」機能を無効にする
一覧表示されたサービスの中から[SuperFetch]サービスのプロパティを開き、サービスが開始しているようなら「無効」に変更する。
[画像のクリックで拡大表示]
「Trim」コマンドの発行を確認する

 最後に、Windows 7で追加された「Trim」コマンドについて紹介しよう。「SSD」は、データを書き込む際に、前のデータを消去してから書きこむ。つまり、データが必要なくなった時点で先に消去してしまえば、必要になった際に消去してから書き込むより効率が上がる。そこで、Windows 7では必要なくなったブロックを「Trim」コマンドでデバイスに送り、消去を促している。

 Windows 7でSSDを利用しているユーザーが「Trim」コマンドを発行しているか確認したい場合は、管理者権限で起動したコマンド・プロンプトで「fsutil behavior query DisableDeleteNotify」と入力して[Enter]キーを押す(図11)。「DisableDeleteNotify =」の後が「1」なら「無効」、「0」なら「発行」していると確認できる(図11)。
図11●「Trim」コマンドの発行を確認する
管理者権限で起動したコマンド・プロンプトで「fsutil behavior query DisableDeleteNotify」と入力して、「DisableDeleteNotify = 0」と表示されればTrimコマンドが発行されている。
[画像のクリックで拡大表示]"

31.3.10

Oracle 11gからデフォルトでパスワード有効期限付きに - + YOSHIKI & Violet UK FAN SITE -Blind Tears- 管理人の日記 +

ORA-28001のパスワード期限切れが発生していた。ネットで色々調べたところ、Oracle 11gからデフォルトでパスワードに有効期限180日が付いていることが判明。

10gまで通り(パスワードは無期限有効)にする設定、ロックされたアカウントを復旧させる設定をメモっておく。
1. SQLPlusを起動:
   sqlplus /nolog
2. SYSDBAでログイン:
   conn /as sysdba
3. アカウントのプロファイルがデフォルトのままである場合は、デフォルトプロファイルの設定でパスワードを無期限有効に変更:
   alter profile default limit password_life_time unlimited;
4. ユーザのパスワードを再設定:
   alter user ユーザ名 identified by 新パスワード;
5. ロックされていたアカウントをロック解除
   alter user ユーザ名 account unlock;


これでアカウントは復旧したのだが、OEMが依然としてログインできない状況のまま。。インスタンスへのエージェント接続部にORA-28001が表示されたまま。
原因はOEMで使用されるアカウント(SYSMAN, DBSNMP)についても同様にパスワードの有効期限切れが発生していたためだった。これらについてもパスワードを再設定する必要あり。
1. sqlplus /nolog
2. SYSMANでログインすると、パスワードの再設定を要求されるので、再設定
  connect sysman/旧パスワード
3. DBSNMPについても同様
  connect dbsnmp/旧パスワード"

24.2.10

2007-05-07 - Cassiopeiaの日記

2007-05-07 - Cassiopeiaの日記より
: "■[Excel VBA]Excelのコンテキストメニュー(右クリックメニュー)に独自のメニューを追加する。

■使用上の注意

RemoveCellMenu()で追加したメニューを削除しないと、どんどん同じメニューが追加されてしまいます。 あなたが実際に使うマクロを創るときには追加したメニューを自動的に削除してから終了するようにするなり、すでに独自メニューがあるときはさらに独自メニューを追加しないようなコードを追加してください。

'AddCellMenu()で独自のメニューをコンテキストメニュー
'(右クリックメニュー)に追加する。
'RemoveCellMenu()で追加したメニューを削除する。


Sub AddCellMenu()
Dim MyCellMenu As CommandBarControl

Application.CommandBars('Cell').Controls.Item('切り取り(&T)').BeginGroup = True
'区切り線を追加しています。

Set MyCellMenu_01 = CommandBars('Cell'). _
Controls.Add(Type:=msoControlButton, before:=1)

With MyCellMenu_01
.Caption = '電卓起動!'
.FaceId = 50
.OnAction = 'ExecCalc'
End With

Set MyCellMenu_02 = CommandBars('Cell'). _
Controls.Add(Type:=msoControlButton, before:=1)

With MyCellMenu_02
.Caption = '数字だったら2倍する!'
.FaceId = 102
.OnAction = 'NumW'
End With

End Sub

Sub RemoveCellMenu()
CommandBars('Cell').Controls.Item('電卓起動!').Delete
CommandBars('Cell').Controls.Item('数字だったら2倍する!').Delete
CommandBars('Cell').Controls('切り取り(&T)').BeginGroup = False
End Sub

Sub ExecCalc()
Shell 'calc'
End Sub

Sub NumW()
If IsNumeric(ActiveCell.Value) Then
ActiveCell.Value = ActiveCell.Value * 2
Else
'zzz...
End If
End Sub"

セル右クリックメニュー

次のプロシージャは、セルのコンテキストメニューを追加するものである。セルの右クリックから[売上データ読み込み]を選択したとき、「Proc_Uriage1」プロシージャが実行されるように、コマンドを割り当てたい。

Sub Sample()
   With Application.CommandBars("Cell").Controls.Add
      .Caption = "売上データ読み込み"
      .OnAction= "Proc_Uriage1"
      .Visible = True
   End With
End Sub

22.2.10

プロジェクトのコピー

プロジェクトのコピー: "ソリューション エクスプローラで Web プロジェクトをコピーするには

1. ソリューション エクスプローラで、コピーする Web プロジェクトを選択します。
2. [プロジェクト] メニューの [プロジェクトのコピー] をクリックします。
3. コピー先の Web サーバーと新しい URL を指定します。"

15.2.10

EXCEL マージしたセルの行の高さ調整

行・列の結合具合に関係なく矩形選択したセルの中に全部の入力値が表示できるよう行高を調整します。
やってることは、単一セルにしてしまい、最適な行高を調べ、それを選択した行の高さに配分し再度結合を行っています。列の結合を行っている場合は、フォントの具合が微妙で、1行分余分になってしまうことがあります。現時点では回避できていません。(たまに起きます)
nmHgt = ActiveSheet.StandardHeight でシートに設定された標準の高さを使っていますが、直接数値を入れても(例えば13.5とか、そのシートの固有な高さ)いいです。
標準モジュールに貼り付けて、ツール→マクロ→マクロ→オプションでZとかのキーを割り当てると、調整したいセル範囲を選択し、Ctrl+Shift+Zキーでマクロが動きます。

参考になればと思い作って見ました。(行数を減らすためにかなりもがいています。マルチステートメントをばらしてインデントをつければ見やすくなると思います)

Public cWd() As Single '選択範囲の各列の幅

Public Sub AutoFitEx()
Dim nmHgt As Single '標準行高
nmHgt = ActiveSheet.StandardHeight '値をセットしてもいい
Dim rg As Range '選択セル範囲
Dim intHgt, fitHgt As Single '初期の行高、調整した行高
Dim mgRCt, mgCCt As Single '結合された行数、列数
Dim rCt, cCt As Integer '行・列カウンタ
Dim wkHgt, dsHgt As Single '必要な行高、計算上の行高
Application.ScreenUpdating = False
Set rg = Selection
'=== 結合解除 ===
mgRCt = rg.Rows.Count: mgCCt = rg.Columns.Count
If mgRCt > 100 Then Exit Sub '余り多数の行・列を選択したら処理しない
ReDim cWd(mgCCt)
For cCt = 1 To mgCCt '各列の幅を読み込む
cWd(cCt) = rg.Cells(1, cCt).ColumnWidth
cWd(0) = cWd(0) + cWd(cCt)
Next
rg.Select: rg.HorizontalAlignment = xlLeft: rg.VerticalAlignment = xlTop
rg.MergeCells = False
'=== 1セルに収めて必要な高さを知る ===
rg.Cells(1, 1).Select: intHgt = nmHgt
With Selection
.ColumnWidth = cWd(0): .WrapText = True: .Rows.AutoFit: fitHgt = .Height
End With
'=== 必要な高さを各行に等分する ===
If fitHgt / intHgt > mgRCt Then
For rCt = 1 To mgRCt
wkHgt = fitHgt * 100
dsHgt = (Int(wkHgt / (75 * mgRCt)) - (wkHgt Mod (75 * mgRCt) <> 0)) * 0.75
rg.Cells(rCt, 1).RowHeight = dsHgt
Next
Else
For rCt = 1 To mgRCt: rg.Cells(rCt, 1).RowHeight = nmHgt: Next
End If
'=== 列の幅を元に戻し結合する ===
For cCt = 1 To mgCCt: rg.Cells(1, cCt).ColumnWidth = cWd(cCt): Next
rg.MergeCells = True '再度結合する
Application.ScreenUpdating = True
End Sub