Archive for the ‘Linux’ Category

ちょっと大量のファイル操作をsshからやることになって、以前から使ってみたいと思っていたmidnight-commander(mc)をダウンロードしてみた。

しかし、オプションが開けない・・・

スクリーンショット 2019 06 07 13 06 27

何とOで開くのこれー?と思って色々なmc関連のサイトを見たが答え見つからず。

結局twitterを検索して見つけたのである

正解はF9を押してPullDnを起動するのであった

スクリーンショット 2019 06 07 13 07 46

いやー、これは悔しい。
わからんでしょこれ。

と思ったので私と同じ悩みの人たちの目に届きますように

ちょっとハマったので備忘録として書いておきます。

最近サーバーでグラフを描画するようなことをしたいと考えていまして、そうなるとsshだけではだめで、GUIを動かす必要があるということでVNCを導入しました。

使ったVNC serverはx11vnc: v0.9.13です。

まずはx11vncをインストール

#apt install x11vnc

続いて、パスワードを設定します

#ディレクトリ名ubuntuになっているところはご自分のユーザー名に置き換えてください
$x11vnc -storepasswd
Enter VNC passwd: [enter new password]
Verify password: [enter the new password again]
Write password to /home/ubuntu/.vnc/passwd? [y]/n y
Password written to : /home/ubuntu/.vnc/passwd

ではx11vncを起動しましょう

#x11vnc -bg -auth guess -forever -loop -noxdamage -repeat -rfbport 5900 -shared -rfbauth /home/ubuntu/.vnc/passwd

これでうまくいかないときはLightdmというソフトウェアを入れましょう

#apt install lightdm

デフォルトディスプレイマネージャーを選択する画面がでるので、lightdmを選択します。

下記のサイトを参考にさせてもらいました。
Cinnamon その19 - ディスプレイマネージャーをLightDMに切り替えるには・Slick Greeterを利用するには - kledgeb

このあと起動時にx11vncを同時に起動させるには/etc内のconfigファイルを設定するのが定石っぽかったのですが、自分はcrontabに@rebootを設定してそこに上に書いたx11vncの起動スクリプトを書くことでオートスタートできるようになりました。

#sudo crontab -e

@reboot x11vnc -bg -auth guess -forever -loop -noxdamage -repeat -rfbport 5900 -shared -rfbauth /home/ubuntu/.vnc/passwd

以上でーす

先日、上司が作ったpythonプログラムのグローバル変数を、外部からのプログラムによって書き換えたいという要求が起こった。

プログラム内でグローバル変数として確保されているメモリ領域を他のプログラムから直接書き換える、なんてことできるのだろうかと調べてみたら、プロセス間通信というのがそれらしいことがわかった。

しかしチラっと説明を見てみるとかなり面倒くさいことが発覚。
そりゃそうだ。ちょっと考えてみれば結構深いところを触らなければいけないことくらいはわかる。

そうして思いついたのは以下の2つ

  1. 環境変数を使ってプログラム間で変数の値を共有する
  2. 中継ファイルを一つ作る

1の方法では不可能だった。
Linux上のプログラムはOS全体の環境変数について読み込むことは出来ても書き換えることはできない。

プログラム上で書き込むことができるように見えても、それはそのプロセスにおいての環境変数が書き換わるだけで、他のプログラムから環境変数にアクセスすると、その値は書き換わってはいないのだった。

次に2の方法を試す。
これはまあ問題ないだろうと思いつつ実装してみると、やはり期待どおり動いた。

そこで友人のdyama氏(https://dyama.orgの運営者)からpipeを使ってはどうかというご提案をいただく。

pipeというのは文字通りfifoなpipeなわけだが、簡単に挙動を説明するとこんな感じ

#terminal A
$mkfifo pipe
$tail -f pipe

#terminal B
$echo "hoge" > pipe

とすると、ターミナルAの方でhogeという文字列が表示される

#terminal A
$tail -f pipe
hoge

この仕組を使って、2つのプログラム間での通信をさせて、外部プログラム(プログラムB)からコマンドを送り、それをpythonプログラム(プログラムA)で処理をするという形にした。

簡単な図にするとこう

スクリーンショット 2019 05 09 10 26 14

他プログラムから自プログラムの変数への介入をさせたいプログラムAは、もともとのメインループに加えてスレッドを実装し、一秒ごとにpipeファイルを読みにいく挙動を付け加えた。

さほどスピードが必要とされる処理ではなかったので一秒に一回で十分だった。

I/Oの時間すら惜しいスピードが求められる処理であれば、プロセス間通信を使う他ないのかなと思うが、ひとまずこれで十分に使えるものが出来たので満足です。