Mr.Tの場所

特攻野郎Aチームじゃないよー

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  253  : 記事  0  : コメント  982  : トラックバック  54

ニュース

  • 性別:男
  • 猫1:まる
  • 猫2:もろ
  • 猫3:にゃん左部郎
  • タバコ:男は黙ってJPS
[わんくま同盟] C#, VB.NET 掲示板
フィードメーター - Mr.Tの場所

書庫

日記カテゴリ

2010年3月11日 #

Mr.Tです、こんにちは。

 

Excelファイルは、MDIといって複数のブックが表示できるようになっています。

なので、そのウィンドウの位置情報もファイル中にもっています。

 

SXGA(1280*1024)の画面で作成したExcelファイルを、XGA(1024*768)で見たとき、そのブックの位置情報
は、補正しないようです。(Excel2007で確認)

そのため、高い解像度でウィンドウの下部、つまり下のほうに隠れるように配置しておくと、それより低い解像度で
範囲外の位置情報であった場合、開いたときには何も表示されない状態に見えてしまいます。

このときは、ファイルのウィンドウにスクロールも表示されないので、ファイルが壊れているんじゃないかなどと
勘違いしてしまいそうですが、実際はそういう原因もあるようです。

本来的には、作成した人にきちんとした場所で表示されるようにしてもらうなどするのがベストですが、
見る側の対応としては、表示→ウィンドウの整列、で見れるようになります。

 

普通はありえないのかもしれないですが、MDIウィンドウを最大化して使わない人はご注意のほどを。

posted @ 17:55 | Feedback (0)

2010年3月2日 #

Mr.Tです、こんにちは。

 

#この記事は、基本、Excel2003を対象にしておりますが、Excel2007のケースへの対応方法もあわせて記載しております。

#この方法は、半ばイレギュラーな対応と考えてもらった方がよいかと思いますので、万一ご利用の環境でもうまくいかない
#というケースがもしかしたらあるかもしれません。

 

ツールバーに、独自のマクロを登録(アイコンで表示)させて、色々なExcelファイルで利用したいというのは、よくあることではないか
と思います。

 

例えば、こんな感じの状況です。

Excelファイル A 実行したいマクロ名 「計算実行()]
Excelファイル B 実行したマクロ名 「計算実行()」

ExcelファイルA、Bを実行するには、マクロ名「計算実行」を行う必要があります。

ただし、名前は一緒でも、処理されるファイルが別々です。また、マクロの中身もちょっとだけ違います。

それでも、実行するボタンは一緒のボタンから実行したいのです。

 

Excelファイルのツールバーには、そのためのボタンを登録して、どちらのファイルを開いても、

ファイルAならファイルAの計算実行マクロ、ファイルBならファイルBの計算実行マクロを実行する必要があるのです。

 

実は、ツールバー登録するとそのボタンには、「ファイルパス!マクロ名」もしくは、「ファイルパス!シート名.マクロ名」
という情報をツールバーの中に持ちます。

#マクロは、標準モジュールに書くか、Sheetに書くかの違いですが、Sheetに書いた場合は、シート名の指定まで必要です

 

ボタンそのものに、どこのマクロを実行するかという情報が埋め込まれてしまうため、このままでは片方のファイルにある
マクロしか実行できません。

更に云えば、そのExcelファイルは、置き場所を変えてしまうと、ツールバーのボタンも実行できずにエラーになります。
#マクロが見つからないとか、なんとかいうエラーになる

 

ボタンに割り当てられるマクロは、マクロ名だけにしたいのに、パスがどうしても入ってしまう!
これをなんとかできないかな、というのが今回の本質的な趣旨です。


そこで、利用できるのが、アドインです。
アドインは、別段プログラムを書く必要はありません。

 

----実際の作業---

ツールバーにマクロを登録させるのは特に難しくありません。

「Excel アドイン 作成」で検索すると、すぐに作り方を理解できます。

http://members.at.infoseek.co.jp/kenchan_h/index15.html

http://www.asahi-net.or.jp/~ef2o-inue/haifu/sub06_030.html

 

  1. 目的のマクロだけを保存したExcelファイルを、AddInフォルダに拡張子、xlaとして保存するだけです。
    メニューバー→ツール→アドインの中に、今保存したファイル名が表示されますので、チェックをいれておきます。
  2. チェックを入れてから、今度はツールバーに登録したマクロ実行のボタンに対して、マクロ名を割り当てます。
    ただし、マクロ名は、マクロ選択ウィンドウには出てきませんので、入力欄には自前でマクロ名(シート名.マクロ名)を
    入力してください。
  3. これで登録できたら、アドインのウィンドウで、先ほどチェックをいれたものを外します。さらに、AddInフォルダにある、保存したファイルを削除します。
  4. これで、ツールバーには、マクロ名だけの情報を持ったボタンが作成されました。

