20200126のLinuxに関する記事は10件です。

LPIC101勉強メモ

はじめに

先日、LPIC101を受験して無事に合格できたので忘れないうちに、勉強法やら詰まったところなど、勉強メモとして書き残しておこうと思います!
勉強期間:1ヶ月ほど

LPIC101勉強法

どんな勉強法がいいのか、もちろん先人の方たちを参考にするのが間違いなく良いはずなので、調べてみて王道かな?と思った「あずき本」と「Ping-t」で進めることにしました!

Linux教科書 LPICレベル1 Version5.0対応(通称:あずき本)

まずは1週間ほどかけてあずき本の101終了のところまで読み進める。
理解度はまだまだ低かったですが、ここに時間はかけませんでした。
なんとなーくどんな内容かなくらいで読みきっちゃいました。

Ping-tで全部「金」になるまで

Ping-tはLPIC101の受験範囲までは無料なのでこちらで勉強。
ちなみに受験料の割引もあるので割引を使ってほんの少しお得に受験しました。

みなさん「Ping-tで全ての問題を金になるまで〜」と言っていたのですが、効率の良い使い方がいまいちわからず、勉強がのってくるまで少し時間がかかりスタートダッシュに失敗してしまいました。

Ping-tに関してはLPIC101だと4つの分野に分かれているので、
スクリーンショット 2020-01-26 22.09.11.png
1分野の中のひとつのパートに区切って、小さいパートの中で20問ずつくらいを地道に銀のボックスに入れていくのが早かったです。
初めは、ほぼ全部の解説を読んでいくのですごく時間がかかりましたが、進めるごとに早くなっていって全部銀に入る頃にはすっかり楽しくなっていました!

受験日が近くなったら

受験日が近づいてきたら、コマ問(コマンドの問題だけを集めたもの)を始めました。
全て記述なのでオプションやらフルパスやらなかなか頭に入らないことも多かった問題です。
コマ問もある程度解けるようになったら(と言ってもわたしは正答率50%くらいのところで)模擬試験に切り替えました。
模擬試験60問。これを始める頃にはだいぶPing-tの問題に慣れていた気がするので、解く時間もだいぶ早くなっていました。
安定して90%以上をキープできるようになったところで受験。

おわりに

  • 聞き回しが複雑だったりして、思っていたより難しかった
  • コマンド問題(記述)は5−6問ほどで意外と少なかった
  • Ping-tだけではなく、あずき本も読み込む必要があると思った

わたしはコマンドの部分が特に苦手でオプションが全然覚えられなかったのですが、とにかく意味を理解しよう!と何の略なのか調べてみたり、どうしてもわからないものに関しては自分以外にはわからないような変なインパクトのある別名をつけたりして覚えました。
そのおかげかコマンドの問題は割とできたのですが、他の分野ではPing-tの解説くらいしか読んでいなかったので、システムアーキテクチャの分野など深く内容を聞かれた時にはさっぱりわからなかったです。
先人の方々が言う通りPing-tだけで合格はできる気がしますが、わたしがもう一度受験するなら、初めにあずき本をさらっと読んで、模擬試験90%以上まできたらもう一度あずき本に戻って内容の理解をさらに深めておきたいなと思いました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでCMakeビルド環境を作る

はじめに

  • WindowsPC上で、Linuxに対応したCppプロジェクトを作成したい
  • CMakeのDockerコンテナを探しても見つからなかったので今回作成した

良い点

  • ローカルフォルダをマウントするよう設定
    • ローカルフォルダ上でコードを編集すると、すぐにコンテナへ変更が反映される
    • コンテナにログインせずとも、VS code などのエディタで編集できる
    • ビルド後のファイルもdocker cp コマンドを使わずに取り出せる

ダウンロード

  • この記事で紹介したDocker imageは、DockerHub からダウンロードすることができます。

フォルダ構成

  • 下図のようにDockerfile, docker-compose.ymlを配置する
    • ソースコードは記事の下部に記載
  • cppフォルダは、docker-compose up によって自動生成される
    • このフォルダ内に ソースコードを置く
tree
フォルダ構成
├── Dockerfile
├── docker-compose.yml
└── cpp  ← 自動生成される

Dockerfile

Dockerfile
FROM ubuntu:18.04

RUN apt-get update && \
    apt-get install -y sudo && \
    apt-get install -y vim && \
    apt-get install -y wget

