「英検1級バーチャル面接アプリ」ひとまず完成

下記の記事での紹介した「英検1級バーチャル面接アプリ」を開発中です。

2019年の12月末に最小限の機能は実装が終了して,とりあえず使える状態になったので早速公開しました。とりあえず動く状態です。細かいところやデザインは全然醜いです。

この記事では簡単に使い方の流れと面倒だった部分(こだわり)を紹介します。

使い方&こだわり

アクセスするとこの画面が出てきます。「START」を押すとトピックが5題取得されます。

トピックの取得には理由もなく非同期処理を使ってみました。アクセスするときにトピックも同時に取得したっていいのにわざわざ。

この取得されるトピックの組み合わせにも少しこだわりがあります。5つのトピックはそれぞ異なったカテゴリから出題されるようになっています。

過去問を300題くらい集めて,手作業で20カテゴリをそれぞれのトピックにタグ付けしました。正直この作業が一番しんどかった。

1分の間にスピーチに使うトピックを選択します。

後は緑のボタンで質問を進めていくだけ。

質問がすべて終わると回答例ページに飛びます。選択したトピック,聞かれた質問,回答例が表示されます。

回答例の下には関連したトピックが表示されます。これは手作業でカテゴリのタグ付をしたトピックの関連度が高いものから表示しています。

これから

最短で動作する環境は整えましたが,質問と回答例のサンプルを全然用意できていません。もっと増やして少しずつ育てていきたいと思ってます。

もちろんお金を出して外注して書いてもらうこともできますが,無料サービスにまだそこまでできないかな・・・。

もう一つ。作るばっかり作ってこれを必要な人にどうやってリーチするかということを考えていなかったこと。これをカタカナで言うマーケティングというらしい。やっぱり一番は検索で流入してくれることなんだけど,特定のキーワードで上位に表示されるのは難しそう。

兎にも角にも,質が良くて勉強中の人の役に立つ回答例や質問をどんどん更新していけば,自然と検索も上位に表示されるのかな?

この辺はSEOの仕組みと一緒に少しずつ勉強していかないといけません。この辺は勉強の過程もまとめて記事にしようと思います。

協力者募集

英語で回答例を書いてくれる方,またはWebの方の開発を手伝ってくれる方がいれば大歓迎です。もちろん両方できる必要はありません。

apache2.4 ファイルはどこにあっても適応される

以前の記事でWordPressのログイン画面の前にDigest認証をかけようとしました。

WordPressがインストールされているディレクトリの.htaccessに設定を書き込む方法を紹介しましが,他にもApacheの設定ファイル(httpd.conf)自体に書き込む方法があります。

httpd.confに<Files filename>設定</Files>と記述しますが,この場合,そのファイルがどこのディレクトリにあってもその設定が有効になることを知りませんでした。

<Files "private.html">
Require all denied
</Files>

この場合,private.htmlがどこにあってもアクセスを拒否することができます。パスとか指定しなくて良いんだ。

ただ,/var/web/dirの中のprivate.htmlのみのアクセスを制限したければ<Directory>と<Files>を組み合わせれば良い。

<Directory "/var/web/dir">
   <Files "private.html">
      Require all denied
   </Files>
</Directory>

参考にさせて頂いたサイト

Configuration Sections

Apache2.4 VirtualHostで特定のファイルにアクセス制限

以前の記事でwp-login.phpのみにDigest認証をかける作業を行いました。

通常であれば<Files>に設定を書いておけば有効になりますが,バーチャルホストで複数のWebサイトを運営している場合は訳が違います。

理由はわかりませんが,<Directory>や<Files>が何度設定しても有効になりません。結論,<Location>を使えば良いらしいです。

<Location "/wp-login.php">
   AuthUserFile /etc/httpd/conf/.digestpass    
   AuthName "Digest Auth"    
   AuthType Digest     
   <RequireAny>      
      Require valid-user       
      Require ip xxx.xxx.xxx.xxx
   </RequireAny>
</Location>     

例えば<Location “/private”>と指定すると,URLが/privateで始まるリンクすべてに適応される。以下は例。

http://yoursite.example.com/private,
http://yoursite.example.com/private123, http://yoursite.example.com/private/dir/file.html 

