こんにゃくの勉強記

プログラミング好きなとある大学生の勉強メモ的な、日記的なものです

【Haskell】$ と . の違いについて

はじめに

Haskell を勉強中なのですが、($) と (.) の使い分けで少し混乱しました。というもの、読んでいた入門書で、($) と (.) が置き換え可能そうな例が載っていたからです。

置き換え可能なのか、私が勘違いしているだけなのかわからなかったため、調べていました。

前提

($) について

($) :: (a -> b) -> a -> b
f $ x = f x
  • ($) 演算子についてわかりやすく説明している記事を見つけました

qiita.com

(.) について

  • (.) の正式名称は調べても出てこないのですが、あえて呼ぶなら「関数合成演算子」のようになるようです
  • その名の通り、関数合成に使われます
  • 定義は以下の通り
(.) :: (b -> c) -> (a -> b) -> a -> c
f . g = \x -> f (g x)

置き換え可能な例

例えば、以下のような例で引っかかりました。以下の2つのコードは、両方とも180を返し、同じ挙動をしているように見えます

product $ map (*3) $ zipWith max [1,2] [4,5]
product . map (*3) $ zipWith max [1,2] [4,5]

結論

結論は、「置き換え可能なことも多い」「($) と (.) の定義を考えれば、置き換えられる場合とそうでない場合が見分けられるようになる」だと思います

以下の記事が詳しくてわかりやすかったです。幾つもの具体例を挙げて説明してくださっており、「置き換えられる場合」と「置き換えられない場合」の違いに気づくことができました。私が説明し直すよりわかりやすいかと思うので、同じところで詰まった方は、是非以下の記事を読んでみてください。「($)のNGケース」と「(.)のNGケース」のセクションに、置き換えられない場合の理由が載っています

qiita.com

結局は、($) と (.) 自身やその前後の関数の型で不整合が起きてエラーが出るため置き換えられない、という当たり前の結論になりそうです

終わりに

「置き換えられそうだ」という直感が部分的には合っていたことがわかってよかったです。しかし、直感のままだと置き換えられない場合の理由を説明できないため、綺麗に整理して説明してくださっている記事に出会えて助かりました

【勉強日記】Haskell (1) - 勉強方法・環境構築 -

はじめに

今まで Python はじめ、オブジェクト指向や手続き型の言語ばかり触ってきました。他の書き方も知りたいと思ったため、Haskell を勉強することにしました。

勉強方法

まずは「すごいHaskellたのしく学ぼう!」という有名な本を読んでいこうと思います。

その後は演習として何か動くものを作りたいと思っているのですが、何を作るかは未定です。「Haskell入門 関数型プログラミング言語の基礎と実践」という本の第9, 10章でそれぞれコマンドラインツールと Web アプリの演習ができるようなので、気になっています。

shop.ohmsha.co.jp

gihyo.jp

環境構築

次の Zenn の記事を参考に構築しました。

zenn.dev

環境は

macOS Sonoma 14.2
zsh

で、叩いたコマンドは、

% curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
% source ~/.zshrc

です。GHCup をインストールした後、.zshrc を再読み込みする必要があります。

終わりに

Haskell に対してもっと取っ掛かりづらい印象があったため、「すごいHaskellたのしく学ぼう!」を読んでいて、Haskell の読みやすさやこの本の面白さに驚きました。 まだ最初の方しか読めていないので、早く読み進めたいです。

【R】legend(凡例)だけ出力する

はじめに

R でグラフを描画していたのですが、legend(凡例)だけ出力したい、という場面がありました。 検索ワードが悪かったようで、答えに辿り着くのに少し時間がかかったため、メモとして残しておきます。

方法

以下の Stack Overflow の方法をそのまま使いました。 ggplot2 - How can I create a legend without a plot in R? - Stack Overflow

空のグラフを描画して、その凡例として出力したい凡例を設定すればいいようです。

コード例:

出力:

出力された画像

このままだと余白や画像サイズが不自然なので、png()par() を使用して諸々のサイズを調整するといいと思います。

終わりに

最初は、"R export only legend" のように「legend だけを別ファイルに保存する」ことを意識した検索ワードを使っていたのですが、出てくるのは ggplot を使った例ばかりで、R の組み込みの legend 関数を使った例は全然出てきませんでした。 "R plot only legend" で検索するとようやく引用元の Stack Overflow の記事が出てきました... R に使い慣れていないからわからなかっただけで、よく使われている手法だったりするのでしょうか。とりあえず出力ができてよかったです。

【勉強日記】Bash入門

はじめに

