SQLite覚書 速度の向上

データが1万→2万になったところで、急激にUPDATEの速度が遅くなってしまった。
SQLiteって速いって聞くんだけど・・・
ということで、チューニングについて調べてみた。
INSERTが遅いってのがあったけど、Transactionは入れてるし。
UPDATEが遅いっていわれても、そこを変えるのは・・・と思ったので、以下のサイトを参考に、コマンドプロンプト上でDBの設定をかえた。
パフォーマンスを追求するためのSQLite設定 | ITハンドブック
SQLite「PRAGMA statement」

sqlite> PRAGMA main.journal_mode = PERSIST;
sqlite> PRAGMA main.synchronous=0;

mainはスキーマ名。
で、どうなったかというと、設定を変更後、一回VACUUMをしてから確認したら、劇的に速度向上?

<追記>
あぁ・・・勘違いしてた。
どうやら、DBを開いているときだけ設定した状態が保持される様子。

SQLite が認識できる SQL

閉じちゃったら元のDefault設定に戻るようだ。
たしかに、開き直したら設定が消えちゃってたよ。

開いた直後だな。設定するのは。

<追記2 2016/09/14>
さて、さて、いろいろ試した結果。

結果的に設定を変えて高速化したか?といえば、さほどな気はした。
やはり、他のSQLと同様、INDEXをはるってのが1番で、あとはなるべく実行しない方法を探すのがよいようで。
次に、TRANSACTION。これはかなり大きかった。1,2万行を順にINSERTしていく手前でBEGIN→終了時COMMITとするだけだが、これも速度がだいぶん速くなったように感じた。
DELETE&INSERTよりREPLACEを使うのがいいと書いている人もいるが、
目からウロコだったのは、INSERT文のVALUES部にUNION ALLしたSELECT文を用いるやり方。

SQLiteで最も速く複数行INSERTする方法 | transhumanist note
要は、複数行の実行をお纏めしちゃうわけで、これはなかなか面白いやり方だと思った。

まぁ、あとできることはVACUUMしてゴミを減らすことかな・・・

ExcelVBA覚書 コマンド実行

Dir関数でファイルがないってときに、
 ただファイルがないのか、ネットワークにつながってないのかわかんないの?
 Ping飛ばしてネットワークにつながってるのか調べたらいいじゃない?
みたいな要件があって、まぁ、正直、「そこまでやるか?」って思ったけど、そういう環境で動いている人は、そういう発想になるんだろうなぁ・・・と思って、教えてもらったPing送信術をアレンジしてExcelに埋め込んでみた。

Public Function CheckNetwork(ip As String) As Boolean
    
  Dim wsh As Object
  Dim buf As String
    
  On Error GoTo ErrCheck

  Set wsh = CreateObject("WScript.Shell")
  wsh.Run "%ComSpec% /c ping -n 1 " & ip & " | clip ", 0, True
  buf = GetObject("\" _
               , "htmlfile").ParentWindow.ClipboardData.GetData("text")
  If InStr(buf, "ラウンド トリップの概算時間") > 0 Then
      CheckNetwork = True
  End If
  Exit Function
ErrCheck:
  err.clear
End Function

ちなみに、「%ComSpec%」は、「%SystemRoot%\system32\cmd.exe」のことらしい。
「 | clip」でクリップボードに入れて、それをbufに読み込むようにした。
また、Shellは、Execで動かす方法とRunで動かす方法があるが、Runのほうが、コマンドの窓が表示されないようにできるので、こちらを採用。
面倒な要件は、解決できると嬉しい。
解決しないと、逆恨みしそうだけど。

ExcelVBA覚書 シートロック、でもフィルターは使いたい

あるよねぇ~~~~
ってことで、

Sub ProtectSheet
    With ws
        If Not .ProtectContents Then         'ロックされていないときだけロック処理
            .Protect Password:="password"
                   , DrawingObjects:=True
                   , Contents:=True
                   , Scenarios:=True _
                   , AllowFiltering:=True     'ここでフィルターOKにする
        End If
    End With
End Sub

以下は試していないけれど、これでもOKらしい。

Sub ProtectSheet2
    With ws
        If Not .ProtectContents Then         'ロックされていないときだけロック処理
            .Protect Password:="password"
                   , DrawingObjects:=True
                   , Contents:=True
                   , Scenarios:=True _
                   , userInterfaceOnly:=True
        End If
        .EnableAutoFilter = True
    End With
