60歳からITエンジニアを目指す無謀なブログ

60歳で定年し、職種を変更してIT技術者を目指すブログです。

ubuntu にPythonインストール 仮想環境 Jupyter-lab インストール

Windows11にHyper-VUbuntu環境を構築したので、そこにPythonをインストールしたときの手順を記載します。

先ず、Ubuntuにビルド環境を準備します

>sudo apt update

>sudo apt install build-essential libbz2-dev libdb-dev   libreadline-dev libffi-dev libgdbm-dev liblzma-dev   libncursesw5-dev libsqlite3-dev libssl-dev   zlib1g-dev uuid-dev tk-dev

 

次にネットからPythonのバージョンを指定して、Tar圧縮ファイルをダウンロードします。ここではバージョン3.12.0の例です

wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz

ローカルで解凍します。

>tar xJf Python-3.12.0.tar.xz

cd Python-3.12.0

インストールPathを指定します

>./configure --prefix=/home/user/.local/python

make
管理者権限でインストール
>sudo -s make install

もとからあるPython3のシンボリックリンクを削除
>rm /usr/bin/python3
新たにインストールしたPython3 のシンボリックリンクを作成
>sudo -s ln -s /home/user/.local/python/bin/python3 python3

うまく行ったかどうか、バージョンを確認します。
>python3 --version
Python 3.12.0

上のようにバージョンが出ればOK

ワークディレクトリに移動して仮想環境を作成します
>python3 -m venv .venv

ここで仮想環境を実行するため以下を実行します
>source .venv/bin/activate

そうするとプロンプトが
(.venv) xxxxxxx >
のように変わります

次にjupyterlabのインストールです
>.venv/bin/pip3 install jupyterlab
次のコマンドでjupyter-labが起動します

>jupyter-lab


以上です


pandas DF 抽出

グループby すると、DFの「地区名」にある名前からグループ分けして、
この場合は平均を求めてくれる、以下は参考例

df_mean =  df.groupby('地区名').mean()

            取引価格(総額)           坪単価      面積(㎡)     取引価格(㎡単価)     
地区名                                                                      
佃       4.877778e+07  2.609899e+06  58.333333  7.908784e+05  
入船      2.700000e+07  1.862142e+06  45.000000  5.642855e+05   
八丁堀     2.000000e+07  2.639999e+06  25.000000  8.000000e+05  
勝どき     3.091667e+07  1.666454e+06  57.083333  5.049862e+05  
新富      2.710000e+07  1.831499e+06  44.000000  5.549998e+05  

例えば坪単価のランキングにしたい場合は降順にするのでascendin=Flaseで
sortすれば良いので以下のようにする

df_mean_sort = df_mean.sort_values(by='坪単価',ascending=False)

ここでgroupbyされた「地区名」は1行、下げられているのはIndex扱いになっているからで、これを普通のカラム扱いにするには、index resetする

df_mean_sort.reset_index(inplace=True)

  地区名       取引価格(総額)     坪単価       面積(㎡)     取引価格(㎡単価)     
0  日本橋室町   3.200000e+07   4.22399e+06   25.000000      1.280000e+06   
1   日本橋箱崎町  2.618500e+07   3.201157e+06   29.250000      9.700476e+05    
2   日本橋蛎殻町  3.050000e+07  3.156153e+06   40.000000     9.564095e+05    
3   銀座                 3.400000e+07  3.036000e+06  35.000000     9.200000e+05   
4   八丁堀             2.000000e+07  2.639999e+06  25.000000     8.000000e+05   


 

インデックス参照で行、列抽出|    df[ ] 1つしか適用できない!

例)

インデックス名、カラム名で行、列抽出|df.loc[ ]

行番号、列番号で行、列抽出|df.iloc[ ]

 

 

openssl コマンドを使った、証明書ファイル  xxxx.cerの確認方法 

>openssl x509 -in www.sample.jp.cer -text -noout

 意味:www.sample.jp.cer を取り込んで テキストで結果を出力する

 

出力例

ーーーーーー

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            2d:10:88:83:4d:6e:a1:10:e4:5d:11:e3:0b:a7:19:8f
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = JP, O = "SECOM Trust Systems CO.,LTD.", CN = NII Open Domain CA - G7 RSA
        Validity
            Not Before: Apr 17 07:29:12 2023 GMT  <--新しい有効期限
            Not After : May 17 07:29:12 2024 GMT  <-- ここまで
        Subject: C = JP, ST = Miyagi, L = Sendai-shi, O = Tohoku University, CN = www.icd.riec.tohoku.ac.jp
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)

index.cgiを実行時にエラーEnd of script output before headers: index.cgi

 

End of script output before headers: index.cgi

 

index.cgi--------  permission 777

#!/usr/bin/python3

print ('Content-type: text/html\n')
print ("Test Response")

 

.htaccess --------------- permission  644

DirectoryIndex index.cgi index.php index.htm index.html index.shtml
Options ExecCGI
Require all granted

 

これをサーバのディレクトリアクセスして実行すると

”End of script output before headers: index.cgi”エラー

が出力されます

 

そこでindex.cgiパーミッションを705に変更すると

エラーが消え解決されました。 原因は不明です。

 

さらにこのindex.cgiがおいてあるカレントディレクトリ"."のパーションの

GuestユーザのパーミッションをWアクセス可能にすると同様に

”End of script output before headers: index.cgi”エラー

が出力されます

 

これから予想すると、CGIファイルにはライトパーミッション

不可してはだめなのか、もしくはどこかのhttpd.confに制限が掛けてあり、それと矛盾している設定のためこのようなエラーが出るのかも知れません。

 

 

.httpd.conf .htaccess ファイルの設定メモ

DirectoryIndexディレクトリインデックスコマンド

