読者です 読者をやめる 読者になる 読者になる

職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングの成果たち。と言いつつも最近は公開できる成果が少なくてお悩み中。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

Cocoa勉強会関西 第70回 に参加してきました

Macintosh iOS(iPhone/iPad)

cocoa-kansai.connpass.com

直前まで参加できるかどうか怪しい状況でしたが、どうにか都合をつけることができました。
そして、どうせ参加するなら喋りたい!ということで、少しばかり喋ってきました。

喋った内容

Code Signing(コード署名)についての話でした。
どちらかといえばMac寄りな内容ですが、コード署名という作業が必要なのはiOSMacも同じです。コード署名でトラブルが発生するのはアプリをリリースする直前であることが多いのですが、慌てて適当に操作して「何かよくわかんないけどもできちゃった」で終わりにしてしまう人は多いですし自分もそうでした。きちんと基礎を学ぶことで、再現性のある仕事をできるようになりたいと思い、このテーマを取り上げました。

他の方の発表

  • iOS10でリモートプッシュ通知をできるだけ簡単に送る by STUDIO SHIN さん
  • もうすぐはじまるATS必須化について by niwatakoさん
  • 統計から見るアプリユーザーの姿 by niwatakoさん
  • iOS10からこっそり使えるApp Extensionの「これが欲しかった」オプション by niwatakoさん
  • Sparkle で Mac アプリを自動アップデート by kanizaさん

資料は冒頭にリンクを貼ったconnpassのページとかからリンクされている、かも。
全体的に、証明書だとか暗号化の話題の多い回でした。


次回は2017年2月11日の予定だそうです。

おまけ

#SVG で スクラッチくじ を作ってみた

SVG JavaScript

この記事は、SVG Advent Calendar 2016 の3日目の記事です。

SVG Advent Calendar には、このような記事も過去に投稿しています。


さて。
年末ということで、宝くじ や 占い、それに類するものに興味をお持ちの方も多いかと思います。私自身はそのようなものは好きではないのですが、くじ等を作る側(射幸心を煽る側)の人間として各種法令を遵守しながら立ち回ることは嫌いではありません。ここでは、くじを作る側の人間として、SVGでスクラッチくじを作る手法を紹介したいと思います。

まずは完成品のご紹介

さすがにブログ記事の中でJavaScriptを動作させるのはどうなんや…ということで、別のサイトにHTMLファイルを置くという形でご紹介いたします。
f:id:t_motooka:20161127134448p:plain
https://www.tmotooka.com/svg_scratch.html
このページにアクセスすると、銀色(実態は灰色ですが)の部分をマウス操作やタッチ操作で削ることができ、削ると隠されていたメッセージが表示されます。
「もう一度 くじ を引く」ボタンを押すと、銀色の覆いは元に戻り、中のメッセージはランダムで切り替わります。

こすったときに何が起きているのか?

まず初めに、SVG画像としては、銀色の覆いの向こう側には、あとで表示されることになるはずのテキストのメッセージが描かれています。その手前のレイヤに、銀色の長方形が描かれています。

JavaScript のコードでは mousedown mousemove touchstart touchmove などのイベントを捕捉し、マウスカーソルの位置やタッチ位置を把握しています。
その動いた軌跡を、ある程度の太さの線分で結び、その線分で描かれた領域だけ銀色の覆いが非表示にする、ということを mask という機能を使って実現しています。

mask とは

SVGで描かれている内容のうち、指定した領域を透明にすることができます。領域は、<mask>で囲まれた内側で、通常のSVGと同じように描くことで指定することができます。白く塗り潰された領域は描画され、黒く塗り潰された領域は透明になります。
mask の適用先では mask="url(#{mask要素のid})" という形で適用するべきマスクを指定します。

詳細な説明は、こちら。
Clipping, Masking and Compositing – SVG 1.1 (Second Edition)

銀色の覆いをカスタマイズしてみる

クラッチの仕組みは、くじではなくプリペイドカードなどにおいても頻繁に用いられます。そのようなものの中には銀色の覆いに対して模様を描いていることもあります。
今回紹介したスクラッチくじでも、そのような模様を描くことが可能ですし、実は少し修正するだけで模様を登場させることが可能です。
f:id:t_motooka:20161127142717p:plain
ソースの中に path id="wave" と書かれた部分があると思います。この要素の stroke="none"stroke="#000000" に変えることで、3本の黒い波線を表示させることが可能です。この path はmask適用している <g> タグの内側に居ますので、削る操作をしたとき、銀色の覆いと一緒に削れていきます。

何故これを作ったのか?

今年の8月に、名古屋のWeb界隈の皆様の集まり「WCAN」主催のイベント「WCAN mini 2016 Vol.2 SVG Maniax in NAGOYA」に参加してきました。
wcan.jp
このときの参加レポート: 名古屋のSVGイベントに参加してきました - 職業プログラマの休日出勤

