2021年12月25日土曜日

SVNからGitへの変換

こちらはsvn-gitを用いると簡単。このコマンドはsvn+sshプロトコルで使えるので、手元の計算機にsvn-gitをインストールできれば使える。macのbrewで入れた。
git svn clone svn+ssh://cvs.apgrid.org/grid/svnroot/sss -T trunk -b branches -t tags
こんな感じ。ただうまく行かない場合もある。切り分けができていない。

CSVからGitへの変換

CSVレポジトリからgitレポジトリへの変換。多分もう使うことがないであろうけど一応残しておこう。 csv2svnというツールを使う。なまえからわかるように本来はsvnに変換するツールなのだけど、svnだけでなくgitへも変換してくれるのだけど、使い方がわからん。。ドキュメントへのリンクが切れている。 このスクリプトを見たらなんとなくわかった。
#!/bin/bash -x
TARGET=$1
mkdir ./$TARGET.git
cd ./$TARGET.git
git init
../../cvs2svn/cvs2git /grid/cvsroot/$TARGET | git fast-import
git checkout 
このツール自体がpython 2系で書かれているので寿命がつきかけている。CSVを放置していたほうがわるいのだけど。。

2021年11月5日金曜日

Rustでdev 時にだけ出す出力

デバッグ時にだけ出力を出すようにしたい。Cでなら
#ifdef TEST
#endif
..
gcc -DTEST xxx.c
とやっていたようなやつ。

Rustにはデフォルトで幾つかプロファイルがあり、普通にコンパイルするとdevで コンパイルされ、--releaseをつけるとreleaseでコンパイルされる。

さらにもともとdebug_assertionsというコンパイルフラグ?が用意されているので これを使うと良さそう。もともとは同名のアサートマクロのON/OFFに使うもの。

#[cfg(debug_assertions)] println!("xxxx"); 
と書いておくと、releaseでは実行され、devでは実行されない。 このcfgの中に書いた文字列は、スペルミスしていても何も警告が出ないので要注意。

ちなみにこのあたりはCargo.tomlで設定できる。下のようにすると、releaseモードでも 出力されるようになる。こちらはハイフンで、cfgの中身はアンダースコアなのが 大変にはまりそう。。こちらもエラーでないし。

[profile.release]
debug-assertions = true

2021年5月26日水曜日

bibtex で人数が多いときに自動的に et al. にする

