N予備校のプログラミング入門アプリコースを一通り終えました(付録を除く)

N予備校のプログラミング入門アプリコースが5月31日まで無料でしたので受講しました。

受講した感想

体系的に学べる
Webアプリを作るのに必要な知識が網羅されている
この内容が1000円/月だなんて安い(1000円じゃ1冊も本が買えない)
まったくの初心者にはお勧めできない(映像授業を利用すればいけるのかも…)
うまくググれない方にはお勧めできない(フォーラムを使って質問すれば大丈夫かも…)


最初に

N予備校のプログラミング入門アプリコースを修了すると「一般的なWeb企業でプログラマとしてアルバイトをできるだけの知識が身につきます。場合によっては就職も可能かもしれません。」と、@sifueさんが書いています。
20年くらいPHPを趣味で書いて、ErogameScapeを運用しているので、自分はWeb企業でアルバイトできるのだろうか…と思って、受講しました。
結果は、ぎりぎりアルバイトできるかな…という感じでした。
入門アプリコースの想定学習時間は以下の通りと「約980名の生徒に行われたN高等学校のプログラミング教育の現状と課題」に書いてあります。

概要 テキスト教材の場合 映像授業を利用した場合
1 章 Web プログラミング入門
(HTML / CSS / JavaScript)
10 時間 34 時間
2 章 Linux 開発環境構築
(Linux / Git / GitHub)
8 時間 32 時間
3 章 サーバーサイドプログラミング入門
(Node.js / Hubot / Heroku /
XSS 対策 / CSRF 対策)
17 時間 68 時間
4 章 実践サーバーサイドプログラミング
(Express.js / OAuth / PostgreSQL /
テスト / 継続的インテグレーション)
12 時間 48 時間

自分のスペックは以下のとおりです。
  • そこそこ使える
    • PHP(ErogameScapeはPHPで書いています)
    • SQL(毎日なにかしら実行しています)
    • CentOS(最近CentOS8にしました)
  • ErogameScapeを構成する主なソフト
    • Apache
    • PostgreSQL
  • 触ったことがある
    • Javascript
    • Git /GitHub
  • 資格
    • ネットワークスペシャリスト試験
    • CCNP Routing and Switching
    • LPIC301,303,304

1章はサクサクすすみました。
2章は何か本を読んだときにインストールしたvagrantを流用したのでサクサクすすみました。
3章は想定学習時間どおりでした。
4章は想定学習時間を超えました。どのくらい超えたのか計測していないのですが…1週間かかっています。1日2時間程度取り組んだとすると14時間はかかっています。
4章はSQLの項目があるのですが、自分はSQLの項目は知っていたので飛ばしています。それでも1週間かかっていますので、SQLが初見だとかなり時間がかかります。

各項目について、だいぶ丁寧に解説が書いてありますが、それでも足りなくて、ぐぐったり試したりしているとだいぶ時間を食うので、完全な初心者がテキスト教材のみを使って想定時間内に終わるのはほぼ無理だと思います(※でも、C言語を初見ですごいスピードで習得していった方を見ているので…絶対無理とは書けないです。)
映像授業は見ていないのでコメントできないです。

このコースは必要なプログラム等をProgramming Education (progedu)からForkしてくるので、Forkされた回数で最初から最後までたどり着けた人の割合を見ることができます。
3章の最初の課題のFork数が2.9k、4章の最後の課題のForkが356なので、最後までたどり着けているのは2020年6月1日時点で12%くらいです。


内容について

2017年の資料なので、使ってるライブラリがかわっているところもありますが、高校生にWeb上でプログラミングを教え始めたエンジニアがこの8ヶ月間で得た気づきになります。
もう少しざっくりですと、N予備校プログラミング入門コースの難易度がおかしいになります。

Git cloneして、ポチポチ書いて(または教科書のソースをコピペして)、動かしてみる、の繰り返しで、学んでいきます。
書籍と違って内容がちゃんと年に1回更新されるので、コピペして動きますし、教科書の画面のイメージも実際の画面とあっています。
最近は書籍がすぐに古くなる(ソフトがすぐに新しくなってしまう)ので、コピペしても動かない…のはよくあることです。

