Ubuntu 18.04の設定メモ

Ubuntu 18.04をクリーンインストールしようとしてはまる - minus9d's diary の続き。日本語 Remixを使わずにUbuntu 18.04をインストールした場合における設定メモです。

設定

Caps Lockキーを潰してCtrlキーとして使う

GUIで行うために

$ sudo apt install gnome-tweak-tool

したあと、

$ gnome-tweaks

でツールを起動し、「キーボードとマウス」→「追加のレイアウトオプション」→「Ctrl Position」→「Caps LockをCtrlとして使う」。

「CtrlとCaps Lockを入れ替える」というオプションも存在しているのだけれど、これを使うとShiftとCtrlの同時押しをうまく扱えないようなのでおすすめしません。

日本語入力

第520回 Ubuntu 18.04 LTSの日本語入力:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社に従う。「⁠設定」の「地域と言語」を開いて「入力ソース」のところにある「+」をクリックし、「⁠日本語 (Mozc)」を追加する必要があるのがポイント。これは気付くのが困難。

画面ロックの時間

デフォルトだと、画面が暗くなるのと同じ時間、すなわち5分で画面ロックされます。これは短すぎるので、画面がロックされるのが早すぎます - Ubuntu 18.04 LTS デスクトップガイド改に従いロック時間を長くします。具体的には、 「設定」→「プライバシー」→「画面オフ後にロックするまでの時間」を1時間に変更。

追加インストール

インストールされてるパッケージの更新

以下のコマンドで、すでにインストールされてるパッケージを最新版に更新。

$ sudo apt update
$ sudo apt upgrade

apt-getで追加インストール

いつも使うツールをインストール。

$ sudo apt install cmake emacs git lv nkf screen

手動で追加インストール

CUDA Toolkitのインストール (検証中)

いろんな方法があるようですが、今回は nvidia - How do I Install CUDA on Ubuntu 18.04? - Ask Ubuntu を試しました。すなわち、

$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update
$ sudo ubuntu-drivers autoinstall

したあと、再起動し、さらに

$ sudo apt install nvidia-cuda-toolkit gcc-6

します。この結果、nvccやnvidia-smiが/usr/bin/nvcc以下に入りました。

nvcc --versionの結果は以下です。

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Nov__3_21:07:56_CDT_2017
Cuda compilation tools, release 9.1, V9.1.85

nvidia-smiの結果の一部は以下です。

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 435.21       Driver Version: 435.21       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 1070    Off  | 00000000:01:00.0  On |                  N/A |
|  0%   43C    P8     8W / 151W |    445MiB /  8116MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+

それぞれで表示されるversionが一致していません。Different CUDA versions shown by nvcc and NVIDIA-smi - Stack Overflowをもし私が正しく理解しているとすると、nvidia-smiで表示される10.1は、nvidiaのdriverがサポートするCUDAのバージョンで、nvcc --versionで表示される9.1は、CUDAのランタイムのバージョンのようです。

Ubuntu 18.04をクリーンインストールしようとしてはまる

Ubuntu 18.04をSSDクリーンインストールしようとして盛大にはまりました。以下はそのメモです。

現象

まず以下の手順でUbuntuインストーラUSBメモリを作成しました。

上記インストーラUSBメモリを使ってUbuntu 18.04をインストールしようとすると以下のエラーが出てインストールに失敗しました。

GRUB installation failed

The ‘grub-efi-amd64-signed’ package failed to install into /target/. Without the GRUB boot loader, the installed system will not boot.

試行錯誤

以下のいろいろを試しましたが、どれ一つとしてうまくいきませんでした。

解決策

結局、Ubuntu本家 Ubuntu 18.04.3 LTS (Bionic Beaver) から、UbuntuのDVDイメージubuntu-18.04.3-desktop-amd64.iso をダウンロードし、インストーラーを再作成すると解決しました。いまいち何が悪かったのか自分にはわかりません。

C++のmultisetの使い方

競技プログラミングC++のmultisetをたまに使うことがありますが、毎回使い方を忘れているのでメモしておきます。

multisetとは

multisetは、集合を扱うデータ構造です。setと異なり、同じ値の要素を複数持つことができます。#include <set>すれば使えます。さっそく例を示します。

#include <iostream>
#include <set>

void print_multiset(std::multiset<int>& ms) {
    for (auto val: ms) {
        std::cout << val << ", ";
    }
    std::cout << std::endl;
}

int main(void)
{
    std::multiset<int> ms;
    ms.insert(7);
    ms.insert(5);
    ms.insert(2);
    ms.insert(7);
    ms.insert(5);

    print_multiset(ms);
    return 0;
}

とすると、

2, 5, 5, 7, 7,