※保存先については、アドイン作成の際に参考にしたサイトなどで確認してください。

これで、ExcelファイルAのマクロも、ExcelファイルBのマクロも、アクティブになっているファイルのマクロが優先されて実行されるはずです。

 

もし、他のパソコンでもこのツールバーを使用したいというのであれば、Excel11.xlbというファイルがDocument And Setting/(User固有名)/Application Data/Microsoft/Excel/にあります。それをコピーして使ってください

 

【Excel2007】の場合は、クイックアクセスツールバーに登録することになります。

まずは、クイックアクセスツールバーに実行したいマクロを登録してください。

次に、Excel.qatというファイルを探してください。

そのファイルをメモ帳などで開くと、XMLファイルになっていることがわかります。そこで、マクロ名が指定されている箇所がありますのでそこを探してください。そのマクロ名には、同じようにパスが含まれているので、そのパスを消して上書きコピーすればOkです。

 

posted @ 13:28 | Feedback (2)

2010年2月17日 #

Mr.Tです、こんにちは。

 

仕事でExcel 2003とExcel 2007の両方で使用するVBAコードを書いていたときに、ぶちあたった問題がとりあえず直接の原因までは
わからないものの、おそらくここが原因だろうという部分がはっきりしたと思うので、覚書程度に。

VBAコード内では、ワークシートを内部で作成、追加し、他のワークシートの内容をまるごと上書きコピー&若干の内容変更を
行うものでした。

変更前の、コードの概要はこんな感じでした。

(パート1)

ActiveWorkbook.Sheets.Add.Name = NewSheetName
'全体のALL Copyをしておく
Call ActiveWorkbook.Sheets(baseSheetName).Cells.Copy(ActiveWorkbook.Sheets(NewSheetName).Cells)

~~~~~~~~色々やってる~~~~~

(パート2)

'クリップボード経由
Call dataSheet.Range(startDataLine & CStr(TargetLineNo) & ":" & endDataLine & CStr(TargetLineNo)).Copy

'データはC列から
Call saveSheet.Range("C" & CStr(NextLineNo) & ":C" & CStr(NextLineNo)).PasteSpecial(xlPasteValues)

~~~~~~ 色々やってる~~~~~

変更点としては、パート2のあとに、更にパート1のようなコードを追加して、動きとしてはシートを2回追加するように
していました。

 

このVBAコードは、マクロ実行からおこなわれるようになっていたのですが、この修正後にマクロ実行、Excelファイルを終了しようとすると
タイトルのようなメッセージがでて、マシン自体が固まったようになってしまう現象でした。(メモリの使用量が100%近くなる)

この挙動がどうにも納得できないことが多く、コピーするワークシートには限らないようで、どのワークシートをつかっても発生していました。

そこで、2回目のパート1をごっそり削って、パート2も削って再度同じことをしてみると、同じ現象が。

まとめると、エラーがおきていなかった状態では、

  • (シートを新たに作成して、コピー元のシートの内容をまるごとコピーする)
  • →(上とは別のシート上からデータを参照し、それをまた別のシートに貼り付ける)

という動き。

 

試してみてエラーが起きたのは、

  • (シートを新たに作成して、コピー元のシートの内容をまるごとコピーする)
  • →(上とは別のシート上からデータを参照し、それをまた別のシートに貼り付ける)
  • →(シートを新たに作成して、コピー元のシートの内容をまるごとコピーする)

これと、

  • (シートを新たに作成して、コピー元のシートの内容をまるごとコピーする)

のパターン。

ということで、コピー自体はどちらもクリップボード経由であることに気がつきました。

となると、Excel2007の全体指定でALLコピーしてきた内容(パート1)の部分が、そのままクリップボードに残っていると

Excelの終了時にリソース不足になるのではないか、と当たりをつけてみました。

 

で、上記の流れの最後に、こんな感じにしてみました。

'クリップボードの中身を軽減
Call dataSheet.Range("A1:A1").Copy

もちろん、VBAでクリップボードのクリアを行うコードは、APIを利用すれば可能なのですが、いちいち面倒な宣言をしないといけない
ので、こんな感じでクリアっぽいことができればそれでOKだろうと考えてみたのです。

このやり方で、マクロの実行をしExcelファイルの終了をすると、無事終了ができました。心持ち、終了速度も速くなった感じもしますが、

とりあえずこれでなんとかできたのではないかと思います。

 

これ、Excel2003では発生していなかった現象なので、おそらくクリップボードの扱いが変わったせいなのかもしれませんね。

posted @ 18:30 | Feedback (1)

2010年1月22日 #