DirectoryIndex index.html index.htm index.shtml

URLがディレクトリをアクセスした時に返すファイル名を指定できる

左から優先順位が高い

 

Optionsコマンド [引数1]  [引数2]  .....

 

例) Options Indexes FollowSymLinks ExecCGI

Indexes ディレクトリ内のファイル一覧表示を許可

FollowSymLinks ディレクトリ内のリンクを辿れる

ExecCGI CGIの実行を許可

None すべての機能を無効

 

Directoryディレクティブ:URLが特定のディレクトリをアクセスしたときに

そのアクセスに対して条件・制御などを設定できる

<Directory "/home/www/htdoc/myproj">

コマンド1

コマンド2

  .....

</Directory>

 

 

 

Requireコマンド

Require all granted   すべてのアクセスを受け付ける

 

AllowOverride コマンド <Directory> ディレクティブの中で定義する

 

例)

<Directory "/home/www/">

 AllowOverride All                     /home/WWW/以下のディレクトリで設定の上書き許可

</Directory>

 

<Files ".ht*">         .ht* で.htaccess  .httpd.confなどが対象
  Require all denied      上記マッチするファイルのアクセス禁止
</Files>

<IfModule mod_rewrite.c>      <-リライトモジュールが利用できるか?
  RewriteEngine on        <-リライトエンジンの有効化
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</IfModule>


htmlからpythonへのフォームの転送方法

これもChatGPTに聞いてみました。

 

HTMLのフォームでユーザーが入力したデータをPythonに渡すには、以下の方法があります。

  1. Flaskを使用してHTMLフォームからデータを受け取る

Flaskは、PythonでWebアプリケーションを構築するためのフレームワークです。Flaskを使用して、HTMLフォームからデータを受け取ることができます。以下は、FlaskでHTMLフォームからデータを受け取るためのサンプルコードです。

HTMLフォーム

<form action="/submit" method="post">
  <input type="text" name="username">
  <input type="submit" value="Submit">
</form>

 

Flaskアプリケーション

from flask import Flask, request

app = Flask(__name__)

@app.route('/submit', methods=['POST'])
def submit():
    username = request.form['username']
    return f'Hello, {username}!'

上記のコードでは、/submit URLパスにPOSTリクエストが送信されたときに、submit()関数が呼び出されます。submit()関数では、requestオブジェクトからフォームデータを取得し、ユーザー名を取得しています。最後に、ユーザー名を含むメッセージを返しています。

 

  1. CGIを使用してHTMLフォームからデータを受け取る

CGI(Common Gateway Interface)は、Webサーバーと外部のプログラムを連携するための仕組みです。CGIを使用して、HTMLフォームからデータを受け取ることができます。以下は、CGIを使用してHTMLフォームからデータを受け取るためのサンプルコードです。

HTMLフォーム

<form action="/cgi-bin/submit.py" method="post">
  <input type="text" name="username">
  <input type="submit" value="Submit">
</form>

 

submit.py

#!/usr/bin/env python

import cgi

form = cgi.FieldStorage()

username = form.getvalue('username')

print('Content-type: text/html\n')
print(f'Hello, {username}!')

 

上記のコードでは、submit.pyスクリプトがWebサーバーによってCGIとして実行されます。submit.pyスクリプトでは、cgiモジュールを使用してフォームデータを取得し、ユーザー名を取得しています。最後に、ユーザー名を含むメッセージを出力しています。

以上の方法で、HTMLフォームからPythonにデータを渡すことができます。Flaskを使用すると、より高度なWebアプリケーションを構築することができます。

flask 複数プログラム動作 ルーティング機能

レスポンシフなWebサイトを構築するときに、どうしても複数プログラムを動作させたい時があります。

なかなかそういう例がネットで見当たらないのでChatGPTに聞いてみした。

 

以下その回答です。

ーーーーーーーーーーーー

アクセスディレクトリ内に

alpha_a.py

alpha_b.py

alpha_c.py

templates/

               +---- rendar.html

がある前提です。

 

alpha_a.pyに以下のようなコードを追加して、別のビューを作成できます。

from flask import render_template
from alpha_a import app

@app.route('/alpha_b')
def alpha_b():
    return render_template('rendar2.html')

@app.route('/alpha_c')
def alpha_c():
    return render_template('rendar3.html')

 

上記のコードは、/alpha_bと/alpha_cのURLパスに対して、それぞれalpha_b()とalpha_c()関数を関連付けます。これにより、それぞれの関数が呼び出されたときに、rendar2.htmlおよびrendar3.htmlのテンプレートがレンダリングされます。

rendar.htmlテンプレート内で、/alpha_bと/alpha_cのURLにリンクを追加することができます。例えば、以下のようになります。

<a href="{{ url_for('alpha_b') }}">Alpha B</a>
<a href="{{ url_for('alpha_c') }}">Alpha C</a>

 

なお、alpha_b.pyやalpha_c.pyの中でrendar2.htmlやrendar3.htmlを表示する場合には、それぞれのファイルをレンダリングするためのFlaskのルートを作成する必要があります。これらのファイルをレンダリングするためのFlaskルートは、alpha_a.pyと同様に作成することができます。具体的には、以下のようになります。

from flask import render_template
from alpha_b import app

@app.route('/rendar2')
def rendar2():
    return render_template('rendar2.html')

from alpha_c import app

@app.route('/rendar3')
def rendar3():
    return render_template('rendar3.html')

 

上記のコードは、/rendar2および/rendar3 URLパスに対して、それぞれrendar2()およびrendar3()関数を関連付けます。これにより、それぞれの関数が呼び出されたときに、rendar2.htmlおよびrendar3.htmlのテンプレートがレンダリングされます。