misc.log

日常茶飯事とお仕事と

求人情報の添削

昨年の話ですが、求人情報として出す文面の添削を依頼されたときの返事をメモっておきます。誰かの参考になったりするかもなので。

Excel VBAの取り扱い

規模を問わずWeb系からExcel中心のシステム開発

Excelを使ったシステム開発は、世間一般的には「悪手(良くない手法)」で、印象としてはネガティブに映ります(Officeのバージョンが変わったら動かなくなったり、元々システム開発ツールではないので、保守性、改造や変更がやりづらいといった問題があったり)。

上記の文言だと「Excel中心。Webもあるよ」に読めますが、Excelをどうしても入れたいのであれば「Web系開発からExcel VBAなどを用いた企業内システムの開発まで。」みたいにしておくと言い訳がつきそうです。

工程について

開発、テスト、リリース、アフターフォロー等

「設計」入れなくていいでしょうか?

利用言語やツールについて

言語 :VBA、.NET(VBC#ASP)、JavaPHP、HTML、JavaScript
DB :SQLServerOraclePL/SQL

  • HTMLは言語といっても補助的なものなので、ここに入れない方がいいです。
  • VBAが筆頭になっているのはあまり印象よくありません。大企業が「予算がないからExcelを使ったシステムにして」と言ってきて、仕方なく作ってるというイメージがあります。
  • .NETというくくりにするより「VB.NETC#」の方がわかりやすいです。
  • ASPは言語ではありません。また、ASPにも「ASP」と「ASP.NET」があり、全く別物なのでもし書くなら注意が必要です。
  • SQLServerは「SQL Server(空白入れる)」です。マイクロソフトの製品名なので正しく書かないとそういうところに無頓着な会社だと思われます。
  • Oracleは社名。Oracle社のデータベース製品名は、今は「Oracle Database(またはOracle DB)」です。
  • PL/SQLはデータベースではありません。Oracle DB上で動くプログラミング言語です。なので、書くとしたら言語の方が妥当かもしれません。

となると

言語 :VB.NETC#PHPJavaVBAJavaScriptPL/SQL
DB :SQL ServerOracle DB

この方がすっきりしますね。

雰囲気について

まじめで誠実。相談や質問もしやすく暖かみのある集団です。

別の添削者(この添削依頼は自分含めて2名に出されていた)と同意見。ただ、ここについては社としての方針があるのであれば何も言いません。個人的には「暖かみ」は警戒の対象です(ITの仕事に私情や感情は不要。ドライにロジカルであるべきと考えるので)。

ポリモーフィズムを新人に説明するための自分用お勉強

全くIT系の勉強をしてきていない、文系の学部卒を抱えての新人研修で、6月以降も在宅でC#の本を読んでもらうことになりました。個人的には最初は横について、Visual Studio自体の使い方なども教えながら、きめこまかに教えて、ある程度のところで独習にする方が良いと思うのですが……まだコロナウイルスの影響が抜けきらないということであれば仕方がありませんね。

で、下記の本をこちらでも読みながら、新人達がつまりそうなところや、本の説明だとちょっと物足りないところを補足していっています。

確かな力が身につくC#「超」入門 (Informatics&IDEA)

確かな力が身につくC#「超」入門 (Informatics&IDEA)

この本、基本的にコンソールアプリをメインで話を進め、GUIを使ったプログラムは全6章のうち5章以降。後半まで登場しません。そして、4章が「オブジェクト指向」と銘打たれて、クラスなどの説明をRPGのキャラクターや敵を効率的にプログラムで実現するという例を出しながら説明しています。この説明の仕方は私のやり方に非常に似ているので馴染みやすく、この本を選定した理由の1つでもあります。

その中で1つ「ポリモーフィズム」の説明がちょっと物足りなく思い、自分でも補足説明をしようとしたのですが……難しいですねこれ。実際に用語の厳密な意味を知っていなくてもプログラムは作れますが、将来的に「開発者向けのライブラリを作る」とか「実装のルールを定める」といった、上位業務に就くことを考えるとある程度の理解はして欲しいところ。まぁ今の時点で理解していなくても「そういえばあの人がなんか言っていたな」と思い出してもらえれば……とおもって説明しようとしたのですが、自分自身の理解の浅さを再認識する結果になりました。

とりあえず調べた経緯等を後々の再確認に備えてメモしておきます。

Wikipediaの説明を見てみた

Wikipediaの「ポリモーフィズム」の項を見るとこうなっています。

bit.ly

ポリモーフィズム(polymorphism、多態性)を構成する特性は下記の3つ。

  • アドホック多相性(Ad hoc polymorphism)
  • パラメーター多相性(Parametric polymorphism)
  • 部分型付け(Subtyping)

ん……んんw 難しいわこれ。部分型付けは、クラスの定義で親子関係(スーパークラスと、それを継承したサブクラスがある)という状態で、サブクラスのインスタンススーパークラスで宣言した変数に入れることができる。そして、同じスーパークラスの変数に入っているオブジェクトでも入れた物によって振る舞いが変わる、というような話。実は上記の本では「これがポリモーフィズムです」と説明されていて少し物足りなさを感じたのでした。

ただ実際、たとえば法政大学の講義資料でもそれがポリモーフィズムとして説明されてます(このページの説明はわかりやすいと思います)。

java2005.cis.k.hosei.ac.jp

ではWikipediaに載っていた他の2つは何だろう……。

アドホック多相性とは

アドホックとは「とりあえず」「その場しのぎの」といった意味で使われる言葉ですが、Wikipediaにも説明があるようにここでの用法はネガティブな意味ではなく、「後付けの」という意味合いが強いようです。データ型という仕組みが本来もっているものではなく、後付けでこういう使い方が出てきた……ということでしょうか。ちょっと上手く説明できませんが、実態はいわゆる「オーバーロード(overload)」機能。同じメソッド名でも引数の型や数が異なるものを複数定義でき、同じ名称で呼び出してもその引数構成で振る舞いが変わるというものです。

正直、オーバーロードポリモーフィズムは自分の中で結びついていなかったので、ちょっとこのあたりについての質疑などが出て無いかテラテイルで見てみたら……ありました。

teratail.com

まさにそのまんまの疑問ですね。やはり、広義と狭義で範囲が変わり、オーバーロードポリモーフィズムのひとつの実現方法かという判断はそこで変わると。

パラメーター多相性とは

こちらは、C#で言う「ジェネリクスGenerics)」が提供する機能が相当するようです。実はジェネリクス*1については使い方は判っていたのですが、C#で実際にジェネリクスを取り入れたメソッドなどを定義したことはありませんでした。また、「なんでジェネリクスという名称なの?」ということも理解できてませんでした……お恥ずかしい。

これについては、いつもの「未確認飛行 C」で非常にきっちり説明されています。

ufcpp.net

どうやったらこんな説明が書けるんだろう……すごい。要するに、引数や戻り値について型を特定せずにその「総称」として定義し、どんな型でも扱えるように作られたもの。型情報自体がパラメーターになっているというものなのですね。だから「総称」を指す「generics」と命名されている。

一応マイクロソフトDocsのURLも記載しておきましょう。

docs.microsoft.com

こちらも、メソッドやクラス名は同一でも、宣言時に指定する型によって振る舞いが変わり得るということで、ポリモーフィズムを実現する機能の1つとされているわけか……なるほど。

これを新人にどこまで説明するか

正直、ここまでの理解を新人がする必要は無いと思っています。はじめは使い方がわかって、何をどうしたらどうなるかということの実例をたくさん経験し、「なんだか判らなくても使える」というレベルからで問題ないでしょう。しかし、問題はその先です。彼らがチームを率いたり、チームで利用する共用のライブラリー的なものを設計したり、作ったりという、より上位の業務を行い始めたとき、こうした「プログラミング言語が持っている機能の意義」や「目指すところ」の理解があるかどうかでできあがるものの有用性がおおきく変わってくると私は考えます。

同じ事を実現するにもより簡単な方法をや、メンテナンス性の高い方法を選択したり、本来の用途ではない「誤用」をおおっぴらにやらかさないようにしたり。いろんなメリットがあるのですが、そういうことを知らなくても、「手間は掛かるし面倒だしコストも高いけれど」実現出来てしまうという側面もあるため、そもそもポリモーフィズムのような考え方を知らなくても、知らないことが当たり前の組織で仕事をしているとそのまま高いコストで面倒なことをやる。そして、それをそのままお客さんに金額にして請求するなんてんことがまかり通ってしまいます。

そういうお客さんと付き合っている間は問題無いかも知れませんが、いざ、新しいところに踏み出そうとしたときに、お客さん、自分たち、また、仕事に関わる他者のエンジニアの三者それぞれが「えっ!?なにそれ」と思ってお互いに失望したり、驚いたりするわけです。そして結局「この人達の仕事は効率が悪くて高い」となる。

そういう状況を回避するためには、少なくとも先輩社員はこうした裏側や言語仕様の意図について多少なりとも理解しようとする試みを行っておくべきだと思います(理解出来ずとも、難しい話があるということが分かっているだけでも多人数でかかればなんとかなるかもしれませんし)。

*1:ジェネリクス: Microsoftの資料などではジェネリック、と記載されていますが、genericは形容詞。英語では名詞形のgenericsジェネリクス)が正しい読みのようですね。

