2023/10/31

継続が大事なだということに気付いてもなかなか継続することができない日々を過ごしている。 このブログもすぐに途切れてしまう気がする。 やりたいことはあるが、あっちにいったりこっちにいったりで定まっていない。 1つずつ捌いていくべきなのだろうけどなかなかむずかしい。 とりあえずは統計検定準一級の勉強を優先しようと思う。 ノンパラメトリック法のところを読んだ。 ハロウィンらしいことはしていない。

Djangoのテストをフォルダに入れてまとめる方法

テストをアプリ直下の1つのtests.pyに書くのではなく、いくつかのファイルに分割し、それらをフォルダに入れてまとめたいときは以下のように書く方法がある。

myapp/
    __init__.py
    models.py
    views.py
    tests/
        __init__.py
        test_models.py
        test_views.py
        ...

これはtestsというフォルダの中に、いくつかのテストが書かれたファイルをまとめるときの例である。

testsフォルダの中には__init__.pyを作成する必要がある。

python manage.py testにおいては、testで始まるファイルのテストが自動的に検出されるため、テストを書くファイルの名前はtest_<内容>.pyの形にすると良い。

AtCoder Beginner Contest 288 C - Don't be cycle

求めたいものは削除する辺の本数の最小値です。 よってこれを Xとおくことにします。
 X  :=削除する辺の本数の最小値(今回求めたいもの)
次に、任意の連結なグラフ( C頂点)で、かつサイクルを持たないようなグラフの辺の最大数は C-1であるという事実から、 連結なグラフが S個の場合、残すことのできる辺の数 LL=N-Sであることがわかります。
 L  :=グラフが閉路を持たないように辺を残すときの辺の最大数
よって最終的に求める答えは  X = M-N+Sで求まります。

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

int main() {
    // 入力受け取り
    int N, M; cin >> N >> M;
    // インデックスと頂点番号を合わせるためにN+1としている
    vector<vector<int>> G(N+1);
    for (int i = 1; i <= M; i++) {
        int A, B; cin >> A >> B;
        G[A].push_back(B);
        G[B].push_back(A);
    }

    int S = 0;
    vector<bool> seen(N+1, false);
    // BFSで連結成分の個数を調べる
    for (int i=1; i<=N; i++) {
        if (seen[i] == false) {
            S++;
            queue<int> que;
            que.push(i);
            while (!que.empty()) {
                int q = que.front(); que.pop();
                for (int v : G[q]) {
                    if (!seen[v]) {
                        seen[v] = true;
                        que.push(v);
                    }
                }
            }
        }
    }
    cout << M-N+S << endl;

    return 0;
}

AtCoder Beginner Contest 287 D - Match or Not

この問題では「SとTが前から何番目まで一致しているか」と「SとTが後ろから何番目まで一致しているか」 を先に調べることによってO(N)で問題を解くことができます。

例えば aaabbbccc と a?a?b?c の場合

前から調べると

T T T T T T T
a a a b b b c c c
a ? a ? b ? c

後ろから調べると

F T T
a a a b b b c c c
a ? a ? b ? c

後ろから3文字目がマッチしないため それ以降はFとします。

F F F F F T T
a a a b b b c c c
a ? a ? b ? c

前からのboolを保存する配列 front_matchと 後ろからのboolを保存する配列 rear_matchを作ります 長さはT+1としてindex0はTとしておきます。 こうすることによってx=0のときは
front_match[0], rear_match[T.length()]
x = 1のときは
front_match[1], rear_match[T.length()-1]
のandをとることによって TならばYes
FならばNo
と判断することができます。

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

bool is_match(char a, char b) {
    return (a == b || a == '?' || b == '?');
}


int main() {
    string S, T;
    cin >> S >> T;
    vector<bool> front_match(T.length()+1, false), rear_match(T.length()+1, false);

    front_match[0] = true;
    for (int i = 0; i <= T.length(); i++) {
        if (!is_match(S[i], T[i])) break;
        front_match[i+1] = true;   
    }

    reverse(S.begin(),S.end());
    reverse(T.begin(),T.end());

    rear_match[0] = true;
    for (int i = 0; i <= T.length(); i++) {
        if (!is_match(S[i], T[i])) break;
        rear_match[i+1] = true;   
    }

    for (int i = 0; i <= T.length(); i++) {
        if (front_match[i] && rear_match[T.length()-i]) cout << "Yes" << endl;
        else cout << "No" << endl;
    }

    return 0;
}

MacBook Air M1でFlutterを使えるようにした記録と解説

