アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

('ω') < イザユケエンジニャー

Ingress東京ミッションデイに参加してきました

いやいや、対象ミッション多すぎでしょ!!!ということで6つ厳選してきました。

f:id:honey8823:20160928124152p:plain
国会議事堂→六本木→渋谷→台場→スカイt…スカイツリー東京都庁
という突然のななどら聖地巡礼。(もちろんメダルは逆順)

この中には特に難しいミッションはありませんでしたが、中には皇居一周とかいうマゾゲー難易度の高いものもあったそうです。

ちなみにうちの旦那は当日に23区内ミッションをすべて番号順にクリアし、
後日文京と町田もやはり番号順にこなしておりました…。

ingressミッションレビュー:AEGIS NOVA TOKYO MEMORY

かっこいいメダルがあったので、こちらもAegisNova記念に。
f:id:honey8823:20160928123636p:plain

新宿をぐるっと回る程度のお手軽ミッションでした。
(こちらを見る限り、現時点で3つは削除されている模様…?)
https://ingressmm.com/?find=AEGIS%20NOVA%20TOKYO%20MEMORY

アノマリー時は同シリーズのミッションを作成されている方のようなので、その他も是非。
https://ingressmm.com/?find=Pocoty&findby=1

ingressミッションレビュー:AegisNova : Tokyo , JP

AegisNova参加記念。受付の後にさっくり回ってきました。
f:id:honey8823:20160928123022p:plain

地図はこちら。
https://ingressmm.com/?find=AegisNova%20%3A%20Tokyo%20%2C%20JP

スムーズに回れるよう工夫してあるミッションでとても良かったです。

また、最後のミッションは2つあり、夜間(台場公園に入れない時間帯)は「12'」の方を選ぶとOKだそうです。

ingressミッションレビュー:風景印を巡る旅

全52個あるシリーズミッションですが、愛知・岐阜が中心で、沖縄・東京にも少しずつ。
東京から6つ抜粋しました。
https://ingressmm.com/?find=%E9%A2%A8%E6%99%AF%E5%8D%B0%E3%82%92%E5%B7%A1%E3%82%8B%E6%97%85

f:id:honey8823:20160928121552p:plain
はんこモチーフに弱いっ。

ミッション自体は、「最寄駅から郵便局までのルート」的なものも多く、プレイしやすかったです。
テーマがあるミッションですし、楽しめました。

全然関係ないのですが、このミッション中に
スマホが発熱してどうしようもない時はウィダーインゼリーが保冷剤(兼非常食)になる」ということに気付き、
以後暑い日にingressするときは持ち歩いてます。

駅メモ #13:マスターオブ沖縄と遠征三昧

石川、埼玉に続いて沖縄もマスターしてきました!

f:id:honey8823:20160926173756p:plain:w400

一つだけ離れた位置にある廃駅(嘉手納)は、中城城址まで行けば取れました。

他の県については、
東京があと2駅、神奈川があと4駅です。うまく調整すれば山梨あたりとまとめて同じ日にマスターオブ称号取れるんじゃないかと欲張って考え中。

また、瀬戸内方面にも遠征してきて、
京都に寄り道して地下鉄イベントは完了、アクティビティイベントも3地域すべてアクセス。

アクティヴレイドコラボもそこそこスタートダッシュしてきました。
ポイント稼ぎはもちろんですが、れいこさんを無事上限80にしてお仕事回数稼ぎ中。
「頼りにしてくれた」称号は一番乗りいただきました!
f:id:honey8823:20160926173928p:plain:w400
f:id:honey8823:20160926173934p:plain:w400

コラボガチャは大変引きが良かったです。
運を使い果たした気が…。(翌日の遠征先で行きたかったお店が臨時休業だったりというレベルのトラブルには多々見舞われました)
19回引いて7回れいこさんですからね。ラッピングも5つは引けましたし。



進捗は今日時点でこんな感じ。

f:id:honey8823:20160926173952p:plain:w400

前回(8/1)からの比較

  • 駅 2448 → 2778(+330)
  • 路線 308 → 339(+31)
  • 都道府県 28 → 30(+2)
  • コンプ路線 136 → 156(+20)

所持でんことLv ()内は前回比 ☆は凸完了