End Sub

ExcelVBA覚書 Application.Goto

セル選択&移動させる方法はいろいろあるけど、一番手っ取り早いのはApplication.Gotoのようだ。

Sub ActivateRange(rng as Range)
    On Error Resume Next
    Application.Goto rng, True
    err.clear
End Sub

1つ目の引数は選択セル、2つ目の引数はスクロールして移動するかどうか、らしい。
選択だけだったら、rng.selectでもいいように思うけど。

これを使わずに選択させようとなると、

Sub ActivateRange(rng as Range)
    On Error Resume Next
    rng.parent.parent.Activate
    rng.parent.Activate
    rng.select
    err.clear
End Sub

みたいなかんじで、ブック→シート→セルをアクティブにしないといけないわけで、これは面倒。
(親がアクティブになっていないに、子をアクティブにはできないのだ)
楽にできる関数があるということで、メモ。

ExcelVBA覚書 このパスどこ?

このパスはローカルなのかネットワークサーバなのか・・・
とりあえず判定ロジックを作ってみた。

'ローカルならTrue、ネットワークならFalse
Public Function CheckLocal(filepath as String) As Boolean
    
    Dim cap As String
    Dim fso As Object
    Dim obj As Object
    
    '先頭が\なら確実にネットワーク
    cap = Left(filepath, 1)
    If cap = "\" Then
        Exit Function
    End If

    'ドライブ割当のローカル/サーバ確認
    Set fso = CreateObject("Scripting.FileSystemObject")
    For Each obj In fso.Drives
        If obj.DriveLetter = cap Then
            If obj.DriveType = 3 Then
            Else
                CheckLocal = True
            End If
            Exit Function
         End If
    Next
    'ここまで来たらどこかは不明
End Function

物欲主義! Tabletを買ってしまった件

iPod Touchを持っているのだが、最近、Amazonのプライムビデオで『弱虫ペダル』をiPodで観ていてふと思ったことが、

観ている間ゲームできないんですけど・・・

ってな話。
「いや、観ている間ゲームはしないっしょ」と突っ込まれそうだけど、例えば、ちょっとメールを確認したいとかね、わざわざ画面切替えないといけないわけ。
面倒ですな、と思って、早速Amazonでタブレットを漁ってみた。
Amazonの動画を観るだけだったら、とKindleタブレットも候補に挙げてみたが、さらにふと思ったのは、ポケモンGOのこと。
iPodだとブチブチ切れちゃう(最終的にGPSの感度でなく、メモリかなぁとも思い始めてきた。)ので、んじゃ、GPS付いてるタブレットにしてはどうかと調べてみた。

で、一目散。Sony Xperia Tシリーズ
サイズによって値段が違うものの、5万円かぁ・・・きついなぁ。
ASUSなんてどうかなぁ・・・どうかなぁ・・・。

購入。。。

5万円超のタブレットを買ってしまった。PCより高いやないか!とか気がついたのは購入後。
GPS付いている2万円台のタブレットがあるやろ!と、気がついたのは製品が届いた後。

いやぁ、Xperiaが欲しかったんです!!

そう、ただそれだけだった。
いや、それだけじゃない。
一応ハイレゾ対応してるから、音楽だってmicroSDにいれて聴ける!とか考えたし、
デザインもまるまるしてなくって自分好みだし、
し・・・・・・・

えっと、
それぐらいかな。

まぁ、でもめっちゃ気に入ってて、常時私とともにある感じ。
いやぁ、いい買い物したよ。
5万円分使いまくってやる!(潰れない程度に)

Java覚書 ExcelのSLOPE関数をJava化してみる

回帰直線の傾きを求めるExcelのSLOPE関数をJavaで作成してみる。

public class Main {
    public static void main(String[] args) throws Exception {
        // y値のみで、かつ、int型
        int y[] = new int[]{70,80,30,40,50,20};
        slope(y);
        // x,y値で、かつ、float型
        float[][] xy = { {2.5F,10.3F}
                        , {3.0F,24.3F}
                        , {3.2F,30.5F}
                        , {5.0F,42.5F}
                        , {6.1F,53.4F}
                        , {8.9F,48.8F}
                       };
        slope(xy);
    }
    