参加レポートには書いていませんが、この懇親会においてどなたかが「SVGでスクラッチくじとか作れたら面白そうだよね」という発言をされていました。このとき私は十分な量のお酒を頂いていたので誰の発言だったのかを思い出すことができないのですが、ここで私は「実装するぞ!」という宣言をしたことだけは覚えています。それから忙しい日々が過ぎる中で「早く SVGクラッチくじ を作りたい」という想いは募る一方でした。

このときの約束を果たすことができて、私は幸せです。

さいごに

紹介した SVGクラッチくじ はMITライセンスにて利用許諾しています。皆さんも、許諾の範囲内でこれを生かし、世界中の多くの人を楽しませるような くじ を作って下さい。
楽しみにしています!

医療情報サイト WELQ(ウェルク)への自分自身のアクセス記録を調べる

パソコン・インターネット

医療情報のキュレーションサイト「WELQ」(ウェルク)について、適切でない情報が多く掲載され、かつ強力なSEO施策が実行されていた結果として検索結果の上位に食い込んでいた、とされています。
本日飛び込んできたニュースの中に、当該サイト、および、運営会社であるDeNAが他に運用している多くのキュレーションサイトが閉鎖された、というものがありました。
掲載されていたコンテンツにどれほど適切でない情報が掲載されていたのか、今となっては調べるのも面倒臭いですが、医療にそれほど詳しくない我々がそれらのサイトの情報を知らないうちに見ていて、知らないうちに鵜呑みにしている可能性も十分に考えられます。
そのような情報が脳内に存在していたとしても直ちに自分が死ぬ訳ではありませんが、どれほど自分がアクセスしていたのか、知っておいて損することは無いでしょう。

自分が問題のあるサイトにどれほどアクセスしていたのかは、ブラウザの履歴を辿って行けばわかります。しかし、全てを人間の目でチェックすることは極めて困難です。ならば、機械的に調べてみようではありませんか。
この記事では、例として、MacFirefoxの履歴を調査する方法をご紹介します。

続きを読む

祝・はてなブログ5周年!(第一弾)

その他

お題に沿って記事を投稿することでキャンペーンに応募できるタイプのやつです。
第一弾の応募締め切りは11月6日だけども、7日から始まるはずの第二弾のお題が未発表のようなので第一弾のお題で応募。上手く拾われるかな??
とにかく、5周年おめでとうございます!


はてなブログ5周年ありがとうキャンペーンお題第1弾「はてなブロガーに5つの質問」

1.はてなブログを始めたきっかけは何ですか?

とあるイベントで、βリリースのときに「はてなブログできたよ」というお知らせを頂いたので。

2.ブログ名の由来を教えて!

一時期、休日出勤が多すぎて自宅で何も作れない時期が続いていて「これじゃいかん、何の技術も身につかない」と思い、ほんのわずかな土日技術調査の成果をブログに書き留めようと思いました。そのような経緯があって「休日出勤」という語を含めることにしました。

3.自分のブログで一番オススメの記事

一つ挙げろと言われても難しいものがありますが、これですかね。ウォーターフォール型開発を良いものにするためにはどうすれば良いか?と真面目に考察した記事です。
tmotooka.hatenablog.jp

4.はてなブログを書いていて良かったこと・気づいたこと

はてなダイアリー をそれなりの期間利用させて頂いていたこともあって、ずっと はてな記法 を使っていました。
最近は MarkDown 派の人も多いようですけども、自分にとっては便利だなー、使っててよかったなーと思ってます。

5.はてなブログに一言

今後ともよろしくお願いしますm(__)m


http://blog.hatena.ne.jp/-/campaign/hatenablog-5th-anniversary

PHP処理中にHTTPサーバ再起動

PHP

PHPに限らず、Webアプリケーションを動かしているとどこかのタイミングでHTTPサーバを再起動する必要に迫られることがあります。
そのタイミングで誰もアクセスしていないという保証があるのなら話は簡単なのですが、その保証があることは、以前は極めて稀でした。近年では再起動すべきタイミングにおいては稼働中のサーバを一旦ロードバランサーから切り離すことで新規の HTTP Request を受け付けないようにし、実行中の処理が全て捌けてから再起動するといった運用も行われます。とは言え、再起動したときにどのような現象が起きるのかを知っておくことは無駄ではありません。何故なら、1秒を争うような状況に追い込まれてしまったときはロードバランサーの操作をせずに再起動することも考えられるからです。他にも知っておくと幸せになれる場面はあるでしょう。

このあたりの挙動に関して、自分の知識がn年前の状態のまま更新されていないことに気付いたので、ちょっと実験することにしました。
HTTPサーバ経由で実行された PHP のプログラムが、HTTPサーバ再起動(やそれに近い操作)によってどのように取り扱われるのか。試してみましょう。

PHP の処理

