FVWM3のインストール

FVWM3の最新をGitHubよりインストールする。
https://github.com/fvwmorg/fvwm3

#!/bin/bash

# ユーザーのキー入力を待つ関数
pause() {
  read -n1 -r -p "$1" key
  echo
}

echo "FVWM3のインストールを開始します。"

# 必要なパッケージをインストール
echo "必要なパッケージをインストールしています..."
sudo apt update
sudo apt install -y libevent-dev libx11-dev libxrandr-dev libxrender-dev libxt-dev libxft-dev asciidoctor \
libfontconfig-dev libfreetype6-dev libfribidi-dev libncurses5-dev libpng-dev libreadline-dev \
librsvg2-dev libsm-dev libxcursor-dev libxext-dev libxi-dev libxpm-dev sharutils

pause "パッケージのインストールが完了しました。続行するにはキーを押してください..."

# 'fvwm3'ディレクトリが存在するか確認
if [ -d "fvwm3" ]; then
  echo "'fvwm3'ディレクトリが既に存在します。"

  # ディレクトリがGitリポジトリか確認
  if [ -d "fvwm3/.git" ]; then
    echo "既存のディレクトリはGitリポジトリです。"
    while true; do
      read -p "最新の変更を取得するために'git pull'を実行しますか? (y/n): " yn
      case $yn in
          [Yy]* ) cd fvwm3; git pull; break;;
          [Nn]* ) echo "既存の状態で続行します。"; cd fvwm3; break;;
          * ) echo "はい(y)かいいえ(n)でお答えください。";;
      esac
    done
  else
    echo "既存のディレクトリはGitリポジトリではありません。"
    while true; do
      read -p "ディレクトリを削除して再クローンしますか? (y/n): " yn
      case $yn in
          [Yy]* ) rm -rf fvwm3; echo "ディレクトリを削除しました。"; break;;
          [Nn]* ) echo "処理を中止します。スクリプトを終了します。"; exit 1;;
          * ) echo "はい(y)かいいえ(n)でお答えください。";;
      esac
    done

    # GitからFVWM3をクローン
    echo "FVWM3のリポジトリをクローンしています..."
    git clone https://github.com/fvwmorg/fvwm3.git
    pause "リポジトリのクローンが完了しました。続行するにはキーを押してください..."
    cd fvwm3
  fi
else
  # GitからFVWM3をクローン
  echo "FVWM3のリポジトリをクローンしています..."
  git clone https://github.com/fvwmorg/fvwm3.git
  pause "リポジトリのクローンが完了しました。続行するにはキーを押してください..."
  cd fvwm3
fi

# autogen.shを実行
echo "autogen.shを実行しています..."
./autogen.sh

pause "autogen.shの実行が完了しました。続行するにはキーを押してください..."

# コンパイルオプションを環境変数で設定
echo "コンパイルオプションを設定しています..."
export CPPFLAGS="-march=native -O2"
export CFLAGS="-march=native -O2"

# configureを実行
echo "configureを実行しています..."
./configure --enable-mandoc --enable-golang --enable-htmldoc

pause "configureが完了しました。続行するにはキーを押してください..."

# ビルドを実行
echo "FVWM3をビルドしています..."
make clean
make -j$(nproc)

pause "ビルドが完了しました。続行するにはキーを押してください..."

# インストールを実行
echo "FVWM3をインストールしています..."
sudo make install

echo "FVWM3のインストールが完了しました。"
    1. 使用方法
      新しいファイルを作成し、例えばinstall_fvwm3.shという名前を付けます。
    2. 上記のスクリプトをそのファイルにコピーします。
    3. スクリプトに実行権限を与えます。
      chmod +x install_fvwm3.sh
    4. スクリプトを実行します。
      ./install_fvwm3.sh

    各ステップで進捗が表示され、続行する前にキー入力を求められます。これにより、各段階でプロセスを確認できます。

    注意事項:

    • スクリプト内でsudoを使用しているため、実行時にパスワードの入力が求められる場合があります。
    • スクリプトは現在のディレクトリにfvwm3というディレクトリを作成します。
    • 必要に応じて、スクリプトの内容を変更して環境に合わせてください。

Ubuntuのapt upgradeでUbuntu Proの通知がうざい

