プログラミングのすすめ 第六歩 プロジェクト FX損益総計グラフ

プログラミング
【paters】

プログラミングのすすめ 第六歩 は、今までの windows プログラミングと JavaScript とを合わせて、ある程度目的を持ってちょっとは使い物になるものを作ろうと思います。

そこで、最近 FXを始めたこともあり、毎日のFXの損益をグラフにするプログラムを作っていこうと思います。

会員数は国内最大級の180万人を突破!【paters】 老舗サイトのラブサーチ[18歳以上]

プロジェクト

名付けて ”プロジェクト FX損益総計グラフ” です。

FXの約定履歴からデータをダウンロードし、次のように毎日の建玉損益を集計します。

9/19/29/59/69/79/89/99/109/139/149/159/169/179/209/219/229/239/249/279/289/299/30
100045003880-21003000-5300-210030034103420-20102104509901240-31003010-10002050-300203570
9月の日毎の損益データ(仮)

このデータを元に次の様なグラフを作るのが目的です。

約定履歴のCSV形式データの処理

データの形態を知る

どこのFX会社でも、WEBのFX取引ツールから 約定履歴が .csv形式等でダウンロード出来ると思います。

データを集計する上では、ダウンロードした データがどのような形なのかを調べる必要があります。

まず、約定履歴で 9/1~9/30 の期間を指定して、決済のみの 売買を CSV出力して ダウンロードしました。CSV出力では、次の様にそれぞれの項目がカンマ[,]で区切られています。

“通貨ペア”,”売買”,”区分”,”数量(Lot)”,”約定レート”,”建玉損益(円)”,”スワップ”,”決済損益(円)”,”注文日時”,”約定日時”,”注文番号”,”円転レート”,”取引手数料”,”建玉損益”
“AUD/JPY”,”買”,”決済”,”1″,”93.938″,”1,000″,”0″,”1,000″,”2022/09/30 17:44:45″,”2022/09/30 17:50:27″,”126000006050495″,”-“,”0″,”\1,000”
“AUD/JPY”,”売”,”決済”,”1″,”94.07″,”1,600″,”0″,”1,600″,”2022/09/30 17:21:51″,”2022/09/30 17:21:56″,”126000006042192″,”-“,”0″,”\1,600”
“AUD/JPY”,”売”,”決済”,”1″,”94.044″,”1,020″,”0″,”1,020″,”2022/09/30 11:40:31″,”2022/09/30 11:51:56″,”126000006041309″,”-“,”0″,”\1,020”
カンマ[,] で区切られた 6番目に建玉損益、10番目に約定日時が入っています。

6番目の建玉損益 と 10番目の約定日時を取り出して、日毎の合計を計算するプログラムをVBのコンソールアプリで作ります。

ダウンロードした9月の約定履歴データは、TradeRecordList9.csv という名前で \SumByDay という ディレクトリに置いてあります。

C:\WINDOWS\system32>cd \SumbyDay

C:\SumByDay>dir
 ドライブ C のボリューム ラベルは Windows7_OS です
 ボリューム シリアル番号は D97B-6C70 です

 C:\SumByDay のディレクトリ

2022/10/09  16:50    <DIR>          .
2022/10/09  16:50    <DIR>          ..
2022/10/09  16:25            23,112 TradeRecordList9.csv
               1 個のファイル              23,112 バイト
               2 個のディレクトリ  19,265,359,872 バイトの空き領域

それでは、早速 プログラム作りを始めましょう。新たに使うVBの関数等は、各項目の最初に記してあります。

約定履歴データのファイルを読み込む

StreamReader() , ReadLine() , Do Until / Loop

まずTradeRecordList9.csv を読み込むVBプログラムを作ります。Visual Studio 2022 で コンソールアプリの作成で始めます。

Imports System
Imports System.Diagnostics.Eventing
Imports System.IO

Module Program
    Sub Main(args As String())
        Dim sr As StreamReader = New StreamReader("\SumByDay\TradeRecordList9.csv")
        Do Until sr.EndOfStream
            Dim line1 As String = sr.ReadLine()
            Debug.WriteLine(line1)
        Loop
        sr.Close()
    End Sub
End Module

それでは、新しく記述したコードの解説を致します。

Imports ステートメントは、main のコードを記述すると自動的に記述されます。

新たに記述したコードは7行目~12行目です。

