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時代からの遺物?