2019年2月20日水曜日

MSSQLのDBが破損した模様

何かの理由で利用中パッケージソフトで新規登録ができなくなった模様。
※パッケージの問題ではない。と先にお伝えしておきます。

原因がDBだったので、問題を調べて、対処、処置まで完了したのでメモしておきます。

事の経緯

データを新規登録できなくなった。と連絡を受けました。
よく聞くと、登録ボタンを押すと「強制終了してしまう」との事
エラー内容を見る限りたぶんDB周りだろうな。と思い調査を開始しました。
ひとまず見つけたのはWindowsのアプリケーションログ。
「インデックスが壊れている可能性があります。DBCC CHECKDB を実行してください。」と出ていました

MSSQLのチェックツール


詳しい解説は以下サイトを参考としました。
https://www.ipentec.com/document/sql-server-db-repair-and-validation-with-dbcc-command
参考にしながら処置を実施

DBCC CHECKDB
GO

チェック結果を確認


メッセージ 8935、レベル 16、状態 1、行 1
テーブル エラー: オブジェクト ID 1413580074、インデックス ID 1、パーティション ID 72057594063093760、アロケーション ユニット ID 72057594068664320 (型 In-row data)。ページ (1:503) の前ページへのリンク (1:1503) は、親 (1:377)、スロット 31 がこのページに対して想定している前ページ (1:3646) と一致しません。
メッセージ 8978、レベル 16、状態 1、行 1
テーブル エラー: オブジェクト ID 1413580074、インデックス ID 1、パーティション ID 72057594063093760、アロケーション ユニット ID 72057594068664320 (型 In-row data)。ページ (1:503) に前ページ (1:1503) からの参照がありません。チェーン リンケージに問題がある可能性があります。
メッセージ 8935、レベル 16、状態 1、行 1
テーブル エラー: オブジェクト ID 1413580074、インデックス ID 1、パーティション ID 72057594063093760、アロケーション ユニット ID 72057594068664320 (型 In-row data)。ページ (1:1503) の前ページへのリンク (1:3646) は、親 (1:377)、スロット 84 がこのページに対して想定している前ページ (1:1251) と一致しません。
メッセージ 8936、レベル 16、状態 1、行 1
テーブル エラー: オブジェクト ID 1413580074、インデックス ID 1、パーティション ID 72057594063093760、アロケーション ユニット ID 72057594068664320 (型 In-row data)。B-Tree チェーン リンケージが一致しません。(1:1251)->next = (1:1503)、(1:1503)->Prev = (1:3646)。
メッセージ 8979、レベル 16、状態 1、行 1
テーブル エラー: オブジェクト ID 1413580074、インデックス ID 1、パーティション ID 72057594063093760、アロケーション ユニット ID 72057594068664320 (型 In-row data)。ページ (1:1752) に、親 (不明) ノードと前 (ページ (1:376)) ノードからの参照がありません。システム カタログのルート エントリが不適切である可能性があります。
メッセージ 8934、レベル 16、状態 1、行 1
テーブル エラー: オブジェクト ID 1413580074、インデックス ID 1、パーティション ID 72057594063093760、アロケーション ユニット ID 72057594068664320 (型 In-row data)。ページ (1:3645) (レベル 0) のキーの最高値が、次のページ (1:1753) の親 (0:1)、スロット 0 のキーの最低値より大きくなっています。
メッセージ 8977、レベル 16、状態 1、行 1
テーブル エラー: オブジェクト ID 1413580074、インデックス ID 1、パーティション ID 72057594063093760、アロケーション ユニット ID 72057594068664320 (型 In-row data)。ページ (1:1753) の親ノードが見つかりませんでした。
'table_xxxxxxxxx' の DBCC 結果。
オブジェクト "table_xxxxxxxxx" の 95 ページには 784 行あります。
CHECKDB により、テーブル 'table_xxxxxxxxx' (オブジェクト ID 1413580074) に 0 個のアロケーション エラーと 7 個の一貫性エラーが見つかりました。

エラー出ました。(table_xxxxxxxxの部分は実テーブル名を置き換えて表示しています)

参考サイトに従ってリペアを実施



ALTER DATABASE '対象のデータベース名' SET SINGLE_USER
GO
DBCC CHECKDB('対象のデータベース名','REPAIR_REBUILD')
GO
ALTER DATABASE "対象のデータベース名" SET MULTI_USER
GO
ALTER DATABASE "対象のデータベース名" SET RECOVERY FULL
GO


