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

投稿

Linuxコマンドの組み合わせだけで、前日の日付がが入ったファイルのみgzip圧縮する方法

ログファイルなどでは日ごとにファイルを生成し、日付がファイル名に入っている場合があると思います。 前日までの日付のファイルをすべてgzipで圧縮するLinuxコマンドを紹介します。 注: コマンドの組み合わせは、もっと少なくできる方法もあるかもしれませんが、今回紹介したコマンドの組み合わせでも、たたき台にはなるかと思いますので、参考にしてみてください。 # /dir/ディレクトリはいかにある、拡張子がlogのファイルでかたファイル名に含まれる日付がコマンド実行時の前日のものをすべてgzip圧縮するコマンドの組み合わせ。 find /dir/ -type f -name "*.log" | sed 's/.*_\([0-9]*\)\.log/\1/` | awk -v date="$(date +%Y%m%d)" '{if ($0 < date) print $0}' | xargs -I {} find /dir/ -name "*{}.log" | xargs --no-run-if-empty gzip 簡単に解説です。 find /dir/ -type f -name "*.log" :dirディレクトリ配下で拡張子がlogのファイルをすべてリストアップ sed 's/.*_\([0-9]*\)\.log/\1/` :ファイル名から日付部分のみを抜き出し awk -v date="$(date +%Y%m%d)" '{if ($0 < date) print $0}' :コマンド実行時の前日の日付のみ抜き出し。ちなみにawkのvオプションで変数dateを定義しています。 xargs -I {} find /dir/ -name "*{}.log" :前日以前の日付が含まれる拡張子がlogのファイルをすべて取得。ちなみにxargsの -Iオプションの{}の部分で日付部分をfindコマンドに渡しています。 xargs --no-run-if-empty gzip :ファイルがなかったら実行しないというxargsのオプション

Androidのホーム画面で左スワイプすると出現するGoogleのフィードを無効化する方法

Androidのホーム画面で左スワイプすると出現するGoogleのフィードが邪魔だったので、無効化してみました。Android 8.0 Oreo では下記の方法で変更できました。 Androidのホームスクリーンを長押し 使っているLauncherにもよりますが、Preferencesを選択 Home screenを選択 Scrolling modeで「Standard scrolling + Google」が選択されているので、「Standard scrolling」を選択 使っているスマートフォンのAndroidのバージョンやLauncherの種類にもよるので、「この手順で決まり」というのは中々いいづらいです。 肝は、ホームスクリーンを長押しして、ホーム画面の設定からそれらしい設定を見つけることでしょうか (例えば「Swipe to access Google app」とかの場合もあるようです)。

PHPのregister_shutdown_functionで登録した関数内でmemory_limitを増加させる

PHPで、特にメモリ不足のエラーが発生してプログラムが強制終了したときに、register_shutdown_functionに終了時に実行したい関数を登録することで、プログラム終了時にその登録した関数を実行することができます。 が、その登録した関数内の処理でメモリ不足になり、実行したかった処理が実行されないという問題に遭遇しました。 色々テストしたところ、register_shutdown_functionに登録した関数内でPHPのmemory_limitを増加させれば対応できることがわかりました。 といわけで現在のmemory_limitに任意のメモリ値を足すメソッドを作成してみました。 下記のsetAddedMemoryLimitByMegaByteメソッドは、引数にmemory_limitの増分を渡すことで、memory_limitの設定値を増加させることができます。 注意点として、作成したプログラム内のmemory_limitの許容フォーマットは こちら に書かれている情報に基づいて決めました。 今のプログラムは、256、128K、1024M、3Gなどは正しく処理可能です。 メモリサイズの設定値なので、そこまで変な値が設定される可能性は少ないですが、もし今のプログラムで処理できない場合は、convertMemoryLitAsByteValue内のmemory_limitをパースしている正規表現部分を修正することで対応できます。 class PHPUtils { public static function setAddedMemoryLimitByMegaByte($addition) { $current = ini_get('memory_limit'); if($current == -1) { return; } try { ini_set('memory_limit', self::calcAddedMemoryAsMegaByte($current, $addition))

VIsual StudioでGitHubと連携

VIsual Studio上でGitHubと連携をさせるには、 GitHub Extension for Visual Studio が便利です。 最近は GitHub Desktop とかも提供されていて、バージョンコントロールでどのツールをメインで使うか悩みどころです。

PHPのNormalizerを使って文字列を正規化 (例: 全角英数字を半角英数字にする方法)

文字列検索を実施する際に、全角半角を区別せずに検索させたい場合があるかと思います。 例えば、全角文字の「ABC」で検索して半角文字の「ABC」にヒットさせたい場合です。そのような場合は、文字や文字列を正式に決められた表現に変換する処理「正規化」を行うことで解決します。(もちろん検索される側の文字列の表現が統一されていることが前提にはなります。) 「正規化」はテキストを保存する際の表記を統一するために用いられうこともあります。 PHPではNormalizerというライブラリを利用します。下記に使用例を示します。 <?php // 全角文字表記 $input = 'ABC'; $result = \Normalizer::normalize($input, \Normalizer::NFKC); // 半角文字のABCが出力される echo $result; このプログラムでNFKC正規化をすると下記のような結果が得られます。 入力 種類 出力 ㈱ 組み文字 (株) ㍇ 組み文字 マンション ア 半角カタカナ ア ちなみに正規化の種類には下記の4種類があります。( Wikipediaより引用) 。 名称 説明 NFD Normalization Form Canonical Decomposition 文字は正準等価性によって分解される。 NFC Normalization Form Canonical Composition 文字は正準等価性によって分解され、再度合成される。結果として文字の並びが変換前と変わることもありうる。 NFKD Normalization Form Compatibility Decomposition 文字は互換等価性によって分解される。 NFKC Normalization Form Compatibility Composit

Unity関連のクラスをWindowsのスタンドアローンアプリケーションから利用する際の注意点

Unityのアセンブリを参照してWindows上からスタンドアローンのアプリケーションを実行しようとしたところ、Unity Engine内からしかインスタンス化できないクラスがあったのでメモです。( visual studio - C# Security Exception - Stack Overflow でも投稿されています。) 例えば、GameObjectクラスをUnity Engine外からインスタンス化しようとすると下記のようなエラーが発生します。 System.Security.SecurityException : ECall メソッドをシステム モジュールにパッケージ化しなければなりません。 英語だと下記のエラーメッセージになります。 ECall methods must be packaged into a system module Stack Trace: GameObject.ctor() ちなみにVector3の構造体(struct)はUnity Engine外から参照しても問題ありませんでした。 実際にクラスや構造体を利用してみて調べていくしかなさそうです。

JavaのServlet内で他のURLから取得したデータをそのまま出力するコード

JavaのServlet内で他のURLからデータを取得してそのまま、レスポンスを出力するためのコードサンプルです。 使っているのはJavaの標準ライブラリのみなので、移植性は高いと思います。googleの提供しているライブラリやApacheのcommonsのライブラリを使うともう少しコード量は減らせると思います(特に汎用的なcopyメソッドの部分)。 import java.io.IOException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; public class ServletUtils { private static final int _20K_BYTES = 20480; public static void fetchUrlAndDirectlyRespond(HttpServletResponse resp, String contentType, String urlStr) throws MalformedURLException, IOException, URISyntaxException { URL url = new URI(urlStr).toURL(); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setRequestMethod("GET"); connection.connect(); ServletOutput