プログラマーは理系の仕事?

f:id:kyart:20210717010540j:plain
数学は必要か?

プログラマーは理系の仕事?

イメージとして多くの方が持っているのが、プログラマーは理系の人がやる仕事だという先入観です。

  Listening.prototype.off = function(name, callback) {
    var cleanup;
    if (this.interop) {
      this._events = eventsApi(offApi, this._events, name, callback, {
        context: void 0,
        listeners: void 0
      });
      cleanup = !this._events;
    } else {
      this.count--;
      cleanup = this.count === 0;
    }
    if (cleanup) this.cleanup();
  };

例えばこんなコードのサンプルを見ると、複雑な数学や物理の公式などを駆使しているように見えますよね。実際のところどうなのでしょうか?

分野によっては理系の素養が大切

数学が得意であると数理な場合や、そもそも特定の分野のプログラミングができないということがあります。例えば今流行りのAIなどのプログラミングを行いたい場合は、配列や統計などの数学の知識が必要です。Σとかの記号が全くわからないようだと、大した仕事はできないでしょう。
ゲームプログラミングも、趣味で行うだけでなく任天堂セガなどのガチなゲーム開発会社にプログラマーとして就職を目指す場合には必須と言えます。
最近セガがゲーム業界における数学の仕様に関するノウハウを公開して話題になりました。
techblog.sega.jp
その他株取引関連、宇宙にロケットを飛ばしたいなど数学や物理の知識が大いに必要です。

文系プログラマーの仕事が圧倒的に多い

しかしながら、現在仕事の需要が多いウェブ業界を見てみると、ガチガチの理系出身の人ばかりかというとそうでもありません。そうではなく、ストーリー性をきちんと把握できる人のほうが求められていると言えると思います。
例えば単純な会員登録サイトを例に取ってみましょう。どんな情報を登録する必要があるでしょうか。

  • 名前
  • 電話番号
  • メールアドレス
  • 住所
  • 生年月日
  • ログインユーザー名
  • パスワード

などがすぐに思いつく項目です。ではそれらを文字入力のフィールドで入れてもらって、それを会員情報データベースに登録するだけで良いでしょうか。
単純に考えるとそれだけでは困ったことになります。
例えば名前のふりがなは必要でしょうか。
姓と名を分ける必要がありますか?
メールアドレスはちゃんとメールが送れるでしょうか?
パスワードに使える文字は英数字だけにしますか、記号にしますか?

このように単純に見えることでもきちんと詰めていかないと行けない事柄がたくさんあります。これらは要件定義と呼ばれるものです。チームによってはそのような細かい詰めをSEなどの別の担当者が行い場合もあります。
それでも詰めきれていないことを質問しなければなりません。

例えば生年月日はカレンダーで選ぶ事になっているとします。では初期設定では何月何日を表示しますか?今日の日付を表示しているカレンダーから数十年前の自分の生年月日を選択するのは結構手間です。では生年月日はプルダウンメニューから選んでもらったほうがよいでしょうか?

このように会員登録という単純そうなことでも、必要になってくる手順や道筋を言語化する力、それが現代のプログラマーに求められているのです。

プログラマーとは何か

プログラマー
プログラマー

プログラマーとは

プログラマーとはプログラミング(=プログラムを書くこと)を生業とする仕事のことです。なんと厚生労働省ホームページにも定義が載っています。
https://shigoto.mhlw.go.jp/User/Occupation/Detail/313
>> システム開発において、システムエンジニア(SE)が作成した詳細設計に基づきプログラムを作成する。 <<
間違っているわけではありませんが、私見ではもう少し幅が広いように思います。大きな企業などで分業がしっかりとされている場合には、たしかにシステムエンジニア(SE)が設計を担当し、それをそのままプログラムに書き起こすのが仕事というところもあるでしょう。しかし小さな企業やチームではそれらを同じ人が行うことも少なくないはずです。

プログラムを作成する、という作業を実行する人を広義に「プログラマー」と呼んで良いと思います。

具体的には?

実際のプログラムの例を見てみましょう。

function template_preprocess_questionnaire_data_confirm(&$variables){
	global $facility_map;
	$variables['v']['fid'] = $facility_map[$variables['v']['fid']];
	$qs = new questionnaire();

	$variables['qs'] = questionnaire::$_q;
}

これはPHPと言うプログラミング言語の一つで書かれたプログラムの一部です。フォームに入力された情報をメモリのような領域に保存してから次のページを表示する準備をしています。

さて、そのような処理の書き方はこれだけが正解ではありません。無限にバリエーションが存在します。その「やりたいこと」をコンピューターがわかる形に書き換えて伝えるための方法を考えること、そしてそれを実際の文章?、プログラムのコードに書き起こすこと、それがプログラマーの仕事であり醍醐味と言えます。

方法を考えるということ

無限にバリエーションがある、とはどういうことでしょうか。例えば、1000円札一枚を持っている状態で、500mlで150円のコーラを1本買うと、お釣りがいくらになるかを知りたいとします。このような単純なことであれば正解は1つと言えるでしょう。必要な処理は

