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