再テスト 


DBCC CHECKDB
GO


変わらず。と。

インデックスの違反なんだろうから、インデックスを再構築してしまえとも
思うんだけどもテーブル定義を見てみても、Primaryしかない
なんだかなぁ。なので、以下にチャレンジ

無理やりテーブルを再作成してみる

ざっくり言うと、別のテーブルへ移して、リネームして戻してしまえ。

1.エラーが出ているテーブル(A)をselect into で別テーブル(B)へ
2.テーブル(A)をリネーム
3.テーブル(B)をテーブル(A)へリネーム

これでパッケージソフト上でのエラーは出なくなりました。

修復できたようなので後片付け

おそらくですが、テーブル(A)のPrimaryが壊れたのだろうと推測。
→後の処置で確かに存在しえないデータが複数selectできたのでそれ。
クリアできたので、改めて以下処置を実施

ざっくり言うと、定義は生かして、今のを退避して、テーブル再構築、データ再投入

1.上記のテーブル(A)からDDLを取得
2.上記テーブル(A)をリネームし、Primaryを削除 
→これをしないとPrimaryの名称が被ったため
3.取得したDDLにてテーブルを作成
4.上記2)でリネームしておいたデータから、3)で作成したテーブルへデータを流す

作業を終えてから

DBCC CHECKDB
GO
でエラーが消えたことを確認しました

2019年2月14日木曜日

【非IT】楽天トラベル利用時の領収書 (2ヶ月以内とかじゃないよ)

これ、私も勘違いしてました。

利用後、2ヶ月過ぎたら領収書が出せなくなると思ってました。

楽天トラベルではWeb上で領収書を出力できるのですが、なぜか、過去の勘違い記憶が
残っていて、2ヶ月を過ぎたら出せなくなると思ってました。
(というか、過去の予約を検索すると「過去2ヶ月間において、国内宿泊予約はありません。」と出るので、ダメだと思ってた)

ただ、今回あれこれ調べていくうえで、2年以上前であっても出せることを確認。

結果

マイページへ移動して
「キャンセル済み・過去の予約」を選択
「過去2ヶ月間において、国内宿泊予約はありません。」と出てもくじけず、
表示期間: となっている個所を「201x年度」と変更して、「変更」ボタンを押す

これで、古い予約履歴も、「領収書印刷」ボタンも出てきます。

詳しい手順は紹介しませんが、ネットでは「2ヶ月過ぎると出せない」という記事もちらほらあったため、ご参考まで。

2019年2月6日水曜日

ssh.netで依存関係? (c# ,VS2013)

管理するサーバも増え、手作業より自動化だ!ということで、c#アプリでsshの実装をすることにしました。

過去記事にもありますが、ssh接続による作業の自動化手段として
1)TeraTerm + マクロによる実行
2)RLoginを利用した同時動作

は候補になるのですが、今後の拡張性や、各ソフトの永続性なども考慮した結果、手作りしてしまおう。と。

今回、VisualStudio2013環境で、ssh.netを利用しようとしてハマったことについて残しておきます。

まとめ (試した限り)

netSSHを利用した開発にはVisualStudio2013での開発じゃなくて、2015を使ったほうが簡単

やった手順

まずは何も考えずに進めてみる

新規でc#プロジェクトを作成、「nuget」にてssh.netのインストールを試みます。


SshNet.Security.Cryptographyの依存関係・・・

となったので、めげずに、パッケージマネージャコンソールから
PM>Install-Package SshNet.Security.Cryptography -Version 1.3.0

Install-Package : 'SshNet.Security.Cryptography' にはすでに 'System.IO' に対して定義された依存関係があります。

やっぱ同じか。。。ということでちゃんと依存関係の調査

ライブラリが足らない・・・



https://www.nuget.org/packages/SshNet.Security.Cryptography/1.3.0
NETStandardが必要なのね。ってか、このライブラリ使うの初めて。
てなことで情報収集。

フレームワークも足らない

https://dotnet.microsoft.com/download/visual-studio-sdks?utm_source=getdotnetsdk&utm_medium=referral


frameworkの4.6が必要。との事でインストール
プロジェクトへの適用が完了しました。

これでも足らないようで .net Core 1のSDKをインストール
これでも足らない・・・