\SumByDay\TradeRecordList9.csv を sr という名前の変数に StreamReader として定義します。StreamReader とは、テキストファイル読み込みのためのクラスです。
sr の最後のLineまで処理を続けます。
sr から1行を読み込んで line1 という ストリング変数に格納します。
確認のために デバッグ窓にline1の内容を書き出します。
Do Until から Loop までを sr の最後の行(sr.EndOfStream)まで繰り返します。
ファイルをクローズします。

デバッグの開始 で実行してみます。

日本語部分が文字化けしていますね。

今回の処理には関係ないのですが、一応 直して置きます。このような文字化けの対策については、プログラミングのすすめ 第三歩 をご参照下さい。

ファイル TradeRecordList9.csv を一旦 適当な editor で読み込み、 UTF-8 BOM属性付き で保存しなおします。

再実行結果

文字化けが直りました。

行から必要なデータを取り出す

String() , Split()

会員数は国内最大級の180万人を突破!【paters】

次は読み込んだ1行のデータからカンマで区切られた建玉損益(6番目)と約定日時(10番目)のデータのみを取り出します。

Sub Main(args As String())
        Dim sr As StreamReader = New StreamReader("\SumByDay\TradeRecordList9.csv")
        Dim ret As String()
        Do Until sr.EndOfStream
            Dim line1 As String = sr.ReadLine()
            ret = Split(line1, ",")
            Debug.WriteLine(ret(5))
        Loop
        sr.Close()
    End Sub

新しく記述したコードの解説をします。

ret という変数名でストリング配列を定義します。String() のように String の後ろに () を付けると ストリングの配列変数になります。
Split関数は、指定したストリングを区切り文字で区切ったストリングの配列を返します。読み込んだ1行の文字列(line1)をカンマ(,) で区切って 0番~ からストリング配列 ret(0),ret(1),ret(2) ~ ret(n) の様に要素の数だけ ret() に格納されます。
確認のため 6番目のデータ(建玉損益)をデバッグ窓に表示します。

デバッグの開始 で実行してみます。

エラーなしで実行はされましたが、所々 出力されたデータがおかしいです。 ”-1 とか “2 はおかしいですね。

該当部分の行データを見てみましょう。最後から8行目の “2 と出たところの1行です。
"AUD/JPY","売","決済","1","95.127","2,400","0","2,400","2022/09/01 20:50:38","2022/09/01 20:51:13","126000005050844","-","0","\2,400"

“AUD/JPY”,“売”,“決済”,“1”,“95.127”,“2,400″,“0”,”2,400″,  確かにカンマ(,)で区切って6番目は “2 です。

“2,400” は 建玉損益が 2,400円 ということなのですが、1,000円以上は三桁毎に , が入るので カンマ(,)だけで区切った場合は不都合です。ということで、データをよくみると ”,” を区切り文字にすると問題なく行きそうです。

ダブルクォーテーション(“) をSplit関数の区切り文字に使いたい

イククルはコチラ!(18禁)

ダブルクォーテーション(“) を区切り文字にしたい時は、区切り文字を定義する (“) の中に “” と二個続けて記述することで可能となります。従って  “,” を区切りとしたいときは ret = Split(line1, “””,”””) と記述します。

Sub Main(args As String())
        Dim sr As StreamReader = New StreamReader("\SumByDay\TradeRecordList9.csv")
        Dim ret As String()
        Do Until sr.EndOfStream
            Dim line1 As String = sr.ReadLine()
            ret = Split(line1, """,""")
            Debug.WriteLine(ret(5))
        Loop
        sr.Close()
    End Sub

実行結果は

先ほどの ”2 は 2,400 に “-1 は -1,100 になりました。正しく取り出せています。

約定日時も正しく取り出せているかどうか見てみましょう。

 Sub Main(args As String())
        Dim sr As StreamReader = New StreamReader("\SumByDay\TradeRecordList9.csv")
        Dim ret As String()
        Do Until sr.EndOfStream
            Dim line1 As String = sr.ReadLine()
            ret = Split(line1, """,""")
            Debug.WriteLine(ret(9))
        Loop
        sr.Close()
    End Sub
正しく取り出せているようです。

ここまで、今回のプロジェクトの説明とデータの読み込み、必要なデータの取り出し方について解説してきました。

抽出データの整形

Replace() , Substring() , If / then / else / End if

会員数は国内最大級の180万人を突破!【paters】