Webサイト作成に必要な知識等を広く浅くすくっている印象です。
すべてを学ぼうとすると…おそらく何冊も本を読まないといけないです。
ただ、浅いので…自分で調べて理解を深める必要があります。

このコースを一通り修了すると、自分で分からないことを調べて解決する力も身についているはずので、ErogameScapeと同じサイトを作れます。
もちろんこのコースに出ていた知識だけでは作れないですが、必要な知識を習得していけば作れます。
学んだ知識(Express、Pug、Bootstrap、Heroku)でOOpartsゲーム一覧を作ってみました。


N高等学校でN予備校のプログラミング入門アプリコースを修了された方々へ

自分が以前勤めていた会社はWeb企業ではなかったですが、このコースを修了し、自分でなんらかのアプリを作っている方が自分の担当に配属されたら、歓んで一緒に業務改善に勤しんだと思います。
主にExcel、Accessを使っていたので、何か自動化できることがあれば、VBAで自動化していったと思います。
プログラミングができると何がプログラミングでできるかが分かるようになります。
これはとても重要で例えば事務作業において「これって自分には出来ないけど自動化できそう」と思ったら、自動化できる人を社内で探したり外注できたりするんですが、プログラミングを知らないと現状維持です。
プログラミングができる人が事務作業がたくさんある担当に異動になって、その人が「これ自動ができますよ」って自動化した結果、月末付近は全員が深夜まで残業していたのに、残業自体がなくなった…、ということがありました。
それくらいインパクトがあることがあります。
N予備校のプログラミングコースはWebに特化していますが、Web企業でなくても、このコースで学んだ知識や技術や経験が役に立つ職はいっぱいあります。
未来の皆さんに期待しております!

UnhandledPromiseRejectionWarning: Error: connect ETIMEDOUT

HerokuにNode.jsで作成したアプリをデプロイした際、以下のエラーで別のサーバーの情報が取得できませんでした。
UnhandledPromiseRejectionWarning: Error: connect ETIMEDOUT
結論から書くと、dynoの再起動で回復することがあるので、回復するまで再起動しました。

Node.jsの学習のためErogameScapeのPostgreSQLからデータを取得してNode.jsで加工して表示するという習作をしていました。
しかし上記のエラーがでてErogameScapeから情報を取得できませんでした。
切り分けた結果、ErogameScape側に問題はありませんでした。
同じようなサービスであるGlitchにデプロイしたところ問題は発生しなかったので、おそらくHerokuの問題だと推測しました。

dynoを起動して、接続できないときは、いつまでたっても接続できません。
ソースを適当に変更してgit pushすることで、dynoを再起動すると、たまに繋がることが分かりました。※他にdynoを再起動する方法があれば教えてほしいです。

Herokuの中で完結するサービスだったらいいのですが、外部APIを使ったサービスをする場合は…みなさんどうしているのでしょうか…
dynoは1日に1回再起動するとのことなので、そのタイミングで運が悪いとつながらなくなるかもしれないと思いました。

作成したアプリ(画面?)は以下のとおりです。
  • OOpartsゲーム一覧(Herokuにデプロイしたもの)
    ※30分でスリープします。スリープしている場合は閲覧するまで時間がかかります。
  • OOpartsゲーム一覧(Glitchにデプロイしたもの)
    ※5分でスリープします。スリープしている場合は閲覧するまで時間がかかります。

error An unexpected error occurred: "EPROTO: protocol error, symlink

N予備校のプログラミング入門Webアプリコースの話題です。
環境はWindows8.1です。
※非推奨環境です。