# Install compilers.
RUN apt-get install -y gcc && \
    apt-get install -y g++

RUN apt-get install -y cmake 3.10.2

# SET path to compilers.
# https://stackoverflow.com/questions/17275348/how-to-specify-new-gcc-path-for-cmake
ENV CC=/usr/bin/gcc \
    CXX=/usr/bin/g++

# OpenBlas, Lapack
RUN apt-get install -y libopenblas-dev  && \
    apt-get install -y liblapack-dev

# Please use below directory to install cpp libraries.
WORKDIR $HOME/usr/
RUN mkdir /library

CMD ["bash"]

docker-compose.yml

docker-compose.yml
version: '3'

services:
  cmake:
    container_name: cmake_container
    build:
      context: .
      dockerfile: Dockerfile

    tty: true
    command: /bin/bash

    volumes:
      - ./cpp:/usr/cpp

使い方

コンテナの起動

ローカル環境
# コンテナの初回起動
docker-compose up -d

# 起動中のコンテナに入る
docker-compose run cmake

ソースコードのコンパイル

@make_container
# コンテナ内のcppフォルダに入る
cd cpp

# build フォルダを作成し入る
mkdir build
cd build

# cmakeの実行
cmake ../

# makeの実行
make

活用例

  • ①cppフォルダ内に、.cppファイルやCMakeLists.txtを置く
    • VSCodeなど、自分の使い慣れたエディタで編集する
  • ②コンテナ内に入り、ビルド実行
  • ③ビルド後のファイルは、ローカル環境のcppフォルダから取り出すことができる image.png

注意点

  • OS依存のライブラリは、cppフォルダ内で展開・インストールしないでください
    • 筆者は以下のエラーメッセージが表示され、コンテナのマウントが解除されてしまいました。
    • docker compose error while creating mount source path...
    • 依存ライブラリはコンテナ内で別フォルダを作り、そこにインストールしてください
      • 例) OpenCV

チュートリアル

  • 以下では、Hello CMake!と書かれたソースコードをビルドするまでをご紹介します。
  • cppフォルダ内に以下の2つのファイルを作成してください。
cppフォルダ内の構成
cpp
├── main.cpp
└── CMakeLists.txt
  • 各ファイルに以下の内容をコピーしてください。
main.cpp
#include <iostream>
#include <string>

int main(void){
    std::cout << "Hello CMake!" << std::endl;
    return 0;
}
CMakeLists.txt
# プロジェクト名
project("testCMake")

# CMakeのバージョンを設定
cmake_minimum_required(VERSION 2.8)

# testCMake.outという実行ファイルをmain.cppから作成
add_executable(testCMake main.cpp)
  • 次に、コンテナでのビルド作業に入ります。
  • 以下のコマンドを順に入力してビルドします。
@cmake_container
# コンテナ内のcppフォルダに入る
cd cpp

# ビルドフォルダを作る
mkdir build
cd build

# ビルド実行
cmake ../
make
  • 最後にビルドしたプログラムを走らせてみましょう!
    • ./testCMakeと入力し、Hello CMake!と出力されれば成功です。
@cmake_container
./testCMake 
Hello CMake!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CMake on DockerでC++コードを簡単ビルド

はじめに

  • WindowsPC上で、Linuxに対応したCppプロジェクトを作成したい
  • CMakeのDockerコンテナを探しても見つからなかったので今回作成した

良い点

  • ローカルフォルダをマウントするよう設定
    • ローカルフォルダ上でコードを編集すると、すぐにコンテナへ変更が反映される
    • コンテナにログインせずとも、VS code などのエディタで編集できる
    • ビルド後のファイルもdocker cp コマンドを使わずに取り出せる

ダウンロード

  • この記事で紹介したDocker imageは、DockerHub からダウンロードすることができます。

フォルダ構成

  • 下図のようにDockerfile, docker-compose.ymlを配置する
    • ソースコードは記事の下部に記載
  • cppフォルダは、docker-compose up によって自動生成される
    • このフォルダ内に ソースコードを置く
tree
フォルダ構成
├── Dockerfile
├── docker-compose.yml
└── cpp  ← 自動生成される

Dockerfile

Dockerfile
FROM ubuntu:18.04

RUN apt-get update && \
    apt-get install -y sudo && \
    apt-get install -y vim && \
    apt-get install -y wget

# Install compilers.
RUN apt-get install -y gcc && \
    apt-get install -y g++

