さっそくバグが見つかる

昔から使われている、Webサーバー上に Perl で作られた申請の仕組みで、先日修正した際に見逃していたバグを発見しました。

データをファイルに書き込む際、何もチェックしていなかったので、危ないな、とは思っていたのですが、やはり誤動作の元でした。

このWebの仕組み、手抜きもいいところだったので、一つ前の画面に戻ると、何度も申請できてしまいます。午前中に申請したのにそれを忘れて、そのままにしていた画面から、午後に同じ申請をすると、申請できてしまう仕様でした。

先日、同じ申請の場合は、登録しないように改造したばかりでしたが、日付が変わると二重にはならず、別のデータとして登録されてしまうバグが残っていました。

この仕組み、申請できる時間が決まっていて、休日はもちろん申請できません。
ログイン時にその辺をチェックしてて、はじくようにしてあるのですが、画面を残しておくことは想定していません。クッキーでログインしてからの時間制限とか付ければ問題ないのでしょうが、当然そういう作りにはなっていません。
正直言うと、perl でクッキーを実装する方法が解らず、あきらめました。
(PHP なら簡単なんですがね…)

締め切り時間を過ぎてから申請されると手続き上混乱の元だし、休日は対応できる職員がいないので、申請されても困ります。今回、データを登録する際に、その辺をチェックして登録しないではじくようにしました。

申請データをチェックする仕様を考えたときに、システムの想定外の行動をされたら、不許可にする発想ができなかったのは残念です。システムがどう使われるか、に基づく条件分岐は検討したのですが、発想の転換ができませんでした。

私は、以前からこういうのが苦手なんですよね。ゲームとかやっていても、作戦が素直すぎとか言われたこともありました。まあ、早めに気付けてよかったかもしれません。

ブログサーバーの空き容量

先週、ブログサーバーの容量不足の話を予算を持つ部門にしてもらったところ、実は、削除してもいいブログがある、という話が。

その部門の担当者が言ってきたブログは、いい感じのサイズ。かなり楽になります。しかし、もっと大きく使っているのブログもあるので、こっちを整理できないかと逆提案したところ、そこは使ってないはず、との返事。

確かに、そのページを開くと何もありませんでした。
画像データがごっそり残っているのに、表面だけ整理してたみたいです。すぐにファイルを消したいので、今あるデータを何かに保存してほしいと、連絡してもらいました。
今は更新していないとはいえ、活動の記録ですから無くすのはもったいないのではと思うのですが。担当者がいなくなると、何が重要だか判断できないので、まとめて削除して終わりかもしれません。

他にも、これ今使っているの?と思えるブログがたくさんあるのですが、今日話しした2つのブログの画像データが無くなればかなりディスクに空きができるので、来年の3月までは持ちそうです。
来年の3月には、今のサーバーOSのサポートが切れるので、なんとか更新はしてほしいという話もさせてもらいました。

サーバーの更新は私が担当できそうです。ということは、そこまでは派遣で働けるかな、

カードゲームって、プログラミングなんじゃない

今日、Maincraft が小学生向けのプログラム学習ツールとして脚光を浴びている、というニュースを見て、ふと、思いついたことがある。

 

「カードゲームって、プログラミングなんじゃない」

 

Maincraft のプログラムは、子供達が普通に遊んでいる動作を、自動で繰り返しやれるようにする仕組みを組み込んだりすることらしい。さらに、テキストエディタを起動して、プログラムする機能もあるらしい。
そこまで小学生がやるかはちょっと考え物だが、実は以前NHK教育でやっていた「ピタゴラマシーン」は、立派なプログラムだな、と思ったことがある。

 

あんな感じで、スイッチを押すと、思い通りに自動で動いてくれる、のがいいと思っていました。それが、パソコンの中で手軽にいろいろ試せるのは、いい経験なるのかもしれません。