サーバーサイドプログラミング入門で以下のエラーが発生しました。
vagrant@ubuntu-bionic:~/workspace/hubot-todo$ yarn add ../todo
yarn add v1.21.1
[1/5] Validating package.json...
[2/5] Resolving packages...
[3/5] Fetching packages...
[4/5] Linking dependencies...
error An unexpected error occurred: "EPROTO: protocol error, symlink '../../../sshpk/bin/sshpk-conv' -> '/home/vagrant/workspace/hubot-todo/node_modules/http-signature/node_modules/.bin/sshpk-conv'".
info If you think this is a bug, please open a bug report with the information provided in "/home/vagrant/workspace/hubot-todo/yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.
yarnコマンドに--no-bin-linksオプションをつけることでエラーをつけて回避できます。
このオプションの意味を私は理解していませんが、課題達成は問題なくできます。
vagrant@ubuntu-bionic:~/workspace/hubot-todo$ yarn add ../todo --no-bin-links
yarn add v1.21.1
[1/5] Validating package.json...
[2/5] Resolving packages...
[3/5] Fetching packages...
[4/5] Linking dependencies...
[5/5] Building fresh packages...
success Saved lockfile.
success Saved 1 new dependency.
info Direct dependencies
└─ todo@1.0.0
info All dependencies
└─ todo@1.0.0
Done in 1.41s.
エラーの解消にあたって、Windows環境でnpm installでエラーが発生する場合の対処法を参照いたしました。


pgpoolのlog_destination

この話題は、pgpoolとCentOS8の話です。

pgpoolの設定の一つである「log_destination」はログの出力先を指定します。
設定値は、「stdder」、「syslog」、「stdder,syslog」の3種類です。

log_destinationを「stdder,syslog」に設定し、rsyslog.confをそれなりに設定し、これで/var/log/pgpool/pgpool.logにだけログが出力されると思ったら、/var/log/pgpool/pgpool.logにも、/var/log/messagesにも出力されていました。
log_destinationを「syslog」に設定して、思ったとおりの動作になりました。

「stdder,syslog」と設定すると、pgpoolはstdderにもsyslogにもログを出力します。
stdderに出力されたログは、systemdがjournaldに渡します。
journaldは渡されたログをrsyslogdに渡します。
# cat /etc/rsyslog.conf
<中略>
module(load="imjournal"             # provides access to the systemd journal
       StateFile="imjournal.state") # File to store the position in the journal

log_destinationを「stdder,syslog」に設定すると、「syslog」の設定がrsyslogd経由でログを書き込み、「stdder」の設定が、journald→rsyslogd経由でログを書き込む、動作になります。

log_destinationを「syslog」にしてログを保存する場合の設定は公式マニュアル、「stdder」にしてログを保存する場合はpgpool logging on centos 7 | Pierre Timmermansを参照するといいと思います。

ErogameScapeを17年間自宅サーバーで運用してみて

ErogameScapeは自宅サーバーだったのですが、先日、専用サーバーを借用して移管をしました。
自宅サーバーにしたのが2003年4月27日だったので、17年間くらい自宅サーバーを運用してきました。

後から、ああ、こんなことあったなあ…、と思い出にひたるために記録に残しておきます。

(1)レンタルサーバーから自宅サーバーに切り替える
ErogameScapeを作った当初はレンタルサーバーで動かしていました。
そのレンタルサーバーは2001年時点でPostgreSQLが使えるというとても先進的なサーバーでした。
2001年のことですから、PostgreSQLでサービスをするWebアプリを作る人は少なく…、そのサーバーのリソースは私が独り占め状態でした。
ある日、phpで無限ループするスクリプトをレンタルサーバーにあげてしまって、サーバーを落としました。当然、怒られました…
少し経って、また同じミスをして、サーバーを落としました。今度は、サーバーを出ていってくれと言われました。さあ大変…
PostgreSQLが使えるレンタルサーバーは他に選択肢がなく、自宅サーバーにすることにしました。

(2)上り帯域が足りない
ErogameScapeは基本テキストのデータしか扱っていないので帯域はとても少なくて大丈夫です。
当時の自宅サーバーの回線はADSLでした。
ADSLの上り帯域は1Mbpsでしたが、サービス開始当初はこれで問題ありませんでした。
しかし、2004年頃、帯域が足りなくなって、ADSLモアIII(上り5Mbps)に変更しました。
帯域が出るかはNTTの局舎からの距離によるので、おそらく賭けだったと思うのですが、確かちゃんと帯域は出て問題は解決した…はずです。
このとき、帯域が足りなかったので、一時的にコンテンツをレンタルサーバーに退避していますが、ADSLモアIIIへの切り替え後、元に戻しています。
ちなみに今でもErogameScapeは平均すると1Mbps/sで足りております。