Windows7のライセンス認証がエラー 0x80072f8fで失敗する

経緯

なんで今頃Windows7……と思われるかもしれませんが、仕事で古い環境を用意する必要があったので、インストールしてライセンス認証しただけの状態でとってあったVMware用仮想PCを引っ張り出して久々に起動しました。すると……「エラー: 0x80072f8f」でライセンス認証に失敗とのメッセージ。オンラインで認証してもダメ。もしかして?と思って改めて別のプロダクトキーを入れて見ても駄目。

どうやらこのエラーは、PCの時計設定が狂っている場合、たとえば古いPCで本体の電池が切れてしまっており、時刻が2004年とかになっている、といった場合に起きるそうですが、時刻は問題無し。あらためて時刻同期をしてみても同じ。

解決法みつかる

で、四苦八苦した結果、エラーコードで検索して下記のサイトにたどり着きました。ありがとうございます。こちら、時刻の問題以外にもう1つの問題について言及されています。結論を先に書くと、Windows Update Agentの更新です。

kje52khcd.blog59.fc2.com

おそらくですが、数年前にインストールして初期のライセンス認証だけを行った状態で放置されていたWindows7ですので、いろんなコンポーネントが古いままです。一方で、マイクロソフト側はライセンス認証サーバーも含めて新しくなっている。そこに「古いコンポーネントで処理依頼が来た」→「エラー」というオチなのかな……と推測。