RUN apt-get install -y cmake 3.10.2

# SET path to compilers.
# https://stackoverflow.com/questions/17275348/how-to-specify-new-gcc-path-for-cmake
ENV CC=/usr/bin/gcc \
    CXX=/usr/bin/g++

# OpenBlas, Lapack
RUN apt-get install -y libopenblas-dev  && \
    apt-get install -y liblapack-dev

# Please use below directory to install cpp libraries.
WORKDIR $HOME/usr/
RUN mkdir /library

CMD ["bash"]

docker-compose.yml

docker-compose.yml
version: '3'

services:
  cmake:
    container_name: cmake_container
    build:
      context: .
      dockerfile: Dockerfile

    tty: true
    command: /bin/bash

    volumes:
      - ./cpp:/usr/cpp

使い方

コンテナの起動

ローカル環境
# コンテナの初回起動
docker-compose up -d

# 起動中のコンテナに入る
docker-compose run cmake

ソースコードのコンパイル

@make_container
# コンテナ内のcppフォルダに入る
cd cpp

# build フォルダを作成し入る
mkdir build
cd build

# cmakeの実行
cmake ../

# makeの実行
make

活用例

  • ①cppフォルダ内に、.cppファイルやCMakeLists.txtを置く
    • VSCodeなど、自分の使い慣れたエディタで編集する
  • ②コンテナ内に入り、ビルド実行
  • ③ビルド後のファイルは、ローカル環境のcppフォルダから取り出すことができる image.png

注意点

  • OS依存のライブラリは、cppフォルダ内で展開・インストールしないでください
    • 筆者は以下のエラーメッセージが表示され、コンテナのマウントが解除されてしまいました。
    • docker compose error while creating mount source path...
    • 依存ライブラリはコンテナ内で別フォルダを作り、そこにインストールしてください
      • 例) OpenCV

チュートリアル

  • 以下では、Hello CMake!と書かれたソースコードをビルドするまでをご紹介します。
  • cppフォルダ内に以下の2つのファイルを作成してください。
cppフォルダ内の構成
cpp
├── main.cpp
└── CMakeLists.txt
  • 各ファイルに以下の内容をコピーしてください。
main.cpp
#include <iostream>
#include <string>

int main(void){
    std::cout << "Hello CMake!" << std::endl;
    return 0;
}
CMakeLists.txt
# プロジェクト名
project("testCMake")

# CMakeのバージョンを設定
cmake_minimum_required(VERSION 2.8)

# testCMake.outという実行ファイルをmain.cppから作成
add_executable(testCMake main.cpp)
  • 次に、コンテナでのビルド作業に入ります。
  • 以下のコマンドを順に入力してビルドします。
@cmake_container
# コンテナ内のcppフォルダに入る
cd cpp

# ビルドフォルダを作る
mkdir build
cd build

# ビルド実行
cmake ../
make
  • 最後にビルドしたプログラムを走らせてみましょう!
    • ./testCMakeと入力し、Hello CMake!と出力されれば成功です。
@cmake_container
./testCMake 
Hello CMake!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

xfce4のターミナルのカーソルの種類を変更する

はじめに

太いカーソルが見づらくてシャープにしたいと思い変更しました。

方法

.config/xfce4/terminal/terminalrc
[Configuration]
...
...
MiscCursorShape= [ ここを変更します ]

次の3つの中から選ぶ

TERMINAL_CURSOR_SHAPE_BLOCK (the default)
TERMINAL_CURSOR_SHAPE_IBEAM
TERMINAL_CURSOR_SHAPE_UNDERLINE

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

自作ウィンドウマネージャ(Xウィンドウマネージャっているの?2)

今回は、ウィンドウマネージャを自作してみたいと思います。
前回、Xサーバはウィンドウマネージャが無くてもよいことを話題にしました、その続編となっていますので、前回「Xウィンドウマネージャっているの?」も合わせてご覧ください。

 使用OS:ArchLinux(VirtualBoxゲスト)

前提

下記のパッケージ等は、事前にインストールされているという前提で話を進めます。
・前回インストールしたパッケージ
・gcc
・wget
・nano(などのテキストエディター)

前回同様、ttyコンソールの状態から話を進めます。

まずは、ソースコード

tinywm.c
/* TinyWM is written by Nick Welch <mack@incise.org>, 2005.
 *
 * This software is in the public domain
 * and is provided AS IS, with NO WARRANTY. */