(3)IPマスカレードのセッション数が足りない
2005年、当時使っていたADSLルータのBBR-4HGのIPマスカレードのセッション数が足りない事象が発生していました。
BBR-4HGのセッション数は800でした。
どうやって「IPマスカレードのセッション数が足りない」ことを知ったのかの記録をおったら、モデムとADSLルータの間にスイッチング機能を持たないハブをいれてパケットをキャプチャし、トラヒックが高くなる時間にルータがたくさんRST ACKを返していることから推測したようです。
そういえば当時の自分は切り分け用にハブを持っていました…
ユーザーさんに対策を相談し、XR410/TX2(4万円)かRTX1000(ヤフオクで4万円)を勧められました。
高い…
セッション数の問題であれば、セッション数が潤沢な安いADSLルータを相談し買えばいいと思い、BLR3-TX4(セッション数4096)を買うも問題解決せず…
結局、XR410/TX2を買いました。
XR410/TX2は大変素晴らしくEOLまで使いました。
この時、学んだのは「カタログスペックはあてにならない」「高いものはいい」です。

(4)XR410/TX2が踏み台にされる
サーバーの設定を確認して問題ないと思っていたらプロバイダから
この度、外部より、ご提供しておりますインターネット接続回線に
割当てのIPアドレス「XXX.XXX.XXX」から、NTPを利用した大量の通信
(DDoS攻撃)が発生しているとの連絡を受けております。
との連絡が来て青ざめました。
連絡を受けた時は、何が原因なのかさっぱり見当がつかなかったのですが、サーバーは確認していたけど、そういえばネットワーク機器は確認していなかった…ということで、XR410/TX2のNTPDを止めてDDosが収まりました。
ネットワーク機器もちゃんと確認しなくてはいけない…と思った次第でした。

(5)FedoraからCentOSにする
2011年まで、Fedoraを使っていました。
2011年にCentOSの存在を知りCentOS6に移行しています。
それまではFedoraは1年に1回アップデートしていた(今もそうなのかな?)ので、1年に1回、OSを再インストールしていました。
2008年まではサーバーのスペック不足のため1年に1回新しいPCを買っていたので、ついでに新しいOSを入れるのは問題なかったのですが、後述するとおり2009年を最後に新しいPCを買わなくなったので、OSのインストール面倒…というところでした。
CentOSにしたら、OSのインストールをすることはなくなったので、作業量は激減したのですが、次のOS更改の際に自分は対応できるのだろうか…と不安を抱えることになります。

(6)スペックが足りないのでだいたい1年に1回サーバーをリプレイス(2008年まで)
当時は時間をおうごとに着々と負荷があがっており、ソフト的な対策(キャッシュできるところはキャッシュするとか)やハード的な対策(pgpoolを導入して2台で負荷分散)をしていたのですが、おいつかないので、1年に1回PCを買っていました。
しかし2008年を最後にリプレイスしなくてよくなりました。
買ったPCの構成は以下のとおりです
Storm Metaphor 64 LTD
 Core 2 Quad Q9550
 ASUS P5Q(Intel P45 + ICH10R IEEE GbLAN)
 Winchip/DDR2-800 16GB(4GBx4)
 GeForce 8400GS 256MB PCI-Express x16
 WesternDigital WD Caviar Green WD10EADS(1TB SATA-3Gb/s 32MB)
 Seagate Barracuda 7200.12 ST31000528AS(1TB SATA-3Gb/s 7200rpm 32MB)
 KURO600G(静音)
これの1つ前のマシンはメモリが少なかった(6G)のですが、メモリを思い切って16GBにしたら負荷ががくっと下がった…と思われます。
「データベースは使う内容がメモリにすべてのる」ことが肝ですが、当時の自分はそんなことはまったく知らなかったので、16GBのすごさを思い知りました。
この後、同じスペックのPCをもう1台買って、冗長構成になりました。

