留学・音ゲー・研究備忘録

heine98の音ゲー・研究・留学の記録。Juliaとかlatexとか使います。

JuliaのバージョンアップデートしたあとのPyCall

コンパイルに失敗する?もしかして以下のような感じ?

[ Info: Precompiling PyCall [438e738f-606a-5dbb-bf0a-cddfbfd45ab0]
ERROR: LoadError: LoadError: could not load library "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/Python"
dlopen(/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/Python.dylib, 9): image not found

なら、呼び出す前にパッケージモードで build PyCall しましょう。そんだけ。

ちなみにPythonをhomebrewからアプデしたあとにJuliaが落ちることがあって、これの場合もbuildすれば治った。

AtCoderに手を出してしまった

はっきりいって僕が普段やっているマクロ経済学数値計算は、世間一般で求められているコーディング技術とは少し違う。

  1. 所与の価格のもとで制約付き動的計画法を解いて家計の政策関数を導出。
  2. その政策関数を元に、家計の財需要ないし資本や労働供給を計算。それが市場の需給が一致するかチェック。していれば終了、していなければ価格を変更して再計算。

が定常状態計算。ここから景気循環やら何かしらのショックが起きたときに経済変数がどのように変動するか、また別のコーディングで計算する(DynareやMIT ShockのTransition Pathなど)。

ただ、そういった中でも、例えば行列から条件に当てはまる要素を探し出すことなんかは頻繁に出てくる。(まあJuliaならsearchsortedlastなどのBase関数でやれば一発ではあるが。)

というわけで全然別物というわけでもないことも気付かされた。入出力をほぼ使わないという点を除けば。

AtCoderの問題というか競技プログラミングの問題は、意外とパズルっぽいものも多く、みんながハマる理由がわかった気がする。(Cまで解いた感想です)。

それに経済学のコードだとあまりネットに落ちていない分、どんなアルゴリズムやコードの書き方がいいのかということがわかりにくいが、AtCoderなら解説も存在するし、普通の人はこういうふうに捉えるのかというのが学べてとても面白い。

たとえば、Beginnerコンテスト117回目のB問題

atcoder.jp

これは解くのに必要な定理が示されているので、それ通りにコードを書くだけである。 問題はどうやって最大の長さを調べるか、そしてそれ以外の辺の長さの合計をどう出すか、だと思うのだが、僕自身が何も考えずに書いた結果、はforループを3回も使う書き方しかピンとこなかった。

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N, maxl =0, ind = 0, total = 0;
    cin >> N;
    vector<int> length(N);

    for (int i = 0; i < N; ++i){
        cin >> length.at(i);
    }

    // max
    for (int i = 0; i < N; ++i){
        if (maxl < length.at(i)){
            maxl = length.at(i);
            ind = i;
        }
    }

    // total length except for the max
    for (int i = 0; i < N; ++i){
        if (i != ind ){
            total += length.at(i);
        }
    }

    if (total > maxl){
        cout << "Yes" << endl;
    }
    else{
        cout << "No" << endl;
    }
        
}

しかし、解説を見れば、長さのベクトルを取得したあとにsortでやる、または長さを取得した際にすべての合計sumとmaxを取得し、それ以外の長さはsum-maxとすればよいなど、言われてみればたしかにそのとおりだという解き方が示されていた。 そういった細かいアルゴリズムが、自分の数値計算コードに役立つ日が来るといいと願いながら、今後もやっていきたい。

まあ発表スライド作るのが嫌すぎて現実逃避しているだけなのだが。

MacのC環境更新

ご多分に漏れずあんまり良くわかってないので、間違ってたら指摘していただけるとありがたいのですが、 MacはデフォルトでC言語が入っている(正確にはCLang)。が、バージョンが古いのでアプデしようと思ったのです。 それで、Homebewからgccをインストールしたんですね。

> brew install gcc //インストール

でもなんだかうまくいかない。調べてみる。

> gcc -v

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

うん、これデフォルトのまま。まず、シンボリックリンクを貼って、ターミナルにgccと打ったときに認識されるようにする。

> ls /usr/local/bin | grep gcc
> ls /usr/local/bin | grep g++

