Oracle のダンプファイルから、インポートせずに SQL のみを抽出する

imp ユーティリティーの SHOW=Y オプションを使うとインポートは行わず、インポート時に発行される SQL のみが標準エラー出力に出力される。

imp システムユーザ名/パスワード file=ダンプファイル名 fromuser=(エクスポート時のユーザ) touser=(インポート先ユーザ) rows=N show=y 2>the.sql

ただし、これだと、次のように SQL の途中に勝手に改行が入り、かつ前後に二重引用符が補われてしまう。

. BBBBBBのオブジェクトをBBBBBBにインポートしています
 "BEGIN  "
 "sys.dbms_logrep_imp.instantiate_schema(schema_name=>SYS_CONTEXT('USERENV','"
 "CURRENT_SCHEMA'), export_db_name=>'BBBBBB.WORLD', inst_scn=>'199195734');"
 "COMMIT; END;"

これでは使えないので、

  • 前後の二重引用符を取り除く
  • シングルクォートで囲まれた文字列が複数行に分かれてしまっている場合は一行に結合する

といったことを行う Perl スクリプトを用意した。 (PerlOracle に標準でついてくる)

use strict;
use warnings;

my $stock="";
my $last="";

while ( <> ){
    chomp;
    if ( /^ "(.*)"$/ ){
        $stock .= $1;
        my $q = 0; $q++ while $stock =~ /'/g;
        if ( $q % 2 == 0 ){
            if ( $stock =~ /^\s*ALTER/ || $stock =~ /^\s*CREATE/ ){
                print ";" if $last !~ /;\s*$/;
                print "\n\n";
            }
            print $stock;
            $last = $stock;
            $stock = "";
        }
    }
}
if ( $stock ne "" ){
    print $stock,"\n";
}

(修正:最初文字のカウントに split を使っていたが、while m/~/g を使うよう修正した)

perl.exe log2sql.pl the.sql > new.sql を実行すると、

次のように出力される。

BEGIN  
sys.dbms_logrep_imp.instantiate_schema(schema_name=>SYS_CONTEXT('USERENV','CURRENT_SCHEMA'), export_db_name=>'BBBBBB.WORLD', inst_scn=>'199195734');
COMMIT; END;

WindowsTerminal で起動時にフォントエラー

別に設定を変えたわけでもないのに発生する。アプリケーションが自動更新した時によく起きる。

Windows の「設定」→「アプリ」→「アプリと機能」→「ターミナル」→「詳細オプション」より「修復」(アプリのデータが消えない方の選択肢)を選ぶと直る。

続・GitHub のアカウントの名前を変更したら起きること 〈AppVeyor編〉

  • GitHub のアカウントの名前を変更したら起きること - 標準愚痴出力

  • AppVeyor ログインできなくなってる。GitHub のアカウントを変えたせいか?メールアドレスはすでに使われているみたいに言われる

  • GitHub のアカウント名を変えたらログインできなかった件、Appveyor のサポートに「どないしたらええんでっしゃろ (What should I do)」的な英語メール送ってみた。通じるかな?(相手してもらえるかな?)

  • GitHub のアカウントを変えたら AppVeyor にログインできなくなった件、AppVeyor 上でパスワードリセットすればよいと教えてもらった(GitHub の OAuth でしかログインしてなかったので、パスワード未設定だったんだが、それでも使えたのか!)。うまくいった。Appveyor の中のひと、ありがとう

Gitレポジトリを初期化+アルファをするサブコマンドを書いた

git-xxx という名前の実行ファイルを %PATH% の中に書いておくと git xxx いう風に git のサブコマンドとして呼び出すことが出来る。Windows の場合は、拡張子の解釈の都合でバッチファイルは使えないが、そのかわり git付属のbashスクリプトが使える。

で、レポジトリを初期化するサブコマンドを書いた。やることは

  • git init
  • git config --local でユーザ名とメールアドレスを登録
    • レポジトリによって私用と会社用のメールアドレスを変える場合があるので、git config --global は使わない
    • メールアドレスは第一引数で指定する
  • LF↔CRLF 変換を禁止したいので、全部のファイルはバイナリ扱いにする

