min117の日記

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

macOS Safariのアドレスバーに文字入力中に固まるときは「履歴の全消去」で治る

macOSSafariアドレスバーに検索単語を入力中に固まる事象が突然発生した(2020/9/3時点)。

f:id:min117:20200904055002p:plain

 

レインボーアイコンがグルグルして、一切の操作ができなくなる。Dockから強制終了するしかない。

f:id:min117:20200904055016p:plain

文字入力で固まるのは本当にストレス。

 

macOSのバージョンはこれ。

f:id:min117:20200904055156p:plain

OSのバージョンアップが原因かも?と疑ったけど、OSのアップデートまで気長に待つことなどできない。

 

熱暴走か?ディスク障害か?も疑ったけど、Safariだけが遅いChromeだとそうでもない)ところをみるとそうも考えられない。

 

おそらくSafariアドレスバーに文字入力するときに、検索結果の表示と文字の入力とがバッティングしてしてるのではないか(そんな動き)と考えた。

 

Safariをいじったら(一応)解消したのでメモ。下記③で解消した。

 

試したこと

プライベートブラウズモードで(文字入力し)固まるか試す

 f:id:min117:20200904060722p:plain

プライベートブラウズモードだと履歴が読まれないから検索結果の先読みが行われない。なので、結果表示が文字入力とバッティングすることがない。これで固まらなければ、先読みが原因だったと判断できる。

 

Safariの設定を変える

 f:id:min117:20200904061048p:plain

環境設定で「検索エンジンの候補」の表示や「バックグラウンドでのトップヒットの読み込み」をOFFにしてみる。要は検索結果の先読みを行わせない設定にしてみる。設定後はSafariを再起動(できればiMacごと再起動)したほうが良さそう。今回はこれで解消した。 もとい再発した

 

Safariの履歴を消してみる

 f:id:min117:20200904062933p:plain

アドレスバーのトップヒットに候補として出るのは履歴だから、その履歴のほうを削除してしまえばいいという発想。履歴なんて消えても問題ない。固まるよりいい。サクっと消す。今回はこれで解消した(かに見える。まだ分からん。再発するかも)。

 

おそらくだけど直近で訪問したサイトが原因。変な文字コードを使っているサイトだった(utf-8 と shift-jisが混在してる)とか、macOS正規表現が引っ掛けてしまう(オートマトンで無限ループにハマる)ような文字が混在したサイトだったのかもしれない。JavaScriptがバグっていたというのも十分考えられる(作為的か不作為かは分からんけど)。

 

④ Chromeを使ってみる

 f:id:min117:20200904061637p:plain

 f:id:min117:20200904061527p:plain

SafariでダメならChromeで試す。こっちで同じ現象が発生しないならSafari固有の問題だと切り分けることができる。バグ解消のアップデートがされるまではしばらくChromeの運用で耐えるという選択肢。

 

⑤ Google日本語入力を使ってみる

 f:id:min117:20200904061840p:plain

文字入力で固まるということはことえりが(macOSのアップデートで)バグったという可能性も無きにしもあらず。Google日本語入力を入れて、こちらを使ってみる手もある。

 

⑥ 熱暴走を疑う(扇風機でiMac自体を冷やす)

現象が発生したのが暑い日だったので熱暴走も疑った(考えにくいけど)。SafariだけでなくPC全体がモッサリというときは試してみる価値がある。

 

⑦ topコマンドを試す

$ top

 f:id:min117:20200904063512p:plain

対処というよりは原因のモニタリングだが。ロードアベレージ(Load Avg)をみると1.16, 1.27, 1.36しかない。このiMacクアッドコアだからそれぞれ4以下であれば問題ない。のでCPU的には問題なし…と思ってたところ、文字入力がフリーズしたタイミングでPIDのトップにSafariがCPU使用率100%で上がってきた。やはりSafariのバグなのだ。

min117.hatenablog.com

 

⑧ディスク障害を疑う

 心当たりがある(大きなファイルの作成→削除を繰り返していていた)ので、もしかしたーらだけど、内蔵SSDが不調になったか、その前触れかもしれない。このiMacを買ったのが4年前だから、万が一あるかもしれない。

min117.hatenablog.com

ま、PCの不調のときに買い替えるなんていう対処は最悪の悪手だし素人の発想だから、それは考えないでおく。まずはディスク障害を検知するためのモニタリングをもっと本腰いれてやることにする(macOSvmstatないけど他に手はないものか)。

 

