Ubuntuの再インストール (2017/04/25)

UbuntuのLTS版は2年ごとに新しいバージョンが出るので、そのときにはUbuntuを再インストールする。「Ubuntu 16.04.2 LTS」(2017年4月25日時点での最新のLTS版)を64bitマシン(ハードディスク500GB、メモリ4GB)にインストールする場合を例として手順を説明する。

新規インストールとは若干、手順が異なる。

Ubuntuのダウンロード

①以下のアドレスをクリックする。

https://www.ubuntu.com/download/desktop

②「Download Ubuntu Desktop」で「Download」ボタンをクリックする。

③「Help shape the future of Ubuntu」で「Not now, take me to the download ›」をクリックする。

④「ubuntu-16.04.2-desktop-amd64.iso を開く」で「ファイルを保存する」を選択する。

⑤「OK」ボタンをクリックする。

イメージファイルのDVDへの書き込み

ダウンロードした「ubuntu-16.04.2-desktop-amd64.iso」ファイルをDVDにディスクイメージとして書き込む。

起動デバイスの優先順位の変更

DVDドライブが起動デバイスの優先順位で1位ではない場合、BIOSで1位に変更する。そうしないと、PCに別のOSがインストールされている場合、そのOSが起動してUbuntuをインストールすることができない。

Ubuntuの再インストール

準備が整ったら、Ubuntuの再インストールを始める。

①ディスクイメージを書き込んだDVDをUbuntuをインストールするPCのドライブに挿入し、再起動する。

②「Welcome」で「日本語」を選択する。

③「Ubuntu をインストール」ボタンをクリックする。

④「Ubuntu のインストール準備」で「Ubuntu のインストール中にアップデートをダウンロードする」にチェックを入れる。

⑤「グラフィックス、Wi-Fi 機器、Flash、MP3 やその他のメディアに必要なサードパーティーソフトウェアをインストールする」にチェックを入れる。

⑥「続ける」ボタンをクリックする。

⑦「インストールの種類」で「それ以外」を選択する。

⑧「続ける」ボタンをクリックする。

⑨古いUbuntuをインストールしていたパーティションをダブルクリックする。

⑩「パーティションを編集」の「利用方法」で「ext4 ジャーナリングファイルシステム」を選択する。

⑪「パーティションの初期化」にチェックを入れる。

パーティションを選び間違えていないか確認する(選択したパーティションは初期化される)。

⑬「マウントポイント」で「/」を選択する。

⑭「OK」ボタンをクリックする。

⑮「ディスクへの変更を書き込み、継続しますか?」で「続ける」ボタンをクリックする。

⑯編集したパーティションの「フォーマット」にチェックが入ったことを確認する。

⑰データを保存していたパーティションをダブルクリックする。

⑱「パーティションを編集」の「利用方法」で「ext4 ジャーナリングファイルシステム」を選択する。

⑲「パーティションの初期化」にチェックが入っていないことを確認する。

⑳「マウントポイント」で「/home」を選択する。

㉑「OK」ボタンをクリックする。

㉒編集したパーティションの「フォーマット」にチェックが入っていないことを確認する。

㉓「インストール」ボタンをクリックする。

㉔「どこに住んでいますか?」で「Tokyo」と入力されているのを確認する。

㉕「続ける」ボタンをクリックする。

㉖「キーボードレイアウト」で両方とも「日本語」が選択されているのを確認する。

㉗「続ける」ボタンをクリックする。

㉘「あなたの情報を入力して下さい」で「あなたの名前」に名前を入力する。

㉙「パスワードの入力」にパスワードを入力する。

㉚「パスワードの確認」にもう一度同じパスワードを入力する。

㉛「ログイン時にパスワードを要求する」が選択されているのを確認する。

㉜「続ける」ボタンをクリックする。

㉝「インストールが完了しました」で「今すぐ再起動する」ボタンをクリックする。

㉞トレイが開いたらDVDを取り出してトレイを閉め、「Enter」キーを押す。

㉟ログイン画面でパスワードを入力して「Enter」キーを押す。

文字列の一括置換

プログラムを作成しているとき、変数名だけ変えて、他はすべてコピペしたいときがある。数が多いと面倒なので、Linuxコマンドで一括置換する。