Mr.Tです、こんにちは。

私は既婚者です。ええ、嫁さんがいます。

 

すっかりお久しぶりになってしまいましたが、今年も「嫁のターン」をよろしくお願いします。

 

さて、我が家では、前回(http://blogs.wankuma.com/mrt/archive/2009/08/25/180486.aspx)のように、子供はまだまだ羞恥心ってナーニ?
という状態ですが、それでも「先に服を脱いで入って親を待つ」くらいのことができるようになってうれしい限りです。

で、その風呂の中。

嫁:「なぁ、最近、書いとるん?」

オレ:「あ、なに?」

嫁:「アタシのこと書いてるんやろ?」

 

それはつまり、ここのことか。ちょっとごぶさたしてるよなぁ。

 

オレ:「最近、全然書いてないんや」

嫁:「わんくまスキー(*1)のときも、まったくその話とかなくて、アレ?と思ったんやけどな・・・」

それは、何かい。オレが、またアレやコレや書いてることを肴にされるってことかいな。

もうね、いったんバレちゃったら、怖くないんですよ。それと、なんだかパターンっていうか様式美になってくると、こっちも話のネタとしては

新鮮味がうすれたような気もするしな。

 

オレ:「もうな、皆知ってることやから、そんな突っ込みいらんってことじゃね?」

嫁:「ふーん。で、なんで最近、書いてないん?」

 

スキーの飲み会でも触れられたけどな、それ。自分でもよくわからんけど、なんとなく「本を読むのが遊びの中心になる時期」、「ゲームを

するのが遊びの中心になる時期」、「Webで掲示板に書き込んだり文章を書いたりするのが遊びの中心になる時期」みたいなループが

あるんじゃないかなと思ってる。

 

だから、今はその時期じゃないんだろうなって風にもおもうし、あとはな、やっぱり「慣れ」じゃろ。

毎回、毎回、orzな生活ばっかりじゃ疲れるねん。

 

こんだけorzしとったら、慣れるねん。

 

オレ:「ってことで、慣れじゃね?」

嫁:「・・・つまり、いじめ足りないってことかぁ」

オレ:「え」

嫁:「フヒヒ」

 

なんか怖いこといった!

ひどい、これ以上何をどうされるって話よ! アンタ鬼じゃろ! orz

 

 

*1 わんくま内で、有志をつのって毎年行ってるスキー旅行。楽しいよ

posted @ 6:21 | Feedback (0)

2009年10月7日 #

Mr.Tです、こんにちは。

元ネタは、http://blogs.msdn.com/vbteam/archive/2009/10/06/hidden-costs-matt-gertz.aspx
# ほとんど、ネタに乗っかるだけの話なんで恐縮なんですけどね。

 

VB6.0以前でも云われてきた話じゃないかと思ってたんですが、ループなどで、こういう処理を書いたとします。

     Public MyList As List(Of String) = New List(Of String)
    Sub Main()
        Dim s As New System.Text.StringBuilder
        For i As Integer = 0 To MyList.Count
            s.Append(MyList(i))
        Next
    End Sub

 

このとき、MyList.Countは、ループのたびに評価される、というのが隠れたCostということみたいです。

で、ほんじゃどんだけ違うのだろうと、MSILコードを見るとこんな感じでした。

#Costがあるってなら、何か余計な処理&時間がかかる処理があるんだろうと思うので。

 

.method public static void  Main() cil managed
{
  .entrypoint
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
  // コード サイズ       48 (0x30)
  .maxstack  3
  .locals init ([0] class [mscorlib]System.Text.StringBuilder s,
           [1] int32 i,
           [2] int32 VB$t_i4$L0)
  IL_0000:  newobj     instance void [mscorlib]System.Text.StringBuilder::.ctor()
  IL_0005:  stloc.0
  IL_0006:  ldc.i4.0
  IL_0007:  ldsfld     class [mscorlib]System.Collections.Generic.List`1<string> Sample.Module1::MyList
  IL_000c:  callvirt   instance int32 class [mscorlib]System.Collections.Generic.List`1<string>::get_Count()
  IL_0011:  stloc.2(※1)
  IL_0012:  stloc.1
  IL_0013:  br.s       IL_002b
  IL_0015:  ldloc.0
  IL_0016:  ldsfld     class [mscorlib]System.Collections.Generic.List`1<string> Sample.Module1::MyList
  IL_001b:  ldloc.1
  IL_001c:  callvirt   instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
  IL_0021:  callvirt   instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string)
  IL_0026:  pop
  IL_0027:  ldloc.1
  IL_0028:  ldc.i4.1
  IL_0029:  add.ovf
  IL_002a:  stloc.1
  IL_002b:  ldloc.1
  IL_002c:  ldloc.2
  IL_002d:  ble.s      IL_0015
  IL_002f:  ret
} // end of method Module1::Main

 

MyList.Coutを事前に求めておいたパターンで同じようにやってみました。


    Public MyList As List(Of String) = New List(Of String)
    Sub Main()
        Dim s As New System.Text.StringBuilder
        Dim count As Integer = MyList.Count
        For i As Integer = 0 To count
            s.Append(MyList(i))
        Next
    End Sub
 

 

.method public static void  Main() cil managed
{
  .entrypoint
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
  // コード サイズ       50 (0x32)
  .maxstack  3
  .locals init ([0] int32 count,
           [1] class [mscorlib]System.Text.StringBuilder s,
           [2] int32 i,
           [3] int32 VB$t_i4$L0)
  IL_0000:  newobj     instance void [mscorlib]System.Text.StringBuilder::.ctor()
  IL_0005:  stloc.1
  IL_0006:  ldsfld     class [mscorlib]System.Collections.Generic.List`1<string> Sample.Module1::MyList
  IL_000b:  callvirt   instance int32 class [mscorlib]System.Collections.Generic.List`1<string>::get_Count()
  IL_0010:  stloc.0(※2)
  IL_0011:  ldc.i4.0
  IL_0012:  ldloc.0
  IL_0013:  stloc.3
  IL_0014:  stloc.2
  IL_0015:  br.s       IL_002d
  IL_0017:  ldloc.1
  IL_0018:  ldsfld     class [mscorlib]System.Collections.Generic.List`1<string> Sample.Module1::MyList
  IL_001d:  ldloc.2
  IL_001e:  callvirt   instance !0 class [mscorlib]System.Collections.Generic.List`1<string>::get_Item(int32)
  IL_0023:  callvirt   instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string)
  IL_0028:  pop
  IL_0029:  ldloc.2
  IL_002a:  ldc.i4.1
  IL_002b:  add.ovf
  IL_002c:  stloc.2
  IL_002d:  ldloc.2
  IL_002e:  ldloc.3
  IL_002f:  ble.s      IL_0017
  IL_0031:  ret
} // end of method Module1::Main

 

よくわからんのだけど、この※1と※2は、Countの戻り値を評価スタックとやらにPushしてるわけで、この値を比較対象と
してるんだと思ってるんですが、違うんですかね?

この時点では、もうどちらもint32の値として利用されているから、Costなんてなさそうな感じがします。

前段では、

  IL_002d:  ble.s      IL_0015

後段では、

  IL_002f:  ble.s      IL_0017

 

ここで、ループというか指定行に飛んでいくようになってます。つまり、これを見る限りは、Appendは毎回評価されている

けど、Countは毎回なんぞ評価されていないように見えます。

 

じゃあ、For Each使えばどうなのよ、ってことで、

    Public MyList As List(Of String) = New List(Of String)
    Sub Main()
        Dim s As New System.Text.StringBuilder
        For Each data As String In MyList
            s.Append(data)
        Next
    End Sub 

 

.method public static void  Main() cil managed
{
  .entrypoint
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
  // コード サイズ       61 (0x3d)
  .maxstack  2
  .locals init ([0] class [mscorlib]System.Text.StringBuilder s,
           [1] string data,
           [2] valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<string> VB$t_struct$L0)
  IL_0000:  newobj     instance void [mscorlib]System.Text.StringBuilder::.ctor()
  IL_0005:  stloc.0
  .try
  {
    IL_0006:  ldsfld     class [mscorlib]System.Collections.Generic.List`1<string> Sample.Module1::MyList
    IL_000b:  callvirt   instance valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<!0> class [mscorlib]System.Collections.Generic.List`1<string>::GetEnumerator()
    IL_0010:  stloc.2
    IL_0011:  br.s       IL_0023
    IL_0013:  ldloca.s   VB$t_struct$L0
    IL_0015:  call       instance !0 valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<string>::get_Current()
    IL_001a:  stloc.1
    IL_001b:  ldloc.0
    IL_001c:  ldloc.1
    IL_001d:  callvirt   instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(string)
    IL_0022:  pop
    IL_0023:  ldloca.s   VB$t_struct$L0
    IL_0025:  call       instance bool valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<string>::MoveNext()
    IL_002a:  brtrue.s   IL_0013
    IL_002c:  leave.s    IL_003c
  }  // end .try
  finally
  {
    IL_002e:  ldloca.s   VB$t_struct$L0
    IL_0030:  constrained. valuetype [mscorlib]System.Collections.Generic.List`1/Enumerator<string>
    IL_0036:  callvirt   instance void [mscorlib]System.IDisposable::Dispose()
    IL_003b:  endfinally
  }  // end handler
  IL_003c:  ret
} // end of method Module1::Main

