RUPC2019参加記

写真はない 記憶もあんまりない

-82日目

  • 学会で知り合った @medalotte さんが最近競技プログラミングを始めたと言ってるのでRUPCに誘う 行けたら行くって言ってた気がする

1日目

  • @medalotte さんと再開する
  • @Pulmn さんと @medalotte さんと組む
  • Bを読む。なるほど関数定義して再帰的に呼び出せばいいねなどとプチ迷走をするがすぐにまともで確実な解法を書いてACする。
  • Dを読む。再帰的なウニをつくるとO(logN)で正解できると考える。Plumnさんが空いたところで解法を共有するとよさそうと言ってくれたので実装してみる。
  • すごくバグって困る。Plumnさんが介護してくれて時間ギリギリでなんとかACする。
  • あとできいたらbitが立っているかどうかわかるようにグラフをつくると楽だときいて感心する。
  • 初参加のmedalotteさんにちゃんと気を使おうと思っていたのにDで盛り上がってしまってちょっと反省する。
  • 懇親会でmedalotteくんと話す。何を話したかは覚えていない。適当に知らない人に話しかけたりもする。何を話したかは覚えていない。

2日目

  • @kyuridenamida さんと @nomikura さんと組む
  • Aを解く。'A' + (max_element(A.begin() + A.end()) - A.begin())する。
  • Dを読む。サンプルをみると自分の解釈と合わなくて困る(整数要素は見逃さなかった)。会津セット日本語が最悪だ、まあ僕が文章校正してないからねとイキる。実は日本語もサンプルも間違っておらず、誤読もしていなかった(サンプル1がちょっと特殊?で、上辺を超えて線を引いたほうが最適だったっぽい)。これ多分ヤバイっすよとチームに共有して、飛ばす。後にnomiさんがsampleの全探索をしてくれて、問題がおかしくないことを確認しACしてくれた。
  • いろいろよむがわからないなぁをやっていたところkyuriさんがGがgrundyで解けそうなんだけどgrundy解いたことあれば実装してほしいと言ってくれる。grundyはB2くらいのころに教わって証明もどきをやって解いたことがあったので、自信満々で任せられる。が、完全に忘却していたので結局kyuriさんに実装を教えてもらいながらAC。恥ずかしかった。
  • Jが本質高校物理っぽいので成績優秀者としても解きたいなぁと思う。kyuriさんが後半はむずかしい区間スケジュールであることを考察してくれたので、kyuriさんにそっちを任せ、僕は高校物理をやる。5回くらい式を間違えてバグらせたが、終わり間際でなんとかサンプルが合って提出する。WA。聞いたところ本質は誤差なんだって。hajiくんがEPS=2e-8とかにすると通るよとか教えてくれる。通らなかったけど。
  • 懇親会はよく覚えていない。グラスにいっぱい注いだハイボールがほぼストレートだったことは覚えている。

3日目

  • @ferinさんと@shiroさんと組む。
  • Bを読む。i番目の入力でそれ以左の括弧列はきまるから頑張って場合分けをするといいのかななどと考えていた。ferinさんに解法を共有すると、もう少しかんたんにできそうだと考えてくれて、最終的にstackでやるやつを教わる。何度かバグらせferinさんのお世話になりながらもACする。
  • 終わったところでferinさんにDの考察を教えてもらい、実装したかったので実装させてくださいという。教えてもらったものを理解できてなかったようでやたら迷走したが、最終的にはferinさんに付き添ってもらってAC。
  • ferinさんがEを解く。時間もあまりなかったし解けそうな問題もなかったので眺めていた。ローリングハッシュとか使ったことないなあと思いながら眺めているも、時間切れ。

まとめ

今年は忙しくてなかなか原案を出せず、ひねりだした原案もhajiくんに「つまんな」と言われ結局コンテスタントとして参加しました。作問できなかったのはちょっと心残りではありましたが、競プロは楽しいねと言うのを再確認できた合宿だったと思います。

定番WMなし、qtileでラップトップをいい感じに使う

Environments

ボタン・ふたでSuspend

/etc/systemd/logind.conf[Login] 中の項目を設定。Linux Man Pages: logind

$ cat /etc/systemd/logind.conf
[Login]
HandlePowerKey=suspend
HandleLidSwitch=suspend

Suspend時にロック