ただ疑問なのは,どうしてVirtualHostで設定すると<Directory>や<Files>の設定が有効にならないのだろうか。

というかそもそも<Directory>と<Location>の違いをよく理解できていない。(そのうち掘ります)

参考にさせていただいたサイト

Configuration Sections

WordPressのログイン画面にBasic/Digest認証をかける

WordPressのログイン画面に辿り着く前にもう一つの認証をつけてみます。完成図はこんな感じになります。

Basic/Digest認証を導入する理由

Basic/Digest認証の導入を検討するに至った理由はいくつかあるので紹介しましょう。

他人のサイトでログインを試せてしまう

特に初期設定から変更していない限り,WordPressのログイン画面は誰でも入れてしまいます。また,複数回ログインを失敗した端末のIPアドレスを拒否する設定を施していない場合,ログインを無限に試することができます。

試しにログインページにアクセスできるWordPressベースの有名サイトを並べてみました。(絶対にログインを試さないでください。)

このようにサイトのURLに + /wp-admin と付け加えるだけでログインページにリダイレクトされてしまう・・・。恐ろしい。

Basic認証ではなく,Digest認証をかけたい

wp-login.phpに認証をかけようと調べていると,Basic認証について紹介している記事は多くありましたが,Digest認証の設定を解説している記事はほとんど見つけられませんでした。

確かにサイトがTLS(SSL)に対応していればBasic認証で送られる情報も暗号化されるはず。つまり,盗聴されても中身は解読されにくいわけで,設定する手間を考えればBasic認証でも十分と考える人もいます。

(そもそもBasic認証もDigest認証も本認証の前に置く,おまけの認証でしかないので。)

しかし,私は雑記帳のネタにはなりそうだから,Digest認証を採用しました。

Basic/Digest認証の設定方法

勉強のためにBasic認証もDigest認証の方法も記録しておきます。流石に本番環境での設定をネタにはできないので,実験用の仮想環境で試した設定方法を載せますね。

まずはBasic認証,Digest認証共通の設定。次にそれぞれの設定を説明していきます。

実験環境

  • CentOS Linux release 7.7.1908 (仮想環境)
  • Apache/2.4.6
  • URL) http://192.168.3.9/blog

.htaccessの有効化

httpd.confの設定で無効になっている場合は有効にしてください。

#AllowOverride None
AllowOverride All

.htaccessはディレクトリ毎の設定をするファイルですが,httpd.confの設定を頻繁に変えたくなかったり,そもそも権限がない人はここに書かなければいけません。

[Basic認証 1] .htpasswdの作成

Basic認証に使うユーザ名とパスワードを保存したファイルを作成します。-cは新しいファイルを作成, -mはパスワードはmd5で保存するというオプションです。

$ cd /etc/httpd/conf
$ sudo htpasswd -c -m .htpasswd <ユーザ名>
 New password:<パスワード>
 Re-type new password:<パスワード>
 Adding password for user user

$ cat .htpasswd
 <ユーザ名>:$apr1$W0W01YDj$U6KIhTJBN54GXUVjzC2Hv1

[Basic認証 2] .htaccessの作成

WordPressのインストールされているディレクトリにある.htaccessを編集して以下を追加します。

<Files wp-login.php>
AuthType Basic
AuthName "Please enter your ID and password" 
AuthUserFile /etc/httpd/conf/.digestpass 
require valid-user
</Files> 

AuthNameは本来領域名ですが認証ボックスに表示されるだけなので何でもOKらしい。

[Digest認証 1].digestpassの作成

Digest認証に使うユーザ名とパスワードを保存したファイルを作成します。<領域名>は任意の文字列でOKです。

$ cd /etc/httpd/conf
$ sudo htdigest -c .digestpass "<領域名>" <ユーザ名>
 Adding password for user in realm <領域名>.
 New password:
 Re-type new password:

$ cat .digestpass
 <ユーザ名>:<領域名>:83b0c7f1eaa530b1252578d43bbc6c70

[Digest認証 2] .htaccessの作成

WordPressのインストールされているディレクトリにある.htaccessを編集して以下を追加します。

<Files wp-login.php>
AuthType Digest 
AuthName "<領域名>"
AuthUserFile /etc/httpd/conf/.digestpass 
require valid-user
</Files>