[S]セリア 8/75
[A]メロ 30/65 (Lv5up)
[D]ルナ 41/80 (Lv1up / 上限5up) ☆
[T]みろく 7/65 (上限5up)
[S]レイカ 16/60
[T]シャルロッテ 59/60 (Lv4up / 上限5up)
[T]シーナ 7/65 (上限5up)
[A]さや 8/60
[S]もえ 61/80 (Lv24up) ☆
[T]いろは 33/50
[D]しいら 8/65
[D]もぼ 10/55
[D]いずな 75/75 (Lv5up / 上限5up)
[S]ふぶ 60/60
[A]りんご 36/80 (Lv2up) ☆
[T]ニャッシュ 15/80 ☆
[T]ダッチュー 50/50 (Lv24up)
[T]いちほ 39/75 (Lv2up)
[A]イムラ 50/60 (上限5up)
[T]にころ 54/55
[S]しぐれ 7/60 (上限10up)
[A]レン 8/75
[T]みらい 10/55
[D]ベアトリス 9/60 (上限5up)
[S]うらら 31/55 (Lv15up)
[A]ほこね 9/65
[T]やちよ 15/70
[A]リオナ 7/55
[T]チコ 18/55
[A]レーノ 7/70
[D]ありす 70/70
[T]コタン 24/80 ☆
[T]エリア 18/50
[S]ひいる 15/80 (上限10up) ☆
[D]いおり 14/80 (Lv5up) ☆
[S]ミオ 6/55
[S]みこと 22/60 (Lv11up)
[D]くに 6/55
[T]るる 15/75 (上限10up)
[A]ハル 8/55
[D]にちな 9/60
[A]そら 8/75 (上限5up)
[S]アサ 65/65
[A]さいか 13/55 (上限5up)
[A]Liko 6/75 (new)
[D]れいこ 58/80 (new) ☆


ニャッシュ、りんご、コタン、もえ、いおりに続きルナ、ひいる、れいこも上限突破完了。



自分用育成メモ:

今はとにかくれいこさん育成中。
(お仕事回数3000回を一番乗りしてみたいというやや不純な動機で)
とはいえLvがそこそこ上がってきたので、新駅を多く取るようなときは別の子に吸わせようかな。
ルナ>りんご>いちほ>うらら>メロ くらいの優先度で。

テーブルごとのサイズを調べる方法

MySQL
サイズというか容量というか使用量というか。アレ。

参考:MySQLのデータベースやテーブルのサイズを確認する方法 - Little Braver
http://little-braver.com/379/

SELECT
  `TABLE_SCHEMA`   -- DB名
 ,`TABLE_NAME`     -- テーブル名
 ,`TABLE_ROWS`     -- レコード数
 ,`AVG_ROW_LENGTH` -- レコードあたりの平均サイズ?
 ,FLOOR((`DATA_LENGTH` + `INDEX_LENGTH`) / 1024) AS `all_kb` -- 合計サイズ
 ,FLOOR(`DATA_LENGTH` / 1024) AS `data_kb`                   -- データサイズ
 ,FLOOR(`INDEX_LENGTH` / 1024) AS `index_kb`                 -- インデックスサイズ
FROM
  `information_schema`.`tables `
WHERE
  `TABLE_SCHEMA` IN ('データベース名1','データベース名2', ...)
ORDER BY
  `TABLE_SCHEMA`
 ,`TABLE_NAME`

InnoDBの場合、行数なんかは不正確な値が出る場合もあります。
サイズもだいたいページ単位(16KB)で出てくる模様。
ちょっと困る。

正確な(というか物理的な)サイズを調べる方法もあるようですが、
InnoDBだとテーブル単位で調べるようなことはできそうにないかな…。

参考:MySQLのデータベースの容量を調べる - ハマログ
https://blog.e2info.co.jp/2013/05/24/mysql%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E5%AE%B9%E9%87%8F%E3%82%92%E8%AA%BF%E3%81%B9%E3%82%8B/


データベースサイズの調べ方はこちら。
honey8823.hateblo.jp

CSVを読み込み二次元配列に格納するプロシージャ・改

前にも同じようなのを作って使っていたんですが、
CSVにカンマや改行が含まれていると機能しないとかいうクソっぷりだったので、
大幅に改修しました。
あと、UTF-8CSVに対応したい事案があったのでそれも合わせて。
(改修というか別物に近い)


参考:UTF-8形式のテキストファイルから読み込む - Office TANAKA
http://officetanaka.net/excel/vba/file/file10.htm

参考:CSVの読み込み方法 - エクセルの神髄
http://excel-ubara.com/excelvba5/EXCEL111.html


途中、改行コードを調整している箇所がありますので、環境によって適切な感じに書き変えてください。
(詳しい解説は記事末尾に)

さて、以下がプロシージャですが
使う前に、VBEの ツール>参照設定 にて
Microsoft ActiveX Data Objects」を探してチェックを入れておきます。
バージョンは一番新しいものでOKでしょう。