screen lockにi3lockを使う。i3lockを起動するsystemd unitでbeforeを指定する。

$ cat /lib/systemd/system/wakelock.service
[Unit]
Description=Lock the screen on resume from suspend
Before=sleep.target suspend.target

[Service]
User=YOUR USER NAME
Type=forking
Environment=DISPLAY=:0
ExecStart=/usr/bin/i3lock

[Install]
WantedBy=sleep.target suspend.target

$ systemctl daemon-reload
$ systemctl enable wakelock.service

suspend 一定時間後 hibernate

以前はここにpm-utilsを使用する方法を書いていたが、動かなかったのでsystemdを使うようにする。i3lock 2.8 (debian 9のリポジトリから手に入るもの) だとハイバネート復帰後カーネルパニックを起こしたので、 2.12を使うようにしたところうまく動いている模様。

$ cat /usr/sbin/delayed_hibernate.sh
#!/bin/bash
TIMELOG=/tmp/autohibernate.log
ALARM=$(tail -n 1 $TIMELOG)
SLEEPTIME=10 #edit this line to change timer, e.g. 2 hours "$((2*60*60))"
if [ $1 == "resume" ]
then
    if [ $(date +%s) -ge $(( $ALARM + $SLEEPTIME )) ]
    then
        echo "hibernate triggered $(date +%H:%M:%S)">>$TIMELOG
        systemctl hibernate 2>> $TIMELOG
    else
        echo "normal wakeup $(date +%H:%M:%S)">>$TIMELOG
    fi
elif [ $1 == "suspend" ]
then
    echo "$(date +%s)" >> $TIMELOG
    /usr/sbin/rtcwake -m no -s $SLEEPTIME
fi
$ cat /lib/systemd/system/delayedhybernate.service
[Unit]
Description=Delayed hibernation trigger
Before=suspend.target
Conflicts=hibernate.target hybrid-suspend.target
StopWhenUnneeded=true

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/delayed_hibernate.sh suspend
ExecStop=/usr/sbin/delayed_hibernate.sh resume

[Install]
WantedBy=sleep.target
RequiredBy=suspend.target

i3lockなしなら問題なく動くが、(おそらく)i3lock追加後にhibernate復帰すると下記メッセージが現れる。

Message from syslogd@debian-thinkpad at Jan  3 08:36:00 ...
 kernel:[ 1079.913130] Uhhuh. NMI received for unknown reason 2c on CPU 0.

Message from syslogd@debian-thinkpad at Jan  3 08:36:00 ...
 kernel:[ 1079.913135] Do you have a strange power saving mode enabled?

Message from syslogd@debian-thinkpad at Jan  3 08:36:00 ...
 kernel:[ 1079.913138] Dazed and confused, but trying to continue

WLanの情報をBottom Barに

WLANじたいはwicdで管理している。 - pythonのiwlibのビルドのためlibiw-devをいれる - pipでiwlibをいれる

$ sudo apt install libiw-dev
$ pip3 install iwlib

うごかん (N/A)

BacklightをFunction Keysで

xbacklightが動かないのでバックライトデバイスのsysfsを直接編集するようにする。はじめは一般ユーザで書き込めないので、それを変更するudevルールを書く。 https://wiki.archlinux.org/index.php/backlight 今回の場合はデバイスがacpi_video0ではなくintel_backlightなのでそこを置換する(このあたりの意味がよくわかっていない)。

cat /etc/udev/rules.d/99-backlight.rules
ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="intel_backlight", RUN+="/bin/chgrp video /sys/class/backlight/%k/brightness"
ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="intel_backlight", RUN+="/bin/chmod g+w /sys/class/backlight/%k/brightness"

あとはqtile configを書く。現在値を読み込みそれにある程度値を足して再度書き込むコマンドを作る。

echo $((`cat /sys/class/backlight/intel_backlight/brightness`+10)) | tee sys/class/backlight/intel_backlight/brightness

lazy.spawn()にこれを書けばいいのかと思ったがうまくごかない。ttyが割り当てられていなくてパイプが機能しないのだろうか(わからない)。同コマンドをファイルにして/usr/local/binに起き、+xしてlazy.spawn()の引数に書く。

低バッテリでhibernate

たぶんこれ (未検証) 2019-08-02追記: うごいてないのを確認。udevadmでちゃんと見てコンフィグを書く https://wiki.archlinux.org/index.php/laptop#Hibernate_on_low_battery_level