そういえば「ピタゴラマシーン」みたいな動作で思いついたのが、カードゲームのコンボ技。手札や自分のフィールドに必要なカードをうまく揃えて、キーになるカードをキャストすると、スイッチON。「ピタゴラマシーン」をころがるボールみたいな感じカードの能力が発動し、最後に必殺技が決まる。

 

そのために、材料となるカードをそろえることから始まって、どの順序でカードをキャストしていくかを考えなければならない。さらに、相手が妨害した場合の対処カードも仕込んでおく必要がある。デッキにしたら1人で使ってみて、動きを確認するのも重要だし。

これって、プログラムミングなんじゃないかな。

 

似たような記事がないかネットで探したところ、オブジェクト指向はカードゲームに似ている、と感じている人がいました。それも、賛成です。

Webサーバーへの不正アクセス

祝日明けの木曜日、システムのログに怪しい記録がありました。
毎日、定期的にEメールで送られるログの内容では、こんなの。

Connection attempts using mod_proxy:
111.248.118.154 -> 163mx01.mxmail.netease.com:25: 1 Time(s)

さっそく、httpd をチェックしたら、これっぽいのがありました。

xxxxxxxxxx-access_log:111.248.118.154 – – [23/Nov/2016:10:03:44 +0900] “CONNECT

163mx01.mxmail.netease.com:25 HTTP/1.0” 404 21593 “-” “-”

http の「CONNECT」という接続があるとは知りませんでした。
さっそくネットで調べると、典型的な踏み台攻撃のようです。

まず、Webサーバーへの接続で「CONNECT」は、ssh でプロキシー接続する際に
使われる通信だそうです。httpd の mod_proxy.so モジュールが使われます。
何も考えずに、 httpd.conf でこの機能を有効にしておくと、踏み台にされてしまうそうです。
特に、今回のような25番ポートへのアクセスは間違いなく攻撃です。

幸い、今回攻撃対象になったサーバーでは、プロキシーは無効になっていました。
そのため、CONNECT への接続に対して、「HTTP/1.0 404」(Not found) を発行しています。

今回は、穴を探しに来ただけで、これであきらめてくれたようです。
発信元は台湾みたいですが、ただの踏み台かもしれません。

pak86_smonitatocode20140517_tp_v

ブログのバックアップ

派遣先で管理しているブログサーバー、ここ数ヶ月くらい容量不足を訴えているのですが、ここにきてついに100%に達したようで、blogmaster 宛てにエラーメールが届いていました。

しかし、内容をよく確認したところ、プラグインで入れているバックアップツール「BackWpUp」からのものでした。
学内の講師や学生が不定期に綴っているブログで、バックアップ用のプラグインを入れている人がいるんだ、とちょっと期待したのですが、出所は業者に管理を依頼しているサイトでした。

このブログのサーバーは、公式サイトに載せてない大学の活動を紹介するページも公開しています。そして、こういうオフィシャルなサイトでは、管理を業者に委託しており、他のブログに比べると格段に見やすいページになっています。
業者の方は、何を考えていたかわかりませんが、一般のブログと同じように、定期的にローカルパーティションにバックアップを作っていました。週1回、3ケ月分だったのでしょう、圧縮されているとはいえかなり大きなサイズのファイルが容量を圧迫していました。

これって、どうなんでしょうね。
いつ誰が更新するか解らないブログのバックアップなら、デイリーで差分、週1でフルくらい
がいいだろうと思いますが。不適に誰かが追加するブログで、週1のフルバックアップのみ、というのは最新の多くの記事を失いかねません。

実は、管理を依頼されたこのブログサーバーですが、昔ながらの1日1回のフルバックアップ
のみ。いわいるミラーリングですね。ただし、ネットワークを経由して別のサーバーに取って
います。バックアップ先も容量が小さいので、贅沢は言えません。
ただし、これは毎日誰か不特定の人が更新するブログサーバーでの話。

