Archive for the ‘stenretni’ Category

git restoreとgit switch

金曜日, 10月 11th, 2019

stenretniです。散歩コースにコスモスがちらほら伸びてきました。

最近見つけたものです。

*

10月下旬にCentOS 8が発表されました。

5月に発表されたRed Hat Enterprise Linux 8に追随したものです。

同時に、CentOS Streamという新しいディストリビューションが発表されました。

安定志向のCentOSでローリングリリース版という話だけ聞くとなんだか噛み合わないように思えますが、どちらかというと”次期RHELの開発をオープンにしたβ版”という説明のほうが近いようです。

(アップデートの流れからいうと Fedora -> CentOS Stream -> RHEL -> CentOS の順番)

Fedoraよりは遅くCentOSよりは早い更新頻度になると考えると、趣味サーバにはちょうどよいものになるのではないかと思います。

*

8月、バージョン管理システムのGitにバージョン2.23git switchgit restoreの2コマンドが追加されました。

それぞれ、Subversionでいう svn switch(ブランチの切り替え)とsvn revert(手元のファイル変更を元に戻す)にあたります。

もともとGitにはcheckoutというこのふたつを合わせたようなコマンドがひとつあるだけだったのですが、分割したほうが初心者にはわかりやすいだろうということで導入されたそうです。人に説明がしやすくなって有り難いです。

既存のインタフェース:

追加されたインタフェース:

リンク

文字列のSUM

日曜日, 3月 17th, 2019

stenretniです。近所の梅の花が散って実が生りはじめました。

SQLで値を加工するとき、加工後の値を加工元のレコードと並べてにらめっこしたい事がときどきあります。GROUP BYが多いアプリなどで、DBの値が10000行ほどあるときなど、処理の粒度がうまくいっていることというのがぱっと見よくわかりません。考えた末、プライマリキーをグループ別に束ねて小分けして対照することにしました。

行をGROUP BYすると普通IDの類はなくなってしまうものですが、カラム一つに文字列を押し込んでしまえば一行になり、資料をまとめたりデータを眺めるために多少扱いやすくなります。ただ、ちょうどいい粒度でプライマリキーを束ねるという作業を手で10000行ぶんやるのは容易でありません。

この作業でほしいのは、文字列用のSUMです。

2016年版のSQL標準でLISTAGGという集計関数があるそうなのですが、まともに実装しているDBは今の所あまりないようです。ただ、似たような機能はそれぞれ持っています。

PostgreSQL

PostgreSQL 9.0では、STRING_AGGという名前です。

  SELECT
    STRING_AGG(foo, ',')
  FROM
    (SELECT 'fuga' UNION ALL SELECT 'moga') t (foo)

上のようにすると'fuga,moga'という文字列が一行だけ返ってきます。

MySQL

MySQLではGROUP_CONCATがあります。

  SELECT
    GROUP_CONCAT(foo SEPARATOR ',')
FROM
  (SELECT 'fuga' AS FOO UNION ALL SELECT 'moga' AS FOO) t

Oracle

Oracleでこれに相当する関数はWM_CONCATLIST_AGGがあります。

ただ、自分の使っているOracle(10g)では未実装だったり、varcharの上限(4000文字)にぶつかったりでうまくいきませんでした。プロシージャを自作せずにすます方法を探した末、次のような代替を見つけました。

  SELECT
    XMLAGG(XMLCDATA(hoge)).getClobVal()
  FROM
    (SELECT 'fuga' hoge FROM DUAL UNION ALL SELECT 'moga' hoge FROM DUAL) t;

この文は <![CDATA[fuga]]><![CDATA[moga]]> という文字列だけの結果1行を返します。使っているXMLAGGというのはXML集計というOracle特有の機能です。OracleにはXMLノードを集計するという機能があり、それを経由すると文字列にまとめて結果を取っています。

結果はXMLタグで返るので、見やすくするにはもう少しreplaceなどして手を加える必要があります。自分の場合はその後テキストエディタの置換でやっつけました。

リンク:


ほか、最近の個人的なニュースです。

冷凍庫の霜落とし

月曜日, 10月 1st, 2018

stenretniです。8月の末、給湯室の冷凍庫の霜を取るため、電源を抜いて帰りました。

