AB型の変わり者 三流プログラマー 業務の愚痴

[バックナンバー目次] [掲示板] [メルマガ登録・解除] [愚痴系TOPメニュー]

バックナンバー No.30 〜 No.34


[No.30 HP更新案内と旅の恥じは書き捨て]
[No.31 Excel97 VBA CRLF抜きの固定長ファイルを処理]
[No.32 OutLook97から添付ファイルを抜き出す]
[No.33 恐いもの知らずの時、、]
[No.34 手抜きの進め?、、]

広告:


No.30 1999/12/08
HP更新案内と旅の恥じは書き捨て
[ページTOPへ戻る]
<HP更新案内と旅の恥じは書き捨て>
目次
1.はじめの挨拶
2.HP更新しました 
3.営業活動、、、恥じ書きました、、、
4.おわりの挨拶
----------------------------------------------------------------------------
/*
 * 1.こんにちは
*/
こんにちは。
なんか、30回目の発行です。
(えっ、もう、、、それにしては内容薄いなぁ、、印象にあるのは??)

今回はプログラムには、まったく、関係無く、
HPの更新案内と
BSS・掲示板めぐりでやってしまった失敗談を書きます。
(笑ってください、、、)

今回も、息抜き発行です。
*回答まで、手が回らなかった、、、

/*
 * 2.HP更新
*/
30回発行記念で、HP更新しました。
お時間のある人は、下記を見てください。

変更内容は、フレーム処理に挑戦しました。
なんかでも、シックリこない。。。
戻りを変えてないので、変な動きします。。(まだ不完全ですカンベンしてね)

各ページに、感想を記入可能とした。
*ドリームネットのアンケートCGIを使用

要望のあった、読者同士の交流の掲示板・BBSは、
まだ、設置していません。。。

/*
 * 3.営業活動、、、恥じ書きました、、、
*/
BBS・掲示板めぐりでもして、新たな読者を開拓しよう
と思い、無差別に掲示板への書き込みマシーンとなり、
自分のHP・メルマガを宣伝しました。。。

やってしまいました、スゴイ失敗。。。

やると思ったよ、、ぜんぜん見ないで書き込むんだもん、
で、どんな事故?話してみ、楽になるから(笑ってやるから)

ア.同じお客へ営業に行ってしまった編
>二回も私のホームページに来ていただいてありがとうございます。
を6人の人からいただきました。
同じ場所をグルグル回ってたみたいですね。
メルマガ登録してくれるまで、通いつめたら、スゴイ?
(迷惑ですね、、すみませんでした)

イ.すでにお客さんだった、、編
>実はKenさんのやつもう購読していました。
>のでちょっと驚きました。
あっ、すでに、読者の人だった、、、
営業にいったら、もう加入済みですよ、、う〜ん。
ここまでは、かわいいもので、この下が本命

ウ.Ken3女性専用に書込み赤面編(いつのまにか、女性下着売り場に....)
>NAME:paradox@kigaru 
>OBJ:当ホームページの女性専用の掲示板にあなたの書き込みがあります。
>即刻削除してください。お願いします。
あっ、アレ?そんなBBSあったんだ、、
説明読まないで、無差別に書いてるから、、、やっちまった。。
削除しに行こう、、あれ、このページって、、、
コレをみて、もっと赤面。。。(ここから先は、自分の目で確認してください)

http://nqj.gaiax.com/jump.cgi
に行って、paradox@kigaruへ飛んでみてください、、すると、、、

旅の恥は、書き捨て、、かなぁ。。。

/*
 * 4.終わりの挨拶
*/
今回は、自己告発でした。。。
次回は、まともな講座を、、やりたいと思います。。。

では、また。

旅の恥は書き捨て(漢字・意味違うだろ)の 三流PG Ken3でした。

PS.次回から、少しでも積み残しを進めろって、、、はいはい。。。。

No.31 1999/12/09
Excel97 VBA CRLF抜きの固定長ファイルを処理
[ページTOPへ戻る]
<Excel97 VBA CRLF抜きの固定長ファイルを処理>
目次
1.はじめの挨拶
2.さて、どうしよう 
3.まず、読み込みだけ、作成しよう
4.依頼はCSV作成でしょ
5.おわりの挨拶
----------------------------------------------------------------------------
/*
 * 1.こんにちは
*/
こんにちは。
なんか、毎晩の営業活動で疲れてます。

今回は、マジメに、プログラムやってみたいと思います。

簡単に消化可能な話題、、あったかなぁ、、
あっ、これ、やってみよう。。。
----
>特殊な固定長形式のデータ(1行になっていて、最
>後にEOFがきて終わりです。データファイル名:Test.txtを
>参照して下さい)を64バイトごとに
>区切るのはどうしたら良いでしょうか?また、このデータからダイレク
>トに社員番号(8桁)、漢字氏名(20桁)、ローマ字(24桁)、予
>備1(6桁)、予備2(6桁)のCSVデータにすることは可能でしょ
>うか?
>いやらしいことに、漢字氏名は全角と半角が混在しています。
----

なんとか、なるだろう、、たぶん。

/*
 * 2.さて、どうしよう
*/
送られてきた、サンプルデータを見ると、改行されてない、、
改行文字も無く、そのままデータが続いている、、、

