dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

pyenv による python のインストール

2024-08-31 14:20:40 | python

pyenv による python のインストールメモ。

pyenv のインストール

準備

sudo yum install git

pyenv のインストール

curl https://pyenv.run | bash

python のインストール

準備

sudo yum install gcc
sudo yum install g++
sudo yum install gcc-c++
sudo yum install zlib-devel
sudo yum install openssl-devel
sudo yum install bzip2-devel
sudo yum install xz-devel
sudo yum install ncurses-devel
sudo yum install libffi-devel
sudo yum install sqlite-devel
sudo yum install readline-devel

インストール可能な python のバージョンを確認

pyenv install --list

python のインストール

pyenv install 3.12.5
Downloading Python-3.12.5.tar.xz...
-> https://www.python.org/ftp/python/3.12.5/Python-3.12.5.tar.xz
Installing Python-3.12.5...
Installed Python-3.12.5 to /home/{...}/.pyenv/versions/3.12.5

利用可能な python のバージョンを表示

pyenv versions
* system (set by /home/{...}/.pyenv/version)
  3.12.5

python のバージョンを選択

pyenv global 3.12.5
pyenv versions
  system
* 3.12.5 (set by /home/{...}/.pyenv/version)

python で文字列の先頭を指定バイト以内で切り出し

2024-08-31 13:03:35 | python

python で文字列の先頭を指定バイト以内で切り出す方法のメモ。

単純に指定バイト数で文字列の先頭を取得すると、日本語のマルチバイト文字が途中で切れてしまうため、文字が途中で切れないように確認しながら先頭文字列を取得します。。

import io

def get_head_by_bytes(str, max_bytes, encoding='utf-8'):
    buf = io.BytesIO()
    buf_len = 0
    str_len = len(str)

    for c in str:
        b = c.encode(encoding)
        b_len = len(b)

        if buf_len + b_len <= max_bytes:
            buf.write(b)
            buf_len += b_len
        else:
            break

    bytes = buf.getvalue()
    buf.close()
    out_str = bytes.decode(encoding)

    return out_str

def main():
    strs = [
        "ビール!麦酒!",
	"ビール!beer!麦酒!",
    ]

    for str in strs:
        head = get_head_by_bytes(str, 15)
        num_bytes = len(head.encode('utf-8'))
        print(f'''org:  {str}''')
        print(f'''head: {head}({num_bytes})''')

    return 0

if __name__ == '__main__':
    res = main()
    exit(res)

実行結果

org:  ビール!麦酒!
head: ビール!麦(13)
org:  ビール!beer!
head: ビール!beer!(15)

GA4 の BigQuery のログを URL 毎に集計

2024-08-27 21:02:44 | BigQuery

GA4 の BigQuery のログを URL 毎に集計する方法のメモ。


from で unnest(event_params) を指定する場合

select
  event_date as date
  , p.value.string_value as url
  , count(*) as pv
from
  `{ga_dataset}.events_*`
  , unnest(event_params) as p
where
  _table_suffix = '{YYYYmmdd}'
  and event_name = 'page_view'
  and p.key = 'page_location'
group by
  date
  , url
;

from で unnest を指定しない場合

select
  event_date as date
  , (select p.value.string_value from unnest(event_params) p where p.key = 'page_location') as url
  , count(*) as pv
from
  `{ga_dataset}.events_*`
where
  _table_suffix = '{YYYYmmdd}'
  and event_name = 'page_view'
group by
  date
  , url
;

event_params からのデータ取得関数を作成した場合

関数定義

event_params はデータ構造が複雑なため、引数は any type としています。

create or replace function
  {dataset}.get_event_params_value (
    event_params any type
    , key string
  )
returns struct<>
as (
 (select
    p.value
  from
    unnest(event_params) as p
  where
    p.key = key
  )
);

ログ集計 SQL

select
  event_date as date
  , {dataset}.get_event_params_value(event_params, 'page_location').string_value as url
  , count(*) as pv
from
  `{ga_dataset}.events_*`
where
  _table_suffix = '{YYYYmmdd}'
  and event_name = 'page_view'
  and p.key = 'page_location'
group by
  date
  , url
;


JavaScript で配列を連結

2024-08-16 22:37:05 | javascript

JavaScript で配列を連結する方法のメモ。

以下の3つの方法を試してみます。

  • concat()
  • [...a, ...b]
  • push()
> a = [0, 1, 2, 3];
> b = [4, 5, 6, 7];

# concat() の場合
> c = a.concat(b);
[0, 1, 2, 3, 4, 5, 6, 7]

> a;
[0, 1, 2, 3] # a は変更なし

# [...a, ...b] の場合
> c = [...a, ...b];
[0, 1, 2, 3, 4, 5, 6, 7]

> a;
[0, 1, 2, 3] # a は変更なし

# push() の場合
> c = a.push(...b);
8 # 配列の長さが返却される

> a;
[0, 1, 2, 3, 4, 5, 6, 7] # a に追加される

Cloud Armor での Basic 認証

2024-08-11 16:55:45 | GCP

Cloud Armor で Basic 認証を行う方法のメモ。

Cloud Armor のルールで、リクエストヘッダーの Authentication に指定された文字列が所定のID、パスワードからなる文字列になっていることを確認し、確認できなかった場合には拒否する。


Authorization は以下の形式の文字列となっている。

Authorization: Basic {base64encode(“{ユーザ}:{パスワード}”)}

ユーザ=user、パスワード=password の場合、以下のコマンドで base64 の文字列を生成することができる。

$ echo -n "user:password" | base64
dXNlcjpwYXNzd29yZA==

/auth ディレクトリに上記のユーザ、パスワードで Basic 認証をかける場合には、以下の拒否ルールを設定する。

request.path.matches('^/auth/')
&& (! has(request.headers['Authorization'])
    || request.headers['Authorization'] != 'Basic dXNlcjpwYXNzd29yZA==')

GCP をコマンドライン・アプリケーションから利用

2024-08-04 18:38:21 | GCP

コマンドラインからの利用

コマンドラインで GCP の機能を利用できるようにするには以下を実行します。
  • 以下のコマンドを実行。
    gcloud auth login
  • 続行するか聞かれるため「y」を入力。
    Go to the following link in your browser:
        https://accounts.google.com/o/oauth2/auth?...
  • “アカウントの選択「Google Cloud SDK」に移動” の画面で GCP にログインするメールアドレスを選択。
  • “Google Cloud SDK が Google アカウントへのアクセスをリクエストしています” の画面で「許可」を押下。
  • 表示された認証コードをコピーし、コマンドラインの “Enter verification code: " に、認証コードをペーストしてリターンキーを押下。

アプリケーションからの利用

Python などで作成したアプリケーションから GCP の機能を利用できるようにするためには、以下を実行します。
  • 以下のコマンドを実行。
    gcloud auth application-default login
  • 「コマンドラインからの利用」と同様の手順で認証を行うと、アプリケーションから GCP の機能を利用できるようになる。