以下のメッセージがapt upgradeで表示される。肝心の必要な情報は見づらい。
以下のファイルをコメントアウトすると消える。

Get more security updates through Ubuntu Pro with 'esm-apps' enabled:
  python2.7-minimal imagemagick libjs-jquery-ui libopenexr25 libpostproc55
  libmagickcore-6.q16-6-extra libavcodec58 libmagickwand-6.q16-6 libavutil56
  imagemagick-6.q16 libswscale5 libmagickcore-6.q16-6 libswresample3
  imagemagick-6-common libavformat58 python2.7 libpython2.7-minimal
  libpython2.7-stdlib libavfilter7
sudo vi /etc/apt/apt.conf.d/20apt-esm-hook.conf
#APT::Update::Pre-Invoke {
#       "[ ! -e /run/systemd/system ] || [ $(id -u) -ne 0 ] || systemctl start --no-block apt-news.service esm-cache.service || true";
#};

#APT::Update::Post-Invoke-Stats {
#       "[ ! -f /usr/lib/ubuntu-advantage/apt-esm-hook ] || /usr/lib/ubuntu-advantage/apt-esm-hook || true";
#};

#binary::apt::AptCli::Hooks::Upgrade {
#       "[ ! -f /usr/lib/ubuntu-advantage/apt-esm-json-hook ] || /usr/lib/ubuntu-advantage/apt-esm-json-hook || true";
#};

Deapの遺伝子の1の出現数を固定する

from deap import tools,base,creator
import random

toolbox = base.Toolbox()
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)

saidai=30  ##1にする数

def makegene(container):
    hako=[0]*200
    sel=random.sample(range(len(hako)),saidai)
    for h in sel:
        hako[h]=1
    return container(hako)

toolbox.register("individual", makegene, creator.Individual)
#toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_bool, 200)
ind=toolbox.individual()
print(ind)
[0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
ind.count(1)
30

上記では、1が30個に固定されている。この数をランダムに1から30個までにする場合。

from deap import tools,base,creator
import random

toolbox = base.Toolbox()
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)

saidai=30 ##1から最大数saidaiまでにする

def makegene(container):
    hako=[0]*200
    sel=random.sample(range(len(hako)),random.randint(1,saidai))
    for h in sel:
        hako[h]=1
    return container(hako)

toolbox.register("individual", makegene, creator.Individual)
ind=toolbox.individual()
print(ind)
print(ind.count(1))

DEAP を使う

pythonにて遺伝的アルゴリズムを試してみる。
DEAP is a novel evolutionary computation framework

%%time

import random
import numpy
from deap import algorithms
from deap import base
from deap import creator
from deap import tools

creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)
toolbox = base.Toolbox()
toolbox.register("attr_bool", random.randint, 0, 1)
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_bool, 200)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)

def evalOneMax(individual):
    total=individual.count(1) ###1の個数を数える
    return(total),

toolbox.register("evaluate", evalOneMax)
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutFlipBit, indpb=0.03)
toolbox.register("select", tools.selTournament, tournsize=3)

def main():
    random.seed(64) ##random Fix
    pop = toolbox.population(n=300)
    hof = tools.HallOfFame(1)
    stats = tools.Statistics(lambda ind: ind.fitness.values)
    #stats.register("avg", numpy.mean)
    #stats.register("std", numpy.std)
    stats.register("min", numpy.min)
    stats.register("max", numpy.max)

    algorithms.eaSimple(pop, toolbox, 0.5, 0.2, 50, stats, halloffame=hof)

    return pop

if __name__ == "__main__":
    pop=main()
    best_ind = tools.selBest(pop, 1)[0]
    print("Best individual is %s, %s" % (best_ind, best_ind.fitness.values))
gen nevals min max
0 300 78 120
1 187 89 122
2 157 96 127
3 176 99 129
.
.
.
49 178 174 189
50 187 172 189
Best individual is [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1], (189.0,)
CPU times: user 1.09 s, sys: 688 µs, total: 1.09 s
Wall time: 1.09 s

このパラメーターだと50世代で189になり、200が作られていない。algorithms.eaSimpleの50を300に増やすと200世代と少しで、200の個体が作られる
algorithms.eaSimple(pop, toolbox, 0.5, 0.2, 100, stats, halloffame=hof)

