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