それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

pecl でパッケージをインストール。

久しぶりなので、状況を確認しながら

必要なもの

apt install phpize php-pecl

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

mod_php の設定をリロード

/etc/php5/conf.d/mongodb.ini

コメント書いておくとOK

; 2016-05-02 PECLからインストール
extension=mongodb.so

fcgi 系は fcgiphp.iniかな

LinuxだとPECLインストール楽チンでいいね。

2020-02-06

pecl のコマンドが 7.3, 7.4 で若干変わってたので改編

zip/rar のパスワードを解析復元しようとしたけど、「日本語パスワード」は総当たりが難しい。

連休でファイルの整理をしてたら昔の写真出てきた。

8年くらい前のファイルが出てきたんですよ。でもRARパスワード掛けてるんですよね。わたし。

rarcrack でちょっと試してみた

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 だけしか対象にしないしな。

総当りツールの回避を考えたら

パスワードの定期的変更<<<<<<<<<<<<<<< マルチバイト文字をパスワード だと思います。

ZipArchive は fopen wrapper を使えない。

タイトルのとおりです。

phpwindows の zip ファイル・アーカイブ形式を扱うには ZipAcrchive の事実上一択になるのですが。

<?php

$z = new ZipArchive;
$z->open("sample.zip");

これでファイルが開けるのですが、fopen wrapper が使えない

fopen wrapper とは?

file_get_contents が何でも開ける、PHPを最強にするツールですよね。

fopen で開けるファイルのアレコレを様々なプロトコルスキーマ)に対応させる奴

http://
https://
ssh://
php://temp
php://memory
php://input
php://stdin

などなど、知ってると面倒な処理が、楽になる。

ZipArchive では使えない

<?php

$z = new ZipArchive;
$z->open("http://......");
var_dump($z);

結果は虚しい。

ZipArchive を使って php://memory で展開したり、 http からファイルを取ってこようと思ったら一切できない。

バイナリ(String)もだめ

一旦データを変数に展開して、変数値からロードしようとしても出来ない。

<?php

$z = new ZipArchive;
$data = file_get_contents("http://......");
$z->open($z);//出来ない
var_dump($z);

phpのC extension に手を入れるのは面倒だし、php のコミュニティは検索スパムだしもどかしい所。

せめて、バイナリから開けたら、なんとかなったのに。

参考資料

http://php.net/manual/en/ziparchive.open.php

tail -f と grep を同時に出来る

tail -f は定番

tail -f /var/log/apache2/access.log

grep もよくやる

grep hostname /var/log/apache2/access.log

tail -f grep は合わせて使える

知らなかった。tail -f ってそのままパイプに渡しててもチャントSTDINのREAD待ちでパイプがブロックIOになるんですね

tail -f /var/log/apache2/access.log | grep hostname

便利!!

参考資料

http://unix.stackexchange.com/questions/3229/grep-and-tail-f

chrome でキャッシュを無視してリロードする簡単な方法

キャッシュが疑わしいとき

キャッシュを正しく扱える様になる第一歩。キャッシュが聞いているかをチェックする必要がある。

そのためには、キャッシュのオンオフをちゃんを扱える必要がある。

長押しでキャッシュを無視してリロードするメニュー表示

f:id:takuya_1st:20160501004210p:plain

意外と知られてないのが、更新ボタンの長押し

開発ツールを表示中に長押しすると出てくる。

電話応対ならキーボードショートカット

ctrl + F5

電話やメールで伝えるにはコッチのほうが確実

次に開発ツールでキャッシュのオンオフを切り前

キャッシュを正しく使っているかは、開発ツールを使うと確認できる。

  • Disable cache のチェック済み状態でファイルを読み込んでキャッシュオフのヘッダを確認
  • Disable cache のチェック無し状態でファイルを読み込んでキャッシュオンのヘッダを確認

2番めのキャッシュオンの動作時に、先に紹介したキャッシュ無視リロードでファイルを読み込んでキャッシュを作って次にリロード

f:id:takuya_1st:20160501004354p:plain

セッション使うとキャッシュが効かない!? session_start で pragma : no-cache が自動付与される。

php で画像を送信してたんですよ。

画像なので、キャッシュして良いんですけど。なぜかキャッシュしないんですよね。

HTTPキャッシュのヘッダみたら・・・

Expires: ...
LastModified: ...
E-tag: ..
Pragma: no-cache

え? nocacheが送られてる?なんで。

pragma:no-cache どこから出てきた。

散々しらべたらまじか。 session_start(); すると no-cacheにされるのがデフォルト仕様

<?php
session_start();

これをすると

session_cache_limter("no-cache");

が自動で使われる.

この値をほうっておくと HTTPヘッダに

Expires: 過去
Pragma: no-cache

が付与されて、キャッシュの制御が面倒になる。

キャッシュを効かせたいときは

session_cache_limter("public");

