多次元配列の中身を取出す。
<?php function array_flatten($arr){ $v = []; array_walk_recursive($arr, function($e)use(&$v){$v[] = $e;}); return $v; }
昔は随分面倒だったけど、いまは随分と楽になったね。
<?php function array_flatten($arr){ $v = []; array_walk_recursive($arr, function($e)use(&$v){$v[] = $e;}); return $v; }
昔は随分面倒だったけど、いまは随分と楽になったね。
久しぶりなので、状況を確認しながら
apt install phpize php-pecl
pecl がどこにインストールするか、何処を使うか
$ pecl config-show
設定を確認しておけば迷わない。
Configuration (channel pecl.php.net): ===================================== Auto-discover new Channels auto_discover <not set> Default Channel default_channel pecl.php.net HTTP Proxy Server Address http_proxy <not set> PEAR server [DEPRECATED] master_server pear.php.net Default Channel Mirror preferred_mirror pecl.php.net Remote Configuration File remote_config <not set> PEAR executables directory bin_dir /usr/bin PEAR documentation directory doc_dir /usr/share/php/doc PHP extension directory ext_dir /usr/lib/php5/20131226 PEAR directory php_dir /usr/share/php PEAR Installer cache directory cache_dir /tmp/pear/cache PEAR configuration file cfg_dir /usr/share/php/cfg directory PEAR data directory data_dir /usr/share/php/data PEAR Installer download download_dir /build/php5-5.6.30+dfsg/pear-build-download directory Systems manpage files man_dir /usr/share/man directory PEAR metadata directory metadata_dir <not set> PHP CLI/CGI binary php_bin /usr/bin/php php.ini location php_ini <not set> --program-prefix passed to php_prefix <not set> PHP's ./configure --program-suffix passed to php_suffix <not set> PHP's ./configure PEAR Installer temp directory temp_dir /tmp/pear/temp PEAR test directory test_dir /usr/share/php/test PEAR www files directory www_dir /usr/share/php/htdocs Cache TimeToLive cache_ttl 3600 Preferred Package State preferred_state stable Unix file mask umask 22 Debug Log Level verbose 1 PEAR password (for password <not set> maintainers) Signature Handling Program sig_bin /usr/bin/gpg Signature Key Directory sig_keydir /etc/pear/pearkeys Signature Key Id sig_keyid <not set> Package Signature Type sig_type gpg PEAR username (for username <not set> maintainers) User Configuration File Filename /home/takuya/.pearrc System Configuration File Filename /etc/pear/pear.conf
pecl search mongo Retrieving data...0% .Matched packages, channel pecl.php.net: ======================================= Package Stable/(Latest) Local mongo 1.6.14 (stable) MongoDB database driver mongodb 1.1.6 (stable) MongoDB driver for PHP
php_dir
を変更して適当なディレクトリで実験すればOK
sudo pecl install mongodb
/etc/php5/conf.d/mongodb.ini
コメント書いておくとOK
; 2016-05-02 PECLからインストール extension=mongodb.so
pecl のコマンドが 7.3, 7.4 で若干変わってたので改編
8年くらい前のファイルが出てきたんですよ。でもRARパスワード掛けてるんですよね。わたし。
rar パスワード解析なら rarcrack があったと思うので、ちょっと使ってみた。
apt install rarcrack
で使おうとした
takuya@atom:~$ rarcrack --help RarCrack! 0.2 by David Zoltan Kedves (kedazo@gmail.com) Usage: rarcrack encrypted_archive.ext [--threads NUM] [--type rar|zip|7z] Options: --help: show this screen. --type: you can specify the archive program, this needed when the program couldn't detect the proper file type --threads: you can specify how many threads will be run, maximum 12 (default: 2) Info: This program supports only RAR, ZIP and 7Z encrypted archives. RarCrack! usually detects the archive type.
マルチバイト文字でパスワードを決めてたらこの手の総当りツール無力ですよね。
8年前は、もうすでに場合でパスワードを日本語マルチバイト文字にしてるわ。だめでした。
日本語の文字列って組み合わせ数がとんでもないので、日本語を使うべきなんですよ。
仮に総当りするとしたら
文字種 | 文字数 | パスワード文字数 | 組み合わせ | オーダ |
---|---|---|---|---|
ヒラギノ角ゴ std | 約 10,000 文字 | 4 文字 | 10,000,000,000,000,000 | 10 ^ 16 |
常用漢字 + ascii | 約 2,200 文字 | 6文字 | 12,800,000,000,000,000 | 10 ^16 |
ascii char コード | 約100 | 8文字 | 10,000,000,000,000,000 | 10 ^16 |
うーん、圧倒的じゃないか日本語。
しかも大抵のツールは ascii だけしか対象にしないしな。
総当りツールの回避を考えたら
パスワードの定期的変更<<<<<<<<<<<<<<< マルチバイト文字をパスワード だと思います。
php で windows の zip ファイル・アーカイブ形式を扱うには ZipAcrchive
の事実上一択になるのですが。
<?php $z = new ZipArchive; $z->open("sample.zip");
これでファイルが開けるのですが、fopen wrapper が使えない
file_get_contents が何でも開ける、PHPを最強にするツールですよね。
fopen で開けるファイルのアレコレを様々なプロトコル(スキーマ)に対応させる奴
http:// https:// ssh:// php://temp php://memory php://input php://stdin
などなど、知ってると面倒な処理が、楽になる。
<?php $z = new ZipArchive; $z->open("http://......"); var_dump($z);
結果は虚しい。
ZipArchive を使って php://memory で展開したり、 http からファイルを取ってこようと思ったら一切できない。
一旦データを変数に展開して、変数値からロードしようとしても出来ない。
<?php $z = new ZipArchive; $data = file_get_contents("http://......"); $z->open($z);//出来ない var_dump($z);
phpのC extension に手を入れるのは面倒だし、php のコミュニティは検索スパムだしもどかしい所。
せめて、バイナリから開けたら、なんとかなったのに。
tail -f /var/log/apache2/access.log
grep hostname /var/log/apache2/access.log
知らなかった。tail -f ってそのままパイプに渡しててもチャントSTDINのREAD待ちでパイプがブロックIOになるんですね
tail -f /var/log/apache2/access.log | grep hostname
便利!!
http://unix.stackexchange.com/questions/3229/grep-and-tail-f
キャッシュを正しく扱える様になる第一歩。キャッシュが聞いているかをチェックする必要がある。
そのためには、キャッシュのオンオフをちゃんを扱える必要がある。
長押し
でキャッシュを無視してリロードするメニュー表示
意外と知られてないのが、更新ボタンの長押し
開発ツール
を表示中に長押しすると出てくる。
ctrl + F5
電話やメールで伝えるにはコッチのほうが確実
キャッシュを正しく使っているかは、開発ツールを使うと確認できる。
オン
のヘッダを確認2番めのキャッシュオンの動作時に、先に紹介したキャッシュ無視リロードでファイルを読み込んでキャッシュを作って次にリロード
画像なので、キャッシュして良いんですけど。なぜかキャッシュしないんですよね。
HTTPキャッシュのヘッダみたら・・・
Expires: ... LastModified: ... E-tag: .. Pragma: no-cache
え? nocacheが送られてる?なんで。
散々しらべたらまじか。 session_start(); すると no-cacheにされるのがデフォルト仕様
<?php session_start();
これをすると
session_cache_limter("no-cache");
が自動で使われる.
この値をほうっておくと HTTPヘッダに
Expires: 過去 Pragma: no-cache
が付与されて、キャッシュの制御が面倒になる。
session_cache_limter("public");
などにしたうえで、
を付与しないと上手くキャッシュしない。
session_cache_limiter
をペア使うことを意識しておくと。キャッシュが効かないとコネクション数が増えちゃったり、無駄な処理が増えるのでサーバー限界早すぎる。
詳しくは、 php.ini の設定項目なんだけど。気づかないよねコレ。
わかりにくいので追記
zip から表紙(見出し)に使おうと思ったけど、index=0 を取り出したら上手く行かなった。
ファイル名が先頭のファイルだけを取り出す処理をしたら上手く行った。
そうだ、定番文字コード対応忘れてた 2016-04-30対応させた
<?php if( !empty ($_GET["url"] ) ){ $za = new ZipByEntryName; // echo urldecode( $_GET["url"] ); $za->open( urldecode( $_GET["url"] ) ); $a = $za->first_file; // var_dump($za); header("content-type: image/jpeg; "); echo $a;
これでzip からサンプルとして先頭ファイルを取り出せる。
コマンド | 詳細 |
---|---|
pushd | 今いるディレクトリをスタックに積んで、指定ディレクトリに移動 |
popd | スタックから取り出して履歴のディレクトリに移動 |
Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:\Users\takuya>pushd c:\ pushd c:\ c:\>cd Users cd Users c:\Users>popd popd C:\Users\takuya>
pushd/popd は知っててbashで使う時もあったけれど、cmd.exe で使えるのは便利ですね。
とくに履歴移動が面倒な cmd.exe では重宝しそう
知らなかったです。泣きそう
わざわざ、右クリックメニューで削除を選んでるのに、「本当に削除しますか?」「消すに決まってんだろJK」
消すから削除を選んでるのに、、、
ゴミ箱右クリック→プロパティ→チェックオフ
たしかWin10からはデフォルトでチェックOffのはず。
.lnk
Cygwinからみると、lnk が通常ファイルに見えてしまう。
しかし、これをショートカットとしてシンボリックリンクてきに扱うことがべ着れば便利だと思うんですね。
cygwin では各種ショートカットを扱うことが出来る。
ショートカット | 詳細 |
---|---|
.lnk | エクスプローラーのショートカット |
ntfs:symlink | NTFSのシンボリックリンク |
symlink | Linuxのシンボリックリンクファイル |
初期設定のCygwinはLinuxのシンボリックリンク・ショートカットを作っていた。
export CYGWIN="winsymlinks:native"
または
export CYGWIN="winsymlinks:lnk"
この環境変数を入れればイイようだ。
ln -s
で作られるショートカットは lnk
になる。
ln -s
で作られるショートカットは ntfs symlinkd
になる。
winsymlinls:lnk も winsymlinls:native もどちらを設定しても、リンクは読めた
takuya@:~/Desktop$ ll 合計 128 -rw-r--r--+ 1 takuya None 0 4月 28 16:03 a.txt lrwxrwxrwx 1 takuya None 5 4月 28 16:04 b.shortcut -> a.txt drwxr-xr-x+ 1 takuya None 0 4月 28 15:49 ディレクトリ1 lrwxrwxrwx 1 takuya None 21 4月 28 15:58 リンク0 -> ディレクトリ1 lrwxrwxrwx 1 takuya None 21 4月 28 15:49 リンク1 -> ディレクトリ1 lrwxrwxrwx 1 takuya None 21 4月 28 15:54 リンクnative -> ディレクトリ1
但し、読めたのは、Cygwinから作った場合のみで、Explorerで作られた lnk が読めなかった。なぜだろう。疑問が残る。
$ mkdir ディレクトリ1 $ ln -s ディレクトリ1 リンク1 $ cd リンク1 $ pwd /home/takuya/Desktop/リンク1
この状態で、cmd.exe から見ると次のようになっている。
C:\Users\takuya\Desktop>dir | nkf -w dir | nkf -w ドライブ C のボリューム ラベルは HDD です ボリューム シリアル番号は F270-76C3 です C:\Users\takuya\Desktop のディレクトリ 2016/04/28 15:49 <DIR> ディレクトリ1 2016/04/28 15:54 <SYMLINKD> リンクnative [ディレクトリ1] 2016/04/28 15:49 539 リンク1.lnk
ふむ。
調べたら、標準パッケージのsignal があった
import signal import sys def sigterm_handler(signal_number, stack_frame): some_function_to_clean_up() sys.exit(0) signal(signal.SIGTERM, sigterm_handler)
なるほどー
これで、 SIGTERM や SIGINIT 受けた時の動作が作れそうですね。
http://stackoverflow.com/questions/18499497/how-to-process-sigterm-signal-gracefully
import os os.rmdir("/path/to/not_empty_dir")
OSError: [Errno 39] Directory not empty:
ま、当然なんだけど。
rm -rf path/to/dir
するシェル経由で rmdir 呼び出すのはまぁ、想像つくんだけど、ruby の FileUtil に相当するものがないのか調べたら、shutil
がそれらしい。
コレが確実っぽい
import shutil shutil.rmtree("path/to/dir")
これで、確実に作業用ディレクトリを捨てられる。
http://stackoverflow.com/questions/13766513/how-to-do-force-remove-in-python-like-rm-rf-on-linux
たとえばファイルを作っている時に、途中で中断するとか。
その際に、途中のファイルや作業用ディレクトリを消したい。などと
一番カンタンなのが、KeyboardInterrupt を見ることなんだ。
try : os.chdir(workdir) sleep(1000) except KeyboardInterrupt : print ( "KeyboardInterrupt\n" ) finally: if os.path.exists( work_dir ) : shutil.rmtree (work_dir ) os.chdir(os.path.expanduser('~')) pprint( os.getcwd( ) )
KeyboardInterrupt
は Ctrl+C なので、シグナルを受けてるわけでもないんですよね。。。
kill term された時はどうするんだよう。。。