まあ、このヘンになってくると比較にもならん結果になるので、パスw

 

で、引用元の人は、こういうのは最悪だろって話をしてるんだけど、

    Public MyLameObjectHeader As MyLameObject = New MyLameObject
    Sub Main()
        Dim s As New System.Text.StringBuilder
        For i As Integer = 0 To MyLameObjectHeader.Count
            s.Append(MyLameObjectHeader.Item(i))
        Next
    End Sub

     Public Class MyLameObject
        Public data As String
        Public NextMLO As MyLameObject

        Public Sub Insert(ByVal mlo As MyLameObject)
            If NextMLO IsNot Nothing Then
                NextMLO = mlo
            Else
                mlo.NextMLO = NextMLO.NextMLO
                NextMLO.NextMLO = mlo
            End If
        End Sub

        Public Function Count() As Integer
            Dim ct As Integer = 0
            Dim current As MyLameObject = Me
            Do While current IsNot Nothing
                ct += 1
                current = current.NextMLO
            Loop
            Return ct
        End Function

        Public Function Item(ByVal index As Integer) As MyLameObject
            If index >= Count() OrElse index < 0 Then Return Nothing
            Dim current As MyLameObject = Me
            For i As Integer = 0 To index
                current = current.NextMLO
            Next
            Return current
        End Function
    End Class

 