次のようなものを用意しました。それぞれの処理が実行されている途中で、再起動(など)を実施します。

  • wait_with_sleeping.php : sleep関数で処理に時間がかかる場合
  • wait_consuming_cpu_resource.php : PHPの処理でCPU資源を食い潰している場合
  • wait_on_background.php : PHPのコードの中からバックグラウンドプロセスを立ち上げた場合

コードは GIST として公開しています。
PHPで時間のかかる処理を再現する。signalとか受け取ったときの挙動の確認。 · GitHub

検証環境

  • AWS EC2 t2.nano (512MB RAM) 2台(Apache検証用 と NGINX検証用)
  • Amazon Linux 2016.09
  • Apache の場合
    • sudo yum install php70PHP 7.0.11 と Apache 2.4.23 をインストール
    • sudo service httpd startApache 起動
  • NGINX の場合
    • sudo yum install php70PHP 7.0.11 と Apache 2.4.23 をインストール
    • sudo yum install php70-fpmPHP-FPM をインストール
    • sudo yum install nginx で NGINX 1.10.1 をインストール
    • sudo service php-fpm startPHP-FPM 起動
    • sudo service nginx start で NGINX 起動

検証結果

再起動方法 sleep CPU資源を食う処理 バックグラウンド
sudo service httpd restart 死ぬ 死ぬ 死ぬ
sudo service httpd reload 死ぬ 死ぬ 死ぬ
sudo service httpd graceful sleepが中断される きちんと待ってくれる 死なない
sudo service nginx restart 死ぬ 死ぬ 死なない
sudo service nginx reload きちんと待ってくれる きちんと待ってくれる 死なない

ちなみに、PHP 5.6 でも同様の結果が得られました。
標準で用意されているサービス取り扱いのコマンドの範囲では、NGINX の方がより直感的な運用ができるかもしれません。signalを受け取ったら sleep がinterruptされる挙動を期待するようなプログラムを書いているのであれば Apache の方が良いでしょう。もっとも、この特性以外の要因の方が、HTTPサーバを選択する上で重要である場面は多いでしょう。

そう言えば以前、Apacheで運用しているサービスで sudo service httpd reload を流したところバックグラウンドの処理が死んでしまってビビったことがあるのを思い出しました。今だから言える。

追記@2016.11.10

再起動方法 sleep CPU資源を食う処理 バックグラウンド
sudo service php-fpm reload 死ぬ 死ぬ 死なない
sudo service php-fpm restart 死ぬ 死ぬ 死なない

例えば php.ini とかを変更する際は php-fpm を再起動することになるでしょう。その結果はご覧の通りです。やっぱり Apache の方がええんかな…?

PDF Cheatsheet を作った

PDF

PDF Cheatsheet - www.tmotooka.com

自宅でも仕事でも、PDFは非常に頻繁に取り扱う。PDFファイルを画面に表示させたり印刷させたり、Word等のドキュメント作成アプリケーションから出力させることもある。だが、これだけではない。そのPDFがどのように作られているのか内容を確認しなければならないことがある。
PDFの中身を読むにあたっては、PDFのファイルフォーマットをある程度抑えておく必要がある。基本的な事項は、このブログでも散々紹介している「PDF構造解説」という名著にて学ぶことができる。

PDF構造解説

PDF構造解説

しかし残念ながら、これは全てではない。この本に書かれていないことも山ほどある。そのような内容を知りたくなったら、Adobe社の文書 にあたるのが良いだろう。
技術的キーワードであれば、上記のAdobe社のサイトからダウンロードできる PDFの仕様のPDF のファイル内を検索することで解説を読むことができる(ただし英語)。ところが、PDFのコンテントストリームの中に書かれている描画コマンドの数々は大抵、アルファベット1〜2文字で構成されていて検索するのは非常に難しい。
ならば、描画コマンドだけ、どのような意味のものなのかを簡潔にまとめたチートシートカンニングペーパー)があれば生活が楽になると思い、冒頭に掲げたチートシートを作った。

PDFを取り扱っている皆さんに、ぜひ活用して頂きたい。

パイプを通るPDF(実験中) 〜 #シェル芸 の新たなる境地へ

シェル パソコン・インターネット PDF


先日開催された「第25回 #シェル芸 勉強会」のLT(大阪編)でしゃべった内容を、ここで紹介します。

#大げさなタイトルですが、世の中は広いものです。先駆者はどこかにきっと居られることでしょう。

目標

標準入力や標準出力を受け渡しするための仕組み パイプ はテキストデータだけでなく、バイナリデータも流すことができます。
一般的なシェル芸においては当然ながら大半の用例が、テキストをパイプで流すというものですが、バイナリデータを流すときのノウハウも蓄えていきたいと思います。

空っぽのPDFを作る

これはImageMagickconvert コマンドで実現可能です。

$ convert xc:none -page A4 a.pdf

ImageMagickconvert は、画像ファイルを変換するコマンドです。基本的には、入力画像を与えて、変換処理の内容を与えて、出力先を指定して実行します。上記の例で言えば xc:none が入力で、-page A4 が変換処理の内容(出力形態)、a.pdf が出力先に相当します。
この xc:none は、空っぽの画像を表すようです。テキストデータに例えると /dev/null とも言えるかもしれません。