    // 回帰直線の傾きを算出(int型 y値のみ渡す)
    static float slope(int val[]) {
        float[][] f = new float[val.length][2];
        int i = 0;
        for(int v : val) {
            f[i][0] = (float)i;
            f[i][1] = (float)v;
            i++;
        }
        return slope(f);
    }
    
    // 回帰直線の傾きを算出(float型 x, y値を渡す)
    static float slope(float[][] val) {
    float sumX = 0;
    float sumY = 0;
    float sumXX = 0;
    float sumXY = 0;
    float n = val.length;
    for(int i = 0; i < val.length; i++){
       float x = (float)val[i][0];
       float y = (float)val[i][1];
       sumX += x;
       sumY += y;
       sumXX += x*x;
       sumXY += x*y;
     }
     System.out.println("a : " + (float) (n*sumXY-sumX*sumY)  / (float) (n*sumXX-sumX*sumX));
     System.out.println("b : " + (float) (sumXX*sumY - sumXY*sumX) / (float) (n*sumXX - sumX*sumX));
     return (float) (n*sumXY-sumX*sumY)  / (float) (n*sumXX-sumX*sumX);
    }
}

ポケモンGOをやってみた

というかやってます。
自分の周りの自分より年上の人がやってるって聞いて、「いや、そんなおっさんまでやってたら、そりゃアクセスできませんわ・・・」とか思ってたんだけど、えぇ、齢40過ぎたおばはんもやってます。

自分はiPod Touch(第5世代)で、Y’MobileのポケットWifiでインターネット接続してやってるんだが、もうプチプチ切れて、私の血管も切れそうな勢い。
はじめはGPSを探してます・・・って表示されてプチっと切れるから、GPS関係かな?とか思っていたんだが、京都の山奥(ってほど奥でもないけど)で使ったら、結構落ちないで動いてくれていたので、結局は、

周りに人が多いとプチプチ切れる!

って結論に達した。
なので、例えば早朝とか深夜とかなら、そんなに切れずに使えるんかなぁ・・・と思ったけど、朝起きれません。夜中徘徊する気もありません。

ということで、使い勝手の悪い状態で当分は遊ぶことになりそう。

下手をしてしまったこの1週間

いやぁ、参った。
自分が基本的なことを怠った所為なのだけど。

DBとかのバックアップはとってたのに、WordPress関連ファイルのバックアップをしないまま、WordPressのバージョンアップをしてしまった。
というのも、ここ最近は、エラーもなくバージョンアップできていたからなのだけど。

で、バージョンアップに失敗し、メンテナンスモードから戻らず、挙げ句の果て、FFFTPでバージョンアップしたファイルをアップロードしようとして、サーバに容量が足りないんだぜ!エラー「552 STOR denied: quota exceeded」が発生し、どうにもならん状態で1週間がすぎた。

で、もうダメかなぁ・・・などとブルーになっていたら、wp-content/upgradeのなかに、古いバージョンのファイルがすべてバックアップされているのを発見。
で、そこからファイルを戻して復旧させることに成功した。

おそらくだけど、バックアップとって、バージョンアップさせたら容量が足りなくなったんだろうな。

ということで、アクセスできなかった方々、申し訳ございませんでした。

クーラーをつけた日 2016

今年も、とうとうこの季節がやってきた。

もう、ムンムンしすぎて、気持ち悪くって、寝られない!

ってなことで、クーラーを掃除。
全力で冷やしてもらったが、30分ぐらいしないと、ムンムンが消えなかった。

30分経って、空気はまぁ良くなったが、なんだかやっぱり寝られない・・・

って、あれ?、単なる食べ過ぎだったかも。
(懲りないね・・・)

観劇の日々

さてさて、春~初夏にかけて、いろいろ観たのでメモっておこう。

宝塚星組「こうもり・The Entertainer」