MyLameObject.Countが毎回、ループで処理されるからひどいことになるよってことですな。せめてこうしろって話ですな。

 

(Mainの変更後)

    Public MyLameObjectHeader As MyLameObject = New MyLameObject
    Sub Main()
        Dim s As New System.Text.StringBuilder
        Dim c As Integer = MyLameObjectHeader.Count
        For i As Integer = 0 To c
            s.Append(MyLameObjectHeader.Item(i))
        Next
    End Sub

--Main部分 変更前

.method public static void  Main() cil managed
{
  .entrypoint
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
  // コード サイズ       48 (0x30)
  .maxstack  3
  .locals init ([0] class [mscorlib]System.Text.StringBuilder s,
           [1] int32 i,
           [2] int32 VB$t_i4$L0)
  IL_0000:  newobj     instance void [mscorlib]System.Text.StringBuilder::.ctor()
  IL_0005:  stloc.0
  IL_0006:  ldc.i4.0
  IL_0007:  ldsfld     class Sample.Module1/MyLameObject Sample.Module1::MyLameObjectHeader
  IL_000c:  callvirt   instance int32 Sample.Module1/MyLameObject::Count()
  IL_0011:  stloc.2
  IL_0012:  stloc.1
  IL_0013:  br.s       IL_002b
  IL_0015:  ldloc.0
  IL_0016:  ldsfld     class Sample.Module1/MyLameObject Sample.Module1::MyLameObjectHeader
  IL_001b:  ldloc.1
  IL_001c:  callvirt   instance class Sample.Module1/MyLameObject Sample.Module1/MyLameObject::Item(int32)
  IL_0021:  callvirt   instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(object)
  IL_0026:  pop
  IL_0027:  ldloc.1
  IL_0028:  ldc.i4.1
  IL_0029:  add.ovf
  IL_002a:  stloc.1
  IL_002b:  ldloc.1
  IL_002c:  ldloc.2
  IL_002d:  ble.s      IL_0015
  IL_002f:  ret
} // end of method Module1::Main

 

--Main部分 変更後

.method public static void  Main() cil managed
{
  .entrypoint
  .custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
  // コード サイズ       50 (0x32)
  .maxstack  3
  .locals init ([0] int32 c,
           [1] class [mscorlib]System.Text.StringBuilder s,
           [2] int32 i,
           [3] int32 VB$t_i4$L0)
  IL_0000:  newobj     instance void [mscorlib]System.Text.StringBuilder::.ctor()
  IL_0005:  stloc.1
  IL_0006:  ldsfld     class Sample.Module1/MyLameObject Sample.Module1::MyLameObjectHeader
  IL_000b:  callvirt   instance int32 Sample.Module1/MyLameObject::Count()
  IL_0010:  stloc.0
  IL_0011:  ldc.i4.0
  IL_0012:  ldloc.0
  IL_0013:  stloc.3
  IL_0014:  stloc.2
  IL_0015:  br.s       IL_002d
  IL_0017:  ldloc.1
  IL_0018:  ldsfld     class Sample.Module1/MyLameObject Sample.Module1::MyLameObjectHeader
  IL_001d:  ldloc.2
  IL_001e:  callvirt   instance class Sample.Module1/MyLameObject Sample.Module1/MyLameObject::Item(int32)
  IL_0023:  callvirt   instance class [mscorlib]System.Text.StringBuilder [mscorlib]System.Text.StringBuilder::Append(object)
  IL_0028:  pop
  IL_0029:  ldloc.2
  IL_002a:  ldc.i4.1
  IL_002b:  add.ovf
  IL_002c:  stloc.2
  IL_002d:  ldloc.2
  IL_002e:  ldloc.3
  IL_002f:  ble.s      IL_0017
  IL_0031:  ret
} // end of method Module1::Main

 