現在はgcc-9などがあるので、それを使う。

> ln -s /usr/local/bin/gcc-9 /usr/local/bin/gcc
> ln -s /usr/local/bin/g++-9 /usr/local/bin/g++

はい、これでいけますかね。

> gcc -v

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

えー、いけない。ちょっとここで気づいたのだけれど、

>which g++
/usr/bin/g++

(which gccはなぜか反応しなかったので、こっちでチェックした)あ、これ/usr/local/bin/g++よりも先に/usr/bin/g++が来てますね。で、つまり、シェルに対して優先的に探すパスを変更する必要がありますね。

6月27日追記:おそらくこのタイミングでターミナルを再起動すれば問題ない気がする。 /usr/bin/はPC全体の、/usr/local/bin/は個別のユーザーに対してですよね、どう見ても。 まあそれで、zsh使ってるんで優先パスの通し方を探したんだけど、bashのばっか。最終的にホームディレクトリ下のzprofileをいじればいいことに気づく。

> cd //一応
> open .zprofile

するとこの中に

# Set the list of directories that Zsh searches for programs.
path=(
  /usr/local/{bin,sbin}
  $path
)

という部分があるので、ここを

path=(
  /usr/local/bin
  /usr/local/{bin,sbin}
  $path
)

ととりあえずしてみる。解決!gccと打ってデフォでHomebrewで入れたgcc-9が呼び出されている。 ただ、この優先パスの書き換えで他のところに影響がでるかもしれないし、このパスの通し方が冗長である、間違ってる可能性があるので、何があっても自己責任で。。。

6月27日追記 それで、おそらくこの部分が悪さをしていると考えられることが生じた。 具体的には、これを変更したあと初めてvs Codeを再起動したら、latex workshop経由のtexコンパイルが通らなくなった。 どうも環境変数パスからlatex等のコマンドが見つからなくなったせいらしい。つまり、この部分の変更でなにか変なことが生じたみたいだ。 環境変数について少し理解が深まったのだが、いかんせんどこで永続的に$PATHが定義されているのかよくわからない。おそらく.zprofileの上の部分だと思うのだけれど、そうなるとこのファイル内の$pathはどこで規定されてるの???

とりあえず、動けばいいのでもとに戻した。しかも普通にwhich g++で/usr/local/bin/g++が出てくる。この前インスコ後に一度ターミナルを再起動させなきゃいけなかったのだろうか。

いつもお世話になってる動画

まあタイトルは冗談として。 個人的に食事や料理モノのテレビ番組や動画が好きでよく見ます。アニメだと食戟のソーマ(原作完結したそうですね)、衛宮さんちの今日のご飯、異世界食堂甘々と稲妻。小さい頃に中華一番とかミスター味っこの再放送っぽいの何度か見てた記憶がある。 マンガだと小さい頃にクッキングパパとか。 テレビ番組は孤独のグルメコウケンテツの世界の食卓、駅前食堂、サラメシ。(日本にいる間だけ)

んで、最近はYouTuberで料理モノとかよく見るんですよ。最近はレシピ参考とかも兼ねて、にぎりっ娘さんのお弁当中。じゅんさいに楽しむ形でGenの本棚食堂さん(とそのサブチャンネル)とか、岡奈なな子さん。

プロの料理人系はCOCOCORO's キッチンさん。

あとはお酒系でおっくんの宅飲みグルメさん、にゃんたこさん。前はいい加減に作る晩御飯さんも好きだったんですが、見始めたときには既に更新されなくなってまして。。。

あとは大食い系で谷やんさん、大食いラスカルさん。 ラーメン見たいときは、SUSURUさんとか。

海外枠は、Liziqiさんとかですかね。

全部飯テロなので、早く日本帰りたくなりますわ。

日本でよく使うような食材がなかなか手に入らないので、レシピなんかを見つけてもなかなか再現しづらいんですよね。 もやしは遠出してやっと手に入っても1.5ドル。魚は全然売ってないし、魚製品ももちろんなし。 肉は薄切りなんて近くには売ってないので、チャイナタウンか韓国系スーパーの冷凍を買ってくるしかないのですが、持ち帰る間に勝手に半解凍されてしまうし。 野菜も葉物はなかなか…ほうれん草は葉っぱの部分しか見あたらず、キャベツとかは日本のと違う種類。人参もクソまずくて、大根もアジア系スーパーまで足を伸ばさないとですね。

