淡々

プログラミング関連を中心に、様々なことを適当に書きます

M1 chip のMacBook Airを購入したのでインストールしたものの紹介

今回、M1 chipのMacBook Airを購入したのですが、そこにインストールしたアプリケーションなどを紹介したいと思います。

リスト

これらを全部ダウンロードしたあとのディスク容量はこんな感じでした

f:id:tsunderetan:20210629021508p:plain
ディスク残量

ブラウザ

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にダウンロードされるのがなんとなく嫌だった)

qiita.com

texwiki.texjp.org

プログラミング関連

Visual Studio Code

競技プログラミングをするのでPythonC++を書きます。エディタは他のものをあまり使ったことはないですがvscodeは使いやすいです。

Anaconda

大学の課題でmatplotlibやnumpyなどを使うので、それらが最初から入っているAnacondaを入れました。

Xcode

せっかくmacを買ったのでiOS開発にも挑戦してみようかということで、Xcodeを入れました。インストールにかなり時間がかかった…

GCC (GNU Compiler Collection)

Xcodeを入れると、clangなどが自動でインストールされるのですが、今まで競プロで書いていたコードはGCCのものだったので追加でインストールしました。以下のサイトを参考にしました。

qiita.com

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:

astherier.com

原因

~/.profile内に記述した

export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0

この一文がfishでは動作しないことが原因

fishはposix互換ではない為、sh, bash向けに書かれたスクリプトが動かないことがある

解決策

  • ログインシェルをbash, zshなどのposix互換shellに戻す
  • 一時的にbashにログインしてsource ~/.profileをしてからGUIアプリを使う