php + apache でパスが通らなかった件。 とりあえずputenvで暫定対応。
php + apacheで作っているシステムをAWSにリフトアップしてるんですけど、oracleにconnectするところでORA-01804。
挫折しながら対応中なので、こちらの記事は別機会に。
Linux で環境変数食わすためには通常、.bash_profileに書いたりしますが、apacheユーザはnobody。
ということで、/etc/sysconfig/httpd に書いてみたりするのが普通ですが、今回はなぜか反映されない。
phpinfo()で見てみても、environment にない。
「ORACLE_HOME」も「LD_LIBRARY_PATH」も「NLS_LANG」もない。
ということでとりあえず暫定対応として、phpにハードコーディング!
sample.php
<? putenv("ORACLE_HOME=/opt/app/oracle/〇〇〇">; putenv("LD_LIBRARY_PATH=/opt/app/oracle/〇〇〇/lib">; putenv("NLS_LANG=Japanese_Japan.UTF8">; phpinfo(); ?>
根本解決になってないけど、とりあえずパス通ったから、OK。
python で2次元配列をソート
python + flask で2次元配列ってあんまりはやらないのか、情報が少なくて困る。
listで2次元配列を作って、昇順・降順を織り交ぜてソートする場合の手順。
excelなら簡単なのにね。
データはこんな感じを想定。
で、第3ソートまでしたいとします。
- 第1ソート:山の数 昇順
- 第2ソート:川の数 昇順
- 第3ソート:池の数 降順
pythonで昇順と降順は同時にソートできないので、ソートは2回に分けてます。
ポイントは、itemgetterをつかうところ。
from operator import itemgetter #表の中身を2次元配列に格納 my_list =[ [東京,120,23,3643], [神奈川,84,43,2209], [神奈川,84,43,2209], [埼玉,161,12,2899], [千葉,43,22,659], [茨城,33,34,859], [山梨,366,68,1555]] #1回目のソート(第1キー、第2期キー) my_sorted_list = sorted(my_list, key=itemgetter(1,2)) sorted(my_sorted_list, key=itemgetter(3), reverse=True) print(my_sorted_list)
Linux でよく使わないコマンド ldd
Cをgccじゃなくて、make したいとき、エラーを探す助けになりました。
今日もmakeでiconv の linkエラーになっていたので、iconvってどこにあったけな? ライブラリってどこ読んでるんだっけ?と調べたいときにパスが通ているか確認するのにたたいたコマンド。
ldd
>ldd iconv libiconv.so.2 => /usr/local/lib/libiconv.so.2
Windows10 のWSLで動かしているubuntuだと ldd うまく動かなくて、 ldd iconvの結果がコピペできなかったので、上記はこんな感じで表示されますよ、サンプル。
コマンド/プログラムで使っているライブラリの種類とパスを表示してくれます。
ここでパスが通ってるか、通ってないかを確認。
ちなみにiconvを使ったC自作プログラムのmake ではまっていた原因は、makeのLDFLAGのお尻に -liconv を付けたら、makeができて解決できました。
詳細調べてないです。結果OK主義なので。
Linux でよく使うコマンド which
コマンドがどこにあったか調べたいとき、たまにあります。
今日もmakeでiconv の linkエラーになっていたので、iconvってどこにあったけな? ライブラリってどこ読んでるんだっけ?と調べたいときにまず最初にたたいたコマンド。
which
>which iconv /usr/bin/iconv
findで探すのはちょっと気が引けるときに気楽に試せるコマンドです。
python で 固定長ファイルの読み込み、キーワードで分解し、2次元配列に格納
後からwebアプリにする事とか考えないで、とりあえず見やすいように固定長ファイル+キーワードでログをはいている場合、pandasで簡単にさばけない。
ので、しょうがないからキーワードをもとに固定長でゴリゴリスプリットして、listかtapleに入れ行きます。
配列になってたら、csvにするとかDBにinsertするとか簡単だしね。
尚、固定長と言いながら、キーワードでインデックスを取得してたりします。
固定長ライクなファイルでも応用が利くように。
読み込む元のログファイルはこんなイメージ
2020/06/01 10:00:00 PID=[0001] TYPE=[INFO] MSGID=[I0001] MSG=[処理開始] 2020/06/01 10:00:02 PID=[0002] TYPE=[INFO] MSGID=[I0002] MSG=[ファイル作成完了] 2020/06/01 10:00:05 PID=[0001] TYPE=[INFO] MSGID=[I0010] MSG=[処理完了]
で、これを読み込んで、2次元配列に格納します。
ちなみにパスを渡すとき¥は¥¥でエスケープしてあげないと、うまくうごかいないっす。
#読み込むファイルのパス file_path = 'c:\\temp\\sample.log' #log読み込み try: f = open(file_path, encoding='utf-8') #utf-8でファイルを開く line = f.readlines() #ファイルを変数lineに1行ずつ格納 f.close() except: error_code = 'Log read ERROR!' printf(error_code) fst_chk = 0 #配列の1行目かそれ以外かを判断するためのフラグ for tmp_line in line: #ファイルの1行目~最終行まで順番に読み込んで配列に格納 #実行日時 t_dt = tmp_line[0:19].replace('/','-') #x行目の0文字目~19文字目までを切り出して、変数に格納 #MySQLがYYYY-MM-DDなので、replaceで / を - に変換 #プログラムID pgm_id_idx = tmp_line.find('PID=[') #キーワードが出現するのが何文字目かを取得 t_pgm_id = tmp_line[pgm_id_idx+5:pgm_id_idx+4] #キーワードが5文字なのでそこから4文字分を取得 #処理区分 kind_idx = tmp_line.find('TYPE=[') t_kind_id = tmp_line[kind_idx+6:kind_idx+4] #メッセージID msg_id_idx = tmp_line.find('MSGID=[') t_msg_id = tmp_line[msg_id_idx+7:msg_id_idx+5] #メッセージ (最長20文字までを取得) msg_idx = tmp_line.find('MSG=[') t_msg = tmp_line[msg_idx+5:msg_idx+20] #ファイル1行をキーワード+固定長で項目ごとに分割したので、2次元配列に格納 if(fst_chk == 0): #ファイル1行目は2次元配列を作成 l_log = [[t_dt ,t_pgm_id,t_kind_id,t_msg_id,t_msg ]] #2次元配列なので、l_log = [[〇,〇]]みたいに書く fst_chk = 1 else: #ファイル2行目以降は、すでにl_logという2次元配列ができているので、appendしていく。l_log.append([〇,〇])みたいに書く。 l_log.append([t_dt ,t_pgm_id,t_kind_id,t_msg_id,t_msg ])
Linuxでよく使うコマンド 番外編 さっきのコマンドもう一回実行
>history
って打つと、直前に実行したコマンドが表示されます。
こんな感じに。
kopumin@kopumin:~$ history 1 pwd 2 touch ubuntu_home.txt 3 ll 4 cd / 5 ll 6 top 7 iostat 8 vmstat 9 seq 10 man seq 11 exit 12 history kopumin@kopumin:~$
でももっとサクッとさっきのコマンドもう一度打ちたかったり、パスを修正して打ち直したかったりする時は、キーボードの上矢印 ↑ を押下しよう。
前に実行したコマンドが順に表示されます。
そのままもう一度Enterで実行するもよし、パスとかちょっと修正して、打ち直すもよし。
でも、HP-UXはBシェルだから、bashみたく ↑ 使えないんだよね。。。