xc:none については、ここで知りました。
unix.stackexchange.com

空っぽのPDFを標準出力に吐く

convertの結果を標準出力に吐く方法を調べようとしましたが、ImageMagickは通常、出力先のファイル名の拡張子を見て出力フォーマットを決定しています。標準出力にそのまま吐こうとしてもPDFであることを強制できないのではないか?という疑問が湧きます。
この点についてググると、次のようなものがヒットしました。
forcing output file format on stdout - ImageMagick
出力先に jpeg:- と指定するとJPEGで標準出力に出すことができるそうです。ならば pdf:- によってPDFが標準出力に吐かれるはずだ!と推測して試したところ、無事に吐くことができました。

$ convert xc:none -page A4 pdf:- > a.pdf

ここではリダイレクトを使ってファイルを出力していますが、これでファイルが吐かれていれば標準出力からデータが出ていることの確認になります。PDFのファイルフォーマットに慣れ親しんだ方であれば、次のような検証も有効でしょう。

$ convert xc:none -page A4 pdf:- | head

標準入力から受け取ったPDFでゴニョゴニョ

次は、標準入力から受け取ったPDFの加工です。
よく使われるのは gsコマンドこと GhostScript ツールです。

入力元のオプションとして -_ を与えると標準入力から受け取ってくれるという情報がありますが、まだ検証中です。
ここから先は実験中なので、また成果がまとまり次第報告したいと思います。正直なところ、現時点では上手く行ってません。
お楽しみに!