あらかじめ古いテキスト用のファイルと新しいテキスト用のファイルを準備しておく。ここでは「~/py」フォルダーに「old_text.txt」と「new_text.txt」の各ファイルを作成したことにする。

例として、「old_text.txt」ファイルに以下の

古い1
古い2
古い3

をコピー・アンド・ペーストして保存しておく。そして、これを以下のコマンドで書き換える。

$ sed -e "s/古い/新しい/g" ~/py/old_text.txt > ~/py/new_text.txt

すると、「new_text.txt」ファイルに

新しい1
新しい2
新しい3

と置換されて書き込まれる。

(2017/03/16更新)

「ファイル“****”を開く際にエラーが発生しました。」

Windowsで作成したテキストファイルをテキストエディターで開こうとすると、「ファイル“****”を開く際にエラーが発生しました。」と表示が出て、開けない場合がある。

「エンコーディング」は「現在のロケール (UTF-8)」となっている。「再試行」ボタンをクリックしても、やはり「ファイル“****”を開く際にエラーが発生しました。」と表示が出て、開けない。

Windowsで作成したテキストファイルはshift-JISで書かれていると思う。そこで、テキストエディターで「エンコーディング」を「日本語 (SHIFT_JIS)」に変更して「再試行」ボタンをクリックしてみる。だが、今度は「ファイル“****”を開けませんでした。」と表示は変わるが、やはり開けない。

原因ははっきりしないが、テキストエディターで読めるようにするにはとりあえず文字コードをUTF-8に変換するのが手っ取り早い。

例として「ホーム」フォルダーに「file_shift-jis.txt」ファイルがあるとして、これをUTF-8に変換して「file_utf-8.txt」ファイルとする手順を説明する。

○端末に以下のコマンドをコピー&ペーストして「Enter」キーを押す。

nkf -w ~/file_shift-jis.txt > ~/file_utf-8.txt

「file_shift-jis.txt」ファイルはそのまま残り、「file_utf-8.txt」ファイルが新たに作成される。「file_utf-8.txt」ファイルをテキストエディターで開くと、無事にファイルの内容を見ることができる。

(2017/01/10更新)

テレビ視聴アプリの作成

Chinachuの録画予約機能には特に不満はないのだが、テレビ視聴機能が今一つ使い勝手が悪い。ふと、昔、自分でテレビ視聴アプリを作ったことがあったのを思い出し、コンパイルしてみたら、今でも使えるので驚いた。それは今から9年ほど前、私がプログラミングを学んで初めて作ったもので、なつかしい。

プログラムを見ると、関数に引数を渡すということを知らなかったようで、チャンネルごとに関数を作っていた。また、システムに与えるコマンドを直接、プログラムに書き込めばいいものを、わざわざスクリプトファイルを作って、それを呼び出していた。しかもコマンド1つごとにファイルを作っていた。そんなわけでプログラムがやたらと長く、ファイルが50近くもあった。

今から見ると稚拙にもほどがあると思うが、それでも何とかして作り上げてやるという熱意は感じる。それはさて、当時のプログラムに修正を加えたものが、これから作成する視聴アプリである。WindowsでTVTestなどを使っている人から見ると「なにこれ」といったレベルだが、単にテレビを視聴するだけなら十分かなと思う。

準備

①「Ubuntu 16.04 + Chinachu + PT2でテレビ」の記事に基づいて、recpt1で録画できる環境を作る(Chinachuはなくてもよい)。

②端末に以下のコマンドをコピー&ペーストして「Enter」キーを押す。

sudo apt-get -y install libgtk2.0-dev vlc

GUIツールキットとしてGTK+2を使う。

また、再生プレイヤーとしてVLCプレイヤーを使う。

③「[sudo] **** のパスワード:」でパスワードを入力して「Enter」キーを押す。

アプリの作成

①以下のプログラムをテキストエディターにコピー&ペーストし、ファイル名を「tv.c」としてデスクトップに保存する。

#include <gtk/gtk.h>

GtkWidget *table[4];

void system();

// 放送を選択する関数を定義する。
void select_broadcasting(GtkWidget *widget, gpointer data) {
    if (GPOINTER_TO_INT(data) == 0) {
        gtk_widget_show(table[1]);
        gtk_widget_hide(table[2]);
        gtk_widget_hide(table[3]);
    }
    else if (GPOINTER_TO_INT(data) == 1) {
        gtk_widget_show(table[2]);
        gtk_widget_hide(table[3]);
        gtk_widget_hide(table[1]);
    }
    else {  // GPOINTER_TO_INT(data) == 2
        gtk_widget_show(table[3]);
        gtk_widget_hide(table[1]);
        gtk_widget_hide(table[2]);
    }
}