'*
'* CSVを読み込み二次元配列に格納
'*
'* in  sCsvFile  CSVファイルまでのフルパス
'*     sCharset  文字コード(Shift_JIS, UTF-8, ...)
'* out CsvRead() CSVの中身(二次元配列)
'*
Public Function CsvRead(ByVal sCsvFile As String, Optional ByVal sCharset As String = "Shift_JIS") As String()

    Dim lDatNum As Long
    
    Dim sTmp As String
    Dim sTmpDat As String
    Dim sLine() As String
    Dim sRet() As String
    Dim lQuoteCount As Long

    Dim i As Long
    Dim j As Long
    Dim k As Long
    
    Dim streamAdodb As ADODB.stream
    
    'ファイルの存在を調べる
    If Not CreateObject("Scripting.FileSystemObject").FileExists(sCsvFile) Then
        Exit Function
    End If
    
    'ADODB.Stream生成
    Set streamAdodb = New ADODB.stream
    
    With streamAdodb
        'テキストモード、文字コードセット
        .Type = adTypeText
        .Charset = sCharset
        
        'Streamオープン
        .Open
        
        'ファイル読み込み
        .LoadFromFile (sCsvFile)
        sTmp = .ReadText
        
        'Streamクローズ
        .Close
    End With
    
    Set streamAdodb = Nothing

    '改行コードの調整&一行ごとに配列に移す
    sTmp = Replace(sTmp, vbCrLf, vbCr)
    sLine = Split(sTmp, vbLf)
    
    'データ数を求める(最後の行が空行の場合はカウントしない)
    If sLine(UBound(sLine)) = "" Then
        lDatNum = UBound(sLine)
    Else
        lDatNum = UBound(sLine) + 1
    End If
    
    '戻り値の枠をつくる
    ReDim sRet(0 To lDatNum - 1, 0 To 0)

    '一行ごとに処理
    For i = 0 To lDatNum - 1
        
        ' さっき調整した改行を元に戻す
        sLine(i) = Replace(sLine(i), vbCr, vbCrLf)
        
        j = 0
        lQuoteCount = 0
        sTmpDat = ""

        For k = 1 To Len(sLine(i))
            Select Case Mid(sLine(i), k, 1)
                Case "," '「"」が偶数なら区切り、奇数ならただの文字
                    If lQuoteCount Mod 2 = 0 Then

                        If UBound(sRet, 2) < j + 1 Then
                            ReDim Preserve sRet(0 To lDatNum - 1, 0 To j)
                        End If
                        sRet(i, j) = adjustQuote(sTmpDat)

                        j = j + 1
                        lQuoteCount = 0
                        sTmpDat = ""
                    Else
                        sTmpDat = sTmpDat & Mid(sLine(i), k, 1)

                    End If
                Case """" '「"」のカウントをとる
                    lQuoteCount = lQuoteCount + 1
                    sTmpDat = sTmpDat & Mid(sLine(i), k, 1)
                Case Else
                    sTmpDat = sTmpDat & Mid(sLine(i), k, 1)
            End Select
        Next

        '最終列の処理

        If UBound(sRet, 2) < j Then
            ReDim Preserve sRet(0 To lDatNum - 1, 0 To j)
        End If
        sRet(i, j) = adjustQuote(sTmpDat)

        j = j + 1
        lQuoteCount = 0
        sTmpDat = ""
    Next

    CsvRead = sRet

End Function
Private Function adjustQuote(ByVal strTmpDat As String)

    '「""」のみであれば空にする
    If strTmpDat = """""" Then
        strTmpDat = ""
    End If
    
    '「""」を「"」で置換
    strTmpDat = Replace(strTmpDat, """""", """")
    '前後の「"」を削除
    If Left(strTmpDat, 1) = """" And Right(strTmpDat, 1) = """" And Len(strTmpDat) >= 2 Then
        strTmpDat = Mid(strTmpDat, 2, Len(strTmpDat) - 2)
    End If
    
    adjustQuote = strTmpDat
End Function

改行コードの調整について。
ここでは、CSVのレコードごとの改行が「LF」、レコード内に含まれる改行が「CRLF」だったので、

  • CRLFをCRに置換してからLFごとに区切ってレコードとする
  • 区切った後のレコードについて、CRをCRLFに置換し直す

というステップを踏んでいます。
必要に応じて調整してください。
(両方とも同じ改行コードとかだと困る…)

'<抜粋>改行コードの調整&一行ごとに配列に移す
sTmp = Replace(sTmp, vbCrLf, vbCr)