クラス部分は変更してないから、同じだし。

それ以外だと、やっぱりContの部分なんですが・・・これって、やっぱりループごとに評価されているわけじゃないように
見えるんですが・・・

サルでもわかる説明とかないですかねw

posted @ 11:23 | Feedback (4)

2009年9月10日 #

Mr.Tです、こんにちは。

 

Ognacさんのエントリで共通テーブル式(CTE)のことをあげたら、こんなコメントが・・・

http://blogs.wankuma.com/ognac/archive/2009/09/10/181052.aspx#181071

 

 

正直、どこをどう説明したらいいのかわかりませんが、もうめちゃくちゃ安易に使ってます。

#シビアなパフォーマンスを比較的求められないケースがほとんどなので、Indexは?とかそういうのは
#今のところあまり問題になってません。

 

例えば、普通に二つのテーブルを外部結合してるSQLがあったとします。

 

X名簿、Y名簿とも、ID,名前,苗字というフィールドのテーブルとして

select T1.[名前],T1.[苗字] from [X名簿] T1
left join [Y名簿] T2
on T1.ID = T2.ID
where T1.ID<100

 

これに、Y名簿のIDが200未満という条件がついていたとすると、そのままかけば

select T1.[名前],T1.[苗字],T2.[結婚前苗字] from [X名簿] T1
left join (select * from [Y名簿] where ID<200) T2
on T1.ID = T2.ID
where ID<100

 

こんな風になりますよね。

 

私は、(select * from [Y名簿] where ID<200)の部分が長くなるのが非常に見難く感じるので、ここをざくっと

こうしちゃいます。

 

with [Y名簿のID200未満] as (

select * from [Y名簿] where ID<200

)

select T1.[名前],T1.[苗字] from [X名簿] T1
left join [Y名簿のID200未満] T2
on T1.ID = T2.ID
where T1.ID<100

 

withでくくるのは、複数かけるので、

with テーブルA as ()

.テーブルB as ()

,・・・

select * from テーブルA,テーブルB

みたいに、やってますね。

SQLは大きくなるほど、ここで抽出してるのはどういうデータなのかを忘れちゃうので、

こうやって名前付けて出しちゃうのは見た目で結構わかりやすいと個人的にはおもってます。

 

他の人、CTEってどういうときにつかってるんだろ。

posted @ 18:09 | Feedback (10)

2009年9月3日 #

Mr.Tです、こんにちは。

バイオハザード4 マーセナリーズ PS2版のちょっとしたメモです。いまさら、という感はバリバリですが、まあいいです。

#本格的な攻略なら、それらしい動画がいっぱいあがってますし、それをみて覚えるなりなんなりしてもらったほうがいいです。

 

まずは、レオンでやるべき。

→レオンは、武器としてはあまり強くないなので、こいつで6万点とれるようになれば、どれでもいける。

 

弾の補給は、最低限でいい。

→弾薬が豊富にないと心もとないとか思っているとあっという間に、時間がきてしまう。自分の移動する場所にあれば拾うようにするべきで、

あまり戻って取るなどはしないほうがよい。

 

チェーンを途切れさすな。

→あつめてドカーンがしたいなら、ハンドガンで空撃ちなんかもしてみるといい。音のするほうにやつらは来る。

 

自分が動くルートをはっきり決める。

→6万点くらいなら、あるていど適当でもいけるんですが、やっぱりルートが決まっている方がいいです。行き当たりばったりでは、

なかなか難しい。

 

ともかく、操作になれる。

→もう移動に時間がかかるとか、180ターンにもたつくとかないくらいに、したほうがいい。

 

各個人を使ってみた上での雑感。

 

レオン:

弱い弱いといいつつショットガンはやっぱり使いやすい。一撃よりも数撃をもって倒すことをメインに考えたら

そう悪いキャラではないと思う。

このキャラは、ハンドガンもそう悪くない。それは、蹴りのアクションが回りを巻き込むからだ。

もっとも、効率が悪いのでショットガンの方をよく使う。

体力は並み程度。

ヘッドショットを使えないとちょっと厳しい戦いが多いとは思う。

 

レオンの場合、ハンドガンで体力削る、敵をひきつける、たるを壊すに利用。

ショットガンでひきつけて敵を転倒させる、で比較的近距離で、戦うのがベストだと思う。

 