// チャンネルを選択する関数を定義する。
void select_channel(GtkWidget *widget, gpointer data) {
    system("killall recpt1; killall cvlc");
    system("rm temp.ts");
    system(data);
    sleep(2);
    system("cvlc temp.ts &");
}

// ウィンドウを閉じたときの動作を設定する関数を定義する。
void destroy(GtkWidget *widget, gpointer data) {
    system("killall recpt1; killall cvlc");
    system("rm temp.ts");
    gtk_main_quit();
}

int main(int argc, char *argv[]) {
    GtkWidget *window;
    GtkWidget *box;
    GtkWidget *radio_button[3];
    GtkWidget *btn_gr[12], *btn_bs[12], *btn_cs[12];
    GSList *group = NULL;
    gpointer ch1_gr, ch2_gr, ch3_gr, ch4_gr, ch5_gr, ch6_gr, ch7_gr, ch8_gr,
        ch9_gr, ch10_gr, ch11_gr, ch12_gr;
    gpointer ch1_bs, ch2_bs, ch3_bs, ch4_bs, ch5_bs, ch6_bs, ch7_bs, ch8_bs,
        ch9_bs, ch10_bs, ch11_bs, ch12_bs;
    gpointer ch1_cs, ch2_cs, ch3_cs, ch4_cs, ch5_cs, ch6_cs, ch7_cs, ch8_cs,
        ch9_cs, ch10_cs, ch11_cs, ch12_cs;

    // 初期化する。
    gtk_init(&argc, &argv);

    // 地上デジタルの設定を行う。
    ch1_gr = "recpt1 --b25 --strip --sid hd 27 7200 temp.ts &";
    ch2_gr = "recpt1 --b25 --strip --sid hd 26 7200 temp.ts &";
    ch3_gr = "recpt1 --b25 --strip --sid hd 25 7200 temp.ts &";
    ch4_gr = "recpt1 --b25 --strip --sid hd 22 7200 temp.ts &";
    ch5_gr = "recpt1 --b25 --strip --sid hd 21 7200 temp.ts &";
    ch6_gr = "recpt1 --b25 --strip --sid hd 24 7200 temp.ts &";
    ch7_gr = "recpt1 --b25 --strip --sid hd 23 7200 temp.ts &";
    ch8_gr = "recpt1 --b25 --strip --sid hd 16 7200 temp.ts &";
    ch9_gr = "recpt1 --b25 --strip --sid hd 20 7200 temp.ts &";
    ch10_gr = "recpt1 --b25 --strip --sid hd 18 7200 temp.ts &";
    ch11_gr = "recpt1 --b25 --strip --sid hd 32 7200 temp.ts &";
    ch12_gr = "recpt1 --b25 --strip --sid hd 28 7200 temp.ts &";

    // BSの設定を行う。
    ch1_bs = "recpt1 --b25 --strip 101 7200 temp.ts &";
    ch2_bs = NULL;
    ch3_bs = "recpt1 --b25 --strip 103 7200 temp.ts &";
    ch4_bs = "recpt1 --b25 --strip 141 7200 temp.ts &";
    ch5_bs = "recpt1 --b25 --strip 151 7200 temp.ts &";
    ch6_bs = "recpt1 --b25 --strip 161 7200 temp.ts &";
    ch7_bs = "recpt1 --b25 --strip 171 7200 temp.ts &";
    ch8_bs = "recpt1 --b25 --strip 181 7200 temp.ts &";
    ch9_bs = NULL;
    ch10_bs = NULL;
    ch11_bs = "recpt1 --b25 --strip 211 7200 temp.ts &";
    ch12_bs = "recpt1 --b25 --strip 222 7200 temp.ts &";

    // CSの設定を行う。
    ch1_cs = NULL;
    ch2_cs = NULL;
    ch3_cs = NULL;
    ch4_cs = NULL;
    ch5_cs = NULL;
    ch6_cs = NULL;
    ch7_cs = NULL;
    ch8_cs = NULL;
    ch9_cs = NULL;
    ch10_cs = NULL;
    ch11_cs = NULL;
    ch12_cs = NULL;

    // ウィンドウを作成する。
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_widget_set_size_request(window, 140, 140);
    gtk_window_set_resizable(GTK_WINDOW (window), FALSE);
    gtk_window_set_keep_above(GTK_WINDOW(window), TRUE);

    // ボックスを作成する。
    box = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(window), box);

    // 放送選択用のテーブルを作成する。
    table[0] = gtk_table_new(3, 1, FALSE);
    gtk_box_pack_start(GTK_BOX(box), table[0], FALSE, TRUE, 0);

    // 放送選択用のラジオボタンを作成する。
    radio_button[0] = gtk_radio_button_new_with_label(group, "GR");
    radio_button[1] = gtk_radio_button_new_with_label_from_widget(
        GTK_RADIO_BUTTON(radio_button[0]), "BS");
    radio_button[2] = gtk_radio_button_new_with_label_from_widget(
        GTK_RADIO_BUTTON(radio_button[0]), "CS");

    // 放送選択用のラジオボタンをテーブルに設置する。
    gtk_table_attach_defaults(GTK_TABLE(table[0]), radio_button[0],
                                        0, 1, 0, 1);
    gtk_table_attach_defaults(GTK_TABLE(table[0]), radio_button[1],
                                        1, 2, 0, 1);
    gtk_table_attach_defaults(GTK_TABLE(table[0]), radio_button[2],
                                        2, 3, 0, 1);
    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(radio_button[0]), TRUE);

    // チャンネル選択用のテーブルを作成する。
    table[1] = gtk_table_new(3, 4, FALSE);
    table[2] = gtk_table_new(3, 4, FALSE);
    table[3] = gtk_table_new(3, 4, FALSE);

    // チャンネル選択用のテーブルをボックスに設置する。
    gtk_box_pack_start(GTK_BOX(box), table[1], FALSE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(box), table[2], FALSE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(box), table[3], FALSE, TRUE, 0);

    // 地デジチャンネル選択用のボタンを作成する。
    btn_gr[0] = gtk_button_new_with_label("1");
    btn_gr[1] = gtk_button_new_with_label("2");
    btn_gr[2] = gtk_button_new_with_label("3");
    btn_gr[3] = gtk_button_new_with_label("4");
    btn_gr[4] = gtk_button_new_with_label("5");
    btn_gr[5] = gtk_button_new_with_label("6");
    btn_gr[6] = gtk_button_new_with_label("7");
    btn_gr[7] = gtk_button_new_with_label("8");
    btn_gr[8] = gtk_button_new_with_label("9");
    btn_gr[9] = gtk_button_new_with_label("10");
    btn_gr[10] = gtk_button_new_with_label("11");
    btn_gr[11] = gtk_button_new_with_label("12");

    // 地デジチャンネル選択用のボタンをテーブルに設置する。
    gtk_table_attach_defaults(GTK_TABLE(table[1]), btn_gr[0], 0, 1, 0, 1);
    gtk_table_attach_defaults(GTK_TABLE(table[1]), btn_gr[1], 1, 2, 0, 1);
    gtk_table_attach_defaults(GTK_TABLE(table[1]), btn_gr[2], 2, 3, 0, 1);
    gtk_table_attach_defaults(GTK_TABLE(table[1]), btn_gr[3], 0, 1, 1, 2);
    gtk_table_attach_defaults(GTK_TABLE(table[1]), btn_gr[4], 1, 2, 1, 2);
    gtk_table_attach_defaults(GTK_TABLE(table[1]), btn_gr[5], 2, 3, 1, 2);
    gtk_table_attach_defaults(GTK_TABLE(table[1]), btn_gr[6], 0, 1, 2, 3);
    gtk_table_attach_defaults(GTK_TABLE(table[1]), btn_gr[7], 1, 2, 2, 3);
    gtk_table_attach_defaults(GTK_TABLE(table[1]), btn_gr[8], 2, 3, 2, 3);
    gtk_table_attach_defaults(GTK_TABLE(table[1]), btn_gr[9], 0, 1, 3, 4);
    gtk_table_attach_defaults(GTK_TABLE(table[1]), btn_gr[10], 1, 2, 3, 4);
    gtk_table_attach_defaults(GTK_TABLE(table[1]), btn_gr[11], 2, 3, 3, 4);

    // BSチャンネル選択用のボタンを作成する。
    btn_bs[0] = gtk_button_new_with_label("1");
    btn_bs[1] = gtk_button_new_with_label("2");
    btn_bs[2] = gtk_button_new_with_label("3");
    btn_bs[3] = gtk_button_new_with_label("4");
    btn_bs[4] = gtk_button_new_with_label("5");
    btn_bs[5] = gtk_button_new_with_label("6");
    btn_bs[6] = gtk_button_new_with_label("7");
    btn_bs[7] = gtk_button_new_with_label("8");
    btn_bs[8] = gtk_button_new_with_label("9");
    btn_bs[9] = gtk_button_new_with_label("10");
    btn_bs[10] = gtk_button_new_with_label("11");
    btn_bs[11] = gtk_button_new_with_label("12");

    // BSチャンネル選択用のボタンをデーブルに設置する。
    gtk_table_attach_defaults(GTK_TABLE(table[2]), btn_bs[0], 0, 1, 0, 1);
    gtk_table_attach_defaults(GTK_TABLE(table[2]), btn_bs[1], 1, 2, 0, 1);
    gtk_table_attach_defaults(GTK_TABLE(table[2]), btn_bs[2], 2, 3, 0, 1);
    gtk_table_attach_defaults(GTK_TABLE(table[2]), btn_bs[3], 0, 1, 1, 2);
    gtk_table_attach_defaults(GTK_TABLE(table[2]), btn_bs[4], 1, 2, 1, 2);
    gtk_table_attach_defaults(GTK_TABLE(table[2]), btn_bs[5], 2, 3, 1, 2);
    gtk_table_attach_defaults(GTK_TABLE(table[2]), btn_bs[6], 0, 1, 2, 3);
    gtk_table_attach_defaults(GTK_TABLE(table[2]), btn_bs[7], 1, 2, 2, 3);
    gtk_table_attach_defaults(GTK_TABLE(table[2]), btn_bs[8], 2, 3, 2, 3);
    gtk_table_attach_defaults(GTK_TABLE(table[2]), btn_bs[9], 0, 1, 3, 4);
    gtk_table_attach_defaults(GTK_TABLE(table[2]), btn_bs[10], 1, 2, 3, 4);
    gtk_table_attach_defaults(GTK_TABLE(table[2]), btn_bs[11], 2, 3, 3, 4);

    // CSチャンネル選択用のボタンを作成する。
    btn_cs[0] = gtk_button_new_with_label("1");
    btn_cs[1] = gtk_button_new_with_label("2");
    btn_cs[2] = gtk_button_new_with_label("3");
    btn_cs[3] = gtk_button_new_with_label("4");
    btn_cs[4] = gtk_button_new_with_label("5");
    btn_cs[5] = gtk_button_new_with_label("6");
    btn_cs[6] = gtk_button_new_with_label("7");
    btn_cs[7] = gtk_button_new_with_label("8");
    btn_cs[8] = gtk_button_new_with_label("9");
    btn_cs[9] = gtk_button_new_with_label("10");
    btn_cs[10] = gtk_button_new_with_label("11");
    btn_cs[11] = gtk_button_new_with_label("12");

    // CSチャンネル選択用のボタンをデーブルに設置する。
    gtk_table_attach_defaults(GTK_TABLE(table[3]), btn_cs[0], 0, 1, 0, 1);
    gtk_table_attach_defaults(GTK_TABLE(table[3]), btn_cs[1], 1, 2, 0, 1);
    gtk_table_attach_defaults(GTK_TABLE(table[3]), btn_cs[2], 2, 3, 0, 1);
    gtk_table_attach_defaults(GTK_TABLE(table[3]), btn_cs[3], 0, 1, 1, 2);
    gtk_table_attach_defaults(GTK_TABLE(table[3]), btn_cs[4], 1, 2, 1, 2);
    gtk_table_attach_defaults(GTK_TABLE(table[3]), btn_cs[5], 2, 3, 1, 2);
    gtk_table_attach_defaults(GTK_TABLE(table[3]), btn_cs[6], 0, 1, 2, 3);
    gtk_table_attach_defaults(GTK_TABLE(table[3]), btn_cs[7], 1, 2, 2, 3);
    gtk_table_attach_defaults(GTK_TABLE(table[3]), btn_cs[8], 2, 3, 2, 3);
    gtk_table_attach_defaults(GTK_TABLE(table[3]), btn_cs[9], 0, 1, 3, 4);
    gtk_table_attach_defaults(GTK_TABLE(table[3]), btn_cs[10], 1, 2, 3, 4);
    gtk_table_attach_defaults(GTK_TABLE(table[3]), btn_cs[11], 2, 3, 3, 4);

    // ラジオボタンを選択したときの動作を設定する。
    g_signal_connect(G_OBJECT(radio_button[0]), "toggled",
                              G_CALLBACK(select_broadcasting),
                              GINT_TO_POINTER(0));
    g_signal_connect(G_OBJECT(radio_button[1]), "toggled",
                              G_CALLBACK(select_broadcasting),
                              GINT_TO_POINTER(1));
    g_signal_connect(G_OBJECT(radio_button[2]), "toggled",
                              G_CALLBACK(select_broadcasting),
                              GINT_TO_POINTER(2));

    // 地デジチャンネルボタンをクリックしたときの動作を設定する。
    g_signal_connect(G_OBJECT(btn_gr[0]), "clicked",
                              G_CALLBACK(select_channel), ch1_gr);
    g_signal_connect(G_OBJECT(btn_gr[1]), "clicked",
                              G_CALLBACK(select_channel), ch2_gr);
    g_signal_connect(G_OBJECT(btn_gr[2]), "clicked",
                              G_CALLBACK(select_channel), ch3_gr);
    g_signal_connect(G_OBJECT(btn_gr[3]), "clicked",
                              G_CALLBACK(select_channel), ch4_gr);
    g_signal_connect(G_OBJECT(btn_gr[4]), "clicked",
                              G_CALLBACK(select_channel), ch5_gr);
    g_signal_connect(G_OBJECT(btn_gr[5]), "clicked",
                              G_CALLBACK(select_channel), ch6_gr);
    g_signal_connect(G_OBJECT(btn_gr[6]), "clicked",
                              G_CALLBACK(select_channel), ch7_gr);
    g_signal_connect(G_OBJECT(btn_gr[7]), "clicked",
                              G_CALLBACK(select_channel), ch8_gr);
    g_signal_connect(G_OBJECT(btn_gr[8]), "clicked",
                              G_CALLBACK(select_channel), ch9_gr);
    g_signal_connect(G_OBJECT(btn_gr[9]), "clicked",
                              G_CALLBACK(select_channel), ch10_gr);
    g_signal_connect(G_OBJECT(btn_gr[10]), "clicked",
                              G_CALLBACK(select_channel), ch11_gr);
    g_signal_connect(G_OBJECT(btn_gr[11]), "clicked",
                              G_CALLBACK(select_channel), ch12_gr);

    // BSチャンネルボタンをクリックしたときの動作を設定する。
    g_signal_connect(G_OBJECT(btn_bs[0]), "clicked",
                              G_CALLBACK(select_channel), ch1_bs);
    g_signal_connect(G_OBJECT(btn_bs[1]), "clicked",
                              G_CALLBACK(select_channel), ch2_bs);
    g_signal_connect(G_OBJECT(btn_bs[2]), "clicked",
                              G_CALLBACK(select_channel), ch3_bs);
    g_signal_connect(G_OBJECT(btn_bs[3]), "clicked",
                              G_CALLBACK(select_channel), ch4_bs);
    g_signal_connect(G_OBJECT(btn_bs[4]), "clicked",
                              G_CALLBACK(select_channel), ch5_bs);
    g_signal_connect(G_OBJECT(btn_bs[5]), "clicked",
                              G_CALLBACK(select_channel), ch6_bs);
    g_signal_connect(G_OBJECT(btn_bs[6]), "clicked",
                              G_CALLBACK(select_channel), ch7_bs);
    g_signal_connect(G_OBJECT(btn_bs[7]), "clicked",
                              G_CALLBACK(select_channel), ch8_bs);
    g_signal_connect(G_OBJECT(btn_bs[8]), "clicked",
                              G_CALLBACK(select_channel), ch9_bs);
    g_signal_connect(G_OBJECT(btn_bs[9]), "clicked",
                              G_CALLBACK(select_channel), ch10_bs);
    g_signal_connect(G_OBJECT(btn_bs[10]), "clicked",
                              G_CALLBACK(select_channel), ch11_bs);
    g_signal_connect(G_OBJECT(btn_bs[11]), "clicked",
                              G_CALLBACK(select_channel), ch12_bs);

    // CSチャンネルボタンをクリックしたときの動作を設定する。
    g_signal_connect(G_OBJECT(btn_cs[0]), "clicked",
                              G_CALLBACK(select_channel), ch1_cs);
    g_signal_connect(G_OBJECT(btn_cs[1]), "clicked",
                              G_CALLBACK(select_channel), ch2_cs);
    g_signal_connect(G_OBJECT(btn_cs[2]), "clicked",
                              G_CALLBACK(select_channel), ch3_cs);
    g_signal_connect(G_OBJECT(btn_cs[3]), "clicked",
                              G_CALLBACK(select_channel), ch4_cs);
    g_signal_connect(G_OBJECT(btn_cs[4]), "clicked",
                              G_CALLBACK(select_channel), ch5_cs);
    g_signal_connect(G_OBJECT(btn_cs[5]), "clicked",
                              G_CALLBACK(select_channel), ch6_cs);
    g_signal_connect(G_OBJECT(btn_cs[6]), "clicked",
                              G_CALLBACK(select_channel), ch7_cs);
    g_signal_connect(G_OBJECT(btn_cs[7]), "clicked",
                              G_CALLBACK(select_channel), ch8_cs);
    g_signal_connect(G_OBJECT(btn_cs[8]), "clicked",
                              G_CALLBACK(select_channel), ch9_cs);
    g_signal_connect(G_OBJECT(btn_cs[9]), "clicked",
                              G_CALLBACK(select_channel), ch10_cs);
    g_signal_connect(G_OBJECT(btn_cs[10]), "clicked",
                              G_CALLBACK(select_channel), ch11_cs);
    g_signal_connect(G_OBJECT(btn_cs[11]), "clicked",
                              G_CALLBACK(select_channel), ch12_cs);

    // ウィンドウを閉じたときの動作を設定する。
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);

    // ウィンドウを表示する。
    gtk_widget_show_all(window);
    gtk_widget_hide(table[2]);
    gtk_widget_hide(table[3]);

    gtk_main();

    return 0;
}

