yamaken1343’s blog

技術ブログもどき

研究室内で業績をアーカイブするOSSをつくった

まえがき

出した論文とか発表した学会とかの管理ってどうやってるんでしょうね.

以前所属していた研究室ではとくに管理していないようでした. 現在所属している研究室ではWeb管理システムをつくって管理しています.

このシステムが稼働から10年ぐらい経っているらしく, 最新のHWで動作しないので置き換えが必要となりました. というわけで新しいシステムをつくりました. せっかくなので公開します.

成果物

システム本体 github.com

本番用Docker-compose github.com

要件

  • 内部の人間しか使わないので制限も最低限. ログインとかいらない. 誰でも登録とか更新とかできるように
  • バックアップ等の管理が楽だと良い
  • 移行も楽にやりたい

  • 機能は旧システムと同様でOK

とのことだったので, 研究で触っている人の多いPythonフレームワークであるDjangoを使用する
また, Docker慣れている人も多いのでDockerを使う
セオリー通りにDjango+Gunicorn+NginxでやりたかったのでDocker-composeで構築
あとはバックアップが楽なSQLiteを組み合わせ, 可能な限り1ディレクトリで完結するように心がける

旧システムはPHPでどこにソースがあるかもわからなかったので適当に構築 最初はAPIサーバにしようと思ったけどJavascriptで画面作るのが面倒になって

機能とか

f:id:yamaken1343:20200310144637p:plain
トップページ
f:id:yamaken1343:20200310144639p:plain
業績詳細
レコードにはこのような項目が存在する. 主著者と業績区分あたりは外部キー.
著者や雑誌名も外部キー化したかったけど過去の業績との兼ね合いから旧システムとほぼ同様の構造のまま
f:id:yamaken1343:20200310144636p:plain
主著者一覧
旧システムがレコードの外部キーに主著者を指定しており, ユーザも主に主著者で検索をかけていたので一覧画面が存在する
f:id:yamaken1343:20200310144651p:plain
検索画面
レコードの各項目で検索できる
f:id:yamaken1343:20200310144649p:plain
検索結果
表形式で表示. 表示はDataTablesを使用. ほかに参考文献風やbibtexで表示可能. PDFの一括ダウンロードも可能.
f:id:yamaken1343:20200310144623p:plain
bibtex出力
f:id:yamaken1343:20200310144653p:plain
登録画面
前述の通り誰でも新しいレコードが登録できる. 全角カンマとか全角スペースとかは半角に変換される.

つくってるときに詰まったとことか

POST時のファイル関連で詰まった覚えがある 結局RESTflamework入れてなんとかしたんだっけな

PDFの一括ダウンロードも結構面倒だった HTMLに

<button class="btn btn-secondary"
            onclick="location.href='{% url 'gyoseki:download' %}?list={% for i in recode_list %}{{ i.file|yesno:"media/," }}{{ i.file }}{{ i.file|yesno:"!!!PARSER!!!," }}{% endfor %}'">
        PDF一括ダウンロード
    </button>

と無茶苦茶なGETリクエストを書いて

def download(request):
    li = request.GET.get('list')
    li = li.split('!!!PARSER!!!')
    response = HttpResponse(content_type='application/zip')
    response['Content-Disposition'] = 'attachment; filename=matome.zip'
    zf = zipfile.ZipFile(response, 'w')
    for l in li:
        if l:
            zf.write(l)
    return response

ただzip化するだけなんだけども, 無茶苦茶なGETリクエストやでかいZIPファイルを通すために

    client_max_body_size 4G;
    large_client_header_buffers 4 128k;

みたいにNginxの設定をいじる必要があったりとすんなりいかなかった

Djangoのstatic周りとか設定ファイルを本番と開発で変更するとかは改めて書かないがすんなりいかなかった

あとはまあそれなりといった感じでしょうかね
Djangoの知識なしで勉強しながらつくってだいたい0.5人月くらいでした