2018年9月10日月曜日

Excel VBAでSort

 昔作ったExcel VBAのSortのプログラムを見つけました。せっかくなので、以下に載せます。

 10,000個くらいの数値なら一瞬でソートしてくれました。1,000,000個くらいになるとPCが少し固まりました。
 ビッグデータなんてのが流行っていますが、データ件数が1,000,000を超えると処理に時間がかかって大変そうです。

 ソースコードは、ご自由にご利用ください。ただし、趣味のプログラムなので、保証はありません。


Option Explicit

Public Sub test()
    Dim i As Long
    Dim N As Long
    Dim num() As Long
 
    Sheet1.Cells.ClearContents
 
    N = 8
    ReDim num(N - 1) As Long
 
    For i = 0 To N - 1
        num(i) = N * Rnd()
    Next i
 
    For i = 0 To N - 1
        Sheet1.Cells(i + 1, 1) = num(i)
    Next i
 
    'sort_selection num, N
    'sort_insert num, N
    sort_quick num, 0, N - 1
 
    For i = 0 To N - 1
        Sheet1.Cells(i + 1, 2) = num(i)
    Next i
End Sub

'選択ソート
'最小値を見つけて、小さい順に並べる
Public Sub sort_selection(num() As Long, N As Long)
    Dim i As Long
    Dim j As Long
    Dim temp As Long
 
    For i = 0 To N - 1
        For j = i To N - 1
            If num(j) < num(i) Then
                temp = num(i)
                num(i) = num(j)
                num(j) = temp
            End If
        Next j
    Next i
End Sub

'挿入ソート
'ソートされている部分に後ろから1つずつ値を挿入していく
Public Sub sort_insert(num() As Long, N As Long)
    Dim i As Long
    Dim j As Long
    Dim temp As Long
 
    For i = 0 To N - 1
        temp = num(i)
     
        For j = i To 1 Step -1
            If temp < num(j - 1) Then
                num(j) = num(j - 1)
            Else
                Exit For
            End If
        Next j
         
        num(j) = temp
    Next i
End Sub

'クイックソート
'pivotの値より大きいか小さいかで選り分ける
Public Sub sort_quick(num() As Long, n1 As Long, n2 As Long)
    Dim i As Long
    Dim j As Long
    Dim pivot As Long
    Dim temp As Long
 
    '------------------------------
    'すべての値が同じ場合は、ここで終了
    For i = n1 To n2
        If num(n1) <> num(i) Then Exit For
    Next i
 
    If i = n2 + 1 Then Exit Sub
 
    '------------------------------
    'pivotを選択 (pivotより小さい値が必ず存在する)
    If num(n1) < num(i) Then
        pivot = num(i)
    Else
        pivot = num(n1)
    End If
 
    '------------------------------
    i = n1
    j = n2
 
    Do While True
        Do While num(i) < pivot
            i = i + 1
        Loop
     
        Do While pivot <= num(j)
            j = j - 1
        Loop
     
        If j < i Then Exit Do
     
        temp = num(i)
        num(i) = num(j)
        num(j) = temp
    Loop
 
    sort_quick num, n1, i - 1
    sort_quick num, j + 1, n2
End Sub

2018年8月12日日曜日

ケネディの言葉を思い返して

"Ask not what your country can do for you, ask what you can do for your country."

 ジョン・F・ケネディの大統領就任演説の一節です。平易な言葉で構成され、前半と後半がきれいに対比されている、美しい文章だと思います。


 ここ数年、地震、豪雨、猛暑と自然災害が続きます。そういった災害が起きると、国の助成金の話が出てくるものです。
 年金、生活保護、地方交付金など、国がお金を払う支援制度は、あまたあります。
 過労死の問題で、国の支援を要求するなんて話もありました。


「弱者が国の支援を求める」そんなニュースを聞くことは、少なからずあります。助けを求めるのは間違いではないでしょう。
 ですが、支援ばかりを要求するコメントを聞くと、不快に感じます。

 社会の支援を求めるだけでなく、社会のために貢献することは大事なことです。金銭ばかりを要求する放蕩者ではいけないと思うのです。

 ケネディ大統領の演説を思い返して、そんなことを考えたりしてます。


2018年6月3日日曜日

モンテスキューに敬意を込めて

 ここのところ、国会では、官僚が文書を改ざんしたとか、政治家が失言したとか、といった話題が盛んに話されているようです。
 聞いていて辟易します。「国会は法律を作る立法府」じゃなかったっけ?というところから、私はモンテスキューを思い出しました。

 モンテスキューについては、小学生のときに習いました。「法の精神」を著した人物で、権力を立法、司法、行政に分ける三権分立を提唱した人と記憶しています。

 小学生の私は、「まぁ、そんなものなのか」と思っていました。「学校で教えるのだから、きっと大事なことなのだろう」くらいに思っていました。今の子供も三権分立というのを習うのでしょうか?習ったとしても、国会が立法府であることを理解するのは難しいかもしれません。

 かつてモンテスキューが考えていた事と、今の国会で言ったとか言ってないとかを延々と話している方々の考えている事は、まったく別物でしょう。

参考:Wikipedia 法の精神