#include <X11/Xlib.h>

#define MAX(a, b) ((a) > (b) ? (a) : (b))

int main()
{
    Display * dpy;
    Window root;
    XWindowAttributes attr;
    XButtonEvent start;
    XEvent ev;

    if(!(dpy = XOpenDisplay(0x0))) return 1;

    root = DefaultRootWindow(dpy);

    XGrabKey(dpy, XKeysymToKeycode(dpy, XStringToKeysym("F1")), Mod1Mask, root,
            True, GrabModeAsync, GrabModeAsync);
    XGrabButton(dpy, 1, Mod1Mask, root, True, ButtonPressMask, GrabModeAsync,
            GrabModeAsync, None, None);
    XGrabButton(dpy, 3, Mod1Mask, root, True, ButtonPressMask, GrabModeAsync,
            GrabModeAsync, None, None);

    for(;;)
    {
        XNextEvent(dpy, &ev);
        if(ev.type == KeyPress && ev.xkey.subwindow != None)
            XRaiseWindow(dpy, ev.xkey.subwindow);
        else if(ev.type == ButtonPress && ev.xbutton.subwindow != None)
        {
            XGrabPointer(dpy, ev.xbutton.subwindow, True,
                    PointerMotionMask|ButtonReleaseMask, GrabModeAsync,
                    GrabModeAsync, None, None, CurrentTime);
            XGetWindowAttributes(dpy, ev.xbutton.subwindow, &attr);
            start = ev.xbutton;
        }
        else if(ev.type == MotionNotify)
        {
            int xdiff, ydiff;
            while(XCheckTypedEvent(dpy, MotionNotify, &ev));
            xdiff = ev.xbutton.x_root - start.x_root;
            ydiff = ev.xbutton.y_root - start.y_root;
            XMoveResizeWindow(dpy, ev.xmotion.window,
                attr.x + (start.button==1 ? xdiff : 0),
                attr.y + (start.button==1 ? ydiff : 0),
                MAX(1, attr.width + (start.button==3 ? xdiff : 0)),
                MAX(1, attr.height + (start.button==3 ? ydiff : 0)));
        }
        else if(ev.type == ButtonRelease)
            XUngrabPointer(dpy, CurrentTime);
    }
}

http://incise.org/tinywm.html のソースコードをそのままコピペしたものです。

もし、インターネットからダウンロードするのなら、以下の方法があります。

mkdir ~/work1
cd ~/work1
wget https://raw.githubusercontent.com/mackstann/tinywm/master/tinywm.c

ソースコードの中に三ヵ所、 Mod1Mask があります、これはAltキーを意味します。
VirtualBoxゲストだと、ホスト側がAltキーを優先的に使用してしまい、うまくいきません。
三ヵ所とも ControlMask に変えてください。

nano tinywm.c
#テキストエディターで編集

次に、コンパイル

gcc -o tinywm tinywm.c -lX11

tinywmというファイルが出来上がっているはずです。これが出来立てほやほやのウィンドウマネージャです。

そして、Xサーバ起動

Xサーバ起動直後、ウィンドウマネージャ(tinywm)とxtermが実行されるように設定します。

echo "~/work1/tinywm& xterm" > ~/.xinitrc
#注意、.xinitrcが存在する場合、上書きします。

Xサーバを起動するために次のコマンドを打ちます。

startx

VirtualBox_ArchLinux_26_01_2020_09_28_12.png

機能は、
・Ctrl+左クリックして移動(もともとは、Alt+左クリック)
・Ctrl+右クリックしてサイズ変更(もともとは、Alt+右クリック)
・Ctrl+F1キーで前面に表示(もともとは、Alt+F1)
しかありませんが、前回「Xウィンドウマネージャっているの?」では移動・サイズ変更するためにコマンドを入力していたことに比べれば、はるかに快適です。

Xサーバを終わらせる

前回と同様、最初(.xinitrc)に実行したxtermで

exit

と打てばXサーバは終了し、最初の画面に戻ります。

最後に

今回、ウィンドウマネージャをソースファイルからコンパイルし、実行しました。
ソースファイルは50行ほどの短いものです、ウィンドウマネージャを「厳かで近寄りがたい」と感じていた方にとっては、普通のXアプリと違いがあまりないことに気づき、親近感が持てるようになったのではないでしょうか。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

n回失敗するまで繰り返し続けるlinuxコマンド ワンライナー