VisualStudio2015で試してみよう

「2013の新規プロジェクト選択画面」

「2015の新規プロジェクト選択画面」


2015の新規プロジェクトには".net core"の選択肢がある・・・・
今回はこっちで行くことにしました

VisualStudio2015で進めてみた (結果)

PackageManagerコンソールでnetsshをインストール、問題なく進みました。
これでアプリが作れそうです

2018年12月4日火曜日

Oracle破損

※※ この情報は tipではございません ※※

とあるA社さんの仕事を委託していて、開発環境もA社さんにあるため必要に応じA社さんの環境へ接続、作業をしていたりするのですが、

??Oracle起動してないよ?
??というか、計画外シャットダウンの画面出てるよ(Windows2008server)

となり、事が深刻だったので作業備忘録メモ


前置き長くなりました。もー何で?な心境なので文体粗いです。
追伸:Oracle 10gです

【事象】


SQL DeveloperでOracleに接続しようとしたら「ORA-01033:Oracleの初期化またはシャットダウン中です」が出て接続できない

【処置概略】

・まー、今までもあったよね。startup mount;ALTER DATABASE OPEN; でつながるよね。
・おっと、mountされてるみたい。shutdown immediateしてからだね。
・え、エラー出たし。ORA- でぐぐって対処するか。
・色々コマンド出てきて打ち込むけども、なんか治らんなぁ
・余計ひどくなった。やっぱDBAでもないのにやるもんじゃないね。
・Database作り直しちゃおう。
・Configuration Assistantで再作成。っと。
・壊れたのはどうせ使えないので削除。
・ユーザー作って、権限付与して、開発用データのdmpも入れて。と。
・listener設定してなかった。作成したdbへ変更。っと。
・よしよし。データも見れるし、まぁいいか。開発環境だし。


【処置結果】

・何もtips残りませんでした。
 ひとつ大事なことは「思いたったからと言ってすぐやるな」
 OracleはさすがOracle。あちこちにリカバリログを持っていて(いるようで)、手順さえ間違わなければログから復旧できる。(はず)ログもちゃんとバックアップしておく必要あるけどね。
 適当にログ指定してリカバリしようなんて、傷を深くしただけでした。

【余談】

ファイル壊れてんじゃんか(笑) zipファイルすら破損してるよ。ディスク障害でもあったんじゃない?ま、開発環境(hyper-v)だし、壊れてもなんとかなるからいっか。

【使ったコマンドのメモ】

※sqlplus /nologでログイン
※sys as syadba

recover database until cancel;


【恥を忍んで途中からの全log】


SQL> recover database until cancel;