ぴあの先行予約でチケットが取れず諦めていたのだが、そのぴあから空席のメールがやってきたので、ぷしゃっと空席をみてみたら、悪くない位置だったのでゲット。
桜もほぼ散った時期だったが、芝居もショーも華やかで見応えがあってよかった。
芝居はトップ以下コメディエンヌが揃っている組ならではで非常に楽しめたし、ショーもなかなかのモノだったと思う。
最近の宝塚の問題といえば若手がいまいち育っていないというところだが、とりあえず星組は礼真琴がいるので大丈夫感たっぷり。その下が・・・というところか。
あとはもう少し娘役が注目されるといいなぁと思う。
買っても観ないけどDVDかっとこうかなぁ・・・と密かに思う今日この頃。
(ホント、観ないんだよなぁ)

映画「ズートピア」

1日の映画1000円デーに3Dで観た。
3Dだと1500円ぐらい取られるのでお得感がないし、そもそも3Dで観る必要あるのか?とか、めがねのせいで画面が暗いとか、とにかくいいことNothingな3D鑑賞だったが、観られる時間帯にやっていたのが3Dしかなかったので、諦めて3Dにしたのだ。とほほ。
マジ、二度と「3Dでみない!!」と固く誓った2時間だった。
ストーリーは良くって、なんてったってカワイイ。上戸彩はまぁ声優としてはどうかと思うが、カワイイからもういいのだ!と思ってしまった。それぐらい、みんなカワイイし、面白かった。
動物の世界も大変なのね。

ミュージカル「エドウィン・ドルードの謎」

客席参加型ミュージカルで、結末がなんか複数通りあるんだよねぇ・・・へぇ~・・・ってな感じで行ってみた。
面白かった。芝居観てて、声に出して突っ込んだの初めてだよ。
ほんと、面白かった。
いやぁ、レビューを観てると、あぁきっと台本通りなんだねぇ・・・と思うのだが、アドリブなのかお稽古通りなのか、もうブヨンブヨンのところにいるような感じがよかった。
主演が山口祐一郎と壮一帆とあるが、完全山口支配人と今拓哉が主役。この2人でストーリーの60%は費やしている。サラサラ山口さんとヌメヌメ今さん、いいコンビだ。
山口支配人は、こういう役のほうが合うだろうね。もう、かるーく流す感じの役。
エリザベート観たときは、演歌歌手か!とか思っちゃったもの。
暑苦しいというか、ねちっこい今さんも良かったけど、平井綾もかわいかったけど、保坂千寿さんもすてきだったけど、ヘンにはまったのはコングだった。
いやぁ、あれは笑えるな。声も好き。ちょっと、これから追っかけてみようかな。
ということで、投票した犯人にはならなかったが、楽しめた。よかった。

ということで、この春の観劇日和は、なかなか晴天に恵まれてよかったということで、ハッピーだ。

Excel VBA覚書 CSVファイル読込

久方ぶりの投稿。いろいろあったけど、それはまた別に書くとして、CSVファイルを読み込むときの高速なやり方を探してたらQueryTablesを使った方法というのがあったので、やってみた。

    Dim wb As Workbook
    Dim ws As Worksheet
    Set wb = Workbooks.Add
    Set ws = wb.Worksheets(1)
    With ws.QueryTables.Add(Connection:="text;mega.csv", Destination:=ws.Range("A1"))
        .Name = "megacsv"
        .TextFileCommaDelimiter = True
        .Refresh
    End With

すごかった。30万行一瞬。

Processing3 Javaで動かしてみる

Processingで作成したpdeファイルをJavaにしてみようと思ったが、うまくいかないので、基本的なところから少しずつ試していく。

Processing3を入れて、JRE1.8をいれて、Eclipse上でごねごね。
ネットで調べたとおり、setupのところにsizeメソッドを入れたら怒られて、しょうがないからsettingsメソッドをつくってそっちに入れたら、なんか足りん!と怒られて、こんな感じにしたら、とりあえず斜めに線は引けた。

package test;

import processing.core.PApplet;

public class Test extends PApplet {

	public void settings() {
		size(600, 600, JAVA2D);
	}
	public void setup() {
		background(200, 50, 60);
		smooth();
		strokeWeight(5);
	}

	public void draw() {
		line(0, 0, width, height);
	}

	public static void main(String _args[]) {
		PApplet.main(new String[] { test.Test.class.getName() });
	}
}

先は長そうだ。

確定申告完了!

日曜日に確定申告に行ってきた。
今回はいつもの医療費控除の他に株の配当の申告もしておこうと思ったのだが、初めてのことだったのでどこにどう入力すればよいのかわからず、結局今回もヘルプ付きの申請書作成コーナーで入力。