ファイル名は拡張子なしで git-new

#!/bin/bash

if [ -z "$1" ] ; then
    echo Usage: git new EMAIL-ADDRESS
    exit 1
fi

if [ ! -e .git ] ; then
    git init
fi

git config --local user.email "$1"
git config --local core.quotepath false
git config --local user.name HAYAMA_Kaoru

if [ ! -e .gitattributes ] ; then
    echo "* -text" > .gitattributes
    git add .gitattributes 
    git commit -m "Add .gitattributes as autocrlf=false"
fi

GitHub のアカウントの名前を変更したら起きること

こちらの記事のリポートが参考になるが、それでもいろいろと想定外のことがあったので、記しておきたい。

正直失敗はしたくなかったので、それなりに備えた上で実施に踏み切った。だが白状すると、やはり想定外の問題もあったことはあった。

当初の方針

  • OAuth で連携しているところについて、ログイン手段が失われないようにする(事前に調査)
  • 旧アカウント名は誰かに取られてややこしいことになるのは嫌なので、同名の organization を作って、占有しておく。
    • とはいえ、空っぽの organization も寂しいので、Starをたくさんいただいている一部のレポジトリと archived なレポジトリは organization へ移しておく(→ この目論見はうまくゆかなかった)

事前準備:OAuth 連携先の切り替え

別に転職するつもりとかはなかったけれども、客観的な評価がほしいなと思って、いくつかの転職サービスに登録していた。これらは OAuth で GitHub でログインしているものもある。

どこへ登録していたかはほとんど忘れていたが、GitHub の方から調べることができる。Setting → Apprications → Authorized OAuth Apps で一覧できる。

これらの対応だが

  • GitHub の OAuth 以外(メールアドレス・別の OAuth)の手段でログインできるものは、そちらでログインできるようにしておく
  • GitHub でしかログインできないものは、個別に確認

でいく方針を立てた。結果、ほとんどのサービスは別のログイン方法を用意していたので、そちらでログインを出来るよう設定・確認した。