AuthNameは.digestpassを作成したときの領域名を入力してください。

[Digest認証 3] Digest認証モジュールの有効化

Digest認証を行うために,モジュールの有効化をしなければなりません。私の環境ではデフォルトで有効になってました。

/etc/httpd/conf/httpd.conf
/etc/httpd/conf.modules.d/00-base.conf

上記の設定ファイルどちらかにDigest認証に関する記述があるはずです。私の環境では下。

$ cat 00-base.conf | grep digest
 LoadModule auth_digest_module modules/mod_auth_digest.so

このモジュールがコメントアウトされている場合は外して保存してください。

Apache再起動

すべて設定し終わったらApacheを再起動します。問題がなければOKです。

$ sudo systemctl restart httpd

参考にさせて頂いたサイト

Kindleの単語帳をリセットする!+応用編も!

Kindleは洋書を読むのに最高のツールです。わからない単語をタップすれば意味が出てくるし,調べた単語をまとめて単語帳まで作ってくれます。

私は防水機能のないKindle Paper Whiteを使っていますが,ジップロックに入れて毎晩お風呂で読んでいます。めちゃめちゃ捗ります。

しかし,蓄積した単語を標準で全消去する機能がなく,フラストレーションを感じることがあります。ここでは全単語を消去する方法を説明したいと思います。Windows10の環境でやっていますが,Mac等でも基本的には同じです。

ちなみにこの方法はたまたま私の環境で問題なく動作しているだけなので,何か問題が起きても私は知りません。

準備・インストールするもの

操作方法

まずはKindleをMicro USBでPCに接続してください。

ウィンドウが表示されたらアドレスバーのパスに \system\vocabularyを追記して移動します。※systemフォルダはデフォルトで表示されません。

移動するとvocab.dbが見つかります。ここに単語の情報が保存されています。

このファイルをDB Browser for SQLiteで開き「Execute SQL」タブを押します。

全消去

SQL 1と書いてあるボックスの下に以下の命令を書いて,再生ボタン(実行ボタン)を押して保存すれば終了です。

DELETE FROM WORDS;
DELETE FROM LOOKUPS;

よく調べる単語を表示

SQLはデータベースを操作する命令なのですが,もちろん削除以外のことにも使えます。一例ですが,過去に2回以上調べた英単語を表示させることも。

SELECT word_key 
 FROM LOOKUPS 
 WHERE word_key like "en:%"
 GROUP BY word_key 
 HAVING count(word_key) > 1;

どんな文脈で使われていたか表示させたければ “, usage”を追加したり,3回以上調べた単語を表示させたければ “>1″を”>2″に変更するなど様々な応用ができます。

 SELECT word_key, usage
 FROM LOOKUPS 
 WHERE word_key like "en:%"
 GROUP BY word_key 
 HAVING count(word_key) > 2; 

最後に私のよく使う命令。
2回以上調べた単語,その本のタイトル,使われ方,3つを表示する例(”en:”は消える)

SELECT REPLACE(LOOKUPS.word_key,"en:","") as word, BOOK_INFO.title, LOOKUPS.usage
 FROM LOOKUPS
 INNER JOIN BOOK_INFO on LOOKUPS.book_key = BOOK_INFO.id
 WHERE word_key IN(
     SELECT LOOKUPS.word_key 
     FROM LOOKUPS
     WHERE LOOKUPS.word_key like "en:%"
     GROUP BY word_key
     HAVING count(word_key) > 1
     )

何か「こんな条件で表示させたい!」というものがあればコメントしてください。お手伝いします。

参考ページ : https://mandarinnote.com/archives/4610

SSHのポート番号くらいは変更すべき

遠隔にあるサーバーの操作はSSHで行うことが一般的だと思います。

自宅にサーバーを立てたり,VPSをレンタルした時に最低限のセキュリティ対策としてSSH経由のrootログイン禁止や不要ポートを塞ぐなどをすると思います。

しかし,SSHのポート番号は初期設定の22番で使っていることが多いと思います。自分もそうでした。ちょっと手間ですが変えたほうがいいかもしれません。

中国IPからの攻撃?

自分はそのまま使っていて中国IPから突っつかれていました。

このブログはレンタルVPS上で運営しています。11月19日に契約してその9日後にログイン失敗の履歴を確認したところ6万回近いログイン失敗のログが残っていました。