次は、抽出した 建玉損益 、 約定日時 を処理し易い様に整形します。

建玉損益は、[680] , [-1,100] , [2,400] , [800] のような形で得られますが、 1,000円以上の数字に 3桁ごとにカンマ[,] がふられています。このまま JavaScript に渡すとエラーになります。 [,] は取り除く必要があります。

約定日時については、その日ごとに約定した建玉損益を合計するのが目的ですので、約定日時は 09/01 のように 月/日 だけで十分です。これを考慮して、抽出した 建玉損益・約定日時 を整形します。

Sub Main(args As String())
        Dim sr As StreamReader = New StreamReader("\SumByDay\TradeRecordList9.csv")
        Dim ret As String()
        Dim Soneki As String
        Dim MonthDay As String
        Do Until sr.EndOfStream
            Dim line1 As String = sr.ReadLine()
            ret = Split(line1, """,""")
            Soneki = ret(5).Replace(",", "")
            If Len(ret(9)) > 10 Then
                MonthDay = ret(9).Substring(5, 5)
            Else
                MonthDay = ret(9)
            End If
            Debug.WriteLine(Soneki + " " + MonthDay)
        Loop
        sr.Close()
    End Sub

更新したコードについて解説致します。

Soneki , MonthDay という変数を Stringとして定義しています。
Replace関数で 文字配列 ret(5) の中の内容にカンマ[,] があれば Null(空文字) に変換します。(カンマを取り除きます)
文字配列 ret(9) の長さが10文字より大きい場合だけ、Substring関数で ret(9) の 5桁目から5文字を MonthDay に代入します。
Soneki と MonthDay の内容を デバッグ窓に表示します。

デバッグの開始 で実行します。

建玉損益の 1000円以上の時のカンマは取り除かれています。約定日時は 月/日 だけになっています。

最初の行にタイトルが入っているので、If 文で 約定日時のデータ値が10桁以下の時は、Substring関数を通さないようにしていたのですが、最初の行をダミーで読み込んで飛ばせば、いいことなのでコードを次のように変更しました。

    Sub Main(args As String())
        Dim sr As StreamReader = New StreamReader("\SumByDay\TradeRecordList9.csv")
        Dim dummy As String = sr.ReadLine()
        Dim ret As String()
        Dim Soneki As String
        Dim MonthDay As String
        Do Until sr.EndOfStream
            Dim line1 As String = sr.ReadLine()
            ret = Split(line1, """,""")
            Soneki = ret(5).Replace(",", "")
            ' If Len(ret(9)) > 10 Then
            MonthDay = ret(9).Substring(5, 5)
            ' Else
            ' MonthDay = ret(9)
            'End If
            Debug.WriteLine(Soneki + " " + MonthDay)
        Loop
        sr.Close()
    End Sub
sr.ReadLine() を一回行う事により、最初の行を読み飛ばします。他は、If 文をコメントアウトしています。

次は、日ごとの建玉損益を合計して行きます。

毎日の建玉損益の合計

ToString()

老舗サイトのラブサーチ[18歳以上] マッチングなしでメッセージ可能 ハッピーメール(18禁)
   Sub Main(args As String())
        Dim sr As StreamReader = New StreamReader("\SumByDay\TradeRecordList9.csv")
        Dim dummy As String = sr.ReadLine()
        Dim ret As String()
        Dim Soneki As String
        Dim MonthDay As String
        Dim PrevDay As String = "FirstDay"
        Dim DaySum As Integer
        Do Until sr.EndOfStream
            Dim line1 As String = sr.ReadLine()
            ret = Split(line1, """,""")
            Soneki = ret(5).Replace(",", "")
            MonthDay = ret(9).Substring(5, 5)
            If PrevDay = MonthDay Or PrevDay = "FirstDay" Then
                PrevDay = MonthDay
                DaySum = DaySum + Soneki
            Else
                Debug.WriteLine(PrevDay + " Sum " + DaySum.ToString)
                DaySum = Soneki
                PrevDay = MonthDay
            End If
            Debug.WriteLine(Soneki + " " + MonthDay)
        Loop
        Debug.WriteLine(PrevDay + " Sum " + DaySum.ToString)
        sr.Close()
    End Sub

追加したコードの解説を致します。

