SVGの要素に fill:none を設定すると hover が利かなくなる

先日、SVGの要素 (rect) にCSSで:hoverを利用して内部の色が変わるように設定したところ、カーソル (マウスポインター) を要素の上にかざしても反応しないという現象に遭遇しました。全く反応しないわけでもなく、たまに反応する場合もありました。原因を調べたところ、SVGの要素の stylefill:none を設定すると、hoverが利かないということがわかりました。(FirefoxとEdgeで確認しました。)

下のSVGがその例です。

左の正方形がfill:noneを設定しているものです。マウスを正方形の中に移動させても反応しないのがわかります。ただ、全く反応しないのではなく、反応する場合もあります。特に、枠線のあたりにマウスを持っていくと反応することもあります。

真ん中の正方形が同じくfill:noneを設定して、枠線を太くしたものです。ほぼ問題なく反応することがわかります。反応しない場合もあります。

枠線を太くせずに、正方形の内部を透明にして :hover を使いたい場合は、fill:none にせずに、fill-opacity: 0 として、透明な色で塗り潰すようにします。また、:hover の設定で fill-opacity: 1 として不透明にする必要があります。そのように設定したのが一番右の正方形です。

今回の例では SVG の rect を使用しましたが、circle などでも同様でした。

Posted in SVG

MySQLでCSVファイルに保存されたデータをインポートするには

MySQLでCSVファイルに保存されたデータをテーブルにインポートする方法です。

前提として、CSVファイル名をsample01.csv、カンマ区切りのフォーマットを持つものとし、テーブル名はtable01とします。
インポート作業のタイミングでtable01は作成済みであるとします。

データベースにログインした後、以下を実行します。

もしカンマを含む文字列(例えば、金額 2,000 や化学物質名 N,N-ジメチルホルムアミド など)を要素として持ち、その文字列がダブルクォテーション(“)で囲まれている場合は「enclosed by」を使用して「”」が囲み文字であることを指定すればそのまま読み込むことができます。

LOCAL修飾子が機能するかどうかについては、サーバおよびクライアントの設定に依存するようです。
13.2.7 LOAD DATA ステートメント

将棋ウェブサービスにおける将棋盤の実装方法調査

ブラウザ上で将棋盤の操作ができる将棋関連ウェブサービスをいくつか使ったことがあるのですが、それらの実装方法については考えたことがありませんでした。そこで、技術調査と趣味を兼ねて、将棋のウェブサービス一覧を作成して、それぞれのサービスにおいて将棋盤がどのような技術を用いて実装されているか、調査しました。なお、利用者同士が対局する専用のサービス(将棋倶楽部24 HTML5道場 など)は調査対象外としました。

将棋盤という同じものを実装するのにも、いくつか方法があって興味深いです。

サービス名 実装に使われている技術 概要
Shogipic JavaScript 将棋の局面図を作れる。
Shogi Board PWA (Progressive Web Apps) 棋譜並べや検討ができる。ダウンロードして実行できる。
ウェブ将棋盤 JavaScript ブラウザ上で棋譜並べ・詰め将棋。
Shogi Playground SVG + JavaScript 盤面編集ができる。
将棋丸 (ブラウザ版) WebAssembly 将棋プログラムと対局できる。デスクトップ版もある。
ぴよ将棋w (WEB版) JavaScript 将棋プログラムと対局できる。
きのあ将棋 ブラウザ版 JavaScript 将棋プログラムと対局できる。
つぼ将棋 canvas + JavaScript 将棋プログラムと対局できる。
将皇 canvas + JavaScript (WebGL) 将棋プログラムと対局できる。
Webブラウザ将棋 canvas + JavaScript 将棋プログラムと対局できる。
こまお JavaScript 将棋プログラムと対局できる。
将棋ウェブルーム JavaScript 複数人がリアルタイムで同じ将棋盤を表示・操作できる。
ちょっと便利な将棋盤 Vue.js (TypeScript) + SVG 盤面編集、履歴保持&操作、先後逆向き機能

間違いなどございましたら、ブログの連絡先、または 調査担当者のTwitterアカウント @hideaki_sakai までご連絡ください。