感想(追記@2016/10/30 15:53頃 JST

実験に使った環境

書籍紹介コーナー

この本を読めば、$ cat hoge.pdf とかしちゃっても戸惑うことは減るはずです。

PDF構造解説

PDF構造解説

こちらの記事でも紹介してます => さぁ、PDF手書きの世界へ。 - 職業プログラマの休日出勤

第25回 #シェル芸 勉強会に参加してきました

パソコン・インターネット シェル

タイトルの通りです。今回も大阪サテライトに参加しました。

本家
usptomo.doorkeeper.jp

大阪サテライト
atnd.org

Togetterまとめ
togetter.com
あ、一番最初に掲載されている。

問題 【問題のみ】第25回もう4年もやってんのかシェル芸勉強会 – 上田ブログ
問題+解答例 【問題と解答】第25回もう4年もやってんのかシェル芸勉強会 – 上田ブログ

この日の自分の tweet T.Motooka(@t_motooka)/2016年10月29日 - Twilog
シェル芸とは無関係の発言も含んでいるとは言え、171tweetsもしており、不健全な感じがします。(前回は149tweets)

続きを読む

関西モバイルアプリ研究会 #関モバ 第19回 に参加

iOS(iPhone/iPad) 携帯・デジカメ

関西モバイルアプリ研究会(通称 関モバ)の第19回に参加してきました。

kanmoba.connpass.com

会場

今回の会場は、このブログなどでもお世話になっている 株式会社はてな さんの京都オフィス!
本当によくお世話になってます。
はてな記法 にも、結構長いことお世話になっています。このブログ「職業プログラマの休日出勤」も はてな記法 で書いています。

自分で発表した内容

某所において先日、サーバ復旧したと思ったらすぐに再び落ちたという事象を目の当たりにしたことから、この話をしようと思いました。
そのサーバはモバイルアプリのバックエンドではないですし、「再び落ちた」原因もアクセス集中ではなかったのですが、やはりモバイルアプリの世界では多いのはこのスライドの中で紹介しているパターンだろうなーと思っています。

終盤の まとめ のページに掲載している言葉「サーバ管理者に優しい言葉をかけ続けると綺麗なAPI設計が返ってくる」は完全にネタですが、そこまで外していないような気もします。
あと、「札束」が強力な武器であることは誰もが理解しているはずなのですが、企業の会議室の中においては無かったことにされるケースもよく耳にしますので、敢えて言及しました。

対策の例として Exponential Backoff を紹介しましたが、このような考え方が素晴らしいモバイルアプリ開発につながっていったら、非常に嬉しいです。

さいごに

はてなの皆さん、運営の皆さん、参加者の皆さんに感謝!

v6喋る串

パソコン・インターネット

「これからはIPv6の時代だ!」そんなふうに考えていた時期が筆者にもありました。確か2005年頃の話だったかと思います。

それから10数年の時が流れ、世の中は未だにIPv4だらけです。人生の進捗もダメなままです。
そんな折、某所でIPv6の需要が急激に高まってきたので、久し振りにIPv6と戯れてみました。

今回のお題は「v6喋る串」、平たく言えば「IPv4だけ喋るクライアントからの HTTP Request を、IPv6な HTTP Server へ送るプロクシ」です。こんなものの需要はほとんど無いでしょうけれども、手元の環境はIPv4の回線しか無いけどIPv6での接続確認も取りたい!という検証用には非常に有用でしょう。

IPv6 アドレスを容易に獲得できるインフラ

AWSでのIPv6サポートは(本記事執筆時点では)限定的なものであり、EC2のサーバに直接IPv6アドレスを割り付けることはできないようです。今回の検証にはAWSを使うことはできません。
AWSに匹敵するほど我々に身近なサーバ屋さんの中でIPv6対応を謳っているのは、さくらインターネットさんの「さくらのVPS」と「さくらのクラウド」です。今回はこれらのお世話になりつつ実験を進めたいと思います。

この記事では さくらのVPSさくらのクラウド の両方を使っていますが、おそらく片方だけを2環境用意するという方法でも上手く行くでしょう。
「どちらを使ったら良いの?」という方には、ただ単に実験するだけなら さくらのクラウド の方がオススメです。長期的に使い続けて、かつ、負荷の程度が見えている状況なら さくらのVPS の方が良いでしょう。クラウドの方はクレカ必須であるように見えるので、持っていないという方はご注意を。さくらのクラウド の場合は後述の「ルーター+スイッチ」が最低でも3500円程度/月・1ネットワーク、VPSの場合は初期費用が1600円程度/月・1台 かかるので、いずれにせよ実験するために5000円くらい使うことになります。

筆者が用意した環境

IPv4 / IPv6 両方喋る HTTP Server : Debian

Apacheのセットアップ

たぶん sudo apt-get install apache2 とかやれば、Apacheは入るでしょう。
とりあえず、インストールした後にアクセスして、テスト用ページが表示されることと、アクセスログが吐かれることを確認しましょう。アクセスログは、後でIPv6のアクセスを受け付けるようになったときに、接続確認にも使います。今はIPv4でのアクセスログが吐かれていることでしょう。

eth0 で IPv6 を有効に

さくらのVPS のコンパネにアクセスすると、

を教えてくれるので、その情報を /etc/network/interfaces に書き込み、サーバ再起動します(恐らく、ネットワーク関係のサービスだけ再起動しても有効なはずだけど、調べるのが面倒臭くてサーバ再起動してましたw)。
詳しい書き方や動作検証の方法などは、こんな解説もあるので参考にしましょう。

さくらVPS で IPv6 アドレスを Debian 7 wheezy に設定する – ymyzk’s blog

ip6tables

基本的な考え方は通常のIPv4での iptables と同じです。ですが、IPv4 で効いていた設定が効かなかったり、指定したらエラーを吐いて設定を食ってくれないということが非常に多くありました。今回の検証の中で、筆者が最も時間を費やしてしまったのはこの部分です。
最終的にはこんな設定を /etc/iptables/rules.v6 に書き込みましたが、まだザルだらけなので改善の余地は大いにあります。

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:LOG_PINGDEATH - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A INPUT -j DROP
-A FORWARD -m limit --limit 1/sec -j LOG --log-prefix "[IPTABLES6 FORWARD] : "
-A FORWARD -j DROP
-A OUTPUT -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
-A OUTPUT -p udp -m multiport --sports 135,137,138,139,445 -j DROP
COMMIT

どうも -m のオプションが機能していないような感覚がありますが、裏づけまでは取れていません。

こうやって書いた設定を有効にするにはroot権限で netfilter-persistent reload を実行していました(Debianです)。実行後、反映されるまでには数秒〜10秒程度の遅延がありました。

DNS設定

構築したHTTPサーバはIPv4アドレスとIPv6アドレスの両方がありますので、両方ともドメインのAレコード、AAAAレコードとしてDNSサーバに設定しましょう。


これで、IPv4 / IPv6 の両方で接続を受け付ける HTTP Server が完成したはずです。
以下の串の動作確認を効率的に行うべく、アクセスログを監視しておきましょう。tail -fなどで。

さて、さくらのクラウドのお世話になりながら、串をセットアップしていきましょう。冒頭に記載しました通り、Ubuntu 16.04 を使っています。

さくらのクラウドIPv6を使うためのテクニック

実は、さくらのクラウドで立てるサーバを単体で使っても、IPv6アドレスを獲得することはできません。
ルーター+スイッチ」を設置し、そこでIPv6を有効にし、その状態でサーバを新設してルーター+スイッチに接続させる必要があります。

このとき、サーバを共有セグメントで立ち上げた後でルーター+スイッチに接続しようとすると、IP(v4, v6)アドレスがDHCP的な仕組みではなくて静的にOS内に設定されていることから、後でそれを書き換えるための手間が増えます。サーバ起動よりも先にルーター+スイッチを用意しておくことで、少なくともIPv4アドレスについては何もしなくて良くなります。

IPv6を有効にするには、/etc/network/interfaces に以下の内容を追記し、サーバ再起動します(これも恐らく、ネットワーク関連のサービスの再起動だけでも行けるはず)。

iface eth0 inet6 static
address 2401:2500:***(ヒミツ)***
netmask 64
gateway fe80::1

ここで address の値は、ルーター+スイッチの詳細情報「IPv6割当可能範囲」を参考にして、他のサーバと衝突しないように自分で勝手に付けます。

Squid の設定

root権限で apt-get install squid みたいなコマンドを打てば、squid をインストールすることができます。
設定ファイルは /etc/squid/squid.conf に置いてあるので、バックアップを取った上で編集し、

acl theowner src ${自分のIPv4アドレス}/32
http_access allow theowner

という設定を先頭の方に差し込みましょう。設定ファイルの下の方に http_access deny all という一節がありますが、恐らくここよりも上に書いていれば良いのでしょう(下に書くことを検証してはいません)。best-practiceとしては、別のファイルに設定を書いておき、それをincludeして使う形が望ましいですが、ちょっと検証するだけのサーバならどうでもいいでしょう。

ip6tables

前述の、Debianで設定した時と考え方は同じです。
(ですが、筆者はここで 座流・咳百合亭 という大技を繰り出しましたとさ…orz)
長期的に設置したり、大事な情報を置いたりすることになるサーバなら、きちんと設定しましょう。v4に関しては さくらのクラウド のパケットフィルタ機能で制御できるようです。

Outgoing の IPv4 を殺す

恐らく、ここまでの手順を踏むだけで HTTP Proxy サーバとしては十分に機能するはずです。
お手元のブラウザまたはOSのプロクシ設定を、ここで建てた串に向けます。
(※squidのデフォルトポートは 3128 です)
この状態で、冒頭で建てたHTTPサーバへアクセスすると、きちんと IPv6 でのアクセスが記録されます。良かったですね!

実は、squid がプロクシとして動作するとき、IPv6IPv4の両方で HTTP Server にアクセスできるのならば、IPv6 を優先して使うという挙動を取ります。
[squid-users] Outgoing IPv6 address with no IPv4 address accessSquidメーリングリストに、2015年に投稿されている情報)
IPv6で HTTP Server に接続することが目的なら、この挙動を信じて、これ以上作業をする必要はありません。
もしも「IPv6でなければエラーにしたい」のであれば、iptablesをいじって、串からの outgoing の HTTP(S) のパケットを破棄すれば良いでしょう。iptablesの設定で「DROP」だとやたら待たされるでしょうから「REJECT」が良いでしょう。