PrevDay というストリング変数を定義して初期データ ”FirstDay” を代入します。DaySum という整数変数を定義します。PrevDay は、読み込んだデータの日にちが変わったかどうかの判断に使います。DaySum は、毎日の建玉損益の合計に使います。
PrevDay と MonthDay を比較して一緒なら、または、 PrevDay が 初期値のままなら PrevDay に 日付 を代入し、DaySum に 損益を合計して行きます。 最初のデータと前に処理した日付が同じ時は、この処理を行います。前に処理した日付と読み込んだ日付が変わった時は、前の日付 と 損益の合計(DaySum.ToString : DaySumはintegerなので ToString関数で String に変換しています) をデバッグ窓に表示、DaySum を その日の最初の損益に、PrevDay に変わった日付をセットします。
このルーチンの流れでは、最後のデータを処理した後、合計を表示する機会が訪れないので、ここで表示しています。

デバッグの開始 で実行します。

最後の結果もちゃんと表示されています。合計の値も合っています。

合計だけの表示で実行しました。

この合計の結果だけをファイルに出力すれば良い筈です。

次は、結果をファイルに出力します。 

結果のファイル出力

StreamWriter() , WriteLine()

 Sub Main(args As String())
        Dim sr As StreamReader = New StreamReader("\SumByDay\TradeRecordList9.csv")
        Dim sw As StreamWriter = New StreamWriter("\SumByDay\TradeSumByDay.txt", False)
        Dim dummy As String = sr.ReadLine()
        Dim ret As String()
        Dim Soneki As String
        Dim MonthDay As String
        Dim PrevDay As String = "FirstDay"
        Dim DaySum As Integer
        Do Until sr.EndOfStream
            Dim line1 As String = sr.ReadLine()
            ret = Split(line1, """,""")
            Soneki = ret(5).Replace(",", "")
            MonthDay = ret(9).Substring(5, 5)
            If PrevDay = MonthDay Or PrevDay = "FirstDay" Then
                PrevDay = MonthDay
                DaySum = DaySum + Soneki
            Else
                Debug.WriteLine(PrevDay + " " + DaySum.ToString)
                sw.WriteLine(PrevDay + " " + DaySum.ToString)
                DaySum = Soneki
                PrevDay = MonthDay
            End If
        Loop
        Debug.WriteLine(PrevDay + " " + DaySum.ToString)
        sw.WriteLine(PrevDay + " " + DaySum.ToString)
        sr.Close()
        sw.Close()
    End Sub

新たに追加したコードの説明を致します。

sw という変数を StreamWriter として定義します。”¥SumByDay\TradeSumByDay.txt” がファイルパス・ファイル名です。二つ目のパラメータ False は、ファイルが既に存在する場合にデータを追記するか、上書きするかです。 False は上書きします。
日付と合計をファイルに書き出します。Sum は余分ですので スペースのみにしました。
ファイルをクローズします。

デバッグの開始 で実行してみます。

デバッグ窓の表示は以前と変わりませんが、\SumByDay\TradeSumByDay.txt が作成されている筈です。

コマンドプロンプトを立ち上げてチェックしてみましょう。

C:\SumByDay>dir
 ドライブ C のボリューム ラベルは Windows7_OS です
 ボリューム シリアル番号は D97B-6C70 です

 C:\SumByDay のディレクトリ

2022/10/12  21:30    <DIR>          .
2022/10/12  21:30    <DIR>          ..
2022/10/12  21:28        58,504,498 SumByDay.exe
2022/10/09  21:42            19,314 TradeRecordList9.csv
2022/10/12  21:30               195 TradeSumByDay.txt
               3 個のファイル          58,524,007 バイト
               2 個のディレクトリ  14,082,400,256 バイトの空き領域

C:\SumByDay>type TradeSumByDay.txt
09/30 6780
09/29 2950
09/28 9940
09/15 -7600
09/14 -960
09/08 -7860
09/07 -12180
09/06 2160
09/05 4090
09/03 -150
09/02 550
09/01 3100

C:\SumByDay>

ファイルの中身も正しいようです。

実行可能ファイルを単一ファイルとして発行する

Visual Studio 2022 での最後の作業です。 作成した プロジュクト SumByDay の 実行可能ファイルを発行します。

そのままで発行すると、 exe と dll の二つのファイルが出来て この二つのファイルがないと正しく実行できません。

exe ファイルだけで実行可能とするため、発行前に次の作業を実施します。