Posted in Web

HyperoptとOptunaによるハイパーパラメータチューニングの例

機械学習において、作成したモデルの精度を高めるためのテクニックのひとつがハイパーパラメータのチューニング(調整)です。
ハイパーパラメータのチューニングの方法としては、手動、グリッドサーチ、ランダムサーチ、ベイズ最適化などの方法があります。
今回は、ベイズ最適化による方法でよく使われるライブラリであるHyperoptOptunaの使い方を比較するため、同じ問題(Boston house prices dataset)に対して、同じモデル(リッジ回帰; sklearn.linear_model.Ridge)を用いて、簡単なコードを作成してみました。(あくまでHyperoptとOptunaの使用例を示すためのもので、この問題の解法を示しているわけではございませんので、ご了承ください。)

上がHyperoptのコード例、下がOptunaのコード例です。コードを比較するとわかるように、Hyperoptの方は最適化するモデル(関数)とは別にハイパーパラメータの範囲を定義してfmin関数に関数とハイパーパラメータの範囲を定義したものを渡していますが、Optunaの方は最適化するモデル(関数)の中でハイパーパラメータの範囲を定義しています。

今回の例では、以下の通り、実行結果はほぼ同じになりました。

HyperoptとOptunaは、TPE(Tree-structured Parzen Estimator)という同一の最適化エンジンを使っていますが、枝刈りの機能の貢献により、Optuna の方が効率的に最適化の処理をするようです。

HyperoptとOptunaについての詳しい情報は、以下のリンクをご参照ください。

参照

Easy FancyBoxを1.6.3に更新後に管理画面が表示されなくなる現象の修正方法

WordPressで利用している「Easy FancyBox」というプラグインをバージョン1.6.3に更新したところ、WordPressの管理画面が表示されなくなりました。ウェブサーバのログを確認したところ、以下のようなエラーが出ていました。

調べたところ、PHP5.4以降でのみ対応している構文が使われているためだということがわかりました。
修正するには、WordPressが動いているシステムのPHPを5.4以降に更新するか、プラグインのディレクトリの inc/class-easyfancybox-admin.php の21行目の []array() に変更します。

コードで見ると、修正前は以下のようになっています。

これを以下のように修正します。

これで、管理画面が表示されるようになります。

jQuery Toolsのドメイン期限切れとArconix Shortcodesプラグインの修正方法

jQuery Toolsのページ でも案内されているjQuery Tools UI libraryの公式の読み込み元である http://cdn.jquerytools.org/1.2.6/full/jquery.tools.min.js が、ドメイン期限切れのため、アクセスできなくなっています(2017年12月24日現在)。

その影響で、Arconix ShortcodesというWordPressのプラグインが正常に動作しなくなっています(2017年12月24日現在)。

jQuery Tools UI libraryの読み込み元にアクセスできるようになるか、プラグインの側で正式に対応するまでの応急処置として、プラグインのコードに以下の修正をしました。

修正方法は以下の通りです。
プラグインのコードにある、上記のアクセスできなくなったサイトにある「jquery.tools.min.js」のURLを指定している部分を、プラグインに含まれる「jquery.tools.min.js」のURLになるように修正します。
具体的には、「wp-content/plugins/arconix-shortcodes/plugin.php」の107行目

に変更すれば、修正完了です。(URLが異なる場合は適宜修正してください。)

更新(2017-01-09)
Arconix Shortcodes のバージョン 2.1.2 で、この問題に対処済になったようです。

CloudflareのIPアドレスを自動的にiptablesに設定する方法

Cloudflare とは、無料で簡単に使えるCDN(コンテンツ・デリバリー・ネットワーク)サービスです。
Cloudflareを導入すると、ウェブサーバへのアクセスが、すべてCloudflare経由になります。そのため、ウェブサーバのiptablesの設定で、ウェブサーバへのHTTPとHTTPSのアクセスをCloudflareのIPアドレスに制限することができます。

そこで、CloudflareのIPアドレスを自動的に取得して、iptablesに設定するようにしてみました。