How do I write a retry logic in script to keep retrying to run it upto 5 times?

より拝借。5回くらい同じコマンドを繰り返す。

for i in 1 2 3 4 5; do command && break || sleep 15; done
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

標準出力をファイルに書き出す

標準出力をファイルに上書き保存する

$ echo 'hoge' > sample.txt

標準出力をファイルに追記する保存する

$ echo 'hoge' >> sample.txt

改行を表現したい場合

  • -eオプションをつける
$ echo -e "aaa\nbbb\nccc" > sample.txt

or

$ echo -e aaa\\nbbb\\nccc > sample.txt
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

cursesとC言語でLinuxのコマンドライン上で動くアクションゲームを作ってみた

はじめに

cursesは、slコマンドやローグライクゲームの元祖「Rogue」で使われている端末制御ライブラリです。これを使えば、Linuxのコマンドライン上で文字を自由自在に表示できるようになります。C言語の学習を一通り終えたプログラミング初心者や、ゲームを作りたいけど画像や音楽をあまり使いたくない人におすすめです。Linuxとgccを使ってC言語の学習をしてきた人ならすぐに開発を始められます。Windows環境の方は、WSLやVirtualBox等でLinux環境を用意してください。今回は、cursesを使ってアクションゲームを制作しました。cursesの導入と基本的な使い方もあわせて紹介したいと思います。

制作したアクションゲーム


ZombieTower
ゾンビを倒しながら塔を登っていくゲームです。
起動方法と遊び方はリンク先のREADMEに書いてあります。
ソースコードは長いのでリンク先で見てください。

cursesの導入

C言語でcursesを使うためには、パッケージをインストールする必要があります。

Debian / Ubuntu

$ sudo apt-get install libncurses5-dev libncursesw5-dev

RHEL / CentOS

$ sudo yum install ncurses-devel

Hello, World!

cursesの動作確認をします。
以下のファイルを作成してください。

Main.c
#include <curses.h>

int main()
{
  initscr();
  printw("Hello, World!");
  refresh();
  getch();
  endwin();
  return 0;
}

コード解説

  • cursesを使うにはcurses.hをインクルードします。
  • initscr()でcursesの初期化をします。必ず最初に呼び出してください。
  • printw()はC言語のprintf()と同じ使い方ができます。initscr()した後は、printf()などの画面出力系の標準Cライブラリ関数は動作しなくなります。
  • refresh()printw()したものを実際に画面に反映します。思い通りに画面が表示されないと思ったら、この関数を呼ぶのを忘れていたなんてことがよくあります。
  • getch()はキーボード入力を受け付ける関数です。scanf()のようにエンターキーで確定する必要はありません。今回は勝手にendwin()まで行かないようにするのに使いました。
  • endwin()でcursesの終了処理をします。元の画面に戻って、printf()等が使えるようになります。

実行

コンパイルする際は、以下のようにオプションを指定してください。

$ gcc Main.c -lncursesw

コンパイルエラーが発生する場合は、cursesをインストールしてください。
生成された実行ファイルを実行してみてください。画面が切り替わって文字が表示されたと思います。いずれかのキーを押すとプログラムを終了します。
また、日本語を表示させる方法はこの記事で紹介しています。

主人公がフィールド上を動くプログラム

動作確認ができたら、今度はcursesの基本的な関数を使ってゲームっぽいプログラムを作ってみたいと思います。

Main.c
#include <curses.h>

int main()
{
  initscr();
  start_color();      //文字の色を変更可に
  curs_set(0);        //カーソルを非表示
  cbreak();           //バッファリングを無効化
  noecho();           //入力した文字を表示しない
  keypad(stdscr, 1);  //カーソルキー等を使用可能に

  init_pair(1, COLOR_GREEN, COLOR_BLACK);  //カラーペア1番の文字色を緑に設定
  init_pair(2, COLOR_WHITE, COLOR_BLACK);

  int x = 1, y = 1;
  while (1) {
    erase();
    attrset(COLOR_PAIR(1));  //属性をカラーペア1番に設定
    mvprintw(y, x, "@");     //y行x列に@を表示
    attrset(COLOR_PAIR(2));
    box(stdscr, 0, 0);  //端末サイズに合わせて外枠を作る
    refresh();

    int key = getch();
    if (key == 'q') break;  //qキーで終了
    if (key == 'w' || key == KEY_UP) y--;
    if (key == 's' || key == KEY_DOWN) y++;
    if (key == 'a' || key == KEY_LEFT) x--;
    if (key == 'd' || key == KEY_RIGHT) x++;
    if (x < 1) x = 1;
    if (y < 1) y = 1;
    if (x > COLS - 2) x = COLS - 2;    //端末の列数はCOLSで取得できる
    if (y > LINES - 2) y = LINES - 2;  //端末の行数はLINESで取得できる
  }

  endwin();
  return 0;
}

