Archive for the ‘Programming’ Category

先日、上司が作った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の時間すら惜しいスピードが求められる処理であれば、プロセス間通信を使う他ないのかなと思うが、ひとまずこれで十分に使えるものが出来たので満足です。

687474703a2f2f626f7765722e696f2f696d672f626f7765722d6c6f676f2e706e67

ちょっとウェブサイトのスクラッチをしようと思って、CMSフレームワークはGumbyを使おうと思ってスタート。

以前にもつかった事あるし〜と思いながらGumbyのDLサイトに行くとGumbyの開発が終了したとのおしらせ。
なぜ・・・。

結局CSSフレームワークはBootstrap一強時代に突入なのか。
Gumby使い勝手よかっただけに残念です。今後OSS化するらしい。
Bootstrapの学習面倒くさい・・・。

気を取り直してまだ下の方でDL出来たのでGumbyゲット(結局使うやつ)

さて、今回はParallaxを使いたかったのでBowerを使ってParallaxを導入としたところ、npmもbowerも環境がなかったので構築しようとしたところハマったのでメモです。

npmのインストール

# apt-get install npm
でOKです。

npmを使ってbowerのインストール

# npm install -g bower

でどうぞ。
ちなみに-gはグローバルにインストールという事でこれをつけるとpathが通るって事だと思います。

続いて、gumbyのディレクトリに移動してから

$ bower install gumby-parallax

としたところ、

/usr/bin/env: node: そのようなファイルやディレクトリはありません
#英語だと
/usr/bin/env: node: No such file or directory

との表示が。

bowerないじゃん!

という事で、解決策を探したところありました。

# ln -s /usr/bin/nodejs /usr/bin/node

をしたらいいとの事です。

/usr/bin/node を /usr/bin/nodejs にリンクさせてあげたらよかったんですね。

これでめでたく、parallaxのmoduleがゲットできました。

それでは、また。

python-logo-master-v3-TM

先日Linux上でPythonのプログラムを開発していた時にディレクトリの中の画像ファイル一覧を取得したいなあと思う事がありました。

ディレクトリの中にはテキストファイルや、csvファイルが同時に含まれていたのですが、画像ファイルの一覧だけをリスト化したいなあと。

という事でどうやって解決したのかをここに記して置こうと思います。

import commands
jpgList = []
jpgList =  commands.getoutput("ls targetPath | grep *.jpg").split("\n")

osモジュールのlistdir()メソッドとかでもディレクトリとファイルの参照が出来るようですが、使い慣れたbashの出力をそのままゲット出来るcommands.getoutput()メソッドの方が便利だなと私は感じました。

このメソッドに文字列を渡すとカレントディレクトリでシェルコマンドを実行、返り値を取得する事ができます。

次のsplit()メソッドがキモなのですが、lsの返り値は"\n"で区切られています。

適当なファイルのあるディレクトリ内で

ls > result.txt
less result.txt

とやってみれば改行がIFS(内部フィールド区切り文字 (Internal Field Separator))となっている事が分かると思います。

よって、split("\n")で改行によって分割、リスト化してあげればlsの返り値を簡単にリスト化する事が出来るというワケです。

読者諸兄におかれましては蛇足となりましょうが、 "| grep *.jpg" によってファイル末尾(拡張子)が".jpg"のファイル群のみをリストアップするようにする事でjpgファイルらのみをリスト化しております。