まず、CloudflareのIPアドレスは、 Cloudflareの「IP Ranges」のページ に載っています。そのページにある通り、IPv4のアドレスのリストだけのページが https://www.cloudflare.com/ips-v4 に用意されています。

次に、IPアドレスのリストを取得して、iptablesを設定する方法が、Cloudflareのブログ記事「How do I whitelist Cloudflare’s IP addresses in iptables?」に載っています。

しかし、今回は、そのブログにある方法ではなく、以下のようなスクリプトを作成して、設定しました。

可用性を考えて、IPアドレスのリストの取得に失敗した場合は、すべてのIPアドレスからのHTTPとHTTPSのアクセスを許可しています。
スクリプトの設定方法は、以前の記事「Debianでのiptables設定」の通りに行いました。

Debianでのiptables設定

Debian(stretch)でのiptables設定について、調べたことをまとめてみます。

以前は、以下のようなスクリプトを /etc/network/if-pre-up.d/ に置いて、iptables設定を行っておりました。
(外部からは、IPアドレスが「192.168.1.2」の管理用PCからと、httpとhttpsの通信のみを許可する例です。)

しかし、インターフェースが複数ある場合に、同じ設定が2重に設定されるという状況になってしまいました。
Debian 管理者ハンドブックの「14.2.4. 起動時にルールを適用する」 を見てみたところ、 /etc/network/interfaces に設定する方法が推奨されていたので、その方法で設定することにしました。

まず、上のスクリプトを /usr/local/etc/iptables.sh に置きます。このとき、置くディレクトリは任意の場所、ファイル名は任意のもので構いません。

次に、以下のように、 /etc/network/interfaces の中の最後のインターフェースのところに「up /usr/local/etc/iptables.sh」と書きます。

以上で設定は終わりです。
この設定に変えてからは、同じ設定が2重に設定されることはなくなりました。

NetworkManagerなどを利用している場合は、設定方法が変わりますので、NetworkManagerのマニュアルなどを調べる必要がありそうです。

OWASP Flagshipプロジェクトまとめ

先日、OWASPのイベント「OWT2017JP」に参加してきました。

ご存知でない方のためにOWASPとは何かについての説明を、OWASP Japanチャプターのホームページより引用します。

OWASP – Open Web Application Security Project とは、Webをはじめとするソフトウェアのセキュリティ環境の現状、またセキュアなソフトウェア開発を促進する技術・プロセスに関する情報共有と普及啓発を目的としたプロフェッショナルの集まる、オープンソース・ソフトウェアコミュニティです。

その日のトレーニング(講演)で、OWASPのさまざまなプロジェクトについての説明がありました。そのおかげで、いままで知らなかった、多くの役に立つプロジェクトがあることを知りました。OWASP Projectのページ を見るとわかるように、OWASPにはとても多くのプロジェクトがあります。そこで、トレーニングで学んだ内容をふまえて、OWASPの主なプロジェクトである、Flagshipプロジェクトについて表にまとめてみました。

Tools

プロジェクト 日本語訳 簡単な説明
OWASP Zed Attack Proxy Project OWASP ZAP マニュアル Ver.2.1.0版 無料のペネトレーションテストツール。Webアプリケーションに対して自動診断を行う。腕を磨けば手動での診断にも利用できる。
OWASP Web Testing Environment Project OWASP WTE。OWASPのアプリケーションセキュリティツールとドキュメントの詰め合わせ。VM、Debianパッケージ、ブータブルISOイメージなどの配布形式がある。
OWASP OWTF OWASP Testing GuideやPTES(Penetration Testing Execution Standard)などのセキュリティ基準に沿った効率的なペネトレーション検査ができるツールを開発するプロジェクト。
OWASP Dependency Check Webアプリケーションの中から脆弱性のあるコンポーネントを発見するスキャナー。Java, .NET に対応。Ruby, Node.js, Python, C/C++ は試験的な対応。
OWASP Security Shepherd Webとモバイルのアプリケーションセキュリティのためのトレーニングツール。セキュリティを学ぶためのハンズオン環境。CTFモード、オープンフロアモード、トーナメントモードなどを備える。

Code