もちろん、ボスタイプは、数少ない焼夷弾や手榴弾を使うなどするのが楽。

 

エイダ:

なにより足がはやい。これは大きい。それと焼夷弾をもっているので、囲まれても結構大丈夫。

焼夷弾は、速攻で燃えるので手榴弾よりも、タイムラグなく使える。閃光弾もあるけど、これでは直接敵を倒せない。

あと、マシンピストルは近距離から利用できるし、構える時間も短いので、すぐ撃てる。

もちろん、ライフルはボス以外は一撃なので、破壊力は申し分なし。

 

ただし、足が速いとはいえ、近距離で相手を吹っ飛ばすことができないため、通常は近距離で戦うことはおすすめしない。

体力がひくいので、イエローになると途端に足がおそくなるので、さらにつかまりやすくなるという悪循環。

 

クラウザー:

正直、使える人ならこれが一番最強じゃねーかと思う。

連射がやや遅いかもとは思うが、弓は上半身ならほぼ一撃でいける。弾の心配はしなくてもどんどん拾える。

体力もあるので、ちょっとやられても全然平気。

体術のキックはレオンよりも強い。

さらには、変身してからの直線攻撃。これが、発動中は無敵で、ボスを一撃で殺せるというクラス。

 

ただ、慣れないと目の前に敵がいても弓が当てづらい。こればっかりは練習してすばやく当てるようにしないと一番使えない

人になってしまいます。

 

ハンク:

マシンピストルと手榴弾がメインなのですが、チェーンソー女に限っては、ヘッドショット→体術の処刑で一撃で死ぬ。

手榴弾が遠距離メインで使うべきなので、敵の行動パターンを熟知しておき、なおかつ一箇所に敵をあつめるようにできれば

これほど楽チンなキャラはない。弾あつめも、そう問題はおきない。

手榴弾は爆発までにタイムラグがあるから、敵の手前に落とすのか、敵の背後に落とすのかでもやりようが違うので

結構むずかしい。

 

足もそこそこ速いので、基本近距離以外であれば結構無敵。

 

ウェスカー:

個人的には一番使いにくい人。

まず、足がけっこう遅い。ライフルとマグナムをもっているから楽とおもいきや、ライフルは弾がエイダほど手に入らないし、

手榴弾はハンクほど手に入らない。

マグナムは、強いが樽からしか入手できないし、敵が落とさないから使いどころに悩む(ボス的以外で使うのがためらいがでる)

閃光弾も多少ひろえるのだが、基本的な体術が遠くに弾き飛ばす掌底だと、巻き込める範囲がちょっと狭い。(飛んでいくのは楽しいが)

つまり、手榴弾しか広範囲攻撃できるものがない。

 

なので、手榴弾、閃光弾、ライフル、マグナム、と4つの武器をうまく切り替えていかないといけなくて、すごく大変。特にライフルの弾が

おもったより出ないので、総合的に扱いづらいなと思っています。

posted @ 17:43 | Feedback (0)

2009年8月31日 #

Mr.Tです、こんにちは。

 

 突然だけど、その流れで消火器の使い方ってそういえば、知らないもんなのねと思い、ちょっと簡単にまとめておくことにした。

 

 会社においてある消火器は、通常、粉消火器ってやつが多い。

 これは、油などにも、普通の可燃物が燃えたときにも、電気系にもいちおうどれにも効果がある。マークを良く見れば、その消火器がどれに対応しているのかもちゃんと書いてある。

 粉消火器は、その名の通り白っぽい粉が噴出される。実際にやってみたことがある人ならわかるが、かなり室内ではもうもうと粉が巻き上がる。

 電気火災用にある、二酸化炭素消火器などは、気体を利用するわけだが、これはなぜ期待を使うのかといえば効用よりも機器の物損を避けるためであろう。実際、単純なボヤでも粉を懸けられた場合は、損害が結構ひどいと思われる。

 

○前触れをするのは、非常に大事。

 火事の場合は、誰かに知らせて複数で対応するのが基本。一人では、あぶない。かならず、火事ぶれをすること。

 

○消火器はその場までもっていくべし。

 消火器には引き抜き用のピンがあり、これを引き抜いて付属のホースを向けるて取ってを握って、消化を行うわけだけど、
当然、火元と消火器の置き場所は同じわけじゃない。といって、近くに持っていく間にピンを抜いちゃうと、間違えてその場で
レバーを握ってしまって、中身が噴出してしまうという状況になる。

 通常、消火器は、30秒前後しか噴出されないので、持っていくまでの間に中身が全部でてしまった、なんてことにならないように
近くまでもっていってから操作しましょう。