1年に1回のことなんで、ほんと、忘れるわ~~~と、情けないところだが、作成コーナーは前年よりだいぶんスムーズに行くようになっていたので、待ち時間もかなり短縮されていた。
(もう、みんな電子化するのね)

「配当まで申告するんですね?申告すると後で修正は無理ですよ?」とかいわれたから、配当とか売買利益とかを入れると納税額が大きくなるんだろうなぁ、と思いつつ、でも「きっちり納税しまっす!」と申告してしまった。
(ヘルプの皆さん、ありがとう。あなた方いないと、私は申告書もろくに書けませんでした。)

お国のために、勤労と納税は義務ですよ、はい。

SQLServer覚書 8桁数値を日付表示に

さて、最近くだらないことをまじめに書いているので、久しぶりに技術的なことを軽くメモ書きしておこう。

8桁数値を日付(yyyy/mm/dd)表示にする方法

SELECT CONVERT(varchar,CONVERT(datetime, CONVERT(varchar,20160223), 112),111)

1つ目(内側から)は文字列に変換、2つ目のCONVERTではDATETIME型に変換するので、出力としては「2016/02/23 0:00:00」というように日付と時間で出力される。
これを「yyyy/mm/dd」形式の文字列で出力させるために3つ目(一番外側)のCONVERTを用意。

これとは逆に日付を8桁数値に変える場合は、データを「yyyymmdd」の文字列で出力した後、INT(またはNUMERIC)型に変えてしまえばよい。

SELECT CONVERT(int,CONVERT(varchar, '2016-2-14', 112))

よろしいですか?

あなたの店の前はあなたの店ではありません。
あなたの店の前はあなたの店の待合室ではないし、喫煙室でもありません。
あなたの店の前はあなたの駐輪場ではありませんし、ましてや駐車場ではありません。

あなたの家の前はあなたたちの駐車場ではありません。
あなたの家の前はあなたたち家族の遊び場ではありません。

道は唾や煙を吐くところではありません。
道はゴミを捨てるところでもありません。

どうして自分の子供の前で吸わないたばこを赤の他人の前で吸うのでしょう?
どうして道路で喫煙して、他人の服や肺をいとも易々と汚すのでしょう?
どうしてゴミを放置したり、ポイ捨てしたりするのでしょう?
それらをきれいにするのはいったい誰なのでしょう?

あなたはペットを子供のようにかわいがりますが、その「子供」は人の家の前で糞尿をしています。
あなたの子供が「人」であるなら、そのようなことは許されるでしょうか?
片付けるからいいではないか?そういう問題ではありません。

これらはすべて意識の問題です。

道路は公共の場所です。
他人に迷惑をかける行為を故意にやる必要はありません。
家でやれることは家でやればよいのです。

家の中で唾を吐き、ポイ捨てすればよいのです。
家の中で煙を吐き、外に出さなければよいのです。
家の中で糞をして、トイレに流せばよいのです。

そう、他の人は関係ありません。

Excel印刷範囲指定+ウインドウ枠固定→チカチカ

印刷範囲指定をしてウィンドウ枠を固定すると、アクティブセルのある領域以外の図形がちらついて見える事象。
Excel2010でしか起きないらしい当該事象だが、さてどうしようかと考えると、結局は印刷範囲指定をやめる結論に至った。
解決作的には根治してもらわなければならないのだが、MSさんが重い腰をあげないので、
自分で腰を上げるとするなら、例えば、印刷ボタンを作って、ボタンを押したときだけ印刷範囲指定→印刷→印刷範囲クリアすればよいのかなぁと考えた。
でも、厳密に印刷設定を行う必要性がないのであれば、印刷の拡大率を設定しておくだけでも何とかなるような気もする。

ExcelVBA覚書 Shellとかリモート実行とか

忘れる前にメモっとく。
VBAからコマンド実行を非同期で行う時に使うShell関数。
第2引数にvbMinimizedNoFocusを設定すると、コマンドプロンプトは非表示になって、裏側で走る仕組みにできるそうな。

Dim cmd_buf As String
Dim res     As Double

cmd_buf = "cmd /c sqlcmd -S {DB-Source} -U {DB-UserId} -P {DB-UserPw} -d {DB-Name} " _
         & " -Q ""EXEC {プロシージャ名} {*}, '{*}' """ 