実行すると、wasdキーかカーソルキーで@マークを動かせます。動ける範囲は外枠の中になっています。qキーで終了します。

コード解説

  • start_color()initscr()の直後に呼び出すと文字の色を変えられるようになります。init_pair(1, COLOR_WHITE, COLOR_BLACK)とすると、カラーペア1番は文字色が白で背景色が黒に設定されます。ペア番号は1以上の数しか指定できません。attrset(COLOR_PAIR(1))で次から1番の設定が適用されます。使用可能な色はこちら
  • mvprintw()move()printw()を合わせた関数で、カーソルを移動させてから文字を表示します。よくあるゲームエンジン等の座標指定と違い、(y座標, x座標)の順に指定します。
  • keypad(stdscr, 1)を呼び出すと、カーソルキーを入力したときにgetch()KEY_UP等を返すようになります。
  • 変数xとyには自分の座標を格納しています。getch()の値に応じて座標を移動させてから、画面外に出ないように調整しています。

よく使う関数・マクロまとめ

cursesにはとてもたくさんの関数があります。その中でゲームに必要なものを厳選してまとめてみました。
以下のサイトに全ての関数が載っているのでとても参考になります。
日本語マニュアル
関数名索引

初期化・設定

initscr()
cursesの初期化
endwin()
cursesの終了処理
start_color()
文字の色を変えられるようにする
curs_set(0)
カーソルを非表示にする
noecho()
入力した文字を表示しない
cbreak()
文字を入力した後にEnterキーを押す必要がなくなる
timeout(int delay)
文字の入力待ち時間をdelayミリ秒に設定する。負なら永遠に待つ。
keypad(stdscr, 1)
カーソルキー等を取得できるようになる
init_pair(ペア番号, 前景色, 背景色)
カラーペアを設定する
attrset(COLOR_PAIR(ペア番号))
文字属性をペア番号のカラーに設定

入出力系

getch()
入力された文字を返す
erase()
画面をクリア
refresh()
画面の更新
mvprintw(y, x, 書式付き文字列, ・・・)
y行x列に移動して文字列を表示する
box(stdscr, 0 0)
外枠を作る

使用可能な色

この8色の中から前景色(文字の色)と背景色をそれぞれ選べます。
使用例はこちら

マクロ名
COLOR_BLACK
COLOR_RED
COLOR_GREEN
COLOR_YELLOW
COLOR_BLUE
COLOR_MAGENTA
COLOR_CYAN
COLOR_WHITE

カーソルキーのキーコード表

keypad(stdscr, 1)を呼び出すと、カーソルキーを入力したときにgetch()が対応したキーコードを返すようになります。
使用例はこちら

カーソルキー キーコード
KEY_UP
KEY_DOWN
KEY_LEFT
KEY_RIGHT

これ以外にも、KEY_F(1)でF1キー、KEY_BACKSPACEでバックスペースキーを取得できたりします。

60fpsで動作させる

Rogueのようなローグライクゲーム(?)では必要ないかもしれませんが、アクションゲームなどではフレームレートを固定したいので、それ用の関数を作りました。

Main.c
#include <curses.h>
#include <time.h>

#define SEC_TO_NSEC 1000000000  //1秒は10万ナノ秒

void vertical_synchro(int fps)
{
  static struct timespec pre_time, now_time;                //値を保持したいのでstatic変数にする
  clock_gettime(CLOCK_REALTIME, &now_time);                 //現在時刻をnow_timeに格納
  long d = now_time.tv_nsec - pre_time.tv_nsec;             //前回からの経過時間を計算
  if (d < 0) d += SEC_TO_NSEC;                              //秒数が進んでいたら調整
  struct timespec sleep_time = {0, SEC_TO_NSEC / fps - d};  //スリープする時間を計算
  nanosleep(&sleep_time, NULL);                             //スリープする
  clock_gettime(CLOCK_REALTIME, &pre_time);                 //次に呼ばれたとき用に現在時刻を取得
}

