Archive for the ‘Programming’ Category

neovimを使っていて、:HealthCheckを実行時、python3はOKなのにpython2はエラーが出ていた。
python3とpython2、どちらもOKじゃないと問題がないかはわからなかったが、とりあえずエラーが出ている状態というのは気持ちがいいものではないので解決した

環境:
os:Linux Ubuntu18.04LTS
python2:2.7.16
python3:3.7.2

このサーバーではpythonのバージョン管理にpyenvを使っている。

記事執筆時に新しいバージョンだったpython2とpython3を導入している
それぞれ環境のところに書いてあるpythonをpyenvを使ってインストールをした。

その後、~/.config/nvim/init.vimに下記の記述を追加


let g:python_host_prog = expand('~/.pyenv/versions/2.7.16/bin/python2')
let g:python3_host_prog = expand('~/.pyenv/versions/3.7.2/bin/python3')

これで:CheckHealthをするとエラーは消えた

バージョンを直で書くのはよくないとかいう声も聞こえてきそうだけれど、とりあえずはこれでよし

(本当の問題は別のプラグインがまともに動いてくれていなくて、これがpython2がうまく動かないことに起因しているのかを確かめたかったのです)

下記記事を参考にさせていただきました。ありがとうございます。

init.nvim にpython のpath を指定してneovim の起動速度を早くする - Qiita

先日、上司が作った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がゲットできました。

それでは、また。