1000 - 150

となるでしょう。

ではもう少し複雑にしましょう。1000円札一枚を持っている状態で、500mlのコーラを1本、近隣の最も安い店で買ったときのお釣りを知りたい場合にはどうでしょうか?

1000 - x

ととりあえず1000から何かを引いた数を求めたいことはわかります。仮にxを入れてみます。でもそのxをどのように導き出すのでしょうか?検索をするのでしょうか、実際に近所の店舗に出向いて金額を調べてデータベース化しておいてその金額をxとして使うのでしょうか。

別の例を考えましょう。ショッピングの注文フォームに入力する電話番号に出来るだけ誤りがないようにしたい、という問題があるとします。どう解決するでしょうか?

全角の数字(0の代わりに0、7の代わりに7のような)を入力させないようにフォームの文字入力フィールドに半角しか受け付けないという制限を課すこともできます(ブラウザによっては動きませんが)。

電話番号として有効な10桁か11桁以外の数字はエラーにする、ということも出来ます。

最初の数字が0であることを確認することも出来ます。

もっと厳密にしようと思えば、電話番号が入力された後に実際にプログラムから電話を掛けてつながるか確認することさえ出来ます。

確認方法を考えたり、それを実際にプログラムのコードに起こしたりすることがプログラマーの仕事です。複雑になればなるほど工数、つまりプログラマーの作業時間が増えます。それが増えると費用(プログラマーの人件費)が増えたり、スケジュールを圧迫して他の作業の時間が取られます。ですから何でも全部乗せで行うわけには行きません。

前述のシステムエンジニア(SE)が機能していれば、そのへんの判断や仕様作成(どのレベルまで電話番号の入力が正しいかのチェックをするのかなど)をしてくれます。そうでない場合は自分で判断することになります。

プログラムのコードに書き起こすということ

方法が決まったら、プログラマーはそれを書き起こすことが必要です。英語でメールを送りたいという場合でも、内容は決まっていても英語話者に理解できる英単語や最低限の文法が合っていないと伝わらないのと同じです。

コンピューターに対しては、それをプログラミング言語を使って伝えます。また文法は完璧に合っていないと使えません。

それで文法チェッカーのようなものを使って書くことが一般的です。それらをIDE(Integrated Development Environment、統合開発環境)と呼びます。

f:id:kyart:20210713111112p:plain
IDEの例

コロンが文末に抜けている、クォーテーションマークが閉じていない、などの文法の誤りをその場で指摘してくれます。ただしチェックしてもらうためのプログラムは自分で書けないと使えません。

プログラマーとは、最低1つはプログラミング言語を知り、それでやりたいことを表現する方法を知る人なのです。

プログラムとは

f:id:kyart:20210712103943j:plain

プログラミング

プログラム、プログラミングという言葉を良く聞くようになりました。学校の指導要領に含まれるため、教員の確保や授業の質を担保するためにどうするか、と言った内容のニュースを聞くようになったためです。

またNintendo Switchでは『ナビつき! つくってわかる はじめてゲームプログラミング』が2021年6月に発売されました。これまでの子ども向けのプログラミング教材と一線を画する斬新な試みです。

 

「プログラミング」とは「プログラムを作る、書く」という行為ですが、そもそもプログラムとは何でしょうか。

 

簡単に言うと、それはコンピュータに与える命令のことです。その命令が実行された場合に処理が行われます。

 

例えば、足し算というプログラムがあるとします。2つの数字を与えれば(入力)、それを加算処理した数字を出します(出力)。例えばこんな感じになります。

>|shell|
addition.sh 1 2
> 3

 addition.shというのがプログラムです。スペースの後の1と、更にスペースの後の2が入力です。

これでエンターキーを押すと、次の行の3という答えが出ます。

これだけだと単純すぎてイメージにしにくいかもしれません。しかしプログラムを突き詰めてゆくと、細かなこのような単純な処理の集合体であることがわかってきます。

f:id:kyart:20210712105919j:plain

ゲームコントローラ

このようなコントローラーの操作一つ一つが入力です。■ボタンを押したらそのボタンに対応した処理を行います。マリオがジャンプしたり、メニューの項目を選択したりという場面場面に合わせた処理が行われるわけです。

マリオ

そのような細かな処理の一つ一つをプログラムと呼びます。そしてそれが大きく組み上がったもの、販売されているゲームソフトとかアプリとかのこともプログラムと呼びます。

規模の大小を問わず、そのような処理、または処理の塊によって完成された一つのソフトウェアのこともプログラムと呼ぶのです。

backbone.jsのCollectionごとsaveする

Modelのsave()を使用するとurlで指定したサーバー上のスクリプトにputリクエストで送ってくれるため、一々リクエストを整形したりサーバーとの通信を開いたりする部分を書かなくてとても便利。しかしModelの集合であるCollectionにはなぜかその機能が無い。そのためeach()でsaveを呼び出していると、Collectionの要素数だけ呼び出されてしまうので、数が多いと大変なことになる。そのやり方のメモ。