2018年3月18日日曜日

Where my money at ?

 珍しく東京で電車に乗った時のことですが、小学校5,6年生と思しき子供が本を読んでいるのを見かけました。読んでいた本は、「ピーター・リンチの株で勝つ」。
 昨今は、子供も投資を考える時代みたいです。

 (私はこの本を読んでいないので、詳しくは知りませんが。)

 政府は投資を推奨しているみたいです。少額投資非課税制度 (NISA) や、確定拠出型年金 (Idecoなど) が色々なところで宣伝されています。
 (正直なところ、確定拠出年金のように、半ば強制的に投資させられるのは、いい気分ではないです。)

 みんなが投資すれば、市場にお金が供給されて、物価上昇率2%の目標も達成できるでしょう。
 ワー、スバラシー (棒読み)。

 投資は重要な経済活動です。投資で資金が集まる産業は発展します。つまり、将来的に発展させたい産業に投資が行われるようにすべきです。
 どの産業を発展させるかの選択は、非常に難しい問題です。政治的な意図も絡んできます。将来を左右する問題である以上、あまり安易に投資を推奨されるのには違和感を覚えます。

 ただ株価の数字だけ見て利益を追及するのはマネーゲームです。「利益のためなら、どんな犯罪組織に投資してもOK」ということになってしまいます。
 残念ながら、将来の社会を見据えた投資と、ただのマネーゲームとの区別は難しいです。

 
 政府が推奨しているのだから、これからは投資が盛んに行われる社会になるのかもしれません。
 私の希望としては、「パソコンに向かっているだけのトレーダー」が得をして、「汗を流して働いている労働者」が損をする、そんな社会にはなって欲しくないです。



 余談ですが、今回のタイトルは、Wyclef Jeanの"Sweetest Girl"という曲からとりました。"~work for the president"ってところの歌詞が面白いです。


C#でファイルサイズのリストを作ろう

 パソコンのHDDの空き容量が少なくなってきたので、いらないファイルがないか調べてみることにしました。

 コマンドプロンプトで、
    dir /s /-c > filelist.txt
と入力して実行します。すると、filelist.txtには、現在のディレクトリの下にある全てのファイルとディレクトリが出力されます。"/s"は下の階層まで表示するオプションで、"/-c"はファイルサイズの数字にカンマを入れないというオプションです。

 これを、Cドライブの直下でやると、Cドライブにある全てのファイルとディレクトリが出力されます。処理に1分くらいかかるかもしれません。私の場合、出力結果は30MByteくらいになりました。

 これでファイルサイズのリスト自体はできるのですが、余計な文字列があるため分かりにくいです。というわけで、C#でファイルサイズとファイル名だけ抽出するプログラムを作ってみました。ソースコードを下の方に載せておきます。空白行とかを無視して、必要な情報を抜き取っているだけです。

 もちろんExcel VBAとかで作ることもできます。そもそも、ファイルサイズのリストを作るフリーソフトは多数あるので、わざわざプログラムを書く必要はありません。敢えてプログラムを自分で書いているのは、ただの趣味です。

 で、抽出結果をExcelで読み込んで調べてみたところ、"cab_*"という0~100MByteのファイルが1000個以上ありました。
 「なんじゃこりゃ?」と思って、Google先生に聞いてみたら、どうもいらないファイルらしいです(参考)。

 早速、"cab_*"ファイルを削除したら、空き容量が50GByteくらい増えました。

 これにて一件落着。めでたし、めでたし。勉強になりました。




using System;
using System.IO;
using System.Text;

public class Program
{
public static void Main( string[] args)
{
if( args.Length == 0)
{
return;
}

string readfile = args[0];
string writefile = readfile + ".parse.csv";

try
{
using( StreamReader sr = new StreamReader( readfile, Encoding.GetEncoding( "shift_jis")))
{
using( StreamWriter sw = new StreamWriter( writefile, false, Encoding.GetEncoding( "shift_jis")))
{
ParseDir( sr, sw);
}
}
}
catch( System.Exception err)
{
Console.WriteLine( err.Message);
}
}

private static void ParseDir( StreamReader sr, StreamWriter sw)
{
string str;

str = sr.ReadLine();
str = sr.ReadLine();

while( !sr.EndOfStream)
{
str = sr.ReadLine();

if( str.Length == 0)
{
continue;
}

if( str[0] != ' ' && str.IndexOf( "<") == -1)
{
sw.Write( Convert.ToInt64( str.Substring( 19, 16)));
sw.Write( ", ");
sw.Write( "\"" + str.Substring( 36, str.Length - 36) + "\"");
sw.WriteLine();
}
}
}
}

2018年2月18日日曜日