が表示されます。つまり、変数msに、5つの値が順序付きで登録されていることがわかります。以下では、このように変数msを生成したとしてmultisetの使用例を説明します。

素数を調べる

例えばmsの中に値5を持つ要素が何個含まれているかを調べるには、以下のようにします。

ms.count(5);  // 2と表示される

ただしこれの実行には、要素数をNとしてO(log N)の時間がかかるので要注意です。値の有無を調べるためだけにcount()メソッドを使ってはいけません。値の有無を調べるにはfind()を使いましょう。

if (ms.find(5) == ms.end()) {
    // 5が存在しない
} else {
    // 5が存在する
}

ある値をもつ要素を全部消す

例えばmsから値5を持つ要素を 全部 消すには、以下のようにします。

ms.erase(5);

ms.erase()は何個の要素を消したかも返すので、もし

auto n = ms.erase(5);

とすると、nには2が入ります。

ms.erase(42);などと存在しない値を消そうとしてもエラーにはなりません。

ある値をもつ要素を1つ消す

例えばmsから値5を持つ要素を 1つだけ 消すには、面倒ですがイテレータを介する必要があります。

ms.erase(ms.find(5));

とすると、msの持つ要素は2, 5, 7, 7となり、5が1個だけ消えます。

msの中にない要素を消そうとするときには要注意です。 もし

ms.erase(ms.find(42));

としてしまうと、実行時に以下のエラーで死にます。

zsh: abort (core dumped)  ./a.exe

なので、以下のように、値がmsの中に存在することがわかっている場合のみ消すようにすると安全です。

auto it = ms.find(42);
if (it != ms.end()) {
    ms.erase(it);
}

参考

Cygwin + ImageMagick を使ってPDFから連番のJPGを生成

Cygwin + ImageMagick を使ってPDFから連番のJPGを生成する方法についてメモします。

準備

Cygwinインストーラを用いて" ImageMagick"と"ghostscript"をインストールします。

そのあと、Cygwinのコンソールで which convertしてみてください。/bin/convert/usr/bin/convertなどと表示されれば ImageMagickを呼び出す準備ができています。

もし/cygdrive/c/Windows/system32/convertWindowsに組み込まれているコマンド)が表示されるようであれば正しく ImageMagickがインストールされていない可能性があります。 ImageMagickをインストールし直すなり、ImageMagickにPATHを通すなりしてください。

処理

PDFの名前をsource.pdfとします。以下のコマンドにより、0001.jpg, 0002.jpg, ... が生成されます。

$ convert source.pdf %04d.jpg

ただ、上記コマンドだと、生成される画像の品質が非常に悪いことがあります。そのときは--density 300などと解像度を指定します。

$ convert --density 300 source.pdf %04d.jpg

参考

