min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

PHP 再帰関数その3

f:id:min117:20210101184113p:plain

再帰的にフォルダを読み込みたいお正月。その3。

 

前回作ったのを改良して

min117.hatenablog.com

今いるフォルダから下の階層を(再帰的に)読むのを作る。

 

bash(treeコマンド)で見るとこんな感じのフォルダを

f:id:min117:20210101183235p:plain

PHPで読み込んで、ブラウザからアクセスできるようにする。

 

できた。ブラウザからはこうなる。

f:id:min117:20210101183137p:plain

f:id:min117:20210101184049p:plain

ソースはこれ。

$ vim my_recursive04.php

f:id:min117:20210101183458p:plain

f:id:min117:20210101183552p:plain

49行目 scandirでオブジェクトを配列に格納

51行目 配列の要素それぞれについてforeachで処理

53行目 ここで自分自身を呼び出す(再帰)。

 対象がファイルなら19行目が実行されるし

 対象がフォルダなら29行目に入って、また53行目に辿り着き

  また対象がフォルダなら29行目に入って 〃

   最深部フォルダで全てがファイルなら19行目に当たって抜けてくる。

 

こりゃ便利。かなり実用に近づいた。

 

コピペ用

<?php

 

// nikkei XTECK

// 54. 再帰関数を使ってみよう

// https://xtech.nikkei.com/it/article/COLUMN/20070827/280408/

 

// 引数$path にはディレクトリorファイルの絶対パスを指定する。

 

// $saiki = 0;

$kaisou = 0;

 