バッテリチェックするスクリプトを作る

$ cat /usr/local/bin/hibernateonlowbattery.sh
#!/bin/sh
acpi -b | awk -F'[,:%]' '{print $2, $3}' | {
        read -r status capacity

        if [ "$status" = Discharging -a "$capacity" -lt 5 ]; then
                logger "Critical battery threshold"
                systemctl hibernate
        fi
}

systemd.timer にあずける

$ cat /lib/systemd/system/hibernateonlowbattery.service
[Unit]
Description=Hibernate when low battery

[Service]
Type=oneshot
ExecStart=/usr/local/bin/hibernateonlowbattery.sh
$ cat /lib/systemd/system/hibernateonlowbattery.timer
[Unit]
Description=Hibernate when low battery

[Timer]
OnBootSec=10min
OnUnitActiveSec=2min

Persistent=false

[Install]
WantedBy=timers.target

Fonts

  • Noto Fontsをインストール

    • packageにあるものはaptでインストール (Sans CJKはある)

      • sudo apt install fonts-noto*
    • ないものはGoogleからダウンロードインストール

  • ~/.fonts.conf を編集 (See man fonts-conf)

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<!-- $XDG_CONFIG_HOME/fontconfig/fonts.conf for per-user font configuration -->
<fontconfig>
  <!--
  <match target="scan">
    <test name="family">
      <string>Noto Color Emoji</string>
    </test>
    <edit name="scalable" mode="assign">
      <bool>true</bool>
    </edit>
    <edit name="pixelsize" mode="assign">
      <double>18</double>
    </edit>
  </match>
  <match>
    <test name="family"><string>sans-serif</string></test>
    <edit name="family" mode="prepend" binding="strong">
      <string>Noto Color Emoji</string>
    </edit>
  </match>
  <match>
    <test name="family"><string>serif</string></test>
    <edit name="family" mode="assign" binding="strong">
      <string>Noto Color Emoji</string>
    </edit>
  </match>
  <match>
    <test name="family"><string>Apple Color Emoji</string></test>
    <edit name="family" mode="assign" binding="strong">
      <string>Noto Color Emoji</string>
    </edit>
  </match>
  -->
    <alias binding="strong">
      <family>emoji</family>
      <default><family>Emoji One</family></default>
    </alias>

  <alias>
    <family>sans</family>
    <prefer>
      <family>Noto Sans CJK JP</family>
    </prefer>
  </alias>
  <alias>
    <family>serif</family>
    <prefer>
      <family>Noto Serif CJK JP</family>
    </prefer>
  </alias>
  <alias>
    <family>sans-serif</family>
    <prefer>
      <family>Noto Sans CJK JP</family>
    </prefer>
  </alias>
  <alias>
    <family>monospace</family>
    <prefer>
      <family>DejaVu Sans Mono</family>
    </prefer>
  </alias>
  <alias>
    <family>sans-serif</family>
    <prefer><family>Noto Color Emoji</family></prefer>
  </alias>
</fontconfig>
  • fc-cache -f

Trackpoint

速度を早める

TL;DR

systemdのpathexistsでなんとかする

以下udevによるものは間違い

$ cat /etc/udev/rules.d/10-trackpoint.rules
ACTION=="add", SUBSYSTEM=="serio", DRIVERS=="psmouse", ATTR{name}=="TPPS/2 IBM TrackPoint", ATTR{sensitivity}="255", ATTR{speed}="255"

ruleのかきかた

参考: udevルールの書き方 - Qiita

trackpointのデバイスを探す。/dev/input/mouse{0,1,2,3}に割り当たっていることが予想ついたので udevadm info -q path -n /dev/input/mouse{0,1,2,3} して/sys以下の記述を探し、devadm info -a -p ${syspath} になげ、trackpointという記述があるところを探す。つまり、 udevadm info -a -p $(udevadm info -q path -n /dev/input/mouse{0,1,2,3}) の中でtrackpointと名前がつくものを探す。今回はmouse2がtrackpointだったので、udevadm info -a -p $(udevadm info -q path -n /dev/input/mouse1)とする。