WordPress を利用した固定ページのサイトだったら、アップしたデータを別のホストなどにセーブしておくもののような気がするのですが。本番ホストがダウンしたら、そのデータを予備サーバーにアップして公開すればいいだけなんだし。
さらに更新のタイミングは自分で管理できるのだから、公開データを本番環境にアップしたら、何かメディアに焼くか指定されたバックアップエリアに置けばなんとかなるはず。WordPressが壊れないかなどは、テスト環境で確認できるし、むしろサーバーがダウンした場合に対応できる準備をしてあげるべきでは。なので、本番環境を自動バックアップするなんて、無駄なことだと思うのだが。

うちの部署で契約した業者ではないので、契約内容が解らないからなんとも言えないが、趣味の延長でやってます、みたいな感じがしてしまった。

このバックアップを止めてもらうと、かなり容量に余裕がでます。
さらに言うと、毎週バックアップしてたファイルも、バックアップサーバーに転送されていたので二重にバックアップされてました。バックアップサーバー側も余裕を作れる予定。

契約した部門がちゃんと相談してくれれば、きっとうまくやれたのに。全て業者任せで、何か
あったらよろしくお願いします、みたいな姿勢だからこんなことが起きるんでしょうね。

パソコンの問い合わせ

パソコンについての問い合わせがあったので、そのメモ。

最初は、インターネットに繋がらない、というものでした。

よくよく話を聞くと、インターネットエクスプローラーが動作しない、というものようです。メッセージが出ていたので、確認するとOSのアップデートが動作していました。時間を置くと、IE でも Edge でもインターネットのページが開きます。どうも今頃、Windows10のアニバーサリーアップデートが動作しているようです。

「今年買ったばかりのパソコンなのに、なんだこれは」

と言われてもね。Microsoft の仕様ですから、と答えるしかありません。
裏でOSのアップデートががんがん動いていると、最新のパソコンでもかなり遅くなるようです。故障ではないし、アップデートは止められないし。

3時間くらい貸してもらえれば、復旧できると提案したのですが、今は忙しいからそんなに空けられない、とのこと。軽いアプリを使ってください、と言って放置するしかありませんでした。

PS.
その後、同じ人から日本語入力ができない、とのクレームが。
たぶん、アップデートがらみと思うのですが、仮名漢字変換システムが止まってました。

対処方法がわからずに、あちこち余計に調べることに。最後は、コンタナさんに「IME」で問い合わせして、関係する記事のリンクを教えてもらいました。
どうも、OSの更新時に仮名漢字変換が消える現象は、珍しいことではないらしく、ネットには似たような記事がたくさんあります。こういう時は、コマンドラインから ctfmon.exe を実行すればいいそうです。

今回はこれで、仮名漢字変換が復活しました。
とりあえず、よかった。

Perlってこんな書き方もできたのか

ここ何日か、Perl のプログラムを修正しているのですが、つくずく思うことがあります。

 

「Perl ってこんな書き方もできたのか」

 

昔やったころは、awk から移行したこともあり、Cっぽく書いていました。
意外と簡単に書けたという記憶があります。
当時はインターネットはまだまだ普及期で、もっぱら本をたよりに書いてました。
しかし、今はネットにサンプルコードがあふれてます。
しかも、昔は使わなかったオブジェクト指向な書き方を解説したサイトもたくさんあります。

 

今、そういったサイトで調べて書き直しているのですが、なぜ、こういう書き方ができるか
理解できないものがたくさんあります。
さらに、修正対象のコードも、私にしたらかなり癖のあるプログラム。この書き方でよく
動いてたな、と驚かされます。

 

以前から、こりに凝った Perl のソースは、判読する自信がありませんでした。その理由の1つを、パッケージによるもの、と思っていたのですが、今思うとそうではなく自由な書き方ができることが大きいように思えてきました。

 

さらに、C言語をはじめ、PHPなどでも普通にできていたことが、実は苦手だったということも最近知りました。関数で、引数に配列を指定すると、すごい面倒ですね。さらに、2次元の配列も、正直、私のスキルでは扱えそうにありません。

 

PHP ならこう書くんだけどな、と思いつつ、今のスキルで書けるコードに修正を試みています。
でも、問題は読みやすさですね。

 