int main()
{
  initscr();
  curs_set(0);
  timeout(0);  //getch()の入力待ち時間をゼロに設定

  int count = 0;
  while (1) {
    if (getch() == 'q') break;  //qキーで終了

    erase();
    printw("%8d frame", count++);
    refresh();

    vertical_synchro(60);  //60fpsに固定
  }

  endwin();
  return 0;
}

実行すると、経過フレーム数が表示されます。qキーで終了します。

コード解説

  • vertical_synchro(60)は、前回それを呼び出し終えたときからの経過時間が1/60秒になるまでスリープする関数です。これをゲームのメインループに入れて毎フレーム呼び出せばフレームレートを固定できます。
  • 実装には、cursesの関数は何も使っていません。time.hclock_gettime()関数で現在時刻を取得します。timespec構造体には秒数とそれ以下のナノ秒が分けて格納されています。そのナノ秒の部分でスリープする時間を計算します。nanosleep()でスリープします。

これと先程のプログラムを合わせて、敵を動かしたりする処理を色々と追加すればゾンビタワーが出来上がります。

まとめ

この記事で紹介した以外にも、文字の装飾やウィンドウなどの機能があります。とくにウィンドウは、cursesのメイン機能で非常に便利なので、近々記事を書きたいと思います。cursesの使い方はクセがあって分かりづらいところが多いですが、作りたいものがあったら色々と試してみてください。

関連記事

cursesで日本語が文字化けするときの対処法

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

IftttでSSHログインの成功時にLineを飛ばす

概要

SSHログインが成功すると、Lineに通知が行くようにした。

前準備

  • iftttで ifがWebHookなるものをつくっておく

https://ifttt.com/maker_webhooks からDocumentationでcurlのコマンドを出力させておく。
image.png

作業

vi /etc/ssh/sshrc
sshrc
curl -X POST -H "Content-Type: application/json" -d @- '{"value1":}' https://maker.ifttt.com/trigger/イベント/with/key/トークン << EOS
{"value1":"[SSHログイン] ユーザー名: $USER, IP: $SSH_CLIENT"}
EOS
echo ""

これでおk

結果

SSHでは、ログイン時にCongrats!が出ます。

Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-74-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

 System information disabled due to load higher than 8.0


 * Canonical Livepatch is available for installation.
   - Reduce system reboots and improve kernel security. Activate at:
     https://ubuntu.com/livepatch

0 packages can be updated.
0 updates are security updates.


Last login: Sat Jan 25 15:50:56 2020 from 
Congratulations! You've fired the イベント event
mirmdock@mirm_dockernode:~$ 

image.png

参考

https://qiita.com/tekitoh/items/8acccb313d6e7a14c2ec
https://bacchi.me/linux/ssh-login-alert/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Pinebook Pro にデフォルトで入っているOS (Debian Desktop Community) を再インストールする手順

1. OS イメージのダウンロード
   https://wiki.pine64.org/index.php/Pinebook_Pro_Software_Release
   >> Debian Desktop Community Build Image [microSD to eMMC] by mrfixit2001
   >> Direct download release build 191123 from mrfixit2001s github
   >> https://github.com/mrfixit2001/debian_desktop/releases/download/191123/pinebookpro-debian-desktop-mrfixit-191123.img.xz

2. ダウンロードした .xz ファイルを展開して .img にする
   pinebookpro-debian-desktop-mrfixit-191123.img.xz
   >> pinebookpro-debian-desktop-mrfixit-191123.img

3. etcher で .img を microSD カードに焼きこむ(dd コマンドを実行するためだけのOSとして使う)
   (etcher は ここから入手する)
      https://www.balena.io/etcher/

4. .img を USB メモリにコピーする(eMMC に書き込むためのもの)

5. Pinebook Pro のストレージ内訳(下記は 32GB の microSD を入れたケース)
   |--------------+---------------+----------+---------------|
   | /dev/mmcblk0 | microSDカード | 28.98GiB | microSDに依存 |
   | /dev/mmcblk1 | 内蔵eMMC      | 58.24GiB |               |
   |--------------+---------------+----------+---------------|
   本手順は mmcblk0(microSD)に OS を書き込んで、その OS を使ってさらに mmcblk1(eMMC) に OS を書き込む。