参考になった記事

ez-net.jp

applech2.com

 

 

 

 

 

 

RaspberryPi3 netstat -anAlアナル もとい-alnA → 改めて見直す

netstat って、分かったつもりになってて全然読めてない。いつも忘れる。ちょっと通信を調べたい機会があったので見直す。

www.atmarkit.co.jp

 

覚えることは一つだけに絞る。全部覚えようと思うと結局ひとつも頭に残らない。

 

自分の環境でやってみる。

$ netstat -alnA inet

f:id:min117:20200903055330p:plain

-anAl(アナル)なら覚えやすかったのに…

 

ESTABLISHEDの 左列がTo、右列がFrom だ。これをいっつも忘れる。

f:id:min117:20200903061045p:plain

RaspberryPi(192.168.3.153)のポート22(ssh

手元のiMac(192.168.3.156から接続しているのが見て取れる。

 

勉強になる。

f:id:min117:20200903055452p:plain

f:id:min117:20200903055852p:plain

f:id:min117:20200903055913p:plain

f:id:min117:20200903055554p:plain

 

-s なんてのもあるのか。

f:id:min117:20200903060234p:plain

 

$ netstat -s

f:id:min117:20200903060624p:plain

TCPのコネクション数が見て取れる。あまり使わなそうだけど、極端に多い場合はハッキングでもされたのか?と疑えそう。定量的にモニタリングしてみるかな。

 

f:id:min117:20200903060509p:plain

 

 

 

 

PHP から javascriptのconfirm() を呼び出す → 「YESを押したらファイル削除」

phpjavascriptの連携。えらく苦労したが、やりたい動作ができた。こないだの失敗を踏まえて再挑戦。

min117.hatenablog.com

 

やりたいのはこう。

 

サーバに動画ファイルがある。

f:id:min117:20200830091518p:plain

自宅youbuteのような機能をphpで実装していて「mp4再生」ボタンを押せば観られる。

 

観たけどツマラナイ映像だった、削除したい としよう。

f:id:min117:20200830091629p:plain

「ts削除JS」ボタンを押すと動画が(サーバ上から)消える。この削除ボタンを実装したい

 

削除前に本当に削除していいか確認(confirm)画面が出るようにする。JavaScriptのconfirm()で出す。

f:id:min117:20200830091949p:plain

この実装が難しかった。phpからjavascriptを呼び出す必要があるから。この連携が意外にめんどくさい。

 

該当部分のソースはこれ。

f:id:min117:20200830090947p:plain

ポイント

php内にjavascriptを書ける。body内のどこに書いてもOK

phpprint文内にjavascript書いていくのが一番わかりやすい。

・ヒアストリングは見づらいので使わない。

2336行目から2349行目までがjavascriptの内容。

 

javascriptのconfirm()確認メッセージfunction confirm_del(){} の中に閉じ込める。

・そのconfirm_del(){} 関数formのonsubmitにセットしてやると、confirmの結果(YESかNoか)によって動作するしないを決定できる、つまりif文のような動きを実装できる。

 

動き

 2362行目「ts削除JS」ボタンが押される(=submitされる)

 2359行目 onsubmitにより関数confirm_del()が呼ばれる

 2336行目から2349行目により確認メッセージ(削除していいか)が出る。

  YESかNoかを(if文のように)確認してその結果をreturnしてくれる。

 2359行目 return結果がtrueだった場合のみ、doDEL.phpが呼び出される

 2360行目 doDEL.phpへのGETする引数DELTARGETはhidden要素で書く。

 これを2359行目で "doDEL.php?DELTARGET="と書いても動作しない(?以降は無視されてしまう)。

 

 確認

javascriptが動かないとき confirm('')を確認する。

 confirm('') シングルクオートが正しい

  confirm("") ダブルクオートは動かない

f:id:min117:20200830091046p:plain

 

なお、doDEL.phpGETで受け取ったファイル名の動画サーバ上から(問答無用で)削除する恐ろしい機能を持つ(削除はいつでも細心の注意が必要だ)。

 

ソース

2321                                  /// 削除ボタン実装 20200823 

2322                                  /// if (preg_match('/.*ts$|.*TS$|.*ts.*part/', "$n")) {

2323                                  print ' ';

2324                                  if (file_exists("$n")) {

2325                                      /// $mp4name について、その元となった$n(tsファイル)がまだ存在しているなら削除ボタンを表示

2326                                      /// $n      : wow_16916_20200815_053301.ts

2327                                      /// $mp4name: wow_16916_20200815_053301.ts.mp4

2328                                      ///// print '<mark>削除ボタンをここに実装する</mark>';

2329                                      print '<mark>ts:' . "$n" . '</mark>';

2330                                      print ' ';

2331                                      // print '<a href="doDELFILE.php?DELTARGET=' . rawurlencode("$n") . '" class="btn btn-danger" target="_blank">ts削除</a>';

2332 

2333                                      /////  削除実装<a href>でやる版 これは動く

2334                                      print '<a href="doDEL.php?DELTARGET=' . rawurlencode("$n") . '" class="btn btn-danger" target="_blank">ts削除</a>';

2335 

2336                                      print '<script>';

2337                                      // print 'myANS1 = confirm("本当に削除しますか1?");';

2338                                      // print 'document.write(myANS1);';

2339                                      // print 'alert(\'javascript動いています\');'; // ダブルクオートで"javascript動いています"はダメ

2340                                      print 'function confirm_del() {';

2341                                      // print '    // var myANS2 = confirm("本当に' . "$n" . 'を削除しますか?';

2342                                      /// confirm('')はダブルクオートじゃダメ!何もエラー出さずに動かない!javascriptはエラー出さない!

2343                                      /// confirm("")は動かない!

2344                                      // print '    var myANS2 = confirm(\'本当に削除しますか2?\');';

2345                                      print '    var myANS2 = confirm(\'本当に' . "$n" . 'を削除しますか?\');';

2346                                      // print '    document.write(myANS2);';

2347                                      print '    return myANS2;';

2348                                      print '}';

2349                                      print '</script>';

2350 

2351                                      // onsubmitによって、myANS2がtrueのときだけdoDEL.phpが実行される

2352                                      // onsubmitによって、if文と同じ効果が得られる(if YESだったらdoDEL.php実行)

2353                                      // print '<form style="display:inline" method="GET" action="doDEL.php" onsubmit="return confirm_del()">';

2354                                      // print '<form style="display:inline" target="_blank" class="btn btn-danger" method="GET" action="doDEL.php?DELTARGET="' . r     awurlencode("$n") . '" onsubmit="return confirm_del()">';

2355 

2356                                      // formのときに  doDEL.php?DELTARGET=はダメ。パラメータは必ずhiddenで投げる

2357                                      // ↑これだとGETはdoDEL.php?後ろ空白 になってしまう。

2358                                      // print '<form style="display:inline" method="GET" action="doDEL.php?DELTARGET=' . rawurlencode("$n") . '" onsubmit="return      confirm_del()">';

2359                                      print '<form style="display:inline" method="GET" action="doDEL.php" onsubmit="return confirm_del()">';

2360                                      print '<input type="hidden" name="DELTARGET" value="' . "$n" . '">';

2361                                      // print ' <input type="submit" value="削除実行">';

2362                                      print '    <input type="submit" value="ts削除JS" class="btn btn-danger" target="_blank"/></a>';

2363                                      print '</form>';

2364 

2365                                      /// 命名規則

2366                                      // do:ファイル名に付ける:doDEL.php

2367                                      // go:関数の名前に付ける:goDEL() や goRM() 

2368                                      /// 

2369                                      /// phpからjavascriptを呼び出す hear_string_ヒアストリング利用

2370                                      /// 画面遷移でポップアップconfirm確認画面出すのによく使いそう

2371                                      /// https://so-zou.jp/web-app/tech/programming/php/sample/javascript-cooperation.htm

2372                                      // goRM(TARGET,COMFIRM);

2373                                      // goRM(TARGET);

2374                                      // print '<a href="doLSglob.php?RM=YES" class="btn-danger">削除test</a>';

2375 

2376                                  } else {

2377                                      print '<mark>削除対象tsなし</mark>';

2378                                  }

2379 

2380                                  print ' ';

 

 

 

 

 

 

fedora30 バナー作成ツール figlet を試す

こういうロゴを作るツール。それがfiglet。

f:id:min117:20200829102033p:plain

 

fedora30にもインストールする。やはり見た目のインパクトは重要。

f:id:min117:20200829101945p:plain

試す。

 

$ echo 'Amazon' | figlet

f:id:min117:20200829102033p:plain

$ echo 'micro SD' | figlet

f:id:min117:20200829110432p:plain

$ echo 'linux' | figlet

f:id:min117:20200829110744p:plain

うむ。

 

実は Google DuckDuckGoで「文字列 figlet」と打つと結果を教えてくれたりする。

DuckDuckGo> figlet linux

f:id:min117:20200829104330p:plain

Linux環境を持っていなくてもブラウザで試せる。

min117.hatenablog.com

 

長い文字列はどうか。

echo 'wow_20200806_230651.ts_JIMAKU.txt' | figlet 

f:id:min117:20200829104156p:plain

アンダーバー含めてバッチリ。

 

日本語はどうか。

f:id:min117:20200829102145p:plain

まだ未対応みたい。

 

長い文字列も化ける。

echo '安倍晋三やめてほんと良かった' | figlet

f:id:min117:20200829104259p:plain

あとで試す。

seinzumtode.hatenadiary.jp

 

min117.hatenablog.com

 

 

 

 

 

 

RaspberryPi3 容量不足エラーが出たら /var/mail/mail の肥大化をチェック

RaspberryPi3 に sshログインしたらこんなエラーが。

f:id:min117:20200829083502p:plain

pyenvが「No space」でエラーを吐いている。

 

なんじゃこりゃ?dfしてみる。

$ df

f:id:min117:20200829083644p:plain

オーマイゴッド(OMG)。rootが100%ではないか。

 

たぶん要らないログが溜まっているんだろう。原因としてよくあるのは cronで実行させたタスクがエラーになってfailメッセージが/var/あたりに溜まっていくやつ

 

今回もvarあたりが原因だろうとアタリをつけてfindコマンドで大きいファイルを探す

$ cd /var

$ find . -type f -size "+100M" -print0 | xargs -0 ls -shart | tee -a LOGFILE.txt

f:id:min117:20200829083430p:plain

ビンゴ。/var/mail/mail が15GBもの容量を取っていた。いらんログ取らないでほしい。

 

削除して容量が復活。よかったよかった。

 

min117.hatenablog.com

 

 

 

 

 

PHP サーバにあるファイルを削除する機能を実装する(javascriptからphpの関数を呼び出す)→ 失敗

f:id:min117:20200829101633p:plain

 

サーバ側に例えば「test.txt」というファイルがあって

f:id:min117:20200829074900p:plain

 

クライアント側からブラウザ経由でそれを削除したい。こんなイメージ。

http://server.com/doDEL.php?DELTARGET=test.txt

f:id:min117:20200829074718p:plain

 

削除前の確認confirmをjavascriptで行って

f:id:min117:20200829074748p:plain

 

YESだったら削除する。Noだったら削除しない

f:id:min117:20200829075121p:plain

 

しかし失敗した。以下のように実装してみたんだけどNoを押してもファイルが削除されてしまう。なぜだ。

$ vim doDEL.php

f:id:min117:20200829080837p:plain
105行目 javascriptにより「本当に**を削除しますか?」というメッセージを出す

107行目 もしYESだったら

109行目 削除する(ためのPHP関数goDEL(confirm) を呼び出す)

123行目 phpにより、削除する関数goDEL(confirm) を記述する

126行目 confirmがもしYESだったら

137行目 削除を実行する

 

if文を2つも使って誤削除を防止しているはずなのに doDEL.phpが読み込まれた瞬間にtest.txtが削除されてしまう。なぜだ。

 

おそらくだけど、109行目で goDEL('YES') が解釈された時点 123行目の$CONFIRMがYESで発火してしまうのが原因だろうと思う。

 

今回やりたかったのは

 ① javascriptphpを同一ファイル(拡張子php)内に書いて

 ② javascriptで削除確認メッセージを出し、YESだった場合に

 ③ phpにより(ファイル削除を)実行する

だったわけだが、①のファイルが呼び出された時点③のphpが呼び出されてしまうので②の(javascriptによる)if文が意味を為さないということが分かった。

 

やむをえない。違う方法を取る。②の部分(削除確認confirm)は別ファイルに実装して、YESだった場合に①(と③)を呼び出すように変更する。次回に続く。

 

参考)

失敗したソース

<div style="z-index: 1500; position: fixed; top: 0px; right: 0px;">

<fieldset>

<?php

//参考ソース

//VLC Extensionsからサーバのrecpt1を起動、停止させる ref:

//https://gist.github.com/mkit0031/c72f54adf69bc2bc8379

 

//エラーをhtml上に吐く

ini_set( 'display_errors', 1);

//記述上のエンコードを指定

mb_internal_encoding("UTF-8");

//表示上のエンコード指定header

header("Content-Type: text/html; charset=UTF-8");

 

// 後で呼ぶ関数の中で使う変数を定義

$DATE = date("Ymd_His");

print 'アクセス日時:' . $DATE;

 

// サーバIPアドレス把握

$srv_ip    = $_SERVER["SERVER_ADDR"];

$srv_octet = substr("$srv_ip", 10, 2);

print "<p>サーバIPアドレス$srv_ip<br>";

print "<b><font color=\"red\">サーバIP の末尾:$srv_octet</font></b></p>";

 

// クライアントIPアドレス把握

$user_ip   = $_SERVER["REMOTE_ADDR"];

echo "<p>アクセス者:$user_ip<br>";

$firstoctet = substr("$user_ip", 0, 3);

echo "第1オクテット:$firstoctet </p>";

// $myDELTARGET 対象動画名をセット

if(isset($_GET['DELTARGET'])){

    $myDELTARGET = $_GET['DELTARGET'];

} else {

    $myDELTARGET = "myDELTARGET_NOSET";

}

// YELLOWではない markにする

print '<b><mark>$myDELTARGET:' . "$myDELTARGET" . '</mark></b>';

print '<br>';

 

// CHDIR

if(isset($_GET['CHDIR'])){

    $myCHDIR = $_GET['CHDIR'];

    ///// print 'CHDIR 指定あり<br>';

    //$myBASENAME = $_GET['TARGETDIR'];

    $myBASENAME = $_GET['CHDIR'];

//    $myNOW_STATUS= "$myNOW_STATUS" . '&CHDIR=' . "$myBASENAME" . "'";

//    print '$myNOW_STATUS:' . "$myNOW_STATUS";

} else {

    ///// print 'CHDIR 指定なし(PT3をセット)<br>';

    $myCHDIR = 'PT3';

    $myBASENAME = 'PT3';

}

 

/// SORTを取得(DSCか)

// if(isset($_GET['SORT'])){

// $mySORT = $_GET['SORT'];

// } else {

// $mySORT = "mySORT_NOSET";

// }

// /// DSCをmark表示

// if("$mySORT" == "DSC") {

//     print '<mark>DSC降順</mark>';

//     print '<br>';

// }

 

// jecho "PHPファイル名:" . basename(__FILE__, ".php"); 

// echo '<mark>' . basename(__FILE__, ".php") . '</mark>';

echo basename(__FILE__, ".php");

 

// galmov03 bootstrap

// echo basename($_SERVER['PHP_SELF']);

// print basename(__FILE__, ".php"); 

define('SCRIPT_DIR', dirname($_SERVER['SCRIPT_FILENAME']));

define('IMAGES_DIR', SCRIPT_DIR . '/thumb_movie_images');

//print 'SCRIPT_DIR:' . SCRIPT_DIR . '<br>';

//print 'IMAGES_DIR:' . IMAGES_DIR . '<br>';

?>

</fieldset>

</div>

 

 

<!DOCTYPE html>

<html lang="ja">

<head>

    <meta charset="utf-8">

    <title>ファイル削除doDEL.php</title>

    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">

 

    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>

    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>

    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>

 

    <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">

 

    <link rel="stylesheet" type="text/css" href="./inputDesign.css">

 

 

    <style> </style>

    <script></script>

</head>

 

<body>

    <?php // $jsmsg='<mark>' . "$myDELTARGET . '</mark>を本当に削除しますか?" ?>

    <?php $jsmsg="$myDELTARGET を本当に削除しますか?" ?>

    <?php // print "本当に削除しますか?" ?>

 

    <!-- body要素終了の直前にjavascriptを書く -->

    <script>

        // $jsmsg2="$piDOM" . ' にリダイレクトします';

        <!-- JavaScript未対応ブラウザ対策

        // 実際には入力チェックなどするでしょ

        // var today = new Date();

        // var month = today.getMonth() + 1;

        // var day = today.getDate();

        // document.write("html部分からの出力です<br>");

        // document.write("今日は" + month + "月"+ day + "日です。");

        // javaScript未対応ブラウザ対策 -->

        // このファイルをalertで検索

        // alert("<?php print $jsmsg; ?>")

        // window.confirm("<?php print $jsmsg; ?>")

        var rtnCONF = window.confirm("<?php print $jsmsg; ?>");

        // alert(rtnCOMF);

        if(rtnCONF) {

            alert('YESが押されました');

            // 削除対象はここでセットする

            // ファイルの頭でやっちゃうと、YES/NOを待たずに

            // このPHPを読んだ瞬間にファイルが削除されてしまうから

 

            // document.write('<?php goLS('YES') ?>');

            // document.write('<hr>');

            // CONFIRM

 

 

            ////// @@@

            ////// ここでgoDEL()を記述してる時点で、confirmのYES/NOに関わらずgoDEL()は実行されてし>まうので

            ////// このファイル(doDEL.php)を読み込んだ瞬間にファイルが消えてしまう

            ////// 同一ファイル(doDEL.php)内にjavascript(による確認confirm)と、php(による削除>実行goDEL())を書くこと自体に無理がある。

            ////// このファイル(doDEL.php)を呼び出す元でjs確認を終えて、削除OKだったらこのファイ>ルを呼ぶようにすべし

            document.write('<?php goDEL('YES') ?>');

            // document.write('<hr>');

            // document.write('<?php goLS('YES') ?>');

 

        } else {

            document.write('<?php $myDELTARGET = "myDELTARGET_NOSET"; ?>');

            alert('NO が押されました\n削除しません');

            document.write('<?php goLS('YES') ?>');

        }

 

        // <button onclick="return confirm("<?php print $jsmsg?>")"</button>

 

    </script>

</body>

</html>

 

<?php

 

/////////////////////////////////////////////////////

///// goDELjavascript(rtnCONF)により上に書くと

///// このphp(doDEL.php)が読み込まれた瞬間にgoDEL()が走ってしまい

///// 削除がNOでも強制的にファイル削除されてしまうので注意!

///// ↑ いやそんなこと無かった

///// ↑ goDEL()を文末に書いてもやはり強制的に実行されてしまった@@@

/////////////////////////////////////////////////////

// PHP関数化しておき

// JavaScriptのcomfirmでYESのときだけその関数を呼ぶ

// 引数はファイル名$myDELTARGETではなく$CONFIRM

function goDEL($CONFIRM) {

    // chdir();

    print 'CONFIRMの値:' . "$CONFIRM";

    if ("$CONFIRM" == 'YES') {

        global $myDELTARGET;

        print '<hr>';

        print 'PHP関数内 削除対象:<b><mark>' . "$myDELTARGET" . '</mark></b>';

        print '<br>';

 

        // PHPによるファイル削除はunlink() 

        // if(is_file("$myDELTARGET" && "$CONFIRM" == 'YES')) {

        if(is_file("$myDELTARGET")) {

            // print '対象のファイルがありました/削除します';

            print "$myDELTARGET" . 'がありました→削除します';

            unlink("$myDELTARGET");

        } else {

            print "$myDELTARGET" . 'なんてファイルはありません';

        }

    } else {

        print 'javascriptの$CONFIRMがNOです';

    }

}

 

 

 

 

    /// bashでrmを書くと、このPHPが読み込まれた瞬間に(YES/NO判定関係なく)消されてしまうので

    /// PHPのunlink() による削除で実装する 20200823

    /// 

    // $commandDEL = 'echo "削除対象:' . "$fileTODEL" . '" 2>&1 &';

    // $commandDEL = 'echo "削除対象:' . "$fileTODEL" . '"; sudo rm -rf ' . "$fileTODEL" . ' 2>&1 &';

    // $commandDEL = 'echo "bash内 削除対象:' . "$fileTODEL" . '"; ls -shalrt | grep ' . "$fileTODEL" . ' && echo "削除OK" 2>&1 &';

    // $commandDEL = 'ls -shalrt | grep ' . "$fileTODEL" . ' 2>&1 &';

    // $commandDEL = 'echo "削除対象:' . "$fileTODEL" . '"; sudo rm -rf ' . "$fileTODEL" . ' 2>&1 &';

    // $commandDEL = 'echo "bash内 削除対象:' . "$fileTODEL" . '"; ls -shalrt | grep ' . "$fileTODEL" . ' && echo "削除OK" 2>&1 &';

    // $commandDEL = 'ls -shalrt | grep ' . "$fileTODEL" . ' 2>&1 &';

    // 

    // if ($CONFIRMED == 'DEL_OK') {

    //     $commandDEL = 'rm -rf "' . "$fileTODEL" . '" 2>&1 &';

    //     print '<br>';

 

    //     print '<b>bash commandDEL</b><br>';

    //     // print "<b>$commandDEL</b>";

    //     print "<b><mark>$commandDEL</mark></b>";

 

    //     // print "$commandDEL";

    //     exec("$commandDEL" , $outputDEL);

    //     foreach($outputDEL as $iDEL){

    //         // if (preg_match('/.*title.*|.*start_time.*|.*PID.*|.*202[0-9]_/', $iDEL)) {

    //         if (preg_match('/.*削除.*|.*DEL.*/', $iDEL)) {

    //             // print '<b><font color="blue">' . "$iDEL" . '</font></b>';

    //             print '<font color="red"><mark>' . "$iDEL" . '</mark></font>';

    //             print '<mark>' . "$iDEL" . '</mark>';

    //         } else {

    //             print '<font color="red>' . "$iDEL" . '</font>';

    //             print '<mark>' . "$iDEL" . '</mark>';

    //         }

    //     }

    //     print 'DEL_OK<mark>削除しました</mark>';

    // } else {

    //     print 'DEL_NG<mark>削除しませんでした</mark>';

    // }

 

function goLS($fileTOLS) {

    print 'PHP関数内 LS対象:<b><mark>' . "$fileTOLS" . '</mark></b>';

    print '<br>';

 

    $commandLS = 'ls -shalrt | grep ' . "$fileTOLS" . ' 2>&1 &';

 

    print '<b>bash commandLS</b><br>';

    // print "<b>$commandLS</b>";

    print "<mark>$commandLS</mark>";

 

 

    // print "$commandLS";

    exec("$commandLS" , $outputLS);

    print '<br>';

    foreach($outputLS as $iLS){

        // if (preg_match('/.*title.*|.*start_time.*|.*PID.*|.*202[0-9]_/', $iLS)) {

        if (preg_match('/.*削除.*|.*LS.*/', $iLS)) {

            // print '<b><font color="blue">' . "$iLS" . '</font></b>';

            print '<b><mark>' . "$iLS" . '</mark></b>';

        } else {

            print "$iLS";

        }

        print '<br>';

    }

}

 

?>

 

 

 

 

 

fedora 30 USB3.0 WiFiトングル 1200Mbpsで爆速化した無線LANでWiFi経由ctorrentを使う

サーバの通信(無線LAN)が爆速化していろいろと良い影響が出ている。

開発用のOSをtorrentによりダウンロードする例。

f:id:min117:20200823210827p:plain

 

4GB以上のファイルを落とすわけだが安定して120Mbps以上出ている。

f:id:min117:20200823210503p:plain

f:id:min117:20200823210516p:plain

f:id:min117:20200823210533p:plain

f:id:min117:20200823210643p:plain

凄まじい。IPv6ってこんな速かったんだ。

 

ドコモ光(GMO v6プラス)にしたのが2年前(2018年7月)。

min117.hatenablog.com


無線ルータをBUFFALOからNEC(謎技術で高速)のに変えたのが1年前(2019年10月)。

min117.hatenablog.com

 

そんな爆速環境にありながらサーバの無線LAN子機だけが遅いのを放置していた。俺の馬鹿。

 

で、先日ついにサーバ(fedora)にUSB3.0WiFiトングルをつけて高速化したわけだ。

min117.hatenablog.com

ドライバのインストールにちょっと手間取ったがうまくいった。

min117.hatenablog.com

 

IPv6光回線なので理論値は100Mbps以上あるわけだが、理論どおりにいくはずもない(のが普通)。

 

が、そんな環境でctorrentでOSをダウンロードすると

f:id:min117:20200823211854p:plain

 

4GB以上のファイルが、ものの数分で落ちてくる。

f:id:min117:20200823211033p:plain

素晴らしい。

 

ctorrentにはもちポート解放が必要。

min117.hatenablog.com

min117.hatenablog.com