それっぽい技術メモ

UNIXからpythonまで、技術系メモ。知識は人類の共有財産です。

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なら簡単なのにね。

データはこんな感じを想定。
f:id:kopumin:20200615220117p:plain

で、第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みたく ↑ 使えないんだよね。。。



Linuxでよく使うコマンド 番外編 コピペ 

普通は知ってると思っていても、不慣れな人は意外と知らいないことってあるんだな、と痛感。
シェルを実行するのに、サクラにメモったコマンド見ながら、teratermに打ち込んでたので、
コピペができること教えて、感心されました。

Windowsみたいに左クリックでコピーしたい範囲を選択して、コピーしたい場所で右クリックするとコピペができます。

テキストにコピペするときも、左クリックで範囲選択した後、ctl + v とかで張り付けできます。

よし、今期はみんなにLinuxを基礎から布教しよう。