さて、どうしよう

VBAでファイルを開いて、
64バイト読む、
それを分けよう、、、なんて、できるかな?

調べることは、
・バイト数指定で、ファイルから読み込めるか?
・EOFでとめるには?
これをファイル関係のヘルプから探す。

テメエが詳細をうまく解説してないだけで、
過去の講座で一部やってるダロ、
BMPファイルを読み込んで、ヘッダ情報から、サイズを取り出すヤツ。

あっ、そうか、あれを改造して、、、

/*
 * 3.まず、読み込みだけ、作成しよう
*/
作成プログラム
( hosoku/031/index.html )
'---- kotei.xls に保存されています。
Type TYPERecord              'ユーザー定義型を定義します。
    社員番号   As String * 8  '
    漢字氏名   As String * 20 '
    ローマ字   As String * 24
    yobi1     As String * 6
    yobi2     As String * 6
End Type

'メイン処理
Sub main()

    Dim nYLINE     As Integer
    Dim FNO%
    Dim Position   As Long
    Dim strREADBUF As TYPERecord

    FNO = FreeFile '空いているファイル番号を取る

    ' test.txt ファイルを ランダム アクセス モードで開きます。
    Open ActiveWorkbook.Path & "\test.txt" For Random Access Read As #FNO Len = 64

    '変数初期化
    n = 1                      ' レコード番号を定義します。
    nYLINE = 2 '見出しを抜かして、2行目から処理

    While EOF(FNO) = False
        ' Get ステートメントを使って、サンプル ファイルを読み込みます。
        Get #FNO, n, strREADBUF    ' n番目のレコードを読み込みます。
        'テストなので、セルにセット、、
        Cells(nYLINE, 1).Value = strREADBUF.社員番号
        Cells(nYLINE, 2).Value = strREADBUF.漢字氏名
        Cells(nYLINE, 3).Value = strREADBUF.ローマ字
        Cells(nYLINE, 4).Value = strREADBUF.yobi1
        Cells(nYLINE, 5).Value = strREADBUF.yobi2
        'カウントアップ
        n = n + 1
        nYLINE = nYLINE + 1
    Wend

    Close #FNO                          ' ファイルを閉じます。

End Sub
----------
さて、解説しますと、
Type TYPERecord              'ユーザー定義型を定義します。
    社員番号   As String * 8  '
    漢字氏名   As String * 20 '
    ローマ字   As String * 24
    yobi1     As String * 6
    yobi2     As String * 6
End Type
ここで、フィールドをきります、、なんてカッコよく始めて、、

Type タイプ名
  変数(メンバー名) 変数タイプ
  変数(メンバー名) 変数タイプ
end type

を使用して、64バイトの新しいタイプ型を宣言します。

Dim strREADBUF As TYPERecord
と書き、TYPERecord型の変数、strREADBUFを定義します。

次に、ファイルを ランダム アクセス モードで開きます。
Open ActiveWorkbook.Path & "\test.txt" For Random Access Read As #FNO Len = 64
ここでは、kotei.xls と同じディレクトリに入っている、
test.txt を ランダムアクセスモード、レコード長64バイトで開きます。

ファイルが終わりに達しているかを判断するために、
EOF(ファイル番号)関数を使用します。
ここでは、ファイルが終わっていない間にしたいので、
While EOF(FNO) = False
と書きました。

While Not EOF(FNO) と書く人もいます。
うちのできる後輩達は、みんなNot EOF ですね。。。まっ、いっか。
*エンドオブファイルじゃないとき、、

' Get ステートメントを使って、サンプル ファイルを読み込みます。
Get #FNO, n, strREADBUF    ' n番目のレコードを読み込みます。
これで、変数にファイルから読み込んだデータが入ります。

次がここでのポイント?
Cells(nYLINE, 1).Value = strREADBUF.社員番号
変数.メンバー名で値を代入する。。。

社員番号数値あたま0が取れちゃった、、まっ、いっか
じゃ、寝ようかな。おやすみなさい。

/*
 * 4.依頼はCSV作成でしょ
*/
依頼はCSV作成でしょ、、
あっ、、、改造したサンプルを書きに載せます
-----
'テキストファイル、OUT.TXTを作成
'test.txt --> out.txt
Sub MakeText()

    Dim nYLINE     As Integer
    Dim IN_FNO%, OUT_FNO%
    Dim Position   As Long
    Dim strREADBUF As TYPERecord

    IN_FNO = FreeFile '空いているファイル番号を取る
    
    ' test.txt ファイルを ランダム アクセス モードで開きます。
    Open ActiveWorkbook.Path & "\test.txt" For Random Access Read As #IN_FNO Len = 64
    
    '出力先 out.txt を シーケンシャル ライト モードで開きます
    OUT_FNO = FreeFile
    Open ActiveWorkbook.Path & "\out.txt" For Output As #OUT_FNO
    
    '変数初期化
    n = 1                      ' レコード番号を定義します。
    nYLINE = 2 '見出しを抜かして、2行目から処理
    
    While EOF(IN_FNO) = False
        ' Get ステートメントを使って、サンプル ファイルを読み込みます。
        Get #IN_FNO, n, strREADBUF    ' n番目のレコードを読み込みます。
        '読み込まれたデータを書き込むCSVにする、、、
        'カンマだけ付ける””は好みで?
        Print #OUT_FNO, Trim(strREADBUF.社員番号) & ",";  '←セミコロンを付けると
        Print #OUT_FNO, Trim(strREADBUF.漢字氏名) & ",";  '改行されない
        Print #OUT_FNO, Trim(strREADBUF.ローマ字) & ",";  'ここがポイント
        Print #OUT_FNO, Trim(strREADBUF.yobi1) & ",";
        Print #OUT_FNO, Trim(strREADBUF.yobi2)       '最後は改行したいので付けない
        'カウントアップ
        n = n + 1
        nYLINE = nYLINE + 1
    Wend

    Close #IN_FNO                          ' ファイルを閉じます。
    Close #OUT_FNO

    '結果をメモ帳表示
    Shell "notepad.exe " & ActiveWorkbook.Path & "\out.txt", vbNormalFocus
    