# lastb

上記のコマンドでログインの失敗を表示できるので試して見ると面白いです。どのようなユーザ名でログイン試行されているかわかります。(以下,IPは隠しています)

他にもtest, guest, git, admin, ubuntuなどなど色々試されていました。

数が多いので1レコードずつ目は通していませんが,数種類のIPアドレスからのログイン試行でした。いくつか調べてみましたが中国に割り当てられているIPでした。

そもそもrootログイン禁止をしているし,自分が使うときは公開鍵で認証しているので大丈夫だと思います。ただ,気持ち悪いし,余計な負担がサーバーにかかってしまうことは防ぎたい。

結局ポートスキャンされれば,ポート番号の変更なんて意味はないかもしれないが気休め。

英検1級の面接対策はダルい!Webサービスで解決したい

英検1級の1次試験に合格すると,次に待っているのが2次対策。

1次試験が終わった開放感に浸っていると2次対策なんてしない。

そうすると,結果発表から2次試験までは2週間程度しかない。で,対策を始めて見るとこれがダルい・・・・。

2次対策がダルい4つの理由

模範解答が難しすぎる

多くの人は2次対策用に何かしら対策本を購入するかと思います。私はこれを買いました。

【CD+DVD付】14日でできる! 英検1級 二次試験・面接 完全予想問題 (旺文社英検書)

トピックは標準的なものでしたが模範解答が難しすぎました。いや・・・。お前超人ネイティブかよ。

使われている単語のレベルも内容も,1分の準備では思いつかないようなものばかりです。

練習問題の数が少なすぎる

上で紹介した本には練習問題が14問しかありません。浅く広くカバーしているので,本番で少し外れた問題が来たらちょっと対応できないかも知れません。

「初めて見る問題で焦る→準備する→なんとか話す」。このフローが結構大事なのではないかと個人的には考えています。

問題を出してくれる人がいない

一人で練習していれば当たり前です。模擬面接をしようと思っても自分で問題を選ぶということは出題内容がわかっています。意味がありません。

まぁこれはなんとか対策できます。複数のサイトから問題になりそうなサンプル問題を集めてきて,無作為にで5問ピックアップ。

スプレッドシートで簡単にできるけど面倒。あ,それに時間も自分で計測しないといけないし。

出題内容に関して知識がない

5問選択肢があれば一つくらいは前提知識なしで対応できる問題があるかと思います。または自分の得意(専攻)分野であればその方に誘導すればいいと思います。

しかし,問題なのは選択肢の中に自分の対応できる問題がなさそうな時。焦る。

だって,働き方,若者の価値観,民営化のメリット・デメリット,インターネットの検閲,共通通貨の是非,国際情勢,オリンピックの主催・・・・・。

いや,日本語でも2分スピーチできるかぁ?

まとめ → 解決策

  • 模範解答が難しい → 簡単な模範解答を作る
  • 練習問題が少ない → 問題を大量に作る
  • 問題を出してくれる人がいない → 出題を自動化する
  • 内容に関して知識がない → 最低限の時事知識をまとめる
  • 時間を測ってくれる人がいない → 時間を自動で測る

Webサービス化する

この不満はチャンスなのかもしれません。抱えている課題も把握できているし,解決策も思いついている。じゃぁアイディアを形にするだけで良い。

以下は完成イメージで実装は全然してません。

5つの問題を自動で適当に(分野の偏りがなく)選んで表示する。制限時間の1分を計測し,問題を選択する。

問題を選択すると,5つの適当な質問をしてくれる。

難しすぎない模範解答を表示。時事問題なら必要な知識を簡単に提供する。

あれ,これバーチャル英検じゃん。

これ作りきれるかな・・・・

多分インターフェイスもこだわらなければ適当なhtml, css, javascriptあたりでサンプルコピーしまくれば形にはなりそう。

問題と質問と模範解答のDBも別にそんなに複雑じゃないし。

あ,あとは模範解答作りそのものをやらないといけない。時事問題のまとめを提供するのも自分がまず勉強しないと行けないな。

英語のライティングが不自由なくできて,プログラミングも多少できる人いないかな。。。。

ちょっと作った

https://twitter.com/rinehart613/status/1206434073754734593