pandas.DataFrameを作る

indexにDatetimeIndexでdtype=’datetime64[ns]の値、Closeで100-190の値のDataFrameを作る

import pandas as pd

df_test=pd.DataFrame({
'Date':[
'2022-08-19 00:30:00',
'2022-08-19 00:45:00',
'2022-08-19 01:00:00',
'2022-08-19 01:15:00',
'2022-08-19 01:30:00',
'2022-08-19 01:45:00',
'2022-08-19 02:00:00',
'2022-08-19 02:15:00',
'2022-08-19 02:30:00',
'2022-08-19 02:45:00'],
'Close':[
100,
110,
100,
120,
140,
150,
120,
100,
180,
190]
}
)
df_i = df_test.set_index('Date')
df_i.index=pd.to_datetime(df_i.index)

中身をチェック。
class ‘pandas.core.frame.DataFrame’
DatetimeIndex: 10 entries, 2022-08-19 00:30:00 to 2022-08-19 02:45:00

df_i.info()

listに代入する
class ‘pandas._libs.tslibs.timestamps.Timestampになってる

list=[]
for da in df_i.index:
    print(type(da))
    list.append(da)

datetime型にする

type(list[0].to_pydatetime())

リストからdatetime型にする

for data in list:
    #print(type(data))
    time = data.to_pydatetime() # datetime型に変換
    #print(type(time))
    print(time)

Pandas Tips

ファイルをPanda DataFrameに読み込む

import pandas as pd

usecols = ['Date','Open','High','Low','Close','Volume']
file="~/sshmnt/candles_15m_bybit_BTC-USDT.csv"
data = pd.read_csv(file,names=usecols,parse_dates=True,index_col='Date')

print(len(data))

#data2=data[45700:45800]
#data2=data[46000-1000:46000]
#data2=data[0:59000]
data2=data.tail(120+4*24*1) ##1日分+120
print(len(data2))

data3=data2.copy()

close_data=data3["Close"]
close_data.plot()

列を追加

data3['Trend'] = 0
data3
#またはNaNを入れることも
data3['Trend'] = np.nan

列(Trend)を削除

data3.drop('Trend',axis=1)

列を抽出

#カラム1つ
data4["Close"]
#または
data4.Close
#カラムを2つ
data4[["Close","signal"]]

特定の行の表示、インデックスから

data3['2022-09-02 10:0:0' : '2022-09-02']

特定範囲の行(インデックス)の特定列に代入する(1)

data3['2022-09-02 10:0:0' : '2022-09-02']['Trend']=2

特定の範囲のindex行の、特定列に代入する。(2) *上記の(1)が動作しない場合

data3.loc['2022-09-01 09:00:00':'2022-09-01 23:0:0',"Trend"]=-1

atでこのようなスライスでの使い方はエラーがでるので使えない

data3.at['2022-09-01 09:00:00':'2022-09-01 23:0:0',"Trend"]=-1

特定範囲の抽出

ts= "2022-09-01 09:00:00"
ts2="2023-01-01 09:00:00"
data2= (data[ts : ts2])
data2

JupyterでPandasの表示設定

pd.set_option('display.max_columns', 10)
pd.set_option('display.max_rows', 300)

データフレームの作成、日付時間をインデックスに

df_test=pd.DataFrame({
'Date':[
'2022-08-19 00:30:00',
'2022-08-19 00:45:00',
'2022-08-19 01:00:00',
'2022-08-19 01:15:00',
'2022-08-19 01:30:00',
'2022-08-19 01:45:00',
'2022-08-19 02:00:00',
'2022-08-19 02:15:00',
'2022-08-19 02:30:00',
'2022-08-19 02:45:00']
}
)
df_i = df_test.set_index('Date')

上記ではインデックスが作れるが、dtypeがobjectになってる

df_i.index

Index(['2022-08-19 00:30:00', '2022-08-19 00:45:00', '2022-08-19 01:00:00',
'2022-08-19 01:15:00', '2022-08-19 01:30:00', '2022-08-19 01:45:00',
'2022-08-19 02:00:00', '2022-08-19 02:15:00', '2022-08-19 02:30:00',
'2022-08-19 02:45:00'],
dtype='object', name='Date')

上記をデイトタイムにするにはこれ