↑で出てきた情報でデバイスを絞り込むキーを絞る。KERNELS, SYSSYSTEMS, DRIVERS, ATTRS{name}で絞り込めそうだと判断したので、ruleファイルの条件部にそれをかく。sensitivityとspeedを調整したいので、それを書き込む。

Touchpad

タッチでクリック、感度最大

libinputを使う。xinputから設定できる項目を確認。

$ xinput list
⎜   ↳ SynPS/2 Synaptics TouchPad                id=13   [slave  pointer  (2)]

id=13なので、

$ xinput list-props 13

libinput Tapping Enabled あたりかなとあたりをつける

man libinputman xorg.conf を読むなどして、/etc/X11/xorg.conf.d/99-libinput-custom-config.conf

Section "InputClass"
        Identifier "TouchPad"
        MatchDriver "libinput"
        MatchProduct "TouchPad"
        Option "Tapping" "yes"
        Option "TappingDrag" "yes"
        Option "AccelSpeed" "1.0"
        Option "AccelProfile" "flat"
EndSection

NVIDIAのGPUとドライバが入ったLinux (Debian) マシン上でrvis (ROS kinetic) をDockerを介して実行する

[注: 未解決]

環境

問題

Dockerを介してrviz (おそらくopenGLを使うアプリケーション全て) をウィンドウを使いつつ表示させるにはいろいろ必要条件がある

やったこと

  • nvidia-dockerを使うようにした (1) (3)
  • NVIDIAのドライバを入れ直した (2)
  • NVIDIA DriverをDocker Imageにもインストール

nvidia-dockerを使うようにした (1) (3)

基本的には (3) の通り。ROS用にDockerfileを書き換えた。

FROM ros:kinetic-ros-base

ENV NVIDIA_VISIBLE_DEVICES ${NVIDIA_VISIBLE_DEVICES:-all}
ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics

RUN apt update && apt install -y \
    x11-apps \
    mesa-utils \
    gdb \
    ros-kinetic-rviz

CMD ["rosrun", "rviz", "rviz"]
docker run --runtime=nvidia --rm -it --cap-add=SYS_PTRACE --security-opt="seccomp=unconfined" --net host -e QT_X11_NO_MITSHM=1 -e DISPLAY=$DISPLAY -v $HOME/.Xauthority:/root/.Xauthority -v /tmp/.X11-unix/:/tmp/.X11-unix/ ros-rviz /bin/bash

--cap-add=SYS_PTRACE --security-opt="seccomp=unconfined"GDBによるデバッグに必要らしい(プログラムアドレスがセキュリティの関係でいじられるのを防ぎtrace出来るようにするらしい)。

-e QT_X11_NO_MITSHM=1X Error: BadAccess [...]が出るのでつけた (4)。

しかしnvidia-docker2を使い始めた途端コンテナがinitialization error: driver error: failed to process request\\\\n\\\"\"": unknown.で起動しない。

NVIDIAのドライバを入れ直した (2)

(2)を参考に、sudo nvidia-container-cli -k -d /dev/tty infoの結果が良くなかったのでホストのドライバが良くないと判断。以前はNVIDIAのページから得られる.runからインストールした。aptでnvidia-driversをinstall(推奨されません)。xserver-xorg-video-nvidiaがdependenciesを崩すというので手動で依存解決(aptするだけ)。いろいろ消えると言われるがこの頃は完全にしんどくなっていたのでとりあえずY。rebootしてXを起動すると入力機器が何も受け付けなくなった。(5)を参考にxserver-xorg-input-allのインストールで解決した。

コンテナは起動した。しかし