function getDirList($path) {

    // global $saiki;

    global $kaisou;

    // $total_size = 0;

    print '<br>';

 

    //指定したのがファイルだった場合はサイズを返して終了

    if (is_file($path)) {

        // print '再帰:' . $saiki . '回目';

        // print '<br>';

        print '<font color="blue">ファイル</font>パス:<br>' . "$path";

        print '<br>';

 

        print '階層:' . $kaisou;

        print '<br>';

 

        return filesize($path);

    } elseif (is_dir($path)) {

        // カレントディレクトリ(.)or

        // 上位階層ディレクトリ(..)の場合はここで終了

        $basename = basename($path);

        if ($basename == '.' || $basename == '..') {

            return 0;

        }

 

        // ファイルでもなく、カレント(.)でもなく、親(..)でもない

        // つまりディレクトリだったら、フォルダpathとして表示

        print '<font color="red">フォルダ</font>パス:<br>' . "$path";

        print '<br>';

 

        // 階層を表示

        $kaisou++;

        print '階層:' . $kaisou;

        print '<br>';

 

 

        // ディレクトリ内にあるオブジェクト(ファイルまたはディレクトリ)の一覧を入手。

        $obj_list = scandir($path);

 

        foreach ($obj_list as $obj) {

            // ディレクトリ内のオブジェクトを引数にして、自分自身を呼び出す再帰

            getDirList($path . '/' . $obj);

            // $total_size += getDirList($path . '/' . $obj);

            // $objがディレクトリだったら

            // また自分自身を呼び出す(再帰)して…を繰り返して

            // 最深部の階層(ファイルのみが存在する階層)まで行く

        }

        // return $total_size;

        // print '階層ぅ:' . "$kaisou" . '<br>';

 

    } else {

        return 0;

    }

 

// カレントフォルダの確認

print '------------------------<br>';

print getcwd() . '<br>';

print '階層:' . $kaisou;

print '<br>';

print '------------------------<br>';

 

//関数実行

print getDirList('/media/WD30EZRX/PT3/test_pdf2jpg');

 

 

 

 

PHP 再帰関数その2

f:id:min117:20210101182512p:plain

 

再帰的にディレクトリを読みたいお正月。

min117.hatenablog.com

 

まんまの例があった。

xtech.nikkei.com

 

とりあえず写経。

$ vim my_recursive03.php

f:id:min117:20210101182118p:plain

42行目で、自分の環境にあった適当なフォルダパスを(絶対パスで)指定してやる。

 

速攻動かす。

f:id:min117:20210101182556p:plain
よし。

 

しかし。ファイルサイズなんか見れても何も実用的じゃない。タメになる記事だけど、実用性がないんじゃ使えない。

 

せめてファイルの一覧を再帰的に出す(bashで言えば tree的な)な機能だったらよかったのに。次回実装する。

 

コピペ用

<?php

 

// nikkei XTECK

// 54. 再帰関数を使ってみよう

// https://xtech.nikkei.com/it/article/COLUMN/20070827/280408/

 

// 引数$path にはディレクトリorファイルの絶対パスを指定する。

function getDirSize($path) {

    $toral_size = 0;

 

    //指定したのがファイルだった場合はサイズを返して終了

    if (is_file($path)) {

        return filesize($path);

    } elseif (is_dir($path)) {

        $basename = basename($path);

 

        // カレントディレクトリ(.)or

        // 上位階層ディレクトリ(..)の場合はここで終了

        if ($basename == '.' || $basename == '..') {

            return 0;

        }

 

        // ディレクトリ内のファイル一覧を入手。

        $file_list = scandir($path);

 

        foreach ($file_list as $file) {

            // ディレクトリ内のファイルを引数にして、自分自身を呼び出す再帰

            $total_size += getDirSize($path . '/' . $file);

        }

        return $total_size;

    } else {

        return 0;

    }

}

 

// カレントフォルダの確認

echo '------------------------<br>';

echo getcwd() . '<br>';

echo '------------------------<br>';

 

//関数実行

echo getDirsize('/media/WD30EZRX/PT3/test_pdf2jpg');

 

 

 

 

PHP 再帰関数ことはじめ

正月のうちに取り組みたかったこととして再帰関数によるフォルダの読み込みがある。

要はフォルダの読み込みを再起関数でやりたい。

 

こんなサーバにこんなフォルダ構成があるとして

f:id:min117:20210101162453p:plain

幸せになろう.mp3

PHPで読み込むのに、フォルダ階層の都度foreach()を書きたくはないわけで、再帰でフォルダを読み込む関数例えば my_dir_read() を書いて、

 my_dir_read("01_Utada_Hikaru",1);

とかやったら、01_Utada_Hikaruをゼロ階層として、1階層目の 01_DeepRiver にあるmp3を一覧してほしいわけだ。

 

まずは再帰関数に慣れる必要がある。このへん参照。

qiita.com

 

そのまま実装してテストしてみる。ファイル名は my_recursive01.sh でいいや。

f:id:min117:20210101163254p:plain

 

14行目で関数を開始。引数はテキトーに30を突っ込んでみた。

f:id:min117:20210101163447p:plain

再帰で徐々にカウントダウンして行って

 

最後はargがゼロになって、9行目で表示され、11行目のtrueで正常終了して終わり。

f:id:min117:20210101163509p:plain

 

なんとなく分かった。

 

まずはPHPフォルダを一覧化してリンク化してやって

f:id:min117:20210101164356p:plain

「01_Utada_Hikaru」リンクをクリックしたら、関数 my_dir_read(01_Utada_Hikaru) を呼び出して、その中にあるフォルダをまた一覧してリンク化してやればいいわけだ。

 

 

あとで試す。

 

保存用

<?php

 

function factorial($args) {

    if($args > 0) {

        print $args;

        print '<br>';

        return $args * factorial($args -1);

    }

    print 'arg:' . "$args";

    //return 1; // true

    return true;

}

 

factorial(30);

 

qiita.com

 

f:id:min117:20210101170348p:plain

f:id:min117:20210101170430p:plain

 

www.yukiyukiponsu.work

RaspberryPi3 コマンドでの音量調整は alsamixer

コマンドでの音量調整は以前試したけど

min117.hatenablog.com

 

さらに簡単な方法があった。

$ alsamixer

f:id:min117:20210101150952p:plain

矢印の上下で音量調整できる。こりゃ便利。

 

f:id:min117:20210101151259p:plain

数字の1みたいにも見える。1月1日ってことで。あけましておめでとう。



 

 

 

 

RaspberryPi4 無料のGoogle Noto Fonts をインストールしてハングルを表示できるか試す

K-POPがやたらと耳に残る。コーディングする時にBGMで流しっぱなしにしたい。

www.youtube.com

www.youtube.com

www.youtube.com

 

RaspberryPiからBluetooth経由でEcho Dotに流そうとした。

f:id:min117:20201230210128p:plain

と、PiのChromeでは韓国語(ハングル)の文字列が豆腐の文字化けしているのに気づく。

 

久々に見た。ラズパイで豆腐文字化け。Jessie以前だと日本語でもしょっちゅう豆腐になってたけど、最近のRaspberryPi OSは2バイト圏の設定にもこなれてきたと見えて、トンと見なくなってた。

 

さすがに韓国語は使わないのでインストールしてなかったけど、ここまでK-POPが世界に流行ってWebでこうして見かけるようになった今、ハングルが文字化けするのは痛い。

www.allkpop.com

 

ブラウザ上の豆腐文字化け。これはフォントが無いときに起きる。無料のフォントをインストールすればいい。ググったらあった。

www.itmedia.co.jp

 

Googleさんが配っているらしい。

www.google.com

 

速攻でダウンロード。1GB以上ある。

f:id:min117:20201230210254p:plain

フォントは言語。伝える道具。つまり文化。ゆえにデカイ。処理も重い。

 

ダウンロード完了。scpでPiに送る。

 

ここから、Piでどうやってフォントインストールするのかが問題。このへん参照。

raspberrytips.com

 

要はこうすればいいらしい。

$ mkdir ~/.fonts

$ cp Noto*/*{ttf,otf} ~/.fonts

$ cd ~/.fonts

$ fc-cache -v -f

$ reboot

f:id:min117:20201230211746p:plain


 

やってみる。

f:id:min117:20201230214429p:plain

f:id:min117:20201230215048p:plain

 

$ cd ~/.fonts

$ fc-cache -v -f

f:id:min117:20201230215243p:plain

 

あれ。直ってない。なぜだ。

f:id:min117:20201230215539p:plain

 

入力メソッド関係あるのかなぁ。ibus-mozcを突っ込んでみる。

sudo apt-get -y install ibus-mozc

f:id:min117:20201230220220p:plain

 

ブラウザを再起動。ちゃんと表示された!かと思いきや

f:id:min117:20201230220319p:plain

ブラウザのタイトル部分がまだ化けてるなぁ。

f:id:min117:20201230220427p:plain

たぶんRaspberryPi本体のフォント設定が要るんだと思う。Chrome内部ではちゃんとハングル読めてるっぽい。

 

とりあえず再起動。

f:id:min117:20201230220746p:plain

 

お。タイトル部分も文字化け解消した。

f:id:min117:20201230221008p:plain

やっぱ再起動して読ませなきゃだめか。

 

おお。ブラウザでも大量のフォントを選べるようになってる。これは良い。

f:id:min117:20201230221849p:plain

まとめ。RaspberryPiでのフォントの追加方法。

$ mkdir ~/.fonts

$ cp Noto*/*{ttf,otf} ~/.fonts

$ cd ~/.fonts

$ fc-cache -v -f

sudo apt-get -y install ibus-mozc

$ reboot




 

 

 

Python3 Yahoo Finance APIを試す

株には全く興味が無い。あんなものにハマるのはアホだ。

 

しかし、彼らカネの亡者の「カネが欲しい」という貪欲7つの大罪で言えばGreedか、その酷さというか、愚かさゆえの強欲がもたらすエネルギー、それは信じている

 

つまり、例えば株価を取得するプログラムは、彼らのその強欲ゆえにバグの無い正確なものとなる。だって、エラーのある株価で取引したら大損するんだから。皮肉だが、強欲がもたらす正確性というか、エンジンのような力は、確かにある。

 

  

 

そこで、株取引は一切しないけど、株取引をしている彼ら(の強欲)が作り出したものを利用して、こちらの知恵や知見とさせてもらう。

 

具体的にはこれ。株価を取得するAPI

www.youtube.com

Pythonで気楽に試せるらしい。コードに落として実行してみる。

 

使うAPIはpip3でインストールできた(2020/12/30時点)。

$ pip3 install yahoo-finance-api2 --user

f:id:min117:20201230103747p:plain

 

でけた。

f:id:min117:20201230105936p:plain

9行目 apiが提供するメソッド(Share)を使ってデータをsymbol_dataへ格納。

 share.PERIOD_TIME_DAY,10 だと10日毎のデータ。

 share.PERIOD_TIME_YEAR,10 にすれば10年単位のデータ。

 share.FREQUENCY_TYPE_MINUTE,5 だと5分ごとにデータを取得する。

30行目 配列の先頭(一番古い株価の取得日)

31行目 配列の最後(最新の株価の取得日)

 

実行してみる。

$ python3 kabu01_yahoo.py

 

f:id:min117:20201230120309p:plain

カンタンだけどしっかり動く。

 

もう一つ作ってみる。

 

日経225(って何だ)にある企業の株価を取得する。inputデータはこれ(企業コード)。

f:id:min117:20201230113845p:plain

 

$ vim kabu02_nikkei225.py 

f:id:min117:20201230113748p:plain

実行。

f:id:min117:20201230113926p:plain

 

日経225の

企業コード4151,そのデータ件数121,10年前の株価838円今日の株価2,828円3.37倍

企業コード4502,そのデータ件数121,10年前の株価3,950円今日の株価3,740円0.95倍

f:id:min117:20201230113649p:plain

ふむ。簡単。配列からデータ取り出しの雛形にはなりそう。

 

コピペ用

import sys

from yahoo_finance_api2 import share

from yahoo_finance_api2.exceptions import YahooFinanceError

 

my_share = share.Share('MSFT')

symbol_data = None

 

try:

    symbol_data = my_share.get_historical(share.PERIOD_TYPE_DAY,

                                            10,

                                            share.FREQUENCY_TYPE_MINUTE,

                                            5)

 

except YahooFinancceError as e:

    print(e.message)

    sys.exit()

 

print(symbol_data)

len(symbol_data.keys())

 

#dict_keys(['timestamp', 'open', 'high', 'low', 'close', 'vllume'])

 

my_date = symbol_data["timestamp"]

print('----------------------------------')

print('timestamp')

#print('symbol_data["timestamp"] の length')

print(len(my_date))

print('----------------------------------')

print(my_date)

 

old_date = my_date[0]

now_date = my_date[807]

 

from datetime import datetime

old_date = datetime.utcfromtimestamp(int(old_date/1000))

now_date = datetime.utcfromtimestamp(int(now_date/1000))

 

print(old_date)

print(now_date)

 

 

my_price_close = symbol_data["close"]

old_price = my_price_close[0]

now_price = my_price_close[807]

print('----------------------------------')

print('終値close')

#print('symbol_data["close"] の length')

print(len(my_price_close))

print('----------------------------------')

print(str(old_date) + "の時の株価:" + str(old_price))

print(str(now_date) + "の時の株価:" + str(now_price))

 

コピペ用2

import csv

import time

from datetime import datetime

import sys

from yahoo_finance_api2 import share

from yahoo_finance_api2.exceptions import YahooFinanceError

 

# https://www.youtube.com/watch?v=yYckWsRtoXw&feature=emb_title

 

count = 1

csvfile = "kabu_date02_input_nikkei225.csv"

 

 

def get_data():

    global old_date, now_date, old_time, now_time, old_price, now_price, change_rate, data_volume

 

    my_share = share.Share(row_str + '.T')

    symbol_data = None

 

    try:

        symbol_data = my_share.get_historical(share.PERIOD_TYPE_YEAR, 10, share.FREQUENCY_TYPE_MONTH, 1)

        time.sleep(5)

        date = symbol_data["timestamp"]

 

        old_date = date[0]

        now_date = date[-1]

 

        old_time = datetime.utcfromtimestamp(int(old_date/1000))

        now_time = datetime.utcfromtimestamp(int(now_date/1000))

 

        price = symbol_data["close"]

        old_price = price[0]

        now_price = price[-1]

 

        change_rate = '{:.2f}'.format(now_price/old_price)

        data_volume = len(date)

 

    except YahooFinanceError as e:

        print(e.message)

        sys.exit(1)

 

 

def write_csv():

    global old_date, now_date, old_time, now_time, old_price, now_price, change_rate, data_volume

    with open("kabu_date03_output.csv", "a") as csvFile:

        writer = csv.writer(csvFile)

        writer.writerow([row_str, data_volume, old_time, old_price, now_time, now_price, change_rate])

 

 

 

 

with open(csvfile, "r") as f:

    rows = csv.reader(f)

    for row in rows:

        print("ループ:" + str(count) + "回目")

        row_str = str("".join(row))

 

        get_data()

        write_csv()

 

        count = count +1

 

 

 

macOS Big Surをインストール → パッキパキに速くなった

f:id:min117:20201230001945p:plain

 

2020/12/19に macOSをアップデートした。

 

対象のiMacはこれ。2016年11月に購入した。もう4年も前だ。

min117.hatenablog.com

メモリも増設済み。

min117.hatenablog.com

こいつのOSをアプデする。

 

Catalinaから

f:id:min117:20201230001312p:plain


Big Sur へ。

f:id:min117:20201230001320p:plain

 

なんか意味不明なエラーが一瞬出たが

f:id:min117:20201230001334p:plain

 

何回か試したらインストールが進んだ。

f:id:min117:20201230001343p:plain

 

同意する。

f:id:min117:20201230001414p:plain

 

12.20GBもある。デカイ。

f:id:min117:20201230001436p:plain

 

やっとインストール完了。ほぼ半日かかった印象。

f:id:min117:20201230001547p:plain

 

アイコン綺麗。

f:id:min117:20201230001615p:plain

 

ドックも見やすい。丸み帯びてて良い。

f:id:min117:20201230001625p:plain

 

シェルはzshで変わらずのようだ。

f:id:min117:20201230001634p:plain

 

OSが刷新されたのに、これまでのアプリがほとんど問題なく動くのがすごい。これぞApple品質。

 

Paralles(Windowsリモートデスクトップに使ってる)も、ほぼ問題なく動いた。

f:id:min117:20201230002600p:plain

 

Catalinaだと、日本語の文字入力がめっちゃ遅くなってた。ハードのスペック不足というより、ソフトウェア不具合だったように思う。

 

これが、BigSurで大幅改善されている。パッキパキに動く。

f:id:min117:20201230001945p:plain

 

ブログ書くの捗ってかなり嬉しい。

f:id:min117:20201230002919p:plain

 

そしてSafariが速い。めっちゃ速い。シュビ!!っと動く。最高。

f:id:min117:20201230003128p:plain

 

メモアプリも多分かなり描き直してる。サックサクに動く。

f:id:min117:20201230003425p:plain

mac最高。Apple最高すぎる。

 

min117.hatenablog.com

 

min117.hatenablog.com