唯一の例外は Findyで、このサービスは GitHub でしかログインできない。で、問い合わせフォームから聞いてみたところ『アカウント名を変えてもログインは可能、ただしログインした後「再連携」が必要なので、プロフィールのアカウント設定画面で再連携のボタンを押せばよい』とのこと(ご回答ありがとうございました

で、アカウント名変更を

Settings → Account → Change username → …

やっちまった!

プロフィールレポジトリの変更

プロフィールレポジトリは、アカウント名と同じレポジトリなので、移行後は対応付けが外れてしまう。これは単純に GitHub の設定からレポジトリ名を新しいアカウント名と同じものに変えるだけでよい。

それプラス、readme.md の中の URL の書き換えだ。だが、それを行うには git push をしなくてはいけない。

ローカルレポジトリの remote の URL を変更する

全てのレポジトリでいちいち Git コマンドを発行してられないので、半自動化するためこういうバッチファイルを作った

@echo off
for /F %%I in ('git remote show') do set "REMOTE=%%I"
for /F "tokens=3" %%I in ('git remote show -n %REMOTE% ^| findstr Push') do set "URL=%%I"

set "URL=%URL:zetamatta=hymkor%"

@echo on
git remote remove "%REMOTE%"
git remote add "%REMOTE%" "%URL%"

レポジトリのあるディレクトリをカレントディレクトリにして実行すると、リモートレポジトリの URL が新アカウント名のものに書き換えられる。

OAuth 先はどうなったか

アカウント変更後に Findy にアクセスしてみたところ、前回ログアウトしていなかったので、普通に大丈夫だった (まぁ、確かに普通そうだわな。でも、頭で分かっていても、プログラマなので逆に心配なのよ。すべてのサービスが合理的に設計されているとは限らないので)

他、zenn と Paiza にもアクセスしたが、特に問題なし。ここまで問題がないと面倒臭くなって全部調べるのをやめた…

そして予想外のこと

旧アカウントと同じ名前の organization を作ることは出来たが、そこへレポジトリを移せない。

Setting → Transfer Owership から organization への移譲を実行しようとしても、

Repository name zetamatta/expect has been retired and cannot be reused

というエラーで却下されてしまう。理由は何となく察していて「なりすまし」防止のためなのだろう。 とはいえ、一応、公式ドキュメントらしき

というページにこういう記述があるから大丈夫と思ったんだがなぁ。

f:id:zetamatta:20220202180352p:plain

おそらく、これ記述が古いんだろうな!たぶん本来削除されるべきものが見えるところに出てしまっていた、もしくは過去バージョンなのかもしれない。URLもやたら長いし。


ググってみると、こういうケースの場合 GitHub のサポートに連絡して、「なりすまし」でないと説明できれば、制限を外してもらえるようだ。でも、そこまでする必要あるかなぁ

  • 古いアカウント名の URL へのアクセスは新アカウント名へ自動的にリダイレクトしてくれるので、アプリケーション・ライブラリユーザへの配慮という点では、それほど必要ではない
  • もっともメジャーなレポジトリについては、すでに別の organization に移譲済み。
  • そもそも古い URL を維持したいと思った理由は、単に「旧アカウントを別の人間にとられないように作成した organization が空っぽなのは寂しい」といった、あまり合理的な理由ではない(そして、いずれは新アカウントにまた戻すことも考えていた)

以上を鑑みれば、無理に移譲する必要もないな!(ということで、すっぱりあきらめた)

その後

まぁ、アカウント名を変える前は「今後、ずっとモヤモヤした気持ちを抱いてゆくなら、思い切って気持ちよく変えた方がいいだろう」と思っていたが、実際変えてみると何ともいえない「やっちまった」感が湧いてきてしまった。なんといっても10年ほど使ってきたアカウント名だしなぁ。

とはいえ、ブロックされまくりの汚れ twitter アカウントと別の名前にすることにより、これで表の世界でレポジトリをアピールできるようになったと思うと、やはり正解だったのだろう(と思いたい)

(メモ)常時起動させておく PC 向け設定

毎朝6時に定期リブート

  1. Windows + R → taskschd.msc
  2. 「タスクの作成」
  3. 全般 → 名前「定期リブート」、「ユーザがログインしているかどうかにかかわらず実行する(W)」にチェック
  4. トリガー → 新規 → 「毎日6時に起動」
  5. 操作 → プログラム:C:\Windows\System32\shutdown.exe、オプション /r

f:id:zetamatta:20220117001209p:plain

うっかりシャットダウン防止

  1. Windows+R
  2. 「gpedit.msc」(ローカルグループポリシーエディター)
  3. 「管理用テンプレート」
  4. 「タスクバーとスタートメニュー」
  5. 「シャットダウン、再起動、スリープ、休止コマンドを削除して、アクセスできないようにする」
  6. 「有効」のラジオボタンにチェックを入れて、[OK]を押下

WindowsTerminal の wt.exe が動かない

後々のためにメモ

環境 Status WindowsTerminal OS
私用PC OK 1.8.1521.0 10.0.19043.1052
会社PC-1 NG 1.8.1521.0 10.0.19042.1052
会社PC-2 NG 1.8.1521.0 10.0.19042.1052

会社PC では

  • Windows+R からの wt.exe ならば WindowsTerminal が起動する
  • CMD.EXE からの start wt.exe だと次のようなエラーダイアログが出る

f:id:zetamatta:20210618204948p:plain

私用PC では、Windows+R でも、start wt.exe でも、どちらでも WindowsTerminal が起動できる。

うむ、なんでじゃろね

レジストリを確認

OK環境

  • キー
    • コンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\wt.exe
  • 値:
    • C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_1.8.1521.0_x64__8wekyb3d8bbwe

同パスに実際に wt.exe が存在した

NG環境

  • キー
    • コンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\wt.exe
    • C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_1.7.1033.0_x64__8wekyb3d8bbwe

1.7 のフォルダーは存在しない。1.8 のフォルダーなら存在する。

そっかーーー

いろいろググってみたところ

%LOCALAPPDATA%\Microsoft\WindowsApps には必ず wt.exe がある模様。

ファイルサイズは 0 バイトなので、おそらくはこれもエイリアスであろうと思われるが、こちらは OK 環境・NG 環境でも動作する。これでなんとかするかー