参考図書

マスタリングTCP/IP IPv6編 第2版

マスタリングTCP/IP IPv6編 第2版

IPv6 エッセンシャルズ 第2版

IPv6 エッセンシャルズ 第2版

IPv6教科書 (インプレス標準教科書シリーズ)

IPv6教科書 (インプレス標準教科書シリーズ)

IPv6の本って、ちょっと古いのが多い気がしますが、理論を学ぶ上ではそれほど問題は無いでしょう。

さいごに

この記事の内容を応用すれば「IPv4しか喋れない HTTP Server に、IPv6しか喋れないクライアントからのリクエストを連携してあげるリバースプロクシ」も作ることができるでしょう。お試しあれ。
これから来るかもしれない IPv6 の時代、一足お先に慣れておき、数年後に楽をしようではありませんか。

麻疹風疹(MR)混合ワクチンの接種

その他

8月に麻疹(はしか)日本国内発生のニュースが流れてきて、その後も発症例が増加しているという話を受けて、麻疹・風疹混合ワクチン(MRワクチン)の接種を受けてきた。



ワクチン接種を受ける意義

何故受けた方が良いか?について筆者が適当に語るコーナー。


基本的にはこういう思考である。

世代的な話

1977年4月2日~1990年4月1日に生まれた世代は1回接種法であり、キャッチアップキャンペーン非対象だった。免疫がついていない可能性が高く、最も感染の危険が高い年代。

https://ja.wikipedia.org/wiki/%E9%BA%BB%E7%96%B9#.E4.BA.88.E9.98.B2

ヤバそうである。