# ROS_MASTER_URI=http://xxx:11311 rviz
[ INFO] [1549507151.920337704]: rviz version 1.12.16
[ INFO] [1549507151.920376105]: compiled against Qt version 5.5.1
[ INFO] [1549507151.920386034]: compiled against OGRE version 1.9.0 (Ghadamon)
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
Could not initialize OpenGL for RasterGLSurface, reverting to RasterSurface.
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
Segmentation fault (core dumped)
# ROS_MASTER_URI=http://163.143.94.197:11311 gdb rviz
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from rviz...(no debugging symbols found)...done.
(gdb) r
Starting program: /opt/ros/kinetic/bin/rviz
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7fffdda6f700 (LWP 85)]
[ INFO] [1549507206.675844716]: rviz version 1.12.16
[ INFO] [1549507206.675877843]: compiled against Qt version 5.5.1
[ INFO] [1549507206.675886056]: compiled against OGRE version 1.9.0 (Ghadamon)
[New Thread 0x7fffdce4e700 (LWP 86)]
[New Thread 0x7fffd7fff700 (LWP 87)]
[New Thread 0x7fffd77fe700 (LWP 88)]
[New Thread 0x7fffd6ffd700 (LWP 89)]
[New Thread 0x7fffc3fff700 (LWP 91)]
[New Thread 0x7fffc37fe700 (LWP 92)]
[New Thread 0x7fffc2ffd700 (LWP 93)]
[New Thread 0x7fffc27fc700 (LWP 94)]
libGL error: No matching fbConfigs or visuals found
[Thread 0x7fffc27fc700 (LWP 94) exited]
[Thread 0x7fffc2ffd700 (LWP 93) exited]
[Thread 0x7fffc37fe700 (LWP 92) exited]
[Thread 0x7fffc3fff700 (LWP 91) exited]
libGL error: failed to load driver: swrast
Could not initialize OpenGL for RasterGLSurface, reverting to RasterSurface.
[New Thread 0x7fffc27fc700 (LWP 95)]
[New Thread 0x7fffc2ffd700 (LWP 96)]
[New Thread 0x7fffc37fe700 (LWP 97)]
[New Thread 0x7fffc3fff700 (LWP 98)]
libGL error: No matching fbConfigs or visuals found
[Thread 0x7fffc3fff700 (LWP 98) exited]
[Thread 0x7fffc37fe700 (LWP 97) exited]
[Thread 0x7fffc2ffd700 (LWP 96) exited]
[Thread 0x7fffc27fc700 (LWP 95) exited]
libGL error: failed to load driver: swrast

Thread 1 "rviz" received signal SIGSEGV, Segmentation fault.
0x00007ffff354a6b4 in glXCreateContext () from /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1
(gdb) bt
#0  0x00007ffff354a6b4 in glXCreateContext () from /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1
#1  0x00007ffff7ad5600 in rviz::RenderSystem::setupDummyWindowId() () from /opt/ros/kinetic/lib/librviz.so
#2  0x00007ffff7ad9712 in rviz::RenderSystem::RenderSystem() () from /opt/ros/kinetic/lib/librviz.so
#3  0x00007ffff7ad9a05 in rviz::RenderSystem::get() () from /opt/ros/kinetic/lib/librviz.so
#4  0x00007ffff7ad4dc1 in rviz::QtOgreRenderWindow::QtOgreRenderWindow(QWidget*) () from /opt/ros/kinetic/lib/librviz.so
#5  0x00007ffff7afb949 in rviz::RenderPanel::RenderPanel(QWidget*) () from /opt/ros/kinetic/lib/librviz.so
#6  0x00007ffff7b47160 in rviz::VisualizationFrame::initialize(QString const&) () from /opt/ros/kinetic/lib/librviz.so
#7  0x00007ffff7b52509 in rviz::VisualizerApp::init(int, char**) () from /opt/ros/kinetic/lib/librviz.so
#8  0x0000000000400c90 in main ()

NVIDIA DriverをDocker Imageにもインストール

ここでindigoのイメージだとちゃんとrvizがうごくことを確認する。

kineticの方で、GDBの結果とldconfig -p | grep -i gl.soの結果から、mesaのlibGL.soが良くないと思い綺麗なubuntuイメージにnvidia drivers nvidia-384 をインストール (mesaとかOpenGLとかNvidiaとかの関係は(6)を読むとわかりそうだがまだちゃんと読んでない)。

Dockerfile

FROM ubuntu:16.04

ENV NVIDIA_VISIBLE_DEVICES ${NVIDIA_VISIBLE_DEVICES:-all}
ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics

RUN apt update && apt install -y expect
COPY nvidia-expect.exp /
RUN expect /nvidia-expect.exp

RUN sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
RUN apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

RUN apt update
RUN apt-get install ros-kinetic-desktop-full -y

CMD ["rosrun", "rviz", "rviz"]

nvidia-expect.exp

#!/usr/bin/env expect

set timeout -1
spawn apt-get install -y nvidia-384
expect {
      "\\\[More\\\]" { send "\n"; exp_continue; }
          "Country of origin for the keyboard: " { send "29\n"; }
}
expect {
      "\\\[More\\\]" { send "\n"; exp_continue; }
          "Keyboard layout: " { send "1\n" }
}
expect eof