ORA-00279: 変更217138326(09/30/2018 12:00:48で生成)にはスレッド1が必要です
ORA-00289:検討すべきログ・ファイル:D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\ARC02244_0830209207.001
ORA-00280: 変更217138326(スレッド1)は順序番号2244に存在します。
ログの指定: {=suggested | filename | AUTO | CANCEL}
D:\ORADATA\ORCL\REDO03.LOG
ORA-00283: エラーによってリカバリ・セッションは取り消されました。
ORA-10562: Error occurred while applying redo to data block (file# 3, block#
21623)ORA-10564: tablespace SYSAUX
ORA-01110: データファイル3: 'D:\ORADATA\ORCL\SYSAUX01.DBF'
ORA-10560: block type '0'
ORA-00600: 内部エラー・コード、引数: [4552],[1],[0],[],[],[],[],[]
ORA-01112: メディア・リカバリが開始されていません
SQL> recover database until cancel;
ORA-00279: 変更217138326(09/30/2018 12:00:48で生成)にはスレッド1が必要です
ORA-00289:
検討すべきログ・ファイル:D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\ARC02244_0830209207.001
ORA-00280: 変更217138326(スレッド1)は順序番号2244に存在します。
ログの指定: {=suggested | filename | AUTO | CANCEL}
ORA-00308:
アーカイブ・ログD:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\ARC02244_0830209207.001をオープンできません。
ORA-27041: ファイルをオープンできません。
OSD-04002: ファイルをオープンできません
O/S-Error: (OS 2) 指定されたファイルが見つかりません。
ORA-01547: 警告: RECOVERは成功しましたがOPEN
RESETLOGSが次のエラーを受け取りました。
ORA-01194: ファイル1は一貫した状態にするためにさらにリカバリが必要です。
ORA-01110: データファイル1: 'D:\ORADATA\ORCL\SYSTEM01.DBF'
SQL> recover database until cancel;
ORA-00279: 変更217138326(09/30/2018 12:00:48で生成)にはスレッド1が必要です
ORA-00289:検討すべきログ・ファイル:D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\ARC02244_0830209207.001
ORA-00280: 変更217138326(スレッド1)は順序番号2244に存在します。
ログの指定: {=suggested | filename | AUTO | CANCEL}
REDO2.LOG
ORA-00308: アーカイブ・ログREDO2.LOGをオープンできません。
ORA-27041: ファイルをオープンできません。
OSD-04002: ファイルをオープンできません
O/S-Error: (OS 2) 指定されたファイルが見つかりません。
ログの指定: {=suggested | filename | AUTO | CANCEL}
D:\ORADATA\ORCL\REDO02.LOG
ORA-00310:アーカイブ・ログは順序番号2243を含んでいますが、順序番号2244が必要です。
ORA-00334: アーカイブ・ログ: 'D:\ORADATA\ORCL\REDO02.LOG'
ORA-01547: 警告: RECOVERは成功しましたがOPEN
RESETLOGSが次のエラーを受け取りました。
ORA-01194: ファイル1は一貫した状態にするためにさらにリカバリが必要です。
ORA-01110: データファイル1: 'D:\ORADATA\ORCL\SYSTEM01.DBF'
SQL> recover database automatic
ORA-00905: キーワードがありません。
SQL> recover automatic database;
ORA-00283: エラーによってリカバリ・セッションは取り消されました。
ORA-10562: Error occurred while applying redo to data block (file# 3, block#
21623)
ORA-10564: tablespace SYSAUX
ORA-01110: データファイル3: 'D:\ORADATA\ORCL\SYSAUX01.DBF'
ORA-10560: block type '0'
ORA-00600: 内部エラー・コード、引数: [4552],[1],[0],[],[],[],[],[]
SQL> recover tablespace user;
ORA-00931: 識別子がありません。
SQL> recover tablespace users;
ORA-00283: エラーによってリカバリ・セッションは取り消されました。
ORA-00368: REDOログ・ブロックでチェックサム・エラーが発生しました
ORA-00353: ブロック85960(変更217167197、時間10/01/2018
01:20:14)付近のログが破損しています
ORA-00312: オンライン・ログ3 スレッド1: 'D:\ORADATA\ORCL\REDO03.LOG'
SQL> select * from V$RECOVER_FILE;
レコードが選択されませんでした。
SQL>
SQL> recover database until cancel;
ORA-00279: 変更217138326(09/30/2018 12:00:48で生成)にはスレッド1が必要です
ORA-00289:
検討すべきログ・ファイル:D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\ARC02244_0830209207.001
ORA-00280: 変更217138326(スレッド1)は順序番号2244に存在します。
ログの指定: {=suggested | filename | AUTO | CANCEL}
ORA-00308:
アーカイブ・ログD:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\ARC02244_0830209207.001をオープンできません。
ORA-27041: ファイルをオープンできません。
OSD-04002: ファイルをオープンできません
O/S-Error: (OS 2) 指定されたファイルが見つかりません。
ORA-01547: 警告: RECOVERは成功しましたがOPEN
RESETLOGSが次のエラーを受け取りました。
ORA-01194: ファイル1は一貫した状態にするためにさらにリカバリが必要です。
ORA-01110: データファイル1: 'D:\ORADATA\ORCL\SYSTEM01.DBF'
SQL>
SQL> recover database until cancel;
ORA-00279: 変更217138326(09/30/2018 12:00:48で生成)にはスレッド1が必要です
ORA-00289:検討すべきログ・ファイル:D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\ARC02244_0830209207.001
ORA-00280: 変更217138326(スレッド1)は順序番号2244に存在します。
ログの指定: {=suggested | filename | AUTO | CANCEL}
D:\oradata\orcl\REDO1.log
ORA-00308: アーカイブ・ログD:\oradata\orcl\REDO1.logをオープンできません。
ORA-27041: ファイルをオープンできません。
OSD-04002: ファイルをオープンできません
O/S-Error: (OS 2) 指定されたファイルが見つかりません。
ログの指定: {=suggested | filename | AUTO | CANCEL}
D:\oradata\orcl\REDO01.log
ORA-00310:
アーカイブ・ログは順序番号2242を含んでいますが、順序番号2244が必要です。
ORA-00334: アーカイブ・ログ: 'D:\ORADATA\ORCL\REDO01.LOG'
ORA-01547: 警告: RECOVERは成功しましたがOPEN
RESETLOGSが次のエラーを受け取りました。
ORA-01194: ファイル1は一貫した状態にするためにさらにリカバリが必要です。
ORA-01110: データファイル1: 'D:\ORADATA\ORCL\SYSTEM01.DBF'
SQL> recover database until cancel;
ORA-00279: 変更217138326(09/30/2018 12:00:48で生成)にはスレッド1が必要です
ORA-00289:
検討すべきログ・ファイル:D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\ARC02244_0830209207
.001
ORA-00280: 変更217138326(スレッド1)は順序番号2244に存在します。
ログの指定: {=suggested | filename | AUTO | CANCEL}
D:\oradata\orcl\REDO02.log
ORA-00310:
アーカイブ・ログは順序番号2243を含んでいますが、順序番号2244が必要です。
ORA-00334: アーカイブ・ログ: 'D:\ORADATA\ORCL\REDO02.LOG'
ORA-01547: 警告: RECOVERは成功しましたがOPEN
RESETLOGSが次のエラーを受け取りました。
ORA-01194: ファイル1は一貫した状態にするためにさらにリカバリが必要です。
ORA-01110: データファイル1: 'D:\ORADATA\ORCL\SYSTEM01.DBF'
SQL> recover database until cancel;
ORA-00279: 変更217138326(09/30/2018 12:00:48で生成)にはスレッド1が必要です
ORA-00289:
検討すべきログ・ファイル:D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\ARC02244_0830209207
.001
ORA-00280: 変更217138326(スレッド1)は順序番号2244に存在します。
ログの指定: {=suggested | filename | AUTO | CANCEL}
D:\oradata\orcl\REDO03.log
ORA-00283: エラーによってリカバリ・セッションは取り消されました。
ORA-10562: Error occurred while applying redo to data block (file# 3, block#
21623)
ORA-10564: tablespace SYSAUX
ORA-01110: データファイル3: 'D:\ORADATA\ORCL\SYSAUX01.DBF'
ORA-10560: block type '0'
ORA-00600: 内部エラー・コード、引数: [4552],[1],[0],[],[],[],[],[]
ORA-01112: メディア・リカバリが開始されていません
SQL> recover database using backup controlfile until cancel;
ORA-00279: 変更217138326(09/30/2018 12:00:48で生成)にはスレッド1が必要です
ORA-00289:
検討すべきログ・ファイル:D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\ARC02244_0830209207
.001
ORA-00280: 変更217138326(スレッド1)は順序番号2244に存在します。
ログの指定: {=suggested | filename | AUTO | CANCEL}
D:\oradata\orcl\REDO01.log
ORA-00310:
アーカイブ・ログは順序番号2242を含んでいますが、順序番号2244が必要です。
ORA-00334: アーカイブ・ログ: 'D:\ORADATA\ORCL\REDO01.LOG'
ORA-01547: 警告: RECOVERは成功しましたがOPEN
RESETLOGSが次のエラーを受け取りました。
ORA-01194: ファイル1は一貫した状態にするためにさらにリカバリが必要です。
ORA-01110: データファイル1: 'D:\ORADATA\ORCL\SYSTEM01.DBF'
SQL> recover database using backup controlfile until cancel;
ORA-00279: 変更217138326(09/30/2018 12:00:48で生成)にはスレッド1が必要です
ORA-00289:
検討すべきログ・ファイル:D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\ARC02244_0830209207
.001
ORA-00280: 変更217138326(スレッド1)は順序番号2244に存在します。
ログの指定: {=suggested | filename | AUTO | CANCEL}
D:\oradata\orcl\REDO02.log
ORA-00310:
アーカイブ・ログは順序番号2243を含んでいますが、順序番号2244が必要です。
ORA-00334: アーカイブ・ログ: 'D:\ORADATA\ORCL\REDO02.LOG'
ORA-01547: 警告: RECOVERは成功しましたがOPEN
RESETLOGSが次のエラーを受け取りました。
ORA-01194: ファイル1は一貫した状態にするためにさらにリカバリが必要です。
ORA-01110: データファイル1: 'D:\ORADATA\ORCL\SYSTEM01.DBF'
SQL> D:\oradata\orcl\REDO02.log
SP2-0734: "D:\oradata..."で開始するコマンドが不明です - 残りの行は無視されました
。
SQL> recover database using backup controlfile until cancel;
ORA-00279: 変更217138326(09/30/2018 12:00:48で生成)にはスレッド1が必要です
ORA-00289:
検討すべきログ・ファイル:D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\ARC02244_0830209207
.001
ORA-00280: 変更217138326(スレッド1)は順序番号2244に存在します。
ログの指定: {=suggested | filename | AUTO | CANCEL}
D:\oradata\orcl\REDO03.log
ORA-00283: エラーによってリカバリ・セッションは取り消されました。
ORA-10562: Error occurred while applying redo to data block (file# 3, block#
21623)
ORA-10564: tablespace SYSAUX
ORA-01110: データファイル3: 'D:\ORADATA\ORCL\SYSAUX01.DBF'
ORA-10560: block type '0'
ORA-00600: 内部エラー・コード、引数: [4552],[1],[0],[],[],[],[],[]
ORA-01112: メディア・リカバリが開始されていません
SQL> SELECT * FROM V$RECOVER_FILE;
レコードが選択されませんでした。
SQL> COL FILE# FORMAT 999
SQL> COL FILE_NAME FORMAT A36
SQL> COL TABLE_SPACE_NAME FORMAT A10
SQL> COL STATUS FORMAT A7
SQL> COL ERROR FORMAT A16
SQL> SELECT RF.FILE#, DF.NAME FILE_NAME, TS.NAME TABLE_SPACE_NAME, DF.STATUS, RF
.ERROR, RF.CHANGE#, RF.TIME
  2    FROM V$RECOVER_FILE RF, V$DATAFILE DF, V$TABLESPACE TS
  3    WHERE DF.FILE# = RF.FILE#
  4      AND TS.TS# = DF.TS#
  5  /