などにしたうえで、

  • キャッシュキー(いずれか1つが必須
  • Last-modified
  • E-tag
  • Cache-Control
  • public / private
  • max-age

を付与しないと上手くキャッシュしない。

セッションを使うときは

session_cache_limiter をペア使うことを意識しておくと。キャッシュが効かないとコネクション数が増えちゃったり、無駄な処理が増えるのでサーバー限界早すぎる。

詳しくは、 php.ini の設定項目なんだけど。気づかないよねコレ。

2017-06-22

わかりにくいので追記

参考資料

PHP: session_cache_limiter - Manual

zip からファイルを取出すサンプル(文字コード対応)

php で zip の アーカイブからファイルを取出す

zip から表紙(見出し)に使おうと思ったけど、index=0 を取り出したら上手く行かなった。

ファイル名が先頭のファイルだけを取り出す処理をしたら上手く行った。

gist.github.com

TODO: 文字コード対応忘れた

そうだ、定番文字コード対応忘れてた 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 はcmd.exe でも使える

まじかよ。cmd.exe 知らんかった

コマンド 詳細
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 では重宝しそう

ゴミ箱の削除確認ダイアログを消す

削除確認ダイアログを消すってできたんですね。

f:id:takuya_1st:20160429082911j:plain

知らなかったです。泣きそう

ゴミ箱に移動する削除確認ダイアログって邪魔

わざわざ、右クリックメニューで削除を選んでるのに、「本当に削除しますか?」「消すに決まってんだろJK」

f:id:takuya_1st:20160429083137j:plain:w200 f:id:takuya_1st:20160429083122j:plain:w200

消すから削除を選んでるのに、、、

うっとうしい削除確認ダイアログを消せる

f:id:takuya_1st:20160429082911j:plain:w200

ゴミ箱右クリック→プロパティ→チェックオフ

たしかWin10からはデフォルトでチェックOffのはず。

cywin で windowsの.lnk のショートカットをシンボリックリンク的に扱う。

Windowsのexplorerで作ったショートカットファイル .lnk

Cygwinからみると、lnk が通常ファイルに見えてしまう。

しかし、これをショートカットとしてシンボリックリンクてきに扱うことがべ着れば便利だと思うんですね。

Cygwinで扱うことが出来るショートカット

cygwin では各種ショートカットを扱うことが出来る。

ショートカット 詳細
.lnk エクスプローラーのショートカット
ntfs:symlink NTFSのシンボリックリンク
symlink Linuxシンボリックリンクファイル

初期設定のCygwinLinuxシンボリックリンク・ショートカットを作っていた。

lnk ファイルをショートカットに扱うには

export CYGWIN="winsymlinks:native"

または

export CYGWIN="winsymlinks:lnk"

この環境変数を入れればイイようだ。

winsymlinls:lnk にした場合

ln -s で作られるショートカットは lnk になる。

winsymlinls:native にした場合

ln -s で作られるショートカットは ntfs symlinkd になる。

読み込みやCDコマンドは同じ。

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 が読めなかった。なぜだろう。疑問が残る。

もちろん cd も出来る

$ 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

ふむ。

Pythonでシグナル(sig term)をハンドリングする。

SIGTERMをハンドリングする。

調べたら、標準パッケージの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

Python で空じゃないディレクトリを削除する方法

Pythonでディレクトリを削除しようとすると os.rmdir だけど

import os 

os.rmdir("/path/to/not_empty_dir")

実行すると not empty で止まる。

OSError: [Errno 39] Directory not empty:

ま、当然なんだけど。

消す方法

  • shell をcall して rm -rf path/to/dir する
  • shutil.rmtree を使う

シェル経由で rmdir 呼び出すのはまぁ、想像つくんだけど、ruby の FileUtil に相当するものがないのか調べたら、shutilがそれらしい。

shutil.rmtreeの場合

コレが確実っぽい

import shutil
shutil.rmtree("path/to/dir")

これで、確実に作業用ディレクトリを捨てられる。

参考資料

http://stackoverflow.com/questions/13766513/how-to-do-force-remove-in-python-like-rm-rf-on-linux

Python で Ctrl+C のシグナルハンドラをやる

ctrl+ c でシグナルを取得したい

たとえばファイルを作っている時に、途中で中断するとか。

その際に、途中のファイルや作業用ディレクトリを消したい。などと

KeyboardInterrupt を監視する。

一番カンタンなのが、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( ) )

try except finally でできるけど。

KeyboardInterrupt は Ctrl+C なので、シグナルを受けてるわけでもないんですよね。。。

kill term された時はどうするんだよう。。。

参考資料

Handling Ctrl-C cleanly in Python - ØMQ - The Guide

自宅サーバ・クラスタに朗報 noip で let's encrypt 使える!

ダメ元で noip のドメインlets encrypt をかけてみた

以前は出来なかったきがしたんだけど、出来た!

noip ドメインlets encrypt のSSL証明書出来たよ。

f:id:takuya_1st:20160425001447j:plain:w400

DDNS関連で使えるのはでかい。

Sakuraのクラウドや、GMOクラウドを借りたとしてもドメインも借りると面倒くさい。

DDNSって何処のIPでも関連付けするから、ドメインを管理しなくて良いのが楽だよね

関連資料

https://www.noip.com/

https://github.com/publicsuffix/list/pull/64