シェルスクリプトの書き方が1ミリも分からなかったので、「シェルスクリプト 文法」で検索してみるなどしていました。 if 文や for 文すら書き方がよく分からないんですよね...シェルスクリプト。 人の書いたシェルスクリプトを読もうにも、何をしているのか挙動が全く分からない部分も多く、「雰囲気で概要を把握する」ことすらできませんでした。

そのため、きちんと情報のまとまったサイトで、一通り文法を押さえておいた方がいいなという結論に至り、勉強することにしました。

読んだ記事

以下の記事がわかりやすかったです。 C# の文法を把握する際にもお世話になったサイトです。

www.tohoho-web.com

この記事を一通り読むだけで、私の見るようなシェルスクリプトで使われている構文はすべて網羅されていると思いますし、スクリプトを書きながら参照する先としても十分です。 このサイトだけでは分からない内容があれば別のサイトを見に行きますが、基本的にはこのサイトだけで大体解決できそうです。

終わりに

Python や Docker などの、普段ターミナルで実行するコマンドをまとめて実行するシェルスクリプトくらいしか書いたことも読んだこともなかったため、それ以外のコマンドに関する勉強にもなりました。 便利そうですし、構文の雰囲気を把握できたので、もしかしたら今後何かの作業の自動化や効率化に使うかもしれません。

【Mac】Python環境構築のメモ Pyenv + Poetry

はじめに

新しい Mac を使うことになりました。Python の環境構築をしなければなりません。でも前の Mac でどういう構築方法を取ったか覚えていません...

構築方法は覚えていないのですが、最終的に使っていたのは Pyenv + Poetry の環境です。今後の自分のために、構築方法をメモしておくことにします

環境

- Apple M3 Max
- macOS Sonoma (Version 14.1)
- zsh

手順

以下の順でインストールしていきます。

  1. Homebrew
  2. Pyenv
  3. Poetry

Homebrew

公式サイトを訪ねると

% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

というコマンドが載っています。これをターミナルに貼り付けて実行します。PATH の設定は必要なく、インストール後すぐに使い始めることができます。

試しに、

% brew --version

を実行して、インストールされたかどうか確認しておきましょう。

私はインストール後に気が付いたのですが、上で紹介したインストールコマンドの少し下に、If you're on macOS, try our new .pkg installer. というメッセージが書かれていました。公式リポジトリの Github Release から .pkg ファイルをダウンロードすることでもインストールできるようです。Release ページの Assets のところに .pkg ファイルのダウンロードリンクが貼ってあります。

Pyenv

Pyenv のインストール

公式リポジトリを参考にインストールしていきます。

% brew update
% brew install pyenv

で Pyenv がインストールできます。

次に環境変数の設定をしていくのですが、ver. 2.3.0 から設定方法がアップデートされ、シンプルになったようです。それまでの 2.0.0-2.2.5 での設定方法も動きはするようです。ここでは 2.3.0 以降の方法を使います。

以下のコマンドで環境変数の設定ができます。

% echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
% echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
% echo 'eval "$(pyenv init -)"' >> ~/.zshrc

上のコマンドを実行後に、

% source ~/.zshrc

で設定ファイルを再読み込みして、Pyenv が実行可能になったかどうかまで調べておきましょう。

% pyenv --version

Bash など他のシェルの場合の設定方法は、公式リポジトリSet up your shell environment for Pyenv を参考にしてください。

Poetry

概要

以前は Homebrew で Poetry をインストールしました。が、この方法は推奨されていなさそう(参考:python - Why is not recommended to install poetry with homebrew? - Stack Overflow)で、実際に公式サイトにも載っていないので、pipx を使う方法に切り替えました。

pipx とは、「システムにインストール済みの他のパッケージとの間に依存関係の衝突を起こすことなく Pythonコマンドラインアプリケーションをインストールし動作させるためのツール」(引用元:Python Packaging User Guide)です。Python 製パッケージには、例えば sphinx や black のようにコマンドラインアプリケーションを提供しているものも多いです。これらのパッケージをいい感じに管理してくれるツールが pipx です。

pipx のインストール

pipx が入っていなければ、まずは Homebrew で pipx をインストールします。

% brew install pipx

pipx でインストールするアプリケーションを使うには~/.local/binへの PATH を通す必要があります。以下のコマンドで PATH を通しましょう。もしくは、直接 ~/.zshrc などに書き込んでも大丈夫です。

% pipx ensurepath

設定ファイルを再読み込みします。私はこれを忘れて、poetry をインストールしたはずなのに起動できず、時間が少し消えました。