レコードが選択されませんでした。
SQL>
SQL>

2018年11月16日金曜日

レコード単位の計算(ireports)

なんてことない処理のはずがはまったので備忘録

要は、明細のA,B,Cの項目を合算して、Dに出したいというだけ。
手段はこれ以外あると思いますが、デザイナ環境と実行環境で動作が異なったため若干はまりました。
結果を残しておきます。

実装
KINGAKU_A,KINGAKU_B,KINGAKU_Cの計算をVariableで定義
表示フィールドにVariable名を設定


<variable class="java.lang.Double" incrementtype="Column" name="V_ROW_KINGAKU_GOUKEI" resettype="Column">
    <variableexpression>
    &lt;![CDATA[($F{KINGAKU_A}.equals(null)?0:new Double($F{KINGAKU_A}))+
    ($F{KINGAKU_B}.equals(null)?0:new Double($F{KINGAKU_B}))+
    ($F{KINGAKU_C}.equals(null) ? 0 : new Double($F{KINGAKU_C}))]]&gt;
</variableexpression>
</variable>

<textfield isblankwhennull="true" pattern="#,##0">
    <reportelement height="9" printwhengroupchanges="GroupName" width="48" x="695" y="0">
    <box leftpadding="3" rightpadding="3">
    <textelement markup="none" textalignment="Right" verticalalignment="Middle">
        <span fontname="IPA明朝">
    </span></textelement>
    <textfieldexpression class="java.lang.Double">&lt;![CDATA[$V{V_ROW_KINGAKU_GOUKEI}]]&gt;</textfieldexpression>