その翌日見てみたところ、溶けずにそのまま残っていましたので、スプーンをへら代わりにしてつついて落としました。霜の層が固まって、氷塊になっていました。

流しに取り出した様子です。

今日(霜を落とした日から1ヶ月になります)の様子です。

先月のときは容積が半分ほどになったのでやむをえず崩しましたが、あまりにも順調に霜が成長するので、もう少しとっておくか今すぐ落とすかちょっと迷っています。

TortoiseSVN 1.10.0とWindowsのセキュリティ保護機構

日曜日, 7月 22nd, 2018

stenretniです。最近洗面所で蛇口をひねるとほかほかのお湯が出てきます(湯沸かし器ではなく、天日です)。

2018年4月、一年ぶりにSubversionの新しいバージョン(1.10.0)が出て、それにあわせてTortoiseSVNも更新されました。

本体の新機能としてはフォルダツリーのマージアルゴリズムの改良や、シェルフ(コミット前の変更を退避)がありますが、個人的にはTortoiseSVNのダイアログを開く速度が遅い問題が直ったことが一番嬉しいです。stenretniは差分をなんとなく見ることが多いので、他のツールを使うことでお茶を濁していたのですが、使い慣れているTortoiseMergeにこれで戻れました。

この問題は、Windows10の1709 Fall Creators Updateの際に入ったセキュリティ保護の機構がTortoiseSVNの描画方式とかちあったためのものだそうです。(Microsoft開発者フォーラムの記事参照)

リボンツールバー

TortoiseSVNは元々、MFCのリボンツールバーのコントロールを使っていました。このコントロールは内部でGDIのGetPixel/SetPixelを多用します。Windowsに入った保護機構のうちにピクセル単位の読み書きを遅延するものがあり、その仕組みが暴発した結果ダイアログが開くのが遅くなったそうです。

TortoiseSVNの側で2017年11月、ツールバーの実装をネイティブに乗り換えるという形で対策が入りました。ただこちらはSubversion本家のバージョンアップまでリリースを待ったため、正式版での修正の発表は冒頭のとおり4月になりました。その前にWindowsの2018年1月のパッチでその暴発は修正されたのですが、このアップデートがベータテストを経て全ユーザに降るまでには間がありました。stenretniの手元では、TortoiseSVNの更新のほうがWindowsのパッチが振ってくるより先でしたが、逆の人もいたと思います。

上の経緯を忘れてユーザから結果だけを見ると、TortoiseSVNで最近ダイアログが開くのが遅いのがなんか待っていたら直った、というだけなのですが、追いかけてみるとTortoiseSVNの開発者の方たちの苦労が感じられました。

リンク

PowerShellでキー入力の自動化

月曜日, 4月 3rd, 2017

stenretniです。インフルエンザと花粉症でなかなかマスクをはずすタイミングがつかめません。

stenretniはAutoHotkeyなどでキー入力を自動化するのが好きなのですが、触るPC全てにこのソフトを入れるわけにもいきません。Windows標準での手段をここ数年探していたのですが、最近PowerShellから.NETのメソッドが一通り呼びだせることに気がつきました。.NETにはSendKeysという人間と同様のキー入力をしてくれる命令があるので、これを使えば(少なくともWindows 7なら)ダブルクリックをするとキーボード入力が走るバッチが書けます。

以下はメモ帳を使った例です。

@powershell -NoProfile -ExecutionPolicy Unrestricted "&([ScriptBlock]::Create((cat -encoding utf8 \"%~f0\" | ? {$_.ReadCount -gt 2}) -join \"`n\"))" %*
@exit /b
# ↑ PowerShellスクリプトをbatにラッピングするためのおまじない

# SendKeysを使えるようにする
add-type -AssemblyName System.Windows.Forms

# 前面にあるウィンドウにキーボード入力を送る
function send([string]$key)
{
  [System.Windows.Forms.SendKeys]::SendWait($key)
  sleep 0.5
}

start notepad
sleep 1
send "Hello, world!"

実用するには、キー入力が望むウィンドウに送られることが大事です。そのため、ウィンドウを切り替えたりウィンドウが切り替わるのを待機したりしたいことがあります。これにはVisualBasicのAppActivate命令が使えます。

