M1 chip のMacBook Airを購入したのでインストールしたものの紹介
今回、M1 chipのMacBook Airを購入したのですが、そこにインストールしたアプリケーションなどを紹介したいと思います。
リスト
- Google Chrome
- Zoom
- Slack
- Discord
- Microsoft Office
- Visual Studio Code
- Xcode
- Anaconda
- LaTeX
- GCC
- homebrew
これらを全部ダウンロードしたあとのディスク容量はこんな感じでした
ブラウザ
Google Chrome
自分は以前はWindowsを使っていたということもあり、iCloudよりもGoogle Drive派だったのでウェブブラウザはChromeを使っています。
Chromeの便利なところといえば、Googleアカウントごとに違うユーザーを登録できるので、大学用と個人用のアカウントなどを容易に分離できるところですね。あと、自分はパスワードマネージャーに頼りっきりなのでそこでもかなり助かっています。
チャットアプリなど
Slack
主に大学のクラスでの連絡やバイト先の連絡などで使っています。
Discord
友達との連絡など、主にプライベートで使っています。個人的にはLINEよりも便利だと思うので流行ってほしい。
Zoom
大学の授業で使います。
文書作成
Microsoft Office
WordやPower Pointが文書作成・スライド作成のデファクトスタンダードみたいな感じになっていますよね。自分は大学のアカウントでMicrosoft 365が無料で使えるので一応ダウンロードしておきました。正直、Wordは数式の挿入とかが使いにくいし、画像の挿入位置をいちいち気にしなければいけないのであまり得意ではないです。(デザインセンスがないだけかも)
LaTeX
今までもたまに使っていたのですが、今後の大学生活ではレポート作成などでもっと積極的に使っていきたいですね。 LaTeXの魅力としては、やはり数式がきれいに出せることと、書式にあまり気を使わなくて済むというところだと思います。
前のWindows 10のパソコンにtexliveをインストールしたときは1時間以上かかったような記憶があるのですが、今回はmactexを使って大体15分くらいでインストールできたと思います。
インストールの際は、以下のサイトを主に参考にしました。vscodeでのTeX執筆はやりやすいですね。texlive2021からはM1にもネイティブ対応しているみたいです。homebrew経由ではなくインストーラー経由で行いました。(/opt/homebrew
にダウンロードされるのがなんとなく嫌だった)
プログラミング関連
Visual Studio Code
競技プログラミングをするのでPythonとC++を書きます。エディタは他のものをあまり使ったことはないですがvscodeは使いやすいです。
Anaconda
大学の課題でmatplotlibやnumpyなどを使うので、それらが最初から入っているAnacondaを入れました。
Xcode
せっかくmacを買ったのでiOS開発にも挑戦してみようかということで、Xcodeを入れました。インストールにかなり時間がかかった…
GCC (GNU Compiler Collection)
Xcodeを入れると、clangなどが自動でインストールされるのですが、今まで競プロで書いていたコードはGCCのものだったので追加でインストールしました。以下のサイトを参考にしました。
homebrew
使いやすいパッケージマネージャーがあるのはMacのいいところの一つだと思います。
【競プロ典型90問】034 - There are few types of elements(★4)
概要・感想
尺取法ってのもなかなか思いつかなかったし、バグらせるしで大変だった。
[l, r]が各lに対する条件を満たす区間で最も長いものとなる。
提出コード
n, k = map(int, input().split()) a = list(map(int, input().split())) da = {v: 0 for v in set(a)} l = 0 r = 0 cnt = 0 rlim = [0] * n skip = False while l < n: # print(l, r, cnt) while (not skip) and r < n - 1 and cnt <= k: da[a[r]] += 1 if da[a[r]] == 1: cnt += 1 if r + 1 == n or (da[a[r+1]] == 0 and cnt == k): skip = True break r += 1 # print(l,r, da) rlim[l] = r da[a[l]] -= 1 if da[a[l]] == 0: cnt -= 1 if r < n - 1: skip = False r += 1 l += 1 # print(rlim) # print(a) ans = 0 for i in range(n): ans = max(ans, rlim[i]-i+1) print(ans)
【競プロ典型90問】003 - Longest Circular Road(★4)
概要・感想
解説を見たらなんかdfsを2回やればいいらしい。確かに…。
#include <bits/stdc++.h> using namespace std; vector<vector<int>> graph; vector<int> cand(0); int n; int dfs(int s, int p) { vector<int> path(1, 0); for (auto nxt: graph[s]) { if (nxt == p) continue; path.push_back(dfs(nxt, s)); } sort(path.begin(), path.end(), greater<int>()); if (path.size() >= 2) cand.push_back(path[0]+path[1]+1); return path[0]+1; } int main() { cin >> n; int a, b; graph.resize(n); for (int i = 0; i < n-1; i++) { cin >> a >> b; graph[a-1].push_back(b-1); graph[b-1].push_back(a-1); } dfs(0, -1); sort(cand.begin(), cand.end(), greater<int>()); cout << cand[0] << endl; }
【競プロ典型90問】013 - Passing(★5)
概要・感想
ダイクストラ法の問題。典型的なダイクストラ法という感じで正直★5ではないようにも思うが、意外とこんなもん?
水色になってやっとダイクストラも書き慣れてきたと思うが、まだまだ何も考えずにかけるという境地には至らない。今回もpop()を忘れてバグらせてしまった。
#include <bits/stdc++.h> using namespace std; using P = pair<int, int>; int n, m; vector<vector<P>> graph; const int INF = 1e9; void dijkstra(int s, vector<int> &dist) { dist.assign(n, INF); priority_queue<P, vector<P>, greater<P>> pq; dist[s] = 0; pq.push({0, s}); while (!pq.empty()) { auto tmp = pq.top(); pq.pop(); int d = tmp.first, v = tmp.second; if (dist[v] < d) continue; for (auto nxt: graph[v]) { int nd = d + nxt.second; int nv = nxt.first; if (nd < dist[nv]) { dist[nv] = nd; pq.push({nd, nv}); } } } } int main() { cin >> n >> m; graph.assign(n, vector<P>(0)); int a, b, p; for (int i = 0; i < m; i++) { cin >> a >> b >> p; a--, b--; graph[a].push_back({b, p}); graph[b].push_back({a, p}); } vector<int> from_1, from_n; dijkstra(0, from_1); dijkstra(n-1, from_n); for (int i = 0; i < n; i++) { cout << from_1[i] + from_n[i] << endl; } }
【競プロ典型90問】012 - Red Painting(★4)
概要・感想
H x Wのマス目の上でUnionFindを行うという問題。問題の解法すぐに浮かんだが、ソラでUnionFindを書こうとしたら思いのほかバグを発生させてしまい、時間がかかった。
具体的には、UnionFind.merge()
内のif a==b:
部分を書き忘れていてどこが間違っているのかわからなかった。
import sys sys.setrecursionlimit(10**7) class UnionFind: def __init__(self, n): self.p = [-1] * n def parent(self, a): if self.p[a] < 0: return a else: self.p[a] = self.parent(self.p[a]) return self.p[a] def is_same(self, a, b): a = self.parent(a) b = self.parent(b) return a == b def merge(self, a, b): a = self.parent(a) b = self.parent(b) if a == b: return if self.p[a] > self.p[b]: a, b = b, a self.p[a] += self.p[b] self.p[b] = a h, w = map(int, input().split()) M = 2200 uf = UnionFind(M * M) qn = int(input()) col = [0] * (M * M) dd = [M, -M, 1, -1] for _ in range(qn): q = list(map(int, input().split())) if q[0] == 1: x = q[1] * M + q[2] col[x] = 1 for d in dd: if col[x+d] == 1: uf.merge(x, d + x) else: x = q[1] * M + q[2] y = q[3] * M + q[4] print('No' if not uf.is_same(x, y) or col[x] == 0 else 'Yes')
wsl2でfishを使用しているときにVcXsrvが機能しないときの対処法
症状
wsl2でfishをログインシェルにしている環境で、以下のサイトを参考にGUI環境を構築したところ、GUIアプリを起動しようとしたときに次のような出力がされ、起動できなかった。
Unable to init server: Could not connect: Connection refused Cannot parse arguments: Cannot open display:
原因
~/.profile
内に記述した
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0
この一文がfishでは動作しないことが原因
fishはposix互換ではない為、sh, bash向けに書かれたスクリプトが動かないことがある