'<抜粋>さっき調整した改行を元に戻す
sLine(i) = Replace(sLine(i), vbCr, vbCrLf)

配列のサイズを宣言する前にサイズを知りたかった

だいぶ意味不明なタイトルですが。

VBAではサイズを指定せずに配列を宣言できます。
(指定して宣言することもできます)

' 文字列が入る配列(サイズ不明)
Dim sArray() As String

その場合、後からサイズを指定できます。

' 文字列が入る配列(サイズ不明)
Dim sArray() As String

' 配列のサイズを3にする
' ※下記のように指定すると「0~2」の3つ
ReDim sArray(2)

また、配列の最大添字を調べる関数「UBound」というものがあります。
配列のサイズを調べたい場合によく使います。

' 文字列が入る配列(サイズ不明)
Dim sArray() As String

' 配列のサイズを3にする
' ※下記のように指定すると「0~2」の3つ
ReDim sArray(2)

' 配列の最大添字をデバッグに表示
' ※「2」が表示される
Debug.Print UBound(sArray)

ただし、以下のように、配列のサイズを指定しないままこの関数を使おうとすると
「インデックスが有効範囲にありません。」とかいうエラーになります。

' 文字列が入る配列(サイズ不明)
Dim sArray() As String

' 配列の最大添字をデバッグに表示したかった
' <ここでエラー!>
Debug.Print UBound(sArray)

IF文で「もし配列が空、というかサイズ未指定というか、要するに空なら」という処理を作りたい場合はどうすれば…と思って調べると、以下2つの方法をよく見かけます。

【①Not Not hoge
よく「何故動くのか分かりませんが」と前置きされて書かれているこちらの方法。
すごい。意味がわからない。しかもきもい。

' 文字列が入る配列(サイズ不明)
Dim sArray() As String

' 配列のサイズが指定済みかどうか
If Not Not sArray Then
    MsgBox "サイズ指定済"
Else
    ' こちらが出ます
    MsgBox "サイズ未指定"
End If

【②Sgn(hoge)】
すごい。こっちも意味がわからない。
「Sgn関数にサイズ未指定の配列を渡すとゼロが返ってくるからそれで判定」ってやばい。
※Sgn関数は数値の符号を返す関数です

' 文字列が入る配列(サイズ不明)
Dim sArray() As String

' 配列のサイズが指定済みかどうか
If Sgn(sArray) <> 0 Then
    MsgBox "サイズ指定済"
Else
    ' こちらが出ます
    MsgBox "サイズ未指定"
End If

あとは自力で判定する関数を作るなりするか、APIを使うか…という感じです。

参考:VBAの動的配列で要素を宣言する前の状態をチェックする方法 - アイビースター
http://ivystar.jp/ms-office/how-to-check-the-status-of-before-declaring-an-element-in-the-dynamic-array-of-vba/

①も②も意味不明っぷりが結構すごいですが、ネットで調べた感じではこの方法が一般的な様子…?
技術系ブログに「なんで動くか分からないけど動くからこれで」って書かれることはそうそうないと思うんですがこれに関しては何故かそう書いてる人がやたら多い。やばい。
まあわたしもそれ見て何故か②を使っていたんですが。動くし。

…。

…動くと思ってたんですよ。

動いてたんですよ、自分のPCでは。

社内のExcelのバージョンは皆同じなはずなのに、何故かこの処理が動く人と動かない人がいることが判明するまでは、動くと思ってたんですよ…。



最終的には、サイズ未指定だとエラー扱いにしたいプログラムだったので、
単純に「On Error GoTo ラベル」で制御する方法にやっつけ修正しました…。

Public Sub hoge()

    ' 文字列が入る配列(サイズ不明)
    Dim sArray() As String

    ' エラー時はエラーラベルへ飛ばしてね宣言
    On Error GoTo ErrorLabel

    ' 配列の最大添字をデバッグ表示
    ' <ここでエラーになりエラーラベルへ飛ぶ>
    Debug.Print UBound(sArray)
    MsgBox "サイズ指定済"

    Exit Sub

' エラーラベル
ErrorLabel:
    ' デバッグ表示はされず、これが出る
    MsgBox "サイズ未指定"

End Sub

Sgn関数での判定が動くPC・動かないPCの違いは何だろうな。
ご存じの方がいらっしゃいましたら、情報をいただけると大変ありがたいです。

in_array VS array_search 速度検証

タイトル通り。

わたしは普段「ある配列にある値があるかどうか」のチェックにin_arrayを用いていますが、
他の人のソースでarray_searchを用いているのを見かけたので
単純に気になって速度検証。
(in_arrayの方が速いんじゃないかなーという予想)