②端末に以下のコマンドをコピー&ペーストして「Enter」キーを押す。

gcc -Wall -g ~/デスクトップ/tv.c -o ~/デスクトップ/tv `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`

デスクトップに「tv」ファイルが生成する。これが視聴アプリである。

使い方

起動

○デスクトップの「tv」ファイル(「tv.c」ファイルではない)をダブルクリックする。

視聴アプリが起動する。

視聴

①見たい放送を選択する。

地デジとBSには私が住んでいる地域に合わせた設定がしてある。CSの設定はしていない。

②見たいチャンネルをクリックする。

デスクトップに「temp.ts」ファイルが生成され、VLCプレイヤーで再生される。録画している番組をリアルタイムで再生することによって視聴の代用としているわけである。

終了

○視聴アプリの「×」ボタンをクリックする。

VLCプレイヤーも終了し、デスクトップの「temp.ts」ファイルも削除される。

(2017/01/07更新)

「システムプログラムの問題が見つかりました」

Ubuntuを起動すると、「システムプログラムの問題が見つかりました」と表示されることがある。一度、表示されると、以降、起動するたびに表示されるようになるので鬱陶しい。

何らかの原因でクラッシュが発生するとcrashファイルが「/var/crash」フォルダーに生成する。そのcrashファイルが原因のようである。したがって、これを削除すれば、以降、表示されなくなる。

私の場合は大抵VirtualBoxが原因である。仮想マシンが突然クラッシュしたとき、crashファイルを生成させることがある。また、仮想マシンを終了させるのを忘れて実マシンを終了してしまったときもcrashファイルを生成させることがある。

①以下のコマンドを端末にコピー&ペーストして「Enter」キーを押す。

ls /var/crash

crashファイルの名前が表示される。一応、何がクラッシュしたのか確認しておく。

②以下のコマンドを端末にコピー&ペーストして「Enter」キーを押す。

sudo rm /var/crash/*

③「[sudo] **** のパスワード:」でパスワードを入力して「Enter」キーを押す。

crashファイルが削除される。

(2017/02/13更新)