○一本で消えるかもしれない、消えないかもしれない。

 消火器は一度レバーをひいたら、全部出てくるまで止まりません。でも、1本で消えないときは、次々とかけていきましょう。

一人だけで消火していると補充がきかないので、他の人にもってきてもらうのが一番よいです。

 

○炎ではなく、燃えているものに向ける。

 消火器の射程範囲は10メートル弱だったと思うが、消火器から出てくる粉は、炎にかけても意味がない。

 粉消火器は、燃えているものに対して粉をかけて空気との接点をなくすことが重要だ。

 なので、炎にかけるのではなく、たいてい根元である燃えているものでないといつまでたっても消えない。

 ただし、家庭用の油が燃えた!という場合は、直接フライパン

 

○消火器だって、悪くなる。

 家庭用でミニサイズの消火器を買っていることもあるかもしれない。

 で、スプレータイプのようなものじゃなく、きちんとレバーを握って噴出するタイプの消火器は、たいていが外殻が金属です。

 金属は腐食しますし、経年劣化していきますから、10年も前の消火器は場合によっては、レバーをにぎったときに、内部のガスによって
破裂することもあります。注意しましょう。

 

○消防署で消火器は売らないよ。

 商売の邪魔をするつもりはないですけど、「消防署のほうからきましたと」といって、消火器を売るのは違法すれすれです。
 それと最近、家につけろとかいわれてる、「煙感知器」も売らないです。

 消防署はモノ売らないですよ、ほんと。たまたま、消防署に関係のある人が窓口になるとかはあるかもですけど。

posted @ 15:44 | Feedback (0)

2009年8月25日 #

Mr.Tです、こんにちは。

私は既婚者です。ええ、嫁さんがいます。

 

わんくま勉強会でも言ってますが、嫁のターンは「私がくやしい」とか「orz」という気分になったときのもので、決して

のろけではありません。

どうしてこのシリーズがのろけに見えるのか、僕にはさっぱりなのですが、一応書いておきます。

 

で、ウチは、子供と嫁と一緒に風呂に入ります。今でもそうです。

まあ、子供に羞恥心を教えないといけないので、そろそろ「パパと一緒に入りません」というルールを教えないといけないのですが、

それは置いといて。

 

うちの風呂は、そこそこ広く、室内乾燥機のカワック(http://g-life.osakagas.co.jp/2-bath/0-heatingdryer/index.html)がついてます。

そのせいか、風呂の中に、洗濯竿っぽい棒が、一本天井近くにわたしてあります。

 

通常は、そこにタオルなどをかけておくのですが、そのタオルのかけ方でこの間、文句をいわれました。

要は、「届かへん!」ということなのです。

 

オレ:「とどくやろー、いくらなんでも」

嫁:「とどかへんのや!」

もちろん、下に腰をおろしたままでは届きません。私なら座ってもなんとかちょっと腰をあげるくらいで届きますが、

普通に立ち上がれば届くはずです。

 

にもかかわらず「届かない」というので、結局言い争いっぽくなってしまったのですが・・・

確かに、嫁は150センチもないので、背が低いわけですが、実際に全く届かないわけではありません。ただ、タオルを

干そうとすると、タオルをえいやっと棒にまきつけるみたいにしないと干せません。その程度には身長がありません。

それに、風呂のいすを使うのもいちいち出すのは面倒なのだ、と。

それが大変だから、届かないと言っているということらしいのです。

 

私の身長は178センチくらいですから、自分の背が高いとは他人と比べたら思いますが、なかなか嫁の背丈のことは

当たり前すぎて忘れてしまうことが多いです。

「面倒だから、大変だから、って工夫してできることをしない嫁が怠慢だ」という見方もできなくはないです。

極端に言えば、結局、お前が面倒だから、オレに負担を強いるのか、という見方でしょうか。

#しかし、夫の役割は嫁の負担を一緒に持つことです。
#だから、それは私は、いいません。

 

自分の目の高さでしか自分が物事を見れなくなっているような気がしてきて、ちょっと反省中。

 

え?

ええ、もちろん高いところは私の役目ですよ。

posted @ 18:56 | Feedback (5)

2009年8月20日 #

Mr.Tです、こんにちは。

 

多分、また受付&司会をさせてもらえるかと思ってます。セッションは、朝10時すぎから開始なので、ゆっくりですよ。

みんな、きて!当日きてもOK!

http://www.wankuma.com/seminar/20090822osaka31/Default.aspx

 

まあ、表の目玉はセッションですけど、裏の目玉は、「ドラクエ」のすれ違い通信ですよ。

みんなDSを持って、おいでよ!

私とすれ違い!さあ、どんどん巻物を!

#残念ながら、私はまだ巻物一つもないですw

posted @ 17:37 | Feedback (0)