コンパイラーのバグ
ふと思い出した
10年ほど前にSolaris9で開発していた頃のことをだらだらと。
(もうそんなに経ったか・・・)
うろ覚えだけど、こんな感じのreturn漏れのコード(適当
int hogera(int b, int c) { int a = b + c; if (a = 0) { return 0; } // return nil }
通常
上記はreturn漏れのコンパイラ警告だかエラーになるはずが、何故か問題なくコンパイルできてしまった。
結局、リリース後に発覚して大騒ぎだった記憶。
その時はSun(現Oracle)のサポートに連絡し、調べてもらって結論が「バグ」だったような。
と言っても
Success is a Journey, not a Destination: 全てのCプログラマが未定義な振る舞いについて知っておくべきこと #2/3を読むと、必ずしもバグだけでなく、あれは最適化の影響だったのではと今では思ったり。
リリースをするときは必ず、Releaseモードでビルドするしね。
それ以来
どうしても解消しないバグの要因の一つとしてコンパイラも疑う癖がついてしまった。
Oracle9i/11gでも
バグっぽいものを見つけた。
SQL単体で実行すると正しい結果が返ってくるのに、PL/SQLにすると何故かうまく実行できない。
他にも、特定のSELECT文を実行直後に別のSELECT文を実行すると、結果が異なるなど。。。
結局Oracleサポートに入ってなかったので、バグ報告は上げてない(笑
大抵
しょぼいミスが原因。
だからできるだけシンプル、できるだけコンパクトにして、バグが混入しにくいコードを書くように心がけている。
1関数50行を目標にしてはいるけど、トリッキーなコードを使わないコンパクトって、なかなか難しいよね。
SQL*LoaderでUnicodeのテキストファイルを取り込む
INFILEがUnicode(UTF-16やUTF-8)なら
CHARACTERSET
を使う。
loaderのcontrolファイルにCHARACTERSET
で文字コードを指定すればOK
OPTIONS(LOAD=100,SKIP=1,ERRORS=-1,ROWS=10) LOAD DATA INFILE 'data.tsv' BADFILE 'data.bad' TRUNCATE INTO TABLE SUMTMP FIELDS TERMINATED BY "," TRAILING NULLCOLS ( ITEM, QTY )
↓こんな感じで
OPTIONS(LOAD=100,SKIP=1,ERRORS=-1,ROWS=10)
LOAD DATA
CHARACTERSET UTF16
INFILE 'data.tsv'
BADFILE 'data.bad'
TRUNCATE
INTO TABLE SUMTMP
FIELDS TERMINATED BY ","
TRAILING NULLCOLS
(
ITEM,
QTY
)
なおloaderでのUnicodeキャラクタ・セットはUTF-16はUTF16
、UTF-8はUTF8
とハイフンなしで指定するとか、少しややこしいかも。
Unicodeのタブ区切りファイル(TSV)
UnicodeのTSVで見事にハマりました。
SJISとかのタブ区切り文字指定は、TERMINATED BY X'09'
と書けばOK
Unicodeで同じようにやってみるとエラーになる。
Unicodeでのタブのコードは先頭にゼロが2つ必要になるので、X'09'
ではなくてTERMINATED BY X'0009'
と書くとうまくいく。
PowerShellでテキストファイル(CSV)を集計してみる
簡単だけど、面倒くさい
「このテキストファイルを〇〇別に集計して」∑(゚д゚lll)
こんな依頼や作業も少なくない。
本当はもう少し下っ端にやって欲しいところだけど、人手不足でそうも言ってられず。
一回きりであれば、Excelで取り込んでピボット集計してハイ終わりなんだけど、
ファイル数が多かったり、同じファイルでも何度もやっているととても面倒くさい!
それこそ、元ファイルサイズが 数十MB とか、いちいちExcelでやってられない。
パソコン固まるし。
世の中そんな悩みを抱えるシステム屋さんも多いはず(あれ?オレだけ?)
まぁツール探せばあるかもしれないが、今回はPowerShellでのやり方。
Windows7以降なら基本入っているので、ツールインストール出来ない環境などでは使えるかな。
固定長ファイルを集計してCSV出力する
まずはヘッダーがないテキストファイルで想定。
indata.txt
A 1 B 2 A 3 B 4 C 5
先にざっくり流れを書くと、 固定長ファイル→CSV形式→グルーピング→集計→CSVファイル化 を1コマンドでやってしまおうということ。
1. 固定長を無理やりCSV形式に変換(ConvertFrom-Csv)
PS F:\test> cat ./indata.txt | %{ $_.substring(0, 10).trim() + "`t" + $_.substring(10, 5).trim() } | ConvertFrom-Csv -header item, qty -Delimiter "`t" item qty ---- --- A 1 B 2 A 3 B 4 C 5
前半cat ./indata.txt | %{ $_.substring(0, 10).trim() + "`t" + $_.substring(10, 5).trim() }
は固定長データをタブ文字区切りのデータ部に変換します。
- ExcelでCSVファイルを開くと、先頭ゼロや、空白が自動で削られる事があるので、
"=`"" + $_.substring(0, 10).trim() + "`""
みたいにしておくと、いい感じにExcelで使える。
後半の| ConvertFrom-Csv -header item, qty -Delimiter "`t"
では、タブ文字区切りしたデータ部にヘッダー名を付与してCSV形式に変換かけてます。
2. 項目別にデータをグループ化(Group-Object)
グループコマンドレットで先ほど指定したヘッダー名item
でグルーピングしてみると。。。
PS F:\test> cat ./indata.txt | %{ $_.substring(0, 10).trim() + "`t" + $_.substring(10, 5).trim() } | ConvertFrom-Csv -header item, qty -Delimiter "`t" | group item Count Name Group ----- ---- ----- 2 A {@{item=A; qty=1}, @{item=A; qty=3}} 2 B {@{item=B; qty=2}, @{item=B; qty=4}} 1 C {@{item=C; qty=5}}
おぉ~いい感じでitem
でグルーピングしている。
後は合計部を作りこめばOK
3. 項目別に合計する(Select-Object、Measure-Object)
おもむろに下記コマンドを実行します。
PS F:\test> cat ./indata.txt | %{ $_.substring(0, 10).trim() + "`t" + $_.substring(10, 5).trim() } | ConvertFrom-Csv -header item, qty -Delimiter "`t" | group item | select @{Name="sumitem";Expression={$_.Name}}, @{Name="sumqty";Expression={($_.group | measure -sum qty).sum}} sumitem sumqty ------- ------ A 4 B 6 C 5
見事に項目別に集計されてます。
4. CSVに出力する(Export-Csv)
ま、最後は簡単でExport-CSV
PS F:\test> cat ./indata.txt | %{ $_.substring(0, 10).trim() + "`t" + $_.substring(10, 5).trim() } | ConvertFrom-Csv -header item, qty -Delimiter "`t" | group item | select @{Name="sumitem";Expression={$_.Name}}, @{Name="sumqty";Expression={($_.group | measure -sum qty).sum}} | Export-Csv -NoTypeInformation outdata.csv
中身を確認するとちゃんとCSV形式で出力されてます。
PS F:\test> cat .\outdata.csv "sumitem","sumqty" "A","4" "B","6" "C","5"
補足
項目別に合計するのところでぶっ飛ばしましたがselect @{Name="sumitem";Expression={$_.Name}}, @{Name="sumqty";Expression={($_.group | measure -sum qty).sum}}
でやっていることはそれほど難しくないです。
@{Name="sumitem";Expression={$_.Name}}
最終出力するヘッダー名が Name になるのが気に食わなかったので、別名にしているだけ。@{Name="sumqty";Expression={($_.group | measure -sum qty).sum}}
グループ内のqty値を集計しているだけです。
もし集計したい項目がqty1, qty2などの場合は、@{Name="sumqty1";Expression={($_.group | measure -sum qty1).sum}}, @{Name="sumqty2";Expression={($_.group | measure -sum qty2).sum}}
になるんでしょうか(適当
SQL DeveloperでSQL Serverにつなげる
あるシステムを炎上導入しているのだが、現行システムはSQL Serverで動いていた。
今回はSQL Server→Oracleなのだが、使い慣れたSQL DeveloperからSQL Serverに繋げれるようなので、データ調査などで使えるじゃんとのことでやり方。
JDBCを使って
ざっくり説明すると
- JDBC(jTDS - SQL Server and Sybase JDBC driver - Browse Files at SourceForge.net)をダウンロードし、解凍。
- SQL Developerをおもむろに立ち上げ、プリファレンスを開く
- データベース>サードパーティ的な画面を表示する
- エントリー追加で「1.」のJDBC(jar)を指定する
- 最後に接続先を追加するときに増えたSQL Serverのタブに設定を入力すれば完了
もちろん入力するSQLはSQL Serverのものなので、なかなか手ごわい。
Oracle SQL Developer Migrations はじめの一歩
他にも
- Linked Serverを使ってSQL Server→Oracle
- Database LinkでOracle→SQL Server
- bcpとsql*loaderを使って SQL Server→csv→Oracle
- SQL Developerを使ってOracleにコピー
OneNote使ってる?
もういくつ寝るとサーバー更新〜
この時期の一大イベントといえば、 サーバー更新!
忘年会でもクリスマスでも正月でもなく サーバー更新!
この流れは何とかならないのだろうか(´・ω・`)
なお、今回はタイにあるサーバーの更新だったので、出張の危険もあったがなんとかリモート対応で回避!
その代わり、タイのサーバーをインドから移行作業して、日本から支援というよく分からない状況になった。
話を戻して「OneNote」
俺以外で使ってる人を見たことないOneNoteちゃん
職場の人にも「OneNote使ってる人初めて見た」と言われる始末。
OneNoteちゃん可哀想すぎw
でも意外と使えるやつなんですヨ
ナゼOneNoteを使うのか
付箋ソフト(メモ箋人*1)の時期もありました。
ResophNotes - Quick Notes on Windowsの時期もありました。
しかし、どれもイマイチ。
イマイチな理由は、
色が使えない
まぁ、カラフルにしたいわけではないけど、少し色が欲しい時がある。画像が付けれない
「ぬぉー!言葉で説明しにくい!」なんて場合もある。表が書きにくい
Markdown的になら書けるけど面倒くさい。
|header1 |header2 |header3 | |---------|---------|---------| |text1 |text2 |text3 |
Excelでいいのでは?
WordやExcelならなんでもできるが、メモするのにExcelとか立ちあげたくない。
それなら必要なときだけExcelでいいじゃんとか思うかもだけど、やっぱりメモはメモとして1つのソフトに統一したい。.txtや.xlsxとか・・・
あと、分類管理、横断的な検索機能など入れるとやっぱりExcelでは〜
取り敢えずOneNoteなら
上記画像はOneNoteで作ったもの。
適度な機能
メモに必要な最低限の機能に絞ってあるので、高度なことはできないけど ちょっとしたメモ から 議事録や補足資料 程度ならイケる!
許されている会社なら、スマホと連携とかもできるので、個人メモ〜仕事メモまで同期して使える。
ただし、、、
冒頭にも書いたように周りで誰も使ってないので「さっきの補足資料後で送って〜」とか言われると焦る(笑
でもPDFやWordにも変換して保存できる機能があるので、それほど困ることもあまりないかな。
不安要素も
このままユーザ数が増えないなら、将来OneNote廃止となる可能性も。
まぁ所詮メモだしなんとかなるでしょ。
*1:メモ箋人は提供元の「株式会社リューシス」業務終了に伴い、開発ストップ。知らなかった
プログラマー御用達「Rictyフォント」
プログラミング用フォント
誰もが一度は探すであろう見やすいフォント
その中でもソースコードが見やすいと噂なのがプログラミング用フォント Ricty
導入がちょっと面倒
ライセンス(再配布禁止)の関係でフォントそのものが配布されてない為、自分で生成するしかない。
手順通りに進めればいいだけだが、ちょっと面倒くさい
FontForge のインストール
sudo apt-get install fontforge
Inconsolata のインストール
Inconsolataフォントをダウンロードして
~/.fonts/
に投入Migu 1M のインストール
Migu 1Mフォントをダウンロード&解凍して
~/.fonts/
に投入http://sourceforge.jp/projects/mix-mplus-ipa/downloads/59022/migu-1m-20130617.zip/
Rictyジェネレータをインストール
Ricty の生成
./ricty_generator.sh auto
コマンド実行Ricty のインストール
出来上がった
Ricty-Regular.ttf
、Ricty-Bold.ttf
、RictyDiscord-Regular.ttf
、RictyDiscord-Bold.ttf
ルを~/.fonts/
に投げ込めばOK
出来上がったフォントはWindowsでも使えるみたいだけど、そのままでは見難い(´;ω;`)ウッ…
どうしてもって人は「ricty フォントサイズ windows7」とかでググってください
結局
WindowsならMS ゴシックの9ptに落ち着く
GPSロガー+Google Earth
GPSは別に持つ
しかし、GPSを使うとバッテリー消費が激しいので、あっという間に文鎮化
そんな人は是非GPSロガーをお勧め
値段はピンキリだけど、1万出せばかなりいいものが買える
僕が4~5年使っているのはTripMate850というGPSロガー(販売終了しているっぽいね)
長時間のGPS記録
環境によるかもだが、エネループで10時間程度の記録ができる。
精度高いGPS
GPSロガーの設定次第だが、1秒ごとや、5mごとなど細かい記録方式を選べるのはもちろん、非常に精度が高い。
写真に位置情報を埋め込む
最近のスマホでは、写真に位置情報を埋め込むことが出来るが、普通のデジカメなんかはまだまだGPS搭載機種は多くないので「この写真の場所どこだっけ?」とかなる。
GPSの記録情報には様々な情報が記録されていて、時間もその一つ。
(GPS衛星から時刻情報も受信しているらしいので、かなり正確)
GPSロガーを買うと付属ソフトでGPS記録データと写真を位置記録時間と撮影時間で一括紐付けできるものがついてくると思うが、よく使うのはNikonのサイトからダウンロードできるViewNX 2(フリーソフトとして提供されている?)
NMEAと呼ばれるGPS記録形式に対応しているので助かります。
Google Earthと連携
Google Earthに取り込んでみる
通った道が丸わかり!だけでなく、高度や時速、距離などもろもろも表示できる。
取込み方法は至って簡単で、NMEA形式のファイルをドラッグ&ドロップするだけ。
※拡張子が.nmea
にしか対応してないようで、.nma
とかは拡張子を変えればOK
今日は31kmも走っていたのか!
スマホ(Android)と連動
実はTripMate850だが、Bluetoothを搭載している。
つまり、GPSロガーの位置情報を別の端末で使えちゃいます。
- スマホの開発者向けオプションにある「擬似ロケーションを許可」にチェックを入れる
※コロプラなど一部の位置情報アプリでは、擬似ロケーション非対応のものもあるので注意。
以上!