この記事はFlutterを使うために私が行ったことの記録と解説です。 MacBook Air M1 使用者向けです。

Flutterの公式サイトに行きます。

Get Started → macOS と進みます。

Appleシリコンのパソコンの場合はロゼッタをインストールするようにと書いてあるのでそこにあるコマンドをコピーしてターミナルに貼り付けてエンターを押します。

インストールに成功するとターミナルには以下のような表示があります。
Install of Rosetta 2 finished successfully

FlutterのサイトからAppleシリコン用のSDKのzipファイルをダウンロードします。

Flutterのフォルダはどこにおいても(大事そうなファイル付近はやめた方が良いと思いますが)良いので、私はFlutterのサイトでも例として挙げられているように ホームディレクトリにdevelopフォルダを作成し、その中にダウンロードしたフォルダを置きました。Flutterのサイトではunzipするためのコマンドも書いてありますが、ダウンロードしたフォルダは既に解凍済みだった(safariの機能?)のでそのまま移動させました。

よくわからない人はターミナルを開いて

cd ~
mkdir development

を1行ずつ実行した後、新しくできたdevelopmentフォルダにダウンロードしたflutterフォルダを移動させてください。

次に、パソコンにflutterの存在を教えます。 教えるためにはとあるファイルにさっきダウンロードしたflutterの位置を教える必要があります。

ターミナルを使います。 ターミナルで

echo $SHELL

と入力してください。 MacBook Air M1 の方は /bin/zsh と出力されると思います。 その場合

cd ~

とターミナルに入力し、その後一度

pwd

と入力し、表示される内容を確認します。1つ次で使います。 その後

emacs .zshrc

と入力してください。 見慣れないテキストエディタが開かれると思います。 そこにflutterの位置を書きます。 どこでも良いのですが私は最後の方に

#Flutter
export PATH="$PATH:/Users/<みなさんのユーザーネーム>/development/flutter/bin

と書きました。この最後から2番目のflutterがさっきダウンロードしたflutterフォルダの場所を指します。 みなさんは<みなさんのユーザーネーム>あたりをpwdで確認したものと一致する感じに読み替えて入力してください。 そしたらこのテキストエディタを閉じます。(ちなみにこれはemacsというエディタです) 方法はcontrol + Cを押してその後control + X を押します。 すると青い(多分)文字で保存するか聞かれるのでyを押します。(yesのyです) 次に今設定したことを反映させるために以下のように入力します。(再読み込みみたいなものです)

source $HOME/.zshrc

次に

which flutter  

と入力し

/Users/<みなさんのユーザーネーム>/development/flutter/bin/flutter

と出力されたら成功です。

flutter not found

の場合は何かしらで間違ってしまっています。

次に

flutter doctor -v

と入力します。 そうすると足りないものを教えてくれます。 それらをそこに英語でかかれている指示に従いインストールします。

私の場合はまずはじめにAndroid Studioをインストールすることにしました。

Download Android Studio & App Tools - Android Developers

同意してダウンロードします。 そしてAndroid Studioを起動、 Nextで進み、Standardを選択し、いろいろ同意してダウンロードします。 ダウンロードし終わったらまたターミナルで

flutter doctor -v

と入力し実行します。 するとAndroid Studioコマンドラインツールがないと言われました。 そこでまたAndroid Studio を開き、projects → More Actions → SDK Manager →SDK Tools そこにある Android SDK Commandl-ine ToolsをチェックしOK、同意しダウンロードします。 再度

flutter doctor -v

ライセンスが〜と言われるので

flutter doctor --android-licenses

同意してないライセンスがあると言われるので全部y

flutter doctor -v

で確認するとAndroid StudioはひとまずOKそうです。 次にXcodeです。 私は以前にインストールしていたので言われた通りに

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
sudo xcodebuild -runFirstLaunch

を入力しました。 再度

flutter doctor -v

するとココアポッドがないと言われたのでインストールします。 ここにインストール方法が書かれています。

CocoaPods Guides - Getting Started

初めに

sudo gem install cocoapods

次に、と思ったらこれだけでした。 再度

flutter doctor -v

をすると No issues found! 無事に終わりました。これでFlutterの環境構築は一通りOKだと思います。このブログを書きながらのため長かったです。 また、英語ではありますがdoctorに表示されている指示は親切でした。

おまけ ターミナルに以下のように入力してください。

open -a Simulator

私の場合はこのようなiPhone8のシュミレーターが起動しました。

メインページ 私について - トフの記録