df_i.index=pd.to_datetime(df_i.index)

インデックスを見るとIndexがDatetimeIndexのdtypeがdatetime64になった

df_i.index

DatetimeIndex(['2022-08-19 00:30:00', '2022-08-19 00:45:00',
'2022-08-19 01:00:00', '2022-08-19 01:15:00',
'2022-08-19 01:30:00', '2022-08-19 01:45:00',
'2022-08-19 02:00:00', '2022-08-19 02:15:00',
'2022-08-19 02:30:00', '2022-08-19 02:45:00'],
dtype='datetime64[ns]', name='Date', freq=None)

インデックスを削除する

data4=data4.reset_index()

インデックスを付ける

data4=data4.set_index("Date", inplace=False)
# inplace=Trueは
data4.set_index("Date", inplace=True) ### data4をイコールで指定しなくても適応される

ipynbのファイルをtxtに変換する。で、特定語を含むファイルを検索する。

Jupyterlabのipynbファイルの内容を検索したい。その為にtxtだけのファイルに変換する。

入出力リダイレクトを使うので、新しくディレクトリを作り、そこに対象のipynbファイルをコピーする。
安全の為にそのディレクトリで操作を行う。

#!/usr/bin/bash

###
### ipynb to txt化
###

find ./ -name "*.ipynb" >list_ipynb

while read LINE
do
echo "$LINE"
LINE2=${LINE/ipynb/txt}

echo "$LINE2 に変換する"
jq -j '.cells | map( select(.cell_type == "code") | .source + ["\n\n"] ) | .[][]' < $LINE > $LINE2
done < list_ipynb
#!/usr/bin/bash

txt化したファイルができたら、検索語をxargs grepでファイルごとに検索する。

find ./ -name "*.txt" | xargs grep $1

BybitのSymbolsの取得

https://bybit-exchange.github.io/docs/futuresV2/inverse/#t-querysymbol


from pybit import inverse_perpetual
session_unauth = inverse_perpetual.HTTP(
endpoint="https://api-testnet.bybit.com"
)

r=session_unauth.query_symbol()
#len(r)
r
#len(r['result'])

pandas DataFrameを作成する。


import pandas as pd
df = pd.DataFrame(r['result'])

JypyterでPandas表示が切れるので全部表示するには

df = pd.DataFrame(r['result'])

pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
pd.set_option('display.max_colwidth', None)

df

Fvwm3-1.0.5 来る

https://github.com/fvwmorg/fvwm3/releases/tag/1.0.5

https://github.com/fvwmorg/fvwm3

1年ぶりのアップデートがリリースされました。
いくつかの変更とバグフィックスがずらっとありますね。

Debianが先行し、Ubuntuにfvwm3が追加された具合である。
Ubuntu 22.10(kinetic)にパッケージ: fvwm3 (1.0.4+ds-1build1) [universe]
Debianはtestingとsidにパーケージが追加された。

bookworm (testing) (x11): F(?) Virtual Window Manager
1.0.5+ds-1: amd64 arm64 armel armhf i386 mips64el mipsel ppc64el s390x
sid (unstable) (x11): F(?) Virtual Window Manager
1.0.5+ds-1: alpha amd64 arm64 armel armhf hppa i386 m68k mips64el mipsel ppc64 ppc64el riscv64 s390x sh4 sparc64 x32

 

自分はUbuntu 22.04 LTS “Jammy Jellyfish”を使っている。パッケージはなく、いつものようにコンパイルしてインストールをする。

必要なパッケージはインストール

$sudo apt install libevent-dev libx11-dev libxrandr-dev libxrender-dev libxt-dev libxft-dev asciidoctor libfontconfig-dev libfreetype6-dev libfribidi-dev libncurses5-dev libpng-dev libreadline-dev librsvg2-dev libsm-dev libxcursor-dev libxext-dev libxi-dev libxpm-dev sharutils

gitからインストールを行う

$git clone https://github.com/fvwmorg/fvwm3.git

fvwm3ディレクトリーに移動し

$./autogen.sh
$./configure --enable-mandoc --enable-golang

Makefileの、’CPPFLAGS’を、CPPFLAGS = -march=nativeにして

$make clean && make -j10

sudoでインストールする

sudo make install

過去の記事