検証コードは以下のような感じ。
いろいろ省略していますが、「各動作を1万回ずつ繰り返し×5セット」の試験です。

// 26個の要素を持つ配列
$list = array(
    'a' => "abc",
    'b' => "bcd",
    'c' => "cde",
    ...
    'z' => "zab",
);

// ①in_array × 最初の要素がヒット
in_array("abc", $list);

// ②in_array × 最後の要素がヒット
in_array("zab", $list);

// ③in_array × ヒットする要素なし
in_array("hoge", $list);

// ④array_search × 最初の要素がヒット
array_search("abc", $list);

// ⑤array_search × 最後の要素がヒット
array_search("zab", $list);

// ⑥array_search × ヒットする要素なし
array_search("hoge", $list);

結果。
(1万回繰り返すのにかかる時間の平均、単位はミリ秒)

関数 最初の要素がヒット 最後の要素がヒット ヒットする要素なし
in_array 3.091 18.333 18.523
array_search 3.506 18.787 18.464

まあ…誤差ですね。
1万回繰り返して最短3ミリ秒ですからね。
配列のサイズとかヒット率とか順番とかの方がよほど影響は大きいです。

世界樹の迷宮5初見 #2:第一階層突破

最初のミッションも終わったので、いよいよ本格的に樹海探索へ。

さっそく2Fにのぼってみるとわりと手痛い歓迎を受けました…。
f:id:honey8823:20160807170751j:plain:w400
致命傷で済んだ。

f:id:honey8823:20160807171420j:plain:w400
今作はギルドカードを交換すると交換相手がゲーム中に出てきてくれるとのこと。
ロールプレイングの捗る、良い仕様だと思います。
いまのところ

  • 食料の物々交換
  • 協力して食料をゲット
  • アドバイスをくれる

といったパターンがありました。

ちょっと進めるといつの間にかミッションが発生してました。
f:id:honey8823:20160807171358j:plain:w400
要するに第一階層を突破しろというやつですね。


まあ基本的に何事もなく5Fまではたどりつきましたが、ついに初hage。
f:id:honey8823:20160807172327j:plain:w400

いやお前…希少個体ギガントローパーの投げ飛ばし(全体攻撃)って卑怯すぎだろおお!!!!全員即死するわ!!!
ユニオンスキルの全力逃走以外で逃げる術がない…。それを思いつかず全滅でした。


5Fはそこそこ苦労しながらも、なんとか階層ボスまでたどり着きました。
f:id:honey8823:20160807172350j:plain:w400
f:id:honey8823:20160807172404j:plain:w400
こんなに可愛い階層ボス初めて見たぞ…ちびゴーレムがころげ落ちるところとか可愛すぎか…


とりあえず挑んでみましたが、3ターン程度で全滅…。

まず最初に爆発→ゴーレムが分離→少しずつ最初の形状に戻るらしい
ということは分かったので、余裕を持たせておいたスキルポイントを振ることに、

最初の爆発を乗り越えないと話にならないので、アースランの二人がトライシールドを取得。
あとはこれまで取ったスキルの強化に回しました。

2回目の挑戦はそこそこ耐えましたが、結局押し負けることに。

3回目はスキルはそのまま、防具をちゃんと揃えました。
f:id:honey8823:20160807172345j:plain:w400
お金がないよぉ
(浅いところで宿代だけ稼いで回復しました)

3回目は無事に勝利。
リーパーの敵攻撃弱体+シャーマンの味方防御強化を切らさないようにしていれば、
トライシールドで防げない二人も防御しておくことでかなりダメージは抑えられました。
ネクロマンサーが死霊を自動で呼び出してくれるのは基本的にありがたいのですが、トライシールドしたいときは邪魔ですね…(死霊→前列→後列の順で効くため)
戦闘終盤はTP不足が深刻でしたね…。本体を倒す直前からはひたすら通常攻撃かユニオンスキルでした。

f:id:honey8823:20160807172416j:plain:w400


  • ここまでの記録
    • 皇帝ノ月 15日
    • 5F
    • クリアしたミッション(*は最新)
      • アイオリス認定試験!
      • ルナリアの結界を解け! *
    • クリアしたクエス
      • 工芸職人からの依頼
      • 冒険の準備
      • ドングリ集め *
      • 初めての採集 *
      • 釣り人の心得 *
      • 太陽の光、月の光 *
      • 希少個体ハンター! *
      • 幻の巨大ローパー *
      • グリフォンの家 *
      • 害獣駆除 *