6. Pinebook Pro に microSD カードを差し込んで Power ON
   >> OPEN SESAME のスプラッシュが出る
   >> (初回起動のみ)テキストベースのログイン画面が出るが、これは触らないこと
   >> (初回起動のみ)ログイン画面のままそのまま少し待つと再起動が走る
   >> OPEN SESAME のスプラッシュが出る
   >> GUI のログイン画面が出る
   >> 以下でログインする
   |------+------|
   | user | rock |
   | pass | rock |
   |------+------|

7. Pinebook Pro に USB メモリを差し込んで下記のファイルをデスクトップにコピーする
   pinebookpro-debian-desktop-mrfixit-191123.img

8. Menu >> gparted[Enter] >> GParted を起動
9. GParted >> メニュー >> GParted >> Devices
   /dev/mmcblk1(58.24GiB) を選択する >> eMMCのパーティションが表示される
10. /dev/mmcblk1p1 を右クリック >> Unmount (領域を選択して [Alt]+[P][U] でも可能)
11. /dev/mmcblk1p1 を右クリック >> Delete (領域を選択して [Alt]+[P][D] または [Fn]+[Backspace] でも可能)
12. /dev/mmcblk1p2 を右クリック >> Unmount (領域を選択して [Alt]+[P][U] でも可能)
13. /dev/mmcblk1p2 を右クリック >> Delete (領域を選択して [Alt]+[P][D] または [Fn]+[Backspace] でも可能)

14. unallocated な 58.24GiB の領域が表示されている状態
15. GParted >> Edit >> Apply All Operations ([Ctrl]+[Return」で可能) >> [Apply] >> [Close] >> 反映される

16. Menu >> terminal >> MATE Terminal を開く

17. 下記を実行する
    $ sudo dd if=~/Desktop/pinebookpro-debian-desktop-mrfixit-191123.img of=/dev/mmcblk1 bs=4M status=progress

18. dd コマンドの結果、GParted >> GParted >> Refresh Devices ([Ctrl]+[R]) >> パーティションテーブルは下記のように変更された。
    |----------------+-------------+--------------------+-------+-----------+-----------+------------+-----------|
    | Partition      | File System | Mount Point        | Label | Size      | Used      | Unused     | Flags     |
    |----------------+-------------+--------------------+-------+-----------+-----------+------------+-----------|
    | unallocated    | unallocated |                    |       | 16.00 MiB | ---       | ---        |           |
    | /dev/mmcblk1p1 | fat32       | /media/rock/BOOT   | BOOT  | 64.00 MiB | 49.68 MiB | 14.32 MiB  | boot, lba |
    | unallocated    | unallocated |                    |       | 48.00 MiB | ---       | ---        |           |
    | /dev/mmcblk1p2 | ext4        | /media/rock/xxxx.. |       | 4.88 GiB  | 4.54 GiB  | 349.13 MiB | boot      |
    | unallocated    | unallocated |                    |       | 53.23 GiB | ---       | ---        |           |
    |----------------+-------------+--------------------+-------+-----------+-----------+------------+-----------|
    5つ目のパーティションが unallocated になっている点は、OS 起動後に適切になるので心配要らない。

19. Menu >> Quit >> [Shut Down] >> 電源が落ちる >> microSD カードを抜く。
    >> これで eMMC への新しい OS のインストールが完了した。

(おまけ:eMMC から OS を起動するとパーティションテーブルはこうなっているはず。)
    |----------------+-------------+--------------------+-------+-----------+-----------+-----------+-----------|
    | Partition      | File System | Mount Point        | Label | Size      | Used      | Unused    | Flags     |
    |----------------+-------------+--------------------+-------+-----------+-----------+-----------+-----------|
    | unallocated    | unallocated |                    |       | 16.00 MiB | ---       | ---       |           |
    | /dev/mmcblk1p1 | fat32       | /media/rock/BOOT   | BOOT  | 64.00 MiB | 49.68 MiB | 14.32 MiB | boot, lba |
    | unallocated    | unallocated |                    |       | 48.00 MiB | ---       | ---       |           |
    | /dev/mmcblk1p2 | ext4        | /media/rock/xxxx.. |       | 58.12 GiB | 5.36 GiB  | 52.75GiB  | boot      |
    |----------------+-------------+--------------------+-------+-----------+-----------+-----------+-----------|
    パーティションテーブルが適切になっている(5つ目のパーティションが消え、4つ目のext4に連結している格好)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む