</box></reportelement></textfield>


2018年11月14日水曜日

Accessにてレコード超過によりデータが作成できなかった件 (未完結)

原因究明できていないため、参考までとしてください。

Accessの2GB制限と実際に投入できるデータサイズに対する実証および考察です。

ことの経緯


社内SE作業で、10,000件×10,000件の組み合わせデータを作成する必要があり、Excelではできず、Accessに頼ることにしました。

Excelにある2つのシート(各10,000件)をAccessへインポート
その後、クエリで2つのテーブルをCROSS JOINで新テーブルへINTO(1億件INSERT)

すると、謎のエラー。

accdbファイルを見ると、2GBを超えていました。Accessは2GBまでしかサポートしていないため、エラーとなったようです。

「ま~データ多いからな~」と思いつつ、今はMySQLへリンクテーブル張ってそこへ流し込んでいる段階なのですが、時間があるのでこの記事を書く事にしました。

2GBって何バイト?


改めて計算したところ、20億バイト。


これがテーブル定義なので、20Byte × 1億 件 でざっくり計算しても超えてしまいますね。

なので、母数を減らすことにしました。

10,000件 × 2,500件

これであれば、500MBに収まる試算です

でも同じエラーが出るよ???

レコードの容量計算を行うための情報収集。
ディスクのブロックサイズによって利用されるディスク領域が異なる。と。NTFSの情報を参照します。