これで、 docker runしrvizを実行する。

# ROS_MASTER_URI=http://xxx:11311 rviz
[ INFO] [1549507833.199991200]: rviz version 1.12.16
[ INFO] [1549507833.200033889]: compiled against Qt version 5.5.1
[ INFO] [1549507833.200045286]: compiled against OGRE version 1.9.0 (Ghadamon)
[...]
[ WARN] [1549507834.409556933]: OGRE EXCEPTION(2:InvalidParametersException): Window with name 'OgreWindow(1)' already exists in GLRenderSystem::_createRenderWindow at /build/ogre-1.9-mqY1wq/ogre-1.9-1.9.0+dfsg1/RenderSystems/GL/src/OgreGLRenderSystem.cpp (line 1057)
rviz::RenderSystem: error creating render window: OGRE EXCEPTION(2:InvalidParametersException): Window with name 'OgreWindow(1)' already exists in GLRenderSystem::_createRenderWindow at /build/ogre-1.9-mqY1wq/ogre-1.9-1.9.0+dfsg1/RenderSystems/GL/src/OgreGLRenderSystem.cpp (line1057)
[ERROR] [1549507834.409586881]: Unable to create the rendering window after 100 tries.
Segmentation fault (core dumped)
(gdb) bt
#0  0x00007ffff7ad4e85 in rviz::QtOgreRenderWindow::QtOgreRenderWindow(QWidget*) () from /opt/ros/kinetic/lib/librviz.so
#1  0x00007ffff7afb949 in rviz::RenderPanel::RenderPanel(QWidget*) () from /opt/ros/kinetic/lib/librviz.so
#2  0x00007ffff7b47160 in rviz::VisualizationFrame::initialize(QString const&) () from /opt/ros/kinetic/lib/librviz.so
#3  0x00007ffff7b52509 in rviz::VisualizerApp::init(int, char**) () from /opt/ros/kinetic/lib/librviz.so
#4  0x0000000000400c90 in main ()

ちなみにここでglxgearsすると正常に動いているっぽい(fpsがstdoutに出てる)が描画が正常じゃない(真っ黒)。

TODO

docker/Tutorials/GUI - ROS Wiki のSimple Way以外を試す

感想

わからん

References

(2):

github.com

(1):

github.com

(3):

qiita.com

(4): github.com

(5): askubuntu.com

(6):

www.reddit.com

Vapeに入門したまとめ

はじめに

ストレスでタバコに手を出しそうになったがグッとこらえてvapeをはじめた。最近2本目としてfog1を買ったが、その際種類がいろいろあって悩んだのでメモ。

vapeとは

そもそもタバコはタバコ葉を燃焼させその際生成される物質を吸引するもの*1。この際一緒に発生するタールやニコチン、一酸化炭素などが最近しばしば危険だと言われている。

vape(電子タバコとも言う、加熱式タバコとは違う)*2 は原料から違って、プロピレングリコール(PG)とベジタブルグリセリン(VG)、それと香料が原料。PGとVGは加熱して蒸気を発生させるために含有されており*3、香料は名前の通り香りづけのために含有されている。PGとVGはコンサートでの演出のためのスモークに使われるものと同じであるとのこと*4。この加熱のためにコイルに電流を流し発熱させるから"電子"たばこと呼ばれているものと考えられる。

vapeはおおまかにバッテリ(MODともいうらしい)、アトマイザ(リキッドが入る容器)、吸い口、コイルで構成されている*5。左citationの画像がわかりやすい。

vapeは形状でおおよそ3種類に分類されている: タバコタイプ、ペンタイプ、ボックスタイプ*6。タバコタイプは名前の通りタバコのような細長い円筒形をしている。ペンタイプは形状はタバコタイプと似ているものの若干太い。ボックスタイプは円筒と直方体がつながった形をしている。直方体(ボックス)部はたいていバッテリー。

はじめのvape