(7)引っ越し
自宅サーバーなので引っ越しをするたびにサーバー一式を移動させる必要があります。
最初の引っ越しのときは、自宅サーバーしかなかったので、旧居でサーバーを落とし、新居に一式を持っていき、立ち上げ、まではサービス中断でした。
その後の引っ越しはバックアップ用の専用サーバーを借りていたので、一時的に専用サーバーを現用にして、引っ越しが終わったら自宅サーバーに戻す、ということをしていました。
引っ越しで一番怖かったのは、電源を入れたときにちゃんと起動するか、でした。
電源を落とすと、なぜか起動しない…というのはよくあることで、切り分けが大変でした。
たいてい、がちゃがちゃやってるうちに起動するのですが…

(7)東日本大震災の計画停電
自宅サーバーの最大の危機がやってきました。電気がきません…
しかし、自宅サーバーのある地区が計画停電から外れていたためサービスを止めなくてすみました。
こんなこともある…ということが分かったので大容量の無停電電源装置BN220Sを買いました。
UPSの本来の用途と違うのですが…3時間程度なら耐えられる容量です。
ただ、このUPS欠点が2つありました。
  • めちゃくちゃ重い(自分は持てないので引きずるしかない)
  • ファンがうるさい(BATT駆動になると冷却のためFANが24時間回る)
この後、これでは根本対策にならないし、そもそも自宅が壊れたらBAD ENDだ、ということで2012年にさくらインターネットに専用サーバー借りて、バックアップとすることにしました。
ちなみに、それまでのバックアップは定期的にDVD-Rにデータを焼いて実家に送る、実家にはサーバーに使えるPCが1台置いてある…という態勢でした。

(9)ハード故障
(9)-1 PCのケースファンが壊れた
PCのケースファンが大きな音をたてるようになったので電源を抜きました。その後、冬だから大丈夫かなと思って、ファンを回さずに運用したら、全然大丈夫ではなく、温度異常でサーバーが落ちました。
この後、ファンの回転速度、温度を計測するmuninのプラグインを導入しつつ、ケースFANの予備を配備しました。

(9)-2 M/Bが壊れた
切り分けのために最小構成にしても立ち上がらず、CPUを買ってきて交換するも立ち上がらず、M/Bが原因と分かり…M/Bを別のものに交換するとOSの再インストールになっちゃうし、それはきつい…ということで、秋葉原で同じM/B探して見つけて交換ました。お値段は中古だけど新品とあまりかわらない価格ですが…しょうがない…

(9)-3 HDDが壊れた
RAID1なので、1つ壊れても大丈夫。
なのですが、手順を誤ると、データが入っている方を壊してしまうので、昔練習した手順書を探して、えーと、あー、どうやったっけ…と思い出しながら作業。

(9)-4 ネットワークスイッチが壊れた × 2回
自分の経験上、機器が壊れる時は人間が想像もしないような動作をするのですが、自宅サーバーに接続されていたネットワークスイッチも同様で被疑がネットワークスイッチだ!とたどり着くまでに時間がかかったと記憶しています。確か、NICが悪いと思って、NICを交換したけど回復しなくて頭をかかえた気がします。スイッチを介してpingを飛ばすとpingのlossが半端なかったと記憶しています。
ネットワークスイッチは壊れても、電気屋にいけばすぐ買えるので、予備は持っていなかったのですが、安いから買っておこう…ということで予備を購入しました。
購入してからは壊れることはありませんでした…

自宅サーバーの場合「予備をもっておくか」が悩ましいところです。
理想は、1台PCを買ったら、同じ構成のPCをもう1台買って予備にする…だと思うのですが、お金かかりますし…、でもマザーボードが故障して別のものと交換するOSの再インストールになっちゃうのでマザーボードは予備として欲しいかな…今、もし自宅サーバーをたてるなら買うかな…と思います。
また単一障害点となるXR410/TX2が壊れたら同じものを買うまでサービス中断になってやばい、と思ってもう1台同じものを買って所持していました。


自宅サーバーを運用していると、いろんな事案が発生し、都度ググったり、ユーザーさん意見を聞いて、乗り切ってきましたが、「1人では圧倒的に技術も情報も時間も足りない」と思います。

今はレンタルサーバーもVPSもクラウドも低コストで借りられるのでWebアプリを自宅サーバーで動かすメリットはないかな…と思います。自宅サーバーを保守する時間をWebアプリを開発する時間にあてた方がいいと思います。

記事検索