res = Shell(cmd_buf, vbMinimizedNoFocus)

{}書きは環境に合わせて変更
{*}はストアドの引数で、文字列の場合はシングルクォーテーションで囲む。

Shellの戻り値はタスクIDで、「0」がかえってきたら動いていないということらしい。
非同期なので勝手に動いて、勝手に終わる。

終わったらウィンドウをアクティブにするとかすると、終わったことがわかるらしい。

If res > 0 Then Call AppActivate(res)

と、こんな感じかね。
ふむふむ、しかしだね、裏側で勝手に動いているわけで、下手にPCシャットダウンしちゃうと、処理が途中で終わっちゃう!ってところが怖い。

で、次。
リモート環境にあるバッチファイルを実行する方法。

'server:リモートサーバ(user_id/user_pwでログイン)
'exe_name:実行ファイル, exe_position:実行ファイルのパス
Public Function ExecuteRemoteExe(server As String, user_id As String, user_pw As String _
                                , exe_name As String, exe_position As String) As Boolean

    Const AUTHENTICATION_LEVEL_PKT_PRIVACY = 6
    
    Dim obj_locator As Object
    Dim obj_server  As Object
    Dim obj_process As Object
    Dim res As Long
    Dim pid As Long
    
    On Error GoTo ErrExecute
    
    Set obj_locator = CreateObject("WbemScripting.SWbemLocator")
    Set obj_server = obj_locator.ConnectServer(server, "root\cimv2", user_id, user_pw)
    obj_server.Security_.authenticationLevel = AUTHENTICATION_LEVEL_PKT_PRIVACY
    
    Set obj_process = server.get("Win32_Process")
    res = obj_process.Create(exe_position, Null, Null, pid)

    Select Case res
        Case 0
            ExecuteRemoteExe = True
        Case 2
            Msgbox "アクセスできませんでした。"
        Case 9
            Msgbox "パスが正しくありません。" 
        Case 21
            Msgbox "パラメータが正しくありません。"
        Case Else
            Msgbox "バッチを実行できませんでした。"  
    End Select
        
ErrExecute:
    
    Set obj_process = Nothing
    Set obj_server = Nothing
    Set obj_locator = Nothing
    
End Function

これでリモートのバッチファイルを実行することができる。
できるんだけど、これもこっち側のPCを切ってしまうと、バッチも終わってしまう・・・
なんとかならんか。

ExcelVBA覚書 Resize

モノを整理するのにモノを買う・・・
という、断捨離しているはずなのにモノを増やす、愚かしいことをやってしまった。

いや、何にせよ、今のままじゃイカン!と、虚無感たっぷりに自分に活を入れつつ。

ExcelのRangeオブジェクトのメソッドにあるResize。起点セルと行列数を指定して範囲指定するのに使っているようだ。
こんなメソッドがあるとは全く知らなかったが、ネットサーフィンしてたらたまたま見つけたので試してみる。

参照サイト:Range,Cells」と「Resize」のセル範囲指定を比べてみる

パターン1:ごくごく一般的な範囲指定

With ThisWorkbook.Worksheets(1)
    .Range("C2:E4").Select
End With

パターン2:一般的なはずな範囲指定

With ThisWorkbook.Worksheets(1)
    .Range(.Cells(2, 3), .Cells(4, 5)).Select
End With

パターン3:「Resize使って同じことしてみるよ」な範囲指定

With ThisWorkbook.Worksheets(1)
    .Cells(2,3).Resize(3,3).Select
End With

パターン4:「Offset使って同じことしてみるよ」な範囲指定

With ThisWorkbook.Worksheets(1)
    .Range(.Cells(2,3),.Cells(2,3).Offset(3,3)).Select
End With

パターン1から4まで、すべて同じ範囲が指定される。(つまり、セルC2~E4)
なるほど、少なくともパターン4よりは、パターン3の方がきれいだ。
パターン2と3、どちらを使うかは、周辺のロジック次第。

なお、参照サイトには「Rangeが参照しているシートがアクティブになっていないとエラーになる」と書いてあるが、実はどのメソッドでも同じ。Selectメソッド自体、アクティブシート上にでないと動かないので、ResizeやOffsetとは関係がないと思う。