End Sub
----

ポイントは、
Print #OUT_FNO, Trim(strREADBUF.社員番号) & ",";  
セミコロンを付けるとテキスト出力で改行されません、、、

テスト実行、、、
あれ、trimで囲っているのに、
漢字氏名だけ、スペースが取れない、、、
( hosoku/031/index.html#005 参照 )

/*
 * 5.終わりの挨拶
*/
今回は、少しは、まともな講座でした、、
積み残し、食べ残し、まだまだ、あるけど、、、

では、また。 三流PG Ken3でした。


No.32 1999/12/10
OutLook97から添付ファイルを抜き出す
[ページTOPへ戻る]
<OutLook97から添付ファイルを抜き出す>
目次
1.はじめの挨拶
2.参照設定を使用して、オブジェクトの構造を知ろう、、 
3.まず、読み込みだけ、作成しよう
4. [三流PG No.031]の再調理、、
5.ハッシュと二分検索
6.おわりの挨拶
----------------------------------------------------------------------------
/*
 * 1.こんにちは
*/
こんにちは。
紹介文から、C言語を削りました。。。
そのうち、ネタたまったら、復活させます。

今回の依頼は、
OutlookExpress5から、添付ファイルを取りたい、、です。
----------
 >とあることがやりたいのでEucの過去ログをさぐったところ
 >唯一ひかっかた話題をされていた貴殿のWebに迷い込み、バックナンバーを
 >2,3見たところ、面白そうなので今後メルマガを購読しようかと思ってお
 >ります。
 >で、「やってみたいあること」についてですが、
 >ExcellのVBAでOutolookExpress5の添付ファイルをどっかのフォルダにコ
 >ピーしたい! ということです。もしご存知なればぜひぜひアドバイスをお
 >願いしたいです。
----------
前に作成したサンプルに肉付けをして(簡単に調理して、、)
出そうと思います。

オイオイ、、新しい、おしながき(ジャンル)じゃなくて、簡単にすませたね、、、
それじゃ、実力あがらないよ。。。

カツ丼のうまいそば屋をめざしているんじゃなかったっけ?
あれ、チャーハン・餃子のうまい、ラーメン屋?だったっけ

なんか、本業ダメだけど、オプションはうまい店、、みたいじゃん?

そこそこ食べれる、ファミリーレストラン目指してるんだけど、、、
味にうるさい人は、専門店へ、、、なんてね。

目玉商品が無い店は、つぶれる?だろうし、、、
このメルマガのウリ、他店に負けない、おいしいところって、なんだろう?

速い・ウマイの牛丼屋をめざしますか、、、

いつもの、わけわからない話は、これくらいにして、そろそろ、やりますか。。。

/*
 * 2.参照設定を使用して、オブジェクトの構造を知ろう、、、
*/
OutlookExpress5かぁ、、、構造、わからないんだよな、、ヘルプに載ってないし
今回もOutlook97で行きます。。
料理の鉄人さんへお願いです、
OutlookExpress5の調理の仕方・ポイント、教えてください。

添付ファイルか、、さて、どうしよう?

参照設定を使用して、オブジェクト構造を知ろう
( hosoku/032/index.html 参照 )

まず、ExcelのVBA画面を出し、モジュールを入力可能とします。
*Alt+F11、、それから、、挿入モジュールだったけ?

次に、
sub test()

end sub
とモジュールを書きます。

ここから、ポイント、
ツール・参照設定を選択します
すると、ものすごい数の参照可能なライブラリが表示されます。
画面をスクロールさせ、目的のライブラリ・オブジェクトを探します。
*名前で、あたりをつけるの、、難しいが。。。

ここでは、
Microsoft outlook 8.0 Object library を選択してみた。
あれ、その下に、エクスプレス5.0?あるじゃん、、もしかして?
*今回は、興味があるけど、そのままにします。
 (あたらしい新鮮な食材に目を奪われそうになるが、ガマン)

dim aaa asと入力すると、型の一覧が出ます。
( hosoku/032/index.html#004 参照 )
ここで、Dim aaa As MailItem とします。

次に、 aaa.
とピリオドを打つと、MailItemのプロパティ、メソッドが表示されます。
*いろいろあるので、大変です。。。

..Attachments の添付関係のオブジェクトを選択します。
ここから、ピリオドを打って、さらに深く読んでいきます。

..Attachments.Itemや.Count を押さえて、さらに、Itemの下にある、

..Attachments.Item.DisplayName や .SaveAsFileメソッドを見ます。

なんて、スムーズに書きましたが、実際は、英単語の辞書で単語変換したり、
いろいろ、目的のプロパティ・メソッドを探すのに、苦労しました。
だいたい、アタッチですぐ添付って頭の中、ひらめきます?

うん、ひらめくよ、、、えっ、、、私だけ、わからなかったの、、、

/*
 * 3.なんとか、作った手抜きのサンプルです
*/
なんとか、作った手抜きのサンプルを載せます。
小骨とか丁寧に処理していないので、
食べるとき、のどにささるかも知れません、、(エラーが発生するかも?)
注意して下さい。。。
*小骨があったほうが、栄養的には、いいでしょう。。なんて、、、
 ホントは、彼女にやさしく食べさせてもらいたいって?
 甘ったれんなよ、、、(いいなぁ、、そんな人は、、、)

----------------------------------------------------
Sub aaa()

    test5 ("下書き")

End Sub

'手抜きで、C:¥に添付ファイルを保存する
Sub test5(strFNAME As String)

    Dim olAPP     As Object
    Dim olNameSPC As Object

    Dim objItem            As Object
    Dim dteCreateDate      As Date
    Dim strSubject         As String
    Dim strItemType        As String
    Dim strBody            As String

    Dim intCounter         As Integer
    Dim strOKNG            As String
    Dim strMSG             As String

    Dim nFCNT   As Integer
    Dim objATT  As Object    '添付情報格納用
    Dim n       As Integer   'カウンター
    Dim strATTNAME As String '添付ファイル名

    Set olAPP = CreateObject("Outlook.Application")
    Set olNameSPC = olAPP.GetNamespace("MAPI") ' Namespace オブジェクト
   
    strOKNG = "NG"
    For nFCNT = 1 To olNameSPC.Folders(1).Folders.Count
        If olNameSPC.Folders(1).Folders(nFCNT).Name = strFNAME Then
            strOKNG = "OK"
            Exit For   '見つかったので抜ける
        End If
    Next nFCNT

    If strOKNG = "NG" Then
        MsgBox strFNAME & "フォルダーは、見つかりませんでした"
        Exit Sub
    End If
   
   For Each objItem In olNameSPC.Folders(1).Folders(nFCNT).Items
      intCounter = intCounter + 1
      With objItem
         dteCreateDate = .CreationTime
         strSubject = .Subject
         strItemType = TypeName(objItem)
         strBody = .Body
         Set objATT = .Attachments   '添付ファイル情報を参照可能にする
      End With
      
      '添付ファイルが存在したら、
      For n = 1 To objATT.Count
        'ファイル名を取り出す
        strATTNAME = objATT.Item(n).DisplayName
        'C:¥に保存する
        objATT.Item(n).SaveAsFile "c:\" & strATTNAME
        MsgBox "C:\" & strATTNAME & "に保存しました"
      Next n

      strMSG = vbTab & "アイテム番号" & intCounter & " - " _
         & strItemType & " - 作成日 " _
         & Format(dteCreateDate, "yyyy/mm/dd hh:mm am/pm") _
         & vbCrLf & vbTab & vbTab & "件名 : '" _
         & strSubject & "'" & vbCrLf _
         & strBody
      
      If MsgBox(strMSG, vbOKCancel) = vbCancel Then
          Exit For
      End If
      
   Next objItem

End Sub
----------------------------------------------------
調理のポイント、

Set objATT = .Attachments   '添付ファイル情報を参照可能にする
ここで、オブジェクト変数に代入し、
添付関係のオブジェクトにアクセス可能とする。
      
'添付ファイルが存在したら、
For n = 1 To objATT.Count
          ↑添付ファイルの数だけ処理する、、0は無し2は2個
    'ファイル名を取り出す
    strATTNAME = objATT.Item(n).DisplayName
              ↑表示名をファイル名とする、、、
    'C:¥に保存する
    objATT.Item(n).SaveAsFile "c:\" & strATTNAME
          ↑saveasfileメソッドを使用して、ファイルを取りだし保存

    MsgBox "C:\" & strATTNAME & "に保存しました"
          ↑オマケ
Next n

う〜ん、、、自分でも、わからなくなってきた、、、
味付けにも、自信ないし、、、食べやすい・消化しやすいサンプルになってない。

自分で、いろいろ、変更しながら、探ってください。

/*
 * 4. [三流PG No.031]の再調理、、
*/

読者から、積み残しの回答、いただきました、
こんな、調理方法・味付け、あったんですね。
参考になりました。

In message "はじめまして。(Re: [三流PG No.031])",
 >今回のプログラム講座、以前に同じようなことをしようとやりかけたことがあったので、
 >実際はどうやるのか興味深く読ませていただきました。
 >とても勉強になりました。
 >
 >また、興味があったので「漢字氏名だけ、スペースが取れない」原因を自分なりに調べてみました。
 >
 >今回、「漢字氏名だけ、スペースが取れない」状態になってしまった原因はString型が文字を
 >UNICODEで格納しているせいだと思います。
 >ファイルから読み込むときはShift-JISを読み込むため、ちゃんと全角文字は半角2文字分で読み込
 >まれているのですが、それをString型に代入したところでコードがUNICODEになってしまいます。
 >このため、"織田  信長          " (半角20文字)
 >が、UNICODEの16文字として変数に入ってしまい、固定長のString型の残りの部分は名にも入らな
 >いため、Nullになってしまうようです。
 >そして、Trim()では文字列の最後が空白ではなくNullであるためそのまま何もしていない、
 >ということのようです。
 >
 >だから、一番簡単な解決策は、データをファイルから読み込む前に
 >	strREADBUF.漢字氏名 = "                    "	'20個の空白で初期化
 >と、することじゃないでしょうか。
 >
 >もしかしたら、もう分かっていることを書いてしまったかもしれませんが・・・、
 >原因と解決策が分かったのがうれしかったので、つい書いてしまいました。
--------------------
バッチリでした、OKです。
ありがとうございました。
カッコつけて、
strREADBUF.漢字氏名 = Space$(20)  'スペースで初期化する
を加えました。*タダ表現変えただけの盗作です。
面白いですね。始めは、strconvで変換しようかと考えていたのですが、
スペースを代入(初期化)で良かったんですね。
これからも、味付けテクニック、何かあったら、教えてください。

あとは、空行が1行出る問題か、、ループの作りが悪いんだけど、
今回は、小細工で、
LOF(filenumber)を使用して、ファイルサイズを算出します。
これを64で/って、レコード数を出します。

    For n = 1 To (LOF(IN_FNO) / 64) 'ファイルサイズを64で割って、レコード数算出
        strREADBUF.漢字氏名 = Space$(20)  'スペースで初期化する
        ' Get ステートメントを使って、サンプル ファイルを読み込みます。
        Get #IN_FNO, n, strREADBUF    ' n番目のレコードを読み込みます。
        '読み込まれたデータを書き込むCSVにする、、、
        'カンマだけ付ける””は好みで?
        Print #OUT_FNO, Trim(strREADBUF.社員番号) & ",";  '←セミコロンを付けると
        Print #OUT_FNO, Trim(strREADBUF.漢字氏名) & ",";  '改行されない
        Print #OUT_FNO, Trim(strREADBUF.ローマ字) & ",";  'ここがポイント
        Print #OUT_FNO, Trim(strREADBUF.yobi1) & ",";
        Print #OUT_FNO, Trim(strREADBUF.yobi2)       '最後は改行したいので付けない
    Next n

手抜きだなぁ、、、EOFの正しい使い方(位置)、オボエナイト、、、

-----
LOF
Open ステートメントを使用して開いたファイルの長さをバイト単位で
示す長整数型 (Long) の値を返します。

構文
LOF(filenumber)

引数 filenumber には有効なファイル番号を整数型 (Integer) で指定します。
この引数は必ず指定します。

メモ   開いていないファイルの長さを取得するには、FileLen 関数を使用します。
-----

/*
 * 5.ハッシュ法・二分検索
*/

読者の方に、先に、解説されてしまった。。。
チョットなさけないと思いつつ、
楽な道(そのまま掲載)を選んでしまった。

*自分で、味付け方法わからなくて、ただ、レンジで温めるだけじゃ、、、ねぇ、

------------------------------------------------------
 >三流プログラマさま、こんばんは。
 >
 >二分探索とハッシュについてなかなか調べて頂けないので、
 >私からお答えしましょう。
 >
 >二分探索
 >
 >二分探索はキーがきちんと順番に並んでいる時に有効です。
 >
 >
 >   ○○○○○○○○○○○○○○○○○○○○○○○○○
 >                   小←         →大
 >
 >○が探索するデータだとします。キーは左にいくほど小さく、右にいくほど
 >大きいとします。
 >
 >まず、真中のデータを取り出して、探索キーと比較します。
 >
 >   ○○○○○○○○○○○○●○○○○○○○○○○○○
 >
 >ここで、キーが等しければ運良く探索が終了します。
 >探索キーが●のデータのキーより小さければ左半分、大きければ右半分に
 >探索したいデータがあるはずです。
 >
 >そこで、さらに左半分あるいは右半分に対して同じことを繰り返せば、
 >どこかで見つかります。
 >
 >このように、二分探索は探索候補を半分に絞り込んでいって探索しますので、
 >頭から順番に探索するよりずっと効率的に探索できます。
 >最悪の場合でも log_2 n 回(n は探索データの数)の比較で探索を終了することが
 >できます。順番に探索する場合は最悪の場合で n回の比較が必要なので、
 >データの数が多くなると二分探索がだいぶ有利になることが分かるでしょう。
 >
 >ハッシュ法
 >
 >ハッシュ法はデータを格納する時にちょっとした工夫をすることによって、
 >探索効率をあげます。
 >
 >まず、ハッシュ関数というものを考えます。
 >これは、検索の対象になるキーからある範囲の値を導くような関数です。
 >
 >具体例で説明します。
 >
 >文字列をキーとして検索をする場合を考えます。ハッシュ関数としては、
 >文字列の ascii コードの和を 100 で割ったあまりを求める関数とします。
 >
 >キーをハッシュ関数にかけて得られる値をハッシュ値と呼びます。
 >例ではハッシュ値は0〜99の値を取ります。
 >
 >ハッシュ法ではデータを格納する時にハッシュ値を求めてそれをインデックス
 >として格納します。データを検索する時には、検索キーをハッシュ関数
 >にかけてハッシュ値を求めて、そのインデックスからデータを取り出します。
 >
 >しかし、ハッシュ値は別のキーから同じハッシュ値を得られる場合もあります。
 >この場合どうするのでしょう?
 >
 >答え場簡単です。同じインデックスに複数のデータを格納できるようにします。
 >検索する時には、ハッシュ関数を使ってインデックスを求めてから、
 >そのインデックス中のデータからさらにキーの一致するものを探せば良いのです。
 >
 >ハッシュ値の取り得る範囲を十分大きくとっておけば、この方法で十分高速に
 >探索できます。なんといっても最初のインデックスを求めるところまでは
 >一回の計算で求めることが出来るわけですから。
 >
 >
 >あまり厳密的ではありませんが説明としてはこんなところです。
 >仕組みとしては、非常にシンプルですので容易に理解できると思います。
 >
 ># この文章は掲載可です。
--------------------------
丁寧な解説、ありがとうございます。
ご好意に甘えて、そのまま載せさせていただきました。
また、テクニック不足なところなど、あったら、
ガンガン、指摘してください。
*みなさんのここは違うだろ、、、などの毒舌メールまってます。
 (あたたかい、励ましメールも、まってますよ、、)

/*
 * 6.終わりの挨拶
*/
今回は、読者に頼りっぱなしの講座でした、、
積み残し、食べ残し、まだまだ、、、、

では、また。 三流PG Ken3でした。


No.33 1999/12/15
恐いもの知らずの時、、
[ページTOPへ戻る]
<恐いもの知らずの時、、>

目次
1.はじめの挨拶
2.BBSめぐりのマイナス反響
3.見積もり作成時安全をみすぎ
4.新雪を行くか、それとも、人の跡をなぞるか
5.おわりの挨拶
----------------------------------------------------------------------------
/*
 * 1.こんにちは
*/
こんにちは。
ネタ消化不良ぎみと、いろいろ、あったので、
発行間隔があいてしまいました。

今回の内容は、
恐いもの知らず関係?です。。。
*プログラム関係、今回も無しです、、、

15日水曜日、忘年会です、、面白い激論などあったら、
メルマガに載せますよ。
えっ、聞きたくない、、、まぁ、まぁ。

/*
 * 2.BBSめぐりのマイナス反響
*/
http://www.kigaru.com/kyodai.html
から、新着メッセージ、新規入会者
を見て、宣伝活動してました。

なんか、ハッカーさん達を怒らせてしまったみたいで、
BBSに同じメッセージを置くな、
そんなにHPに来てほしかったら、
荒らしてやる。
サンプルにウイルスを感染させてやる。
と
警告メッセージを感想欄に500件ほど、
メールで200件ほどいただきました。

う〜ん、インターネットって、恐いんですね。
私、まともに、プロバイダーのHP、メールアドレス
使ってます。。フリーでやったほうが、よかったのかなぁ。

また、何で氏名がバレてる?かなぁ
と思ったら、ニフティのページにリンクさせていて、
ニフティのIDから、氏名わかったみたいです。

いきなり、お馬鹿な○○賢○さんへ
なんて、メールが200件も来て、ビックリしました。

今は、落着いてます。
また、始まったら、恐いですが、、、、

インターネットは、いろいろな人が見ているんだなぁ、、と
少し、考えさせられた、事件でした。

/*
 * 3.見積もり作成時、安全をみすぎ
*/
少し前、バックアップ1台1万、予算100万の話をしました。
作業的に、
安全をみた提案(フルバックアップ)をしてしまったので、
今年は、見送り・無しになりました。

自分のHDなら、必要な文書データと再インストール可能なアプリ
切り分けて、バックアップ取れるのですが、
しらない環境、だと、安全をみてしまいます。。。

少し前の(新人の頃)恐いもの知らずの坊やだったら、
たぶん、「1台1万OKですよ、やりましょう、おいしいですね」
と言って、やってたと思います。

最近、システムの見積もりも、
このツール使用したこと無いから
高目に見積もったり、してます。

テメエも大人になったんだよ、キットね
(悪い意味・良い意味含めて)

でも、
結果、金額高いので、仕事が取れない、、が多いです。

ムリして、危ない橋渡らなくてもイインジャナイ。
テメエは、石橋叩き過ぎで、渡れない臆病者になったんだよね。
綱渡りでも、渡る方法を考える方向に行かないかなぁ?

なんて、、、、
恐いもの知らず、、で少し考えさせられました。。。
来年から、勇気を出して、火の中飛び込みますか、、、

/*
 * 4.新雪を行くか、それとも、人の跡をなぞるか 
*/
使用したこと無い、ツール、言語、、、

社内でダレもやったこと無い作業をやる時、
ワクワクしますよね?
えっ、やりたくない、、、?

スキーで新雪を行くか、それとも、人の跡をなぞるか
みたいなものですね。。。
*スキー・スノボやらない運動音痴に言われたくないって?
 あっ、ソリならやったことアルよ、、、

道に迷って、道を覚えるみたいで、
失敗しながら自分の道を見つけていくのが、
いいのでしょう
でも、仕事でやる見積もりになると、なんか、、、臆病になってます。

回り道でも、目的地につけば、よしと思って、、、

/*
 * 5.終わりの挨拶
*/
今回も、なんとなく、
わからない文章になってしまいましたが、
・インターネットは恐い(無知は恐い?)
・考えすぎないで実行
の2点かなぁ、、、

では、また。 三流PG Ken3でした。

No.34 1999/12/21
手抜きの進め?、、
[ページTOPへ戻る]
<手抜きの進め?、、>
目次
1.はじめの挨拶
2.読者より、面白いページ教えてもらいました。
3.読者より、質問。
4.CSVから固定長(普通の)に変換 楽して、、、
5.しかたない、、、自分で作ろう、、、
6.おわりの挨拶
----------------------------------------------------------------------------
/*
 * 1.こんにちは
*/
こんにちは。
なんか、最近、ネタ消化不良ぎみで、
発行間隔があいてしまいました。

今回の内容は、
手抜きです。。。

えっ、いつもダロ、、、なんて、こと言わないで、、
少しお付き合いください。

/*
 * 2.読者より、面白いページ教えてもらいました。
*/

読者より、面白いページ教えてもらいました。

リンクフリーなので、載せます。
http://www.interq.or.jp/kansai/kanae/
このページの作者のほうが、切り口、面白いです(いい味だしてます)

まぁ、十人十色だから、いっかな。

お時間のある人は、見てみてください。
(試食してください、味は、Ken3好みですよとても、、、)

最近、ネタ消化不良だからって、手抜きするなよな。。。
えっ、たまたま、おいしいお店?を紹介しただけですよ。
そんなことしてると、大切な読者、取られちゃうよ?
あっ、そっか。。。

/*
 * 3.読者より、質問。
*/
メールで直接、下記の質問、来ました。
ありがたいです、、、最近、サボリぎみなのに、、、

---------
>それでは、CSVから固定長(普通の)に変換はどうでしょうか?
>サンプルデータは会員番号1(8桁)、漢字氏名(20桁)、ローマ字
>(18桁)、生年月日(10桁)、会員番号2(10桁)、暗証番号
>(3桁)で構成されています。
>簡単すぎるでしょうが、宜しくお願いします。
---------

なんか、私の実力、誤解されてるような、、、
三流プログラマなんで、期待しないで下さい。。。

---------
>以前、BASICで、行列関数を使って、支店ごとの仕入れ金額計算と、販売数量把握の
>ための、プログラムを作ったことがあるのですが、BASICから、VBAに移行するには、
>どうしたらよいのでしょうか。
---------

BASICから、VBへの移植かぁ、、、なんか、仕事でもあったような。
ポイント、どこだろう?、、、まとめてみる価値、ありそうですね。
*今後の課題ネタですね

---------
>VBA等の単語の意味を書いた本があれば紹介してほしいのですがよろしくお願いしま
>す。
---------

冷たく、ヘルプを見る、、じゃなくて、う〜ん、
どの本だろう?
私は、コレがキッカケでおぼえました、、の本、大募集。
私もHPに、Ken3の書籍一覧、載せます(予定)
*毎月買ってる本、昔買った本の一覧を載せてみようと思います
 バカ正直に、エロ本載せるなって、、
 わかってますよ、コンピュータ関係だけですよ。まったく、、
 (また、女性読者減少だね、、まったく、、もう、、、)

すこし、疲れてるので、このへんで?


/*
 * 4.CSVから固定長(普通の)に変換 楽して、、、
*/
CSVから固定長(普通の)に変換
かぁ、、、
Excelの機能で、できないかなぁ、、、
チョット、やってみますか。
( hosoku/034/index.html 参照 )

まず、Excelを起動して、
ファイル開くのテキストファイル、、、

ファイル名を指定して、
おっと、次は、カンマやタブなどの区切り文字、、
を選択して、、

区切り文字の種類をカンマにレ(チェック)を付けて、

文字列にして、取り込み、、、完了。

あとは、固定長で、テキストを保存すれば、OKかな。。。

あれ、、名前を付けて保存に、固定長テキストファイルが無い???
えっ、なんで???Excelの機能にないの?
(↑、、これ、Ken3のマチガイかもしれないので、要調査です、、)

/*
 * 5.しかたない、、、自分で作ろう、、、
*/ 
自分で、作ることにします。
Accessのテーブルに入れれば、なんかできそうな気がする
けど、Excel VBAでカッコわるく作ります。
(とりあえず、固定で、汎用性の無いプログラムで、、、)

マクロ記録で、途中まで作ります。。。
オイオイ、そんなんで、いいの?
まぁまぁ、、、途中までは、適当に、、最後の味付けだけ、
今回は、がんばります。
( hosoku/034/index.html#009 参照 )

ツール、マクロ記録を選択。
先ほどの手順で、テキストファイルを読み込みます。

ALT+F11を押すと、
すると、下記のようなモジュールができてます。
*あいかわらず、Excel君すごいような、、
 バカ正直なようなコード書いてくれます
 (ほんと、助かります、三流の私は、、、)

Sub Macro1()
'
' Macro1 Macro
' 録日 : 1999/12/21  
'

'
    Workbooks.OpenText FileName:="D:\034\Sample.txt", StartRow:=1, DataType:= _
        xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _
        Tab:=False, Semicolon:=False, Comma:=True, Space:=False, Other:=False _
        , FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 5), Array(5, 2), _
        Array(6, 2))
End Sub

まぁ、意味わかんないけど、これで、CSVがExcelになります。

あとは、このコードに肉づけして、、、

Sub Macro1()
    
    Dim strINFname  As String
    Dim strOUTFname As String
    
    Dim nYLINE As Integer
    Dim x      As Integer
    Dim OUT_FNO%
    
    Dim nOUTSIZE(10) As Integer     '10もいらないでしょ、、、
    Dim strOUTBUF As String
    
    ' csvtotxt.xls のパスを使用して、INファイル、Outファイルの
    'ファイル名を作成する
    strINFname = ActiveWorkbook.Path & "\Sample.txt"
    strOUTFname = ActiveWorkbook.Path & "\out.txt"
    
    'お行儀良く、入力ファイルがアルか、チェックしますか、、、
    If Len(Dir(strINFname) & "") = 0 Then
        MsgBox strINFname & "ファイルが見つかれません"
        Exit Sub  'モジュールを抜ける
    End If
    
    '入力ファイルをCSVで開く      ↓変数に変更
    Workbooks.OpenText FileName:=strINFname, StartRow:=1, DataType:= _
        xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _
        Tab:=False, Semicolon:=False, Comma:=True, Space:=False, Other:=False _
        , FieldInfo:=Array(Array(1, 2), Array(2, 2), Array(3, 2), Array(4, 5), Array(5, 2), _
        Array(6, 2))
        
    '出力テキストファイルを作成する
    'シーケンシャル ライト モードで開きます
    OUT_FNO = FreeFile
    Open strOUTFname For Output As #OUT_FNO
    
    '出力先のサイズを代入
    'サンプルデータは会員番号1(8桁)、漢字氏名(20桁)、ローマ字
    '(18桁)、生年月日(10桁)、会員番号2(10桁)、暗証番号
    '(3桁)で構成されています。
    nOUTSIZE(1) = 8
    nOUTSIZE(2) = 20
    nOUTSIZE(3) = 18
    nOUTSIZE(4) = 10
    nOUTSIZE(5) = 10
    nOUTSIZE(6) = 3
    
    'データが無くなるまでループ(A列が空白になるまで)
    'おいおい、データが1行しかなかったら、どうなるの?<<<知らない、、
    nYLINE = 2   'タイトルを抜かし、2行目から、スタート
    While Len(Cells(nYLINE, 1) & "") <> 0
        For x = 1 To 6 'AからF列まで処理
            strOUTBUF = LeftB(Cells(nYLINE, x), nOUTSIZE(x))
            Print #OUT_FNO, strOUTBUF; '←を付けると改行されない
        Next x
        Print #OUT_FNO, ""     '改行のみする
        nYLINE = nYLINE + 1  '忘れないようにカウントアップ
    Wend
    
    Close #OUT_FNO                  ' ファイルを閉じます。

    '結果をメモ帳表示
    Shell "notepad.exe " & strOUTFname, vbNormalFocus
        
End Sub


こんな感じで、、、、

あれ、、、うまく行かない、、、
今日は、あきらめます(すみません)
strOUTBUF = LeftB(Cells(nYLINE, x), nOUTSIZE(x))
これが、おかしいみたいですが、、、

/*
 * 6.終わりの挨拶
*/
今回も、積み残しました。
ユニコード、、、わかっていないのが、
バレましたね。。。

次回にナントカ、、、

ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

質問や要望など メッセージを送る(三流君に連絡する)

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)


急ぎで連絡がほしい、そんな時は:[三流君連絡先アドレス]を見て連絡してください。

リンクや広告など

項目別に↓に本音?それとも建て前?的な記事をまとめました。お探しのジャンルを選択してください。
[ルーキー rookies]・・・ 新人さん達 初心者さんへ
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話
[共同作業 team]・・・チーム、グループ作業
[プログラムは心? spirit]・・・プログラマー 心・気質・魂

[掲示板デビューしようぜ bbs]・・・掲示板関係の話、質問者・回答者の気持ちほか
[昔はできた seo]・・・三流式の効果無しSEOとアフィリエイト
[仕事や作業、転職 job]・・・仕事や転職、評価、作業など
[その他 etc]・・・その他 分類外の記事

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [愚痴(Bookmark)]/ [広告Blog(Bookmark)]



[三流君(TOP ken3.org へ戻る)] / [プログラマー業務の愚痴] / [バックナンバー 一覧]