流れの設計

 通勤に軽自動車を使っています。スズキのハスラーです。最近は、朝が寒くて、車の全面が凍り付いてしまい、融かすのに一苦労しています。

 氷が融けると水になります。ハスラーの天井は水平なので、天井で融けた水は流れずに残ります。残った水が乾くと、埃の跡になります。ウォータースポットと呼ばれる汚れです。

 例えば、車両の天井に少し傾斜があれば、水は流れて行くので、埃の跡は残りにくいでしょう (もちろん、車の表面の撥水性も大事です)。

 (ちなみに、同様の現象を、科学の世界ではコーヒーリング現象と呼ぶそうです。半導体の世界ではウォーターマークと呼んだりします。)


 私のアパートのキッチンの流しには、プラスチック製のフタのようなものがあります。水は流すけど、大きなものはせき止めるアレです。そのフタの下にさらに金網があります。

 このフタですが、これまた水平に設計されています。水を流した後は、表面張力で、このフタの上に水が溜まります。いつまで経っても乾きません。

 キッチンに水が残っていると、雑菌が繁殖しやすくなり、不衛生です。そこで私はペットボトルのフタくらいのプラスチックをこのフタに挟んで、傾きをつけてやりました。案の定、水が流れやすくなって、フタはすぐ乾くようになりました。


 流れを設計するというのは、とても重要なことです。エアコンの効きをよくするには、部屋の中の流れを考えます。人の流れやクルマの流れも同じで、意図的に流れを作ると、混雑しにくくなります。

 ポイントは、淀みを作らないことです。流れる水は清いものですから。

参考:コーヒーステイン、ウォーターマーク

ぶらり寝台列車の旅

 世の中には様々な交通手段があります。

 私が住んでいるところから東京まで行くには、新幹線 or 飛行機というのが普通なのですが、今まで寝台列車というやつに乗ったことがなかったので、試してみることにしました。

 乗ってみたのはサンライズ瀬戸・出雲です。この列車は、7両編成のサンライズ瀬戸(高松発)と、同じく7両編成のサンライズ出雲(出雲市発)が岡山駅で連結されて東京駅へ向かいます。私が乗ったのは岡山駅からです。岡山駅を夜の22:34に出発、東京駅に翌朝の7:08に到着します。

 チケットは、インターネットでは購入できないとのことで、みどりの窓口で購入しました。値段は、一番安いノビノビ座席で、¥16,000くらいです。岡山までの運賃もあったため、新幹線で移動するより少し安い程度でした。高い座席を選ぶと新幹線より高額になると思います。ちなみに高速バスだと、¥10,000くらいなので、値段だけなら高速バスの方がずっとお得です。

 そして、乗車当日。

 夜中の岡山駅で寒い中待っていると、ようやく列車がやってきました。Web Siteに載っている通りの列車ですが、初めて見る2階建ての車両は新鮮に感じます。
 予約したノビノビ座席は、2階建てベッドをたくさん並べて、間を少し区切ったような感じの座席です。カーペット敷きで、十分に足を伸ばして眠れる広さがあります。各座席には毛布が用意されていました。枕は無かったです。高速バスと違って完全に横になれるので快適でした。

 ちなみに、サンライズ瀬戸・出雲には、自販機はありますが、車内販売はありません。また、トイレとシャワールームがあります。シャワールームを使うには、別途カードが必要らしいです。

 「わざわざ新幹線を使わずに、寝台列車に乗るのはどんな物好きだろう?」と、周りの様子を伺うと、乗っていたのはたくさんの外国人旅行者でした。ヨーロッパ系?、インド系?の旅行者らしき人達。よくは分からなかったのですが、中国系、韓国系の旅行者の方もいたかもしれません (マナーが悪いと言われがちな、中国人観光客の集団といった感じの人々はいませんでした)。それと日本人の家族連れや年配の旅行者。寝台列車を選ぶという物好きな人々であることは間違いないと思います (人のことは言えませんが)。

 乗車後、とりあえず自分の指定座席に行くと、隣の外国人旅行者が、「友達と並びたいから場所を交換してくれ」って。で、交換したら、また別の外国人旅行者が同じく「交換してくれ」って。で、2回も場所を交換しました。うーん。なんともたくましい旅行者の方々。

 列車が出発したら、あとは東京駅まで寝て待つだけです。22:34に岡山駅を出て、ふと目が覚めたときには、大阪駅でした。さすがに深夜なので、人もほとんどいません。列車は暗闇の中をひたすら進んでいきます。楽しむ景色はありませんが、少しワクワクします。

 また、ひと眠りして目が覚めると、今度は静岡駅でした。朝の5:00くらいだったと思います。東京駅には7:08着の予定です。

「・・・あれっ。」

 新幹線と違いスピードは出ないのに、まだ静岡駅です。「なんか遅いなぁ」と思っていたら、車内放送が。40分の遅れとのこと。

「えぇーーー。」

 「なんで夜行列車が遅れるの?」と思っていたら、また車内放送が。なんでも、先行する貨物列車がシカと衝突したそうです。

「・・・シカじゃ、仕方ない・・・」

 車内放送によると、東京駅着は8:30になるとのこと。それだと私は遅刻してしまうので、熱海で振り替え輸送の新幹線こだまに乗り換えました。ちなみに、私は運良く座れましたが、早朝の東京往きの新幹線は立ち乗りの人もいるくらい混んでいます。

 結局、東京駅には7:30頃に着いたので、私は無事に間に合いました。


 初めての寝台列車の旅。なかなか思い出深い体験になりました。

参考:サンライズ瀬戸・出雲