% source ~/.zshrc

Poetry のインストール

公式サイトを参考にします。以下のコマンドを実行するだけです。

% pipx install poetry

pipx ではバージョンの指定もできるので、特定のバージョンの poetry をインストールしたい場合は公式サイトの「Install Poetry (advanced)」の見出しのところを参考にしてください。

終わりに

今まで適当にしていた Python の環境構築をメモついでにまとめてみました。しばらく経てば設定方法やツールのトレンドも変わりそうですが、現時点でのメモとして残しておきます。

pipx の存在は知っていたのですが、Poetry のサイト以外で見たことがなく、導入していなかったんですよね。便利そうなツールなので知れてよかったです。

pipx や Poetry には補完機能があるそうです。内容が散らかってしまいそうなので紹介しませんでしたが、すぐに導入できますし、おすすめです。

参考

【VSCode】Remote SSH で conda activate が使えなかった話

初めに

当方、conda 初心者です。重そうという理由で今まで使ってきませんでした。しかし、最近 conda を使う機会があり、早速使おうと思ったのですが...

$ conda activate <仮想環境名>
usage: conda [-h] [--no-plugins] [-V] COMMAND ...
conda: error: argument COMMAND: invalid choice: 'activate' (choose from 'clean', 'compare', 'config', 'create', 'info', 'init', 'install', 'list', 'notices', 'package', 'remove', 'uninstall', 'rename', 'run', 'search', 'update', 'upgrade', 'doctor', 'content-trust', 'server', 'build', 'token', 'env', 'repo', 'verify', 'inspect', 'develop', 'convert', 'index', 'metapackage', 'pack', 'render', 'skeleton', 'debug')

なぜか conda activate が使えないという事態に直面してしまいました。

環境

上記のエラーはく、VSCode の Remote SSH で接続したサーバー上で起きたものです。 それぞれのバージョンは以下の通りです。

ローカル環境

Mac OS Ventura
VSCode 1.82.2
Remote SSH v0.106.5

サーバー環境

Ubuntu 22.04.2 LTS
conda 23.7.4

試しに、ターミナルから直接 ssh して $ conda activate <仮想環境名> を実行すると、普通に仮想環境に入ることができました。

解決策

↓ の Issue にあるように、$ conda activate <仮想環境名> ではなく $ source activate <仮想環境名> を使用すると仮想環境を起動できました。

github.com

一度 $ source activate <仮想環境名> で仮想環境を起動した後だと、2回目以降は $ conda activate <仮想環境名> も使えるようになりました。一体どういう仕様なのでしょう...

Issue はざっと目を通したのですが、 conda も仮想環境も英語もよくわかっていないので、原因を理解することはできませんでした。

また、仮想環境を抜けるときは、 $ deactivate ではなく、$ conda deactivate を使用する必要がありました。これはエラーメッセージで教えてくれるのですぐわかりました。

$ deactivate
DeprecationWarning: 'source deactivate' is deprecated. Use 'conda deactivate'.

終わりに

conda の使用自体初めてだったので、conda の使い方を間違えているのか、VSCode が悪いのか、もしくは Remote SSH やサーバーの設定が悪いのか、少し困ってしまいました。すぐに解決策が出てきたのでよかったです。

原因を理解していないままなのは気持ち悪いですが、とりあえず解決できましたし、原因の理解より先にやるべきことたちがあるので、一旦このまま次に進みます。

初学者のUnity勉強記[2] 運転ゲーム

初めに

前回に引き続き、Unity Tutorial に取り組みました。前回は Bolt を用いてプログラムを組みましたが、C# で組めるようになりたいため、C# を使った Unity Tutorial を探しました。

2日目~4日目

やったこと

Pathway の Junior Programmer コースを半分ほど(Unit 1 まで)終わらせました。 learn.unity.com

Unit 1 で作成するのは、車を前後左右に動かして障害物を避けながら進むゲームです。ボーナス問題である Bonus Features 1 では、対向車やカメラ視点切り替え、マルチプレイヤー機能などを追加しました。Start や Update, LateUpdate 関数内に数行記述する程度の簡単なコーディングではありましたが、C# によるスクリプト作成の基礎が身につきました。

メモ

Update 系の関数には、Update, LateUpdate, FixedUpdate の 3 種類があります。それぞれの概要や違いについては以下の記事がわかりやすかったです。 dkrevel.com

終わりに

C# でのスクリプト作成の概要が掴めてホッとしました。なんとなくでも「こういう風に作るのだな」ということがわかっている状態とそうでない状態には大きな差がありますよね。