最初はflevo*7を買った。理由としては、タバコっぽい形のほうがかっこいいだろうというのと、あとスターターキットが1000円以内で安いから。Amazonで買った。Dr.VAPEも視野に入れていたがスターターキットが7000円とちょっと高かったのでやめた。リキッドはタバコフレーバ、メンソール、ビタミンベリーを試した。メンソールはそこそこ好きだったがタバコフレーバとビタミンベリーは甘みが苦手だった。特にビタミンベリーは(吐き気ほどではないが)きもちわるくなることもあった。甘いものが嫌いなわけではないが。機械によって味が変わることを知らなかったことと、初めてだったこともあり満足していたが、のちにfog1を買ってこれの味が弱いことに気づく。

2本目のvape

つぎにJustfogのfog1*8をvapelogで買った。味がよいという記事をたくさん見つけたのが決めて*9*10。べプログショップで買った。 実際に使ってみると、(FLEVOと比べて)味は濃いし煙も多い。FLEVOではわざわざ煙を鼻に通して香りを楽しんでいたが、fog1はそんなことをしなくても口に煙を入れるだけでなんとなく味がするし、肺で吸うときに喉で煙を感じられる。FLEVOとは全然違った。 不満として、リキッドを変更するのが面倒くさいということがある。というのも、*11でも言っているように、アトマイザが一体型(アトマイザのみでリキッドを保持できない)ので、リキッドが残っている状態で別のアトマイザに交換する、ということができない。初めて買ったまともなvapeであり、いろいろな味を試してみたかったので、これは気に入らない。

試したリキッド

タバコクラシック

甘いけどそんなに嫌いではない。これがたばこ味なのかはわからない (MarlBoroしか吸ったことはないが、MarlBoroとは似ていない) タバコクラシック【Sarome Tokyo(サロメトウキョウ)】 | ベプログショップ

Coe de Sex on the Beach

パイナップル味。甘くて苦手。 Coe de Sex on the Beach【小江戸工房(コエドコウボウ)】 | ベプログショップ

ドライハードメンソール

味はない、ちょっと苦い味がするかも。メンソールは強烈。はじめは喉にしびれる刺激が来る(今はなんとも感じなくなった)。鼻にたくさん通すとキツい。カフェイン含有。肺からカフェイン摂取できるので効きそう。 【ベプリキ】ドライハードメンソール 15ml | ベプログショップ

次に買おうと思っている奴

つぎはbox型のやつで、アトマイザが独立しているやつを買おうと思っている。

*1:JT, '紙巻たばこ(シガレット)', Available: https://www.jti.co.jp/tobacco/knowledge/variety/cigarette/index.html, [Accessed: 28-Aug-2018].

*2:JT, '電子タバコ', Available: https://www.jti.co.jp/tobacco/knowledge/variety/electronic_cigarette/index.html, Accessed: 20-Aug-2018

*3:価格.comマガジン, '電子タバコ「VAPE(ベイプ)」って何だ? 初心者向けモデルはコレ! 「アイコス」との違いは?', Available: https://kakakumag.com/hobby/?id=10918, [Accessed: 28-Aug-2018]

*4:価格.comマガジン, '電子タバコ「VAPE(ベイプ)」って何だ? 初心者向けモデルはコレ! 「アイコス」との違いは?', Available: https://kakakumag.com/hobby/?id=10918, [Accessed: 28-Aug-2018]

*5:VAPE-MASTER, 'VAPE電子タバコの構造/煙の仕組み/各パーツ名の初心者向け解説 | VAPEMASTER', Available: https://vape-master.jp/construction/, [Acessed: 28-Aug-2018

*6:べプログショップ, 'ベプログショップ | 初めての電子タバコの選び方', Available: https://vapelog.jp/shop/user_data/beginner_choose.php, [Accessed: 28-Aug-2018]

*7:dmm.com, 'FLEVO | FLEVO公式サイト', Available: https://www.dmm.com/top/special/flevo/, [Accessed: 28-Aug-2018]

*8:Justfog, 'Justfog – FOG1 Kit', Available: http://www.justfog.com/?avada_portfolio=fog1-kit, [Accessed: 28-Aug-2018]

*9:スキクエ, 'VAPEスタータキットで迷う?これがおすすめ!Fog1最強キットを徹底レビュー | スキクエ', Available: https://www.sukima-desuyo.com/entry/vape-fog1, Accessed: [28-Aug,2018]

*10:No.1VAPE, '【メンソールでも大丈夫】味を濃厚に感じる「FOG1」を2ヶ月使ってみた感想', Available: http://marauders.jp/fog1/, Accessed: [28-Aug-2018]