このページによくまとまっている。 このなぞ言語はスタック施行の言語で、仕様は ここに書かれている。
's := 
で 変数sにスタックトップの値を取り出す。
条件
ブロック1
ブロック2
$if
で、条件が1になるときにはブロック1を、それ以外のときにブロック2を実行する。。らしい。 上のページに書かれている通りの変更はSpringerのbstファイルではうまく行かなかったので、若干修正。どうも呼び出されたときのスタックの状態の前提が違う?そんなことがあるだろうか。
FUNCTION {format.names}
{ 'bibinfo :=
  duplicate$ empty$ 'skip$ {
  's :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
  numnames #3 >
  {
  #2 'namesleft :=
    { namesleft #0 > }
    { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't :=
      nameptr #1 >
          { namesleft #1 >
            { ", " * t * }
            { " {\it et~al}." * }
          if$
        }
        't  
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
  }
  {
    { namesleft #0 > }
    { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't :=
      nameptr #1 >
      { namesleft #1 >
          { ", " * t * }
          { numnames #1 >
            { "" * }
            'skip$
          if$
          t "others" =
            { " et~al." * }
            { ", " * t * }
          if$
          }
        if$
        }
        't  
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
  }
  if$
  }
  if$
}

2021年5月19日水曜日

S3+Cloud Frontで HTTPSサイトを運用

ググれば佃煮にするほど色々でてくるので、私が引っかかったところだけメモ
  • ACMで証明書を作るときには N.Virginiaでつくること。なぜこんな制約があるのか全くわからないが。。
  • フォルダ名で index.html が返されるようにするには、このページに書かれているように、CloudFrontのディストリビューションのOrigin Domain Name を省略形(S3.AWSみたいなやつ)ではなく、リージョン名入りの長い名前にする必要がある。
とりあえずできてよかったが無駄に消耗した。。github.io使ったほうが絶対楽だったな。

djangoのtemplateをスタンドアロンで使う際にfilterを登録する方法

11年前にもやっている のだが、この方法ではいつの間にか動かなくなっていたので、ソースを読んで対策を講じてみた。 Engineというものを作ってやって、そのbuildinsに追加すれば良いらしい。
from django.template.engine import Engine
engine = Engine.get_default()
engine.template_builtins.append(register)
そして、Engineを指定して、Templateを作る。
Template(templateStr, engine=engine).render(Context(d0))
うむ、面倒だ。APIで公開されている方法でもないので、いつ変わるかわからないし。。もっと使いやすいテンプレートエンジンに移行すべきなのか。 コードの全体。
import os
os.environ["DJANGO_SETTINGS_MODULE"]="djangoSettings"
from django.template import Template, Context
from django import template
import django

register = template.Library()

@register.filter
def texEscape(value):
   return value.replace("&", "\\&")
   
   
templateStr="""{% autoescape off %} {{ item|texEscape }}{% endautoescape %}"""
d0 ={"item":"&teststring"}


from django.template.engine import Engine
engine = Engine.get_default()
engine.template_builtins.append(register)

Template(templateStr, engine=engine).render(Context(d0))
結果は
' \\&teststring'

2021年5月15日土曜日

brew でinstall したappをspotlight 検索できるようにする

brewでapp形式のアプリをインストールすると/opt/homebrew 以下にバイナリができるようだ。これをApplication からsymbolic linkしておけばlauncherからは起動できるのだが、spotlight検索に引っかからない。私は常にspotlightから起動するので、大変不便。 調べてみたところ、Aliasなるものを作成して、それを/Applicationにコピーすれば良いことがわかった。XXX.appのあるフォルダをfinderで開いて、右クリックから[Make Alias]とする。するとXXX alias というエイリアスができるので、これを/Applicationに持っていって名前を変える。 aliasは、ファイルシステム的には普通のファイルのように見える。シンボリックリンクとほぼ同じことをやっているように見えるが、なぜこんなのが必要なのだろうか。OS 9時代からの遺物?

2021年4月29日木曜日

Mac のEmacsの整備

いつからかescやc-s, c-rでimeが英語モードに戻らなくなってしまって、非常に使いにくくなっていたのを なんとか解決。
  • ESC はメタのプレフィックスとして手癖で使ってしまう。これは、karabinar-element で解決 ESC to ABCというのを入れた。
  • サーチの方は下のように、キーバインドを置き換える関数を作って解決。 もっといい方法はありそうだけど、とりあえず、これで使ってみよう。
    (defun insert_revert (key)
      (setq v (lookup-key (current-global-map) key))
      (global-set-key key (lambda ()
    			(interactive)
    			(mac-select-input-source "com.apple.keylayout.ABC")
    			(funcall v))))
    (insert_revert "\C-s")
    (insert_revert "\C-r")
    
  • 2021年3月26日金曜日

    gnupgの共有暗号化を簡単な感じでつかう

    カジュアルに暗号化をつかう。
    % echo "to be encrypted" | gpg -c | base64
    jA0EBwMCEtjToibU+8/o0kUBCb+uV9LvpwbT3vgF0AHb5hDoRhzbAadsGrgGSbW8uiqPOh2xc7EDRfKQmtNtM9e4f2xTu3AaGTystWDTx68FsSCff0Q=
    
    % echo jA0EBwMCEtjToibU+8/o0kUBCb+uV9LvpwbT3v... | base64 -d | gpg -d -q -o -
    to be encrypted
    
    という感じ。

    2021年3月4日木曜日

    jupyter notebook から pythonコードへ変換

    jupyter notebookで開発したものをpythonコードに変換する方法。 jupyter nbconvert というコマンドを使う。これは万能ツールでPDFなどにも変換できる。

    このコマンドを外部コマンドとして実行するのは何かと不便なので、セルから実行するとよい。 その際、普通に書いておくと、変換コマンド自信が変換されたpython コードに入ってしまう。 そこで、下のようにオプションをつける。すると、#exclude_from_py というコメントが入ったセルは 変換されたものから削除される。で、変換するセル自体にもこのコメントをつけておけばいい。

    #exclude_from_py  
    !jupyter nbconvert --RegexRemovePreprocessor.patterns="['#exclude_from_py']"  --to script XXXX.ipynb
    

    2021年1月4日月曜日

    python で空きポートを探す

    localhostで接続待ちできる空いているポートを探す。 要するに、serverportを作ってみて成功したらクローズして返すだけ。
    import socketserver
    
    def find_vacant_port(port_base, trial_count):
        """find vacant port for forwarding, 
        starts with port_base and test at most trial_count ports.
        if it cannot find, it raise OSError"""
        for i in range(trial_count):
            try:
                ss = socketserver.TCPServer(('127.0.0.1', port_base + i), None)
                # found one
                ss.server_close()
                return port_base + i
            except OSError:
                pass
        raise OSError("cannot find vacant port")