プロジェクト 日本語訳 簡単な説明
OWASP ModSecurity Core Rule Set Project ModSecurityで使える一般的な攻撃検知のためのルールセット。(ModSecurityはApacheのモジュールとして動作するオープンソースのWAF。)
OWASP CSRFGuard Project クロスサイト・リクエストフォージェリ(CSRF)対策ライブラリ。
OWASP AppSensor Project アプリケーションレイヤーに対する侵入検知と自動応答のためのフレームワーク。アプリケーションに防御層を実装する。「OWASP AppSensor Guide」(ガイド)と「OWASP AppSensor Reference Implementation」(コード)を含む。

Documentation

プロジェクト 日本語訳 簡単な説明
OWASP Application Security Verification Standard Project OWASPアプリケーションセキュリティ検証標準 ASVS。アプリケーションのセキュリティ要件またはセキュリティテストの項目。セキュアなアプリケーションとは何かを定義するこができる。アプリケーションのセキュリティ評価のための検査標準。自動または手動のセキュリティテスト及びコードレビュー方式の要件。
OWASP SAMM Project ソフトウエアセキュリティ保証成熟度モデル Software Assurance Maturity Model (SAMM)。ソフトウェアセキュリティ保証成熟度モデル。リスクに合わせたソフトウェアセキュリティ戦略を実装するためのフレームワーク。開発ライフサイクルをよりセキュアにする。より成熟したセキュア開発を行うことを支援するドキュメント。
OWASP AppSensor Project アプリケーションレイヤーに対する侵入検知と自動応答のためのフレームワーク。アプリケーションに防御層を実装する。「OWASP AppSensor Guide」(ガイド)と「OWASP AppSensor Reference Implementation」(コード)を含む。
OWASP Top Ten Project OWASP Top 10 – 2013 日本語版 Webアプリケーション脆弱性トップ10。主要な脆弱性10個を説明するもの。
OWASP Testing Project OWASP テスティングガイド Webサイト/アプリケーションのテストガイド「OWASP Testing Guide」。各脆弱性、機能別のテスト方法。

なお、「OWT2017JP」のスライド資料は https://speakerdeck.com/owaspjapan にて公開されております。

Sphinxでグリッドテーブルに全角記号を使った場合のエラー

ドキュメントの作成に、ドキュメントが簡単に作れるツール Sphinx を気に入って使っています。

先日、グリッドテーブル(Grid Table)に全角記号を入れるとエラーになるということに気がつきました。
具体的には、以下のようなものがエラーになってしまいます。

しかし、次のようにするとエラーなく処理されます。

横幅がそろっていないとエラーになるはずが、そろっているとエラーになり、ずらすとエラーがなくなるいう状態です。

困って調べたところ、Pythonのdocutilsパッケージが原因であることがわかりました。

グリッドテーブルが正しい形式になっているかを確認するときに、docutils内で、グリッドテーブルの各行の長さを計算しています。そのとき、ひらがなや漢字などの全角の文字は、半角2文字分の幅を取っているので、見た目と合わせるために、長さを2として計算されます。しかし、「→」などの全角記号が長さを1として計算されているため、見た目とずれてしまっています。

これを修正するために、以下のようにしました。環境はDebian9(stretch)です。

システム側のdocutilsを変更しないで済ませるために、ユーザのホーム以下のディレクトリにコピーをします。ここでは「.pythonlib」というディレクトリ名にしましたが、これは任意の名前で構いません。

このディレクトリを、モジュールファイルのデフォルトの検索パスに追加するために、環境変数を設定します。bashならば、以下の行を環境設定ファイル(「.profile」など)に記述します。

環境設定ファイルを読み込めば有効になります。

コピーしたdocutilsディレクトリ配下の「statemachine.py」の

のように変更します(「A」を追加)。

また、今回の修正には直接関係ありませんが、整合性をとるため、コピーしたdocutilsディレクトリ配下の「utils/__init__.py」の

のように変更(「1」を「2」に変更)しておくといいと思われます。

以上で、全角記号を含んだグリッドテーブルで、見た目がそろっていればエラーが出ずに処理できるようになりました。