ビルド -> 選択範囲の公開 
公開 の画面で フォルダーを選択して 次へ
続けて フォルダーを選んで 次へ 
 完了 を クリックします。 
公開準備が完了しました。 を確認します。 すべての設定を表示 をクリックします。
配置モード を 自己完結 に変更します。
ファイルの公開オプションをクリックし、 単一ファイルの作成 に チェックし、保存します。
発行 をクリックすると フォルダーに公開しています となります。
デバッグ窓で 公開: 1 正常終了 を確認します。
公開が成功しました。 を確認し、 フォルダーを開く をクリック 
二つのファイルが出来ていますが、 .exe が実行可能ファイルです。 
SumByDay.exe を \SumByDay にコピーしました。 ここで、このファイルをダブル・クリックして実行してみます。
TradeSumByday.txt が作成されれば、成功です。

ここまで、実行可能ファイルを単一で発行する方法を解説してきました。

折角作ったexe ファイルですが、今のままだと汎用性に欠けます。次のステップで約定データのファイル名や置いてあるパスをパラメータで渡して実行できるような形に変えたいと思います。

ファイルのパス、ファイル名をパラメータ(引数)で渡す

String.Length , System.Environment.CurrentDirectory , For / Next

    Sub Main(args As String())
        Dim fpath As String
        Dim fname As String
        Dim file_path_name As String()
        If args.Length = 0 Then
            fpath = System.Environment.CurrentDirectory + "\"
            fname = "TradeRecordList.csv"
        Else
            file_path_name = Split(args(0), "\")
            fpath = file_path_name(0) + "\"
            For i = 1 To file_path_name.Length - 2
                fpath = fpath + file_path_name(i) + "\"
            Next
            fname = file_path_name(file_path_name.Length - 1)
        End If
        Dim sr As StreamReader = New StreamReader(fpath + fname)
        Dim sw As StreamWriter = New StreamWriter("TradeSumByDay.txt", False)
        Dim dummy As String = sr.ReadLine()
        Dim ret As String()
        Dim Soneki As String
        Dim MonthDay As String
        Dim PrevDay As String = "FirstDay"
        Dim DaySum As Integer
        Do Until sr.EndOfStream
            Dim line1 As String = sr.ReadLine()
            ret = Split(line1, """,""")
            Soneki = ret(5).Replace(",", "")
            MonthDay = ret(9).Substring(5, 5)
            If PrevDay = MonthDay Or PrevDay = "FirstDay" Then
                PrevDay = MonthDay
                DaySum = DaySum + Soneki
            Else
                Debug.WriteLine(PrevDay + " " + DaySum.ToString)
                sw.WriteLine(PrevDay + " " + DaySum.ToString)
                DaySum = Soneki
                PrevDay = MonthDay
            End If
        Loop
        Debug.WriteLine(PrevDay + " " + DaySum.ToString)
        sw.WriteLine(PrevDay + " " + DaySum.ToString)
        sr.Close()
        sw.Close()
    End Sub

新たに追加したコードの説明を致します。

fpath 、 fname をストリングとして宣言します。fpath はファイル・パス を入れるのに、 fname は ファイル名を入れるのに使用します。file_path_name() を ストリング配列として定義します。渡すパラメータ(引数)は、\SumByDay\Sep\TradeRecordList9.csv のような形ですので、これを区切り文字 “\” で Split して各要素を入れる予定です。
サブルーチン Main() で Sub Main(args as string()) と記述していますので、引数を渡した場合 ストリング配列 args() に入ります。args.Length は args がストリング配列の場合は、配列の要素数を返します。args.Length = 0 は、引数は何もないことを意味します。引数がないときは、Current Directory で処理する様にするため ファイル・パスには Current Directory をセットします。同じくファイル名はディフォルトで “TradeRecordList.csv” とします。
Else 以降がパラメータが渡された場合の処理です。
ストリング配列 file_path_name() に渡された引数を “\” で区切った各要素を入れます。 引数が “\SumByDay\Sep\TradeRecordList9.csv” とすると、file_path_name() には、 “” , “SumByDay” , “Sep” , “TradeRecordList9.csv” の四つの要素が入ります。
fpath に file_path_name() の1番目の要素に “\”を追加した文字列を入れます。
fpath に残りの file_path_name() の要素の2番目(1) から順に追加し、file_path_name()の要素数の-2まで繰り返します。各要素の末尾には、”\” を入れています。前述の例だと要素数 4 ですので file_path_name(2)までが追加されます。
fname に file_path_name() の最後の要素(ファイル名)を入れます。
StreamReader を前述の fpath + fname で定義しています。StreamWriter でアウトプット・ファイルを TradeSumByDay.txt と定義しています。

デバッグで引数を渡すには

会員数は国内最大級の180万人を突破!【paters】

それでは、実行してみましょう。 Visual Studio の デバッグで引数を渡すには デバッグ・プロパティに引数をセットします。

デバッグ -> xxxx のデバッグ プロパティ をクリックします。

デバッグ プロパティは、以下のメニューの下にある窓の右側の小さな逆三角をクリックしても出ます。

コマンド ライン引数 に渡したい引数を記述します。引数でファイルパス・ファイル名を渡した場合も、引数なしで実行した場合も、結果のファイルはカレント・ディレクトリに “TradeSumByDay.txt” として出来ます。

パラメータ(引数)でファイルパス、ファイル名を渡しての処理とVisual Studio でのデバッグでの引数の渡し方についてご説明しました。

ここまで、約定履歴データをサマリーして日ごとの合計を得る EXE ファイルの作成について解説きてしました。ここで少し気になるのが、データが新しい日付け順(09/30 ~)になっていることです。出来れば 09/01 ~ にしたいですね。 それは、DOS コマンドの sort を使えば簡単にできるのですが、Visual Basic のプログラム内から DOS コマンドを発行するのはややこしいので、後でバッチファイルで実施することとします。

VB 実行ファイル + DOS コマンド SORT の バッチ・ファイル

テキスト・エディターで次のコードを書いて SumByDay.bat というファイル名で SumByDay.exe があるディレクトリに保存します。バッチ・ファイルに引数を渡すと %1 に入ります。従って、それはそのまま exe に渡されます。

@echo off
SumByDay.exe %1
sort <TradeSumByDay.txt >TradeSumByDayS.txt

同じディレクトリには、ディフォルトのファイル名のデータファイルがあります。

C:\SumByDay>dir
 ドライブ C のボリューム ラベルは Windows7_OS です
 ボリューム シリアル番号は D97B-6C70 です

 C:\SumByDay のディレクトリ

2022/10/16  18:06    <DIR>          .
2022/10/16  18:06    <DIR>          ..
2022/10/16  17:17    <DIR>          sep
2022/10/16  15:51                73 SumByDay.bat
2022/10/16  17:20        58,504,498 SumByDay.exe
2022/10/09  21:42            19,314 TradeRecordList.csv

SumByDay.bat を引数なしで実行してみます。

C:\SumByDay>SumByDay.bat

C:\SumByDay>dir
 ドライブ C のボリューム ラベルは Windows7_OS です
 ボリューム シリアル番号は D97B-6C70 です

 C:\SumByDay のディレクトリ

2022/10/16  18:16    <DIR>          .
2022/10/16  18:16    <DIR>          ..
2022/10/16  17:17    <DIR>          sep
2022/10/16  15:51                73 SumByDay.bat
2022/10/16  17:20        58,504,498 SumByDay.exe
2022/10/09  21:42            19,314 TradeRecordList.csv
2022/10/16  18:16               147 TradeSumByDay.txt
2022/10/16  18:16               147 TradeSumByDayS.txt
               5 個のファイル          58,524,179 バイト
               3 個のディレクトリ  22,002,925,568 バイトの空き領域

C:\SumByDay>type TradeSumByDayS.txt
09/01 3100
09/02 550
09/03 -150
09/05 4090
09/06 2160
09/07 -12180
09/08 -7860
09/14 -960
09/15 -7600
09/28 9940
09/29 2950
09/30 6780

TradeSumByDay.txt が作成され、それをソートした TradeSumByDayS.txt が出来ました。

これで約定履歴データをJavaScript に渡せる状態に出来ました。次は、このデータを元にJavaScript でグラフを作って行きます。それは、プログラミングのすすめ 第七歩 でやって行きます。


Xserverドメイン

お名前.com

Xserverビジネス

ロリポップ!なら大人気のWordpressも簡単インストール!
あなたもWordPressでブログデビューしちゃおう!!


映画シン・エバンゲリオン劇場版を観るなら<U-NEXT>

【DMM FX】口座開設のお申込みはこちら




コメント

タイトルとURLをコピーしました