逆にアジア系スーパーまで行けば、そこそこの調味料や根菜も手に入ります。牛蒡や長芋なんかに、日本の冷凍食品や加工食品。納豆も冷凍なら売ってます。 ただ電車で30分とかなんですけどね。。。

もう少しいろいろ簡単に手に入るようになればいいなぁ、なんて考えながら、動画でお弁当や夕飯のレシピを考えたりする日々です。

GithubのREADME.mdは数式出せない(のでpdfのリンクを貼った)

(追記)よくググってこの記事が参照されてるみたいですが、適切な解決策は載っていません

マークダウンでREADMEを書いてそのままpushしてもGithubのほうがLatex数式を変換できないので、そのままでは数式読めない。 なんか画像に変換して埋め込むとかすればいいらしいが、今のREADMEは自分用に計算手順を書いたものなので数式てんこ盛り、これを画像にいちいち変換したくない。

(頭の悪い)対処法

README.mdにpdfリンクを貼る。pdfはマークダウンファイルをpdfに変換したもの

手順

  1. VS codeMarkdown Preview Enhancedを利用(必要なら拡張機能からインストール)
  2. Latex文法で数式を書く。
  3. Previewインスコすると、エディタの編集画面右上に虫眼鏡付きのアイコンが2つ表示される。白と青。白を押して白画面のPreviewを表示、右クリックでPDF変換

ただし、使ってるLatexのなんかがKatexとかいうのらしく、align -> alignedとかになるっぽい。つまり

$...$

でインライン数式、

$$...$$

で数式ブロック、

\begin{aligned}
1+1=2
\end{aligned}

でalign環境の数式(表示位置合わせなどできる

Julia: 行列の転置はArrayではない

最初からなのかどっかのバージョンからなのか知らないが、Juliaで行列での転置操作を行うとArrayがArrayでなくなる。どういうことかというと、

A = zeros(2,2)
B = A'
C = transpose(A)

とすると、AはArray{Float64,2}となるが、BはAdjoint{Float64,Array{Float64,2}}に、CはTranspose{Float64,Array{Float64,2}}になる。 もしtype stableな関数を書いているならば、これで関数の引数が違うのでエラーが出てしまう。

どうするのが正解なのかわからないが、とりあえず

A = zeros(2,2)
D = copy(A')

とすれば、DはArray{Float64,2}になるので、現状これを使うしかなさそう。なんか明らかに間抜けなんだが。。。

論文引用環境設定

環境&ゴール

jabref経由のbibtexで引用論文を管理。Author (2019)の形で文中で引用したい。

問題点

そのままだと[1]としか出ない。ダサすぎだし、Econだとこんなの見ない。

解決策

te.bst+natbibパッケージ。パッケージはMiKTeXコンソールから普通に追加。

te.bstはコンソールから入れられないので、以下のリンク先の文中からダウンロード。

このサイト、一見ちゃんと書いてあるように見えるが、置くべき場所の説明が不親切。自分の場合、

/usr/local/texlive/2018/texmf-dist/bibtex/bst/

であった。ここに置いたあと、いつもの

chmod 755 /usr/local/texlive/2018/texmf-dist/bibtex/bst/te.bst
sudo mktexlsr

を実行。1行目は必要なのかわからん。

プリアンブル

\documentclass[11pt,letter]{article}

...省略...

\usepackage[authoryear]{natbib}
\usepackage[unicode=true,
 bookmarks=false,
 breaklinks=false,pdfborder={0 0 1},backref=section,colorlinks=false]
 {hyperref}
\hypersetup{
 colorlinks=true,citecolor=blue}

\begin{document}

...本文 \cite{(bibtexのキー)}...

\bibliography{(bibtexの名前)} 
\bibliographystyle{te}
\end{document}

が指導教官のファイルのそれだったので使おう。こうすればAuthor (2019)のように本文で参照される。\bibliography{(bibtexの名前)} \bibliographystyle{te}の置く場所は\end{document}の前。