*11:No.1VAPE, '【メンソールでも大丈夫】味を濃厚に感じる「FOG1」を2ヶ月使ってみた感想', Available: http://marauders.jp/fog1/, Accessed: [28-Aug-2018]

debian stretch on thinkpadでtrackpoint sensitivityを永続化

tl;dr

systemdでファイル監視するやつが動かず、udevにルールを追加することでうごいた

xinput --list

...
↳ TPPS/2 IBM TrackPoint 
...

cat /etc/udev/10-trackpoint.rules

ACTION=="add", SUBSYSTEM=="input", ATTR{name}=="TPPS/2 IBM TrackPoint", ATTR{device/sensitivity}="200", ATTR{device/press_to_select}="1"

ATTR{device/press_to_select}="1"はsensitivityには関係ないと思う。ところでこれを書いているにもかかわらずtrackpadがpressでセレクトできない。消して試したいがめんどうになって諦めた。

やったこと

systemdのファイル監視でfdに書き込む

cat /lib/systemd/system/trackpoint.path

[Unit]
Description=Watch for, and modify, Trackpoint attributes

[Path]
PathExists=/sys/devices/platform/i8042/serio1/serio2/sensitivity

[Install]
WantedBy=default.target

cat /lib/systemd/system/trackpoint.service

[Unit]
Description=set trackpoint sensitivity

[Service]
ExecStart=/usr/local/bin/trackpoint_sensitivity.sh

cat /usr/local/bin/trackpoint_sensitivity.sh (実行権限あり)

#!/bin/bash
echo -n 250 | tee /sys/devices/platform/i8042/serio1/serio2/sensitivity

考察

そもそもserviceが呼び出されていなさそう(trackpoint_sensitivity.shにecho "test" > /home/xxx/test.txtでtest.txtはできなかった)

udevにルール追加(動かない版)

cat /etc/udev/rules.d/10-trackpoint.rules

KERNEL=="serio2", SUBSYSTEM=="serio", DRIVERS=="psmouse", ATTR{sensitivity}:="180", ATTR{speed}:="150"

udevadm info -a -p /sys/devices/platform/i8042/serio1/serio2/

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/platform/i8042/serio1/serio2':
    KERNEL=="serio2"
    SUBSYSTEM=="serio"
    DRIVER=="psmouse"
    ATTR{bind_mode}=="auto"
    ATTR{description}=="Synaptics pass-through"
    ATTR{draghys}=="255"
    ATTR{drift_time}=="5"
    ATTR{ext_dev}=="1"
    ATTR{firmware_id}==""
    ATTR{inertia}=="6"
    ATTR{jenks}=="135"
    ATTR{mindrag}=="20"
    ATTR{press_to_select}=="1"
    ATTR{protocol}=="TPPS/2"
    ATTR{rate}=="100"
    ATTR{reach}=="10"
    ATTR{resetafter}=="5"
    ATTR{resolution}=="200"
    ATTR{resync_time}=="0"
    ATTR{sensitivity}=="240"
    ATTR{skipback}=="0"
    ATTR{speed}=="97"
    ATTR{thresh}=="8"
    ATTR{upthresh}=="255"
    ATTR{ztime}=="38"

  looking at parent device '/devices/platform/i8042/serio1':
    KERNELS=="serio1"
    SUBSYSTEMS=="serio"
    DRIVERS=="psmouse"
    ATTRS{bind_mode}=="auto"
    ATTRS{description}=="i8042 AUX port"
    ATTRS{firmware_id}=="PNP: LEN0058 PNP0f13"
    ATTRS{protocol}=="SynPS/2"
    ATTRS{rate}=="80"
    ATTRS{resetafter}=="5"
    ATTRS{resolution}=="200"
    ATTRS{resync_time}=="0"

  looking at parent device '/devices/platform/i8042':
    KERNELS=="i8042"
    SUBSYSTEMS=="platform"
    DRIVERS=="i8042"
    ATTRS{driver_override}=="(null)"

  looking at parent device '/devices/platform':
    KERNELS=="platform"
    SUBSYSTEMS==""
    DRIVERS==""

考察

ようわからんがうごかない

参考

トラックポイント - ArchWiki

InstallingDebianOn/Thinkpad/Trackpoint - Debian Wiki

Ubuntu17.10でtrackpointの速度を調整する