fsutil fsinfo ntfsinfo c:

4096と出ました。つまり、4KB
今回の直接の原因にはならなそうです。

ここまでで一旦まとめ

今回の作業の目的はマトリックスデータを作って利用することであり、Accessを使ってどうこうという事ではなかったため、これ以上の深追いはしないことにしました。

考えられることとしては
1)Access内部で一時領域にディスクを利用していてそれでオーバーする
2)テーブルのインデックスなど、付加情報も容量見積に入れる必要あり
3)SELECT INTO (つまり手抜き)なので、結果作成されるテーブルのフィールド型が想定と違う? →その後データ件数を減らして実証しましたが、想定通り、元のテーブルの型を引き継いでいました

あたりが考えられますが、その詳細については今後必要に応じて調べていこうと思います

緯度経度周りのUtil(プログラム)

最近利用頻度が高くなってきたので備忘録
1.緯度経度間の距離を求める
2.緯度経度の60進数表記から10進数表記へ変換

Excelで作業していたのでvbaです
評価検証用として作成(他より拝借)したので精度は検証できていませんがおおよそいけそうです
2018.12.15追記) 60 to 10変換にて各項目の桁数が少ない場合に計算が合わない件を修正
Excel上で利用する場合、この関数をモジュールに組み込んでから
=LatLng60To10(A1)などとします


Option Explicit

Const GRS80_A = 6378137#
Const GRS80_E2 = 6.69438002301188E-03
Const GRS80_MNUM = 6335439.32708317
 
Const PAI = 3.14159265358979
 
Function deg2rad(deg As Double) As Double
 
    deg2rad = deg * PAI / 180#
 
End Function

