スキップしてメイン コンテンツに移動

投稿

PHPで空のディレクトリを再帰的にすべてたたどるプログラム

PHPで指定したディレクトリにある全ディレクトリ内の空ディレクトリをすべてたどるプログラムを書いてみました。 書いた動機としては、あるディレクトリ内にあるディレクトリをすべて削除したかったためです。 symbolic linkはファイルとして扱っているので無視されます。 <?php // $callbackの引数の$fileに、空ディレクトリの\SplFileInfoが渡されて呼ばれます。 function visitEmptyDirectoryRecursively($path, callable $callback) { $files = new \DirectoryIterator($path); $containsOnlyDirectory = true; /* @var $file \SplFileInfo */ foreach($files as $file) { if($file->isDot()) { continue; } else if($file->isDir()) { if(visitEmptyDirectoryRecursively($file->getRealPath(), $callback)) { $callback($file); } else { $containsOnlyDirectory = false; } } else { $containsOnlyDirectory = false; } } return $containsOnlyDirectory; } // 空ディレクトリをすべて削除する場合は、下記のようにして使います。 // permissionの関係でディレクトリを消すことができないなどのエラー処理が必要な場合は、

SQLで特定の文字を組み合わせたランダムな文字列を生成

簡易的な方法として「指定した文字列からランダムに1文字選ぶ」を必要な文字の長さ分concat関数でつなげれば実現できます。 1文字ずつ文字を選ぶので、あまり性能もよくない上、セキュリティ的な観点からのランダム性も担保されていないので、あくまで開発中に必要になった時に使う程度が無難だと思います。 下記に英数字大文字小文字を含んだランダムな3文字の文字列を生成するクエリを示します。 # RAND関数で指定した文字列からランダムに1文字選択。 # 下記の例の62の部分はa~z、A~Z、1~9の文字数の合計値を入れた結果 SELECT CONCAT( SUBSTRING('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', FLOOR(RAND() * 62 + 1), 1), SUBSTRING('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', FLOOR(RAND() * 62 + 1), 1), SUBSTRING('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', FLOOR(RAND() * 62 + 1), 1) ) AS random_string;

GitのCheckoutとCommitをするBashスクリプト

テキスト系のファイルをバックアップするために、Gitレポジトリを利用することがあるのですが、使いまわせるようにbashで簡単なスクリプトを書いてみました。 単純なバックアップ目的なので、branchは固定でmasterを指定しています。 #!/bin/bash checkout(){ local url=${1} local checkout_dir=${2} if [ ! -d $checkout_dir ] then git clone $url $checkout_dir else cd $checkout_dir git pull fi } commit(){ local commit_target_dir=${1} local message=${2} cd $commit_target_dir diff_count=$(echo `git status -s | wc -l`) if [ $diff_count -ne 0 ]; then git add -A git commit -m $message git push origin master fi } ### 使用例 ### USER=... PASSWORD=... # URL組み立て URL=https://$USER:$PASSWORD@githost/project checkout $URL "backup_directory" ### do something in backup_directory... commit "backup_directory" "Auto commit by bash" ちなみに筆者は、バックアップを下記の手順で取ってgitへ入れています。参考になれば、、、 上記のcheckout関数を用いて、gitレポジトリからプロジェクトをclone(既にclone済みの場合はpull) リモートホストからチェックアウトしたディレクトリへファイルをrsyncで同期 上記のcommit関数を用いて、gitレポジトリへpush

PHPでCSV形式でデータを出力するためのコード

PHPでCSVファイルを出力するためのコードサンプルです。 CsvWriterクラスが本体です。最低限のメソッドを定義してあるだけなので必要に応じて拡張してみてください。 Writerインタフェースを定義して、CsvWriterクラスのコンストラクタに渡して切り替えることで、出力方式を変更することができます。 CsvWriterクラス CSV形式で出力するための本体のクラスです。このクラスのコンストラクタにWriterインタフェースを実装したクラスを渡します。 <?php class CsvWriter { private Writer $writer; private $elements = []; public function __construct(Writer $writer) { $this->writer = $writer; } public function init() { $this->writer->init(); } public function appendValuesBySpecificOrder(array $values, $keys) { foreach ($keys as $key) { $this->appendEscaped($values[$key] ?? $default); } return $this; } public function appendValues(array $values) { foreach ($values as $value) { $this->appendEscaped($value); } return $this; } public function appendAsLine(array $values) { foreac

PHPでファイルを1行ごと読み込むためのIterator

タイトル通り、PHPでファイルを1行ごと読み込むためのIteratorをSplFileObjectを使って実装してみました。 <?php class TextFileRowIterator implements \Iterator { private ?\SplFileObject $file; private $filePath; private $current; private $lineNumber = 0; public function __construct($filePath) { $this->filePath = $filePath; } public function current() { return $this->current; } public function key(): \scalar { return $this->lineNumber; } public function next(): void { $this->lineNumber++; // 応用例として、SplFileObjectの呼び出すメソッドを、fgetcsvに変えるとcsvファイルを1行ごと配列で読み込むことができます。 $this->current = str_replace(["\r", "\n"], '', $this->file->fgets()); } public function rewind(): void { $this->file = null; $this->file = new \SplFileObject($this->filePath); $this->lineNumber = 0; if(!$this->file->eof()) { $this-&g

getentコマンドを使ってグループ一覧を取得

Unixのgetentコマンド(ユーザーのpasswordやgroupを調べられる)を使ってUnixでグループ一覧を取得する方法を紹介します。 # グループ一覧を表示 $ getent group ... floppy:x:19 users:x:100 ... # 特に特定のグループのグループIDを取得するには、グループ名をgrepで検索すると便利です。 $ getent group | grep group_name_you_want_to_search group_name_you_want_to_search:x:430

Linuxで新規ユーザーとグループの追加とsshでpasswordなしでログインする方法

Linuxで新規ユーザーとグループの追加とsshでpasswordなしでログインする方法のメモです。super userで実施します。 ローカルホスト側: # user1でssh keyを生成した場合の例 $ ssh-keygen -t rsa Enter file in which to save the key (/home/user1/.ssh/id_rsa): Created directory '/home/user1/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user1/.ssh/id_rsa. Your public key has been saved in /home/user1/.ssh/id_rsa.pub. ローカルホストのid_rsaはユーザーのみ読み書きできるように権限"600"を設定。 リモートホスト側: ユーザーとグループの追加 # "group1"をgroup id 100を指定して追加 $ groupadd group1 -g 100 # "user1"をuser id 200を指定して追加 $ useradd user1 -u 200 -g group1 # groupsコマンドでユーザーの所属グループを確認 $ groups user1 user1 : group1 リモートホスト側: sshでpasswordなしでログイン設定 # .sshディレクトリ作成 $ mkdir /home/user1/.ssh # [重要] .sshディレクトリの権限を変更 # "rwx------"か"rwxr-xr-x" 数字指定だと "700" か "755" でないとダメ。 $ chmod 700 /home/user1/.ssh # ログインするホストのユーザーのid_rsa.pubをauthorized_keysに追加 # 実際はssh-rsa