(他にもMicrosoft.VisualBasic.Interactionには便利そうなメソッドがいくつかあります)

add-type -AssemblyName Microsoft.VisualBasic

# 指定のタイトルのウィンドウを探して、前面に持ってくる
function activate_window([string]$title)
{
  [Microsoft.VisualBasic.Interaction]::AppActivate($title)
}

# 指定のプロセス名のタイトルを取得
function get_process_window_title([string]$process_name)
{
  return [string](Get-Process $process_name | select MainWindowTitle)
}

# 指定のプロセス名のタイトルに指定の文字列が含まれるか調べる
function title_contains([string]$process_name, [string]$title)
{
  $got = get_process_window_title($process_name)
  return ([bool]$got) -and $got.Contains($title)
}

# 指定のプロセスのメインウィンドウのタイトルが指定のものになるまで待つ
function wait_while_window([string]$process_name, [string]$title)
{
  while (title_contains($process_name, $title))
  {
    sleep 0.25
  }
}

# 指定のプロセスのメインウィンドウのタイトルが指定のものでなくなるのを待つ
function wait_until_window([string]$process_name, [string]$title)
{
  while (!(title_contains($process_name, $title)))
  {
    sleep 0.25
  }
}

PlantUMLというツールのこと

水曜日, 10月 26th, 2016

stenretniです。
本社前のイチョウはまだ緑色をしていますが、ちょっとしおれてきた気がします。

いちょう

フリーで使いやすいUML図を書くツールをずっと探していたのですが、鉛筆と紙を超えるものがなかなかありませんでした。最近はPlantUMLというツールがとても自分好みのインターフェイスで気に入っており、愛用しています。メモ帳で書いたファイルを読ませると、SVGやPNGといった画像が出力されます。日本語にも対応しており、文法リファレンスも翻訳されています。とっかかりでは紙に優るものはありませんが、自分の場合はあとから見返すとき字が判読できるというのがよいところです。

コンポーネント図の例です。

plantuml

@startuml

left to right direction

node foo {
    component a
    component b
    component c
    node bar {
        component d
        component e
        component f
    }
    node baz {
        component g
        component h
    }
    component i
}

cloud hoge {
    component j
    component k
    component l
}

d --> h : "依存"
d --> e : "依存"
a --> d : "依存"
a --> h : "依存"
a --> b : "依存"
a --> c : "依存"
a --> e : "依存"
a --> i : "依存"
a --> f : "依存"
a --> g : "依存"
l --> g : "依存"
j --> c : "依存"
i --> d : "依存"
f --> h : "依存"

@enduml

その他、最近見つけたものです。

  • Windowsのイベントビューアはフィルタやソートの反応が悪く扱いづらいのですが、.evtxファイルに保存すればPowerShellでCSVに変換できるということを最近知りました。一旦CSVにしてしまえばあとは煮るなり焼くなりできます。

    Get-WinEvent -Path hoge.evtx | Export-Csv -encoding Default -notypeinformation -path hoge.csv

    イベントを扱うコマンドにはGet-EventLogGet-WinEventの二つがありますが、後発の後者のほうが読み取れるイベントが多いそうです。

  • Delphi(とC++Builder)の無料版が復活したそうです。6の頃からC#に対抗してだいぶ機能が増えていると思うので、一度触ってみたいです。

Windows 10更新後落ちた落とし穴

月曜日, 7月 4th, 2016

stenretniです。帰り道カニを見かけました。

kani

先週大分本社と東京支社の若手スタッフの間で、発表会というかたちで顔を合わせてお互いに業務の様子を共有しました。メールの連絡だけでは読み取れなかった事情や知らなかった専門用語の解説などが聞けて、とても楽しかったです。皆さんありがとうございました。

最近開発機をWindows 10にアップデートしました。

3時間ほどは機嫌よく動いていたのですが、それから奇妙な現象が起きました。解像度を変更するときのように、画面がゆっくり明滅を繰り返すのです。これではまともに操作できないと再起動した所、今度はログイン画面が表示されなくなりました。

開発機にはグラフィックボードが入っているので、原因はそのドライバの関係だろうと考えました。他の端末で調べてみたところ、Windows 10では再起動せずに適用できる更新は確認なくその場でインストールされるようです (たとえそれが不具合のあるグラフィックドライバでも…)。