とりあえず書いてある手順でWindows Update Agentを手作業インストールしてみたところ、問題無くライセンス認証が通りました。助かった!

手順は下記の通りです(2020年5月時点)。

  1. https://support.microsoft.com/ja-jp/help/949104/how-to-update-the-windows-update-agent-to-the-latest-version」を開く。
  2. Windows 7 SP1 および Windows Server 2008 R2 SP1 用のスタンドアロン パッケージ」から「サポートされているすべてのバージョンの Windows 7 SP1 (x64 ベース)」にある「パッケージ」リンクをクリックする(32bit版の場合はx86ベースのリンクをクリックします)。
  3. ダウンロードされたファイルをインストールする。

本来、Windows Upateで自動的に更新されるべきものですが、Windows Update自体、ライセンス認証が済まないと動かせません。というわけでここは手作業でダウンロードしてインストールする必要があるわけですね。危うく挫折するところでした。よかった。

補足:SP1でなくてもWindows Update Agentを入れられた

別の環境でも同じ事がおきました。こちらはWindows 7 Ultimate Edition(SPなし)。Windows Update Agentのダウンロードサイトには「Windows 7 SP1用」とあるのですが、ダメ元でダウンロードしてインストーラーを動かして見たところ、とりあえずエラーは起きずにインストールできました。参考まで。