事業継続計画(BCP

筆者の勤め先においても 1977年度〜1989年度生まれ の人は非常に多く、麻疹の大規模な流行があれば従業員の健康のみでなく、事業継続そのものが脅かされることも考えられる。


リモートワークが整備されていたとしても、潜伏期間が長い、かつ、潜伏期間でも感染力のある伝染病 という存在には弱い、という話はおそらく正しい。だけど整備されていないよりは整備されている方が良いに決まっている。伝染病への合理的な対策というのは打っておくに越したことはない。

筆者の業務の一つであるサーバ管理、こういう仕事は、誰か一人以上の人間が活動できる状態であることが強く求められる。そんな中でサーバ管理者全員が麻疹で倒れたりしたら、鯖缶本人やその家族たちだけでなく事業も傾く。怖い話だ。



ワクチン接種を受けるための活動

冒頭に掲げたtweetをした9月1日より、接種についての情報を集め始めた。しかし、接種の情報の多くは子供達(の保護者)に向けたものであり、成人が接種を受けることを主目的にした情報はほとんど手に入らなかった。接種実施の病院の一覧も、簡単には手に入らないようである(筆者は結局入手することができなかった)。

やっぱり接種を受けるのは無理なのだろうか?と思いながら、数年前に一度お世話になった内科の先生のWebサイトを見てみると、そこにはMRワクチン接種をやっていることが明記されていたため、電話で問合せた。予約も予想外にすんなりと取ることができた(9月5日時点)。
電話で喋った感じだと、医院では通常は在庫を持たず、予約を受けてから業者さんから仕入れるような感じだった。電話問い合わせから接種までの間には数営業日を空ける必要があった。

そして予約していた日に病院に行くと…、なんと接種を見送りされてしまった。理由は筆者自身の風邪。自分では大丈夫なつもりだったが、先生の判断だから仕方がない。
通常の手当てを受けてから数日が経過した今日、無事に接種を受けることができた。費用は1万円とちょっとくらいだった。

これから受ける皆さんへ

筆者が接種を受けた病院の先生曰く

  • 卸売りの業者さんのところにも、そんなに在庫は残ってないし、入ってこないようである
  • ワクチンは病原体を培養して製造されるという性質から、いきなり増産できるようなものではない
  • 病院への問い合わせは増えてきている

という話だったので、今年中の接種は難しいかもしれない。健闘を祈る。

CloudWatch Logs のログを華麗に読む CWLReader を公開

AWS パソコン・インターネット

CWLReader という小さなソフトウェアを公開しました。

github.com

解決しようとした課題

AWS でいろいろ運用している皆さんの多くは、各種ログを CloudWatch Logs へ溜め込んでいることでしょう。
ログの内容に不審な点があれば通知を投げるといった仕組みも一緒に設けられていることが多いと思いますが、特に立ち上げ間もないシステムの場合は、人力で全てのエラーログに目を通すことは重要です。何故なら、どういったログがどのように出ていれば通知を投げれば良いのかという知見が蓄積されていないからです。

そこでログを見る訳ですが、公式の CloudWatch Logs のツールだと、「どこまで読んだ」という情報が管理されないため、全てのログを漏れなく見るためには、自分でその情報を管理する必要があります。

CWLReader の特徴

  • ログを見る権限だけの IAM ユーザを用意し、そのキーを使ってログを取得できる
  • IAM ユーザのキーは、ブラウザの LocalStorage で管理される
  • 「どこまで読んだ」の情報は、LogGroup ごとに、これも LocalStorage で管理される
  • ログの続きを読もうとするとき、前回の「どこまで読んだ」の情報に基づいて続きからロードできる
  • ファイル1個で稼働する
    • file:// で読ませることも可能だけど、これは LocalStorage の内容を他のスクリプトに読まれる危険性があるのでオススメはできない

さいごに

何かお気付きの点などございましたら、issue を上げて頂きますと嬉しいです。
英語書くのしんどいよ〜という方は、Twitterで連絡下さい(ブロックしてたらゴメンなさい)。

第24回 #シェル芸 勉強会に参加してきました

パソコン・インターネット シェル

タイトルの通りです。今回も大阪サテライトに参加しました。

本家
usptomo.doorkeeper.jp

大阪サテライト
atnd.org

Togetterまとめ
togetter.com

問題 【問題のみ】第24回◯◯o◯裏番組シェル芸勉強会 – 上田ブログ
問題+解答例 【問題と解答】第24回◯◯o◯裏番組シェル芸勉強会 – 上田ブログ

この日の自分の tweet T.Motooka(@t_motooka)/2016年08月27日 - Twilog
シェル芸とは無関係の発言も含んでいるとは言え、149tweetsもしており、不健全な感じがします。

続きを読む

多言語・翻訳ナイトに参加してきました

えいご その他

多言語・翻訳ナイト Vol.3 に参加してきました。

polyglots.doorkeeper.jp

どうやって勉強会の存在を知ったのか

近畿地区の勉強会情報を収集して配信してくれているbot @atnd_kinki の配信で知りました。

自分と多言語

過去には日英韓の3ヶ国語対応のWebアプリを開発・運営していました。韓国語は翻訳者のご協力を頂きながらの対応でしたが。
現在でも日英2言語対応しているアプリは自分で翻訳して実装、運営までやっています。
本格的に多言語対応をやっておられる方からみればヒヨっ子みたいなもんですが、多言語対応には関係がありますし、興味もあります。

多言語関連で自分が最近興味を持っていたのは、こんな話題です。

  • 自分が知らない言語への翻訳の運用ノウハウ(翻訳者さんへ翻訳を依頼するためのノウハウ)
  • コンテンツ(ブログ記事など)の翻訳を実施した際の、コンテンツ管理ノウハウ

こういう話も聞けたらいいなー、と考えながら参加しました。もちろん聞くことができてますし、それ以上の知見が得られました。

お聞きした話(抜粋)

  • 行政が出す文書の翻訳の難しさ
    • 更新が滞る問題
    • 偉い人たちが自動翻訳で満足してしまう問題
    • 災害などの緊急情報の伝達の難しさ
    • 2020年のオリンピックに向けた課題
  • ビジネス向けのオンライン翻訳サービス YarakuZen の話
    • 訳語の統一に気を使いながら翻訳をするときに、とても便利そう
  • 翻訳業務のクラウドソーシング Conyac の話
    • チームを組んでもらって大人数で翻訳みたいなことも可能らしい。すごい。
  • WordPress の多言語化用プラグイン Bogo の話
    • RDBのデータ管理に関する話も飛び出してきて、かなり興味深い話だった。
  • ロケール/言語と国旗の問題
  • 日本語の難しさ:統計的アプローチが取りづらい

さいごに

主催の多言語団の皆様、参加された皆様、会場の JUSO Coworking さん、ありがとうございました!

おまけ:ぼやき

「 n ヶ国語」(n>=2)という日本語の表現からは、1言語1カ国みたいな過去の認識が垣間見えますね。
実際には1つの言語が複数の国で使われていたり(例:英語)、1つの国で複数の言語が公用語になっていたり(例:スイス)するので、あまり現実に沿った表現ではないという気がします。
言葉狩り(他の方が書かれている文章に文句をつけること)をするつもりはありませんが、自分が書く文章からは無くしていこうかな、ともうっすら考えたりしてます。この記事では使っていますが。

おまけ:ネタ

日中韓をはじめ、世界中で見つかる間違い英語を投稿して共有するためのサイトがあります。
www.engrish.com
かなり笑える内容なのですが、自分が作ったものが載ると思うと、なかなかつらいものがあります。
世界へ笑いを提供できるのなら、まあそれも一興ですが。

ひとまずは、載らないように 頑張ろう! #一句

名古屋のSVGイベントに参加してきました

SVG デザイン

名古屋の Web 界隈の集まりである WCAN(ダブキャン と読むそうです)主催のイベント、WCAN mini 2016 Vol.2 SVG Maniax in NAGOYA に参加してきました。

wcan.jp

これまで、SVGのオンラインのイベントには何度か参加していました。

ですが、オフラインでのイベントは非常に珍しいものです。新幹線に乗ってでも名古屋へ行く価値はありました。

得られた知見の数々

Togetterにまとまっているので、こちらを見られるのが良いでしょう。
togetter.com

自分で喋った内容

こんな内容で喋りました。

speakerdeck.com

このとき、デモで使った花火のSVGのソースは、こちらです。

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 400 400">
	<rect fill="#000000" x="0" y="0" width="400" height="400"/>
	<defs>
		<g id="particle1">
			<rect x="196" y="90" width="8" height="20" fill="#c06090"/>
			<rect x="196" y="60" width="8" height="20" fill="#ff9030"/>
		</g>
		<g id="group1">
			<use xlink:href="#particle1" transform="rotate(0 200 200)"/>
			<use xlink:href="#particle1" transform="rotate(10 200 200)"/>
			<use xlink:href="#particle1" transform="rotate(20 200 200)"/>
			<use xlink:href="#particle1" transform="rotate(30 200 200)"/>
			<use xlink:href="#particle1" transform="rotate(40 200 200)"/>
			<use xlink:href="#particle1" transform="rotate(50 200 200)"/>
			<use xlink:href="#particle1" transform="rotate(60 200 200)"/>
			<use xlink:href="#particle1" transform="rotate(70 200 200)"/>
			<use xlink:href="#particle1" transform="rotate(80 200 200)"/>
		</g>
	</defs>
	<g>
		<use xlink:href="#group1" transform="rotate(0 200 200)"/>
		<use xlink:href="#group1" transform="rotate(90 200 200)"/>
		<use xlink:href="#group1" transform="rotate(180 200 200)"/>
		<use xlink:href="#group1" transform="rotate(270 200 200)"/>
	</g>
</svg>

このソースを拡張子 .svg で保存し、Webブラウザに読み込ませると、スライド中に登場する花火のイラストが表示されるはずです。
(スライド中に登場する画像は blur などのフィルタをかけていますが、下のソースでは省略しています。)
この画像は、時計の12時の部分にいる破片を時計回りに90度分だけコピーし、その90度の扇型のものを4つ並べて円形にしています。

ここで、保存したSVGのソースの <g id="particle1"> の子要素をいじくると、花火全体の見栄えが変わると思います。たった1箇所を変えるだけで全体が変わるのです!
みなさんもぜひ <use> 要素を活用していって下さい。

もちろん、SVG そのものも楽しく使っていきましょう!

さいごに

運営してくださっているWCANの皆様、セッションやLTで講演された皆様、そして当日参加された皆様、ありがとうございました!

参考図書

SVG Essentials

SVG Essentials

※英語です