ドライバのアンインストールならセーフモードの出番ですが、ここでもうひとつ落とし穴に落ちました。Windows 8以降、F8キーを押してセーフモードに入ることはできません。設定でF8を有効にすることはできますが、そのためにはまずWindowsを正常に起動する必要があります。

F8キーを有効にしておらず、リカバリメディアを作ってもいないマシンでセーフモードに入る方法は、ブート中電源断を3度繰り返すという、ちょっと心臓に悪いものでした。

セーフモードに入ることは出来ましたが、そちらも同様の画面の明滅が起きて入れませんでしたので、回復環境のメニューにあった再インストールボタンを押しました。

再インストール後は、ふたたび不具合入りのドライバがインストールされてしまうのを防ぐため、ドライバをWindows Updateから受信しない設定に急いで切り替えました。(あとから考えると、ネットワークを切っておけば急ぐ必要はなかったと思います)

その後は比較的安定しています。Win+TabでMacのような仮想デスクトップが使えるようになったのが嬉しいです。

Chromeがテキストエディタとして便利

日曜日, 3月 6th, 2016

stenretniです。先月庭の梅が咲きました。

梅

最近、ChromeやFirefoxの開発者ツール付属のテキストエディタがマルチカーソルに対応していることに気がつきました。

まず、Chromeをテキストエディタとして使うまでの手順です。

  1. F12キーを押して開発者ツールを開きます
  2. Sourcesタブを押してソースエディタを開きます
  3. エクスプローラから開発者ツールにフォルダをドラッグします
  4. 許可のボタンを押します
  5. 左のファイル一覧にフォルダが現れます

一度ここまですませておけば、ファイル一覧に加わったフォルダはそのまま残るので、その後はF12からすぐ使えます。

ブラウザにドッキングしたままだとちょっと狭いので、右上の「・・・」からウィンドウに分離することをおすすめします。

ファイルを開く(Ctrl+P)と、そのマルチカーソルを使って編集ができます。

  • Ctrl+Dを繰り返し押すと、ファイル内の同一の単語を選択できます。
  • Ctrlを押しながら左クリックすると、クリックしたところにカーソルが増えます。
  • Altを押しながら上下にドラッグすると、ドラッグしたところにカーソルが増えます。

マルチカーソルの操作感は言葉で説明しづらいので、Visual Studio CodeのページSublime TextのトップページのアニメーションFirefoxの開発者ブログの記事をご覧ください。(それも面倒な方のためにgifを引用しておきます↓)

editor-multiple-selection

テキスト置換でも同じことができますが、マルチカーソルは正規表現に頭をひねる必要がなく気楽に使えます(形に残らないのでスクリプトで再利用しにくいのが玉に瑕ですが)。

インデックスを使え、ルーク

月曜日, 11月 30th, 2015

ブログに初参加のstenretniです。先日ベランダに三毛猫が来たのでいりこをやりました。

mike

今月見つけたものです。

  • Use the Index, Luke というSQLの初心者向けサイトを見つけました。説明が具体的で有難いです。
  • HeidiSQL というSQLサーバの管理ツールが軽くてよかったです。
    サイトのスクリーンショットと違って、使ってみると日本語に対応していました。
  • 最近Rebuild.fmというPodcastを古い収録から順に追っています。
    ゲストもホストもプログラマばかりなので話題が濃ゆくて楽しいです。
  • Selenium(セレニウム)という、ブラウザを自動操作できるツールを使ってデバッグの楽ができないかと思って試していました。
    公式サイトの物はいまいちうまく動かなかったのですが、Selenium Builder というFirefoxプラグインを見つけてからぐっと実用になりました。
    単独でブラウザの操作を記録して再生できたり、Javaコードなどの形でエクスポートできます。エクスポートされたコードはFirefox以外のブラウザを動かすこともできます。

追記: コメントありがとうございます。過去ログを読みかえしていたら、SQLのサイトはmoshaさんも紹介されていました。stenretniも含めて、少なくとも4人には興味を持たれているようですね。日本語化されていない分も面白いので、読み進めながらときどきブログに抜き書きしていきたいと思います。