今直そうとしているのは昔かかれた perl のシステムなので、全ての変数がグローバル変数。しかも、ファイルがいくつも別れており、その時の気分でテンポラリの変数の名前を付けたようで、「この変数は何?」というのがたくさんあります。ソースだけでなく動作からも類推して直している状況で、時間がかかってしょうがない。

 

今ごろになって perl を学ぶことになるとは。こんな仕事を長くやっているといろいろあるということでしょう。

サーバーに対する攻撃

今管理しているブログサーバー。HDDの容量がいっぱいになっており、かなり危ない状況。そのため、毎週、HDDの容量を確認しています。いっしょにWebサーバーのログファイルも見ているのですが、攻撃の跡を発見しました。

アクセスしたきたのは、IPアドレスを見る限りアメリカからだと思われます。さらに、ログから、使われたツールが「OpenVAS」と解りました。これは、オープンソースで有名な、脆弱性診断ツールです。

内部で実行するならまだしも、インターネット上で使うとなると国内なら不正アクセス禁止法に抵触する行為ですね。もし脆弱性を見つけたら、そこを突いて乗っ取り、踏み台にするつもりだったのでしょう。

ツールを使っているので、短時間に多くのログが出ていました。いずれもアクセスに失敗したというメッセージでしたが、無事だったのかかなり心配になります。集中してアクセスがあった後は、このIPアドレスからのアクセスが無いので、きっと無事だったのでしょう。「簡単に破れる穴が無い」と判断して、あっさりあきらめてくれたのかもしれません。

どこからうちのアドレスを知ったか解りませんが、迷惑な話です。
(ログがどっと増えて HDDがいっぱいになり、それが原因でOSが止まったら、どうしてくれるんだ!)

Perl のオブジェクト指向を学習中

私は、オブジェクト指向な書き方を覚えたのは、社会人になってからかなり経っていた。最初に知ったのは C++ だが、オブジェクト指向な書き方は、全く理解できなかった。当時は、Cや awk での簡単なプログラムを Perl に移そうとしていたころだったと思う。

その後、親会社からもらってきたキットの中に ruby のスクリプトが入っていたので、それをメンテする必要から勉強し、オブジェクト指向を学んだ。それ基に ruby をはじめ、 javascript や PHP にも使って簡単スクリプトを書いてきた。

PHP や ruby を使うようになって Perl は使わなくなったので、Perl のオブジェクト指向な書き方は、今、改めて勉強している。派遣先の今見ているシステムが Perl で書かれているため。

Perl をはじめとするスクリプト言語で、変数のスコープを気にするようになったのは、世の中で java が流行っていたころだと思う。それ以前からCのプログラムでは、関数内で使う変数を定義するのが当たり前で、昔の BASIC のような変数の使われ方は、嫌いだった。まあ、20行から30行程度のスクリプトもあるので、いちいちそういうのまでは気にしていないものの、長くなりそうな場合は、必ず気を使うべきことでしょう。

ただし、昔かかれたプログラムはそうはいきません。今見ているシステムがまさにそうで、階層化設計もあまり考えてなかったのかも、というまるで BASIC なプログラム。ということで、昔のコードを活かしつつ、なんとか変数を使いまわしできないように、オブジェクト指向的に書き換えようかと思っています。

しかし、かなり難しい。新たに書いてしまった方がすっきりする箇所がいくつもある。さらに、後から追加した人は、何を考えてこのコードを書いたか理解に苦しむコードも。時間が無い中で、別のところで書いたコードを使いまわしているうちに、より複雑になってしまったような感じだろうか。とにかく、余計な処理?と思えるコードがかなり見られる。よくこれで動いていたものだと、関心してしまうくらい。

とはいえ、うまいやり方を見つけ出し、すっきりしたコードに修正できた時の達成感はまた格別。今は時間があるからこんなことをやってられるが、納期が迫った中で、このシステムをデバックしたエンジニアは、さぞ大変だったでしょう。