`

TopCoderの環境構築メモ

Windows 10にTopCoderのための環境を構築したときの簡易的なメモです。

Javaランタイムのインストール

Java Appletの入手

  • Googletopcoder java appletで検索して出てくるリンクからアプレットをダウンロード。現時点での直リンクはこちら

サイトリストの追加

http://topcoder.com
http://www.topcoder.com
http://arena.topcoder.com
https://topcoder.com
https://www.topcoder.com
https://arena.topcoder.com   
  • 追加後の画面の一例 f:id:minus9d:20190430092319p:plain

greedプラグインの導入

greedプラグインを入れることで、テンプレートを自動挿入したり、手元でのテストが簡単に行えたりが簡単になる。

私の場合は以下のように設定ファイルを書いている。

  • workspaceとして設定したディレクトリに greed.confという名前で以下のファイルを作成
greed.language.cpp.templateDef.source.templateFile = "my_template.cpp"
greed.language.python.templateDef.source.templateFile = "my_template.py"
  • ディレクトリにmy_template.cppという名前で以下のファイルを作成
#include <iostream>
#include <sstream>
#include <string>
#include <cassert>
#include <cmath>
#include <climits>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <algorithm>
#include <functional>
#include <numeric>
#include <iomanip>
#include <cstring>
#include <fstream>

using namespace std;
typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;

#define REP(i,n) for(int i = 0; i < (int)(n); ++i)
#define FOR(i,a,b) for(int i = (a); i < (int)(b); ++i)
#define ALL(c) (c).begin(), (c).end()
#define SIZE(v) ((int)v.size())

#define pb push_back
#define mp make_pair
#define mt make_tuple

using namespace std;

class ${ClassName} {
    public:
    ${Method.ReturnType} ${Method.Name}(${Method.Params}) {
        return ${Method.ReturnType;zeroval};
    }
};

${CutBegin}
${<TestCode}
${CutEnd}
  • ディレクトリにmy_template.pyという名前で以下のファイルを作成
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import array
from bisect import *
from collections import *
import fractions
import heapq
from itertools import *
import math
import re
import string

class ${ClassName}:
    def ${Method.Name}(self, ${Method.Params}):
        return ${Method.ReturnType;zeroval}

${CutBegin}
${<TestCode}
${CutEnd}

Google Code Jam 2019のインタラクティブ問題を解くときのメモ

Google Code Jam でインタラクティブ問題が初登場したのはリニューアル後の2018年。2019年にも引き続きインタラクティブ問題が出題されたのだけれど、ローカルでのデバッグ用にGoogleが提供するデバッグツールの使い方が2018年から変わっていたので、その使い方を忘れないようにメモしておきます。

準備

まず、手元にPython環境を用意します。手元で動かす限りPython 2でもPython 3でもどちらでもよいようですが、今ならPython 3の一択でしょう。

次に、interactive_runner.pytesting_tool.py、2種類のデバッグツールを、問題文に付記されたリンクからダウンロードします。このうち、interactive_runner.py はインタラクティブ問題に共通するスクリプトで、testing_tool.pyはその問題に特有のスクリプトです。

実装

次に、問題を解くスクリプトを実装します。例えば、Google Code Jam 2019 Round 1Aで出題された Golf Gophers のSmallを解くC++のコードを gist に示します。

実装には以下のことに気をつける必要があります。

  • 標準出力したあとは必ずflushする。
    • これをしないとツールが待ち状態になってTLEしてしまいます。
    • C++でのflushは、標準出力のあとに毎回必ず cout << flush; とすればよいです。
    • Python 3でのflushは、print('answer', flush=True) などとflush=Trueをprintに加えればよいです。もしくは、以下のようなprint2関数を定義しておき、print2('answer')などとprintの代わりにprint2を使うようにする手もあります。
def print2(*args, **kwargs):
    print(*args, **kwargs)
    sys.stdout.flush()
  • デバッグプリントは標準エラー出力で行う。
  • 問題文の指示に従った入出力を行う。
    • 例えば、 Golf Gophers の場合、解答を出力したあとにその結果が正しいか否かをverdictで受け取り、これが-1だったらすみやかにプログラムを終了させねばなりません。そうしないとデバッグツールがずっと待ち状態になってしまいます。

C++のようなコンパイルを要する言語で実装した場合は実行ファイルを生成しておきます。ここでは実行ファイルをa.outとします。

ツールの実行

C/C++にて実行ファイルa.outを生成した場合、以下のようにツールを実行します。

$ python interactive_runner.py python testing_tool.py 0 -- ./a.out

Pythonにてsolve.pyという名前のスクリプトファイルを作成した場合、以下のようにツールを実行します。

$ python interactive_runner.py python testing_tool.py 0 -- python solve.py

(solve.pyに実行権限をつけている場合)
$ python interactive_runner.py python testing_tool.py 0 -- ./solve.py

ここで、第3引数にある'0'はSmall用のテストケースを、'1'はLarge用のテストケースを使うことを意味します。テストケースはtesting_tool.pyに埋め込まれているので自由に改変可能ですが、問題により埋め込み方は異なるので読み解きが必要です。たとえば

Google Code Jam 2019 Round 1Aの Golf Gophers であれば以下の部分を修正する必要がありました。

CASES = ([1, 2, 3],
         [1, 2, 3]) # fill in your own cases
QS = (365, 7)

Google Code Jam 2019 Qual DのDat Baeであれば以下の部分を修正する必要がありました。

def getTestCases(test_number):
  F = (10, 5)[test_number]
  # You can edit or add your own test cases here.
  cases = [Case([1, 2, 3], 4, F), Case([2, 3, 5], 6, F), Case([1000], 1024, F)]
  return cases

ツールの実行結果の見方

無事正答を出すプログラムで上記ツールを実行すると以下のように表示されるはずです。

Judge return code: 0
Judge standard error:
Solution return code: 0
Solution standard error:
(標準エラー出力の結果がここにまとめて表示される)

エラーがある場合は以下のようにどのテストケースで落ちたかが表示されます。

Judge return code: 1
Judge standard error: Case #1 (1) failed: Wrong guess: 3. Expected: 1.

Solution return code: 0
Solution standard error:
(標準エラー出力の結果がここにまとめて表示される)

参考URL

中綴じ小冊子の自作メモ

中綴じ小冊子を自作するために調べた簡単なメモです。

セブンイレブン

セブン‐イレブンのマルチコピー機で同人活動をもっと手軽に・もっと楽しく! にある「中とじ冊子」に従うと作成できます。

kinko's

以下の2種類の方法があるようです。

  1. いちど印刷をして、印刷した紙をスキャンしながら中綴じ製本
  2. 有料でPCを借り、PCから印刷
    • こちらは紙を経由しないので画質は劣化しない。ただし試してません