// Collection    
var ItemCollection = Backbone.Collection.extend({ 
    model: Item,
    url: "update-items.php",
    save: function(){
        Backbone.sync("update", this, {
            success: function(){
                console.log("save successfully");
            },
            error: function(){
                console.log("error saving");
            }
            
        });
    }
});

とこのようにCollectionにurlとsaveを定義する。これでItemCollectionのインスタンスでsave()を呼ぶと、JSONの配列となった状態でurlで指定したURLにputされる。
受け取り側はPHPだと、$_GETでも$_POSTでも拾えないので注意。
ModelであるItemのインスタンスにpriceというプロパティーがあると仮定して、このようにそれを受け取ることができる。

$datainput = fopen("php://input", "r");
if($datainput){
	while ($data = fread($datainput, 10240)){
		$objarray = json_decode($data);
	}
}
error_log($objarray[0]->price);

JSONの配列になっていることに注意する。この配列をイテレートしながらDBに追加したりすることができるはず。

Collectionをwhereでフィルターかけたらeachとか使えなくなった

backbone.jsでCollectionをrenderでeachで表示している。

var candidates = new Candidates([
  { name: "山田太郎", sex: "男", age: 24, status: 0 },
  { name: "鈴木康子", sex: "女", age: 20, status: 0 },
  { name: "坂巻徹", sex: "男", age: 26, status: 1 },
  { name: "大迫道夫", sex: "男", age: 24, status: 0 },
  { name: "宮沢洋介", sex: "男", age: 26, status: 0 },
  { name: "上条志のぶ", sex: "女", age: 20, status: 1 },
  { name: "三枝沙也加", sex: "女", age: 20, status: 0 },
  { name: "酒井祥子", sex: "女", age: 23, status: 0 },
]);
        
var candidatesView = new CandidatesView({ collection: candidates });
$("#possible-candidates").html(candidatesView.render().el);

でrenderはこのように。

var CandidatesView = Backbone.View.extend({
	 tagName: "ul",

	 render: function() {
	     this.collection.each(function(candidate){
	         if( candidate.get("status") == 0 ){
	             var candidateView = new CandidateView({ model: candidate });
	             this.$el.append(candidateView.render().el);
	         }
	     }, this );
	     return this;
	 }
});

これはうまく表示される。
これをこのように、collectionであるcandidatesのなかから、status = 1のものだけのコレクションにしてからViewに渡したい。

var possibleCandidates = candidates.where({ status: 0});
var candidatesView = new CandidatesView({ collection: possibleCandidates });

しかしそうすると

Uncaught TypeError: Object [object Array] has no method 'each'

とエラーが。possibleCandidates.lengthとかでサイズを確認したら、きちんと検索はできている様子で数はあっている。

これはwhereで取得するオブジェクトがCollectionではなくてArrayになってしまっているのが問題。ではどうやってキャストするのかということで悩むところだが、単純に新しいCollectionのインスタンスを作ってしまえば回避できる。

    var possibleCandidates = new Candidates( candidates.where({ status: 0}) );

CandidatesはCollectionをextendしたものなので、これでまたeachなどが使えるようになる。

Python version 2.6 required, which was not found in the registry

新しく買ったWindows 8のマシンにPythonのモジュール(psycopg2)をインストーラーからインストールしようとしたら、上記のメッセージが。しかしPython2.6はちゃんとインストールされている。
どうも64 bitのOSだとうまく作動しないソフトの類いが多い。今回の場合、レジストリが原因だったのでこのようにして回避できた。

  1. レジストリエディタを開く(Windows 8の場合、regeditと検索する)
  2. HKEY_LOCAL_MACHINE→Software→Pythonを右クリック
  3. エクスポートを選択して、適当なファイル名で保存
  4. 保存したファイルをテキストエディタで開く
  5. 「LOCAL_MACHINE」となっている部分の文字をすべて「CURRENT_USER」に置き換えて、上書き保存する
  6. そのファイルをダブルクリックする。警告メッセージが出てくるがそのまま続行
  7. レジストリの「HKEY_CURRENT_USER」の中のSoftwareの部分にPythonが追加されている。

その後インストーラーからpsycopg2を起動すると、ちゃんとPython2.6を認識して、インストールが完了した。

しかし今度は実行中に、
ImportError: DLL load failed: %1 は有効な Win32 アプリケーションではありません。
と出てしまう。まだ何か必要らしい。。。

Drupal 7で日本語を設定しようとしたらエラーが表示されるようになっ

言語を日本語で設定すると、サイトの上部にこのようなエラーメッセージが表示されるようになった。

ご指定のファイル temporary://fileAjhkc3 はコピー先ディレクトリーが正しく設定されていないため、コピーされませんでした。ディレクトリーパーミッションが原因かもしれません。詳しくはシステムログを参照してください。

それでシステムログを見るとこのように。

日本語 用JavaScript翻訳ファイルを作成中にエラーが発生しました。

これは「環境設定」→「ファイルシステム」で設定されているパブリックファイルシステムパスと、テンポラリーディレクトリーのディレクトリのパーミッションを書き込み可能なものに変更すれば、エラーメッセージは消える。