'国土地理院サイトにて計算結果を目視確認によりテスト
'https://vldb.gsi.go.jp/sokuchi/surveycalc/surveycalc/bl2stf.html
'***********************************************************************
' [説 明] 2地点間の直線距離を求める関数
' [引 数] lat1:地点1緯度 lng1:地点1経度 lat2:地点2緯度 lng2:地点2経度
' [戻り値] 距離差(m)
'***********************************************************************
Public Function calcHubenyToMeter(lat1 As Double, lng1 As Double, lat2 As Double, lng2 As Double) As Double
 
    Dim my As Double
    Dim dy As Double
    Dim dx As Double
    Dim sin As Double
    Dim w As Double
    Dim m As Double
    Dim n As Double
    Dim dym As Double
    Dim dxncos As Double
     
    my = deg2rad((lat1 + lat2) / 2#)
    dy = deg2rad(lat1 - lat2)
    dx = deg2rad(lng1 - lng2)
     
    sin = Math.sin(my)
    w = Math.Sqr(1# - GRS80_E2 * sin * sin)
    m = GRS80_MNUM / (w * w * w)
    n = GRS80_A / w
     
    dym = dy * m
    dxncos = dx * n * Math.Cos(my)
     
    'メートルで取得するので、キロメートルに変換し小数第一位までにする
    calcHubenyToMeter = Round(Math.Sqr(dym * dym + dxncos * dxncos), 2)
 
End Function

'LatLng60To10("35.39.30.959")
'35.6585997222222
'LatLng60To10("139.44.43.594")
'139.745442777778
'LatLng60To10("035.40.51.100")
'35.6808611111111

'LatLng60To10("35.39.09.959")
'35.6527663888889
'LatLng60To10("35.39.9.959")
'35.6527663888889

Public Function LatLng60To10(ByVal target As Variant) As Double

    Dim arr() As String
    Dim cal As Double
    Dim tmpSec As String
    Dim calsec As Double
    arr = Split(target, ".")

    If IsNull(target) Then
        Exit Function
    End If
    
    If UBound(arr) < 1 Then
        LatLng60To10 = ""
        Exit Function
    End If
    arr(0) = Right("00" & arr(0), 2)
    arr(1) = Right("00" & arr(1), 2)
    arr(2) = Right("00" & arr(2), 2)
    If UBound(arr) > 2 Then
        arr(3) = Right("000" & arr(3), 3)
        tmpSec = arr(2) & arr(3)
    Else
        tmpSec = arr(2) & "000"
    End If
    
    calsec = CDbl(tmpSec) / 1000
    
    cal = CDbl(arr(0)) + (CDbl(arr(1) / 60)) + CDbl(calsec / 3600)
    LatLng60To10 = CStr(cal)

End Function

2018年9月12日水曜日

【1行Tips】Excel関数:都道府県文字を取得


=IF(ISERR(FIND("県",LEFT(A2,4),1)),
 IF(ISERR(FIND("都",LEFT(A2,3),1)),
 IF(ISERR(FIND("道",LEFT(A2,3),1)),
 IF(ISERR(FIND("府",LEFT(A2,3),1)),"N/A",
 LEFT(A2,FIND("府",A2,1))),
 LEFT(A2,FIND("道",A2,1))),
 LEFT(A2,FIND("都",A2,1))),
 LEFT(A2,FIND("県",A2,1)))

2018年5月19日土曜日

ゴルフGPSナビをGPSロガーとして使う検証

本blogをゴルフブログとして使う気は全くないのですが、日常にIT機器がある以上、様々な発展形を意識していきたいと思いつつ、タイトルの件となります。

結果としては、
〇ゴルフGPSナビは通常のGPSロガーとしても使える
〇データとしてkmlファイル形式のデータが出力できる機器であれば他のソフトとの連携も可能

ということで、自分のツール活用範囲が広がりそうです。

ゴルフGPSナビって何ぞや

「みちびき」に対応している機器もある、ゴルファー御用達のゴルフ支援機器です。
個人的に入手し使う機会があったことから本記事を書くきっかけとなりました。

何ができるのか

ゴルフ向けの機能は当然ながらたくさんあります。そのなかで、今回は「みちびき対応」のGPS情報が取得できる、データをkmlファイルで取得できるという2つの理由から、GPSロガーとして使ってみたらどうかという検証へ行きつきました。

検証

ゴルフコースでの初利用を終え、GPSロガーとしての機能は十分に持っていると確信しました。コース内を行ったり来たりしている様子がきちんと管理アプリで確認できたためです。
しかし、それはあくまで管理アプリ上での話。ゴルフGPSナビの管轄外であるゴルフコース外のGPS情報を果たしてどのように扱ってくれるのか、そのために、あえて日常でGPSナビを起動、ログを取得して検証してみました。

結果

いきなり結果になってしまいましたが、データの取得、地図ソフトでの確認ともに、バッチリ万全でした。
・データの取得には、EagleVision社のezComを利用
・データ管理アプリはEagleVisionPlus(WindowsApplication)を利用してkmlを取得
・地図表示にはGoogleMapのマイマップ機能を利用

上記組み合わせでGPSロガーとしての機能を全うできました。


え?Googleのタイムラインでいいんじゃない?というご意見もあろうかと思いますが、明らかに精度が違う。(タイムラインは気分屋で、ポイント点以外の経路は結構雑と感じてます)

登山やハイキングなどで外出することも多い私には活用できそうなアイテムになりそうです

2018年5月10日木曜日

リモートデスクトップができなくなった(WindowsUpdate)

事務スタッフからの連絡を受けて事務所へ急行。
接続してみると。。。確かに接続できない。


要求された関数はサポートされていません
原因はCredSSP 暗号化オラクルの修復である可能性があります

見たことないメッセージ。ってオラクルってなんで?と思いつつ、エラーメッセージでGoogle検索すると、リモートデスクトップの接続元(ゲストPC)と、接続先(ホストPC)で、暗号化に関する機能のレベルが不一致だと起きる模様。

後で聞いたら、昨日の夜にWindowsUpdateが動いていたのだと。
https://blogs.technet.microsoft.com/jpsecurity/2018/05/09/201805-security-updates/

対処としては、同じ暗号化機能のバージョンが双方にあればよい。つまり、WindowsUpdateで双方を最新化すればよい。


ホストPC側もWindowsUpdateは済んでいて再起動待ちだったので、再起動して処置完了しました。