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

投稿

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

JavaでTimeZoneを指定して日付をフォーマットする方法

国際的に使われるソフトウェアを開発している場合、日付のタイムゾーンを意識しなければならないことがあると思います。 JavaではZoneIdクラスとZonedDateTimeクラスを利用することで簡単に指定することができます。 下記にAsia/Tokyoのタイムゾーンを指定して、7日前の日付をuuuuMMddHHmmフォーマット(分単位まで表示。例: 2021年2月13日21時34分ならば202102132134)で出力するサンプルコードを示します。 private static final ZoneId TIMEZONE_TOKYO = ZoneId.of("Asia/Tokyo"); private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("uuuuMMddHHmm"); String date_7_days_before = ZonedDateTime.now(TIMEZONE_TOKYO).plusMinutes(-7).format(DATETIME_FORMATTER); System.out.println(date_7_days_before);

Webのリクエストのパラメタを指定したパラメタ順でソートする方法(PHP)

Webリクエストのパラメタを指定したパラメタ名の順でソートするプログラムを書いてみました。 プログラム自体は汎用的なので、パラメタのソートに限らず、それ以外でも利用可能です。 <?php class ParameterSorter { private $sortOrder; // パラメタのソート順を指定 public function __construct($sortOrder) { $this->sortOrder = array_flip($sortOrder); $this->max = count($sortOrder); } // uksortを使って指定されたパラメタ順でソート // $sortOrderのキーをパラメタ名に変換して、uksortを使うのは性能を上げるためです。 // ソート順が指定されていないパラメタは、ソート順が指定されたパラメタの後になるように実装しています。 public function sort(&$parameters) { uksort($parameters, function($a, $b){ return ($this->sortOrder[$a] ?? $this->max) - ($this->sortOrder[$b] ?? $this->max); }); } // PHPのuksortは安定でない(同順位の場合もとの順序が保存されない)らしいので、元の順序を確実に保証するバージョンも作成しました。 public function stableSort(&$parameters) { $originalOrder = array_flip(array_keys($parameters)); uksort($parameters, function($a, $b) use($originalOrder){ $compared = ($this->sortOrder[$a]

Visual Studioで「Source file '...' could not be found」のエラーを解消する方法

問題 Visual Studio上でC#のプロジェクトをビルドを実行したところ「Source file '...' could not be found」のエラーが発生してビルドできなくなってしまいました。 少し調べたところ、Visual Studioのプロジェクトファイル(csproj)のXMLのProject > ItemGroup > Compileのエントリに存在しないファイルが含まれていることが原因でした。 解決法 Visual Studio上からプロジェクトを一度Unloadして、csprojから当該のXMLエントリを削除して、再度プロジェクトをReloadしたところ解決しました。 (プロジェクトのUnload -> Relaodは念のために実施しました)。 下記のようなXMLエントリを探せばOKです(Include属性のファイル名部分はダミーです)。 <ItemGroup> <Compile Include="dir\something1.cs"> <Compile Include="dir\something2.cs"> <Compile Include="dir\missing.cs"> ... </ItemGroup> [補足] 通常のVisual Studioとかで作成したプロジェクトは、csproj内でCompileエントリが直接設定されていることは少ないようです。Unityから作成したプロジェクトなので、1ファイルずつCompileのエントリが設定されていたようです。

ノートパソコンでバッテリの寿命を延ばすためのアプリケーション

バッテリ自体の寿命を延ばすためには、バッテリの充電率を100%ではなく60%程度に抑えておく方がよいようです。 Windowsに備わっているデフォルトの機能だけでは、バッテリの満充電の充電率を制御できませんが、下記のアプリケーションを使うと可能になります。 MSI Dragon Center (MSI専用) ASUS Armoury Crate (ASUS専用) Battery Limiter (フリーソフト) MSIとASUSのアプリケーションはゲームPC向けで、それぞれのメーカー専用なので、普通のノートPCで使う場合は、Battery Limiter一択になるかと思います。 もちろんバッテリの充電量を60%程度に制限するので、バッテリでの駆動時間は短くなってしまいます。なので、バッテリ自体の寿命をそこまで伸ばす必要があるか、自身の使用形態に応じて導入するか検討した方がよいと思います。